diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 9bbadf1f417..f8e36254899 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -1748,11 +1748,11 @@ "command.gtceu.share_prospection_data.notification": "¡noʎ ɥʇıʍ ɐʇɐp buıʇɔǝdsoɹd buıɹɐɥs sı %s", "config.gtceu.option.addLoot": "ʇooꞀppɐ", "config.gtceu.option.ae2": "ᄅǝɐ", - "config.gtceu.option.allowDrumsInputFluidsFromOutputSide": "ǝpıSʇndʇnOɯoɹℲspınןℲʇnduIsɯnɹᗡʍoןןɐ", "config.gtceu.option.allowedImageDomains": "suıɐɯoᗡǝbɐɯIpǝʍoןןɐ", "config.gtceu.option.animationTime": "ǝɯı⟘uoıʇɐɯıuɐ", "config.gtceu.option.arcRecyclingYield": "pןǝıʎbuıןɔʎɔǝᴚɔɹɐ", "config.gtceu.option.armorHud": "pnHɹoɯɹɐ", + "config.gtceu.option.autoRebuildResources": "sǝɔɹnosǝᴚpןınqǝᴚoʇnɐ", "config.gtceu.option.batchDuration": "uoıʇɐɹnᗡɥɔʇɐq", "config.gtceu.option.bedrockOreDistance": "ǝɔuɐʇsıᗡǝɹOʞɔoɹpǝq", "config.gtceu.option.bedrockOreDropTagPrefix": "xıɟǝɹԀbɐ⟘doɹᗡǝɹOʞɔoɹpǝq", @@ -2043,20 +2043,18 @@ "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.ender_fluid_link.incomplete_hex.0": "¡ǝʇǝןdɯoɔuı sı ɹoןoɔ pǝʇʇnduI", - "cover.ender_fluid_link.incomplete_hex.1": ")sʇıbıp xǝɥ 8 ןןɐ( ǝʇǝןdɯoɔ ǝɔuo pǝıןddɐ ǝq ןןıʍ ʇI", - "cover.ender_fluid_link.incomplete_hex.2": "¡sʇıpǝ ǝsoן ןןıʍ ınb ǝɥʇ buısoןƆ", "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.private.tooltip.disabled.0": "ǝpoɯ ʞuɐʇ ǝʇɐʌıɹd oʇ ɥɔʇıʍS", - "cover.ender_fluid_link.private.tooltip.disabled.1": "ɹǝʌoɔ ǝɥʇ pǝɔɐןd ʎןןɐuıbıɹo oɥʍ ɹǝʎɐןd ǝɥʇ sǝsn ǝpoɯ ǝʇɐʌıɹԀ", - "cover.ender_fluid_link.private.tooltip.enabled": "ǝpoɯ ʞuɐʇ ɔıןqnd oʇ ɥɔʇıʍS", "cover.ender_fluid_link.title": "ʞuıꞀ pınןℲ ɹǝpuƎ", - "cover.ender_fluid_link.tooltip.channel_description": "ʇxǝʇ ʇnduı ɥʇıʍ uoıʇdıɹɔsǝp ןǝuuɐɥɔ ʇǝS", - "cover.ender_fluid_link.tooltip.channel_name": "ʇxǝʇ ʇnduı ɥʇıʍ ǝɯɐu ןǝuuɐɥɔ ʇǝS", - "cover.ender_fluid_link.tooltip.clear_button": "uoıʇdıɹɔsǝp ןǝuuɐɥɔ ɹɐǝןƆ", - "cover.ender_fluid_link.tooltip.list_button": "ʇsıן ןǝuuɐɥɔ ʍoɥS", "cover.ender_item_link.title": "ʞuıꞀ ɯǝʇI ɹǝpuƎ", + "cover.ender_link.description_empty": "uoıʇdıɹɔsǝᗡ ʎʇdɯƎ", + "cover.ender_link.private.tooltip": "ɹǝʌoɔ sıɥʇ pǝɔɐןd oɥʍ ɹǝʎɐןd ǝɥʇ oʇ ǝןqıssǝɔɔɐ ʎןuO :ǝpoɯ ǝʇɐʌıɹԀ", + "cover.ender_link.protected.tooltip": "˙ɯɐǝʇ ǝɯɐs ǝɥʇ uo sɹǝʎɐןd oʇ ǝןqıssǝɔɔⱯ :ǝpoW pǝʇɔǝʇoɹԀ", + "cover.ender_link.public.tooltip": "sɹǝʎɐןd ןןɐ oʇ ǝןqıssǝɔɔⱯ :ǝpoɯ ɔıןqnԀ", + "cover.ender_link.tooltip.channel_description": "uoıʇdıɹɔsǝp ןǝuuɐɥƆ", + "cover.ender_link.tooltip.channel_name": ")ǝnןɐʌ ןɐɯıɔǝpɐxǝɥ ʇıq-ᄅƐ( ᗡI ןǝuuɐɥƆ", + "cover.ender_link.tooltip.clear_button": "uoıʇdıɹɔsǝp ןǝuuɐɥɔ ɹɐǝןƆ", + "cover.ender_link.tooltip.list_button": "ʇsıן ןǝuuɐɥɔ ʍoɥS", "cover.ender_redstone_link.title": "ʞuıꞀ ǝuoʇspǝᴚ ɹǝpuƎ", "cover.filter.blacklist.disabled": "ʇsıןǝʇıɥM", "cover.filter.blacklist.enabled": "ʇsıןʞɔɐןᗺ", @@ -2094,6 +2092,7 @@ "cover.item_smart_filter.filtering_mode.electrolyzer": "ɹǝzʎןoɹʇɔǝןƎ", "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.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", @@ -2321,6 +2320,8 @@ "gtceu.creative_tooltip.3": "sıɥʇ ǝsn oʇ ㄥ§", "gtceu.cutter": "ɹǝʇʇnƆ", "gtceu.debug.f3_h.enabled": "ǝɹoɯ ǝǝs oʇ ǝןıɟ bıɟuoɔ ɥɔǝ⟘bǝɹ⅁ ǝɥʇ uı uoıʇdo bıɟuoɔ bnqǝp:ɔsıɯ ǝɥʇ ǝןqɐuǝ :sɹǝdoןǝʌǝᗡ ɹoℲ ¡oɟuı bnqǝp ǝɥʇ pǝıɟıpoɯ sɐɥ ɥɔǝ⟘bǝɹ⅁", + "gtceu.debug.resource_rebuild.done": "%s uı ǝuop pןınqǝɹ ǝɔɹnosǝɹ ǝןpɐɹ⅁", + "gtceu.debug.resource_rebuild.start": ")sǝɔɹnosǝᴚssǝɔoɹd: ʍǝןpɐɹb/˙( pןınqǝɹ ǝɔɹnosǝɹ ǝןpɐɹb buıʞoʌuI", "gtceu.direction.tooltip.back": "ʞɔɐᗺ", "gtceu.direction.tooltip.down": "uʍoᗡ", "gtceu.direction.tooltip.front": "ʇuoɹℲ", @@ -3693,6 +3694,9 @@ "gtceu.placeholder_info.if.0": "˙0 oʇ ןɐnbǝ ʇou sı puɐ buıɹʇs ʎʇdɯǝ uɐ ʇou sı ʇı ɟı ǝnɹʇ pǝɹǝpısuoɔ sı uoıʇıpuoɔ ǝɥ⟘ ˙uoıʇıpuoɔ ǝɥʇ uo buıpuǝdǝp sʇuǝɯnbɹɐ ǝɥʇ ɟo ǝuo suɹnʇǝᴚ", "gtceu.placeholder_info.if.1": ":ǝbɐs∩", "gtceu.placeholder_info.if.2": "}]ǝsןɐɟ‾ɟı‾pǝuɹnʇǝɹ[ >ǝnɹʇ‾ɟı‾pǝuɹnʇǝɹ< >uoıʇıpuoɔ< ɟı{ ", + "gtceu.placeholder_info.item.0": "ʇoןs pǝıɟıɔǝds ɐ uı ɯǝʇı ǝɥʇ ɟo pı puɐ ʇunoɯɐ ǝɥʇ suɹnʇǝᴚ", + "gtceu.placeholder_info.item.1": ":ǝbɐs∩", + "gtceu.placeholder_info.item.2": ")ǝןdɯɐxǝ ɹoɟ( \"puoɯɐıp:ʇɟɐɹɔǝuıɯ ƖƐ\" >- }>ʇoןs< ɯǝʇı{ ", "gtceu.placeholder_info.itemCount.0": "˙)pǝɹǝʇןıɟ ǝq uɐɔ( sɯǝʇı ɟo ʇunoɯɐ ǝɥʇ suɹnʇǝᴚ", "gtceu.placeholder_info.itemCount.1": ":ǝbɐs∩", "gtceu.placeholder_info.itemCount.2": "ʇunoɯɐ ɯǝʇı ןɐʇoʇ >- }ʇunoƆɯǝʇı{ ", @@ -3706,6 +3710,9 @@ "gtceu.placeholder_info.maxProgress.1": ",%}00Ɩ * }}ssǝɹboɹԀxɐɯ{ / }ssǝɹboɹd{ ɔןɐɔ{ ɔןɐɔ{ :ssǝɹboɹԀ, :ǝןdɯɐxƎ", "gtceu.placeholder_info.maxProgress.2": ":ǝbɐs∩", "gtceu.placeholder_info.maxProgress.3": "ǝdıɔǝɹ buıuunɹ ʎןʇuǝɹɹnɔ ǝɥʇ ɟo ssǝɹboɹd xɐɯ ǝɥʇ >- }ssǝɹboɹԀxɐɯ{ ", + "gtceu.placeholder_info.module.0": ")ɹǝʌoɔ ɐ uı ʞɹoʍ ʇou sǝop( ɹoʇıuoɯ ןɐɹʇuǝɔ ǝɥʇ oʇuo ʇoןs pǝıɟıɔǝds ǝɥʇ uı ǝןnpoɯ ǝɥʇ sɹǝpuǝᴚ", + "gtceu.placeholder_info.module.1": ":ǝbɐs∩", + "gtceu.placeholder_info.module.2": "buıɹʇs ʎʇdɯǝ >- }>ʎ< >x< >ʇoןs< ǝןnpoɯ{ ", "gtceu.placeholder_info.nbt.0": "ʇoןs pǝıɟıɔǝds ǝɥʇ uı ɯǝʇı ǝɥʇ ɟo ɐʇɐp ʇqu ǝɥʇ suɹnʇǝᴚ", "gtceu.placeholder_info.nbt.1": ":ǝbɐs∩", "gtceu.placeholder_info.nbt.2": "]˙˙˙[]Ɛʎǝʞ[]ᄅʎǝʞ[]Ɩʎǝʞ[ʇqu‾ɯǝʇı >- }˙˙˙ ]Ɛʎǝʞ[ ]ᄅʎǝʞ[ ]Ɩʎǝʞ[ >ʇoןs< ʇqu{ ", @@ -3719,9 +3726,16 @@ "gtceu.placeholder_info.progress.1": "}ssǝɹboɹԀxɐɯ{ puɐ 0 uǝǝʍʇǝq ɹǝbǝʇuı uɐ sı ssǝɹboɹd ʇɐɥʇ ǝʇoN", "gtceu.placeholder_info.progress.2": ":ǝbɐs∩", "gtceu.placeholder_info.progress.3": "ǝdıɔǝɹ buıuunɹ ʎןʇuǝɹɹnɔ ǝɥʇ ɟo ssǝɹboɹd ǝɥʇ >- }ssǝɹboɹd{ ", + "gtceu.placeholder_info.quad.0": ")sǝɔıʇɹǝʌ ㄣ ןןɐ ɹoɟ sɹǝʇǝɯɐɹɐd ʎɟıɔǝds ʇsnɯ( pɐnb ɐ sʍɐɹᗡ", + "gtceu.placeholder_info.quad.1": ":ǝbɐs∩", + "gtceu.placeholder_info.quad.2": "buıɹʇs ʎʇdɯǝ >- }>ㄣɹoןoɔ< >Ɛɹoןoɔ< >ᄅɹoןoɔ< >Ɩɹoןoɔ< >ㄣʎ< >ㄣx< >Ɛʎ< >Ɛx< >ᄅʎ< >ᄅx< >Ɩʎ< >Ɩx< pɐnb{ ", "gtceu.placeholder_info.random.0": "˙)ǝʌısnןɔuı( ןɐʌɹǝʇuı pǝıɟıɔǝds ǝɥʇ uı ɹǝqɯnu ɯopuɐɹ ɐ suɹnʇǝᴚ", "gtceu.placeholder_info.random.1": ":ǝbɐs∩", "gtceu.placeholder_info.random.2": ")ǝʌısnןɔuı( xɐɯ puɐ uıɯ uǝǝʍʇǝq ɹǝqɯnu ɯopuɐɹ ɐ >- }>xɐɯ< >uıɯ< ɯopuɐɹ{ ", + "gtceu.placeholder_info.rect.0": "ǝzıs puɐ sǝʇɐuıpɹooɔ pǝıɟıɔǝds ǝɥʇ ɥʇıʍ uoıʇısod pǝıɟıɔǝds ǝɥʇ ʇɐ ǝןbuɐʇɔǝɹ ɐ sʍɐɹᗡ", + "gtceu.placeholder_info.rect.1": ":ǝbɐs∩", + "gtceu.placeholder_info.rect.2": "buıɹʇs ʎʇdɯǝ >- }>ᗺ⅁ᴚⱯɹoןoɔ< >ʇɥbıǝɥ< >ɥʇpıʍ< >ʎ< >x< ʇɔǝɹ{ ", + "gtceu.placeholder_info.rect.3": ")Ɩ 'ᄅ( ǝzıs ǝɥʇ ɥʇıʍ )ϛᄅ˙0 'ϛ˙0( ʇɐ ǝןbuɐʇɔǝɹ ǝʇıɥʍ ɐ sʍɐɹp >- }ℲℲℲℲℲℲℲℲx0 Ɩ ᄅ ϛᄅ˙0 ϛ˙0 ʇɔǝɹ{ ", "gtceu.placeholder_info.redstone.0": "ɥʇbuǝɹʇs ʇndʇno ǝuoʇspǝɹ ǝɥʇ sʇǝs ɹo ɥʇbuǝɹʇs ןɐubıs ǝuoʇspǝɹ ǝɥʇ suɹnʇǝᴚ", "gtceu.placeholder_info.redstone.1": ":ǝbɐs∩", "gtceu.placeholder_info.redstone.2": "ǝpıs pǝıɟıɔǝds ǝɥʇ ʇɐ )ϛƖ-0( ɥʇbuǝɹʇs ןɐubıs ǝuoʇspǝɹ >- }>ʇsǝʍ|ʇsɐǝ|ɥʇnos|ɥʇɹou|uʍop|dn< ʇǝb ǝuoʇspǝɹ{ ", @@ -3734,6 +3748,9 @@ "gtceu.placeholder_info.select.0": ")0 ɯoɹɟ buıʇɹɐʇs( xǝpuı pǝıɟıɔǝds ǝɥʇ ʇɐ ʇuǝɯnbɹɐ ǝɥʇ suɹnʇǝᴚ", "gtceu.placeholder_info.select.1": ":ǝbɐs∩", "gtceu.placeholder_info.select.2": "xǝpuı pǝıɟıɔǝds ǝɥʇ ʇɐ ʇuǝɯnbɹɐ >- ˙˙˙ ]Ɛbɹɐ[ ]ᄅbɹɐ[ ]Ɩbɹɐ[ >xǝpuı< ʇɔǝןǝs{ ", + "gtceu.placeholder_info.setImage.0": "ʇoןs pǝıɟıɔǝds ǝɥʇ uı ǝןnpoɯ ǝbɐɯı uɐ uı Ꞁᴚ∩ ǝbɐɯı ǝɥʇ sʇǝS", + "gtceu.placeholder_info.setImage.1": ":ǝbɐs∩", + "gtceu.placeholder_info.setImage.2": "buıɹʇs ʎʇdɯǝ >- }>ןɹn< >ʇoןs< ǝbɐɯIʇǝs{ ", "gtceu.placeholder_info.strike.0": "ʇno pǝssoɹɔ sɐʍ ʇı ɟı sɐ ʇı buıʎɐןdsıp 'ʇxǝʇ ʇsɹıɟ ǝɥʇ ɯoɹɟ ʇxǝʇ ǝɥʇ suɹnʇǝᴚ", "gtceu.placeholder_info.strike.1": ":ǝbɐs∩", "gtceu.placeholder_info.strike.2": "ʇxǝʇ ʇno-pǝssoɹɔ >- }>ʇxǝʇ< ǝʞıɹʇs{ ", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 8ff611b8ef9..0988c78be6a 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -1748,11 +1748,11 @@ "command.gtceu.share_prospection_data.notification": "%s is sharing prospecting data with you!", "config.gtceu.option.addLoot": "addLoot", "config.gtceu.option.ae2": "ae2", - "config.gtceu.option.allowDrumsInputFluidsFromOutputSide": "allowDrumsInputFluidsFromOutputSide", "config.gtceu.option.allowedImageDomains": "allowedImageDomains", "config.gtceu.option.animationTime": "animationTime", "config.gtceu.option.arcRecyclingYield": "arcRecyclingYield", "config.gtceu.option.armorHud": "armorHud", + "config.gtceu.option.autoRebuildResources": "autoRebuildResources", "config.gtceu.option.batchDuration": "batchDuration", "config.gtceu.option.bedrockOreDistance": "bedrockOreDistance", "config.gtceu.option.bedrockOreDropTagPrefix": "bedrockOreDropTagPrefix", @@ -2043,20 +2043,18 @@ "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.ender_fluid_link.incomplete_hex.0": "Inputted color is incomplete!", - "cover.ender_fluid_link.incomplete_hex.1": "It will be applied once complete (all 8 hex digits)", - "cover.ender_fluid_link.incomplete_hex.2": "Closing the gui will lose edits!", "cover.ender_fluid_link.iomode.disabled": "I/O Disabled", "cover.ender_fluid_link.iomode.enabled": "I/O Enabled", - "cover.ender_fluid_link.private.tooltip.disabled.0": "Switch to private tank mode", - "cover.ender_fluid_link.private.tooltip.disabled.1": "Private mode uses the player who originally placed the cover", - "cover.ender_fluid_link.private.tooltip.enabled": "Switch to public tank mode", "cover.ender_fluid_link.title": "Ender Fluid Link", - "cover.ender_fluid_link.tooltip.channel_description": "Set channel description with input text", - "cover.ender_fluid_link.tooltip.channel_name": "Set channel name with input text", - "cover.ender_fluid_link.tooltip.clear_button": "Clear channel description", - "cover.ender_fluid_link.tooltip.list_button": "Show channel list", "cover.ender_item_link.title": "Ender Item Link", + "cover.ender_link.description_empty": "Empty Description", + "cover.ender_link.private.tooltip": "Private mode: Only accessible to the player who placed this cover", + "cover.ender_link.protected.tooltip": "Protected Mode: Accessible to players on the same team.", + "cover.ender_link.public.tooltip": "Public mode: Accessible to all players", + "cover.ender_link.tooltip.channel_description": "Channel description", + "cover.ender_link.tooltip.channel_name": "Channel ID (32-bit hexadecimal value)", + "cover.ender_link.tooltip.clear_button": "Clear channel description", + "cover.ender_link.tooltip.list_button": "Show channel list", "cover.ender_redstone_link.title": "Ender Redstone Link", "cover.filter.blacklist.disabled": "Whitelist", "cover.filter.blacklist.enabled": "Blacklist", @@ -2094,6 +2092,7 @@ "cover.item_smart_filter.filtering_mode.electrolyzer": "Electrolyzer", "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.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", @@ -2321,6 +2320,8 @@ "gtceu.creative_tooltip.3": "§7 to use this", "gtceu.cutter": "Cutter", "gtceu.debug.f3_h.enabled": "GregTech has modified the debug info! For Developers: enable the misc:debug config option in the GregTech config file to see more", + "gtceu.debug.resource_rebuild.done": "Gradle resource rebuild done in %s", + "gtceu.debug.resource_rebuild.start": "Invoking gradle resource rebuild (./gradlew :processResources)", "gtceu.direction.tooltip.back": "Back", "gtceu.direction.tooltip.down": "Down", "gtceu.direction.tooltip.front": "Front", @@ -3693,6 +3694,9 @@ "gtceu.placeholder_info.if.0": "Returns one of the arguments depending on the condition. The condition is considered true if it is not an empty string and is not equal to 0.", "gtceu.placeholder_info.if.1": "Usage:", "gtceu.placeholder_info.if.2": " {if [returned_if_false]}", + "gtceu.placeholder_info.item.0": "Returns the amount and id of the item in a specified slot", + "gtceu.placeholder_info.item.1": "Usage:", + "gtceu.placeholder_info.item.2": " {item } -> \"31 minecraft:diamond\" (for example)", "gtceu.placeholder_info.itemCount.0": "Returns the amount of items (can be filtered).", "gtceu.placeholder_info.itemCount.1": "Usage:", "gtceu.placeholder_info.itemCount.2": " {itemCount} -> total item amount", @@ -3706,6 +3710,9 @@ "gtceu.placeholder_info.maxProgress.1": "Example: 'Progress: {calc {calc {progress} / {maxProgress}} * 100}%'", "gtceu.placeholder_info.maxProgress.2": "Usage:", "gtceu.placeholder_info.maxProgress.3": " {maxProgress} -> the max progress of the currently running recipe", + "gtceu.placeholder_info.module.0": "Renders the module in the specified slot onto the central monitor (does not work in a cover)", + "gtceu.placeholder_info.module.1": "Usage:", + "gtceu.placeholder_info.module.2": " {module } -> empty string", "gtceu.placeholder_info.nbt.0": "Returns the nbt data of the item in the specified slot", "gtceu.placeholder_info.nbt.1": "Usage:", "gtceu.placeholder_info.nbt.2": " {nbt [key1] [key2] [key3] ...} -> item_nbt[key1][key2][key3][...]", @@ -3719,9 +3726,16 @@ "gtceu.placeholder_info.progress.1": "Note that progress is an integer between 0 and {maxProgress}", "gtceu.placeholder_info.progress.2": "Usage:", "gtceu.placeholder_info.progress.3": " {progress} -> the progress of the currently running recipe", + "gtceu.placeholder_info.quad.0": "Draws a quad (must specify parameters for all 4 vertices)", + "gtceu.placeholder_info.quad.1": "Usage:", + "gtceu.placeholder_info.quad.2": " {quad } -> empty string", "gtceu.placeholder_info.random.0": "Returns a random number in the specified interval (inclusive).", "gtceu.placeholder_info.random.1": "Usage:", "gtceu.placeholder_info.random.2": " {random } -> a random number between min and max (inclusive)", + "gtceu.placeholder_info.rect.0": "Draws a rectangle at the specified position with the specified coordinates and size", + "gtceu.placeholder_info.rect.1": "Usage:", + "gtceu.placeholder_info.rect.2": " {rect } -> empty string", + "gtceu.placeholder_info.rect.3": " {rect 0.5 0.25 2 1 0xFFFFFFFF} -> draws a white rectangle at (0.5, 0.25) with the size (2, 1)", "gtceu.placeholder_info.redstone.0": "Returns the redstone signal strength or sets the redstone output strength", "gtceu.placeholder_info.redstone.1": "Usage:", "gtceu.placeholder_info.redstone.2": " {redstone get } -> redstone signal strength (0-15) at the specified side", @@ -3734,6 +3748,9 @@ "gtceu.placeholder_info.select.0": "Returns the argument at the specified index (starting from 0)", "gtceu.placeholder_info.select.1": "Usage:", "gtceu.placeholder_info.select.2": " {select [arg1] [arg2] [arg3] ... -> argument at the specified index", + "gtceu.placeholder_info.setImage.0": "Sets the image URL in an image module in the specified slot", + "gtceu.placeholder_info.setImage.1": "Usage:", + "gtceu.placeholder_info.setImage.2": " {setImage } -> empty string", "gtceu.placeholder_info.strike.0": "Returns the text from the first text, displaying it as if it was crossed out", "gtceu.placeholder_info.strike.1": "Usage:", "gtceu.placeholder_info.strike.2": " {strike } -> crossed-out text", diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java b/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java index 0ddb58dca3d..c6516616d1a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java @@ -3,13 +3,11 @@ import com.gregtechceu.gtceu.api.blockentity.ICopyable; import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.factory.CoverUIFactory; import com.gregtechceu.gtceu.api.gui.fancy.IFancyConfigurator; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.item.tool.IToolGridHighlight; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; -import com.gregtechceu.gtceu.api.sync_system.ManagedSyncBlockEntity; import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; @@ -80,9 +78,7 @@ public void scheduleRenderUpdate() { @Override public void markAsChanged() { - if (coverHolder instanceof ManagedSyncBlockEntity syncEntity) { - syncEntity.markAsChanged(); - } + coverHolder.markAsChanged(); } /** @@ -158,12 +154,6 @@ public InteractionResult onScrewdriverClick(Player playerIn, InteractionHand han } return InteractionResult.sidedSuccess(playerIn.level().isClientSide); } - if (this instanceof IUICover) { - if (playerIn instanceof ServerPlayer serverPlayer) { - CoverUIFactory.INSTANCE.openUI(this, serverPlayer); - } - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); - } return InteractionResult.PASS; } @@ -197,7 +187,7 @@ public boolean shouldRenderPlate() { public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, ItemStack held, Set toolTypes) { return toolTypes.contains(GTToolType.CROWBAR) || - ((toolTypes.isEmpty() || toolTypes.contains(GTToolType.SCREWDRIVER)) && this instanceof IUICover); + ((toolTypes.isEmpty() || toolTypes.contains(GTToolType.SCREWDRIVER)) && this instanceof IMuiCover); } @Override @@ -206,7 +196,7 @@ public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, I if (toolTypes.contains(GTToolType.CROWBAR)) { return GuiTextures.TOOL_REMOVE_COVER; } - if ((toolTypes.isEmpty() || toolTypes.contains(GTToolType.SCREWDRIVER)) && this instanceof IUICover) { + if ((toolTypes.isEmpty() || toolTypes.contains(GTToolType.SCREWDRIVER)) && this instanceof IMuiCover) { return GuiTextures.TOOL_COVER_SETTINGS; } return null; 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 97c41713dc0..421813e3f09 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/IMuiCover.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/IMuiCover.java @@ -1,15 +1,10 @@ package com.gregtechceu.gtceu.api.cover; import com.gregtechceu.gtceu.api.mui.base.IUIHolder; -import com.gregtechceu.gtceu.api.mui.base.drawable.IKey; -import com.gregtechceu.gtceu.api.mui.drawable.ItemDrawable; import com.gregtechceu.gtceu.api.mui.factory.SidedPosGuiData; -import com.gregtechceu.gtceu.api.mui.utils.MouseData; import com.gregtechceu.gtceu.api.mui.value.BoolValue; import com.gregtechceu.gtceu.api.mui.value.sync.EnumSyncValue; -import com.gregtechceu.gtceu.api.mui.value.sync.IntSyncValue; import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; -import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; import com.gregtechceu.gtceu.api.mui.widgets.SlotGroupWidget; import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; import com.gregtechceu.gtceu.client.mui.screen.ModularPanel; @@ -19,8 +14,6 @@ import com.gregtechceu.gtceu.common.mui.GTGuiTheme; import com.gregtechceu.gtceu.common.mui.GTGuis; -import net.minecraft.world.item.ItemStack; - public interface IMuiCover extends IUIHolder { default CoverBehavior self() { @@ -45,53 +38,35 @@ default ModularPanel buildUI(SidedPosGuiData data, PanelSyncManager syncManager, panel.child(GTMuiWidgets.createTitleBar(this.self().getAttachItem(), 176, GTGuiTextures.BACKGROUND)); - return panel.child(createCoverUI(data, syncManager, settings)) + Flow column = Flow.column() + .top(7).margin(7, 0) + .childPadding(2) + .widthRel(1.0f).coverChildrenHeight(); + + createCoverUIRows(column, data, syncManager, settings); + return panel.child(column) .child(SlotGroupWidget.playerInventory(false).left(7).bottom(7)); } - ParentWidget createCoverUI(SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings); + /** + * The default cover UI panel builds a single column with rows added by each cover. + */ + default void createCoverUIRows(Flow column, SidedPosGuiData data, PanelSyncManager syncManager, + UISettings settings) {} /* Helper methods for UI creation with covers that are commonly used */ - /** - * The color used for Cover UI titles, and used in {@link #createTitleRow}. - */ - int UI_TITLE_COLOR = 0xFF222222; /** * The color used for Cover UI text. Available for reference, but is * handled automatically by the {@link GTGuiTheme#COVER} theme. */ int UI_TEXT_COLOR = 0xFF555555; - /** - * Create the Title bar widget for a Cover. - */ - static Flow createTitleRow(ItemStack stack) { + default Flow coverUIRow() { return Flow.row() - .height(16).coverChildrenWidth() - .child(new ItemDrawable(stack).asWidget().size(16).marginRight(4)) - .child(IKey.lang(stack.getHoverName()) - .color(UI_TITLE_COLOR) - .asWidget().heightRel(1.0f)); - } - - /** - * Create a new settings row for a Cover setting. - */ - default ParentWidget createSettingsRow() { - return new ParentWidget<>().height(16).widthRel(1.0f).marginBottom(2); - } - - default int getIncrementValue() { - return getIncrementValue(MouseData.create(-1)); - } - - default int getIncrementValue(MouseData data) { - int adjust = 1; - if (data.shift()) adjust *= 4; - if (data.ctrl()) adjust *= 16; - if (data.alt()) adjust *= 64; - return adjust; + .coverChildrenHeight() + .widthRel(1f) + .childPadding(2); } /** @@ -101,12 +76,4 @@ default int getIncrementValue(MouseData data) { default > BoolValue.Dynamic boolValueOf(EnumSyncValue syncValue, T value) { return new BoolValue.Dynamic(() -> syncValue.getValue() == value, $ -> syncValue.setValue(value)); } - - /** - * Get a BoolValue for use with toggle buttons which are "linked together," - * meaning only one of them can be pressed at a time. - */ - default BoolValue.Dynamic boolValueOf(IntSyncValue syncValue, int value) { - return new BoolValue.Dynamic(() -> syncValue.getValue() == value, $ -> syncValue.setValue(value)); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/IUICover.java b/src/main/java/com/gregtechceu/gtceu/api/cover/IUICover.java deleted file mode 100644 index 93d85bd74f5..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/IUICover.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.gregtechceu.gtceu.api.cover; - -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.UITemplate; - -import com.lowdragmc.lowdraglib.gui.modular.IUIHolder; -import com.lowdragmc.lowdraglib.gui.modular.ModularUI; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.utils.Position; - -import net.minecraft.world.entity.player.Player; - -public interface IUICover extends IUIHolder { - - default CoverBehavior self() { - return (CoverBehavior) this; - } - - @Override - default boolean isInvalid() { - return self().coverHolder.isRemoved() || self().coverHolder.getCoverAtSide(self().attachedSide) != self(); - } - - @Override - default boolean isRemote() { - return self().coverHolder.isRemote(); - } - - @Override - default ModularUI createUI(Player entityPlayer) { - var widget = createUIWidget(); - var size = widget.getSize(); - widget.setSelfPosition(new Position((176 - size.width) / 2, 0)); - var modularUI = new ModularUI(176, size.height + 82, this, entityPlayer) - .background(GuiTextures.BACKGROUND) - .widget(widget) - .widget(UITemplate.bindPlayerInventory(entityPlayer.getInventory(), GuiTextures.SLOT, 7, size.height, - true)); - modularUI.registerCloseListener(this::onUIClosed); - return modularUI; - } - - default void onUIClosed() {} - - Widget createUIWidget(); - - @Override - default void markAsDirty() {} -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java index 9eb2602017f..7518f95f5e1 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java @@ -53,7 +53,7 @@ public FilterHandler(ISyncManaged container) { this.container = container; } - protected abstract F loadFilter(ItemStack filterItem); + public abstract F loadFilter(ItemStack filterItem); protected abstract F getEmptyFilter(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandlers.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandlers.java index 309a4aa0ac4..c48c9f4d0e8 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandlers.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandlers.java @@ -2,16 +2,21 @@ import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; +import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.item.ItemStack; import net.minecraftforge.fluids.FluidStack; +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault public interface FilterHandlers { static FilterHandler item(ISyncManaged container) { return new FilterHandler<>(container) { @Override - protected ItemFilter loadFilter(ItemStack filterItem) { + public ItemFilter loadFilter(ItemStack filterItem) { return ItemFilter.loadFilter(filterItem); } @@ -31,7 +36,7 @@ static FilterHandler fluid(ISyncManaged container) { return new FilterHandler<>(container) { @Override - protected FluidFilter loadFilter(ItemStack filterItem) { + public FluidFilter loadFilter(ItemStack filterItem) { return FluidFilter.loadFilter(filterItem); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/factory/CoverUIFactory.java b/src/main/java/com/gregtechceu/gtceu/api/gui/factory/CoverUIFactory.java deleted file mode 100644 index 62bdd2601ad..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/factory/CoverUIFactory.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.factory; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; -import com.gregtechceu.gtceu.api.cover.CoverBehavior; -import com.gregtechceu.gtceu.api.cover.IUICover; - -import com.lowdragmc.lowdraglib.gui.factory.UIFactory; -import com.lowdragmc.lowdraglib.gui.modular.ModularUI; - -import net.minecraft.client.Minecraft; -import net.minecraft.core.Direction; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -public class CoverUIFactory extends UIFactory { - - public static final CoverUIFactory INSTANCE = new CoverUIFactory(); - - public CoverUIFactory() { - super(GTCEu.id("cover")); - } - - @Override - protected ModularUI createUITemplate(CoverBehavior holder, Player entityPlayer) { - if (holder instanceof IUICover cover) { - return cover.createUI(entityPlayer); - } - return null; - } - - @OnlyIn(Dist.CLIENT) - @Override - protected CoverBehavior readHolderFromSyncData(FriendlyByteBuf syncData) { - Level world = Minecraft.getInstance().level; - if (world == null) return null; - var pos = syncData.readBlockPos(); - var side = syncData.readEnum(Direction.class); - var coverable = GTCapabilityHelper.getCoverable(world, pos, side); - if (coverable != null) { - return coverable.getCoverAtSide(side); - } - return null; - } - - @Override - protected void writeHolderToSyncData(FriendlyByteBuf syncData, CoverBehavior holder) { - syncData.writeBlockPos(holder.coverHolder.getBlockPos()); - syncData.writeEnum(holder.attachedSide); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/CoverConfigurator.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/CoverConfigurator.java index a7253922ede..a2197e6d1ff 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/CoverConfigurator.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/CoverConfigurator.java @@ -2,8 +2,6 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverBehavior; -import com.gregtechceu.gtceu.api.cover.IUICover; -import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.fancy.IFancyConfigurator; import com.gregtechceu.gtceu.common.data.GTItems; @@ -12,7 +10,6 @@ import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; import com.lowdragmc.lowdraglib.utils.Position; -import com.lowdragmc.lowdraglib.utils.Size; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; @@ -42,17 +39,6 @@ public IGuiTexture getIcon() { @Override public Widget createConfigurator() { - WidgetGroup group = new WidgetGroup(new Position(0, 0)); - if (side != null) { - if (coverable.getCoverAtSide(side) instanceof IUICover iuiCover) { - Widget coverConfigurator = iuiCover.createUIWidget(); - coverConfigurator.setBackground(GuiTextures.BACKGROUND); - coverConfigurator.setSelfPosition(new Position(4, -4)); - group.addWidget(coverConfigurator); - group.setSize(new Size(Math.max(120, coverConfigurator.getSize().width + 8), - Math.max(80, 80 + coverConfigurator.getSize().height))); - } - } - return group; + return new WidgetGroup(new Position(0, 0)); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/CoverableConfigHandler.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/CoverableConfigHandler.java index a6a30fd5190..c51692790e0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/CoverableConfigHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/CoverableConfigHandler.java @@ -2,12 +2,10 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverBehavior; -import com.gregtechceu.gtceu.api.cover.IUICover; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.fancy.ConfiguratorPanel; import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; import com.gregtechceu.gtceu.api.gui.widget.CoverConfigurator; -import com.gregtechceu.gtceu.api.gui.widget.PredicatedButtonWidget; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.gui.widget.directional.IDirectionalConfigHandler; import com.gregtechceu.gtceu.api.item.IComponentItem; @@ -21,8 +19,6 @@ import com.lowdragmc.lowdraglib.gui.widget.SceneWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.utils.Position; -import com.lowdragmc.lowdraglib.utils.Size; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -88,9 +84,6 @@ public boolean canPutStack(ItemStack stack) { } .setChangeListener(this::coverItemChanged) .setBackgroundTexture(new GuiTextureGroup(GuiTextures.SLOT, GuiTextures.IO_CONFIG_COVER_SLOT_OVERLAY))); - group.addWidget(new PredicatedButtonWidget(0, 0, 18, 18, CONFIG_BTN_TEXTURE, this::toggleConfigTab, - () -> side != null && coverBehavior != null && machine.getCoverAtSide(side) instanceof IUICover)); - checkCoverBehaviour(); return group; @@ -171,24 +164,6 @@ public Component getTitle() { public IGuiTexture getIcon() { return GuiTextures.CLOSE_ICON; } - - @Override - public Widget createConfigurator() { - WidgetGroup group = new WidgetGroup(new Position(0, 0)); - - if (side == null || !(coverable.getCoverAtSide(side) instanceof IUICover iuiCover)) - return group; - - Widget coverConfigurator = iuiCover.createUIWidget(); - coverConfigurator.addSelfPosition(-1, -20); - - group.addWidget(coverConfigurator); - group.setSize(new Size( - Math.max(120, coverConfigurator.getSize().width), - Math.max(80, coverConfigurator.getSize().height - 20))); - - return group; - } }; this.coverConfigurator = this.panel.createFloatingTab(configurator); diff --git a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/EntryTypes.java b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/EntryTypes.java index a2b274cfc11..524effb6f65 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/EntryTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/EntryTypes.java @@ -31,14 +31,9 @@ private EntryTypes(ResourceLocation location, Supplier supplier) { this.factory = supplier; } - @Nullable - public static EntryTypes fromString(String name) { - return TYPES_MAP.getOrDefault(GTCEu.id(name), null); - } - @Nullable public static EntryTypes fromLocation(ResourceLocation location) { - return TYPES_MAP.getOrDefault(location, null); + return TYPES_MAP.get(location); } public static EntryTypes addEntryType(ResourceLocation location, Supplier supplier) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/VirtualEnderRegistry.java b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/VirtualEnderRegistry.java index d76b54600b8..00a9d6203ba 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/VirtualEnderRegistry.java +++ b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/VirtualEnderRegistry.java @@ -3,24 +3,20 @@ import com.gregtechceu.gtceu.GTCEu; import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.saveddata.SavedData; -import net.minecraftforge.server.ServerLifecycleHooks; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.function.Predicate; +import java.util.*; public class VirtualEnderRegistry extends SavedData { private static final String DATA_ID = GTCEu.MOD_ID + ".virtual_entry_data"; private static final String PUBLIC_KEY = "Public"; private static final String PRIVATE_KEY = "Private"; - private static volatile VirtualEnderRegistry data; + + private VirtualRegistryMap PUBLIC_REGISTRY = new VirtualRegistryMap(); private final Map VIRTUAL_REGISTRIES = new HashMap<>(); public VirtualEnderRegistry() {} @@ -29,43 +25,34 @@ public VirtualEnderRegistry(CompoundTag name) { readFromNBT(name); } - public static VirtualEnderRegistry getInstance() { - if (data == null) { - var server = ServerLifecycleHooks.getCurrentServer(); - if (server != null) { - data = server.overworld().getDataStorage() - .computeIfAbsent(VirtualEnderRegistry::new, VirtualEnderRegistry::new, DATA_ID); - } - } - - return data; + public static VirtualEnderRegistry get(ServerLevel sLvl) { + return sLvl.getServer().overworld().getDataStorage() + .computeIfAbsent(VirtualEnderRegistry::new, VirtualEnderRegistry::new, DATA_ID); } - /** - * To be called on server stopped event - */ - public static void release() { - if (data != null) { - data = null; - GTCEu.LOGGER.debug("VirtualEnderRegistry has been unloaded"); - } + public @Nullable T getEntry(@Nullable UUID owner, EntryTypes type, String name) { + if (owner == null) return PUBLIC_REGISTRY.getEntry(type, name); + return getRegistry(owner).getEntry(type, name); } - public T getEntry(@Nullable UUID owner, EntryTypes type, String name) { - return getRegistry(owner).getEntry(type, name); + public Map getEntries(@Nullable UUID owner, EntryTypes type) { + if (owner == null) return PUBLIC_REGISTRY.getEntries(type); + return VIRTUAL_REGISTRIES.get(owner).getEntries(type); } public void addEntry(@Nullable UUID owner, String name, VirtualEntry entry) { - getRegistry(owner).addEntry(name, entry); + if (owner == null) PUBLIC_REGISTRY.addEntry(name, entry); + else getRegistry(owner).addEntry(name, entry); } public boolean hasEntry(@Nullable UUID owner, EntryTypes type, String name) { + if (owner == null) return PUBLIC_REGISTRY.contains(type, name); return getRegistry(owner).contains(type, name); } - public @NotNull T getOrCreateEntry(@Nullable UUID owner, EntryTypes type, String name) { + public T getOrCreateEntry(@Nullable UUID owner, EntryTypes type, String name) { if (!hasEntry(owner, type, name)) addEntry(owner, name, type.createInstance()); - return getEntry(owner, type, name); + return Objects.requireNonNull(getEntry(owner, type, name)); } /** @@ -75,35 +62,33 @@ public boolean hasEntry(@Nullable UUID owner, EntryTypes type, String name) { * @param type Type of the registry to remove from * @param name The name of the entry */ - public void deleteEntry(@Nullable UUID owner, EntryTypes type, String name) { + public void forceDeleteEntry(@Nullable UUID owner, EntryTypes type, String name) { + if (owner == null) { + PUBLIC_REGISTRY.deleteEntry(type, name); + return; + } + var registry = getRegistry(owner); if (registry.contains(type, name)) { registry.deleteEntry(type, name); - return; } - GTCEu.LOGGER.warn("Attempted to delete {} entry {} of type {}, which does not exist", - owner == null ? "public" : String.format("private [%s]", owner), name, type); } - public void deleteEntryIf(@Nullable UUID owner, EntryTypes type, String name, - Predicate shouldDelete) { + public void tryDeleteEntry(@Nullable UUID owner, EntryTypes type, String name) { T entry = getEntry(owner, type, name); - if (entry != null && shouldDelete.test(entry)) deleteEntry(owner, type, name); - } - - public Set getEntryNames(UUID owner, EntryTypes type) { - return getRegistry(owner).getEntryNames(type); + if (entry == null) return; + if (entry.canRemove()) forceDeleteEntry(owner, type, name); } private VirtualRegistryMap getRegistry(UUID owner) { - if (data == null) getInstance(); - return data.VIRTUAL_REGISTRIES.computeIfAbsent(owner, key -> new VirtualRegistryMap()); + return VIRTUAL_REGISTRIES.computeIfAbsent(owner, key -> new VirtualRegistryMap()); } public final void readFromNBT(CompoundTag nbt) { if (nbt.contains(PUBLIC_KEY)) { - VIRTUAL_REGISTRIES.put(null, new VirtualRegistryMap(nbt.getCompound(PUBLIC_KEY))); + PUBLIC_REGISTRY = new VirtualRegistryMap(nbt.getCompound(PUBLIC_KEY)); } + if (nbt.contains(PRIVATE_KEY)) { CompoundTag privateEntries = nbt.getCompound(PRIVATE_KEY); for (String owner : privateEntries.getAllKeys()) { @@ -113,17 +98,14 @@ public final void readFromNBT(CompoundTag nbt) { } } - @NotNull @Override - public final CompoundTag save(@NotNull CompoundTag tag) { + public final CompoundTag save(CompoundTag tag) { var privateTag = new CompoundTag(); + tag.put(PUBLIC_KEY, PUBLIC_REGISTRY.serializeNBT()); for (var owner : VIRTUAL_REGISTRIES.keySet()) { + if (VIRTUAL_REGISTRIES.get(owner).isEmpty()) continue; var mapTag = VIRTUAL_REGISTRIES.get(owner).serializeNBT(); - if (owner != null) { - privateTag.put(owner.toString(), mapTag); - } else { - tag.put(PUBLIC_KEY, mapTag); - } + privateTag.put(owner.toString(), mapTag); } tag.put(PRIVATE_KEY, privateTag); return tag; diff --git a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/VirtualEntry.java b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/VirtualEntry.java index b4f8c322012..38851cc9fa1 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/VirtualEntry.java +++ b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/VirtualEntry.java @@ -6,7 +6,6 @@ import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; -import org.jetbrains.annotations.NotNull; import java.util.Locale; @@ -19,8 +18,8 @@ public abstract class VirtualEntry implements INBTSerializable { protected static final String DESC_KEY = "description"; @Setter - @NotNull private String description = ""; + @Getter private int color = 0xFFFFFFFF; private String colorStr = DEFAULT_COLOR; @@ -76,6 +75,6 @@ public void deserializeNBT(CompoundTag nbt) { } public boolean canRemove() { - return this.description.isEmpty(); + return this.description.isBlank(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/VirtualRegistryMap.java b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/VirtualRegistryMap.java index 3d48f8b0200..3601c71e247 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/VirtualRegistryMap.java +++ b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/VirtualRegistryMap.java @@ -1,21 +1,19 @@ package com.gregtechceu.gtceu.api.misc.virtualregistry; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.common.util.INBTSerializable; -import org.jetbrains.annotations.NotNull; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import org.jetbrains.annotations.Nullable; -import java.util.Collections; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; +import java.util.*; public class VirtualRegistryMap implements INBTSerializable { - private final Map, Map> registryMap = new ConcurrentHashMap<>(); + private final Map, Map> registryMap = new Object2ObjectOpenHashMap<>(); public VirtualRegistryMap() {} @@ -29,7 +27,11 @@ public VirtualRegistryMap(CompoundTag tag) { } public void addEntry(String name, VirtualEntry entry) { - registryMap.computeIfAbsent(entry.getType(), k -> new ConcurrentHashMap<>()).put(name, entry); + registryMap.computeIfAbsent(entry.getType(), k -> new Object2ObjectOpenHashMap<>()).put(name, entry); + } + + public Map getEntries(EntryTypes type) { + return registryMap.getOrDefault(type, new Object2ObjectOpenHashMap<>()); } public boolean contains(EntryTypes type, String name) { @@ -50,17 +52,18 @@ public void clear() { registryMap.clear(); } - public Set getEntryNames(EntryTypes type) { - return new HashSet<>(registryMap.getOrDefault(type, Collections.emptyMap()).keySet()); + public boolean isEmpty() { + return registryMap.isEmpty(); } @Override - public @NotNull CompoundTag serializeNBT() { + public CompoundTag serializeNBT() { CompoundTag tag = new CompoundTag(); for (Map.Entry, Map> entry : registryMap.entrySet()) { - CompoundTag entriesTag = new CompoundTag(); - for (Map.Entry subEntry : entry.getValue().entrySet()) { - entriesTag.put(subEntry.getKey(), subEntry.getValue().serializeNBT()); + ListTag entriesTag = new ListTag(); + for (VirtualEntry innerEntry : entry.getValue().values()) { + if (innerEntry.canRemove()) continue; + entriesTag.add(innerEntry.serializeNBT()); } tag.put(entry.getKey().toString(), entriesTag); } @@ -70,17 +73,30 @@ public Set getEntryNames(EntryTypes type) { @Override public void deserializeNBT(CompoundTag nbt) { for (String entryTypeString : nbt.getAllKeys()) { - EntryTypes type = entryTypeString.contains(":") ? - EntryTypes.fromLocation(ResourceLocation.tryParse(entryTypeString)) : - EntryTypes.fromString(entryTypeString); - + ResourceLocation entryTypeLoc = ResourceLocation.tryParse(entryTypeString); + if (entryTypeLoc == null) continue; + EntryTypes type = EntryTypes.fromLocation(entryTypeLoc); if (type == null) continue; - CompoundTag virtualEntries = nbt.getCompound(entryTypeString); - for (String name : virtualEntries.getAllKeys()) { - CompoundTag entryTag = virtualEntries.getCompound(name); - addEntry(name, type.createInstance(entryTag)); + Tag virtualEntries = nbt.get(entryTypeString); + + // backwards compat + if (virtualEntries instanceof CompoundTag compoundTag) { + for (String name : compoundTag.getAllKeys()) { + CompoundTag entryTag = compoundTag.getCompound(name); + VirtualEntry entry = type.createInstance(entryTag); + if (entry.canRemove()) continue; + addEntry(entry.getColorStr(), type.createInstance(entryTag)); + } + } else { + ListTag listTag = (ListTag) virtualEntries; + for (int i = 0; i < Objects.requireNonNull(listTag).size(); i++) { + var entry = type.createInstance(listTag.getCompound(i)); + if (entry.canRemove()) continue; + addEntry(entry.getColorStr(), entry); + } } + } } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/VirtualItemStorage.java b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/VirtualItemStorage.java index 755964107b0..80296879c10 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/VirtualItemStorage.java +++ b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/VirtualItemStorage.java @@ -8,7 +8,6 @@ import net.minecraft.nbt.CompoundTag; import lombok.Getter; -import org.jetbrains.annotations.NotNull; import javax.annotation.ParametersAreNonnullByDefault; @@ -18,7 +17,6 @@ public class VirtualItemStorage extends VirtualEntry { protected static final int DEFAULT_SLOT_AMOUNT = 1; - @NotNull @Getter private final CustomItemStackHandler handler; diff --git a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/VirtualRedstone.java b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/VirtualRedstone.java index 74a1cfc7987..ac6c1437540 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/VirtualRedstone.java +++ b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/VirtualRedstone.java @@ -2,21 +2,16 @@ import com.gregtechceu.gtceu.api.misc.virtualregistry.EntryTypes; import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEntry; - -import net.minecraft.nbt.CompoundTag; +import com.gregtechceu.gtceu.common.cover.ender.EnderRedstoneLinkCover; import it.unimi.dsi.fastutil.objects.Object2ShortMap; import it.unimi.dsi.fastutil.objects.Object2ShortOpenHashMap; import lombok.Getter; -import java.util.UUID; - public class VirtualRedstone extends VirtualEntry { - private static final String MEMBERS_KEY = "members"; - @Getter - private final Object2ShortMap members = new Object2ShortOpenHashMap<>(); + private final Object2ShortMap members = new Object2ShortOpenHashMap<>(); public VirtualRedstone() {} @@ -24,17 +19,17 @@ public int getSignal() { return members.values().intStream().max().orElse(0); } - public void addMember(UUID uuid) { - members.put(uuid, (short) 0); + public void addMember(EnderRedstoneLinkCover cover) { + members.put(cover, (short) 0); } - public void setSignal(UUID uuid, int signal) { - if (!members.containsKey(uuid)) return; - members.put(uuid, (short) signal); + public void setSignal(EnderRedstoneLinkCover cover, int signal) { + if (!members.containsKey(cover)) return; + members.put(cover, (short) signal); } - public void removeMember(UUID uuid) { - members.removeShort(uuid); + public void removeMember(EnderRedstoneLinkCover cover) { + members.removeShort(cover); } @Override @@ -42,25 +37,6 @@ public EntryTypes getType() { return EntryTypes.ENDER_REDSTONE; } - @Override - public CompoundTag serializeNBT() { - CompoundTag tag = super.serializeNBT(); - CompoundTag tag2 = new CompoundTag(); - for (var entry : members.object2ShortEntrySet()) - tag2.putShort(entry.getKey().toString(), entry.getShortValue()); - tag.put(MEMBERS_KEY, tag2); - return tag; - } - - @Override - public void deserializeNBT(CompoundTag nbt) { - super.deserializeNBT(nbt); - CompoundTag tag = nbt.getCompound(MEMBERS_KEY); - for (String uuid : tag.getAllKeys()) { - members.put(UUID.fromString(uuid), tag.getShort(uuid)); - } - } - @Override public boolean equals(Object o) { if (!(o instanceof VirtualRedstone other)) return false; diff --git a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/VirtualTank.java b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/VirtualTank.java index b142de09b9a..cc0c8d95ea4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/VirtualTank.java +++ b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/VirtualTank.java @@ -8,14 +8,12 @@ import net.minecraftforge.fluids.capability.templates.FluidTank; import lombok.Getter; -import org.jetbrains.annotations.NotNull; public class VirtualTank extends VirtualEntry { public static final int DEFAULT_CAPACITY = 160_000; // 160B for per second transfer protected static final String CAPACITY_KEY = "capacity"; protected static final String FLUID_KEY = "fluid"; - @NotNull @Getter private final FluidTank fluidTank; private int capacity; diff --git a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/package-info.java new file mode 100644 index 00000000000..d5df35c7c58 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.api.misc.virtualregistry.entries; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/package-info.java new file mode 100644 index 00000000000..d99aeae2306 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.api.misc.virtualregistry; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/mui/value/sync/GenericListSyncHandler.java b/src/main/java/com/gregtechceu/gtceu/api/mui/value/sync/GenericListSyncHandler.java index 487df9ccb23..3612b4374f3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/mui/value/sync/GenericListSyncHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/mui/value/sync/GenericListSyncHandler.java @@ -54,7 +54,8 @@ public List getValue() { @Override public void read(FriendlyByteBuf buffer) { this.cache.clear(); - for (int i = 0; i < buffer.readVarInt(); i++) { + int size = buffer.readVarInt(); + for (int i = 0; i < size; i++) { this.cache.add(deserializeValue(buffer)); } onSetCache(getValue(), true, false); diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/SyncDataHolder.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/SyncDataHolder.java index c16d2630b29..599d25a7037 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/SyncDataHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/SyncDataHolder.java @@ -59,7 +59,7 @@ public CompoundTag serializeNBT(boolean writeClientFields, boolean fullSync) { CompoundTag tag = new CompoundTag(); for (var field : fieldsToSerialize) { if (shouldSerializeField(field, writeClientFields, fullSync)) { - Tag nbtValue = serializeField(holder, field, writeClientFields); + Tag nbtValue = serializeField(holder, field, writeClientFields, fullSync); tag.put(field.nbtSaveKey, nbtValue); } } @@ -101,7 +101,7 @@ public void deserializeNBT(CompoundTag tag, boolean readingClientFields) { @SuppressWarnings("unchecked") private static Tag serializeField(ISyncManaged holder, FieldSyncData field, - boolean writeClientFields) { + boolean writeClientFields, boolean fullSync) { Object currentValue = field.handle.get(holder); if (!field.isSyncManaged && currentValue == null) { @@ -115,9 +115,9 @@ private static Tag serializeField(ISyncManaged holder, FieldSyncData field, if (field.transformer != null) { return ((ValueTransformer) field.transformer).serializeNBT(currentValue, new ValueTransformer.TransformerContext<>(holder, field.type, currentValue, field.fieldName, - writeClientFields)); + writeClientFields, fullSync)); } else if (currentValue instanceof ISyncManaged syncObj) { - return syncObj.getSyncDataHolder().serializeNBT(writeClientFields); + return syncObj.getSyncDataHolder().serializeNBT(writeClientFields, fullSync); } else { GTCEu.LOGGER.error("Sync: Failed to serialize field {} in class {}: Missing value transformer for {}", field.fieldName, holder.getClass().getName(), field.type); @@ -150,7 +150,7 @@ private static void deserializeField(ISyncManaged holder, FieldSyncData field, try { var current = field.handle.get(holder); Object result = transformer.deserializeNBT(savedValue, new ValueTransformer.TransformerContext<>( - holder, field.type, current, field.fieldName, readingClientFields)); + holder, field.type, current, field.fieldName, readingClientFields, false)); if (result != current) { field.handle.set(holder, result); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformer.java index 22a83bc1f86..6a2398f68b7 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformer.java @@ -5,7 +5,6 @@ import net.minecraft.nbt.Tag; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** @@ -19,17 +18,21 @@ public interface ValueTransformer { /** * A record holding information about the context from which this value transformer is currently being invoked. * - * @param holder The sync object which holds the specific field being serialized by this transformer. - * @param type An object describing the type of the field currently being serialized/deserialized. - * @param currentValue The current value (if any) of the field currently being serialized/deserialized. - * @param fieldName The name of the field being serialized, or a string denoting the current sync context if not - * being invoked directly on a field. - * @param isClientSync Whether NBT is currently being generated as part of a sync update to the client, not as NBT - * being - * written to the server save. + * @param holder The sync object which holds the specific field being serialized by this transformer. + * @param type An object describing the type of the field currently being serialized/deserialized. + * @param currentValue The current value (if any) of the field currently being serialized/deserialized. + * @param fieldName The name of the field being serialized, or a string denoting the current sync context if + * not + * being invoked directly on a field. + * @param isClientSync Whether NBT is currently being generated as part of a sync update to the client, not as NBT + * being + * written to the server save. + * @param fullClientSync Whether NBT is currently being generated to send to the client as part of a clientside + * chunk load */ - record TransformerContext(@NotNull ISyncManaged holder, @NotNull TypeDeclaration type, - @Nullable U currentValue, @Nullable String fieldName, boolean isClientSync) {} + record TransformerContext(ISyncManaged holder, TypeDeclaration type, + @Nullable U currentValue, @Nullable String fieldName, boolean isClientSync, + boolean fullClientSync) {} /** * Casts a given NBT tag to a specific tag type, throwing an error if the tag cannot be casted. diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ListTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ListTransformer.java index aa217e318dd..c9a8b26f060 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ListTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ListTransformer.java @@ -33,7 +33,7 @@ private ValueTransformer.TransformerContext getInnerElemContext(@Nullable T e ValueTransformer.TransformerContext> parentContext) { return new TransformerContext<>(parentContext.holder(), parentContext.type().getGenericTypeArgs()[0], elem, parentContext.fieldName() + "[element]", - parentContext.isClientSync()); + parentContext.isClientSync(), parentContext.fullClientSync()); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/MapTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/MapTransformer.java index b66985a169e..dd133df8ffc 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/MapTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/MapTransformer.java @@ -48,7 +48,7 @@ private ValueTransformer.TransformerContext getInnerKeyContext(@Nullable K ke ValueTransformer.TransformerContext> parentContext) { return new TransformerContext<>(parentContext.holder(), parentContext.type().getGenericTypeArgs()[0], key, parentContext.fieldName() + "[key]", - parentContext.isClientSync()); + parentContext.isClientSync(), parentContext.fullClientSync()); } private ValueTransformer.TransformerContext getInnerValueContext(@Nullable V value, @@ -56,7 +56,7 @@ private ValueTransformer.TransformerContext getInnerValueContext(@Nullable V return new TransformerContext<>(parentContext.holder(), parentContext.type().getGenericTypeArgs()[1], value, parentContext.fieldName() + "[value]", - parentContext.isClientSync()); + parentContext.isClientSync(), parentContext.fullClientSync()); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java index 1f665105fe0..d0ff5bedd28 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java @@ -23,7 +23,7 @@ private ValueTransformer.TransformerContext getInnerElemContext(@Nullable T e ValueTransformer.TransformerContext parentContext) { return new TransformerContext<>(parentContext.holder(), parentContext.type().getArrayComponentType(), elem, parentContext.fieldName() + "[element]", - parentContext.isClientSync()); + parentContext.isClientSync(), parentContext.fullClientSync()); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/SetTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/SetTransformer.java index 94c03417653..78328d3acea 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/SetTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/SetTransformer.java @@ -33,7 +33,7 @@ private ValueTransformer.TransformerContext getInnerElemContext(@Nullable T e ValueTransformer.TransformerContext> parentContext) { return new TransformerContext<>(parentContext.holder(), parentContext.type().getGenericTypeArgs()[0], elem, parentContext.fieldName() + "[element]", - parentContext.isClientSync()); + parentContext.isClientSync(), parentContext.fullClientSync()); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/CoverBehaviorTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/CoverBehaviorTransformer.java index 74e9cb6e3f2..4f3b3b87b28 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/CoverBehaviorTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/CoverBehaviorTransformer.java @@ -20,7 +20,7 @@ public class CoverBehaviorTransformer implements ValueTransformer public Tag serializeNBT(@Nullable CoverBehavior value, CoverBehaviorTransformer.TransformerContext context) { if (value != null) { - return serialize(value, context.isClientSync()); + return serialize(value, context.isClientSync(), context.fullClientSync()); } return new CompoundTag(); } @@ -36,12 +36,12 @@ public Tag serializeNBT(@Nullable CoverBehavior value, return null; } - private CompoundTag serialize(CoverBehavior cover, boolean isSync) { + private CompoundTag serialize(CoverBehavior cover, boolean isSync, boolean fullSync) { var compound = new CompoundTag(); compound.putInt("side", cover.attachedSide.ordinal()); compound.putString("coverType", cover.coverDefinition.getId().toString()); - CompoundTag serializedCover = cover.getSyncDataHolder().serializeNBT(isSync); + CompoundTag serializedCover = cover.getSyncDataHolder().serializeNBT(isSync, fullSync); compound.put("data", serializedCover); return compound; diff --git a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java index 1a2a29151fd..2d8294fdfb2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java @@ -16,7 +16,6 @@ import com.gregtechceu.gtceu.api.data.worldgen.WorldGenLayers; import com.gregtechceu.gtceu.api.data.worldgen.generator.IndicatorGenerators; import com.gregtechceu.gtceu.api.data.worldgen.generator.VeinGenerators; -import com.gregtechceu.gtceu.api.gui.factory.CoverUIFactory; import com.gregtechceu.gtceu.api.gui.factory.GTUIEditorFactory; import com.gregtechceu.gtceu.api.gui.factory.MachineUIFactory; import com.gregtechceu.gtceu.api.mui.factory.UIFactories; @@ -131,7 +130,6 @@ public static void init() { GTCEu.LOGGER.info("GTCEu common proxy init!"); GTNetwork.init(); UIFactory.register(MachineUIFactory.INSTANCE); - UIFactory.register(CoverUIFactory.INSTANCE); UIFactory.register(GTUIEditorFactory.INSTANCE); // Initialize the model generator before any content is loaded so machine models can use the generated data diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ComputerMonitorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ComputerMonitorCover.java index 9a4ef87e2c6..1a3b90de9cf 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ComputerMonitorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ComputerMonitorCover.java @@ -4,8 +4,6 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.CoverDefinition; -import com.gregtechceu.gtceu.api.cover.IUICover; -import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IDataStickInteractable; import com.gregtechceu.gtceu.api.placeholder.IPlaceholderInfoProviderCover; @@ -17,12 +15,10 @@ import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.client.renderer.cover.CoverTextRenderer; import com.gregtechceu.gtceu.client.renderer.cover.IDynamicCoverRenderer; -import com.gregtechceu.gtceu.data.lang.LangHandler; import com.gregtechceu.gtceu.integration.create.GTCreateIntegration; import com.gregtechceu.gtceu.utils.GTStringUtils; import com.gregtechceu.gtceu.utils.GTUtil; -import com.lowdragmc.lowdraglib.gui.texture.ResourceBorderTexture; import com.lowdragmc.lowdraglib.gui.widget.*; import net.minecraft.MethodsReturnNonnullByDefault; @@ -49,7 +45,7 @@ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault public class ComputerMonitorCover extends CoverBehavior - implements IUICover, IDataStickInteractable, IPlaceholderInfoProviderCover { + implements IDataStickInteractable, IPlaceholderInfoProviderCover { private TickableSubscription subscription; private final CoverTextRenderer renderer; @@ -124,87 +120,6 @@ public Supplier getDynamicRenderer() { return () -> renderer; } - @Override - public Widget createUIWidget() { - int textFieldWidth = 160, horizontalPadding = 10, verticalPadding = 2; - final WidgetGroup group = new WidgetGroup(0, 0, 2 * textFieldWidth + 3 * horizontalPadding, 150); - final WidgetGroup mainPage = new WidgetGroup(0, 0, 2 * textFieldWidth + 3 * horizontalPadding, 150); - final WidgetGroup formatStringArgsPage = new WidgetGroup(0, 0, 2 * textFieldWidth + 3 * horizontalPadding, 150); - for (int i = 0; i < 8; i++) { - TextFieldWidget formatStringInput = new TextFieldWidget(); - formatStringInput.setSize(textFieldWidth, 15); - formatStringInput.setSelfPosition(horizontalPadding + textFieldWidth / 2, - 10 + verticalPadding + i * (15 + verticalPadding)); - formatStringInput.setHoverTooltips(GTStringUtils.toImmutable( - LangHandler.getMultiLang("gtceu.gui.computer_monitor_cover.main_textbox_tooltip", i + 1))); - int finalI = i; - if (i >= formatStringLines.size()) formatStringLines.add(""); - formatStringInput.setCurrentString(formatStringLines.get(i)); - formatStringInput.setTextResponder((s) -> formatStringLines.set(finalI, s)); - mainPage.addWidget(formatStringInput); - SlotWidget slot = new com.gregtechceu.gtceu.api.gui.widget.SlotWidget( - itemStackHandler, - i, - horizontalPadding + 50, - 20 * i); - slot.setBackgroundTexture(SlotWidget.ITEM_SLOT_TEXTURE); - slot.setHoverTooltips(GTStringUtils - .toImmutable(LangHandler.getMultiLang("gtceu.gui.computer_monitor_cover.slot_tooltip", i + 1))); - mainPage.addWidget(slot); - } - for (int i = 0; i < 8; i++) { - TextFieldWidget formatStringArgsInput = new TextFieldWidget(); - formatStringArgsInput.setSize(textFieldWidth, 15); - formatStringArgsInput.setSelfPosition(textFieldWidth / 2 + horizontalPadding, - 10 + verticalPadding + i * (15 + verticalPadding)); - formatStringArgsInput.setHoverTooltips(GTStringUtils.toImmutable( - LangHandler.getMultiLang("gtceu.gui.computer_monitor_cover.second_page_textbox_tooltip", - GTStringUtils.getIntOrderingSuffix(i + 1)))); - - int finalI = i; - if (i >= formatStringArgs.size()) formatStringArgs.add(""); - formatStringArgsInput.setCurrentString(formatStringArgs.get(i)); - formatStringArgsInput.setTextResponder((s) -> formatStringArgs.set(finalI, s)); - formatStringArgsPage.addWidget(formatStringArgsInput); - } - ButtonWidget switchToFormatStringArgsPageButton = new ButtonWidget( - horizontalPadding + 50, - 10 * (15 + verticalPadding) + verticalPadding, - 20, 20, - new ResourceBorderTexture(), - clickData -> { - group.clearAllWidgets(); - group.addWidget(formatStringArgsPage); - }); - ButtonWidget switchBack = new ButtonWidget( - horizontalPadding + 50, - 10 * (15 + verticalPadding) + verticalPadding, - 20, 20, - new ResourceBorderTexture(), - clickData -> { - group.clearAllWidgets(); - group.addWidget(mainPage); - }); - mainPage.addWidget(PlaceholderHandler.getPlaceholderHandlerUI("")); - // TextFieldWidget searchBox = new TextFieldWidget(280, 0, 80, 15, null, onSearch); - // searchBox.setHoverTooltips("Search"); - // mainPage.addWidget(searchBox); - IntInputWidget updateIntervalInput = new IntInputWidget(0, 0, 60, 20, this::getUpdateInterval, - this::setUpdateInterval); - updateIntervalInput.setMin(1); - updateIntervalInput.setMax(60 * 20); - updateIntervalInput - .setHoverTooltips(Component.translatable("gtceu.gui.computer_monitor_cover.update_interval")); - mainPage.addWidget(updateIntervalInput); - switchToFormatStringArgsPageButton - .setHoverTooltips(Component.translatable("gtceu.gui.computer_monitor_cover.edit_blank_placeholders")); - switchBack.setHoverTooltips(Component.translatable("gtceu.gui.computer_monitor_cover.edit_displayed_text")); - mainPage.addWidget(switchToFormatStringArgsPageButton); - formatStringArgsPage.addWidget(switchBack); - group.addWidget(mainPage); - return group; - } - @Override public void onLoad() { super.onLoad(); 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 e198f3c5213..b8d8f77221f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java @@ -12,7 +12,6 @@ import com.gregtechceu.gtceu.api.mui.base.drawable.IKey; import com.gregtechceu.gtceu.api.mui.factory.SidedPosGuiData; import com.gregtechceu.gtceu.api.mui.value.sync.*; -import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -423,11 +422,8 @@ public boolean shouldRespectDistributionMode() { ////////////////////////////////////// @Override - public ParentWidget createCoverUI(SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings) { - Flow column = Flow.column() - .top(7).margin(7, 0) - .widthRel(1.0f).coverChildrenHeight(); - + public void createCoverUIRows(Flow column, SidedPosGuiData data, PanelSyncManager syncManager, + UISettings settings) { EnumSyncValue manualMode = new EnumSyncValue<>(ManualIOMode.class, this::getManualIOMode, this::setManualIOMode); @@ -437,20 +433,18 @@ public ParentWidget createCoverUI(SidedPosGuiData data, PanelSyncManager sync IntSyncValue transferRate = new IntSyncValue(this::getTransferRate, this::setTransferRate); EnumSyncValue ioSync = new EnumSyncValue<>(IO.class, this::getIo, this::setIo); + syncManager.syncValue("io", ioSync); syncManager.syncValue("manualMode", manualMode); syncManager.syncValue("distribution", distMode); syncManager.syncValue("throughput", transferRate); - syncManager.syncValue("io", ioSync); if (createThroughputRow()) { column.child(GTMuiWidgets.createIntInputWithButtons(transferRate, () -> 1, () -> maxItemTransferRate)); } if (createFilterRow()) { - column.child( - GTMuiWidgets.createFilterRow(filterHandler, ItemFilter::loadFilter, data, syncManager, settings) - .child(0, GTMuiWidgets.createIOCycleButton(ioSync, false).marginRight(2)) - .marginBottom(2)); + column.child(GTMuiWidgets.createFilterRow(filterHandler, data, syncManager, settings) + .child(0, GTMuiWidgets.createIOCycleButton(ioSync, false))); } if (createConveyorIORow()) {} @@ -471,8 +465,6 @@ public ParentWidget createCoverUI(SidedPosGuiData data, PanelSyncManager sync .build()); } - - return column; } protected boolean createThroughputRow() { 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 cf4f77e9e3e..d345a844d47 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java @@ -10,7 +10,6 @@ import com.gregtechceu.gtceu.api.mui.value.sync.DynamicSyncHandler; import com.gregtechceu.gtceu.api.mui.value.sync.EnumSyncValue; import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; -import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; import com.gregtechceu.gtceu.api.mui.widgets.ButtonWidget; import com.gregtechceu.gtceu.api.mui.widgets.DynamicSyncedWidget; import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; @@ -88,11 +87,8 @@ public FluidFilter getFluidFilter() { } @Override - public ParentWidget createCoverUI(SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings) { - Flow column = Flow.column() - .top(7).margin(7, 0) - .widthRel(1.0f).coverChildrenHeight(); - + public void createCoverUIRows(Flow column, SidedPosGuiData data, PanelSyncManager syncManager, + UISettings settings) { EnumSyncValue filterMode = new EnumSyncValue<>(FilterMode.class, this::getFilterMode, this::setFilterMode); @@ -112,9 +108,7 @@ public ParentWidget createCoverUI(SidedPosGuiData data, PanelSyncManager sync return true; })); - column.child(Flow.row() - .coverChildrenHeight() - .child(new DynamicSyncedWidget<>().syncHandler(filterButton))); + column.child(coverUIRow().child(new DynamicSyncedWidget<>().syncHandler(filterButton))); column.child(new GTMuiWidgets.EnumRowBuilder<>(FilterMode.class) .value(filterMode) @@ -127,8 +121,6 @@ public ParentWidget createCoverUI(SidedPosGuiData data, PanelSyncManager sync .overlay(16, GTGuiTextures.MANUAL_IO_OVERLAY_IN) .lang(IKey.dynamic(() -> Component.translatable(getAllowFlow().getTooltip()))) .build()); - - return column; } 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 e186ea96fca..e6f2adf0243 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java @@ -9,7 +9,7 @@ import com.gregtechceu.gtceu.api.mui.value.sync.EnumSyncValue; import com.gregtechceu.gtceu.api.mui.value.sync.IntSyncValue; import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; -import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; +import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; @@ -30,7 +30,6 @@ import lombok.Getter; import lombok.Setter; -import org.jetbrains.annotations.NotNull; import javax.annotation.ParametersAreNonnullByDefault; @@ -188,16 +187,11 @@ private int getFilteredFluidAmount(FluidStack fluidStack) { /////////////////////////// // ***** GUI ******// - /////////////////////////// @Override - protected @NotNull String getUITitle() { - return "cover.fluid_regulator.title"; - } - - @Override - public ParentWidget createCoverUI(SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings) { - var column = super.createCoverUI(data, syncManager, settings); + public void createCoverUIRows(Flow column, SidedPosGuiData data, PanelSyncManager syncManager, + 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); @@ -218,8 +212,6 @@ public ParentWidget createCoverUI(SidedPosGuiData data, PanelSyncManager sync column.child(GTMuiWidgets.createIntInputWithButtons(transferSize, () -> 1, () -> MAX_STACK_SIZE) .setEnabledIf($ -> shouldShowTransferSize())); - - return column; } private boolean shouldShowTransferSize() { 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 89e311cc256..9de99310817 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java @@ -13,7 +13,6 @@ import com.gregtechceu.gtceu.api.mui.value.sync.DynamicSyncHandler; import com.gregtechceu.gtceu.api.mui.value.sync.EnumSyncValue; import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; -import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; import com.gregtechceu.gtceu.api.mui.widgets.ButtonWidget; import com.gregtechceu.gtceu.api.mui.widgets.DynamicSyncedWidget; import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; @@ -98,11 +97,8 @@ public void onAttached(ItemStack itemStack, @Nullable ServerPlayer player) { } @Override - public ParentWidget createCoverUI(SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings) { - Flow column = Flow.column() - .top(7).margin(7, 0) - .widthRel(1.0f).coverChildrenHeight(); - + public void createCoverUIRows(Flow column, SidedPosGuiData data, PanelSyncManager syncManager, + UISettings settings) { EnumSyncValue filterMode = new EnumSyncValue<>(FilterMode.class, this::getFilterMode, this::setFilterMode); @@ -122,9 +118,7 @@ public ParentWidget createCoverUI(SidedPosGuiData data, PanelSyncManager sync return true; })); - column.child(Flow.row() - .coverChildrenHeight() - .child(new DynamicSyncedWidget<>().syncHandler(filterButton))); + column.child(coverUIRow().child(new DynamicSyncedWidget<>().syncHandler(filterButton))); column.child(new GTMuiWidgets.EnumRowBuilder<>(FilterMode.class) .value(filterMode) @@ -137,8 +131,6 @@ public ParentWidget createCoverUI(SidedPosGuiData data, PanelSyncManager sync .overlay(16, GTGuiTextures.MANUAL_IO_OVERLAY_IN) .lang(IKey.dynamic(() -> Component.translatable(getAllowFlow().name()))) .build()); - - return column; } 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 e8e962d76bc..3a82b270b77 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/MachineControllerCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/MachineControllerCover.java @@ -6,35 +6,28 @@ import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.CoverDefinition; import com.gregtechceu.gtceu.api.cover.IMuiCover; -import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.machine.MachineCoverContainer; import com.gregtechceu.gtceu.api.mui.base.drawable.IKey; import com.gregtechceu.gtceu.api.mui.drawable.ItemDrawable; import com.gregtechceu.gtceu.api.mui.drawable.Rectangle; import com.gregtechceu.gtceu.api.mui.factory.SidedPosGuiData; -import com.gregtechceu.gtceu.api.mui.utils.Alignment; import com.gregtechceu.gtceu.api.mui.value.sync.BooleanSyncValue; import com.gregtechceu.gtceu.api.mui.value.sync.DoubleSyncValue; import com.gregtechceu.gtceu.api.mui.value.sync.EnumSyncValue; import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; -import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; import com.gregtechceu.gtceu.api.mui.widget.Widget; import com.gregtechceu.gtceu.api.mui.widgets.SliderWidget; import com.gregtechceu.gtceu.api.mui.widgets.ToggleButton; import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; -import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.client.mui.screen.ModularPanel; import com.gregtechceu.gtceu.client.mui.screen.UISettings; import com.gregtechceu.gtceu.common.cover.data.ControllerMode; +import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.common.mui.GTGuis; -import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; -import com.lowdragmc.lowdraglib.gui.texture.TextTexture; -import com.lowdragmc.lowdraglib.gui.widget.ButtonWidget; - import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -59,9 +52,6 @@ @MethodsReturnNonnullByDefault public class MachineControllerCover extends CoverBehavior implements IMuiCover {// IUICover { - private CustomItemStackHandler sideCoverSlot; - private ButtonWidget modeButton; - @SaveField @Getter private boolean isInverted = false; @@ -123,22 +113,17 @@ public void setControllerMode(@Nullable ControllerMode controllerMode) { this.controllerMode = controllerMode; syncDataHolder.markClientSyncFieldDirty("filterMode"); - updateAll(); + updateInput(); } public void setMinRedstoneStrength(int minRedstoneStrength) { this.minRedstoneStrength = minRedstoneStrength; - updateAll(); + updateInput(); } public void setInverted(boolean inverted) { isInverted = inverted; - updateAll(); - } - - private void updateAll() { updateInput(); - updateUI(); } /////////////////////////////////////////////////// @@ -218,19 +203,20 @@ public ModularPanel buildUI(SidedPosGuiData data, PanelSyncManager syncManager, syncManager.syncValue("controllerMode", controllerModeValue); return GTGuis.createPanel(this, 176, 245) - .child(IMuiCover.createTitleRow(this.self().getAttachItem())) - .child(Flow.column() - .widthRel(1.0f).margin(7, 0) - .top(24).coverChildrenHeight() + .child(GTMuiWidgets.createTitleBar(this.self().getAttachItem(), 176, GTGuiTextures.BACKGROUND)) + .child(Flow.col().top(7).margin(7, 0) + .childPadding(2) + .widthRel(1.0f) + .coverChildrenHeight() - .child(createSettingsRow() + .child(coverUIRow() .child(new ToggleButton() .size(16).left(0) .value(new BooleanSyncValue(this::isInverted, ($) -> this.setInverted(true))) .overlay(GTGuiTextures.OVERLAY_REDSTONE_ON)) .child(IKey.lang("cover.enable_with_redstone").asWidget() .heightRel(1.0f).left(20))) - .child(createSettingsRow() + .child(coverUIRow() .child(new ToggleButton() .size(16).left(0) .value(new BooleanSyncValue(() -> !this.isInverted(), @@ -238,7 +224,7 @@ public ModularPanel buildUI(SidedPosGuiData data, PanelSyncManager syncManager, .overlay(GTGuiTextures.OVERLAY_REDSTONE_OFF)) .child(IKey.lang("cover.disable_with_redstone").asWidget() .heightRel(1.0f).left(20))) - .child(createSettingsRow() + .child(coverUIRow() .child(new ToggleButton() .size(16).left(0) .value(new BooleanSyncValue(() -> preventPowerFail, @@ -246,58 +232,45 @@ public ModularPanel buildUI(SidedPosGuiData data, PanelSyncManager syncManager, .overlay(GTGuiTextures.CIRCUIT_OVERLAY)) .child(IKey.lang("cover.machine_controller.suspend_powerfail").asWidget() .heightRel(1.0f).left(20))) - .child(createSettingsRow() + .child(coverUIRow() .child(IKey .dynamic(() -> Component.translatable("cover.machine_controller.redstone", redstoneSignalOutput)) .asWidget() - .heightRel(1.0f).leftRel(0f))) - .child(createSettingsRow() + .height(16).leftRel(0f))) + .child(coverUIRow() .child(new SliderWidget() .background(GTGuiTextures.FLUID_SLOT) .widthRel(0.9f) - .height(15) + .height(16) .alignX(0.5f) .bounds(0, 15) .stopper(1.0) .value(new DoubleSyncValue(() -> (double) redstoneSignalOutput, v -> redstoneSignalOutput = (int) v)))) // Separating line - .child(new Rectangle().color(UI_TEXT_COLOR).asWidget() - .height(1).widthRel(0.9f).alignX(0.5f).marginBottom(4).marginTop(4)) + .child(coverUIRow().child(new Rectangle().color(UI_TEXT_COLOR).asWidget() + .height(1).widthRel(0.9f).alignX(0.5f)).margin(0, 2)) + + .child(coverUIRow().child(IKey.lang("cover.machine_controller.control").asWidget() + .height(16))) // Controlling selector - .child(createSettingsRow().height(16 + 2 + 16) - .child(Flow.column().heightRel(1.0f).coverChildrenWidth() - .child(IKey.lang("cover.machine_controller.control").asWidget() - .left(0).height(16).marginBottom(2)) - .child(modeButton(controllerModeValue, ControllerMode.MACHINE).left(0))) - .child(modeColumn(controllerModeValue, ControllerMode.COVER_UP, IKey.str("U")) - .right(100)) - .child(modeColumn(controllerModeValue, ControllerMode.COVER_DOWN, IKey.str("D")) - .right(80)) - .child(modeColumn(controllerModeValue, ControllerMode.COVER_NORTH, IKey.str("N")) - .right(60)) - .child(modeColumn(controllerModeValue, ControllerMode.COVER_SOUTH, IKey.str("S")) - .right(40)) - .child(modeColumn(controllerModeValue, ControllerMode.COVER_EAST, IKey.str("E")) - .right(20)) - .child(modeColumn(controllerModeValue, ControllerMode.COVER_WEST, IKey.str("W")) - .right(0)))) + .child(coverUIRow() + .child(modeButton(controllerModeValue, ControllerMode.MACHINE).bottom(0)) + .child(modeColumn(controllerModeValue, ControllerMode.COVER_UP, IKey.str("U"))) + .child(modeColumn(controllerModeValue, ControllerMode.COVER_DOWN, IKey.str("D"))) + .child(modeColumn(controllerModeValue, ControllerMode.COVER_NORTH, IKey.str("N"))) + .child(modeColumn(controllerModeValue, ControllerMode.COVER_SOUTH, IKey.str("S"))) + .child(modeColumn(controllerModeValue, ControllerMode.COVER_EAST, IKey.str("E"))) + .child(modeColumn(controllerModeValue, ControllerMode.COVER_WEST, IKey.str("W"))))) .bindPlayerInventory(); - - // return IMuiCover.super.buildUI(data, syncManager, settings); - } - - @Override - public ParentWidget createCoverUI(SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings) { - return null; } private Flow modeColumn(EnumSyncValue syncValue, ControllerMode mode, IKey title) { - return Flow.column().coverChildrenHeight().width(18) - .child(title.asWidget().size(16).marginBottom(2).alignment(Alignment.Center)) - .child(modeButton(syncValue, mode)); + return Flow.column().width(18).height(28) + .child(title.asWidget().height(10).alignX(0.5f)) + .child(modeButton(syncValue, mode).bottom(0)); } private Widget modeButton(EnumSyncValue syncValue, ControllerMode mode) { @@ -342,102 +315,6 @@ private Widget modeButton(EnumSyncValue syncValue, Controller .addLine(IKey.lang(stack.getHoverName()))); } - /* - * @Override - * public Widget createUIWidget() { - * if (controllerMode != null && getControllable(controllerMode.side) == null) { - * setControllerMode(null); - * } - * WidgetGroup group = new WidgetGroup(0, 0, 176, 95); - * - * group.addWidget(new LabelWidget(10, 5, "cover.machine_controller.title")); - * group.addWidget(new IntInputWidget(10, 20, 131, 20, - * this::getMinRedstoneStrength, this::setMinRedstoneStrength).setMin(1).setMax(15)); - * - * modeButton = new ButtonWidget(10, 45, 131, 20, - * new GuiTextureGroup(GuiTextures.VANILLA_BUTTON), - * cd -> selectNextMode()); - * group.addWidget(modeButton); - * - * // Inverted Mode Toggle: - * group.addWidget(new ToggleButtonWidget( - * 146, 20, 20, 20, - * GuiTextures.INVERT_REDSTONE_BUTTON, this::isInverted, this::setInverted) - * .isMultiLang() - * .setTooltipText("cover.machine_controller.invert")); - * - * group.addWidget(new LabelWidget(10, 72, "cover.machine_controller.suspend_powerfail")); - * group.addWidget(new ToggleButtonWidget(147, 68, 18, 18, GuiTextures.BUTTON_POWER, - * this::preventPowerFail, (data) -> { - * preventPowerFail = data; - * })); - * - * sideCoverSlot = new CustomItemStackHandler(1); - * group.addWidget(new PhantomSlotWidget(sideCoverSlot, 0, 147, 46) { - * - * @Override - * public ItemStack slotClickPhantom(Slot slot, int mouseButton, ClickType clickTypeIn, ItemStack stackHeld) { - * return sideCoverSlot.getStackInSlot(0); - * } - * }); - * - * updateUI(); - * - * return group; - * } - */ - - private void selectNextMode() { - var allowedModes = getAllowedModes(); - - setControllerMode(allowedModes.stream() - .dropWhile(mode -> this.controllerMode != null && mode != this.controllerMode) - .skip(1) - .findFirst() - .orElse(allowedModes.isEmpty() ? null : allowedModes.get(0))); - - updateAll(); - } - - private void updateUI() { - updateModeButton(); - updateCoverSlot(); - } - - private void updateModeButton() { - if (modeButton == null) { - return; - } - - modeButton.setButtonTexture(new GuiTextureGroup( - GuiTextures.VANILLA_BUTTON, - new TextTexture(controllerMode != null ? controllerMode.localeName : ControllerMode.nullLocaleName))); - } - - private void updateCoverSlot() { - if (sideCoverSlot == null) { - return; - } - - if (controllerMode == null) { - sideCoverSlot.setStackInSlot(0, ItemStack.EMPTY); - sideCoverSlot.onContentsChanged(0); - } else { - var side = controllerMode.side; - if (side == null && coverHolder instanceof MachineCoverContainer coverContainer) { - sideCoverSlot.setStackInSlot(0, coverContainer.getMachine().getDefinition().asStack()); - } else { - var cover = coverHolder.getCoverAtSide(side); - if (cover != null) { - sideCoverSlot.setStackInSlot(0, cover.getAttachItem().copy()); - } else { - sideCoverSlot.setStackInSlot(0, ItemStack.EMPTY); - } - } - sideCoverSlot.onContentsChanged(0); - } - } - @Override public CompoundTag copyConfig(CompoundTag tag) { tag.putBoolean("inverted", isInverted); 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 b162bf5f245..8df788feb21 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java @@ -15,7 +15,6 @@ import com.gregtechceu.gtceu.api.mui.value.sync.EnumSyncValue; import com.gregtechceu.gtceu.api.mui.value.sync.IntSyncValue; import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; -import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -30,8 +29,6 @@ import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.utils.GTTransferUtils; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; - import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -47,7 +44,6 @@ import it.unimi.dsi.fastutil.objects.Object2LongMap; import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap; import lombok.Getter; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -272,44 +268,30 @@ private static boolean canTransfer(IFluidHandlerModifiable fluidHandler, Transfe ////////////////////////////////////// @Override - public ParentWidget createCoverUI(SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings) { - Flow column = Flow.column() - .top(7).margin(7, 0) - .widthRel(1.0f).coverChildrenHeight(); - + public void createCoverUIRows(Flow column, SidedPosGuiData data, PanelSyncManager syncManager, + UISettings settings) { IntSyncValue transferRateSync = new IntSyncValue(this::getTransferRate, this::setTransferRate); EnumSyncValue bucketModeSync = new EnumSyncValue<>(BucketMode.class, this::getBucketMode, this::setBucketMode); - EnumSyncValue ioSync = new EnumSyncValue<>(IO.class, this::getIo, this::setIo); EnumSyncValue manualIOModeSync = new EnumSyncValue<>(ManualIOMode.class, this::getManualIOMode, this::setManualIOMode); + EnumSyncValue ioSync = new EnumSyncValue<>(IO.class, this::getIo, this::setIo); - syncManager.syncValue("transferRate", transferRateSync); syncManager.syncValue("io", ioSync); + syncManager.syncValue("transferRate", transferRateSync); syncManager.syncValue("manualIO", manualIOModeSync); column.child(GTMuiWidgets.createIntInputWithBucketMode(transferRateSync, bucketModeSync, () -> maxFluidTransferRate)); - column.child(GTMuiWidgets.createFilterRow(filterHandler, FluidFilter::loadFilter, data, syncManager, settings) - .child(0, GTMuiWidgets.createIOCycleButton(ioSync, false).marginRight(2)).marginBottom(2)); + column.child(GTMuiWidgets.createFilterRow(filterHandler, data, syncManager, settings) + .child(0, GTMuiWidgets.createIOCycleButton(ioSync, false))); column.child(new GTMuiWidgets.EnumRowBuilder<>(ManualIOMode.class) .value(manualIOModeSync) .overlay(16, GTGuiTextures.MANUAL_IO_OVERLAY_IN) .lang(IKey.dynamic(() -> Component.translatable(manualIOMode.localeName))) .build()); - - return column; - } - - @NotNull - protected String getUITitle() { - return "cover.pump.title"; - } - - protected void buildAdditionalUI(WidgetGroup group) { - // Do nothing in the base implementation. This is intended to be overridden by subclasses. } 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 c2f48b43f17..47304523c37 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java @@ -12,7 +12,7 @@ import com.gregtechceu.gtceu.api.mui.value.sync.EnumSyncValue; import com.gregtechceu.gtceu.api.mui.value.sync.IntSyncValue; import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; -import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; +import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.client.mui.screen.UISettings; @@ -176,8 +176,9 @@ protected String getUITitle() { } @Override - public ParentWidget createCoverUI(SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings) { - var column = super.createCoverUI(data, syncManager, settings); + public void createCoverUIRows(Flow column, SidedPosGuiData data, PanelSyncManager syncManager, + 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); @@ -193,8 +194,6 @@ public ParentWidget createCoverUI(SidedPosGuiData data, PanelSyncManager sync column.child(GTMuiWidgets.createIntInputWithButtons(transferSize, () -> 1, () -> getTransferMode().maxStackSize) .setEnabledIf($ -> shouldShowStackSize())); - - return column; } @Override 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 957918d3c37..66647e0bff2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/StorageCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/StorageCover.java @@ -11,9 +11,8 @@ import com.gregtechceu.gtceu.api.mui.factory.SidedPosGuiData; import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; import com.gregtechceu.gtceu.api.mui.value.sync.SyncHandlers; -import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; import com.gregtechceu.gtceu.api.mui.widgets.SlotGroupWidget; -import com.gregtechceu.gtceu.api.mui.widgets.layout.Column; +import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; import com.gregtechceu.gtceu.api.mui.widgets.slot.ItemSlot; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; @@ -75,17 +74,15 @@ public boolean canAttach() { } @Override - public ParentWidget createCoverUI(SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings) { - return new Column() - .child(IMuiCover.createTitleRow(this.getAttachItem())) - .child(SlotGroupWidget.builder() - .matrix("IIIIII", "IIIIII", "IIIIII") - .key('I', i -> new ItemSlot() - .slot(SyncHandlers.itemSlot(inventory, i).singletonSlotGroup(i))) - .build()) + public void createCoverUIRows(Flow parent, SidedPosGuiData data, PanelSyncManager syncManager, + UISettings settings) { + parent.child(SlotGroupWidget.builder() + .matrix("IIIIII", "IIIIII", "IIIIII") + .key('I', i -> new ItemSlot() + .slot(SyncHandlers.itemSlot(inventory, i).singletonSlotGroup(i))) + .build()) .rightRel(0.5F) .margin(3) - .childPadding(3) .coverChildren(); } 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 40d9f303085..6a2b07ad75a 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 @@ -6,28 +6,22 @@ import com.gregtechceu.gtceu.api.cover.CoverDefinition; import com.gregtechceu.gtceu.api.cover.IMuiCover; import com.gregtechceu.gtceu.api.mui.base.drawable.IKey; -import com.gregtechceu.gtceu.api.mui.drawable.DynamicDrawable; import com.gregtechceu.gtceu.api.mui.factory.SidedPosGuiData; import com.gregtechceu.gtceu.api.mui.theme.ThemeAPI; import com.gregtechceu.gtceu.api.mui.value.sync.BooleanSyncValue; import com.gregtechceu.gtceu.api.mui.value.sync.LongSyncValue; import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; -import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; -import com.gregtechceu.gtceu.api.mui.widgets.ButtonWidget; import com.gregtechceu.gtceu.api.mui.widgets.ToggleButton; -import com.gregtechceu.gtceu.api.mui.widgets.layout.Column; import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; -import com.gregtechceu.gtceu.api.mui.widgets.layout.Row; -import com.gregtechceu.gtceu.api.mui.widgets.textfield.TextFieldWidget; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.client.mui.screen.UISettings; +import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.utils.GTMath; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import lombok.Getter; @@ -110,11 +104,14 @@ public long getEnergyCapacity() { } public void setMinValue(long value) { - minValue = GTMath.clamp(value, 0, getEnergyCapacity()); + this.minValue = GTMath.clamp(value, 0, maxValue - 1); + if (this.minValue < 0) this.minValue = 0; } public void setMaxValue(long value) { - maxValue = GTMath.clamp(value, 0, getEnergyCapacity()); + if (usePercent) maxValue = GTMath.clamp(value, 0, 100); + else maxValue = GTMath.clamp(value, 0, getEnergyCapacity()); + setMinValue(this.getMinValue()); } public void setUsePercent(boolean usePercent) { @@ -129,26 +126,21 @@ public void setUsePercent(boolean usePercent) { ////////////////////////////////////// @Override - public ParentWidget createCoverUI(SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings) { + public void createCoverUIRows(Flow column, SidedPosGuiData data, PanelSyncManager syncManager, + UISettings settings) { syncManager.syncValue("usePercent", new BooleanSyncValue(this::isUsePercent, this::setUsePercent)); - return new Column() - .child(IMuiCover.createTitleRow(this.getAttachItem())) - .child(new Row() - .child(new Column() - .child(IKey.lang("cover.advanced_energy_detector.min").asWidget().alignY(0.15F)) - .child(IKey.lang("cover.advanced_energy_detector.max").asWidget().alignY(0.85F)) - .heightRel(1F) - .coverChildrenWidth()) - .child(new Column() - .child(createFieldRow(new LongSyncValue(this::getMinValue, this::setMinValue))) - .child(createFieldRow(new LongSyncValue(this::getMaxValue, this::setMaxValue))) - .childPadding(2) - .expanded() - .coverChildrenHeight()) - .widthRel(1F) - .childPadding(3) - .coverChildrenHeight()) - .child(new Row() + var minValueSync = new LongSyncValue(this::getMinValue, this::setMinValue); + var maxValueSync = new LongSyncValue(this::getMaxValue, this::setMaxValue); + + syncManager.syncValue("minValue", minValueSync); + syncManager.syncValue("maxValue", maxValueSync); + + column.child(coverUIRow().child(IKey.lang("cover.advanced_energy_detector.min").asWidget().width(20)) + .child(GTMuiWidgets.createLongInputWithButtons(minValueSync, () -> 0, this::getMaxValue).width(142))) + .child(coverUIRow().child(IKey.lang("cover.advanced_energy_detector.max").asWidget().width(20)) + .child(GTMuiWidgets.createLongInputWithButtons(maxValueSync, () -> 0, + () -> usePercent ? 100 : getEnergyCapacity()).width(142))) + .child(coverUIRow() .child(new ToggleButton().value(new BooleanSyncValue(this::isInverted, this::setInverted)) .overlay(false, GTGuiTextures.OVERLAY_REDSTONE_OFF) .overlay(true, GTGuiTextures.OVERLAY_REDSTONE_ON) @@ -162,49 +154,7 @@ public ParentWidget createCoverUI(SidedPosGuiData data, PanelSyncManager sync .tooltip(false, t -> t.addMultiLine("cover.advanced_energy_detector.use_percent.disabled")) .tooltip(true, - t -> t.addMultiLine("cover.advanced_energy_detector.use_percent.enabled"))) - .childPadding(5) - .coverChildren()) - .rightRel(0.5F) - .margin(3) - .childPadding(3) - .coverChildren(); - } - - private Flow createFieldRow(LongSyncValue voltageSyncer) { - return new Row() - .child(new ButtonWidget<>() - .overlay(new DynamicDrawable(() -> { - int value = getIncrementValue(); - return IKey.str("-" + value).scale(1f - (String.valueOf(value).length() * 0.1f)); - })) - .onMousePressed((x, y, button) -> { - voltageSyncer.setLongValue(voltageSyncer.getValue() - getIncrementValue()); - return true; - }) - .width(24)) - .child(new TextFieldWidget().value(voltageSyncer) - .tooltip(t -> t.add(Component.translatable("gtceu.creative.energy.voltage"))) - .setNumbersLong(num -> { - if (usePercent) { - return GTMath.clamp(num, 0, 100); - } else return GTMath.clamp(num, 0, getEnergyCapacity()); - }) - .widthRelOffset(1f, -52) - .height(16)) - .child(new ButtonWidget<>() - .overlay(new DynamicDrawable(() -> { - int value = getIncrementValue(); - return IKey.str("+" + value).scale(1f - (String.valueOf(value).length() * 0.1f)); - })) - .onMousePressed((x, y, button) -> { - voltageSyncer.setLongValue(voltageSyncer.getValue() + getIncrementValue()); - return true; - }) - .width(24)) - .onUpdateListener(flow -> flow.scheduleResize()) - .widthRel(1F) - .coverChildrenHeight(); + t -> t.addMultiLine("cover.advanced_energy_detector.use_percent.enabled")))); } private void updateEUValues(boolean wasPercent) { 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 86ef201e8f2..c7ed19436ff 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 @@ -2,21 +2,22 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverDefinition; -import com.gregtechceu.gtceu.api.cover.IUICover; +import com.gregtechceu.gtceu.api.cover.IMuiCover; import com.gregtechceu.gtceu.api.cover.filter.FilterHandler; import com.gregtechceu.gtceu.api.cover.filter.FilterHandlers; import com.gregtechceu.gtceu.api.cover.filter.FluidFilter; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; -import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; +import com.gregtechceu.gtceu.api.mui.base.drawable.IKey; +import com.gregtechceu.gtceu.api.mui.factory.SidedPosGuiData; +import com.gregtechceu.gtceu.api.mui.value.sync.BooleanSyncValue; +import com.gregtechceu.gtceu.api.mui.value.sync.IntSyncValue; +import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; +import com.gregtechceu.gtceu.api.mui.widgets.ToggleButton; +import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; - -import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; -import com.lowdragmc.lowdraglib.gui.widget.TextBoxWidget; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.utils.LocalizationUtils; +import com.gregtechceu.gtceu.client.mui.screen.UISettings; +import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; @@ -38,7 +39,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class AdvancedFluidDetectorCover extends FluidDetectorCover implements IUICover { +public class AdvancedFluidDetectorCover extends FluidDetectorCover implements IMuiCover { private static final int DEFAULT_MIN = 64; private static final int DEFAULT_MAX = 512; @@ -107,47 +108,47 @@ protected void update() { public void setMinValue(int minValue) { this.minValue = Mth.clamp(minValue, 0, maxValue - 1); + if (this.minValue < 0) this.minValue = 0; } public void setMaxValue(int maxValue) { this.maxValue = Math.max(maxValue, 0); + setMinValue(this.getMinValue()); } ////////////////////////////////////// // *********** GUI ***********// ////////////////////////////////////// - + /// @Override - public Widget createUIWidget() { - WidgetGroup group = new WidgetGroup(0, 0, 176, 170); - group.addWidget(new LabelWidget(10, 5, "cover.advanced_fluid_detector.label")); - - group.addWidget(new TextBoxWidget(10, 55, 65, - List.of(LocalizationUtils.format("cover.advanced_fluid_detector.min")))); - - group.addWidget(new TextBoxWidget(10, 80, 65, - List.of(LocalizationUtils.format("cover.advanced_fluid_detector.max")))); - - group.addWidget(new IntInputWidget(80, 50, 176 - 80 - 10, 20, this::getMinValue, this::setMinValue)); - group.addWidget(new IntInputWidget(80, 75, 176 - 80 - 10, 20, this::getMaxValue, this::setMaxValue)); - - // Invert Redstone Output Toggle: - group.addWidget(new ToggleButtonWidget( - 9, 20, 20, 20, - GuiTextures.INVERT_REDSTONE_BUTTON, this::isInverted, this::setInverted) - .isMultiLang() - .setTooltipText("cover.advanced_fluid_detector.invert")); - - group.addWidget( - new ToggleButtonWidget(31, 21, 18, 18, GuiTextures.BUTTON_LOCK, this::isLatched, this::setLatched) - .setShouldUseBaseBackground() - .isMultiLang() - .setTooltipText("cover.advanced_detector.latch")); - - group.addWidget(filterHandler.createFilterSlotUI(148, 100)); - group.addWidget(filterHandler.createFilterConfigUI(10, 100, 156, 60)); - - return group; + 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); + + syncManager.syncValue("minValue", minValueSync); + syncManager.syncValue("maxValue", maxValueSync); + + var buttonRow = coverUIRow() + .child(new ToggleButton().value(new BooleanSyncValue(this::isInverted, this::setInverted)) + .overlay(false, GTGuiTextures.OVERLAY_REDSTONE_OFF) + .overlay(true, GTGuiTextures.OVERLAY_REDSTONE_ON) + .tooltip(false, t -> t.addMultiLine("cover.advanced_fluid_detector.invert.disabled")) + .tooltip(true, t -> t.addMultiLine("cover.advanced_fluid_detector.invert.enabled"))) + .child(new ToggleButton().value(new BooleanSyncValue(this::isLatched, this::setLatched)) + .overlay(false, GTGuiTextures.BUTTON_LOCK) + .overlay(true, GTGuiTextures.BUTTON_LOCK) + .tooltip(false, t -> t.addMultiLine("cover.advanced_detector.latch.disabled")) + .tooltip(true, t -> t.addMultiLine("cover.advanced_detector.latch.enabled"))); + + GTMuiWidgets.createFilterRow(buttonRow, filterHandler, data, syncManager, settings); + + column.child(coverUIRow().child(IKey.lang("cover.advanced_fluid_detector.min").asWidget().width(50)) + .child(GTMuiWidgets.createIntInputWithButtons(minValueSync, () -> 0, this::getMaxValue).width(110))) + .child(coverUIRow().child(IKey.lang("cover.advanced_fluid_detector.max").asWidget().width(50)) + .child(GTMuiWidgets.createIntInputWithButtons(maxValueSync, () -> 0, () -> Integer.MAX_VALUE) + .width(110))) + .child(buttonRow); } @Override 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 bf6cde4d7f3..e546925059f 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 @@ -2,23 +2,24 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverDefinition; -import com.gregtechceu.gtceu.api.cover.IUICover; +import com.gregtechceu.gtceu.api.cover.IMuiCover; import com.gregtechceu.gtceu.api.cover.filter.FilterHandler; import com.gregtechceu.gtceu.api.cover.filter.FilterHandlers; import com.gregtechceu.gtceu.api.cover.filter.ItemFilter; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; -import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; +import com.gregtechceu.gtceu.api.mui.base.drawable.IKey; +import com.gregtechceu.gtceu.api.mui.factory.SidedPosGuiData; +import com.gregtechceu.gtceu.api.mui.value.sync.BooleanSyncValue; +import com.gregtechceu.gtceu.api.mui.value.sync.IntSyncValue; +import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; +import com.gregtechceu.gtceu.api.mui.widgets.ToggleButton; +import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; +import com.gregtechceu.gtceu.client.mui.screen.UISettings; +import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.utils.RedstoneUtil; -import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; -import com.lowdragmc.lowdraglib.gui.widget.TextBoxWidget; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.utils.LocalizationUtils; - import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -35,7 +36,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class AdvancedItemDetectorCover extends ItemDetectorCover implements IUICover { +public class AdvancedItemDetectorCover extends ItemDetectorCover implements IMuiCover { private static final int DEFAULT_MIN = 64; private static final int DEFAULT_MAX = 512; @@ -98,10 +99,12 @@ protected void update() { public void setMinValue(int minValue) { this.minValue = Mth.clamp(minValue, 0, maxValue - 1); + if (this.minValue < 0) this.minValue = 0; } public void setMaxValue(int maxValue) { this.maxValue = Math.max(maxValue, 0); + setMinValue(this.getMinValue()); } public void setLatched(boolean latched) { @@ -114,37 +117,34 @@ public void setLatched(boolean latched) { ////////////////////////////////////// @Override - public Widget createUIWidget() { - WidgetGroup group = new WidgetGroup(0, 0, 176, 170); - group.addWidget(new LabelWidget(10, 5, "cover.advanced_item_detector.label")); - - group.addWidget(new TextBoxWidget(10, 55, 65, - List.of(LocalizationUtils.format("cover.advanced_item_detector.min")))); - - group.addWidget(new TextBoxWidget(10, 80, 65, - List.of(LocalizationUtils.format("cover.advanced_item_detector.max")))); - - group.addWidget(new IntInputWidget(80, 50, 176 - 80 - 10, 20, this::getMinValue, this::setMinValue)); - group.addWidget(new IntInputWidget(80, 75, 176 - 80 - 10, 20, this::getMaxValue, this::setMaxValue)); - - // Invert Redstone Output Toggle: - group.addWidget(new ToggleButtonWidget( - 9, 20, 20, 20, - GuiTextures.INVERT_REDSTONE_BUTTON, this::isInverted, this::setInverted) - .isMultiLang() - .setTooltipText("cover.advanced_item_detector.invert")); - - group.addWidget(new ToggleButtonWidget(31, 21, 18, 18, - GuiTextures.BUTTON_LOCK, this::isLatched, this::setLatched) - .setShouldUseBaseBackground() - .isMultiLang() - .setTooltipText("cover.advanced_detector.latch")); - - // Item Filter UI: - group.addWidget(filterHandler.createFilterSlotUI(148, 100)); - group.addWidget(filterHandler.createFilterConfigUI(10, 100, 156, 60)); - - return group; + 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); + + syncManager.syncValue("minValue", minValueSync); + syncManager.syncValue("maxValue", maxValueSync); + + var buttonRow = coverUIRow() + .child(new ToggleButton().value(new BooleanSyncValue(this::isInverted, this::setInverted)) + .overlay(false, GTGuiTextures.OVERLAY_REDSTONE_OFF) + .overlay(true, GTGuiTextures.OVERLAY_REDSTONE_ON) + .tooltip(false, t -> t.addMultiLine("cover.advanced_item_detector.invert.disabled")) + .tooltip(true, t -> t.addMultiLine("cover.advanced_item_detector.invert.disabled"))) + .child(new ToggleButton().value(new BooleanSyncValue(this::isLatched, this::setLatched)) + .overlay(false, GTGuiTextures.BUTTON_LOCK) + .overlay(true, GTGuiTextures.BUTTON_LOCK) + .tooltip(false, t -> t.addMultiLine("cover.advanced_detector.latch.disabled")) + .tooltip(true, t -> t.addMultiLine("cover.advanced_detector.latch.enabled"))); + + GTMuiWidgets.createFilterRow(buttonRow, filterHandler, data, syncManager, settings); + + column.child(coverUIRow().child(IKey.lang("cover.advanced_item_detector.min").asWidget().width(50)) + .child(GTMuiWidgets.createIntInputWithButtons(minValueSync, () -> 0, this::getMaxValue).width(110))) + .child(coverUIRow().child(IKey.lang("cover.advanced_item_detector.max").asWidget().width(50)) + .child(GTMuiWidgets.createIntInputWithButtons(maxValueSync, () -> 0, () -> Integer.MAX_VALUE) + .width(110))) + .child(buttonRow); } @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 9532f234cc1..93a42abeefe 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 @@ -5,55 +5,63 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.CoverDefinition; -import com.gregtechceu.gtceu.api.cover.IUICover; +import com.gregtechceu.gtceu.api.cover.IMuiCover; import com.gregtechceu.gtceu.api.cover.filter.FilterHandler; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.widget.ColorBlockWidget; -import com.gregtechceu.gtceu.api.gui.widget.ConfirmTextInputWidget; -import com.gregtechceu.gtceu.api.gui.widget.EnumSelectorWidget; -import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; import com.gregtechceu.gtceu.api.machine.ConditionalSubscriptionHandler; import com.gregtechceu.gtceu.api.machine.MachineCoverContainer; import com.gregtechceu.gtceu.api.misc.virtualregistry.EntryTypes; import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEnderRegistry; import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEntry; -import com.gregtechceu.gtceu.api.misc.virtualregistry.entries.VirtualTank; +import com.gregtechceu.gtceu.api.mui.base.drawable.IDrawable; +import com.gregtechceu.gtceu.api.mui.base.drawable.IKey; +import com.gregtechceu.gtceu.api.mui.base.widget.IWidget; +import com.gregtechceu.gtceu.api.mui.drawable.Rectangle; +import com.gregtechceu.gtceu.api.mui.factory.GuiData; +import com.gregtechceu.gtceu.api.mui.factory.SidedPosGuiData; +import com.gregtechceu.gtceu.api.mui.utils.Alignment; +import com.gregtechceu.gtceu.api.mui.utils.Color; +import com.gregtechceu.gtceu.api.mui.utils.MouseData; +import com.gregtechceu.gtceu.api.mui.value.sync.*; +import com.gregtechceu.gtceu.api.mui.widget.EmptyWidget; +import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; +import com.gregtechceu.gtceu.api.mui.widgets.*; +import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; +import com.gregtechceu.gtceu.api.mui.widgets.textfield.TextFieldWidget; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; -import com.gregtechceu.gtceu.common.cover.data.ManualIOMode; +import com.gregtechceu.gtceu.client.mui.screen.ModularPanel; +import com.gregtechceu.gtceu.client.mui.screen.RichTooltip; +import com.gregtechceu.gtceu.client.mui.screen.UISettings; +import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; +import com.gregtechceu.gtceu.utils.serialization.network.IByteBufAdapter; -import com.lowdragmc.lowdraglib.gui.editor.ColorPattern; -import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.texture.TextTexture; -import com.lowdragmc.lowdraglib.gui.widget.*; - -import net.minecraft.ChatFormatting; import net.minecraft.core.Direction; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.item.ItemStack; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import lombok.AccessLevel; import lombok.Getter; -import org.apache.commons.lang3.mutable.MutableBoolean; -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.nio.charset.StandardCharsets; import java.util.*; +import java.util.function.IntSupplier; import java.util.regex.Pattern; @SuppressWarnings("SameParameterValue") public abstract class AbstractEnderLinkCover extends CoverBehavior - implements IUICover, IControllable { + implements IMuiCover, IControllable { - public static final Pattern COLOR_INPUT_PATTERN = Pattern.compile("^[0-9a-fA-F]{0,8}$"); + public static final Pattern COLOR_INPUT_PATTERN = Pattern.compile("([^0-9a-fA-F])"); protected final ConditionalSubscriptionHandler subscriptionHandler; @SaveField @SyncToClient + @Getter(value = AccessLevel.PROTECTED) protected String colorStr = VirtualEntry.DEFAULT_COLOR; @Getter @SaveField @@ -65,19 +73,12 @@ public abstract class AbstractEnderLinkCover extends Cov @Getter @SaveField @SyncToClient - protected ManualIOMode manualIOMode = ManualIOMode.DISABLED; - @Getter - @SaveField - @SyncToClient @RerenderOnChanged protected IO io = IO.OUT; - protected VirtualEntryWidget virtualEntryWidget; - @SyncToClient - boolean isAnyChanged = false; public AbstractEnderLinkCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide) { super(definition, coverHolder, attachedSide); - subscriptionHandler = new ConditionalSubscriptionHandler(coverHolder, this::update, this::isSubscriptionActive); + subscriptionHandler = new ConditionalSubscriptionHandler(coverHolder, this::update, this::isWorkingEnabled); } @Override @@ -89,36 +90,16 @@ public void onLoad() { @Override public abstract boolean canAttach(); - @Override - public void onAttached(@NotNull ItemStack itemStack, @Nullable ServerPlayer player) { - super.onAttached(itemStack, player); - } - - @Override - public void onRemoved() { - super.onRemoved(); - subscriptionHandler.unsubscribe(); - if (!isRemote()) { - VirtualEnderRegistry.getInstance() - .deleteEntryIf(getOwner(), getEntryType(), getChannelName(), VirtualEntry::canRemove); - } - } - @Override public void onUnload() { super.onUnload(); subscriptionHandler.unsubscribe(); if (!isRemote()) { - VirtualEnderRegistry.getInstance() - .deleteEntryIf(getOwner(), getEntryType(), getChannelName(), VirtualEntry::canRemove); + VirtualEnderRegistry.get((ServerLevel) coverHolder.getLevel()) + .tryDeleteEntry(getOwner(), getEntryType(), getColorStr()); } } - @Override - public void onUIClosed() { - virtualEntryWidget = null; - } - @Override public void setWorkingEnabled(boolean isWorkingAllowed) { if (this.isWorkingEnabled != isWorkingAllowed) { @@ -127,12 +108,6 @@ public void setWorkingEnabled(boolean isWorkingAllowed) { } } - @Override - public Widget createUIWidget() { - virtualEntryWidget = new VirtualEntryWidget(this); - return virtualEntryWidget; - } - public void setIo(IO io) { if (io == IO.IN || io == IO.OUT) { this.io = io; @@ -141,372 +116,276 @@ public void setIo(IO io) { } } - public UUID getOwner() { + public @Nullable UUID getOwner() { if (permission == Permissions.PRIVATE && coverHolder instanceof MachineCoverContainer mcc) { var owner = mcc.getMachine().getOwner(); return owner != null ? owner.getPlayerUUID() : null; } + if (permission == Permissions.PROTECTED && coverHolder instanceof MachineCoverContainer mcc) { + var owner = mcc.getMachine().getOwner(); + return owner != null ? owner.getUUID() : null; + } return null; } - protected boolean isSubscriptionActive() { - return isWorkingEnabled(); - } + protected @Nullable abstract VirtualEntry getEntry(); - protected abstract String identifier(); + protected abstract void setEntry(VirtualEntry entry); - protected abstract VirtualEntry getEntry(); + protected abstract EntryTypes getEntryType(); - protected abstract void setEntry(VirtualEntry entry); + protected abstract void transfer(); - protected final String getChannelName() { - return identifier() + this.colorStr; + /** + * All syncers registered through this method MUST use the {@link PanelSyncManager#getOrCreateSyncHandler} method + * for applying a syncer to a widget because it gets placed into a {@link DynamicSyncedWidget}. + * + * @return A widget to represent the entry type for this cover + */ + protected abstract IWidget createVirtualEntryWidget(PanelSyncManager manager, VirtualEntry entry, int w, int h, + int idx); + + @Nullable + protected FilterHandler getFilterHandler() { + return null; } - protected void setChannelName(String name) { + protected void setColorStr(String str) { if (isRemote()) return; - VirtualEnderRegistry.getInstance().deleteEntryIf(getOwner(), getEntryType(), getChannelName(), - VirtualEntry::canRemove); - this.colorStr = name; + if (str.length() != 8) str = str.concat("F".repeat(8 - str.length())); + VirtualEnderRegistry.get((ServerLevel) coverHolder.getLevel()).tryDeleteEntry(getOwner(), getEntryType(), + getColorStr()); + this.colorStr = str; syncDataHolder.markClientSyncFieldDirty("colorStr"); setVirtualEntry(); } - protected final String getChannelName(VirtualEntry entry) { - return identifier() + entry.getColorStr(); - } - protected void setPermission(Permissions permission) { if (isRemote()) return; - VirtualEnderRegistry.getInstance().deleteEntryIf(getOwner(), getEntryType(), getChannelName(), - VirtualEntry::canRemove); + VirtualEnderRegistry.get((ServerLevel) coverHolder.getLevel()).tryDeleteEntry(getOwner(), getEntryType(), + getColorStr()); this.permission = permission; syncDataHolder.markClientSyncFieldDirty("permission"); - setVirtualEntry(); } protected void setVirtualEntry() { - setEntry(VirtualEnderRegistry.getInstance().getOrCreateEntry(getOwner(), getEntryType(), getChannelName())); - getEntry().setColor(this.colorStr); - syncDataHolder.markClientSyncFieldDirty("isAnyChanged"); - this.isAnyChanged = true; + setEntry(VirtualEnderRegistry.get((ServerLevel) coverHolder.getLevel()).getOrCreateEntry(getOwner(), + getEntryType(), getColorStr())); + Objects.requireNonNull(getEntry()).setColor(this.colorStr); subscriptionHandler.updateSubscription(); } - protected abstract EntryTypes getEntryType(); - protected void update() { long timer = coverHolder.getOffsetTimer(); if (timer % 5 != 0) return; if (isWorkingEnabled() && !isRemote()) { - var entry = VirtualEnderRegistry.getInstance().getOrCreateEntry(getOwner(), getEntryType(), - getChannelName()); + var entry = VirtualEnderRegistry.get((ServerLevel) coverHolder.getLevel()).getOrCreateEntry(getOwner(), + getEntryType(), getColorStr()); if (!entry.getColorStr().equals(this.colorStr)) { entry.setColor(this.colorStr); } - if (!getEntry().equals(entry)) { + if (!Objects.equals(getEntry(), entry)) { setEntry(entry); } transfer(); } - if (isAnyChanged) { - if (virtualEntryWidget != null) virtualEntryWidget.update(); - isAnyChanged = false; - } subscriptionHandler.updateSubscription(); } - protected abstract void transfer(); - - protected void setManualIOMode(ManualIOMode manualIOMode) { - this.manualIOMode = manualIOMode; - syncDataHolder.markClientSyncFieldDirty("manualIOMode"); - subscriptionHandler.updateSubscription(); + protected int getColor() { + return VirtualEntry.parseColor(this.colorStr); } - @Nullable - protected FilterHandler getFilterHandler() { - return null; + private String getDescription() { + return getEntry() == null ? "null" : getEntry().getDescription(); } - protected abstract Widget addVirtualEntryWidget(VirtualEntry entry, int x, int y, int width, int height, - boolean canClick); - - protected abstract String getUITitle(); - - protected int getColor() { - return VirtualEntry.parseColor(this.colorStr); + private void setDescription(String description) { + if (getEntry() != null) getEntry().setDescription(description); } - protected enum Permissions implements EnumSelectorWidget.SelectableEnum { + private List getVirtualEntries() { + return VirtualEnderRegistry.get((ServerLevel) coverHolder.getLevel()).getEntries(getOwner(), getEntryType()) + .values().stream().toList(); + } - PUBLIC("cover.ender_fluid_link.private.tooltip.disabled", - GuiTextures.BUTTON_PUBLIC_PRIVATE.getSubTexture(0, 0, 1, 0.5)), + protected enum Permissions { - PRIVATE("cover.ender_fluid_link.private.tooltip.enabled", - GuiTextures.BUTTON_PUBLIC_PRIVATE.getSubTexture(0, 0.5, 1, 0.5)); + PUBLIC("cover.ender_link.public.tooltip"), + PROTECTED("cover.ender_link.protected.tooltip"), + PRIVATE("cover.ender_link.private.tooltip"); @Getter private final String tooltip; - @Getter - private final IGuiTexture icon; - Permissions(String tooltip, IGuiTexture icon) { + Permissions(String tooltip) { this.tooltip = tooltip; - this.icon = icon; } } - protected static class VirtualEntryWidget extends WidgetGroup { - - private static final int WIDGET_BOARD = 20; - private static final int GROUP_WIDTH = 176; - private static final int TOTAL_WIDTH = 156; - private static final int BUTTON_SIZE = 16; - private final AbstractEnderLinkCover cover; - private final MutableBoolean showChannels; - private final WidgetGroup mainGroup; - private final WidgetGroup mainChannelGroup; - private final DraggableScrollableWidgetGroup channelsGroup; // client only - - VirtualEntryWidget(AbstractEnderLinkCover cover) { - super(0, 0, GROUP_WIDTH, 137); - this.cover = cover; - this.showChannels = new MutableBoolean(false); - mainGroup = new WidgetGroup(0, 0, GROUP_WIDTH, 137); - channelsGroup = new DraggableScrollableWidgetGroup(0, 20, 170, 110) - .setYScrollBarWidth(2).setYBarStyle(null, ColorPattern.T_WHITE.rectTexture().setRadius(1)); - mainChannelGroup = new WidgetGroup(10, 20, 156, 20); - initWidgets(); - } - - public void update() { - if (isRemote()) return; - widgets.clear(); - mainGroup.widgets.clear(); - channelsGroup.widgets.clear(); - mainChannelGroup.widgets.clear(); - initWidgets(); - this.detectAndSendChanges(); - } - - private void initWidgets() { - int currentX = 0; - final var titleGroup = new WidgetGroup(10, 5, GROUP_WIDTH, 20); - - this.addWidget(titleGroup); - this.addWidget(mainGroup); - this.addWidget(channelsGroup.setVisible(false)); - - titleGroup.addWidget(createToggleButton()); - titleGroup.addWidget(new LabelWidget(15, 3, cover.getUITitle())); - - var toggleButtonWidget = createToggleButtonForPrivacy(currentX); - mainChannelGroup.addWidget(toggleButtonWidget); - currentX += WIDGET_BOARD + 2; - mainChannelGroup.addWidget(createColorBlockWidget(currentX)); - currentX += WIDGET_BOARD + 2; - mainChannelGroup.addWidget(createConfirmTextInputWidget(currentX)); - - mainChannelGroup.addWidget(new ConfirmTextInputWidget(0, WIDGET_BOARD + 2, GROUP_WIDTH - WIDGET_BOARD, - WIDGET_BOARD, cover.getEntry().getDescription(), cover.getEntry()::setDescription, - t -> t == null ? "" : t, null).setTooltip("cover.ender_fluid_link.tooltip.channel_description")); - - mainGroup.addWidget(mainChannelGroup); - mainGroup.addWidget(createWorkingEnabledButton()); - addEnumSelectorWidgets(); - mainGroup.addWidget( - cover.addVirtualEntryWidget(cover.getEntry(), 146, WIDGET_BOARD, WIDGET_BOARD, WIDGET_BOARD, true)); - - if (cover.getFilterHandler() != null) { - mainGroup.addWidget(cover.getFilterHandler().createFilterSlotUI(117, 108)); - mainGroup.addWidget(cover.getFilterHandler().createFilterConfigUI(10, 72, 156, 60)); - } - } - - @Contract(" -> new") - private @NotNull ToggleButtonWidget createToggleButton() { - return (ToggleButtonWidget) new ToggleButtonWidget(0, 0, 12, 12, showChannels::getValue, cd -> { - showChannels.setValue(!showChannels.getValue()); - mainGroup.setVisible(showChannels.isFalse()); - channelsGroup.setVisible(showChannels.isTrue()); - requestUpdate(); - }).setTexture( - new GuiTextureGroup(GuiTextures.TOGGLE_BUTTON_BACK.getSubTexture(0, 0, 1, 0.5), - GuiTextures.BUTTON_LIST), - new GuiTextureGroup(GuiTextures.TOGGLE_BUTTON_BACK.getSubTexture(0, 0.5, 1, 0.5), - GuiTextures.BUTTON_LIST)) - .setHoverTooltips("cover.ender_fluid_link.tooltip.list_button"); - } - - @Contract("_ -> new") - private @NotNull Widget createToggleButtonForPrivacy(int currentX) { - return new EnumSelectorWidget<>(currentX, 0, - WIDGET_BOARD, WIDGET_BOARD, Permissions.values(), cover.permission, cover::setPermission); - } - - private ColorBlockWidget createColorBlockWidget(int currentX) { - return new ColorBlockWidget(currentX, 0, WIDGET_BOARD, WIDGET_BOARD).setColorSupplier(cover::getColor); - } + @Override + public void createCoverUIRows(Flow column, SidedPosGuiData data, PanelSyncManager syncManager, + UISettings settings) { + var channelManager = syncManager.syncedPanel("channelManager", true, + (sm, sh) -> createChannelManagerPanel(data, sm, settings)); + + var colorSyncer = new IntSyncValue(this::getColor); + EnumSyncValue ioSync = new EnumSyncValue<>(IO.class, this::getIo, this::setIo); + + syncManager.syncValue("io", ioSync); + syncManager.syncValue("color", colorSyncer); + + var currentEntry = new GenericSyncValue.Builder<>(VirtualEntry.class) + .getter(this::getEntry) + .adapter(new VirtualEntryAdapter()).build(); + syncManager.syncValue("currentEntry", currentEntry); + + DynamicLinkedSyncHandler> dynamicLinkedSyncHandler = new DynamicLinkedSyncHandler<>( + currentEntry) + .widgetProvider((manager, entriesListSyncer) -> createVirtualEntryWidget(manager, + entriesListSyncer.getValue(), 18, 18, 0)); + + column.child(coverUIRow() + .child(createColorBlock(colorSyncer::getIntValue, 18).asWidget().size(18)) + .child(new CycleButtonWidget() + .stateCount(3) + .stateOverlay(Permissions.PUBLIC, GTGuiTextures.PRIVATE_MODE_BUTTON[0]) + .stateOverlay(Permissions.PROTECTED, GTGuiTextures.PRIVATE_MODE_BUTTON[0]) + .stateOverlay(Permissions.PRIVATE, GTGuiTextures.PRIVATE_MODE_BUTTON[1]) + .tooltip(0, t -> t.addLine(IKey.lang(Permissions.PUBLIC.tooltip))) + .tooltip(1, t -> t.addLine(IKey.lang(Permissions.PROTECTED.tooltip))) + .tooltip(2, t -> t.addLine(IKey.lang(Permissions.PRIVATE.tooltip))) + .value(new EnumSyncValue<>(Permissions.class, this::getPermission, + this::setPermission))) + .child(new TextFieldWidget() + .value(new StringSyncValue(this::getColorStr, this::setColorStr)) + .setMaxLength(8) + .setValidator(str -> COLOR_INPUT_PATTERN.matcher(str).replaceAll("")) + .addTooltipLine(IKey.lang(Component.translatable("cover.ender_link.tooltip.channel_name")))) + .child(new DynamicSyncedWidget<>().syncHandler(dynamicLinkedSyncHandler)) + .child(new ButtonWidget<>().onMousePressed((x, y, b) -> { + channelManager.openPanel(); + return true; + }).align(Alignment.CenterRight).tooltip(new RichTooltip() + .addLine(IKey.lang(Component.translatable("cover.ender_link.tooltip.list_button")))))); + + column.child(coverUIRow().child(new TextFieldWidget() + .setMaxLength(32) + .widthRel(1f) + .addTooltipLine(IKey.lang(Component.translatable("cover.ender_link.tooltip.channel_description"))) + .value(new StringSyncValue(this::getDescription, this::setDescription)))); + + Flow bottomRow = coverUIRow(); + bottomRow.child(GTMuiWidgets.createPowerButton(this::isWorkingEnabled, this::setWorkingEnabled, syncManager)); + bottomRow.child(GTMuiWidgets.createIOCycleButton(ioSync, false)); + if (getFilterHandler() != null) + GTMuiWidgets.createFilterRow(bottomRow, getFilterHandler(), data, syncManager, settings); + column.child(bottomRow); + } - private ConfirmTextInputWidget createConfirmTextInputWidget(int currentX) { - int GROUP_X = 10; - int textInputWidth = (GROUP_WIDTH - GROUP_X * 2) - currentX - WIDGET_BOARD - 2; - return new ConfirmTextInputWidget(currentX, 0, textInputWidth, WIDGET_BOARD, cover.colorStr, - cover::setChannelName, text -> { - if (text == null || !COLOR_INPUT_PATTERN.matcher(text).matches()) { - return VirtualTank.DEFAULT_COLOR; - } - return text; - }, text -> { - if (text.length() < 8) { - text += "F".repeat(8 - text.length()); - } - return text; - }).setTooltip("cover.ender_fluid_link.tooltip.channel_name"); + protected ParentWidget getChannelStatusRowShort(PanelSyncManager syncManager, VirtualEntry entry, int idx) { + TextWidget str; + if (entry.getDescription().isBlank()) { + str = IKey.lang(Component.translatable("cover.ender_link.description_empty")).asWidget().size(98, 12) + .color(Color.GREY.darker(1)); + } else { + str = IKey.str(entry.getDescription()).asWidget().size(98, 12); } + return coverUIRow() + .child(createColorBlock(entry::getColor, 18).asWidget() + .tooltip(t -> t.addLine(entry.getColorStr())) + .size(18, 18)) + .child(str) + .child(createVirtualEntryWidget(syncManager, entry, 18, 18, idx)) + .child(new ButtonWidget<>().overlay(GTGuiTextures.BUTTON_CROSS).onMousePressed((x, y, button) -> { + MouseData mouseData = MouseData.create(button); + if (mouseData.mouseButton() == 1) { + syncManager.callSyncedAction("deleteEntry", buffer -> { + buffer.writeCharSequence(entry.getColorStr(), StandardCharsets.UTF_8); + }); + return true; + } + return false; + }).align(Alignment.CenterRight)); + } - @Contract(" -> new") - private @NotNull ToggleButtonWidget createWorkingEnabledButton() { - return new ToggleButtonWidget(116, 82, WIDGET_BOARD, WIDGET_BOARD, GuiTextures.BUTTON_POWER, - cover::isWorkingEnabled, cover::setWorkingEnabled); - } + public IDrawable createColorBlock(IntSupplier colorSupplier, int size) { + return IDrawable.of( + // Border + (context, x, y, w, h, widgetTheme) -> new Rectangle().color(Color.BLACK.main) + .draw(context, x, y, size, size, widgetTheme), + // Colored block + (context, x, y, w, h, widgetTheme) -> new Rectangle().color(colorSupplier.getAsInt()) + .draw(context, x + 1, y + 1, size - 2, size - 2, widgetTheme)); + } - private void addEnumSelectorWidgets() { - mainGroup.addWidget(new EnumSelectorWidget<>(146, 82, WIDGET_BOARD, WIDGET_BOARD, List.of(IO.IN, IO.OUT), - cover.io, cover::setIo)); - mainGroup.addWidget(new EnumSelectorWidget<>(146, 107, WIDGET_BOARD, WIDGET_BOARD, ManualIOMode.VALUES, - cover.manualIOMode, cover::setManualIOMode) - .setHoverTooltips("cover.universal.manual_import_export.mode.description")); - } + protected ModularPanel createChannelManagerPanel(GuiData data, PanelSyncManager syncManager, UISettings settings) { + var panel = new Dialog<>("channel_manager") + .setDisablePanelsBelow(false) + .setDraggable(true) + .setCloseOnOutOfBoundsClick(true) + .child(GTMuiWidgets.createTitleBar(getAttachItem(), 176, GTGuiTextures.BACKGROUND)); + + var entries = new GenericListSyncHandler.Builder() + .getter(this::getVirtualEntries) + .adapter(new VirtualEntryAdapter()) + .build(); + syncManager.syncValue("entries", entries); + + DynamicLinkedSyncHandler> dynamicLinkedSyncHandler = new DynamicLinkedSyncHandler<>( + entries) + .widgetProvider((manager, entriesListSyncer) -> { + if (entriesListSyncer == null || entriesListSyncer.getValue() == null) return new EmptyWidget(); + ListWidget list = new ListWidget<>(); + List entryList = entriesListSyncer.getValue(); + for (int i = 0; i < entryList.size(); i++) { + list.child(getChannelStatusRowShort(manager, entryList.get(i), i)); + } + return list.childSeparator(GTGuiTextures.SEPERATOR_SIMPLE.asIcon().size(116, 5).margin(12, 0)) + .size(162, 154); + }); - private void addChannelWidgets(List entries) { - channelsGroup.clearAllWidgets(); - int y = 1; - SelectableWidgetGroup selectedWidget = null; - for (var entry : entries.stream().sorted(Comparator.comparing(VirtualEntry::getColorStr)).toList()) { - SelectableWidgetGroup channelWidget = createChannelWidget(entry, 10, y); - if (cover.getChannelName(entry).equals(cover.getChannelName())) { - selectedWidget = channelWidget; - } - channelsGroup.addWidget(channelWidget); - y += 22; + syncManager.registerServerSyncedAction("deleteEntry", (packet) -> { + var colorString = packet.readCharSequence(8, StandardCharsets.UTF_8).toString(); + VirtualEntry entry = VirtualEnderRegistry.get((ServerLevel) coverHolder.getLevel()).getEntry(getOwner(), + getEntryType(), colorString); + if (entry != null) { + entry.setDescription(""); + VirtualEnderRegistry.get((ServerLevel) coverHolder.getLevel()).tryDeleteEntry(getOwner(), + getEntryType(), colorString); } - channelsGroup.setSelected(selectedWidget); - if (selectedWidget != null) selectedWidget.onSelected(); - channelsGroup.setClientSideWidget(); - } + }); - private @NotNull SelectableWidgetGroup createChannelWidget(@NotNull VirtualEntry entry, int x, int y) { - int currentX = 0; - int MARGIN = 2; - int availableWidth = TOTAL_WIDTH - (BUTTON_SIZE + MARGIN) * 3; - - final MutableBoolean canSelect = new MutableBoolean(false); - var des = entry.getDescription(); - TextBoxWidget textBoxWidget = new TextBoxWidget(BUTTON_SIZE + MARGIN, - !des.isEmpty() ? 0 : 4, availableWidth, List.of(entry.getColorStr())).setCenter(true); - SelectableWidgetGroup channelGroup = new SelectableWidgetGroup(x, y, TOTAL_WIDTH, BUTTON_SIZE) { - - @Override - public boolean allowSelected(double mouseX, double mouseY, int button) { - return canSelect.getValue() && super.allowSelected(mouseX, mouseY, button); - } - }; - channelGroup.setOnSelected(group -> { - if (cover.getChannelName().equals(cover.getChannelName(entry))) return; - writeClientAction(0, buffer -> { - // send new channel name to server - String newChannelColorStr = entry.getColorStr(); - buffer.writeUtf(newChannelColorStr); - }); - playButtonClickSound(); - }).setSelectedTexture(1, -1); - - // Color block - ColorBlockWidget colorBlockWidget = new ColorBlockWidget(currentX, 0, BUTTON_SIZE, BUTTON_SIZE) - .setCurrentColor(VirtualEntry.parseColor(entry.getColorStr())); - channelGroup.addWidget(colorBlockWidget); - currentX += BUTTON_SIZE + MARGIN; - - // Text box - channelGroup.addWidget(textBoxWidget); - currentX += availableWidth + MARGIN; - if (!des.isEmpty()) { - var desText = new TextTexture(ChatFormatting.DARK_GRAY + des).setDropShadow(false); - desText.setType(TextTexture.TextType.ROLL).setRollSpeed(0.7f); - channelGroup.addWidget(new ImageWidget(BUTTON_SIZE + MARGIN, 10, availableWidth, 8, desText)); - } + panel.child(new DynamicSyncedWidget<>() + .syncHandler(dynamicLinkedSyncHandler) + .top(7).margin(7, 0) + .widthRel(1.0f).coverChildrenHeight()); - // Slot - Widget slotWidget = cover.addVirtualEntryWidget(entry, currentX, 0, BUTTON_SIZE, BUTTON_SIZE, false); - channelGroup.addWidget(slotWidget); - currentX += BUTTON_SIZE + MARGIN; - - // Clear Description button - channelGroup.addWidget( - new ButtonWidget(currentX, 0, BUTTON_SIZE, BUTTON_SIZE, GuiTextures.BUTTON_CLEAR_GRID, press -> { - writeClientAction(200, buffer -> buffer.writeUtf(cover.getChannelName(entry))); - requestUpdate(); - }) { - - @Override - public boolean isMouseOverElement(double mouseX, double mouseY) { - var isOver = super.isMouseOverElement(mouseX, mouseY); - if (canSelect.getValue() == isOver) canSelect.setValue(!isOver); - return isOver; - } - }.appendHoverTooltips("cover.ender_fluid_link.tooltip.clear_button")); - - return channelGroup; - } + return panel; + } + + private class VirtualEntryAdapter implements IByteBufAdapter { - private void requestUpdate() { - writeClientAction(100, buffer -> buffer.writeBoolean(showChannels.isTrue())); + @Override + public VirtualEntry deserialize(FriendlyByteBuf buffer) { + VirtualEntry entry = getEntryType().createInstance(); + var nbt = buffer.readNbt(); + if (nbt == null) return entry; + entry.deserializeNBT(nbt); + return entry; } @Override - public void handleClientAction(int id, FriendlyByteBuf buffer) { - super.handleClientAction(id, buffer); - if (id == 0) { - String newChannelColorStr = buffer.readUtf(); - cover.setChannelName(newChannelColorStr); - } else if (id == 100) { - if (!buffer.readBoolean()) return; - var entries = VirtualEnderRegistry.getInstance().getEntryNames(cover.getOwner(), cover.getEntryType()) - .stream().map(name -> VirtualEnderRegistry.getInstance().getEntry(cover.getOwner(), - cover.getEntryType(), name)) - .sorted(Comparator.comparing(VirtualEntry::getColorStr)); - writeUpdateInfo(101, buf -> { - var list = entries.toList(); - buf.writeVarInt(list.size()); - for (var entry : list) { - buf.writeNbt(entry.serializeNBT()); - } - }); - } else if (id == 200) { - String channelName = buffer.readUtf(); - VirtualEnderRegistry.getInstance().getEntry(cover.getOwner(), cover.getEntryType(), channelName) - .setDescription(""); - } + public void serialize(FriendlyByteBuf buffer, VirtualEntry entry) { + buffer.writeNbt(entry.serializeNBT()); } @Override - public void readUpdateInfo(int id, FriendlyByteBuf buffer) { - super.readUpdateInfo(id, buffer); - if (id == 101) { - int size = buffer.readVarInt(); - List entries = new ArrayList<>(); - for (int i = 0; i < size; i++) { - VirtualEntry entry = cover.getEntryType().createInstance(); - entry.deserializeNBT(Objects.requireNonNull(buffer.readNbt())); - entries.add(entry); - } - addChannelWidgets(entries); - } + public boolean areEqual(VirtualEntry t1, VirtualEntry t2) { + return t1.getColor() == t2.getColor() && t1.getDescription().equals(t2.getDescription()); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java index 3ad32ee9b38..2d27688e13d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java @@ -5,25 +5,25 @@ import com.gregtechceu.gtceu.api.cover.filter.FilterHandler; import com.gregtechceu.gtceu.api.cover.filter.FilterHandlers; import com.gregtechceu.gtceu.api.cover.filter.FluidFilter; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.widget.TankWidget; import com.gregtechceu.gtceu.api.misc.virtualregistry.EntryTypes; -import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEnderRegistry; import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEntry; import com.gregtechceu.gtceu.api.misc.virtualregistry.entries.VirtualTank; +import com.gregtechceu.gtceu.api.mui.base.widget.IWidget; +import com.gregtechceu.gtceu.api.mui.value.sync.FluidSlotSyncHandler; +import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; +import com.gregtechceu.gtceu.api.mui.value.sync.SyncHandlers; +import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; +import com.gregtechceu.gtceu.api.mui.widgets.slot.FluidSlot; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.utils.GTTransferUtils; -import com.lowdragmc.lowdraglib.gui.widget.*; - import net.minecraft.core.Direction; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidUtil; import lombok.Getter; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -33,9 +33,7 @@ public class EnderFluidLinkCover extends AbstractEnderLinkCover { public static final int TRANSFER_RATE = 8000; // mB/t - @SaveField - @SyncToClient - protected VirtualTank visualTank; + protected VirtualTank visualTank = new VirtualTank(); @Getter @SaveField @@ -47,8 +45,6 @@ public EnderFluidLinkCover(CoverDefinition definition, ICoverable coverHolder, D super(definition, coverHolder, attachedSide); this.mBLeftToTransferLastSecond = TRANSFER_RATE * 20; filterHandler = FilterHandlers.fluid(this); - if (!isRemote()) setEntry(VirtualEnderRegistry.getInstance() - .getOrCreateEntry(getOwner(), EntryTypes.ENDER_FLUID, getChannelName())); } @Override @@ -72,11 +68,6 @@ protected EntryTypes getEntryType() { return EntryTypes.ENDER_FLUID; } - @Override - protected String identifier() { - return "EFLink#"; - } - @Override protected void transfer() { long timer = coverHolder.getOffsetTimer(); @@ -94,6 +85,19 @@ protected void transfer() { return coverHolder.getFluidHandlerCap(attachedSide, false); } + @Override + protected IWidget createVirtualEntryWidget(PanelSyncManager manager, VirtualEntry entry, int w, int h, int index) { + if (!(entry instanceof VirtualTank tank)) return new ParentWidget<>().size(w, h); + + manager.getOrCreateSyncHandler("ender_link_cover_fluid_slot", index, FluidSlotSyncHandler.class, + () -> SyncHandlers.fluidSlot(tank.getFluidTank())); + + return new FluidSlot() + .syncHandler("ender_link_cover_fluid_slot", index) + .marginLeft(3) + .size(w, h); + } + private int doTransferFluids(int platformTransferLimit) { var ownFluidHandler = getOwnFluidHandler(); @@ -109,20 +113,4 @@ private int doTransferFluids(int platformTransferLimit) { } return 0; } - - ////////////////////////////////////// - // ************ GUI ************ // - ////////////////////////////////////// - - @Override - protected Widget addVirtualEntryWidget(VirtualEntry entry, int x, int y, int width, int height, boolean canClick) { - return new TankWidget(((VirtualTank) entry).getFluidTank(), 0, x, y, width, height, canClick, canClick) - .setBackground(GuiTextures.FLUID_SLOT); - } - - @NotNull - @Override - protected String getUITitle() { - return "cover.ender_fluid_link.title"; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java index 8338b7e0e40..06f98d4d559 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java @@ -5,19 +5,19 @@ import com.gregtechceu.gtceu.api.cover.filter.FilterHandler; import com.gregtechceu.gtceu.api.cover.filter.FilterHandlers; import com.gregtechceu.gtceu.api.cover.filter.ItemFilter; -import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.misc.virtualregistry.EntryTypes; -import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEnderRegistry; import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEntry; import com.gregtechceu.gtceu.api.misc.virtualregistry.entries.VirtualItemStorage; +import com.gregtechceu.gtceu.api.mui.base.widget.IWidget; +import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; +import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; +import com.gregtechceu.gtceu.api.mui.widgets.slot.ItemSlot; +import com.gregtechceu.gtceu.api.mui.widgets.slot.ModularSlot; import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; - import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; import net.minecraftforge.items.IItemHandler; @@ -32,9 +32,7 @@ public class EnderItemLinkCover extends AbstractEnderLinkCover().size(w, h); + manager.getOrCreateSlot("ender_item_link_cover_" + index, 0, + () -> new ModularSlot(itemStorage.getHandler(), 0)); + return new ItemSlot() + .syncHandler("ender_item_link_cover_" + index) + .marginLeft(3) + .size(w, h); } - @Override - protected String getUITitle() { - return "cover.ender_item_link.title"; + public @Nullable IItemHandler getOwnItemHandler() { + return coverHolder.getItemHandlerCap(attachedSide, false); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderRedstoneLinkCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderRedstoneLinkCover.java index d2f3d2c3d6e..bb51d825aa3 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderRedstoneLinkCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderRedstoneLinkCover.java @@ -5,37 +5,27 @@ import com.gregtechceu.gtceu.api.misc.virtualregistry.EntryTypes; import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEntry; import com.gregtechceu.gtceu.api.misc.virtualregistry.entries.VirtualRedstone; +import com.gregtechceu.gtceu.api.mui.base.widget.IWidget; +import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; +import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; -import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; -import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; - -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; import net.minecraft.core.Direction; import lombok.Getter; +import org.jetbrains.annotations.Nullable; -import java.util.UUID; +import java.util.Objects; public class EnderRedstoneLinkCover extends AbstractEnderLinkCover { @Getter protected final SyncDataHolder syncDataHolder = new SyncDataHolder(this); - @SaveField - @SyncToClient - private VirtualRedstone storage; - @SaveField - @SyncToClient - private UUID uuid; + private @Nullable VirtualRedstone storage = new VirtualRedstone(); public EnderRedstoneLinkCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide) { super(definition, coverHolder, attachedSide); - if (!isRemote()) { - uuid = UUID.randomUUID(); - setVirtualEntry(); - } else uuid = null; } @Override @@ -44,20 +34,15 @@ public boolean canAttach() { } @Override - protected String identifier() { - return "ERLink#"; - } - - @Override - protected VirtualRedstone getEntry() { + protected @Nullable VirtualRedstone getEntry() { return storage; } @Override protected void setEntry(VirtualEntry entry) { - if (storage != null) storage.removeMember(uuid); + if (storage != null) storage.removeMember(this); storage = (VirtualRedstone) entry; - storage.addMember(uuid); + storage.addMember(this); syncDataHolder.markClientSyncFieldDirty("storage"); } @@ -69,29 +54,23 @@ protected EntryTypes getEntryType() { @Override protected void transfer() { switch (io) { - case IN -> storage.setSignal(uuid, getSignalInput()); - case OUT -> setRedstoneSignalOutput(storage.getSignal()); + case IN -> Objects.requireNonNull(storage).setSignal(this, getSignalInput()); + case OUT -> setRedstoneSignalOutput(Objects.requireNonNull(storage).getSignal()); } } - @Override - protected Widget addVirtualEntryWidget(VirtualEntry entry, int x, int y, int width, int height, boolean canClick) { - return new WidgetGroup(x, y, width, height); - } - - @Override - protected String getUITitle() { - return "cover.ender_redstone_link.title"; - } - @Override public boolean canConnectRedstone() { return true; } + protected IWidget createVirtualEntryWidget(PanelSyncManager manager, VirtualEntry entry, int w, int h, int index) { + return new ParentWidget<>().size(w, h); + } + @Override public void onRemoved() { - storage.removeMember(uuid); + if (storage != null) storage.removeMember(this); super.onRemoved(); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/package-info.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/package-info.java new file mode 100644 index 00000000000..afd9b5bb2a4 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.common.cover.ender; + +import org.jetbrains.annotations.NotNullByDefault; 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 355a3af0c98..579e06bfadc 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 @@ -9,7 +9,7 @@ import com.gregtechceu.gtceu.api.mui.value.sync.EnumSyncValue; import com.gregtechceu.gtceu.api.mui.value.sync.IntSyncValue; import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; -import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; +import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; @@ -31,7 +31,6 @@ import it.unimi.dsi.fastutil.objects.Object2LongMaps; import lombok.Getter; import lombok.Setter; -import org.jetbrains.annotations.NotNull; import javax.annotation.ParametersAreNonnullByDefault; @@ -116,16 +115,11 @@ private void setTransferBucketMode(BucketMode transferBucketMode) { ////////////////////////////////////// // *********** GUI ***********// - ////////////////////////////////////// @Override - protected @NotNull String getUITitle() { - return "cover.fluid.voiding.advanced.title"; - } - - @Override - public ParentWidget createCoverUI(SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings) { - var column = super.createCoverUI(data, syncManager, settings); + public void createCoverUIRows(Flow column, SidedPosGuiData data, PanelSyncManager syncManager, + UISettings settings) { + super.createCoverUIRows(column, data, syncManager, settings); EnumSyncValue voidingMode = new EnumSyncValue<>(VoidingMode.class, this::getVoidingMode, this::setVoidingMode); @@ -148,8 +142,6 @@ public ParentWidget createCoverUI(SidedPosGuiData data, PanelSyncManager sync GTMuiWidgets .createIntInputWithBucketMode(voidingLimit, bucketModeSync, () -> getVoidingMode().maxStackSize) .setEnabledIf($ -> shouldShowStackSize())); - - return column; } private int getCurrentBucketModeTransferSize() { 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 a03489d4b71..e0bb8705c01 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 @@ -11,7 +11,7 @@ import com.gregtechceu.gtceu.api.mui.value.sync.EnumSyncValue; import com.gregtechceu.gtceu.api.mui.value.sync.IntSyncValue; import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; -import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; +import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.client.mui.screen.UISettings; @@ -125,8 +125,9 @@ public void setVoidingMode(VoidingMode voidingMode) { ////////////////////////////////////// @Override - public ParentWidget createCoverUI(SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings) { - var column = super.createCoverUI(data, syncManager, settings); + public void createCoverUIRows(Flow column, SidedPosGuiData data, PanelSyncManager syncManager, + UISettings settings) { + super.createCoverUIRows(column, data, syncManager, settings); EnumSyncValue voidingMode = new EnumSyncValue<>(VoidingMode.class, this::getVoidingMode, this::setVoidingMode); @@ -144,8 +145,6 @@ public ParentWidget createCoverUI(SidedPosGuiData data, PanelSyncManager sync column.child(GTMuiWidgets.createIntInputWithButtons(voidingLimit, () -> 1, () -> getVoidingMode().maxStackSize) .setEnabledIf($ -> shouldShowStackSize())); - - return column; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/FluidVoidingCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/FluidVoidingCover.java index 555a3a32d1e..2369890bb05 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/FluidVoidingCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/FluidVoidingCover.java @@ -2,12 +2,10 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverDefinition; -import com.gregtechceu.gtceu.api.cover.filter.FluidFilter; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.mui.factory.SidedPosGuiData; import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; -import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.client.mui.screen.UISettings; @@ -32,7 +30,6 @@ import it.unimi.dsi.fastutil.objects.Object2LongMap; import it.unimi.dsi.fastutil.objects.Object2LongMaps; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Set; @@ -89,22 +86,13 @@ void voidAny(IFluidHandlerModifiable fluidHandler) { } @Override - public ParentWidget createCoverUI(SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings) { - Flow column = Flow.column() - .top(7).margin(7, 0) - .widthRel(1.0f).coverChildrenHeight(); + public void createCoverUIRows(Flow column, SidedPosGuiData data, PanelSyncManager syncManager, + UISettings settings) { + var row = coverUIRow() + .child(GTMuiWidgets.createPowerButton(this::isWorkingEnabled, this::setWorkingEnabled, syncManager)); + GTMuiWidgets.createFilterRow(row, filterHandler, data, syncManager, settings); - var filterRow = GTMuiWidgets.createFilterRow(filterHandler, FluidFilter::loadFilter, data, syncManager, - settings); - filterRow.child(0, GTMuiWidgets.createPowerButton(this::isWorkingEnabled, this::setWorkingEnabled, syncManager) - .marginRight(2)); - - return column.child(filterRow); - } - - @NotNull - protected String getUITitle() { - return "cover.fluid.voiding.title"; + column.child(row); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/ItemVoidingCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/ItemVoidingCover.java index 1b737406742..a4bcfdbacbe 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/ItemVoidingCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/ItemVoidingCover.java @@ -8,7 +8,6 @@ import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.mui.factory.SidedPosGuiData; import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; -import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; import com.gregtechceu.gtceu.client.mui.screen.UISettings; import com.gregtechceu.gtceu.common.cover.ConveyorCover; @@ -87,17 +86,13 @@ void voidAny(IItemHandler handler) { ////////////////////////////////////// @Override - public ParentWidget createCoverUI(SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings) { - Flow column = Flow.column() - .top(7).margin(7, 0) - .widthRel(1.0f).coverChildrenHeight(); - - var filterRow = GTMuiWidgets.createFilterRow(filterHandler, ItemFilter::loadFilter, data, syncManager, - settings); - filterRow.child(0, GTMuiWidgets.createPowerButton(this::isWorkingEnabled, this::setWorkingEnabled, syncManager) - .marginRight(2)); - - return column.child(filterRow); + public void createCoverUIRows(Flow column, SidedPosGuiData data, PanelSyncManager syncManager, + UISettings settings) { + column.child(GTMuiWidgets.createFilterRow( + coverUIRow().child( + GTMuiWidgets.createPowerButton(this::isWorkingEnabled, this::setWorkingEnabled, syncManager)), + filterHandler, data, syncManager, + settings)); } @NotNull diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTPlaceholders.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTPlaceholders.java index 45fccd4f5de..3ccc75bc084 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTPlaceholders.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTPlaceholders.java @@ -765,29 +765,11 @@ public MultiLineComponent apply(PlaceholderContext ctx, if (stack.getOrCreateTag().contains("boundPlayerUUID")) owner = UUID.fromString(stack.getOrCreateTag().getString("boundPlayerUUID")); } - VirtualEnderRegistry ender = VirtualEnderRegistry.getInstance(); + VirtualEnderRegistry ender = VirtualEnderRegistry.get((ServerLevel) ctx.level()); switch (type) { case "redstone" -> { - channel = "ERLink#" + channel; if (!ender.hasEntry(owner, EntryTypes.ENDER_REDSTONE, channel)) return MultiLineComponent.literal(0); - if (args.size() > 4) { - if (ctx.itemStackHandler() == null) throw new NotSupportedException(); - int slot = PlaceholderUtils.toInt(args.get(3)); - PlaceholderUtils.checkRange("slot index", 1, ctx.itemStackHandler().getSlots(), slot); - ItemStack stack = ctx.itemStackHandler().getStackInSlot(slot - 1); - UUID uuid; - if (stack.getOrCreateTag().contains("enderRedstoneLinkTransmitterUUID")) { - uuid = stack.getOrCreateTag().getUUID("enderRedstoneLinkTransmitterUUID"); - } else { - uuid = UUID.randomUUID(); - stack.getOrCreateTag().putUUID("enderRedstoneLinkTransmitterUUID", uuid); - } - int power = PlaceholderUtils.toInt(args.get(4)); - PlaceholderUtils.checkRange("redstone signal", 0, 15, power); - ender.getEntry(owner, EntryTypes.ENDER_REDSTONE, channel).setSignal(uuid, power); - return MultiLineComponent.empty(); - } return MultiLineComponent .literal(ender.getEntry(owner, EntryTypes.ENDER_REDSTONE, channel).getSignal()); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java index 7c3cf299f4d..cae185e1b12 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java @@ -13,10 +13,7 @@ import com.gregtechceu.gtceu.api.mui.base.IPanelHandler; import com.gregtechceu.gtceu.api.mui.base.drawable.IDrawable; import com.gregtechceu.gtceu.api.mui.base.drawable.IKey; -import com.gregtechceu.gtceu.api.mui.drawable.DrawableStack; -import com.gregtechceu.gtceu.api.mui.drawable.DynamicDrawable; -import com.gregtechceu.gtceu.api.mui.drawable.ItemDrawable; -import com.gregtechceu.gtceu.api.mui.drawable.UITexture; +import com.gregtechceu.gtceu.api.mui.drawable.*; import com.gregtechceu.gtceu.api.mui.drawable.text.TextRenderer; import com.gregtechceu.gtceu.api.mui.factory.SidedPosGuiData; import com.gregtechceu.gtceu.api.mui.theme.ThemeAPI; @@ -42,6 +39,7 @@ import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.utils.GTMath; import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; @@ -75,13 +73,16 @@ public static Flow createTitleBar(MachineDefinition definition, int panelWidth, } public static Flow createTitleBar(ItemStack stack, int panelWidth, UITexture background) { - String machineName = stack.getHoverName().getString(); - machineName = machineName.replaceAll("§.", "").trim(); + var name = stack.getHoverName().getString(); + name = name.replaceAll("§.", "").trim(); + return createTitleBar(new ItemDrawable(stack).asIcon(), name, panelWidth, background); + } + public static Flow createTitleBar(Icon icon, String text, int panelWidth, UITexture background) { int borderRadius = 5; int iconSize = 16; int minPanelWidth = (int) (panelWidth * 0.9f) - (iconSize + (borderRadius * 3)); - int textTitleWidth = TextRenderer.getFont().width(machineName); + int textTitleWidth = TextRenderer.getFont().width(text); int textRows = (int) Math.ceil((double) textTitleWidth / minPanelWidth); int textHeightPerRow = (int) (IKey.renderer.getFontHeight()); @@ -97,11 +98,10 @@ public static Flow createTitleBar(ItemStack stack, int panelWidth, UITexture bac .top(-(textHeight + borderRadius)) .horizontalCenter() .background(background.getSubArea(0f, 0f, 1.0f, 0.75f)) - .child(new ItemDrawable(stack) - .asIcon().size(iconSize) + .child(icon.size(iconSize) .asWidget() .marginLeft(borderRadius)) - .child(IKey.str(machineName) + .child(IKey.str(text) .asWidget() .margin(borderRadius, borderRadius, borderRadius, 1) .size(Math.min(minPanelWidth, textTitleWidth), textHeight)); @@ -364,10 +364,15 @@ public static ParentWidget createXEIWidget(GTRecipeTypeUILayout layout) { } public static CycleButtonWidget createIOCycleButton(EnumSyncValue syncValue, boolean allowExtendedIO) { + // Done so the cycle button doesn't create states for every IO enum entry + + IntSyncValue syncVal = new IntSyncValue(syncValue::getIntValue, syncValue::setIntValue); + var cycleButton = new CycleButtonWidget() .stateCount(allowExtendedIO ? 4 : 2) .stateOverlay(IO.IN, IO.IN.getUiTexture()) .stateOverlay(IO.OUT, IO.OUT.getUiTexture()) + .value(syncVal) .tooltipBuilder( r -> r.addLine(IKey.dynamic(() -> Component.translatable(syncValue.getValue().getTooltip())))); @@ -379,22 +384,22 @@ public static CycleButtonWidget createIOCycleButton(EnumSyncValue syncValue, return cycleButton; } - public static > ParentWidget createFilterRow(FilterHandler filterHandler, - Function filterLoader, + public static > ParentWidget createFilterRow(ParentWidget 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) -> filterLoader.apply(filterSlot.getStackInSlot(0)).getPanel(data, sm, settings)); + (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 = filterLoader.apply(stack); + S filter = filterHandler.loadFilter(stack); return new ButtonWidget<>() .onMousePressed((x, y, b) -> { @@ -402,20 +407,19 @@ public static > ParentWidget createFilterRow(Filter return true; }); }); - - return Flow.row() - .coverChildrenHeight() - .child(new ItemSlot() - .slot(new ModularSlot(filterSlot, 0) - .changeListener((stack, amount, client, init) -> { - filterButton.notifyUpdate(packet -> packet.writeItem(stack)); - })) - .marginLeft(2)) + 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)); } - private static int getIncrementValue(MouseData data) { - return getIncrementValue(data, 1); + public static > ParentWidget createFilterRow(FilterHandler filterHandler, + SidedPosGuiData data, + PanelSyncManager syncManager, + UISettings settings) { + return createFilterRow(Flow.row().coverChildrenHeight().childPadding(2), filterHandler, data, syncManager, + settings); } private static int getIncrementValue(MouseData data, int step) { @@ -426,11 +430,19 @@ private static int getIncrementValue(MouseData data, int step) { return adjust; } + private static long getIncrementValue(MouseData data, long step) { + long adjust = step; + if (data.shift()) adjust *= 4; + if (data.ctrl()) adjust *= 16; + if (data.alt()) adjust *= 64; + return adjust; + } + private static IKey createAdjustOverlay(boolean increment) { return createAdjustOverlay(increment, 1); } - private static IKey createAdjustOverlay(boolean increment, int step) { + private static IKey createAdjustOverlay(boolean increment, long step) { final StringBuilder builder = new StringBuilder(); builder.append(increment ? '+' : '-'); builder.append(getIncrementValue(MouseData.create(-1), step)); @@ -453,16 +465,6 @@ public static ParentWidget createIntInputWithButtons(IntSyncValue syncValue, return createIntInputWithButtons(syncValue, minValue, maxValue, 1, GTGuiTextures.DISPLAY); } - public static ParentWidget createIntInputWithButtons(IntSyncValue syncValue, IntSupplier minValue, - IntSupplier maxValue, int step) { - return createIntInputWithButtons(syncValue, minValue, maxValue, step, GTGuiTextures.DISPLAY); - } - - public static ParentWidget createIntInputWithButtons(IntSyncValue syncValue, IntSupplier minValue, - IntSupplier maxValue, IDrawable background) { - return createIntInputWithButtons(syncValue, minValue, maxValue, 1, background); - } - public static ParentWidget createIntInputWithButtons(IntSyncValue syncValue, IntSupplier minValue, IntSupplier maxValue, int step, IDrawable background) { StringSyncValue formattedValue = new StringSyncValue(syncValue::getStringValue, @@ -470,10 +472,9 @@ public static ParentWidget createIntInputWithButtons(IntSyncValue syncValue, return Flow.row() .coverChildrenHeight() - .marginBottom(2) .widthRel(1.0f) .child(new ButtonWidget<>() - .left(0).width(18) + .width(18) .onMousePressed((x, y, button) -> { int val = syncValue.getIntValue() - getIncrementValue(MouseData.create(button), step); val = Mth.clamp(val, minValue.getAsInt(), maxValue.getAsInt()); @@ -487,7 +488,7 @@ public static ParentWidget createIntInputWithButtons(IntSyncValue syncValue, .setTextColor(Color.WHITE.darker(1)) .setNumbers(minValue, maxValue) .onMouseScrolled((mouseX, mouseY, delta) -> { - int inc = (int) delta * getIncrementValue(MouseData.create(-1)); + int inc = (int) delta * getIncrementValue(MouseData.create(-1), 1); int val = Mth.clamp(syncValue.getIntValue() + inc, minValue.getAsInt(), maxValue.getAsInt()); syncValue.setIntValue(val, true, true); @@ -496,7 +497,7 @@ public static ParentWidget createIntInputWithButtons(IntSyncValue syncValue, .value(formattedValue) .background(background)) .child(new ButtonWidget<>() - .right(0).width(18) + .width(18).right(0) .onMousePressed((x, y, button) -> { int val = syncValue.getIntValue() + getIncrementValue(MouseData.create(button), step); val = Mth.clamp(val, minValue.getAsInt(), maxValue.getAsInt()); @@ -506,6 +507,56 @@ public static ParentWidget createIntInputWithButtons(IntSyncValue syncValue, .onUpdateListener(w -> w.overlay(createAdjustOverlay(true, step)))); } + public static ParentWidget createLongInputWithButtons(LongSyncValue syncValue, LongSupplier minValue, + LongSupplier maxValue) { + return createLongInputWithButtons(syncValue, minValue, maxValue, 1, GTGuiTextures.DISPLAY); + } + + public static ParentWidget createLongInputWithButtons(LongSyncValue syncValue, LongSupplier minValue, + LongSupplier maxValue, long step, IDrawable background) { + StringSyncValue formattedValue = new StringSyncValue(syncValue::getStringValue, + syncValue::setStringValue); + + return Flow.row() + .coverChildrenHeight() + .widthRel(1.0f) + .child(new ButtonWidget<>() + .width(18) + .onMousePressed((x, y, button) -> { + long value = syncValue.getLongValue() - getIncrementValue(MouseData.create(button), step); + syncValue.setLongValue(GTMath.clamp(value, minValue.getAsLong(), maxValue.getAsLong()), + true, true); + return true; + }) + .onUpdateListener(w -> w.overlay(createAdjustOverlay(false, step)))) + .child(new TextFieldWidget() + .left(18).right(18) + .setTextAlignment(Alignment.Center) + .setTextColor(Color.WHITE.darker(1)) + .setNumbersLong(minValue, maxValue) + .onMouseScrolled((mouseX, mouseY, delta) -> { + long inc = (long) delta * getIncrementValue(MouseData.create(-1), 1); + long min = minValue.getAsLong(); + long max = maxValue.getAsLong(); + long value = syncValue.getLongValue() + inc; + syncValue.setLongValue(GTMath.clamp(value, minValue.getAsLong(), maxValue.getAsLong()), + true, true); + return true; + }) + .value(formattedValue) + .background(background)) + .child(new ButtonWidget<>() + .width(18).right(0) + .onMousePressed((x, y, button) -> { + long value = syncValue.getLongValue() + getIncrementValue(MouseData.create(button), step); + long min = minValue.getAsLong(); + long max = maxValue.getAsLong(); + syncValue.setLongValue(value < min ? min : Math.min(value, max), true, true); + return true; + }) + .onUpdateListener(w -> w.overlay(createAdjustOverlay(true, step)))); + } + public static ParentWidget createIntInputWithBucketMode(IntSyncValue intSyncValue, EnumSyncValue bucketModeSyncValue, IntSupplier maxMB) { @@ -516,12 +567,11 @@ public static ParentWidget createIntInputWithBucketMode(IntSyncValue intSyncV return Flow.row() .coverChildrenHeight() - .marginBottom(2) .widthRel(1.0f) .child(new ButtonWidget<>() .width(18) .onMousePressed((x, y, button) -> { - int val = intSyncValue.getIntValue() - (getIncrementValue(MouseData.create(button)) * + int val = intSyncValue.getIntValue() - (getIncrementValue(MouseData.create(button), 1) * bucketModeSyncValue.getValue().multiplier); val = Mth.clamp(val, 0, maxMB.getAsInt()); intSyncValue.setIntValue(val, true, true); @@ -534,7 +584,7 @@ public static ParentWidget createIntInputWithBucketMode(IntSyncValue intSyncV .setTextColor(Color.WHITE.darker(1)) .setNumbers(0, maxMB.getAsInt()) .onMouseScrolled((mouseX, mouseY, delta) -> { - int inc = (int) delta * (getIncrementValue(MouseData.create(-1)) * + int inc = (int) delta * (getIncrementValue(MouseData.create(-1), 1) * bucketModeSyncValue.getValue().multiplier); int val = Mth.clamp(intSyncValue.getIntValue() + inc, 0, maxMB.getAsInt()); intSyncValue.setIntValue(val, true, true); @@ -546,7 +596,7 @@ public static ParentWidget createIntInputWithBucketMode(IntSyncValue intSyncV .right(18) .width(18) .onMousePressed((x, y, button) -> { - int val = intSyncValue.getIntValue() + (getIncrementValue(MouseData.create(button)) * + int val = intSyncValue.getIntValue() + (getIncrementValue(MouseData.create(button), 1) * bucketModeSyncValue.getValue().multiplier); val = Mth.clamp(val, 0, maxMB.getAsInt()); intSyncValue.setIntValue(val, true, true); @@ -611,7 +661,7 @@ private BoolValue.Dynamic boolValueOf(EnumSyncValue syncValue, T value) { } public Flow build() { - var row = Flow.row().marginBottom(2).coverChildrenHeight().widthRel(1f); + var row = Flow.row().coverChildrenHeight().widthRel(1f); if (this.enumValue != null && this.syncValue != null) { for (var enumVal : enumValue.getEnumConstants()) { var button = new ToggleButton().size(18).marginRight(2) 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 36588fefcf2..409963a09f1 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/mui/GTGuiTextures.java +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/GTGuiTextures.java @@ -766,6 +766,12 @@ public static class IDs { GuiAxis.X, true, 32, 28, 4); + public static final UITexture SEPERATOR_SIMPLE = UITexture.builder() + .location(GTCEu.MOD_ID, "textures/gui/icon/seperator/seperator_simple.png") + .imageSize(16, 5) + .adaptable(2) + .build(); + // MISC public static void init() {/**/} diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index ee5c1940c35..93791ddd643 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -25,8 +25,6 @@ public static void init() { } } - void myMethod() {} - @Configurable.ValueUpdateCallback(method = "myMethod") @Configurable public RecipeConfigs recipes = new RecipeConfigs(); 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 90f303406be..178ab519dfb 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -473,6 +473,7 @@ public static void init(RegistrateLangProvider provider) { "§eInverted§r - in this mode, the cover will require a signal stronger than the set redstone level to run"); multilineLang(provider, "cover.machine_controller.invert.disabled", "§eNormal§r - in this mode, the cover will require a signal weaker than the set redstone level to run"); + provider.add("cover.machine_controller.control", "Controller Target"); provider.add("cover.machine_controller.redstone", "Min Redstone Strength: %d"); provider.add("cover.machine_controller.suspend_powerfail", "Prevent Power Failing:"); provider.add("cover.machine_controller.mode.machine", "Control Machine"); @@ -483,20 +484,23 @@ public static void init(RegistrateLangProvider provider) { 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.mode.null", "Control Nothing"); + + provider.add("cover.ender_link.tooltip.channel_description", "Channel description"); + provider.add("cover.ender_link.tooltip.channel_name", "Channel ID (32-bit hexadecimal value)"); + provider.add("cover.ender_link.description_empty", "Empty Description"); + provider.add("cover.ender_link.tooltip.list_button", "Show channel list"); + provider.add("cover.ender_link.tooltip.clear_button", "Clear channel description"); + + provider.add("cover.ender_link.public.tooltip", "Public mode: Accessible to all players"); + provider.add("cover.ender_link.protected.tooltip", "Protected Mode: Accessible to players on the same team."); + provider.add("cover.ender_link.private.tooltip", + "Private mode: Only accessible to the player who placed this cover"); + provider.add("cover.ender_fluid_link.title", "Ender Fluid Link"); provider.add("cover.ender_item_link.title", "Ender Item Link"); provider.add("cover.ender_redstone_link.title", "Ender Redstone Link"); provider.add("cover.ender_fluid_link.iomode.enabled", "I/O Enabled"); provider.add("cover.ender_fluid_link.iomode.disabled", "I/O Disabled"); - provider.add("cover.ender_fluid_link.tooltip.channel_description", "Set channel description with input text"); - provider.add("cover.ender_fluid_link.tooltip.channel_name", "Set channel name with input text"); - provider.add("cover.ender_fluid_link.tooltip.list_button", "Show channel list"); - provider.add("cover.ender_fluid_link.tooltip.clear_button", "Clear channel description"); - multilineLang(provider, "cover.ender_fluid_link.private.tooltip.disabled", - "Switch to private tank mode\nPrivate mode uses the player who originally placed the cover"); - provider.add("cover.ender_fluid_link.private.tooltip.enabled", "Switch to public tank mode"); - multilineLang(provider, "cover.ender_fluid_link.incomplete_hex", - "Inputted color is incomplete!\nIt will be applied once complete (all 8 hex digits)\nClosing the gui will lose edits!"); provider.add("cover.detector_base.message_normal_state", "Monitoring Status: Normal"); provider.add("cover.detector_base.message_inverted_state", "Monitoring Status: Inverted"); diff --git a/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java b/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java index 1ca08658069..a5cd02424bb 100644 --- a/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java @@ -19,7 +19,6 @@ import com.gregtechceu.gtceu.api.item.armor.ArmorComponentItem; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEnderRegistry; import com.gregtechceu.gtceu.api.mui.theme.ThemeManager; import com.gregtechceu.gtceu.api.pattern.MultiblockWorldSavedData; import com.gregtechceu.gtceu.api.registry.GTRegistries; @@ -297,7 +296,6 @@ public static void serverStarting(ServerStartingEvent event) { @SubscribeEvent public static void serverStopped(ServerStoppedEvent event) { ServerCache.instance.clear(); - VirtualEnderRegistry.release(); } @SubscribeEvent diff --git a/src/main/resources/assets/gtceu/textures/gui/icon/seperator/seperator_simple.png b/src/main/resources/assets/gtceu/textures/gui/icon/seperator/seperator_simple.png new file mode 100644 index 00000000000..2b3163a346d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/gui/icon/seperator/seperator_simple.png differ