diff --git a/dependencies.gradle b/dependencies.gradle index 362fa2e10..9390accc0 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -77,7 +77,7 @@ dependencies { modImplementation("curse.maven:ars-meteorites-1278083:7125271") modImplementation("curse.maven:glodium-957920:5006780") - modImplementation("curse.maven:ex-pattern-provider-892005:7248944") + modImplementation("curse.maven:ex-pattern-provider-892005:7594207") modImplementation("curse.maven:merequester-688367:5689932") @@ -86,7 +86,10 @@ dependencies { modImplementation("curse.maven:deeperdarker-659011:5906086") - modImplementation("curse.maven:modernfix-790626:6719008") + modImplementation("curse.maven:modernfix-790626:7515215") + + modCompileOnly("curse.maven:moremorelang-1444917:7565351") + modRuntimeOnly("curse.maven:moremorelang-1444917:7565351") modImplementation("curse.maven:render-blender-1346485:7035162") diff --git a/libs/appliedenergistics2-forge-15.5.0.jar b/libs/appliedenergistics2-forge-15.5.0.jar index 4b6fa0933..ebbe2cec9 100644 Binary files a/libs/appliedenergistics2-forge-15.5.0.jar and b/libs/appliedenergistics2-forge-15.5.0.jar differ diff --git a/libs/gtceu-1.20.1-1.8.0.jar b/libs/gtceu-1.20.1-1.8.0.jar index 321a01bcb..a8b6f8eae 100644 Binary files a/libs/gtceu-1.20.1-1.8.0.jar and b/libs/gtceu-1.20.1-1.8.0.jar differ diff --git a/libs/gtolib-1.0.jar b/libs/gtolib-1.0.jar index 2c63fa4dc..ccc30fe26 100644 Binary files a/libs/gtolib-1.0.jar and b/libs/gtolib-1.0.jar differ diff --git a/src/generated/resources/assets/gtocore/lang/en_ud.json b/src/generated/resources/assets/gtocore/lang/en_ud.json index 69fe64f37..ca81d858d 100644 --- a/src/generated/resources/assets/gtocore/lang/en_ud.json +++ b/src/generated/resources/assets/gtocore/lang/en_ud.json @@ -9,6 +9,7 @@ "affix.apotheosis:kinetic.suffix": "ɹǝʇsɐW ɯnʇuǝɯoW ǝɥʇ", "affix.apotheosis:stress": "ssǝɹʇS", "affix.apotheosis:stress.suffix": "ɹǝʞɐǝɹqʞuıɹᗺ ǝɥʇ", + "affix.gtocore.bedrock_mine_restore.at_most.desc": ")%s%% ʇsoɯ ʇⱯ(", "affix.gtocore.bedrock_mine_restore.desc": "ʞunɥɔ ʇuǝɹɹnɔ ǝɥʇ uı ǝʌɹǝsǝɹ ǝbɐɹǝʌɐ ǝɥʇ ɟo ‰%s oʇ ʇuǝןɐʌınbǝ ǝʌɹǝsǝɹ uıǝʌ ǝɹo ʞɔoɹpǝq ןɐuoıʇıppɐ uɐ ǝɹoןdxǝ uɐɔ noʎ 'ǝɹo ǝuıɯ noʎ ǝɯıʇ ɥɔɐƎ", "affix.gtocore.bedrock_mine_restore.fluid.desc": "ʞunɥɔ ʇuǝɹɹnɔ ǝɥʇ uı ǝʌɹǝsǝɹ ǝbɐɹǝʌɐ ǝɥʇ ɟo ‰%s oʇ ʇuǝןɐʌınbǝ ǝʌɹǝsǝɹ uıǝʌ pınןɟ ʞɔoɹpǝq ןɐuoıʇıppɐ uɐ ǝɹoןdxǝ uɐɔ noʎ 'ǝɹo ǝuıɯ noʎ ǝɯıʇ ɥɔɐƎ", "affix.gtocore.ftb_ultimine.desc": "%s%% ʎq uıɐɥɔ ɐ uı pǝuıɯ ǝq uɐɔ ʇɐɥʇ sʞɔoןq ɟo ɹǝqɯnu ɯnɯıxɐɯ ǝɥʇ sǝsɐǝɹɔuı ןooʇ sıɥ⟘", @@ -234,8 +235,8 @@ "block.gtocore.compound_extreme_cooling_unit": "ʇıu∩ buıןooƆ ǝɯǝɹʇxƎ punodɯoƆ", "block.gtocore.comprehensive_tombarthite_processing_facility": "ʎʇıןıɔɐℲ buıssǝɔoɹԀ ǝʇıɥʇɹɐqɯo⟘ ǝʌısuǝɥǝɹdɯoƆ", "block.gtocore.compressed_fusion_coil": "ןıoƆ uoısnℲ pǝssǝɹdɯoƆ", - "block.gtocore.compressed_fusion_coil_mk2": "ᄅʞW ןıoƆ uoısnℲ pǝssǝɹdɯoƆ", - "block.gtocore.compressed_fusion_coil_mk2_prototype": "ǝdʎʇoʇoɹԀ ᄅʞW ןıoƆ uoısnℲ pǝssǝɹdɯoƆ", + "block.gtocore.compressed_fusion_coil_mk2": "II ʞW ןıoƆ uoısnℲ pǝssǝɹdɯoƆ", + "block.gtocore.compressed_fusion_coil_mk2_prototype": "ǝdʎʇoʇoɹԀ II ʞW ןıoƆ uoısnℲ pǝssǝɹdɯoƆ", "block.gtocore.compressor_controller_casing": "buısɐƆ ɹǝןןoɹʇuoƆ ɹossǝɹdɯoƆ", "block.gtocore.compressor_pipe_casing": "buısɐƆ ǝdıԀ ɹossǝɹdɯoƆ", "block.gtocore.containment_field_generator": "ɹoʇɐɹǝuǝ⅁ pןǝıℲ ʇuǝɯuıɐʇuoƆ", @@ -302,9 +303,9 @@ "block.gtocore.enderium_borosilicate_glass": "ssɐן⅁ ǝʇɐɔıןısoɹoᗺ ɯnıɹǝpuƎ", "block.gtocore.energetic_photovoltaic_block": "ʞɔoןᗺ ɔıɐʇןoʌoʇoɥԀ ɔıʇǝbɹǝuƎ", "block.gtocore.energetic_photovoltaic_power_station": "uoıʇɐʇS ɹǝʍoԀ ɔıɐʇןoʌoʇoɥԀ ɔıʇǝbɹǝuƎ", - "block.gtocore.energy_control_casing_mk1": "ƖʞW buısɐƆ ןoɹʇuoƆ ʎbɹǝuƎ", - "block.gtocore.energy_control_casing_mk2": "ᄅʞW buısɐƆ ןoɹʇuoƆ ʎbɹǝuƎ", - "block.gtocore.energy_control_casing_mk3": "ƐʞW buısɐƆ ןoɹʇuoƆ ʎbɹǝuƎ", + "block.gtocore.energy_control_casing_mk1": "I ʞW buısɐƆ ןoɹʇuoƆ ʎbɹǝuƎ", + "block.gtocore.energy_control_casing_mk2": "II ʞW buısɐƆ ןoɹʇuoƆ ʎbɹǝuƎ", + "block.gtocore.energy_control_casing_mk3": "III ʞW buısɐƆ ןoɹʇuoƆ ʎbɹǝuƎ", "block.gtocore.energy_injector": "ɹoʇɔǝظuI ʎbɹǝuƎ", "block.gtocore.engineering_mechanical_casing": "buısɐƆ ןɐɔıuɐɥɔǝW buıɹǝǝuıbuƎ", "block.gtocore.engraving_laser_plant": "ʇuɐןԀ ɹǝsɐꞀ buıʌɐɹbuƎ", @@ -369,9 +370,9 @@ "block.gtocore.force_field_glass": "ssɐן⅁ pןǝıℲ ǝɔɹoℲ", "block.gtocore.fuel_cell_generator": "ɹoʇɐɹǝuǝ⅁ ןןǝƆ ןǝnℲ", "block.gtocore.fuel_refining_complex": "xǝןdɯoƆ buıuıɟǝᴚ ןǝnℲ", - "block.gtocore.fusion_casing_mk4": "ㄣʞW buısɐƆ uoısnℲ", - "block.gtocore.fusion_casing_mk5": "ϛʞW buısɐƆ uoısnℲ", - "block.gtocore.fusion_coil_mk2": "ᄅʞW ןıoƆ uoısnℲ", + "block.gtocore.fusion_casing_mk4": "ΛI ʞW buısɐƆ uoısnℲ", + "block.gtocore.fusion_casing_mk5": "Λ ʞW buısɐƆ uoısnℲ", + "block.gtocore.fusion_coil_mk2": "II ʞW ןıoƆ uoısnℲ", "block.gtocore.gaiasteel_casing": "buısɐƆ ןǝǝʇsɐıɐ⅁", "block.gtocore.ganymede_grunt": "ʇunɹ⅁ ǝpǝɯʎuɐ⅁", "block.gtocore.ganymede_stone": "ǝuoʇS ǝpǝɯʎuɐ⅁", @@ -739,9 +740,9 @@ "block.gtocore.machine_access_terminal": "ןɐuıɯɹǝ⟘ ssǝɔɔⱯ ǝuıɥɔɐW", "block.gtocore.machine_casing_circuit_assembly_line": "ǝuıꞀ ʎןqɯǝssⱯ ʇınɔɹıƆ buısɐƆ ǝuıɥɔɐW", "block.gtocore.machine_casing_grinding_head": "pɐǝH buıpuıɹ⅁ buısɐƆ ǝuıɥɔɐW", - "block.gtocore.machining_control_casing_mk1": "ƖʞW buısɐƆ ןoɹʇuoƆ buıuıɥɔɐW", - "block.gtocore.machining_control_casing_mk2": "ᄅʞW buısɐƆ ןoɹʇuoƆ buıuıɥɔɐW", - "block.gtocore.machining_control_casing_mk3": "ƐʞW buısɐƆ ןoɹʇuoƆ buıuıɥɔɐW", + "block.gtocore.machining_control_casing_mk1": "I ʞW buısɐƆ ןoɹʇuoƆ buıuıɥɔɐW", + "block.gtocore.machining_control_casing_mk2": "II ʞW buısɐƆ ןoɹʇuoƆ buıuıɥɔɐW", + "block.gtocore.machining_control_casing_mk3": "III ʞW buısɐƆ ןoɹʇuoƆ buıuıɥɔɐW", "block.gtocore.magic_core": "ǝɹoƆ ɔıbɐW", "block.gtocore.magnesium_oxide_ceramic_high_temperature_insulation_mechanical_block": "ʞɔoןᗺ ןɐɔıuɐɥɔǝW uoıʇɐןnsuI ǝɹnʇɐɹǝdɯǝ⟘ ɥbıH ɔıɯɐɹǝƆ ǝpıxO ɯnısǝubɐW", "block.gtocore.magnetic_confinement_dimensionality_shock_device": "ǝɔıʌǝᗡ ʞɔoɥS ʎʇıןɐuoısuǝɯıᗡ ʇuǝɯǝuıɟuoƆ ɔıʇǝubɐW", @@ -818,7 +819,6 @@ "block.gtocore.me_mana_amplifier_hatch": "ɥɔʇɐH ɹǝıɟıןdɯⱯ ɐuɐW ǝW", "block.gtocore.me_mana_interface": "ǝɔɐɟɹǝʇuI ɐuɐW ǝW", "block.gtocore.me_muffler_hatch": "ɥɔʇɐH ɹǝןɟɟnW ƎW", - "block.gtocore.me_pattern_content_sort_machine": "ǝuıɥɔɐW ʇɹoS ʇuǝʇuoƆ uɹǝʇʇɐԀ ǝW", "block.gtocore.me_simple_pattern_buffer": "ɹǝɟɟnᗺ uɹǝʇʇɐԀ ǝןdɯıS ƎW", "block.gtocore.me_storage": "ǝbɐɹoʇS ƎW", "block.gtocore.me_storage_access_hatch": "ɥɔʇɐH ssǝɔɔⱯ ǝbɐɹoʇS ƎW", @@ -1083,11 +1083,11 @@ "block.gtocore.space_elevator_mechanical_casing": "buısɐƆ ןɐɔıuɐɥɔǝW ɹoʇɐʌǝןƎ ǝɔɐdS", "block.gtocore.space_elevator_module_base": "ǝsɐᗺ ǝןnpoW ɹoʇɐʌǝןƎ ǝɔɐdS", "block.gtocore.space_elevator_power_core": "ǝɹoƆ ɹǝʍoԀ ɹoʇɐʌǝןƎ ǝɔɐdS", - "block.gtocore.space_elevator_power_module_1": "Ɩ ǝןnpoW ɹǝʍoԀ ɹoʇɐʌǝןƎ ǝɔɐdS", - "block.gtocore.space_elevator_power_module_2": "ᄅ ǝןnpoW ɹǝʍoԀ ɹoʇɐʌǝןƎ ǝɔɐdS", - "block.gtocore.space_elevator_power_module_3": "Ɛ ǝןnpoW ɹǝʍoԀ ɹoʇɐʌǝןƎ ǝɔɐdS", - "block.gtocore.space_elevator_power_module_4": "ㄣ ǝןnpoW ɹǝʍoԀ ɹoʇɐʌǝןƎ ǝɔɐdS", - "block.gtocore.space_elevator_power_module_5": "ϛ ǝןnpoW ɹǝʍoԀ ɹoʇɐʌǝןƎ ǝɔɐdS", + "block.gtocore.space_elevator_power_module_1": "I ʞW ǝןnpoW ɹǝʍoԀ ɹoʇɐʌǝןƎ ǝɔɐdS", + "block.gtocore.space_elevator_power_module_2": "II ʞW ǝןnpoW ɹǝʍoԀ ɹoʇɐʌǝןƎ ǝɔɐdS", + "block.gtocore.space_elevator_power_module_3": "III ʞW ǝןnpoW ɹǝʍoԀ ɹoʇɐʌǝןƎ ǝɔɐdS", + "block.gtocore.space_elevator_power_module_4": "ΛI ʞW ǝןnpoW ɹǝʍoԀ ɹoʇɐʌǝןƎ ǝɔɐdS", + "block.gtocore.space_elevator_power_module_5": "Λ ʞW ǝןnpoW ɹǝʍoԀ ɹoʇɐʌǝןƎ ǝɔɐdS", "block.gtocore.space_elevator_support": "ʇɹoddnS ɹoʇɐʌǝןƎ ǝɔɐdS", "block.gtocore.space_engine_nozzle": "ǝןzzoN ǝuıbuƎ ǝɔɐdS", "block.gtocore.space_probe_surface_reception": "uoıʇdǝɔǝᴚ ǝɔɐɟɹnS ǝqoɹԀ ǝɔɐdS", @@ -1119,18 +1119,18 @@ "block.gtocore.stable_base_casing": "buısɐƆ ǝsɐᗺ ǝןqɐʇS", "block.gtocore.stainless_evaporation_casing": "buısɐƆ uoıʇɐɹodɐʌƎ ssǝןuıɐʇS", "block.gtocore.stainless_steel_corrosion_resistant_casing": "buısɐƆ ʇuɐʇsısǝᴚ uoısoɹɹoƆ ןǝǝʇS ssǝןuıɐʇS", - "block.gtocore.star_stone_1": "Ⅰ ǝuoʇS ɹɐʇS", - "block.gtocore.star_stone_10": "Ⅹ ǝuoʇS ɹɐʇS", - "block.gtocore.star_stone_11": "Ⅺ ǝuoʇS ɹɐʇS", - "block.gtocore.star_stone_12": "Ⅻ ǝuoʇS ɹɐʇS", - "block.gtocore.star_stone_2": "Ⅱ ǝuoʇS ɹɐʇS", - "block.gtocore.star_stone_3": "Ⅲ ǝuoʇS ɹɐʇS", - "block.gtocore.star_stone_4": "Ⅳ ǝuoʇS ɹɐʇS", - "block.gtocore.star_stone_5": "Ⅴ ǝuoʇS ɹɐʇS", - "block.gtocore.star_stone_6": "Ⅵ ǝuoʇS ɹɐʇS", - "block.gtocore.star_stone_7": "Ⅶ ǝuoʇS ɹɐʇS", - "block.gtocore.star_stone_8": "Ⅷ ǝuoʇS ɹɐʇS", - "block.gtocore.star_stone_9": "Ⅸ ǝuoʇS ɹɐʇS", + "block.gtocore.star_stone_1": "I ǝuoʇS ɹɐʇS", + "block.gtocore.star_stone_10": "X ǝuoʇS ɹɐʇS", + "block.gtocore.star_stone_11": "IX ǝuoʇS ɹɐʇS", + "block.gtocore.star_stone_12": "IIX ǝuoʇS ɹɐʇS", + "block.gtocore.star_stone_2": "II ǝuoʇS ɹɐʇS", + "block.gtocore.star_stone_3": "III ǝuoʇS ɹɐʇS", + "block.gtocore.star_stone_4": "ΛI ǝuoʇS ɹɐʇS", + "block.gtocore.star_stone_5": "Λ ǝuoʇS ɹɐʇS", + "block.gtocore.star_stone_6": "IΛ ǝuoʇS ɹɐʇS", + "block.gtocore.star_stone_7": "IIΛ ǝuoʇS ɹɐʇS", + "block.gtocore.star_stone_8": "IIIΛ ǝuoʇS ɹɐʇS", + "block.gtocore.star_stone_9": "XI ǝuoʇS ɹɐʇS", "block.gtocore.star_ultimate_material_forge_factory": "ʎɹoʇɔɐℲ ǝbɹoℲ ןɐıɹǝʇɐW ǝʇɐɯıʇן∩ ɹɐʇS", "block.gtocore.starmetal_coil_block": "ʞɔoןᗺ ןıoƆ ןɐʇǝɯɹɐʇS", "block.gtocore.steam_assembly_block": "ʞɔoןᗺ ʎןqɯǝssⱯ ɯɐǝʇS", @@ -1624,23 +1624,29 @@ "config.gtocore.option.blinkRange": ")sʞɔoןq( ǝbuɐᴚ ʞuıןᗺ buıןןǝʌɐɹ⟘ ɟo ɟɟɐʇS", "config.gtocore.option.blockRange": ")sʞɔoןq( ǝbuɐᴚ ʞɔoןᗺ ɹoɥɔuⱯ ןǝʌɐɹ⟘", "config.gtocore.option.breakBlocksBlackList": "ʇsıןʞɔɐןᗺ buıuıW uıɐɥƆ", + "config.gtocore.option.cacheResources": "dnʇɹɐʇS uo sǝɔɹnosǝᴚ ǝɥɔɐƆ", "config.gtocore.option.cannibalismDamage": "ǝbɐɯɐᗡ ɥsıunԀ ʎɹoʌıuɹɐƆ", "config.gtocore.option.cannibalismRadius": "snıpɐᴚ ɥsıunԀ ʎɹoʌıuɹɐƆ", + "config.gtocore.option.client": "ʇuǝıןƆ", "config.gtocore.option.detailedLogging": "buıbboꞀ pǝןıɐʇǝᗡ ]bnqǝᗡ[", "config.gtocore.option.dev": "ǝpoW ɹǝdoןǝʌǝᗡ", + "config.gtocore.option.devMode": "ǝpoW ʌǝᗡ", "config.gtocore.option.difficulty": "ʎʇןnɔıɟɟıᗡ ǝɯɐ⅁", "config.gtocore.option.disableChargeBomb": "qɯoᗺ ǝbɹɐɥƆ ǝןqɐsıᗡ", "config.gtocore.option.disableEmbeddiumBECulling": "buıןןnƆ Ǝᗺ ןɐqoן⅁ ɯnıppǝqɯƎ ǝןqɐsıᗡ", "config.gtocore.option.disableMufflerPart": "ʇɹɐԀ ɹǝןɟɟnW ǝןqɐsıp", + "config.gtocore.option.disableRecyclingRecipes": "sǝdıɔǝᴚ buıןɔʎɔǝᴚ ǝןqɐsıᗡ ]bnqǝᗡ[", "config.gtocore.option.emiGlobalFavorites": "sǝʇıɹoʌɐℲ ןɐqoן⅁ IWƎ", "config.gtocore.option.enableCustomRecipes": "sǝdıɔǝᴚ ɯoʇsnƆ ǝןqɐuƎ", "config.gtocore.option.exPatternSize": "ǝzıS ɹǝpıʌoɹԀ uɹǝʇʇɐԀ pǝpuǝʇxƎ", "config.gtocore.option.fastMultiBlockPage": "buıpɐoꞀ ǝbɐԀ ʞɔoןqıʇןnW ʇsɐℲ", "config.gtocore.option.ftbUltimineRange": "ǝbuɐᴚ buıuıW uıɐɥƆ", + "config.gtocore.option.gamePlay": "ʎɐןԀ ǝɯɐ⅁", "config.gtocore.option.hud": "sbuıʇʇǝS ᗡ∩H", "config.gtocore.option.itemRange": ")sʞɔoןq( ǝbuɐᴚ ɯǝʇI ɹoɥɔuⱯ ןǝʌɐɹ⟘", "config.gtocore.option.lightningRodEffect": "ʇɔǝɟɟƎ poᴚ buıuʇɥbıꞀ", "config.gtocore.option.maxMonitorSize": "ǝzıS ɹoʇıuoW ɯnɯıxɐW", + "config.gtocore.option.misc": "ɔsıW", "config.gtocore.option.mobConfig": "sbuıʇʇǝS qoW", "config.gtocore.option.naturalRegeneration": "uoıʇɐɹǝuǝbǝᴚ ןɐɹnʇɐN qoW", "config.gtocore.option.nightVision": "uoısıΛ ʇɥbıN uı-ʇןınᗺ", @@ -1651,7 +1657,6 @@ "config.gtocore.option.sendMultiblockErrorMessages": "sǝbɐssǝW ɹoɹɹƎ ʞɔoןqıʇןnW puǝS", "config.gtocore.option.serverLang": "ǝbɐnbuɐן ɹǝʌɹǝS", "config.gtocore.option.showAEAmountTooltipEverywhereEmi": "IWƎ uı ǝɹǝɥʍʎɹǝʌƎ dıʇןoo⟘ ʇunoɯⱯ ƎⱯ ʍoɥS", - "config.gtocore.option.showEnglishName": "ǝɯɐN ɥsıןbuƎ ɯǝʇI ʍoɥS", "config.gtocore.option.staffOfTravellingPatternNodes": "sǝpoN uɹǝʇʇɐԀ buıןןǝʌɐɹ⟘ ɟO ɟɟɐʇS", "config.gtocore.option.startSpark": "ǝsɐɥԀ ʇɹɐʇS ɹǝןıɟoɹԀ ʞɹɐdS", "config.gtocore.option.travelConfig": "sbuıʇʇǝS ןǝʌɐɹ⟘", @@ -1665,7 +1670,6 @@ "config.jade.plugin_gtocore.ae_grid_provider": "oɟuI pıɹ⅁ ƎⱯ ]ǝɹoƆO⟘⅁[", "config.jade.plugin_gtocore.ae_item_amount": "ʇunoɯⱯ ɯǝʇI ƎⱯ ]ǝɹoƆO⟘⅁[", "config.jade.plugin_gtocore.destroy_time_provider": "oɟuI ǝɯı⟘ ʎoɹʇsǝᗡ ]ǝɹoƆO⟘⅁[", - "config.jade.plugin_gtocore.en_lang": "ʎɐןdsıᗡ ɥsıןbuƎ ]ǝɹoƆO⟘⅁[", "config.jade.plugin_gtocore.maintenance_hatch_provider": "oɟuI ɥɔʇɐH ǝɔuɐuǝʇuıɐW ]ǝɹoƆO⟘⅁[", "config.jade.plugin_gtocore.mana_container_provider": "ɹǝuıɐʇuoƆ ɐuɐW ]ǝɹoƆO⟘⅁[", "config.jade.plugin_gtocore.temperature_provider": "ǝɹnʇɐɹǝdɯǝ⟘ ǝuıɥɔɐW ]ǝɹoƆO⟘⅁[", @@ -2153,12 +2157,15 @@ "gtocore.adv_terminal.setting_already_existed": "pǝʇsıxƎ ʎpɐǝɹןⱯ buıʇʇǝS", "gtocore.ae.appeng.craft.add_missing_to_emi": "buıssıW ʞɹɐɯʞooᗺ", "gtocore.ae.appeng.craft.add_missing_to_emi.desc": "ǝbɐd ʞɹɐɯʞooq IWƎ oʇ sɯǝʇı buıssıɯ ppⱯ", + "gtocore.ae.appeng.craft.encode_send": "ɹ§uɹǝʇʇɐd puǝs puɐ ǝpoɔuƎ ]ʞɔıןƆ ʇɥbıᴚ[o§", + "gtocore.ae.appeng.craft.encode_send.desc": "ʇı oʇ ǝdıɔǝɹ ʇuǝɹɹnɔ ǝɥʇ ǝpoɔuǝ puɐ ɹǝpıʌoɹԀ uɹǝʇʇɐԀ uoıʇɐuıʇsǝp ǝɥʇ ʇɔǝןǝs oʇ ʞɔıןƆ", "gtocore.ae.appeng.craft.missing_start": "buıʇɟɐɹƆ buıssıW", "gtocore.ae.appeng.craft.missing_start.desc": "ɹoɟ pǝʇıɐʍ ǝq ןןıʍ sʇuǝıpǝɹbuı buıssıɯ 'ʇuǝıɔıɟɟnsuı ǝɹɐ sןɐıɹǝʇɐɯ uǝɥʍ uǝʌǝ buıʇɟɐɹɔ ʇɹɐʇS", "gtocore.ae.appeng.craft.pause_job": "ǝsnɐԀ", "gtocore.ae.appeng.craft.pause_job.desc": "uʍɐɹpɥʇıʍ ǝq ʇou ןןıʍ suɹǝʇʇɐd pǝɥsnd ؛buıʇɟɐɹɔ buıobuo ǝɥʇ ǝsnɐԀ", "gtocore.ae.appeng.craft.resume_job": "ǝɯnsǝᴚ", "gtocore.ae.appeng.craft.resume_job.desc": "buıʇɟɐɹɔ pǝsnɐd ǝɥʇ ǝɯnsǝᴚ", + "gtocore.ae.appeng.craft.temp_order": "ǝdıɔǝɹ sıɥʇ ɹoɟ sןɐıɹǝʇɐɯ ʍɐɹ ɟo ʇǝs ǝuo buıɹǝpɹo 'ɹǝpɹo buıʇɟɐɹɔ ʎɹɐɹodɯǝʇ ɐ ǝʇɐǝɹɔ oʇ ʞɔıןɔ-ǝןppıW", "gtocore.ae.appeng.craft.used_percent": "%s%% pǝs∩", "gtocore.ae.appeng.crafting.cycle_error.bracket_close": ")", "gtocore.ae.appeng.crafting.cycle_error.bracket_open": "( ", @@ -2219,12 +2226,13 @@ "gtocore.ae.appeng.me_storage_amount": "ʇunoɯⱯ pǝɹoʇS ʞɹoʍʇǝN ƎW", "gtocore.ae.appeng.pattern.priority": " :ʎʇıɹoıɹԀ uɹǝʇʇɐԀ", "gtocore.ae.appeng.pattern.priority.desc": "˙ʎʇıɹoıɹd ʇsǝɥbıɥ ǝɥʇ ɥʇıʍ suɹǝʇʇɐd ǝzıʇıɹoıɹd ןןıʍ uoıʇɐןnɔןɐɔ buıʇɟɐɹɔ ǝɥ⟘ ˙ɹǝpıʌoɹd sıɥʇ ʎq pǝɹǝɟɟo suɹǝʇʇɐd ǝɥʇ ɹoɟ ʎʇıɹoıɹd ǝɥ⟘", + "gtocore.ae.appeng.pattern_content_access_terminal": "ןɐuıɯɹǝ⟘ ssǝɔɔⱯ ʇuǝʇuoƆ uɹǝʇʇɐԀ", + "gtocore.ae.appeng.pattern_content_access_terminal.replacement_list_name": "%s# ʇsıꞀ ʇuǝɯǝɔɐןdǝᴚ", + "gtocore.ae.appeng.pattern_content_access_terminal.replacement_list_tooltip": "˙pǝɔɐןdǝɹ ǝq ןןıʍ suɹǝʇʇɐd ǝɥʇ uı sʇuǝıpǝɹbuı ɥɔıɥʍ ǝpıɔǝp oʇ ǝɹǝɥ ɹǝʇןıɟ ǝɥʇ ǝɹnbıɟuoƆ", "gtocore.ae.appeng.pick_craft.all_right": "¡pǝʇɹɐʇs buıʇɟɐɹƆ", - "gtocore.ae.appeng.pick_craft.all_right.title": "ssǝɔɔnS ʇɟɐɹƆ-ʞɔıԀ", "gtocore.ae.appeng.pick_craft.error.1": "˙ɥʇɐd buıʇɟɐɹɔ ǝɥʇ buıʇɐןnɔןɐɔ ǝןıɥʍ pǝɹɹnɔɔo ɹoɹɹǝ uⱯ", "gtocore.ae.appeng.pick_craft.error.2": "˙ɯǝʇı pǝɹısǝp ǝɥʇ ʇɟɐɹɔ oʇ ∩ԀƆ ǝןqɐןıɐʌɐ oN/sןɐıɹǝʇɐɯ ʇuǝıɔıɟɟnsuI", "gtocore.ae.appeng.pick_craft.error.3": "˙ʇıɯıן ǝɥʇ pǝɥɔɐǝɹ sɐɥ sʞsɐʇ pǝʇɐǝɹɔ ɟo ɹǝqɯnu ǝɥ⟘", - "gtocore.ae.appeng.pick_craft.error.title": "ɹoɹɹƎ ʇɟɐɹƆ-ʞɔıԀ", "gtocore.ae.appeng.wildcard_pattern_buffer.blacklist": "ʇsıןʞɔɐןᗺ ןɐıɹǝʇɐW ɹǝpıʌoɹԀ uɹǝʇʇɐԀ pɹɐɔpןıM", "gtocore.ae.appeng.wildcard_pattern_buffer.blacklist.desc": "˙ɹǝpıʌoɹԀ uɹǝʇʇɐԀ pɹɐɔpןıM ǝɥʇ ʎq pǝsn ǝq ʇou ןןıʍ ʇsıןʞɔɐןq ǝɥʇ oʇ pǝppɐ sןɐıɹǝʇɐW", "gtocore.ae.appeng.wildcard_pattern_buffer.loaded_patterns": "˙suɹǝʇʇɐd pɹɐɔpןıʍ %s pǝpɐoן puɐ pǝuuɐɔS", @@ -2584,8 +2592,9 @@ "gtocore.gray_membership_card.hover_text.2": "sɹǝʎɐןd ǝuıןɟɟO", "gtocore.gray_membership_card.hover_text.3": " :ɹǝuʍO", "gtocore.gray_membership_card.hover_text.4": " :ʎq pǝɹɐɥS", - "gtocore.gtm": "˙ןǝuuɐɥɔ poɯ ןɐıɔıɟɟo ǝɥʇ ɟo pɐǝʇsuı ʞɔɐqpǝǝɟ ǝpıʌoɹd oʇ %s oʇ ob ǝsɐǝןd 'suoıʇsǝbbns ʎuɐ ǝʌɐɥ ɹo sǝnssı ʎuɐ ɹǝʇunoɔuǝ noʎ ɟI ˙uoısɹǝʌ ןɐıɔıɟɟoun uɐ sı ʞɔɐdpoɯ ǝɥʇ uı pǝsn poɯ ᄅ sɔıʇǝbɹǝuƎ pǝıןddⱯ puɐ uɹǝpoW-ɥɔǝ⟘bǝɹ⅁ ǝɥ⟘", + "gtocore.gtm": "˙ןǝuuɐɥɔ poɯ ןɐıɔıɟɟo ǝɥʇ ɟo pɐǝʇsuı ʞɔɐqpǝǝɟ ǝpıʌoɹd oʇ %s oʇ ob ǝsɐǝןd 'suoıʇsǝbbns ʎuɐ ǝʌɐɥ ɹo sǝnssı ʎuɐ ɹǝʇunoɔuǝ noʎ ɟI ˙uoısɹǝʌ ןɐıɔıɟɟoun uɐ sı ʞɔɐdpoɯ ǝɥʇ uı pǝsn poɯ ᄅ sɔıʇsıbɹǝuƎ pǝıןddⱯ puɐ uɹǝpoW-ɥɔǝ⟘bǝɹ⅁ ǝɥ⟘", "gtocore.gui.encoding_desc": "suɹǝʇʇɐd pǝpoɔuǝ ןןɐ ɹɐǝןɔ / ʎɹoʇuǝʌuı ɹǝʎɐןd oʇuı uɹǝʇʇɐd buıpoɔuǝ ʇɹǝsuı ]ʞɔıןƆ + ʇɟıɥS[o§", + "gtocore.gui.widget.amount_set.hover_tooltip": "suoıssǝɹdxǝ puɐ uoıʇɐʇou b/ɯ/ʞ sʇdǝɔɔⱯ ˙XⱯW˙buoꞀ oʇ Ɩ ɯoɹɟ ɹǝbǝʇuı uɐ ɹǝʇuƎ", "gtocore.hud.drag": "ǝpoɯ bɐɹp ᗡ∩H ǝןqɐuǝ oʇ ʞɔıןɔ ʇɥbıᴚ", "gtocore.hud.toggle.off": ")pǝןqɐsıᗡ( ʎɐןdsıp ᗡ∩H ǝןbboʇ oʇ ʞɔıןɔ ʇɟǝꞀ", "gtocore.hud.toggle.on": ")pǝןqɐuƎ( ʎɐןdsıp ᗡ∩H ǝןbboʇ oʇ ʞɔıןɔ ʇɟǝꞀ", @@ -2621,6 +2630,7 @@ "gtocore.integration.ae.WirelessMachine.gridNodeList": "ʇsıꞀ ǝpoN pıɹ⅁", "gtocore.integration.ae.WirelessMachine.gridNodeSelector": "ɹoʇɔǝןǝS ǝpoN pıɹ⅁", "gtocore.integration.ae.WirelessMachine.leave": "pıɹ⅁ ssǝןǝɹıM ǝʌɐǝꞀ", + "gtocore.integration.ae.WirelessMachine.notConnected": "ǝuoN", "gtocore.integration.ae.WirelessMachine.player": "%s :ɹǝʎɐןd oʇ puıᗺ", "gtocore.integration.ae.WirelessMachine.removeGrid": "ǝʌoɯǝᴚ", "gtocore.integration.ae.WirelessMachine.renameGrid": "pıɹ⅁ ǝɯɐuǝᴚ", @@ -2646,9 +2656,9 @@ "gtocore.lang.-121146516": "%00Ɩ~%0ㄣ :ǝbuɐɹ ʇuǝɯʇsnظpɐ uoıʇɐɹnp uoıʇɐɹǝdO", "gtocore.lang.-1261349876": "ʍoןןɐ ןןıʍ uɐbɹo sıɥ⟘", "gtocore.lang.-1269813583": "ssǝuɥbno⟘ ɹoɯɹⱯ", - "gtocore.lang.-1271244345": "˙pǝɹnbıɟuoɔ noʎ ʎʇıɹoıɹd ǝɥʇ oʇ buıpɹoɔɔɐ pǝɔɐןdǝɹ ǝq ןןıʍ ʇuǝʇuoɔ sʇı", "gtocore.lang.-1309148959": "ǝpoןdxǝ", "gtocore.lang.-1315180647": "ɹ§uoıʇısod sıɥʇ ɟo ʞɹɐɯ ǝɥʇ ɹɐǝןƆ ɹ§:ʞɔıןƆ-ʇɥbıᴚ + ʇɟıɥSɐ§", + "gtocore.lang.-1334423408": "pǝɹınbǝɹ ɥɔʇɐɥ ןoɹʇuoɔ ןǝןןɐɹɐd ou 'buıssǝɔoɹd ןǝןןɐɹɐd uı-ʇןınᗺ", "gtocore.lang.-1344483012": "˙ʎɔuǝıɔıɟɟǝ ǝuıɥɔɐɯ ǝʌoɹdɯı oʇ sǝɹnʇɔnɹʇs ɟo uoısuɐdxǝ ǝɥʇ sʍoןןⱯ", "gtocore.lang.-1383224310": "0 : ǝʇɐᴚ uoıʇıןdǝᗡ", "gtocore.lang.-1413498661": " 'ןɐuıɯɹǝ⟘ ssǝɔɔⱯ uɹǝʇʇɐԀ puɐ ןɐuıɯɹǝ⟘ buıpoɔuƎ uɹǝʇʇɐԀ ƎW ɟo suoıʇɔunɟ ǝɥʇ sǝʇɐɹbǝʇuI", @@ -2671,11 +2681,13 @@ "gtocore.lang.-1955828040": " :ǝʇoN", "gtocore.lang.-2014927121": "sǝןqnop ɹǝqɯnu ןǝןןɐɹɐd ǝɥʇ 'ǝɹnʇɐɹǝdɯǝʇ ןıoɔ uı ǝsɐǝɹɔuı ʞ006 ʎɹǝʌǝ ɹoℲ", "gtocore.lang.-2028697327": ")ɹǝı⟘ ssɐן⅁(^ㄣ :ɐןnɯɹoℲ", + "gtocore.lang.-2034043716": "˙ʇuǝıpǝɹbuı ǝɥʇ sɐ sʞuɐןԀ ʞɐO ǝsn oʇ pǝıɟıpoɯ ʎןןɐɔıɯɐuʎp ǝq ןןıʍ uɹǝʇʇɐd ǝɥʇ 'sʞuɐןԀ ǝɔnɹdS ɹo ɥɔɹıᗺ sǝsn ʇuǝıpǝɹbuı s,uɹǝʇʇɐd ɐ uǝɥʍ uǝɥʇ 'ɹǝpɹo uı ,sʞuɐןԀ ǝɔnɹdS 'sʞuɐןԀ ɥɔɹıᗺ 'sʞuɐןԀ ʞɐO, ɥʇıʍ uoıʇɐɹnbıɟuoɔ ǝɥʇ uı ןןıɟ noʎ ɟı 'ǝןdɯɐxǝ ɹoℲ", "gtocore.lang.-2055315894": "ʇsooᗺ pǝǝdS", "gtocore.lang.-2112077052": ":oʇ ʇɔǝuuoɔ uɐɔ sǝןnpoW ǝɔɐdS ɟo sǝdʎ⟘", "gtocore.lang.-267849233": "ɹǝʇɐM ɹǝpu∩ ɥʇɐǝɹᗺ", "gtocore.lang.-268739386": "snuoᗺ ןǝןןɐɹɐԀ", "gtocore.lang.-287954562": "uoıʇıpƎ ", + "gtocore.lang.-294733446": "˙ʇɟǝן oʇ ʇɥbıɹ ɯoɹɟ sı ɹǝpɹo ʇuǝɯǝɔɐןdǝɹ ǝɥʇ 'dnoɹb uoıʇɐɹnbıɟuoɔ ɥɔɐǝ uI", "gtocore.lang.-300078703": "ᄅ ʎq ɯsıןǝןןɐɹɐd pǝuıɐʇqo ǝɥʇ sǝsɐǝɹɔuı ɹǝıʇ ǝbɐʇןoʌ ɥɔɐǝ 'ΛꞀ∩ ɯoɹℲ", "gtocore.lang.-346445743": "pǝɹınbǝɹ sı ɹoɯɹɐ ɟo ʇǝs ǝʇǝןdɯoɔ Ɐ", "gtocore.lang.-374056284": "ǝpıʌoɹd ןןıʍ uɐbɹo sıɥ⟘", @@ -2694,6 +2706,7 @@ "gtocore.lang.-698628939": "ǝsn oʇ ɹǝbɹɐɥɔ ssǝןǝɹıʍ ɐ sǝɹınbǝᴚ", "gtocore.lang.-724709346": "sǝɹnʇɔnɹʇs ʞɔoןq-ıʇןnɯ ǝןdıʇןnɯ ʎq pǝɹɐɥs ǝq uɐɔ ɥɔʇɐɥ sıɥʇ ɹǝɥʇǝɥʍ sʇuǝsǝɹdǝᴚ", "gtocore.lang.-749025748": "ㄣ ^ ))∩Ǝ⅁ uı uoıʇdɯnsuoɔ ʎbɹǝuƎ( + ᄅƐ9˙Ɩ( / ㄣ8Ɛ˙9 + Ɩ˙0", + "gtocore.lang.-76006678": "˙ǝuıן ǝɯɐs ǝɥʇ uo sǝıʇıɹoıɹd pǝɹnbıɟuoɔ ɹnoʎ oʇ buıpɹoɔɔɐ pǝɔɐןdǝɹ ǝq ןןıʍ ʇuǝʇuoɔ sʇı 'pǝןןɐɔ sı uɹǝʇʇɐd ɐ uǝɥʍ puɐ 'ʞɹoʍʇǝu ƎW ǝɥʇ oʇ ǝuıɥɔɐɯ sıɥʇ ʇɔǝuuoɔ ʎןdɯıS", "gtocore.lang.-781353543": "sǝdıɔǝɹ ʍoןǝq puɐ ɹǝıʇ-ɹ§ΛI6§ unɹ ʎןuo uɐƆ", "gtocore.lang.-790651361": "ǝuıɥɔɐW uoıʇɔǝuuoƆ ssǝןǝɹıM ƎW", "gtocore.lang.-801705034": "%00Ɩ~%8ᄅ :ǝbuɐɹ ʇuǝɯʇsnظpɐ uoıʇɐɹnp uoıʇɐɹǝdO", @@ -2706,10 +2719,11 @@ "gtocore.lang.-88949489": "%00Ɩ~%ᄅƐ :ǝbuɐɹ ʇuǝɯʇsnظpɐ uoıʇɐɹnp uoıʇɐɹǝdO", "gtocore.lang.-94407882": "ǝןnpoW uoıʇɔunظuoƆ", "gtocore.lang.-98188006": "ɹ§¡ㄥ§ɹ§ʇsoן ʎןʇuǝuɐɯɹǝdן§ɔ§ ǝq ןןıʍ ssǝɔxǝ ǝɥʇ '8ƖƎᄅ˙6 spǝǝɔxǝ ǝbɐɹoʇs ןɐuıbıɹo ǝɥʇ ɟı 'ɥɔʇɐH ssǝɔɔⱯ ǝbɐɹoʇS sıɥʇ oʇ ɥɔʇɐH ssǝɔɔⱯ ǝbɐɹoʇS ʇuIbıᗺ ɐ ɯoɹɟ buıpɐɹbdn uǝɥMㄥ§", - "gtocore.lang.0.-568444703": "buıɯɐu ɹoɟ ʇuǝıuǝʌuoɔ sı ɥɔıɥʍ 'ǝɯɐu sʇı ʎdoɔ oʇ ʞɔoןq ɐ ʞɔıןɔ ʇɥbıᴚ+ʇɟıɥS", "gtocore.lang.0.1059274564": "ʞɹoʍʇǝN ƎW uı ∩ԀƆ ɹǝdnS", + "gtocore.lang.0.1640495616": "ǝɯɐu sʇı ʎdoɔ oʇ ʞɔoןq ɐ ʞɔıןɔ ʇɥbıᴚ+ʇɟıɥS", "gtocore.lang.0.475558069": "ʞɹoʍ oʇ ɹǝʍod puɐ uǝbʎxo spǝǝN", "gtocore.lang.1.1285447032": "ǝɔuɐɯɹoɟɹǝԀ ∩ԀƆ", + "gtocore.lang.1.336979551": "ǝɯɐu sʇı ʎdoɔ oʇ ɯǝʇı uɐ ʞɔıןɔ ʇɥbıᴚ", "gtocore.lang.1000504160": " :sısǝɥʇuʎS puɐ uoıʇɔıpǝɹԀ", "gtocore.lang.1011049812": "ᄅ ʎq ʇ/∩Ǝ sǝıןdıʇןnɯ puɐ ʎɔuǝıɔıɟɟǝ %0Ɩ sppɐ ɹ§ΛH9§ ǝʌoqɐ ɹǝpןoH ɹoʇoᴚ ɥɔɐƎ", "gtocore.lang.1024": " ", @@ -2721,7 +2735,6 @@ "gtocore.lang.1070805810": " :ʇ∩Ǝ uoıʇɔnpoɹԀ ǝsɐᗺ", "gtocore.lang.1084246430": " :ǝɹnʇɐɹǝdɯǝ⟘ xɐW", "gtocore.lang.1087090424": " :ǝʇnqıɹʇʇⱯ buıʇɐןnpoW", - "gtocore.lang.1137917401": "ןǝʌǝן ǝbɐʇןoʌ ɯnɯıxɐɯ s,ǝuıɥɔɐɯ ǝɥʇ uɐɥʇ ɹǝʍoן sı ɥɔʇɐɥ ǝʇɐɹǝןǝɔɔɐ ǝɥʇ ɟo ןǝʌǝן ǝɥʇ uǝɥʍ ןǝʌǝן ɹǝd %0ᄅ ʎq pǝuǝʞɐǝʍ sı ʇɔǝɟɟǝ uoıʇɐɹǝןǝɔɔɐ ǝɥ⟘", "gtocore.lang.1151803146": "uoıʇɐןןɐʇsuI ǝןnpoW ɹǝʇɟⱯ", "gtocore.lang.1158649764": "buıpןınᗺ ǝuoʇsǝןıW", "gtocore.lang.1160719164": "Ɩ660ㄣㄥㄣϛᄅ66Ɩㄥ006", @@ -2731,13 +2744,15 @@ "gtocore.lang.1253850554": "¡ʇı op puɐ pɐǝɥɐ ob 'ʎɔuǝıɔıɟɟǝ ʞɹoʍ ǝןqɐuıbɐɯıun ǝɥʇ ǝuıbɐɯI", "gtocore.lang.1254853426": "˙ɹǝʍoʇ uoıʇɐןןıʇsıp ɟo ɹǝʎɐן ɐ sǝɹınbǝɹ ǝdıɔǝɹ ǝɥʇ uı ʇɔnpoɹd ɥɔɐƎ", "gtocore.lang.1274868018": "ᄅ ʎq ʇ/∩Ǝ sǝıןdıʇןnɯ puɐ ʎɔuǝıɔıɟɟǝ %0Ɩ sppɐ ɹ§ΛƎϛ§ ǝʌoqɐ ɹǝpןoH ɹoʇoᴚ ɥɔɐƎ", + "gtocore.lang.130790430": "buıssǝɔoɹd ןǝןןɐɹɐd ǝʌǝıɥɔɐ oʇ sǝɥɔʇɐɥ ןoɹʇuoɔ ןǝןןɐɹɐd ɟo uoıʇɐןןɐʇsuı ǝɥʇ sʍoןןⱯ", "gtocore.lang.1364194362": "ɥʇɐɯ ǝɥʇ op ')ɹǝı⟘ ǝdıɔǝᴚ - ɹǝı⟘ ǝuıɥɔɐW(^ᄅ * sɯɹɐʍS ouɐN ɟo ɹǝqɯnN :ɐןnɯɹoℲ", "gtocore.lang.1367583746": " :uoıʇdıɹɔsǝᗡ", - "gtocore.lang.1376594968": "'pǝןןɐɔ sı uɹǝʇʇɐd ǝɥʇ uǝɥʍ puɐ 'ʞɹoʍʇǝu ƎW ǝɥʇ oʇ ǝuıɥɔɐɯ sıɥʇ ʇɔǝuuoɔ ʇsnſ", "gtocore.lang.1394390896": "ɥɔʇɐH uɹǝʇʇɐԀ", "gtocore.lang.140180329": "spןɹoʍ ʇuǝɹǝɟɟıp ssoɹɔɐ ʇıɯsuɐɹʇ uɐƆ", "gtocore.lang.1427": " -", + "gtocore.lang.1435846884": "ǝdʎʇ ǝdıɔǝɹ uʍo s,ǝuıɥɔɐɯ ǝɥʇ ʎq pǝʇɔıɹʇsǝɹun 'sǝdʎʇ ǝdıɔǝɹ ʇɔǝןǝs ʎןʇuǝpuǝdǝpuı uɐɔ sǝɥɔʇɐɥ ǝɥʇ ɹǝɥʇǝɥʍ sʇuǝsǝɹdǝᴚ", "gtocore.lang.1453419452": "sǝdıɔǝɹ ʍoןǝq puɐ ɹǝıʇ-ɹ§ΛꞀ∩8§ unɹ ʎןuo uɐƆ", + "gtocore.lang.1482192762": "ʇuǝɯǝɔɐןdǝᴚ ʇuǝʇuoƆ uɹǝʇʇɐԀ ɔıɯɐuʎᗡ", "gtocore.lang.1482865987": "ㄣㄣƖᄅ9ᄅ", "gtocore.lang.1490368255": "sǝʇʎᗺ ㄣᄅ8ƖㄣㄥƐㄥ0Ɩ sı ʇı 'noʎ ɹoɟ ʇı pǝʇɐןnɔןɐɔ I", "gtocore.lang.1507489": "ㄣᄅ0Ɩ", @@ -2778,17 +2793,17 @@ "gtocore.lang.1961950737": "9ㄥϛ8ㄣ0Ɩ", "gtocore.lang.1978323557": "ɹ§˙ɹǝpɹo uı ʎxoɹd ʇɔɐɹǝssǝ⟘ ɹoɟ uoıʇɐɔoן ʇǝbɹɐʇ ǝɥʇ ʞɹɐɯ oʇ pǝs∩ㄥ§", "gtocore.lang.2.357711854": "ǝןpuɐɥ uɐɔ ∩ԀƆ ǝɥʇ ǝzıs ʞsɐʇ ןɐʇoʇ ǝɥʇ sǝuıɯɹǝʇǝᗡ :ʎʇıɔɐdɐƆ", + "gtocore.lang.2005677336": "ןǝʌǝן ǝbɐʇןoʌ s,ǝdıɔǝɹ ǝɥʇ uɐɥʇ ɹǝʍoן sı ɥɔʇɐɥ ǝʇɐɹǝןǝɔɔɐ ǝɥʇ ɟo ןǝʌǝן ǝɥʇ uǝɥʍ ןǝʌǝן ɹǝd %0ᄅ ʎq pǝuǝʞɐǝʍ sı ʇɔǝɟɟǝ uoıʇɐɹǝןǝɔɔɐ ǝɥ⟘", "gtocore.lang.206509868": "sǝʇʎᗺ )⅁ᄅ˙ㄥƖ( Wㄥ8˙6ㄥƖ'ㄥƖ", "gtocore.lang.207321486": "sʇuǝuodɯoƆ ןǝnℲ ɟo ɹǝqɯnN", "gtocore.lang.209383949": "ǝןnpoW ǝɹoƆ", "gtocore.lang.233819385": "snuoᗺ ʎɔuǝıɔıɟɟƎ ןıoƆ", "gtocore.lang.237817396": "ǝʇıuıɟuI", - "gtocore.lang.241585397": "spınןɟ puɐ sɯǝʇı ɥʇoq sʇɹoddnS", "gtocore.lang.266512477": "xㄣ8Ɛ >- x9ϛᄅ", + "gtocore.lang.280946395": "ssǝɔɔⱯ uɹǝʇʇɐԀ ʇuǝʇuoƆ", "gtocore.lang.281670066": "ᄅ ʎq ʇ/∩Ǝ sǝıןdıʇןnɯ puɐ ʎɔuǝıɔıɟɟǝ %0Ɩ sppɐ ɹ§ΛI6§ ǝʌoqɐ ɹǝpןoH ɹoʇoᴚ ɥɔɐƎ", "gtocore.lang.3.2106472575": "ǝbɐɹoʇs ʎʇıuıɟuı ʞɔoןun oʇ sʇıun ǝbɐɹoʇs ϛ⟘ Ɩ8ㄣ ןןıℲ", "gtocore.lang.32551241": " puɐ ", - "gtocore.lang.343537399": "ɹǝıɟıpoW ɔıɯɐuʎᗡ ʇuǝʇuoƆ uɹǝʇʇɐԀ ƎW", "gtocore.lang.350931190": "ɹ§˙ǝןoɥʍ buıןıɐ ǝɥʇ ɹoɟ ǝɹnɔ ɐ ʍou 'ןnos ʎɹɐǝʍ ǝɥʇ ɹoɟ uʍoɹɔ ɐ ǝɔuOㄥ§", "gtocore.lang.362619935": "ㄣ0Ɛㄣ6Ɩㄣ", "gtocore.lang.363439179": "ㄣ×)ɹǝıʇ buısɐƆ ןɐɔıuɐɥɔǝW ɔıʇǝɯɹǝH(", @@ -2800,7 +2815,6 @@ "gtocore.lang.4.334244742": "ǝbɐɹoʇs ʇıun buıʇɟɐɹƆΣ :ɐןnɯɹoℲ", "gtocore.lang.407924965": "pǝǝds uoıʇɐɹǝdo ǝuıɥɔɐɯ sǝʇɐɹǝןǝɔɔɐ ʎןןɐuoıʇıpuoɔu∩", "gtocore.lang.41478": "☆ ", - "gtocore.lang.417880883": "˙ʇı buıʎɟıpoɯ ʇnoɥʇıʍ uɹǝʇʇɐd ɐ ɟo ʇuǝʇuoɔ ǝɥʇ ǝɔɐןdǝɹ ʍou uɐɔ noʎ 'sǝʎ", "gtocore.lang.447198717": " :ɥɐɹıɥdǝS ɔıʇsıןɐqqɐʞ", "gtocore.lang.46299910": "pǝןqnop sı ןǝןןɐɹɐd pǝuıɐʇqo ǝɥʇ 'ɹǝıʇ ǝdıɔǝɹ ǝɥʇ ǝʌoqɐ ɹǝıʇ ǝuıɥɔɐɯ ɥɔɐǝ ɹoɟ ؛ǝuıɥɔɐɯ ǝɥʇ uı sɯɹɐʍS ouɐN ɟo ɹǝqɯnu ǝɥ⟘", "gtocore.lang.46912042": "ㄣ8Ɛ9Ɩ", @@ -2838,6 +2852,7 @@ "gtocore.lang.716205946": " :ǝɹnʇɐɹǝdɯǝ⟘", "gtocore.lang.735333575": "ɹ§%ㄥ9˙9Ɩ× uoıʇɐɹnp ǝuıɥɔɐɯ 'pǝsn ɹǝʍod sǝɯıʇ ㄣ ʎɹǝʌǝ ɟo ɯnɯıxɐɯ ɐ oʇ pǝsɐǝɹɔuı sı ʇɔǝɟɟǝ buıʞɔoןɔɹǝʌo ǝɥʇ 'ɥɔʇɐɥ sıɥʇ buıןןɐʇsuı ɹǝʇɟⱯɐ§", "gtocore.lang.740444711": "ɹ§%ϛ˙ᄅƖ× uoıʇɐɹnp ǝuıɥɔɐɯ 'pǝsn ɹǝʍod sǝɯıʇ ㄣ ʎɹǝʌǝ ɟo ɯnɯıxɐɯ ɐ oʇ pǝsɐǝɹɔuı sı ʇɔǝɟɟǝ buıʞɔoןɔɹǝʌo ǝɥʇ 'ɥɔʇɐɥ sıɥʇ buıןןɐʇsuı ɹǝʇɟⱯɐ§", + "gtocore.lang.760352670": "ʇɟǝן oʇ ʇɥbıɹ ɯoɹɟ ǝɔɐןdǝᴚ", "gtocore.lang.76517104": "ɹǝɥʇO", "gtocore.lang.79175": " ৹", "gtocore.lang.8.-1732543330": "ɹǝı⟘ ssɐן⅁^ᄅ :ɐןnɯɹoℲ", @@ -3213,7 +3228,7 @@ "gtocore.lang.advanced_assembly_line.3.-538236882": "suoısɹǝʌ snoıʌǝɹd ɹǝʌo sǝɯıʇ ןɐɹǝʌǝs pǝsɐǝɹɔuı ʎɔuǝıɔıɟɟǝ s,ןǝpoɯ ʍǝu ǝɥʇ 'suoıʇɐʇıɯıן ǝʇıdsǝᗡ ˙ɟɟo pıɐd sʇɹoɟɟƎ", "gtocore.lang.advanced_assembly_line.3.645766060": "pǝsn ǝq uɐɔ sɹǝqɯɐɥɔ ʇǝbɹɐʇ ɐʇɐp ʎןuO", "gtocore.lang.advanced_hyper_cube_machine.0.1577061162": "ǝbɐɹoʇs)ɥʇoq ɹo ɯǝʇı ɹo pınןɟ( )ıʇןnɯ ɹo ɐ( ʎxoɹԀ", - "gtocore.lang.advanced_hyper_cube_machine.1.188391162": "ʞɔoןq ǝbɐɹoʇs ɐ puıq oʇ ɹ§pɹɐƆ ǝʇɐuıpɹoƆq§ ǝɥʇ ǝs∩", + "gtocore.lang.advanced_hyper_cube_machine.1.-1761448469": "ʞɔoןq ǝbɐɹoʇs ɐ puıq oʇ ɹ§pɹɐƆ ǝʇɐuıpɹooƆq§ ǝɥʇ ǝs∩", "gtocore.lang.advanced_hyper_cube_machine.2.-178785670": "ǝbɐɹoʇs punoq ǝɥʇ ǝɹǝʍ ʇı ɟı sɐ ʇı ǝʇɐɹǝdo oʇ ǝuıɥɔɐɯ sıɥʇ oʇ ǝbɐɹoʇs ɐ puıᗺ", "gtocore.lang.advanced_hyper_cube_machine.3.-154366173": "sǝbɐɹoʇs ǝןdıʇןnɯ puıq ɟı ɹǝpɹo uı ɯǝɥʇ ǝʇɐɹǝdO", "gtocore.lang.advanced_hyper_cube_machine.4.-306503171": "ǝɔɐɟɹǝʇuı ǝɥʇ uǝdo oʇ ʞɔıןɔ ʇɥbıᴚ", @@ -3224,9 +3239,9 @@ "gtocore.lang.advanced_infinite_driller.11.1673844845": "ʇnduı ɹǝd/ʞᄅ uǝbʎxO pınbıꞀ", "gtocore.lang.advanced_infinite_driller.12.-1559757127": "ʇnduı ɹǝd/ʞㄣ ɯnıןǝH pınbıꞀ", "gtocore.lang.advanced_infinite_driller.13.-1146717525": ")pǝuıɯɹǝʇǝp ǝq oʇ ǝɹoɯ( pǝɔɐןd ǝq uɐɔ spɐǝɥ ןןıɹp ʇuǝɯǝןǝ-uoɹʇnǝN ʎןuO", - "gtocore.lang.advanced_infinite_driller.2.-437538": "sǝqnƆ ǝzɐןᗺ pınbıꞀ ɹo ǝzɐןᗺ pınbıꞀ ʇnduı 'ʇɹɐʇs oʇ buıʇɐǝɥ sǝɹınbǝᴚ", + "gtocore.lang.advanced_infinite_driller.2.1762934901": "ǝqnɔǝzɐןᗺ pınbıꞀ ɹo ǝzɐןᗺ pınbıꞀ ʇnduı 'ʇɹɐʇs oʇ buıʇɐǝɥ sǝɹınbǝᴚ", "gtocore.lang.advanced_infinite_driller.3.-656059058": "Ɛ˙Ɩ^ǝɹnʇɐɹǝdɯǝ⟘ :)ᗺɯ :ʇıun(ɐןnɯɹoɟ uoıʇdɯnsuoɔ ןɐıɹǝʇɐɯ buıʇɐǝH", - "gtocore.lang.advanced_infinite_driller.4.-517642844": "ʇnduı ɹǝd / ʞ000Ɩ :sǝqnƆ ǝzɐןᗺ pınbıꞀ 'ʇnduı ɹǝd / ʞƖ :ǝzɐןᗺ pınbıꞀ )sʞɔıʇ ϛ ʎɹǝʌǝ( :pǝǝds buıʇɐǝH", + "gtocore.lang.advanced_infinite_driller.4.-576390099": "ʇnduı ɹǝd / ʞ000Ɩ :ǝqnɔǝzɐןᗺ pınbıꞀ 'ʇnduı ɹǝd / ʞƖ :ǝzɐןᗺ pınbıꞀ )sʞɔıʇ ϛ ʎɹǝʌǝ( :pǝǝds buıʇɐǝH", "gtocore.lang.advanced_infinite_driller.5.-785999812": "ʎɔuǝıɔıɟɟǝ ɹǝɥbıɥ ǝʌıb ןןıʍ ǝɹnʇɐɹǝdɯǝʇ ɹǝɥbıH", "gtocore.lang.advanced_infinite_driller.6.-363931573": "ʇןǝɯ ןןıʍ pɐǝɥ ןןıɹp 'sʇɐǝɥɹǝʌo ǝuıɥɔɐɯ ǝɥʇ ɟI", "gtocore.lang.advanced_infinite_driller.7.1939316591": "000ᄅ / ǝɹnʇɐɹǝdɯǝ⟘ :ɐןnɯɹoɟ uoıʇɐɹǝuǝb ʇɐǝH", @@ -3276,11 +3291,11 @@ "gtocore.lang.area_destruction_tools.2.1258760006": "¡¡¡sʞɔoןq ǝɥʇ ɹɐǝןɔ oʇ ʞɔıןɔ ǝuO", "gtocore.lang.area_destruction_tools.3.113394524": "¡¡¡suoıʇıpuoɔ ןןɐ ǝɹoubI", "gtocore.lang.area_destruction_tools.4.156723940": "¡¡¡ʎʇǝɟɐs buıʇsɐןq oʇ uoıʇuǝʇʇɐ ʎɐԀ", - "gtocore.lang.area_destruction_tools.5.1790692799": " ¡ǝɯɐb ɹǝʎɐןdıʇןnɯ ǝɥʇ uı sɹǝʎɐןd ɹǝɥʇo puıɯǝɹ oʇ ǝɹns ǝᗺ", + "gtocore.lang.area_destruction_tools.5.755143680": " ¡ǝɯɐb ɹǝʎɐןdıʇןnɯ ǝɥʇ uı sɹǝʎɐןd ɹǝɥʇo uɹɐʍ oʇ ǝɹns ǝᗺ", "gtocore.lang.area_destruction_tools.6.-2083166503": "sǝpoW ǝןqɐןıɐʌⱯ", "gtocore.lang.area_destruction_tools.7.-1543656193": "sǝpoɯ ɥɔʇıʍs oʇ ʎɹoʇuǝʌuı oʇ sɯǝʇı ppⱯ", "gtocore.lang.area_destruction_tools.8.-378576493": "ɹ§ǝpoɯ ןןɐᗺ9§ ɹoɟ ɹ§)ןןɐᗺ( pןoW buıʇsɐƆq§ ʇnԀ", - "gtocore.lang.area_destruction_tools.9.-200198626": "ɹ§ǝpoɯ buıʇsɐƆ9§ ɹoɟ ɹ§)ɹǝpuıןʎƆ( pןoW buıʇsɐƆq§ ʇnԀ", + "gtocore.lang.area_destruction_tools.9.422090037": "ɹ§ǝpoɯ ɹǝpuıןʎƆ§ ɹoɟ ɹ§)ɹǝpuıןʎƆ( pןoW buıʇsɐƆq§ ʇnԀ", "gtocore.lang.atmosphere_collector_room.0.654405850": "ɥʇɐǝɹq ʎɹɐʇǝuɐןd buıʇɔǝןןoɔ uı sǝzıןɐıɔǝds 'ɹǝɔınظ ǝɹǝɥdsoɯʇɐ ǝɥ⟘", "gtocore.lang.atmosphere_collector_room.1.-204933001": "ʇɔɐɹʇxǝ oʇ ɥbnoʇ ooʇ sı sɐb ou 'ǝɹǝɥdsodoɹʇ ǝsuǝp oʇ sɹǝʎɐן ɹǝddn uıɥʇ ɯoɹℲ", "gtocore.lang.atmosphere_collector_room.2.-909799297": "sɹoʇɔǝןןoɔ ɹɐןnbǝɹ xıs sןɐnbǝ ǝןʇʇoq ǝuo 'ubısǝp ʎʇıɔɐdɐɔ ǝbɹɐן-ɐɹʇxƎ", @@ -3297,7 +3312,7 @@ "gtocore.lang.atomizing_condenser.9.-2010464440": "˙spınןɟ uǝʇןoɯ ɯoɹɟ sɹǝpʍod ןɐʇǝɯ buıɔnpoɹd ɹoɟ ʎןןɐɔıɟıɔǝds ǝuıɥɔɐɯ sıɥʇ pǝdoןǝʌǝp puɐ ssǝɔoɹd pǝʇɔǝdxǝun ǝɥʇ pǝʇuǝɯnɔop osןɐ ʇnq ɯıɥ pןoɔs ʇou pıp ʎןuo ʇou 'sıɥʇ buıɹɐǝɥ uodn 'ɹǝbɐuɐɯ ǝɥ⟘", "gtocore.lang.auto_connect_me.0.621798580": "ʞɹoʍʇǝu ssǝןǝɹıM ƎW ǝɥʇ oʇ buıʇɔǝuuoɔ ʎןןɐɔıʇɐɯoʇnɐ ʍoןןⱯ", "gtocore.lang.auto_connect_me.1.-1869929608": "ʞɹoʍʇǝu pǝʇɔǝןןoɔ ǝɥʇ oʇ ʇɔǝuuoɔ ʎןןɐɔıʇɐɯoʇnɐ oʇ ǝɔɐןd oʇ ʇɟıɥS ssǝɹԀ", - "gtocore.lang.auto_connect_me.2.-1916171520": " ¡ǝbɐɹoʇs ǝɐ ǝɥʇ ǝpoןdxǝ oʇ ןnɟǝɹɐɔ ǝᗺ", + "gtocore.lang.auto_connect_me.2.95823732": " ¡ǝbɐɹoʇs ƎⱯ ɹnoʎ ʍoןɟɹǝʌo oʇ ʇou ןnɟǝɹɐɔ ǝᗺ", "gtocore.lang.banned": "ʇɹǝdxǝ uı pǝuuɐq puɐɯɯoɔ ǝpoɯ ןǝuuɐɥƆ", "gtocore.lang.bedrock_drilling_rig.0.1667945339": "ıǝןɔnu ɔıɯoʇɐ ʞɔoɹpǝq uo ʎןʇɔǝɹıp buıʇɔɐ 'sʇıɯıן ʎʇıןıqɐʇs ןɐıɹǝʇɐɯ sʞɐǝɹq ʇıq ןןıɹp buıןǝuunʇ ɯnʇuɐnὉ", "gtocore.lang.bedrock_drilling_rig.1.1768817903": "pɐǝɥ ןןıɹp ǝɥʇ ʍoןǝq ʞɔoɹpǝq sǝɹınbǝᴚ", @@ -3356,7 +3371,7 @@ "gtocore.lang.chemical_complex.5.-1084339066": "uoıʇɐǝɹɔ ɔıʇsıʇɹɐ sɐ ʇuɐbǝןǝ sɐ sı sısǝɥʇuʎs ɹɐןnɔǝןoW", "gtocore.lang.chemical_energy_devourer.3.-1890569742": " oʇ dn ǝɔnpoɹd oʇ ןǝnɟ ɹ§ǝןqnopɐ§ buıɯnsuoɔ 'ɹ§uǝbʎxO pınbıꞀǝ§ ɟo s/ᗺɯ08 ǝpıʌoɹԀ", "gtocore.lang.chemical_energy_devourer.3.31691509": "ʇ/∩Ǝ ", - "gtocore.lang.chemical_energy_devourer.4.-63158004": " oʇ dn ǝɔnpoɹd oʇ ןǝnɟ ɹ§sǝɯıʇ ɹnoɟɐ§ buıɯnsuoɔ 'ɹ§ǝpıxO snoɹʇıNǝ§ ɟo s/ᗺɯ08ㄣ ɐɹʇxǝ ǝpıʌoɹԀ", + "gtocore.lang.chemical_energy_devourer.4.-149782026": " oʇ dn ǝɔnpoɹd oʇ ןǝnɟ ɹ§sǝɯıʇ ɹnoɟɐ§ buıɯnsuoɔ 'ɹ§ǝpıxoɹʇǝ⟘ uǝboɹʇıuıᗡǝ§ ɟo s/ᗺɯ08ㄣ ɐɹʇxǝ ǝpıʌoɹԀ", "gtocore.lang.chemical_energy_devourer.4.31691509": "ʇ/∩Ǝ ", "gtocore.lang.chemical_factory.0.197596055": "ʎɹoʇs uʍo sʇı sןןǝʇ ǝןnɔǝןoɯ ʎɹǝʌǝ 'ʎɹʇsıɯǝɥɔ ɟo pןɹoʍ ǝɥʇ uI", "gtocore.lang.chemical_factory.1.-2092154410": "%ϛ ʎq uoıʇɐɹnp puɐ uoıʇdɯnsuoɔ ʎbɹǝuǝ sǝɔnpǝᴚ 'ןǝʞɔıuoɹdnƆ ǝʌoqɐ ɹǝıʇ ןıoɔ ɥɔɐƎ", @@ -3415,9 +3430,8 @@ "gtocore.lang.comprehensive_tombarthite_processing_facility.4.-329785974": "ןnɟɹǝʍod puɐ ʎpɐǝʇs 'ʇɐǝqʇɹɐǝɥ s,ɥʇɹɐǝ ǝɥʇ ǝןqɯǝsǝɹ uoıʇɐɹǝdo buıɹnp suoıʇɐɹqıʌ uoısıɔǝɹԀ", "gtocore.lang.comprehensive_tombarthite_processing_facility.5.1374549352": "ɥɔɐǝɹ uıɥʇıʍ sʇuǝɯǝןǝ ǝɹɐɹ buıʞɐɯ 'ʎboןouɥɔǝʇ uoıʇɐɹɐdǝs ɥʇɹɐǝ ǝɹɐɹ ɟo ʇuǝɯıpoqɯǝ ǝʇɐɯıʇן∩", "gtocore.lang.conjunction_space_station_module.0.-1983123524": "sǝןnpoW uoıʇɐʇS ǝɔɐdS ןɐıɹʇsnpuI ɟo sǝdʎ⟘", - "gtocore.lang.conversion_simulation_card.0.1367867718": "sɹǝqɯɐɥɔ uoısɹǝʌuoɔ ʞɔoןq ǝbɹɐן ɹoɟ ʇuǝɯuoɹıʌuǝ uoısɹǝʌuoɔ pǝʇɐןnɯıs ɐ sǝpıʌoɹԀ", "gtocore.lang.core_space_station_module.0.-1983123524": "sǝןnpoW uoıʇɐʇS ǝɔɐdS ןɐıɹʇsnpuI ɟo sǝdʎ⟘", - "gtocore.lang.cosmic_celestial_spire_of_convergence.0.-2075807420": "˙ןıɐs buoן-ʎɹnʇuǝɔ ɐ uo ʞɹɐqɯǝ sǝbɐW ʎǝɹ⅁ 'ןıǝʌ ןɐuoısuǝɯıp ǝɥʇ spuǝɹ ʇןnɐʌ ʎɹɹɐʇs ɟo ǝpɐןᗺ", + "gtocore.lang.cosmic_celestial_spire_of_convergence.0.-1401508330": "˙ןıɐs buoן-ʎɹnʇuǝɔ ɐ uo ʞɹɐqɯǝ sǝbɐW bǝɹ⅁ 'ןıǝʌ ןɐuoısuǝɯıp ǝɥʇ spuǝɹ ʇןnɐʌ ʎɹɹɐʇs ɟo ǝpɐןᗺ", "gtocore.lang.cosmic_celestial_spire_of_convergence.1.-348232064": "˙ǝןɐɥs ʞɹɐp ɯoɹɟ sɹǝqɯɐɥɔ pǝɹɔɐs ǝbɹoɟ 'spunoq ɹɐןod uı sǝunɹ ǝuıʌıp ǝʌɹɐƆ 'ןıɐʌǝɹd ʎǝɥʇ sɯןɐǝɹ ɔıʇoɐɥɔ ɥbnoɹɥʇ 'ssǝuןןıʇs s’pıoʌ ǝɥʇ ssoɹɔⱯ", "gtocore.lang.cosmic_celestial_spire_of_convergence.10.1430835709": "suoıʇɔnɹʇsqo ou ɥʇıʍ ʎʞs uǝdo ǝɥʇ oʇ pǝsodxǝ ʎןʇɔǝɹıp ǝq ʇsnW", "gtocore.lang.cosmic_celestial_spire_of_convergence.11.1901526002": "ǝɯıʇʎɐp buıɹnp sıɹɐןoS ǝsuǝpuoɔ uɐƆ", @@ -3431,7 +3445,7 @@ "gtocore.lang.cosmic_celestial_spire_of_convergence.2.1446103170": "˙ןɐǝʌǝɹ ɥʇop ǝɔuɐıpɐɹ s’ɯnʇɔuɐS ǝɥʇ 'ɐǝs-ɹɐʇs uı ʇıן ʇsɹıℲ 'ןǝǝʇs oʇ ʍoɹɹɐɯ-ɹɐʇs ɹǝdɯǝʇ 'sʍɐן ןɐıʇsǝןǝɔ ǝɥʇ ןǝʌɐɹu∩", "gtocore.lang.cosmic_celestial_spire_of_convergence.3.908268921": "˙ɹoɯǝɹʇ ʎʇɥbıɯ ɐ ʇɹɐdɯı ɥʇop pıoʌ ǝɥʇ 'qǝʍ ɐ ǝʌɐǝʍ uooɯ puɐ unS 'ʇɹɐǝɥ s’ǝɹoɔ ǝɥʇ oʇuı pɹɐʍʞɔɐq ǝbɹns sǝıxɐןɐ⅁", "gtocore.lang.cosmic_celestial_spire_of_convergence.4.-1899796545": "˙spuɐן ןɐʌǝɯıɹd ǝɥʇ sɹıʇs ʞɹɐds ʎuıʇ Ɐ 'spuɐʇs ʇı ʇɥbıɯ ןɐuoısuǝɯıp ʎᗺ", - "gtocore.lang.cosmic_celestial_spire_of_convergence.5.-862211846": "˙puɐן ʎןuǝʌɐǝɥ ǝɥʇ ʎɐן ʎןןɐuɹǝʇƎ 'puɐdxǝ ɔıɯsoɔ s’uoıʇɐsıןıʌıɔ ɹoℲ 'puɐɹb ǝןɔɐɹıɯ ɐ ǝbɹoɟ ʇɐǝʍs puɐ pooןq s’ʎǝɹ⅁", + "gtocore.lang.cosmic_celestial_spire_of_convergence.5.-104885272": "˙puɐן ʎןuǝʌɐǝɥ ǝɥʇ ʎɐן ʎןןɐuɹǝʇƎ 'puɐdxǝ ɔıɯsoɔ s’uoıʇɐsıןıʌıɔ ɹoℲ 'puɐɹb ǝןɔɐɹıɯ ɐ ǝbɹoɟ ʇɐǝʍs puɐ pooןq s’bǝɹ⅁", "gtocore.lang.cosmic_celestial_spire_of_convergence.6.1853694950": "sɹɐʇs pǝɹǝɥʇɐb ǝɥʇ ɟo ɹǝʍod ǝɥʇ ǝsuǝpuoƆ", "gtocore.lang.cosmic_celestial_spire_of_convergence.7.1908133572": "buıʞɔoןɔɹǝʌO ɐuɐW ǝןqɐɯnsuoƆ", "gtocore.lang.cosmic_celestial_spire_of_convergence.8.-1594027075": ")ϛ * ןǝʌǝꞀbuıʞɔoןɔɹǝʌo(^ᄅ ʎq ʎɔuǝıɔıɟɟǝ uoıʇɐsuǝpuoɔ sʇsooq 'ǝɯıʇ ɥɔɐǝ sʇuıod ɐuɐɯ )0Ɩ + ㄣ * ןǝʌǝꞀbuıʞɔoןɔɹǝʌo(^ᄅ sǝɯnsuoƆ", @@ -3600,7 +3614,7 @@ "gtocore.lang.fast_neutron_breeder.15.1228212578": "ʎןǝʌıʇɔǝdsǝɹ ΛǝWƖ/ϛᄅ˙0/Ɩ˙0 ʎq ǝɔnpǝɹ ʇsnᗡ ǝʇıɥdɐɹ⅁/ǝןıԀ bıᗺ/ǝןıԀ ןןɐɯS", "gtocore.lang.fast_neutron_breeder.16.727805493": "puoɔǝs ɹǝd Λǝʞ ϛ˙0^)NƎ( ʎq sǝsɐǝɹɔuı xnןɟ uoɹʇnǝu 'ǝɯɐɹɟuıɐɯ ǝɥʇ uı sɹoʇɔǝןɟǝᴚ uoɹʇnǝN ɯnıpıɹI N buıɔɐןd ɹǝʇɟɐ ')Λǝʞ( Ǝ sı xnןɟ uoɹʇnǝu uǝɥM", "gtocore.lang.fast_neutron_breeder.17.-1548239181": "ʞ860ᄅ ʇuıod ןɐɔıʇıɹɔ 'ʞ86ᄅ ǝɹnʇɐɹǝdɯǝʇ ןɐıʇıuI", - "gtocore.lang.fast_neutron_breeder.18.-845117880": "puoɔǝs ǝuo uı ʇuıod ןɐɔıʇıɹɔ ǝɥʇ ɥɔɐǝɹ oʇ ɥbnouǝ 'puoɔǝs ɹǝd ʞ008Ɩ ʎq ǝsıɹ ןןıʍ ǝɹnʇɐɹǝdɯǝʇ ǝןıd ǝɥʇ 'Λǝʞϛ˙ㄣ ǝʌoqɐ sı ʎbɹǝuǝ ɔıʇǝuıʞ uoɹʇnǝu uǝɥʍ 'suoıʇɐןnɔןɐɔ oʇ buıpɹoɔɔⱯ", + "gtocore.lang.fast_neutron_breeder.18.1159230446": "puoɔǝs ǝuo uı ʇuıod ןɐɔıʇıɹɔ ǝɥʇ ɥɔɐǝɹ oʇ ɥbnouǝ 'puoɔǝs ɹǝd ʞ008Ɩ ʎq ǝsıɹ ןןıʍ ǝɹnʇɐɹǝdɯǝʇ ǝןıd ǝɥʇ 'ΛǝWㄥ ǝʌoqɐ sı ʎbɹǝuǝ ɔıʇǝuıʞ uoɹʇnǝu uǝɥʍ 'suoıʇɐןnɔןɐɔ oʇ buıpɹoɔɔⱯ", "gtocore.lang.fast_neutron_breeder.19.-140293769": "dn pǝpunoɹ ʇןnsǝɹ '88˙Ɩ^)0Ɩ×Ǝ(×ㄥᄅ˙Ɩ×ʞ=H :puoɔǝs ɹǝd ɐןnɯɹoɟ uoıʇɐɹǝuǝb ʇɐǝH", "gtocore.lang.fast_neutron_breeder.2.-1346839424": "xnןɟ uoɹʇnǝu ɯnɯıuıɯ sǝɹınbǝɹ ǝdıɔǝᴚ", "gtocore.lang.fast_neutron_breeder.20.1058073012": "08 ɯnıןǝH pınbıꞀ 'ㄣ uǝboɹʇıN pınbıꞀ 'Ɩ ɹǝʇɐM pǝןןıʇsıᗡ :)s/ᗺɯ/ʞ(sʇuǝıɔıɟɟǝoɔ ʇuɐןooƆ", @@ -3643,21 +3657,21 @@ "gtocore.lang.fission_reactor.10.-1097033981": "pǝddoʇs uǝɥʍ ɔǝs/ʞƖ :buıןooɔ ןɐɹnʇɐN", "gtocore.lang.fission_reactor.11.673958219": " pǝbɐɯɐp ʎןןnɟ uǝɥʍ 'ǝuıɥɔɐɯ sǝbɐɯɐp ʇıɯıן ǝɹnʇɐɹǝdɯǝʇ buıpǝǝɔxƎ", "gtocore.lang.fission_reactor.12.-916343722": "ɯǝʇsʎs buıןooƆ", - "gtocore.lang.fission_reactor.13.-570274144": "ʎoןןɐ ɯnıssɐʇod-ɯnıpos ɹo ɹǝʇɐʍ pǝןןıʇsıᗡ :sǝdʎʇ pınbıן buıןooƆ", + "gtocore.lang.fission_reactor.13.-1660298463": ")0ᄅ( ɯnıssɐʇoԀ ɯnıpoS )008( ɹǝʇɐM pǝןןıʇsıᗡ :)sʇuǝıɔıɟɟǝoɔ( pınbıן buıןooƆ", "gtocore.lang.fission_reactor.14.-461574819": "puɐɯǝp ≥ ʎןddnS :uoıʇıpuoɔ buıןooƆ", - "gtocore.lang.fission_reactor.15.-1155863786": "00ϛƖ / dɯǝʇ ʇuǝɹɹnɔ × ןǝןןɐɹɐd ןɐnʇɔɐ × ɯɐɹɐd buıןooɔ × ʇɐǝɥ ǝdıɔǝɹ = puɐɯǝp uıW", - "gtocore.lang.fission_reactor.16.674459852": "8 × )Ɛ/ʇuǝɔɐظpɐ - sʇuǝuodɯoɔ buıןooɔ( = ʎןddns xɐW", - "gtocore.lang.fission_reactor.17.1037486894": "ʇuǝıɔıɟɟǝoɔ pınbıן buıןooɔ × puɐɯǝp = uoıʇdɯnsuoƆ", + "gtocore.lang.fission_reactor.15.2020151051": "00ϛƖ / dɯǝʇ ʇuǝɹɹnɔ × ןǝןןɐɹɐd ןɐnʇɔɐ × ʇɐǝɥ ǝdıɔǝɹ = puɐɯǝᗡ", + "gtocore.lang.fission_reactor.16.-1344879984": "8 × )Ɛ/ʇuǝɔɐظpɐ - sʇuǝuodɯoɔ buıןooɔ( = ʎןddnS", + "gtocore.lang.fission_reactor.17.1656673038": "ʇuǝıɔıɟɟǝoɔ pınbıן buıןooɔ × puɐɯǝᗡ = uoıʇdɯnsuoƆ", "gtocore.lang.fission_reactor.18.682210113": "ɯsıuɐɥɔǝɯ buıʞɔoןɔɹǝʌO", - "gtocore.lang.fission_reactor.19.-971847264": "Ɩ>u( puɐɯǝp × u ≥ ʎןddnS :uoıʇıpuoɔ ɹǝbbıɹ⟘", + "gtocore.lang.fission_reactor.19.-62494071": ")Ɩ>u( puɐɯǝp × u ≥ ʎןddnS :uoıʇıpuoɔ ɹǝbbıɹ⟘", "gtocore.lang.fission_reactor.2.-1593095757": "ןɐıʇuǝʇod s,ǝuıɥɔɐɯ sıɥʇ ɥsɐǝןun ʎןןnɟ oʇ ʇuɐןooɔ ʞɐN ǝɔnpoɹd uɐɔ ɥɔǝʇ ןɐɔıɯǝɥɔ pǝɔuɐʌpɐ s,⟘⅁ sɯıɐןɔ ǝH", "gtocore.lang.fission_reactor.2.-162474227": "ɹǝqɯnu ןǝןןɐɹɐd ɯnɯıxɐɯ sǝpıʌoɹԀ :ʇuǝuodɯoɔ ןǝnℲ", - "gtocore.lang.fission_reactor.20.-1470811327": "ǝɯıʇ ǝdıɔǝɹ spuoɔǝs u ǝɔnpǝᴚ :ʇɔǝɟɟǝ buıʞɔoןɔɹǝʌO", + "gtocore.lang.fission_reactor.20.-1889434194": "sǝɯıʇ u oʇ pǝsɐǝɹɔuı pǝǝds uoıʇɐɹǝdO :ʇɔǝɟɟǝ buıʞɔoןɔɹǝʌO", "gtocore.lang.fission_reactor.21.629215326": "ʇndʇno pınbıן buıןooƆ", - "gtocore.lang.fission_reactor.22.135781624": " :buıןooɔ ɹǝʇɐʍ pǝןןıʇsıᗡ", + "gtocore.lang.fission_reactor.22.-861236008": " :buıןooɔ ɹǝʇɐM pǝןןıʇsıᗡ", "gtocore.lang.fission_reactor.23.-688763008": ")))ǝɹnʇɐɹǝdɯǝʇ-ƐㄥƐ(^ㄣ˙Ɩ(/09Ɩ '09Ɩ(uıɯ × uoıʇdɯnsuoɔ = ʇndʇnO 'ɯɐǝʇs sǝɔnpoɹԀ", - "gtocore.lang.fission_reactor.24.1887171541": ":buıןooɔ ʎoןןɐ ɯnıssɐʇod-ɯnıpoS", - "gtocore.lang.fission_reactor.25.-1147508056": "ʎoןןɐ ɯnıssɐʇod-ɯnıpos ןɐɔıʇıɹɔɹǝdnS :ʞϛᄅ8> ؛ʎoןןɐ ɯnıssɐʇod-ɯnıpos ʇoH :ʞϛᄅ8≤", + "gtocore.lang.fission_reactor.24.1145967411": ":buıןooɔ ɯnıssɐʇoԀ ɯnıpoS", + "gtocore.lang.fission_reactor.25.-139514968": "ɯnıssɐʇoԀ ɯnıpoS ןɐɔıʇıɹɔɹǝdnS :ʞϛᄅ8> ؛ɯnıssɐʇoԀ ɯnıpoS ʇoH :ʞϛᄅ8≤", "gtocore.lang.fission_reactor.3.-1623337062": "Ɩ + sʇuǝuodɯoɔ ןǝnɟ ʇuǝɔɐظpɐ = ʇuǝıɔıɟɟǝoɔ buıʇɐǝH", "gtocore.lang.fission_reactor.3.-1833223094": "ɹǝddoɥ-qoظ ɐ ɯoɹɟ ʇɔǝdxǝ noʎ uɐɔ ʎʇsǝuoɥ ɥɔnɯ ʍoɥ ןןɐ ɹǝʇɟɐ 'ɥʇnɹʇ ǝɥʇ sʍouʞ ǝuo oN", "gtocore.lang.fission_reactor.4.668971985": "ʎʇıןıqɐdɐɔ buıןooɔ ɯnɯıxɐɯ sǝpıʌoɹԀ :ʇuǝuodɯoɔ buıןooƆ", @@ -3780,7 +3794,7 @@ "gtocore.lang.holy_separator.2.-1124245426": "ןɐnʇıɹ uoıʇɐɔıɟıɹnd pǝɹɔɐs ɐ ǝʞıן uoıʇɐbnɟıɹʇuǝɔ buıʞɐɯ 'ɯɹoɟʇɐןd buıʇɐʇoɹ ǝʞıן-ɹɐʇןⱯ", "gtocore.lang.holy_separator.3.205609803": "suɯʎɥ uoıʇɐɹɐdǝs buıʇuɐɥɔ ǝʞıן 'ɯnɥ ʎɔuǝnbǝɹɟ-ʍoן uɯǝןos sʇıɯƎ", "gtocore.lang.holy_separator.4.-1480114238": "ʇɹɐ uoıʇɐɹɐdǝs ʇuɐbǝןǝ ʇsoɯ ǝɥʇ ǝɯoɔǝq sǝɔuǝɹǝɟɟıp ʎʇısuǝᗡ", - "gtocore.lang.hyper_cube_machine.0.365030754": "ǝbɐɹoʇs ɥʇoq ɹo ɯǝʇı ɹo pınןɟ ɐ ʎxoɹԀ", + "gtocore.lang.hyper_cube_machine.0.-1568948399": "sǝbɐɹoʇs ɥʇoq ɹo ɯǝʇı ɹo pınןɟ ɐ ʎxoɹԀ", "gtocore.lang.hyper_cube_machine.1.188391162": "ʞɔoןq ǝbɐɹoʇs ɐ puıq oʇ ɹ§pɹɐƆ ǝʇɐuıpɹoƆq§ ǝɥʇ ǝs∩", "gtocore.lang.hyper_cube_machine.2.-178785670": "ǝbɐɹoʇs punoq ǝɥʇ ǝɹǝʍ ʇı ɟı sɐ ʇı ǝʇɐɹǝdo oʇ ǝuıɥɔɐɯ sıɥʇ oʇ ǝbɐɹoʇs ɐ puıᗺ", "gtocore.lang.hyper_cube_machine.3.-306503171": "ǝɔɐɟɹǝʇuı ǝɥʇ uǝdo oʇ ʞɔıןɔ ʇɥbıᴚ", @@ -3802,7 +3816,7 @@ "gtocore.lang.industrial_platform_deployment_tools.5.-1450367514": "sןoo⟘ ʇuǝɯʎoןdǝᗡ ɯɹoɟʇɐןԀ ןɐıɹʇsnpuI", "gtocore.lang.industrial_platform_deployment_tools.5.958391167": " :sןoo⟘ snoןnɔɐɹıW", "gtocore.lang.industrial_platform_deployment_tools.6.1699145324": "sʇuıɹdǝnןq ʇǝsǝɹd ɐıʌ sǝsɐq ןɐıɹʇsnpuı ʎoןdǝp ʎןpıdɐᴚ", - "gtocore.lang.industrial_platform_deployment_tools.7.-1645570500": "˙sןɐıɹǝʇɐɯ uoıʇɔnɹʇsuoɔ ɔısɐq sɐ sʇuǝuodɯoɔ sʇuǝuodɯoɔ ןɐıɹʇsnpuı ɔıɟıɔǝds sǝɹınbǝᴚ", + "gtocore.lang.industrial_platform_deployment_tools.7.1832452560": "˙sןɐıɹǝʇɐɯ uoıʇɔnɹʇsuoɔ ɔısɐq sɐ sʇuǝuodɯoɔ ןɐıɹʇsnpuı ɔıɟıɔǝds sǝɹınbǝᴚ", "gtocore.lang.industrial_platform_deployment_tools.8.525488636": "˙sןɐıɹǝʇɐɯ ʎɹɐʇuǝɯǝןddns ǝɹınbǝɹ sʇuıɹdǝnןq pǝɔuɐʌpɐ ǝɯoS", "gtocore.lang.industrial_platform_deployment_tools.9.-373629456": "ןooʇ uoıʇɔnɹʇsuoɔ ǝsɐq ןɐıɹʇsnpuı ǝpɐɹb-ןɐuoıssǝɟoɹԀ", "gtocore.lang.industrial_platform_deployment_tools.introduction.0.166055481": "sɯɹoɟʇɐןd ןɐıɹʇsnpuı pǝzıpɹɐpuɐʇs ʎoןdǝp ʎןʞɔınὉ", @@ -3825,7 +3839,7 @@ "gtocore.lang.industrial_platform_deployment_tools.introduction.24.1066829591": "uoıʇɔunℲ ʇɹodxƎ ʇuıɹdǝnןᗺ", "gtocore.lang.industrial_platform_deployment_tools.introduction.25.1469547294": "ǝpoɯ ʇɹodxǝ ǝʇɐʌıʇɔɐ oʇ sʇoןs ɯoʇʇoq s,ןooʇ ǝɥʇ oʇuı spɹɐɔ ǝʇɐuıpɹooɔ oʍʇ ʇɹǝsuI", "gtocore.lang.industrial_platform_deployment_tools.introduction.26.-2113609600": "ʎɹoʇısodǝɹ ʎʇıunɯɯoɔ ǝɥʇ oʇ sʇuıɹdǝnןq ʎʇıןɐnb-ɥbıɥ ʇıɯqns oʇ ǝɯoɔןǝM", - "gtocore.lang.industrial_platform_deployment_tools.introduction.27.2127441005": "sǝɹɐnbs ןןɐɯs puɐ sʞɔoןq ǝɯɐɹɟ buıʇɹoddns ʇoN", + "gtocore.lang.industrial_platform_deployment_tools.introduction.27.155189904": "sǝןı⟘ǝןʇʇıꞀ ɹo sʞɔoןᗺpǝɯɐɹℲ ʇɹoddns ʇou sǝoᗡ", "gtocore.lang.industrial_platform_deployment_tools.introduction.3.-2069210991": "˙sɹǝʇuǝɔ ǝbɐɹoʇs puɐ sdoɥsʞɹoʍ buıuıɟǝɹ ɥʇıʍ sɹǝʇsnןɔ ןɐıɹʇsnpuı xǝןdɯoɔ oʇuı puɐdxǝ puɐ suoıʇɐʇs buıʇɹos ǝɹo ǝʞıן sǝpou uoıʇɔnpoɹd ɔısɐq pןınq ʎןʞɔınb ɥʇoq uɐɔ ʇI", "gtocore.lang.industrial_platform_deployment_tools.introduction.4.1073467762": "uoıʇɐuɐןdxƎ ǝɔɐɟɹǝʇuI", "gtocore.lang.industrial_platform_deployment_tools.introduction.5.-1070998781": "sɹǝʇǝɯɐɹɐd ʇuǝɯʎoןdǝp buıʇsnظpɐ puɐ 'sʇsıן ןɐıɹǝʇɐɯ buıʍǝıʌ 'sǝɹnʇɔnɹʇs buıʍǝıʌǝɹd 'sʇǝsǝɹd buıɹǝʇןıɟ/buısʍoɹq ɹoℲ - ǝbɐԀ uoıʇɔǝןǝS ʇuıɹdǝnןᗺ ˙Ɩ", @@ -3958,7 +3972,7 @@ "gtocore.lang.large_space_station.0.-171313362": "sɹɐǝʎ ʎuɐɯ ɹoɟ buıʇɐɹǝdo ʎןןnɟssǝɔɔns uǝǝq sɐɥ uoıʇɐʇs ǝɔɐds s,dnoɹ⅁ ǝsɹǝʌıu∩ O⟘⅁", "gtocore.lang.large_space_station.1.-231416899": "uoıʇɐʇs ǝɔɐds ɹǝbɹɐן ɐ pןınq oʇ pǝpıɔǝp dnoɹ⅁ ǝsɹǝʌıu∩ O⟘⅁ 'sǝuıɥɔɐɯ ɹǝbɹɐן puɐ ǝɹoɯ ɟo spǝǝu ǝɥʇ ʇǝǝɯ o⟘", "gtocore.lang.large_space_station.1.-842118898": "uoıʇɐıpɐɹ ǝɔɐds sɐ ɥɔns sʇuǝɯuoɹıʌuǝ xǝןdɯoɔ ɯoɹɟ sǝuıɥɔɐɯ sʇɔǝʇoɹd ʇɐɥʇ ǝɔɐds ɐ sǝpıʌoɹԀ", - "gtocore.lang.large_space_station.11.-137832514": "ʇ/∩Ǝ0ᄅ6Ɩ ɟo uoıʇdɯnsuoɔ ʎbɹǝuǝ ǝsɐq ɐ sǝɹınbǝɹ uoıʇɐɹǝdO", + "gtocore.lang.large_space_station.11.-761641233": "ʇ/∩Ǝ089ㄥ ɟo uoıʇdɯnsuoɔ ʎbɹǝuǝ ǝsɐq ɐ sǝɹınbǝɹ uoıʇɐɹǝdO", "gtocore.lang.large_space_station.12.538665093": "pǝןןɐʇsuı sǝןnpoɯ uoısuɐdxǝ ɟo ɹǝqɯnu ǝɥʇ uo pǝsɐq uoıʇdɯnsuoɔ ǝɔɹnosǝɹ puɐ uoıʇdɯnsuoɔ ʎbɹǝuǝ ןɐuoıʇıppɐ ǝsɐǝɹɔuı ןןıM", "gtocore.lang.large_space_station.13.-1933155152": ":puoɔǝs ʎɹǝʌǝ uoıʇdɯnsuoɔ pǝxıℲ", "gtocore.lang.large_space_station.14.-439688291": "ɹǝʇɐM pǝןןıʇsıᗡ )sǝןnpoɯ uoısuɐdxǝ ɟo ɹǝqɯnu + Ɩ( * ᗺɯϛƖ", @@ -3995,13 +4009,13 @@ "gtocore.lang.large_steam_circuit_assembler.6.1319503679": "uoıʇɔunɟ buıʞɔoןɔɹǝʌo sʞɔoןu∩", "gtocore.lang.large_steam_circuit_assembler.7.1488230621": "uoıʇɐɔıןdıʇןnW ʇınɔɹıƆ", "gtocore.lang.large_steam_circuit_assembler.8.1977435861": ")ʇןnɐɟǝp ʎq pǝןqɐuƎ( ʇndʇno ʇınɔɹıɔ sǝıןdıʇןnɯ ǝpoW ʎןdıʇןnW", - "gtocore.lang.large_steam_cracker.0.-1674002160": "ɹǝʞɔɐɹɔ ןɐɯɹou ɐ ɟo ʇɐɥʇ ɟo %08 ʎןuo sı ʎɔuǝıɔıɟɟǝ ןɐıɹǝʇɐɯ ʍɐɹ ǝɥ⟘", - "gtocore.lang.large_steam_cracker.1.-40088499": "%0ᄅ ʎq sǝsɐǝɹɔuı ʎɔuǝıɔıɟɟǝ ןɐıɹǝʇɐɯ ʍɐɹ ǝɥʇ 'pǝsn ɥɔʇɐɥ ʇnduı ɯɐǝʇs ɟo ןǝʌǝן ɹǝɥbıɥ ɥɔɐǝ ɹoℲ", + "gtocore.lang.large_steam_cracker.0.1217765388": "ɹǝʞɔɐɹɔ ןɐɯɹou ɐ ɟo ʇɐɥʇ ɟo %0ㄣ ʎןuo sı ʎɔuǝıɔıɟɟǝ ןɐıɹǝʇɐɯ ʍɐɹ ǝɥ⟘", + "gtocore.lang.large_steam_cracker.1.1027096257": "qɯ00Ɩ ʎq sǝsɐǝɹɔuı ʇndʇno ǝɥʇ 'pǝsn ɥɔʇɐɥ ʇnduı ɯɐǝʇs ɟo ןǝʌǝן ɹǝɥbıɥ ɥɔɐǝ ɹoℲ", "gtocore.lang.large_steam_solar_boiler.0.-1779936924": "uoıʇıpɐɹʇ ןɐɹʇsǝɔuɐ s,ʎuɐdɯoɔ ǝɥʇ uǝǝq sʎɐʍןɐ sɐɥ ǝɹnʇɐu uo buıʎןǝᴚ", "gtocore.lang.large_steam_solar_boiler.1.-2105861460": "ʎq ʇǝb oʇ ʇɐןɟ ʇno ɯǝɥʇ ʎɐן ʇsnظ ǝʍ os sןǝuɐd ɹɐןos ɥɔǝʇ-ɥbıɥ ǝʞɐɯ ʇ,uɐɔ spoɥʇǝɯ ʇuǝıɔuɐ ʇnᗺ", "gtocore.lang.large_steam_solar_boiler.2.2028482001": "ʇı ʇnoqɐ suıɐןdɯoɔ ǝuo ou os ǝǝɹɟ s,ʇı ʎɐʍʎuⱯ", "gtocore.lang.large_turbine.4.-1092594663": "pǝǝds xᄅ suıɐ⅁", - "gtocore.lang.large_turbine.5.-334038057": "ʎɔuǝıɔıɟɟǝ ǝuıqɹnʇ %0ᄅƖ ןɐuoıʇıppɐ suıɐ⅁", + "gtocore.lang.large_turbine.5.944353312": "ʎɔuǝıɔıɟɟǝ ǝuıqɹnʇ %0ᄅ ןɐuoıʇıppɐ suıɐ⅁", "gtocore.lang.large_turbine.6.1503536831": "xᄅ sǝɯoɔǝq ǝʇɐɹ ɹɐǝʍ ɹoʇoᴚ", "gtocore.lang.large_void_miner.0.1610129296": "pǝıɹɹoʍ ʇɐɥʍǝɯos pǝʞooן uɐɯɹıɐɥɔ ǝɥʇ 'ʇɹoɥs buıuunɹ ʎןןɐnpɐɹb ǝsnoɥǝɹɐʍ ǝɥʇ uı sןɐɹǝuıɯ ǝɥʇ buıɥɔʇɐM", "gtocore.lang.large_void_miner.0.2128106565": "ǝpoW uoısıɔǝɹԀ", @@ -4056,7 +4070,7 @@ "gtocore.lang.mana_amplifier_hatch.3.898412636": "˙ᄅx ʎq pǝıןdıʇןnɯ ɹǝɥʇɹnɟ sı ɹoʇɔɐɟ buıʞɔoןɔɹǝʌo ǝɥʇ 'sǝuıɥɔɐɯ ǝdıɔǝɹ-ssoɹɔ ɹoℲ", "gtocore.lang.mana_amplifier_hatch.4.-507469829": "˙ǝdıɔǝɹ ǝɥʇ ǝʇnɔǝxǝ ʇou ןןıʍ ǝuıɥɔɐɯ ǝɥʇ 'ǝsıʍɹǝɥʇO", "gtocore.lang.mana_heater.1.724409426": "ʇɐǝɥ oʇ ɐuɐɯ ʇnduI", - "gtocore.lang.mana_heater.2.-1602020602": "ɹǝʇsɐɟ sǝɯıʇ ϛ ǝq ןןıʍ pǝǝds buıʇɐǝɥ ǝɥʇ 'ʇnduı sı ɹ§sɐb ʇuǝɯǝןǝ ǝɹıɟɔ§ ɟI", + "gtocore.lang.mana_heater.2.1577697679": "ɹǝʇsɐɟ sǝɯıʇ ϛ ǝq ןןıʍ pǝǝds buıʇɐǝɥ ǝɥʇ 'ʇnduı sı ɹ§ɹodɐΛ ɹǝpuɐɯɐןɐSɔ§ ɟI", "gtocore.lang.mantle_crusher.0.1155931590": "ןןɐ ɥsnɹɔ oʇ ɹǝʍod ǝןʇuɐɯ buıssǝuɹɐɥ 'ǝɹoɔ s,ɥʇɹɐƎ ɟo uoıʇɐuɹɐɔuı ןɐıɹʇsnpuI", "gtocore.lang.mantle_crusher.1.-275128847": "ɹǝʍod buıɥsnɹɔ ןǝʌǝן-ǝןʇuɐɯ ǝɥʇ oʇ ʇsǝɹ ǝɥʇ ǝʌɐǝן puɐ 'uı sʞɔoɹ ǝɥʇ ʍoɹɥʇ ʇsnſ", "gtocore.lang.mantle_crusher.2.-1262270807": "ǝɹǝɥ sǝןɔıʇɹɐd ʇsǝuıɟ ǝɥʇ oʇuı pǝɥsnɹɔ ǝq uɐɔ ןɐıɹǝʇɐɯ ʎuɐ 'ǝʇsɐʍ oʇ sǝɹo ɯoɹℲ", @@ -4085,6 +4099,7 @@ "gtocore.lang.me_pattern_hatch.1.1438463364": "ʞɔıןɔ ǝuo ɯǝɥʇ ǝʇnqıɹʇsıp puɐ suɹǝʇʇɐd ʇnd uɐƆ", "gtocore.lang.me_pattern_hatch.2.90273460": "ɹǝɥʇo ɥɔɐǝ ɥʇıʍ ǝɹǝɟɹǝʇuı ʇou op 'ɹǝɥʇo ɥɔɐǝ ɯoɹɟ pǝʇɐןosı ǝɹɐ suɹǝʇʇɐԀ", "gtocore.lang.me_pattern_hatch.3.-303408860": "ʇnduı ןɐıɔǝds ǝpıʌoɹd ɹo ʇınɔɹıɔ ǝɥʇ ʇǝs oʇ uɹǝʇʇɐd ǝɥʇ uo uoʇʇnq ǝsnoɯ ǝןppıɯ ǝɥʇ ssǝɹԀ", + "gtocore.lang.me_pattern_hatch.4.228256588": "sbuıʇʇǝs uʍo s,ǝuıɥɔɐɯ ǝɥʇ ʎq pǝʇɔıɹʇsǝɹun 'sǝdʎʇ ǝdıɔǝɹ ʇɔǝןǝs ʎןʇuǝpuǝdǝpuı uɐƆ", "gtocore.lang.me_storage.0.1603758035": "ǝbɐɹoʇS ƎW", "gtocore.lang.me_storage.1.69447024": "suoıʇɔıɹʇsǝɹ ǝdʎʇ ǝbɐɹoʇs ʇnoɥʇıM", "gtocore.lang.me_storage.2.-1248245399": "˙ʎʇıɔɐdɐɔ ǝsɐǝɹɔuı oʇ ǝɹnʇɔnɹʇs uı sǝɹoƆ ǝbɐɹoʇS ןןɐʇsuI", @@ -4565,8 +4580,8 @@ "gtocore.lang.rotor_hatch.1.254780438": "ʎʇıןıqɐɹnp puɐ ʎɔuǝıɔıɟɟǝ ʇuǝɹǝɟɟıp ǝʌɐɥ sɹoʇoɹ ɟo sǝdʎʇ ʇuǝɹǝɟɟıᗡ", "gtocore.lang.satellite_control_center.0.-581836799": "ɐʇɐp ʇǝuɐןd ʞɔɐq buıɹq puɐ ǝʇıןןǝʇɐs ɐ ɥɔunɐꞀ", "gtocore.lang.sensor.0.-908223020": "ןɐubıS ǝuoʇspǝᴚ", - "gtocore.lang.sensor.1.-547927712": "uǝǝʍʇǝq uı uǝɥʍ ㄣƖ-Ɩ uǝǝʍʇǝq ןɐubıs ǝuoʇspǝɹ buısɐǝɹɔuı uɐ ɹo 'ɯnɯıxɐɯ ǝɥʇ ǝʌoqɐ ɹo ɯnɯıuıɯ ǝɥʇ ʍoןǝq sı ǝnןɐʌ ǝɥʇ uǝɥʍ 0 sʇndʇno 'pǝʇɹǝʌuı ʇou uǝɥM", - "gtocore.lang.sensor.2.1092475273": "uǝǝʍʇǝq uı uǝɥʍ ㄣƖ-Ɩ uǝǝʍʇǝq ןɐubıs ǝuoʇspǝɹ buısɐǝɹɔǝp ɐ ɹo 'ɯnɯıuıɯ ǝɥʇ ʍoןǝq ɹo ɯnɯıxɐɯ ǝɥʇ ǝʌoqɐ sı ǝnןɐʌ ǝɥʇ uǝɥʍ ϛƖ sʇndʇno 'pǝʇɹǝʌuı uǝɥM", + "gtocore.lang.sensor.1.805381985": "uǝǝʍʇǝq uı uǝɥʍ ϛƖ-Ɩ uǝǝʍʇǝq ןɐubıs ǝuoʇspǝɹ buısɐǝɹɔuı uɐ ɹo 'ɯnɯıxɐɯ ǝɥʇ ǝʌoqɐ ɹo ɯnɯıuıɯ ǝɥʇ ʍoןǝq sı ǝnןɐʌ ǝɥʇ uǝɥʍ 0 sʇndʇno 'pǝʇɹǝʌuı ʇou uǝɥM", + "gtocore.lang.sensor.2.-1849182326": "uǝǝʍʇǝq uı uǝɥʍ ϛƖ-Ɩ uǝǝʍʇǝq ןɐubıs ǝuoʇspǝɹ buısɐǝɹɔǝp ɐ ɹo 'ɯnɯıuıɯ ǝɥʇ ʍoןǝq ɹo ɯnɯıxɐɯ ǝɥʇ ǝʌoqɐ sı ǝnןɐʌ ǝɥʇ uǝɥʍ ϛƖ sʇndʇno 'pǝʇɹǝʌuı uǝɥM", "gtocore.lang.sintering_furnace.0.-1087549334": "ʇuǝɯdınbǝ ǝɹoɔ ǝɥʇ sⱯ", "gtocore.lang.sintering_furnace.1.-2079148997": "ǝɔɐuɹnɟ buıɹǝʇuıs sıɥʇ ɹoɟ sʇɥbıu puɐ sʎɐp ssǝןʇunoɔ ʇɥbnoɟ sɟɟɐʇS O⟘⅁", "gtocore.lang.sintering_furnace.2.-1564634528": "ǝʇɐɹ ʇɔnpoɹd pǝɥsıuıɟ ʇɔǝɟɹǝd sɐɥ ǝɔɐuɹnɟ buıɹǝʇuıs Ɩㄣ-SƆH ןǝpoW", @@ -4617,9 +4632,9 @@ "gtocore.lang.space_probe_surface_reception.4.1443410799": "ʇunoɔ ǝןnpoɯ ǝɹǝɥds uosʎᗡ uo pǝsɐq uoıʇɔnpoɹd sǝsɐǝɹɔuI", "gtocore.lang.space_probe_surface_reception.5.1355476240": "ǝɹǝɥds uosʎᗡ ǝɥʇ ǝbɐɯɐp ʇou ןןıʍ uoıʇɐɹǝdo sıɥ⟘", "gtocore.lang.space_shield_hatch.0.-286075237": "pǝdoןǝʌǝp ʎןןnɟ ʇou sɐʍ ʎboןouɥɔǝʇ uoıʇɐʇs ǝɔɐds ,sǝıɹʇsnpuI ʎʌɐǝH ןɐsɹǝʌıu∩ O⟘⅁ uǝɥʍ sɹǝɥɔɹɐǝsǝɹ ʎq pǝdoןǝʌǝp ʎןʇuǝbɹn pןǝıɥs ǝʌıʇɔǝʇoɹd ןןɐɯs Ɐ", - "gtocore.lang.space_shield_hatch.1.214640611": "ǝɔuǝɹǝɟɹǝʇuı ʇuǝɯuoɹıʌuǝ ǝɔɐds oʇ ǝnp ǝʇɐɹǝdo oʇ ǝןqɐun buıǝq ɯoɹɟ sǝuıɥɔɐɯ ʇɔǝʇoɹd ʍou uɐɔ ʇı 'sʇuǝɯǝʌoɹdɯı ןɐɔıuɥɔǝʇ ɹǝʇɟⱯ", + "gtocore.lang.space_shield_hatch.1.-1725316429": "ǝɔuǝɹǝɟɹǝʇuı ʇuǝɯuoɹıʌuǝ ǝɔɐds ɯoɹɟ sǝuıɥɔɐɯ ʇɔǝʇoɹd ʍou uɐɔ ʇı 'sʇuǝɯǝʌoɹdɯı ןɐɔıuɥɔǝʇ ɹǝʇɟⱯ", "gtocore.lang.space_shield_hatch.2.1525594846": "ǝuıɥɔɐɯ ǝɥʇ uı sǝɥɔʇɐɥ ɹǝsɐן uı-ʇןınq ʎq pǝpıʌoɹd sɹǝsɐן sǝɹınbǝᴚ", - "gtocore.lang.space_shield_hatch.4.1078238127": "ǝɔuǝɹǝɟɹǝʇuı ʇuǝɯuoɹıʌuǝ ǝɔɐds oʇ ǝnp ǝʇɐɹǝdo oʇ ǝןqɐun buıǝq ɯoɹɟ sǝuıɥɔɐɯ sʇɔǝʇoɹԀ", + "gtocore.lang.space_shield_hatch.4.969054311": "ǝɔuǝɹǝɟɹǝʇuı ʇuǝɯuoɹıʌuǝ ǝɔɐds ɯoɹɟ sǝuıɥɔɐɯ sʇɔǝʇoɹԀ", "gtocore.lang.space_shield_hatch.5.362873821": "ǝɯıʇ ǝɯɐs ǝɥʇ ʇɐ sǝɥɔʇɐɥ ɹǝsɐן ɥʇıʍ pǝddınbǝ ǝq oʇ ǝuıɥɔɐɯ ǝɥʇ sǝɹınbǝᴚ", "gtocore.lang.space_station.0.-1759943409": "uoıʇɐʇS ǝɔɐdS s,dnoɹ⅁ ǝsɹǝʌıu∩ O⟘⅁ oʇ ǝɯoɔןǝM", "gtocore.lang.space_station.1.-842118898": "uoıʇɐıpɐɹ ǝɔɐds sɐ ɥɔns sʇuǝɯuoɹıʌuǝ xǝןdɯoɔ ɯoɹɟ sǝuıɥɔɐɯ sʇɔǝʇoɹd ʇɐɥʇ ǝɔɐds ɐ sǝpıʌoɹԀ", @@ -4760,18 +4775,18 @@ "gtocore.lang.the_primordial_reconstructor.14.177619011": "sɐʌuɐƆ xıɟɟⱯ uɐ sǝɹınbǝɹ puɐ 'ǝzısǝɥʇuʎs oʇ ɹǝʍod ɔıbɐɯ ǝɯnsuoƆ", "gtocore.lang.the_primordial_reconstructor.15.-1607911616": "ǝbɹǝW ɯǝ⅁ :8 ʇınɔɹıƆ", "gtocore.lang.the_primordial_reconstructor.16.304631115": "sɯǝb ǝbɹǝɯ oʇ ʇsnp ɯǝb puɐ sןɐıɹǝʇɐɯ ʎʇıɹɐɹ ɟo ןǝʌǝן ǝɯɐs ǝɥʇ ǝs∩", - "gtocore.lang.the_primordial_reconstructor.17.-1023124673": "buıɥsnɹƆ ɯǝ⅁ :8 ʇınɔɹıƆ", + "gtocore.lang.the_primordial_reconstructor.17.484427136": "buıɥsnɹƆ ɯǝ⅁ :6 ʇınɔɹıƆ", "gtocore.lang.the_primordial_reconstructor.18.1377677116": "ʇsnp ɯǝb uıɐʇqo oʇ sɯǝb buıɥsnɹƆ", - "gtocore.lang.the_primordial_reconstructor.19.1043709144": "ʇuǝɯʇuɐɥɔuǝ pǝɔɹoℲ :6 ʇınɔɹıƆ", + "gtocore.lang.the_primordial_reconstructor.19.-1859407092": "ʇuǝɯʇuɐɥɔuǝ pǝɔɹoℲ :0Ɩ ʇınɔɹıƆ", "gtocore.lang.the_primordial_reconstructor.2.-1834983047": "ןɐʍɐɹpɥʇıM ɟo ןıbıS sɐʌuɐƆ xıɟɟⱯ ʞooᗺ ʇnduı sǝɹınbǝᴚ", "gtocore.lang.the_primordial_reconstructor.20.-1573633020": "ɯǝʇı ǝɥʇ oʇ ʞooq pǝʇuɐɥɔuǝ ǝɥʇ ɯoɹɟ ʇuǝɯʇuɐɥɔuǝ ǝɥʇ sppɐ ʎןqıɔɹoɟ oʇ ɹǝʍod ɔıbɐɯ ǝɯnsuoƆ", - "gtocore.lang.the_primordial_reconstructor.21.20755412": "sǝxıɟɟɐ ppɐ pǝɔɹoℲ :0Ɩ ʇınɔɹıƆ", + "gtocore.lang.the_primordial_reconstructor.21.232106325": "sǝxıɟɟɐ ppɐ pǝɔɹoℲ :ƖƖ ʇınɔɹıƆ", "gtocore.lang.the_primordial_reconstructor.22.150684258": "ɯǝʇı ǝɥʇ oʇ sɐʌuɐɔ xıɟɟɐ ǝɥʇ ɯoɹɟ sǝxıɟɟɐ ǝɥʇ sppɐ ʎןqıɔɹoɟ oʇ ɹǝʍod ɔıbɐɯ ǝɯnsuoƆ", - "gtocore.lang.the_primordial_reconstructor.23.1946350774": "ʎʇıɹɐɹ ɯǝʇı ʎɟıpoɯ ʎןןnɟǝɔɹoℲ :ƖƖ ʇınɔɹıƆ", + "gtocore.lang.the_primordial_reconstructor.23.-63753067": "ʎʇıɹɐɹ ɯǝʇı ʎɟıpoɯ ʎןןnɟǝɔɹoℲ :ᄅƖ ʇınɔɹıƆ", "gtocore.lang.the_primordial_reconstructor.24.1541758190": "ʎʇıɹɐɹ ǝɥʇ ǝbuɐɥɔ ʎןqıɔɹoɟ oʇ ɥʇɹıqǝɹ ɟo ןıbıs puɐ ןɐıɹǝʇɐɯ ʎʇıɹɐɹ ɹǝʇuǝ puɐ ɹǝʍod ɔıbɐɯ ǝɯnsuoƆ", - "gtocore.lang.the_primordial_reconstructor.25.2115773330": "sʇǝʞɔos ɟo uoıʇıppɐ pǝɔɹoℲ :ᄅƖ ʇınɔɹıƆ", + "gtocore.lang.the_primordial_reconstructor.25.-1486092269": "sʇǝʞɔos ɟo uoıʇıppɐ pǝɔɹoℲ :ƐƖ ʇınɔɹıƆ", "gtocore.lang.the_primordial_reconstructor.26.2025332053": "sʇǝʞɔos ɟo uoıʇıppɐ ʎןqıɔɹoɟ oʇ buıʇǝʞɔos ɟo ןıbıs ɹǝʇuǝ puɐ ɹǝʍod ɔıbɐɯ ǝɯnsuoƆ", - "gtocore.lang.the_primordial_reconstructor.27.560967334": "ʎɐןuı ɯǝb pǝɔɹoℲ :ƐƖ ʇınɔɹıƆ", + "gtocore.lang.the_primordial_reconstructor.27.-283504537": "ʎɐןuı ɯǝb pǝɔɹoℲ :ㄣƖ ʇınɔɹıƆ", "gtocore.lang.the_primordial_reconstructor.28.-1321781064": "sɯǝʇı oʇuı sɯǝb buıʇɹǝsuı ʎןqıɔɹoɟ oʇ ɹǝʍod ɔıbɐɯ ǝɯnsuoƆ", "gtocore.lang.the_primordial_reconstructor.3.844478837": "uoıʇɔnɹʇsuoɔǝᗡ sʇuǝɯʇuɐɥɔuƎ + ɯǝʇI :ᄅ ʇınɔɹıƆ", "gtocore.lang.the_primordial_reconstructor.4.1145404194": "ןɐʍɐɹpɥʇıM ɟo ןıbıS sɐʌuɐƆ xıɟɟⱯ ʇnduı sǝɹınbǝᴚ", @@ -4830,7 +4845,7 @@ "gtocore.lang.village_trading_station.11.-2135450499": "ᗡ&ᴚ ʎboןouɥɔǝ⟘ bǝɹ⅁ ʎxɐןɐ⅁-uɐԀ ʎq uoısıɔǝɹd ɥʇıʍ pǝʇɟɐɹƆ", "gtocore.lang.village_trading_station.12.1168006789": "ןɐnuɐɯ ǝuıɥɔɐɯ-uı ǝɥʇ oʇ ɹǝɟǝɹ 'suoıʇɔnɹʇsuı pǝןıɐʇǝp ɹoℲ", "gtocore.lang.village_trading_station.2.2067725596": "˙sןɐʌɹǝʇuı ʇǝs ʇɐ sʞɔoʇsǝɹ puɐ sǝpɐɹʇ sǝןpuɐɥ ʎןןɐɔıʇɐɯoʇnɐ ɯǝʇsʎs uı-ʇןınq ǝɥʇ puɐ 'uoıʇɐɯɹoɟuı ɹıǝɥʇ ʞɔoן 'sɹǝbɐןןıʌ ǝɔɐןd ʎןdɯıs—sʞɔoןq ʞɹoʍ buıɥɔʇɐɯ ɹoɟ pǝǝu ou :suoıʇɔɐsuɐɹʇ pǝʇɐɯoʇnɐ ʎןןnɟ pǝןqɐuǝ uoıʇɐʇS buıpɐɹ⟘ ǝbɐןןıΛ buıʇןnsǝɹ ǝɥ⟘", - "gtocore.lang.village_trading_station.3.-1903998976": "˙,buıuunɹ ʇno sǝʌןǝsɯǝɥʇ ɹɐǝʍ oɥʍ sɹǝbuǝssǝɯ uɐɥʇ ǝןqɐıןǝɹ ǝɹoɯ sı ǝuıɥɔɐɯ s,ɥɔǝ⟘ bǝɹ⅁, :pǝsıɐɹd puɐ pǝןıɯs uǝʇɟo sɹǝbɐןןıʌ 'buıʞɔoʇsǝɹ ʇuǝbıןןǝʇuı puɐ buıpɐɹʇ ʞןnq pǝpɐɹbdn ɥʇıM", + "gtocore.lang.village_trading_station.3.826867541": "˙,ɟɟo sbǝן ɹıǝɥʇ buıuunɹ sɹǝıɹnoɔ uɐɥʇ ǝןqɐıןǝɹ ǝɹoɯ sı ǝuıɥɔɐɯ s,ɥɔǝ⟘ bǝɹ⅁, :pǝsıɐɹd puɐ pǝןıɯs uǝʇɟo sɹǝbɐןןıʌ 'buıʞɔoʇsǝɹ ʇuǝbıןןǝʇuı puɐ buıpɐɹʇ ʞןnq pǝpɐɹbdn ɥʇıM", "gtocore.lang.village_trading_station.4.-1550776722": "˙suoıʇɔɐsuɐɹʇ ssǝןɯɐǝs ɥbnoɹɥʇ ʇsnɹʇ ןɐnʇnɯ buıuǝdǝǝp ǝןıɥʍ pןoɟıuɐɯ ʎɔuǝıɔıɟɟǝ uoıʇɐןnɔɹıɔ ǝɔɹnosǝɹ buıʇsooq 'sǝbɐןןıʌ puɐ ʎuɐdɯoɔ ǝɥʇ uǝǝʍʇǝq ǝbpıɹq ʎןpuǝıɹɟ ɐ sɐ sǝʌɹǝs ʇı ʍoN", "gtocore.lang.village_trading_station.5.1020125537": "uoıʇɐʇS buıpɐɹ⟘ ǝbɐןןıΛ", "gtocore.lang.village_trading_station.5.958391167": " :sןoo⟘ snoןnɔɐɹıW", @@ -4868,13 +4883,19 @@ "gtocore.lang.village_trading_station.introduction.9.-1842078679": "˙sʇnoʎɐן sɔıʇsıboן ǝsɐq oʇ ʇdɐpɐ ʎןqıxǝןɟ oʇ uoıʇɔǝɹıp ʇndʇno ɯǝʇı sǝɹnbıɟuoƆ - ǝbɐԀ uoıʇɐɹnbıɟuoƆ uoıʇɔǝɹıᗡ ˙ㄣ", "gtocore.lang.void_fluid_drill.0.-268833863": "pןǝıɟ pıoʌ ǝɥʇ uı ɥɔǝ⟘bǝɹ⅁ ɟo ǝɔǝıdɹǝʇsɐɯ ɹǝɥʇouɐ sı ɹ§ןןıɹᗡ pınןℲ pıoΛ", "gtocore.lang.void_fluid_drill.1.1882050481": "pıoʌ ǝɥʇ uı spınןɟ ןןıɹp uɐɔ ʇI", - "gtocore.lang.void_fluid_drill.2.1383463229": "sʇısodǝp pınןɟ pןɹoʍ buıpuodsǝɹɹoɔ ɯoɹɟ spınןɟ uıɐʇqo oʇ ʇınɔɹıɔ ǝɥʇ ʇǝs puɐ ɐʇɐp uoısuǝɯıp ʇɹǝsuI", - "gtocore.lang.void_fluid_drilling_rig.1.-1080730207": "ʇ/∩Ǝ 0ᄅㄥ0Ɛ ɯnɯıuıɯ sǝɹınbǝᴚ", - "gtocore.lang.void_miner.1.-1994846686": "ʇ/∩Ǝ 0ᄅ6Ɩ ɯnɯıuıɯ puɐ pınןɟ buıןןıɹp ᗺƖ sǝɹınbǝᴚ", - "gtocore.lang.void_miner.2.-1533774086": "ɯsıuɐɥɔǝW ʇndʇnO", - "gtocore.lang.void_miner.3.-929903268": "uoısuǝɯıp uo pǝsɐq sǝdʎʇ ǝɹo ㄣ sʇɔǝןǝs ʎןɯopuɐᴚ", - "gtocore.lang.void_miner.4.-1685785075": "ǝןɔʎɔ ɹǝd ʎʇıʇuɐnb ʇndʇno xɐɯ sǝuıɯɹǝʇǝp ɹǝıʇ ǝbɐʇןoΛ", - "gtocore.lang.void_miner.5.-32153660": "ʇunoɔ ןǝןןɐɹɐd sǝuıɯɹǝʇǝp ǝbɐɹǝdɯⱯ", + "gtocore.lang.void_fluid_drilling_rig.1.1305154805": "uoısuǝɯıp buıןןıɹp ǝɥʇ ʇǝs oʇ ɹǝןןoɹʇuoɔ ǝɥʇ oʇuı ɐʇɐp uoısuǝɯıp ʇɹǝsuI", + "gtocore.lang.void_fluid_drilling_rig.2.-1080730207": "ʇ/∩Ǝ 0ᄅㄥ0Ɛ ɯnɯıuıɯ sǝɹınbǝᴚ", + "gtocore.lang.void_fluid_drilling_rig.3.-1533774086": "ɯsıuɐɥɔǝW ʇndʇnO", + "gtocore.lang.void_fluid_drilling_rig.4.-1910843527": "spınןɟ ǝןqɐןןıɹp ɟo ʇsıן ɐ ʎɐןdsıp ןןıʍ ɹǝןןoɹʇuoɔ ǝɥʇ 'ɐʇɐp ǝɥʇ buıʇɹǝsuı ɹǝʇɟⱯ", + "gtocore.lang.void_fluid_drilling_rig.5.2081500057": "ʇınɔɹıɔ ʇǝs ǝɥʇ oʇ buıpɹoɔɔɐ ɹǝpɹo uı ʇǝbɹɐʇ buıןןıɹp ǝɥʇ ʇɔǝןǝS", + "gtocore.lang.void_miner.0.457662303": "pןǝıɟ pıoʌ ǝɥʇ uı ɥɔǝ⟘bǝɹ⅁ ɟo ǝɔǝıdɹǝʇsɐɯ ɹǝɥʇouɐ sı ɹ§ɹǝuıW pıoΛ", + "gtocore.lang.void_miner.1.-1541488034": "uoısuǝɯıp buıuıɯ ǝɥʇ ʇǝs oʇ ɹǝןןoɹʇuoɔ ǝɥʇ oʇuı ɐʇɐp uoısuǝɯıp ʇɹǝsuI", + "gtocore.lang.void_miner.1.1721904631": "pıoʌ ǝɥʇ uı sǝɹo ǝuıɯ uɐɔ ʇI", + "gtocore.lang.void_miner.2.-1994846686": "ʇ/∩Ǝ 0ᄅ6Ɩ ɯnɯıuıɯ puɐ pınןɟ buıןןıɹp ᗺƖ sǝɹınbǝᴚ", + "gtocore.lang.void_miner.3.-1533774086": "ɯsıuɐɥɔǝW ʇndʇnO", + "gtocore.lang.void_miner.4.-929903268": "uoısuǝɯıp uo pǝsɐq sǝdʎʇ ǝɹo ㄣ sʇɔǝןǝs ʎןɯopuɐᴚ", + "gtocore.lang.void_miner.5.-1685785075": "ǝןɔʎɔ ɹǝd ʎʇıʇuɐnb ʇndʇno xɐɯ sǝuıɯɹǝʇǝp ɹǝıʇ ǝbɐʇןoΛ", + "gtocore.lang.void_miner.6.-32153660": "ʇunoɔ ןǝןןɐɹɐd sǝuıɯɹǝʇǝp ǝbɐɹǝdɯⱯ", "gtocore.lang.water_purification_plant.0.-37818779": "buıʌɐɹbuǝ puɐ buıʇʇnɔ dıɥɔ puɐ ɹǝɟɐʍ ɟo sǝssǝɔoɹd ǝsıɔǝɹd ǝɥʇ buıɹnp sʇɔǝɟǝp ʇuɐɔıɟıubıs ǝsnɐɔ uɐɔ ɹǝʇɐʍ uı sǝןɔıʇɹɐd ɔıuoı puɐ sʇuɐʇnןןoԀ", "gtocore.lang.water_purification_plant.0.1369142758": "ɯǝʇsʎS ʞuıꞀ ʇıu∩ buıssǝɔoɹԀ", "gtocore.lang.water_purification_plant.1.1000852519": "uoıʇɐɹǝdo ǝɥʇ ɟo ǝɹoɔ ǝɥʇ sı ǝɹnʇɔnɹʇs ʞɔoןq-ıʇןnɯ sıɥʇ puɐ 'sǝssǝɔoɹd xǝןdɯoɔ puɐ ǝsıɔǝɹd ʎןbuısɐǝɹɔuı ɟo sǝıɹǝs ɐ ɥbnoɹɥʇ ɹǝʇɐʍ ǝɥʇ ʎɟıɹnd ʎןןɐɔıʇɐɯǝʇsʎs oʇ ןɐıɔnɹɔ sı ʇI", @@ -4888,7 +4909,7 @@ "gtocore.lang.wireless_dimension_repeater.1.-1198227948": "suoısuǝɯıp ʇuǝɹǝɟɟıp uǝǝʍʇǝq pǝʇɐǝdǝɹ sı ʎbɹǝuƎ", "gtocore.lang.wireless_dimension_repeater.2.-1548032904": "ɹǝıʇ ןןǝɥs uo spuǝdǝp ǝbɐʇןoʌ ɯnɯıxɐW", "gtocore.lang.wireless_dimension_repeater.3.438009707": "ǝzıs ʇuǝɹɹnɔ oʇ pǝʇɐןǝɹ ʇoN", - "gtocore.lang.wireless_dimension_repeater.4.1195838228": "ǝʌıʇıɯıɹd ǝɥʇ ɟo ʎboןouɥɔǝʇ ɹǝdns ɐ sı ʇıɯıן ʇuǝɹɹnɔ oN", + "gtocore.lang.wireless_dimension_repeater.4.231278609": "ʎboןouɥɔǝʇ-ɹǝdns ǝʌıʇıɯıɹd ʎןnɹʇ - ʇıɯıן ʇuǝɹɹnɔ oN", "gtocore.lang.wireless_energy_substation.0.1288417405": "pıɹb ssǝןǝɹıʍ ǝɥʇ oʇ ʇɹoddns ʎʇıɔɐdɐɔ sǝpıʌoɹԀ", "gtocore.lang.wireless_energy_substation.1.-1430140471": "ʎʇıɔɐdɐƆ ʎʇıɔıɹʇɔǝןƎ", "gtocore.lang.wireless_energy_substation.2.42593670": "ʇıɯıן ʎʇıɔɐdɐɔ ǝsɐǝɹɔuı oʇ ǝpısuı sʇıun ʎbɹǝuǝ ssǝןǝɹıʍ ןןɐʇsuI", @@ -5130,7 +5151,7 @@ "gtocore.machine.mega_turbine.expert.desc.2": "˙ʎʇıןıqɐɹnp ɹoʇoɹ ǝɔıɟıɹɔɐs ʎןʇuɐɔıɟıubıs osןɐ ןןıʍ ɹǝıןdıʇןnɯ ʇndʇno ǝɥʇ buıʇsnظpɐ 'ɹǝʌǝʍoH", "gtocore.machine.mega_turbine.expert.desc.3": "˙xϛ - xƖ˙0 :ǝbuɐᴚ ʇuǝɯʇsnظpⱯ", "gtocore.machine.mega_turbine.expert.desc.4": "ɹǝıןdıʇןnW ʇuǝɯʇsnظpⱯ x ɹǝıןdıʇןnW ǝsɐᗺ = ɹǝıןdıʇןnW ʇndʇnO :ɐןnɯɹoℲ", - "gtocore.machine.mega_turbine.expert.desc.5": ")Ɩ - ɹǝıןdıʇןnW ʇuǝɯʇsnظpⱯ( ^ )ᄅ˙Ɩ 'ɹǝı⟘ ןıoƆ * 80˙0 - ᄅ˙ᄅ(xɐɯ x ɹǝıןdıʇןnW ǝsɐᗺ = ɹǝıןdıʇןnW ǝbɐɯɐᗡ ɹoʇoᴚ", + "gtocore.machine.mega_turbine.expert.desc.5": ")Ɩ - ɹǝıןdıʇןnW ʇuǝɯʇsnظpⱯ( ^ )ᄅ˙Ɩ 'ɹǝı⟘ ssɐן⅁ * 80˙0 - ᄅ˙ᄅ(xɐɯ x ɹǝıןdıʇןnW ǝsɐᗺ = ɹǝıןdıʇןnW ǝbɐɯɐᗡ ɹoʇoᴚ", "gtocore.machine.mega_turbine.expert.estimated_max_output": "ʇ/∩Ǝ %s :ʇndʇnO xɐW pǝʇɐɯıʇsƎ", "gtocore.machine.mega_turbine.glass_tier": "%s :snuoᗺ ɹǝıןdıʇןnW ǝbɐɯɐᗡ ɹoʇoᴚ '%s :ɹǝı⟘ ssɐן⅁", "gtocore.machine.mega_turbine.high_speed_mode": ":ǝpoW pǝǝdS ɥbıH", @@ -5347,8 +5368,8 @@ "gtocore.machine.stellar_forge.pressure": " :ǝɹnssǝɹԀ ןɐuɹǝʇuI", "gtocore.machine.structure_check": "ʞɔǝɥɔ ǝɹnʇɔnɹʇs ǝʇɐpd∩", "gtocore.machine.structure_check.shift": "ǝɹnʇɔnɹʇs ǝɥʇ ʞɔǝɥɔǝɹ pǝɔɹoɟ ןןıʍ ʞɔıןɔ+ʇɟıɥS", - "gtocore.machine.sync_tester_machine.tooltip.0": "。具工的步同器机试测于用", - "gtocore.machine.sync_tester_machine.tooltip.1": "。用使中境环产生在勿请", + "gtocore.machine.sync_tester_machine.tooltip.0": "˙uoıʇɐzıuoɹɥɔuʎs ǝuıɥɔɐɯ buıʇsǝʇ ɹoɟ ןooʇ Ɐ", + "gtocore.machine.sync_tester_machine.tooltip.1": "˙ʇuǝɯuoɹıʌuǝ uoıʇɔnpoɹd uı ǝsn ʇou oᗡ", "gtocore.machine.synthetic_data_assembly_plant.tooltip.0": "˙ɹǝuuɐɔs ʞɔoןq-ıʇןnɯ uoısıɔǝɹԀ", "gtocore.machine.synthetic_data_assembly_plant.tooltip.1": "˙ɹǝuuɐɔs ʞɔoןq-ıʇןnɯ uoısıɔǝɹԀ", "gtocore.machine.synthetic_data_assembly_plant.tooltip.2": "˙ʞɹoʍ oʇ ㄥ§uoıʇɐʇndɯoƆɟ§ sǝɹınbǝᴚ", @@ -5357,7 +5378,7 @@ "gtocore.machine.tag_filter.tooltip.0": "ʎʇıɹoıɹԀ sǝʇɐɔıpuI )( pɹɐɔpןıʍ ɐ sǝʇɐɔıpuI *", "gtocore.machine.tag_filter.tooltip.1": "ᴚOX ןɐɔıboꞀ = ^ ɹo ɔıboꞀ = | ɥʇıʍ ɔıboꞀ = &", "gtocore.machine.temp.per_second": "ʞ%s :puoɔǝS ɹǝԀ ǝsɐǝɹɔuI ǝɹnʇɐɹǝdɯǝ⟘ ǝdıɔǝᴚ", - "gtocore.machine.test_report_output.tooltip.0": "息信用试测些一印打", + "gtocore.machine.test_report_output.tooltip.0": "uoıʇɐɯɹoɟuı ʇsǝʇ ǝɯos ʇuıɹԀ", "gtocore.machine.text.thread": " :%s pɐǝɹɥ⟘", "gtocore.machine.the_primordial_reconstructor.mode.0": "ʇǝs ʇoN :ǝpoW buıʞɹoM", "gtocore.machine.the_primordial_reconstructor.mode.1": "uoıʇɔnɹʇsuoɔǝᗡ ɯǝʇI :ǝpoW buıʞɹoM", @@ -5534,6 +5555,7 @@ "gtocore.part_ability.export_fluids_4x": ")xㄣ( ʇndʇnO spınןℲ", "gtocore.part_ability.export_fluids_9x": ")x6( ʇndʇnO spınןℲ", "gtocore.part_ability.export_items": "ʇndʇnO sɯǝʇI", + "gtocore.part_ability.extra_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ɐɹʇxƎ", "gtocore.part_ability.extract_mana": "ɐuɐW ʇɔɐɹʇxƎ", "gtocore.part_ability.hpca_component": "ʇuǝuodɯoƆ ⱯƆԀH", "gtocore.part_ability.import_fluids": "ʇnduI spınןℲ", @@ -5734,10 +5756,6 @@ "gtocore.tooltip.item.uruium_coil_block.1": "ǝpoɯ ǝɔɐuɹnɟ ɹɐןןǝʇs uı pǝsn ǝq uɐɔ ןıoɔ sıɥʇ ʎןuO", "gtocore.tooltip.item.vacuum_tube.0": "0 uɐɥʇ ɹǝʇɐǝɹb ןǝʌǝן ɯnnɔɐʌ ɥʇıʍ ǝuıɥɔɐɯ ɐ ɯoɹɟ ʎןddns ɯnnɔɐʌ uıɐʇqo oʇ ǝqnʇ ɯnnɔɐʌ ɥbnoɹ pןǝɥpuɐɥ ǝɥʇ ʞɔıןɔ-ʇɥbıᴚ", "gtocore.tooltip.item.virtual_item_provider": "˙ʇoןs ʇınɔɹıɔ ןɐnʇɹıʌ s,ǝuıɥɔɐɯ ǝɥʇ ɹoɟ sɯǝʇı ǝpıʌoɹԀ", - "gtocore.tooltip.pattern_content_sort_machine.apply": "ʎןddⱯ", - "gtocore.tooltip.pattern_content_sort_machine.means_for_line_0": "˙ɹǝpɹo buıpuǝɔsǝp uı ʎʇıɹoıɹd ɯǝʇı uo pǝsɐq sı ʍoɹ ɥɔɐǝ uı sɯǝʇı ɟo uoıʇɐzıʇıɹoıɹԀ 'ǝuıן ʇɐɥʇ ɟo ɯǝʇı ʎʇıɹoıɹd ʇsǝɥbıɥ ǝɥʇ ɥʇıʍ pǝɔɐןdǝɹ ǝq ןןıʍ ʇnduı uɹǝʇʇɐd ǝɥʇ uı sɯǝʇı ןןɐ 'ǝuıן ɥɔɐǝ ɹoℲ ", - "gtocore.tooltip.pattern_content_sort_machine.mode.fluid": "ʇuǝɯǝɔɐןdǝᴚ pınןℲ : ǝpoW", - "gtocore.tooltip.pattern_content_sort_machine.mode.item": "ʇuǝɯǝɔɐןdǝᴚ ɯǝʇI : ǝpoW", "gtocore.tooltip.unknown": "uʍouʞu∩", "gtocore.top.checking": "ǝɹnʇɔnɹʇs buıʞɔǝɥƆ", "gtocore.top.errors": " sɹoɹɹǝ ǝןqɐqoɹԀ", @@ -6053,16 +6071,16 @@ "item.gtocore.cupriavidus_petri_dish": "ɥsıᗡ ıɹʇǝԀ snpıʌɐıɹdnƆ", "item.gtocore.cyan_dye_masterbatch": "ɥɔʇɐqɹǝʇsɐW ǝʎᗡ uɐʎƆ", "item.gtocore.dark_matter": "ɹǝʇʇɐW ʞɹɐᗡ", - "item.gtocore.data_crystal_component_mk1": "ƖʞW ʇuǝuodɯoƆ ןɐʇsʎɹƆ ɐʇɐᗡ", - "item.gtocore.data_crystal_component_mk2": "ᄅʞW ʇuǝuodɯoƆ ןɐʇsʎɹƆ ɐʇɐᗡ", - "item.gtocore.data_crystal_component_mk3": "ƐʞW ʇuǝuodɯoƆ ןɐʇsʎɹƆ ɐʇɐᗡ", - "item.gtocore.data_crystal_component_mk4": "ㄣʞW ʇuǝuodɯoƆ ןɐʇsʎɹƆ ɐʇɐᗡ", - "item.gtocore.data_crystal_component_mk5": "ϛʞW ʇuǝuodɯoƆ ןɐʇsʎɹƆ ɐʇɐᗡ", - "item.gtocore.data_crystal_mk1": "ƖʞW ןɐʇsʎɹƆ ɐʇɐᗡ", - "item.gtocore.data_crystal_mk2": "ᄅʞW ןɐʇsʎɹƆ ɐʇɐᗡ", - "item.gtocore.data_crystal_mk3": "ƐʞW ןɐʇsʎɹƆ ɐʇɐᗡ", - "item.gtocore.data_crystal_mk4": "ㄣʞW ןɐʇsʎɹƆ ɐʇɐᗡ", - "item.gtocore.data_crystal_mk5": "ϛʞW ןɐʇsʎɹƆ ɐʇɐᗡ", + "item.gtocore.data_crystal_component_mk1": "I ʞW ʇuǝuodɯoƆ ןɐʇsʎɹƆ ɐʇɐᗡ", + "item.gtocore.data_crystal_component_mk2": "II ʞW ʇuǝuodɯoƆ ןɐʇsʎɹƆ ɐʇɐᗡ", + "item.gtocore.data_crystal_component_mk3": "III ʞW ʇuǝuodɯoƆ ןɐʇsʎɹƆ ɐʇɐᗡ", + "item.gtocore.data_crystal_component_mk4": "ΛI ʞW ʇuǝuodɯoƆ ןɐʇsʎɹƆ ɐʇɐᗡ", + "item.gtocore.data_crystal_component_mk5": "Λ ʞW ʇuǝuodɯoƆ ןɐʇsʎɹƆ ɐʇɐᗡ", + "item.gtocore.data_crystal_mk1": "I ʞW ןɐʇsʎɹƆ ɐʇɐᗡ", + "item.gtocore.data_crystal_mk2": "II ʞW ןɐʇsʎɹƆ ɐʇɐᗡ", + "item.gtocore.data_crystal_mk3": "III ʞW ןɐʇsʎɹƆ ɐʇɐᗡ", + "item.gtocore.data_crystal_mk4": "ΛI ʞW ןɐʇsʎɹƆ ɐʇɐᗡ", + "item.gtocore.data_crystal_mk5": "Λ ʞW ןɐʇsʎɹƆ ɐʇɐᗡ", "item.gtocore.data_disc": "ɔsıᗡ ɐʇɐᗡ", "item.gtocore.data_item.type.title": ":ɐʇɐᗡ sǝdıɔǝᴚ %su§", "item.gtocore.debug_structure_writer": "ɹǝʇıɹM ǝɹnʇɔnɹʇS bnqǝᗡ", @@ -6200,9 +6218,9 @@ "item.gtocore.enchantment_essence_vanishing_curse": ")ǝsɹnƆ buıɥsıuɐΛ( ǝɔuǝssƎ ʇuǝɯʇuɐɥɔuƎ", "item.gtocore.ender_crystal": "ןɐʇsʎɹƆ ɹǝpuƎ", "item.gtocore.ender_diamond": "puoɯɐıᗡ ɹǝpuƎ", - "item.gtocore.energy_control_module_mk1": "ƖʞW ǝןnpoW ןoɹʇuoƆ ʎbɹǝuƎ", - "item.gtocore.energy_control_module_mk2": "ᄅʞW ǝןnpoW ןoɹʇuoƆ ʎbɹǝuƎ", - "item.gtocore.energy_control_module_mk3": "ƐʞW ǝןnpoW ןoɹʇuoƆ ʎbɹǝuƎ", + "item.gtocore.energy_control_module_mk1": "I ʞW ǝןnpoW ןoɹʇuoƆ ʎbɹǝuƎ", + "item.gtocore.energy_control_module_mk2": "II ʞW ǝןnpoW ןoɹʇuoƆ ʎbɹǝuƎ", + "item.gtocore.energy_control_module_mk3": "III ʞW ǝןnpoW ןoɹʇuoƆ ʎbɹǝuƎ", "item.gtocore.energy_upgrade_module": "ǝןnpoW ǝpɐɹbd∩ ʎbɹǝuƎ", "item.gtocore.entangled_singularity": "ʎʇıɹɐןnbuıS pǝןbuɐʇuƎ", "item.gtocore.eschericia_petri_dish": "ɥsıᗡ ıɹʇǝԀ ɐıɔıɹǝɥɔsƎ", @@ -6304,15 +6322,15 @@ "item.gtocore.holy_root_mycelium": "ɯnıןǝɔʎW ʇooᴚ ʎןoH", "item.gtocore.hootch_bucket": "ʇǝʞɔnᗺ ɥɔʇooH", "item.gtocore.hot_iron_ingot": "ʇobuI uoɹI ʇoH", - "item.gtocore.hui_circuit_1": "I-ʞW uoıʇɐʇsʞɹoM uoıʇɐןnɔןɐƆ ɥbıH", + "item.gtocore.hui_circuit_1": "I ʞW uoıʇɐʇsʞɹoM uoıʇɐןnɔןɐƆ ɥbıH", "item.gtocore.hui_circuit_1.tooltip": "puoɔǝS/suoıʇɐɹǝdO ʇuıoԀ buıʇɐoןℲ-ϛƖ0Ɛ6ㄥ§", - "item.gtocore.hui_circuit_2": "II-ʞW uoıʇɐʇsʞɹoM uoıʇɐןnɔןɐƆ ɥbıH", + "item.gtocore.hui_circuit_2": "II ʞW uoıʇɐʇsʞɹoM uoıʇɐןnɔןɐƆ ɥbıH", "item.gtocore.hui_circuit_2.tooltip": "ʇıu∩ buıssǝɔoɹԀ W9ㄥㄥ§", - "item.gtocore.hui_circuit_3": "III-ʞW uoıʇɐʇsʞɹoM uoıʇɐןnɔןɐƆ ɥbıH", + "item.gtocore.hui_circuit_3": "III ʞW uoıʇɐʇsʞɹoM uoıʇɐןnɔןɐƆ ɥbıH", "item.gtocore.hui_circuit_3.tooltip": "ɯɥʇıɹobןⱯ ⱯSᴚ pıןɐʌuIㄥ§", - "item.gtocore.hui_circuit_4": "ΛI-ʞW uoıʇɐʇsʞɹoM uoıʇɐןnɔןɐƆ ɥbıH", + "item.gtocore.hui_circuit_4": "ΛI ʞW uoıʇɐʇsʞɹoM uoıʇɐןnɔןɐƆ ɥbıH", "item.gtocore.hui_circuit_4.tooltip": "ǝɯıɹԀ ǝuuǝsɹǝW ɥʇ9ϛ ǝɥ⟘ㄥ§", - "item.gtocore.hui_circuit_5": "Λ-ʞW uoıʇɐʇsʞɹoM uoıʇɐןnɔןɐƆ ɥbıH", + "item.gtocore.hui_circuit_5": "Λ ʞW uoıʇɐʇsʞɹoM uoıʇɐןnɔןɐƆ ɥbıH", "item.gtocore.hui_circuit_5.tooltip": "xopɐɹɐԀㄥ§", "item.gtocore.hv_drone": "ǝuoɹᗡ ǝsɐᗺ", "item.gtocore.hv_power_amplifiers": "sɹǝıɟıןdɯⱯ ɹǝʍoԀ ʌH", @@ -6340,8 +6358,8 @@ "item.gtocore.lapis_vein_essence": "ǝɔuǝssƎ uıǝΛ sıdɐꞀ", "item.gtocore.laser_cooling_unit": "ʇıu∩ buıןooƆ ɹǝsɐꞀ", "item.gtocore.laser_diode": "ǝpoıᗡ ɹǝsɐꞀ", - "item.gtocore.laser_gyroscope_mk1": "ƖʞW ǝdoɔsoɹʎ⅁ ɹǝsɐꞀ", - "item.gtocore.laser_gyroscope_mk2": "ᄅʞW ǝdoɔsoɹʎ⅁ ɹǝsɐꞀ", + "item.gtocore.laser_gyroscope_mk1": "I ʞW ǝdoɔsoɹʎ⅁ ɹǝsɐꞀ", + "item.gtocore.laser_gyroscope_mk2": "II ʞW ǝdoɔsoɹʎ⅁ ɹǝsɐꞀ", "item.gtocore.lepton_trap_crystal": "ןɐʇsʎɹƆ dɐɹ⟘ uoʇdǝꞀ", "item.gtocore.liquid_sunshine_bucket": "ʇǝʞɔnᗺ ǝuıɥsunS pınbıꞀ", "item.gtocore.lithography_mask": "ʞsɐW ʎɥdɐɹboɥʇıꞀ", @@ -6350,9 +6368,9 @@ "item.gtocore.luv_power_amplifiers": "sɹǝıɟıןdɯⱯ ɹǝʍoԀ ʌnꞀ", "item.gtocore.lv_power_amplifiers": "sɹǝıɟıןdɯⱯ ɹǝʍoԀ ʌꞀ", "item.gtocore.lv_reward_bag": "bɐᗺ pɹɐʍǝᴚ ʌן", - "item.gtocore.machining_control_module_mk1": "ƖʞW ǝןnpoW ןoɹʇuoƆ buıuıɥɔɐW", - "item.gtocore.machining_control_module_mk2": "ᄅʞW ǝןnpoW ןoɹʇuoƆ buıuıɥɔɐW", - "item.gtocore.machining_control_module_mk3": "ƐʞW ǝןnpoW ןoɹʇuoƆ buıuıɥɔɐW", + "item.gtocore.machining_control_module_mk1": "I ʞW ǝןnpoW ןoɹʇuoƆ buıuıɥɔɐW", + "item.gtocore.machining_control_module_mk2": "II ʞW ǝןnpoW ןoɹʇuoƆ buıuıɥɔɐW", + "item.gtocore.machining_control_module_mk3": "III ʞW ǝןnpoW ןoɹʇuoƆ buıuıɥɔɐW", "item.gtocore.macrowormhole_generator": "ɹoʇɐɹǝuǝ⅁ ǝןoɥɯɹoʍoɹɔɐW", "item.gtocore.magenta_dye_masterbatch": "ɥɔʇɐqɹǝʇsɐW ǝʎᗡ ɐʇuǝbɐW", "item.gtocore.magnetic_trap": "dɐɹ⟘ ɔıʇǝubɐW", @@ -6455,6 +6473,7 @@ "item.gtocore.palm_sized_bank": "ʞuɐᗺ pǝzıS-ɯןɐԀ ʎboןouɥɔǝ⟘ bǝɹ⅁ ɔıʇɔɐןɐ⅁-uɐԀ", "item.gtocore.pattern.wildcard": "uɹǝʇʇɐԀ buıssǝɔoɹԀ pɹɐɔpןıM ɥʇıM", "item.gtocore.pattern_buffer_upgrader": "ɹǝpɐɹbd∩ ɹǝɟɟnᗺ uɹǝʇʇɐԀ", + "item.gtocore.pattern_content_access_terminal": "ןɐuıɯɹǝ⟘ ssǝɔɔⱯ ʇuǝʇuoƆ uɹǝʇʇɐԀ", "item.gtocore.pattern_modifier_pro": "oɹԀ ɹǝıɟıpoW uɹǝʇʇɐԀ", "item.gtocore.pattern_modifier_pro.name": "oɹԀ ɹǝıɟıpoW uɹǝʇʇɐԀ", "item.gtocore.pellet_antimatter": "ɹǝʇʇɐɯıʇuⱯ ʇǝןןǝԀ", @@ -6470,11 +6489,11 @@ "item.gtocore.plasma_containment_cell": "ןןǝƆ ʇuǝɯuıɐʇuoƆ ɐɯsɐןԀ", "item.gtocore.pm_chip": "dıɥƆ ɯԀ", "item.gtocore.pm_wafer": "ɹǝɟɐM ɯԀ", - "item.gtocore.precision_circuit_assembly_robot_mk1": "ƖʞW ʇoqoᴚ ʎןqɯǝssⱯ ʇınɔɹıƆ uoısıɔǝɹԀ", - "item.gtocore.precision_circuit_assembly_robot_mk2": "ᄅʞW ʇoqoᴚ ʎןqɯǝssⱯ ʇınɔɹıƆ uoısıɔǝɹԀ", - "item.gtocore.precision_circuit_assembly_robot_mk3": "ƐʞW ʇoqoᴚ ʎןqɯǝssⱯ ʇınɔɹıƆ uoısıɔǝɹԀ", - "item.gtocore.precision_circuit_assembly_robot_mk4": "ㄣʞW ʇoqoᴚ ʎןqɯǝssⱯ ʇınɔɹıƆ uoısıɔǝɹԀ", - "item.gtocore.precision_circuit_assembly_robot_mk5": "ϛʞW ʇoqoᴚ ʎןqɯǝssⱯ ʇınɔɹıƆ uoısıɔǝɹԀ", + "item.gtocore.precision_circuit_assembly_robot_mk1": "I ʞW ʇoqoᴚ ʎןqɯǝssⱯ ʇınɔɹıƆ uoısıɔǝɹԀ", + "item.gtocore.precision_circuit_assembly_robot_mk2": "II ʞW ʇoqoᴚ ʎןqɯǝssⱯ ʇınɔɹıƆ uoısıɔǝɹԀ", + "item.gtocore.precision_circuit_assembly_robot_mk3": "III ʞW ʇoqoᴚ ʎןqɯǝssⱯ ʇınɔɹıƆ uoısıɔǝɹԀ", + "item.gtocore.precision_circuit_assembly_robot_mk4": "ΛI ʞW ʇoqoᴚ ʎןqɯǝssⱯ ʇınɔɹıƆ uoısıɔǝɹԀ", + "item.gtocore.precision_circuit_assembly_robot_mk5": "Λ ʞW ʇoqoᴚ ʎןqɯǝssⱯ ʇınɔɹıƆ uoısıɔǝɹԀ", "item.gtocore.precision_steam_mechanism": "ɯsıuɐɥɔǝW ɯɐǝʇS uoısıɔǝɹԀ", "item.gtocore.preoxidized_atomic_pan_fiber": "ɹǝqıℲ uɐԀ ɔıɯoʇⱯ pǝzıpıxoǝɹԀ", "item.gtocore.preoxidized_micron_pan_fiber": "ɹǝqıℲ uɐԀ uoɹɔıW pǝzıpıxoǝɹԀ", @@ -6563,8 +6582,8 @@ "item.gtocore.simple_optical_fiber_preform": "ɯɹoɟǝɹԀ ɹǝqıℲ ןɐɔıʇdO ǝןdɯıS", "item.gtocore.simple_optical_soc": "ƆoS ןɐɔıʇdO ǝןdɯıS", "item.gtocore.slot_enhancer": "ɹǝɔuɐɥuƎ ʇoןS", - "item.gtocore.small_shuttle_mk1": "ƖʞW ǝןʇʇnɥS ןןɐɯS", - "item.gtocore.small_shuttle_mk2": "ᄅʞW ǝןʇʇnɥS ןןɐɯS", + "item.gtocore.small_shuttle_mk1": "I ʞW ǝןʇʇnɥS ןןɐɯS", + "item.gtocore.small_shuttle_mk2": "II ʞW ǝןʇʇnɥS ןןɐɯS", "item.gtocore.smd_capacitor_bioware": "ɹoʇıɔɐdɐƆ ǝɹɐʍoıᗺ", "item.gtocore.smd_capacitor_cosmic": "ɹoʇıɔɐdɐƆ ɔıɯsoƆ", "item.gtocore.smd_capacitor_exotic": "ɹoʇıɔɐdɐƆ ɔıʇoxƎ", @@ -6605,17 +6624,17 @@ "item.gtocore.space_coolant_cell_10k": "ןןǝƆ ʇuɐןooƆ ǝɔɐdS ʞ0Ɩ", "item.gtocore.space_coolant_cell_30k": "ןןǝƆ ʇuɐןooƆ ǝɔɐdS ʞ0Ɛ", "item.gtocore.space_coolant_cell_60k": "ןןǝƆ ʇuɐןooƆ ǝɔɐdS ʞ09", - "item.gtocore.space_drone_mk1": "ⅠʞW ǝuoɹᗡ ǝɔɐdS", - "item.gtocore.space_drone_mk2": "ⅡʞW ǝuoɹᗡ ǝɔɐdS", - "item.gtocore.space_drone_mk3": "ⅢʞW ǝuoɹᗡ ǝɔɐdS", - "item.gtocore.space_drone_mk4": "ⅣʞW ǝuoɹᗡ ǝɔɐdS", - "item.gtocore.space_drone_mk5": "ⅤʞW ǝuoɹᗡ ǝɔɐdS", - "item.gtocore.space_drone_mk6": "ⅥʞW ǝuoɹᗡ ǝɔɐdS", + "item.gtocore.space_drone_mk1": "I ʞW ǝuoɹᗡ ǝɔɐdS", + "item.gtocore.space_drone_mk2": "II ʞW ǝuoɹᗡ ǝɔɐdS", + "item.gtocore.space_drone_mk3": "III ʞW ǝuoɹᗡ ǝɔɐdS", + "item.gtocore.space_drone_mk4": "ΛI ʞW ǝuoɹᗡ ǝɔɐdS", + "item.gtocore.space_drone_mk5": "Λ ʞW ǝuoɹᗡ ǝɔɐdS", + "item.gtocore.space_drone_mk6": "IΛ ʞW ǝuoɹᗡ ǝɔɐdS", "item.gtocore.space_essence": "ǝɔuǝssƎ ǝɔɐdS", "item.gtocore.space_nanomuscle_chestplate": "ǝʇɐןdʇsǝɥƆ ǝʇınS ǝɔɐdS ™ǝןɔsnWouɐN", - "item.gtocore.space_probe_mk1": "ƖʞW ǝqoɹԀ ǝɔɐdS", - "item.gtocore.space_probe_mk2": "ᄅʞW ǝqoɹԀ ǝɔɐdS", - "item.gtocore.space_probe_mk3": "ƐʞW ǝqoɹԀ ǝɔɐdS", + "item.gtocore.space_probe_mk1": "I ʞW ǝqoɹԀ ǝɔɐdS", + "item.gtocore.space_probe_mk2": "II ʞW ǝqoɹԀ ǝɔɐdS", + "item.gtocore.space_probe_mk3": "III ʞW ǝqoɹԀ ǝɔɐdS", "item.gtocore.space_quarktech_chestplate": "ǝʇɐןdʇsǝɥƆ ǝʇınS ǝɔɐdS ™ɥɔǝ⟘ʞɹɐnὉ", "item.gtocore.spacetime_catalyst": "ʇsʎןɐʇɐƆ ǝɯıʇǝɔɐdS", "item.gtocore.special_ceramics": "sɔıɯɐɹǝƆ ןɐıɔǝdS", @@ -6763,6 +6782,7 @@ "item.gtocore.tcetiedandelions": "suoıןǝpuɐpǝıʇǝɔ⟘", "item.gtocore.tcetieseaweedextract": "ʇɔɐɹʇxǝpǝǝʍɐǝsǝıʇǝɔ⟘", "item.gtocore.temporal_matter": "ɹǝʇʇɐW ןɐɹodɯǝ⟘", + "item.gtocore.temporary_order": "ɹǝpɹO ʎɹɐɹodɯǝ⟘", "item.gtocore.tesseract_target_marker": "ɹǝʞɹɐW ʇǝbɹɐ⟘ ʇɔɐɹǝssǝ⟘", "item.gtocore.tetrahedrite_vein_essence": "ǝɔuǝssƎ uıǝΛ ǝʇıɹpǝɥɐɹʇǝ⟘", "item.gtocore.tier_0_eye": " ʎqɐᗺ ǝʎƎ uɐbɹO pɹɐpuɐʇS uɐbɹo", @@ -8138,10 +8158,10 @@ "metaitem.tool.tooltip.rotor.coating.tooltip.0": ":ɯsıuɐɥɔǝW buıʇɐoƆ9§", "metaitem.tool.tooltip.rotor.coating.tooltip.0.magic": ":ɯsıuɐɥɔǝW buıʇɐoƆ 9§ןɐɔıbɐWp§", "metaitem.tool.tooltip.rotor.coating.tooltip.1": "))ᄅ/ᗺ 'Ɐ-ᗺ(uıɯ '0Ɩ/ᗺ(xɐɯ * ㄣp§ sı ᗺ buıʇɐoɔ ɟo ʎʇıןıqɐɹnp ǝɥʇ 'ᗺ buıʇɐoɔ sɐɥ Ɐ ɹoʇoɹ uǝɥM ˙ɹɐǝʍ ɹoʇoɹ sqɹosqɐ ʇɐɥʇ ɹǝıɹɹɐq ɐ sǝpıʌoɹd buıʇɐoɔ ǝɥ⟘q§", - "metaitem.tool.tooltip.rotor.coating.tooltip.1.magic": "%0Ɛ× sǝıʇɹǝdoɹd ןɐıɹǝʇɐɯ ןɐɔıbɐɯ ɟo uoıʇɐɹǝuǝb ɹǝʍod ǝuıqɹnʇ puɐ ʎɔuǝıɔıɟɟǝ ɹoʇoɹ ǝpıʌoɹd ןןıʍ ʇnq 'ɹǝıɹɹɐq ʎʇıןıqɐɹnp ɐ ǝpıʌoɹd ɹǝbuoן ou ןןıʍ buıʇɐoƆ q§ןɐɔıbɐWp§", + "metaitem.tool.tooltip.rotor.coating.tooltip.1.magic": "%0Ɛ× sǝıʇɹǝdoɹd snuoq ןɐıɹǝʇɐɯ ןɐɔıbɐɯ ɟo uoıʇɐɹǝuǝb ɹǝʍod ǝuıqɹnʇ puɐ ʎɔuǝıɔıɟɟǝ ɹoʇoɹ ǝpıʌoɹd ןןıʍ ʇnq 'ɹǝıɹɹɐq ʎʇıןıqɐɹnp ɐ ǝpıʌoɹd ɹǝbuoן ou ןןıʍ buıʇɐoƆ q§ןɐɔıbɐWp§", "metaitem.tool.tooltip.rotor.coating.tooltip.2": "pǝɯnsuoɔ sı ʎʇıןıqɐɹnp ʎpoq ǝɥʇ 'pǝʇsnɐɥxǝ sı ʎʇıןıqɐɹnp buıʇɐoɔ ǝɥʇ ɹǝʇɟⱯ ˙pǝbɐɯɐp sı ɹoʇoɹ ǝɥʇ uǝɥʍ ʇsɹıɟ ʎʇıןıqɐɹnp buıʇɐoɔ ǝɥʇ buıɯnsuoɔ ɟo ǝɔuɐɥɔ %ϛ6 ɐ sı ǝɹǝɥ⟘q§", "metaitem.tool.tooltip.rotor.coating.tooltip.2.magic": " ˙ǝnןɐʌ ןɐuıbıɹo ǝɥʇ oʇ ʞɔɐq ןןɐɟ ןןıʍ uoıʇɐɹǝuǝb ɹǝʍod ǝuıqɹnʇ puɐ ʎɔuǝıɔıɟɟǝ ɹoʇoɹ ǝɥʇ 'pǝʇsnɐɥxǝ sı ʎʇıןıqɐɹnp buıʇɐoɔ ǝɥʇ ɹǝʇɟⱯ ˙ʎʇıןıqɐɹnp ǝɯnsuoɔ osןɐ ןןıʍ buıʇɐoɔ q§ןɐɔıbɐɯp§ ǝɥʇ 'ʎʇıןıqɐɹnp sǝɯnsuoɔ ʎpoq ǝɥʇ uǝɥM", - "metaitem.tool.tooltip.rotor.coating.tooltip.3.magic": "))ᄅ/ᗺ 'Ɐ-ᗺ(uıɯ '0Ɩ/ᗺ(xɐɯp§ sı ᗺ buıʇɐoɔ ɟo ʎʇıןıqɐɹnp ǝɥʇ 'ᗺ buıʇɐoɔ sɐɥ Ɐ ɹoʇoɹ uǝɥM", + "metaitem.tool.tooltip.rotor.coating.tooltip.3.magic": "))ᄅ/ᗺ 'Ɐ-ᗺ(uıɯ '0Ɩ/ᗺ(xɐɯ * ㄣp§ sı ᗺ buıʇɐoɔ ɟo ʎʇıןıqɐɹnp ǝɥʇ 'ᗺ buıʇɐoɔ sɐɥ Ɐ ɹoʇoɹ uǝɥM", "metaitem.tool.tooltip.rotor.coating_durability": "%s / %s :ʎʇıןıqɐɹnᗡ buıʇɐoƆ", "metaitem.tool.tooltip.rotor.coating_efficiency": "%s%% :ʎɔuǝıɔıɟɟƎ buıʇɐoƆ", "metaitem.tool.tooltip.rotor.coating_power": "%s%% :ɹǝʍoԀ buıʇɐoƆ", diff --git a/src/generated/resources/assets/gtocore/lang/en_us.json b/src/generated/resources/assets/gtocore/lang/en_us.json index d35b095c9..7367bcf18 100644 --- a/src/generated/resources/assets/gtocore/lang/en_us.json +++ b/src/generated/resources/assets/gtocore/lang/en_us.json @@ -9,6 +9,7 @@ "affix.apotheosis:kinetic.suffix": "the Momentum Master", "affix.apotheosis:stress": "Stress", "affix.apotheosis:stress.suffix": "the Brinkbreaker", + "affix.gtocore.bedrock_mine_restore.at_most.desc": "(At most %s%%)", "affix.gtocore.bedrock_mine_restore.desc": "Each time you mine ore, you can explore an additional bedrock ore vein reserve equivalent to %s‰ of the average reserve in the current chunk", "affix.gtocore.bedrock_mine_restore.fluid.desc": "Each time you mine ore, you can explore an additional bedrock fluid vein reserve equivalent to %s‰ of the average reserve in the current chunk", "affix.gtocore.ftb_ultimine.desc": "This tool increases the maximum number of blocks that can be mined in a chain by %s%%", @@ -234,8 +235,8 @@ "block.gtocore.compound_extreme_cooling_unit": "Compound Extreme Cooling Unit", "block.gtocore.comprehensive_tombarthite_processing_facility": "Comprehensive Tombarthite Processing Facility", "block.gtocore.compressed_fusion_coil": "Compressed Fusion Coil", - "block.gtocore.compressed_fusion_coil_mk2": "Compressed Fusion Coil Mk2", - "block.gtocore.compressed_fusion_coil_mk2_prototype": "Compressed Fusion Coil Mk2 Prototype", + "block.gtocore.compressed_fusion_coil_mk2": "Compressed Fusion Coil MK II", + "block.gtocore.compressed_fusion_coil_mk2_prototype": "Compressed Fusion Coil MK II Prototype", "block.gtocore.compressor_controller_casing": "Compressor Controller Casing", "block.gtocore.compressor_pipe_casing": "Compressor Pipe Casing", "block.gtocore.containment_field_generator": "Containment Field Generator", @@ -302,9 +303,9 @@ "block.gtocore.enderium_borosilicate_glass": "Enderium Borosilicate Glass", "block.gtocore.energetic_photovoltaic_block": "Energetic Photovoltaic Block", "block.gtocore.energetic_photovoltaic_power_station": "Energetic Photovoltaic Power Station", - "block.gtocore.energy_control_casing_mk1": "Energy Control Casing Mk1", - "block.gtocore.energy_control_casing_mk2": "Energy Control Casing Mk2", - "block.gtocore.energy_control_casing_mk3": "Energy Control Casing Mk3", + "block.gtocore.energy_control_casing_mk1": "Energy Control Casing MK I", + "block.gtocore.energy_control_casing_mk2": "Energy Control Casing MK II", + "block.gtocore.energy_control_casing_mk3": "Energy Control Casing MK III", "block.gtocore.energy_injector": "Energy Injector", "block.gtocore.engineering_mechanical_casing": "Engineering Mechanical Casing", "block.gtocore.engraving_laser_plant": "Engraving Laser Plant", @@ -369,9 +370,9 @@ "block.gtocore.force_field_glass": "Force Field Glass", "block.gtocore.fuel_cell_generator": "Fuel Cell Generator", "block.gtocore.fuel_refining_complex": "Fuel Refining Complex", - "block.gtocore.fusion_casing_mk4": "Fusion Casing Mk4", - "block.gtocore.fusion_casing_mk5": "Fusion Casing Mk5", - "block.gtocore.fusion_coil_mk2": "Fusion Coil Mk2", + "block.gtocore.fusion_casing_mk4": "Fusion Casing MK IV", + "block.gtocore.fusion_casing_mk5": "Fusion Casing MK V", + "block.gtocore.fusion_coil_mk2": "Fusion Coil MK II", "block.gtocore.gaiasteel_casing": "Gaiasteel Casing", "block.gtocore.ganymede_grunt": "Ganymede Grunt", "block.gtocore.ganymede_stone": "Ganymede Stone", @@ -739,9 +740,9 @@ "block.gtocore.machine_access_terminal": "Machine Access Terminal", "block.gtocore.machine_casing_circuit_assembly_line": "Machine Casing Circuit Assembly Line", "block.gtocore.machine_casing_grinding_head": "Machine Casing Grinding Head", - "block.gtocore.machining_control_casing_mk1": "Machining Control Casing Mk1", - "block.gtocore.machining_control_casing_mk2": "Machining Control Casing Mk2", - "block.gtocore.machining_control_casing_mk3": "Machining Control Casing Mk3", + "block.gtocore.machining_control_casing_mk1": "Machining Control Casing MK I", + "block.gtocore.machining_control_casing_mk2": "Machining Control Casing MK II", + "block.gtocore.machining_control_casing_mk3": "Machining Control Casing MK III", "block.gtocore.magic_core": "Magic Core", "block.gtocore.magnesium_oxide_ceramic_high_temperature_insulation_mechanical_block": "Magnesium Oxide Ceramic High Temperature Insulation Mechanical Block", "block.gtocore.magnetic_confinement_dimensionality_shock_device": "Magnetic Confinement Dimensionality Shock Device", @@ -818,7 +819,6 @@ "block.gtocore.me_mana_amplifier_hatch": "Me Mana Amplifier Hatch", "block.gtocore.me_mana_interface": "Me Mana Interface", "block.gtocore.me_muffler_hatch": "ME Muffler Hatch", - "block.gtocore.me_pattern_content_sort_machine": "Me Pattern Content Sort Machine", "block.gtocore.me_simple_pattern_buffer": "ME Simple Pattern Buffer", "block.gtocore.me_storage": "ME Storage", "block.gtocore.me_storage_access_hatch": "ME Storage Access Hatch", @@ -1083,11 +1083,11 @@ "block.gtocore.space_elevator_mechanical_casing": "Space Elevator Mechanical Casing", "block.gtocore.space_elevator_module_base": "Space Elevator Module Base", "block.gtocore.space_elevator_power_core": "Space Elevator Power Core", - "block.gtocore.space_elevator_power_module_1": "Space Elevator Power Module 1", - "block.gtocore.space_elevator_power_module_2": "Space Elevator Power Module 2", - "block.gtocore.space_elevator_power_module_3": "Space Elevator Power Module 3", - "block.gtocore.space_elevator_power_module_4": "Space Elevator Power Module 4", - "block.gtocore.space_elevator_power_module_5": "Space Elevator Power Module 5", + "block.gtocore.space_elevator_power_module_1": "Space Elevator Power Module MK I", + "block.gtocore.space_elevator_power_module_2": "Space Elevator Power Module MK II", + "block.gtocore.space_elevator_power_module_3": "Space Elevator Power Module MK III", + "block.gtocore.space_elevator_power_module_4": "Space Elevator Power Module MK IV", + "block.gtocore.space_elevator_power_module_5": "Space Elevator Power Module MK V", "block.gtocore.space_elevator_support": "Space Elevator Support", "block.gtocore.space_engine_nozzle": "Space Engine Nozzle", "block.gtocore.space_probe_surface_reception": "Space Probe Surface Reception", @@ -1119,18 +1119,18 @@ "block.gtocore.stable_base_casing": "Stable Base Casing", "block.gtocore.stainless_evaporation_casing": "Stainless Evaporation Casing", "block.gtocore.stainless_steel_corrosion_resistant_casing": "Stainless Steel Corrosion Resistant Casing", - "block.gtocore.star_stone_1": "Star Stone Ⅰ", - "block.gtocore.star_stone_10": "Star Stone Ⅹ", - "block.gtocore.star_stone_11": "Star Stone Ⅺ", - "block.gtocore.star_stone_12": "Star Stone Ⅻ", - "block.gtocore.star_stone_2": "Star Stone Ⅱ", - "block.gtocore.star_stone_3": "Star Stone Ⅲ", - "block.gtocore.star_stone_4": "Star Stone Ⅳ", - "block.gtocore.star_stone_5": "Star Stone Ⅴ", - "block.gtocore.star_stone_6": "Star Stone Ⅵ", - "block.gtocore.star_stone_7": "Star Stone Ⅶ", - "block.gtocore.star_stone_8": "Star Stone Ⅷ", - "block.gtocore.star_stone_9": "Star Stone Ⅸ", + "block.gtocore.star_stone_1": "Star Stone I", + "block.gtocore.star_stone_10": "Star Stone X", + "block.gtocore.star_stone_11": "Star Stone XI", + "block.gtocore.star_stone_12": "Star Stone XII", + "block.gtocore.star_stone_2": "Star Stone II", + "block.gtocore.star_stone_3": "Star Stone III", + "block.gtocore.star_stone_4": "Star Stone IV", + "block.gtocore.star_stone_5": "Star Stone V", + "block.gtocore.star_stone_6": "Star Stone VI", + "block.gtocore.star_stone_7": "Star Stone VII", + "block.gtocore.star_stone_8": "Star Stone VIII", + "block.gtocore.star_stone_9": "Star Stone IX", "block.gtocore.star_ultimate_material_forge_factory": "Star Ultimate Material Forge Factory", "block.gtocore.starmetal_coil_block": "Starmetal Coil Block", "block.gtocore.steam_assembly_block": "Steam Assembly Block", @@ -1624,23 +1624,29 @@ "config.gtocore.option.blinkRange": "Staff of Travelling Blink Range (blocks)", "config.gtocore.option.blockRange": "Travel Anchor Block Range (blocks)", "config.gtocore.option.breakBlocksBlackList": "Chain Mining Blacklist", + "config.gtocore.option.cacheResources": "Cache Resources on Startup", "config.gtocore.option.cannibalismDamage": "Carnivory Punish Damage", "config.gtocore.option.cannibalismRadius": "Carnivory Punish Radius", + "config.gtocore.option.client": "Client", "config.gtocore.option.detailedLogging": "[Debug] Detailed Logging", "config.gtocore.option.dev": "Developer Mode", + "config.gtocore.option.devMode": "Dev Mode", "config.gtocore.option.difficulty": "Game Difficulty", "config.gtocore.option.disableChargeBomb": "Disable Charge Bomb", "config.gtocore.option.disableEmbeddiumBECulling": "Disable Embeddium Global BE Culling", "config.gtocore.option.disableMufflerPart": "disable Muffler Part", + "config.gtocore.option.disableRecyclingRecipes": "[Debug] Disable Recycling Recipes", "config.gtocore.option.emiGlobalFavorites": "EMI Global Favorites", "config.gtocore.option.enableCustomRecipes": "Enable Custom Recipes", "config.gtocore.option.exPatternSize": "Extended Pattern Provider Size", "config.gtocore.option.fastMultiBlockPage": "Fast Multiblock Page Loading", "config.gtocore.option.ftbUltimineRange": "Chain Mining Range", + "config.gtocore.option.gamePlay": "Game Play", "config.gtocore.option.hud": "HUD Settings", "config.gtocore.option.itemRange": "Travel Anchor Item Range (blocks)", "config.gtocore.option.lightningRodEffect": "Lightning Rod Effect", "config.gtocore.option.maxMonitorSize": "Maximum Monitor Size", + "config.gtocore.option.misc": "Misc", "config.gtocore.option.mobConfig": "Mob Settings", "config.gtocore.option.naturalRegeneration": "Mob Natural Regeneration", "config.gtocore.option.nightVision": "Built-in Night Vision", @@ -1651,7 +1657,6 @@ "config.gtocore.option.sendMultiblockErrorMessages": "Send Multiblock Error Messages", "config.gtocore.option.serverLang": "Server language", "config.gtocore.option.showAEAmountTooltipEverywhereEmi": "Show AE Amount Tooltip Everywhere in EMI", - "config.gtocore.option.showEnglishName": "Show Item English Name", "config.gtocore.option.staffOfTravellingPatternNodes": "Staff Of Travelling Pattern Nodes", "config.gtocore.option.startSpark": "Spark Profiler Start Phase", "config.gtocore.option.travelConfig": "Travel Settings", @@ -1665,7 +1670,6 @@ "config.jade.plugin_gtocore.ae_grid_provider": "[GTOCore] AE Grid Info", "config.jade.plugin_gtocore.ae_item_amount": "[GTOCore] AE Item Amount", "config.jade.plugin_gtocore.destroy_time_provider": "[GTOCore] Destroy Time Info", - "config.jade.plugin_gtocore.en_lang": "[GTOCore] English Display", "config.jade.plugin_gtocore.maintenance_hatch_provider": "[GTOCore] Maintenance Hatch Info", "config.jade.plugin_gtocore.mana_container_provider": "[GTOCore] Mana Container", "config.jade.plugin_gtocore.temperature_provider": "[GTOCore] Machine Temperature", @@ -2153,12 +2157,15 @@ "gtocore.adv_terminal.setting_already_existed": "Setting Already Existed", "gtocore.ae.appeng.craft.add_missing_to_emi": "Bookmark Missing", "gtocore.ae.appeng.craft.add_missing_to_emi.desc": "Add missing items to EMI bookmark page", + "gtocore.ae.appeng.craft.encode_send": "§o[Right Click] Encode and send pattern§r", + "gtocore.ae.appeng.craft.encode_send.desc": "Click to select the destination Pattern Provider and encode the current recipe to it", "gtocore.ae.appeng.craft.missing_start": "Missing Crafting", "gtocore.ae.appeng.craft.missing_start.desc": "Start crafting even when materials are insufficient, missing ingredients will be waited for", "gtocore.ae.appeng.craft.pause_job": "Pause", "gtocore.ae.appeng.craft.pause_job.desc": "Pause the ongoing crafting; pushed patterns will not be withdrawn", "gtocore.ae.appeng.craft.resume_job": "Resume", "gtocore.ae.appeng.craft.resume_job.desc": "Resume the paused crafting", + "gtocore.ae.appeng.craft.temp_order": "Middle-click to create a temporary crafting order, ordering one set of raw materials for this recipe", "gtocore.ae.appeng.craft.used_percent": "Used %s%%", "gtocore.ae.appeng.crafting.cycle_error.bracket_close": ")", "gtocore.ae.appeng.crafting.cycle_error.bracket_open": " (", @@ -2219,12 +2226,13 @@ "gtocore.ae.appeng.me_storage_amount": "ME Network Stored Amount", "gtocore.ae.appeng.pattern.priority": "Pattern Priority: ", "gtocore.ae.appeng.pattern.priority.desc": "The priority for the patterns offered by this provider. The crafting calculation will prioritize patterns with the highest priority.", + "gtocore.ae.appeng.pattern_content_access_terminal": "Pattern Content Access Terminal", + "gtocore.ae.appeng.pattern_content_access_terminal.replacement_list_name": "Replacement List #%s", + "gtocore.ae.appeng.pattern_content_access_terminal.replacement_list_tooltip": "Configure the filter here to decide which ingredients in the patterns will be replaced.", "gtocore.ae.appeng.pick_craft.all_right": "Crafting started!", - "gtocore.ae.appeng.pick_craft.all_right.title": "Pick-Craft Success", "gtocore.ae.appeng.pick_craft.error.1": "An error occurred while calculating the crafting path.", "gtocore.ae.appeng.pick_craft.error.2": "Insufficient materials/No available CPU to craft the desired item.", "gtocore.ae.appeng.pick_craft.error.3": "The number of created tasks has reached the limit.", - "gtocore.ae.appeng.pick_craft.error.title": "Pick-Craft Error", "gtocore.ae.appeng.wildcard_pattern_buffer.blacklist": "Wildcard Pattern Provider Material Blacklist", "gtocore.ae.appeng.wildcard_pattern_buffer.blacklist.desc": "Materials added to the blacklist will not be used by the Wildcard Pattern Provider.", "gtocore.ae.appeng.wildcard_pattern_buffer.loaded_patterns": "Scanned and loaded %s wildcard patterns.", @@ -2584,8 +2592,9 @@ "gtocore.gray_membership_card.hover_text.2": "Offline players", "gtocore.gray_membership_card.hover_text.3": "Owner: ", "gtocore.gray_membership_card.hover_text.4": "Shared by: ", - "gtocore.gtm": "The GregTech-Modern and Applied Energetics 2 mod used in the modpack is an unofficial version. If you encounter any issues or have any suggestions, please go to %s to provide feedback instead of the official mod channel.", + "gtocore.gtm": "The GregTech-Modern and Applied Energistics 2 mod used in the modpack is an unofficial version. If you encounter any issues or have any suggestions, please go to %s to provide feedback instead of the official mod channel.", "gtocore.gui.encoding_desc": "§o[Shift + Click] insert encoding pattern into player inventory / clear all encoded patterns", + "gtocore.gui.widget.amount_set.hover_tooltip": "Enter an integer from 1 to Long.MAX. Accepts k/m/g notation and expressions", "gtocore.hud.drag": "Right click to enable HUD drag mode", "gtocore.hud.toggle.off": "Left click to toggle HUD display (Disabled)", "gtocore.hud.toggle.on": "Left click to toggle HUD display (Enabled)", @@ -2621,6 +2630,7 @@ "gtocore.integration.ae.WirelessMachine.gridNodeList": "Grid Node List", "gtocore.integration.ae.WirelessMachine.gridNodeSelector": "Grid Node Selector", "gtocore.integration.ae.WirelessMachine.leave": "Leave Wireless Grid", + "gtocore.integration.ae.WirelessMachine.notConnected": "None", "gtocore.integration.ae.WirelessMachine.player": "Bind to player: %s", "gtocore.integration.ae.WirelessMachine.removeGrid": "Remove", "gtocore.integration.ae.WirelessMachine.renameGrid": "Rename Grid", @@ -2646,9 +2656,9 @@ "gtocore.lang.-121146516": "Operation duration adjustment range: 40%~100%", "gtocore.lang.-1261349876": "This organ will allow", "gtocore.lang.-1269813583": "Armor Toughness", - "gtocore.lang.-1271244345": "its content will be replaced according to the priority you configured.", "gtocore.lang.-1309148959": "explode", "gtocore.lang.-1315180647": "§aShift + Right-Click:§r Clear the mark of this position§r", + "gtocore.lang.-1334423408": "Built-in parallel processing, no parallel control hatch required", "gtocore.lang.-1344483012": "Allows the expansion of structures to improve machine efficiency.", "gtocore.lang.-1383224310": "Deplition Rate : 0", "gtocore.lang.-1413498661": "Integrates the functions of ME Pattern Encoding Terminal and Pattern Access Terminal, ", @@ -2671,11 +2681,13 @@ "gtocore.lang.-1955828040": "Note: ", "gtocore.lang.-2014927121": "For every 900K increase in coil temperature, the parallel number doubles", "gtocore.lang.-2028697327": "Formula: 4^(Glass Tier)", + "gtocore.lang.-2034043716": "For example, if you fill in the configuration with 'Oak Planks, Birch Planks, Spruce Planks' in order, then when a pattern's ingredient uses Birch or Spruce Planks, the pattern will be dynamically modified to use Oak Planks as the ingredient.", "gtocore.lang.-2055315894": "Speed Boost", "gtocore.lang.-2112077052": "Types of Space Modules can connect to:", "gtocore.lang.-267849233": "Breath Under Water", "gtocore.lang.-268739386": "Parallel Bonus", "gtocore.lang.-287954562": " Edition", + "gtocore.lang.-294733446": "In each configuration group, the replacement order is from right to left.", "gtocore.lang.-300078703": "From ULV, each voltage tier increases the obtained parallelism by 2", "gtocore.lang.-346445743": "A complete set of armor is required", "gtocore.lang.-374056284": "This organ will provide", @@ -2694,6 +2706,7 @@ "gtocore.lang.-698628939": "Requires a wireless charger to use", "gtocore.lang.-724709346": "Represents whether this hatch can be shared by multiple multi-block structures", "gtocore.lang.-749025748": "0.1 + 6.384 / (1.632 + (Energy consumption in GEU)) ^ 4", + "gtocore.lang.-76006678": "Simply connect this machine to the ME network, and when a pattern is called, its content will be replaced according to your configured priorities on the same line.", "gtocore.lang.-781353543": "Can only run §9IV§r-tier and below recipes", "gtocore.lang.-790651361": "ME Wireless Connection Machine", "gtocore.lang.-801705034": "Operation duration adjustment range: 28%~100%", @@ -2706,10 +2719,11 @@ "gtocore.lang.-88949489": "Operation duration adjustment range: 32%~100%", "gtocore.lang.-94407882": "Conjunction Module", "gtocore.lang.-98188006": "§7When upgrading from a BigInt Storage Access Hatch to this Storage Access Hatch, if the original storage exceeds 9.2E18, the excess will be §c§lpermanently lost§r§7!§r", - "gtocore.lang.0.-568444703": "Shift+Right click a block to copy its name, which is convenient for naming", "gtocore.lang.0.1059274564": "Super CPU in ME Network", + "gtocore.lang.0.1640495616": "Shift+Right click a block to copy its name", "gtocore.lang.0.475558069": "Needs oxygen and power to work", "gtocore.lang.1.1285447032": "CPU Performance", + "gtocore.lang.1.336979551": "Right click an item to copy its name", "gtocore.lang.1000504160": "Prediction and Synthesis: ", "gtocore.lang.1011049812": "Each Rotor Holder above §6HV§r adds 10% efficiency and multiplies EU/t by 2", "gtocore.lang.1024": " ", @@ -2721,7 +2735,6 @@ "gtocore.lang.1070805810": "Base Production EUt: ", "gtocore.lang.1084246430": "Max Temperature: ", "gtocore.lang.1087090424": "Modulating Attribute: ", - "gtocore.lang.1137917401": "The acceleration effect is weakened by 20% per level when the level of the accelerate hatch is lower than the machine's maximum voltage level", "gtocore.lang.1151803146": "After Module Installation", "gtocore.lang.1158649764": "Milestone Building", "gtocore.lang.1160719164": "9007199254740991", @@ -2731,13 +2744,15 @@ "gtocore.lang.1253850554": "Imagine the unimaginable work efficiency, go ahead and do it!", "gtocore.lang.1254853426": "Each product in the recipe requires a layer of distillation tower.", "gtocore.lang.1274868018": "Each Rotor Holder above §5EV§r adds 10% efficiency and multiplies EU/t by 2", + "gtocore.lang.130790430": "Allows the installation of parallel control hatches to achieve parallel processing", "gtocore.lang.1364194362": "Formula: Number of Nano Swarms * 2^(Machine Tier - Recipe Tier), do the math", "gtocore.lang.1367583746": "Description: ", - "gtocore.lang.1376594968": "Just connect this machine to the ME network, and when the pattern is called,", "gtocore.lang.1394390896": "Pattern Hatch", "gtocore.lang.140180329": "Can transmit across different worlds", "gtocore.lang.1427": "- ", + "gtocore.lang.1435846884": "Represents whether the hatches can independently select recipe types, unrestricted by the machine's own recipe type", "gtocore.lang.1453419452": "Can only run §8ULV§r-tier and below recipes", + "gtocore.lang.1482192762": "Dynamic Pattern Content Replacement", "gtocore.lang.1482865987": "262144", "gtocore.lang.1490368255": "I calculated it for you, it is 1073741824 Bytes", "gtocore.lang.1507489": "1024", @@ -2778,17 +2793,17 @@ "gtocore.lang.1961950737": "1048576", "gtocore.lang.1978323557": "§7Used to mark the target location for Tesseract proxy in order.§r", "gtocore.lang.2.357711854": "Capacity: Determines the total task size the CPU can handle", + "gtocore.lang.2005677336": "The acceleration effect is weakened by 20% per level when the level of the accelerate hatch is lower than the recipe's voltage level", "gtocore.lang.206509868": "17,179.87M (17.2G) Bytes", "gtocore.lang.207321486": "Number of Fuel Components", "gtocore.lang.209383949": "Core Module", "gtocore.lang.233819385": "Coil Efficiency Bonus", "gtocore.lang.237817396": "Infinite", - "gtocore.lang.241585397": "Supports both items and fluids", "gtocore.lang.266512477": "256x -> 384x", + "gtocore.lang.280946395": "Content Pattern Access", "gtocore.lang.281670066": "Each Rotor Holder above §9IV§r adds 10% efficiency and multiplies EU/t by 2", "gtocore.lang.3.2106472575": "Fill 481 T5 storage units to unlock infinity storage", "gtocore.lang.32551241": " and ", - "gtocore.lang.343537399": "ME Pattern Content Dynamic Modifier", "gtocore.lang.350931190": "§7Once a crown for the weary soul, now a cure for the ailing whole.§r", "gtocore.lang.362619935": "4194304", "gtocore.lang.363439179": "(Hermetic Mechanical Casing tier)×4", @@ -2800,7 +2815,6 @@ "gtocore.lang.4.334244742": "Formula: ΣCrafting unit storage", "gtocore.lang.407924965": "Unconditionally accelerates machine operation speed", "gtocore.lang.41478": " ☆", - "gtocore.lang.417880883": "Yes, you can now replace the content of a pattern without modifying it.", "gtocore.lang.447198717": "Kabbalistic Sephirah: ", "gtocore.lang.46299910": "The number of Nano Swarms in the machine; for each machine tier above the recipe tier, the obtained parallel is doubled", "gtocore.lang.46912042": "16384", @@ -2838,6 +2852,7 @@ "gtocore.lang.716205946": "Temperature: ", "gtocore.lang.735333575": "§aAfter installing this hatch, the overclocking effect is increased to a maximum of every 4 times power used, machine duration ×16.67%§r", "gtocore.lang.740444711": "§aAfter installing this hatch, the overclocking effect is increased to a maximum of every 4 times power used, machine duration ×12.5%§r", + "gtocore.lang.760352670": "Replace from right to left", "gtocore.lang.76517104": "Other", "gtocore.lang.79175": "৹ ", "gtocore.lang.8.-1732543330": "Formula: 2^Glass Tier", @@ -3213,7 +3228,7 @@ "gtocore.lang.advanced_assembly_line.3.-538236882": "Efforts paid off. Despite limitations, the new model's efficiency increased several times over previous versions", "gtocore.lang.advanced_assembly_line.3.645766060": "Only data target chambers can be used", "gtocore.lang.advanced_hyper_cube_machine.0.1577061162": "Proxy (a or multi) (fluid or item or both)storage", - "gtocore.lang.advanced_hyper_cube_machine.1.188391162": "Use the §bCordinate Card§r to bind a storage block", + "gtocore.lang.advanced_hyper_cube_machine.1.-1761448469": "Use the §bCoordinate Card§r to bind a storage block", "gtocore.lang.advanced_hyper_cube_machine.2.-178785670": "Bind a storage to this machine to operate it as if it were the bound storage", "gtocore.lang.advanced_hyper_cube_machine.3.-154366173": "Operate them in order if bind multiple storages", "gtocore.lang.advanced_hyper_cube_machine.4.-306503171": "Right click to open the interface", @@ -3224,9 +3239,9 @@ "gtocore.lang.advanced_infinite_driller.11.1673844845": "Liquid Oxygen 2K/per input", "gtocore.lang.advanced_infinite_driller.12.-1559757127": "Liquid Helium 4K/per input", "gtocore.lang.advanced_infinite_driller.13.-1146717525": "Only Neutron-element drill heads can be placed (more to be determined)", - "gtocore.lang.advanced_infinite_driller.2.-437538": "Requires heating to start, input Liquid Blaze or Liquid Blaze Cubes", + "gtocore.lang.advanced_infinite_driller.2.1762934901": "Requires heating to start, input Liquid Blaze or Liquid Blazecube", "gtocore.lang.advanced_infinite_driller.3.-656059058": "Heating material consumption formula(unit: mB): Temperature^1.3", - "gtocore.lang.advanced_infinite_driller.4.-517642844": "Heating speed: (every 5 ticks) Liquid Blaze: 1K / per input, Liquid Blaze Cubes: 1000K / per input", + "gtocore.lang.advanced_infinite_driller.4.-576390099": "Heating speed: (every 5 ticks) Liquid Blaze: 1K / per input, Liquid Blazecube: 1000K / per input", "gtocore.lang.advanced_infinite_driller.5.-785999812": "Higher temperature will give higher efficiency", "gtocore.lang.advanced_infinite_driller.6.-363931573": "If the machine overheats, drill head will melt", "gtocore.lang.advanced_infinite_driller.7.1939316591": "Heat generation formula: Temperature / 2000", @@ -3276,11 +3291,11 @@ "gtocore.lang.area_destruction_tools.2.1258760006": "One click to clear the blocks!!!", "gtocore.lang.area_destruction_tools.3.113394524": "Ignore all conditions!!!", "gtocore.lang.area_destruction_tools.4.156723940": "Pay attention to blasting safety!!!", - "gtocore.lang.area_destruction_tools.5.1790692799": "Be sure to remind other players in the multiplayer game! ", + "gtocore.lang.area_destruction_tools.5.755143680": "Be sure to warn other players in the multiplayer game! ", "gtocore.lang.area_destruction_tools.6.-2083166503": "Available Modes", "gtocore.lang.area_destruction_tools.7.-1543656193": "Add items to inventory to switch modes", "gtocore.lang.area_destruction_tools.8.-378576493": "Put §bCasting Mold (Ball)§r for §6Ball mode§r", - "gtocore.lang.area_destruction_tools.9.-200198626": "Put §bCasting Mold (Cylinder)§r for §6Casting mode§r", + "gtocore.lang.area_destruction_tools.9.422090037": "Put §bCasting Mold (Cylinder)§r for §Cylinder mode§r", "gtocore.lang.atmosphere_collector_room.0.654405850": "The atmosphere juicer, specializes in collecting planetary breath", "gtocore.lang.atmosphere_collector_room.1.-204933001": "From thin upper layers to dense troposphere, no gas is too tough to extract", "gtocore.lang.atmosphere_collector_room.2.-909799297": "Extra-large capacity design, one bottle equals six regular collectors", @@ -3297,7 +3312,7 @@ "gtocore.lang.atomizing_condenser.9.-2010464440": "The manager, upon hearing this, not only did not scold him but also documented the unexpected process and developed this machine specifically for producing metal powders from molten fluids.", "gtocore.lang.auto_connect_me.0.621798580": "Allow automatically connecting to the ME Wireless network", "gtocore.lang.auto_connect_me.1.-1869929608": "Press Shift to place to automatically connect to the collected network", - "gtocore.lang.auto_connect_me.2.-1916171520": "Be careful to explode the ae storage! ", + "gtocore.lang.auto_connect_me.2.95823732": "Be careful not to overflow your AE storage! ", "gtocore.lang.banned": "Channel mode command banned in expert", "gtocore.lang.bedrock_drilling_rig.0.1667945339": "Quantum tunneling drill bit breaks material stability limits, acting directly on bedrock atomic nuclei", "gtocore.lang.bedrock_drilling_rig.1.1768817903": "Requires bedrock below the drill head", @@ -3356,7 +3371,7 @@ "gtocore.lang.chemical_complex.5.-1084339066": "Molecular synthesis is as elegant as artistic creation", "gtocore.lang.chemical_energy_devourer.3.-1890569742": "Provide 80mB/s of §eLiquid Oxygen§r, consuming §adouble§r fuel to produce up to ", "gtocore.lang.chemical_energy_devourer.3.31691509": " EU/t", - "gtocore.lang.chemical_energy_devourer.4.-63158004": "Provide extra 480mB/s of §eNitrous Oxide§r, consuming §afour times§r fuel to produce up to ", + "gtocore.lang.chemical_energy_devourer.4.-149782026": "Provide extra 480mB/s of §eDinitrogen Tetroxide§r, consuming §afour times§r fuel to produce up to ", "gtocore.lang.chemical_energy_devourer.4.31691509": " EU/t", "gtocore.lang.chemical_factory.0.197596055": "In the world of chemistry, every molecule tells its own story", "gtocore.lang.chemical_factory.1.-2092154410": "Each coil tier above Cupronickel, Reduces energy consumption and duration by 5%", @@ -3415,9 +3430,8 @@ "gtocore.lang.comprehensive_tombarthite_processing_facility.4.-329785974": "Precision vibrations during operation resemble the earth's heartbeat, steady and powerful", "gtocore.lang.comprehensive_tombarthite_processing_facility.5.1374549352": "Ultimate embodiment of rare earth separation technology, making rare elements within reach", "gtocore.lang.conjunction_space_station_module.0.-1983123524": "Types of Industrial Space Station Modules", - "gtocore.lang.conversion_simulation_card.0.1367867718": "Provides a simulated conversion environment for large block conversion chambers", "gtocore.lang.core_space_station_module.0.-1983123524": "Types of Industrial Space Station Modules", - "gtocore.lang.cosmic_celestial_spire_of_convergence.0.-2075807420": "Blade of starry vault rends the dimensional veil, Grey Mages embark on a century-long sail.", + "gtocore.lang.cosmic_celestial_spire_of_convergence.0.-1401508330": "Blade of starry vault rends the dimensional veil, Greg Mages embark on a century-long sail.", "gtocore.lang.cosmic_celestial_spire_of_convergence.1.-348232064": "Across the void’s stillness, through chaotic realms they prevail, Carve divine runes in polar bounds, forge sacred chambers from dark shale.", "gtocore.lang.cosmic_celestial_spire_of_convergence.10.1430835709": "Must be directly exposed to the open sky with no obstructions", "gtocore.lang.cosmic_celestial_spire_of_convergence.11.1901526002": "Can condense Solaris during daytime", @@ -3431,7 +3445,7 @@ "gtocore.lang.cosmic_celestial_spire_of_convergence.2.1446103170": "Unravel the celestial laws, temper star-marrow to steel, First lit in star-sea, the Sanctum’s radiance doth reveal.", "gtocore.lang.cosmic_celestial_spire_of_convergence.3.908268921": "Galaxies surge backward into the core’s heart, Sun and moon weave a web, the void doth impart a mighty tremor.", "gtocore.lang.cosmic_celestial_spire_of_convergence.4.-1899796545": "By dimensional might it stands, A tiny spark stirs the primeval lands.", - "gtocore.lang.cosmic_celestial_spire_of_convergence.5.-862211846": "Grey’s blood and sweat forge a miracle grand, For civilisation’s cosmic expand, Eternally lay the heavenly land.", + "gtocore.lang.cosmic_celestial_spire_of_convergence.5.-104885272": "Greg’s blood and sweat forge a miracle grand, For civilisation’s cosmic expand, Eternally lay the heavenly land.", "gtocore.lang.cosmic_celestial_spire_of_convergence.6.1853694950": "Condense the power of the gathered stars", "gtocore.lang.cosmic_celestial_spire_of_convergence.7.1908133572": "Consumable Mana Overclocking", "gtocore.lang.cosmic_celestial_spire_of_convergence.8.-1594027075": "Consumes 2^(overclockingLevel * 4 + 10) mana points each time, boosts condensation efficiency by 2^(overclockingLevel * 5)", @@ -3600,7 +3614,7 @@ "gtocore.lang.fast_neutron_breeder.15.1228212578": "Small Pile/Big Pile/Graphite Dust reduce by 0.1/0.25/1MeV respectively", "gtocore.lang.fast_neutron_breeder.16.727805493": "When neutron flux is E (keV), after placing N Iridium Neutron Reflectors in the mainframe, neutron flux increases by (EN)^0.5 keV per second", "gtocore.lang.fast_neutron_breeder.17.-1548239181": "Initial temperature 298K, critical point 2098K", - "gtocore.lang.fast_neutron_breeder.18.-845117880": "According to calculations, when neutron kinetic energy is above 4.5keV, the pile temperature will rise by 1800K per second, enough to reach the critical point in one second", + "gtocore.lang.fast_neutron_breeder.18.1159230446": "According to calculations, when neutron kinetic energy is above 7MeV, the pile temperature will rise by 1800K per second, enough to reach the critical point in one second", "gtocore.lang.fast_neutron_breeder.19.-140293769": "Heat generation formula per second: H=K×1.27×(E×10)^1.88, result rounded up", "gtocore.lang.fast_neutron_breeder.2.-1346839424": "Recipe requires minimum neutron flux", "gtocore.lang.fast_neutron_breeder.20.1058073012": "Coolant coefficients(K/mB/s): Distilled Water 1, Liquid Nitrogen 4, Liquid Helium 80", @@ -3643,21 +3657,21 @@ "gtocore.lang.fission_reactor.10.-1097033981": "Natural cooling: 1K/sec when stopped", "gtocore.lang.fission_reactor.11.673958219": "Exceeding temperature limit damages machine, when fully damaged ", "gtocore.lang.fission_reactor.12.-916343722": "Cooling system", - "gtocore.lang.fission_reactor.13.-570274144": "Cooling liquid types: Distilled water or sodium-potassium alloy", + "gtocore.lang.fission_reactor.13.-1660298463": "Cooling liquid (coefficients): Distilled Water (800) Sodium Potassium (20)", "gtocore.lang.fission_reactor.14.-461574819": "Cooling condition: Supply ≥ demand", - "gtocore.lang.fission_reactor.15.-1155863786": "Min demand = recipe heat × cooling param × actual parallel × current temp / 1500", - "gtocore.lang.fission_reactor.16.674459852": "Max supply = (cooling components - adjacent/3) × 8", - "gtocore.lang.fission_reactor.17.1037486894": "Consumption = demand × cooling liquid coefficient", + "gtocore.lang.fission_reactor.15.2020151051": "Demand = recipe heat × actual parallel × current temp / 1500", + "gtocore.lang.fission_reactor.16.-1344879984": "Supply = (cooling components - adjacent/3) × 8", + "gtocore.lang.fission_reactor.17.1656673038": "Consumption = Demand × cooling liquid coefficient", "gtocore.lang.fission_reactor.18.682210113": "Overclocking mechanism", - "gtocore.lang.fission_reactor.19.-971847264": "Trigger condition: Supply ≥ n × demand (n>1", + "gtocore.lang.fission_reactor.19.-62494071": "Trigger condition: Supply ≥ n × demand (n>1)", "gtocore.lang.fission_reactor.2.-1593095757": "He claims GT's advanced chemical tech can produce NaK coolant to fully unleash this machine's potential", "gtocore.lang.fission_reactor.2.-162474227": "Fuel component: Provides maximum parallel number", - "gtocore.lang.fission_reactor.20.-1470811327": "Overclocking effect: Reduce n seconds recipe time", + "gtocore.lang.fission_reactor.20.-1889434194": "Overclocking effect: Operation speed increased to n times", "gtocore.lang.fission_reactor.21.629215326": "Cooling liquid output", - "gtocore.lang.fission_reactor.22.135781624": "Distilled water cooling: ", + "gtocore.lang.fission_reactor.22.-861236008": "Distilled Water cooling: ", "gtocore.lang.fission_reactor.23.-688763008": "Produces steam, Output = consumption × min(160, 160/(1.4^(373-temperature)))", - "gtocore.lang.fission_reactor.24.1887171541": "Sodium-potassium alloy cooling:", - "gtocore.lang.fission_reactor.25.-1147508056": "≤825K: Hot sodium-potassium alloy; >825K: Supercritical sodium-potassium alloy", + "gtocore.lang.fission_reactor.24.1145967411": "Sodium Potassium cooling:", + "gtocore.lang.fission_reactor.25.-139514968": "≤825K: Hot Sodium Potassium; >825K: Supercritical Sodium Potassium", "gtocore.lang.fission_reactor.3.-1623337062": "Heating coefficient = adjacent fuel components + 1", "gtocore.lang.fission_reactor.3.-1833223094": "No one knows the truth, after all how much honesty can you expect from a job-hopper", "gtocore.lang.fission_reactor.4.668971985": "Cooling component: Provides maximum cooling capability", @@ -3780,7 +3794,7 @@ "gtocore.lang.holy_separator.2.-1124245426": "Altar-like rotating platform, making centrifugation like a sacred purification ritual", "gtocore.lang.holy_separator.3.205609803": "Emits solemn low-frequency hum, like chanting separation hymns", "gtocore.lang.holy_separator.4.-1480114238": "Density differences become the most elegant separation art", - "gtocore.lang.hyper_cube_machine.0.365030754": "Proxy a fluid or item or both storage", + "gtocore.lang.hyper_cube_machine.0.-1568948399": "Proxy a fluid or item or both storages", "gtocore.lang.hyper_cube_machine.1.188391162": "Use the §bCordinate Card§r to bind a storage block", "gtocore.lang.hyper_cube_machine.2.-178785670": "Bind a storage to this machine to operate it as if it were the bound storage", "gtocore.lang.hyper_cube_machine.3.-306503171": "Right click to open the interface", @@ -3802,7 +3816,7 @@ "gtocore.lang.industrial_platform_deployment_tools.5.-1450367514": "Industrial Platform Deployment Tools", "gtocore.lang.industrial_platform_deployment_tools.5.958391167": "Miraculous Tools: ", "gtocore.lang.industrial_platform_deployment_tools.6.1699145324": "Rapidly deploy industrial bases via preset blueprints", - "gtocore.lang.industrial_platform_deployment_tools.7.-1645570500": "Requires specific industrial components components as basic construction materials.", + "gtocore.lang.industrial_platform_deployment_tools.7.1832452560": "Requires specific industrial components as basic construction materials.", "gtocore.lang.industrial_platform_deployment_tools.8.525488636": "Some advanced blueprints require supplementary materials.", "gtocore.lang.industrial_platform_deployment_tools.9.-373629456": "Professional-grade industrial base construction tool", "gtocore.lang.industrial_platform_deployment_tools.introduction.0.166055481": "Quickly deploy standardized industrial platforms", @@ -3825,7 +3839,7 @@ "gtocore.lang.industrial_platform_deployment_tools.introduction.24.1066829591": "Blueprint Export Function", "gtocore.lang.industrial_platform_deployment_tools.introduction.25.1469547294": "Insert two coordinate cards into the tool's bottom slots to activate export mode", "gtocore.lang.industrial_platform_deployment_tools.introduction.26.-2113609600": "Welcome to submit high-quality blueprints to the community repository", - "gtocore.lang.industrial_platform_deployment_tools.introduction.27.2127441005": "Not supporting frame blocks and small squares", + "gtocore.lang.industrial_platform_deployment_tools.introduction.27.155189904": "Does not support FramedBlocks or LittleTiles", "gtocore.lang.industrial_platform_deployment_tools.introduction.3.-2069210991": "It can both quickly build basic production nodes like ore sorting stations and expand into complex industrial clusters with refining workshops and storage centers.", "gtocore.lang.industrial_platform_deployment_tools.introduction.4.1073467762": "Interface Explanation", "gtocore.lang.industrial_platform_deployment_tools.introduction.5.-1070998781": "1. Blueprint Selection Page - For browsing/filtering presets, previewing structures, viewing material lists, and adjusting deployment parameters", @@ -3958,7 +3972,7 @@ "gtocore.lang.large_space_station.0.-171313362": "GTO Universe Group's space station has been successfully operating for many years", "gtocore.lang.large_space_station.1.-231416899": "To meet the needs of more and larger machines, GTO Universe Group decided to build a larger space station", "gtocore.lang.large_space_station.1.-842118898": "Provides a space that protects machines from complex environments such as space radiation", - "gtocore.lang.large_space_station.11.-137832514": "Operation requires a base energy consumption of 1920EU/t", + "gtocore.lang.large_space_station.11.-761641233": "Operation requires a base energy consumption of 7680EU/t", "gtocore.lang.large_space_station.12.538665093": "Will increase additional energy consumption and resource consumption based on the number of expansion modules installed", "gtocore.lang.large_space_station.13.-1933155152": "Fixed consumption every second:", "gtocore.lang.large_space_station.14.-439688291": "15mB * (1 + number of expansion modules) Distilled Water", @@ -3995,13 +4009,13 @@ "gtocore.lang.large_steam_circuit_assembler.6.1319503679": "Unlocks overclocking function", "gtocore.lang.large_steam_circuit_assembler.7.1488230621": "Circuit Multiplication", "gtocore.lang.large_steam_circuit_assembler.8.1977435861": "Multiply Mode multiplies circuit output (Enabled by default)", - "gtocore.lang.large_steam_cracker.0.-1674002160": "The raw material efficiency is only 80% of that of a normal cracker", - "gtocore.lang.large_steam_cracker.1.-40088499": "For each higher level of steam input hatch used, the raw material efficiency increases by 20%", + "gtocore.lang.large_steam_cracker.0.1217765388": "The raw material efficiency is only 40% of that of a normal cracker", + "gtocore.lang.large_steam_cracker.1.1027096257": "For each higher level of steam input hatch used, the output increases by 100mb", "gtocore.lang.large_steam_solar_boiler.0.-1779936924": "Relying on nature has always been the company's ancestral tradition", "gtocore.lang.large_steam_solar_boiler.1.-2105861460": "But ancient methods can't make high-tech solar panels so we just lay them out flat to get by", "gtocore.lang.large_steam_solar_boiler.2.2028482001": "Anyway it's free so no one complains about it", "gtocore.lang.large_turbine.4.-1092594663": "Gains 2x speed", - "gtocore.lang.large_turbine.5.-334038057": "Gains additional 120% turbine efficiency", + "gtocore.lang.large_turbine.5.944353312": "Gains additional 20% turbine efficiency", "gtocore.lang.large_turbine.6.1503536831": "Rotor wear rate becomes 2x", "gtocore.lang.large_void_miner.0.1610129296": "Watching the minerals in the warehouse gradually running short, the chairman looked somewhat worried", "gtocore.lang.large_void_miner.0.2128106565": "Precision Mode", @@ -4056,7 +4070,7 @@ "gtocore.lang.mana_amplifier_hatch.3.898412636": "For cross-recipe machines, the overclocking factor is further multiplied by x2.", "gtocore.lang.mana_amplifier_hatch.4.-507469829": "Otherwise, the machine will not execute the recipe.", "gtocore.lang.mana_heater.1.724409426": "Input mana to heat", - "gtocore.lang.mana_heater.2.-1602020602": "If §cfire element gas§r is input, the heating speed will be 5 times faster", + "gtocore.lang.mana_heater.2.1577697679": "If §cSalamander Vapor§r is input, the heating speed will be 5 times faster", "gtocore.lang.mantle_crusher.0.1155931590": "Industrial incarnation of Earth's core, harnessing mantle power to crush all", "gtocore.lang.mantle_crusher.1.-275128847": "Just throw the rocks in, and leave the rest to the mantle-level crushing power", "gtocore.lang.mantle_crusher.2.-1262270807": "From ores to waste, any material can be crushed into the finest particles here", @@ -4085,6 +4099,7 @@ "gtocore.lang.me_pattern_hatch.1.1438463364": "Can put patterns and distribute them one click", "gtocore.lang.me_pattern_hatch.2.90273460": "Patterns are isolated from each other, do not interfere with each other", "gtocore.lang.me_pattern_hatch.3.-303408860": "Press the middle mouse button on the pattern to set the circuit or provide special input", + "gtocore.lang.me_pattern_hatch.4.228256588": "Can independently select recipe types, unrestricted by the machine's own settings", "gtocore.lang.me_storage.0.1603758035": "ME Storage", "gtocore.lang.me_storage.1.69447024": "Without storage type restrictions", "gtocore.lang.me_storage.2.-1248245399": "Install Storage Cores in structure to increase capacity.", @@ -4565,8 +4580,8 @@ "gtocore.lang.rotor_hatch.1.254780438": "Different types of rotors have different efficiency and durability", "gtocore.lang.satellite_control_center.0.-581836799": "Launch a satellite and bring back planet data", "gtocore.lang.sensor.0.-908223020": "Redstone Signal", - "gtocore.lang.sensor.1.-547927712": "When not inverted, outputs 0 when the value is below the minimum or above the maximum, or an increasing redstone signal between 1-14 when in between", - "gtocore.lang.sensor.2.1092475273": "When inverted, outputs 15 when the value is above the maximum or below the minimum, or a decreasing redstone signal between 1-14 when in between", + "gtocore.lang.sensor.1.805381985": "When not inverted, outputs 0 when the value is below the minimum or above the maximum, or an increasing redstone signal between 1-15 when in between", + "gtocore.lang.sensor.2.-1849182326": "When inverted, outputs 15 when the value is above the maximum or below the minimum, or a decreasing redstone signal between 1-15 when in between", "gtocore.lang.sintering_furnace.0.-1087549334": "As the core equipment", "gtocore.lang.sintering_furnace.1.-2079148997": "GTO Staffs fought countless days and nights for this sintering furnace", "gtocore.lang.sintering_furnace.2.-1564634528": "Model HCS-41 sintering furnace has perfect finished product rate", @@ -4617,9 +4632,9 @@ "gtocore.lang.space_probe_surface_reception.4.1443410799": "Increases production based on Dyson sphere module count", "gtocore.lang.space_probe_surface_reception.5.1355476240": "This operation will not damage the Dyson sphere", "gtocore.lang.space_shield_hatch.0.-286075237": "A small protective shield urgently developed by researchers when GTO Universal Heavy Industries' space station technology was not fully developed", - "gtocore.lang.space_shield_hatch.1.214640611": "After technical improvements, it can now protect machines from being unable to operate due to space environment interference", + "gtocore.lang.space_shield_hatch.1.-1725316429": "After technical improvements, it can now protect machines from space environment interference", "gtocore.lang.space_shield_hatch.2.1525594846": "Requires lasers provided by built-in laser hatches in the machine", - "gtocore.lang.space_shield_hatch.4.1078238127": "Protects machines from being unable to operate due to space environment interference", + "gtocore.lang.space_shield_hatch.4.969054311": "Protects machines from space environment interference", "gtocore.lang.space_shield_hatch.5.362873821": "Requires the machine to be equipped with laser hatches at the same time", "gtocore.lang.space_station.0.-1759943409": "Welcome to GTO Universe Group's Space Station", "gtocore.lang.space_station.1.-842118898": "Provides a space that protects machines from complex environments such as space radiation", @@ -4760,18 +4775,18 @@ "gtocore.lang.the_primordial_reconstructor.14.177619011": "Consume magic power to synthesize, and requires an Affix Canvas", "gtocore.lang.the_primordial_reconstructor.15.-1607911616": "Circuit 8: Gem Merge", "gtocore.lang.the_primordial_reconstructor.16.304631115": "Use the same level of rarity materials and gem dust to merge gems", - "gtocore.lang.the_primordial_reconstructor.17.-1023124673": "Circuit 8: Gem Crushing", + "gtocore.lang.the_primordial_reconstructor.17.484427136": "Circuit 9: Gem Crushing", "gtocore.lang.the_primordial_reconstructor.18.1377677116": "Crushing gems to obtain gem dust", - "gtocore.lang.the_primordial_reconstructor.19.1043709144": "Circuit 9: Forced enchantment", + "gtocore.lang.the_primordial_reconstructor.19.-1859407092": "Circuit 10: Forced enchantment", "gtocore.lang.the_primordial_reconstructor.2.-1834983047": "Requires input Book Affix Canvas Sigil of Withdrawal", "gtocore.lang.the_primordial_reconstructor.20.-1573633020": "Consume magic power to forcibly adds the enchantment from the enchanted book to the item", - "gtocore.lang.the_primordial_reconstructor.21.20755412": "Circuit 10: Forced add affixes", + "gtocore.lang.the_primordial_reconstructor.21.232106325": "Circuit 11: Forced add affixes", "gtocore.lang.the_primordial_reconstructor.22.150684258": "Consume magic power to forcibly adds the affixes from the affix canvas to the item", - "gtocore.lang.the_primordial_reconstructor.23.1946350774": "Circuit 11: Forcefully modify item rarity", + "gtocore.lang.the_primordial_reconstructor.23.-63753067": "Circuit 12: Forcefully modify item rarity", "gtocore.lang.the_primordial_reconstructor.24.1541758190": "Consume magic power and enter rarity material and sigil of rebirth to forcibly change the rarity", - "gtocore.lang.the_primordial_reconstructor.25.2115773330": "Circuit 12: Forced addition of sockets", + "gtocore.lang.the_primordial_reconstructor.25.-1486092269": "Circuit 13: Forced addition of sockets", "gtocore.lang.the_primordial_reconstructor.26.2025332053": "Consume magic power and enter sigil of socketing to forcibly addition of sockets", - "gtocore.lang.the_primordial_reconstructor.27.560967334": "Circuit 13: Forced gem inlay", + "gtocore.lang.the_primordial_reconstructor.27.-283504537": "Circuit 14: Forced gem inlay", "gtocore.lang.the_primordial_reconstructor.28.-1321781064": "Consume magic power to forcibly inserting gems into items", "gtocore.lang.the_primordial_reconstructor.3.844478837": "Circuit 2: Item + Enchantments Deconstruction", "gtocore.lang.the_primordial_reconstructor.4.1145404194": "Requires input Affix Canvas Sigil of Withdrawal", @@ -4830,7 +4845,7 @@ "gtocore.lang.village_trading_station.11.-2135450499": "Crafted with precision by Pan-Galaxy Greg Technology R&D", "gtocore.lang.village_trading_station.12.1168006789": "For detailed instructions, refer to the in-machine manual", "gtocore.lang.village_trading_station.2.2067725596": "The resulting Village Trading Station enabled fully automated transactions: no need for matching work blocks—simply place villagers, lock their information, and the built-in system automatically handles trades and restocks at set intervals.", - "gtocore.lang.village_trading_station.3.-1903998976": "With upgraded bulk trading and intelligent restocking, villagers often smiled and praised: 'Greg Tech's machine is more reliable than messengers who wear themselves out running'.", + "gtocore.lang.village_trading_station.3.826867541": "With upgraded bulk trading and intelligent restocking, villagers often smiled and praised: 'Greg Tech's machine is more reliable than couriers running their legs off'.", "gtocore.lang.village_trading_station.4.-1550776722": "Now it serves as a friendly bridge between the company and villages, boosting resource circulation efficiency manifold while deepening mutual trust through seamless transactions.", "gtocore.lang.village_trading_station.5.1020125537": "Village Trading Station", "gtocore.lang.village_trading_station.5.958391167": "Miraculous Tools: ", @@ -4868,13 +4883,19 @@ "gtocore.lang.village_trading_station.introduction.9.-1842078679": "4. Direction Configuration Page - Configures item output direction to flexibly adapt to base logistics layouts.", "gtocore.lang.void_fluid_drill.0.-268833863": "Void Fluid Drill§r is another masterpiece of GregTech in the void field", "gtocore.lang.void_fluid_drill.1.1882050481": "It can drill fluids in the void", - "gtocore.lang.void_fluid_drill.2.1383463229": "Insert dimension data and set the circuit to obtain fluids from corresponding world fluid deposits", - "gtocore.lang.void_fluid_drilling_rig.1.-1080730207": "Requires minimum 30720 EU/t", - "gtocore.lang.void_miner.1.-1994846686": "Requires 1B drilling fluid and minimum 1920 EU/t", - "gtocore.lang.void_miner.2.-1533774086": "Output Mechanism", - "gtocore.lang.void_miner.3.-929903268": "Randomly selects 4 ore types based on dimension", - "gtocore.lang.void_miner.4.-1685785075": "Voltage tier determines max output quantity per cycle", - "gtocore.lang.void_miner.5.-32153660": "Amperage determines parallel count", + "gtocore.lang.void_fluid_drilling_rig.1.1305154805": "Insert dimension data into the controller to set the drilling dimension", + "gtocore.lang.void_fluid_drilling_rig.2.-1080730207": "Requires minimum 30720 EU/t", + "gtocore.lang.void_fluid_drilling_rig.3.-1533774086": "Output Mechanism", + "gtocore.lang.void_fluid_drilling_rig.4.-1910843527": "After inserting the data, the controller will display a list of drillable fluids", + "gtocore.lang.void_fluid_drilling_rig.5.2081500057": "Select the drilling target in order according to the set circuit", + "gtocore.lang.void_miner.0.457662303": "Void Miner§r is another masterpiece of GregTech in the void field", + "gtocore.lang.void_miner.1.-1541488034": "Insert dimension data into the controller to set the mining dimension", + "gtocore.lang.void_miner.1.1721904631": "It can mine ores in the void", + "gtocore.lang.void_miner.2.-1994846686": "Requires 1B drilling fluid and minimum 1920 EU/t", + "gtocore.lang.void_miner.3.-1533774086": "Output Mechanism", + "gtocore.lang.void_miner.4.-929903268": "Randomly selects 4 ore types based on dimension", + "gtocore.lang.void_miner.5.-1685785075": "Voltage tier determines max output quantity per cycle", + "gtocore.lang.void_miner.6.-32153660": "Amperage determines parallel count", "gtocore.lang.water_purification_plant.0.-37818779": "Pollutants and ionic particles in water can cause significant defects during the precise processes of wafer and chip cutting and engraving", "gtocore.lang.water_purification_plant.0.1369142758": "Processing Unit Link System", "gtocore.lang.water_purification_plant.1.1000852519": "It is crucial to systematically purify the water through a series of increasingly precise and complex processes, and this multi-block structure is the core of the operation", @@ -4888,7 +4909,7 @@ "gtocore.lang.wireless_dimension_repeater.1.-1198227948": "Energy is repeated between different dimensions", "gtocore.lang.wireless_dimension_repeater.2.-1548032904": "Maximum voltage depends on shell tier", "gtocore.lang.wireless_dimension_repeater.3.438009707": "Not related to current size", - "gtocore.lang.wireless_dimension_repeater.4.1195838228": "No current limit is a super technology of the primitive", + "gtocore.lang.wireless_dimension_repeater.4.231278609": "No current limit - truly primitive super-technology", "gtocore.lang.wireless_energy_substation.0.1288417405": "Provides capacity support to the wireless grid", "gtocore.lang.wireless_energy_substation.1.-1430140471": "Electricity Capacity", "gtocore.lang.wireless_energy_substation.2.42593670": "Install wireless energy units inside to increase capacity limit", @@ -5130,7 +5151,7 @@ "gtocore.machine.mega_turbine.expert.desc.2": "However, adjusting the output multiplier will also significantly sacrifice rotor durability.", "gtocore.machine.mega_turbine.expert.desc.3": "Adjustment Range: 0.1x - 5x.", "gtocore.machine.mega_turbine.expert.desc.4": "Formula: Output Multiplier = Base Multiplier x Adjustment Multiplier", - "gtocore.machine.mega_turbine.expert.desc.5": "Rotor Damage Multiplier = Base Multiplier x max(2.2 - 0.08 * Coil Tier, 1.2) ^ (Adjustment Multiplier - 1)", + "gtocore.machine.mega_turbine.expert.desc.5": "Rotor Damage Multiplier = Base Multiplier x max(2.2 - 0.08 * Glass Tier, 1.2) ^ (Adjustment Multiplier - 1)", "gtocore.machine.mega_turbine.expert.estimated_max_output": "Estimated Max Output: %s EU/t", "gtocore.machine.mega_turbine.glass_tier": "Glass Tier: %s, Rotor Damage Multiplier Bonus: %s", "gtocore.machine.mega_turbine.high_speed_mode": "High Speed Mode:", @@ -5347,8 +5368,8 @@ "gtocore.machine.stellar_forge.pressure": "Internal Pressure: ", "gtocore.machine.structure_check": "Update structure check", "gtocore.machine.structure_check.shift": "Shift+click will forced recheck the structure", - "gtocore.machine.sync_tester_machine.tooltip.0": "用于测试机器同步的工具。", - "gtocore.machine.sync_tester_machine.tooltip.1": "请勿在生产环境中使用。", + "gtocore.machine.sync_tester_machine.tooltip.0": "A tool for testing machine synchronization.", + "gtocore.machine.sync_tester_machine.tooltip.1": "Do not use in production environment.", "gtocore.machine.synthetic_data_assembly_plant.tooltip.0": "Precision multi-block scanner.", "gtocore.machine.synthetic_data_assembly_plant.tooltip.1": "Precision multi-block scanner.", "gtocore.machine.synthetic_data_assembly_plant.tooltip.2": "Requires §fComputation§7 to work.", @@ -5357,7 +5378,7 @@ "gtocore.machine.tag_filter.tooltip.0": "* Indicates a wildcard () Indicates Priority", "gtocore.machine.tag_filter.tooltip.1": "& = Logic with | = Logic or ^ = Logical XOR", "gtocore.machine.temp.per_second": "Recipe Temperature Increase Per Second: %sK", - "gtocore.machine.test_report_output.tooltip.0": "打印一些测试用信息", + "gtocore.machine.test_report_output.tooltip.0": "Print some test information", "gtocore.machine.text.thread": "Thread %s: ", "gtocore.machine.the_primordial_reconstructor.mode.0": "Working Mode: Not set", "gtocore.machine.the_primordial_reconstructor.mode.1": "Working Mode: Item Deconstruction", @@ -5534,6 +5555,7 @@ "gtocore.part_ability.export_fluids_4x": "Fluids Output (4x)", "gtocore.part_ability.export_fluids_9x": "Fluids Output (9x)", "gtocore.part_ability.export_items": "Items Output", + "gtocore.part_ability.extra_energy_hatch": "Extra Energy Hatch", "gtocore.part_ability.extract_mana": "Extract Mana", "gtocore.part_ability.hpca_component": "HPCA Component", "gtocore.part_ability.import_fluids": "Fluids Input", @@ -5734,10 +5756,6 @@ "gtocore.tooltip.item.uruium_coil_block.1": "Only this coil can be used in stellar furnace mode", "gtocore.tooltip.item.vacuum_tube.0": "Right-click the handheld rough vacuum tube to obtain vacuum supply from a machine with vacuum level greater than 0", "gtocore.tooltip.item.virtual_item_provider": "Provide items for the machine's virtual circuit slot.", - "gtocore.tooltip.pattern_content_sort_machine.apply": "Apply", - "gtocore.tooltip.pattern_content_sort_machine.means_for_line_0": " For each line, all items in the pattern input will be replaced with the highest priority item of that line, Prioritization of items in each row is based on item priority in descending order.", - "gtocore.tooltip.pattern_content_sort_machine.mode.fluid": "Mode : Fluid Replacement", - "gtocore.tooltip.pattern_content_sort_machine.mode.item": "Mode : Item Replacement", "gtocore.tooltip.unknown": "Unknown", "gtocore.top.checking": "Checking structure", "gtocore.top.errors": "Probable errors ", @@ -6053,16 +6071,16 @@ "item.gtocore.cupriavidus_petri_dish": "Cupriavidus Petri Dish", "item.gtocore.cyan_dye_masterbatch": "Cyan Dye Masterbatch", "item.gtocore.dark_matter": "Dark Matter", - "item.gtocore.data_crystal_component_mk1": "Data Crystal Component Mk1", - "item.gtocore.data_crystal_component_mk2": "Data Crystal Component Mk2", - "item.gtocore.data_crystal_component_mk3": "Data Crystal Component Mk3", - "item.gtocore.data_crystal_component_mk4": "Data Crystal Component Mk4", - "item.gtocore.data_crystal_component_mk5": "Data Crystal Component Mk5", - "item.gtocore.data_crystal_mk1": "Data Crystal Mk1", - "item.gtocore.data_crystal_mk2": "Data Crystal Mk2", - "item.gtocore.data_crystal_mk3": "Data Crystal Mk3", - "item.gtocore.data_crystal_mk4": "Data Crystal Mk4", - "item.gtocore.data_crystal_mk5": "Data Crystal Mk5", + "item.gtocore.data_crystal_component_mk1": "Data Crystal Component MK I", + "item.gtocore.data_crystal_component_mk2": "Data Crystal Component MK II", + "item.gtocore.data_crystal_component_mk3": "Data Crystal Component MK III", + "item.gtocore.data_crystal_component_mk4": "Data Crystal Component MK IV", + "item.gtocore.data_crystal_component_mk5": "Data Crystal Component MK V", + "item.gtocore.data_crystal_mk1": "Data Crystal MK I", + "item.gtocore.data_crystal_mk2": "Data Crystal MK II", + "item.gtocore.data_crystal_mk3": "Data Crystal MK III", + "item.gtocore.data_crystal_mk4": "Data Crystal MK IV", + "item.gtocore.data_crystal_mk5": "Data Crystal MK V", "item.gtocore.data_disc": "Data Disc", "item.gtocore.data_item.type.title": "§n%s Recipes Data:", "item.gtocore.debug_structure_writer": "Debug Structure Writer", @@ -6200,9 +6218,9 @@ "item.gtocore.enchantment_essence_vanishing_curse": "Enchantment Essence (Vanishing Curse)", "item.gtocore.ender_crystal": "Ender Crystal", "item.gtocore.ender_diamond": "Ender Diamond", - "item.gtocore.energy_control_module_mk1": "Energy Control Module Mk1", - "item.gtocore.energy_control_module_mk2": "Energy Control Module Mk2", - "item.gtocore.energy_control_module_mk3": "Energy Control Module Mk3", + "item.gtocore.energy_control_module_mk1": "Energy Control Module MK I", + "item.gtocore.energy_control_module_mk2": "Energy Control Module MK II", + "item.gtocore.energy_control_module_mk3": "Energy Control Module MK III", "item.gtocore.energy_upgrade_module": "Energy Upgrade Module", "item.gtocore.entangled_singularity": "Entangled Singularity", "item.gtocore.eschericia_petri_dish": "Eschericia Petri Dish", @@ -6304,15 +6322,15 @@ "item.gtocore.holy_root_mycelium": "Holy Root Mycelium", "item.gtocore.hootch_bucket": "Hootch Bucket", "item.gtocore.hot_iron_ingot": "Hot Iron Ingot", - "item.gtocore.hui_circuit_1": "High Calculation Workstation MK-I", + "item.gtocore.hui_circuit_1": "High Calculation Workstation MK I", "item.gtocore.hui_circuit_1.tooltip": "§793015-Floating Point Operations/Second", - "item.gtocore.hui_circuit_2": "High Calculation Workstation MK-II", + "item.gtocore.hui_circuit_2": "High Calculation Workstation MK II", "item.gtocore.hui_circuit_2.tooltip": "§776M Processing Unit", - "item.gtocore.hui_circuit_3": "High Calculation Workstation MK-III", + "item.gtocore.hui_circuit_3": "High Calculation Workstation MK III", "item.gtocore.hui_circuit_3.tooltip": "§7Invalid RSA Algorithm", - "item.gtocore.hui_circuit_4": "High Calculation Workstation MK-IV", + "item.gtocore.hui_circuit_4": "High Calculation Workstation MK IV", "item.gtocore.hui_circuit_4.tooltip": "§7The 56th Mersenne Prime", - "item.gtocore.hui_circuit_5": "High Calculation Workstation MK-V", + "item.gtocore.hui_circuit_5": "High Calculation Workstation MK V", "item.gtocore.hui_circuit_5.tooltip": "§7Paradox", "item.gtocore.hv_drone": "Base Drone", "item.gtocore.hv_power_amplifiers": "Hv Power Amplifiers", @@ -6340,8 +6358,8 @@ "item.gtocore.lapis_vein_essence": "Lapis Vein Essence", "item.gtocore.laser_cooling_unit": "Laser Cooling Unit", "item.gtocore.laser_diode": "Laser Diode", - "item.gtocore.laser_gyroscope_mk1": "Laser Gyroscope Mk1", - "item.gtocore.laser_gyroscope_mk2": "Laser Gyroscope Mk2", + "item.gtocore.laser_gyroscope_mk1": "Laser Gyroscope MK I", + "item.gtocore.laser_gyroscope_mk2": "Laser Gyroscope MK II", "item.gtocore.lepton_trap_crystal": "Lepton Trap Crystal", "item.gtocore.liquid_sunshine_bucket": "Liquid Sunshine Bucket", "item.gtocore.lithography_mask": "Lithography Mask", @@ -6350,9 +6368,9 @@ "item.gtocore.luv_power_amplifiers": "Luv Power Amplifiers", "item.gtocore.lv_power_amplifiers": "Lv Power Amplifiers", "item.gtocore.lv_reward_bag": "lv Reward Bag", - "item.gtocore.machining_control_module_mk1": "Machining Control Module Mk1", - "item.gtocore.machining_control_module_mk2": "Machining Control Module Mk2", - "item.gtocore.machining_control_module_mk3": "Machining Control Module Mk3", + "item.gtocore.machining_control_module_mk1": "Machining Control Module MK I", + "item.gtocore.machining_control_module_mk2": "Machining Control Module MK II", + "item.gtocore.machining_control_module_mk3": "Machining Control Module MK III", "item.gtocore.macrowormhole_generator": "Macrowormhole Generator", "item.gtocore.magenta_dye_masterbatch": "Magenta Dye Masterbatch", "item.gtocore.magnetic_trap": "Magnetic Trap", @@ -6455,6 +6473,7 @@ "item.gtocore.palm_sized_bank": "Pan-Galactic Greg Technology Palm-Sized Bank", "item.gtocore.pattern.wildcard": "With Wildcard Processing Pattern", "item.gtocore.pattern_buffer_upgrader": "Pattern Buffer Upgrader", + "item.gtocore.pattern_content_access_terminal": "Pattern Content Access Terminal", "item.gtocore.pattern_modifier_pro": "Pattern Modifier Pro", "item.gtocore.pattern_modifier_pro.name": "Pattern Modifier Pro", "item.gtocore.pellet_antimatter": "Pellet Antimatter", @@ -6470,11 +6489,11 @@ "item.gtocore.plasma_containment_cell": "Plasma Containment Cell", "item.gtocore.pm_chip": "Pm Chip", "item.gtocore.pm_wafer": "Pm Wafer", - "item.gtocore.precision_circuit_assembly_robot_mk1": "Precision Circuit Assembly Robot Mk1", - "item.gtocore.precision_circuit_assembly_robot_mk2": "Precision Circuit Assembly Robot Mk2", - "item.gtocore.precision_circuit_assembly_robot_mk3": "Precision Circuit Assembly Robot Mk3", - "item.gtocore.precision_circuit_assembly_robot_mk4": "Precision Circuit Assembly Robot Mk4", - "item.gtocore.precision_circuit_assembly_robot_mk5": "Precision Circuit Assembly Robot Mk5", + "item.gtocore.precision_circuit_assembly_robot_mk1": "Precision Circuit Assembly Robot MK I", + "item.gtocore.precision_circuit_assembly_robot_mk2": "Precision Circuit Assembly Robot MK II", + "item.gtocore.precision_circuit_assembly_robot_mk3": "Precision Circuit Assembly Robot MK III", + "item.gtocore.precision_circuit_assembly_robot_mk4": "Precision Circuit Assembly Robot MK IV", + "item.gtocore.precision_circuit_assembly_robot_mk5": "Precision Circuit Assembly Robot MK V", "item.gtocore.precision_steam_mechanism": "Precision Steam Mechanism", "item.gtocore.preoxidized_atomic_pan_fiber": "Preoxidized Atomic Pan Fiber", "item.gtocore.preoxidized_micron_pan_fiber": "Preoxidized Micron Pan Fiber", @@ -6563,8 +6582,8 @@ "item.gtocore.simple_optical_fiber_preform": "Simple Optical Fiber Preform", "item.gtocore.simple_optical_soc": "Simple Optical SoC", "item.gtocore.slot_enhancer": "Slot Enhancer", - "item.gtocore.small_shuttle_mk1": "Small Shuttle Mk1", - "item.gtocore.small_shuttle_mk2": "Small Shuttle Mk2", + "item.gtocore.small_shuttle_mk1": "Small Shuttle MK I", + "item.gtocore.small_shuttle_mk2": "Small Shuttle MK II", "item.gtocore.smd_capacitor_bioware": "Bioware Capacitor", "item.gtocore.smd_capacitor_cosmic": "Cosmic Capacitor", "item.gtocore.smd_capacitor_exotic": "Exotic Capacitor", @@ -6605,17 +6624,17 @@ "item.gtocore.space_coolant_cell_10k": "10K Space Coolant Cell", "item.gtocore.space_coolant_cell_30k": "30K Space Coolant Cell", "item.gtocore.space_coolant_cell_60k": "60K Space Coolant Cell", - "item.gtocore.space_drone_mk1": "Space Drone MKⅠ", - "item.gtocore.space_drone_mk2": "Space Drone MKⅡ", - "item.gtocore.space_drone_mk3": "Space Drone MKⅢ", - "item.gtocore.space_drone_mk4": "Space Drone MKⅣ", - "item.gtocore.space_drone_mk5": "Space Drone MKⅤ", - "item.gtocore.space_drone_mk6": "Space Drone MKⅥ", + "item.gtocore.space_drone_mk1": "Space Drone MK I", + "item.gtocore.space_drone_mk2": "Space Drone MK II", + "item.gtocore.space_drone_mk3": "Space Drone MK III", + "item.gtocore.space_drone_mk4": "Space Drone MK IV", + "item.gtocore.space_drone_mk5": "Space Drone MK V", + "item.gtocore.space_drone_mk6": "Space Drone MK VI", "item.gtocore.space_essence": "Space Essence", "item.gtocore.space_nanomuscle_chestplate": "NanoMuscle™ Space Suite Chestplate", - "item.gtocore.space_probe_mk1": "Space Probe Mk1", - "item.gtocore.space_probe_mk2": "Space Probe Mk2", - "item.gtocore.space_probe_mk3": "Space Probe Mk3", + "item.gtocore.space_probe_mk1": "Space Probe MK I", + "item.gtocore.space_probe_mk2": "Space Probe MK II", + "item.gtocore.space_probe_mk3": "Space Probe MK III", "item.gtocore.space_quarktech_chestplate": "QuarkTech™ Space Suite Chestplate", "item.gtocore.spacetime_catalyst": "Spacetime Catalyst", "item.gtocore.special_ceramics": "Special Ceramics", @@ -6763,6 +6782,7 @@ "item.gtocore.tcetiedandelions": "Tcetiedandelions", "item.gtocore.tcetieseaweedextract": "Tcetieseaweedextract", "item.gtocore.temporal_matter": "Temporal Matter", + "item.gtocore.temporary_order": "Temporary Order", "item.gtocore.tesseract_target_marker": "Tesseract Target Marker", "item.gtocore.tetrahedrite_vein_essence": "Tetrahedrite Vein Essence", "item.gtocore.tier_0_eye": "organ Standard Organ Eye Baby ", @@ -8138,10 +8158,10 @@ "metaitem.tool.tooltip.rotor.coating.tooltip.0": "§6Coating Mechanism:", "metaitem.tool.tooltip.rotor.coating.tooltip.0.magic": "§dMagical§6 Coating Mechanism:", "metaitem.tool.tooltip.rotor.coating.tooltip.1": "§bThe coating provides a barrier that absorbs rotor wear. When rotor A has coating B, the durability of coating B is §d4 * max(B/10, min(B-A, B/2))", - "metaitem.tool.tooltip.rotor.coating.tooltip.1.magic": "§dMagical§b Coating will no longer provide a durability barrier, but will provide rotor efficiency and turbine power generation of magical material properties ×30%", + "metaitem.tool.tooltip.rotor.coating.tooltip.1.magic": "§dMagical§b Coating will no longer provide a durability barrier, but will provide rotor efficiency and turbine power generation of magical material bonus properties ×30%", "metaitem.tool.tooltip.rotor.coating.tooltip.2": "§bThere is a 95% chance of consuming the coating durability first when the rotor is damaged. After the coating durability is exhausted, the body durability is consumed", "metaitem.tool.tooltip.rotor.coating.tooltip.2.magic": "When the body consumes durability, the §dmagical§b coating will also consume durability. After the coating durability is exhausted, the rotor efficiency and turbine power generation will fall back to the original value. ", - "metaitem.tool.tooltip.rotor.coating.tooltip.3.magic": "When rotor A has coating B, the durability of coating B is §dmax(B/10, min(B-A, B/2))", + "metaitem.tool.tooltip.rotor.coating.tooltip.3.magic": "When rotor A has coating B, the durability of coating B is §d4 * max(B/10, min(B-A, B/2))", "metaitem.tool.tooltip.rotor.coating_durability": "Coating Durability: %s / %s", "metaitem.tool.tooltip.rotor.coating_efficiency": "Coating Efficiency: %s%%", "metaitem.tool.tooltip.rotor.coating_power": "Coating Power: %s%%", diff --git a/src/generated/resources/assets/gtocore/lang/zh_cn.json b/src/generated/resources/assets/gtocore/lang/zh_cn.json index ad8641ea7..36a3d02a3 100644 --- a/src/generated/resources/assets/gtocore/lang/zh_cn.json +++ b/src/generated/resources/assets/gtocore/lang/zh_cn.json @@ -9,6 +9,7 @@ "affix.apotheosis:kinetic.suffix": "势如破竹", "affix.apotheosis:stress": "应力", "affix.apotheosis:stress.suffix": "千钧一发", + "affix.gtocore.bedrock_mine_restore.at_most.desc": "(最高可达%s%%)", "affix.gtocore.bedrock_mine_restore.desc": "每次开采矿石可以在当前区块勘探出相当于一般储量%s‰的额外基岩矿脉储量", "affix.gtocore.bedrock_mine_restore.fluid.desc": "每次开采矿石可以在当前区块勘探出相当于一般储量%s‰的额外基岩流体矿脉储量", "affix.gtocore.ftb_ultimine.desc": "该工具可以提升%s%%的连锁挖掘数量上限", @@ -234,8 +235,8 @@ "block.gtocore.compound_extreme_cooling_unit": "复合式极端冷却装置", "block.gtocore.comprehensive_tombarthite_processing_facility": "稀土处理综合设施", "block.gtocore.compressed_fusion_coil": "压缩聚变线圈方块", - "block.gtocore.compressed_fusion_coil_mk2": "压缩聚变线圈方块MK-II", - "block.gtocore.compressed_fusion_coil_mk2_prototype": "压缩聚变线圈方块MK-II原型", + "block.gtocore.compressed_fusion_coil_mk2": "压缩聚变线圈方块 MK II", + "block.gtocore.compressed_fusion_coil_mk2_prototype": "压缩聚变线圈方块 MK II 原型", "block.gtocore.compressor_controller_casing": "压缩控制机械方块", "block.gtocore.compressor_pipe_casing": "压缩管道机械方块", "block.gtocore.containment_field_generator": "遏制场发生器", @@ -302,9 +303,9 @@ "block.gtocore.enderium_borosilicate_glass": "末影强化硼玻璃", "block.gtocore.energetic_photovoltaic_block": "充能光伏方块", "block.gtocore.energetic_photovoltaic_power_station": "充能光伏电站", - "block.gtocore.energy_control_casing_mk1": "能量控制方块 MK-I", - "block.gtocore.energy_control_casing_mk2": "能量控制方块 MK-II", - "block.gtocore.energy_control_casing_mk3": "能量控制方块 MK-III", + "block.gtocore.energy_control_casing_mk1": "能量控制方块 MK I", + "block.gtocore.energy_control_casing_mk2": "能量控制方块 MK II", + "block.gtocore.energy_control_casing_mk3": "能量控制方块 MK III", "block.gtocore.energy_injector": "能量注入仪", "block.gtocore.engineering_mechanical_casing": "工程机械方块", "block.gtocore.engraving_laser_plant": "激光蚀刻工厂", @@ -369,9 +370,9 @@ "block.gtocore.force_field_glass": "力场玻璃", "block.gtocore.fuel_cell_generator": "燃料电池发电机", "block.gtocore.fuel_refining_complex": "燃料精炼复合体", - "block.gtocore.fusion_casing_mk4": "聚变机械方块 MK-IV", - "block.gtocore.fusion_casing_mk5": "聚变机械方块 MK-V", - "block.gtocore.fusion_coil_mk2": "聚变线圈方块MK-II", + "block.gtocore.fusion_casing_mk4": "聚变机械方块 MK IV", + "block.gtocore.fusion_casing_mk5": "聚变机械方块 MK V", + "block.gtocore.fusion_coil_mk2": "聚变线圈方块 MK II", "block.gtocore.gaiasteel_casing": "盖亚钢外壳", "block.gtocore.ganymede_grunt": "木卫三表皮", "block.gtocore.ganymede_stone": "木卫三岩石", @@ -739,9 +740,9 @@ "block.gtocore.machine_access_terminal": "机器访问终端", "block.gtocore.machine_casing_circuit_assembly_line": "电路装配线控制外壳", "block.gtocore.machine_casing_grinding_head": "坚固钻头", - "block.gtocore.machining_control_casing_mk1": "运行控制方块 MK-I", - "block.gtocore.machining_control_casing_mk2": "运行控制方块 MK-II", - "block.gtocore.machining_control_casing_mk3": "运行控制方块 MK-III", + "block.gtocore.machining_control_casing_mk1": "运行控制方块 MK I", + "block.gtocore.machining_control_casing_mk2": "运行控制方块 MK II", + "block.gtocore.machining_control_casing_mk3": "运行控制方块 MK III", "block.gtocore.magic_core": "魔法核心", "block.gtocore.magnesium_oxide_ceramic_high_temperature_insulation_mechanical_block": "氧化镁陶瓷高温绝缘机械方块", "block.gtocore.magnetic_confinement_dimensionality_shock_device": "磁约束维度震荡装置", @@ -818,7 +819,6 @@ "block.gtocore.me_mana_amplifier_hatch": "ME魔力增幅仓", "block.gtocore.me_mana_interface": "ME魔力接口", "block.gtocore.me_muffler_hatch": "ME消声仓", - "block.gtocore.me_pattern_content_sort_machine": "ME样板内容动态修改机", "block.gtocore.me_simple_pattern_buffer": "ME简单样板总成", "block.gtocore.me_storage": "ME存储器", "block.gtocore.me_storage_access_hatch": "ME存储访问仓", @@ -1083,11 +1083,11 @@ "block.gtocore.space_elevator_mechanical_casing": "太空电梯机械方块", "block.gtocore.space_elevator_module_base": "太空电梯模块基座", "block.gtocore.space_elevator_power_core": "太空电梯动力核心", - "block.gtocore.space_elevator_power_module_1": "太空电梯动力模块MK1", - "block.gtocore.space_elevator_power_module_2": "太空电梯动力模块MK2", - "block.gtocore.space_elevator_power_module_3": "太空电梯动力模块MK3", - "block.gtocore.space_elevator_power_module_4": "太空电梯动力模块MK4", - "block.gtocore.space_elevator_power_module_5": "太空电梯动力模块MK5", + "block.gtocore.space_elevator_power_module_1": "太空电梯动力模块 MK I", + "block.gtocore.space_elevator_power_module_2": "太空电梯动力模块 MK II", + "block.gtocore.space_elevator_power_module_3": "太空电梯动力模块 MK III", + "block.gtocore.space_elevator_power_module_4": "太空电梯动力模块 MK IV", + "block.gtocore.space_elevator_power_module_5": "太空电梯动力模块 MK V", "block.gtocore.space_elevator_support": "太空电梯支撑结构", "block.gtocore.space_engine_nozzle": "航天发动机喷管", "block.gtocore.space_probe_surface_reception": "宇宙探测器地面接收单元", @@ -1119,18 +1119,18 @@ "block.gtocore.stable_base_casing": "稳定底座机械方块", "block.gtocore.stainless_evaporation_casing": "不锈钢蒸发外壳", "block.gtocore.stainless_steel_corrosion_resistant_casing": "不锈钢耐腐蚀机械方块", - "block.gtocore.star_stone_1": "星辰石 Ⅰ", - "block.gtocore.star_stone_10": "星辰石 Ⅹ", - "block.gtocore.star_stone_11": "星辰石 Ⅺ", - "block.gtocore.star_stone_12": "星辰石 Ⅻ", - "block.gtocore.star_stone_2": "星辰石 Ⅱ", - "block.gtocore.star_stone_3": "星辰石 Ⅲ", - "block.gtocore.star_stone_4": "星辰石 Ⅳ", - "block.gtocore.star_stone_5": "星辰石 Ⅴ", - "block.gtocore.star_stone_6": "星辰石 Ⅵ", - "block.gtocore.star_stone_7": "星辰石 Ⅶ", - "block.gtocore.star_stone_8": "星辰石 Ⅷ", - "block.gtocore.star_stone_9": "星辰石 Ⅸ", + "block.gtocore.star_stone_1": "星辰石 I", + "block.gtocore.star_stone_10": "星辰石 X", + "block.gtocore.star_stone_11": "星辰石 XI", + "block.gtocore.star_stone_12": "星辰石 XII", + "block.gtocore.star_stone_2": "星辰石 II", + "block.gtocore.star_stone_3": "星辰石 III", + "block.gtocore.star_stone_4": "星辰石 IV", + "block.gtocore.star_stone_5": "星辰石 V", + "block.gtocore.star_stone_6": "星辰石 VI", + "block.gtocore.star_stone_7": "星辰石 VII", + "block.gtocore.star_stone_8": "星辰石 VIII", + "block.gtocore.star_stone_9": "星辰石 IX", "block.gtocore.star_ultimate_material_forge_factory": "恒星终极物质锻造工厂", "block.gtocore.starmetal_coil_block": "星辉线圈方块", "block.gtocore.steam_assembly_block": "蒸汽装配方块", @@ -1624,23 +1624,29 @@ "config.gtocore.option.blinkRange": "旅行手杖瞬移范围(格)", "config.gtocore.option.blockRange": "旅行锚方块范围(格)", "config.gtocore.option.breakBlocksBlackList": "连锁挖掘黑名单", + "config.gtocore.option.cacheResources": "启动时缓存资源", "config.gtocore.option.cannibalismDamage": "食肉惩罚伤害", "config.gtocore.option.cannibalismRadius": "食肉惩罚半径", + "config.gtocore.option.client": "客户端", "config.gtocore.option.detailedLogging": "[调试] 详细日志输出", "config.gtocore.option.dev": "开发者模式", + "config.gtocore.option.devMode": "开发模式", "config.gtocore.option.difficulty": "游戏难度", "config.gtocore.option.disableChargeBomb": "禁用爆弹", "config.gtocore.option.disableEmbeddiumBECulling": "禁用Embbedium Global方块实体剔除", "config.gtocore.option.disableMufflerPart": "禁用消声仓", + "config.gtocore.option.disableRecyclingRecipes": "[调试] 禁用回收配方", "config.gtocore.option.emiGlobalFavorites": "EMI 全局收藏夹", "config.gtocore.option.enableCustomRecipes": "启用自定义配方", "config.gtocore.option.exPatternSize": "扩展样板供应器容量", "config.gtocore.option.fastMultiBlockPage": "快速多方块页面加载", "config.gtocore.option.ftbUltimineRange": "连锁挖掘检查范围", + "config.gtocore.option.gamePlay": "游戏玩法", "config.gtocore.option.hud": "HUD 设置", "config.gtocore.option.itemRange": "旅行锚物品范围(格)", "config.gtocore.option.lightningRodEffect": "引雷针特效", "config.gtocore.option.maxMonitorSize": "监控器最大尺寸", + "config.gtocore.option.misc": "杂项", "config.gtocore.option.mobConfig": "生物设置", "config.gtocore.option.naturalRegeneration": "生物自然回血", "config.gtocore.option.nightVision": "内置夜视", @@ -1651,7 +1657,6 @@ "config.gtocore.option.sendMultiblockErrorMessages": "发送多方块错误信息", "config.gtocore.option.serverLang": "服务器语言", "config.gtocore.option.showAEAmountTooltipEverywhereEmi": "在EMI显示 AE 数量提示", - "config.gtocore.option.showEnglishName": "显示物品英文名称", "config.gtocore.option.staffOfTravellingPatternNodes": "旅行手杖样板节点", "config.gtocore.option.startSpark": "Spark 分析器启动阶段", "config.gtocore.option.travelConfig": "旅行手杖/旅行锚设置", @@ -1665,7 +1670,6 @@ "config.jade.plugin_gtocore.ae_grid_provider": "[GTOCore] AE网络信息", "config.jade.plugin_gtocore.ae_item_amount": "[GTOCore] AE物品数量", "config.jade.plugin_gtocore.destroy_time_provider": "[GTOCore] 硬度信息", - "config.jade.plugin_gtocore.en_lang": "[GTOCore] 英语显示", "config.jade.plugin_gtocore.maintenance_hatch_provider": "[GTOCore] 维护仓信息", "config.jade.plugin_gtocore.mana_container_provider": "[GTOCore] 魔力容器", "config.jade.plugin_gtocore.temperature_provider": "[GTOCore] 机器温度", @@ -2153,12 +2157,15 @@ "gtocore.adv_terminal.setting_already_existed": "存在已有设置", "gtocore.ae.appeng.craft.add_missing_to_emi": "收藏缺失", "gtocore.ae.appeng.craft.add_missing_to_emi.desc": "将缺失的物品添加到EMI书签页", + "gtocore.ae.appeng.craft.encode_send": "§o[右键点击] 编码并发送样板§r", + "gtocore.ae.appeng.craft.encode_send.desc": "点击选择目的地样板供应器,并将样板发送至该供应器", "gtocore.ae.appeng.craft.missing_start": "缺失合成", "gtocore.ae.appeng.craft.missing_start.desc": "在材料不足的情况下仍然开始合成,缺失的原料将被等待", "gtocore.ae.appeng.craft.pause_job": "暂停", "gtocore.ae.appeng.craft.pause_job.desc": "暂停正在进行中的发配;已推送的样板不会被撤回", "gtocore.ae.appeng.craft.resume_job": "继续", "gtocore.ae.appeng.craft.resume_job.desc": "继续已暂停的发配", + "gtocore.ae.appeng.craft.temp_order": "中键点击以创建临时合成订单,下单一份该配方的原材料", "gtocore.ae.appeng.craft.used_percent": "已使用 %s%%", "gtocore.ae.appeng.crafting.cycle_error.bracket_close": ")", "gtocore.ae.appeng.crafting.cycle_error.bracket_open": " (", @@ -2219,12 +2226,13 @@ "gtocore.ae.appeng.me_storage_amount": "ME网络存储数量", "gtocore.ae.appeng.pattern.priority": "样板优先级:", "gtocore.ae.appeng.pattern.priority.desc": "此样板总成提供的样板优先级。合成计算将优先考虑优先级最高的样板。", + "gtocore.ae.appeng.pattern_content_access_terminal": "样板内容管理终端", + "gtocore.ae.appeng.pattern_content_access_terminal.replacement_list_name": "替换列表#%s", + "gtocore.ae.appeng.pattern_content_access_terminal.replacement_list_tooltip": "在此处设置过滤,以决定哪些样板中的原料会被替换。", "gtocore.ae.appeng.pick_craft.all_right": "已启动合成!", - "gtocore.ae.appeng.pick_craft.all_right.title": "Pick-Craft 成功", "gtocore.ae.appeng.pick_craft.error.1": "计算合成路径时发生错误。", "gtocore.ae.appeng.pick_craft.error.2": "没有足够的材料/CPU来合成所需物品。", "gtocore.ae.appeng.pick_craft.error.3": "创建的任务数已达上限。", - "gtocore.ae.appeng.pick_craft.error.title": "Pick-Craft 错误", "gtocore.ae.appeng.wildcard_pattern_buffer.blacklist": "通配符样板总成材料黑名单", "gtocore.ae.appeng.wildcard_pattern_buffer.blacklist.desc": "添加到黑名单中的材料将不会被通配符样板总成所使用。", "gtocore.ae.appeng.wildcard_pattern_buffer.loaded_patterns": "已扫描加载%s种通配符样板。", @@ -2584,8 +2592,9 @@ "gtocore.gray_membership_card.hover_text.2": "离线玩家", "gtocore.gray_membership_card.hover_text.3": "主人: ", "gtocore.gray_membership_card.hover_text.4": "共享者: ", - "gtocore.gtm": "整合包使用的GregTech-Modern模组,以及Applied Energetics 2模组均为非官方版本,如果您遇到任何问题或有任何建议,请前往%s提供反馈,而不是模组官方渠道", + "gtocore.gtm": "整合包使用的GregTech-Modern模组,以及Applied Energistics 2模组均为非官方版本,如果您遇到任何问题或有任何建议,请前往%s提供反馈,而不是模组官方渠道", "gtocore.gui.encoding_desc": "§o[Shift + 左击] 将样板存入背包/清空所有已编码样板", + "gtocore.gui.widget.amount_set.hover_tooltip": "输入 1-Long.MAX 的整数。支持 k/m/g 简写和公式", "gtocore.hud.drag": "右键可开启HUD拖拽模式", "gtocore.hud.toggle.off": "左键开关HUD显示(已禁用)", "gtocore.hud.toggle.on": "左键开关HUD显示(已启用)", @@ -2621,6 +2630,7 @@ "gtocore.integration.ae.WirelessMachine.gridNodeList": "网络节点列表", "gtocore.integration.ae.WirelessMachine.gridNodeSelector": "网络节点选择", "gtocore.integration.ae.WirelessMachine.leave": "断开无线网络", + "gtocore.integration.ae.WirelessMachine.notConnected": "无", "gtocore.integration.ae.WirelessMachine.player": "绑定到玩家 : %s", "gtocore.integration.ae.WirelessMachine.removeGrid": "删除", "gtocore.integration.ae.WirelessMachine.renameGrid": "修改网络昵称", @@ -2646,9 +2656,9 @@ "gtocore.lang.-121146516": "运行时长调整范围:40%~100%", "gtocore.lang.-1261349876": "此器官将允许", "gtocore.lang.-1269813583": "护甲韧性", - "gtocore.lang.-1271244345": "其内容就会按照你配置的优先级被同一行匹配替换。", "gtocore.lang.-1309148959": "爆炸", "gtocore.lang.-1315180647": "§aShift + 右键方块:§r 清除该位置的标记§r", + "gtocore.lang.-1334423408": "机器自带并行机制,无需安装并行控制仓", "gtocore.lang.-1344483012": "允许拓展结构提升机器效率。", "gtocore.lang.-1383224310": "损耗率 : 0", "gtocore.lang.-1413498661": "整合了ME样板编码终端与样板管理终端的功能,", @@ -2671,11 +2681,13 @@ "gtocore.lang.-1955828040": "注释:", "gtocore.lang.-2014927121": "线圈温度每高出900K,并行数x2", "gtocore.lang.-2028697327": "公式 : 4^玻璃等级", + "gtocore.lang.-2034043716": "例如,按顺序填入“橡木木板,白桦木板,云杉木板”的配置,那么当有样板原料中用到白桦或云杉木板时,就会动态修改样板,使用橡木木板作为原料。", "gtocore.lang.-2055315894": "速度加成", "gtocore.lang.-2112077052": "可连接至的太空舱种类:", "gtocore.lang.-267849233": "水下呼吸", "gtocore.lang.-268739386": "并行加成", "gtocore.lang.-287954562": " 修改", + "gtocore.lang.-294733446": "每组配置中,替换的顺序为从右到左。", "gtocore.lang.-300078703": "自ULV起,电压每高出1级,获得的并行数+2", "gtocore.lang.-346445743": "需要整套装备", "gtocore.lang.-374056284": "此器官将提供", @@ -2694,6 +2706,7 @@ "gtocore.lang.-698628939": "需要链接无线充能器使用", "gtocore.lang.-724709346": "代表此舱室能否被多台多方块结构共享", "gtocore.lang.-749025748": "0.1 + 6.384 / (1.632 + (消耗的电量(单位:GEU))) ^ 4", + "gtocore.lang.-76006678": "只需要将此机器连入ME网络,然后样板在被调用时,其内容就会按照你配置的优先级被同一行匹配替换。", "gtocore.lang.-781353543": "只能运行§9IV§r级及以下配方", "gtocore.lang.-790651361": "ME无线连接机", "gtocore.lang.-801705034": "运行时长调整范围:28%~100%", @@ -2706,10 +2719,11 @@ "gtocore.lang.-88949489": "运行时长调整范围:32%~100%", "gtocore.lang.-94407882": "衔接舱", "gtocore.lang.-98188006": "§7当从大整数存储访问仓升级到该存储访问仓时,若原有存储储量超过9.2E18,则超过部分将§c§l永久丢失§r§7!§r", - "gtocore.lang.0.-568444703": "Shift+右键方块可以复制其名称,便于命名", "gtocore.lang.0.1059274564": "ME 网络超级 CPU", + "gtocore.lang.0.1640495616": "Shift+右键方块可以复制其名称", "gtocore.lang.0.475558069": "直接通入氧气与电以工作", "gtocore.lang.1.1285447032": "CPU 性能", + "gtocore.lang.1.336979551": "右键物品可以复制其名称", "gtocore.lang.1000504160": "预测与综合:", "gtocore.lang.1011049812": "转子支架每超过§6HV§r一级,每级增加10%效率,并翻倍输出功率", "gtocore.lang.1024": " ", @@ -2721,7 +2735,6 @@ "gtocore.lang.1070805810": "基础产能功率: ", "gtocore.lang.1084246430": "最高温度: ", "gtocore.lang.1087090424": "调节属性:", - "gtocore.lang.1137917401": "加速仓的等级低于机器最大电压等级时加速效力减弱20%每级", "gtocore.lang.1151803146": "安装模块后", "gtocore.lang.1158649764": "里程碑建筑", "gtocore.lang.1160719164": "9007199254740991", @@ -2731,13 +2744,15 @@ "gtocore.lang.1253850554": "难以想象的工作效率,尽管去做吧!", "gtocore.lang.1254853426": "配方中每种产物都需要一层蒸馏塔节", "gtocore.lang.1274868018": "转子支架每超过§5EV§r一级,每级增加10%效率,并翻倍输出功率", + "gtocore.lang.130790430": "允许安装并行控制仓实现并行处理", "gtocore.lang.1364194362": "公式 : 纳米蜂群数量 * 2^(机器等级 - 配方等级), 算去吧", "gtocore.lang.1367583746": "描述:", - "gtocore.lang.1376594968": "只需要将此机器连入ME网络,然后样板在被调用时,", "gtocore.lang.1394390896": "样板仓", "gtocore.lang.140180329": "可以在不同世界传输", "gtocore.lang.1427": "- ", + "gtocore.lang.1435846884": "代表此机器是否允许仓室独立选择配方类型,不受机器主体限制", "gtocore.lang.1453419452": "只能运行§8ULV§r级及以下配方", + "gtocore.lang.1482192762": "动态替换样板内容", "gtocore.lang.1482865987": "262144", "gtocore.lang.1490368255": "帮你算了一下,是 1073741824 Bytes", "gtocore.lang.1507489": "1024", @@ -2778,17 +2793,17 @@ "gtocore.lang.1961950737": "1048576", "gtocore.lang.1978323557": "§7可以按顺序标记超立方体传输目标位置。§r", "gtocore.lang.2.357711854": "容量:决定CPU可以处理的总任务大小", + "gtocore.lang.2005677336": "加速仓的等级低于配方电压等级时加速效力减弱20%每级", "gtocore.lang.206509868": "17,179.87M (17.2G) Bytes", "gtocore.lang.207321486": "等于燃料组件数量", "gtocore.lang.209383949": "核心舱", "gtocore.lang.233819385": "线圈效率加成", "gtocore.lang.237817396": "无限", - "gtocore.lang.241585397": "支持物品和流体", "gtocore.lang.266512477": "256x -> 384x", + "gtocore.lang.280946395": "管理样板内容", "gtocore.lang.281670066": "转子支架每超过§9IV§r一级,每级增加10%效率,并翻倍输出功率", "gtocore.lang.3.2106472575": "填满481个T5元件解锁无限存储", "gtocore.lang.32551241": "和", - "gtocore.lang.343537399": "ME样板内容动态修改机", "gtocore.lang.350931190": "§7昔为安魂之冠,今作疗身之药。§r", "gtocore.lang.362619935": "4194304", "gtocore.lang.363439179": "(密封机械方块等级)×4", @@ -2800,7 +2815,6 @@ "gtocore.lang.4.334244742": "公式:Σ合成单元存储量", "gtocore.lang.407924965": "无条件加速机器运行速度", "gtocore.lang.41478": " ☆", - "gtocore.lang.417880883": "是的,你现在可以不修改样板,就一键替换其中的内容了。", "gtocore.lang.447198717": "卡巴拉源质:", "gtocore.lang.46299910": "机器内纳米蜂群数量,机器等级每超过配方一级,获得的并行x2", "gtocore.lang.46912042": "16384", @@ -2838,6 +2852,7 @@ "gtocore.lang.716205946": "温度: ", "gtocore.lang.735333575": "§a安装本仓后,超频效果最高提升为每使用4倍功率,机器耗时×16.67%§r", "gtocore.lang.740444711": "§a安装本仓后,超频效果最高提升为每使用4倍功率,机器耗时×12.5%§r", + "gtocore.lang.760352670": "从右向左替换", "gtocore.lang.76517104": "其他", "gtocore.lang.79175": "৹ ", "gtocore.lang.8.-1732543330": "公式:2^玻璃等级", @@ -3213,7 +3228,7 @@ "gtocore.lang.advanced_assembly_line.3.-538236882": "功夫不负有心人,虽然还有很多局限性,新品相较于过往效率也提高了数倍", "gtocore.lang.advanced_assembly_line.3.645766060": "只能使用数据靶仓", "gtocore.lang.advanced_hyper_cube_machine.0.1577061162": "代理多个流体或物品存储器", - "gtocore.lang.advanced_hyper_cube_machine.1.188391162": "使用§b坐标信息卡§r绑定方块", + "gtocore.lang.advanced_hyper_cube_machine.1.-1761448469": "使用§b坐标信息卡§r绑定方块", "gtocore.lang.advanced_hyper_cube_machine.2.-178785670": "绑定某方块后,对此机器进行物品或流体操作视同对被绑定的方块操作", "gtocore.lang.advanced_hyper_cube_machine.3.-154366173": "若绑定多个方块,则依序对他们操作", "gtocore.lang.advanced_hyper_cube_machine.4.-306503171": "右键点击以打开界面", @@ -3224,9 +3239,9 @@ "gtocore.lang.advanced_infinite_driller.11.1673844845": "液态氧 2K/每次输入", "gtocore.lang.advanced_infinite_driller.12.-1559757127": "液态氦 4K/每次输入", "gtocore.lang.advanced_infinite_driller.13.-1146717525": "仅可放入中子素钻头(更多钻头待定)", - "gtocore.lang.advanced_infinite_driller.2.-437538": "需要升温启动,可通入液态烈焰或液态炽骨立方", + "gtocore.lang.advanced_infinite_driller.2.1762934901": "需要升温启动,可通入液态烈焰或液态炽骨立方", "gtocore.lang.advanced_infinite_driller.3.-656059058": "升温材料消耗公式(单位:mB): 温度^1.3", - "gtocore.lang.advanced_infinite_driller.4.-517642844": "升温速度:(每5tick) 液态烈焰:1K / 每次输入,液态炽骨立方:1000K / 每次输入", + "gtocore.lang.advanced_infinite_driller.4.-576390099": "升温速度:(每5tick) 液态烈焰:1K / 每次输入,液态炽骨立方:1000K / 每次输入", "gtocore.lang.advanced_infinite_driller.5.-785999812": "随着温度提升,效率也会提升", "gtocore.lang.advanced_infinite_driller.6.-363931573": "当温度超过临界值,钻头将会融毁", "gtocore.lang.advanced_infinite_driller.7.1939316591": "产热公式: 温度 / 2000", @@ -3276,11 +3291,11 @@ "gtocore.lang.area_destruction_tools.2.1258760006": "一键清空方块!!!", "gtocore.lang.area_destruction_tools.3.113394524": "无视一切条件!!!", "gtocore.lang.area_destruction_tools.4.156723940": "注意爆破安全!!!", - "gtocore.lang.area_destruction_tools.5.1790692799": "多人游戏请务必提醒其他成员!", + "gtocore.lang.area_destruction_tools.5.755143680": "多人游戏请务必提醒其他成员!", "gtocore.lang.area_destruction_tools.6.-2083166503": "可用模式", "gtocore.lang.area_destruction_tools.7.-1543656193": "向库存放入物品以切换模式", "gtocore.lang.area_destruction_tools.8.-378576493": "放入§b模具(球)§r为§6球模式§r", - "gtocore.lang.area_destruction_tools.9.-200198626": "放入§b模具(圆柱)§r为§6圆柱模式§r", + "gtocore.lang.area_destruction_tools.9.422090037": "放入§b模具(圆柱)§r为§6圆柱模式§r", "gtocore.lang.atmosphere_collector_room.0.654405850": "大气层的美味榨汁机,专门收集行星的呼吸", "gtocore.lang.atmosphere_collector_room.1.-204933001": "从稀薄的高空到浓郁的对流层,没有它抽不动的气", "gtocore.lang.atmosphere_collector_room.2.-909799297": "超大容量设计,一瓶更比六瓶强", @@ -3297,7 +3312,7 @@ "gtocore.lang.atomizing_condenser.9.-2010464440": "经理听说后,不但没有责骂,还记录下了这个意外的过程,并据此研发出了这台专门用于从熔融的流体生产金属粉末的机器", "gtocore.lang.auto_connect_me.0.621798580": "允许自动连接ME无线网络", "gtocore.lang.auto_connect_me.1.-1869929608": "按下Shift放置以自动连接收藏的网络", - "gtocore.lang.auto_connect_me.2.-1916171520": "小心塞爆矿处!", + "gtocore.lang.auto_connect_me.2.95823732": "小心塞爆矿处!", "gtocore.lang.banned": "在专家模式下,频道模式命令被禁止", "gtocore.lang.bedrock_drilling_rig.0.1667945339": "量子隧穿钻头突破物质稳定性极限,直接作用于基岩原子核", "gtocore.lang.bedrock_drilling_rig.1.1768817903": "需要基岩在钻头下方", @@ -3356,7 +3371,7 @@ "gtocore.lang.chemical_complex.5.-1084339066": "分子合成如同艺术创作", "gtocore.lang.chemical_energy_devourer.3.-1890569742": "提供320mB/s的§a液态氧§r,并消耗§4双倍§r燃料以产生", "gtocore.lang.chemical_energy_devourer.3.31691509": " EU/t的功率", - "gtocore.lang.chemical_energy_devourer.4.-63158004": "再提供480mB/s的§a四氧化二氮§r,并消耗§4四倍§r燃料以产生", + "gtocore.lang.chemical_energy_devourer.4.-149782026": "再提供480mB/s的§a四氧化二氮§r,并消耗§4四倍§r燃料以产生", "gtocore.lang.chemical_energy_devourer.4.31691509": " EU/t的功率", "gtocore.lang.chemical_factory.0.197596055": "在化学的世界里,每一个分子都在诉说着自己的故事", "gtocore.lang.chemical_factory.1.-2092154410": "线圈等级每高出白铜一级能耗与时间减少5%", @@ -3415,9 +3430,8 @@ "gtocore.lang.comprehensive_tombarthite_processing_facility.4.-329785974": "运行时的精密振动如同大地的心跳,沉稳而有力", "gtocore.lang.comprehensive_tombarthite_processing_facility.5.1374549352": "稀土分离技术的终极体现,让稀有元素变得触手可及", "gtocore.lang.conjunction_space_station_module.0.-1983123524": "工业空间站太空舱种类", - "gtocore.lang.conversion_simulation_card.0.1367867718": "为大型方块转换室提供模拟转换环境", "gtocore.lang.core_space_station_module.0.-1983123524": "工业空间站太空舱种类", - "gtocore.lang.cosmic_celestial_spire_of_convergence.0.-2075807420": "星穹光刃裂维度之障,格雷魔导,启百年征航。", + "gtocore.lang.cosmic_celestial_spire_of_convergence.0.-1401508330": "星穹光刃裂维度之障,格雷魔导,启百年征航。", "gtocore.lang.cosmic_celestial_spire_of_convergence.1.-348232064": "越死寂虚空,踏混沌异疆,极域镌神符,黑岩铸圣腔。", "gtocore.lang.cosmic_celestial_spire_of_convergence.10.1430835709": "暴露于天空之下,不可有遮挡", "gtocore.lang.cosmic_celestial_spire_of_convergence.11.1901526002": "在白天可以凝聚 - 曦煌", @@ -3431,7 +3445,7 @@ "gtocore.lang.cosmic_celestial_spire_of_convergence.2.1446103170": "解天体秘律,淬星髓凝钢,星海初启,圣坛威光乍放。", "gtocore.lang.cosmic_celestial_spire_of_convergence.3.908268921": "银河倒卷奔核心,日月织网,虚空震荡。", "gtocore.lang.cosmic_celestial_spire_of_convergence.4.-1899796545": "凭维度自生伟力,微芒亦可撬动洪荒。", - "gtocore.lang.cosmic_celestial_spire_of_convergence.5.-862211846": "格雷血汗凝奇迹,为文明拓宇,永奠天疆。", + "gtocore.lang.cosmic_celestial_spire_of_convergence.5.-104885272": "格雷血汗凝奇迹,为文明拓宇,永奠天疆。", "gtocore.lang.cosmic_celestial_spire_of_convergence.6.1853694950": "凝聚群星之中的能量", "gtocore.lang.cosmic_celestial_spire_of_convergence.7.1908133572": "可消耗魔力超频", "gtocore.lang.cosmic_celestial_spire_of_convergence.8.-1594027075": "每次消耗 2^(超频等级*4+10) 点魔力,使凝聚效率翻 2^(超频等级*5) 倍", @@ -3600,7 +3614,7 @@ "gtocore.lang.fast_neutron_breeder.15.1228212578": "小撮/小堆/石墨粉分别降低0.1/0.25/1MeV", "gtocore.lang.fast_neutron_breeder.16.727805493": "中子通量为E(keV)时,在主机内放入N个铱中子反射板后,中子通量每秒增加 (EN)^0.5 keV", "gtocore.lang.fast_neutron_breeder.17.-1548239181": "初始温度298K,临界点2098K", - "gtocore.lang.fast_neutron_breeder.18.-845117880": "经过计算,当中子动能在7MeV以上时,堆温每秒将上升超过1800K,足以在一秒内达到临界点", + "gtocore.lang.fast_neutron_breeder.18.1159230446": "经过计算,当中子动能在7MeV以上时,堆温每秒将上升超过1800K,足以在一秒内达到临界点", "gtocore.lang.fast_neutron_breeder.19.-140293769": "每秒产热公式:H=K×1.27×(E×10)^1.88,结果向上取整", "gtocore.lang.fast_neutron_breeder.2.-1346839424": "配方需满足最低中子通量", "gtocore.lang.fast_neutron_breeder.20.1058073012": "冷却液系数(K/mB/s):蒸馏水1,液氮4,液氦80", @@ -3643,21 +3657,21 @@ "gtocore.lang.fission_reactor.10.-1097033981": "自然降温: 停止工作时1K/秒", "gtocore.lang.fission_reactor.11.673958219": "超过温度上限机器开始损坏,完全损坏时", "gtocore.lang.fission_reactor.12.-916343722": "冷却系统", - "gtocore.lang.fission_reactor.13.-570274144": "冷却液类型: 蒸馏水或钠钾合金", + "gtocore.lang.fission_reactor.13.-1660298463": "冷却液 (系数): 蒸馏水 (800) 钠钾合金 (20)", "gtocore.lang.fission_reactor.14.-461574819": "冷却条件: 供给量 ≥ 需求量", - "gtocore.lang.fission_reactor.15.-1155863786": "最低需求量 = 配方产热 × 冷却参数 × 实际并行 × 当前温度 / 1500", - "gtocore.lang.fission_reactor.16.674459852": "最高供给量 = (冷却组件 - 相邻数/3) × 8", - "gtocore.lang.fission_reactor.17.1037486894": "消耗量 = 需求量 × 冷却液系数", + "gtocore.lang.fission_reactor.15.2020151051": "需求量 = 配方产热 × 实际并行 × 当前温度 / 1500", + "gtocore.lang.fission_reactor.16.-1344879984": "供给量 = (冷却组件 - 相邻数/3) × 8", + "gtocore.lang.fission_reactor.17.1656673038": "消耗量 = 需求量 × 冷却液系数", "gtocore.lang.fission_reactor.18.682210113": "超频机制", - "gtocore.lang.fission_reactor.19.-971847264": "触发条件: 供给量 ≥ n × 需求量 (n>1)", + "gtocore.lang.fission_reactor.19.-62494071": "触发条件: 供给量 ≥ n × 需求量 (n>1)", "gtocore.lang.fission_reactor.2.-1593095757": "据他所说,GT这边先进的化工技术可以产出钠钾冷却液,能更充分发挥这台机器的性能", "gtocore.lang.fission_reactor.2.-162474227": "燃料组件: 提供最大并行数量", - "gtocore.lang.fission_reactor.20.-1470811327": "超频效果: 减少n秒配方时间", + "gtocore.lang.fission_reactor.20.-1889434194": "超频效果: 运行速度提升至 n 倍", "gtocore.lang.fission_reactor.21.629215326": "冷却液产出", - "gtocore.lang.fission_reactor.22.135781624": "蒸馏水冷却: ", + "gtocore.lang.fission_reactor.22.-861236008": "蒸馏水冷却: ", "gtocore.lang.fission_reactor.23.-688763008": "产出蒸汽,产量 = 消耗量 × min(160, 160/(1.4^(373-温度)))", - "gtocore.lang.fission_reactor.24.1887171541": "钠钾合金冷却:", - "gtocore.lang.fission_reactor.25.-1147508056": "≤825K: 热钠钾合金;>825K: 超临界钠钾合金", + "gtocore.lang.fission_reactor.24.1145967411": "钠钾合金冷却:", + "gtocore.lang.fission_reactor.25.-139514968": "≤825K: 热钠钾合金;>825K: 超临界钠钾合金", "gtocore.lang.fission_reactor.3.-1623337062": "升温系数 = 燃料组件相邻数 + 1", "gtocore.lang.fission_reactor.3.-1833223094": "没有人知道真假,毕竟从一个跳槽的人嘴里又能得到多少实话呢", "gtocore.lang.fission_reactor.4.668971985": "冷却组件: 提供最大冷却能力", @@ -3780,7 +3794,7 @@ "gtocore.lang.holy_separator.2.-1124245426": "祭坛般的旋转平台,让离心过程如同神圣的净化仪式", "gtocore.lang.holy_separator.3.205609803": "庄严的低频嗡鸣,仿佛在吟唱分离的圣歌", "gtocore.lang.holy_separator.4.-1480114238": "密度差异成为最优雅的分离艺术", - "gtocore.lang.hyper_cube_machine.0.365030754": "代理一个流体或物品存储器", + "gtocore.lang.hyper_cube_machine.0.-1568948399": "代理一个流体或物品存储器", "gtocore.lang.hyper_cube_machine.1.188391162": "使用§b坐标信息卡§r绑定方块", "gtocore.lang.hyper_cube_machine.2.-178785670": "绑定某方块后,对此机器进行物品或流体操作视同对被绑定的方块操作", "gtocore.lang.hyper_cube_machine.3.-306503171": "右键点击以打开界面", @@ -3802,7 +3816,7 @@ "gtocore.lang.industrial_platform_deployment_tools.5.-1450367514": "工业平台展开工具", "gtocore.lang.industrial_platform_deployment_tools.5.958391167": "妙妙工具: ", "gtocore.lang.industrial_platform_deployment_tools.6.1699145324": "基于预设蓝图快速部署工业基地", - "gtocore.lang.industrial_platform_deployment_tools.7.-1645570500": "需消耗指定型号的工业组件作为基础构建材料", + "gtocore.lang.industrial_platform_deployment_tools.7.1832452560": "需消耗指定型号的工业组件作为基础构建材料", "gtocore.lang.industrial_platform_deployment_tools.8.525488636": "部分高级蓝图需额外配备辅助材料", "gtocore.lang.industrial_platform_deployment_tools.9.-373629456": "专业级工业基地搭建工具", "gtocore.lang.industrial_platform_deployment_tools.introduction.0.166055481": "快速部署标准化工业平台", @@ -3825,7 +3839,7 @@ "gtocore.lang.industrial_platform_deployment_tools.introduction.24.1066829591": "蓝图导出功能", "gtocore.lang.industrial_platform_deployment_tools.introduction.25.1469547294": "将两张坐标卡插入工具底部插槽可激活导出模式", "gtocore.lang.industrial_platform_deployment_tools.introduction.26.-2113609600": "欢迎提交优质蓝图至社区仓库", - "gtocore.lang.industrial_platform_deployment_tools.introduction.27.2127441005": "不支持框架方块和小方块", + "gtocore.lang.industrial_platform_deployment_tools.introduction.27.155189904": "不支持框架方块和小方块", "gtocore.lang.industrial_platform_deployment_tools.introduction.3.-2069210991": "既能快速搭建矿石分拣站等基础生产节点,也可扩展为包含精炼车间、仓储中心的复杂工业集群", "gtocore.lang.industrial_platform_deployment_tools.introduction.4.1073467762": "界面说明", "gtocore.lang.industrial_platform_deployment_tools.introduction.5.-1070998781": "一:蓝图选择页 - 用于浏览/筛选预设蓝图、预览结构效果、查看材料清单及调整部署参数", @@ -3958,7 +3972,7 @@ "gtocore.lang.large_space_station.0.-171313362": "GTO寰宇集团的太空站已经成功运营多年", "gtocore.lang.large_space_station.1.-231416899": "为了满足更多更大的机器需求,GTO寰宇集团决定建造更大的空间站", "gtocore.lang.large_space_station.1.-842118898": "提供一个保护机器正常工作,免受太空辐射等复杂环境影响的空间", - "gtocore.lang.large_space_station.11.-137832514": "运行需要消耗7680EU/t的基础能量", + "gtocore.lang.large_space_station.11.-761641233": "运行需要消耗7680EU/t的基础能量", "gtocore.lang.large_space_station.12.538665093": "会根据安装的拓展舱体数量增加额外能耗以及资源消耗", "gtocore.lang.large_space_station.13.-1933155152": "每秒固定消耗:", "gtocore.lang.large_space_station.14.-439688291": "15mB * (1 + 拓展舱体数量) 蒸馏水", @@ -3995,13 +4009,13 @@ "gtocore.lang.large_steam_circuit_assembler.6.1319503679": "同时解锁超频功能", "gtocore.lang.large_steam_circuit_assembler.7.1488230621": "电路倍产", "gtocore.lang.large_steam_circuit_assembler.8.1977435861": "开启增产模式后倍增产出 (默认开启)", - "gtocore.lang.large_steam_cracker.0.-1674002160": "原料效率仅正常裂化机的80%", - "gtocore.lang.large_steam_cracker.1.-40088499": "每使用高一等级的蒸汽输入仓,原料效率提升20%", + "gtocore.lang.large_steam_cracker.0.1217765388": "原料效率仅正常裂化机的40%", + "gtocore.lang.large_steam_cracker.1.1027096257": "每使用高一等级的蒸汽输入仓,配方产出提升100mb", "gtocore.lang.large_steam_solar_boiler.0.-1779936924": "靠天吃饭一直是公司老祖宗的传统", "gtocore.lang.large_steam_solar_boiler.1.-2105861460": "然而古法工艺显然不能制作高精尖的太阳能板,也只能平摊着应付一下", "gtocore.lang.large_steam_solar_boiler.2.2028482001": "反正不要钱,没有人会嫌弃它的", "gtocore.lang.large_turbine.4.-1092594663": "获得2倍速度", - "gtocore.lang.large_turbine.5.-334038057": "获得额外120%涡轮效率", + "gtocore.lang.large_turbine.5.944353312": "获得额外20%涡轮效率", "gtocore.lang.large_turbine.6.1503536831": "转子损耗速度变为2倍", "gtocore.lang.large_void_miner.0.1610129296": "看着仓库中的矿物逐渐捉襟见肘,董事长显得有些担忧", "gtocore.lang.large_void_miner.0.2128106565": "精准模式", @@ -4056,7 +4070,7 @@ "gtocore.lang.mana_amplifier_hatch.3.898412636": "对于跨配方机器,则将其超频系数额外x2 ", "gtocore.lang.mana_amplifier_hatch.4.-507469829": "否则,机器不执行配方", "gtocore.lang.mana_heater.1.724409426": "输入魔力加热", - "gtocore.lang.mana_heater.2.-1602020602": "如果输入§c火元素蒸汽§r,则加热速度翻5倍", + "gtocore.lang.mana_heater.2.1577697679": "如果输入§c火元素蒸汽§r,则加热速度翻5倍", "gtocore.lang.mantle_crusher.0.1155931590": "地球之心的工业化身,驾驭地幔力量粉碎一切", "gtocore.lang.mantle_crusher.1.-275128847": "只管把岩石丢进去,剩下的交给地震级别的机器力量", "gtocore.lang.mantle_crusher.2.-1262270807": "从矿石到废料,任何物质在这里都能被粉碎成最细微的颗粒", @@ -4085,6 +4099,7 @@ "gtocore.lang.me_pattern_hatch.1.1438463364": "可以放入样板,并进行一键发配", "gtocore.lang.me_pattern_hatch.2.90273460": "样板间分别隔离,互不干扰", "gtocore.lang.me_pattern_hatch.3.-303408860": "对着样板按鼠标中键可单独设置电路或者提供特别输入", + "gtocore.lang.me_pattern_hatch.4.228256588": "可独立选择配方类型,不受机器主体限制", "gtocore.lang.me_storage.0.1603758035": "ME存储", "gtocore.lang.me_storage.1.69447024": "不受存储类型限制", "gtocore.lang.me_storage.2.-1248245399": "你需要在结构中安装存储核心来提升容量", @@ -4371,7 +4386,7 @@ "gtocore.lang.pcb_factory.3.1359689755": "实时量子检测系统确保每块PCB板都达到绝对零缺陷标准", "gtocore.lang.pcb_factory.4.1219141665": "制造过程中产生的热噪声被转化为能量,实现负熵生产循环", "gtocore.lang.pcb_factory.5.-385343199": "纳米制造时代的黎明为电子工业带来无限可能", - "gtocore.lang.performance_monitor_machine.1.-821568673": "能监测全部机器或AE网络3.2秒内的平均延迟", + "gtocore.lang.performance_monitor_machine.1.-821568673": "能监测全部机器或AE网络3.2秒内的平均延迟,并支持高亮显示", "gtocore.lang.performance_monitor_machine.2.-895636497": "右键点击机器以打开性能监测界面", "gtocore.lang.petrochemical_plant.0.697667990": "工业炼金术的终极殿堂,将黑色黄金转化为万千化工奇迹", "gtocore.lang.petrochemical_plant.1.-2006125672": "裂化线圈与精密分馏塔的完美交响,一步完成全流程", @@ -4565,8 +4580,8 @@ "gtocore.lang.rotor_hatch.1.254780438": "不同类型的转子的效率,耐久不同", "gtocore.lang.satellite_control_center.0.-581836799": "发射卫星,带回星球数据", "gtocore.lang.sensor.0.-908223020": "红石信号", - "gtocore.lang.sensor.1.-547927712": "未反转时,数值低于最低值或高于最高值时输出0,介于两者之间时输出递增的1-15的红石信号", - "gtocore.lang.sensor.2.1092475273": "反转时,数值低于最低值或高于最高值时输出15,介于两者之间时输出递减的1-15的红石信号", + "gtocore.lang.sensor.1.805381985": "未反转时,数值低于最低值或高于最高值时输出0,介于两者之间时输出递增的1-15的红石信号", + "gtocore.lang.sensor.2.-1849182326": "反转时,数值低于最低值或高于最高值时输出15,介于两者之间时输出递减的1-15的红石信号", "gtocore.lang.sintering_furnace.0.-1087549334": "作为陶瓷生产中的核心设备", "gtocore.lang.sintering_furnace.1.-2079148997": "GTO集团设计人员为这台烧结炉奋战了无数日夜", "gtocore.lang.sintering_furnace.2.-1564634528": "型号HCS-41烧结炉有着完美的成品率", @@ -4617,9 +4632,9 @@ "gtocore.lang.space_probe_surface_reception.4.1443410799": "根据戴森球模块数量提升产出", "gtocore.lang.space_probe_surface_reception.5.1355476240": "该操作不会损坏戴森球", "gtocore.lang.space_shield_hatch.0.-286075237": "在GTO寰宇重工的空间站技术还没完全完善的时候科研人员紧急开发出的小型防护罩", - "gtocore.lang.space_shield_hatch.1.214640611": "经过技术改良,现在可以保护机器免受太空环境干扰", + "gtocore.lang.space_shield_hatch.1.-1725316429": "经过技术改良,现在可以保护机器免受太空环境干扰", "gtocore.lang.space_shield_hatch.2.1525594846": "需要机器内置的激光仓提供激光", - "gtocore.lang.space_shield_hatch.4.1078238127": "保护机器免受太空环境干扰而无法运行", + "gtocore.lang.space_shield_hatch.4.969054311": "保护机器免受太空环境干扰而无法运行", "gtocore.lang.space_shield_hatch.5.362873821": "需要机器同时配备激光能源仓", "gtocore.lang.space_station.0.-1759943409": "欢迎来到GTO寰宇集团的太空站", "gtocore.lang.space_station.1.-842118898": "提供一个保护机器正常工作,免受太空辐射等复杂环境影响的空间", @@ -4760,18 +4775,18 @@ "gtocore.lang.the_primordial_reconstructor.14.177619011": "消耗魔力合成,需要一个铭刻之布", "gtocore.lang.the_primordial_reconstructor.15.-1607911616": "电路 8:宝石合并", "gtocore.lang.the_primordial_reconstructor.16.304631115": "使用同级的珍宝材料和宝石粉合并宝石", - "gtocore.lang.the_primordial_reconstructor.17.-1023124673": "电路 9:宝石粉碎", + "gtocore.lang.the_primordial_reconstructor.17.484427136": "电路 9:宝石粉碎", "gtocore.lang.the_primordial_reconstructor.18.1377677116": "将宝石粉碎得到宝石粉", - "gtocore.lang.the_primordial_reconstructor.19.1043709144": "电路 10:强行附魔", + "gtocore.lang.the_primordial_reconstructor.19.-1859407092": "电路 10:强行附魔", "gtocore.lang.the_primordial_reconstructor.2.-1834983047": "需要输入 书 铭刻之布 摘除符石", "gtocore.lang.the_primordial_reconstructor.20.-1573633020": "消耗魔力强行将附魔书上的附魔添加到物品上", - "gtocore.lang.the_primordial_reconstructor.21.20755412": "电路 11:强行刻印", + "gtocore.lang.the_primordial_reconstructor.21.232106325": "电路 11:强行刻印", "gtocore.lang.the_primordial_reconstructor.22.150684258": "消耗魔力强行将铭刻之布上的刻印添加到物品上", - "gtocore.lang.the_primordial_reconstructor.23.1946350774": "电路 12:强行修改物品稀有度", + "gtocore.lang.the_primordial_reconstructor.23.-63753067": "电路 12:强行修改物品稀有度", "gtocore.lang.the_primordial_reconstructor.24.1541758190": "消耗魔力,珍宝材料和新生符文强行改变稀有度", - "gtocore.lang.the_primordial_reconstructor.25.2115773330": "电路 13:强行添加镶孔", + "gtocore.lang.the_primordial_reconstructor.25.-1486092269": "电路 13:强行添加镶孔", "gtocore.lang.the_primordial_reconstructor.26.2025332053": "消耗魔力,镶孔符文强行添加镶孔", - "gtocore.lang.the_primordial_reconstructor.27.560967334": "电路 14:强行镶嵌宝石", + "gtocore.lang.the_primordial_reconstructor.27.-283504537": "电路 14:强行镶嵌宝石", "gtocore.lang.the_primordial_reconstructor.28.-1321781064": "消耗魔力,强行将宝石镶嵌到物品上", "gtocore.lang.the_primordial_reconstructor.3.844478837": "电路 2:物品 + 附魔 解构", "gtocore.lang.the_primordial_reconstructor.4.1145404194": "需要输入 铭刻之布 摘除符石", @@ -4830,7 +4845,7 @@ "gtocore.lang.village_trading_station.11.-2135450499": "泛银河格雷科技研发部匠心研发", "gtocore.lang.village_trading_station.12.1168006789": "详细操作说明请查阅机器内置手册", "gtocore.lang.village_trading_station.2.2067725596": "最终诞生的贸易站机器实现了全自动化交易流程:无需匹配工作方块,只需放入村民并锁定信息,内置系统便会按设定节奏自动完成交易与补货", - "gtocore.lang.village_trading_station.3.-1903998976": "升级后的批量交易与智能补货功能,让村民们常笑着称赞:“格雷科技的机器,比跑断腿的信使还贴心”", + "gtocore.lang.village_trading_station.3.826867541": "升级后的批量交易与智能补货功能,让村民们常笑着称赞:“格雷科技的机器,比跑断腿的信使还贴心”", "gtocore.lang.village_trading_station.4.-1550776722": "如今它已成为联结公司与村庄的友好纽带,既让资源流转效率提升数倍,也让双方的信任在顺畅交易中日益深厚", "gtocore.lang.village_trading_station.5.1020125537": "村民贸易站", "gtocore.lang.village_trading_station.5.958391167": "妙妙工具: ", @@ -4868,13 +4883,19 @@ "gtocore.lang.village_trading_station.introduction.9.-1842078679": "四:方向配置页 - 可设置输出物品的方向,灵活适配基地物流布局", "gtocore.lang.void_fluid_drill.0.-268833863": "虚空流体钻机§r§b是格雷科技在虚空领域的又一力作", "gtocore.lang.void_fluid_drill.1.1882050481": "它可以在虚空中钻取流体", - "gtocore.lang.void_fluid_drill.2.1383463229": "放入维度数据,设置电路后即可获取钻出对应世界流体矿床的流体", - "gtocore.lang.void_fluid_drilling_rig.1.-1080730207": "需要最低30720EU/t的功率", - "gtocore.lang.void_miner.1.-1994846686": "需要输入1B钻井液和最低1920EU/t的功率", - "gtocore.lang.void_miner.2.-1533774086": "产出机制", - "gtocore.lang.void_miner.3.-929903268": "按维度随机选取4种矿石输出", - "gtocore.lang.void_miner.4.-1685785075": "电压等级决定单次最大输出数量", - "gtocore.lang.void_miner.5.-32153660": "电流决定并行数", + "gtocore.lang.void_fluid_drilling_rig.1.1305154805": "在主机中放入维度数据来设置钻取维度", + "gtocore.lang.void_fluid_drilling_rig.2.-1080730207": "需要最低30720EU/t的功率", + "gtocore.lang.void_fluid_drilling_rig.3.-1533774086": "产出机制", + "gtocore.lang.void_fluid_drilling_rig.4.-1910843527": "放入数据后,主机将显示可钻取流体列表", + "gtocore.lang.void_fluid_drilling_rig.5.2081500057": "根据机器设置的电路按顺序选择钻取目标", + "gtocore.lang.void_miner.0.457662303": "虚空采矿机§r§b是格雷科技在虚空领域的又一力作", + "gtocore.lang.void_miner.1.-1541488034": "在主机中放入维度数据来设置采矿维度", + "gtocore.lang.void_miner.1.1721904631": "它可以在虚空中开采矿石", + "gtocore.lang.void_miner.2.-1994846686": "需要输入1B钻井液和最低1920EU/t的功率", + "gtocore.lang.void_miner.3.-1533774086": "产出机制", + "gtocore.lang.void_miner.4.-929903268": "按维度随机选取4种矿石输出", + "gtocore.lang.void_miner.5.-1685785075": "电压等级决定单次最大输出数量", + "gtocore.lang.void_miner.6.-32153660": "电流决定并行数", "gtocore.lang.water_purification_plant.0.-37818779": "水中的污染物和离子颗粒会在硅片和芯片切割和雕刻的精密过程中造成显著的缺陷", "gtocore.lang.water_purification_plant.0.1369142758": "处理单元链接系统", "gtocore.lang.water_purification_plant.1.1000852519": "通过一系列越来越精确和复杂的净化过程系统地净化水是至关重要的,而这个多方块结构是操作的核心", @@ -4888,7 +4909,7 @@ "gtocore.lang.wireless_dimension_repeater.1.-1198227948": "在不同维度间中继能量", "gtocore.lang.wireless_dimension_repeater.2.-1548032904": "能量最大电压取决于使用的外壳等级", "gtocore.lang.wireless_dimension_repeater.3.438009707": "与电流大小无关", - "gtocore.lang.wireless_dimension_repeater.4.1195838228": "没有电流上限简直是原始人的超级科技", + "gtocore.lang.wireless_dimension_repeater.4.231278609": "没有电流上限简直是原始人的超级科技", "gtocore.lang.wireless_energy_substation.0.1288417405": "为无线电网提供容量支持", "gtocore.lang.wireless_energy_substation.1.-1430140471": "电网容量", "gtocore.lang.wireless_energy_substation.2.42593670": "可在内部安装任意无线能量单元来提高容量上限", @@ -5347,8 +5368,8 @@ "gtocore.machine.stellar_forge.pressure": "内部压力:", "gtocore.machine.structure_check": "更新结构检查", "gtocore.machine.structure_check.shift": "Shift+点击 将强制重新检查结构", - "gtocore.machine.sync_tester_machine.tooltip.0": "A tool for testing machine synchronization.", - "gtocore.machine.sync_tester_machine.tooltip.1": "Do not use in production environment.", + "gtocore.machine.sync_tester_machine.tooltip.0": "用于测试机器同步的工具。", + "gtocore.machine.sync_tester_machine.tooltip.1": "请勿在生产环境中使用。", "gtocore.machine.synthetic_data_assembly_plant.tooltip.0": "分析/推演的一体化机器。", "gtocore.machine.synthetic_data_assembly_plant.tooltip.1": "根据§b扫描数据§r得到§b研究数据§r。", "gtocore.machine.synthetic_data_assembly_plant.tooltip.2": "需要§b算力§r来进行工作。", @@ -5357,7 +5378,7 @@ "gtocore.machine.tag_filter.tooltip.0": "* 表示通配符 () 表示优先", "gtocore.machine.tag_filter.tooltip.1": "& = 逻辑与 | = 逻辑或 ^ = 逻辑异或", "gtocore.machine.temp.per_second": "配方每秒升温: %sK", - "gtocore.machine.test_report_output.tooltip.0": "Print some test information", + "gtocore.machine.test_report_output.tooltip.0": "打印一些测试用信息", "gtocore.machine.text.thread": "线程%s:", "gtocore.machine.the_primordial_reconstructor.mode.0": "工作模式: 未设定", "gtocore.machine.the_primordial_reconstructor.mode.1": "工作模式: 物品解构", @@ -5534,6 +5555,7 @@ "gtocore.part_ability.export_fluids_4x": "流体输出仓(四重)", "gtocore.part_ability.export_fluids_9x": "流体输出仓(九重)", "gtocore.part_ability.export_items": "物品输出仓", + "gtocore.part_ability.extra_energy_hatch": "额外能源仓", "gtocore.part_ability.extract_mana": "魔力抽取仓", "gtocore.part_ability.hpca_component": "高性能计算组件", "gtocore.part_ability.import_fluids": "流体输入仓", @@ -5734,10 +5756,6 @@ "gtocore.tooltip.item.uruium_coil_block.1": "恒星锻炉模式仅可使用该线圈", "gtocore.tooltip.item.vacuum_tube.0": "手持粗真空管潜行右击真空等级大于0的真空提供机器获取", "gtocore.tooltip.item.virtual_item_provider": "为机器的虚拟电路槽提供物品", - "gtocore.tooltip.pattern_content_sort_machine.apply": "应用", - "gtocore.tooltip.pattern_content_sort_machine.means_for_line_0": " 每行为一组,样板内所有此行物品输入会被替换为此行优先级最高的物品,每行物品优先级依据物品优先级从左开始高到低排序,如果一行内有流体容器,则对内部流体做相应替换,左侧优先级最高", - "gtocore.tooltip.pattern_content_sort_machine.mode.fluid": "模式 : 流体替换", - "gtocore.tooltip.pattern_content_sort_machine.mode.item": "模式 : 物品替换", "gtocore.tooltip.unknown": "未知", "gtocore.top.checking": "正在检查结构", "gtocore.top.errors": "可能的错误 ", @@ -6053,16 +6071,16 @@ "item.gtocore.cupriavidus_petri_dish": "贪铜钩虫菌培养皿", "item.gtocore.cyan_dye_masterbatch": "青色染料色母", "item.gtocore.dark_matter": "暗物质", - "item.gtocore.data_crystal_component_mk1": "数据晶片组件 mk1", - "item.gtocore.data_crystal_component_mk2": "数据晶片组件 mk2", - "item.gtocore.data_crystal_component_mk3": "数据晶片组件 mk3", - "item.gtocore.data_crystal_component_mk4": "数据晶片组件 mk4", - "item.gtocore.data_crystal_component_mk5": "数据晶片组件 mk5", - "item.gtocore.data_crystal_mk1": "数据晶片 mk1", - "item.gtocore.data_crystal_mk2": "数据晶片 mk2", - "item.gtocore.data_crystal_mk3": "数据晶片 mk3", - "item.gtocore.data_crystal_mk4": "数据晶片 mk4", - "item.gtocore.data_crystal_mk5": "数据晶片 mk5", + "item.gtocore.data_crystal_component_mk1": "数据晶片组件 MK I", + "item.gtocore.data_crystal_component_mk2": "数据晶片组件 MK II", + "item.gtocore.data_crystal_component_mk3": "数据晶片组件 MK III", + "item.gtocore.data_crystal_component_mk4": "数据晶片组件 MK IV", + "item.gtocore.data_crystal_component_mk5": "数据晶片组件 MK V", + "item.gtocore.data_crystal_mk1": "数据晶片 MK I", + "item.gtocore.data_crystal_mk2": "数据晶片 MK II", + "item.gtocore.data_crystal_mk3": "数据晶片 MK III", + "item.gtocore.data_crystal_mk4": "数据晶片 MK IV", + "item.gtocore.data_crystal_mk5": "数据晶片 MK V", "item.gtocore.data_disc": "数据光盘", "item.gtocore.data_item.type.title": "§n%s配方数据:", "item.gtocore.debug_structure_writer": "多方块结构导出工具", @@ -6200,9 +6218,9 @@ "item.gtocore.enchantment_essence_vanishing_curse": "附魔精粹 (消失诅咒)", "item.gtocore.ender_crystal": "末影水晶", "item.gtocore.ender_diamond": "末影钻石", - "item.gtocore.energy_control_module_mk1": "能量控制模块 MK-I", - "item.gtocore.energy_control_module_mk2": "能量控制模块 MK-II", - "item.gtocore.energy_control_module_mk3": "能量控制模块 MK-III", + "item.gtocore.energy_control_module_mk1": "能量控制模块 MK I", + "item.gtocore.energy_control_module_mk2": "能量控制模块 MK II", + "item.gtocore.energy_control_module_mk3": "能量控制模块 MK III", "item.gtocore.energy_upgrade_module": "能量升级模块", "item.gtocore.entangled_singularity": "纠缠奇点", "item.gtocore.eschericia_petri_dish": "大肠杆菌培养皿", @@ -6304,15 +6322,15 @@ "item.gtocore.holy_root_mycelium": "圣根菌丝", "item.gtocore.hootch_bucket": "烈酒桶", "item.gtocore.hot_iron_ingot": "热铁锭", - "item.gtocore.hui_circuit_1": "高算力工作站 MK-I", + "item.gtocore.hui_circuit_1": "高算力工作站 MK I", "item.gtocore.hui_circuit_1.tooltip": "§793015-T浮点运算/秒", - "item.gtocore.hui_circuit_2": "高算力工作站 MK-II", + "item.gtocore.hui_circuit_2": "高算力工作站 MK II", "item.gtocore.hui_circuit_2.tooltip": "§776M处理单元", - "item.gtocore.hui_circuit_3": "高算力工作站 MK-III", + "item.gtocore.hui_circuit_3": "高算力工作站 MK III", "item.gtocore.hui_circuit_3.tooltip": "§7无效RSA算法", - "item.gtocore.hui_circuit_4": "高算力工作站 MK-IV", + "item.gtocore.hui_circuit_4": "高算力工作站 MK IV", "item.gtocore.hui_circuit_4.tooltip": "§7第56梅森素数", - "item.gtocore.hui_circuit_5": "高算力工作站 MK-V", + "item.gtocore.hui_circuit_5": "高算力工作站 MK V", "item.gtocore.hui_circuit_5.tooltip": "§7佯谬", "item.gtocore.hv_drone": "基础无人机", "item.gtocore.hv_power_amplifiers": "HV功率增幅器", @@ -6340,8 +6358,8 @@ "item.gtocore.lapis_vein_essence": "青金石精华", "item.gtocore.laser_cooling_unit": "激光冷却单元", "item.gtocore.laser_diode": "激光二极管", - "item.gtocore.laser_gyroscope_mk1": "激光陀螺仪 MK-I", - "item.gtocore.laser_gyroscope_mk2": "激光陀螺仪 MK-II", + "item.gtocore.laser_gyroscope_mk1": "激光陀螺仪 MK I", + "item.gtocore.laser_gyroscope_mk2": "激光陀螺仪 MK II", "item.gtocore.lepton_trap_crystal": "轻子阱晶体", "item.gtocore.liquid_sunshine_bucket": "液态阳光桶", "item.gtocore.lithography_mask": "光刻掩膜", @@ -6350,9 +6368,9 @@ "item.gtocore.luv_power_amplifiers": "LuV功率增幅器", "item.gtocore.lv_power_amplifiers": "LV功率增幅器", "item.gtocore.lv_reward_bag": "LV 战利品袋", - "item.gtocore.machining_control_module_mk1": "运行控制模块 MK-I", - "item.gtocore.machining_control_module_mk2": "运行控制模块 MK-II", - "item.gtocore.machining_control_module_mk3": "运行控制模块 MK-III", + "item.gtocore.machining_control_module_mk1": "运行控制模块 MK I", + "item.gtocore.machining_control_module_mk2": "运行控制模块 MK II", + "item.gtocore.machining_control_module_mk3": "运行控制模块 MK III", "item.gtocore.macrowormhole_generator": "巨型虫洞发生器", "item.gtocore.magenta_dye_masterbatch": "品红色染料色母", "item.gtocore.magnetic_trap": "磁阱", @@ -6455,6 +6473,7 @@ "item.gtocore.palm_sized_bank": "泛银河系格雷科技掌上银行", "item.gtocore.pattern.wildcard": "含通配符处理样板", "item.gtocore.pattern_buffer_upgrader": "样板总成升级器", + "item.gtocore.pattern_content_access_terminal": "样板内容管理终端", "item.gtocore.pattern_modifier_pro": "样板修改器pro", "item.gtocore.pattern_modifier_pro.name": "样板修改器 Pro", "item.gtocore.pellet_antimatter": "反物质", @@ -6470,11 +6489,11 @@ "item.gtocore.plasma_containment_cell": "等离子体密闭容器", "item.gtocore.pm_chip": "皮米功率集成电路", "item.gtocore.pm_wafer": "皮米功率集成电路晶圆", - "item.gtocore.precision_circuit_assembly_robot_mk1": "精密电路装配机器人MKⅠ", - "item.gtocore.precision_circuit_assembly_robot_mk2": "精密电路装配机器人MKⅡ", - "item.gtocore.precision_circuit_assembly_robot_mk3": "精密电路装配机器人MKⅢ", - "item.gtocore.precision_circuit_assembly_robot_mk4": "精密电路装配机器人MKⅣ", - "item.gtocore.precision_circuit_assembly_robot_mk5": "精密电路装配机器人MKⅤ", + "item.gtocore.precision_circuit_assembly_robot_mk1": "精密电路装配机器人 MK I", + "item.gtocore.precision_circuit_assembly_robot_mk2": "精密电路装配机器人 MK II", + "item.gtocore.precision_circuit_assembly_robot_mk3": "精密电路装配机器人 MK III", + "item.gtocore.precision_circuit_assembly_robot_mk4": "精密电路装配机器人 MK IV", + "item.gtocore.precision_circuit_assembly_robot_mk5": "精密电路装配机器人 MK V", "item.gtocore.precision_steam_mechanism": "精密蒸汽构件", "item.gtocore.preoxidized_atomic_pan_fiber": "预氧化原子级聚丙烯腈原丝", "item.gtocore.preoxidized_micron_pan_fiber": "预氧化微米级聚丙烯腈原丝", @@ -6563,8 +6582,8 @@ "item.gtocore.simple_optical_fiber_preform": "简易光纤预制棒", "item.gtocore.simple_optical_soc": "简易光学SoC", "item.gtocore.slot_enhancer": "槽位强化器", - "item.gtocore.small_shuttle_mk1": "小型太空梭 MK-I", - "item.gtocore.small_shuttle_mk2": "小型太空梭 MK-II", + "item.gtocore.small_shuttle_mk1": "小型太空梭 MK I", + "item.gtocore.small_shuttle_mk2": "小型太空梭 MK II", "item.gtocore.smd_capacitor_bioware": "生物活性贴片电容", "item.gtocore.smd_capacitor_cosmic": "寰宇贴片电容", "item.gtocore.smd_capacitor_exotic": "奇异贴片电容", @@ -6605,17 +6624,17 @@ "item.gtocore.space_coolant_cell_10k": "10K空间冷却单元", "item.gtocore.space_coolant_cell_30k": "30K空间冷却单元", "item.gtocore.space_coolant_cell_60k": "60K空间冷却单元", - "item.gtocore.space_drone_mk1": "太空无人机MKⅠ", - "item.gtocore.space_drone_mk2": "太空无人机MKⅡ", - "item.gtocore.space_drone_mk3": "太空无人机MKⅢ", - "item.gtocore.space_drone_mk4": "太空无人机MKⅣ", - "item.gtocore.space_drone_mk5": "太空无人机MKⅤ", - "item.gtocore.space_drone_mk6": "太空无人机MKⅥ", + "item.gtocore.space_drone_mk1": "太空无人机 MK I", + "item.gtocore.space_drone_mk2": "太空无人机 MK II", + "item.gtocore.space_drone_mk3": "太空无人机 MK III", + "item.gtocore.space_drone_mk4": "太空无人机 MK IV", + "item.gtocore.space_drone_mk5": "太空无人机 MK V", + "item.gtocore.space_drone_mk6": "太空无人机 MK VI", "item.gtocore.space_essence": "宇宙精华", "item.gtocore.space_nanomuscle_chestplate": "纳米肌体™套装太空胸甲", - "item.gtocore.space_probe_mk1": "宇宙探测器MKⅠ", - "item.gtocore.space_probe_mk2": "宇宙探测器MKⅡ", - "item.gtocore.space_probe_mk3": "宇宙探测器MKⅢ", + "item.gtocore.space_probe_mk1": "宇宙探测器 MK I", + "item.gtocore.space_probe_mk2": "宇宙探测器 MK II", + "item.gtocore.space_probe_mk3": "宇宙探测器 MK III", "item.gtocore.space_quarktech_chestplate": "夸克高科™套装太空胸甲", "item.gtocore.spacetime_catalyst": "时空催化剂", "item.gtocore.special_ceramics": "特种陶瓷", @@ -6763,6 +6782,7 @@ "item.gtocore.tcetiedandelions": "鲸鱼座T星E藻类", "item.gtocore.tcetieseaweedextract": "鲸鱼座T星E藻类提取物", "item.gtocore.temporal_matter": "时间物质", + "item.gtocore.temporary_order": "%s 临时订单", "item.gtocore.tesseract_target_marker": "坐标标签枪", "item.gtocore.tetrahedrite_vein_essence": "黝铜精华", "item.gtocore.tier_0_eye": "器官 标准器官 眼睛 宝宝级", @@ -8138,10 +8158,10 @@ "metaitem.tool.tooltip.rotor.coating.tooltip.0": "§6镀层机制:", "metaitem.tool.tooltip.rotor.coating.tooltip.0.magic": "§d魔法§6镀层机制:", "metaitem.tool.tooltip.rotor.coating.tooltip.1": "§b镀层会提供一道吸收转子损耗的屏障,当转子A有镀层B,镀层B的耐久为§d4 * max(B/10, min(B-A, B/2))", - "metaitem.tool.tooltip.rotor.coating.tooltip.1.magic": "§d魔法§b镀层将不再提供耐久度屏障,而是会提供魔法材料属性×30%的转子效率与涡轮产能", + "metaitem.tool.tooltip.rotor.coating.tooltip.1.magic": "§d魔法§b镀层将不再提供耐久度屏障,而是会提供魔法材料额外属性×30%的转子效率与涡轮产能", "metaitem.tool.tooltip.rotor.coating.tooltip.2": "§b每次转子损坏时95%概率优先消耗镀层耐久,镀层耐久耗尽后再消耗本体耐久", "metaitem.tool.tooltip.rotor.coating.tooltip.2.magic": "§b本体消耗耐久时,§d魔法§b镀层将同时损耗耐久,镀层耐久耗尽后转子效率与涡轮产能将回落至原始值。", - "metaitem.tool.tooltip.rotor.coating.tooltip.3.magic": "当转子A有镀层B,镀层B的耐久为§dmax(B/10, min(B-A, B/2))", + "metaitem.tool.tooltip.rotor.coating.tooltip.3.magic": "当转子A有镀层B,镀层B的耐久为§d4 * max(B/10, min(B-A, B/2))", "metaitem.tool.tooltip.rotor.coating_durability": "镀层耐久:%s / %s", "metaitem.tool.tooltip.rotor.coating_efficiency": "镀层效率:%s%%", "metaitem.tool.tooltip.rotor.coating_power": "镀层产能:%s%%", diff --git a/src/generated/resources/assets/gtocore/lang/zh_tw.json b/src/generated/resources/assets/gtocore/lang/zh_tw.json index b9a312ecb..38a4183a5 100644 --- a/src/generated/resources/assets/gtocore/lang/zh_tw.json +++ b/src/generated/resources/assets/gtocore/lang/zh_tw.json @@ -9,6 +9,7 @@ "affix.apotheosis:kinetic.suffix": "勢如破竹", "affix.apotheosis:stress": "應力", "affix.apotheosis:stress.suffix": "千鈞一髮", + "affix.gtocore.bedrock_mine_restore.at_most.desc": "(最高可達%s%%)", "affix.gtocore.bedrock_mine_restore.desc": "每次開採礦石可以在當前區塊勘探齣相當於一般儲量%s‰的額外基岩礦脈儲量", "affix.gtocore.bedrock_mine_restore.fluid.desc": "每次開採礦石可以在當前區塊勘探齣相當於一般儲量%s‰的額外基岩流體礦脈儲量", "affix.gtocore.ftb_ultimine.desc": "該工具可以提升%s%%的連鎖挖掘數量上限", @@ -234,8 +235,8 @@ "block.gtocore.compound_extreme_cooling_unit": "複合式極端冷卻裝置", "block.gtocore.comprehensive_tombarthite_processing_facility": "稀土處理綜合設施", "block.gtocore.compressed_fusion_coil": "壓縮聚變線圈方塊", - "block.gtocore.compressed_fusion_coil_mk2": "壓縮聚變線圈方塊MK-II", - "block.gtocore.compressed_fusion_coil_mk2_prototype": "壓縮聚變線圈方塊MK-II原型", + "block.gtocore.compressed_fusion_coil_mk2": "壓縮聚變線圈方塊 MK II", + "block.gtocore.compressed_fusion_coil_mk2_prototype": "壓縮聚變線圈方塊 MK II 原型", "block.gtocore.compressor_controller_casing": "壓縮控製機械方塊", "block.gtocore.compressor_pipe_casing": "壓縮管道機械方塊", "block.gtocore.containment_field_generator": "遏製場髮生器", @@ -302,9 +303,9 @@ "block.gtocore.enderium_borosilicate_glass": "末影強化硼玻璃", "block.gtocore.energetic_photovoltaic_block": "充能光伏方塊", "block.gtocore.energetic_photovoltaic_power_station": "充能光伏電站", - "block.gtocore.energy_control_casing_mk1": "能量控製方塊 MK-I", - "block.gtocore.energy_control_casing_mk2": "能量控製方塊 MK-II", - "block.gtocore.energy_control_casing_mk3": "能量控製方塊 MK-III", + "block.gtocore.energy_control_casing_mk1": "能量控製方塊 MK I", + "block.gtocore.energy_control_casing_mk2": "能量控製方塊 MK II", + "block.gtocore.energy_control_casing_mk3": "能量控製方塊 MK III", "block.gtocore.energy_injector": "能量注入儀", "block.gtocore.engineering_mechanical_casing": "工程機械方塊", "block.gtocore.engraving_laser_plant": "激光蝕刻工厂", @@ -369,9 +370,9 @@ "block.gtocore.force_field_glass": "力場玻璃", "block.gtocore.fuel_cell_generator": "燃料電池髮電機", "block.gtocore.fuel_refining_complex": "燃料精鍊複合體", - "block.gtocore.fusion_casing_mk4": "聚變機械方塊 MK-IV", - "block.gtocore.fusion_casing_mk5": "聚變機械方塊 MK-V", - "block.gtocore.fusion_coil_mk2": "聚變線圈方塊MK-II", + "block.gtocore.fusion_casing_mk4": "聚變機械方塊 MK IV", + "block.gtocore.fusion_casing_mk5": "聚變機械方塊 MK V", + "block.gtocore.fusion_coil_mk2": "聚變線圈方塊 MK II", "block.gtocore.gaiasteel_casing": "蓋亞鋼外殼", "block.gtocore.ganymede_grunt": "木衛三錶皮", "block.gtocore.ganymede_stone": "木衛三岩石", @@ -739,9 +740,9 @@ "block.gtocore.machine_access_terminal": "機器訪問終端", "block.gtocore.machine_casing_circuit_assembly_line": "電路裝配線控製外殼", "block.gtocore.machine_casing_grinding_head": "堅固鑽頭", - "block.gtocore.machining_control_casing_mk1": "運行控製方塊 MK-I", - "block.gtocore.machining_control_casing_mk2": "運行控製方塊 MK-II", - "block.gtocore.machining_control_casing_mk3": "運行控製方塊 MK-III", + "block.gtocore.machining_control_casing_mk1": "運行控製方塊 MK I", + "block.gtocore.machining_control_casing_mk2": "運行控製方塊 MK II", + "block.gtocore.machining_control_casing_mk3": "運行控製方塊 MK III", "block.gtocore.magic_core": "魔法核心", "block.gtocore.magnesium_oxide_ceramic_high_temperature_insulation_mechanical_block": "氧化鎂陶瓷高溫絕緣機械方塊", "block.gtocore.magnetic_confinement_dimensionality_shock_device": "磁約束維度震蕩裝置", @@ -818,7 +819,6 @@ "block.gtocore.me_mana_amplifier_hatch": "ME魔力增幅倉", "block.gtocore.me_mana_interface": "ME魔力接口", "block.gtocore.me_muffler_hatch": "ME消聲倉", - "block.gtocore.me_pattern_content_sort_machine": "ME樣板內容動態修改機", "block.gtocore.me_simple_pattern_buffer": "ME簡單樣板總成", "block.gtocore.me_storage": "ME存儲器", "block.gtocore.me_storage_access_hatch": "ME存儲訪問倉", @@ -1083,11 +1083,11 @@ "block.gtocore.space_elevator_mechanical_casing": "太空電梯機械方塊", "block.gtocore.space_elevator_module_base": "太空電梯模塊基座", "block.gtocore.space_elevator_power_core": "太空電梯動力核心", - "block.gtocore.space_elevator_power_module_1": "太空電梯動力模塊MK1", - "block.gtocore.space_elevator_power_module_2": "太空電梯動力模塊MK2", - "block.gtocore.space_elevator_power_module_3": "太空電梯動力模塊MK3", - "block.gtocore.space_elevator_power_module_4": "太空電梯動力模塊MK4", - "block.gtocore.space_elevator_power_module_5": "太空電梯動力模塊MK5", + "block.gtocore.space_elevator_power_module_1": "太空電梯動力模塊 MK I", + "block.gtocore.space_elevator_power_module_2": "太空電梯動力模塊 MK II", + "block.gtocore.space_elevator_power_module_3": "太空電梯動力模塊 MK III", + "block.gtocore.space_elevator_power_module_4": "太空電梯動力模塊 MK IV", + "block.gtocore.space_elevator_power_module_5": "太空電梯動力模塊 MK V", "block.gtocore.space_elevator_support": "太空電梯支撐結構", "block.gtocore.space_engine_nozzle": "航天髮動機噴管", "block.gtocore.space_probe_surface_reception": "宇宙探測器地面接收單元", @@ -1119,18 +1119,18 @@ "block.gtocore.stable_base_casing": "穩定底座機械方塊", "block.gtocore.stainless_evaporation_casing": "不銹鋼蒸髮外殼", "block.gtocore.stainless_steel_corrosion_resistant_casing": "不銹鋼耐腐蝕機械方塊", - "block.gtocore.star_stone_1": "星辰石 Ⅰ", - "block.gtocore.star_stone_10": "星辰石 Ⅹ", - "block.gtocore.star_stone_11": "星辰石 Ⅺ", - "block.gtocore.star_stone_12": "星辰石 Ⅻ", - "block.gtocore.star_stone_2": "星辰石 Ⅱ", - "block.gtocore.star_stone_3": "星辰石 Ⅲ", - "block.gtocore.star_stone_4": "星辰石 Ⅳ", - "block.gtocore.star_stone_5": "星辰石 Ⅴ", - "block.gtocore.star_stone_6": "星辰石 Ⅵ", - "block.gtocore.star_stone_7": "星辰石 Ⅶ", - "block.gtocore.star_stone_8": "星辰石 Ⅷ", - "block.gtocore.star_stone_9": "星辰石 Ⅸ", + "block.gtocore.star_stone_1": "星辰石 I", + "block.gtocore.star_stone_10": "星辰石 X", + "block.gtocore.star_stone_11": "星辰石 XI", + "block.gtocore.star_stone_12": "星辰石 XII", + "block.gtocore.star_stone_2": "星辰石 II", + "block.gtocore.star_stone_3": "星辰石 III", + "block.gtocore.star_stone_4": "星辰石 IV", + "block.gtocore.star_stone_5": "星辰石 V", + "block.gtocore.star_stone_6": "星辰石 VI", + "block.gtocore.star_stone_7": "星辰石 VII", + "block.gtocore.star_stone_8": "星辰石 VIII", + "block.gtocore.star_stone_9": "星辰石 IX", "block.gtocore.star_ultimate_material_forge_factory": "恆星終極物質鍛造工厂", "block.gtocore.starmetal_coil_block": "星輝線圈方塊", "block.gtocore.steam_assembly_block": "蒸汽裝配方塊", @@ -1624,23 +1624,29 @@ "config.gtocore.option.blinkRange": "旅行手杖瞬移范圍(格)", "config.gtocore.option.blockRange": "旅行錨方塊范圍(格)", "config.gtocore.option.breakBlocksBlackList": "連鎖挖掘黑名單", + "config.gtocore.option.cacheResources": "啟動時緩存資源", "config.gtocore.option.cannibalismDamage": "食肉懲罰傷害", "config.gtocore.option.cannibalismRadius": "食肉懲罰半徑", + "config.gtocore.option.client": "客戶端", "config.gtocore.option.detailedLogging": "[調試] 詳細日誌輸齣", "config.gtocore.option.dev": "開髮者模式", + "config.gtocore.option.devMode": "開髮模式", "config.gtocore.option.difficulty": "遊戲難度", "config.gtocore.option.disableChargeBomb": "禁用爆彈", "config.gtocore.option.disableEmbeddiumBECulling": "禁用Embbedium Global方塊實體剔除", "config.gtocore.option.disableMufflerPart": "禁用消聲倉", + "config.gtocore.option.disableRecyclingRecipes": "[調試] 禁用回收配方", "config.gtocore.option.emiGlobalFavorites": "EMI 全局收藏夾", "config.gtocore.option.enableCustomRecipes": "啟用自定義配方", "config.gtocore.option.exPatternSize": "擴展樣板供應器容量", "config.gtocore.option.fastMultiBlockPage": "快速多方塊頁面加載", "config.gtocore.option.ftbUltimineRange": "連鎖挖掘檢查范圍", + "config.gtocore.option.gamePlay": "遊戲玩法", "config.gtocore.option.hud": "HUD 設置", "config.gtocore.option.itemRange": "旅行錨物品范圍(格)", "config.gtocore.option.lightningRodEffect": "引雷針特效", "config.gtocore.option.maxMonitorSize": "監控器最大尺寸", + "config.gtocore.option.misc": "雜項", "config.gtocore.option.mobConfig": "生物設置", "config.gtocore.option.naturalRegeneration": "生物自然回血", "config.gtocore.option.nightVision": "內置夜視", @@ -1651,7 +1657,6 @@ "config.gtocore.option.sendMultiblockErrorMessages": "髮送多方塊錯誤信息", "config.gtocore.option.serverLang": "服務器語言", "config.gtocore.option.showAEAmountTooltipEverywhereEmi": "在EMI顯示 AE 數量提示", - "config.gtocore.option.showEnglishName": "顯示物品英文名稱", "config.gtocore.option.staffOfTravellingPatternNodes": "旅行手杖樣板節點", "config.gtocore.option.startSpark": "Spark 分析器啟動階段", "config.gtocore.option.travelConfig": "旅行手杖/旅行錨設置", @@ -1665,7 +1670,6 @@ "config.jade.plugin_gtocore.ae_grid_provider": "[GTOCore] AE網絡信息", "config.jade.plugin_gtocore.ae_item_amount": "[GTOCore] AE物品數量", "config.jade.plugin_gtocore.destroy_time_provider": "[GTOCore] 硬度信息", - "config.jade.plugin_gtocore.en_lang": "[GTOCore] 英語顯示", "config.jade.plugin_gtocore.maintenance_hatch_provider": "[GTOCore] 維護倉信息", "config.jade.plugin_gtocore.mana_container_provider": "[GTOCore] 魔力容器", "config.jade.plugin_gtocore.temperature_provider": "[GTOCore] 機器溫度", @@ -2153,12 +2157,15 @@ "gtocore.adv_terminal.setting_already_existed": "存在已有設置", "gtocore.ae.appeng.craft.add_missing_to_emi": "收藏缺失", "gtocore.ae.appeng.craft.add_missing_to_emi.desc": "將缺失的物品添加到EMI書簽頁", + "gtocore.ae.appeng.craft.encode_send": "§o[右鍵點擊] 編碼併髮送樣板§r", + "gtocore.ae.appeng.craft.encode_send.desc": "點擊選擇目的地樣板供應器,併將樣板髮送至該供應器", "gtocore.ae.appeng.craft.missing_start": "缺失合成", "gtocore.ae.appeng.craft.missing_start.desc": "在材料不足的情況下仍然開始合成,缺失的原料將被等待", "gtocore.ae.appeng.craft.pause_job": "暫停", "gtocore.ae.appeng.craft.pause_job.desc": "暫停正在進行中的髮配;已推送的樣板不會被撤回", "gtocore.ae.appeng.craft.resume_job": "繼續", "gtocore.ae.appeng.craft.resume_job.desc": "繼續已暫停的髮配", + "gtocore.ae.appeng.craft.temp_order": "中鍵點擊以創建臨時合成訂單,下單一份該配方的原材料", "gtocore.ae.appeng.craft.used_percent": "已使用 %s%%", "gtocore.ae.appeng.crafting.cycle_error.bracket_close": ")", "gtocore.ae.appeng.crafting.cycle_error.bracket_open": " (", @@ -2219,12 +2226,13 @@ "gtocore.ae.appeng.me_storage_amount": "ME網絡存儲數量", "gtocore.ae.appeng.pattern.priority": "樣板優先級:", "gtocore.ae.appeng.pattern.priority.desc": "此樣板總成提供的樣板優先級。合成計算將優先考慮優先級最高的樣板。", + "gtocore.ae.appeng.pattern_content_access_terminal": "樣板內容管理終端", + "gtocore.ae.appeng.pattern_content_access_terminal.replacement_list_name": "替換列錶#%s", + "gtocore.ae.appeng.pattern_content_access_terminal.replacement_list_tooltip": "在此處設置過濾,以決定哪些樣板中的原料會被替換。", "gtocore.ae.appeng.pick_craft.all_right": "已啟動合成!", - "gtocore.ae.appeng.pick_craft.all_right.title": "Pick-Craft 成功", "gtocore.ae.appeng.pick_craft.error.1": "計算合成路徑時髮生錯誤。", "gtocore.ae.appeng.pick_craft.error.2": "沒有足夠的材料/CPU來合成所需物品。", "gtocore.ae.appeng.pick_craft.error.3": "創建的任務數已達上限。", - "gtocore.ae.appeng.pick_craft.error.title": "Pick-Craft 錯誤", "gtocore.ae.appeng.wildcard_pattern_buffer.blacklist": "通配符樣板總成材料黑名單", "gtocore.ae.appeng.wildcard_pattern_buffer.blacklist.desc": "添加到黑名單中的材料將不會被通配符樣板總成所使用。", "gtocore.ae.appeng.wildcard_pattern_buffer.loaded_patterns": "已掃描加載%s種通配符樣板。", @@ -2584,8 +2592,9 @@ "gtocore.gray_membership_card.hover_text.2": "離線玩家", "gtocore.gray_membership_card.hover_text.3": "主人: ", "gtocore.gray_membership_card.hover_text.4": "共享者: ", - "gtocore.gtm": "整合包使用的GregTech-Modern模組,以及Applied Energetics 2模組均為非官方版本,如果您遇到任何問題或有任何建議,請前往%s提供反饋,而不是模組官方渠道", + "gtocore.gtm": "整合包使用的GregTech-Modern模組,以及Applied Energistics 2模組均為非官方版本,如果您遇到任何問題或有任何建議,請前往%s提供反饋,而不是模組官方渠道", "gtocore.gui.encoding_desc": "§o[Shift + 左擊] 將樣板存入背包/清空所有已編碼樣板", + "gtocore.gui.widget.amount_set.hover_tooltip": "輸入 1-Long.MAX 的整數。支持 k/m/g 簡寫和公式", "gtocore.hud.drag": "右鍵可開啟HUD拖拽模式", "gtocore.hud.toggle.off": "左鍵開關HUD顯示(已禁用)", "gtocore.hud.toggle.on": "左鍵開關HUD顯示(已啟用)", @@ -2621,6 +2630,7 @@ "gtocore.integration.ae.WirelessMachine.gridNodeList": "網絡節點列錶", "gtocore.integration.ae.WirelessMachine.gridNodeSelector": "網絡節點選擇", "gtocore.integration.ae.WirelessMachine.leave": "斷開無線網絡", + "gtocore.integration.ae.WirelessMachine.notConnected": "無", "gtocore.integration.ae.WirelessMachine.player": "綁定到玩家 : %s", "gtocore.integration.ae.WirelessMachine.removeGrid": "刪除", "gtocore.integration.ae.WirelessMachine.renameGrid": "修改網絡昵稱", @@ -2646,9 +2656,9 @@ "gtocore.lang.-121146516": "運行時長調整范圍:40%~100%", "gtocore.lang.-1261349876": "此器官將允許", "gtocore.lang.-1269813583": "護甲韌性", - "gtocore.lang.-1271244345": "其內容就會按照你配置的優先級被同一行匹配替換。", "gtocore.lang.-1309148959": "爆炸", "gtocore.lang.-1315180647": "§aShift + 右鍵方塊:§r 清除該位置的標記§r", + "gtocore.lang.-1334423408": "機器自帶併行機製,無需安裝併行控製倉", "gtocore.lang.-1344483012": "允許拓展結構提升機器效率。", "gtocore.lang.-1383224310": "損耗率 : 0", "gtocore.lang.-1413498661": "整合瞭ME樣板編碼終端與樣板管理終端的功能,", @@ -2671,11 +2681,13 @@ "gtocore.lang.-1955828040": "注釋:", "gtocore.lang.-2014927121": "線圈溫度每高齣900K,併行數x2", "gtocore.lang.-2028697327": "公式 : 4^玻璃等級", + "gtocore.lang.-2034043716": "例如,按順序填入“橡木木板,白樺木板,雲杉木板”的配置,那么當有樣板原料中用到白樺或雲杉木板時,就會動態修改樣板,使用橡木木板作為原料。", "gtocore.lang.-2055315894": "速度加成", "gtocore.lang.-2112077052": "可連接至的太空艙種類:", "gtocore.lang.-267849233": "水下呼吸", "gtocore.lang.-268739386": "併行加成", "gtocore.lang.-287954562": " 修改", + "gtocore.lang.-294733446": "每組配置中,替換的順序為從右到左。", "gtocore.lang.-300078703": "自ULV起,電壓每高齣1級,獲得的併行數+2", "gtocore.lang.-346445743": "需要整套裝備", "gtocore.lang.-374056284": "此器官將提供", @@ -2694,6 +2706,7 @@ "gtocore.lang.-698628939": "需要鏈接無線充能器使用", "gtocore.lang.-724709346": "代錶此艙室能否被多台多方塊結構共享", "gtocore.lang.-749025748": "0.1 + 6.384 / (1.632 + (消耗的電量(單位:GEU))) ^ 4", + "gtocore.lang.-76006678": "只需要將此機器連入ME網絡,然後樣板在被調用時,其內容就會按照你配置的優先級被同一行匹配替換。", "gtocore.lang.-781353543": "只能運行§9IV§r級及以下配方", "gtocore.lang.-790651361": "ME無線連接機", "gtocore.lang.-801705034": "運行時長調整范圍:28%~100%", @@ -2706,10 +2719,11 @@ "gtocore.lang.-88949489": "運行時長調整范圍:32%~100%", "gtocore.lang.-94407882": "銜接艙", "gtocore.lang.-98188006": "§7當從大整數存儲訪問倉升級到該存儲訪問倉時,若原有存儲儲量超過9.2E18,則超過部分將§c§l永久丟失§r§7!§r", - "gtocore.lang.0.-568444703": "Shift+右鍵方塊可以複製其名稱,便於命名", "gtocore.lang.0.1059274564": "ME 網絡超級 CPU", + "gtocore.lang.0.1640495616": "Shift+右鍵方塊可以複製其名稱", "gtocore.lang.0.475558069": "直接通入氧氣與電以工作", "gtocore.lang.1.1285447032": "CPU 性能", + "gtocore.lang.1.336979551": "右鍵物品可以複製其名稱", "gtocore.lang.1000504160": "預測與綜合:", "gtocore.lang.1011049812": "轉子支架每超過§6HV§r一級,每級增加10%效率,併翻倍輸齣功率", "gtocore.lang.1024": " ", @@ -2721,7 +2735,6 @@ "gtocore.lang.1070805810": "基礎產能功率: ", "gtocore.lang.1084246430": "最高溫度: ", "gtocore.lang.1087090424": "調節屬性:", - "gtocore.lang.1137917401": "加速倉的等級低於機器最大電壓等級時加速效力減弱20%每級", "gtocore.lang.1151803146": "安裝模塊後", "gtocore.lang.1158649764": "裏程碑建筑", "gtocore.lang.1160719164": "9007199254740991", @@ -2731,13 +2744,15 @@ "gtocore.lang.1253850554": "難以想象的工作效率,儘管去做吧!", "gtocore.lang.1254853426": "配方中每種產物都需要一層蒸餾塔節", "gtocore.lang.1274868018": "轉子支架每超過§5EV§r一級,每級增加10%效率,併翻倍輸齣功率", + "gtocore.lang.130790430": "允許安裝併行控製倉實現併行處理", "gtocore.lang.1364194362": "公式 : 納米蜂群數量 * 2^(機器等級 - 配方等級), 算去吧", "gtocore.lang.1367583746": "描述:", - "gtocore.lang.1376594968": "只需要將此機器連入ME網絡,然後樣板在被調用時,", "gtocore.lang.1394390896": "樣板倉", "gtocore.lang.140180329": "可以在不同世界傳輸", "gtocore.lang.1427": "- ", + "gtocore.lang.1435846884": "代錶此機器是否允許倉室獨立選擇配方類型,不受機器主體限製", "gtocore.lang.1453419452": "只能運行§8ULV§r級及以下配方", + "gtocore.lang.1482192762": "動態替換樣板內容", "gtocore.lang.1482865987": "262144", "gtocore.lang.1490368255": "幫你算瞭一下,是 1073741824 Bytes", "gtocore.lang.1507489": "1024", @@ -2778,17 +2793,17 @@ "gtocore.lang.1961950737": "1048576", "gtocore.lang.1978323557": "§7可以按順序標記超立方體傳輸目標位置。§r", "gtocore.lang.2.357711854": "容量:決定CPU可以處理的總任務大小", + "gtocore.lang.2005677336": "加速倉的等級低於配方電壓等級時加速效力減弱20%每級", "gtocore.lang.206509868": "17,179.87M (17.2G) Bytes", "gtocore.lang.207321486": "等於燃料組件數量", "gtocore.lang.209383949": "核心艙", "gtocore.lang.233819385": "線圈效率加成", "gtocore.lang.237817396": "無限", - "gtocore.lang.241585397": "支持物品和流體", "gtocore.lang.266512477": "256x -> 384x", + "gtocore.lang.280946395": "管理樣板內容", "gtocore.lang.281670066": "轉子支架每超過§9IV§r一級,每級增加10%效率,併翻倍輸齣功率", "gtocore.lang.3.2106472575": "填滿481個T5元件解鎖無限存儲", "gtocore.lang.32551241": "和", - "gtocore.lang.343537399": "ME樣板內容動態修改機", "gtocore.lang.350931190": "§7昔為安魂之冠,今作療身之藥。§r", "gtocore.lang.362619935": "4194304", "gtocore.lang.363439179": "(密封機械方塊等級)×4", @@ -2800,7 +2815,6 @@ "gtocore.lang.4.334244742": "公式:Σ合成單元存儲量", "gtocore.lang.407924965": "無條件加速機器運行速度", "gtocore.lang.41478": " ☆", - "gtocore.lang.417880883": "是的,你現在可以不修改樣板,就一鍵替換其中的內容瞭。", "gtocore.lang.447198717": "卡巴拉源質:", "gtocore.lang.46299910": "機器內納米蜂群數量,機器等級每超過配方一級,獲得的併行x2", "gtocore.lang.46912042": "16384", @@ -2838,6 +2852,7 @@ "gtocore.lang.716205946": "溫度: ", "gtocore.lang.735333575": "§a安裝本倉後,超頻效果最高提升為每使用4倍功率,機器耗時×16.67%§r", "gtocore.lang.740444711": "§a安裝本倉後,超頻效果最高提升為每使用4倍功率,機器耗時×12.5%§r", + "gtocore.lang.760352670": "從右嚮左替換", "gtocore.lang.76517104": "其他", "gtocore.lang.79175": "৹ ", "gtocore.lang.8.-1732543330": "公式:2^玻璃等級", @@ -3213,7 +3228,7 @@ "gtocore.lang.advanced_assembly_line.3.-538236882": "功夫不負有心人,雖然還有很多局限性,新品相較於過往效率也提高瞭數倍", "gtocore.lang.advanced_assembly_line.3.645766060": "只能使用數據靶倉", "gtocore.lang.advanced_hyper_cube_machine.0.1577061162": "代理多個流體或物品存儲器", - "gtocore.lang.advanced_hyper_cube_machine.1.188391162": "使用§b坐標信息卡§r綁定方塊", + "gtocore.lang.advanced_hyper_cube_machine.1.-1761448469": "使用§b坐標信息卡§r綁定方塊", "gtocore.lang.advanced_hyper_cube_machine.2.-178785670": "綁定某方塊後,對此機器進行物品或流體操作視同對被綁定的方塊操作", "gtocore.lang.advanced_hyper_cube_machine.3.-154366173": "若綁定多個方塊,則依序對他們操作", "gtocore.lang.advanced_hyper_cube_machine.4.-306503171": "右鍵點擊以打開界面", @@ -3224,9 +3239,9 @@ "gtocore.lang.advanced_infinite_driller.11.1673844845": "液態氧 2K/每次輸入", "gtocore.lang.advanced_infinite_driller.12.-1559757127": "液態氦 4K/每次輸入", "gtocore.lang.advanced_infinite_driller.13.-1146717525": "僅可放入中子素鑽頭(更多鑽頭待定)", - "gtocore.lang.advanced_infinite_driller.2.-437538": "需要升溫啟動,可通入液態烈焰或液態熾骨立方", + "gtocore.lang.advanced_infinite_driller.2.1762934901": "需要升溫啟動,可通入液態烈焰或液態熾骨立方", "gtocore.lang.advanced_infinite_driller.3.-656059058": "升溫材料消耗公式(單位:mB): 溫度^1.3", - "gtocore.lang.advanced_infinite_driller.4.-517642844": "升溫速度:(每5tick) 液態烈焰:1K / 每次輸入,液態熾骨立方:1000K / 每次輸入", + "gtocore.lang.advanced_infinite_driller.4.-576390099": "升溫速度:(每5tick) 液態烈焰:1K / 每次輸入,液態熾骨立方:1000K / 每次輸入", "gtocore.lang.advanced_infinite_driller.5.-785999812": "隨著溫度提升,效率也會提升", "gtocore.lang.advanced_infinite_driller.6.-363931573": "當溫度超過臨界值,鑽頭將會融毀", "gtocore.lang.advanced_infinite_driller.7.1939316591": "產熱公式: 溫度 / 2000", @@ -3276,11 +3291,11 @@ "gtocore.lang.area_destruction_tools.2.1258760006": "一鍵清空方塊!!!", "gtocore.lang.area_destruction_tools.3.113394524": "無視一切條件!!!", "gtocore.lang.area_destruction_tools.4.156723940": "注意爆破安全!!!", - "gtocore.lang.area_destruction_tools.5.1790692799": "多人遊戲請務必提醒其他成員!", + "gtocore.lang.area_destruction_tools.5.755143680": "多人遊戲請務必提醒其他成員!", "gtocore.lang.area_destruction_tools.6.-2083166503": "可用模式", "gtocore.lang.area_destruction_tools.7.-1543656193": "嚮庫存放入物品以切換模式", "gtocore.lang.area_destruction_tools.8.-378576493": "放入§b模具(球)§r為§6球模式§r", - "gtocore.lang.area_destruction_tools.9.-200198626": "放入§b模具(圓柱)§r為§6圓柱模式§r", + "gtocore.lang.area_destruction_tools.9.422090037": "放入§b模具(圓柱)§r為§6圓柱模式§r", "gtocore.lang.atmosphere_collector_room.0.654405850": "大氣層的美味榨汁機,專門收集行星的呼吸", "gtocore.lang.atmosphere_collector_room.1.-204933001": "從稀薄的高空到濃鬱的對流層,沒有它抽不動的氣", "gtocore.lang.atmosphere_collector_room.2.-909799297": "超大容量設計,一瓶更比六瓶強", @@ -3297,7 +3312,7 @@ "gtocore.lang.atomizing_condenser.9.-2010464440": "經理聽說後,不但沒有責罵,還記錄下瞭這個意外的過程,併據此研髮齣瞭這台專門用於從熔融的流體生產金屬粉末的機器", "gtocore.lang.auto_connect_me.0.621798580": "允許自動連接ME無線網絡", "gtocore.lang.auto_connect_me.1.-1869929608": "按下Shift放置以自動連接收藏的網絡", - "gtocore.lang.auto_connect_me.2.-1916171520": "小心塞爆礦處!", + "gtocore.lang.auto_connect_me.2.95823732": "小心塞爆礦處!", "gtocore.lang.banned": "在專家模式下,頻道模式命令被禁止", "gtocore.lang.bedrock_drilling_rig.0.1667945339": "量子隧穿鑽頭突破物質穩定性極限,直接作用於基岩原子核", "gtocore.lang.bedrock_drilling_rig.1.1768817903": "需要基岩在鑽頭下方", @@ -3356,7 +3371,7 @@ "gtocore.lang.chemical_complex.5.-1084339066": "分子合成如同藝術創作", "gtocore.lang.chemical_energy_devourer.3.-1890569742": "提供320mB/s的§a液態氧§r,併消耗§4雙倍§r燃料以產生", "gtocore.lang.chemical_energy_devourer.3.31691509": " EU/t的功率", - "gtocore.lang.chemical_energy_devourer.4.-63158004": "再提供480mB/s的§a四氧化二氮§r,併消耗§4四倍§r燃料以產生", + "gtocore.lang.chemical_energy_devourer.4.-149782026": "再提供480mB/s的§a四氧化二氮§r,併消耗§4四倍§r燃料以產生", "gtocore.lang.chemical_energy_devourer.4.31691509": " EU/t的功率", "gtocore.lang.chemical_factory.0.197596055": "在化學的世界裏,每一個分子都在訴說著自己的故事", "gtocore.lang.chemical_factory.1.-2092154410": "線圈等級每高齣白銅一級能耗與時間減少5%", @@ -3415,9 +3430,8 @@ "gtocore.lang.comprehensive_tombarthite_processing_facility.4.-329785974": "運行時的精密振動如同大地的心跳,沉穩而有力", "gtocore.lang.comprehensive_tombarthite_processing_facility.5.1374549352": "稀土分離技術的終極體現,讓稀有元素變得觸手可及", "gtocore.lang.conjunction_space_station_module.0.-1983123524": "工業空間站太空艙種類", - "gtocore.lang.conversion_simulation_card.0.1367867718": "為大型方塊轉換室提供模擬轉換環境", "gtocore.lang.core_space_station_module.0.-1983123524": "工業空間站太空艙種類", - "gtocore.lang.cosmic_celestial_spire_of_convergence.0.-2075807420": "星穹光刃裂維度之障,格雷魔導,啟百年徵航。", + "gtocore.lang.cosmic_celestial_spire_of_convergence.0.-1401508330": "星穹光刃裂維度之障,格雷魔導,啟百年徵航。", "gtocore.lang.cosmic_celestial_spire_of_convergence.1.-348232064": "越死寂虛空,踏混沌異疆,極域鐫神符,黑岩鑄聖腔。", "gtocore.lang.cosmic_celestial_spire_of_convergence.10.1430835709": "暴露於天空之下,不可有遮擋", "gtocore.lang.cosmic_celestial_spire_of_convergence.11.1901526002": "在白天可以凝聚 - 曦煌", @@ -3431,7 +3445,7 @@ "gtocore.lang.cosmic_celestial_spire_of_convergence.2.1446103170": "解天體秘律,淬星髓凝鋼,星海初啟,聖罈威光乍放。", "gtocore.lang.cosmic_celestial_spire_of_convergence.3.908268921": "銀河倒捲奔核心,日月織網,虛空震蕩。", "gtocore.lang.cosmic_celestial_spire_of_convergence.4.-1899796545": "憑維度自生偉力,微芒亦可撬動洪荒。", - "gtocore.lang.cosmic_celestial_spire_of_convergence.5.-862211846": "格雷血汗凝奇跡,為文明拓宇,永奠天疆。", + "gtocore.lang.cosmic_celestial_spire_of_convergence.5.-104885272": "格雷血汗凝奇跡,為文明拓宇,永奠天疆。", "gtocore.lang.cosmic_celestial_spire_of_convergence.6.1853694950": "凝聚群星之中的能量", "gtocore.lang.cosmic_celestial_spire_of_convergence.7.1908133572": "可消耗魔力超頻", "gtocore.lang.cosmic_celestial_spire_of_convergence.8.-1594027075": "每次消耗 2^(超頻等級*4+10) 點魔力,使凝聚效率翻 2^(超頻等級*5) 倍", @@ -3600,7 +3614,7 @@ "gtocore.lang.fast_neutron_breeder.15.1228212578": "小撮/小堆/石墨粉分別降低0.1/0.25/1MeV", "gtocore.lang.fast_neutron_breeder.16.727805493": "中子通量為E(keV)時,在主機內放入N個銥中子反射板後,中子通量每秒增加 (EN)^0.5 keV", "gtocore.lang.fast_neutron_breeder.17.-1548239181": "初始溫度298K,臨界點2098K", - "gtocore.lang.fast_neutron_breeder.18.-845117880": "經過計算,當中子動能在7MeV以上時,堆溫每秒將上升超過1800K,足以在一秒內達到臨界點", + "gtocore.lang.fast_neutron_breeder.18.1159230446": "經過計算,當中子動能在7MeV以上時,堆溫每秒將上升超過1800K,足以在一秒內達到臨界點", "gtocore.lang.fast_neutron_breeder.19.-140293769": "每秒產熱公式:H=K×1.27×(E×10)^1.88,結果嚮上取整", "gtocore.lang.fast_neutron_breeder.2.-1346839424": "配方需滿足最低中子通量", "gtocore.lang.fast_neutron_breeder.20.1058073012": "冷卻液繫數(K/mB/s):蒸餾水1,液氮4,液氦80", @@ -3643,21 +3657,21 @@ "gtocore.lang.fission_reactor.10.-1097033981": "自然降溫: 停止工作時1K/秒", "gtocore.lang.fission_reactor.11.673958219": "超過溫度上限機器開始損坏,完全損坏時", "gtocore.lang.fission_reactor.12.-916343722": "冷卻繫統", - "gtocore.lang.fission_reactor.13.-570274144": "冷卻液類型: 蒸餾水或鈉鉀合金", + "gtocore.lang.fission_reactor.13.-1660298463": "冷卻液 (繫數): 蒸餾水 (800) 鈉鉀合金 (20)", "gtocore.lang.fission_reactor.14.-461574819": "冷卻條件: 供給量 ≥ 需求量", - "gtocore.lang.fission_reactor.15.-1155863786": "最低需求量 = 配方產熱 × 冷卻參數 × 實際併行 × 當前溫度 / 1500", - "gtocore.lang.fission_reactor.16.674459852": "最高供給量 = (冷卻組件 - 相鄰數/3) × 8", - "gtocore.lang.fission_reactor.17.1037486894": "消耗量 = 需求量 × 冷卻液繫數", + "gtocore.lang.fission_reactor.15.2020151051": "需求量 = 配方產熱 × 實際併行 × 當前溫度 / 1500", + "gtocore.lang.fission_reactor.16.-1344879984": "供給量 = (冷卻組件 - 相鄰數/3) × 8", + "gtocore.lang.fission_reactor.17.1656673038": "消耗量 = 需求量 × 冷卻液繫數", "gtocore.lang.fission_reactor.18.682210113": "超頻機製", - "gtocore.lang.fission_reactor.19.-971847264": "觸髮條件: 供給量 ≥ n × 需求量 (n>1)", + "gtocore.lang.fission_reactor.19.-62494071": "觸髮條件: 供給量 ≥ n × 需求量 (n>1)", "gtocore.lang.fission_reactor.2.-1593095757": "據他所說,GT這邊先進的化工技術可以產齣鈉鉀冷卻液,能更充分髮揮這台機器的性能", "gtocore.lang.fission_reactor.2.-162474227": "燃料組件: 提供最大併行數量", - "gtocore.lang.fission_reactor.20.-1470811327": "超頻效果: 減少n秒配方時間", + "gtocore.lang.fission_reactor.20.-1889434194": "超頻效果: 運行速度提升至 n 倍", "gtocore.lang.fission_reactor.21.629215326": "冷卻液產齣", - "gtocore.lang.fission_reactor.22.135781624": "蒸餾水冷卻: ", + "gtocore.lang.fission_reactor.22.-861236008": "蒸餾水冷卻: ", "gtocore.lang.fission_reactor.23.-688763008": "產齣蒸汽,產量 = 消耗量 × min(160, 160/(1.4^(373-溫度)))", - "gtocore.lang.fission_reactor.24.1887171541": "鈉鉀合金冷卻:", - "gtocore.lang.fission_reactor.25.-1147508056": "≤825K: 熱鈉鉀合金;>825K: 超臨界鈉鉀合金", + "gtocore.lang.fission_reactor.24.1145967411": "鈉鉀合金冷卻:", + "gtocore.lang.fission_reactor.25.-139514968": "≤825K: 熱鈉鉀合金;>825K: 超臨界鈉鉀合金", "gtocore.lang.fission_reactor.3.-1623337062": "升溫繫數 = 燃料組件相鄰數 + 1", "gtocore.lang.fission_reactor.3.-1833223094": "沒有人知道真假,畢竟從一個跳槽的人嘴裏又能得到多少實話呢", "gtocore.lang.fission_reactor.4.668971985": "冷卻組件: 提供最大冷卻能力", @@ -3780,7 +3794,7 @@ "gtocore.lang.holy_separator.2.-1124245426": "祭罈般的旋轉平台,讓離心過程如同神聖的淨化儀式", "gtocore.lang.holy_separator.3.205609803": "莊嚴的低頻嗡鳴,仿佛在吟唱分離的聖歌", "gtocore.lang.holy_separator.4.-1480114238": "密度差異成為最優雅的分離藝術", - "gtocore.lang.hyper_cube_machine.0.365030754": "代理一個流體或物品存儲器", + "gtocore.lang.hyper_cube_machine.0.-1568948399": "代理一個流體或物品存儲器", "gtocore.lang.hyper_cube_machine.1.188391162": "使用§b坐標信息卡§r綁定方塊", "gtocore.lang.hyper_cube_machine.2.-178785670": "綁定某方塊後,對此機器進行物品或流體操作視同對被綁定的方塊操作", "gtocore.lang.hyper_cube_machine.3.-306503171": "右鍵點擊以打開界面", @@ -3802,7 +3816,7 @@ "gtocore.lang.industrial_platform_deployment_tools.5.-1450367514": "工業平台展開工具", "gtocore.lang.industrial_platform_deployment_tools.5.958391167": "妙妙工具: ", "gtocore.lang.industrial_platform_deployment_tools.6.1699145324": "基於預設藍圖快速部署工業基地", - "gtocore.lang.industrial_platform_deployment_tools.7.-1645570500": "需消耗指定型號的工業組件作為基礎構建材料", + "gtocore.lang.industrial_platform_deployment_tools.7.1832452560": "需消耗指定型號的工業組件作為基礎構建材料", "gtocore.lang.industrial_platform_deployment_tools.8.525488636": "部分高級藍圖需額外配備輔助材料", "gtocore.lang.industrial_platform_deployment_tools.9.-373629456": "專業級工業基地搭建工具", "gtocore.lang.industrial_platform_deployment_tools.introduction.0.166055481": "快速部署標准化工業平台", @@ -3825,7 +3839,7 @@ "gtocore.lang.industrial_platform_deployment_tools.introduction.24.1066829591": "藍圖導齣功能", "gtocore.lang.industrial_platform_deployment_tools.introduction.25.1469547294": "將兩張坐標卡插入工具底部插槽可激活導齣模式", "gtocore.lang.industrial_platform_deployment_tools.introduction.26.-2113609600": "歡迎提交優質藍圖至社區倉庫", - "gtocore.lang.industrial_platform_deployment_tools.introduction.27.2127441005": "不支持框架方塊和小方塊", + "gtocore.lang.industrial_platform_deployment_tools.introduction.27.155189904": "不支持框架方塊和小方塊", "gtocore.lang.industrial_platform_deployment_tools.introduction.3.-2069210991": "既能快速搭建礦石分揀站等基礎生產節點,也可擴展為包含精鍊車間、倉儲中心的複雜工業集群", "gtocore.lang.industrial_platform_deployment_tools.introduction.4.1073467762": "界面說明", "gtocore.lang.industrial_platform_deployment_tools.introduction.5.-1070998781": "一:藍圖選擇頁 - 用於瀏覽/篩選預設藍圖、預覽結構效果、查看材料清單及調整部署參數", @@ -3958,7 +3972,7 @@ "gtocore.lang.large_space_station.0.-171313362": "GTO寰宇集糰的太空站已經成功運營多年", "gtocore.lang.large_space_station.1.-231416899": "為瞭滿足更多更大的機器需求,GTO寰宇集糰決定建造更大的空間站", "gtocore.lang.large_space_station.1.-842118898": "提供一個保護機器正常工作,免受太空輻射等複雜環境影響的空間", - "gtocore.lang.large_space_station.11.-137832514": "運行需要消耗7680EU/t的基礎能量", + "gtocore.lang.large_space_station.11.-761641233": "運行需要消耗7680EU/t的基礎能量", "gtocore.lang.large_space_station.12.538665093": "會根據安裝的拓展艙體數量增加額外能耗以及資源消耗", "gtocore.lang.large_space_station.13.-1933155152": "每秒固定消耗:", "gtocore.lang.large_space_station.14.-439688291": "15mB * (1 + 拓展艙體數量) 蒸餾水", @@ -3995,13 +4009,13 @@ "gtocore.lang.large_steam_circuit_assembler.6.1319503679": "同時解鎖超頻功能", "gtocore.lang.large_steam_circuit_assembler.7.1488230621": "電路倍產", "gtocore.lang.large_steam_circuit_assembler.8.1977435861": "開啟增產模式後倍增產齣 (默認開啟)", - "gtocore.lang.large_steam_cracker.0.-1674002160": "原料效率僅正常裂化機的80%", - "gtocore.lang.large_steam_cracker.1.-40088499": "每使用高一等級的蒸汽輸入倉,原料效率提升20%", + "gtocore.lang.large_steam_cracker.0.1217765388": "原料效率僅正常裂化機的40%", + "gtocore.lang.large_steam_cracker.1.1027096257": "每使用高一等級的蒸汽輸入倉,配方產齣提升100mb", "gtocore.lang.large_steam_solar_boiler.0.-1779936924": "靠天吃飯一直是公司老祖宗的傳統", "gtocore.lang.large_steam_solar_boiler.1.-2105861460": "然而古法工藝顯然不能製作高精尖的太陽能板,也只能平攤著應付一下", "gtocore.lang.large_steam_solar_boiler.2.2028482001": "反正不要錢,沒有人會嫌棄它的", "gtocore.lang.large_turbine.4.-1092594663": "獲得2倍速度", - "gtocore.lang.large_turbine.5.-334038057": "獲得額外120%渦輪效率", + "gtocore.lang.large_turbine.5.944353312": "獲得額外20%渦輪效率", "gtocore.lang.large_turbine.6.1503536831": "轉子損耗速度變為2倍", "gtocore.lang.large_void_miner.0.1610129296": "看著倉庫中的礦物逐漸捉襟見肘,董事長顯得有些擔憂", "gtocore.lang.large_void_miner.0.2128106565": "精准模式", @@ -4056,7 +4070,7 @@ "gtocore.lang.mana_amplifier_hatch.3.898412636": "對於跨配方機器,則將其超頻繫數額外x2 ", "gtocore.lang.mana_amplifier_hatch.4.-507469829": "否則,機器不執行配方", "gtocore.lang.mana_heater.1.724409426": "輸入魔力加熱", - "gtocore.lang.mana_heater.2.-1602020602": "如果輸入§c火元素蒸汽§r,則加熱速度翻5倍", + "gtocore.lang.mana_heater.2.1577697679": "如果輸入§c火元素蒸汽§r,則加熱速度翻5倍", "gtocore.lang.mantle_crusher.0.1155931590": "地球之心的工業化身,駕馭地幔力量粉碎一切", "gtocore.lang.mantle_crusher.1.-275128847": "只管把岩石丟進去,剩下的交給地震級別的機器力量", "gtocore.lang.mantle_crusher.2.-1262270807": "從礦石到廢料,任何物質在這裏都能被粉碎成最細微的顆粒", @@ -4085,6 +4099,7 @@ "gtocore.lang.me_pattern_hatch.1.1438463364": "可以放入樣板,併進行一鍵髮配", "gtocore.lang.me_pattern_hatch.2.90273460": "樣板間分別隔離,互不乾擾", "gtocore.lang.me_pattern_hatch.3.-303408860": "對著樣板按鼠標中鍵可單獨設置電路或者提供特別輸入", + "gtocore.lang.me_pattern_hatch.4.228256588": "可獨立選擇配方類型,不受機器主體限製", "gtocore.lang.me_storage.0.1603758035": "ME存儲", "gtocore.lang.me_storage.1.69447024": "不受存儲類型限製", "gtocore.lang.me_storage.2.-1248245399": "你需要在結構中安裝存儲核心來提升容量", @@ -4371,7 +4386,7 @@ "gtocore.lang.pcb_factory.3.1359689755": "實時量子檢測繫統確保每塊PCB板都達到絕對零缺陷標准", "gtocore.lang.pcb_factory.4.1219141665": "製造過程中產生的熱噪聲被轉化為能量,實現負熵生產循環", "gtocore.lang.pcb_factory.5.-385343199": "納米製造時代的黎明為電子工業帶來無限可能", - "gtocore.lang.performance_monitor_machine.1.-821568673": "能監測全部機器或AE網絡3.2秒內的平均延遲", + "gtocore.lang.performance_monitor_machine.1.-821568673": "能監測全部機器或AE網絡3.2秒內的平均延遲,併支持高亮顯示", "gtocore.lang.performance_monitor_machine.2.-895636497": "右鍵點擊機器以打開性能監測界面", "gtocore.lang.petrochemical_plant.0.697667990": "工業鍊金術的終極殿堂,將黑色黃金轉化為萬千化工奇跡", "gtocore.lang.petrochemical_plant.1.-2006125672": "裂化線圈與精密分餾塔的完美交響,一步完成全流程", @@ -4565,8 +4580,8 @@ "gtocore.lang.rotor_hatch.1.254780438": "不同類型的轉子的效率,耐久不同", "gtocore.lang.satellite_control_center.0.-581836799": "髮射衛星,帶回星球數據", "gtocore.lang.sensor.0.-908223020": "紅石信號", - "gtocore.lang.sensor.1.-547927712": "未反轉時,數值低於最低值或高於最高值時輸齣0,介於兩者之間時輸齣遞增的1-15的紅石信號", - "gtocore.lang.sensor.2.1092475273": "反轉時,數值低於最低值或高於最高值時輸齣15,介於兩者之間時輸齣遞減的1-15的紅石信號", + "gtocore.lang.sensor.1.805381985": "未反轉時,數值低於最低值或高於最高值時輸齣0,介於兩者之間時輸齣遞增的1-15的紅石信號", + "gtocore.lang.sensor.2.-1849182326": "反轉時,數值低於最低值或高於最高值時輸齣15,介於兩者之間時輸齣遞減的1-15的紅石信號", "gtocore.lang.sintering_furnace.0.-1087549334": "作為陶瓷生產中的核心設備", "gtocore.lang.sintering_furnace.1.-2079148997": "GTO集糰設計人員為這台燒結爐奮戰瞭無數日夜", "gtocore.lang.sintering_furnace.2.-1564634528": "型號HCS-41燒結爐有著完美的成品率", @@ -4617,9 +4632,9 @@ "gtocore.lang.space_probe_surface_reception.4.1443410799": "根據戴森球模塊數量提升產齣", "gtocore.lang.space_probe_surface_reception.5.1355476240": "該操作不會損坏戴森球", "gtocore.lang.space_shield_hatch.0.-286075237": "在GTO寰宇重工的空間站技術還沒完全完善的時候科研人員緊急開髮齣的小型防護罩", - "gtocore.lang.space_shield_hatch.1.214640611": "經過技術改良,現在可以保護機器免受太空環境乾擾", + "gtocore.lang.space_shield_hatch.1.-1725316429": "經過技術改良,現在可以保護機器免受太空環境乾擾", "gtocore.lang.space_shield_hatch.2.1525594846": "需要機器內置的激光倉提供激光", - "gtocore.lang.space_shield_hatch.4.1078238127": "保護機器免受太空環境乾擾而無法運行", + "gtocore.lang.space_shield_hatch.4.969054311": "保護機器免受太空環境乾擾而無法運行", "gtocore.lang.space_shield_hatch.5.362873821": "需要機器同時配備激光能源倉", "gtocore.lang.space_station.0.-1759943409": "歡迎來到GTO寰宇集糰的太空站", "gtocore.lang.space_station.1.-842118898": "提供一個保護機器正常工作,免受太空輻射等複雜環境影響的空間", @@ -4760,18 +4775,18 @@ "gtocore.lang.the_primordial_reconstructor.14.177619011": "消耗魔力合成,需要一個銘刻之布", "gtocore.lang.the_primordial_reconstructor.15.-1607911616": "電路 8:寶石合併", "gtocore.lang.the_primordial_reconstructor.16.304631115": "使用同級的珍寶材料和寶石粉合併寶石", - "gtocore.lang.the_primordial_reconstructor.17.-1023124673": "電路 9:寶石粉碎", + "gtocore.lang.the_primordial_reconstructor.17.484427136": "電路 9:寶石粉碎", "gtocore.lang.the_primordial_reconstructor.18.1377677116": "將寶石粉碎得到寶石粉", - "gtocore.lang.the_primordial_reconstructor.19.1043709144": "電路 10:強行附魔", + "gtocore.lang.the_primordial_reconstructor.19.-1859407092": "電路 10:強行附魔", "gtocore.lang.the_primordial_reconstructor.2.-1834983047": "需要輸入 書 銘刻之布 摘除符石", "gtocore.lang.the_primordial_reconstructor.20.-1573633020": "消耗魔力強行將附魔書上的附魔添加到物品上", - "gtocore.lang.the_primordial_reconstructor.21.20755412": "電路 11:強行刻印", + "gtocore.lang.the_primordial_reconstructor.21.232106325": "電路 11:強行刻印", "gtocore.lang.the_primordial_reconstructor.22.150684258": "消耗魔力強行將銘刻之布上的刻印添加到物品上", - "gtocore.lang.the_primordial_reconstructor.23.1946350774": "電路 12:強行修改物品稀有度", + "gtocore.lang.the_primordial_reconstructor.23.-63753067": "電路 12:強行修改物品稀有度", "gtocore.lang.the_primordial_reconstructor.24.1541758190": "消耗魔力,珍寶材料和新生符文強行改變稀有度", - "gtocore.lang.the_primordial_reconstructor.25.2115773330": "電路 13:強行添加鑲孔", + "gtocore.lang.the_primordial_reconstructor.25.-1486092269": "電路 13:強行添加鑲孔", "gtocore.lang.the_primordial_reconstructor.26.2025332053": "消耗魔力,鑲孔符文強行添加鑲孔", - "gtocore.lang.the_primordial_reconstructor.27.560967334": "電路 14:強行鑲嵌寶石", + "gtocore.lang.the_primordial_reconstructor.27.-283504537": "電路 14:強行鑲嵌寶石", "gtocore.lang.the_primordial_reconstructor.28.-1321781064": "消耗魔力,強行將寶石鑲嵌到物品上", "gtocore.lang.the_primordial_reconstructor.3.844478837": "電路 2:物品 + 附魔 解構", "gtocore.lang.the_primordial_reconstructor.4.1145404194": "需要輸入 銘刻之布 摘除符石", @@ -4830,7 +4845,7 @@ "gtocore.lang.village_trading_station.11.-2135450499": "泛銀河格雷科技研髮部匠心研髮", "gtocore.lang.village_trading_station.12.1168006789": "詳細操作說明請查閱機器內置手冊", "gtocore.lang.village_trading_station.2.2067725596": "最終誕生的貿易站機器實現瞭全自動化交易流程:無需匹配工作方塊,只需放入村民併鎖定信息,內置繫統便會按設定節奏自動完成交易與補貨", - "gtocore.lang.village_trading_station.3.-1903998976": "升級後的批量交易與智能補貨功能,讓村民們常笑著稱讚:“格雷科技的機器,比跑斷腿的信使還貼心”", + "gtocore.lang.village_trading_station.3.826867541": "升級後的批量交易與智能補貨功能,讓村民們常笑著稱讚:“格雷科技的機器,比跑斷腿的信使還貼心”", "gtocore.lang.village_trading_station.4.-1550776722": "如今它已成為聯結公司與村莊的友好紐帶,既讓資源流轉效率提升數倍,也讓雙方的信任在順暢交易中日益深厚", "gtocore.lang.village_trading_station.5.1020125537": "村民貿易站", "gtocore.lang.village_trading_station.5.958391167": "妙妙工具: ", @@ -4868,13 +4883,19 @@ "gtocore.lang.village_trading_station.introduction.9.-1842078679": "四:方嚮配置頁 - 可設置輸齣物品的方嚮,靈活適配基地物流布局", "gtocore.lang.void_fluid_drill.0.-268833863": "虛空流體鑽機§r§b是格雷科技在虛空領域的又一力作", "gtocore.lang.void_fluid_drill.1.1882050481": "它可以在虛空中鑽取流體", - "gtocore.lang.void_fluid_drill.2.1383463229": "放入維度數據,設置電路後即可獲取鑽齣對應世界流體礦床的流體", - "gtocore.lang.void_fluid_drilling_rig.1.-1080730207": "需要最低30720EU/t的功率", - "gtocore.lang.void_miner.1.-1994846686": "需要輸入1B鑽井液和最低1920EU/t的功率", - "gtocore.lang.void_miner.2.-1533774086": "產齣機製", - "gtocore.lang.void_miner.3.-929903268": "按維度隨機選取4種礦石輸齣", - "gtocore.lang.void_miner.4.-1685785075": "電壓等級決定單次最大輸齣數量", - "gtocore.lang.void_miner.5.-32153660": "電流決定併行數", + "gtocore.lang.void_fluid_drilling_rig.1.1305154805": "在主機中放入維度數據來設置鑽取維度", + "gtocore.lang.void_fluid_drilling_rig.2.-1080730207": "需要最低30720EU/t的功率", + "gtocore.lang.void_fluid_drilling_rig.3.-1533774086": "產齣機製", + "gtocore.lang.void_fluid_drilling_rig.4.-1910843527": "放入數據後,主機將顯示可鑽取流體列錶", + "gtocore.lang.void_fluid_drilling_rig.5.2081500057": "根據機器設置的電路按順序選擇鑽取目標", + "gtocore.lang.void_miner.0.457662303": "虛空採礦機§r§b是格雷科技在虛空領域的又一力作", + "gtocore.lang.void_miner.1.-1541488034": "在主機中放入維度數據來設置採礦維度", + "gtocore.lang.void_miner.1.1721904631": "它可以在虛空中開採礦石", + "gtocore.lang.void_miner.2.-1994846686": "需要輸入1B鑽井液和最低1920EU/t的功率", + "gtocore.lang.void_miner.3.-1533774086": "產齣機製", + "gtocore.lang.void_miner.4.-929903268": "按維度隨機選取4種礦石輸齣", + "gtocore.lang.void_miner.5.-1685785075": "電壓等級決定單次最大輸齣數量", + "gtocore.lang.void_miner.6.-32153660": "電流決定併行數", "gtocore.lang.water_purification_plant.0.-37818779": "水中的污染物和離子顆粒會在硅片和芯片切割和鵰刻的精密過程中造成顯著的缺陷", "gtocore.lang.water_purification_plant.0.1369142758": "處理單元鏈接繫統", "gtocore.lang.water_purification_plant.1.1000852519": "通過一繫列越來越精確和複雜的淨化過程繫統地淨化水是至關重要的,而這個多方塊結構是操作的核心", @@ -4888,7 +4909,7 @@ "gtocore.lang.wireless_dimension_repeater.1.-1198227948": "在不同維度間中繼能量", "gtocore.lang.wireless_dimension_repeater.2.-1548032904": "能量最大電壓取決於使用的外殼等級", "gtocore.lang.wireless_dimension_repeater.3.438009707": "與電流大小無關", - "gtocore.lang.wireless_dimension_repeater.4.1195838228": "沒有電流上限簡直是原始人的超級科技", + "gtocore.lang.wireless_dimension_repeater.4.231278609": "沒有電流上限簡直是原始人的超級科技", "gtocore.lang.wireless_energy_substation.0.1288417405": "為無線電網提供容量支持", "gtocore.lang.wireless_energy_substation.1.-1430140471": "電網容量", "gtocore.lang.wireless_energy_substation.2.42593670": "可在內部安裝任意無線能量單元來提高容量上限", @@ -5347,8 +5368,8 @@ "gtocore.machine.stellar_forge.pressure": "內部壓力:", "gtocore.machine.structure_check": "更新結構檢查", "gtocore.machine.structure_check.shift": "Shift+點擊 將強製重新檢查結構", - "gtocore.machine.sync_tester_machine.tooltip.0": "A tool for testing machine synchronization.", - "gtocore.machine.sync_tester_machine.tooltip.1": "Do not use in production environment.", + "gtocore.machine.sync_tester_machine.tooltip.0": "用於測試機器同步的工具。", + "gtocore.machine.sync_tester_machine.tooltip.1": "請勿在生產環境中使用。", "gtocore.machine.synthetic_data_assembly_plant.tooltip.0": "分析/推演的一體化機器。", "gtocore.machine.synthetic_data_assembly_plant.tooltip.1": "根據§b掃描數據§r得到§b研究數據§r。", "gtocore.machine.synthetic_data_assembly_plant.tooltip.2": "需要§b算力§r來進行工作。", @@ -5357,7 +5378,7 @@ "gtocore.machine.tag_filter.tooltip.0": "* 錶示通配符 () 錶示優先", "gtocore.machine.tag_filter.tooltip.1": "& = 邏輯與 | = 邏輯或 ^ = 邏輯異或", "gtocore.machine.temp.per_second": "配方每秒升溫: %sK", - "gtocore.machine.test_report_output.tooltip.0": "Print some test information", + "gtocore.machine.test_report_output.tooltip.0": "打印一些測試用信息", "gtocore.machine.text.thread": "線程%s:", "gtocore.machine.the_primordial_reconstructor.mode.0": "工作模式: 未設定", "gtocore.machine.the_primordial_reconstructor.mode.1": "工作模式: 物品解構", @@ -5534,6 +5555,7 @@ "gtocore.part_ability.export_fluids_4x": "流體輸齣倉(四重)", "gtocore.part_ability.export_fluids_9x": "流體輸齣倉(九重)", "gtocore.part_ability.export_items": "物品輸齣倉", + "gtocore.part_ability.extra_energy_hatch": "額外能源倉", "gtocore.part_ability.extract_mana": "魔力抽取倉", "gtocore.part_ability.hpca_component": "高性能計算組件", "gtocore.part_ability.import_fluids": "流體輸入倉", @@ -5734,10 +5756,6 @@ "gtocore.tooltip.item.uruium_coil_block.1": "恆星鍛爐模式僅可使用該線圈", "gtocore.tooltip.item.vacuum_tube.0": "手持粗真空管潛行右擊真空等級大於0的真空提供機器獲取", "gtocore.tooltip.item.virtual_item_provider": "為機器的虛擬電路槽提供物品", - "gtocore.tooltip.pattern_content_sort_machine.apply": "應用", - "gtocore.tooltip.pattern_content_sort_machine.means_for_line_0": " 每行為一組,樣板內所有此行物品輸入會被替換為此行優先級最高的物品,每行物品優先級依據物品優先級從左開始高到低排序,如果一行內有流體容器,則對內部流體做相應替換,左側優先級最高", - "gtocore.tooltip.pattern_content_sort_machine.mode.fluid": "模式 : 流體替換", - "gtocore.tooltip.pattern_content_sort_machine.mode.item": "模式 : 物品替換", "gtocore.tooltip.unknown": "未知", "gtocore.top.checking": "正在檢查結構", "gtocore.top.errors": "可能的錯誤 ", @@ -6053,16 +6071,16 @@ "item.gtocore.cupriavidus_petri_dish": "貪銅鈎虫菌培養皿", "item.gtocore.cyan_dye_masterbatch": "青色染料色母", "item.gtocore.dark_matter": "暗物質", - "item.gtocore.data_crystal_component_mk1": "數據晶片組件 mk1", - "item.gtocore.data_crystal_component_mk2": "數據晶片組件 mk2", - "item.gtocore.data_crystal_component_mk3": "數據晶片組件 mk3", - "item.gtocore.data_crystal_component_mk4": "數據晶片組件 mk4", - "item.gtocore.data_crystal_component_mk5": "數據晶片組件 mk5", - "item.gtocore.data_crystal_mk1": "數據晶片 mk1", - "item.gtocore.data_crystal_mk2": "數據晶片 mk2", - "item.gtocore.data_crystal_mk3": "數據晶片 mk3", - "item.gtocore.data_crystal_mk4": "數據晶片 mk4", - "item.gtocore.data_crystal_mk5": "數據晶片 mk5", + "item.gtocore.data_crystal_component_mk1": "數據晶片組件 MK I", + "item.gtocore.data_crystal_component_mk2": "數據晶片組件 MK II", + "item.gtocore.data_crystal_component_mk3": "數據晶片組件 MK III", + "item.gtocore.data_crystal_component_mk4": "數據晶片組件 MK IV", + "item.gtocore.data_crystal_component_mk5": "數據晶片組件 MK V", + "item.gtocore.data_crystal_mk1": "數據晶片 MK I", + "item.gtocore.data_crystal_mk2": "數據晶片 MK II", + "item.gtocore.data_crystal_mk3": "數據晶片 MK III", + "item.gtocore.data_crystal_mk4": "數據晶片 MK IV", + "item.gtocore.data_crystal_mk5": "數據晶片 MK V", "item.gtocore.data_disc": "數據光盤", "item.gtocore.data_item.type.title": "§n%s配方數據:", "item.gtocore.debug_structure_writer": "多方塊結構導齣工具", @@ -6200,9 +6218,9 @@ "item.gtocore.enchantment_essence_vanishing_curse": "附魔精粹 (消失詛咒)", "item.gtocore.ender_crystal": "末影水晶", "item.gtocore.ender_diamond": "末影鑽石", - "item.gtocore.energy_control_module_mk1": "能量控製模塊 MK-I", - "item.gtocore.energy_control_module_mk2": "能量控製模塊 MK-II", - "item.gtocore.energy_control_module_mk3": "能量控製模塊 MK-III", + "item.gtocore.energy_control_module_mk1": "能量控製模塊 MK I", + "item.gtocore.energy_control_module_mk2": "能量控製模塊 MK II", + "item.gtocore.energy_control_module_mk3": "能量控製模塊 MK III", "item.gtocore.energy_upgrade_module": "能量升級模塊", "item.gtocore.entangled_singularity": "糾纏奇點", "item.gtocore.eschericia_petri_dish": "大腸桿菌培養皿", @@ -6304,15 +6322,15 @@ "item.gtocore.holy_root_mycelium": "聖根菌絲", "item.gtocore.hootch_bucket": "烈酒桶", "item.gtocore.hot_iron_ingot": "熱鐵錠", - "item.gtocore.hui_circuit_1": "高算力工作站 MK-I", + "item.gtocore.hui_circuit_1": "高算力工作站 MK I", "item.gtocore.hui_circuit_1.tooltip": "§793015-T浮點運算/秒", - "item.gtocore.hui_circuit_2": "高算力工作站 MK-II", + "item.gtocore.hui_circuit_2": "高算力工作站 MK II", "item.gtocore.hui_circuit_2.tooltip": "§776M處理單元", - "item.gtocore.hui_circuit_3": "高算力工作站 MK-III", + "item.gtocore.hui_circuit_3": "高算力工作站 MK III", "item.gtocore.hui_circuit_3.tooltip": "§7無效RSA算法", - "item.gtocore.hui_circuit_4": "高算力工作站 MK-IV", + "item.gtocore.hui_circuit_4": "高算力工作站 MK IV", "item.gtocore.hui_circuit_4.tooltip": "§7第56梅森素數", - "item.gtocore.hui_circuit_5": "高算力工作站 MK-V", + "item.gtocore.hui_circuit_5": "高算力工作站 MK V", "item.gtocore.hui_circuit_5.tooltip": "§7佯謬", "item.gtocore.hv_drone": "基礎無人機", "item.gtocore.hv_power_amplifiers": "HV功率增幅器", @@ -6340,8 +6358,8 @@ "item.gtocore.lapis_vein_essence": "青金石精華", "item.gtocore.laser_cooling_unit": "激光冷卻單元", "item.gtocore.laser_diode": "激光二極管", - "item.gtocore.laser_gyroscope_mk1": "激光陀螺儀 MK-I", - "item.gtocore.laser_gyroscope_mk2": "激光陀螺儀 MK-II", + "item.gtocore.laser_gyroscope_mk1": "激光陀螺儀 MK I", + "item.gtocore.laser_gyroscope_mk2": "激光陀螺儀 MK II", "item.gtocore.lepton_trap_crystal": "輕子阱晶體", "item.gtocore.liquid_sunshine_bucket": "液態陽光桶", "item.gtocore.lithography_mask": "光刻掩膜", @@ -6350,9 +6368,9 @@ "item.gtocore.luv_power_amplifiers": "LuV功率增幅器", "item.gtocore.lv_power_amplifiers": "LV功率增幅器", "item.gtocore.lv_reward_bag": "LV 戰利品袋", - "item.gtocore.machining_control_module_mk1": "運行控製模塊 MK-I", - "item.gtocore.machining_control_module_mk2": "運行控製模塊 MK-II", - "item.gtocore.machining_control_module_mk3": "運行控製模塊 MK-III", + "item.gtocore.machining_control_module_mk1": "運行控製模塊 MK I", + "item.gtocore.machining_control_module_mk2": "運行控製模塊 MK II", + "item.gtocore.machining_control_module_mk3": "運行控製模塊 MK III", "item.gtocore.macrowormhole_generator": "巨型虫洞髮生器", "item.gtocore.magenta_dye_masterbatch": "品紅色染料色母", "item.gtocore.magnetic_trap": "磁阱", @@ -6455,6 +6473,7 @@ "item.gtocore.palm_sized_bank": "泛銀河繫格雷科技掌上銀行", "item.gtocore.pattern.wildcard": "含通配符處理樣板", "item.gtocore.pattern_buffer_upgrader": "樣板總成升級器", + "item.gtocore.pattern_content_access_terminal": "樣板內容管理終端", "item.gtocore.pattern_modifier_pro": "樣板修改器pro", "item.gtocore.pattern_modifier_pro.name": "樣板修改器 Pro", "item.gtocore.pellet_antimatter": "反物質", @@ -6470,11 +6489,11 @@ "item.gtocore.plasma_containment_cell": "等離子體密閉容器", "item.gtocore.pm_chip": "皮米功率集成電路", "item.gtocore.pm_wafer": "皮米功率集成電路晶圓", - "item.gtocore.precision_circuit_assembly_robot_mk1": "精密電路裝配機器人MKⅠ", - "item.gtocore.precision_circuit_assembly_robot_mk2": "精密電路裝配機器人MKⅡ", - "item.gtocore.precision_circuit_assembly_robot_mk3": "精密電路裝配機器人MKⅢ", - "item.gtocore.precision_circuit_assembly_robot_mk4": "精密電路裝配機器人MKⅣ", - "item.gtocore.precision_circuit_assembly_robot_mk5": "精密電路裝配機器人MKⅤ", + "item.gtocore.precision_circuit_assembly_robot_mk1": "精密電路裝配機器人 MK I", + "item.gtocore.precision_circuit_assembly_robot_mk2": "精密電路裝配機器人 MK II", + "item.gtocore.precision_circuit_assembly_robot_mk3": "精密電路裝配機器人 MK III", + "item.gtocore.precision_circuit_assembly_robot_mk4": "精密電路裝配機器人 MK IV", + "item.gtocore.precision_circuit_assembly_robot_mk5": "精密電路裝配機器人 MK V", "item.gtocore.precision_steam_mechanism": "精密蒸汽構件", "item.gtocore.preoxidized_atomic_pan_fiber": "預氧化原子級聚丙烯腈原絲", "item.gtocore.preoxidized_micron_pan_fiber": "預氧化微米級聚丙烯腈原絲", @@ -6563,8 +6582,8 @@ "item.gtocore.simple_optical_fiber_preform": "簡易光纖預製棒", "item.gtocore.simple_optical_soc": "簡易光學SoC", "item.gtocore.slot_enhancer": "槽位強化器", - "item.gtocore.small_shuttle_mk1": "小型太空梭 MK-I", - "item.gtocore.small_shuttle_mk2": "小型太空梭 MK-II", + "item.gtocore.small_shuttle_mk1": "小型太空梭 MK I", + "item.gtocore.small_shuttle_mk2": "小型太空梭 MK II", "item.gtocore.smd_capacitor_bioware": "生物活性貼片電容", "item.gtocore.smd_capacitor_cosmic": "寰宇貼片電容", "item.gtocore.smd_capacitor_exotic": "奇異貼片電容", @@ -6605,17 +6624,17 @@ "item.gtocore.space_coolant_cell_10k": "10K空間冷卻單元", "item.gtocore.space_coolant_cell_30k": "30K空間冷卻單元", "item.gtocore.space_coolant_cell_60k": "60K空間冷卻單元", - "item.gtocore.space_drone_mk1": "太空無人機MKⅠ", - "item.gtocore.space_drone_mk2": "太空無人機MKⅡ", - "item.gtocore.space_drone_mk3": "太空無人機MKⅢ", - "item.gtocore.space_drone_mk4": "太空無人機MKⅣ", - "item.gtocore.space_drone_mk5": "太空無人機MKⅤ", - "item.gtocore.space_drone_mk6": "太空無人機MKⅥ", + "item.gtocore.space_drone_mk1": "太空無人機 MK I", + "item.gtocore.space_drone_mk2": "太空無人機 MK II", + "item.gtocore.space_drone_mk3": "太空無人機 MK III", + "item.gtocore.space_drone_mk4": "太空無人機 MK IV", + "item.gtocore.space_drone_mk5": "太空無人機 MK V", + "item.gtocore.space_drone_mk6": "太空無人機 MK VI", "item.gtocore.space_essence": "宇宙精華", "item.gtocore.space_nanomuscle_chestplate": "納米肌體™套裝太空胸甲", - "item.gtocore.space_probe_mk1": "宇宙探測器MKⅠ", - "item.gtocore.space_probe_mk2": "宇宙探測器MKⅡ", - "item.gtocore.space_probe_mk3": "宇宙探測器MKⅢ", + "item.gtocore.space_probe_mk1": "宇宙探測器 MK I", + "item.gtocore.space_probe_mk2": "宇宙探測器 MK II", + "item.gtocore.space_probe_mk3": "宇宙探測器 MK III", "item.gtocore.space_quarktech_chestplate": "夸剋高科™套裝太空胸甲", "item.gtocore.spacetime_catalyst": "時空催化劑", "item.gtocore.special_ceramics": "特種陶瓷", @@ -6763,6 +6782,7 @@ "item.gtocore.tcetiedandelions": "鯨魚座T星E藻類", "item.gtocore.tcetieseaweedextract": "鯨魚座T星E藻類提取物", "item.gtocore.temporal_matter": "時間物質", + "item.gtocore.temporary_order": "%s 臨時訂單", "item.gtocore.tesseract_target_marker": "坐標標簽槍", "item.gtocore.tetrahedrite_vein_essence": "黝銅精華", "item.gtocore.tier_0_eye": "器官 標准器官 眼睛 寶寶級", @@ -8138,10 +8158,10 @@ "metaitem.tool.tooltip.rotor.coating.tooltip.0": "§6鍍層機製:", "metaitem.tool.tooltip.rotor.coating.tooltip.0.magic": "§d魔法§6鍍層機製:", "metaitem.tool.tooltip.rotor.coating.tooltip.1": "§b鍍層會提供一道吸收轉子損耗的屏障,當轉子A有鍍層B,鍍層B的耐久為§d4 * max(B/10, min(B-A, B/2))", - "metaitem.tool.tooltip.rotor.coating.tooltip.1.magic": "§d魔法§b鍍層將不再提供耐久度屏障,而是會提供魔法材料屬性×30%的轉子效率與渦輪產能", + "metaitem.tool.tooltip.rotor.coating.tooltip.1.magic": "§d魔法§b鍍層將不再提供耐久度屏障,而是會提供魔法材料額外屬性×30%的轉子效率與渦輪產能", "metaitem.tool.tooltip.rotor.coating.tooltip.2": "§b每次轉子損坏時95%概率優先消耗鍍層耐久,鍍層耐久耗儘後再消耗本體耐久", "metaitem.tool.tooltip.rotor.coating.tooltip.2.magic": "§b本體消耗耐久時,§d魔法§b鍍層將同時損耗耐久,鍍層耐久耗儘後轉子效率與渦輪產能將回落至原始值。", - "metaitem.tool.tooltip.rotor.coating.tooltip.3.magic": "當轉子A有鍍層B,鍍層B的耐久為§dmax(B/10, min(B-A, B/2))", + "metaitem.tool.tooltip.rotor.coating.tooltip.3.magic": "當轉子A有鍍層B,鍍層B的耐久為§d4 * max(B/10, min(B-A, B/2))", "metaitem.tool.tooltip.rotor.coating_durability": "鍍層耐久:%s / %s", "metaitem.tool.tooltip.rotor.coating_efficiency": "鍍層效率:%s%%", "metaitem.tool.tooltip.rotor.coating_power": "鍍層產能:%s%%", diff --git a/src/generated/resources/assets/gtocore/models/item/temporary_order.json b/src/generated/resources/assets/gtocore/models/item/temporary_order.json new file mode 100644 index 000000000..9ae2cef87 --- /dev/null +++ b/src/generated/resources/assets/gtocore/models/item/temporary_order.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "gtocore:item/temporary_order" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtocore/models/item/travel_staff.json b/src/generated/resources/assets/gtocore/models/item/travel_staff.json index 1a95ef525..2b7724b09 100644 --- a/src/generated/resources/assets/gtocore/models/item/travel_staff.json +++ b/src/generated/resources/assets/gtocore/models/item/travel_staff.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:item/handheld", "textures": { "layer0": "gtocore:item/travel_staff" } diff --git a/src/generated/resources/data/gt/tags/items/isa_processable.json b/src/generated/resources/data/gt/tags/items/isa_processable.json new file mode 100644 index 000000000..710c8b2d1 --- /dev/null +++ b/src/generated/resources/data/gt/tags/items/isa_processable.json @@ -0,0 +1,80 @@ +{ + "values": [ + "gtceu:nickel_ore", + "gtceu:platinum_ore", + "gtceu:enriched_naquadah_ore", + "gtceu:almandine_ore", + "gtceu:chalcopyrite_ore", + "gtceu:grossular_ore", + "gtceu:pyrope_ore", + "gtceu:spessartine_ore", + "gtceu:sphalerite_ore", + "gtceu:pentlandite_ore", + "gtceu:monazite_ore", + "gtceu:redstone_ore", + "gtceu:deepslate_nickel_ore", + "gtceu:deepslate_platinum_ore", + "gtceu:deepslate_almandine_ore", + "gtceu:deepslate_chalcopyrite_ore", + "gtceu:deepslate_grossular_ore", + "gtceu:deepslate_pyrope_ore", + "gtceu:deepslate_spessartine_ore", + "gtceu:deepslate_sphalerite_ore", + "gtceu:deepslate_pentlandite_ore", + "gtceu:deepslate_monazite_ore", + "gtceu:deepslate_redstone_ore", + "gtceu:netherrack_grossular_ore", + "gtceu:netherrack_spessartine_ore", + "gtceu:netherrack_sphalerite_ore", + "gtceu:netherrack_redstone_ore", + "gtocore:moon_stone_pentlandite_ore", + "gtocore:moon_stone_monazite_ore", + "gtocore:mars_stone_platinum_ore", + "gtocore:mars_stone_chalcopyrite_ore", + "gtocore:venus_stone_sphalerite_ore", + "gtocore:mercury_stone_nickel_ore", + "gtocore:mercury_stone_platinum_ore", + "gtocore:mercury_stone_chalcopyrite_ore", + "gtocore:mercury_stone_grossular_ore", + "gtocore:mercury_stone_spessartine_ore", + "gtocore:mercury_stone_pentlandite_ore", + "gtocore:glacio_stone_platinum_ore", + "gtocore:glacio_stone_monazite_ore", + "gtocore:titan_stone_almandine_ore", + "gtocore:titan_stone_pyrope_ore", + "gtocore:io_stone_sphalerite_ore", + "gtocore:ganymede_stone_nickel_ore", + "gtocore:ganymede_stone_chalcopyrite_ore", + "gtocore:ganymede_stone_pentlandite_ore", + "gtocore:enceladus_stone_platinum_ore", + "gtocore:enceladus_stone_chalcopyrite_ore", + "gtocore:enceladus_stone_redstone_ore", + "gtocore:ceres_stone_chalcopyrite_ore", + "gtocore:ceres_stone_grossular_ore", + "gtocore:ceres_stone_spessartine_ore", + "gtocore:ceres_stone_pentlandite_ore", + "gtocore:ceres_stone_monazite_ore", + "gtocore:sculk_stone_nickel_ore", + "gtocore:sculk_stone_platinum_ore", + "gtocore:sculk_stone_almandine_ore", + "gtocore:sculk_stone_chalcopyrite_ore", + "gtocore:sculk_stone_grossular_ore", + "gtocore:sculk_stone_pyrope_ore", + "gtocore:sculk_stone_spessartine_ore", + "gtocore:sculk_stone_sphalerite_ore", + "gtocore:sculk_stone_pentlandite_ore", + "gtocore:sculk_stone_monazite_ore", + "gtocore:sculk_stone_redstone_ore", + "gtocore:gloomslate_nickel_ore", + "gtocore:gloomslate_platinum_ore", + "gtocore:gloomslate_almandine_ore", + "gtocore:gloomslate_chalcopyrite_ore", + "gtocore:gloomslate_grossular_ore", + "gtocore:gloomslate_pyrope_ore", + "gtocore:gloomslate_spessartine_ore", + "gtocore:gloomslate_sphalerite_ore", + "gtocore:gloomslate_pentlandite_ore", + "gtocore:gloomslate_monazite_ore", + "gtocore:gloomslate_redstone_ore" + ] +} \ No newline at end of file diff --git a/src/main/java/com/gtocore/api/ae2/crafting/ExecutingCraftingJob.java b/src/main/java/com/gtocore/api/ae2/crafting/ExecutingCraftingJob.java index 0d6c2ab01..ad3f08442 100644 --- a/src/main/java/com/gtocore/api/ae2/crafting/ExecutingCraftingJob.java +++ b/src/main/java/com/gtocore/api/ae2/crafting/ExecutingCraftingJob.java @@ -1,5 +1,7 @@ package com.gtocore.api.ae2.crafting; +import com.gtocore.common.data.GTOItems; + import com.gtolib.api.ae2.pattern.IParallelPatternDetails; import com.gtolib.utils.holder.LongHolder; @@ -42,6 +44,7 @@ class ExecutingCraftingJob { final ElapsedTimeTracker timeTracker; final IElapsedTimeTracker tt; GenericStack finalOutput; + boolean isOrder; long remainingAmount; Integer playerId; boolean paused = false; @@ -65,6 +68,7 @@ class ExecutingCraftingJob { private ExecutingCraftingJob(ICraftingPlan plan, ListCraftingInventory.ChangeListener changeListener, CraftingLink link, @Nullable Integer playerId) { this.finalOutput = plan.finalOutput(); + this.isOrder = isOrder(this.finalOutput); this.remainingAmount = this.finalOutput.amount(); this.waitingFor = new ListCraftingInventory(changeListener); @@ -110,6 +114,7 @@ private ExecutingCraftingJob(ICraftingPlan plan, ListCraftingInventory.ChangeLis } this.finalOutput = GenericStack.readTag(data.getCompound(NBT_FINAL_OUTPUT)); + this.isOrder = isOrder(this.finalOutput); this.remainingAmount = data.getLong(NBT_REMAINING_AMOUNT); this.waitingFor = new ListCraftingInventory(changeListener); this.waitingFor.readFromNBT(data.getList(NBT_WAITING_FOR, Tag.TAG_COMPOUND)); @@ -211,4 +216,11 @@ CompoundTag writeToNBT() { return data; } + + private static boolean isOrder(GenericStack finalOutput) { + if (finalOutput == null) { + return false; + } + return finalOutput.what() instanceof AEItemKey itemKey && (itemKey.getItem() == GTOItems.ORDER.get() || itemKey.getItem() == GTOItems.TEMP_ORDER.get()); + } } diff --git a/src/main/java/com/gtocore/api/ae2/crafting/OptimizedCraftingCpuLogic.java b/src/main/java/com/gtocore/api/ae2/crafting/OptimizedCraftingCpuLogic.java index 1ae0dd92a..bccd0cad5 100644 --- a/src/main/java/com/gtocore/api/ae2/crafting/OptimizedCraftingCpuLogic.java +++ b/src/main/java/com/gtocore/api/ae2/crafting/OptimizedCraftingCpuLogic.java @@ -3,6 +3,7 @@ import com.gtocore.common.data.GTOItems; import com.gtocore.config.GTOConfig; import com.gtocore.integration.ae.CraftingCpuHelperExtended; +import com.gtocore.integration.ae.hooks.ITemporaryCraftableService; import com.gtolib.GTOCore; import com.gtolib.api.ae2.IPatternProviderLogic; @@ -86,7 +87,7 @@ public ICraftingSubmitResult trySubmitJob(IGrid grid, ICraftingPlan plan, IActio if (!inventory.list.isEmpty()) GTOCore.LOGGER.error("Crafting CPU inventory is not empty yet a job was submitted."); KeyCounter missingIng; - if (GTOConfig.INSTANCE.allowMissingCraftingJobs && src.player().isPresent()) { + if (GTOConfig.INSTANCE.gamePlay.allowMissingCraftingJobs && src.player().isPresent()) { missingIng = CraftingCpuHelperExtended.tryExtractInitialItemsIgnoreMissing(plan, grid, inventory, src); } else { var missingIngredient = CraftingCpuHelper.tryExtractInitialItems(plan, grid, inventory, src); @@ -103,6 +104,7 @@ public ICraftingSubmitResult trySubmitJob(IGrid grid, ICraftingPlan plan, IActio cluster.updateOutput(plan.finalOutput()); cluster.markDirty(); notifyJobOwner(job, CraftingJobStatusPacket.Status.STARTED); + ((ITemporaryCraftableService) grid.getCraftingService()).gto$setTempPatternDetails(null); if (requester != null) { var linkReq = new CraftingLink(CraftingCpuHelper.generateLinkData(craftId, false, true), requester); @@ -134,10 +136,11 @@ public void tickCraftingLogic(IEnergyService eg, CraftingService cc) { if (executeCrafting(cluster.getCoProcessors(), cc, eg, cluster.getLevel()) == 0) { GenericStack stack = getFinalJobOutput(); - if (stack != null && stack.what() instanceof AEItemKey itemKey && itemKey.getItem() == GTOItems.ORDER.get()) { + if (job != null && job.isOrder && stack != null) { // the job is crafting an order and is waiting for an order, which means its dependencies have been // crafted - final var waitingFor = getWaitingFor(itemKey); + job.waitingFor.list.removeZeros(); + final var waitingFor = getWaitingFor(stack.what()); if (waitingFor > 0) { final var remainingAmount = job.remainingAmount - waitingFor; // Simulate inserting final result with the same logic as CraftingCpuLogic.insert @@ -145,8 +148,13 @@ public void tickCraftingLogic(IEnergyService eg, CraftingService cc) { finishJob(true); cluster.updateOutput(null); } else { - cluster.updateOutput(new GenericStack(itemKey, remainingAmount)); + cluster.updateOutput(new GenericStack(stack.what(), remainingAmount)); } + } else if (job.waitingFor.list.isEmpty() && job.tasks.size() == 1 && stack.what() instanceof AEItemKey item && item.getItem() == GTOItems.TEMP_ORDER.asItem()) { + // Temp order item has no real pattern details, so if it's the only task left, and we're not waiting + // for anything, we can assume the job is done + finishJob(true); + cluster.updateOutput(null); } } } diff --git a/src/main/java/com/gtocore/api/data/tag/GTOTagPrefix.java b/src/main/java/com/gtocore/api/data/tag/GTOTagPrefix.java index fba2d33f1..0775fdd0f 100644 --- a/src/main/java/com/gtocore/api/data/tag/GTOTagPrefix.java +++ b/src/main/java/com/gtocore/api/data/tag/GTOTagPrefix.java @@ -6,6 +6,7 @@ import com.gtolib.GTOCore; import com.gtolib.api.annotation.DataGeneratorScanned; +import com.gtolib.api.annotation.NewDataAttributes; import com.gtolib.api.annotation.language.RegisterLanguage; import com.gtolib.api.data.chemical.material.GTOMaterialBuilder; import com.gtolib.utils.RLUtils; @@ -39,6 +40,7 @@ import static com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialFlags.NO_SMASHING; import static com.gregtechceu.gtceu.api.data.tag.TagPrefix.Conditions.*; import static com.gregtechceu.gtceu.common.data.GTMaterials.Boron; +import static com.gtocore.common.machine.multiblock.generator.FullCellGenerator.Wrapper.MEMBRANE_MATS; @DataGeneratorScanned @SuppressWarnings("unused") @@ -146,7 +148,7 @@ private static TagPrefix ore(String name) { public static final TagPrefix FIBER_MESH = new GTOTagPrefix("carbon_fiber_mesh").idPattern("%s_carbon_fiber_mesh").defaultTagPath("carbon_fiber_meshes/%s").unformattedTagPath("carbon_fiber_meshes").materialAmount(GTValues.M * 2).materialIconType(new MaterialIconType("carbon_fiber_mesh")).unificationEnabled(true).generateItem(true).generationCondition(mat -> mat.hasFlag(GTOMaterialFlags.GENERATE_FIBER)); public static final TagPrefix NANO = new GTOTagPrefix("nano").idPattern("nano_%s").defaultTagPath("nanos/%s").unformattedTagPath("nanos").materialAmount(GTValues.M / 16).materialIconType(MaterialIconType.dust).unificationEnabled(true).generateItem(true).generationCondition(mat -> mat.hasFlag(GTOMaterialFlags.HAS_NANOSCALE_FORM)); - public static final TagPrefix MEMBRANE_ELECTRODE = new GTOTagPrefix("membrane_electrode").idPattern("%s_membrane_electrode").defaultTagPath("membrane_electrodes/%s").unformattedTagPath("membrane_electrodes").materialAmount(GTValues.M).materialIconType(new MaterialIconType("membrane_electrode")).unificationEnabled(true).generateItem(true).generationCondition(mat -> mat.hasFlag(GTOMaterialFlags.GENERATE_MEMBRANE_ELECTRODE)); + public static final TagPrefix MEMBRANE_ELECTRODE = new GTOTagPrefix("membrane_electrode").idPattern("%s_membrane_electrode").defaultTagPath("membrane_electrodes/%s").unformattedTagPath("membrane_electrodes").materialAmount(GTValues.M).materialIconType(new MaterialIconType("membrane_electrode")).unificationEnabled(true).generateItem(true).tooltip((mat, tooltips) -> tooltips.addAll(NewDataAttributes.LEVEL.create(MEMBRANE_MATS.indexOf(mat) + 1).get())).generationCondition(mat -> mat.hasFlag(GTOMaterialFlags.GENERATE_MEMBRANE_ELECTRODE)); private GTOTagPrefix useRenderer(final ICustomRenderer renderer) { this.customRenderer = renderer; diff --git a/src/main/java/com/gtocore/api/gui/ktflexible/FlexibleExperimentalWidgetDSL.kt b/src/main/java/com/gtocore/api/gui/ktflexible/FlexibleExperimentalWidgetDSL.kt index f4f4c300e..a6179cdb5 100644 --- a/src/main/java/com/gtocore/api/gui/ktflexible/FlexibleExperimentalWidgetDSL.kt +++ b/src/main/java/com/gtocore/api/gui/ktflexible/FlexibleExperimentalWidgetDSL.kt @@ -125,12 +125,12 @@ fun LayoutBuilder<*>.multiPageAdvanced(width: Int, height: Int, style: (Style.() val pageSuppliers: MutableList Unit>> = mutableListOf() init { currentPage.setReceiverListener { side, old, newV -> - if (GTOConfig.INSTANCE.aeLog) println("Page changed from $old to $newV on $side") + if (GTOConfig.INSTANCE.devMode.aeLog) println("Page changed from $old to $newV on $side") runOnUpdate.run() refresh() } currentPage.setSenderListener { side, old, newV -> - if (GTOConfig.INSTANCE.aeLog) println("Page changed from $old to $newV on $side") + if (GTOConfig.INSTANCE.devMode.aeLog) println("Page changed from $old to $newV on $side") runOnUpdate.run() refresh() } diff --git a/src/main/java/com/gtocore/api/machine/part/GTOPartAbility.java b/src/main/java/com/gtocore/api/machine/part/GTOPartAbility.java index 5e44f9019..f568222e6 100644 --- a/src/main/java/com/gtocore/api/machine/part/GTOPartAbility.java +++ b/src/main/java/com/gtocore/api/machine/part/GTOPartAbility.java @@ -35,6 +35,9 @@ public final class GTOPartAbility extends PartAbility { public static final PartAbility STEAM_IMPORT_FLUIDS = new GTOPartAbility("steam_import_fluids", "蒸汽流体输入仓", "Steam Import Fluids"); public static final PartAbility STEAM_EXPORT_FLUIDS = new GTOPartAbility("steam_export_fluids", "蒸汽流体输出仓", "Steam Export Fluids"); + // 仅用于放入附属模块的描述中 + public static final PartAbility EXTRA_ENERGY_HATCH = new GTOPartAbility("extra_energy_hatch", "额外能源仓", "Extra Energy Hatch"); + public GTOPartAbility(String name, String cn, String en) { super(name); if (LANG != null) { diff --git a/src/main/java/com/gtocore/api/machine/part/ILargeSpaceStationMachine.java b/src/main/java/com/gtocore/api/machine/part/ILargeSpaceStationMachine.java index 496be5916..3edb808d8 100644 --- a/src/main/java/com/gtocore/api/machine/part/ILargeSpaceStationMachine.java +++ b/src/main/java/com/gtocore/api/machine/part/ILargeSpaceStationMachine.java @@ -142,11 +142,11 @@ default void customText(@NotNull List list) { enum ConnectType { - CONJUNCTION(0xFFFF00, () -> blocks(GTOBlocks.TITANIUM_ALLOY_INTERNAL_FRAME.get()) + CONJUNCTION(0xFFFF00, () -> blocks(GTOBlocks.TITANIUM_ALLOY_FRAME_INTERNAL.get()) .or(checkIsConjunction).or(checkIsModule)), - MODULE(0x00FFFF, () -> blocks(GTOBlocks.TITANIUM_ALLOY_INTERNAL_FRAME.get()) + MODULE(0x00FFFF, () -> blocks(GTOBlocks.TITANIUM_ALLOY_FRAME_INTERNAL.get()) .or(checkIsConjunction)), - CORE(0xFF0000, () -> blocks(GTOBlocks.TITANIUM_ALLOY_INTERNAL_FRAME.get()) + CORE(0xFF0000, () -> blocks(GTOBlocks.TITANIUM_ALLOY_FRAME_INTERNAL.get()) .or(checkIsConjunction)); public final int color; diff --git a/src/main/java/com/gtocore/api/pattern/GTOPredicates.java b/src/main/java/com/gtocore/api/pattern/GTOPredicates.java index 9a24bd8ec..be5fc92b6 100644 --- a/src/main/java/com/gtocore/api/pattern/GTOPredicates.java +++ b/src/main/java/com/gtocore/api/pattern/GTOPredicates.java @@ -10,7 +10,11 @@ import com.gtolib.utils.GTOUtils; import com.gregtechceu.gtceu.api.block.MetaMachineBlock; +import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity; import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; +import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; +import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IRotorHolderMachine; @@ -20,6 +24,7 @@ import com.gregtechceu.gtceu.api.pattern.Predicates; import com.gregtechceu.gtceu.api.pattern.TraceabilityPredicate; import com.gregtechceu.gtceu.api.pattern.error.PatternStringError; +import com.gregtechceu.gtceu.api.pattern.predicates.PredicateBlocks; import com.gregtechceu.gtceu.api.pattern.predicates.SimplePredicate; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; @@ -317,6 +322,23 @@ public boolean isAir() { }; } + public static TraceabilityPredicate frame(Material frameMaterial) { + var block = ChemicalHelper.getBlock(TagPrefix.frameGt, frameMaterial); + if (block == null) { + throw new IllegalArgumentException("No frame block found for material: " + frameMaterial.getName()); + } + return new TraceabilityPredicate( + new PredicateBlocks(block)) { + + @Override + public boolean test(MultiblockState blockWorldState) { + if (super.test(blockWorldState)) return true; + if (blockWorldState.world.isLoaded(blockWorldState.getPos()) && blockWorldState.getTileEntity() instanceof PipeBlockEntity pipeTile) return pipeTile.getFrameMaterial() == frameMaterial; + return false; + } + }; + } + static { BlockPattern.addWhitelistBlockEntity(ManaPoolBlockEntity.class); } diff --git a/src/main/java/com/gtocore/api/pattern/PredicatePlaceholder.java b/src/main/java/com/gtocore/api/pattern/PredicatePlaceholder.java deleted file mode 100644 index 5606da34c..000000000 --- a/src/main/java/com/gtocore/api/pattern/PredicatePlaceholder.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.gtocore.api.pattern; - -import com.gregtechceu.gtceu.api.pattern.predicates.PredicateBlocks; - -import net.minecraft.world.level.block.Blocks; - -public class PredicatePlaceholder extends PredicateBlocks { - - public PredicatePlaceholder() { - super(Blocks.BARRIER); - } -} diff --git a/src/main/java/com/gtocore/api/report/MaterialReport.java b/src/main/java/com/gtocore/api/report/MaterialReport.java index 2c9ed9ee7..9502f670c 100644 --- a/src/main/java/com/gtocore/api/report/MaterialReport.java +++ b/src/main/java/com/gtocore/api/report/MaterialReport.java @@ -1,7 +1,8 @@ package com.gtocore.api.report; import com.gtocore.api.data.material.GTOMaterialFlags; -import com.gtocore.client.forge.GTOComponentHandler; +import com.gtocore.integration.Mods; +import com.gtocore.integration.lang.LangAdaptor; import com.gtolib.GTOCore; import com.gtolib.api.annotation.DataGeneratorScanned; @@ -34,6 +35,9 @@ public class MaterialReport { private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); public static void generateReport() { + if (!Mods.LANG.isLoaded()) { + GTOCore.LOGGER.warn("MoreMoreLang 未加载,无法使用多语言功能,跳过材料报告语言相关部分生成"); + } StringBuilder report = new StringBuilder(); StringBuilder report_json = new StringBuilder(); StringBuilder report_table = new StringBuilder(); @@ -170,8 +174,14 @@ public static class Entry { public static Entry fromMaterial(Material material) { Entry entry = new Entry(); - entry.cnName = material.getLocalizedName().getString(); - entry.enName = GTOComponentHandler.INSTANCE.getEnglishLanguage().getOrDefault(material.getUnlocalizedName(), material.getUnlocalizedName()); + + if (Mods.LANG.isLoaded()) { + entry.cnName = LangAdaptor.langCn(material.getLocalizedName()); + entry.enName = LangAdaptor.langEn(material.getLocalizedName()); + } else { + entry.cnName = material.getLocalizedName().getString(); + entry.enName = material.getUnlocalizedName(); + } entry.symbol = material.getChemicalFormula(); entry.hexColor1 = getHexColorString(material.getMaterialRGB()); entry.hexColor2 = getHexColorString(material.getMaterialSecondaryRGB()); diff --git a/src/main/java/com/gtocore/client/ClientProxy.java b/src/main/java/com/gtocore/client/ClientProxy.java index 4aec05e5f..877f85ef5 100644 --- a/src/main/java/com/gtocore/client/ClientProxy.java +++ b/src/main/java/com/gtocore/client/ClientProxy.java @@ -12,6 +12,9 @@ import com.gtocore.common.forge.ClientForge; import com.gtocore.common.machine.monitor.MonitorBlockItem; import com.gtocore.eio_travel.client.travel.TravelAnchorHud; +import com.gtocore.integration.ae.PatternContentAccessTerminalMenu; +import com.gtocore.integration.ae.PatternContentAccessTerminalPart; +import com.gtocore.integration.ae.PatternContentAccessTerminalScreen; import com.gtolib.GTOCore; import com.gtolib.api.ae2.me2in1.Me2in1Menu; @@ -143,6 +146,10 @@ private static void registerMenuScreen(FMLClientSetupEvent event) { CategoryMappingSubMenu.TYPE, CategoryMappingSubScreen::new, "/screens/categoru_mapping_config.json"); + InitScreens.register( + PatternContentAccessTerminalMenu.TYPE, + PatternContentAccessTerminalScreen::new, + "/screens/terminals/pattern_content_access_terminal.json"); }); } @@ -154,5 +161,6 @@ private static void registerAdditionalModels(ModelEvent.RegisterAdditional evt) private static void registerAEModels() { PartModels.registerModels(Me2in1TerminalPart.MODELS); + PartModels.registerModels(PatternContentAccessTerminalPart.MODEL_OFF, PatternContentAccessTerminalPart.MODEL_ON); } } diff --git a/src/main/java/com/gtocore/client/KeyBind.java b/src/main/java/com/gtocore/client/KeyBind.java index 7406b0e85..41a8aa322 100644 --- a/src/main/java/com/gtocore/client/KeyBind.java +++ b/src/main/java/com/gtocore/client/KeyBind.java @@ -5,6 +5,7 @@ import com.gtolib.utils.ClientUtil; import net.minecraft.client.KeyMapping; +import net.minecraft.client.Minecraft; import net.minecraft.network.chat.Component; import net.minecraftforge.client.settings.KeyConflictContext; import net.minecraftforge.client.settings.KeyModifier; @@ -21,10 +22,11 @@ public final class KeyBind { @Override public void setDown(boolean isDown) { if (isDownOld != isDown && isDown && ClientUtil.getPlayer() != null) { - GTOConfig.set("nightVision", !GTOConfig.INSTANCE.nightVision); - ClientUtil.getPlayer().displayClientMessage(GTOConfig.INSTANCE.nightVision ? + GTOConfig.set("nightVision", !GTOConfig.INSTANCE.client.nightVision, "client"); + ClientUtil.getPlayer().displayClientMessage(GTOConfig.INSTANCE.client.nightVision ? Component.translatable("metaarmor.message.nightvision.enabled") : Component.translatable("metaarmor.message.nightvision.disabled"), true); + Minecraft.getInstance().gameRenderer.lightTexture().updateLightTexture(Minecraft.getInstance().getPartialTick()); } super.setDown(isDown); } diff --git a/src/main/java/com/gtocore/client/Message.java b/src/main/java/com/gtocore/client/Message.java index 974763463..6f37ef1ac 100644 --- a/src/main/java/com/gtocore/client/Message.java +++ b/src/main/java/com/gtocore/client/Message.java @@ -1,21 +1,31 @@ package com.gtocore.client; +import com.gtocore.integration.ae.hooks.ICraftAmountMenu; +import com.gtocore.integration.ae.hooks.IExtendedPatternEncodingTerm; + import com.gtolib.api.network.NetworkPack; import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; +import net.minecraft.client.Minecraft; import net.minecraft.core.GlobalPos; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.level.Level; import net.minecraft.world.phys.BlockHitResult; +import appeng.api.implementations.blockentities.PatternContainerGroup; +import appeng.api.stacks.GenericStack; +import appeng.api.stacks.KeyCounter; +import appeng.client.gui.me.items.PatternEncodingTermScreen; +import appeng.menu.me.common.MEStorageMenu; + public final class Message { public static void init() {} - public static final NetworkPack NETWORK_PACK = NetworkPack.registerC2S("openContainerC2S", (p, b) -> tryOpenMetaMachineUI(p, b.readGlobalPos())); + public static final NetworkPack OPEN_CONTAINER_C2S = NetworkPack.registerC2S("openContainerC2S", (p, b) -> tryOpenMetaMachineUI(p, b.readGlobalPos())); private static void tryOpenMetaMachineUI(ServerPlayer p, GlobalPos globalPos) { Level level = p.getServer().getLevel(globalPos.dimension()); @@ -27,4 +37,65 @@ private static void tryOpenMetaMachineUI(ServerPlayer p, GlobalPos globalPos) { } } } + + public static final NetworkPack ORDER_ITEM_C2S = NetworkPack.registerC2S("orderItemC2S", (p, b) -> { + var containerId = b.readInt(); + if (p.containerMenu.containerId != containerId) return; + if (!(p.containerMenu instanceof MEStorageMenu menu)) return; + var keyCounter = new KeyCounter(); + var size = b.readVarInt(); + for (int i = 0; i < size; i++) { + var stack = GenericStack.readBuffer(b); + if (stack == null) return; + keyCounter.add(stack.what(), stack.amount()); + } + ICraftAmountMenu.open(p, menu.getLocator(), keyCounter, b.readLong()); + }); + + public static final NetworkPack SEND_PATTERN_DESTINATION_S2C = NetworkPack.registerS2C("sendPatternDestinationS2C", (p, b) -> { + var size = b.readVarInt(); + var destinations = new PatternContainerGroup[size]; + for (int i = 0; i < size; i++) { + destinations[i] = PatternContainerGroup.readFromPacket(b); + } + Client.patternDestinationReceived(destinations); + }); + + public static void sendPatternDestination(ServerPlayer player, PatternContainerGroup[] destinations) { + SEND_PATTERN_DESTINATION_S2C.send(buf -> { + buf.writeVarInt(destinations.length); + for (var dest : destinations) { + dest.writeToPacket(buf); + } + }, player); + } + + public static class Client { + + public static void orderItem(KeyCounter whatToCraft, long initialAmount) { + ORDER_ITEM_C2S.send(b -> { + b.writeInt(Minecraft.getInstance().player.containerMenu.containerId); + b.writeVarInt(whatToCraft.size()); + for (var entry : whatToCraft.entrySet()) { + GenericStack.writeBuffer(entry, b); + } + b.writeLong(initialAmount); + }); + } + + public static void patternDestinationReceived(PatternContainerGroup[] destinations) { + if (Minecraft.getInstance().screen instanceof PatternEncodingTermScreen screen) { + var term = (IExtendedPatternEncodingTerm) screen; + var listBox = term.gto$getPatternDestDisplay(); + listBox.reset(); + listBox.setVisible(true); + listBox.setX(200); + listBox.setY(screen.getYSize() - 100); + for (int i = 0; i < destinations.length; i++) { + var dest = destinations[i]; + listBox.addPatternContainerGroup(dest, i); + } + } + } + } } diff --git a/src/main/java/com/gtocore/client/forge/DebugScreenInspector.java b/src/main/java/com/gtocore/client/forge/DebugScreenInspector.java index b633d7bba..15424920b 100644 --- a/src/main/java/com/gtocore/client/forge/DebugScreenInspector.java +++ b/src/main/java/com/gtocore/client/forge/DebugScreenInspector.java @@ -139,7 +139,7 @@ public static void onGuiRender(ScreenEvent.Render.Post event) { @SubscribeEvent public static void onKeyDown(ScreenEvent.KeyPressed.Pre event) { if (Mods.SFM.isLoaded()) return; // Skip if SFM is loaded, as it handles the hotkey itself - if (!GTOConfig.INSTANCE.dev) return; // Only enable in dev mode + if (!GTOConfig.INSTANCE.devMode.dev) return; // Only enable in dev mode // Handle Ctrl+I hotkey to toggle overlay var toggleKey = KeyBind.debugInspectKey; var toggleKeyPressed = toggleKey.isActiveAndMatches(InputConstants.Type.KEYSYM.getOrCreate(event.getKeyCode())); diff --git a/src/main/java/com/gtocore/client/forge/GTOComponentHandler.kt b/src/main/java/com/gtocore/client/forge/GTOComponentHandler.kt index 623703fb5..26348ee40 100644 --- a/src/main/java/com/gtocore/client/forge/GTOComponentHandler.kt +++ b/src/main/java/com/gtocore/client/forge/GTOComponentHandler.kt @@ -2,19 +2,10 @@ package com.gtocore.client.forge import com.gtocore.api.gui.graphic.GTOToolTipComponent import com.gtocore.api.gui.graphic.GTOTooltipComponentItem -import com.gtocore.api.gui.graphic.impl.GTOComponentTooltipComponent import com.gtocore.api.gui.graphic.impl.GTOProgressToolTipComponent import com.gtocore.api.gui.graphic.impl.toPercentageWith -import com.gtocore.api.lang.ComponentSupplier -import com.gtocore.api.lang.toLiteralSupplier -import com.gtocore.client.forge.GTOComponentHandler.englishLanguage -import com.gtocore.config.GTOConfig -import net.minecraft.client.Minecraft -import net.minecraft.client.resources.language.ClientLanguage -import net.minecraft.client.resources.language.I18n import net.minecraft.network.chat.Component -import net.minecraft.world.item.ItemStack import net.minecraftforge.api.distmarker.Dist import net.minecraftforge.api.distmarker.OnlyIn import net.minecraftforge.client.event.RenderTooltipEvent @@ -24,15 +15,8 @@ import net.minecraftforge.eventbus.api.SubscribeEvent import appeng.api.storage.StorageCells import appeng.api.storage.cells.IBasicCellItem import appeng.me.cells.BasicCellHandler -import com.google.common.collect.Lists -import com.gregtechceu.gtceu.api.item.GTBucketItem -import com.gregtechceu.gtceu.api.item.TagPrefixItem -import com.gregtechceu.gtceu.api.item.tool.GTToolItem -import com.gtolib.GTOCore import com.mojang.datafixers.util.Either -import java.util.Optional - @OnlyIn(Dist.CLIENT) object GTOComponentHandler { @SubscribeEvent(priority = EventPriority.LOWEST) @@ -84,71 +68,8 @@ object GTOComponentHandler { ) } } - // 英文翻译,优先级为0,英文环境不启用 - run { - val componentSupplier = getEnglishName(itemStack) ?: return@run - components.add( - GTOComponentTooltipComponent(componentSupplier.get()), - ) - } components.sortedBy { -it.priority }.forEach { event.tooltipElements.add(Either.right(it)) } } - var englishLanguage: ClientLanguage? = null - init { - // 初始化英语语言 - if (GTOConfig.INSTANCE.showEnglishName) { - run { - val manager = Minecraft.getInstance().languageManager - val list: MutableList = Lists.newArrayList("en_us") - val englishInfo = manager.getLanguage("en_us") - if (englishInfo != null) { - englishLanguage = ClientLanguage.loadFrom( - Minecraft.getInstance().resourceManager, - list, - englishInfo.bidirectional(), - ) - } else { - GTOCore.LOGGER.warn("Failed to load English language for GTOCore.") - } - } - } - } } - -private fun getEnglishName(itemStack: ItemStack): ComponentSupplier? { - if (!GTOConfig.INSTANCE.showEnglishName) return null - val englishName = englishLanguage?.getOrDefault(itemStack.descriptionId) ?: return null - if (I18n.get(itemStack.descriptionId) == englishName) return null - val item = itemStack.item - val componentSupplier: ComponentSupplier = when { - itemStack.isEmpty -> return null - item is TagPrefixItem -> { - val tagPrefix = item.tagPrefix - val material = item.material - val format = englishLanguage?.getOrDefault(tagPrefix.unlocalizedName)?.format(englishLanguage?.getOrDefault(material.unlocalizedName)) - if (format?.contains("%s") == true) return null - format.toLiteralSupplier() - } - item is GTToolItem -> { - val toolType = item.toolType - val material = item.material - if (toolType == null || material == null) return null - val format = englishLanguage?.getOrDefault(toolType.unlocalizedName)?.format(englishLanguage?.getOrDefault(material.unlocalizedName)) - if (format?.contains("%s") == true) return null - format.toLiteralSupplier() - } - item is GTBucketItem -> { - return null - } - else -> englishLanguage?.getOrDefault(itemStack.descriptionId).toLiteralSupplier() - }.gray() - if (componentSupplier.get().string.contains("%s")) return null - return componentSupplier -} - -/** - * for java code usage - */ -fun getEnglish(itemStack: ItemStack): Optional = Optional.ofNullable(getEnglishName(itemStack)?.get()) diff --git a/src/main/java/com/gtocore/client/gui/PatternPreview.java b/src/main/java/com/gtocore/client/gui/PatternPreview.java index 0aa5f5d76..865956b8e 100644 --- a/src/main/java/com/gtocore/client/gui/PatternPreview.java +++ b/src/main/java/com/gtocore/client/gui/PatternPreview.java @@ -1,7 +1,5 @@ package com.gtocore.client.gui; -import com.gtocore.client.forge.GTOComponentHandlerKt; -import com.gtocore.config.GTOConfig; import com.gtocore.integration.emi.multipage.MultiblockInfoEmiRecipe; import com.gtolib.api.gui.PatternSlotWidget; @@ -270,17 +268,7 @@ private void setPage() { } slotWidgets = new PatternSlotWidget[itemList.size()]; for (int i = 0; i < slotWidgets.length; i++) { - slotWidgets[i] = new PatternSlotWidget(new ItemHandlerModifiable(itemList.get(i)), i, 4 + i * 18, 0) { - - @Override - public List getFullTooltipTexts() { - if (this.slotReference == null || !GTOConfig.INSTANCE.showEnglishName) return super.getFullTooltipTexts(); - var stack = this.slotReference.getItem(); - var tooltips = new ArrayList<>(super.getFullTooltipTexts()); - GTOComponentHandlerKt.getEnglish(stack).ifPresent(tooltips::add); - return tooltips; - } - }; + slotWidgets[i] = new PatternSlotWidget(new ItemHandlerModifiable(itemList.get(i)), i, 4 + i * 18, 0); scrollableWidgetGroup.addWidget(slotWidgets[i]); } } diff --git a/src/main/java/com/gtocore/client/hud/WirelessEnergyHUD.java b/src/main/java/com/gtocore/client/hud/WirelessEnergyHUD.java index dbd040cc3..c07a41f96 100644 --- a/src/main/java/com/gtocore/client/hud/WirelessEnergyHUD.java +++ b/src/main/java/com/gtocore/client/hud/WirelessEnergyHUD.java @@ -89,7 +89,7 @@ public void renderGeneral(GuiGraphics guiGraphics, float partialTick, int screen .height(height) .backgroundColor(0x8a404040) .borderColor(0x8a000000) - .lineColor(0xbb000000 | Color.decode(GTOConfig.INSTANCE.hud.wirelessEnergyHUDLineColor).getRGB()) + .lineColor(0xbb000000 | Color.decode(GTOConfig.INSTANCE.client.hud.wirelessEnergyHUDLineColor).getRGB()) .drawAreaFill(true) .areaFillColor(0x402ECC71) .drawAreaFill(false) @@ -104,8 +104,8 @@ public void renderGeneral(GuiGraphics guiGraphics, float partialTick, int screen @Override public Rect2i getBounds(int screenWidth, int screenHeight) { - int absX = (int) (GTOConfig.INSTANCE.hud.wirelessEnergyHUDDefaultX / 100d * (screenWidth - realWidth)); - int absY = (int) (GTOConfig.INSTANCE.hud.wirelessEnergyHUDDefaultY / 100d * (screenHeight - realHeight)); + int absX = (int) (GTOConfig.INSTANCE.client.hud.wirelessEnergyHUDDefaultX / 100d * (screenWidth - realWidth)); + int absY = (int) (GTOConfig.INSTANCE.client.hud.wirelessEnergyHUDDefaultY / 100d * (screenHeight - realHeight)); return new Rect2i(absX, absY, realWidth, realHeight); } @@ -142,9 +142,9 @@ public boolean mouseReleased(double mouseX, double mouseY, int button) { int newY = bounds.getY() + pendingMovedY; GTOConfig.set("wirelessEnergyHUDDefaultX", (int) Mth.clamp((newX * 100d) / (screenWidth - realWidth), - 0, 100), "hud"); + 0, 100), "client", "hud"); GTOConfig.set("wirelessEnergyHUDDefaultY", (int) Mth.clamp((newY * 100d) / (screenHeight - realHeight), - 0, 100), "hud"); + 0, 100), "client", "hud"); pendingMovedX = 0; pendingMovedY = 0; @@ -156,11 +156,11 @@ public boolean mouseReleased(double mouseX, double mouseY, int button) { @Override public void toggleEnabled() { - GTOConfig.set("wirelessEnergyHUDEnabled", !GTOConfig.INSTANCE.hud.wirelessEnergyHUDEnabled, "hud"); + GTOConfig.set("wirelessEnergyHUDEnabled", !GTOConfig.INSTANCE.client.hud.wirelessEnergyHUDEnabled, "client", "hud"); } @Override public boolean isEnabled() { - return GTOConfig.INSTANCE.hud.wirelessEnergyHUDEnabled; + return GTOConfig.INSTANCE.client.hud.wirelessEnergyHUDEnabled; } } diff --git a/src/main/java/com/gtocore/client/renderer/machine/MonitorRenderer.java b/src/main/java/com/gtocore/client/renderer/machine/MonitorRenderer.java index 59f31e6bf..14479ca92 100644 --- a/src/main/java/com/gtocore/client/renderer/machine/MonitorRenderer.java +++ b/src/main/java/com/gtocore/client/renderer/machine/MonitorRenderer.java @@ -133,7 +133,7 @@ public void render(BlockEntity blockEntity, float partialTicks, PoseStack stack, stack.pushPose(); var pos = monitor.getPos(); - if (GTOConfig.INSTANCE.dev) { + if (GTOConfig.INSTANCE.devMode.dev) { var box = Shapes.create(network.aabb()); LevelRenderer.renderVoxelShape(stack, buffer.getBuffer(RenderType.lines()), box, -pos.getX(), -pos.getY(), -pos.getZ(), 0f, 1f, 0f, 1f, false); } @@ -169,7 +169,7 @@ public void render(BlockEntity blockEntity, float partialTicks, PoseStack stack, int cumulatedHeight = 0; int lastLineX = 0; for (IDisplayComponent iDisplayComponent : info) { - if (GTOConfig.INSTANCE.dev) { + if (GTOConfig.INSTANCE.devMode.dev) { LevelRenderer.renderLineBox(stack, buffer.getBuffer(RenderType.lines()), 0, cumulatedHeight, 0, iDisplayComponent.getVisualWidth(), cumulatedHeight + iDisplayComponent.getVisualHeight(), 0, 0f, 1f, 0f, 1f); diff --git a/src/main/java/com/gtocore/common/CommonProxy.java b/src/main/java/com/gtocore/common/CommonProxy.java index ccd972a1d..7c18a9820 100644 --- a/src/main/java/com/gtocore/common/CommonProxy.java +++ b/src/main/java/com/gtocore/common/CommonProxy.java @@ -22,6 +22,7 @@ import com.gtocore.eio_travel.implementations.AnchorTravelTarget; import com.gtocore.eio_travel.implementations.PatternTravelTarget; import com.gtocore.integration.Mods; +import com.gtocore.integration.ae.PatternContentAccessTerminalMenu; import com.gtocore.integration.construction_wand.ConstructionWandRegistrar; import com.gtocore.integration.ftbquests.EMIRecipeModHelper; import com.gtocore.integration.ftbquests.GTOQuestTypes; @@ -176,7 +177,7 @@ private static void commonSetup(FMLCommonSetupEvent event) { public static void afterStartup() { ScanningClass.VALUES = null; ModList.get().getAllScanData().clear(); - if (GTOConfig.INSTANCE.startSpark == SparkRange.MAIN_MENU) { + if (GTOConfig.INSTANCE.devMode.startSpark == SparkRange.MAIN_MENU) { SparkLaunchProfiler.stop("all"); } } @@ -197,6 +198,7 @@ private static void initMenu(RegisterEvent event) { // Initialize the menu registry if (event.getRegistryKey() == Registries.MENU) { Registry.>register(BuiltInRegistries.MENU, GTOCore.id("me2in1").toString(), Me2in1Menu.TYPE); + Registry.>register(BuiltInRegistries.MENU, GTOCore.id("pattern_content_access_terminal").toString(), PatternContentAccessTerminalMenu.TYPE); Registry.>register(BuiltInRegistries.MENU, GTOCore.id("me2in1wireless").toString(), Wireless.TYPE); Registry.>register(BuiltInRegistries.MENU, GTOCore.id("category_mapping_sub_menu").toString(), CategoryMappingSubMenu.TYPE); } diff --git a/src/main/java/com/gtocore/common/block/FusionCasings.java b/src/main/java/com/gtocore/common/block/FusionCasings.java index d1560abb2..68e153aa3 100644 --- a/src/main/java/com/gtocore/common/block/FusionCasings.java +++ b/src/main/java/com/gtocore/common/block/FusionCasings.java @@ -1,12 +1,12 @@ package com.gtocore.common.block; +import com.gtocore.api.pattern.GTOPredicates; import com.gtocore.common.data.GTOBlocks; import com.gtolib.GTOCore; import com.gregtechceu.gtceu.api.block.IFusionCasingType; -import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; -import com.gregtechceu.gtceu.api.data.tag.TagPrefix; +import com.gregtechceu.gtceu.api.pattern.TraceabilityPredicate; import com.gregtechceu.gtceu.common.block.FusionCasingBlock; import com.gregtechceu.gtceu.common.data.GTMaterials; @@ -38,13 +38,13 @@ public static Block getCoilState(int tier) { return tier == UHV ? GTOBlocks.ADVANCED_FUSION_COIL.get() : GTOBlocks.FUSION_COIL_MK2.get(); } - public static Block getFrameState(int tier) { + public static TraceabilityPredicate getFrameState(int tier) { return switch (tier) { - case LuV -> ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.NaquadahAlloy); - case ZPM -> ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Duranium); - case UV -> ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Naquadria); - case UHV -> ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Trinium); - default -> ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Neutronium); + case LuV -> GTOPredicates.frame(GTMaterials.NaquadahAlloy); + case ZPM -> GTOPredicates.frame(GTMaterials.Duranium); + case UV -> GTOPredicates.frame(GTMaterials.Naquadria); + case UHV -> GTOPredicates.frame(GTMaterials.Trinium); + default -> GTOPredicates.frame(GTMaterials.Neutronium); }; } diff --git a/src/main/java/com/gtocore/common/block/GlowingBlock.java b/src/main/java/com/gtocore/common/block/GlowingBlock.java index 2d8e6d57b..8a8e96a79 100644 --- a/src/main/java/com/gtocore/common/block/GlowingBlock.java +++ b/src/main/java/com/gtocore/common/block/GlowingBlock.java @@ -43,7 +43,7 @@ private static int validateLightLevel(int level) { return level; } - static String[] num = { "Ⅰ", "Ⅱ", "Ⅲ", "Ⅳ", "Ⅴ", "Ⅵ", "Ⅶ", "Ⅷ", "Ⅸ", "Ⅹ", "Ⅺ", "Ⅻ" }; + static String[] num = { "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII" }; public static BlockEntry[] createStarStone() { BlockEntry[] StarStone = new BlockEntry[num.length]; diff --git a/src/main/java/com/gtocore/common/data/GTOAEParts.kt b/src/main/java/com/gtocore/common/data/GTOAEParts.kt index 6a269a748..1f46aa48a 100644 --- a/src/main/java/com/gtocore/common/data/GTOAEParts.kt +++ b/src/main/java/com/gtocore/common/data/GTOAEParts.kt @@ -1,6 +1,7 @@ package com.gtocore.common.data import com.gtocore.integration.ae.ExchangeStorageMonitorPart +import com.gtocore.integration.ae.PatternContentAccessTerminalPart import com.gtocore.integration.ae.SimpleCraftingTerminal import net.minecraft.network.chat.Component @@ -66,6 +67,19 @@ object GTOAEParts { ), ) + val Pattern_Content_Access_Terminal: Supplier>> = createPart( + id = "pattern_content_access_terminal", + en = "Pattern Content Access Terminal", + cn = "样板内容管理终端", + partClass = PatternContentAccessTerminalPart::class.java, + factory = ::PatternContentAccessTerminalPart, + tooltips = ComponentBuilder.create("动态替换样板内容", "Dynamic Pattern Content Replacement") { p -> p.setAqua() } + .addCommentLines("只需要将此机器连入ME网络,然后样板在被调用时,其内容就会按照你配置的优先级被同一行匹配替换。", "Simply connect this machine to the ME network, and when a pattern is called, its content will be replaced according to your configured priorities on the same line.") { p -> p.setGray() } + .addCommentLines("每组配置中,替换的顺序为从右到左。", "In each configuration group, the replacement order is from right to left.") { p -> p.setGray() } + .addCommentLines("例如,按顺序填入“橡木木板,白桦木板,云杉木板”的配置,那么当有样板原料中用到白桦或云杉木板时,就会动态修改样板,使用橡木木板作为原料。", "For example, if you fill in the configuration with 'Oak Planks, Birch Planks, Spruce Planks' in order, then when a pattern's ingredient uses Birch or Spruce Planks, the pattern will be dynamically modified to use Oak Planks as the ingredient.") { p -> p.setGray().setItalic() } + .buildComponents(), + ) + private fun createPart(id: String, en: String, cn: String, partClass: Class, factory: Function, T>, tooltips: List = listOf()): Supplier>> { PartModels.registerModels(PartModelsHelper.createModels(partClass)) val function: (Item.Properties) -> PartItem = { p -> PartItem(p, partClass, factory) } diff --git a/src/main/java/com/gtocore/common/data/GTOBlocks.java b/src/main/java/com/gtocore/common/data/GTOBlocks.java index c3acfece8..b77d91210 100644 --- a/src/main/java/com/gtocore/common/data/GTOBlocks.java +++ b/src/main/java/com/gtocore/common/data/GTOBlocks.java @@ -223,29 +223,29 @@ public static void init() { public static final BlockEntry T4_CRAFTING_STORAGE_CORE = createCraftingStorageCore(4); public static final BlockEntry T5_CRAFTING_STORAGE_CORE = createCraftingStorageCore(5); - public static final BlockEntry ENERGY_CONTROL_CASING_MK1 = createCasingBlock("energy_control_casing_mk1", "能量控制方块 MK-I", NonNullBiConsumer.noop(), Block::new, () -> Blocks.IRON_BLOCK, + public static final BlockEntry ENERGY_CONTROL_CASING_MK1 = createCasingBlock("energy_control_casing_mk1", "Energy Control Casing MK I", "能量控制方块 MK I", NonNullBiConsumer.noop(), Block::new, () -> Blocks.IRON_BLOCK, () -> RenderType::cutoutMipped); - public static final BlockEntry ENERGY_CONTROL_CASING_MK2 = createCasingBlock("energy_control_casing_mk2", "能量控制方块 MK-II", NonNullBiConsumer.noop(), Block::new, () -> Blocks.IRON_BLOCK, + public static final BlockEntry ENERGY_CONTROL_CASING_MK2 = createCasingBlock("energy_control_casing_mk2", "Energy Control Casing MK II", "能量控制方块 MK II", NonNullBiConsumer.noop(), Block::new, () -> Blocks.IRON_BLOCK, () -> RenderType::cutoutMipped); - public static final BlockEntry ENERGY_CONTROL_CASING_MK3 = createCasingBlock("energy_control_casing_mk3", "能量控制方块 MK-III", NonNullBiConsumer.noop(), Block::new, () -> Blocks.IRON_BLOCK, + public static final BlockEntry ENERGY_CONTROL_CASING_MK3 = createCasingBlock("energy_control_casing_mk3", "Energy Control Casing MK III", "能量控制方块 MK III", NonNullBiConsumer.noop(), Block::new, () -> Blocks.IRON_BLOCK, () -> RenderType::cutoutMipped); - public static final BlockEntry MACHINING_CONTROL_CASING_MK1 = createCasingBlock("machining_control_casing_mk1", "运行控制方块 MK-I", NonNullBiConsumer.noop(), Block::new, () -> Blocks.IRON_BLOCK, + public static final BlockEntry MACHINING_CONTROL_CASING_MK1 = createCasingBlock("machining_control_casing_mk1", "Machining Control Casing MK I", "运行控制方块 MK I", NonNullBiConsumer.noop(), Block::new, () -> Blocks.IRON_BLOCK, () -> RenderType::cutoutMipped); - public static final BlockEntry MACHINING_CONTROL_CASING_MK2 = createCasingBlock("machining_control_casing_mk2", "运行控制方块 MK-II", NonNullBiConsumer.noop(), Block::new, () -> Blocks.IRON_BLOCK, + public static final BlockEntry MACHINING_CONTROL_CASING_MK2 = createCasingBlock("machining_control_casing_mk2", "Machining Control Casing MK II", "运行控制方块 MK II", NonNullBiConsumer.noop(), Block::new, () -> Blocks.IRON_BLOCK, () -> RenderType::cutoutMipped); - public static final BlockEntry MACHINING_CONTROL_CASING_MK3 = createCasingBlock("machining_control_casing_mk3", "运行控制方块 MK-III", NonNullBiConsumer.noop(), Block::new, () -> Blocks.IRON_BLOCK, + public static final BlockEntry MACHINING_CONTROL_CASING_MK3 = createCasingBlock("machining_control_casing_mk3", "Machining Control Casing MK III", "运行控制方块 MK III", NonNullBiConsumer.noop(), Block::new, () -> Blocks.IRON_BLOCK, () -> RenderType::cutoutMipped); - public static final BlockEntry FUSION_CASING_MK4 = createCasingBlock("fusion_casing_mk4", "聚变机械方块 MK-IV", GTOCore.id("block/casings/fusion/fusion_casing_mk4")); - public static final BlockEntry FUSION_CASING_MK5 = createCasingBlock("fusion_casing_mk5", "聚变机械方块 MK-V", GTOCore.id("block/casings/fusion/fusion_casing_mk5")); + public static final BlockEntry FUSION_CASING_MK4 = createCasingBlock("fusion_casing_mk4", "Fusion Casing MK IV", "聚变机械方块 MK IV", GTOCore.id("block/casings/fusion/fusion_casing_mk4")); + public static final BlockEntry FUSION_CASING_MK5 = createCasingBlock("fusion_casing_mk5", "Fusion Casing MK V", "聚变机械方块 MK V", GTOCore.id("block/casings/fusion/fusion_casing_mk5")); public static final BlockEntry ADVANCED_FUSION_COIL = createActiveCasing("advanced_fusion_coil", "进阶聚变线圈方块", "block/variant/advanced_fusion_coil"); - public static final BlockEntry FUSION_COIL_MK2 = createActiveCasing("fusion_coil_mk2", "聚变线圈方块MK-II", "block/variant/fusion_coil_mk2"); + public static final BlockEntry FUSION_COIL_MK2 = createActiveCasing("fusion_coil_mk2", "Fusion Coil MK II", "聚变线圈方块 MK II", "block/variant/fusion_coil_mk2"); public static final BlockEntry IMPROVED_SUPERCONDUCTOR_COIL = createActiveCasing("improved_superconductor_coil", "改良型超导线圈方块", "block/variant/improved_superconductor_coil"); public static final BlockEntry COMPRESSED_FUSION_COIL = createActiveCasing("compressed_fusion_coil", "压缩聚变线圈方块", "block/variant/compressed_fusion_coil"); public static final BlockEntry ADVANCED_COMPRESSED_FUSION_COIL = createActiveCasing("advanced_compressed_fusion_coil", "进阶压缩聚变线圈方块", "block/variant/advanced_compressed_fusion_coil"); - public static final BlockEntry COMPRESSED_FUSION_COIL_MK2_PROTOTYPE = createActiveCasing("compressed_fusion_coil_mk2_prototype", "压缩聚变线圈方块MK-II原型", "block/variant/compressed_fusion_coil_mk2_prototype"); - public static final BlockEntry COMPRESSED_FUSION_COIL_MK2 = createActiveCasing("compressed_fusion_coil_mk2", "压缩聚变线圈方块MK-II", "block/variant/compressed_fusion_coil_mk2"); + public static final BlockEntry COMPRESSED_FUSION_COIL_MK2_PROTOTYPE = createActiveCasing("compressed_fusion_coil_mk2_prototype", "Compressed Fusion Coil MK II Prototype", "压缩聚变线圈方块 MK II 原型", "block/variant/compressed_fusion_coil_mk2_prototype"); + public static final BlockEntry COMPRESSED_FUSION_COIL_MK2 = createActiveCasing("compressed_fusion_coil_mk2", "Compressed Fusion Coil MK II", "压缩聚变线圈方块 MK II", "block/variant/compressed_fusion_coil_mk2"); public static final BlockEntry SPACE_ELEVATOR_SUPPORT = createActiveCasing("space_elevator_support", "太空电梯支撑结构", "block/variant/space_elevator_support"); public static final BlockEntry SPACE_ELEVATOR_POWER_CORE = createActiveCasing("space_elevator_power_core", "太空电梯动力核心", "block/variant/space_elevator_power_core"); @@ -301,11 +301,11 @@ public static void init() { public static final BlockEntry MEDIAL_GRAVITON_FLOW_MODULATOR = createTierCasings("medial_graviton_flow_modulator", "中介引力流调节器", GTOCore.id("block/medial_graviton_flow_modulator"), GRAVITONFLOWMAP, 2); public static final BlockEntry CENTRAL_GRAVITON_FLOW_MODULATOR = createTierCasings("central_graviton_flow_modulator", "中心引力流调节器", GTOCore.id("block/central_graviton_flow_modulator"), GRAVITONFLOWMAP, 3); - public static final BlockEntry SPACE_ELEVATOR_POWER_MODULE_1 = createActiveTierCasing("space_elevator_power_module_1", "太空电梯动力模块MK1", "block/variant/space_elevator_power_module_1", SEPMMAP, 1); - public static final BlockEntry SPACE_ELEVATOR_POWER_MODULE_2 = createActiveTierCasing("space_elevator_power_module_2", "太空电梯动力模块MK2", "block/variant/space_elevator_power_module_2", SEPMMAP, 2); - public static final BlockEntry SPACE_ELEVATOR_POWER_MODULE_3 = createActiveTierCasing("space_elevator_power_module_3", "太空电梯动力模块MK3", "block/variant/space_elevator_power_module_3", SEPMMAP, 3); - public static final BlockEntry SPACE_ELEVATOR_POWER_MODULE_4 = createActiveTierCasing("space_elevator_power_module_4", "太空电梯动力模块MK4", "block/variant/space_elevator_power_module_4", SEPMMAP, 4); - public static final BlockEntry SPACE_ELEVATOR_POWER_MODULE_5 = createActiveTierCasing("space_elevator_power_module_5", "太空电梯动力模块MK5", "block/variant/space_elevator_power_module_5", SEPMMAP, 5); + public static final BlockEntry SPACE_ELEVATOR_POWER_MODULE_1 = createActiveTierCasing("space_elevator_power_module_1", "Space Elevator Power Module MK I", "太空电梯动力模块 MK I", "block/variant/space_elevator_power_module_1", SEPMMAP, 1); + public static final BlockEntry SPACE_ELEVATOR_POWER_MODULE_2 = createActiveTierCasing("space_elevator_power_module_2", "Space Elevator Power Module MK II", "太空电梯动力模块 MK II", "block/variant/space_elevator_power_module_2", SEPMMAP, 2); + public static final BlockEntry SPACE_ELEVATOR_POWER_MODULE_3 = createActiveTierCasing("space_elevator_power_module_3", "Space Elevator Power Module MK III", "太空电梯动力模块 MK III", "block/variant/space_elevator_power_module_3", SEPMMAP, 3); + public static final BlockEntry SPACE_ELEVATOR_POWER_MODULE_4 = createActiveTierCasing("space_elevator_power_module_4", "Space Elevator Power Module MK IV", "太空电梯动力模块 MK IV", "block/variant/space_elevator_power_module_4", SEPMMAP, 4); + public static final BlockEntry SPACE_ELEVATOR_POWER_MODULE_5 = createActiveTierCasing("space_elevator_power_module_5", "Space Elevator Power Module MK V", "太空电梯动力模块 MK V", "block/variant/space_elevator_power_module_5", SEPMMAP, 5); public static final BlockEntry BOROSILICATE_GLASS = createTierGlassCasings("borosilicate_glass", "硼硅玻璃", GTOCore.id("block/casings/borosilicate_glass"), GTValues.HV); public static final BlockEntry TITANIUM_BOROSILICATE_GLASS = createTierGlassCasings("titanium_borosilicate_glass", "钛强化硼玻璃", GTOCore.id("block/casings/titanium_borosilicate_glass"), GTValues.EV); @@ -565,7 +565,7 @@ public static void init() { // 耐压壳机械方块 public static final BlockEntry PRESSURE_RESISTANT_HOUSING_MECHANICAL_BLOCK = createCasingBlock("pressure_resistant_housing_mechanical_block", "耐压壳机械方块", GTOCore.id("block/casings/pressure_resistant_housing_mechanical_block")); // 钛合金内部框架 - public static final BlockEntry TITANIUM_ALLOY_INTERNAL_FRAME = createCasingBlock("titanium_alloy_frame_internal", "钛合金内部框架", GTOCore.id("block/casings/titanium_alloy_internal_frame")); + public static final BlockEntry TITANIUM_ALLOY_FRAME_INTERNAL = createCasingBlock("titanium_alloy_frame_internal", "钛合金内部框架", GTOCore.id("block/casings/titanium_alloy_internal_frame")); // 航天器密封机械方块 public static final BlockEntry SPACECRAFT_SEALING_MECHANICAL_BLOCK = createCasingBlock("spacecraft_sealing_casing", "航天器密封机械方块", GTOCore.id("block/casings/spacecraft_sealing_casing")); // 钨合金抗冲击机械方块 diff --git a/src/main/java/com/gtocore/common/data/GTOItems.java b/src/main/java/com/gtocore/common/data/GTOItems.java index b8f461bd8..4e7a9aa8e 100644 --- a/src/main/java/com/gtocore/common/data/GTOItems.java +++ b/src/main/java/com/gtocore/common/data/GTOItems.java @@ -77,7 +77,7 @@ public static void init() { GTMaterials.Hydrogen.getProperty(PropertyKey.FLUID).getStorage().store(FluidStorageKeys.GAS, ModFluids.HYDROGEN, null); GTFluids.handleNonMaterialFluids(GTMaterials.Oil, ModFluids.OIL); - if (GTOConfig.INSTANCE.enableCustomRecipes || GTCEu.isDev()) { + if (GTOConfig.INSTANCE.devMode.enableCustomRecipes || GTCEu.isDev()) { item("recipe_editor", "配方编辑器", ComponentItem::create) .properties(p -> p.stacksTo(1)) .onRegister(attach(RecipeEditorBehavior.INSTANCE)) @@ -120,6 +120,11 @@ public static void init() { .onRegister(attach(OrderItem.INSTANCE)) .onRegister(attachRenderer(() -> OrderItemProviderRenderer.INSTANCE)) .register(); + public static final ItemEntry TEMP_ORDER = item("temporary_order", "%s 临时订单", ComponentItem::create) + .toolTips(GTOItemTooltips.INSTANCE.getOrderTooltips().getArray()) + .onRegister(attach(OrderItem.INSTANCE)) + .onRegister(attachRenderer(() -> OrderItemProviderRenderer.INSTANCE)) + .register(); public static final ItemEntry REALLY_MAX_BATTERY = item("really_max_battery", "真·终极电池", ComponentItem::create) .lang("Really MAX Battery") .onRegister(attach(new TooltipBehavior(lines -> lines.add(Component.translatable("gtocore.tooltip.item.really_max_battery").withStyle(ChatFormatting.GRAY))))) @@ -405,17 +410,17 @@ public static void init() { .onRegister(attach(new DataItemBehavior(true))) .register(); - public static final ItemEntry DATA_CRYSTAL_COMPONENT_MK1 = register("data_crystal_component_mk1", "数据晶片组件 mk1"); - public static final ItemEntry DATA_CRYSTAL_COMPONENT_MK2 = register("data_crystal_component_mk2", "数据晶片组件 mk2"); - public static final ItemEntry DATA_CRYSTAL_COMPONENT_MK3 = register("data_crystal_component_mk3", "数据晶片组件 mk3"); - public static final ItemEntry DATA_CRYSTAL_COMPONENT_MK4 = register("data_crystal_component_mk4", "数据晶片组件 mk4"); - public static final ItemEntry DATA_CRYSTAL_COMPONENT_MK5 = register("data_crystal_component_mk5", "数据晶片组件 mk5"); + public static final ItemEntry DATA_CRYSTAL_COMPONENT_MK1 = registerLang("data_crystal_component_mk1", "Data Crystal Component MK I", "数据晶片组件 MK I"); + public static final ItemEntry DATA_CRYSTAL_COMPONENT_MK2 = registerLang("data_crystal_component_mk2", "Data Crystal Component MK II", "数据晶片组件 MK II"); + public static final ItemEntry DATA_CRYSTAL_COMPONENT_MK3 = registerLang("data_crystal_component_mk3", "Data Crystal Component MK III", "数据晶片组件 MK III"); + public static final ItemEntry DATA_CRYSTAL_COMPONENT_MK4 = registerLang("data_crystal_component_mk4", "Data Crystal Component MK IV", "数据晶片组件 MK IV"); + public static final ItemEntry DATA_CRYSTAL_COMPONENT_MK5 = registerLang("data_crystal_component_mk5", "Data Crystal Component MK V", "数据晶片组件 MK V"); - public static final ItemEntry DATA_CRYSTAL_MK1 = item("data_crystal_mk1", "数据晶片 mk1", DataCrystalItem::new).register(); - public static final ItemEntry DATA_CRYSTAL_MK2 = item("data_crystal_mk2", "数据晶片 mk2", DataCrystalItem::new).register(); - public static final ItemEntry DATA_CRYSTAL_MK3 = item("data_crystal_mk3", "数据晶片 mk3", DataCrystalItem::new).register(); - public static final ItemEntry DATA_CRYSTAL_MK4 = item("data_crystal_mk4", "数据晶片 mk4", DataCrystalItem::new).register(); - public static final ItemEntry DATA_CRYSTAL_MK5 = item("data_crystal_mk5", "数据晶片 mk5", DataCrystalItem::new).register(); + public static final ItemEntry DATA_CRYSTAL_MK1 = item("data_crystal_mk1", "数据晶片 MK I", DataCrystalItem::new).lang("Data Crystal MK I").register(); + public static final ItemEntry DATA_CRYSTAL_MK2 = item("data_crystal_mk2", "数据晶片 MK II", DataCrystalItem::new).lang("Data Crystal MK II").register(); + public static final ItemEntry DATA_CRYSTAL_MK3 = item("data_crystal_mk3", "数据晶片 MK III", DataCrystalItem::new).lang("Data Crystal MK III").register(); + public static final ItemEntry DATA_CRYSTAL_MK4 = item("data_crystal_mk4", "数据晶片 MK IV", DataCrystalItem::new).lang("Data Crystal MK IV").register(); + public static final ItemEntry DATA_CRYSTAL_MK5 = item("data_crystal_mk5", "数据晶片 MK V", DataCrystalItem::new).lang("Data Crystal MK V").register(); public static final ItemEntry WOOD_ROTOR = registerRotor("wood_kinetic_rotor", "木", 2400, 4, 10, 0); public static final ItemEntry IRON_ROTOR = registerRotor("iron_kinetic_rotor", "铁", 14000, 10, 20, 1); @@ -514,12 +519,12 @@ public static void init() { public static final ItemEntry OPV_VOLTAGE_COIL = registerLang("opv_voltage_coil", "OpV Voltage Coil", "过载压线圈"); public static final ItemEntry MAX_VOLTAGE_COIL = registerLang("max_voltage_coil", "MAX Voltage Coil", "上限压线圈"); - public static final ItemEntry SPACE_DRONE_MK1 = registerLang("space_drone_mk1", "Space Drone MKⅠ", "太空无人机MKⅠ"); - public static final ItemEntry SPACE_DRONE_MK2 = registerLang("space_drone_mk2", "Space Drone MKⅡ", "太空无人机MKⅡ"); - public static final ItemEntry SPACE_DRONE_MK3 = registerLang("space_drone_mk3", "Space Drone MKⅢ", "太空无人机MKⅢ"); - public static final ItemEntry SPACE_DRONE_MK4 = registerLang("space_drone_mk4", "Space Drone MKⅣ", "太空无人机MKⅣ"); - public static final ItemEntry SPACE_DRONE_MK5 = registerLang("space_drone_mk5", "Space Drone MKⅤ", "太空无人机MKⅤ"); - public static final ItemEntry SPACE_DRONE_MK6 = registerLang("space_drone_mk6", "Space Drone MKⅥ", "太空无人机MKⅥ"); + public static final ItemEntry SPACE_DRONE_MK1 = registerLang("space_drone_mk1", "Space Drone MK I", "太空无人机 MK I"); + public static final ItemEntry SPACE_DRONE_MK2 = registerLang("space_drone_mk2", "Space Drone MK II", "太空无人机 MK II"); + public static final ItemEntry SPACE_DRONE_MK3 = registerLang("space_drone_mk3", "Space Drone MK III", "太空无人机 MK III"); + public static final ItemEntry SPACE_DRONE_MK4 = registerLang("space_drone_mk4", "Space Drone MK IV", "太空无人机 MK IV"); + public static final ItemEntry SPACE_DRONE_MK5 = registerLang("space_drone_mk5", "Space Drone MK V", "太空无人机 MK V"); + public static final ItemEntry SPACE_DRONE_MK6 = registerLang("space_drone_mk6", "Space Drone MK VI", "太空无人机 MK VI"); public static ItemEntry NEUTRON_PILE = register("neutron_pile", "中子尘埃"); @@ -641,11 +646,11 @@ public static void init() { public static final ItemEntry ESSENCE_SEED = register("essence_seed", "精华种子"); public static final ItemEntry NUCLEAR_STAR = register("nuclear_star", "核能之星"); public static final ItemEntry UNSTABLE_STAR = register("unstable_star", "易变之星"); - public static final ItemEntry PRECISION_CIRCUIT_ASSEMBLY_ROBOT_MK1 = register("precision_circuit_assembly_robot_mk1", "精密电路装配机器人MKⅠ"); - public static final ItemEntry PRECISION_CIRCUIT_ASSEMBLY_ROBOT_MK2 = register("precision_circuit_assembly_robot_mk2", "精密电路装配机器人MKⅡ"); - public static final ItemEntry PRECISION_CIRCUIT_ASSEMBLY_ROBOT_MK3 = register("precision_circuit_assembly_robot_mk3", "精密电路装配机器人MKⅢ"); - public static final ItemEntry PRECISION_CIRCUIT_ASSEMBLY_ROBOT_MK4 = register("precision_circuit_assembly_robot_mk4", "精密电路装配机器人MKⅣ"); - public static final ItemEntry PRECISION_CIRCUIT_ASSEMBLY_ROBOT_MK5 = register("precision_circuit_assembly_robot_mk5", "精密电路装配机器人MKⅤ"); + public static final ItemEntry PRECISION_CIRCUIT_ASSEMBLY_ROBOT_MK1 = registerLang("precision_circuit_assembly_robot_mk1", "Precision Circuit Assembly Robot MK I", "精密电路装配机器人 MK I"); + public static final ItemEntry PRECISION_CIRCUIT_ASSEMBLY_ROBOT_MK2 = registerLang("precision_circuit_assembly_robot_mk2", "Precision Circuit Assembly Robot MK II", "精密电路装配机器人 MK II"); + public static final ItemEntry PRECISION_CIRCUIT_ASSEMBLY_ROBOT_MK3 = registerLang("precision_circuit_assembly_robot_mk3", "Precision Circuit Assembly Robot MK III", "精密电路装配机器人 MK III"); + public static final ItemEntry PRECISION_CIRCUIT_ASSEMBLY_ROBOT_MK4 = registerLang("precision_circuit_assembly_robot_mk4", "Precision Circuit Assembly Robot MK IV", "精密电路装配机器人 MK IV"); + public static final ItemEntry PRECISION_CIRCUIT_ASSEMBLY_ROBOT_MK5 = registerLang("precision_circuit_assembly_robot_mk5", "Precision Circuit Assembly Robot MK V", "精密电路装配机器人 MK V"); public static final ItemEntry SCRAP = register("scrap", "废料"); public static final ItemEntry SCRAP_BOX = register("scrap_box", "废料盒"); public static final ItemEntry NUCLEAR_WASTE = register("nuclear_waste", "核废料"); @@ -731,9 +736,9 @@ public static void init() { public static final ItemEntry CLOSED_TIMELIKE_CURVE_COMPUTATIONAL_UNIT_CONTAINER = register("closed_timelike_curve_computational_unit_container", "封闭类时曲线计算单元容器"); public static final ItemEntry CLOSED_TIMELIKE_CURVE_COMPUTATIONAL_UNIT = register("closed_timelike_curve_computational_unit", "封闭类时曲线计算单元"); public static final ItemEntry HIGHLY_DENSE_POLYMER_PLATE = register("highly_dense_polymer_plate", "高密度聚合物板"); - public static final ItemEntry SPACE_PROBE_MK1 = register("space_probe_mk1", "宇宙探测器MKⅠ"); - public static final ItemEntry SPACE_PROBE_MK2 = register("space_probe_mk2", "宇宙探测器MKⅡ"); - public static final ItemEntry SPACE_PROBE_MK3 = register("space_probe_mk3", "宇宙探测器MKⅢ"); + public static final ItemEntry SPACE_PROBE_MK1 = registerLang("space_probe_mk1", "Space Probe MK I", "宇宙探测器 MK I"); + public static final ItemEntry SPACE_PROBE_MK2 = registerLang("space_probe_mk2", "Space Probe MK II", "宇宙探测器 MK II"); + public static final ItemEntry SPACE_PROBE_MK3 = registerLang("space_probe_mk3", "Space Probe MK III", "宇宙探测器 MK III"); public static final ItemEntry HYPERCUBE = register("hypercube", "超立方体"); public static final ItemEntry ANNIHILATION_CONSTRAINER = register("annihilation_constrainer", "湮灭约束器"); public static final ItemEntry SOLAR_LIGHT_SPLITTER = register("solar_light_splitter", "阳光分离器"); @@ -805,11 +810,11 @@ public static void init() { public static final ItemEntry GIGA_CHAD = register("giga_chad", "Giga Chad代币"); public static final ItemEntry REACTOR_FUEL_ROD = register("reactor_fuel_rod", "空燃料棒"); public static final ItemEntry TUNGSTEN_CARBIDE_REACTOR_FUEL_ROD = register("tungsten_carbide_reactor_fuel_rod", "空碳化钨燃料棒"); - public static final ItemEntry HUI_CIRCUIT_1 = registerLang("hui_circuit_1", "High Calculation Workstation MK-I", "高算力工作站 MK-I"); - public static final ItemEntry HUI_CIRCUIT_2 = registerLang("hui_circuit_2", "High Calculation Workstation MK-II", "高算力工作站 MK-II"); - public static final ItemEntry HUI_CIRCUIT_3 = registerLang("hui_circuit_3", "High Calculation Workstation MK-III", "高算力工作站 MK-III"); - public static final ItemEntry HUI_CIRCUIT_4 = registerLang("hui_circuit_4", "High Calculation Workstation MK-IV", "高算力工作站 MK-IV"); - public static final ItemEntry HUI_CIRCUIT_5 = registerLang("hui_circuit_5", "High Calculation Workstation MK-V", "高算力工作站 MK-V"); + public static final ItemEntry HUI_CIRCUIT_1 = registerLang("hui_circuit_1", "High Calculation Workstation MK I", "高算力工作站 MK I"); + public static final ItemEntry HUI_CIRCUIT_2 = registerLang("hui_circuit_2", "High Calculation Workstation MK II", "高算力工作站 MK II"); + public static final ItemEntry HUI_CIRCUIT_3 = registerLang("hui_circuit_3", "High Calculation Workstation MK III", "高算力工作站 MK III"); + public static final ItemEntry HUI_CIRCUIT_4 = registerLang("hui_circuit_4", "High Calculation Workstation MK IV", "高算力工作站 MK IV"); + public static final ItemEntry HUI_CIRCUIT_5 = registerLang("hui_circuit_5", "High Calculation Workstation MK V", "高算力工作站 MK V"); public static final ItemEntry SPECIAL_CERAMICS = register("special_ceramics", "特种陶瓷"); public static final ItemEntry PLANET_SCAN_SATELLITE = register("planet_scan_satellite", "行星扫描卫星"); @@ -1122,24 +1127,26 @@ public static ItemEntry[][] registerIndustrialComponents() { public static final ItemEntry PREOXIDIZED_ATOMIC_PAN_FIBER = item("preoxidized_atomic_pan_fiber", "预氧化原子级聚丙烯腈原丝").model(NonNullBiConsumer.noop()).register(); public static final ItemEntry GRAPHITIZED_ATOMIC_PAN_FIBER = item("graphitized_atomic_pan_fiber", "石墨化原子级聚丙烯腈原丝").model(NonNullBiConsumer.noop()).register(); - // 能量控制模块mk123 - public static final ItemEntry ENERGY_CONTROL_MODULE_MK1 = register("energy_control_module_mk1", "能量控制模块 MK-I"); - public static final ItemEntry ENERGY_CONTROL_MODULE_MK2 = register("energy_control_module_mk2", "能量控制模块 MK-II"); - public static final ItemEntry ENERGY_CONTROL_MODULE_MK3 = register("energy_control_module_mk3", "能量控制模块 MK-III"); - // 运行控制模块mk123 - public static final ItemEntry MACHINING_CONTROL_MODULE_MK1 = register("machining_control_module_mk1", "运行控制模块 MK-I"); - public static final ItemEntry MACHINING_CONTROL_MODULE_MK2 = register("machining_control_module_mk2", "运行控制模块 MK-II"); - public static final ItemEntry MACHINING_CONTROL_MODULE_MK3 = register("machining_control_module_mk3", "运行控制模块 MK-III"); - // 小型太空梭mk12 - public static final ItemEntry SMALL_SHUTTLE_MK1 = item("small_shuttle_mk1", "小型太空梭 MK-I", ComponentItem::create) + // 能量控制模块MK123 + public static final ItemEntry ENERGY_CONTROL_MODULE_MK1 = registerLang("energy_control_module_mk1", "Energy Control Module MK I", "能量控制模块 MK I"); + public static final ItemEntry ENERGY_CONTROL_MODULE_MK2 = registerLang("energy_control_module_mk2", "Energy Control Module MK II", "能量控制模块 MK II"); + public static final ItemEntry ENERGY_CONTROL_MODULE_MK3 = registerLang("energy_control_module_mk3", "Energy Control Module MK III", "能量控制模块 MK III"); + // 运行控制模块MK123 + public static final ItemEntry MACHINING_CONTROL_MODULE_MK1 = registerLang("machining_control_module_mk1", "Machining Control Module MK I", "运行控制模块 MK I"); + public static final ItemEntry MACHINING_CONTROL_MODULE_MK2 = registerLang("machining_control_module_mk2", "Machining Control Module MK II", "运行控制模块 MK II"); + public static final ItemEntry MACHINING_CONTROL_MODULE_MK3 = registerLang("machining_control_module_mk3", "Machining Control Module MK III", "运行控制模块 MK III"); + // 小型太空梭MK12 + public static final ItemEntry SMALL_SHUTTLE_MK1 = item("small_shuttle_mk1", "小型太空梭 MK I", ComponentItem::create) + .lang("Small Shuttle MK I") .onRegister(attach(ElectricStats.createRechargeableBattery(3_600_000L, GTValues.HV))) .register(); - public static final ItemEntry SMALL_SHUTTLE_MK2 = item("small_shuttle_mk2", "小型太空梭 MK-II", ComponentItem::create) + public static final ItemEntry SMALL_SHUTTLE_MK2 = item("small_shuttle_mk2", "小型太空梭 MK II", ComponentItem::create) + .lang("Small Shuttle MK II") .onRegister(attach(ElectricStats.createRechargeableBattery(10_240_000L, GTValues.EV))) .register(); - // 激光陀螺仪mk12 - public static final ItemEntry LASER_GYROSCOPE_MK1 = register("laser_gyroscope_mk1", "激光陀螺仪 MK-I"); - public static final ItemEntry LASER_GYROSCOPE_MK2 = register("laser_gyroscope_mk2", "激光陀螺仪 MK-II"); + // 激光陀螺仪MK12 + public static final ItemEntry LASER_GYROSCOPE_MK1 = registerLang("laser_gyroscope_mk1", "Laser Gyroscope MK I", "激光陀螺仪 MK I"); + public static final ItemEntry LASER_GYROSCOPE_MK2 = registerLang("laser_gyroscope_mk2", "Laser Gyroscope MK II", "激光陀螺仪 MK II"); // 无人机载终极电池 public static final ItemEntry DRONE_ULTIMATE_BATTERY = item("drone_ultimate_battery", "无人机载终极电池", ComponentItem::create) @@ -1289,6 +1296,7 @@ public static ItemEntry[][] registerIndustrialComponents() { public static final ItemEntry TRAVEL_STAFF = item("travel_staff", "旅行手杖", p -> ComponentItem.create(p.stacksTo(1))) .lang("The Staff of Travelling") .onRegister(attach(TravelStaffBehavior.create())) + .model((ctx, prov) -> prov.handheld(ctx)) .register(); public static final ItemEntry TESSERACT_TARGET_MARKER = item("tesseract_target_marker", "坐标标签枪", ComponentItem::create) diff --git a/src/main/java/com/gtocore/common/data/GTOMachines.java b/src/main/java/com/gtocore/common/data/GTOMachines.java index 4eb8bb365..30e35a4b8 100644 --- a/src/main/java/com/gtocore/common/data/GTOMachines.java +++ b/src/main/java/com/gtocore/common/data/GTOMachines.java @@ -14,7 +14,6 @@ import com.gtocore.common.machine.monitor.*; import com.gtocore.common.machine.multiblock.electric.miner.SingleDigitalMiner; import com.gtocore.common.machine.multiblock.part.*; -import com.gtocore.common.machine.multiblock.part.ae.MEPatternContentSortMachine; import com.gtocore.common.machine.multiblock.part.maintenance.*; import com.gtocore.common.machine.noenergy.*; import com.gtocore.common.machine.noenergy.PlatformDeployment.PlatformDeploymentMachine; @@ -95,13 +94,13 @@ public static void init() { if (GTCEu.isDev() || GTCEu.isDataGen()) { final MachineDefinition SYNC_TESTER_MACHINE = machine("sync_tester_machine", "同步测试机", SyncTesterMachine::new) .allRotation() - .tooltipsText("用于测试机器同步的工具。", "A tool for testing machine synchronization.") - .tooltipsText("请勿在生产环境中使用。", "Do not use in production environment.") + .tooltipsText("A tool for testing machine synchronization.", "用于测试机器同步的工具。") + .tooltipsText("Do not use in production environment.", "请勿在生产环境中使用。") .register(); final MachineDefinition TEST_REPORT_OUTPUT = machine("test_report_output", "测试报告输出器", TestReportOutput::new) .allRotation() - .tooltipsText("打印一些测试用信息", "Print some test information") + .tooltipsText("Print some test information", "打印一些测试用信息") .register(); } } @@ -292,12 +291,12 @@ public static void init() { p -> p.addCommentLines( """ 运行时长调整范围:%s%%~100%% - 加速仓的等级低于机器最大电压等级时加速效力减弱20%%每级 + 加速仓的等级低于配方电压等级时加速效力减弱20%%每级 来自 GTO 的神秘力量 尽情享受吧!""".formatted(FormattingUtil.formatNumber2Places(52.0 - tier * 2.0)), """ Operation duration adjustment range: %s%%~100%% - The acceleration effect is weakened by 20%% per level when the level of the accelerate hatch is lower than the machine's maximum voltage level + The acceleration effect is weakened by 20%% per level when the level of the accelerate hatch is lower than the recipe's voltage level Mysterious power from GTO Enjoy it to the fullest!""".formatted(FormattingUtil.formatNumber2Places(52.0 - tier * 2.0))))) .notAllowSharedTooltips() @@ -454,22 +453,6 @@ public static void init() { public static final MachineDefinition[] LASER_OUTPUT_HATCH_16777216 = registerLaserHatch(IO.OUT, 16777216, PartAbility.OUTPUT_LASER); - public static final MachineDefinition ME_PATTERN_CONTENT_SORT_MACHINE = machine("me_pattern_content_sort_machine", "ME样板内容动态修改机", MEPatternContentSortMachine::new) - .overlayTieredHullRenderer("neutron_sensor") - .tier(HV) - .tooltips(NewDataAttributes.MIRACULOUS_TOOLS.create(new CNEN("ME样板内容动态修改机", "ME Pattern Content Dynamic Modifier"), p -> p.addCommentLines( - """ - 是的,你现在可以不修改样板,就一键替换其中的内容了。 - 只需要将此机器连入ME网络,然后样板在被调用时, - 其内容就会按照你配置的优先级被同一行匹配替换。 - 支持物品和流体""", - """ - Yes, you can now replace the content of a pattern without modifying it. - Just connect this machine to the ME network, and when the pattern is called, - its content will be replaced according to the priority you configured. - Supports both items and fluids"""))) - .register(); - public static final MachineDefinition ME_WIRELESS_CONNECTION_MACHINE = machine("me_wireless_connection_machine", "ME无线连接机", MeWirelessConnectMachine::new) .renderer(MeWirelessConnectMachineRenderer::new) .tooltips(GTOMachineTooltips.INSTANCE.getAutoConnectMETooltips().getSupplier()) @@ -979,9 +962,8 @@ public static void init() { .nonYAxisRotation() .recipeType(GTORecipeTypes.DIGITAL_MINER_RECIPE) .workableTieredHullRenderer(GTCEu.id("block/machines/miner")) - .tooltips(Component.translatable("gtceu.universal.tooltip.uses_per_tick", GTValues.VEX[tier - 1]) - .append(Component.literal(", ").withStyle(ChatFormatting.GRAY)) - .append(Component.literal("§7每个方块需要§f" + (int) (40 / Math.pow(2, tier)) + "§7刻。"))) + .tooltips(Component.translatable("gtceu.universal.tooltip.uses_per_tick", GTValues.VEX[tier - 1])) + .tooltips(Component.translatable("gtceu.machine.miner.per_block", Math.pow(2, 1 - tier))) .tooltips(Component.translatable("gtceu.universal.tooltip.voltage_in", FormattingUtil.formatNumbers(GTValues.VEX[tier]), GTValues.VNF[tier])) diff --git a/src/main/java/com/gtocore/common/data/machines/ExResearchMachines.java b/src/main/java/com/gtocore/common/data/machines/ExResearchMachines.java index b173accd4..e7b9b09b5 100644 --- a/src/main/java/com/gtocore/common/data/machines/ExResearchMachines.java +++ b/src/main/java/com/gtocore/common/data/machines/ExResearchMachines.java @@ -28,8 +28,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; -import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; -import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; @@ -100,16 +98,16 @@ public static void init() {} .aisle(" BBB BBB BBB", " BBB BBB BBB", " BBB BBB BBB", " BBB BBB BBB", " BBBEEEEEEEEEEEEEBBBEEEEEBBB", " BBBEEEEEEEEEEEEEBBBEEEEEBBB", " BBBEEEEEEEEEEEEEBBBEEEEEBBB", " BBB BBB BBB", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") .where('A', blocks(GTOBlocks.NAQUADAH_ALLOY_CASING.get())) .where('B', blocks(GTOBlocks.IRIDIUM_CASING.get())) - .where('C', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.BabbittAlloy))) + .where('C', GTOPredicates.frame(GTOMaterials.BabbittAlloy)) .where('D', blocks(GTOBlocks.STRONTIUM_CARBONATE_CERAMIC_RAY_ABSORBING_MECHANICAL_CUBE.get())) .where('E', blocks(GTBlocks.MACHINE_CASING_UHV.get())) .where('F', blocks(GCYMBlocks.CASING_NONCONDUCTING.get())) .where('G', blocks(GTOBlocks.ANTIFREEZE_HEATPROOF_MACHINE_CASING.get())) - .where('H', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.HastelloyN))) + .where('H', GTOPredicates.frame(GTOMaterials.HastelloyN)) .where('I', blocks(GTOBlocks.OXIDATION_RESISTANT_HASTELLOY_N_MECHANICAL_CASING.get())) .where('J', blocks(GTOBlocks.PRESSURE_CONTAINMENT_CASING.get())) .where('K', GTOPredicates.absBlocks()) - .where('L', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Ruridit))) + .where('L', GTOPredicates.frame(GTMaterials.Ruridit)) .where('M', blocks(GTOBlocks.LITHIUM_OXIDE_CERAMIC_HEAT_RESISTANT_SHOCK_RESISTANT_MECHANICAL_CUBE.get())) .where('N', blocks(GTBlocks.ADVANCED_COMPUTER_CASING.get())) .where('O', blocks(GTBlocks.HIGH_POWER_CASING.get())) @@ -299,7 +297,7 @@ private static GTOMachineBuilder registerHPCAPart(String name, String cn, .where('J', blocks(GTOBlocks.IRIDIUM_CASING.get())) .where('K', blocks(GTBlocks.HIGH_POWER_CASING.get())) .where('L', blocks(GCYMBlocks.ELECTROLYTIC_CELL.get())) - .where('M', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Naquadria))) + .where('M', GTOPredicates.frame(GTMaterials.Naquadria)) .where('N', blocks(GTOBlocks.IRIDIUM_PIPE_CASING.get())) .where(' ', any()) .build()) diff --git a/src/main/java/com/gtocore/common/data/machines/GCYMMachines.java b/src/main/java/com/gtocore/common/data/machines/GCYMMachines.java index 8d7154d89..76426c20a 100644 --- a/src/main/java/com/gtocore/common/data/machines/GCYMMachines.java +++ b/src/main/java/com/gtocore/common/data/machines/GCYMMachines.java @@ -171,7 +171,7 @@ public static void init() {} .where('X', blocks(CASING_REACTION_SAFE.get()).setMinGlobalLimited(50) .or(GTOPredicates.autoGCYMAbilities(definition.getRecipeTypes())) .or(autoAbilities(true, false, true))) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.HastelloyX))) + .where('F', GTOPredicates.frame(GTMaterials.HastelloyX)) .where('G', blocks(CASING_STAINLESS_STEEL_GEARBOX.get())) .where('P', blocks(CASING_TITANIUM_PIPE.get())) .where('A', air()) @@ -470,11 +470,11 @@ public static void init() {} .where('A', blocks(GTBlocks.CASING_TUNGSTENSTEEL_TURBINE.get())) .where('B', blocks(GCYMBlocks.CASING_HIGH_TEMPERATURE_SMELTING.get()) .or(GTOPredicates.autoIOAbilities(definition.getRecipeTypes()))) - .where('C', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.TungstenSteel))) + .where('C', GTOPredicates.frame(GTMaterials.TungstenSteel)) .where('D', blocks(GCYMBlocks.CASING_HIGH_TEMPERATURE_SMELTING.get())) .where('E', blocks(GTBlocks.CASING_TUNGSTENSTEEL_GEARBOX.get())) .where('F', blocks(GCYMBlocks.HEAT_VENT.get())) - .where('G', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.HSSS))) + .where('G', GTOPredicates.frame(GTMaterials.HSSS)) .where('H', blocks(GTBlocks.CASING_TUNGSTENSTEEL_PIPE.get())) .where('I', controller(definition)) .where(' ', any()) @@ -828,7 +828,7 @@ public static void init() {} .or(autoAbilities(true, false, true))) .where('C', heatingCoils()) .where('M', abilities(MUFFLER)) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.NaquadahAlloy))) + .where('F', GTOPredicates.frame(GTMaterials.NaquadahAlloy)) .where('H', casing) .where('T', blocks(CASING_TUNGSTENSTEEL_ROBUST.get())) .where('B', blocks(FIREBOX_TUNGSTENSTEEL.get())) @@ -998,7 +998,7 @@ public static void init() {} .aisle("ADDDA", "E E", "CDDDC", "ACCCA") .aisle("ACCCA", "B B", "CBBBC", " ") .aisle("AAAAA", "B B", "CCCCC", " ") - .where('B', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Tungsten))) + .where('B', GTOPredicates.frame(GTMaterials.Tungsten)) .where('C', blocks(GCYMBlocks.CASING_STRESS_PROOF.get())) .where('D', blocks(GTBlocks.CASING_TUNGSTENSTEEL_GEARBOX.get())) .where('E', blocks(GTBlocks.CASING_GRATE.get())) @@ -1029,7 +1029,7 @@ public static void init() {} .aisle("EEaEE", "AFFFA", "D D", " ", "DFFFD", "CGGGC", "DD DD", " DDD ") .aisle("AABAA", "A A", "A A", "ACCCA", "DDDDD", "DCCCD", "DDDDD", " ") .where('B', controller(definition)) - .where('C', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.BlueSteel))) + .where('C', GTOPredicates.frame(GTMaterials.BlueSteel)) .where('D', blocks(GCYMBlocks.CASING_STRESS_PROOF.get())) .where('E', blocks(GTBlocks.STEEL_HULL.get())) .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.block, GTMaterials.TungstenSteel))) @@ -1060,7 +1060,7 @@ public static void init() {} .aisle("aBBBBBa", "a E a", "B C B", "ADDDDDA", " DADAD ", " A A ", " DA AD ", " A A ", " DA AD ", " A A ", " DA AD ", " A A ", " DA AD ", " A A ") .aisle("aBBBBBa", "aD E Da", "BD C DB", "ADDDDDA", " DADAD ", " ", " DDD ", " ", " DDD ", " ", " DDD ", " ", " DDD ", " ") .aisle("AaaaaaA", "AaaaaaA", "ABCCCBA", "A A A A", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") - .where('A', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) + .where('A', GTOPredicates.frame(GTMaterials.StainlessSteel)) .where('B', blocks(GCYMBlocks.CASING_NONCONDUCTING.get())) .where('C', blocks(GTBlocks.SUPERCONDUCTING_COIL.get())) .where('D', blocks(GTBlocks.CASING_PALLADIUM_SUBSTATION.get())) @@ -1095,7 +1095,7 @@ public static void init() {} .or(GTOPredicates.autoGCYMAbilities(definition.getRecipeTypes())) .or(autoAbilities(true, false, true))) .where('B', blocks(GTBlocks.CASING_PTFE_INERT.get())) - .where('C', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Polytetrafluoroethylene))) + .where('C', GTOPredicates.frame(GTMaterials.Polytetrafluoroethylene)) .where('D', blocks(GTBlocks.CASING_TUNGSTENSTEEL_GEARBOX.get())) .where('E', blocks(GTBlocks.CASING_TEMPERED_GLASS.get())) .where('F', blocks(GTBlocks.CASING_POLYTETRAFLUOROETHYLENE_PIPE.get())) @@ -1152,7 +1152,7 @@ public static void init() {} .aisle("AAAAAAAAA", "XXXXXXXXX", "AAAAAAAAA", "AAAAAAAAA", " AAA ") .where('~', controller(definition)) .where('A', blocks(GCYMBlocks.CASING_SECURE_MACERATION.get())) - .where('B', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Ultimet))) + .where('B', GTOPredicates.frame(GTMaterials.Ultimet)) .where('C', blocks(GTBlocks.CASING_TUNGSTENSTEEL_GEARBOX.get())) .where('D', blocks(GTBlocks.CASING_TEMPERED_GLASS.get())) .where('X', blocks(GCYMBlocks.CASING_SECURE_MACERATION.get()) diff --git a/src/main/java/com/gtocore/common/data/machines/GTMachineModify.java b/src/main/java/com/gtocore/common/data/machines/GTMachineModify.java index 50c0cad12..96175d94f 100644 --- a/src/main/java/com/gtocore/common/data/machines/GTMachineModify.java +++ b/src/main/java/com/gtocore/common/data/machines/GTMachineModify.java @@ -147,7 +147,7 @@ public static void init() { .or(GTOPredicates.autoIOAbilities(definition.getRecipeTypes())) .or(abilities(PartAbility.INPUT_ENERGY).setMaxGlobalLimited(2)) .or(abilities(GTOPartAbility.ACCELERATE_HATCH).setMaxGlobalLimited(1))) - .where('B', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) + .where('B', GTOPredicates.frame(GTMaterials.StainlessSteel)) .where('C', blocks(GTBlocks.CASING_INVAR_HEATPROOF.get())) .where('D', blocks(GTBlocks.CASING_STEEL_PIPE.get())) .where('E', controller(definition)) diff --git a/src/main/java/com/gtocore/common/data/machines/GeneratorMultiblock.java b/src/main/java/com/gtocore/common/data/machines/GeneratorMultiblock.java index 453ca610e..519a911c0 100644 --- a/src/main/java/com/gtocore/common/data/machines/GeneratorMultiblock.java +++ b/src/main/java/com/gtocore/common/data/machines/GeneratorMultiblock.java @@ -98,7 +98,7 @@ private static MultiblockMachineDefinition registerPhotovoltaicPowerStation(Stri .aisle("CDDCBEEEEEEEBCCCC", "IJJFFGHGHGHGFFFFI", "KKKKKKKKKKKKKKKKI", "KKKKKKKKKKKKKKKKI", "KKKKKKKKKKKKKKKKI", "IJJFFGHGHGHGFFFFI", "CDDCBEEEEEEEBCCCC") .aisle("CCCCBBBBBBBBBCCCC", "IFFFFGHGHGHGFFFFI", "IJJFFGHGHGHGFFFFI", "IJJFFGHGHGHGFFFFI", "IJJFFGHGHGHGFFFFI", "IFFFFGHGHGHGFFFFI", "CCCCBBBBBBBBBCCCC") .aisle("AAAABBBBBBBBBAAAA", "CCCCBBBBBBBBBCCCC", "CDDCBEEEEEEEBCCCC", "CDDCBBBBBBBBBCCCC", "CDDCBEEEEEEEBCCCC", "CCCCBBBBBBBBBCCCC", "AAAABBBBBBBBBAAAA") - .where('A', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Tungsten))) + .where('A', GTOPredicates.frame(GTMaterials.Tungsten)) .where('B', blocks(GTBlocks.CASING_TUNGSTENSTEEL_TURBINE.get())) .where('C', GTOPredicates.absBlocks()) .where('D', GTOPredicates.glass()) @@ -166,7 +166,7 @@ private static MultiblockMachineDefinition registerPhotovoltaicPowerStation(Stri .where('D', blocks(GTBlocks.HIGH_POWER_CASING.get())) .where('E', blocks(GTOBlocks.IRIDIUM_CASING.get())) .where('F', blocks(GTOBlocks.BORON_CARBIDE_CERAMIC_RADIATION_RESISTANT_MECHANICAL_CUBE.get())) - .where('G', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Naquadria))) + .where('G', GTOPredicates.frame(GTMaterials.Naquadria)) .where('H', blocks(GCYMBlocks.ELECTROLYTIC_CELL.get())) .where('I', blocks(GTBlocks.FUSION_CASING_MK3.get())) .where('J', blocks(GTOBlocks.COBALT_OXIDE_CERAMIC_STRONG_THERMALLY_CONDUCTIVE_MECHANICAL_BLOCK.get())) @@ -193,7 +193,7 @@ private static MultiblockMachineDefinition registerPhotovoltaicPowerStation(Stri .where('A', blocks(GTBlocks.CASING_TUNGSTENSTEEL_ROBUST.get())) .where('B', blocks(GTBlocks.CASING_TUNGSTENSTEEL_TURBINE.get())) .where('C', blocks(GTBlocks.MACHINE_CASING_LuV.get())) - .where('D', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.TungstenSteel))) + .where('D', GTOPredicates.frame(GTMaterials.TungstenSteel)) .where('E', blocks(GTBlocks.CASING_STAINLESS_TURBINE.get())) .where('F', blocks(GTBlocks.CASING_STAINLESS_STEEL_GEARBOX.get())) .where('G', blocks(GCYMBlocks.HEAT_VENT.get())) @@ -216,7 +216,7 @@ private static MultiblockMachineDefinition registerPhotovoltaicPowerStation(Stri .where('r', blocks(GTBlocks.CASING_STEEL_TURBINE.get()) .or(abilities(IMPORT_FLUIDS).setMaxGlobalLimited(4, 4))) .where('S', blocks(GTBlocks.CASING_TUNGSTENSTEEL_GEARBOX.get())) - .where('T', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) + .where('T', GTOPredicates.frame(GTMaterials.StainlessSteel)) .where('U', blocks(GCYMBlocks.ELECTROLYTIC_CELL.get())) .where('V', blocks(GTOBlocks.MAGNESIUM_OXIDE_CERAMIC_HIGH_TEMPERATURE_INSULATION_MECHANICAL_BLOCK.get())) .where('W', abilities(MUFFLER)) @@ -294,8 +294,8 @@ private static MultiblockMachineDefinition registerPhotovoltaicPowerStation(Stri .or(abilities(PartAbility.OUTPUT_ENERGY).setMaxGlobalLimited(4))) .where('D', blocks(GTOBlocks.CHEMICAL_CORROSION_RESISTANT_PIPE_CASING.get())) .where('E', blocks(GTBlocks.CASING_ENGINE_INTAKE.get())) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) - .where('G', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.BlackSteel))) + .where('F', GTOPredicates.frame(GTMaterials.StainlessSteel)) + .where('G', GTOPredicates.frame(GTMaterials.BlackSteel)) .where('H', blocks(GTBlocks.FILTER_CASING.get())) .where('I', blocks(GTOBlocks.HSSS_BOROSILICATE_GLASS.get())) .where('J', blocks(GTBlocks.CASING_STAINLESS_STEEL_GEARBOX.get())) @@ -356,8 +356,8 @@ private static MultiblockMachineDefinition registerPhotovoltaicPowerStation(Stri .or(abilities(PartAbility.OUTPUT_ENERGY).setMaxGlobalLimited(4))) .where('D', blocks(GTOBlocks.HIGH_PRESSURE_PIPE_CASING.get())) .where('E', blocks(GTBlocks.CASING_ENGINE_INTAKE.get())) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Titanium))) - .where('G', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.BlackSteel))) + .where('F', GTOPredicates.frame(GTMaterials.Titanium)) + .where('G', GTOPredicates.frame(GTMaterials.BlackSteel)) .where('H', blocks(GTBlocks.FILTER_CASING.get())) .where('I', blocks(GTBlocks.CASING_LAMINATED_GLASS.get())) .where('J', blocks(GTBlocks.CASING_TITANIUM_GEARBOX.get())) @@ -418,8 +418,8 @@ private static MultiblockMachineDefinition registerPhotovoltaicPowerStation(Stri .or(abilities(PartAbility.OUTPUT_ENERGY).setMaxGlobalLimited(4))) .where('D', blocks(GTOBlocks.HIGH_PRESSURE_PIPE_CASING.get())) .where('E', blocks(GTBlocks.CASING_EXTREME_ENGINE_INTAKE.get())) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.TungstenSteel))) - .where('G', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.BlackSteel))) + .where('F', GTOPredicates.frame(GTMaterials.TungstenSteel)) + .where('G', GTOPredicates.frame(GTMaterials.BlackSteel)) .where('H', blocks(GTBlocks.FILTER_CASING.get())) .where('I', blocks(GTBlocks.CASING_LAMINATED_GLASS.get())) .where('J', blocks(GTBlocks.CASING_TUNGSTENSTEEL_GEARBOX.get())) @@ -480,8 +480,8 @@ private static MultiblockMachineDefinition registerPhotovoltaicPowerStation(Stri .or(abilities(PartAbility.OUTPUT_ENERGY).setMaxGlobalLimited(4))) .where('D', blocks(GCYMBlocks.ELECTROLYTIC_CELL.get())) .where('E', blocks(GTBlocks.CASING_EXTREME_ENGINE_INTAKE.get())) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Iridium))) - .where('G', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.BlackSteel))) + .where('F', GTOPredicates.frame(GTMaterials.Iridium)) + .where('G', GTOPredicates.frame(GTMaterials.BlackSteel)) .where('H', blocks(GTBlocks.FILTER_CASING.get())) .where('I', blocks(GTOBlocks.HSSS_BOROSILICATE_GLASS.get())) .where('J', blocks(GTOBlocks.IRIDIUM_GEARBOX.get())) @@ -507,10 +507,10 @@ private static MultiblockMachineDefinition registerPhotovoltaicPowerStation(Stri .where('J', blocks(GTOBlocks.ENHANCE_HYPER_MECHANICAL_CASING.get())) .where('K', blocks(GTOBlocks.DIMENSION_INJECTION_CASING.get())) .where('L', blocks(GTOBlocks.DYSON_DEPLOYMENT_CASING.get())) - .where('M', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Quantanium))) + .where('M', GTOPredicates.frame(GTOMaterials.Quantanium)) .where('N', blocks(GTOBlocks.HOLLOW_CASING.get())) - .where('O', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Mithril))) - .where('P', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.NaquadahAlloy))) + .where('O', GTOPredicates.frame(GTOMaterials.Mithril)) + .where('P', GTOPredicates.frame(GTMaterials.NaquadahAlloy)) .where('Q', blocks(GTOBlocks.CONTAINMENT_FIELD_GENERATOR.get())) .where('R', blocks(GTOBlocks.FUSION_CASING_MK5.get())) .where('S', blocks(GTOBlocks.DYSON_CONTROL_CASING.get())) @@ -549,7 +549,7 @@ private static MultiblockMachineDefinition registerPhotovoltaicPowerStation(Stri .where('C', blocks(GTOBlocks.RADIATION_ABSORBENT_CASING.get())) .where('D', blocks(GTOBlocks.HIGH_STRENGTH_CONCRETE.get())) .where('E', blocks(GTOBlocks.SPACE_ELEVATOR_INTERNAL_SUPPORT.get())) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.NaquadahAlloy))) + .where('F', GTOPredicates.frame(GTMaterials.NaquadahAlloy)) .where('G', blocks(GTOBlocks.HYPER_CORE.get())) .where('H', blocks(GTOBlocks.MOLECULAR_CASING.get())) .where('I', blocks(GTBlocks.HIGH_POWER_CASING.get())) @@ -588,9 +588,9 @@ private static MultiblockMachineDefinition registerPhotovoltaicPowerStation(Stri .where('B', blocks(GTOBlocks.AMPROSIUM_GEARBOX.get())) .where('C', blocks(GTOBlocks.EXTREME_STRENGTH_TRITANIUM_CASING.get())) .where('D', blocks(GTBlocks.HIGH_POWER_CASING.get())) - .where('E', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Naquadria))) + .where('E', GTOPredicates.frame(GTMaterials.Naquadria)) .where('F', blocks(GTOBlocks.AMPROSIUM_PIPE_CASING.get())) - .where('G', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Trinium))) + .where('G', GTOPredicates.frame(GTMaterials.Trinium)) .where('a', blocks(GTOBlocks.HYPER_MECHANICAL_CASING.get()) .or(blocks(GTMachines.CONTROL_HATCH.get()).setMaxGlobalLimited(1).setPreviewCount(0)) .or(abilities(IMPORT_FLUIDS).setMaxGlobalLimited(2)) @@ -624,7 +624,7 @@ private static MultiblockMachineDefinition registerPhotovoltaicPowerStation(Stri .where('~', controller(definition)) .where('A', blocks(GTOBlocks.DIMENSIONALLY_TRANSCENDENT_CASING.get())) .where('B', blocks(GTOBlocks.ENHANCE_HYPER_MECHANICAL_CASING.get())) - .where('C', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Naquadria))) + .where('C', GTOPredicates.frame(GTMaterials.Naquadria)) .where('D', blocks(GTOBlocks.ECHO_CASING.get())) .where('E', blocks(GTOBlocks.DEGENERATE_RHENIUM_CONSTRAINED_CASING.get())) .where('F', blocks(GTOBlocks.DIMENSIONAL_BRIDGE_CASING.get())) @@ -809,7 +809,7 @@ private static MultiblockMachineDefinition registerPhotovoltaicPowerStation(Stri .where('E', blocks(GTOBlocks.IRIDIUM_CASING.get())) .where('F', blocks(GCYMBlocks.MOLYBDENUM_DISILICIDE_COIL_BLOCK.get())) .where('G', blocks(GTOBlocks.PRESSURE_CONTAINMENT_CASING.get())) - .where('H', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.HSSG))) + .where('H', GTOPredicates.frame(GTMaterials.HSSG)) .where('I', blocks(GTOBlocks.IRIDIUM_PIPE_CASING.get())) .where('J', blocks(GTOBlocks.CALCIUM_OXIDE_CERAMIC_ANTI_METAL_CORROSION_MECHANICAL_BLOCK.get())) .where('K', blocks(GTBlocks.FILTER_CASING.get())) diff --git a/src/main/java/com/gtocore/common/data/machines/ManaMultiBlock.java b/src/main/java/com/gtocore/common/data/machines/ManaMultiBlock.java index 9dc87b6bd..e3b9840d7 100644 --- a/src/main/java/com/gtocore/common/data/machines/ManaMultiBlock.java +++ b/src/main/java/com/gtocore/common/data/machines/ManaMultiBlock.java @@ -1,6 +1,7 @@ package com.gtocore.common.data.machines; import com.gtocore.api.machine.part.GTOPartAbility; +import com.gtocore.api.pattern.GTOPredicates; import com.gtocore.client.renderer.machine.CosmicCelestialSpireOfConvergenceRenderer; import com.gtocore.common.data.GTOBlocks; import com.gtocore.common.data.GTOMaterials; @@ -73,7 +74,7 @@ public static void init() {} .where('D', controller(definition)) .where('E', blocks(RegistriesUtils.getBlock("botania:elf_glass"))) .where('F', blocks(RegistriesUtils.getBlock("botania:livingrock_wall"))) - .where('G', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Gaiasteel))) + .where('G', GTOPredicates.frame(GTOMaterials.Gaiasteel)) .where('H', heatingCoils()) .where('I', abilities(MUFFLER)) .where(' ', any()) @@ -166,7 +167,7 @@ public static void init() {} .or(abilities(PARALLEL_HATCH).setMaxGlobalLimited(1)) .or(abilities(EXPORT_ITEMS).setMaxGlobalLimited(16, 1)) .or(abilities(IMPORT_ITEMS).setMaxGlobalLimited(16, 1))) - .where('G', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Manasteel))) + .where('G', GTOPredicates.frame(GTOMaterials.Manasteel)) .where('H', blocks(RegistriesUtils.getBlock("botania:glimmering_livingwood"))) .where('I', blocks(RegistriesUtils.getBlock("botania:mana_glass"))) .where('J', blocks(Blocks.AIR)) @@ -206,7 +207,7 @@ public static void init() {} .recipeTypes(GTORecipeTypes.ELF_EXCHANGE_RECIPES) .block(GTOBlocks.MANASTEEL_CASING) .pattern(definition -> MultiBlockFileReader.start(definition) - .where('A', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Manasteel))) + .where('A', GTOPredicates.frame(GTOMaterials.Manasteel)) .where('B', blocks(GTOBlocks.MANASTEEL_CASING.get()) .or(abilities(GTOPartAbility.INPUT_MANA).setMaxGlobalLimited(2, 1)) .or(abilities(PARALLEL_HATCH).setMaxGlobalLimited(1)) @@ -216,7 +217,7 @@ public static void init() {} .where('D', blocks(RegistriesUtils.getBlock("botania:polished_livingrock"))) .where('E', blocks(GTOBlocks.MANASTEEL_CASING.get())) .where('F', blocks(RegistriesUtils.getBlock("botania:bifrost_perm"))) - .where('G', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Elementium))) + .where('G', GTOPredicates.frame(GTOMaterials.Elementium)) .where('H', blocks(RegistriesUtils.getBlock("botania:elf_glass"))) .where('I', blocks(RegistriesUtils.getBlock("botania:alfheim_portal"))) .where('J', blocks(RegistriesUtils.getBlock("botania:dragonstone_block"))) @@ -268,7 +269,7 @@ public static void init() {} .where('E', blocks(RegistriesUtils.getBlock("botania:livingrock_bricks"))) .where('F', blocks(RegistriesUtils.getBlock("botania:mana_glass"))) .where('G', blocks(Blocks.AIR)) - .where('H', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Gaiasteel))) + .where('H', GTOPredicates.frame(GTOMaterials.Gaiasteel)) .where('I', blocks(RegistriesUtils.getBlock("botania:livingrock_bricks_wall"))) .where('J', blocks(BotaniaBlocks.enchantedSoil)) .where('K', blocks(GTOBlocks.MANASTEEL_CASING.get()) @@ -381,7 +382,7 @@ public static void init() {} .aisle("A B A", " BEEEB ", " CEEEC ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " CEEEC ", " BBB ") .aisle(" AAAAA ", " BBB ", " CHC ", " CCC ", " CDC ", " CDC ", " CDC ", " CDC ", " CDC ", " CDC ", " CDC ", " CCC ", " CCC ", " ") .where('A', blocks(GTOBlocks.PPS_CORROSION_RESISTANT_MECHANICAL_HOUSING.get())) - .where('B', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Herbs))) + .where('B', GTOPredicates.frame(GTOMaterials.Herbs)) .where('C', blocks(GCYMBlocks.CASING_CORROSION_PROOF.get()) .or(abilities(EXPORT_ITEMS).setMaxGlobalLimited(4, 1)) .or(abilities(IMPORT_ITEMS).setMaxGlobalLimited(4, 1)) @@ -464,7 +465,7 @@ public static void init() {} .aisle(" D D ", " EEDDDEE ", " EAFAE ", " GGGPGGG ", " ", " ", " ", " ", " ", " GGGGGGG ", " EAFAE ", " EEDDDEE ", " D D ") .aisle(" A A ", " A A ", " ABA ", " A A ", " A A ", " ", " C C ", " ", " A A ", " A A ", " ABA ", " A A ", " A A ") .where('A', blocks(GTOBlocks.SOURCE_FIBER_MECHANICAL_CASING.get())) - .where('B', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Thaumium))) + .where('B', GTOPredicates.frame(GTOMaterials.Thaumium)) .where('C', blocks(RegistriesUtils.getBlock("botania:bifrost_perm"))) .where('D', blocks(GTOBlocks.SOURCE_STONE_CASING.get())) .where('E', blocks(GTOBlocks.SPELL_PRISM_CASING.get())) @@ -477,8 +478,8 @@ public static void init() {} .or(abilities(EXPORT_FLUIDS)) .or(abilities(EXPORT_ITEMS))) .where('H', blocks(ChemicalHelper.getBlock(TagPrefix.block, Runerock))) - .where('I', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Laureril))) - .where('J', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Gaia))) + .where('I', GTOPredicates.frame(GTOMaterials.Laureril)) + .where('J', GTOPredicates.frame(GTOMaterials.Gaia)) .where('K', blocks(RegistriesUtils.getBlock("botania:conjuration_catalyst"))) .where('L', blocks(RegistriesUtils.getBlock("botania:alchemy_catalyst"))) .where('M', blocks(RegistriesUtils.getBlock("botania:elf_glass"))) @@ -533,14 +534,14 @@ public static void init() {} .where('D', blocks(RegistriesUtils.getBlock("botania:bifrost_perm"))) .where('E', blocks(GTOBlocks.STAR_STONE[11].get())) .where('F', blocks(RegistriesUtils.getBlock("botania:corporea_brick_wall"))) - .where('G', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Orichalcos))) + .where('G', GTOPredicates.frame(GTOMaterials.Orichalcos)) .where('H', blocks(RegistriesUtils.getBlock("botania:prism"))) .where('I', blocks(RegistriesUtils.getBlock("botania:mana_glass"))) .where('J', blocks(GTOBlocks.HERETICAL_MECHANICAL_CASING.get())) .where('K', blocks(GTOBlocks.INFUSED_GOLD_REINFORCED_WOODEN_CASING.get())) .where('L', blocks(GTOBlocks.SPELL_PRISM_CASING.get())) .where('M', blocks(RegistriesUtils.getBlock("mythicbotany:alfsteel_pylon"))) - .where('N', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Photonium))) + .where('N', GTOPredicates.frame(GTOMaterials.Photonium)) .where('O', blocks(GTOBlocks.SPELL_PRISM_CASING.get()) .or(autoAbilities(definition.getRecipeTypes())) .or(abilities(GTOPartAbility.INPUT_MANA).setMaxGlobalLimited(16)) @@ -548,7 +549,7 @@ public static void init() {} .where('P', blocks(GTOBlocks.THE_ORIGIN_CASING.get())) .where('Q', blocks(GTOBlocks.ORICHALCOS_CASING.get())) .where('R', blocks(GTOBlocks.SOURCE_FIBER_MECHANICAL_CASING.get())) - .where('S', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Shadowium))) + .where('S', GTOPredicates.frame(GTOMaterials.Shadowium)) .where('T', blocks(RegistriesUtils.getBlock("botania:mana_pool"))) .where('U', blocks(RegistriesUtils.getBlock("botania:corporea_index"))) .where('V', blocks(RegistriesUtils.getBlock("botania:cacophonium_block"))) diff --git a/src/main/java/com/gtocore/common/data/machines/MultiBlockA.java b/src/main/java/com/gtocore/common/data/machines/MultiBlockA.java index 74494fa93..e9827ec90 100644 --- a/src/main/java/com/gtocore/common/data/machines/MultiBlockA.java +++ b/src/main/java/com/gtocore/common/data/machines/MultiBlockA.java @@ -74,7 +74,7 @@ public static void init() {} .or(abilities(EXPORT_ITEMS))) .where('B', controller(definition)) .where('C', blocks(GTBlocks.CASING_STEEL_SOLID.get())) - .where('D', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Steel))) + .where('D', GTOPredicates.frame(GTMaterials.Steel)) .where('E', blocks(GTBlocks.STEEL_HULL.get())) .where('F', blocks(GTBlocks.CASING_STEEL_GEARBOX.get())) .where('G', GTOPredicates.integralFramework()) @@ -123,7 +123,7 @@ public static void init() {} .or(abilities(PARALLEL_HATCH).setMaxGlobalLimited(1)) .or(abilities(ACCELERATE_HATCH).setMaxGlobalLimited(1))) .where('G', blocks(GTOBlocks.STAINLESS_EVAPORATION_CASING.get())) - .where('H', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, Aluminium))) + .where('H', GTOPredicates.frame(Aluminium)) .where(' ', any()) .build()) .workableCasingRenderer(GTOCore.id("block/casings/stainless_evaporation_casing"), GTCEu.id("block/multiblock/evaporation_plant")) @@ -131,7 +131,7 @@ public static void init() {} public static final MultiblockMachineDefinition PLASMA_CONDENSER = multiblock("plasma_condenser", "等离子冷凝器", TierCasingMultiblockMachine.createMachine(GLASS_TIER)) - .recipeModifiers((machine, recipe) -> RecipeModifierFunction.recipeReduction(recipe, 1, Math.pow(1 / 1.1d, ((ITierCasingMachine) machine).getCasingTier(GLASS_TIER))), RecipeModifierFunction.OVERCLOCKING) + .recipeModifier((machine, recipe) -> RecipeModifierFunction.overclocking(machine, recipe, false, 1, Math.pow(1 / 1.1d, ((ITierCasingMachine) machine).getCasingTier(GLASS_TIER)), 0.25)) .allRotation() .recipeTypes(GTORecipeTypes.PLASMA_CONDENSER_RECIPES) .tooltips(GTOMachineStories.INSTANCE.getPlasmaCondenserTooltips().getSupplier()) @@ -201,15 +201,15 @@ public static void init() {} .where('E', blocks(GTOBlocks.HYPER_CORE.get())) .where('F', blocks(GTBlocks.FUSION_GLASS.get())) .where('G', GTOPredicates.light()) - .where('H', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Duranium))) + .where('H', GTOPredicates.frame(GTMaterials.Duranium)) .where('I', blocks(GTOBlocks.PPS_CORROSION_RESISTANT_MECHANICAL_HOUSING.get())) .where('J', blocks(GTOBlocks.NEUTRONIUM_STABLE_CASING.get())) - .where('K', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Amprosium))) + .where('K', GTOPredicates.frame(GTOMaterials.Amprosium)) .where('L', blocks(GTOBlocks.HASTELLOY_N_75_CASING.get())) .where('M', blocks(GTOBlocks.CALCIUM_OXIDE_CERAMIC_ANTI_METAL_CORROSION_MECHANICAL_BLOCK.get())) .where('N', blocks(GTOBlocks.STERILE_WATER_PLANT_CASING.get())) .where('O', blocks(GCYMBlocks.ELECTROLYTIC_CELL.get())) - .where('P', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Polytetrafluoroethylene))) + .where('P', GTOPredicates.frame(GTMaterials.Polytetrafluoroethylene)) .where('Q', blocks(GTOBlocks.INDUSTRIAL_FRAMELESS_GLASS.get())) .where('R', blocks(GTOBlocks.CHEMICAL_CORROSION_RESISTANT_PIPE_CASING.get())) .where('S', blocks(GTOBlocks.AMPROSIUM_PIPE_CASING.get())) @@ -305,7 +305,7 @@ public static void init() {} .aisle(" CCCCDDDDDCCCC ", "EFFFFDGGGDFFFFE", "EFFFFDHHHDFFFFE", "EFFFFDGGGDFFFFE", " CCCCDDDDDCCCC ") .aisle(" ", " AAA AAA ", " ABA AAA ", " AAA AAA ", " ") .where('B', controller(definition)) - .where('C', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Naquadria))) + .where('C', GTOPredicates.frame(GTMaterials.Naquadria)) .where('D', blocks(GTBlocks.MACHINE_CASING_UHV.get())) .where('E', blocks(GTOBlocks.NAQUADAH_ALLOY_CASING.get())) .where('F', blocks(GTBlocks.HIGH_POWER_CASING.get())) @@ -337,7 +337,7 @@ public static void init() {} .where('B', blocks(GTBlocks.HIGH_POWER_CASING.get())) .where('C', blocks(GTOBlocks.TUNGSTEN_ALLOY_RADIATION_SHIELDING_MECHANICAL_BLOCK.get())) .where('D', blocks(GCYMBlocks.ELECTROLYTIC_CELL.get())) - .where('E', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.OdysseyNanoSuperalloy))) + .where('E', GTOPredicates.frame(GTOMaterials.OdysseyNanoSuperalloy)) .where('F', blocks(GTOBlocks.RESTRAINT_DEVICE.get())) .where('G', blocks(GTOBlocks.DEGENERATE_RHENIUM_CONSTRAINED_CASING.get())) .where('H', blocks(GTOBlocks.AMPROSIUM_PIPE_CASING.get())) @@ -366,7 +366,7 @@ public static void init() {} .where('B', blocks(GTOBlocks.COBALT_OXIDE_CERAMIC_STRONG_THERMALLY_CONDUCTIVE_MECHANICAL_BLOCK.get())) .where('C', blocks(GTBlocks.CASING_HSSE_STURDY.get())) .where('D', blocks(GTBlocks.CASING_STAINLESS_CLEAN.get())) - .where('E', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.HSSG))) + .where('E', GTOPredicates.frame(GTMaterials.HSSG)) .where('F', blocks(GTBlocks.CASING_TUNGSTENSTEEL_GEARBOX.get())) .where('G', blocks(GTBlocks.CASING_TUNGSTENSTEEL_PIPE.get())) .where('H', controller(definition)) @@ -383,13 +383,14 @@ public static void init() {} public static final MultiblockMachineDefinition VOID_MINER = multiblock("void_miner", "虚空采矿机", VoidMinerMachine::new) .nonYAxisRotation() + .tooltips(GTOMachineStories.INSTANCE.getVoidMinerTooltips().getSupplier()) .tooltips(GTOMachineTooltips.INSTANCE.getVoidMinerTooltips().getSupplier()) .recipeTypes(GTORecipeTypes.DUMMY_RECIPES) .block(GTBlocks.CASING_TUNGSTENSTEEL_ROBUST) .pattern(definition -> MultiBlockFileReader.start(definition, FRONT, UP, RIGHT) .where('A', blocks(GTOBlocks.TITANIUM_NITRIDE_CERAMIC_IMPACT_RESISTANT_MECHANICAL_BLOCK.get())) .where('C', blocks(GTBlocks.CASING_TUNGSTENSTEEL_ROBUST.get())) - .where('D', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) + .where('D', GTOPredicates.frame(GTMaterials.StainlessSteel)) .where('E', blocks(GTBlocks.MACHINE_CASING_HV.get())) .where('F', blocks(GTBlocks.CASING_STAINLESS_STEEL_GEARBOX.get())) .where('G', controller(definition)) @@ -423,7 +424,7 @@ public static void init() {} .setMinGlobalLimited(110) .or(autoAbilities(definition.getRecipeTypes())) .or(abilities(MAINTENANCE).setExactLimit(1))) - .where('c', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Ultimet))) + .where('c', GTOPredicates.frame(GTMaterials.Ultimet)) .where('d', blocks(GTBlocks.CASING_TITANIUM_STABLE.get())) .where(' ', any()) .build()) @@ -468,7 +469,7 @@ public static void init() {} .where('C', controller(definition)) .where('D', blocks(GTBlocks.SUPERCONDUCTING_COIL.get())) .where('E', blocks(GTOBlocks.HYPER_MECHANICAL_CASING.get())) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.BlackSteel))) + .where('F', GTOPredicates.frame(GTMaterials.BlackSteel)) .where('G', blocks(GTBlocks.FUSION_CASING.get())) .where('H', blocks(GTBlocks.HERMETIC_CASING_UV.get())) .where('B', blocks(GTOBlocks.HYPER_MECHANICAL_CASING.get()) @@ -493,7 +494,7 @@ public static void init() {} .pattern(definition -> MultiBlockFileReader.start(definition, RIGHT, UP, BACK) .where('A', blocks(GTBlocks.CASING_STEEL_SOLID.get())) .where('B', blocks(GTBlocks.FIREBOX_STEEL.get())) - .where('C', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) + .where('C', GTOPredicates.frame(GTMaterials.StainlessSteel)) .where('E', blocks(GTBlocks.STEEL_HULL.get())) .where('F', blocks(GTBlocks.CASING_GRATE.get())) .where('G', controller(definition)) @@ -577,7 +578,7 @@ public static void init() {} .or(GTOPredicates.autoLaserAbilities(definition.getRecipeTypes())) .or(abilities(MAINTENANCE).setExactLimit(1))) .where('c', GTOPredicates.glass()) - .where('d', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.HastelloyN))) + .where('d', GTOPredicates.frame(GTOMaterials.HastelloyN)) .where('A', GTOPredicates.machineCasing()) .where('-', air()) .where(' ', any()) @@ -602,7 +603,7 @@ public static void init() {} .where('B', blocks(GTOBlocks.ALUMINIUM_BRONZE_CASING.get())) .where('C', fluids(Fluids.WATER)) .where('D', blocks(GTBlocks.CASING_STEEL_PIPE.get())) - .where('E', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) + .where('E', GTOPredicates.frame(GTMaterials.StainlessSteel)) .where('F', controller(definition)) .where(' ', any()) .build()) @@ -672,7 +673,7 @@ public static void init() {} .where('~', controller(definition)) .where('A', blocks(GTOBlocks.IRIDIUM_CASING.get())) .where('B', blocks(GTBlocks.HIGH_POWER_CASING.get())) - .where('C', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Neutronium))) + .where('C', GTOPredicates.frame(GTMaterials.Neutronium)) .where('D', blocks(GTOBlocks.AMPROSIUM_GEARBOX.get())) .where('E', blocks(GTOBlocks.COMPONENT_ASSEMBLY_LINE_CASING_UV.get())) .where('F', blocks(GTBlocks.FUSION_GLASS.get())) @@ -716,7 +717,7 @@ public static void init() {} .where('F', blocks(GTOBlocks.MOLECULAR_CASING.get())) .where('G', blocks(GTOBlocks.DIMENSIONALLY_TRANSCENDENT_CASING.get())) .where('H', blocks(GTOBlocks.AMPROSIUM_CASING.get())) - .where('I', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.HastelloyX))) + .where('I', GTOPredicates.frame(GTMaterials.HastelloyX)) .where('J', blocks(GTOBlocks.AMPROSIUM_ACTIVE_CASING.get())) .where('K', blocks(GTOBlocks.DEGENERATE_RHENIUM_CONSTRAINED_CASING.get())) .where('L', blocks(ChemicalHelper.getBlock(TagPrefix.block, GTOMaterials.AttunedTengam))) @@ -774,13 +775,13 @@ public static void init() {} .or(GTOPredicates.autoThreadLaserAbilities(definition.getRecipeTypes())) .or(abilities(MAINTENANCE).setExactLimit(1))) .where('C', blocks(GTOBlocks.PRESSURE_CONTAINMENT_CASING.get())) - .where('D', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.BabbittAlloy))) + .where('D', GTOPredicates.frame(GTOMaterials.BabbittAlloy)) .where('E', blocks(GTBlocks.CASING_POLYTETRAFLUOROETHYLENE_PIPE.get())) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Polytetrafluoroethylene))) + .where('F', GTOPredicates.frame(GTMaterials.Polytetrafluoroethylene)) .where('G', blocks(GTOBlocks.STRENGTHEN_THE_BASE_BLOCK.get())) .where('H', blocks(GTBlocks.CASING_PTFE_INERT.get())) .where('I', heatingCoils()) - .where('J', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) + .where('J', GTOPredicates.frame(GTMaterials.StainlessSteel)) .where('K', blocks(GTOBlocks.CHEMICAL_GRADE_GLASS.get())) .where('L', controller(definition)) .where(' ', any()) @@ -810,7 +811,7 @@ public static void init() {} .or(autoAbilities(definition.getRecipeTypes())) .or(abilities(MAINTENANCE).setExactLimit(1))) .where('b', blocks(GTBlocks.CASING_LAMINATED_GLASS.get())) - .where('d', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.BlueSteel))) + .where('d', GTOPredicates.frame(GTMaterials.BlueSteel)) .where('e', blocks(GTBlocks.CASING_TUNGSTENSTEEL_GEARBOX.get())) .where('f', blocks(GTBlocks.CASING_TUNGSTENSTEEL_PIPE.get())) .where('g', abilities(MUFFLER)) @@ -834,7 +835,7 @@ public static void init() {} .where('C', blocks(GTBlocks.HIGH_POWER_CASING.get())) .where('D', blocks(GTBlocks.CASING_GRATE.get())) .where('E', blocks(GTBlocks.CASING_TUNGSTENSTEEL_PIPE.get())) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.HastelloyX))) + .where('F', GTOPredicates.frame(GTMaterials.HastelloyX)) .where('G', blocks(GTBlocks.CASING_LAMINATED_GLASS.get())) .where('H', blocks(GTBlocks.FILTER_CASING_STERILE.get())) .where('I', blocks(GTOBlocks.HIGH_STRENGTH_SUPPORT_MECHANICAL_CASING.get())) @@ -965,7 +966,7 @@ public static void init() {} .steamOverclock() .block(GTBlocks.CASING_BRONZE_BRICKS) .pattern(definition -> MultiBlockFileReader.start(definition, BACK, UP, LEFT) - .where('A', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Bronze))) + .where('A', GTOPredicates.frame(GTMaterials.Bronze)) .where('B', blocks(GTBlocks.CASING_BRONZE_BRICKS.get())) .where('a', blocks(GTBlocks.CASING_BRONZE_BRICKS.get()) .or(abilities(STEAM).setExactLimit(1)) @@ -1020,7 +1021,7 @@ public static void init() {} .block(GTBlocks.CASING_BRONZE_BRICKS) .pattern(definition -> MultiBlockFileReader.start(definition) .where('S', controller(definition)) - .where('B', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Bronze))) + .where('B', GTOPredicates.frame(GTMaterials.Bronze)) .where('C', blocks(GTBlocks.CASING_BRONZE_PIPE.get())) .where('D', blocks(GTBlocks.CASING_BRONZE_GEARBOX.get())) .where('A', blocks(GTBlocks.CASING_BRONZE_BRICKS.get()) @@ -1091,7 +1092,7 @@ public static void init() {} .block(GTBlocks.CASING_BRONZE_BRICKS) .pattern(definition -> MultiBlockFileReader.start(definition) .where('S', controller(definition)) - .where('B', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Bronze))) + .where('B', GTOPredicates.frame(GTMaterials.Bronze)) .where('C', blocks(GTBlocks.CASING_BRONZE_PIPE.get())) .where('E', blocks(GTBlocks.CASING_BRONZE_GEARBOX.get())) .where('F', abilities(MUFFLER)) @@ -1119,7 +1120,7 @@ public static void init() {} .block(GTBlocks.CASING_BRONZE_BRICKS) .pattern(definition -> MultiBlockFileReader.start(definition) .where('S', controller(definition)) - .where('C', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Bronze))) + .where('C', GTOPredicates.frame(GTMaterials.Bronze)) .where('D', blocks(GTBlocks.CASING_BRONZE_PIPE.get())) .where('A', blocks(GTBlocks.FIREBOX_BRONZE.get())) .where('E', abilities(MUFFLER)) @@ -1143,7 +1144,7 @@ public static void init() {} .block(GTBlocks.CASING_BRONZE_BRICKS) .pattern(definition -> MultiBlockFileReader.start(definition) .where('S', controller(definition)) - .where('B', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Bronze))) + .where('B', GTOPredicates.frame(GTMaterials.Bronze)) .where('C', blocks(Blocks.GLASS)) .where('D', blocks(ChemicalHelper.getBlock(TagPrefix.block, GTMaterials.Potin))) .where('A', blocks(GTBlocks.CASING_BRONZE_BRICKS.get()) @@ -1222,7 +1223,7 @@ public static void init() {} .or(abilities(STEAM_IMPORT_ITEMS).setMaxGlobalLimited(1).setPreviewCount(1)) .or(abilities(STEAM_EXPORT_ITEMS).setMaxGlobalLimited(1).setPreviewCount(1)) .or(abilities(GTOPartAbility.STEAM_IMPORT_FLUIDS).setMaxGlobalLimited(1).setPreviewCount(1))) - .where('C', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Bronze))) + .where('C', GTOPredicates.frame(GTMaterials.Bronze)) .where('D', blocks(GTBlocks.CASING_BRONZE_GEARBOX.get())) .where('E', blocks(GTBlocks.CASING_BRONZE_PIPE.get())) .where(' ', air()) @@ -1237,7 +1238,7 @@ public static void init() {} .steamOverclock() .block(GTBlocks.CASING_BRONZE_BRICKS) .pattern(definition -> MultiBlockFileReader.start(definition, RIGHT, UP, BACK) - .where('A', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Bronze))) + .where('A', GTOPredicates.frame(GTMaterials.Bronze)) .where('B', blocks(GTBlocks.CASING_BRONZE_BRICKS.get()) .or(abilities(STEAM).setExactLimit(1)) .or(blocks(GTOMachines.STEAM_VENT_HATCH.get()).setExactLimit(1)) @@ -1252,7 +1253,7 @@ public static void init() {} .where('G', blocks(GCYMBlocks.CASING_INDUSTRIAL_STEAM.get())) .where('H', blocks(Blocks.STONE_BRICKS)) .where('I', blocks(GTBlocks.CASING_BRONZE_PIPE.get())) - .where('J', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Steel))) + .where('J', GTOPredicates.frame(GTMaterials.Steel)) .where('K', controller(definition)) .where(' ', any()) .build()) @@ -1284,7 +1285,7 @@ public static void init() {} .where('C', blocks(GTBlocks.FIREBOX_STEEL.get())) .where('D', blocks(Blocks.STONE_BRICKS)) .where('E', blocks(GTBlocks.CASING_PRIMITIVE_BRICKS.get())) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Steel))) + .where('F', GTOPredicates.frame(GTMaterials.Steel)) .where('G', controller(definition)) .where('H', GTOPredicates.countBlock("SteelFrame", ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Steel))) .where(' ', any()) @@ -1304,7 +1305,7 @@ public static void init() {} .where('A', blocks(GCYMBlocks.CASING_STRESS_PROOF.get())) .where('B', blocks(GTOBlocks.SUPERCRITICAL_TURBINE_CASING.get())) .where('C', blocks(GTBlocks.CASING_STAINLESS_CLEAN.get())) - .where('D', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Steel))) + .where('D', GTOPredicates.frame(GTMaterials.Steel)) .where('E', blocks(GTOBlocks.OIL_GAS_TRANSPORTATION_PIPE_CASING.get())) .where('F', blocks(GTBlocks.CASING_TUNGSTENSTEEL_PIPE.get())) .where('G', blocks(GTOBlocks.PIKYONIUM_MACHINE_CASING.get())) @@ -1313,11 +1314,11 @@ public static void init() {} .or(GTOPredicates.autoLaserAbilities(definition.getRecipeTypes())) .or(abilities(ACCELERATE_HATCH).setMaxGlobalLimited(1))) .where('I', blocks(GCYMBlocks.CASING_WATERTIGHT.get())) - .where('J', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.NaquadahAlloy))) - .where('K', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Tungsten))) + .where('J', GTOPredicates.frame(GTMaterials.NaquadahAlloy)) + .where('K', GTOPredicates.frame(GTMaterials.Tungsten)) .where('L', blocks(GTBlocks.FUSION_GLASS.get())) .where('M', heatingCoils()) - .where('N', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.StainlessSteelGC4))) + .where('N', GTOPredicates.frame(GTOMaterials.StainlessSteelGC4)) .where('O', blocks(GTBlocks.COMPUTER_CASING.get())) .where('P', blocks(GTBlocks.COMPUTER_HEAT_VENT.get())) .where('R', blocks(GTBlocks.CASING_TITANIUM_PIPE.get())) @@ -1345,7 +1346,7 @@ public static void init() {} .where('D', blocks(GTOBlocks.TUNGSTEN_ALLOY_IMPACT_RESISTANT_MECHANICAL_BLOCK.get())) .where('E', blocks(GTOBlocks.STAINLESS_STEEL_CORROSION_RESISTANT_CASING.get())) .where('F', blocks(GTOBlocks.MACHINING_CONTROL_CASING_MK3.get())) - .where('G', blocks(GTOBlocks.TITANIUM_ALLOY_INTERNAL_FRAME.get())) + .where('G', blocks(GTOBlocks.TITANIUM_ALLOY_FRAME_INTERNAL.get())) .where('H', blocks(GTOBlocks.COOLANT_PIPE_CASING.get())) .where('I', blocks(GTOBlocks.ANTIFREEZE_HEATPROOF_MACHINE_CASING.get())) .where('J', blocks(GCYMBlocks.ELECTROLYTIC_CELL.get())) @@ -1431,7 +1432,7 @@ public static void init() {} .where('B', blocks(GTOBlocks.NAQUADAH_ALLOY_CASING.get())) .where('C', blocks(GTOBlocks.DIMENSION_INJECTION_CASING.get())) .where('D', blocks(GTOBlocks.NEUTRONIUM_STABLE_CASING.get())) - .where('E', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Naquadria))) + .where('E', GTOPredicates.frame(GTMaterials.Naquadria)) .where('F', blocks(GCYMBlocks.HEAT_VENT.get())) .where('G', blocks(GTOBlocks.NAQUADAH_REINFORCED_PLANT_CASING.get())) .where('H', blocks(GTOBlocks.IRIDIUM_CASING.get()) @@ -1446,7 +1447,7 @@ public static void init() {} .where('N', blocks(ChemicalHelper.getBlock(TagPrefix.block, GTOMaterials.Amprosium))) .where('O', blocks(GTOBlocks.AMPROSIUM_ACTIVE_CASING.get())) .where('P', blocks(GTOBlocks.OXIDATION_RESISTANT_HASTELLOY_N_MECHANICAL_CASING.get())) - .where('Q', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.HastelloyC276))) + .where('Q', GTOPredicates.frame(GTMaterials.HastelloyC276)) .where('R', blocks(GCYMBlocks.ELECTROLYTIC_CELL.get())) .where('S', controller(definition)) .where(' ', any()) @@ -1533,8 +1534,8 @@ public static void init() {} .where('D', blocks(GTOBlocks.PRESSURE_CONTAINMENT_CASING.get())) .where('E', blocks(GTBlocks.FUSION_GLASS.get())) .where('F', blocks(GTOBlocks.STRENGTHEN_THE_BASE_BLOCK.get())) - .where('G', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Trinaquadalloy))) - .where('H', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.BlackSteel))) + .where('G', GTOPredicates.frame(GTOMaterials.Trinaquadalloy)) + .where('H', GTOPredicates.frame(GTMaterials.BlackSteel)) .where('I', blocks(GCYMBlocks.ELECTROLYTIC_CELL.get())) .where('J', blocks(GTOBlocks.ELECTRON_PERMEABLE_AMPROSIUM_COATED_GLASS.get())) .where('K', blocks(GTOBlocks.AMPROSIUM_PIPE_CASING.get())) @@ -1625,13 +1626,13 @@ public static void init() {} .where('D', blocks(GTOBlocks.STRENGTHEN_THE_BASE_BLOCK.get())) .where('E', blocks(GTOBlocks.RHENIUM_REINFORCED_ENERGY_GLASS.get())) .where('F', blocks(GTOBlocks.DEGENERATE_RHENIUM_CONSTRAINED_CASING.get())) - .where('G', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.BabbittAlloy))) + .where('G', GTOPredicates.frame(GTOMaterials.BabbittAlloy)) .where('H', blocks(GTOBlocks.OXIDATION_RESISTANT_HASTELLOY_N_MECHANICAL_CASING.get())) .where('I', blocks(GTOBlocks.ACCELERATED_PIPELINE.get())) - .where('J', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Trinium))) + .where('J', GTOPredicates.frame(GTMaterials.Trinium)) .where('K', blocks(GTOBlocks.BOROSILICATE_GLASS.get())) .where('L', blocks(GTOBlocks.CONTAINMENT_FIELD_GENERATOR.get())) - .where('M', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Amprosium))) + .where('M', GTOPredicates.frame(GTOMaterials.Amprosium)) .where('N', blocks(GTOBlocks.AMPROSIUM_PIPE_CASING.get())) .where('O', blocks(GTOBlocks.RESTRAINT_DEVICE.get())) .where('P', heatingCoils()) @@ -1788,7 +1789,7 @@ public static void init() {} .where('C', blocks(GTOBlocks.AMPROSIUM_PIPE_CASING.get())) .where('D', blocks(GTOBlocks.PI_HIGH_TEMPERATURE_INSULATION_MECHANICAL_HOUSING.get())) .where('E', blocks(GTOBlocks.IRIDIUM_CASING.get())) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Inconel792))) + .where('F', GTOPredicates.frame(GTOMaterials.Inconel792)) .where('G', blocks(GTBlocks.FUSION_GLASS.get())) .where('H', blocks(GTOBlocks.IRIDIUM_CASING.get()) .or(GTOPredicates.autoIOAbilities(definition.getRecipeTypes()))) @@ -1841,7 +1842,7 @@ public static void init() {} .where('B', blocks(GTOBlocks.THREE_PROOF_COMPUTER_CASING.get())) .where('C', blocks(GTOBlocks.ENERGY_CONTROL_CASING_MK3.get())) .where('D', blocks(GTOBlocks.AMPROSIUM_BOROSILICATE_GLASS.get())) - .where('E', blocks(GTOBlocks.TITANIUM_ALLOY_INTERNAL_FRAME.get())) + .where('E', blocks(GTOBlocks.TITANIUM_ALLOY_FRAME_INTERNAL.get())) .where('F', blocks(GTBlocks.CASING_TUNGSTENSTEEL_ROBUST.get()) .or(abilities(INPUT_LASER).setMaxGlobalLimited(2)) .or(GTOPredicates.autoIOAbilities(definition.getRecipeTypes())) @@ -1849,7 +1850,7 @@ public static void init() {} .where('G', blocks(GTBlocks.HIGH_POWER_CASING.get())) .where('H', blocks(GTOBlocks.TUNGSTEN_ALLOY_RADIATION_SHIELDING_MECHANICAL_BLOCK.get())) .where('I', abilities(MUFFLER)) - .where('J', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.TungstenAlloyYG10))) + .where('J', GTOPredicates.frame(GTOMaterials.TungstenAlloyYG10)) .where('K', blocks(GTOBlocks.AMPROSIUM_PIPE_CASING.get())) .where('L', controller(definition)) .where(' ', any()) @@ -1870,7 +1871,7 @@ public static void init() {} .where('C', blocks(GCYMBlocks.CASING_ATOMIC.get()) .or(GTOPredicates.autoLaserAbilities(definition.getRecipeTypes())) .or(abilities(MAINTENANCE).setExactLimit(1))) - .where('D', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Trinium))) + .where('D', GTOPredicates.frame(GTMaterials.Trinium)) .where('E', blocks(GTOBlocks.ADVANCED_FUSION_COIL.get())) .where('F', blocks(GTOBlocks.RADIATION_ABSORBENT_CASING.get())) .where('G', blocks(GTOBlocks.HYPER_MECHANICAL_CASING.get())) @@ -1905,17 +1906,17 @@ public static void init() {} .where('B', blocks(GTBlocks.CASING_POLYTETRAFLUOROETHYLENE_PIPE.get())) .where('C', blocks(GTOBlocks.NAQUADAH_ALLOY_CASING.get())) .where('D', blocks(GCYMBlocks.CASING_NONCONDUCTING.get())) - .where('E', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.HastelloyN))) + .where('E', GTOPredicates.frame(GTOMaterials.HastelloyN)) .where('F', blocks(GTOBlocks.MOLECULAR_CASING.get())) .where('G', blocks(GTOBlocks.TITANIUM_NITRIDE_CERAMIC_IMPACT_RESISTANT_MECHANICAL_BLOCK.get())) .where('H', blocks(GTOBlocks.BORON_CARBIDE_CERAMIC_RADIATION_RESISTANT_MECHANICAL_CUBE.get())) .where('I', blocks(GTOBlocks.PRECISION_PROCESSING_MECHANICAL_CASING.get())) - .where('J', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.HSLASteel))) + .where('J', GTOPredicates.frame(GTMaterials.HSLASteel)) .where('K', blocks(GTOBlocks.IRIDIUM_CASING.get()) .or(abilities(PARALLEL_HATCH).setMaxGlobalLimited(1)) .or(abilities(MAINTENANCE).setExactLimit(1)) .or(GTOPredicates.autoThreadLaserAbilities(definition.getRecipeTypes()))) - .where('L', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Naquadria))) + .where('L', GTOPredicates.frame(GTMaterials.Naquadria)) .where('M', blocks(GTBlocks.CASING_EXTREME_ENGINE_INTAKE.get())) .where('N', blocks(GTOBlocks.OXIDATION_RESISTANT_HASTELLOY_N_MECHANICAL_CASING.get())) .where('O', blocks(GTBlocks.HERMETIC_CASING_LuV.get())) diff --git a/src/main/java/com/gtocore/common/data/machines/MultiBlockB.java b/src/main/java/com/gtocore/common/data/machines/MultiBlockB.java index d2be2cfd3..f04908d3e 100644 --- a/src/main/java/com/gtocore/common/data/machines/MultiBlockB.java +++ b/src/main/java/com/gtocore/common/data/machines/MultiBlockB.java @@ -84,14 +84,14 @@ public static void init() {} .where('B', blocks(GTOBlocks.OXIDATION_RESISTANT_HASTELLOY_N_MECHANICAL_CASING.get())) .where('C', blocks(GTOBlocks.PRESSURE_CONTAINMENT_CASING.get())) .where('D', blocks(GTOBlocks.IRIDIUM_CASING.get())) - .where('E', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Ruridit))) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) + .where('E', GTOPredicates.frame(GTMaterials.Ruridit)) + .where('F', GTOPredicates.frame(GTMaterials.StainlessSteel)) .where('G', blocks(GCYMBlocks.CASING_WATERTIGHT.get())) .where('H', blocks(GTBlocks.FUSION_GLASS.get())) .where('I', blocks(GTBlocks.HERMETIC_CASING_ZPM.get())) .where('J', blocks(GTBlocks.CASING_PTFE_INERT.get())) .where('K', heatingCoils()) - .where('L', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.NaquadahAlloy))) + .where('L', GTOPredicates.frame(GTMaterials.NaquadahAlloy)) .where('M', blocks(GCYMBlocks.CASING_CORROSION_PROOF.get())) .where('N', blocks(GTOBlocks.HASTELLOY_N_75_PIPE.get())) .where('O', blocks(GCYMBlocks.ELECTROLYTIC_CELL.get())) @@ -121,12 +121,12 @@ public static void init() {} .where('F', blocks(GTBlocks.HIGH_POWER_CASING.get())) .where('G', blocks(GTOBlocks.STAINLESS_STEEL_CORROSION_RESISTANT_CASING.get())) .where('H', blocks(GTOBlocks.COOLANT_PIPE_CASING.get())) - .where('I', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.StainlessSteelGC4))) + .where('I', GTOPredicates.frame(GTOMaterials.StainlessSteelGC4)) .where('J', blocks(GCYMBlocks.ELECTROLYTIC_CELL.get())) .where('K', blocks(GTOBlocks.TUNGSTEN_ALLOY_IMPACT_RESISTANT_MECHANICAL_BLOCK.get())) .where('L', blocks(GTOBlocks.LOAD_BEARING_STRUCTURAL_STEEL_MECHANICAL_BLOCK.get())) .where('M', blocks(GTOBlocks.INSULATION_TILE_MECHANICAL_BLOCK.get())) - .where('N', blocks(GTOBlocks.TITANIUM_ALLOY_INTERNAL_FRAME.get())) + .where('N', blocks(GTOBlocks.TITANIUM_ALLOY_FRAME_INTERNAL.get())) .where('O', blocks(GTOBlocks.COBALT_OXIDE_CERAMIC_STRONG_THERMALLY_CONDUCTIVE_MECHANICAL_BLOCK.get())) .where(' ', any()) .build()) @@ -136,7 +136,7 @@ public static void init() {} .nonYAxisRotation() .recipeTypes(DESULFURIZER_RECIPES) .coilParallelTooltips() - .moduleTooltips(OVERCLOCK_HATCH, THREAD_HATCH, INPUT_LASER) + .moduleTooltips(ACCELERATE_HATCH, OVERCLOCK_HATCH, THREAD_HATCH, INPUT_LASER) .multipleRecipesTooltips() .block(GTBlocks.CASING_STAINLESS_CLEAN) .pattern(definition -> FactoryBlockPattern.start(definition) @@ -175,7 +175,7 @@ public static void init() {} .aisle("MMMMM ", "OQOQO ", "OQKQO ", "OQOQO ", "OOOOO ", " ") .aisle(" KKKKKE ", " K EE J ", " K EE ", " ", " ", " ") .where('A', blocks(GTBlocks.CASING_INVAR_HEATPROOF.get())) - .where('B', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Inconel242))) + .where('B', GTOPredicates.frame(GTOMaterials.Inconel242)) .where('C', heatingCoils()) .where('D', blocks(GTOBlocks.IRIDIUM_PIPE_CASING.get())) .where('E', blocks(GTBlocks.CASING_STEEL_SOLID.get())) @@ -237,7 +237,7 @@ public static void init() {} .where('C', controller(definition)) .where('D', blocks(GTBlocks.CASING_STAINLESS_STEEL_GEARBOX.get())) .where('E', blocks(GTBlocks.CASING_STAINLESS_CLEAN.get())) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) + .where('F', GTOPredicates.frame(GTMaterials.StainlessSteel)) .where('G', blocks(GTBlocks.CASING_TITANIUM_PIPE.get())) .where(' ', any()) .build()) @@ -259,7 +259,7 @@ public static void init() {} .aisle(" ", "BBBBB", "BDCDB", "BDCDB", "BAAAB") .aisle("A A", "ABBBA", "BBCBB", "BBBBB", " BBB ") .where('~', controller(definition)) - .where('A', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Steel))) + .where('A', GTOPredicates.frame(GTMaterials.Steel)) .where('C', heatingCoils()) .where('D', blocks(GTBlocks.CASING_STEEL_PIPE.get())) .where('B', blocks(GTBlocks.CASING_STEEL_SOLID.get()) @@ -283,7 +283,7 @@ public static void init() {} .where('B', blocks(GTBlocks.CASING_PTFE_INERT.get())) .where('C', blocks(GTBlocks.CASING_POLYTETRAFLUOROETHYLENE_PIPE.get())) .where('D', blocks(GTBlocks.CASING_STEEL_SOLID.get())) - .where('E', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Steel))) + .where('E', GTOPredicates.frame(GTMaterials.Steel)) .where('F', blocks(GTBlocks.STEEL_HULL.get())) .where('G', controller(definition)) .where(' ', any()) @@ -313,7 +313,7 @@ public static void init() {} .where('H', controller(definition)) .where('I', blocks(GTOBlocks.CHEMICAL_CORROSION_RESISTANT_PIPE_CASING.get())) .where('J', blocks(GTOBlocks.IRIDIUM_CASING.get())) - .where('K', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.HastelloyN))) + .where('K', GTOPredicates.frame(GTOMaterials.HastelloyN)) .where('L', heatingCoils()) .where('M', blocks(GTOBlocks.CONTAINMENT_FIELD_GENERATOR.get())) .where(' ', any()) @@ -335,20 +335,20 @@ public static void init() {} .where('C', blocks(GTBlocks.CASING_TUNGSTENSTEEL_ROBUST.get())) .where('D', GTOPredicates.light()) .where('E', blocks(GCYMBlocks.CASING_WATERTIGHT.get())) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Steel))) + .where('F', GTOPredicates.frame(GTMaterials.Steel)) .where('G', blocks(GTOBlocks.HIGH_PRESSURE_PIPE_CASING.get())) .where('H', blocks(GTBlocks.CASING_PTFE_INERT.get())) - .where('I', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) + .where('I', GTOPredicates.frame(GTMaterials.StainlessSteel)) .where('J', blocks(GTBlocks.CASING_TITANIUM_PIPE.get())) - .where('K', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.HSLASteel))) + .where('K', GTOPredicates.frame(GTMaterials.HSLASteel)) .where('L', blocks(GTOBlocks.CHEMICAL_CORROSION_RESISTANT_PIPE_CASING.get())) - .where('M', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.BlackSteel))) + .where('M', GTOPredicates.frame(GTMaterials.BlackSteel)) .where('N', blocks(GTOBlocks.PPS_CORROSION_RESISTANT_MECHANICAL_HOUSING.get())) .where('O', blocks(GTOBlocks.IRIDIUM_CASING.get())) .where('P', blocks(GTBlocks.HIGH_POWER_CASING.get())) .where('Q', blocks(GTBlocks.CASING_TUNGSTENSTEEL_PIPE.get())) .where('R', blocks(GTOBlocks.HIGH_STRENGTH_SUPPORT_MECHANICAL_CASING.get())) - .where('S', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.WatertightSteel))) + .where('S', GTOPredicates.frame(GTMaterials.WatertightSteel)) .where('T', blocks(GTOBlocks.OIL_GAS_TRANSPORTATION_PIPE_CASING.get())) .where('U', blocks(GTBlocks.CASING_STAINLESS_CLEAN.get())) .where('V', blocks(GTOBlocks.CALCIUM_OXIDE_CERAMIC_ANTI_METAL_CORROSION_MECHANICAL_BLOCK.get())) @@ -376,10 +376,10 @@ public static void init() {} .or(Predicates.abilities(GTOPartAbility.OVERCLOCK_HATCH).setMaxGlobalLimited(1))) .where('E', blocks(GTOBlocks.STABLE_BASE_CASING.get())) .where('F', blocks(GTOBlocks.HIGH_PRESSURE_GAS_STORAGE_TANKS_CASING.get())) - .where('G', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.StainlessSteelJbk75))) + .where('G', GTOPredicates.frame(GTOMaterials.StainlessSteelJbk75)) .where('H', blocks(GTOBlocks.HIGH_PRESSURE_PIPE_CASING.get())) .where('I', blocks(GTOBlocks.PRESSURE_RESISTANT_HOUSING_MECHANICAL_BLOCK.get())) - .where('J', blocks(GTOBlocks.TITANIUM_ALLOY_INTERNAL_FRAME.get())) + .where('J', blocks(GTOBlocks.TITANIUM_ALLOY_FRAME_INTERNAL.get())) .where('K', blocks(GTOBlocks.SENSOR_PROTECTIVE_COVER_CASING.get())) .where('L', blocks(GTOBlocks.LOW_TEMPERATURE_FUEL_PIPE_CASING.get())) .where('M', blocks(GTOBlocks.LOAD_BEARING_STRUCTURAL_STEEL_MECHANICAL_BLOCK.get())) @@ -417,7 +417,7 @@ public static void init() {} .where('O', blocks(Blocks.SPONGE)) .where('P', blocks(GTOBlocks.HYPER_CORE.get())) .where('Q', blocks(GTOBlocks.HIGH_PRESSURE_PIPE_CASING.get())) - .where('R', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Naquadria))) + .where('R', GTOPredicates.frame(GTMaterials.Naquadria)) .where('S', blocks(GTOBlocks.AMPROSIUM_ACTIVE_CASING.get())) .where(' ', any()) .build()) @@ -437,11 +437,11 @@ public static void init() {} .or(GTOPredicates.autoThreadLaserAbilities(definition.getRecipeTypes())) .or(abilities(MAINTENANCE).setExactLimit(1))) .where('B', blocks(GTBlocks.CASING_PALLADIUM_SUBSTATION.get())) - .where('C', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.BlackSteel))) + .where('C', GTOPredicates.frame(GTMaterials.BlackSteel)) .where('D', blocks(GTOBlocks.NAQUADAH_ALLOY_CASING.get())) .where('E', blocks(GTOBlocks.LAFIUM_MECHANICAL_CASING.get())) .where('F', blocks(GTOBlocks.MOLECULAR_CASING.get())) - .where('G', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) + .where('G', GTOPredicates.frame(GTMaterials.StainlessSteel)) .where('H', blocks(GTBlocks.FUSION_GLASS.get())) .where('I', blocks(GTOBlocks.IRIDIUM_CASING.get())) .where('J', blocks(GTOBlocks.HYPER_CORE.get())) @@ -456,7 +456,7 @@ public static void init() {} .where(' ', any()) .build()) .onWorking(machine -> { - if (GTOConfig.INSTANCE.lightningRodEffect && machine.self().getLevel() instanceof ServerLevel serverLevel && machine.self().getOffsetTimer() % serverLevel.random.nextInt(20, 200) == 0) { + if (GTOConfig.INSTANCE.client.lightningRodEffect && machine.self().getLevel() instanceof ServerLevel serverLevel && machine.self().getOffsetTimer() % serverLevel.random.nextInt(20, 200) == 0) { LightningBolt entityToSpawn = EntityType.LIGHTNING_BOLT.create(serverLevel); if (entityToSpawn != null) { entityToSpawn.setPos(MachineUtils.getOffsetPos(9, 50, machine.self().getFrontFacing(), machine.self().getPos()).getCenter()); @@ -490,7 +490,7 @@ public static void init() {} .where('I', blocks(GTBlocks.CASING_PALLADIUM_SUBSTATION.get())) .where('J', blocks(GTOBlocks.AMPROSIUM_PIPE_CASING.get())) .where('K', blocks(GTBlocks.BATTERY_EMPTY_TIER_III.get())) - .where('L', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Neutronium))) + .where('L', GTOPredicates.frame(GTMaterials.Neutronium)) .where('M', blocks(GCYMBlocks.CASING_NONCONDUCTING.get())) .where('N', blocks(GTOBlocks.RESTRAINT_DEVICE.get())) .where('O', blocks(GTBlocks.FUSION_GLASS.get())) @@ -551,14 +551,14 @@ public static void init() {} .where('D', blocks(GTBlocks.HIGH_POWER_CASING.get())) .where('E', blocks(GTBlocks.FUSION_GLASS.get())) .where('F', blocks(GTBlocks.FILTER_CASING.get())) - .where('G', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.HastelloyN))) + .where('G', GTOPredicates.frame(GTOMaterials.HastelloyN)) .where('H', blocks(GTOBlocks.AMPROSIUM_GEARBOX.get())) .where('I', blocks(GTOBlocks.PRESSURE_CONTAINMENT_CASING.get())) .where('J', blocks(GTOBlocks.AMPROSIUM_ACTIVE_CASING.get())) .where('K', blocks(GTBlocks.CASING_TEMPERED_GLASS.get())) .where('L', blocks(GTOBlocks.PRECISION_PROCESSING_MECHANICAL_CASING.get())) .where('M', blocks(GTOBlocks.EXTREME_DENSITY_CASING.get())) - .where('N', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Amprosium))) + .where('N', GTOPredicates.frame(GTOMaterials.Amprosium)) .where('O', blocks(GTOBlocks.CONTAINMENT_FIELD_GENERATOR.get())) .where('P', blocks(GTOBlocks.AMPROSIUM_PIPE_CASING.get())) .where('Q', blocks(GTBlocks.CASING_STAINLESS_TURBINE.get())) @@ -608,7 +608,7 @@ public static void init() {} .where('U', blocks(GTOBlocks.HYPER_CORE.get())) .where('V', blocks(GTOBlocks.QUANTUM_GLASS.get())) .where('W', blocks(GTOBlocks.HIGH_PRESSURE_PIPE_CASING.get())) - .where('X', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Ultimet))) + .where('X', GTOPredicates.frame(GTMaterials.Ultimet)) .where('Y', blocks(GTOBlocks.OXIDATION_RESISTANT_HASTELLOY_N_MECHANICAL_CASING.get())) .where('Z', blocks(GCYMBlocks.HEAT_VENT.get())) .where('a', blocks(GTOBlocks.NAQUADAH_REINFORCED_PLANT_CASING.get()) @@ -671,7 +671,7 @@ public static void init() {} .where('F', blocks(GTOBlocks.NAQUADAH_REINFORCED_PLANT_CASING.get()) .or(GTOPredicates.autoIOAbilities(definition.getRecipeTypes()))) .where('G', blocks(GTOBlocks.ECHO_CASING.get())) - .where('H', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Ultimet))) + .where('H', GTOPredicates.frame(GTMaterials.Ultimet)) .where('I', blocks(GTOBlocks.HIGH_PRESSURE_PIPE_CASING.get())) .where('J', blocks(GTOBlocks.INCONEL_625_GEARBOX.get())) .where('K', blocks(GTOBlocks.IRIDIUM_PIPE_CASING.get())) @@ -696,7 +696,7 @@ public static void init() {} .where('D', blocks(GTOBlocks.NAQUADAH_ALLOY_CASING.get())) .where('E', blocks(GTOBlocks.OXIDATION_RESISTANT_HASTELLOY_N_MECHANICAL_CASING.get())) .where('F', blocks(GTOBlocks.HIGH_STRENGTH_SUPPORT_SPINDLE.get())) - .where('G', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Amprosium))) + .where('G', GTOPredicates.frame(GTOMaterials.Amprosium)) .where('H', blocks(ChemicalHelper.getBlock(TagPrefix.block, GTOMaterials.Amprosium))) .where('I', blocks(GTOBlocks.HIGH_STRENGTH_SPACE_ELEVATOR_CABLE.get())) .where('J', blocks(GTOBlocks.AMPROSIUM_GEARBOX.get())) @@ -709,9 +709,9 @@ public static void init() {} .where('Q', blocks(GTOBlocks.MODULE_CONNECTOR.get())) .where('R', blocks(GTOBlocks.SPACE_ELEVATOR_MODULE_BASE.get())) .where('S', blocks(GTOBlocks.ZIRCONIA_CERAMIC_HIGH_STRENGTH_BENDING_RESISTANCE_MECHANICAL_BLOCK.get())) - .where('T', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Naquadria))) + .where('T', GTOPredicates.frame(GTMaterials.Naquadria)) .where('U', blocks(GTOBlocks.HYPER_CORE.get())) - .where('V', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.BlackSteel))) + .where('V', GTOPredicates.frame(GTMaterials.BlackSteel)) .where('W', blocks(GTOBlocks.RHENIUM_REINFORCED_ENERGY_GLASS.get())) .where('X', blocks(GTOBlocks.CHEMICAL_CORROSION_RESISTANT_PIPE_CASING.get())) .where('Y', blocks(GCYMBlocks.CASING_NONCONDUCTING.get())) @@ -721,22 +721,22 @@ public static void init() {} .where(']', blocks(GTOBlocks.TITANIUM_NITRIDE_CERAMIC_IMPACT_RESISTANT_MECHANICAL_BLOCK.get())) .where('^', blocks(GTOBlocks.QUANTUM_GLASS.get())) .where('_', blocks(GTOBlocks.MOLECULAR_CASING.get())) - .where('`', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Tungsten))) + .where('`', GTOPredicates.frame(GTMaterials.Tungsten)) .where('a', blocks(GTBlocks.ADVANCED_COMPUTER_CASING.get())) .where('b', blocks(GTBlocks.HIGH_POWER_CASING.get())) - .where('c', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.TungstenSteel))) + .where('c', GTOPredicates.frame(GTMaterials.TungstenSteel)) .where('d', blocks(GTOBlocks.AMPROSIUM_ACTIVE_CASING.get())) .where('e', blocks(GTOBlocks.DYSON_CONTROL_CASING.get())) .where('f', blocks(GTOBlocks.COBALT_OXIDE_CERAMIC_STRONG_THERMALLY_CONDUCTIVE_MECHANICAL_BLOCK.get())) - .where('g', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.HastelloyX))) + .where('g', GTOPredicates.frame(GTMaterials.HastelloyX)) .where('h', blocks(GTOBlocks.ANTIFREEZE_HEATPROOF_MACHINE_CASING.get())) .where('i', blocks(GTOBlocks.SPEEDING_PIPE.get())) .where('j', blocks(GCYMBlocks.ELECTROLYTIC_CELL.get())) - .where('l', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.HastelloyN))) + .where('l', GTOPredicates.frame(GTOMaterials.HastelloyN)) .where('m', blocks(GTOBlocks.NEUTRONIUM_STABLE_CASING.get())) .where('n', blocks(GTOBlocks.BORON_CARBIDE_CERAMIC_RADIATION_RESISTANT_MECHANICAL_CUBE.get())) .where('o', GTOPredicates.tierBlock(SEPMMAP, POWER_MODULE_TIER)) - .where('p', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Naquadah))) + .where('p', GTOPredicates.frame(GTMaterials.Naquadah)) .where('q', blocks(GTBlocks.CASING_TUNGSTENSTEEL_PIPE.get())) .where('r', blocks(GTOBlocks.PRESSURE_CONTAINMENT_CASING.get())) .where('s', blocks(GTOBlocks.HIGH_PRESSURE_PIPE_CASING.get())) @@ -769,12 +769,12 @@ public static void init() {} .or(GTOPredicates.autoThreadLaserAbilities(definition.getRecipeTypes())) .or(abilities(PARALLEL_HATCH).setMaxGlobalLimited(1)) .or(abilities(MAINTENANCE).setExactLimit(1))) - .where('E', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.HSLASteel))) + .where('E', GTOPredicates.frame(GTMaterials.HSLASteel)) .where('F', blocks(GTBlocks.CASING_POLYTETRAFLUOROETHYLENE_PIPE.get())) .where('G', blocks(GTOBlocks.FLOCCULATION_CASING.get())) .where('H', controller(definition)) .where('I', blocks(GTBlocks.CASING_TUNGSTENSTEEL_GEARBOX.get())) - .where('J', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Naquadria))) + .where('J', GTOPredicates.frame(GTMaterials.Naquadria)) .where('K', blocks(GTOBlocks.AMPROSIUM_PIPE_CASING.get())) .where('L', blocks(GTOBlocks.LASER_CASING.get())) .where('M', blocks(GTOBlocks.CHEMICAL_GRADE_GLASS.get())) @@ -803,7 +803,7 @@ public static void init() {} .where('G', blocks(GTBlocks.CASING_STAINLESS_CLEAN.get())) .where('H', heatingCoils()) .where('I', blocks(GTBlocks.CASING_TUNGSTENSTEEL_PIPE.get())) - .where('J', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Tungsten))) + .where('J', GTOPredicates.frame(GTMaterials.Tungsten)) .where('K', blocks(GTBlocks.COMPUTER_CASING.get())) .where('L', blocks(GTBlocks.COMPUTER_HEAT_VENT.get())) .where('M', blocks(GTBlocks.HIGH_POWER_CASING.get())) @@ -842,7 +842,7 @@ public static void init() {} .where('H', blocks(GTOBlocks.PRESSURE_CONTAINMENT_CASING.get())) .where('I', blocks(GTOBlocks.AMPROSIUM_GEARBOX.get())) .where('J', blocks(GTBlocks.CASING_GRATE.get())) - .where('K', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.HastelloyN))) + .where('K', GTOPredicates.frame(GTOMaterials.HastelloyN)) .where(' ', any()) .build()) .workableCasingRenderer(GTOCore.id("block/casings/iridium_casing"), GTCEu.id("block/multiblock/cleanroom")) @@ -861,11 +861,11 @@ public static void init() {} .where('B', blocks(GTOBlocks.NAQUADAH_ALLOY_CASING.get())) .where('C', blocks(GTOBlocks.IRIDIUM_CASING.get())) .where('D', blocks(GTOBlocks.PRESSURE_CONTAINMENT_CASING.get())) - .where('E', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.IncoloyMA956))) + .where('E', GTOPredicates.frame(GTMaterials.IncoloyMA956)) .where('F', blocks(GTOBlocks.IRIDIUM_PIPE_CASING.get())) .where('G', abilities(MUFFLER)) .where('H', blocks(GTBlocks.CASING_TUNGSTENSTEEL_PIPE.get())) - .where('I', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.DepletedUraniumAlloy))) + .where('I', GTOPredicates.frame(GTOMaterials.DepletedUraniumAlloy)) .where('J', blocks(GTOBlocks.HIGH_PRESSURE_RESISTANT_CASING.get())) .where('K', blocks(GTOBlocks.IRIDIUM_GEARBOX.get())) .where('L', blocks(GTOBlocks.INCONEL_625_PIPE.get())) @@ -893,7 +893,7 @@ public static void init() {} .block(GTOBlocks.STERILE_WATER_PLANT_CASING) .pattern(definition -> MultiBlockFileReader.start(definition) .where('~', controller(definition)) - .where('B', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Tungsten))) + .where('B', GTOPredicates.frame(GTMaterials.Tungsten)) .where('C', blocks(GTOBlocks.STERILE_WATER_PLANT_CASING.get())) .where('a', blocks(GTOBlocks.STERILE_WATER_PLANT_CASING.get()) .or(abilities(INPUT_LASER).setMaxGlobalLimited(1)) @@ -924,7 +924,7 @@ public static void init() {} .where('D', blocks(GTBlocks.CASING_POLYTETRAFLUOROETHYLENE_PIPE.get())) .where('E', air()) .where('F', blocks(GTOBlocks.STERILE_WATER_PLANT_CASING.get())) - .where('G', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) + .where('G', GTOPredicates.frame(GTMaterials.StainlessSteel)) .where('H', blocks(GTBlocks.FILTER_CASING.get())) .where(' ', any()) .build()) @@ -945,7 +945,7 @@ public static void init() {} .where('A', blocks(GTOBlocks.OZONE_CASING.get()) .or(abilities(IMPORT_FLUIDS).setMaxGlobalLimited(2).setPreviewCount(1)) .or(abilities(EXPORT_FLUIDS).setMaxGlobalLimited(2).setPreviewCount(1))) - .where('C', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.HSSE))) + .where('C', GTOPredicates.frame(GTMaterials.HSSE)) .where('D', blocks(GTOBlocks.CHEMICAL_GRADE_GLASS.get())) .where('F', blocks(GTBlocks.CASING_POLYTETRAFLUOROETHYLENE_PIPE.get())) .where(' ', any()) diff --git a/src/main/java/com/gtocore/common/data/machines/MultiBlockC.java b/src/main/java/com/gtocore/common/data/machines/MultiBlockC.java index fe1950800..899e152d7 100644 --- a/src/main/java/com/gtocore/common/data/machines/MultiBlockC.java +++ b/src/main/java/com/gtocore/common/data/machines/MultiBlockC.java @@ -93,7 +93,6 @@ public static void init() {} public static final MultiblockMachineDefinition STEAM_CRACKER = multiblock("steam_cracker", "蒸汽裂化机", LargeSteamCracker::new) .nonYAxisRotation() .recipeTypes(GTORecipeTypes.STEAM_CRACKING_RECIPES) - .steamOverclock() .tooltips(GTOMachineTooltipsA.INSTANCE.getLargeSteamCrackerTooltips().getSupplier()) .block(GTBlocks.CASING_BRONZE_BRICKS) .pattern(definition -> MultiBlockFileReader.start(definition, RelativeDirection.RIGHT, RelativeDirection.UP, RelativeDirection.BACK) @@ -127,7 +126,7 @@ public static void init() {} .or(abilities(EXPORT_ITEMS).setMaxGlobalLimited(3))) .where('C', blocks(GTBlocks.CASING_BRONZE_BRICKS.get())) .where('D', blocks(GTBlocks.BRONZE_HULL.get())) - .where('E', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Bronze))) + .where('E', GTOPredicates.frame(GTMaterials.Bronze)) .where('F', blocks(GTBlocks.CASING_BRONZE_GEARBOX.get())) .where('G', controller(definition)) .where(' ', any()) @@ -144,7 +143,7 @@ public static void init() {} .block(GTBlocks.CASING_BRONZE_BRICKS) .pattern(definition -> MultiBlockFileReader.start(definition) .where('~', controller(definition)) - .where('A', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Bronze))) + .where('A', GTOPredicates.frame(GTMaterials.Bronze)) .where('B', blocks(GTBlocks.CASING_BRONZE_BRICKS.get())) .where('C', blocks(GTBlocks.CASING_BRONZE_GEARBOX.get())) .where('D', blocks(GTBlocks.CASING_BRONZE_PIPE.get())) @@ -184,7 +183,7 @@ public static void init() {} .where('D', blocks(GTBlocks.CASING_TUNGSTENSTEEL_ROBUST.get())) .where('E', blocks(GCYMBlocks.MOLYBDENUM_DISILICIDE_COIL_BLOCK.get())) .where('F', blocks(GTBlocks.STEEL_HULL.get())) - .where('G', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) + .where('G', GTOPredicates.frame(GTMaterials.StainlessSteel)) .where('H', blocks(GTBlocks.CASING_TITANIUM_PIPE.get())) .where('a', blocks(GTBlocks.CASING_PTFE_INERT.get()) .or(autoAbilities(definition.getRecipeTypes())) @@ -210,7 +209,7 @@ public static void init() {} .aisle(" ", " A I ", " AA ", " A ", " ", " ", " A ", " AA ", " A ", " ", " ", " ", " ", " ", " ", " ", " ") .where('A', blocks(GTOBlocks.NAQUADAH_ALLOY_CASING.get())) .where('B', blocks(GTOBlocks.TUNGSTEN_ALLOY_RADIATION_SHIELDING_MECHANICAL_BLOCK.get())) - .where('C', blocks(GTOBlocks.TITANIUM_ALLOY_INTERNAL_FRAME.get())) + .where('C', blocks(GTOBlocks.TITANIUM_ALLOY_FRAME_INTERNAL.get())) .where('D', blocks(GTOBlocks.IMPROVED_SUPERCONDUCTOR_COIL.get())) .where('E', blocks(GTBlocks.CASING_PTFE_INERT.get())) .where('F', blocks(GTOBlocks.THREE_PROOF_COMPUTER_CASING.get())) @@ -243,11 +242,11 @@ public static void init() {} .or(GTOPredicates.autoThreadLaserAbilities(definition.getRecipeTypes())) .or(abilities(MAINTENANCE))) .where('B', blocks(GTOBlocks.HIGH_PRESSURE_PIPE_CASING.get())) - .where('D', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Naquadah))) + .where('D', GTOPredicates.frame(GTMaterials.Naquadah)) .where('E', blocks(GTOBlocks.NAQUADAH_ALLOY_CASING.get())) .where('F', blocks(GCYMBlocks.CASING_HIGH_TEMPERATURE_SMELTING.get())) .where('G', blocks(GCYMBlocks.HEAT_VENT.get())) - .where('H', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.TungstenSteel))) + .where('H', GTOPredicates.frame(GTMaterials.TungstenSteel)) .where('I', blocks(GTOBlocks.AMPROSIUM_PIPE_CASING.get())) .where('J', blocks(GTOBlocks.HSSS_BOROSILICATE_GLASS.get())) .where('K', blocks(GTBlocks.STEEL_HULL.get())) @@ -287,10 +286,10 @@ public static void init() {} .where('E', blocks(GTOBlocks.OXIDATION_RESISTANT_HASTELLOY_N_MECHANICAL_CASING.get())) .where('F', blocks(GTBlocks.CASING_GRATE.get())) .where('G', blocks(GTBlocks.CASING_TUNGSTENSTEEL_PIPE.get())) - .where('H', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Naquadah))) + .where('H', GTOPredicates.frame(GTMaterials.Naquadah)) .where('I', blocks(GTOBlocks.HIGH_PRESSURE_PIPE_CASING.get())) .where('J', blocks(GTOBlocks.NAQUADAH_ALLOY_CASING.get())) - .where('K', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.HastelloyN))) + .where('K', GTOPredicates.frame(GTOMaterials.HastelloyN)) .where('L', blocks(GTOBlocks.AMPROSIUM_PIPE_CASING.get())) .where('M', heatingCoils()) .where('N', abilities(MUFFLER)) @@ -298,7 +297,7 @@ public static void init() {} .where('P', blocks(GCYMBlocks.ELECTROLYTIC_CELL.get())) .where('Q', blocks(GTBlocks.CASING_EXTREME_ENGINE_INTAKE.get())) .where('S', blocks(GTOBlocks.OIL_GAS_TRANSPORTATION_PIPE_CASING.get())) - .where('T', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.TungstenSteel))) + .where('T', GTOPredicates.frame(GTMaterials.TungstenSteel)) .where('U', blocks(GTBlocks.HERMETIC_CASING_ZPM.get())) .where(' ', any()) .build()) @@ -329,7 +328,7 @@ public static void init() {} .where('E', blocks(GTBlocks.STEEL_HULL.get())) .where('F', GTOPredicates.tierBlock(CALMAP, COMPONENT_ASSEMBLY_CASING_TIER)) .where('G', blocks(GTOBlocks.MULTI_FUNCTIONAL_CASING.get())) - .where('H', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Steel))) + .where('H', GTOPredicates.frame(GTMaterials.Steel)) .where('I', blocks(Blocks.IRON_BARS)) .where('J', blocks(GTBlocks.CASING_STEEL_GEARBOX.get())) .where(' ', any()) @@ -358,7 +357,7 @@ public static void init() {} .where('F', blocks(GTBlocks.STEEL_HULL.get())) .where('G', blocks(GTBlocks.CASING_ASSEMBLY_LINE.get())) .where('H', blocks(GTBlocks.CASING_GRATE.get())) - .where('I', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Trinium))) + .where('I', GTOPredicates.frame(GTMaterials.Trinium)) .where('J', blocks(GTOBlocks.PROCESS_MACHINE_CASING.get())) .where('K', blocks(GTOBlocks.OXIDATION_RESISTANT_HASTELLOY_N_MECHANICAL_CASING.get())) .where('L', blocks(GTOBlocks.TITANIUM_NITRIDE_CERAMIC_IMPACT_RESISTANT_MECHANICAL_BLOCK.get())) @@ -393,7 +392,7 @@ public static void init() {} .aisle(" H ", " ", " ", " ", " ", " ") .where('A', blocks(GCYMBlocks.CASING_NONCONDUCTING.get())) .where('B', blocks(GTOBlocks.THREE_PROOF_COMPUTER_CASING.get())) - .where('C', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.CarbonFiberPolyphenyleneSulfideComposite))) + .where('C', GTOPredicates.frame(GTOMaterials.CarbonFiberPolyphenyleneSulfideComposite)) .where('D', blocks(GTBlocks.CASING_STEEL_SOLID.get()) .or(abilities(INPUT_LASER).setMaxGlobalLimited(2)) .or(abilities(PARALLEL_HATCH).setMaxGlobalLimited(1))) @@ -420,7 +419,7 @@ public static void init() {} .or(autoAbilities(true, false, true))) .where('B', blocks(GTBlocks.CASING_STAINLESS_CLEAN.get())) .where('C', blocks(GTBlocks.CASING_TITANIUM_STABLE.get())) - .where('D', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) + .where('D', GTOPredicates.frame(GTMaterials.StainlessSteel)) .where('E', blocks(GTBlocks.CASING_TEMPERED_GLASS.get())) .where('F', blocks(GTOBlocks.MULTI_FUNCTIONAL_CASING.get())) .where('G', blocks(Blocks.IRON_BARS)) @@ -445,7 +444,7 @@ public static void init() {} .where('C', blocks(GTOBlocks.DIMENSION_INJECTION_CASING.get())) .where('D', blocks(GTOBlocks.TITANIUM_NITRIDE_CERAMIC_IMPACT_RESISTANT_MECHANICAL_BLOCK.get())) .where('E', blocks(GTOBlocks.HIGH_PRESSURE_RESISTANT_CASING.get())) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.HastelloyC276))) + .where('F', GTOPredicates.frame(GTMaterials.HastelloyC276)) .where('G', blocks(GTOBlocks.PRESSURE_CONTAINMENT_CASING.get())) .where('H', blocks(GTBlocks.FUSION_GLASS.get())) .where('I', blocks(GTOBlocks.DIMENSION_INJECTION_CASING.get()) @@ -469,7 +468,7 @@ public static void init() {} .multipleRecipesTooltips() .block(GTOBlocks.PRESSURE_CONTAINMENT_CASING) .pattern(definition -> MultiBlockFileReader.start(definition, RelativeDirection.RIGHT, RelativeDirection.UP, RelativeDirection.BACK) - .where('A', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Tungsten))) + .where('A', GTOPredicates.frame(GTMaterials.Tungsten)) .where('B', blocks(GTOBlocks.PRESSURE_CONTAINMENT_CASING.get())) .where('C', blocks(GTOBlocks.PRESSURE_CONTAINMENT_CASING.get()) .or(GTOPredicates.autoThreadLaserAbilities(definition.getRecipeTypes())) @@ -499,10 +498,10 @@ public static void init() {} .block(GTOBlocks.NAQUADAH_ALLOY_CASING) .pattern(definition -> MultiBlockFileReader.start(definition, RelativeDirection.RIGHT, RelativeDirection.UP, RelativeDirection.BACK) .where('A', blocks(GTOBlocks.STRENGTHEN_THE_BASE_BLOCK.get())) - .where('B', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Ultimet))) - .where('C', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.HastelloyC276))) + .where('B', GTOPredicates.frame(GTMaterials.Ultimet)) + .where('C', GTOPredicates.frame(GTMaterials.HastelloyC276)) .where('D', blocks(GTOBlocks.NAQUADAH_ALLOY_CASING.get())) - .where('E', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) + .where('E', GTOPredicates.frame(GTMaterials.StainlessSteel)) .where('F', GTOPredicates.absBlocks()) .where('G', blocks(GTOBlocks.PRESSURE_CONTAINMENT_CASING.get())) .where('H', blocks(GTBlocks.CASING_GRATE.get())) @@ -593,7 +592,7 @@ public static void init() {} .where('H', blocks(GTOBlocks.SPS_CASING.get())) .where('I', blocks(GTOBlocks.DIMENSIONAL_BRIDGE_CASING.get())) .where('J', blocks(GTOBlocks.SHIELDED_ACCELERATOR.get())) - .where('K', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Adamantium))) + .where('K', GTOPredicates.frame(GTOMaterials.Adamantium)) .where('L', blocks(GTOBlocks.QUANTUM_GLASS.get())) .where('M', blocks(GTOBlocks.SPEEDING_PIPE.get())) .where('N', blocks(GTOBlocks.QUARK_PIPE.get())) @@ -614,7 +613,7 @@ public static void init() {} .where('B', blocks(GTOBlocks.DIMENSION_INJECTION_CASING.get())) .where('C', blocks(GTOBlocks.ADVANCED_FUSION_COIL.get())) .where('D', blocks(GTOBlocks.DIMENSIONALLY_TRANSCENDENT_CASING.get())) - .where('E', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.HastelloyN))) + .where('E', GTOPredicates.frame(GTOMaterials.HastelloyN)) .where('F', blocks(GTOBlocks.HYPER_CORE.get())) .where('G', blocks(GTOBlocks.NAQUADAH_REINFORCED_PLANT_CASING.get())) .where('H', blocks(GTOBlocks.SHIELDED_ACCELERATOR.get())) @@ -638,7 +637,7 @@ public static void init() {} .parallelizableOverclock() .block(GTBlocks.CASING_STAINLESS_CLEAN) .pattern(definition -> MultiBlockFileReader.start(definition) - .where('A', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.HastelloyN))) + .where('A', GTOPredicates.frame(GTOMaterials.HastelloyN)) .where('B', blocks(GTOBlocks.CHEMICAL_GRADE_GLASS.get())) .where('C', blocks(GTBlocks.CASING_STAINLESS_CLEAN.get())) .where('D', blocks(GTBlocks.FILTER_CASING.get())) @@ -673,7 +672,7 @@ public static void init() {} .where('C', blocks(GTBlocks.CLEANROOM_GLASS.get())) .where('D', blocks(GTBlocks.FILTER_CASING_STERILE.get())) .where('E', blocks(GTBlocks.FILTER_CASING.get())) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.HastelloyN))) + .where('F', GTOPredicates.frame(GTOMaterials.HastelloyN)) .where('G', blocks(GTBlocks.CASING_GRATE.get())) .where('H', blocks(GTBlocks.CASING_POLYTETRAFLUOROETHYLENE_PIPE.get())) .where('a', blocks(GTBlocks.CASING_STAINLESS_CLEAN.get()) @@ -786,7 +785,7 @@ public static void init() {} .where('A', blocks(GTOBlocks.HIGH_STRENGTH_CONCRETE.get())) .where('B', blocks(GTBlocks.CASING_GRATE.get())) .where('C', blocks(GTBlocks.CASING_ASSEMBLY_LINE.get())) - .where('D', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Polytetrafluoroethylene))) + .where('D', GTOPredicates.frame(GTMaterials.Polytetrafluoroethylene)) .where('E', blocks(GTOBlocks.NAQUADAH_ALLOY_CASING.get())) .where('F', blocks(GTOBlocks.PRESSURE_CONTAINMENT_CASING.get())) .where('G', blocks(GTBlocks.FUSION_GLASS.get())) @@ -867,7 +866,7 @@ public static void init() {} .where('G', abilities(EXPORT_FLUIDS).or(blocks(CustomMachines.ME_EXPORT_BUFFER.get(), GTAEMachines.FLUID_EXPORT_HATCH_ME.get()))) .where('H', blocks(GTOBlocks.RESTRAINT_DEVICE.get())) .where('I', blocks(GTOBlocks.AMPROSIUM_GEARBOX.get())) - .where('J', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Amprosium))) + .where('J', GTOPredicates.frame(GTOMaterials.Amprosium)) .where('K', blocks(GTOBlocks.DIMENSIONAL_BRIDGE_CASING.get())) .where('L', blocks(GTOBlocks.MACHINE_CASING_GRINDING_HEAD.get())) .where('M', blocks(ChemicalHelper.getBlock(TagPrefix.block, GTMaterials.Vanadium))) diff --git a/src/main/java/com/gtocore/common/data/machines/MultiBlockD.java b/src/main/java/com/gtocore/common/data/machines/MultiBlockD.java index 9c6923564..a460338b0 100644 --- a/src/main/java/com/gtocore/common/data/machines/MultiBlockD.java +++ b/src/main/java/com/gtocore/common/data/machines/MultiBlockD.java @@ -134,7 +134,7 @@ public static void init() {} .where('A', blocks(GTOBlocks.COSMIC_DETECTION_RECEIVER_MATERIAL_RAY_ABSORBING_ARRAY.get())) .where('B', blocks(GTOBlocks.NAQUADAH_REINFORCED_PLANT_CASING.get())) .where('C', blocks(GTOBlocks.HIGH_PRESSURE_RESISTANT_CASING.get())) - .where('D', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Neutronium))) + .where('D', GTOPredicates.frame(GTMaterials.Neutronium)) .where('E', blocks(GCYMBlocks.CASING_ATOMIC.get())) .where('F', blocks(GTOBlocks.HYPER_MECHANICAL_CASING.get())) .where('G', blocks(GTOBlocks.NEUTRONIUM_STABLE_CASING.get())) @@ -142,7 +142,7 @@ public static void init() {} .where('I', blocks(GCYMBlocks.HEAT_VENT.get())) .where('J', blocks(GTOBlocks.ANTIFREEZE_HEATPROOF_MACHINE_CASING.get())) .where('K', blocks(GTBlocks.HIGH_POWER_CASING.get())) - .where('L', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.BlackTitanium))) + .where('L', GTOPredicates.frame(GTOMaterials.BlackTitanium)) .where('M', blocks(GTOBlocks.AMPROSIUM_ACTIVE_CASING.get())) .where('b', blocks(GCYMBlocks.CASING_ATOMIC.get()) .or(autoAbilities(definition.getRecipeTypes())) @@ -168,7 +168,7 @@ public static void init() {} .where('B', blocks(GTOBlocks.DIMENSIONALLY_TRANSCENDENT_CASING.get()) .or(abilities(PARALLEL_HATCH).setMaxGlobalLimited(1)) .or(GTOPredicates.autoThreadLaserAbilities(definition.getRecipeTypes()))) - .where('C', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Amprosium))) + .where('C', GTOPredicates.frame(GTOMaterials.Amprosium)) .where('D', blocks(GTOBlocks.SPS_CASING.get())) .where('E', GTOPredicates.absBlocks()) .where('F', blocks(GTOBlocks.STRONTIUM_CARBONATE_CERAMIC_RAY_ABSORBING_MECHANICAL_CUBE.get())) @@ -176,7 +176,7 @@ public static void init() {} .where('H', blocks(GTOBlocks.DIMENSIONALLY_TRANSCENDENT_CASING.get())) .where('I', blocks(GTBlocks.HIGH_POWER_CASING.get())) .where('J', blocks(GTOBlocks.MOLECULAR_COIL.get())) - .where('K', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Naquadria))) + .where('K', GTOPredicates.frame(GTMaterials.Naquadria)) .where('L', blocks(GTOBlocks.HYPER_CORE.get())) .where('M', blocks(GTOBlocks.DIMENSIONAL_BRIDGE_CASING.get())) .where('N', blocks(GTOBlocks.ABS_ORANGE_CASING.get())) @@ -332,7 +332,7 @@ public static void init() {} public static final MultiblockMachineDefinition COLD_ICE_FREEZER = multiblock("cold_ice_freezer", "寒冰冷冻机", ColdIceFreezerMachine::new) .allRotation() - .moduleTooltips(new PartAbility[] { GTOPartAbility.ACCELERATE_HATCH }, new RecipeType[] { ATOMIZATION_CONDENSATION_RECIPES }) + .moduleTooltips(new PartAbility[] { ACCELERATE_HATCH, EXTRA_ENERGY_HATCH }, new RecipeType[] { ATOMIZATION_CONDENSATION_RECIPES }) .disabledCombined() .recipeTypes(GTRecipeTypes.VACUUM_RECIPES, ATOMIZATION_CONDENSATION_RECIPES) .durationMultiplierTooltips(0.5) @@ -357,7 +357,7 @@ public static void init() {} .or(abilities(MAINTENANCE).setExactLimit(1))) .where('C', blocks(GTOBlocks.COLD_ICE_CASING.get())) .where('D', blocks(GTBlocks.CASING_TEMPERED_GLASS.get())) - .where('E', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Aluminium))) + .where('E', GTOPredicates.frame(GTMaterials.Aluminium)) .where('F', blocks(GTBlocks.CASING_TUNGSTENSTEEL_PIPE.get())) .where('G', controller(definition)) .where('H', abilities(MUFFLER)) @@ -379,7 +379,7 @@ public static void init() {} .or(abilities(GTOPartAbility.ACCELERATE_HATCH).setMaxGlobalLimited(1))) .where('C', controller(definition)) .where('D', blocks(GTOBlocks.COLD_ICE_CASING.get())) - .where('E', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Naquadah))) + .where('E', GTOPredicates.frame(GTMaterials.Naquadah)) .where('F', blocks(GTBlocks.CASING_TUNGSTENSTEEL_PIPE.get())) .where('G', blocks(GTOBlocks.NAQUADAH_ALLOY_CASING.get())) .where('H', blocks(GCYMBlocks.HEAT_VENT.get())) @@ -406,7 +406,7 @@ public static void init() {} .or(abilities(INPUT_ENERGY).setMaxGlobalLimited(2).setPreviewCount(1)) .or(abilities(MAINTENANCE).setExactLimit(1))) .where('a', blocks(GTOBlocks.OXIDATION_RESISTANT_HASTELLOY_N_MECHANICAL_CASING.get())) - .where('b', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.HastelloyX))) + .where('b', GTOPredicates.frame(GTMaterials.HastelloyX)) .where('d', blocks(GTBlocks.CASING_TITANIUM_PIPE.get())) .where('e', blocks(GCYMBlocks.MOLYBDENUM_DISILICIDE_COIL_BLOCK.get())) .where('f', blocks(GTOBlocks.AMPROSIUM_GEARBOX.get())) @@ -432,7 +432,7 @@ public static void init() {} .where('C', blocks(GTOBlocks.LASER_CASING.get())) .where('D', blocks(GTOBlocks.URUIUM_COIL_BLOCK.get())) .where('E', blocks(GTOBlocks.HYPER_CORE.get())) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Amprosium))) + .where('F', GTOPredicates.frame(GTOMaterials.Amprosium)) .where('G', blocks(GTOBlocks.SPACETIME_ASSEMBLY_LINE_CASING.get())) .where('H', blocks(GTOBlocks.EXTREME_DENSITY_CASING.get())) .where('I', blocks(GTBlocks.FUSION_GLASS.get())) @@ -448,10 +448,10 @@ public static void init() {} .where('S', blocks(GTOBlocks.ELECTRON_PERMEABLE_AMPROSIUM_COATED_GLASS.get())) .where('T', blocks(GTOBlocks.HOLLOW_CASING.get())) .where('U', blocks(GTOBlocks.AMPROSIUM_ACTIVE_CASING.get())) - .where('V', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Mithril))) + .where('V', GTOPredicates.frame(GTOMaterials.Mithril)) .where('W', blocks(RegistriesUtils.getBlock("gtceu:ruby_block"))) .where('X', blocks(GCYMBlocks.ELECTROLYTIC_CELL.get())) - .where('Y', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Trinium))) + .where('Y', GTOPredicates.frame(GTMaterials.Trinium)) .where('Z', blocks(GTBlocks.HIGH_POWER_CASING.get())) .where('[', blocks(GTOBlocks.DIMENSIONAL_BRIDGE_CASING.get())) .where('+', blocks(GTOBlocks.RESTRAINT_DEVICE.get())) @@ -477,7 +477,7 @@ public static void init() {} h -> h.addLines("自ULV起,电压每高出1级,获得的并行数+2", "From ULV, each voltage tier increases the obtained parallelism by 2"), c -> c.addCommentLines("公式 : 2 * (tier - 0), 算去吧", "Formula: 2 * (tier - 0), go calculate it yourself"))) .tooltips(NewDataAttributes.RECIPES_TYPE.create(ProcessingPlantMachine.getComponent())) - .moduleTooltips(CATALYST_HATCH, MANA_AMPLIFIER_HATCH) + .moduleTooltips(EXTRA_ENERGY_HATCH, CATALYST_HATCH, MANA_AMPLIFIER_HATCH) .block(GTOBlocks.MULTI_FUNCTIONAL_CASING) .pattern(definition -> FactoryBlockPattern.start(definition) .aisle("bbb", "bbb", "bbb") @@ -587,7 +587,7 @@ public static void init() {} .or(abilities(GTOPartAbility.NEUTRON_ACCELERATOR).setMaxGlobalLimited(2).setPreviewCount(1)) .or(abilities(PARALLEL_HATCH).setMaxGlobalLimited(1)) .or(abilities(MAINTENANCE).setExactLimit(1))) - .where('B', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Tungsten))) + .where('B', GTOPredicates.frame(GTMaterials.Tungsten)) .where('C', blocks(GTBlocks.CASING_STAINLESS_CLEAN.get()) .or(abilities(IMPORT_FLUIDS).setMaxGlobalLimited(1).setPreviewCount(1)) .or(abilities(IMPORT_ITEMS).setMaxGlobalLimited(2).setPreviewCount(1))) @@ -867,7 +867,7 @@ public static void init() {} .or(abilities(INPUT_LASER).setMaxGlobalLimited(16, 16)) .or(Predicates.abilities(GTOPartAbility.ACCELERATE_HATCH).setMaxGlobalLimited(1))) .where('E', casing) - .where('F', blocks(FusionCasings.getFrameState(LuV))) + .where('F', FusionCasings.getFrameState(LuV)) .where('G', blocks(GTOBlocks.STRENGTHEN_THE_BASE_BLOCK.get())) .where('H', blocks(FusionCasings.getCompressedCoilState(LuV))) .where('I', blocks(GTOBlocks.PBI_RADIATION_RESISTANT_MECHANICAL_ENCLOSURE.get())) @@ -934,7 +934,7 @@ public static void init() {} .tooltips(GTOMachineStories.INSTANCE.getDissolvingTankTooltips().getSupplier()) .tooltips(GTOMachineTooltipsA.INSTANCE.getDissolvingTankTooltips().getSupplier()) .parallelizableTooltips() - .moduleTooltips(ACCELERATE_HATCH) + .moduleTooltips(ACCELERATE_HATCH, EXTRA_ENERGY_HATCH) .recipeTypes(GTORecipeTypes.DISSOLUTION_TREATMENT_RECIPES) .block(GTBlocks.CASING_STAINLESS_CLEAN) .pattern(definition -> FactoryBlockPattern.start(definition) @@ -966,7 +966,7 @@ public static void init() {} .aisle("AEAEA", " ", " ", " ", " ") .aisle("AEAEA", " ", " ", " ", " ") .aisle(" AAA ", " J ", " ", " ", " ") - .where('A', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.UltraLightweightCompositeSteel))) + .where('A', GTOPredicates.frame(GTOMaterials.UltraLightweightCompositeSteel)) .where('B', blocks(GTOBlocks.STAINLESS_STEEL_CORROSION_RESISTANT_CASING.get())) .where('C', blocks(GTOBlocks.PRESSURE_RESISTANT_HOUSING_MECHANICAL_BLOCK.get())) .where('D', blocks(GTBlocks.CASING_STAINLESS_CLEAN.get()) @@ -998,7 +998,7 @@ public static void init() {} List> KUANGBIAO_subs = List.of( def -> MultiBlockFileReader.builder().name("kuangbiao2").startBuild(def) .where('A', controller(def)) - .where('B', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Ultimet))) + .where('B', GTOPredicates.frame(GTMaterials.Ultimet)) .where('C', blocks(GTOBlocks.COBALT_OXIDE_CERAMIC_STRONG_THERMALLY_CONDUCTIVE_MECHANICAL_BLOCK.get())) .where('D', blocks(GTOBlocks.HIGH_PRESSURE_PIPE_CASING.get())) .where('E', blocks(GCYMBlocks.CASING_NONCONDUCTING.get())) @@ -1008,7 +1008,7 @@ public static void init() {} .where('I', blocks(GTBlocks.CASING_PALLADIUM_SUBSTATION.get())) .where('J', blocks(GTOBlocks.BORON_CARBIDE_CERAMIC_RADIATION_RESISTANT_MECHANICAL_CUBE.get())) .where('K', blocks(GTBlocks.CASING_TUNGSTENSTEEL_PIPE.get())) - .where('L', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Duranium))) + .where('L', GTOPredicates.frame(GTMaterials.Duranium)) .where('M', blocks(GTOBlocks.RADIATION_ABSORBENT_CASING.get())) .where('N', blocks(GTBlocks.HIGH_POWER_CASING.get())) .where('O', blocks(GTBlocks.FUSION_CASING_MK2.get())) @@ -1023,14 +1023,14 @@ public static void init() {} def -> MultiBlockFileReader.builder().name("kuangbiao3").startBuild(def) .where('A', blocks(GTBlocks.FUSION_CASING_MK3.get())) .where('B', blocks(GTOBlocks.HYPER_MECHANICAL_CASING.get())) - .where('C', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Tritanium))) + .where('C', GTOPredicates.frame(GTMaterials.Tritanium)) .where('D', blocks(GTOBlocks.IRIDIUM_CASING.get())) .where('E', blocks(GTBlocks.HIGH_POWER_CASING.get())) .where('F', blocks(GTOBlocks.ADVANCED_COMPRESSED_FUSION_COIL.get())) .where('G', blocks(GTOBlocks.OPTICAL_RESONANCE_CHAMBER.get())) .where('H', blocks(GTOBlocks.LASER_CASING.get())) .where('I', blocks(GTBlocks.CASING_EXTREME_ENGINE_INTAKE.get())) - .where('J', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Naquadria))) + .where('J', GTOPredicates.frame(GTMaterials.Naquadria)) .where('K', blocks(GCYMBlocks.ELECTROLYTIC_CELL.get())) .where('L', blocks(GTBlocks.FUSION_GLASS.get())) .where('M', blocks(GCYMBlocks.CASING_LASER_SAFE_ENGRAVING.get())) @@ -1046,9 +1046,9 @@ public static void init() {} .where(' ', any()) .build(), def -> MultiBlockFileReader.builder().name("kuangbiao4").startBuild(def) - .where('A', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Trinium))) + .where('A', GTOPredicates.frame(GTMaterials.Trinium)) .where('B', blocks(GTOBlocks.NAQUADAH_ALLOY_CASING.get())) - .where('C', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Naquadah))) + .where('C', GTOPredicates.frame(GTMaterials.Naquadah)) .where('D', blocks(GTOBlocks.NEUTRONIUM_STABLE_CASING.get())) .where('E', blocks(GTOBlocks.HYPER_MECHANICAL_CASING.get())) .where('F', blocks(GTOBlocks.FUSION_CASING_MK4.get())) @@ -1060,7 +1060,7 @@ public static void init() {} .where('L', blocks(GTOBlocks.IRIDIUM_CASING.get())) .where('M', blocks(GTBlocks.HIGH_POWER_CASING.get())) .where('N', blocks(GCYMBlocks.ELECTROLYTIC_CELL.get())) - .where('O', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Amprosium))) + .where('O', GTOPredicates.frame(GTOMaterials.Amprosium)) .where('P', blocks(GTOBlocks.ACCELERATED_PIPELINE.get())) .where('Q', blocks(GTOBlocks.BORON_CARBIDE_CERAMIC_RADIATION_RESISTANT_MECHANICAL_CUBE.get())) .where('R', blocks(GTBlocks.CASING_PALLADIUM_SUBSTATION.get())) @@ -1080,14 +1080,14 @@ public static void init() {} .where(' ', any()) .build(), def -> MultiBlockFileReader.builder().name("kuangbiao5").startBuild(def) - .where('A', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.OdysseyNanoSuperalloy))) + .where('A', GTOPredicates.frame(GTOMaterials.OdysseyNanoSuperalloy)) .where('B', blocks(GTOBlocks.COMPRESSED_FUSION_COIL_MK2.get())) - .where('C', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.PlatinumManganeseAntimonyHeuslerAlloy))) + .where('C', GTOPredicates.frame(GTOMaterials.PlatinumManganeseAntimonyHeuslerAlloy)) .where('D', blocks(GTOBlocks.VACUUM_CHAMBER_BEAM_BLOCK.get())) .where('E', blocks(GTOBlocks.HIGH_PRESSURE_GAS_STORAGE_TANKS_CASING.get())) .where('F', blocks(GTOBlocks.HERMETIC_CASING_UEV.get())) .where('G', blocks(GTOBlocks.HIGH_PRESSURE_PIPE_CASING.get())) - .where('H', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Trinium))) + .where('H', GTOPredicates.frame(GTMaterials.Trinium)) .where('I', blocks(GTOBlocks.FUSION_CASING_MK5.get())) .where('J', blocks(GTOBlocks.PLASMA_FIELD_GLASS.get())) .where('K', blocks(GTOBlocks.ACCELERATOR_PROTECTION_CASING.get())) @@ -1124,7 +1124,7 @@ public static void init() {} .where('F', blocks(GTBlocks.COMPUTER_HEAT_VENT.get())) .where('G', blocks(GTBlocks.HIGH_POWER_CASING.get())) .where('H', blocks(GTBlocks.CASING_PALLADIUM_SUBSTATION.get())) - .where('I', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Tritanium))) + .where('I', GTOPredicates.frame(GTMaterials.Tritanium)) .where('J', controller(def)) .where(' ', any()) .build()); diff --git a/src/main/java/com/gtocore/common/data/machines/MultiBlockF.java b/src/main/java/com/gtocore/common/data/machines/MultiBlockF.java index 984327ad9..9a6ee650e 100644 --- a/src/main/java/com/gtocore/common/data/machines/MultiBlockF.java +++ b/src/main/java/com/gtocore/common/data/machines/MultiBlockF.java @@ -18,8 +18,6 @@ import com.gtolib.utils.MultiBlockFileReader; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; -import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.pattern.MultiblockShapeInfo; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; @@ -73,7 +71,7 @@ public static void init() {} .where('Q', blocks(GTBlocks.FIREBOX_TUNGSTENSTEEL.get())) .where('R', blocks(GTBlocks.CASING_TUNGSTENSTEEL_PIPE.get())) .where('S', heatingCoils()) - .where('T', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Naquadah))) + .where('T', GTOPredicates.frame(GTMaterials.Naquadah)) .where('U', abilities(MUFFLER)) .where(' ', any()) .build()) @@ -97,7 +95,7 @@ public static void init() {} .where('d', blocks(GTOBlocks.AGGREGATIONE_CORE.get())) .where('d', blocks(GTOBlocks.ACCELERATED_PIPELINE.get())) .where('e', blocks(GTBlocks.SUPERCONDUCTING_COIL.get())) - .where('f', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.NaquadahEnriched))) + .where('f', GTOPredicates.frame(GTMaterials.NaquadahEnriched)) .where(' ', any()) .build()) .workableCasingRenderer(GTOCore.id("block/casings/lafium_mechanical_casing"), GTCEu.id("block/multiblock/fusion_reactor")) @@ -140,7 +138,7 @@ public static void init() {} .or(abilities(PARALLEL_HATCH).setMaxGlobalLimited(1)) .or(abilities(MAINTENANCE).setExactLimit(1))) .where('B', controller(definition)) - .where('C', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.TungstenCarbide))) + .where('C', GTOPredicates.frame(GTMaterials.TungstenCarbide)) .where('D', blocks(GTOBlocks.NAQUADAH_REINFORCED_PLANT_CASING.get())) .where('E', blocks(GCYMBlocks.CASING_WATERTIGHT.get())) .where('F', blocks(GTOBlocks.STRENGTHEN_THE_BASE_BLOCK.get())) @@ -148,10 +146,10 @@ public static void init() {} .where('H', blocks(GTOBlocks.STERILE_WATER_PLANT_CASING.get())) .where('I', blocks(GTBlocks.CLEANROOM_GLASS.get())) .where('J', blocks(GTBlocks.CASING_STAINLESS_CLEAN.get())) - .where('K', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.HSLASteel))) + .where('K', GTOPredicates.frame(GTMaterials.HSLASteel)) .where('L', blocks(GTOBlocks.FLOCCULATION_CASING.get())) .where('M', blocks(GTOBlocks.AMPROSIUM_PIPE_CASING.get())) - .where('N', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.WatertightSteel))) + .where('N', GTOPredicates.frame(GTMaterials.WatertightSteel)) .where(' ', any()) .build()) .workableCasingRenderer(GTOCore.id("block/casings/strengthen_the_base_block"), GTCEu.id("block/multiblock/gcym/large_distillery")) @@ -243,7 +241,7 @@ public static void init() {} .where('K', blocks(GTOBlocks.ZIRCONIA_CERAMIC_HIGH_STRENGTH_BENDING_RESISTANCE_MECHANICAL_BLOCK.get())) .where('L', blocks(GTOBlocks.PRESSURE_CONTAINMENT_CASING.get())) .where('M', blocks(GTOBlocks.HOLLOW_CASING.get())) - .where('N', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Mithril))) + .where('N', GTOPredicates.frame(GTOMaterials.Mithril)) .where('O', blocks(GTOBlocks.OXIDATION_RESISTANT_HASTELLOY_N_MECHANICAL_CASING.get())) .where('P', blocks(GTOBlocks.HYPER_MECHANICAL_CASING.get())) .where('Q', blocks(GTOBlocks.AMPROSIUM_ACTIVE_CASING.get())) @@ -275,7 +273,7 @@ public static void init() {} .where('I', blocks(GCYMBlocks.ELECTROLYTIC_CELL.get())) .where('J', blocks(GTBlocks.FUSION_GLASS.get())) .where('K', blocks(GTOBlocks.HYPER_MECHANICAL_CASING.get())) - .where('L', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Tritanium))) + .where('L', GTOPredicates.frame(GTMaterials.Tritanium)) .where('M', controller(definition)) .where(' ', any()) .build()) @@ -292,7 +290,7 @@ public static void init() {} .recipeModifiers(RecipeModifierFunction.overclocking(0.5, 1, 0.05)) .block(GTOBlocks.NAQUADAH_ALLOY_CASING) .pattern(definition -> MultiBlockFileReader.start(definition, RelativeDirection.BACK, RelativeDirection.UP, RelativeDirection.RIGHT) - .where('A', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Amprosium))) + .where('A', GTOPredicates.frame(GTOMaterials.Amprosium)) .where('B', blocks(GTOBlocks.NAQUADAH_ALLOY_CASING.get())) .where('C', blocks(GTOBlocks.CONTAINMENT_FIELD_GENERATOR.get())) .where('D', blocks(GTOBlocks.MOLECULAR_CASING.get())) @@ -303,9 +301,9 @@ public static void init() {} .where('I', blocks(GTOBlocks.HOLLOW_CASING.get())) .where('J', blocks(GTOBlocks.ELECTRON_PERMEABLE_AMPROSIUM_COATED_GLASS.get())) .where('K', blocks(GTBlocks.HIGH_POWER_CASING.get())) - .where('L', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Neutronium))) + .where('L', GTOPredicates.frame(GTMaterials.Neutronium)) .where('M', blocks(GTOBlocks.COSMIC_NEUTRONIUM_BOROSILICATE_GLASS.get())) - .where('N', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.NaquadahAlloy))) + .where('N', GTOPredicates.frame(GTMaterials.NaquadahAlloy)) .where('O', blocks(GCYMBlocks.ELECTROLYTIC_CELL.get())) .where('P', blocks(GTBlocks.FUSION_GLASS.get())) .where('Q', blocks(GTOBlocks.DIMENSIONAL_BRIDGE_CASING.get())) diff --git a/src/main/java/com/gtocore/common/data/machines/MultiBlockG.java b/src/main/java/com/gtocore/common/data/machines/MultiBlockG.java index a399dcb7e..32e98c0c1 100644 --- a/src/main/java/com/gtocore/common/data/machines/MultiBlockG.java +++ b/src/main/java/com/gtocore/common/data/machines/MultiBlockG.java @@ -66,8 +66,11 @@ import static com.gregtechceu.gtceu.common.data.GTMachines.COKE_OVEN_HATCH; import static com.gregtechceu.gtceu.common.data.GTRecipeTypes.DUMMY_RECIPES; import static com.gtocore.api.machine.part.GTOPartAbility.ACCELERATE_HATCH; +import static com.gtocore.api.machine.part.GTOPartAbility.EXTRA_ENERGY_HATCH; import static com.gtocore.common.data.GTORecipeTypes.CHEMICAL_VAPOR_DEPOSITION_RECIPES; import static com.gtocore.common.data.GTORecipeTypes.PHYSICAL_VAPOR_DEPOSITION_RECIPES; +import static com.gtocore.common.data.machines.GTAEMachines.FLUID_IMPORT_HATCH_ME; +import static com.gtocore.common.data.machines.GTAEMachines.STOCKING_IMPORT_HATCH_ME; import static com.gtocore.utils.register.MachineRegisterUtils.multiblock; import static com.gtocore.utils.register.MachineRegisterUtils.registerTieredMultis; import static com.gtolib.api.GTOValues.GLASS_TIER; @@ -94,7 +97,7 @@ public final class MultiBlockG { .tooltips(GTOMachineStories.INSTANCE.getCrystallizationChamberTooltips().getSupplier()) .recipeTypes(GTORecipeTypes.CRYSTALLIZATION_RECIPES) .overclock() - .moduleTooltips(ACCELERATE_HATCH) + .moduleTooltips(ACCELERATE_HATCH, EXTRA_ENERGY_HATCH) .block(GTBlocks.CASING_STEEL_SOLID) .pattern(definition -> FactoryBlockPattern.start(definition) .aisle("aaaaa", "aBBBa", "aBBBa", "aaaaa", " ") @@ -109,7 +112,7 @@ public final class MultiBlockG { .where('B', blocks(GTBlocks.CASING_TEMPERED_GLASS.get())) .where('C', heatingCoils()) .where('D', blocks(GTBlocks.CASING_INVAR_HEATPROOF.get())) - .where('E', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Steel))) + .where('E', GTOPredicates.frame(GTMaterials.Steel)) .where(' ', any()) .build()) .addSubPattern(definition -> FactoryBlockPattern.start(definition) @@ -151,17 +154,17 @@ public final class MultiBlockG { .where('D', blocks(GTOBlocks.IRIDIUM_CASING.get())) .where('E', blocks(GTBlocks.CASING_EXTREME_ENGINE_INTAKE.get())) .where('F', blocks(GTOBlocks.MAGNESIUM_OXIDE_CERAMIC_HIGH_TEMPERATURE_INSULATION_MECHANICAL_BLOCK.get())) - .where('G', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.NaquadahAlloy))) + .where('G', GTOPredicates.frame(GTMaterials.NaquadahAlloy)) .where('H', blocks(GTBlocks.CASING_GRATE.get())) .where('I', blocks(GTOBlocks.PRESSURE_CONTAINMENT_CASING.get())) - .where('J', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Naquadah))) + .where('J', GTOPredicates.frame(GTMaterials.Naquadah)) .where('K', blocks(GTBlocks.FUSION_GLASS.get())) .where('L', heatingCoils()) .where('M', blocks(GTOBlocks.PPS_CORROSION_RESISTANT_MECHANICAL_HOUSING.get())) .where('N', blocks(GTOBlocks.BORON_CARBIDE_CERAMIC_RADIATION_RESISTANT_MECHANICAL_CUBE.get())) .where('O', blocks(GTBlocks.CASING_TUNGSTENSTEEL_PIPE.get())) .where('P', blocks(GCYMBlocks.CASING_CORROSION_PROOF.get())) - .where('Q', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.IncoloyMA956))) + .where('Q', GTOPredicates.frame(GTMaterials.IncoloyMA956)) .where('R', controller(definition)) .where(' ', any()) .build()) @@ -178,12 +181,13 @@ public final class MultiBlockG { .where('A', blocks(GTBlocks.PLASTCRETE.get())) .where('B', blocks(GTBlocks.CASING_STEEL_PIPE.get())) .where('C', blocks(GTOBlocks.BRASS_REINFORCED_WOODEN_CASING.get())) - .where('D', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Aluminium))) + .where('D', GTOPredicates.frame(GTMaterials.Aluminium)) .where('E', blocks(GTBlocks.CASING_STAINLESS_CLEAN.get())) .where('F', blocks(Blocks.GLASS)) .where('G', blocks(GTBlocks.PLASTCRETE.get()) .or(blocks(GTMachines.ITEM_IMPORT_BUS[ULV].get()).setMaxGlobalLimited(1)) - .or(abilities(IMPORT_FLUIDS).setExactLimit(1)) + .or(abilities(IMPORT_FLUIDS_1X, IMPORT_FLUIDS_4X, IMPORT_FLUIDS_9X) + .or(blocks(FLUID_IMPORT_HATCH_ME.get(), STOCKING_IMPORT_HATCH_ME.get())).setMaxGlobalLimited(2)) .or(abilities(EXPORT_ITEMS).setExactLimit(1))) .where('H', controller(definition)) .where('W', fluids(Fluids.WATER)) @@ -202,7 +206,7 @@ public final class MultiBlockG { .block(GTBlocks.CASING_STAINLESS_CLEAN) .pattern(definition -> MultiBlockFileReader.start(definition) .where('~', controller(definition)) - .where('A', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) + .where('A', GTOPredicates.frame(GTMaterials.StainlessSteel)) .where('B', blocks(GTBlocks.CASING_STAINLESS_CLEAN.get())) .where('C', blocks(GTBlocks.CASING_STAINLESS_CLEAN.get()) .or(autoAbilities(definition.getRecipeTypes())) @@ -226,9 +230,9 @@ public final class MultiBlockG { .where('B', blocks(GTOBlocks.MULTI_FUNCTIONAL_CASING.get())) .where('C', blocks(GTBlocks.CASING_STEEL_PIPE.get())) .where('D', blocks(GTBlocks.CASING_STEEL_GEARBOX.get())) - .where('E', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Steel))) + .where('E', GTOPredicates.frame(GTMaterials.Steel)) .where('F', blocks(GTBlocks.CASING_STEEL_SOLID.get())) - .where('G', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) + .where('G', GTOPredicates.frame(GTMaterials.StainlessSteel)) .where('H', blocks(GTBlocks.CASING_STAINLESS_CLEAN.get()) .or(abilities(IMPORT_ITEMS).setMaxGlobalLimited(1)) .or(abilities(IMPORT_FLUIDS).setMaxGlobalLimited(1)) @@ -251,7 +255,7 @@ public final class MultiBlockG { .perfectOCTooltips() .block(GTBlocks.CASING_STAINLESS_CLEAN) .pattern(definition -> MultiBlockFileReader.start(definition, RelativeDirection.RIGHT, RelativeDirection.UP, RelativeDirection.BACK) - .where('A', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) + .where('A', GTOPredicates.frame(GTMaterials.StainlessSteel)) .where('B', blocks(GTBlocks.CASING_STAINLESS_CLEAN.get()) .or(autoAbilities(definition.getRecipeTypes())) .or(abilities(MAINTENANCE).setExactLimit(1))) @@ -282,7 +286,7 @@ public final class MultiBlockG { .or(abilities(EXPORT_ITEMS).setMaxGlobalLimited(2)) .or(abilities(INPUT_ENERGY).setMaxGlobalLimited(2)) .or(abilities(MAINTENANCE).setExactLimit(1))) - .where('C', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Steel))) + .where('C', GTOPredicates.frame(GTMaterials.Steel)) .where('D', blocks(GTBlocks.CASING_STEEL_GEARBOX.get())) .where('E', blocks(GTOBlocks.REINFORCED_WOOD_CASING.get())) .where('F', blocks(Blocks.MOSS_BLOCK)) @@ -304,7 +308,7 @@ public final class MultiBlockG { .pattern(definition -> MultiBlockFileReader.start(definition) .where('~', controller(definition)) .where('b', blocks(GTBlocks.CASING_TEMPERED_GLASS.get())) - .where('c', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) + .where('c', GTOPredicates.frame(GTMaterials.StainlessSteel)) .where('d', blocks(RegistriesUtils.getBlock("farmersdelight:rich_soil"))) .where('e', blocks(GTBlocks.CASING_POLYTETRAFLUOROETHYLENE_PIPE.get())) .where('f', blocks(GTBlocks.CASING_GRATE.get())) @@ -502,7 +506,7 @@ public final class MultiBlockG { .where('B', controller(definition)) .where('C', blocks(GTBlocks.CASING_TUNGSTENSTEEL_ROBUST.get())) .where('D', blocks(GTBlocks.CASING_STAINLESS_CLEAN.get())) - .where('E', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) + .where('E', GTOPredicates.frame(GTMaterials.StainlessSteel)) .where('F', heatingCoils()) .where('G', blocks(GTBlocks.CASING_TEMPERED_GLASS.get())) .where('H', abilities(MUFFLER)) @@ -524,7 +528,7 @@ public final class MultiBlockG { .or(abilities(PARALLEL_HATCH).setMaxGlobalLimited(1)) .or(abilities(MAINTENANCE).setExactLimit(1))) .where('B', blocks(GTBlocks.CASING_TITANIUM_STABLE.get())) - .where('C', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.BlueSteel))) + .where('C', GTOPredicates.frame(GTMaterials.BlueSteel)) .where('D', blocks(GTOBlocks.COMPRESSOR_CONTROLLER_CASING.get())) .where('E', controller(definition)) .where('F', blocks(GTOBlocks.COMPRESSOR_PIPE_CASING.get())) @@ -561,11 +565,11 @@ public final class MultiBlockG { .or(abilities(EXPORT_ITEMS)) .or(abilities(INPUT_ENERGY).setMaxGlobalLimited(2)) .or(abilities(MAINTENANCE).setExactLimit(1))) - .where('B', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) + .where('B', GTOPredicates.frame(GTMaterials.StainlessSteel)) .where('C', blocks(GTBlocks.CASING_LAMINATED_GLASS.get())) .where('c', GTOPredicates.countBlock("laminated_glass", GTBlocks.CASING_LAMINATED_GLASS.get())) .where('D', blocks(GTOBlocks.TUNGSTEN_BOROSILICATE_GLASS.get())) - .where('E', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.TungstenSteel))) + .where('E', GTOPredicates.frame(GTMaterials.TungstenSteel)) .where('F', blocks(GTBlocks.CASING_TUNGSTENSTEEL_GEARBOX.get())) .where('G', heatingCoils()) .where('H', controller(definition)) @@ -583,10 +587,10 @@ public final class MultiBlockG { .pattern(definition -> MultiBlockFileReader.start(definition, RelativeDirection.RIGHT, RelativeDirection.UP, RelativeDirection.BACK) .where('A', blocks(GTBlocks.CASING_STEEL_SOLID.get())) .where('B', blocks(GTBlocks.CASING_STEEL_GEARBOX.get())) - .where('C', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Steel))) + .where('C', GTOPredicates.frame(GTMaterials.Steel)) .where('D', blocks(GTBlocks.CASING_GRATE.get())) .where('E', blocks(GTBlocks.HERMETIC_CASING_LV.get())) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) + .where('F', GTOPredicates.frame(GTMaterials.StainlessSteel)) .where('G', blocks(GTBlocks.HERMETIC_CASING_HV.get())) .where('H', blocks(GTBlocks.CASING_STAINLESS_STEEL_GEARBOX.get())) .where('I', blocks(GTBlocks.CASING_STEEL_PIPE.get())) @@ -607,7 +611,7 @@ public final class MultiBlockG { .perfectOCTooltips() .block(GTBlocks.CASING_STEEL_SOLID) .pattern(definition -> MultiBlockFileReader.start(definition) - .where('A', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Invar))) + .where('A', GTOPredicates.frame(GTMaterials.Invar)) .where('B', blocks(GTBlocks.CASING_INVAR_HEATPROOF.get())) .where('C', blocks(GTBlocks.CASING_STEEL_SOLID.get()) .or(autoAbilities(definition.getRecipeTypes())) @@ -630,7 +634,7 @@ public final class MultiBlockG { .multipleRecipesTooltips() .block(GTOBlocks.OXIDATION_RESISTANT_HASTELLOY_N_MECHANICAL_CASING) .pattern(definition -> MultiBlockFileReader.start(definition, RelativeDirection.RIGHT, RelativeDirection.UP, RelativeDirection.BACK) - .where('A', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.HastelloyN))) + .where('A', GTOPredicates.frame(GTOMaterials.HastelloyN)) .where('B', blocks(GTOBlocks.OXIDATION_RESISTANT_HASTELLOY_N_MECHANICAL_CASING.get())) .where('C', blocks(GTOBlocks.ZIRCONIA_CERAMIC_HIGH_STRENGTH_BENDING_RESISTANCE_MECHANICAL_BLOCK.get()).setMinGlobalLimited(20) .or(blocks(GTAEMachines.ME_CRAFT_PATTERN_PART_MACHINE.get())) @@ -642,7 +646,7 @@ public final class MultiBlockG { .where('G', blocks(GTBlocks.CASING_ASSEMBLY_LINE.get())) .where('H', blocks(GTBlocks.HIGH_POWER_CASING.get())) .where('I', blocks(GTOBlocks.COMPRESSOR_CONTROLLER_CASING.get())) - .where('J', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Europium))) + .where('J', GTOPredicates.frame(GTMaterials.Europium)) .where('K', blocks(GTOBlocks.EXTREME_DENSITY_CASING.get())) .where('L', controller(definition)) .where(' ', any()) @@ -719,7 +723,7 @@ public final class MultiBlockG { .where('C', GTOPredicates.glass()) .where('D', blocks(GTBlocks.BATTERY_LAPOTRONIC_IV.get())) .where('E', blocks(GTBlocks.BATTERY_EMPTY_TIER_II.get())) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.TungstenSteel))) + .where('F', GTOPredicates.frame(GTMaterials.TungstenSteel)) .where('G', controller(definition)) .where('H', blocks(RegistriesUtils.getBlock("ae2:energy_acceptor"))) .build()) @@ -781,10 +785,10 @@ public final class MultiBlockG { .block(GTOBlocks.IRIDIUM_CASING) .pattern(definition -> MultiBlockFileReader.start(definition) .where('A', blocks(GTOBlocks.ANTIFREEZE_HEATPROOF_MACHINE_CASING.get())) - .where('B', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.BabbittAlloy))) + .where('B', GTOPredicates.frame(GTOMaterials.BabbittAlloy)) .where('C', blocks(GTOBlocks.SPS_CASING.get())) .where('D', GTOPredicates.glass()) - .where('E', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.NaquadahAlloy))) + .where('E', GTOPredicates.frame(GTMaterials.NaquadahAlloy)) .where('F', blocks(GTOBlocks.STABILIZED_NAQUADAH_WATER_PLANT_CASING.get())) .where('G', blocks(GTBlocks.CASING_POLYTETRAFLUOROETHYLENE_PIPE.get())) .where('H', blocks(GTOBlocks.LAFIUM_MECHANICAL_CASING.get())) @@ -792,7 +796,7 @@ public final class MultiBlockG { .where('J', blocks(GTOBlocks.HERMETIC_CASING_UEV.get())) .where('K', blocks(GCYMBlocks.CASING_ATOMIC.get())) .where('L', blocks(GTOBlocks.IRIDIUM_CASING.get())) - .where('M', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Laurenium))) + .where('M', GTOPredicates.frame(GTOMaterials.Laurenium)) .where('N', blocks(GTOBlocks.AMPROSIUM_ACTIVE_CASING.get())) .where('O', blocks(GTOBlocks.IRIDIUM_CASING.get()) .or(GTOPredicates.autoThreadLaserAbilities(definition.getRecipeTypes())) @@ -803,7 +807,7 @@ public final class MultiBlockG { .where('S', blocks(GTOBlocks.STRONTIUM_CARBONATE_CERAMIC_RAY_ABSORBING_MECHANICAL_CUBE.get())) .where('T', blocks(GTOBlocks.NEUTRONIUM_STABLE_CASING.get())) .where('U', blocks(GTOBlocks.AMPROSIUM_PIPE_CASING.get())) - .where('V', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Polytetrafluoroethylene))) + .where('V', GTOPredicates.frame(GTMaterials.Polytetrafluoroethylene)) .where('W', blocks(GTOBlocks.ADVANCED_ASSEMBLY_LINE_UNIT.get())) .where('X', blocks(GCYMBlocks.CASING_CORROSION_PROOF.get())) .where('Y', blocks(GTOBlocks.CONTAINMENT_FIELD_GENERATOR.get())) @@ -840,13 +844,13 @@ public final class MultiBlockG { .or(blocks(GTAEMachines.CRAFTING_CPU_INTERFACE.get()).setExactLimit(1))) .where('C', blocks(GCYMBlocks.MOLYBDENUM_DISILICIDE_COIL_BLOCK.get())) .where('D', blocks(GCYMBlocks.CASING_NONCONDUCTING.get())) - .where('E', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.BlackSteel))) + .where('E', GTOPredicates.frame(GTMaterials.BlackSteel)) .where('F', blocks(GTOBlocks.COBALT_OXIDE_CERAMIC_STRONG_THERMALLY_CONDUCTIVE_MECHANICAL_BLOCK.get())) .where('G', blocks(GCYMBlocks.ELECTROLYTIC_CELL.get())) .where('H', blocks(GTBlocks.CASING_PALLADIUM_SUBSTATION.get())) .where('I', blocks(GCYMBlocks.CASING_LASER_SAFE_ENGRAVING.get())) .where('J', blocks(GTOBlocks.OXIDATION_RESISTANT_HASTELLOY_N_MECHANICAL_CASING.get())) - .where('K', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) + .where('K', GTOPredicates.frame(GTMaterials.StainlessSteel)) .where('L', blocks(GTBlocks.CASING_EXTREME_ENGINE_INTAKE.get())) .where('M', blocks(GTBlocks.HIGH_POWER_CASING.get())) .where('N', GTOPredicates.glass()) diff --git a/src/main/java/com/gtocore/common/data/machines/MultiBlockH.java b/src/main/java/com/gtocore/common/data/machines/MultiBlockH.java index 7cbe010b8..0e6315bb9 100644 --- a/src/main/java/com/gtocore/common/data/machines/MultiBlockH.java +++ b/src/main/java/com/gtocore/common/data/machines/MultiBlockH.java @@ -61,7 +61,7 @@ public static void init() {} .pattern(definition -> MultiBlockFileReader.start(definition, RelativeDirection.BACK, RelativeDirection.UP, RelativeDirection.LEFT) .where('A', blocks(GTOBlocks.IRIDIUM_CASING.get())) .where('B', blocks(GTOBlocks.OXIDATION_RESISTANT_HASTELLOY_N_MECHANICAL_CASING.get())) - .where('C', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.NaquadahAlloy))) + .where('C', GTOPredicates.frame(GTMaterials.NaquadahAlloy)) .where('D', blocks(GTOBlocks.NAQUADAH_ALLOY_CASING.get())) .where('E', blocks(GTOBlocks.ELECTRON_PERMEABLE_AMPROSIUM_COATED_GLASS.get())) .where('F', blocks(GTBlocks.HIGH_POWER_CASING.get())) @@ -76,7 +76,7 @@ public static void init() {} .where('O', blocks(GTOBlocks.MAGTECH_CASING.get())) .where('P', blocks(GTOBlocks.RADIATION_ABSORBENT_CASING.get())) .where('Q', blocks(GTOBlocks.AMPROSIUM_PIPE_CASING.get())) - .where('R', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.HastelloyN))) + .where('R', GTOPredicates.frame(GTOMaterials.HastelloyN)) .where('S', blocks(GTOBlocks.BORON_CARBIDE_CERAMIC_RADIATION_RESISTANT_MECHANICAL_CUBE.get())) .where('T', blocks(GTOBlocks.HOLLOW_CASING.get())) .where('U', blocks(GCYMBlocks.CASING_ATOMIC.get())) @@ -141,7 +141,7 @@ public static void init() {} .or(abilities(PARALLEL_HATCH).setMaxGlobalLimited(1)) .or(abilities(INPUT_ENERGY).setMaxGlobalLimited(2).setPreviewCount(1)) .or(abilities(MAINTENANCE).setExactLimit(1))) - .where('U', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.NaquadahAlloy))) + .where('U', GTOPredicates.frame(GTMaterials.NaquadahAlloy)) .where('V', blocks(GTOBlocks.QUARK_EXCLUSION_CASING.get())) .where('W', GTOPredicates.integralFramework()) .where('X', blocks(GTOBlocks.HOLLOW_CASING.get())) @@ -169,11 +169,11 @@ public static void init() {} .where('D', blocks(GTOBlocks.ALUMINIUM_BRONZE_CASING.get())) .where('E', blocks(GTOBlocks.HASTELLOY_N_75_CASING.get())) .where('F', blocks(GTOBlocks.CALCIUM_OXIDE_CERAMIC_ANTI_METAL_CORROSION_MECHANICAL_BLOCK.get())) - .where('G', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.WatertightSteel))) + .where('G', GTOPredicates.frame(GTMaterials.WatertightSteel)) .where('H', blocks(GTOBlocks.INCONEL_625_PIPE.get())) .where('I', blocks(GTOBlocks.STABILIZED_NAQUADAH_WATER_PLANT_CASING.get())) - .where('J', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.MaragingSteel300))) - .where('K', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Duranium))) + .where('J', GTOPredicates.frame(GTMaterials.MaragingSteel300)) + .where('K', GTOPredicates.frame(GTMaterials.Duranium)) .where('L', blocks(GTOBlocks.HASTELLOY_N_75_GEARBOX.get())) .where('M', blocks(GTOBlocks.HASTELLOY_N_75_PIPE.get())) .where('N', blocks(GTOBlocks.FLOTATION_CELL.get())) @@ -195,7 +195,7 @@ public static void init() {} .where('A', blocks(GTOBlocks.FUSION_CASING_MK5.get())) .where('B', blocks(GTOBlocks.FISSION_REACTOR_CASING.get())) .where('C', blocks(GTOBlocks.PBI_RADIATION_RESISTANT_MECHANICAL_ENCLOSURE.get())) - .where('D', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.BlackSteel))) + .where('D', GTOPredicates.frame(GTMaterials.BlackSteel)) .where('E', blocks(GTOBlocks.STRONTIUM_CARBONATE_CERAMIC_RAY_ABSORBING_MECHANICAL_CUBE.get())) .where('F', blocks(GTOBlocks.CONTAINMENT_FIELD_GENERATOR.get())) .where('G', blocks(GTOBlocks.AMPROSIUM_ACTIVE_CASING.get())) @@ -230,7 +230,7 @@ public static void init() {} .where('E', blocks(GTBlocks.CASING_PTFE_INERT.get())) .where('F', blocks(GTOBlocks.AMPROSIUM_PIPE_CASING.get())) .where('G', blocks(GTOBlocks.HYPER_MECHANICAL_CASING.get())) - .where('H', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Polytetrafluoroethylene))) + .where('H', GTOPredicates.frame(GTMaterials.Polytetrafluoroethylene)) .where('I', blocks(GTOBlocks.OXIDATION_RESISTANT_HASTELLOY_N_MECHANICAL_CASING.get())) .where('J', blocks(GTOBlocks.BIOACTIVE_MECHANICAL_CASING.get())) .where('K', blocks(GTBlocks.FILTER_CASING_STERILE.get())) @@ -267,7 +267,7 @@ public static void init() {} .where('B', blocks(GTOBlocks.RED_STEEL_CASING.get())) .where('C', blocks(GTOBlocks.COMPRESSOR_CONTROLLER_CASING.get())) .where('D', blocks(GTOBlocks.COMPRESSOR_PIPE_CASING.get())) - .where('E', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Amprosium))) + .where('E', GTOPredicates.frame(GTOMaterials.Amprosium)) .where('F', blocks(GTOBlocks.HIGH_PRESSURE_PIPE_CASING.get())) .where('G', blocks(GTOBlocks.PRESSURE_CONTAINMENT_CASING.get())) .where('H', blocks(GTOBlocks.PVC_PLASTIC_MECHANICAL_HOUSING.get())) @@ -309,12 +309,12 @@ public static void init() {} .where('D', blocks(GTOBlocks.AMPROSIUM_PIPE_CASING.get())) .where('E', blocks(GTOBlocks.NEUTRONIUM_STABLE_CASING.get())) .where('F', blocks(GTOBlocks.HYPER_MECHANICAL_CASING.get())) - .where('G', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.BlackSteel))) + .where('G', GTOPredicates.frame(GTMaterials.BlackSteel)) .where('H', blocks(GTOBlocks.TITANIUM_NITRIDE_CERAMIC_IMPACT_RESISTANT_MECHANICAL_BLOCK.get())) .where('I', blocks(GTBlocks.CASING_PTFE_INERT.get())) .where('J', blocks(GTBlocks.FUSION_GLASS.get())) .where('K', blocks(GTOBlocks.NAQUADAH_REINFORCED_PLANT_CASING.get())) - .where('L', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Polytetrafluoroethylene))) + .where('L', GTOPredicates.frame(GTMaterials.Polytetrafluoroethylene)) .where('M', blocks(GTOBlocks.PLASMA_HEATER_CASING.get())) .where('N', blocks(GTOBlocks.HYPER_MECHANICAL_CASING.get()) .or(GTOPredicates.autoThreadLaserAbilities(definition.getRecipeTypes())) @@ -349,7 +349,7 @@ public static void init() {} .where('G', blocks(GTOBlocks.ANTIFREEZE_HEATPROOF_MACHINE_CASING.get())) .where('H', blocks(GTOBlocks.OXIDATION_RESISTANT_HASTELLOY_N_MECHANICAL_CASING.get())) .where('I', blocks(GTOBlocks.PRESSURE_CONTAINMENT_CASING.get())) - .where('J', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.BabbittAlloy))) + .where('J', GTOPredicates.frame(GTOMaterials.BabbittAlloy)) .where('K', blocks(GTOBlocks.BORON_CARBIDE_CERAMIC_RADIATION_RESISTANT_MECHANICAL_CUBE.get()) .or(autoAbilities(definition.getRecipeTypes())) .or(blocks(GTOMachines.HEAT_SENSOR.get()).setMaxGlobalLimited(1).setMinGlobalLimited(0)) @@ -365,7 +365,7 @@ public static void init() {} .where('S', blocks(GTBlocks.HERMETIC_CASING_ZPM.get())) .where('T', blocks(GTOBlocks.FISSION_COOLER_COMPONENT.get())) .where('U', controller(definition)) - .where('V', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.TungstenCarbide))) + .where('V', GTOPredicates.frame(GTMaterials.TungstenCarbide)) .where(' ', any()) .build()) .workableCasingRenderer(GTOCore.id("block/boron_carbide_ceramic_radiation_resistant_mechanical_cube"), GTCEu.id("block/multiblock/gcym/large_chemical_bath")) @@ -389,9 +389,9 @@ public static void init() {} .where('F', blocks(GTBlocks.CASING_TUNGSTENSTEEL_GEARBOX.get())) .where('G', blocks(GTBlocks.CASING_TUNGSTENSTEEL_PIPE.get())) .where('H', blocks(GTOBlocks.PBI_RADIATION_RESISTANT_MECHANICAL_ENCLOSURE.get())) - .where('I', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) + .where('I', GTOPredicates.frame(GTMaterials.StainlessSteel)) .where('J', blocks(GTBlocks.FUSION_GLASS.get())) - .where('K', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.DepletedUraniumAlloy))) + .where('K', GTOPredicates.frame(GTOMaterials.DepletedUraniumAlloy)) .where('L', controller(definition)) .where(' ', any()) .build()) @@ -414,7 +414,7 @@ public static void init() {} .where('B', blocks(GTOBlocks.HYPER_CORE.get())) .where('C', blocks(GTOBlocks.NAQUADAH_ALLOY_CASING.get())) .where('D', blocks(GTOBlocks.BIOACTIVE_MECHANICAL_CASING.get())) - .where('E', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Mithril))) + .where('E', GTOPredicates.frame(GTOMaterials.Mithril)) .where('F', blocks(GTOBlocks.SPS_CASING.get())) .where('G', blocks(GTBlocks.CLEANROOM_GLASS.get())) .where('H', GTOPredicates.light()) @@ -446,7 +446,7 @@ public static void init() {} .where('C', blocks(GTOBlocks.ABS_RED_CASING.get())) .where('D', blocks(GTOBlocks.TITANIUM_NITRIDE_CERAMIC_IMPACT_RESISTANT_MECHANICAL_BLOCK.get())) .where('E', blocks(GTOBlocks.ENGINEERING_MECHANICAL_CASING.get())) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.BlackSteel))) + .where('F', GTOPredicates.frame(GTMaterials.BlackSteel)) .where('G', blocks(GTOBlocks.PEEK_WEAR_RESISTANT_MECHANICAL_HOUSING.get())) .where('H', GTOPredicates.light()) .where('I', blocks(GTOBlocks.OXIDATION_RESISTANT_HASTELLOY_N_MECHANICAL_CASING.get())) @@ -484,7 +484,7 @@ public static void init() {} .where('C', blocks(GTOBlocks.HYPER_MECHANICAL_CASING.get())) .where('D', blocks(GTOBlocks.ZIRCONIA_CERAMIC_HIGH_STRENGTH_BENDING_RESISTANCE_MECHANICAL_BLOCK.get())) .where('E', blocks(GTOBlocks.PRESSURE_CONTAINMENT_CASING.get())) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.NaquadahAlloy))) + .where('F', GTOPredicates.frame(GTMaterials.NaquadahAlloy)) .where('G', blocks(GTOBlocks.AMPROSIUM_GEARBOX.get())) .where('H', blocks(GTOBlocks.AMPROSIUM_PIPE_CASING.get())) .where('I', blocks(GTOBlocks.OIL_GAS_TRANSPORTATION_PIPE_CASING.get())) @@ -497,14 +497,14 @@ public static void init() {} .where('M', blocks(GTOBlocks.INDUSTRIAL_FRAMELESS_GLASS.get())) .where('N', blocks(GTOBlocks.SHIELDED_ACCELERATOR.get())) .where('O', blocks(GTOBlocks.DIMENSION_INJECTION_CASING.get())) - .where('P', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.HastelloyN))) + .where('P', GTOPredicates.frame(GTOMaterials.HastelloyN)) .where('Q', blocks(GTOBlocks.BIOACTIVE_MECHANICAL_CASING.get())) .where('R', blocks(GTOBlocks.AMPROSIUM_ACTIVE_CASING.get())) .where('S', blocks(GTOBlocks.HIGH_STRENGTH_SUPPORT_SPINDLE.get())) .where('T', blocks(GTOBlocks.ACCELERATOR_ELECTROMAGNETIC_COIL_CONSTRAINT_CASING_UHV.get())) .where('U', blocks(GTOBlocks.EXTREME_DENSITY_CASING.get())) .where('V', blocks(GTOBlocks.DIMENSIONAL_BRIDGE_CASING.get())) - .where('W', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.TungstenCarbide))) + .where('W', GTOPredicates.frame(GTMaterials.TungstenCarbide)) .where('X', blocks(GTOBlocks.PPS_CORROSION_RESISTANT_MECHANICAL_HOUSING.get())) .where('Y', blocks(GTOBlocks.QUANTUM_GLASS.get())) .where('Z', blocks(GTOBlocks.PLASMA_HEATER_CASING.get())) @@ -513,7 +513,7 @@ public static void init() {} .where(']', blocks(GTOBlocks.FUSION_CASING_MK4.get())) .where('^', blocks(GTOBlocks.ADVANCED_FUSION_COIL.get())) .where('_', blocks(GTOBlocks.HOLLOW_CASING.get())) - .where('`', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Trinium))) + .where('`', GTOPredicates.frame(GTMaterials.Trinium)) .where('a', blocks(GTOBlocks.CONTAINMENT_FIELD_GENERATOR.get())) .where('b', controller(definition)) .where(' ', any()) @@ -585,7 +585,7 @@ public static void init() {} .block(GTOBlocks.NAQUADAH_ALLOY_CASING) .pattern(definition -> MultiBlockFileReader.start(definition) .where('A', blocks(GTOBlocks.STRENGTHEN_THE_BASE_BLOCK.get())) - .where('B', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Naquadah))) + .where('B', GTOPredicates.frame(GTMaterials.Naquadah)) .where('C', blocks(GTOBlocks.NAQUADAH_ALLOY_CASING.get()) .or(GTOPredicates.autoThreadLaserAbilities(definition.getRecipeTypes())) .or(abilities(PARALLEL_HATCH).setMaxGlobalLimited(1)) @@ -632,7 +632,7 @@ public static void init() {} .or(abilities(MAINTENANCE).setExactLimit(1))) .where('J', blocks(GTOBlocks.PRESSURE_CONTAINMENT_CASING.get())) .where('K', blocks(GTOBlocks.IRIDIUM_GEARBOX.get())) - .where('L', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.NaquadahEnriched))) + .where('L', GTOPredicates.frame(GTMaterials.NaquadahEnriched)) .where('M', controller(definition)) .where('N', blocks(GTOBlocks.IRIDIUM_PIPE_CASING.get())) .where('O', abilities(MUFFLER)) @@ -658,7 +658,7 @@ public static void init() {} .where('E', blocks(GTBlocks.FUSION_GLASS.get())) .where('F', blocks(GTOBlocks.AMPROSIUM_GEARBOX.get())) .where('G', heatingCoils()) - .where('H', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Amprosium))) + .where('H', GTOPredicates.frame(GTOMaterials.Amprosium)) .where('I', controller(definition)) .where('J', blocks(GTOBlocks.HIGH_STRENGTH_SUPPORT_SPINDLE.get())) .where('K', blocks(GTOBlocks.HOLLOW_CASING.get())) @@ -732,7 +732,7 @@ public static void init() {} .where('A', blocks(GTOBlocks.OXIDATION_RESISTANT_HASTELLOY_N_MECHANICAL_CASING.get())) .where('B', blocks(GTOBlocks.NAQUADAH_ALLOY_CASING.get())) .where('C', GTOPredicates.glass()) - .where('D', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.TungstenSteel))) + .where('D', GTOPredicates.frame(GTMaterials.TungstenSteel)) .where('E', blocks(GTOBlocks.IRIDIUM_GEARBOX.get())) .where('F', blocks(GTOBlocks.TITANIUM_NITRIDE_CERAMIC_IMPACT_RESISTANT_MECHANICAL_BLOCK.get())) .where('G', blocks(GTOBlocks.INCONEL_625_GEARBOX.get())) @@ -744,10 +744,10 @@ public static void init() {} .or(abilities(MAINTENANCE).setExactLimit(1))) .where('L', blocks(GTOBlocks.CONTAINMENT_FIELD_GENERATOR.get())) .where('M', blocks(GTOBlocks.AMPROSIUM_GEARBOX.get())) - .where('N', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Quantanium))) - .where('O', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.HastelloyC276))) + .where('N', GTOPredicates.frame(GTOMaterials.Quantanium)) + .where('O', GTOPredicates.frame(GTMaterials.HastelloyC276)) .where('P', controller(definition)) - .where('Q', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Europium))) + .where('Q', GTOPredicates.frame(GTMaterials.Europium)) .where(' ', any()) .build()) .workableCasingRenderer(GTOCore.id("block/casings/hyper_mechanical_casing"), GTCEu.id("block/multiblock/cleanroom")) @@ -765,7 +765,7 @@ public static void init() {} .or(autoGCYMAbilities(definition.getRecipeTypes())) .or(autoAbilities(true, false, true))) .where('B', blocks(GCYMBlocks.CASING_NONCONDUCTING.get())) - .where('C', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Polytetrafluoroethylene))) + .where('C', GTOPredicates.frame(GTMaterials.Polytetrafluoroethylene)) .where('D', blocks(GTBlocks.CASING_PTFE_INERT.get())) .where('E', blocks(GTOBlocks.CHEMICAL_GRADE_GLASS.get())) .where('F', blocks(GCYMBlocks.ELECTROLYTIC_CELL.get())) @@ -792,11 +792,11 @@ public static void init() {} .or(abilities(MAINTENANCE).setExactLimit(1))) .where('C', blocks(GTOBlocks.CHEMICAL_CORROSION_RESISTANT_PIPE_CASING.get())) .where('D', blocks(GCYMBlocks.CASING_NONCONDUCTING.get())) - .where('E', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.HastelloyN))) + .where('E', GTOPredicates.frame(GTOMaterials.HastelloyN)) .where('F', blocks(GCYMBlocks.ELECTROLYTIC_CELL.get())) .where('G', blocks(GTBlocks.CASING_POLYTETRAFLUOROETHYLENE_PIPE.get())) .where('H', heatingCoils()) - .where('I', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Polytetrafluoroethylene))) + .where('I', GTOPredicates.frame(GTMaterials.Polytetrafluoroethylene)) .where('J', blocks(GTOBlocks.CALCIUM_OXIDE_CERAMIC_ANTI_METAL_CORROSION_MECHANICAL_BLOCK.get())) .where('K', blocks(GTOBlocks.NEUTRONIUM_STABLE_CASING.get())) .where('L', blocks(GTBlocks.HERMETIC_CASING_UHV.get())) @@ -818,7 +818,7 @@ public static void init() {} .block(GTBlocks.CASING_ALUMINIUM_FROSTPROOF) .tooltips(NewDataAttributes.ALLOW_PARALLEL_NUMBER.create(h -> h.addLines("(密封机械方块等级)×4", "(Hermetic Mechanical Casing tier)×4"))) .pattern(definition -> MultiBlockFileReader.start(definition) - .where('A', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) + .where('A', GTOPredicates.frame(GTMaterials.StainlessSteel)) .where('B', blocks(GTBlocks.CASING_ALUMINIUM_FROSTPROOF.get()) .or(autoAbilities(definition.getRecipeTypes())) .or(abilities(MAINTENANCE).setExactLimit(1))) @@ -846,7 +846,7 @@ public static void init() {} }) .block(GTOBlocks.COMPRESSOR_CONTROLLER_CASING) .pattern(definition -> MultiBlockFileReader.start(definition) - .where('A', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.BlueSteel))) + .where('A', GTOPredicates.frame(GTMaterials.BlueSteel)) .where('B', blocks(GTBlocks.CASING_TITANIUM_STABLE.get())) .where('C', blocks(GTBlocks.CASING_STAINLESS_STEEL_GEARBOX.get())) .where('D', hermeticCasing()) @@ -873,10 +873,10 @@ public static void init() {} .where('A', blocks(GTOBlocks.STAINLESS_STEEL_CORROSION_RESISTANT_CASING.get()) .or(autoAbilities(definition.getRecipeTypes())) .or(abilities(MAINTENANCE).setExactLimit(1))) - .where('B', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.StainlessSteelGC4))) + .where('B', GTOPredicates.frame(GTOMaterials.StainlessSteelGC4)) .where('C', blocks(GTOBlocks.STAINLESS_STEEL_CORROSION_RESISTANT_CASING.get())) .where('D', blocks(GTBlocks.CASING_TITANIUM_GEARBOX.get())) - .where('E', blocks(GTOBlocks.TITANIUM_ALLOY_INTERNAL_FRAME.get())) + .where('E', blocks(GTOBlocks.TITANIUM_ALLOY_FRAME_INTERNAL.get())) .where('F', heatingCoils()) .where('G', controller(definition)) .where(' ', any()) diff --git a/src/main/java/com/gtocore/common/data/machines/MultiblockI.java b/src/main/java/com/gtocore/common/data/machines/MultiblockI.java index aabe9eb96..d34a751a1 100644 --- a/src/main/java/com/gtocore/common/data/machines/MultiblockI.java +++ b/src/main/java/com/gtocore/common/data/machines/MultiblockI.java @@ -1,5 +1,6 @@ package com.gtocore.common.data.machines; +import com.gtocore.api.pattern.GTOPredicates; import com.gtocore.client.renderer.machine.MultiFluidRenderer; import com.gtocore.common.data.GTOBlocks; import com.gtocore.common.data.GTOFluids; @@ -15,8 +16,6 @@ import com.gtolib.utils.MultiBlockFileReader; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; -import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.common.data.GCYMBlocks; import com.gregtechceu.gtceu.common.data.GTBlocks; @@ -55,7 +54,7 @@ public static void init() {} .where('I', blocks(GTBlocks.HIGH_POWER_CASING.get())) .where('J', blocks(GTOBlocks.STAINLESS_STEEL_CORROSION_RESISTANT_CASING.get())) .where('K', blocks(GTBlocks.CASING_POLYTETRAFLUOROETHYLENE_PIPE.get())) - .where('L', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.StructuralSteel45))) + .where('L', GTOPredicates.frame(GTOMaterials.StructuralSteel45)) .where('M', blocks(GTOBlocks.PRESSURE_RESISTANT_HOUSING_MECHANICAL_BLOCK.get()) .or(autoAbilities(definition.getRecipeTypes())) .or(autoAbilities(true, false, true)) @@ -100,14 +99,14 @@ public static void init() {} .where('F', blocks(GTBlocks.FILTER_CASING_STERILE.get())) .where('G', blocks(GTOBlocks.PRESSURE_CONTAINMENT_CASING.get())) .where('g', glass()) - .where('H', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Inconel242))) + .where('H', GTOPredicates.frame(GTOMaterials.Inconel242)) .where('I', blocks(GTOBlocks.BIOLOGICAL_MECHANICAL_CASING.get())) - .where('J', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.StainlessSteel316))) + .where('J', GTOPredicates.frame(GTOMaterials.StainlessSteel316)) .where('K', blocks(GTOBlocks.IRIDIUM_PIPE_CASING.get())) .where('L', blocks(GTOBlocks.CHEMICAL_CORROSION_RESISTANT_PIPE_CASING.get())) .where('l', fluids(GTOFluids.NUTRIENT_DISTILLATION.getSource())) .where('M', blocks(GTOBlocks.HIGH_PRESSURE_PIPE_CASING.get())) - .where('N', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.BlueSteel))) + .where('N', GTOPredicates.frame(GTMaterials.BlueSteel)) .where('w', fluids(Fluids.WATER.getSource())) .where(' ', any()) .build()) diff --git a/src/main/java/com/gtocore/common/data/machines/OptionalMachine.java b/src/main/java/com/gtocore/common/data/machines/OptionalMachine.java index a0f2b893c..be35f3545 100644 --- a/src/main/java/com/gtocore/common/data/machines/OptionalMachine.java +++ b/src/main/java/com/gtocore/common/data/machines/OptionalMachine.java @@ -1,5 +1,6 @@ package com.gtocore.common.data.machines; +import com.gtocore.api.pattern.GTOPredicates; import com.gtocore.common.data.translation.GTOMachineTooltips; import com.gtocore.common.machine.multiblock.electric.ChiselMachine; import com.gtocore.common.machine.multiblock.part.ae.MESimplePatternBufferPartMachine; @@ -9,8 +10,6 @@ import com.gtolib.utils.MultiBlockFileReader; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; -import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; @@ -55,7 +54,7 @@ public static void init() {} .or(abilities(EXPORT_ITEMS).setMaxGlobalLimited(1)) .or(abilities(INPUT_ENERGY).setMaxGlobalLimited(2)) .or(abilities(MAINTENANCE).setExactLimit(1))) - .where('B', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Steel))) + .where('B', GTOPredicates.frame(GTMaterials.Steel)) .where('C', blocks(GTBlocks.CASING_STEEL_SOLID.get())) .where('D', blocks(GTBlocks.STEEL_HULL.get())) .where('E', blocks(GTBlocks.CASING_STEEL_GEARBOX.get())) diff --git a/src/main/java/com/gtocore/common/data/machines/SpaceMultiblock.java b/src/main/java/com/gtocore/common/data/machines/SpaceMultiblock.java index f652fcd79..347e4d878 100644 --- a/src/main/java/com/gtocore/common/data/machines/SpaceMultiblock.java +++ b/src/main/java/com/gtocore/common/data/machines/SpaceMultiblock.java @@ -21,8 +21,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.block.MetaMachineBlock; -import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; -import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; @@ -108,7 +106,7 @@ public static void init() {} .aisle(" ", " A A ", " ACCCA ", " C C ", " ACCCA ", " A A ", " ") .where('A', blocks(GTBlocks.CASING_STAINLESS_CLEAN.get())) .where('B', blocks(GTOBlocks.ALUMINUM_ALLOY_8090_SKIN_MECHANICAL_BLOCK.get())) - .where('C', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.StainlessSteelGC4))) + .where('C', GTOPredicates.frame(GTOMaterials.StainlessSteelGC4)) .where('D', blocks(Stream.of(GTMachines.HULL).map(MachineDefinition::get).toArray(MetaMachineBlock[]::new)).or(abilities(IMPORT_FLUIDS, EXPORT_FLUIDS, INPUT_ENERGY))) .where('e', ISpacePredicateMachine.photovoltaicPlantSupplyingPredicate.get()) .where('E', blocks(GTBlocks.CASING_TEMPERED_GLASS.get())) @@ -200,10 +198,10 @@ public static void init() {} .aisle(" ", " ", " ", " ", " ", " A ", " ", " ", " ", " A A ", " ", " ", " ", " A ", " ", " ", " ", " ", " ") .where('A', blocks(GTOBlocks.ALUMINUM_ALLOY_7050_SUPPORT_MECHANICAL_BLOCK.get())) .where('B', blocks(GTOBlocks.ALUMINUM_ALLOY_2090_SKIN_MECHANICAL_BLOCK.get())) - .where('C', blocks(GTOBlocks.TITANIUM_ALLOY_INTERNAL_FRAME.get())) + .where('C', blocks(GTOBlocks.TITANIUM_ALLOY_FRAME_INTERNAL.get())) .where('c', CORE.traceabilityPredicate.get()) .where('D', blocks(GTOBlocks.SPACECRAFT_DOCKING_CASING.get())) - .where('E', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.StainlessSteel316))) + .where('E', GTOPredicates.frame(GTOMaterials.StainlessSteel316)) .where('F', blocks(GTOBlocks.PRESSURE_RESISTANT_HOUSING_MECHANICAL_BLOCK.get())) .where('G', blocks(GTOBlocks.SPACECRAFT_SEALING_MECHANICAL_BLOCK.get())) .where('H', GTOPredicates.light()) @@ -211,7 +209,7 @@ public static void init() {} .where('J', blocks(GTOBlocks.TITANIUM_ALLOY_PROTECTIVE_MECHANICAL_BLOCK.get())) .where('K', blocks(GTOBlocks.SPACE_ENGINE_NOZZLE.get())) .where('L', blocks(GTOBlocks.LOAD_BEARING_STRUCTURAL_STEEL_MECHANICAL_BLOCK.get())) - .where('M', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.AluminumAlloy7050))) + .where('M', GTOPredicates.frame(GTOMaterials.AluminumAlloy7050)) .where('N', blocks(Stream.of(GTMachines.HULL).map(MachineDefinition::get).toArray(MetaMachineBlock[]::new))) .where('O', blocks(GTOBlocks.STAINLESS_STEEL_CORROSION_RESISTANT_CASING.get())) .where('P', blocks(GTOBlocks.INSULATION_TILE_MECHANICAL_BLOCK.get())) @@ -228,7 +226,7 @@ public static void init() {} .where('Y', blocks(GTOBlocks.TUNGSTEN_ALLOY_RADIATION_SHIELDING_MECHANICAL_BLOCK.get())) .where('Z', blocks(GTOBlocks.ELECTRIC_POWER_TRANSMISSION_CASING.get())) .where('[', GTOPredicates.integralFramework()) - .where('a', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.PlatinumRhodiumAlloy))) + .where('a', GTOPredicates.frame(GTOMaterials.PlatinumRhodiumAlloy)) .where(']', blocks(GTOBlocks.SENSOR_PROTECTIVE_COVER_CASING.get())) .where('p', ISpacePredicateMachine.innerBlockPredicate.get()) .where(' ', any()) @@ -318,7 +316,7 @@ public static void init() {} .aisle(" ", " ", " ", " ABA ", " ACDCA ", " ACpppCA ", " BDpppDB ", " ACpppCA ", " ACDCA ", " ABA ", " ", " ", " ") .where('A', blocks(GTOBlocks.ALUMINUM_ALLOY_2090_SKIN_MECHANICAL_BLOCK.get())) .where('B', blocks(GTOBlocks.ALUMINUM_ALLOY_7050_SUPPORT_MECHANICAL_BLOCK.get())) - .where('C', blocks(GTOBlocks.TITANIUM_ALLOY_INTERNAL_FRAME.get())) + .where('C', blocks(GTOBlocks.TITANIUM_ALLOY_FRAME_INTERNAL.get())) .where('c', CONJUNCTION.traceabilityPredicate.get()) .where('D', blocks(GTOBlocks.SPACECRAFT_DOCKING_CASING.get())) .where('E', blocks(GTOBlocks.TITANIUM_ALLOY_PROTECTIVE_MECHANICAL_BLOCK.get())) @@ -347,7 +345,7 @@ public static void init() {} .aisle(" ", " ", " ", " ", " ", " ", " I ", " ", " ", " ", " ", " ", " ") .where('A', blocks(GTOBlocks.ALUMINUM_ALLOY_2090_SKIN_MECHANICAL_BLOCK.get())) .where('B', blocks(GTOBlocks.ALUMINUM_ALLOY_7050_SUPPORT_MECHANICAL_BLOCK.get())) - .where('C', blocks(GTOBlocks.TITANIUM_ALLOY_INTERNAL_FRAME.get())) + .where('C', blocks(GTOBlocks.TITANIUM_ALLOY_FRAME_INTERNAL.get())) .where('c', CONJUNCTION.traceabilityPredicate.get()) .where('D', blocks(GTOBlocks.SPACECRAFT_DOCKING_CASING.get())) .where('E', blocks(GTOBlocks.TITANIUM_ALLOY_PROTECTIVE_MECHANICAL_BLOCK.get())) @@ -379,12 +377,12 @@ public static void init() {} .aisle(" A ", " BDDDB ", " DDDDEEEDDDD ", " DFFFDFFFDFFFD ", " GGDEHHHHHHHHHHHEDGG", " BBDEHHHHHHHHHHHEDBB", " GGDEHHHHHHHHHHHEDGG", " DFFFDFFFDFFFD ", " DDDDEEEDDDD ", " BDDDB ", " A ") .aisle(" ", " A ", " BDDDB ", " DDDDEEEDDDD ", " DCCCCCCCCCCCD ", " DCCCCCCCCCCCD ", " DCCCCCCCCCCCD ", " DDDDEEEDDDD ", " BDDDB ", " A ", " ") .aisle(" ", " ", " A ", " BAAAB ", " BCCCB ", " BCCCB ", " BCCCB ", " BAAAB ", " A ", " ", " ") - .where('A', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.StainlessSteel316))) + .where('A', GTOPredicates.frame(GTOMaterials.StainlessSteel316)) .where('B', blocks(GTOBlocks.ALUMINUM_ALLOY_7050_SUPPORT_MECHANICAL_BLOCK.get())) .where('C', blocks(GTBlocks.CLEANROOM_GLASS.get())) .where('c', CONJUNCTION.traceabilityPredicate.get()) .where('D', blocks(GTOBlocks.TITANIUM_ALLOY_PROTECTIVE_MECHANICAL_BLOCK.get())) - .where('E', blocks(GTOBlocks.TITANIUM_ALLOY_INTERNAL_FRAME.get())) + .where('E', blocks(GTOBlocks.TITANIUM_ALLOY_FRAME_INTERNAL.get())) .where('F', GTOPredicates.light()) .where('G', blocks(GTOBlocks.ALUMINUM_ALLOY_2090_SKIN_MECHANICAL_BLOCK.get())) .where('H', ISpacePredicateMachine.innerBlockPredicate.get()) @@ -419,13 +417,13 @@ public static void init() {} .aisle(" ", " ", " QQ QQ ", " QQ QQ ", " QQ QQQQQ QQ ", " FG JJ PP JJ QRQRQ JJ PP JJ GF ", " FG QRQRQ GF ", " FGJJJJJJ JJJJJJQQQQQJJJJJJ JJJJJJGF ", " FG QRQRQ GF ", " FG JJ PP JJ QRQRQ JJ PP JJ GF ", " QQ QQQQQ QQ ", " QQ QQ ", " QQ QQ ", " ", " ") .aisle(" ", " ", " ", " QQ QQ ", " IIIIIIIIIIII IIIIIIIIIIII ", " IIJJIIPPIIJJII IIJJIIPPIIJJII ", " IIIIIIIIIIIIII IIIIIIIIIIIIII ", " IIIIIIIIIIIIIIFFFFFIIIIIIIIIIIIII ", " IIIIIIIIIIIIII IIIIIIIIIIIIII ", " IIJJIIPPIIJJII IIJJIIPPIIJJII ", " IIIIIIIIIIII IIIIIIIIIIII ", " QQ QQ ", " ", " ", " ") .aisle(" ", " ", " ", " ", " ", " IIIIPPIIII IIIIPPIIII ", " IIIIIPPIIIII IIIIIPPIIIII ", " IIIIIPPIIIII IIIIIPPIIIII ", " IIIIIPPIIIII IIIIIPPIIIII ", " IIIIPPIIII IIIIPPIIII ", " ", " ", " ", " ", " ") - .where('A', blocks(GTOBlocks.TITANIUM_ALLOY_INTERNAL_FRAME.get())) + .where('A', blocks(GTOBlocks.TITANIUM_ALLOY_FRAME_INTERNAL.get())) .where('a', MODULE.traceabilityPredicate.get()) .where('B', controller(definition)) .where('C', blocks(GTOBlocks.ALUMINUM_ALLOY_7050_SUPPORT_MECHANICAL_BLOCK.get())) .where('D', blocks(GTOBlocks.SPACECRAFT_DOCKING_CASING.get())) .where('E', blocks(GTOBlocks.ALUMINUM_ALLOY_2090_SKIN_MECHANICAL_BLOCK.get())) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.StainlessSteel316))) + .where('F', GTOPredicates.frame(GTOMaterials.StainlessSteel316)) .where('G', blocks(GTOBlocks.TITANIUM_ALLOY_PROTECTIVE_MECHANICAL_BLOCK.get())) .where('H', blocks(GTOBlocks.SPACECRAFT_SEALING_MECHANICAL_BLOCK.get()) .or(abilities(EXPORT_ITEMS))) @@ -476,13 +474,13 @@ public static void init() {} .aisle(" ", " ", " M M M M ", " M M M M ", " ONOINKNKNIONO ", " ONOINKNKNIONO ", " PPPPPPP ", " IIIIIIIIIII P P IIIIIIIIIII ", " KKKKL LPPPPPPPL LKKKK ", " IIIIIIIIIII P P IIIIIIIIIII ", " PPPPPPP ", " O OI K K IO O ", " O OI K K IO O ", " M M M M ", " M M M M ", " ", " ") .aisle(" ", " ", " ", " ", " M M M M ", " M M M M ", " O OI K K IO O ", " IIIIO OI K K IO OIIII ", " O OI K K IO O ", " IIIIO OI K K IO OIIII ", " O OI K K IO O ", " M M M M ", " M M M M ", " ", " ", " ", " ") .aisle(" ", " ", " ", " ", " ", " ", " M M M M ", " M M M M ", " M M M M ", " M M M M ", " M M M M ", " ", " ", " ", " ", " ", " ") - .where('A', blocks(GTOBlocks.TITANIUM_ALLOY_INTERNAL_FRAME.get())) + .where('A', blocks(GTOBlocks.TITANIUM_ALLOY_FRAME_INTERNAL.get())) .where('a', MODULE.traceabilityPredicate.get()) .where('B', controller(definition)) .where('C', blocks(GTOBlocks.ALUMINUM_ALLOY_7050_SUPPORT_MECHANICAL_BLOCK.get())) .where('D', blocks(GTOBlocks.SPACECRAFT_DOCKING_CASING.get())) .where('E', blocks(GTOBlocks.ALUMINUM_ALLOY_2090_SKIN_MECHANICAL_BLOCK.get())) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.StainlessSteel316))) + .where('F', GTOPredicates.frame(GTOMaterials.StainlessSteel316)) .where('G', blocks(GTOBlocks.PRESSURE_RESISTANT_HOUSING_MECHANICAL_BLOCK.get())) .where('H', blocks(GTOBlocks.SMELTING_CONTROL_CASING.get()) .or(autoSpaceMachineAbilities(definition.getRecipeTypes())) @@ -529,13 +527,13 @@ public static void init() {} .aisle(" ", " ", " OOOSOOOSOOOS SOOOSOOOSOOO ", " OOOSOOOSOOOS SOOOSOOOSOOO ", " IOOOSOOOSOOOS SOOOSOOOSOOOI ", " FIKFFFFFFFFFFK KFFFFFFFFFFKIF ", " EEOOOSOOOSOOOS SOOOSOOOSOOOEE ", " EE P P P P EE ", " EEQQQ QQQ QQQSTSQQQ QQQ QQQEE ", " FIKNK KNK KNK A KNK KNK KNKIF ", " IKNK KNK KNK A KNK KNK KNKI ", " QQQ QQQ QQQSTSQQQ QQQ QQQ ", " QQQ QQQ QQQSTSQQQ QQQ QQQ ", " ", " ") .aisle(" ", " ", " ", " ", " OOOSOOOSOOOS SOOOSOOOSOOO ", " FOOOSTTTSTTTS STTTSTTTSOOOF ", " OOOSOOOSOOOS SOOOSOOOSOOO ", " ", " QQQ QQQ QQQSTSQQQ QQQ QQQ ", " FQKQ QKQ QKQSTSQKQ QKQ QKQF ", " QKQ QKQ QKQSTSQKQ QKQ QKQ ", " QQQ QQQ QQQSTSQQQ QQQ QQQ ", " ", " ", " ") .aisle(" ", " ", " ", " ", " ", " FFFFFFFFFFFFFFFFFFFFFFFFF ", " ", " ", " ", " FFFFFFFFFFFFFFFFFFFFFFFFF ", " ", " ", " ", " ", " ") - .where('A', blocks(GTOBlocks.TITANIUM_ALLOY_INTERNAL_FRAME.get())) + .where('A', blocks(GTOBlocks.TITANIUM_ALLOY_FRAME_INTERNAL.get())) .where('a', MODULE.traceabilityPredicate.get()) .where('B', controller(definition)) .where('C', blocks(GTOBlocks.ALUMINUM_ALLOY_7050_SUPPORT_MECHANICAL_BLOCK.get())) .where('D', blocks(GTOBlocks.SPACECRAFT_DOCKING_CASING.get())) .where('E', blocks(GTOBlocks.ALUMINUM_ALLOY_2090_SKIN_MECHANICAL_BLOCK.get())) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.StainlessSteel316))) + .where('F', GTOPredicates.frame(GTOMaterials.StainlessSteel316)) .where('G', blocks(GTOBlocks.SPACE_STATION_CONTROL_CASING.get()) .or(autoSpaceMachineAbilities(definition.getRecipeTypes())) .or(abilities(PARALLEL_HATCH).setMaxGlobalLimited(1))) @@ -547,7 +545,7 @@ public static void init() {} .where('M', blocks(GTOBlocks.PRECISION_PROCESSING_MECHANICAL_CASING.get())) .where('N', blocks(GTOBlocks.IRIDIUM_PIPE_CASING.get())) .where('O', blocks(GTOBlocks.PIKYONIUM_MACHINE_CASING.get())) - .where('P', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.StainlessSteelGC4))) + .where('P', GTOPredicates.frame(GTOMaterials.StainlessSteelGC4)) .where('p', ISpacePredicateMachine.innerBlockPredicate.get()) .where('Q', blocks(GTOBlocks.OXIDATION_RESISTANT_HASTELLOY_N_MECHANICAL_CASING.get())) .where('R', blocks(GTOBlocks.HIGH_PRESSURE_PIPE_CASING.get())) @@ -580,13 +578,13 @@ public static void init() {} .aisle(" ", " G G G G ", " GG GG GG GG ", " GGGG GGGGFFFGGGG GGGG ", " GGGGLIIIG K GIIILIIILIIIG K GIIILGGGG ", " GIIKGIIIGKKKGIIIGKNKGIIIGKKKGIIIGKIIG ", " CCFGIIIGIIIGKKKGIIIGINIGIIIGKKKGIIIGIIIGFCC", " GIIKGIIIGKKKGIIIGKNKGIIIGKKKGIIIGKIIG ", " GGGGLIIIG K GIIILIIIL G K GIIILGGGG ", " GGGG GGGGFFFGGGG GGGG ", " GG GG GG GG ", " G G G G ", " ") .aisle(" ", " ", " G G G G ", " GG GG GG GG ", " LGGG GGGL LGGG GGGL ", " KGJGGKIIIKGGJGK KGJGGKIIIKGGJGK ", " FIIIGJGGIIIIIGGJG GJGGIIIIIGGJGIIIF ", " KGJGGKIIIKGGJGK KGJGGKIIIKGGJGK ", " LGGG GGGL LGGG GGGL ", " GG GG GG GG ", " G G G G ", " ", " ") .aisle(" ", " ", " ", " G G G G ", " GG GG GG GG ", " KKKKK KKKKK KKKKK KKKKK ", " GG GG GG GG ", " KKKKK KKKKK KKKKK KKKKK ", " GG GG GG GG ", " G G G G ", " ", " ", " ") - .where('A', blocks(GTOBlocks.TITANIUM_ALLOY_INTERNAL_FRAME.get())) + .where('A', blocks(GTOBlocks.TITANIUM_ALLOY_FRAME_INTERNAL.get())) .where('a', MODULE.traceabilityPredicate.get()) .where('B', controller(definition)) .where('C', blocks(GTOBlocks.ALUMINUM_ALLOY_7050_SUPPORT_MECHANICAL_BLOCK.get())) .where('D', blocks(GTOBlocks.SPACECRAFT_DOCKING_CASING.get())) .where('E', blocks(GTOBlocks.ALUMINUM_ALLOY_2090_SKIN_MECHANICAL_BLOCK.get())) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.StainlessSteel316))) + .where('F', GTOPredicates.frame(GTOMaterials.StainlessSteel316)) .where('G', blocks(GTOBlocks.TITANIUM_ALLOY_PROTECTIVE_MECHANICAL_BLOCK.get())) .where('H', blocks(GTOBlocks.PRECISION_MACHINING_CONTROL_CASING.get()) .or(autoSpaceMachineAbilities(definition.getRecipeTypes())) @@ -595,7 +593,7 @@ public static void init() {} .where('J', blocks(GTOBlocks.PRECISION_MACHINING_CONTROL_CASING.get())) .where('K', blocks(GTOBlocks.HYPER_MECHANICAL_CASING.get())) .where('L', blocks(GCYMBlocks.ELECTROLYTIC_CELL.get())) - .where('M', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Naquadria))) + .where('M', GTOPredicates.frame(GTMaterials.Naquadria)) .where('N', blocks(GTOBlocks.NAQUADAH_BOROSILICATE_GLASS.get())) .where('p', ISpacePredicateMachine.innerBlockPredicate.get()) .where(' ', any()) @@ -632,13 +630,13 @@ public static void init() {} .aisle(" ", " ", " ", " CQC CQC CQC CQC ", " MRM MRM MRM MRM ", " M MGGGGM MGGGGGM MGGGGM M ", " MRM G G MRM G G MRM G G MRM ", " CQC G G CQC G G CQC G G CQC ", " G G G G G G ", " CQC G G CQC G G CQC G G CQC ", " MRM G G MRM G G MRM G G MRM ", " M MGGGGM MGGGGGM MGGGGM M ", " MRM MRM MRM MRM ", " CQC CQC CQC CQC ", " ", " ", " ") .aisle(" ", " ", " ", " CQC CQC CQC CQC ", " MRM MRM MRM MRM ", " M M M M GGG M M M M ", " MRM GGGG MRM GGGGG MRM GGGG MRM ", " CQC GGGG CQC GGGGG CQC GGGG CQC ", " GGGG GGGGG GGGG ", " CQC GGGG CQC GGGGG CQC GGGG CQC ", " MRM GGGG MRM GGGGG MRM GGGG MRM ", " M M M M GGG M M M M ", " MRM MRM MRM MRM ", " CQC CQC CQC CQC ", " ", " ", " ") .aisle(" ", " ", " ", " ", " MMM MMM MMM MMM ", " M M M M M M M M ", " MMM MMM MMM MMM ", " ", " ", " ", " MMM MMM MMM MMM ", " M M M M M M M M ", " MMM MMM MMM MMM ", " ", " ", " ", " ") - .where('A', blocks(GTOBlocks.TITANIUM_ALLOY_INTERNAL_FRAME.get())) + .where('A', blocks(GTOBlocks.TITANIUM_ALLOY_FRAME_INTERNAL.get())) .where('a', MODULE.traceabilityPredicate.get()) .where('B', controller(definition)) .where('C', blocks(GTOBlocks.ALUMINUM_ALLOY_7050_SUPPORT_MECHANICAL_BLOCK.get())) .where('D', blocks(GTOBlocks.SPACECRAFT_DOCKING_CASING.get())) .where('E', blocks(GTOBlocks.ALUMINUM_ALLOY_2090_SKIN_MECHANICAL_BLOCK.get())) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.StainlessSteel316))) + .where('F', GTOPredicates.frame(GTOMaterials.StainlessSteel316)) .where('G', blocks(GTOBlocks.TITANIUM_ALLOY_PROTECTIVE_MECHANICAL_BLOCK.get())) .where('H', blocks(GTOBlocks.SPACE_STATION_CONTROL_CASING.get()) .or(autoAbilities(definition.getRecipeTypes())) @@ -646,10 +644,10 @@ public static void init() {} .where('I', blocks(GTOBlocks.PRESSURE_RESISTANT_HOUSING_MECHANICAL_BLOCK.get())) .where('J', blocks(GTOBlocks.LOW_TEMPERATURE_FUEL_TANK_CASING.get())) .where('K', blocks(GTOBlocks.LOW_TEMPERATURE_FUEL_PIPE_CASING.get())) - .where('L', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.StainlessSteelJbk75))) + .where('L', GTOPredicates.frame(GTOMaterials.StainlessSteelJbk75)) .where('M', blocks(GTOBlocks.TUNGSTEN_ALLOY_IMPACT_RESISTANT_MECHANICAL_BLOCK.get())) .where('N', blocks(GTOBlocks.IRIDIUM_PIPE_CASING.get())) - .where('O', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.BerylliumAluminumF))) + .where('O', GTOPredicates.frame(GTOMaterials.BerylliumAluminumF)) .where('P', blocks(GTOBlocks.HASTELLOY_N_75_GEARBOX.get())) .where('Q', blocks(GTOBlocks.HSSS_BOROSILICATE_GLASS.get())) .where('R', blocks(GTOBlocks.MAGTECH_CASING.get())) @@ -688,9 +686,9 @@ public static void init() {} .aisle(" ", " ", " ", " CCCCCCCCCppppCC ", " CCHHHHHCCppppCC ", " HHHHOOOHHHH ", " BBHHHHOOOHHHHBBB ", " HHHHOOOHHHH ", " CCHHHHHCCppppCC ", " CCCCCCCCCppppCC ", " ", " ", " ") .aisle(" ", " ", " ", " ", " CBBBBBC ", " CpppppC ", " BBCpppppCBB ", " CpppppC ", " CBBBBBC ", " ", " ", " ", " ") .where('A', blocks(GTOBlocks.SENSOR_PROTECTIVE_COVER_CASING.get())) - .where('B', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.UltraLightweightCompositeSteel))) + .where('B', GTOPredicates.frame(GTOMaterials.UltraLightweightCompositeSteel)) .where('C', blocks(GTOBlocks.TITANIUM_ALLOY_PROTECTIVE_MECHANICAL_BLOCK.get())) - .where('D', blocks(GTOBlocks.TITANIUM_ALLOY_INTERNAL_FRAME.get())) + .where('D', blocks(GTOBlocks.TITANIUM_ALLOY_FRAME_INTERNAL.get())) .where('E', blocks(GTOBlocks.SPACE_STATION_CONTROL_CASING.get())) .where('F', blocks(GTOBlocks.INSULATION_TILE_MECHANICAL_BLOCK.get())) .where('G', blocks(GTOBlocks.COBALT_OXIDE_CERAMIC_STRONG_THERMALLY_CONDUCTIVE_MECHANICAL_BLOCK.get())) @@ -704,7 +702,7 @@ public static void init() {} .where('O', blocks(GTOBlocks.OPTICAL_DYNAMIC_COATING_INSTRUMENT_PROTECTIVE_SHIELD_GLASS.get())) .where('P', blocks(GTOBlocks.THREE_PROOF_COMPUTER_CASING.get())) .where('Q', blocks(GTOBlocks.SPACE_STATION_CONTROL_CASING.get())) - .where('R', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.StainlessSteel316))) + .where('R', GTOPredicates.frame(GTOMaterials.StainlessSteel316)) .where('S', blocks(GTOBlocks.ALUMINUM_ALLOY_2090_SKIN_MECHANICAL_BLOCK.get())) .where('T', blocks(GTOBlocks.ALUMINUM_ALLOY_7050_SUPPORT_MECHANICAL_BLOCK.get())) .where('U', blocks(GTOBlocks.SPACECRAFT_DOCKING_CASING.get())) @@ -724,8 +722,8 @@ public static void init() {} .recipeTypes(GTORecipeTypes.DUMMY_RECIPES) .block(GTOBlocks.SPACECRAFT_DYNAMIC_PROTECTIVE_MECHANICAL_CASING) .pattern(definition -> MultiBlockFileReader.start(definition) - .where('A', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.StainlessSteel316))) - .where('B', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.StainlessSteelJbk75))) + .where('A', GTOPredicates.frame(GTOMaterials.StainlessSteel316)) + .where('B', GTOPredicates.frame(GTOMaterials.StainlessSteelJbk75)) .where('C', blocks(GTOBlocks.TUNGSTEN_ALLOY_IMPACT_RESISTANT_MECHANICAL_BLOCK.get())) .where('D', blocks(GTBlocks.HIGH_POWER_CASING.get())) .where('E', blocks(GTOBlocks.THREE_PROOF_COMPUTER_CASING.get())) @@ -735,10 +733,10 @@ public static void init() {} .where('I', blocks(GTOBlocks.CREEP_RESISTANT_SMELTING_CASING.get())) .where('J', blocks(GTOBlocks.TITANIUM_ALLOY_PROTECTIVE_MECHANICAL_BLOCK.get())) .where('K', GTOPredicates.light()) - .where('L', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Etrium))) + .where('L', GTOPredicates.frame(GTOMaterials.Etrium)) .where('M', blocks(GCYMBlocks.CASING_HIGH_TEMPERATURE_SMELTING.get())) .where('N', blocks(GTOBlocks.SPACE_ENGINE_NOZZLE.get())) - .where('O', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.ScalmAlloyS))) + .where('O', GTOPredicates.frame(GTOMaterials.ScalmAlloyS)) .where('P', blocks(GTOBlocks.COOLANT_PIPE_CASING.get())) .where('Q', blocks(GTOBlocks.OPTICAL_DYNAMIC_COATING_INSTRUMENT_PROTECTIVE_SHIELD_GLASS.get())) .where('R', blocks(GTOBlocks.SPACECRAFT_DYNAMIC_PROTECTIVE_MECHANICAL_CASING.get())) @@ -747,7 +745,7 @@ public static void init() {} .where('U', blocks(GTOBlocks.IRIDIUM_PIPE_CASING.get())) .where('V', blocks(GTOBlocks.ALUMINUM_ALLOY_2090_SKIN_MECHANICAL_BLOCK.get())) .where('W', blocks(GTOBlocks.ALUMINUM_ALLOY_7050_SUPPORT_MECHANICAL_BLOCK.get())) - .where('X', blocks(GTOBlocks.TITANIUM_ALLOY_INTERNAL_FRAME.get())) + .where('X', blocks(GTOBlocks.TITANIUM_ALLOY_FRAME_INTERNAL.get())) .where('Y', blocks(GTOBlocks.SPACECRAFT_DOCKING_CASING.get())) .where('Z', MODULE.traceabilityPredicate.get()) .where('[', controller(definition)) @@ -767,19 +765,19 @@ public static void init() {} .recipeTypes(GTORecipeTypes.BIOCHEMICAL_REACTION_RECIPES, GTORecipeTypes.INCUBATOR_RECIPES, GTORecipeTypes.BIO_RESEARCH_RECIPES) .block(GTOBlocks.BIOLOGICAL_MECHANICAL_CASING) .pattern(definition -> MultiBlockFileReader.start(definition, RelativeDirection.UP, RelativeDirection.RIGHT, RelativeDirection.FRONT) - .where('C', blocks(GTOBlocks.TITANIUM_ALLOY_INTERNAL_FRAME.get())) + .where('C', blocks(GTOBlocks.TITANIUM_ALLOY_FRAME_INTERNAL.get())) .where('E', ISpacePredicateMachine.innerBlockPredicate.get()) .where('H', MODULE.traceabilityPredicate.get()) .where('A', blocks(GTOBlocks.ALUMINUM_ALLOY_2090_SKIN_MECHANICAL_BLOCK.get())) .where('B', blocks(GTOBlocks.ALUMINUM_ALLOY_7050_SUPPORT_MECHANICAL_BLOCK.get())) .where('D', blocks(GTOBlocks.SPACECRAFT_DOCKING_CASING.get())) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.StainlessSteel316))) + .where('F', GTOPredicates.frame(GTOMaterials.StainlessSteel316)) .where('G', blocks(GTOBlocks.PRESSURE_RESISTANT_HOUSING_MECHANICAL_BLOCK.get())) .where('I', blocks(GTOBlocks.TITANIUM_ALLOY_PROTECTIVE_MECHANICAL_BLOCK.get())) .where('J', blocks(GTOBlocks.CHEMICAL_CORROSION_RESISTANT_PIPE_CASING.get())) .where('K', blocks(GTOBlocks.LOAD_BEARING_STRUCTURAL_STEEL_MECHANICAL_BLOCK.get())) .where('L', blocks(GTOBlocks.SENSOR_PROTECTIVE_COVER_CASING.get())) - .where('M', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.BorosilicateFiberReinforcedAluminumMatrixComposite))) + .where('M', GTOPredicates.frame(GTOMaterials.BorosilicateFiberReinforcedAluminumMatrixComposite)) .where('N', blocks(GTOBlocks.BIOLOGICAL_MECHANICAL_CASING.get())) .where('O', blocks(GTBlocks.CASING_STAINLESS_CLEAN.get())) .where('P', blocks(GTBlocks.CLEANROOM_GLASS.get())) diff --git a/src/main/java/com/gtocore/common/data/material/MaterialSpaceEra.java b/src/main/java/com/gtocore/common/data/material/MaterialSpaceEra.java index eec028f4a..3dbb258c9 100644 --- a/src/main/java/com/gtocore/common/data/material/MaterialSpaceEra.java +++ b/src/main/java/com/gtocore/common/data/material/MaterialSpaceEra.java @@ -1,6 +1,7 @@ package com.gtocore.common.data.material; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.data.chemical.material.properties.ToolProperty; import static com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialFlags.*; import static com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialIconSet.*; @@ -138,6 +139,8 @@ public static void init() { GENERATE_SMALL_GEAR, GENERATE_LONG_ROD, GENERATE_FRAME, GENERATE_FOIL, GENERATE_BOLT_SCREW, GENERATE_RING, DECOMPOSITION_BY_CENTRIFUGING) + .toolStats(ToolProperty.Builder.of(60.0F, 24.0F, 2500, 4) + .enchantability(21).build()) .fluidPipeProperties(3500, 3500, true, true, true) .buildAndRegister(); @@ -314,6 +317,8 @@ public static void init() { .components(Steel, 80, Chromium, 12, Nickel, 1) .blastTemp(2410, LOW, GTValues.VA[GTValues.HV], 1100) .iconSet(METALLIC) + .toolStats(ToolProperty.Builder.of(40.0F, 12.0F, 1400, 4) + .enchantability(31).build()) .flags(GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_LONG_ROD, GENERATE_FRAME, GENERATE_FOIL, GENERATE_BOLT_SCREW, GENERATE_RING, CAN_BE_COOLED_DOWN_BY_BATHING, DECOMPOSITION_BY_CENTRIFUGING) @@ -328,6 +333,8 @@ public static void init() { .flags(GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_LONG_ROD, GENERATE_FRAME, GENERATE_FOIL, GENERATE_BOLT_SCREW, GENERATE_RING, CAN_BE_COOLED_DOWN_BY_BATHING, DECOMPOSITION_BY_CENTRIFUGING) + .toolStats(ToolProperty.Builder.of(14.0F, 14.0F, 4500, 4) + .enchantability(36).build()) .buildAndRegister(); TitaniumTi64 = material("titanium_ti64", "钛合金-Ti64") .ingot().fluid() @@ -336,6 +343,8 @@ public static void init() { .components(Titanium, 45, Aluminium, 3, Vanadium, 2) .blastTemp(2630, LOW, GTValues.VA[GTValues.HV], 1060) .iconSet(METALLIC) + .toolStats(ToolProperty.Builder.of(12.0F, 12.0F, 2500, 4) + .enchantability(31).build()) .flags(GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_LONG_ROD, GENERATE_FRAME, GENERATE_FOIL, GENERATE_BOLT_SCREW, GENERATE_RING, DECOMPOSITION_BY_CENTRIFUGING) diff --git a/src/main/java/com/gtocore/common/data/translation/GTOItemTooltips.kt b/src/main/java/com/gtocore/common/data/translation/GTOItemTooltips.kt index 836731503..5ff5422cb 100644 --- a/src/main/java/com/gtocore/common/data/translation/GTOItemTooltips.kt +++ b/src/main/java/com/gtocore/common/data/translation/GTOItemTooltips.kt @@ -4,7 +4,6 @@ import com.gtocore.api.lang.ComponentListSupplier import com.gtocore.api.lang.ComponentSupplier import com.gtocore.api.lang.toLiteralSupplier import com.gtocore.api.misc.AutoInitialize -import com.gtocore.common.block.BlockMap import com.gtocore.common.data.GTOBlocks import com.gtocore.common.data.GTOItems import com.gtocore.config.GTOConfig @@ -78,12 +77,6 @@ object GTOItemTooltips : AutoInitialize() { increase("PRO版本可以批量应用" translatedTo "PRO version can apply in batch") } - val ConversionSimulationCard = ComponentListSupplier { - setTranslationPrefix("conversion_simulation_card") - - function("为大型方块转换室提供模拟转换环境" translatedTo "Provides a simulated conversion environment for large block conversion chambers") - } - // AE2 订单 val OrderTooltips = ComponentListSupplier { setTranslationPrefix("order") @@ -206,7 +199,7 @@ object GTOItemTooltips : AutoInitialize() { ComponentListSupplier { setTranslationPrefix("charge_bomb") - if (GTCEu.isDataGen() || !GTOConfig.INSTANCE.disableChargeBomb) { + if (GTCEu.isDataGen() || !GTOConfig.INSTANCE.gamePlay.disableChargeBomb) { info( ComponentSupplier( Component.translatable( @@ -256,7 +249,8 @@ object GTOItemTooltips : AutoInitialize() { listOf(AEItems.CERTUS_QUARTZ_KNIFE.asItem(), AEItems.NETHER_QUARTZ_KNIFE.asItem()).forEach { it.setTooltips( ComponentListSupplier { - highlight("Shift+右键方块可以复制其名称,便于命名" translatedTo "Shift+Right click a block to copy its name, which is convenient for naming") + highlight("Shift+右键方块可以复制其名称" translatedTo "Shift+Right click a block to copy its name") + highlight("右键物品可以复制其名称" translatedTo "Right click an item to copy its name") }.editionByGTONormal(), ) } @@ -292,7 +286,7 @@ object GTOItemTooltips : AutoInitialize() { ComponentListSupplier { setTranslationPrefix("muffler_hatch") - if (GTOConfig.INSTANCE.disableMufflerPart) { + if (GTOConfig.INSTANCE.gamePlay.disableMufflerPart) { info( ComponentSupplier( Component.translatable( diff --git a/src/main/java/com/gtocore/common/data/translation/GTOMachineStories.kt b/src/main/java/com/gtocore/common/data/translation/GTOMachineStories.kt index 240fa18f5..080461f87 100644 --- a/src/main/java/com/gtocore/common/data/translation/GTOMachineStories.kt +++ b/src/main/java/com/gtocore/common/data/translation/GTOMachineStories.kt @@ -176,7 +176,13 @@ object GTOMachineStories : AutoInitialize() { setTranslationPrefix("void_fluid_drill") story("虚空流体钻机§r§b是格雷科技在虚空领域的又一力作" translatedTo "Void Fluid Drill§r is another masterpiece of GregTech in the void field") story("它可以在虚空中钻取流体" translatedTo "It can drill fluids in the void") - highlight("放入维度数据,设置电路后即可获取钻出对应世界流体矿床的流体" translatedTo "Insert dimension data and set the circuit to obtain fluids from corresponding world fluid deposits") + } + + // 虚空采矿机 + val VoidMinerTooltips = ComponentListSupplier { + setTranslationPrefix("void_miner") + story("虚空采矿机§r§b是格雷科技在虚空领域的又一力作" translatedTo "Void Miner§r is another masterpiece of GregTech in the void field") + story("它可以在虚空中开采矿石" translatedTo "It can mine ores in the void") } // 能量注入仪 diff --git a/src/main/java/com/gtocore/common/data/translation/GTOMachineTooltips.kt b/src/main/java/com/gtocore/common/data/translation/GTOMachineTooltips.kt index 1d6a64261..68ddb5c6c 100644 --- a/src/main/java/com/gtocore/common/data/translation/GTOMachineTooltips.kt +++ b/src/main/java/com/gtocore/common/data/translation/GTOMachineTooltips.kt @@ -47,12 +47,12 @@ object GTOMachineTooltips { danger("一键清空方块!!!" translatedTo "One click to clear the blocks!!!") danger("无视一切条件!!!" translatedTo "Ignore all conditions!!!") danger("注意爆破安全!!!" translatedTo "Pay attention to blasting safety!!!") - highlight("多人游戏请务必提醒其他成员!" translatedTo "Be sure to remind other players in the multiplayer game! ") + highlight("多人游戏请务必提醒其他成员!" translatedTo "Be sure to warn other players in the multiplayer game! ") section("可用模式" translatedTo "Available Modes") function("向库存放入物品以切换模式" translatedTo "Add items to inventory to switch modes") command("放入§b模具(球)§r为§6球模式§r" translatedTo "Put §bCasting Mold (Ball)§r for §6Ball mode§r") - command("放入§b模具(圆柱)§r为§6圆柱模式§r" translatedTo "Put §bCasting Mold (Cylinder)§r for §6Casting mode§r") + command("放入§b模具(圆柱)§r为§6圆柱模式§r" translatedTo "Put §bCasting Mold (Cylinder)§r for §Cylinder mode§r") command("放入§b模具(块)§r为§6区块模式§r" translatedTo "Put §bCasting Mold (Block)§r for §6Chunk mode§r") command("放入§b奇点§r为§6指定区域模式§r" translatedTo "Put §bSingularity§r for §6Designated Area mode§r") info("此时用两个§9坐标信息卡§r来确定区域" translatedTo "Now use two §9Coordinate Cards§r to determine the area") @@ -92,7 +92,7 @@ object GTOMachineTooltips { section("基于预设蓝图快速部署工业基地" translatedTo "Rapidly deploy industrial bases via preset blueprints") section( "需消耗指定型号的工业组件作为基础构建材料" translatedTo - "Requires specific industrial components components as basic construction materials.", + "Requires specific industrial components as basic construction materials.", ) section( "部分高级蓝图需额外配备辅助材料" translatedTo @@ -171,7 +171,7 @@ object GTOMachineTooltips { section("蓝图导出功能" translatedTo "Blueprint Export Function") content("将两张坐标卡插入工具底部插槽可激活导出模式" translatedTo "Insert two coordinate cards into the tool's bottom slots to activate export mode") highlight("欢迎提交优质蓝图至社区仓库" translatedTo "Welcome to submit high-quality blueprints to the community repository") { rainbowSlow() } - content("不支持框架方块和小方块" translatedTo "Not supporting frame blocks and small squares") + content("不支持框架方块和小方块" translatedTo "Does not support FramedBlocks or LittleTiles") highlight("https://github.com/GregTech-Odyssey/Gto-Extended-Platform-Presets" translatedTo "https://github.com/GregTech-Odyssey/Gto-Extended-Platform-Presets") { rainbowSlow() } } @@ -193,7 +193,7 @@ object GTOMachineTooltips { ) story( "升级后的批量交易与智能补货功能,让村民们常笑着称赞:“格雷科技的机器,比跑断腿的信使还贴心”" translatedTo - "With upgraded bulk trading and intelligent restocking, villagers often smiled and praised: 'Greg Tech's machine is more reliable than messengers who wear themselves out running'.", + "With upgraded bulk trading and intelligent restocking, villagers often smiled and praised: 'Greg Tech's machine is more reliable than couriers running their legs off'.", ) story( "如今它已成为联结公司与村庄的友好纽带,既让资源流转效率提升数倍,也让双方的信任在顺畅交易中日益深厚" translatedTo @@ -427,7 +427,7 @@ object GTOMachineTooltips { section(ComponentSlang.RunningRequirements) command("输入魔力加热" translatedTo "Input mana to heat") - increase("如果输入§c火元素蒸汽§r,则加热速度翻5倍" translatedTo "If §cfire element gas§r is input, the heating speed will be 5 times faster") + increase("如果输入§c火元素蒸汽§r,则加热速度翻5倍" translatedTo "If §cSalamander Vapor§r is input, the heating speed will be 5 times faster") command(ComponentSlang.TemperatureMax(2400)) } @@ -449,12 +449,12 @@ object GTOMachineTooltips { val CosmicCelestialSpireOfConvergenceTooltips = ComponentListSupplier { setTranslationPrefix("cosmic_celestial_spire_of_convergence") - story("星穹光刃裂维度之障,格雷魔导,启百年征航。" translatedTo "Blade of starry vault rends the dimensional veil, Grey Mages embark on a century-long sail.") + story("星穹光刃裂维度之障,格雷魔导,启百年征航。" translatedTo "Blade of starry vault rends the dimensional veil, Greg Mages embark on a century-long sail.") story("越死寂虚空,踏混沌异疆,极域镌神符,黑岩铸圣腔。" translatedTo "Across the void’s stillness, through chaotic realms they prevail, Carve divine runes in polar bounds, forge sacred chambers from dark shale.") story("解天体秘律,淬星髓凝钢,星海初启,圣坛威光乍放。" translatedTo "Unravel the celestial laws, temper star-marrow to steel, First lit in star-sea, the Sanctum’s radiance doth reveal.") story("银河倒卷奔核心,日月织网,虚空震荡。" translatedTo "Galaxies surge backward into the core’s heart, Sun and moon weave a web, the void doth impart a mighty tremor.") story("凭维度自生伟力,微芒亦可撬动洪荒。" translatedTo "By dimensional might it stands, A tiny spark stirs the primeval lands.") - story("格雷血汗凝奇迹,为文明拓宇,永奠天疆。" translatedTo "Grey’s blood and sweat forge a miracle grand, For civilisation’s cosmic expand, Eternally lay the heavenly land.") + story("格雷血汗凝奇迹,为文明拓宇,永奠天疆。" translatedTo "Greg’s blood and sweat forge a miracle grand, For civilisation’s cosmic expand, Eternally lay the heavenly land.") content("凝聚群星之中的能量" translatedTo "Condense the power of the gathered stars") command("可消耗魔力超频" translatedTo "Consumable Mana Overclocking") @@ -475,10 +475,10 @@ object GTOMachineTooltips { setTranslationPrefix("space_shield_hatch") content("在GTO寰宇重工的空间站技术还没完全完善的时候科研人员紧急开发出的小型防护罩" translatedTo "A small protective shield urgently developed by researchers when GTO Universal Heavy Industries' space station technology was not fully developed") - content("经过技术改良,现在可以保护机器免受太空环境干扰" translatedTo "After technical improvements, it can now protect machines from being unable to operate due to space environment interference") + content("经过技术改良,现在可以保护机器免受太空环境干扰" translatedTo "After technical improvements, it can now protect machines from space environment interference") decrease("需要机器内置的激光仓提供激光" translatedTo "Requires lasers provided by built-in laser hatches in the machine") section(ComponentSlang.MainFunction) - function("保护机器免受太空环境干扰而无法运行" translatedTo "Protects machines from being unable to operate due to space environment interference") + function("保护机器免受太空环境干扰而无法运行" translatedTo "Protects machines from space environment interference") decrease("需要机器同时配备激光能源仓" translatedTo "Requires the machine to be equipped with laser hatches at the same time") } @@ -534,8 +534,8 @@ object GTOMachineTooltips { setTranslationPrefix("sensor") section("红石信号" translatedTo "Redstone Signal") - content("未反转时,数值低于最低值或高于最高值时输出0,介于两者之间时输出递增的1-15的红石信号" translatedTo "When not inverted, outputs 0 when the value is below the minimum or above the maximum, or an increasing redstone signal between 1-14 when in between") - content("反转时,数值低于最低值或高于最高值时输出15,介于两者之间时输出递减的1-15的红石信号" translatedTo "When inverted, outputs 15 when the value is above the maximum or below the minimum, or a decreasing redstone signal between 1-14 when in between") + content("未反转时,数值低于最低值或高于最高值时输出0,介于两者之间时输出递增的1-15的红石信号" translatedTo "When not inverted, outputs 0 when the value is below the minimum or above the maximum, or an increasing redstone signal between 1-15 when in between") + content("反转时,数值低于最低值或高于最高值时输出15,介于两者之间时输出递减的1-15的红石信号" translatedTo "When inverted, outputs 15 when the value is above the maximum or below the minimum, or a decreasing redstone signal between 1-15 when in between") } // 催化剂仓 @@ -575,6 +575,7 @@ object GTOMachineTooltips { function("可以放入样板,并进行一键发配" translatedTo "Can put patterns and distribute them one click") function("样板间分别隔离,互不干扰" translatedTo "Patterns are isolated from each other, do not interfere with each other") important("对着样板按鼠标中键可单独设置电路或者提供特别输入" translatedTo "Press the middle mouse button on the pattern to set the circuit or provide special input") + command("可独立选择配方类型,不受机器主体限制" translatedTo "Can independently select recipe types, unrestricted by the machine's own settings") info(ComponentSlang.Capacity(capacity.toString())) } } @@ -608,7 +609,7 @@ object GTOMachineTooltips { section("允许自动连接ME无线网络" translatedTo "Allow automatically connecting to the ME Wireless network") guide("按下Shift放置以自动连接收藏的网络" translatedTo "Press Shift to place to automatically connect to the collected network") - danger("小心塞爆矿处!" translatedTo "Be careful to explode the ae storage! ") + danger("小心塞爆矿处!" translatedTo "Be careful not to overflow your AE storage! ") } // 多方块板条箱 @@ -647,7 +648,7 @@ object GTOMachineTooltips { setTranslationPrefix("performance_monitor_machine") section(ComponentSlang.MainFunction) - function("能监测全部机器或AE网络3.2秒内的平均延迟" translatedTo "Can monitor all machines or AE grids' average delay within 3.2 seconds and support highlighting") + function("能监测全部机器或AE网络3.2秒内的平均延迟,并支持高亮显示" translatedTo "Can monitor all machines or AE grids' average delay within 3.2 seconds and support highlighting") guide("右键点击机器以打开性能监测界面" translatedTo "Right click on the machine to open performance monitoring interface") } @@ -719,7 +720,7 @@ object GTOMachineTooltips { val HyperCubeMachineTooltips = ComponentListSupplier { setTranslationPrefix("hyper_cube_machine") - highlight("代理一个流体或物品存储器" translatedTo "Proxy a fluid or item or both storage") + highlight("代理一个流体或物品存储器" translatedTo "Proxy a fluid or item or both storages") command("使用§b坐标信息卡§r绑定方块" translatedTo "Use the §bCordinate Card§r to bind a storage block") function("绑定某方块后,对此机器进行物品或流体操作视同对被绑定的方块操作" translatedTo "Bind a storage to this machine to operate it as if it were the bound storage") guide("右键点击以打开界面" translatedTo "Right click to open the interface") @@ -731,7 +732,7 @@ object GTOMachineTooltips { setTranslationPrefix("advanced_hyper_cube_machine") highlight("代理多个流体或物品存储器" translatedTo "Proxy (a or multi) (fluid or item or both)storage") - command("使用§b坐标信息卡§r绑定方块" translatedTo "Use the §bCordinate Card§r to bind a storage block") + command("使用§b坐标信息卡§r绑定方块" translatedTo "Use the §bCoordinate Card§r to bind a storage block") function("绑定某方块后,对此机器进行物品或流体操作视同对被绑定的方块操作" translatedTo "Bind a storage to this machine to operate it as if it were the bound storage") function("若绑定多个方块,则依序对他们操作" translatedTo "Operate them in order if bind multiple storages") guide("右键点击以打开界面" translatedTo "Right click to open the interface") @@ -792,23 +793,23 @@ object GTOMachineTooltips { section("冷却系统" translatedTo "Cooling system") content( - "冷却液类型: 蒸馏水或钠钾合金" translatedTo "Cooling liquid types: Distilled water or sodium-potassium alloy", + "冷却液 (系数): 蒸馏水 (800) 钠钾合金 (20)" translatedTo "Cooling liquid (coefficients): Distilled Water (800) Sodium Potassium (20)", { green() }, ) info("冷却条件: 供给量 ≥ 需求量" translatedTo "Cooling condition: Supply ≥ demand") - info("最低需求量 = 配方产热 × 冷却参数 × 实际并行 × 当前温度 / 1500" translatedTo "Min demand = recipe heat × cooling param × actual parallel × current temp / 1500") - info("最高供给量 = (冷却组件 - 相邻数/3) × 8" translatedTo "Max supply = (cooling components - adjacent/3) × 8") - info("消耗量 = 需求量 × 冷却液系数" translatedTo "Consumption = demand × cooling liquid coefficient") + info("需求量 = 配方产热 × 实际并行 × 当前温度 / 1500" translatedTo "Demand = recipe heat × actual parallel × current temp / 1500") + info("供给量 = (冷却组件 - 相邻数/3) × 8" translatedTo "Supply = (cooling components - adjacent/3) × 8") + info("消耗量 = 需求量 × 冷却液系数" translatedTo "Consumption = Demand × cooling liquid coefficient") section("超频机制" translatedTo "Overclocking mechanism") - info("触发条件: 供给量 ≥ n × 需求量 (n>1)" translatedTo "Trigger condition: Supply ≥ n × demand (n>1") - info("超频效果: 减少n秒配方时间" translatedTo "Overclocking effect: Reduce n seconds recipe time") + info("触发条件: 供给量 ≥ n × 需求量 (n>1)" translatedTo "Trigger condition: Supply ≥ n × demand (n>1)") + info("超频效果: 运行速度提升至 n 倍" translatedTo "Overclocking effect: Operation speed increased to n times") section("冷却液产出" translatedTo "Cooling liquid output") - content("蒸馏水冷却: " translatedTo "Distilled water cooling: ", { green() }) + content("蒸馏水冷却: " translatedTo "Distilled Water cooling: ", { green() }) info("产出蒸汽,产量 = 消耗量 × min(160, 160/(1.4^(373-温度)))" translatedTo "Produces steam, Output = consumption × min(160, 160/(1.4^(373-temperature)))") - content("钠钾合金冷却:" translatedTo "Sodium-potassium alloy cooling:", { green() }) - info("≤825K: 热钠钾合金;>825K: 超临界钠钾合金" translatedTo "≤825K: Hot sodium-potassium alloy; >825K: Supercritical sodium-potassium alloy") + content("钠钾合金冷却:" translatedTo "Sodium Potassium cooling:", { green() }) + info("≤825K: 热钠钾合金;>825K: 超临界钠钾合金" translatedTo "≤825K: Hot Sodium Potassium; >825K: Supercritical Sodium Potassium") } // 计算中心 @@ -943,7 +944,7 @@ object GTOMachineTooltips { section(ComponentSlang.AfterModuleInstallation) increase("获得2倍速度" translatedTo "Gains 2x speed") - increase("获得额外120%涡轮效率" translatedTo "Gains additional 120% turbine efficiency") + increase("获得额外20%涡轮效率" translatedTo "Gains additional 20% turbine efficiency") decrease("转子损耗速度变为2倍" translatedTo "Rotor wear rate becomes 2x") } } @@ -1004,7 +1005,7 @@ object GTOMachineTooltips { (" EU/t的功率" translatedTo " EU/t"), ) increase( - ("再提供480mB/s的§a四氧化二氮§r,并消耗§4四倍§r燃料以产生" translatedTo "Provide extra 480mB/s of §eNitrous Oxide§r, consuming §afour times§r fuel to produce up to ") + + ("再提供480mB/s的§a四氧化二氮§r,并消耗§4四倍§r燃料以产生" translatedTo "Provide extra 480mB/s of §eDinitrogen Tetroxide§r, consuming §afour times§r fuel to produce up to ") + (GTValues.V[GTValues.UHV]).toLiteralSupplier().yellow() + (" EU/t的功率" translatedTo " EU/t"), ) @@ -1335,7 +1336,7 @@ object GTOMachineTooltips { command("能量最大电压取决于使用的外壳等级" translatedTo "Maximum voltage depends on shell tier") ok("与电流大小无关" translatedTo "Not related to current size") content( - "没有电流上限简直是原始人的超级科技" translatedTo "No current limit is a super technology of the primitive", + "没有电流上限简直是原始人的超级科技" translatedTo "No current limit - truly primitive super-technology", { rainbowSlow().italic() }, ) } @@ -1453,9 +1454,9 @@ object GTOMachineTooltips { highlight("利用维度技术和坚不可摧的钻头无情的抽取星球的每一分血液" translatedTo "Using dimensional technology and indestructible drills, they relentlessly extract every drop of blood from the planet.") section("启动与温控" translatedTo "Startup & Thermal Control") - command("需要升温启动,可通入液态烈焰或液态炽骨立方" translatedTo "Requires heating to start, input Liquid Blaze or Liquid Blaze Cubes") + command("需要升温启动,可通入液态烈焰或液态炽骨立方" translatedTo "Requires heating to start, input Liquid Blaze or Liquid Blazecube") info("升温材料消耗公式(单位:mB): 温度^1.3" translatedTo "Heating material consumption formula(unit: mB): Temperature^1.3") - info("升温速度:(每5tick) 液态烈焰:1K / 每次输入,液态炽骨立方:1000K / 每次输入" translatedTo "Heating speed: (every 5 ticks) Liquid Blaze: 1K / per input, Liquid Blaze Cubes: 1000K / per input") + info("升温速度:(每5tick) 液态烈焰:1K / 每次输入,液态炽骨立方:1000K / 每次输入" translatedTo "Heating speed: (every 5 ticks) Liquid Blaze: 1K / per input, Liquid Blazecube: 1000K / per input") increase("随着温度提升,效率也会提升" translatedTo "Higher temperature will give higher efficiency") error("当温度超过临界值,钻头将会融毁" translatedTo "If the machine overheats, drill head will melt") info("产热公式: 温度 / 2000" translatedTo "Heat generation formula: Temperature / 2000") @@ -1481,7 +1482,12 @@ object GTOMachineTooltips { setTranslationPrefix("void_fluid_drilling_rig") section(ComponentSlang.RunningRequirements) + command("在主机中放入维度数据来设置钻取维度" translatedTo "Insert dimension data into the controller to set the drilling dimension") command("需要最低30720EU/t的功率" translatedTo "Requires minimum 30720 EU/t") + + section("产出机制" translatedTo "Output Mechanism") + function("放入数据后,主机将显示可钻取流体列表" translatedTo "After inserting the data, the controller will display a list of drillable fluids") + function("根据机器设置的电路按顺序选择钻取目标" translatedTo "Select the drilling target in order according to the set circuit") } // 纳米集成加工中心 @@ -1514,6 +1520,7 @@ object GTOMachineTooltips { setTranslationPrefix("void_miner") section(ComponentSlang.RunningRequirements) + command("在主机中放入维度数据来设置采矿维度" translatedTo "Insert dimension data into the controller to set the mining dimension") command("需要输入1B钻井液和最低1920EU/t的功率" translatedTo "Requires 1B drilling fluid and minimum 1920 EU/t") section("产出机制" translatedTo "Output Mechanism") @@ -1892,17 +1899,17 @@ object GTOMachineTooltips { info("消耗魔力合成,需要一个铭刻之布" translatedTo "Consume magic power to synthesize, and requires an Affix Canvas") command("电路 8:宝石合并" translatedTo "Circuit 8: Gem Merge") info("使用同级的珍宝材料和宝石粉合并宝石" translatedTo "Use the same level of rarity materials and gem dust to merge gems") - command("电路 9:宝石粉碎" translatedTo "Circuit 8: Gem Crushing") + command("电路 9:宝石粉碎" translatedTo "Circuit 9: Gem Crushing") info("将宝石粉碎得到宝石粉" translatedTo "Crushing gems to obtain gem dust") - command("电路 10:强行附魔" translatedTo "Circuit 9: Forced enchantment") + command("电路 10:强行附魔" translatedTo "Circuit 10: Forced enchantment") info("消耗魔力强行将附魔书上的附魔添加到物品上" translatedTo "Consume magic power to forcibly adds the enchantment from the enchanted book to the item") - command("电路 11:强行刻印" translatedTo "Circuit 10: Forced add affixes") + command("电路 11:强行刻印" translatedTo "Circuit 11: Forced add affixes") info("消耗魔力强行将铭刻之布上的刻印添加到物品上" translatedTo "Consume magic power to forcibly adds the affixes from the affix canvas to the item") - command("电路 12:强行修改物品稀有度" translatedTo "Circuit 11: Forcefully modify item rarity") + command("电路 12:强行修改物品稀有度" translatedTo "Circuit 12: Forcefully modify item rarity") info("消耗魔力,珍宝材料和新生符文强行改变稀有度" translatedTo "Consume magic power and enter rarity material and sigil of rebirth to forcibly change the rarity") - command("电路 13:强行添加镶孔" translatedTo "Circuit 12: Forced addition of sockets") + command("电路 13:强行添加镶孔" translatedTo "Circuit 13: Forced addition of sockets") info("消耗魔力,镶孔符文强行添加镶孔" translatedTo "Consume magic power and enter sigil of socketing to forcibly addition of sockets") - command("电路 14:强行镶嵌宝石" translatedTo "Circuit 13: Forced gem inlay") + command("电路 14:强行镶嵌宝石" translatedTo "Circuit 14: Forced gem inlay") info("消耗魔力,强行将宝石镶嵌到物品上" translatedTo "Consume magic power to forcibly inserting gems into items") } @@ -2002,7 +2009,7 @@ object GTOMachineTooltips { function("小撮/小堆/石墨粉分别降低0.1/0.25/1MeV" translatedTo "Small Pile/Big Pile/Graphite Dust reduce by 0.1/0.25/1MeV respectively") function("中子通量为E(keV)时,在主机内放入N个铱中子反射板后,中子通量每秒增加 (EN)^0.5 keV" translatedTo "When neutron flux is E (keV), after placing N Iridium Neutron Reflectors in the mainframe, neutron flux increases by (EN)^0.5 keV per second") info("初始温度298K,临界点2098K" translatedTo "Initial temperature 298K, critical point 2098K") - error("经过计算,当中子动能在7MeV以上时,堆温每秒将上升超过1800K,足以在一秒内达到临界点" translatedTo "According to calculations, when neutron kinetic energy is above 4.5keV, the pile temperature will rise by 1800K per second, enough to reach the critical point in one second") + error("经过计算,当中子动能在7MeV以上时,堆温每秒将上升超过1800K,足以在一秒内达到临界点" translatedTo "According to calculations, when neutron kinetic energy is above 7MeV, the pile temperature will rise by 1800K per second, enough to reach the critical point in one second") function("每秒产热公式:H=K×1.27×(E×10)^1.88,结果向上取整" translatedTo "Heat generation formula per second: H=K×1.27×(E×10)^1.88, result rounded up") function("冷却液系数(K/mB/s):蒸馏水1,液氮4,液氦80" translatedTo "Coolant coefficients(K/mB/s): Distilled Water 1, Liquid Nitrogen 4, Liquid Helium 80") content("冷却后分别输出蒸汽、气态氮、气态氦" translatedTo "Outputs Steam, Gaseous Nitrogen, Gaseous Helium respectively after cooling") @@ -2073,7 +2080,7 @@ object GTOMachineTooltips { important("安装的具体位置可在机器GUI内点击左下高亮按钮以在世界中高亮显示" translatedTo "The specific installation position can be highlighted in the world by clicking the highlight button at the bottom left in the GUI") section(ComponentSlang.RunningRequirements) - command("运行需要消耗7680EU/t的基础能量" translatedTo "Operation requires a base energy consumption of 1920EU/t") + command("运行需要消耗7680EU/t的基础能量" translatedTo "Operation requires a base energy consumption of 7680EU/t") command("会根据安装的拓展舱体数量增加额外能耗以及资源消耗" translatedTo "Will increase additional energy consumption and resource consumption based on the number of expansion modules installed") info("每秒固定消耗:" translatedTo "Fixed consumption every second:") important("15mB * (1 + 拓展舱体数量) 蒸馏水" translatedTo "15mB * (1 + number of expansion modules) Distilled Water") diff --git a/src/main/java/com/gtocore/common/data/translation/GTOMachineTooltipsA.kt b/src/main/java/com/gtocore/common/data/translation/GTOMachineTooltipsA.kt index 9b64913ba..883490768 100644 --- a/src/main/java/com/gtocore/common/data/translation/GTOMachineTooltipsA.kt +++ b/src/main/java/com/gtocore/common/data/translation/GTOMachineTooltipsA.kt @@ -205,7 +205,7 @@ object GTOMachineTooltipsA : AutoInitialize() { val LargeSteamCrackerTooltips = ComponentListSupplier { setTranslationPrefix("large_steam_cracker") - info("原料效率仅正常裂化机的80%" translatedTo "The raw material efficiency is only 80% of that of a normal cracker") - increase("每使用高一等级的蒸汽输入仓,原料效率提升20%" translatedTo "For each higher level of steam input hatch used, the raw material efficiency increases by 20%") + info("原料效率仅正常裂化机的40%" translatedTo "The raw material efficiency is only 40% of that of a normal cracker") + increase("每使用高一等级的蒸汽输入仓,配方产出提升100mb" translatedTo "For each higher level of steam input hatch used, the output increases by 100mb") } } diff --git a/src/main/java/com/gtocore/common/forge/AnimalsRevengeEvent.kt b/src/main/java/com/gtocore/common/forge/AnimalsRevengeEvent.kt index 731754c9b..2797f4d5b 100644 --- a/src/main/java/com/gtocore/common/forge/AnimalsRevengeEvent.kt +++ b/src/main/java/com/gtocore/common/forge/AnimalsRevengeEvent.kt @@ -106,8 +106,8 @@ object AnimalsRevengeEvent { private fun triggerCannibalismEffect(serverLevel: ServerLevel, player: ServerPlayer, eaten: ItemStack) { if (!ensureLootCache(serverLevel)) return - val radius = max(1, GTOConfig.INSTANCE.mobConfig.cannibalismRadius) - val damage = max(0.0f, GTOConfig.INSTANCE.mobConfig.cannibalismDamage) + val radius = max(1, GTOConfig.INSTANCE.gamePlay.mobConfig.cannibalismRadius) + val damage = max(0.0f, GTOConfig.INSTANCE.gamePlay.mobConfig.cannibalismDamage) if (damage <= 0.0f) return val center: Vec3 = player.position().add(0.0, 0.1, 0.0) @@ -157,7 +157,7 @@ object AnimalsRevengeEvent { tag.putBoolean("gtocore_temp_aggressive", true) pm.goalSelector.addGoal( 1, - AnimalsRevengeAttackGoal(pm, 1.2, 1.6, 20, max(1.0f, GTOConfig.INSTANCE.mobConfig.cannibalismDamage)), + AnimalsRevengeAttackGoal(pm, 1.2, 1.6, 20, max(1.0f, GTOConfig.INSTANCE.gamePlay.mobConfig.cannibalismDamage)), ) pm.targetSelector.addGoal(1, NearestAttackableTargetGoal(pm, ServerPlayer::class.java, true)) } diff --git a/src/main/java/com/gtocore/common/forge/ClientForge.kt b/src/main/java/com/gtocore/common/forge/ClientForge.kt index 41ac094ca..35c4a5b8b 100644 --- a/src/main/java/com/gtocore/common/forge/ClientForge.kt +++ b/src/main/java/com/gtocore/common/forge/ClientForge.kt @@ -13,6 +13,7 @@ import net.minecraftforge.eventbus.api.EventPriority import net.minecraftforge.eventbus.api.SubscribeEvent import com.google.gson.GsonBuilder +import com.gregtechceu.gtceu.utils.TaskHandler import java.nio.charset.StandardCharsets import java.nio.file.Files @@ -315,12 +316,7 @@ object ClientForge { .filter { it.shouldShow(langCode) && !config.isConfirmed(it.contentHash) && (showHistoricalMessages || it.isRecent()) } .size // 延迟显示 GUI,确保客户端完全加载 - Thread.startVirtualThread { - Thread.sleep(1000) - mc.execute { - showMessageScreen(msg, 1, total) - } - } + TaskHandler.enqueueTask(event.player.clientLevel, { showMessageScreen(msg, 1, total) }, 40) } } } diff --git a/src/main/java/com/gtocore/common/forge/ForgeCommonEvent.java b/src/main/java/com/gtocore/common/forge/ForgeCommonEvent.java index f8d139dbd..736961b5f 100644 --- a/src/main/java/com/gtocore/common/forge/ForgeCommonEvent.java +++ b/src/main/java/com/gtocore/common/forge/ForgeCommonEvent.java @@ -17,6 +17,7 @@ import com.gtolib.api.annotation.language.RegisterLanguage; import com.gtolib.api.data.Dimension; import com.gtolib.api.data.GTODimensions; +import com.gtolib.api.item.tool.VajraItem; import com.gtolib.api.machine.feature.IVacuumMachine; import com.gtolib.api.player.IEnhancedPlayer; import com.gtolib.utils.RLUtils; @@ -31,6 +32,7 @@ import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.item.tool.GTToolItem; +import com.gregtechceu.gtceu.api.item.tool.ToolHelper; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.WorkableTieredMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; @@ -179,7 +181,7 @@ public static void onRightClickBlock(PlayerInteractEvent.RightClickBlock event) return; } - if (!GTOConfig.INSTANCE.disableChargeBomb) { + if (!GTOConfig.INSTANCE.gamePlay.disableChargeBomb) { if (item == GTItems.QUANTUM_STAR.get() && level.getBlockState(pos).getBlock() == GTOBlocks.NAQUADRIA_CHARGE.get() && !IEntropinnyum.absorbBomb(level, pos, (int) 1e6)) { @@ -318,7 +320,7 @@ public static void onLevelLoad(LevelEvent.Load event) { if (serverLevel == null) return; DysonSphereSavaedData.INSTANCE = serverLevel.getDataStorage().computeIfAbsent(DysonSphereSavaedData::new, DysonSphereSavaedData::new, "dyson_sphere_data"); RecipeRunLimitSavaedData.INSTANCE = serverLevel.getDataStorage().computeIfAbsent(RecipeRunLimitSavaedData::new, RecipeRunLimitSavaedData::new, "recipe_run_limit_data"); - WirelessSavedData.Companion.setINSTANCE(serverLevel.getDataStorage().computeIfAbsent(WirelessSavedData::initialize, WirelessSavedData::new, "wireless_saved_data_" + GTOConfig.INSTANCE.aeGridKey)); + WirelessSavedData.Companion.setINSTANCE(serverLevel.getDataStorage().computeIfAbsent(WirelessSavedData::initialize, WirelessSavedData::new, "wireless_saved_data_" + GTOConfig.INSTANCE.devMode.aeGridKey)); if (Mods.FTBQUESTS.isLoaded()) { AdditionalTeamData.instance = serverLevel.getDataStorage().computeIfAbsent(AdditionalTeamData::new, AdditionalTeamData::new, "ftb_quests_additional_team_data"); } @@ -357,11 +359,21 @@ public static void onGTToolRightClickBlock(PlayerInteractEvent.RightClickBlock e @SubscribeEvent public static void serverStarting(ServerStartingEvent event) { DistExecutor.unsafeRunWhenOn(Dist.DEDICATED_SERVER, () -> () -> { - if (Objects.equals(GTOConfig.INSTANCE.serverLang, "en_us")) return; - ServerLangHook.gto$loadLanguage(GTOConfig.INSTANCE.serverLang, event.getServer()); + if (Objects.equals(GTOConfig.INSTANCE.misc.serverLang, "en_us")) return; + ServerLangHook.gto$loadLanguage(GTOConfig.INSTANCE.misc.serverLang, event.getServer()); }); } + @SubscribeEvent + public static void harvestCheck(PlayerEvent.HarvestCheck harvestCheck) { + ItemStack stack = harvestCheck.getEntity().getMainHandItem(); + if (stack.getItem() instanceof VajraItem tool) { + int tier = tool.getTier().getLevel(); + if (tier >= 6) harvestCheck.setCanHarvest(true); + else harvestCheck.setCanHarvest(ToolHelper.isCorrectTierForDrops(harvestCheck.getTargetBlock(), tier)); + } + } + @SubscribeEvent public static void remapIds(MissingMappingsEvent event) { event.getMappings(Registries.BLOCK, GTOCore.MOD_ID).forEach(mapping -> { @@ -372,7 +384,7 @@ public static void remapIds(MissingMappingsEvent event) { } else if (mapping.getKey().equals(GTOCore.id("spacetimebendingcore"))) { mapping.remap(GTOBlocks.SPACETIME_BENDING_CORE.get()); } else if (mapping.getKey().equals(GTOCore.id("titanium_alloy_internal_frame"))) { - mapping.remap(GTOBlocks.TITANIUM_ALLOY_INTERNAL_FRAME.get()); + mapping.remap(GTOBlocks.TITANIUM_ALLOY_FRAME_INTERNAL.get()); } }); event.getMappings(Registries.ITEM, GTOCore.MOD_ID).forEach(mapping -> { @@ -383,7 +395,7 @@ public static void remapIds(MissingMappingsEvent event) { } else if (mapping.getKey().equals(GTOCore.id("spacetimebendingcore"))) { mapping.remap(GTOBlocks.SPACETIME_BENDING_CORE.asItem()); } else if (mapping.getKey().equals(GTOCore.id("titanium_alloy_internal_frame"))) { - mapping.remap(GTOBlocks.TITANIUM_ALLOY_INTERNAL_FRAME.asItem()); + mapping.remap(GTOBlocks.TITANIUM_ALLOY_FRAME_INTERNAL.asItem()); } }); event.getMappings(Registries.BLOCK, "avaritia").forEach(mapping -> { diff --git a/src/main/java/com/gtocore/common/item/ManaProspectorBehavior.java b/src/main/java/com/gtocore/common/item/ManaProspectorBehavior.java index 8f1b69a2a..5881ba2ba 100644 --- a/src/main/java/com/gtocore/common/item/ManaProspectorBehavior.java +++ b/src/main/java/com/gtocore/common/item/ManaProspectorBehavior.java @@ -35,7 +35,7 @@ public final class ManaProspectorBehavior extends ProspectorScannerBehavior implements IComponentCapability, IItemLifeCycle, IDurabilityBar { private static final String MANA_KEY = "mana"; - private static final int CONSUMPTION_PER_TICK = 40; + private static final int CONSUMPTION_PER_TICK = 10; private static final int CONSUMPTION_PER_CHUNK = 500; private final int radius; diff --git a/src/main/java/com/gtocore/common/item/RecipeEditorBehavior.java b/src/main/java/com/gtocore/common/item/RecipeEditorBehavior.java index 1ab21516a..e3ff61d49 100644 --- a/src/main/java/com/gtocore/common/item/RecipeEditorBehavior.java +++ b/src/main/java/com/gtocore/common/item/RecipeEditorBehavior.java @@ -97,7 +97,7 @@ public final class RecipeEditorBehavior implements IItemUIFactory, IFancyUIProvi @Override public InteractionResult onItemUseFirst(ItemStack itemStack, UseOnContext context) { if (Objects.requireNonNull(context.getPlayer()).isShiftKeyDown()) { - if (GTOConfig.INSTANCE.recipeCheck) { + if (GTOConfig.INSTANCE.devMode.recipeCheck) { var recipeMap = new Reference2ObjectOpenHashMap>(); for (var recipe : RecipeBuilder.RECIPE_MAP.values()) { var recipeType = recipe.recipeType; diff --git a/src/main/java/com/gtocore/common/item/StructureWriteBehavior.java b/src/main/java/com/gtocore/common/item/StructureWriteBehavior.java index acb0437f7..5bae1c142 100644 --- a/src/main/java/com/gtocore/common/item/StructureWriteBehavior.java +++ b/src/main/java/com/gtocore/common/item/StructureWriteBehavior.java @@ -138,8 +138,8 @@ private static void exportLog(HeldItemUIFactory.HeldItemHolder playerInventoryHo boolean isGT = Objects.equals(parts[0], "gtceu"); boolean isGTO = Objects.equals(parts[0], GTOCore.MOD_ID); if ((isGT || isGTO) && parts[1].contains("_frame")) { - builder.append(".where('").append(c).append("', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, ").append(isGT ? "GTMaterials." : "GTOMaterials.") - .append(FormattingUtil.lowerUnderscoreToUpperCamel(StringUtils.lastDecompose('_', parts[1])[0])).append(")))\n"); + builder.append(".where('").append(c).append("GTOPredicates.frame(").append(isGT ? "GTMaterials." : "GTOMaterials.") + .append(FormattingUtil.lowerUnderscoreToUpperCamel(StringUtils.lastDecompose('_', parts[1])[0])).append("))\n"); return; } builder.append(".where('").append(c).append("', blocks(") diff --git a/src/main/java/com/gtocore/common/item/TravelStaffBehavior.java b/src/main/java/com/gtocore/common/item/TravelStaffBehavior.java index f5086df60..97794cea3 100644 --- a/src/main/java/com/gtocore/common/item/TravelStaffBehavior.java +++ b/src/main/java/com/gtocore/common/item/TravelStaffBehavior.java @@ -2,7 +2,7 @@ import com.gtocore.common.data.translation.GTOItemTooltips; import com.gtocore.config.GTOConfig; -import com.gtocore.eio_travel.api.TravelHandler; +import com.gtocore.eio_travel.logic.TravelHandler; import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.IElectricItem; diff --git a/src/main/java/com/gtocore/common/machine/generator/WindMillTurbineMachine.java b/src/main/java/com/gtocore/common/machine/generator/WindMillTurbineMachine.java index d38345320..078aa383a 100644 --- a/src/main/java/com/gtocore/common/machine/generator/WindMillTurbineMachine.java +++ b/src/main/java/com/gtocore/common/machine/generator/WindMillTurbineMachine.java @@ -30,7 +30,6 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.Level; import net.minecraft.world.phys.AABB; @@ -180,16 +179,25 @@ private void checkEnergy() { } } } - var eLevel = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.UNBREAKING, stack) + 1; + var eLevel = stack.getEnchantmentLevel(Enchantments.UNBREAKING) + 1; + int newDamage = damage; + if (obstructed) { - stack.setDamageValue(damage + (int) ((40 * spinSpeed) / eLevel + 1)); + newDamage += (int) ((40 * spinSpeed) / eLevel + 1); spinSpeed = 0; } else if (wind > rotorItem.getMinWind()) { - stack.setDamageValue(damage + (int) (Math.pow(Math.ceil(wind / rotorItem.getMaxWind()), 16) / eLevel + 1)); + newDamage += (int) (Math.pow(Math.ceil(wind / rotorItem.getMaxWind()), 16) / eLevel + 1); spinSpeed = Math.min(0.05F * wind, spinSpeed + 0.04F); actualPower = (int) (GTValues.V[tier] * spinSpeed * 20 * getMaxInputOutputAmperage() / getMaxWind(tier)); energyContainer.addEnergy(20L * actualPower); } + if (newDamage >= maxDamage) { + inventory.storage.setStackInSlot(0, ItemStack.EMPTY); + hasRotor = false; + spinSpeed = 0; + } else { + stack.setDamageValue(newDamage); + } } else { if (hasRotor) { this.requestSync(); diff --git a/src/main/java/com/gtocore/common/machine/mana/part/MEManaAmplifierPartMachine.java b/src/main/java/com/gtocore/common/machine/mana/part/MEManaAmplifierPartMachine.java index f864f6e33..7348b3870 100644 --- a/src/main/java/com/gtocore/common/machine/mana/part/MEManaAmplifierPartMachine.java +++ b/src/main/java/com/gtocore/common/machine/mana/part/MEManaAmplifierPartMachine.java @@ -47,9 +47,6 @@ public final class MEManaAmplifierPartMachine extends ManaAmplifierPartMachine i @Getter @Setter private boolean isOnline; - @Persisted - @Getter - private boolean workingEnabled; private final ConditionalSubscriptionHandler updateSubs; private boolean useMana = true; @@ -127,7 +124,7 @@ private void updateTick() { @Override public void setWorkingEnabled(boolean isWorkingAllowed) { - this.workingEnabled = isWorkingAllowed; + super.setWorkingEnabled(isWorkingAllowed); updateSubs.updateSubscription(); } diff --git a/src/main/java/com/gtocore/common/machine/monitor/AbstractAEInfoMonitor.java b/src/main/java/com/gtocore/common/machine/monitor/AbstractAEInfoMonitor.java index 5026f3166..d9928913b 100644 --- a/src/main/java/com/gtocore/common/machine/monitor/AbstractAEInfoMonitor.java +++ b/src/main/java/com/gtocore/common/machine/monitor/AbstractAEInfoMonitor.java @@ -85,13 +85,6 @@ public List getAvailableRLs() { return rls; } - /** - * 因还需判断是否为NO_CONFIG状态, - * {@link State}的变更必须在继承类中实现! - */ - @Override - public abstract void syncInfoFromServer(); - protected enum State { NO_GRID, NO_CONFIG, diff --git a/src/main/java/com/gtocore/common/machine/monitor/AbstractInfoProviderMonitor.java b/src/main/java/com/gtocore/common/machine/monitor/AbstractInfoProviderMonitor.java index aca8082b7..d6fbdc756 100644 --- a/src/main/java/com/gtocore/common/machine/monitor/AbstractInfoProviderMonitor.java +++ b/src/main/java/com/gtocore/common/machine/monitor/AbstractInfoProviderMonitor.java @@ -2,6 +2,8 @@ import com.gtocore.api.gui.DisplayComponentGroup; +import com.gtolib.GTOCore; + import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.gui.widget.LongInputWidget; import com.gregtechceu.gtceu.api.machine.TickableSubscription; @@ -40,16 +42,20 @@ public abstract class AbstractInfoProviderMonitor extends BasicMonitor implement AbstractInfoProviderMonitor(MetaMachineBlockEntity holder) { super(holder); - Class clazz = this.getClass(); } @Override public void onLoad() { super.onLoad(); - tickableSubscription = this.subscribeServerTick(tickableSubscription, () -> { - this.syncInfoFromServer(); - this.getSyncStorage().markAllDirty(); - this.requestSync(); + if (isRemote()) return; + tickableSubscription = this.subscribeAsyncTick(tickableSubscription, () -> { + try { + this.syncInfoFromServer(); + this.getSyncStorage().markAllDirty(); + this.requestSync(); + } catch (Throwable throwable) { + GTOCore.LOGGER.error("Error syncing monitor info provider data", throwable); + } }, 10); } diff --git a/src/main/java/com/gtocore/common/machine/monitor/BasicMonitor.java b/src/main/java/com/gtocore/common/machine/monitor/BasicMonitor.java index 60726b618..3a0b1731c 100644 --- a/src/main/java/com/gtocore/common/machine/monitor/BasicMonitor.java +++ b/src/main/java/com/gtocore/common/machine/monitor/BasicMonitor.java @@ -31,6 +31,7 @@ public void onLoad() { super.onLoad(); if (getLevel() != null && !getLevel().isClientSide) { Manager.addBlock(this); + } else { tickSubscription = subscribeClientTick(tickSubscription, this::clientTick, 10); } } diff --git a/src/main/java/com/gtocore/common/machine/monitor/Manager.java b/src/main/java/com/gtocore/common/machine/monitor/Manager.java index 24b05bdc2..ef277137b 100644 --- a/src/main/java/com/gtocore/common/machine/monitor/Manager.java +++ b/src/main/java/com/gtocore/common/machine/monitor/Manager.java @@ -384,7 +384,7 @@ private void merge() { } private boolean canMerge(GridNetwork other, Direction2D facing2D) { - var maxMonitorSize = GTOConfig.INSTANCE.maxMonitorSize; + var maxMonitorSize = GTOConfig.INSTANCE.gamePlay.maxMonitorSize; return other != null && other.facing == facing && other.color == color && (facing2D.isHorizontal ? other.height() == this.height() && other.width() + this.width() <= maxMonitorSize : other.width() == this.width() && other.height() + this.height() <= maxMonitorSize); @@ -425,7 +425,7 @@ private boolean tryMerge(Direction2D direction) { // 将其他网格的点添加到当前网格中 put(point, this); } - if (GTOConfig.INSTANCE.dev) { + if (GTOConfig.INSTANCE.devMode.dev) { if (gridToNetwork.keySet().stream().filter( p -> p.facing == facing && p.x >= fromX && p.x <= toX && p.y >= fromY && p.y <= toY).anyMatch(p -> gridToNetwork.get(p) != this)) { // 如果当前网格仍然有点存在 @@ -525,7 +525,7 @@ private void split(GridFacedPoint point) { created.add(shifted); } } - if (GTOConfig.INSTANCE.dev) { + if (GTOConfig.INSTANCE.devMode.dev) { if (gridToNetwork.keySet().stream().anyMatch(p -> gridToNetwork.get(p) == this)) { // 如果当前网格仍然有点存在 throw new IllegalStateException("GridNetwork still has points after split: " + this); diff --git a/src/main/java/com/gtocore/common/machine/multiblock/electric/DistillationTowerMachine.java b/src/main/java/com/gtocore/common/machine/multiblock/electric/DistillationTowerMachine.java index 0e420f111..649ee3890 100644 --- a/src/main/java/com/gtocore/common/machine/multiblock/electric/DistillationTowerMachine.java +++ b/src/main/java/com/gtocore/common/machine/multiblock/electric/DistillationTowerMachine.java @@ -3,7 +3,6 @@ import com.gtolib.api.machine.multiblock.ElectricMultiblockMachine; import com.gtolib.api.machine.trait.IEnhancedRecipeLogic; import com.gtolib.api.machine.trait.InaccessibleInfiniteTank; -import com.gtolib.api.misc.AsyncTask; import com.gtolib.api.recipe.Recipe; import com.gtolib.api.recipe.RecipeRunner; @@ -20,6 +19,7 @@ import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.content.Content; +import com.gregtechceu.gtceu.utils.TaskHandler; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraftforge.fluids.capability.IFluidHandler; @@ -156,7 +156,7 @@ protected boolean handleRecipeIO(GTRecipe recipe, IO io) { return handleIO; } if (getMachine().isDualMEOutput(recipe)) { - AsyncTask.addAsyncTask(this, () -> output((Recipe) recipe)); + TaskHandler.enqueueAsyncTask(getMachine().getLevel(), () -> output((Recipe) recipe), 0); } else { output((Recipe) recipe); } diff --git a/src/main/java/com/gtocore/common/machine/multiblock/electric/PCBFactoryMachine.java b/src/main/java/com/gtocore/common/machine/multiblock/electric/PCBFactoryMachine.java index 25ca4b406..65dddfd4c 100644 --- a/src/main/java/com/gtocore/common/machine/multiblock/electric/PCBFactoryMachine.java +++ b/src/main/java/com/gtocore/common/machine/multiblock/electric/PCBFactoryMachine.java @@ -16,7 +16,6 @@ import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.chemical.material.stack.MaterialStack; -import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.pattern.BlockPattern; import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; @@ -115,9 +114,9 @@ public static BlockPattern getBlockPattern(int tier, MultiblockMachineDefinition .where('A', blocks(GTOBlocks.NAQUADAH_ALLOY_CASING.get())) .where('B', blocks(GTOBlocks.IRIDIUM_CASING.get())) .where('C', blocks(GTBlocks.HIGH_POWER_CASING.get())) - .where('D', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Neutronium))) + .where('D', GTOPredicates.frame(GTMaterials.Neutronium)) .where('E', blocks(GTOBlocks.BORON_CARBIDE_CERAMIC_RADIATION_RESISTANT_MECHANICAL_CUBE.get())) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.MaragingSteel300))) + .where('F', GTOPredicates.frame(GTMaterials.MaragingSteel300)) .where('G', blocks(GTBlocks.CASING_TEMPERED_GLASS.get())) .where('H', blocks(GTOBlocks.STRONTIUM_CARBONATE_CERAMIC_RAY_ABSORBING_MECHANICAL_CUBE.get())) .where('I', blocks(GTOBlocks.GRAVITY_STABILIZATION_CASING.get())) @@ -130,7 +129,7 @@ public static BlockPattern getBlockPattern(int tier, MultiblockMachineDefinition .or(abilities(MAINTENANCE).setExactLimit(1))) .where('N', blocks(GTBlocks.SUPERCONDUCTING_COIL.get())) .where('O', blocks(GTOBlocks.MAGTECH_CASING.get())) - .where('P', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Europium))) + .where('P', GTOPredicates.frame(GTMaterials.Europium)) .where('Q', blocks(GTOBlocks.PPS_CORROSION_RESISTANT_MECHANICAL_HOUSING.get())) .where('R', blocks(GTOBlocks.HOLLOW_CASING.get())) .where('S', blocks(GTBlocks.HERMETIC_CASING_ZPM.get())) @@ -190,7 +189,7 @@ public static BlockPattern getBlockPattern(int tier, MultiblockMachineDefinition .where('E', blocks(GTBlocks.CASING_TEMPERED_GLASS.get())) .where('F', blocks(GTOBlocks.MAGTECH_CASING.get())) .where('G', blocks(GTOBlocks.STRONTIUM_CARBONATE_CERAMIC_RAY_ABSORBING_MECHANICAL_CUBE.get())) - .where('H', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Neutronium))) + .where('H', GTOPredicates.frame(GTMaterials.Neutronium)) .where('I', blocks(GTOBlocks.MOLECULAR_COIL.get())) .where('J', blocks(GTOBlocks.AMPROSIUM_ACTIVE_CASING.get())) .where('K', blocks(GTOBlocks.PRESSURE_CONTAINMENT_CASING.get())) @@ -199,7 +198,7 @@ public static BlockPattern getBlockPattern(int tier, MultiblockMachineDefinition .where('N', blocks(GTOBlocks.HOLLOW_CASING.get())) .where('O', blocks(GTOBlocks.RADIATION_ABSORBENT_CASING.get())) .where('P', blocks(GTBlocks.HIGH_POWER_CASING.get())) - .where('Q', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.MaragingSteel300))) + .where('Q', GTOPredicates.frame(GTMaterials.MaragingSteel300)) .where('R', blocks(GTOBlocks.HIGH_ENERGY_ULTRAVIOLET_EMITTER_CASING.get())) .where('S', blocks(GTOBlocks.ADVANCED_ASSEMBLY_LINE_UNIT.get())) .where('T', blocks(GTOBlocks.IRIDIUM_CASING.get()) @@ -207,7 +206,7 @@ public static BlockPattern getBlockPattern(int tier, MultiblockMachineDefinition .or(abilities(PARALLEL_HATCH).setMaxGlobalLimited(1)) .or(abilities(MAINTENANCE).setExactLimit(1))) .where('U', blocks(GTBlocks.SUPERCONDUCTING_COIL.get())) - .where('V', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Europium))) + .where('V', GTOPredicates.frame(GTMaterials.Europium)) .where('W', blocks(GTOBlocks.PPS_CORROSION_RESISTANT_MECHANICAL_HOUSING.get())) .where('X', blocks(GTBlocks.HERMETIC_CASING_ZPM.get())) .where('Y', controller(definition)) @@ -228,7 +227,7 @@ public static BlockPattern getBlockPattern(int tier, MultiblockMachineDefinition .aisle(" AAAAA ", " EEE ", " EEE ", " EKE ", " EEE ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") .aisle(" AAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") .where('A', blocks(GTOBlocks.BORON_CARBIDE_CERAMIC_RADIATION_RESISTANT_MECHANICAL_CUBE.get())) - .where('B', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.MaragingSteel300))) + .where('B', GTOPredicates.frame(GTMaterials.MaragingSteel300)) .where('C', blocks(GTBlocks.CASING_TEMPERED_GLASS.get())) .where('D', blocks(GTOBlocks.PRESSURE_CONTAINMENT_CASING.get())) .where('E', blocks(GTOBlocks.IRIDIUM_CASING.get()) @@ -237,7 +236,7 @@ public static BlockPattern getBlockPattern(int tier, MultiblockMachineDefinition .or(abilities(MAINTENANCE).setExactLimit(1))) .where('F', blocks(GTOBlocks.MAGTECH_CASING.get())) .where('G', blocks(GTOBlocks.STRONTIUM_CARBONATE_CERAMIC_RAY_ABSORBING_MECHANICAL_CUBE.get())) - .where('H', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Europium))) + .where('H', GTOPredicates.frame(GTMaterials.Europium)) .where('I', blocks(GTOBlocks.PPS_CORROSION_RESISTANT_MECHANICAL_HOUSING.get())) .where('J', blocks(GTBlocks.HERMETIC_CASING_ZPM.get())) .where('K', controller(definition)) diff --git a/src/main/java/com/gtocore/common/machine/multiblock/electric/miner/SingleDigitalMiner.java b/src/main/java/com/gtocore/common/machine/multiblock/electric/miner/SingleDigitalMiner.java index c1a600e3c..0254c3ab0 100644 --- a/src/main/java/com/gtocore/common/machine/multiblock/electric/miner/SingleDigitalMiner.java +++ b/src/main/java/com/gtocore/common/machine/multiblock/electric/miner/SingleDigitalMiner.java @@ -238,33 +238,33 @@ public Widget createUIWidget() { group.addWidget(filterSlot); // Radius - group.addWidget(new LabelWidget(99, 26, "水平范围:")); - group.addWidget(new SimpleNumberInputWidget(140, 24, 24, 12, this::getMinerRadius, this::setMinerRadius) + group.addWidget(new LabelWidget(99, 26, "gtocore.digital_miner.x_radial_length")); + group.addWidget(new SimpleNumberInputWidget(150, 24, 24, 12, this::getMinerRadius, this::setMinerRadius) .setMin(1).setMax((int) (8 * Math.pow(2, getTier())))); // Min height - group.addWidget(new LabelWidget(99, 44, "最小高度:")); - group.addWidget(new SimpleNumberInputWidget(140, 42, 24, 12, this::getMinHeight, this::setMinHeight) + group.addWidget(new LabelWidget(99, 44, "gtocore.digital_miner.min_height")); + group.addWidget(new SimpleNumberInputWidget(150, 42, 24, 12, this::getMinHeight, this::setMinHeight) .setMin(getLevel().getMinBuildHeight()).setMax(getLevel().getMaxBuildHeight())); // Max height - group.addWidget(new LabelWidget(99, 62, "最大高度:")); - group.addWidget(new SimpleNumberInputWidget(140, 60, 24, 12, this::getMaxHeight, this::setMaxHeight) + group.addWidget(new LabelWidget(99, 62, "gtocore.digital_miner.max_height")); + group.addWidget(new SimpleNumberInputWidget(150, 60, 24, 12, this::getMaxHeight, this::setMaxHeight) .setMin(getLevel().getMinBuildHeight()).setMax(getLevel().getMaxBuildHeight())); // reset button this.resetButton = new ButtonWidget(16, 46 + BORDER_WIDTH, 18, 16 - BORDER_WIDTH, - new TextTexture("重置").setDropShadow(false).setColor(ChatFormatting.GRAY.getColor()), this::reset); - this.resetButton.setHoverTooltips(Component.literal("修改配置后必须重置才能生效。")); + new TextTexture("gtocore.digital_miner.reset").setDropShadow(false).setColor(ChatFormatting.GRAY.getColor()), this::reset); + this.resetButton.setHoverTooltips(Component.translatable("gtocore.digital_miner.reset.tooltip")); group.addWidget(this.resetButton); // silk button this.silkButton = new ButtonWidget(36, 46 + BORDER_WIDTH, 18, 16 - BORDER_WIDTH, - new TextTexture("精准") + new TextTexture("gtocore.digital_miner.silk") .setDropShadow(false) .setColor(silkLevel == 0 ? ChatFormatting.GRAY.getColor() : ChatFormatting.GREEN.getColor()), this::setSilk); - this.silkButton.setHoverTooltips(Component.literal("开启精准采集模式,4倍耗电。")); + this.silkButton.setHoverTooltips(Component.translatable("gtocore.digital_miner.silk.tooltip")); group.addWidget(this.silkButton); return group; @@ -289,18 +289,18 @@ private void reset(ClickData clickData) { private void setSilk(ClickData clickData) { if (silkLevel == 0) { silkLevel = 1; - this.silkButton.setButtonTexture(new TextTexture("精准").setDropShadow(false).setColor(ChatFormatting.GREEN.getColor())); + this.silkButton.setButtonTexture(new TextTexture("gtocore.digital_miner.silk").setDropShadow(false).setColor(ChatFormatting.GREEN.getColor())); energyPerTick = GTValues.VEX[getTier() - 1] * 4; } else { silkLevel = 0; - this.silkButton.setButtonTexture(new TextTexture("精准").setDropShadow(false).setColor(ChatFormatting.GRAY.getColor())); + this.silkButton.setButtonTexture(new TextTexture("gtocore.digital_miner.silk").setDropShadow(false).setColor(ChatFormatting.GRAY.getColor())); energyPerTick = GTValues.VEX[getTier() - 1]; } resetRecipe(); } private void addDisplayText(List textList) { - textList.add(Component.literal("挖掘: ").append(String.valueOf(getRecipeLogic().getOreAmount()))); + textList.add(Component.translatable("gtocore.digital_miner.to_be_mined").append(String.valueOf(getRecipeLogic().getOreAmount()))); if (getRecipeLogic().isDone()) textList.add(Component.translatable("gtceu.multiblock.large_miner.done") .setStyle(Style.EMPTY.withColor(ChatFormatting.GREEN))); diff --git a/src/main/java/com/gtocore/common/machine/multiblock/electric/nano/NanoForgeMachine.java b/src/main/java/com/gtocore/common/machine/multiblock/electric/nano/NanoForgeMachine.java index 717f95183..a51614b88 100644 --- a/src/main/java/com/gtocore/common/machine/multiblock/electric/nano/NanoForgeMachine.java +++ b/src/main/java/com/gtocore/common/machine/multiblock/electric/nano/NanoForgeMachine.java @@ -1,6 +1,7 @@ package com.gtocore.common.machine.multiblock.electric.nano; import com.gtocore.api.data.tag.GTOTagPrefix; +import com.gtocore.api.pattern.GTOPredicates; import com.gtocore.common.data.GTOBlocks; import com.gtocore.common.data.GTOMaterials; @@ -15,7 +16,6 @@ import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.chemical.material.stack.MaterialStack; -import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.pattern.BlockPattern; import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; @@ -103,7 +103,7 @@ public static BlockPattern getBlockPattern(int tier, MultiblockMachineDefinition .or(abilities(IMPORT_FLUIDS)) .or(abilities(INPUT_LASER))) .where('B', blocks(GTBlocks.CASING_ASSEMBLY_LINE.get())) - .where('D', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Ruridit))) + .where('D', GTOPredicates.frame(GTMaterials.Ruridit)) .build(); case 3 -> builder.aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " A ", " A ", " A ", " A ", " A ", " A ", " A ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") .aisle(" DDDDD ", " ", " ", " ", " ", " ", " ", " ", " CAC ", " CAC ", " CAC ", " CAC ", " CAC ", " CAC ", " CAC ", " CAC ", " CAC ", " CAC ", " CAC ", " CAC ", " CAC ", " CAC ", " CAC ", " CAC ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") @@ -125,7 +125,7 @@ public static BlockPattern getBlockPattern(int tier, MultiblockMachineDefinition .or(abilities(IMPORT_FLUIDS)) .or(abilities(INPUT_LASER))) .where('B', blocks(GTOBlocks.ADVANCED_ASSEMBLY_LINE_UNIT.get())) - .where('C', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Ruridit))) + .where('C', GTOPredicates.frame(GTMaterials.Ruridit)) .build(); default -> builder .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " B ", " B ", " B ", " B ", " B ", " B ", " B ", " B ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") @@ -143,7 +143,7 @@ public static BlockPattern getBlockPattern(int tier, MultiblockMachineDefinition .or(abilities(EXPORT_ITEMS)) .or(abilities(IMPORT_FLUIDS)) .or(abilities(INPUT_LASER))) - .where('C', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Ruridit))).build(); + .where('C', GTOPredicates.frame(GTMaterials.Ruridit)).build(); }; }); } diff --git a/src/main/java/com/gtocore/common/machine/multiblock/electric/processing/CompoundExtremeCoolingMachine.java b/src/main/java/com/gtocore/common/machine/multiblock/electric/processing/CompoundExtremeCoolingMachine.java index 160ee5aa2..7fe761eec 100644 --- a/src/main/java/com/gtocore/common/machine/multiblock/electric/processing/CompoundExtremeCoolingMachine.java +++ b/src/main/java/com/gtocore/common/machine/multiblock/electric/processing/CompoundExtremeCoolingMachine.java @@ -9,8 +9,6 @@ import com.gtolib.utils.MachineUtils; import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; -import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; -import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.pattern.BlockPattern; import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; @@ -60,14 +58,14 @@ public static BlockPattern getBlockPattern(int tier, MultiblockMachineDefinition .aisle(" KKKKKKKKKKKKKKKKKKKKKKKKKKKKK ", " K LL LL LL LL K ", " E E E K LL LL LL LL K E E E ", " E E E K LL LL LL LL K E E E ", " E E E K LL LL LL LL K E E E ", " E E E K LL LL LL LL K E E E ", " E E E K LL LL LL LL K E E E ", " K LL LL LL LL K ", " KKKKKKKKKKKKKKKKKKKKKKKKKKKKK ") .aisle(" KKMMKKKKKMMQQQQQQQMMKKKKKMMKK ", " KKKKKKKKKKKKRRRRRKKKKKKKKKKKK ", " KKKKKKKKKKKKKKKKKKKKKKKKKKKKK ", " KKKKKKKKKKKKKKKKKKKKKKKKKKKKK ", " KKKKKKKKKKKKKKKKKKKKKKKKKKKKK ", " KKKKKKKKKKKKKKKKKKKKKKKKKKKKK ", " KKKKKKKKKKKKKKKKKKKKKKKKKKKKK ", " KKKKKKKKKKKKRRRRRKKKKKKKKKKKK ", " KKMMKKKKKMMQQQQQQQMMKKKKKMMKK ") .aisle(" MM MM MM MM ", " MMHHHHHMM MMHHHHHMM ", " MMOOOOOMM MMOOOOOMM ", " MMHHHHHMM MMHHHHHMM ", " MMPPPPPMM MMPPPPPMM ", " MMHHHHHMM MMHHHHHMM ", " MMOOOOOMM MMOOOOOMM ", " MMHHHHHMM MMHHHHHMM ", " MM MM MM MM ") - .where('A', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.WatertightSteel))) + .where('A', GTOPredicates.frame(GTMaterials.WatertightSteel)) .where('B', blocks(GCYMBlocks.CASING_LASER_SAFE_ENGRAVING.get())) .where('C', blocks(GTBlocks.HIGH_POWER_CASING.get())) .where('D', blocks(GTOBlocks.LASER_CASING.get())) .where('E', blocks(GTBlocks.SUPERCONDUCTING_COIL.get())) .where('F', blocks(GTOBlocks.OPTICAL_RESONANCE_CHAMBER.get())) .where('G', blocks(GTOBlocks.LASER_COOLING_CASING.get())) - .where('H', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Neutronium))) + .where('H', GTOPredicates.frame(GTMaterials.Neutronium)) .where('I', blocks(GTBlocks.BATTERY_ULTIMATE_UHV.get())) .where('J', blocks(GTBlocks.FUSION_GLASS.get())) .where('K', blocks(GTBlocks.CASING_ALUMINIUM_FROSTPROOF.get())) @@ -97,14 +95,14 @@ public static BlockPattern getBlockPattern(int tier, MultiblockMachineDefinition .aisle(" AAGGAAAAAGGLLLLLLLGGAAAAAGGAA ", " AAAAAAAAAAAAMMMMMAAAAAAAAAAAA ", " AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ", " AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ", " AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ", " AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ", " AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ", " AAAAAAAAAAAAMMMMMAAAAAAAAAAAA ", " AAGGAAAAAGGLLLLLLLGGAAAAAGGAA ") .aisle(" GG GG GG GG ", " GGIIIIIGG GGIIIIIGG ", " GGJJJJJGG GGJJJJJGG ", " GGIIIIIGG GGIIIIIGG ", " GGKKKKKGG GGKKKKKGG ", " GGIIIIIGG GGIIIIIGG ", " GGJJJJJGG GGJJJJJGG ", " GGIIIIIGG GGIIIIIGG ", " GG GG GG GG ") .where('A', blocks(GTBlocks.CASING_ALUMINIUM_FROSTPROOF.get())) - .where('B', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.WatertightSteel))) + .where('B', GTOPredicates.frame(GTMaterials.WatertightSteel)) .where('C', blocks(GTBlocks.HIGH_POWER_CASING.get())) .where('D', blocks(GTOBlocks.LASER_COOLING_CASING.get())) .where('E', blocks(GTOBlocks.LASER_CASING.get())) .where('F', blocks(GTBlocks.CASING_TUNGSTENSTEEL_PIPE.get())) .where('G', blocks(GTOBlocks.ANTIFREEZE_HEATPROOF_MACHINE_CASING.get())) .where('H', blocks(GTOBlocks.HOLLOW_CASING.get())) - .where('I', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Neutronium))) + .where('I', GTOPredicates.frame(GTMaterials.Neutronium)) .where('J', blocks(GTOBlocks.AMPROSIUM_PIPE_CASING.get())) .where('K', blocks(GTBlocks.FILTER_CASING.get())) .where('L', blocks(GTBlocks.CASING_ALUMINIUM_FROSTPROOF.get()) diff --git a/src/main/java/com/gtocore/common/machine/multiblock/electric/space/spacestaion/WorkspaceExtension.java b/src/main/java/com/gtocore/common/machine/multiblock/electric/space/spacestaion/WorkspaceExtension.java index 0ab3176a1..214253c0e 100644 --- a/src/main/java/com/gtocore/common/machine/multiblock/electric/space/spacestaion/WorkspaceExtension.java +++ b/src/main/java/com/gtocore/common/machine/multiblock/electric/space/spacestaion/WorkspaceExtension.java @@ -12,8 +12,6 @@ import com.gregtechceu.gtceu.api.block.MetaMachineBlock; import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; -import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; -import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.gui.fancy.ConfiguratorPanel; import com.gregtechceu.gtceu.api.gui.fancy.IFancyConfigurator; import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; @@ -181,13 +179,13 @@ public static Function patternAtLengt builder = builder.aisle(aisle); } - return builder.where('A', blocks(GTOBlocks.TITANIUM_ALLOY_INTERNAL_FRAME.get())) + return builder.where('A', blocks(GTOBlocks.TITANIUM_ALLOY_FRAME_INTERNAL.get())) .where('B', controller(definition)) .where('C', blocks(GTOBlocks.ALUMINUM_ALLOY_7050_SUPPORT_MECHANICAL_BLOCK.get())) .where('c', MODULE.traceabilityPredicate.get()) .where('D', blocks(GTOBlocks.SPACECRAFT_DOCKING_CASING.get())) .where('E', blocks(GTOBlocks.ALUMINUM_ALLOY_2090_SKIN_MECHANICAL_BLOCK.get())) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.StainlessSteel316))) + .where('F', GTOPredicates.frame(GTOMaterials.StainlessSteel316)) .where('G', blocks(GTOBlocks.PRESSURE_RESISTANT_HOUSING_MECHANICAL_BLOCK.get())) .where('H', blocks(GTOBlocks.SPACECRAFT_SEALING_MECHANICAL_BLOCK.get())) .where('I', GTOPredicates.light()) diff --git a/src/main/java/com/gtocore/common/machine/multiblock/electric/space/spacestaion/recipe/SpaceBioResearchModule.java b/src/main/java/com/gtocore/common/machine/multiblock/electric/space/spacestaion/recipe/SpaceBioResearchModule.java index 721d17920..d2f8d30bc 100644 --- a/src/main/java/com/gtocore/common/machine/multiblock/electric/space/spacestaion/recipe/SpaceBioResearchModule.java +++ b/src/main/java/com/gtocore/common/machine/multiblock/electric/space/spacestaion/recipe/SpaceBioResearchModule.java @@ -7,6 +7,7 @@ import com.gtolib.api.annotation.language.RegisterLanguage; import com.gtolib.api.machine.feature.multiblock.IMultiblockTraitHolder; import com.gtolib.api.machine.trait.IEnhancedRecipeLogic; +import com.gtolib.api.recipe.IdleReason; import com.gtolib.api.recipe.Recipe; import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; @@ -41,6 +42,10 @@ public SpaceBioResearchModule(MetaMachineBlockEntity metaMachineBlockEntity) { @Override public Recipe getRealRecipe(@NotNull Recipe recipe) { + if (!isWorkspaceReady()) { + setIdleReason(IdleReason.CANNOT_WORK_IN_SPACE); + return null; + } if (recipe.data.contains("filter_casing") && recipe.data.getInt("filter_casing") > core.getTypes().size()) { ((IEnhancedRecipeLogic) getRecipeLogic()) .gtolib$setIdleReason(Component.translatable(LANGUAGE_INSUFFICIENT_CLEANROOM)); diff --git a/src/main/java/com/gtocore/common/machine/multiblock/electric/space/spacestaion/recipe/SpaceDroneDock.java b/src/main/java/com/gtocore/common/machine/multiblock/electric/space/spacestaion/recipe/SpaceDroneDock.java index c896da71b..23846cdb6 100644 --- a/src/main/java/com/gtocore/common/machine/multiblock/electric/space/spacestaion/recipe/SpaceDroneDock.java +++ b/src/main/java/com/gtocore/common/machine/multiblock/electric/space/spacestaion/recipe/SpaceDroneDock.java @@ -16,10 +16,10 @@ import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.item.capability.ElectricItem; import com.gregtechceu.gtceu.api.recipe.content.Content; +import com.gregtechceu.gtceu.api.recipe.ingredient.ItemIngredient; import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Ingredient; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -52,7 +52,7 @@ public Recipe fullModifyRecipe(@NotNull Recipe recipe) { ObjectHolder costEU = new ObjectHolder<>(null); ObjectHolder outputHolder = new ObjectHolder<>(null); ObjectHolder inputHolder = new ObjectHolder<>(null); - Ingredient chargeable = (Ingredient) recipe.inputs.get(ItemRecipeCapability.CAP).getFirst().inner; + ItemIngredient chargeable = (ItemIngredient) recipe.inputs.get(ItemRecipeCapability.CAP).getFirst().inner; fastForEachInputItems((stack, amount) -> { if (hasInput.get()) return; ItemStack output = stack.copyWithCount(1); diff --git a/src/main/java/com/gtocore/common/machine/multiblock/generator/PhotovoltaicPowerStationMachine.java b/src/main/java/com/gtocore/common/machine/multiblock/generator/PhotovoltaicPowerStationMachine.java index a39a4334e..1a038352e 100644 --- a/src/main/java/com/gtocore/common/machine/multiblock/generator/PhotovoltaicPowerStationMachine.java +++ b/src/main/java/com/gtocore/common/machine/multiblock/generator/PhotovoltaicPowerStationMachine.java @@ -1,6 +1,7 @@ package com.gtocore.common.machine.multiblock.generator; import com.gtocore.api.machine.part.GTOPartAbility; +import com.gtocore.api.pattern.GTOPredicates; import com.gtocore.client.forge.ForgeClientEvent; import com.gtocore.data.IdleReason; @@ -308,7 +309,7 @@ public static BlockPattern getPatternInSpace(MultiblockMachineDefinition definit .aisle("ABBBA") .aisle("ABBBA") .aisle("AAAAA") - .where('A', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Aluminium))) + .where('A', GTOPredicates.frame(GTMaterials.Aluminium)) .where('B', blocks(photovoltaicBlock.get())) .where('C', blocks(casing.get()) .or(Predicates.blocks(CONTROL_HATCH.get()).setMaxGlobalLimited(1).setPreviewCount(0)) diff --git a/src/main/java/com/gtocore/common/machine/multiblock/generator/TurbineMachine.java b/src/main/java/com/gtocore/common/machine/multiblock/generator/TurbineMachine.java index ef1ebe6ce..01c1ec7f6 100644 --- a/src/main/java/com/gtocore/common/machine/multiblock/generator/TurbineMachine.java +++ b/src/main/java/com/gtocore/common/machine/multiblock/generator/TurbineMachine.java @@ -464,7 +464,7 @@ public Object2IntMap getCasingTiers() { public static final String DESC3 = "gtocore.machine.mega_turbine.expert.desc.3"; @RegisterLanguage(cn = "公式:输出倍率 = 基础倍率 x 调节倍率", en = "Formula: Output Multiplier = Base Multiplier x Adjustment Multiplier") public static final String DESC4 = "gtocore.machine.mega_turbine.expert.desc.4"; - @RegisterLanguage(cn = "转子损坏倍率 = 基础倍率 x max(2.2 - 0.08 * 玻璃等级, 1.2) ^ (调节倍率 - 1)", en = "Rotor Damage Multiplier = Base Multiplier x max(2.2 - 0.08 * Coil Tier, 1.2) ^ (Adjustment Multiplier - 1)") + @RegisterLanguage(cn = "转子损坏倍率 = 基础倍率 x max(2.2 - 0.08 * 玻璃等级, 1.2) ^ (调节倍率 - 1)", en = "Rotor Damage Multiplier = Base Multiplier x max(2.2 - 0.08 * Glass Tier, 1.2) ^ (Adjustment Multiplier - 1)") public static final String DESC5 = "gtocore.machine.mega_turbine.expert.desc.5"; @RegisterLanguage(cn = "调节:", en = "Adjustment: ") public static final String ADJUST = "gtocore.machine.mega_turbine.expert.adjust"; diff --git a/src/main/java/com/gtocore/common/machine/multiblock/noenergy/NeutronVortexMachine.java b/src/main/java/com/gtocore/common/machine/multiblock/noenergy/NeutronVortexMachine.java index 39a01d19f..5e5fb62b3 100644 --- a/src/main/java/com/gtocore/common/machine/multiblock/noenergy/NeutronVortexMachine.java +++ b/src/main/java/com/gtocore/common/machine/multiblock/noenergy/NeutronVortexMachine.java @@ -1,6 +1,7 @@ package com.gtocore.common.machine.multiblock.noenergy; import com.gtocore.api.machine.part.GTOPartAbility; +import com.gtocore.api.pattern.GTOPredicates; import com.gtocore.common.data.GTOBlocks; import com.gtocore.common.data.GTOMachines; import com.gtocore.common.data.GTOMaterials; @@ -13,8 +14,6 @@ import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.capability.IEnergyContainer; -import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; -import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.fancy.ConfiguratorPanel; import com.gregtechceu.gtceu.api.gui.fancy.IFancyConfiguratorButton; @@ -141,8 +140,8 @@ public static BlockPattern getBlockPattern(int tier, MultiblockMachineDefinition .where('H', blocks(GTBlocks.HIGH_POWER_CASING.get())) .where('I', blocks(GTOBlocks.TITANIUM_BOROSILICATE_GLASS.get())) .where('J', blocks(GTOBlocks.NAQUADAH_REINFORCED_PLANT_CASING.get())) - .where('K', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Quantanium))) - .where('L', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Vibranium))) + .where('K', GTOPredicates.frame(GTOMaterials.Quantanium)) + .where('L', GTOPredicates.frame(GTOMaterials.Vibranium)) .where('M', blocks(GTOBlocks.STRONTIUM_CARBONATE_CERAMIC_RAY_ABSORBING_MECHANICAL_CUBE.get())) .where('N', blocks(GTBlocks.FUSION_GLASS.get())) .where('O', blocks(GTOBlocks.SPEEDING_PIPE.get())) @@ -181,8 +180,8 @@ public static BlockPattern getBlockPattern(int tier, MultiblockMachineDefinition .aisle(" AHHHHHA ", " AHHHHHA ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " AAAAAAA ", " AAAAAAA ") .where('A', blocks(GTOBlocks.NAQUADAH_REINFORCED_PLANT_CASING.get())) .where('B', blocks(GTOBlocks.DIMENSIONALLY_TRANSCENDENT_CASING.get())) - .where('C', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Quantanium))) - .where('D', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTOMaterials.Vibranium))) + .where('C', GTOPredicates.frame(GTOMaterials.Quantanium)) + .where('D', GTOPredicates.frame(GTOMaterials.Vibranium)) .where('E', blocks(GTOBlocks.STRONTIUM_CARBONATE_CERAMIC_RAY_ABSORBING_MECHANICAL_CUBE.get())) .where('F', blocks(GTBlocks.FUSION_GLASS.get())) .where('G', blocks(GTOBlocks.SPEEDING_PIPE.get())) diff --git a/src/main/java/com/gtocore/common/machine/multiblock/part/AccelerateHatchPartMachine.java b/src/main/java/com/gtocore/common/machine/multiblock/part/AccelerateHatchPartMachine.java index 1ffe3d669..44d3efdf3 100644 --- a/src/main/java/com/gtocore/common/machine/multiblock/part/AccelerateHatchPartMachine.java +++ b/src/main/java/com/gtocore/common/machine/multiblock/part/AccelerateHatchPartMachine.java @@ -8,6 +8,7 @@ import com.gregtechceu.gtceu.api.machine.feature.multiblock.IWorkableMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; @@ -31,9 +32,10 @@ public Widget createUIWidget() { @Override public GTRecipe modifyRecipe(IWorkableMultiController controller, @NotNull GTRecipe recipe) { - if (controller instanceof WorkableElectricMultiblockMachine machine) { + if (controller instanceof WorkableElectricMultiblockMachine) { int reduction = (int) getCurrent(); - int t = machine.getTier() - getTier(); + int recipeTier = RecipeHelper.getRecipeEUtTier(recipe); + int t = recipeTier - getTier(); if (t > 0) { reduction = Math.min(100, reduction + 20 * t); } diff --git a/src/main/java/com/gtocore/common/machine/multiblock/part/InfiniteIntakeHatchPartMachine.java b/src/main/java/com/gtocore/common/machine/multiblock/part/InfiniteIntakeHatchPartMachine.java index ca2c12918..d6646e207 100644 --- a/src/main/java/com/gtocore/common/machine/multiblock/part/InfiniteIntakeHatchPartMachine.java +++ b/src/main/java/com/gtocore/common/machine/multiblock/part/InfiniteIntakeHatchPartMachine.java @@ -65,7 +65,7 @@ public static void init(GTRecipeBuilder recipeBuilder) { for (var condition : recipeBuilder.conditions) { if (condition instanceof DimensionCondition dimensionCondition) { var dim = dimensionCondition.dimension; - var fluids = RecipeHelper.getInputContents(recipeBuilder, FluidRecipeCapability.CAP); + var fluids = RecipeHelper.getOutputContents(recipeBuilder, FluidRecipeCapability.CAP); if (!fluids.isEmpty()) { AIR_MAP.put(dim, fluids.getFirst().getFluid()); break; diff --git a/src/main/java/com/gtocore/common/machine/multiblock/part/ProgrammableHatchPartMachine.java b/src/main/java/com/gtocore/common/machine/multiblock/part/ProgrammableHatchPartMachine.java index 636b5d472..b03f32dde 100644 --- a/src/main/java/com/gtocore/common/machine/multiblock/part/ProgrammableHatchPartMachine.java +++ b/src/main/java/com/gtocore/common/machine/multiblock/part/ProgrammableHatchPartMachine.java @@ -110,6 +110,12 @@ public void removedFromController(@NotNull IMultiController controller) { this.recipeTypes.addAll(MultiMachineModeFancyConfigurator.extractRecipeTypes(this.getControllers())); } + @Override + public boolean swapIO() { + // Programmable hatches should not be able to swap IO + return false; + } + @Override public boolean isProgrammable() { return true; @@ -136,7 +142,7 @@ private ProgrammableHandler(Object machine) { @NotNull @Override public ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) { - if (machine.isProgrammable() && stack.is(CustomItems.VIRTUAL_ITEM_PROVIDER.get())) { + if (machine.isProgrammable() && stack.hasTag() && stack.is(CustomItems.VIRTUAL_ITEM_PROVIDER.get())) { setStackInSlot(slot, VirtualItemProviderBehavior.getVirtualItem(stack)); return ItemStack.EMPTY; } diff --git a/src/main/java/com/gtocore/common/machine/multiblock/part/ae/MECraftPatternPartMachine.java b/src/main/java/com/gtocore/common/machine/multiblock/part/ae/MECraftPatternPartMachine.java index ae1ad6489..5cb240b90 100644 --- a/src/main/java/com/gtocore/common/machine/multiblock/part/ae/MECraftPatternPartMachine.java +++ b/src/main/java/com/gtocore/common/machine/multiblock/part/ae/MECraftPatternPartMachine.java @@ -109,4 +109,9 @@ public Runnable getOnContentsChanged() { return machine.onContentsChanged; } } + + @Override + public boolean gto$isCraftingContainer() { + return true; + } } diff --git a/src/main/java/com/gtocore/common/machine/multiblock/part/ae/MEMufflerHatchPartMachine.java b/src/main/java/com/gtocore/common/machine/multiblock/part/ae/MEMufflerHatchPartMachine.java index ff90928cb..3458fb38b 100644 --- a/src/main/java/com/gtocore/common/machine/multiblock/part/ae/MEMufflerHatchPartMachine.java +++ b/src/main/java/com/gtocore/common/machine/multiblock/part/ae/MEMufflerHatchPartMachine.java @@ -9,8 +9,6 @@ import com.gtolib.api.annotation.language.RegisterLanguage; import com.gtolib.api.machine.feature.IGTOMufflerMachine; import com.gtolib.api.machine.trait.InaccessibleInfiniteHandler; -import com.gtolib.api.misc.AsyncTask; -import com.gtolib.api.misc.IAsyncTaskHolder; import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; @@ -27,6 +25,7 @@ import com.gregtechceu.gtceu.common.data.GTMachines; import com.gregtechceu.gtceu.integration.ae2.gui.widget.list.AEListGridWidget; import com.gregtechceu.gtceu.integration.ae2.utils.KeyStorage; +import com.gregtechceu.gtceu.utils.TaskHandler; import net.minecraft.network.chat.Component; import net.minecraft.world.item.Item; @@ -47,7 +46,7 @@ import java.util.Objects; @Scanned -public class MEMufflerHatchPartMachine extends MEPartMachine implements IGTOMufflerMachine, IAsyncTaskHolder { +public class MEMufflerHatchPartMachine extends MEPartMachine implements IGTOMufflerMachine { @Persisted private final KeyStorage internalBuffer; @@ -60,8 +59,6 @@ public class MEMufflerHatchPartMachine extends MEPartMachine implements IGTOMuff @DescSynced private int recoveryChance = 0; - private AsyncTask asyncTask; - private int muffler_tier = 0; @DynamicInitialValue(typeKey = DynamicInitialValueTypes.KEY_AMOUNT, key = "me_muffler_hatch.amplifier_max_amount", @@ -124,19 +121,9 @@ private void onMufflerChange() { return RecipeHandlerList.NO_DATA; } - @Override - public AsyncTask getAsyncTask() { - return asyncTask; - } - - @Override - public void setAsyncTask(AsyncTask task) { - asyncTask = task; - } - @Override public void gtolib$insertAsh(MultiblockControllerMachine controller, GTRecipe lastRecipe) { - AsyncTask.addAsyncTask(this, () -> IGTOMufflerMachine.super.gtolib$insertAsh(controller, lastRecipe)); + TaskHandler.enqueueAsyncTask(getLevel(), () -> IGTOMufflerMachine.super.gtolib$insertAsh(controller, lastRecipe), 0); } @Override diff --git a/src/main/java/com/gtocore/common/machine/multiblock/part/ae/MEPatternBufferPartMachine.java b/src/main/java/com/gtocore/common/machine/multiblock/part/ae/MEPatternBufferPartMachine.java index 14f352486..c7dcead06 100644 --- a/src/main/java/com/gtocore/common/machine/multiblock/part/ae/MEPatternBufferPartMachine.java +++ b/src/main/java/com/gtocore/common/machine/multiblock/part/ae/MEPatternBufferPartMachine.java @@ -110,12 +110,23 @@ public abstract class MEPatternBufferPartMachine extends MEPatternPartMachineKt< @RegisterLanguage(cn = "总成共享配置", en = "Buffer share configuration") private static final String SHARE = "gtocore.pattern_buffer.share"; + @Override + public @Nullable GTRecipeType gto$getRecipeType() { + return getRecipeType(); + } + + @Override + public @Nullable Collection gto$getRecipeTypes() { + return getRecipeTypes(); + } + @Persisted @DescSynced @Getter private final ArrayList recipeTypes = new ArrayList<>(); @Persisted @DescSynced + @Getter public GTRecipeType recipeType = GTORecipeTypes.HATCH_COMBINED; @DescSynced @@ -703,9 +714,9 @@ public List handleFluidInternal(List left, boo @Override public CompoundTag serializeNBT() { CompoundTag tag = super.serializeNBT(); - if (recipe != null) { - tag.put("recipe", recipe.serializeNBT()); - } + // if (recipe != null) { + // tag.put("recipe", recipe.serializeNBT()); + // } ListTag itemsTag = new ListTag(); for (var it = itemInventory.reference2LongEntrySet().fastIterator(); it.hasNext();) { var entry = it.next(); @@ -743,7 +754,7 @@ public CompoundTag serializeNBT() { @Override public void deserializeNBT(CompoundTag tag) { - setRecipe(Recipe.deserializeNBT(tag.get("recipe"))); + // setRecipe(Recipe.deserializeNBT(tag.get("recipe"))); ListTag items = tag.getList("inventory", Tag.TAG_COMPOUND); for (Tag t : items) { if (!(t instanceof CompoundTag ct)) continue; diff --git a/src/main/java/com/gtocore/common/machine/multiblock/part/ae/MEPatternContentSortMachine.kt b/src/main/java/com/gtocore/common/machine/multiblock/part/ae/MEPatternContentSortMachine.kt deleted file mode 100644 index 77c2d65d2..000000000 --- a/src/main/java/com/gtocore/common/machine/multiblock/part/ae/MEPatternContentSortMachine.kt +++ /dev/null @@ -1,374 +0,0 @@ -package com.gtocore.common.machine.multiblock.part.ae - -import com.gtocore.api.gui.helper.ProgressBarColorStyle -import com.gtocore.api.gui.ktflexible.progressBar -import com.gtocore.api.gui.ktflexible.textBlock -import com.gtocore.common.machine.multiblock.part.ae.MEPatternContentSortMachine.MODE.FLUID -import com.gtocore.common.machine.multiblock.part.ae.MEPatternContentSortMachine.MODE.ITEM - -import net.minecraft.network.chat.Component -import net.minecraft.server.TickTask -import net.minecraft.world.entity.player.Player -import net.minecraftforge.common.capabilities.ForgeCapabilities -import net.minecraftforge.fluids.capability.IFluidHandler - -import appeng.api.networking.IManagedGridNode -import appeng.api.stacks.AEFluidKey -import appeng.api.stacks.AEItemKey -import appeng.api.stacks.AEKey -import appeng.blockentity.crafting.PatternProviderBlockEntity -import appeng.me.Grid -import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity -import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget -import com.gregtechceu.gtceu.api.gui.fancy.IFancyUIProvider -import com.gregtechceu.gtceu.api.machine.MetaMachine -import com.gregtechceu.gtceu.api.machine.TickableSubscription -import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine -import com.gregtechceu.gtceu.integration.ae2.machine.feature.IGridConnectedMachine -import com.gregtechceu.gtceu.integration.ae2.machine.trait.GridNodeHolder -import com.gtolib.api.ae2.IExpandedGrid -import com.gtolib.api.annotation.DataGeneratorScanned -import com.gtolib.api.annotation.language.RegisterLanguage -import com.gtolib.api.gui.ktflexible.button -import com.gtolib.api.gui.ktflexible.rootFresh -import com.lowdragmc.lowdraglib.gui.modular.ModularUI -import com.lowdragmc.lowdraglib.gui.widget.PhantomSlotWidget -import com.lowdragmc.lowdraglib.gui.widget.Widget -import com.lowdragmc.lowdraglib.misc.ItemStackTransfer -import com.lowdragmc.lowdraglib.misc.ItemTransferList -import com.lowdragmc.lowdraglib.syncdata.IContentChangeAware -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted -import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap -import it.unimi.dsi.fastutil.objects.Object2ObjectMap -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap -import it.unimi.dsi.fastutil.objects.ObjectArrayList -import kotlinx.coroutines.* -import kotlinx.coroutines.flow.* - -import java.util.concurrent.ConcurrentHashMap - -@DataGeneratorScanned -class MEPatternContentSortMachine(holder: MetaMachineBlockEntity) : - MetaMachine(holder), - IFancyUIMachine, - IGridConnectedMachine { - @DataGeneratorScanned - companion object { - const val PAGE_WIDTH = 276 - const val PAGE_HEIGHT = 166 - - @RegisterLanguage(cn = "应用", en = "Apply") - var TOOLTIPS_APPLY: String = "gtocore.tooltip.pattern_content_sort_machine.apply" - - @RegisterLanguage(cn = " 每行为一组,样板内所有此行物品输入会被替换为此行优先级最高的物品,每行物品优先级依据物品优先级从左开始高到低排序,如果一行内有流体容器,则对内部流体做相应替换,左侧优先级最高", en = " For each line, all items in the pattern input will be replaced with the highest priority item of that line, Prioritization of items in each row is based on item priority in descending order.") - var TOOLTIPS_MEANS_FOR_LINE_0: String = "gtocore.tooltip.pattern_content_sort_machine.means_for_line_0" - - @RegisterLanguage(cn = "模式 : 流体替换", en = "Mode : Fluid Replacement") - const val mode_fluid = "gtocore.tooltip.pattern_content_sort_machine.mode.fluid" - - @RegisterLanguage(cn = "模式 : 物品替换", en = "Mode : Item Replacement") - const val mode_item = "gtocore.tooltip.pattern_content_sort_machine.mode.item" - } - - @DescSynced - var isGridOnline: Boolean = false - - private var tickableSubscription: TickableSubscription? = null - - @Persisted - var gridNodeHolder = GridNodeHolder(this) - var isInitialize = false - override fun isOnline() = isGridOnline - override fun setOnline(p0: Boolean) { - isGridOnline = p0 - } - var freshUI: Runnable = Runnable {} - override fun getMainNode(): IManagedGridNode? = gridNodeHolder.mainNode - override fun isRemote() = super.isRemote - - // ////////////////////////////// - // ****** LOGIC ******// - // ////////////////////////////// - private val internalLogic by lazy { InternalLogic() } - abstract class InternalLogicTemplate { - class FlowData(val finished: Int, val total: Int) - abstract fun applyRefresh() - abstract fun receiveFlowData(flowData: FlowData) - abstract fun collectFlowRunner(): List - abstract fun buildCoroutine(run: List): CoroutineScope - } - private inner class InternalLogic : InternalLogicTemplate() { - var lastFlowData: FlowData? = null - var uniqueScope: CoroutineScope? = null - var isRefreshing: Boolean = false - override fun applyRefresh() { - val runnables = collectFlowRunner() - uniqueScope?.cancel() - uniqueScope = buildCoroutine(runnables) - } - - override fun receiveFlowData(flowData: FlowData) { - lastFlowData = flowData - } - - override fun collectFlowRunner(): List { - val runnable = mutableListOf() - if (gridNodeHolder.mainNode?.isActive == false) return runnable - val grid = gridNodeHolder.mainNode?.grid ?: return runnable - grid.getActiveMachines(PatternProviderBlockEntity::class.java).forEach { - runnable.add { it.logic.updatePatterns() } - } - if (grid is Grid && grid is IExpandedGrid) { - val machinesPart = mutableListOf>() - grid.machines.forEach { _, node -> - if (node.isActive) { - val logicHost = node.owner - if (logicHost is MEPatternPartMachineKt<*>) { - machinesPart.plusAssign(logicHost) - } - } - } - machinesPart.forEach { s -> - runnable.add { - (0 until s.maxPatternCount).forEach { - if (!s.internalPatternInventory.getStackInSlot(it).isEmpty) { - s.onPatternChange(it) - } - } - } - } - } - return runnable - } - - override fun buildCoroutine(run: List): CoroutineScope { - val scope = CoroutineScope(Dispatchers.Default) - flow { - val total = run.size - val block = 5 - run.chunked(block).forEachIndexed { blockIndex, runnables -> - runnables.forEach { it.run() } - val finished = ((blockIndex + 1) * block).coerceAtMost(total) - emit(FlowData(finished, total)) - delay(100) - } - }.onEach { - receiveFlowData(it) - }.onStart { - isRefreshing = true - }.onCompletion { - isRefreshing = false - }.launchIn(scope) - return scope - } - } - val externalLogic by lazy { ExternalLogic() } - abstract class ExternalLogicTemplate { - abstract fun getAEKeyReplaced(stack: AEKey): AEKey - } - inner class ExternalLogic : ExternalLogicTemplate() { - private val lastAccessTime = Object2LongOpenHashMap() - - // 物品->首选物品映射表 - val itemToPreferred: ConcurrentHashMap = ConcurrentHashMap() - - // 物品->物品排序从高到低映射表 - val itemToSort: Object2ObjectMap> = Object2ObjectOpenHashMap() - - override fun getAEKeyReplaced(stack: AEKey): AEKey { - itemToPreferred[stack]?.let { - lastAccessTime[stack] = System.currentTimeMillis() - return it - } - val sortStacks = itemToSort[stack] - if (sortStacks != null && sortStacks.isNotEmpty()) { - val preferred = sortStacks.first() - itemToPreferred[stack] = preferred - lastAccessTime[stack] = System.currentTimeMillis() - return preferred - } - - itemToPreferred[stack] = stack - lastAccessTime[stack] = System.currentTimeMillis() - return stack - } - - fun fullyRefresh() { - itemToPreferred.clear() - itemToSort.clear() - itemTransferList.transfers.forEach { transfer -> - transfer as MyItemStackTransfer - val sortStacks = ObjectArrayList() - val itemStacks = (0 until transfer.slots) - .mapNotNull { transfer.getStackInSlot(it) } - .filterNot { it.isEmpty } - - for (stack in itemStacks) { - transfer.mode = ITEM - stack.getCapability(ForgeCapabilities.FLUID_HANDLER_ITEM).ifPresent { - if (!it.drain(Int.MAX_VALUE, IFluidHandler.FluidAction.SIMULATE).isEmpty) { - transfer.mode = FLUID - } - } - } - when (transfer.mode) { - FLUID -> { - val fluids = itemStacks - .mapNotNull { stack -> - val capability = stack.getCapability(ForgeCapabilities.FLUID_HANDLER_ITEM).resolve().orElse(null) ?: return@mapNotNull null - return@mapNotNull capability.drain(Int.MAX_VALUE, IFluidHandler.FluidAction.SIMULATE) - } - .mapNotNull { AEFluidKey.of(it) } - sortStacks.addAll(fluids) - fluids.forEach { aek -> - itemToSort[aek] = sortStacks - } - } - ITEM -> { - val items = itemStacks - .mapNotNull { AEItemKey.of(it) } - sortStacks.addAll(items) - items.forEach { aek -> - itemToSort[aek] = sortStacks - } - } - } - } - } - } - - override fun onLoad() { - super.onLoad() - // Wire content-changed hooks so any ghost insert/remove persists immediately. - if (itemTransferList is MyItemTransferList) { - (itemTransferList as MyItemTransferList).onContentsChanged = Runnable { - externalLogic.fullyRefresh() - if (!isRemote) requestSync() else freshUI.run() - } - } - itemTransferList.transfers.forEach { t -> - if (t is MyItemStackTransfer) { - t.onContentsChanged = Runnable { - externalLogic.fullyRefresh() - if (!isRemote) requestSync() else freshUI.run() - } - } - } - tickableSubscription = subscribeServerTick(tickableSubscription, { - if (!isRemote && !isInitialize && gridNodeHolder.mainNode.isActive) { - level?.server?.tell( - TickTask(40) { - externalLogic.fullyRefresh() - internalLogic.applyRefresh() - }, - ) - isInitialize = true - } - }, 20) - } - - override fun onUnload() { - super.onUnload() - internalLogic.uniqueScope?.cancel() - if (tickableSubscription != null) { - tickableSubscription?.unsubscribe() - tickableSubscription = null - } - } - - // ////////////////////////////// - // ****** DATA ******// - // ////////////////////////////// - enum class MODE { - FLUID, - ITEM, - } - - @Persisted - @DescSynced - var itemTransferList: ItemTransferList = MyItemTransferList(*Array(10) { MyItemStackTransfer(10) }) - private inner class MyItemStackTransfer(size: Int, var mode: MODE = ITEM) : - ItemStackTransfer(size), - IContentChangeAware { - private var change: Runnable? = null - override fun setOnContentsChanged(a: Runnable?) { - change = a - } - override fun getOnContentsChanged(): Runnable? = change - override fun onContentsChanged(slot: Int) { - super.onContentsChanged(slot) - externalLogic.fullyRefresh() - if (!isRemote) requestSync() else freshUI.run() - change?.run() - } - } - private class MyItemTransferList(vararg transfers: MyItemStackTransfer) : - ItemTransferList(*transfers), - IContentChangeAware { - var onContentChanged: Runnable? = null - override fun setOnContentsChanged(a: Runnable?) { - onContentChanged = a - } - override fun getOnContentsChanged(): Runnable = Runnable { - onContentsChanged() - onContentChanged?.run() - } - } - - // ////////////////////////////// - // ****** UI ******// - // ////////////////////////////// - - class MyFancyMachineUIWidget(mainPage: IFancyUIProvider, width: Int, height: Int) : FancyMachineUIWidget(mainPage, width, height) { - fun freshCurrentPage() { - setupFancyUI(currentPage) - } - } - var myFancyMachineUIWidget: MyFancyMachineUIWidget? = null - - override fun createUI(entityPlayer: Player?): ModularUI? = (ModularUI(PAGE_WIDTH, 166, this, entityPlayer)).widget(MyFancyMachineUIWidget(this, PAGE_WIDTH, 166).also { myFancyMachineUIWidget = it }) - - override fun createUIWidget(): Widget = rootFresh(PAGE_WIDTH, PAGE_HEIGHT) { - vScroll(width = availableWidth, height = availableHeight, { spacing = 2 }) { - hBox(height = 14, { spacing = 2 }) { - progressBar( - currentSupplier = { internalLogic.lastFlowData?.finished ?: 0 }, - totalSupplier = { internalLogic.lastFlowData?.total ?: 1 }, - width = this@vScroll.availableWidth - 50 - 2, - height = 14, - textColor = 0xFFFFFFFF.toInt(), - progressColorStyle = ProgressBarColorStyle.Gradient(0xFF33CC33.toInt(), 0xFF55CC55.toInt()), - ) - button(width = 50, height = 14, transKet = TOOLTIPS_APPLY, onClick = { ck -> internalLogic.applyRefresh() }) - } - textBlock(maxWidth = availableWidth, textSupplier = { Component.translatable(TOOLTIPS_MEANS_FOR_LINE_0) }) - itemTransferList.transfers.forEach { transfer -> - transfer as MyItemStackTransfer - vBox(width = availableWidth, style = { spacing = 4 }) { - vBox(width = availableWidth, alwaysHorizonCenter = true) { - textBlock(maxWidth = availableWidth, textSupplier = { - when (transfer.mode) { - FLUID -> Component.translatable(mode_fluid) - ITEM -> Component.translatable(mode_item) - } - }) - hBox(height = 18) { - (0 until transfer.slots).forEach { slotIndexInHandler -> - widget( - PhantomSlotWidget(transfer, slotIndexInHandler, 0, 0).apply { - setChangeListener { - externalLogic.fullyRefresh() - if (!isRemote) requestSync() - if (isRemote) freshUI.run() - } - }, - ) - } - } - } - } - } - } - }.also { freshUI = Runnable { it.requireFresh() } } -} diff --git a/src/main/java/com/gtocore/common/machine/multiblock/part/ae/MEPatternPartMachineKt.kt b/src/main/java/com/gtocore/common/machine/multiblock/part/ae/MEPatternPartMachineKt.kt index a3b26e6e5..3aed4b67f 100644 --- a/src/main/java/com/gtocore/common/machine/multiblock/part/ae/MEPatternPartMachineKt.kt +++ b/src/main/java/com/gtocore/common/machine/multiblock/part/ae/MEPatternPartMachineKt.kt @@ -4,8 +4,9 @@ import com.gtocore.api.gui.ktflexible.multiPageAdvanced import com.gtocore.api.gui.ktflexible.textBlock import com.gtocore.common.data.machines.GTAEMachines import com.gtocore.common.machine.multiblock.part.ae.widget.slot.AEPatternViewSlotWidgetKt -import com.gtocore.eio_travel.api.ITravelHandlerHook -import com.gtocore.eio_travel.api.TravelSavedData +import com.gtocore.eio_travel.logic.TravelSavedData +import com.gtocore.eio_travel.logic.TravelUtils +import com.gtocore.integration.ae.hooks.IExtendedPatternContainer import com.gtocore.integration.ae.wireless.WirelessMachine import net.minecraft.MethodsReturnNonnullByDefault @@ -33,7 +34,6 @@ import appeng.api.networking.crafting.ICraftingProvider import appeng.api.stacks.AEItemKey import appeng.api.stacks.KeyCounter import appeng.crafting.pattern.EncodedPatternItem -import appeng.helpers.patternprovider.PatternContainer import com.google.common.collect.BiMap import com.google.common.collect.HashBiMap import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity @@ -81,7 +81,7 @@ internal abstract class MEPatternPartMachineKt run { showInTravelNetwork = b - ITravelHandlerHook.requireResync(level!!) + TravelUtils.requireResync(level!!) } }, ).setTooltipsSupplier { b -> @@ -363,7 +363,7 @@ internal abstract class MEPatternPartMachineKt autoPullTest) {} + + @Override + public boolean isUpdateRequested(IStorageService service) { + return true; + } + + @Override + public Set getListener() { + return new ReferenceOpenHashSet<>(); + } } diff --git a/src/main/java/com/gtocore/common/machine/multiblock/part/ae/MEStockingHatchPartMachine.java b/src/main/java/com/gtocore/common/machine/multiblock/part/ae/MEStockingHatchPartMachine.java index 3d888b898..b567bb056 100644 --- a/src/main/java/com/gtocore/common/machine/multiblock/part/ae/MEStockingHatchPartMachine.java +++ b/src/main/java/com/gtocore/common/machine/multiblock/part/ae/MEStockingHatchPartMachine.java @@ -32,10 +32,12 @@ import appeng.api.stacks.GenericStack; import appeng.api.storage.MEStorage; import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet; import org.jetbrains.annotations.Nullable; import java.util.Comparator; import java.util.PriorityQueue; +import java.util.Set; import java.util.function.Predicate; import javax.annotation.ParametersAreNonnullByDefault; @@ -273,4 +275,14 @@ public boolean isAutoPull() { @Override public void setAutoPullTest(final Predicate autoPullTest) {} + + @Override + public boolean isUpdateRequested(IStorageService service) { + return true; + } + + @Override + public Set getListener() { + return new ReferenceOpenHashSet<>(); + } } diff --git a/src/main/java/com/gtocore/common/machine/multiblock/part/ae/MEWildcardPatternBufferPartMachine.java b/src/main/java/com/gtocore/common/machine/multiblock/part/ae/MEWildcardPatternBufferPartMachine.java index b1e43f626..9b0253146 100644 --- a/src/main/java/com/gtocore/common/machine/multiblock/part/ae/MEWildcardPatternBufferPartMachine.java +++ b/src/main/java/com/gtocore/common/machine/multiblock/part/ae/MEWildcardPatternBufferPartMachine.java @@ -307,7 +307,7 @@ private void rebuildCacheIfNeeded(List patterns) { }); cachedPatterns = newPatterns; scannedPatterns = cachedPatterns.size(); - if (GTOConfig.INSTANCE.aeLog) { + if (GTOConfig.INSTANCE.devMode.aeLog) { GTOCore.LOGGER.info("MEWildcardPatternBufferPartMachine recalculated patterns: {} patterns in {} ms", scannedPatterns, (System.nanoTime() - nanos) / 1_000_000.0); GTOCore.LOGGER.info(" substituting ingredients took {} ms ({})%", @@ -352,8 +352,8 @@ private AEProcessingPattern validatePattern(GenericStack[] sparseInput, GenericS ObjectHolder valid = new ObjectHolder<>(null); var inputHolder = virtual(sparseInput); if (recipeType == GTORecipeTypes.HATCH_COMBINED) { - if (!getRecipeTypes().isEmpty()) { - for (var rt : getRecipeTypes()) { + if (!gto$getRecipeTypes().isEmpty()) { + for (var rt : gto$getRecipeTypes()) { if (rt.findRecipe(inputHolder, r -> { if (checkProb(r)) { valid.value = (Recipe) r; diff --git a/src/main/java/com/gtocore/common/machine/multiblock/part/ae/widget/AmountSetWidget.java b/src/main/java/com/gtocore/common/machine/multiblock/part/ae/widget/AmountSetWidget.java index f0a3367ec..6461d83ff 100644 --- a/src/main/java/com/gtocore/common/machine/multiblock/part/ae/widget/AmountSetWidget.java +++ b/src/main/java/com/gtocore/common/machine/multiblock/part/ae/widget/AmountSetWidget.java @@ -1,11 +1,14 @@ package com.gtocore.common.machine.multiblock.part.ae.widget; +import com.gtocore.utils.AdvMathExpParser; + import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.integration.ae2.slot.IConfigurableSlot; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.resources.language.I18n; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -25,10 +28,16 @@ class AmountSetWidget extends Widget { private final TextFieldWidget amountText; private final ConfigWidget parentWidget; + private static final Integer COLOR_DEFAULT = 0xFFFFFFFF; + private static final Integer COLOR_ERROR = 0xFFDF0000; + AmountSetWidget(int x, int y, ConfigWidget widget) { super(x, y, 80, 30); this.parentWidget = widget; - this.amountText = new TextFieldWidget(x + 8, y + 12, 60, 13, this::getAmountStr, this::setNewAmount).setNumbersOnly(0, Long.MAX_VALUE); + this.amountText = (TextFieldWidget) new TextFieldWidget(x + 8, y + 12, 60, 13, this::getAmountStr, this::setNewAmount) + .setValidator(this::amountTextValidator) + .setMaxStringLength(24) // Long.MAX_VALUE 19 digits + .appendHoverTooltips(Component.translatable("gtocore.gui.widget.amount_set.hover_tooltip")); } @OnlyIn(Dist.CLIENT) @@ -47,14 +56,19 @@ private String getAmountStr() { } IConfigurableSlot slot = this.parentWidget.getConfig(this.index); if (slot.getConfig() != null) { - return String.valueOf(slot.getConfig().amount()); + if (this.amountText.getCurrentString().isEmpty() || this.amountText.getCurrentString().equals("0")) { + return String.valueOf(slot.getConfig().amount()); + } + return this.amountText.getCurrentString(); } return "0"; } + // We have two parses here, but it's acceptable for better UX. <= 1μs + // Otherwise, we cannot support complex expressions as it updates char by char. private void setNewAmount(String amount) { try { - long newAmount = Long.parseLong(amount); + long newAmount = AdvMathExpParser.parse(amount).longValue(); if (this.index < 0) { return; } @@ -62,7 +76,20 @@ private void setNewAmount(String amount) { if (newAmount > 0 && slot.getConfig() != null) { slot.setConfig(new GenericStack(slot.getConfig().what(), newAmount)); } - } catch (NumberFormatException ignore) {} + } catch (IllegalArgumentException | ArithmeticException ignore) {} + } + + private String amountTextValidator(String text) { + try { + long value = AdvMathExpParser.parse(text).longValue(); + if (value < 0) { + throw new IllegalArgumentException("Amount cannot be negative"); + } + this.amountText.setTextColor(COLOR_DEFAULT); + } catch (IllegalArgumentException | ArithmeticException e) { + this.amountText.setTextColor(COLOR_ERROR); + } + return text; } @Override diff --git a/src/main/java/com/gtocore/common/machine/multiblock/water/ClarifierPurificationUnitMachine.java b/src/main/java/com/gtocore/common/machine/multiblock/water/ClarifierPurificationUnitMachine.java index cdbcda36a..24a0c808b 100644 --- a/src/main/java/com/gtocore/common/machine/multiblock/water/ClarifierPurificationUnitMachine.java +++ b/src/main/java/com/gtocore/common/machine/multiblock/water/ClarifierPurificationUnitMachine.java @@ -36,7 +36,6 @@ @MethodsReturnNonnullByDefault public final class ClarifierPurificationUnitMachine extends WaterPurificationUnitMachine implements IFluidRendererMachine { - private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ClarifierPurificationUnitMachine.class); private static final Fluid AIR = GTMaterials.Air.getFluid(); @Persisted diff --git a/src/main/java/com/gtocore/common/machine/noenergy/PlatformDeployment/PlatformCreators.java b/src/main/java/com/gtocore/common/machine/noenergy/PlatformDeployment/PlatformCreators.java index 98127f7bf..7d7c6c2db 100644 --- a/src/main/java/com/gtocore/common/machine/noenergy/PlatformDeployment/PlatformCreators.java +++ b/src/main/java/com/gtocore/common/machine/noenergy/PlatformDeployment/PlatformCreators.java @@ -3,6 +3,8 @@ import com.gtolib.GTOCore; import com.gtolib.utils.RLUtils; +import com.gregtechceu.gtceu.utils.GTUtil; + import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.registries.BuiltInRegistries; @@ -36,9 +38,6 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.Executors; -import java.util.concurrent.ThreadFactory; class PlatformCreators { @@ -47,9 +46,6 @@ class PlatformCreators { private static final long PROGRESS_THRESHOLD = 10_000_000L; private static volatile boolean isExporting = false; - private static final ThreadFactory VIRTUAL_THREAD_FACTORY = Thread.ofVirtual().name("structure-export-", 0).factory(); - private static final java.util.concurrent.ExecutorService EXPORT_EXECUTOR = Executors.newThreadPerTaskExecutor(VIRTUAL_THREAD_FACTORY); - static { for (char c : new char[] { '.', '(', ')', ',', '/', '\\', '"', '\'', '`' }) { ILLEGAL_CHARS.add(c); @@ -74,7 +70,7 @@ static void PlatformCreationAsync(ServerLevel level, BlockPos startPos, BlockPos boolean xMirror, boolean zMirror, int rotation) { if (isExporting) return; isExporting = true; - CompletableFuture.runAsync(() -> { + GTUtil.ASYNC_EXECUTOR.execute(() -> { try { exportStructure(level, startPos, endPos, xMirror, zMirror, rotation); } catch (Exception e) { @@ -82,7 +78,7 @@ static void PlatformCreationAsync(ServerLevel level, BlockPos startPos, BlockPos } finally { isExporting = false; } - }, EXPORT_EXECUTOR); + }); } /** diff --git a/src/main/java/com/gtocore/common/machine/noenergy/TravelAnchorMachine.java b/src/main/java/com/gtocore/common/machine/noenergy/TravelAnchorMachine.java index 0dc74da46..3f198338f 100644 --- a/src/main/java/com/gtocore/common/machine/noenergy/TravelAnchorMachine.java +++ b/src/main/java/com/gtocore/common/machine/noenergy/TravelAnchorMachine.java @@ -1,9 +1,10 @@ package com.gtocore.common.machine.noenergy; import com.gtocore.api.gui.GTOGuiTextures; -import com.gtocore.eio_travel.ITravelTarget; -import com.gtocore.eio_travel.api.TravelSavedData; +import com.gtocore.eio_travel.api.ITravelTarget; import com.gtocore.eio_travel.implementations.AnchorTravelTarget; +import com.gtocore.eio_travel.logic.TravelSavedData; +import com.gtocore.eio_travel.logic.TravelUtils; import com.gtolib.utils.holder.ObjectHolder; @@ -82,6 +83,7 @@ public String getName() { public void setName(String name) { getOrCreateTravelTarget().setName(name); + requestTravelResync(); } public Item getIcon() { @@ -90,6 +92,7 @@ public Item getIcon() { public void setIcon(Item icon) { getOrCreateTravelTarget().setIcon(icon); + requestTravelResync(); } public boolean getVisibility() { @@ -98,6 +101,7 @@ public boolean getVisibility() { public void setVisibility(boolean visible) { getOrCreateTravelTarget().setVisibility(visible); + requestTravelResync(); } private AnchorTravelTarget getOrCreateTravelTarget() { @@ -137,4 +141,11 @@ private ToggleButtonWidget createToggleButton() { private Component getConfigureLevelsOrPointsTooltip(boolean pressed) { return Component.translatable("emi.header." + (pressed ? "visible" : "invisible")); } + + private void requestTravelResync() { + if (getLevel() == null || getLevel().isClientSide) { + return; + } + TravelUtils.requireResync(getLevel()); + } } diff --git a/src/main/java/com/gtocore/common/machine/tesseract/AdvancedTesseractMachine.java b/src/main/java/com/gtocore/common/machine/tesseract/AdvancedTesseractMachine.java index 4e78d3aee..1780cd021 100644 --- a/src/main/java/com/gtocore/common/machine/tesseract/AdvancedTesseractMachine.java +++ b/src/main/java/com/gtocore/common/machine/tesseract/AdvancedTesseractMachine.java @@ -177,8 +177,6 @@ public int getTotalBlockEntities() { if (be != null) { blockEntityReference[i] = new WeakReference<>(be); return be; - } else { - poss.set(i, null); } } else { var blockEntity = reference.get(); @@ -187,8 +185,6 @@ public int getTotalBlockEntities() { if (blockEntity != null) { blockEntityReference[i] = new WeakReference<>(blockEntity); return blockEntity; - } else { - poss.set(i, null); } } else { return blockEntity; diff --git a/src/main/java/com/gtocore/common/machine/tesseract/TesseractMachine.java b/src/main/java/com/gtocore/common/machine/tesseract/TesseractMachine.java index f4dc13879..821cc3ae2 100644 --- a/src/main/java/com/gtocore/common/machine/tesseract/TesseractMachine.java +++ b/src/main/java/com/gtocore/common/machine/tesseract/TesseractMachine.java @@ -104,8 +104,6 @@ public LazyOptional getCapability(@NotNull Capability cap, @Nullable D if (be != null) { blockEntityReference = new WeakReference<>(be); result = be.getCapability(cap, side); - } else { - pos = null; } } else { var blockEntity = blockEntityReference.get(); @@ -114,8 +112,6 @@ public LazyOptional getCapability(@NotNull Capability cap, @Nullable D if (blockEntity != null) { blockEntityReference = new WeakReference<>(blockEntity); result = blockEntity.getCapability(cap, side); - } else { - pos = null; } } else { result = blockEntity.getCapability(cap, side); diff --git a/src/main/java/com/gtocore/common/saved/WirelessSavedData.kt b/src/main/java/com/gtocore/common/saved/WirelessSavedData.kt index 68f62c622..2e70df241 100644 --- a/src/main/java/com/gtocore/common/saved/WirelessSavedData.kt +++ b/src/main/java/com/gtocore/common/saved/WirelessSavedData.kt @@ -157,7 +157,7 @@ class WirelessSavedData : SavedData() { p0.put( "WirelessSavedData", ListTag().apply { - if (GTOConfig.INSTANCE.aeLog) println("${GTCEu.isClientSide()} Saving WirelessSavedData with ${gridPool.size} grids") + if (GTOConfig.INSTANCE.devMode.aeLog) println("${GTCEu.isClientSide()} Saving WirelessSavedData with ${gridPool.size} grids") for (grid in gridPool) { add(grid.encodeToNbt()) } @@ -166,7 +166,7 @@ class WirelessSavedData : SavedData() { p0.put( "defaultMap", ListTag().apply { - if (GTOConfig.INSTANCE.aeLog) println("${GTCEu.isClientSide()} Saving defaultMap with ${defaultMap.size} entries") + if (GTOConfig.INSTANCE.devMode.aeLog) println("${GTCEu.isClientSide()} Saving defaultMap with ${defaultMap.size} entries") for ((key, value) in defaultMap) { add( CompoundTag().apply { @@ -188,7 +188,7 @@ class WirelessSavedData : SavedData() { for (tag in list) { res.add(WirelessGrid.decodeFromNbt(tag as CompoundTag).takeIf { n -> res.none { it.name == n.name } } ?: continue) } - if (GTOConfig.INSTANCE.aeLog) println("${GTCEu.isClientSide()} Loading WirelessSavedData with ${res.size} grids") + if (GTOConfig.INSTANCE.devMode.aeLog) println("${GTCEu.isClientSide()} Loading WirelessSavedData with ${res.size} grids") gridPool.addAll(res) val defaultList = p0.getList("defaultMap", 10) for (tag in defaultList) { diff --git a/src/main/java/com/gtocore/config/GTOConfig.java b/src/main/java/com/gtocore/config/GTOConfig.java index b01c20b5c..8b1553bf9 100644 --- a/src/main/java/com/gtocore/config/GTOConfig.java +++ b/src/main/java/com/gtocore/config/GTOConfig.java @@ -32,16 +32,36 @@ public final class GTOConfig { private static final String SCREEN = "config.screen.gtocore"; public final static GTOConfig INSTANCE; + @Configurable + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Game Play", cn = "游戏玩法") + public GamePlay gamePlay = new GamePlay(); + + @Configurable + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Client", cn = "客户端") + public Client client = new Client(); + + @Configurable + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Misc", cn = "杂项") + public Misc misc = new Misc(); + + @Configurable + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Travel Settings", cn = "旅行手杖/旅行锚设置") + public TravelConfig travelConfig = new TravelConfig(); + + @Configurable + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Dev Mode", cn = "开发模式") + public DevMode devMode = new DevMode(); + static { CommonProxy.earlyStartup(); ConfigHolder.init(); INSTANCE = Configuration.registerConfig(GTOConfig.class, ConfigFormats.YAML).getConfigInstance(); - if (INSTANCE.startSpark == SparkRange.ALL || INSTANCE.startSpark == SparkRange.MAIN_MENU) { + if (INSTANCE.devMode.startSpark == SparkRange.ALL || INSTANCE.devMode.startSpark == SparkRange.MAIN_MENU) { SparkLaunchProfiler.start("all"); } - if (INSTANCE.dev) Configurator.setRootLevel(Level.INFO); - if (INSTANCE.detailedLogging) Configurator.setRootLevel(Level.DEBUG); - int difficulty = INSTANCE.difficulty.ordinal() + 1; + if (INSTANCE.devMode.dev) Configurator.setRootLevel(Level.INFO); + if (INSTANCE.devMode.detailedLogging) Configurator.setRootLevel(Level.DEBUG); + int difficulty = INSTANCE.gamePlay.difficulty.ordinal() + 1; ConfigHolder.INSTANCE.recipes.generateLowQualityGems = false; ConfigHolder.INSTANCE.recipes.disableManualCompression = difficulty > 1; ConfigHolder.INSTANCE.recipes.harderRods = difficulty == 3; @@ -141,189 +161,239 @@ public final class GTOConfig { if (GTOCore.isEasy()) { ConfigHolder.INSTANCE.gameplay.hazardsEnabled = false; } - ConfigHolder.INSTANCE.dev.debug = INSTANCE.dev; + ConfigHolder.INSTANCE.dev.debug = INSTANCE.devMode.dev; - MultiblockControllerMachine.sendMessage = INSTANCE.sendMultiblockErrorMessages; + MultiblockControllerMachine.sendMessage = INSTANCE.misc.sendMultiblockErrorMessages; } - // 游戏核心设置 - @Configurable - @Configurable.Comment({ "游戏难度等级", "Game difficulty level" }) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Game Difficulty", cn = "游戏难度") - public Difficulty difficulty = Difficulty.Normal; - - @Configurable - @Configurable.Comment({ "启用自我约束模式以限制任何形式的作弊指令使用(警告:一旦开启,游玩的存档将永久锁定自我约束模式!)", "Enable Self Restraint Mode to restrict the use of any form of cheat commands (Warning: Once enabled, the played save will be permanently locked in Self Restraint Mode!)" }) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Self Restraint Mode", cn = "自我约束模式") - public boolean selfRestraint = false; - - @Configurable - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "disable Muffler Part", cn = "禁用消声仓") - @Configurable.Comment({ "禁用后失去掏灰玩法(在非专家模式生效)", "Removing this disables Ash-Scooping gameplay (only applies in non-Expert mode)" }) - public boolean disableMufflerPart = false; + public static void set(String fieldName, T value) { + getConfig(GTOCore.MOD_ID).ifPresent(config -> { + ((ConfigValue) (config.getValueMap().get(fieldName))).setValue(value); + ConfigIO.saveClientValues(config); + ConfigIO.reloadClientValues(config); + }); + } - @Configurable - @Configurable.Range(min = 36, max = 216) - @Configurable.Comment({ "扩展样板供应器容量", "专家模式下,此选项无效", - "Extended Pattern Provider Size", "In Expert mode, this option is invalid" }) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Extended Pattern Provider Size", cn = "扩展样板供应器容量") - @Configurable.Gui.Slider - public int exPatternSize = 36; + public static void set(String fieldName, T value, String... objectPath) { + if (objectPath.length == 0) { + set(fieldName, value); + return; + } + getConfig(GTOCore.MOD_ID).ifPresent(config -> { + ObjectValue valueMap0 = (ObjectValue) config.getValueMap().get(objectPath[0]); + if (objectPath.length == 1) { + ((ConfigValue) (valueMap0.getChildById(fieldName))).setValue(value); + } else { + for (int i = 1; i < objectPath.length; i++) { + valueMap0 = (ObjectValue) valueMap0.getChildById(objectPath[i]); + } + ((ConfigValue) (valueMap0.getChildById(fieldName))).setValue(value); + } + ConfigIO.saveClientValues(config); + ConfigIO.reloadClientValues(config); + }); + } - @Configurable - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Default Value for Rename Pattern", cn = "重命名样板的默认值") - @Configurable.Comment({ "在装配线模式编码带有重命名物品的样板时使用的默认名字", "The default name used when encoding patterns with renamed items in assembly line mode" }) - public String renamePatternDefaultString = ""; + @DataGeneratorScanned + public static class GamePlay { - @Configurable - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Allow Missing Crafting Jobs", cn = "允许下单缺少材料的合成任务") - @Configurable.Comment({ "允许在 AE2 中下单缺少原料的任务", "缺少的原料将以“正在合成”的状态被等待接收", "Allow placing orders for tasks that are missing ingredients in AE2", "Missing ingredients will be in a 'crafting' state waiting to be received" }) - public boolean allowMissingCraftingJobs = true; + @Configurable + @Configurable.Comment({ "游戏难度等级", "Game difficulty level" }) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Game Difficulty", cn = "游戏难度") + public Difficulty difficulty = Difficulty.Normal; - @Configurable - @Configurable.Comment({ "启用后,且未开启 EMI 作弊时,EMI 的作弊交互功能将转为试图从现有的ME终端/无线终端中提取物品", "When enabled, and EMI cheats are not enabled, EMI's cheat interaction feature will attempt to extract items from existing ME Terminals/Wireless Terminals" }) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Non-Cheat EMI Interaction", cn = "非作弊时EMI交互") - public boolean nonCheatEmiInteraction = true; + @Configurable + @Configurable.Comment({ "启用自我约束模式以限制任何形式的作弊指令使用(警告:一旦开启,游玩的存档将永久锁定自我约束模式!)", "Enable Self Restraint Mode to restrict the use of any form of cheat commands (Warning: Once enabled, the played save will be permanently locked in Self Restraint Mode!)" }) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Self Restraint Mode", cn = "自我约束模式") + public boolean selfRestraint = false; - @Configurable - @Configurable.Comment({ "启用后,且未开启 EMI 作弊时,在 EMI 界面中悬停物品时,将显示 AE 系统中该物品的数量信息", "When enabled, and EMI cheats are not enabled, hovering over an item in the EMI interface will show the quantity information of that item in the AE system" }) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Show AE Amount Tooltip Everywhere in EMI", cn = "在EMI显示 AE 数量提示") - public boolean showAEAmountTooltipEverywhereEmi = true; + @Configurable + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "disable Muffler Part", cn = "禁用消声仓") + @Configurable.Comment({ "禁用后失去掏灰玩法(在非专家模式生效)", "Removing this disables Ash-Scooping gameplay (only applies in non-Expert mode)" }) + public boolean disableMufflerPart = false; - // 性能优化设置 - @Configurable - @Configurable.Comment({ "快速加载多方块结构页面,减少不必要的加载时间", "Fast loading of multiblock structure pages to reduce unnecessary loading time" }) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Fast Multiblock Page Loading", cn = "快速多方块页面加载") - public boolean fastMultiBlockPage = true; + @Configurable + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Default Value for Rename Pattern", cn = "重命名样板的默认值") + @Configurable.Comment({ "在装配线模式编码带有重命名物品的样板时使用的默认名字", "The default name used when encoding patterns with renamed items in assembly line mode" }) + public String renamePatternDefaultString = ""; - @Configurable - @Configurable.Comment({ "批处理模式的最大持续时间(tick)", "Maximum duration of batch processing mode (ticks)" }) - @Configurable.Range(min = 600, max = 144000) - @Configurable.Gui.Slider - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Batch Processing Max Duration", cn = "批处理模式最大持续时间") - public int batchProcessingMaxDuration = 1200; + @Configurable + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Allow Missing Crafting Jobs", cn = "允许下单缺少材料的合成任务") + @Configurable.Comment({ "允许在 AE2 中下单缺少原料的任务", "缺少的原料将以“正在合成”的状态被等待接收", "Allow placing orders for tasks that are missing ingredients in AE2", "Missing ingredients will be in a 'crafting' state waiting to be received" }) + public boolean allowMissingCraftingJobs = true; - // 挖掘系统设置 - @Configurable - @Configurable.Comment({ "连锁挖掘(不连续模式)时,检查相邻方块的范围", "The range to check adjacent blocks during chain mining (non-continuous mode)" }) - @Configurable.Range(min = 1, max = 20) - @Configurable.Gui.Slider - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Chain Mining Range", cn = "连锁挖掘检查范围") - public int ftbUltimineRange = 3; + @Configurable + @Configurable.Comment({ "启用后,且未开启 EMI 作弊时,EMI 的作弊交互功能将转为试图从现有的ME终端/无线终端中提取物品", "When enabled, and EMI cheats are not enabled, EMI's cheat interaction feature will attempt to extract items from existing ME Terminals/Wireless Terminals" }) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Non-Cheat EMI Interaction", cn = "非作弊时EMI交互") + public boolean nonCheatEmiInteraction = true; - @Configurable - @Configurable.Comment({ "连锁挖掘功能的方块黑名单", "Block blacklist for chain mining feature" }) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Chain Mining Blacklist", cn = "连锁挖掘黑名单") - public String[] breakBlocksBlackList = { "ae2:cable_bus" }; + @Configurable + @Configurable.Comment({ "启用后,且未开启 EMI 作弊时,在 EMI 界面中悬停物品时,将显示 AE 系统中该物品的数量信息", "When enabled, and EMI cheats are not enabled, hovering over an item in the EMI interface will show the quantity information of that item in the AE system" }) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Show AE Amount Tooltip Everywhere in EMI", cn = "在EMI显示 AE 数量提示") + public boolean showAEAmountTooltipEverywhereEmi = true; - // 界面和显示设置 - @Configurable - @Configurable.Comment({ "禁用后,不同存档的 EMI 收藏夹将相互独立", "After disabling, EMI favorites from different saves will be independent of each other" }) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "EMI Global Favorites", cn = "EMI 全局收藏夹") - public boolean emiGlobalFavorites = true; + @Configurable + @Configurable.Comment({ "批处理模式的最大持续时间(tick)", "Maximum duration of batch processing mode (ticks)" }) + @Configurable.Range(min = 600, max = 144000) + @Configurable.Gui.Slider + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Batch Processing Max Duration", cn = "批处理模式最大持续时间") + public int batchProcessingMaxDuration = 1200; - @Configurable - @Configurable.Comment({ "禁用爆弹物品的使用", - "警告:爆弹会造成极大范围的破坏!如果你不想爆弹破坏重要的东西,请确保提前备份存档。", - "Disable the use of Charge Bomb items", - "Warning: Charge Bombs can cause massive destruction! If you don't want Charge Bombs to destroy important things, make sure to back up your save in advance." }) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Disable Charge Bomb", cn = "禁用爆弹") - public boolean disableChargeBomb = false; + @Configurable + @Configurable.Comment({ "连锁挖掘(不连续模式)时,检查相邻方块的范围", "The range to check adjacent blocks during chain mining (non-continuous mode)" }) + @Configurable.Range(min = 1, max = 20) + @Configurable.Gui.Slider + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Chain Mining Range", cn = "连锁挖掘检查范围") + public int ftbUltimineRange = 3; - @Configurable - @Configurable.Comment({ "在物品下方显示英文名称", - "同时允许在ME终端中使用英文名称搜索物品", - "Show the English name below the item", - "Also allows searching for items by English name in ME Terminals" - }) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Show Item English Name", cn = "显示物品英文名称") - public boolean showEnglishName = false; + @Configurable + @Configurable.Range(min = 36, max = 216) + @Configurable.Comment({ "扩展样板供应器容量", "仅用于性能测试", + "Extended Pattern Provider Size", "Only for performance testing" }) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Extended Pattern Provider Size", cn = "扩展样板供应器容量") + @Configurable.Gui.Slider + public int exPatternSize = 36; - @Configurable - @Configurable.Comment({ "调整监控器的最大成型尺寸", "Adjust the maximum formed size of the monitor" }) - @Configurable.Range(min = 4, max = 64) - @Configurable.Gui.Slider - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Maximum Monitor Size", cn = "监控器最大尺寸") - public int maxMonitorSize = 16; + @Configurable + @Configurable.Comment({ "连锁挖掘功能的方块黑名单", "Block blacklist for chain mining feature" }) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Chain Mining Blacklist", cn = "连锁挖掘黑名单") + public String[] breakBlocksBlackList = { "ae2:cable_bus" }; - @Configurable - @Configurable.Comment({ "引雷针在工作时是否生成闪电特效", "Whether the lightning rod generates lightning effects when working" }) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Lightning Rod Effect", cn = "引雷针特效") - public boolean lightningRodEffect = true; + @Configurable + @Configurable.Comment({ "禁用爆弹物品的使用", + "警告:爆弹会造成极大范围的破坏!如果你不想爆弹破坏重要的东西,请确保提前备份存档。", + "Disable the use of Charge Bomb items", + "Warning: Charge Bombs can cause massive destruction! If you don't want Charge Bombs to destroy important things, make sure to back up your save in advance." }) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Disable Charge Bomb", cn = "禁用爆弹") + public boolean disableChargeBomb = false; - @Configurable - @Configurable.Comment({ "启用内置夜视。该效果也可在游戏内按绑定热键切换", "Enable built-in night vision. This effect can also be toggled in-game by pressing the bound hotkey" - }) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Built-in Night Vision", cn = "内置夜视") - public boolean nightVision = false; + @Configurable + @Configurable.Comment({ "调整监控器的最大成型尺寸", "Adjust the maximum formed size of the monitor" }) + @Configurable.Range(min = 4, max = 64) + @Configurable.Gui.Slider + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Maximum Monitor Size", cn = "监控器最大尺寸") + public int maxMonitorSize = 16; - @Configurable - @Configurable.Comment({ "禁用后将渲染视角外,且渲染器被标记为Global的机器,一些高级特效机器需要开启此选项才能正常渲染", "When turned disable, machines that are outside the field of view and whose renderer is marked as Global will be rendered. Some advanced effect machines need to turn on this option to render properly" }) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Disable Embeddium Global BE Culling", cn = "禁用Embbedium Global方块实体剔除") - public boolean disableEmbeddiumBECulling = true; + @Configurable + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Mob Settings", cn = "生物设置") + public GamePlay.MobConfig mobConfig = new GamePlay.MobConfig(); + + @DataGeneratorScanned + public static class MobConfig { + + @Configurable + @Configurable.Comment({ "当玩家在某动物附近食用其来源食物时,影响的半径(格)", "The radius (blocks) affected when a player consumes food derived from an animal near that animal" }) + @Configurable.Range(min = 1, max = 64) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Carnivory Punish Radius", cn = "食肉惩罚半径") + @Configurable.Gui.Slider + public int cannibalismRadius = 32; + + @Configurable + @Configurable.Comment({ "当玩家在某动物附近食用其来源食物时,对该动物造成的伤害值(半颗心=1.0)", "The amount of damage dealt to the animal when a player consumes food derived from that animal nearby (Half Heart = 1.0)" }) + @Configurable.Range(min = 0, max = 100) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Carnivory Punish Damage", cn = "食肉惩罚伤害") + public float cannibalismDamage = 1.0F; + + @Configurable + @Configurable.Comment({ "启用后,所有生物将能够自然回血", "When enabled, all mobs will naturally regenerate health" }) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Mob Natural Regeneration", cn = "生物自然回血") + public boolean naturalRegeneration = true; + } + } - @Configurable - @Configurable.Comment({ "启用后,进入游戏时,若多方块结构未能成型,则将错误信息将发送给机器的所有者", "When enabled, if the multiblock structure fails to form when entering the game, the error message will be sent to the owner of the machine" }) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Send Multiblock Error Messages", cn = "发送多方块错误信息") - public boolean sendMultiblockErrorMessages = true; + @DataGeneratorScanned + public static class Client { - @Configurable - @Configurable.Comment({ "一些机器内容会以服务器语言的翻译呈现", "Some machine contents will be presented in the server language translation" }) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Server language", cn = "服务器语言") - public String serverLang = "en_us"; + @Configurable + @Configurable.Comment({ "引雷针在工作时是否生成闪电特效", "Whether the lightning rod generates lightning effects when working" }) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Lightning Rod Effect", cn = "引雷针特效") + public boolean lightningRodEffect = true; - // 开发和调试设置 - @Configurable - @Configurable.UpdateRestriction(UpdateRestrictions.GAME_RESTART) - @Configurable.Comment({ "启用自定义配方", - "自定义配方详情与教程参见https://gtodyssey.com/zh-hans/%E6%95%B4%E5%90%88%E5%8C%85%E6%95%99%E5%AD%A6/%E5%AE%98%E6%96%B9%E6%96%87%E6%A1%A3/%E5%A6%82%E4%BD%95%E4%BF%AE%E6%94%B9gto%E9%85%8D%E6%96%B9/", - "注意:启用此选项后,若加载错误的配方脚本,可能会导致进入游戏后配方丢失,请务必在非常规游玩存档中测试配方脚本的正确性。", - "注意:在服务器上游玩时,服务器和客户端均需启用此选项且使用相同的配方脚本文件。", - "Enable custom recipes", - "For details and tutorials on custom recipes, please refer to https://gtodyssey.com/zh-hans/%E6%95%B4%E5%90%88%E5%8C%85%E6%95%99%E5%AD%A6/%E5%AE%98%E6%96%B9%E6%96%87%E6%A1%A3/%E5%A6%82%E4%BD%95%E4%BF%AE%E6%94%B9gto%E9%85%8D%E6%96%B9/", - "Note: After enabling this option, if an incorrect recipe script is loaded, it may cause recipes to be lost after entering the game. Please be sure to test the correctness of the recipe script in a non-conventional play save.", - "Note: When playing on a server, both the server and client need to enable this option and use the same recipe script file." }) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Enable Custom Recipes", cn = "启用自定义配方") - public boolean enableCustomRecipes = false; + @Configurable + @Configurable.Comment({ "启用内置夜视。该效果也可在游戏内按绑定热键切换", "Enable built-in night vision. This effect can also be toggled in-game by pressing the bound hotkey" + }) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Built-in Night Vision", cn = "内置夜视") + public boolean nightVision = false; - @Configurable - @Configurable.Comment({ "开启开发者模式", "Enable Developer Mode" }) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Developer Mode", cn = "开发者模式") - public boolean dev = false; + @Configurable + @Configurable.Comment({ "禁用后将渲染视角外,且渲染器被标记为Global的机器,一些高级特效机器需要开启此选项才能正常渲染", "When turned disable, machines that are outside the field of view and whose renderer is marked as Global will be rendered. Some advanced effect machines need to turn on this option to render properly" }) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Disable Embeddium Global BE Culling", cn = "禁用Embbedium Global方块实体剔除") + public boolean disableEmbeddiumBECulling = true; - @Configurable - @Configurable.Comment({ "启用后将显示详细的启动日志输出,包含所有 DEBUG 级别的日志(增加日志文件大小但便于调试)", "When enabled, shows detailed startup log output including all DEBUG level logs (increases log file size but useful for debugging)" }) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "[Debug] Detailed Logging", cn = "[调试] 详细日志输出") - public boolean detailedLogging = false; + @Configurable + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "HUD Settings", cn = "HUD 设置") + public HUDConfig hud = new HUDConfig(); + + @DataGeneratorScanned + public static class HUDConfig { + + @Configurable + @Configurable.Comment({ "启用无线能量 HUD 显示", "Enable Wireless Energy HUD display" }) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Wireless Energy HUD Enabled", cn = "无线能量 HUD 启用") + public boolean wirelessEnergyHUDEnabled = false; + + @Configurable + @Configurable.Comment({ "无线能量 HUD 的默认 X 相对位置", "0意味着屏幕左侧,100意味着屏幕右侧", "The default X relative position of the Wireless Energy HUD", "0.0 means the left side of the screen, 1.0 means the right side of the screen" }) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Wireless Energy HUD Default X", cn = "无线能量 HUD 默认 X 位置") + @Configurable.Range(min = 0, max = 100) + @Configurable.Gui.Slider + public int wirelessEnergyHUDDefaultX = 5; + + @Configurable + @Configurable.Comment({ "无线能量 HUD 的默认 Y 相对位置", "0意味着屏幕顶部,100意味着屏幕底部", "The default Y relative position of the Wireless Energy HUD", "0.0 means the top of the screen, 1.0 means the bottom of the screen" }) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Wireless Energy HUD Default Y", cn = "无线能量 HUD 默认 Y 位置") + @Configurable.Range(min = 0, max = 100) + @Configurable.Gui.Slider + public int wirelessEnergyHUDDefaultY = 75; + + @Configurable + @Configurable.Comment({ "无线能量 HUD 显示的历史秒数", "例如:设为30则显示过去30秒的能量变化情况", "The number of historical seconds displayed by the Wireless Energy HUD", "For example: setting it to 30 will show the energy changes over the past 30 seconds" }) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Wireless Energy HUD History Seconds", cn = "无线能量 HUD 历史秒数") + @Configurable.Range(min = 5, max = 300) + @Configurable.Gui.Slider + public int wirelessEnergyHUDHistorySeconds = 30; + + @Configurable + @Configurable.Comment({ "无线能量 HUD 折线颜色", "Wireless Energy HUD line color" }) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Wireless Energy HUD Line Color", cn = "无线能量 HUD 折线颜色") + @Configurable.StringPattern("#[0-9a-fA-F]{1,6}") + @Configurable.Gui.ColorValue + public String wirelessEnergyHUDLineColor = "#ECEC71"; + } + } - @Configurable - @Configurable.Comment({ "检查配方之间的冲突问题", "Check for conflicts between recipes" }) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "[Debug] Recipe Conflict Check", cn = "[调试] 配方冲突检查") - public boolean recipeCheck = false; + @DataGeneratorScanned + public static class Misc { - @Configurable - @Configurable.Comment({ "启用 AE2 和同步组件的详细日志", "Enable detailed logging for AE2 and sync components" }) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "[Debug] AE2 & Sync Logging", cn = "[调试] AE2 和同步日志") - public boolean aeLog = false; + @Configurable + @Configurable.Comment({ "快速加载多方块结构页面,减少不必要的加载时间", "Fast loading of multiblock structure pages to reduce unnecessary loading time" }) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Fast Multiblock Page Loading", cn = "快速多方块页面加载") + public boolean fastMultiBlockPage = true; - @Configurable - @Configurable.Comment({ "启用 AE2 无线网络调试日志", "Enable AE2 wireless network debug logging" }) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "[Debug] AE2 & Sync Logging", cn = "[调试] AE2 无线网络调试日志") - public boolean aeWirelessLog = false; + @Configurable + @Configurable.Comment({ "启用后,游戏启动时将缓存部分资源以提升性能", + "如果你是资源包制作者,需要频繁热重载资源包,请关闭此选项以避免缓存影响资源包预览效果", + "When enabled, some resources will be cached at game startup to improve performance", + "If you are a resource pack creator and need to frequently hot-reload resource packs, please disable this option to avoid caching affecting the preview effect of the resource pack" + }) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Cache Resources on Startup", cn = "启动时缓存资源") + public boolean cacheResources = true; - @Configurable - @Configurable.Comment({ "AE2 无线网络使用的存储键,切换后将使用新的存储键重新生成网络(警告:切换后所有AE无线设备的设置将重置!)", "The storage key used by the AE2 wireless network. After switching, a new storage key will be used to regenerate the network (Warning: After switching, all AE wireless device settings will be reset!)" }) - @RegisterLanguage(namePrefix = "config.gtocore.option", cn = "AE2 网格存储键", en = "AE2 Grid Storage Key") - public String aeGridKey = "four"; + @Configurable + @Configurable.Comment({ "禁用后,不同存档的 EMI 收藏夹将相互独立", "After disabling, EMI favorites from different saves will be independent of each other" }) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "EMI Global Favorites", cn = "EMI 全局收藏夹") + public boolean emiGlobalFavorites = true; - @Configurable - @Configurable.Comment({ "Spark 性能分析器的启动阶段", "The startup phase of the Spark profiler" }) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Spark Profiler Start Phase", cn = "Spark 分析器启动阶段") - public SparkRange startSpark = SparkRange.NONE; + @Configurable + @Configurable.Comment({ "启用后,进入游戏时,若多方块结构未能成型,则将错误信息将发送给机器的所有者", "When enabled, if the multiblock structure fails to form when entering the game, the error message will be sent to the owner of the machine" }) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Send Multiblock Error Messages", cn = "发送多方块错误信息") + public boolean sendMultiblockErrorMessages = true; - @Configurable - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Travel Settings", cn = "旅行手杖/旅行锚设置") - public TravelConfig travelConfig = new TravelConfig(); + @Configurable + @Configurable.Comment({ "一些机器内容会以服务器语言的翻译呈现", "Some machine contents will be presented in the server language translation" }) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Server language", cn = "服务器语言") + public String serverLang = "en_us"; + } @DataGeneratorScanned public static class TravelConfig { @@ -362,98 +432,61 @@ public static class TravelConfig { public boolean staffOfTravellingPatternNodes = true; } - @Configurable - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Mob Settings", cn = "生物设置") - public MobConfig mobConfig = new MobConfig(); - @DataGeneratorScanned - public static class MobConfig { + public static class DevMode { @Configurable - @Configurable.Comment({ "当玩家在某动物附近食用其来源食物时,影响的半径(格)", "The radius (blocks) affected when a player consumes food derived from an animal near that animal" }) - @Configurable.Range(min = 1, max = 64) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Carnivory Punish Radius", cn = "食肉惩罚半径") - @Configurable.Gui.Slider - public int cannibalismRadius = 32; + @Configurable.Comment({ "开启开发者模式", "Enable Developer Mode" }) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Developer Mode", cn = "开发者模式") + public boolean dev = false; @Configurable - @Configurable.Comment({ "当玩家在某动物附近食用其来源食物时,对该动物造成的伤害值(半颗心=1.0)", "The amount of damage dealt to the animal when a player consumes food derived from that animal nearby (Half Heart = 1.0)" }) - @Configurable.Range(min = 0, max = 100) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Carnivory Punish Damage", cn = "食肉惩罚伤害") - public float cannibalismDamage = 1.0F; + @Configurable.UpdateRestriction(UpdateRestrictions.GAME_RESTART) + @Configurable.Comment({ "启用自定义配方", + "自定义配方详情与教程参见https://gtodyssey.com/zh-hans/%E6%95%B4%E5%90%88%E5%8C%85%E6%95%99%E5%AD%A6/%E5%AE%98%E6%96%B9%E6%96%87%E6%A1%A3/%E5%A6%82%E4%BD%95%E4%BF%AE%E6%94%B9gto%E9%85%8D%E6%96%B9/", + "注意:启用此选项后,若加载错误的配方脚本,可能会导致进入游戏后配方丢失,请务必在非常规游玩存档中测试配方脚本的正确性。", + "注意:在服务器上游玩时,服务器和客户端均需启用此选项且使用相同的配方脚本文件。", + "Enable custom recipes", + "For details and tutorials on custom recipes, please refer to https://gtodyssey.com/zh-hans/%E6%95%B4%E5%90%88%E5%8C%85%E6%95%99%E5%AD%A6/%E5%AE%98%E6%96%B9%E6%96%87%E6%A1%A3/%E5%A6%82%E4%BD%95%E4%BF%AE%E6%94%B9gto%E9%85%8D%E6%96%B9/", + "Note: After enabling this option, if an incorrect recipe script is loaded, it may cause recipes to be lost after entering the game. Please be sure to test the correctness of the recipe script in a non-conventional play save.", + "Note: When playing on a server, both the server and client need to enable this option and use the same recipe script file." }) + + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Enable Custom Recipes", cn = "启用自定义配方") + public boolean enableCustomRecipes = false; @Configurable - @Configurable.Comment({ "启用后,所有生物将能够自然回血", "When enabled, all mobs will naturally regenerate health" }) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Mob Natural Regeneration", cn = "生物自然回血") - public boolean naturalRegeneration = true; - } - - @Configurable - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "HUD Settings", cn = "HUD 设置") - public HUDConfig hud = new HUDConfig(); - - @DataGeneratorScanned - public static class HUDConfig { + @Configurable.Comment({ "检查配方之间的冲突问题", "Check for conflicts between recipes" }) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "[Debug] Recipe Conflict Check", cn = "[调试] 配方冲突检查") + public boolean recipeCheck = false; @Configurable - @Configurable.Comment({ "启用无线能量 HUD 显示", "Enable Wireless Energy HUD display" }) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Wireless Energy HUD Enabled", cn = "无线能量 HUD 启用") - public boolean wirelessEnergyHUDEnabled = false; + @Configurable.Comment({ "启用后,跳过加载研磨、电弧炉回收等配方以提升开发测试效率", "When enabled, recipes such as grinding and arc furnace recycling will not be loaded to improve development testing efficiency" }) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "[Debug] Disable Recycling Recipes", cn = "[调试] 禁用回收配方") + public boolean disableRecyclingRecipes = false; @Configurable - @Configurable.Comment({ "无线能量 HUD 的默认 X 相对位置", "0意味着屏幕左侧,100意味着屏幕右侧", "The default X relative position of the Wireless Energy HUD", "0.0 means the left side of the screen, 1.0 means the right side of the screen" }) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Wireless Energy HUD Default X", cn = "无线能量 HUD 默认 X 位置") - @Configurable.Range(min = 0, max = 100) - @Configurable.Gui.Slider - public int wirelessEnergyHUDDefaultX = 5; + @Configurable.Comment({ "启用后将显示详细的启动日志输出,包含所有 DEBUG 级别的日志(增加日志文件大小但便于调试)", "When enabled, shows detailed startup log output including all DEBUG level logs (increases log file size but useful for debugging)" }) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "[Debug] Detailed Logging", cn = "[调试] 详细日志输出") + public boolean detailedLogging = false; @Configurable - @Configurable.Comment({ "无线能量 HUD 的默认 Y 相对位置", "0意味着屏幕顶部,100意味着屏幕底部", "The default Y relative position of the Wireless Energy HUD", "0.0 means the top of the screen, 1.0 means the bottom of the screen" }) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Wireless Energy HUD Default Y", cn = "无线能量 HUD 默认 Y 位置") - @Configurable.Range(min = 0, max = 100) - @Configurable.Gui.Slider - public int wirelessEnergyHUDDefaultY = 75; + @Configurable.Comment({ "启用 AE2 和同步组件的详细日志", "Enable detailed logging for AE2 and sync components" }) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "[Debug] AE2 & Sync Logging", cn = "[调试] AE2 和同步日志") + public boolean aeLog = false; @Configurable - @Configurable.Comment({ "无线能量 HUD 显示的历史秒数", "例如:设为30则显示过去30秒的能量变化情况", "The number of historical seconds displayed by the Wireless Energy HUD", "For example: setting it to 30 will show the energy changes over the past 30 seconds" }) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Wireless Energy HUD History Seconds", cn = "无线能量 HUD 历史秒数") - @Configurable.Range(min = 5, max = 300) - @Configurable.Gui.Slider - public int wirelessEnergyHUDHistorySeconds = 30; + @Configurable.Comment({ "启用 AE2 无线网络调试日志", "Enable AE2 wireless network debug logging" }) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "[Debug] AE2 & Sync Logging", cn = "[调试] AE2 无线网络调试日志") + public boolean aeWirelessLog = false; @Configurable - @Configurable.Comment({ "无线能量 HUD 折线颜色", "Wireless Energy HUD line color" }) - @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Wireless Energy HUD Line Color", cn = "无线能量 HUD 折线颜色") - @Configurable.StringPattern("#[0-9a-fA-F]{1,6}") - @Configurable.Gui.ColorValue - public String wirelessEnergyHUDLineColor = "#ECEC71"; - } + @Configurable.Comment({ "AE2 无线网络使用的存储键,切换后将使用新的存储键重新生成网络(警告:切换后所有AE无线设备的设置将重置!)", "The storage key used by the AE2 wireless network. After switching, a new storage key will be used to regenerate the network (Warning: After switching, all AE wireless device settings will be reset!)" }) + @RegisterLanguage(namePrefix = "config.gtocore.option", cn = "AE2 网格存储键", en = "AE2 Grid Storage Key") + public String aeGridKey = "four"; - public static void set(String fieldName, T value) { - getConfig(GTOCore.MOD_ID).ifPresent(config -> { - ((ConfigValue) (config.getValueMap().get(fieldName))).setValue(value); - ConfigIO.saveClientValues(config); - ConfigIO.reloadClientValues(config); - }); - } - - public static void set(String fieldName, T value, String... objectPath) { - if (objectPath.length == 0) { - set(fieldName, value); - return; - } - getConfig(GTOCore.MOD_ID).ifPresent(config -> { - ObjectValue valueMap0 = (ObjectValue) config.getValueMap().get(objectPath[0]); - if (objectPath.length == 1) { - ((ConfigValue) (valueMap0.getChildById(fieldName))).setValue(value); - } else { - for (int i = 1; i < objectPath.length; i++) { - valueMap0 = (ObjectValue) valueMap0.getChildById(objectPath[i]); - } - ((ConfigValue) (valueMap0.getChildById(fieldName))).setValue(value); - } - ConfigIO.saveClientValues(config); - ConfigIO.reloadClientValues(config); - }); + @Configurable + @Configurable.Comment({ "Spark 性能分析器的启动阶段", "The startup phase of the Spark profiler" }) + @RegisterLanguage(namePrefix = "config.gtocore.option", en = "Spark Profiler Start Phase", cn = "Spark 分析器启动阶段") + public SparkRange startSpark = SparkRange.NONE; } } diff --git a/src/main/java/com/gtocore/data/Data.java b/src/main/java/com/gtocore/data/Data.java index dd1e16984..254813578 100644 --- a/src/main/java/com/gtocore/data/Data.java +++ b/src/main/java/com/gtocore/data/Data.java @@ -28,7 +28,6 @@ import com.gtolib.api.machine.MultiblockDefinition; import com.gtolib.api.recipe.Recipe; import com.gtolib.api.recipe.RecipeBuilder; -import com.gtolib.utils.GTOUtils; import com.gtolib.utils.RegistriesUtils; import com.gregtechceu.gtceu.GTCEu; @@ -45,6 +44,7 @@ import com.gregtechceu.gtceu.data.recipe.misc.StoneMachineRecipes; import com.gregtechceu.gtceu.data.recipe.misc.WoodMachineRecipes; import com.gregtechceu.gtceu.integration.emi.recipe.GTRecipeEMICategory; +import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.world.level.block.Block; @@ -68,7 +68,7 @@ public final class Data { public static void init() { if (GTCEu.isClientSide()) { - GTOUtils.startThread(Data::clientInit); + GTUtil.ASYNC_EXECUTOR.execute(Data::clientInit); } else { commonInit(); } diff --git a/src/main/java/com/gtocore/data/lang/ItemLang.java b/src/main/java/com/gtocore/data/lang/ItemLang.java index a317f3df9..98c660ae6 100644 --- a/src/main/java/com/gtocore/data/lang/ItemLang.java +++ b/src/main/java/com/gtocore/data/lang/ItemLang.java @@ -92,12 +92,12 @@ public static void init() { addCNEN("metaitem.tool.tooltip.rotor.coating.tooltip.2", "§b每次转子损坏时95%概率优先消耗镀层耐久,镀层耐久耗尽后再消耗本体耐久", "§bThere is a 95% chance of consuming the coating durability first when the rotor is damaged. After the coating durability is exhausted, the body durability is consumed"); addCNEN("metaitem.tool.tooltip.rotor.coating.tooltip.0.magic", "§d魔法§6镀层机制:", "§dMagical§6 Coating Mechanism:"); - addCNEN("metaitem.tool.tooltip.rotor.coating.tooltip.1.magic", "§d魔法§b镀层将不再提供耐久度屏障,而是会提供魔法材料属性×30%的转子效率与涡轮产能", - "§dMagical§b Coating will no longer provide a durability barrier, but will provide rotor efficiency and turbine power generation of magical material properties ×30%"); + addCNEN("metaitem.tool.tooltip.rotor.coating.tooltip.1.magic", "§d魔法§b镀层将不再提供耐久度屏障,而是会提供魔法材料额外属性×30%的转子效率与涡轮产能", + "§dMagical§b Coating will no longer provide a durability barrier, but will provide rotor efficiency and turbine power generation of magical material bonus properties ×30%"); addCNEN("metaitem.tool.tooltip.rotor.coating.tooltip.2.magic", "§b本体消耗耐久时,§d魔法§b镀层将同时损耗耐久,镀层耐久耗尽后转子效率与涡轮产能将回落至原始值。", "When the body consumes durability, the §dmagical§b coating will also consume durability. After the coating durability is exhausted, the rotor efficiency and turbine power generation will fall back to the original value. "); - addCNEN("metaitem.tool.tooltip.rotor.coating.tooltip.3.magic", "当转子A有镀层B,镀层B的耐久为§dmax(B/10, min(B-A, B/2))", - "When rotor A has coating B, the durability of coating B is §dmax(B/10, min(B-A, B/2))"); + addCNEN("metaitem.tool.tooltip.rotor.coating.tooltip.3.magic", "当转子A有镀层B,镀层B的耐久为§d4 * max(B/10, min(B-A, B/2))", + "When rotor A has coating B, the durability of coating B is §d4 * max(B/10, min(B-A, B/2))"); addCNEN("gtocore.turbine_rotor.coated", "%s镀层", "%s Coated"); addCNEN("gtocore.tooltip.artificial_gem", "比自然的更好", "Better than nature"); addCNEN("gtocore.tooltip.unknown", "未知", "Unknown"); diff --git a/src/main/java/com/gtocore/data/lang/LangHandler.java b/src/main/java/com/gtocore/data/lang/LangHandler.java index 5af2ac6fd..19d0e766f 100644 --- a/src/main/java/com/gtocore/data/lang/LangHandler.java +++ b/src/main/java/com/gtocore/data/lang/LangHandler.java @@ -140,7 +140,7 @@ private static void init() { addCNEN("gtocore.pattern.clearSecOutput", "清除样板副产物", "Clear pattern byproducts"); addCNEN("gtocore.pattern.tooltip.clearSecOutput", "清除样板副产物", "Clear pattern byproducts"); - addCNEN("gtocore.gtm", "整合包使用的GregTech-Modern模组,以及Applied Energetics 2模组均为非官方版本,如果您遇到任何问题或有任何建议,请前往%s提供反馈,而不是模组官方渠道", "The GregTech-Modern and Applied Energetics 2 mod used in the modpack is an unofficial version. If you encounter any issues or have any suggestions, please go to %s to provide feedback instead of the official mod channel."); + addCNEN("gtocore.gtm", "整合包使用的GregTech-Modern模组,以及Applied Energistics 2模组均为非官方版本,如果您遇到任何问题或有任何建议,请前往%s提供反馈,而不是模组官方渠道", "The GregTech-Modern and Applied Energistics 2 mod used in the modpack is an unofficial version. If you encounter any issues or have any suggestions, please go to %s to provide feedback instead of the official mod channel."); addCNEN("gtocore.dev", "当前版本是开发测试版本,不能保证内容的稳定性和完整性。如果您遇到任何问题或有任何建议,请前往%s提供反馈。", "The current version is a development test version and cannot guarantee the stability and completeness of the content. If you encounter any issues or have any suggestions, please go to %s to provide feedback."); addCNEN("gtodyssey.com", "GTOdyssey 官方维基网站", "GTOdyssey Official Wiki Website"); addCNEN("gtocore.fly_speed_reset", "飞行速度已重置", "fly Speed Reset"); @@ -226,7 +226,6 @@ private static void init() { addCNEN("config.jade.plugin_gtocore.destroy_time_provider", "[GTOCore] 硬度信息", "[GTOCore] Destroy Time Info"); addCNEN("config.jade.plugin_gtocore.wireless_grid_provider", "[GTOCore] 无线AE网络信息", "[GTOCore] Wireless AE Network Info"); addCNEN("config.jade.plugin_gtocore.maintenance_hatch_provider", "[GTOCore] 维护仓信息", "[GTOCore] Maintenance Hatch Info"); - addCNEN("config.jade.plugin_gtocore.en_lang", "[GTOCore] 英语显示", "[GTOCore] English Display"); addCNEN("gtocore.applicable_modules", "安装附属模块后可解锁的仓室类型 : %s", "Hatch types unlocked by installing auxiliary modules : %s"); @@ -270,6 +269,7 @@ private static void init() { addCNEN("gtocore.player_exp_status.mysterious_boost_potion.success", "你似乎被赋予了某种神秘能力...", "You seem to be granted with some mysterious ability ......"); addCNEN("gtocore.gui.encoding_desc", "§o[Shift + 左击] 将样板存入背包/清空所有已编码样板", "§o[Shift + Click] insert encoding pattern into player inventory / clear all encoded patterns"); + addCNEN("gtocore.gui.widget.amount_set.hover_tooltip", "输入 1-Long.MAX 的整数。支持 k/m/g 简写和公式", "Enter an integer from 1 to Long.MAX. Accepts k/m/g notation and expressions"); addCNEN("gtocore.xaero_waypoint_set", "矿脉", "Ore Vein"); @@ -364,6 +364,7 @@ private static void init() { addCNEN("gtocore.ae.appeng.me2in1.auto_search.off", "不自动在样板终端中搜索", "does not automatically search in the pattern terminal"); addCNEN("gtocore.ae.appeng.me2in1.auto_search.config", "中键点击以配置自定义目录名称搜索映射", "Middle-click to configure custom directory name search mapping"); addCNEN("gtocore.ae.appeng.me2in1.vanilla_craft_station", "分子装配", "Molecular Assembl"); + addCNEN("gtocore.ae.appeng.pattern_content_access_terminal", "样板内容管理终端", "Pattern Content Access Terminal"); addCNEN("gtocore.ae.appeng.me2in1.wireless", "无线2合1终端", "Wireless 2-in-1 Terminal"); addCNEN("gtocore.ae.appeng.me2in1", "ME2合1终端", "ME 2-in-1 Terminal"); addCNEN("gtocore.ae.appeng.me2in1.search_in", "按样板输入搜索。", "Search by pattern input."); @@ -387,8 +388,6 @@ private static void init() { addCNEN("gtocore.ae.appeng.craft.used_percent", "已使用 %s%%", "Used %s%%"); addCNEN("gtocore.ae.appeng.fetching_items", "取得信息中...", "Fetching items..."); addCNEN("gtocore.ae.appeng.me_storage_amount", "ME网络存储数量", "ME Network Stored Amount"); - addCNEN("gtocore.ae.appeng.pick_craft.error.title", "Pick-Craft 错误", "Pick-Craft Error"); - addCNEN("gtocore.ae.appeng.pick_craft.all_right.title", "Pick-Craft 成功", "Pick-Craft Success"); addCNEN("gtocore.ae.appeng.pick_craft.all_right", "已启动合成!", "Crafting started!"); addCNEN("gtocore.ae.appeng.pick_craft.error.1", "计算合成路径时发生错误。", "An error occurred while calculating the crafting path."); addCNEN("gtocore.ae.appeng.pick_craft.error.2", "没有足够的材料/CPU来合成所需物品。", "Insufficient materials/No available CPU to craft the desired item."); @@ -398,6 +397,9 @@ private static void init() { addCNEN("gtocore.ae.appeng.craft.resume_job", "继续", "Resume"); addCNEN("gtocore.ae.appeng.craft.pause_job.desc", "暂停正在进行中的发配;已推送的样板不会被撤回", "Pause the ongoing crafting; pushed patterns will not be withdrawn"); addCNEN("gtocore.ae.appeng.craft.resume_job.desc", "继续已暂停的发配", "Resume the paused crafting"); + addCNEN("gtocore.ae.appeng.craft.temp_order", "中键点击以创建临时合成订单,下单一份该配方的原材料", "Middle-click to create a temporary crafting order, ordering one set of raw materials for this recipe"); + addCNEN("gtocore.ae.appeng.craft.encode_send", "§o[右键点击] 编码并发送样板§r", "§o[Right Click] Encode and send pattern§r"); + addCNEN("gtocore.ae.appeng.craft.encode_send.desc", "点击选择目的地样板供应器,并将样板发送至该供应器", "Click to select the destination Pattern Provider and encode the current recipe to it"); addCNEN("gtocore.adv_terminal.block.confirm", "确认", "Confirm"); addCNEN("gtocore.adv_terminal.block.cancel", "取消", "Cancel"); diff --git a/src/main/java/com/gtocore/data/recipe/classified/AssemblerA.java b/src/main/java/com/gtocore/data/recipe/classified/AssemblerA.java index 9bc26c985..674fc40e7 100644 --- a/src/main/java/com/gtocore/data/recipe/classified/AssemblerA.java +++ b/src/main/java/com/gtocore/data/recipe/classified/AssemblerA.java @@ -536,7 +536,7 @@ public static void init() { .inputItems(TagPrefix.frameGt, GTMaterials.NiobiumTitanium) .inputItems(TagPrefix.plate, GTOMaterials.TitaniumTi64, 4) .inputItems(TagPrefix.plate, GTMaterials.NiobiumTitanium, 2) - .outputItems(GTOBlocks.TITANIUM_ALLOY_INTERNAL_FRAME.asStack()) + .outputItems(GTOBlocks.TITANIUM_ALLOY_FRAME_INTERNAL.asStack()) .circuitMeta(6) .EUt(16) .duration(50) diff --git a/src/main/java/com/gtocore/data/recipe/classified/AssemblyLineA.java b/src/main/java/com/gtocore/data/recipe/classified/AssemblyLineA.java index 87e237e6b..65edf7310 100644 --- a/src/main/java/com/gtocore/data/recipe/classified/AssemblyLineA.java +++ b/src/main/java/com/gtocore/data/recipe/classified/AssemblyLineA.java @@ -619,7 +619,7 @@ public static void init() { .inputItems("gtocore:me_extend_pattern_buffer_ultra") .inputItems(AEItems.FUZZY_CARD.asItem(), 4) .inputItems(AEItems.EQUAL_DISTRIBUTION_CARD.asItem(), 2) - .inputItems(GTOMachines.ME_PATTERN_CONTENT_SORT_MACHINE.asItem(), 4) + .inputItems(GTOAEParts.INSTANCE.getPattern_Content_Access_Terminal().get().asItem(), 4) .inputItems(GTItems.SMART_ITEM_FILTER, 4) .inputItems(GTItems.FLUID_FILTER, 4) .inputItems(GTItems.TAG_FILTER, 4) @@ -634,7 +634,7 @@ public static void init() { .inputFluids(GTMaterials.Lubricant, 1000) .EUt(152000) .duration(200) - .researchStation(b -> b.researchStack(GTOMachines.ME_PATTERN_CONTENT_SORT_MACHINE) + .researchStation(b -> b.researchStack(GTOAEParts.INSTANCE.getPattern_Content_Access_Terminal().get().asItem()) .duration(1200) .EUt(GTValues.VA[GTValues.UV]) .CWUt(256)) @@ -645,7 +645,7 @@ public static void init() { .inputItems(GTOMachines.HUGE_ITEM_IMPORT_BUS.asItem()) .inputItems(CustomTags.UEV_CIRCUITS, 4) .inputItems("gtocore:me_extend_pattern_buffer") - .inputItems(GTOMachines.ME_PATTERN_CONTENT_SORT_MACHINE.asItem(), 4) + .inputItems(GTOAEParts.INSTANCE.getPattern_Content_Access_Terminal().get().asItem(), 4) .inputItems(AEItems.FUZZY_CARD.asItem(), 4) .inputItems(AEItems.EQUAL_DISTRIBUTION_CARD.asItem(), 2) .inputItems(GTItems.TAG_FILTER, 4) @@ -662,7 +662,7 @@ public static void init() { .inputFluids(GTMaterials.Lubricant, 1000) .EUt(152000) .duration(200) - .researchStation(b -> b.researchStack(GTOMachines.ME_PATTERN_CONTENT_SORT_MACHINE) + .researchStation(b -> b.researchStack(GTOAEParts.INSTANCE.getPattern_Content_Access_Terminal().get().asItem()) .duration(1200) .EUt(GTValues.VA[GTValues.UV]) .CWUt(256)) @@ -673,7 +673,7 @@ public static void init() { ASSEMBLY_LINE_RECIPES.builder("me_wildcard_pattern_buffer_easy") .inputItems(GTMachines.ITEM_IMPORT_BUS[GTValues.LuV].asItem()) .inputItems("gtceu:me_pattern_buffer") - .inputItems(GTOMachines.ME_PATTERN_CONTENT_SORT_MACHINE.asItem(), 4) + .inputItems(GTOAEParts.INSTANCE.getPattern_Content_Access_Terminal().get().asItem(), 4) .inputItems(AEItems.FUZZY_CARD.asItem(), 4) .inputItems(AEItems.EQUAL_DISTRIBUTION_CARD.asItem(), 2) .inputItems(GTItems.TAG_FILTER, 4) @@ -689,7 +689,7 @@ public static void init() { .inputFluids(GTMaterials.SolderingAlloy, 2000) .inputFluids(GTMaterials.Lubricant, 1000) .EUt(152000 / 16) - .researchStation(b -> b.researchStack(GTOMachines.ME_PATTERN_CONTENT_SORT_MACHINE) + .researchStation(b -> b.researchStack(GTOAEParts.INSTANCE.getPattern_Content_Access_Terminal().get().asItem()) .duration(1200) .EUt(GTValues.VA[GTValues.LuV]) .CWUt(32)) diff --git a/src/main/java/com/gtocore/data/recipe/classified/MolecularTransformer.java b/src/main/java/com/gtocore/data/recipe/classified/MolecularTransformer.java index cc28d705f..8e1806c5f 100644 --- a/src/main/java/com/gtocore/data/recipe/classified/MolecularTransformer.java +++ b/src/main/java/com/gtocore/data/recipe/classified/MolecularTransformer.java @@ -8,6 +8,8 @@ import net.minecraft.world.level.block.Blocks; +import appeng.core.definitions.AEItems; + import static com.gtocore.common.data.GTORecipeTypes.MOLECULAR_TRANSFORMER_RECIPES; final class MolecularTransformer { @@ -131,5 +133,11 @@ public static void init() { .EUt(524288) .duration(180) .save(); + MOLECULAR_TRANSFORMER_RECIPES.builder("quantum_entangled_singularity") + .inputItems(AEItems.MATTER_BALL.asItem(), 250) + .outputItems(AEItems.SINGULARITY.asItem()) + .EUt(1920) + .duration(18000) + .save(); } } diff --git a/src/main/java/com/gtocore/data/recipe/classified/Vanilla.java b/src/main/java/com/gtocore/data/recipe/classified/Vanilla.java index 4ff91c98c..4b85f324a 100644 --- a/src/main/java/com/gtocore/data/recipe/classified/Vanilla.java +++ b/src/main/java/com/gtocore/data/recipe/classified/Vanilla.java @@ -6,6 +6,7 @@ import com.gtocore.integration.Mods; import com.gtolib.GTOCore; +import com.gtolib.utils.RLUtils; import com.gtolib.utils.RegistriesUtils; import com.gtolib.utils.TagUtils; @@ -93,7 +94,7 @@ public static void init() { "B B", "ABA", 'A', CustomTags.EV_CIRCUITS, 'B', RegistriesUtils.getItemStack("expatternprovider:wireless_connect")); - VanillaRecipeHelper.addShapedRecipe(GTOCore.id("me_pattern_content_sort_machine"), GTOMachines.ME_PATTERN_CONTENT_SORT_MACHINE.asItem(), + VanillaRecipeHelper.addShapedRecipe(GTOCore.id("me_pattern_content_sort_machine"), GTOAEParts.INSTANCE.getPattern_Content_Access_Terminal().get().asItem(), "ABA", "BCB", "DBD", @@ -115,8 +116,8 @@ public static void init() { " ", "ABA", "DDD", - 'A', CustomTags.LuV_CIRCUITS, 'B', EPPItemAndBlock.EX_PATTERN_TERMINAL, - 'D', new MaterialEntry(TagPrefix.plate, GTMaterials.HastelloyX)); + 'A', AEItems.ENGINEERING_PROCESSOR, 'B', EPPItemAndBlock.EX_PATTERN_TERMINAL, + 'D', TagUtils.createItemTag(RLUtils.ae("illuminated_panel"))); VanillaRecipeHelper.addShapedRecipe(GTOCore.id("me_2in1_terminal_wireless"), GTOItems.WIRELESS_ME2IN1.asItem(), "A", diff --git a/src/main/java/com/gtocore/data/recipe/magic/MagicRecipesA.java b/src/main/java/com/gtocore/data/recipe/magic/MagicRecipesA.java index 339376780..7456badb6 100644 --- a/src/main/java/com/gtocore/data/recipe/magic/MagicRecipesA.java +++ b/src/main/java/com/gtocore/data/recipe/magic/MagicRecipesA.java @@ -699,8 +699,8 @@ public static void init() { .inputItems("botania:agricarnation", 32) .inputItems("botania:hopperhock", 16) .inputItems("botania:rune_spring", 4) - .inputItems(TagPrefix.gear, GTOMaterials.Elementium, 8) - .inputItems(TagPrefix.gemExquisite, GTOMaterials.Aerialite, 16) + .inputItems(TagPrefix.gear, Elementium, 8) + .inputItems(gemFlawless, StarBloodCrystal, 16) .inputItems("botania:fertilizer", 64) .outputItems(ManaMultiBlock.MANA_GREENHOUSE.asItem()) .inputFluids(GTOMaterials.Mana, 4608) diff --git a/src/main/java/com/gtocore/data/tag/TagsHandler.java b/src/main/java/com/gtocore/data/tag/TagsHandler.java index db1e39aa4..fa342f102 100644 --- a/src/main/java/com/gtocore/data/tag/TagsHandler.java +++ b/src/main/java/com/gtocore/data/tag/TagsHandler.java @@ -1,11 +1,17 @@ package com.gtocore.data.tag; +import com.gtocore.api.data.material.GTOMaterialFlags; import com.gtocore.common.data.GTOBlocks; import com.gtocore.common.data.GTOItems; import com.gtocore.common.data.GTOMachines; import com.gtocore.common.data.GTOMaterials; +import com.gtolib.utils.TagUtils; + +import com.gregtechceu.gtceu.api.GTCEuAPI; import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; +import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import com.gregtechceu.gtceu.api.data.chemical.material.registry.MaterialRegistry; import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.common.data.GTBlocks; import com.gregtechceu.gtceu.common.data.GTMaterials; @@ -103,6 +109,16 @@ public static void initItem(RegistrateTagsProvider provider) { GTOItems.WIRELESS_ME2IN1.asItem()); create(provider, ItemTags.create(ResourceLocation.parse("forge:ingots/redstone_alloy")), ChemicalHelper.getItem(TagPrefix.ingot, GTMaterials.RedAlloy)); + for (TagPrefix tagPrefix : TagPrefix.ORES.keySet()) { + for (MaterialRegistry registry : GTCEuAPI.materialManager.getRegistries()) { + for (Material material : registry.getAllMaterials()) { + if (!material.hasFlag(GTOMaterialFlags.GENERATE_MILLED)) continue; + var item = ChemicalHelper.getItem(tagPrefix, material); + if (item == Items.AIR) continue; + create(provider, TagUtils.createTGItemTag("isa_processable"), item); + } + } + } } public static void initFluid(RegistrateTagsProvider provider) { diff --git a/src/main/java/com/gtocore/eio_travel/TravelEvents.java b/src/main/java/com/gtocore/eio_travel/TravelEvents.java index d352b02d3..9daf63462 100644 --- a/src/main/java/com/gtocore/eio_travel/TravelEvents.java +++ b/src/main/java/com/gtocore/eio_travel/TravelEvents.java @@ -2,8 +2,10 @@ import com.gtocore.api.travel.TravelMode; import com.gtocore.common.item.TravelStaffBehavior; -import com.gtocore.eio_travel.api.ITravelHandlerHook; -import com.gtocore.eio_travel.api.TravelHandler; +import com.gtocore.eio_travel.logic.TravelHandler; +import com.gtocore.eio_travel.logic.TravelSavedData; +import com.gtocore.eio_travel.logic.TravelUtils; +import com.gtocore.eio_travel.network.TravelNetworks; import com.gregtechceu.gtceu.api.item.ComponentItem; @@ -13,6 +15,7 @@ import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; @@ -21,16 +24,22 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.MovementInputUpdateEvent; +import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.Nullable; + import java.util.Objects; @Mod.EventBusSubscriber public class TravelEvents { + @Nullable + public static Runnable syncTask = null; + @SubscribeEvent public static void onLeftClickBlock(PlayerInteractEvent.LeftClickBlock event) { Player player = event.getEntity(); @@ -57,7 +66,7 @@ public static void onLeftClickBlock(PlayerInteractEvent.LeftClickBlock event) { String blockId = Objects.requireNonNull(ForgeRegistries.BLOCKS.getKey(blockState.getBlock())).toString(); CompoundTag tag = stack.getOrCreateTag(); - tag.putString(ITravelHandlerHook.FILTER_BLOCK_TAG, blockId); + tag.putString(TravelUtils.FILTER_BLOCK_TAG, blockId); player.displayClientMessage( Component.translatable("gtocore.travel.mode.switched") @@ -78,12 +87,35 @@ public static void onLeftClickBlock(PlayerInteractEvent.LeftClickBlock event) { private static TravelMode gtocore$getTravelMode(ItemStack stack) { CompoundTag tag = stack.getOrCreateTag(); - return TravelMode.fromString(tag.getString(ITravelHandlerHook.MODE_TAG)); + return TravelMode.fromString(tag.getString(TravelUtils.MODE_TAG)); } private static void gtocore$setTravelMode(ItemStack stack, TravelMode mode) { CompoundTag tag = stack.getOrCreateTag(); - tag.putString(ITravelHandlerHook.MODE_TAG, mode.getSerializedName()); + tag.putString(TravelUtils.MODE_TAG, mode.getSerializedName()); + } + + @SubscribeEvent + public static void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) { + Player player = event.getEntity(); + if (player instanceof ServerPlayer serverPlayer) { + TravelNetworks.syncTravelData(TravelSavedData.getTravelData(serverPlayer.level()).save(new CompoundTag()), serverPlayer); + } + } + + @SubscribeEvent + public static void onDimensionChange(PlayerEvent.PlayerChangedDimensionEvent event) { + Player player = event.getEntity(); + if (player instanceof ServerPlayer serverPlayer) { + TravelNetworks.syncTravelData(TravelSavedData.getTravelData(serverPlayer.level()).save(new CompoundTag()), serverPlayer); + } + } + + @SubscribeEvent + public static void onServerTick(net.minecraftforge.event.TickEvent.ServerTickEvent event) { + if (event.phase == net.minecraftforge.event.TickEvent.Phase.END && syncTask != null) { + syncTask.run(); + } } @Mod.EventBusSubscriber(Dist.CLIENT) diff --git a/src/main/java/com/gtocore/eio_travel/AbstractTravelTarget.java b/src/main/java/com/gtocore/eio_travel/api/AbstractTravelTarget.java similarity index 95% rename from src/main/java/com/gtocore/eio_travel/AbstractTravelTarget.java rename to src/main/java/com/gtocore/eio_travel/api/AbstractTravelTarget.java index 532982bce..1216588db 100644 --- a/src/main/java/com/gtocore/eio_travel/AbstractTravelTarget.java +++ b/src/main/java/com/gtocore/eio_travel/api/AbstractTravelTarget.java @@ -1,6 +1,7 @@ -package com.gtocore.eio_travel; +package com.gtocore.eio_travel.api; import com.gtocore.config.GTOConfig; +import com.gtocore.eio_travel.EioTravelNbtKeys; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; @@ -75,11 +76,6 @@ public boolean canTeleportTo() { return getVisibility(); } - @Override - public boolean canJumpTo() { - return true; - } - @Override public int getItem2BlockRange() { return GTOConfig.INSTANCE.travelConfig.blockRange; diff --git a/src/main/java/com/gtocore/eio_travel/ITravelTarget.java b/src/main/java/com/gtocore/eio_travel/api/ITravelTarget.java similarity index 94% rename from src/main/java/com/gtocore/eio_travel/ITravelTarget.java rename to src/main/java/com/gtocore/eio_travel/api/ITravelTarget.java index 81cd9fc53..d98790345 100644 --- a/src/main/java/com/gtocore/eio_travel/ITravelTarget.java +++ b/src/main/java/com/gtocore/eio_travel/api/ITravelTarget.java @@ -1,4 +1,4 @@ -package com.gtocore.eio_travel; +package com.gtocore.eio_travel.api; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/gtocore/eio_travel/api/TravelEntry.java b/src/main/java/com/gtocore/eio_travel/api/TravelEntry.java index eb13921c1..ca0cc559e 100644 --- a/src/main/java/com/gtocore/eio_travel/api/TravelEntry.java +++ b/src/main/java/com/gtocore/eio_travel/api/TravelEntry.java @@ -1,6 +1,5 @@ package com.gtocore.eio_travel.api; -import com.gtocore.eio_travel.ITravelTarget; import com.gtocore.eio_travel.client.TravelRenderer; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/gtocore/eio_travel/api/TravelRegistry.java b/src/main/java/com/gtocore/eio_travel/api/TravelRegistry.java index 26c6513b8..892c10b68 100644 --- a/src/main/java/com/gtocore/eio_travel/api/TravelRegistry.java +++ b/src/main/java/com/gtocore/eio_travel/api/TravelRegistry.java @@ -1,6 +1,5 @@ package com.gtocore.eio_travel.api; -import com.gtocore.eio_travel.ITravelTarget; import com.gtocore.eio_travel.client.TravelRenderer; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/gtocore/eio_travel/client/RenderTravelTargets.java b/src/main/java/com/gtocore/eio_travel/client/RenderTravelTargets.java index 0ce4fd4e3..d5fd18ef4 100644 --- a/src/main/java/com/gtocore/eio_travel/client/RenderTravelTargets.java +++ b/src/main/java/com/gtocore/eio_travel/client/RenderTravelTargets.java @@ -1,10 +1,10 @@ package com.gtocore.eio_travel.client; -import com.gtocore.eio_travel.ITravelTarget; -import com.gtocore.eio_travel.api.ITravelHandlerHook; -import com.gtocore.eio_travel.api.TravelHandler; +import com.gtocore.eio_travel.api.ITravelTarget; import com.gtocore.eio_travel.api.TravelRegistry; -import com.gtocore.eio_travel.api.TravelSavedData; +import com.gtocore.eio_travel.logic.TravelHandler; +import com.gtocore.eio_travel.logic.TravelSavedData; +import com.gtocore.eio_travel.logic.TravelUtils; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; @@ -38,11 +38,11 @@ public static void renderLevel(RenderLevelStageEvent event) { TravelSavedData data = TravelSavedData.getTravelData(Minecraft.getInstance().level); @Nullable ITravelTarget activeTarget = TravelHandler.getTeleportAnchorTarget(player).orElse(null); - var targets = ITravelHandlerHook.filterTargets(player, data.getTravelTargets().stream()).toList(); + var targets = TravelUtils.filterTargets(player, data.getTravelTargets().stream()).toList(); for (ITravelTarget target : targets) { double range = itemTeleport ? target.getItem2BlockRange() : target.getBlock2BlockRange(); double distanceSquared = target.getPos().distToCenterSqr(player.position()); - if (range * range < distanceSquared || distanceSquared < TravelHandler.MIN_TELEPORTATION_DISTANCE_SQUARED || ITravelHandlerHook.gto$isTeleportPositionAndSurroundingClear(level, target.getPos()).isEmpty()) { + if (range * range < distanceSquared || distanceSquared < TravelHandler.MIN_TELEPORTATION_DISTANCE_SQUARED || TravelUtils.gto$isTeleportPositionAndSurroundingClear(level, target.getPos()).isEmpty()) { continue; } diff --git a/src/main/java/com/gtocore/eio_travel/client/TravelParticleHandler.java b/src/main/java/com/gtocore/eio_travel/client/TravelParticleHandler.java index aa004c851..b7aca66c9 100644 --- a/src/main/java/com/gtocore/eio_travel/client/TravelParticleHandler.java +++ b/src/main/java/com/gtocore/eio_travel/client/TravelParticleHandler.java @@ -1,6 +1,6 @@ package com.gtocore.eio_travel.client; -import com.gtocore.eio_travel.api.TravelHandler; +import com.gtocore.eio_travel.logic.TravelHandler; import net.minecraft.client.Minecraft; import net.minecraft.client.particle.Particle; diff --git a/src/main/java/com/gtocore/eio_travel/client/TravelRenderer.java b/src/main/java/com/gtocore/eio_travel/client/TravelRenderer.java index 183332bf9..7eea7e6a0 100644 --- a/src/main/java/com/gtocore/eio_travel/client/TravelRenderer.java +++ b/src/main/java/com/gtocore/eio_travel/client/TravelRenderer.java @@ -1,6 +1,6 @@ package com.gtocore.eio_travel.client; -import com.gtocore.eio_travel.ITravelTarget; +import com.gtocore.eio_travel.api.ITravelTarget; import net.minecraft.client.renderer.LevelRenderer; diff --git a/src/main/java/com/gtocore/eio_travel/client/travel/OutlineBuffer.java b/src/main/java/com/gtocore/eio_travel/client/travel/OutlineBuffer.java index 68c29d0c0..a3009f016 100644 --- a/src/main/java/com/gtocore/eio_travel/client/travel/OutlineBuffer.java +++ b/src/main/java/com/gtocore/eio_travel/client/travel/OutlineBuffer.java @@ -5,7 +5,6 @@ import net.minecraft.client.renderer.RenderType; import com.mojang.blaze3d.vertex.VertexConsumer; -import org.jetbrains.annotations.NotNull; public class OutlineBuffer implements MultiBufferSource { @@ -13,9 +12,8 @@ public class OutlineBuffer implements MultiBufferSource { private OutlineBuffer() {} - @NotNull @Override - public VertexConsumer getBuffer(@NotNull RenderType type) { + public VertexConsumer getBuffer(RenderType type) { return Minecraft.getInstance().renderBuffers().bufferSource().getBuffer(OutlineRenderType.get(type)); } } diff --git a/src/main/java/com/gtocore/eio_travel/client/travel/OutlineRenderType.java b/src/main/java/com/gtocore/eio_travel/client/travel/OutlineRenderType.java index e0d792c4b..e5196f8bb 100644 --- a/src/main/java/com/gtocore/eio_travel/client/travel/OutlineRenderType.java +++ b/src/main/java/com/gtocore/eio_travel/client/travel/OutlineRenderType.java @@ -8,7 +8,6 @@ import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.VertexFormat; -import org.jetbrains.annotations.NotNull; import java.util.HashMap; import java.util.Map; @@ -39,7 +38,6 @@ public static RenderType get(RenderType parent) { } } - @NotNull @Override public String toString() { return "Outline" + this.parent; diff --git a/src/main/java/com/gtocore/eio_travel/client/travel/TravelAnchorHud.java b/src/main/java/com/gtocore/eio_travel/client/travel/TravelAnchorHud.java index c54bb7377..19ac4cd4c 100644 --- a/src/main/java/com/gtocore/eio_travel/client/travel/TravelAnchorHud.java +++ b/src/main/java/com/gtocore/eio_travel/client/travel/TravelAnchorHud.java @@ -1,9 +1,9 @@ package com.gtocore.eio_travel.client.travel; import com.gtocore.common.data.GTOMachines; -import com.gtocore.eio_travel.AbstractTravelTarget; -import com.gtocore.eio_travel.ITravelTarget; -import com.gtocore.eio_travel.api.TravelHandler; +import com.gtocore.eio_travel.api.AbstractTravelTarget; +import com.gtocore.eio_travel.api.ITravelTarget; +import com.gtocore.eio_travel.logic.TravelHandler; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; diff --git a/src/main/java/com/gtocore/eio_travel/client/travel/TravelAnchorRenderer.java b/src/main/java/com/gtocore/eio_travel/client/travel/TravelAnchorRenderer.java index 9562faf25..9137bf9ae 100644 --- a/src/main/java/com/gtocore/eio_travel/client/travel/TravelAnchorRenderer.java +++ b/src/main/java/com/gtocore/eio_travel/client/travel/TravelAnchorRenderer.java @@ -1,6 +1,6 @@ package com.gtocore.eio_travel.client.travel; -import com.gtocore.eio_travel.ITravelTarget; +import com.gtocore.eio_travel.api.ITravelTarget; import com.gtocore.eio_travel.client.TravelRenderer; import net.minecraft.ChatFormatting; diff --git a/src/main/java/com/gtocore/eio_travel/client/travel/TravelAnchorRenderers.java b/src/main/java/com/gtocore/eio_travel/client/travel/TravelAnchorRenderers.java index 7fcfde4e7..39a5dec0a 100644 --- a/src/main/java/com/gtocore/eio_travel/client/travel/TravelAnchorRenderers.java +++ b/src/main/java/com/gtocore/eio_travel/client/travel/TravelAnchorRenderers.java @@ -1,6 +1,6 @@ package com.gtocore.eio_travel.client.travel; -import com.gtocore.eio_travel.AbstractTravelTarget; +import com.gtocore.eio_travel.api.AbstractTravelTarget; public class TravelAnchorRenderers { diff --git a/src/main/java/com/gtocore/eio_travel/implementations/AnchorTravelTarget.java b/src/main/java/com/gtocore/eio_travel/implementations/AnchorTravelTarget.java index b645141f1..6b41b3b2e 100644 --- a/src/main/java/com/gtocore/eio_travel/implementations/AnchorTravelTarget.java +++ b/src/main/java/com/gtocore/eio_travel/implementations/AnchorTravelTarget.java @@ -1,7 +1,7 @@ package com.gtocore.eio_travel.implementations; -import com.gtocore.eio_travel.AbstractTravelTarget; import com.gtocore.eio_travel.EioTravelNbtKeys; +import com.gtocore.eio_travel.api.AbstractTravelTarget; import com.gtolib.GTOCore; @@ -25,7 +25,7 @@ public static AnchorTravelTarget load(CompoundTag tag) { var pos = NbtUtils.readBlockPos(tag.getCompound(EioTravelNbtKeys.BLOCK_POS)); var name = tag.getString(EioTravelNbtKeys.ANCHOR_NAME); String iconName = tag.getString(EioTravelNbtKeys.ANCHOR_ICON); - var icon = iconName.equals("") ? Items.AIR : ForgeRegistries.ITEMS.getValue(ResourceLocation.tryParse(iconName)); + var icon = iconName.isEmpty() ? Items.AIR : ForgeRegistries.ITEMS.getValue(ResourceLocation.tryParse(iconName)); var visible = tag.getBoolean(EioTravelNbtKeys.ANCHOR_VISIBILITY); return new AnchorTravelTarget(pos, name, icon, visible); } diff --git a/src/main/java/com/gtocore/eio_travel/implementations/PatternTravelTarget.java b/src/main/java/com/gtocore/eio_travel/implementations/PatternTravelTarget.java index 559ae3307..3c9e0dbe7 100644 --- a/src/main/java/com/gtocore/eio_travel/implementations/PatternTravelTarget.java +++ b/src/main/java/com/gtocore/eio_travel/implementations/PatternTravelTarget.java @@ -1,8 +1,8 @@ package com.gtocore.eio_travel.implementations; import com.gtocore.common.machine.multiblock.part.ae.MEPatternPartMachineKt; -import com.gtocore.eio_travel.AbstractTravelTarget; import com.gtocore.eio_travel.EioTravelNbtKeys; +import com.gtocore.eio_travel.api.AbstractTravelTarget; import com.gtolib.GTOCore; @@ -159,7 +159,7 @@ public static PatternTravelTarget loadClientTarget(CompoundTag tag) { var pos = NbtUtils.readBlockPos(tag.getCompound(EioTravelNbtKeys.BLOCK_POS)); var name = tag.getString(EioTravelNbtKeys.ANCHOR_NAME); String iconName = tag.getString(EioTravelNbtKeys.ANCHOR_ICON); - var icon = iconName.equals("") ? Items.AIR : ForgeRegistries.ITEMS.getValue(ResourceLocation.tryParse(iconName)); + var icon = iconName.isEmpty() ? Items.AIR : ForgeRegistries.ITEMS.getValue(ResourceLocation.tryParse(iconName)); var visible = tag.getBoolean(EioTravelNbtKeys.ANCHOR_VISIBILITY); return new PatternTravelTarget(pos, name, icon, visible); } diff --git a/src/main/java/com/gtocore/eio_travel/api/TravelHandler.java b/src/main/java/com/gtocore/eio_travel/logic/TravelHandler.java similarity index 96% rename from src/main/java/com/gtocore/eio_travel/api/TravelHandler.java rename to src/main/java/com/gtocore/eio_travel/logic/TravelHandler.java index 0dabdb6dc..a14b6c3c7 100644 --- a/src/main/java/com/gtocore/eio_travel/api/TravelHandler.java +++ b/src/main/java/com/gtocore/eio_travel/logic/TravelHandler.java @@ -1,9 +1,9 @@ -package com.gtocore.eio_travel.api; +package com.gtocore.eio_travel.logic; import com.gtocore.common.data.GTOItems; import com.gtocore.common.data.GTOMachines; import com.gtocore.config.GTOConfig; -import com.gtocore.eio_travel.ITravelTarget; +import com.gtocore.eio_travel.api.ITravelTarget; import com.gtocore.eio_travel.network.TravelNetworks; import net.minecraft.core.BlockPos; @@ -215,14 +215,14 @@ private static BlockPos traversalCheck(Level level, BlockPos traversePos) { public static Optional getTeleportAnchorTarget(Player player) { Vec3 positionVec = player.position().add(0, player.getEyeHeight(), 0); - return ITravelHandlerHook.filterTargets(player, TravelSavedData + return TravelUtils.filterTargets(player, TravelSavedData .getTravelData(player.level()) .getTravelTargetsInItemRange(player.blockPosition())) .filter(target -> target.canTeleportTo()) .filter(target -> target.getPos().distToCenterSqr(player.position()) > MIN_TELEPORTATION_DISTANCE_SQUARED) .filter(target -> Math.abs(getAngleRadians(positionVec, target.getPos(), player.getYRot(), player.getXRot())) <= Math.toRadians(15)) - .filter(target -> ITravelHandlerHook.gto$isTeleportPositionAndSurroundingClear(player.level(), target.getPos()).isPresent()) + .filter(target -> TravelUtils.gto$isTeleportPositionAndSurroundingClear(player.level(), target.getPos()).isPresent()) .min(Comparator.comparingDouble(target -> Math.abs(getAngleRadians(positionVec, target.getPos(), player.getYRot(), player.getXRot())))); } @@ -251,7 +251,7 @@ public static Optional getElevatorAnchorTarget(Player player, Dir .filter(target -> target.getPos().getX() == anchorX && target.getPos().getZ() == anchorZ) .filter(target -> target.getPos().getY() > lowerY && target.getPos().getY() < upperY) .filter(target -> target.canJumpTo()) - .filter(target -> ITravelHandlerHook.gto$isTeleportPositionAndSurroundingClear(player.level(), target.getPos()).isPresent()) + .filter(target -> TravelUtils.gto$isTeleportPositionAndSurroundingClear(player.level(), target.getPos()).isPresent()) .min(Comparator.comparingDouble(target -> Math.abs(target.getPos().getY() - anchorY))); } diff --git a/src/main/java/com/gtocore/eio_travel/api/TravelSavedData.java b/src/main/java/com/gtocore/eio_travel/logic/TravelSavedData.java similarity index 72% rename from src/main/java/com/gtocore/eio_travel/api/TravelSavedData.java rename to src/main/java/com/gtocore/eio_travel/logic/TravelSavedData.java index c2103ae60..d653f4e48 100644 --- a/src/main/java/com/gtocore/eio_travel/api/TravelSavedData.java +++ b/src/main/java/com/gtocore/eio_travel/logic/TravelSavedData.java @@ -1,6 +1,7 @@ -package com.gtocore.eio_travel.api; +package com.gtocore.eio_travel.logic; -import com.gtocore.eio_travel.ITravelTarget; +import com.gtocore.eio_travel.api.ITravelTarget; +import com.gtocore.eio_travel.api.TravelRegistry; import com.gtocore.eio_travel.network.TravelNetworks; import com.gtolib.GTOCore; @@ -10,13 +11,10 @@ import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.saveddata.SavedData; -import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; + +import org.jetbrains.annotations.NotNull; import java.util.Collection; import java.util.HashMap; @@ -24,7 +22,6 @@ import java.util.Optional; import java.util.stream.Stream; -@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.FORGE) public class TravelSavedData extends SavedData { private static final TravelSavedData CLIENT_INSTANCE = new TravelSavedData(); @@ -86,7 +83,7 @@ public void removeTravelTargetAt(Level level, BlockPos pos) { } @Override - public CompoundTag save(CompoundTag nbt) { + public @NotNull CompoundTag save(CompoundTag nbt) { ListTag tag = new ListTag(); tag.addAll(travelTargets.values().stream().map(TravelRegistry::serialize).toList()); nbt.put(TARGETS, tag); @@ -97,20 +94,4 @@ public CompoundTag save(CompoundTag nbt) { public boolean isDirty() { return true; } - - @SubscribeEvent - public static void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) { - Player player = event.getEntity(); - if (player instanceof ServerPlayer serverPlayer) { - TravelNetworks.syncTravelData(TravelSavedData.getTravelData(serverPlayer.level()).save(new CompoundTag()), serverPlayer); - } - } - - @SubscribeEvent - public static void onDimensionChange(PlayerEvent.PlayerChangedDimensionEvent event) { - Player player = event.getEntity(); - if (player instanceof ServerPlayer serverPlayer) { - TravelNetworks.syncTravelData(TravelSavedData.getTravelData(serverPlayer.level()).save(new CompoundTag()), serverPlayer); - } - } } diff --git a/src/main/java/com/gtocore/eio_travel/api/ITravelHandlerHook.java b/src/main/java/com/gtocore/eio_travel/logic/TravelUtils.java similarity index 88% rename from src/main/java/com/gtocore/eio_travel/api/ITravelHandlerHook.java rename to src/main/java/com/gtocore/eio_travel/logic/TravelUtils.java index d1ef5492a..c75537311 100644 --- a/src/main/java/com/gtocore/eio_travel/api/ITravelHandlerHook.java +++ b/src/main/java/com/gtocore/eio_travel/logic/TravelUtils.java @@ -1,9 +1,10 @@ -package com.gtocore.eio_travel.api; +package com.gtocore.eio_travel.logic; import com.gtocore.api.travel.TravelMode; import com.gtocore.common.machine.multiblock.part.ae.MEPatternPartMachineKt; import com.gtocore.config.GTOConfig; -import com.gtocore.eio_travel.ITravelTarget; +import com.gtocore.eio_travel.TravelEvents; +import com.gtocore.eio_travel.api.ITravelTarget; import com.gtocore.eio_travel.implementations.PatternTravelTarget; import com.gtocore.eio_travel.network.TravelNetworks; @@ -17,18 +18,15 @@ import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; import net.minecraftforge.registries.ForgeRegistries; import appeng.helpers.patternprovider.PatternProviderLogicHost; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.stream.Stream; -public interface ITravelHandlerHook { +public interface TravelUtils { String MODE_TAG = "TravelMode"; String FILTER_BLOCK_TAG = "FilterBlock"; @@ -143,25 +141,11 @@ static void removeAndReadd(@NotNull Level level, MEPatternPartMachineKt host) } static void requireResync(@NotNull Level level) { - EventHandler.syncTask = () -> { + TravelEvents.syncTask = () -> { if (level instanceof ServerLevel serverLevel) { TravelNetworks.syncTravelData(TravelSavedData.getTravelData(level).save(new CompoundTag()), serverLevel); } - EventHandler.syncTask = null; + TravelEvents.syncTask = null; }; } - - @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.FORGE) - class EventHandler { - - @Nullable - public static Runnable syncTask = null; - - @SubscribeEvent - public static void onServerTick(net.minecraftforge.event.TickEvent.ServerTickEvent event) { - if (event.phase == net.minecraftforge.event.TickEvent.Phase.END && syncTask != null) { - syncTask.run(); - } - } - } } diff --git a/src/main/java/com/gtocore/eio_travel/network/TravelNetworks.java b/src/main/java/com/gtocore/eio_travel/network/TravelNetworks.java index 435c066f0..649f9ad1a 100644 --- a/src/main/java/com/gtocore/eio_travel/network/TravelNetworks.java +++ b/src/main/java/com/gtocore/eio_travel/network/TravelNetworks.java @@ -1,9 +1,9 @@ package com.gtocore.eio_travel.network; -import com.gtocore.eio_travel.ITravelTarget; -import com.gtocore.eio_travel.api.TravelHandler; +import com.gtocore.eio_travel.api.ITravelTarget; import com.gtocore.eio_travel.api.TravelRegistry; -import com.gtocore.eio_travel.api.TravelSavedData; +import com.gtocore.eio_travel.logic.TravelHandler; +import com.gtocore.eio_travel.logic.TravelSavedData; import com.gtolib.api.network.NetworkPack; import com.gtolib.utils.ServerUtils; diff --git a/src/main/java/com/gtocore/integration/Mods.java b/src/main/java/com/gtocore/integration/Mods.java index b2303e9cd..ecf91b9ca 100644 --- a/src/main/java/com/gtocore/integration/Mods.java +++ b/src/main/java/com/gtocore/integration/Mods.java @@ -19,7 +19,8 @@ public enum Mods { PIPEZ("pipez"), FTBQUESTS("ftbquests"), CONSTRUCTION_WAND("constructionwand"), - JECHARACTERS("jecharacters"); + JECHARACTERS("jecharacters"), + LANG("moremorelang"); @Getter private final boolean loaded; diff --git a/src/main/java/com/gtocore/integration/ae/PatternContentAccessTerminalMenu.java b/src/main/java/com/gtocore/integration/ae/PatternContentAccessTerminalMenu.java new file mode 100644 index 000000000..6f1b218dc --- /dev/null +++ b/src/main/java/com/gtocore/integration/ae/PatternContentAccessTerminalMenu.java @@ -0,0 +1,54 @@ +package com.gtocore.integration.ae; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.MenuType; + +import appeng.menu.AEBaseMenu; +import appeng.menu.SlotSemantic; +import appeng.menu.SlotSemantics; +import appeng.menu.implementations.MenuTypeBuilder; +import appeng.menu.slot.FakeSlot; +import org.apache.commons.lang3.ArrayUtils; + +import java.util.Collections; + +public class PatternContentAccessTerminalMenu extends AEBaseMenu { + + private final int Rows = 32; + public final FakeSlot[] TargetAEKeys = new FakeSlot[Rows * 9]; + + public static final MenuType TYPE = MenuTypeBuilder + .create(PatternContentAccessTerminalMenu::new, PatternContentAccessTerminalPart.class) + .build("patterncontentaccessterminal"); + + public PatternContentAccessTerminalMenu(int id, Inventory ip, PatternContentAccessTerminalPart part) { + super(TYPE, id, ip, part); + for (int i = 0; i < Rows * 9; i++) { + TargetAEKeys[i] = new FakeSlot(part.getConfig().createMenuWrapper(), i); + TargetAEKeys[i].x = 8 + (i % 9) * 18; + TargetAEKeys[i].y = 18 + (i / 9) * 18; + TargetAEKeys[i].setEmptyTooltip(() -> Collections.singletonList(Component.translatable(PatternContentAccessTerminalScreen.REPLACEMENT_LIST_TOOLTIP).withStyle(ChatFormatting.GRAY))); + SlotSemantic semantics; + if (i % 9 == 0) { + semantics = SlotSemantics.PROCESSING_OUTPUTS; + } else { + semantics = SlotSemantics.PROCESSING_INPUTS; + } + this.addSlot(TargetAEKeys[i], semantics); + + } + createPlayerInventorySlots(ip); + } + + public int getFirstItemAtRow(int row) { + var targetSlots = ArrayUtils.subarray(TargetAEKeys, row * 9, (row + 1) * 9); + for (int i = 0; i < targetSlots.length; i++) { + if (!targetSlots[i].getDisplayStack().isEmpty()) { + return i; + } + } + return -1; + } +} diff --git a/src/main/java/com/gtocore/integration/ae/PatternContentAccessTerminalPart.java b/src/main/java/com/gtocore/integration/ae/PatternContentAccessTerminalPart.java new file mode 100644 index 000000000..369cc5fe4 --- /dev/null +++ b/src/main/java/com/gtocore/integration/ae/PatternContentAccessTerminalPart.java @@ -0,0 +1,118 @@ +package com.gtocore.integration.ae; + +import com.gtocore.utils.AEKeySubstitutionMap; +import com.gtocore.utils.AEPatternRefresher; + +import com.gtolib.GTOCore; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.Vec3; + +import appeng.api.parts.IPartItem; +import appeng.api.parts.IPartModel; +import appeng.api.stacks.AEKey; +import appeng.api.stacks.GenericStack; +import appeng.helpers.IConfigInvHost; +import appeng.helpers.externalstorage.GenericStackInv; +import appeng.items.parts.PartModels; +import appeng.menu.MenuOpener; +import appeng.menu.locator.MenuLocators; +import appeng.parts.PartModel; +import appeng.parts.reporting.AbstractDisplayPart; +import appeng.util.ConfigInventory; + +import java.util.ArrayList; +import java.util.List; + +public class PatternContentAccessTerminalPart extends AbstractDisplayPart implements IConfigInvHost { + + @PartModels + public static final ResourceLocation MODEL_OFF = GTOCore.id( + "part/pattern_content_access_terminal_off"); + @PartModels + public static final ResourceLocation MODEL_ON = GTOCore.id( + "part/pattern_content_access_terminal_on"); + + public static final IPartModel MODELS_OFF = new PartModel(MODEL_BASE, MODEL_OFF, MODEL_STATUS_OFF); + public static final IPartModel MODELS_ON = new PartModel(MODEL_BASE, MODEL_ON, MODEL_STATUS_ON); + public static final IPartModel MODELS_HAS_CHANNEL = new PartModel(MODEL_BASE, MODEL_ON, MODEL_STATUS_HAS_CHANNEL); + + private final ConfigInventory config; + + private volatile AEKeySubstitutionMap substitutionMap = AEKeySubstitutionMap.EMPTY; + + public PatternContentAccessTerminalPart(IPartItem partItem) { + super(partItem, false); + this.config = ConfigInventory.configTypes(32 * 9, this::onConfigChanged); + } + + private void onConfigChanged() { + updateSubstitutionMap(); + refreshPatterns(); + getHost().markForSave(); + } + + private void updateSubstitutionMap() { + List> priorityGroups = new ArrayList<>(); + + for (int row = 0; row < 32; row++) { + List rowKeys = new ArrayList<>(); + for (int col = 0; col < 9; col++) { + GenericStack stack = this.config.getStack(row * 9 + col); + if (stack != null && stack.what() != null) { + rowKeys.add(stack.what()); + } + } + if (!rowKeys.isEmpty()) { + priorityGroups.add(rowKeys); + } + } + this.substitutionMap = new AEKeySubstitutionMap(priorityGroups); + } + + public AEKey getReplacement(AEKey stack) { + return this.substitutionMap.getSubstitution(stack); + } + + public void refreshPatterns() { + if (getMainNode() == null || !getMainNode().isOnline()) return; + var grid = getMainNode().getGrid(); + if (grid != null) { + AEPatternRefresher.refresh(grid); + } + } + + @Override + public boolean onPartActivate(Player player, InteractionHand hand, Vec3 pos) { + if (!super.onPartActivate(player, hand, pos) && !isClientSide()) { + MenuOpener.open(PatternContentAccessTerminalMenu.TYPE, player, MenuLocators.forPart(this)); + } + return true; + } + + @Override + public IPartModel getStaticModels() { + return this.selectModel(MODELS_OFF, MODELS_ON, MODELS_HAS_CHANNEL); + } + + @Override + public GenericStackInv getConfig() { + return this.config; + } + + @Override + public void writeToNBT(CompoundTag data) { + super.writeToNBT(data); + this.config.writeToChildTag(data, "AEKeys"); + } + + @Override + public void readFromNBT(CompoundTag data) { + super.readFromNBT(data); + this.config.readFromChildTag(data, "AEKeys"); + updateSubstitutionMap(); + } +} diff --git a/src/main/java/com/gtocore/integration/ae/PatternContentAccessTerminalScreen.java b/src/main/java/com/gtocore/integration/ae/PatternContentAccessTerminalScreen.java new file mode 100644 index 000000000..bfcfa581b --- /dev/null +++ b/src/main/java/com/gtocore/integration/ae/PatternContentAccessTerminalScreen.java @@ -0,0 +1,177 @@ +package com.gtocore.integration.ae; + +import com.gtolib.api.annotation.DataGeneratorScanned; +import com.gtolib.api.annotation.language.RegisterLanguage; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.renderer.Rect2i; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; + +import appeng.api.config.Settings; +import appeng.api.config.TerminalStyle; +import appeng.client.gui.AEBaseScreen; +import appeng.client.gui.style.ScreenStyle; +import appeng.client.gui.widgets.Scrollbar; +import appeng.client.gui.widgets.SettingToggleButton; +import appeng.core.AEConfig; +import appeng.core.AppEng; + +@DataGeneratorScanned +public class PatternContentAccessTerminalScreen extends AEBaseScreen { + + @RegisterLanguage(cn = "替换列表#%s", en = "Replacement List #%s") + private static final String REPLACEMENT_LIST_NAME = "gtocore.ae.appeng.pattern_content_access_terminal.replacement_list_name"; + @RegisterLanguage(cn = "在此处设置过滤,以决定哪些样板中的原料会被替换。", en = "Configure the filter here to decide which ingredients in the patterns will be replaced.") + public static final String REPLACEMENT_LIST_TOOLTIP = "gtocore.ae.appeng.pattern_content_access_terminal.replacement_list_tooltip"; + + private final Scrollbar scrollbar; + + private static final int GUI_WIDTH = 195; + private static final int GUI_TOP_AND_BOTTOM_PADDING = 54; + private static final int GUI_PADDING_X = 8; + private static final int GUI_HEADER_HEIGHT = 17; + private static final int GUI_FOOTER_HEIGHT = 97; + + private static final int COLUMNS = 9; + + private int lastScrollValue = -1; + + /** + * Height of a table-row in pixels. + */ + private static final int ROW_HEIGHT = 18; + + /** + * Size of a slot in both x and y dimensions in pixel, most likely always the same as ROW_HEIGHT. + */ + private static final int SLOT_SIZE = ROW_HEIGHT; + private static final Rect2i HEADER_BBOX = new Rect2i(0, 0, GUI_WIDTH, GUI_HEADER_HEIGHT); + + private static final Rect2i ROW_INVENTORY_TOP_BBOX = new Rect2i(0, 35 - ROW_HEIGHT, GUI_WIDTH, ROW_HEIGHT + ROW_HEIGHT); + private static final Rect2i ROW_INVENTORY_MIDDLE_BBOX = new Rect2i(0, 71 - ROW_HEIGHT, GUI_WIDTH, ROW_HEIGHT + ROW_HEIGHT); + private static final Rect2i ROW_INVENTORY_BOTTOM_BBOX = new Rect2i(0, 107 - ROW_HEIGHT, GUI_WIDTH, ROW_HEIGHT + ROW_HEIGHT); + private static final Rect2i FOOTER_BBOX = new Rect2i(0, 125, GUI_WIDTH, GUI_FOOTER_HEIGHT); + + private int visibleRows = 0; + + public PatternContentAccessTerminalScreen(PatternContentAccessTerminalMenu menu, Inventory playerInventory, Component title, ScreenStyle style) { + super(menu, playerInventory, title, style); + this.imageWidth = GUI_WIDTH; + this.scrollbar = widgets.addScrollBar("scrollbar"); + + TerminalStyle terminalStyle = AEConfig.instance().getTerminalStyle(); + this.addToLeftToolbar( + new SettingToggleButton<>(Settings.TERMINAL_STYLE, terminalStyle, this::toggleTerminalStyle)); + } + + @Override + public void init() { + this.visibleRows = Math.max(2, config.getTerminalStyle().getRows( + (this.height - GUI_HEADER_HEIGHT - GUI_FOOTER_HEIGHT - GUI_TOP_AND_BOTTOM_PADDING) / ROW_HEIGHT) / 2 * 2); + + this.imageHeight = GUI_HEADER_HEIGHT + GUI_FOOTER_HEIGHT + this.visibleRows * ROW_HEIGHT; + + super.init(); + + this.resetScrollbar(); + this.positionSlots(); + + this.lastScrollValue = this.scrollbar.getCurrentScroll(); + } + + @Override + protected void updateBeforeRender() { + super.updateBeforeRender(); + + int currentScroll = this.scrollbar.getCurrentScroll(); + if (currentScroll != this.lastScrollValue) { + this.lastScrollValue = currentScroll; + positionSlots(); + } + } + + private void positionSlots() { + int scroll = scrollbar.getCurrentScroll(); + int slotIndex = 0; + for (var slot : this.menu.TargetAEKeys) { + int row = slotIndex / COLUMNS; + int col = slotIndex % COLUMNS; + + int displayRow = (row - scroll) * 2; + + slot.setActive(displayRow >= 0 && displayRow < this.visibleRows); + slot.x = GUI_PADDING_X + col * SLOT_SIZE; + slot.y = GUI_HEADER_HEIGHT + 1 + (displayRow + 1) * ROW_HEIGHT; + slotIndex++; + } + } + + private void reinitialize() { + this.children().removeAll(this.renderables); + this.renderables.clear(); + this.init(); + } + + private void toggleTerminalStyle(SettingToggleButton btn, boolean backwards) { + TerminalStyle next = btn.getNextValue(backwards); + AEConfig.instance().setTerminalStyle(next); + btn.set(next); + this.reinitialize(); + } + + private void resetScrollbar() { + scrollbar.setHeight(this.visibleRows * ROW_HEIGHT - 2); + + int totalRows = (this.menu.TargetAEKeys.length + COLUMNS - 1) / COLUMNS; + scrollbar.setRange(0, totalRows - this.visibleRows, 2); + } + + @Override + public void drawBG(GuiGraphics guiGraphics, int offsetX, int offsetY, int mouseX, + int mouseY, float partialTicks) { + blit(guiGraphics, offsetX, offsetY, HEADER_BBOX); + int currentY = offsetY + GUI_HEADER_HEIGHT; + + blit(guiGraphics, offsetX, currentY + this.visibleRows * ROW_HEIGHT, FOOTER_BBOX); + + int scrollbarRow = scrollbar.getCurrentScroll(); + Font font = this.getMinecraft().font; + for (int i = 0; i < this.visibleRows / 2; ++i) { + boolean firstLine = i == 0; + boolean lastLine = i == this.visibleRows / 2 - 1; + + Rect2i bbox = selectRowBackgroundBox(firstLine, lastLine); + blit(guiGraphics, offsetX, currentY, bbox); + guiGraphics.drawString(font, Component.translatable(REPLACEMENT_LIST_NAME, scrollbarRow + i + 1), offsetX + 12, currentY + 9 - font.lineHeight / 2, ChatFormatting.BLACK.getColor(), false); + + var firstValidItem = this.menu.getFirstItemAtRow(scrollbarRow + i); + if (firstValidItem != -1) { + int highlightX = offsetX + 8 + firstValidItem * SLOT_SIZE; + int highlightY = currentY + ROW_HEIGHT + 1; + var rect = new Rect2i(highlightX, highlightY, 16, 16); + fillRect(guiGraphics, rect, 0x80aaaaFF); + } + + currentY += ROW_HEIGHT * 2; + } + } + + private void blit(GuiGraphics guiGraphics, int offsetX, int offsetY, Rect2i srcRect) { + var texture = AppEng.makeId("textures/guis/patternaccessterminal.png"); + guiGraphics.blit(texture, offsetX, offsetY, srcRect.getX(), srcRect.getY(), srcRect.getWidth(), + srcRect.getHeight()); + } + + private Rect2i selectRowBackgroundBox(boolean firstLine, boolean lastLine) { + if (firstLine) { + return ROW_INVENTORY_TOP_BBOX; + } else if (lastLine) { + return ROW_INVENTORY_BOTTOM_BBOX; + } else { + return ROW_INVENTORY_MIDDLE_BBOX; + } + } +} diff --git a/src/main/java/com/gtocore/integration/ae/client/AESearchPatternProviderListBox.java b/src/main/java/com/gtocore/integration/ae/client/AESearchPatternProviderListBox.java new file mode 100644 index 000000000..ed845df68 --- /dev/null +++ b/src/main/java/com/gtocore/integration/ae/client/AESearchPatternProviderListBox.java @@ -0,0 +1,180 @@ +package com.gtocore.integration.ae.client; + +import com.gtocore.integration.ae.hooks.IExtendedPatternEncodingTerm; +import com.gtocore.integration.jech.PinYinUtils; + +import com.gtolib.api.ae2.gui.widgets.AEListBox; +import com.gtolib.utils.holder.IntHolder; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.renderer.Rect2i; +import net.minecraft.network.chat.Component; + +import appeng.api.client.AEKeyRendering; +import appeng.api.implementations.blockentities.PatternContainerGroup; +import appeng.api.stacks.AEKey; +import appeng.client.Point; +import appeng.client.gui.AEBaseScreen; +import appeng.client.gui.Tooltip; +import appeng.client.gui.widgets.AETextField; +import appeng.core.localization.GuiText; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +public class AESearchPatternProviderListBox extends AEListBox { + + Int2ObjectMap searchMap = new Int2ObjectOpenHashMap<>(); + final IntHolder maxWidth = new IntHolder(0); + IExtendedPatternEncodingTerm term; + AETextField searchField; + List allItems = new ArrayList<>(); + + public AESearchPatternProviderListBox(AEBaseScreen screen) { + super(screen); + term = (IExtendedPatternEncodingTerm) screen; + searchField = new AETextField(screen.getStyle(), Minecraft.getInstance().font, 0, -20, 100, 12) { + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (button == 1 && this.isMouseOver(mouseX, mouseY)) { + setValue(""); + } + return super.mouseClicked(mouseX, mouseY, button); + } + }; + searchField.setPlaceholder(GuiText.SearchPlaceholder.text()); + searchField.setResponder(value -> updateSearch()); + } + + @Override + public void updateBeforeRender() { + searchField.setX(getX() + getGuiLeft()); + searchField.setY(getY() + getGuiTop() - 14); + searchField.setWidth(getBounds().getWidth()); + super.updateBeforeRender(); + } + + @Override + public void setVisible(boolean b) { + super.setVisible(b); + searchField.setVisible(b); + } + + @Override + public void populateScreen(Consumer addWidget, Rect2i bounds, AEBaseScreen screen) { + super.populateScreen(addWidget, bounds, screen); + addWidget.accept(searchField); + } + + @Override + public void addExclusionZones(List exclusionZones, Rect2i screenBounds) { + super.addExclusionZones(exclusionZones, screenBounds); + exclusionZones.add(new Rect2i(getX() + getGuiLeft(), getY() - 14 + getGuiTop(), width(), 12)); + } + + public void reset() { + maxWidth.value = 0; + getScrollbar().setCurrentScroll(0); + this.clearItems(); + searchMap.clear(); + allItems.clear(); + searchField.setValue(""); + } + + public void addPatternContainerGroup(PatternContainerGroup group, int index) { + String nameStr = group.name().getString().toLowerCase(); + searchMap.put(index, nameStr); + int nameWidth = Minecraft.getInstance().font.width(group.name()); + if (nameWidth > maxWidth.value) { + maxWidth.value = nameWidth; + } + SimpleItem item = new SimpleItem(group, index); + allItems.add(item); + this.addItem(item); + } + + private void updateSearch() { + String searchText = searchField.getValue().toLowerCase(); + this.clearItems(); + for (SimpleItem item : allItems) { + String name = searchMap.get(item.index); + if (PinYinUtils.match(name, searchText)) { + this.addItem(item); + item.setVisible(true); + } else { + item.setVisible(false); + } + } + } + + class SimpleItem implements ListItem { + + boolean visible = true; + Point position = new Point(0, 0); + int index; + AEKey icon; + Component name; + + SimpleItem(PatternContainerGroup group, int index) { + this.index = index; + this.icon = group.icon(); + this.name = group.name(); + } + + @Override + public void setVisible(boolean visible) { + this.visible = visible; + } + + @Override + public void setPosition(Point position) { + this.position = position; + } + + @Override + public Rect2i getBounds() { + return new Rect2i(position.getX(), position.getY(), maxWidth.value + 18, 18); + } + + @Override + public void drawForegroundLayer(GuiGraphics guiGraphics, Rect2i bounds, Point mouse) { + if (visible) { + var font = Minecraft.getInstance().font; + var alpha = getBounds().contains(mouse.getX(), mouse.getY()) ? 0xff : 0xcc; + guiGraphics.fill(bounds.getX(), bounds.getY(), bounds.getX() + bounds.getWidth(), bounds.getY() + bounds.getHeight(), 0x7777aa | (alpha << 24)); + if (icon != null) { + AEKeyRendering.drawInGui(Minecraft.getInstance(), guiGraphics, bounds.getX() + 1, bounds.getY() + 1, icon); + } + guiGraphics.drawString(font, name, bounds.getX() + 18, bounds.getY() + (9 - font.lineHeight / 2), 0xFFFFFF); + } + } + + @Override + public boolean onMouseUp(Point mousePos, int button) { + if (!visible || !getBounds().contains(mousePos.getX(), mousePos.getY())) { + return false; // Ignore clicks outside the item bounds + } + switch (button) { + case 0, 1 -> term.gto$getMenu().gtolib$sendPattern(index); + // copies the tag + // to clipboard + default -> { + return false; // Other buttons do nothing + } + } + AESearchPatternProviderListBox.this.setVisible(false); + return true; // Indicate that the click was handled + } + + @Override + public Tooltip getTooltip(int mouseX, int mouseY) { + return new Tooltip(Component.translatable("gtocore.ae.appeng.craft.encode_send.desc")); + } + } +} diff --git a/src/main/java/com/gtocore/integration/ae/hooks/ICraftAmountMenu.java b/src/main/java/com/gtocore/integration/ae/hooks/ICraftAmountMenu.java new file mode 100644 index 000000000..cb3c89411 --- /dev/null +++ b/src/main/java/com/gtocore/integration/ae/hooks/ICraftAmountMenu.java @@ -0,0 +1,31 @@ +package com.gtocore.integration.ae.hooks; + +import net.minecraft.server.level.ServerPlayer; + +import appeng.api.stacks.KeyCounter; +import appeng.menu.MenuOpener; +import appeng.menu.locator.MenuLocator; +import appeng.menu.me.crafting.CraftAmountMenu; + +public interface ICraftAmountMenu { + + /** + * Opens the craft amount screen for the given player. + * This method allows multiple items to be crafted as a composite request. + */ + static void open(ServerPlayer player, MenuLocator locator, KeyCounter whatToCraft, long initialAmount) { + if (whatToCraft.isEmpty()) { + return; + } + MenuOpener.open(CraftAmountMenu.TYPE, player, locator); + + if (player.containerMenu instanceof ICraftAmountMenu cca) { + cca.gto$setWhatToCraft(whatToCraft, initialAmount); + cca.broadcastChanges(); + } + } + + void broadcastChanges(); + + void gto$setWhatToCraft(KeyCounter whatToCraft, long initialAmount); +} diff --git a/src/main/java/com/gtocore/integration/ae/hooks/IExtendedPatternContainer.java b/src/main/java/com/gtocore/integration/ae/hooks/IExtendedPatternContainer.java new file mode 100644 index 000000000..1e6096b18 --- /dev/null +++ b/src/main/java/com/gtocore/integration/ae/hooks/IExtendedPatternContainer.java @@ -0,0 +1,126 @@ +package com.gtocore.integration.ae.hooks; + +import com.gtocore.common.data.GTORecipeTypes; + +import com.gtolib.api.blockentity.IDirectionCacheBlockEntity; + +import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.recipe.GTRecipeType; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; + +import appeng.blockentity.crafting.MolecularAssemblerBlockEntity; +import appeng.helpers.patternprovider.PatternContainer; +import com.glodblock.github.extendedae.common.tileentities.TileExMolecularAssembler; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +public interface IExtendedPatternContainer extends PatternContainer { + + @Nullable + default GTRecipeType gto$getRecipeType() { + return null; + } + + @Nullable + default Collection gto$getRecipeTypes() { + return null; + } + + default Set getSupportedRecipeTypes() { + if (gto$getRecipeType() == null || + gto$getRecipeType() == GTORecipeTypes.DUMMY_RECIPES || + gto$getRecipeType() == GTORecipeTypes.HATCH_COMBINED) { + var recipeTypes = gto$getRecipeTypes(); + return recipeTypes != null ? Set.copyOf(recipeTypes) : Collections.emptySet(); + } else if (gto$getRecipeType() != null) { + return Collections.singleton(gto$getRecipeType()); + } + return Collections.emptySet(); + } + + default boolean gto$isCraftingContainer() { + return false; + } + + default boolean hasEmptyPatternSlot() { + var inv = getTerminalPatternInventory(); + for (int slot = 0; slot < inv.size(); slot++) { + if (inv.getStackInSlot(slot).isEmpty()) { + return true; + } + } + return false; + } + + default boolean isOutOfService() { + return getGrid() == null; + } + + interface IPPPC extends IExtendedPatternContainer { + + Level gto$getLevel(); + + BlockPos gto$getBlockPos(); + + BlockEntity gto$getBlockEntity(); + + EnumSet gto$getPushDirection(); + } + + static BlockEntity getPushBlockEntity(IPPPC be) { + var cache = IDirectionCacheBlockEntity.getBlockEntityDirectionCache(be.gto$getBlockEntity()); + var pos = be.gto$getBlockPos(); + + for (var direction : be.gto$getPushDirection()) { + var adjBe = cache.getAdjacentBlockEntity(be.gto$getLevel(), pos, direction); + if (adjBe != null) { + return adjBe; + } + } + return null; + } + + static boolean gto$isCraftingContainer(IPPPC self) { + var adjBe = IExtendedPatternContainer.getPushBlockEntity(self); + return adjBe instanceof MolecularAssemblerBlockEntity || adjBe instanceof TileExMolecularAssembler; + } + + static GTRecipeType gto$getRecipeType(IPPPC self) { + var adjBe = IExtendedPatternContainer.getPushBlockEntity(self); + if (!(adjBe instanceof MetaMachineBlockEntity mmbe)) { + return null; + } + MetaMachine mm = mmbe.getMetaMachine(); + if (mm instanceof IMultiPart partMachine) { + return partMachine.getController() instanceof IRecipeLogicMachine rlm ? rlm.getRecipeType() : null; + } + + if (mm instanceof IRecipeLogicMachine rlm) { + return rlm.getRecipeType(); + } + + return null; + } + + @Nullable + static List gto$getRecipeTypes(IPPPC self) { + var adjBe = IExtendedPatternContainer.getPushBlockEntity(self); + if (adjBe instanceof IMultiPart partMachine) { + return partMachine.getController() instanceof IRecipeLogicMachine rlm ? Arrays.asList(rlm.getRecipeTypes()) : null; + } + + if (adjBe instanceof IRecipeLogicMachine rlm) { + return Arrays.asList(rlm.getRecipeTypes()); + } + + return null; + } +} diff --git a/src/main/java/com/gtocore/integration/ae/hooks/IExtendedPatternEncodingTerm.java b/src/main/java/com/gtocore/integration/ae/hooks/IExtendedPatternEncodingTerm.java new file mode 100644 index 000000000..eac4a24e3 --- /dev/null +++ b/src/main/java/com/gtocore/integration/ae/hooks/IExtendedPatternEncodingTerm.java @@ -0,0 +1,21 @@ +package com.gtocore.integration.ae.hooks; + +import com.gtocore.integration.ae.client.AESearchPatternProviderListBox; + +import appeng.client.gui.widgets.ActionButton; + +public interface IExtendedPatternEncodingTerm { + + AESearchPatternProviderListBox gto$getPatternDestDisplay(); + + IExtendedPatternEncodingTerm.Menu gto$getMenu(); + + ActionButton gto$getEncodeButton(); + + interface Menu { + + void gtolib$sendPattern(int index); + + void gtolib$sendEncodeRequest(); + } +} diff --git a/src/main/java/com/gtocore/integration/ae/hooks/IMouseNoRedirection.java b/src/main/java/com/gtocore/integration/ae/hooks/IMouseNoRedirection.java new file mode 100644 index 000000000..33dad3b17 --- /dev/null +++ b/src/main/java/com/gtocore/integration/ae/hooks/IMouseNoRedirection.java @@ -0,0 +1,10 @@ +package com.gtocore.integration.ae.hooks; + +public interface IMouseNoRedirection { + + default boolean gtocore$shouldRedirectMouse() { + return false; + } + + default void setRedirectMouse(boolean redirect) {} +} diff --git a/src/main/java/com/gtocore/integration/ae/hooks/ITemporaryCraftableService.java b/src/main/java/com/gtocore/integration/ae/hooks/ITemporaryCraftableService.java new file mode 100644 index 000000000..5b32bbd99 --- /dev/null +++ b/src/main/java/com/gtocore/integration/ae/hooks/ITemporaryCraftableService.java @@ -0,0 +1,10 @@ +package com.gtocore.integration.ae.hooks; + +import appeng.api.crafting.IPatternDetails; + +public interface ITemporaryCraftableService { + + IPatternDetails gto$getTempPatternDetails(); + + void gto$setTempPatternDetails(IPatternDetails patternDetails); +} diff --git a/src/main/java/com/gtocore/integration/ae/search/EnglishSearchPredicate.kt b/src/main/java/com/gtocore/integration/ae/search/EnglishSearchPredicate.kt deleted file mode 100644 index 4aa100eea..000000000 --- a/src/main/java/com/gtocore/integration/ae/search/EnglishSearchPredicate.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.gtocore.integration.ae.search - -import com.gtocore.client.forge.GTOComponentHandler.englishLanguage - -import net.minecraft.network.chat.Component -import net.minecraft.network.chat.MutableComponent -import net.minecraft.network.chat.contents.TranslatableContents - -import appeng.menu.me.common.GridInventoryEntry - -import java.util.* -import java.util.function.Predicate - -@JvmRecord -data class EnglishSearchPredicate(val term: String?) : Predicate { - override fun test(gridInventoryEntry: GridInventoryEntry?): Boolean { - englishLanguage ?: return false - val entryInfo = gridInventoryEntry!!.what - val displayName: MutableComponent = entryInfo!!.displayName as? MutableComponent - ?: return false - val foundIds = mutableListOf() - findAllTranslatableComponent(displayName, foundIds) - for (id in foundIds) { - val translated = englishLanguage?.getOrDefault(id, entryInfo.displayName.string) - if (translated != null && translated.lowercase(Locale.getDefault()) - .contains(term!!.lowercase(Locale.getDefault())) - ) { - return true - } - } - return false - } -} - -fun findAllTranslatableComponent(component: Component, foundIds: MutableList) { - if (component is MutableComponent) { - if (component.contents is TranslatableContents) { - val content: TranslatableContents = component.contents as TranslatableContents - foundIds.add(content.key) - for (arg in content.args) { - if (arg is Component) { - findAllTranslatableComponent(arg, foundIds) - } - } - } - } - for (sibling in component.siblings) { - findAllTranslatableComponent(sibling, foundIds) - } -} diff --git a/src/main/java/com/gtocore/integration/ae/wireless/WirelessGrid.kt b/src/main/java/com/gtocore/integration/ae/wireless/WirelessGrid.kt index a06ef3d3a..dfaf3d62f 100644 --- a/src/main/java/com/gtocore/integration/ae/wireless/WirelessGrid.kt +++ b/src/main/java/com/gtocore/integration/ae/wireless/WirelessGrid.kt @@ -82,7 +82,7 @@ class WirelessGrid( connectionHolderPool.addAll(newConnections) val stats = topologyManager.getNetworkStats() - if (GTOConfig.INSTANCE.aeLog) { + if (GTOConfig.INSTANCE.devMode.aeLog) { println( "Grid '$name' topology rebuilt: ${stats.totalNodes} nodes, " + "${stats.totalClusters} clusters, ${stats.totalConnections} connections, " + @@ -103,9 +103,9 @@ class WirelessGrid( val newConnections = topologyManager.addNode(machine) connectionHolderPool.addAll(newConnections) - if (GTOConfig.INSTANCE.aeLog) println("Added node ${machine.self().pos} to grid '$name', ${newConnections.size} new connections") + if (GTOConfig.INSTANCE.devMode.aeLog) println("Added node ${machine.self().pos} to grid '$name', ${newConnections.size} new connections") } catch (e: Exception) { - if (GTOConfig.INSTANCE.aeLog) println("Failed to add node to topology: ${e.message}") + if (GTOConfig.INSTANCE.devMode.aeLog) println("Failed to add node to topology: ${e.message}") refreshConnectionPool() } } @@ -117,9 +117,9 @@ class WirelessGrid( affectedConnections.contains(connection) } - if (GTOConfig.INSTANCE.aeLog) println("Removed node ${machine.self().pos} from grid '$name'") + if (GTOConfig.INSTANCE.devMode.aeLog) println("Removed node ${machine.self().pos} from grid '$name'") } catch (e: Exception) { - if (GTOConfig.INSTANCE.aeLog) println("Failed to remove node from topology: ${e.message}") + if (GTOConfig.INSTANCE.devMode.aeLog) println("Failed to remove node from topology: ${e.message}") refreshConnectionPool() } } @@ -127,7 +127,7 @@ class WirelessGrid( // 网络降级 private fun fallbackToSimpleConnections() { - if (GTOConfig.INSTANCE.aeLog) println("Grid '$name' topology rebuild failed, falling back to simple connections") + if (GTOConfig.INSTANCE.devMode.aeLog) println("Grid '$name' topology rebuild failed, falling back to simple connections") connectionPool.windowed(2).forEach { windowedNodes -> try { val first = windowedNodes[0] diff --git a/src/main/java/com/gtocore/integration/ae/wireless/WirelessMachine.java b/src/main/java/com/gtocore/integration/ae/wireless/WirelessMachine.java index 722b0a8fb..295220c06 100644 --- a/src/main/java/com/gtocore/integration/ae/wireless/WirelessMachine.java +++ b/src/main/java/com/gtocore/integration/ae/wireless/WirelessMachine.java @@ -37,6 +37,9 @@ public interface WirelessMachine extends IGridConnectedMachine, ISync, IBindable @RegisterLanguage(cn = "当前连接到 : %s", en = "Currently connected: %s") String currentlyConnectedTo = "gtocore.integration.ae.WirelessMachine.currentlyConnectedTo"; + @RegisterLanguage(cn = "无", en = "None") + String none = "gtocore.integration.ae.WirelessMachine.notConnected"; + @RegisterLanguage(cn = "创建网络", en = "Create Grid") String createGrid = "gtocore.integration.ae.WirelessMachine.createGrid"; diff --git a/src/main/java/com/gtocore/integration/ae/wireless/WirelessMachineUI.kt b/src/main/java/com/gtocore/integration/ae/wireless/WirelessMachineUI.kt index 986956780..0bedf2ffa 100644 --- a/src/main/java/com/gtocore/integration/ae/wireless/WirelessMachineUI.kt +++ b/src/main/java/com/gtocore/integration/ae/wireless/WirelessMachineUI.kt @@ -5,6 +5,7 @@ import com.gtocore.common.saved.WirelessSavedData import com.gtocore.config.GTOConfig import com.gtocore.integration.ae.wireless.WirelessMachine.* +import net.minecraft.ChatFormatting import net.minecraft.client.gui.GuiGraphics import net.minecraft.network.chat.Component @@ -31,7 +32,6 @@ fun getSetupFancyUIProvider(self: WirelessMachine): IFancyUIProvider = object : override fun createMainPage(p0: FancyMachineUIWidget?): Widget { return rootFresh(176, 166) { - if (GTOConfig.INSTANCE.aeLog) println(1) // 移除页面打开即同步,避免触发刷新循环;改为由机器加载与按钮操作驱动同步 hBox(height = availableHeight, { spacing = 4 }) { blank() @@ -46,7 +46,7 @@ fun getSetupFancyUIProvider(self: WirelessMachine): IFancyUIProvider = object : } textBlock( maxWidth = availableWidth - 4, - textSupplier = { Component.translatable(player, self.self().playerOwner?.name ?: "无") }, + textSupplier = { Component.translatable(player, self.self().playerOwner?.name ?: Component.translatable(none)) }, ) textBlock( maxWidth = availableWidth - 4, @@ -54,7 +54,14 @@ fun getSetupFancyUIProvider(self: WirelessMachine): IFancyUIProvider = object : val id = self.wirelessMachinePersisted0.gridConnectedName val nick = self.wirelessMachineRunTime0.gridCache.get().firstOrNull { it.name == id }?.nickname - Component.translatable(currentlyConnectedTo, (nick ?: id).ifEmpty { "无" }) + + Component.translatable( + currentlyConnectedTo, + (nick ?: id) + .takeIf(String::isNotEmpty) + ?. let(Component::literal) + ?: Component.translatable(none).withStyle(ChatFormatting.RED), + ) }, ) // 重新加入“创建网络”输入与按钮 diff --git a/src/main/java/com/gtocore/integration/apotheosis/BedrockMineRestoreAffix.java b/src/main/java/com/gtocore/integration/apotheosis/BedrockMineRestoreAffix.java index f61585312..7456ba1a9 100644 --- a/src/main/java/com/gtocore/integration/apotheosis/BedrockMineRestoreAffix.java +++ b/src/main/java/com/gtocore/integration/apotheosis/BedrockMineRestoreAffix.java @@ -16,6 +16,7 @@ import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.util.FakePlayer; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -26,6 +27,7 @@ import java.util.Map; +import static com.gregtechceu.gtceu.api.data.worldgen.bedrockore.BedrockOreVeinSavedData.MAXIMUM_VEIN_OPERATIONS; import static net.minecraftforge.common.Tags.Blocks.ORES; @DataGeneratorScanned @@ -35,6 +37,8 @@ public class BedrockMineRestoreAffix extends NumeralStatsAffix { private static final String DESC = "affix.gtocore.bedrock_mine_restore.desc"; @RegisterLanguage(cn = "每次开采矿石可以在当前区块勘探出相当于一般储量%s‰的额外基岩流体矿脉储量", en = "Each time you mine ore, you can explore an additional bedrock fluid vein reserve equivalent to %s‰ of the average reserve in the current chunk") private static final String FLUID_DESC = "affix.gtocore.bedrock_mine_restore.fluid.desc"; + @RegisterLanguage(cn = "(最高可达%s%%)", en = "(At most %s%%)") + private static final String AT_MOST = "affix.gtocore.bedrock_mine_restore.at_most.desc"; public static final Codec CODEC = RecordCodecBuilder.create(inst -> inst .group( GemBonus.VALUES_CODEC.fieldOf("values").forGetter(BedrockMineRestoreAffix::getValues), @@ -52,7 +56,10 @@ public BedrockMineRestoreAffix(Map values, boolean isF @Override public MutableComponent getDescription(ItemStack stack, LootRarity rarity, float level) { var desc = this.isFluidMode ? FLUID_DESC : DESC; - return Component.translatable(desc, FormattingUtil.formatNumber2Places(this.getBuff(rarity, level) * 0.01)); + float maxBuff = this.getBuff(rarity, level); + var maxRestore = Math.max(1.0f, maxBuff * 0.035f); + return Component.translatable(desc, FormattingUtil.formatNumber2Places(this.getBuff(rarity, level) * 0.01)) + .append(Component.translatable(AT_MOST, FormattingUtil.formatNumber2Places(maxRestore * 100))); } @Override @@ -63,16 +70,22 @@ public Codec getCo @Override public void onBlockBreak(ItemStack stack, LootRarity rarity, float level, Player player, LevelAccessor world, BlockPos pos, BlockState state) { if (world instanceof ServerLevel serverLevel && state.is(ORES)) { + float efficiency = (player instanceof FakePlayer) ? 0.05f : 1.0f; ChunkPos chunkPos = new ChunkPos(pos); + float maxBuff = this.getBuff(rarity, level); + var maxRestore = MAXIMUM_VEIN_OPERATIONS * Math.max(1.0f, maxBuff * 0.035f); + if (this.isFluidMode) { var data = BedrockFluidVeinSavedData.getOrCreate(serverLevel); - if (data.getFluidVeinWorldEntry(chunkPos.x, chunkPos.z).getDefinition() != null) { - data.depleteVein(chunkPos.x, chunkPos.z, -Math.round(this.getBuff(rarity, level)), true); + if (data.getFluidVeinWorldEntry(chunkPos.x, chunkPos.z).getDefinition() != null && + data.getFluidVeinWorldEntry(chunkPos.x, chunkPos.z).getOperationsRemaining() < maxRestore) { + data.depleteVein(chunkPos.x, chunkPos.z, -Math.round(this.getBuff(rarity, level) * efficiency), true); } } else { var data = BedrockOreVeinSavedData.getOrCreate(serverLevel); - if (data.getOreVeinWorldEntry(chunkPos.x, chunkPos.z).getDefinition() != null) { - data.depleteVein(chunkPos.x, chunkPos.z, -Math.round(this.getBuff(rarity, level)), true); + if (data.getOreVeinWorldEntry(chunkPos.x, chunkPos.z).getDefinition() != null && + data.getOreVeinWorldEntry(chunkPos.x, chunkPos.z).getOperationsRemaining() < maxRestore) { + data.depleteVein(chunkPos.x, chunkPos.z, -Math.round(this.getBuff(rarity, level) * efficiency), true); } } } diff --git a/src/main/java/com/gtocore/integration/emi/GTAe2PatternTerminalHandler.java b/src/main/java/com/gtocore/integration/emi/GTAe2PatternTerminalHandler.java index 7a521c313..049eec04b 100644 --- a/src/main/java/com/gtocore/integration/emi/GTAe2PatternTerminalHandler.java +++ b/src/main/java/com/gtocore/integration/emi/GTAe2PatternTerminalHandler.java @@ -138,6 +138,9 @@ public boolean craft(EmiRecipe recipe, EmiCraftContext context) { } else { if (recipe instanceof GTEMIRecipe gtemiRecipe && RecipeBuilder.RECIPE_MAP.containsKey(gtemiRecipe.getId())) { ((IPatterEncodingTermMenu) menu).gtolib$addRecipe(gtemiRecipe.getId().toString()); + } else if (recipe instanceof EmiCookingRecipe) { + ((IPatterEncodingTermMenu) menu).gtolib$addRecipe("gtceu:electric_furnace/"); + } else { ((IPatterEncodingTermMenu) menu).gtolib$addRecipe(""); } diff --git a/src/main/java/com/gtocore/integration/emi/GTEMIPlugin.java b/src/main/java/com/gtocore/integration/emi/GTEMIPlugin.java index 33b6d9afd..b010e94c1 100644 --- a/src/main/java/com/gtocore/integration/emi/GTEMIPlugin.java +++ b/src/main/java/com/gtocore/integration/emi/GTEMIPlugin.java @@ -45,6 +45,9 @@ import appeng.menu.me.items.PatternEncodingTermMenu; import com.arsmeteorites.arsmeteorites.ArsMeteorites; import com.arsmeteorites.arsmeteorites.emi.MeteoritesEmiPlugin; +import com.glodblock.github.extendedae.container.ContainerExCraftingTerminal; +import com.glodblock.github.extendedae.xmod.jei.JEIPlugin; +import com.glodblock.github.extendedae.xmod.jei.transfer.ExCraftingTransferHandler; import com.hollingsworth.arsnouveau.client.jei.JEIArsNouveauPlugin; import com.lowdragmc.lowdraglib.LDLib; import com.lowdragmc.lowdraglib.emi.EMIPlugin; @@ -143,6 +146,7 @@ public void register(EmiRegistry registry) { registry.addRecipeHandler(WCTMenu.TYPE, new EmiUseCraftingRecipeHandler<>(WCTMenu.class)); registry.addRecipeHandler(WETMenu.TYPE, new EmiEncodePatternHandler<>(WETMenu.class)); registry.addRecipeHandler(PatternEncodingTermMenu.TYPE, new EmiEncodePatternHandler<>(PatternEncodingTermMenu.class)); + registry.addRecipeHandler(ContainerExCraftingTerminal.TYPE, new XModTransferHandlers.ExCraftingTransferHandler<>(ContainerExCraftingTerminal.class)); registry.addCategory(GTProgrammedCircuitCategory.CATEGORY); GTRecipeEMICategory.registerDisplays(registry); diff --git a/src/main/java/com/gtocore/integration/emi/GTEmiEncodingHelper.java b/src/main/java/com/gtocore/integration/emi/GTEmiEncodingHelper.java index 4336832fe..a66d64021 100644 --- a/src/main/java/com/gtocore/integration/emi/GTEmiEncodingHelper.java +++ b/src/main/java/com/gtocore/integration/emi/GTEmiEncodingHelper.java @@ -34,7 +34,7 @@ import java.util.stream.IntStream; import java.util.stream.Stream; -public class GTEmiEncodingHelper { // also accessed by gtolib +public class GTEmiEncodingHelper { @Nullable private static GenericStack ofVirtual(EmiStack stack, long amount) { diff --git a/src/main/java/com/gtocore/integration/emi/XModTransferHandlers.java b/src/main/java/com/gtocore/integration/emi/XModTransferHandlers.java new file mode 100644 index 000000000..dcb262fbb --- /dev/null +++ b/src/main/java/com/gtocore/integration/emi/XModTransferHandlers.java @@ -0,0 +1,161 @@ +package com.gtocore.integration.emi; + +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.core.NonNullList; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.*; + +import appeng.core.localization.ItemModText; +import appeng.integration.modules.emi.AbstractRecipeHandler; +import appeng.integration.modules.emi.EmiUseCraftingRecipeHandler; +import appeng.util.CraftingRecipeUtil; +import com.glodblock.github.extendedae.api.CraftingMode; +import com.glodblock.github.extendedae.container.ContainerExCraftingTerminal; +import com.glodblock.github.extendedae.network.EPPNetworkHandler; +import com.glodblock.github.extendedae.xmod.jei.transfer.ExCraftingHelper; +import com.glodblock.github.glodium.network.packet.CGenericPacket; +import com.google.common.collect.ImmutableSet; +import dev.emi.emi.api.recipe.EmiRecipe; +import dev.emi.emi.api.recipe.EmiRecipeCategory; +import dev.emi.emi.api.recipe.VanillaEmiRecipeCategories; +import dev.emi.emi.api.stack.EmiStack; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +public class XModTransferHandlers { + + public static class ExCraftingTransferHandler extends AbstractRecipeHandler { + + ImmutableSet supportedCategories = ImmutableSet.of( + VanillaEmiRecipeCategories.CRAFTING, + VanillaEmiRecipeCategories.STONECUTTING, + VanillaEmiRecipeCategories.SMITHING, + VanillaEmiRecipeCategories.ANVIL_REPAIRING); + + public ExCraftingTransferHandler(Class containerClass) { + super(containerClass); + } + + @Override + public boolean supportsRecipe(EmiRecipe recipe) { + // For actual crafting, we only support normal crafting recipes + return supportedCategories.contains(recipe.getCategory()); + } + + @Override + public Result transferRecipe(T container, @Nullable Recipe obj, EmiRecipe emiRecipe, boolean doTransfer) { + if (obj instanceof Recipe recipe) { + var type = recipe.getType(); + boolean craftMissing = AbstractContainerScreen.hasControlDown(); + if (type == RecipeType.CRAFTING) { + return this.transferCraft(container, recipe, emiRecipe, doTransfer); + } + if (type == RecipeType.STONECUTTING) { + return this.handlerRecipe(recipe, CraftingMode.STONECUTTER, getGuiSlotToIngredientMapPlain(recipe), container, 1, doTransfer, craftMissing); + } + if (type == RecipeType.SMITHING) { + return this.handlerRecipe(recipe, CraftingMode.SMITHING, getGuiSlotToIngredientMapPlain(recipe), container, 3, doTransfer, craftMissing); + } + } + return Result.createFailed(ItemModText.INCOMPATIBLE_RECIPE.text()); + } + + private Result transferCraft(T menu, Recipe recipeBase, EmiRecipe emiRecipe, boolean doTransfer) { + // Recipe displays can be based on anything. Not just Recipe + Recipe recipe = null; + if (recipeBase instanceof Recipe) { + recipe = recipeBase; + } + + boolean craftingRecipe = isCraftingRecipe(recipe, emiRecipe); + if (!craftingRecipe) { + return Result.createNotApplicable(); + } + + if (!fitsIn3x3Grid(recipe, emiRecipe)) { + return Result.createFailed(ItemModText.RECIPE_TOO_LARGE.text()); + } + + if (recipe == null) { + if (emiRecipe != null) { + recipe = createFakeRecipe(emiRecipe); + } + } + + // Find missing ingredient + var slotToIngredientMap = getGuiSlotToIngredientMap(recipe); + var missingSlots = menu.findMissingIngredients(slotToIngredientMap); + + if (missingSlots.missingSlots().size() == slotToIngredientMap.size()) { + // All missing, can't do much... + return Result.createFailed(ItemModText.NO_ITEMS.text(), missingSlots.missingSlots()); + } + + if (doTransfer) { + this.switchMode(CraftingMode.CRAFTING); + // Thank you RS for pioneering this amazing feature! :) + boolean craftMissing = AbstractContainerScreen.hasControlDown(); + ExCraftingHelper.performTransfer(menu, recipe, 9, craftMissing); + } else { + if (missingSlots.anyMissingOrCraftable()) { + // Highlight the slots with missing ingredients + return new Result.PartiallyCraftable(missingSlots); + } + } + + // No error + return Result.createSuccessful(); + } + + private Recipe createFakeRecipe(EmiRecipe display) { + var ingredients = NonNullList.withSize(CRAFTING_GRID_WIDTH * CRAFTING_GRID_HEIGHT, + Ingredient.EMPTY); + + for (int i = 0; i < Math.min(display.getInputs().size(), ingredients.size()); i++) { + var ingredient = Ingredient.of(display.getInputs().get(i).getEmiStacks().stream() + .map(EmiStack::getItemStack) + .filter(is -> !is.isEmpty())); + ingredients.set(i, ingredient); + } + + return new ShapedRecipe(ResourceLocation.fromNamespaceAndPath("c", "null"), "", CraftingBookCategory.MISC, CRAFTING_GRID_WIDTH, + CRAFTING_GRID_HEIGHT, ingredients, ItemStack.EMPTY); + } + + private Result handlerRecipe(Recipe recipe, CraftingMode mode, Map slotToIngredientMap, T menu, int recipeSize, boolean doTransfer, boolean craftMissing) { + var missingSlots = menu.findMissingIngredients(slotToIngredientMap); + if (missingSlots.missingSlots().size() == slotToIngredientMap.size()) { + return new Result.PartiallyCraftable(missingSlots); + } + // Find missing ingredients and highlight the slots which have these + if (doTransfer) { + this.switchMode(mode); + ExCraftingHelper.performTransfer(menu, recipe, recipeSize, craftMissing); + if (mode == CraftingMode.STONECUTTER) { + EPPNetworkHandler.INSTANCE.sendToServer(new CGenericPacket("stonecutter_select", recipe.getId().toString())); + } + } + // No error + return Result.createSuccessful(); + } + + private void switchMode(CraftingMode mode) { + EPPNetworkHandler.INSTANCE.sendToServer(new CGenericPacket("set_mode", mode.ordinal())); + } + + private static Map getGuiSlotToIngredientMapPlain(Recipe recipe) { + var inputs = CraftingRecipeUtil.getIngredients(recipe); + Map ingredientMap = new HashMap<>(inputs.size()); + for (int i = 0; i < inputs.size(); i++) { + ingredientMap.put(i, inputs.get(i)); + } + return ingredientMap; + } + + private static Map getGuiSlotToIngredientMap(Recipe recipe) { + return EmiUseCraftingRecipeHandler.getGuiSlotToIngredientMap(recipe); + } + } +} diff --git a/src/main/java/com/gtocore/integration/emi/multipage/MultiblockInfoEmiRecipe.java b/src/main/java/com/gtocore/integration/emi/multipage/MultiblockInfoEmiRecipe.java index f560fd553..2c588426c 100644 --- a/src/main/java/com/gtocore/integration/emi/multipage/MultiblockInfoEmiRecipe.java +++ b/src/main/java/com/gtocore/integration/emi/multipage/MultiblockInfoEmiRecipe.java @@ -58,7 +58,7 @@ public MultiblockInfoEmiRecipe(MultiblockMachineDefinition definition) { super(() -> MULTIBLOCK); this.definition = definition; widget = () -> PatternPreview.getPatternWidget(this, definition); - Consumer> action = p -> inputs.add(new ListEmiIngredient(p.stream().map(EmiStack::of).toList(), 1)); + Consumer> action = p -> inputs.add(new ListEmiIngredient(p.stream().filter(Objects::nonNull).map(EmiStack::of).toList(), 1)); var file = new File(GTOCore.getFile(), "cache/multiblock/" + definition.getName() + "_parts"); if (file.exists() && file.canRead()) { FileUtils.loadFromFile(file, FileUtils.Deserialize.list(FileUtils.Deserialize.list(dis -> RegistriesUtils.getItem(RLUtils.SERIALIZER.deserialize(dis))))).forEach(action); diff --git a/src/main/java/com/gtocore/integration/ftbu/AreaShape.java b/src/main/java/com/gtocore/integration/ftbu/AreaShape.java index 8f7beddef..a9619a860 100644 --- a/src/main/java/com/gtocore/integration/ftbu/AreaShape.java +++ b/src/main/java/com/gtocore/integration/ftbu/AreaShape.java @@ -55,8 +55,8 @@ public String getName() { @Override public List getBlocks(ShapeContext context) { - if (NEIGHBOR_POSITIONS.range != GTOConfig.INSTANCE.ftbUltimineRange) { - NEIGHBOR_POSITIONS.update(GTOConfig.INSTANCE.ftbUltimineRange); + if (NEIGHBOR_POSITIONS.range != GTOConfig.INSTANCE.gamePlay.ftbUltimineRange) { + NEIGHBOR_POSITIONS.update(GTOConfig.INSTANCE.gamePlay.ftbUltimineRange); } Set known = new OrderedHashSet<>(); diff --git a/src/main/java/com/gtocore/integration/jade/GTOJadePlugin.java b/src/main/java/com/gtocore/integration/jade/GTOJadePlugin.java index 1b5236c7d..b3ecf141b 100644 --- a/src/main/java/com/gtocore/integration/jade/GTOJadePlugin.java +++ b/src/main/java/com/gtocore/integration/jade/GTOJadePlugin.java @@ -14,7 +14,6 @@ import com.gregtechceu.gtceu.common.data.GTMaterialItems; import com.gregtechceu.gtceu.integration.jade.provider.*; -import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; @@ -104,9 +103,6 @@ public void registerClient(IWailaClientRegistration registration) { registration.registerBlockComponent(AEItemAmountProvider.INSTANCE, Block.class); registration.registerEntityComponent(AEItemAmountProvider.INSTANCE, ItemEntity.class); - - registration.registerBlockComponent(EnLangProvider.INSTANCE, Block.class); - registration.registerEntityComponent(EnLangProvider.INSTANCE, Entity.class); } static { diff --git a/src/main/java/com/gtocore/integration/jade/provider/AEGridProvider.java b/src/main/java/com/gtocore/integration/jade/provider/AEGridProvider.java index 00293956c..6c1f1c166 100644 --- a/src/main/java/com/gtocore/integration/jade/provider/AEGridProvider.java +++ b/src/main/java/com/gtocore/integration/jade/provider/AEGridProvider.java @@ -6,7 +6,6 @@ import com.gtolib.api.annotation.language.RegisterLanguage; import com.gtolib.api.blockentity.IObserved; -import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.integration.jade.provider.CapabilityBlockProvider; import net.minecraft.core.BlockPos; @@ -44,11 +43,6 @@ protected IExpandedGrid getCapability(Level level, BlockPos pos, BlockEntity blo if (side != null || blockEntity == null) return null; if (blockEntity instanceof IObserved observed) { observed.onObserved(); - } else { - var machine = MetaMachine.getMachine(blockEntity); - if (machine != null) { - machine.observe(); - } } IInWorldGridNodeHost cap; if (blockEntity instanceof IInWorldGridNodeHost host) { diff --git a/src/main/java/com/gtocore/integration/jade/provider/DestroyTimeProvider.java b/src/main/java/com/gtocore/integration/jade/provider/DestroyTimeProvider.java index c87b05dea..e3dd09220 100644 --- a/src/main/java/com/gtocore/integration/jade/provider/DestroyTimeProvider.java +++ b/src/main/java/com/gtocore/integration/jade/provider/DestroyTimeProvider.java @@ -25,4 +25,9 @@ public void appendTooltip(ITooltip iTooltip, BlockAccessor blockAccessor, IPlugi public ResourceLocation getUid() { return GTOCore.id("destroy_time_provider"); } + + @Override + public boolean enabledByDefault() { + return false; + } } diff --git a/src/main/java/com/gtocore/integration/jade/provider/EnLangProvider.java b/src/main/java/com/gtocore/integration/jade/provider/EnLangProvider.java deleted file mode 100644 index 0cc6a064d..000000000 --- a/src/main/java/com/gtocore/integration/jade/provider/EnLangProvider.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.gtocore.integration.jade.provider; - -import com.gtocore.client.forge.GTOComponentHandler; -import com.gtocore.config.GTOConfig; - -import com.gtolib.GTOCore; - -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; - -import snownee.jade.api.*; -import snownee.jade.api.config.IPluginConfig; - -public enum EnLangProvider implements IBlockComponentProvider, IEntityComponentProvider { - - INSTANCE; - - @Override - public void appendTooltip(ITooltip tooltip, BlockAccessor accessor, IPluginConfig config) { - if (!GTOConfig.INSTANCE.showEnglishName) return; - var enLang = GTOComponentHandler.INSTANCE.getEnglishLanguage(); - if (enLang == null) return; - tooltip.add(Component.literal(enLang.getOrDefault(accessor.getBlock().getDescriptionId(), accessor.getBlock().getDescriptionId()))); - } - - @Override - public void appendTooltip(ITooltip tooltip, EntityAccessor accessor, IPluginConfig config) { - if (!GTOConfig.INSTANCE.showEnglishName) return; - var enLang = GTOComponentHandler.INSTANCE.getEnglishLanguage(); - if (enLang == null) return; - tooltip.add(Component.literal(enLang.getOrDefault(accessor.getEntity().getType().getDescriptionId(), accessor.getEntity().getType().getDescriptionId()))); - } - - @Override - public ResourceLocation getUid() { - return GTOCore.id("en_lang"); - } -} diff --git a/src/main/java/com/gtocore/integration/lang/LangAdaptor.java b/src/main/java/com/gtocore/integration/lang/LangAdaptor.java new file mode 100644 index 000000000..08658d23d --- /dev/null +++ b/src/main/java/com/gtocore/integration/lang/LangAdaptor.java @@ -0,0 +1,23 @@ +package com.gtocore.integration.lang; + +import net.minecraft.network.chat.MutableComponent; + +import com.google.common.collect.ImmutableList; +import com.ref.moremorelang.integration.jade.MoremorelangJadePlugin; +import com.ref.moremorelang.lang.ComponentTranslator; +import snownee.jade.api.IWailaPlugin; + +public class LangAdaptor { + + public static String langCn(MutableComponent component) { + return ComponentTranslator.translateComponent(component, "zh_cn").getString(); + } + + public static String langEn(MutableComponent component) { + return ComponentTranslator.translateComponent(component, "en_us").getString(); + } + + public static void addPlugin(ImmutableList.Builder builder) { + builder.add(new MoremorelangJadePlugin()); + } +} diff --git a/src/main/java/com/gtocore/mixin/ae2/QuartzCuttingKnifeItemMixin.java b/src/main/java/com/gtocore/mixin/ae2/QuartzCuttingKnifeItemMixin.java index 8db376ba9..892b3bdfa 100644 --- a/src/main/java/com/gtocore/mixin/ae2/QuartzCuttingKnifeItemMixin.java +++ b/src/main/java/com/gtocore/mixin/ae2/QuartzCuttingKnifeItemMixin.java @@ -5,6 +5,9 @@ import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.ClickAction; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; @@ -54,6 +57,17 @@ private void onUseOnClient(UseOnContext context, CallbackInfoReturnable getTargets(); public PatternProviderBlockEntityMixin(BlockEntityType blockEntityType, BlockPos pos, BlockState blockState) { super(blockEntityType, pos, blockState); @@ -28,7 +41,7 @@ public PatternProviderBlockEntityMixin(BlockEntityType blockEntityType, Block private void onReady(CallbackInfo ci) { Level level = getLevel(); if (level instanceof ServerLevel) { - ITravelHandlerHook.removeAndReadd(level, (PatternProviderLogicHost) this); + TravelUtils.removeAndReadd(level, this); } } @@ -40,4 +53,39 @@ public void setRemoved() { TravelSavedData.getTravelData(level).removeTravelTargetAt(level, getBlockPos()); } } + + @Override + public Level gto$getLevel() { + return level; + } + + @Override + public BlockPos gto$getBlockPos() { + return getBlockPos(); + } + + @Override + public BlockEntity gto$getBlockEntity() { + return this; + } + + @Override + public EnumSet gto$getPushDirection() { + return getTargets(); + } + + @Override + public @Nullable GTRecipeType gto$getRecipeType() { + return IExtendedPatternContainer.gto$getRecipeType(this); + } + + @Override + public @Nullable List gto$getRecipeTypes() { + return IExtendedPatternContainer.gto$getRecipeTypes(this); + } + + @Override + public boolean gto$isCraftingContainer() { + return IExtendedPatternContainer.gto$isCraftingContainer(this); + } } diff --git a/src/main/java/com/gtocore/mixin/ae2/blockentity/PatternProviderPartMixin.java b/src/main/java/com/gtocore/mixin/ae2/blockentity/PatternProviderPartMixin.java index 0a688f339..ed0f29f65 100644 --- a/src/main/java/com/gtocore/mixin/ae2/blockentity/PatternProviderPartMixin.java +++ b/src/main/java/com/gtocore/mixin/ae2/blockentity/PatternProviderPartMixin.java @@ -1,22 +1,36 @@ package com.gtocore.mixin.ae2.blockentity; -import com.gtocore.eio_travel.api.ITravelHandlerHook; -import com.gtocore.eio_travel.api.TravelSavedData; +import com.gtocore.eio_travel.logic.TravelSavedData; +import com.gtocore.eio_travel.logic.TravelUtils; +import com.gtocore.integration.ae.hooks.IExtendedPatternContainer; +import com.gregtechceu.gtceu.api.recipe.GTRecipeType; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; import appeng.api.parts.IPartItem; import appeng.helpers.patternprovider.PatternProviderLogicHost; import appeng.parts.AEBasePart; import appeng.parts.crafting.PatternProviderPart; +import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.util.EnumSet; +import java.util.List; + @Mixin(PatternProviderPart.class) -public abstract class PatternProviderPartMixin extends AEBasePart { +public abstract class PatternProviderPartMixin extends AEBasePart implements PatternProviderLogicHost, IExtendedPatternContainer.IPPPC { + + @Shadow(remap = false) + public abstract EnumSet getTargets(); protected PatternProviderPartMixin(IPartItem partItem) { super(partItem); @@ -26,7 +40,7 @@ protected PatternProviderPartMixin(IPartItem partItem) { private void addToWorld(CallbackInfo ci) { Level level = getLevel(); if (level instanceof ServerLevel) { - ITravelHandlerHook.removeAndReadd(level, (PatternProviderLogicHost) this); + TravelUtils.removeAndReadd(level, this); } } @@ -38,4 +52,38 @@ public void removeFromWorld() { TravelSavedData.getTravelData(level).removeTravelTargetAt(level, getBlockEntity().getBlockPos()); } } + + @Override + public Level gto$getLevel() { + return getLevel(); + } + + @Override + public BlockPos gto$getBlockPos() { + return getBlockEntity().getBlockPos(); + } + + @Override + public BlockEntity gto$getBlockEntity() { + return getBlockEntity(); + } + + public EnumSet gto$getPushDirection() { + return getTargets(); + } + + @Override + public @Nullable GTRecipeType gto$getRecipeType() { + return IExtendedPatternContainer.gto$getRecipeType(this); + } + + @Override + public @Nullable List gto$getRecipeTypes() { + return IExtendedPatternContainer.gto$getRecipeTypes(this); + } + + @Override + public boolean gto$isCraftingContainer() { + return IExtendedPatternContainer.gto$isCraftingContainer(this); + } } diff --git a/src/main/java/com/gtocore/mixin/ae2/crafting/CraftingServiceMixin.java b/src/main/java/com/gtocore/mixin/ae2/crafting/CraftingServiceMixin.java index acb69ecd8..e30935d6f 100644 --- a/src/main/java/com/gtocore/mixin/ae2/crafting/CraftingServiceMixin.java +++ b/src/main/java/com/gtocore/mixin/ae2/crafting/CraftingServiceMixin.java @@ -1,11 +1,16 @@ package com.gtocore.mixin.ae2.crafting; +import com.gtocore.integration.ae.hooks.ITemporaryCraftableService; + import com.gtolib.api.ae2.crafting.OptimizedCalculation; import com.gtolib.api.machine.impl.part.CraftingInterfacePartMachine; +import com.gregtechceu.gtceu.utils.GTUtil; + import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.Level; +import appeng.api.crafting.IPatternDetails; import appeng.api.networking.IGrid; import appeng.api.networking.IGridNode; import appeng.api.networking.crafting.CalculationStrategy; @@ -20,6 +25,7 @@ import appeng.hooks.ticking.TickHandler; import appeng.me.cluster.implementations.CraftingCPUCluster; import appeng.me.service.CraftingService; +import appeng.me.service.helpers.NetworkCraftingProviders; import com.llamalad7.mixinextras.sugar.Local; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.At; @@ -27,18 +33,14 @@ import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.util.Collection; import java.util.Map; import java.util.Set; import java.util.UUID; -import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; @Mixin(CraftingService.class) -public abstract class CraftingServiceMixin { - - @Shadow(remap = false) - @Final - private static ExecutorService CRAFTING_POOL; +public abstract class CraftingServiceMixin implements ITemporaryCraftableService { @Shadow(remap = false) @Final @@ -57,6 +59,12 @@ public abstract class CraftingServiceMixin { @Shadow(remap = false) private boolean updateList; + @Shadow(remap = false) + @Final + private NetworkCraftingProviders craftingProviders; + @Unique + private IPatternDetails gto$tempPatternDetails = null; + @Inject(method = "onServerEndTick", at = @At(value = "INVOKE", target = "Ljava/util/Map;values()Ljava/util/Collection;"), remap = false, cancellable = true) private void onServerEndTick(CallbackInfo ci) { if ((TickHandler.instance().getCurrentTick() & 1) == 0) { @@ -121,11 +129,34 @@ public Future beginCraftingCalculation(Level level, ICraftingSimu if (level == null || simRequester == null) { throw new IllegalArgumentException("Invalid Crafting Job Request"); } - return CRAFTING_POOL.submit(() -> OptimizedCalculation.executeV2(grid, simRequester, what, amount, strategy)); + return GTUtil.ASYNC_EXECUTOR.submit(() -> OptimizedCalculation.executeV2(grid, simRequester, what, amount, strategy)); } @Redirect(method = "submitJob", at = @At(value = "INVOKE", target = "Lappeng/api/networking/crafting/ICraftingPlan;simulation()Z"), remap = false) private boolean ignoreCantCraftWhileManuallySubmitted(ICraftingPlan instance, @Local(argsOnly = true) IActionSource src) { return src.player().isEmpty() && instance.simulation(); } + + /** + * @author , + * @reason , + */ + @Overwrite(remap = false) + public Collection getCraftingFor(AEKey whatToCraft) { + var i = this.craftingProviders.getCraftingFor(whatToCraft); + if (i.isEmpty() && this.gto$tempPatternDetails != null && this.gto$tempPatternDetails.getPrimaryOutput().what() == whatToCraft) { + return Set.of(this.gto$tempPatternDetails); + } + return i; + } + + @Override + public IPatternDetails gto$getTempPatternDetails() { + return this.gto$tempPatternDetails; + } + + @Override + public void gto$setTempPatternDetails(IPatternDetails patternDetails) { + this.gto$tempPatternDetails = patternDetails; + } } diff --git a/src/main/java/com/gtocore/mixin/ae2/gui/ActionButtonMixin.java b/src/main/java/com/gtocore/mixin/ae2/gui/ActionButtonMixin.java index d9dd11303..77e6211d5 100644 --- a/src/main/java/com/gtocore/mixin/ae2/gui/ActionButtonMixin.java +++ b/src/main/java/com/gtocore/mixin/ae2/gui/ActionButtonMixin.java @@ -1,24 +1,64 @@ package com.gtocore.mixin.ae2.gui; +import com.gtocore.integration.ae.hooks.IExtendedPatternEncodingTerm; +import com.gtocore.integration.ae.hooks.IMouseNoRedirection; + +import net.minecraft.client.Minecraft; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import appeng.client.gui.widgets.ActionButton; +import appeng.client.gui.widgets.IconButton; import appeng.core.localization.ButtonToolTips; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(ActionButton.class) -public class ActionButtonMixin { +public abstract class ActionButtonMixin extends IconButton implements IMouseNoRedirection { + + @Unique + boolean gtocore$useOtherButton = false; + + public ActionButtonMixin(OnPress onPress) { + super(onPress); + } @Inject(method = "buildMessage", at = @At("RETURN"), remap = false, cancellable = true) private void initHook(ButtonToolTips displayName, ButtonToolTips displayValue, CallbackInfoReturnable cir) { if (displayValue == ButtonToolTips.EncodeDescription) { + gtocore$useOtherButton = true; MutableComponent component = (MutableComponent) cir.getReturnValue(); - component.append("\n").append(Component.translatable("gtocore.gui.encoding_desc")); + component.append("\n") + .append(Component.translatable("gtocore.gui.encoding_desc")) + .append("\n") + .append(Component.translatable("gtocore.ae.appeng.craft.encode_send")); cir.setReturnValue(component); } } + + @Override + protected boolean isValidClickButton(int button) { + return button == 0 || button == 1; + } + + @Override + public boolean gtocore$shouldRedirectMouse() { + return !gtocore$useOtherButton; + } + + @Override + @SuppressWarnings("ConstantConditions") + public boolean mouseClicked(double mouseX, double mouseY, int button) { + var containerScreen = Minecraft.getInstance().screen; + if (containerScreen instanceof IExtendedPatternEncodingTerm screen && + screen.gto$getEncodeButton() == (Object) this && + button == 1 && this.isMouseOver(mouseX, mouseY)) { + screen.gto$getMenu().gtolib$sendEncodeRequest(); + return true; + } + return super.mouseClicked(mouseX, mouseY, button); + } } diff --git a/src/main/java/com/gtocore/mixin/ae2/gui/HighlightButtonMixin.java b/src/main/java/com/gtocore/mixin/ae2/gui/HighlightButtonMixin.java index ca611d290..30e8921c2 100644 --- a/src/main/java/com/gtocore/mixin/ae2/gui/HighlightButtonMixin.java +++ b/src/main/java/com/gtocore/mixin/ae2/gui/HighlightButtonMixin.java @@ -1,6 +1,7 @@ package com.gtocore.mixin.ae2.gui; import com.gtocore.client.Message; +import com.gtocore.integration.ae.hooks.IMouseNoRedirection; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.Tooltip; @@ -18,7 +19,7 @@ import org.spongepowered.asm.mixin.Shadow; @Mixin(value = HighlightButton.class, remap = false) -public abstract class HighlightButtonMixin extends EPPButton { +public abstract class HighlightButtonMixin extends EPPButton implements IMouseNoRedirection { @Shadow private ResourceKey dim; @@ -36,7 +37,7 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { if (containerScreen instanceof GuiExPatternTerminal && button == 1 && this.isMouseOver(mouseX, mouseY)) { if (dim != null && pos != null) { - Message.NETWORK_PACK.send(buf -> buf.writeGlobalPos(GlobalPos.of(dim, pos))); + Message.OPEN_CONTAINER_C2S.send(buf -> buf.writeGlobalPos(GlobalPos.of(dim, pos))); } } return super.mouseClicked(mouseX, mouseY, button); diff --git a/src/main/java/com/gtocore/mixin/ae2/gui/MathExpressionParserMixin.java b/src/main/java/com/gtocore/mixin/ae2/gui/MathExpressionParserMixin.java index a199cb90f..c9fd59615 100644 --- a/src/main/java/com/gtocore/mixin/ae2/gui/MathExpressionParserMixin.java +++ b/src/main/java/com/gtocore/mixin/ae2/gui/MathExpressionParserMixin.java @@ -1,6 +1,6 @@ package com.gtocore.mixin.ae2.gui; -import com.gtocore.api.ae2.gui.AdvMathExpParser; +import com.gtocore.utils.AdvMathExpParser; import appeng.client.gui.MathExpressionParser; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/com/gtocore/mixin/ae2/gui/RepoSearchMixin.java b/src/main/java/com/gtocore/mixin/ae2/gui/RepoSearchMixin.java deleted file mode 100644 index 1fee20568..000000000 --- a/src/main/java/com/gtocore/mixin/ae2/gui/RepoSearchMixin.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.gtocore.mixin.ae2.gui; - -import com.gtocore.config.GTOConfig; -import com.gtocore.integration.ae.search.EnglishSearchPredicate; - -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -import appeng.client.gui.me.search.RepoSearch; -import appeng.menu.me.common.GridInventoryEntry; -import com.llamalad7.mixinextras.sugar.Local; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -import java.util.function.Predicate; - -@Mixin(RepoSearch.class) -@OnlyIn(Dist.CLIENT) -public class RepoSearchMixin { - - @Redirect(method = "getPredicates", - at = @At( - value = "INVOKE", - target = "Ljava/util/ArrayList;add(Ljava/lang/Object;)Z", - remap = false, - ordinal = 4), - remap = false) - private boolean redirectAddNamePredicate(java.util.ArrayList instance, Object o, @Local(name = "part") String part) { - if (!GTOConfig.INSTANCE.showEnglishName) return instance.add(o); - return instance.add(new EnglishSearchPredicate(part).or((Predicate) o)); - } -} diff --git a/src/main/java/com/gtocore/mixin/ae2/menu/CraftAmountMenuMixin.java b/src/main/java/com/gtocore/mixin/ae2/menu/CraftAmountMenuMixin.java new file mode 100644 index 000000000..8d510dbd3 --- /dev/null +++ b/src/main/java/com/gtocore/mixin/ae2/menu/CraftAmountMenuMixin.java @@ -0,0 +1,87 @@ +package com.gtocore.mixin.ae2.menu; + +import com.gtocore.common.data.GTOItems; +import com.gtocore.common.item.OrderItem; +import com.gtocore.integration.ae.hooks.ICraftAmountMenu; +import com.gtocore.integration.ae.hooks.ITemporaryCraftableService; + +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.level.Level; + +import appeng.api.crafting.PatternDetailsHelper; +import appeng.api.networking.crafting.CalculationStrategy; +import appeng.api.stacks.AEItemKey; +import appeng.api.stacks.AEKey; +import appeng.api.stacks.GenericStack; +import appeng.api.stacks.KeyCounter; +import appeng.menu.AEBaseMenu; +import appeng.menu.me.crafting.CraftAmountMenu; +import appeng.menu.me.crafting.CraftConfirmMenu; +import appeng.menu.slot.AppEngSlot; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; + +import java.util.Objects; + +@Mixin(CraftAmountMenu.class) +public abstract class CraftAmountMenuMixin extends AEBaseMenu implements ICraftAmountMenu { + + @Shadow(remap = false) + @Final + private AppEngSlot craftingItem; + @Shadow(remap = false) + private AEKey whatToCraft; + + @Shadow(remap = false) + public abstract Level getLevel(); + + @Unique + private KeyCounter gto$whatToCraft = null; + + public CraftAmountMenuMixin(MenuType menuType, int id, Inventory playerInventory, Object host) { + super(menuType, id, playerInventory, host); + } + + @Override + public void gto$setWhatToCraft(KeyCounter whatToCraft, long initialAmount) { + this.gto$whatToCraft = Objects.requireNonNull(whatToCraft, "whatToCraft"); + assert !whatToCraft.isEmpty() : "whatToCraft cannot be empty"; + var tempOrderItem = GTOItems.TEMP_ORDER.asStack(); + var iconItem = whatToCraft.getFirstEntry().getKey() instanceof AEItemKey aeItemKey ? aeItemKey.getReadOnlyStack().copy() : GTOItems.ORDER.asStack(); + iconItem.setHoverName(whatToCraft.getFirstEntry().getKey().getDisplayName()); + OrderItem.setTarget(tempOrderItem, iconItem); + this.whatToCraft = AEItemKey.of(tempOrderItem); + if (this.whatToCraft != null) { + this.craftingItem.set(GenericStack.wrapInItemStack(this.whatToCraft, initialAmount)); + } + } + + @WrapOperation(method = "confirm", + at = @At( + value = "INVOKE", + target = "Lappeng/menu/me/crafting/CraftConfirmMenu;planJob(Lappeng/api/stacks/AEKey;JLappeng/api/networking/crafting/CalculationStrategy;)Z", + remap = false), + remap = false) + private boolean onConfirm(CraftConfirmMenu instance, AEKey what, long amount, CalculationStrategy strategy, Operation original) { + check: + if (this.gto$whatToCraft != null) { + var gridNode = getActionHost().getActionableNode(); + if (gridNode == null) break check; + var grid = gridNode.getGrid(); + var service = ((ITemporaryCraftableService) grid.getCraftingService()); + var processPattern = PatternDetailsHelper.encodeProcessingPattern( + gto$whatToCraft.entrySet().stream() + .map(key -> new GenericStack(key.what(), key.amount())) + .toArray(GenericStack[]::new), + new GenericStack[] { new GenericStack(whatToCraft, 1) }); + service.gto$setTempPatternDetails(PatternDetailsHelper.decodePattern(processPattern, getLevel())); + } + return original.call(instance, what, amount, strategy); + } +} diff --git a/src/main/java/com/gtocore/mixin/ae2/menu/PatternAccessTermMenuMixin.java b/src/main/java/com/gtocore/mixin/ae2/menu/PatternAccessTermMenuMixin.java index 0a017e746..dddbd345a 100644 --- a/src/main/java/com/gtocore/mixin/ae2/menu/PatternAccessTermMenuMixin.java +++ b/src/main/java/com/gtocore/mixin/ae2/menu/PatternAccessTermMenuMixin.java @@ -11,6 +11,7 @@ import net.minecraft.nbt.ListTag; import net.minecraft.nbt.StringTag; import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; @@ -20,6 +21,7 @@ import appeng.core.definitions.AEBlocks; import appeng.crafting.pattern.CraftingPatternItem; import appeng.helpers.patternprovider.PatternContainer; +import appeng.menu.AEBaseMenu; import appeng.menu.guisync.GuiSync; import appeng.menu.implementations.PatternAccessTermMenu; import com.glodblock.github.extendedae.common.EPPItemAndBlock; @@ -33,8 +35,8 @@ import java.util.Set; -@Mixin(PatternAccessTermMenu.class) -public abstract class PatternAccessTermMenuMixin implements IPatternAccessTermMenu { +@Mixin(value = PatternAccessTermMenu.class, priority = 1900) +public abstract class PatternAccessTermMenuMixin extends AEBaseMenu implements IPatternAccessTermMenu { @Unique @GuiSync(2) @@ -43,6 +45,10 @@ public abstract class PatternAccessTermMenuMixin implements IPatternAccessTermMe @Unique private ShowMolecularAssembler gtolib$lastShownMolecularAssembler; + public PatternAccessTermMenuMixin(MenuType menuType, int id, Inventory playerInventory, Object host) { + super(menuType, id, playerInventory, host); + } + @Shadow(remap = false) protected abstract boolean isFull(PatternContainer logic); diff --git a/src/main/java/com/gtocore/mixin/ae2/menu/PatternEncodingTermMenuMixin.java b/src/main/java/com/gtocore/mixin/ae2/menu/PatternEncodingTermMenuMixin.java index 23e48ad09..8975e9abf 100644 --- a/src/main/java/com/gtocore/mixin/ae2/menu/PatternEncodingTermMenuMixin.java +++ b/src/main/java/com/gtocore/mixin/ae2/menu/PatternEncodingTermMenuMixin.java @@ -1,33 +1,50 @@ package com.gtocore.mixin.ae2.menu; import com.gtocore.api.ae2.pattern.IEncodingLogic; +import com.gtocore.client.Message; +import com.gtocore.common.machine.multiblock.electric.SuperMolecularAssemblerMachine; +import com.gtocore.common.machine.multiblock.part.ae.MECraftPatternPartMachine; +import com.gtocore.integration.ae.hooks.IExtendedPatternContainer; +import com.gtocore.integration.ae.hooks.IExtendedPatternEncodingTerm; +import com.gtolib.GTOCore; import com.gtolib.api.ae2.IPatterEncodingTermMenu; import com.gtolib.api.ae2.pattern.PatternUtils; import com.gtolib.api.player.IEnhancedPlayer; import com.gtolib.utils.ClientUtil; import com.gtolib.utils.RLUtils; +import com.gregtechceu.gtceu.api.recipe.GTRecipeType; +import com.gregtechceu.gtceu.api.registry.GTRegistries; + import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.ItemStack; import appeng.api.config.Actionable; import appeng.api.crafting.PatternDetailsHelper; +import appeng.api.implementations.blockentities.PatternContainerGroup; import appeng.api.stacks.AEItemKey; import appeng.api.storage.ITerminalHost; import appeng.api.storage.MEStorage; import appeng.core.definitions.AEItems; +import appeng.crafting.pattern.AEPatternDecoder; +import appeng.crafting.pattern.ProcessingPatternItem; import appeng.helpers.IMenuCraftingPacket; import appeng.helpers.IPatternTerminalMenuHost; +import appeng.helpers.patternprovider.PatternContainer; import appeng.menu.guisync.GuiSync; import appeng.menu.me.common.MEStorageMenu; import appeng.menu.me.items.PatternEncodingTermMenu; import appeng.menu.slot.RestrictedInputSlot; import appeng.parts.encoding.PatternEncodingLogic; import appeng.util.ConfigInventory; +import appeng.util.inv.AppEngInternalInventory; +import com.glodblock.github.extendedae.common.tileentities.matrix.TileAssemblerMatrixPattern; import com.llamalad7.mixinextras.sugar.Local; +import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -38,10 +55,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import java.util.UUID; +import java.util.*; @Mixin(PatternEncodingTermMenu.class) -public abstract class PatternEncodingTermMenuMixin extends MEStorageMenu implements IMenuCraftingPacket, IPatterEncodingTermMenu { +public abstract class PatternEncodingTermMenuMixin extends MEStorageMenu implements IMenuCraftingPacket, IPatterEncodingTermMenu, IExtendedPatternEncodingTerm.Menu { @Unique @GuiSync(122) @@ -64,6 +81,14 @@ public abstract class PatternEncodingTermMenuMixin extends MEStorageMenu impleme @Unique @GuiSync(120) public String gtocore$recipe = ""; + @Unique + private GTRecipeType gto$lastRecipeType = null; + @Unique + private boolean gto$isCraft = false; + @Unique + private List gto$currentContainers = null; + @Unique + private ItemStack gto$patternStack; @Unique private UUID gtocore$UUID; @@ -81,7 +106,10 @@ protected PatternEncodingTermMenuMixin(MenuType menuType, int id, Inventory i public void gtolib$addRecipe(String id) { if (isClientSide()) { sendClientAction("addRecipe", id); - } else gtolib$logic().gtocore$setRecipe(id); + } else { + gtolib$logic().gtocore$setRecipe(id); + gto$lastRecipeType = GTRegistries.RECIPE_TYPES.get(RLUtils.parse(id.split("/")[0])); + } } @Override @@ -157,6 +185,8 @@ private void initHooks(MenuType menuType, int id, Inventory ip, IPatternTermi registerClientAction("addRecipe", String.class, this::gtolib$addRecipe); registerClientAction("clickRecipeInfo", this::gtolib$clickRecipeInfo); registerClientAction("addUUID", UUID.class, this::gtolib$addUUID); + registerClientAction("sendPattern", Integer.class, this::gtolib$sendPattern); + registerClientAction("sendPatternRequest", this::gtolib$sendEncodeRequest); } @Override @@ -185,6 +215,13 @@ private void encode(CallbackInfo ci) { gtolib$addUUID(ClientUtil.getUUID()); } + @Inject(method = "encodePattern", at = @At(value = "RETURN"), remap = false) + private void onEncodeSucceeded(CallbackInfoReturnable cir) { + var stack = cir.getReturnValue(); + if (stack == null || stack.isEmpty()) return; + gto$isCraft = !(stack.getItem() instanceof ProcessingPatternItem); + } + @Inject(method = "encode", at = @At(value = "INVOKE", target = "Lappeng/menu/slot/RestrictedInputSlot;set(Lnet/minecraft/world/item/ItemStack;)V", ordinal = 1, remap = true), remap = false, cancellable = true) private void encoding(CallbackInfo ci, @Local(name = "encodedPattern") ItemStack stack) { var player = getPlayer(); @@ -229,25 +266,25 @@ public void broadcastChanges(CallbackInfo ci) { @Shadow(remap = false) public abstract void encode(); - @Inject(method = "encode", - at = @At(value = "INVOKE", - target = "Lappeng/menu/me/items/PatternEncodingTermMenu;isPattern(Lnet/minecraft/world/item/ItemStack;)Z", - remap = false), - remap = false, - cancellable = true) - private void tryAutoRefillBlankPattern(CallbackInfo ci, @Local(name = "encodeOutput") ItemStack blankPattern) { - // 如果空白样板槽位没有有效的样板,尝试自动补充 - if (!isPattern(blankPattern)) { - if (gtolib$tryRefillBlankPattern()) { - // 补充成功,重新执行encode逻辑 - ci.cancel(); - encode(); - } + @Shadow(remap = false) + @Nullable + protected abstract ItemStack encodePattern(); + + @Redirect(method = "encode", + at = @At(value = "INVOKE", + target = "Lappeng/menu/slot/RestrictedInputSlot;getItem()Lnet/minecraft/world/item/ItemStack;", + ordinal = 1)) + private ItemStack fetchPattern(RestrictedInputSlot instance) { + var blankPattern = instance.getItem(); + GTOCore.LOGGER.info("Fetching blank pattern from slot: {}", blankPattern); + if (!isPattern(blankPattern) && gtolib$tryExtractBlankPattern()) { + return new ItemStack(AEItems.BLANK_PATTERN, 1); } + return blankPattern; } @Unique - private boolean gtolib$tryRefillBlankPattern() { + private boolean gtolib$tryExtractBlankPattern() { var host = getHost(); if (host == null) return false; @@ -255,18 +292,9 @@ private void tryAutoRefillBlankPattern(CallbackInfo ci, @Local(name = "encodeOut if (inventory == null) return false; AEItemKey blankPattern = AEItemKey.of(AEItems.BLANK_PATTERN); - long supplier = inventory.getAvailableStacks().get(blankPattern); - if (supplier <= 0) return false; - var stock = blankPatternSlot.getItem().getCount(); - var demand = Math.min(supplier, 1 - stock); - if (demand <= 0) return false; - var extracted = inventory.extract(blankPattern, demand, Actionable.MODULATE, getActionSource()); - if (extracted <= 0) return false; - - blankPatternSlot.set(blankPattern.toStack().copyWithCount(stock + (int) extracted)); - - return true; + var extracted = inventory.extract(blankPattern, 1, Actionable.MODULATE, getActionSource()); + return extracted > 0; } @Redirect( @@ -277,4 +305,128 @@ private void tryAutoRefillBlankPattern(CallbackInfo ci, @Local(name = "encodeOut // 空白样板槽现在是幽灵槽位,无需手动补充 return itemStack.getItem() != AEItems.BLANK_PATTERN.asItem() && instance.mayPlace(itemStack); } + + @Unique + private List gto$getPatternContainers() { + var gridNode = getActionHost().getActionableNode(); + if (gridNode == null) { + return List.of(); + } + var grid = gridNode.getGrid(); + if (grid == null) { + return List.of(); + } + var stack = gto$patternStack; + if (stack == null) return List.of(); + ArrayList machines = new ArrayList<>(grid.size() / 2 + 1); + for (var machineClass : grid.getMachineClasses()) { + if (IExtendedPatternContainer.class.isAssignableFrom(machineClass)) { + machines.addAll((Collection) grid.getActiveMachines(machineClass)); + } + } + var thisPatternDetails = AEPatternDecoder.INSTANCE.decodePattern(stack, getPlayer().level(), false); + if (thisPatternDetails == null) return List.of(); + var primaryOutput = thisPatternDetails.getPrimaryOutput().what(); + Set sameCluster = new HashSet<>(); + + machines.removeIf(container -> { + var patternInv = container.getTerminalPatternInventory(); + + if (!container.isVisibleInTerminal() || + patternInv.simulateAdd(stack) == stack) + return true; + if (patternInv instanceof AppEngInternalInventory aeInv && + aeInv.getHost() instanceof TileAssemblerMatrixPattern matrixPattern) { + var matrix = matrixPattern.getCluster(); + if (matrix == null) return false; + if (sameCluster.contains(matrix)) return true; + sameCluster.add(matrix); + return matrix.getPatterns() + .stream() + .flatMap(m -> m.getAvailablePatterns().stream()) + .anyMatch(p -> p.getPrimaryOutput().what() == primaryOutput); + } + if (patternInv instanceof MECraftPatternPartMachine mecppm && + mecppm.getController() instanceof SuperMolecularAssemblerMachine smaMachine) { + if (sameCluster.contains(smaMachine)) return true; + sameCluster.add(smaMachine); + return Arrays.stream(smaMachine.getParts()) + .filter(m -> m instanceof MECraftPatternPartMachine) + .map(m -> (MECraftPatternPartMachine) m) + .flatMap(m -> m.getAvailablePatterns().stream()) + .anyMatch(p -> p.getPrimaryOutput().what() == primaryOutput); + } + for (var paattern : patternInv) { + var details = AEPatternDecoder.INSTANCE.decodePattern(paattern, getPlayer().level(), false); + if (details == null) continue; + if (details.getPrimaryOutput().what() == primaryOutput) { + return true; + } + } + return false; + + }); + var containerComparator = (gto$isCraft ? gto$CRAFT_FIRST : gto$recipeFirst(gto$lastRecipeType)).reversed(); + + machines.sort(containerComparator); + return machines; + } + + @Unique + private static final Comparator gto$CRAFT_FIRST = Comparator.comparing(IExtendedPatternContainer::hasEmptyPatternSlot) + .thenComparing(IExtendedPatternContainer::gto$isCraftingContainer); + + @Unique + private static Comparator gto$recipeFirst(GTRecipeType recipeType) { + if (recipeType == null) { + return Comparator.comparing(IExtendedPatternContainer::hasEmptyPatternSlot); + } + return Comparator.comparing(IExtendedPatternContainer::hasEmptyPatternSlot) + .thenComparing((IExtendedPatternContainer p) -> p.getSupportedRecipeTypes().contains(recipeType)); + } + + @Override + public void gtolib$sendPattern(int index) { + if (isClientSide()) { + sendClientAction("sendPattern", index); + return; + } + var gridNode = getActionHost().getActionableNode(); + if (gridNode == null) { + return; + } + var grid = gridNode.getGrid(); + if (grid == null) { + return; + } + if (grid.getStorageService().getInventory().extract(AEItemKey.of(AEItems.BLANK_PATTERN), 1, Actionable.MODULATE, getActionSource()) == 0) { + return; + } + var containers = gto$currentContainers; + if (index < 0 || index >= containers.size()) { + return; + } + var container = containers.get(index); + if (container.isOutOfService()) return; + + var patternStack = gto$patternStack; + if (patternStack == null) return; + container.getTerminalPatternInventory().addItems(patternStack); + } + + @Override + public void gtolib$sendEncodeRequest() { + if (isClientSide()) { + sendClientAction("sendPatternRequest"); + return; + } + var patternStack = encodePattern(); + if (patternStack == null) return; + gto$patternStack = patternStack; + gto$currentContainers = gto$getPatternContainers(); + if (gto$currentContainers.isEmpty()) return; + Message.sendPatternDestination((ServerPlayer) getPlayer(), gto$currentContainers.stream() + .map(PatternContainer::getTerminalGroup) + .toArray(PatternContainerGroup[]::new)); + } } diff --git a/src/main/java/com/gtocore/mixin/ae2/network/GuiDataSyncPacketMixin.java b/src/main/java/com/gtocore/mixin/ae2/network/GuiDataSyncPacketMixin.java index 13b8e1ae3..dd2b41ffc 100644 --- a/src/main/java/com/gtocore/mixin/ae2/network/GuiDataSyncPacketMixin.java +++ b/src/main/java/com/gtocore/mixin/ae2/network/GuiDataSyncPacketMixin.java @@ -47,7 +47,7 @@ private void hookReceive(FriendlyByteBuf buf, CallbackInfo ci) { gtolib$isInnerMenuPacket = buf.getBoolean(lastBooleanIndex); } catch (Exception e) { // If the packet is not from Me2in1Menu, we don't care about this field - if (GTOConfig.INSTANCE.aeLog) { + if (GTOConfig.INSTANCE.devMode.aeLog) { GTOCore.LOGGER.warn("Failed to read gtolib$isInnerMenuPacket from GuiDataSyncPacket, assuming false", e); } gtolib$isInnerMenuPacket = false; diff --git a/src/main/java/com/gtocore/mixin/ae2/screen/AEBaseScreenMixin.java b/src/main/java/com/gtocore/mixin/ae2/screen/AEBaseScreenMixin.java index 40104241b..1a088f14a 100644 --- a/src/main/java/com/gtocore/mixin/ae2/screen/AEBaseScreenMixin.java +++ b/src/main/java/com/gtocore/mixin/ae2/screen/AEBaseScreenMixin.java @@ -1,6 +1,7 @@ package com.gtocore.mixin.ae2.screen; import com.gtocore.client.renderer.RenderUtil; +import com.gtocore.integration.ae.hooks.IMouseNoRedirection; import com.gtolib.api.ae2.gui.hooks.IAEBaseScreenLifecycle; import com.gtolib.api.ae2.gui.hooks.IconSlot; @@ -14,8 +15,6 @@ import appeng.client.gui.AEBaseScreen; import appeng.menu.AEBaseMenu; -import com.glodblock.github.extendedae.client.button.HighlightButton; -import com.glodblock.github.extendedae.client.gui.GuiExPatternTerminal; import com.llamalad7.mixinextras.sugar.Local; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -78,9 +77,9 @@ public AEBaseScreenMixin(T menu, Inventory playerInventory, Component title) { @Redirect(method = "mouseClicked", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/inventory/AbstractContainerScreen;mouseClicked(DDI)Z", ordinal = 0)) private boolean gtolib$redirectMouseClicked(AbstractContainerScreen instance, double xCoord, double yCoord, int fakeBtn, @Local(argsOnly = true) int btn) { - if (isHandlingRightClick() && instance instanceof GuiExPatternTerminal) { + if (isHandlingRightClick() && instance instanceof AEBaseScreen) { for (var widget : this.children()) { - if (widget.isMouseOver(xCoord, yCoord) && widget instanceof HighlightButton) { + if (widget.isMouseOver(xCoord, yCoord) && widget instanceof IMouseNoRedirection i && !i.gtocore$shouldRedirectMouse()) { return super.mouseClicked(xCoord, yCoord, btn); } } diff --git a/src/main/java/com/gtocore/mixin/ae2/screen/CraftConfirmScreenMixin.java b/src/main/java/com/gtocore/mixin/ae2/screen/CraftConfirmScreenMixin.java index b38237526..3c0bee392 100644 --- a/src/main/java/com/gtocore/mixin/ae2/screen/CraftConfirmScreenMixin.java +++ b/src/main/java/com/gtocore/mixin/ae2/screen/CraftConfirmScreenMixin.java @@ -100,8 +100,8 @@ public Rect2i getBounds() { @Redirect(method = "updateBeforeRender", at = @At(value = "INVOKE", target = "Lappeng/menu/me/crafting/CraftingPlanSummary;isSimulation()Z", ordinal = 0), remap = false) private boolean gto$ignoreUnstartable(appeng.menu.me.crafting.CraftingPlanSummary instance) { - start.setMessage((GTOConfig.INSTANCE.allowMissingCraftingJobs && instance.isSimulation()) ? Component.translatable("gtocore.ae.appeng.craft.missing_start") : GuiText.Start.text()); - start.setTooltip(Tooltip.create((GTOConfig.INSTANCE.allowMissingCraftingJobs && instance.isSimulation()) ? Component.translatable("gtocore.ae.appeng.craft.missing_start.desc") : GuiText.Start.text())); - return !GTOConfig.INSTANCE.allowMissingCraftingJobs; + start.setMessage((GTOConfig.INSTANCE.gamePlay.allowMissingCraftingJobs && instance.isSimulation()) ? Component.translatable("gtocore.ae.appeng.craft.missing_start") : GuiText.Start.text()); + start.setTooltip(Tooltip.create((GTOConfig.INSTANCE.gamePlay.allowMissingCraftingJobs && instance.isSimulation()) ? Component.translatable("gtocore.ae.appeng.craft.missing_start.desc") : GuiText.Start.text())); + return !GTOConfig.INSTANCE.gamePlay.allowMissingCraftingJobs; } } diff --git a/src/main/java/com/gtocore/mixin/ae2/screen/PatternEncodingTermScreenMixin.java b/src/main/java/com/gtocore/mixin/ae2/screen/PatternEncodingTermScreenMixin.java index 966cf2f60..9c4371d32 100644 --- a/src/main/java/com/gtocore/mixin/ae2/screen/PatternEncodingTermScreenMixin.java +++ b/src/main/java/com/gtocore/mixin/ae2/screen/PatternEncodingTermScreenMixin.java @@ -1,5 +1,8 @@ package com.gtocore.mixin.ae2.screen; +import com.gtocore.integration.ae.client.AESearchPatternProviderListBox; +import com.gtocore.integration.ae.hooks.IExtendedPatternEncodingTerm; + import com.gtolib.api.ae2.gui.FixedRepoSlot; import com.gtolib.api.ae2.gui.hooks.IAEBaseScreenLifecycle; import com.gtolib.api.ae2.gui.hooks.IFixedRepoSlotHandlingScreen; @@ -14,10 +17,12 @@ import appeng.client.gui.me.common.MEStorageScreen; import appeng.client.gui.me.items.PatternEncodingTermScreen; import appeng.client.gui.style.ScreenStyle; +import appeng.client.gui.widgets.ActionButton; import appeng.core.definitions.AEItems; import appeng.menu.SlotSemantics; import appeng.menu.me.items.PatternEncodingTermMenu; import appeng.menu.slot.RestrictedInputSlot; +import com.llamalad7.mixinextras.sugar.Local; import earth.terrarium.adastra.mixins.common.SlotAccessor; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; @@ -28,22 +33,38 @@ import java.util.List; @Mixin(PatternEncodingTermScreen.class) -public class PatternEncodingTermScreenMixin extends MEStorageScreen implements IAEBaseScreenLifecycle { +public class PatternEncodingTermScreenMixin extends MEStorageScreen implements IAEBaseScreenLifecycle, IExtendedPatternEncodingTerm { @Unique private FixedRepoSlot gtolib$fixedSlot; + @Unique + private AESearchPatternProviderListBox gto$listBox; + @Unique + private ActionButton gto$encodeButton; public PatternEncodingTermScreenMixin(C menu, Inventory playerInventory, Component title, ScreenStyle style) { super(menu, playerInventory, title, style); } @Inject(method = "", at = @At("TAIL"), remap = false) - private void gtolib$onInit(PatternEncodingTermMenu menu, Inventory playerInventory, Component title, ScreenStyle style, CallbackInfo ci) { + private void gtolib$onInit(PatternEncodingTermMenu menu, Inventory playerInventory, Component title, ScreenStyle style, CallbackInfo ci, @Local(name = "encodeBtn") ActionButton encodeBtn) { gtolib$fixedSlot = new FixedRepoSlot(((IFixedRepoSlotHandlingScreen) this).gtolib$getRepo(), AEItemKey.of(AEItems.BLANK_PATTERN), 0, 0); gtolib$fixedSlot.setEmptyTooltipMessage( List.of(Component.translatable("ldlib.gui.editor.name.canPutItems") .append(AEItemKey.of(AEItems.BLANK_PATTERN).getDisplayName()).withStyle(ChatFormatting.AQUA))); gtolib$fixedSlot.setIcon(Icon.BACKGROUND_BLANK_PATTERN); + + gto$listBox = new AESearchPatternProviderListBox(this); + gto$listBox.setVisible(false); + gto$listBox.setCatchScrollbar(false); + widgets.add("gto$listBox", gto$listBox); + + gto$encodeButton = encodeBtn; + } + + @Override + public ActionButton gto$getEncodeButton() { + return gto$encodeButton; } @Override @@ -54,11 +75,21 @@ public PatternEncodingTermScreenMixin(C menu, Inventory playerInventory, Compone @Override public void gtolib$initBeforeWidgetsInitialized() { List slots = ((IFixedRepoSlotHandlingScreen) this).gtolib$getMenu().getSlots(SlotSemantics.BLANK_PATTERN); - if (!slots.isEmpty() && slots.get(0) instanceof RestrictedInputSlot slot) { + if (!slots.isEmpty() && slots.getFirst() instanceof RestrictedInputSlot slot) { ((SlotAccessor) gtolib$fixedSlot).setX(slot.x); ((SlotAccessor) gtolib$fixedSlot).setY(slot.y); slot.setActive(false); ((IFixedRepoSlotHandlingScreen) this).gtolib$getMenu().slots.add(gtolib$fixedSlot); } } + + @Override + public AESearchPatternProviderListBox gto$getPatternDestDisplay() { + return gto$listBox; + } + + @Override + public IExtendedPatternEncodingTerm.Menu gto$getMenu() { + return (Menu) menu; + } } diff --git a/src/main/java/com/gtocore/mixin/ae2/stacks/KeyCounterMixin.java b/src/main/java/com/gtocore/mixin/ae2/stacks/KeyCounterMixin.java index dd57ad517..69e1e1281 100644 --- a/src/main/java/com/gtocore/mixin/ae2/stacks/KeyCounterMixin.java +++ b/src/main/java/com/gtocore/mixin/ae2/stacks/KeyCounterMixin.java @@ -7,6 +7,7 @@ import appeng.api.config.FuzzyMode; import appeng.api.stacks.AEKey; import appeng.api.stacks.AEKeyMap; +import appeng.api.stacks.GenericStack; import appeng.api.stacks.KeyCounter; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2LongMap; @@ -23,6 +24,7 @@ import java.util.Iterator; import java.util.Set; import java.util.function.Consumer; +import java.util.stream.Collectors; @Mixin(KeyCounter.class) public class KeyCounterMixin implements Iterable>, IKeyCounter { @@ -297,6 +299,16 @@ public Set keySet() { return gtolib$map.keySet(); } + /** + * @author . + * @reason . + */ + @Overwrite(remap = false) + public Set entrySet() { + if (gtolib$map == null) return Collections.emptySet(); + return gtolib$map.reference2LongEntrySet().stream().map(e -> new GenericStack(e.getKey(), e.getLongValue())).collect(Collectors.toSet()); + } + @Override public Reference2LongOpenHashMap gtolib$getMap() { return gtolib$map; diff --git a/src/main/java/com/gtocore/mixin/ae2/storage/StorageServiceMixin.java b/src/main/java/com/gtocore/mixin/ae2/storage/StorageServiceMixin.java index 6bec3cf40..c7221bf29 100644 --- a/src/main/java/com/gtocore/mixin/ae2/storage/StorageServiceMixin.java +++ b/src/main/java/com/gtocore/mixin/ae2/storage/StorageServiceMixin.java @@ -8,10 +8,7 @@ import appeng.api.stacks.KeyCounter; import appeng.me.service.StorageService; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -20,7 +17,6 @@ public abstract class StorageServiceMixin implements IExpandedStorageService { @Shadow(remap = false) - @Final private KeyCounter cachedAvailableStacks; @Shadow(remap = false) diff --git a/src/main/java/com/gtocore/mixin/AppliedBotanicsForgeMixin.java b/src/main/java/com/gtocore/mixin/appbot/AppliedBotanicsForgeMixin.java similarity index 96% rename from src/main/java/com/gtocore/mixin/AppliedBotanicsForgeMixin.java rename to src/main/java/com/gtocore/mixin/appbot/AppliedBotanicsForgeMixin.java index faf3bf280..ff5a9a2ff 100644 --- a/src/main/java/com/gtocore/mixin/AppliedBotanicsForgeMixin.java +++ b/src/main/java/com/gtocore/mixin/appbot/AppliedBotanicsForgeMixin.java @@ -1,4 +1,4 @@ -package com.gtocore.mixin; +package com.gtocore.mixin.appbot; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; diff --git a/src/main/java/com/gtocore/mixin/arseng/SourceAcceptorBlockEntityMixin.java b/src/main/java/com/gtocore/mixin/arseng/SourceAcceptorBlockEntityMixin.java new file mode 100644 index 000000000..b325b9930 --- /dev/null +++ b/src/main/java/com/gtocore/mixin/arseng/SourceAcceptorBlockEntityMixin.java @@ -0,0 +1,18 @@ +package com.gtocore.mixin.arseng; + +import net.minecraftforge.common.util.LazyOptional; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import org.spongepowered.asm.mixin.injection.At; + +@org.spongepowered.asm.mixin.Mixin(gripe._90.arseng.block.entity.SourceAcceptorBlockEntity.class) +public class SourceAcceptorBlockEntityMixin { + + @WrapOperation(method = "invalidateCaps", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/common/util/LazyOptional;invalidate()V"), remap = false) + private void gto$fixNullPointer(LazyOptional instance, Operation original) { + if (instance != null) { + original.call(instance); + } + } +} diff --git a/src/main/java/com/gtocore/mixin/eae/FCUtilMixin.java b/src/main/java/com/gtocore/mixin/eae/FCUtilMixin.java new file mode 100644 index 000000000..8aac3cf77 --- /dev/null +++ b/src/main/java/com/gtocore/mixin/eae/FCUtilMixin.java @@ -0,0 +1,17 @@ +package com.gtocore.mixin.eae; + +import com.gtocore.integration.jech.PinYinUtils; + +import com.glodblock.github.extendedae.util.FCUtil; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(FCUtil.class) +public class FCUtilMixin { + + @Redirect(method = "compareTokens", at = @At(value = "INVOKE", target = "Ljava/lang/String;contains(Ljava/lang/CharSequence;)Z"), remap = false) + private static boolean redirectContains(String str, CharSequence s) { + return PinYinUtils.match(str, s); + } +} diff --git a/src/main/java/com/gtocore/mixin/eae/GuiExPatternTerminalMixin.java b/src/main/java/com/gtocore/mixin/eae/GuiExPatternTerminalMixin.java index b69802140..fdfbb643c 100644 --- a/src/main/java/com/gtocore/mixin/eae/GuiExPatternTerminalMixin.java +++ b/src/main/java/com/gtocore/mixin/eae/GuiExPatternTerminalMixin.java @@ -27,6 +27,7 @@ import com.glodblock.github.extendedae.client.button.HighlightButton; import com.glodblock.github.extendedae.client.gui.GuiExPatternTerminal; import com.glodblock.github.extendedae.container.ContainerExPatternTerminal; +import com.glodblock.github.extendedae.util.FCUtil; import com.glodblock.github.extendedae.util.MessageUtil; import com.google.common.collect.HashMultimap; import org.spongepowered.asm.mixin.*; @@ -70,7 +71,7 @@ public abstract class GuiExPatternTerminalMixin byId; @Shadow(remap = false) - protected abstract boolean itemStackMatchesSearchTerm(ItemStack itemStack, String searchTerm, boolean checkOut); + protected abstract boolean itemStackMatchesSearchTerm(ItemStack itemStack, List searchTerm, boolean checkOut); @Shadow(remap = false) @Final @@ -151,8 +152,10 @@ private void refreshList0(CallbackInfo ci) { this.matchedStack.clear(); this.matchedProvider.clear(); - final String outputFilter = this.searchOutField.getValue().toLowerCase(); - final String inputFilter = this.searchInField.getValue().toLowerCase(); + final String outputFilter = this.searchOutField.getValue().toLowerCase().trim(); + final String inputFilter = this.searchInField.getValue().toLowerCase().trim(); + final List outputFilters = FCUtil.tokenize(outputFilter); + final List inputFilters = FCUtil.tokenize(inputFilter); final String patternFilter = this.gto$getSearchProviderField().getValue().toLowerCase(); final Set cachedSearch = this.getCacheForSearchTerm("out:" + outputFilter + "in:" + inputFilter + "pat:" + patternFilter); @@ -175,12 +178,12 @@ private void refreshList0(CallbackInfo ci) { boolean midRes; for (ItemStack itemStack : entry.getInventory()) { if (!outputFilter.isEmpty()) { - midRes = this.itemStackMatchesSearchTerm(itemStack, outputFilter, true); + midRes = this.itemStackMatchesSearchTerm(itemStack, outputFilters, true); } else { midRes = true; } if (!inputFilter.isEmpty() && midRes) { - midRes = this.itemStackMatchesSearchTerm(itemStack, inputFilter, false); + midRes = this.itemStackMatchesSearchTerm(itemStack, inputFilters, false); } if (midRes) { found = true; @@ -216,6 +219,9 @@ private void refreshList0(CallbackInfo ci) { // noinspection SizeReplaceableByIsEmpty if (inventory.size() > 0) { var info = this.infoMap.get(container.getServerId()); + if (info == null) { + continue; + } var btn = new HighlightButton(); btn.setMultiplier(this.playerToBlockDis(info.pos())); btn.setTarget(info.pos(), info.face(), info.world()); diff --git a/src/main/java/com/gtocore/mixin/eae/OutputResultSlotMixin.java b/src/main/java/com/gtocore/mixin/eae/OutputResultSlotMixin.java new file mode 100644 index 000000000..3959af094 --- /dev/null +++ b/src/main/java/com/gtocore/mixin/eae/OutputResultSlotMixin.java @@ -0,0 +1,77 @@ +package com.gtocore.mixin.eae; + +import net.minecraft.world.Container; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.level.Level; + +import appeng.api.config.Actionable; +import appeng.api.config.PowerMultiplier; +import appeng.api.networking.energy.IEnergySource; +import appeng.api.networking.security.IActionSource; +import appeng.api.stacks.AEItemKey; +import appeng.api.stacks.KeyCounter; +import appeng.api.storage.MEStorage; +import appeng.util.prioritylist.IPartitionList; +import com.glodblock.github.extendedae.client.gui.widget.OutputResultSlot; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(OutputResultSlot.class) +public class OutputResultSlotMixin { + + @Shadow(remap = false) + @Final + private IEnergySource energySrc; + + @Shadow(remap = false) + @Final + private IActionSource mySrc; + + /** + * @author .. + * @reason 编译时使用正确的方法签名 + */ + @Overwrite(remap = false) + private ItemStack extractItemsByRecipe(MEStorage src, Level level, Recipe r, ItemStack output, CraftingContainer ci, ItemStack providedTemplate, int slot, KeyCounter items, IPartitionList filter) { + if (this.energySrc.extractAEPower(1, Actionable.SIMULATE, PowerMultiplier.CONFIG) > 0.9) { + if (providedTemplate == null) { + return ItemStack.EMPTY; + } + var ae_req = AEItemKey.of(providedTemplate); + if (ae_req != null) { + if (filter == null || filter.isListed(ae_req)) { + var extracted = src.extract(ae_req, 1, Actionable.MODULATE, this.mySrc); + if (extracted > 0) { + this.energySrc.extractAEPower(1, Actionable.MODULATE, PowerMultiplier.CONFIG); + return ae_req.toStack(); + } + } + } + var checkFuzzy = providedTemplate.hasTag() || providedTemplate.isDamageableItem(); + if (items != null && checkFuzzy) { + for (var x : items) { + if (x.getKey() instanceof AEItemKey itemKey) { + if (providedTemplate.getItem() == itemKey.getItem() && !itemKey.matches(output)) { + ci.setItem(slot, itemKey.toStack()); + if (r.matches(ci, level) && ItemStack.matches(r.assemble(ci, level.registryAccess()), output)) { + if (filter == null || filter.isListed(itemKey)) { + var ex = src.extract(itemKey, 1, Actionable.MODULATE, this.mySrc); + if (ex > 0) { + this.energySrc.extractAEPower(1, Actionable.MODULATE, PowerMultiplier.CONFIG); + return itemKey.toStack(); + } + } + } + ci.setItem(slot, providedTemplate); + } + } + } + } + } + return ItemStack.EMPTY; + } +} diff --git a/src/main/java/com/gtocore/mixin/eae/PartExPatternProviderMixin.java b/src/main/java/com/gtocore/mixin/eae/PartExPatternProviderMixin.java index f8922e557..1d39ad4af 100644 --- a/src/main/java/com/gtocore/mixin/eae/PartExPatternProviderMixin.java +++ b/src/main/java/com/gtocore/mixin/eae/PartExPatternProviderMixin.java @@ -2,7 +2,7 @@ import com.gtocore.config.GTOConfig; -import com.gtolib.GTOCore; +import com.gregtechceu.gtceu.GTCEu; import appeng.helpers.patternprovider.PatternProviderLogic; import com.glodblock.github.extendedae.common.parts.PartExPatternProvider; @@ -28,8 +28,8 @@ public abstract class PartExPatternProviderMixin { private void modifyCreateLogic(CallbackInfoReturnable cir) { // This method is intentionally left empty to prevent the original logic from executing. // The logic is handled in the XModUtils class. - if (!GTOCore.isExpert() && GTOConfig.INSTANCE.exPatternSize > 36) { - cir.setReturnValue(new PatternProviderLogic(exae$getSelf().getMainNode(), exae$getSelf(), GTOConfig.INSTANCE.exPatternSize)); + if (GTCEu.isDev() && GTOConfig.INSTANCE.gamePlay.exPatternSize > 36) { + cir.setReturnValue(new PatternProviderLogic(exae$getSelf().getMainNode(), exae$getSelf(), GTOConfig.INSTANCE.gamePlay.exPatternSize)); } } } diff --git a/src/main/java/com/gtocore/mixin/eae/PartSpecialExportBusMixin.java b/src/main/java/com/gtocore/mixin/eae/PartSpecialExportBusMixin.java new file mode 100644 index 000000000..3e326d9b1 --- /dev/null +++ b/src/main/java/com/gtocore/mixin/eae/PartSpecialExportBusMixin.java @@ -0,0 +1,37 @@ +package com.gtocore.mixin.eae; + +import appeng.api.networking.storage.IStorageService; +import appeng.api.parts.IPartItem; +import appeng.api.storage.AEKeyFilter; +import appeng.core.settings.TickRates; +import appeng.parts.automation.IOBusPart; +import com.glodblock.github.extendedae.common.parts.base.PartSpecialExportBus; +import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; + +import java.util.Set; + +@Mixin(PartSpecialExportBus.class) +public abstract class PartSpecialExportBusMixin extends IOBusPart implements IStorageService.UpdateRequester { + + public PartSpecialExportBusMixin(TickRates tickRates, @Nullable AEKeyFilter filter, IPartItem partItem) { + super(tickRates, filter, partItem); + } + + @Override + protected void onUpgradesChanged() { + super.onUpgradesChanged(); + runListener(); + } + + @Override + public boolean isUpdateRequested(IStorageService service) { + return true; + } + + @Override + public Set getListener() { + return new ReferenceOpenHashSet<>(); + } +} diff --git a/src/main/java/com/gtocore/mixin/eae/TileAssemblerMatrixPatternMixin.java b/src/main/java/com/gtocore/mixin/eae/TileAssemblerMatrixPatternMixin.java new file mode 100644 index 000000000..354de0b53 --- /dev/null +++ b/src/main/java/com/gtocore/mixin/eae/TileAssemblerMatrixPatternMixin.java @@ -0,0 +1,15 @@ +package com.gtocore.mixin.eae; + +import com.gtocore.integration.ae.hooks.IExtendedPatternContainer; + +import com.glodblock.github.extendedae.common.tileentities.matrix.TileAssemblerMatrixPattern; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(TileAssemblerMatrixPattern.class) +public abstract class TileAssemblerMatrixPatternMixin implements IExtendedPatternContainer { + + @Override + public boolean gto$isCraftingContainer() { + return true; + } +} diff --git a/src/main/java/com/gtocore/mixin/eae/TileExPatternProviderMixin.java b/src/main/java/com/gtocore/mixin/eae/TileExPatternProviderMixin.java index d8bbeed98..cf0563b97 100644 --- a/src/main/java/com/gtocore/mixin/eae/TileExPatternProviderMixin.java +++ b/src/main/java/com/gtocore/mixin/eae/TileExPatternProviderMixin.java @@ -2,7 +2,7 @@ import com.gtocore.config.GTOConfig; -import com.gtolib.GTOCore; +import com.gregtechceu.gtceu.GTCEu; import appeng.helpers.patternprovider.PatternProviderLogic; import com.glodblock.github.extendedae.common.tileentities.TileExPatternProvider; @@ -28,8 +28,8 @@ public abstract class TileExPatternProviderMixin { private void modifyCreateLogic(CallbackInfoReturnable cir) { // This method is intentionally left empty to prevent the original logic from executing. // The logic is handled in the XModUtils class. - if (!GTOCore.isExpert() && GTOConfig.INSTANCE.exPatternSize > 36) { - cir.setReturnValue(new PatternProviderLogic(exae$getSelf().getMainNode(), exae$getSelf(), GTOConfig.INSTANCE.exPatternSize)); + if (GTCEu.isDev() && GTOConfig.INSTANCE.gamePlay.exPatternSize > 36) { + cir.setReturnValue(new PatternProviderLogic(exae$getSelf().getMainNode(), exae$getSelf(), GTOConfig.INSTANCE.gamePlay.exPatternSize)); } } } diff --git a/src/main/java/com/gtocore/mixin/ftbq/QuestScreenMixin.java b/src/main/java/com/gtocore/mixin/ftbq/QuestScreenMixin.java deleted file mode 100644 index 7df01499b..000000000 --- a/src/main/java/com/gtocore/mixin/ftbq/QuestScreenMixin.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.gtocore.mixin.ftbq; - -import com.gtocore.client.forge.GTOComponentHandlerKt; -import com.gtocore.config.GTOConfig; - -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -import dev.ftb.mods.ftblibrary.util.TooltipList; -import dev.ftb.mods.ftbquests.quest.TeamData; -import dev.ftb.mods.ftbquests.quest.task.ItemTask; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(value = ItemTask.class, remap = false) -@OnlyIn(Dist.CLIENT) -public class QuestScreenMixin { - - @Shadow - private ItemStack itemStack; - - @Inject(method = "addMouseOverText", at = @At("TAIL")) - private void addInfoTooltip(TooltipList list, TeamData teamData, CallbackInfo ci) { - if (!GTOConfig.INSTANCE.showEnglishName) return; - if (itemStack.isEmpty()) return; - GTOComponentHandlerKt.getEnglish(itemStack).ifPresent(list::add); - } -} diff --git a/src/main/java/com/gtocore/mixin/ftbu/FTBUltiminePlayerDataMixin.java b/src/main/java/com/gtocore/mixin/ftbu/FTBUltiminePlayerDataMixin.java index 3bc9aa927..9a7eddb32 100644 --- a/src/main/java/com/gtocore/mixin/ftbu/FTBUltiminePlayerDataMixin.java +++ b/src/main/java/com/gtocore/mixin/ftbu/FTBUltiminePlayerDataMixin.java @@ -16,11 +16,11 @@ public class FTBUltiminePlayerDataMixin { @ModifyVariable(method = "updateBlocks", at = @At(value = "STORE", ordinal = 2), remap = false, name = "matcher") private BlockMatcher modifyBlockMatcher(BlockMatcher matcher) { - if (GTOConfig.INSTANCE.breakBlocksBlackList == null || GTOConfig.INSTANCE.breakBlocksBlackList.length < 1) { + if (GTOConfig.INSTANCE.gamePlay.breakBlocksBlackList == null || GTOConfig.INSTANCE.gamePlay.breakBlocksBlackList.length < 1) { return matcher; } return (original, state) -> { - boolean flag = !StringUtils.containsWithWildcard(GTOConfig.INSTANCE.breakBlocksBlackList, + boolean flag = !StringUtils.containsWithWildcard(GTOConfig.INSTANCE.gamePlay.breakBlocksBlackList, ItemUtils.getId(state.getBlock())); return flag && state.getBlock() == original.getBlock(); }; diff --git a/src/main/java/com/gtocore/mixin/gtm/GTCEuMixin.java b/src/main/java/com/gtocore/mixin/gtm/GTCEuMixin.java index 7b9f4b256..42973a697 100644 --- a/src/main/java/com/gtocore/mixin/gtm/GTCEuMixin.java +++ b/src/main/java/com/gtocore/mixin/gtm/GTCEuMixin.java @@ -19,6 +19,6 @@ public class GTCEuMixin { @Overwrite(remap = false) public static boolean isDev() { if (GTOConfig.INSTANCE == null) return false; - return !FMLLoader.isProduction() || GTOConfig.INSTANCE.dev || GTCEu.isDataGen(); + return !FMLLoader.isProduction() || GTOConfig.INSTANCE.devMode.dev || GTCEu.isDataGen(); } } diff --git a/src/main/java/com/gtocore/mixin/gtm/api/machine/RecipeLogicMixin.java b/src/main/java/com/gtocore/mixin/gtm/api/machine/RecipeLogicMixin.java index 3667ddb1e..3431501dd 100644 --- a/src/main/java/com/gtocore/mixin/gtm/api/machine/RecipeLogicMixin.java +++ b/src/main/java/com/gtocore/mixin/gtm/api/machine/RecipeLogicMixin.java @@ -2,7 +2,6 @@ import com.gtolib.api.machine.feature.multiblock.IExtendedRecipeCapabilityHolder; import com.gtolib.api.machine.trait.IEnhancedRecipeLogic; -import com.gtolib.api.misc.AsyncTask; import com.gtolib.api.recipe.*; import com.gtolib.api.recipe.modifier.ParallelCache; @@ -13,6 +12,7 @@ import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.utils.TaskHandler; import net.minecraft.network.chat.Component; @@ -33,8 +33,7 @@ public abstract class RecipeLogicMixin extends MachineTrait implements IEnhanced private ParallelCache gtolib$parallelCache; @Unique private RecipeBuilder gtolib$recipeBuilder; - @Unique - private AsyncTask gtolib$asyncRecipeOutputTask; + @Unique @DescSynced private Component gtolib$reason; @@ -68,21 +67,6 @@ protected RecipeLogicMixin(MetaMachine machine) { @Shadow public abstract boolean checkMatchedRecipeAvailable(GTRecipe match); - @Override - public void setAsyncTask(AsyncTask task) { - gtolib$asyncRecipeOutputTask = task; - } - - @Override - public AsyncTask getAsyncTask() { - return gtolib$asyncRecipeOutputTask; - } - - @Override - public void onMachineUnLoad() { - AsyncTask.removeAsyncTask(this); - } - @Override public void gtolib$setIdleReason(Component reason) { this.gtolib$reason = reason; @@ -139,7 +123,7 @@ protected boolean checkConditions(GTRecipe recipe) { protected boolean handleRecipeIO(GTRecipe recipe, IO io) { if (io == IO.OUT && machine instanceof IExtendedRecipeCapabilityHolder outputMachine && outputMachine.isDualMEOutput(recipe)) { var contents = new RecipeCapabilityMap<>(recipe.outputs); - AsyncTask.addAsyncTask(this, () -> RecipeRunner.handleRecipe(machine, (Recipe) recipe, IO.OUT, contents, getChanceCaches(), false)); + TaskHandler.enqueueAsyncTask(getMachine().getLevel(), () -> RecipeRunner.handleRecipe(machine, (Recipe) recipe, IO.OUT, contents, getChanceCaches(), false), 0); return true; } return RecipeRunner.handleRecipeIO(machine, (Recipe) recipe, io, chanceCaches); diff --git a/src/main/java/com/gtocore/mixin/gtm/recipe/RecyclingRecipesMixin.java b/src/main/java/com/gtocore/mixin/gtm/recipe/RecyclingRecipesMixin.java index 11e0b479b..d5254ee6b 100644 --- a/src/main/java/com/gtocore/mixin/gtm/recipe/RecyclingRecipesMixin.java +++ b/src/main/java/com/gtocore/mixin/gtm/recipe/RecyclingRecipesMixin.java @@ -1,8 +1,9 @@ package com.gtocore.mixin.gtm.recipe; +import com.gtocore.config.GTOConfig; + import com.gtolib.utils.ItemUtils; -import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; @@ -81,7 +82,7 @@ private static ItemStack getArcIngotOrDust(@NotNull MaterialStack stack) { */ @Overwrite(remap = false) public static void init() { - if (GTCEu.isDev()) return; + if (GTOConfig.INSTANCE.devMode.disableRecyclingRecipes) return; for (var entry : ITEM_MATERIAL_INFO.entrySet()) { var item = entry.getKey(); if (item instanceof IGTTool) continue; @@ -95,7 +96,7 @@ public static void init() { */ @Overwrite(remap = false) public static void registerRecyclingRecipes(ItemStack input, List components, boolean ignoreArcSmelting, @Nullable TagPrefix prefix) { - if (GTCEu.isDev()) return; + if (GTOConfig.INSTANCE.devMode.disableRecyclingRecipes) return; List materials = components.stream() .filter(stack -> stack.material().hasProperty(PropertyKey.DUST)) .filter(stack -> stack.amount() >= M / 9) diff --git a/src/main/java/com/gtocore/mixin/gtm/registry/GTMultiMachinesMixin.java b/src/main/java/com/gtocore/mixin/gtm/registry/GTMultiMachinesMixin.java index feb965adb..22b6f6125 100644 --- a/src/main/java/com/gtocore/mixin/gtm/registry/GTMultiMachinesMixin.java +++ b/src/main/java/com/gtocore/mixin/gtm/registry/GTMultiMachinesMixin.java @@ -22,13 +22,14 @@ import java.util.function.Function; import static com.gtocore.api.machine.part.GTOPartAbility.ACCELERATE_HATCH; +import static com.gtocore.api.machine.part.GTOPartAbility.EXTRA_ENERGY_HATCH; @Mixin(GTMultiMachines.class) public class GTMultiMachinesMixin { @Redirect(method = "", at = @At(value = "INVOKE", target = "Lcom/gregtechceu/gtceu/api/registry/registrate/GTRegistrate;multiblock(Ljava/lang/String;Ljava/util/function/Function;)Lcom/gregtechceu/gtceu/api/registry/registrate/MultiblockMachineBuilder;", ordinal = 2), remap = false) private static MultiblockMachineBuilder electric_blast_furnace(GTRegistrate instance, String name, Function metaMachine) { - return GTORegistration.GTM.multiblock(name, CoilMultiblockMachine.createCoilMachine(true, false)).moduleTooltips(ACCELERATE_HATCH).upgradable(); + return GTORegistration.GTM.multiblock(name, CoilMultiblockMachine.createCoilMachine(true, false)).moduleTooltips(ACCELERATE_HATCH, EXTRA_ENERGY_HATCH).upgradable(); } @Redirect(method = "", at = @At(value = "INVOKE", target = "Lcom/gregtechceu/gtceu/api/registry/registrate/GTRegistrate;multiblock(Ljava/lang/String;Ljava/util/function/Function;)Lcom/gregtechceu/gtceu/api/registry/registrate/MultiblockMachineBuilder;", ordinal = 3), remap = false) diff --git a/src/main/java/com/gtocore/mixin/jade/CommonProxyMixin.java b/src/main/java/com/gtocore/mixin/jade/CommonProxyMixin.java index ae5c71f76..81449df08 100644 --- a/src/main/java/com/gtocore/mixin/jade/CommonProxyMixin.java +++ b/src/main/java/com/gtocore/mixin/jade/CommonProxyMixin.java @@ -2,7 +2,9 @@ import com.gtocore.common.blockentity.TesseractBlockEntity; import com.gtocore.common.machine.multiblock.part.ae.MEPatternPartMachineKt; +import com.gtocore.integration.Mods; import com.gtocore.integration.jade.GTOJadePlugin; +import com.gtocore.integration.lang.LangAdaptor; import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; @@ -18,6 +20,7 @@ import net.minecraftforge.items.IItemHandler; import appeng.integration.modules.jade.JadeModule; +import com.google.common.collect.ImmutableList; import dev.shadowsoffire.apotheosis.adventure.compat.AdventureHwylaPlugin; import dev.shadowsoffire.apotheosis.ench.compat.EnchHwylaPlugin; import org.spongepowered.asm.mixin.Mixin; @@ -45,8 +48,9 @@ public class CommonProxyMixin { */ @Overwrite(remap = false) private void loadComplete(FMLLoadCompleteEvent event) { - List plugins = List.of(new VanillaPlugin(), new UniversalPlugin(), new CorePlugin(), new JadeModule(), new GTOJadePlugin(), new AdventureHwylaPlugin(), new EnchHwylaPlugin()); - for (IWailaPlugin plugin : plugins) { + var plugins = ImmutableList.builder().add(new VanillaPlugin(), new UniversalPlugin(), new CorePlugin(), new JadeModule(), new GTOJadePlugin(), new AdventureHwylaPlugin(), new EnchHwylaPlugin()); + if (Mods.LANG.isLoaded()) LangAdaptor.addPlugin(plugins); + for (IWailaPlugin plugin : plugins.build()) { plugin.register(WailaCommonRegistration.INSTANCE); if (CommonProxy.isPhysicallyClient()) { plugin.registerClient(WailaClientRegistration.INSTANCE); diff --git a/src/main/java/com/gtocore/mixin/GameRendererMixin.java b/src/main/java/com/gtocore/mixin/mc/GameRendererMixin.java similarity index 93% rename from src/main/java/com/gtocore/mixin/GameRendererMixin.java rename to src/main/java/com/gtocore/mixin/mc/GameRendererMixin.java index 9413935c8..4153d94d4 100644 --- a/src/main/java/com/gtocore/mixin/GameRendererMixin.java +++ b/src/main/java/com/gtocore/mixin/mc/GameRendererMixin.java @@ -1,4 +1,4 @@ -package com.gtocore.mixin; +package com.gtocore.mixin.mc; import net.minecraft.world.entity.LivingEntity; diff --git a/src/main/java/com/gtocore/mixin/mc/LanguageMixin.java b/src/main/java/com/gtocore/mixin/mc/LanguageMixin.java index 8b0572e79..bd983f0df 100644 --- a/src/main/java/com/gtocore/mixin/mc/LanguageMixin.java +++ b/src/main/java/com/gtocore/mixin/mc/LanguageMixin.java @@ -31,7 +31,7 @@ public class LanguageMixin { @Inject(method = "getInstance", at = @At("HEAD"), cancellable = true) private static void getInstance(CallbackInfoReturnable cir) { - if (!gto$isDedicatedServer || GTOConfig.INSTANCE.serverLang.equals("en_us")) return; + if (!gto$isDedicatedServer || GTOConfig.INSTANCE.misc.serverLang.equals("en_us")) return; if (gto$serverLanguage != null) { cir.setReturnValue(gto$serverLanguage); return; diff --git a/src/main/java/com/gtocore/mixin/mc/mob/LivingEntityMixin.java b/src/main/java/com/gtocore/mixin/mc/mob/LivingEntityMixin.java index 622181eab..df1d0c36f 100644 --- a/src/main/java/com/gtocore/mixin/mc/mob/LivingEntityMixin.java +++ b/src/main/java/com/gtocore/mixin/mc/mob/LivingEntityMixin.java @@ -48,7 +48,7 @@ protected LivingEntityMixin(EntityType entityType, Level level) { @Inject(method = "hasEffect", at = @At("HEAD"), cancellable = true) @SuppressWarnings({ "ConstantConditions", "resource" }) private void gto$hasEffectInject(MobEffect effect, CallbackInfoReturnable cir) { - if (effect == MobEffects.NIGHT_VISION && level().isClientSide() && (Object) this instanceof Player && GTOConfig.INSTANCE.nightVision) { + if (effect == MobEffects.NIGHT_VISION && level().isClientSide() && (Object) this instanceof Player && GTOConfig.INSTANCE.client.nightVision) { cir.setReturnValue(true); } } diff --git a/src/main/java/com/gtocore/mixin/mc/mob/MobMixin.java b/src/main/java/com/gtocore/mixin/mc/mob/MobMixin.java index 9c83b832a..23307f4b6 100644 --- a/src/main/java/com/gtocore/mixin/mc/mob/MobMixin.java +++ b/src/main/java/com/gtocore/mixin/mc/mob/MobMixin.java @@ -72,7 +72,7 @@ private void readAdditionalSaveData(CompoundTag compound, CallbackInfo ci) { @Inject(method = "tick", at = @At("HEAD")) private void tick(CallbackInfo ci) { - if (GTOConfig.INSTANCE.mobConfig.naturalRegeneration && !level().isClientSide() && tickCount % 80 == 8 && getRandom().nextBoolean()) { + if (GTOConfig.INSTANCE.gamePlay.mobConfig.naturalRegeneration && !level().isClientSide() && tickCount % 80 == 8 && getRandom().nextBoolean()) { int value = Math.max(1, (int) (Math.log(getMaxHealth() * Math.max(1, level().getDifficulty().getId())) + 0.5)); heal(value); } diff --git a/src/main/java/com/gtocore/mixin/patchouli/ForgeModInitializerMixin.java b/src/main/java/com/gtocore/mixin/patchouli/ForgeModInitializerMixin.java index 57defdeb2..dfffbdf0c 100644 --- a/src/main/java/com/gtocore/mixin/patchouli/ForgeModInitializerMixin.java +++ b/src/main/java/com/gtocore/mixin/patchouli/ForgeModInitializerMixin.java @@ -1,6 +1,6 @@ package com.gtocore.mixin.patchouli; -import com.gtolib.utils.GTOUtils; +import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.player.PlayerInteractEvent; @@ -34,6 +34,6 @@ public static void onInitialize(FMLCommonSetupEvent evt) { ForgeNetworkHandler.registerMessages(); - GTOUtils.startThread(BookRegistry.INSTANCE::init); + GTUtil.ASYNC_EXECUTOR.execute(BookRegistry.INSTANCE::init); } } diff --git a/src/main/java/com/gtocore/mixin/sodium/SodiumWorldRendererMixin.java b/src/main/java/com/gtocore/mixin/sodium/SodiumWorldRendererMixin.java index dfbd1c759..b29fd7747 100644 --- a/src/main/java/com/gtocore/mixin/sodium/SodiumWorldRendererMixin.java +++ b/src/main/java/com/gtocore/mixin/sodium/SodiumWorldRendererMixin.java @@ -18,6 +18,6 @@ public class SodiumWorldRendererMixin { @ModifyExpressionValue(method = "renderGlobalBlockEntities", at = @At(value = "INVOKE", target = "Lme/jellysquid/mods/sodium/client/render/viewport/Viewport;isBoxVisible(Lnet/minecraft/world/phys/AABB;)Z", remap = false), remap = false) private boolean renderGlobalBlockEntities(boolean original, @Local(name = "blockEntity") BlockEntity blockEntity) { if (original) return true; - return GTOConfig.INSTANCE.disableEmbeddiumBECulling && blockEntity instanceof MetaMachineBlockEntity; + return GTOConfig.INSTANCE.client.disableEmbeddiumBECulling && blockEntity instanceof MetaMachineBlockEntity; } } diff --git a/src/main/java/com/gtocore/utils/AEKeySubstitutionMap.kt b/src/main/java/com/gtocore/utils/AEKeySubstitutionMap.kt new file mode 100644 index 000000000..88119773d --- /dev/null +++ b/src/main/java/com/gtocore/utils/AEKeySubstitutionMap.kt @@ -0,0 +1,49 @@ +package com.gtocore.utils + +import appeng.api.stacks.AEKey +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap + +import java.util.concurrent.ConcurrentHashMap + +class AEKeySubstitutionMap(priorityGroups: List>) { + + // 缓存:从任意Key映射到其首选Key,用于极速查询。 + private val keyToPreferredCache = ConcurrentHashMap() + + // 核心规则:从任意Key映射到其所在的整个优先级列表。 + private val keyToPriorityGroup: Map> + + init { + val mapBuilder = Object2ObjectOpenHashMap>() + priorityGroups.forEach { group -> + if (group.isNotEmpty()) { + group.forEach { key -> + mapBuilder[key] = group + } + } + } + this.keyToPriorityGroup = mapBuilder + } + + /** + * 获取给定AEKey的替换项(首选Key)。 + * + * @param key 需要查询的原始AEKey。 + * @return 替换后的首选AEKey。如果该Key没有定义替换规则,则返回其自身。 + */ + fun getSubstitution(key: AEKey): AEKey { + keyToPreferredCache[key]?.let { return it } + + val priorityGroup = keyToPriorityGroup[key] + + val preferredKey = priorityGroup?.firstOrNull() ?: key + + keyToPreferredCache[key] = preferredKey + return preferredKey + } + + companion object { + @JvmField + val EMPTY = AEKeySubstitutionMap(emptyList()) + } +} diff --git a/src/main/java/com/gtocore/utils/AEPatternRefresher.kt b/src/main/java/com/gtocore/utils/AEPatternRefresher.kt new file mode 100644 index 000000000..546c547ac --- /dev/null +++ b/src/main/java/com/gtocore/utils/AEPatternRefresher.kt @@ -0,0 +1,85 @@ +package com.gtocore.utils + +import com.gtocore.common.machine.multiblock.part.ae.MEPatternPartMachineKt + +import appeng.api.networking.IGrid +import appeng.blockentity.crafting.PatternProviderBlockEntity +import com.gtolib.api.ae2.IExpandedGrid +import kotlinx.coroutines.* + +import java.lang.Runnable + +object AEPatternRefresher { + + private const val TASK_CHUNK_SIZE = 10 + private const val DELAY_BETWEEN_CHUNKS_MS = 100L + + /** + * 触发异步刷新。此方法会自动处理协程的启动和线程调度。 + * 无需返回值,调用即运行。 + */ + @JvmStatic + fun refresh(grid: IGrid) { + // 1. 安全检查:确保我们在服务端且 Grid 有效 + val level = grid.pivot?.level ?: return + val server = level.server + + // 2. [主线程] 收集所有任务 + // 必须在主线程收集,因为 getActiveMachines 不是线程安全的 + val refreshTasks = mutableListOf() + + // 收集标准样板提供者 + grid.getActiveMachines(PatternProviderBlockEntity::class.java).forEach { machine -> + refreshTasks.add( + Runnable { + if (!machine.isRemoved) { // 执行前检查机器是否还存在 + machine.logic.updatePatterns() + } + }, + ) + } + + // 收集 GTOCore/GTCEu 扩展机器 + if (grid is IExpandedGrid) { + grid.machines.values() + .filter { it.isActive } + .mapNotNull { it.owner as? MEPatternPartMachineKt<*> } + .forEach { machine -> + refreshTasks.add( + Runnable { + (0 until machine.maxPatternCount).forEach { slotIndex -> + if (!machine.internalPatternInventory.getStackInSlot(slotIndex).isEmpty) { + machine.onPatternChange(slotIndex) + } + } + }, + ) + } + } + + if (refreshTasks.isEmpty()) return + + // 3. [协程] 启动异步处理流程 + // 使用 GlobalScope 启动一个即使当前方法返回也会继续执行的任务 + // Dispatchers.Default 用于处理 delay 等待,不占用主线程 + @OptIn(DelicateCoroutinesApi::class) + GlobalScope.launch(Dispatchers.Default) { + refreshTasks.chunked(TASK_CHUNK_SIZE).forEach { chunk -> + + // 4. [主线程] 调度执行实际的更新逻辑 + server.execute { + chunk.forEach { task -> + try { + task.run() + } catch (e: Exception) { + e.printStackTrace() // 防止单个报错中断整个流程 + } + } + } + + // 5. [后台线程] 等待,避免卡顿 + delay(DELAY_BETWEEN_CHUNKS_MS) + } + } + } +} diff --git a/src/main/java/com/gtocore/api/ae2/gui/AdvMathExpParser.kt b/src/main/java/com/gtocore/utils/AdvMathExpParser.kt similarity index 94% rename from src/main/java/com/gtocore/api/ae2/gui/AdvMathExpParser.kt rename to src/main/java/com/gtocore/utils/AdvMathExpParser.kt index 3b4b7b774..eb8b13a46 100644 --- a/src/main/java/com/gtocore/api/ae2/gui/AdvMathExpParser.kt +++ b/src/main/java/com/gtocore/utils/AdvMathExpParser.kt @@ -1,13 +1,29 @@ -package com.gtocore.api.ae2.gui +package com.gtocore.utils + +import com.google.common.cache.Cache +import com.google.common.cache.CacheBuilder import java.math.BigDecimal import java.math.MathContext import java.math.RoundingMode import java.text.DecimalFormat import java.text.ParsePosition -import java.util.* +import java.util.ArrayDeque +import java.util.ArrayList +import java.util.concurrent.TimeUnit +import kotlin.collections.iterator object AdvMathExpParser { + + private val CACHE: Cache = CacheBuilder.newBuilder() + .maximumWeight(100_000) // ~ 100KB - 1MB + .weigher { key: String, value: BigDecimal -> + key.length + value.precision() + } + .expireAfterAccess(5, TimeUnit.MINUTES) + .concurrencyLevel(4) + .build() + private const val MAX_SHIFT = 64 private val MAX_EXPONENT = 30.toBigDecimal() private val MAX_BASE = 1E9.toBigDecimal() @@ -67,9 +83,22 @@ object AdvMathExpParser { fun parse(expression: String, format: DecimalFormat? = null): BigDecimal { if (expression.isBlank()) return BigDecimal.ZERO + val useCache = (format == null) + if (useCache) { + val cachedResult = CACHE.getIfPresent(expression) + if (cachedResult != null) { + return cachedResult + } + } + val tokens = tokenize(expression, format) val rpn = shuntingYard(tokens) - return evaluate(rpn) + val result = evaluate(rpn) + + if (useCache) { + CACHE.put(expression, result) + } + return result } // List to prevent boxing diff --git a/src/main/java/com/gtocore/utils/register/MachineRegisterUtils.java b/src/main/java/com/gtocore/utils/register/MachineRegisterUtils.java index abb4202c6..b948bc388 100644 --- a/src/main/java/com/gtocore/utils/register/MachineRegisterUtils.java +++ b/src/main/java/com/gtocore/utils/register/MachineRegisterUtils.java @@ -27,8 +27,6 @@ import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; -import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; -import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.machine.*; import com.gregtechceu.gtceu.api.machine.feature.multiblock.ICoilMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; @@ -334,7 +332,7 @@ public static MultiblockMachineDefinition registerLargeCombustionEngine(GTORegis .aisle("A A", "A A", "A A", " AAA ") .aisle("A A", " H ", " ", " ") .where('A', blocks(GTBlocks.CASING_TITANIUM_TURBINE.get())) - .where('B', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) + .where('B', GTOPredicates.frame(GTMaterials.StainlessSteel)) .where('C', blocks(GTBlocks.CASING_TITANIUM_STABLE.get())) .where('D', blocks(GTBlocks.FIREBOX_TITANIUM.get())) .where('E', abilities(MUFFLER)) @@ -355,7 +353,7 @@ public static MultiblockMachineDefinition registerLargeCombustionEngine(GTORegis .aisle("A A", "A A", "A A", " AAA ") .aisle("A A", " H ", " ", " ") .where('A', blocks(GTBlocks.CASING_TITANIUM_TURBINE.get())) - .where('B', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.BlueSteel))) + .where('B', GTOPredicates.frame(GTMaterials.BlueSteel)) .where('C', blocks(GTBlocks.CASING_TITANIUM_STABLE.get())) .where('D', blocks(GTBlocks.FIREBOX_TITANIUM.get())) .where('E', abilities(MUFFLER)) @@ -377,7 +375,7 @@ public static MultiblockMachineDefinition registerLargeCombustionEngine(GTORegis .aisle("A A", "A A", "A A", " AAA ") .aisle("A A", " H ", " ", " ") .where('A', blocks(GTBlocks.CASING_TUNGSTENSTEEL_TURBINE.get())) - .where('B', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.BlackSteel))) + .where('B', GTOPredicates.frame(GTMaterials.BlackSteel)) .where('C', blocks(GTBlocks.CASING_TUNGSTENSTEEL_ROBUST.get())) .where('D', blocks(GTBlocks.FIREBOX_TUNGSTENSTEEL.get())) .where('E', abilities(MUFFLER)) @@ -431,7 +429,7 @@ public static MultiblockMachineDefinition registerLargeTurbine(GTORegistration r .where('D', blocks(GTBlocks.CASING_STEEL_TURBINE.get()) .or(abilities(PartAbility.OUTPUT_ENERGY).setMaxGlobalLimited(3))) .where('E', controller(definition)) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) + .where('F', GTOPredicates.frame(GTMaterials.StainlessSteel)) .where(' ', any()) .build()); } else if (recipeType == GTORecipeTypes.GAS_TURBINE_FUELS) { @@ -447,7 +445,7 @@ public static MultiblockMachineDefinition registerLargeTurbine(GTORegistration r .where('D', blocks(GTBlocks.CASING_STAINLESS_TURBINE.get()) .or(abilities(PartAbility.OUTPUT_ENERGY).setMaxGlobalLimited(3))) .where('E', controller(definition)) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.BlackSteel))) + .where('F', GTOPredicates.frame(GTMaterials.BlackSteel)) .where(' ', any()) .build()); } else if (recipeType == GTORecipeTypes.ROCKET_ENGINE_FUELS) { @@ -463,7 +461,7 @@ public static MultiblockMachineDefinition registerLargeTurbine(GTORegistration r .where('D', blocks(GTBlocks.CASING_TITANIUM_TURBINE.get()) .or(abilities(PartAbility.OUTPUT_ENERGY).setMaxGlobalLimited(3))) .where('E', controller(definition)) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.BlueSteel))) + .where('F', GTOPredicates.frame(GTMaterials.BlueSteel)) .where(' ', any()) .build()); } else if (recipeType == GTORecipeTypes.SUPERCRITICAL_STEAM_TURBINE_FUELS) { @@ -479,7 +477,7 @@ public static MultiblockMachineDefinition registerLargeTurbine(GTORegistration r .where('D', blocks(GTOBlocks.SUPERCRITICAL_TURBINE_CASING.get()) .or(abilities(PartAbility.OUTPUT_ENERGY).setMaxGlobalLimited(3))) .where('E', controller(definition)) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.TungstenSteel))) + .where('F', GTOPredicates.frame(GTMaterials.TungstenSteel)) .where(' ', any()) .build()); } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 1b1082d66..210241440 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -77,4 +77,5 @@ public net.minecraft.client.renderer.RenderStateShard f_110110_ # NO_CULL public net.minecraft.client.renderer.RenderStateShard f_173095_ # RENDERTYPE_LINES_SHADER public net.minecraft.world.entity.ExperienceOrb m_147092_(Lnet/minecraft/world/entity/player/Player;I)I # repairPlayerItems -public net.minecraft.client.renderer.LevelRenderer f_109464_ # renderBuffers \ No newline at end of file +public net.minecraft.client.renderer.LevelRenderer f_109464_ # renderBuffers +public net.minecraft.client.gui.components.EditBox f_94089_ # responder \ No newline at end of file diff --git a/src/main/resources/assets/ae2/screens/terminals/pattern_content_access_terminal.json b/src/main/resources/assets/ae2/screens/terminals/pattern_content_access_terminal.json new file mode 100644 index 000000000..1cb63e5b1 --- /dev/null +++ b/src/main/resources/assets/ae2/screens/terminals/pattern_content_access_terminal.json @@ -0,0 +1,21 @@ +{ + "$schema": "../schema.json", + "includes": ["../common/common.json", "../common/player_inventory.json"], + "text": { + "dialog_title": { + "text": { + "translate": "gtocore.ae.appeng.pattern_content_access_terminal" + }, + "position": { + "left": 8, + "top": 6 + } + } + }, + "widgets": { + "scrollbar": { + "left": 175, + "top": 18 + } + } +} diff --git a/src/main/resources/assets/gtocore/models/item/pattern_content_access_terminal.json b/src/main/resources/assets/gtocore/models/item/pattern_content_access_terminal.json new file mode 100644 index 000000000..beb0659f5 --- /dev/null +++ b/src/main/resources/assets/gtocore/models/item/pattern_content_access_terminal.json @@ -0,0 +1,9 @@ +{ + "parent": "ae2:item/display_base", + "textures": { + "front": "ae2:part/pattern_access_terminal", + "front_bright": "gtocore:part/pattern_content_access_terminal_bright", + "front_medium": "gtocore:part/pattern_content_access_terminal_medium", + "front_dark": "gtocore:part/pattern_content_access_terminal_dark" + } +} diff --git a/src/main/resources/assets/gtocore/models/part/pattern_content_access_terminal_off.json b/src/main/resources/assets/gtocore/models/part/pattern_content_access_terminal_off.json new file mode 100644 index 000000000..77ac0988b --- /dev/null +++ b/src/main/resources/assets/gtocore/models/part/pattern_content_access_terminal_off.json @@ -0,0 +1,8 @@ +{ + "parent": "ae2:part/display_off", + "textures": { + "lightsBright": "gtocore:part/pattern_content_access_terminal_bright", + "lightsMedium": "gtocore:part/pattern_content_access_terminal_medium", + "lightsDark": "gtocore:part/pattern_content_access_terminal_dark" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtocore/models/part/pattern_content_access_terminal_on.json b/src/main/resources/assets/gtocore/models/part/pattern_content_access_terminal_on.json new file mode 100644 index 000000000..764f6b634 --- /dev/null +++ b/src/main/resources/assets/gtocore/models/part/pattern_content_access_terminal_on.json @@ -0,0 +1,42 @@ +{ + "textures": { + "lightsBright": "gtocore:part/pattern_content_access_terminal_bright", + "lightsMedium": "gtocore:part/pattern_content_access_terminal_medium", + "lightsDark": "gtocore:part/pattern_content_access_terminal_dark" + }, + "elements": [ + { + "from": [2, 2, 0], + "to": [14, 14, 2], + "faces": { + "north": { + "texture": "#lightsBright", + "tintindex": 3, + "neoforge_data": { "block_light": 15, "sky_light": 15 } + } + } + }, + { + "from": [2, 2, 0], + "to": [14, 14, 2], + "faces": { + "north": { + "texture": "#lightsMedium", + "tintindex": 2, + "neoforge_data": { "block_light": 15, "sky_light": 15 } + } + } + }, + { + "from": [2, 2, 0], + "to": [14, 14, 2], + "faces": { + "north": { + "texture": "#lightsDark", + "tintindex": 1, + "neoforge_data": { "block_light": 15, "sky_light": 15 } + } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/gtocore/textures/item/temporary_order.png b/src/main/resources/assets/gtocore/textures/item/temporary_order.png new file mode 100644 index 000000000..fba2d7abe Binary files /dev/null and b/src/main/resources/assets/gtocore/textures/item/temporary_order.png differ diff --git a/src/main/resources/assets/gtocore/textures/part/pattern_content_access_terminal_bright.png b/src/main/resources/assets/gtocore/textures/part/pattern_content_access_terminal_bright.png new file mode 100644 index 000000000..76c99c689 Binary files /dev/null and b/src/main/resources/assets/gtocore/textures/part/pattern_content_access_terminal_bright.png differ diff --git a/src/main/resources/assets/gtocore/textures/part/pattern_content_access_terminal_dark.png b/src/main/resources/assets/gtocore/textures/part/pattern_content_access_terminal_dark.png new file mode 100644 index 000000000..8affc2651 Binary files /dev/null and b/src/main/resources/assets/gtocore/textures/part/pattern_content_access_terminal_dark.png differ diff --git a/src/main/resources/assets/gtocore/textures/part/pattern_content_access_terminal_medium.png b/src/main/resources/assets/gtocore/textures/part/pattern_content_access_terminal_medium.png new file mode 100644 index 000000000..13ad77365 Binary files /dev/null and b/src/main/resources/assets/gtocore/textures/part/pattern_content_access_terminal_medium.png differ diff --git a/src/main/resources/gtocore.mixins.json b/src/main/resources/gtocore.mixins.json index bad6dad1d..442536897 100644 --- a/src/main/resources/gtocore.mixins.json +++ b/src/main/resources/gtocore.mixins.json @@ -6,7 +6,6 @@ "compatibilityLevel": "JAVA_17", "plugin": "com.gtocore.config.MixinConfigPlugin", "client": [ - "GameRendererMixin", "adastra.AdAstraClientMixin", "adastra.AdAstraOverlayScreenMixin", "adastra.PlanetsScreenMixin", @@ -15,7 +14,6 @@ "ae2.gui.MathExpressionParserMixin", "ae2.gui.NumberEntryWidgetMixin", "ae2.gui.ProcessingEncodingPanelMixin", - "ae2.gui.RepoSearchMixin", "ae2.gui.ScreenStyleMixin", "ae2.gui.SettingToggleButtonMixin", "ae2.gui.WidgetContainerMixin", @@ -31,17 +29,16 @@ "eae.ExPATScreensMixin", "eae.GuiExPatternTerminalMixin", "eae.GuiPatternMixin", - "ftbq.QuestScreenMixin", "gtm.GTRecipeEMICategoryMixin", "gtm.renderer.TagPrefixItemRendererMixin", "inventoryessentials.ClientOnlyInventoryControlsMixin", + "mc.GameRendererMixin", "mc.GuiGraphicsMixin", "mc.OpenContainerMixin", "merequester.NumberFieldMixin", "sodium.SodiumWorldRendererMixin" ], "mixins": [ - "AppliedBotanicsForgeMixin", "adastra.GasTankItemMixin", "adastra.ModBlocksMixin", "adastra.ModItemsMixin", @@ -77,6 +74,7 @@ "ae2.menu.AEBaseMenuMixin", "ae2.menu.ContainerTagExportBusMixin", "ae2.menu.ContainerTagStorageBusMixin", + "ae2.menu.CraftAmountMenuMixin", "ae2.menu.CraftConfirmMenuMixin", "ae2.menu.CraftingCPUMenuMixin", "ae2.menu.CraftingStatusMenuAccessor", @@ -116,8 +114,10 @@ "ae2.wtlib.ItemWTMixin", "ae2.wtlib.WirelessTerminalMenuHostMixin", "apoth.AffixRegistry", + "appbot.AppliedBotanicsForgeMixin", "appbot.FluixPoolBlockEntityMixin", "arseng.ScribesTileMixin", + "arseng.SourceAcceptorBlockEntityMixin", "arsnouveau.RewardsMixin", "biomeswevegone.ManOWarMixin", "botania.AlfheimEventListenerMixin", @@ -140,10 +140,14 @@ "deeperdarker.DDItemsMixin", "eae.BlockExIOPortMixin", "eae.BlockExPatternProviderMixin", + "eae.FCUtilMixin", "eae.MessageUtilMixin", + "eae.OutputResultSlotMixin", "eae.PartExPatternProviderMixin", + "eae.PartSpecialExportBusMixin", "eae.PartThresholdLevelEmitterMixin", "eae.TileAssemblerMatrixBaseMixin", + "eae.TileAssemblerMatrixPatternMixin", "eae.TileExPatternProviderMixin", "endremastered.EREnderEyeMixin", "farmersdelight.CuttingBoardBlockEntityMixin", @@ -154,12 +158,12 @@ "ftbu.FTBUltiminePlayerDataMixin", "ftbu.ShapeContextMixin", "ftbxmodcompat.FTBXModCompatMixin", + "gtm.AdjacentFluidConditionMixin", "gtm.CommonProxyMixin", "gtm.FluidPipeTypeMixin", "gtm.GTCEuMixin", "gtm.GTRecipeWidgetMixin", "gtm.GTUtilMixin", - "gtm.AdjacentFluidConditionMixin", "gtm.api.machine.FluidDrillLogicMixin", "gtm.api.machine.MachineDefinitionMixin", "gtm.api.machine.MetaMachineMixin",