From 86958216913521db97f4dc8e699b45c4ea5325ce Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Thu, 19 Jun 2025 19:19:14 -0600 Subject: [PATCH 01/45] start of lang restructuring --- .../gregtechceu/gtceu/data/lang/ItemLang.java | 136 ++++++++++++++++++ .../gtceu/data/lang/LangHandler.java | 136 ------------------ 2 files changed, 136 insertions(+), 136 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java index 9f7b12ba9f7..c44b752bc5f 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java @@ -52,6 +52,142 @@ private static void initGeneratedNames(RegistrateLangProvider provider) { provider.add("tagprefix.polymer.small_dust", "Small Pile of %s Pulp"); provider.add("tagprefix.polymer.dust", "%s Pulp"); provider.add("tagprefix.polymer.ingot", "%s Ingot"); + + provider.add("item.gtceu.tiny_gunpowder_dust", "Tiny Pile of Gunpowder"); + provider.add("item.gtceu.small_gunpowder_dust", "Small Pile of Gunpowder"); + provider.add("item.gtceu.tiny_paper_dust", "Tiny Pile of Chad"); + provider.add("item.gtceu.small_paper_dust", "Small Pile of Chad"); + provider.add("item.gtceu.paper_dust", "Chad"); + provider.add("item.gtceu.tiny_rare_earth_dust", "Tiny Pile of Rare Earth"); + provider.add("item.gtceu.small_rare_earth_dust", "Small Pile of Rare Earth"); + provider.add("item.gtceu.rare_earth_dust", "Rare Earth"); + provider.add("item.gtceu.tiny_ash_dust", "Tiny Pile of Ashes"); + provider.add("item.gtceu.small_ash_dust", "Small Pile of Ashes"); + provider.add("item.gtceu.ash_dust", "Ashes"); + provider.add("item.gtceu.tiny_bone_dust", "Tiny Pile of Bone Meal"); + provider.add("item.gtceu.small_bone_dust", "Small Pile of Bone Meal"); + provider.add("item.gtceu.bone_dust", "Bone Meal"); + provider.add("item.gtceu.refined_cassiterite_sand_ore", "Refined Cassiterite Sand"); + provider.add("item.gtceu.purified_cassiterite_sand_ore", "Purified Cassiterite Sand"); + provider.add("item.gtceu.crushed_cassiterite_sand_ore", "Ground Cassiterite Sand"); + provider.add("item.gtceu.tiny_cassiterite_sand_dust", "Tiny Pile of Cassiterite Sand"); + provider.add("item.gtceu.small_cassiterite_sand_dust", "Small Pile of Cassiterite Sand"); + provider.add("item.gtceu.impure_cassiterite_sand_dust", "Impure Pile of Cassiterite Sand"); + provider.add("item.gtceu.pure_cassiterite_sand_dust", "Purified Pile of Cassiterite Sand"); + provider.add("item.gtceu.cassiterite_sand_dust", "Cassiterite Sand"); + provider.add("item.gtceu.tiny_dark_ash_dust", "Tiny Pile of Dark Ashes"); + provider.add("item.gtceu.small_dark_ash_dust", "Small Pile of Dark Ashes"); + provider.add("item.gtceu.dark_ash_dust", "Dark Ashes"); + provider.add("item.gtceu.tiny_ice_dust", "Tiny Pile of Crushed Ice"); + provider.add("item.gtceu.small_ice_dust", "Small Pile of Crushed Ice"); + provider.add("item.gtceu.ice_dust", "Crushed Ice"); + provider.add("item.gtceu.sugar_gem", "Sugar Cube"); + provider.add("item.gtceu.chipped_sugar_gem", "Small Sugar Cubes"); + provider.add("item.gtceu.flawed_sugar_gem", "Tiny Sugar Cube"); + provider.add("item.gtceu.tiny_rock_salt_dust", "Tiny Pile of Rock Salt"); + provider.add("item.gtceu.small_rock_salt_dust", "Small Pile of Rock Salt"); + provider.add("item.gtceu.impure_rock_salt_dust", "Impure Pile of Rock Salt"); + provider.add("item.gtceu.pure_rock_salt_dust", "Purified Pile of Rock Salt"); + provider.add("item.gtceu.rock_salt_dust", "Rock Salt"); + provider.add("item.gtceu.tiny_salt_dust", "Tiny Pile of Salt"); + provider.add("item.gtceu.small_salt_dust", "Small Pile of Salt"); + provider.add("item.gtceu.impure_salt_dust", "Impure Pile of Salt"); + provider.add("item.gtceu.pure_salt_dust", "Purified Pile of Salt"); + provider.add("item.gtceu.salt_dust", "Salt"); + provider.add("item.gtceu.tiny_wood_dust", "Tiny Pile of Wood Pulp"); + provider.add("item.gtceu.small_wood_dust", "Small Pile of Wood Pulp"); + provider.add("item.gtceu.wood_dust", "Wood Pulp"); + provider.add("item.gtceu.wood_plate", "Wood Plank"); + provider.add("item.gtceu.long_wood_rod", "Long Wood Stick"); + provider.add("item.gtceu.wood_bolt", "Short Wood Stick"); + provider.add("item.gtceu.tiny_treated_wood_dust", "Tiny Pile of Treated Wood Pulp"); + provider.add("item.gtceu.small_treated_wood_dust", "Small Pile of Treated Wood Pulp"); + provider.add("item.gtceu.treated_wood_dust", "Treated Wood Pulp"); + provider.add("item.gtceu.treated_wood_plate", "Treated Wood Plank"); + provider.add("item.gtceu.treated_wood_rod", "Treated Wood Stick"); + provider.add("item.gtceu.long_treated_wood_rod", "Long Treated Wood Stick"); + provider.add("item.gtceu.treated_wood_bolt", "Short Treated Wood Stick"); + provider.add("item.gtceu.glass_gem", "Glass Crystal"); + provider.add("item.gtceu.chipped_glass_gem", "Chipped Glass Crystal"); + provider.add("item.gtceu.flawed_glass_gem", "Flawed Glass Crystal"); + provider.add("item.gtceu.flawless_glass_gem", "Flawless Glass Crystal"); + provider.add("item.gtceu.exquisite_glass_gem", "Exquisite Glass Crystal"); + provider.add("item.gtceu.glass_plate", "Glass Pane"); + provider.add("item.gtceu.tiny_blaze_dust", "Tiny Pile of Blaze Powder"); + provider.add("item.gtceu.small_blaze_dust", "Small Pile of Blaze Powder"); + provider.add("item.gtceu.tiny_sugar_dust", "Tiny Pile of Sugar"); + provider.add("item.gtceu.small_sugar_dust", "Small Pile of Sugar"); + provider.add("item.gtceu.tiny_basaltic_mineral_sand_dust", "Tiny Pile of Basaltic Mineral Sand"); + provider.add("item.gtceu.small_basaltic_mineral_sand_dust", "Small Pile of Basaltic Mineral Sand"); + provider.add("item.gtceu.basaltic_mineral_sand_dust", "Basaltic Mineral Sand"); + provider.add("item.gtceu.tiny_granitic_mineral_sand_dust", "Tiny Pile of Granitic Mineral Sand"); + provider.add("item.gtceu.small_granitic_mineral_sand_dust", "Small Pile of Granitic Mineral Sand"); + provider.add("item.gtceu.granitic_mineral_sand_dust", "Granitic Mineral Sand"); + provider.add("item.gtceu.tiny_garnet_sand_dust", "Tiny Pile of Garnet Sand"); + provider.add("item.gtceu.small_garnet_sand_dust", "Small Pile of Garnet Sand"); + provider.add("item.gtceu.garnet_sand_dust", "Garnet Sand"); + provider.add("item.gtceu.tiny_quartz_sand_dust", "Tiny Pile of Quartz Sand"); + provider.add("item.gtceu.small_quartz_sand_dust", "Small Pile of Quartz Sand"); + provider.add("item.gtceu.quartz_sand_dust", "Quartz Sand"); + provider.add("item.gtceu.tiny_glauconite_sand_dust", "Tiny Pile of Glauconite Sand"); + provider.add("item.gtceu.small_glauconite_sand_dust", "Small Pile of Glauconite Sand"); + provider.add("item.gtceu.glauconite_sand_dust", "Glauconite Sand"); + provider.add("item.gtceu.refined_bentonite_ore", "Refined Bentonite"); + provider.add("item.gtceu.purified_bentonite_ore", "Purified Bentonite"); + provider.add("item.gtceu.crushed_bentonite_ore", "Ground Bentonite"); + provider.add("item.gtceu.tiny_bentonite_dust", "Tiny Pile of Bentonite"); + provider.add("item.gtceu.small_bentonite_dust", "Small Pile of Bentonite"); + provider.add("item.gtceu.impure_bentonite_dust", "Impure Pile of Bentonite"); + provider.add("item.gtceu.pure_bentonite_dust", "Purified Pile of Bentonite"); + provider.add("item.gtceu.bentonite_dust", "Bentonite"); + provider.add("item.gtceu.tiny_fullers_earth_dust", "Tiny Pile of Fullers Earth"); + provider.add("item.gtceu.small_fullers_earth_dust", "Small Pile of Fullers Earth"); + provider.add("item.gtceu.fullers_earth_dust", "Fullers Earth"); + provider.add("item.gtceu.refined_pitchblende_ore", "Refined Pitchblende"); + provider.add("item.gtceu.purified_pitchblende_ore", "Purified Pitchblende"); + provider.add("item.gtceu.crushed_pitchblende_ore", "Ground Pitchblende"); + provider.add("item.gtceu.tiny_pitchblende_dust", "Tiny Pile of Pitchblende"); + provider.add("item.gtceu.small_pitchblende_dust", "Small Pile of Pitchblende"); + provider.add("item.gtceu.impure_pitchblende_dust", "Impure Pile of Pitchblende"); + provider.add("item.gtceu.pure_pitchblende_dust", "Purified Pile of Pitchblende"); + provider.add("item.gtceu.pitchblende_dust", "Pitchblende"); + provider.add("item.gtceu.refined_talc_ore", "Refined Talc"); + provider.add("item.gtceu.purified_talc_ore", "Purified Talc"); + provider.add("item.gtceu.crushed_talc_ore_ore", "Ground Talc"); + provider.add("item.gtceu.tiny_talc_dust", "Tiny Pile of Talc"); + provider.add("item.gtceu.small_talc_dust", "Small Pile of Talc"); + provider.add("item.gtceu.impure_talc_dust", "Impure Pile of Talc"); + provider.add("item.gtceu.pure_talc_dust", "Purified Pile of Talc"); + provider.add("item.gtceu.talc_dust", "Talc"); + provider.add("item.gtceu.tiny_wheat_dust", "Tiny Pile of Flour"); + provider.add("item.gtceu.small_wheat_dust", "Small Pile of Flour"); + provider.add("item.gtceu.wheat_dust", "Flour"); + provider.add("item.gtceu.tiny_meat_dust", "Tiny Pile of Mince Meat"); + provider.add("item.gtceu.small_meat_dust", "Small Pile of Mince Meat"); + provider.add("item.gtceu.meat_dust", "Mince Meat"); + provider.add("item.gtceu.borosilicate_glass_ingot", "Borosilicate Glass Bar"); + provider.add("item.gtceu.fine_borosilicate_glass_wire", "Borosilicate Glass Fibers"); + provider.add("item.gtceu.tiny_platinum_group_sludge_dust", "Tiny Clump of Platinum Group Sludge"); + provider.add("item.gtceu.small_platinum_group_sludge_dust", "Small Clump of Platinum Group Sludge"); + provider.add("item.gtceu.platinum_group_sludge_dust", "Platinum Group Sludge"); + provider.add("item.gtceu.tiny_platinum_raw_dust", "Tiny Pile of Raw Platinum Powder"); + provider.add("item.gtceu.small_platinum_raw_dust", "Small Pile of Raw Platinum Powder"); + provider.add("item.gtceu.platinum_raw_dust", "Raw Platinum Powder"); + provider.add("item.gtceu.tiny_palladium_raw_dust", "Tiny Pile of Raw Palladium Powder"); + provider.add("item.gtceu.small_palladium_raw_dust", "Small Pile of Raw Palladium Powder"); + provider.add("item.gtceu.palladium_raw_dust", "Raw Palladium Powder"); + provider.add("item.gtceu.tiny_inert_metal_mixture_dust", "Tiny Pile of Inert Metal Mixture"); + provider.add("item.gtceu.small_inert_metal_mixture_dust", "Small Pile of Inert Metal Mixture"); + provider.add("item.gtceu.inert_metal_mixture_dust", "Inert Metal Mixture"); + provider.add("item.gtceu.tiny_rarest_metal_mixture_dust", "Tiny Pile of Rarest Metal Mixture"); + provider.add("item.gtceu.small_rarest_metal_mixture_dust", "Small Pile of Rarest Metal Mixture"); + provider.add("item.gtceu.rarest_metal_mixture_dust", "Rarest Metal Mixture"); + provider.add("item.gtceu.tiny_platinum_sludge_residue_dust", "Tiny Pile of Platinum Sludge Residue"); + provider.add("item.gtceu.small_platinum_sludge_residue_dust", "Small Pile of Platinum Sludge Residue"); + provider.add("item.gtceu.platinum_sludge_residue_dust", "Platinum Sludge Residue"); + provider.add("item.gtceu.tiny_iridium_metal_residue_dust", "Tiny Pile of Iridium Metal Residue"); + provider.add("item.gtceu.small_iridium_metal_residue_dust", "Small Pile of Iridium Metal Residue"); + provider.add("item.gtceu.iridium_metal_residue_dust", "Iridium Metal Residue"); } private static void initItemNames(RegistrateLangProvider provider) { diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java index 97816f0633c..d519d1ceb5d 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -596,142 +596,6 @@ public static void init(RegistrateLangProvider provider) { provider.add("item.netherrack_nether_quartz", "Nether Quartz Ore"); provider.add("block.surface_rock", "%s Surface Rock"); - provider.add("item.gtceu.tiny_gunpowder_dust", "Tiny Pile of Gunpowder"); - provider.add("item.gtceu.small_gunpowder_dust", "Small Pile of Gunpowder"); - provider.add("item.gtceu.tiny_paper_dust", "Tiny Pile of Chad"); - provider.add("item.gtceu.small_paper_dust", "Small Pile of Chad"); - provider.add("item.gtceu.paper_dust", "Chad"); - provider.add("item.gtceu.tiny_rare_earth_dust", "Tiny Pile of Rare Earth"); - provider.add("item.gtceu.small_rare_earth_dust", "Small Pile of Rare Earth"); - provider.add("item.gtceu.rare_earth_dust", "Rare Earth"); - provider.add("item.gtceu.tiny_ash_dust", "Tiny Pile of Ashes"); - provider.add("item.gtceu.small_ash_dust", "Small Pile of Ashes"); - provider.add("item.gtceu.ash_dust", "Ashes"); - provider.add("item.gtceu.tiny_bone_dust", "Tiny Pile of Bone Meal"); - provider.add("item.gtceu.small_bone_dust", "Small Pile of Bone Meal"); - provider.add("item.gtceu.bone_dust", "Bone Meal"); - provider.add("item.gtceu.refined_cassiterite_sand_ore", "Refined Cassiterite Sand"); - provider.add("item.gtceu.purified_cassiterite_sand_ore", "Purified Cassiterite Sand"); - provider.add("item.gtceu.crushed_cassiterite_sand_ore", "Ground Cassiterite Sand"); - provider.add("item.gtceu.tiny_cassiterite_sand_dust", "Tiny Pile of Cassiterite Sand"); - provider.add("item.gtceu.small_cassiterite_sand_dust", "Small Pile of Cassiterite Sand"); - provider.add("item.gtceu.impure_cassiterite_sand_dust", "Impure Pile of Cassiterite Sand"); - provider.add("item.gtceu.pure_cassiterite_sand_dust", "Purified Pile of Cassiterite Sand"); - provider.add("item.gtceu.cassiterite_sand_dust", "Cassiterite Sand"); - provider.add("item.gtceu.tiny_dark_ash_dust", "Tiny Pile of Dark Ashes"); - provider.add("item.gtceu.small_dark_ash_dust", "Small Pile of Dark Ashes"); - provider.add("item.gtceu.dark_ash_dust", "Dark Ashes"); - provider.add("item.gtceu.tiny_ice_dust", "Tiny Pile of Crushed Ice"); - provider.add("item.gtceu.small_ice_dust", "Small Pile of Crushed Ice"); - provider.add("item.gtceu.ice_dust", "Crushed Ice"); - provider.add("item.gtceu.sugar_gem", "Sugar Cube"); - provider.add("item.gtceu.chipped_sugar_gem", "Small Sugar Cubes"); - provider.add("item.gtceu.flawed_sugar_gem", "Tiny Sugar Cube"); - provider.add("item.gtceu.tiny_rock_salt_dust", "Tiny Pile of Rock Salt"); - provider.add("item.gtceu.small_rock_salt_dust", "Small Pile of Rock Salt"); - provider.add("item.gtceu.impure_rock_salt_dust", "Impure Pile of Rock Salt"); - provider.add("item.gtceu.pure_rock_salt_dust", "Purified Pile of Rock Salt"); - provider.add("item.gtceu.rock_salt_dust", "Rock Salt"); - provider.add("item.gtceu.tiny_salt_dust", "Tiny Pile of Salt"); - provider.add("item.gtceu.small_salt_dust", "Small Pile of Salt"); - provider.add("item.gtceu.impure_salt_dust", "Impure Pile of Salt"); - provider.add("item.gtceu.pure_salt_dust", "Purified Pile of Salt"); - provider.add("item.gtceu.salt_dust", "Salt"); - provider.add("item.gtceu.tiny_wood_dust", "Tiny Pile of Wood Pulp"); - provider.add("item.gtceu.small_wood_dust", "Small Pile of Wood Pulp"); - provider.add("item.gtceu.wood_dust", "Wood Pulp"); - provider.add("item.gtceu.wood_plate", "Wood Plank"); - provider.add("item.gtceu.long_wood_rod", "Long Wood Stick"); - provider.add("item.gtceu.wood_bolt", "Short Wood Stick"); - provider.add("item.gtceu.tiny_treated_wood_dust", "Tiny Pile of Treated Wood Pulp"); - provider.add("item.gtceu.small_treated_wood_dust", "Small Pile of Treated Wood Pulp"); - provider.add("item.gtceu.treated_wood_dust", "Treated Wood Pulp"); - provider.add("item.gtceu.treated_wood_plate", "Treated Wood Plank"); - provider.add("item.gtceu.treated_wood_rod", "Treated Wood Stick"); - provider.add("item.gtceu.long_treated_wood_rod", "Long Treated Wood Stick"); - provider.add("item.gtceu.treated_wood_bolt", "Short Treated Wood Stick"); - provider.add("item.gtceu.glass_gem", "Glass Crystal"); - provider.add("item.gtceu.chipped_glass_gem", "Chipped Glass Crystal"); - provider.add("item.gtceu.flawed_glass_gem", "Flawed Glass Crystal"); - provider.add("item.gtceu.flawless_glass_gem", "Flawless Glass Crystal"); - provider.add("item.gtceu.exquisite_glass_gem", "Exquisite Glass Crystal"); - provider.add("item.gtceu.glass_plate", "Glass Pane"); - provider.add("item.gtceu.tiny_blaze_dust", "Tiny Pile of Blaze Powder"); - provider.add("item.gtceu.small_blaze_dust", "Small Pile of Blaze Powder"); - provider.add("item.gtceu.tiny_sugar_dust", "Tiny Pile of Sugar"); - provider.add("item.gtceu.small_sugar_dust", "Small Pile of Sugar"); - provider.add("item.gtceu.tiny_basaltic_mineral_sand_dust", "Tiny Pile of Basaltic Mineral Sand"); - provider.add("item.gtceu.small_basaltic_mineral_sand_dust", "Small Pile of Basaltic Mineral Sand"); - provider.add("item.gtceu.basaltic_mineral_sand_dust", "Basaltic Mineral Sand"); - provider.add("item.gtceu.tiny_granitic_mineral_sand_dust", "Tiny Pile of Granitic Mineral Sand"); - provider.add("item.gtceu.small_granitic_mineral_sand_dust", "Small Pile of Granitic Mineral Sand"); - provider.add("item.gtceu.granitic_mineral_sand_dust", "Granitic Mineral Sand"); - provider.add("item.gtceu.tiny_garnet_sand_dust", "Tiny Pile of Garnet Sand"); - provider.add("item.gtceu.small_garnet_sand_dust", "Small Pile of Garnet Sand"); - provider.add("item.gtceu.garnet_sand_dust", "Garnet Sand"); - provider.add("item.gtceu.tiny_quartz_sand_dust", "Tiny Pile of Quartz Sand"); - provider.add("item.gtceu.small_quartz_sand_dust", "Small Pile of Quartz Sand"); - provider.add("item.gtceu.quartz_sand_dust", "Quartz Sand"); - provider.add("item.gtceu.tiny_glauconite_sand_dust", "Tiny Pile of Glauconite Sand"); - provider.add("item.gtceu.small_glauconite_sand_dust", "Small Pile of Glauconite Sand"); - provider.add("item.gtceu.glauconite_sand_dust", "Glauconite Sand"); - provider.add("item.gtceu.refined_bentonite_ore", "Refined Bentonite"); - provider.add("item.gtceu.purified_bentonite_ore", "Purified Bentonite"); - provider.add("item.gtceu.crushed_bentonite_ore", "Ground Bentonite"); - provider.add("item.gtceu.tiny_bentonite_dust", "Tiny Pile of Bentonite"); - provider.add("item.gtceu.small_bentonite_dust", "Small Pile of Bentonite"); - provider.add("item.gtceu.impure_bentonite_dust", "Impure Pile of Bentonite"); - provider.add("item.gtceu.pure_bentonite_dust", "Purified Pile of Bentonite"); - provider.add("item.gtceu.bentonite_dust", "Bentonite"); - provider.add("item.gtceu.tiny_fullers_earth_dust", "Tiny Pile of Fullers Earth"); - provider.add("item.gtceu.small_fullers_earth_dust", "Small Pile of Fullers Earth"); - provider.add("item.gtceu.fullers_earth_dust", "Fullers Earth"); - provider.add("item.gtceu.refined_pitchblende_ore", "Refined Pitchblende"); - provider.add("item.gtceu.purified_pitchblende_ore", "Purified Pitchblende"); - provider.add("item.gtceu.crushed_pitchblende_ore", "Ground Pitchblende"); - provider.add("item.gtceu.tiny_pitchblende_dust", "Tiny Pile of Pitchblende"); - provider.add("item.gtceu.small_pitchblende_dust", "Small Pile of Pitchblende"); - provider.add("item.gtceu.impure_pitchblende_dust", "Impure Pile of Pitchblende"); - provider.add("item.gtceu.pure_pitchblende_dust", "Purified Pile of Pitchblende"); - provider.add("item.gtceu.pitchblende_dust", "Pitchblende"); - provider.add("item.gtceu.refined_talc_ore", "Refined Talc"); - provider.add("item.gtceu.purified_talc_ore", "Purified Talc"); - provider.add("item.gtceu.crushed_talc_ore_ore", "Ground Talc"); - provider.add("item.gtceu.tiny_talc_dust", "Tiny Pile of Talc"); - provider.add("item.gtceu.small_talc_dust", "Small Pile of Talc"); - provider.add("item.gtceu.impure_talc_dust", "Impure Pile of Talc"); - provider.add("item.gtceu.pure_talc_dust", "Purified Pile of Talc"); - provider.add("item.gtceu.talc_dust", "Talc"); - provider.add("item.gtceu.tiny_wheat_dust", "Tiny Pile of Flour"); - provider.add("item.gtceu.small_wheat_dust", "Small Pile of Flour"); - provider.add("item.gtceu.wheat_dust", "Flour"); - provider.add("item.gtceu.tiny_meat_dust", "Tiny Pile of Mince Meat"); - provider.add("item.gtceu.small_meat_dust", "Small Pile of Mince Meat"); - provider.add("item.gtceu.meat_dust", "Mince Meat"); - provider.add("item.gtceu.borosilicate_glass_ingot", "Borosilicate Glass Bar"); - provider.add("item.gtceu.fine_borosilicate_glass_wire", "Borosilicate Glass Fibers"); - provider.add("item.gtceu.tiny_platinum_group_sludge_dust", "Tiny Clump of Platinum Group Sludge"); - provider.add("item.gtceu.small_platinum_group_sludge_dust", "Small Clump of Platinum Group Sludge"); - provider.add("item.gtceu.platinum_group_sludge_dust", "Platinum Group Sludge"); - provider.add("item.gtceu.tiny_platinum_raw_dust", "Tiny Pile of Raw Platinum Powder"); - provider.add("item.gtceu.small_platinum_raw_dust", "Small Pile of Raw Platinum Powder"); - provider.add("item.gtceu.platinum_raw_dust", "Raw Platinum Powder"); - provider.add("item.gtceu.tiny_palladium_raw_dust", "Tiny Pile of Raw Palladium Powder"); - provider.add("item.gtceu.small_palladium_raw_dust", "Small Pile of Raw Palladium Powder"); - provider.add("item.gtceu.palladium_raw_dust", "Raw Palladium Powder"); - provider.add("item.gtceu.tiny_inert_metal_mixture_dust", "Tiny Pile of Inert Metal Mixture"); - provider.add("item.gtceu.small_inert_metal_mixture_dust", "Small Pile of Inert Metal Mixture"); - provider.add("item.gtceu.inert_metal_mixture_dust", "Inert Metal Mixture"); - provider.add("item.gtceu.tiny_rarest_metal_mixture_dust", "Tiny Pile of Rarest Metal Mixture"); - provider.add("item.gtceu.small_rarest_metal_mixture_dust", "Small Pile of Rarest Metal Mixture"); - provider.add("item.gtceu.rarest_metal_mixture_dust", "Rarest Metal Mixture"); - provider.add("item.gtceu.tiny_platinum_sludge_residue_dust", "Tiny Pile of Platinum Sludge Residue"); - provider.add("item.gtceu.small_platinum_sludge_residue_dust", "Small Pile of Platinum Sludge Residue"); - provider.add("item.gtceu.platinum_sludge_residue_dust", "Platinum Sludge Residue"); - provider.add("item.gtceu.tiny_iridium_metal_residue_dust", "Tiny Pile of Iridium Metal Residue"); - provider.add("item.gtceu.small_iridium_metal_residue_dust", "Small Pile of Iridium Metal Residue"); - provider.add("item.gtceu.iridium_metal_residue_dust", "Iridium Metal Residue"); - provider.add("behaviour.hoe", "Can till dirt"); provider.add("behaviour.soft_hammer", "Activates and Deactivates Machines"); provider.add("behaviour.soft_hammer.enabled", "Working Enabled"); From 4f9c495551bd076068cde333ef17630f6a73224e Mon Sep 17 00:00:00 2001 From: Spicierspace153 <21964509+Spicierspace153@users.noreply.github.com> Date: Thu, 19 Jun 2025 20:12:02 -0600 Subject: [PATCH 02/45] better file system for lang keys --- .../resources/assets/gtceu/lang/en_ud.json | 94 +- .../resources/assets/gtceu/lang/en_us.json | 94 +- .../gtceu/api/data/tag/TagPrefix.java | 6 +- .../gtceu/api/gui/misc/ProspectorMode.java | 6 +- .../api/item/component/ElectricStats.java | 6 +- .../api/item/component/IMaterialPartItem.java | 4 +- .../gregtechceu/gtceu/common/CommonProxy.java | 6 +- .../common/item/IntCircuitBehaviour.java | 2 +- .../common/item/PortableScannerBehavior.java | 2 +- .../item/ProspectorScannerBehavior.java | 4 +- .../common/item/TurbineRotorBehaviour.java | 4 +- .../tool/behavior/ToolModeSwitchBehavior.java | 4 +- .../gtceu/data/lang/ArmorLang.java | 56 ++ .../gtceu/data/lang/CommandLang.java | 18 + .../gtceu/data/lang/CoverLang.java | 188 ++++ .../gtceu/data/lang/HazardLang.java | 37 + .../gregtechceu/gtceu/data/lang/ItemLang.java | 131 +++ .../gtceu/data/lang/LangHandler.java | 920 ++---------------- .../gtceu/data/lang/MaterialLang.java | 119 +++ .../data/lang/MaterialLangGenerator.java | 16 - .../gtceu/data/lang/RecipeLang.java | 59 ++ .../gtceu/data/lang/SubtitleLang.java | 52 + .../gregtechceu/gtceu/data/lang/ToolLang.java | 151 +++ .../resources/assets/gtceu/lang/ja_jp.json | 94 +- .../resources/assets/gtceu/lang/ru_ru.json | 94 +- .../resources/assets/gtceu/lang/uk_ua.json | 94 +- .../resources/assets/gtceu/lang/zh_cn.json | 94 +- .../resources/assets/gtceu/lang/zh_tw.json | 94 +- 28 files changed, 1224 insertions(+), 1225 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java create mode 100644 src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java create mode 100644 src/main/java/com/gregtechceu/gtceu/data/lang/CoverLang.java create mode 100644 src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java create mode 100644 src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLangGenerator.java create mode 100644 src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java create mode 100644 src/main/java/com/gregtechceu/gtceu/data/lang/SubtitleLang.java diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 44123cebd7c..b82a1b263e4 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -5356,53 +5356,53 @@ "metaarmor.tooltip.potions": "sʇɔǝɟɟƎ ןnɟɯɹɐH sǝıɟıןןnN", "metaarmor.tooltip.speed": "pǝǝdS buıuunᴚ sǝsɐǝɹɔuI", "metaarmor.tooltip.stepassist": "ʇsıssⱯ-dǝʇS sǝpıʌoɹԀ", - "metaitem.behavior.mode_switch.current_mode": "%s :ǝpoW", - "metaitem.behavior.mode_switch.mode_switched": "%s :oʇ ʇǝS ǝpoWǝ§", - "metaitem.behavior.mode_switch.tooltip": "ǝpoɯ ɥɔʇıʍs oʇ buıʞɐǝus ǝןıɥʍ ǝs∩", - "metaitem.clipboard.tooltip": "ǝʌoɯǝɹ oʇ ʞɔıןƆ-ʇɥbıᴚ-ʇɟıɥS puɐ 'ǝɔɐןd oʇ ןןɐM uo ʞɔıןɔ-ʇɥbıᴚ ˙)ʇuǝɯnɹʇsuI buıʇıɹʍ ʎuɐ ʇnoɥʇıʍ( uo uǝʇʇıɹʍ ǝq uɐƆ", - "metaitem.cover.digital.mode.energy.disabled": "ǝpoW ʎbɹǝuƎ ǝןqɐuǝ oʇ ʞɔıןƆ", - "metaitem.cover.digital.mode.energy.enabled": "pǝןqɐuǝ ǝpoW ʎbɹǝuƎ", - "metaitem.cover.digital.mode.fluid.disabled": "ǝpoW pınןℲ ǝןqɐuǝ oʇ ʞɔıןƆ", - "metaitem.cover.digital.mode.fluid.enabled": "pǝןqɐuǝ ǝpoW pınןℲ", - "metaitem.cover.digital.mode.item.disabled": "ǝpoW ɯǝʇI ǝןqɐuǝ oʇ ʞɔıןƆ", - "metaitem.cover.digital.mode.item.enabled": "pǝןqɐuǝ ǝpoW ɯǝʇI", - "metaitem.cover.digital.mode.machine.disabled": "ǝpoW ǝuıɥɔɐW ǝןqɐuǝ oʇ ʞɔıןƆ", - "metaitem.cover.digital.mode.machine.enabled": "pǝןqɐuǝ ǝpoW ǝuıɥɔɐW", - "metaitem.cover.digital.mode.proxy.disabled": "ǝpoW ʎxoɹԀ ǝןqɐuǝ oʇ ʞɔıןƆ", - "metaitem.cover.digital.mode.proxy.enabled": "pǝןqɐuǝ ǝpoW ʎxoɹԀ", - "metaitem.cover.digital.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ㄥ§ɹoʇıuoW ןɐɹʇuǝƆɟ§ ǝɥʇ oʇ ㄥ§sǝןqɐƆ ɹǝʍoԀɟ§ ɹǝʌo sǝuıɥɔɐɯ sʇɔǝuuoƆ", - "metaitem.cover.digital.wireless.tooltip.0": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ㄥ§ɹoʇıuoW ןɐɹʇuǝƆɟ§ ǝɥʇ oʇ sǝuıɥɔɐɯ sʇɔǝuuoɔ ㄥ§ʎןssǝןǝɹıMɟ§", - "metaitem.cover.digital.wireless.tooltip.1": "˙ʇı oʇ puıq ʎןǝʇoɯǝɹ oʇ ㄥ§ɹoʇıuoW ןɐɹʇuǝƆɟ§ ǝɥʇ uo ㄥ§ʞɔıןƆ ʇɥbıᴚɟ§", - "metaitem.cover.digital.wireless.tooltip.2": "˙buıpuıq ʇuǝɹɹnɔ ǝɥʇ ǝʌoɯǝɹ oʇ ㄥ§ʞɔıןƆ ʇɥbıᴚ ʞɐǝuSɟ§", - "metaitem.cover.digital.wireless.tooltip.3": "%sɟ§ :buıpuıᗺɐ§", - "metaitem.crushed.tooltip.purify": "ǝɹO pǝıɟıɹnԀ ʇǝb oʇ uoɹpןnɐƆ ɐ ʞɔıןɔ ʇɥbıᴚ", - "metaitem.debug_scanner.tooltip": "ɹǝpɹoɔıɹ⟘", - "metaitem.dust.tooltip.purify": "ʇsnᗡ uɐǝןɔ ʇǝb oʇ uoɹpןnɐƆ ɐ ʞɔıןɔ ʇɥbıᴚ", - "metaitem.electric.discharge_mode.disabled": "pǝןqɐsıᗡ ǝpoW ǝbɹɐɥɔsıᗡǝ§", - "metaitem.electric.discharge_mode.enabled": "pǝןqɐuƎ ǝpoW ǝbɹɐɥɔsıᗡǝ§", - "metaitem.electric.discharge_mode.tooltip": "ǝpoɯ ǝbɹɐɥɔsıp ǝןbboʇ oʇ buıʞɐǝus ǝןıɥʍ ǝs∩", - "metaitem.generic.electric_item.stored": ")%s( ∩Ǝ %d/%d", - "metaitem.generic.electric_item.tooltip": "%s ɹǝı⟘ - ∩Ǝ %d/%d", - "metaitem.generic.fluid_container.tooltip": "%s Ꞁ%d/%d", - "metaitem.int_circuit.configuration": "%d :uoıʇɐɹnbıɟuoƆ", - "metaitem.liquid_fuel_jetpack.tooltip": "ʇsnɹɥ⟘ ɹoɟ sןǝnℲ ɹoʇɐɹǝuǝ⅁ uoıʇsnqɯoƆ sǝs∩", - "metaitem.machine_configuration.mode": "%s ɹ§:ǝpoW uoıʇɐɹnbıɟuoƆɐ§", - "metaitem.plugin.proxy.tooltips.1": ")uǝǝɹɔs ǝɥʇ uı ǝpoɯ ʎxoɹd oʇ ʇsnظpɐ ǝsɐǝןԀ(", - "metaitem.plugin.tooltips.1": "˙ʎʇıןɐuoıʇɔunɟ ǝɹoɯ ɹoɟ uǝǝɹɔs ǝɥʇ oʇ pǝppɐ ǝq uɐɔ suıbnןԀ", - "metaitem.prospector.mode.bedrock_ore": "ɹ§ǝpoW uoıʇɔǝdsoɹԀ ǝɹO ʞɔoɹpǝᗺq§", - "metaitem.prospector.mode.fluid": "ɹ§ǝpoW uoıʇɔǝdsoɹԀ pınןℲq§", - "metaitem.prospector.mode.ores": "ɹ§ǝpoW uoıʇɔǝdsoɹԀ ǝɹOɐ§", - "metaitem.prospector.tooltip.modes": ":sǝpoW ǝןqɐןıɐʌⱯ", - "metaitem.prospector.tooltip.radius": "snıpɐᴚ ʞunɥƆ %s ɐ uı ǝbuɐɹ suɐɔS", - "metaitem.record.sus.tooltip": "dıɹᗡ s∩ buoɯⱯ - zuoǝꞀㄥ§", - "metaitem.terminal.tooltip": "ʞɹoʍ poob ǝʞɐɯ sןooʇ dɹɐɥS", - "metaitem.terminal.tooltip.creative": "ǝpoW ǝʌıʇɐǝɹƆq§", - "metaitem.terminal.tooltip.hardware": "%d :ǝɹɐʍpɹɐHɐ§", - "metaitem.tool.tooltip.durability": "%d / %dɐ§ :ʎʇıןıqɐɹnᗡɟ§", - "metaitem.tool.tooltip.primary_material": "%sǝ§ :ןɐıɹǝʇɐWɟ§", - "metaitem.tool.tooltip.rotor.efficiency": "%d%%6§ :ʎɔuǝıɔıɟɟƎ ǝuıqɹn⟘", - "metaitem.tool.tooltip.rotor.power": "%d%%6§ :ɹǝʍoԀ ǝuıqɹn⟘", - "metaitem.tricorder_scanner.tooltip": "ɹǝpɹoɔıɹ⟘", + "item.behavior.mode_switch.current_mode": "%s :ǝpoW", + "item.behavior.mode_switch.mode_switched": "%s :oʇ ʇǝS ǝpoWǝ§", + "item.behavior.mode_switch.tooltip": "ǝpoɯ ɥɔʇıʍs oʇ buıʞɐǝus ǝןıɥʍ ǝs∩", + "item.clipboard.tooltip": "ǝʌoɯǝɹ oʇ ʞɔıןƆ-ʇɥbıᴚ-ʇɟıɥS puɐ 'ǝɔɐןd oʇ ןןɐM uo ʞɔıןɔ-ʇɥbıᴚ ˙)ʇuǝɯnɹʇsuI buıʇıɹʍ ʎuɐ ʇnoɥʇıʍ( uo uǝʇʇıɹʍ ǝq uɐƆ", + "item.cover.digital.mode.energy.disabled": "ǝpoW ʎbɹǝuƎ ǝןqɐuǝ oʇ ʞɔıןƆ", + "item.cover.digital.mode.energy.enabled": "pǝןqɐuǝ ǝpoW ʎbɹǝuƎ", + "item.cover.digital.mode.fluid.disabled": "ǝpoW pınןℲ ǝןqɐuǝ oʇ ʞɔıןƆ", + "item.cover.digital.mode.fluid.enabled": "pǝןqɐuǝ ǝpoW pınןℲ", + "item.cover.digital.mode.item.disabled": "ǝpoW ɯǝʇI ǝןqɐuǝ oʇ ʞɔıןƆ", + "item.cover.digital.mode.item.enabled": "pǝןqɐuǝ ǝpoW ɯǝʇI", + "item.cover.digital.mode.machine.disabled": "ǝpoW ǝuıɥɔɐW ǝןqɐuǝ oʇ ʞɔıןƆ", + "item.cover.digital.mode.machine.enabled": "pǝןqɐuǝ ǝpoW ǝuıɥɔɐW", + "item.cover.digital.mode.proxy.disabled": "ǝpoW ʎxoɹԀ ǝןqɐuǝ oʇ ʞɔıןƆ", + "item.cover.digital.mode.proxy.enabled": "pǝןqɐuǝ ǝpoW ʎxoɹԀ", + "item.cover.digital.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ㄥ§ɹoʇıuoW ןɐɹʇuǝƆɟ§ ǝɥʇ oʇ ㄥ§sǝןqɐƆ ɹǝʍoԀɟ§ ɹǝʌo sǝuıɥɔɐɯ sʇɔǝuuoƆ", + "item.cover.digital.wireless.tooltip.0": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ㄥ§ɹoʇıuoW ןɐɹʇuǝƆɟ§ ǝɥʇ oʇ sǝuıɥɔɐɯ sʇɔǝuuoɔ ㄥ§ʎןssǝןǝɹıMɟ§", + "item.cover.digital.wireless.tooltip.1": "˙ʇı oʇ puıq ʎןǝʇoɯǝɹ oʇ ㄥ§ɹoʇıuoW ןɐɹʇuǝƆɟ§ ǝɥʇ uo ㄥ§ʞɔıןƆ ʇɥbıᴚɟ§", + "item.cover.digital.wireless.tooltip.2": "˙buıpuıq ʇuǝɹɹnɔ ǝɥʇ ǝʌoɯǝɹ oʇ ㄥ§ʞɔıןƆ ʇɥbıᴚ ʞɐǝuSɟ§", + "item.cover.digital.wireless.tooltip.3": "%sɟ§ :buıpuıᗺɐ§", + "item.crushed.tooltip.purify": "ǝɹO pǝıɟıɹnԀ ʇǝb oʇ uoɹpןnɐƆ ɐ ʞɔıןɔ ʇɥbıᴚ", + "item.debug_scanner.tooltip": "ɹǝpɹoɔıɹ⟘", + "item.dust.tooltip.purify": "ʇsnᗡ uɐǝןɔ ʇǝb oʇ uoɹpןnɐƆ ɐ ʞɔıןɔ ʇɥbıᴚ", + "item.electric.discharge_mode.disabled": "pǝןqɐsıᗡ ǝpoW ǝbɹɐɥɔsıᗡǝ§", + "item.electric.discharge_mode.enabled": "pǝןqɐuƎ ǝpoW ǝbɹɐɥɔsıᗡǝ§", + "item.electric.discharge_mode.tooltip": "ǝpoɯ ǝbɹɐɥɔsıp ǝןbboʇ oʇ buıʞɐǝus ǝןıɥʍ ǝs∩", + "item.generic.electric_item.stored": ")%s( ∩Ǝ %d/%d", + "item.generic.electric_item.tooltip": "%s ɹǝı⟘ - ∩Ǝ %d/%d", + "item.generic.fluid_container.tooltip": "%s Ꞁ%d/%d", + "item.int_circuit.configuration": "%d :uoıʇɐɹnbıɟuoƆ", + "item.liquid_fuel_jetpack.tooltip": "ʇsnɹɥ⟘ ɹoɟ sןǝnℲ ɹoʇɐɹǝuǝ⅁ uoıʇsnqɯoƆ sǝs∩", + "item.machine_configuration.mode": "%s ɹ§:ǝpoW uoıʇɐɹnbıɟuoƆɐ§", + "item.plugin.proxy.tooltips.1": ")uǝǝɹɔs ǝɥʇ uı ǝpoɯ ʎxoɹd oʇ ʇsnظpɐ ǝsɐǝןԀ(", + "item.plugin.tooltips.1": "˙ʎʇıןɐuoıʇɔunɟ ǝɹoɯ ɹoɟ uǝǝɹɔs ǝɥʇ oʇ pǝppɐ ǝq uɐɔ suıbnןԀ", + "item.prospector.mode.bedrock_ore": "ɹ§ǝpoW uoıʇɔǝdsoɹԀ ǝɹO ʞɔoɹpǝᗺq§", + "item.prospector.mode.fluid": "ɹ§ǝpoW uoıʇɔǝdsoɹԀ pınןℲq§", + "item.prospector.mode.ores": "ɹ§ǝpoW uoıʇɔǝdsoɹԀ ǝɹOɐ§", + "item.prospector.tooltip.modes": ":sǝpoW ǝןqɐןıɐʌⱯ", + "item.prospector.tooltip.radius": "snıpɐᴚ ʞunɥƆ %s ɐ uı ǝbuɐɹ suɐɔS", + "item.record.sus.tooltip": "dıɹᗡ s∩ buoɯⱯ - zuoǝꞀㄥ§", + "item.terminal.tooltip": "ʞɹoʍ poob ǝʞɐɯ sןooʇ dɹɐɥS", + "item.terminal.tooltip.creative": "ǝpoW ǝʌıʇɐǝɹƆq§", + "item.terminal.tooltip.hardware": "%d :ǝɹɐʍpɹɐHɐ§", + "item.tool.tooltip.durability": "%d / %dɐ§ :ʎʇıןıqɐɹnᗡɟ§", + "item.tool.tooltip.primary_material": "%sǝ§ :ןɐıɹǝʇɐWɟ§", + "item.tool.tooltip.rotor.efficiency": "%d%%6§ :ʎɔuǝıɔıɟɟƎ ǝuıqɹn⟘", + "item.tool.tooltip.rotor.power": "%d%%6§ :ɹǝʍoԀ ǝuıqɹn⟘", + "item.tricorder_scanner.tooltip": "ɹǝpɹoɔıɹ⟘", "monitor.gui.title.argb": ":ᗺ⅁ᴚⱯ", "monitor.gui.title.back": "ʞɔɐᗺ", "monitor.gui.title.config": "bıɟuoƆ", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 20d3c1fb08b..35c60dbef03 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -5356,53 +5356,53 @@ "metaarmor.tooltip.potions": "Nullifies Harmful Effects", "metaarmor.tooltip.speed": "Increases Running Speed", "metaarmor.tooltip.stepassist": "Provides Step-Assist", - "metaitem.behavior.mode_switch.current_mode": "Mode: %s", - "metaitem.behavior.mode_switch.mode_switched": "§eMode Set to: %s", - "metaitem.behavior.mode_switch.tooltip": "Use while sneaking to switch mode", - "metaitem.clipboard.tooltip": "Can be written on (without any writing Instrument). Right-click on Wall to place, and Shift-Right-Click to remove", - "metaitem.cover.digital.mode.energy.disabled": "Click to enable Energy Mode", - "metaitem.cover.digital.mode.energy.enabled": "Energy Mode enabled", - "metaitem.cover.digital.mode.fluid.disabled": "Click to enable Fluid Mode", - "metaitem.cover.digital.mode.fluid.enabled": "Fluid Mode enabled", - "metaitem.cover.digital.mode.item.disabled": "Click to enable Item Mode", - "metaitem.cover.digital.mode.item.enabled": "Item Mode enabled", - "metaitem.cover.digital.mode.machine.disabled": "Click to enable Machine Mode", - "metaitem.cover.digital.mode.machine.enabled": "Machine Mode enabled", - "metaitem.cover.digital.mode.proxy.disabled": "Click to enable Proxy Mode", - "metaitem.cover.digital.mode.proxy.enabled": "Proxy Mode enabled", - "metaitem.cover.digital.tooltip": "Connects machines over §fPower Cables§7 to the §fCentral Monitor§7 as §fCover§7.", - "metaitem.cover.digital.wireless.tooltip.0": "§fWirelessly§7 connects machines to the §fCentral Monitor§7 as §fCover§7.", - "metaitem.cover.digital.wireless.tooltip.1": "§fRight Click§7 on the §fCentral Monitor§7 to remotely bind to it.", - "metaitem.cover.digital.wireless.tooltip.2": "§fSneak Right Click§7 to remove the current binding.", - "metaitem.cover.digital.wireless.tooltip.3": "§aBinding: §f%s", - "metaitem.crushed.tooltip.purify": "Right click a Cauldron to get Purified Ore", - "metaitem.debug_scanner.tooltip": "Tricorder", - "metaitem.dust.tooltip.purify": "Right click a Cauldron to get clean Dust", - "metaitem.electric.discharge_mode.disabled": "§eDischarge Mode Disabled", - "metaitem.electric.discharge_mode.enabled": "§eDischarge Mode Enabled", - "metaitem.electric.discharge_mode.tooltip": "Use while sneaking to toggle discharge mode", - "metaitem.generic.electric_item.stored": "%d/%d EU (%s)", - "metaitem.generic.electric_item.tooltip": "%d/%d EU - Tier %s", - "metaitem.generic.fluid_container.tooltip": "%d/%dL %s", - "metaitem.int_circuit.configuration": "Configuration: %d", - "metaitem.liquid_fuel_jetpack.tooltip": "Uses Combustion Generator Fuels for Thrust", - "metaitem.machine_configuration.mode": "§aConfiguration Mode:§r %s", - "metaitem.plugin.proxy.tooltips.1": "(Please adjust to proxy mode in the screen)", - "metaitem.plugin.tooltips.1": "Plugins can be added to the screen for more functionality.", - "metaitem.prospector.mode.bedrock_ore": "§bBedrock Ore Prospection Mode§r", - "metaitem.prospector.mode.fluid": "§bFluid Prospection Mode§r", - "metaitem.prospector.mode.ores": "§aOre Prospection Mode§r", - "metaitem.prospector.tooltip.modes": "Available Modes:", - "metaitem.prospector.tooltip.radius": "Scans range in a %s Chunk Radius", - "metaitem.record.sus.tooltip": "§7Leonz - Among Us Drip", - "metaitem.terminal.tooltip": "Sharp tools make good work", - "metaitem.terminal.tooltip.creative": "§bCreative Mode", - "metaitem.terminal.tooltip.hardware": "§aHardware: %d", - "metaitem.tool.tooltip.durability": "§fDurability: §a%d / %d", - "metaitem.tool.tooltip.primary_material": "§fMaterial: §e%s", - "metaitem.tool.tooltip.rotor.efficiency": "Turbine Efficiency: §9%d%%", - "metaitem.tool.tooltip.rotor.power": "Turbine Power: §9%d%%", - "metaitem.tricorder_scanner.tooltip": "Tricorder", + "item.behavior.mode_switch.current_mode": "Mode: %s", + "item.behavior.mode_switch.mode_switched": "§eMode Set to: %s", + "item.behavior.mode_switch.tooltip": "Use while sneaking to switch mode", + "item.clipboard.tooltip": "Can be written on (without any writing Instrument). Right-click on Wall to place, and Shift-Right-Click to remove", + "item.cover.digital.mode.energy.disabled": "Click to enable Energy Mode", + "item.cover.digital.mode.energy.enabled": "Energy Mode enabled", + "item.cover.digital.mode.fluid.disabled": "Click to enable Fluid Mode", + "item.cover.digital.mode.fluid.enabled": "Fluid Mode enabled", + "item.cover.digital.mode.item.disabled": "Click to enable Item Mode", + "item.cover.digital.mode.item.enabled": "Item Mode enabled", + "item.cover.digital.mode.machine.disabled": "Click to enable Machine Mode", + "item.cover.digital.mode.machine.enabled": "Machine Mode enabled", + "item.cover.digital.mode.proxy.disabled": "Click to enable Proxy Mode", + "item.cover.digital.mode.proxy.enabled": "Proxy Mode enabled", + "item.cover.digital.tooltip": "Connects machines over §fPower Cables§7 to the §fCentral Monitor§7 as §fCover§7.", + "item.cover.digital.wireless.tooltip.0": "§fWirelessly§7 connects machines to the §fCentral Monitor§7 as §fCover§7.", + "item.cover.digital.wireless.tooltip.1": "§fRight Click§7 on the §fCentral Monitor§7 to remotely bind to it.", + "item.cover.digital.wireless.tooltip.2": "§fSneak Right Click§7 to remove the current binding.", + "item.cover.digital.wireless.tooltip.3": "§aBinding: §f%s", + "item.crushed.tooltip.purify": "Right click a Cauldron to get Purified Ore", + "item.debug_scanner.tooltip": "Tricorder", + "item.dust.tooltip.purify": "Right click a Cauldron to get clean Dust", + "item.electric.discharge_mode.disabled": "§eDischarge Mode Disabled", + "item.electric.discharge_mode.enabled": "§eDischarge Mode Enabled", + "item.electric.discharge_mode.tooltip": "Use while sneaking to toggle discharge mode", + "item.generic.electric_item.stored": "%d/%d EU (%s)", + "item.generic.electric_item.tooltip": "%d/%d EU - Tier %s", + "item.generic.fluid_container.tooltip": "%d/%dL %s", + "item.int_circuit.configuration": "Configuration: %d", + "item.liquid_fuel_jetpack.tooltip": "Uses Combustion Generator Fuels for Thrust", + "item.machine_configuration.mode": "§aConfiguration Mode:§r %s", + "item.plugin.proxy.tooltips.1": "(Please adjust to proxy mode in the screen)", + "item.plugin.tooltips.1": "Plugins can be added to the screen for more functionality.", + "item.prospector.mode.bedrock_ore": "§bBedrock Ore Prospection Mode§r", + "item.prospector.mode.fluid": "§bFluid Prospection Mode§r", + "item.prospector.mode.ores": "§aOre Prospection Mode§r", + "item.prospector.tooltip.modes": "Available Modes:", + "item.prospector.tooltip.radius": "Scans range in a %s Chunk Radius", + "item.record.sus.tooltip": "§7Leonz - Among Us Drip", + "item.terminal.tooltip": "Sharp tools make good work", + "item.terminal.tooltip.creative": "§bCreative Mode", + "item.terminal.tooltip.hardware": "§aHardware: %d", + "item.tool.tooltip.durability": "§fDurability: §a%d / %d", + "item.tool.tooltip.primary_material": "§fMaterial: §e%s", + "item.tool.tooltip.rotor.efficiency": "Turbine Efficiency: §9%d%%", + "item.tool.tooltip.rotor.power": "Turbine Power: §9%d%%", + "item.tricorder_scanner.tooltip": "Tricorder", "monitor.gui.title.argb": "ARGB:", "monitor.gui.title.back": "Back", "monitor.gui.title.config": "Config", diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java b/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java index 793d155890a..3374b1174ce 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java @@ -249,7 +249,7 @@ public boolean isEmpty() { .unificationEnabled(true) .generateItem(true) .generationCondition(hasOreProperty) - .tooltip((mat, tooltips) -> tooltips.add(Component.translatable("metaitem.crushed.tooltip.purify"))); + .tooltip((mat, tooltips) -> tooltips.add(Component.translatable("item.crushed.tooltip.purify"))); // A hot Ingot, which has to be cooled down by a Vacuum Freezer. public static final TagPrefix ingotHot = new TagPrefix("hotIngot") @@ -376,7 +376,7 @@ public boolean isEmpty() { .unificationEnabled(true) .generateItem(true) .generationCondition(hasOreProperty) - .tooltip((mat, tooltips) -> tooltips.add(Component.translatable("metaitem.dust.tooltip.purify"))); + .tooltip((mat, tooltips) -> tooltips.add(Component.translatable("item.dust.tooltip.purify"))); // Pure Dust worth of one Ingot or Gem. public static final TagPrefix dustPure = new TagPrefix("pureDust") @@ -389,7 +389,7 @@ public boolean isEmpty() { .unificationEnabled(true) .generateItem(true) .generationCondition(hasOreProperty) - .tooltip((mat, tooltips) -> tooltips.add(Component.translatable("metaitem.dust.tooltip.purify"))); + .tooltip((mat, tooltips) -> tooltips.add(Component.translatable("item.dust.tooltip.purify"))); public static final TagPrefix dust = new TagPrefix("dust") .defaultTagPath("dusts/%s") diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/ProspectorMode.java b/src/main/java/com/gregtechceu/gtceu/api/gui/misc/ProspectorMode.java index 8cc8200fb72..fe4a44c693d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/ProspectorMode.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/misc/ProspectorMode.java @@ -50,7 +50,7 @@ public abstract class ProspectorMode { - public static ProspectorMode ORE = new ProspectorMode<>("metaitem.prospector.mode.ores", 16) { + public static ProspectorMode ORE = new ProspectorMode<>("item.prospector.mode.ores", 16) { private final Map BLOCK_CACHE = new HashMap<>(); private final Map ICON_CACHE = new HashMap<>(); @@ -194,7 +194,7 @@ public static FluidInfo fromVeinWorldEntry(@NotNull FluidVeinWorldEntry savedDat } } - public static ProspectorMode FLUID = new ProspectorMode<>("metaitem.prospector.mode.fluid", 1) { + public static ProspectorMode FLUID = new ProspectorMode<>("item.prospector.mode.fluid", 1) { @Override public void scan(FluidInfo[][][] storage, LevelChunk chunk) { @@ -283,7 +283,7 @@ public record OreInfo(Material material, int weight, int left, int yield) { } - public static ProspectorMode BEDROCK_ORE = new ProspectorMode<>("metaitem.prospector.mode.bedrock_ore", + public static ProspectorMode BEDROCK_ORE = new ProspectorMode<>("item.prospector.mode.bedrock_ore", 1) { @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/component/ElectricStats.java b/src/main/java/com/gregtechceu/gtceu/api/item/component/ElectricStats.java index 9f089646924..426770a44c4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/component/ElectricStats.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/component/ElectricStats.java @@ -88,7 +88,7 @@ public InteractionResultHolder use(Item item, Level level, Player pla if (electricItem != null && electricItem.canProvideChargeExternally() && player.isShiftKeyDown()) { if (!level.isClientSide) { boolean isInDischargeMode = isInDischargeMode(itemStack); - String locale = "metaitem.electric.discharge_mode." + (isInDischargeMode ? "disabled" : "enabled"); + String locale = "item.electric.discharge_mode." + (isInDischargeMode ? "disabled" : "enabled"); player.displayClientMessage(Component.translatable(locale), true); setInDischargeMode(itemStack, !isInDischargeMode); } @@ -186,7 +186,7 @@ public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, long current unit) .withStyle(color)); } else { - tooltip.add(Component.translatable("metaitem.generic.electric_item.tooltip", + tooltip.add(Component.translatable("item.generic.electric_item.tooltip", FormattingUtil.formatNumbers(currentCharge), FormattingUtil.formatNumbers(maxCharge), GTValues.VNF[tier]).withStyle(color)); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/component/IMaterialPartItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/component/IMaterialPartItem.java index 505cec2888c..61fe1d56dc6 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/component/IMaterialPartItem.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/component/IMaterialPartItem.java @@ -81,9 +81,9 @@ default void appendHoverText(ItemStack stack, @org.jetbrains.annotations.Nullabl var maxDurability = getPartMaxDurability(stack); var damage = getPartDamage(stack); tooltipComponents - .add(Component.translatable("metaitem.tool.tooltip.durability", maxDurability - damage, maxDurability)); + .add(Component.translatable("item.tool.tooltip.durability", maxDurability - damage, maxDurability)); tooltipComponents - .add(Component.translatable("metaitem.tool.tooltip.primary_material", material.getLocalizedName())); + .add(Component.translatable("item.tool.tooltip.primary_material", material.getLocalizedName())); } @OnlyIn(Dist.CLIENT) diff --git a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java index a10284b2a04..705d33ac739 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java @@ -36,7 +36,7 @@ import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.core.mixins.AbstractRegistrateAccessor; import com.gregtechceu.gtceu.data.GregTechDatagen; -import com.gregtechceu.gtceu.data.lang.MaterialLangGenerator; +import com.gregtechceu.gtceu.data.lang.MaterialLang; import com.gregtechceu.gtceu.data.loot.ChestGenHooks; import com.gregtechceu.gtceu.data.loot.DungeonLootLoader; import com.gregtechceu.gtceu.data.pack.GTDynamicDataPack; @@ -152,10 +152,10 @@ public static void init() { .get(ProviderType.LANG); if (providers.isEmpty()) { providers.add( - (provider) -> MaterialLangGenerator.generate((RegistrateLangProvider) provider, registry)); + (provider) -> MaterialLang.generate((RegistrateLangProvider) provider, registry)); } else { providers.add(0, - (provider) -> MaterialLangGenerator.generate((RegistrateLangProvider) provider, registry)); + (provider) -> MaterialLang.generate((RegistrateLangProvider) provider, registry)); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/IntCircuitBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/IntCircuitBehaviour.java index 5e2a1566377..2c45f249582 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/IntCircuitBehaviour.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/IntCircuitBehaviour.java @@ -95,7 +95,7 @@ public static void adjustConfiguration(ItemStack stack, int amount) { public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltipComponents, TooltipFlag isAdvanced) { int configuration = getCircuitConfiguration(stack); - tooltipComponents.add(Component.translatable("metaitem.int_circuit.configuration", configuration)); + tooltipComponents.add(Component.translatable("item.int_circuit.configuration", configuration)); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java index e45be2aeff6..b4f978d31c8 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java @@ -460,7 +460,7 @@ else if (machine instanceof IDataInfoProvider) @Override public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltipComponents, TooltipFlag isAdvanced) { - tooltipComponents.add(Component.translatable("metaitem.behavior.mode_switch.tooltip")); + tooltipComponents.add(Component.translatable("item.behavior.mode_switch.tooltip")); tooltipComponents.add(Component.translatable("behavior.portable_scanner.mode.caption", Component.translatable(getMode(stack).getLangKey()).withStyle(ChatFormatting.AQUA))); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/ProspectorScannerBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/ProspectorScannerBehavior.java index f0a393bd457..1c756c637f7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/ProspectorScannerBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/ProspectorScannerBehavior.java @@ -109,8 +109,8 @@ public ModularUI createUI(HeldItemUIFactory.HeldItemHolder holder, Player entity @Override public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltipComponents, TooltipFlag isAdvanced) { - tooltipComponents.add(Component.translatable("metaitem.prospector.tooltip.radius", radius)); - tooltipComponents.add(Component.translatable("metaitem.prospector.tooltip.modes")); + tooltipComponents.add(Component.translatable("item.prospector.tooltip.radius", radius)); + tooltipComponents.add(Component.translatable("item.prospector.tooltip.modes")); for (ProspectorMode mode : modes) { tooltipComponents.add(Component.literal(" -").append(Component.translatable(mode.unlocalizedName)) .withStyle(Style.EMPTY.withColor(ChatFormatting.RED))); diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/TurbineRotorBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/TurbineRotorBehaviour.java index 482519ee168..869bc50e2ec 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/TurbineRotorBehaviour.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/TurbineRotorBehaviour.java @@ -80,8 +80,8 @@ public void appendHoverText(ItemStack stack, @org.jetbrains.annotations.Nullable List tooltipComponents, TooltipFlag isAdvanced) { IMaterialPartItem.super.appendHoverText(stack, level, tooltipComponents, isAdvanced); tooltipComponents - .add(Component.translatable("metaitem.tool.tooltip.rotor.efficiency", getRotorEfficiency(stack))); - tooltipComponents.add(Component.translatable("metaitem.tool.tooltip.rotor.power", getRotorPower(stack))); + .add(Component.translatable("item.tool.tooltip.rotor.efficiency", getRotorEfficiency(stack))); + tooltipComponents.add(Component.translatable("item.tool.tooltip.rotor.power", getRotorPower(stack))); } @Nullable diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/ToolModeSwitchBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/ToolModeSwitchBehavior.java index 45cbc153921..10b666d516d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/ToolModeSwitchBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/ToolModeSwitchBehavior.java @@ -47,7 +47,7 @@ public void addBehaviorNBT(@NotNull ItemStack stack, @NotNull CompoundTag tag) { if (toolTypes.contains(GTToolType.WRENCH)) { tagCompound.putByte("Mode", (byte) ((tagCompound.getByte("Mode") + 1) % WrenchModeType.values().length)); - player.displayClientMessage(Component.translatable("metaitem.machine_configuration.mode", + player.displayClientMessage(Component.translatable("item.machine_configuration.mode", WrenchModeType.values()[tagCompound.getByte("Mode")].getName()), true); } return InteractionResultHolder.success(itemStack); @@ -63,7 +63,7 @@ public void addInformation(@NotNull ItemStack stack, @Nullable Level world, @Not var toolTypes = ToolHelper.getToolTypes(stack); if (toolTypes.contains(GTToolType.WRENCH)) { - tooltip.add(Component.translatable("metaitem.machine_configuration.mode", + tooltip.add(Component.translatable("item.machine_configuration.mode", WrenchModeType.values()[tagCompound.getByte("Mode")].getName())); } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java new file mode 100644 index 00000000000..8d84c49f024 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java @@ -0,0 +1,56 @@ +package com.gregtechceu.gtceu.data.lang; + +import com.tterrag.registrate.providers.RegistrateLangProvider; + +public class ArmorLang { + public static void generateArmorKeys(RegistrateLangProvider provider) { + + provider.add("item.liquid_fuel_jetpack.tooltip", "Uses Combustion Generator Fuels for Thrust"); + provider.add("metaarmor.nms.nightvision.enabled", "NanoMuscle™ Suite: NightVision Enabled"); + provider.add("metaarmor.nms.nightvision.disabled", "NanoMuscle™ Suite: NightVision Disabled"); + provider.add("metaarmor.nms.boosted_jump.enabled", "NanoMuscle™ Suite: Jump Boost Enabled"); + provider.add("metaarmor.nms.boosted_jump.disabled", "NanoMuscle™ Suite: Jump Boost Disabled"); + provider.add("metaarmor.nms.nightvision.error", "NanoMuscle™ Suite: §cNot enough power!"); + provider.add("metaarmor.qts.nightvision.enabled", "QuarkTech™ Suite: NightVision Enabled"); + provider.add("metaarmor.qts.nightvision.disabled", "QuarkTech™ Suite: NightVision Disabled"); + provider.add("metaarmor.qts.nightvision.error", "QuarkTech™ Suite: §cNot enough power!"); + provider.add("metaarmor.jetpack.flight.enable", "Jetpack: Flight Enabled"); + provider.add("metaarmor.jetpack.flight.disable", "Jetpack: Flight Disabled"); + provider.add("metaarmor.jetpack.hover.enable", "Jetpack: Hover Mode Enabled"); + provider.add("metaarmor.jetpack.hover.disable", "Jetpack: Hover Mode Disabled"); + provider.add("metaarmor.jetpack.emergency_hover_mode", "Emergency Hover Mode Enabled!"); + provider.add("metaarmor.nms.share.enable", "NanoMuscle™ Suite: Charging Enabled"); + provider.add("metaarmor.nms.share.disable", "NanoMuscle™ Suite: Charging Disabled"); + provider.add("metaarmor.nms.share.error", "NanoMuscle™ Suite: §cNot enough power for charging!"); + provider.add("metaarmor.qts.share.enable", "QuarkTech™ Suite: Charging Enabled"); + provider.add("metaarmor.qts.share.disable", "QuarkTech™ Suite: Charging Disabled"); + provider.add("metaarmor.qts.share.error", "QuarkTech™ Suite: §cNot enough power for charging!"); + provider.add("metaarmor.message.nightvision.enabled", "§bNightVision: §aOn"); + provider.add("metaarmor.message.nightvision.disabled", "§bNightVision: §cOff"); + provider.add("metaarmor.message.nightvision.error", "§cNot enough power!"); + provider.add("metaarmor.tooltip.stepassist", "Provides Step-Assist"); + provider.add("metaarmor.tooltip.speed", "Increases Running Speed"); + provider.add("metaarmor.tooltip.jump", "Increases Jump Height and Distance"); + provider.add("metaarmor.tooltip.falldamage", "Nullifies Fall Damage"); + provider.add("metaarmor.tooltip.potions", "Nullifies Harmful Effects"); + provider.add("metaarmor.tooltip.burning", "Nullifies Burning"); + provider.add("metaarmor.tooltip.freezing", "Prevents Freezing"); + provider.add("metaarmor.tooltip.breath", "Replenishes Underwater Breath Bar"); + provider.add("metaarmor.tooltip.autoeat", "Replenishes Food Bar by Using Food from Inventory"); + provider.add("metaarmor.hud.status.enabled", "§aON"); + provider.add("metaarmor.hud.status.disabled", "§cOFF"); + provider.add("metaarmor.hud.energy_lvl", "Energy Level: %s"); + provider.add("metaarmor.hud.engine_enabled", "Engine Enabled: %s"); + provider.add("metaarmor.hud.fuel_lvl", "Fuel Level: %s"); + provider.add("metaarmor.hud.hover_mode", "Hover Mode: %s"); + provider.add("mataarmor.hud.supply_mode", "Supply Mode: %s"); + provider.add("metaarmor.hud.gravi_engine", "GraviEngine: %s"); + provider.add("metaarmor.energy_share.error", "Energy Supply: §cNot enough power for gadgets charging!"); + provider.add("metaarmor.energy_share.enable", "Energy Supply: Gadgets charging enabled"); + provider.add("metaarmor.energy_share.disable", "Energy Supply: Gadgets charging disabled"); + provider.add("metaarmor.energy_share.tooltip", "Supply mode: %s"); + provider.add("metaarmor.energy_share.tooltip.guide", + "To change mode shift-right click when holding item"); + + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java new file mode 100644 index 00000000000..d6c50f699f3 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java @@ -0,0 +1,18 @@ +package com.gregtechceu.gtceu.data.lang; + +import com.tterrag.registrate.providers.RegistrateLangProvider; + +public class CommandLang { + public static void generateCommandLang(RegistrateLangProvider provider){ + provider.add("command.gtceu.dump_data.success", "Dumped %s resources from registry %s to %s"); + provider.add("command.gtceu.place_vein.failure", "Failed to place vein %s at position %s"); + provider.add("command.gtceu.place_vein.success", "Placed vein %s at position %s"); + provider.add("command.gtceu.share_prospection_data.notification", "%s is sharing prospecting data with you!"); + provider.add("command.gtceu.medical_condition.get", "Player %s has these medical conditions:"); + provider.add("command.gtceu.medical_condition.get.empty", "Player %s has no medical conditions."); + provider.add("command.gtceu.medical_condition.get.element", "Condition %s§r: %s minutes %s seconds"); + provider.add("command.gtceu.medical_condition.get.element.permanent", + "Condition %s§r: %s minutes %s seconds (permanent)"); + + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/CoverLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/CoverLang.java new file mode 100644 index 00000000000..b62cc2bcf55 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/CoverLang.java @@ -0,0 +1,188 @@ +package com.gregtechceu.gtceu.data.lang; + +import com.tterrag.registrate.providers.RegistrateLangProvider; + +import static com.gregtechceu.gtceu.data.lang.LangHandler.multiLang; +import static com.gregtechceu.gtceu.data.lang.LangHandler.multilineLang; + +public class CoverLang { + public static void generateCoverKeys(RegistrateLangProvider provider){ + + provider.add("cover.filter.blacklist.disabled", "Whitelist"); + provider.add("cover.filter.blacklist.enabled", "Blacklist"); + provider.add("cover.tag_filter.title", "Tag Filter"); + multilineLang(provider, "cover.tag_filter.info", + """ + §bAccepts complex expressions + §6a & b§r = AND + §6a | b§r = OR + §6a ^ b§r = XOR + §6!a§r = NOT + §6(a)§r for grouping + §6*§r for wildcard + §6$§r for untagged + §bTags come in the form 'namespace:tag/subtype'. + The 'forge:' namespace is assumed if one isn't provided. + §bExample: §6*dusts/gold | (gtceu:circuits & !*lv) + This matches all gold dusts or all circuits except LV ones"""); + provider.add("cover.tag_filter.test_slot.info", + "Insert a item to test if it matches the filter expression"); + provider.add("cover.tag_filter.matches", "Item matches"); + provider.add("cover.tag_filter.matches_not", "Item does not match"); + provider.add("cover.fluid_filter.title", "Fluid Filter"); + multilineLang(provider, "cover.fluid_filter.config_amount", + "Scroll wheel up increases amount, down decreases.\nShift[§6x10§r],Ctrl[§ex100§r],Shift+Ctrl[§ax1000§r]\nRight click increases amount, left click decreases.\nHold shift to double/halve.\nMiddle click to clear"); + provider.add("cover.fluid_filter.mode.filter_fill", "Filter Fill"); + provider.add("cover.fluid_filter.mode.filter_drain", "Filter Drain"); + provider.add("cover.fluid_filter.mode.filter_both", "Filter Fill & Drain"); + provider.add("cover.item_filter.title", "Item Filter"); + provider.add("cover.storage.title", "Storage Cover"); + provider.add("cover.filter.mode.filter_insert", "Filter Insert"); + provider.add("cover.filter.mode.filter_extract", "Filter Extract"); + provider.add("cover.filter.mode.filter_both", "Filter Insert/Extract"); + provider.add("cover.item_filter.ignore_damage.enabled", "Ignore Damage"); + provider.add("cover.item_filter.ignore_damage.disabled", "Respect Damage"); + provider.add("cover.item_filter.ignore_nbt.enabled", "Ignore NBT"); + provider.add("cover.item_filter.ignore_nbt.disabled", "Respect NBT"); + provider.add("cover.voiding.voiding_mode.void_any", "Void Matching"); + provider.add("cover.voiding.voiding_mode.void_overflow", "Void Overflow"); + multilineLang(provider, "cover.voiding.voiding_mode.description", + "§eVoid Matching§r will void anything matching the filter. \n§eVoid Overflow§r will void anything matching the filter, up to the specified amount."); + provider.add("cover.fluid.voiding.title", "Fluid Voiding Settings"); + provider.add("cover.fluid.voiding.advanced.title", "Advanced Fluid Voiding Settings"); + provider.add("cover.item.voiding.title", "Item Voiding Settings"); + provider.add("cover.item.voiding.advanced.title", "Advanced Item Voiding Settings"); + provider.add("cover.voiding.label.disabled", "Disabled"); + provider.add("cover.voiding.label.enabled", "Enabled"); + provider.add("cover.voiding.tooltip", + "§cWARNING!§7 Setting this to \"Enabled\" means that fluids or items WILL be voided."); + provider.add("cover.voiding.message.disabled", "Voiding Cover Disabled"); + provider.add("cover.voiding.message.enabled", "Voiding Cover Enabled"); + provider.add("cover.item_smart_filter.title", "Smart Item Filter"); + provider.add("cover.item_smart_filter.filtering_mode.electrolyzer", "Electrolyzer"); + provider.add("cover.item_smart_filter.filtering_mode.centrifuge", "Centrifuge"); + provider.add("cover.item_smart_filter.filtering_mode.sifter", "Sifter"); + multilineLang(provider, "cover.item_smart_filter.filtering_mode.description", + "Select Machine this Smart Filter will use for filtering.\nIt will automatically pick right portions of items for robotic arm."); + provider.add("cover.conveyor.title", "Conveyor Cover Settings (%s)"); + provider.add("cover.conveyor.transfer_rate", "§7items/sec"); + provider.add("cover.conveyor.mode", "Mode: %s"); + provider.add("cover.conveyor.mode.export", "Mode: Export"); + provider.add("cover.conveyor.mode.import", "Mode: Import"); + multilineLang(provider, "cover.conveyor.distribution.round_robin_global", + "Distribution Mode: §bRound Robin\n§7Splits items equally across connected inventories"); + multilineLang(provider, "cover.conveyor.distribution.round_robin_prio", + "Distribution Mode: §bRound Robin with Priority\n§7Tries to split items across connected inventories and considers higher priorities first.\n§7Restrictive item pipes lower the priority of a path."); + multilineLang(provider, "cover.conveyor.distribution.insert_first", + "Distribution Mode: §bPriority\n§7Will insert into the first inventory with the highest priority it can find.\n§7Restrictive item pipes lower the priority of a path."); + multilineLang(provider, "cover.conveyor.blocks_input.enabled", + "If enabled, items will not be inserted when cover is set to pull items from the inventory into pipe.\n§aEnabled"); + multilineLang(provider, "cover.conveyor.blocks_input.disabled", + "If enabled, items will not be inserted when cover is set to pull items from the inventory into pipe.\n§cDisabled"); + provider.add("cover.universal.manual_import_export.mode.disabled", + "Manual I/O: §bDisabled\n§7Items / Fluids will only move as specified by the cover and its filter."); + provider.add("cover.universal.manual_import_export.mode.filtered", + "Manual I/O: §bFiltered\n§7Items / Fluids can be extracted and inserted independently of the cover mode, as long as its filter matches (if any)"); + provider.add("cover.universal.manual_import_export.mode.unfiltered", + "Manual I/O: §bUnfiltered\n§7Items / Fluids can be moved independently of the cover mode. The filter only applies to what is inserted or extracted by this cover itself."); + multilineLang(provider, "cover.universal.manual_import_export.mode.description", + "§eDisabled§r - Items/fluids will only move as specified by the cover and its filter. \n§eAllow Filtered§r - Items/fluids can be extracted and inserted independently of the cover mode, as long as its filter matches (if any). \n§eAllow Unfiltered§r - Items/fluids can be moved independently of the cover mode. Filter applies to the items inserted or extracted by this cover"); + provider.add("cover.conveyor.item_filter.title", "Item Filter"); + multiLang(provider, "cover.conveyor.tag.title", "Tag Name", + "(use * for wildcard)"); + provider.add("cover.robotic_arm.title", "Robotic Arm Settings (%s)"); + provider.add("cover.robotic_arm.transfer_mode.transfer_any", "Transfer Any"); + provider.add("cover.robotic_arm.transfer_mode.transfer_exact", "Supply Exact"); + provider.add("cover.robotic_arm.transfer_mode.keep_exact", "Keep Exact"); + multilineLang(provider, "cover.robotic_arm.transfer_mode.description", + "§eTransfer Any§r - in this mode, cover will transfer as many items matching its filter as possible.\n§eSupply Exact§r - in this mode, cover will supply items in portions specified in item filter slots (or variable under this button for tag filter). If amount of items is less than portion size, items won't be moved.\n§eKeep Exact§r - in this mode, cover will keep specified amount of items in the destination inventory, supplying additional amount of items if required.\n§7Tip: left/right click on filter slots to change item amount, use shift clicking to change amount faster."); + provider.add("cover.pump.title", "Pump Cover Settings (%s)"); + provider.add("cover.pump.transfer_rate", "%s"); + provider.add("cover.pump.mode.export", "Mode: Export"); + provider.add("cover.pump.mode.import", "Mode: Import"); + provider.add("cover.pump.fluid_filter.title", "Fluid Filter"); + provider.add("cover.bucket.mode.bucket", "B"); + provider.add("cover.bucket.mode.milli_bucket", "mB"); + provider.add("cover.fluid_regulator.title", "Fluid Regulator Settings (%s)"); + multilineLang(provider, "cover.fluid_regulator.transfer_mode.description", + "§eTransfer Any§r - in this mode, cover will transfer as many fluids matching its filter as possible.\n§eSupply Exact§r - in this mode, cover will supply fluids in portions specified in the window underneath this button. If amount of fluids is less than portion size, fluids won't be moved.\n§eKeep Exact§r - in this mode, cover will keep specified amount of fluids in the destination inventory, supplying additional amount of fluids if required.\n§7Tip: shift click will multiply increase/decrease amounts by 10 and ctrl click will multiply by 100."); + provider.add("cover.fluid_regulator.supply_exact", "Supply Exact: %s"); + provider.add("cover.fluid_regulator.keep_exact", "Keep Exact: %s"); + provider.add("cover.machine_controller.title", "Machine Controller Settings"); + provider.add("cover.machine_controller.normal", "Normal"); + provider.add("cover.machine_controller.inverted", "Inverted"); + multilineLang(provider, "cover.machine_controller.invert.enabled", + "§eInverted§r - in this mode, the cover will require a signal stronger than the set redstone level to run"); + multilineLang(provider, "cover.machine_controller.invert.disabled", + "§eNormal§r - in this mode, the cover will require a signal weaker than the set redstone level to run"); + provider.add("cover.machine_controller.redstone", "Min Redstone Strength: %d"); + provider.add("cover.machine_controller.mode.machine", "Control Machine"); + provider.add("cover.machine_controller.mode.cover_up", "Control Cover (Top)"); + provider.add("cover.machine_controller.mode.cover_down", "Control Cover (Bottom)"); + provider.add("cover.machine_controller.mode.cover_south", "Control Cover (South)"); + provider.add("cover.machine_controller.mode.cover_north", "Control Cover (North)"); + provider.add("cover.machine_controller.mode.cover_east", "Control Cover (East)"); + provider.add("cover.machine_controller.mode.cover_west", "Control Cover (West)"); + provider.add("cover.machine_controller.mode.null", "Control Nothing"); + provider.add("cover.ender_fluid_link.title", "Ender Fluid Link"); + provider.add("cover.ender_fluid_link.iomode.enabled", "I/O Enabled"); + provider.add("cover.ender_fluid_link.iomode.disabled", "I/O Disabled"); + provider.add("cover.ender_fluid_link.tooltip.channel_description", "Set channel description with input text"); + provider.add("cover.ender_fluid_link.tooltip.channel_name", "Set channel name with input text"); + provider.add("cover.ender_fluid_link.tooltip.list_button", "Show channel list"); + provider.add("cover.ender_fluid_link.tooltip.clear_button", "Clear channel description"); + multilineLang(provider, "cover.ender_fluid_link.private.tooltip.disabled", + "Switch to private tank mode\nPrivate mode uses the player who originally placed the cover"); + provider.add("cover.ender_fluid_link.private.tooltip.enabled", "Switch to public tank mode"); + multilineLang(provider, "cover.ender_fluid_link.incomplete_hex", + "Inputted color is incomplete!\nIt will be applied once complete (all 8 hex digits)\nClosing the gui will lose edits!"); + provider.add("cover.detector_base.message_normal_state", "Monitoring Status: Normal"); + provider.add("cover.detector_base.message_inverted_state", "Monitoring Status: Inverted"); + + var detectorLatchDescription = """ + Change the redstone behavior of this Cover. + §eContinuous§7 - Default; values less than the minimum output 0; values higher than the maximum output 15; values between min and max output between 0 and 15 + §eLatched§7 - output 15 until above max, then output 0 until below min"""; + multilineLang(provider, "cover.advanced_detector.latch.enabled", + "Behavior: Latched\n\n" + detectorLatchDescription); + multilineLang(provider, "cover.advanced_detector.latch.disabled", + "Behavior: Continuous\n\n" + detectorLatchDescription); + + provider.add("cover.advanced_energy_detector.label", "Advanced Energy Detector"); + provider.add("cover.advanced_energy_detector.min", "Min"); + provider.add("cover.advanced_energy_detector.max", "Max"); + + var advancedEnergyDetectorInvertDescription = "Toggle to invert the redstone logic\nBy default, redstone is emitted when less than the minimum EU, and stops emitting when greater than the max EU"; + multilineLang(provider, "cover.advanced_energy_detector.invert.enabled", + "Output: Inverted\n\n" + advancedEnergyDetectorInvertDescription); + multilineLang(provider, "cover.advanced_energy_detector.invert.disabled", + "Output: Normal\n\n" + advancedEnergyDetectorInvertDescription); + var advancedEnergyDetectorModeDescription = "Change between using discrete EU values or percentages for comparing min/max against an attached energy storage."; + multilineLang(provider, "cover.advanced_energy_detector.use_percent.enabled", + "Mode: Percentage\n\n" + advancedEnergyDetectorModeDescription); + multilineLang(provider, "cover.advanced_energy_detector.use_percent.disabled", + "Mode: Discrete EU\n\n" + advancedEnergyDetectorModeDescription); + + provider.add("cover.advanced_fluid_detector.label", "Advanced Fluid Detector"); + var advancedFluidDetectorInvertDescription = "Toggle to invert the redstone logic\nBy default, redstone stops emitting when less than the minimum mB of fluid, and starts emitting when greater than the min mB of fluid up to the set maximum"; + multilineLang(provider, "cover.advanced_fluid_detector.invert.enabled", + "Output: Inverted\n\n" + advancedFluidDetectorInvertDescription); + multilineLang(provider, "cover.advanced_fluid_detector.invert.disabled", + "Output: Normal\n\n" + advancedFluidDetectorInvertDescription); + provider.add("cover.advanced_fluid_detector.max", "Max Fluid (mB)"); + provider.add("cover.advanced_fluid_detector.min", "Min Fluid (mB)"); + + provider.add("cover.advanced_item_detector.label", "Advanced Item Detector"); + var advancedItemDetectorInvertDescription = "Toggle to invert the redstone logic\nBy default, redstone stops emitting when less than the minimum amount of items, and starts emitting when greater than the min amount of items up to the set maximum"; + multilineLang(provider, "cover.advanced_item_detector.invert.enabled", + "Output: Inverted\n\n" + advancedItemDetectorInvertDescription); + multilineLang(provider, "cover.advanced_item_detector.invert.disabled", + "Output: Normal\n\n" + advancedItemDetectorInvertDescription); + provider.add("cover.advanced_item_detector.max", "Max Items"); + provider.add("cover.advanced_item_detector.min", "Min Items"); + provider.add("cover.shutter.message.enabled", "Closed shutter"); + provider.add("cover.shutter.message.disabled", "Opened shutter"); + + + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java new file mode 100644 index 00000000000..4ac9b526c64 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java @@ -0,0 +1,37 @@ +package com.gregtechceu.gtceu.data.lang; + +import com.tterrag.registrate.providers.RegistrateLangProvider; + +public class HazardLang { + public static void generateHazardKeys(RegistrateLangProvider provider){ + + provider.add("gtceu.medical_condition.description", "§l§cHAZARDOUS §7Hold Shift to show details"); + provider.add("gtceu.medical_condition.description_shift", "§l§cHAZARDOUS:"); + provider.add("gtceu.medical_condition.chemical_burns", "§5Chemical burns"); + provider.add("gtceu.medical_condition.poison", "§2Poisonous"); + provider.add("gtceu.medical_condition.weak_poison", "§aWeakly poisonous"); + provider.add("gtceu.medical_condition.irritant", "§6Irritant"); + provider.add("gtceu.medical_condition.nausea", "§3Nauseating"); + provider.add("gtceu.medical_condition.carcinogen", "§eCarcinogenic"); + provider.add("gtceu.medical_condition.asbestosis", "§dAsbestosis"); + provider.add("gtceu.medical_condition.arsenicosis", "§bArsenicosis"); + provider.add("gtceu.medical_condition.silicosis", "§1Silicosis"); + provider.add("gtceu.medical_condition.berylliosis", "§5Berylliosis"); + provider.add("gtceu.medical_condition.methanol_poisoning", "§6Methanol Poisoning"); + provider.add("gtceu.medical_condition.carbon_monoxide_poisoning", "§7Carbon Monoxide Poisoning"); + provider.add("gtceu.medical_condition.none", "§2Not Dangerous"); + provider.add("gtceu.hazard_trigger.description", "Caused by:"); + provider.add("gtceu.hazard_trigger.protection.description", "Protects from:"); + provider.add("gtceu.hazard_trigger.inhalation", "Inhalation"); + provider.add("gtceu.hazard_trigger.any", "Any contact"); + + provider.add("gtceu.hazard_trigger.skin_contact", "Skin contact"); + provider.add("gtceu.hazard_trigger.none", "Nothing"); + provider.add("gtceu.medical_condition.antidote.description", "§aAntidote §7Hold Shift to show details"); + provider.add("gtceu.medical_condition.antidote.description_shift", "§aCures these conditions:"); + provider.add("gtceu.medical_condition.antidote.description.effect_removed", + "Removes %s%% of current conditions' effects"); + provider.add("gtceu.medical_condition.antidote.description.effect_removed.all", + "Removes all of current conditions' effects"); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java index c44b752bc5f..aceb1455231 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java @@ -16,6 +16,8 @@ public static void init(RegistrateLangProvider provider) { initGeneratedNames(provider); initItemNames(provider); initItemTooltips(provider); + provider.add("item.invalid.name", "Invalid item"); + } private static void initGeneratedNames(RegistrateLangProvider provider) { @@ -484,5 +486,134 @@ private static void initItemTooltips(RegistrateLangProvider provider) { "Shift + R-Click on a controller to automatically build the multi-block"); provider.add("item.gtceu.sus_record.desc", "§7sussy!"); + + provider.add("item.gtceu.ulv_voltage_coil.tooltip", "Primitive Coil"); + provider.add("item.gtceu.lv_voltage_coil.tooltip", "Basic Coil"); + provider.add("item.gtceu.mv_voltage_coil.tooltip", "Good Coil"); + provider.add("item.gtceu.hv_voltage_coil.tooltip", "Advanced Coil"); + provider.add("item.gtceu.ev_voltage_coil.tooltip", "Extreme Coil"); + provider.add("item.gtceu.iv_voltage_coil.tooltip", "Elite Coil"); + provider.add("item.gtceu.luv_voltage_coil.tooltip", "Master Coil"); + provider.add("item.gtceu.zpm_voltage_coil.tooltip", "Super Coil"); + provider.add("item.gtceu.uv_voltage_coil.tooltip", "Ultimate Coil"); + provider.add("item.gtceu.uhv_voltage_coil.tooltip", "Ultra Coil"); + provider.add("item.gtceu.uev_voltage_coil.tooltip", "Unreal Coil"); + provider.add("item.gtceu.uiv_voltage_coil.tooltip", "Insane Coil"); + provider.add("item.gtceu.uxv_voltage_coil.tooltip", "Epic Coil"); + provider.add("item.gtceu.opv_voltage_coil.tooltip", "Legendary Coil"); + provider.add("item.gtceu.max_voltage_coil.tooltip", "Maximum Coil"); + + + + } + + public static void generateBehaviorKeys(RegistrateLangProvider provider){ + provider.add("behaviour.hoe", "Can till dirt"); + provider.add("behaviour.soft_hammer", "Activates and Deactivates Machines"); + provider.add("behaviour.soft_hammer.enabled", "Working Enabled"); + provider.add("behaviour.soft_hammer.disabled", "Working Disabled"); + provider.add("behaviour.soft_hammer.idle_after_cycle", "Pause machine after current cycle"); + provider.add("behaviour.lighter.tooltip.description", "Can light things on fire"); + provider.add("behaviour.lighter.tooltip.usage", "Shift-right click to open/close"); + provider.add("behaviour.lighter.fluid.tooltip", "Can light things on fire with Butane or Propane"); + provider.add("behaviour.lighter.uses", "Remaining uses: %d"); + provider.add("behavior.toggle_energy_consumer.tooltip", "Use to toggle mode"); + provider.add("behaviour.hammer", "Turns on and off Muffling for Machines (by hitting them)"); + provider.add("behaviour.wrench", "Rotates Blocks on Rightclick"); + provider.add("behaviour.boor.by", "by %s"); + provider.add("behaviour.paintspray.solvent.tooltip", "Can remove color from things"); + provider.add("behaviour.paintspray.white.tooltip", "Can paint things in White"); + provider.add("behaviour.paintspray.orange.tooltip", "Can paint things in Orange"); + provider.add("behaviour.paintspray.magenta.tooltip", "Can paint things in Magenta"); + provider.add("behaviour.paintspray.light_blue.tooltip", "Can paint things in Light Blue"); + provider.add("behaviour.paintspray.yellow.tooltip", "Can paint things in Yellow"); + provider.add("behaviour.paintspray.lime.tooltip", "Can paint things in Lime"); + provider.add("behaviour.paintspray.pink.tooltip", "Can paint things in Pink"); + provider.add("behaviour.paintspray.gray.tooltip", "Can paint things in Gray"); + provider.add("behaviour.paintspray.light_gray.tooltip", "Can paint things in Light Gray"); + provider.add("behaviour.paintspray.cyan.tooltip", "Can paint things in Cyan"); + provider.add("behaviour.paintspray.purple.tooltip", "Can paint things in Purple"); + provider.add("behaviour.paintspray.blue.tooltip", "Can paint things in Blue"); + provider.add("behaviour.paintspray.brown.tooltip", "Can paint things in Brown"); + provider.add("behaviour.paintspray.green.tooltip", "Can paint things in Green"); + provider.add("behaviour.paintspray.red.tooltip", "Can paint things in Red"); + provider.add("behaviour.paintspray.black.tooltip", "Can paint things in Black"); + provider.add("behaviour.paintspray.uses", "Remaining Uses: %d"); + provider.add("behaviour.prospecting", "Usable for Prospecting"); + provider.add("behaviour.meta.machine.config.copy.tooltip", "§7Sneak + R-Click to copy machine configuration"); + provider.add("behaviour.meta.machine.config.paste.tooltip", "§7R-Click to paste machine configuration"); + provider.add("behaviour.setting.allow.input.from.output.tooltip", "%s input from output side is %s"); + provider.add("behaviour.setting.output.direction.tooltip", "%s output direction: %s"); + provider.add("behaviour.setting.item_auto_output.tooltip", "%s auto-output is %s"); + provider.add("behaviour.setting.muffled.tooltip", "Muffling %s"); + provider.add("item.toggle.advanced.info.tooltip", "§8"); + + provider.add("item.prospector.mode.ores", "§aOre Prospection Mode§r"); + provider.add("item.prospector.mode.fluid", "§bFluid Prospection Mode§r"); + provider.add("item.prospector.mode.bedrock_ore", "§bBedrock Ore Prospection Mode§r"); + provider.add("item.prospector.tooltip.radius", "Scans range in a %s Chunk Radius"); + provider.add("item.prospector.tooltip.modes", "Available Modes:"); + provider.add("behavior.prospector.not_enough_energy", "Not Enough Energy!"); + provider.add("behavior.prospector.added_waypoint", "Created waypoint named %s!"); + provider.add("item.tricorder_scanner.tooltip", "Tricorder"); + provider.add("item.debug_scanner.tooltip", "Tricorder"); + provider.add("behavior.portable_scanner.bedrock_fluid.amount", "Fluid In Deposit: %s %s - %s%%"); + provider.add("behavior.portable_scanner.bedrock_fluid.amount_unknown", "Fluid In Deposit: %s%%"); + provider.add("behavior.portable_scanner.bedrock_fluid.nothing", "Fluid In Deposit: §6Nothing§r"); + provider.add("behavior.portable_scanner.environmental_hazard", "Environmental Hazard In Chunk: %s§r - %s ppm"); + provider.add("behavior.portable_scanner.environmental_hazard.nothing", + "Environmental Hazard In Chunk: §6Nothing§r"); + provider.add("behavior.portable_scanner.local_hazard", "Local Hazard In Area: %s§r - %s ppm"); + provider.add("behavior.portable_scanner.local_hazard.nothing", "Local Hazard In Area: §6Nothing§r"); + provider.add("behavior.portable_scanner.block_hardness", "Hardness: %s Blast Resistance: %s"); + provider.add("behavior.portable_scanner.block_name", "Name: %s MetaData: %s"); + provider.add("behavior.portable_scanner.debug_cpu_load", + "Average CPU load of ~%sns over %s ticks with worst time of %sns."); + provider.add("behavior.portable_scanner.debug_cpu_load_seconds", "This is %s seconds."); + provider.add("behavior.portable_scanner.debug_lag_count", + "Caused %s Lag Spike Warnings (anything taking longer than %sms) on the Server."); + provider.add("behavior.portable_scanner.debug_machine", "Meta-ID: %s"); + provider.add("behavior.portable_scanner.debug_machine_invalid", " invalid!"); + provider.add("behavior.portable_scanner.debug_machine_invalid_null=invalid! MetaTileEntity =", + " null!"); + provider.add("behavior.portable_scanner.debug_machine_valid", " valid"); + provider.add("behavior.portable_scanner.divider", "========================="); + provider.add("behavior.portable_scanner.energy_container_in", "Max IN: %s (%s) EU at %s A"); + provider.add("behavior.portable_scanner.energy_container_out", "Max OUT: %s (%s) EU at %s A"); + provider.add("behavior.portable_scanner.energy_container_storage", "Energy: %s EU / %s EU"); + provider.add("behavior.portable_scanner.eu_per_sec", "Average (last second): %s EU/t"); + provider.add("behavior.portable_scanner.amp_per_sec", "Average (last second): %s A"); + provider.add("behavior.portable_scanner.machine_disabled", "Disabled."); + provider.add("behavior.portable_scanner.machine_front_facing", "Front Facing: %s"); + provider.add("behavior.portable_scanner.machine_ownership", "§2Machine Owner Type: %s§r"); + provider.add("behavior.portable_scanner.guild_name", "§2Guild Name: %s§r"); + provider.add("behavior.portable_scanner.team_name", "§2Team Name: %s§r"); + provider.add("behavior.portable_scanner.player_name", "§2Player Name: %s§r, §7Player Online: %s§r"); + provider.add("behavior.portable_scanner.machine_power_loss", "Shut down due to power loss."); + provider.add("behavior.portable_scanner.machine_progress", "Progress/Load: %s / %s"); + provider.add("behavior.portable_scanner.machine_upwards_facing", "Upwards Facing: %s"); + provider.add("behavior.portable_scanner.muffled", "Muffled."); + provider.add("behavior.portable_scanner.multiblock_energy_input", + "Max Energy Income: %s EU/t Tier: %s"); + provider.add("behavior.portable_scanner.multiblock_energy_output", + "Max Energy Output: %s EU/t Tier: %s"); + provider.add("behavior.portable_scanner.multiblock_maintenance", "Problems: %s"); + provider.add("behavior.portable_scanner.multiblock_parallel", "Multi Processing: %s"); + provider.add("behavior.portable_scanner.position", "----- X: %s Y: %s Z: %s D: %s -----"); + provider.add("behavior.portable_scanner.state", "%s: %s"); + provider.add("behavior.portable_scanner.tank", "Tank %s: %s mB / %s mB %s"); + provider.add("behavior.portable_scanner.tanks_empty", "All Tanks Empty"); + provider.add("behavior.portable_scanner.workable_consumption", "Probably Uses: %s EU/t at %s A"); + provider.add("behavior.portable_scanner.workable_production", "Probably Produces: %s EU/t at %s A"); + provider.add("behavior.portable_scanner.workable_progress", "Progress: %s s / %s s"); + provider.add("behavior.portable_scanner.workable_stored_energy", "Stored Energy: %s EU / %s EU"); + provider.add("behavior.portable_scanner.mode.caption", "Display mode: %s"); + provider.add("behavior.portable_scanner.mode.show_all_info", "Show all info"); + provider.add("behavior.portable_scanner.mode.show_block_info", "Show block info"); + provider.add("behavior.portable_scanner.mode.show_machine_info", "Show machine info"); + provider.add("behavior.portable_scanner.mode.show_electrical_info", "Show electrical info"); + provider.add("behavior.portable_scanner.mode.show_recipe_info", "Show recipe info"); + provider.add("behavior.portable_scanner.mode.show_environmental_info", "Show environmental info"); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java index d519d1ceb5d..9ccce0e91a2 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.data.lang; import com.gregtechceu.gtceu.common.data.GTBlocks; -import com.gregtechceu.gtceu.common.data.GTMaterials; + import net.minecraft.locale.Language; import net.minecraft.network.chat.Component; @@ -50,27 +50,7 @@ public static void init(RegistrateLangProvider provider) { "Right click to decrease the OC", "Middle click to reset the OC", "Hold Shift to change by Perfect OC"); - provider.add("recipe.condition.thunder.tooltip", "Thunder Level: %d"); - provider.add("recipe.condition.rain.tooltip", "Rain Level: %d"); - provider.add("recipe.condition.dimension.tooltip", "Dimension: %s"); - provider.add("recipe.condition.dimension_marker.tooltip", "Dimension:"); - provider.add("recipe.condition.biome.tooltip", "Biome: %s"); - provider.add("recipe.condition.pos_y.tooltip", "Y Level: %d <= Y <= %d"); - provider.add("recipe.condition.steam_vent.tooltip", "Clean steam vent"); - provider.add("recipe.condition.rock_breaker.tooltip", "Fluid blocks around"); - provider.add("recipe.condition.adjacent_block.tooltip", "Blocks around"); - provider.add("recipe.condition.eu_to_start.tooltip", "EU to Start: %d%s"); - provider.add("recipe.condition.daytime.day.tooltip", "Requires day time to work"); - provider.add("recipe.condition.daytime.night.tooltip", "Requires night time to work"); - provider.add("recipe.condition.gamestage.unlocked_stage", "Unlocked at stage: %s"); - provider.add("recipe.condition.gamestage.locked_stage", "Locked at stage: %s"); - provider.add("recipe.condition.quest.completed.tooltip", "Requires %s completed"); - provider.add("recipe.condition.quest.not_completed.tooltip", "Requires %s not completed"); - - provider.add("gtceu.io.import", "Import"); - provider.add("gtceu.io.export", "Export"); - provider.add("gtceu.io.both", "Both"); - provider.add("gtceu.io.none", "None"); + provider.add("gtceu.multiblock.page_switcher.io.import", "§2Inputs"); provider.add("gtceu.multiblock.page_switcher.io.export", "§4Outputs"); @@ -78,254 +58,42 @@ public static void init(RegistrateLangProvider provider) { provider.add("enchantment.disjunction", "Disjunction"); - provider.add("item.invalid.name", "Invalid item"); provider.add("fluid.empty", "Empty"); - provider.add("gtceu.tooltip.hold_shift", "§7Hold SHIFT for more info"); - provider.add("gtceu.tooltip.hold_ctrl", "§7Hold CTRL for more info"); - provider.add("gtceu.tooltip.fluid_pipe_hold_shift", "§7Hold SHIFT to show Fluid Containment Info"); - provider.add("gtceu.tooltip.tool_fluid_hold_shift", - "§7Hold SHIFT to show Fluid Containment and Tool Info"); - provider.add("metaitem.generic.fluid_container.tooltip", "%d/%dL %s"); - provider.add("metaitem.generic.electric_item.tooltip", "%d/%d EU - Tier %s"); - provider.add("metaitem.generic.electric_item.stored", "%d/%d EU (%s)"); - provider.add("metaitem.electric.discharge_mode.enabled", "§eDischarge Mode Enabled"); - provider.add("metaitem.electric.discharge_mode.disabled", "§eDischarge Mode Disabled"); - provider.add("metaitem.electric.discharge_mode.tooltip", "Use while sneaking to toggle discharge mode"); - provider.add("metaitem.dust.tooltip.purify", "Right click a Cauldron to get clean Dust"); - provider.add("metaitem.crushed.tooltip.purify", "Right click a Cauldron to get Purified Ore"); - provider.add("metaitem.int_circuit.configuration", "Configuration: %d"); - - provider.add("metaitem.machine_configuration.mode", "§aConfiguration Mode:§r %s"); + provider.add("item.generic.fluid_container.tooltip", "%d/%dL %s"); + provider.add("item.generic.electric_item.tooltip", "%d/%d EU - Tier %s"); + provider.add("item.generic.electric_item.stored", "%d/%d EU (%s)"); + provider.add("item.electric.discharge_mode.enabled", "§eDischarge Mode Enabled"); + provider.add("item.electric.discharge_mode.disabled", "§eDischarge Mode Disabled"); + provider.add("item.electric.discharge_mode.tooltip", "Use while sneaking to toggle discharge mode"); + provider.add("item.dust.tooltip.purify", "Right click a Cauldron to get clean Dust"); + provider.add("item.crushed.tooltip.purify", "Right click a Cauldron to get Purified Ore"); + provider.add("item.int_circuit.configuration", "Configuration: %d"); + + provider.add("item.machine_configuration.mode", "§aConfiguration Mode:§r %s"); provider.add("gtceu.mode.fluid", "§9Fluid§r"); provider.add("gtceu.mode.item", "§6Item§r"); provider.add("gtceu.mode.both", "§dBoth (Fluid And Item)§r"); - - provider.add("gtceu.tool.class.sword", "Sword"); - provider.add("gtceu.tool.class.pickaxe", "Pickaxe"); - provider.add("gtceu.tool.class.shovel", "Shovel"); - provider.add("gtceu.tool.class.axe", "Axe"); - provider.add("gtceu.tool.class.hoe", "Hoe"); - provider.add("gtceu.tool.class.mining_hammer", "Mining Hammer"); - provider.add("gtceu.tool.class.spade", "Spade"); - provider.add("gtceu.tool.class.saw", "Saw"); - provider.add("gtceu.tool.class.hammer", "Hammer"); - provider.add("gtceu.tool.class.mallet", "Soft Mallet"); - provider.add("gtceu.tool.class.wrench", "Wrench"); - provider.add("gtceu.tool.class.file", "File"); - provider.add("gtceu.tool.class.crowbar", "Crowbar"); - provider.add("gtceu.tool.class.screwdriver", "Screwdriver"); - provider.add("gtceu.tool.class.mortar", "Mortar"); - provider.add("gtceu.tool.class.wire_cutter", "Wire Cutter"); - provider.add("gtceu.tool.class.knife", "Knife"); - provider.add("gtceu.tool.class.butchery_knife", "Butchery Knife"); - provider.add("gtceu.tool.class.scythe", "Scythe"); - provider.add("gtceu.tool.class.rolling_pin", "Rolling Pin"); - provider.add("gtceu.tool.class.plunger", "Plunger"); - provider.add("gtceu.tool.class.shears", "Shears"); - provider.add("gtceu.tool.class.drill", "Drill"); - - provider.add("command.gtceu.medical_condition.get", "Player %s has these medical conditions:"); - provider.add("command.gtceu.medical_condition.get.empty", "Player %s has no medical conditions."); - provider.add("command.gtceu.medical_condition.get.element", "Condition %s§r: %s minutes %s seconds"); - provider.add("command.gtceu.medical_condition.get.element.permanent", - "Condition %s§r: %s minutes %s seconds (permanent)"); - provider.add("command.gtceu.dump_data.success", "Dumped %s resources from registry %s to %s"); - provider.add("command.gtceu.place_vein.failure", "Failed to place vein %s at position %s"); - provider.add("command.gtceu.place_vein.success", "Placed vein %s at position %s"); - provider.add("command.gtceu.share_prospection_data.notification", "%s is sharing prospecting data with you!"); - - provider.add("gtceu.medical_condition.description", "§l§cHAZARDOUS §7Hold Shift to show details"); - provider.add("gtceu.medical_condition.description_shift", "§l§cHAZARDOUS:"); - provider.add("gtceu.medical_condition.chemical_burns", "§5Chemical burns"); - provider.add("gtceu.medical_condition.poison", "§2Poisonous"); - provider.add("gtceu.medical_condition.weak_poison", "§aWeakly poisonous"); - provider.add("gtceu.medical_condition.irritant", "§6Irritant"); - provider.add("gtceu.medical_condition.nausea", "§3Nauseating"); - provider.add("gtceu.medical_condition.carcinogen", "§eCarcinogenic"); - provider.add("gtceu.medical_condition.asbestosis", "§dAsbestosis"); - provider.add("gtceu.medical_condition.arsenicosis", "§bArsenicosis"); - provider.add("gtceu.medical_condition.silicosis", "§1Silicosis"); - provider.add("gtceu.medical_condition.berylliosis", "§5Berylliosis"); - provider.add("gtceu.medical_condition.methanol_poisoning", "§6Methanol Poisoning"); - provider.add("gtceu.medical_condition.carbon_monoxide_poisoning", "§7Carbon Monoxide Poisoning"); - provider.add("gtceu.medical_condition.none", "§2Not Dangerous"); - provider.add("gtceu.hazard_trigger.description", "Caused by:"); - provider.add("gtceu.hazard_trigger.protection.description", "Protects from:"); - provider.add("gtceu.hazard_trigger.inhalation", "Inhalation"); - provider.add("gtceu.hazard_trigger.any", "Any contact"); - - provider.add("gtceu.hazard_trigger.skin_contact", "Skin contact"); - provider.add("gtceu.hazard_trigger.none", "Nothing"); - provider.add("gtceu.medical_condition.antidote.description", "§aAntidote §7Hold Shift to show details"); - provider.add("gtceu.medical_condition.antidote.description_shift", "§aCures these conditions:"); - provider.add("gtceu.medical_condition.antidote.description.effect_removed", - "Removes %s%% of current conditions' effects"); - provider.add("gtceu.medical_condition.antidote.description.effect_removed.all", - "Removes all of current conditions' effects"); - provider.add("gtceu.multiblock.dimension", "§eDimensions: §r%sx%sx%s"); provider.add("item.gtceu.tool.replace_tool_head", "Craft with a new Tool Head to replace it"); provider.add("item.gtceu.tool.usable_as", "§8Usable as: §f%s"); - provider.add("item.gtceu.tool.behavior.silk_ice", "§bIce Cutter: §fSilk Harvests Ice"); - provider.add("item.gtceu.tool.behavior.torch_place", "§eSpelunker: §fPlaces Torches on Right-Click"); - provider.add("item.gtceu.tool.behavior.tree_felling", "§4Lumberjack: §fTree Felling"); - provider.add("item.gtceu.tool.behavior.strip_log", "§5Artisan: §fStrips Logs"); - provider.add("item.gtceu.tool.behavior.scrape", "§bPolisher: §fRemoves Oxidation"); - provider.add("item.gtceu.tool.behavior.remove_wax", "§6Cleaner: §fRemoves Wax"); - provider.add("item.gtceu.tool.behavior.shield_disable", "§cBrute: §fDisables Shields"); - provider.add("item.gtceu.tool.behavior.relocate_mining", "§2Magnetic: §fRelocates Mined Blocks and Mob Drops"); - provider.add("item.gtceu.tool.behavior.aoe_mining", "§5Area-of-Effect: §f%sx%sx%s"); - provider.add("item.gtceu.tool.behavior.ground_tilling", "§eFarmer: §fTills Ground"); - provider.add("item.gtceu.tool.behavior.grass_path", "§eLandscaper: §fCreates Grass Paths"); - provider.add("item.gtceu.tool.behavior.rail_rotation", "§eRailroad Engineer: §fRotates Rails"); - provider.add("item.gtceu.tool.behavior.crop_harvesting", "§aHarvester: §fHarvests Crops"); - provider.add("item.gtceu.tool.behavior.plunger", "§9Plumber: §fDrains Fluids"); - provider.add("item.gtceu.tool.behavior.block_rotation", "§2Mechanic: §fRotates Blocks"); - provider.add("item.gtceu.tool.behavior.damage_boost", "§4Damage Boost: §fExtra damage against %s"); - replace(provider, "item.gtceu.tool.sword", "%s Sword"); - replace(provider, "item.gtceu.tool.pickaxe", "%s Pickaxe"); - replace(provider, "item.gtceu.tool.shovel", "%s Shovel"); - replace(provider, "item.gtceu.tool.axe", "%s Axe"); - replace(provider, "item.gtceu.tool.hoe", "%s Hoe"); - replace(provider, "item.gtceu.tool.saw", "%s Saw"); - replace(provider, "item.gtceu.tool.hammer", "%s Hammer"); - provider.add("item.gtceu.tool.hammer.tooltip", "§8Crushes Blocks when harvesting them"); - replace(provider, "item.gtceu.tool.mallet", "%s Soft Mallet"); - multilineLang(provider, "item.gtceu.tool.mallet.tooltip", - "§8Sneak to Pause Machine After Current Recipe.\n§8Stops/Starts Machines"); - replace(provider, "item.gtceu.tool.wrench", "%s Wrench"); - provider.add("item.gtceu.tool.wrench.tooltip", "§8Hold left click to dismantle Machines"); - replace(provider, "item.gtceu.tool.file", "%s File"); - replace(provider, "item.gtceu.tool.crowbar", "%s Crowbar"); - provider.add("item.gtceu.tool.crowbar.tooltip", "§8Dismounts Covers"); - replace(provider, "item.gtceu.tool.screwdriver", "%s Screwdriver"); - provider.add("item.gtceu.tool.screwdriver.tooltip", "§8Adjusts Covers and Machines"); - replace(provider, "item.gtceu.tool.mortar", "%s Mortar"); - replace(provider, "item.gtceu.tool.wire_cutter", "%s Wire Cutter"); - replace(provider, "item.gtceu.tool.knife", "%s Knife"); - replace(provider, "item.gtceu.tool.butchery_knife", "%s Butchery Knife"); - provider.add("item.gtceu.tool.butchery_knife.tooltip", "§8Has a slow Attack Rate"); - replace(provider, "item.gtceu.tool.scythe", "%s Scythe"); - provider.add("item.gtceu.tool.scythe.tooltip", "§8Because a Scythe doesn't make Sense"); - replace(provider, "item.gtceu.tool.rolling_pin", "%s Rolling Pin"); - replace(provider, "item.gtceu.tool.lv_drill", "%s Drill (LV)"); - replace(provider, "item.gtceu.tool.mv_drill", "%s Drill (MV)"); - replace(provider, "item.gtceu.tool.hv_drill", "%s Drill (HV)"); - replace(provider, "item.gtceu.tool.ev_drill", "%s Drill (EV)"); - replace(provider, "item.gtceu.tool.iv_drill", "%s Drill (IV)"); - replace(provider, "item.gtceu.tool.lv_wirecutter", "%s Wire Cutter (LV)"); - replace(provider, "item.gtceu.tool.hv_wirecutter", "%s Wire Cutter (HV)"); - replace(provider, "item.gtceu.tool.iv_wirecutter", "%s Wire Cutter (IV)"); - replace(provider, "item.gtceu.tool.mining_hammer", "%s Mining Hammer"); - provider.add("item.gtceu.tool.mining_hammer.tooltip", - "§8Mines a large area at once (unless you're crouching)"); - replace(provider, "item.gtceu.tool.spade", "%s Spade"); - provider.add("item.gtceu.tool.spade.tooltip", "§8Mines a large area at once (unless you're crouching)"); - replace(provider, "item.gtceu.tool.lv_chainsaw", "%s Chainsaw (LV)"); - replace(provider, "item.gtceu.tool.mv_chainsaw", "%s Chainsaw (MV)"); - replace(provider, "item.gtceu.tool.hv_chainsaw", "%s Chainsaw (HV)"); - replace(provider, "item.gtceu.tool.lv_wrench", "%s Wrench (LV)"); - provider.add("item.gtceu.tool.lv_wrench.tooltip", "§8Hold left click to dismantle Machines"); - replace(provider, "item.gtceu.tool.hv_wrench", "%s Wrench (HV)"); - provider.add("item.gtceu.tool.hv_wrench.tooltip", "§8Hold left click to dismantle Machines"); - replace(provider, "item.gtceu.tool.iv_wrench", "%s Wrench (IV)"); - provider.add("item.gtceu.tool.iv_wrench.tooltip", "§8Hold left click to dismantle Machines"); - replace(provider, "item.gtceu.tool.buzzsaw", "%s Buzzsaw (LV)"); - provider.add("item.gtceu.tool.buzzsaw.tooltip", "§8Not suitable for harvesting Blocks"); - replace(provider, "item.gtceu.tool.lv_screwdriver", "%s Screwdriver (LV)"); - provider.add("item.gtceu.tool.lv_screwdriver.tooltip", "§8Adjusts Covers and Machines"); - replace(provider, "item.gtceu.tool.plunger", "%s Plunger"); - provider.add("item.gtceu.tool.plunger.tooltip", "§8Removes Fluids from Machines"); - replace(provider, "item.gtceu.tool.shears", "%s Shears"); - provider.add("item.gtceu.tool.tooltip.crafting_uses", "%s §aCrafting Uses"); - provider.add("item.gtceu.tool.tooltip.max_uses", "%s §eTotal Durability"); - provider.add("item.gtceu.tool.tooltip.general_uses", "%s §bDurability"); - provider.add("item.gtceu.tool.tooltip.attack_damage", "%s §cAttack Damage"); - provider.add("item.gtceu.tool.tooltip.attack_speed", "%s §9Attack Speed"); - provider.add("item.gtceu.tool.tooltip.mining_speed", "%s §dMining Speed"); - provider.add("item.gtceu.tool.tooltip.harvest_level", "§eHarvest Level %s"); - provider.add("item.gtceu.tool.tooltip.harvest_level_extra", "§eHarvest Level %s §f(%s§f)"); - multiLang(provider, "item.gtceu.tool.harvest_level", "§8Wood", "§7Stone", "§aIron", "§bDiamond", - "§dNetherite", - "§9Duranium", "§cNeutronium"); - provider.add("item.gtceu.tool.tooltip.repair_info", "§8Hold SHIFT to show Repair Info"); - provider.add("item.gtceu.tool.tooltip.repair_material", "§8Repair with: §f§a%s"); + + provider.add("item.gtceu.tool.aoe.rows", "Rows"); provider.add("item.gtceu.tool.aoe.columns", "Columns"); provider.add("item.gtceu.tool.aoe.layers", "Layers"); + provider.add("item.gtceu.turbine_rotor.tooltip", "Turbine Rotors for your power station"); - provider.add("metaitem.clipboard.tooltip", + provider.add("item.clipboard.tooltip", "Can be written on (without any writing Instrument). Right-click on Wall to place, and Shift-Right-Click to remove"); - provider.add("metaitem.behavior.mode_switch.tooltip", "Use while sneaking to switch mode"); - provider.add("metaitem.behavior.mode_switch.mode_switched", "§eMode Set to: %s"); - provider.add("metaitem.behavior.mode_switch.current_mode", "Mode: %s"); - provider.add("metaitem.tool.tooltip.primary_material", "§fMaterial: §e%s"); - provider.add("metaitem.tool.tooltip.durability", "§fDurability: §a%d / %d"); - provider.add("metaitem.tool.tooltip.rotor.efficiency", "Turbine Efficiency: §9%d%%"); - provider.add("metaitem.tool.tooltip.rotor.power", "Turbine Power: §9%d%%"); - provider.add("item.gtceu.ulv_voltage_coil.tooltip", "Primitive Coil"); - provider.add("item.gtceu.lv_voltage_coil.tooltip", "Basic Coil"); - provider.add("item.gtceu.mv_voltage_coil.tooltip", "Good Coil"); - provider.add("item.gtceu.hv_voltage_coil.tooltip", "Advanced Coil"); - provider.add("item.gtceu.ev_voltage_coil.tooltip", "Extreme Coil"); - provider.add("item.gtceu.iv_voltage_coil.tooltip", "Elite Coil"); - provider.add("item.gtceu.luv_voltage_coil.tooltip", "Master Coil"); - provider.add("item.gtceu.zpm_voltage_coil.tooltip", "Super Coil"); - provider.add("item.gtceu.uv_voltage_coil.tooltip", "Ultimate Coil"); - provider.add("item.gtceu.uhv_voltage_coil.tooltip", "Ultra Coil"); - provider.add("item.gtceu.uev_voltage_coil.tooltip", "Unreal Coil"); - provider.add("item.gtceu.uiv_voltage_coil.tooltip", "Insane Coil"); - provider.add("item.gtceu.uxv_voltage_coil.tooltip", "Epic Coil"); - provider.add("item.gtceu.opv_voltage_coil.tooltip", "Legendary Coil"); - provider.add("item.gtceu.max_voltage_coil.tooltip", "Maximum Coil"); - provider.add("metaitem.liquid_fuel_jetpack.tooltip", "Uses Combustion Generator Fuels for Thrust"); - provider.add("metaarmor.nms.nightvision.enabled", "NanoMuscle™ Suite: NightVision Enabled"); - provider.add("metaarmor.nms.nightvision.disabled", "NanoMuscle™ Suite: NightVision Disabled"); - provider.add("metaarmor.nms.boosted_jump.enabled", "NanoMuscle™ Suite: Jump Boost Enabled"); - provider.add("metaarmor.nms.boosted_jump.disabled", "NanoMuscle™ Suite: Jump Boost Disabled"); - provider.add("metaarmor.nms.nightvision.error", "NanoMuscle™ Suite: §cNot enough power!"); - provider.add("metaarmor.qts.nightvision.enabled", "QuarkTech™ Suite: NightVision Enabled"); - provider.add("metaarmor.qts.nightvision.disabled", "QuarkTech™ Suite: NightVision Disabled"); - provider.add("metaarmor.qts.nightvision.error", "QuarkTech™ Suite: §cNot enough power!"); - provider.add("metaarmor.jetpack.flight.enable", "Jetpack: Flight Enabled"); - provider.add("metaarmor.jetpack.flight.disable", "Jetpack: Flight Disabled"); - provider.add("metaarmor.jetpack.hover.enable", "Jetpack: Hover Mode Enabled"); - provider.add("metaarmor.jetpack.hover.disable", "Jetpack: Hover Mode Disabled"); - provider.add("metaarmor.jetpack.emergency_hover_mode", "Emergency Hover Mode Enabled!"); - provider.add("metaarmor.nms.share.enable", "NanoMuscle™ Suite: Charging Enabled"); - provider.add("metaarmor.nms.share.disable", "NanoMuscle™ Suite: Charging Disabled"); - provider.add("metaarmor.nms.share.error", "NanoMuscle™ Suite: §cNot enough power for charging!"); - provider.add("metaarmor.qts.share.enable", "QuarkTech™ Suite: Charging Enabled"); - provider.add("metaarmor.qts.share.disable", "QuarkTech™ Suite: Charging Disabled"); - provider.add("metaarmor.qts.share.error", "QuarkTech™ Suite: §cNot enough power for charging!"); - provider.add("metaarmor.message.nightvision.enabled", "§bNightVision: §aOn"); - provider.add("metaarmor.message.nightvision.disabled", "§bNightVision: §cOff"); - provider.add("metaarmor.message.nightvision.error", "§cNot enough power!"); - provider.add("metaarmor.tooltip.stepassist", "Provides Step-Assist"); - provider.add("metaarmor.tooltip.speed", "Increases Running Speed"); - provider.add("metaarmor.tooltip.jump", "Increases Jump Height and Distance"); - provider.add("metaarmor.tooltip.falldamage", "Nullifies Fall Damage"); - provider.add("metaarmor.tooltip.potions", "Nullifies Harmful Effects"); - provider.add("metaarmor.tooltip.burning", "Nullifies Burning"); - provider.add("metaarmor.tooltip.freezing", "Prevents Freezing"); - provider.add("metaarmor.tooltip.breath", "Replenishes Underwater Breath Bar"); - provider.add("metaarmor.tooltip.autoeat", "Replenishes Food Bar by Using Food from Inventory"); - provider.add("metaarmor.hud.status.enabled", "§aON"); - provider.add("metaarmor.hud.status.disabled", "§cOFF"); - provider.add("metaarmor.hud.energy_lvl", "Energy Level: %s"); - provider.add("metaarmor.hud.engine_enabled", "Engine Enabled: %s"); - provider.add("metaarmor.hud.fuel_lvl", "Fuel Level: %s"); - provider.add("metaarmor.hud.hover_mode", "Hover Mode: %s"); - provider.add("mataarmor.hud.supply_mode", "Supply Mode: %s"); - provider.add("metaarmor.hud.gravi_engine", "GraviEngine: %s"); - provider.add("metaarmor.energy_share.error", "Energy Supply: §cNot enough power for gadgets charging!"); - provider.add("metaarmor.energy_share.enable", "Energy Supply: Gadgets charging enabled"); - provider.add("metaarmor.energy_share.disable", "Energy Supply: Gadgets charging disabled"); - provider.add("metaarmor.energy_share.tooltip", "Supply mode: %s"); - provider.add("metaarmor.energy_share.tooltip.guide", - "To change mode shift-right click when holding item"); - provider.add("metaitem.record.sus.tooltip", "§7Leonz - Among Us Drip"); + + provider.add("item.tool.tooltip.primary_material", "§fMaterial: §e%s"); + provider.add("item.tool.tooltip.durability", "§fDurability: §a%d / %d"); + provider.add("item.tool.tooltip.rotor.efficiency", "Turbine Efficiency: §9%d%%"); + provider.add("item.tool.tooltip.rotor.power", "Turbine Power: §9%d%%"); + + + provider.add("item.record.sus.tooltip", "§7Leonz - Among Us Drip"); provider.add("item.gtceu.nan_certificate.tooltip", "Challenge Accepted!"); provider.add("item.gtceu.blacklight.tooltip", "Long-Wave §dUltraviolet§7 light source"); provider.add("gui.widget.incrementButton.default_tooltip", @@ -333,314 +101,21 @@ public static void init(RegistrateLangProvider provider) { provider.add("gui.widget.recipeProgressWidget.default_tooltip", "Show Recipes"); multilineLang(provider, "gtceu.recipe_memory_widget.tooltip", "§7Left click to automatically input this recipe into the crafting grid\n§7Shift click to lock/unlock this recipe"); - provider.add("cover.filter.blacklist.disabled", "Whitelist"); - provider.add("cover.filter.blacklist.enabled", "Blacklist"); - provider.add("cover.tag_filter.title", "Tag Filter"); - multilineLang(provider, "cover.tag_filter.info", - """ - §bAccepts complex expressions - §6a & b§r = AND - §6a | b§r = OR - §6a ^ b§r = XOR - §6!a§r = NOT - §6(a)§r for grouping - §6*§r for wildcard - §6$§r for untagged - §bTags come in the form 'namespace:tag/subtype'. - The 'forge:' namespace is assumed if one isn't provided. - §bExample: §6*dusts/gold | (gtceu:circuits & !*lv) - This matches all gold dusts or all circuits except LV ones"""); - provider.add("cover.tag_filter.test_slot.info", - "Insert a item to test if it matches the filter expression"); - provider.add("cover.tag_filter.matches", "Item matches"); - provider.add("cover.tag_filter.matches_not", "Item does not match"); - provider.add("cover.fluid_filter.title", "Fluid Filter"); - multilineLang(provider, "cover.fluid_filter.config_amount", - "Scroll wheel up increases amount, down decreases.\nShift[§6x10§r],Ctrl[§ex100§r],Shift+Ctrl[§ax1000§r]\nRight click increases amount, left click decreases.\nHold shift to double/halve.\nMiddle click to clear"); - provider.add("cover.fluid_filter.mode.filter_fill", "Filter Fill"); - provider.add("cover.fluid_filter.mode.filter_drain", "Filter Drain"); - provider.add("cover.fluid_filter.mode.filter_both", "Filter Fill & Drain"); - provider.add("cover.item_filter.title", "Item Filter"); - provider.add("cover.storage.title", "Storage Cover"); - provider.add("cover.filter.mode.filter_insert", "Filter Insert"); - provider.add("cover.filter.mode.filter_extract", "Filter Extract"); - provider.add("cover.filter.mode.filter_both", "Filter Insert/Extract"); - provider.add("cover.item_filter.ignore_damage.enabled", "Ignore Damage"); - provider.add("cover.item_filter.ignore_damage.disabled", "Respect Damage"); - provider.add("cover.item_filter.ignore_nbt.enabled", "Ignore NBT"); - provider.add("cover.item_filter.ignore_nbt.disabled", "Respect NBT"); - provider.add("cover.voiding.voiding_mode.void_any", "Void Matching"); - provider.add("cover.voiding.voiding_mode.void_overflow", "Void Overflow"); - multilineLang(provider, "cover.voiding.voiding_mode.description", - "§eVoid Matching§r will void anything matching the filter. \n§eVoid Overflow§r will void anything matching the filter, up to the specified amount."); - provider.add("cover.fluid.voiding.title", "Fluid Voiding Settings"); - provider.add("cover.fluid.voiding.advanced.title", "Advanced Fluid Voiding Settings"); - provider.add("cover.item.voiding.title", "Item Voiding Settings"); - provider.add("cover.item.voiding.advanced.title", "Advanced Item Voiding Settings"); - provider.add("cover.voiding.label.disabled", "Disabled"); - provider.add("cover.voiding.label.enabled", "Enabled"); - provider.add("cover.voiding.tooltip", - "§cWARNING!§7 Setting this to \"Enabled\" means that fluids or items WILL be voided."); - provider.add("cover.voiding.message.disabled", "Voiding Cover Disabled"); - provider.add("cover.voiding.message.enabled", "Voiding Cover Enabled"); - provider.add("cover.item_smart_filter.title", "Smart Item Filter"); - provider.add("cover.item_smart_filter.filtering_mode.electrolyzer", "Electrolyzer"); - provider.add("cover.item_smart_filter.filtering_mode.centrifuge", "Centrifuge"); - provider.add("cover.item_smart_filter.filtering_mode.sifter", "Sifter"); - multilineLang(provider, "cover.item_smart_filter.filtering_mode.description", - "Select Machine this Smart Filter will use for filtering.\nIt will automatically pick right portions of items for robotic arm."); - provider.add("cover.conveyor.title", "Conveyor Cover Settings (%s)"); - provider.add("cover.conveyor.transfer_rate", "§7items/sec"); - provider.add("cover.conveyor.mode", "Mode: %s"); - provider.add("cover.conveyor.mode.export", "Mode: Export"); - provider.add("cover.conveyor.mode.import", "Mode: Import"); - multilineLang(provider, "cover.conveyor.distribution.round_robin_global", - "Distribution Mode: §bRound Robin\n§7Splits items equally across connected inventories"); - multilineLang(provider, "cover.conveyor.distribution.round_robin_prio", - "Distribution Mode: §bRound Robin with Priority\n§7Tries to split items across connected inventories and considers higher priorities first.\n§7Restrictive item pipes lower the priority of a path."); - multilineLang(provider, "cover.conveyor.distribution.insert_first", - "Distribution Mode: §bPriority\n§7Will insert into the first inventory with the highest priority it can find.\n§7Restrictive item pipes lower the priority of a path."); - multilineLang(provider, "cover.conveyor.blocks_input.enabled", - "If enabled, items will not be inserted when cover is set to pull items from the inventory into pipe.\n§aEnabled"); - multilineLang(provider, "cover.conveyor.blocks_input.disabled", - "If enabled, items will not be inserted when cover is set to pull items from the inventory into pipe.\n§cDisabled"); - provider.add("cover.universal.manual_import_export.mode.disabled", - "Manual I/O: §bDisabled\n§7Items / Fluids will only move as specified by the cover and its filter."); - provider.add("cover.universal.manual_import_export.mode.filtered", - "Manual I/O: §bFiltered\n§7Items / Fluids can be extracted and inserted independently of the cover mode, as long as its filter matches (if any)"); - provider.add("cover.universal.manual_import_export.mode.unfiltered", - "Manual I/O: §bUnfiltered\n§7Items / Fluids can be moved independently of the cover mode. The filter only applies to what is inserted or extracted by this cover itself."); - multilineLang(provider, "cover.universal.manual_import_export.mode.description", - "§eDisabled§r - Items/fluids will only move as specified by the cover and its filter. \n§eAllow Filtered§r - Items/fluids can be extracted and inserted independently of the cover mode, as long as its filter matches (if any). \n§eAllow Unfiltered§r - Items/fluids can be moved independently of the cover mode. Filter applies to the items inserted or extracted by this cover"); - provider.add("cover.conveyor.item_filter.title", "Item Filter"); - multiLang(provider, "cover.conveyor.tag.title", "Tag Name", - "(use * for wildcard)"); - provider.add("cover.robotic_arm.title", "Robotic Arm Settings (%s)"); - provider.add("cover.robotic_arm.transfer_mode.transfer_any", "Transfer Any"); - provider.add("cover.robotic_arm.transfer_mode.transfer_exact", "Supply Exact"); - provider.add("cover.robotic_arm.transfer_mode.keep_exact", "Keep Exact"); - multilineLang(provider, "cover.robotic_arm.transfer_mode.description", - "§eTransfer Any§r - in this mode, cover will transfer as many items matching its filter as possible.\n§eSupply Exact§r - in this mode, cover will supply items in portions specified in item filter slots (or variable under this button for tag filter). If amount of items is less than portion size, items won't be moved.\n§eKeep Exact§r - in this mode, cover will keep specified amount of items in the destination inventory, supplying additional amount of items if required.\n§7Tip: left/right click on filter slots to change item amount, use shift clicking to change amount faster."); - provider.add("cover.pump.title", "Pump Cover Settings (%s)"); - provider.add("cover.pump.transfer_rate", "%s"); - provider.add("cover.pump.mode.export", "Mode: Export"); - provider.add("cover.pump.mode.import", "Mode: Import"); - provider.add("cover.pump.fluid_filter.title", "Fluid Filter"); - provider.add("cover.bucket.mode.bucket", "B"); - provider.add("cover.bucket.mode.milli_bucket", "mB"); - provider.add("cover.fluid_regulator.title", "Fluid Regulator Settings (%s)"); - multilineLang(provider, "cover.fluid_regulator.transfer_mode.description", - "§eTransfer Any§r - in this mode, cover will transfer as many fluids matching its filter as possible.\n§eSupply Exact§r - in this mode, cover will supply fluids in portions specified in the window underneath this button. If amount of fluids is less than portion size, fluids won't be moved.\n§eKeep Exact§r - in this mode, cover will keep specified amount of fluids in the destination inventory, supplying additional amount of fluids if required.\n§7Tip: shift click will multiply increase/decrease amounts by 10 and ctrl click will multiply by 100."); - provider.add("cover.fluid_regulator.supply_exact", "Supply Exact: %s"); - provider.add("cover.fluid_regulator.keep_exact", "Keep Exact: %s"); - provider.add("cover.machine_controller.title", "Machine Controller Settings"); - provider.add("cover.machine_controller.normal", "Normal"); - provider.add("cover.machine_controller.inverted", "Inverted"); - multilineLang(provider, "cover.machine_controller.invert.enabled", - "§eInverted§r - in this mode, the cover will require a signal stronger than the set redstone level to run"); - multilineLang(provider, "cover.machine_controller.invert.disabled", - "§eNormal§r - in this mode, the cover will require a signal weaker than the set redstone level to run"); - provider.add("cover.machine_controller.redstone", "Min Redstone Strength: %d"); - provider.add("cover.machine_controller.mode.machine", "Control Machine"); - provider.add("cover.machine_controller.mode.cover_up", "Control Cover (Top)"); - provider.add("cover.machine_controller.mode.cover_down", "Control Cover (Bottom)"); - provider.add("cover.machine_controller.mode.cover_south", "Control Cover (South)"); - provider.add("cover.machine_controller.mode.cover_north", "Control Cover (North)"); - provider.add("cover.machine_controller.mode.cover_east", "Control Cover (East)"); - provider.add("cover.machine_controller.mode.cover_west", "Control Cover (West)"); - provider.add("cover.machine_controller.mode.null", "Control Nothing"); - provider.add("cover.ender_fluid_link.title", "Ender Fluid Link"); - provider.add("cover.ender_fluid_link.iomode.enabled", "I/O Enabled"); - provider.add("cover.ender_fluid_link.iomode.disabled", "I/O Disabled"); - provider.add("cover.ender_fluid_link.tooltip.channel_description", "Set channel description with input text"); - provider.add("cover.ender_fluid_link.tooltip.channel_name", "Set channel name with input text"); - provider.add("cover.ender_fluid_link.tooltip.list_button", "Show channel list"); - provider.add("cover.ender_fluid_link.tooltip.clear_button", "Clear channel description"); - multilineLang(provider, "cover.ender_fluid_link.private.tooltip.disabled", - "Switch to private tank mode\nPrivate mode uses the player who originally placed the cover"); - provider.add("cover.ender_fluid_link.private.tooltip.enabled", "Switch to public tank mode"); - multilineLang(provider, "cover.ender_fluid_link.incomplete_hex", - "Inputted color is incomplete!\nIt will be applied once complete (all 8 hex digits)\nClosing the gui will lose edits!"); - provider.add("cover.detector_base.message_normal_state", "Monitoring Status: Normal"); - provider.add("cover.detector_base.message_inverted_state", "Monitoring Status: Inverted"); - - var detectorLatchDescription = """ - Change the redstone behavior of this Cover. - §eContinuous§7 - Default; values less than the minimum output 0; values higher than the maximum output 15; values between min and max output between 0 and 15 - §eLatched§7 - output 15 until above max, then output 0 until below min"""; - multilineLang(provider, "cover.advanced_detector.latch.enabled", - "Behavior: Latched\n\n" + detectorLatchDescription); - multilineLang(provider, "cover.advanced_detector.latch.disabled", - "Behavior: Continuous\n\n" + detectorLatchDescription); - - provider.add("cover.advanced_energy_detector.label", "Advanced Energy Detector"); - provider.add("cover.advanced_energy_detector.min", "Min"); - provider.add("cover.advanced_energy_detector.max", "Max"); - - var advancedEnergyDetectorInvertDescription = "Toggle to invert the redstone logic\nBy default, redstone is emitted when less than the minimum EU, and stops emitting when greater than the max EU"; - multilineLang(provider, "cover.advanced_energy_detector.invert.enabled", - "Output: Inverted\n\n" + advancedEnergyDetectorInvertDescription); - multilineLang(provider, "cover.advanced_energy_detector.invert.disabled", - "Output: Normal\n\n" + advancedEnergyDetectorInvertDescription); - var advancedEnergyDetectorModeDescription = "Change between using discrete EU values or percentages for comparing min/max against an attached energy storage."; - multilineLang(provider, "cover.advanced_energy_detector.use_percent.enabled", - "Mode: Percentage\n\n" + advancedEnergyDetectorModeDescription); - multilineLang(provider, "cover.advanced_energy_detector.use_percent.disabled", - "Mode: Discrete EU\n\n" + advancedEnergyDetectorModeDescription); - - provider.add("cover.advanced_fluid_detector.label", "Advanced Fluid Detector"); - var advancedFluidDetectorInvertDescription = "Toggle to invert the redstone logic\nBy default, redstone stops emitting when less than the minimum mB of fluid, and starts emitting when greater than the min mB of fluid up to the set maximum"; - multilineLang(provider, "cover.advanced_fluid_detector.invert.enabled", - "Output: Inverted\n\n" + advancedFluidDetectorInvertDescription); - multilineLang(provider, "cover.advanced_fluid_detector.invert.disabled", - "Output: Normal\n\n" + advancedFluidDetectorInvertDescription); - provider.add("cover.advanced_fluid_detector.max", "Max Fluid (mB)"); - provider.add("cover.advanced_fluid_detector.min", "Min Fluid (mB)"); - - provider.add("cover.advanced_item_detector.label", "Advanced Item Detector"); - var advancedItemDetectorInvertDescription = "Toggle to invert the redstone logic\nBy default, redstone stops emitting when less than the minimum amount of items, and starts emitting when greater than the min amount of items up to the set maximum"; - multilineLang(provider, "cover.advanced_item_detector.invert.enabled", - "Output: Inverted\n\n" + advancedItemDetectorInvertDescription); - multilineLang(provider, "cover.advanced_item_detector.invert.disabled", - "Output: Normal\n\n" + advancedItemDetectorInvertDescription); - provider.add("cover.advanced_item_detector.max", "Max Items"); - provider.add("cover.advanced_item_detector.min", "Min Items"); - provider.add("cover.shutter.message.enabled", "Closed shutter"); - provider.add("cover.shutter.message.disabled", "Opened shutter"); replace(provider, "item.gtceu.bucket", "%s Bucket"); - replace(provider, GTMaterials.FullersEarth.getUnlocalizedName(), "Fuller's Earth"); - replace(provider, GTMaterials.Cooperite.getUnlocalizedName(), "Sheldonite"); // greg's humor is now on - // 1.19... - replace(provider, GTMaterials.HSSG.getUnlocalizedName(), "HSS-G"); - replace(provider, GTMaterials.HSSE.getUnlocalizedName(), "HSS-E"); - replace(provider, GTMaterials.HSSS.getUnlocalizedName(), "HSS-S"); - replace(provider, GTMaterials.RTMAlloy.getUnlocalizedName(), "RTM Alloy"); - replace(provider, GTMaterials.HSLASteel.getUnlocalizedName(), "HSLA Steel"); - - replace(provider, GTMaterials.UUMatter.getUnlocalizedName(), "UU-Matter"); - replace(provider, GTMaterials.PCBCoolant.getUnlocalizedName(), "PCB Coolant"); - replace(provider, GTMaterials.TungstenSteel.getUnlocalizedName(), "Tungstensteel"); - replace(provider, GTMaterials.Iron3Chloride.getUnlocalizedName(), "Iron III Chloride"); - replace(provider, GTMaterials.Iron2Chloride.getUnlocalizedName(), "Iron II Chloride"); - replace(provider, GTMaterials.OilHeavy.getUnlocalizedName(), "Heavy Oil"); - replace(provider, "block.gtceu.oil_heavy", "Heavy Oil"); - replace(provider, GTMaterials.OilLight.getUnlocalizedName(), "Light Oil"); - replace(provider, "block.gtceu.oil_light", "Light Oil"); - replace(provider, GTMaterials.RawOil.getUnlocalizedName(), "Raw Oil"); - replace(provider, "block.gtceu.oil_medium", "Raw Oil"); - - replace(provider, GTMaterials.HydroCrackedButadiene.getUnlocalizedName(), "Hydro-Cracked Butadiene"); - replace(provider, GTMaterials.HydroCrackedButane.getUnlocalizedName(), "Hydro-Cracked Butane"); - replace(provider, GTMaterials.HydroCrackedButene.getUnlocalizedName(), "Hydro-Cracked Butene"); - replace(provider, GTMaterials.HydroCrackedButene.getUnlocalizedName(), "Hydro-Cracked Butene"); - replace(provider, GTMaterials.HydroCrackedEthane.getUnlocalizedName(), "Hydro-Cracked Ethane"); - replace(provider, GTMaterials.HydroCrackedEthylene.getUnlocalizedName(), "Hydro-Cracked Ethylene"); - replace(provider, GTMaterials.HydroCrackedPropane.getUnlocalizedName(), "Hydro-Cracked Propane"); - replace(provider, GTMaterials.HydroCrackedPropene.getUnlocalizedName(), "Hydro-Cracked Propene"); - replace(provider, GTMaterials.SteamCrackedButadiene.getUnlocalizedName(), "Steam-Cracked Butadiene"); - replace(provider, GTMaterials.SteamCrackedButane.getUnlocalizedName(), "Steam-Cracked Butane"); - replace(provider, GTMaterials.SteamCrackedButene.getUnlocalizedName(), "Steam-Cracked Butene"); - replace(provider, GTMaterials.SteamCrackedButene.getUnlocalizedName(), "Steam-Cracked Butene"); - replace(provider, GTMaterials.SteamCrackedEthane.getUnlocalizedName(), "Steam-Cracked Ethane"); - replace(provider, GTMaterials.SteamCrackedEthylene.getUnlocalizedName(), "Steam-Cracked Ethylene"); - replace(provider, GTMaterials.SteamCrackedPropane.getUnlocalizedName(), "Steam-Cracked Propane"); - replace(provider, GTMaterials.SteamCrackedPropene.getUnlocalizedName(), "Steam-Cracked Propene"); - replace(provider, GTMaterials.LightlyHydroCrackedGas.getUnlocalizedName(), "Lightly Hydro-Cracked Gas"); - replace(provider, GTMaterials.LightlyHydroCrackedHeavyFuel.getUnlocalizedName(), - "Lightly Hydro-Cracked Heavy Fuel"); - replace(provider, GTMaterials.LightlyHydroCrackedLightFuel.getUnlocalizedName(), - "Lightly Hydro-Cracked Light Fuel"); - replace(provider, GTMaterials.LightlyHydroCrackedNaphtha.getUnlocalizedName(), - "Lightly Hydro-Cracked Naphtha"); - replace(provider, GTMaterials.LightlySteamCrackedGas.getUnlocalizedName(), "Lightly Steam-Cracked Gas"); - replace(provider, GTMaterials.LightlySteamCrackedHeavyFuel.getUnlocalizedName(), - "Lightly Steam-Cracked Heavy Fuel"); - replace(provider, GTMaterials.LightlySteamCrackedLightFuel.getUnlocalizedName(), - "Lightly Steam-Cracked Light Fuel"); - replace(provider, GTMaterials.LightlySteamCrackedNaphtha.getUnlocalizedName(), - "Lightly Steam-Cracked Naphtha"); - replace(provider, GTMaterials.SeverelyHydroCrackedGas.getUnlocalizedName(), - "Severely Hydro-Cracked Gas"); - replace(provider, GTMaterials.SeverelyHydroCrackedHeavyFuel.getUnlocalizedName(), - "Severely Hydro-Cracked Heavy Fuel"); - replace(provider, GTMaterials.SeverelyHydroCrackedLightFuel.getUnlocalizedName(), - "Severely Hydro-Cracked Light Fuel"); - replace(provider, GTMaterials.SeverelyHydroCrackedNaphtha.getUnlocalizedName(), - "Severely Hydro-Cracked Naphtha"); - replace(provider, GTMaterials.SeverelySteamCrackedGas.getUnlocalizedName(), - "Severely Steam-Cracked Gas"); - replace(provider, GTMaterials.SeverelySteamCrackedHeavyFuel.getUnlocalizedName(), - "Severely Steam-Cracked Heavy Fuel"); - replace(provider, GTMaterials.SeverelySteamCrackedLightFuel.getUnlocalizedName(), - "Severely Steam-Cracked Light Fuel"); - replace(provider, GTMaterials.SeverelySteamCrackedNaphtha.getUnlocalizedName(), - "Severely Steam-Cracked Naphtha"); - replace(provider, GTMaterials.LPG.getUnlocalizedName(), "LPG"); - - replace(provider, GTMaterials.Zeron100.getUnlocalizedName(), "Zeron-100"); - replace(provider, GTMaterials.IncoloyMA956.getUnlocalizedName(), "Incoloy MA-956"); - replace(provider, GTMaterials.Stellite100.getUnlocalizedName(), "Stellite-100"); - replace(provider, GTMaterials.HastelloyC276.getUnlocalizedName(), "Hastelloy C-276"); - - replace(provider, GTBlocks.BATTERY_EMPTY_TIER_I.get().getDescriptionId(), "Empty Tier I Capacitor"); - replace(provider, GTBlocks.BATTERY_LAPOTRONIC_EV.get().getDescriptionId(), "EV Lapotronic Capacitor"); - replace(provider, GTBlocks.BATTERY_LAPOTRONIC_IV.get().getDescriptionId(), "IV Lapotronic Capacitor"); - replace(provider, GTBlocks.BATTERY_EMPTY_TIER_II.get().getDescriptionId(), "Empty Tier II Capacitor"); - replace(provider, GTBlocks.BATTERY_LAPOTRONIC_LuV.get().getDescriptionId(), "LuV Lapotronic Capacitor"); - replace(provider, GTBlocks.BATTERY_LAPOTRONIC_ZPM.get().getDescriptionId(), "ZPM Lapotronic Capacitor"); - replace(provider, GTBlocks.BATTERY_EMPTY_TIER_III.get().getDescriptionId(), "Empty Tier III Capacitor"); - replace(provider, GTBlocks.BATTERY_LAPOTRONIC_UV.get().getDescriptionId(), "UV Lapotronic Capacitor"); - replace(provider, GTBlocks.BATTERY_ULTIMATE_UHV.get().getDescriptionId(), "UHV Ultimate Capacitor"); + + provider.add("item.netherrack_nether_quartz", "Nether Quartz Ore"); provider.add("block.surface_rock", "%s Surface Rock"); - provider.add("behaviour.hoe", "Can till dirt"); - provider.add("behaviour.soft_hammer", "Activates and Deactivates Machines"); - provider.add("behaviour.soft_hammer.enabled", "Working Enabled"); - provider.add("behaviour.soft_hammer.disabled", "Working Disabled"); - provider.add("behaviour.soft_hammer.idle_after_cycle", "Pause machine after current cycle"); - provider.add("behaviour.lighter.tooltip.description", "Can light things on fire"); - provider.add("behaviour.lighter.tooltip.usage", "Shift-right click to open/close"); - provider.add("behaviour.lighter.fluid.tooltip", "Can light things on fire with Butane or Propane"); - provider.add("behaviour.lighter.uses", "Remaining uses: %d"); - provider.add("behavior.toggle_energy_consumer.tooltip", "Use to toggle mode"); - provider.add("behaviour.hammer", "Turns on and off Muffling for Machines (by hitting them)"); - provider.add("behaviour.wrench", "Rotates Blocks on Rightclick"); - provider.add("behaviour.boor.by", "by %s"); - provider.add("behaviour.paintspray.solvent.tooltip", "Can remove color from things"); - provider.add("behaviour.paintspray.white.tooltip", "Can paint things in White"); - provider.add("behaviour.paintspray.orange.tooltip", "Can paint things in Orange"); - provider.add("behaviour.paintspray.magenta.tooltip", "Can paint things in Magenta"); - provider.add("behaviour.paintspray.light_blue.tooltip", "Can paint things in Light Blue"); - provider.add("behaviour.paintspray.yellow.tooltip", "Can paint things in Yellow"); - provider.add("behaviour.paintspray.lime.tooltip", "Can paint things in Lime"); - provider.add("behaviour.paintspray.pink.tooltip", "Can paint things in Pink"); - provider.add("behaviour.paintspray.gray.tooltip", "Can paint things in Gray"); - provider.add("behaviour.paintspray.light_gray.tooltip", "Can paint things in Light Gray"); - provider.add("behaviour.paintspray.cyan.tooltip", "Can paint things in Cyan"); - provider.add("behaviour.paintspray.purple.tooltip", "Can paint things in Purple"); - provider.add("behaviour.paintspray.blue.tooltip", "Can paint things in Blue"); - provider.add("behaviour.paintspray.brown.tooltip", "Can paint things in Brown"); - provider.add("behaviour.paintspray.green.tooltip", "Can paint things in Green"); - provider.add("behaviour.paintspray.red.tooltip", "Can paint things in Red"); - provider.add("behaviour.paintspray.black.tooltip", "Can paint things in Black"); - provider.add("behaviour.paintspray.uses", "Remaining Uses: %d"); - provider.add("behaviour.prospecting", "Usable for Prospecting"); - provider.add("behaviour.meta.machine.config.copy.tooltip", "§7Sneak + R-Click to copy machine configuration"); - provider.add("behaviour.meta.machine.config.paste.tooltip", "§7R-Click to paste machine configuration"); - provider.add("behaviour.setting.allow.input.from.output.tooltip", "%s input from output side is %s"); - provider.add("behaviour.setting.output.direction.tooltip", "%s output direction: %s"); - provider.add("behaviour.setting.item_auto_output.tooltip", "%s auto-output is %s"); - provider.add("behaviour.setting.muffled.tooltip", "Muffling %s"); - provider.add("item.toggle.advanced.info.tooltip", "§8"); provider.add("enchantment.damage.disjunction", "Disjunction"); provider.add("enchantment.gtceu.disjunction.description", "Applies Weakness and Slowness to Ender-related mobs."); provider.add("enchantment.hard_hammer", "Hammering"); provider.add("enchantment.gtceu.hard_hammer.description", "Breaks blocks as if they were mined with a GregTech Hammer."); + provider.add("tile.gtceu.seal.name", "Sealed Block"); provider.add("tile.gtceu.foam.name", "Foam"); provider.add("tile.gtceu.reinforced_foam.name", "Reinforced Foam"); @@ -649,86 +124,22 @@ public static void init(RegistrateLangProvider provider) { provider.add("tile.gtceu.brittle_charcoal.name", "Brittle Charcoal"); multilineLang(provider, "tile.gtceu.brittle_charcoal.tooltip", "Produced by the Charcoal Pile Igniter.\nMine this to get Charcoal."); - provider.add("metaitem.prospector.mode.ores", "§aOre Prospection Mode§r"); - provider.add("metaitem.prospector.mode.fluid", "§bFluid Prospection Mode§r"); - provider.add("metaitem.prospector.mode.bedrock_ore", "§bBedrock Ore Prospection Mode§r"); - provider.add("metaitem.prospector.tooltip.radius", "Scans range in a %s Chunk Radius"); - provider.add("metaitem.prospector.tooltip.modes", "Available Modes:"); - provider.add("behavior.prospector.not_enough_energy", "Not Enough Energy!"); - provider.add("behavior.prospector.added_waypoint", "Created waypoint named %s!"); - provider.add("metaitem.tricorder_scanner.tooltip", "Tricorder"); - provider.add("metaitem.debug_scanner.tooltip", "Tricorder"); - provider.add("behavior.portable_scanner.bedrock_fluid.amount", "Fluid In Deposit: %s %s - %s%%"); - provider.add("behavior.portable_scanner.bedrock_fluid.amount_unknown", "Fluid In Deposit: %s%%"); - provider.add("behavior.portable_scanner.bedrock_fluid.nothing", "Fluid In Deposit: §6Nothing§r"); - provider.add("behavior.portable_scanner.environmental_hazard", "Environmental Hazard In Chunk: %s§r - %s ppm"); - provider.add("behavior.portable_scanner.environmental_hazard.nothing", - "Environmental Hazard In Chunk: §6Nothing§r"); - provider.add("behavior.portable_scanner.local_hazard", "Local Hazard In Area: %s§r - %s ppm"); - provider.add("behavior.portable_scanner.local_hazard.nothing", "Local Hazard In Area: §6Nothing§r"); - provider.add("behavior.portable_scanner.block_hardness", "Hardness: %s Blast Resistance: %s"); - provider.add("behavior.portable_scanner.block_name", "Name: %s MetaData: %s"); - provider.add("behavior.portable_scanner.debug_cpu_load", - "Average CPU load of ~%sns over %s ticks with worst time of %sns."); - provider.add("behavior.portable_scanner.debug_cpu_load_seconds", "This is %s seconds."); - provider.add("behavior.portable_scanner.debug_lag_count", - "Caused %s Lag Spike Warnings (anything taking longer than %sms) on the Server."); - provider.add("behavior.portable_scanner.debug_machine", "Meta-ID: %s"); - provider.add("behavior.portable_scanner.debug_machine_invalid", " invalid!"); - provider.add("behavior.portable_scanner.debug_machine_invalid_null=invalid! MetaTileEntity =", - " null!"); - provider.add("behavior.portable_scanner.debug_machine_valid", " valid"); - provider.add("behavior.portable_scanner.divider", "========================="); - provider.add("behavior.portable_scanner.energy_container_in", "Max IN: %s (%s) EU at %s A"); - provider.add("behavior.portable_scanner.energy_container_out", "Max OUT: %s (%s) EU at %s A"); - provider.add("behavior.portable_scanner.energy_container_storage", "Energy: %s EU / %s EU"); - provider.add("behavior.portable_scanner.eu_per_sec", "Average (last second): %s EU/t"); - provider.add("behavior.portable_scanner.amp_per_sec", "Average (last second): %s A"); - provider.add("behavior.portable_scanner.machine_disabled", "Disabled."); - provider.add("behavior.portable_scanner.machine_front_facing", "Front Facing: %s"); - provider.add("behavior.portable_scanner.machine_ownership", "§2Machine Owner Type: %s§r"); - provider.add("behavior.portable_scanner.guild_name", "§2Guild Name: %s§r"); - provider.add("behavior.portable_scanner.team_name", "§2Team Name: %s§r"); - provider.add("behavior.portable_scanner.player_name", "§2Player Name: %s§r, §7Player Online: %s§r"); - provider.add("behavior.portable_scanner.machine_power_loss", "Shut down due to power loss."); - provider.add("behavior.portable_scanner.machine_progress", "Progress/Load: %s / %s"); - provider.add("behavior.portable_scanner.machine_upwards_facing", "Upwards Facing: %s"); - provider.add("behavior.portable_scanner.muffled", "Muffled."); - provider.add("behavior.portable_scanner.multiblock_energy_input", - "Max Energy Income: %s EU/t Tier: %s"); - provider.add("behavior.portable_scanner.multiblock_energy_output", - "Max Energy Output: %s EU/t Tier: %s"); - provider.add("behavior.portable_scanner.multiblock_maintenance", "Problems: %s"); - provider.add("behavior.portable_scanner.multiblock_parallel", "Multi Processing: %s"); - provider.add("behavior.portable_scanner.position", "----- X: %s Y: %s Z: %s D: %s -----"); - provider.add("behavior.portable_scanner.state", "%s: %s"); - provider.add("behavior.portable_scanner.tank", "Tank %s: %s mB / %s mB %s"); - provider.add("behavior.portable_scanner.tanks_empty", "All Tanks Empty"); - provider.add("behavior.portable_scanner.workable_consumption", "Probably Uses: %s EU/t at %s A"); - provider.add("behavior.portable_scanner.workable_production", "Probably Produces: %s EU/t at %s A"); - provider.add("behavior.portable_scanner.workable_progress", "Progress: %s s / %s s"); - provider.add("behavior.portable_scanner.workable_stored_energy", "Stored Energy: %s EU / %s EU"); - provider.add("behavior.portable_scanner.mode.caption", "Display mode: %s"); - provider.add("behavior.portable_scanner.mode.show_all_info", "Show all info"); - provider.add("behavior.portable_scanner.mode.show_block_info", "Show block info"); - provider.add("behavior.portable_scanner.mode.show_machine_info", "Show machine info"); - provider.add("behavior.portable_scanner.mode.show_electrical_info", "Show electrical info"); - provider.add("behavior.portable_scanner.mode.show_recipe_info", "Show recipe info"); - provider.add("behavior.portable_scanner.mode.show_environmental_info", "Show environmental info"); + provider.add("behavior.item_magnet.enabled", "§aMagnetic Field Enabled"); provider.add("behavior.item_magnet.disabled", "§cMagnetic Field Disabled"); provider.add("behavior.data_item.assemblyline.title", "§nAssembly Line Construction Data:"); provider.add("behavior.data_item.assemblyline.data", "- §a%s"); - provider.add("metaitem.terminal.tooltip", "Sharp tools make good work"); - provider.add("metaitem.terminal.tooltip.creative", "§bCreative Mode"); - provider.add("metaitem.terminal.tooltip.hardware", "§aHardware: %d"); - provider.add("metaitem.plugin.tooltips.1", + provider.add("item.terminal.tooltip", "Sharp tools make good work"); + provider.add("item.terminal.tooltip.creative", "§bCreative Mode"); + provider.add("item.terminal.tooltip.hardware", "§aHardware: %d"); + provider.add("item.plugin.tooltips.1", "Plugins can be added to the screen for more functionality."); - provider.add("metaitem.plugin.proxy.tooltips.1", "(Please adjust to proxy mode in the screen)"); - provider.add("metaitem.cover.digital.tooltip", + provider.add("item.plugin.proxy.tooltips.1", "(Please adjust to proxy mode in the screen)"); + provider.add("item.cover.digital.tooltip", "Connects machines over §fPower Cables§7 to the §fCentral Monitor§7 as §fCover§7."); + provider.add("gtceu.machine.drum.enable_output", "Will drain Fluid to downward adjacent Tanks"); provider.add("gtceu.machine.drum.disable_output", "Will not drain Fluid"); provider.add("gtceu.machine.locked_safe.malfunctioning", "§cMalfunctioning!"); @@ -758,17 +169,18 @@ public static void init(RegistrateLangProvider provider) { provider.add("gtceu.machine.tank_valve.tooltip", "Use to fill and drain multiblock tanks. Auto outputs when facing down."); - provider.add("metaitem.cover.digital.mode.proxy.disabled", "Click to enable Proxy Mode"); - provider.add("metaitem.cover.digital.mode.proxy.enabled", "Proxy Mode enabled"); - provider.add("metaitem.cover.digital.mode.machine.disabled", "Click to enable Machine Mode"); - provider.add("metaitem.cover.digital.mode.machine.enabled", "Machine Mode enabled"); - provider.add("metaitem.cover.digital.mode.energy.disabled", "Click to enable Energy Mode"); - provider.add("metaitem.cover.digital.mode.energy.enabled", "Energy Mode enabled"); - provider.add("metaitem.cover.digital.mode.item.disabled", "Click to enable Item Mode"); - provider.add("metaitem.cover.digital.mode.item.enabled", "Item Mode enabled"); - provider.add("metaitem.cover.digital.mode.fluid.disabled", "Click to enable Fluid Mode"); - provider.add("metaitem.cover.digital.mode.fluid.enabled", "Fluid Mode enabled"); - + provider.add("item.cover.digital.mode.proxy.disabled", "Click to enable Proxy Mode"); + provider.add("item.cover.digital.mode.proxy.enabled", "Proxy Mode enabled"); + provider.add("item.cover.digital.mode.machine.disabled", "Click to enable Machine Mode"); + provider.add("item.cover.digital.mode.machine.enabled", "Machine Mode enabled"); + provider.add("item.cover.digital.mode.energy.disabled", "Click to enable Energy Mode"); + provider.add("item.cover.digital.mode.energy.enabled", "Energy Mode enabled"); + provider.add("item.cover.digital.mode.item.disabled", "Click to enable Item Mode"); + provider.add("item.cover.digital.mode.item.enabled", "Item Mode enabled"); + provider.add("item.cover.digital.mode.fluid.disabled", "Click to enable Fluid Mode"); + provider.add("item.cover.digital.mode.fluid.enabled", "Fluid Mode enabled"); + + //todo: own method (gui/tooltip/???) provider.add("gtceu.part_sharing.disabled", "Multiblock Sharing §4Disabled"); provider.add("gtceu.part_sharing.enabled", "Multiblock Sharing §aEnabled"); provider.add("gtceu.universal.liters", "%s mB"); @@ -818,67 +230,7 @@ public static void init(RegistrateLangProvider provider) { provider.add("gtceu.universal.tooltip.requires_redstone", "§4Requires Redstone power"); provider.add("gtceu.universal.tooltip.deprecated", "§4§lWARNING:§r§4 DEPRECATED. WILL BE REMOVED IN A FUTURE VERSION.§r"); - provider.add("gtceu.recipe.total", "Total: %s EU"); - provider.add("gtceu.recipe.max_eu", "Max. EU: %s EU"); - provider.add("gtceu.recipe.eu", "Usage: %s EU/t"); - provider.add("gtceu.recipe.eu_inverted", "Generation: %s EU/t"); - provider.add("gtceu.recipe.duration", "Duration: %s secs"); - provider.add("gtceu.recipe.amperage", "Amperage: %s"); - provider.add("gtceu.recipe.not_consumed", "Does not get consumed in the process"); - provider.add("gtceu.recipe.chance", "Chance: %s +%s/tier"); - provider.add("gtceu.recipe.temperature", "Temp: %sK"); - provider.add("gtceu.recipe.coil.tier", "Coil: %s"); - provider.add("gtceu.recipe.explosive", "Explosive: %s"); - provider.add("gtceu.recipe.eu_to_start", "EU To Start: %sEU%s"); - provider.add("gtceu.recipe.dimensions", "Dimensions: %s"); - provider.add("gtceu.recipe.cleanroom", "Requires %s"); - provider.add("gtceu.recipe.environmental_hazard.reverse", "§cArea must be free of %s"); - provider.add("gtceu.recipe.environmental_hazard", "§cArea must have %s"); - provider.add("gtceu.recipe.cleanroom.display_name", "Cleanroom"); - provider.add("gtceu.recipe.cleanroom_sterile.display_name", "Sterile Cleanroom"); - provider.add("gtceu.recipe.research", "Requires Research"); - provider.add("gtceu.recipe.scan_for_research", "Scan for Assembly Line"); - provider.add("gtceu.recipe.computation_per_tick", "Min. Computation: %s CWU/t"); - provider.add("gtceu.recipe.total_computation", "Computation: %s CWU"); - provider.add("gtceu.fluid.click_to_fill", - "§7Click with a Fluid Container to §bfill §7the tank (Shift-click for a full stack)."); - provider.add("gtceu.fluid.click_combined", - "§7Click with a Fluid Container to §cempty §7or §bfill §7the tank (Shift-click for a full stack)."); - provider.add("gtceu.fluid.click_to_empty", - "§7Click with a Fluid Container to §cempty §7the tank (Shift-click for a full stack)."); - provider.add("gtceu.tool_action.show_tooltips", "Hold SHIFT to show Tool Info"); - provider.add("gtceu.tool_action.screwdriver.auto_output_covers", - "§8Use Screwdriver to Allow Input from Output Side or access Covers"); - provider.add("gtceu.tool_action.screwdriver.toggle_mode_covers", - "§8Use Screwdriver to toggle Modes or access Covers"); - provider.add("gtceu.tool_action.screwdriver.access_covers", "§8Use Screwdriver to access Covers"); - provider.add("gtceu.tool_action.screwdriver.auto_collapse", - "§8Use Screwdriver to toggle Item collapsing"); - provider.add("gtceu.tool_action.screwdriver.auto_output", "§8Use Screwdriver to toggle Auto-Output"); - provider.add("gtceu.tool_action.screwdriver.toggle_mode", "§8Use Screwdriver to toggle Modes"); - provider.add("gtceu.tool_action.wrench.set_facing", "§8Use Wrench to set Facing"); - provider.add("gtceu.tool_action.wrench.connect", - "§8Use Wrench to set Connections, sneak to block Connections"); - provider.add("gtceu.tool_action.wire_cutter.connect", "§8Use Wire Cutters to set Connections"); - provider.add("gtceu.tool_action.soft_mallet.reset", "§8Use Soft Mallet to toggle Working"); - provider.add("gtceu.tool_action.soft_mallet.toggle_mode", "§8Use Soft Mallet to toggle Modes"); - provider.add("gtceu.tool_action.hammer", "§8Use Hard Hammer to muffle Sounds"); - provider.add("gtceu.tool_action.crowbar", "§8Use Crowbar to remove Covers"); - provider.add("gtceu.tool_action.tape", "§8Use Tape to fix Maintenance Problems"); - provider.add("gtceu.fluid.liquid_generic", "Liquid %s"); - provider.add("gtceu.fluid.generic", "%s"); - provider.add("gtceu.fluid.gas_generic", "%s Gas"); - provider.add("gtceu.fluid.gas_vapor", "%s Vapor"); - provider.add("gtceu.fluid.plasma", "%s Plasma"); - provider.add("gtceu.fluid.molten", "Molten %s"); - provider.add("gtceu.fluid.empty", "Empty"); - provider.add("gtceu.fluid.amount", "§9Amount: %d/%d mB"); - provider.add("gtceu.fluid.temperature", "§cTemperature: %d K"); - provider.add("gtceu.fluid.temperature.cryogenic", "§bCryogenic! Handle with care!"); - provider.add("gtceu.fluid.state_gas", "§aState: Gaseous"); - provider.add("gtceu.fluid.state_liquid", "§aState: Liquid"); - provider.add("gtceu.fluid.state_plasma", "§aState: Plasma"); - provider.add("gtceu.fluid.type_acid.tooltip", "§6Acidic! Handle with care!"); + provider.add("gtceu.gui.title_bar.back", "Back"); provider.add("gtceu.gui.title_bar.page_switcher", "Pages"); provider.add("gtceu.gui.fuel_amount", "Fuel Amount:"); @@ -964,125 +316,7 @@ public static void init(RegistrateLangProvider provider) { provider.add("gtceu.jei.materials.average_neutrons", "Average neutrons: %d"); provider.add("gtceu.item_filter.empty_item", "Empty (No Item)"); provider.add("gtceu.item_filter.footer", "§eClick with item to override"); - provider.add("gtceu.cable.voltage", "§aMax Voltage:§r §a%d §a(%s§a)"); - provider.add("gtceu.cable.amperage", "§eMax Amperage:§r §e%d"); - provider.add("gtceu.cable.loss_per_block", "§cLoss/Meter/Ampere:§r §c%d§7 EU-Volt"); - provider.add("gtceu.cable.superconductor", "%s §dSuperconductor"); - provider.add("gtceu.fluid_pipe.capacity", "§9Capacity: §f%d mB"); - provider.add("gtceu.fluid_pipe.max_temperature", "§cTemperature Limit: §f%d K"); - provider.add("gtceu.fluid_pipe.channels", "§eChannels: §f%d"); - provider.add("gtceu.fluid_pipe.gas_proof", "§6Can handle Gases"); - provider.add("gtceu.fluid_pipe.acid_proof", "§6Can handle Acids"); - provider.add("gtceu.fluid_pipe.cryo_proof", "§6Can handle Cryogenics"); - provider.add("gtceu.fluid_pipe.plasma_proof", "§6Can handle all Plasmas"); - provider.add("gtceu.fluid_pipe.not_gas_proof", "§4Gases may leak!"); - provider.add("gtceu.item_pipe.priority", "§9Priority: §f%d"); - provider.add("gtceu.duct_pipe.transfer_rate", "§bAir transfer rate: %s"); - provider.add("gtceu.multiblock.work_paused", "Work Paused."); - provider.add("gtceu.multiblock.running", "Running perfectly."); - provider.add("gtceu.multiblock.idling", "§6Idling."); - provider.add("gtceu.multiblock.research_station.researching", "§6Researching."); - provider.add("gtceu.multiblock.not_enough_energy", "WARNING: Machine needs more energy."); - provider.add("gtceu.multiblock.not_enough_energy_output", "WARNING: Energy Dynamo Tier Too Low!"); - provider.add("gtceu.multiblock.waiting", "WARNING: Machine is waiting."); - provider.add("gtceu.multiblock.progress_percent", "Progress: %s%%"); - provider.add("gtceu.multiblock.progress", "Progress: %ss / %ss (%s%%)"); - provider.add("gtceu.multiblock.output_line.0", "%s x §e%s§r (%ss/ea)"); - provider.add("gtceu.multiblock.output_line.1", "%s x §e%s§r (%s/s)"); - provider.add("gtceu.multiblock.output_line.2", "%s ≈ §e%s§r (%ss/ea)"); - provider.add("gtceu.multiblock.output_line.3", "%s ≈ §e%s§r (%s/s)"); - provider.add("gtceu.multiblock.invalid_structure", "Invalid structure."); - provider.add("gtceu.multiblock.invalid_structure.tooltip", - "This block is a controller of the multiblock structure. For building help, see structure template in JEI."); - provider.add("gtceu.multiblock.validation_failed", "Invalid amount of inputs/outputs."); - provider.add("gtceu.multiblock.max_recipe_tier", "Max Recipe Tier: %s"); - provider.add("gtceu.multiblock.max_recipe_tier_hover", "The maximum tier of recipes that can be run"); - provider.add("gtceu.multiblock.max_energy_per_tick", "Max EU/t: §a%s (%s§r)"); - provider.add("gtceu.multiblock.max_energy_per_tick_hover", - "The maximum EU/t available for running recipes or overclocking"); - provider.add("gtceu.multiblock.max_energy_per_tick_amps", "Max EU/t: %s (%sA %s)"); - provider.add("gtceu.multiblock.energy_consumption", "Energy Usage: %s EU/t (%s)"); - provider.add("gtceu.multiblock.generation_eu", "Outputting: §a%s EU/t"); - provider.add("gtceu.multiblock.universal.no_problems", "No Maintenance Problems!"); - provider.add("gtceu.multiblock.universal.has_problems", "Has Maintenance Problems!"); - provider.add("gtceu.multiblock.universal.has_problems_header", - "Fix the following issues in a Maintenance Hatch:"); - provider.add("gtceu.multiblock.universal.problem.wrench", "§7Pipe is loose. (§aWrench§7)"); - provider.add("gtceu.multiblock.universal.problem.screwdriver", "§7Screws are loose. (§aScrewdriver§7)"); - provider.add("gtceu.multiblock.universal.problem.soft_mallet", "§7Something is stuck. (§aSoft Mallet§7)"); - provider.add("gtceu.multiblock.universal.problem.hard_hammer", "§7Plating is dented. (§aHard Hammer§7)"); - provider.add("gtceu.multiblock.universal.problem.wire_cutter", "§7Wires burned out. (§aWire Cutter§7)"); - provider.add("gtceu.multiblock.universal.problem.crowbar", "§7That doesn't belong there. (§aCrowbar§7)"); - provider.add("gtceu.multiblock.universal.muffler_obstructed", "Muffler Hatch is Obstructed!"); - provider.add("gtceu.multiblock.universal.muffler_obstructed.tooltip", - "Muffler Hatch must have a block of airspace in front of it."); - provider.add("gtceu.multiblock.universal.rotor_obstructed", "Rotor is Obstructed!"); - provider.add("gtceu.multiblock.universal.distinct", "Distinct Buses:"); - provider.add("gtceu.multiblock.universal.distinct.no", "No"); - provider.add("gtceu.multiblock.universal.distinct.yes", "Yes"); - provider.add("gtceu.multiblock.universal.distinct.info", - "If enabled, each Item Input Bus will be treated as fully distinct from each other for recipe lookup. Useful for things like Programmed Circuits, Extruder Shapes, etc."); - provider.add("gtceu.multiblock.parallel", "Performing up to %d Recipes in Parallel"); - provider.add("gtceu.multiblock.parallel.exact", "Performing %d Recipes in Parallel"); - provider.add("gtceu.multiblock.multiple_recipemaps.header", "Machine Mode:"); - provider.add("gtceu.multiblock.multiple_recipemaps.tooltip", - "Screwdriver the controller to change which machine mode to use."); - provider.add("gtceu.multiblock.multiple_recipemaps_recipes.tooltip", "Machine Modes: §e%s§r"); - provider.add("gtceu.multiblock.multiple_recipemaps.switch_message", - "The machine must be off to switch modes!"); - provider.add("gtceu.multiblock.preview.zoom", "Use mousewheel or right-click + drag to zoom"); - provider.add("gtceu.multiblock.preview.rotate", "Click and drag to rotate"); - provider.add("gtceu.multiblock.preview.select", "Right-click to check candidates"); - provider.add("gtceu.multiblock.pattern.error", "Expected components (%s) at (%s)."); - provider.add("gtceu.multiblock.pattern.error.limited_exact", "§cExactly: %d§r"); - provider.add("gtceu.multiblock.pattern.error.limited_within", "§cBetween %d and %d§r"); - multiLang(provider, "gtceu.multiblock.pattern.error.limited", "§cMaximum: %d§r", "§cMinimum: %d§r", - "§cMaximum: %d per layer§r", "§cMinimum: %d per layer§r"); - provider.add("gtceu.multiblock.pattern.error.coils", "§cAll heating coils must be the same§r"); - provider.add("gtceu.multiblock.pattern.error.filters", "§cAll filters must be the same§r"); - provider.add("gtceu.multiblock.pattern.error.batteries", "§cAll batteries must be the same§r"); - provider.add("gtceu.multiblock.pattern.clear_amount_1", "§6Must have a clear 1x1x1 space in front§r"); - provider.add("gtceu.multiblock.pattern.clear_amount_3", "§6Must have a clear 3x3x1 space in front§r"); - provider.add("gtceu.multiblock.pattern.single", "§6Only this block can be used§r"); - provider.add("gtceu.multiblock.pattern.location_end", "§cVery End§r"); - provider.add("gtceu.multiblock.pattern.replaceable_air", "Replaceable by Air"); - - provider.add("gtceu.multiblock.computation.max", "Max CWU/t: %s"); - provider.add("gtceu.multiblock.computation.usage", "Using: %s"); - provider.add("gtceu.multiblock.computation.non_bridging", "Non-bridging connection found"); - provider.add("gtceu.multiblock.computation.non_bridging.detailed", - "A Reception Hatch is linked to a machine which cannot bridge"); - provider.add("gtceu.multiblock.computation.not_enough_computation", "Machine needs more computation!"); - - provider.add("gtceu.command.usage", "Usage: /gtceu "); - provider.add("gtceu.command.worldgen.usage", "Usage: /gtceu worldgen "); - provider.add("gtceu.command.worldgen.reload.usage", "Usage: /gtceu worldgen reload"); - provider.add("gtceu.command.worldgen.reload.success", "Worldgen successfully reloaded from config."); - provider.add("gtceu.command.worldgen.reload.failed", - "Worldgen reload failed. Check console for errors."); - provider.add("gtceu.command.hand.groovy", "Consider using §6/gs hand"); - provider.add("gtceu.command.hand.usage", "Usage: /gtceu hand"); - provider.add("gtceu.command.hand.item_id", "Item: %s (Metadata: %d)"); - provider.add("gtceu.command.hand.electric", "Electric Info: %d / %d EU - Tier: %d; Is Battery: %s"); - provider.add("gtceu.command.hand.fluid", "Fluid Info: %d / %d mB; Can Fill: %s; Can Drain: %s"); - provider.add("gtceu.command.hand.fluid2", "Fluid Id:"); - provider.add("gtceu.command.hand.material", "Material Id:"); - provider.add("gtceu.command.hand.ore_prefix", "Ore prefix:"); - provider.add("gtceu.command.hand.meta_item", "MetaItem Id:"); - provider.add("gtceu.command.hand.tag_entries", "§3Tag entries:"); - provider.add("gtceu.command.hand.tool_stats", "Tool Stats Class: %s"); - provider.add("gtceu.command.hand.not_a_player", "This command is only usable by a player."); - provider.add("gtceu.command.hand.no_item", - "You must hold something in main hand or off hand before executing this command."); - provider.add("gtceu.command.recipecheck.usage", "Usage: /gtceu recipecheck"); - provider.add("gtceu.command.recipecheck.begin", "Starting recipe conflict check..."); - provider.add("gtceu.command.recipecheck.end", - "Recipe conflict check found %d possible conflicts. Check the server log for more info"); - provider.add("gtceu.command.recipecheck.end_no_conflicts", "No recipe conflicts found!"); - provider.add("gtceu.command.copy.copied_and_click", "copied to clipboard. Click to copy again"); - provider.add("gtceu.command.copy.click_to_copy", "Click to copy"); - provider.add("gtceu.command.copy.copied_start", "Copied ["); - provider.add("gtceu.command.copy.copied_end", "] to the clipboard"); + provider.add("gtceu.chat.cape", "§5Congrats: you just unlocked a new cape! See the Cape Selector terminal app to use it.§r"); provider.add("gtceu.universal.clear_nbt_recipe.tooltip", "§cThis will destroy all contents!"); @@ -1106,7 +340,7 @@ public static void init(RegistrateLangProvider provider) { provider.add("gtceu.cover.activity_detector_advanced.message_activity_inverted", "Monitoring Inverted Progress Status"); - multiLang(provider, "metaitem.cover.digital.wireless.tooltip", + multiLang(provider, "item.cover.digital.wireless.tooltip", "§fWirelessly§7 connects machines to the §fCentral Monitor§7 as §fCover§7.", "§fRight Click§7 on the §fCentral Monitor§7 to remotely bind to it.", "§fSneak Right Click§7 to remove the current binding.", @@ -1224,47 +458,6 @@ public static void init(RegistrateLangProvider provider) { replace(provider, "block.gtceu.yellow_stripes_block.c", "Yellow Stripes Block"); replace(provider, "block.gtceu.yellow_stripes_block.d", "Yellow Stripes Block"); - // Subtitles - provider.add("gtceu.subtitle.boiler", "Boiler heating"); - provider.add("gtceu.subtitle.computation", "Computer beeps"); - provider.add("gtceu.subtitle.assembler", "Assembler constructing"); - provider.add("gtceu.subtitle.chainsaw", "Chainsaw revving"); - provider.add("gtceu.subtitle.compressor", "Compressor squeezing"); - provider.add("gtceu.subtitle.centrifuge", "Centrifuge spinning"); - provider.add("gtceu.subtitle.mortar", "Mortar crushing"); - provider.add("gtceu.subtitle.screwdriver", "Screwing"); - provider.add("gtceu.subtitle.saw", "Sawing"); - provider.add("gtceu.subtitle.miner", "Miner excavating"); - provider.add("gtceu.subtitle.turbine", "Turbine whizzing"); - provider.add("gtceu.subtitle.wrench", "Wrench rattling"); - provider.add("gtceu.subtitle.portal_opening", "Portal opens"); - provider.add("gtceu.subtitle.replicator", "Replicator copying"); - provider.add("gtceu.subtitle.arc", "Arcs buzzing"); - provider.add("gtceu.subtitle.combustion", "Combusting"); - provider.add("gtceu.subtitle.portable_scanner", "Scanning"); - provider.add("gtceu.subtitle.macerator", "Macerator crushing"); - provider.add("gtceu.subtitle.jet_engine", "Jet roaring"); - provider.add("gtceu.subtitle.spray_can", "Spraying"); - provider.add("gtceu.subtitle.mixer", "Mixer sloshing"); - provider.add("gtceu.subtitle.fire", "Fire crackling"); - provider.add("gtceu.subtitle.forge_hammer", "Forge Hammer thumping"); - provider.add("gtceu.subtitle.bath", "Bath fizzing"); - provider.add("gtceu.subtitle.soft_hammer", "Soft tap"); - provider.add("gtceu.subtitle.wirecutter", "Wire snipped"); - provider.add("gtceu.subtitle.chemical", "Chemical bubbling"); - provider.add("gtceu.subtitle.file", "File rasping"); - provider.add("gtceu.subtitle.portal_closing", "Portal closes"); - provider.add("gtceu.subtitle.motor", "Motor humming"); - provider.add("gtceu.subtitle.drill", "Drilling"); - provider.add("gtceu.subtitle.cut", "Cutter whirring"); - provider.add("gtceu.subtitle.furnace", "Furnace heating"); - provider.add("gtceu.subtitle.electrolyzer", "Electrolyzer sparking"); - provider.add("gtceu.subtitle.cooling", "Freezer humming"); - provider.add("gtceu.subtitle.plunger", "Plunger popping"); - provider.add("gtceu.subtitle.sus", "Sus..."); - provider.add("gtceu.subtitle.science", "s c i e n c e"); - provider.add("gtceu.subtitle.metal_pipe", "Destruction_Metal_Pole_L_Wave_2_0_0.wav"); - provider.add("effect.gtceu.weak_poison", "Weak Poison"); provider.add("gtceu.tooltip.potion.header", "§6Contains effects:"); @@ -1282,6 +475,17 @@ public static void init(RegistrateLangProvider provider) { provider.add("gtceu.tooltip.status.trinary.unknown", "Unknown"); } + + public static void generateTooltipKeys(RegistrateLangProvider provider){ + provider.add("gtceu.tooltip.hold_shift", "§7Hold SHIFT for more info"); + provider.add("gtceu.tooltip.hold_ctrl", "§7Hold CTRL for more info"); + provider.add("gtceu.tooltip.fluid_pipe_hold_shift", "§7Hold SHIFT to show Fluid Containment Info"); + provider.add("gtceu.tooltip.tool_fluid_hold_shift", + "§7Hold SHIFT to show Fluid Containment and Tool Info"); + + } + + /** * Returns the sub-key consisting of the given key plus the given index.
* E.g.,
diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java new file mode 100644 index 00000000000..0fda0871b89 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java @@ -0,0 +1,119 @@ +package com.gregtechceu.gtceu.data.lang; + +import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import com.gregtechceu.gtceu.api.data.chemical.material.registry.MaterialRegistry; + +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.tterrag.registrate.providers.RegistrateLangProvider; + +import static com.gregtechceu.gtceu.data.lang.LangHandler.replace; +import static com.gregtechceu.gtceu.utils.FormattingUtil.toEnglishName; + +public class MaterialLang { + + public static void generate(RegistrateLangProvider provider, MaterialRegistry registry) { + for (Material material : registry.getAllMaterials()) + provider.add(material.getUnlocalizedName(), toEnglishName(material.getName())); + } + public static void generateCustomMaterialNames(RegistrateLangProvider provider ) { + + replace(provider, GTMaterials.FullersEarth.getUnlocalizedName(), "Fuller's Earth"); + replace(provider, GTMaterials.Cooperite.getUnlocalizedName(), "Sheldonite"); // greg's humor is now on + // 1.19... + replace(provider, GTMaterials.HSSG.getUnlocalizedName(), "HSS-G"); + replace(provider, GTMaterials.HSSE.getUnlocalizedName(), "HSS-E"); + replace(provider, GTMaterials.HSSS.getUnlocalizedName(), "HSS-S"); + replace(provider, GTMaterials.RTMAlloy.getUnlocalizedName(), "RTM Alloy"); + replace(provider, GTMaterials.HSLASteel.getUnlocalizedName(), "HSLA Steel"); + + replace(provider, GTMaterials.UUMatter.getUnlocalizedName(), "UU-Matter"); + replace(provider, GTMaterials.PCBCoolant.getUnlocalizedName(), "PCB Coolant"); + replace(provider, GTMaterials.TungstenSteel.getUnlocalizedName(), "Tungstensteel"); + replace(provider, GTMaterials.Iron3Chloride.getUnlocalizedName(), "Iron III Chloride"); + replace(provider, GTMaterials.Iron2Chloride.getUnlocalizedName(), "Iron II Chloride"); + replace(provider, GTMaterials.OilHeavy.getUnlocalizedName(), "Heavy Oil"); + replace(provider, "block.gtceu.oil_heavy", "Heavy Oil"); + replace(provider, GTMaterials.OilLight.getUnlocalizedName(), "Light Oil"); + replace(provider, "block.gtceu.oil_light", "Light Oil"); + replace(provider, GTMaterials.RawOil.getUnlocalizedName(), "Raw Oil"); + replace(provider, "block.gtceu.oil_medium", "Raw Oil"); + + replace(provider, GTMaterials.HydroCrackedButadiene.getUnlocalizedName(), "Hydro-Cracked Butadiene"); + replace(provider, GTMaterials.HydroCrackedButane.getUnlocalizedName(), "Hydro-Cracked Butane"); + replace(provider, GTMaterials.HydroCrackedButene.getUnlocalizedName(), "Hydro-Cracked Butene"); + replace(provider, GTMaterials.HydroCrackedButene.getUnlocalizedName(), "Hydro-Cracked Butene"); + replace(provider, GTMaterials.HydroCrackedEthane.getUnlocalizedName(), "Hydro-Cracked Ethane"); + replace(provider, GTMaterials.HydroCrackedEthylene.getUnlocalizedName(), "Hydro-Cracked Ethylene"); + replace(provider, GTMaterials.HydroCrackedPropane.getUnlocalizedName(), "Hydro-Cracked Propane"); + replace(provider, GTMaterials.HydroCrackedPropene.getUnlocalizedName(), "Hydro-Cracked Propene"); + replace(provider, GTMaterials.SteamCrackedButadiene.getUnlocalizedName(), "Steam-Cracked Butadiene"); + replace(provider, GTMaterials.SteamCrackedButane.getUnlocalizedName(), "Steam-Cracked Butane"); + replace(provider, GTMaterials.SteamCrackedButene.getUnlocalizedName(), "Steam-Cracked Butene"); + replace(provider, GTMaterials.SteamCrackedButene.getUnlocalizedName(), "Steam-Cracked Butene"); + replace(provider, GTMaterials.SteamCrackedEthane.getUnlocalizedName(), "Steam-Cracked Ethane"); + replace(provider, GTMaterials.SteamCrackedEthylene.getUnlocalizedName(), "Steam-Cracked Ethylene"); + replace(provider, GTMaterials.SteamCrackedPropane.getUnlocalizedName(), "Steam-Cracked Propane"); + replace(provider, GTMaterials.SteamCrackedPropene.getUnlocalizedName(), "Steam-Cracked Propene"); + replace(provider, GTMaterials.LightlyHydroCrackedGas.getUnlocalizedName(), "Lightly Hydro-Cracked Gas"); + replace(provider, GTMaterials.LightlyHydroCrackedHeavyFuel.getUnlocalizedName(), + "Lightly Hydro-Cracked Heavy Fuel"); + replace(provider, GTMaterials.LightlyHydroCrackedLightFuel.getUnlocalizedName(), + "Lightly Hydro-Cracked Light Fuel"); + replace(provider, GTMaterials.LightlyHydroCrackedNaphtha.getUnlocalizedName(), + "Lightly Hydro-Cracked Naphtha"); + replace(provider, GTMaterials.LightlySteamCrackedGas.getUnlocalizedName(), "Lightly Steam-Cracked Gas"); + replace(provider, GTMaterials.LightlySteamCrackedHeavyFuel.getUnlocalizedName(), + "Lightly Steam-Cracked Heavy Fuel"); + replace(provider, GTMaterials.LightlySteamCrackedLightFuel.getUnlocalizedName(), + "Lightly Steam-Cracked Light Fuel"); + replace(provider, GTMaterials.LightlySteamCrackedNaphtha.getUnlocalizedName(), + "Lightly Steam-Cracked Naphtha"); + replace(provider, GTMaterials.SeverelyHydroCrackedGas.getUnlocalizedName(), + "Severely Hydro-Cracked Gas"); + replace(provider, GTMaterials.SeverelyHydroCrackedHeavyFuel.getUnlocalizedName(), + "Severely Hydro-Cracked Heavy Fuel"); + replace(provider, GTMaterials.SeverelyHydroCrackedLightFuel.getUnlocalizedName(), + "Severely Hydro-Cracked Light Fuel"); + replace(provider, GTMaterials.SeverelyHydroCrackedNaphtha.getUnlocalizedName(), + "Severely Hydro-Cracked Naphtha"); + replace(provider, GTMaterials.SeverelySteamCrackedGas.getUnlocalizedName(), + "Severely Steam-Cracked Gas"); + replace(provider, GTMaterials.SeverelySteamCrackedHeavyFuel.getUnlocalizedName(), + "Severely Steam-Cracked Heavy Fuel"); + replace(provider, GTMaterials.SeverelySteamCrackedLightFuel.getUnlocalizedName(), + "Severely Steam-Cracked Light Fuel"); + replace(provider, GTMaterials.SeverelySteamCrackedNaphtha.getUnlocalizedName(), + "Severely Steam-Cracked Naphtha"); + replace(provider, GTMaterials.LPG.getUnlocalizedName(), "LPG"); + + replace(provider, GTMaterials.Zeron100.getUnlocalizedName(), "Zeron-100"); + replace(provider, GTMaterials.IncoloyMA956.getUnlocalizedName(), "Incoloy MA-956"); + replace(provider, GTMaterials.Stellite100.getUnlocalizedName(), "Stellite-100"); + replace(provider, GTMaterials.HastelloyC276.getUnlocalizedName(), "Hastelloy C-276"); + + } + public static void generateFluidKeys(RegistrateLangProvider provider){ + provider.add("gtceu.fluid.click_to_fill", + "§7Click with a Fluid Container to §bfill §7the tank (Shift-click for a full stack)."); + provider.add("gtceu.fluid.click_combined", + "§7Click with a Fluid Container to §cempty §7or §bfill §7the tank (Shift-click for a full stack)."); + provider.add("gtceu.fluid.click_to_empty", + "§7Click with a Fluid Container to §cempty §7the tank (Shift-click for a full stack)."); + + + provider.add("gtceu.fluid.liquid_generic", "Liquid %s"); + provider.add("gtceu.fluid.generic", "%s"); + provider.add("gtceu.fluid.gas_generic", "%s Gas"); + provider.add("gtceu.fluid.gas_vapor", "%s Vapor"); + provider.add("gtceu.fluid.plasma", "%s Plasma"); + provider.add("gtceu.fluid.molten", "Molten %s"); + provider.add("gtceu.fluid.empty", "Empty"); + provider.add("gtceu.fluid.amount", "§9Amount: %d/%d mB"); + provider.add("gtceu.fluid.temperature", "§cTemperature: %d K"); + provider.add("gtceu.fluid.temperature.cryogenic", "§bCryogenic! Handle with care!"); + provider.add("gtceu.fluid.state_gas", "§aState: Gaseous"); + provider.add("gtceu.fluid.state_liquid", "§aState: Liquid"); + provider.add("gtceu.fluid.state_plasma", "§aState: Plasma"); + provider.add("gtceu.fluid.type_acid.tooltip", "§6Acidic! Handle with care!"); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLangGenerator.java b/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLangGenerator.java deleted file mode 100644 index f6d18864b8d..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLangGenerator.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.gregtechceu.gtceu.data.lang; - -import com.gregtechceu.gtceu.api.data.chemical.material.Material; -import com.gregtechceu.gtceu.api.data.chemical.material.registry.MaterialRegistry; - -import com.tterrag.registrate.providers.RegistrateLangProvider; - -import static com.gregtechceu.gtceu.utils.FormattingUtil.toEnglishName; - -public class MaterialLangGenerator { - - public static void generate(RegistrateLangProvider provider, MaterialRegistry registry) { - for (Material material : registry.getAllMaterials()) - provider.add(material.getUnlocalizedName(), toEnglishName(material.getName())); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java new file mode 100644 index 00000000000..f3681648d80 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java @@ -0,0 +1,59 @@ +package com.gregtechceu.gtceu.data.lang; + +import com.tterrag.registrate.providers.RegistrateLangProvider; + +public class RecipeLang { + + public static void generateRecipeConditions(RegistrateLangProvider provider) { + + provider.add("recipe.condition.thunder.tooltip", "Thunder Level: %d"); + provider.add("recipe.condition.rain.tooltip", "Rain Level: %d"); + provider.add("recipe.condition.dimension.tooltip", "Dimension: %s"); + provider.add("recipe.condition.dimension_marker.tooltip", "Dimension:"); + provider.add("recipe.condition.biome.tooltip", "Biome: %s"); + provider.add("recipe.condition.pos_y.tooltip", "Y Level: %d <= Y <= %d"); + provider.add("recipe.condition.steam_vent.tooltip", "Clean steam vent"); + provider.add("recipe.condition.rock_breaker.tooltip", "Fluid blocks around"); + provider.add("recipe.condition.adjacent_block.tooltip", "Blocks around"); + provider.add("recipe.condition.eu_to_start.tooltip", "EU to Start: %d%s"); + provider.add("recipe.condition.daytime.day.tooltip", "Requires day time to work"); + provider.add("recipe.condition.daytime.night.tooltip", "Requires night time to work"); + provider.add("recipe.condition.gamestage.unlocked_stage", "Unlocked at stage: %s"); + provider.add("recipe.condition.gamestage.locked_stage", "Locked at stage: %s"); + provider.add("recipe.condition.quest.completed.tooltip", "Requires %s completed"); + provider.add("recipe.condition.quest.not_completed.tooltip", "Requires %s not completed"); + + + + } + + public static void generateRecipeDataKeys(RegistrateLangProvider provider) { + provider.add("gtceu.recipe.total", "Total: %s EU"); + provider.add("gtceu.recipe.max_eu", "Max. EU: %s EU"); + provider.add("gtceu.recipe.eu", "Usage: %s EU/t"); + provider.add("gtceu.recipe.eu_inverted", "Generation: %s EU/t"); + provider.add("gtceu.recipe.duration", "Duration: %s secs"); + provider.add("gtceu.recipe.amperage", "Amperage: %s"); + provider.add("gtceu.recipe.not_consumed", "Does not get consumed in the process"); + provider.add("gtceu.recipe.chance", "Chance: %s +%s/tier"); + provider.add("gtceu.recipe.temperature", "Temp: %sK"); + provider.add("gtceu.recipe.coil.tier", "Coil: %s"); + provider.add("gtceu.recipe.explosive", "Explosive: %s"); + provider.add("gtceu.recipe.eu_to_start", "EU To Start: %sEU%s"); + provider.add("gtceu.recipe.dimensions", "Dimensions: %s"); + provider.add("gtceu.recipe.cleanroom", "Requires %s"); + provider.add("gtceu.recipe.environmental_hazard.reverse", "§cArea must be free of %s"); + provider.add("gtceu.recipe.environmental_hazard", "§cArea must have %s"); + provider.add("gtceu.recipe.cleanroom.display_name", "Cleanroom"); + provider.add("gtceu.recipe.cleanroom_sterile.display_name", "Sterile Cleanroom"); + provider.add("gtceu.recipe.research", "Requires Research"); + provider.add("gtceu.recipe.scan_for_research", "Scan for Assembly Line"); + provider.add("gtceu.recipe.computation_per_tick", "Min. Computation: %s CWU/t"); + provider.add("gtceu.recipe.total_computation", "Computation: %s CWU"); + + } + public static void generateMiscKeys(RegistrateLangProvider provider) { + + + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/SubtitleLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/SubtitleLang.java new file mode 100644 index 00000000000..42d37a942eb --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/SubtitleLang.java @@ -0,0 +1,52 @@ +package com.gregtechceu.gtceu.data.lang; + +import com.tterrag.registrate.providers.RegistrateLangProvider; + +public class SubtitleLang { + public static void generateSubtitleKeys(RegistrateLangProvider provider) { + + + // Subtitles + provider.add("gtceu.subtitle.boiler", "Boiler heating"); + provider.add("gtceu.subtitle.computation", "Computer beeps"); + provider.add("gtceu.subtitle.assembler", "Assembler constructing"); + provider.add("gtceu.subtitle.chainsaw", "Chainsaw revving"); + provider.add("gtceu.subtitle.compressor", "Compressor squeezing"); + provider.add("gtceu.subtitle.centrifuge", "Centrifuge spinning"); + provider.add("gtceu.subtitle.mortar", "Mortar crushing"); + provider.add("gtceu.subtitle.screwdriver", "Screwing"); + provider.add("gtceu.subtitle.saw", "Sawing"); + provider.add("gtceu.subtitle.miner", "Miner excavating"); + provider.add("gtceu.subtitle.turbine", "Turbine whizzing"); + provider.add("gtceu.subtitle.wrench", "Wrench rattling"); + provider.add("gtceu.subtitle.portal_opening", "Portal opens"); + provider.add("gtceu.subtitle.replicator", "Replicator copying"); + provider.add("gtceu.subtitle.arc", "Arcs buzzing"); + provider.add("gtceu.subtitle.combustion", "Combusting"); + provider.add("gtceu.subtitle.portable_scanner", "Scanning"); + provider.add("gtceu.subtitle.macerator", "Macerator crushing"); + provider.add("gtceu.subtitle.jet_engine", "Jet roaring"); + provider.add("gtceu.subtitle.spray_can", "Spraying"); + provider.add("gtceu.subtitle.mixer", "Mixer sloshing"); + provider.add("gtceu.subtitle.fire", "Fire crackling"); + provider.add("gtceu.subtitle.forge_hammer", "Forge Hammer thumping"); + provider.add("gtceu.subtitle.bath", "Bath fizzing"); + provider.add("gtceu.subtitle.soft_hammer", "Soft tap"); + provider.add("gtceu.subtitle.wirecutter", "Wire snipped"); + provider.add("gtceu.subtitle.chemical", "Chemical bubbling"); + provider.add("gtceu.subtitle.file", "File rasping"); + provider.add("gtceu.subtitle.portal_closing", "Portal closes"); + provider.add("gtceu.subtitle.motor", "Motor humming"); + provider.add("gtceu.subtitle.drill", "Drilling"); + provider.add("gtceu.subtitle.cut", "Cutter whirring"); + provider.add("gtceu.subtitle.furnace", "Furnace heating"); + provider.add("gtceu.subtitle.electrolyzer", "Electrolyzer sparking"); + provider.add("gtceu.subtitle.cooling", "Freezer humming"); + provider.add("gtceu.subtitle.plunger", "Plunger popping"); + provider.add("gtceu.subtitle.sus", "Sus..."); + provider.add("gtceu.subtitle.science", "s c i e n c e"); + provider.add("gtceu.subtitle.metal_pipe", "Destruction_Metal_Pole_L_Wave_2_0_0.wav"); + + + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java index 6b0d8527c1d..6e4f66ff784 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java @@ -2,6 +2,8 @@ import com.tterrag.registrate.providers.RegistrateLangProvider; +import static com.gregtechceu.gtceu.data.lang.LangHandler.*; + public class ToolLang { public static void init(RegistrateLangProvider provider) { @@ -66,5 +68,154 @@ private static void initDeathMessages(RegistrateLangProvider provider) { provider.add("death.attack.gtceu.medical_condition/carbon_monoxide_poisoning", "%s left the stove on"); } + public static void generateToolClassKey(RegistrateLangProvider provider){ + + provider.add("gtceu.tool.class.sword", "Sword"); + provider.add("gtceu.tool.class.pickaxe", "Pickaxe"); + provider.add("gtceu.tool.class.shovel", "Shovel"); + provider.add("gtceu.tool.class.axe", "Axe"); + provider.add("gtceu.tool.class.hoe", "Hoe"); + provider.add("gtceu.tool.class.mining_hammer", "Mining Hammer"); + provider.add("gtceu.tool.class.spade", "Spade"); + provider.add("gtceu.tool.class.saw", "Saw"); + provider.add("gtceu.tool.class.hammer", "Hammer"); + provider.add("gtceu.tool.class.mallet", "Soft Mallet"); + provider.add("gtceu.tool.class.wrench", "Wrench"); + provider.add("gtceu.tool.class.file", "File"); + provider.add("gtceu.tool.class.crowbar", "Crowbar"); + provider.add("gtceu.tool.class.screwdriver", "Screwdriver"); + provider.add("gtceu.tool.class.mortar", "Mortar"); + provider.add("gtceu.tool.class.wire_cutter", "Wire Cutter"); + provider.add("gtceu.tool.class.knife", "Knife"); + provider.add("gtceu.tool.class.butchery_knife", "Butchery Knife"); + provider.add("gtceu.tool.class.scythe", "Scythe"); + provider.add("gtceu.tool.class.rolling_pin", "Rolling Pin"); + provider.add("gtceu.tool.class.plunger", "Plunger"); + provider.add("gtceu.tool.class.shears", "Shears"); + provider.add("gtceu.tool.class.drill", "Drill"); + + } + public static void generateBehaviorKey(RegistrateLangProvider provider){ + provider.add("item.gtceu.tool.behavior.silk_ice", "§bIce Cutter: §fSilk Harvests Ice"); + provider.add("item.gtceu.tool.behavior.torch_place", "§eSpelunker: §fPlaces Torches on Right-Click"); + provider.add("item.gtceu.tool.behavior.tree_felling", "§4Lumberjack: §fTree Felling"); + provider.add("item.gtceu.tool.behavior.strip_log", "§5Artisan: §fStrips Logs"); + provider.add("item.gtceu.tool.behavior.scrape", "§bPolisher: §fRemoves Oxidation"); + provider.add("item.gtceu.tool.behavior.remove_wax", "§6Cleaner: §fRemoves Wax"); + provider.add("item.gtceu.tool.behavior.shield_disable", "§cBrute: §fDisables Shields"); + provider.add("item.gtceu.tool.behavior.relocate_mining", "§2Magnetic: §fRelocates Mined Blocks and Mob Drops"); + provider.add("item.gtceu.tool.behavior.aoe_mining", "§5Area-of-Effect: §f%sx%sx%s"); + provider.add("item.gtceu.tool.behavior.ground_tilling", "§eFarmer: §fTills Ground"); + provider.add("item.gtceu.tool.behavior.grass_path", "§eLandscaper: §fCreates Grass Paths"); + provider.add("item.gtceu.tool.behavior.rail_rotation", "§eRailroad Engineer: §fRotates Rails"); + provider.add("item.gtceu.tool.behavior.crop_harvesting", "§aHarvester: §fHarvests Crops"); + provider.add("item.gtceu.tool.behavior.plunger", "§9Plumber: §fDrains Fluids"); + provider.add("item.gtceu.tool.behavior.block_rotation", "§2Mechanic: §fRotates Blocks"); + provider.add("item.gtceu.tool.behavior.damage_boost", "§4Damage Boost: §fExtra damage against %s"); + + //mode switching + provider.add("item.behavior.mode_switch.tooltip", "Use while sneaking to switch mode"); + provider.add("item.behavior.mode_switch.mode_switched", "§eMode Set to: %s"); + provider.add("item.behavior.mode_switch.current_mode", "Mode: %s"); + + } + + public static void generateToolKeys(RegistrateLangProvider provider){ + replace(provider, "item.gtceu.tool.sword", "%s Sword"); + replace(provider, "item.gtceu.tool.pickaxe", "%s Pickaxe"); + replace(provider, "item.gtceu.tool.shovel", "%s Shovel"); + replace(provider, "item.gtceu.tool.axe", "%s Axe"); + replace(provider, "item.gtceu.tool.hoe", "%s Hoe"); + replace(provider, "item.gtceu.tool.saw", "%s Saw"); + replace(provider, "item.gtceu.tool.hammer", "%s Hammer"); + provider.add("item.gtceu.tool.hammer.tooltip", "§8Crushes Blocks when harvesting them"); + replace(provider, "item.gtceu.tool.mallet", "%s Soft Mallet"); + multilineLang(provider, "item.gtceu.tool.mallet.tooltip", + "§8Sneak to Pause Machine After Current Recipe.\n§8Stops/Starts Machines"); + replace(provider, "item.gtceu.tool.wrench", "%s Wrench"); + provider.add("item.gtceu.tool.wrench.tooltip", "§8Hold left click to dismantle Machines"); + replace(provider, "item.gtceu.tool.file", "%s File"); + replace(provider, "item.gtceu.tool.crowbar", "%s Crowbar"); + provider.add("item.gtceu.tool.crowbar.tooltip", "§8Dismounts Covers"); + replace(provider, "item.gtceu.tool.screwdriver", "%s Screwdriver"); + provider.add("item.gtceu.tool.screwdriver.tooltip", "§8Adjusts Covers and Machines"); + replace(provider, "item.gtceu.tool.mortar", "%s Mortar"); + replace(provider, "item.gtceu.tool.wire_cutter", "%s Wire Cutter"); + replace(provider, "item.gtceu.tool.knife", "%s Knife"); + replace(provider, "item.gtceu.tool.butchery_knife", "%s Butchery Knife"); + provider.add("item.gtceu.tool.butchery_knife.tooltip", "§8Has a slow Attack Rate"); + replace(provider, "item.gtceu.tool.scythe", "%s Scythe"); + provider.add("item.gtceu.tool.scythe.tooltip", "§8Because a Scythe doesn't make Sense"); + replace(provider, "item.gtceu.tool.rolling_pin", "%s Rolling Pin"); + replace(provider, "item.gtceu.tool.lv_drill", "%s Drill (LV)"); + replace(provider, "item.gtceu.tool.mv_drill", "%s Drill (MV)"); + replace(provider, "item.gtceu.tool.hv_drill", "%s Drill (HV)"); + replace(provider, "item.gtceu.tool.ev_drill", "%s Drill (EV)"); + replace(provider, "item.gtceu.tool.iv_drill", "%s Drill (IV)"); + replace(provider, "item.gtceu.tool.lv_wirecutter", "%s Wire Cutter (LV)"); + replace(provider, "item.gtceu.tool.hv_wirecutter", "%s Wire Cutter (HV)"); + replace(provider, "item.gtceu.tool.iv_wirecutter", "%s Wire Cutter (IV)"); + replace(provider, "item.gtceu.tool.mining_hammer", "%s Mining Hammer"); + provider.add("item.gtceu.tool.mining_hammer.tooltip", + "§8Mines a large area at once (unless you're crouching)"); + replace(provider, "item.gtceu.tool.spade", "%s Spade"); + provider.add("item.gtceu.tool.spade.tooltip", "§8Mines a large area at once (unless you're crouching)"); + replace(provider, "item.gtceu.tool.lv_chainsaw", "%s Chainsaw (LV)"); + replace(provider, "item.gtceu.tool.mv_chainsaw", "%s Chainsaw (MV)"); + replace(provider, "item.gtceu.tool.hv_chainsaw", "%s Chainsaw (HV)"); + replace(provider, "item.gtceu.tool.lv_wrench", "%s Wrench (LV)"); + provider.add("item.gtceu.tool.lv_wrench.tooltip", "§8Hold left click to dismantle Machines"); + replace(provider, "item.gtceu.tool.hv_wrench", "%s Wrench (HV)"); + provider.add("item.gtceu.tool.hv_wrench.tooltip", "§8Hold left click to dismantle Machines"); + replace(provider, "item.gtceu.tool.iv_wrench", "%s Wrench (IV)"); + provider.add("item.gtceu.tool.iv_wrench.tooltip", "§8Hold left click to dismantle Machines"); + replace(provider, "item.gtceu.tool.buzzsaw", "%s Buzzsaw (LV)"); + provider.add("item.gtceu.tool.buzzsaw.tooltip", "§8Not suitable for harvesting Blocks"); + replace(provider, "item.gtceu.tool.lv_screwdriver", "%s Screwdriver (LV)"); + provider.add("item.gtceu.tool.lv_screwdriver.tooltip", "§8Adjusts Covers and Machines"); + replace(provider, "item.gtceu.tool.plunger", "%s Plunger"); + provider.add("item.gtceu.tool.plunger.tooltip", "§8Removes Fluids from Machines"); + replace(provider, "item.gtceu.tool.shears", "%s Shears"); + } + + public static void generateTooltips(RegistrateLangProvider provider){ + provider.add("item.gtceu.tool.tooltip.crafting_uses", "%s §aCrafting Uses"); + provider.add("item.gtceu.tool.tooltip.max_uses", "%s §eTotal Durability"); + provider.add("item.gtceu.tool.tooltip.general_uses", "%s §bDurability"); + provider.add("item.gtceu.tool.tooltip.attack_damage", "%s §cAttack Damage"); + provider.add("item.gtceu.tool.tooltip.attack_speed", "%s §9Attack Speed"); + provider.add("item.gtceu.tool.tooltip.mining_speed", "%s §dMining Speed"); + provider.add("item.gtceu.tool.tooltip.harvest_level", "§eHarvest Level %s"); + provider.add("item.gtceu.tool.tooltip.harvest_level_extra", "§eHarvest Level %s §f(%s§f)"); + multiLang(provider, "item.gtceu.tool.harvest_level", "§8Wood", "§7Stone", "§aIron", "§bDiamond", + "§dNetherite", + "§9Duranium", "§cNeutronium"); + provider.add("item.gtceu.tool.tooltip.repair_info", "§8Hold SHIFT to show Repair Info"); + provider.add("item.gtceu.tool.tooltip.repair_material", "§8Repair with: §f§a%s"); + } + + public static void generateActionKeys(RegistrateLangProvider provider){ + provider.add("gtceu.tool_action.show_tooltips", "Hold SHIFT to show Tool Info"); + provider.add("gtceu.tool_action.screwdriver.auto_output_covers", + "§8Use Screwdriver to Allow Input from Output Side or access Covers"); + provider.add("gtceu.tool_action.screwdriver.toggle_mode_covers", + "§8Use Screwdriver to toggle Modes or access Covers"); + provider.add("gtceu.tool_action.screwdriver.access_covers", "§8Use Screwdriver to access Covers"); + provider.add("gtceu.tool_action.screwdriver.auto_collapse", + "§8Use Screwdriver to toggle Item collapsing"); + provider.add("gtceu.tool_action.screwdriver.auto_output", "§8Use Screwdriver to toggle Auto-Output"); + provider.add("gtceu.tool_action.screwdriver.toggle_mode", "§8Use Screwdriver to toggle Modes"); + provider.add("gtceu.tool_action.wrench.set_facing", "§8Use Wrench to set Facing"); + provider.add("gtceu.tool_action.wrench.connect", + "§8Use Wrench to set Connections, sneak to block Connections"); + provider.add("gtceu.tool_action.wire_cutter.connect", "§8Use Wire Cutters to set Connections"); + provider.add("gtceu.tool_action.soft_mallet.reset", "§8Use Soft Mallet to toggle Working"); + provider.add("gtceu.tool_action.soft_mallet.toggle_mode", "§8Use Soft Mallet to toggle Modes"); + provider.add("gtceu.tool_action.hammer", "§8Use Hard Hammer to muffle Sounds"); + provider.add("gtceu.tool_action.crowbar", "§8Use Crowbar to remove Covers"); + provider.add("gtceu.tool_action.tape", "§8Use Tape to fix Maintenance Problems"); + + } + private static void initToolInfo(RegistrateLangProvider provider) {} } diff --git a/src/main/resources/assets/gtceu/lang/ja_jp.json b/src/main/resources/assets/gtceu/lang/ja_jp.json index a818219d5a1..94859ce7a75 100644 --- a/src/main/resources/assets/gtceu/lang/ja_jp.json +++ b/src/main/resources/assets/gtceu/lang/ja_jp.json @@ -5285,53 +5285,53 @@ "metaarmor.tooltip.potions": "デバフ無効", "metaarmor.tooltip.speed": "走る速度が上昇", "metaarmor.tooltip.stepassist": "ステップアシストを提供", - "metaitem.behavior.mode_switch.current_mode": "モード: %s", - "metaitem.behavior.mode_switch.mode_switched": "§eモードが設定されました: %s", - "metaitem.behavior.mode_switch.tooltip": "スニーク中に使うことでモード変更", - "metaitem.clipboard.tooltip": "筆記具なしで書くことができます。壁に右クリックして配置、Shiftキーを押しながら右クリックして撤去。", - "metaitem.cover.digital.mode.energy.disabled": "クリックでエネルギーモードを有効化", - "metaitem.cover.digital.mode.energy.enabled": "エネルギーモードが有効", - "metaitem.cover.digital.mode.fluid.disabled": "クリックで液体モードを有効化", - "metaitem.cover.digital.mode.fluid.enabled": "液体モードが有効", - "metaitem.cover.digital.mode.item.disabled": "クリックでアイテムモードを有効化", - "metaitem.cover.digital.mode.item.enabled": "アイテムモードが有効", - "metaitem.cover.digital.mode.machine.disabled": "クリックでマシンモードを有効化", - "metaitem.cover.digital.mode.machine.enabled": "マシンモードが有効", - "metaitem.cover.digital.mode.proxy.disabled": "クリックでプロキシモードを有効化", - "metaitem.cover.digital.mode.proxy.enabled": "プロキシモードが有効", - "metaitem.cover.digital.tooltip": "§fケーブル§7を介して機械と§fセントラルモニター§7を繋げる§fカバー§7。", - "metaitem.cover.digital.wireless.tooltip.0": "§fセントラルモニター§7に機械を§f無線で§7接続できる§fカバー§7。", - "metaitem.cover.digital.wireless.tooltip.1": "§fセントラルモニター§7を§f右クリック§7することで無線でリンクできます。", - "metaitem.cover.digital.wireless.tooltip.2": "§fシフト右クリック§7でリンクを除去します。", - "metaitem.cover.digital.wireless.tooltip.3": "§aリンク先: §f%s", - "metaitem.crushed.tooltip.purify": "大釜を右クリックすることで洗浄された鉱石を得られる。", - "metaitem.debug_scanner.tooltip": "トライコーダー", - "metaitem.dust.tooltip.purify": "大釜を右クリックすることで綺麗な粉を得られる。", - "metaitem.electric.discharge_mode.disabled": "§e放電無効", - "metaitem.electric.discharge_mode.enabled": "§e放電有効", - "metaitem.electric.discharge_mode.tooltip": "スニーク中に使うことで放電を切り替えできます。", - "metaitem.generic.electric_item.stored": "%d/%d EU (%s)", - "metaitem.generic.electric_item.tooltip": "%d/%d EU - Tier %s", - "metaitem.generic.fluid_container.tooltip": "%d/%dL %s", - "metaitem.int_circuit.configuration": "設定値: %d", - "metaitem.liquid_fuel_jetpack.tooltip": "推力に燃焼発電機の燃料を使用", - "metaitem.machine_configuration.mode": "§a設定モード:§r %s", - "metaitem.plugin.proxy.tooltips.1": "(スクリーンでプロキシモードに設定してください)", - "metaitem.plugin.tooltips.1": "プラグインはスクリーンに挿入することで機能を追加します", - "metaitem.prospector.mode.bedrock_ore": "§b岩盤鉱石探査モード§r", - "metaitem.prospector.mode.fluid": "§b液体探知モード§r", - "metaitem.prospector.mode.ores": "§a鉱石探知モード§r", - "metaitem.prospector.tooltip.modes": "利用可能なモード:", - "metaitem.prospector.tooltip.radius": "半径%sチャンクの液体と鉱石をスキャン", - "metaitem.record.sus.tooltip": "§7Leonz - Among Us Drip", - "metaitem.terminal.tooltip": "良い仕事をする賢い道具", - "metaitem.terminal.tooltip.creative": "§bクリエイティブモード", - "metaitem.terminal.tooltip.hardware": "§aハードウェア: %d", - "metaitem.tool.tooltip.durability": "§f耐久値: §a%d/%d", - "metaitem.tool.tooltip.primary_material": "§f素材: §e%s", - "metaitem.tool.tooltip.rotor.efficiency": "タービン効率: §9%d%%", - "metaitem.tool.tooltip.rotor.power": "タービンパワー: §9%d%%", - "metaitem.tricorder_scanner.tooltip": "トライコーダー", + "item.behavior.mode_switch.current_mode": "モード: %s", + "item.behavior.mode_switch.mode_switched": "§eモードが設定されました: %s", + "item.behavior.mode_switch.tooltip": "スニーク中に使うことでモード変更", + "item.clipboard.tooltip": "筆記具なしで書くことができます。壁に右クリックして配置、Shiftキーを押しながら右クリックして撤去。", + "item.cover.digital.mode.energy.disabled": "クリックでエネルギーモードを有効化", + "item.cover.digital.mode.energy.enabled": "エネルギーモードが有効", + "item.cover.digital.mode.fluid.disabled": "クリックで液体モードを有効化", + "item.cover.digital.mode.fluid.enabled": "液体モードが有効", + "item.cover.digital.mode.item.disabled": "クリックでアイテムモードを有効化", + "item.cover.digital.mode.item.enabled": "アイテムモードが有効", + "item.cover.digital.mode.machine.disabled": "クリックでマシンモードを有効化", + "item.cover.digital.mode.machine.enabled": "マシンモードが有効", + "item.cover.digital.mode.proxy.disabled": "クリックでプロキシモードを有効化", + "item.cover.digital.mode.proxy.enabled": "プロキシモードが有効", + "item.cover.digital.tooltip": "§fケーブル§7を介して機械と§fセントラルモニター§7を繋げる§fカバー§7。", + "item.cover.digital.wireless.tooltip.0": "§fセントラルモニター§7に機械を§f無線で§7接続できる§fカバー§7。", + "item.cover.digital.wireless.tooltip.1": "§fセントラルモニター§7を§f右クリック§7することで無線でリンクできます。", + "item.cover.digital.wireless.tooltip.2": "§fシフト右クリック§7でリンクを除去します。", + "item.cover.digital.wireless.tooltip.3": "§aリンク先: §f%s", + "item.crushed.tooltip.purify": "大釜を右クリックすることで洗浄された鉱石を得られる。", + "item.debug_scanner.tooltip": "トライコーダー", + "item.dust.tooltip.purify": "大釜を右クリックすることで綺麗な粉を得られる。", + "item.electric.discharge_mode.disabled": "§e放電無効", + "item.electric.discharge_mode.enabled": "§e放電有効", + "item.electric.discharge_mode.tooltip": "スニーク中に使うことで放電を切り替えできます。", + "item.generic.electric_item.stored": "%d/%d EU (%s)", + "item.generic.electric_item.tooltip": "%d/%d EU - Tier %s", + "item.generic.fluid_container.tooltip": "%d/%dL %s", + "item.int_circuit.configuration": "設定値: %d", + "item.liquid_fuel_jetpack.tooltip": "推力に燃焼発電機の燃料を使用", + "item.machine_configuration.mode": "§a設定モード:§r %s", + "item.plugin.proxy.tooltips.1": "(スクリーンでプロキシモードに設定してください)", + "item.plugin.tooltips.1": "プラグインはスクリーンに挿入することで機能を追加します", + "item.prospector.mode.bedrock_ore": "§b岩盤鉱石探査モード§r", + "item.prospector.mode.fluid": "§b液体探知モード§r", + "item.prospector.mode.ores": "§a鉱石探知モード§r", + "item.prospector.tooltip.modes": "利用可能なモード:", + "item.prospector.tooltip.radius": "半径%sチャンクの液体と鉱石をスキャン", + "item.record.sus.tooltip": "§7Leonz - Among Us Drip", + "item.terminal.tooltip": "良い仕事をする賢い道具", + "item.terminal.tooltip.creative": "§bクリエイティブモード", + "item.terminal.tooltip.hardware": "§aハードウェア: %d", + "item.tool.tooltip.durability": "§f耐久値: §a%d/%d", + "item.tool.tooltip.primary_material": "§f素材: §e%s", + "item.tool.tooltip.rotor.efficiency": "タービン効率: §9%d%%", + "item.tool.tooltip.rotor.power": "タービンパワー: §9%d%%", + "item.tricorder_scanner.tooltip": "トライコーダー", "monitor.gui.title.argb": "ARGB:", "monitor.gui.title.back": "戻る", "monitor.gui.title.config": "設定", diff --git a/src/main/resources/assets/gtceu/lang/ru_ru.json b/src/main/resources/assets/gtceu/lang/ru_ru.json index c5680b354e4..fa4b50a6b84 100644 --- a/src/main/resources/assets/gtceu/lang/ru_ru.json +++ b/src/main/resources/assets/gtceu/lang/ru_ru.json @@ -2794,52 +2794,52 @@ "metaarmor.tooltip.potions": "Аннулирует вредные эффекты", "metaarmor.tooltip.speed": "Увеличивает скорость бега", "metaarmor.tooltip.stepassist": "Обеспечивает пошаговую помощь", - "metaitem.behavior.mode_switch.current_mode": "Режим: %s", - "metaitem.behavior.mode_switch.mode_switched": "§eРежим изменен на: %s", - "metaitem.behavior.mode_switch.tooltip": "Используйте зажав кнопку \"присесть\" для переключения режима", - "metaitem.clipboard.tooltip": "На нем можно писать (без какого-либо пишущего инструмента). Щелкните пкм на стене, чтобы разместить ее, и Shift-щелчок пкм, чтобы снять ее", - "metaitem.cover.digital.mode.energy.disabled": "Нажмите чтобы включить Режим энергии", - "metaitem.cover.digital.mode.energy.enabled": "Режим энергии включен", - "metaitem.cover.digital.mode.fluid.disabled": "Нажмите чтобы включить Режим жидкостей", - "metaitem.cover.digital.mode.fluid.enabled": "Режим жидкостей включен", - "metaitem.cover.digital.mode.item.disabled": "Нажмите чтобы включить Режим предметов", - "metaitem.cover.digital.mode.item.enabled": "Режим предметов включен", - "metaitem.cover.digital.mode.machine.disabled": "Нажмите чтобы включить Режим механизма", - "metaitem.cover.digital.mode.machine.enabled": "Режим механизма включен", - "metaitem.cover.digital.mode.proxy.disabled": "Нажмите чтобы включить Режим прокси", - "metaitem.cover.digital.mode.proxy.enabled": "Режим прокси включен", - "metaitem.cover.digital.tooltip": "Подключает Механизму с помощью §fПроводов§7 к §fЦентральному Монитору§7 как §fУлучшение§7.", - "metaitem.cover.digital.wireless.tooltip.0": "§fБеспроводное§7 подключение машины к §fЦентральному Монитору§7 как §fУлучшение механизма§7.", - "metaitem.cover.digital.wireless.tooltip.1": "§fБеспроводное§7 подключение машины к §fЦентральному Монитору§7 как §fУлучшение механизма§7.", - "metaitem.cover.digital.wireless.tooltip.2": "§7Щелкните §fПКМ§7, чтобы удалённо связать.", - "metaitem.cover.digital.wireless.tooltip.3": "§fShift+ПКМ§7 удаляет связывание.", - "metaitem.crushed.tooltip.purify": "ПКМ по котлу, чтобы получить очищенную руду", - "metaitem.debug_scanner.tooltip": "Трикодер", - "metaitem.dust.tooltip.purify": "ПКМ по котлу, чтобы получить чистую пыль", - "metaitem.electric.discharge_mode.disabled": "§eРежим разрядки Выключен", - "metaitem.electric.discharge_mode.enabled": "§eРежим разрядки Включен", - "metaitem.electric.discharge_mode.tooltip": "Используйте зажав кнопку Присесть для переключения режима разрядки", - "metaitem.generic.electric_item.stored": "%d/%d EU (%s)", - "metaitem.generic.electric_item.tooltip": "%d/%d EU - Уровень §e%d", - "metaitem.generic.fluid_container.tooltip": "%d/%dЛ %s", - "metaitem.int_circuit.configuration": "§aКонфигурация: §f%d§7", - "metaitem.liquid_fuel_jetpack.tooltip": "Использует топливо, от дизельного генератора, для тяги", - "metaitem.plugin.proxy.tooltips.1": "(Пожалуйста, настройте режим прокси на экране)", - "metaitem.plugin.tooltips.1": "Плагины могут быть добавлены на экран для большей функциональности.", - "metaitem.prospector.mode.bedrock_ore": "§bРежим разведки§r", - "metaitem.prospector.mode.fluid": "§bРежим разведки жидкости", - "metaitem.prospector.mode.ores": "§aРежим разведки руды", - "metaitem.prospector.tooltip.modes": "Возможные режимы:", - "metaitem.prospector.tooltip.radius": "Сканирует в радиусе %s чанка(ов)", - "metaitem.record.sus.tooltip": "§7Leonz - Among Us Drip", - "metaitem.terminal.tooltip": "Правильные инструменты делают хорошую работу", - "metaitem.terminal.tooltip.creative": "§bТворческий режим", - "metaitem.terminal.tooltip.hardware": "§aДополнений: %d", - "metaitem.tool.tooltip.durability": "§fПрочность: §a%d / %d", - "metaitem.tool.tooltip.primary_material": "§fМатериал: §e%s", - "metaitem.tool.tooltip.rotor.efficiency": "Эффективность ротора: §9%d%%", - "metaitem.tool.tooltip.rotor.power": "Мощность турбины: §9%d%%", - "metaitem.tricorder_scanner.tooltip": "То что нужно", + "item.behavior.mode_switch.current_mode": "Режим: %s", + "item.behavior.mode_switch.mode_switched": "§eРежим изменен на: %s", + "item.behavior.mode_switch.tooltip": "Используйте зажав кнопку \"присесть\" для переключения режима", + "item.clipboard.tooltip": "На нем можно писать (без какого-либо пишущего инструмента). Щелкните пкм на стене, чтобы разместить ее, и Shift-щелчок пкм, чтобы снять ее", + "item.cover.digital.mode.energy.disabled": "Нажмите чтобы включить Режим энергии", + "item.cover.digital.mode.energy.enabled": "Режим энергии включен", + "item.cover.digital.mode.fluid.disabled": "Нажмите чтобы включить Режим жидкостей", + "item.cover.digital.mode.fluid.enabled": "Режим жидкостей включен", + "item.cover.digital.mode.item.disabled": "Нажмите чтобы включить Режим предметов", + "item.cover.digital.mode.item.enabled": "Режим предметов включен", + "item.cover.digital.mode.machine.disabled": "Нажмите чтобы включить Режим механизма", + "item.cover.digital.mode.machine.enabled": "Режим механизма включен", + "item.cover.digital.mode.proxy.disabled": "Нажмите чтобы включить Режим прокси", + "item.cover.digital.mode.proxy.enabled": "Режим прокси включен", + "item.cover.digital.tooltip": "Подключает Механизму с помощью §fПроводов§7 к §fЦентральному Монитору§7 как §fУлучшение§7.", + "item.cover.digital.wireless.tooltip.0": "§fБеспроводное§7 подключение машины к §fЦентральному Монитору§7 как §fУлучшение механизма§7.", + "item.cover.digital.wireless.tooltip.1": "§fБеспроводное§7 подключение машины к §fЦентральному Монитору§7 как §fУлучшение механизма§7.", + "item.cover.digital.wireless.tooltip.2": "§7Щелкните §fПКМ§7, чтобы удалённо связать.", + "item.cover.digital.wireless.tooltip.3": "§fShift+ПКМ§7 удаляет связывание.", + "item.crushed.tooltip.purify": "ПКМ по котлу, чтобы получить очищенную руду", + "item.debug_scanner.tooltip": "Трикодер", + "item.dust.tooltip.purify": "ПКМ по котлу, чтобы получить чистую пыль", + "item.electric.discharge_mode.disabled": "§eРежим разрядки Выключен", + "item.electric.discharge_mode.enabled": "§eРежим разрядки Включен", + "item.electric.discharge_mode.tooltip": "Используйте зажав кнопку Присесть для переключения режима разрядки", + "item.generic.electric_item.stored": "%d/%d EU (%s)", + "item.generic.electric_item.tooltip": "%d/%d EU - Уровень §e%d", + "item.generic.fluid_container.tooltip": "%d/%dЛ %s", + "item.int_circuit.configuration": "§aКонфигурация: §f%d§7", + "item.liquid_fuel_jetpack.tooltip": "Использует топливо, от дизельного генератора, для тяги", + "item.plugin.proxy.tooltips.1": "(Пожалуйста, настройте режим прокси на экране)", + "item.plugin.tooltips.1": "Плагины могут быть добавлены на экран для большей функциональности.", + "item.prospector.mode.bedrock_ore": "§bРежим разведки§r", + "item.prospector.mode.fluid": "§bРежим разведки жидкости", + "item.prospector.mode.ores": "§aРежим разведки руды", + "item.prospector.tooltip.modes": "Возможные режимы:", + "item.prospector.tooltip.radius": "Сканирует в радиусе %s чанка(ов)", + "item.record.sus.tooltip": "§7Leonz - Among Us Drip", + "item.terminal.tooltip": "Правильные инструменты делают хорошую работу", + "item.terminal.tooltip.creative": "§bТворческий режим", + "item.terminal.tooltip.hardware": "§aДополнений: %d", + "item.tool.tooltip.durability": "§fПрочность: §a%d / %d", + "item.tool.tooltip.primary_material": "§fМатериал: §e%s", + "item.tool.tooltip.rotor.efficiency": "Эффективность ротора: §9%d%%", + "item.tool.tooltip.rotor.power": "Мощность турбины: §9%d%%", + "item.tricorder_scanner.tooltip": "То что нужно", "monitor.gui.title.argb": "ARGB:", "monitor.gui.title.back": "Назад", "monitor.gui.title.config": "Конфигурация", @@ -4897,7 +4897,7 @@ "gtceu.mode.both": "§dОба (Жидк. и Предм.)§r", "gtceu.mode.fluid": "§9Жидкость§r", "gtceu.mode.item": "§6Предметы§r", - "metaitem.machine_configuration.mode": "§aРежим конфигурации:§r %s", + "item.machine_configuration.mode": "§aРежим конфигурации:§r %s", "config.gtceu.option.harmlessActiveTransformers": "harmlessActiveTransformers", "config.gtceu.option.gameplay": "gameplay", "block.gtceu.max_energy_input_hatch_16a": "Энергетический входной разъем (16A §c§lMAX §r)", diff --git a/src/main/resources/assets/gtceu/lang/uk_ua.json b/src/main/resources/assets/gtceu/lang/uk_ua.json index ec2ec5f731d..61c2869c21a 100644 --- a/src/main/resources/assets/gtceu/lang/uk_ua.json +++ b/src/main/resources/assets/gtceu/lang/uk_ua.json @@ -358,7 +358,7 @@ "item.gtceu.programmed_circuit.tooltip.3": "на значення цієї плати.", "item.gtceu.sus_record": "Платівка", "item.gtceu.sus_record.desc": "§7підозріло!", - "metaitem.record.sus.tooltip": "§7Leonz - Among Us Drip", + "item.record.sus.tooltip": "§7Leonz - Among Us Drip", "item.gtceu.tool.tooltip.attack_speed": "%s§9 швидкости атаки", "item.gtceu.tool.tooltip.crafting_uses": "%s§a використань у майструванні", @@ -1504,60 +1504,60 @@ "behaviour.lighter.tooltip.usage": "Shift+ПКМ, щоб відкрити/закрити", "item.gtceu.tool.tooltip.repair_info": "§8Утримуйте Shift, щоб показати інформацію з ремонтування", "block.gtceu.wire_coil.tooltip_extended_info": "§7Утримуйте Shift, щоб показати інформацію з бонусу котушки", - "metaitem.behavior.mode_switch.current_mode": "Режим: %s", - "metaitem.behavior.mode_switch.mode_switched": "§eРежим встановлено на: %s", - "metaitem.behavior.mode_switch.tooltip": "Використайте крадькома, щоб змінити режим", - "metaitem.clipboard.tooltip": "Можна записувати (без жодного інструменту для письма). клацніть ПКМ на стіні, щоб розмістити, і Shift+ПКМ, щоб видалити", - "metaitem.cover.digital.mode.energy.disabled": "Клацніть, щоб увімкнути режим енергії", - "metaitem.cover.digital.mode.energy.enabled": "Увімкнено режим енергії", - "metaitem.cover.digital.mode.fluid.disabled": "Клацніть, щоб увімкнути режим рідини", - "metaitem.cover.digital.mode.fluid.enabled": "Увімкнено режим рідини", - "metaitem.cover.digital.mode.item.disabled": "Клацніть, щоб увімкнути режим предметів", - "metaitem.cover.digital.mode.item.enabled": "Увімкнено режим предметів", - "metaitem.cover.digital.mode.machine.disabled": "Клацніть, щоб увімкнути режим машин", - "metaitem.cover.digital.mode.machine.enabled": "Увімкнено режим машин", - "metaitem.cover.digital.mode.proxy.disabled": "Клацніть, щоб увімкнути режим проксі", - "metaitem.cover.digital.mode.proxy.enabled": "Увімкнено режим проксі", - "metaitem.cover.digital.tooltip": "Під'єднує машини за допомогою§f кабелів живлення§7 до§f центрального монітора§7 у вигляді§f кришки§7.", - "metaitem.cover.digital.wireless.tooltip.0": "§fБездротово§7 під'єднує машини до§f центрального монітора§7 у вигляді§f кришки§7.", - "metaitem.cover.digital.wireless.tooltip.1": "§fПКМ§7 по§f центральному монітору§7 для віддаленої прив'язки до нього.", - "metaitem.cover.digital.wireless.tooltip.2": "§fПКМ крадькома§7 для видалення поточної прив'язки.", - "metaitem.cover.digital.wireless.tooltip.3": "§aПрив'язка:§f %s", - "metaitem.crushed.tooltip.purify": "Клацніть ПКМ по казану із водою, щоб отримати очищену руду", - "metaitem.debug_scanner.tooltip": "Трикодер", - "metaitem.tricorder_scanner.tooltip": "Трикодер", - "metaitem.dust.tooltip.purify": "ПКМ по казану, щоб отримати очищений пил", - "metaitem.electric.discharge_mode.disabled": "§eРежим розряджання вимкнено", - "metaitem.electric.discharge_mode.enabled": "§eРежим розряджання увімкнено", - "metaitem.electric.discharge_mode.tooltip": "Використовуйте крадькома, щоб змінити режим розряджання", - "metaitem.generic.electric_item.stored": "%d/%d EU (%s)", - "metaitem.generic.electric_item.tooltip": "%d/%d EU - рівень %s", + "item.behavior.mode_switch.current_mode": "Режим: %s", + "item.behavior.mode_switch.mode_switched": "§eРежим встановлено на: %s", + "item.behavior.mode_switch.tooltip": "Використайте крадькома, щоб змінити режим", + "item.clipboard.tooltip": "Можна записувати (без жодного інструменту для письма). клацніть ПКМ на стіні, щоб розмістити, і Shift+ПКМ, щоб видалити", + "item.cover.digital.mode.energy.disabled": "Клацніть, щоб увімкнути режим енергії", + "item.cover.digital.mode.energy.enabled": "Увімкнено режим енергії", + "item.cover.digital.mode.fluid.disabled": "Клацніть, щоб увімкнути режим рідини", + "item.cover.digital.mode.fluid.enabled": "Увімкнено режим рідини", + "item.cover.digital.mode.item.disabled": "Клацніть, щоб увімкнути режим предметів", + "item.cover.digital.mode.item.enabled": "Увімкнено режим предметів", + "item.cover.digital.mode.machine.disabled": "Клацніть, щоб увімкнути режим машин", + "item.cover.digital.mode.machine.enabled": "Увімкнено режим машин", + "item.cover.digital.mode.proxy.disabled": "Клацніть, щоб увімкнути режим проксі", + "item.cover.digital.mode.proxy.enabled": "Увімкнено режим проксі", + "item.cover.digital.tooltip": "Під'єднує машини за допомогою§f кабелів живлення§7 до§f центрального монітора§7 у вигляді§f кришки§7.", + "item.cover.digital.wireless.tooltip.0": "§fБездротово§7 під'єднує машини до§f центрального монітора§7 у вигляді§f кришки§7.", + "item.cover.digital.wireless.tooltip.1": "§fПКМ§7 по§f центральному монітору§7 для віддаленої прив'язки до нього.", + "item.cover.digital.wireless.tooltip.2": "§fПКМ крадькома§7 для видалення поточної прив'язки.", + "item.cover.digital.wireless.tooltip.3": "§aПрив'язка:§f %s", + "item.crushed.tooltip.purify": "Клацніть ПКМ по казану із водою, щоб отримати очищену руду", + "item.debug_scanner.tooltip": "Трикодер", + "item.tricorder_scanner.tooltip": "Трикодер", + "item.dust.tooltip.purify": "ПКМ по казану, щоб отримати очищений пил", + "item.electric.discharge_mode.disabled": "§eРежим розряджання вимкнено", + "item.electric.discharge_mode.enabled": "§eРежим розряджання увімкнено", + "item.electric.discharge_mode.tooltip": "Використовуйте крадькома, щоб змінити режим розряджання", + "item.generic.electric_item.stored": "%d/%d EU (%s)", + "item.generic.electric_item.tooltip": "%d/%d EU - рівень %s", "item.gtceu.battery.charge_detailed": "%s/%s EU§7 - рівень %s§7 (залишилось %s/%s %s§7)", "item.gtceu.battery.charge_time": "§aHolds %s %s of Power (%s)", "item.gtceu.battery.charge_unit.hour": "годин", "item.gtceu.battery.charge_unit.minute": "хвилин", "item.gtceu.battery.charge_unit.second": "секунд", - "metaitem.generic.fluid_container.tooltip": "%d/%dЛ %s", - "metaitem.int_circuit.configuration": "Конфігурація: %d", - "metaitem.liquid_fuel_jetpack.tooltip": "Використовує паливо внутрішнього згоряння для створення тяги", - "metaitem.machine_configuration.mode": "§aНалаштований режим:§r %s", + "item.generic.fluid_container.tooltip": "%d/%dЛ %s", + "item.int_circuit.configuration": "Конфігурація: %d", + "item.liquid_fuel_jetpack.tooltip": "Використовує паливо внутрішнього згоряння для створення тяги", + "item.machine_configuration.mode": "§aНалаштований режим:§r %s", "gtceu.mode.item": "§6Предмети§r", "gtceu.mode.fluid": "§9Рідини§r", "gtceu.mode.both": "§dСпільний (Рідини та предмети)§r", - "metaitem.plugin.proxy.tooltips.1": "(Будь ласка, налаштуйтеся на режим проксі на екрані)", - "metaitem.plugin.tooltips.1": "На екран можна додати плагіни для більшої функціональності.", - "metaitem.prospector.mode.bedrock_ore": "§bРежим розвідки глибокорінних руд§r", - "metaitem.prospector.mode.fluid": "§bРежим розвідки рідини§r", - "metaitem.prospector.mode.ores": "§aРежим розвідки руд§r", - "metaitem.prospector.tooltip.modes": "Доступні режими:", - "metaitem.prospector.tooltip.radius": "Діапазон сканування в радіусі %s чанків", - "metaitem.terminal.tooltip": "Гострі інструменти роблять гарну роботу", - "metaitem.terminal.tooltip.creative": "§bТворчий режим", - "metaitem.terminal.tooltip.hardware": "§aОбладнання: %d", - "metaitem.tool.tooltip.durability": "§fМіцність:§a %d / %d", - "metaitem.tool.tooltip.primary_material": "§fМатеріал:§e %s", - "metaitem.tool.tooltip.rotor.efficiency": "Ефективність турбіни:§9 %d%%", - "metaitem.tool.tooltip.rotor.power": "Потужність турбіни:§9 %d%%", + "item.plugin.proxy.tooltips.1": "(Будь ласка, налаштуйтеся на режим проксі на екрані)", + "item.plugin.tooltips.1": "На екран можна додати плагіни для більшої функціональності.", + "item.prospector.mode.bedrock_ore": "§bРежим розвідки глибокорінних руд§r", + "item.prospector.mode.fluid": "§bРежим розвідки рідини§r", + "item.prospector.mode.ores": "§aРежим розвідки руд§r", + "item.prospector.tooltip.modes": "Доступні режими:", + "item.prospector.tooltip.radius": "Діапазон сканування в радіусі %s чанків", + "item.terminal.tooltip": "Гострі інструменти роблять гарну роботу", + "item.terminal.tooltip.creative": "§bТворчий режим", + "item.terminal.tooltip.hardware": "§aОбладнання: %d", + "item.tool.tooltip.durability": "§fМіцність:§a %d / %d", + "item.tool.tooltip.primary_material": "§fМатеріал:§e %s", + "item.tool.tooltip.rotor.efficiency": "Ефективність турбіни:§9 %d%%", + "item.tool.tooltip.rotor.power": "Потужність турбіни:§9 %d%%", "gtceu.fluid.gas_vapor": "%s (пара)", "gtceu.fluid.plasma": "%s (плазма)", diff --git a/src/main/resources/assets/gtceu/lang/zh_cn.json b/src/main/resources/assets/gtceu/lang/zh_cn.json index 6e0bfd56fba..00593a12ba6 100644 --- a/src/main/resources/assets/gtceu/lang/zh_cn.json +++ b/src/main/resources/assets/gtceu/lang/zh_cn.json @@ -5345,53 +5345,53 @@ "metaarmor.tooltip.potions": "消除负面效果", "metaarmor.tooltip.speed": "提升奔跑速度", "metaarmor.tooltip.stepassist": "提供步行辅助", - "metaitem.behavior.mode_switch.current_mode": "模式:%s", - "metaitem.behavior.mode_switch.mode_switched": "§e模式设置为:%s", - "metaitem.behavior.mode_switch.tooltip": "潜行右击以切换模式", - "metaitem.clipboard.tooltip": "可以在上面书写(无需任何书写工具)。手持右键在墙面上放置,潜行右击取下。", - "metaitem.cover.digital.mode.energy.disabled": "点击以启用能量模式", - "metaitem.cover.digital.mode.energy.enabled": "已启用能量模式", - "metaitem.cover.digital.mode.fluid.disabled": "点击以启用流体模式", - "metaitem.cover.digital.mode.fluid.enabled": "已启用流体模式", - "metaitem.cover.digital.mode.item.disabled": "点击以启用物品模式", - "metaitem.cover.digital.mode.item.enabled": "已启用物品模式", - "metaitem.cover.digital.mode.machine.disabled": "点击以启用机器模式", - "metaitem.cover.digital.mode.machine.enabled": "已启用机器模式", - "metaitem.cover.digital.mode.proxy.disabled": "点击以启用代理模式", - "metaitem.cover.digital.mode.proxy.enabled": "已启用代理模式", - "metaitem.cover.digital.tooltip": "§7作§f覆盖板§7时通过§f能量线缆f7将机器连接到§f中央监视器§7。", - "metaitem.cover.digital.wireless.tooltip.0": "§7作§f覆盖板§7时§f将机器§f无线§7接入§f中央监控器§7。", - "metaitem.cover.digital.wireless.tooltip.1": "§f手持右击中央监控器§7来进行远程绑定。", - "metaitem.cover.digital.wireless.tooltip.2": "§f手持并潜行右击§7则可移除现有绑定。", - "metaitem.cover.digital.wireless.tooltip.3": "§a绑定至:§f%s", - "metaitem.crushed.tooltip.purify": "右击盛有水的炼药锅以清洗", - "metaitem.debug_scanner.tooltip": "三录仪", - "metaitem.dust.tooltip.purify": "右击盛有水的炼药锅以清洗", - "metaitem.electric.discharge_mode.disabled": "§e释能模式已禁用", - "metaitem.electric.discharge_mode.enabled": "§e释能模式已启用", - "metaitem.electric.discharge_mode.tooltip": "潜行右击以开关释能模式", - "metaitem.generic.electric_item.stored": "%d/%d EU(%s)", - "metaitem.generic.electric_item.tooltip": "%d/%d EU - %s电压", - "metaitem.generic.fluid_container.tooltip": "%d/%dL %s", - "metaitem.int_circuit.configuration": "配置:%d", - "metaitem.liquid_fuel_jetpack.tooltip": "利用内燃发电机的燃料来提供推进动力", - "metaitem.machine_configuration.mode": "§a配置模式:§r%s", - "metaitem.plugin.proxy.tooltips.1": "(请将屏幕调整为代理模式)", - "metaitem.plugin.tooltips.1": "可为屏幕安装插件以实现更多功能。", - "metaitem.prospector.mode.bedrock_ore": "§b基岩矿石勘探模式§r", - "metaitem.prospector.mode.fluid": "§b流体勘探模式§r", - "metaitem.prospector.mode.ores": "§a矿石探勘模式§r", - "metaitem.prospector.tooltip.modes": "可用模式:", - "metaitem.prospector.tooltip.radius": "扫描半径:%s", - "metaitem.record.sus.tooltip": "§7Leonz - Among Us Drip", - "metaitem.terminal.tooltip": "工欲善其事,必先利其器。", - "metaitem.terminal.tooltip.creative": "§b创造模式", - "metaitem.terminal.tooltip.hardware": "§a硬件:%d", - "metaitem.tool.tooltip.durability": "§f耐久度:§a%d / %d", - "metaitem.tool.tooltip.primary_material": "§f材料:§e%s", - "metaitem.tool.tooltip.rotor.efficiency": "涡轮效率:§9%d%%", - "metaitem.tool.tooltip.rotor.power": "涡轮产能:§9%d%%", - "metaitem.tricorder_scanner.tooltip": "三录仪", + "item.behavior.mode_switch.current_mode": "模式:%s", + "item.behavior.mode_switch.mode_switched": "§e模式设置为:%s", + "item.behavior.mode_switch.tooltip": "潜行右击以切换模式", + "item.clipboard.tooltip": "可以在上面书写(无需任何书写工具)。手持右键在墙面上放置,潜行右击取下。", + "item.cover.digital.mode.energy.disabled": "点击以启用能量模式", + "item.cover.digital.mode.energy.enabled": "已启用能量模式", + "item.cover.digital.mode.fluid.disabled": "点击以启用流体模式", + "item.cover.digital.mode.fluid.enabled": "已启用流体模式", + "item.cover.digital.mode.item.disabled": "点击以启用物品模式", + "item.cover.digital.mode.item.enabled": "已启用物品模式", + "item.cover.digital.mode.machine.disabled": "点击以启用机器模式", + "item.cover.digital.mode.machine.enabled": "已启用机器模式", + "item.cover.digital.mode.proxy.disabled": "点击以启用代理模式", + "item.cover.digital.mode.proxy.enabled": "已启用代理模式", + "item.cover.digital.tooltip": "§7作§f覆盖板§7时通过§f能量线缆f7将机器连接到§f中央监视器§7。", + "item.cover.digital.wireless.tooltip.0": "§7作§f覆盖板§7时§f将机器§f无线§7接入§f中央监控器§7。", + "item.cover.digital.wireless.tooltip.1": "§f手持右击中央监控器§7来进行远程绑定。", + "item.cover.digital.wireless.tooltip.2": "§f手持并潜行右击§7则可移除现有绑定。", + "item.cover.digital.wireless.tooltip.3": "§a绑定至:§f%s", + "item.crushed.tooltip.purify": "右击盛有水的炼药锅以清洗", + "item.debug_scanner.tooltip": "三录仪", + "item.dust.tooltip.purify": "右击盛有水的炼药锅以清洗", + "item.electric.discharge_mode.disabled": "§e释能模式已禁用", + "item.electric.discharge_mode.enabled": "§e释能模式已启用", + "item.electric.discharge_mode.tooltip": "潜行右击以开关释能模式", + "item.generic.electric_item.stored": "%d/%d EU(%s)", + "item.generic.electric_item.tooltip": "%d/%d EU - %s电压", + "item.generic.fluid_container.tooltip": "%d/%dL %s", + "item.int_circuit.configuration": "配置:%d", + "item.liquid_fuel_jetpack.tooltip": "利用内燃发电机的燃料来提供推进动力", + "item.machine_configuration.mode": "§a配置模式:§r%s", + "item.plugin.proxy.tooltips.1": "(请将屏幕调整为代理模式)", + "item.plugin.tooltips.1": "可为屏幕安装插件以实现更多功能。", + "item.prospector.mode.bedrock_ore": "§b基岩矿石勘探模式§r", + "item.prospector.mode.fluid": "§b流体勘探模式§r", + "item.prospector.mode.ores": "§a矿石探勘模式§r", + "item.prospector.tooltip.modes": "可用模式:", + "item.prospector.tooltip.radius": "扫描半径:%s", + "item.record.sus.tooltip": "§7Leonz - Among Us Drip", + "item.terminal.tooltip": "工欲善其事,必先利其器。", + "item.terminal.tooltip.creative": "§b创造模式", + "item.terminal.tooltip.hardware": "§a硬件:%d", + "item.tool.tooltip.durability": "§f耐久度:§a%d / %d", + "item.tool.tooltip.primary_material": "§f材料:§e%s", + "item.tool.tooltip.rotor.efficiency": "涡轮效率:§9%d%%", + "item.tool.tooltip.rotor.power": "涡轮产能:§9%d%%", + "item.tricorder_scanner.tooltip": "三录仪", "monitor.gui.title.argb": "ARGB:", "monitor.gui.title.back": "返回", "monitor.gui.title.config": "配置", diff --git a/src/main/resources/assets/gtceu/lang/zh_tw.json b/src/main/resources/assets/gtceu/lang/zh_tw.json index 9440ee33e3f..ef7457bbb46 100644 --- a/src/main/resources/assets/gtceu/lang/zh_tw.json +++ b/src/main/resources/assets/gtceu/lang/zh_tw.json @@ -5345,53 +5345,53 @@ "metaarmor.tooltip.potions": "消除負面效果", "metaarmor.tooltip.speed": "提升奔跑速度", "metaarmor.tooltip.stepassist": "提供步行輔助", - "metaitem.behavior.mode_switch.current_mode": "模式:%s", - "metaitem.behavior.mode_switch.mode_switched": "§e模式設定為:%s", - "metaitem.behavior.mode_switch.tooltip": "潛行右擊以切換模式", - "metaitem.clipboard.tooltip": "可以在上面書寫(無需任何書寫工具)。手持右鍵在牆面上放置,潛行右擊取下。", - "metaitem.cover.digital.mode.energy.disabled": "點選以啟用能量模式", - "metaitem.cover.digital.mode.energy.enabled": "已啟用能量模式", - "metaitem.cover.digital.mode.fluid.disabled": "點選以啟用流體模式", - "metaitem.cover.digital.mode.fluid.enabled": "已啟用流體模式", - "metaitem.cover.digital.mode.item.disabled": "點選以啟用物品模式", - "metaitem.cover.digital.mode.item.enabled": "已啟用物品模式", - "metaitem.cover.digital.mode.machine.disabled": "點選以啟用機器模式", - "metaitem.cover.digital.mode.machine.enabled": "已啟用機器模式", - "metaitem.cover.digital.mode.proxy.disabled": "點選以啟用代理模式", - "metaitem.cover.digital.mode.proxy.enabled": "已啟用代理模式", - "metaitem.cover.digital.tooltip": "§7作§f覆蓋板§7時透過§f能量線纜f7將機器連線到§f中央監視器§7。", - "metaitem.cover.digital.wireless.tooltip.0": "§7作§f覆蓋板§7時§f將機器§f無線§7接入§f中央監控器§7。", - "metaitem.cover.digital.wireless.tooltip.1": "§f手持右擊中央監控器§7來進行遠端綁定。", - "metaitem.cover.digital.wireless.tooltip.2": "§f手持並潛行右擊§7則可移除現有綁定。", - "metaitem.cover.digital.wireless.tooltip.3": "§a綁定至:§f%s", - "metaitem.crushed.tooltip.purify": "右擊盛有水的鍋釜以清洗", - "metaitem.debug_scanner.tooltip": "三錄儀", - "metaitem.dust.tooltip.purify": "右擊盛有水的鍋釜以清洗", - "metaitem.electric.discharge_mode.disabled": "§e釋能模式已禁用", - "metaitem.electric.discharge_mode.enabled": "§e釋能模式已啟用", - "metaitem.electric.discharge_mode.tooltip": "潛行右擊以開關釋能模式", - "metaitem.generic.electric_item.stored": "%d/%d EU(%s)", - "metaitem.generic.electric_item.tooltip": "%d/%d EU - %s電壓", - "metaitem.generic.fluid_container.tooltip": "%d/%dmB %s", - "metaitem.int_circuit.configuration": "設定:%d", - "metaitem.liquid_fuel_jetpack.tooltip": "利用內燃發電機的燃料來提供推進動力", - "metaitem.machine_configuration.mode": "§a設定模式:§r%s", - "metaitem.plugin.proxy.tooltips.1": "(請將螢幕調整為代理模式)", - "metaitem.plugin.tooltips.1": "可為螢幕安裝外掛以實現更多功能。", - "metaitem.prospector.mode.bedrock_ore": "§b基岩礦勘探模式§r", - "metaitem.prospector.mode.fluid": "§b流體勘探模式§r", - "metaitem.prospector.mode.ores": "§a礦探勘模式§r", - "metaitem.prospector.tooltip.modes": "可用模式:", - "metaitem.prospector.tooltip.radius": "掃描半徑:%s", - "metaitem.record.sus.tooltip": "§7Leonz - Among Us Drip", - "metaitem.terminal.tooltip": "工欲善其事,必先利其器。", - "metaitem.terminal.tooltip.creative": "§b創造模式", - "metaitem.terminal.tooltip.hardware": "§a硬體:%d", - "metaitem.tool.tooltip.durability": "§f耐久度:§a%d / %d", - "metaitem.tool.tooltip.primary_material": "§f材料:§e%s", - "metaitem.tool.tooltip.rotor.efficiency": "渦輪效率:§9%d%%", - "metaitem.tool.tooltip.rotor.power": "渦輪產能:§9%d%%", - "metaitem.tricorder_scanner.tooltip": "三錄儀", + "item.behavior.mode_switch.current_mode": "模式:%s", + "item.behavior.mode_switch.mode_switched": "§e模式設定為:%s", + "item.behavior.mode_switch.tooltip": "潛行右擊以切換模式", + "item.clipboard.tooltip": "可以在上面書寫(無需任何書寫工具)。手持右鍵在牆面上放置,潛行右擊取下。", + "item.cover.digital.mode.energy.disabled": "點選以啟用能量模式", + "item.cover.digital.mode.energy.enabled": "已啟用能量模式", + "item.cover.digital.mode.fluid.disabled": "點選以啟用流體模式", + "item.cover.digital.mode.fluid.enabled": "已啟用流體模式", + "item.cover.digital.mode.item.disabled": "點選以啟用物品模式", + "item.cover.digital.mode.item.enabled": "已啟用物品模式", + "item.cover.digital.mode.machine.disabled": "點選以啟用機器模式", + "item.cover.digital.mode.machine.enabled": "已啟用機器模式", + "item.cover.digital.mode.proxy.disabled": "點選以啟用代理模式", + "item.cover.digital.mode.proxy.enabled": "已啟用代理模式", + "item.cover.digital.tooltip": "§7作§f覆蓋板§7時透過§f能量線纜f7將機器連線到§f中央監視器§7。", + "item.cover.digital.wireless.tooltip.0": "§7作§f覆蓋板§7時§f將機器§f無線§7接入§f中央監控器§7。", + "item.cover.digital.wireless.tooltip.1": "§f手持右擊中央監控器§7來進行遠端綁定。", + "item.cover.digital.wireless.tooltip.2": "§f手持並潛行右擊§7則可移除現有綁定。", + "item.cover.digital.wireless.tooltip.3": "§a綁定至:§f%s", + "item.crushed.tooltip.purify": "右擊盛有水的鍋釜以清洗", + "item.debug_scanner.tooltip": "三錄儀", + "item.dust.tooltip.purify": "右擊盛有水的鍋釜以清洗", + "item.electric.discharge_mode.disabled": "§e釋能模式已禁用", + "item.electric.discharge_mode.enabled": "§e釋能模式已啟用", + "item.electric.discharge_mode.tooltip": "潛行右擊以開關釋能模式", + "item.generic.electric_item.stored": "%d/%d EU(%s)", + "item.generic.electric_item.tooltip": "%d/%d EU - %s電壓", + "item.generic.fluid_container.tooltip": "%d/%dmB %s", + "item.int_circuit.configuration": "設定:%d", + "item.liquid_fuel_jetpack.tooltip": "利用內燃發電機的燃料來提供推進動力", + "item.machine_configuration.mode": "§a設定模式:§r%s", + "item.plugin.proxy.tooltips.1": "(請將螢幕調整為代理模式)", + "item.plugin.tooltips.1": "可為螢幕安裝外掛以實現更多功能。", + "item.prospector.mode.bedrock_ore": "§b基岩礦勘探模式§r", + "item.prospector.mode.fluid": "§b流體勘探模式§r", + "item.prospector.mode.ores": "§a礦探勘模式§r", + "item.prospector.tooltip.modes": "可用模式:", + "item.prospector.tooltip.radius": "掃描半徑:%s", + "item.record.sus.tooltip": "§7Leonz - Among Us Drip", + "item.terminal.tooltip": "工欲善其事,必先利其器。", + "item.terminal.tooltip.creative": "§b創造模式", + "item.terminal.tooltip.hardware": "§a硬體:%d", + "item.tool.tooltip.durability": "§f耐久度:§a%d / %d", + "item.tool.tooltip.primary_material": "§f材料:§e%s", + "item.tool.tooltip.rotor.efficiency": "渦輪效率:§9%d%%", + "item.tool.tooltip.rotor.power": "渦輪產能:§9%d%%", + "item.tricorder_scanner.tooltip": "三錄儀", "monitor.gui.title.argb": "ARGB:", "monitor.gui.title.back": "返回", "monitor.gui.title.config": "設定", From d5d50ca029deb719f86295f26a84fe72457e5a48 Mon Sep 17 00:00:00 2001 From: Spicierspace153 <21964509+Spicierspace153@users.noreply.github.com> Date: Thu, 19 Jun 2025 20:12:56 -0600 Subject: [PATCH 03/45] missed this one :( --- .../gtceu/data/lang/BlockLang.java | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java index a91c351f81f..93bc824664a 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java @@ -1,7 +1,9 @@ package com.gregtechceu.gtceu.data.lang; +import com.gregtechceu.gtceu.common.data.GTBlocks; import com.tterrag.registrate.providers.RegistrateLangProvider; +import static com.gregtechceu.gtceu.data.lang.LangHandler.multiLang; import static com.gregtechceu.gtceu.data.lang.LangHandler.replace; public class BlockLang { @@ -97,5 +99,117 @@ private static void initCasingLang(RegistrateLangProvider provider) { provider.add("block.gtceu.normal_laser_pipe.tooltip", "§7Transmitting power with §fno loss§7 in straight lines"); provider.add("block.gtceu.normal_optical_pipe.tooltip", "§7Transmitting §fComputation§7 or §fResearch Data§7"); + + replace(provider, GTBlocks.BATTERY_EMPTY_TIER_I.get().getDescriptionId(), "Empty Tier I Capacitor"); + replace(provider, GTBlocks.BATTERY_LAPOTRONIC_EV.get().getDescriptionId(), "EV Lapotronic Capacitor"); + replace(provider, GTBlocks.BATTERY_LAPOTRONIC_IV.get().getDescriptionId(), "IV Lapotronic Capacitor"); + replace(provider, GTBlocks.BATTERY_EMPTY_TIER_II.get().getDescriptionId(), "Empty Tier II Capacitor"); + replace(provider, GTBlocks.BATTERY_LAPOTRONIC_LuV.get().getDescriptionId(), "LuV Lapotronic Capacitor"); + replace(provider, GTBlocks.BATTERY_LAPOTRONIC_ZPM.get().getDescriptionId(), "ZPM Lapotronic Capacitor"); + replace(provider, GTBlocks.BATTERY_EMPTY_TIER_III.get().getDescriptionId(), "Empty Tier III Capacitor"); + replace(provider, GTBlocks.BATTERY_LAPOTRONIC_UV.get().getDescriptionId(), "UV Lapotronic Capacitor"); + replace(provider, GTBlocks.BATTERY_ULTIMATE_UHV.get().getDescriptionId(), "UHV Ultimate Capacitor"); + + + } + public static void generatePipeKeys(RegistrateLangProvider provider){ + //cable + provider.add("gtceu.cable.voltage", "§aMax Voltage:§r §a%d §a(%s§a)"); + provider.add("gtceu.cable.amperage", "§eMax Amperage:§r §e%d"); + provider.add("gtceu.cable.loss_per_block", "§cLoss/Meter/Ampere:§r §c%d§7 EU-Volt"); + provider.add("gtceu.cable.superconductor", "%s §dSuperconductor"); + + + provider.add("gtceu.fluid_pipe.capacity", "§9Capacity: §f%d mB"); + provider.add("gtceu.fluid_pipe.max_temperature", "§cTemperature Limit: §f%d K"); + provider.add("gtceu.fluid_pipe.channels", "§eChannels: §f%d"); + provider.add("gtceu.fluid_pipe.gas_proof", "§6Can handle Gases"); + provider.add("gtceu.fluid_pipe.acid_proof", "§6Can handle Acids"); + provider.add("gtceu.fluid_pipe.cryo_proof", "§6Can handle Cryogenics"); + provider.add("gtceu.fluid_pipe.plasma_proof", "§6Can handle all Plasmas"); + provider.add("gtceu.fluid_pipe.not_gas_proof", "§4Gases may leak!"); + provider.add("gtceu.item_pipe.priority", "§9Priority: §f%d"); + provider.add("gtceu.duct_pipe.transfer_rate", "§bAir transfer rate: %s"); + + } + + public static void generateMultibockKeys(RegistrateLangProvider provider){ + + provider.add("gtceu.multiblock.work_paused", "Work Paused."); + provider.add("gtceu.multiblock.running", "Running perfectly."); + provider.add("gtceu.multiblock.idling", "§6Idling."); + provider.add("gtceu.multiblock.research_station.researching", "§6Researching."); + provider.add("gtceu.multiblock.not_enough_energy", "WARNING: Machine needs more energy."); + provider.add("gtceu.multiblock.not_enough_energy_output", "WARNING: Energy Dynamo Tier Too Low!"); + provider.add("gtceu.multiblock.waiting", "WARNING: Machine is waiting."); + provider.add("gtceu.multiblock.progress_percent", "Progress: %s%%"); + provider.add("gtceu.multiblock.progress", "Progress: %ss / %ss (%s%%)"); + provider.add("gtceu.multiblock.output_line.0", "%s x §e%s§r (%ss/ea)"); + provider.add("gtceu.multiblock.output_line.1", "%s x §e%s§r (%s/s)"); + provider.add("gtceu.multiblock.output_line.2", "%s ≈ §e%s§r (%ss/ea)"); + provider.add("gtceu.multiblock.output_line.3", "%s ≈ §e%s§r (%s/s)"); + provider.add("gtceu.multiblock.invalid_structure", "Invalid structure."); + provider.add("gtceu.multiblock.invalid_structure.tooltip", + "This block is a controller of the multiblock structure. For building help, see structure template in JEI."); + provider.add("gtceu.multiblock.validation_failed", "Invalid amount of inputs/outputs."); + provider.add("gtceu.multiblock.max_recipe_tier", "Max Recipe Tier: %s"); + provider.add("gtceu.multiblock.max_recipe_tier_hover", "The maximum tier of recipes that can be run"); + provider.add("gtceu.multiblock.max_energy_per_tick", "Max EU/t: §a%s (%s§r)"); + provider.add("gtceu.multiblock.max_energy_per_tick_hover", + "The maximum EU/t available for running recipes or overclocking"); + provider.add("gtceu.multiblock.max_energy_per_tick_amps", "Max EU/t: %s (%sA %s)"); + provider.add("gtceu.multiblock.energy_consumption", "Energy Usage: %s EU/t (%s)"); + provider.add("gtceu.multiblock.generation_eu", "Outputting: §a%s EU/t"); + provider.add("gtceu.multiblock.universal.no_problems", "No Maintenance Problems!"); + provider.add("gtceu.multiblock.universal.has_problems", "Has Maintenance Problems!"); + provider.add("gtceu.multiblock.universal.has_problems_header", + "Fix the following issues in a Maintenance Hatch:"); + provider.add("gtceu.multiblock.universal.problem.wrench", "§7Pipe is loose. (§aWrench§7)"); + provider.add("gtceu.multiblock.universal.problem.screwdriver", "§7Screws are loose. (§aScrewdriver§7)"); + provider.add("gtceu.multiblock.universal.problem.soft_mallet", "§7Something is stuck. (§aSoft Mallet§7)"); + provider.add("gtceu.multiblock.universal.problem.hard_hammer", "§7Plating is dented. (§aHard Hammer§7)"); + provider.add("gtceu.multiblock.universal.problem.wire_cutter", "§7Wires burned out. (§aWire Cutter§7)"); + provider.add("gtceu.multiblock.universal.problem.crowbar", "§7That doesn't belong there. (§aCrowbar§7)"); + provider.add("gtceu.multiblock.universal.muffler_obstructed", "Muffler Hatch is Obstructed!"); + provider.add("gtceu.multiblock.universal.muffler_obstructed.tooltip", + "Muffler Hatch must have a block of airspace in front of it."); + provider.add("gtceu.multiblock.universal.rotor_obstructed", "Rotor is Obstructed!"); + provider.add("gtceu.multiblock.universal.distinct", "Distinct Buses:"); + provider.add("gtceu.multiblock.universal.distinct.no", "No"); + provider.add("gtceu.multiblock.universal.distinct.yes", "Yes"); + provider.add("gtceu.multiblock.universal.distinct.info", + "If enabled, each Item Input Bus will be treated as fully distinct from each other for recipe lookup. Useful for things like Programmed Circuits, Extruder Shapes, etc."); + provider.add("gtceu.multiblock.parallel", "Performing up to %d Recipes in Parallel"); + provider.add("gtceu.multiblock.parallel.exact", "Performing %d Recipes in Parallel"); + provider.add("gtceu.multiblock.multiple_recipemaps.header", "Machine Mode:"); + provider.add("gtceu.multiblock.multiple_recipemaps.tooltip", + "Screwdriver the controller to change which machine mode to use."); + provider.add("gtceu.multiblock.multiple_recipemaps_recipes.tooltip", "Machine Modes: §e%s§r"); + provider.add("gtceu.multiblock.multiple_recipemaps.switch_message", + "The machine must be off to switch modes!"); + provider.add("gtceu.multiblock.preview.zoom", "Use mousewheel or right-click + drag to zoom"); + provider.add("gtceu.multiblock.preview.rotate", "Click and drag to rotate"); + provider.add("gtceu.multiblock.preview.select", "Right-click to check candidates"); + provider.add("gtceu.multiblock.pattern.error", "Expected components (%s) at (%s)."); + provider.add("gtceu.multiblock.pattern.error.limited_exact", "§cExactly: %d§r"); + provider.add("gtceu.multiblock.pattern.error.limited_within", "§cBetween %d and %d§r"); + multiLang(provider, "gtceu.multiblock.pattern.error.limited", "§cMaximum: %d§r", "§cMinimum: %d§r", + "§cMaximum: %d per layer§r", "§cMinimum: %d per layer§r"); + provider.add("gtceu.multiblock.pattern.error.coils", "§cAll heating coils must be the same§r"); + provider.add("gtceu.multiblock.pattern.error.filters", "§cAll filters must be the same§r"); + provider.add("gtceu.multiblock.pattern.error.batteries", "§cAll batteries must be the same§r"); + provider.add("gtceu.multiblock.pattern.clear_amount_1", "§6Must have a clear 1x1x1 space in front§r"); + provider.add("gtceu.multiblock.pattern.clear_amount_3", "§6Must have a clear 3x3x1 space in front§r"); + provider.add("gtceu.multiblock.pattern.single", "§6Only this block can be used§r"); + provider.add("gtceu.multiblock.pattern.location_end", "§cVery End§r"); + provider.add("gtceu.multiblock.pattern.replaceable_air", "Replaceable by Air"); + + provider.add("gtceu.multiblock.computation.max", "Max CWU/t: %s"); + provider.add("gtceu.multiblock.computation.usage", "Using: %s"); + provider.add("gtceu.multiblock.computation.non_bridging", "Non-bridging connection found"); + provider.add("gtceu.multiblock.computation.non_bridging.detailed", + "A Reception Hatch is linked to a machine which cannot bridge"); + provider.add("gtceu.multiblock.computation.not_enough_computation", "Machine needs more computation!"); + } } From 04313ff2b7c4a128866454f947577ea3069f8156 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Thu, 19 Jun 2025 20:17:35 -0600 Subject: [PATCH 04/45] lang util --- .../gtceu/data/lang/AdvancementLang.java | 2 + .../gtceu/data/lang/ArmorLang.java | 2 + .../gtceu/data/lang/BlockLang.java | 3 +- .../gtceu/data/lang/CommandLang.java | 2 + .../gtceu/data/lang/ConfigurationLang.java | 1 + .../gtceu/data/lang/CoverLang.java | 3 +- .../gtceu/data/lang/HazardLang.java | 1 + .../gtceu/data/lang/IntegrationLang.java | 1 + .../gregtechceu/gtceu/data/lang/ItemLang.java | 3 +- .../gtceu/data/lang/LangHandler.java | 252 +---------------- .../gregtechceu/gtceu/data/lang/LangUtil.java | 267 ++++++++++++++++++ .../gtceu/data/lang/MachineLang.java | 2 +- .../gtceu/data/lang/MaterialLang.java | 2 +- .../gtceu/data/lang/RecipeLang.java | 1 + .../gtceu/data/lang/SubtitleLang.java | 1 + .../gregtechceu/gtceu/data/lang/ToolLang.java | 2 +- 16 files changed, 288 insertions(+), 257 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/data/lang/LangUtil.java diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/AdvancementLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/AdvancementLang.java index e4598678378..623cd889aaf 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/AdvancementLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/AdvancementLang.java @@ -2,6 +2,8 @@ import com.tterrag.registrate.providers.RegistrateLangProvider; +import static com.gregtechceu.gtceu.data.lang.LangUtil.*; + public class AdvancementLang { public static void init(RegistrateLangProvider provider) { diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java index 8d84c49f024..7cab8ec6334 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java @@ -2,6 +2,8 @@ import com.tterrag.registrate.providers.RegistrateLangProvider; +import static com.gregtechceu.gtceu.data.lang.LangUtil.*; + public class ArmorLang { public static void generateArmorKeys(RegistrateLangProvider provider) { diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java index 93bc824664a..4dede38b944 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java @@ -3,8 +3,7 @@ import com.gregtechceu.gtceu.common.data.GTBlocks; import com.tterrag.registrate.providers.RegistrateLangProvider; -import static com.gregtechceu.gtceu.data.lang.LangHandler.multiLang; -import static com.gregtechceu.gtceu.data.lang.LangHandler.replace; +import static com.gregtechceu.gtceu.data.lang.LangUtil.*; public class BlockLang { diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java index d6c50f699f3..9922bb969b4 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java @@ -2,6 +2,8 @@ import com.tterrag.registrate.providers.RegistrateLangProvider; +import static com.gregtechceu.gtceu.data.lang.LangUtil.*; + public class CommandLang { public static void generateCommandLang(RegistrateLangProvider provider){ provider.add("command.gtceu.dump_data.success", "Dumped %s resources from registry %s to %s"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java index d24677602c5..bb5c1f68350 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java @@ -2,6 +2,7 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.config.ConfigHolder; +import static com.gregtechceu.gtceu.data.lang.LangUtil.*; import com.tterrag.registrate.providers.RegistrateLangProvider; import dev.toma.configuration.Configuration; diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/CoverLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/CoverLang.java index b62cc2bcf55..5de224b870a 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/CoverLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/CoverLang.java @@ -2,8 +2,7 @@ import com.tterrag.registrate.providers.RegistrateLangProvider; -import static com.gregtechceu.gtceu.data.lang.LangHandler.multiLang; -import static com.gregtechceu.gtceu.data.lang.LangHandler.multilineLang; +import static com.gregtechceu.gtceu.data.lang.LangUtil.*; public class CoverLang { public static void generateCoverKeys(RegistrateLangProvider provider){ diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java index 4ac9b526c64..0ee3f6fa0f9 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.data.lang; import com.tterrag.registrate.providers.RegistrateLangProvider; +import static com.gregtechceu.gtceu.data.lang.LangUtil.*; public class HazardLang { public static void generateHazardKeys(RegistrateLangProvider provider){ diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java index 840c55d4dda..bdc514cbbf8 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java @@ -5,6 +5,7 @@ import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.common.data.GTBedrockFluids; import com.gregtechceu.gtceu.common.data.GTOres; +import static com.gregtechceu.gtceu.data.lang.LangUtil.*; import com.tterrag.registrate.providers.RegistrateLangProvider; diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java index aceb1455231..19f42898573 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java @@ -6,8 +6,7 @@ import com.tterrag.registrate.providers.RegistrateLangProvider; -import static com.gregtechceu.gtceu.data.lang.LangHandler.multilineLang; -import static com.gregtechceu.gtceu.data.lang.LangHandler.replace; +import static com.gregtechceu.gtceu.data.lang.LangUtil.*; import static com.gregtechceu.gtceu.utils.FormattingUtil.toEnglishName; public class ItemLang { diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java index 9ccce0e91a2..cffb8a15884 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -9,6 +9,8 @@ import net.minecraftforge.common.data.LanguageProvider; import com.tterrag.registrate.providers.RegistrateLangProvider; + + import org.jetbrains.annotations.NotNull; import java.lang.reflect.Field; @@ -19,6 +21,8 @@ import java.util.Map; import java.util.stream.Collectors; +import static com.gregtechceu.gtceu.data.lang.LangUtil.*; + public class LangHandler { public static void init(RegistrateLangProvider provider) { @@ -485,252 +489,4 @@ public static void generateTooltipKeys(RegistrateLangProvider provider){ } - - /** - * Returns the sub-key consisting of the given key plus the given index.
- * E.g.,
- * - *
-     * getSubKey("terminal.fluid_prospector.tier", 0)
-     * 
- * - * returns the String: - * - *
-     * 
-     * "terminal.fluid_prospector.tier.0"
-     * 
- * - * @param key Base key of the sub-key. - * @param index Index of the sub-key. - * @return Sub-key consisting of key and index. - */ - protected static String getSubKey(String key, int index) { - return key + "." + index; - } - - /** - * Registers multiple values under the same key with a given provider.
- *
- * For example, a cumbersome way to add translations would be the following:
- * - *
-     * provider.add("terminal.fluid_prospector.tier.0", "radius size 1");
-     * provider.add("terminal.fluid_prospector.tier.1", "radius size 2");
-     * provider.add("terminal.fluid_prospector.tier.2", "radius size 3");
-     * 
- * - * Instead, multiLang can be used for the same result: - * - *
-     * multiLang(provider, "terminal.fluid_prospector.tier", "radius size 1", "radius size 2", "radius size 3");
-     * 
- * - * In situations requiring a large number of generated translations, the - * following could be used instead, which - * generates translations for 100 tiers: - * - *
-     * multiLang(provider, "terminal.fluid_prospector.tier", IntStream.of(100)
-     *                 .map(i -> i + 1)
-     *                 .mapToObj(Integer::toString)
-     *                 .map(i -> "radius size " + i)
-     *                 .toArray(String[]::new));
-     * 
- * - * @param provider The provider to add to. - * @param key Base key of the key-value-pairs. The real key for each - * translation will be appended by ".0" for - * the first, ".1" for the second, etc. This ensures that the - * keys are unique. - * @param values All translation values. - */ - protected static void multiLang(RegistrateLangProvider provider, String key, String... values) { - for (var i = 0; i < values.length; i++) { - provider.add(getSubKey(key, i), values[i]); - } - } - - /** - * Gets all translation components from a multi lang's sub-keys.
- * E.g., given a multi lang: - * - *
-     * multiLang(provider, "terminal.fluid_prospector.tier", "radius size 1", "radius size 2", "radius size 3");
-     * 
- * - * The following code can be used to print out the translations: - * - *
-     * for (var component : getMultiLang("terminal.fluid_prospector.tier")) {
-     *     System.out.println(component.getString());
-     * }
-     * 
- * - * Result: - * - *
-     * radius size 1
-     * radius size 2
-     * radius size 3
-     * 
- * - * @param key Base key of the multi lang. E.g. "terminal.fluid_prospector.tier". - * @return Returns all translation components from a multi lang's sub-keys - */ - public static List getMultiLang(String key) { - var outputKeys = new ArrayList(); - var i = 0; - var next = getSubKey(key, i); - while (Language.getInstance().has(next)) { - outputKeys.add(next); - next = getSubKey(key, ++i); - } - return outputKeys.stream().map(Component::translatable).collect(Collectors.toList()); - } - - /** - * Gets all translation components from a multi lang's sub-keys. Supports - * additional arguments for the translation - * components.
- * E.g., given a multi lang: - * - *
-     * multiLang(provider, "terminal.fluid_prospector.tier", "radius size 1", "radius size 2", "radius size 3");
-     * 
- * - * The following code can be used to print out the translations: - * - *
-     * for (var component : getMultiLang("terminal.fluid_prospector.tier")) {
-     *     System.out.println(component.getString());
-     * }
-     * 
- * - * Result: - * - *
-     * radius size 1
-     * radius size 2
-     * radius size 3
-     * 
- * - * @param key Base key of the multi lang. E.g. "terminal.fluid_prospector.tier". - * @return Returns all translation components from a multi lang's sub-keys. - */ - public static List getMultiLang(String key, Object... args) { - var outputKeys = new ArrayList(); - var i = 0; - var next = getSubKey(key, i); - while (Language.getInstance().has(next)) { - outputKeys.add(next); - next = getSubKey(key, ++i); - } - return outputKeys.stream().map(k -> Component.translatable(k, args)).collect(Collectors.toList()); - } - - /** - * See {@link #getMultiLang(String)}. If no multiline key is available, get - * single instead. - * - * @param key Base key of the multi lang. E.g. "terminal.fluid_prospector.tier". - * @return Returns all translation components from a multi lang's sub-keys. - */ - public static List getSingleOrMultiLang(String key) { - List multiLang = getMultiLang(key); - - if (!multiLang.isEmpty()) { - return multiLang; - } - - return List.of(Component.translatable(key)); - } - - /** - * Gets a single translation from a multi lang. - * - * @param key Base key of the multi lang. E.g. "gtceu.gui.overclock.enabled". - * @param index Index of the single translation. E.g. 3 would return - * "gtceu.gui.overclock.enabled.3". - * @return Returns a single translation from a multi lang. - */ - public static MutableComponent getFromMultiLang(String key, int index) { - return Component.translatable(getSubKey(key, index)); - } - - /** - * Gets a single translation from a multi lang. Supports additional arguments - * for the translation component. - * - * @param key Base key of the multi lang. E.g. "gtceu.gui.overclock.enabled". - * @param index Index of the single translation. E.g. 3 would return - * "gtceu.gui.overclock.enabled.3". - * @return Returns a single translation from a multi lang. - */ - public static MutableComponent getFromMultiLang(String key, int index, Object... args) { - return Component.translatable(getSubKey(key, index), args); - } - - /** - * Adds one key-value-pair to the given lang provider per line in the given - * multiline (a multiline is a String - * containing newline characters).
- * Example: - * - *
-     * multilineLang(provider, "gtceu.gui.overclock.enabled", "Overclocking Enabled.\nClick to Disable");
-     * 
- * - * This results in the following translations:
- * - *
-     * "gtceu.gui.overclock.enabled.0": "Overclocking Enabled.",
-     * "gtceu.gui.overclock.enabled.1": "Click to Disable",
-     * 
- * - * @param provider The provider to add to. - * @param key Base key of the key-value-pair. The real key for each line - * will be appended by ".0" for the - * first line, ".1" for the second, etc. This ensures that the - * keys are unique. - * @param multiline The multiline string. It is a multiline because it contains - * at least one newline character '\n'. - */ - protected static void multilineLang(RegistrateLangProvider provider, String key, String multiline) { - var lines = multiline.split("\n"); - multiLang(provider, key, lines); - } - - /** - * Replace a value in a language provider's mappings - * - * @param provider the provider whose mappings should be modified - * @param key the key for the value - * @param value the value to use in place of the old one - */ - public static void replace(@NotNull RegistrateLangProvider provider, @NotNull String key, - @NotNull String value) { - try { - // the regular lang mappings - Field field = LanguageProvider.class.getDeclaredField("data"); - field.setAccessible(true); - // noinspection unchecked - Map map = (Map) field.get(provider); - map.put(key, value); - - // upside-down lang mappings - Field upsideDownField = RegistrateLangProvider.class.getDeclaredField("upsideDown"); - upsideDownField.setAccessible(true); - // noinspection unchecked - map = (Map) field.get(upsideDownField.get(provider)); - - Method toUpsideDown = RegistrateLangProvider.class.getDeclaredMethod("toUpsideDown", - String.class); - toUpsideDown.setAccessible(true); - - map.put(key, (String) toUpsideDown.invoke(provider, value)); - } catch (NoSuchFieldException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - throw new RuntimeException("Error replacing entry in datagen.", e); - } - } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangUtil.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangUtil.java new file mode 100644 index 00000000000..b0198263c7d --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangUtil.java @@ -0,0 +1,267 @@ +package com.gregtechceu.gtceu.data.lang; + +import com.tterrag.registrate.providers.RegistrateLangProvider; +import net.minecraft.locale.Language; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraftforge.common.data.LanguageProvider; +import org.jetbrains.annotations.NotNull; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class LangUtil { + + /** + * Returns the sub-key consisting of the given key plus the given index.
+ * E.g.,
+ * + *
+     * getSubKey("terminal.fluid_prospector.tier", 0)
+     * 
+ * + * returns the String: + * + *
+     * 
+     * "terminal.fluid_prospector.tier.0"
+     * 
+ * + * @param key Base key of the sub-key. + * @param index Index of the sub-key. + * @return Sub-key consisting of key and index. + */ + protected static String getSubKey(String key, int index) { + return key + "." + index; + } + + /** + * Registers multiple values under the same key with a given provider.
+ *
+ * For example, a cumbersome way to add translations would be the following:
+ * + *
+     * provider.add("terminal.fluid_prospector.tier.0", "radius size 1");
+     * provider.add("terminal.fluid_prospector.tier.1", "radius size 2");
+     * provider.add("terminal.fluid_prospector.tier.2", "radius size 3");
+     * 
+ * + * Instead, multiLang can be used for the same result: + * + *
+     * multiLang(provider, "terminal.fluid_prospector.tier", "radius size 1", "radius size 2", "radius size 3");
+     * 
+ * + * In situations requiring a large number of generated translations, the + * following could be used instead, which + * generates translations for 100 tiers: + * + *
+     * multiLang(provider, "terminal.fluid_prospector.tier", IntStream.of(100)
+     *                 .map(i -> i + 1)
+     *                 .mapToObj(Integer::toString)
+     *                 .map(i -> "radius size " + i)
+     *                 .toArray(String[]::new));
+     * 
+ * + * @param provider The provider to add to. + * @param key Base key of the key-value-pairs. The real key for each + * translation will be appended by ".0" for + * the first, ".1" for the second, etc. This ensures that the + * keys are unique. + * @param values All translation values. + */ + protected static void multiLang(RegistrateLangProvider provider, String key, String... values) { + for (var i = 0; i < values.length; i++) { + provider.add(getSubKey(key, i), values[i]); + } + } + + /** + * Gets all translation components from a multi lang's sub-keys.
+ * E.g., given a multi lang: + * + *
+     * multiLang(provider, "terminal.fluid_prospector.tier", "radius size 1", "radius size 2", "radius size 3");
+     * 
+ * + * The following code can be used to print out the translations: + * + *
+     * for (var component : getMultiLang("terminal.fluid_prospector.tier")) {
+     *     System.out.println(component.getString());
+     * }
+     * 
+ * + * Result: + * + *
+     * radius size 1
+     * radius size 2
+     * radius size 3
+     * 
+ * + * @param key Base key of the multi lang. E.g. "terminal.fluid_prospector.tier". + * @return Returns all translation components from a multi lang's sub-keys + */ + public static List getMultiLang(String key) { + var outputKeys = new ArrayList(); + var i = 0; + var next = getSubKey(key, i); + while (Language.getInstance().has(next)) { + outputKeys.add(next); + next = getSubKey(key, ++i); + } + return outputKeys.stream().map(Component::translatable).collect(Collectors.toList()); + } + + /** + * Gets all translation components from a multi lang's sub-keys. Supports + * additional arguments for the translation + * components.
+ * E.g., given a multi lang: + * + *
+     * multiLang(provider, "terminal.fluid_prospector.tier", "radius size 1", "radius size 2", "radius size 3");
+     * 
+ * + * The following code can be used to print out the translations: + * + *
+     * for (var component : getMultiLang("terminal.fluid_prospector.tier")) {
+     *     System.out.println(component.getString());
+     * }
+     * 
+ * + * Result: + * + *
+     * radius size 1
+     * radius size 2
+     * radius size 3
+     * 
+ * + * @param key Base key of the multi lang. E.g. "terminal.fluid_prospector.tier". + * @return Returns all translation components from a multi lang's sub-keys. + */ + public static List getMultiLang(String key, Object... args) { + var outputKeys = new ArrayList(); + var i = 0; + var next = getSubKey(key, i); + while (Language.getInstance().has(next)) { + outputKeys.add(next); + next = getSubKey(key, ++i); + } + return outputKeys.stream().map(k -> Component.translatable(k, args)).collect(Collectors.toList()); + } + + /** + * See {@link #getMultiLang(String)}. If no multiline key is available, get + * single instead. + * + * @param key Base key of the multi lang. E.g. "terminal.fluid_prospector.tier". + * @return Returns all translation components from a multi lang's sub-keys. + */ + public static List getSingleOrMultiLang(String key) { + List multiLang = getMultiLang(key); + + if (!multiLang.isEmpty()) { + return multiLang; + } + + return List.of(Component.translatable(key)); + } + + /** + * Gets a single translation from a multi lang. + * + * @param key Base key of the multi lang. E.g. "gtceu.gui.overclock.enabled". + * @param index Index of the single translation. E.g. 3 would return + * "gtceu.gui.overclock.enabled.3". + * @return Returns a single translation from a multi lang. + */ + public static MutableComponent getFromMultiLang(String key, int index) { + return Component.translatable(getSubKey(key, index)); + } + + /** + * Gets a single translation from a multi lang. Supports additional arguments + * for the translation component. + * + * @param key Base key of the multi lang. E.g. "gtceu.gui.overclock.enabled". + * @param index Index of the single translation. E.g. 3 would return + * "gtceu.gui.overclock.enabled.3". + * @return Returns a single translation from a multi lang. + */ + public static MutableComponent getFromMultiLang(String key, int index, Object... args) { + return Component.translatable(getSubKey(key, index), args); + } + + /** + * Adds one key-value-pair to the given lang provider per line in the given + * multiline (a multiline is a String + * containing newline characters).
+ * Example: + * + *
+     * multilineLang(provider, "gtceu.gui.overclock.enabled", "Overclocking Enabled.\nClick to Disable");
+     * 
+ * + * This results in the following translations:
+ * + *
+     * "gtceu.gui.overclock.enabled.0": "Overclocking Enabled.",
+     * "gtceu.gui.overclock.enabled.1": "Click to Disable",
+     * 
+ * + * @param provider The provider to add to. + * @param key Base key of the key-value-pair. The real key for each line + * will be appended by ".0" for the + * first line, ".1" for the second, etc. This ensures that the + * keys are unique. + * @param multiline The multiline string. It is a multiline because it contains + * at least one newline character '\n'. + */ + protected static void multilineLang(RegistrateLangProvider provider, String key, String multiline) { + var lines = multiline.split("\n"); + multiLang(provider, key, lines); + } + + /** + * Replace a value in a language provider's mappings + * + * @param provider the provider whose mappings should be modified + * @param key the key for the value + * @param value the value to use in place of the old one + */ + public static void replace(@NotNull RegistrateLangProvider provider, @NotNull String key, + @NotNull String value) { + try { + // the regular lang mappings + Field field = LanguageProvider.class.getDeclaredField("data"); + field.setAccessible(true); + // noinspection unchecked + Map map = (Map) field.get(provider); + map.put(key, value); + + // upside-down lang mappings + Field upsideDownField = RegistrateLangProvider.class.getDeclaredField("upsideDown"); + upsideDownField.setAccessible(true); + // noinspection unchecked + map = (Map) field.get(upsideDownField.get(provider)); + + Method toUpsideDown = RegistrateLangProvider.class.getDeclaredMethod("toUpsideDown", + String.class); + toUpsideDown.setAccessible(true); + + map.put(key, (String) toUpsideDown.invoke(provider, value)); + } catch (NoSuchFieldException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException("Error replacing entry in datagen.", e); + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java index b991f3eaf28..b285b7a6781 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java @@ -2,7 +2,7 @@ import com.tterrag.registrate.providers.RegistrateLangProvider; -import static com.gregtechceu.gtceu.data.lang.LangHandler.*; +import static com.gregtechceu.gtceu.data.lang.LangUtil.*; public class MachineLang { diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java index 0fda0871b89..4de09c6f472 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java @@ -6,7 +6,7 @@ import com.gregtechceu.gtceu.common.data.GTMaterials; import com.tterrag.registrate.providers.RegistrateLangProvider; -import static com.gregtechceu.gtceu.data.lang.LangHandler.replace; +import static com.gregtechceu.gtceu.data.lang.LangUtil.*; import static com.gregtechceu.gtceu.utils.FormattingUtil.toEnglishName; public class MaterialLang { diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java index f3681648d80..00c57fc0404 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.data.lang; import com.tterrag.registrate.providers.RegistrateLangProvider; +import static com.gregtechceu.gtceu.data.lang.LangUtil.*; public class RecipeLang { diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/SubtitleLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/SubtitleLang.java index 42d37a942eb..ad9b2d4fa06 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/SubtitleLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/SubtitleLang.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.data.lang; import com.tterrag.registrate.providers.RegistrateLangProvider; +import static com.gregtechceu.gtceu.data.lang.LangUtil.*; public class SubtitleLang { public static void generateSubtitleKeys(RegistrateLangProvider provider) { diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java index 6e4f66ff784..3672377b534 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java @@ -2,7 +2,7 @@ import com.tterrag.registrate.providers.RegistrateLangProvider; -import static com.gregtechceu.gtceu.data.lang.LangHandler.*; +import static com.gregtechceu.gtceu.data.lang.LangUtil.*; public class ToolLang { From 6f83930795383074bdf2ca4bd330857997b3d41b Mon Sep 17 00:00:00 2001 From: Spicierspace153 <21964509+Spicierspace153@users.noreply.github.com> Date: Thu, 19 Jun 2025 20:33:13 -0600 Subject: [PATCH 05/45] armorLang.java cleanup --- .../resources/assets/gtceu/lang/en_ud.json | 86 +++++++------- .../resources/assets/gtceu/lang/en_us.json | 86 +++++++------- .../gtceu/api/item/armor/ArmorLogicSuite.java | 2 +- .../item/armor/AdvancedNanoMuscleSuite.java | 50 ++++---- .../item/armor/AdvancedQuarkTechSuite.java | 50 ++++---- .../gtceu/common/item/armor/IJetpack.java | 2 +- .../gtceu/common/item/armor/Jetpack.java | 28 ++--- .../common/item/armor/NanoMuscleSuite.java | 14 +-- .../common/item/armor/NightvisionGoggles.java | 10 +- .../common/item/armor/PowerlessJetpack.java | 30 ++--- .../common/item/armor/QuarkTechSuite.java | 28 ++--- .../gtceu/data/lang/ArmorLang.java | 112 +++++++++++------- .../resources/assets/gtceu/lang/ja_jp.json | 86 +++++++------- .../resources/assets/gtceu/lang/ru_ru.json | 86 +++++++------- .../resources/assets/gtceu/lang/uk_ua.json | 86 +++++++------- .../resources/assets/gtceu/lang/zh_cn.json | 86 +++++++------- .../resources/assets/gtceu/lang/zh_tw.json | 86 +++++++------- 17 files changed, 476 insertions(+), 452 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index b82a1b263e4..64d5eb045ea 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -5313,49 +5313,49 @@ "material.gtceu.zirconium": "ɯnıuoɔɹıZ", "message.gtceu.new_veins.amount": "¡suıǝʌ ʍǝu %d pǝʇɔǝdsoɹԀ", "message.gtceu.new_veins.name": "¡%s pǝʇɔǝdsoɹԀ", - "metaarmor.energy_share.disable": "pǝןqɐsıp buıbɹɐɥɔ sʇǝbpɐ⅁ :ʎןddnS ʎbɹǝuƎ", - "metaarmor.energy_share.enable": "pǝןqɐuǝ buıbɹɐɥɔ sʇǝbpɐ⅁ :ʎןddnS ʎbɹǝuƎ", - "metaarmor.energy_share.error": "¡buıbɹɐɥɔ sʇǝbpɐb ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ʎןddnS ʎbɹǝuƎ", - "metaarmor.energy_share.tooltip": "%s :ǝpoɯ ʎןddnS", - "metaarmor.energy_share.tooltip.guide": "ɯǝʇı buıpןoɥ uǝɥʍ ʞɔıןɔ ʇɥbıɹ-ʇɟıɥs ǝpoɯ ǝbuɐɥɔ o⟘", - "metaarmor.hud.energy_lvl": "%s :ןǝʌǝꞀ ʎbɹǝuƎ", - "metaarmor.hud.engine_enabled": "%s :pǝןqɐuƎ ǝuıbuƎ", - "metaarmor.hud.fuel_lvl": "%s :ןǝʌǝꞀ ןǝnℲ", - "metaarmor.hud.gravi_engine": "%s :ǝuıbuƎıʌɐɹ⅁", - "metaarmor.hud.hover_mode": "%s :ǝpoW ɹǝʌoH", - "metaarmor.hud.status.disabled": "ℲℲOɔ§", - "metaarmor.hud.status.enabled": "NOɐ§", - "metaarmor.jetpack.emergency_hover_mode": "¡pǝןqɐuƎ ǝpoW ɹǝʌoH ʎɔuǝbɹǝɯƎ", - "metaarmor.jetpack.flight.disable": "pǝןqɐsıᗡ ʇɥbıןℲ :ʞɔɐdʇǝſ", - "metaarmor.jetpack.flight.enable": "pǝןqɐuƎ ʇɥbıןℲ :ʞɔɐdʇǝſ", - "metaarmor.jetpack.hover.disable": "pǝןqɐsıᗡ ǝpoW ɹǝʌoH :ʞɔɐdʇǝſ", - "metaarmor.jetpack.hover.enable": "pǝןqɐuƎ ǝpoW ɹǝʌoH :ʞɔɐdʇǝſ", - "metaarmor.message.nightvision.disabled": "ɟɟOɔ§ :uoısıΛʇɥbıNq§", - "metaarmor.message.nightvision.enabled": "uOɐ§ :uoısıΛʇɥbıNq§", - "metaarmor.message.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§", - "metaarmor.nms.boosted_jump.disabled": "pǝןqɐsıᗡ ʇsooᗺ dɯnſ :ǝʇınS ™ǝןɔsnWouɐN", - "metaarmor.nms.boosted_jump.enabled": "pǝןqɐuƎ ʇsooᗺ dɯnſ :ǝʇınS ™ǝןɔsnWouɐN", - "metaarmor.nms.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıN :ǝʇınS ™ǝןɔsnWouɐN", - "metaarmor.nms.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıN :ǝʇınS ™ǝןɔsnWouɐN", - "metaarmor.nms.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", - "metaarmor.nms.share.disable": "pǝןqɐsıᗡ buıbɹɐɥƆ :ǝʇınS ™ǝןɔsnWouɐN", - "metaarmor.nms.share.enable": "pǝןqɐuƎ buıbɹɐɥƆ :ǝʇınS ™ǝןɔsnWouɐN", - "metaarmor.nms.share.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", - "metaarmor.qts.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıN :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "metaarmor.qts.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıN :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "metaarmor.qts.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "metaarmor.qts.share.disable": "pǝןqɐsıᗡ buıbɹɐɥƆ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "metaarmor.qts.share.enable": "pǝןqɐuƎ buıbɹɐɥƆ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "metaarmor.qts.share.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "metaarmor.tooltip.autoeat": "ʎɹoʇuǝʌuI ɯoɹɟ pooℲ buıs∩ ʎq ɹɐᗺ pooℲ sǝɥsıuǝןdǝᴚ", - "metaarmor.tooltip.breath": "ɹɐᗺ ɥʇɐǝɹᗺ ɹǝʇɐʍɹǝpu∩ sǝɥsıuǝןdǝᴚ", - "metaarmor.tooltip.burning": "buıuɹnᗺ sǝıɟıןןnN", - "metaarmor.tooltip.falldamage": "ǝbɐɯɐᗡ ןןɐℲ sǝıɟıןןnN", - "metaarmor.tooltip.freezing": "buızǝǝɹℲ sʇuǝʌǝɹԀ", - "metaarmor.tooltip.jump": "ǝɔuɐʇsıᗡ puɐ ʇɥbıǝH dɯnſ sǝsɐǝɹɔuI", - "metaarmor.tooltip.potions": "sʇɔǝɟɟƎ ןnɟɯɹɐH sǝıɟıןןnN", - "metaarmor.tooltip.speed": "pǝǝdS buıuunᴚ sǝsɐǝɹɔuI", - "metaarmor.tooltip.stepassist": "ʇsıssⱯ-dǝʇS sǝpıʌoɹԀ", + "armor.gtceu.energy_share.disable": "pǝןqɐsıp buıbɹɐɥɔ sʇǝbpɐ⅁ :ʎןddnS ʎbɹǝuƎ", + "armor.gtceu.energy_share.enable": "pǝןqɐuǝ buıbɹɐɥɔ sʇǝbpɐ⅁ :ʎןddnS ʎbɹǝuƎ", + "armor.gtceu.energy_share.error": "¡buıbɹɐɥɔ sʇǝbpɐb ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ʎןddnS ʎbɹǝuƎ", + "armor.gtceu.energy_share.tooltip": "%s :ǝpoɯ ʎןddnS", + "armor.gtceu.energy_share.tooltip.guide": "ɯǝʇı buıpןoɥ uǝɥʍ ʞɔıןɔ ʇɥbıɹ-ʇɟıɥs ǝpoɯ ǝbuɐɥɔ o⟘", + "armor.gtceu.hud.energy_lvl": "%s :ןǝʌǝꞀ ʎbɹǝuƎ", + "armor.gtceu.hud.engine_enabled": "%s :pǝןqɐuƎ ǝuıbuƎ", + "armor.gtceu.hud.fuel_lvl": "%s :ןǝʌǝꞀ ןǝnℲ", + "armor.gtceu.hud.gravi_engine": "%s :ǝuıbuƎıʌɐɹ⅁", + "armor.gtceu.hud.hover_mode": "%s :ǝpoW ɹǝʌoH", + "armor.gtceu.hud.status.disabled": "ℲℲOɔ§", + "armor.gtceu.hud.status.enabled": "NOɐ§", + "armor.gtceu.jetpack.emergency_hover_mode": "¡pǝןqɐuƎ ǝpoW ɹǝʌoH ʎɔuǝbɹǝɯƎ", + "armor.gtceu.jetpack.flight.disable": "pǝןqɐsıᗡ ʇɥbıןℲ :ʞɔɐdʇǝſ", + "armor.gtceu.jetpack.flight.enable": "pǝןqɐuƎ ʇɥbıןℲ :ʞɔɐdʇǝſ", + "armor.gtceu.jetpack.hover.disable": "pǝןqɐsıᗡ ǝpoW ɹǝʌoH :ʞɔɐdʇǝſ", + "armor.gtceu.jetpack.hover.enable": "pǝןqɐuƎ ǝpoW ɹǝʌoH :ʞɔɐdʇǝſ", + "armor.gtceu.message.nightvision.disabled": "ɟɟOɔ§ :uoısıΛʇɥbıNq§", + "armor.gtceu.message.nightvision.enabled": "uOɐ§ :uoısıΛʇɥbıNq§", + "armor.gtceu.message.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§", + "armor.gtceu.nms.boosted_jump.disabled": "pǝןqɐsıᗡ ʇsooᗺ dɯnſ :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.nms.boosted_jump.enabled": "pǝןqɐuƎ ʇsooᗺ dɯnſ :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.nms.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıN :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.nms.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıN :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.nms.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.nms.share.disable": "pǝןqɐsıᗡ buıbɹɐɥƆ :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.nms.share.enable": "pǝןqɐuƎ buıbɹɐɥƆ :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.nms.share.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.qts.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıN :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.qts.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıN :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.qts.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.qts.share.disable": "pǝןqɐsıᗡ buıbɹɐɥƆ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.qts.share.enable": "pǝןqɐuƎ buıbɹɐɥƆ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.qts.share.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.tooltip.autoeat": "ʎɹoʇuǝʌuI ɯoɹɟ pooℲ buıs∩ ʎq ɹɐᗺ pooℲ sǝɥsıuǝןdǝᴚ", + "armor.gtceu.tooltip.breath": "ɹɐᗺ ɥʇɐǝɹᗺ ɹǝʇɐʍɹǝpu∩ sǝɥsıuǝןdǝᴚ", + "armor.gtceu.tooltip.burning": "buıuɹnᗺ sǝıɟıןןnN", + "armor.gtceu.tooltip.falldamage": "ǝbɐɯɐᗡ ןןɐℲ sǝıɟıןןnN", + "armor.gtceu.tooltip.freezing": "buızǝǝɹℲ sʇuǝʌǝɹԀ", + "armor.gtceu.tooltip.jump": "ǝɔuɐʇsıᗡ puɐ ʇɥbıǝH dɯnſ sǝsɐǝɹɔuI", + "armor.gtceu.tooltip.potions": "sʇɔǝɟɟƎ ןnɟɯɹɐH sǝıɟıןןnN", + "armor.gtceu.tooltip.speed": "pǝǝdS buıuunᴚ sǝsɐǝɹɔuI", + "armor.gtceu.tooltip.stepassist": "ʇsıssⱯ-dǝʇS sǝpıʌoɹԀ", "item.behavior.mode_switch.current_mode": "%s :ǝpoW", "item.behavior.mode_switch.mode_switched": "%s :oʇ ʇǝS ǝpoWǝ§", "item.behavior.mode_switch.tooltip": "ǝpoɯ ɥɔʇıʍs oʇ buıʞɐǝus ǝןıɥʍ ǝs∩", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 35c60dbef03..caf73ed9093 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -5313,49 +5313,49 @@ "material.gtceu.zirconium": "Zirconium", "message.gtceu.new_veins.amount": "Prospected %d new veins!", "message.gtceu.new_veins.name": "Prospected %s!", - "metaarmor.energy_share.disable": "Energy Supply: Gadgets charging disabled", - "metaarmor.energy_share.enable": "Energy Supply: Gadgets charging enabled", - "metaarmor.energy_share.error": "Energy Supply: §cNot enough power for gadgets charging!", - "metaarmor.energy_share.tooltip": "Supply mode: %s", - "metaarmor.energy_share.tooltip.guide": "To change mode shift-right click when holding item", - "metaarmor.hud.energy_lvl": "Energy Level: %s", - "metaarmor.hud.engine_enabled": "Engine Enabled: %s", - "metaarmor.hud.fuel_lvl": "Fuel Level: %s", - "metaarmor.hud.gravi_engine": "GraviEngine: %s", - "metaarmor.hud.hover_mode": "Hover Mode: %s", - "metaarmor.hud.status.disabled": "§cOFF", - "metaarmor.hud.status.enabled": "§aON", - "metaarmor.jetpack.emergency_hover_mode": "Emergency Hover Mode Enabled!", - "metaarmor.jetpack.flight.disable": "Jetpack: Flight Disabled", - "metaarmor.jetpack.flight.enable": "Jetpack: Flight Enabled", - "metaarmor.jetpack.hover.disable": "Jetpack: Hover Mode Disabled", - "metaarmor.jetpack.hover.enable": "Jetpack: Hover Mode Enabled", - "metaarmor.message.nightvision.disabled": "§bNightVision: §cOff", - "metaarmor.message.nightvision.enabled": "§bNightVision: §aOn", - "metaarmor.message.nightvision.error": "§cNot enough power!", - "metaarmor.nms.boosted_jump.disabled": "NanoMuscle™ Suite: Jump Boost Disabled", - "metaarmor.nms.boosted_jump.enabled": "NanoMuscle™ Suite: Jump Boost Enabled", - "metaarmor.nms.nightvision.disabled": "NanoMuscle™ Suite: NightVision Disabled", - "metaarmor.nms.nightvision.enabled": "NanoMuscle™ Suite: NightVision Enabled", - "metaarmor.nms.nightvision.error": "NanoMuscle™ Suite: §cNot enough power!", - "metaarmor.nms.share.disable": "NanoMuscle™ Suite: Charging Disabled", - "metaarmor.nms.share.enable": "NanoMuscle™ Suite: Charging Enabled", - "metaarmor.nms.share.error": "NanoMuscle™ Suite: §cNot enough power for charging!", - "metaarmor.qts.nightvision.disabled": "QuarkTech™ Suite: NightVision Disabled", - "metaarmor.qts.nightvision.enabled": "QuarkTech™ Suite: NightVision Enabled", - "metaarmor.qts.nightvision.error": "QuarkTech™ Suite: §cNot enough power!", - "metaarmor.qts.share.disable": "QuarkTech™ Suite: Charging Disabled", - "metaarmor.qts.share.enable": "QuarkTech™ Suite: Charging Enabled", - "metaarmor.qts.share.error": "QuarkTech™ Suite: §cNot enough power for charging!", - "metaarmor.tooltip.autoeat": "Replenishes Food Bar by Using Food from Inventory", - "metaarmor.tooltip.breath": "Replenishes Underwater Breath Bar", - "metaarmor.tooltip.burning": "Nullifies Burning", - "metaarmor.tooltip.falldamage": "Nullifies Fall Damage", - "metaarmor.tooltip.freezing": "Prevents Freezing", - "metaarmor.tooltip.jump": "Increases Jump Height and Distance", - "metaarmor.tooltip.potions": "Nullifies Harmful Effects", - "metaarmor.tooltip.speed": "Increases Running Speed", - "metaarmor.tooltip.stepassist": "Provides Step-Assist", + "armor.gtceu.energy_share.disable": "Energy Supply: Gadgets charging disabled", + "armor.gtceu.energy_share.enable": "Energy Supply: Gadgets charging enabled", + "armor.gtceu.energy_share.error": "Energy Supply: §cNot enough power for gadgets charging!", + "armor.gtceu.energy_share.tooltip": "Supply mode: %s", + "armor.gtceu.energy_share.tooltip.guide": "To change mode shift-right click when holding item", + "armor.gtceu.hud.energy_lvl": "Energy Level: %s", + "armor.gtceu.hud.engine_enabled": "Engine Enabled: %s", + "armor.gtceu.hud.fuel_lvl": "Fuel Level: %s", + "armor.gtceu.hud.gravi_engine": "GraviEngine: %s", + "armor.gtceu.hud.hover_mode": "Hover Mode: %s", + "armor.gtceu.hud.status.disabled": "§cOFF", + "armor.gtceu.hud.status.enabled": "§aON", + "armor.gtceu.jetpack.emergency_hover_mode": "Emergency Hover Mode Enabled!", + "armor.gtceu.jetpack.flight.disable": "Jetpack: Flight Disabled", + "armor.gtceu.jetpack.flight.enable": "Jetpack: Flight Enabled", + "armor.gtceu.jetpack.hover.disable": "Jetpack: Hover Mode Disabled", + "armor.gtceu.jetpack.hover.enable": "Jetpack: Hover Mode Enabled", + "armor.gtceu.message.nightvision.disabled": "§bNightVision: §cOff", + "armor.gtceu.message.nightvision.enabled": "§bNightVision: §aOn", + "armor.gtceu.message.nightvision.error": "§cNot enough power!", + "armor.gtceu.nms.boosted_jump.disabled": "NanoMuscle™ Suite: Jump Boost Disabled", + "armor.gtceu.nms.boosted_jump.enabled": "NanoMuscle™ Suite: Jump Boost Enabled", + "armor.gtceu.nms.nightvision.disabled": "NanoMuscle™ Suite: NightVision Disabled", + "armor.gtceu.nms.nightvision.enabled": "NanoMuscle™ Suite: NightVision Enabled", + "armor.gtceu.nms.nightvision.error": "NanoMuscle™ Suite: §cNot enough power!", + "armor.gtceu.nms.share.disable": "NanoMuscle™ Suite: Charging Disabled", + "armor.gtceu.nms.share.enable": "NanoMuscle™ Suite: Charging Enabled", + "armor.gtceu.nms.share.error": "NanoMuscle™ Suite: §cNot enough power for charging!", + "armor.gtceu.qts.nightvision.disabled": "QuarkTech™ Suite: NightVision Disabled", + "armor.gtceu.qts.nightvision.enabled": "QuarkTech™ Suite: NightVision Enabled", + "armor.gtceu.qts.nightvision.error": "QuarkTech™ Suite: §cNot enough power!", + "armor.gtceu.qts.share.disable": "QuarkTech™ Suite: Charging Disabled", + "armor.gtceu.qts.share.enable": "QuarkTech™ Suite: Charging Enabled", + "armor.gtceu.qts.share.error": "QuarkTech™ Suite: §cNot enough power for charging!", + "armor.gtceu.tooltip.autoeat": "Replenishes Food Bar by Using Food from Inventory", + "armor.gtceu.tooltip.breath": "Replenishes Underwater Breath Bar", + "armor.gtceu.tooltip.burning": "Nullifies Burning", + "armor.gtceu.tooltip.falldamage": "Nullifies Fall Damage", + "armor.gtceu.tooltip.freezing": "Prevents Freezing", + "armor.gtceu.tooltip.jump": "Increases Jump Height and Distance", + "armor.gtceu.tooltip.potions": "Nullifies Harmful Effects", + "armor.gtceu.tooltip.speed": "Increases Running Speed", + "armor.gtceu.tooltip.stepassist": "Provides Step-Assist", "item.behavior.mode_switch.current_mode": "Mode: %s", "item.behavior.mode_switch.mode_switched": "§eMode Set to: %s", "item.behavior.mode_switch.tooltip": "Use while sneaking to switch mode", diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/armor/ArmorLogicSuite.java b/src/main/java/com/gregtechceu/gtceu/api/item/armor/ArmorLogicSuite.java index 8fdf231f41d..060d8f064ad 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/armor/ArmorLogicSuite.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/armor/ArmorLogicSuite.java @@ -124,7 +124,7 @@ protected static void addCapacityHUD(ItemStack stack, ArmorUtils.ModularHUD hud) if (cont.getCharge() == 0) return; float energyMultiplier = cont.getCharge() * 100.0F / cont.getMaxCharge(); hud.newString( - Component.translatable("metaarmor.hud.energy_lvl", String.format("%.1f", energyMultiplier) + "%")); + Component.translatable("armor.gtceu.hud.energy_lvl", String.format("%.1f", energyMultiplier) + "%")); } @OnlyIn(Dist.CLIENT) diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedNanoMuscleSuite.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedNanoMuscleSuite.java index c1f0190a701..970e067729a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedNanoMuscleSuite.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedNanoMuscleSuite.java @@ -66,19 +66,19 @@ public void onArmorTick(Level world, Player player, @NotNull ItemStack item) { if (toggleTimer == 0) { if (KeyBind.JETPACK_ENABLE.isKeyDown(player)) { jetpackEnabled = !jetpackEnabled; - messageKey = "metaarmor.jetpack.flight." + (jetpackEnabled ? "enable" : "disable"); + messageKey = "armor.gtceu.jetpack.flight." + (jetpackEnabled ? "enable" : "disable"); data.putBoolean("enabled", jetpackEnabled); } else if (KeyBind.ARMOR_HOVER.isKeyDown(player)) { hoverMode = !hoverMode; - messageKey = "metaarmor.jetpack.hover." + (hoverMode ? "enable" : "disable"); + messageKey = "armor.gtceu.jetpack.hover." + (hoverMode ? "enable" : "disable"); data.putBoolean("hover", hoverMode); } else if (KeyBind.ARMOR_CHARGING.isKeyDown(player)) { canShare = !canShare; if (canShare && cont.getCharge() == 0) { // Only allow for charging to be enabled if charge is nonzero - messageKey = "metaarmor.nms.share.error"; + messageKey = "armor.gtceu.nms.share.error"; canShare = false; } else { - messageKey = "metaarmor.nms.share." + (canShare ? "enable" : "disable"); + messageKey = "armor.gtceu.nms.share." + (canShare ? "enable" : "disable"); } data.putBoolean("canShare", canShare); } @@ -147,20 +147,20 @@ public void addInfo(ItemStack itemStack, List lines) { CompoundTag data = itemStack.getOrCreateTag(); Component state; boolean enabled = !data.contains("enabled") || data.getBoolean("enabled"); - state = enabled ? Component.translatable("metaarmor.hud.status.enabled") : - Component.translatable("metaarmor.hud.status.disabled"); - lines.add(Component.translatable("metaarmor.hud.engine_enabled", state)); + state = enabled ? Component.translatable("armor.gtceu.hud.status.enabled") : + Component.translatable("armor.gtceu.hud.status.disabled"); + lines.add(Component.translatable("armor.gtceu.hud.engine_enabled", state)); boolean canShare = data.contains("canShare") && data.getBoolean("canShare"); - state = canShare ? Component.translatable("metaarmor.hud.status.enabled") : - Component.translatable("metaarmor.hud.status.disabled"); - lines.add(Component.translatable("metaarmor.energy_share.tooltip", state)); - lines.add(Component.translatable("metaarmor.energy_share.tooltip.guide")); + state = canShare ? Component.translatable("armor.gtceu.hud.status.enabled") : + Component.translatable("armor.gtceu.hud.status.disabled"); + lines.add(Component.translatable("armor.gtceu.energy_share.tooltip", state)); + lines.add(Component.translatable("armor.gtceu.energy_share.tooltip.guide")); boolean hover = data.contains("hover") && data.getBoolean("hover"); - state = hover ? Component.translatable("metaarmor.hud.status.enabled") : - Component.translatable("metaarmor.hud.status.disabled"); - lines.add(Component.translatable("metaarmor.hud.hover_mode", state)); + state = hover ? Component.translatable("armor.gtceu.hud.status.enabled") : + Component.translatable("armor.gtceu.hud.status.disabled"); + lines.add(Component.translatable("armor.gtceu.hud.hover_mode", state)); } @Override @@ -178,11 +178,11 @@ public InteractionResultHolder onRightClick(Level world, @NotNull Pla canShare = !canShare; if (!world.isClientSide) { if (canShare && cont.getCharge() == 0) { - player.sendSystemMessage(Component.translatable("metaarmor.energy_share.error")); + player.sendSystemMessage(Component.translatable("armor.gtceu.energy_share.error")); } else if (canShare) { - player.sendSystemMessage(Component.translatable("metaarmor.energy_share.enable")); + player.sendSystemMessage(Component.translatable("armor.gtceu.energy_share.enable")); } else { - player.sendSystemMessage(Component.translatable("metaarmor.energy_share.disable")); + player.sendSystemMessage(Component.translatable("armor.gtceu.energy_share.disable")); } } @@ -205,21 +205,21 @@ public void drawHUD(ItemStack item, GuiGraphics guiGraphics) { if (data != null) { if (data.contains("enabled")) { Component status = (data.getBoolean("enabled") ? - Component.translatable("metaarmor.hud.status.enabled") : - Component.translatable("metaarmor.hud.status.disabled")); - Component result = Component.translatable("metaarmor.hud.engine_enabled", status); + Component.translatable("armor.gtceu.hud.status.enabled") : + Component.translatable("armor.gtceu.hud.status.disabled")); + Component result = Component.translatable("armor.gtceu.hud.engine_enabled", status); this.HUD.newString(result); } if (data.contains("canShare")) { - String status = data.getBoolean("canShare") ? "metaarmor.hud.status.enabled" : - "metaarmor.hud.status.disabled"; + String status = data.getBoolean("canShare") ? "armor.gtceu.hud.status.enabled" : + "armor.gtceu.hud.status.disabled"; this.HUD.newString(Component.translatable("mataarmor.hud.supply_mode", Component.translatable(status))); } if (data.contains("hover")) { - String status = data.getBoolean("hover") ? "metaarmor.hud.status.enabled" : - "metaarmor.hud.status.disabled"; - this.HUD.newString(Component.translatable("metaarmor.hud.hover_mode", Component.translatable(status))); + String status = data.getBoolean("hover") ? "armor.gtceu.hud.status.enabled" : + "armor.gtceu.hud.status.disabled"; + this.HUD.newString(Component.translatable("armor.gtceu.hud.hover_mode", Component.translatable(status))); } } this.HUD.draw(guiGraphics); diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedQuarkTechSuite.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedQuarkTechSuite.java index 42d4eceabcf..87143ded00e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedQuarkTechSuite.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedQuarkTechSuite.java @@ -66,19 +66,19 @@ public void onArmorTick(Level world, Player player, ItemStack item) { if (toggleTimer == 0) { if (KeyBind.JETPACK_ENABLE.isKeyDown(player)) { jetpackEnabled = !jetpackEnabled; - messageKey = "metaarmor.jetpack.flight." + (jetpackEnabled ? "enable" : "disable"); + messageKey = "armor.gtceu.jetpack.flight." + (jetpackEnabled ? "enable" : "disable"); data.putBoolean("enabled", jetpackEnabled); } else if (KeyBind.ARMOR_HOVER.isKeyDown(player)) { hoverMode = !hoverMode; - messageKey = "metaarmor.jetpack.hover." + (hoverMode ? "enable" : "disable"); + messageKey = "armor.gtceu.jetpack.hover." + (hoverMode ? "enable" : "disable"); data.putBoolean("hover", hoverMode); } else if (KeyBind.ARMOR_CHARGING.isKeyDown(player)) { canShare = !canShare; if (canShare && cont.getCharge() == 0) { // Only allow for charging to be enabled if charge is nonzero - messageKey = "metaarmor.qts.share.error"; + messageKey = "armor.gtceu.qts.share.error"; canShare = false; } else { - messageKey = "metaarmor.qts.share." + (canShare ? "enable" : "disable"); + messageKey = "armor.gtceu.qts.share." + (canShare ? "enable" : "disable"); } data.putBoolean("canShare", canShare); } @@ -153,20 +153,20 @@ public void addInfo(ItemStack itemStack, List lines) { CompoundTag data = itemStack.getOrCreateTag(); Component state; boolean enabled = !data.contains("enabled") || data.getBoolean("enabled"); - state = enabled ? Component.translatable("metaarmor.hud.status.enabled") : - Component.translatable("metaarmor.hud.status.disabled"); - lines.add(Component.translatable("metaarmor.hud.engine_enabled", state)); + state = enabled ? Component.translatable("armor.gtceu.hud.status.enabled") : + Component.translatable("armor.gtceu.hud.status.disabled"); + lines.add(Component.translatable("armor.gtceu.hud.engine_enabled", state)); boolean canShare = data.contains("canShare") && data.getBoolean("canShare"); - state = canShare ? Component.translatable("metaarmor.hud.status.enabled") : - Component.translatable("metaarmor.hud.status.disabled"); - lines.add(Component.translatable("metaarmor.energy_share.tooltip", state)); - lines.add(Component.translatable("metaarmor.energy_share.tooltip.guide")); + state = canShare ? Component.translatable("armor.gtceu.hud.status.enabled") : + Component.translatable("armor.gtceu.hud.status.disabled"); + lines.add(Component.translatable("armor.gtceu.energy_share.tooltip", state)); + lines.add(Component.translatable("armor.gtceu.energy_share.tooltip.guide")); boolean hover = data.contains("hover") && data.getBoolean("hover"); - state = hover ? Component.translatable("metaarmor.hud.status.enabled") : - Component.translatable("metaarmor.hud.status.disabled"); - lines.add(Component.translatable("metaarmor.hud.hover_mode", state)); + state = hover ? Component.translatable("armor.gtceu.hud.status.enabled") : + Component.translatable("armor.gtceu.hud.status.disabled"); + lines.add(Component.translatable("armor.gtceu.hud.hover_mode", state)); } @Override @@ -183,11 +183,11 @@ public InteractionResultHolder onRightClick(Level world, Player playe canShare = !canShare; if (!world.isClientSide) { if (canShare && cont.getCharge() == 0) { - player.sendSystemMessage(Component.translatable("metaarmor.energy_share.error")); + player.sendSystemMessage(Component.translatable("armor.gtceu.energy_share.error")); } else if (canShare) { - player.sendSystemMessage(Component.translatable("metaarmor.energy_share.enable")); + player.sendSystemMessage(Component.translatable("armor.gtceu.energy_share.enable")); } else { - player.sendSystemMessage(Component.translatable("metaarmor.energy_share.disable")); + player.sendSystemMessage(Component.translatable("armor.gtceu.energy_share.disable")); } } @@ -210,21 +210,21 @@ public void drawHUD(ItemStack item, GuiGraphics guiGraphics) { if (data != null) { if (data.contains("enabled")) { Component status = (data.getBoolean("enabled") ? - Component.translatable("metaarmor.hud.status.enabled") : - Component.translatable("metaarmor.hud.status.disabled")); - Component result = Component.translatable("metaarmor.hud.engine_enabled", status); + Component.translatable("armor.gtceu.hud.status.enabled") : + Component.translatable("armor.gtceu.hud.status.disabled")); + Component result = Component.translatable("armor.gtceu.hud.engine_enabled", status); this.HUD.newString(result); } if (data.contains("canShare")) { - String status = data.getBoolean("canShare") ? "metaarmor.hud.status.enabled" : - "metaarmor.hud.status.disabled"; + String status = data.getBoolean("canShare") ? "armor.gtceu.hud.status.enabled" : + "armor.gtceu.hud.status.disabled"; this.HUD.newString(Component.translatable("mataarmor.hud.supply_mode", Component.translatable(status))); } if (data.contains("hover")) { - String status = data.getBoolean("hover") ? "metaarmor.hud.status.enabled" : - "metaarmor.hud.status.disabled"; - this.HUD.newString(Component.translatable("metaarmor.hud.hover_mode", Component.translatable(status))); + String status = data.getBoolean("hover") ? "armor.gtceu.hud.status.enabled" : + "armor.gtceu.hud.status.disabled"; + this.HUD.newString(Component.translatable("armor.gtceu.hud.hover_mode", Component.translatable(status))); } } this.HUD.draw(guiGraphics); diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/IJetpack.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/IJetpack.java index faef8f6f3da..397966fcba4 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/IJetpack.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/IJetpack.java @@ -160,7 +160,7 @@ static void performEHover(ItemStack stack, Player player) { CompoundTag tag = stack.getOrCreateTag(); tag.putBoolean("enabled", true); tag.putBoolean("hover", true); - player.displayClientMessage(Component.translatable("metaarmor.jetpack.emergency_hover_mode"), true); + player.displayClientMessage(Component.translatable("armor.gtceu.jetpack.emergency_hover_mode"), true); player.fallDistance = 0; if (!player.level().isClientSide) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/Jetpack.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/Jetpack.java index 4c072ff9d7a..cff7d7507a8 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/Jetpack.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/Jetpack.java @@ -63,11 +63,11 @@ public void onArmorTick(Level world, Player player, @NotNull ItemStack item) { if (toggleTimer == 0) { if (KeyBind.JETPACK_ENABLE.isKeyDown(player)) { jetpackEnabled = !jetpackEnabled; - messageKey = "metaarmor.jetpack.flight." + (jetpackEnabled ? "enable" : "disable"); + messageKey = "armor.gtceu.jetpack.flight." + (jetpackEnabled ? "enable" : "disable"); data.putBoolean("enabled", jetpackEnabled); } else if (KeyBind.ARMOR_HOVER.isKeyDown(player)) { hoverMode = !hoverMode; - messageKey = "metaarmor.jetpack.hover." + (hoverMode ? "enable" : "disable"); + messageKey = "armor.gtceu.jetpack.hover." + (hoverMode ? "enable" : "disable"); data.putBoolean("hover", hoverMode); } @@ -133,15 +133,15 @@ public void drawHUD(ItemStack item, GuiGraphics guiGraphics) { if (data != null) { if (data.contains("enabled")) { Component status = (data.getBoolean("enabled") ? - Component.translatable("metaarmor.hud.status.enabled") : - Component.translatable("metaarmor.hud.status.disabled")); - Component result = Component.translatable("metaarmor.hud.engine_enabled", status); + Component.translatable("armor.gtceu.hud.status.enabled") : + Component.translatable("armor.gtceu.hud.status.disabled")); + Component result = Component.translatable("armor.gtceu.hud.engine_enabled", status); this.HUD.newString(result); } if (data.contains("hover")) { - Component status = (data.getBoolean("hover") ? Component.translatable("metaarmor.hud.status.enabled") : - Component.translatable("metaarmor.hud.status.disabled")); - Component result = Component.translatable("metaarmor.hud.hover_mode", status); + Component status = (data.getBoolean("hover") ? Component.translatable("armor.gtceu.hud.status.enabled") : + Component.translatable("armor.gtceu.hud.status.disabled")); + Component result = Component.translatable("armor.gtceu.hud.hover_mode", status); this.HUD.newString(result); } } @@ -156,14 +156,14 @@ public void addInfo(ItemStack itemStack, List lines) { Component state; boolean enabled = !data.contains("enabled") || data.getBoolean("enabled"); - state = enabled ? Component.translatable("metaarmor.hud.status.enabled") : - Component.translatable("metaarmor.hud.status.disabled"); - lines.add(Component.translatable("metaarmor.hud.engine_enabled", state)); + state = enabled ? Component.translatable("armor.gtceu.hud.status.enabled") : + Component.translatable("armor.gtceu.hud.status.disabled"); + lines.add(Component.translatable("armor.gtceu.hud.engine_enabled", state)); boolean hover = data.contains("hover") && data.getBoolean("hover"); - state = hover ? Component.translatable("metaarmor.hud.status.enabled") : - Component.translatable("metaarmor.hud.status.disabled"); - lines.add(Component.translatable("metaarmor.hud.hover_mode", state)); + state = hover ? Component.translatable("armor.gtceu.hud.status.enabled") : + Component.translatable("armor.gtceu.hud.status.disabled"); + lines.add(Component.translatable("armor.gtceu.hud.hover_mode", state)); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/NanoMuscleSuite.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/NanoMuscleSuite.java index 0a22daffc42..2653fc40f04 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/NanoMuscleSuite.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/NanoMuscleSuite.java @@ -61,10 +61,10 @@ public void onArmorTick(Level world, Player player, ItemStack itemStack) { toggleTimer = 5; if (item.getCharge() < ArmorUtils.MIN_NIGHTVISION_CHARGE) { nightVision = false; - player.displayClientMessage(Component.translatable("metaarmor.nms.nightvision.error"), true); + player.displayClientMessage(Component.translatable("armor.gtceu.nms.nightvision.error"), true); } else { player.displayClientMessage(Component - .translatable("metaarmor.nms.nightvision." + (nightVision ? "enabled" : "disabled")), true); + .translatable("armor.gtceu.nms.nightvision." + (nightVision ? "enabled" : "disabled")), true); } } @@ -95,7 +95,7 @@ public static void disableNightVision(@NotNull Level world, Player player, boole if (!world.isClientSide) { player.removeEffect(MobEffects.NIGHT_VISION); if (sendMsg) - player.displayClientMessage(Component.translatable("metaarmor.nms.nightvision.disabled"), true); + player.displayClientMessage(Component.translatable("armor.gtceu.nms.nightvision.disabled"), true); } } @@ -167,13 +167,13 @@ public void addInfo(ItemStack itemStack, List lines) { CompoundTag nbtData = itemStack.getOrCreateTag(); boolean nv = nbtData.getBoolean("nightVision"); if (nv) { - lines.add(Component.translatable("metaarmor.message.nightvision.enabled")); + lines.add(Component.translatable("armor.gtceu.message.nightvision.enabled")); } else { - lines.add(Component.translatable("metaarmor.message.nightvision.disabled")); + lines.add(Component.translatable("armor.gtceu.message.nightvision.disabled")); } } else if (type == ArmorItem.Type.BOOTS) { - lines.add(Component.translatable("metaarmor.tooltip.stepassist")); - lines.add(Component.translatable("metaarmor.tooltip.falldamage")); + lines.add(Component.translatable("armor.gtceu.tooltip.stepassist")); + lines.add(Component.translatable("armor.gtceu.tooltip.falldamage")); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/NightvisionGoggles.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/NightvisionGoggles.java index 89d78447cb4..134cc8229d0 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/NightvisionGoggles.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/NightvisionGoggles.java @@ -46,10 +46,10 @@ public void onArmorTick(Level world, @NotNull Player player, @NotNull ItemStack toggleTimer = 5; if (item.getCharge() < ArmorUtils.MIN_NIGHTVISION_CHARGE) { nightVision = false; - player.displayClientMessage(Component.translatable("metaarmor.nms.nightvision.error"), true); + player.displayClientMessage(Component.translatable("armor.gtceu.nms.nightvision.error"), true); } else { player.displayClientMessage(Component - .translatable("metaarmor.nms.nightvision." + (nightVision ? "enabled" : "disabled")), true); + .translatable("armor.gtceu.nms.nightvision." + (nightVision ? "enabled" : "disabled")), true); } } @@ -80,7 +80,7 @@ public static void disableNightVision(@NotNull Level world, Player player, boole if (!world.isClientSide) { player.removeEffect(MobEffects.NIGHT_VISION); if (sendMsg) - player.displayClientMessage(Component.translatable("metaarmor.message.nightvision.disabled"), true); + player.displayClientMessage(Component.translatable("armor.gtceu.message.nightvision.disabled"), true); } } @@ -96,9 +96,9 @@ public void addInfo(ItemStack itemStack, List lines) { CompoundTag nbtData = itemStack.getOrCreateTag(); boolean nv = nbtData.getBoolean("nightVision"); if (nv) { - lines.add(Component.translatable("metaarmor.message.nightvision.enabled")); + lines.add(Component.translatable("armor.gtceu.message.nightvision.enabled")); } else { - lines.add(Component.translatable("metaarmor.message.nightvision.disabled")); + lines.add(Component.translatable("armor.gtceu.message.nightvision.disabled")); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/PowerlessJetpack.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/PowerlessJetpack.java index 9a96613c7aa..a640a39163d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/PowerlessJetpack.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/PowerlessJetpack.java @@ -79,11 +79,11 @@ public void onArmorTick(Level world, Player player, @NotNull ItemStack stack) { if (toggleTimer == 0) { if (KeyBind.JETPACK_ENABLE.isKeyDown(player)) { jetpackEnabled = !jetpackEnabled; - messageKey = "metaarmor.jetpack.flight." + (jetpackEnabled ? "enable" : "disable"); + messageKey = "armor.gtceu.jetpack.flight." + (jetpackEnabled ? "enable" : "disable"); data.putBoolean("enabled", jetpackEnabled); } else if (KeyBind.ARMOR_HOVER.isKeyDown(player)) { hoverMode = !hoverMode; - messageKey = "metaarmor.jetpack.hover." + (hoverMode ? "enable" : "disable"); + messageKey = "armor.gtceu.jetpack.hover." + (hoverMode ? "enable" : "disable"); data.putBoolean("hover", hoverMode); } @@ -131,22 +131,22 @@ public void drawHUD(@NotNull ItemStack item, GuiGraphics guiGraphics) { if (tank.getFluidInTank(0).getAmount() == 0) return; String formated = String.format("%.1f", (tank.getFluidInTank(0).getAmount() * 100.0F / tank.getTankCapacity(0))); - this.HUD.newString(Component.translatable("metaarmor.hud.fuel_lvl", formated + "%")); + this.HUD.newString(Component.translatable("armor.gtceu.hud.fuel_lvl", formated + "%")); CompoundTag data = item.getTag(); if (data != null) { if (data.contains("enabled")) { Component status = (data.getBoolean("enabled") ? - Component.translatable("metaarmor.hud.status.enabled") : - Component.translatable("metaarmor.hud.status.disabled")); - Component result = Component.translatable("metaarmor.hud.engine_enabled", status); + Component.translatable("armor.gtceu.hud.status.enabled") : + Component.translatable("armor.gtceu.hud.status.disabled")); + Component result = Component.translatable("armor.gtceu.hud.engine_enabled", status); this.HUD.newString(result); } if (data.contains("hover")) { Component status = (data.getBoolean("hover") ? - Component.translatable("metaarmor.hud.status.enabled") : - Component.translatable("metaarmor.hud.status.disabled")); - Component result = Component.translatable("metaarmor.hud.hover_mode", status); + Component.translatable("armor.gtceu.hud.status.enabled") : + Component.translatable("armor.gtceu.hud.status.disabled")); + Component result = Component.translatable("armor.gtceu.hud.hover_mode", status); this.HUD.newString(result); } } @@ -260,14 +260,14 @@ public void appendHoverText(ItemStack stack, @Nullable Level level, List lines) { CompoundTag nbtData = itemStack.getOrCreateTag(); boolean nv = nbtData.getBoolean("nightVision"); if (nv) { - lines.add(Component.translatable("metaarmor.message.nightvision.enabled")); + lines.add(Component.translatable("armor.gtceu.message.nightvision.enabled")); } else { - lines.add(Component.translatable("metaarmor.message.nightvision.disabled")); + lines.add(Component.translatable("armor.gtceu.message.nightvision.disabled")); } - lines.add(Component.translatable("metaarmor.tooltip.potions")); - lines.add(Component.translatable("metaarmor.tooltip.breath")); - lines.add(Component.translatable("metaarmor.tooltip.autoeat")); + lines.add(Component.translatable("armor.gtceu.tooltip.potions")); + lines.add(Component.translatable("armor.gtceu.tooltip.breath")); + lines.add(Component.translatable("armor.gtceu.tooltip.autoeat")); } else if (type == ArmorItem.Type.CHESTPLATE) { - lines.add(Component.translatable("metaarmor.tooltip.burning")); - lines.add(Component.translatable("metaarmor.tooltip.freezing")); + lines.add(Component.translatable("armor.gtceu.tooltip.burning")); + lines.add(Component.translatable("armor.gtceu.tooltip.freezing")); } else if (type == ArmorItem.Type.LEGGINGS) { - lines.add(Component.translatable("metaarmor.tooltip.speed")); + lines.add(Component.translatable("armor.gtceu.tooltip.speed")); } else if (type == ArmorItem.Type.BOOTS) { - lines.add(Component.translatable("metaarmor.tooltip.stepassist")); - lines.add(Component.translatable("metaarmor.tooltip.falldamage")); - lines.add(Component.translatable("metaarmor.tooltip.jump")); + lines.add(Component.translatable("armor.gtceu.tooltip.stepassist")); + lines.add(Component.translatable("armor.gtceu.tooltip.falldamage")); + lines.add(Component.translatable("armor.gtceu.tooltip.jump")); } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java index 7cab8ec6334..144e205b8af 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java @@ -7,52 +7,76 @@ public class ArmorLang { public static void generateArmorKeys(RegistrateLangProvider provider) { + + // nanomuscle suit + provider.add("armor.gtceu.nms.nightvision.enabled", "NanoMuscle™ Suite: NightVision Enabled"); + provider.add("armor.gtceu.nms.nightvision.disabled", "NanoMuscle™ Suite: NightVision Disabled"); + provider.add("armor.gtceu.nms.boosted_jump.enabled", "NanoMuscle™ Suite: Jump Boost Enabled"); + provider.add("armor.gtceu.nms.boosted_jump.disabled", "NanoMuscle™ Suite: Jump Boost Disabled"); + provider.add("armor.gtceu.nms.nightvision.error", "NanoMuscle™ Suite: §cNot enough power!"); + provider.add("armor.gtceu.nms.share.enable", "NanoMuscle™ Suite: Charging Enabled"); + provider.add("armor.gtceu.nms.share.disable", "NanoMuscle™ Suite: Charging Disabled"); + provider.add("armor.gtceu.nms.share.error", "NanoMuscle™ Suite: §cNot enough power for charging!"); + + + // quantum suit + provider.add("armor.gtceu.qts.nightvision.enabled", "QuarkTech™ Suite: NightVision Enabled"); + provider.add("armor.gtceu.qts.nightvision.disabled", "QuarkTech™ Suite: NightVision Disabled"); + provider.add("armor.gtceu.qts.nightvision.error", "QuarkTech™ Suite: §cNot enough power!"); + provider.add("armor.gtceu.qts.share.enable", "QuarkTech™ Suite: Charging Enabled"); + provider.add("armor.gtceu.qts.share.disable", "QuarkTech™ Suite: Charging Disabled"); + provider.add("armor.gtceu.qts.share.error", "QuarkTech™ Suite: §cNot enough power for charging!"); + + + //jetpacks + provider.add("armor.gtceu.jetpack.flight.enable", "Jetpack: Flight Enabled"); + provider.add("armor.gtceu.jetpack.flight.disable", "Jetpack: Flight Disabled"); + provider.add("armor.gtceu.jetpack.hover.enable", "Jetpack: Hover Mode Enabled"); + provider.add("armor.gtceu.jetpack.hover.disable", "Jetpack: Hover Mode Disabled"); + provider.add("armor.gtceu.jetpack.emergency_hover_mode", "Emergency Hover Mode Enabled!"); provider.add("item.liquid_fuel_jetpack.tooltip", "Uses Combustion Generator Fuels for Thrust"); - provider.add("metaarmor.nms.nightvision.enabled", "NanoMuscle™ Suite: NightVision Enabled"); - provider.add("metaarmor.nms.nightvision.disabled", "NanoMuscle™ Suite: NightVision Disabled"); - provider.add("metaarmor.nms.boosted_jump.enabled", "NanoMuscle™ Suite: Jump Boost Enabled"); - provider.add("metaarmor.nms.boosted_jump.disabled", "NanoMuscle™ Suite: Jump Boost Disabled"); - provider.add("metaarmor.nms.nightvision.error", "NanoMuscle™ Suite: §cNot enough power!"); - provider.add("metaarmor.qts.nightvision.enabled", "QuarkTech™ Suite: NightVision Enabled"); - provider.add("metaarmor.qts.nightvision.disabled", "QuarkTech™ Suite: NightVision Disabled"); - provider.add("metaarmor.qts.nightvision.error", "QuarkTech™ Suite: §cNot enough power!"); - provider.add("metaarmor.jetpack.flight.enable", "Jetpack: Flight Enabled"); - provider.add("metaarmor.jetpack.flight.disable", "Jetpack: Flight Disabled"); - provider.add("metaarmor.jetpack.hover.enable", "Jetpack: Hover Mode Enabled"); - provider.add("metaarmor.jetpack.hover.disable", "Jetpack: Hover Mode Disabled"); - provider.add("metaarmor.jetpack.emergency_hover_mode", "Emergency Hover Mode Enabled!"); - provider.add("metaarmor.nms.share.enable", "NanoMuscle™ Suite: Charging Enabled"); - provider.add("metaarmor.nms.share.disable", "NanoMuscle™ Suite: Charging Disabled"); - provider.add("metaarmor.nms.share.error", "NanoMuscle™ Suite: §cNot enough power for charging!"); - provider.add("metaarmor.qts.share.enable", "QuarkTech™ Suite: Charging Enabled"); - provider.add("metaarmor.qts.share.disable", "QuarkTech™ Suite: Charging Disabled"); - provider.add("metaarmor.qts.share.error", "QuarkTech™ Suite: §cNot enough power for charging!"); - provider.add("metaarmor.message.nightvision.enabled", "§bNightVision: §aOn"); - provider.add("metaarmor.message.nightvision.disabled", "§bNightVision: §cOff"); - provider.add("metaarmor.message.nightvision.error", "§cNot enough power!"); - provider.add("metaarmor.tooltip.stepassist", "Provides Step-Assist"); - provider.add("metaarmor.tooltip.speed", "Increases Running Speed"); - provider.add("metaarmor.tooltip.jump", "Increases Jump Height and Distance"); - provider.add("metaarmor.tooltip.falldamage", "Nullifies Fall Damage"); - provider.add("metaarmor.tooltip.potions", "Nullifies Harmful Effects"); - provider.add("metaarmor.tooltip.burning", "Nullifies Burning"); - provider.add("metaarmor.tooltip.freezing", "Prevents Freezing"); - provider.add("metaarmor.tooltip.breath", "Replenishes Underwater Breath Bar"); - provider.add("metaarmor.tooltip.autoeat", "Replenishes Food Bar by Using Food from Inventory"); - provider.add("metaarmor.hud.status.enabled", "§aON"); - provider.add("metaarmor.hud.status.disabled", "§cOFF"); - provider.add("metaarmor.hud.energy_lvl", "Energy Level: %s"); - provider.add("metaarmor.hud.engine_enabled", "Engine Enabled: %s"); - provider.add("metaarmor.hud.fuel_lvl", "Fuel Level: %s"); - provider.add("metaarmor.hud.hover_mode", "Hover Mode: %s"); - provider.add("mataarmor.hud.supply_mode", "Supply Mode: %s"); - provider.add("metaarmor.hud.gravi_engine", "GraviEngine: %s"); - provider.add("metaarmor.energy_share.error", "Energy Supply: §cNot enough power for gadgets charging!"); - provider.add("metaarmor.energy_share.enable", "Energy Supply: Gadgets charging enabled"); - provider.add("metaarmor.energy_share.disable", "Energy Supply: Gadgets charging disabled"); - provider.add("metaarmor.energy_share.tooltip", "Supply mode: %s"); - provider.add("metaarmor.energy_share.tooltip.guide", + + //action bar messages + provider.add("armor.gtceu.message.nightvision.enabled", "§bNightVision: §aOn"); + provider.add("armor.gtceu.message.nightvision.disabled", "§bNightVision: §cOff"); + provider.add("armor.gtceu.message.nightvision.error", "§cNot enough power!"); + + + } + + public static void generateTooltipKeys(RegistrateLangProvider provider){ + + // basic ability tooltips + provider.add("armor.gtceu.tooltip.stepassist", "Provides Step-Assist"); + provider.add("armor.gtceu.tooltip.speed", "Increases Running Speed"); + provider.add("armor.gtceu.tooltip.jump", "Increases Jump Height and Distance"); + provider.add("armor.gtceu.tooltip.falldamage", "Nullifies Fall Damage"); + provider.add("armor.gtceu.tooltip.potions", "Nullifies Harmful Effects"); + provider.add("armor.gtceu.tooltip.burning", "Nullifies Burning"); + provider.add("armor.gtceu.tooltip.freezing", "Prevents Freezing"); + provider.add("armor.gtceu.tooltip.breath", "Replenishes Underwater Breath Bar"); + provider.add("armor.gtceu.tooltip.autoeat", "Replenishes Food Bar by Using Food from Inventory"); + + + //energy tooltips (iaddinfo) + provider.add("armor.gtceu.energy_share.error", "Energy Supply: §cNot enough power for gadgets charging!"); + provider.add("armor.gtceu.energy_share.enable", "Energy Supply: Gadgets charging enabled"); + provider.add("armor.gtceu.energy_share.disable", "Energy Supply: Gadgets charging disabled"); + provider.add("armor.gtceu.energy_share.tooltip", "Supply mode: %s"); + provider.add("armor.gtceu.energy_share.tooltip.guide", "To change mode shift-right click when holding item"); + } + + public static void generateHudKeys(RegistrateLangProvider provider){ + + provider.add("armor.gtceu.hud.status.enabled", "§aON"); + provider.add("armor.gtceu.hud.status.disabled", "§cOFF"); + provider.add("armor.gtceu.hud.energy_lvl", "Energy Level: %s"); + provider.add("armor.gtceu.hud.engine_enabled", "Engine Enabled: %s"); + provider.add("armor.gtceu.hud.fuel_lvl", "Fuel Level: %s"); + provider.add("armor.gtceu.hud.hover_mode", "Hover Mode: %s"); + provider.add("mataarmor.hud.supply_mode", "Supply Mode: %s"); + provider.add("armor.gtceu.hud.gravi_engine", "GraviEngine: %s"); } } diff --git a/src/main/resources/assets/gtceu/lang/ja_jp.json b/src/main/resources/assets/gtceu/lang/ja_jp.json index 94859ce7a75..7d54f885744 100644 --- a/src/main/resources/assets/gtceu/lang/ja_jp.json +++ b/src/main/resources/assets/gtceu/lang/ja_jp.json @@ -5242,49 +5242,49 @@ "material.gtceu.zincite": "紅亜鉛鉱", "material.gtceu.zirconium": "ジルコニウム", "message.gtceu.new_veins": "新しい鉱脈を%d個探査しました!", - "metaarmor.energy_share.disable": "電力供給: 装備への電力供給を無効化", - "metaarmor.energy_share.enable": "電力供給: 装備への電力供給を有効化", - "metaarmor.energy_share.error": "電力供給: §c電力不足!", - "metaarmor.energy_share.tooltip": "供給モード: %s", - "metaarmor.energy_share.tooltip.guide": "手に持ちながらShift+右クリックでモードを変更", - "metaarmor.hud.energy_lvl": "エネルギー残量: %s", - "metaarmor.hud.engine_enabled": "エンジン有効: %s", - "metaarmor.hud.fuel_lvl": "燃料残量: %s", - "metaarmor.hud.gravi_engine": "重力エンジン: %s", - "metaarmor.hud.hover_mode": "ホバー: %s", - "metaarmor.hud.status.disabled": "§cOFF", - "metaarmor.hud.status.enabled": "§aON", - "metaarmor.jetpack.emergency_hover_mode": "緊急ホバーモードを有効化!", - "metaarmor.jetpack.flight.disable": "Jetpack: 飛行を無効化", - "metaarmor.jetpack.flight.enable": "Jetpack: 飛行を有効化", - "metaarmor.jetpack.hover.disable": "Jetpack: ホバーモードを無効化", - "metaarmor.jetpack.hover.enable": "Jetpack: ホバーモードを有効化", - "metaarmor.message.nightvision.disabled": "§b暗視: §cOff", - "metaarmor.message.nightvision.enabled": "§b暗視: §aOn", - "metaarmor.message.nightvision.error": "§cパワーが足りない!", - "metaarmor.nms.boosted_jump.disabled": "NanoMuscle™ Suite: ジャンプブースト無効化", - "metaarmor.nms.boosted_jump.enabled": "NanoMuscle™ Suite: ジャンプブースト有効化", - "metaarmor.nms.nightvision.disabled": "NanoMuscle™ Suite: 暗視を無効化", - "metaarmor.nms.nightvision.enabled": "NanoMuscle™ Suite: 暗視を有効化", - "metaarmor.nms.nightvision.error": "NanoMuscle™ Suite: §cエネルギー不足!", - "metaarmor.nms.share.disable": "NanoMuscle™ Suite: 電力供給を無効化", - "metaarmor.nms.share.enable": "NanoMuscle™ Suite: 電力供給を有効化", - "metaarmor.nms.share.error": "NanoMuscle™ Suite: §cエネルギー不足!", - "metaarmor.qts.nightvision.disabled": "QuarkTech™ Suite: 暗視を無効化", - "metaarmor.qts.nightvision.enabled": "QuarkTech™ Suite: 暗視を有効化", - "metaarmor.qts.nightvision.error": "QuarkTech™ Suite: §cエネルギー不足!", - "metaarmor.qts.share.disable": "QuarkTech™ Suite: 電力供給を無効化", - "metaarmor.qts.share.enable": "QuarkTech™ Suite: 電力供給を有効化", - "metaarmor.qts.share.error": "QuarkTech™ Suite: §cエネルギー不足!", - "metaarmor.tooltip.autoeat": "インベントリの食料で満腹度回復", - "metaarmor.tooltip.breath": "水中呼吸", - "metaarmor.tooltip.burning": "炎上無効", - "metaarmor.tooltip.falldamage": "落下ダメージ無効", - "metaarmor.tooltip.freezing": "凍結防止", - "metaarmor.tooltip.jump": "ジャンプ力とジャンプ距離が上昇", - "metaarmor.tooltip.potions": "デバフ無効", - "metaarmor.tooltip.speed": "走る速度が上昇", - "metaarmor.tooltip.stepassist": "ステップアシストを提供", + "armor.gtceu.energy_share.disable": "電力供給: 装備への電力供給を無効化", + "armor.gtceu.energy_share.enable": "電力供給: 装備への電力供給を有効化", + "armor.gtceu.energy_share.error": "電力供給: §c電力不足!", + "armor.gtceu.energy_share.tooltip": "供給モード: %s", + "armor.gtceu.energy_share.tooltip.guide": "手に持ちながらShift+右クリックでモードを変更", + "armor.gtceu.hud.energy_lvl": "エネルギー残量: %s", + "armor.gtceu.hud.engine_enabled": "エンジン有効: %s", + "armor.gtceu.hud.fuel_lvl": "燃料残量: %s", + "armor.gtceu.hud.gravi_engine": "重力エンジン: %s", + "armor.gtceu.hud.hover_mode": "ホバー: %s", + "armor.gtceu.hud.status.disabled": "§cOFF", + "armor.gtceu.hud.status.enabled": "§aON", + "armor.gtceu.jetpack.emergency_hover_mode": "緊急ホバーモードを有効化!", + "armor.gtceu.jetpack.flight.disable": "Jetpack: 飛行を無効化", + "armor.gtceu.jetpack.flight.enable": "Jetpack: 飛行を有効化", + "armor.gtceu.jetpack.hover.disable": "Jetpack: ホバーモードを無効化", + "armor.gtceu.jetpack.hover.enable": "Jetpack: ホバーモードを有効化", + "armor.gtceu.message.nightvision.disabled": "§b暗視: §cOff", + "armor.gtceu.message.nightvision.enabled": "§b暗視: §aOn", + "armor.gtceu.message.nightvision.error": "§cパワーが足りない!", + "armor.gtceu.nms.boosted_jump.disabled": "NanoMuscle™ Suite: ジャンプブースト無効化", + "armor.gtceu.nms.boosted_jump.enabled": "NanoMuscle™ Suite: ジャンプブースト有効化", + "armor.gtceu.nms.nightvision.disabled": "NanoMuscle™ Suite: 暗視を無効化", + "armor.gtceu.nms.nightvision.enabled": "NanoMuscle™ Suite: 暗視を有効化", + "armor.gtceu.nms.nightvision.error": "NanoMuscle™ Suite: §cエネルギー不足!", + "armor.gtceu.nms.share.disable": "NanoMuscle™ Suite: 電力供給を無効化", + "armor.gtceu.nms.share.enable": "NanoMuscle™ Suite: 電力供給を有効化", + "armor.gtceu.nms.share.error": "NanoMuscle™ Suite: §cエネルギー不足!", + "armor.gtceu.qts.nightvision.disabled": "QuarkTech™ Suite: 暗視を無効化", + "armor.gtceu.qts.nightvision.enabled": "QuarkTech™ Suite: 暗視を有効化", + "armor.gtceu.qts.nightvision.error": "QuarkTech™ Suite: §cエネルギー不足!", + "armor.gtceu.qts.share.disable": "QuarkTech™ Suite: 電力供給を無効化", + "armor.gtceu.qts.share.enable": "QuarkTech™ Suite: 電力供給を有効化", + "armor.gtceu.qts.share.error": "QuarkTech™ Suite: §cエネルギー不足!", + "armor.gtceu.tooltip.autoeat": "インベントリの食料で満腹度回復", + "armor.gtceu.tooltip.breath": "水中呼吸", + "armor.gtceu.tooltip.burning": "炎上無効", + "armor.gtceu.tooltip.falldamage": "落下ダメージ無効", + "armor.gtceu.tooltip.freezing": "凍結防止", + "armor.gtceu.tooltip.jump": "ジャンプ力とジャンプ距離が上昇", + "armor.gtceu.tooltip.potions": "デバフ無効", + "armor.gtceu.tooltip.speed": "走る速度が上昇", + "armor.gtceu.tooltip.stepassist": "ステップアシストを提供", "item.behavior.mode_switch.current_mode": "モード: %s", "item.behavior.mode_switch.mode_switched": "§eモードが設定されました: %s", "item.behavior.mode_switch.tooltip": "スニーク中に使うことでモード変更", diff --git a/src/main/resources/assets/gtceu/lang/ru_ru.json b/src/main/resources/assets/gtceu/lang/ru_ru.json index fa4b50a6b84..53b7d196d25 100644 --- a/src/main/resources/assets/gtceu/lang/ru_ru.json +++ b/src/main/resources/assets/gtceu/lang/ru_ru.json @@ -2757,43 +2757,43 @@ "ldlib.gui.editor.register.editor.gtceu.rtui": "RecipeType UI Project", "ldlib.gui.editor.register.editor.gtceu.template_tab": "шаблоны", "mataarmor.hud.supply_mode": "Режим снабжения: %s", - "metaarmor.energy_share.disable": "Энергоснабжение: выключена зарядка гаджетов", - "metaarmor.energy_share.enable": "Энергоснабжение: включена зарядка гаджетов", - "metaarmor.energy_share.error": "Энергоснабжение: §cНедостаточно энергии для зарядки предметов!", - "metaarmor.energy_share.tooltip": "Режим снабжения: %s", - "metaarmor.energy_share.tooltip.guide": "Чтобы изменить режим, щелкните правой кнопкой мыши, удерживая предмет", - "metaarmor.hud.energy_lvl": "Уровень энергии: %s", - "metaarmor.hud.fuel_lvl": "Уровень топлива: %s", - "metaarmor.hud.gravi_engine": "Грави-двигатель: %s", - "metaarmor.hud.hover_mode": "Режим парения: %s", - "metaarmor.hud.status.disabled": "§cВЫКЛ", - "metaarmor.hud.status.enabled": "§aВКЛ.", - "metaarmor.jetpack.emergency_hover_mode": "Включен аварийный режим зависания!", - "metaarmor.jetpack.hover.disable": "Реактивный ранец: режим парения отключен", - "metaarmor.jetpack.hover.enable": "Реактивный ранец: режим парения включен", - "metaarmor.message.nightvision.disabled": "§bНочное зрение: §aВыкл", - "metaarmor.message.nightvision.enabled": "§bНочное зрение: §aВкл", - "metaarmor.message.nightvision.error": "§cНедостаточно энергии!", - "metaarmor.nms.nightvision.disabled": "NanoMuscle™ броня: ПНВ выключено", - "metaarmor.nms.nightvision.enabled": "NanoMuscle™ броня: ПНВ включено", - "metaarmor.nms.nightvision.error": "NanoMuscle™ броня: §cНедостаточно энергии!", - "metaarmor.nms.share.disable": "NanoMuscle™ броня: Зарядка отключена", - "metaarmor.nms.share.enable": "NanoMuscle™ броня: Зарядка включена", - "metaarmor.nms.share.error": "NanoMuscle™ броня: §cНедостаточно энергии для зарядки!", - "metaarmor.qts.nightvision.disabled": "QuarkTech™ броня: ПНВ выключено", - "metaarmor.qts.nightvision.enabled": "QuarkTech™ броня: ПНВ включено", - "metaarmor.qts.nightvision.error": "QuarkTech™ броня: §cНедостаточно энергии!", - "metaarmor.qts.share.disable": "QuarkTech™ броня: Зарядка отключена", - "metaarmor.qts.share.enable": "QuarkTech™ броня: Зарядка включена", - "metaarmor.qts.share.error": "QuarkTech™ броня: §cНедостаточно энергии для зарядки!", - "metaarmor.tooltip.autoeat": "Пополняет шкалу еды, используя еду из инвентаря", - "metaarmor.tooltip.breath": "Пополняет полосу подводного дыхания", - "metaarmor.tooltip.burning": "Аннулирует урон от огня", - "metaarmor.tooltip.falldamage": "Аннулирует весь урон", - "metaarmor.tooltip.jump": "Увеличивает высоту и расстояние прыжка", - "metaarmor.tooltip.potions": "Аннулирует вредные эффекты", - "metaarmor.tooltip.speed": "Увеличивает скорость бега", - "metaarmor.tooltip.stepassist": "Обеспечивает пошаговую помощь", + "armor.gtceu.energy_share.disable": "Энергоснабжение: выключена зарядка гаджетов", + "armor.gtceu.energy_share.enable": "Энергоснабжение: включена зарядка гаджетов", + "armor.gtceu.energy_share.error": "Энергоснабжение: §cНедостаточно энергии для зарядки предметов!", + "armor.gtceu.energy_share.tooltip": "Режим снабжения: %s", + "armor.gtceu.energy_share.tooltip.guide": "Чтобы изменить режим, щелкните правой кнопкой мыши, удерживая предмет", + "armor.gtceu.hud.energy_lvl": "Уровень энергии: %s", + "armor.gtceu.hud.fuel_lvl": "Уровень топлива: %s", + "armor.gtceu.hud.gravi_engine": "Грави-двигатель: %s", + "armor.gtceu.hud.hover_mode": "Режим парения: %s", + "armor.gtceu.hud.status.disabled": "§cВЫКЛ", + "armor.gtceu.hud.status.enabled": "§aВКЛ.", + "armor.gtceu.jetpack.emergency_hover_mode": "Включен аварийный режим зависания!", + "armor.gtceu.jetpack.hover.disable": "Реактивный ранец: режим парения отключен", + "armor.gtceu.jetpack.hover.enable": "Реактивный ранец: режим парения включен", + "armor.gtceu.message.nightvision.disabled": "§bНочное зрение: §aВыкл", + "armor.gtceu.message.nightvision.enabled": "§bНочное зрение: §aВкл", + "armor.gtceu.message.nightvision.error": "§cНедостаточно энергии!", + "armor.gtceu.nms.nightvision.disabled": "NanoMuscle™ броня: ПНВ выключено", + "armor.gtceu.nms.nightvision.enabled": "NanoMuscle™ броня: ПНВ включено", + "armor.gtceu.nms.nightvision.error": "NanoMuscle™ броня: §cНедостаточно энергии!", + "armor.gtceu.nms.share.disable": "NanoMuscle™ броня: Зарядка отключена", + "armor.gtceu.nms.share.enable": "NanoMuscle™ броня: Зарядка включена", + "armor.gtceu.nms.share.error": "NanoMuscle™ броня: §cНедостаточно энергии для зарядки!", + "armor.gtceu.qts.nightvision.disabled": "QuarkTech™ броня: ПНВ выключено", + "armor.gtceu.qts.nightvision.enabled": "QuarkTech™ броня: ПНВ включено", + "armor.gtceu.qts.nightvision.error": "QuarkTech™ броня: §cНедостаточно энергии!", + "armor.gtceu.qts.share.disable": "QuarkTech™ броня: Зарядка отключена", + "armor.gtceu.qts.share.enable": "QuarkTech™ броня: Зарядка включена", + "armor.gtceu.qts.share.error": "QuarkTech™ броня: §cНедостаточно энергии для зарядки!", + "armor.gtceu.tooltip.autoeat": "Пополняет шкалу еды, используя еду из инвентаря", + "armor.gtceu.tooltip.breath": "Пополняет полосу подводного дыхания", + "armor.gtceu.tooltip.burning": "Аннулирует урон от огня", + "armor.gtceu.tooltip.falldamage": "Аннулирует весь урон", + "armor.gtceu.tooltip.jump": "Увеличивает высоту и расстояние прыжка", + "armor.gtceu.tooltip.potions": "Аннулирует вредные эффекты", + "armor.gtceu.tooltip.speed": "Увеличивает скорость бега", + "armor.gtceu.tooltip.stepassist": "Обеспечивает пошаговую помощь", "item.behavior.mode_switch.current_mode": "Режим: %s", "item.behavior.mode_switch.mode_switched": "§eРежим изменен на: %s", "item.behavior.mode_switch.tooltip": "Используйте зажав кнопку \"присесть\" для переключения режима", @@ -5247,7 +5247,7 @@ "tagprefix.wire_cutter_head": "%s (Насадка кусачек)", "block.gtceu.creative_computation_provider": "Творческий источник вычислений", "block.gtceu.normal_laser_pipe.tooltip": "§7Передача энергии §fбез потерь§7 по прямым линиям", - "metaarmor.hud.engine_enabled": "Двигатель: %s", + "armor.gtceu.hud.engine_enabled": "Двигатель: %s", "config.gtceu.option.bronzeBoilerHeatSpeed": "bronzeBoilerHeatSpeed", "config.gtceu.option.bronzeBoilerMaxTemperature": "bronzeBoilerMaxTemperature", "config.gtceu.option.hpLiquidBoilerBaseOutput": "hpLiquidBoilerBaseOutput", @@ -5277,8 +5277,8 @@ "gtceu.scanner.copy_stick_from": "§oОригинал копии", "gtceu.scanner.copy_stick_to": "§oКопия", "gtceu.tooltip.potion.each": "%s %s §7на§r %s §7тиков с§r %s%% §7шансом§r", - "metaarmor.jetpack.flight.disable": "Джетпак: Полет выкл", - "metaarmor.jetpack.flight.enable": "Джетпак: Полет вкл", + "armor.gtceu.jetpack.flight.disable": "Джетпак: Полет выкл", + "armor.gtceu.jetpack.flight.enable": "Джетпак: Полет вкл", "config.jade.plugin_gtceu.primitive_pump": "[GTCEu] Примитивная помпа", "block.gtceu.uiv_dual_input_hatch": "Двойной входной люк (§2UIV§r)", "block.gtceu.uv_dual_input_hatch": "Двойной входной люк (§3UV§r)", @@ -5365,9 +5365,9 @@ "material.gtceu.echo_shard": "Осколок эха", "material.gtceu.sculk": "Скалк", "material.gtceu.hydrogen_iodide": "Йодид водорода", - "metaarmor.nms.boosted_jump.enabled": "NanoMuscle™ Suite: Прыгучесть включена", + "armor.gtceu.nms.boosted_jump.enabled": "NanoMuscle™ Suite: Прыгучесть включена", "recipe.condition.adjacent_block.tooltip": "Блоки вокруг", - "metaarmor.nms.boosted_jump.disabled": "NanoMuscle™ Suite: Прыгучесть выключена", + "armor.gtceu.nms.boosted_jump.disabled": "NanoMuscle™ Suite: Прыгучесть выключена", "gtceu.multiblock.output_line.0": "%s x §e%s§r (%ss/ea)", "gtceu.multiblock.output_line.1": "%s x §e%s§r (%s/s)", "gtceu.multiblock.output_line.2": "%s ≈ §e%s§r (%ss/ea)", @@ -5506,7 +5506,7 @@ "gtceu.auto_decomp.rotor": "Ротор турбины", "gtceu.journeymap.options.layers.hide_depleted": "Скрыть истощенные жилы", "config.gtceu.option.oreIndicators": "oreIndicators", - "metaarmor.tooltip.freezing": "Предотвращает замораживание", + "armor.gtceu.tooltip.freezing": "Предотвращает замораживание", "config.gtceu.option.minerSpeed": "minerSpeed", "cover.machine_controller.mode.null": "Ничем не управлять", "cover.advanced_detector.latch.disabled.2": "Изменить режим работы редстоуна для этого улучшения.", diff --git a/src/main/resources/assets/gtceu/lang/uk_ua.json b/src/main/resources/assets/gtceu/lang/uk_ua.json index 61c2869c21a..6dea3607d35 100644 --- a/src/main/resources/assets/gtceu/lang/uk_ua.json +++ b/src/main/resources/assets/gtceu/lang/uk_ua.json @@ -5107,49 +5107,49 @@ "recipe.condition.pos_y.tooltip": "Рівень Y: %d <= Y <= %d", "mataarmor.hud.supply_mode": "Режим живлення: %s", - "metaarmor.energy_share.disable": "Енергопостачання: Заряджання приладів вимкнена", - "metaarmor.energy_share.enable": "Енергопостачання: Заряджання приладів увімкнено", - "metaarmor.energy_share.error": "Енергопостачання:§c Недостатньо енергії для заряджання приладів!", - "metaarmor.energy_share.tooltip": "Режим живлення: %s", - "metaarmor.energy_share.tooltip.guide": "Щоб змінити режим, клацніть ПКМ крадькома, утримуючи предмет", - "metaarmor.hud.energy_lvl": "Рівень енергії: %s", - "metaarmor.hud.engine_enabled": "Двигун увімкнено: %s", - "metaarmor.hud.fuel_lvl": "Рівень палива: %s", - "metaarmor.hud.gravi_engine": "Гравітаційний двигун: %s", - "metaarmor.hud.hover_mode": "Режим ширяння: %s", - "metaarmor.hud.status.disabled": "§cВИМК", - "metaarmor.hud.status.enabled": "§aУВІМК", - "metaarmor.jetpack.emergency_hover_mode": "Аварійний режим польоту увімкнено!", - "metaarmor.jetpack.flight.disable": "Реактивний ранець: Політ вимкнено.", - "metaarmor.jetpack.flight.enable": "Реактивний ранець: Політ увімкнено", - "metaarmor.jetpack.hover.disable": "Реактивний ранець: Режим ширяння вимкнено", - "metaarmor.jetpack.hover.enable": "Реактивний ранець: Режим ширяння увімкнено", - "metaarmor.message.nightvision.disabled": "§bНічне бачення:§c Вимкнено", - "metaarmor.message.nightvision.enabled": "§bНічне бачення:§a Увімкнено", - "metaarmor.message.nightvision.error": "§cНедостатньо енергії!", - "metaarmor.nms.boosted_jump.disabled": "Комплект NanoMuscle™: Посилення стрибків вимкнено", - "metaarmor.nms.boosted_jump.enabled": "Комплект NanoMuscle™: Прискорення стрибків увімкнено", - "metaarmor.nms.nightvision.disabled": "Комплект NanoMuscle™: Нічне бачення вимкнено", - "metaarmor.nms.nightvision.enabled": "Комплект NanoMuscle™: Нічне бачення увімкнено", - "metaarmor.nms.nightvision.error": "Комплект NanoMuscle™:§c Недостатньо енергії!", - "metaarmor.nms.share.disable": "Комплект NanoMuscle™: Заряджання вимкнено", - "metaarmor.nms.share.enable": "Комплект NanoMuscle™: Заряджання увімкнено", - "metaarmor.nms.share.error": "Комплект NanoMuscle™:§c Недостатньо енергії для заряджання!", - "metaarmor.qts.nightvision.disabled": "Комплект QuarkTech™: Нічне бачення вимкнено", - "metaarmor.qts.nightvision.enabled": "Комплект QuarkTech™: Нічне бачення увімкнено", - "metaarmor.qts.nightvision.error": "Комплект QuarkTech™:§c Недостатньо енергії!", - "metaarmor.qts.share.disable": "Комплект QuarkTech™: Заряджання вимкнено", - "metaarmor.qts.share.enable": "Комплект QuarkTech™: Заряджання увімкнено", - "metaarmor.qts.share.error": "Комплект QuarkTech™:§c Недостатньо енергії для заряджання!", - "metaarmor.tooltip.autoeat": "Поповнює очки голоду з інвентарю", - "metaarmor.tooltip.breath": "Поповнює очки запасу повітря", - "metaarmor.tooltip.burning": "Знешкоджує горіння", - "metaarmor.tooltip.falldamage": "Знешкоджує кінетичну шкоду", - "metaarmor.tooltip.freezing": "Запобігає замерзанню", - "metaarmor.tooltip.jump": "Збільшує висоту та відстань стрибка", - "metaarmor.tooltip.potions": "Знешкоджує шкідливі ефекти", - "metaarmor.tooltip.speed": "Збільшує швидкість бігу", - "metaarmor.tooltip.stepassist": "Збільшує висоту кроку", + "armor.gtceu.energy_share.disable": "Енергопостачання: Заряджання приладів вимкнена", + "armor.gtceu.energy_share.enable": "Енергопостачання: Заряджання приладів увімкнено", + "armor.gtceu.energy_share.error": "Енергопостачання:§c Недостатньо енергії для заряджання приладів!", + "armor.gtceu.energy_share.tooltip": "Режим живлення: %s", + "armor.gtceu.energy_share.tooltip.guide": "Щоб змінити режим, клацніть ПКМ крадькома, утримуючи предмет", + "armor.gtceu.hud.energy_lvl": "Рівень енергії: %s", + "armor.gtceu.hud.engine_enabled": "Двигун увімкнено: %s", + "armor.gtceu.hud.fuel_lvl": "Рівень палива: %s", + "armor.gtceu.hud.gravi_engine": "Гравітаційний двигун: %s", + "armor.gtceu.hud.hover_mode": "Режим ширяння: %s", + "armor.gtceu.hud.status.disabled": "§cВИМК", + "armor.gtceu.hud.status.enabled": "§aУВІМК", + "armor.gtceu.jetpack.emergency_hover_mode": "Аварійний режим польоту увімкнено!", + "armor.gtceu.jetpack.flight.disable": "Реактивний ранець: Політ вимкнено.", + "armor.gtceu.jetpack.flight.enable": "Реактивний ранець: Політ увімкнено", + "armor.gtceu.jetpack.hover.disable": "Реактивний ранець: Режим ширяння вимкнено", + "armor.gtceu.jetpack.hover.enable": "Реактивний ранець: Режим ширяння увімкнено", + "armor.gtceu.message.nightvision.disabled": "§bНічне бачення:§c Вимкнено", + "armor.gtceu.message.nightvision.enabled": "§bНічне бачення:§a Увімкнено", + "armor.gtceu.message.nightvision.error": "§cНедостатньо енергії!", + "armor.gtceu.nms.boosted_jump.disabled": "Комплект NanoMuscle™: Посилення стрибків вимкнено", + "armor.gtceu.nms.boosted_jump.enabled": "Комплект NanoMuscle™: Прискорення стрибків увімкнено", + "armor.gtceu.nms.nightvision.disabled": "Комплект NanoMuscle™: Нічне бачення вимкнено", + "armor.gtceu.nms.nightvision.enabled": "Комплект NanoMuscle™: Нічне бачення увімкнено", + "armor.gtceu.nms.nightvision.error": "Комплект NanoMuscle™:§c Недостатньо енергії!", + "armor.gtceu.nms.share.disable": "Комплект NanoMuscle™: Заряджання вимкнено", + "armor.gtceu.nms.share.enable": "Комплект NanoMuscle™: Заряджання увімкнено", + "armor.gtceu.nms.share.error": "Комплект NanoMuscle™:§c Недостатньо енергії для заряджання!", + "armor.gtceu.qts.nightvision.disabled": "Комплект QuarkTech™: Нічне бачення вимкнено", + "armor.gtceu.qts.nightvision.enabled": "Комплект QuarkTech™: Нічне бачення увімкнено", + "armor.gtceu.qts.nightvision.error": "Комплект QuarkTech™:§c Недостатньо енергії!", + "armor.gtceu.qts.share.disable": "Комплект QuarkTech™: Заряджання вимкнено", + "armor.gtceu.qts.share.enable": "Комплект QuarkTech™: Заряджання увімкнено", + "armor.gtceu.qts.share.error": "Комплект QuarkTech™:§c Недостатньо енергії для заряджання!", + "armor.gtceu.tooltip.autoeat": "Поповнює очки голоду з інвентарю", + "armor.gtceu.tooltip.breath": "Поповнює очки запасу повітря", + "armor.gtceu.tooltip.burning": "Знешкоджує горіння", + "armor.gtceu.tooltip.falldamage": "Знешкоджує кінетичну шкоду", + "armor.gtceu.tooltip.freezing": "Запобігає замерзанню", + "armor.gtceu.tooltip.jump": "Збільшує висоту та відстань стрибка", + "armor.gtceu.tooltip.potions": "Знешкоджує шкідливі ефекти", + "armor.gtceu.tooltip.speed": "Збільшує швидкість бігу", + "armor.gtceu.tooltip.stepassist": "Збільшує висоту кроку", "gtceu.subtitle.portable_scanner": "Сканування", "gtceu.subtitle.assembler": "Збирач конструює", diff --git a/src/main/resources/assets/gtceu/lang/zh_cn.json b/src/main/resources/assets/gtceu/lang/zh_cn.json index 00593a12ba6..d46436a42f1 100644 --- a/src/main/resources/assets/gtceu/lang/zh_cn.json +++ b/src/main/resources/assets/gtceu/lang/zh_cn.json @@ -5302,49 +5302,49 @@ "material.gtceu.zirconium": "锆", "message.gtceu.new_veins.amount": "勘探到%d条新矿脉!", "message.gtceu.new_veins.name": "勘探到%s!", - "metaarmor.energy_share.disable": "能量供给:工具充能已禁用", - "metaarmor.energy_share.enable": "能量供给:工具充能已启用", - "metaarmor.energy_share.error": "能量供给:§c能量不足,无法为工具充能!", - "metaarmor.energy_share.tooltip": "供能模式:%s", - "metaarmor.energy_share.tooltip.guide": "手持物品并潜行右击以更换模式", - "metaarmor.hud.energy_lvl": "能量存储:%s", - "metaarmor.hud.engine_enabled": "引擎已启用:%s", - "metaarmor.hud.fuel_lvl": "燃料存储:%s", - "metaarmor.hud.gravi_engine": "重力引擎:%s", - "metaarmor.hud.hover_mode": "悬浮模式:%s", - "metaarmor.hud.status.disabled": "§c关", - "metaarmor.hud.status.enabled": "§a开", - "metaarmor.jetpack.emergency_hover_mode": "紧急悬停模式已启用!", - "metaarmor.jetpack.flight.disable": "喷气背包:飞行已禁用", - "metaarmor.jetpack.flight.enable": "喷气背包:飞行已启用", - "metaarmor.jetpack.hover.disable": "喷气背包:悬停模式已禁用", - "metaarmor.jetpack.hover.enable": "喷气背包:悬停模式已启用", - "metaarmor.message.nightvision.disabled": "§b夜视:§c关闭", - "metaarmor.message.nightvision.enabled": "§b夜视:§a开启", - "metaarmor.message.nightvision.error": "§c能量不足!", - "metaarmor.nms.boosted_jump.disabled": "纳米肌体™套装:跳跃提升已禁用", - "metaarmor.nms.boosted_jump.enabled": "纳米肌体™套装:跳跃提升已启用", - "metaarmor.nms.nightvision.disabled": "纳米肌体™套装:夜视已禁用", - "metaarmor.nms.nightvision.enabled": "纳米肌体™套装:夜视已启用", - "metaarmor.nms.nightvision.error": "纳米肌体™套装:§c能量不足!", - "metaarmor.nms.share.disable": "纳米肌体™套装:供能模式已禁用", - "metaarmor.nms.share.enable": "纳米肌体™套装:供能模式已启用", - "metaarmor.nms.share.error": "纳米肌体™套装:§c能量不足,无法供能!", - "metaarmor.qts.nightvision.disabled": "夸克高科™套装:夜视已禁用", - "metaarmor.qts.nightvision.enabled": "夸克高科™套装:夜视已启用", - "metaarmor.qts.nightvision.error": "夸克高科™套装:§c能量不足!", - "metaarmor.qts.share.disable": "夸克高科™套装:供能模式已禁用", - "metaarmor.qts.share.enable": "夸克高科™套装:供能模式已启用", - "metaarmor.qts.share.error": "夸克高科™套装:§c能量不足,无法供能!", - "metaarmor.tooltip.autoeat": "使用物品栏中的食物补充饱食度", - "metaarmor.tooltip.breath": "补充氧气条", - "metaarmor.tooltip.burning": "扑灭身上的火焰", - "metaarmor.tooltip.falldamage": "消除摔落伤害", - "metaarmor.tooltip.freezing": "防止寒冷侵袭", - "metaarmor.tooltip.jump": "提升跳跃高度与距离", - "metaarmor.tooltip.potions": "消除负面效果", - "metaarmor.tooltip.speed": "提升奔跑速度", - "metaarmor.tooltip.stepassist": "提供步行辅助", + "armor.gtceu.energy_share.disable": "能量供给:工具充能已禁用", + "armor.gtceu.energy_share.enable": "能量供给:工具充能已启用", + "armor.gtceu.energy_share.error": "能量供给:§c能量不足,无法为工具充能!", + "armor.gtceu.energy_share.tooltip": "供能模式:%s", + "armor.gtceu.energy_share.tooltip.guide": "手持物品并潜行右击以更换模式", + "armor.gtceu.hud.energy_lvl": "能量存储:%s", + "armor.gtceu.hud.engine_enabled": "引擎已启用:%s", + "armor.gtceu.hud.fuel_lvl": "燃料存储:%s", + "armor.gtceu.hud.gravi_engine": "重力引擎:%s", + "armor.gtceu.hud.hover_mode": "悬浮模式:%s", + "armor.gtceu.hud.status.disabled": "§c关", + "armor.gtceu.hud.status.enabled": "§a开", + "armor.gtceu.jetpack.emergency_hover_mode": "紧急悬停模式已启用!", + "armor.gtceu.jetpack.flight.disable": "喷气背包:飞行已禁用", + "armor.gtceu.jetpack.flight.enable": "喷气背包:飞行已启用", + "armor.gtceu.jetpack.hover.disable": "喷气背包:悬停模式已禁用", + "armor.gtceu.jetpack.hover.enable": "喷气背包:悬停模式已启用", + "armor.gtceu.message.nightvision.disabled": "§b夜视:§c关闭", + "armor.gtceu.message.nightvision.enabled": "§b夜视:§a开启", + "armor.gtceu.message.nightvision.error": "§c能量不足!", + "armor.gtceu.nms.boosted_jump.disabled": "纳米肌体™套装:跳跃提升已禁用", + "armor.gtceu.nms.boosted_jump.enabled": "纳米肌体™套装:跳跃提升已启用", + "armor.gtceu.nms.nightvision.disabled": "纳米肌体™套装:夜视已禁用", + "armor.gtceu.nms.nightvision.enabled": "纳米肌体™套装:夜视已启用", + "armor.gtceu.nms.nightvision.error": "纳米肌体™套装:§c能量不足!", + "armor.gtceu.nms.share.disable": "纳米肌体™套装:供能模式已禁用", + "armor.gtceu.nms.share.enable": "纳米肌体™套装:供能模式已启用", + "armor.gtceu.nms.share.error": "纳米肌体™套装:§c能量不足,无法供能!", + "armor.gtceu.qts.nightvision.disabled": "夸克高科™套装:夜视已禁用", + "armor.gtceu.qts.nightvision.enabled": "夸克高科™套装:夜视已启用", + "armor.gtceu.qts.nightvision.error": "夸克高科™套装:§c能量不足!", + "armor.gtceu.qts.share.disable": "夸克高科™套装:供能模式已禁用", + "armor.gtceu.qts.share.enable": "夸克高科™套装:供能模式已启用", + "armor.gtceu.qts.share.error": "夸克高科™套装:§c能量不足,无法供能!", + "armor.gtceu.tooltip.autoeat": "使用物品栏中的食物补充饱食度", + "armor.gtceu.tooltip.breath": "补充氧气条", + "armor.gtceu.tooltip.burning": "扑灭身上的火焰", + "armor.gtceu.tooltip.falldamage": "消除摔落伤害", + "armor.gtceu.tooltip.freezing": "防止寒冷侵袭", + "armor.gtceu.tooltip.jump": "提升跳跃高度与距离", + "armor.gtceu.tooltip.potions": "消除负面效果", + "armor.gtceu.tooltip.speed": "提升奔跑速度", + "armor.gtceu.tooltip.stepassist": "提供步行辅助", "item.behavior.mode_switch.current_mode": "模式:%s", "item.behavior.mode_switch.mode_switched": "§e模式设置为:%s", "item.behavior.mode_switch.tooltip": "潜行右击以切换模式", diff --git a/src/main/resources/assets/gtceu/lang/zh_tw.json b/src/main/resources/assets/gtceu/lang/zh_tw.json index ef7457bbb46..32a2a48b150 100644 --- a/src/main/resources/assets/gtceu/lang/zh_tw.json +++ b/src/main/resources/assets/gtceu/lang/zh_tw.json @@ -5302,49 +5302,49 @@ "material.gtceu.zirconium": "鋯", "message.gtceu.new_veins.amount": "勘探到%d條新礦脈!", "message.gtceu.new_veins.name": "勘探到%s!", - "metaarmor.energy_share.disable": "能量供給:工具充能已禁用", - "metaarmor.energy_share.enable": "能量供給:工具充能已啟用", - "metaarmor.energy_share.error": "能量供給:§c能量不足,無法為工具充能!", - "metaarmor.energy_share.tooltip": "供能模式:%s", - "metaarmor.energy_share.tooltip.guide": "手持物品並潛行右擊以更換模式", - "metaarmor.hud.energy_lvl": "能量儲存:%s", - "metaarmor.hud.engine_enabled": "引擎已啟用:%s", - "metaarmor.hud.fuel_lvl": "燃料儲存:%s", - "metaarmor.hud.gravi_engine": "重力引擎:%s", - "metaarmor.hud.hover_mode": "懸浮模式:%s", - "metaarmor.hud.status.disabled": "§c關", - "metaarmor.hud.status.enabled": "§a開", - "metaarmor.jetpack.emergency_hover_mode": "緊急懸浮模式已啟用!", - "metaarmor.jetpack.flight.disable": "噴射背包:飛行已停用", - "metaarmor.jetpack.flight.enable": "噴射背包:飛行已啟用", - "metaarmor.jetpack.hover.disable": "噴射背包:懸浮模式已禁用", - "metaarmor.jetpack.hover.enable": "噴射背包:懸浮模式已啟用", - "metaarmor.message.nightvision.disabled": "§b夜視:§c關閉", - "metaarmor.message.nightvision.enabled": "§b夜視:§a開啟", - "metaarmor.message.nightvision.error": "§c能量不足!", - "metaarmor.nms.boosted_jump.disabled": "奈米肌體™套裝:跳躍提升已停用", - "metaarmor.nms.boosted_jump.enabled": "奈米肌體™套裝:跳躍提升已啟用", - "metaarmor.nms.nightvision.disabled": "奈米肌體™套裝:夜視已禁用", - "metaarmor.nms.nightvision.enabled": "奈米肌體™套裝:夜視已啟用", - "metaarmor.nms.nightvision.error": "奈米肌體™套裝:§c能量不足!", - "metaarmor.nms.share.disable": "奈米肌體™套裝:供能模式已禁用", - "metaarmor.nms.share.enable": "奈米肌體™套裝:供能模式已啟用", - "metaarmor.nms.share.error": "奈米肌體™套裝:§c能量不足,無法供能!", - "metaarmor.qts.nightvision.disabled": "夸克科技™套裝:夜視已禁用", - "metaarmor.qts.nightvision.enabled": "夸克科技™套裝:夜視已啟用", - "metaarmor.qts.nightvision.error": "夸克科技™套裝:§c能量不足!", - "metaarmor.qts.share.disable": "夸克科技™套裝:供能模式已禁用", - "metaarmor.qts.share.enable": "夸克科技™套裝:供能模式已啟用", - "metaarmor.qts.share.error": "夸克科技™套裝:§c能量不足,無法供能!", - "metaarmor.tooltip.autoeat": "使用物品欄中的食物補充飽食度", - "metaarmor.tooltip.breath": "補充氧氣條", - "metaarmor.tooltip.burning": "消除燃燒傷害", - "metaarmor.tooltip.falldamage": "消除摔落傷害", - "metaarmor.tooltip.freezing": "防止寒冷侵襲", - "metaarmor.tooltip.jump": "提升跳躍高度與距離", - "metaarmor.tooltip.potions": "消除負面效果", - "metaarmor.tooltip.speed": "提升奔跑速度", - "metaarmor.tooltip.stepassist": "提供步行輔助", + "armor.gtceu.energy_share.disable": "能量供給:工具充能已禁用", + "armor.gtceu.energy_share.enable": "能量供給:工具充能已啟用", + "armor.gtceu.energy_share.error": "能量供給:§c能量不足,無法為工具充能!", + "armor.gtceu.energy_share.tooltip": "供能模式:%s", + "armor.gtceu.energy_share.tooltip.guide": "手持物品並潛行右擊以更換模式", + "armor.gtceu.hud.energy_lvl": "能量儲存:%s", + "armor.gtceu.hud.engine_enabled": "引擎已啟用:%s", + "armor.gtceu.hud.fuel_lvl": "燃料儲存:%s", + "armor.gtceu.hud.gravi_engine": "重力引擎:%s", + "armor.gtceu.hud.hover_mode": "懸浮模式:%s", + "armor.gtceu.hud.status.disabled": "§c關", + "armor.gtceu.hud.status.enabled": "§a開", + "armor.gtceu.jetpack.emergency_hover_mode": "緊急懸浮模式已啟用!", + "armor.gtceu.jetpack.flight.disable": "噴射背包:飛行已停用", + "armor.gtceu.jetpack.flight.enable": "噴射背包:飛行已啟用", + "armor.gtceu.jetpack.hover.disable": "噴射背包:懸浮模式已禁用", + "armor.gtceu.jetpack.hover.enable": "噴射背包:懸浮模式已啟用", + "armor.gtceu.message.nightvision.disabled": "§b夜視:§c關閉", + "armor.gtceu.message.nightvision.enabled": "§b夜視:§a開啟", + "armor.gtceu.message.nightvision.error": "§c能量不足!", + "armor.gtceu.nms.boosted_jump.disabled": "奈米肌體™套裝:跳躍提升已停用", + "armor.gtceu.nms.boosted_jump.enabled": "奈米肌體™套裝:跳躍提升已啟用", + "armor.gtceu.nms.nightvision.disabled": "奈米肌體™套裝:夜視已禁用", + "armor.gtceu.nms.nightvision.enabled": "奈米肌體™套裝:夜視已啟用", + "armor.gtceu.nms.nightvision.error": "奈米肌體™套裝:§c能量不足!", + "armor.gtceu.nms.share.disable": "奈米肌體™套裝:供能模式已禁用", + "armor.gtceu.nms.share.enable": "奈米肌體™套裝:供能模式已啟用", + "armor.gtceu.nms.share.error": "奈米肌體™套裝:§c能量不足,無法供能!", + "armor.gtceu.qts.nightvision.disabled": "夸克科技™套裝:夜視已禁用", + "armor.gtceu.qts.nightvision.enabled": "夸克科技™套裝:夜視已啟用", + "armor.gtceu.qts.nightvision.error": "夸克科技™套裝:§c能量不足!", + "armor.gtceu.qts.share.disable": "夸克科技™套裝:供能模式已禁用", + "armor.gtceu.qts.share.enable": "夸克科技™套裝:供能模式已啟用", + "armor.gtceu.qts.share.error": "夸克科技™套裝:§c能量不足,無法供能!", + "armor.gtceu.tooltip.autoeat": "使用物品欄中的食物補充飽食度", + "armor.gtceu.tooltip.breath": "補充氧氣條", + "armor.gtceu.tooltip.burning": "消除燃燒傷害", + "armor.gtceu.tooltip.falldamage": "消除摔落傷害", + "armor.gtceu.tooltip.freezing": "防止寒冷侵襲", + "armor.gtceu.tooltip.jump": "提升跳躍高度與距離", + "armor.gtceu.tooltip.potions": "消除負面效果", + "armor.gtceu.tooltip.speed": "提升奔跑速度", + "armor.gtceu.tooltip.stepassist": "提供步行輔助", "item.behavior.mode_switch.current_mode": "模式:%s", "item.behavior.mode_switch.mode_switched": "§e模式設定為:%s", "item.behavior.mode_switch.tooltip": "潛行右擊以切換模式", From 38de8ef2f77997c20004370a012948e1c4cc1026 Mon Sep 17 00:00:00 2001 From: Spicierspace153 <21964509+Spicierspace153@users.noreply.github.com> Date: Thu, 19 Jun 2025 20:40:18 -0600 Subject: [PATCH 06/45] more renames to armor and lang handler javadoc for proper practice --- .../resources/assets/gtceu/lang/en_ud.json | 12 +++--- .../resources/assets/gtceu/lang/en_us.json | 12 +++--- .../item/armor/AdvancedNanoMuscleSuite.java | 4 +- .../item/armor/AdvancedQuarkTechSuite.java | 4 +- .../gtceu/data/lang/ArmorLang.java | 16 ++++---- .../gtceu/data/lang/LangHandler.java | 38 +++++++++---------- .../resources/assets/gtceu/lang/ja_jp.json | 12 +++--- .../resources/assets/gtceu/lang/ru_ru.json | 12 +++--- .../resources/assets/gtceu/lang/uk_ua.json | 12 +++--- .../resources/assets/gtceu/lang/zh_cn.json | 12 +++--- .../resources/assets/gtceu/lang/zh_tw.json | 12 +++--- 11 files changed, 72 insertions(+), 74 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 64d5eb045ea..65399fb0ab2 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -5338,15 +5338,15 @@ "armor.gtceu.nms.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıN :ǝʇınS ™ǝןɔsnWouɐN", "armor.gtceu.nms.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıN :ǝʇınS ™ǝןɔsnWouɐN", "armor.gtceu.nms.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nms.share.disable": "pǝןqɐsıᗡ buıbɹɐɥƆ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nms.share.enable": "pǝןqɐuƎ buıbɹɐɥƆ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nms.share.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.nms.charge.disable": "pǝןqɐsıᗡ buıbɹɐɥƆ :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.nms.charge.enable": "pǝןqɐuƎ buıbɹɐɥƆ :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.nms.charge.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", "armor.gtceu.qts.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıN :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", "armor.gtceu.qts.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıN :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", "armor.gtceu.qts.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "armor.gtceu.qts.share.disable": "pǝןqɐsıᗡ buıbɹɐɥƆ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "armor.gtceu.qts.share.enable": "pǝןqɐuƎ buıbɹɐɥƆ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "armor.gtceu.qts.share.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.qts.charge.disable": "pǝןqɐsıᗡ buıbɹɐɥƆ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.qts.charge.enable": "pǝןqɐuƎ buıbɹɐɥƆ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.qts.charge.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", "armor.gtceu.tooltip.autoeat": "ʎɹoʇuǝʌuI ɯoɹɟ pooℲ buıs∩ ʎq ɹɐᗺ pooℲ sǝɥsıuǝןdǝᴚ", "armor.gtceu.tooltip.breath": "ɹɐᗺ ɥʇɐǝɹᗺ ɹǝʇɐʍɹǝpu∩ sǝɥsıuǝןdǝᴚ", "armor.gtceu.tooltip.burning": "buıuɹnᗺ sǝıɟıןןnN", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index caf73ed9093..fe720e37417 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -5338,15 +5338,15 @@ "armor.gtceu.nms.nightvision.disabled": "NanoMuscle™ Suite: NightVision Disabled", "armor.gtceu.nms.nightvision.enabled": "NanoMuscle™ Suite: NightVision Enabled", "armor.gtceu.nms.nightvision.error": "NanoMuscle™ Suite: §cNot enough power!", - "armor.gtceu.nms.share.disable": "NanoMuscle™ Suite: Charging Disabled", - "armor.gtceu.nms.share.enable": "NanoMuscle™ Suite: Charging Enabled", - "armor.gtceu.nms.share.error": "NanoMuscle™ Suite: §cNot enough power for charging!", + "armor.gtceu.nms.charge.disable": "NanoMuscle™ Suite: Charging Disabled", + "armor.gtceu.nms.charge.enable": "NanoMuscle™ Suite: Charging Enabled", + "armor.gtceu.nms.charge.error": "NanoMuscle™ Suite: §cNot enough power for charging!", "armor.gtceu.qts.nightvision.disabled": "QuarkTech™ Suite: NightVision Disabled", "armor.gtceu.qts.nightvision.enabled": "QuarkTech™ Suite: NightVision Enabled", "armor.gtceu.qts.nightvision.error": "QuarkTech™ Suite: §cNot enough power!", - "armor.gtceu.qts.share.disable": "QuarkTech™ Suite: Charging Disabled", - "armor.gtceu.qts.share.enable": "QuarkTech™ Suite: Charging Enabled", - "armor.gtceu.qts.share.error": "QuarkTech™ Suite: §cNot enough power for charging!", + "armor.gtceu.qts.charge.disable": "QuarkTech™ Suite: Charging Disabled", + "armor.gtceu.qts.charge.enable": "QuarkTech™ Suite: Charging Enabled", + "armor.gtceu.qts.charge.error": "QuarkTech™ Suite: §cNot enough power for charging!", "armor.gtceu.tooltip.autoeat": "Replenishes Food Bar by Using Food from Inventory", "armor.gtceu.tooltip.breath": "Replenishes Underwater Breath Bar", "armor.gtceu.tooltip.burning": "Nullifies Burning", diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedNanoMuscleSuite.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedNanoMuscleSuite.java index 970e067729a..942416bf2cd 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedNanoMuscleSuite.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedNanoMuscleSuite.java @@ -75,10 +75,10 @@ public void onArmorTick(Level world, Player player, @NotNull ItemStack item) { } else if (KeyBind.ARMOR_CHARGING.isKeyDown(player)) { canShare = !canShare; if (canShare && cont.getCharge() == 0) { // Only allow for charging to be enabled if charge is nonzero - messageKey = "armor.gtceu.nms.share.error"; + messageKey = "armor.gtceu.nms.charge.error"; canShare = false; } else { - messageKey = "armor.gtceu.nms.share." + (canShare ? "enable" : "disable"); + messageKey = "armor.gtceu.nms.charge." + (canShare ? "enable" : "disable"); } data.putBoolean("canShare", canShare); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedQuarkTechSuite.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedQuarkTechSuite.java index 87143ded00e..5fbc9f313ba 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedQuarkTechSuite.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedQuarkTechSuite.java @@ -75,10 +75,10 @@ public void onArmorTick(Level world, Player player, ItemStack item) { } else if (KeyBind.ARMOR_CHARGING.isKeyDown(player)) { canShare = !canShare; if (canShare && cont.getCharge() == 0) { // Only allow for charging to be enabled if charge is nonzero - messageKey = "armor.gtceu.qts.share.error"; + messageKey = "armor.gtceu.qts.charge.error"; canShare = false; } else { - messageKey = "armor.gtceu.qts.share." + (canShare ? "enable" : "disable"); + messageKey = "armor.gtceu.qts.charge." + (canShare ? "enable" : "disable"); } data.putBoolean("canShare", canShare); } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java index 144e205b8af..d7bbee87f4a 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java @@ -14,18 +14,18 @@ public static void generateArmorKeys(RegistrateLangProvider provider) { provider.add("armor.gtceu.nms.boosted_jump.enabled", "NanoMuscle™ Suite: Jump Boost Enabled"); provider.add("armor.gtceu.nms.boosted_jump.disabled", "NanoMuscle™ Suite: Jump Boost Disabled"); provider.add("armor.gtceu.nms.nightvision.error", "NanoMuscle™ Suite: §cNot enough power!"); - provider.add("armor.gtceu.nms.share.enable", "NanoMuscle™ Suite: Charging Enabled"); - provider.add("armor.gtceu.nms.share.disable", "NanoMuscle™ Suite: Charging Disabled"); - provider.add("armor.gtceu.nms.share.error", "NanoMuscle™ Suite: §cNot enough power for charging!"); + provider.add("armor.gtceu.nms.charge.enable", "NanoMuscle™ Suite: Charging Enabled"); + provider.add("armor.gtceu.nms.charge.disable", "NanoMuscle™ Suite: Charging Disabled"); + provider.add("armor.gtceu.nms.charge.error", "NanoMuscle™ Suite: §cNot enough power for charging!"); // quantum suit provider.add("armor.gtceu.qts.nightvision.enabled", "QuarkTech™ Suite: NightVision Enabled"); provider.add("armor.gtceu.qts.nightvision.disabled", "QuarkTech™ Suite: NightVision Disabled"); provider.add("armor.gtceu.qts.nightvision.error", "QuarkTech™ Suite: §cNot enough power!"); - provider.add("armor.gtceu.qts.share.enable", "QuarkTech™ Suite: Charging Enabled"); - provider.add("armor.gtceu.qts.share.disable", "QuarkTech™ Suite: Charging Disabled"); - provider.add("armor.gtceu.qts.share.error", "QuarkTech™ Suite: §cNot enough power for charging!"); + provider.add("armor.gtceu.qts.charge.enable", "QuarkTech™ Suite: Charging Enabled"); + provider.add("armor.gtceu.qts.charge.disable", "QuarkTech™ Suite: Charging Disabled"); + provider.add("armor.gtceu.qts.charge.error", "QuarkTech™ Suite: §cNot enough power for charging!"); //jetpacks @@ -34,7 +34,7 @@ public static void generateArmorKeys(RegistrateLangProvider provider) { provider.add("armor.gtceu.jetpack.hover.enable", "Jetpack: Hover Mode Enabled"); provider.add("armor.gtceu.jetpack.hover.disable", "Jetpack: Hover Mode Disabled"); provider.add("armor.gtceu.jetpack.emergency_hover_mode", "Emergency Hover Mode Enabled!"); - provider.add("item.liquid_fuel_jetpack.tooltip", "Uses Combustion Generator Fuels for Thrust"); + //action bar messages provider.add("armor.gtceu.message.nightvision.enabled", "§bNightVision: §aOn"); @@ -46,6 +46,8 @@ public static void generateArmorKeys(RegistrateLangProvider provider) { public static void generateTooltipKeys(RegistrateLangProvider provider){ + provider.add("item.liquid_fuel_jetpack.tooltip", "Uses Combustion Generator Fuels for Thrust"); + // basic ability tooltips provider.add("armor.gtceu.tooltip.stepassist", "Provides Step-Assist"); provider.add("armor.gtceu.tooltip.speed", "Increases Running Speed"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java index cffb8a15884..2fc7f7b8152 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -1,30 +1,26 @@ package com.gregtechceu.gtceu.data.lang; - -import com.gregtechceu.gtceu.common.data.GTBlocks; - - -import net.minecraft.locale.Language; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; -import net.minecraftforge.common.data.LanguageProvider; - import com.tterrag.registrate.providers.RegistrateLangProvider; - - -import org.jetbrains.annotations.NotNull; - -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - import static com.gregtechceu.gtceu.data.lang.LangUtil.*; public class LangHandler { + /** + * + Unformatted text must be in light gray - §7 + Items must be in gold - §6 + Fluids must be in blue - §9 + Directions must be in yellow - §e + Disabled/Inactive must be in red - §c + Enabled/Active must be in green - §a + Potion effects must be in yellow - §e + Time must be in red - §c + Percentages must be in green - §a + Keys must be in all caps + Key combos must follow the format KEY1 + KEY2 (for example, SHIFT + R-CLICK) + + * @param provider + */ + public static void init(RegistrateLangProvider provider) { AdvancementLang.init(provider); BlockLang.init(provider); diff --git a/src/main/resources/assets/gtceu/lang/ja_jp.json b/src/main/resources/assets/gtceu/lang/ja_jp.json index 7d54f885744..1e219ce3979 100644 --- a/src/main/resources/assets/gtceu/lang/ja_jp.json +++ b/src/main/resources/assets/gtceu/lang/ja_jp.json @@ -5267,15 +5267,15 @@ "armor.gtceu.nms.nightvision.disabled": "NanoMuscle™ Suite: 暗視を無効化", "armor.gtceu.nms.nightvision.enabled": "NanoMuscle™ Suite: 暗視を有効化", "armor.gtceu.nms.nightvision.error": "NanoMuscle™ Suite: §cエネルギー不足!", - "armor.gtceu.nms.share.disable": "NanoMuscle™ Suite: 電力供給を無効化", - "armor.gtceu.nms.share.enable": "NanoMuscle™ Suite: 電力供給を有効化", - "armor.gtceu.nms.share.error": "NanoMuscle™ Suite: §cエネルギー不足!", + "armor.gtceu.nms.charge.disable": "NanoMuscle™ Suite: 電力供給を無効化", + "armor.gtceu.nms.charge.enable": "NanoMuscle™ Suite: 電力供給を有効化", + "armor.gtceu.nms.charge.error": "NanoMuscle™ Suite: §cエネルギー不足!", "armor.gtceu.qts.nightvision.disabled": "QuarkTech™ Suite: 暗視を無効化", "armor.gtceu.qts.nightvision.enabled": "QuarkTech™ Suite: 暗視を有効化", "armor.gtceu.qts.nightvision.error": "QuarkTech™ Suite: §cエネルギー不足!", - "armor.gtceu.qts.share.disable": "QuarkTech™ Suite: 電力供給を無効化", - "armor.gtceu.qts.share.enable": "QuarkTech™ Suite: 電力供給を有効化", - "armor.gtceu.qts.share.error": "QuarkTech™ Suite: §cエネルギー不足!", + "armor.gtceu.qts.charge.disable": "QuarkTech™ Suite: 電力供給を無効化", + "armor.gtceu.qts.charge.enable": "QuarkTech™ Suite: 電力供給を有効化", + "armor.gtceu.qts.charge.error": "QuarkTech™ Suite: §cエネルギー不足!", "armor.gtceu.tooltip.autoeat": "インベントリの食料で満腹度回復", "armor.gtceu.tooltip.breath": "水中呼吸", "armor.gtceu.tooltip.burning": "炎上無効", diff --git a/src/main/resources/assets/gtceu/lang/ru_ru.json b/src/main/resources/assets/gtceu/lang/ru_ru.json index 53b7d196d25..09c92ef007d 100644 --- a/src/main/resources/assets/gtceu/lang/ru_ru.json +++ b/src/main/resources/assets/gtceu/lang/ru_ru.json @@ -2777,15 +2777,15 @@ "armor.gtceu.nms.nightvision.disabled": "NanoMuscle™ броня: ПНВ выключено", "armor.gtceu.nms.nightvision.enabled": "NanoMuscle™ броня: ПНВ включено", "armor.gtceu.nms.nightvision.error": "NanoMuscle™ броня: §cНедостаточно энергии!", - "armor.gtceu.nms.share.disable": "NanoMuscle™ броня: Зарядка отключена", - "armor.gtceu.nms.share.enable": "NanoMuscle™ броня: Зарядка включена", - "armor.gtceu.nms.share.error": "NanoMuscle™ броня: §cНедостаточно энергии для зарядки!", + "armor.gtceu.nms.charge.disable": "NanoMuscle™ броня: Зарядка отключена", + "armor.gtceu.nms.charge.enable": "NanoMuscle™ броня: Зарядка включена", + "armor.gtceu.nms.charge.error": "NanoMuscle™ броня: §cНедостаточно энергии для зарядки!", "armor.gtceu.qts.nightvision.disabled": "QuarkTech™ броня: ПНВ выключено", "armor.gtceu.qts.nightvision.enabled": "QuarkTech™ броня: ПНВ включено", "armor.gtceu.qts.nightvision.error": "QuarkTech™ броня: §cНедостаточно энергии!", - "armor.gtceu.qts.share.disable": "QuarkTech™ броня: Зарядка отключена", - "armor.gtceu.qts.share.enable": "QuarkTech™ броня: Зарядка включена", - "armor.gtceu.qts.share.error": "QuarkTech™ броня: §cНедостаточно энергии для зарядки!", + "armor.gtceu.qts.charge.disable": "QuarkTech™ броня: Зарядка отключена", + "armor.gtceu.qts.charge.enable": "QuarkTech™ броня: Зарядка включена", + "armor.gtceu.qts.charge.error": "QuarkTech™ броня: §cНедостаточно энергии для зарядки!", "armor.gtceu.tooltip.autoeat": "Пополняет шкалу еды, используя еду из инвентаря", "armor.gtceu.tooltip.breath": "Пополняет полосу подводного дыхания", "armor.gtceu.tooltip.burning": "Аннулирует урон от огня", diff --git a/src/main/resources/assets/gtceu/lang/uk_ua.json b/src/main/resources/assets/gtceu/lang/uk_ua.json index 6dea3607d35..85ffe7752e7 100644 --- a/src/main/resources/assets/gtceu/lang/uk_ua.json +++ b/src/main/resources/assets/gtceu/lang/uk_ua.json @@ -5132,15 +5132,15 @@ "armor.gtceu.nms.nightvision.disabled": "Комплект NanoMuscle™: Нічне бачення вимкнено", "armor.gtceu.nms.nightvision.enabled": "Комплект NanoMuscle™: Нічне бачення увімкнено", "armor.gtceu.nms.nightvision.error": "Комплект NanoMuscle™:§c Недостатньо енергії!", - "armor.gtceu.nms.share.disable": "Комплект NanoMuscle™: Заряджання вимкнено", - "armor.gtceu.nms.share.enable": "Комплект NanoMuscle™: Заряджання увімкнено", - "armor.gtceu.nms.share.error": "Комплект NanoMuscle™:§c Недостатньо енергії для заряджання!", + "armor.gtceu.nms.charge.disable": "Комплект NanoMuscle™: Заряджання вимкнено", + "armor.gtceu.nms.charge.enable": "Комплект NanoMuscle™: Заряджання увімкнено", + "armor.gtceu.nms.charge.error": "Комплект NanoMuscle™:§c Недостатньо енергії для заряджання!", "armor.gtceu.qts.nightvision.disabled": "Комплект QuarkTech™: Нічне бачення вимкнено", "armor.gtceu.qts.nightvision.enabled": "Комплект QuarkTech™: Нічне бачення увімкнено", "armor.gtceu.qts.nightvision.error": "Комплект QuarkTech™:§c Недостатньо енергії!", - "armor.gtceu.qts.share.disable": "Комплект QuarkTech™: Заряджання вимкнено", - "armor.gtceu.qts.share.enable": "Комплект QuarkTech™: Заряджання увімкнено", - "armor.gtceu.qts.share.error": "Комплект QuarkTech™:§c Недостатньо енергії для заряджання!", + "armor.gtceu.qts.charge.disable": "Комплект QuarkTech™: Заряджання вимкнено", + "armor.gtceu.qts.charge.enable": "Комплект QuarkTech™: Заряджання увімкнено", + "armor.gtceu.qts.charge.error": "Комплект QuarkTech™:§c Недостатньо енергії для заряджання!", "armor.gtceu.tooltip.autoeat": "Поповнює очки голоду з інвентарю", "armor.gtceu.tooltip.breath": "Поповнює очки запасу повітря", "armor.gtceu.tooltip.burning": "Знешкоджує горіння", diff --git a/src/main/resources/assets/gtceu/lang/zh_cn.json b/src/main/resources/assets/gtceu/lang/zh_cn.json index d46436a42f1..ef7fcd261e3 100644 --- a/src/main/resources/assets/gtceu/lang/zh_cn.json +++ b/src/main/resources/assets/gtceu/lang/zh_cn.json @@ -5327,15 +5327,15 @@ "armor.gtceu.nms.nightvision.disabled": "纳米肌体™套装:夜视已禁用", "armor.gtceu.nms.nightvision.enabled": "纳米肌体™套装:夜视已启用", "armor.gtceu.nms.nightvision.error": "纳米肌体™套装:§c能量不足!", - "armor.gtceu.nms.share.disable": "纳米肌体™套装:供能模式已禁用", - "armor.gtceu.nms.share.enable": "纳米肌体™套装:供能模式已启用", - "armor.gtceu.nms.share.error": "纳米肌体™套装:§c能量不足,无法供能!", + "armor.gtceu.nms.charge.disable": "纳米肌体™套装:供能模式已禁用", + "armor.gtceu.nms.charge.enable": "纳米肌体™套装:供能模式已启用", + "armor.gtceu.nms.charge.error": "纳米肌体™套装:§c能量不足,无法供能!", "armor.gtceu.qts.nightvision.disabled": "夸克高科™套装:夜视已禁用", "armor.gtceu.qts.nightvision.enabled": "夸克高科™套装:夜视已启用", "armor.gtceu.qts.nightvision.error": "夸克高科™套装:§c能量不足!", - "armor.gtceu.qts.share.disable": "夸克高科™套装:供能模式已禁用", - "armor.gtceu.qts.share.enable": "夸克高科™套装:供能模式已启用", - "armor.gtceu.qts.share.error": "夸克高科™套装:§c能量不足,无法供能!", + "armor.gtceu.qts.charge.disable": "夸克高科™套装:供能模式已禁用", + "armor.gtceu.qts.charge.enable": "夸克高科™套装:供能模式已启用", + "armor.gtceu.qts.charge.error": "夸克高科™套装:§c能量不足,无法供能!", "armor.gtceu.tooltip.autoeat": "使用物品栏中的食物补充饱食度", "armor.gtceu.tooltip.breath": "补充氧气条", "armor.gtceu.tooltip.burning": "扑灭身上的火焰", diff --git a/src/main/resources/assets/gtceu/lang/zh_tw.json b/src/main/resources/assets/gtceu/lang/zh_tw.json index 32a2a48b150..098992f538b 100644 --- a/src/main/resources/assets/gtceu/lang/zh_tw.json +++ b/src/main/resources/assets/gtceu/lang/zh_tw.json @@ -5327,15 +5327,15 @@ "armor.gtceu.nms.nightvision.disabled": "奈米肌體™套裝:夜視已禁用", "armor.gtceu.nms.nightvision.enabled": "奈米肌體™套裝:夜視已啟用", "armor.gtceu.nms.nightvision.error": "奈米肌體™套裝:§c能量不足!", - "armor.gtceu.nms.share.disable": "奈米肌體™套裝:供能模式已禁用", - "armor.gtceu.nms.share.enable": "奈米肌體™套裝:供能模式已啟用", - "armor.gtceu.nms.share.error": "奈米肌體™套裝:§c能量不足,無法供能!", + "armor.gtceu.nms.charge.disable": "奈米肌體™套裝:供能模式已禁用", + "armor.gtceu.nms.charge.enable": "奈米肌體™套裝:供能模式已啟用", + "armor.gtceu.nms.charge.error": "奈米肌體™套裝:§c能量不足,無法供能!", "armor.gtceu.qts.nightvision.disabled": "夸克科技™套裝:夜視已禁用", "armor.gtceu.qts.nightvision.enabled": "夸克科技™套裝:夜視已啟用", "armor.gtceu.qts.nightvision.error": "夸克科技™套裝:§c能量不足!", - "armor.gtceu.qts.share.disable": "夸克科技™套裝:供能模式已禁用", - "armor.gtceu.qts.share.enable": "夸克科技™套裝:供能模式已啟用", - "armor.gtceu.qts.share.error": "夸克科技™套裝:§c能量不足,無法供能!", + "armor.gtceu.qts.charge.disable": "夸克科技™套裝:供能模式已禁用", + "armor.gtceu.qts.charge.enable": "夸克科技™套裝:供能模式已啟用", + "armor.gtceu.qts.charge.error": "夸克科技™套裝:§c能量不足,無法供能!", "armor.gtceu.tooltip.autoeat": "使用物品欄中的食物補充飽食度", "armor.gtceu.tooltip.breath": "補充氧氣條", "armor.gtceu.tooltip.burning": "消除燃燒傷害", From d74ae71e1e7a62e6921b3c9f9607ad4da52b4c01 Mon Sep 17 00:00:00 2001 From: Spicierspace153 <21964509+Spicierspace153@users.noreply.github.com> Date: Thu, 19 Jun 2025 21:06:03 -0600 Subject: [PATCH 07/45] someone(onion) forgot to change uses when moving classes --- .../resources/assets/gtceu/lang/en_ud.json | 951 +++--------------- .../resources/assets/gtceu/lang/en_us.json | 951 +++--------------- .../gtceu/api/cover/filter/TagFilter.java | 4 +- .../api/gui/widget/EnumSelectorWidget.java | 3 +- .../api/gui/widget/ToggleButtonWidget.java | 3 +- .../api/machine/SimpleTieredMachine.java | 5 +- .../CircuitFancyConfigurator.java | 3 +- .../pattern/predicates/SimplePredicate.java | 6 +- .../gtceu/client/TooltipsHandler.java | 4 +- .../gtceu/common/data/GTItems.java | 20 +- .../gtceu/common/data/GTMachines.java | 11 +- .../data/machines/GTResearchMachines.java | 5 +- .../machine/electric/BlockBreakerMachine.java | 3 +- .../machine/electric/FisherMachine.java | 5 +- .../electric/ItemCollectorMachine.java | 3 +- .../common/machine/electric/MinerMachine.java | 3 +- .../gtceu/data/lang/ArmorLang.java | 49 +- .../gtceu/data/lang/LangHandler.java | 3 +- .../resources/assets/gtceu/lang/ja_jp.json | 4 +- .../resources/assets/gtceu/lang/ru_ru.json | 4 +- .../resources/assets/gtceu/lang/uk_ua.json | 4 +- .../resources/assets/gtceu/lang/zh_cn.json | 4 +- .../resources/assets/gtceu/lang/zh_tw.json | 4 +- 23 files changed, 418 insertions(+), 1634 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 65399fb0ab2..f07ddf1db83 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -1,99 +1,51 @@ { + "armor.gtceu.energy_share.disable": "pǝןqɐsıp buıbɹɐɥɔ sʇǝbpɐ⅁ :ʎןddnS ʎbɹǝuƎ", + "armor.gtceu.energy_share.enable": "pǝןqɐuǝ buıbɹɐɥɔ sʇǝbpɐ⅁ :ʎןddnS ʎbɹǝuƎɐ§", + "armor.gtceu.energy_share.error": "¡buıbɹɐɥɔ sʇǝbpɐb ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ʎןddnS ʎbɹǝuƎ", + "armor.gtceu.energy_share.tooltip": "%s :ǝpoɯ ʎןddnS", + "armor.gtceu.energy_share.tooltip.guide": "ɯǝʇı buıpןoɥ uǝɥʍ ʞɔıןɔ ʇɥbıɹ-ʇɟıɥs ǝpoɯ ǝbuɐɥɔ o⟘", + "armor.gtceu.hud.energy_lvl": "%s :ןǝʌǝꞀ ʎbɹǝuƎ", + "armor.gtceu.hud.engine_enabled": "%s :pǝןqɐuƎ ǝuıbuƎɐ§", + "armor.gtceu.hud.fuel_lvl": "%s :ןǝʌǝꞀ ןǝnℲ", + "armor.gtceu.hud.gravi_engine": "%s :ǝuıbuƎıʌɐɹ⅁", + "armor.gtceu.hud.hover_mode": "%s :ǝpoW ɹǝʌoH", + "armor.gtceu.hud.status.disabled": "ℲℲOɔ§", + "armor.gtceu.hud.status.enabled": "NOɐ§", + "armor.gtceu.jetpack.emergency_hover_mode": "¡pǝןqɐuƎ ǝpoW ɹǝʌoH ʎɔuǝbɹǝɯƎɐ§", + "armor.gtceu.jetpack.flight.disable": "pǝןqɐsıᗡ ʇɥbıןℲ :ʞɔɐdʇǝſɔ§ ", + "armor.gtceu.jetpack.flight.enable": "pǝןqɐuƎ ʇɥbıןℲ :ʞɔɐdʇǝſɐ§", + "armor.gtceu.jetpack.hover.disable": "pǝןqɐsıᗡ ǝpoW ɹǝʌoH :ʞɔɐdʇǝſɔ§ ", + "armor.gtceu.jetpack.hover.enable": "pǝןqɐuƎ ǝpoW ɹǝʌoH :ʞɔɐdʇǝſɐ§", + "armor.gtceu.message.nightvision.disabled": "ɟɟOɔ§ :uoısıΛʇɥbıNɔ§ ", + "armor.gtceu.message.nightvision.enabled": "uOɐ§ :uoısıΛʇɥbıNɐ§", + "armor.gtceu.message.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§", + "armor.gtceu.nms.boosted_jump.disabled": "pǝןqɐsıᗡ ʇsooᗺ dɯnſ :ǝʇınS ™ǝןɔsnWouɐNɔ§ ", + "armor.gtceu.nms.boosted_jump.enabled": "pǝןqɐuƎ ʇsooᗺ dɯnſ :ǝʇınS ™ǝןɔsnWouɐNɐ§", + "armor.gtceu.nms.charge.disable": "pǝןqɐsıᗡ buıbɹɐɥƆ :ǝʇınS ™ǝןɔsnWouɐNɔ§ ", + "armor.gtceu.nms.charge.enabled": "pǝןqɐuƎ buıbɹɐɥƆ :ǝʇınS ™ǝןɔsnWouɐNɐ§", + "armor.gtceu.nms.charge.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.nms.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıN :ǝʇınS ™ǝןɔsnWouɐNɔ§ ", + "armor.gtceu.nms.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıN :ǝʇınS ™ǝןɔsnWouɐNɐ§", + "armor.gtceu.nms.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.qts.charge.disable": "pǝןqɐsıᗡ buıbɹɐɥƆ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉɔ§ ", + "armor.gtceu.qts.charge.enabled": "pǝןqɐuƎ buıbɹɐɥƆ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉɐ§", + "armor.gtceu.qts.charge.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉɔ§ ", + "armor.gtceu.qts.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıN :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉɔ§ ", + "armor.gtceu.qts.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıN :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉɐ§ɐ§", + "armor.gtceu.qts.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉɔ§ ", + "armor.gtceu.tooltip.autoeat": "ʎɹoʇuǝʌuI ɯoɹɟ pooℲ buıs∩ ʎq ɹɐᗺ pooℲ sǝɥsıuǝןdǝᴚ", + "armor.gtceu.tooltip.breath": "ɹɐᗺ ɥʇɐǝɹᗺ ɹǝʇɐʍɹǝpu∩ sǝɥsıuǝןdǝᴚ", + "armor.gtceu.tooltip.burning": "buıuɹnᗺ sǝıɟıןןnN", + "armor.gtceu.tooltip.falldamage": "ǝbɐɯɐᗡ ןןɐℲ sǝıɟıןןnN", + "armor.gtceu.tooltip.freezing": "buızǝǝɹℲ sʇuǝʌǝɹԀ", + "armor.gtceu.tooltip.jump": "ǝɔuɐʇsıᗡ puɐ ʇɥbıǝH dɯnſ sǝsɐǝɹɔuI", + "armor.gtceu.tooltip.potions": "sʇɔǝɟɟƎ ןnɟɯɹɐH sǝıɟıןןnN", + "armor.gtceu.tooltip.speed": "pǝǝdS buıuunᴚ sǝsɐǝɹɔuI", + "armor.gtceu.tooltip.stepassist": "ʇsıssⱯ-dǝʇS sǝpıʌoɹԀ", "behavior.data_item.assemblyline.data": "%sɐ§ -", "behavior.data_item.assemblyline.title": ":ɐʇɐᗡ uoıʇɔnɹʇsuoƆ ǝuıꞀ ʎןqɯǝssⱯu§", "behavior.item_magnet.disabled": "pǝןqɐsıᗡ pןǝıℲ ɔıʇǝubɐWɔ§", "behavior.item_magnet.enabled": "pǝןqɐuƎ pןǝıℲ ɔıʇǝubɐWɐ§", - "behavior.portable_scanner.amp_per_sec": "Ɐ %s :)puoɔǝs ʇsɐן( ǝbɐɹǝʌⱯ", - "behavior.portable_scanner.bedrock_fluid.amount": "%s%% - %s %s :ʇısodǝᗡ uI pınןℲ", - "behavior.portable_scanner.bedrock_fluid.amount_unknown": "%s%% :ʇısodǝᗡ uI pınןℲ", - "behavior.portable_scanner.bedrock_fluid.nothing": "ɹ§buıɥʇoN9§ :ʇısodǝᗡ uI pınןℲ", - "behavior.portable_scanner.block_hardness": "%s :ǝɔuɐʇsısǝᴚ ʇsɐןᗺ %s :ssǝupɹɐH", - "behavior.portable_scanner.block_name": "%s :ɐʇɐᗡɐʇǝW %s :ǝɯɐN", - "behavior.portable_scanner.debug_cpu_load": "˙su%s ɟo ǝɯıʇ ʇsɹoʍ ɥʇıʍ sʞɔıʇ %s ɹǝʌo su%s~ ɟo pɐoן ∩ԀƆ ǝbɐɹǝʌⱯ", - "behavior.portable_scanner.debug_cpu_load_seconds": "˙spuoɔǝs %s sı sıɥ⟘", - "behavior.portable_scanner.debug_lag_count": "˙ɹǝʌɹǝS ǝɥʇ uo )sɯ%s uɐɥʇ ɹǝbuoן buıʞɐʇ buıɥʇʎuɐ( sbuıuɹɐM ǝʞıdS bɐꞀ %s pǝsnɐƆ", - "behavior.portable_scanner.debug_machine": "%s :ᗡI-ɐʇǝW", - "behavior.portable_scanner.debug_machine_invalid": "¡pıןɐʌuı ", - "behavior.portable_scanner.debug_machine_invalid_null=invalid! MetaTileEntity =": "¡ןןnu ", - "behavior.portable_scanner.debug_machine_valid": "pıןɐʌ ", - "behavior.portable_scanner.divider": "=========================", - "behavior.portable_scanner.energy_container_in": "Ɐ %s ʇɐ ∩Ǝ )%s( %s :NI xɐW", - "behavior.portable_scanner.energy_container_out": "Ɐ %s ʇɐ ∩Ǝ )%s( %s :⟘∩O xɐW", - "behavior.portable_scanner.energy_container_storage": "∩Ǝ %s / ∩Ǝ %s :ʎbɹǝuƎ", - "behavior.portable_scanner.environmental_hazard": "ɯdd %s - ɹ§%s :ʞunɥƆ uI pɹɐzɐH ןɐʇuǝɯuoɹıʌuƎ", - "behavior.portable_scanner.environmental_hazard.nothing": "ɹ§buıɥʇoN9§ :ʞunɥƆ uI pɹɐzɐH ןɐʇuǝɯuoɹıʌuƎ", - "behavior.portable_scanner.eu_per_sec": "ʇ/∩Ǝ %s :)puoɔǝs ʇsɐן( ǝbɐɹǝʌⱯ", - "behavior.portable_scanner.guild_name": "ɹ§%s :ǝɯɐN pןın⅁ᄅ§", - "behavior.portable_scanner.local_hazard": "ɯdd %s - ɹ§%s :ɐǝɹⱯ uI pɹɐzɐH ןɐɔoꞀ", - "behavior.portable_scanner.local_hazard.nothing": "ɹ§buıɥʇoN9§ :ɐǝɹⱯ uI pɹɐzɐH ןɐɔoꞀ", - "behavior.portable_scanner.machine_disabled": "˙pǝןqɐsıᗡ", - "behavior.portable_scanner.machine_front_facing": "%s :buıɔɐℲ ʇuoɹℲ", - "behavior.portable_scanner.machine_ownership": "ɹ§%s :ǝdʎ⟘ ɹǝuʍO ǝuıɥɔɐWᄅ§", - "behavior.portable_scanner.machine_power_loss": "˙ssoן ɹǝʍod oʇ ǝnp uʍop ʇnɥS", - "behavior.portable_scanner.machine_progress": "%s / %s :pɐoꞀ/ssǝɹboɹԀ", - "behavior.portable_scanner.machine_upwards_facing": "%s :buıɔɐℲ spɹɐʍd∩", - "behavior.portable_scanner.mode.caption": "%s :ǝpoɯ ʎɐןdsıᗡ", - "behavior.portable_scanner.mode.show_all_info": "oɟuı ןןɐ ʍoɥS", - "behavior.portable_scanner.mode.show_block_info": "oɟuı ʞɔoןq ʍoɥS", - "behavior.portable_scanner.mode.show_electrical_info": "oɟuı ןɐɔıɹʇɔǝןǝ ʍoɥS", - "behavior.portable_scanner.mode.show_environmental_info": "oɟuı ןɐʇuǝɯuoɹıʌuǝ ʍoɥS", - "behavior.portable_scanner.mode.show_machine_info": "oɟuı ǝuıɥɔɐɯ ʍoɥS", - "behavior.portable_scanner.mode.show_recipe_info": "oɟuı ǝdıɔǝɹ ʍoɥS", - "behavior.portable_scanner.muffled": "˙pǝןɟɟnW", - "behavior.portable_scanner.multiblock_energy_input": "%s :ɹǝı⟘ ʇ/∩Ǝ %s :ǝɯoɔuI ʎbɹǝuƎ xɐW", - "behavior.portable_scanner.multiblock_energy_output": "%s :ɹǝı⟘ ʇ/∩Ǝ %s :ʇndʇnO ʎbɹǝuƎ xɐW", - "behavior.portable_scanner.multiblock_maintenance": "%s :sɯǝןqoɹԀ", - "behavior.portable_scanner.multiblock_parallel": "%s :buıssǝɔoɹԀ ıʇןnW", - "behavior.portable_scanner.player_name": "ɹ§%s :ǝuıןuO ɹǝʎɐןԀㄥ§ 'ɹ§%s :ǝɯɐN ɹǝʎɐןԀᄅ§", - "behavior.portable_scanner.position": "----- %s :ᗡ %s :Z %s :ʎ %s :X -----", - "behavior.portable_scanner.state": "%s :%s", - "behavior.portable_scanner.tank": "%s ᗺɯ %s / ᗺɯ %s :%s ʞuɐ⟘", - "behavior.portable_scanner.tanks_empty": "ʎʇdɯƎ sʞuɐ⟘ ןןⱯ", - "behavior.portable_scanner.team_name": "ɹ§%s :ǝɯɐN ɯɐǝ⟘ᄅ§", - "behavior.portable_scanner.workable_consumption": "Ɐ %s ʇɐ ʇ/∩Ǝ %s :sǝs∩ ʎןqɐqoɹԀ", - "behavior.portable_scanner.workable_production": "Ɐ %s ʇɐ ʇ/∩Ǝ %s :sǝɔnpoɹԀ ʎןqɐqoɹԀ", - "behavior.portable_scanner.workable_progress": "s %s / s %s :ssǝɹboɹԀ", - "behavior.portable_scanner.workable_stored_energy": "∩Ǝ %s / ∩Ǝ %s :ʎbɹǝuƎ pǝɹoʇS", - "behavior.prospector.added_waypoint": "¡%s pǝɯɐu ʇuıodʎɐʍ pǝʇɐǝɹƆ", - "behavior.prospector.not_enough_energy": "¡ʎbɹǝuƎ ɥbnouƎ ʇoN", - "behavior.toggle_energy_consumer.tooltip": "ǝpoɯ ǝןbboʇ oʇ ǝs∩", - "behaviour.boor.by": "%s ʎq", - "behaviour.hammer": ")ɯǝɥʇ buıʇʇıɥ ʎq( sǝuıɥɔɐW ɹoɟ buıןɟɟnW ɟɟo puɐ uo suɹn⟘", - "behaviour.hoe": "ʇɹıp ןןıʇ uɐƆ", - "behaviour.lighter.fluid.tooltip": "ǝuɐdoɹԀ ɹo ǝuɐʇnᗺ ɥʇıʍ ǝɹıɟ uo sbuıɥʇ ʇɥbıן uɐƆ", - "behaviour.lighter.tooltip.description": "ǝɹıɟ uo sbuıɥʇ ʇɥbıן uɐƆ", - "behaviour.lighter.tooltip.usage": "ǝsoןɔ/uǝdo oʇ ʞɔıןɔ ʇɥbıɹ-ʇɟıɥS", - "behaviour.lighter.uses": "%d :sǝsn buıuıɐɯǝᴚ", - "behaviour.meta.machine.config.copy.tooltip": "uoıʇɐɹnbıɟuoɔ ǝuıɥɔɐɯ ʎdoɔ oʇ ʞɔıןƆ-ᴚ + ʞɐǝuSㄥ§", - "behaviour.meta.machine.config.paste.tooltip": "uoıʇɐɹnbıɟuoɔ ǝuıɥɔɐɯ ǝʇsɐd oʇ ʞɔıןƆ-ᴚㄥ§", - "behaviour.paintspray.black.tooltip": "ʞɔɐןᗺ uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.blue.tooltip": "ǝnןᗺ uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.brown.tooltip": "uʍoɹᗺ uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.cyan.tooltip": "uɐʎƆ uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.gray.tooltip": "ʎɐɹ⅁ uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.green.tooltip": "uǝǝɹ⅁ uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.light_blue.tooltip": "ǝnןᗺ ʇɥbıꞀ uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.light_gray.tooltip": "ʎɐɹ⅁ ʇɥbıꞀ uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.lime.tooltip": "ǝɯıꞀ uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.magenta.tooltip": "ɐʇuǝbɐW uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.orange.tooltip": "ǝbuɐɹO uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.pink.tooltip": "ʞuıԀ uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.purple.tooltip": "ǝןdɹnԀ uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.red.tooltip": "pǝᴚ uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.solvent.tooltip": "sbuıɥʇ ɯoɹɟ ɹoןoɔ ǝʌoɯǝɹ uɐƆ", - "behaviour.paintspray.uses": "%d :sǝs∩ buıuıɐɯǝᴚ", - "behaviour.paintspray.white.tooltip": "ǝʇıɥM uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.yellow.tooltip": "ʍoןןǝʎ uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.prospecting": "buıʇɔǝdsoɹԀ ɹoɟ ǝןqɐs∩", - "behaviour.setting.allow.input.from.output.tooltip": "%s sı ǝpıs ʇndʇno ɯoɹɟ ʇnduı %s", - "behaviour.setting.item_auto_output.tooltip": "%s sı ʇndʇno-oʇnɐ %s", - "behaviour.setting.muffled.tooltip": "%s buıןɟɟnW", - "behaviour.setting.output.direction.tooltip": "%s :uoıʇɔǝɹıp ʇndʇno %s", - "behaviour.soft_hammer": "sǝuıɥɔɐW sǝʇɐʌıʇɔɐǝᗡ puɐ sǝʇɐʌıʇɔⱯ", - "behaviour.soft_hammer.disabled": "pǝןqɐsıᗡ buıʞɹoM", - "behaviour.soft_hammer.enabled": "pǝןqɐuƎ buıʞɹoM", - "behaviour.soft_hammer.idle_after_cycle": "ǝןɔʎɔ ʇuǝɹɹnɔ ɹǝʇɟɐ ǝuıɥɔɐɯ ǝsnɐԀ", - "behaviour.wrench": "ʞɔıןɔʇɥbıᴚ uo sʞɔoןᗺ sǝʇɐʇoᴚ", "block.filter_casing.tooltip": "ʇuǝɯuoɹıʌuǝ ㄥ§ǝǝɹℲ-ǝןɔıʇɹɐԀɐ§ ɐ sǝʇɐǝɹƆ", "block.gtceu.acid_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH pıɔⱯ", "block.gtceu.active_transformer": "ɹǝɯɹoɟsuɐɹ⟘ ǝʌıʇɔⱯ", @@ -896,9 +848,6 @@ "block.gtceu.normal_optical_pipe": "ǝןqɐƆ ɹǝqıℲ ןɐɔıʇdO", "block.gtceu.normal_optical_pipe.tooltip": "ㄥ§ɐʇɐᗡ ɥɔɹɐǝsǝᴚɟ§ ɹo ㄥ§uoıʇɐʇndɯoƆɟ§ buıʇʇıɯsuɐɹ⟘ㄥ§", "block.gtceu.object_holder": "ɹǝpןoH ʇɔǝظqO", - "block.gtceu.oil_heavy": "ןıO ʎʌɐǝH", - "block.gtceu.oil_light": "ןıO ʇɥbıꞀ", - "block.gtceu.oil_medium": "ןıO ʍɐᴚ", "block.gtceu.opv_1024a_laser_source_hatch": "ɥɔʇɐH ǝɔɹnoS ɹǝsɐꞀ ɹ§Ɐǝ§ㄣᄅ0'Ɩ ɹ§ΛdOן§6§", "block.gtceu.opv_1024a_laser_target_hatch": "ɥɔʇɐH ʇǝbɹɐ⟘ ɹǝsɐꞀ ɹ§Ɐǝ§ㄣᄅ0'Ɩ ɹ§ΛdOן§6§", "block.gtceu.opv_16a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§9Ɩ ɹ§ΛdOן§6§", @@ -1703,14 +1652,6 @@ "block.surface_rock": "ʞɔoᴚ ǝɔɐɟɹnS %s", "button.gtceu.mark_as_depleted.name": "pǝʇǝןdǝᗡ sɐ ʞɹɐW", "button.gtceu.toggle_waypoint.name": "ʇuıodʎɐM ǝןbbo⟘", - "command.gtceu.dump_data.success": "%s oʇ %s ʎɹʇsıbǝɹ ɯoɹɟ sǝɔɹnosǝɹ %s pǝdɯnᗡ", - "command.gtceu.medical_condition.get": ":suoıʇıpuoɔ ןɐɔıpǝɯ ǝsǝɥʇ sɐɥ %s ɹǝʎɐןԀ", - "command.gtceu.medical_condition.get.element": "spuoɔǝs %s sǝʇnuıɯ %s :ɹ§%s uoıʇıpuoƆ", - "command.gtceu.medical_condition.get.element.permanent": ")ʇuǝuɐɯɹǝd( spuoɔǝs %s sǝʇnuıɯ %s :ɹ§%s uoıʇıpuoƆ", - "command.gtceu.medical_condition.get.empty": "˙suoıʇıpuoɔ ןɐɔıpǝɯ ou sɐɥ %s ɹǝʎɐןԀ", - "command.gtceu.place_vein.failure": "%s uoıʇısod ʇɐ %s uıǝʌ ǝɔɐןd oʇ pǝןıɐℲ", - "command.gtceu.place_vein.success": "%s uoıʇısod ʇɐ %s uıǝʌ pǝɔɐןԀ", - "command.gtceu.share_prospection_data.notification": "¡noʎ ɥʇıʍ ɐʇɐp buıʇɔǝdsoɹd buıɹɐɥs sı %s", "config.gtceu.option.addLoot": "ʇooꞀppɐ", "config.gtceu.option.ae2": "ᄅǝɐ", "config.gtceu.option.allUniqueStoneTypes": "sǝdʎ⟘ǝuoʇSǝnbıu∩ןןɐ", @@ -1890,189 +1831,6 @@ "config.jade.plugin_gtceu.steam_boiler_info": "oɟuI ɹǝןıoᗺ ɯɐǝʇS ]nƎƆ⟘⅁[", "config.jade.plugin_gtceu.transformer": "oɟuI ɹǝɯɹoɟsuɐɹ⟘ ]nƎƆ⟘⅁[", "config.jade.plugin_gtceu.workable_provider": "ǝןqɐʞɹoM ]nƎƆ⟘⅁[", - "cover.advanced_detector.latch.disabled.0": "snonuıʇuoƆ :ɹoıʌɐɥǝᗺ", - "cover.advanced_detector.latch.disabled.1": "", - "cover.advanced_detector.latch.disabled.2": "˙ɹǝʌoƆ sıɥʇ ɟo ɹoıʌɐɥǝq ǝuoʇspǝɹ ǝɥʇ ǝbuɐɥƆ", - "cover.advanced_detector.latch.disabled.3": "ϛƖ puɐ 0 uǝǝʍʇǝq ʇndʇno xɐɯ puɐ uıɯ uǝǝʍʇǝq sǝnןɐʌ ؛ϛƖ ʇndʇno ɯnɯıxɐɯ ǝɥʇ uɐɥʇ ɹǝɥbıɥ sǝnןɐʌ ؛0 ʇndʇno ɯnɯıuıɯ ǝɥʇ uɐɥʇ ssǝן sǝnןɐʌ ؛ʇןnɐɟǝᗡ - ㄥ§snonuıʇuoƆǝ§", - "cover.advanced_detector.latch.disabled.4": "uıɯ ʍoןǝq ןıʇun 0 ʇndʇno uǝɥʇ 'xɐɯ ǝʌoqɐ ןıʇun ϛƖ ʇndʇno - ㄥ§pǝɥɔʇɐꞀǝ§", - "cover.advanced_detector.latch.enabled.0": "pǝɥɔʇɐꞀ :ɹoıʌɐɥǝᗺ", - "cover.advanced_detector.latch.enabled.1": "", - "cover.advanced_detector.latch.enabled.2": "˙ɹǝʌoƆ sıɥʇ ɟo ɹoıʌɐɥǝq ǝuoʇspǝɹ ǝɥʇ ǝbuɐɥƆ", - "cover.advanced_detector.latch.enabled.3": "ϛƖ puɐ 0 uǝǝʍʇǝq ʇndʇno xɐɯ puɐ uıɯ uǝǝʍʇǝq sǝnןɐʌ ؛ϛƖ ʇndʇno ɯnɯıxɐɯ ǝɥʇ uɐɥʇ ɹǝɥbıɥ sǝnןɐʌ ؛0 ʇndʇno ɯnɯıuıɯ ǝɥʇ uɐɥʇ ssǝן sǝnןɐʌ ؛ʇןnɐɟǝᗡ - ㄥ§snonuıʇuoƆǝ§", - "cover.advanced_detector.latch.enabled.4": "uıɯ ʍoןǝq ןıʇun 0 ʇndʇno uǝɥʇ 'xɐɯ ǝʌoqɐ ןıʇun ϛƖ ʇndʇno - ㄥ§pǝɥɔʇɐꞀǝ§", - "cover.advanced_energy_detector.invert.disabled.0": "ןɐɯɹoN :ʇndʇnO", - "cover.advanced_energy_detector.invert.disabled.1": "", - "cover.advanced_energy_detector.invert.disabled.2": "ɔıboן ǝuoʇspǝɹ ǝɥʇ ʇɹǝʌuı oʇ ǝןbbo⟘", - "cover.advanced_energy_detector.invert.disabled.3": "∩Ǝ xɐɯ ǝɥʇ uɐɥʇ ɹǝʇɐǝɹb uǝɥʍ buıʇʇıɯǝ sdoʇs puɐ '∩Ǝ ɯnɯıuıɯ ǝɥʇ uɐɥʇ ssǝן uǝɥʍ pǝʇʇıɯǝ sı ǝuoʇspǝɹ 'ʇןnɐɟǝp ʎᗺ", - "cover.advanced_energy_detector.invert.enabled.0": "pǝʇɹǝʌuI :ʇndʇnO", - "cover.advanced_energy_detector.invert.enabled.1": "", - "cover.advanced_energy_detector.invert.enabled.2": "ɔıboן ǝuoʇspǝɹ ǝɥʇ ʇɹǝʌuı oʇ ǝןbbo⟘", - "cover.advanced_energy_detector.invert.enabled.3": "∩Ǝ xɐɯ ǝɥʇ uɐɥʇ ɹǝʇɐǝɹb uǝɥʍ buıʇʇıɯǝ sdoʇs puɐ '∩Ǝ ɯnɯıuıɯ ǝɥʇ uɐɥʇ ssǝן uǝɥʍ pǝʇʇıɯǝ sı ǝuoʇspǝɹ 'ʇןnɐɟǝp ʎᗺ", - "cover.advanced_energy_detector.label": "ɹoʇɔǝʇǝᗡ ʎbɹǝuƎ pǝɔuɐʌpⱯ", - "cover.advanced_energy_detector.max": "xɐW", - "cover.advanced_energy_detector.min": "uıW", - "cover.advanced_energy_detector.use_percent.disabled.0": "∩Ǝ ǝʇǝɹɔsıᗡ :ǝpoW", - "cover.advanced_energy_detector.use_percent.disabled.1": "", - "cover.advanced_energy_detector.use_percent.disabled.2": "˙ǝbɐɹoʇs ʎbɹǝuǝ pǝɥɔɐʇʇɐ uɐ ʇsuıɐbɐ xɐɯ/uıɯ buıɹɐdɯoɔ ɹoɟ sǝbɐʇuǝɔɹǝd ɹo sǝnןɐʌ ∩Ǝ ǝʇǝɹɔsıp buısn uǝǝʍʇǝq ǝbuɐɥƆ", - "cover.advanced_energy_detector.use_percent.enabled.0": "ǝbɐʇuǝɔɹǝԀ :ǝpoW", - "cover.advanced_energy_detector.use_percent.enabled.1": "", - "cover.advanced_energy_detector.use_percent.enabled.2": "˙ǝbɐɹoʇs ʎbɹǝuǝ pǝɥɔɐʇʇɐ uɐ ʇsuıɐbɐ xɐɯ/uıɯ buıɹɐdɯoɔ ɹoɟ sǝbɐʇuǝɔɹǝd ɹo sǝnןɐʌ ∩Ǝ ǝʇǝɹɔsıp buısn uǝǝʍʇǝq ǝbuɐɥƆ", - "cover.advanced_fluid_detector.invert.disabled.0": "ןɐɯɹoN :ʇndʇnO", - "cover.advanced_fluid_detector.invert.disabled.1": "", - "cover.advanced_fluid_detector.invert.disabled.2": "ɔıboן ǝuoʇspǝɹ ǝɥʇ ʇɹǝʌuı oʇ ǝןbbo⟘", - "cover.advanced_fluid_detector.invert.disabled.3": "ɯnɯıxɐɯ ʇǝs ǝɥʇ oʇ dn pınןɟ ɟo ᗺɯ uıɯ ǝɥʇ uɐɥʇ ɹǝʇɐǝɹb uǝɥʍ buıʇʇıɯǝ sʇɹɐʇs puɐ 'pınןɟ ɟo ᗺɯ ɯnɯıuıɯ ǝɥʇ uɐɥʇ ssǝן uǝɥʍ buıʇʇıɯǝ sdoʇs ǝuoʇspǝɹ 'ʇןnɐɟǝp ʎᗺ", - "cover.advanced_fluid_detector.invert.enabled.0": "pǝʇɹǝʌuI :ʇndʇnO", - "cover.advanced_fluid_detector.invert.enabled.1": "", - "cover.advanced_fluid_detector.invert.enabled.2": "ɔıboן ǝuoʇspǝɹ ǝɥʇ ʇɹǝʌuı oʇ ǝןbbo⟘", - "cover.advanced_fluid_detector.invert.enabled.3": "ɯnɯıxɐɯ ʇǝs ǝɥʇ oʇ dn pınןɟ ɟo ᗺɯ uıɯ ǝɥʇ uɐɥʇ ɹǝʇɐǝɹb uǝɥʍ buıʇʇıɯǝ sʇɹɐʇs puɐ 'pınןɟ ɟo ᗺɯ ɯnɯıuıɯ ǝɥʇ uɐɥʇ ssǝן uǝɥʍ buıʇʇıɯǝ sdoʇs ǝuoʇspǝɹ 'ʇןnɐɟǝp ʎᗺ", - "cover.advanced_fluid_detector.label": "ɹoʇɔǝʇǝᗡ pınןℲ pǝɔuɐʌpⱯ", - "cover.advanced_fluid_detector.max": ")ᗺɯ( pınןℲ xɐW", - "cover.advanced_fluid_detector.min": ")ᗺɯ( pınןℲ uıW", - "cover.advanced_item_detector.invert.disabled.0": "ןɐɯɹoN :ʇndʇnO", - "cover.advanced_item_detector.invert.disabled.1": "", - "cover.advanced_item_detector.invert.disabled.2": "ɔıboן ǝuoʇspǝɹ ǝɥʇ ʇɹǝʌuı oʇ ǝןbbo⟘", - "cover.advanced_item_detector.invert.disabled.3": "ɯnɯıxɐɯ ʇǝs ǝɥʇ oʇ dn sɯǝʇı ɟo ʇunoɯɐ uıɯ ǝɥʇ uɐɥʇ ɹǝʇɐǝɹb uǝɥʍ buıʇʇıɯǝ sʇɹɐʇs puɐ 'sɯǝʇı ɟo ʇunoɯɐ ɯnɯıuıɯ ǝɥʇ uɐɥʇ ssǝן uǝɥʍ buıʇʇıɯǝ sdoʇs ǝuoʇspǝɹ 'ʇןnɐɟǝp ʎᗺ", - "cover.advanced_item_detector.invert.enabled.0": "pǝʇɹǝʌuI :ʇndʇnO", - "cover.advanced_item_detector.invert.enabled.1": "", - "cover.advanced_item_detector.invert.enabled.2": "ɔıboן ǝuoʇspǝɹ ǝɥʇ ʇɹǝʌuı oʇ ǝןbbo⟘", - "cover.advanced_item_detector.invert.enabled.3": "ɯnɯıxɐɯ ʇǝs ǝɥʇ oʇ dn sɯǝʇı ɟo ʇunoɯɐ uıɯ ǝɥʇ uɐɥʇ ɹǝʇɐǝɹb uǝɥʍ buıʇʇıɯǝ sʇɹɐʇs puɐ 'sɯǝʇı ɟo ʇunoɯɐ ɯnɯıuıɯ ǝɥʇ uɐɥʇ ssǝן uǝɥʍ buıʇʇıɯǝ sdoʇs ǝuoʇspǝɹ 'ʇןnɐɟǝp ʎᗺ", - "cover.advanced_item_detector.label": "ɹoʇɔǝʇǝᗡ ɯǝʇI pǝɔuɐʌpⱯ", - "cover.advanced_item_detector.max": "sɯǝʇI xɐW", - "cover.advanced_item_detector.min": "sɯǝʇI uıW", - "cover.bucket.mode.bucket": "ᗺ", - "cover.bucket.mode.milli_bucket": "ᗺɯ", - "cover.conveyor.blocks_input.disabled.0": "˙ǝdıd oʇuı ʎɹoʇuǝʌuı ǝɥʇ ɯoɹɟ sɯǝʇı ןןnd oʇ ʇǝs sı ɹǝʌoɔ uǝɥʍ pǝʇɹǝsuı ǝq ʇou ןןıʍ sɯǝʇı 'pǝןqɐuǝ ɟI", - "cover.conveyor.blocks_input.disabled.1": "pǝןqɐsıᗡɔ§", - "cover.conveyor.blocks_input.enabled.0": "˙ǝdıd oʇuı ʎɹoʇuǝʌuı ǝɥʇ ɯoɹɟ sɯǝʇı ןןnd oʇ ʇǝs sı ɹǝʌoɔ uǝɥʍ pǝʇɹǝsuı ǝq ʇou ןןıʍ sɯǝʇı 'pǝןqɐuǝ ɟI", - "cover.conveyor.blocks_input.enabled.1": "pǝןqɐuƎɐ§", - "cover.conveyor.distribution.insert_first.0": "ʎʇıɹoıɹԀq§ :ǝpoW uoıʇnqıɹʇsıᗡ", - "cover.conveyor.distribution.insert_first.1": "˙puıɟ uɐɔ ʇı ʎʇıɹoıɹd ʇsǝɥbıɥ ǝɥʇ ɥʇıʍ ʎɹoʇuǝʌuı ʇsɹıɟ ǝɥʇ oʇuı ʇɹǝsuı ןןıMㄥ§", - "cover.conveyor.distribution.insert_first.2": "˙ɥʇɐd ɐ ɟo ʎʇıɹoıɹd ǝɥʇ ɹǝʍoן sǝdıd ɯǝʇı ǝʌıʇɔıɹʇsǝᴚㄥ§", - "cover.conveyor.distribution.round_robin_global.0": "uıqoᴚ punoᴚq§ :ǝpoW uoıʇnqıɹʇsıᗡ", - "cover.conveyor.distribution.round_robin_global.1": "sǝıɹoʇuǝʌuı pǝʇɔǝuuoɔ ssoɹɔɐ ʎןןɐnbǝ sɯǝʇı sʇıןdSㄥ§", - "cover.conveyor.distribution.round_robin_prio.0": "ʎʇıɹoıɹԀ ɥʇıʍ uıqoᴚ punoᴚq§ :ǝpoW uoıʇnqıɹʇsıᗡ", - "cover.conveyor.distribution.round_robin_prio.1": "˙ʇsɹıɟ sǝıʇıɹoıɹd ɹǝɥbıɥ sɹǝpısuoɔ puɐ sǝıɹoʇuǝʌuı pǝʇɔǝuuoɔ ssoɹɔɐ sɯǝʇı ʇıןds oʇ sǝıɹ⟘ㄥ§", - "cover.conveyor.distribution.round_robin_prio.2": "˙ɥʇɐd ɐ ɟo ʎʇıɹoıɹd ǝɥʇ ɹǝʍoן sǝdıd ɯǝʇı ǝʌıʇɔıɹʇsǝᴚㄥ§", - "cover.conveyor.item_filter.title": "ɹǝʇןıℲ ɯǝʇI", - "cover.conveyor.mode": "%s :ǝpoW", - "cover.conveyor.mode.export": "ʇɹodxƎ :ǝpoW", - "cover.conveyor.mode.import": "ʇɹodɯI :ǝpoW", - "cover.conveyor.tag.title.0": "ǝɯɐN bɐ⟘", - "cover.conveyor.tag.title.1": ")pɹɐɔpןıʍ ɹoɟ * ǝsn(", - "cover.conveyor.title": ")%s( sbuıʇʇǝS ɹǝʌoƆ ɹoʎǝʌuoƆ", - "cover.conveyor.transfer_rate": "ɔǝs/sɯǝʇıㄥ§", - "cover.detector_base.message_inverted_state": "pǝʇɹǝʌuI :snʇɐʇS buıɹoʇıuoW", - "cover.detector_base.message_normal_state": "ןɐɯɹoN :snʇɐʇS buıɹoʇıuoW", - "cover.ender_fluid_link.incomplete_hex.0": "¡ǝʇǝןdɯoɔuı sı ɹoןoɔ pǝʇʇnduI", - "cover.ender_fluid_link.incomplete_hex.1": ")sʇıbıp xǝɥ 8 ןןɐ( ǝʇǝןdɯoɔ ǝɔuo pǝıןddɐ ǝq ןןıʍ ʇI", - "cover.ender_fluid_link.incomplete_hex.2": "¡sʇıpǝ ǝsoן ןןıʍ ınb ǝɥʇ buısoןƆ", - "cover.ender_fluid_link.iomode.disabled": "pǝןqɐsıᗡ O/I", - "cover.ender_fluid_link.iomode.enabled": "pǝןqɐuƎ O/I", - "cover.ender_fluid_link.private.tooltip.disabled.0": "ǝpoɯ ʞuɐʇ ǝʇɐʌıɹd oʇ ɥɔʇıʍS", - "cover.ender_fluid_link.private.tooltip.disabled.1": "ɹǝʌoɔ ǝɥʇ pǝɔɐןd ʎןןɐuıbıɹo oɥʍ ɹǝʎɐןd ǝɥʇ sǝsn ǝpoɯ ǝʇɐʌıɹԀ", - "cover.ender_fluid_link.private.tooltip.enabled": "ǝpoɯ ʞuɐʇ ɔıןqnd oʇ ɥɔʇıʍS", - "cover.ender_fluid_link.title": "ʞuıꞀ pınןℲ ɹǝpuƎ", - "cover.ender_fluid_link.tooltip.channel_description": "ʇxǝʇ ʇnduı ɥʇıʍ uoıʇdıɹɔsǝp ןǝuuɐɥɔ ʇǝS", - "cover.ender_fluid_link.tooltip.channel_name": "ʇxǝʇ ʇnduı ɥʇıʍ ǝɯɐu ןǝuuɐɥɔ ʇǝS", - "cover.ender_fluid_link.tooltip.clear_button": "uoıʇdıɹɔsǝp ןǝuuɐɥɔ ɹɐǝןƆ", - "cover.ender_fluid_link.tooltip.list_button": "ʇsıן ןǝuuɐɥɔ ʍoɥS", - "cover.filter.blacklist.disabled": "ʇsıןǝʇıɥM", - "cover.filter.blacklist.enabled": "ʇsıןʞɔɐןᗺ", - "cover.filter.mode.filter_both": "ʇɔɐɹʇxƎ/ʇɹǝsuI ɹǝʇןıℲ", - "cover.filter.mode.filter_extract": "ʇɔɐɹʇxƎ ɹǝʇןıℲ", - "cover.filter.mode.filter_insert": "ʇɹǝsuI ɹǝʇןıℲ", - "cover.fluid.voiding.advanced.title": "sbuıʇʇǝS buıpıoΛ pınןℲ pǝɔuɐʌpⱯ", - "cover.fluid.voiding.title": "sbuıʇʇǝS buıpıoΛ pınןℲ", - "cover.fluid_filter.config_amount.0": "˙sǝsɐǝɹɔǝp uʍop 'ʇunoɯɐ sǝsɐǝɹɔuı dn ןǝǝɥʍ ןןoɹɔS", - "cover.fluid_filter.config_amount.1": "]ɹ§000Ɩxɐ§[ןɹʇƆ+ʇɟıɥS']ɹ§00Ɩxǝ§[ןɹʇƆ']ɹ§0Ɩx9§[ʇɟıɥS", - "cover.fluid_filter.config_amount.2": "˙sǝsɐǝɹɔǝp ʞɔıןɔ ʇɟǝן 'ʇunoɯɐ sǝsɐǝɹɔuı ʞɔıןɔ ʇɥbıᴚ", - "cover.fluid_filter.config_amount.3": "˙ǝʌןɐɥ/ǝןqnop oʇ ʇɟıɥs pןoH", - "cover.fluid_filter.config_amount.4": "ɹɐǝןɔ oʇ ʞɔıןɔ ǝןppıW", - "cover.fluid_filter.mode.filter_both": "uıɐɹᗡ & ןןıℲ ɹǝʇןıℲ", - "cover.fluid_filter.mode.filter_drain": "uıɐɹᗡ ɹǝʇןıℲ", - "cover.fluid_filter.mode.filter_fill": "ןןıℲ ɹǝʇןıℲ", - "cover.fluid_filter.title": "ɹǝʇןıℲ pınןℲ", - "cover.fluid_regulator.keep_exact": "%s :ʇɔɐxƎ dǝǝʞ", - "cover.fluid_regulator.supply_exact": "%s :ʇɔɐxƎ ʎןddnS", - "cover.fluid_regulator.title": ")%s( sbuıʇʇǝS ɹoʇɐןnbǝᴚ pınןℲ", - "cover.fluid_regulator.transfer_mode.description.0": "˙ǝןqıssod sɐ ɹǝʇןıɟ sʇı buıɥɔʇɐɯ spınןɟ ʎuɐɯ sɐ ɹǝɟsuɐɹʇ ןןıʍ ɹǝʌoɔ 'ǝpoɯ sıɥʇ uı - ɹ§ʎuⱯ ɹǝɟsuɐɹ⟘ǝ§", - "cover.fluid_regulator.transfer_mode.description.1": "˙pǝʌoɯ ǝq ʇ,uoʍ spınןɟ 'ǝzıs uoıʇɹod uɐɥʇ ssǝן sı spınןɟ ɟo ʇunoɯɐ ɟI ˙uoʇʇnq sıɥʇ ɥʇɐǝuɹǝpun ʍopuıʍ ǝɥʇ uı pǝıɟıɔǝds suoıʇɹod uı spınןɟ ʎןddns ןןıʍ ɹǝʌoɔ 'ǝpoɯ sıɥʇ uı - ɹ§ʇɔɐxƎ ʎןddnSǝ§", - "cover.fluid_regulator.transfer_mode.description.2": "˙pǝɹınbǝɹ ɟı spınןɟ ɟo ʇunoɯɐ ןɐuoıʇıppɐ buıʎןddns 'ʎɹoʇuǝʌuı uoıʇɐuıʇsǝp ǝɥʇ uı spınןɟ ɟo ʇunoɯɐ pǝıɟıɔǝds dǝǝʞ ןןıʍ ɹǝʌoɔ 'ǝpoɯ sıɥʇ uı - ɹ§ʇɔɐxƎ dǝǝʞǝ§", - "cover.fluid_regulator.transfer_mode.description.3": "˙00Ɩ ʎq ʎןdıʇןnɯ ןןıʍ ʞɔıןɔ ןɹʇɔ puɐ 0Ɩ ʎq sʇunoɯɐ ǝsɐǝɹɔǝp/ǝsɐǝɹɔuı ʎןdıʇןnɯ ןןıʍ ʞɔıןɔ ʇɟıɥs :dı⟘ㄥ§", - "cover.item.voiding.advanced.title": "sbuıʇʇǝS buıpıoΛ ɯǝʇI pǝɔuɐʌpⱯ", - "cover.item.voiding.title": "sbuıʇʇǝS buıpıoΛ ɯǝʇI", - "cover.item_filter.ignore_damage.disabled": "ǝbɐɯɐᗡ ʇɔǝdsǝᴚ", - "cover.item_filter.ignore_damage.enabled": "ǝbɐɯɐᗡ ǝɹoubI", - "cover.item_filter.ignore_nbt.disabled": "⟘ᗺN ʇɔǝdsǝᴚ", - "cover.item_filter.ignore_nbt.enabled": "⟘ᗺN ǝɹoubI", - "cover.item_filter.title": "ɹǝʇןıℲ ɯǝʇI", - "cover.item_smart_filter.filtering_mode.centrifuge": "ǝbnɟıɹʇuǝƆ", - "cover.item_smart_filter.filtering_mode.description.0": "˙buıɹǝʇןıɟ ɹoɟ ǝsn ןןıʍ ɹǝʇןıℲ ʇɹɐɯS sıɥʇ ǝuıɥɔɐW ʇɔǝןǝS", - "cover.item_smart_filter.filtering_mode.description.1": "˙ɯɹɐ ɔıʇoqoɹ ɹoɟ sɯǝʇı ɟo suoıʇɹod ʇɥbıɹ ʞɔıd ʎןןɐɔıʇɐɯoʇnɐ ןןıʍ ʇI", - "cover.item_smart_filter.filtering_mode.electrolyzer": "ɹǝzʎןoɹʇɔǝןƎ", - "cover.item_smart_filter.filtering_mode.sifter": "ɹǝʇɟıS", - "cover.item_smart_filter.title": "ɹǝʇןıℲ ɯǝʇI ʇɹɐɯS", - "cover.machine_controller.invert.disabled.0": "unɹ oʇ ןǝʌǝן ǝuoʇspǝɹ ʇǝs ǝɥʇ uɐɥʇ ɹǝʞɐǝʍ ןɐubıs ɐ ǝɹınbǝɹ ןןıʍ ɹǝʌoɔ ǝɥʇ 'ǝpoɯ sıɥʇ uı - ɹ§ןɐɯɹoNǝ§", - "cover.machine_controller.invert.enabled.0": "unɹ oʇ ןǝʌǝן ǝuoʇspǝɹ ʇǝs ǝɥʇ uɐɥʇ ɹǝbuoɹʇs ןɐubıs ɐ ǝɹınbǝɹ ןןıʍ ɹǝʌoɔ ǝɥʇ 'ǝpoɯ sıɥʇ uı - ɹ§pǝʇɹǝʌuIǝ§", - "cover.machine_controller.inverted": "pǝʇɹǝʌuI", - "cover.machine_controller.mode.cover_down": ")ɯoʇʇoᗺ( ɹǝʌoƆ ןoɹʇuoƆ", - "cover.machine_controller.mode.cover_east": ")ʇsɐƎ( ɹǝʌoƆ ןoɹʇuoƆ", - "cover.machine_controller.mode.cover_north": ")ɥʇɹoN( ɹǝʌoƆ ןoɹʇuoƆ", - "cover.machine_controller.mode.cover_south": ")ɥʇnoS( ɹǝʌoƆ ןoɹʇuoƆ", - "cover.machine_controller.mode.cover_up": ")do⟘( ɹǝʌoƆ ןoɹʇuoƆ", - "cover.machine_controller.mode.cover_west": ")ʇsǝM( ɹǝʌoƆ ןoɹʇuoƆ", - "cover.machine_controller.mode.machine": "ǝuıɥɔɐW ןoɹʇuoƆ", - "cover.machine_controller.mode.null": "buıɥʇoN ןoɹʇuoƆ", - "cover.machine_controller.normal": "ןɐɯɹoN", - "cover.machine_controller.redstone": "%d :ɥʇbuǝɹʇS ǝuoʇspǝᴚ uıW", - "cover.machine_controller.title": "sbuıʇʇǝS ɹǝןןoɹʇuoƆ ǝuıɥɔɐW", - "cover.pump.fluid_filter.title": "ɹǝʇןıℲ pınןℲ", - "cover.pump.mode.export": "ʇɹodxƎ :ǝpoW", - "cover.pump.mode.import": "ʇɹodɯI :ǝpoW", - "cover.pump.title": ")%s( sbuıʇʇǝS ɹǝʌoƆ dɯnԀ", - "cover.pump.transfer_rate": "%s", - "cover.robotic_arm.title": ")%s( sbuıʇʇǝS ɯɹⱯ ɔıʇoqoᴚ", - "cover.robotic_arm.transfer_mode.description.0": "˙ǝןqıssod sɐ ɹǝʇןıɟ sʇı buıɥɔʇɐɯ sɯǝʇı ʎuɐɯ sɐ ɹǝɟsuɐɹʇ ןןıʍ ɹǝʌoɔ 'ǝpoɯ sıɥʇ uı - ɹ§ʎuⱯ ɹǝɟsuɐɹ⟘ǝ§", - "cover.robotic_arm.transfer_mode.description.1": "˙pǝʌoɯ ǝq ʇ,uoʍ sɯǝʇı 'ǝzıs uoıʇɹod uɐɥʇ ssǝן sı sɯǝʇı ɟo ʇunoɯɐ ɟI ˙)ɹǝʇןıɟ bɐʇ ɹoɟ uoʇʇnq sıɥʇ ɹǝpun ǝןqɐıɹɐʌ ɹo( sʇoןs ɹǝʇןıɟ ɯǝʇı uı pǝıɟıɔǝds suoıʇɹod uı sɯǝʇı ʎןddns ןןıʍ ɹǝʌoɔ 'ǝpoɯ sıɥʇ uı - ɹ§ʇɔɐxƎ ʎןddnSǝ§", - "cover.robotic_arm.transfer_mode.description.2": "˙pǝɹınbǝɹ ɟı sɯǝʇı ɟo ʇunoɯɐ ןɐuoıʇıppɐ buıʎןddns 'ʎɹoʇuǝʌuı uoıʇɐuıʇsǝp ǝɥʇ uı sɯǝʇı ɟo ʇunoɯɐ pǝıɟıɔǝds dǝǝʞ ןןıʍ ɹǝʌoɔ 'ǝpoɯ sıɥʇ uı - ɹ§ʇɔɐxƎ dǝǝʞǝ§", - "cover.robotic_arm.transfer_mode.description.3": "˙ɹǝʇsɐɟ ʇunoɯɐ ǝbuɐɥɔ oʇ buıʞɔıןɔ ʇɟıɥs ǝsn 'ʇunoɯɐ ɯǝʇı ǝbuɐɥɔ oʇ sʇoןs ɹǝʇןıɟ uo ʞɔıןɔ ʇɥbıɹ/ʇɟǝן :dı⟘ㄥ§", - "cover.robotic_arm.transfer_mode.keep_exact": "ʇɔɐxƎ dǝǝʞ", - "cover.robotic_arm.transfer_mode.transfer_any": "ʎuⱯ ɹǝɟsuɐɹ⟘", - "cover.robotic_arm.transfer_mode.transfer_exact": "ʇɔɐxƎ ʎןddnS", - "cover.shutter.message.disabled": "ɹǝʇʇnɥs pǝuǝdO", - "cover.shutter.message.enabled": "ɹǝʇʇnɥs pǝsoןƆ", - "cover.storage.title": "ɹǝʌoƆ ǝbɐɹoʇS", - "cover.tag_filter.info.0": "suoıssǝɹdxǝ xǝןdɯoɔ sʇdǝɔɔⱯq§", - "cover.tag_filter.info.1": "ᗡNⱯ = ɹ§q & ɐ9§", - "cover.tag_filter.info.10": ")ʌן*¡ & sʇınɔɹıɔ:nǝɔʇb( | pןob/sʇsnp*9§ :ǝןdɯɐxƎq§", - "cover.tag_filter.info.11": "sǝuo ΛꞀ ʇdǝɔxǝ sʇınɔɹıɔ ןןɐ ɹo sʇsnp pןob ןןɐ sǝɥɔʇɐɯ sıɥ⟘", - "cover.tag_filter.info.2": "ᴚO = ɹ§q | ɐ9§", - "cover.tag_filter.info.3": "ᴚOX = ɹ§q ^ ɐ9§", - "cover.tag_filter.info.4": "⟘ON = ɹ§ɐ¡9§", - "cover.tag_filter.info.5": "buıdnoɹb ɹoɟ ɹ§)ɐ(9§", - "cover.tag_filter.info.6": "pɹɐɔpןıʍ ɹoɟ ɹ§*9§", - "cover.tag_filter.info.7": "pǝbbɐʇun ɹoɟ ɹ§$9§", - "cover.tag_filter.info.8": "˙,ǝdʎʇqns/bɐʇ:ǝɔɐdsǝɯɐu, ɯɹoɟ ǝɥʇ uı ǝɯoɔ sbɐ⟘q§", - "cover.tag_filter.info.9": "˙pǝpıʌoɹd ʇ,usı ǝuo ɟı pǝɯnssɐ sı ǝɔɐdsǝɯɐu ,:ǝbɹoɟ, ǝɥ⟘", - "cover.tag_filter.matches": "sǝɥɔʇɐɯ ɯǝʇI", - "cover.tag_filter.matches_not": "ɥɔʇɐɯ ʇou sǝop ɯǝʇI", - "cover.tag_filter.test_slot.info": "uoıssǝɹdxǝ ɹǝʇןıɟ ǝɥʇ sǝɥɔʇɐɯ ʇı ɟı ʇsǝʇ oʇ ɯǝʇı ɐ ʇɹǝsuI", - "cover.tag_filter.title": "ɹǝʇןıℲ bɐ⟘", - "cover.universal.manual_import_export.mode.description.0": " ˙ɹǝʇןıɟ sʇı puɐ ɹǝʌoɔ ǝɥʇ ʎq pǝıɟıɔǝds sɐ ǝʌoɯ ʎןuo ןןıʍ spınןɟ/sɯǝʇI - ɹ§pǝןqɐsıᗡǝ§", - "cover.universal.manual_import_export.mode.description.1": " ˙)ʎuɐ ɟı( sǝɥɔʇɐɯ ɹǝʇןıɟ sʇı sɐ buoן sɐ 'ǝpoɯ ɹǝʌoɔ ǝɥʇ ɟo ʎןʇuǝpuǝdǝpuı pǝʇɹǝsuı puɐ pǝʇɔɐɹʇxǝ ǝq uɐɔ spınןɟ/sɯǝʇI - ɹ§pǝɹǝʇןıℲ ʍoןןⱯǝ§", - "cover.universal.manual_import_export.mode.description.2": "ɹǝʌoɔ sıɥʇ ʎq pǝʇɔɐɹʇxǝ ɹo pǝʇɹǝsuı sɯǝʇı ǝɥʇ oʇ sǝıןddɐ ɹǝʇןıℲ ˙ǝpoɯ ɹǝʌoɔ ǝɥʇ ɟo ʎןʇuǝpuǝdǝpuı pǝʌoɯ ǝq uɐɔ spınןɟ/sɯǝʇI - ɹ§pǝɹǝʇןıɟu∩ ʍoןןⱯǝ§", - "cover.universal.manual_import_export.mode.disabled": "˙ɹǝʇןıɟ sʇı puɐ ɹǝʌoɔ ǝɥʇ ʎq pǝıɟıɔǝds sɐ ǝʌoɯ ʎןuo ןןıʍ spınןℲ / sɯǝʇIㄥ§\npǝןqɐsıᗡq§ :O/I ןɐnuɐW", - "cover.universal.manual_import_export.mode.filtered": ")ʎuɐ ɟı( sǝɥɔʇɐɯ ɹǝʇןıɟ sʇı sɐ buoן sɐ 'ǝpoɯ ɹǝʌoɔ ǝɥʇ ɟo ʎןʇuǝpuǝdǝpuı pǝʇɹǝsuı puɐ pǝʇɔɐɹʇxǝ ǝq uɐɔ spınןℲ / sɯǝʇIㄥ§\npǝɹǝʇןıℲq§ :O/I ןɐnuɐW", - "cover.universal.manual_import_export.mode.unfiltered": "˙ɟןǝsʇı ɹǝʌoɔ sıɥʇ ʎq pǝʇɔɐɹʇxǝ ɹo pǝʇɹǝsuı sı ʇɐɥʍ oʇ sǝıןddɐ ʎןuo ɹǝʇןıɟ ǝɥ⟘ ˙ǝpoɯ ɹǝʌoɔ ǝɥʇ ɟo ʎןʇuǝpuǝdǝpuı pǝʌoɯ ǝq uɐɔ spınןℲ / sɯǝʇIㄥ§\npǝɹǝʇןıɟu∩q§ :O/I ןɐnuɐW", - "cover.voiding.label.disabled": "pǝןqɐsıᗡ", - "cover.voiding.label.enabled": "pǝןqɐuƎ", - "cover.voiding.message.disabled": "pǝןqɐsıᗡ ɹǝʌoƆ buıpıoΛ", - "cover.voiding.message.enabled": "pǝןqɐuƎ ɹǝʌoƆ buıpıoΛ", - "cover.voiding.tooltip": "˙pǝpıoʌ ǝq ꞀꞀIM sɯǝʇı ɹo spınןɟ ʇɐɥʇ suɐǝɯ \"pǝןqɐuƎ\" oʇ sıɥʇ buıʇʇǝS ㄥ§¡⅁NINᴚⱯMɔ§", - "cover.voiding.voiding_mode.description.0": " ˙ɹǝʇןıɟ ǝɥʇ buıɥɔʇɐɯ buıɥʇʎuɐ pıoʌ ןןıʍ ɹ§buıɥɔʇɐW pıoΛǝ§", - "cover.voiding.voiding_mode.description.1": "˙ʇunoɯɐ pǝıɟıɔǝds ǝɥʇ oʇ dn 'ɹǝʇןıɟ ǝɥʇ buıɥɔʇɐɯ buıɥʇʎuɐ pıoʌ ןןıʍ ɹ§ʍoןɟɹǝʌO pıoΛǝ§", - "cover.voiding.voiding_mode.void_any": "buıɥɔʇɐW pıoΛ", - "cover.voiding.voiding_mode.void_overflow": "ʍoןɟɹǝʌO pıoΛ", "curios.identifier.gtceu_magnet": "ʇǝubɐW nƎƆ⟘⅁", "death.attack.gtceu.axe": "%s ʎq pǝddoɥɔ uǝǝq sɐɥ %s", "death.attack.gtceu.butchery_knife": "%s ʎq pǝɹǝɥɔʇnq sɐʍ %s", @@ -2161,10 +1919,6 @@ "gtceu.button.hide_depleted": "suıǝΛ pǝʇǝןdǝᗡ ǝpıH", "gtceu.button.ore_veins": "suıǝΛ ǝɹO ⟘⅁ ʍoɥS", "gtceu.button.show_depleted": "suıǝΛ pǝʇǝןdǝᗡ ʍoɥS", - "gtceu.cable.amperage": "%dǝ§ ɹ§:ǝbɐɹǝdɯⱯ xɐWǝ§", - "gtceu.cable.loss_per_block": "ʇןoΛ-∩Ǝ ㄥ§%dɔ§ ɹ§:ǝɹǝdɯⱯ/ɹǝʇǝW/ssoꞀɔ§", - "gtceu.cable.superconductor": "ɹoʇɔnpuoɔɹǝdnSp§ %s", - "gtceu.cable.voltage": ")ɐ§%s(ɐ§ %dɐ§ ɹ§:ǝbɐʇןoΛ xɐWɐ§", "gtceu.canner": "ɹǝuuɐƆ", "gtceu.centrifuge": "ǝbnɟıɹʇuǝƆ", "gtceu.chance_logic.and": "ᗡNⱯ", @@ -2178,32 +1932,6 @@ "gtceu.circuit_assembler": "ɹǝןqɯǝssⱯ ʇınɔɹıƆ", "gtceu.coke_oven": "uǝʌO ǝʞoƆ", "gtceu.combustion_generator": "ɹoʇɐɹǝuǝ⅁ uoıʇsnqɯoƆ", - "gtceu.command.copy.click_to_copy": "ʎdoɔ oʇ ʞɔıןƆ", - "gtceu.command.copy.copied_and_click": "uıɐbɐ ʎdoɔ oʇ ʞɔıןƆ ˙pɹɐoqdıןɔ oʇ pǝıdoɔ", - "gtceu.command.copy.copied_end": "pɹɐoqdıןɔ ǝɥʇ oʇ ]", - "gtceu.command.copy.copied_start": "[ pǝıdoƆ", - "gtceu.command.hand.electric": "%s :ʎɹǝʇʇɐᗺ sI ؛%d :ɹǝı⟘ - ∩Ǝ %d / %d :oɟuI ɔıɹʇɔǝןƎ", - "gtceu.command.hand.fluid": "%s :uıɐɹᗡ uɐƆ ؛%s :ןןıℲ uɐƆ ؛ᗺɯ %d / %d :oɟuI pınןℲ", - "gtceu.command.hand.fluid2": ":pI pınןℲ", - "gtceu.command.hand.groovy": "puɐɥ sb/9§ buısn ɹǝpısuoƆ", - "gtceu.command.hand.item_id": ")%d :ɐʇɐpɐʇǝW( %s :ɯǝʇI", - "gtceu.command.hand.material": ":pI ןɐıɹǝʇɐW", - "gtceu.command.hand.meta_item": ":pI ɯǝʇIɐʇǝW", - "gtceu.command.hand.no_item": "˙puɐɯɯoɔ sıɥʇ buıʇnɔǝxǝ ǝɹoɟǝq puɐɥ ɟɟo ɹo puɐɥ uıɐɯ uı buıɥʇǝɯos pןoɥ ʇsnɯ noʎ", - "gtceu.command.hand.not_a_player": "˙ɹǝʎɐןd ɐ ʎq ǝןqɐsn ʎןuo sı puɐɯɯoɔ sıɥ⟘", - "gtceu.command.hand.ore_prefix": ":xıɟǝɹd ǝɹO", - "gtceu.command.hand.tag_entries": ":sǝıɹʇuǝ bɐ⟘Ɛ§", - "gtceu.command.hand.tool_stats": "%s :ssɐןƆ sʇɐʇS ןoo⟘", - "gtceu.command.hand.usage": "puɐɥ nǝɔʇb/ :ǝbɐs∩", - "gtceu.command.recipecheck.begin": "˙˙˙ʞɔǝɥɔ ʇɔıןɟuoɔ ǝdıɔǝɹ buıʇɹɐʇS", - "gtceu.command.recipecheck.end": "oɟuı ǝɹoɯ ɹoɟ boן ɹǝʌɹǝs ǝɥʇ ʞɔǝɥƆ ˙sʇɔıןɟuoɔ ǝןqıssod %d punoɟ ʞɔǝɥɔ ʇɔıןɟuoɔ ǝdıɔǝᴚ", - "gtceu.command.recipecheck.end_no_conflicts": "¡punoɟ sʇɔıןɟuoɔ ǝdıɔǝɹ oN", - "gtceu.command.recipecheck.usage": "ʞɔǝɥɔǝdıɔǝɹ nǝɔʇb/ :ǝbɐs∩", - "gtceu.command.usage": ">ʞɔǝɥɔǝdıɔǝɹ/puɐɥ/uǝbpןɹoʍ< nǝɔʇb/ :ǝbɐs∩", - "gtceu.command.worldgen.reload.failed": "˙sɹoɹɹǝ ɹoɟ ǝןosuoɔ ʞɔǝɥƆ ˙pǝןıɐɟ pɐoןǝɹ uǝbpןɹoM", - "gtceu.command.worldgen.reload.success": "˙bıɟuoɔ ɯoɹɟ pǝpɐoןǝɹ ʎןןnɟssǝɔɔns uǝbpןɹoM", - "gtceu.command.worldgen.reload.usage": "pɐoןǝɹ uǝbpןɹoʍ nǝɔʇb/ :ǝbɐs∩", - "gtceu.command.worldgen.usage": ">pɐoןǝɹ< uǝbpןɹoʍ nǝɔʇb/ :ǝbɐs∩", "gtceu.compressor": "ɹossǝɹdɯoƆ", "gtceu.cover.activity_detector.message_activity_inverted": "snʇɐʇS ʎʇıʌıʇɔⱯ pǝʇɹǝʌuI buıɹoʇıuoW", "gtceu.cover.activity_detector.message_activity_normal": "snʇɐʇS ʎʇıʌıʇɔⱯ ןɐɯɹoN buıɹoʇıuoW", @@ -2242,7 +1970,6 @@ "gtceu.direction.tooltip.up": "d∩", "gtceu.distillation_tower": "ɹǝʍo⟘ uoıʇɐןןıʇsıᗡ", "gtceu.distillery": "ʎɹǝןןıʇsıᗡ", - "gtceu.duct_pipe.transfer_rate": "%s :ǝʇɐɹ ɹǝɟsuɐɹʇ ɹıⱯq§", "gtceu.dummy": "ʎɯɯnᗡ", "gtceu.electric_blast_furnace": "ǝɔɐuɹnℲ ʇsɐןᗺ ɔıɹʇɔǝןƎ", "gtceu.electric_furnace": "ǝɔɐuɹnℲ ɔıɹʇɔǝןƎ", @@ -2251,32 +1978,7 @@ "gtceu.extractor": "ɹoʇɔɐɹʇxƎ", "gtceu.extruder": "ɹǝpnɹʇxƎ", "gtceu.fermenter": "ɹǝʇuǝɯɹǝℲ", - "gtceu.fluid.amount": "ᗺɯ %d/%d :ʇunoɯⱯ6§", - "gtceu.fluid.click_combined": "˙)ʞɔɐʇs ןןnɟ ɐ ɹoɟ ʞɔıןɔ-ʇɟıɥS( ʞuɐʇ ǝɥʇㄥ§ ןןıɟq§ ɹoㄥ§ ʎʇdɯǝɔ§ oʇ ɹǝuıɐʇuoƆ pınןℲ ɐ ɥʇıʍ ʞɔıןƆㄥ§", - "gtceu.fluid.click_to_empty": "˙)ʞɔɐʇs ןןnɟ ɐ ɹoɟ ʞɔıןɔ-ʇɟıɥS( ʞuɐʇ ǝɥʇㄥ§ ʎʇdɯǝɔ§ oʇ ɹǝuıɐʇuoƆ pınןℲ ɐ ɥʇıʍ ʞɔıןƆㄥ§", - "gtceu.fluid.click_to_fill": "˙)ʞɔɐʇs ןןnɟ ɐ ɹoɟ ʞɔıןɔ-ʇɟıɥS( ʞuɐʇ ǝɥʇㄥ§ ןןıɟq§ oʇ ɹǝuıɐʇuoƆ pınןℲ ɐ ɥʇıʍ ʞɔıןƆㄥ§", - "gtceu.fluid.empty": "ʎʇdɯƎ", - "gtceu.fluid.gas_generic": "sɐ⅁ %s", - "gtceu.fluid.gas_vapor": "ɹodɐΛ %s", - "gtceu.fluid.generic": "%s", - "gtceu.fluid.liquid_generic": "%s pınbıꞀ", - "gtceu.fluid.molten": "%s uǝʇןoW", - "gtceu.fluid.plasma": "ɐɯsɐןԀ %s", - "gtceu.fluid.state_gas": "snoǝsɐ⅁ :ǝʇɐʇSɐ§", - "gtceu.fluid.state_liquid": "pınbıꞀ :ǝʇɐʇSɐ§", - "gtceu.fluid.state_plasma": "ɐɯsɐןԀ :ǝʇɐʇSɐ§", - "gtceu.fluid.temperature": "ʞ %d :ǝɹnʇɐɹǝdɯǝ⟘ɔ§", - "gtceu.fluid.temperature.cryogenic": "¡ǝɹɐɔ ɥʇıʍ ǝןpuɐH ¡ɔıuǝboʎɹƆq§", - "gtceu.fluid.type_acid.tooltip": "¡ǝɹɐɔ ɥʇıʍ ǝןpuɐH ¡ɔıpıɔⱯ9§", "gtceu.fluid_heater": "ɹǝʇɐǝH pınןℲ", - "gtceu.fluid_pipe.acid_proof": "spıɔⱯ ǝןpuɐɥ uɐƆ9§", - "gtceu.fluid_pipe.capacity": "ᗺɯ %dɟ§ :ʎʇıɔɐdɐƆ6§", - "gtceu.fluid_pipe.channels": "%dɟ§ :sןǝuuɐɥƆǝ§", - "gtceu.fluid_pipe.cryo_proof": "sɔıuǝboʎɹƆ ǝןpuɐɥ uɐƆ9§", - "gtceu.fluid_pipe.gas_proof": "sǝsɐ⅁ ǝןpuɐɥ uɐƆ9§", - "gtceu.fluid_pipe.max_temperature": "ʞ %dɟ§ :ʇıɯıꞀ ǝɹnʇɐɹǝdɯǝ⟘ɔ§", - "gtceu.fluid_pipe.not_gas_proof": "¡ʞɐǝן ʎɐɯ sǝsɐ⅁ㄣ§", - "gtceu.fluid_pipe.plasma_proof": "sɐɯsɐןԀ ןןɐ ǝןpuɐɥ uɐƆ9§", "gtceu.fluid_solidifier": "ɹǝıɟıpıןoS pınןℲ", "gtceu.forge_hammer": "ɹǝɯɯɐH ǝbɹoℲ", "gtceu.forming_press": "ssǝɹԀ buıɯɹoℲ", @@ -2382,21 +2084,10 @@ "gtceu.gui.toggle_view.disabled": ")spınןℲ( ʍǝıΛ ǝןbbo⟘", "gtceu.gui.toggle_view.enabled": ")sɯǝʇI( ʍǝıΛ ǝןbbo⟘", "gtceu.gui.waiting_list": ":ǝnǝnὉ buıpuǝS", - "gtceu.hazard_trigger.any": "ʇɔɐʇuoɔ ʎuⱯ", - "gtceu.hazard_trigger.description": ":ʎq pǝsnɐƆ", - "gtceu.hazard_trigger.inhalation": "uoıʇɐןɐɥuI", - "gtceu.hazard_trigger.none": "buıɥʇoN", - "gtceu.hazard_trigger.protection.description": ":ɯoɹɟ sʇɔǝʇoɹԀ", - "gtceu.hazard_trigger.skin_contact": "ʇɔɐʇuoɔ uıʞS", "gtceu.implosion_compressor": "ɹossǝɹdɯoƆ uoısoןdɯI", - "gtceu.io.both": "ɥʇoᗺ", - "gtceu.io.export": "ʇɹodxƎ", - "gtceu.io.import": "ʇɹodɯI", - "gtceu.io.none": "ǝuoN", "gtceu.item_filter.empty_item": ")ɯǝʇI oN( ʎʇdɯƎ", "gtceu.item_filter.footer": "ǝpıɹɹǝʌo oʇ ɯǝʇı ɥʇıʍ ʞɔıןƆǝ§", "gtceu.item_list.item_stored": "%d :pǝɹoʇSㄥ§", - "gtceu.item_pipe.priority": "%dɟ§ :ʎʇıɹoıɹԀ6§", "gtceu.jade.cleaned_this_second": "s/%s :pɹɐzɐɥ pǝuɐǝןƆ", "gtceu.jade.energy_stored": "∩Ǝ %d / %d", "gtceu.jade.progress_computation": "∩MƆ %s / %s", @@ -3128,25 +2819,6 @@ "gtceu.maintenance.configurable_time": "xɟ% :ǝɯı⟘", "gtceu.maintenance.configurable_time.changed_description": "˙ǝʇɐɹ ןɐɯɹou ǝɥʇ xɟ% ʇɐ ɹnɔɔo ןןıʍ sɯǝןqoɹd ǝɔuɐuǝʇuıɐW", "gtceu.maintenance.configurable_time.unchanged_description": "˙ǝʇɐpdn oʇ uoıʇɐɹnbıɟuoɔ ǝbuɐɥƆ ˙ǝʇɐɹ ןɐɯɹou ʇɐ ɹnɔɔo ןןıʍ sɯǝןqoɹd ǝɔuɐuǝʇuıɐW", - "gtceu.medical_condition.antidote.description": "sןıɐʇǝp ʍoɥs oʇ ʇɟıɥS pןoHㄥ§ ǝʇopıʇuⱯɐ§", - "gtceu.medical_condition.antidote.description.effect_removed": "sʇɔǝɟɟǝ ,suoıʇıpuoɔ ʇuǝɹɹnɔ ɟo %s%% sǝʌoɯǝᴚ", - "gtceu.medical_condition.antidote.description.effect_removed.all": "sʇɔǝɟɟǝ ,suoıʇıpuoɔ ʇuǝɹɹnɔ ɟo ןןɐ sǝʌoɯǝᴚ", - "gtceu.medical_condition.antidote.description_shift": ":suoıʇıpuoɔ ǝsǝɥʇ sǝɹnƆɐ§", - "gtceu.medical_condition.arsenicosis": "sısoɔıuǝsɹⱯq§", - "gtceu.medical_condition.asbestosis": "sısoʇsǝqsⱯp§", - "gtceu.medical_condition.berylliosis": "sısoıןןʎɹǝᗺϛ§", - "gtceu.medical_condition.carbon_monoxide_poisoning": "buıuosıoԀ ǝpıxouoW uoqɹɐƆㄥ§", - "gtceu.medical_condition.carcinogen": "ɔıuǝbouıɔɹɐƆǝ§", - "gtceu.medical_condition.chemical_burns": "suɹnq ןɐɔıɯǝɥƆϛ§", - "gtceu.medical_condition.description": "sןıɐʇǝp ʍoɥs oʇ ʇɟıɥS pןoHㄥ§ S∩OᗡᴚⱯZⱯHɔ§ן§", - "gtceu.medical_condition.description_shift": ":S∩OᗡᴚⱯZⱯHɔ§ן§", - "gtceu.medical_condition.irritant": "ʇuɐʇıɹɹI9§", - "gtceu.medical_condition.methanol_poisoning": "buıuosıoԀ ןouɐɥʇǝW9§", - "gtceu.medical_condition.nausea": "buıʇɐǝsnɐNƐ§", - "gtceu.medical_condition.none": "snoɹǝbuɐᗡ ʇoNᄅ§", - "gtceu.medical_condition.poison": "snouosıoԀᄅ§", - "gtceu.medical_condition.silicosis": "sısoɔıןıSƖ§", - "gtceu.medical_condition.weak_poison": "snouosıod ʎןʞɐǝMɐ§", "gtceu.minimap.ore_vein.depleted": "pǝʇǝןdǝᗡ", "gtceu.mixer": "ɹǝxıW", "gtceu.mode.both": "ɹ§)ɯǝʇI puⱯ pınןℲ( ɥʇoᗺp§", @@ -3177,11 +2849,6 @@ "gtceu.multiblock.cleanroom.clean_state": "NⱯƎꞀƆɐ§ :snʇɐʇS", "gtceu.multiblock.cleanroom.dirty_state": "ᗡƎ⟘ⱯNIWⱯ⟘NOƆㄣ§ :snʇɐʇS", "gtceu.multiblock.coke_oven.description": "˙ɥɔʇɐH uǝʌO ǝʞoƆ sʇı ɐıʌ pǝssǝɔɔɐ ǝq uɐɔ ʎɹoʇuǝʌuı sʇI ˙ǝʇosoǝɹɔ ɹoɟ sʇǝʞɔnq ᄅƐ ɟo ʞuɐʇ ןɐuɹǝʇuı uɐ sɐɥ puɐ ןǝnɟ ǝɹınbǝɹ ʇ,usǝop ʇI ˙ǝɯɐb ʎןɹɐǝ ǝɥʇ uı ǝʇosoǝɹɔ puɐ ǝʞoɔ buıʇʇǝb ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı uǝʌO ǝʞoƆ ǝɥ⟘", - "gtceu.multiblock.computation.max": "%s :ʇ/∩MƆ xɐW", - "gtceu.multiblock.computation.non_bridging": "punoɟ uoıʇɔǝuuoɔ buıbpıɹq-uoN", - "gtceu.multiblock.computation.non_bridging.detailed": "ǝbpıɹq ʇouuɐɔ ɥɔıɥʍ ǝuıɥɔɐɯ ɐ oʇ pǝʞuıן sı ɥɔʇɐH uoıʇdǝɔǝᴚ Ɐ", - "gtceu.multiblock.computation.not_enough_computation": "¡uoıʇɐʇndɯoɔ ǝɹoɯ spǝǝu ǝuıɥɔɐW", - "gtceu.multiblock.computation.usage": "%s :buıs∩", "gtceu.multiblock.cracker.description": "˙sʇuɐıɹɐʌ pǝʞɔɐɹƆ ɹıǝɥʇ oʇuı ןǝnℲ ʎʌɐǝH puɐ ʇɥbıꞀ buıuɹnʇ ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı ʇıu∩ buıʞɔɐɹƆ ןıO ǝɥ⟘", "gtceu.multiblock.cracking_unit.energy": "%s%% :ǝbɐs∩ ʎbɹǝuƎ", "gtceu.multiblock.data_bank.description": "˙sǝןnpoW ɐʇɐᗡ uo ɐʇɐp ɥɔɹɐǝsǝɹ xǝןdɯoɔ ǝɹoɯ pɐǝɹ oʇ sǝuıꞀ ʎןqɯǝssⱯ sǝןqɐuǝ ʇı 'ʎןןɐuoıʇıppⱯ ˙sǝuıꞀ ʎןqɯǝssⱯ ǝןdıʇןnɯ uǝǝʍʇǝq ɐʇɐᗡ ɥɔɹɐǝsǝᴚ ǝuıꞀ ʎןqɯǝssⱯ buıɹɐɥs ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı ʞuɐᗺ ɐʇɐᗡ ǝɥ⟘", @@ -3190,7 +2857,6 @@ "gtceu.multiblock.distillation_tower.description": "˙uoıʇısod ʎuɐ uı spınןɟ ʇɹǝsuı puɐ sɯǝʇı ʇndʇno uɐɔ ɹǝʎɐן ɯoʇʇoq ǝɥ⟘ ˙ǝuo puoɔǝs ǝɥʇ ɯoɹɟ buıʇɹɐʇs 'ɥɔʇɐɥ ʇndʇno ǝuo ʎןʇɔɐxǝ ǝʌɐɥ ʇsnɯ ɹǝʎɐן ɥɔɐƎ ˙sʇɔnpoɹdʎq ɹıǝɥʇ ɟo ǝɯos puɐ ןıO ɟo sǝdʎʇ snoıɹɐʌ ǝɥʇ buıןןıʇsıp ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı ɹǝʍo⟘ uoıʇɐןןıʇsıᗡ ǝɥ⟘", "gtceu.multiblock.distillation_tower.distilling_fluid": "%s buıןןıʇsıᗡ", "gtceu.multiblock.electric_blast_furnace.description": "˙ʎoןןɐ ɥɐpɐnbɐu puɐ 'ɯnıuɐʇıʇ 'ןǝǝʇs ssǝןuıɐʇs 'ɯnıuıɯnןɐ sɐ ɥɔns 'sןɐʇǝɯ puɐ sʎoןןɐ ɹǝıʇ-ɥbıɥ buıuıɐʇqo ɹoɟ pǝɹınbǝɹ sı ʇI ˙sǝɹo buıuıɟǝɹ puɐ sןɐʇǝɯ buıʞooɔ 'sʎoןןɐ buıʇןǝɯs ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı )ℲᗺƎ( ǝɔɐuɹnℲ ʇsɐןᗺ ɔıɹʇɔǝןƎ ǝɥ⟘", - "gtceu.multiblock.energy_consumption": ")%s( ʇ/∩Ǝ %s :ǝbɐs∩ ʎbɹǝuƎ", "gtceu.multiblock.exact_hatch_1.tooltip": "˙ɥɔʇɐH ʎbɹǝuƎɟ§ ǝuO9§ ʎןʇɔɐxƎ sʇdǝɔɔⱯɟ§", "gtceu.multiblock.extreme_combustion_engine.description": "˙ɹǝʍod ΛI ɹoɟ ɹoʇɐɹǝuǝ⅁ uoıʇsnqɯoƆ ɐ sɐ sʇɔɐ ʇɐɥʇ ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı ǝuıbuƎ uoıʇsnqɯoƆ ǝɯǝɹʇxƎ ǝɥ⟘", "gtceu.multiblock.fluid_rig.drilled_fluid": "%s :pınןℲ", @@ -3200,7 +2866,6 @@ "gtceu.multiblock.fluid_rig.vein_depletion": "%s :ǝzıS uıǝΛ", "gtceu.multiblock.fusion_reactor.energy": "%d / %d :∩Ǝ", "gtceu.multiblock.fusion_reactor.heat": "%d :ʇɐǝH", - "gtceu.multiblock.generation_eu": "ʇ/∩Ǝ %sɐ§ :buıʇʇndʇnO", "gtceu.multiblock.hpca.computation": "%s :buıpıʌoɹԀ", "gtceu.multiblock.hpca.description": "˙suoıʇɐuıʇsǝp ǝɹoɯ ɹo ǝuo oʇ sǝɔɹnos ǝןdıʇןnɯ ɯoɹɟ uoıʇɐʇndɯoƆ buıʇnoɹ puɐ buıuıqɯoɔ ɹoɟ sǝɥɔʇıʍS ʞɹoʍʇǝN oʇ ʇɔǝuuoɔ uɐɔ ⱯƆԀH ǝɥʇ 'ʇuǝuodɯoƆ ǝbpıɹᗺ ɐ ɥʇıʍ pǝsn uǝɥM ˙uoıʇɔnpoɹԀ ʇɐǝH puɐ 'ʇsoƆ ʇuɐןooƆ 'ʇsoƆ ʎbɹǝuƎ sɐ ןןǝʍ sɐ 'buıןooƆ 'uoıʇɐʇndɯoƆ ɟo sʇunoɯɐ ʇuǝɹǝɟɟıp ǝpıʌoɹd uɐɔ sʇuǝuodɯoɔ ʇuǝɹǝɟɟıᗡ ˙sʇuǝuodɯoɔ ⱯƆԀH ɥʇıʍ ʎɐʍ ʎuɐ uı pǝןןıɟ ǝq uɐɔ ɥɔıɥʍ ɐǝɹɐ ƐxƐ ǝןqıxǝןɟ ɐ sɐɥ ǝɹnʇɔnɹʇs ǝɥ⟘ ˙ɐʇɐᗡ ɥɔɹɐǝsǝᴚ ǝuıꞀ ʎןqɯǝssⱯ xǝןdɯoɔ ǝɹoɯ ɹoɟ )ʇ/∩MƆ( sʇıu∩ ʞɹoM ǝʇndɯoƆ buıʇɐǝɹɔ ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı )ⱯƆԀH( ʎɐɹɹⱯ buıʇndɯoƆ ǝɔuɐɯɹoɟɹǝԀ ɥbıH ǝɥ⟘", "gtceu.multiblock.hpca.energy": ")%s( ʇ/∩Ǝ %s / %s :buıs∩", @@ -3221,10 +2886,7 @@ "gtceu.multiblock.hpca.warning_structure_header": ":sbuıuɹɐM ǝɹnʇɔnɹʇS", "gtceu.multiblock.hpca.warning_temperature": "¡Ɔ00Ɩ ʇɐ pǝbɐɯɐp ǝq ʎɐɯ sʇuǝuodɯoɔ 'Ɔ0ϛ ǝʌoqɐ ǝɹnʇɐɹǝdɯǝ⟘", "gtceu.multiblock.hpca.warning_temperature_active_cool": "sɹǝןooɔ ǝʌıʇɔɐ buızıןıʇn ʎןןnℲ", - "gtceu.multiblock.idling": "˙buıןpI9§", "gtceu.multiblock.implosion_compressor.description": "˙sɯǝb buıpuodsǝɹɹoɔ ɹıǝɥʇ oʇuı sʇsnp ɯǝb uɹnʇ oʇ sǝʌısoןdxǝ sǝsn ʇɐɥʇ ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı ɹossǝɹdɯoƆ uoısoןdɯI ǝɥ⟘", - "gtceu.multiblock.invalid_structure": "˙ǝɹnʇɔnɹʇs pıןɐʌuI", - "gtceu.multiblock.invalid_structure.tooltip": "˙IƎſ uı ǝʇɐןdɯǝʇ ǝɹnʇɔnɹʇs ǝǝs 'dןǝɥ buıpןınq ɹoℲ ˙ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ǝɥʇ ɟo ɹǝןןoɹʇuoɔ ɐ sı ʞɔoןq sıɥ⟘", "gtceu.multiblock.large_boiler.description": "˙uoıʇdɯnsuoɔ ןǝnℲ puɐ ʇndʇno ɯɐǝʇS ǝɔnpǝɹ oʇ %%ϛ ɟo sʇuǝɯǝɹɔuı uı ʞɔɐq pǝןʇʇoɹɥʇ ǝq uɐƆ ˙ןǝnℲ pınןℲ-ıɯǝS/ןǝsǝıᗡ ɐ ɹo 'ǝɯı⟘ uɹnᗺ ɐ ɥʇıʍ ןǝnℲ pıןoS ʎuɐ ɹǝɥʇıǝ sı ǝɔɹnos ʎbɹǝuǝ pıɐS ˙ɹǝʇɐʍ puɐ ǝɔɹnos ʎbɹǝuǝ uɐ ɯoɹɟ ɯɐǝʇs ǝʇɐɹǝuǝb ʇɐɥʇ sʞɔoןqıʇןnɯ ǝɹɐ sɹǝןıoᗺ ǝbɹɐꞀ", "gtceu.multiblock.large_boiler.efficiency": "%s :ʎɔuǝıɔıɟɟƎ", "gtceu.multiblock.large_boiler.explosion_tooltip": "ɹǝʇɐM ou ɥʇıʍ ןǝnℲ pǝpıʌoɹd ɟı ǝpoןdxǝ ןןıM", @@ -3258,52 +2920,20 @@ "gtceu.multiblock.large_miner.working": "˙˙˙buıʞɹoM", "gtceu.multiblock.large_turbine.description": "˙ǝɹnʇɔnɹʇs ǝɥʇ ɟo ɹǝʇuǝɔ ǝɥʇ uı pǝsn ǝɹɐ sbuısɐɔ xoqɹɐǝ⅁ ˙ǝuıqɹnʇ ɟo pǝǝds ʇuǝɹɹnɔ puɐ ʎɔuǝıɔıɟɟǝ ɹoʇoɹ uo pǝsɐq sı ʇndʇno ʎbɹǝuƎ ˙ɹoʇoɹ s,ǝuıqɹnʇ ǝɥʇ uıds ɯǝɥʇ buıʌɐɥ ʎq ɐɯsɐןd puɐ 'sǝsɐb 'ɯɐǝʇs ɯoɹɟ ɹǝʍod ǝʇɐɹǝuǝb ʇɐɥʇ sʞɔoןqıʇןnɯ ǝɹɐ sǝuıqɹn⟘ ǝbɹɐꞀ", "gtceu.multiblock.luv_fusion_reactor.description": "˙W09Ɩ ɟo ɯnɯıxɐɯ ɐ sɐɥ puɐ '∩Ǝ W0Ɩ ʎq sǝsɐǝɹɔuı ɹǝɟɟnq sʇı 'sɐɥ ʇı ɥɔʇɐH ʎɹǝʌǝ ɹoℲ ˙sǝɥɔʇɐH ʎbɹǝuƎ Λ∩ puɐ 'WԀZ 'ΛnꞀ ǝsn ʎןuo uɐɔ ʇI ˙sǝuo ɹǝıʌɐǝɥ oʇuı sʇuǝɯǝןǝ buısnɟ ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ǝbɹɐן ɐ sı Ɩ ʞW ɹoʇɔɐǝᴚ uoısnℲ ǝɥ⟘", - "gtceu.multiblock.max_energy_per_tick": ")ɹ§%s( %sɐ§ :ʇ/∩Ǝ xɐW", - "gtceu.multiblock.max_energy_per_tick_amps": ")%s Ɐ%s( %s :ʇ/∩Ǝ xɐW", - "gtceu.multiblock.max_energy_per_tick_hover": "buıʞɔoןɔɹǝʌo ɹo sǝdıɔǝɹ buıuunɹ ɹoɟ ǝןqɐןıɐʌɐ ʇ/∩Ǝ ɯnɯıxɐɯ ǝɥ⟘", - "gtceu.multiblock.max_recipe_tier": "%s :ɹǝı⟘ ǝdıɔǝᴚ xɐW", - "gtceu.multiblock.max_recipe_tier_hover": "unɹ ǝq uɐɔ ʇɐɥʇ sǝdıɔǝɹ ɟo ɹǝıʇ ɯnɯıxɐɯ ǝɥ⟘", "gtceu.multiblock.monitor_screen.tooltip.0": "˙ɹǝʌıɹpʍǝɹɔs ɐ ɟo ʞɔıןɔ-ʇɥbıɹ ɐ ɥʇıʍ pǝuǝdo ǝq uɐɔ I∩⅁ ǝɥ⟘", "gtceu.multiblock.monitor_screen.tooltip.1": ")˙uǝǝɹɔs ǝɥʇ uo ʎןʇɔǝɹıp sǝdıd ʇɔǝuuoɔ uɐɔ noʎ 'sǝʎ( ˙I∩⅁ puɐ sǝıʇıןıqɐdɐɔ ,sǝuıɥɔɐɯ ǝʇɐbǝןǝp uɐɔ ɹǝʌoƆ ǝɔɐɟɹǝʇuI ןɐʇıbıᗡ ɟo ǝpoɯ ʎxoɹd ǝɥ⟘", "gtceu.multiblock.monitor_screen.tooltip.2": "˙suıbnןd sʇɹoddns osןɐ uǝǝɹɔs ǝɥ⟘", "gtceu.multiblock.multi_furnace.description": "˙sןıoɔ ןǝʌǝן ɹǝɥbıɥ buısn ʎq pǝıןdıʇןnɯ ǝq uɐɔ puɐ 'uoıʇɐɹǝdo ɹǝd pǝʇןǝɯs sɯǝʇı ɟo ǝnןɐʌ ǝsɐq ǝɥʇ sı ᄅƐ ˙uıɐb ʎɔuǝıɔıɟɟǝ ʎbɹǝuǝ puɐ ʇsooq pǝǝds ɐ ǝpıʌoɹd sןıoɔ ɟo sɹǝıʇ ʇuǝɹǝɟɟıᗡ ˙ǝɔuo ʇɐ sɯǝʇı ɟo sʇunoɯɐ ǝʌıssɐɯ buıʇןǝɯs ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı ɹǝʇןǝɯS ıʇןnW ǝɥ⟘", "gtceu.multiblock.multi_furnace.heating_coil_discount": "x%s :ʇsooᗺ ∩Ǝ ןıoƆ buıʇɐǝH", "gtceu.multiblock.multi_furnace.heating_coil_level": "%s :ןǝʌǝꞀ ןıoƆ buıʇɐǝH", - "gtceu.multiblock.multiple_recipemaps.header": ":ǝpoW ǝuıɥɔɐW", - "gtceu.multiblock.multiple_recipemaps.switch_message": "¡sǝpoɯ ɥɔʇıʍs oʇ ɟɟo ǝq ʇsnɯ ǝuıɥɔɐɯ ǝɥ⟘", - "gtceu.multiblock.multiple_recipemaps.tooltip": "˙ǝsn oʇ ǝpoɯ ǝuıɥɔɐɯ ɥɔıɥʍ ǝbuɐɥɔ oʇ ɹǝןןoɹʇuoɔ ǝɥʇ ɹǝʌıɹpʍǝɹɔS", - "gtceu.multiblock.multiple_recipemaps_recipes.tooltip": "ɹ§%sǝ§ :sǝpoW ǝuıɥɔɐW", "gtceu.multiblock.network_switch.description": "˙uoıʇɐʇndɯoƆ ɹıǝɥʇ ssǝɔɔɐ oʇ ǝןqɐ ǝq oʇ ɥɔʇıʍS ʞɹoʍʇǝN ǝɥʇ ɹoɟ ʇuǝuodɯoƆ ǝbpıɹᗺ ɐ ǝʌɐɥ ʇsnɯ sⱯƆԀH ˙ɥɔʇɐH uoıʇdǝɔǝᴚ ɐʇɐᗡ uoıʇɐʇndɯoƆ ǝuo ʇdǝɔɔɐ ʎןuo uɐɔ uoıʇɐʇS ɥɔɹɐǝsǝᴚ ǝɥʇ sɐ 'uoıʇɐʇndɯoƆ ɹǝɥbıɥ ɥɔnɯ sǝɹınbǝɹ ɥɔıɥʍ ɐʇɐᗡ ɥɔɹɐǝsǝᴚ ɹoɟ ʎɹɐssǝɔǝu sı ʇI ˙sǝɥɔʇɐH uoıssıɯsuɐɹ⟘ ɹo uoıʇdǝɔǝᴚ ɐʇɐᗡ uoıʇɐʇndɯoƆ ɟo ɹǝqɯnu ʎuɐ ʇdǝɔɔɐ uɐɔ ʇI ˙suoıʇɐuıʇsǝp ʎuɐɯ oʇ sǝɔɹnos ʎuɐɯ ɯoɹɟ uoıʇɐʇndɯoƆ buıʇnqıɹʇsıp ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı ɥɔʇıʍS ʞɹoʍʇǝN ǝɥ⟘", - "gtceu.multiblock.not_enough_energy": "˙ʎbɹǝuǝ ǝɹoɯ spǝǝu ǝuıɥɔɐW :⅁NINᴚⱯM", - "gtceu.multiblock.not_enough_energy_output": "¡ʍoꞀ oo⟘ ɹǝı⟘ oɯɐuʎᗡ ʎbɹǝuƎ :⅁NINᴚⱯM", "gtceu.multiblock.ore_rig.drilled_ore_entry": "%s - ", "gtceu.multiblock.ore_rig.drilled_ores_list": ":sǝɹO", "gtceu.multiblock.ore_rig.ore_amount": "%s :ǝʇɐᴚ buıןןıɹᗡ", - "gtceu.multiblock.output_line.0": ")ɐǝ/%ss( ɹ§%sǝ§ x %s", - "gtceu.multiblock.output_line.1": ")s/%s( ɹ§%sǝ§ x %s", - "gtceu.multiblock.output_line.2": ")ɐǝ/%ss( ɹ§%sǝ§ ≈ %s", - "gtceu.multiblock.output_line.3": ")s/%s( ɹ§%sǝ§ ≈ %s", "gtceu.multiblock.page_switcher.io.both": "sʇndʇnO + sʇnduI pǝuıqɯoƆϛ§", "gtceu.multiblock.page_switcher.io.export": "sʇndʇnOㄣ§", "gtceu.multiblock.page_switcher.io.import": "sʇnduIᄅ§", - "gtceu.multiblock.parallel": "ןǝןןɐɹɐԀ uı sǝdıɔǝᴚ %d oʇ dn buıɯɹoɟɹǝԀ", - "gtceu.multiblock.parallel.exact": "ןǝןןɐɹɐԀ uı sǝdıɔǝᴚ %d buıɯɹoɟɹǝԀ", "gtceu.multiblock.parallelizable.tooltip": "˙sǝɥɔʇɐH ןoɹʇuoƆ ןǝןןɐɹɐԀ ɥʇıʍ ǝzıןǝןןɐɹɐd uɐƆ", - "gtceu.multiblock.pattern.clear_amount_1": "ɹ§ʇuoɹɟ uı ǝɔɐds ƖxƖxƖ ɹɐǝןɔ ɐ ǝʌɐɥ ʇsnW9§", - "gtceu.multiblock.pattern.clear_amount_3": "ɹ§ʇuoɹɟ uı ǝɔɐds ƖxƐxƐ ɹɐǝןɔ ɐ ǝʌɐɥ ʇsnW9§", - "gtceu.multiblock.pattern.error": "˙)%s( ʇɐ )%s( sʇuǝuodɯoɔ pǝʇɔǝdxƎ", - "gtceu.multiblock.pattern.error.batteries": "ɹ§ǝɯɐs ǝɥʇ ǝq ʇsnɯ sǝıɹǝʇʇɐq ןןⱯɔ§", - "gtceu.multiblock.pattern.error.coils": "ɹ§ǝɯɐs ǝɥʇ ǝq ʇsnɯ sןıoɔ buıʇɐǝɥ ןןⱯɔ§", - "gtceu.multiblock.pattern.error.filters": "ɹ§ǝɯɐs ǝɥʇ ǝq ʇsnɯ sɹǝʇןıɟ ןןⱯɔ§", - "gtceu.multiblock.pattern.error.limited.0": "ɹ§%d :ɯnɯıxɐWɔ§", - "gtceu.multiblock.pattern.error.limited.1": "ɹ§%d :ɯnɯıuıWɔ§", - "gtceu.multiblock.pattern.error.limited.2": "ɹ§ɹǝʎɐן ɹǝd %d :ɯnɯıxɐWɔ§", - "gtceu.multiblock.pattern.error.limited.3": "ɹ§ɹǝʎɐן ɹǝd %d :ɯnɯıuıWɔ§", - "gtceu.multiblock.pattern.error.limited_exact": "ɹ§%d :ʎןʇɔɐxƎɔ§", - "gtceu.multiblock.pattern.error.limited_within": "ɹ§%d puɐ %d uǝǝʍʇǝᗺɔ§", - "gtceu.multiblock.pattern.location_end": "ɹ§puƎ ʎɹǝΛɔ§", - "gtceu.multiblock.pattern.replaceable_air": "ɹıⱯ ʎq ǝןqɐǝɔɐןdǝᴚ", - "gtceu.multiblock.pattern.single": "ɹ§pǝsn ǝq uɐɔ ʞɔoןq sıɥʇ ʎןuO9§", "gtceu.multiblock.power_substation.average_in": "ʇ/∩Ǝㄥ§ %s :ʇnduI ˙bʌⱯㄥ§", "gtceu.multiblock.power_substation.average_in_hover": "ʞuɐq ʎbɹǝuǝ ןɐuɹǝʇuı s,uoıʇɐʇsqnS ɹǝʍoԀ ǝɥʇ oʇuı ∩Ǝ pǝʇɹǝsuı ǝbɐɹǝʌɐ ǝɥ⟘", "gtceu.multiblock.power_substation.average_out": "ʇ/∩Ǝㄥ§ %s :ʇndʇnO ˙bʌⱯㄥ§", @@ -3320,9 +2950,6 @@ "gtceu.multiblock.power_substation.time_to_fill": "%s :ןןıɟ oʇ ǝɯı⟘ㄥ§", "gtceu.multiblock.power_substation.time_years": "sɹɐǝʎ %s", "gtceu.multiblock.power_substation.under_one_hour_left": "¡pǝuıɐɹp ʎןןnɟ ןıʇun ɹnoɥ Ɩ uɐɥʇ ssǝꞀ", - "gtceu.multiblock.preview.rotate": "ǝʇɐʇoɹ oʇ bɐɹp puɐ ʞɔıןƆ", - "gtceu.multiblock.preview.select": "sǝʇɐpıpuɐɔ ʞɔǝɥɔ oʇ ʞɔıןɔ-ʇɥbıᴚ", - "gtceu.multiblock.preview.zoom": "ɯooz oʇ bɐɹp + ʞɔıןɔ-ʇɥbıɹ ɹo ןǝǝɥʍǝsnoɯ ǝs∩", "gtceu.multiblock.primitive_blast_furnace.bronze.description": "˙sdnʇǝs ʇsɹıɟ ɹnoʎ ɹoɟ ןǝǝʇs ɥʇıʍ noʎ ǝpıʌoɹd ןןıʍ ʇı 'ʇsɐɟ ʎɹǝʌ ʇou ɥbnoɥʇןⱯ ˙ǝɯɐb ʎןɹɐǝ ǝɥʇ uı ןǝǝʇs buıʞooɔ ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı )ℲᗺԀ( ǝɔɐuɹnℲ ʇsɐןᗺ ǝʌıʇıɯıɹԀ ǝɥ⟘", "gtceu.multiblock.primitive_water_pump.description": "˙ɹǝıןdıʇןnW ɥɔʇɐH * ʇuǝıɔıɟɟǝoƆ ǝɯoıᗺ :ɐןnɯɹoɟ ǝɥʇ sʍoןןoℲ ˙ɹǝıʇ ɹǝd ɹǝʇɐʍ ɟo ʇunoɯɐ ǝɥʇ buısɐǝɹɔuı 'ɥɔʇɐH ʇndʇnO ΛꞀ ɹo 'ΛꞀ∩ 'dɯnԀ ɐ ǝsn uɐɔ ʇI ˙uı sı ʇı ǝɯoıᗺ ǝɥʇ uo buıpuǝdǝp 'puoɔǝs ɹǝd ǝɔuo ɹǝʇɐʍ sʇɔǝןןoɔ ʇɐɥʇ ʞɔoןqıʇןnɯ ɐɹƎ ɯɐǝʇS-ǝɹd ɐ sı dɯnԀ ɹǝʇɐM ǝʌıʇıɯıɹԀ ǝɥ⟘", "gtceu.multiblock.primitive_water_pump.extra1.0": ":ʇuǝıɔıɟɟǝoƆ ǝɯoıᗺ", @@ -3340,14 +2967,10 @@ "gtceu.multiblock.primitive_water_pump.extra2.3": "xㄣ :ɥɔʇɐH ʇndʇnO ΛꞀ ", "gtceu.multiblock.primitive_water_pump.extra2.4": "", "gtceu.multiblock.primitive_water_pump.extra2.5": "˙%%0ϛ ʎq pǝsɐǝɹɔuı ǝq ןןıʍ uoıʇɔnpoɹd ɹǝʇɐʍ ןɐʇoʇ ǝɥʇ 'ǝɯoıᗺ s,dɯnԀ ǝɥʇ uı buıuıɐɹ ǝןıɥM", - "gtceu.multiblock.progress": ")%s%%( %ss / %ss :ssǝɹboɹԀ", - "gtceu.multiblock.progress_percent": "%s%% :ssǝɹboɹԀ", "gtceu.multiblock.pyrolyse_oven.description": "˙ןıO ʎʌɐǝH puɐ ɥsⱯ ɹo 'ןıO ǝʇosoǝɹƆ puɐ ןɐoɔɹɐɥƆ oʇuı sboꞀ buıuɹnʇ ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı uǝʌO ǝsʎןoɹʎԀ ǝɥ⟘", "gtceu.multiblock.pyrolyse_oven.speed": "%s%% :pǝǝdS buıssǝɔoɹԀ", "gtceu.multiblock.require_steam_parts": "¡sǝsnᗺ puɐ sǝɥɔʇɐH ɯɐǝʇS sǝɹınbǝᴚ", "gtceu.multiblock.research_station.description": "˙)sⱯƆԀH( sʎɐɹɹⱯ buıʇndɯoƆ ǝɔuɐɯɹoɟɹǝԀ ɥbıH ʎq pǝıןddns sı ɥɔıɥʍ 'sǝdıɔǝɹ ɥɔɹɐǝsǝɹ oʇ )ʇ/∩MƆ( sʇıu∩ ʞɹoM ǝʇndɯoƆ sǝɹınbǝᴚ ˙uoıʇɐʇS ɥɔɹɐǝsǝᴚ ǝɥʇ uı pǝuuɐɔs ǝq ʇsnɯ ǝןnpoW ɐʇɐᗡ ɹo qɹO ɐʇɐᗡ ɐ buıɹınbǝɹ ɥɔɹɐǝsǝᴚ ʎuⱯ ˙ɐʇɐᗡ ɥɔɹɐǝsǝᴚ ǝuıꞀ ʎןqɯǝssⱯ xǝןdɯoɔ ǝɹoɯ ɥɔnɯ buıɥɔɹɐǝsǝɹ ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı uoıʇɐʇS ɥɔɹɐǝsǝᴚ ǝɥ⟘", - "gtceu.multiblock.research_station.researching": "˙buıɥɔɹɐǝsǝᴚ9§", - "gtceu.multiblock.running": "˙ʎןʇɔǝɟɹǝd buıuunᴚ", "gtceu.multiblock.steam.duration_modifier": "˙sɯǝʇı ɟo ɹǝqɯnu ʎq pǝʇɔǝɟɟɐ ʇou 'ssǝɔoɹd oʇ uoıʇɐɹnp ǝsɐqㄥ§ xϛ˙Ɩɟ§ sǝʞɐ⟘", "gtceu.multiblock.steam.low_steam": "¡unɹ oʇ ɯɐǝʇS ɥbnouǝ ʇoN", "gtceu.multiblock.steam.steam_stored": "qɯ %s / %s :ɯɐǝʇS", @@ -3363,27 +2986,8 @@ "gtceu.multiblock.turbine.obstructed": "pǝʇɔnɹʇsqO ǝɔɐℲ ǝuıqɹn⟘", "gtceu.multiblock.turbine.rotor_durability": "%s%% :ʎʇıןıqɐɹnᗡ ɹoʇoᴚ", "gtceu.multiblock.turbine.rotor_speed": "WԀᴚ %s/%s :pǝǝdS ɹoʇoᴚ", - "gtceu.multiblock.universal.distinct": ":sǝsnᗺ ʇɔuıʇsıᗡ", - "gtceu.multiblock.universal.distinct.info": "˙ɔʇǝ 'sǝdɐɥS ɹǝpnɹʇxƎ 'sʇınɔɹıƆ pǝɯɯɐɹboɹԀ ǝʞıן sbuıɥʇ ɹoɟ ןnɟǝs∩ ˙dnʞooן ǝdıɔǝɹ ɹoɟ ɹǝɥʇo ɥɔɐǝ ɯoɹɟ ʇɔuıʇsıp ʎןןnɟ sɐ pǝʇɐǝɹʇ ǝq ןןıʍ snᗺ ʇnduI ɯǝʇI ɥɔɐǝ 'pǝןqɐuǝ ɟI", - "gtceu.multiblock.universal.distinct.no": "oN", - "gtceu.multiblock.universal.distinct.yes": "sǝʎ", - "gtceu.multiblock.universal.has_problems": "¡sɯǝןqoɹԀ ǝɔuɐuǝʇuıɐW sɐH", - "gtceu.multiblock.universal.has_problems_header": ":ɥɔʇɐH ǝɔuɐuǝʇuıɐW ɐ uı sǝnssı buıʍoןןoɟ ǝɥʇ xıℲ", - "gtceu.multiblock.universal.muffler_obstructed": "¡pǝʇɔnɹʇsqO sı ɥɔʇɐH ɹǝןɟɟnW", - "gtceu.multiblock.universal.muffler_obstructed.tooltip": "˙ʇı ɟo ʇuoɹɟ uı ǝɔɐdsɹıɐ ɟo ʞɔoןq ɐ ǝʌɐɥ ʇsnɯ ɥɔʇɐH ɹǝןɟɟnW", - "gtceu.multiblock.universal.no_problems": "¡sɯǝןqoɹԀ ǝɔuɐuǝʇuıɐW oN", - "gtceu.multiblock.universal.problem.crowbar": ")ㄥ§ɹɐqʍoɹƆɐ§( ˙ǝɹǝɥʇ buoןǝq ʇ,usǝop ʇɐɥ⟘ㄥ§", - "gtceu.multiblock.universal.problem.hard_hammer": ")ㄥ§ɹǝɯɯɐH pɹɐHɐ§( ˙pǝʇuǝp sı buıʇɐןԀㄥ§", - "gtceu.multiblock.universal.problem.screwdriver": ")ㄥ§ɹǝʌıɹpʍǝɹɔSɐ§( ˙ǝsooן ǝɹɐ sʍǝɹɔSㄥ§", - "gtceu.multiblock.universal.problem.soft_mallet": ")ㄥ§ʇǝןןɐW ʇɟoSɐ§( ˙ʞɔnʇs sı buıɥʇǝɯoSㄥ§", - "gtceu.multiblock.universal.problem.wire_cutter": ")ㄥ§ɹǝʇʇnƆ ǝɹıMɐ§( ˙ʇno pǝuɹnq sǝɹıMㄥ§", - "gtceu.multiblock.universal.problem.wrench": ")ㄥ§ɥɔuǝɹMɐ§( ˙ǝsooן sı ǝdıԀㄥ§", - "gtceu.multiblock.universal.rotor_obstructed": "¡pǝʇɔnɹʇsqO sı ɹoʇoᴚ", "gtceu.multiblock.uv_fusion_reactor.description": "˙W0ㄣ9 ɟo ɯnɯıxɐɯ ɐ sɐɥ puɐ '∩Ǝ W0ㄣ ʎq sǝsɐǝɹɔuı ɹǝɟɟnq sʇı 'sɐɥ ʇı ɥɔʇɐH ʎɹǝʌǝ ɹoℲ ˙sǝɥɔʇɐH ʎbɹǝuƎ Λ∩ ǝsn ʎןuo uɐɔ ʇI ˙sǝuo ɹǝıʌɐǝɥ oʇuı sʇuǝɯǝןǝ buısnɟ ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ǝbɹɐן ɐ sı Ɛ ʞW ɹoʇɔɐǝᴚ uoısnℲ ǝɥ⟘", "gtceu.multiblock.vacuum_freezer.description": "˙ɹǝʇɐM sɐ ɥɔns 'sǝɔuɐʇsqns ɹǝɥʇo ǝzǝǝɹɟ osןɐ uɐɔ ʇı 'ɹǝʌǝʍoH ˙sʇobuI ɹɐןnbǝɹ oʇuı sʇobuI ʇoH buızǝǝɹɟ ɹoɟ pǝsn ʎןuıɐɯ ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı ɹǝzǝǝɹℲ ɯnnɔɐΛ ǝɥ⟘", - "gtceu.multiblock.validation_failed": "˙sʇndʇno/sʇnduı ɟo ʇunoɯɐ pıןɐʌuI", - "gtceu.multiblock.waiting": "˙buıʇıɐʍ sı ǝuıɥɔɐW :⅁NINᴚⱯM", - "gtceu.multiblock.work_paused": "˙pǝsnɐԀ ʞɹoM", "gtceu.multiblock.zpm_fusion_reactor.description": "˙W0ᄅƐ ɟo ɯnɯıxɐɯ ɐ sɐɥ puɐ '∩Ǝ W0ᄅ ʎq sǝsɐǝɹɔuı ɹǝɟɟnq sʇı 'sɐɥ ʇı ɥɔʇɐH ʎɹǝʌǝ ɹoℲ ˙sǝɥɔʇɐH ʎbɹǝuƎ Λ∩ puɐ WԀZ ǝsn ʎןuo uɐɔ ʇI ˙sǝuo ɹǝıʌɐǝɥ oʇuı sʇuǝɯǝןǝ buısnɟ ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ǝbɹɐן ɐ sı ᄅ ʞW ɹoʇɔɐǝᴚ uoısnℲ ǝɥ⟘", "gtceu.oc.tooltip.0": "%s :uıW", "gtceu.oc.tooltip.1": "ƆO ǝɥʇ ǝsɐǝɹɔuı oʇ ʞɔıןɔ ʇɟǝꞀ", @@ -3401,7 +3005,6 @@ "gtceu.polarizer": "ɹǝzıɹɐןoԀ", "gtceu.primitive_blast_furnace": "ǝɔɐuɹnℲ ʇsɐןᗺ ǝʌıʇıɯıɹԀ", "gtceu.pyrolyse_oven": "uǝʌO ǝsʎןoɹʎԀ", - "gtceu.recipe.amperage": "%s :ǝbɐɹǝdɯⱯ", "gtceu.recipe.category.arc_furnace_recycling": "buıddɐɹɔS ɐɯsɐןԀ", "gtceu.recipe.category.chem_dyes": "buıǝʎᗡ ןɐɔıɯǝɥƆ", "gtceu.recipe.category.extractor_recycling": "buıʇןǝɯǝᴚ dɐɹɔS", @@ -3410,27 +3013,6 @@ "gtceu.recipe.category.ore_bathing": "buıʇɐǝɹ⟘ ǝɹO", "gtceu.recipe.category.ore_crushing": "buıpuıɹ⅁ ǝɹO", "gtceu.recipe.category.ore_forging": "buıɥsnɹƆ ǝɹO", - "gtceu.recipe.chance": "ɹǝıʇ/%s+ %s :ǝɔuɐɥƆ", - "gtceu.recipe.cleanroom": "%s sǝɹınbǝᴚ", - "gtceu.recipe.cleanroom.display_name": "ɯooɹuɐǝןƆ", - "gtceu.recipe.cleanroom_sterile.display_name": "ɯooɹuɐǝןƆ ǝןıɹǝʇS", - "gtceu.recipe.coil.tier": "%s :ןıoƆ", - "gtceu.recipe.computation_per_tick": "ʇ/∩MƆ %s :uoıʇɐʇndɯoƆ ˙uıW", - "gtceu.recipe.dimensions": "%s :suoısuǝɯıᗡ", - "gtceu.recipe.duration": "sɔǝs %s :uoıʇɐɹnᗡ", - "gtceu.recipe.environmental_hazard": "%s ǝʌɐɥ ʇsnɯ ɐǝɹⱯɔ§", - "gtceu.recipe.environmental_hazard.reverse": "%s ɟo ǝǝɹɟ ǝq ʇsnɯ ɐǝɹⱯɔ§", - "gtceu.recipe.eu": "ʇ/∩Ǝ %s :ǝbɐs∩", - "gtceu.recipe.eu_inverted": "ʇ/∩Ǝ %s :uoıʇɐɹǝuǝ⅁", - "gtceu.recipe.eu_to_start": "%s∩Ǝ%s :ʇɹɐʇS o⟘ ∩Ǝ", - "gtceu.recipe.explosive": "%s :ǝʌısoןdxƎ", - "gtceu.recipe.max_eu": "∩Ǝ %s :∩Ǝ ˙xɐW", - "gtceu.recipe.not_consumed": "ssǝɔoɹd ǝɥʇ uı pǝɯnsuoɔ ʇǝb ʇou sǝoᗡ", - "gtceu.recipe.research": "ɥɔɹɐǝsǝᴚ sǝɹınbǝᴚ", - "gtceu.recipe.scan_for_research": "ǝuıꞀ ʎןqɯǝssⱯ ɹoɟ uɐɔS", - "gtceu.recipe.temperature": "ʞ%s :dɯǝ⟘", - "gtceu.recipe.total": "∩Ǝ %s :ןɐʇo⟘", - "gtceu.recipe.total_computation": "∩MƆ %s :uoıʇɐʇndɯoƆ", "gtceu.recipe_logic.condition_fails": "sןıɐℲ uoıʇıpuoƆ", "gtceu.recipe_logic.insufficient_fuel": "ןǝnℲ ʇuǝıɔıɟɟnsuI", "gtceu.recipe_logic.insufficient_in": "sʇnduI ʇuǝıɔıɟɟnsuI", @@ -3450,94 +3032,13 @@ "gtceu.sifter": "ɹǝʇɟıS", "gtceu.steam_boiler": "ɹǝןıoᗺ ɯɐǝʇS", "gtceu.steam_turbine": "ǝuıqɹn⟘ ɯɐǝʇS", - "gtceu.subtitle.arc": "buızznq sɔɹⱯ", - "gtceu.subtitle.assembler": "buıʇɔnɹʇsuoɔ ɹǝןqɯǝssⱯ", - "gtceu.subtitle.bath": "buızzıɟ ɥʇɐᗺ", - "gtceu.subtitle.boiler": "buıʇɐǝɥ ɹǝןıoᗺ", - "gtceu.subtitle.centrifuge": "buıuuıds ǝbnɟıɹʇuǝƆ", - "gtceu.subtitle.chainsaw": "buıʌʌǝɹ ʍɐsuıɐɥƆ", - "gtceu.subtitle.chemical": "buıןqqnq ןɐɔıɯǝɥƆ", - "gtceu.subtitle.combustion": "buıʇsnqɯoƆ", - "gtceu.subtitle.compressor": "buızǝǝnbs ɹossǝɹdɯoƆ", - "gtceu.subtitle.computation": "sdǝǝq ɹǝʇndɯoƆ", - "gtceu.subtitle.cooling": "buıɯɯnɥ ɹǝzǝǝɹℲ", - "gtceu.subtitle.cut": "buıɹɹıɥʍ ɹǝʇʇnƆ", - "gtceu.subtitle.drill": "buıןןıɹᗡ", - "gtceu.subtitle.electrolyzer": "buıʞɹɐds ɹǝzʎןoɹʇɔǝןƎ", - "gtceu.subtitle.file": "buıdsɐɹ ǝןıℲ", - "gtceu.subtitle.fire": "buıןʞɔɐɹɔ ǝɹıℲ", - "gtceu.subtitle.forge_hammer": "buıdɯnɥʇ ɹǝɯɯɐH ǝbɹoℲ", - "gtceu.subtitle.furnace": "buıʇɐǝɥ ǝɔɐuɹnℲ", - "gtceu.subtitle.jet_engine": "buıɹɐoɹ ʇǝſ", - "gtceu.subtitle.macerator": "buıɥsnɹɔ ɹoʇɐɹǝɔɐW", - "gtceu.subtitle.metal_pipe": "ʌɐʍ˙0‾0‾ᄅ‾ǝʌɐM‾Ꞁ‾ǝןoԀ‾ןɐʇǝW‾uoıʇɔnɹʇsǝᗡ", - "gtceu.subtitle.miner": "buıʇɐʌɐɔxǝ ɹǝuıW", - "gtceu.subtitle.mixer": "buıɥsoןs ɹǝxıW", - "gtceu.subtitle.mortar": "buıɥsnɹɔ ɹɐʇɹoW", - "gtceu.subtitle.motor": "buıɯɯnɥ ɹoʇoW", - "gtceu.subtitle.plunger": "buıddod ɹǝbunןԀ", - "gtceu.subtitle.portable_scanner": "buıuuɐɔS", - "gtceu.subtitle.portal_closing": "sǝsoןɔ ןɐʇɹoԀ", - "gtceu.subtitle.portal_opening": "suǝdo ןɐʇɹoԀ", - "gtceu.subtitle.replicator": "buıʎdoɔ ɹoʇɐɔıןdǝᴚ", - "gtceu.subtitle.saw": "buıʍɐS", - "gtceu.subtitle.science": "ǝ ɔ u ǝ ı ɔ s", - "gtceu.subtitle.screwdriver": "buıʍǝɹɔS", - "gtceu.subtitle.soft_hammer": "dɐʇ ʇɟoS", - "gtceu.subtitle.spray_can": "buıʎɐɹdS", - "gtceu.subtitle.sus": "˙˙˙snS", - "gtceu.subtitle.turbine": "buızzıɥʍ ǝuıqɹn⟘", - "gtceu.subtitle.wirecutter": "pǝddıus ǝɹıM", - "gtceu.subtitle.wrench": "buıןʇʇɐɹ ɥɔuǝɹM", "gtceu.thermal_centrifuge": "ǝbnɟıɹʇuǝƆ ןɐɯɹǝɥ⟘", - "gtceu.tool.class.axe": "ǝxⱯ", - "gtceu.tool.class.butchery_knife": "ǝɟıuʞ ʎɹǝɥɔʇnᗺ", - "gtceu.tool.class.crowbar": "ɹɐqʍoɹƆ", - "gtceu.tool.class.drill": "ןןıɹᗡ", - "gtceu.tool.class.file": "ǝןıℲ", - "gtceu.tool.class.hammer": "ɹǝɯɯɐH", - "gtceu.tool.class.hoe": "ǝoH", - "gtceu.tool.class.knife": "ǝɟıuʞ", - "gtceu.tool.class.mallet": "ʇǝןןɐW ʇɟoS", - "gtceu.tool.class.mining_hammer": "ɹǝɯɯɐH buıuıW", - "gtceu.tool.class.mortar": "ɹɐʇɹoW", - "gtceu.tool.class.pickaxe": "ǝxɐʞɔıԀ", - "gtceu.tool.class.plunger": "ɹǝbunןԀ", - "gtceu.tool.class.rolling_pin": "uıԀ buıןןoᴚ", - "gtceu.tool.class.saw": "ʍɐS", - "gtceu.tool.class.screwdriver": "ɹǝʌıɹpʍǝɹɔS", - "gtceu.tool.class.scythe": "ǝɥʇʎɔS", - "gtceu.tool.class.shears": "sɹɐǝɥS", - "gtceu.tool.class.shovel": "ןǝʌoɥS", - "gtceu.tool.class.spade": "ǝpɐdS", - "gtceu.tool.class.sword": "pɹoʍS", - "gtceu.tool.class.wire_cutter": "ɹǝʇʇnƆ ǝɹıM", - "gtceu.tool.class.wrench": "ɥɔuǝɹM", - "gtceu.tool_action.crowbar": "sɹǝʌoƆ ǝʌoɯǝɹ oʇ ɹɐqʍoɹƆ ǝs∩8§", - "gtceu.tool_action.hammer": "spunoS ǝןɟɟnɯ oʇ ɹǝɯɯɐH pɹɐH ǝs∩8§", - "gtceu.tool_action.screwdriver.access_covers": "sɹǝʌoƆ ssǝɔɔɐ oʇ ɹǝʌıɹpʍǝɹɔS ǝs∩8§", - "gtceu.tool_action.screwdriver.auto_collapse": "buısdɐןןoɔ ɯǝʇI ǝןbboʇ oʇ ɹǝʌıɹpʍǝɹɔS ǝs∩8§", - "gtceu.tool_action.screwdriver.auto_output": "ʇndʇnO-oʇnⱯ ǝןbboʇ oʇ ɹǝʌıɹpʍǝɹɔS ǝs∩8§", - "gtceu.tool_action.screwdriver.auto_output_covers": "sɹǝʌoƆ ssǝɔɔɐ ɹo ǝpıS ʇndʇnO ɯoɹɟ ʇnduI ʍoןןⱯ oʇ ɹǝʌıɹpʍǝɹɔS ǝs∩8§", - "gtceu.tool_action.screwdriver.toggle_mode": "sǝpoW ǝןbboʇ oʇ ɹǝʌıɹpʍǝɹɔS ǝs∩8§", - "gtceu.tool_action.screwdriver.toggle_mode_covers": "sɹǝʌoƆ ssǝɔɔɐ ɹo sǝpoW ǝןbboʇ oʇ ɹǝʌıɹpʍǝɹɔS ǝs∩8§", - "gtceu.tool_action.show_tooltips": "oɟuI ןoo⟘ ʍoɥs oʇ ⟘ℲIHS pןoH", - "gtceu.tool_action.soft_mallet.reset": "buıʞɹoM ǝןbboʇ oʇ ʇǝןןɐW ʇɟoS ǝs∩8§", - "gtceu.tool_action.soft_mallet.toggle_mode": "sǝpoW ǝןbboʇ oʇ ʇǝןןɐW ʇɟoS ǝs∩8§", - "gtceu.tool_action.tape": "sɯǝןqoɹԀ ǝɔuɐuǝʇuıɐW xıɟ oʇ ǝdɐ⟘ ǝs∩8§", - "gtceu.tool_action.wire_cutter.connect": "suoıʇɔǝuuoƆ ʇǝs oʇ sɹǝʇʇnƆ ǝɹıM ǝs∩8§", - "gtceu.tool_action.wrench.connect": "suoıʇɔǝuuoƆ ʞɔoןq oʇ ʞɐǝus 'suoıʇɔǝuuoƆ ʇǝs oʇ ɥɔuǝɹM ǝs∩8§", - "gtceu.tool_action.wrench.set_facing": "buıɔɐℲ ʇǝs oʇ ɥɔuǝɹM ǝs∩8§", - "gtceu.tooltip.fluid_pipe_hold_shift": "oɟuI ʇuǝɯuıɐʇuoƆ pınןℲ ʍoɥs oʇ ⟘ℲIHS pןoHㄥ§", - "gtceu.tooltip.hold_ctrl": "oɟuı ǝɹoɯ ɹoɟ Ꞁᴚ⟘Ɔ pןoHㄥ§", - "gtceu.tooltip.hold_shift": "oɟuı ǝɹoɯ ɹoɟ ⟘ℲIHS pןoHㄥ§", "gtceu.tooltip.potion.each": "ɹ§buıuǝddɐɥ ɟo ǝɔuɐɥɔㄥ§ %s%% ɹ§ɐ ɥʇıʍ sʞɔıʇㄥ§ %s ɹ§ɹoɟㄥ§ %s %s", "gtceu.tooltip.potion.header": ":sʇɔǝɟɟǝ suıɐʇuoƆ9§", "gtceu.tooltip.proxy_bind": "%s %s %s ʇɐ ɹǝɟɟnᗺ uɹǝʇʇɐԀ ɐ oʇ buıpuıᗺɟ§", "gtceu.tooltip.status.trinary.false": "ǝsןɐℲ", "gtceu.tooltip.status.trinary.true": "ǝnɹ⟘", "gtceu.tooltip.status.trinary.unknown": "uʍouʞu∩", - "gtceu.tooltip.tool_fluid_hold_shift": "oɟuI ןoo⟘ puɐ ʇuǝɯuıɐʇuoƆ pınןℲ ʍoɥs oʇ ⟘ℲIHS pןoHㄥ§", "gtceu.top.allow_output_input": "ʇnduI ʍoןןⱯ", "gtceu.top.auto_output": "ʇndʇnO oʇnⱯ", "gtceu.top.buffer_bound_pos": "%s :Z '%s :ʎ '%s :X - o⟘ punoᗺ", @@ -3641,6 +3142,30 @@ "gui.gtceu.share_tank.title": "ʎɹoʇuǝʌuI ʞuɐ⟘ pǝɹɐɥS", "gui.widget.incrementButton.default_tooltip": "ʇunoɯɐ ǝɥʇ ǝbuɐɥɔ oʇ ɥʇoq ɹo ןɹʇƆ 'ʇɟıɥS pןoH", "gui.widget.recipeProgressWidget.default_tooltip": "sǝdıɔǝᴚ ʍoɥS", + "item.clipboard.tooltip": "ǝʌoɯǝɹ oʇ ʞɔıןƆ-ʇɥbıᴚ-ʇɟıɥS puɐ 'ǝɔɐןd oʇ ןןɐM uo ʞɔıןɔ-ʇɥbıᴚ ˙)ʇuǝɯnɹʇsuI buıʇıɹʍ ʎuɐ ʇnoɥʇıʍ( uo uǝʇʇıɹʍ ǝq uɐƆ", + "item.cover.digital.mode.energy.disabled": "ǝpoW ʎbɹǝuƎ ǝןqɐuǝ oʇ ʞɔıןƆ", + "item.cover.digital.mode.energy.enabled": "pǝןqɐuǝ ǝpoW ʎbɹǝuƎ", + "item.cover.digital.mode.fluid.disabled": "ǝpoW pınןℲ ǝןqɐuǝ oʇ ʞɔıןƆ", + "item.cover.digital.mode.fluid.enabled": "pǝןqɐuǝ ǝpoW pınןℲ", + "item.cover.digital.mode.item.disabled": "ǝpoW ɯǝʇI ǝןqɐuǝ oʇ ʞɔıןƆ", + "item.cover.digital.mode.item.enabled": "pǝןqɐuǝ ǝpoW ɯǝʇI", + "item.cover.digital.mode.machine.disabled": "ǝpoW ǝuıɥɔɐW ǝןqɐuǝ oʇ ʞɔıןƆ", + "item.cover.digital.mode.machine.enabled": "pǝןqɐuǝ ǝpoW ǝuıɥɔɐW", + "item.cover.digital.mode.proxy.disabled": "ǝpoW ʎxoɹԀ ǝןqɐuǝ oʇ ʞɔıןƆ", + "item.cover.digital.mode.proxy.enabled": "pǝןqɐuǝ ǝpoW ʎxoɹԀ", + "item.cover.digital.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ㄥ§ɹoʇıuoW ןɐɹʇuǝƆɟ§ ǝɥʇ oʇ ㄥ§sǝןqɐƆ ɹǝʍoԀɟ§ ɹǝʌo sǝuıɥɔɐɯ sʇɔǝuuoƆ", + "item.cover.digital.wireless.tooltip.0": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ㄥ§ɹoʇıuoW ןɐɹʇuǝƆɟ§ ǝɥʇ oʇ sǝuıɥɔɐɯ sʇɔǝuuoɔ ㄥ§ʎןssǝןǝɹıMɟ§", + "item.cover.digital.wireless.tooltip.1": "˙ʇı oʇ puıq ʎןǝʇoɯǝɹ oʇ ㄥ§ɹoʇıuoW ןɐɹʇuǝƆɟ§ ǝɥʇ uo ㄥ§ʞɔıןƆ ʇɥbıᴚɟ§", + "item.cover.digital.wireless.tooltip.2": "˙buıpuıq ʇuǝɹɹnɔ ǝɥʇ ǝʌoɯǝɹ oʇ ㄥ§ʞɔıןƆ ʇɥbıᴚ ʞɐǝuSɟ§", + "item.cover.digital.wireless.tooltip.3": "%sɟ§ :buıpuıᗺɐ§", + "item.crushed.tooltip.purify": "ǝɹO pǝıɟıɹnԀ ʇǝb oʇ uoɹpןnɐƆ ɐ ʞɔıןɔ ʇɥbıᴚ", + "item.dust.tooltip.purify": "ʇsnᗡ uɐǝןɔ ʇǝb oʇ uoɹpןnɐƆ ɐ ʞɔıןɔ ʇɥbıᴚ", + "item.electric.discharge_mode.disabled": "pǝןqɐsıᗡ ǝpoW ǝbɹɐɥɔsıᗡǝ§", + "item.electric.discharge_mode.enabled": "pǝןqɐuƎ ǝpoW ǝbɹɐɥɔsıᗡǝ§", + "item.electric.discharge_mode.tooltip": "ǝpoɯ ǝbɹɐɥɔsıp ǝןbboʇ oʇ buıʞɐǝus ǝןıɥʍ ǝs∩", + "item.generic.electric_item.stored": ")%s( ∩Ǝ %d/%d", + "item.generic.electric_item.tooltip": "%s ɹǝı⟘ - ∩Ǝ %d/%d", + "item.generic.fluid_container.tooltip": "%s Ꞁ%d/%d", "item.glass_lens": ")ǝʇıɥM( suǝꞀ ssɐן⅁", "item.gtceu.activity_detector_cover": "ɹoʇɔǝʇǝᗡ ʎʇıʌıʇɔⱯ", "item.gtceu.activity_detector_cover.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ǝuoʇspǝᴚ sɐ ㄥ§snʇɐʇS ʎʇıʌıʇɔⱯɟ§ ʇno sǝʌı⅁ㄥ§", @@ -4421,97 +3946,45 @@ "item.gtceu.tool.aoe.columns": "suɯnןoƆ", "item.gtceu.tool.aoe.layers": "sɹǝʎɐꞀ", "item.gtceu.tool.aoe.rows": "sʍoᴚ", - "item.gtceu.tool.axe": "ǝxⱯ %s", - "item.gtceu.tool.behavior.aoe_mining": "%sx%sx%sɟ§ :ʇɔǝɟɟƎ-ɟo-ɐǝɹⱯϛ§", - "item.gtceu.tool.behavior.block_rotation": "sʞɔoןᗺ sǝʇɐʇoᴚɟ§ :ɔıuɐɥɔǝWᄅ§", - "item.gtceu.tool.behavior.crop_harvesting": "sdoɹƆ sʇsǝʌɹɐHɟ§ :ɹǝʇsǝʌɹɐHɐ§", - "item.gtceu.tool.behavior.damage_boost": "%s ʇsuıɐbɐ ǝbɐɯɐp ɐɹʇxƎɟ§ :ʇsooᗺ ǝbɐɯɐᗡㄣ§", - "item.gtceu.tool.behavior.grass_path": "sɥʇɐԀ ssɐɹ⅁ sǝʇɐǝɹƆɟ§ :ɹǝdɐɔspuɐꞀǝ§", - "item.gtceu.tool.behavior.ground_tilling": "punoɹ⅁ sןןı⟘ɟ§ :ɹǝɯɹɐℲǝ§", - "item.gtceu.tool.behavior.plunger": "spınןℲ suıɐɹᗡɟ§ :ɹǝqɯnןԀ6§", - "item.gtceu.tool.behavior.rail_rotation": "sןıɐᴚ sǝʇɐʇoᴚɟ§ :ɹǝǝuıbuƎ pɐoɹןıɐᴚǝ§", - "item.gtceu.tool.behavior.relocate_mining": "sdoɹᗡ qoW puɐ sʞɔoןᗺ pǝuıW sǝʇɐɔoןǝᴚɟ§ :ɔıʇǝubɐWᄅ§", - "item.gtceu.tool.behavior.remove_wax": "xɐM sǝʌoɯǝᴚɟ§ :ɹǝuɐǝןƆ9§", - "item.gtceu.tool.behavior.scrape": "uoıʇɐpıxO sǝʌoɯǝᴚɟ§ :ɹǝɥsıןoԀq§", - "item.gtceu.tool.behavior.shield_disable": "spןǝıɥS sǝןqɐsıᗡɟ§ :ǝʇnɹᗺɔ§", - "item.gtceu.tool.behavior.silk_ice": "ǝɔI sʇsǝʌɹɐH ʞןıSɟ§ :ɹǝʇʇnƆ ǝɔIq§", - "item.gtceu.tool.behavior.strip_log": "sboꞀ sdıɹʇSɟ§ :uɐsıʇɹⱯϛ§", - "item.gtceu.tool.behavior.torch_place": "ʞɔıןƆ-ʇɥbıᴚ uo sǝɥɔɹo⟘ sǝɔɐןԀɟ§ :ɹǝʞunןǝdSǝ§", - "item.gtceu.tool.behavior.tree_felling": "buıןןǝℲ ǝǝɹ⟘ɟ§ :ʞɔɐظɹǝqɯnꞀㄣ§", - "item.gtceu.tool.butchery_knife": "ǝɟıuʞ ʎɹǝɥɔʇnᗺ %s", - "item.gtceu.tool.butchery_knife.tooltip": "ǝʇɐᴚ ʞɔɐʇʇⱯ ʍoןs ɐ sɐH8§", - "item.gtceu.tool.buzzsaw": ")ΛꞀ( ʍɐszznᗺ %s", - "item.gtceu.tool.buzzsaw.tooltip": "sʞɔoןᗺ buıʇsǝʌɹɐɥ ɹoɟ ǝןqɐʇıns ʇoN8§", - "item.gtceu.tool.crowbar": "ɹɐqʍoɹƆ %s", - "item.gtceu.tool.crowbar.tooltip": "sɹǝʌoƆ sʇunoɯsıᗡ8§", - "item.gtceu.tool.ev_drill": ")ΛƎ( ןןıɹᗡ %s", - "item.gtceu.tool.file": "ǝןıℲ %s", - "item.gtceu.tool.hammer": "ɹǝɯɯɐH %s", - "item.gtceu.tool.hammer.tooltip": "ɯǝɥʇ buıʇsǝʌɹɐɥ uǝɥʍ sʞɔoןᗺ sǝɥsnɹƆ8§", - "item.gtceu.tool.harvest_level.0": "pooM8§", - "item.gtceu.tool.harvest_level.1": "ǝuoʇSㄥ§", - "item.gtceu.tool.harvest_level.2": "uoɹIɐ§", - "item.gtceu.tool.harvest_level.3": "puoɯɐıᗡq§", - "item.gtceu.tool.harvest_level.4": "ǝʇıɹǝɥʇǝNp§", - "item.gtceu.tool.harvest_level.5": "ɯnıuɐɹnᗡ6§", - "item.gtceu.tool.harvest_level.6": "ɯnıuoɹʇnǝNɔ§", - "item.gtceu.tool.hoe": "ǝoH %s", - "item.gtceu.tool.hv_chainsaw": ")ΛH( ʍɐsuıɐɥƆ %s", - "item.gtceu.tool.hv_drill": ")ΛH( ןןıɹᗡ %s", - "item.gtceu.tool.hv_wirecutter": ")ΛH( ɹǝʇʇnƆ ǝɹıM %s", - "item.gtceu.tool.hv_wrench": ")ΛH( ɥɔuǝɹM %s", - "item.gtceu.tool.hv_wrench.tooltip": "sǝuıɥɔɐW ǝןʇuɐɯsıp oʇ ʞɔıןɔ ʇɟǝן pןoH8§", - "item.gtceu.tool.iv_drill": ")ΛI( ןןıɹᗡ %s", - "item.gtceu.tool.iv_wirecutter": ")ΛI( ɹǝʇʇnƆ ǝɹıM %s", - "item.gtceu.tool.iv_wrench": ")ΛI( ɥɔuǝɹM %s", - "item.gtceu.tool.iv_wrench.tooltip": "sǝuıɥɔɐW ǝןʇuɐɯsıp oʇ ʞɔıןɔ ʇɟǝן pןoH8§", - "item.gtceu.tool.knife": "ǝɟıuʞ %s", + "item.gtceu.tool.axe": "ǝxⱯ", + "item.gtceu.tool.butchery_knife": "ǝɟıuʞ ʎɹǝɥɔʇnᗺ", + "item.gtceu.tool.buzzsaw": "ʍɐszznᗺ", + "item.gtceu.tool.crowbar": "ɹɐqʍoɹƆ", + "item.gtceu.tool.ev_drill": "ןןıɹᗡ ʌƎ", + "item.gtceu.tool.file": "ǝןıℲ", + "item.gtceu.tool.hammer": "ɹǝɯɯɐH", + "item.gtceu.tool.hoe": "ǝoH", + "item.gtceu.tool.hv_drill": "ןןıɹᗡ ʌH", + "item.gtceu.tool.hv_wirecutter": "ɹǝʇʇnɔǝɹıM ʌH", + "item.gtceu.tool.hv_wrench": "ɥɔuǝɹM ʌH", + "item.gtceu.tool.iv_drill": "ןןıɹᗡ ʌI", + "item.gtceu.tool.iv_wirecutter": "ɹǝʇʇnɔǝɹıM ʌI", + "item.gtceu.tool.iv_wrench": "ɥɔuǝɹM ʌI", + "item.gtceu.tool.knife": "ǝɟıuʞ", "item.gtceu.tool.lighter.platinum.tooltip": "ʇı uo pǝʌɐɹbuǝ sı ɹǝʇsɐW ʞuɐɹԀ uʍouʞ Ɐㄥ§", - "item.gtceu.tool.lv_chainsaw": ")ΛꞀ( ʍɐsuıɐɥƆ %s", - "item.gtceu.tool.lv_drill": ")ΛꞀ( ןןıɹᗡ %s", - "item.gtceu.tool.lv_screwdriver": ")ΛꞀ( ɹǝʌıɹpʍǝɹɔS %s", - "item.gtceu.tool.lv_screwdriver.tooltip": "sǝuıɥɔɐW puɐ sɹǝʌoƆ sʇsnظpⱯ8§", - "item.gtceu.tool.lv_wirecutter": ")ΛꞀ( ɹǝʇʇnƆ ǝɹıM %s", - "item.gtceu.tool.lv_wrench": ")ΛꞀ( ɥɔuǝɹM %s", - "item.gtceu.tool.lv_wrench.tooltip": "sǝuıɥɔɐW ǝןʇuɐɯsıp oʇ ʞɔıןɔ ʇɟǝן pןoH8§", - "item.gtceu.tool.mallet": "ʇǝןןɐW ʇɟoS %s", - "item.gtceu.tool.mallet.tooltip.0": "˙ǝdıɔǝᴚ ʇuǝɹɹnƆ ɹǝʇɟⱯ ǝuıɥɔɐW ǝsnɐԀ oʇ ʞɐǝuS8§", - "item.gtceu.tool.mallet.tooltip.1": "sǝuıɥɔɐW sʇɹɐʇS/sdoʇS8§", + "item.gtceu.tool.lv_chainsaw": "ʍɐsuıɐɥƆ ʌꞀ", + "item.gtceu.tool.lv_drill": "ןןıɹᗡ ʌꞀ", + "item.gtceu.tool.lv_screwdriver": "ɹǝʌıɹpʍǝɹɔS ʌꞀ", + "item.gtceu.tool.lv_wirecutter": "ɹǝʇʇnɔǝɹıM ʌꞀ", + "item.gtceu.tool.lv_wrench": "ɥɔuǝɹM ʌꞀ", + "item.gtceu.tool.mallet": "ʇǝןןɐW", "item.gtceu.tool.matchbox.tooltip": "ɹɐƆ ɐ ʇou sı sıɥ⟘ㄥ§", - "item.gtceu.tool.mining_hammer": "ɹǝɯɯɐH buıuıW %s", - "item.gtceu.tool.mining_hammer.tooltip": ")buıɥɔnoɹɔ ǝɹ,noʎ ssǝןun( ǝɔuo ʇɐ ɐǝɹɐ ǝbɹɐן ɐ sǝuıW8§", - "item.gtceu.tool.mortar": "ɹɐʇɹoW %s", - "item.gtceu.tool.mv_chainsaw": ")ΛW( ʍɐsuıɐɥƆ %s", - "item.gtceu.tool.mv_drill": ")ΛW( ןןıɹᗡ %s", - "item.gtceu.tool.pickaxe": "ǝxɐʞɔıԀ %s", - "item.gtceu.tool.plunger": "ɹǝbunןԀ %s", - "item.gtceu.tool.plunger.tooltip": "sǝuıɥɔɐW ɯoɹɟ spınןℲ sǝʌoɯǝᴚ8§", + "item.gtceu.tool.mining_hammer": "ɹǝɯɯɐH buıuıW", + "item.gtceu.tool.mortar": "ɹɐʇɹoW", + "item.gtceu.tool.mv_drill": "ןןıɹᗡ ʌW", + "item.gtceu.tool.pickaxe": "ǝxɐʞɔıԀ", + "item.gtceu.tool.plunger": "ɹǝbunןԀ", "item.gtceu.tool.replace_tool_head": "ʇı ǝɔɐןdǝɹ oʇ pɐǝH ןoo⟘ ʍǝu ɐ ɥʇıʍ ʇɟɐɹƆ", - "item.gtceu.tool.rolling_pin": "uıԀ buıןןoᴚ %s", - "item.gtceu.tool.saw": "ʍɐS %s", - "item.gtceu.tool.screwdriver": "ɹǝʌıɹpʍǝɹɔS %s", - "item.gtceu.tool.screwdriver.tooltip": "sǝuıɥɔɐW puɐ sɹǝʌoƆ sʇsnظpⱯ8§", - "item.gtceu.tool.scythe": "ǝɥʇʎɔS %s", - "item.gtceu.tool.scythe.tooltip": "ǝsuǝS ǝʞɐɯ ʇ,usǝop ǝɥʇʎɔS ɐ ǝsnɐɔǝᗺ8§", - "item.gtceu.tool.shears": "sɹɐǝɥS %s", - "item.gtceu.tool.shovel": "ןǝʌoɥS %s", - "item.gtceu.tool.spade": "ǝpɐdS %s", - "item.gtceu.tool.spade.tooltip": ")buıɥɔnoɹɔ ǝɹ,noʎ ssǝןun( ǝɔuo ʇɐ ɐǝɹɐ ǝbɹɐן ɐ sǝuıW8§", - "item.gtceu.tool.sword": "pɹoʍS %s", - "item.gtceu.tool.tooltip.attack_damage": "ǝbɐɯɐᗡ ʞɔɐʇʇⱯɔ§ %s", - "item.gtceu.tool.tooltip.attack_speed": "pǝǝdS ʞɔɐʇʇⱯ6§ %s", - "item.gtceu.tool.tooltip.crafting_uses": "sǝs∩ buıʇɟɐɹƆɐ§ %s", - "item.gtceu.tool.tooltip.general_uses": "ʎʇıןıqɐɹnᗡq§ %s", - "item.gtceu.tool.tooltip.harvest_level": "%s ןǝʌǝꞀ ʇsǝʌɹɐHǝ§", - "item.gtceu.tool.tooltip.harvest_level_extra": ")ɟ§%s(ɟ§ %s ןǝʌǝꞀ ʇsǝʌɹɐHǝ§", - "item.gtceu.tool.tooltip.max_uses": "ʎʇıןıqɐɹnᗡ ןɐʇo⟘ǝ§ %s", - "item.gtceu.tool.tooltip.mining_speed": "pǝǝdS buıuıWp§ %s", - "item.gtceu.tool.tooltip.repair_info": "oɟuI ɹıɐdǝᴚ ʍoɥs oʇ ⟘ℲIHS pןoH8§", - "item.gtceu.tool.tooltip.repair_material": "%sɐ§ɟ§ :ɥʇıʍ ɹıɐdǝᴚ8§", + "item.gtceu.tool.saw": "ʍɐS", + "item.gtceu.tool.screwdriver": "ɹǝʌıɹpʍǝɹɔS", + "item.gtceu.tool.scythe": "ǝɥʇʎɔS", + "item.gtceu.tool.shears": "sɹɐǝɥS", + "item.gtceu.tool.shovel": "ןǝʌoɥS", + "item.gtceu.tool.spade": "ǝpɐdS", + "item.gtceu.tool.sword": "pɹoʍS", "item.gtceu.tool.usable_as": "%sɟ§ :sɐ ǝןqɐs∩8§", - "item.gtceu.tool.wire_cutter": "ɹǝʇʇnƆ ǝɹıM %s", - "item.gtceu.tool.wrench": "ɥɔuǝɹM %s", - "item.gtceu.tool.wrench.tooltip": "sǝuıɥɔɐW ǝןʇuɐɯsıp oʇ ʞɔıןɔ ʇɟǝן pןoH8§", + "item.gtceu.tool.wire_cutter": "ɹǝʇʇnƆ ǝɹıM", + "item.gtceu.tool.wrench": "ɥɔuǝɹM", "item.gtceu.transistor": "ɹoʇsısuɐɹ⟘", "item.gtceu.transistor.tooltip": "ʇuǝuodɯoƆ ɔıuoɹʇɔǝןƎ ɔısɐᗺㄥ§", "item.gtceu.treated_wood_boat": "ʇɐoᗺ pooM pǝʇɐǝɹ⟘", @@ -4638,9 +4111,21 @@ "item.gtceu.zpm_solar_panel": "ןǝuɐԀ ɹɐןoS ǝןnpoW ʇuıoԀ oɹǝZ", "item.gtceu.zpm_voltage_coil": "ןıoƆ ǝbɐʇןoΛ ǝןnpoW ʇuıoԀ oɹǝZ", "item.gtceu.zpm_voltage_coil.tooltip": "ןıoƆ ɹǝdnS", + "item.int_circuit.configuration": "%d :uoıʇɐɹnbıɟuoƆ", "item.invalid.name": "ɯǝʇı pıןɐʌuI", + "item.liquid_fuel_jetpack.tooltip": "ʇsnɹɥ⟘ ɹoɟ sןǝnℲ ɹoʇɐɹǝuǝ⅁ uoıʇsnqɯoƆ sǝs∩", + "item.machine_configuration.mode": "%s ɹ§:ǝpoW uoıʇɐɹnbıɟuoƆɐ§", "item.netherrack_nether_quartz": "ǝɹO zʇɹɐnὉ ɹǝɥʇǝN", - "item.toggle.advanced.info.tooltip": ">uoıʇɐɹnbıɟuoɔ pǝɹoʇs ʍǝıʌ oʇ ʞɐǝuS<8§", + "item.plugin.proxy.tooltips.1": ")uǝǝɹɔs ǝɥʇ uı ǝpoɯ ʎxoɹd oʇ ʇsnظpɐ ǝsɐǝןԀ(", + "item.plugin.tooltips.1": "˙ʎʇıןɐuoıʇɔunɟ ǝɹoɯ ɹoɟ uǝǝɹɔs ǝɥʇ oʇ pǝppɐ ǝq uɐɔ suıbnןԀ", + "item.record.sus.tooltip": "dıɹᗡ s∩ buoɯⱯ - zuoǝꞀㄥ§", + "item.terminal.tooltip": "ʞɹoʍ poob ǝʞɐɯ sןooʇ dɹɐɥS", + "item.terminal.tooltip.creative": "ǝpoW ǝʌıʇɐǝɹƆq§", + "item.terminal.tooltip.hardware": "%d :ǝɹɐʍpɹɐHɐ§", + "item.tool.tooltip.durability": "%d / %dɐ§ :ʎʇıןıqɐɹnᗡɟ§", + "item.tool.tooltip.primary_material": "%sǝ§ :ןɐıɹǝʇɐWɟ§", + "item.tool.tooltip.rotor.efficiency": "%d%%6§ :ʎɔuǝıɔıɟɟƎ ǝuıqɹn⟘", + "item.tool.tooltip.rotor.power": "%d%%6§ :ɹǝʍoԀ ǝuıqɹn⟘", "itemGroup.gtceu.decoration": "sʞɔoןᗺ uoıʇɐɹoɔǝᗡ nƎƆɥɔǝ⟘bǝɹ⅁", "itemGroup.gtceu.item": "sɯǝʇI nƎƆɥɔǝ⟘bǝɹ⅁", "itemGroup.gtceu.machine": "sǝuıɥɔɐW nƎƆɥɔǝ⟘bǝɹ⅁", @@ -4785,7 +4270,7 @@ "material.gtceu.collagen": "uǝbɐןןoƆ", "material.gtceu.concrete": "ǝʇǝɹɔuoƆ", "material.gtceu.construction_foam": "ɯɐoℲ uoıʇɔnɹʇsuoƆ", - "material.gtceu.cooperite": "ǝʇıuopןǝɥS", + "material.gtceu.cooperite": "ǝʇıɹǝdooƆ", "material.gtceu.copernicium": "ɯnıɔıuɹǝdoƆ", "material.gtceu.copper": "ɹǝddoƆ", "material.gtceu.cracked_bauxite_slurry": "ʎɹɹnןS ǝʇıxnɐᗺ pǝʞɔɐɹƆ", @@ -4869,7 +4354,7 @@ "material.gtceu.formamide": "ǝpıɯɐɯɹoℲ", "material.gtceu.formic_acid": "pıɔⱯ ɔıɯɹoℲ", "material.gtceu.francium": "ɯnıɔuɐɹℲ", - "material.gtceu.fullers_earth": "ɥʇɹɐƎ s,ɹǝןןnℲ", + "material.gtceu.fullers_earth": "ɥʇɹɐƎ sɹǝןןnℲ", "material.gtceu.gadolinium": "ɯnıuıןopɐ⅁", "material.gtceu.galena": "ɐuǝןɐ⅁", "material.gtceu.gallium": "ɯnıןןɐ⅁", @@ -4904,7 +4389,7 @@ "material.gtceu.gypsum": "ɯnsdʎ⅁", "material.gtceu.hafnium": "ɯnıuɟɐH", "material.gtceu.hassium": "ɯnıssɐH", - "material.gtceu.hastelloy_c_276": "9ㄥᄅ-Ɔ ʎoןןǝʇsɐH", + "material.gtceu.hastelloy_c_276": "9ㄥᄅ Ɔ ʎoןןǝʇsɐH", "material.gtceu.hastelloy_x": "X ʎoןןǝʇsɐH", "material.gtceu.heavy_fuel": "ןǝnℲ ʎʌɐǝH", "material.gtceu.helium": "ɯnıןǝH", @@ -4912,17 +4397,17 @@ "material.gtceu.hematite": "ǝʇıʇɐɯǝH", "material.gtceu.high_octane_gasoline": "ǝuıןosɐ⅁ ǝuɐʇɔO ɥbıH", "material.gtceu.holmium": "ɯnıɯןoH", - "material.gtceu.hsla_steel": "ןǝǝʇS ⱯꞀSH", - "material.gtceu.hsse": "Ǝ-SSH", - "material.gtceu.hssg": "⅁-SSH", - "material.gtceu.hsss": "S-SSH", - "material.gtceu.hydro_cracked_butadiene": "ǝuǝıpɐʇnᗺ pǝʞɔɐɹƆ-oɹpʎH", - "material.gtceu.hydro_cracked_butane": "ǝuɐʇnᗺ pǝʞɔɐɹƆ-oɹpʎH", - "material.gtceu.hydro_cracked_butene": "ǝuǝʇnᗺ pǝʞɔɐɹƆ-oɹpʎH", - "material.gtceu.hydro_cracked_ethane": "ǝuɐɥʇƎ pǝʞɔɐɹƆ-oɹpʎH", - "material.gtceu.hydro_cracked_ethylene": "ǝuǝןʎɥʇƎ pǝʞɔɐɹƆ-oɹpʎH", - "material.gtceu.hydro_cracked_propane": "ǝuɐdoɹԀ pǝʞɔɐɹƆ-oɹpʎH", - "material.gtceu.hydro_cracked_propene": "ǝuǝdoɹԀ pǝʞɔɐɹƆ-oɹpʎH", + "material.gtceu.hsla_steel": "ןǝǝʇS ɐןsH", + "material.gtceu.hsse": "ǝssH", + "material.gtceu.hssg": "bssH", + "material.gtceu.hsss": "sssH", + "material.gtceu.hydro_cracked_butadiene": "ǝuǝıpɐʇnᗺ pǝʞɔɐɹƆ oɹpʎH", + "material.gtceu.hydro_cracked_butane": "ǝuɐʇnᗺ pǝʞɔɐɹƆ oɹpʎH", + "material.gtceu.hydro_cracked_butene": "ǝuǝʇnᗺ pǝʞɔɐɹƆ oɹpʎH", + "material.gtceu.hydro_cracked_ethane": "ǝuɐɥʇƎ pǝʞɔɐɹƆ oɹpʎH", + "material.gtceu.hydro_cracked_ethylene": "ǝuǝןʎɥʇƎ pǝʞɔɐɹƆ oɹpʎH", + "material.gtceu.hydro_cracked_propane": "ǝuɐdoɹԀ pǝʞɔɐɹƆ oɹpʎH", + "material.gtceu.hydro_cracked_propene": "ǝuǝdoɹԀ pǝʞɔɐɹƆ oɹpʎH", "material.gtceu.hydrochloric_acid": "pıɔⱯ ɔıɹoןɥɔoɹpʎH", "material.gtceu.hydrofluoric_acid": "pıɔⱯ ɔıɹonןɟoɹpʎH", "material.gtceu.hydrogen": "uǝboɹpʎH", @@ -4935,7 +4420,7 @@ "material.gtceu.ilmenite_slag": "bɐןS ǝʇıuǝɯןI", "material.gtceu.impure_enriched_naquadah_solution": "uoıʇnןoS ɥɐpɐnbɐN pǝɥɔıɹuƎ ǝɹndɯI", "material.gtceu.impure_naquadria_solution": "uoıʇnןoS ɐıɹpɐnbɐN ǝɹndɯI", - "material.gtceu.incoloy_ma_956": "9ϛ6-ⱯW ʎoןoɔuI", + "material.gtceu.incoloy_ma_956": "9ϛ6 ɐW ʎoןoɔuI", "material.gtceu.indium": "ɯnıpuI", "material.gtceu.indium_concentrate": "ǝʇɐɹʇuǝɔuoƆ ɯnıpuI", "material.gtceu.indium_gallium_phosphide": "ǝpıɥdsoɥԀ ɯnıןןɐ⅁ ɯnıpuI", @@ -4948,8 +4433,8 @@ "material.gtceu.iridium_chloride": "ǝpıɹoןɥƆ ɯnıpıɹI", "material.gtceu.iridium_metal_residue": "ǝnpısǝᴚ ןɐʇǝW ɯnıpıɹI", "material.gtceu.iron": "uoɹI", - "material.gtceu.iron_ii_chloride": "ǝpıɹoןɥƆ II uoɹI", - "material.gtceu.iron_iii_chloride": "ǝpıɹoןɥƆ III uoɹI", + "material.gtceu.iron_ii_chloride": "ǝpıɹoןɥƆ ıI uoɹI", + "material.gtceu.iron_iii_chloride": "ǝpıɹoןɥƆ ııI uoɹI", "material.gtceu.isoprene": "ǝuǝɹdosI", "material.gtceu.kanthal": "ןɐɥʇuɐʞ", "material.gtceu.krypton": "uoʇdʎɹʞ", @@ -4966,14 +4451,14 @@ "material.gtceu.light_blue_dye": "ǝʎᗡ ǝnןᗺ ʇɥbıꞀ", "material.gtceu.light_fuel": "ןǝnℲ ʇɥbıꞀ", "material.gtceu.light_gray_dye": "ǝʎᗡ ʎɐɹ⅁ ʇɥbıꞀ", - "material.gtceu.lightly_hydro_cracked_gas": "sɐ⅁ pǝʞɔɐɹƆ-oɹpʎH ʎןʇɥbıꞀ", - "material.gtceu.lightly_hydro_cracked_heavy_fuel": "ןǝnℲ ʎʌɐǝH pǝʞɔɐɹƆ-oɹpʎH ʎןʇɥbıꞀ", - "material.gtceu.lightly_hydro_cracked_light_fuel": "ןǝnℲ ʇɥbıꞀ pǝʞɔɐɹƆ-oɹpʎH ʎןʇɥbıꞀ", - "material.gtceu.lightly_hydro_cracked_naphtha": "ɐɥʇɥdɐN pǝʞɔɐɹƆ-oɹpʎH ʎןʇɥbıꞀ", - "material.gtceu.lightly_steam_cracked_gas": "sɐ⅁ pǝʞɔɐɹƆ-ɯɐǝʇS ʎןʇɥbıꞀ", - "material.gtceu.lightly_steam_cracked_heavy_fuel": "ןǝnℲ ʎʌɐǝH pǝʞɔɐɹƆ-ɯɐǝʇS ʎןʇɥbıꞀ", - "material.gtceu.lightly_steam_cracked_light_fuel": "ןǝnℲ ʇɥbıꞀ pǝʞɔɐɹƆ-ɯɐǝʇS ʎןʇɥbıꞀ", - "material.gtceu.lightly_steam_cracked_naphtha": "ɐɥʇɥdɐN pǝʞɔɐɹƆ-ɯɐǝʇS ʎןʇɥbıꞀ", + "material.gtceu.lightly_hydro_cracked_gas": "sɐ⅁ pǝʞɔɐɹƆ oɹpʎH ʎןʇɥbıꞀ", + "material.gtceu.lightly_hydro_cracked_heavy_fuel": "ןǝnℲ ʎʌɐǝH pǝʞɔɐɹƆ oɹpʎH ʎןʇɥbıꞀ", + "material.gtceu.lightly_hydro_cracked_light_fuel": "ןǝnℲ ʇɥbıꞀ pǝʞɔɐɹƆ oɹpʎH ʎןʇɥbıꞀ", + "material.gtceu.lightly_hydro_cracked_naphtha": "ɐɥʇɥdɐN pǝʞɔɐɹƆ oɹpʎH ʎןʇɥbıꞀ", + "material.gtceu.lightly_steam_cracked_gas": "sɐ⅁ pǝʞɔɐɹƆ ɯɐǝʇS ʎןʇɥbıꞀ", + "material.gtceu.lightly_steam_cracked_heavy_fuel": "ןǝnℲ ʎʌɐǝH pǝʞɔɐɹƆ ɯɐǝʇS ʎןʇɥbıꞀ", + "material.gtceu.lightly_steam_cracked_light_fuel": "ןǝnℲ ʇɥbıꞀ pǝʞɔɐɹƆ ɯɐǝʇS ʎןʇɥbıꞀ", + "material.gtceu.lightly_steam_cracked_naphtha": "ɐɥʇɥdɐN pǝʞɔɐɹƆ ɯɐǝʇS ʎןʇɥbıꞀ", "material.gtceu.lime_dye": "ǝʎᗡ ǝɯıꞀ", "material.gtceu.liquid_air": "ɹıⱯ pınbıꞀ", "material.gtceu.liquid_ender_air": "ɹıⱯ ɹǝpuƎ pınbıꞀ", @@ -4981,7 +4466,7 @@ "material.gtceu.lithium": "ɯnıɥʇıꞀ", "material.gtceu.lithium_chloride": "ǝpıɹoןɥƆ ɯnıɥʇıꞀ", "material.gtceu.livermorium": "ɯnıɹoɯɹǝʌıꞀ", - "material.gtceu.lpg": "⅁ԀꞀ", + "material.gtceu.lpg": "bdꞀ", "material.gtceu.lubricant": "ʇuɐɔıɹqnꞀ", "material.gtceu.lutetium": "ɯnıʇǝʇnꞀ", "material.gtceu.magenta_dye": "ǝʎᗡ ɐʇuǝbɐW", @@ -5061,9 +4546,9 @@ "material.gtceu.octane": "ǝuɐʇɔO", "material.gtceu.oganesson": "uossǝuɐbO", "material.gtceu.oil": "ןıO", - "material.gtceu.oil_heavy": "ןıO ʎʌɐǝH", - "material.gtceu.oil_light": "ןıO ʇɥbıꞀ", - "material.gtceu.oil_medium": "ןıO ʍɐᴚ", + "material.gtceu.oil_heavy": "ʎʌɐǝH ןıO", + "material.gtceu.oil_light": "ʇɥbıꞀ ןıO", + "material.gtceu.oil_medium": "ɯnıpǝW ןıO", "material.gtceu.oilsands": "spuɐsןıO", "material.gtceu.olivine": "ǝuıʌıןO", "material.gtceu.opal": "ןɐdO", @@ -5076,7 +4561,7 @@ "material.gtceu.palladium_raw": "ʍɐᴚ ɯnıpɐןןɐԀ", "material.gtceu.paper": "ɹǝdɐԀ", "material.gtceu.paracetamol": "ןoɯɐʇǝɔɐɹɐԀ", - "material.gtceu.pcb_coolant": "ʇuɐןooƆ ᗺƆԀ", + "material.gtceu.pcb_coolant": "ʇuɐןooƆ qɔԀ", "material.gtceu.pentlandite": "ǝʇıpuɐןʇuǝԀ", "material.gtceu.perlite": "ǝʇıןɹǝԀ", "material.gtceu.phenol": "ןouǝɥԀ", @@ -5157,7 +4642,7 @@ "material.gtceu.rocket_fuel": "ןǝnℲ ʇǝʞɔoᴚ", "material.gtceu.roentgenium": "ɯnıuǝbʇuǝoᴚ", "material.gtceu.rose_gold": "pןo⅁ ǝsoᴚ", - "material.gtceu.rtm_alloy": "ʎoןןⱯ W⟘ᴚ", + "material.gtceu.rtm_alloy": "ʎoןןⱯ ɯʇᴚ", "material.gtceu.rubber": "ɹǝqqnᴚ", "material.gtceu.rubidium": "ɯnıpıqnᴚ", "material.gtceu.ruby": "ʎqnᴚ", @@ -5181,14 +4666,14 @@ "material.gtceu.seaborgium": "ɯnıbɹoqɐǝS", "material.gtceu.seed_oil": "ןıO pǝǝS", "material.gtceu.selenium": "ɯnıuǝןǝS", - "material.gtceu.severely_hydro_cracked_gas": "sɐ⅁ pǝʞɔɐɹƆ-oɹpʎH ʎןǝɹǝʌǝS", - "material.gtceu.severely_hydro_cracked_heavy_fuel": "ןǝnℲ ʎʌɐǝH pǝʞɔɐɹƆ-oɹpʎH ʎןǝɹǝʌǝS", - "material.gtceu.severely_hydro_cracked_light_fuel": "ןǝnℲ ʇɥbıꞀ pǝʞɔɐɹƆ-oɹpʎH ʎןǝɹǝʌǝS", - "material.gtceu.severely_hydro_cracked_naphtha": "ɐɥʇɥdɐN pǝʞɔɐɹƆ-oɹpʎH ʎןǝɹǝʌǝS", - "material.gtceu.severely_steam_cracked_gas": "sɐ⅁ pǝʞɔɐɹƆ-ɯɐǝʇS ʎןǝɹǝʌǝS", - "material.gtceu.severely_steam_cracked_heavy_fuel": "ןǝnℲ ʎʌɐǝH pǝʞɔɐɹƆ-ɯɐǝʇS ʎןǝɹǝʌǝS", - "material.gtceu.severely_steam_cracked_light_fuel": "ןǝnℲ ʇɥbıꞀ pǝʞɔɐɹƆ-ɯɐǝʇS ʎןǝɹǝʌǝS", - "material.gtceu.severely_steam_cracked_naphtha": "ɐɥʇɥdɐN pǝʞɔɐɹƆ-ɯɐǝʇS ʎןǝɹǝʌǝS", + "material.gtceu.severely_hydro_cracked_gas": "sɐ⅁ pǝʞɔɐɹƆ oɹpʎH ʎןǝɹǝʌǝS", + "material.gtceu.severely_hydro_cracked_heavy_fuel": "ןǝnℲ ʎʌɐǝH pǝʞɔɐɹƆ oɹpʎH ʎןǝɹǝʌǝS", + "material.gtceu.severely_hydro_cracked_light_fuel": "ןǝnℲ ʇɥbıꞀ pǝʞɔɐɹƆ oɹpʎH ʎןǝɹǝʌǝS", + "material.gtceu.severely_hydro_cracked_naphtha": "ɐɥʇɥdɐN pǝʞɔɐɹƆ oɹpʎH ʎןǝɹǝʌǝS", + "material.gtceu.severely_steam_cracked_gas": "sɐ⅁ pǝʞɔɐɹƆ ɯɐǝʇS ʎןǝɹǝʌǝS", + "material.gtceu.severely_steam_cracked_heavy_fuel": "ןǝnℲ ʎʌɐǝH pǝʞɔɐɹƆ ɯɐǝʇS ʎןǝɹǝʌǝS", + "material.gtceu.severely_steam_cracked_light_fuel": "ןǝnℲ ʇɥbıꞀ pǝʞɔɐɹƆ ɯɐǝʇS ʎןǝɹǝʌǝS", + "material.gtceu.severely_steam_cracked_naphtha": "ɐɥʇɥdɐN pǝʞɔɐɹƆ ɯɐǝʇS ʎןǝɹǝʌǝS", "material.gtceu.silicon": "uoɔıןıS", "material.gtceu.silicon_dioxide": "ǝpıxoıᗡ uoɔıןıS", "material.gtceu.silicone_rubber": "ɹǝqqnᴚ ǝuoɔıןıS", @@ -5210,15 +4695,15 @@ "material.gtceu.spodumene": "ǝuǝɯnpodS", "material.gtceu.stainless_steel": "ןǝǝʇS ssǝןuıɐʇS", "material.gtceu.steam": "ɯɐǝʇS", - "material.gtceu.steam_cracked_butadiene": "ǝuǝıpɐʇnᗺ pǝʞɔɐɹƆ-ɯɐǝʇS", - "material.gtceu.steam_cracked_butane": "ǝuɐʇnᗺ pǝʞɔɐɹƆ-ɯɐǝʇS", - "material.gtceu.steam_cracked_butene": "ǝuǝʇnᗺ pǝʞɔɐɹƆ-ɯɐǝʇS", - "material.gtceu.steam_cracked_ethane": "ǝuɐɥʇƎ pǝʞɔɐɹƆ-ɯɐǝʇS", - "material.gtceu.steam_cracked_ethylene": "ǝuǝןʎɥʇƎ pǝʞɔɐɹƆ-ɯɐǝʇS", - "material.gtceu.steam_cracked_propane": "ǝuɐdoɹԀ pǝʞɔɐɹƆ-ɯɐǝʇS", - "material.gtceu.steam_cracked_propene": "ǝuǝdoɹԀ pǝʞɔɐɹƆ-ɯɐǝʇS", + "material.gtceu.steam_cracked_butadiene": "ǝuǝıpɐʇnᗺ pǝʞɔɐɹƆ ɯɐǝʇS", + "material.gtceu.steam_cracked_butane": "ǝuɐʇnᗺ pǝʞɔɐɹƆ ɯɐǝʇS", + "material.gtceu.steam_cracked_butene": "ǝuǝʇnᗺ pǝʞɔɐɹƆ ɯɐǝʇS", + "material.gtceu.steam_cracked_ethane": "ǝuɐɥʇƎ pǝʞɔɐɹƆ ɯɐǝʇS", + "material.gtceu.steam_cracked_ethylene": "ǝuǝןʎɥʇƎ pǝʞɔɐɹƆ ɯɐǝʇS", + "material.gtceu.steam_cracked_propane": "ǝuɐdoɹԀ pǝʞɔɐɹƆ ɯɐǝʇS", + "material.gtceu.steam_cracked_propene": "ǝuǝdoɹԀ pǝʞɔɐɹƆ ɯɐǝʇS", "material.gtceu.steel": "ןǝǝʇS", - "material.gtceu.stellite_100": "00Ɩ-ǝʇıןןǝʇS", + "material.gtceu.stellite_100": "00Ɩ ǝʇıןןǝʇS", "material.gtceu.sterilized_growth_medium": "ɯnıpǝW ɥʇʍoɹ⅁ pǝzıןıɹǝʇS", "material.gtceu.sterling_silver": "ɹǝʌןıS buıןɹǝʇS", "material.gtceu.stibnite": "ǝʇıuqıʇS", @@ -5270,7 +4755,7 @@ "material.gtceu.tungstate": "ǝʇɐʇsbun⟘", "material.gtceu.tungsten": "uǝʇsbun⟘", "material.gtceu.tungsten_carbide": "ǝpıqɹɐƆ uǝʇsbun⟘", - "material.gtceu.tungsten_steel": "ןǝǝʇsuǝʇsbun⟘", + "material.gtceu.tungsten_steel": "ןǝǝʇS uǝʇsbun⟘", "material.gtceu.tungstic_acid": "pıɔⱯ ɔıʇsbun⟘", "material.gtceu.ultimet": "ʇǝɯıʇן∩", "material.gtceu.uraninite": "ǝʇıuıuɐɹ∩", @@ -5279,7 +4764,7 @@ "material.gtceu.uranium_hexafluoride": "ǝpıɹonןɟɐxǝH ɯnıuɐɹ∩", "material.gtceu.uranium_rhodium_dinaquadide": "ǝpıpɐnbɐuıᗡ ɯnıpoɥᴚ ɯnıuɐɹ∩", "material.gtceu.uranium_triplatinum": "ɯnuıʇɐןdıɹ⟘ ɯnıuɐɹ∩", - "material.gtceu.uu_matter": "ɹǝʇʇɐW-∩∩", + "material.gtceu.uu_matter": "ɹǝʇʇɐW n∩", "material.gtceu.uvarovite": "ǝʇıʌoɹɐʌ∩", "material.gtceu.vanadium": "ɯnıpɐuɐΛ", "material.gtceu.vanadium_gallium": "ɯnıןןɐ⅁ ɯnıpɐuɐΛ", @@ -5306,103 +4791,13 @@ "material.gtceu.yttrium": "ɯnıɹʇʇʎ", "material.gtceu.yttrium_barium_cuprate": "ǝʇɐɹdnƆ ɯnıɹɐᗺ ɯnıɹʇʇʎ", "material.gtceu.zeolite": "ǝʇıןoǝZ", - "material.gtceu.zeron_100": "00Ɩ-uoɹǝZ", + "material.gtceu.zeron_100": "00Ɩ uoɹǝZ", "material.gtceu.zinc": "ɔuıZ", "material.gtceu.zinc_sulfide": "ǝpıɟןnS ɔuıZ", "material.gtceu.zincite": "ǝʇıɔuıZ", "material.gtceu.zirconium": "ɯnıuoɔɹıZ", "message.gtceu.new_veins.amount": "¡suıǝʌ ʍǝu %d pǝʇɔǝdsoɹԀ", "message.gtceu.new_veins.name": "¡%s pǝʇɔǝdsoɹԀ", - "armor.gtceu.energy_share.disable": "pǝןqɐsıp buıbɹɐɥɔ sʇǝbpɐ⅁ :ʎןddnS ʎbɹǝuƎ", - "armor.gtceu.energy_share.enable": "pǝןqɐuǝ buıbɹɐɥɔ sʇǝbpɐ⅁ :ʎןddnS ʎbɹǝuƎ", - "armor.gtceu.energy_share.error": "¡buıbɹɐɥɔ sʇǝbpɐb ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ʎןddnS ʎbɹǝuƎ", - "armor.gtceu.energy_share.tooltip": "%s :ǝpoɯ ʎןddnS", - "armor.gtceu.energy_share.tooltip.guide": "ɯǝʇı buıpןoɥ uǝɥʍ ʞɔıןɔ ʇɥbıɹ-ʇɟıɥs ǝpoɯ ǝbuɐɥɔ o⟘", - "armor.gtceu.hud.energy_lvl": "%s :ןǝʌǝꞀ ʎbɹǝuƎ", - "armor.gtceu.hud.engine_enabled": "%s :pǝןqɐuƎ ǝuıbuƎ", - "armor.gtceu.hud.fuel_lvl": "%s :ןǝʌǝꞀ ןǝnℲ", - "armor.gtceu.hud.gravi_engine": "%s :ǝuıbuƎıʌɐɹ⅁", - "armor.gtceu.hud.hover_mode": "%s :ǝpoW ɹǝʌoH", - "armor.gtceu.hud.status.disabled": "ℲℲOɔ§", - "armor.gtceu.hud.status.enabled": "NOɐ§", - "armor.gtceu.jetpack.emergency_hover_mode": "¡pǝןqɐuƎ ǝpoW ɹǝʌoH ʎɔuǝbɹǝɯƎ", - "armor.gtceu.jetpack.flight.disable": "pǝןqɐsıᗡ ʇɥbıןℲ :ʞɔɐdʇǝſ", - "armor.gtceu.jetpack.flight.enable": "pǝןqɐuƎ ʇɥbıןℲ :ʞɔɐdʇǝſ", - "armor.gtceu.jetpack.hover.disable": "pǝןqɐsıᗡ ǝpoW ɹǝʌoH :ʞɔɐdʇǝſ", - "armor.gtceu.jetpack.hover.enable": "pǝןqɐuƎ ǝpoW ɹǝʌoH :ʞɔɐdʇǝſ", - "armor.gtceu.message.nightvision.disabled": "ɟɟOɔ§ :uoısıΛʇɥbıNq§", - "armor.gtceu.message.nightvision.enabled": "uOɐ§ :uoısıΛʇɥbıNq§", - "armor.gtceu.message.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§", - "armor.gtceu.nms.boosted_jump.disabled": "pǝןqɐsıᗡ ʇsooᗺ dɯnſ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nms.boosted_jump.enabled": "pǝןqɐuƎ ʇsooᗺ dɯnſ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nms.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıN :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nms.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıN :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nms.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nms.charge.disable": "pǝןqɐsıᗡ buıbɹɐɥƆ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nms.charge.enable": "pǝןqɐuƎ buıbɹɐɥƆ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nms.charge.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.qts.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıN :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "armor.gtceu.qts.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıN :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "armor.gtceu.qts.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "armor.gtceu.qts.charge.disable": "pǝןqɐsıᗡ buıbɹɐɥƆ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "armor.gtceu.qts.charge.enable": "pǝןqɐuƎ buıbɹɐɥƆ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "armor.gtceu.qts.charge.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "armor.gtceu.tooltip.autoeat": "ʎɹoʇuǝʌuI ɯoɹɟ pooℲ buıs∩ ʎq ɹɐᗺ pooℲ sǝɥsıuǝןdǝᴚ", - "armor.gtceu.tooltip.breath": "ɹɐᗺ ɥʇɐǝɹᗺ ɹǝʇɐʍɹǝpu∩ sǝɥsıuǝןdǝᴚ", - "armor.gtceu.tooltip.burning": "buıuɹnᗺ sǝıɟıןןnN", - "armor.gtceu.tooltip.falldamage": "ǝbɐɯɐᗡ ןןɐℲ sǝıɟıןןnN", - "armor.gtceu.tooltip.freezing": "buızǝǝɹℲ sʇuǝʌǝɹԀ", - "armor.gtceu.tooltip.jump": "ǝɔuɐʇsıᗡ puɐ ʇɥbıǝH dɯnſ sǝsɐǝɹɔuI", - "armor.gtceu.tooltip.potions": "sʇɔǝɟɟƎ ןnɟɯɹɐH sǝıɟıןןnN", - "armor.gtceu.tooltip.speed": "pǝǝdS buıuunᴚ sǝsɐǝɹɔuI", - "armor.gtceu.tooltip.stepassist": "ʇsıssⱯ-dǝʇS sǝpıʌoɹԀ", - "item.behavior.mode_switch.current_mode": "%s :ǝpoW", - "item.behavior.mode_switch.mode_switched": "%s :oʇ ʇǝS ǝpoWǝ§", - "item.behavior.mode_switch.tooltip": "ǝpoɯ ɥɔʇıʍs oʇ buıʞɐǝus ǝןıɥʍ ǝs∩", - "item.clipboard.tooltip": "ǝʌoɯǝɹ oʇ ʞɔıןƆ-ʇɥbıᴚ-ʇɟıɥS puɐ 'ǝɔɐןd oʇ ןןɐM uo ʞɔıןɔ-ʇɥbıᴚ ˙)ʇuǝɯnɹʇsuI buıʇıɹʍ ʎuɐ ʇnoɥʇıʍ( uo uǝʇʇıɹʍ ǝq uɐƆ", - "item.cover.digital.mode.energy.disabled": "ǝpoW ʎbɹǝuƎ ǝןqɐuǝ oʇ ʞɔıןƆ", - "item.cover.digital.mode.energy.enabled": "pǝןqɐuǝ ǝpoW ʎbɹǝuƎ", - "item.cover.digital.mode.fluid.disabled": "ǝpoW pınןℲ ǝןqɐuǝ oʇ ʞɔıןƆ", - "item.cover.digital.mode.fluid.enabled": "pǝןqɐuǝ ǝpoW pınןℲ", - "item.cover.digital.mode.item.disabled": "ǝpoW ɯǝʇI ǝןqɐuǝ oʇ ʞɔıןƆ", - "item.cover.digital.mode.item.enabled": "pǝןqɐuǝ ǝpoW ɯǝʇI", - "item.cover.digital.mode.machine.disabled": "ǝpoW ǝuıɥɔɐW ǝןqɐuǝ oʇ ʞɔıןƆ", - "item.cover.digital.mode.machine.enabled": "pǝןqɐuǝ ǝpoW ǝuıɥɔɐW", - "item.cover.digital.mode.proxy.disabled": "ǝpoW ʎxoɹԀ ǝןqɐuǝ oʇ ʞɔıןƆ", - "item.cover.digital.mode.proxy.enabled": "pǝןqɐuǝ ǝpoW ʎxoɹԀ", - "item.cover.digital.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ㄥ§ɹoʇıuoW ןɐɹʇuǝƆɟ§ ǝɥʇ oʇ ㄥ§sǝןqɐƆ ɹǝʍoԀɟ§ ɹǝʌo sǝuıɥɔɐɯ sʇɔǝuuoƆ", - "item.cover.digital.wireless.tooltip.0": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ㄥ§ɹoʇıuoW ןɐɹʇuǝƆɟ§ ǝɥʇ oʇ sǝuıɥɔɐɯ sʇɔǝuuoɔ ㄥ§ʎןssǝןǝɹıMɟ§", - "item.cover.digital.wireless.tooltip.1": "˙ʇı oʇ puıq ʎןǝʇoɯǝɹ oʇ ㄥ§ɹoʇıuoW ןɐɹʇuǝƆɟ§ ǝɥʇ uo ㄥ§ʞɔıןƆ ʇɥbıᴚɟ§", - "item.cover.digital.wireless.tooltip.2": "˙buıpuıq ʇuǝɹɹnɔ ǝɥʇ ǝʌoɯǝɹ oʇ ㄥ§ʞɔıןƆ ʇɥbıᴚ ʞɐǝuSɟ§", - "item.cover.digital.wireless.tooltip.3": "%sɟ§ :buıpuıᗺɐ§", - "item.crushed.tooltip.purify": "ǝɹO pǝıɟıɹnԀ ʇǝb oʇ uoɹpןnɐƆ ɐ ʞɔıןɔ ʇɥbıᴚ", - "item.debug_scanner.tooltip": "ɹǝpɹoɔıɹ⟘", - "item.dust.tooltip.purify": "ʇsnᗡ uɐǝןɔ ʇǝb oʇ uoɹpןnɐƆ ɐ ʞɔıןɔ ʇɥbıᴚ", - "item.electric.discharge_mode.disabled": "pǝןqɐsıᗡ ǝpoW ǝbɹɐɥɔsıᗡǝ§", - "item.electric.discharge_mode.enabled": "pǝןqɐuƎ ǝpoW ǝbɹɐɥɔsıᗡǝ§", - "item.electric.discharge_mode.tooltip": "ǝpoɯ ǝbɹɐɥɔsıp ǝןbboʇ oʇ buıʞɐǝus ǝןıɥʍ ǝs∩", - "item.generic.electric_item.stored": ")%s( ∩Ǝ %d/%d", - "item.generic.electric_item.tooltip": "%s ɹǝı⟘ - ∩Ǝ %d/%d", - "item.generic.fluid_container.tooltip": "%s Ꞁ%d/%d", - "item.int_circuit.configuration": "%d :uoıʇɐɹnbıɟuoƆ", - "item.liquid_fuel_jetpack.tooltip": "ʇsnɹɥ⟘ ɹoɟ sןǝnℲ ɹoʇɐɹǝuǝ⅁ uoıʇsnqɯoƆ sǝs∩", - "item.machine_configuration.mode": "%s ɹ§:ǝpoW uoıʇɐɹnbıɟuoƆɐ§", - "item.plugin.proxy.tooltips.1": ")uǝǝɹɔs ǝɥʇ uı ǝpoɯ ʎxoɹd oʇ ʇsnظpɐ ǝsɐǝןԀ(", - "item.plugin.tooltips.1": "˙ʎʇıןɐuoıʇɔunɟ ǝɹoɯ ɹoɟ uǝǝɹɔs ǝɥʇ oʇ pǝppɐ ǝq uɐɔ suıbnןԀ", - "item.prospector.mode.bedrock_ore": "ɹ§ǝpoW uoıʇɔǝdsoɹԀ ǝɹO ʞɔoɹpǝᗺq§", - "item.prospector.mode.fluid": "ɹ§ǝpoW uoıʇɔǝdsoɹԀ pınןℲq§", - "item.prospector.mode.ores": "ɹ§ǝpoW uoıʇɔǝdsoɹԀ ǝɹOɐ§", - "item.prospector.tooltip.modes": ":sǝpoW ǝןqɐןıɐʌⱯ", - "item.prospector.tooltip.radius": "snıpɐᴚ ʞunɥƆ %s ɐ uı ǝbuɐɹ suɐɔS", - "item.record.sus.tooltip": "dıɹᗡ s∩ buoɯⱯ - zuoǝꞀㄥ§", - "item.terminal.tooltip": "ʞɹoʍ poob ǝʞɐɯ sןooʇ dɹɐɥS", - "item.terminal.tooltip.creative": "ǝpoW ǝʌıʇɐǝɹƆq§", - "item.terminal.tooltip.hardware": "%d :ǝɹɐʍpɹɐHɐ§", - "item.tool.tooltip.durability": "%d / %dɐ§ :ʎʇıןıqɐɹnᗡɟ§", - "item.tool.tooltip.primary_material": "%sǝ§ :ןɐıɹǝʇɐWɟ§", - "item.tool.tooltip.rotor.efficiency": "%d%%6§ :ʎɔuǝıɔıɟɟƎ ǝuıqɹn⟘", - "item.tool.tooltip.rotor.power": "%d%%6§ :ɹǝʍoԀ ǝuıqɹn⟘", - "item.tricorder_scanner.tooltip": "ɹǝpɹoɔıɹ⟘", "monitor.gui.title.argb": ":ᗺ⅁ᴚⱯ", "monitor.gui.title.back": "ʞɔɐᗺ", "monitor.gui.title.config": "bıɟuoƆ", @@ -5413,22 +4808,6 @@ "recipe.capability.eu.name": "ʎbɹǝuƎ nƎƆ⟘⅁", "recipe.capability.fluid.name": "pınןℲ", "recipe.capability.item.name": "ɯǝʇI", - "recipe.condition.adjacent_block.tooltip": "punoɹɐ sʞɔoןᗺ", - "recipe.condition.biome.tooltip": "%s :ǝɯoıᗺ", - "recipe.condition.daytime.day.tooltip": "ʞɹoʍ oʇ ǝɯıʇ ʎɐp sǝɹınbǝᴚ", - "recipe.condition.daytime.night.tooltip": "ʞɹoʍ oʇ ǝɯıʇ ʇɥbıu sǝɹınbǝᴚ", - "recipe.condition.dimension.tooltip": "%s :uoısuǝɯıᗡ", - "recipe.condition.dimension_marker.tooltip": ":uoısuǝɯıᗡ", - "recipe.condition.eu_to_start.tooltip": "%d%s :ʇɹɐʇS oʇ ∩Ǝ", - "recipe.condition.gamestage.locked_stage": "%s :ǝbɐʇs ʇɐ pǝʞɔoꞀ", - "recipe.condition.gamestage.unlocked_stage": "%s :ǝbɐʇs ʇɐ pǝʞɔoןu∩", - "recipe.condition.pos_y.tooltip": "%d =< ʎ =< %d :ןǝʌǝꞀ ʎ", - "recipe.condition.quest.completed.tooltip": "pǝʇǝןdɯoɔ %s sǝɹınbǝᴚ", - "recipe.condition.quest.not_completed.tooltip": "pǝʇǝןdɯoɔ ʇou %s sǝɹınbǝᴚ", - "recipe.condition.rain.tooltip": "%d :ןǝʌǝꞀ uıɐᴚ", - "recipe.condition.rock_breaker.tooltip": "punoɹɐ sʞɔoןq pınןℲ", - "recipe.condition.steam_vent.tooltip": "ʇuǝʌ ɯɐǝʇs uɐǝןƆ", - "recipe.condition.thunder.tooltip": "%d :ןǝʌǝꞀ ɹǝpunɥ⟘", "tagprefix.andesite": "ǝɹO %s ǝʇısǝpuⱯ", "tagprefix.basalt": "ǝɹO %s ʇןɐsɐᗺ", "tagprefix.blackstone": "ǝɹO %s ǝuoʇsʞɔɐןᗺ", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index fe720e37417..f479386c98e 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -1,99 +1,51 @@ { + "armor.gtceu.energy_share.disable": "Energy Supply: Gadgets charging disabled", + "armor.gtceu.energy_share.enable": "§aEnergy Supply: Gadgets charging enabled", + "armor.gtceu.energy_share.error": "Energy Supply: §cNot enough power for gadgets charging!", + "armor.gtceu.energy_share.tooltip": "Supply mode: %s", + "armor.gtceu.energy_share.tooltip.guide": "To change mode shift-right click when holding item", + "armor.gtceu.hud.energy_lvl": "Energy Level: %s", + "armor.gtceu.hud.engine_enabled": "§aEngine Enabled: %s", + "armor.gtceu.hud.fuel_lvl": "Fuel Level: %s", + "armor.gtceu.hud.gravi_engine": "GraviEngine: %s", + "armor.gtceu.hud.hover_mode": "Hover Mode: %s", + "armor.gtceu.hud.status.disabled": "§cOFF", + "armor.gtceu.hud.status.enabled": "§aON", + "armor.gtceu.jetpack.emergency_hover_mode": "§aEmergency Hover Mode Enabled!", + "armor.gtceu.jetpack.flight.disable": " §cJetpack: Flight Disabled", + "armor.gtceu.jetpack.flight.enable": "§aJetpack: Flight Enabled", + "armor.gtceu.jetpack.hover.disable": " §cJetpack: Hover Mode Disabled", + "armor.gtceu.jetpack.hover.enable": "§aJetpack: Hover Mode Enabled", + "armor.gtceu.message.nightvision.disabled": " §cNightVision: §cOff", + "armor.gtceu.message.nightvision.enabled": "§aNightVision: §aOn", + "armor.gtceu.message.nightvision.error": "§cNot enough power!", + "armor.gtceu.nms.boosted_jump.disabled": " §cNanoMuscle™ Suite: Jump Boost Disabled", + "armor.gtceu.nms.boosted_jump.enabled": "§aNanoMuscle™ Suite: Jump Boost Enabled", + "armor.gtceu.nms.charge.disable": " §cNanoMuscle™ Suite: Charging Disabled", + "armor.gtceu.nms.charge.enabled": "§aNanoMuscle™ Suite: Charging Enabled", + "armor.gtceu.nms.charge.error": "NanoMuscle™ Suite: §cNot enough power for charging!", + "armor.gtceu.nms.nightvision.disabled": " §cNanoMuscle™ Suite: NightVision Disabled", + "armor.gtceu.nms.nightvision.enabled": "§aNanoMuscle™ Suite: NightVision Enabled", + "armor.gtceu.nms.nightvision.error": "NanoMuscle™ Suite: §cNot enough power!", + "armor.gtceu.qts.charge.disable": " §cQuarkTech™ Suite: Charging Disabled", + "armor.gtceu.qts.charge.enabled": "§aQuarkTech™ Suite: Charging Enabled", + "armor.gtceu.qts.charge.error": " §cQuarkTech™ Suite: §cNot enough power for charging!", + "armor.gtceu.qts.nightvision.disabled": " §cQuarkTech™ Suite: NightVision Disabled", + "armor.gtceu.qts.nightvision.enabled": "§a§aQuarkTech™ Suite: NightVision Enabled", + "armor.gtceu.qts.nightvision.error": " §cQuarkTech™ Suite: §cNot enough power!", + "armor.gtceu.tooltip.autoeat": "Replenishes Food Bar by Using Food from Inventory", + "armor.gtceu.tooltip.breath": "Replenishes Underwater Breath Bar", + "armor.gtceu.tooltip.burning": "Nullifies Burning", + "armor.gtceu.tooltip.falldamage": "Nullifies Fall Damage", + "armor.gtceu.tooltip.freezing": "Prevents Freezing", + "armor.gtceu.tooltip.jump": "Increases Jump Height and Distance", + "armor.gtceu.tooltip.potions": "Nullifies Harmful Effects", + "armor.gtceu.tooltip.speed": "Increases Running Speed", + "armor.gtceu.tooltip.stepassist": "Provides Step-Assist", "behavior.data_item.assemblyline.data": "- §a%s", "behavior.data_item.assemblyline.title": "§nAssembly Line Construction Data:", "behavior.item_magnet.disabled": "§cMagnetic Field Disabled", "behavior.item_magnet.enabled": "§aMagnetic Field Enabled", - "behavior.portable_scanner.amp_per_sec": "Average (last second): %s A", - "behavior.portable_scanner.bedrock_fluid.amount": "Fluid In Deposit: %s %s - %s%%", - "behavior.portable_scanner.bedrock_fluid.amount_unknown": "Fluid In Deposit: %s%%", - "behavior.portable_scanner.bedrock_fluid.nothing": "Fluid In Deposit: §6Nothing§r", - "behavior.portable_scanner.block_hardness": "Hardness: %s Blast Resistance: %s", - "behavior.portable_scanner.block_name": "Name: %s MetaData: %s", - "behavior.portable_scanner.debug_cpu_load": "Average CPU load of ~%sns over %s ticks with worst time of %sns.", - "behavior.portable_scanner.debug_cpu_load_seconds": "This is %s seconds.", - "behavior.portable_scanner.debug_lag_count": "Caused %s Lag Spike Warnings (anything taking longer than %sms) on the Server.", - "behavior.portable_scanner.debug_machine": "Meta-ID: %s", - "behavior.portable_scanner.debug_machine_invalid": " invalid!", - "behavior.portable_scanner.debug_machine_invalid_null=invalid! MetaTileEntity =": " null!", - "behavior.portable_scanner.debug_machine_valid": " valid", - "behavior.portable_scanner.divider": "=========================", - "behavior.portable_scanner.energy_container_in": "Max IN: %s (%s) EU at %s A", - "behavior.portable_scanner.energy_container_out": "Max OUT: %s (%s) EU at %s A", - "behavior.portable_scanner.energy_container_storage": "Energy: %s EU / %s EU", - "behavior.portable_scanner.environmental_hazard": "Environmental Hazard In Chunk: %s§r - %s ppm", - "behavior.portable_scanner.environmental_hazard.nothing": "Environmental Hazard In Chunk: §6Nothing§r", - "behavior.portable_scanner.eu_per_sec": "Average (last second): %s EU/t", - "behavior.portable_scanner.guild_name": "§2Guild Name: %s§r", - "behavior.portable_scanner.local_hazard": "Local Hazard In Area: %s§r - %s ppm", - "behavior.portable_scanner.local_hazard.nothing": "Local Hazard In Area: §6Nothing§r", - "behavior.portable_scanner.machine_disabled": "Disabled.", - "behavior.portable_scanner.machine_front_facing": "Front Facing: %s", - "behavior.portable_scanner.machine_ownership": "§2Machine Owner Type: %s§r", - "behavior.portable_scanner.machine_power_loss": "Shut down due to power loss.", - "behavior.portable_scanner.machine_progress": "Progress/Load: %s / %s", - "behavior.portable_scanner.machine_upwards_facing": "Upwards Facing: %s", - "behavior.portable_scanner.mode.caption": "Display mode: %s", - "behavior.portable_scanner.mode.show_all_info": "Show all info", - "behavior.portable_scanner.mode.show_block_info": "Show block info", - "behavior.portable_scanner.mode.show_electrical_info": "Show electrical info", - "behavior.portable_scanner.mode.show_environmental_info": "Show environmental info", - "behavior.portable_scanner.mode.show_machine_info": "Show machine info", - "behavior.portable_scanner.mode.show_recipe_info": "Show recipe info", - "behavior.portable_scanner.muffled": "Muffled.", - "behavior.portable_scanner.multiblock_energy_input": "Max Energy Income: %s EU/t Tier: %s", - "behavior.portable_scanner.multiblock_energy_output": "Max Energy Output: %s EU/t Tier: %s", - "behavior.portable_scanner.multiblock_maintenance": "Problems: %s", - "behavior.portable_scanner.multiblock_parallel": "Multi Processing: %s", - "behavior.portable_scanner.player_name": "§2Player Name: %s§r, §7Player Online: %s§r", - "behavior.portable_scanner.position": "----- X: %s Y: %s Z: %s D: %s -----", - "behavior.portable_scanner.state": "%s: %s", - "behavior.portable_scanner.tank": "Tank %s: %s mB / %s mB %s", - "behavior.portable_scanner.tanks_empty": "All Tanks Empty", - "behavior.portable_scanner.team_name": "§2Team Name: %s§r", - "behavior.portable_scanner.workable_consumption": "Probably Uses: %s EU/t at %s A", - "behavior.portable_scanner.workable_production": "Probably Produces: %s EU/t at %s A", - "behavior.portable_scanner.workable_progress": "Progress: %s s / %s s", - "behavior.portable_scanner.workable_stored_energy": "Stored Energy: %s EU / %s EU", - "behavior.prospector.added_waypoint": "Created waypoint named %s!", - "behavior.prospector.not_enough_energy": "Not Enough Energy!", - "behavior.toggle_energy_consumer.tooltip": "Use to toggle mode", - "behaviour.boor.by": "by %s", - "behaviour.hammer": "Turns on and off Muffling for Machines (by hitting them)", - "behaviour.hoe": "Can till dirt", - "behaviour.lighter.fluid.tooltip": "Can light things on fire with Butane or Propane", - "behaviour.lighter.tooltip.description": "Can light things on fire", - "behaviour.lighter.tooltip.usage": "Shift-right click to open/close", - "behaviour.lighter.uses": "Remaining uses: %d", - "behaviour.meta.machine.config.copy.tooltip": "§7Sneak + R-Click to copy machine configuration", - "behaviour.meta.machine.config.paste.tooltip": "§7R-Click to paste machine configuration", - "behaviour.paintspray.black.tooltip": "Can paint things in Black", - "behaviour.paintspray.blue.tooltip": "Can paint things in Blue", - "behaviour.paintspray.brown.tooltip": "Can paint things in Brown", - "behaviour.paintspray.cyan.tooltip": "Can paint things in Cyan", - "behaviour.paintspray.gray.tooltip": "Can paint things in Gray", - "behaviour.paintspray.green.tooltip": "Can paint things in Green", - "behaviour.paintspray.light_blue.tooltip": "Can paint things in Light Blue", - "behaviour.paintspray.light_gray.tooltip": "Can paint things in Light Gray", - "behaviour.paintspray.lime.tooltip": "Can paint things in Lime", - "behaviour.paintspray.magenta.tooltip": "Can paint things in Magenta", - "behaviour.paintspray.orange.tooltip": "Can paint things in Orange", - "behaviour.paintspray.pink.tooltip": "Can paint things in Pink", - "behaviour.paintspray.purple.tooltip": "Can paint things in Purple", - "behaviour.paintspray.red.tooltip": "Can paint things in Red", - "behaviour.paintspray.solvent.tooltip": "Can remove color from things", - "behaviour.paintspray.uses": "Remaining Uses: %d", - "behaviour.paintspray.white.tooltip": "Can paint things in White", - "behaviour.paintspray.yellow.tooltip": "Can paint things in Yellow", - "behaviour.prospecting": "Usable for Prospecting", - "behaviour.setting.allow.input.from.output.tooltip": "%s input from output side is %s", - "behaviour.setting.item_auto_output.tooltip": "%s auto-output is %s", - "behaviour.setting.muffled.tooltip": "Muffling %s", - "behaviour.setting.output.direction.tooltip": "%s output direction: %s", - "behaviour.soft_hammer": "Activates and Deactivates Machines", - "behaviour.soft_hammer.disabled": "Working Disabled", - "behaviour.soft_hammer.enabled": "Working Enabled", - "behaviour.soft_hammer.idle_after_cycle": "Pause machine after current cycle", - "behaviour.wrench": "Rotates Blocks on Rightclick", "block.filter_casing.tooltip": "Creates a §aParticle-Free§7 environment", "block.gtceu.acid_hazard_sign_block": "Acid Hazard Sign Block", "block.gtceu.active_transformer": "Active Transformer", @@ -896,9 +848,6 @@ "block.gtceu.normal_optical_pipe": "Optical Fiber Cable", "block.gtceu.normal_optical_pipe.tooltip": "§7Transmitting §fComputation§7 or §fResearch Data§7", "block.gtceu.object_holder": "Object Holder", - "block.gtceu.oil_heavy": "Heavy Oil", - "block.gtceu.oil_light": "Light Oil", - "block.gtceu.oil_medium": "Raw Oil", "block.gtceu.opv_1024a_laser_source_hatch": "§9§lOpV§r 1,024§eA§r Laser Source Hatch", "block.gtceu.opv_1024a_laser_target_hatch": "§9§lOpV§r 1,024§eA§r Laser Target Hatch", "block.gtceu.opv_16a_energy_converter": "§9§lOpV§r 16§eA§r Energy Converter", @@ -1703,14 +1652,6 @@ "block.surface_rock": "%s Surface Rock", "button.gtceu.mark_as_depleted.name": "Mark as Depleted", "button.gtceu.toggle_waypoint.name": "Toggle Waypoint", - "command.gtceu.dump_data.success": "Dumped %s resources from registry %s to %s", - "command.gtceu.medical_condition.get": "Player %s has these medical conditions:", - "command.gtceu.medical_condition.get.element": "Condition %s§r: %s minutes %s seconds", - "command.gtceu.medical_condition.get.element.permanent": "Condition %s§r: %s minutes %s seconds (permanent)", - "command.gtceu.medical_condition.get.empty": "Player %s has no medical conditions.", - "command.gtceu.place_vein.failure": "Failed to place vein %s at position %s", - "command.gtceu.place_vein.success": "Placed vein %s at position %s", - "command.gtceu.share_prospection_data.notification": "%s is sharing prospecting data with you!", "config.gtceu.option.addLoot": "addLoot", "config.gtceu.option.ae2": "ae2", "config.gtceu.option.allUniqueStoneTypes": "allUniqueStoneTypes", @@ -1890,189 +1831,6 @@ "config.jade.plugin_gtceu.steam_boiler_info": "[GTCEu] Steam Boiler Info", "config.jade.plugin_gtceu.transformer": "[GTCEu] Transformer Info", "config.jade.plugin_gtceu.workable_provider": "[GTCEu] Workable", - "cover.advanced_detector.latch.disabled.0": "Behavior: Continuous", - "cover.advanced_detector.latch.disabled.1": "", - "cover.advanced_detector.latch.disabled.2": "Change the redstone behavior of this Cover.", - "cover.advanced_detector.latch.disabled.3": "§eContinuous§7 - Default; values less than the minimum output 0; values higher than the maximum output 15; values between min and max output between 0 and 15", - "cover.advanced_detector.latch.disabled.4": "§eLatched§7 - output 15 until above max, then output 0 until below min", - "cover.advanced_detector.latch.enabled.0": "Behavior: Latched", - "cover.advanced_detector.latch.enabled.1": "", - "cover.advanced_detector.latch.enabled.2": "Change the redstone behavior of this Cover.", - "cover.advanced_detector.latch.enabled.3": "§eContinuous§7 - Default; values less than the minimum output 0; values higher than the maximum output 15; values between min and max output between 0 and 15", - "cover.advanced_detector.latch.enabled.4": "§eLatched§7 - output 15 until above max, then output 0 until below min", - "cover.advanced_energy_detector.invert.disabled.0": "Output: Normal", - "cover.advanced_energy_detector.invert.disabled.1": "", - "cover.advanced_energy_detector.invert.disabled.2": "Toggle to invert the redstone logic", - "cover.advanced_energy_detector.invert.disabled.3": "By default, redstone is emitted when less than the minimum EU, and stops emitting when greater than the max EU", - "cover.advanced_energy_detector.invert.enabled.0": "Output: Inverted", - "cover.advanced_energy_detector.invert.enabled.1": "", - "cover.advanced_energy_detector.invert.enabled.2": "Toggle to invert the redstone logic", - "cover.advanced_energy_detector.invert.enabled.3": "By default, redstone is emitted when less than the minimum EU, and stops emitting when greater than the max EU", - "cover.advanced_energy_detector.label": "Advanced Energy Detector", - "cover.advanced_energy_detector.max": "Max", - "cover.advanced_energy_detector.min": "Min", - "cover.advanced_energy_detector.use_percent.disabled.0": "Mode: Discrete EU", - "cover.advanced_energy_detector.use_percent.disabled.1": "", - "cover.advanced_energy_detector.use_percent.disabled.2": "Change between using discrete EU values or percentages for comparing min/max against an attached energy storage.", - "cover.advanced_energy_detector.use_percent.enabled.0": "Mode: Percentage", - "cover.advanced_energy_detector.use_percent.enabled.1": "", - "cover.advanced_energy_detector.use_percent.enabled.2": "Change between using discrete EU values or percentages for comparing min/max against an attached energy storage.", - "cover.advanced_fluid_detector.invert.disabled.0": "Output: Normal", - "cover.advanced_fluid_detector.invert.disabled.1": "", - "cover.advanced_fluid_detector.invert.disabled.2": "Toggle to invert the redstone logic", - "cover.advanced_fluid_detector.invert.disabled.3": "By default, redstone stops emitting when less than the minimum mB of fluid, and starts emitting when greater than the min mB of fluid up to the set maximum", - "cover.advanced_fluid_detector.invert.enabled.0": "Output: Inverted", - "cover.advanced_fluid_detector.invert.enabled.1": "", - "cover.advanced_fluid_detector.invert.enabled.2": "Toggle to invert the redstone logic", - "cover.advanced_fluid_detector.invert.enabled.3": "By default, redstone stops emitting when less than the minimum mB of fluid, and starts emitting when greater than the min mB of fluid up to the set maximum", - "cover.advanced_fluid_detector.label": "Advanced Fluid Detector", - "cover.advanced_fluid_detector.max": "Max Fluid (mB)", - "cover.advanced_fluid_detector.min": "Min Fluid (mB)", - "cover.advanced_item_detector.invert.disabled.0": "Output: Normal", - "cover.advanced_item_detector.invert.disabled.1": "", - "cover.advanced_item_detector.invert.disabled.2": "Toggle to invert the redstone logic", - "cover.advanced_item_detector.invert.disabled.3": "By default, redstone stops emitting when less than the minimum amount of items, and starts emitting when greater than the min amount of items up to the set maximum", - "cover.advanced_item_detector.invert.enabled.0": "Output: Inverted", - "cover.advanced_item_detector.invert.enabled.1": "", - "cover.advanced_item_detector.invert.enabled.2": "Toggle to invert the redstone logic", - "cover.advanced_item_detector.invert.enabled.3": "By default, redstone stops emitting when less than the minimum amount of items, and starts emitting when greater than the min amount of items up to the set maximum", - "cover.advanced_item_detector.label": "Advanced Item Detector", - "cover.advanced_item_detector.max": "Max Items", - "cover.advanced_item_detector.min": "Min Items", - "cover.bucket.mode.bucket": "B", - "cover.bucket.mode.milli_bucket": "mB", - "cover.conveyor.blocks_input.disabled.0": "If enabled, items will not be inserted when cover is set to pull items from the inventory into pipe.", - "cover.conveyor.blocks_input.disabled.1": "§cDisabled", - "cover.conveyor.blocks_input.enabled.0": "If enabled, items will not be inserted when cover is set to pull items from the inventory into pipe.", - "cover.conveyor.blocks_input.enabled.1": "§aEnabled", - "cover.conveyor.distribution.insert_first.0": "Distribution Mode: §bPriority", - "cover.conveyor.distribution.insert_first.1": "§7Will insert into the first inventory with the highest priority it can find.", - "cover.conveyor.distribution.insert_first.2": "§7Restrictive item pipes lower the priority of a path.", - "cover.conveyor.distribution.round_robin_global.0": "Distribution Mode: §bRound Robin", - "cover.conveyor.distribution.round_robin_global.1": "§7Splits items equally across connected inventories", - "cover.conveyor.distribution.round_robin_prio.0": "Distribution Mode: §bRound Robin with Priority", - "cover.conveyor.distribution.round_robin_prio.1": "§7Tries to split items across connected inventories and considers higher priorities first.", - "cover.conveyor.distribution.round_robin_prio.2": "§7Restrictive item pipes lower the priority of a path.", - "cover.conveyor.item_filter.title": "Item Filter", - "cover.conveyor.mode": "Mode: %s", - "cover.conveyor.mode.export": "Mode: Export", - "cover.conveyor.mode.import": "Mode: Import", - "cover.conveyor.tag.title.0": "Tag Name", - "cover.conveyor.tag.title.1": "(use * for wildcard)", - "cover.conveyor.title": "Conveyor Cover Settings (%s)", - "cover.conveyor.transfer_rate": "§7items/sec", - "cover.detector_base.message_inverted_state": "Monitoring Status: Inverted", - "cover.detector_base.message_normal_state": "Monitoring Status: Normal", - "cover.ender_fluid_link.incomplete_hex.0": "Inputted color is incomplete!", - "cover.ender_fluid_link.incomplete_hex.1": "It will be applied once complete (all 8 hex digits)", - "cover.ender_fluid_link.incomplete_hex.2": "Closing the gui will lose edits!", - "cover.ender_fluid_link.iomode.disabled": "I/O Disabled", - "cover.ender_fluid_link.iomode.enabled": "I/O Enabled", - "cover.ender_fluid_link.private.tooltip.disabled.0": "Switch to private tank mode", - "cover.ender_fluid_link.private.tooltip.disabled.1": "Private mode uses the player who originally placed the cover", - "cover.ender_fluid_link.private.tooltip.enabled": "Switch to public tank mode", - "cover.ender_fluid_link.title": "Ender Fluid Link", - "cover.ender_fluid_link.tooltip.channel_description": "Set channel description with input text", - "cover.ender_fluid_link.tooltip.channel_name": "Set channel name with input text", - "cover.ender_fluid_link.tooltip.clear_button": "Clear channel description", - "cover.ender_fluid_link.tooltip.list_button": "Show channel list", - "cover.filter.blacklist.disabled": "Whitelist", - "cover.filter.blacklist.enabled": "Blacklist", - "cover.filter.mode.filter_both": "Filter Insert/Extract", - "cover.filter.mode.filter_extract": "Filter Extract", - "cover.filter.mode.filter_insert": "Filter Insert", - "cover.fluid.voiding.advanced.title": "Advanced Fluid Voiding Settings", - "cover.fluid.voiding.title": "Fluid Voiding Settings", - "cover.fluid_filter.config_amount.0": "Scroll wheel up increases amount, down decreases.", - "cover.fluid_filter.config_amount.1": "Shift[§6x10§r],Ctrl[§ex100§r],Shift+Ctrl[§ax1000§r]", - "cover.fluid_filter.config_amount.2": "Right click increases amount, left click decreases.", - "cover.fluid_filter.config_amount.3": "Hold shift to double/halve.", - "cover.fluid_filter.config_amount.4": "Middle click to clear", - "cover.fluid_filter.mode.filter_both": "Filter Fill & Drain", - "cover.fluid_filter.mode.filter_drain": "Filter Drain", - "cover.fluid_filter.mode.filter_fill": "Filter Fill", - "cover.fluid_filter.title": "Fluid Filter", - "cover.fluid_regulator.keep_exact": "Keep Exact: %s", - "cover.fluid_regulator.supply_exact": "Supply Exact: %s", - "cover.fluid_regulator.title": "Fluid Regulator Settings (%s)", - "cover.fluid_regulator.transfer_mode.description.0": "§eTransfer Any§r - in this mode, cover will transfer as many fluids matching its filter as possible.", - "cover.fluid_regulator.transfer_mode.description.1": "§eSupply Exact§r - in this mode, cover will supply fluids in portions specified in the window underneath this button. If amount of fluids is less than portion size, fluids won't be moved.", - "cover.fluid_regulator.transfer_mode.description.2": "§eKeep Exact§r - in this mode, cover will keep specified amount of fluids in the destination inventory, supplying additional amount of fluids if required.", - "cover.fluid_regulator.transfer_mode.description.3": "§7Tip: shift click will multiply increase/decrease amounts by 10 and ctrl click will multiply by 100.", - "cover.item.voiding.advanced.title": "Advanced Item Voiding Settings", - "cover.item.voiding.title": "Item Voiding Settings", - "cover.item_filter.ignore_damage.disabled": "Respect Damage", - "cover.item_filter.ignore_damage.enabled": "Ignore Damage", - "cover.item_filter.ignore_nbt.disabled": "Respect NBT", - "cover.item_filter.ignore_nbt.enabled": "Ignore NBT", - "cover.item_filter.title": "Item Filter", - "cover.item_smart_filter.filtering_mode.centrifuge": "Centrifuge", - "cover.item_smart_filter.filtering_mode.description.0": "Select Machine this Smart Filter will use for filtering.", - "cover.item_smart_filter.filtering_mode.description.1": "It will automatically pick right portions of items for robotic arm.", - "cover.item_smart_filter.filtering_mode.electrolyzer": "Electrolyzer", - "cover.item_smart_filter.filtering_mode.sifter": "Sifter", - "cover.item_smart_filter.title": "Smart Item Filter", - "cover.machine_controller.invert.disabled.0": "§eNormal§r - in this mode, the cover will require a signal weaker than the set redstone level to run", - "cover.machine_controller.invert.enabled.0": "§eInverted§r - in this mode, the cover will require a signal stronger than the set redstone level to run", - "cover.machine_controller.inverted": "Inverted", - "cover.machine_controller.mode.cover_down": "Control Cover (Bottom)", - "cover.machine_controller.mode.cover_east": "Control Cover (East)", - "cover.machine_controller.mode.cover_north": "Control Cover (North)", - "cover.machine_controller.mode.cover_south": "Control Cover (South)", - "cover.machine_controller.mode.cover_up": "Control Cover (Top)", - "cover.machine_controller.mode.cover_west": "Control Cover (West)", - "cover.machine_controller.mode.machine": "Control Machine", - "cover.machine_controller.mode.null": "Control Nothing", - "cover.machine_controller.normal": "Normal", - "cover.machine_controller.redstone": "Min Redstone Strength: %d", - "cover.machine_controller.title": "Machine Controller Settings", - "cover.pump.fluid_filter.title": "Fluid Filter", - "cover.pump.mode.export": "Mode: Export", - "cover.pump.mode.import": "Mode: Import", - "cover.pump.title": "Pump Cover Settings (%s)", - "cover.pump.transfer_rate": "%s", - "cover.robotic_arm.title": "Robotic Arm Settings (%s)", - "cover.robotic_arm.transfer_mode.description.0": "§eTransfer Any§r - in this mode, cover will transfer as many items matching its filter as possible.", - "cover.robotic_arm.transfer_mode.description.1": "§eSupply Exact§r - in this mode, cover will supply items in portions specified in item filter slots (or variable under this button for tag filter). If amount of items is less than portion size, items won't be moved.", - "cover.robotic_arm.transfer_mode.description.2": "§eKeep Exact§r - in this mode, cover will keep specified amount of items in the destination inventory, supplying additional amount of items if required.", - "cover.robotic_arm.transfer_mode.description.3": "§7Tip: left/right click on filter slots to change item amount, use shift clicking to change amount faster.", - "cover.robotic_arm.transfer_mode.keep_exact": "Keep Exact", - "cover.robotic_arm.transfer_mode.transfer_any": "Transfer Any", - "cover.robotic_arm.transfer_mode.transfer_exact": "Supply Exact", - "cover.shutter.message.disabled": "Opened shutter", - "cover.shutter.message.enabled": "Closed shutter", - "cover.storage.title": "Storage Cover", - "cover.tag_filter.info.0": "§bAccepts complex expressions", - "cover.tag_filter.info.1": "§6a & b§r = AND", - "cover.tag_filter.info.10": "§bExample: §6*dusts/gold | (gtceu:circuits & !*lv)", - "cover.tag_filter.info.11": "This matches all gold dusts or all circuits except LV ones", - "cover.tag_filter.info.2": "§6a | b§r = OR", - "cover.tag_filter.info.3": "§6a ^ b§r = XOR", - "cover.tag_filter.info.4": "§6!a§r = NOT", - "cover.tag_filter.info.5": "§6(a)§r for grouping", - "cover.tag_filter.info.6": "§6*§r for wildcard", - "cover.tag_filter.info.7": "§6$§r for untagged", - "cover.tag_filter.info.8": "§bTags come in the form 'namespace:tag/subtype'.", - "cover.tag_filter.info.9": "The 'forge:' namespace is assumed if one isn't provided.", - "cover.tag_filter.matches": "Item matches", - "cover.tag_filter.matches_not": "Item does not match", - "cover.tag_filter.test_slot.info": "Insert a item to test if it matches the filter expression", - "cover.tag_filter.title": "Tag Filter", - "cover.universal.manual_import_export.mode.description.0": "§eDisabled§r - Items/fluids will only move as specified by the cover and its filter. ", - "cover.universal.manual_import_export.mode.description.1": "§eAllow Filtered§r - Items/fluids can be extracted and inserted independently of the cover mode, as long as its filter matches (if any). ", - "cover.universal.manual_import_export.mode.description.2": "§eAllow Unfiltered§r - Items/fluids can be moved independently of the cover mode. Filter applies to the items inserted or extracted by this cover", - "cover.universal.manual_import_export.mode.disabled": "Manual I/O: §bDisabled\n§7Items / Fluids will only move as specified by the cover and its filter.", - "cover.universal.manual_import_export.mode.filtered": "Manual I/O: §bFiltered\n§7Items / Fluids can be extracted and inserted independently of the cover mode, as long as its filter matches (if any)", - "cover.universal.manual_import_export.mode.unfiltered": "Manual I/O: §bUnfiltered\n§7Items / Fluids can be moved independently of the cover mode. The filter only applies to what is inserted or extracted by this cover itself.", - "cover.voiding.label.disabled": "Disabled", - "cover.voiding.label.enabled": "Enabled", - "cover.voiding.message.disabled": "Voiding Cover Disabled", - "cover.voiding.message.enabled": "Voiding Cover Enabled", - "cover.voiding.tooltip": "§cWARNING!§7 Setting this to \"Enabled\" means that fluids or items WILL be voided.", - "cover.voiding.voiding_mode.description.0": "§eVoid Matching§r will void anything matching the filter. ", - "cover.voiding.voiding_mode.description.1": "§eVoid Overflow§r will void anything matching the filter, up to the specified amount.", - "cover.voiding.voiding_mode.void_any": "Void Matching", - "cover.voiding.voiding_mode.void_overflow": "Void Overflow", "curios.identifier.gtceu_magnet": "GTCEu Magnet", "death.attack.gtceu.axe": "%s has been chopped by %s", "death.attack.gtceu.butchery_knife": "%s was butchered by %s", @@ -2161,10 +1919,6 @@ "gtceu.button.hide_depleted": "Hide Depleted Veins", "gtceu.button.ore_veins": "Show GT Ore Veins", "gtceu.button.show_depleted": "Show Depleted Veins", - "gtceu.cable.amperage": "§eMax Amperage:§r §e%d", - "gtceu.cable.loss_per_block": "§cLoss/Meter/Ampere:§r §c%d§7 EU-Volt", - "gtceu.cable.superconductor": "%s §dSuperconductor", - "gtceu.cable.voltage": "§aMax Voltage:§r §a%d §a(%s§a)", "gtceu.canner": "Canner", "gtceu.centrifuge": "Centrifuge", "gtceu.chance_logic.and": "AND", @@ -2178,32 +1932,6 @@ "gtceu.circuit_assembler": "Circuit Assembler", "gtceu.coke_oven": "Coke Oven", "gtceu.combustion_generator": "Combustion Generator", - "gtceu.command.copy.click_to_copy": "Click to copy", - "gtceu.command.copy.copied_and_click": "copied to clipboard. Click to copy again", - "gtceu.command.copy.copied_end": "] to the clipboard", - "gtceu.command.copy.copied_start": "Copied [", - "gtceu.command.hand.electric": "Electric Info: %d / %d EU - Tier: %d; Is Battery: %s", - "gtceu.command.hand.fluid": "Fluid Info: %d / %d mB; Can Fill: %s; Can Drain: %s", - "gtceu.command.hand.fluid2": "Fluid Id:", - "gtceu.command.hand.groovy": "Consider using §6/gs hand", - "gtceu.command.hand.item_id": "Item: %s (Metadata: %d)", - "gtceu.command.hand.material": "Material Id:", - "gtceu.command.hand.meta_item": "MetaItem Id:", - "gtceu.command.hand.no_item": "You must hold something in main hand or off hand before executing this command.", - "gtceu.command.hand.not_a_player": "This command is only usable by a player.", - "gtceu.command.hand.ore_prefix": "Ore prefix:", - "gtceu.command.hand.tag_entries": "§3Tag entries:", - "gtceu.command.hand.tool_stats": "Tool Stats Class: %s", - "gtceu.command.hand.usage": "Usage: /gtceu hand", - "gtceu.command.recipecheck.begin": "Starting recipe conflict check...", - "gtceu.command.recipecheck.end": "Recipe conflict check found %d possible conflicts. Check the server log for more info", - "gtceu.command.recipecheck.end_no_conflicts": "No recipe conflicts found!", - "gtceu.command.recipecheck.usage": "Usage: /gtceu recipecheck", - "gtceu.command.usage": "Usage: /gtceu ", - "gtceu.command.worldgen.reload.failed": "Worldgen reload failed. Check console for errors.", - "gtceu.command.worldgen.reload.success": "Worldgen successfully reloaded from config.", - "gtceu.command.worldgen.reload.usage": "Usage: /gtceu worldgen reload", - "gtceu.command.worldgen.usage": "Usage: /gtceu worldgen ", "gtceu.compressor": "Compressor", "gtceu.cover.activity_detector.message_activity_inverted": "Monitoring Inverted Activity Status", "gtceu.cover.activity_detector.message_activity_normal": "Monitoring Normal Activity Status", @@ -2242,7 +1970,6 @@ "gtceu.direction.tooltip.up": "Up", "gtceu.distillation_tower": "Distillation Tower", "gtceu.distillery": "Distillery", - "gtceu.duct_pipe.transfer_rate": "§bAir transfer rate: %s", "gtceu.dummy": "Dummy", "gtceu.electric_blast_furnace": "Electric Blast Furnace", "gtceu.electric_furnace": "Electric Furnace", @@ -2251,32 +1978,7 @@ "gtceu.extractor": "Extractor", "gtceu.extruder": "Extruder", "gtceu.fermenter": "Fermenter", - "gtceu.fluid.amount": "§9Amount: %d/%d mB", - "gtceu.fluid.click_combined": "§7Click with a Fluid Container to §cempty §7or §bfill §7the tank (Shift-click for a full stack).", - "gtceu.fluid.click_to_empty": "§7Click with a Fluid Container to §cempty §7the tank (Shift-click for a full stack).", - "gtceu.fluid.click_to_fill": "§7Click with a Fluid Container to §bfill §7the tank (Shift-click for a full stack).", - "gtceu.fluid.empty": "Empty", - "gtceu.fluid.gas_generic": "%s Gas", - "gtceu.fluid.gas_vapor": "%s Vapor", - "gtceu.fluid.generic": "%s", - "gtceu.fluid.liquid_generic": "Liquid %s", - "gtceu.fluid.molten": "Molten %s", - "gtceu.fluid.plasma": "%s Plasma", - "gtceu.fluid.state_gas": "§aState: Gaseous", - "gtceu.fluid.state_liquid": "§aState: Liquid", - "gtceu.fluid.state_plasma": "§aState: Plasma", - "gtceu.fluid.temperature": "§cTemperature: %d K", - "gtceu.fluid.temperature.cryogenic": "§bCryogenic! Handle with care!", - "gtceu.fluid.type_acid.tooltip": "§6Acidic! Handle with care!", "gtceu.fluid_heater": "Fluid Heater", - "gtceu.fluid_pipe.acid_proof": "§6Can handle Acids", - "gtceu.fluid_pipe.capacity": "§9Capacity: §f%d mB", - "gtceu.fluid_pipe.channels": "§eChannels: §f%d", - "gtceu.fluid_pipe.cryo_proof": "§6Can handle Cryogenics", - "gtceu.fluid_pipe.gas_proof": "§6Can handle Gases", - "gtceu.fluid_pipe.max_temperature": "§cTemperature Limit: §f%d K", - "gtceu.fluid_pipe.not_gas_proof": "§4Gases may leak!", - "gtceu.fluid_pipe.plasma_proof": "§6Can handle all Plasmas", "gtceu.fluid_solidifier": "Fluid Solidifier", "gtceu.forge_hammer": "Forge Hammer", "gtceu.forming_press": "Forming Press", @@ -2382,21 +2084,10 @@ "gtceu.gui.toggle_view.disabled": "Toggle View (Fluids)", "gtceu.gui.toggle_view.enabled": "Toggle View (Items)", "gtceu.gui.waiting_list": "Sending Queue:", - "gtceu.hazard_trigger.any": "Any contact", - "gtceu.hazard_trigger.description": "Caused by:", - "gtceu.hazard_trigger.inhalation": "Inhalation", - "gtceu.hazard_trigger.none": "Nothing", - "gtceu.hazard_trigger.protection.description": "Protects from:", - "gtceu.hazard_trigger.skin_contact": "Skin contact", "gtceu.implosion_compressor": "Implosion Compressor", - "gtceu.io.both": "Both", - "gtceu.io.export": "Export", - "gtceu.io.import": "Import", - "gtceu.io.none": "None", "gtceu.item_filter.empty_item": "Empty (No Item)", "gtceu.item_filter.footer": "§eClick with item to override", "gtceu.item_list.item_stored": "§7Stored: %d", - "gtceu.item_pipe.priority": "§9Priority: §f%d", "gtceu.jade.cleaned_this_second": "Cleaned hazard: %s/s", "gtceu.jade.energy_stored": "%d / %d EU", "gtceu.jade.progress_computation": "%s / %s CWU", @@ -3128,25 +2819,6 @@ "gtceu.maintenance.configurable_time": "Time: %fx", "gtceu.maintenance.configurable_time.changed_description": "Maintenance problems will occur at %fx the normal rate.", "gtceu.maintenance.configurable_time.unchanged_description": "Maintenance problems will occur at normal rate. Change configuration to update.", - "gtceu.medical_condition.antidote.description": "§aAntidote §7Hold Shift to show details", - "gtceu.medical_condition.antidote.description.effect_removed": "Removes %s%% of current conditions' effects", - "gtceu.medical_condition.antidote.description.effect_removed.all": "Removes all of current conditions' effects", - "gtceu.medical_condition.antidote.description_shift": "§aCures these conditions:", - "gtceu.medical_condition.arsenicosis": "§bArsenicosis", - "gtceu.medical_condition.asbestosis": "§dAsbestosis", - "gtceu.medical_condition.berylliosis": "§5Berylliosis", - "gtceu.medical_condition.carbon_monoxide_poisoning": "§7Carbon Monoxide Poisoning", - "gtceu.medical_condition.carcinogen": "§eCarcinogenic", - "gtceu.medical_condition.chemical_burns": "§5Chemical burns", - "gtceu.medical_condition.description": "§l§cHAZARDOUS §7Hold Shift to show details", - "gtceu.medical_condition.description_shift": "§l§cHAZARDOUS:", - "gtceu.medical_condition.irritant": "§6Irritant", - "gtceu.medical_condition.methanol_poisoning": "§6Methanol Poisoning", - "gtceu.medical_condition.nausea": "§3Nauseating", - "gtceu.medical_condition.none": "§2Not Dangerous", - "gtceu.medical_condition.poison": "§2Poisonous", - "gtceu.medical_condition.silicosis": "§1Silicosis", - "gtceu.medical_condition.weak_poison": "§aWeakly poisonous", "gtceu.minimap.ore_vein.depleted": "Depleted", "gtceu.mixer": "Mixer", "gtceu.mode.both": "§dBoth (Fluid And Item)§r", @@ -3177,11 +2849,6 @@ "gtceu.multiblock.cleanroom.clean_state": "Status: §aCLEAN", "gtceu.multiblock.cleanroom.dirty_state": "Status: §4CONTAMINATED", "gtceu.multiblock.coke_oven.description": "The Coke Oven is a multiblock structure used for getting coke and creosote in the early game. It doesn't require fuel and has an internal tank of 32 buckets for creosote. Its inventory can be accessed via its Coke Oven Hatch.", - "gtceu.multiblock.computation.max": "Max CWU/t: %s", - "gtceu.multiblock.computation.non_bridging": "Non-bridging connection found", - "gtceu.multiblock.computation.non_bridging.detailed": "A Reception Hatch is linked to a machine which cannot bridge", - "gtceu.multiblock.computation.not_enough_computation": "Machine needs more computation!", - "gtceu.multiblock.computation.usage": "Using: %s", "gtceu.multiblock.cracker.description": "The Oil Cracking Unit is a multiblock structure used for turning Light and Heavy Fuel into their Cracked variants.", "gtceu.multiblock.cracking_unit.energy": "Energy Usage: %s%%", "gtceu.multiblock.data_bank.description": "The Data Bank is a multiblock structure used for sharing Assembly Line Research Data between multiple Assembly Lines. Additionally, it enables Assembly Lines to read more complex research data on Data Modules.", @@ -3190,7 +2857,6 @@ "gtceu.multiblock.distillation_tower.description": "The Distillation Tower is a multiblock structure used for distilling the various types of Oil and some of their byproducts. Each layer must have exactly one output hatch, starting from the second one. The bottom layer can output items and insert fluids in any position.", "gtceu.multiblock.distillation_tower.distilling_fluid": "Distilling %s", "gtceu.multiblock.electric_blast_furnace.description": "The Electric Blast Furnace (EBF) is a multiblock structure used for smelting alloys, cooking metals and refining ores. It is required for obtaining high-tier alloys and metals, such as aluminium, stainless steel, titanium, and naquadah alloy.", - "gtceu.multiblock.energy_consumption": "Energy Usage: %s EU/t (%s)", "gtceu.multiblock.exact_hatch_1.tooltip": "§fAccepts Exactly §6One §fEnergy Hatch.", "gtceu.multiblock.extreme_combustion_engine.description": "The Extreme Combustion Engine is a multiblock structure that acts as a Combustion Generator for IV power.", "gtceu.multiblock.fluid_rig.drilled_fluid": "Fluid: %s", @@ -3200,7 +2866,6 @@ "gtceu.multiblock.fluid_rig.vein_depletion": "Vein Size: %s", "gtceu.multiblock.fusion_reactor.energy": "EU: %d / %d", "gtceu.multiblock.fusion_reactor.heat": "Heat: %d", - "gtceu.multiblock.generation_eu": "Outputting: §a%s EU/t", "gtceu.multiblock.hpca.computation": "Providing: %s", "gtceu.multiblock.hpca.description": "The High Performance Computing Array (HPCA) is a multiblock structure used for creating Compute Work Units (CWU/t) for more complex Assembly Line Research Data. The structure has a flexible 3x3 area which can be filled in any way with HPCA components. Different components can provide different amounts of Computation, Cooling, as well as Energy Cost, Coolant Cost, and Heat Production. When used with a Bridge Component, the HPCA can connect to Network Switches for combining and routing Computation from multiple sources to one or more destinations.", "gtceu.multiblock.hpca.energy": "Using: %s / %s EU/t (%s)", @@ -3221,10 +2886,7 @@ "gtceu.multiblock.hpca.warning_structure_header": "Structure Warnings:", "gtceu.multiblock.hpca.warning_temperature": "Temperature above 50C, components may be damaged at 100C!", "gtceu.multiblock.hpca.warning_temperature_active_cool": "Fully utilizing active coolers", - "gtceu.multiblock.idling": "§6Idling.", "gtceu.multiblock.implosion_compressor.description": "The Implosion Compressor is a multiblock structure that uses explosives to turn gem dusts into their corresponding gems.", - "gtceu.multiblock.invalid_structure": "Invalid structure.", - "gtceu.multiblock.invalid_structure.tooltip": "This block is a controller of the multiblock structure. For building help, see structure template in JEI.", "gtceu.multiblock.large_boiler.description": "Large Boilers are multiblocks that generate steam from an energy source and water. Said energy source is either any Solid Fuel with a Burn Time, or a Diesel/Semi-Fluid Fuel. Can be throttled back in increments of 5%% to reduce Steam output and Fuel consumption.", "gtceu.multiblock.large_boiler.efficiency": "Efficiency: %s", "gtceu.multiblock.large_boiler.explosion_tooltip": "Will explode if provided Fuel with no Water", @@ -3258,52 +2920,20 @@ "gtceu.multiblock.large_miner.working": "Working...", "gtceu.multiblock.large_turbine.description": "Large Turbines are multiblocks that generate power from steam, gases, and plasma by having them spin the turbine's rotor. Energy output is based on rotor efficiency and current speed of turbine. Gearbox casings are used in the center of the structure.", "gtceu.multiblock.luv_fusion_reactor.description": "The Fusion Reactor MK 1 is a large multiblock structure used for fusing elements into heavier ones. It can only use LuV, ZPM, and UV Energy Hatches. For every Hatch it has, its buffer increases by 10M EU, and has a maximum of 160M.", - "gtceu.multiblock.max_energy_per_tick": "Max EU/t: §a%s (%s§r)", - "gtceu.multiblock.max_energy_per_tick_amps": "Max EU/t: %s (%sA %s)", - "gtceu.multiblock.max_energy_per_tick_hover": "The maximum EU/t available for running recipes or overclocking", - "gtceu.multiblock.max_recipe_tier": "Max Recipe Tier: %s", - "gtceu.multiblock.max_recipe_tier_hover": "The maximum tier of recipes that can be run", "gtceu.multiblock.monitor_screen.tooltip.0": "The GUI can be opened with a right-click of a screwdriver.", "gtceu.multiblock.monitor_screen.tooltip.1": "The proxy mode of Digital Interface Cover can delegate machines' capabilities and GUI. (Yes, you can connect pipes directly on the screen.)", "gtceu.multiblock.monitor_screen.tooltip.2": "The screen also supports plugins.", "gtceu.multiblock.multi_furnace.description": "The Multi Smelter is a multiblock structure used for smelting massive amounts of items at once. Different tiers of coils provide a speed boost and energy efficiency gain. 32 is the base value of items smelted per operation, and can be multiplied by using higher level coils.", "gtceu.multiblock.multi_furnace.heating_coil_discount": "Heating Coil EU Boost: %sx", "gtceu.multiblock.multi_furnace.heating_coil_level": "Heating Coil Level: %s", - "gtceu.multiblock.multiple_recipemaps.header": "Machine Mode:", - "gtceu.multiblock.multiple_recipemaps.switch_message": "The machine must be off to switch modes!", - "gtceu.multiblock.multiple_recipemaps.tooltip": "Screwdriver the controller to change which machine mode to use.", - "gtceu.multiblock.multiple_recipemaps_recipes.tooltip": "Machine Modes: §e%s§r", "gtceu.multiblock.network_switch.description": "The Network Switch is a multiblock structure used for distributing Computation from many sources to many destinations. It can accept any number of Computation Data Reception or Transmission Hatches. It is necessary for Research Data which requires much higher Computation, as the Research Station can only accept one Computation Data Reception Hatch. HPCAs must have a Bridge Component for the Network Switch to be able to access their Computation.", - "gtceu.multiblock.not_enough_energy": "WARNING: Machine needs more energy.", - "gtceu.multiblock.not_enough_energy_output": "WARNING: Energy Dynamo Tier Too Low!", "gtceu.multiblock.ore_rig.drilled_ore_entry": " - %s", "gtceu.multiblock.ore_rig.drilled_ores_list": "Ores:", "gtceu.multiblock.ore_rig.ore_amount": "Drilling Rate: %s", - "gtceu.multiblock.output_line.0": "%s x §e%s§r (%ss/ea)", - "gtceu.multiblock.output_line.1": "%s x §e%s§r (%s/s)", - "gtceu.multiblock.output_line.2": "%s ≈ §e%s§r (%ss/ea)", - "gtceu.multiblock.output_line.3": "%s ≈ §e%s§r (%s/s)", "gtceu.multiblock.page_switcher.io.both": "§5Combined Inputs + Outputs", "gtceu.multiblock.page_switcher.io.export": "§4Outputs", "gtceu.multiblock.page_switcher.io.import": "§2Inputs", - "gtceu.multiblock.parallel": "Performing up to %d Recipes in Parallel", - "gtceu.multiblock.parallel.exact": "Performing %d Recipes in Parallel", "gtceu.multiblock.parallelizable.tooltip": "Can parallelize with Parallel Control Hatches.", - "gtceu.multiblock.pattern.clear_amount_1": "§6Must have a clear 1x1x1 space in front§r", - "gtceu.multiblock.pattern.clear_amount_3": "§6Must have a clear 3x3x1 space in front§r", - "gtceu.multiblock.pattern.error": "Expected components (%s) at (%s).", - "gtceu.multiblock.pattern.error.batteries": "§cAll batteries must be the same§r", - "gtceu.multiblock.pattern.error.coils": "§cAll heating coils must be the same§r", - "gtceu.multiblock.pattern.error.filters": "§cAll filters must be the same§r", - "gtceu.multiblock.pattern.error.limited.0": "§cMaximum: %d§r", - "gtceu.multiblock.pattern.error.limited.1": "§cMinimum: %d§r", - "gtceu.multiblock.pattern.error.limited.2": "§cMaximum: %d per layer§r", - "gtceu.multiblock.pattern.error.limited.3": "§cMinimum: %d per layer§r", - "gtceu.multiblock.pattern.error.limited_exact": "§cExactly: %d§r", - "gtceu.multiblock.pattern.error.limited_within": "§cBetween %d and %d§r", - "gtceu.multiblock.pattern.location_end": "§cVery End§r", - "gtceu.multiblock.pattern.replaceable_air": "Replaceable by Air", - "gtceu.multiblock.pattern.single": "§6Only this block can be used§r", "gtceu.multiblock.power_substation.average_in": "§7Avg. Input: %s §7EU/t", "gtceu.multiblock.power_substation.average_in_hover": "The average inserted EU into the Power Substation's internal energy bank", "gtceu.multiblock.power_substation.average_out": "§7Avg. Output: %s §7EU/t", @@ -3320,9 +2950,6 @@ "gtceu.multiblock.power_substation.time_to_fill": "§7Time to fill: %s", "gtceu.multiblock.power_substation.time_years": "%s Years", "gtceu.multiblock.power_substation.under_one_hour_left": "Less than 1 hour until fully drained!", - "gtceu.multiblock.preview.rotate": "Click and drag to rotate", - "gtceu.multiblock.preview.select": "Right-click to check candidates", - "gtceu.multiblock.preview.zoom": "Use mousewheel or right-click + drag to zoom", "gtceu.multiblock.primitive_blast_furnace.bronze.description": "The Primitive Blast Furnace (PBF) is a multiblock structure used for cooking steel in the early game. Although not very fast, it will provide you with steel for your first setups.", "gtceu.multiblock.primitive_water_pump.description": "The Primitive Water Pump is a pre-Steam Era multiblock that collects water once per second, depending on the Biome it is in. It can use a Pump, ULV, or LV Output Hatch, increasing the amount of water per tier. Follows the formula: Biome Coefficient * Hatch Multiplier.", "gtceu.multiblock.primitive_water_pump.extra1.0": "Biome Coefficient:", @@ -3340,14 +2967,10 @@ "gtceu.multiblock.primitive_water_pump.extra2.3": " LV Output Hatch: 4x", "gtceu.multiblock.primitive_water_pump.extra2.4": "", "gtceu.multiblock.primitive_water_pump.extra2.5": "While raining in the Pump's Biome, the total water production will be increased by 50%%.", - "gtceu.multiblock.progress": "Progress: %ss / %ss (%s%%)", - "gtceu.multiblock.progress_percent": "Progress: %s%%", "gtceu.multiblock.pyrolyse_oven.description": "The Pyrolyse Oven is a multiblock structure used for turning Logs into Charcoal and Creosote Oil, or Ash and Heavy Oil.", "gtceu.multiblock.pyrolyse_oven.speed": "Processing Speed: %s%%", "gtceu.multiblock.require_steam_parts": "Requires Steam Hatches and Buses!", "gtceu.multiblock.research_station.description": "The Research Station is a multiblock structure used for researching much more complex Assembly Line Research Data. Any Research requiring a Data Orb or Data Module must be scanned in the Research Station. Requires Compute Work Units (CWU/t) to research recipes, which is supplied by High Performance Computing Arrays (HPCAs).", - "gtceu.multiblock.research_station.researching": "§6Researching.", - "gtceu.multiblock.running": "Running perfectly.", "gtceu.multiblock.steam.duration_modifier": "Takes §f1.5x §7base duration to process, not affected by number of items.", "gtceu.multiblock.steam.low_steam": "Not enough Steam to run!", "gtceu.multiblock.steam.steam_stored": "Steam: %s / %s mb", @@ -3363,27 +2986,8 @@ "gtceu.multiblock.turbine.obstructed": "Turbine Face Obstructed", "gtceu.multiblock.turbine.rotor_durability": "Rotor Durability: %s%%", "gtceu.multiblock.turbine.rotor_speed": "Rotor Speed: %s/%s RPM", - "gtceu.multiblock.universal.distinct": "Distinct Buses:", - "gtceu.multiblock.universal.distinct.info": "If enabled, each Item Input Bus will be treated as fully distinct from each other for recipe lookup. Useful for things like Programmed Circuits, Extruder Shapes, etc.", - "gtceu.multiblock.universal.distinct.no": "No", - "gtceu.multiblock.universal.distinct.yes": "Yes", - "gtceu.multiblock.universal.has_problems": "Has Maintenance Problems!", - "gtceu.multiblock.universal.has_problems_header": "Fix the following issues in a Maintenance Hatch:", - "gtceu.multiblock.universal.muffler_obstructed": "Muffler Hatch is Obstructed!", - "gtceu.multiblock.universal.muffler_obstructed.tooltip": "Muffler Hatch must have a block of airspace in front of it.", - "gtceu.multiblock.universal.no_problems": "No Maintenance Problems!", - "gtceu.multiblock.universal.problem.crowbar": "§7That doesn't belong there. (§aCrowbar§7)", - "gtceu.multiblock.universal.problem.hard_hammer": "§7Plating is dented. (§aHard Hammer§7)", - "gtceu.multiblock.universal.problem.screwdriver": "§7Screws are loose. (§aScrewdriver§7)", - "gtceu.multiblock.universal.problem.soft_mallet": "§7Something is stuck. (§aSoft Mallet§7)", - "gtceu.multiblock.universal.problem.wire_cutter": "§7Wires burned out. (§aWire Cutter§7)", - "gtceu.multiblock.universal.problem.wrench": "§7Pipe is loose. (§aWrench§7)", - "gtceu.multiblock.universal.rotor_obstructed": "Rotor is Obstructed!", "gtceu.multiblock.uv_fusion_reactor.description": "The Fusion Reactor MK 3 is a large multiblock structure used for fusing elements into heavier ones. It can only use UV Energy Hatches. For every Hatch it has, its buffer increases by 40M EU, and has a maximum of 640M.", "gtceu.multiblock.vacuum_freezer.description": "The Vacuum Freezer is a multiblock structure mainly used for freezing Hot Ingots into regular Ingots. However, it can also freeze other substances, such as Water.", - "gtceu.multiblock.validation_failed": "Invalid amount of inputs/outputs.", - "gtceu.multiblock.waiting": "WARNING: Machine is waiting.", - "gtceu.multiblock.work_paused": "Work Paused.", "gtceu.multiblock.zpm_fusion_reactor.description": "The Fusion Reactor MK 2 is a large multiblock structure used for fusing elements into heavier ones. It can only use ZPM and UV Energy Hatches. For every Hatch it has, its buffer increases by 20M EU, and has a maximum of 320M.", "gtceu.oc.tooltip.0": "Min: %s", "gtceu.oc.tooltip.1": "Left click to increase the OC", @@ -3401,7 +3005,6 @@ "gtceu.polarizer": "Polarizer", "gtceu.primitive_blast_furnace": "Primitive Blast Furnace", "gtceu.pyrolyse_oven": "Pyrolyse Oven", - "gtceu.recipe.amperage": "Amperage: %s", "gtceu.recipe.category.arc_furnace_recycling": "Plasma Scrapping", "gtceu.recipe.category.chem_dyes": "Chemical Dyeing", "gtceu.recipe.category.extractor_recycling": "Scrap Remelting", @@ -3410,27 +3013,6 @@ "gtceu.recipe.category.ore_bathing": "Ore Treating", "gtceu.recipe.category.ore_crushing": "Ore Grinding", "gtceu.recipe.category.ore_forging": "Ore Crushing", - "gtceu.recipe.chance": "Chance: %s +%s/tier", - "gtceu.recipe.cleanroom": "Requires %s", - "gtceu.recipe.cleanroom.display_name": "Cleanroom", - "gtceu.recipe.cleanroom_sterile.display_name": "Sterile Cleanroom", - "gtceu.recipe.coil.tier": "Coil: %s", - "gtceu.recipe.computation_per_tick": "Min. Computation: %s CWU/t", - "gtceu.recipe.dimensions": "Dimensions: %s", - "gtceu.recipe.duration": "Duration: %s secs", - "gtceu.recipe.environmental_hazard": "§cArea must have %s", - "gtceu.recipe.environmental_hazard.reverse": "§cArea must be free of %s", - "gtceu.recipe.eu": "Usage: %s EU/t", - "gtceu.recipe.eu_inverted": "Generation: %s EU/t", - "gtceu.recipe.eu_to_start": "EU To Start: %sEU%s", - "gtceu.recipe.explosive": "Explosive: %s", - "gtceu.recipe.max_eu": "Max. EU: %s EU", - "gtceu.recipe.not_consumed": "Does not get consumed in the process", - "gtceu.recipe.research": "Requires Research", - "gtceu.recipe.scan_for_research": "Scan for Assembly Line", - "gtceu.recipe.temperature": "Temp: %sK", - "gtceu.recipe.total": "Total: %s EU", - "gtceu.recipe.total_computation": "Computation: %s CWU", "gtceu.recipe_logic.condition_fails": "Condition Fails", "gtceu.recipe_logic.insufficient_fuel": "Insufficient Fuel", "gtceu.recipe_logic.insufficient_in": "Insufficient Inputs", @@ -3450,94 +3032,13 @@ "gtceu.sifter": "Sifter", "gtceu.steam_boiler": "Steam Boiler", "gtceu.steam_turbine": "Steam Turbine", - "gtceu.subtitle.arc": "Arcs buzzing", - "gtceu.subtitle.assembler": "Assembler constructing", - "gtceu.subtitle.bath": "Bath fizzing", - "gtceu.subtitle.boiler": "Boiler heating", - "gtceu.subtitle.centrifuge": "Centrifuge spinning", - "gtceu.subtitle.chainsaw": "Chainsaw revving", - "gtceu.subtitle.chemical": "Chemical bubbling", - "gtceu.subtitle.combustion": "Combusting", - "gtceu.subtitle.compressor": "Compressor squeezing", - "gtceu.subtitle.computation": "Computer beeps", - "gtceu.subtitle.cooling": "Freezer humming", - "gtceu.subtitle.cut": "Cutter whirring", - "gtceu.subtitle.drill": "Drilling", - "gtceu.subtitle.electrolyzer": "Electrolyzer sparking", - "gtceu.subtitle.file": "File rasping", - "gtceu.subtitle.fire": "Fire crackling", - "gtceu.subtitle.forge_hammer": "Forge Hammer thumping", - "gtceu.subtitle.furnace": "Furnace heating", - "gtceu.subtitle.jet_engine": "Jet roaring", - "gtceu.subtitle.macerator": "Macerator crushing", - "gtceu.subtitle.metal_pipe": "Destruction_Metal_Pole_L_Wave_2_0_0.wav", - "gtceu.subtitle.miner": "Miner excavating", - "gtceu.subtitle.mixer": "Mixer sloshing", - "gtceu.subtitle.mortar": "Mortar crushing", - "gtceu.subtitle.motor": "Motor humming", - "gtceu.subtitle.plunger": "Plunger popping", - "gtceu.subtitle.portable_scanner": "Scanning", - "gtceu.subtitle.portal_closing": "Portal closes", - "gtceu.subtitle.portal_opening": "Portal opens", - "gtceu.subtitle.replicator": "Replicator copying", - "gtceu.subtitle.saw": "Sawing", - "gtceu.subtitle.science": "s c i e n c e", - "gtceu.subtitle.screwdriver": "Screwing", - "gtceu.subtitle.soft_hammer": "Soft tap", - "gtceu.subtitle.spray_can": "Spraying", - "gtceu.subtitle.sus": "Sus...", - "gtceu.subtitle.turbine": "Turbine whizzing", - "gtceu.subtitle.wirecutter": "Wire snipped", - "gtceu.subtitle.wrench": "Wrench rattling", "gtceu.thermal_centrifuge": "Thermal Centrifuge", - "gtceu.tool.class.axe": "Axe", - "gtceu.tool.class.butchery_knife": "Butchery Knife", - "gtceu.tool.class.crowbar": "Crowbar", - "gtceu.tool.class.drill": "Drill", - "gtceu.tool.class.file": "File", - "gtceu.tool.class.hammer": "Hammer", - "gtceu.tool.class.hoe": "Hoe", - "gtceu.tool.class.knife": "Knife", - "gtceu.tool.class.mallet": "Soft Mallet", - "gtceu.tool.class.mining_hammer": "Mining Hammer", - "gtceu.tool.class.mortar": "Mortar", - "gtceu.tool.class.pickaxe": "Pickaxe", - "gtceu.tool.class.plunger": "Plunger", - "gtceu.tool.class.rolling_pin": "Rolling Pin", - "gtceu.tool.class.saw": "Saw", - "gtceu.tool.class.screwdriver": "Screwdriver", - "gtceu.tool.class.scythe": "Scythe", - "gtceu.tool.class.shears": "Shears", - "gtceu.tool.class.shovel": "Shovel", - "gtceu.tool.class.spade": "Spade", - "gtceu.tool.class.sword": "Sword", - "gtceu.tool.class.wire_cutter": "Wire Cutter", - "gtceu.tool.class.wrench": "Wrench", - "gtceu.tool_action.crowbar": "§8Use Crowbar to remove Covers", - "gtceu.tool_action.hammer": "§8Use Hard Hammer to muffle Sounds", - "gtceu.tool_action.screwdriver.access_covers": "§8Use Screwdriver to access Covers", - "gtceu.tool_action.screwdriver.auto_collapse": "§8Use Screwdriver to toggle Item collapsing", - "gtceu.tool_action.screwdriver.auto_output": "§8Use Screwdriver to toggle Auto-Output", - "gtceu.tool_action.screwdriver.auto_output_covers": "§8Use Screwdriver to Allow Input from Output Side or access Covers", - "gtceu.tool_action.screwdriver.toggle_mode": "§8Use Screwdriver to toggle Modes", - "gtceu.tool_action.screwdriver.toggle_mode_covers": "§8Use Screwdriver to toggle Modes or access Covers", - "gtceu.tool_action.show_tooltips": "Hold SHIFT to show Tool Info", - "gtceu.tool_action.soft_mallet.reset": "§8Use Soft Mallet to toggle Working", - "gtceu.tool_action.soft_mallet.toggle_mode": "§8Use Soft Mallet to toggle Modes", - "gtceu.tool_action.tape": "§8Use Tape to fix Maintenance Problems", - "gtceu.tool_action.wire_cutter.connect": "§8Use Wire Cutters to set Connections", - "gtceu.tool_action.wrench.connect": "§8Use Wrench to set Connections, sneak to block Connections", - "gtceu.tool_action.wrench.set_facing": "§8Use Wrench to set Facing", - "gtceu.tooltip.fluid_pipe_hold_shift": "§7Hold SHIFT to show Fluid Containment Info", - "gtceu.tooltip.hold_ctrl": "§7Hold CTRL for more info", - "gtceu.tooltip.hold_shift": "§7Hold SHIFT for more info", "gtceu.tooltip.potion.each": "%s %s §7for§r %s §7ticks with a§r %s%% §7chance of happening§r", "gtceu.tooltip.potion.header": "§6Contains effects:", "gtceu.tooltip.proxy_bind": "§fBinding to a Pattern Buffer at %s %s %s", "gtceu.tooltip.status.trinary.false": "False", "gtceu.tooltip.status.trinary.true": "True", "gtceu.tooltip.status.trinary.unknown": "Unknown", - "gtceu.tooltip.tool_fluid_hold_shift": "§7Hold SHIFT to show Fluid Containment and Tool Info", "gtceu.top.allow_output_input": "Allow Input", "gtceu.top.auto_output": "Auto Output", "gtceu.top.buffer_bound_pos": "Bound To - X: %s, Y: %s, Z: %s", @@ -3641,6 +3142,30 @@ "gui.gtceu.share_tank.title": "Shared Tank Inventory", "gui.widget.incrementButton.default_tooltip": "Hold Shift, Ctrl or both to change the amount", "gui.widget.recipeProgressWidget.default_tooltip": "Show Recipes", + "item.clipboard.tooltip": "Can be written on (without any writing Instrument). Right-click on Wall to place, and Shift-Right-Click to remove", + "item.cover.digital.mode.energy.disabled": "Click to enable Energy Mode", + "item.cover.digital.mode.energy.enabled": "Energy Mode enabled", + "item.cover.digital.mode.fluid.disabled": "Click to enable Fluid Mode", + "item.cover.digital.mode.fluid.enabled": "Fluid Mode enabled", + "item.cover.digital.mode.item.disabled": "Click to enable Item Mode", + "item.cover.digital.mode.item.enabled": "Item Mode enabled", + "item.cover.digital.mode.machine.disabled": "Click to enable Machine Mode", + "item.cover.digital.mode.machine.enabled": "Machine Mode enabled", + "item.cover.digital.mode.proxy.disabled": "Click to enable Proxy Mode", + "item.cover.digital.mode.proxy.enabled": "Proxy Mode enabled", + "item.cover.digital.tooltip": "Connects machines over §fPower Cables§7 to the §fCentral Monitor§7 as §fCover§7.", + "item.cover.digital.wireless.tooltip.0": "§fWirelessly§7 connects machines to the §fCentral Monitor§7 as §fCover§7.", + "item.cover.digital.wireless.tooltip.1": "§fRight Click§7 on the §fCentral Monitor§7 to remotely bind to it.", + "item.cover.digital.wireless.tooltip.2": "§fSneak Right Click§7 to remove the current binding.", + "item.cover.digital.wireless.tooltip.3": "§aBinding: §f%s", + "item.crushed.tooltip.purify": "Right click a Cauldron to get Purified Ore", + "item.dust.tooltip.purify": "Right click a Cauldron to get clean Dust", + "item.electric.discharge_mode.disabled": "§eDischarge Mode Disabled", + "item.electric.discharge_mode.enabled": "§eDischarge Mode Enabled", + "item.electric.discharge_mode.tooltip": "Use while sneaking to toggle discharge mode", + "item.generic.electric_item.stored": "%d/%d EU (%s)", + "item.generic.electric_item.tooltip": "%d/%d EU - Tier %s", + "item.generic.fluid_container.tooltip": "%d/%dL %s", "item.glass_lens": "Glass Lens (White)", "item.gtceu.activity_detector_cover": "Activity Detector", "item.gtceu.activity_detector_cover.tooltip": "§7Gives out §fActivity Status§7 as Redstone as §fCover§7.", @@ -4421,97 +3946,45 @@ "item.gtceu.tool.aoe.columns": "Columns", "item.gtceu.tool.aoe.layers": "Layers", "item.gtceu.tool.aoe.rows": "Rows", - "item.gtceu.tool.axe": "%s Axe", - "item.gtceu.tool.behavior.aoe_mining": "§5Area-of-Effect: §f%sx%sx%s", - "item.gtceu.tool.behavior.block_rotation": "§2Mechanic: §fRotates Blocks", - "item.gtceu.tool.behavior.crop_harvesting": "§aHarvester: §fHarvests Crops", - "item.gtceu.tool.behavior.damage_boost": "§4Damage Boost: §fExtra damage against %s", - "item.gtceu.tool.behavior.grass_path": "§eLandscaper: §fCreates Grass Paths", - "item.gtceu.tool.behavior.ground_tilling": "§eFarmer: §fTills Ground", - "item.gtceu.tool.behavior.plunger": "§9Plumber: §fDrains Fluids", - "item.gtceu.tool.behavior.rail_rotation": "§eRailroad Engineer: §fRotates Rails", - "item.gtceu.tool.behavior.relocate_mining": "§2Magnetic: §fRelocates Mined Blocks and Mob Drops", - "item.gtceu.tool.behavior.remove_wax": "§6Cleaner: §fRemoves Wax", - "item.gtceu.tool.behavior.scrape": "§bPolisher: §fRemoves Oxidation", - "item.gtceu.tool.behavior.shield_disable": "§cBrute: §fDisables Shields", - "item.gtceu.tool.behavior.silk_ice": "§bIce Cutter: §fSilk Harvests Ice", - "item.gtceu.tool.behavior.strip_log": "§5Artisan: §fStrips Logs", - "item.gtceu.tool.behavior.torch_place": "§eSpelunker: §fPlaces Torches on Right-Click", - "item.gtceu.tool.behavior.tree_felling": "§4Lumberjack: §fTree Felling", - "item.gtceu.tool.butchery_knife": "%s Butchery Knife", - "item.gtceu.tool.butchery_knife.tooltip": "§8Has a slow Attack Rate", - "item.gtceu.tool.buzzsaw": "%s Buzzsaw (LV)", - "item.gtceu.tool.buzzsaw.tooltip": "§8Not suitable for harvesting Blocks", - "item.gtceu.tool.crowbar": "%s Crowbar", - "item.gtceu.tool.crowbar.tooltip": "§8Dismounts Covers", - "item.gtceu.tool.ev_drill": "%s Drill (EV)", - "item.gtceu.tool.file": "%s File", - "item.gtceu.tool.hammer": "%s Hammer", - "item.gtceu.tool.hammer.tooltip": "§8Crushes Blocks when harvesting them", - "item.gtceu.tool.harvest_level.0": "§8Wood", - "item.gtceu.tool.harvest_level.1": "§7Stone", - "item.gtceu.tool.harvest_level.2": "§aIron", - "item.gtceu.tool.harvest_level.3": "§bDiamond", - "item.gtceu.tool.harvest_level.4": "§dNetherite", - "item.gtceu.tool.harvest_level.5": "§9Duranium", - "item.gtceu.tool.harvest_level.6": "§cNeutronium", - "item.gtceu.tool.hoe": "%s Hoe", - "item.gtceu.tool.hv_chainsaw": "%s Chainsaw (HV)", - "item.gtceu.tool.hv_drill": "%s Drill (HV)", - "item.gtceu.tool.hv_wirecutter": "%s Wire Cutter (HV)", - "item.gtceu.tool.hv_wrench": "%s Wrench (HV)", - "item.gtceu.tool.hv_wrench.tooltip": "§8Hold left click to dismantle Machines", - "item.gtceu.tool.iv_drill": "%s Drill (IV)", - "item.gtceu.tool.iv_wirecutter": "%s Wire Cutter (IV)", - "item.gtceu.tool.iv_wrench": "%s Wrench (IV)", - "item.gtceu.tool.iv_wrench.tooltip": "§8Hold left click to dismantle Machines", - "item.gtceu.tool.knife": "%s Knife", + "item.gtceu.tool.axe": "Axe", + "item.gtceu.tool.butchery_knife": "Butchery Knife", + "item.gtceu.tool.buzzsaw": "Buzzsaw", + "item.gtceu.tool.crowbar": "Crowbar", + "item.gtceu.tool.ev_drill": "Ev Drill", + "item.gtceu.tool.file": "File", + "item.gtceu.tool.hammer": "Hammer", + "item.gtceu.tool.hoe": "Hoe", + "item.gtceu.tool.hv_drill": "Hv Drill", + "item.gtceu.tool.hv_wirecutter": "Hv Wirecutter", + "item.gtceu.tool.hv_wrench": "Hv Wrench", + "item.gtceu.tool.iv_drill": "Iv Drill", + "item.gtceu.tool.iv_wirecutter": "Iv Wirecutter", + "item.gtceu.tool.iv_wrench": "Iv Wrench", + "item.gtceu.tool.knife": "Knife", "item.gtceu.tool.lighter.platinum.tooltip": "§7A known Prank Master is engraved on it", - "item.gtceu.tool.lv_chainsaw": "%s Chainsaw (LV)", - "item.gtceu.tool.lv_drill": "%s Drill (LV)", - "item.gtceu.tool.lv_screwdriver": "%s Screwdriver (LV)", - "item.gtceu.tool.lv_screwdriver.tooltip": "§8Adjusts Covers and Machines", - "item.gtceu.tool.lv_wirecutter": "%s Wire Cutter (LV)", - "item.gtceu.tool.lv_wrench": "%s Wrench (LV)", - "item.gtceu.tool.lv_wrench.tooltip": "§8Hold left click to dismantle Machines", - "item.gtceu.tool.mallet": "%s Soft Mallet", - "item.gtceu.tool.mallet.tooltip.0": "§8Sneak to Pause Machine After Current Recipe.", - "item.gtceu.tool.mallet.tooltip.1": "§8Stops/Starts Machines", + "item.gtceu.tool.lv_chainsaw": "Lv Chainsaw", + "item.gtceu.tool.lv_drill": "Lv Drill", + "item.gtceu.tool.lv_screwdriver": "Lv Screwdriver", + "item.gtceu.tool.lv_wirecutter": "Lv Wirecutter", + "item.gtceu.tool.lv_wrench": "Lv Wrench", + "item.gtceu.tool.mallet": "Mallet", "item.gtceu.tool.matchbox.tooltip": "§7This is not a Car", - "item.gtceu.tool.mining_hammer": "%s Mining Hammer", - "item.gtceu.tool.mining_hammer.tooltip": "§8Mines a large area at once (unless you're crouching)", - "item.gtceu.tool.mortar": "%s Mortar", - "item.gtceu.tool.mv_chainsaw": "%s Chainsaw (MV)", - "item.gtceu.tool.mv_drill": "%s Drill (MV)", - "item.gtceu.tool.pickaxe": "%s Pickaxe", - "item.gtceu.tool.plunger": "%s Plunger", - "item.gtceu.tool.plunger.tooltip": "§8Removes Fluids from Machines", + "item.gtceu.tool.mining_hammer": "Mining Hammer", + "item.gtceu.tool.mortar": "Mortar", + "item.gtceu.tool.mv_drill": "Mv Drill", + "item.gtceu.tool.pickaxe": "Pickaxe", + "item.gtceu.tool.plunger": "Plunger", "item.gtceu.tool.replace_tool_head": "Craft with a new Tool Head to replace it", - "item.gtceu.tool.rolling_pin": "%s Rolling Pin", - "item.gtceu.tool.saw": "%s Saw", - "item.gtceu.tool.screwdriver": "%s Screwdriver", - "item.gtceu.tool.screwdriver.tooltip": "§8Adjusts Covers and Machines", - "item.gtceu.tool.scythe": "%s Scythe", - "item.gtceu.tool.scythe.tooltip": "§8Because a Scythe doesn't make Sense", - "item.gtceu.tool.shears": "%s Shears", - "item.gtceu.tool.shovel": "%s Shovel", - "item.gtceu.tool.spade": "%s Spade", - "item.gtceu.tool.spade.tooltip": "§8Mines a large area at once (unless you're crouching)", - "item.gtceu.tool.sword": "%s Sword", - "item.gtceu.tool.tooltip.attack_damage": "%s §cAttack Damage", - "item.gtceu.tool.tooltip.attack_speed": "%s §9Attack Speed", - "item.gtceu.tool.tooltip.crafting_uses": "%s §aCrafting Uses", - "item.gtceu.tool.tooltip.general_uses": "%s §bDurability", - "item.gtceu.tool.tooltip.harvest_level": "§eHarvest Level %s", - "item.gtceu.tool.tooltip.harvest_level_extra": "§eHarvest Level %s §f(%s§f)", - "item.gtceu.tool.tooltip.max_uses": "%s §eTotal Durability", - "item.gtceu.tool.tooltip.mining_speed": "%s §dMining Speed", - "item.gtceu.tool.tooltip.repair_info": "§8Hold SHIFT to show Repair Info", - "item.gtceu.tool.tooltip.repair_material": "§8Repair with: §f§a%s", + "item.gtceu.tool.saw": "Saw", + "item.gtceu.tool.screwdriver": "Screwdriver", + "item.gtceu.tool.scythe": "Scythe", + "item.gtceu.tool.shears": "Shears", + "item.gtceu.tool.shovel": "Shovel", + "item.gtceu.tool.spade": "Spade", + "item.gtceu.tool.sword": "Sword", "item.gtceu.tool.usable_as": "§8Usable as: §f%s", - "item.gtceu.tool.wire_cutter": "%s Wire Cutter", - "item.gtceu.tool.wrench": "%s Wrench", - "item.gtceu.tool.wrench.tooltip": "§8Hold left click to dismantle Machines", + "item.gtceu.tool.wire_cutter": "Wire Cutter", + "item.gtceu.tool.wrench": "Wrench", "item.gtceu.transistor": "Transistor", "item.gtceu.transistor.tooltip": "§7Basic Electronic Component", "item.gtceu.treated_wood_boat": "Treated Wood Boat", @@ -4638,9 +4111,21 @@ "item.gtceu.zpm_solar_panel": "Zero Point Module Solar Panel", "item.gtceu.zpm_voltage_coil": "Zero Point Module Voltage Coil", "item.gtceu.zpm_voltage_coil.tooltip": "Super Coil", + "item.int_circuit.configuration": "Configuration: %d", "item.invalid.name": "Invalid item", + "item.liquid_fuel_jetpack.tooltip": "Uses Combustion Generator Fuels for Thrust", + "item.machine_configuration.mode": "§aConfiguration Mode:§r %s", "item.netherrack_nether_quartz": "Nether Quartz Ore", - "item.toggle.advanced.info.tooltip": "§8", + "item.plugin.proxy.tooltips.1": "(Please adjust to proxy mode in the screen)", + "item.plugin.tooltips.1": "Plugins can be added to the screen for more functionality.", + "item.record.sus.tooltip": "§7Leonz - Among Us Drip", + "item.terminal.tooltip": "Sharp tools make good work", + "item.terminal.tooltip.creative": "§bCreative Mode", + "item.terminal.tooltip.hardware": "§aHardware: %d", + "item.tool.tooltip.durability": "§fDurability: §a%d / %d", + "item.tool.tooltip.primary_material": "§fMaterial: §e%s", + "item.tool.tooltip.rotor.efficiency": "Turbine Efficiency: §9%d%%", + "item.tool.tooltip.rotor.power": "Turbine Power: §9%d%%", "itemGroup.gtceu.decoration": "GregTechCEu Decoration Blocks", "itemGroup.gtceu.item": "GregTechCEu Items", "itemGroup.gtceu.machine": "GregTechCEu Machines", @@ -4785,7 +4270,7 @@ "material.gtceu.collagen": "Collagen", "material.gtceu.concrete": "Concrete", "material.gtceu.construction_foam": "Construction Foam", - "material.gtceu.cooperite": "Sheldonite", + "material.gtceu.cooperite": "Cooperite", "material.gtceu.copernicium": "Copernicium", "material.gtceu.copper": "Copper", "material.gtceu.cracked_bauxite_slurry": "Cracked Bauxite Slurry", @@ -4869,7 +4354,7 @@ "material.gtceu.formamide": "Formamide", "material.gtceu.formic_acid": "Formic Acid", "material.gtceu.francium": "Francium", - "material.gtceu.fullers_earth": "Fuller's Earth", + "material.gtceu.fullers_earth": "Fullers Earth", "material.gtceu.gadolinium": "Gadolinium", "material.gtceu.galena": "Galena", "material.gtceu.gallium": "Gallium", @@ -4904,7 +4389,7 @@ "material.gtceu.gypsum": "Gypsum", "material.gtceu.hafnium": "Hafnium", "material.gtceu.hassium": "Hassium", - "material.gtceu.hastelloy_c_276": "Hastelloy C-276", + "material.gtceu.hastelloy_c_276": "Hastelloy C 276", "material.gtceu.hastelloy_x": "Hastelloy X", "material.gtceu.heavy_fuel": "Heavy Fuel", "material.gtceu.helium": "Helium", @@ -4912,17 +4397,17 @@ "material.gtceu.hematite": "Hematite", "material.gtceu.high_octane_gasoline": "High Octane Gasoline", "material.gtceu.holmium": "Holmium", - "material.gtceu.hsla_steel": "HSLA Steel", - "material.gtceu.hsse": "HSS-E", - "material.gtceu.hssg": "HSS-G", - "material.gtceu.hsss": "HSS-S", - "material.gtceu.hydro_cracked_butadiene": "Hydro-Cracked Butadiene", - "material.gtceu.hydro_cracked_butane": "Hydro-Cracked Butane", - "material.gtceu.hydro_cracked_butene": "Hydro-Cracked Butene", - "material.gtceu.hydro_cracked_ethane": "Hydro-Cracked Ethane", - "material.gtceu.hydro_cracked_ethylene": "Hydro-Cracked Ethylene", - "material.gtceu.hydro_cracked_propane": "Hydro-Cracked Propane", - "material.gtceu.hydro_cracked_propene": "Hydro-Cracked Propene", + "material.gtceu.hsla_steel": "Hsla Steel", + "material.gtceu.hsse": "Hsse", + "material.gtceu.hssg": "Hssg", + "material.gtceu.hsss": "Hsss", + "material.gtceu.hydro_cracked_butadiene": "Hydro Cracked Butadiene", + "material.gtceu.hydro_cracked_butane": "Hydro Cracked Butane", + "material.gtceu.hydro_cracked_butene": "Hydro Cracked Butene", + "material.gtceu.hydro_cracked_ethane": "Hydro Cracked Ethane", + "material.gtceu.hydro_cracked_ethylene": "Hydro Cracked Ethylene", + "material.gtceu.hydro_cracked_propane": "Hydro Cracked Propane", + "material.gtceu.hydro_cracked_propene": "Hydro Cracked Propene", "material.gtceu.hydrochloric_acid": "Hydrochloric Acid", "material.gtceu.hydrofluoric_acid": "Hydrofluoric Acid", "material.gtceu.hydrogen": "Hydrogen", @@ -4935,7 +4420,7 @@ "material.gtceu.ilmenite_slag": "Ilmenite Slag", "material.gtceu.impure_enriched_naquadah_solution": "Impure Enriched Naquadah Solution", "material.gtceu.impure_naquadria_solution": "Impure Naquadria Solution", - "material.gtceu.incoloy_ma_956": "Incoloy MA-956", + "material.gtceu.incoloy_ma_956": "Incoloy Ma 956", "material.gtceu.indium": "Indium", "material.gtceu.indium_concentrate": "Indium Concentrate", "material.gtceu.indium_gallium_phosphide": "Indium Gallium Phosphide", @@ -4948,8 +4433,8 @@ "material.gtceu.iridium_chloride": "Iridium Chloride", "material.gtceu.iridium_metal_residue": "Iridium Metal Residue", "material.gtceu.iron": "Iron", - "material.gtceu.iron_ii_chloride": "Iron II Chloride", - "material.gtceu.iron_iii_chloride": "Iron III Chloride", + "material.gtceu.iron_ii_chloride": "Iron Ii Chloride", + "material.gtceu.iron_iii_chloride": "Iron Iii Chloride", "material.gtceu.isoprene": "Isoprene", "material.gtceu.kanthal": "Kanthal", "material.gtceu.krypton": "Krypton", @@ -4966,14 +4451,14 @@ "material.gtceu.light_blue_dye": "Light Blue Dye", "material.gtceu.light_fuel": "Light Fuel", "material.gtceu.light_gray_dye": "Light Gray Dye", - "material.gtceu.lightly_hydro_cracked_gas": "Lightly Hydro-Cracked Gas", - "material.gtceu.lightly_hydro_cracked_heavy_fuel": "Lightly Hydro-Cracked Heavy Fuel", - "material.gtceu.lightly_hydro_cracked_light_fuel": "Lightly Hydro-Cracked Light Fuel", - "material.gtceu.lightly_hydro_cracked_naphtha": "Lightly Hydro-Cracked Naphtha", - "material.gtceu.lightly_steam_cracked_gas": "Lightly Steam-Cracked Gas", - "material.gtceu.lightly_steam_cracked_heavy_fuel": "Lightly Steam-Cracked Heavy Fuel", - "material.gtceu.lightly_steam_cracked_light_fuel": "Lightly Steam-Cracked Light Fuel", - "material.gtceu.lightly_steam_cracked_naphtha": "Lightly Steam-Cracked Naphtha", + "material.gtceu.lightly_hydro_cracked_gas": "Lightly Hydro Cracked Gas", + "material.gtceu.lightly_hydro_cracked_heavy_fuel": "Lightly Hydro Cracked Heavy Fuel", + "material.gtceu.lightly_hydro_cracked_light_fuel": "Lightly Hydro Cracked Light Fuel", + "material.gtceu.lightly_hydro_cracked_naphtha": "Lightly Hydro Cracked Naphtha", + "material.gtceu.lightly_steam_cracked_gas": "Lightly Steam Cracked Gas", + "material.gtceu.lightly_steam_cracked_heavy_fuel": "Lightly Steam Cracked Heavy Fuel", + "material.gtceu.lightly_steam_cracked_light_fuel": "Lightly Steam Cracked Light Fuel", + "material.gtceu.lightly_steam_cracked_naphtha": "Lightly Steam Cracked Naphtha", "material.gtceu.lime_dye": "Lime Dye", "material.gtceu.liquid_air": "Liquid Air", "material.gtceu.liquid_ender_air": "Liquid Ender Air", @@ -4981,7 +4466,7 @@ "material.gtceu.lithium": "Lithium", "material.gtceu.lithium_chloride": "Lithium Chloride", "material.gtceu.livermorium": "Livermorium", - "material.gtceu.lpg": "LPG", + "material.gtceu.lpg": "Lpg", "material.gtceu.lubricant": "Lubricant", "material.gtceu.lutetium": "Lutetium", "material.gtceu.magenta_dye": "Magenta Dye", @@ -5061,9 +4546,9 @@ "material.gtceu.octane": "Octane", "material.gtceu.oganesson": "Oganesson", "material.gtceu.oil": "Oil", - "material.gtceu.oil_heavy": "Heavy Oil", - "material.gtceu.oil_light": "Light Oil", - "material.gtceu.oil_medium": "Raw Oil", + "material.gtceu.oil_heavy": "Oil Heavy", + "material.gtceu.oil_light": "Oil Light", + "material.gtceu.oil_medium": "Oil Medium", "material.gtceu.oilsands": "Oilsands", "material.gtceu.olivine": "Olivine", "material.gtceu.opal": "Opal", @@ -5076,7 +4561,7 @@ "material.gtceu.palladium_raw": "Palladium Raw", "material.gtceu.paper": "Paper", "material.gtceu.paracetamol": "Paracetamol", - "material.gtceu.pcb_coolant": "PCB Coolant", + "material.gtceu.pcb_coolant": "Pcb Coolant", "material.gtceu.pentlandite": "Pentlandite", "material.gtceu.perlite": "Perlite", "material.gtceu.phenol": "Phenol", @@ -5157,7 +4642,7 @@ "material.gtceu.rocket_fuel": "Rocket Fuel", "material.gtceu.roentgenium": "Roentgenium", "material.gtceu.rose_gold": "Rose Gold", - "material.gtceu.rtm_alloy": "RTM Alloy", + "material.gtceu.rtm_alloy": "Rtm Alloy", "material.gtceu.rubber": "Rubber", "material.gtceu.rubidium": "Rubidium", "material.gtceu.ruby": "Ruby", @@ -5181,14 +4666,14 @@ "material.gtceu.seaborgium": "Seaborgium", "material.gtceu.seed_oil": "Seed Oil", "material.gtceu.selenium": "Selenium", - "material.gtceu.severely_hydro_cracked_gas": "Severely Hydro-Cracked Gas", - "material.gtceu.severely_hydro_cracked_heavy_fuel": "Severely Hydro-Cracked Heavy Fuel", - "material.gtceu.severely_hydro_cracked_light_fuel": "Severely Hydro-Cracked Light Fuel", - "material.gtceu.severely_hydro_cracked_naphtha": "Severely Hydro-Cracked Naphtha", - "material.gtceu.severely_steam_cracked_gas": "Severely Steam-Cracked Gas", - "material.gtceu.severely_steam_cracked_heavy_fuel": "Severely Steam-Cracked Heavy Fuel", - "material.gtceu.severely_steam_cracked_light_fuel": "Severely Steam-Cracked Light Fuel", - "material.gtceu.severely_steam_cracked_naphtha": "Severely Steam-Cracked Naphtha", + "material.gtceu.severely_hydro_cracked_gas": "Severely Hydro Cracked Gas", + "material.gtceu.severely_hydro_cracked_heavy_fuel": "Severely Hydro Cracked Heavy Fuel", + "material.gtceu.severely_hydro_cracked_light_fuel": "Severely Hydro Cracked Light Fuel", + "material.gtceu.severely_hydro_cracked_naphtha": "Severely Hydro Cracked Naphtha", + "material.gtceu.severely_steam_cracked_gas": "Severely Steam Cracked Gas", + "material.gtceu.severely_steam_cracked_heavy_fuel": "Severely Steam Cracked Heavy Fuel", + "material.gtceu.severely_steam_cracked_light_fuel": "Severely Steam Cracked Light Fuel", + "material.gtceu.severely_steam_cracked_naphtha": "Severely Steam Cracked Naphtha", "material.gtceu.silicon": "Silicon", "material.gtceu.silicon_dioxide": "Silicon Dioxide", "material.gtceu.silicone_rubber": "Silicone Rubber", @@ -5210,15 +4695,15 @@ "material.gtceu.spodumene": "Spodumene", "material.gtceu.stainless_steel": "Stainless Steel", "material.gtceu.steam": "Steam", - "material.gtceu.steam_cracked_butadiene": "Steam-Cracked Butadiene", - "material.gtceu.steam_cracked_butane": "Steam-Cracked Butane", - "material.gtceu.steam_cracked_butene": "Steam-Cracked Butene", - "material.gtceu.steam_cracked_ethane": "Steam-Cracked Ethane", - "material.gtceu.steam_cracked_ethylene": "Steam-Cracked Ethylene", - "material.gtceu.steam_cracked_propane": "Steam-Cracked Propane", - "material.gtceu.steam_cracked_propene": "Steam-Cracked Propene", + "material.gtceu.steam_cracked_butadiene": "Steam Cracked Butadiene", + "material.gtceu.steam_cracked_butane": "Steam Cracked Butane", + "material.gtceu.steam_cracked_butene": "Steam Cracked Butene", + "material.gtceu.steam_cracked_ethane": "Steam Cracked Ethane", + "material.gtceu.steam_cracked_ethylene": "Steam Cracked Ethylene", + "material.gtceu.steam_cracked_propane": "Steam Cracked Propane", + "material.gtceu.steam_cracked_propene": "Steam Cracked Propene", "material.gtceu.steel": "Steel", - "material.gtceu.stellite_100": "Stellite-100", + "material.gtceu.stellite_100": "Stellite 100", "material.gtceu.sterilized_growth_medium": "Sterilized Growth Medium", "material.gtceu.sterling_silver": "Sterling Silver", "material.gtceu.stibnite": "Stibnite", @@ -5270,7 +4755,7 @@ "material.gtceu.tungstate": "Tungstate", "material.gtceu.tungsten": "Tungsten", "material.gtceu.tungsten_carbide": "Tungsten Carbide", - "material.gtceu.tungsten_steel": "Tungstensteel", + "material.gtceu.tungsten_steel": "Tungsten Steel", "material.gtceu.tungstic_acid": "Tungstic Acid", "material.gtceu.ultimet": "Ultimet", "material.gtceu.uraninite": "Uraninite", @@ -5279,7 +4764,7 @@ "material.gtceu.uranium_hexafluoride": "Uranium Hexafluoride", "material.gtceu.uranium_rhodium_dinaquadide": "Uranium Rhodium Dinaquadide", "material.gtceu.uranium_triplatinum": "Uranium Triplatinum", - "material.gtceu.uu_matter": "UU-Matter", + "material.gtceu.uu_matter": "Uu Matter", "material.gtceu.uvarovite": "Uvarovite", "material.gtceu.vanadium": "Vanadium", "material.gtceu.vanadium_gallium": "Vanadium Gallium", @@ -5306,103 +4791,13 @@ "material.gtceu.yttrium": "Yttrium", "material.gtceu.yttrium_barium_cuprate": "Yttrium Barium Cuprate", "material.gtceu.zeolite": "Zeolite", - "material.gtceu.zeron_100": "Zeron-100", + "material.gtceu.zeron_100": "Zeron 100", "material.gtceu.zinc": "Zinc", "material.gtceu.zinc_sulfide": "Zinc Sulfide", "material.gtceu.zincite": "Zincite", "material.gtceu.zirconium": "Zirconium", "message.gtceu.new_veins.amount": "Prospected %d new veins!", "message.gtceu.new_veins.name": "Prospected %s!", - "armor.gtceu.energy_share.disable": "Energy Supply: Gadgets charging disabled", - "armor.gtceu.energy_share.enable": "Energy Supply: Gadgets charging enabled", - "armor.gtceu.energy_share.error": "Energy Supply: §cNot enough power for gadgets charging!", - "armor.gtceu.energy_share.tooltip": "Supply mode: %s", - "armor.gtceu.energy_share.tooltip.guide": "To change mode shift-right click when holding item", - "armor.gtceu.hud.energy_lvl": "Energy Level: %s", - "armor.gtceu.hud.engine_enabled": "Engine Enabled: %s", - "armor.gtceu.hud.fuel_lvl": "Fuel Level: %s", - "armor.gtceu.hud.gravi_engine": "GraviEngine: %s", - "armor.gtceu.hud.hover_mode": "Hover Mode: %s", - "armor.gtceu.hud.status.disabled": "§cOFF", - "armor.gtceu.hud.status.enabled": "§aON", - "armor.gtceu.jetpack.emergency_hover_mode": "Emergency Hover Mode Enabled!", - "armor.gtceu.jetpack.flight.disable": "Jetpack: Flight Disabled", - "armor.gtceu.jetpack.flight.enable": "Jetpack: Flight Enabled", - "armor.gtceu.jetpack.hover.disable": "Jetpack: Hover Mode Disabled", - "armor.gtceu.jetpack.hover.enable": "Jetpack: Hover Mode Enabled", - "armor.gtceu.message.nightvision.disabled": "§bNightVision: §cOff", - "armor.gtceu.message.nightvision.enabled": "§bNightVision: §aOn", - "armor.gtceu.message.nightvision.error": "§cNot enough power!", - "armor.gtceu.nms.boosted_jump.disabled": "NanoMuscle™ Suite: Jump Boost Disabled", - "armor.gtceu.nms.boosted_jump.enabled": "NanoMuscle™ Suite: Jump Boost Enabled", - "armor.gtceu.nms.nightvision.disabled": "NanoMuscle™ Suite: NightVision Disabled", - "armor.gtceu.nms.nightvision.enabled": "NanoMuscle™ Suite: NightVision Enabled", - "armor.gtceu.nms.nightvision.error": "NanoMuscle™ Suite: §cNot enough power!", - "armor.gtceu.nms.charge.disable": "NanoMuscle™ Suite: Charging Disabled", - "armor.gtceu.nms.charge.enable": "NanoMuscle™ Suite: Charging Enabled", - "armor.gtceu.nms.charge.error": "NanoMuscle™ Suite: §cNot enough power for charging!", - "armor.gtceu.qts.nightvision.disabled": "QuarkTech™ Suite: NightVision Disabled", - "armor.gtceu.qts.nightvision.enabled": "QuarkTech™ Suite: NightVision Enabled", - "armor.gtceu.qts.nightvision.error": "QuarkTech™ Suite: §cNot enough power!", - "armor.gtceu.qts.charge.disable": "QuarkTech™ Suite: Charging Disabled", - "armor.gtceu.qts.charge.enable": "QuarkTech™ Suite: Charging Enabled", - "armor.gtceu.qts.charge.error": "QuarkTech™ Suite: §cNot enough power for charging!", - "armor.gtceu.tooltip.autoeat": "Replenishes Food Bar by Using Food from Inventory", - "armor.gtceu.tooltip.breath": "Replenishes Underwater Breath Bar", - "armor.gtceu.tooltip.burning": "Nullifies Burning", - "armor.gtceu.tooltip.falldamage": "Nullifies Fall Damage", - "armor.gtceu.tooltip.freezing": "Prevents Freezing", - "armor.gtceu.tooltip.jump": "Increases Jump Height and Distance", - "armor.gtceu.tooltip.potions": "Nullifies Harmful Effects", - "armor.gtceu.tooltip.speed": "Increases Running Speed", - "armor.gtceu.tooltip.stepassist": "Provides Step-Assist", - "item.behavior.mode_switch.current_mode": "Mode: %s", - "item.behavior.mode_switch.mode_switched": "§eMode Set to: %s", - "item.behavior.mode_switch.tooltip": "Use while sneaking to switch mode", - "item.clipboard.tooltip": "Can be written on (without any writing Instrument). Right-click on Wall to place, and Shift-Right-Click to remove", - "item.cover.digital.mode.energy.disabled": "Click to enable Energy Mode", - "item.cover.digital.mode.energy.enabled": "Energy Mode enabled", - "item.cover.digital.mode.fluid.disabled": "Click to enable Fluid Mode", - "item.cover.digital.mode.fluid.enabled": "Fluid Mode enabled", - "item.cover.digital.mode.item.disabled": "Click to enable Item Mode", - "item.cover.digital.mode.item.enabled": "Item Mode enabled", - "item.cover.digital.mode.machine.disabled": "Click to enable Machine Mode", - "item.cover.digital.mode.machine.enabled": "Machine Mode enabled", - "item.cover.digital.mode.proxy.disabled": "Click to enable Proxy Mode", - "item.cover.digital.mode.proxy.enabled": "Proxy Mode enabled", - "item.cover.digital.tooltip": "Connects machines over §fPower Cables§7 to the §fCentral Monitor§7 as §fCover§7.", - "item.cover.digital.wireless.tooltip.0": "§fWirelessly§7 connects machines to the §fCentral Monitor§7 as §fCover§7.", - "item.cover.digital.wireless.tooltip.1": "§fRight Click§7 on the §fCentral Monitor§7 to remotely bind to it.", - "item.cover.digital.wireless.tooltip.2": "§fSneak Right Click§7 to remove the current binding.", - "item.cover.digital.wireless.tooltip.3": "§aBinding: §f%s", - "item.crushed.tooltip.purify": "Right click a Cauldron to get Purified Ore", - "item.debug_scanner.tooltip": "Tricorder", - "item.dust.tooltip.purify": "Right click a Cauldron to get clean Dust", - "item.electric.discharge_mode.disabled": "§eDischarge Mode Disabled", - "item.electric.discharge_mode.enabled": "§eDischarge Mode Enabled", - "item.electric.discharge_mode.tooltip": "Use while sneaking to toggle discharge mode", - "item.generic.electric_item.stored": "%d/%d EU (%s)", - "item.generic.electric_item.tooltip": "%d/%d EU - Tier %s", - "item.generic.fluid_container.tooltip": "%d/%dL %s", - "item.int_circuit.configuration": "Configuration: %d", - "item.liquid_fuel_jetpack.tooltip": "Uses Combustion Generator Fuels for Thrust", - "item.machine_configuration.mode": "§aConfiguration Mode:§r %s", - "item.plugin.proxy.tooltips.1": "(Please adjust to proxy mode in the screen)", - "item.plugin.tooltips.1": "Plugins can be added to the screen for more functionality.", - "item.prospector.mode.bedrock_ore": "§bBedrock Ore Prospection Mode§r", - "item.prospector.mode.fluid": "§bFluid Prospection Mode§r", - "item.prospector.mode.ores": "§aOre Prospection Mode§r", - "item.prospector.tooltip.modes": "Available Modes:", - "item.prospector.tooltip.radius": "Scans range in a %s Chunk Radius", - "item.record.sus.tooltip": "§7Leonz - Among Us Drip", - "item.terminal.tooltip": "Sharp tools make good work", - "item.terminal.tooltip.creative": "§bCreative Mode", - "item.terminal.tooltip.hardware": "§aHardware: %d", - "item.tool.tooltip.durability": "§fDurability: §a%d / %d", - "item.tool.tooltip.primary_material": "§fMaterial: §e%s", - "item.tool.tooltip.rotor.efficiency": "Turbine Efficiency: §9%d%%", - "item.tool.tooltip.rotor.power": "Turbine Power: §9%d%%", - "item.tricorder_scanner.tooltip": "Tricorder", "monitor.gui.title.argb": "ARGB:", "monitor.gui.title.back": "Back", "monitor.gui.title.config": "Config", @@ -5413,22 +4808,6 @@ "recipe.capability.eu.name": "GTCEu Energy", "recipe.capability.fluid.name": "Fluid", "recipe.capability.item.name": "Item", - "recipe.condition.adjacent_block.tooltip": "Blocks around", - "recipe.condition.biome.tooltip": "Biome: %s", - "recipe.condition.daytime.day.tooltip": "Requires day time to work", - "recipe.condition.daytime.night.tooltip": "Requires night time to work", - "recipe.condition.dimension.tooltip": "Dimension: %s", - "recipe.condition.dimension_marker.tooltip": "Dimension:", - "recipe.condition.eu_to_start.tooltip": "EU to Start: %d%s", - "recipe.condition.gamestage.locked_stage": "Locked at stage: %s", - "recipe.condition.gamestage.unlocked_stage": "Unlocked at stage: %s", - "recipe.condition.pos_y.tooltip": "Y Level: %d <= Y <= %d", - "recipe.condition.quest.completed.tooltip": "Requires %s completed", - "recipe.condition.quest.not_completed.tooltip": "Requires %s not completed", - "recipe.condition.rain.tooltip": "Rain Level: %d", - "recipe.condition.rock_breaker.tooltip": "Fluid blocks around", - "recipe.condition.steam_vent.tooltip": "Clean steam vent", - "recipe.condition.thunder.tooltip": "Thunder Level: %d", "tagprefix.andesite": "Andesite %s Ore", "tagprefix.basalt": "Basalt %s Ore", "tagprefix.blackstone": "Blackstone %s Ore", diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java index 712f8be4a57..5137e8a6a35 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java @@ -2,6 +2,7 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; import com.gregtechceu.gtceu.utils.TagExprFilter; import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; @@ -12,6 +13,7 @@ import net.minecraft.network.chat.MutableComponent; import lombok.Getter; +import org.apache.commons.codec.language.bm.Lang; import java.util.function.Consumer; import java.util.regex.Pattern; @@ -59,7 +61,7 @@ public WidgetGroup openConfigurator(int x, int y) { WidgetGroup group = new WidgetGroup(x, y, 18 * 3 + 25, 18 * 3); // 80 55 group.addWidget(new ImageWidget(0, 0, 20, 20, GuiTextures.INFO_ICON) .setHoverTooltips( - LangHandler.getMultiLang("cover.tag_filter.info").toArray(new MutableComponent[0]))); + LangUtil.getMultiLang("cover.tag_filter.info").toArray(new MutableComponent[0]))); group.addWidget(new TextFieldWidget(0, 29, 18 * 3 + 25, 12, () -> oreDictFilterExpression, this::setOreDict) .setMaxStringLength(64) .setValidator(input -> { diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/EnumSelectorWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/EnumSelectorWidget.java index 440031c6f2f..302495c5931 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/EnumSelectorWidget.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/EnumSelectorWidget.java @@ -4,6 +4,7 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.widget.CycleButtonWidget; @@ -48,7 +49,7 @@ public interface SelectableEnum { GuiTextures.VANILLA_BUTTON, texture); private BiFunction> tooltipSupplier = (value, key) -> List - .copyOf(LangHandler.getSingleOrMultiLang(key)); + .copyOf(LangUtil.getSingleOrMultiLang(key)); public EnumSelectorWidget(int xPosition, int yPosition, int width, int height, T[] values, T initialValue, Consumer onChanged) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ToggleButtonWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ToggleButtonWidget.java index 716725601e1..48d021b11f4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ToggleButtonWidget.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ToggleButtonWidget.java @@ -3,6 +3,7 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -68,7 +69,7 @@ protected void updateHoverTooltips() { setHoverTooltips(tooltipText + (isPressed ? ".enabled" : ".disabled")); } else { setHoverTooltips( - List.copyOf(LangHandler.getMultiLang(tooltipText + (isPressed ? ".enabled" : ".disabled")))); + List.copyOf(LangUtil.getMultiLang(tooltipText + (isPressed ? ".enabled" : ".disabled")))); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java index 8039a8f4b75..69152940587 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java @@ -21,6 +21,7 @@ import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; @@ -372,7 +373,7 @@ protected static EditableUI createBatterySlot() slotWidget.setHandlerSlot(machine.chargerInventory, 0); slotWidget.setCanPutItems(true); slotWidget.setCanTakeItems(true); - slotWidget.setHoverTooltips(LangHandler.getMultiLang("gtceu.gui.charger_slot.tooltip", + slotWidget.setHoverTooltips(LangUtil.getMultiLang("gtceu.gui.charger_slot.tooltip", GTValues.VNF[machine.getTier()], GTValues.VNF[machine.getTier()]).toArray(Component[]::new)); }); } @@ -390,7 +391,7 @@ protected static EditableUI createC slotWidget.setCanPutItems(false); slotWidget.setCanTakeItems(false); slotWidget.setHoverTooltips( - LangHandler.getMultiLang("gtceu.gui.configurator_slot.tooltip").toArray(Component[]::new)); + LangUtil.getMultiLang("gtceu.gui.configurator_slot.tooltip").toArray(Component[]::new)); }); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CircuitFancyConfigurator.java b/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CircuitFancyConfigurator.java index 522673f4fc7..77852dd5817 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CircuitFancyConfigurator.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CircuitFancyConfigurator.java @@ -9,6 +9,7 @@ import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.texture.ItemStackTexture; @@ -166,7 +167,7 @@ public Widget createConfigurator() { public List getTooltips() { var list = new ArrayList<>(IFancyConfigurator.super.getTooltips()); list.addAll(Arrays.stream( - LangHandler.getMultiLang("gtceu.gui.configurator_slot.tooltip").toArray(new MutableComponent[0])) + LangUtil.getMultiLang("gtceu.gui.configurator_slot.tooltip").toArray(new MutableComponent[0])) .toList()); return list; } diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/SimplePredicate.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/SimplePredicate.java index 552d450fed2..0c490d6d0cd 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/SimplePredicate.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/SimplePredicate.java @@ -8,6 +8,7 @@ import com.gregtechceu.gtceu.api.pattern.error.SinglePredicateError; import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; import com.lowdragmc.lowdraglib.utils.BlockInfo; import net.minecraft.client.Minecraft; @@ -23,6 +24,7 @@ import it.unimi.dsi.fastutil.longs.Long2ObjectArrayMap; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import it.unimi.dsi.fastutil.longs.LongOpenHashSet; +import org.apache.commons.codec.language.bm.Lang; import org.jetbrains.annotations.Nullable; import java.util.*; @@ -89,10 +91,10 @@ public List getToolTips(TraceabilityPredicate predicates) { result.add(Component.translatable("gtceu.multiblock.pattern.error.limited_within", minCount, maxCount)); } else { if (minCount != -1) { - result.add(LangHandler.getFromMultiLang("gtceu.multiblock.pattern.error.limited", 1, minCount)); + result.add(LangUtil.getFromMultiLang("gtceu.multiblock.pattern.error.limited", 1, minCount)); } if (maxCount != -1) { - result.add(LangHandler.getFromMultiLang("gtceu.multiblock.pattern.error.limited", 0, maxCount)); + result.add(LangUtil.getFromMultiLang("gtceu.multiblock.pattern.error.limited", 0, maxCount)); } } if (predicates == null) return result; diff --git a/src/main/java/com/gregtechceu/gtceu/client/TooltipsHandler.java b/src/main/java/com/gregtechceu/gtceu/client/TooltipsHandler.java index 4e0931d5585..5f6350b2492 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/TooltipsHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/client/TooltipsHandler.java @@ -13,6 +13,7 @@ import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.common.fluid.potion.PotionFluidHelper; import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.ChatFormatting; @@ -30,6 +31,7 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidType; +import org.apache.http.util.LangUtils; import java.util.List; import java.util.function.Consumer; @@ -65,7 +67,7 @@ public static void appendTooltips(ItemStack stack, TooltipFlag flag, List multiLang = LangHandler.getMultiLang(tooltipKey); + List multiLang = LangUtil.getMultiLang(tooltipKey); if (multiLang != null && !multiLang.isEmpty()) { tooltips.addAll(1, multiLang); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java index c8b28aaf225..a42cdeaa5db 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java @@ -30,6 +30,7 @@ import com.gregtechceu.gtceu.common.item.tool.behavior.MetaMachineConfigCopyBehaviour; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; import com.gregtechceu.gtceu.data.recipe.CustomTags; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTUtil; @@ -70,6 +71,7 @@ import com.tterrag.registrate.util.nullness.NonNullConsumer; import com.tterrag.registrate.util.nullness.NonNullFunction; import org.apache.commons.lang3.StringUtils; +import org.apache.http.util.LangUtils; import org.jetbrains.annotations.NotNull; import java.util.*; @@ -1911,7 +1913,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry COVER_SOLAR_PANEL_ULV = REGISTRATE .item("ulv_solar_panel", ComponentItem::create).lang("Ultra Low Voltage Solar Panel") .onRegister(attach(new TooltipBehavior(lines -> { - lines.addAll(LangHandler.getMultiLang("item.gtceu.solar_panel.tooltip")); + lines.addAll(LangUtil.getMultiLang("item.gtceu.solar_panel.tooltip")); lines.add(Component.translatable("gtceu.universal.tooltip.voltage_out", GTValues.V[GTValues.ULV], GTValues.VNF[GTValues.ULV])); }))).onRegister(attach(new CoverPlaceBehavior(GTCovers.SOLAR_PANEL[0]))) @@ -1919,7 +1921,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry COVER_SOLAR_PANEL_LV = REGISTRATE .item("lv_solar_panel", ComponentItem::create).lang("Low Voltage Solar Panel") .onRegister(attach(new TooltipBehavior(lines -> { - lines.addAll(LangHandler.getMultiLang("item.gtceu.solar_panel.tooltip")); + lines.addAll(LangUtil.getMultiLang("item.gtceu.solar_panel.tooltip")); lines.add(Component.translatable("gtceu.universal.tooltip.voltage_out", GTValues.V[GTValues.LV], GTValues.VNF[GTValues.LV])); }))).onRegister(attach(new CoverPlaceBehavior(GTCovers.SOLAR_PANEL[1]))) @@ -1927,7 +1929,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry COVER_SOLAR_PANEL_MV = REGISTRATE .item("mv_solar_panel", ComponentItem::create).lang("Medium Voltage Solar Panel") .onRegister(attach(new TooltipBehavior(lines -> { - lines.addAll(LangHandler.getMultiLang("item.gtceu.solar_panel.tooltip")); + lines.addAll(LangUtil.getMultiLang("item.gtceu.solar_panel.tooltip")); lines.add(Component.translatable("gtceu.universal.tooltip.voltage_out", GTValues.V[GTValues.MV], GTValues.VNF[GTValues.MV])); }))).onRegister(attach(new CoverPlaceBehavior(GTCovers.SOLAR_PANEL[2]))) @@ -1935,7 +1937,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry COVER_SOLAR_PANEL_HV = REGISTRATE .item("hv_solar_panel", ComponentItem::create).lang("High Voltage Solar Panel") .onRegister(attach(new TooltipBehavior(lines -> { - lines.addAll(LangHandler.getMultiLang("item.gtceu.solar_panel.tooltip")); + lines.addAll(LangUtil.getMultiLang("item.gtceu.solar_panel.tooltip")); lines.add(Component.translatable("gtceu.universal.tooltip.voltage_out", GTValues.V[GTValues.HV], GTValues.VNF[GTValues.HV])); }))).onRegister(attach(new CoverPlaceBehavior(GTCovers.SOLAR_PANEL[3]))) @@ -1943,7 +1945,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry COVER_SOLAR_PANEL_EV = REGISTRATE .item("ev_solar_panel", ComponentItem::create).lang("Extreme Voltage Solar Panel") .onRegister(attach(new TooltipBehavior(lines -> { - lines.addAll(LangHandler.getMultiLang("item.gtceu.solar_panel.tooltip")); + lines.addAll(LangUtil.getMultiLang("item.gtceu.solar_panel.tooltip")); lines.add(Component.translatable("gtceu.universal.tooltip.voltage_out", GTValues.V[GTValues.EV], GTValues.VNF[GTValues.EV])); }))).onRegister(attach(new CoverPlaceBehavior(GTCovers.SOLAR_PANEL[4]))) @@ -1951,7 +1953,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry COVER_SOLAR_PANEL_IV = REGISTRATE .item("iv_solar_panel", ComponentItem::create).lang("Insane Voltage Solar Panel") .onRegister(attach(new TooltipBehavior(lines -> { - lines.addAll(LangHandler.getMultiLang("item.gtceu.solar_panel.tooltip")); + lines.addAll(LangUtil.getMultiLang("item.gtceu.solar_panel.tooltip")); lines.add(Component.translatable("gtceu.universal.tooltip.voltage_out", GTValues.V[GTValues.IV], GTValues.VNF[GTValues.IV])); }))).onRegister(attach(new CoverPlaceBehavior(GTCovers.SOLAR_PANEL[5]))) @@ -1959,7 +1961,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry COVER_SOLAR_PANEL_LuV = REGISTRATE .item("luv_solar_panel", ComponentItem::create).lang("Ludicrous Voltage Solar Panel") .onRegister(attach(new TooltipBehavior(lines -> { - lines.addAll(LangHandler.getMultiLang("item.gtceu.solar_panel.tooltip")); + lines.addAll(LangUtil.getMultiLang("item.gtceu.solar_panel.tooltip")); lines.add(Component.translatable("gtceu.universal.tooltip.voltage_out", GTValues.V[GTValues.LuV], GTValues.VNF[GTValues.LuV])); }))).onRegister(attach(new CoverPlaceBehavior(GTCovers.SOLAR_PANEL[6]))) @@ -1967,7 +1969,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry COVER_SOLAR_PANEL_ZPM = REGISTRATE .item("zpm_solar_panel", ComponentItem::create).lang("Zero Point Module Solar Panel") .onRegister(attach(new TooltipBehavior(lines -> { - lines.addAll(LangHandler.getMultiLang("item.gtceu.solar_panel.tooltip")); + lines.addAll(LangUtil.getMultiLang("item.gtceu.solar_panel.tooltip")); lines.add(Component.translatable("gtceu.universal.tooltip.voltage_out", GTValues.V[GTValues.ZPM], GTValues.VNF[GTValues.ZPM])); }))).onRegister(attach(new CoverPlaceBehavior(GTCovers.SOLAR_PANEL[7]))) @@ -1975,7 +1977,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry COVER_SOLAR_PANEL_UV = REGISTRATE .item("uv_solar_panel", ComponentItem::create).lang("Ultimate Voltage Solar Panel") .onRegister(attach(new TooltipBehavior(lines -> { - lines.addAll(LangHandler.getMultiLang("item.gtceu.solar_panel.tooltip")); + lines.addAll(LangUtil.getMultiLang("item.gtceu.solar_panel.tooltip")); lines.add(Component.translatable("gtceu.universal.tooltip.voltage_out", GTValues.V[GTValues.UV], GTValues.VNF[GTValues.UV])); }))).onRegister(attach(new CoverPlaceBehavior(GTCovers.SOLAR_PANEL[8]))) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java index 0472182791d..61ad8d74dc9 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java @@ -28,6 +28,7 @@ import com.gregtechceu.gtceu.common.pipelike.item.longdistance.LDItemEndpointMachine; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; import com.gregtechceu.gtceu.integration.kjs.GTRegistryInfo; import com.gregtechceu.gtceu.utils.FormattingUtil; @@ -300,7 +301,7 @@ public class GTMachines { .rotationState(RotationState.ALL) .tier(LV) .tieredHullRenderer(GTCEu.id("block/machine/ld_item_endpoint_machine")) - .tooltips(LangHandler.getMultiLang("gtceu.machine.endpoint.tooltip").toArray(Component[]::new)) + .tooltips(LangUtil.getMultiLang("gtceu.machine.endpoint.tooltip").toArray(Component[]::new)) .tooltipBuilder((stack, tooltip) -> { if (ConfigHolder.INSTANCE.machines.ldItemPipeMinDistance > 0) { tooltip.add(Component.translatable("gtceu.machine.endpoint.tooltip.min_length", @@ -853,10 +854,10 @@ public class GTMachines { .rotationState(RotationState.ALL) .abilities(PartAbility.MUFFLER) .overlayTieredHullRenderer("muffler_hatch") - .tooltips(LangHandler.getFromMultiLang("gtceu.machine.muffler_hatch.tooltip", 0), + .tooltips(LangUtil.getFromMultiLang("gtceu.machine.muffler_hatch.tooltip", 0), Component.translatable("gtceu.muffler.recovery_tooltip", Math.max(1, tier * 10)), Component.translatable("gtceu.part_sharing.enabled"), - LangHandler.getFromMultiLang("gtceu.machine.muffler_hatch.tooltip", 1) + LangUtil.getFromMultiLang("gtceu.machine.muffler_hatch.tooltip", 1) .withStyle(ChatFormatting.DARK_RED)) .register(), ELECTRIC_TIERS); @@ -1056,8 +1057,8 @@ public class GTMachines { .rotationState(RotationState.ALL) .abilities(PartAbility.ROTOR_HOLDER) .renderer(() -> new RotorHolderMachineRenderer(tier)) - .tooltips(LangHandler.getFromMultiLang("gtceu.machine.rotor_holder.tooltip", 0), - LangHandler.getFromMultiLang("gtceu.machine.rotor_holder.tooltip", 1), + .tooltips(LangUtil.getFromMultiLang("gtceu.machine.rotor_holder.tooltip", 0), + LangUtil.getFromMultiLang("gtceu.machine.rotor_holder.tooltip", 1), Component.translatable("gtceu.part_sharing.disabled")) .register(), GTValues.tiersBetween(HV, GTCEuAPI.isHighTier() ? OpV : UV)); diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTResearchMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTResearchMachines.java index 8992ee9db38..44a6a450955 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTResearchMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTResearchMachines.java @@ -31,6 +31,7 @@ import com.gregtechceu.gtceu.common.machine.multiblock.part.hpca.HPCAEmptyPartMachine; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; import com.gregtechceu.gtceu.utils.FormattingUtil; import net.minecraft.core.Direction; @@ -62,7 +63,7 @@ public class GTResearchMachines { .rotationState(RotationState.NON_Y_AXIS) .recipeType(GTRecipeTypes.RESEARCH_STATION_RECIPES) .appearanceBlock(ADVANCED_COMPUTER_CASING) - .tooltipBuilder((s, l) -> l.addAll(LangHandler.getMultiLang("gtceu.machine.research_station.tooltip"))) + .tooltipBuilder((s, l) -> l.addAll(LangUtil.getMultiLang("gtceu.machine.research_station.tooltip"))) .pattern(definition -> FactoryBlockPattern.start() .aisle("XXX", "VVV", "PPP", "PPP", "PPP", "VVV", "XXX") .aisle("XXX", "VAV", "AAA", "AAA", "AAA", "VAV", "XXX") @@ -197,7 +198,7 @@ public class GTResearchMachines { .appearanceBlock(COMPUTER_CASING) .recipeType(GTRecipeTypes.DUMMY_RECIPES) .tooltipBuilder((s, l) -> l - .addAll(LangHandler.getMultiLang("gtceu.machine.high_performance_computation_array.tooltip"))) + .addAll(LangUtil.getMultiLang("gtceu.machine.high_performance_computation_array.tooltip"))) .pattern(definition -> FactoryBlockPattern.start() .aisle("AA", "CC", "CC", "CC", "AA") .aisle("VA", "XV", "XV", "XV", "VA") diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java index d1ef73b5df4..f356d16b641 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java @@ -20,6 +20,7 @@ import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -394,7 +395,7 @@ protected static EditableUI createBatterySlot() slotWidget.setHandlerSlot(machine.chargerInventory, 0); slotWidget.setCanPutItems(true); slotWidget.setCanTakeItems(true); - slotWidget.setHoverTooltips(LangHandler.getMultiLang("gtceu.gui.charger_slot.tooltip", + slotWidget.setHoverTooltips(LangUtil.getMultiLang("gtceu.gui.charger_slot.tooltip", GTValues.VNF[machine.getTier()], GTValues.VNF[machine.getTier()]).toArray(new MutableComponent[0])); }); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java index 270ae10eb4f..2992ec152de 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java @@ -21,6 +21,7 @@ import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.lowdragmc.lowdraglib.gui.texture.ItemStackTexture; @@ -422,7 +423,7 @@ protected static EditableUI createBatterySlot() { slotWidget.setHandlerSlot(machine.chargerInventory, 0); slotWidget.setCanPutItems(true); slotWidget.setCanTakeItems(true); - slotWidget.setHoverTooltips(LangHandler.getMultiLang("gtceu.gui.charger_slot.tooltip", + slotWidget.setHoverTooltips(LangUtil.getMultiLang("gtceu.gui.charger_slot.tooltip", GTValues.VNF[machine.getTier()], GTValues.VNF[machine.getTier()]).toArray(new MutableComponent[0])); }); } @@ -436,7 +437,7 @@ protected static EditableUI createJunkButton( }, (toggleButtonWidget, machine) -> { toggleButtonWidget.setSupplier(machine::isJunkEnabled); toggleButtonWidget.setOnPressCallback((data, bool) -> machine.setJunkEnabled(bool)); - toggleButtonWidget.setHoverTooltips(LangHandler.getMultiLang("gtceu.gui.fisher_mode.tooltip", + toggleButtonWidget.setHoverTooltips(LangUtil.getMultiLang("gtceu.gui.fisher_mode.tooltip", GTValues.VNF[machine.getTier()], GTValues.VNF[machine.getTier()]).toArray(new MutableComponent[0])); }); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java index 0296184879d..b5d6459c1f5 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java @@ -23,6 +23,7 @@ import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -445,7 +446,7 @@ protected static EditableUI createBatterySlot( slotWidget.setHandlerSlot(machine.chargerInventory, 0); slotWidget.setCanPutItems(true); slotWidget.setCanTakeItems(true); - slotWidget.setHoverTooltips(LangHandler.getMultiLang("gtceu.gui.charger_slot.tooltip", + slotWidget.setHoverTooltips(LangUtil.getMultiLang("gtceu.gui.charger_slot.tooltip", GTValues.VNF[machine.getTier()], GTValues.VNF[machine.getTier()]).toArray(new MutableComponent[0])); }); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java index 933badb3058..51614ad195c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java @@ -24,6 +24,7 @@ import com.gregtechceu.gtceu.common.machine.trait.miner.MinerLogic; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.lowdragmc.lowdraglib.gui.widget.ComponentPanelWidget; @@ -333,7 +334,7 @@ protected static EditableUI createBatterySlot() { slotWidget.setHandlerSlot(machine.chargerInventory, 0); slotWidget.setCanPutItems(true); slotWidget.setCanTakeItems(true); - slotWidget.setHoverTooltips(LangHandler.getMultiLang("gtceu.gui.charger_slot.tooltip", + slotWidget.setHoverTooltips(LangUtil.getMultiLang("gtceu.gui.charger_slot.tooltip", GTValues.VNF[machine.getTier()], GTValues.VNF[machine.getTier()]).toArray(new MutableComponent[0])); }); } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java index d7bbee87f4a..1e59c8d5577 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java @@ -5,40 +5,47 @@ import static com.gregtechceu.gtceu.data.lang.LangUtil.*; public class ArmorLang { + + public static void init(RegistrateLangProvider provider) { + generateArmorKeys(provider); + generateHudKeys(provider); + generateTooltipKeys(provider); + } + public static void generateArmorKeys(RegistrateLangProvider provider) { // nanomuscle suit - provider.add("armor.gtceu.nms.nightvision.enabled", "NanoMuscle™ Suite: NightVision Enabled"); - provider.add("armor.gtceu.nms.nightvision.disabled", "NanoMuscle™ Suite: NightVision Disabled"); - provider.add("armor.gtceu.nms.boosted_jump.enabled", "NanoMuscle™ Suite: Jump Boost Enabled"); - provider.add("armor.gtceu.nms.boosted_jump.disabled", "NanoMuscle™ Suite: Jump Boost Disabled"); + provider.add("armor.gtceu.nms.nightvision.enabled", "§aNanoMuscle™ Suite: NightVision Enabled"); + provider.add("armor.gtceu.nms.nightvision.disabled", " §cNanoMuscle™ Suite: NightVision Disabled"); + provider.add("armor.gtceu.nms.boosted_jump.enabled", "§aNanoMuscle™ Suite: Jump Boost Enabled"); + provider.add("armor.gtceu.nms.boosted_jump.disabled", " §cNanoMuscle™ Suite: Jump Boost Disabled"); provider.add("armor.gtceu.nms.nightvision.error", "NanoMuscle™ Suite: §cNot enough power!"); - provider.add("armor.gtceu.nms.charge.enable", "NanoMuscle™ Suite: Charging Enabled"); - provider.add("armor.gtceu.nms.charge.disable", "NanoMuscle™ Suite: Charging Disabled"); + provider.add("armor.gtceu.nms.charge.enabled", "§aNanoMuscle™ Suite: Charging Enabled"); + provider.add("armor.gtceu.nms.charge.disable", " §cNanoMuscle™ Suite: Charging Disabled"); provider.add("armor.gtceu.nms.charge.error", "NanoMuscle™ Suite: §cNot enough power for charging!"); // quantum suit - provider.add("armor.gtceu.qts.nightvision.enabled", "QuarkTech™ Suite: NightVision Enabled"); - provider.add("armor.gtceu.qts.nightvision.disabled", "QuarkTech™ Suite: NightVision Disabled"); - provider.add("armor.gtceu.qts.nightvision.error", "QuarkTech™ Suite: §cNot enough power!"); - provider.add("armor.gtceu.qts.charge.enable", "QuarkTech™ Suite: Charging Enabled"); - provider.add("armor.gtceu.qts.charge.disable", "QuarkTech™ Suite: Charging Disabled"); - provider.add("armor.gtceu.qts.charge.error", "QuarkTech™ Suite: §cNot enough power for charging!"); + provider.add("armor.gtceu.qts.nightvision.enabled", "§a§aQuarkTech™ Suite: NightVision Enabled"); + provider.add("armor.gtceu.qts.nightvision.disabled", " §cQuarkTech™ Suite: NightVision Disabled"); + provider.add("armor.gtceu.qts.nightvision.error", " §cQuarkTech™ Suite: §cNot enough power!"); + provider.add("armor.gtceu.qts.charge.enabled", "§aQuarkTech™ Suite: Charging Enabled"); + provider.add("armor.gtceu.qts.charge.disable", " §cQuarkTech™ Suite: Charging Disabled"); + provider.add("armor.gtceu.qts.charge.error", " §cQuarkTech™ Suite: §cNot enough power for charging!"); //jetpacks - provider.add("armor.gtceu.jetpack.flight.enable", "Jetpack: Flight Enabled"); - provider.add("armor.gtceu.jetpack.flight.disable", "Jetpack: Flight Disabled"); - provider.add("armor.gtceu.jetpack.hover.enable", "Jetpack: Hover Mode Enabled"); - provider.add("armor.gtceu.jetpack.hover.disable", "Jetpack: Hover Mode Disabled"); - provider.add("armor.gtceu.jetpack.emergency_hover_mode", "Emergency Hover Mode Enabled!"); + provider.add("armor.gtceu.jetpack.flight.enable", "§aJetpack: Flight Enabled"); + provider.add("armor.gtceu.jetpack.flight.disable", " §cJetpack: Flight Disabled"); + provider.add("armor.gtceu.jetpack.hover.enable", "§aJetpack: Hover Mode Enabled"); + provider.add("armor.gtceu.jetpack.hover.disable", " §cJetpack: Hover Mode Disabled"); + provider.add("armor.gtceu.jetpack.emergency_hover_mode", "§aEmergency Hover Mode Enabled!"); //action bar messages - provider.add("armor.gtceu.message.nightvision.enabled", "§bNightVision: §aOn"); - provider.add("armor.gtceu.message.nightvision.disabled", "§bNightVision: §cOff"); + provider.add("armor.gtceu.message.nightvision.enabled", "§aNightVision: §aOn"); + provider.add("armor.gtceu.message.nightvision.disabled", " §cNightVision: §cOff"); provider.add("armor.gtceu.message.nightvision.error", "§cNot enough power!"); @@ -62,7 +69,7 @@ public static void generateTooltipKeys(RegistrateLangProvider provider){ //energy tooltips (iaddinfo) provider.add("armor.gtceu.energy_share.error", "Energy Supply: §cNot enough power for gadgets charging!"); - provider.add("armor.gtceu.energy_share.enable", "Energy Supply: Gadgets charging enabled"); + provider.add("armor.gtceu.energy_share.enable", "§aEnergy Supply: Gadgets charging enabled"); provider.add("armor.gtceu.energy_share.disable", "Energy Supply: Gadgets charging disabled"); provider.add("armor.gtceu.energy_share.tooltip", "Supply mode: %s"); provider.add("armor.gtceu.energy_share.tooltip.guide", @@ -74,7 +81,7 @@ public static void generateHudKeys(RegistrateLangProvider provider){ provider.add("armor.gtceu.hud.status.enabled", "§aON"); provider.add("armor.gtceu.hud.status.disabled", "§cOFF"); provider.add("armor.gtceu.hud.energy_lvl", "Energy Level: %s"); - provider.add("armor.gtceu.hud.engine_enabled", "Engine Enabled: %s"); + provider.add("armor.gtceu.hud.engine_enabled", "§aEngine Enabled: %s"); provider.add("armor.gtceu.hud.fuel_lvl", "Fuel Level: %s"); provider.add("armor.gtceu.hud.hover_mode", "Hover Mode: %s"); provider.add("mataarmor.hud.supply_mode", "Supply Mode: %s"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java index 2fc7f7b8152..4fc51b6e280 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -10,7 +10,7 @@ public class LangHandler { Items must be in gold - §6 Fluids must be in blue - §9 Directions must be in yellow - §e - Disabled/Inactive must be in red - §c + Disabled/Inactive/errors must be in red - §c Enabled/Active must be in green - §a Potion effects must be in yellow - §e Time must be in red - §c @@ -29,6 +29,7 @@ public static void init(RegistrateLangProvider provider) { MachineLang.init(provider); ToolLang.init(provider); ConfigurationLang.init(provider); + ArmorLang.init(provider); provider.add("gtceu.gui.editor.tips.citation", "Number of citations"); provider.add("gtceu.gui.editor.group.recipe_type", "cap"); diff --git a/src/main/resources/assets/gtceu/lang/ja_jp.json b/src/main/resources/assets/gtceu/lang/ja_jp.json index 1e219ce3979..e64c0d62504 100644 --- a/src/main/resources/assets/gtceu/lang/ja_jp.json +++ b/src/main/resources/assets/gtceu/lang/ja_jp.json @@ -5268,13 +5268,13 @@ "armor.gtceu.nms.nightvision.enabled": "NanoMuscle™ Suite: 暗視を有効化", "armor.gtceu.nms.nightvision.error": "NanoMuscle™ Suite: §cエネルギー不足!", "armor.gtceu.nms.charge.disable": "NanoMuscle™ Suite: 電力供給を無効化", - "armor.gtceu.nms.charge.enable": "NanoMuscle™ Suite: 電力供給を有効化", + "armor.gtceu.nms.charge.enabled": "NanoMuscle™ Suite: 電力供給を有効化", "armor.gtceu.nms.charge.error": "NanoMuscle™ Suite: §cエネルギー不足!", "armor.gtceu.qts.nightvision.disabled": "QuarkTech™ Suite: 暗視を無効化", "armor.gtceu.qts.nightvision.enabled": "QuarkTech™ Suite: 暗視を有効化", "armor.gtceu.qts.nightvision.error": "QuarkTech™ Suite: §cエネルギー不足!", "armor.gtceu.qts.charge.disable": "QuarkTech™ Suite: 電力供給を無効化", - "armor.gtceu.qts.charge.enable": "QuarkTech™ Suite: 電力供給を有効化", + "armor.gtceu.qts.charge.enabled": "QuarkTech™ Suite: 電力供給を有効化", "armor.gtceu.qts.charge.error": "QuarkTech™ Suite: §cエネルギー不足!", "armor.gtceu.tooltip.autoeat": "インベントリの食料で満腹度回復", "armor.gtceu.tooltip.breath": "水中呼吸", diff --git a/src/main/resources/assets/gtceu/lang/ru_ru.json b/src/main/resources/assets/gtceu/lang/ru_ru.json index 09c92ef007d..25e80ab8a22 100644 --- a/src/main/resources/assets/gtceu/lang/ru_ru.json +++ b/src/main/resources/assets/gtceu/lang/ru_ru.json @@ -2778,13 +2778,13 @@ "armor.gtceu.nms.nightvision.enabled": "NanoMuscle™ броня: ПНВ включено", "armor.gtceu.nms.nightvision.error": "NanoMuscle™ броня: §cНедостаточно энергии!", "armor.gtceu.nms.charge.disable": "NanoMuscle™ броня: Зарядка отключена", - "armor.gtceu.nms.charge.enable": "NanoMuscle™ броня: Зарядка включена", + "armor.gtceu.nms.charge.enabled": "NanoMuscle™ броня: Зарядка включена", "armor.gtceu.nms.charge.error": "NanoMuscle™ броня: §cНедостаточно энергии для зарядки!", "armor.gtceu.qts.nightvision.disabled": "QuarkTech™ броня: ПНВ выключено", "armor.gtceu.qts.nightvision.enabled": "QuarkTech™ броня: ПНВ включено", "armor.gtceu.qts.nightvision.error": "QuarkTech™ броня: §cНедостаточно энергии!", "armor.gtceu.qts.charge.disable": "QuarkTech™ броня: Зарядка отключена", - "armor.gtceu.qts.charge.enable": "QuarkTech™ броня: Зарядка включена", + "armor.gtceu.qts.charge.enabled": "QuarkTech™ броня: Зарядка включена", "armor.gtceu.qts.charge.error": "QuarkTech™ броня: §cНедостаточно энергии для зарядки!", "armor.gtceu.tooltip.autoeat": "Пополняет шкалу еды, используя еду из инвентаря", "armor.gtceu.tooltip.breath": "Пополняет полосу подводного дыхания", diff --git a/src/main/resources/assets/gtceu/lang/uk_ua.json b/src/main/resources/assets/gtceu/lang/uk_ua.json index 85ffe7752e7..668eaad5508 100644 --- a/src/main/resources/assets/gtceu/lang/uk_ua.json +++ b/src/main/resources/assets/gtceu/lang/uk_ua.json @@ -5133,13 +5133,13 @@ "armor.gtceu.nms.nightvision.enabled": "Комплект NanoMuscle™: Нічне бачення увімкнено", "armor.gtceu.nms.nightvision.error": "Комплект NanoMuscle™:§c Недостатньо енергії!", "armor.gtceu.nms.charge.disable": "Комплект NanoMuscle™: Заряджання вимкнено", - "armor.gtceu.nms.charge.enable": "Комплект NanoMuscle™: Заряджання увімкнено", + "armor.gtceu.nms.charge.enabled": "Комплект NanoMuscle™: Заряджання увімкнено", "armor.gtceu.nms.charge.error": "Комплект NanoMuscle™:§c Недостатньо енергії для заряджання!", "armor.gtceu.qts.nightvision.disabled": "Комплект QuarkTech™: Нічне бачення вимкнено", "armor.gtceu.qts.nightvision.enabled": "Комплект QuarkTech™: Нічне бачення увімкнено", "armor.gtceu.qts.nightvision.error": "Комплект QuarkTech™:§c Недостатньо енергії!", "armor.gtceu.qts.charge.disable": "Комплект QuarkTech™: Заряджання вимкнено", - "armor.gtceu.qts.charge.enable": "Комплект QuarkTech™: Заряджання увімкнено", + "armor.gtceu.qts.charge.enabled": "Комплект QuarkTech™: Заряджання увімкнено", "armor.gtceu.qts.charge.error": "Комплект QuarkTech™:§c Недостатньо енергії для заряджання!", "armor.gtceu.tooltip.autoeat": "Поповнює очки голоду з інвентарю", "armor.gtceu.tooltip.breath": "Поповнює очки запасу повітря", diff --git a/src/main/resources/assets/gtceu/lang/zh_cn.json b/src/main/resources/assets/gtceu/lang/zh_cn.json index ef7fcd261e3..228ea6e37ba 100644 --- a/src/main/resources/assets/gtceu/lang/zh_cn.json +++ b/src/main/resources/assets/gtceu/lang/zh_cn.json @@ -5328,13 +5328,13 @@ "armor.gtceu.nms.nightvision.enabled": "纳米肌体™套装:夜视已启用", "armor.gtceu.nms.nightvision.error": "纳米肌体™套装:§c能量不足!", "armor.gtceu.nms.charge.disable": "纳米肌体™套装:供能模式已禁用", - "armor.gtceu.nms.charge.enable": "纳米肌体™套装:供能模式已启用", + "armor.gtceu.nms.charge.enabled": "纳米肌体™套装:供能模式已启用", "armor.gtceu.nms.charge.error": "纳米肌体™套装:§c能量不足,无法供能!", "armor.gtceu.qts.nightvision.disabled": "夸克高科™套装:夜视已禁用", "armor.gtceu.qts.nightvision.enabled": "夸克高科™套装:夜视已启用", "armor.gtceu.qts.nightvision.error": "夸克高科™套装:§c能量不足!", "armor.gtceu.qts.charge.disable": "夸克高科™套装:供能模式已禁用", - "armor.gtceu.qts.charge.enable": "夸克高科™套装:供能模式已启用", + "armor.gtceu.qts.charge.enabled": "夸克高科™套装:供能模式已启用", "armor.gtceu.qts.charge.error": "夸克高科™套装:§c能量不足,无法供能!", "armor.gtceu.tooltip.autoeat": "使用物品栏中的食物补充饱食度", "armor.gtceu.tooltip.breath": "补充氧气条", diff --git a/src/main/resources/assets/gtceu/lang/zh_tw.json b/src/main/resources/assets/gtceu/lang/zh_tw.json index 098992f538b..c5a3992e5aa 100644 --- a/src/main/resources/assets/gtceu/lang/zh_tw.json +++ b/src/main/resources/assets/gtceu/lang/zh_tw.json @@ -5328,13 +5328,13 @@ "armor.gtceu.nms.nightvision.enabled": "奈米肌體™套裝:夜視已啟用", "armor.gtceu.nms.nightvision.error": "奈米肌體™套裝:§c能量不足!", "armor.gtceu.nms.charge.disable": "奈米肌體™套裝:供能模式已禁用", - "armor.gtceu.nms.charge.enable": "奈米肌體™套裝:供能模式已啟用", + "armor.gtceu.nms.charge.enabled": "奈米肌體™套裝:供能模式已啟用", "armor.gtceu.nms.charge.error": "奈米肌體™套裝:§c能量不足,無法供能!", "armor.gtceu.qts.nightvision.disabled": "夸克科技™套裝:夜視已禁用", "armor.gtceu.qts.nightvision.enabled": "夸克科技™套裝:夜視已啟用", "armor.gtceu.qts.nightvision.error": "夸克科技™套裝:§c能量不足!", "armor.gtceu.qts.charge.disable": "夸克科技™套裝:供能模式已禁用", - "armor.gtceu.qts.charge.enable": "夸克科技™套裝:供能模式已啟用", + "armor.gtceu.qts.charge.enabled": "夸克科技™套裝:供能模式已啟用", "armor.gtceu.qts.charge.error": "夸克科技™套裝:§c能量不足,無法供能!", "armor.gtceu.tooltip.autoeat": "使用物品欄中的食物補充飽食度", "armor.gtceu.tooltip.breath": "補充氧氣條", From 8cd8c4f73159e8db91355c196acb35c3262cb4e2 Mon Sep 17 00:00:00 2001 From: Spicierspace153 <21964509+Spicierspace153@users.noreply.github.com> Date: Thu, 19 Jun 2025 21:13:37 -0600 Subject: [PATCH 08/45] final ArmorLang --- .../gtceu/data/lang/ArmorLang.java | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java index 1e59c8d5577..df8748d0940 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java @@ -16,37 +16,37 @@ public static void generateArmorKeys(RegistrateLangProvider provider) { // nanomuscle suit - provider.add("armor.gtceu.nms.nightvision.enabled", "§aNanoMuscle™ Suite: NightVision Enabled"); - provider.add("armor.gtceu.nms.nightvision.disabled", " §cNanoMuscle™ Suite: NightVision Disabled"); - provider.add("armor.gtceu.nms.boosted_jump.enabled", "§aNanoMuscle™ Suite: Jump Boost Enabled"); - provider.add("armor.gtceu.nms.boosted_jump.disabled", " §cNanoMuscle™ Suite: Jump Boost Disabled"); + provider.add("armor.gtceu.nms.nightvision.enabled", "NanoMuscle™ Suite: §aNightVision Enabled"); + provider.add("armor.gtceu.nms.nightvision.disabled", " NanoMuscle™ Suite: §cNightVision Disabled"); + provider.add("armor.gtceu.nms.boosted_jump.enabled", "NanoMuscle™ Suite: §aJump Boost Enabled"); + provider.add("armor.gtceu.nms.boosted_jump.disabled", " NanoMuscle™ Suite: §cJump Boost Disabled"); provider.add("armor.gtceu.nms.nightvision.error", "NanoMuscle™ Suite: §cNot enough power!"); - provider.add("armor.gtceu.nms.charge.enabled", "§aNanoMuscle™ Suite: Charging Enabled"); - provider.add("armor.gtceu.nms.charge.disable", " §cNanoMuscle™ Suite: Charging Disabled"); + provider.add("armor.gtceu.nms.charge.enabled", "NanoMuscle™ Suite: §aCharging Enabled"); + provider.add("armor.gtceu.nms.charge.disable", " NanoMuscle™ Suite: §cCharging Disabled"); provider.add("armor.gtceu.nms.charge.error", "NanoMuscle™ Suite: §cNot enough power for charging!"); // quantum suit - provider.add("armor.gtceu.qts.nightvision.enabled", "§a§aQuarkTech™ Suite: NightVision Enabled"); - provider.add("armor.gtceu.qts.nightvision.disabled", " §cQuarkTech™ Suite: NightVision Disabled"); - provider.add("armor.gtceu.qts.nightvision.error", " §cQuarkTech™ Suite: §cNot enough power!"); - provider.add("armor.gtceu.qts.charge.enabled", "§aQuarkTech™ Suite: Charging Enabled"); - provider.add("armor.gtceu.qts.charge.disable", " §cQuarkTech™ Suite: Charging Disabled"); - provider.add("armor.gtceu.qts.charge.error", " §cQuarkTech™ Suite: §cNot enough power for charging!"); + provider.add("armor.gtceu.qts.nightvision.enabled", "QuarkTech™ Suite: §aNightVision Enabled"); + provider.add("armor.gtceu.qts.nightvision.disabled", "QuarkTech™ Suite: §cNightVision Disabled"); + provider.add("armor.gtceu.qts.nightvision.error", "QuarkTech™ Suite: §cNot enough power!"); + provider.add("armor.gtceu.qts.charge.enabled", "QuarkTech™ Suite: §aCharging Enabled"); + provider.add("armor.gtceu.qts.charge.disable", "QuarkTech™ Suite: §cCharging Disabled"); + provider.add("armor.gtceu.qts.charge.error", "QuarkTech™ Suite: §cNot enough power for charging!"); //jetpacks - provider.add("armor.gtceu.jetpack.flight.enable", "§aJetpack: Flight Enabled"); - provider.add("armor.gtceu.jetpack.flight.disable", " §cJetpack: Flight Disabled"); - provider.add("armor.gtceu.jetpack.hover.enable", "§aJetpack: Hover Mode Enabled"); - provider.add("armor.gtceu.jetpack.hover.disable", " §cJetpack: Hover Mode Disabled"); + provider.add("armor.gtceu.jetpack.flight.enable", "Jetpack: Flight Enabled"); + provider.add("armor.gtceu.jetpack.flight.disable", "Jetpack: Flight Disabled"); + provider.add("armor.gtceu.jetpack.hover.enable", "Jetpack: Hover Mode Enabled"); + provider.add("armor.gtceu.jetpack.hover.disable", "Jetpack: Hover Mode Disabled"); provider.add("armor.gtceu.jetpack.emergency_hover_mode", "§aEmergency Hover Mode Enabled!"); //action bar messages - provider.add("armor.gtceu.message.nightvision.enabled", "§aNightVision: §aOn"); - provider.add("armor.gtceu.message.nightvision.disabled", " §cNightVision: §cOff"); - provider.add("armor.gtceu.message.nightvision.error", "§cNot enough power!"); + provider.add("armor.gtceu.message.nightvision.enabled", "NightVision: §aOn"); + provider.add("armor.gtceu.message.nightvision.disabled", "NightVision: §cOff"); + provider.add("armor.gtceu.message.nightvision.error", "Not enough power!"); } From 716fab8e11053a7f194dfbecfe66ab6c896206cd Mon Sep 17 00:00:00 2001 From: Spicierspace153 <21964509+Spicierspace153@users.noreply.github.com> Date: Thu, 19 Jun 2025 21:46:23 -0600 Subject: [PATCH 09/45] Fluid Lang Keys rename :) --- .../gtceu/api/fluids/FluidState.java | 6 +-- .../api/fluids/attribute/FluidAttributes.java | 2 +- .../api/fluids/store/FluidStorageKeys.java | 12 ++--- .../gtceu/api/gui/widget/TankWidget.java | 6 +-- .../gtceu/client/TooltipsHandler.java | 10 ++--- .../gtceu/common/data/GTItems.java | 2 +- .../data/materials/ElementMaterials.java | 8 ++-- .../materials/OrganicChemistryMaterials.java | 2 +- .../gtceu/data/lang/CommandLang.java | 4 +- .../gtceu/data/lang/ConfigurationLang.java | 2 +- .../gtceu/data/lang/LangHandler.java | 1 + .../gtceu/data/lang/MaterialLang.java | 45 +++++++++++-------- .../resources/assets/gtceu/lang/ja_jp.json | 34 +++++++------- .../resources/assets/gtceu/lang/ru_ru.json | 34 +++++++------- .../resources/assets/gtceu/lang/uk_ua.json | 34 +++++++------- .../resources/assets/gtceu/lang/zh_cn.json | 34 +++++++------- .../resources/assets/gtceu/lang/zh_tw.json | 34 +++++++------- 17 files changed, 140 insertions(+), 130 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidState.java b/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidState.java index d6d684f2149..704636c6941 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidState.java +++ b/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidState.java @@ -11,9 +11,9 @@ public enum FluidState { - LIQUID("gtceu.fluid.state_liquid", CustomTags.LIQUID_FLUIDS), - GAS("gtceu.fluid.state_gas", Tags.Fluids.GASEOUS), - PLASMA("gtceu.fluid.state_plasma", CustomTags.PLASMA_FLUIDS), + LIQUID("fluid.gtceu.tooltip.liquid", CustomTags.LIQUID_FLUIDS), + GAS("fluid.gtceu.tooltip.gas", Tags.Fluids.GASEOUS), + PLASMA("fluid.gtceu.tooltip.plasma", CustomTags.PLASMA_FLUIDS), ; @Getter diff --git a/src/main/java/com/gregtechceu/gtceu/api/fluids/attribute/FluidAttributes.java b/src/main/java/com/gregtechceu/gtceu/api/fluids/attribute/FluidAttributes.java index 2b191232973..2a330ca5726 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/fluids/attribute/FluidAttributes.java +++ b/src/main/java/com/gregtechceu/gtceu/api/fluids/attribute/FluidAttributes.java @@ -10,7 +10,7 @@ public final class FluidAttributes { * Attribute for acidic fluids. */ public static final FluidAttribute ACID = new FluidAttribute(GTCEu.id("acid"), - list -> list.accept(Component.translatable("gtceu.fluid.type_acid.tooltip")), + list -> list.accept(Component.translatable("fluid.gtceu.tooltip.acid")), list -> list.accept(Component.translatable("gtceu.fluid_pipe.acid_proof"))); private FluidAttributes() {} diff --git a/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorageKeys.java b/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorageKeys.java index 712e56e0672..2a75a65e8fa 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorageKeys.java +++ b/src/main/java/com/gregtechceu/gtceu/api/fluids/store/FluidStorageKeys.java @@ -15,7 +15,7 @@ public final class FluidStorageKeys { public static final FluidStorageKey LIQUID = new FluidStorageKey(GTCEu.id("liquid"), MaterialIconType.liquid, m -> prefixedRegisteredName("liquid_", FluidStorageKeys.LIQUID, m), - m -> m.hasProperty(PropertyKey.DUST) ? "gtceu.fluid.liquid_generic" : "gtceu.fluid.generic", + m -> m.hasProperty(PropertyKey.DUST) ? "fluid.gtceu.liquid_generic" : "fluid.gtceu.generic", FluidState.LIQUID, 0); public static final FluidStorageKey GAS = new FluidStorageKey(GTCEu.id("gas"), @@ -23,28 +23,28 @@ public final class FluidStorageKeys { m -> postfixedRegisteredName("_gas", FluidStorageKeys.GAS, m), m -> { if (m.hasProperty(PropertyKey.DUST)) { - return "gtceu.fluid.gas_vapor"; + return "fluid.gtceu.gas_vapor"; } if (m.isElement()) { FluidProperty property = m.getProperty(PropertyKey.FLUID); if (m.isElement() || (property != null && property.getPrimaryKey() != FluidStorageKeys.LIQUID)) { - return "gtceu.fluid.gas_generic"; + return "fluid.gtceu.gas_generic"; } } - return "gtceu.fluid.generic"; + return "fluid.gtceu.generic"; }, FluidState.GAS, 0); public static final FluidStorageKey PLASMA = new FluidStorageKey(GTCEu.id("plasma"), MaterialIconType.plasma, m -> m.getName() + "_plasma", - m -> "gtceu.fluid.plasma", + m -> "fluid.gtceu.plasma", FluidState.PLASMA, -1); public static final FluidStorageKey MOLTEN = new FluidStorageKey(GTCEu.id("molten"), CustomTags.MOLTEN_FLUIDS, MaterialIconType.molten, m -> "molten_" + m.getName(), - m -> "gtceu.fluid.molten", + m -> "fluid.gtceu.molten", FluidState.LIQUID, -1); private FluidStorageKeys() {} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/TankWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/TankWidget.java index 93da02eaab1..bbdb4e0ef7f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/TankWidget.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/TankWidget.java @@ -328,15 +328,15 @@ public List getFullTooltipTexts() { tooltips.add(fluidStack.getDisplayName()); if (!isPhantom && showAmount) { tooltips.add( - Component.translatable("gtceu.fluid.amount", + Component.translatable("fluid.gtceu.amount", FormattingUtil.formatNumbers(fluidStack.getAmount()), FormattingUtil.formatNumbers(lastTankCapacity))); } TooltipsHandler.appendFluidTooltips(fluidStack, tooltips::add, null); } else { - tooltips.add(Component.translatable("gtceu.fluid.empty")); + tooltips.add(Component.translatable("fluid.gtceu.empty")); if (!isPhantom && showAmount) { - tooltips.add(Component.translatable("gtceu.fluid.amount", 0, + tooltips.add(Component.translatable("fluid.gtceu.amount", 0, FormattingUtil.formatNumbers(lastTankCapacity))); } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/TooltipsHandler.java b/src/main/java/com/gregtechceu/gtceu/client/TooltipsHandler.java index 5f6350b2492..fb95c33779f 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/TooltipsHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/client/TooltipsHandler.java @@ -118,9 +118,9 @@ public static void appendFluidTooltips(FluidStack fluidStack, Consumer tooltips.accept(Component.translatable("gtceu.fluid.state_liquid")); - case GAS -> tooltips.accept(Component.translatable("gtceu.fluid.state_gas")); - case PLASMA -> tooltips.accept(Component.translatable("gtceu.fluid.state_plasma")); + case LIQUID -> tooltips.accept(Component.translatable("fluid.gtceu.tooltip.liquid")); + case GAS -> tooltips.accept(Component.translatable("fluid.gtceu.tooltip.gas")); + case PLASMA -> tooltips.accept(Component.translatable("fluid.gtceu.tooltip.plasma")); } attributedFluid.getAttributes().forEach(a -> a.appendFluidTooltips(tooltips)); } else { @@ -128,9 +128,9 @@ public static void appendFluidTooltips(FluidStack fluidStack, Consumer(), Configuration.registerConfig(ConfigHolder.class, ConfigFormats.yaml()).getValueMap()); } - + //depth first search === dfs private static void dfs(RegistrateLangProvider provider, Set added, Map> map) { for (var entry : map.entrySet()) { var id = entry.getValue().getId(); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java index 4fc51b6e280..f961ef2795e 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -30,6 +30,7 @@ public static void init(RegistrateLangProvider provider) { ToolLang.init(provider); ConfigurationLang.init(provider); ArmorLang.init(provider); + CommandLang.init(provider); provider.add("gtceu.gui.editor.tips.citation", "Number of citations"); provider.add("gtceu.gui.editor.group.recipe_type", "cap"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java index 4de09c6f472..cf171912500 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java @@ -19,7 +19,8 @@ public static void generateCustomMaterialNames(RegistrateLangProvider provider ) replace(provider, GTMaterials.FullersEarth.getUnlocalizedName(), "Fuller's Earth"); replace(provider, GTMaterials.Cooperite.getUnlocalizedName(), "Sheldonite"); // greg's humor is now on - // 1.19... + + //1.20.1... replace(provider, GTMaterials.HSSG.getUnlocalizedName(), "HSS-G"); replace(provider, GTMaterials.HSSE.getUnlocalizedName(), "HSS-E"); replace(provider, GTMaterials.HSSS.getUnlocalizedName(), "HSS-S"); @@ -93,27 +94,33 @@ public static void generateCustomMaterialNames(RegistrateLangProvider provider ) } public static void generateFluidKeys(RegistrateLangProvider provider){ - provider.add("gtceu.fluid.click_to_fill", + + + + provider.add("fluid.gtceu.liquid_generic", "Liquid %s"); + provider.add("fluid.gtceu.generic", "%s"); + provider.add("fluid.gtceu.gas_generic", "%s Gas"); + provider.add("fluid.gtceu.gas_vapor", "%s Vapor"); + provider.add("fluid.gtceu.plasma", "%s Plasma"); + provider.add("fluid.gtceu.molten", "Molten %s"); + + //ui + provider.add("fluid.gtceu.empty", "Empty"); + provider.add("fluid.gtceu.amount", "§9Amount: %d/%d mB"); + provider.add("fluid.gtceu.click_to_fill", "§7Click with a Fluid Container to §bfill §7the tank (Shift-click for a full stack)."); - provider.add("gtceu.fluid.click_combined", + provider.add("fluid.gtceu.click_combined", "§7Click with a Fluid Container to §cempty §7or §bfill §7the tank (Shift-click for a full stack)."); - provider.add("gtceu.fluid.click_to_empty", + provider.add("fluid.gtceu.click_to_empty", "§7Click with a Fluid Container to §cempty §7the tank (Shift-click for a full stack)."); - - provider.add("gtceu.fluid.liquid_generic", "Liquid %s"); - provider.add("gtceu.fluid.generic", "%s"); - provider.add("gtceu.fluid.gas_generic", "%s Gas"); - provider.add("gtceu.fluid.gas_vapor", "%s Vapor"); - provider.add("gtceu.fluid.plasma", "%s Plasma"); - provider.add("gtceu.fluid.molten", "Molten %s"); - provider.add("gtceu.fluid.empty", "Empty"); - provider.add("gtceu.fluid.amount", "§9Amount: %d/%d mB"); - provider.add("gtceu.fluid.temperature", "§cTemperature: %d K"); - provider.add("gtceu.fluid.temperature.cryogenic", "§bCryogenic! Handle with care!"); - provider.add("gtceu.fluid.state_gas", "§aState: Gaseous"); - provider.add("gtceu.fluid.state_liquid", "§aState: Liquid"); - provider.add("gtceu.fluid.state_plasma", "§aState: Plasma"); - provider.add("gtceu.fluid.type_acid.tooltip", "§6Acidic! Handle with care!"); + //tooltips + provider.add("fluid.gtceu.tooltip.temperature", "§cTemperature: %d K"); + provider.add("fluid.gtceu.tooltip.cryogenic", "§bCryogenic! Handle with care!"); + provider.add("fluid.gtceu.tooltip.gas", "§aState: Gaseous"); + provider.add("fluid.gtceu.tooltip.liquid", "§aState: Liquid"); + provider.add("fluid.gtceu.tooltip.plasma", "§aState: Plasma"); + provider.add("fluid.gtceu.tooltip.acid", "§6Acidic! Handle with care!"); } + } diff --git a/src/main/resources/assets/gtceu/lang/ja_jp.json b/src/main/resources/assets/gtceu/lang/ja_jp.json index e64c0d62504..5e929b79e85 100644 --- a/src/main/resources/assets/gtceu/lang/ja_jp.json +++ b/src/main/resources/assets/gtceu/lang/ja_jp.json @@ -2192,23 +2192,23 @@ "gtceu.extractor": "抽出機", "gtceu.extruder": "押出機", "gtceu.fermenter": "発酵槽", - "gtceu.fluid.amount": "§9量: %d/%d mB", - "gtceu.fluid.click_combined": "§7液体コンテナで§7クリックし、タンクを§7満タンにするか、または§7満タンにする(満タンにするには Shift キーを押しながらクリックする)。", - "gtceu.fluid.click_to_empty": "§7液体コンテナで§7クリックし、タンクを§7空にする(フルスタックにするにはShiftキーを押しながらクリックする)。", - "gtceu.fluid.click_to_fill": "§7液体コンテナで§7クリックし、タンクを§7満タンにする(Shiftキーを押しながらクリックすると満タンになる)。", - "gtceu.fluid.empty": "空", - "gtceu.fluid.gas_generic": "%sガス", - "gtceu.fluid.gas_vapor": "%s蒸気", - "gtceu.fluid.generic": "%s", - "gtceu.fluid.liquid_generic": "液化%s", - "gtceu.fluid.molten": "熔融%s", - "gtceu.fluid.plasma": "%sプラズマ", - "gtceu.fluid.state_gas": "§a状態: 気体", - "gtceu.fluid.state_liquid": "§a状態: 液体", - "gtceu.fluid.state_plasma": "§a状態: プラズマ", - "gtceu.fluid.temperature": "§c温度: %d K", - "gtceu.fluid.temperature.cryogenic": "§b低温!取り扱い注意!", - "gtceu.fluid.type_acid.tooltip": "§6酸性!取り扱い注意!", + "fluid.gtceu.amount": "§9量: %d/%d mB", + "fluid.gtceu.click_combined": "§7液体コンテナで§7クリックし、タンクを§7満タンにするか、または§7満タンにする(満タンにするには Shift キーを押しながらクリックする)。", + "fluid.gtceu.click_to_empty": "§7液体コンテナで§7クリックし、タンクを§7空にする(フルスタックにするにはShiftキーを押しながらクリックする)。", + "fluid.gtceu.click_to_fill": "§7液体コンテナで§7クリックし、タンクを§7満タンにする(Shiftキーを押しながらクリックすると満タンになる)。", + "fluid.gtceu.empty": "空", + "fluid.gtceu.gas_generic": "%sガス", + "fluid.gtceu.gas_vapor": "%s蒸気", + "fluid.gtceu.generic": "%s", + "fluid.gtceu.liquid_generic": "液化%s", + "fluid.gtceu.molten": "熔融%s", + "fluid.gtceu.plasma": "%sプラズマ", + "fluid.gtceu.tooltip.gas": "§a状態: 気体", + "fluid.gtceu.tooltip.liquid": "§a状態: 液体", + "fluid.gtceu.tooltip.plasma": "§a状態: プラズマ", + "fluid.gtceu.tooltip.temperature": "§c温度: %d K", + "fluid.gtceu.tooltip.cryogenic": "§b低温!取り扱い注意!", + "fluid.gtceu.tooltip.acid": "§6酸性!取り扱い注意!", "gtceu.fluid_heater": "液体加熱機", "gtceu.fluid_pipe.acid_proof": "§6酸を扱える", "gtceu.fluid_pipe.capacity": "§9容量: §f%d mB", diff --git a/src/main/resources/assets/gtceu/lang/ru_ru.json b/src/main/resources/assets/gtceu/lang/ru_ru.json index 25e80ab8a22..5f00214670f 100644 --- a/src/main/resources/assets/gtceu/lang/ru_ru.json +++ b/src/main/resources/assets/gtceu/lang/ru_ru.json @@ -1544,23 +1544,23 @@ "gtceu.extractor": "Экстрактор", "gtceu.extruder": "Экструдер", "gtceu.fermenter": "Ферментатор", - "gtceu.fluid.amount": "§9Количество: %d/%d мЛ", - "gtceu.fluid.click_combined": "§7Нажмите с хранилищем для жидкости, чтобы §bзаполнить §7или §cопустошить §7резервуар.", - "gtceu.fluid.click_to_empty": "§7Нажмите с хранилищем для жидкости, чтобы §bзаполнить §7или §cопустошить §7резервуар.", - "gtceu.fluid.click_to_fill": "§7Нажмите с хранилищем для жидкости, чтобы §bзаполнить §7резервуар.", - "gtceu.fluid.empty": "Пусто", - "gtceu.fluid.gas_generic": "%s (Газ)", - "gtceu.fluid.gas_vapor": "Пар (%s)", - "gtceu.fluid.generic": "%s", - "gtceu.fluid.liquid_generic": "%s (Жидкость)", - "gtceu.fluid.molten": "Расплав (%s)", - "gtceu.fluid.plasma": "Плазма (%s)", - "gtceu.fluid.state_gas": "§7Состояние: Газообразный", - "gtceu.fluid.state_liquid": "§7Состояние: Жидкость", - "gtceu.fluid.state_plasma": "§7Состояние: Плазма", - "gtceu.fluid.temperature": "§cТемпература: %d K", - "gtceu.fluid.temperature.cryogenic": "§bКриогенный! Соблюдайте осторожность!", - "gtceu.fluid.type_acid.tooltip": "§6Кислота! Соблюдайте осторожность!", + "fluid.gtceu.amount": "§9Количество: %d/%d мЛ", + "fluid.gtceu.click_combined": "§7Нажмите с хранилищем для жидкости, чтобы §bзаполнить §7или §cопустошить §7резервуар.", + "fluid.gtceu.click_to_empty": "§7Нажмите с хранилищем для жидкости, чтобы §bзаполнить §7или §cопустошить §7резервуар.", + "fluid.gtceu.click_to_fill": "§7Нажмите с хранилищем для жидкости, чтобы §bзаполнить §7резервуар.", + "fluid.gtceu.empty": "Пусто", + "fluid.gtceu.gas_generic": "%s (Газ)", + "fluid.gtceu.gas_vapor": "Пар (%s)", + "fluid.gtceu.generic": "%s", + "fluid.gtceu.liquid_generic": "%s (Жидкость)", + "fluid.gtceu.molten": "Расплав (%s)", + "fluid.gtceu.plasma": "Плазма (%s)", + "fluid.gtceu.tooltip.gas": "§7Состояние: Газообразный", + "fluid.gtceu.tooltip.liquid": "§7Состояние: Жидкость", + "fluid.gtceu.tooltip.plasma": "§7Состояние: Плазма", + "fluid.gtceu.tooltip.temperature": "§cТемпература: %d K", + "fluid.gtceu.tooltip.cryogenic": "§bКриогенный! Соблюдайте осторожность!", + "fluid.gtceu.tooltip.acid": "§6Кислота! Соблюдайте осторожность!", "gtceu.fluid_heater": "Жидкостный нагреватель", "gtceu.fluid_pipe.acid_proof": "§6Может хранить кислоты", "gtceu.fluid_pipe.capacity": "§9Вместимость: §f%d мВ", diff --git a/src/main/resources/assets/gtceu/lang/uk_ua.json b/src/main/resources/assets/gtceu/lang/uk_ua.json index 668eaad5508..ff88f153bcf 100644 --- a/src/main/resources/assets/gtceu/lang/uk_ua.json +++ b/src/main/resources/assets/gtceu/lang/uk_ua.json @@ -1559,31 +1559,31 @@ "item.tool.tooltip.rotor.efficiency": "Ефективність турбіни:§9 %d%%", "item.tool.tooltip.rotor.power": "Потужність турбіни:§9 %d%%", - "gtceu.fluid.gas_vapor": "%s (пара)", - "gtceu.fluid.plasma": "%s (плазма)", - "gtceu.fluid.gas_generic": "%s (газ)", - "gtceu.fluid.liquid_generic": "%s (рідина)", - "gtceu.fluid.molten": "%s (розплавлений)", - "gtceu.fluid.state_gas": "§aСтан: газоподібний", - "gtceu.fluid.state_liquid": "§aСтан: рідкий", - "gtceu.fluid.state_plasma": "§aСтан: плазма", - "gtceu.fluid.temperature": "§cТемпература: %d K", - "gtceu.fluid.temperature.cryogenic": "§bКріогенна небезпека! тримайте обережно!", - "gtceu.fluid.type_acid.tooltip": "§6Кислотна небезпека! тримайте обережно!", + "fluid.gtceu.gas_vapor": "%s (пара)", + "fluid.gtceu.plasma": "%s (плазма)", + "fluid.gtceu.gas_generic": "%s (газ)", + "fluid.gtceu.liquid_generic": "%s (рідина)", + "fluid.gtceu.molten": "%s (розплавлений)", + "fluid.gtceu.tooltip.gas": "§aСтан: газоподібний", + "fluid.gtceu.tooltip.liquid": "§aСтан: рідкий", + "fluid.gtceu.tooltip.plasma": "§aСтан: плазма", + "fluid.gtceu.tooltip.temperature": "§cТемпература: %d K", + "fluid.gtceu.tooltip.cryogenic": "§bКріогенна небезпека! тримайте обережно!", + "fluid.gtceu.tooltip.acid": "§6Кислотна небезпека! тримайте обережно!", "gtceu.fluid_pipe.not_gas_proof": "§4Можливий витік газів!", "gtceu.fluid_pipe.acid_proof": "§6Може працювати з кислотами", "gtceu.fluid_pipe.plasma_proof": "§6Може працювати з усіма видами плазми", "gtceu.fluid_pipe.cryo_proof": "§6Може працювати з кріогенними речовинами", "gtceu.fluid_pipe.gas_proof": "§6Може працювати з газами", - "gtceu.fluid.click_to_fill": "§7Клацніть контейнером з рідиною, щоб§b заповнити§7 бак (Shift-клік для повного стосу).", - "gtceu.fluid.click_combined": "§7Клацніть контейнером з рідиною, щоб§b спустошити§7 або§b заповнити§7 бак (Shift-клік для повного стосу).", - "gtceu.fluid.click_to_empty": "§7Клацніть контейнером з рідиною, щоб§b спустошити§7 бак (Shift-клік для повного стосу).", - "gtceu.fluid.amount": "§9Ємність: %d/%d мВ", + "fluid.gtceu.click_to_fill": "§7Клацніть контейнером з рідиною, щоб§b заповнити§7 бак (Shift-клік для повного стосу).", + "fluid.gtceu.click_combined": "§7Клацніть контейнером з рідиною, щоб§b спустошити§7 або§b заповнити§7 бак (Shift-клік для повного стосу).", + "fluid.gtceu.click_to_empty": "§7Клацніть контейнером з рідиною, щоб§b спустошити§7 бак (Shift-клік для повного стосу).", + "fluid.gtceu.amount": "§9Ємність: %d/%d мВ", "gtceu.fluid_pipe.capacity": "§9Місткість:§f %d мВ", "gtceu.fluid_pipe.max_temperature": "§cМежа температури:§f %d K", "gtceu.fluid_pipe.channels": "§eКанали:§f %d", - "gtceu.fluid.empty": "Порожньо", - "gtceu.fluid.generic": "%s", + "fluid.gtceu.empty": "Порожньо", + "fluid.gtceu.generic": "%s", "block.gtceu.long_distance_item_pipeline_input_pos": " - вхід: %s", "block.gtceu.long_distance_item_pipeline_output_pos": " - вихід: %s", diff --git a/src/main/resources/assets/gtceu/lang/zh_cn.json b/src/main/resources/assets/gtceu/lang/zh_cn.json index 228ea6e37ba..4e62711fb17 100644 --- a/src/main/resources/assets/gtceu/lang/zh_cn.json +++ b/src/main/resources/assets/gtceu/lang/zh_cn.json @@ -2246,23 +2246,23 @@ "gtceu.extractor": "提取机", "gtceu.extruder": "压模器", "gtceu.fermenter": "发酵槽", - "gtceu.fluid.amount": "§9总量:%d/%d mB", - "gtceu.fluid.click_combined": "§7手持流体容器点击流体槽以§c倒出§7或§b填入§7流体(Shift+单击以用整组容器倒出流体或用整组容器中的流体填入)", - "gtceu.fluid.click_to_empty": "§7手持流体容器点击流体槽以§c倒出§7流体(Shift+单击以用整组容器倒出流体)", - "gtceu.fluid.click_to_fill": "§7手持流体容器点击流体槽以§b填入§7流体(Shift+单击以用整组容器中的流体填入)", - "gtceu.fluid.empty": "空", - "gtceu.fluid.gas_generic": "气态%s", - "gtceu.fluid.gas_vapor": "%s蒸气", - "gtceu.fluid.generic": "%s", - "gtceu.fluid.liquid_generic": "液态%s", - "gtceu.fluid.molten": "熔融%s", - "gtceu.fluid.plasma": "%s等离子体", - "gtceu.fluid.state_gas": "§a状态:气态", - "gtceu.fluid.state_liquid": "§a状态:液态", - "gtceu.fluid.state_plasma": "§a状态:等离子态", - "gtceu.fluid.temperature": "§c温度:%d K", - "gtceu.fluid.temperature.cryogenic": "§b低温流体!轻拿轻放!", - "gtceu.fluid.type_acid.tooltip": "§6酸性流体!轻拿轻放!", + "fluid.gtceu.amount": "§9总量:%d/%d mB", + "fluid.gtceu.click_combined": "§7手持流体容器点击流体槽以§c倒出§7或§b填入§7流体(Shift+单击以用整组容器倒出流体或用整组容器中的流体填入)", + "fluid.gtceu.click_to_empty": "§7手持流体容器点击流体槽以§c倒出§7流体(Shift+单击以用整组容器倒出流体)", + "fluid.gtceu.click_to_fill": "§7手持流体容器点击流体槽以§b填入§7流体(Shift+单击以用整组容器中的流体填入)", + "fluid.gtceu.empty": "空", + "fluid.gtceu.gas_generic": "气态%s", + "fluid.gtceu.gas_vapor": "%s蒸气", + "fluid.gtceu.generic": "%s", + "fluid.gtceu.liquid_generic": "液态%s", + "fluid.gtceu.molten": "熔融%s", + "fluid.gtceu.plasma": "%s等离子体", + "fluid.gtceu.tooltip.gas": "§a状态:气态", + "fluid.gtceu.tooltip.liquid": "§a状态:液态", + "fluid.gtceu.tooltip.plasma": "§a状态:等离子态", + "fluid.gtceu.tooltip.temperature": "§c温度:%d K", + "fluid.gtceu.tooltip.cryogenic": "§b低温流体!轻拿轻放!", + "fluid.gtceu.tooltip.acid": "§6酸性流体!轻拿轻放!", "gtceu.fluid_heater": "流体加热器", "gtceu.fluid_pipe.acid_proof": "§6可传输酸性物质", "gtceu.fluid_pipe.capacity": "§9容积:§f%d mB", diff --git a/src/main/resources/assets/gtceu/lang/zh_tw.json b/src/main/resources/assets/gtceu/lang/zh_tw.json index c5a3992e5aa..41a9ed15336 100644 --- a/src/main/resources/assets/gtceu/lang/zh_tw.json +++ b/src/main/resources/assets/gtceu/lang/zh_tw.json @@ -2246,23 +2246,23 @@ "gtceu.extractor": "提取機", "gtceu.extruder": "壓模器", "gtceu.fermenter": "發酵槽", - "gtceu.fluid.amount": "§9總量:%d/%d mB", - "gtceu.fluid.click_combined": "§7手持流體容器點選流體槽以§c倒出§7或§b填入§7流體(Shift+點擊以用整組容器倒出流體或用整組容器中的流體填入)", - "gtceu.fluid.click_to_empty": "§7手持流體容器點選流體槽以§c倒出§7流體(Shift+點擊以用整組容器倒出流體)", - "gtceu.fluid.click_to_fill": "§7手持流體容器點選流體槽以§b填入§7流體(Shift+點擊以用整組容器中的流體填入)", - "gtceu.fluid.empty": "空", - "gtceu.fluid.gas_generic": "氣態%s", - "gtceu.fluid.gas_vapor": "%s蒸氣", - "gtceu.fluid.generic": "%s", - "gtceu.fluid.liquid_generic": "液態%s", - "gtceu.fluid.molten": "熔融%s", - "gtceu.fluid.plasma": "%s電漿", - "gtceu.fluid.state_gas": "§a狀態:氣態", - "gtceu.fluid.state_liquid": "§a狀態:液態", - "gtceu.fluid.state_plasma": "§a狀態:電漿態", - "gtceu.fluid.temperature": "§c溫度:%d K", - "gtceu.fluid.temperature.cryogenic": "§b低溫流體!輕拿輕放!", - "gtceu.fluid.type_acid.tooltip": "§6酸性流體!輕拿輕放!", + "fluid.gtceu.amount": "§9總量:%d/%d mB", + "fluid.gtceu.click_combined": "§7手持流體容器點選流體槽以§c倒出§7或§b填入§7流體(Shift+點擊以用整組容器倒出流體或用整組容器中的流體填入)", + "fluid.gtceu.click_to_empty": "§7手持流體容器點選流體槽以§c倒出§7流體(Shift+點擊以用整組容器倒出流體)", + "fluid.gtceu.click_to_fill": "§7手持流體容器點選流體槽以§b填入§7流體(Shift+點擊以用整組容器中的流體填入)", + "fluid.gtceu.empty": "空", + "fluid.gtceu.gas_generic": "氣態%s", + "fluid.gtceu.gas_vapor": "%s蒸氣", + "fluid.gtceu.generic": "%s", + "fluid.gtceu.liquid_generic": "液態%s", + "fluid.gtceu.molten": "熔融%s", + "fluid.gtceu.plasma": "%s電漿", + "fluid.gtceu.tooltip.gas": "§a狀態:氣態", + "fluid.gtceu.tooltip.liquid": "§a狀態:液態", + "fluid.gtceu.tooltip.plasma": "§a狀態:電漿態", + "fluid.gtceu.tooltip.temperature": "§c溫度:%d K", + "fluid.gtceu.tooltip.cryogenic": "§b低溫流體!輕拿輕放!", + "fluid.gtceu.tooltip.acid": "§6酸性流體!輕拿輕放!", "gtceu.fluid_heater": "流體加熱器", "gtceu.fluid_pipe.acid_proof": "§6可傳輸酸性物質", "gtceu.fluid_pipe.capacity": "§9容積:§f%d mB", From fc8c460a33bf0fc3b6d36f9b8edcf1ca8d625fd3 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Thu, 19 Jun 2025 22:27:29 -0600 Subject: [PATCH 10/45] tool lang, command lang, fix missing cut paste errors --- .../resources/assets/gtceu/lang/en_ud.json | 358 +++++++++--------- .../resources/assets/gtceu/lang/en_us.json | 358 +++++++++--------- .../medical_condition.arsenicosis.json | 5 + .../medical_condition.asbestosis.json | 5 + .../medical_condition.berylliosis.json | 5 + ...l_condition.carbon_monoxide_poisoning.json | 5 + .../medical_condition.carcinogen.json | 5 + .../medical_condition.chemical_burns.json | 5 + .../medical_condition.irritant.json | 5 + .../medical_condition.methanol_poisoning.json | 5 + .../damage_type/medical_condition.nausea.json | 5 + .../damage_type/medical_condition.none.json | 5 + .../damage_type/medical_condition.poison.json | 5 + .../medical_condition.silicosis.json | 5 + .../medical_condition.weak_poison.json | 5 + .../medical_condition/arsenicosis.json | 5 - .../medical_condition/asbestosis.json | 5 - .../medical_condition/berylliosis.json | 5 - .../carbon_monoxide_poisoning.json | 5 - .../medical_condition/carcinogen.json | 5 - .../medical_condition/chemical_burns.json | 5 - .../medical_condition/irritant.json | 5 - .../medical_condition/methanol_poisoning.json | 5 - .../damage_type/medical_condition/nausea.json | 5 - .../damage_type/medical_condition/none.json | 5 - .../damage_type/medical_condition/poison.json | 5 - .../medical_condition/silicosis.json | 5 - .../medical_condition/weak_poison.json | 5 - .../tags/damage_type/bypasses_armor.json | 26 +- .../gtceu/api/cover/filter/TagFilter.java | 4 +- .../medicalcondition/MedicalCondition.java | 2 +- .../api/gui/widget/EnumSelectorWidget.java | 4 +- .../api/gui/widget/ToggleButtonWidget.java | 4 +- .../gregtechceu/gtceu/api/item/IGTTool.java | 28 +- .../api/machine/SimpleTieredMachine.java | 6 +- .../CircuitFancyConfigurator.java | 4 +- .../pattern/predicates/SimplePredicate.java | 6 +- .../gtceu/client/TooltipsHandler.java | 4 +- .../gtceu/common/data/GTItems.java | 20 +- .../gtceu/common/data/GTMachines.java | 12 +- .../data/machines/GTResearchMachines.java | 6 +- .../item/armor/AdvancedNanoMuscleSuite.java | 3 +- .../item/armor/AdvancedQuarkTechSuite.java | 3 +- .../gtceu/common/item/armor/Jetpack.java | 3 +- .../common/item/armor/NanoMuscleSuite.java | 3 +- .../common/item/armor/NightvisionGoggles.java | 3 +- .../common/item/armor/QuarkTechSuite.java | 3 +- .../tool/behavior/BlockRotatingBehavior.java | 2 +- .../tool/behavior/DisableShieldBehavior.java | 2 +- .../tool/behavior/EntityDamageBehavior.java | 4 +- .../item/tool/behavior/GrassPathBehavior.java | 2 +- .../tool/behavior/HarvestCropsBehavior.java | 2 +- .../tool/behavior/HarvestIceBehavior.java | 2 +- .../item/tool/behavior/HoeGroundBehavior.java | 2 +- .../item/tool/behavior/LogStripBehavior.java | 2 +- .../item/tool/behavior/PlungerBehavior.java | 2 +- .../tool/behavior/RotateRailBehavior.java | 2 +- .../item/tool/behavior/ScrapeBehavior.java | 2 +- .../tool/behavior/TorchPlaceBehavior.java | 2 +- .../tool/behavior/TreeFellingBehavior.java | 4 +- .../item/tool/behavior/WaxOffBehavior.java | 2 +- .../machine/electric/BlockBreakerMachine.java | 4 +- .../machine/electric/FisherMachine.java | 6 +- .../electric/ItemCollectorMachine.java | 4 +- .../common/machine/electric/MinerMachine.java | 4 +- .../gtceu/core/mixins/top/ConfigMixin.java | 2 +- .../gtceu/data/lang/ArmorLang.java | 28 +- .../gtceu/data/lang/BlockLang.java | 95 +---- .../gtceu/data/lang/CommandLang.java | 38 +- .../gtceu/data/lang/ConfigurationLang.java | 3 +- .../gtceu/data/lang/CoverLang.java | 8 +- .../gtceu/data/lang/HazardLang.java | 7 +- .../gtceu/data/lang/IntegrationLang.java | 3 +- .../gregtechceu/gtceu/data/lang/ItemLang.java | 8 +- .../gtceu/data/lang/LangHandler.java | 55 ++- .../gregtechceu/gtceu/data/lang/LangUtil.java | 3 +- .../gtceu/data/lang/MachineLang.java | 80 ++++ .../gtceu/data/lang/MaterialLang.java | 14 +- .../gtceu/data/lang/RecipeLang.java | 21 +- .../gtceu/data/lang/SubtitleLang.java | 8 +- .../gregtechceu/gtceu/data/lang/ToolLang.java | 189 ++++----- .../gtceu/integration/rei/GTREIPlugin.java | 2 +- .../resources/assets/gtceu/lang/ja_jp.json | 176 ++++----- .../resources/assets/gtceu/lang/ru_ru.json | 176 ++++----- .../resources/assets/gtceu/lang/uk_ua.json | 176 ++++----- .../resources/assets/gtceu/lang/zh_cn.json | 176 ++++----- .../resources/assets/gtceu/lang/zh_tw.json | 176 ++++----- 87 files changed, 1271 insertions(+), 1213 deletions(-) create mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition.arsenicosis.json create mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition.asbestosis.json create mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition.berylliosis.json create mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition.carbon_monoxide_poisoning.json create mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition.carcinogen.json create mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition.chemical_burns.json create mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition.irritant.json create mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition.methanol_poisoning.json create mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition.nausea.json create mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition.none.json create mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition.poison.json create mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition.silicosis.json create mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition.weak_poison.json delete mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition/arsenicosis.json delete mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition/asbestosis.json delete mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition/berylliosis.json delete mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition/carbon_monoxide_poisoning.json delete mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition/carcinogen.json delete mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition/chemical_burns.json delete mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition/irritant.json delete mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition/methanol_poisoning.json delete mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition/nausea.json delete mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition/none.json delete mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition/poison.json delete mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition/silicosis.json delete mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition/weak_poison.json diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 65399fb0ab2..8aed30d56eb 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -1,4 +1,47 @@ { + "armor.gtceu.energy_share.disable": "pǝןqɐsıp buıbɹɐɥɔ sʇǝbpɐ⅁ :ʎןddnS ʎbɹǝuƎ", + "armor.gtceu.energy_share.enable": "pǝןqɐuǝ buıbɹɐɥɔ sʇǝbpɐ⅁ :ʎןddnS ʎbɹǝuƎ", + "armor.gtceu.energy_share.error": "¡buıbɹɐɥɔ sʇǝbpɐb ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ʎןddnS ʎbɹǝuƎ", + "armor.gtceu.energy_share.tooltip": "%s :ǝpoɯ ʎןddnS", + "armor.gtceu.energy_share.tooltip.guide": "ɯǝʇı buıpןoɥ uǝɥʍ ʞɔıןɔ ʇɥbıɹ-ʇɟıɥs ǝpoɯ ǝbuɐɥɔ o⟘", + "armor.gtceu.hud.energy_lvl": "%s :ןǝʌǝꞀ ʎbɹǝuƎ", + "armor.gtceu.hud.engine_enabled": "%s :pǝןqɐuƎ ǝuıbuƎ", + "armor.gtceu.hud.fuel_lvl": "%s :ןǝʌǝꞀ ןǝnℲ", + "armor.gtceu.hud.gravi_engine": "%s :ǝuıbuƎıʌɐɹ⅁", + "armor.gtceu.hud.hover_mode": "%s :ǝpoW ɹǝʌoH", + "armor.gtceu.hud.status.disabled": "ℲℲOɔ§", + "armor.gtceu.hud.status.enabled": "NOɐ§", + "armor.gtceu.jetpack.emergency_hover_mode": "¡pǝןqɐuƎ ǝpoW ɹǝʌoH ʎɔuǝbɹǝɯƎ", + "armor.gtceu.jetpack.flight.disable": "pǝןqɐsıᗡ ʇɥbıןℲ :ʞɔɐdʇǝſ", + "armor.gtceu.jetpack.flight.enable": "pǝןqɐuƎ ʇɥbıןℲ :ʞɔɐdʇǝſ", + "armor.gtceu.jetpack.hover.disable": "pǝןqɐsıᗡ ǝpoW ɹǝʌoH :ʞɔɐdʇǝſ", + "armor.gtceu.jetpack.hover.enable": "pǝןqɐuƎ ǝpoW ɹǝʌoH :ʞɔɐdʇǝſ", + "armor.gtceu.message.nightvision.disabled": "ɟɟOɔ§ :uoısıΛʇɥbıNq§", + "armor.gtceu.message.nightvision.enabled": "uOɐ§ :uoısıΛʇɥbıNq§", + "armor.gtceu.message.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§", + "armor.gtceu.nms.boosted_jump.disabled": "pǝןqɐsıᗡ ʇsooᗺ dɯnſ :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.nms.boosted_jump.enabled": "pǝןqɐuƎ ʇsooᗺ dɯnſ :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.nms.charge.disable": "pǝןqɐsıᗡ buıbɹɐɥƆ :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.nms.charge.enable": "pǝןqɐuƎ buıbɹɐɥƆ :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.nms.charge.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.nms.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıN :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.nms.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıN :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.nms.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.qts.charge.disable": "pǝןqɐsıᗡ buıbɹɐɥƆ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.qts.charge.enable": "pǝןqɐuƎ buıbɹɐɥƆ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.qts.charge.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.qts.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıN :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.qts.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıN :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.qts.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.tooltip.autoeat": "ʎɹoʇuǝʌuI ɯoɹɟ pooℲ buıs∩ ʎq ɹɐᗺ pooℲ sǝɥsıuǝןdǝᴚ", + "armor.gtceu.tooltip.breath": "ɹɐᗺ ɥʇɐǝɹᗺ ɹǝʇɐʍɹǝpu∩ sǝɥsıuǝןdǝᴚ", + "armor.gtceu.tooltip.burning": "buıuɹnᗺ sǝıɟıןןnN", + "armor.gtceu.tooltip.falldamage": "ǝbɐɯɐᗡ ןןɐℲ sǝıɟıןןnN", + "armor.gtceu.tooltip.freezing": "buızǝǝɹℲ sʇuǝʌǝɹԀ", + "armor.gtceu.tooltip.jump": "ǝɔuɐʇsıᗡ puɐ ʇɥbıǝH dɯnſ sǝsɐǝɹɔuI", + "armor.gtceu.tooltip.potions": "sʇɔǝɟɟƎ ןnɟɯɹɐH sǝıɟıןןnN", + "armor.gtceu.tooltip.speed": "pǝǝdS buıuunᴚ sǝsɐǝɹɔuI", + "armor.gtceu.tooltip.stepassist": "ʇsıssⱯ-dǝʇS sǝpıʌoɹԀ", "behavior.data_item.assemblyline.data": "%sɐ§ -", "behavior.data_item.assemblyline.title": ":ɐʇɐᗡ uoıʇɔnɹʇsuoƆ ǝuıꞀ ʎןqɯǝssⱯu§", "behavior.item_magnet.disabled": "pǝןqɐsıᗡ pןǝıℲ ɔıʇǝubɐWɔ§", @@ -1703,14 +1746,40 @@ "block.surface_rock": "ʞɔoᴚ ǝɔɐɟɹnS %s", "button.gtceu.mark_as_depleted.name": "pǝʇǝןdǝᗡ sɐ ʞɹɐW", "button.gtceu.toggle_waypoint.name": "ʇuıodʎɐM ǝןbbo⟘", + "command.gtceu.copy.click_to_copy": "ʎdoɔ oʇ ʞɔıןƆ", + "command.gtceu.copy.copied_and_click": "uıɐbɐ ʎdoɔ oʇ ʞɔıןƆ ˙pɹɐoqdıןɔ oʇ pǝıdoɔ", + "command.gtceu.copy.copied_end": "pɹɐoqdıןɔ ǝɥʇ oʇ ]", + "command.gtceu.copy.copied_start": "[ pǝıdoƆ", "command.gtceu.dump_data.success": "%s oʇ %s ʎɹʇsıbǝɹ ɯoɹɟ sǝɔɹnosǝɹ %s pǝdɯnᗡ", + "command.gtceu.hand.electric": "%s :ʎɹǝʇʇɐᗺ sI ؛%d :ɹǝı⟘ - ∩Ǝ %d / %d :oɟuI ɔıɹʇɔǝןƎ", + "command.gtceu.hand.fluid": "%s :uıɐɹᗡ uɐƆ ؛%s :ןןıℲ uɐƆ ؛ᗺɯ %d / %d :oɟuI pınןℲ", + "command.gtceu.hand.fluid2": ":pI pınןℲ", + "command.gtceu.hand.groovy": "puɐɥ sb/9§ buısn ɹǝpısuoƆ", + "command.gtceu.hand.item_id": ")%d :ɐʇɐpɐʇǝW( %s :ɯǝʇI", + "command.gtceu.hand.material": ":pI ןɐıɹǝʇɐW", + "command.gtceu.hand.meta_item": ":pI ɯǝʇIɐʇǝW", + "command.gtceu.hand.no_item": "˙puɐɯɯoɔ sıɥʇ buıʇnɔǝxǝ ǝɹoɟǝq puɐɥ ɟɟo ɹo puɐɥ uıɐɯ uı buıɥʇǝɯos pןoɥ ʇsnɯ noʎ", + "command.gtceu.hand.not_a_player": "˙ɹǝʎɐןd ɐ ʎq ǝןqɐsn ʎןuo sı puɐɯɯoɔ sıɥ⟘", + "command.gtceu.hand.ore_prefix": ":xıɟǝɹd ǝɹO", + "command.gtceu.hand.tag_entries": ":sǝıɹʇuǝ bɐ⟘Ɛ§", + "command.gtceu.hand.tool_stats": "%s :ssɐןƆ sʇɐʇS ןoo⟘", + "command.gtceu.hand.usage": "puɐɥ nǝɔʇb/ :ǝbɐs∩", "command.gtceu.medical_condition.get": ":suoıʇıpuoɔ ןɐɔıpǝɯ ǝsǝɥʇ sɐɥ %s ɹǝʎɐןԀ", "command.gtceu.medical_condition.get.element": "spuoɔǝs %s sǝʇnuıɯ %s :ɹ§%s uoıʇıpuoƆ", "command.gtceu.medical_condition.get.element.permanent": ")ʇuǝuɐɯɹǝd( spuoɔǝs %s sǝʇnuıɯ %s :ɹ§%s uoıʇıpuoƆ", "command.gtceu.medical_condition.get.empty": "˙suoıʇıpuoɔ ןɐɔıpǝɯ ou sɐɥ %s ɹǝʎɐןԀ", "command.gtceu.place_vein.failure": "%s uoıʇısod ʇɐ %s uıǝʌ ǝɔɐןd oʇ pǝןıɐℲ", "command.gtceu.place_vein.success": "%s uoıʇısod ʇɐ %s uıǝʌ pǝɔɐןԀ", + "command.gtceu.recipecheck.begin": "˙˙˙ʞɔǝɥɔ ʇɔıןɟuoɔ ǝdıɔǝɹ buıʇɹɐʇS", + "command.gtceu.recipecheck.end": "oɟuı ǝɹoɯ ɹoɟ boן ɹǝʌɹǝs ǝɥʇ ʞɔǝɥƆ ˙sʇɔıןɟuoɔ ǝןqıssod %d punoɟ ʞɔǝɥɔ ʇɔıןɟuoɔ ǝdıɔǝᴚ", + "command.gtceu.recipecheck.end_no_conflicts": "¡punoɟ sʇɔıןɟuoɔ ǝdıɔǝɹ oN", + "command.gtceu.recipecheck.usage": "ʞɔǝɥɔǝdıɔǝɹ nǝɔʇb/ :ǝbɐs∩", "command.gtceu.share_prospection_data.notification": "¡noʎ ɥʇıʍ ɐʇɐp buıʇɔǝdsoɹd buıɹɐɥs sı %s", + "command.gtceu.usage": ">ʞɔǝɥɔǝdıɔǝɹ/puɐɥ/uǝbpןɹoʍ< nǝɔʇb/ :ǝbɐs∩", + "command.gtceu.worldgen.reload.failed": "˙sɹoɹɹǝ ɹoɟ ǝןosuoɔ ʞɔǝɥƆ ˙pǝןıɐɟ pɐoןǝɹ uǝbpןɹoM", + "command.gtceu.worldgen.reload.success": "˙bıɟuoɔ ɯoɹɟ pǝpɐoןǝɹ ʎןןnɟssǝɔɔns uǝbpןɹoM", + "command.gtceu.worldgen.reload.usage": "pɐoןǝɹ uǝbpןɹoʍ nǝɔʇb/ :ǝbɐs∩", + "command.gtceu.worldgen.usage": ">pɐoןǝɹ< uǝbpןɹoʍ nǝɔʇb/ :ǝbɐs∩", "config.gtceu.option.addLoot": "ʇooꞀppɐ", "config.gtceu.option.ae2": "ᄅǝɐ", "config.gtceu.option.allUniqueStoneTypes": "sǝdʎ⟘ǝuoʇSǝnbıu∩ןןɐ", @@ -2096,19 +2165,19 @@ "death.attack.gtceu.hoe": "%s ʎq pǝןןıʇ pɐǝɥ ɹıǝɥʇ pɐɥ %s", "death.attack.gtceu.knife": "%s ʎq pǝʞod ʎןʇuǝb sɐʍ %s", "death.attack.gtceu.mallet": "%s ʎq ɥʇɐǝp oʇ pǝɹǝɯɯɐɥ ʇob %s", - "death.attack.gtceu.medical_condition/arsenicosis": "buıuosıod ɔıuǝsɹɐ ʇob %s", - "death.attack.gtceu.medical_condition/asbestosis": "ɐɯoıןǝɥʇosǝɯ ʇob %s", - "death.attack.gtceu.medical_condition/berylliosis": "ʎןıpǝǝɹb ooʇ ʇıq ɐ spןɐɹǝɯǝ pǝuıɯ %s", - "death.attack.gtceu.medical_condition/carbon_monoxide_poisoning": "uo ǝʌoʇs ǝɥʇ ʇɟǝן %s", - "death.attack.gtceu.medical_condition/carcinogen": "ɐıɯǝʞnǝן ʇob %s", - "death.attack.gtceu.medical_condition/chemical_burns": "ʇuǝpıɔɔɐ ןɐɔıɯǝɥɔ ɐ pɐɥ %s", - "death.attack.gtceu.medical_condition/irritant": "ɥsɐɹ pɐq ɹ§ʎꞀꞀⱯƎᴚן§u§ ɐ ʇob %s", - "death.attack.gtceu.medical_condition/methanol_poisoning": "uoıʇıqıɥoɹd ǝɥʇ buıɹnp ǝuıɥsuooɯ ʞuıɹp oʇ pǝıɹʇ %s", - "death.attack.gtceu.medical_condition/nausea": "ɐǝsnɐu ɟo pǝıp %s", - "death.attack.gtceu.medical_condition/none": "¿buıɥʇou ˙˙˙ɟo pǝıp %s", - "death.attack.gtceu.medical_condition/poison": "snouosıod 'ʇɔɐɟ uı 'ǝɹɐ sןɐıɹǝʇɐɯ snouosıod ʇɐɥʇ ʇobɹoɟ %s", - "death.attack.gtceu.medical_condition/silicosis": "˙sısoɔıןıs sɐʍ ʇı ˙sısoןnɔɹǝqnʇ ɟo ǝıp ʇ,upıp %s", - "death.attack.gtceu.medical_condition/weak_poison": ")¡ʎɹnɔɹǝɯ ɹo( pɐǝן ǝʇɐ %s", + "death.attack.gtceu.medical_condition.arsenicosis": "buıuosıod ɔıuǝsɹɐ ʇob %s", + "death.attack.gtceu.medical_condition.asbestosis": "ɐɯoıןǝɥʇosǝɯ ʇob %s", + "death.attack.gtceu.medical_condition.berylliosis": "ʎןıpǝǝɹb ooʇ ʇıq ɐ spןɐɹǝɯǝ pǝuıɯ %s", + "death.attack.gtceu.medical_condition.carbon_monoxide_poisoning": "uo ǝʌoʇs ǝɥʇ ʇɟǝן %s", + "death.attack.gtceu.medical_condition.carcinogen": "ɐıɯǝʞnǝן ʇob %s", + "death.attack.gtceu.medical_condition.chemical_burns": "ʇuǝpıɔɔɐ ןɐɔıɯǝɥɔ ɐ pɐɥ %s", + "death.attack.gtceu.medical_condition.irritant": "ɥsɐɹ pɐq ɹ§ʎꞀꞀⱯƎᴚן§u§ ɐ ʇob %s", + "death.attack.gtceu.medical_condition.methanol_poisoning": "uoıʇıqıɥoɹd ǝɥʇ buıɹnp ǝuıɥsuooɯ ʞuıɹp oʇ pǝıɹʇ %s", + "death.attack.gtceu.medical_condition.nausea": "ɐǝsnɐu ɟo pǝıp %s", + "death.attack.gtceu.medical_condition.none": "¿buıɥʇou ˙˙˙ɟo pǝıp %s", + "death.attack.gtceu.medical_condition.poison": "snouosıod 'ʇɔɐɟ uı 'ǝɹɐ sןɐıɹǝʇɐɯ snouosıod ʇɐɥʇ ʇobɹoɟ %s", + "death.attack.gtceu.medical_condition.silicosis": "˙sısoɔıןıs sɐʍ ʇı ˙sısoןnɔɹǝqnʇ ɟo ǝıp ʇ,upıp %s", + "death.attack.gtceu.medical_condition.weak_poison": ")¡ʎɹnɔɹǝɯ ɹo( pɐǝן ǝʇɐ %s", "death.attack.gtceu.mining_hammer": "%s ʎq ǝɹO ɹoɟ uǝʞɐʇsıɯ sɐʍ %s", "death.attack.gtceu.mortar": "%s ʎq ʇsnp oʇ punoɹb sɐʍ %s", "death.attack.gtceu.pickaxe": "%s ʎq pǝuıɯ ʇob %s", @@ -2178,32 +2247,6 @@ "gtceu.circuit_assembler": "ɹǝןqɯǝssⱯ ʇınɔɹıƆ", "gtceu.coke_oven": "uǝʌO ǝʞoƆ", "gtceu.combustion_generator": "ɹoʇɐɹǝuǝ⅁ uoıʇsnqɯoƆ", - "gtceu.command.copy.click_to_copy": "ʎdoɔ oʇ ʞɔıןƆ", - "gtceu.command.copy.copied_and_click": "uıɐbɐ ʎdoɔ oʇ ʞɔıןƆ ˙pɹɐoqdıןɔ oʇ pǝıdoɔ", - "gtceu.command.copy.copied_end": "pɹɐoqdıןɔ ǝɥʇ oʇ ]", - "gtceu.command.copy.copied_start": "[ pǝıdoƆ", - "gtceu.command.hand.electric": "%s :ʎɹǝʇʇɐᗺ sI ؛%d :ɹǝı⟘ - ∩Ǝ %d / %d :oɟuI ɔıɹʇɔǝןƎ", - "gtceu.command.hand.fluid": "%s :uıɐɹᗡ uɐƆ ؛%s :ןןıℲ uɐƆ ؛ᗺɯ %d / %d :oɟuI pınןℲ", - "gtceu.command.hand.fluid2": ":pI pınןℲ", - "gtceu.command.hand.groovy": "puɐɥ sb/9§ buısn ɹǝpısuoƆ", - "gtceu.command.hand.item_id": ")%d :ɐʇɐpɐʇǝW( %s :ɯǝʇI", - "gtceu.command.hand.material": ":pI ןɐıɹǝʇɐW", - "gtceu.command.hand.meta_item": ":pI ɯǝʇIɐʇǝW", - "gtceu.command.hand.no_item": "˙puɐɯɯoɔ sıɥʇ buıʇnɔǝxǝ ǝɹoɟǝq puɐɥ ɟɟo ɹo puɐɥ uıɐɯ uı buıɥʇǝɯos pןoɥ ʇsnɯ noʎ", - "gtceu.command.hand.not_a_player": "˙ɹǝʎɐןd ɐ ʎq ǝןqɐsn ʎןuo sı puɐɯɯoɔ sıɥ⟘", - "gtceu.command.hand.ore_prefix": ":xıɟǝɹd ǝɹO", - "gtceu.command.hand.tag_entries": ":sǝıɹʇuǝ bɐ⟘Ɛ§", - "gtceu.command.hand.tool_stats": "%s :ssɐןƆ sʇɐʇS ןoo⟘", - "gtceu.command.hand.usage": "puɐɥ nǝɔʇb/ :ǝbɐs∩", - "gtceu.command.recipecheck.begin": "˙˙˙ʞɔǝɥɔ ʇɔıןɟuoɔ ǝdıɔǝɹ buıʇɹɐʇS", - "gtceu.command.recipecheck.end": "oɟuı ǝɹoɯ ɹoɟ boן ɹǝʌɹǝs ǝɥʇ ʞɔǝɥƆ ˙sʇɔıןɟuoɔ ǝןqıssod %d punoɟ ʞɔǝɥɔ ʇɔıןɟuoɔ ǝdıɔǝᴚ", - "gtceu.command.recipecheck.end_no_conflicts": "¡punoɟ sʇɔıןɟuoɔ ǝdıɔǝɹ oN", - "gtceu.command.recipecheck.usage": "ʞɔǝɥɔǝdıɔǝɹ nǝɔʇb/ :ǝbɐs∩", - "gtceu.command.usage": ">ʞɔǝɥɔǝdıɔǝɹ/puɐɥ/uǝbpןɹoʍ< nǝɔʇb/ :ǝbɐs∩", - "gtceu.command.worldgen.reload.failed": "˙sɹoɹɹǝ ɹoɟ ǝןosuoɔ ʞɔǝɥƆ ˙pǝןıɐɟ pɐoןǝɹ uǝbpןɹoM", - "gtceu.command.worldgen.reload.success": "˙bıɟuoɔ ɯoɹɟ pǝpɐoןǝɹ ʎןןnɟssǝɔɔns uǝbpןɹoM", - "gtceu.command.worldgen.reload.usage": "pɐoןǝɹ uǝbpןɹoʍ nǝɔʇb/ :ǝbɐs∩", - "gtceu.command.worldgen.usage": ">pɐoןǝɹ< uǝbpןɹoʍ nǝɔʇb/ :ǝbɐs∩", "gtceu.compressor": "ɹossǝɹdɯoƆ", "gtceu.cover.activity_detector.message_activity_inverted": "snʇɐʇS ʎʇıʌıʇɔⱯ pǝʇɹǝʌuI buıɹoʇıuoW", "gtceu.cover.activity_detector.message_activity_normal": "snʇɐʇS ʎʇıʌıʇɔⱯ ןɐɯɹoN buıɹoʇıuoW", @@ -3490,29 +3533,6 @@ "gtceu.subtitle.wirecutter": "pǝddıus ǝɹıM", "gtceu.subtitle.wrench": "buıןʇʇɐɹ ɥɔuǝɹM", "gtceu.thermal_centrifuge": "ǝbnɟıɹʇuǝƆ ןɐɯɹǝɥ⟘", - "gtceu.tool.class.axe": "ǝxⱯ", - "gtceu.tool.class.butchery_knife": "ǝɟıuʞ ʎɹǝɥɔʇnᗺ", - "gtceu.tool.class.crowbar": "ɹɐqʍoɹƆ", - "gtceu.tool.class.drill": "ןןıɹᗡ", - "gtceu.tool.class.file": "ǝןıℲ", - "gtceu.tool.class.hammer": "ɹǝɯɯɐH", - "gtceu.tool.class.hoe": "ǝoH", - "gtceu.tool.class.knife": "ǝɟıuʞ", - "gtceu.tool.class.mallet": "ʇǝןןɐW ʇɟoS", - "gtceu.tool.class.mining_hammer": "ɹǝɯɯɐH buıuıW", - "gtceu.tool.class.mortar": "ɹɐʇɹoW", - "gtceu.tool.class.pickaxe": "ǝxɐʞɔıԀ", - "gtceu.tool.class.plunger": "ɹǝbunןԀ", - "gtceu.tool.class.rolling_pin": "uıԀ buıןןoᴚ", - "gtceu.tool.class.saw": "ʍɐS", - "gtceu.tool.class.screwdriver": "ɹǝʌıɹpʍǝɹɔS", - "gtceu.tool.class.scythe": "ǝɥʇʎɔS", - "gtceu.tool.class.shears": "sɹɐǝɥS", - "gtceu.tool.class.shovel": "ןǝʌoɥS", - "gtceu.tool.class.spade": "ǝpɐdS", - "gtceu.tool.class.sword": "pɹoʍS", - "gtceu.tool.class.wire_cutter": "ɹǝʇʇnƆ ǝɹıM", - "gtceu.tool.class.wrench": "ɥɔuǝɹM", "gtceu.tool_action.crowbar": "sɹǝʌoƆ ǝʌoɯǝɹ oʇ ɹɐqʍoɹƆ ǝs∩8§", "gtceu.tool_action.hammer": "spunoS ǝןɟɟnɯ oʇ ɹǝɯɯɐH pɹɐH ǝs∩8§", "gtceu.tool_action.screwdriver.access_covers": "sɹǝʌoƆ ssǝɔɔɐ oʇ ɹǝʌıɹpʍǝɹɔS ǝs∩8§", @@ -3641,6 +3661,34 @@ "gui.gtceu.share_tank.title": "ʎɹoʇuǝʌuI ʞuɐ⟘ pǝɹɐɥS", "gui.widget.incrementButton.default_tooltip": "ʇunoɯɐ ǝɥʇ ǝbuɐɥɔ oʇ ɥʇoq ɹo ןɹʇƆ 'ʇɟıɥS pןoH", "gui.widget.recipeProgressWidget.default_tooltip": "sǝdıɔǝᴚ ʍoɥS", + "item.behavior.mode_switch.current_mode": "%s :ǝpoW", + "item.behavior.mode_switch.mode_switched": "%s :oʇ ʇǝS ǝpoWǝ§", + "item.behavior.mode_switch.tooltip": "ǝpoɯ ɥɔʇıʍs oʇ buıʞɐǝus ǝןıɥʍ ǝs∩", + "item.clipboard.tooltip": "ǝʌoɯǝɹ oʇ ʞɔıןƆ-ʇɥbıᴚ-ʇɟıɥS puɐ 'ǝɔɐןd oʇ ןןɐM uo ʞɔıןɔ-ʇɥbıᴚ ˙)ʇuǝɯnɹʇsuI buıʇıɹʍ ʎuɐ ʇnoɥʇıʍ( uo uǝʇʇıɹʍ ǝq uɐƆ", + "item.cover.digital.mode.energy.disabled": "ǝpoW ʎbɹǝuƎ ǝןqɐuǝ oʇ ʞɔıןƆ", + "item.cover.digital.mode.energy.enabled": "pǝןqɐuǝ ǝpoW ʎbɹǝuƎ", + "item.cover.digital.mode.fluid.disabled": "ǝpoW pınןℲ ǝןqɐuǝ oʇ ʞɔıןƆ", + "item.cover.digital.mode.fluid.enabled": "pǝןqɐuǝ ǝpoW pınןℲ", + "item.cover.digital.mode.item.disabled": "ǝpoW ɯǝʇI ǝןqɐuǝ oʇ ʞɔıןƆ", + "item.cover.digital.mode.item.enabled": "pǝןqɐuǝ ǝpoW ɯǝʇI", + "item.cover.digital.mode.machine.disabled": "ǝpoW ǝuıɥɔɐW ǝןqɐuǝ oʇ ʞɔıןƆ", + "item.cover.digital.mode.machine.enabled": "pǝןqɐuǝ ǝpoW ǝuıɥɔɐW", + "item.cover.digital.mode.proxy.disabled": "ǝpoW ʎxoɹԀ ǝןqɐuǝ oʇ ʞɔıןƆ", + "item.cover.digital.mode.proxy.enabled": "pǝןqɐuǝ ǝpoW ʎxoɹԀ", + "item.cover.digital.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ㄥ§ɹoʇıuoW ןɐɹʇuǝƆɟ§ ǝɥʇ oʇ ㄥ§sǝןqɐƆ ɹǝʍoԀɟ§ ɹǝʌo sǝuıɥɔɐɯ sʇɔǝuuoƆ", + "item.cover.digital.wireless.tooltip.0": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ㄥ§ɹoʇıuoW ןɐɹʇuǝƆɟ§ ǝɥʇ oʇ sǝuıɥɔɐɯ sʇɔǝuuoɔ ㄥ§ʎןssǝןǝɹıMɟ§", + "item.cover.digital.wireless.tooltip.1": "˙ʇı oʇ puıq ʎןǝʇoɯǝɹ oʇ ㄥ§ɹoʇıuoW ןɐɹʇuǝƆɟ§ ǝɥʇ uo ㄥ§ʞɔıןƆ ʇɥbıᴚɟ§", + "item.cover.digital.wireless.tooltip.2": "˙buıpuıq ʇuǝɹɹnɔ ǝɥʇ ǝʌoɯǝɹ oʇ ㄥ§ʞɔıןƆ ʇɥbıᴚ ʞɐǝuSɟ§", + "item.cover.digital.wireless.tooltip.3": "%sɟ§ :buıpuıᗺɐ§", + "item.crushed.tooltip.purify": "ǝɹO pǝıɟıɹnԀ ʇǝb oʇ uoɹpןnɐƆ ɐ ʞɔıןɔ ʇɥbıᴚ", + "item.debug_scanner.tooltip": "ɹǝpɹoɔıɹ⟘", + "item.dust.tooltip.purify": "ʇsnᗡ uɐǝןɔ ʇǝb oʇ uoɹpןnɐƆ ɐ ʞɔıןɔ ʇɥbıᴚ", + "item.electric.discharge_mode.disabled": "pǝןqɐsıᗡ ǝpoW ǝbɹɐɥɔsıᗡǝ§", + "item.electric.discharge_mode.enabled": "pǝןqɐuƎ ǝpoW ǝbɹɐɥɔsıᗡǝ§", + "item.electric.discharge_mode.tooltip": "ǝpoɯ ǝbɹɐɥɔsıp ǝןbboʇ oʇ buıʞɐǝus ǝןıɥʍ ǝs∩", + "item.generic.electric_item.stored": ")%s( ∩Ǝ %d/%d", + "item.generic.electric_item.tooltip": "%s ɹǝı⟘ - ∩Ǝ %d/%d", + "item.generic.fluid_container.tooltip": "%s Ꞁ%d/%d", "item.glass_lens": ")ǝʇıɥM( suǝꞀ ssɐן⅁", "item.gtceu.activity_detector_cover": "ɹoʇɔǝʇǝᗡ ʎʇıʌıʇɔⱯ", "item.gtceu.activity_detector_cover.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ǝuoʇspǝᴚ sɐ ㄥ§snʇɐʇS ʎʇıʌıʇɔⱯɟ§ ʇno sǝʌı⅁ㄥ§", @@ -4422,22 +4470,6 @@ "item.gtceu.tool.aoe.layers": "sɹǝʎɐꞀ", "item.gtceu.tool.aoe.rows": "sʍoᴚ", "item.gtceu.tool.axe": "ǝxⱯ %s", - "item.gtceu.tool.behavior.aoe_mining": "%sx%sx%sɟ§ :ʇɔǝɟɟƎ-ɟo-ɐǝɹⱯϛ§", - "item.gtceu.tool.behavior.block_rotation": "sʞɔoןᗺ sǝʇɐʇoᴚɟ§ :ɔıuɐɥɔǝWᄅ§", - "item.gtceu.tool.behavior.crop_harvesting": "sdoɹƆ sʇsǝʌɹɐHɟ§ :ɹǝʇsǝʌɹɐHɐ§", - "item.gtceu.tool.behavior.damage_boost": "%s ʇsuıɐbɐ ǝbɐɯɐp ɐɹʇxƎɟ§ :ʇsooᗺ ǝbɐɯɐᗡㄣ§", - "item.gtceu.tool.behavior.grass_path": "sɥʇɐԀ ssɐɹ⅁ sǝʇɐǝɹƆɟ§ :ɹǝdɐɔspuɐꞀǝ§", - "item.gtceu.tool.behavior.ground_tilling": "punoɹ⅁ sןןı⟘ɟ§ :ɹǝɯɹɐℲǝ§", - "item.gtceu.tool.behavior.plunger": "spınןℲ suıɐɹᗡɟ§ :ɹǝqɯnןԀ6§", - "item.gtceu.tool.behavior.rail_rotation": "sןıɐᴚ sǝʇɐʇoᴚɟ§ :ɹǝǝuıbuƎ pɐoɹןıɐᴚǝ§", - "item.gtceu.tool.behavior.relocate_mining": "sdoɹᗡ qoW puɐ sʞɔoןᗺ pǝuıW sǝʇɐɔoןǝᴚɟ§ :ɔıʇǝubɐWᄅ§", - "item.gtceu.tool.behavior.remove_wax": "xɐM sǝʌoɯǝᴚɟ§ :ɹǝuɐǝןƆ9§", - "item.gtceu.tool.behavior.scrape": "uoıʇɐpıxO sǝʌoɯǝᴚɟ§ :ɹǝɥsıןoԀq§", - "item.gtceu.tool.behavior.shield_disable": "spןǝıɥS sǝןqɐsıᗡɟ§ :ǝʇnɹᗺɔ§", - "item.gtceu.tool.behavior.silk_ice": "ǝɔI sʇsǝʌɹɐH ʞןıSɟ§ :ɹǝʇʇnƆ ǝɔIq§", - "item.gtceu.tool.behavior.strip_log": "sboꞀ sdıɹʇSɟ§ :uɐsıʇɹⱯϛ§", - "item.gtceu.tool.behavior.torch_place": "ʞɔıןƆ-ʇɥbıᴚ uo sǝɥɔɹo⟘ sǝɔɐןԀɟ§ :ɹǝʞunןǝdSǝ§", - "item.gtceu.tool.behavior.tree_felling": "buıןןǝℲ ǝǝɹ⟘ɟ§ :ʞɔɐظɹǝqɯnꞀㄣ§", "item.gtceu.tool.butchery_knife": "ǝɟıuʞ ʎɹǝɥɔʇnᗺ %s", "item.gtceu.tool.butchery_knife.tooltip": "ǝʇɐᴚ ʞɔɐʇʇⱯ ʍoןs ɐ sɐH8§", "item.gtceu.tool.buzzsaw": ")ΛꞀ( ʍɐszznᗺ %s", @@ -4498,16 +4530,6 @@ "item.gtceu.tool.spade": "ǝpɐdS %s", "item.gtceu.tool.spade.tooltip": ")buıɥɔnoɹɔ ǝɹ,noʎ ssǝןun( ǝɔuo ʇɐ ɐǝɹɐ ǝbɹɐן ɐ sǝuıW8§", "item.gtceu.tool.sword": "pɹoʍS %s", - "item.gtceu.tool.tooltip.attack_damage": "ǝbɐɯɐᗡ ʞɔɐʇʇⱯɔ§ %s", - "item.gtceu.tool.tooltip.attack_speed": "pǝǝdS ʞɔɐʇʇⱯ6§ %s", - "item.gtceu.tool.tooltip.crafting_uses": "sǝs∩ buıʇɟɐɹƆɐ§ %s", - "item.gtceu.tool.tooltip.general_uses": "ʎʇıןıqɐɹnᗡq§ %s", - "item.gtceu.tool.tooltip.harvest_level": "%s ןǝʌǝꞀ ʇsǝʌɹɐHǝ§", - "item.gtceu.tool.tooltip.harvest_level_extra": ")ɟ§%s(ɟ§ %s ןǝʌǝꞀ ʇsǝʌɹɐHǝ§", - "item.gtceu.tool.tooltip.max_uses": "ʎʇıןıqɐɹnᗡ ןɐʇo⟘ǝ§ %s", - "item.gtceu.tool.tooltip.mining_speed": "pǝǝdS buıuıWp§ %s", - "item.gtceu.tool.tooltip.repair_info": "oɟuI ɹıɐdǝᴚ ʍoɥs oʇ ⟘ℲIHS pןoH8§", - "item.gtceu.tool.tooltip.repair_material": "%sɐ§ɟ§ :ɥʇıʍ ɹıɐdǝᴚ8§", "item.gtceu.tool.usable_as": "%sɟ§ :sɐ ǝןqɐs∩8§", "item.gtceu.tool.wire_cutter": "ɹǝʇʇnƆ ǝɹıM %s", "item.gtceu.tool.wrench": "ɥɔuǝɹM %s", @@ -4638,9 +4660,28 @@ "item.gtceu.zpm_solar_panel": "ןǝuɐԀ ɹɐןoS ǝןnpoW ʇuıoԀ oɹǝZ", "item.gtceu.zpm_voltage_coil": "ןıoƆ ǝbɐʇןoΛ ǝןnpoW ʇuıoԀ oɹǝZ", "item.gtceu.zpm_voltage_coil.tooltip": "ןıoƆ ɹǝdnS", + "item.int_circuit.configuration": "%d :uoıʇɐɹnbıɟuoƆ", "item.invalid.name": "ɯǝʇı pıןɐʌuI", + "item.liquid_fuel_jetpack.tooltip": "ʇsnɹɥ⟘ ɹoɟ sןǝnℲ ɹoʇɐɹǝuǝ⅁ uoıʇsnqɯoƆ sǝs∩", + "item.machine_configuration.mode": "%s ɹ§:ǝpoW uoıʇɐɹnbıɟuoƆɐ§", "item.netherrack_nether_quartz": "ǝɹO zʇɹɐnὉ ɹǝɥʇǝN", + "item.plugin.proxy.tooltips.1": ")uǝǝɹɔs ǝɥʇ uı ǝpoɯ ʎxoɹd oʇ ʇsnظpɐ ǝsɐǝןԀ(", + "item.plugin.tooltips.1": "˙ʎʇıןɐuoıʇɔunɟ ǝɹoɯ ɹoɟ uǝǝɹɔs ǝɥʇ oʇ pǝppɐ ǝq uɐɔ suıbnןԀ", + "item.prospector.mode.bedrock_ore": "ɹ§ǝpoW uoıʇɔǝdsoɹԀ ǝɹO ʞɔoɹpǝᗺq§", + "item.prospector.mode.fluid": "ɹ§ǝpoW uoıʇɔǝdsoɹԀ pınןℲq§", + "item.prospector.mode.ores": "ɹ§ǝpoW uoıʇɔǝdsoɹԀ ǝɹOɐ§", + "item.prospector.tooltip.modes": ":sǝpoW ǝןqɐןıɐʌⱯ", + "item.prospector.tooltip.radius": "snıpɐᴚ ʞunɥƆ %s ɐ uı ǝbuɐɹ suɐɔS", + "item.record.sus.tooltip": "dıɹᗡ s∩ buoɯⱯ - zuoǝꞀㄥ§", + "item.terminal.tooltip": "ʞɹoʍ poob ǝʞɐɯ sןooʇ dɹɐɥS", + "item.terminal.tooltip.creative": "ǝpoW ǝʌıʇɐǝɹƆq§", + "item.terminal.tooltip.hardware": "%d :ǝɹɐʍpɹɐHɐ§", "item.toggle.advanced.info.tooltip": ">uoıʇɐɹnbıɟuoɔ pǝɹoʇs ʍǝıʌ oʇ ʞɐǝuS<8§", + "item.tool.tooltip.durability": "%d / %dɐ§ :ʎʇıןıqɐɹnᗡɟ§", + "item.tool.tooltip.primary_material": "%sǝ§ :ןɐıɹǝʇɐWɟ§", + "item.tool.tooltip.rotor.efficiency": "%d%%6§ :ʎɔuǝıɔıɟɟƎ ǝuıqɹn⟘", + "item.tool.tooltip.rotor.power": "%d%%6§ :ɹǝʍoԀ ǝuıqɹn⟘", + "item.tricorder_scanner.tooltip": "ɹǝpɹoɔıɹ⟘", "itemGroup.gtceu.decoration": "sʞɔoןᗺ uoıʇɐɹoɔǝᗡ nƎƆɥɔǝ⟘bǝɹ⅁", "itemGroup.gtceu.item": "sɯǝʇI nƎƆɥɔǝ⟘bǝɹ⅁", "itemGroup.gtceu.machine": "sǝuıɥɔɐW nƎƆɥɔǝ⟘bǝɹ⅁", @@ -5313,96 +5354,6 @@ "material.gtceu.zirconium": "ɯnıuoɔɹıZ", "message.gtceu.new_veins.amount": "¡suıǝʌ ʍǝu %d pǝʇɔǝdsoɹԀ", "message.gtceu.new_veins.name": "¡%s pǝʇɔǝdsoɹԀ", - "armor.gtceu.energy_share.disable": "pǝןqɐsıp buıbɹɐɥɔ sʇǝbpɐ⅁ :ʎןddnS ʎbɹǝuƎ", - "armor.gtceu.energy_share.enable": "pǝןqɐuǝ buıbɹɐɥɔ sʇǝbpɐ⅁ :ʎןddnS ʎbɹǝuƎ", - "armor.gtceu.energy_share.error": "¡buıbɹɐɥɔ sʇǝbpɐb ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ʎןddnS ʎbɹǝuƎ", - "armor.gtceu.energy_share.tooltip": "%s :ǝpoɯ ʎןddnS", - "armor.gtceu.energy_share.tooltip.guide": "ɯǝʇı buıpןoɥ uǝɥʍ ʞɔıןɔ ʇɥbıɹ-ʇɟıɥs ǝpoɯ ǝbuɐɥɔ o⟘", - "armor.gtceu.hud.energy_lvl": "%s :ןǝʌǝꞀ ʎbɹǝuƎ", - "armor.gtceu.hud.engine_enabled": "%s :pǝןqɐuƎ ǝuıbuƎ", - "armor.gtceu.hud.fuel_lvl": "%s :ןǝʌǝꞀ ןǝnℲ", - "armor.gtceu.hud.gravi_engine": "%s :ǝuıbuƎıʌɐɹ⅁", - "armor.gtceu.hud.hover_mode": "%s :ǝpoW ɹǝʌoH", - "armor.gtceu.hud.status.disabled": "ℲℲOɔ§", - "armor.gtceu.hud.status.enabled": "NOɐ§", - "armor.gtceu.jetpack.emergency_hover_mode": "¡pǝןqɐuƎ ǝpoW ɹǝʌoH ʎɔuǝbɹǝɯƎ", - "armor.gtceu.jetpack.flight.disable": "pǝןqɐsıᗡ ʇɥbıןℲ :ʞɔɐdʇǝſ", - "armor.gtceu.jetpack.flight.enable": "pǝןqɐuƎ ʇɥbıןℲ :ʞɔɐdʇǝſ", - "armor.gtceu.jetpack.hover.disable": "pǝןqɐsıᗡ ǝpoW ɹǝʌoH :ʞɔɐdʇǝſ", - "armor.gtceu.jetpack.hover.enable": "pǝןqɐuƎ ǝpoW ɹǝʌoH :ʞɔɐdʇǝſ", - "armor.gtceu.message.nightvision.disabled": "ɟɟOɔ§ :uoısıΛʇɥbıNq§", - "armor.gtceu.message.nightvision.enabled": "uOɐ§ :uoısıΛʇɥbıNq§", - "armor.gtceu.message.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§", - "armor.gtceu.nms.boosted_jump.disabled": "pǝןqɐsıᗡ ʇsooᗺ dɯnſ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nms.boosted_jump.enabled": "pǝןqɐuƎ ʇsooᗺ dɯnſ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nms.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıN :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nms.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıN :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nms.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nms.charge.disable": "pǝןqɐsıᗡ buıbɹɐɥƆ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nms.charge.enable": "pǝןqɐuƎ buıbɹɐɥƆ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nms.charge.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.qts.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıN :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "armor.gtceu.qts.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıN :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "armor.gtceu.qts.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "armor.gtceu.qts.charge.disable": "pǝןqɐsıᗡ buıbɹɐɥƆ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "armor.gtceu.qts.charge.enable": "pǝןqɐuƎ buıbɹɐɥƆ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "armor.gtceu.qts.charge.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "armor.gtceu.tooltip.autoeat": "ʎɹoʇuǝʌuI ɯoɹɟ pooℲ buıs∩ ʎq ɹɐᗺ pooℲ sǝɥsıuǝןdǝᴚ", - "armor.gtceu.tooltip.breath": "ɹɐᗺ ɥʇɐǝɹᗺ ɹǝʇɐʍɹǝpu∩ sǝɥsıuǝןdǝᴚ", - "armor.gtceu.tooltip.burning": "buıuɹnᗺ sǝıɟıןןnN", - "armor.gtceu.tooltip.falldamage": "ǝbɐɯɐᗡ ןןɐℲ sǝıɟıןןnN", - "armor.gtceu.tooltip.freezing": "buızǝǝɹℲ sʇuǝʌǝɹԀ", - "armor.gtceu.tooltip.jump": "ǝɔuɐʇsıᗡ puɐ ʇɥbıǝH dɯnſ sǝsɐǝɹɔuI", - "armor.gtceu.tooltip.potions": "sʇɔǝɟɟƎ ןnɟɯɹɐH sǝıɟıןןnN", - "armor.gtceu.tooltip.speed": "pǝǝdS buıuunᴚ sǝsɐǝɹɔuI", - "armor.gtceu.tooltip.stepassist": "ʇsıssⱯ-dǝʇS sǝpıʌoɹԀ", - "item.behavior.mode_switch.current_mode": "%s :ǝpoW", - "item.behavior.mode_switch.mode_switched": "%s :oʇ ʇǝS ǝpoWǝ§", - "item.behavior.mode_switch.tooltip": "ǝpoɯ ɥɔʇıʍs oʇ buıʞɐǝus ǝןıɥʍ ǝs∩", - "item.clipboard.tooltip": "ǝʌoɯǝɹ oʇ ʞɔıןƆ-ʇɥbıᴚ-ʇɟıɥS puɐ 'ǝɔɐןd oʇ ןןɐM uo ʞɔıןɔ-ʇɥbıᴚ ˙)ʇuǝɯnɹʇsuI buıʇıɹʍ ʎuɐ ʇnoɥʇıʍ( uo uǝʇʇıɹʍ ǝq uɐƆ", - "item.cover.digital.mode.energy.disabled": "ǝpoW ʎbɹǝuƎ ǝןqɐuǝ oʇ ʞɔıןƆ", - "item.cover.digital.mode.energy.enabled": "pǝןqɐuǝ ǝpoW ʎbɹǝuƎ", - "item.cover.digital.mode.fluid.disabled": "ǝpoW pınןℲ ǝןqɐuǝ oʇ ʞɔıןƆ", - "item.cover.digital.mode.fluid.enabled": "pǝןqɐuǝ ǝpoW pınןℲ", - "item.cover.digital.mode.item.disabled": "ǝpoW ɯǝʇI ǝןqɐuǝ oʇ ʞɔıןƆ", - "item.cover.digital.mode.item.enabled": "pǝןqɐuǝ ǝpoW ɯǝʇI", - "item.cover.digital.mode.machine.disabled": "ǝpoW ǝuıɥɔɐW ǝןqɐuǝ oʇ ʞɔıןƆ", - "item.cover.digital.mode.machine.enabled": "pǝןqɐuǝ ǝpoW ǝuıɥɔɐW", - "item.cover.digital.mode.proxy.disabled": "ǝpoW ʎxoɹԀ ǝןqɐuǝ oʇ ʞɔıןƆ", - "item.cover.digital.mode.proxy.enabled": "pǝןqɐuǝ ǝpoW ʎxoɹԀ", - "item.cover.digital.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ㄥ§ɹoʇıuoW ןɐɹʇuǝƆɟ§ ǝɥʇ oʇ ㄥ§sǝןqɐƆ ɹǝʍoԀɟ§ ɹǝʌo sǝuıɥɔɐɯ sʇɔǝuuoƆ", - "item.cover.digital.wireless.tooltip.0": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ㄥ§ɹoʇıuoW ןɐɹʇuǝƆɟ§ ǝɥʇ oʇ sǝuıɥɔɐɯ sʇɔǝuuoɔ ㄥ§ʎןssǝןǝɹıMɟ§", - "item.cover.digital.wireless.tooltip.1": "˙ʇı oʇ puıq ʎןǝʇoɯǝɹ oʇ ㄥ§ɹoʇıuoW ןɐɹʇuǝƆɟ§ ǝɥʇ uo ㄥ§ʞɔıןƆ ʇɥbıᴚɟ§", - "item.cover.digital.wireless.tooltip.2": "˙buıpuıq ʇuǝɹɹnɔ ǝɥʇ ǝʌoɯǝɹ oʇ ㄥ§ʞɔıןƆ ʇɥbıᴚ ʞɐǝuSɟ§", - "item.cover.digital.wireless.tooltip.3": "%sɟ§ :buıpuıᗺɐ§", - "item.crushed.tooltip.purify": "ǝɹO pǝıɟıɹnԀ ʇǝb oʇ uoɹpןnɐƆ ɐ ʞɔıןɔ ʇɥbıᴚ", - "item.debug_scanner.tooltip": "ɹǝpɹoɔıɹ⟘", - "item.dust.tooltip.purify": "ʇsnᗡ uɐǝןɔ ʇǝb oʇ uoɹpןnɐƆ ɐ ʞɔıןɔ ʇɥbıᴚ", - "item.electric.discharge_mode.disabled": "pǝןqɐsıᗡ ǝpoW ǝbɹɐɥɔsıᗡǝ§", - "item.electric.discharge_mode.enabled": "pǝןqɐuƎ ǝpoW ǝbɹɐɥɔsıᗡǝ§", - "item.electric.discharge_mode.tooltip": "ǝpoɯ ǝbɹɐɥɔsıp ǝןbboʇ oʇ buıʞɐǝus ǝןıɥʍ ǝs∩", - "item.generic.electric_item.stored": ")%s( ∩Ǝ %d/%d", - "item.generic.electric_item.tooltip": "%s ɹǝı⟘ - ∩Ǝ %d/%d", - "item.generic.fluid_container.tooltip": "%s Ꞁ%d/%d", - "item.int_circuit.configuration": "%d :uoıʇɐɹnbıɟuoƆ", - "item.liquid_fuel_jetpack.tooltip": "ʇsnɹɥ⟘ ɹoɟ sןǝnℲ ɹoʇɐɹǝuǝ⅁ uoıʇsnqɯoƆ sǝs∩", - "item.machine_configuration.mode": "%s ɹ§:ǝpoW uoıʇɐɹnbıɟuoƆɐ§", - "item.plugin.proxy.tooltips.1": ")uǝǝɹɔs ǝɥʇ uı ǝpoɯ ʎxoɹd oʇ ʇsnظpɐ ǝsɐǝןԀ(", - "item.plugin.tooltips.1": "˙ʎʇıןɐuoıʇɔunɟ ǝɹoɯ ɹoɟ uǝǝɹɔs ǝɥʇ oʇ pǝppɐ ǝq uɐɔ suıbnןԀ", - "item.prospector.mode.bedrock_ore": "ɹ§ǝpoW uoıʇɔǝdsoɹԀ ǝɹO ʞɔoɹpǝᗺq§", - "item.prospector.mode.fluid": "ɹ§ǝpoW uoıʇɔǝdsoɹԀ pınןℲq§", - "item.prospector.mode.ores": "ɹ§ǝpoW uoıʇɔǝdsoɹԀ ǝɹOɐ§", - "item.prospector.tooltip.modes": ":sǝpoW ǝןqɐןıɐʌⱯ", - "item.prospector.tooltip.radius": "snıpɐᴚ ʞunɥƆ %s ɐ uı ǝbuɐɹ suɐɔS", - "item.record.sus.tooltip": "dıɹᗡ s∩ buoɯⱯ - zuoǝꞀㄥ§", - "item.terminal.tooltip": "ʞɹoʍ poob ǝʞɐɯ sןooʇ dɹɐɥS", - "item.terminal.tooltip.creative": "ǝpoW ǝʌıʇɐǝɹƆq§", - "item.terminal.tooltip.hardware": "%d :ǝɹɐʍpɹɐHɐ§", - "item.tool.tooltip.durability": "%d / %dɐ§ :ʎʇıןıqɐɹnᗡɟ§", - "item.tool.tooltip.primary_material": "%sǝ§ :ןɐıɹǝʇɐWɟ§", - "item.tool.tooltip.rotor.efficiency": "%d%%6§ :ʎɔuǝıɔıɟɟƎ ǝuıqɹn⟘", - "item.tool.tooltip.rotor.power": "%d%%6§ :ɹǝʍoԀ ǝuıqɹn⟘", - "item.tricorder_scanner.tooltip": "ɹǝpɹoɔıɹ⟘", "monitor.gui.title.argb": ":ᗺ⅁ᴚⱯ", "monitor.gui.title.back": "ʞɔɐᗺ", "monitor.gui.title.config": "bıɟuoƆ", @@ -5540,5 +5491,54 @@ "tile.gtceu.petrified_foam.name": "ɯɐoℲ pǝıɟıɹʇǝԀ", "tile.gtceu.reinforced_foam.name": "ɯɐoℲ pǝɔɹoɟuıǝᴚ", "tile.gtceu.reinforced_stone.name": "ǝuoʇS pǝɔɹoɟuıǝᴚ", - "tile.gtceu.seal.name": "ʞɔoןᗺ pǝןɐǝS" + "tile.gtceu.seal.name": "ʞɔoןᗺ pǝןɐǝS", + "tool.gtceu.attack_damage.tooltip": "ǝbɐɯɐᗡ ʞɔɐʇʇⱯɔ§ %s", + "tool.gtceu.attack_speed.tooltip": "pǝǝdS ʞɔɐʇʇⱯ6§ %s", + "tool.gtceu.behavior.aoe_mining": "%sx%sx%sɟ§ :ʇɔǝɟɟƎ-ɟo-ɐǝɹⱯϛ§", + "tool.gtceu.behavior.block_rotation": "sʞɔoןᗺ sǝʇɐʇoᴚɟ§ :ɔıuɐɥɔǝWᄅ§", + "tool.gtceu.behavior.crop_harvesting": "sdoɹƆ sʇsǝʌɹɐHɟ§ :ɹǝʇsǝʌɹɐHɐ§", + "tool.gtceu.behavior.damage_boost": "%s ʇsuıɐbɐ ǝbɐɯɐp ɐɹʇxƎɟ§ :ʇsooᗺ ǝbɐɯɐᗡㄣ§", + "tool.gtceu.behavior.grass_path": "sɥʇɐԀ ssɐɹ⅁ sǝʇɐǝɹƆɟ§ :ɹǝdɐɔspuɐꞀǝ§", + "tool.gtceu.behavior.ground_tilling": "punoɹ⅁ sןןı⟘ɟ§ :ɹǝɯɹɐℲǝ§", + "tool.gtceu.behavior.plunger": "spınןℲ suıɐɹᗡɟ§ :ɹǝqɯnןԀ6§", + "tool.gtceu.behavior.rail_rotation": "sןıɐᴚ sǝʇɐʇoᴚɟ§ :ɹǝǝuıbuƎ pɐoɹןıɐᴚǝ§", + "tool.gtceu.behavior.relocate_mining": "sdoɹᗡ qoW puɐ sʞɔoןᗺ pǝuıW sǝʇɐɔoןǝᴚɟ§ :ɔıʇǝubɐWᄅ§", + "tool.gtceu.behavior.remove_wax": "xɐM sǝʌoɯǝᴚɟ§ :ɹǝuɐǝןƆ9§", + "tool.gtceu.behavior.scrape": "uoıʇɐpıxO sǝʌoɯǝᴚɟ§ :ɹǝɥsıןoԀq§", + "tool.gtceu.behavior.shield_disable": "spןǝıɥS sǝןqɐsıᗡɟ§ :ǝʇnɹᗺɔ§", + "tool.gtceu.behavior.silk_ice": "ǝɔI sʇsǝʌɹɐH ʞןıSɟ§ :ɹǝʇʇnƆ ǝɔIq§", + "tool.gtceu.behavior.strip_log": "sboꞀ sdıɹʇSɟ§ :uɐsıʇɹⱯϛ§", + "tool.gtceu.behavior.torch_place": "ʞɔıןƆ-ʇɥbıᴚ uo sǝɥɔɹo⟘ sǝɔɐןԀɟ§ :ɹǝʞunןǝdSǝ§", + "tool.gtceu.behavior.tree_felling": "buıןןǝℲ ǝǝɹ⟘ɟ§ :ʞɔɐظɹǝqɯnꞀㄣ§", + "tool.gtceu.class.axe": "ǝxⱯ", + "tool.gtceu.class.butchery_knife": "ǝɟıuʞ ʎɹǝɥɔʇnᗺ", + "tool.gtceu.class.crowbar": "ɹɐqʍoɹƆ", + "tool.gtceu.class.drill": "ןןıɹᗡ", + "tool.gtceu.class.file": "ǝןıℲ", + "tool.gtceu.class.hammer": "ɹǝɯɯɐH", + "tool.gtceu.class.hoe": "ǝoH", + "tool.gtceu.class.knife": "ǝɟıuʞ", + "tool.gtceu.class.mallet": "ʇǝןןɐW ʇɟoS", + "tool.gtceu.class.mining_hammer": "ɹǝɯɯɐH buıuıW", + "tool.gtceu.class.mortar": "ɹɐʇɹoW", + "tool.gtceu.class.pickaxe": "ǝxɐʞɔıԀ", + "tool.gtceu.class.plunger": "ɹǝbunןԀ", + "tool.gtceu.class.rolling_pin": "uıԀ buıןןoᴚ", + "tool.gtceu.class.saw": "ʍɐS", + "tool.gtceu.class.screwdriver": "ɹǝʌıɹpʍǝɹɔS", + "tool.gtceu.class.scythe": "ǝɥʇʎɔS", + "tool.gtceu.class.shears": "sɹɐǝɥS", + "tool.gtceu.class.shovel": "ןǝʌoɥS", + "tool.gtceu.class.spade": "ǝpɐdS", + "tool.gtceu.class.sword": "pɹoʍS", + "tool.gtceu.class.wire_cutter": "ɹǝʇʇnƆ ǝɹıM", + "tool.gtceu.class.wrench": "ɥɔuǝɹM", + "tool.gtceu.crafting_uses.tooltip": "sǝs∩ buıʇɟɐɹƆɐ§ %s", + "tool.gtceu.general_uses.tooltip": "ʎʇıןıqɐɹnᗡq§ %s", + "tool.gtceu.harvest_level.tooltip": "%s ןǝʌǝꞀ ʇsǝʌɹɐHǝ§", + "tool.gtceu.harvest_level_extra.tooltip": ")ɟ§%s(ɟ§ %s ןǝʌǝꞀ ʇsǝʌɹɐHǝ§", + "tool.gtceu.max_uses.tooltip": "ʎʇıןıqɐɹnᗡ ןɐʇo⟘ǝ§ %s", + "tool.gtceu.mining_speed.tooltip": "pǝǝdS buıuıWp§ %s", + "tool.gtceu.repair_info.tooltip": "oɟuI ɹıɐdǝᴚ ʍoɥs oʇ ⟘ℲIHS pןoH8§", + "tool.gtceu.repair_material.tooltip": "%sɐ§ɟ§ :ɥʇıʍ ɹıɐdǝᴚ8§" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index fe720e37417..61edefe4708 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -1,4 +1,47 @@ { + "armor.gtceu.energy_share.disable": "Energy Supply: Gadgets charging disabled", + "armor.gtceu.energy_share.enable": "Energy Supply: Gadgets charging enabled", + "armor.gtceu.energy_share.error": "Energy Supply: §cNot enough power for gadgets charging!", + "armor.gtceu.energy_share.tooltip": "Supply mode: %s", + "armor.gtceu.energy_share.tooltip.guide": "To change mode shift-right click when holding item", + "armor.gtceu.hud.energy_lvl": "Energy Level: %s", + "armor.gtceu.hud.engine_enabled": "Engine Enabled: %s", + "armor.gtceu.hud.fuel_lvl": "Fuel Level: %s", + "armor.gtceu.hud.gravi_engine": "GraviEngine: %s", + "armor.gtceu.hud.hover_mode": "Hover Mode: %s", + "armor.gtceu.hud.status.disabled": "§cOFF", + "armor.gtceu.hud.status.enabled": "§aON", + "armor.gtceu.jetpack.emergency_hover_mode": "Emergency Hover Mode Enabled!", + "armor.gtceu.jetpack.flight.disable": "Jetpack: Flight Disabled", + "armor.gtceu.jetpack.flight.enable": "Jetpack: Flight Enabled", + "armor.gtceu.jetpack.hover.disable": "Jetpack: Hover Mode Disabled", + "armor.gtceu.jetpack.hover.enable": "Jetpack: Hover Mode Enabled", + "armor.gtceu.message.nightvision.disabled": "§bNightVision: §cOff", + "armor.gtceu.message.nightvision.enabled": "§bNightVision: §aOn", + "armor.gtceu.message.nightvision.error": "§cNot enough power!", + "armor.gtceu.nms.boosted_jump.disabled": "NanoMuscle™ Suite: Jump Boost Disabled", + "armor.gtceu.nms.boosted_jump.enabled": "NanoMuscle™ Suite: Jump Boost Enabled", + "armor.gtceu.nms.charge.disable": "NanoMuscle™ Suite: Charging Disabled", + "armor.gtceu.nms.charge.enable": "NanoMuscle™ Suite: Charging Enabled", + "armor.gtceu.nms.charge.error": "NanoMuscle™ Suite: §cNot enough power for charging!", + "armor.gtceu.nms.nightvision.disabled": "NanoMuscle™ Suite: NightVision Disabled", + "armor.gtceu.nms.nightvision.enabled": "NanoMuscle™ Suite: NightVision Enabled", + "armor.gtceu.nms.nightvision.error": "NanoMuscle™ Suite: §cNot enough power!", + "armor.gtceu.qts.charge.disable": "QuarkTech™ Suite: Charging Disabled", + "armor.gtceu.qts.charge.enable": "QuarkTech™ Suite: Charging Enabled", + "armor.gtceu.qts.charge.error": "QuarkTech™ Suite: §cNot enough power for charging!", + "armor.gtceu.qts.nightvision.disabled": "QuarkTech™ Suite: NightVision Disabled", + "armor.gtceu.qts.nightvision.enabled": "QuarkTech™ Suite: NightVision Enabled", + "armor.gtceu.qts.nightvision.error": "QuarkTech™ Suite: §cNot enough power!", + "armor.gtceu.tooltip.autoeat": "Replenishes Food Bar by Using Food from Inventory", + "armor.gtceu.tooltip.breath": "Replenishes Underwater Breath Bar", + "armor.gtceu.tooltip.burning": "Nullifies Burning", + "armor.gtceu.tooltip.falldamage": "Nullifies Fall Damage", + "armor.gtceu.tooltip.freezing": "Prevents Freezing", + "armor.gtceu.tooltip.jump": "Increases Jump Height and Distance", + "armor.gtceu.tooltip.potions": "Nullifies Harmful Effects", + "armor.gtceu.tooltip.speed": "Increases Running Speed", + "armor.gtceu.tooltip.stepassist": "Provides Step-Assist", "behavior.data_item.assemblyline.data": "- §a%s", "behavior.data_item.assemblyline.title": "§nAssembly Line Construction Data:", "behavior.item_magnet.disabled": "§cMagnetic Field Disabled", @@ -1703,14 +1746,40 @@ "block.surface_rock": "%s Surface Rock", "button.gtceu.mark_as_depleted.name": "Mark as Depleted", "button.gtceu.toggle_waypoint.name": "Toggle Waypoint", + "command.gtceu.copy.click_to_copy": "Click to copy", + "command.gtceu.copy.copied_and_click": "copied to clipboard. Click to copy again", + "command.gtceu.copy.copied_end": "] to the clipboard", + "command.gtceu.copy.copied_start": "Copied [", "command.gtceu.dump_data.success": "Dumped %s resources from registry %s to %s", + "command.gtceu.hand.electric": "Electric Info: %d / %d EU - Tier: %d; Is Battery: %s", + "command.gtceu.hand.fluid": "Fluid Info: %d / %d mB; Can Fill: %s; Can Drain: %s", + "command.gtceu.hand.fluid2": "Fluid Id:", + "command.gtceu.hand.groovy": "Consider using §6/gs hand", + "command.gtceu.hand.item_id": "Item: %s (Metadata: %d)", + "command.gtceu.hand.material": "Material Id:", + "command.gtceu.hand.meta_item": "MetaItem Id:", + "command.gtceu.hand.no_item": "You must hold something in main hand or off hand before executing this command.", + "command.gtceu.hand.not_a_player": "This command is only usable by a player.", + "command.gtceu.hand.ore_prefix": "Ore prefix:", + "command.gtceu.hand.tag_entries": "§3Tag entries:", + "command.gtceu.hand.tool_stats": "Tool Stats Class: %s", + "command.gtceu.hand.usage": "Usage: /gtceu hand", "command.gtceu.medical_condition.get": "Player %s has these medical conditions:", "command.gtceu.medical_condition.get.element": "Condition %s§r: %s minutes %s seconds", "command.gtceu.medical_condition.get.element.permanent": "Condition %s§r: %s minutes %s seconds (permanent)", "command.gtceu.medical_condition.get.empty": "Player %s has no medical conditions.", "command.gtceu.place_vein.failure": "Failed to place vein %s at position %s", "command.gtceu.place_vein.success": "Placed vein %s at position %s", + "command.gtceu.recipecheck.begin": "Starting recipe conflict check...", + "command.gtceu.recipecheck.end": "Recipe conflict check found %d possible conflicts. Check the server log for more info", + "command.gtceu.recipecheck.end_no_conflicts": "No recipe conflicts found!", + "command.gtceu.recipecheck.usage": "Usage: /gtceu recipecheck", "command.gtceu.share_prospection_data.notification": "%s is sharing prospecting data with you!", + "command.gtceu.usage": "Usage: /gtceu ", + "command.gtceu.worldgen.reload.failed": "Worldgen reload failed. Check console for errors.", + "command.gtceu.worldgen.reload.success": "Worldgen successfully reloaded from config.", + "command.gtceu.worldgen.reload.usage": "Usage: /gtceu worldgen reload", + "command.gtceu.worldgen.usage": "Usage: /gtceu worldgen ", "config.gtceu.option.addLoot": "addLoot", "config.gtceu.option.ae2": "ae2", "config.gtceu.option.allUniqueStoneTypes": "allUniqueStoneTypes", @@ -2096,19 +2165,19 @@ "death.attack.gtceu.hoe": "%s had their head tilled by %s", "death.attack.gtceu.knife": "%s was gently poked by %s", "death.attack.gtceu.mallet": "%s got hammered to death by %s", - "death.attack.gtceu.medical_condition/arsenicosis": "%s got arsenic poisoning", - "death.attack.gtceu.medical_condition/asbestosis": "%s got mesothelioma", - "death.attack.gtceu.medical_condition/berylliosis": "%s mined emeralds a bit too greedily", - "death.attack.gtceu.medical_condition/carbon_monoxide_poisoning": "%s left the stove on", - "death.attack.gtceu.medical_condition/carcinogen": "%s got leukemia", - "death.attack.gtceu.medical_condition/chemical_burns": "%s had a chemical accident", - "death.attack.gtceu.medical_condition/irritant": "%s got a §n§lREALLY§r bad rash", - "death.attack.gtceu.medical_condition/methanol_poisoning": "%s tried to drink moonshine during the prohibition", - "death.attack.gtceu.medical_condition/nausea": "%s died of nausea", - "death.attack.gtceu.medical_condition/none": "%s died of... nothing?", - "death.attack.gtceu.medical_condition/poison": "%s forgot that poisonous materials are, in fact, poisonous", - "death.attack.gtceu.medical_condition/silicosis": "%s didn't die of tuberculosis. it was silicosis.", - "death.attack.gtceu.medical_condition/weak_poison": "%s ate lead (or mercury!)", + "death.attack.gtceu.medical_condition.arsenicosis": "%s got arsenic poisoning", + "death.attack.gtceu.medical_condition.asbestosis": "%s got mesothelioma", + "death.attack.gtceu.medical_condition.berylliosis": "%s mined emeralds a bit too greedily", + "death.attack.gtceu.medical_condition.carbon_monoxide_poisoning": "%s left the stove on", + "death.attack.gtceu.medical_condition.carcinogen": "%s got leukemia", + "death.attack.gtceu.medical_condition.chemical_burns": "%s had a chemical accident", + "death.attack.gtceu.medical_condition.irritant": "%s got a §n§lREALLY§r bad rash", + "death.attack.gtceu.medical_condition.methanol_poisoning": "%s tried to drink moonshine during the prohibition", + "death.attack.gtceu.medical_condition.nausea": "%s died of nausea", + "death.attack.gtceu.medical_condition.none": "%s died of... nothing?", + "death.attack.gtceu.medical_condition.poison": "%s forgot that poisonous materials are, in fact, poisonous", + "death.attack.gtceu.medical_condition.silicosis": "%s didn't die of tuberculosis. it was silicosis.", + "death.attack.gtceu.medical_condition.weak_poison": "%s ate lead (or mercury!)", "death.attack.gtceu.mining_hammer": "%s was mistaken for Ore by %s", "death.attack.gtceu.mortar": "%s was ground to dust by %s", "death.attack.gtceu.pickaxe": "%s got mined by %s", @@ -2178,32 +2247,6 @@ "gtceu.circuit_assembler": "Circuit Assembler", "gtceu.coke_oven": "Coke Oven", "gtceu.combustion_generator": "Combustion Generator", - "gtceu.command.copy.click_to_copy": "Click to copy", - "gtceu.command.copy.copied_and_click": "copied to clipboard. Click to copy again", - "gtceu.command.copy.copied_end": "] to the clipboard", - "gtceu.command.copy.copied_start": "Copied [", - "gtceu.command.hand.electric": "Electric Info: %d / %d EU - Tier: %d; Is Battery: %s", - "gtceu.command.hand.fluid": "Fluid Info: %d / %d mB; Can Fill: %s; Can Drain: %s", - "gtceu.command.hand.fluid2": "Fluid Id:", - "gtceu.command.hand.groovy": "Consider using §6/gs hand", - "gtceu.command.hand.item_id": "Item: %s (Metadata: %d)", - "gtceu.command.hand.material": "Material Id:", - "gtceu.command.hand.meta_item": "MetaItem Id:", - "gtceu.command.hand.no_item": "You must hold something in main hand or off hand before executing this command.", - "gtceu.command.hand.not_a_player": "This command is only usable by a player.", - "gtceu.command.hand.ore_prefix": "Ore prefix:", - "gtceu.command.hand.tag_entries": "§3Tag entries:", - "gtceu.command.hand.tool_stats": "Tool Stats Class: %s", - "gtceu.command.hand.usage": "Usage: /gtceu hand", - "gtceu.command.recipecheck.begin": "Starting recipe conflict check...", - "gtceu.command.recipecheck.end": "Recipe conflict check found %d possible conflicts. Check the server log for more info", - "gtceu.command.recipecheck.end_no_conflicts": "No recipe conflicts found!", - "gtceu.command.recipecheck.usage": "Usage: /gtceu recipecheck", - "gtceu.command.usage": "Usage: /gtceu ", - "gtceu.command.worldgen.reload.failed": "Worldgen reload failed. Check console for errors.", - "gtceu.command.worldgen.reload.success": "Worldgen successfully reloaded from config.", - "gtceu.command.worldgen.reload.usage": "Usage: /gtceu worldgen reload", - "gtceu.command.worldgen.usage": "Usage: /gtceu worldgen ", "gtceu.compressor": "Compressor", "gtceu.cover.activity_detector.message_activity_inverted": "Monitoring Inverted Activity Status", "gtceu.cover.activity_detector.message_activity_normal": "Monitoring Normal Activity Status", @@ -3490,29 +3533,6 @@ "gtceu.subtitle.wirecutter": "Wire snipped", "gtceu.subtitle.wrench": "Wrench rattling", "gtceu.thermal_centrifuge": "Thermal Centrifuge", - "gtceu.tool.class.axe": "Axe", - "gtceu.tool.class.butchery_knife": "Butchery Knife", - "gtceu.tool.class.crowbar": "Crowbar", - "gtceu.tool.class.drill": "Drill", - "gtceu.tool.class.file": "File", - "gtceu.tool.class.hammer": "Hammer", - "gtceu.tool.class.hoe": "Hoe", - "gtceu.tool.class.knife": "Knife", - "gtceu.tool.class.mallet": "Soft Mallet", - "gtceu.tool.class.mining_hammer": "Mining Hammer", - "gtceu.tool.class.mortar": "Mortar", - "gtceu.tool.class.pickaxe": "Pickaxe", - "gtceu.tool.class.plunger": "Plunger", - "gtceu.tool.class.rolling_pin": "Rolling Pin", - "gtceu.tool.class.saw": "Saw", - "gtceu.tool.class.screwdriver": "Screwdriver", - "gtceu.tool.class.scythe": "Scythe", - "gtceu.tool.class.shears": "Shears", - "gtceu.tool.class.shovel": "Shovel", - "gtceu.tool.class.spade": "Spade", - "gtceu.tool.class.sword": "Sword", - "gtceu.tool.class.wire_cutter": "Wire Cutter", - "gtceu.tool.class.wrench": "Wrench", "gtceu.tool_action.crowbar": "§8Use Crowbar to remove Covers", "gtceu.tool_action.hammer": "§8Use Hard Hammer to muffle Sounds", "gtceu.tool_action.screwdriver.access_covers": "§8Use Screwdriver to access Covers", @@ -3641,6 +3661,34 @@ "gui.gtceu.share_tank.title": "Shared Tank Inventory", "gui.widget.incrementButton.default_tooltip": "Hold Shift, Ctrl or both to change the amount", "gui.widget.recipeProgressWidget.default_tooltip": "Show Recipes", + "item.behavior.mode_switch.current_mode": "Mode: %s", + "item.behavior.mode_switch.mode_switched": "§eMode Set to: %s", + "item.behavior.mode_switch.tooltip": "Use while sneaking to switch mode", + "item.clipboard.tooltip": "Can be written on (without any writing Instrument). Right-click on Wall to place, and Shift-Right-Click to remove", + "item.cover.digital.mode.energy.disabled": "Click to enable Energy Mode", + "item.cover.digital.mode.energy.enabled": "Energy Mode enabled", + "item.cover.digital.mode.fluid.disabled": "Click to enable Fluid Mode", + "item.cover.digital.mode.fluid.enabled": "Fluid Mode enabled", + "item.cover.digital.mode.item.disabled": "Click to enable Item Mode", + "item.cover.digital.mode.item.enabled": "Item Mode enabled", + "item.cover.digital.mode.machine.disabled": "Click to enable Machine Mode", + "item.cover.digital.mode.machine.enabled": "Machine Mode enabled", + "item.cover.digital.mode.proxy.disabled": "Click to enable Proxy Mode", + "item.cover.digital.mode.proxy.enabled": "Proxy Mode enabled", + "item.cover.digital.tooltip": "Connects machines over §fPower Cables§7 to the §fCentral Monitor§7 as §fCover§7.", + "item.cover.digital.wireless.tooltip.0": "§fWirelessly§7 connects machines to the §fCentral Monitor§7 as §fCover§7.", + "item.cover.digital.wireless.tooltip.1": "§fRight Click§7 on the §fCentral Monitor§7 to remotely bind to it.", + "item.cover.digital.wireless.tooltip.2": "§fSneak Right Click§7 to remove the current binding.", + "item.cover.digital.wireless.tooltip.3": "§aBinding: §f%s", + "item.crushed.tooltip.purify": "Right click a Cauldron to get Purified Ore", + "item.debug_scanner.tooltip": "Tricorder", + "item.dust.tooltip.purify": "Right click a Cauldron to get clean Dust", + "item.electric.discharge_mode.disabled": "§eDischarge Mode Disabled", + "item.electric.discharge_mode.enabled": "§eDischarge Mode Enabled", + "item.electric.discharge_mode.tooltip": "Use while sneaking to toggle discharge mode", + "item.generic.electric_item.stored": "%d/%d EU (%s)", + "item.generic.electric_item.tooltip": "%d/%d EU - Tier %s", + "item.generic.fluid_container.tooltip": "%d/%dL %s", "item.glass_lens": "Glass Lens (White)", "item.gtceu.activity_detector_cover": "Activity Detector", "item.gtceu.activity_detector_cover.tooltip": "§7Gives out §fActivity Status§7 as Redstone as §fCover§7.", @@ -4422,22 +4470,6 @@ "item.gtceu.tool.aoe.layers": "Layers", "item.gtceu.tool.aoe.rows": "Rows", "item.gtceu.tool.axe": "%s Axe", - "item.gtceu.tool.behavior.aoe_mining": "§5Area-of-Effect: §f%sx%sx%s", - "item.gtceu.tool.behavior.block_rotation": "§2Mechanic: §fRotates Blocks", - "item.gtceu.tool.behavior.crop_harvesting": "§aHarvester: §fHarvests Crops", - "item.gtceu.tool.behavior.damage_boost": "§4Damage Boost: §fExtra damage against %s", - "item.gtceu.tool.behavior.grass_path": "§eLandscaper: §fCreates Grass Paths", - "item.gtceu.tool.behavior.ground_tilling": "§eFarmer: §fTills Ground", - "item.gtceu.tool.behavior.plunger": "§9Plumber: §fDrains Fluids", - "item.gtceu.tool.behavior.rail_rotation": "§eRailroad Engineer: §fRotates Rails", - "item.gtceu.tool.behavior.relocate_mining": "§2Magnetic: §fRelocates Mined Blocks and Mob Drops", - "item.gtceu.tool.behavior.remove_wax": "§6Cleaner: §fRemoves Wax", - "item.gtceu.tool.behavior.scrape": "§bPolisher: §fRemoves Oxidation", - "item.gtceu.tool.behavior.shield_disable": "§cBrute: §fDisables Shields", - "item.gtceu.tool.behavior.silk_ice": "§bIce Cutter: §fSilk Harvests Ice", - "item.gtceu.tool.behavior.strip_log": "§5Artisan: §fStrips Logs", - "item.gtceu.tool.behavior.torch_place": "§eSpelunker: §fPlaces Torches on Right-Click", - "item.gtceu.tool.behavior.tree_felling": "§4Lumberjack: §fTree Felling", "item.gtceu.tool.butchery_knife": "%s Butchery Knife", "item.gtceu.tool.butchery_knife.tooltip": "§8Has a slow Attack Rate", "item.gtceu.tool.buzzsaw": "%s Buzzsaw (LV)", @@ -4498,16 +4530,6 @@ "item.gtceu.tool.spade": "%s Spade", "item.gtceu.tool.spade.tooltip": "§8Mines a large area at once (unless you're crouching)", "item.gtceu.tool.sword": "%s Sword", - "item.gtceu.tool.tooltip.attack_damage": "%s §cAttack Damage", - "item.gtceu.tool.tooltip.attack_speed": "%s §9Attack Speed", - "item.gtceu.tool.tooltip.crafting_uses": "%s §aCrafting Uses", - "item.gtceu.tool.tooltip.general_uses": "%s §bDurability", - "item.gtceu.tool.tooltip.harvest_level": "§eHarvest Level %s", - "item.gtceu.tool.tooltip.harvest_level_extra": "§eHarvest Level %s §f(%s§f)", - "item.gtceu.tool.tooltip.max_uses": "%s §eTotal Durability", - "item.gtceu.tool.tooltip.mining_speed": "%s §dMining Speed", - "item.gtceu.tool.tooltip.repair_info": "§8Hold SHIFT to show Repair Info", - "item.gtceu.tool.tooltip.repair_material": "§8Repair with: §f§a%s", "item.gtceu.tool.usable_as": "§8Usable as: §f%s", "item.gtceu.tool.wire_cutter": "%s Wire Cutter", "item.gtceu.tool.wrench": "%s Wrench", @@ -4638,9 +4660,28 @@ "item.gtceu.zpm_solar_panel": "Zero Point Module Solar Panel", "item.gtceu.zpm_voltage_coil": "Zero Point Module Voltage Coil", "item.gtceu.zpm_voltage_coil.tooltip": "Super Coil", + "item.int_circuit.configuration": "Configuration: %d", "item.invalid.name": "Invalid item", + "item.liquid_fuel_jetpack.tooltip": "Uses Combustion Generator Fuels for Thrust", + "item.machine_configuration.mode": "§aConfiguration Mode:§r %s", "item.netherrack_nether_quartz": "Nether Quartz Ore", + "item.plugin.proxy.tooltips.1": "(Please adjust to proxy mode in the screen)", + "item.plugin.tooltips.1": "Plugins can be added to the screen for more functionality.", + "item.prospector.mode.bedrock_ore": "§bBedrock Ore Prospection Mode§r", + "item.prospector.mode.fluid": "§bFluid Prospection Mode§r", + "item.prospector.mode.ores": "§aOre Prospection Mode§r", + "item.prospector.tooltip.modes": "Available Modes:", + "item.prospector.tooltip.radius": "Scans range in a %s Chunk Radius", + "item.record.sus.tooltip": "§7Leonz - Among Us Drip", + "item.terminal.tooltip": "Sharp tools make good work", + "item.terminal.tooltip.creative": "§bCreative Mode", + "item.terminal.tooltip.hardware": "§aHardware: %d", "item.toggle.advanced.info.tooltip": "§8", + "item.tool.tooltip.durability": "§fDurability: §a%d / %d", + "item.tool.tooltip.primary_material": "§fMaterial: §e%s", + "item.tool.tooltip.rotor.efficiency": "Turbine Efficiency: §9%d%%", + "item.tool.tooltip.rotor.power": "Turbine Power: §9%d%%", + "item.tricorder_scanner.tooltip": "Tricorder", "itemGroup.gtceu.decoration": "GregTechCEu Decoration Blocks", "itemGroup.gtceu.item": "GregTechCEu Items", "itemGroup.gtceu.machine": "GregTechCEu Machines", @@ -5313,96 +5354,6 @@ "material.gtceu.zirconium": "Zirconium", "message.gtceu.new_veins.amount": "Prospected %d new veins!", "message.gtceu.new_veins.name": "Prospected %s!", - "armor.gtceu.energy_share.disable": "Energy Supply: Gadgets charging disabled", - "armor.gtceu.energy_share.enable": "Energy Supply: Gadgets charging enabled", - "armor.gtceu.energy_share.error": "Energy Supply: §cNot enough power for gadgets charging!", - "armor.gtceu.energy_share.tooltip": "Supply mode: %s", - "armor.gtceu.energy_share.tooltip.guide": "To change mode shift-right click when holding item", - "armor.gtceu.hud.energy_lvl": "Energy Level: %s", - "armor.gtceu.hud.engine_enabled": "Engine Enabled: %s", - "armor.gtceu.hud.fuel_lvl": "Fuel Level: %s", - "armor.gtceu.hud.gravi_engine": "GraviEngine: %s", - "armor.gtceu.hud.hover_mode": "Hover Mode: %s", - "armor.gtceu.hud.status.disabled": "§cOFF", - "armor.gtceu.hud.status.enabled": "§aON", - "armor.gtceu.jetpack.emergency_hover_mode": "Emergency Hover Mode Enabled!", - "armor.gtceu.jetpack.flight.disable": "Jetpack: Flight Disabled", - "armor.gtceu.jetpack.flight.enable": "Jetpack: Flight Enabled", - "armor.gtceu.jetpack.hover.disable": "Jetpack: Hover Mode Disabled", - "armor.gtceu.jetpack.hover.enable": "Jetpack: Hover Mode Enabled", - "armor.gtceu.message.nightvision.disabled": "§bNightVision: §cOff", - "armor.gtceu.message.nightvision.enabled": "§bNightVision: §aOn", - "armor.gtceu.message.nightvision.error": "§cNot enough power!", - "armor.gtceu.nms.boosted_jump.disabled": "NanoMuscle™ Suite: Jump Boost Disabled", - "armor.gtceu.nms.boosted_jump.enabled": "NanoMuscle™ Suite: Jump Boost Enabled", - "armor.gtceu.nms.nightvision.disabled": "NanoMuscle™ Suite: NightVision Disabled", - "armor.gtceu.nms.nightvision.enabled": "NanoMuscle™ Suite: NightVision Enabled", - "armor.gtceu.nms.nightvision.error": "NanoMuscle™ Suite: §cNot enough power!", - "armor.gtceu.nms.charge.disable": "NanoMuscle™ Suite: Charging Disabled", - "armor.gtceu.nms.charge.enable": "NanoMuscle™ Suite: Charging Enabled", - "armor.gtceu.nms.charge.error": "NanoMuscle™ Suite: §cNot enough power for charging!", - "armor.gtceu.qts.nightvision.disabled": "QuarkTech™ Suite: NightVision Disabled", - "armor.gtceu.qts.nightvision.enabled": "QuarkTech™ Suite: NightVision Enabled", - "armor.gtceu.qts.nightvision.error": "QuarkTech™ Suite: §cNot enough power!", - "armor.gtceu.qts.charge.disable": "QuarkTech™ Suite: Charging Disabled", - "armor.gtceu.qts.charge.enable": "QuarkTech™ Suite: Charging Enabled", - "armor.gtceu.qts.charge.error": "QuarkTech™ Suite: §cNot enough power for charging!", - "armor.gtceu.tooltip.autoeat": "Replenishes Food Bar by Using Food from Inventory", - "armor.gtceu.tooltip.breath": "Replenishes Underwater Breath Bar", - "armor.gtceu.tooltip.burning": "Nullifies Burning", - "armor.gtceu.tooltip.falldamage": "Nullifies Fall Damage", - "armor.gtceu.tooltip.freezing": "Prevents Freezing", - "armor.gtceu.tooltip.jump": "Increases Jump Height and Distance", - "armor.gtceu.tooltip.potions": "Nullifies Harmful Effects", - "armor.gtceu.tooltip.speed": "Increases Running Speed", - "armor.gtceu.tooltip.stepassist": "Provides Step-Assist", - "item.behavior.mode_switch.current_mode": "Mode: %s", - "item.behavior.mode_switch.mode_switched": "§eMode Set to: %s", - "item.behavior.mode_switch.tooltip": "Use while sneaking to switch mode", - "item.clipboard.tooltip": "Can be written on (without any writing Instrument). Right-click on Wall to place, and Shift-Right-Click to remove", - "item.cover.digital.mode.energy.disabled": "Click to enable Energy Mode", - "item.cover.digital.mode.energy.enabled": "Energy Mode enabled", - "item.cover.digital.mode.fluid.disabled": "Click to enable Fluid Mode", - "item.cover.digital.mode.fluid.enabled": "Fluid Mode enabled", - "item.cover.digital.mode.item.disabled": "Click to enable Item Mode", - "item.cover.digital.mode.item.enabled": "Item Mode enabled", - "item.cover.digital.mode.machine.disabled": "Click to enable Machine Mode", - "item.cover.digital.mode.machine.enabled": "Machine Mode enabled", - "item.cover.digital.mode.proxy.disabled": "Click to enable Proxy Mode", - "item.cover.digital.mode.proxy.enabled": "Proxy Mode enabled", - "item.cover.digital.tooltip": "Connects machines over §fPower Cables§7 to the §fCentral Monitor§7 as §fCover§7.", - "item.cover.digital.wireless.tooltip.0": "§fWirelessly§7 connects machines to the §fCentral Monitor§7 as §fCover§7.", - "item.cover.digital.wireless.tooltip.1": "§fRight Click§7 on the §fCentral Monitor§7 to remotely bind to it.", - "item.cover.digital.wireless.tooltip.2": "§fSneak Right Click§7 to remove the current binding.", - "item.cover.digital.wireless.tooltip.3": "§aBinding: §f%s", - "item.crushed.tooltip.purify": "Right click a Cauldron to get Purified Ore", - "item.debug_scanner.tooltip": "Tricorder", - "item.dust.tooltip.purify": "Right click a Cauldron to get clean Dust", - "item.electric.discharge_mode.disabled": "§eDischarge Mode Disabled", - "item.electric.discharge_mode.enabled": "§eDischarge Mode Enabled", - "item.electric.discharge_mode.tooltip": "Use while sneaking to toggle discharge mode", - "item.generic.electric_item.stored": "%d/%d EU (%s)", - "item.generic.electric_item.tooltip": "%d/%d EU - Tier %s", - "item.generic.fluid_container.tooltip": "%d/%dL %s", - "item.int_circuit.configuration": "Configuration: %d", - "item.liquid_fuel_jetpack.tooltip": "Uses Combustion Generator Fuels for Thrust", - "item.machine_configuration.mode": "§aConfiguration Mode:§r %s", - "item.plugin.proxy.tooltips.1": "(Please adjust to proxy mode in the screen)", - "item.plugin.tooltips.1": "Plugins can be added to the screen for more functionality.", - "item.prospector.mode.bedrock_ore": "§bBedrock Ore Prospection Mode§r", - "item.prospector.mode.fluid": "§bFluid Prospection Mode§r", - "item.prospector.mode.ores": "§aOre Prospection Mode§r", - "item.prospector.tooltip.modes": "Available Modes:", - "item.prospector.tooltip.radius": "Scans range in a %s Chunk Radius", - "item.record.sus.tooltip": "§7Leonz - Among Us Drip", - "item.terminal.tooltip": "Sharp tools make good work", - "item.terminal.tooltip.creative": "§bCreative Mode", - "item.terminal.tooltip.hardware": "§aHardware: %d", - "item.tool.tooltip.durability": "§fDurability: §a%d / %d", - "item.tool.tooltip.primary_material": "§fMaterial: §e%s", - "item.tool.tooltip.rotor.efficiency": "Turbine Efficiency: §9%d%%", - "item.tool.tooltip.rotor.power": "Turbine Power: §9%d%%", - "item.tricorder_scanner.tooltip": "Tricorder", "monitor.gui.title.argb": "ARGB:", "monitor.gui.title.back": "Back", "monitor.gui.title.config": "Config", @@ -5540,5 +5491,54 @@ "tile.gtceu.petrified_foam.name": "Petrified Foam", "tile.gtceu.reinforced_foam.name": "Reinforced Foam", "tile.gtceu.reinforced_stone.name": "Reinforced Stone", - "tile.gtceu.seal.name": "Sealed Block" + "tile.gtceu.seal.name": "Sealed Block", + "tool.gtceu.attack_damage.tooltip": "%s §cAttack Damage", + "tool.gtceu.attack_speed.tooltip": "%s §9Attack Speed", + "tool.gtceu.behavior.aoe_mining": "§5Area-of-Effect: §f%sx%sx%s", + "tool.gtceu.behavior.block_rotation": "§2Mechanic: §fRotates Blocks", + "tool.gtceu.behavior.crop_harvesting": "§aHarvester: §fHarvests Crops", + "tool.gtceu.behavior.damage_boost": "§4Damage Boost: §fExtra damage against %s", + "tool.gtceu.behavior.grass_path": "§eLandscaper: §fCreates Grass Paths", + "tool.gtceu.behavior.ground_tilling": "§eFarmer: §fTills Ground", + "tool.gtceu.behavior.plunger": "§9Plumber: §fDrains Fluids", + "tool.gtceu.behavior.rail_rotation": "§eRailroad Engineer: §fRotates Rails", + "tool.gtceu.behavior.relocate_mining": "§2Magnetic: §fRelocates Mined Blocks and Mob Drops", + "tool.gtceu.behavior.remove_wax": "§6Cleaner: §fRemoves Wax", + "tool.gtceu.behavior.scrape": "§bPolisher: §fRemoves Oxidation", + "tool.gtceu.behavior.shield_disable": "§cBrute: §fDisables Shields", + "tool.gtceu.behavior.silk_ice": "§bIce Cutter: §fSilk Harvests Ice", + "tool.gtceu.behavior.strip_log": "§5Artisan: §fStrips Logs", + "tool.gtceu.behavior.torch_place": "§eSpelunker: §fPlaces Torches on Right-Click", + "tool.gtceu.behavior.tree_felling": "§4Lumberjack: §fTree Felling", + "tool.gtceu.class.axe": "Axe", + "tool.gtceu.class.butchery_knife": "Butchery Knife", + "tool.gtceu.class.crowbar": "Crowbar", + "tool.gtceu.class.drill": "Drill", + "tool.gtceu.class.file": "File", + "tool.gtceu.class.hammer": "Hammer", + "tool.gtceu.class.hoe": "Hoe", + "tool.gtceu.class.knife": "Knife", + "tool.gtceu.class.mallet": "Soft Mallet", + "tool.gtceu.class.mining_hammer": "Mining Hammer", + "tool.gtceu.class.mortar": "Mortar", + "tool.gtceu.class.pickaxe": "Pickaxe", + "tool.gtceu.class.plunger": "Plunger", + "tool.gtceu.class.rolling_pin": "Rolling Pin", + "tool.gtceu.class.saw": "Saw", + "tool.gtceu.class.screwdriver": "Screwdriver", + "tool.gtceu.class.scythe": "Scythe", + "tool.gtceu.class.shears": "Shears", + "tool.gtceu.class.shovel": "Shovel", + "tool.gtceu.class.spade": "Spade", + "tool.gtceu.class.sword": "Sword", + "tool.gtceu.class.wire_cutter": "Wire Cutter", + "tool.gtceu.class.wrench": "Wrench", + "tool.gtceu.crafting_uses.tooltip": "%s §aCrafting Uses", + "tool.gtceu.general_uses.tooltip": "%s §bDurability", + "tool.gtceu.harvest_level.tooltip": "§eHarvest Level %s", + "tool.gtceu.harvest_level_extra.tooltip": "§eHarvest Level %s §f(%s§f)", + "tool.gtceu.max_uses.tooltip": "%s §eTotal Durability", + "tool.gtceu.mining_speed.tooltip": "%s §dMining Speed", + "tool.gtceu.repair_info.tooltip": "§8Hold SHIFT to show Repair Info", + "tool.gtceu.repair_material.tooltip": "§8Repair with: §f§a%s" } \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition.arsenicosis.json b/src/generated/resources/data/gtceu/damage_type/medical_condition.arsenicosis.json new file mode 100644 index 00000000000..a69c3585e66 --- /dev/null +++ b/src/generated/resources/data/gtceu/damage_type/medical_condition.arsenicosis.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "gtceu.medical_condition.arsenicosis", + "scaling": "never" +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition.asbestosis.json b/src/generated/resources/data/gtceu/damage_type/medical_condition.asbestosis.json new file mode 100644 index 00000000000..cad216635f1 --- /dev/null +++ b/src/generated/resources/data/gtceu/damage_type/medical_condition.asbestosis.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "gtceu.medical_condition.asbestosis", + "scaling": "never" +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition.berylliosis.json b/src/generated/resources/data/gtceu/damage_type/medical_condition.berylliosis.json new file mode 100644 index 00000000000..e8a6851184c --- /dev/null +++ b/src/generated/resources/data/gtceu/damage_type/medical_condition.berylliosis.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "gtceu.medical_condition.berylliosis", + "scaling": "never" +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition.carbon_monoxide_poisoning.json b/src/generated/resources/data/gtceu/damage_type/medical_condition.carbon_monoxide_poisoning.json new file mode 100644 index 00000000000..3551446bb9b --- /dev/null +++ b/src/generated/resources/data/gtceu/damage_type/medical_condition.carbon_monoxide_poisoning.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "gtceu.medical_condition.carbon_monoxide_poisoning", + "scaling": "never" +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition.carcinogen.json b/src/generated/resources/data/gtceu/damage_type/medical_condition.carcinogen.json new file mode 100644 index 00000000000..eeefbf9c773 --- /dev/null +++ b/src/generated/resources/data/gtceu/damage_type/medical_condition.carcinogen.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "gtceu.medical_condition.carcinogen", + "scaling": "never" +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition.chemical_burns.json b/src/generated/resources/data/gtceu/damage_type/medical_condition.chemical_burns.json new file mode 100644 index 00000000000..84e1a4dd8eb --- /dev/null +++ b/src/generated/resources/data/gtceu/damage_type/medical_condition.chemical_burns.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "gtceu.medical_condition.chemical_burns", + "scaling": "never" +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition.irritant.json b/src/generated/resources/data/gtceu/damage_type/medical_condition.irritant.json new file mode 100644 index 00000000000..b61af3b6210 --- /dev/null +++ b/src/generated/resources/data/gtceu/damage_type/medical_condition.irritant.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "gtceu.medical_condition.irritant", + "scaling": "never" +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition.methanol_poisoning.json b/src/generated/resources/data/gtceu/damage_type/medical_condition.methanol_poisoning.json new file mode 100644 index 00000000000..3147bbb575e --- /dev/null +++ b/src/generated/resources/data/gtceu/damage_type/medical_condition.methanol_poisoning.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "gtceu.medical_condition.methanol_poisoning", + "scaling": "never" +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition.nausea.json b/src/generated/resources/data/gtceu/damage_type/medical_condition.nausea.json new file mode 100644 index 00000000000..63710811f94 --- /dev/null +++ b/src/generated/resources/data/gtceu/damage_type/medical_condition.nausea.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "gtceu.medical_condition.nausea", + "scaling": "never" +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition.none.json b/src/generated/resources/data/gtceu/damage_type/medical_condition.none.json new file mode 100644 index 00000000000..183923ac348 --- /dev/null +++ b/src/generated/resources/data/gtceu/damage_type/medical_condition.none.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "gtceu.medical_condition.none", + "scaling": "never" +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition.poison.json b/src/generated/resources/data/gtceu/damage_type/medical_condition.poison.json new file mode 100644 index 00000000000..8320d7c4779 --- /dev/null +++ b/src/generated/resources/data/gtceu/damage_type/medical_condition.poison.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "gtceu.medical_condition.poison", + "scaling": "never" +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition.silicosis.json b/src/generated/resources/data/gtceu/damage_type/medical_condition.silicosis.json new file mode 100644 index 00000000000..797ce17cff8 --- /dev/null +++ b/src/generated/resources/data/gtceu/damage_type/medical_condition.silicosis.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "gtceu.medical_condition.silicosis", + "scaling": "never" +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition.weak_poison.json b/src/generated/resources/data/gtceu/damage_type/medical_condition.weak_poison.json new file mode 100644 index 00000000000..06edd50e728 --- /dev/null +++ b/src/generated/resources/data/gtceu/damage_type/medical_condition.weak_poison.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "gtceu.medical_condition.weak_poison", + "scaling": "never" +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition/arsenicosis.json b/src/generated/resources/data/gtceu/damage_type/medical_condition/arsenicosis.json deleted file mode 100644 index 08ca8f8dd62..00000000000 --- a/src/generated/resources/data/gtceu/damage_type/medical_condition/arsenicosis.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "exhaustion": 0.0, - "message_id": "gtceu.medical_condition/arsenicosis", - "scaling": "never" -} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition/asbestosis.json b/src/generated/resources/data/gtceu/damage_type/medical_condition/asbestosis.json deleted file mode 100644 index 98deaaf9508..00000000000 --- a/src/generated/resources/data/gtceu/damage_type/medical_condition/asbestosis.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "exhaustion": 0.0, - "message_id": "gtceu.medical_condition/asbestosis", - "scaling": "never" -} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition/berylliosis.json b/src/generated/resources/data/gtceu/damage_type/medical_condition/berylliosis.json deleted file mode 100644 index d7f7f62336a..00000000000 --- a/src/generated/resources/data/gtceu/damage_type/medical_condition/berylliosis.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "exhaustion": 0.0, - "message_id": "gtceu.medical_condition/berylliosis", - "scaling": "never" -} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition/carbon_monoxide_poisoning.json b/src/generated/resources/data/gtceu/damage_type/medical_condition/carbon_monoxide_poisoning.json deleted file mode 100644 index 960bbd947f7..00000000000 --- a/src/generated/resources/data/gtceu/damage_type/medical_condition/carbon_monoxide_poisoning.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "exhaustion": 0.0, - "message_id": "gtceu.medical_condition/carbon_monoxide_poisoning", - "scaling": "never" -} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition/carcinogen.json b/src/generated/resources/data/gtceu/damage_type/medical_condition/carcinogen.json deleted file mode 100644 index c530e661bfb..00000000000 --- a/src/generated/resources/data/gtceu/damage_type/medical_condition/carcinogen.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "exhaustion": 0.0, - "message_id": "gtceu.medical_condition/carcinogen", - "scaling": "never" -} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition/chemical_burns.json b/src/generated/resources/data/gtceu/damage_type/medical_condition/chemical_burns.json deleted file mode 100644 index 8c698d13a40..00000000000 --- a/src/generated/resources/data/gtceu/damage_type/medical_condition/chemical_burns.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "exhaustion": 0.0, - "message_id": "gtceu.medical_condition/chemical_burns", - "scaling": "never" -} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition/irritant.json b/src/generated/resources/data/gtceu/damage_type/medical_condition/irritant.json deleted file mode 100644 index 14c7116781b..00000000000 --- a/src/generated/resources/data/gtceu/damage_type/medical_condition/irritant.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "exhaustion": 0.0, - "message_id": "gtceu.medical_condition/irritant", - "scaling": "never" -} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition/methanol_poisoning.json b/src/generated/resources/data/gtceu/damage_type/medical_condition/methanol_poisoning.json deleted file mode 100644 index 189f65c9f81..00000000000 --- a/src/generated/resources/data/gtceu/damage_type/medical_condition/methanol_poisoning.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "exhaustion": 0.0, - "message_id": "gtceu.medical_condition/methanol_poisoning", - "scaling": "never" -} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition/nausea.json b/src/generated/resources/data/gtceu/damage_type/medical_condition/nausea.json deleted file mode 100644 index eeb8707e011..00000000000 --- a/src/generated/resources/data/gtceu/damage_type/medical_condition/nausea.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "exhaustion": 0.0, - "message_id": "gtceu.medical_condition/nausea", - "scaling": "never" -} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition/none.json b/src/generated/resources/data/gtceu/damage_type/medical_condition/none.json deleted file mode 100644 index c80601b472e..00000000000 --- a/src/generated/resources/data/gtceu/damage_type/medical_condition/none.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "exhaustion": 0.0, - "message_id": "gtceu.medical_condition/none", - "scaling": "never" -} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition/poison.json b/src/generated/resources/data/gtceu/damage_type/medical_condition/poison.json deleted file mode 100644 index 28915a07fe8..00000000000 --- a/src/generated/resources/data/gtceu/damage_type/medical_condition/poison.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "exhaustion": 0.0, - "message_id": "gtceu.medical_condition/poison", - "scaling": "never" -} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition/silicosis.json b/src/generated/resources/data/gtceu/damage_type/medical_condition/silicosis.json deleted file mode 100644 index 917b648aecf..00000000000 --- a/src/generated/resources/data/gtceu/damage_type/medical_condition/silicosis.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "exhaustion": 0.0, - "message_id": "gtceu.medical_condition/silicosis", - "scaling": "never" -} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition/weak_poison.json b/src/generated/resources/data/gtceu/damage_type/medical_condition/weak_poison.json deleted file mode 100644 index 288237e0f01..00000000000 --- a/src/generated/resources/data/gtceu/damage_type/medical_condition/weak_poison.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "exhaustion": 0.0, - "message_id": "gtceu.medical_condition/weak_poison", - "scaling": "never" -} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/damage_type/bypasses_armor.json b/src/generated/resources/data/minecraft/tags/damage_type/bypasses_armor.json index fc6bd8cfd19..c44fab80111 100644 --- a/src/generated/resources/data/minecraft/tags/damage_type/bypasses_armor.json +++ b/src/generated/resources/data/minecraft/tags/damage_type/bypasses_armor.json @@ -1,18 +1,18 @@ { "values": [ - "gtceu:medical_condition/none", - "gtceu:medical_condition/chemical_burns", - "gtceu:medical_condition/poison", - "gtceu:medical_condition/weak_poison", - "gtceu:medical_condition/irritant", - "gtceu:medical_condition/nausea", - "gtceu:medical_condition/carcinogen", - "gtceu:medical_condition/asbestosis", - "gtceu:medical_condition/arsenicosis", - "gtceu:medical_condition/silicosis", - "gtceu:medical_condition/berylliosis", - "gtceu:medical_condition/methanol_poisoning", - "gtceu:medical_condition/carbon_monoxide_poisoning", + "gtceu:medical_condition.none", + "gtceu:medical_condition.chemical_burns", + "gtceu:medical_condition.poison", + "gtceu:medical_condition.weak_poison", + "gtceu:medical_condition.irritant", + "gtceu:medical_condition.nausea", + "gtceu:medical_condition.carcinogen", + "gtceu:medical_condition.asbestosis", + "gtceu:medical_condition.arsenicosis", + "gtceu:medical_condition.silicosis", + "gtceu:medical_condition.berylliosis", + "gtceu:medical_condition.methanol_poisoning", + "gtceu:medical_condition.carbon_monoxide_poisoning", "gtceu:heat", "gtceu:chemical", "gtceu:radiation", diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java index 712f8be4a57..fc9c2dca131 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.api.cover.filter; import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; import com.gregtechceu.gtceu.utils.TagExprFilter; import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; @@ -59,7 +59,7 @@ public WidgetGroup openConfigurator(int x, int y) { WidgetGroup group = new WidgetGroup(x, y, 18 * 3 + 25, 18 * 3); // 80 55 group.addWidget(new ImageWidget(0, 0, 20, 20, GuiTextures.INFO_ICON) .setHoverTooltips( - LangHandler.getMultiLang("cover.tag_filter.info").toArray(new MutableComponent[0]))); + LangUtil.getMultiLang("cover.tag_filter.info").toArray(new MutableComponent[0]))); group.addWidget(new TextFieldWidget(0, 29, 18 * 3 + 25, 12, () -> oreDictFilterExpression, this::setOreDict) .setMaxStringLength(64) .setValidator(input -> { diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/medicalcondition/MedicalCondition.java b/src/main/java/com/gregtechceu/gtceu/api/data/medicalcondition/MedicalCondition.java index 0bd126827ac..fe895df3b72 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/medicalcondition/MedicalCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/medicalcondition/MedicalCondition.java @@ -49,7 +49,7 @@ public MedicalCondition(String name, int color, int maxProgression, IdleProgress this.color = color; this.maxProgression = maxProgression; this.damageTypeData = new DamageTypeData.Builder() - .simpleId("medical_condition/" + name) + .simpleId("medical_condition." + name) .scaling(DamageScaling.NEVER) .tag(DamageTypeTags.BYPASSES_ARMOR) .build(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/EnumSelectorWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/EnumSelectorWidget.java index 440031c6f2f..65275047910 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/EnumSelectorWidget.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/EnumSelectorWidget.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; @@ -48,7 +48,7 @@ public interface SelectableEnum { GuiTextures.VANILLA_BUTTON, texture); private BiFunction> tooltipSupplier = (value, key) -> List - .copyOf(LangHandler.getSingleOrMultiLang(key)); + .copyOf(LangUtil.getSingleOrMultiLang(key)); public EnumSelectorWidget(int xPosition, int yPosition, int width, int height, T[] values, T initialValue, Consumer onChanged) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ToggleButtonWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ToggleButtonWidget.java index 716725601e1..2d0562dec69 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ToggleButtonWidget.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ToggleButtonWidget.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.api.gui.widget; import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; @@ -68,7 +68,7 @@ protected void updateHoverTooltips() { setHoverTooltips(tooltipText + (isPressed ? ".enabled" : ".disabled")); } else { setHoverTooltips( - List.copyOf(LangHandler.getMultiLang(tooltipText + (isPressed ? ".enabled" : ".disabled")))); + List.copyOf(LangUtil.getMultiLang(tooltipText + (isPressed ? ".enabled" : ".disabled")))); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java b/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java index 9c2b92a8531..dc6b7686364 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java @@ -650,36 +650,36 @@ default int getTotalHarvestLevel(ItemStack stack) { // show this int damageRemaining = tool.getTotalMaxDurability(stack) - stack.getDamageValue() + 1; if (toolStats.isSuitableForCrafting(stack)) { - tooltip.add(Component.translatable("item.gtceu.tool.tooltip.crafting_uses", FormattingUtil + tooltip.add(Component.translatable("tool.gtceu.crafting_uses.tooltip", FormattingUtil .formatNumbers(damageRemaining / Math.max(1, toolStats.getToolDamagePerCraft(stack))))); } - tooltip.add(Component.translatable("item.gtceu.tool.tooltip.max_uses", + tooltip.add(Component.translatable("tool.gtceu.max_uses.tooltip", FormattingUtil.formatNumbers(tool.getTotalMaxDurability(stack)))); - tooltip.add(Component.translatable("item.gtceu.tool.tooltip.general_uses", + tooltip.add(Component.translatable("tool.gtceu.general_uses.tooltip", FormattingUtil.formatNumbers(damageRemaining))); } // attack info if (toolStats.isSuitableForAttacking(stack)) { - tooltip.add(Component.translatable("item.gtceu.tool.tooltip.attack_damage", + tooltip.add(Component.translatable("tool.gtceu.attack_damage.tooltip", FormattingUtil.formatNumbers(2 + tool.getTotalAttackDamage(stack)))); - tooltip.add(Component.translatable("item.gtceu.tool.tooltip.attack_speed", + tooltip.add(Component.translatable("tool.gtceu.attack_speed.tooltip", FormattingUtil.formatNumbers(4 + tool.getTotalAttackSpeed(stack)))); } // mining info if (toolStats.isSuitableForBlockBreak(stack)) { - tooltip.add(Component.translatable("item.gtceu.tool.tooltip.mining_speed", + tooltip.add(Component.translatable("tool.gtceu.mining_speed.tooltip", FormattingUtil.formatNumbers(tool.getTotalToolSpeed(stack)))); int harvestLevel = tool.getTotalHarvestLevel(stack); String harvestName = "item.gtceu.tool.harvest_level." + harvestLevel; if (Language.getInstance().has(harvestName)) { // if there's a defined name for the harvest level, use it - tooltip.add(Component.translatable("item.gtceu.tool.tooltip.harvest_level_extra", harvestLevel, + tooltip.add(Component.translatable("tool.gtceu.harvest_level_extra.tooltip", harvestLevel, Component.translatable(harvestName))); } else { - tooltip.add(Component.translatable("item.gtceu.tool.tooltip.harvest_level", harvestLevel)); + tooltip.add(Component.translatable("tool.gtceu.harvest_level.tooltip", harvestLevel)); } } @@ -689,7 +689,7 @@ default int getTotalHarvestLevel(ItemStack stack) { if (aoeDefinition != AoESymmetrical.none()) { addedBehaviorNewLine = tooltip.add(CommonComponents.EMPTY); - tooltip.add(Component.translatable("item.gtceu.tool.behavior.aoe_mining", + tooltip.add(Component.translatable("tool.gtceu.behavior.aoe_mining", aoeDefinition.column * 2 + 1, aoeDefinition.row * 2 + 1, aoeDefinition.layer + 1)); } @@ -699,7 +699,7 @@ default int getTotalHarvestLevel(ItemStack stack) { addedBehaviorNewLine = true; tooltip.add(CommonComponents.EMPTY); } - tooltip.add(Component.translatable("item.gtceu.tool.behavior.relocate_mining")); + tooltip.add(Component.translatable("tool.gtceu.behavior.relocate_mining")); } if (!addedBehaviorNewLine && !toolStats.getBehaviors().isEmpty()) { @@ -719,8 +719,8 @@ default int getTotalHarvestLevel(ItemStack stack) { // valid tools tooltip.add(Component.translatable("item.gtceu.tool.usable_as", getToolClassNames(stack).stream() - .filter(s -> Language.getInstance().has("gtceu.tool.class." + s)) - .map(s -> Component.translatable("gtceu.tool.class." + s)) + .filter(s -> Language.getInstance().has("tool.gtceu.class." + s)) + .map(s -> Component.translatable("tool.gtceu.class." + s)) .collect(Component::empty, FormattingUtil::combineComponents, FormattingUtil::combineComponents))); @@ -741,12 +741,12 @@ default int getTotalHarvestLevel(ItemStack stack) { repairItems.add(TagPrefix.plate.getLocalizedName(material)); } if (!repairItems.isEmpty()) { - tooltip.add(Component.translatable("item.gtceu.tool.tooltip.repair_material", repairItems.stream() + tooltip.add(Component.translatable("tool.gtceu.repair_material.tooltip", repairItems.stream() .collect(Component::empty, FormattingUtil::combineComponents, FormattingUtil::combineComponents))); } } else { - tooltip.add(Component.translatable("item.gtceu.tool.tooltip.repair_info")); + tooltip.add(Component.translatable("tool.gtceu.repair_info.tooltip")); } } if (this.isElectric()) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java index 8039a8f4b75..1a4e2de3027 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java @@ -20,7 +20,7 @@ import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; @@ -372,7 +372,7 @@ protected static EditableUI createBatterySlot() slotWidget.setHandlerSlot(machine.chargerInventory, 0); slotWidget.setCanPutItems(true); slotWidget.setCanTakeItems(true); - slotWidget.setHoverTooltips(LangHandler.getMultiLang("gtceu.gui.charger_slot.tooltip", + slotWidget.setHoverTooltips(LangUtil.getMultiLang("gtceu.gui.charger_slot.tooltip", GTValues.VNF[machine.getTier()], GTValues.VNF[machine.getTier()]).toArray(Component[]::new)); }); } @@ -390,7 +390,7 @@ protected static EditableUI createC slotWidget.setCanPutItems(false); slotWidget.setCanTakeItems(false); slotWidget.setHoverTooltips( - LangHandler.getMultiLang("gtceu.gui.configurator_slot.tooltip").toArray(Component[]::new)); + LangUtil.getMultiLang("gtceu.gui.configurator_slot.tooltip").toArray(Component[]::new)); }); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CircuitFancyConfigurator.java b/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CircuitFancyConfigurator.java index 522673f4fc7..fdfde2e30f5 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CircuitFancyConfigurator.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CircuitFancyConfigurator.java @@ -7,7 +7,7 @@ import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; @@ -166,7 +166,7 @@ public Widget createConfigurator() { public List getTooltips() { var list = new ArrayList<>(IFancyConfigurator.super.getTooltips()); list.addAll(Arrays.stream( - LangHandler.getMultiLang("gtceu.gui.configurator_slot.tooltip").toArray(new MutableComponent[0])) + LangUtil.getMultiLang("gtceu.gui.configurator_slot.tooltip").toArray(new MutableComponent[0])) .toList()); return list; } diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/SimplePredicate.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/SimplePredicate.java index 552d450fed2..b1bd8ba5c6c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/SimplePredicate.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/SimplePredicate.java @@ -6,7 +6,7 @@ import com.gregtechceu.gtceu.api.pattern.TraceabilityPredicate; import com.gregtechceu.gtceu.api.pattern.error.PatternStringError; import com.gregtechceu.gtceu.api.pattern.error.SinglePredicateError; -import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; import com.lowdragmc.lowdraglib.utils.BlockInfo; @@ -89,10 +89,10 @@ public List getToolTips(TraceabilityPredicate predicates) { result.add(Component.translatable("gtceu.multiblock.pattern.error.limited_within", minCount, maxCount)); } else { if (minCount != -1) { - result.add(LangHandler.getFromMultiLang("gtceu.multiblock.pattern.error.limited", 1, minCount)); + result.add(LangUtil.getFromMultiLang("gtceu.multiblock.pattern.error.limited", 1, minCount)); } if (maxCount != -1) { - result.add(LangHandler.getFromMultiLang("gtceu.multiblock.pattern.error.limited", 0, maxCount)); + result.add(LangUtil.getFromMultiLang("gtceu.multiblock.pattern.error.limited", 0, maxCount)); } } if (predicates == null) return result; diff --git a/src/main/java/com/gregtechceu/gtceu/client/TooltipsHandler.java b/src/main/java/com/gregtechceu/gtceu/client/TooltipsHandler.java index 4e0931d5585..6db0e81bd84 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/TooltipsHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/client/TooltipsHandler.java @@ -12,7 +12,7 @@ import com.gregtechceu.gtceu.common.data.GTFluids; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.common.fluid.potion.PotionFluidHelper; -import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.ChatFormatting; @@ -65,7 +65,7 @@ public static void appendTooltips(ItemStack stack, TooltipFlag flag, List multiLang = LangHandler.getMultiLang(tooltipKey); + List multiLang = LangUtil.getMultiLang(tooltipKey); if (multiLang != null && !multiLang.isEmpty()) { tooltips.addAll(1, multiLang); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java index c8b28aaf225..9bcb88f84bc 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java @@ -29,7 +29,7 @@ import com.gregtechceu.gtceu.common.item.tool.behavior.LighterBehavior; import com.gregtechceu.gtceu.common.item.tool.behavior.MetaMachineConfigCopyBehaviour; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; import com.gregtechceu.gtceu.data.recipe.CustomTags; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTUtil; @@ -1911,7 +1911,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry COVER_SOLAR_PANEL_ULV = REGISTRATE .item("ulv_solar_panel", ComponentItem::create).lang("Ultra Low Voltage Solar Panel") .onRegister(attach(new TooltipBehavior(lines -> { - lines.addAll(LangHandler.getMultiLang("item.gtceu.solar_panel.tooltip")); + lines.addAll(LangUtil.getMultiLang("item.gtceu.solar_panel.tooltip")); lines.add(Component.translatable("gtceu.universal.tooltip.voltage_out", GTValues.V[GTValues.ULV], GTValues.VNF[GTValues.ULV])); }))).onRegister(attach(new CoverPlaceBehavior(GTCovers.SOLAR_PANEL[0]))) @@ -1919,7 +1919,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry COVER_SOLAR_PANEL_LV = REGISTRATE .item("lv_solar_panel", ComponentItem::create).lang("Low Voltage Solar Panel") .onRegister(attach(new TooltipBehavior(lines -> { - lines.addAll(LangHandler.getMultiLang("item.gtceu.solar_panel.tooltip")); + lines.addAll(LangUtil.getMultiLang("item.gtceu.solar_panel.tooltip")); lines.add(Component.translatable("gtceu.universal.tooltip.voltage_out", GTValues.V[GTValues.LV], GTValues.VNF[GTValues.LV])); }))).onRegister(attach(new CoverPlaceBehavior(GTCovers.SOLAR_PANEL[1]))) @@ -1927,7 +1927,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry COVER_SOLAR_PANEL_MV = REGISTRATE .item("mv_solar_panel", ComponentItem::create).lang("Medium Voltage Solar Panel") .onRegister(attach(new TooltipBehavior(lines -> { - lines.addAll(LangHandler.getMultiLang("item.gtceu.solar_panel.tooltip")); + lines.addAll(LangUtil.getMultiLang("item.gtceu.solar_panel.tooltip")); lines.add(Component.translatable("gtceu.universal.tooltip.voltage_out", GTValues.V[GTValues.MV], GTValues.VNF[GTValues.MV])); }))).onRegister(attach(new CoverPlaceBehavior(GTCovers.SOLAR_PANEL[2]))) @@ -1935,7 +1935,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry COVER_SOLAR_PANEL_HV = REGISTRATE .item("hv_solar_panel", ComponentItem::create).lang("High Voltage Solar Panel") .onRegister(attach(new TooltipBehavior(lines -> { - lines.addAll(LangHandler.getMultiLang("item.gtceu.solar_panel.tooltip")); + lines.addAll(LangUtil.getMultiLang("item.gtceu.solar_panel.tooltip")); lines.add(Component.translatable("gtceu.universal.tooltip.voltage_out", GTValues.V[GTValues.HV], GTValues.VNF[GTValues.HV])); }))).onRegister(attach(new CoverPlaceBehavior(GTCovers.SOLAR_PANEL[3]))) @@ -1943,7 +1943,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry COVER_SOLAR_PANEL_EV = REGISTRATE .item("ev_solar_panel", ComponentItem::create).lang("Extreme Voltage Solar Panel") .onRegister(attach(new TooltipBehavior(lines -> { - lines.addAll(LangHandler.getMultiLang("item.gtceu.solar_panel.tooltip")); + lines.addAll(LangUtil.getMultiLang("item.gtceu.solar_panel.tooltip")); lines.add(Component.translatable("gtceu.universal.tooltip.voltage_out", GTValues.V[GTValues.EV], GTValues.VNF[GTValues.EV])); }))).onRegister(attach(new CoverPlaceBehavior(GTCovers.SOLAR_PANEL[4]))) @@ -1951,7 +1951,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry COVER_SOLAR_PANEL_IV = REGISTRATE .item("iv_solar_panel", ComponentItem::create).lang("Insane Voltage Solar Panel") .onRegister(attach(new TooltipBehavior(lines -> { - lines.addAll(LangHandler.getMultiLang("item.gtceu.solar_panel.tooltip")); + lines.addAll(LangUtil.getMultiLang("item.gtceu.solar_panel.tooltip")); lines.add(Component.translatable("gtceu.universal.tooltip.voltage_out", GTValues.V[GTValues.IV], GTValues.VNF[GTValues.IV])); }))).onRegister(attach(new CoverPlaceBehavior(GTCovers.SOLAR_PANEL[5]))) @@ -1959,7 +1959,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry COVER_SOLAR_PANEL_LuV = REGISTRATE .item("luv_solar_panel", ComponentItem::create).lang("Ludicrous Voltage Solar Panel") .onRegister(attach(new TooltipBehavior(lines -> { - lines.addAll(LangHandler.getMultiLang("item.gtceu.solar_panel.tooltip")); + lines.addAll(LangUtil.getMultiLang("item.gtceu.solar_panel.tooltip")); lines.add(Component.translatable("gtceu.universal.tooltip.voltage_out", GTValues.V[GTValues.LuV], GTValues.VNF[GTValues.LuV])); }))).onRegister(attach(new CoverPlaceBehavior(GTCovers.SOLAR_PANEL[6]))) @@ -1967,7 +1967,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry COVER_SOLAR_PANEL_ZPM = REGISTRATE .item("zpm_solar_panel", ComponentItem::create).lang("Zero Point Module Solar Panel") .onRegister(attach(new TooltipBehavior(lines -> { - lines.addAll(LangHandler.getMultiLang("item.gtceu.solar_panel.tooltip")); + lines.addAll(LangUtil.getMultiLang("item.gtceu.solar_panel.tooltip")); lines.add(Component.translatable("gtceu.universal.tooltip.voltage_out", GTValues.V[GTValues.ZPM], GTValues.VNF[GTValues.ZPM])); }))).onRegister(attach(new CoverPlaceBehavior(GTCovers.SOLAR_PANEL[7]))) @@ -1975,7 +1975,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry COVER_SOLAR_PANEL_UV = REGISTRATE .item("uv_solar_panel", ComponentItem::create).lang("Ultimate Voltage Solar Panel") .onRegister(attach(new TooltipBehavior(lines -> { - lines.addAll(LangHandler.getMultiLang("item.gtceu.solar_panel.tooltip")); + lines.addAll(LangUtil.getMultiLang("item.gtceu.solar_panel.tooltip")); lines.add(Component.translatable("gtceu.universal.tooltip.voltage_out", GTValues.V[GTValues.UV], GTValues.VNF[GTValues.UV])); }))).onRegister(attach(new CoverPlaceBehavior(GTCovers.SOLAR_PANEL[8]))) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java index 0472182791d..63e9ffdba62 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java @@ -27,7 +27,7 @@ import com.gregtechceu.gtceu.common.pipelike.fluidpipe.longdistance.LDFluidEndpointMachine; import com.gregtechceu.gtceu.common.pipelike.item.longdistance.LDItemEndpointMachine; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; import com.gregtechceu.gtceu.integration.kjs.GTRegistryInfo; import com.gregtechceu.gtceu.utils.FormattingUtil; @@ -300,7 +300,7 @@ public class GTMachines { .rotationState(RotationState.ALL) .tier(LV) .tieredHullRenderer(GTCEu.id("block/machine/ld_item_endpoint_machine")) - .tooltips(LangHandler.getMultiLang("gtceu.machine.endpoint.tooltip").toArray(Component[]::new)) + .tooltips(LangUtil.getMultiLang("gtceu.machine.endpoint.tooltip").toArray(Component[]::new)) .tooltipBuilder((stack, tooltip) -> { if (ConfigHolder.INSTANCE.machines.ldItemPipeMinDistance > 0) { tooltip.add(Component.translatable("gtceu.machine.endpoint.tooltip.min_length", @@ -853,10 +853,10 @@ public class GTMachines { .rotationState(RotationState.ALL) .abilities(PartAbility.MUFFLER) .overlayTieredHullRenderer("muffler_hatch") - .tooltips(LangHandler.getFromMultiLang("gtceu.machine.muffler_hatch.tooltip", 0), + .tooltips(LangUtil.getFromMultiLang("gtceu.machine.muffler_hatch.tooltip", 0), Component.translatable("gtceu.muffler.recovery_tooltip", Math.max(1, tier * 10)), Component.translatable("gtceu.part_sharing.enabled"), - LangHandler.getFromMultiLang("gtceu.machine.muffler_hatch.tooltip", 1) + LangUtil.getFromMultiLang("gtceu.machine.muffler_hatch.tooltip", 1) .withStyle(ChatFormatting.DARK_RED)) .register(), ELECTRIC_TIERS); @@ -1056,8 +1056,8 @@ public class GTMachines { .rotationState(RotationState.ALL) .abilities(PartAbility.ROTOR_HOLDER) .renderer(() -> new RotorHolderMachineRenderer(tier)) - .tooltips(LangHandler.getFromMultiLang("gtceu.machine.rotor_holder.tooltip", 0), - LangHandler.getFromMultiLang("gtceu.machine.rotor_holder.tooltip", 1), + .tooltips(LangUtil.getFromMultiLang("gtceu.machine.rotor_holder.tooltip", 0), + LangUtil.getFromMultiLang("gtceu.machine.rotor_holder.tooltip", 1), Component.translatable("gtceu.part_sharing.disabled")) .register(), GTValues.tiersBetween(HV, GTCEuAPI.isHighTier() ? OpV : UV)); diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTResearchMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTResearchMachines.java index 8992ee9db38..d34297bea41 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTResearchMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTResearchMachines.java @@ -30,7 +30,7 @@ import com.gregtechceu.gtceu.common.machine.multiblock.part.hpca.HPCACoolerPartMachine; import com.gregtechceu.gtceu.common.machine.multiblock.part.hpca.HPCAEmptyPartMachine; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; import com.gregtechceu.gtceu.utils.FormattingUtil; import net.minecraft.core.Direction; @@ -62,7 +62,7 @@ public class GTResearchMachines { .rotationState(RotationState.NON_Y_AXIS) .recipeType(GTRecipeTypes.RESEARCH_STATION_RECIPES) .appearanceBlock(ADVANCED_COMPUTER_CASING) - .tooltipBuilder((s, l) -> l.addAll(LangHandler.getMultiLang("gtceu.machine.research_station.tooltip"))) + .tooltipBuilder((s, l) -> l.addAll(LangUtil.getMultiLang("gtceu.machine.research_station.tooltip"))) .pattern(definition -> FactoryBlockPattern.start() .aisle("XXX", "VVV", "PPP", "PPP", "PPP", "VVV", "XXX") .aisle("XXX", "VAV", "AAA", "AAA", "AAA", "VAV", "XXX") @@ -197,7 +197,7 @@ public class GTResearchMachines { .appearanceBlock(COMPUTER_CASING) .recipeType(GTRecipeTypes.DUMMY_RECIPES) .tooltipBuilder((s, l) -> l - .addAll(LangHandler.getMultiLang("gtceu.machine.high_performance_computation_array.tooltip"))) + .addAll(LangUtil.getMultiLang("gtceu.machine.high_performance_computation_array.tooltip"))) .pattern(definition -> FactoryBlockPattern.start() .aisle("AA", "CC", "CC", "CC", "AA") .aisle("VA", "XV", "XV", "XV", "VA") diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedNanoMuscleSuite.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedNanoMuscleSuite.java index 942416bf2cd..705bef72a95 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedNanoMuscleSuite.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedNanoMuscleSuite.java @@ -219,7 +219,8 @@ public void drawHUD(ItemStack item, GuiGraphics guiGraphics) { if (data.contains("hover")) { String status = data.getBoolean("hover") ? "armor.gtceu.hud.status.enabled" : "armor.gtceu.hud.status.disabled"; - this.HUD.newString(Component.translatable("armor.gtceu.hud.hover_mode", Component.translatable(status))); + this.HUD.newString( + Component.translatable("armor.gtceu.hud.hover_mode", Component.translatable(status))); } } this.HUD.draw(guiGraphics); diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedQuarkTechSuite.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedQuarkTechSuite.java index 5fbc9f313ba..02a363e140c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedQuarkTechSuite.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedQuarkTechSuite.java @@ -224,7 +224,8 @@ public void drawHUD(ItemStack item, GuiGraphics guiGraphics) { if (data.contains("hover")) { String status = data.getBoolean("hover") ? "armor.gtceu.hud.status.enabled" : "armor.gtceu.hud.status.disabled"; - this.HUD.newString(Component.translatable("armor.gtceu.hud.hover_mode", Component.translatable(status))); + this.HUD.newString( + Component.translatable("armor.gtceu.hud.hover_mode", Component.translatable(status))); } } this.HUD.draw(guiGraphics); diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/Jetpack.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/Jetpack.java index cff7d7507a8..a849d311fde 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/Jetpack.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/Jetpack.java @@ -139,7 +139,8 @@ public void drawHUD(ItemStack item, GuiGraphics guiGraphics) { this.HUD.newString(result); } if (data.contains("hover")) { - Component status = (data.getBoolean("hover") ? Component.translatable("armor.gtceu.hud.status.enabled") : + Component status = (data.getBoolean("hover") ? + Component.translatable("armor.gtceu.hud.status.enabled") : Component.translatable("armor.gtceu.hud.status.disabled")); Component result = Component.translatable("armor.gtceu.hud.hover_mode", status); this.HUD.newString(result); diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/NanoMuscleSuite.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/NanoMuscleSuite.java index 2653fc40f04..97be0cdbc00 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/NanoMuscleSuite.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/NanoMuscleSuite.java @@ -64,7 +64,8 @@ public void onArmorTick(Level world, Player player, ItemStack itemStack) { player.displayClientMessage(Component.translatable("armor.gtceu.nms.nightvision.error"), true); } else { player.displayClientMessage(Component - .translatable("armor.gtceu.nms.nightvision." + (nightVision ? "enabled" : "disabled")), true); + .translatable("armor.gtceu.nms.nightvision." + (nightVision ? "enabled" : "disabled")), + true); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/NightvisionGoggles.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/NightvisionGoggles.java index 134cc8229d0..ad9556640c4 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/NightvisionGoggles.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/NightvisionGoggles.java @@ -49,7 +49,8 @@ public void onArmorTick(Level world, @NotNull Player player, @NotNull ItemStack player.displayClientMessage(Component.translatable("armor.gtceu.nms.nightvision.error"), true); } else { player.displayClientMessage(Component - .translatable("armor.gtceu.nms.nightvision." + (nightVision ? "enabled" : "disabled")), true); + .translatable("armor.gtceu.nms.nightvision." + (nightVision ? "enabled" : "disabled")), + true); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/QuarkTechSuite.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/QuarkTechSuite.java index 3081ad9d235..fc9d9920a0c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/QuarkTechSuite.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/QuarkTechSuite.java @@ -99,7 +99,8 @@ public void onArmorTick(Level world, Player player, ItemStack itemStack) { player.displayClientMessage(Component.translatable("armor.gtceu.nms.nightvision.error"), true); } else { player.displayClientMessage(Component - .translatable("armor.gtceu.nms.nightvision." + (nightVision ? "enabled" : "disabled")), true); + .translatable("armor.gtceu.nms.nightvision." + (nightVision ? "enabled" : "disabled")), + true); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/BlockRotatingBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/BlockRotatingBehavior.java index df33c4c90df..f7902035934 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/BlockRotatingBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/BlockRotatingBehavior.java @@ -80,7 +80,7 @@ public InteractionResult onItemUseFirst(ItemStack stack, UseOnContext context) { @Override public void addInformation(@NotNull ItemStack stack, @Nullable Level world, @NotNull List tooltip, @NotNull TooltipFlag flag) { - tooltip.add(Component.translatable("item.gtceu.tool.behavior.block_rotation")); + tooltip.add(Component.translatable("tool.gtceu.behavior.block_rotation")); } public static BlockHitResult retraceBlock(BlockGetter level, Player player, BlockPos pos) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/DisableShieldBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/DisableShieldBehavior.java index acfe15fe542..e4a242cf3e7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/DisableShieldBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/DisableShieldBehavior.java @@ -34,6 +34,6 @@ public void addBehaviorNBT(@NotNull ItemStack stack, @NotNull CompoundTag tag) { @Override public void addInformation(@NotNull ItemStack stack, @Nullable Level world, @NotNull List tooltip, @NotNull TooltipFlag flag) { - tooltip.add(Component.translatable("item.gtceu.tool.behavior.shield_disable")); + tooltip.add(Component.translatable("tool.gtceu.behavior.shield_disable")); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/EntityDamageBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/EntityDamageBehavior.java index 0b38112fed9..df2bd851008 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/EntityDamageBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/EntityDamageBehavior.java @@ -74,8 +74,8 @@ private float getDamageBonus(@NotNull LivingEntity target) { public void addInformation(@NotNull ItemStack stack, @Nullable Level world, @NotNull List tooltip, @NotNull TooltipFlag flag) { if (mobType != null && !mobType.isEmpty()) { - tooltip.add(Component.translatable("item.gtceu.tool.behavior.damage_boost", - Component.translatable("item.gtceu.tool.behavior.damage_boost_" + mobType))); + tooltip.add(Component.translatable("tool.gtceu.behavior.damage_boost", + Component.translatable("tool.gtceu.behavior.damage_boost_" + mobType))); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/GrassPathBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/GrassPathBehavior.java index afe621ba97e..207aac268f6 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/GrassPathBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/GrassPathBehavior.java @@ -123,6 +123,6 @@ protected BlockState getFlattened(BlockState unFlattenedState, UseOnContext cont @Override public void addInformation(@NotNull ItemStack stack, @Nullable Level Level, @NotNull List tooltip, @NotNull TooltipFlag flag) { - tooltip.add(Component.translatable("item.gtceu.tool.behavior.grass_path")); + tooltip.add(Component.translatable("tool.gtceu.behavior.grass_path")); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/HarvestCropsBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/HarvestCropsBehavior.java index 7b5912f4a12..418f7c99473 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/HarvestCropsBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/HarvestCropsBehavior.java @@ -137,6 +137,6 @@ private static void dropListOfItems(Level world, BlockPos pos, List d @Override public void addInformation(@NotNull ItemStack stack, @Nullable Level world, @NotNull List tooltip, @NotNull TooltipFlag flag) { - tooltip.add(Component.translatable("item.gtceu.tool.behavior.crop_harvesting")); + tooltip.add(Component.translatable("tool.gtceu.behavior.crop_harvesting")); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/HarvestIceBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/HarvestIceBehavior.java index 02cf73c7413..a4c40b29322 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/HarvestIceBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/HarvestIceBehavior.java @@ -33,6 +33,6 @@ public void addBehaviorNBT(@NotNull ItemStack stack, @NotNull CompoundTag tag) { @Override public void addInformation(@NotNull ItemStack stack, @Nullable Level world, @NotNull List tooltip, @NotNull TooltipFlag flag) { - tooltip.add(Component.translatable("item.gtceu.tool.behavior.silk_ice")); + tooltip.add(Component.translatable("tool.gtceu.behavior.silk_ice")); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/HoeGroundBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/HoeGroundBehavior.java index 40c6dba91dd..61de9c118de 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/HoeGroundBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/HoeGroundBehavior.java @@ -128,6 +128,6 @@ protected boolean tillGround(UseOnContext context, BlockState state) { @Override public void addInformation(@NotNull ItemStack stack, @Nullable Level world, @NotNull List tooltip, @NotNull TooltipFlag flag) { - tooltip.add(Component.translatable("item.gtceu.tool.behavior.ground_tilling")); + tooltip.add(Component.translatable("tool.gtceu.behavior.ground_tilling")); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/LogStripBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/LogStripBehavior.java index b0b4fef9c48..2fa8ed0f034 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/LogStripBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/LogStripBehavior.java @@ -114,6 +114,6 @@ protected BlockState getStripped(BlockState unscrapedState, UseOnContext context @Override public void addInformation(@NotNull ItemStack stack, @Nullable Level Level, @NotNull List tooltip, @NotNull TooltipFlag flag) { - tooltip.add(Component.translatable("item.gtceu.tool.behavior.strip_log")); + tooltip.add(Component.translatable("tool.gtceu.behavior.strip_log")); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/PlungerBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/PlungerBehavior.java index 154473063f9..a8778680da4 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/PlungerBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/PlungerBehavior.java @@ -74,7 +74,7 @@ public InteractionResult onItemUseFirst(ItemStack stack, UseOnContext context) { @Override public void addInformation(@NotNull ItemStack stack, @Nullable Level world, @NotNull List tooltip, @NotNull TooltipFlag flag) { - tooltip.add(Component.translatable("item.gtceu.tool.behavior.plunger")); + tooltip.add(Component.translatable("tool.gtceu.behavior.plunger")); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/RotateRailBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/RotateRailBehavior.java index db2576decf8..8585bc1d8f7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/RotateRailBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/RotateRailBehavior.java @@ -44,6 +44,6 @@ public InteractionResult onItemUseFirst(ItemStack stack, UseOnContext context) { @Override public void addInformation(@NotNull ItemStack stack, @Nullable Level world, @NotNull List tooltip, @NotNull TooltipFlag flag) { - tooltip.add(Component.translatable("item.gtceu.tool.behavior.rail_rotation")); + tooltip.add(Component.translatable("tool.gtceu.behavior.rail_rotation")); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/ScrapeBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/ScrapeBehavior.java index b9002464ca6..76a4a5dfe6e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/ScrapeBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/ScrapeBehavior.java @@ -118,6 +118,6 @@ protected BlockState getScraped(BlockState unscrapedState, UseOnContext context) @Override public void addInformation(@NotNull ItemStack stack, @Nullable Level Level, @NotNull List tooltip, @NotNull TooltipFlag flag) { - tooltip.add(Component.translatable("item.gtceu.tool.behavior.scrape")); + tooltip.add(Component.translatable("tool.gtceu.behavior.scrape")); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/TorchPlaceBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/TorchPlaceBehavior.java index 773e0966f44..720fd73dd26 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/TorchPlaceBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/TorchPlaceBehavior.java @@ -124,6 +124,6 @@ public void addBehaviorNBT(@NotNull ItemStack stack, @NotNull CompoundTag tag) { @Override public void addInformation(@NotNull ItemStack stack, @Nullable Level Level, @NotNull List tooltip, @NotNull TooltipFlag flag) { - tooltip.add(Component.translatable("item.gtceu.tool.behavior.torch_place")); + tooltip.add(Component.translatable("tool.gtceu.behavior.torch_place")); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/TreeFellingBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/TreeFellingBehavior.java index eb3420fa14d..dc3deb2518b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/TreeFellingBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/TreeFellingBehavior.java @@ -42,7 +42,7 @@ public void addBehaviorNBT(ItemStack stack, CompoundTag tag) { @Override public void addInformation(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flag) { - tooltip.add(Component.translatable("item.gtceu.tool.behavior.tree_felling")); + tooltip.add(Component.translatable("tool.gtceu.behavior.tree_felling")); } @Override @@ -55,7 +55,7 @@ public void addInformation(ItemStack stack, @Nullable Level level, List tooltip, @NotNull TooltipFlag flag) { - tooltip.add(Component.translatable("item.gtceu.tool.behavior.remove_wax")); + tooltip.add(Component.translatable("tool.gtceu.behavior.remove_wax")); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java index d1ef73b5df4..0317f2e52d6 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java @@ -19,7 +19,7 @@ import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -394,7 +394,7 @@ protected static EditableUI createBatterySlot() slotWidget.setHandlerSlot(machine.chargerInventory, 0); slotWidget.setCanPutItems(true); slotWidget.setCanTakeItems(true); - slotWidget.setHoverTooltips(LangHandler.getMultiLang("gtceu.gui.charger_slot.tooltip", + slotWidget.setHoverTooltips(LangUtil.getMultiLang("gtceu.gui.charger_slot.tooltip", GTValues.VNF[machine.getTier()], GTValues.VNF[machine.getTier()]).toArray(new MutableComponent[0])); }); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java index 270ae10eb4f..11e77582e72 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java @@ -20,7 +20,7 @@ import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.lowdragmc.lowdraglib.gui.texture.ItemStackTexture; @@ -422,7 +422,7 @@ protected static EditableUI createBatterySlot() { slotWidget.setHandlerSlot(machine.chargerInventory, 0); slotWidget.setCanPutItems(true); slotWidget.setCanTakeItems(true); - slotWidget.setHoverTooltips(LangHandler.getMultiLang("gtceu.gui.charger_slot.tooltip", + slotWidget.setHoverTooltips(LangUtil.getMultiLang("gtceu.gui.charger_slot.tooltip", GTValues.VNF[machine.getTier()], GTValues.VNF[machine.getTier()]).toArray(new MutableComponent[0])); }); } @@ -436,7 +436,7 @@ protected static EditableUI createJunkButton( }, (toggleButtonWidget, machine) -> { toggleButtonWidget.setSupplier(machine::isJunkEnabled); toggleButtonWidget.setOnPressCallback((data, bool) -> machine.setJunkEnabled(bool)); - toggleButtonWidget.setHoverTooltips(LangHandler.getMultiLang("gtceu.gui.fisher_mode.tooltip", + toggleButtonWidget.setHoverTooltips(LangUtil.getMultiLang("gtceu.gui.fisher_mode.tooltip", GTValues.VNF[machine.getTier()], GTValues.VNF[machine.getTier()]).toArray(new MutableComponent[0])); }); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java index 0296184879d..af08394da38 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java @@ -22,7 +22,7 @@ import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -445,7 +445,7 @@ protected static EditableUI createBatterySlot( slotWidget.setHandlerSlot(machine.chargerInventory, 0); slotWidget.setCanPutItems(true); slotWidget.setCanTakeItems(true); - slotWidget.setHoverTooltips(LangHandler.getMultiLang("gtceu.gui.charger_slot.tooltip", + slotWidget.setHoverTooltips(LangUtil.getMultiLang("gtceu.gui.charger_slot.tooltip", GTValues.VNF[machine.getTier()], GTValues.VNF[machine.getTier()]).toArray(new MutableComponent[0])); }); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java index 933badb3058..9f95d20535d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java @@ -23,7 +23,7 @@ import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; import com.gregtechceu.gtceu.common.machine.trait.miner.MinerLogic; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.lowdragmc.lowdraglib.gui.widget.ComponentPanelWidget; @@ -333,7 +333,7 @@ protected static EditableUI createBatterySlot() { slotWidget.setHandlerSlot(machine.chargerInventory, 0); slotWidget.setCanPutItems(true); slotWidget.setCanTakeItems(true); - slotWidget.setHoverTooltips(LangHandler.getMultiLang("gtceu.gui.charger_slot.tooltip", + slotWidget.setHoverTooltips(LangUtil.getMultiLang("gtceu.gui.charger_slot.tooltip", GTValues.VNF[machine.getTier()], GTValues.VNF[machine.getTier()]).toArray(new MutableComponent[0])); }); } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/top/ConfigMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/top/ConfigMixin.java index 6ebebeae66f..8e0a25ac255 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/top/ConfigMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/top/ConfigMixin.java @@ -38,7 +38,7 @@ public class ConfigMixin { for (GTToolType type : GTToolType.getTypes().values()) { for (TagKey tag : type.itemTags) { if (!tooltypeTagsSet.containsKey(tag.location())) tooltypeTagsSet.put(tag.location(), - Component.translatable("gtceu.tool.class." + type.name).getString()); + Component.translatable("tool.gtceu.class." + type.name).getString()); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java index d7bbee87f4a..bbe5db03da5 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java @@ -5,9 +5,14 @@ import static com.gregtechceu.gtceu.data.lang.LangUtil.*; public class ArmorLang { - public static void generateArmorKeys(RegistrateLangProvider provider) { + public static void init(RegistrateLangProvider provider) { + generateArmorKeys(provider); + generateTooltipKeys(provider); + generateHudKeys(provider); + } + private static void generateArmorKeys(RegistrateLangProvider provider) { // nanomuscle suit provider.add("armor.gtceu.nms.nightvision.enabled", "NanoMuscle™ Suite: NightVision Enabled"); provider.add("armor.gtceu.nms.nightvision.disabled", "NanoMuscle™ Suite: NightVision Disabled"); @@ -18,7 +23,6 @@ public static void generateArmorKeys(RegistrateLangProvider provider) { provider.add("armor.gtceu.nms.charge.disable", "NanoMuscle™ Suite: Charging Disabled"); provider.add("armor.gtceu.nms.charge.error", "NanoMuscle™ Suite: §cNot enough power for charging!"); - // quantum suit provider.add("armor.gtceu.qts.nightvision.enabled", "QuarkTech™ Suite: NightVision Enabled"); provider.add("armor.gtceu.qts.nightvision.disabled", "QuarkTech™ Suite: NightVision Disabled"); @@ -27,25 +31,20 @@ public static void generateArmorKeys(RegistrateLangProvider provider) { provider.add("armor.gtceu.qts.charge.disable", "QuarkTech™ Suite: Charging Disabled"); provider.add("armor.gtceu.qts.charge.error", "QuarkTech™ Suite: §cNot enough power for charging!"); - - //jetpacks + // jetpacks provider.add("armor.gtceu.jetpack.flight.enable", "Jetpack: Flight Enabled"); provider.add("armor.gtceu.jetpack.flight.disable", "Jetpack: Flight Disabled"); provider.add("armor.gtceu.jetpack.hover.enable", "Jetpack: Hover Mode Enabled"); provider.add("armor.gtceu.jetpack.hover.disable", "Jetpack: Hover Mode Disabled"); provider.add("armor.gtceu.jetpack.emergency_hover_mode", "Emergency Hover Mode Enabled!"); - - //action bar messages + // action bar messages provider.add("armor.gtceu.message.nightvision.enabled", "§bNightVision: §aOn"); provider.add("armor.gtceu.message.nightvision.disabled", "§bNightVision: §cOff"); provider.add("armor.gtceu.message.nightvision.error", "§cNot enough power!"); + } - - } - - public static void generateTooltipKeys(RegistrateLangProvider provider){ - + private static void generateTooltipKeys(RegistrateLangProvider provider) { provider.add("item.liquid_fuel_jetpack.tooltip", "Uses Combustion Generator Fuels for Thrust"); // basic ability tooltips @@ -59,8 +58,7 @@ public static void generateTooltipKeys(RegistrateLangProvider provider){ provider.add("armor.gtceu.tooltip.breath", "Replenishes Underwater Breath Bar"); provider.add("armor.gtceu.tooltip.autoeat", "Replenishes Food Bar by Using Food from Inventory"); - - //energy tooltips (iaddinfo) + // energy tooltips (iaddinfo) provider.add("armor.gtceu.energy_share.error", "Energy Supply: §cNot enough power for gadgets charging!"); provider.add("armor.gtceu.energy_share.enable", "Energy Supply: Gadgets charging enabled"); provider.add("armor.gtceu.energy_share.disable", "Energy Supply: Gadgets charging disabled"); @@ -69,8 +67,7 @@ public static void generateTooltipKeys(RegistrateLangProvider provider){ "To change mode shift-right click when holding item"); } - public static void generateHudKeys(RegistrateLangProvider provider){ - + private static void generateHudKeys(RegistrateLangProvider provider) { provider.add("armor.gtceu.hud.status.enabled", "§aON"); provider.add("armor.gtceu.hud.status.disabled", "§cOFF"); provider.add("armor.gtceu.hud.energy_lvl", "Energy Level: %s"); @@ -79,6 +76,5 @@ public static void generateHudKeys(RegistrateLangProvider provider){ provider.add("armor.gtceu.hud.hover_mode", "Hover Mode: %s"); provider.add("mataarmor.hud.supply_mode", "Supply Mode: %s"); provider.add("armor.gtceu.hud.gravi_engine", "GraviEngine: %s"); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java index 4dede38b944..1d271104390 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.data.lang; import com.gregtechceu.gtceu.common.data.GTBlocks; + import com.tterrag.registrate.providers.RegistrateLangProvider; import static com.gregtechceu.gtceu.data.lang.LangUtil.*; @@ -8,10 +9,11 @@ public class BlockLang { public static void init(RegistrateLangProvider provider) { - initCasingLang(provider); + generateBlockKeys(provider); + generatePipeKeys(provider); } - private static void initCasingLang(RegistrateLangProvider provider) { + private static void generateBlockKeys(RegistrateLangProvider provider) { provider.add("block.gtceu.lamp.tooltip.inverted", "Inverted"); provider.add("block.gtceu.lamp.tooltip.no_bloom", "No Bloom"); provider.add("block.gtceu.lamp.tooltip.no_light", "No Light"); @@ -108,17 +110,15 @@ private static void initCasingLang(RegistrateLangProvider provider) { replace(provider, GTBlocks.BATTERY_EMPTY_TIER_III.get().getDescriptionId(), "Empty Tier III Capacitor"); replace(provider, GTBlocks.BATTERY_LAPOTRONIC_UV.get().getDescriptionId(), "UV Lapotronic Capacitor"); replace(provider, GTBlocks.BATTERY_ULTIMATE_UHV.get().getDescriptionId(), "UHV Ultimate Capacitor"); - - } - public static void generatePipeKeys(RegistrateLangProvider provider){ - //cable + + private static void generatePipeKeys(RegistrateLangProvider provider) { + // cable provider.add("gtceu.cable.voltage", "§aMax Voltage:§r §a%d §a(%s§a)"); provider.add("gtceu.cable.amperage", "§eMax Amperage:§r §e%d"); provider.add("gtceu.cable.loss_per_block", "§cLoss/Meter/Ampere:§r §c%d§7 EU-Volt"); provider.add("gtceu.cable.superconductor", "%s §dSuperconductor"); - provider.add("gtceu.fluid_pipe.capacity", "§9Capacity: §f%d mB"); provider.add("gtceu.fluid_pipe.max_temperature", "§cTemperature Limit: §f%d K"); provider.add("gtceu.fluid_pipe.channels", "§eChannels: §f%d"); @@ -129,86 +129,5 @@ public static void generatePipeKeys(RegistrateLangProvider provider){ provider.add("gtceu.fluid_pipe.not_gas_proof", "§4Gases may leak!"); provider.add("gtceu.item_pipe.priority", "§9Priority: §f%d"); provider.add("gtceu.duct_pipe.transfer_rate", "§bAir transfer rate: %s"); - - } - - public static void generateMultibockKeys(RegistrateLangProvider provider){ - - provider.add("gtceu.multiblock.work_paused", "Work Paused."); - provider.add("gtceu.multiblock.running", "Running perfectly."); - provider.add("gtceu.multiblock.idling", "§6Idling."); - provider.add("gtceu.multiblock.research_station.researching", "§6Researching."); - provider.add("gtceu.multiblock.not_enough_energy", "WARNING: Machine needs more energy."); - provider.add("gtceu.multiblock.not_enough_energy_output", "WARNING: Energy Dynamo Tier Too Low!"); - provider.add("gtceu.multiblock.waiting", "WARNING: Machine is waiting."); - provider.add("gtceu.multiblock.progress_percent", "Progress: %s%%"); - provider.add("gtceu.multiblock.progress", "Progress: %ss / %ss (%s%%)"); - provider.add("gtceu.multiblock.output_line.0", "%s x §e%s§r (%ss/ea)"); - provider.add("gtceu.multiblock.output_line.1", "%s x §e%s§r (%s/s)"); - provider.add("gtceu.multiblock.output_line.2", "%s ≈ §e%s§r (%ss/ea)"); - provider.add("gtceu.multiblock.output_line.3", "%s ≈ §e%s§r (%s/s)"); - provider.add("gtceu.multiblock.invalid_structure", "Invalid structure."); - provider.add("gtceu.multiblock.invalid_structure.tooltip", - "This block is a controller of the multiblock structure. For building help, see structure template in JEI."); - provider.add("gtceu.multiblock.validation_failed", "Invalid amount of inputs/outputs."); - provider.add("gtceu.multiblock.max_recipe_tier", "Max Recipe Tier: %s"); - provider.add("gtceu.multiblock.max_recipe_tier_hover", "The maximum tier of recipes that can be run"); - provider.add("gtceu.multiblock.max_energy_per_tick", "Max EU/t: §a%s (%s§r)"); - provider.add("gtceu.multiblock.max_energy_per_tick_hover", - "The maximum EU/t available for running recipes or overclocking"); - provider.add("gtceu.multiblock.max_energy_per_tick_amps", "Max EU/t: %s (%sA %s)"); - provider.add("gtceu.multiblock.energy_consumption", "Energy Usage: %s EU/t (%s)"); - provider.add("gtceu.multiblock.generation_eu", "Outputting: §a%s EU/t"); - provider.add("gtceu.multiblock.universal.no_problems", "No Maintenance Problems!"); - provider.add("gtceu.multiblock.universal.has_problems", "Has Maintenance Problems!"); - provider.add("gtceu.multiblock.universal.has_problems_header", - "Fix the following issues in a Maintenance Hatch:"); - provider.add("gtceu.multiblock.universal.problem.wrench", "§7Pipe is loose. (§aWrench§7)"); - provider.add("gtceu.multiblock.universal.problem.screwdriver", "§7Screws are loose. (§aScrewdriver§7)"); - provider.add("gtceu.multiblock.universal.problem.soft_mallet", "§7Something is stuck. (§aSoft Mallet§7)"); - provider.add("gtceu.multiblock.universal.problem.hard_hammer", "§7Plating is dented. (§aHard Hammer§7)"); - provider.add("gtceu.multiblock.universal.problem.wire_cutter", "§7Wires burned out. (§aWire Cutter§7)"); - provider.add("gtceu.multiblock.universal.problem.crowbar", "§7That doesn't belong there. (§aCrowbar§7)"); - provider.add("gtceu.multiblock.universal.muffler_obstructed", "Muffler Hatch is Obstructed!"); - provider.add("gtceu.multiblock.universal.muffler_obstructed.tooltip", - "Muffler Hatch must have a block of airspace in front of it."); - provider.add("gtceu.multiblock.universal.rotor_obstructed", "Rotor is Obstructed!"); - provider.add("gtceu.multiblock.universal.distinct", "Distinct Buses:"); - provider.add("gtceu.multiblock.universal.distinct.no", "No"); - provider.add("gtceu.multiblock.universal.distinct.yes", "Yes"); - provider.add("gtceu.multiblock.universal.distinct.info", - "If enabled, each Item Input Bus will be treated as fully distinct from each other for recipe lookup. Useful for things like Programmed Circuits, Extruder Shapes, etc."); - provider.add("gtceu.multiblock.parallel", "Performing up to %d Recipes in Parallel"); - provider.add("gtceu.multiblock.parallel.exact", "Performing %d Recipes in Parallel"); - provider.add("gtceu.multiblock.multiple_recipemaps.header", "Machine Mode:"); - provider.add("gtceu.multiblock.multiple_recipemaps.tooltip", - "Screwdriver the controller to change which machine mode to use."); - provider.add("gtceu.multiblock.multiple_recipemaps_recipes.tooltip", "Machine Modes: §e%s§r"); - provider.add("gtceu.multiblock.multiple_recipemaps.switch_message", - "The machine must be off to switch modes!"); - provider.add("gtceu.multiblock.preview.zoom", "Use mousewheel or right-click + drag to zoom"); - provider.add("gtceu.multiblock.preview.rotate", "Click and drag to rotate"); - provider.add("gtceu.multiblock.preview.select", "Right-click to check candidates"); - provider.add("gtceu.multiblock.pattern.error", "Expected components (%s) at (%s)."); - provider.add("gtceu.multiblock.pattern.error.limited_exact", "§cExactly: %d§r"); - provider.add("gtceu.multiblock.pattern.error.limited_within", "§cBetween %d and %d§r"); - multiLang(provider, "gtceu.multiblock.pattern.error.limited", "§cMaximum: %d§r", "§cMinimum: %d§r", - "§cMaximum: %d per layer§r", "§cMinimum: %d per layer§r"); - provider.add("gtceu.multiblock.pattern.error.coils", "§cAll heating coils must be the same§r"); - provider.add("gtceu.multiblock.pattern.error.filters", "§cAll filters must be the same§r"); - provider.add("gtceu.multiblock.pattern.error.batteries", "§cAll batteries must be the same§r"); - provider.add("gtceu.multiblock.pattern.clear_amount_1", "§6Must have a clear 1x1x1 space in front§r"); - provider.add("gtceu.multiblock.pattern.clear_amount_3", "§6Must have a clear 3x3x1 space in front§r"); - provider.add("gtceu.multiblock.pattern.single", "§6Only this block can be used§r"); - provider.add("gtceu.multiblock.pattern.location_end", "§cVery End§r"); - provider.add("gtceu.multiblock.pattern.replaceable_air", "Replaceable by Air"); - - provider.add("gtceu.multiblock.computation.max", "Max CWU/t: %s"); - provider.add("gtceu.multiblock.computation.usage", "Using: %s"); - provider.add("gtceu.multiblock.computation.non_bridging", "Non-bridging connection found"); - provider.add("gtceu.multiblock.computation.non_bridging.detailed", - "A Reception Hatch is linked to a machine which cannot bridge"); - provider.add("gtceu.multiblock.computation.not_enough_computation", "Machine needs more computation!"); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java index 9922bb969b4..16d06a6097a 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java @@ -5,7 +5,12 @@ import static com.gregtechceu.gtceu.data.lang.LangUtil.*; public class CommandLang { - public static void generateCommandLang(RegistrateLangProvider provider){ + + public static void init(RegistrateLangProvider provider) { + generateCommandLang(provider); + } + + private static void generateCommandLang(RegistrateLangProvider provider) { provider.add("command.gtceu.dump_data.success", "Dumped %s resources from registry %s to %s"); provider.add("command.gtceu.place_vein.failure", "Failed to place vein %s at position %s"); provider.add("command.gtceu.place_vein.success", "Placed vein %s at position %s"); @@ -16,5 +21,36 @@ public static void generateCommandLang(RegistrateLangProvider provider){ provider.add("command.gtceu.medical_condition.get.element.permanent", "Condition %s§r: %s minutes %s seconds (permanent)"); + provider.add("command.gtceu.usage", "Usage: /gtceu "); + provider.add("command.gtceu.worldgen.usage", "Usage: /gtceu worldgen "); + provider.add("command.gtceu.worldgen.reload.usage", "Usage: /gtceu worldgen reload"); + provider.add("command.gtceu.worldgen.reload.success", "Worldgen successfully reloaded from config."); + provider.add("command.gtceu.worldgen.reload.failed", + "Worldgen reload failed. Check console for errors."); + provider.add("command.gtceu.hand.groovy", "Consider using §6/gs hand"); + provider.add("command.gtceu.hand.usage", "Usage: /gtceu hand"); + provider.add("command.gtceu.hand.item_id", "Item: %s (Metadata: %d)"); + provider.add("command.gtceu.hand.electric", "Electric Info: %d / %d EU - Tier: %d; Is Battery: %s"); + provider.add("command.gtceu.hand.fluid", "Fluid Info: %d / %d mB; Can Fill: %s; Can Drain: %s"); + provider.add("command.gtceu.hand.fluid2", "Fluid Id:"); + provider.add("command.gtceu.hand.material", "Material Id:"); + provider.add("command.gtceu.hand.ore_prefix", "Ore prefix:"); + provider.add("command.gtceu.hand.meta_item", "MetaItem Id:"); + provider.add("command.gtceu.hand.tag_entries", "§3Tag entries:"); + provider.add("command.gtceu.hand.tool_stats", "Tool Stats Class: %s"); + provider.add("command.gtceu.hand.not_a_player", "This command is only usable by a player."); + provider.add("command.gtceu.hand.no_item", + "You must hold something in main hand or off hand before executing this command."); + provider.add("command.gtceu.recipecheck.usage", "Usage: /gtceu recipecheck"); + provider.add("command.gtceu.recipecheck.begin", "Starting recipe conflict check..."); + provider.add("command.gtceu.recipecheck.end", + "Recipe conflict check found %d possible conflicts. Check the server log for more info"); + provider.add("command.gtceu.recipecheck.end_no_conflicts", "No recipe conflicts found!"); + provider.add("command.gtceu.copy.copied_and_click", "copied to clipboard. Click to copy again"); + provider.add("command.gtceu.copy.click_to_copy", "Click to copy"); + provider.add("command.gtceu.copy.copied_start", "Copied ["); + provider.add("command.gtceu.copy.copied_end", "] to the clipboard"); + provider.add("gtceu.chat.cape", + "§5Congrats: you just unlocked a new cape! See the Cape Selector terminal app to use it.§r"); } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java index bb5c1f68350..12f759d9024 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.config.ConfigHolder; -import static com.gregtechceu.gtceu.data.lang.LangUtil.*; import com.tterrag.registrate.providers.RegistrateLangProvider; import dev.toma.configuration.Configuration; @@ -14,6 +13,8 @@ import java.util.Map; import java.util.Set; +import static com.gregtechceu.gtceu.data.lang.LangUtil.*; + public class ConfigurationLang { public static void init(RegistrateLangProvider provider) { diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/CoverLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/CoverLang.java index 5de224b870a..ca284712fb0 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/CoverLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/CoverLang.java @@ -5,8 +5,12 @@ import static com.gregtechceu.gtceu.data.lang.LangUtil.*; public class CoverLang { - public static void generateCoverKeys(RegistrateLangProvider provider){ + public static void init(RegistrateLangProvider provider) { + generateCoverKeys(provider); + } + + private static void generateCoverKeys(RegistrateLangProvider provider) { provider.add("cover.filter.blacklist.disabled", "Whitelist"); provider.add("cover.filter.blacklist.enabled", "Blacklist"); provider.add("cover.tag_filter.title", "Tag Filter"); @@ -181,7 +185,5 @@ public static void generateCoverKeys(RegistrateLangProvider provider){ provider.add("cover.advanced_item_detector.min", "Min Items"); provider.add("cover.shutter.message.enabled", "Closed shutter"); provider.add("cover.shutter.message.disabled", "Opened shutter"); - - } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java index 0ee3f6fa0f9..3a20adcbdfd 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java @@ -1,11 +1,16 @@ package com.gregtechceu.gtceu.data.lang; import com.tterrag.registrate.providers.RegistrateLangProvider; + import static com.gregtechceu.gtceu.data.lang.LangUtil.*; public class HazardLang { - public static void generateHazardKeys(RegistrateLangProvider provider){ + public static void init(RegistrateLangProvider provider) { + generateHazardKeys(provider); + } + + private static void generateHazardKeys(RegistrateLangProvider provider) { provider.add("gtceu.medical_condition.description", "§l§cHAZARDOUS §7Hold Shift to show details"); provider.add("gtceu.medical_condition.description_shift", "§l§cHAZARDOUS:"); provider.add("gtceu.medical_condition.chemical_burns", "§5Chemical burns"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java index bdc514cbbf8..db4d0f8079a 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java @@ -5,10 +5,11 @@ import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.common.data.GTBedrockFluids; import com.gregtechceu.gtceu.common.data.GTOres; -import static com.gregtechceu.gtceu.data.lang.LangUtil.*; import com.tterrag.registrate.providers.RegistrateLangProvider; +import static com.gregtechceu.gtceu.data.lang.LangUtil.*; + public class IntegrationLang { public static void init(RegistrateLangProvider provider) { diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java index 19f42898573..77ed2096d96 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java @@ -15,8 +15,8 @@ public static void init(RegistrateLangProvider provider) { initGeneratedNames(provider); initItemNames(provider); initItemTooltips(provider); + generateBehaviorKeys(provider); provider.add("item.invalid.name", "Invalid item"); - } private static void initGeneratedNames(RegistrateLangProvider provider) { @@ -501,12 +501,9 @@ private static void initItemTooltips(RegistrateLangProvider provider) { provider.add("item.gtceu.uxv_voltage_coil.tooltip", "Epic Coil"); provider.add("item.gtceu.opv_voltage_coil.tooltip", "Legendary Coil"); provider.add("item.gtceu.max_voltage_coil.tooltip", "Maximum Coil"); - - - } - public static void generateBehaviorKeys(RegistrateLangProvider provider){ + public static void generateBehaviorKeys(RegistrateLangProvider provider) { provider.add("behaviour.hoe", "Can till dirt"); provider.add("behaviour.soft_hammer", "Activates and Deactivates Machines"); provider.add("behaviour.soft_hammer.enabled", "Working Enabled"); @@ -613,6 +610,5 @@ public static void generateBehaviorKeys(RegistrateLangProvider provider){ provider.add("behavior.portable_scanner.mode.show_electrical_info", "Show electrical info"); provider.add("behavior.portable_scanner.mode.show_recipe_info", "Show recipe info"); provider.add("behavior.portable_scanner.mode.show_environmental_info", "Show environmental info"); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java index 2fc7f7b8152..0a2d5e394a2 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -1,34 +1,45 @@ package com.gregtechceu.gtceu.data.lang; + import com.tterrag.registrate.providers.RegistrateLangProvider; + import static com.gregtechceu.gtceu.data.lang.LangUtil.*; public class LangHandler { /** * - Unformatted text must be in light gray - §7 - Items must be in gold - §6 - Fluids must be in blue - §9 - Directions must be in yellow - §e - Disabled/Inactive must be in red - §c - Enabled/Active must be in green - §a - Potion effects must be in yellow - §e - Time must be in red - §c - Percentages must be in green - §a - Keys must be in all caps - Key combos must follow the format KEY1 + KEY2 (for example, SHIFT + R-CLICK) - + * Unformatted text must be in light gray - §7 + * Items must be in gold - §6 + * Fluids must be in blue - §9 + * Directions must be in yellow - §e + * Disabled/Inactive must be in red - §c + * Enabled/Active must be in green - §a + * Potion effects must be in yellow - §e + * Time must be in red - §c + * Percentages must be in green - §a + * Keys must be in all caps + * Key combos must follow the format KEY1 + KEY2 (for example, SHIFT + R-CLICK) + * * @param provider */ public static void init(RegistrateLangProvider provider) { AdvancementLang.init(provider); + ArmorLang.init(provider); BlockLang.init(provider); + CommandLang.init(provider); + ConfigurationLang.init(provider); + CoverLang.init(provider); + HazardLang.init(provider); IntegrationLang.init(provider); ItemLang.init(provider); MachineLang.init(provider); + MaterialLang.init(provider); + RecipeLang.init(provider); + SubtitleLang.init(provider); ToolLang.init(provider); - ConfigurationLang.init(provider); + + generateTooltipKeys(provider); provider.add("gtceu.gui.editor.tips.citation", "Number of citations"); provider.add("gtceu.gui.editor.group.recipe_type", "cap"); @@ -50,8 +61,6 @@ public static void init(RegistrateLangProvider provider) { "Right click to decrease the OC", "Middle click to reset the OC", "Hold Shift to change by Perfect OC"); - - provider.add("gtceu.multiblock.page_switcher.io.import", "§2Inputs"); provider.add("gtceu.multiblock.page_switcher.io.export", "§4Outputs"); provider.add("gtceu.multiblock.page_switcher.io.both", "§5Combined Inputs + Outputs"); @@ -59,7 +68,7 @@ public static void init(RegistrateLangProvider provider) { provider.add("enchantment.disjunction", "Disjunction"); provider.add("fluid.empty", "Empty"); - provider.add("item.generic.fluid_container.tooltip", "%d/%dL %s"); + provider.add("item.generic.fluid_container.tooltip", "%d/%dL %s"); provider.add("item.generic.electric_item.tooltip", "%d/%d EU - Tier %s"); provider.add("item.generic.electric_item.stored", "%d/%d EU (%s)"); provider.add("item.electric.discharge_mode.enabled", "§eDischarge Mode Enabled"); @@ -78,7 +87,6 @@ public static void init(RegistrateLangProvider provider) { provider.add("item.gtceu.tool.replace_tool_head", "Craft with a new Tool Head to replace it"); provider.add("item.gtceu.tool.usable_as", "§8Usable as: §f%s"); - provider.add("item.gtceu.tool.aoe.rows", "Rows"); provider.add("item.gtceu.tool.aoe.columns", "Columns"); provider.add("item.gtceu.tool.aoe.layers", "Layers"); @@ -92,7 +100,6 @@ public static void init(RegistrateLangProvider provider) { provider.add("item.tool.tooltip.rotor.efficiency", "Turbine Efficiency: §9%d%%"); provider.add("item.tool.tooltip.rotor.power", "Turbine Power: §9%d%%"); - provider.add("item.record.sus.tooltip", "§7Leonz - Among Us Drip"); provider.add("item.gtceu.nan_certificate.tooltip", "Challenge Accepted!"); provider.add("item.gtceu.blacklight.tooltip", "Long-Wave §dUltraviolet§7 light source"); @@ -104,8 +111,6 @@ public static void init(RegistrateLangProvider provider) { replace(provider, "item.gtceu.bucket", "%s Bucket"); - - provider.add("item.netherrack_nether_quartz", "Nether Quartz Ore"); provider.add("block.surface_rock", "%s Surface Rock"); @@ -139,7 +144,6 @@ public static void init(RegistrateLangProvider provider) { provider.add("item.cover.digital.tooltip", "Connects machines over §fPower Cables§7 to the §fCentral Monitor§7 as §fCover§7."); - provider.add("gtceu.machine.drum.enable_output", "Will drain Fluid to downward adjacent Tanks"); provider.add("gtceu.machine.drum.disable_output", "Will not drain Fluid"); provider.add("gtceu.machine.locked_safe.malfunctioning", "§cMalfunctioning!"); @@ -180,7 +184,7 @@ public static void init(RegistrateLangProvider provider) { provider.add("item.cover.digital.mode.fluid.disabled", "Click to enable Fluid Mode"); provider.add("item.cover.digital.mode.fluid.enabled", "Fluid Mode enabled"); - //todo: own method (gui/tooltip/???) + // todo: own method (gui/tooltip/???) provider.add("gtceu.part_sharing.disabled", "Multiblock Sharing §4Disabled"); provider.add("gtceu.part_sharing.enabled", "Multiblock Sharing §aEnabled"); provider.add("gtceu.universal.liters", "%s mB"); @@ -317,8 +321,6 @@ public static void init(RegistrateLangProvider provider) { provider.add("gtceu.item_filter.empty_item", "Empty (No Item)"); provider.add("gtceu.item_filter.footer", "§eClick with item to override"); - provider.add("gtceu.chat.cape", - "§5Congrats: you just unlocked a new cape! See the Cape Selector terminal app to use it.§r"); provider.add("gtceu.universal.clear_nbt_recipe.tooltip", "§cThis will destroy all contents!"); provider.add("gtceu.cover.energy_detector.message_electricity_storage_normal", "Monitoring Normal Electricity Storage"); @@ -475,14 +477,11 @@ public static void init(RegistrateLangProvider provider) { provider.add("gtceu.tooltip.status.trinary.unknown", "Unknown"); } - - public static void generateTooltipKeys(RegistrateLangProvider provider){ + public static void generateTooltipKeys(RegistrateLangProvider provider) { provider.add("gtceu.tooltip.hold_shift", "§7Hold SHIFT for more info"); provider.add("gtceu.tooltip.hold_ctrl", "§7Hold CTRL for more info"); provider.add("gtceu.tooltip.fluid_pipe_hold_shift", "§7Hold SHIFT to show Fluid Containment Info"); provider.add("gtceu.tooltip.tool_fluid_hold_shift", "§7Hold SHIFT to show Fluid Containment and Tool Info"); - } - } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangUtil.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangUtil.java index b0198263c7d..3dd1e295790 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangUtil.java @@ -1,10 +1,11 @@ package com.gregtechceu.gtceu.data.lang; -import com.tterrag.registrate.providers.RegistrateLangProvider; import net.minecraft.locale.Language; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraftforge.common.data.LanguageProvider; + +import com.tterrag.registrate.providers.RegistrateLangProvider; import org.jetbrains.annotations.NotNull; import java.lang.reflect.Field; diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java index b285b7a6781..4cca1b5f4fb 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java @@ -7,6 +7,8 @@ public class MachineLang { protected static void init(RegistrateLangProvider provider) { + generateMultiblockKeys(provider); + // Custom machine names replace(provider, "block.gtceu.steam_large_turbine", "Large Steam Turbine"); replace(provider, "block.gtceu.gas_large_turbine", "Large Gas Turbine"); @@ -987,4 +989,82 @@ public static void standardTooltips(RegistrateLangProvider provider, String root provider.add("%s.%s_%s.tooltip".formatted(root, "zpm", machine), "§7%s".formatted(midTier)); provider.add("%s.%s_%s.tooltip".formatted(root, "uv", machine), "§7%s".formatted(highTier)); } + + public static void generateMultiblockKeys(RegistrateLangProvider provider) { + provider.add("gtceu.multiblock.work_paused", "Work Paused."); + provider.add("gtceu.multiblock.running", "Running perfectly."); + provider.add("gtceu.multiblock.idling", "§6Idling."); + provider.add("gtceu.multiblock.research_station.researching", "§6Researching."); + provider.add("gtceu.multiblock.not_enough_energy", "WARNING: Machine needs more energy."); + provider.add("gtceu.multiblock.not_enough_energy_output", "WARNING: Energy Dynamo Tier Too Low!"); + provider.add("gtceu.multiblock.waiting", "WARNING: Machine is waiting."); + provider.add("gtceu.multiblock.progress_percent", "Progress: %s%%"); + provider.add("gtceu.multiblock.progress", "Progress: %ss / %ss (%s%%)"); + provider.add("gtceu.multiblock.output_line.0", "%s x §e%s§r (%ss/ea)"); + provider.add("gtceu.multiblock.output_line.1", "%s x §e%s§r (%s/s)"); + provider.add("gtceu.multiblock.output_line.2", "%s ≈ §e%s§r (%ss/ea)"); + provider.add("gtceu.multiblock.output_line.3", "%s ≈ §e%s§r (%s/s)"); + provider.add("gtceu.multiblock.invalid_structure", "Invalid structure."); + provider.add("gtceu.multiblock.invalid_structure.tooltip", + "This block is a controller of the multiblock structure. For building help, see structure template in JEI."); + provider.add("gtceu.multiblock.validation_failed", "Invalid amount of inputs/outputs."); + provider.add("gtceu.multiblock.max_recipe_tier", "Max Recipe Tier: %s"); + provider.add("gtceu.multiblock.max_recipe_tier_hover", "The maximum tier of recipes that can be run"); + provider.add("gtceu.multiblock.max_energy_per_tick", "Max EU/t: §a%s (%s§r)"); + provider.add("gtceu.multiblock.max_energy_per_tick_hover", + "The maximum EU/t available for running recipes or overclocking"); + provider.add("gtceu.multiblock.max_energy_per_tick_amps", "Max EU/t: %s (%sA %s)"); + provider.add("gtceu.multiblock.energy_consumption", "Energy Usage: %s EU/t (%s)"); + provider.add("gtceu.multiblock.generation_eu", "Outputting: §a%s EU/t"); + provider.add("gtceu.multiblock.universal.no_problems", "No Maintenance Problems!"); + provider.add("gtceu.multiblock.universal.has_problems", "Has Maintenance Problems!"); + provider.add("gtceu.multiblock.universal.has_problems_header", + "Fix the following issues in a Maintenance Hatch:"); + provider.add("gtceu.multiblock.universal.problem.wrench", "§7Pipe is loose. (§aWrench§7)"); + provider.add("gtceu.multiblock.universal.problem.screwdriver", "§7Screws are loose. (§aScrewdriver§7)"); + provider.add("gtceu.multiblock.universal.problem.soft_mallet", "§7Something is stuck. (§aSoft Mallet§7)"); + provider.add("gtceu.multiblock.universal.problem.hard_hammer", "§7Plating is dented. (§aHard Hammer§7)"); + provider.add("gtceu.multiblock.universal.problem.wire_cutter", "§7Wires burned out. (§aWire Cutter§7)"); + provider.add("gtceu.multiblock.universal.problem.crowbar", "§7That doesn't belong there. (§aCrowbar§7)"); + provider.add("gtceu.multiblock.universal.muffler_obstructed", "Muffler Hatch is Obstructed!"); + provider.add("gtceu.multiblock.universal.muffler_obstructed.tooltip", + "Muffler Hatch must have a block of airspace in front of it."); + provider.add("gtceu.multiblock.universal.rotor_obstructed", "Rotor is Obstructed!"); + provider.add("gtceu.multiblock.universal.distinct", "Distinct Buses:"); + provider.add("gtceu.multiblock.universal.distinct.no", "No"); + provider.add("gtceu.multiblock.universal.distinct.yes", "Yes"); + provider.add("gtceu.multiblock.universal.distinct.info", + "If enabled, each Item Input Bus will be treated as fully distinct from each other for recipe lookup. Useful for things like Programmed Circuits, Extruder Shapes, etc."); + provider.add("gtceu.multiblock.parallel", "Performing up to %d Recipes in Parallel"); + provider.add("gtceu.multiblock.parallel.exact", "Performing %d Recipes in Parallel"); + provider.add("gtceu.multiblock.multiple_recipemaps.header", "Machine Mode:"); + provider.add("gtceu.multiblock.multiple_recipemaps.tooltip", + "Screwdriver the controller to change which machine mode to use."); + provider.add("gtceu.multiblock.multiple_recipemaps_recipes.tooltip", "Machine Modes: §e%s§r"); + provider.add("gtceu.multiblock.multiple_recipemaps.switch_message", + "The machine must be off to switch modes!"); + provider.add("gtceu.multiblock.preview.zoom", "Use mousewheel or right-click + drag to zoom"); + provider.add("gtceu.multiblock.preview.rotate", "Click and drag to rotate"); + provider.add("gtceu.multiblock.preview.select", "Right-click to check candidates"); + provider.add("gtceu.multiblock.pattern.error", "Expected components (%s) at (%s)."); + provider.add("gtceu.multiblock.pattern.error.limited_exact", "§cExactly: %d§r"); + provider.add("gtceu.multiblock.pattern.error.limited_within", "§cBetween %d and %d§r"); + multiLang(provider, "gtceu.multiblock.pattern.error.limited", "§cMaximum: %d§r", "§cMinimum: %d§r", + "§cMaximum: %d per layer§r", "§cMinimum: %d per layer§r"); + provider.add("gtceu.multiblock.pattern.error.coils", "§cAll heating coils must be the same§r"); + provider.add("gtceu.multiblock.pattern.error.filters", "§cAll filters must be the same§r"); + provider.add("gtceu.multiblock.pattern.error.batteries", "§cAll batteries must be the same§r"); + provider.add("gtceu.multiblock.pattern.clear_amount_1", "§6Must have a clear 1x1x1 space in front§r"); + provider.add("gtceu.multiblock.pattern.clear_amount_3", "§6Must have a clear 3x3x1 space in front§r"); + provider.add("gtceu.multiblock.pattern.single", "§6Only this block can be used§r"); + provider.add("gtceu.multiblock.pattern.location_end", "§cVery End§r"); + provider.add("gtceu.multiblock.pattern.replaceable_air", "Replaceable by Air"); + + provider.add("gtceu.multiblock.computation.max", "Max CWU/t: %s"); + provider.add("gtceu.multiblock.computation.usage", "Using: %s"); + provider.add("gtceu.multiblock.computation.non_bridging", "Non-bridging connection found"); + provider.add("gtceu.multiblock.computation.non_bridging.detailed", + "A Reception Hatch is linked to a machine which cannot bridge"); + provider.add("gtceu.multiblock.computation.not_enough_computation", "Machine needs more computation!"); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java index 4de09c6f472..fc8f5144e1d 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java @@ -2,8 +2,8 @@ import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.chemical.material.registry.MaterialRegistry; - import com.gregtechceu.gtceu.common.data.GTMaterials; + import com.tterrag.registrate.providers.RegistrateLangProvider; import static com.gregtechceu.gtceu.data.lang.LangUtil.*; @@ -15,8 +15,13 @@ public static void generate(RegistrateLangProvider provider, MaterialRegistry re for (Material material : registry.getAllMaterials()) provider.add(material.getUnlocalizedName(), toEnglishName(material.getName())); } - public static void generateCustomMaterialNames(RegistrateLangProvider provider ) { + public static void init(RegistrateLangProvider provider) { + generateCustomMaterialNames(provider); + generateFluidKeys(provider); + } + + private static void generateCustomMaterialNames(RegistrateLangProvider provider) { replace(provider, GTMaterials.FullersEarth.getUnlocalizedName(), "Fuller's Earth"); replace(provider, GTMaterials.Cooperite.getUnlocalizedName(), "Sheldonite"); // greg's humor is now on // 1.19... @@ -90,9 +95,9 @@ public static void generateCustomMaterialNames(RegistrateLangProvider provider ) replace(provider, GTMaterials.IncoloyMA956.getUnlocalizedName(), "Incoloy MA-956"); replace(provider, GTMaterials.Stellite100.getUnlocalizedName(), "Stellite-100"); replace(provider, GTMaterials.HastelloyC276.getUnlocalizedName(), "Hastelloy C-276"); - } - public static void generateFluidKeys(RegistrateLangProvider provider){ + + private static void generateFluidKeys(RegistrateLangProvider provider) { provider.add("gtceu.fluid.click_to_fill", "§7Click with a Fluid Container to §bfill §7the tank (Shift-click for a full stack)."); provider.add("gtceu.fluid.click_combined", @@ -100,7 +105,6 @@ public static void generateFluidKeys(RegistrateLangProvider provider){ provider.add("gtceu.fluid.click_to_empty", "§7Click with a Fluid Container to §cempty §7the tank (Shift-click for a full stack)."); - provider.add("gtceu.fluid.liquid_generic", "Liquid %s"); provider.add("gtceu.fluid.generic", "%s"); provider.add("gtceu.fluid.gas_generic", "%s Gas"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java index 00c57fc0404..3f371c9315c 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java @@ -1,12 +1,18 @@ package com.gregtechceu.gtceu.data.lang; import com.tterrag.registrate.providers.RegistrateLangProvider; + import static com.gregtechceu.gtceu.data.lang.LangUtil.*; public class RecipeLang { - public static void generateRecipeConditions(RegistrateLangProvider provider) { + public static void init(RegistrateLangProvider provider) { + generateRecipeConditions(provider); + generateRecipeDataKeys(provider); + generateMiscKeys(provider); + } + private static void generateRecipeConditions(RegistrateLangProvider provider) { provider.add("recipe.condition.thunder.tooltip", "Thunder Level: %d"); provider.add("recipe.condition.rain.tooltip", "Rain Level: %d"); provider.add("recipe.condition.dimension.tooltip", "Dimension: %s"); @@ -23,12 +29,9 @@ public static void generateRecipeConditions(RegistrateLangProvider provider) { provider.add("recipe.condition.gamestage.locked_stage", "Locked at stage: %s"); provider.add("recipe.condition.quest.completed.tooltip", "Requires %s completed"); provider.add("recipe.condition.quest.not_completed.tooltip", "Requires %s not completed"); - - - } - public static void generateRecipeDataKeys(RegistrateLangProvider provider) { + private static void generateRecipeDataKeys(RegistrateLangProvider provider) { provider.add("gtceu.recipe.total", "Total: %s EU"); provider.add("gtceu.recipe.max_eu", "Max. EU: %s EU"); provider.add("gtceu.recipe.eu", "Usage: %s EU/t"); @@ -51,10 +54,12 @@ public static void generateRecipeDataKeys(RegistrateLangProvider provider) { provider.add("gtceu.recipe.scan_for_research", "Scan for Assembly Line"); provider.add("gtceu.recipe.computation_per_tick", "Min. Computation: %s CWU/t"); provider.add("gtceu.recipe.total_computation", "Computation: %s CWU"); - } - public static void generateMiscKeys(RegistrateLangProvider provider) { - + private static void generateMiscKeys(RegistrateLangProvider provider) { + provider.add("gtceu.io.import", "Import"); + provider.add("gtceu.io.export", "Export"); + provider.add("gtceu.io.both", "Both"); + provider.add("gtceu.io.none", "None"); } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/SubtitleLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/SubtitleLang.java index ad9b2d4fa06..49d2cbca946 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/SubtitleLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/SubtitleLang.java @@ -1,12 +1,16 @@ package com.gregtechceu.gtceu.data.lang; import com.tterrag.registrate.providers.RegistrateLangProvider; + import static com.gregtechceu.gtceu.data.lang.LangUtil.*; public class SubtitleLang { - public static void generateSubtitleKeys(RegistrateLangProvider provider) { + public static void init(RegistrateLangProvider provider) { + generateSubtitleKeys(provider); + } + private static void generateSubtitleKeys(RegistrateLangProvider provider) { // Subtitles provider.add("gtceu.subtitle.boiler", "Boiler heating"); provider.add("gtceu.subtitle.computation", "Computer beeps"); @@ -47,7 +51,5 @@ public static void generateSubtitleKeys(RegistrateLangProvider provider) { provider.add("gtceu.subtitle.sus", "Sus..."); provider.add("gtceu.subtitle.science", "s c i e n c e"); provider.add("gtceu.subtitle.metal_pipe", "Destruction_Metal_Pole_L_Wave_2_0_0.wav"); - - } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java index 3672377b534..c1b137908b5 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java @@ -8,6 +8,11 @@ public class ToolLang { public static void init(RegistrateLangProvider provider) { initDeathMessages(provider); + generateToolClassKey(provider); + generateToolKeys(provider); + generateTooltips(provider); + generateBehaviorKey(provider); + generateActionKeys(provider); initToolInfo(provider); } @@ -50,102 +55,94 @@ private static void initDeathMessages(RegistrateLangProvider provider) { provider.add("death.attack.gtceu.buzzsaw", "%s got buzzed by %s"); provider.add("death.attack.gtceu.screwdriver_lv", "%s had their screws removed by %s"); - provider.add("death.attack.gtceu.medical_condition/asbestosis", "%s got mesothelioma"); - provider.add("death.attack.gtceu.medical_condition/chemical_burns", "%s had a chemical accident"); - provider.add("death.attack.gtceu.medical_condition/poison", + provider.add("death.attack.gtceu.medical_condition.asbestosis", "%s got mesothelioma"); + provider.add("death.attack.gtceu.medical_condition.chemical_burns", "%s had a chemical accident"); + provider.add("death.attack.gtceu.medical_condition.poison", "%s forgot that poisonous materials are, in fact, poisonous"); - provider.add("death.attack.gtceu.medical_condition/silicosis", + provider.add("death.attack.gtceu.medical_condition.silicosis", "%s didn't die of tuberculosis. it was silicosis."); - provider.add("death.attack.gtceu.medical_condition/arsenicosis", "%s got arsenic poisoning"); - provider.add("death.attack.gtceu.medical_condition/berylliosis", "%s mined emeralds a bit too greedily"); - provider.add("death.attack.gtceu.medical_condition/carcinogen", "%s got leukemia"); - provider.add("death.attack.gtceu.medical_condition/irritant", "%s got a §n§lREALLY§r bad rash"); - provider.add("death.attack.gtceu.medical_condition/methanol_poisoning", + provider.add("death.attack.gtceu.medical_condition.arsenicosis", "%s got arsenic poisoning"); + provider.add("death.attack.gtceu.medical_condition.berylliosis", "%s mined emeralds a bit too greedily"); + provider.add("death.attack.gtceu.medical_condition.carcinogen", "%s got leukemia"); + provider.add("death.attack.gtceu.medical_condition.irritant", "%s got a §n§lREALLY§r bad rash"); + provider.add("death.attack.gtceu.medical_condition.methanol_poisoning", "%s tried to drink moonshine during the prohibition"); - provider.add("death.attack.gtceu.medical_condition/nausea", "%s died of nausea"); - provider.add("death.attack.gtceu.medical_condition/none", "%s died of... nothing?"); - provider.add("death.attack.gtceu.medical_condition/weak_poison", "%s ate lead (or mercury!)"); - provider.add("death.attack.gtceu.medical_condition/carbon_monoxide_poisoning", "%s left the stove on"); + provider.add("death.attack.gtceu.medical_condition.nausea", "%s died of nausea"); + provider.add("death.attack.gtceu.medical_condition.none", "%s died of... nothing?"); + provider.add("death.attack.gtceu.medical_condition.weak_poison", "%s ate lead (or mercury!)"); + provider.add("death.attack.gtceu.medical_condition.carbon_monoxide_poisoning", "%s left the stove on"); } - public static void generateToolClassKey(RegistrateLangProvider provider){ - - provider.add("gtceu.tool.class.sword", "Sword"); - provider.add("gtceu.tool.class.pickaxe", "Pickaxe"); - provider.add("gtceu.tool.class.shovel", "Shovel"); - provider.add("gtceu.tool.class.axe", "Axe"); - provider.add("gtceu.tool.class.hoe", "Hoe"); - provider.add("gtceu.tool.class.mining_hammer", "Mining Hammer"); - provider.add("gtceu.tool.class.spade", "Spade"); - provider.add("gtceu.tool.class.saw", "Saw"); - provider.add("gtceu.tool.class.hammer", "Hammer"); - provider.add("gtceu.tool.class.mallet", "Soft Mallet"); - provider.add("gtceu.tool.class.wrench", "Wrench"); - provider.add("gtceu.tool.class.file", "File"); - provider.add("gtceu.tool.class.crowbar", "Crowbar"); - provider.add("gtceu.tool.class.screwdriver", "Screwdriver"); - provider.add("gtceu.tool.class.mortar", "Mortar"); - provider.add("gtceu.tool.class.wire_cutter", "Wire Cutter"); - provider.add("gtceu.tool.class.knife", "Knife"); - provider.add("gtceu.tool.class.butchery_knife", "Butchery Knife"); - provider.add("gtceu.tool.class.scythe", "Scythe"); - provider.add("gtceu.tool.class.rolling_pin", "Rolling Pin"); - provider.add("gtceu.tool.class.plunger", "Plunger"); - provider.add("gtceu.tool.class.shears", "Shears"); - provider.add("gtceu.tool.class.drill", "Drill"); - + public static void generateToolClassKey(RegistrateLangProvider provider) { + provider.add("tool.gtceu.class.sword", "Sword"); + provider.add("tool.gtceu.class.pickaxe", "Pickaxe"); + provider.add("tool.gtceu.class.shovel", "Shovel"); + provider.add("tool.gtceu.class.axe", "Axe"); + provider.add("tool.gtceu.class.hoe", "Hoe"); + provider.add("tool.gtceu.class.mining_hammer", "Mining Hammer"); + provider.add("tool.gtceu.class.spade", "Spade"); + provider.add("tool.gtceu.class.saw", "Saw"); + provider.add("tool.gtceu.class.hammer", "Hammer"); + provider.add("tool.gtceu.class.mallet", "Soft Mallet"); + provider.add("tool.gtceu.class.wrench", "Wrench"); + provider.add("tool.gtceu.class.file", "File"); + provider.add("tool.gtceu.class.crowbar", "Crowbar"); + provider.add("tool.gtceu.class.screwdriver", "Screwdriver"); + provider.add("tool.gtceu.class.mortar", "Mortar"); + provider.add("tool.gtceu.class.wire_cutter", "Wire Cutter"); + provider.add("tool.gtceu.class.knife", "Knife"); + provider.add("tool.gtceu.class.butchery_knife", "Butchery Knife"); + provider.add("tool.gtceu.class.scythe", "Scythe"); + provider.add("tool.gtceu.class.rolling_pin", "Rolling Pin"); + provider.add("tool.gtceu.class.plunger", "Plunger"); + provider.add("tool.gtceu.class.shears", "Shears"); + provider.add("tool.gtceu.class.drill", "Drill"); } - public static void generateBehaviorKey(RegistrateLangProvider provider){ - provider.add("item.gtceu.tool.behavior.silk_ice", "§bIce Cutter: §fSilk Harvests Ice"); - provider.add("item.gtceu.tool.behavior.torch_place", "§eSpelunker: §fPlaces Torches on Right-Click"); - provider.add("item.gtceu.tool.behavior.tree_felling", "§4Lumberjack: §fTree Felling"); - provider.add("item.gtceu.tool.behavior.strip_log", "§5Artisan: §fStrips Logs"); - provider.add("item.gtceu.tool.behavior.scrape", "§bPolisher: §fRemoves Oxidation"); - provider.add("item.gtceu.tool.behavior.remove_wax", "§6Cleaner: §fRemoves Wax"); - provider.add("item.gtceu.tool.behavior.shield_disable", "§cBrute: §fDisables Shields"); - provider.add("item.gtceu.tool.behavior.relocate_mining", "§2Magnetic: §fRelocates Mined Blocks and Mob Drops"); - provider.add("item.gtceu.tool.behavior.aoe_mining", "§5Area-of-Effect: §f%sx%sx%s"); - provider.add("item.gtceu.tool.behavior.ground_tilling", "§eFarmer: §fTills Ground"); - provider.add("item.gtceu.tool.behavior.grass_path", "§eLandscaper: §fCreates Grass Paths"); - provider.add("item.gtceu.tool.behavior.rail_rotation", "§eRailroad Engineer: §fRotates Rails"); - provider.add("item.gtceu.tool.behavior.crop_harvesting", "§aHarvester: §fHarvests Crops"); - provider.add("item.gtceu.tool.behavior.plunger", "§9Plumber: §fDrains Fluids"); - provider.add("item.gtceu.tool.behavior.block_rotation", "§2Mechanic: §fRotates Blocks"); - provider.add("item.gtceu.tool.behavior.damage_boost", "§4Damage Boost: §fExtra damage against %s"); - //mode switching + public static void generateBehaviorKey(RegistrateLangProvider provider) { + provider.add("tool.gtceu.behavior.silk_ice", "§bIce Cutter: §fSilk Harvests Ice"); + provider.add("tool.gtceu.behavior.torch_place", "§eSpelunker: §fPlaces Torches on Right-Click"); + provider.add("tool.gtceu.behavior.tree_felling", "§4Lumberjack: §fTree Felling"); + provider.add("tool.gtceu.behavior.strip_log", "§5Artisan: §fStrips Logs"); + provider.add("tool.gtceu.behavior.scrape", "§bPolisher: §fRemoves Oxidation"); + provider.add("tool.gtceu.behavior.remove_wax", "§6Cleaner: §fRemoves Wax"); + provider.add("tool.gtceu.behavior.shield_disable", "§cBrute: §fDisables Shields"); + provider.add("tool.gtceu.behavior.relocate_mining", "§2Magnetic: §fRelocates Mined Blocks and Mob Drops"); + provider.add("tool.gtceu.behavior.aoe_mining", "§5Area-of-Effect: §f%sx%sx%s"); + provider.add("tool.gtceu.behavior.ground_tilling", "§eFarmer: §fTills Ground"); + provider.add("tool.gtceu.behavior.grass_path", "§eLandscaper: §fCreates Grass Paths"); + provider.add("tool.gtceu.behavior.rail_rotation", "§eRailroad Engineer: §fRotates Rails"); + provider.add("tool.gtceu.behavior.crop_harvesting", "§aHarvester: §fHarvests Crops"); + provider.add("tool.gtceu.behavior.plunger", "§9Plumber: §fDrains Fluids"); + provider.add("tool.gtceu.behavior.block_rotation", "§2Mechanic: §fRotates Blocks"); + provider.add("tool.gtceu.behavior.damage_boost", "§4Damage Boost: §fExtra damage against %s"); + + // mode switching provider.add("item.behavior.mode_switch.tooltip", "Use while sneaking to switch mode"); provider.add("item.behavior.mode_switch.mode_switched", "§eMode Set to: %s"); provider.add("item.behavior.mode_switch.current_mode", "Mode: %s"); - } - public static void generateToolKeys(RegistrateLangProvider provider){ + public static void generateToolKeys(RegistrateLangProvider provider) { + // tool names replace(provider, "item.gtceu.tool.sword", "%s Sword"); replace(provider, "item.gtceu.tool.pickaxe", "%s Pickaxe"); replace(provider, "item.gtceu.tool.shovel", "%s Shovel"); replace(provider, "item.gtceu.tool.axe", "%s Axe"); replace(provider, "item.gtceu.tool.hoe", "%s Hoe"); replace(provider, "item.gtceu.tool.saw", "%s Saw"); + replace(provider, "item.gtceu.tool.hammer", "%s Hammer"); - provider.add("item.gtceu.tool.hammer.tooltip", "§8Crushes Blocks when harvesting them"); replace(provider, "item.gtceu.tool.mallet", "%s Soft Mallet"); - multilineLang(provider, "item.gtceu.tool.mallet.tooltip", - "§8Sneak to Pause Machine After Current Recipe.\n§8Stops/Starts Machines"); replace(provider, "item.gtceu.tool.wrench", "%s Wrench"); - provider.add("item.gtceu.tool.wrench.tooltip", "§8Hold left click to dismantle Machines"); replace(provider, "item.gtceu.tool.file", "%s File"); replace(provider, "item.gtceu.tool.crowbar", "%s Crowbar"); - provider.add("item.gtceu.tool.crowbar.tooltip", "§8Dismounts Covers"); replace(provider, "item.gtceu.tool.screwdriver", "%s Screwdriver"); - provider.add("item.gtceu.tool.screwdriver.tooltip", "§8Adjusts Covers and Machines"); replace(provider, "item.gtceu.tool.mortar", "%s Mortar"); replace(provider, "item.gtceu.tool.wire_cutter", "%s Wire Cutter"); replace(provider, "item.gtceu.tool.knife", "%s Knife"); replace(provider, "item.gtceu.tool.butchery_knife", "%s Butchery Knife"); - provider.add("item.gtceu.tool.butchery_knife.tooltip", "§8Has a slow Attack Rate"); replace(provider, "item.gtceu.tool.scythe", "%s Scythe"); - provider.add("item.gtceu.tool.scythe.tooltip", "§8Because a Scythe doesn't make Sense"); replace(provider, "item.gtceu.tool.rolling_pin", "%s Rolling Pin"); replace(provider, "item.gtceu.tool.lv_drill", "%s Drill (LV)"); replace(provider, "item.gtceu.tool.mv_drill", "%s Drill (MV)"); @@ -156,45 +153,54 @@ public static void generateToolKeys(RegistrateLangProvider provider){ replace(provider, "item.gtceu.tool.hv_wirecutter", "%s Wire Cutter (HV)"); replace(provider, "item.gtceu.tool.iv_wirecutter", "%s Wire Cutter (IV)"); replace(provider, "item.gtceu.tool.mining_hammer", "%s Mining Hammer"); - provider.add("item.gtceu.tool.mining_hammer.tooltip", - "§8Mines a large area at once (unless you're crouching)"); replace(provider, "item.gtceu.tool.spade", "%s Spade"); - provider.add("item.gtceu.tool.spade.tooltip", "§8Mines a large area at once (unless you're crouching)"); replace(provider, "item.gtceu.tool.lv_chainsaw", "%s Chainsaw (LV)"); replace(provider, "item.gtceu.tool.mv_chainsaw", "%s Chainsaw (MV)"); replace(provider, "item.gtceu.tool.hv_chainsaw", "%s Chainsaw (HV)"); replace(provider, "item.gtceu.tool.lv_wrench", "%s Wrench (LV)"); - provider.add("item.gtceu.tool.lv_wrench.tooltip", "§8Hold left click to dismantle Machines"); replace(provider, "item.gtceu.tool.hv_wrench", "%s Wrench (HV)"); - provider.add("item.gtceu.tool.hv_wrench.tooltip", "§8Hold left click to dismantle Machines"); replace(provider, "item.gtceu.tool.iv_wrench", "%s Wrench (IV)"); - provider.add("item.gtceu.tool.iv_wrench.tooltip", "§8Hold left click to dismantle Machines"); replace(provider, "item.gtceu.tool.buzzsaw", "%s Buzzsaw (LV)"); - provider.add("item.gtceu.tool.buzzsaw.tooltip", "§8Not suitable for harvesting Blocks"); replace(provider, "item.gtceu.tool.lv_screwdriver", "%s Screwdriver (LV)"); - provider.add("item.gtceu.tool.lv_screwdriver.tooltip", "§8Adjusts Covers and Machines"); replace(provider, "item.gtceu.tool.plunger", "%s Plunger"); - provider.add("item.gtceu.tool.plunger.tooltip", "§8Removes Fluids from Machines"); replace(provider, "item.gtceu.tool.shears", "%s Shears"); + + provider.add("item.gtceu.tool.hammer.tooltip", "§8Crushes Blocks when harvesting them"); + multilineLang(provider, "item.gtceu.tool.mallet.tooltip", + "§8Sneak to Pause Machine After Current Recipe.\n§8Stops/Starts Machines"); + provider.add("item.gtceu.tool.wrench.tooltip", "§8Hold left click to dismantle Machines"); + provider.add("item.gtceu.tool.crowbar.tooltip", "§8Dismounts Covers"); + provider.add("item.gtceu.tool.screwdriver.tooltip", "§8Adjusts Covers and Machines"); + provider.add("item.gtceu.tool.butchery_knife.tooltip", "§8Has a slow Attack Rate"); + provider.add("item.gtceu.tool.scythe.tooltip", "§8Because a Scythe doesn't make Sense"); + provider.add("item.gtceu.tool.mining_hammer.tooltip", + "§8Mines a large area at once (unless you're crouching)"); + provider.add("item.gtceu.tool.spade.tooltip", "§8Mines a large area at once (unless you're crouching)"); + provider.add("item.gtceu.tool.lv_wrench.tooltip", "§8Hold left click to dismantle Machines"); + provider.add("item.gtceu.tool.hv_wrench.tooltip", "§8Hold left click to dismantle Machines"); + provider.add("item.gtceu.tool.iv_wrench.tooltip", "§8Hold left click to dismantle Machines"); + provider.add("item.gtceu.tool.buzzsaw.tooltip", "§8Not suitable for harvesting Blocks"); + provider.add("item.gtceu.tool.lv_screwdriver.tooltip", "§8Adjusts Covers and Machines"); + provider.add("item.gtceu.tool.plunger.tooltip", "§8Removes Fluids from Machines"); } - public static void generateTooltips(RegistrateLangProvider provider){ - provider.add("item.gtceu.tool.tooltip.crafting_uses", "%s §aCrafting Uses"); - provider.add("item.gtceu.tool.tooltip.max_uses", "%s §eTotal Durability"); - provider.add("item.gtceu.tool.tooltip.general_uses", "%s §bDurability"); - provider.add("item.gtceu.tool.tooltip.attack_damage", "%s §cAttack Damage"); - provider.add("item.gtceu.tool.tooltip.attack_speed", "%s §9Attack Speed"); - provider.add("item.gtceu.tool.tooltip.mining_speed", "%s §dMining Speed"); - provider.add("item.gtceu.tool.tooltip.harvest_level", "§eHarvest Level %s"); - provider.add("item.gtceu.tool.tooltip.harvest_level_extra", "§eHarvest Level %s §f(%s§f)"); - multiLang(provider, "item.gtceu.tool.harvest_level", "§8Wood", "§7Stone", "§aIron", "§bDiamond", - "§dNetherite", - "§9Duranium", "§cNeutronium"); - provider.add("item.gtceu.tool.tooltip.repair_info", "§8Hold SHIFT to show Repair Info"); - provider.add("item.gtceu.tool.tooltip.repair_material", "§8Repair with: §f§a%s"); + public static void generateTooltips(RegistrateLangProvider provider) { + provider.add("tool.gtceu.crafting_uses.tooltip", "%s §aCrafting Uses"); + provider.add("tool.gtceu.max_uses.tooltip", "%s §eTotal Durability"); + provider.add("tool.gtceu.general_uses.tooltip", "%s §bDurability"); + provider.add("tool.gtceu.attack_damage.tooltip", "%s §cAttack Damage"); + provider.add("tool.gtceu.attack_speed.tooltip", "%s §9Attack Speed"); + provider.add("tool.gtceu.mining_speed.tooltip", "%s §dMining Speed"); + provider.add("tool.gtceu.harvest_level.tooltip", "§eHarvest Level %s"); + provider.add("tool.gtceu.harvest_level_extra.tooltip", "§eHarvest Level %s §f(%s§f)"); + multiLang(provider, "item.gtceu.tool.harvest_level", + "§8Wood", "§7Stone", "§aIron", "§bDiamond", + "§dNetherite", "§9Duranium", "§cNeutronium"); + provider.add("tool.gtceu.repair_info.tooltip", "§8Hold SHIFT to show Repair Info"); + provider.add("tool.gtceu.repair_material.tooltip", "§8Repair with: §f§a%s"); } - public static void generateActionKeys(RegistrateLangProvider provider){ + public static void generateActionKeys(RegistrateLangProvider provider) { provider.add("gtceu.tool_action.show_tooltips", "Hold SHIFT to show Tool Info"); provider.add("gtceu.tool_action.screwdriver.auto_output_covers", "§8Use Screwdriver to Allow Input from Output Side or access Covers"); @@ -214,7 +220,6 @@ public static void generateActionKeys(RegistrateLangProvider provider){ provider.add("gtceu.tool_action.hammer", "§8Use Hard Hammer to muffle Sounds"); provider.add("gtceu.tool_action.crowbar", "§8Use Crowbar to remove Covers"); provider.add("gtceu.tool_action.tape", "§8Use Tape to fix Maintenance Problems"); - } private static void initToolInfo(RegistrateLangProvider provider) {} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/rei/GTREIPlugin.java b/src/main/java/com/gregtechceu/gtceu/integration/rei/GTREIPlugin.java index 6d3db3661eb..fe47a83ae50 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/rei/GTREIPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/rei/GTREIPlugin.java @@ -90,7 +90,7 @@ public void registerDisplays(DisplayRegistry registry) { public void registerCollapsibleEntries(CollapsibleEntryRegistry registry) { for (GTToolType toolType : GTToolType.getTypes().values()) { registry.group(GTCEu.id("tool/" + toolType.name), - Component.translatable("gtceu.tool.class." + toolType.name), + Component.translatable("tool.gtceu.class." + toolType.name), EntryIngredients.ofItemTag(toolType.itemTags.get(0))); // EntryIngredients.ofItemStacks(GTItems.TOOL_ITEMS.column(toolType).values().stream().filter(Objects::nonNull).map(ItemProviderEntry::get).map(IGTTool::get).collect(Collectors.toSet())) } diff --git a/src/main/resources/assets/gtceu/lang/ja_jp.json b/src/main/resources/assets/gtceu/lang/ja_jp.json index 1e219ce3979..6e3e30679d8 100644 --- a/src/main/resources/assets/gtceu/lang/ja_jp.json +++ b/src/main/resources/assets/gtceu/lang/ja_jp.json @@ -2037,19 +2037,19 @@ "death.attack.gtceu.hoe": "%s は %s に丸刈りにされた。", "death.attack.gtceu.knife": "%s は %s に背中を血で洗ってもらった。", "death.attack.gtceu.mallet": "%s は %s の新居の土台となった。", - "death.attack.gtceu.medical_condition/arsenicosis": "%s はヒ素中毒になった。", - "death.attack.gtceu.medical_condition/asbestosis": "%s はアスベストに注意を払わなかった。", - "death.attack.gtceu.medical_condition/berylliosis": "%s はベリリウム肺になってしまった。", - "death.attack.gtceu.medical_condition/carbon_monoxide_poisoning": "%s はストーブをつけっぱなしにして一酸化炭素中毒になってしまった。", - "death.attack.gtceu.medical_condition/carcinogen": "%s は白血病になった。", - "death.attack.gtceu.medical_condition/chemical_burns": "%s は化学事故を起こした。", - "death.attack.gtceu.medical_condition/irritant": "%s は§n§ひどい§r発疹になった。", - "death.attack.gtceu.medical_condition/methanol_poisoning": "%s は禁酒法時代に密造酒を飲もうとした。", - "death.attack.gtceu.medical_condition/nausea": "%s は吐き気で死亡した。", - "death.attack.gtceu.medical_condition/none": "%s の死因は...何でもない?", - "death.attack.gtceu.medical_condition/poison": "%s は有毒物質には毒があることを忘れていた。", - "death.attack.gtceu.medical_condition/silicosis": "%s は結核で死んだのではない、珪肺だったのだ。", - "death.attack.gtceu.medical_condition/weak_poison": "%s は鉛(または水銀)を食べた。", + "death.attack.gtceu.medical_condition.arsenicosis": "%s はヒ素中毒になった。", + "death.attack.gtceu.medical_condition.asbestosis": "%s はアスベストに注意を払わなかった。", + "death.attack.gtceu.medical_condition.berylliosis": "%s はベリリウム肺になってしまった。", + "death.attack.gtceu.medical_condition.carbon_monoxide_poisoning": "%s はストーブをつけっぱなしにして一酸化炭素中毒になってしまった。", + "death.attack.gtceu.medical_condition.carcinogen": "%s は白血病になった。", + "death.attack.gtceu.medical_condition.chemical_burns": "%s は化学事故を起こした。", + "death.attack.gtceu.medical_condition.irritant": "%s は§n§ひどい§r発疹になった。", + "death.attack.gtceu.medical_condition.methanol_poisoning": "%s は禁酒法時代に密造酒を飲もうとした。", + "death.attack.gtceu.medical_condition.nausea": "%s は吐き気で死亡した。", + "death.attack.gtceu.medical_condition.none": "%s の死因は...何でもない?", + "death.attack.gtceu.medical_condition.poison": "%s は有毒物質には毒があることを忘れていた。", + "death.attack.gtceu.medical_condition.silicosis": "%s は結核で死んだのではない、珪肺だったのだ。", + "death.attack.gtceu.medical_condition.weak_poison": "%s は鉛(または水銀)を食べた。", "death.attack.gtceu.mining_hammer": "%s のミネラル成分は %s に摂取された。", "death.attack.gtceu.mortar": "%s は %s に身を粉にされた。", "death.attack.gtceu.pickaxe": "%s の人生最大の輝きは %s のツルハシの耐久値を2減らしたことだった。", @@ -2118,32 +2118,32 @@ "gtceu.circuit_assembler": "回路組立機", "gtceu.coke_oven": "コークス炉", "gtceu.combustion_generator": "燃焼発電機", - "gtceu.command.copy.click_to_copy": "クリックでコピー", - "gtceu.command.copy.copied_and_click": "をクリップボードにコピーします。クリックで再びコピーします", - "gtceu.command.copy.copied_end": "] をコピーしました", - "gtceu.command.copy.copied_start": "クリップボードに [", - "gtceu.command.hand.electric": "蓄電量: %d / %d EU - Tier: %d; バッテリー?: %s", - "gtceu.command.hand.fluid": "液体情報: %d / %d mB; Can Fill: %s; Can Drain: %s", - "gtceu.command.hand.fluid2": "液体ID:", - "gtceu.command.hand.groovy": "§6/gs hand§7を検討してください。", - "gtceu.command.hand.item_id": "アイテムID: %s (メタデータ: %d)", - "gtceu.command.hand.material": "マテリアルID:", - "gtceu.command.hand.meta_item": "メタアイテムID:", - "gtceu.command.hand.no_item": "コマンドを実行するためには何かを手にもっておく必要があります。", - "gtceu.command.hand.not_a_player": "このコマンドはプレイヤーのみ使用できます。", - "gtceu.command.hand.ore_prefix": "鉱石接頭辞:", - "gtceu.command.hand.tag_entries": "§3タグエントリ:", - "gtceu.command.hand.tool_stats": "ツール統計クラス: %s", - "gtceu.command.hand.usage": "使用方法: /gtceu hand", - "gtceu.command.recipecheck.begin": "レシピの競合チェック開始...", - "gtceu.command.recipecheck.end": "競合チェックにより、競合の可能性が%d個見つかりました。サーバーログで詳細を確認してください。", - "gtceu.command.recipecheck.end_no_conflicts": "レシピ競合は見つかりませんでした!", - "gtceu.command.recipecheck.usage": "使用方法: /gtceu recipecheck", - "gtceu.command.usage": "使用方法: /gtceu ", - "gtceu.command.worldgen.reload.failed": "Worldgenの読み込みに失敗しました。エラーを確認してください。", - "gtceu.command.worldgen.reload.success": "configからWorldgenが正常に読み込まれました。", - "gtceu.command.worldgen.reload.usage": "使用方法: /gtceu worldgen reload", - "gtceu.command.worldgen.usage": "使用方法: /gtceu worldgen ", + "command.gtceu.copy.click_to_copy": "クリックでコピー", + "command.gtceu.copy.copied_and_click": "をクリップボードにコピーします。クリックで再びコピーします", + "command.gtceu.copy.copied_end": "] をコピーしました", + "command.gtceu.copy.copied_start": "クリップボードに [", + "command.gtceu.hand.electric": "蓄電量: %d / %d EU - Tier: %d; バッテリー?: %s", + "command.gtceu.hand.fluid": "液体情報: %d / %d mB; Can Fill: %s; Can Drain: %s", + "command.gtceu.hand.fluid2": "液体ID:", + "command.gtceu.hand.groovy": "§6/gs hand§7を検討してください。", + "command.gtceu.hand.item_id": "アイテムID: %s (メタデータ: %d)", + "command.gtceu.hand.material": "マテリアルID:", + "command.gtceu.hand.meta_item": "メタアイテムID:", + "command.gtceu.hand.no_item": "コマンドを実行するためには何かを手にもっておく必要があります。", + "command.gtceu.hand.not_a_player": "このコマンドはプレイヤーのみ使用できます。", + "command.gtceu.hand.ore_prefix": "鉱石接頭辞:", + "command.gtceu.hand.tag_entries": "§3タグエントリ:", + "command.gtceu.hand.tool_stats": "ツール統計クラス: %s", + "command.gtceu.hand.usage": "使用方法: /gtceu hand", + "command.gtceu.recipecheck.begin": "レシピの競合チェック開始...", + "command.gtceu.recipecheck.end": "競合チェックにより、競合の可能性が%d個見つかりました。サーバーログで詳細を確認してください。", + "command.gtceu.recipecheck.end_no_conflicts": "レシピ競合は見つかりませんでした!", + "command.gtceu.recipecheck.usage": "使用方法: /gtceu recipecheck", + "command.gtceu.usage": "使用方法: /gtceu ", + "command.gtceu.worldgen.reload.failed": "Worldgenの読み込みに失敗しました。エラーを確認してください。", + "command.gtceu.worldgen.reload.success": "configからWorldgenが正常に読み込まれました。", + "command.gtceu.worldgen.reload.usage": "使用方法: /gtceu worldgen reload", + "command.gtceu.worldgen.usage": "使用方法: /gtceu worldgen ", "gtceu.compressor": "圧縮機", "gtceu.cover.activity_detector.message_activity_inverted": "反転アクティビティ状態のモニタリング", "gtceu.cover.activity_detector.message_activity_normal": "通常活動状況のモニタリング", @@ -3425,29 +3425,29 @@ "gtceu.subtitle.wirecutter": "ワイヤーを切断音", "gtceu.subtitle.wrench": "レンチのガタつき", "gtceu.thermal_centrifuge": "熱遠心分離機", - "gtceu.tool.class.axe": "斧", - "gtceu.tool.class.butchery_knife": "肉切り包丁", - "gtceu.tool.class.crowbar": "バール", - "gtceu.tool.class.drill": "ドリル", - "gtceu.tool.class.file": "やすり", - "gtceu.tool.class.hammer": "ハンマー", - "gtceu.tool.class.hoe": "クワ", - "gtceu.tool.class.knife": "ナイフ", - "gtceu.tool.class.mallet": "ソフトマレット", - "gtceu.tool.class.mining_hammer": "採掘用ハンマー", - "gtceu.tool.class.mortar": "すり鉢", - "gtceu.tool.class.pickaxe": "ピッケル", - "gtceu.tool.class.plunger": "ラバーカップ", - "gtceu.tool.class.rolling_pin": "製麺棒", - "gtceu.tool.class.saw": "ノコギリ", - "gtceu.tool.class.screwdriver": "スクリュードライバー", - "gtceu.tool.class.scythe": "鎌", - "gtceu.tool.class.shears": "ハサミ", - "gtceu.tool.class.shovel": "シャベル", - "gtceu.tool.class.spade": "軍用シャベル", - "gtceu.tool.class.sword": "剣", - "gtceu.tool.class.wire_cutter": "ワイヤーカッター", - "gtceu.tool.class.wrench": "レンチ", + "tool.gtceu.class.axe": "斧", + "tool.gtceu.class.butchery_knife": "肉切り包丁", + "tool.gtceu.class.crowbar": "バール", + "tool.gtceu.class.drill": "ドリル", + "tool.gtceu.class.file": "やすり", + "tool.gtceu.class.hammer": "ハンマー", + "tool.gtceu.class.hoe": "クワ", + "tool.gtceu.class.knife": "ナイフ", + "tool.gtceu.class.mallet": "ソフトマレット", + "tool.gtceu.class.mining_hammer": "採掘用ハンマー", + "tool.gtceu.class.mortar": "すり鉢", + "tool.gtceu.class.pickaxe": "ピッケル", + "tool.gtceu.class.plunger": "ラバーカップ", + "tool.gtceu.class.rolling_pin": "製麺棒", + "tool.gtceu.class.saw": "ノコギリ", + "tool.gtceu.class.screwdriver": "スクリュードライバー", + "tool.gtceu.class.scythe": "鎌", + "tool.gtceu.class.shears": "ハサミ", + "tool.gtceu.class.shovel": "シャベル", + "tool.gtceu.class.spade": "軍用シャベル", + "tool.gtceu.class.sword": "剣", + "tool.gtceu.class.wire_cutter": "ワイヤーカッター", + "tool.gtceu.class.wrench": "レンチ", "gtceu.tool_action.crowbar": "§8バールでカバーを撤去できます。", "gtceu.tool_action.hammer": "§8ハードハンマーで消音できます。", "gtceu.tool_action.screwdriver.access_covers": "§8スクリュードライバーでカバーにアクセスできます。", @@ -4354,22 +4354,22 @@ "item.gtceu.tool.aoe.layers": "奥行", "item.gtceu.tool.aoe.rows": "横", "item.gtceu.tool.axe": "%s製斧", - "item.gtceu.tool.behavior.aoe_mining": "§5範囲採掘: §f%sx%sx%s", - "item.gtceu.tool.behavior.block_rotation": "§2メカニック: §fブロックを回転", - "item.gtceu.tool.behavior.crop_harvesting": "§a収穫家: §f作物を収穫", - "item.gtceu.tool.behavior.damage_boost": "§4ダメージブースト: §f%sに対してダメージ増加", - "item.gtceu.tool.behavior.grass_path": "§e造園家: §f草の道を作成", - "item.gtceu.tool.behavior.ground_tilling": "§e農家: §f地面を耕す", - "item.gtceu.tool.behavior.plunger": "§9排水業者: §f液体を回収", - "item.gtceu.tool.behavior.rail_rotation": "§e鉄道技師: §fレールを回転", - "item.gtceu.tool.behavior.relocate_mining": "§2磁力: §f採掘ブロックとモブドロップを直接回収", - "item.gtceu.tool.behavior.remove_wax": "§6クリーナー: §fワックス除去", - "item.gtceu.tool.behavior.scrape": "§b研磨業者: §fサビを除去する", - "item.gtceu.tool.behavior.shield_disable": "§c野蛮: §f盾無効", - "item.gtceu.tool.behavior.silk_ice": "§b製氷: §f氷をシルクタッチ回収", - "item.gtceu.tool.behavior.strip_log": "§5職人: §丸太のストリップ", - "item.gtceu.tool.behavior.torch_place": "§e採掘者: §f右クリックで松明設置", - "item.gtceu.tool.behavior.tree_felling": "§4木こり: §f一括伐採", + "tool.gtceu.behavior.aoe_mining": "§5範囲採掘: §f%sx%sx%s", + "tool.gtceu.behavior.block_rotation": "§2メカニック: §fブロックを回転", + "tool.gtceu.behavior.crop_harvesting": "§a収穫家: §f作物を収穫", + "tool.gtceu.behavior.damage_boost": "§4ダメージブースト: §f%sに対してダメージ増加", + "tool.gtceu.behavior.grass_path": "§e造園家: §f草の道を作成", + "tool.gtceu.behavior.ground_tilling": "§e農家: §f地面を耕す", + "tool.gtceu.behavior.plunger": "§9排水業者: §f液体を回収", + "tool.gtceu.behavior.rail_rotation": "§e鉄道技師: §fレールを回転", + "tool.gtceu.behavior.relocate_mining": "§2磁力: §f採掘ブロックとモブドロップを直接回収", + "tool.gtceu.behavior.remove_wax": "§6クリーナー: §fワックス除去", + "tool.gtceu.behavior.scrape": "§b研磨業者: §fサビを除去する", + "tool.gtceu.behavior.shield_disable": "§c野蛮: §f盾無効", + "tool.gtceu.behavior.silk_ice": "§b製氷: §f氷をシルクタッチ回収", + "tool.gtceu.behavior.strip_log": "§5職人: §丸太のストリップ", + "tool.gtceu.behavior.torch_place": "§e採掘者: §f右クリックで松明設置", + "tool.gtceu.behavior.tree_felling": "§4木こり: §f一括伐採", "item.gtceu.tool.butchery_knife": "%s製肉切り包丁", "item.gtceu.tool.butchery_knife.tooltip": "§8攻撃速度は遅い", "item.gtceu.tool.buzzsaw": "LVの%s製のこぎり刃", @@ -4429,16 +4429,16 @@ "item.gtceu.tool.spade": "%s製軍用シャベル", "item.gtceu.tool.spade.tooltip": "§8範囲採掘 (スニークで無効化)", "item.gtceu.tool.sword": "%s製剣", - "item.gtceu.tool.tooltip.attack_damage": "§c攻撃力 %s", - "item.gtceu.tool.tooltip.attack_speed": "§9攻撃速度 %s", - "item.gtceu.tool.tooltip.crafting_uses": "§aあと§l%s§r§a回クラフトに利用できる", - "item.gtceu.tool.tooltip.general_uses": "§bあと§l%s§b回使用可能", - "item.gtceu.tool.tooltip.harvest_level": "§e採掘レベル %s", - "item.gtceu.tool.tooltip.harvest_level_extra": "§e採掘レベル %s §f(%s§f)", - "item.gtceu.tool.tooltip.max_uses": "%s §e総耐久力", - "item.gtceu.tool.tooltip.mining_speed": "§d採掘速度 %s", - "item.gtceu.tool.tooltip.repair_info": "§8SHIFTで修理情報を表示", - "item.gtceu.tool.tooltip.repair_material": "§f§a%s§7で修理可能", + "tool.gtceu.attack_damage.tooltip": "§c攻撃力 %s", + "tool.gtceu.attack_speed.tooltip": "§9攻撃速度 %s", + "tool.gtceu.crafting_uses.tooltip": "§aあと§l%s§r§a回クラフトに利用できる", + "tool.gtceu.general_uses.tooltip": "§bあと§l%s§b回使用可能", + "tool.gtceu.harvest_level.tooltip": "§e採掘レベル %s", + "tool.gtceu.harvest_level_extra.tooltip": "§e採掘レベル %s §f(%s§f)", + "tool.gtceu.max_uses.tooltip": "%s §e総耐久力", + "tool.gtceu.mining_speed.tooltip": "§d採掘速度 %s", + "tool.gtceu.repair_info.tooltip": "§8SHIFTで修理情報を表示", + "tool.gtceu.repair_material.tooltip": "§f§a%s§7で修理可能", "item.gtceu.tool.usable_as": "§8§f%s§7として使用可能", "item.gtceu.tool.wire_cutter": "%s製ワイヤーカッター", "item.gtceu.tool.wrench": "%s製レンチ", diff --git a/src/main/resources/assets/gtceu/lang/ru_ru.json b/src/main/resources/assets/gtceu/lang/ru_ru.json index 09c92ef007d..65fe4ff0abb 100644 --- a/src/main/resources/assets/gtceu/lang/ru_ru.json +++ b/src/main/resources/assets/gtceu/lang/ru_ru.json @@ -1482,31 +1482,31 @@ "gtceu.circuit_assembler": "Сборщик микросхем", "gtceu.coke_oven": "Коксовая печь", "gtceu.combustion_generator": "Дизельный генератор", - "gtceu.command.copy.click_to_copy": "Нажмите для копирования", - "gtceu.command.copy.copied_and_click": "скопировано буфер обмена. Нажмите чтобы скопировать повторно", - "gtceu.command.copy.copied_end": "] в буфер обмена", - "gtceu.command.copy.copied_start": "Скопировано [", - "gtceu.command.hand.electric": "Информация о заряде: %d / %d Уровень напряжения: %d; Это батарея: %s", - "gtceu.command.hand.fluid": "Информация о жидкости: %d / %d мВ; Можно залить: %s; Можно слить: %s", - "gtceu.command.hand.fluid2": "ID жидкости:", - "gtceu.command.hand.groovy": "Рассмотрите возможность использования §6/gs hand", - "gtceu.command.hand.item_id": "Предмет: %s (Метаданные: %d)", - "gtceu.command.hand.material": "ID материала:", - "gtceu.command.hand.meta_item": "ID мета-предмета:", - "gtceu.command.hand.no_item": "Перед выполнением этой команды вы должны держать что-нибудь в руке.", - "gtceu.command.hand.not_a_player": "Эта команда может использоваться только игроком.", - "gtceu.command.hand.ore_prefix": "Префикс руды:", - "gtceu.command.hand.tool_stats": "Класс инструмента: %s", - "gtceu.command.hand.usage": "Используйте: /gtceu hand", - "gtceu.command.recipecheck.begin": "Запускаем проверку на конфликта рецептов...", - "gtceu.command.recipecheck.end": "Проверка конфликтов рецептов обнаружила %d возможных конфликтов. Проверьте записи сервера для получения дополнительной информации", - "gtceu.command.recipecheck.end_no_conflicts": "Конфликтов рецептов не обнаружено!", - "gtceu.command.recipecheck.usage": "Использование: /gtceu recipecheck", - "gtceu.command.usage": "Использование: /gtceu ", - "gtceu.command.worldgen.reload.failed": "Перезагрузка генератора мира окончилась ошибкой. Проверьте ошибки в консоли.", - "gtceu.command.worldgen.reload.success": "Генератор мира успешно перезагрузился из настроек.", - "gtceu.command.worldgen.reload.usage": "Использование: /gtceu worldgen reload", - "gtceu.command.worldgen.usage": "Использование: /gtceu worldgen ", + "command.gtceu.copy.click_to_copy": "Нажмите для копирования", + "command.gtceu.copy.copied_and_click": "скопировано буфер обмена. Нажмите чтобы скопировать повторно", + "command.gtceu.copy.copied_end": "] в буфер обмена", + "command.gtceu.copy.copied_start": "Скопировано [", + "command.gtceu.hand.electric": "Информация о заряде: %d / %d Уровень напряжения: %d; Это батарея: %s", + "command.gtceu.hand.fluid": "Информация о жидкости: %d / %d мВ; Можно залить: %s; Можно слить: %s", + "command.gtceu.hand.fluid2": "ID жидкости:", + "command.gtceu.hand.groovy": "Рассмотрите возможность использования §6/gs hand", + "command.gtceu.hand.item_id": "Предмет: %s (Метаданные: %d)", + "command.gtceu.hand.material": "ID материала:", + "command.gtceu.hand.meta_item": "ID мета-предмета:", + "command.gtceu.hand.no_item": "Перед выполнением этой команды вы должны держать что-нибудь в руке.", + "command.gtceu.hand.not_a_player": "Эта команда может использоваться только игроком.", + "command.gtceu.hand.ore_prefix": "Префикс руды:", + "command.gtceu.hand.tool_stats": "Класс инструмента: %s", + "command.gtceu.hand.usage": "Используйте: /gtceu hand", + "command.gtceu.recipecheck.begin": "Запускаем проверку на конфликта рецептов...", + "command.gtceu.recipecheck.end": "Проверка конфликтов рецептов обнаружила %d возможных конфликтов. Проверьте записи сервера для получения дополнительной информации", + "command.gtceu.recipecheck.end_no_conflicts": "Конфликтов рецептов не обнаружено!", + "command.gtceu.recipecheck.usage": "Использование: /gtceu recipecheck", + "command.gtceu.usage": "Использование: /gtceu ", + "command.gtceu.worldgen.reload.failed": "Перезагрузка генератора мира окончилась ошибкой. Проверьте ошибки в консоли.", + "command.gtceu.worldgen.reload.success": "Генератор мира успешно перезагрузился из настроек.", + "command.gtceu.worldgen.reload.usage": "Использование: /gtceu worldgen reload", + "command.gtceu.worldgen.usage": "Использование: /gtceu worldgen ", "gtceu.compressor": "Компрессор", "gtceu.cover.activity_detector.message_activity_inverted": "Следить за инвертированным состоянием активности", "gtceu.cover.activity_detector.message_activity_normal": "Следить за состоянием активности", @@ -2602,19 +2602,19 @@ "item.gtceu.tool.aoe.layers": "Слоёв", "item.gtceu.tool.aoe.rows": "Рядов", "item.gtceu.tool.axe": "Топор (%s)", - "item.gtceu.tool.behavior.aoe_mining": "§5Добыча по области: §f%sx%sx%s", - "item.gtceu.tool.behavior.block_rotation": "§2Механик: §fВращение блоков", - "item.gtceu.tool.behavior.crop_harvesting": "§aКомбайн: §fСбор урожая", - "item.gtceu.tool.behavior.damage_boost": "§4Увеличение урона: §fДополнительный урон против %s", - "item.gtceu.tool.behavior.grass_path": "§eДекоратор: §fСоздаёт тропу", - "item.gtceu.tool.behavior.ground_tilling": "§eФермер: Вспашка земли", - "item.gtceu.tool.behavior.plunger": "§9Сантехник: §fОткачивает жидкости", - "item.gtceu.tool.behavior.rail_rotation": "§eЖелезнодорожник: §fВращает рельсы", - "item.gtceu.tool.behavior.relocate_mining": "§2Магнитный: §fПеремещает добытые блоки и добычу с существ", - "item.gtceu.tool.behavior.shield_disable": "§7Брут: §fИгнорирует щиты", - "item.gtceu.tool.behavior.silk_ice": "§bЛедорез: §fЩёлковое касание Льда", - "item.gtceu.tool.behavior.torch_place": "§eСпелеолог: §f Установка факелов правой кнопкой мыши", - "item.gtceu.tool.behavior.tree_felling": "§4Лесоруб: §fВалка деревьев", + "tool.gtceu.behavior.aoe_mining": "§5Добыча по области: §f%sx%sx%s", + "tool.gtceu.behavior.block_rotation": "§2Механик: §fВращение блоков", + "tool.gtceu.behavior.crop_harvesting": "§aКомбайн: §fСбор урожая", + "tool.gtceu.behavior.damage_boost": "§4Увеличение урона: §fДополнительный урон против %s", + "tool.gtceu.behavior.grass_path": "§eДекоратор: §fСоздаёт тропу", + "tool.gtceu.behavior.ground_tilling": "§eФермер: Вспашка земли", + "tool.gtceu.behavior.plunger": "§9Сантехник: §fОткачивает жидкости", + "tool.gtceu.behavior.rail_rotation": "§eЖелезнодорожник: §fВращает рельсы", + "tool.gtceu.behavior.relocate_mining": "§2Магнитный: §fПеремещает добытые блоки и добычу с существ", + "tool.gtceu.behavior.shield_disable": "§7Брут: §fИгнорирует щиты", + "tool.gtceu.behavior.silk_ice": "§bЛедорез: §fЩёлковое касание Льда", + "tool.gtceu.behavior.torch_place": "§eСпелеолог: §f Установка факелов правой кнопкой мыши", + "tool.gtceu.behavior.tree_felling": "§4Лесоруб: §fВалка деревьев", "item.gtceu.tool.butchery_knife": "Тесак (%s)", "item.gtceu.tool.butchery_knife.tooltip": "§8Имеет низкую скорость атаки", "item.gtceu.tool.buzzsaw": "Циркулярная пила (%s §7LV§r)", @@ -2653,15 +2653,15 @@ "item.gtceu.tool.spade": "Заступ (%s)", "item.gtceu.tool.spade.tooltip": "§8Добывает в большой области (если вы не приседаете)", "item.gtceu.tool.sword": "Меч (%s)", - "item.gtceu.tool.tooltip.attack_damage": "§cНаносимый урон: %s", - "item.gtceu.tool.tooltip.attack_speed": "§9Скорость атаки: %s", - "item.gtceu.tool.tooltip.crafting_uses": "§aОсталось применений: %s", - "item.gtceu.tool.tooltip.general_uses": "§bОсталось использований: %s", - "item.gtceu.tool.tooltip.harvest_level": "§eУровень добычи: %s", - "item.gtceu.tool.tooltip.harvest_level_extra": "§eУровень добычи: %s §f(%s§f)", - "item.gtceu.tool.tooltip.mining_speed": "§dСкорость добычи: %s", - "item.gtceu.tool.tooltip.repair_info": "§8Удерживайте SHIFT для информации о Ремонте", - "item.gtceu.tool.tooltip.repair_material": "§8Чинится: §f§a%s", + "tool.gtceu.attack_damage.tooltip": "§cНаносимый урон: %s", + "tool.gtceu.attack_speed.tooltip": "§9Скорость атаки: %s", + "tool.gtceu.crafting_uses.tooltip": "§aОсталось применений: %s", + "tool.gtceu.general_uses.tooltip": "§bОсталось использований: %s", + "tool.gtceu.harvest_level.tooltip": "§eУровень добычи: %s", + "tool.gtceu.harvest_level_extra.tooltip": "§eУровень добычи: %s §f(%s§f)", + "tool.gtceu.mining_speed.tooltip": "§dСкорость добычи: %s", + "tool.gtceu.repair_info.tooltip": "§8Удерживайте SHIFT для информации о Ремонте", + "tool.gtceu.repair_material.tooltip": "§8Чинится: §f§a%s", "item.gtceu.tool.usable_as": "§8Используется как: §f%s", "item.gtceu.tool.wire_cutter": "Кусачки (%s)", "item.gtceu.tool.wrench": "Ключ (%s)", @@ -3297,12 +3297,12 @@ "gtceu.machine.uv_lathe.tooltip": "§7Ротационный гриндер", "gtceu.machine.zpm_thermal_centrifuge.tooltip": "§7Пылающая потогонная система T-6352", "gtceu.machine.zpm_wiremill.tooltip": "§7Удлинитель слитка", - "gtceu.tool.class.shears": "Ножницы", - "gtceu.tool.class.spade": "Заступ", - "gtceu.tool.class.sword": "Меч", - "gtceu.tool.class.wire_cutter": "Кусачки", - "gtceu.tool.class.wrench": "Ключ", - "gtceu.tool.class.scythe": "Коса", + "tool.gtceu.class.shears": "Ножницы", + "tool.gtceu.class.spade": "Заступ", + "tool.gtceu.class.sword": "Меч", + "tool.gtceu.class.wire_cutter": "Кусачки", + "tool.gtceu.class.wrench": "Ключ", + "tool.gtceu.class.scythe": "Коса", "gtceu.machine.zpm_alloy_smelter.tooltip": "§7Сплавный интегратор", "gtceu.machine.zpm_arc_furnace.tooltip": "§7Нагнетательный нагреватель", "gtceu.machine.zpm_assembler.tooltip": "§7НЕ Верстак", @@ -3325,16 +3325,16 @@ "gtceu.machine.zpm_forming_press.tooltip": "§7Объектный компоновщик", "gtceu.machine.zpm_laser_engraver.tooltip": "§7C мощностью 32,64 МВт", "gtceu.machine.zpm_lathe.tooltip": "§7ФрезоТрон L-5908", - "gtceu.tool.class.butchery_knife": "Тесак", - "gtceu.tool.class.crowbar": "Монтировка", - "gtceu.tool.class.file": "Напильник", - "gtceu.tool.class.hammer": "Кувалда", - "gtceu.tool.class.hoe": "Мотыга", - "gtceu.tool.class.knife": "Нож", - "gtceu.tool.class.mining_hammer": "Шахтерский молот", - "gtceu.tool.class.mortar": "Ступа", - "gtceu.tool.class.pickaxe": "Кирка", - "gtceu.tool.class.plunger": "Вантуз", + "tool.gtceu.class.butchery_knife": "Тесак", + "tool.gtceu.class.crowbar": "Монтировка", + "tool.gtceu.class.file": "Напильник", + "tool.gtceu.class.hammer": "Кувалда", + "tool.gtceu.class.hoe": "Мотыга", + "tool.gtceu.class.knife": "Нож", + "tool.gtceu.class.mining_hammer": "Шахтерский молот", + "tool.gtceu.class.mortar": "Ступа", + "tool.gtceu.class.pickaxe": "Кирка", + "tool.gtceu.class.plunger": "Вантуз", "item.gtceu.advanced_item_detector_cover.tooltip": "§7Даёт §fRS-триггеру контроль§7 за §fСостоянием Хранилища предметов§7 Сигналом Красного камня как §fУлучшение механизма§7.", "item.gtceu.advanced_fluid_voiding_cover.tooltip.0": "§7Удаляет §fЖидкости§7 с контролем количества как §fУлучшение механизма§7.", "item.gtceu.advanced_fluid_voiding_cover.tooltip.1": "Требуется активация с помощью §fКиянки§7 после установки.", @@ -3383,12 +3383,12 @@ "gtceu.machine.zpm_rock_crusher.tooltip": "§7Криогенный отвердитель магмы R-10200", "gtceu.machine.zpm_scanner.tooltip": "§7Детектор аномалий", "gtceu.machine.zpm_sifter.tooltip": "§7При поддержке TFC", - "gtceu.tool.class.axe": "Топор", - "gtceu.tool.class.mallet": "Киянка", - "gtceu.tool.class.rolling_pin": "Скалка", - "gtceu.tool.class.saw": "Пила", - "gtceu.tool.class.screwdriver": "Отвертка", - "gtceu.tool.class.shovel": "Лопата", + "tool.gtceu.class.axe": "Топор", + "tool.gtceu.class.mallet": "Киянка", + "tool.gtceu.class.rolling_pin": "Скалка", + "tool.gtceu.class.saw": "Пила", + "tool.gtceu.class.screwdriver": "Отвертка", + "tool.gtceu.class.shovel": "Лопата", "item.glass_lens": "Стеклянная линза (Белый)", "item.gtceu.activity_detector_cover.tooltip": "§7Выдает §fПрогресс Работы§7 Сигналом Красного камня как §fУлучшение механизма§7.", "item.gtceu.advanced_activity_detector_cover.tooltip": "§7Выдает §fСтатус прогресса§7 Сигналом Красного камня как §fУлучшение механизма§7.", @@ -3630,9 +3630,9 @@ "item.gtceu.transistor.tooltip": "§7Обычный электронный компонент", "item.gtceu.turbine_rotor.tooltip": "Турбинные роторы для вашей электростанции", "item.gtceu.uhv_electric_motor": "Электрический мотор (§4UHV§r)", - "item.gtceu.tool.behavior.scrape": "§bПолировщик: §fУдаляет окись", - "item.gtceu.tool.behavior.strip_log": "§5Ремесленник: §fОчищает брёвна", - "item.gtceu.tool.behavior.remove_wax": "§6Чистильщик: §fУдаляет воск", + "tool.gtceu.behavior.scrape": "§bПолировщик: §fУдаляет окись", + "tool.gtceu.behavior.strip_log": "§5Ремесленник: §fОчищает брёвна", + "tool.gtceu.behavior.remove_wax": "§6Чистильщик: §fУдаляет воск", "item.gtceu.ash_dust": "Зола", "item.gtceu.basaltic_mineral_sand_dust": "Базальтовый минеральный песок", "item.gtceu.bone_dust": "Костная пыль", @@ -4410,7 +4410,7 @@ "item.gtceu.tool.hv_drill": "Бур (%s §6HV§r)", "item.gtceu.tool.hv_wrench.tooltip": "§8Удерживайте левую кнопку, чтобы демонтировать механизм", "item.gtceu.tool.lv_screwdriver.tooltip": "§8Настраивает улучшения и механизмы", - "gtceu.tool.class.drill": "Бур", + "tool.gtceu.class.drill": "Бур", "config.gtceu.option.addLoot": "addLoot", "config.gtceu.option.debug": "debug", "config.gtceu.option.increaseDungeonLoot": "increaseDungeonLoot", @@ -4976,7 +4976,7 @@ "material.gtceu.potassium_hydroxide": "Гидроксид калия", "material.gtceu.potassium_iodide": "Йодистый калий", "material.gtceu.sodium_nitrite": "Нитрит натрия", - "death.attack.gtceu.medical_condition/poison": "%s забыл что яды ядовиты", + "death.attack.gtceu.medical_condition.poison": "%s забыл что яды ядовиты", "material.gtceu.acetic_anhydride": "Уксусный ангидрид", "material.gtceu.calcium_carbonate": "Карбонат кальция", "material.gtceu.concentrated_bromine_solution": "Концентрированный раствор брома", @@ -5108,18 +5108,18 @@ "config.jade.plugin_gtceu.parallel_info": "[GTCEu] Параллель", "config.jade.plugin_gtceu.recipe_output_info": "[GTCEu] Вывод рецептов", "config.jade.plugin_gtceu.stained_color": "[GTCEu] Окрашенные блоки", - "death.attack.gtceu.medical_condition/arsenicosis": "%s отравился мышьяком", - "death.attack.gtceu.medical_condition/asbestosis": "%s умер от мезотелиомы", - "death.attack.gtceu.medical_condition/berylliosis": "%s добывал Изумруды слишком рьяно", - "death.attack.gtceu.medical_condition/carbon_monoxide_poisoning": "%s оставил плиту включенной", - "death.attack.gtceu.medical_condition/carcinogen": "У %s лейкемия", - "death.attack.gtceu.medical_condition/chemical_burns": "%s попал в химический инцидент", - "death.attack.gtceu.medical_condition/irritant": "%s получил §n§lОЧЕНЬ§r сильную сыпь", - "death.attack.gtceu.medical_condition/methanol_poisoning": "%s пробовал пить самогон во время сухого закона", - "death.attack.gtceu.medical_condition/nausea": "%s умер от тошноты", - "death.attack.gtceu.medical_condition/none": "%s умер от... ничего?", - "death.attack.gtceu.medical_condition/silicosis": "%s умер не от туберкулёза. Это был Силикоз.", - "death.attack.gtceu.medical_condition/weak_poison": "%s поел свинца (или ртути!)", + "death.attack.gtceu.medical_condition.arsenicosis": "%s отравился мышьяком", + "death.attack.gtceu.medical_condition.asbestosis": "%s умер от мезотелиомы", + "death.attack.gtceu.medical_condition.berylliosis": "%s добывал Изумруды слишком рьяно", + "death.attack.gtceu.medical_condition.carbon_monoxide_poisoning": "%s оставил плиту включенной", + "death.attack.gtceu.medical_condition.carcinogen": "У %s лейкемия", + "death.attack.gtceu.medical_condition.chemical_burns": "%s попал в химический инцидент", + "death.attack.gtceu.medical_condition.irritant": "%s получил §n§lОЧЕНЬ§r сильную сыпь", + "death.attack.gtceu.medical_condition.methanol_poisoning": "%s пробовал пить самогон во время сухого закона", + "death.attack.gtceu.medical_condition.nausea": "%s умер от тошноты", + "death.attack.gtceu.medical_condition.none": "%s умер от... ничего?", + "death.attack.gtceu.medical_condition.silicosis": "%s умер не от туберкулёза. Это был Силикоз.", + "death.attack.gtceu.medical_condition.weak_poison": "%s поел свинца (или ртути!)", "gtceu.air_scrubber": "Очиститель воздуха", "gtceu.duct_pipe.transfer_rate": "§bСкорость передачи воздуха: %s", "gtceu.evaporation": "Выпаривание", @@ -5439,7 +5439,7 @@ "gtceu.recipe.category.ore_forging": "Дробление руды", "item.gtceu.item_smart_filter": "Умный предметный фильтр", "item.gtceu.tool.mallet.tooltip.1": "§8Останавливает/Запускает механизм", - "item.gtceu.tool.tooltip.max_uses": "%s §eОбщая прочность", + "tool.gtceu.max_uses.tooltip": "%s §eОбщая прочность", "behaviour.soft_hammer.idle_after_cycle": "Остановить машину после текущего цикла", "block.gtceu.iv_fisher": "§9Превосходный рыболов §r", "config.gtceu.option.enableFEConverters": "enableFEConverters", @@ -5451,7 +5451,7 @@ "config.gtceu.option.hideFacadesInRecipeViewer": "hideFacadesInRecipeViewer", "config.gtceu.option.nativeEUToFE": "nativeEUToFE", "cover.item_smart_filter.filtering_mode.description.0": "Выберите машину, которую этот Умный фильтр будет использовать для фильтрации.", - "gtceu.command.hand.tag_entries": "§3Тэги:", + "command.gtceu.hand.tag_entries": "§3Тэги:", "gtceu.button.bedrock_fluids": "Показать залежи жидкостей в коренной породе", "item.gtceu.item_smart_filter.tooltip.0": "§7Фильтрует §fПредметы§7 на основе §fРецептов машин§7 как §fУлучшение механизма§7.", "item.gtceu.item_smart_filter.tooltip.1": "Может использоваться как улучшение §fКонвейера§7 и §fРобот. манипулятора§7.", diff --git a/src/main/resources/assets/gtceu/lang/uk_ua.json b/src/main/resources/assets/gtceu/lang/uk_ua.json index 85ffe7752e7..9714de76a67 100644 --- a/src/main/resources/assets/gtceu/lang/uk_ua.json +++ b/src/main/resources/assets/gtceu/lang/uk_ua.json @@ -1,18 +1,18 @@ { "translators": "discord: tenwoc, roll_54. for minestar.com.ua", - "death.attack.gtceu.medical_condition/arsenicosis": "%s отруївся миш'яком", - "death.attack.gtceu.medical_condition/asbestosis": "%s програв мезотеліомі", - "death.attack.gtceu.medical_condition/berylliosis": "%s надто жадав добувати смарагди", - "death.attack.gtceu.medical_condition/carbon_monoxide_poisoning": "%s залишив плиту увімкненою", - "death.attack.gtceu.medical_condition/carcinogen": "%s не витримав лейкемії", - "death.attack.gtceu.medical_condition/chemical_burns": "%s став учасником хімічної аварії", - "death.attack.gtceu.medical_condition/irritant": "%s отримав§n§l дУЖЕ§r сильний висип", - "death.attack.gtceu.medical_condition/methanol_poisoning": "%s наважився випити самогону в час сухого закону", - "death.attack.gtceu.medical_condition/nausea": "%s помер від нудоти", - "death.attack.gtceu.medical_condition/none": "%s помер від... нічого?", - "death.attack.gtceu.medical_condition/poison": "%s забув, що отруйні матеріали дійсно є отруйними", - "death.attack.gtceu.medical_condition/silicosis": "%s помер не від туберкульозу. Його життя обірвав силікоз.", - "death.attack.gtceu.medical_condition/weak_poison": "%s скуштував свинцю (або меркурію!)", + "death.attack.gtceu.medical_condition.arsenicosis": "%s отруївся миш'яком", + "death.attack.gtceu.medical_condition.asbestosis": "%s програв мезотеліомі", + "death.attack.gtceu.medical_condition.berylliosis": "%s надто жадав добувати смарагди", + "death.attack.gtceu.medical_condition.carbon_monoxide_poisoning": "%s залишив плиту увімкненою", + "death.attack.gtceu.medical_condition.carcinogen": "%s не витримав лейкемії", + "death.attack.gtceu.medical_condition.chemical_burns": "%s став учасником хімічної аварії", + "death.attack.gtceu.medical_condition.irritant": "%s отримав§n§l дУЖЕ§r сильний висип", + "death.attack.gtceu.medical_condition.methanol_poisoning": "%s наважився випити самогону в час сухого закону", + "death.attack.gtceu.medical_condition.nausea": "%s помер від нудоти", + "death.attack.gtceu.medical_condition.none": "%s помер від... нічого?", + "death.attack.gtceu.medical_condition.poison": "%s забув, що отруйні матеріали дійсно є отруйними", + "death.attack.gtceu.medical_condition.silicosis": "%s помер не від туберкульозу. Його життя обірвав силікоз.", + "death.attack.gtceu.medical_condition.weak_poison": "%s скуштував свинцю (або меркурію!)", "death.attack.gtceu.explosion": "%s вибухнув", "death.attack.gtceu.explosion.player": "%s вибухнув за допомогою %s", "death.attack.gtceu.frost": "%s пізнав кріогеніку", @@ -360,15 +360,15 @@ "item.gtceu.sus_record.desc": "§7підозріло!", "item.record.sus.tooltip": "§7Leonz - Among Us Drip", - "item.gtceu.tool.tooltip.attack_speed": "%s§9 швидкости атаки", - "item.gtceu.tool.tooltip.crafting_uses": "%s§a використань у майструванні", - "item.gtceu.tool.tooltip.general_uses": "%s§b міцности", - "item.gtceu.tool.tooltip.attack_damage": "%s§c шкоди від атаки", - "item.gtceu.tool.tooltip.mining_speed": "%s§d швидкости добування", - "item.gtceu.tool.tooltip.max_uses": "%s§e загальної міцности", - "item.gtceu.tool.tooltip.repair_material": "§8Придатне для ремонту:§f§a %s", - "item.gtceu.tool.tooltip.harvest_level": "§eРівень добування %s", - "item.gtceu.tool.tooltip.harvest_level_extra": "§eРівень добування %s§f (%s§f)", + "tool.gtceu.attack_speed.tooltip": "%s§9 швидкости атаки", + "tool.gtceu.crafting_uses.tooltip": "%s§a використань у майструванні", + "tool.gtceu.general_uses.tooltip": "%s§b міцности", + "tool.gtceu.attack_damage.tooltip": "%s§c шкоди від атаки", + "tool.gtceu.mining_speed.tooltip": "%s§d швидкости добування", + "tool.gtceu.max_uses.tooltip": "%s§e загальної міцности", + "tool.gtceu.repair_material.tooltip": "§8Придатне для ремонту:§f§a %s", + "tool.gtceu.harvest_level.tooltip": "§eРівень добування %s", + "tool.gtceu.harvest_level_extra.tooltip": "§eРівень добування %s§f (%s§f)", "item.gtceu.tool.harvest_level.0": "§8Дерево", "item.gtceu.tool.harvest_level.1": "§7Камінь", "item.gtceu.tool.harvest_level.2": "§aЗалізо", @@ -376,22 +376,22 @@ "item.gtceu.tool.harvest_level.4": "§dНезерит", "item.gtceu.tool.harvest_level.5": "§9Дюран", "item.gtceu.tool.harvest_level.6": "§cНейтроній", - "item.gtceu.tool.behavior.relocate_mining": "§2Магнетизм:§f телепортує добуті блоки та дроп мобів", - "item.gtceu.tool.behavior.block_rotation": "§2Механіка:§f Обертає блоки", - "item.gtceu.tool.behavior.damage_boost": "§4Збільшення шкоди:§f додаткова шкода проти %s", - "item.gtceu.tool.behavior.tree_felling": "§4Лісоруб:§f повал дерев", - "item.gtceu.tool.behavior.aoe_mining": "§5Ефект по площі:§f %sx%sx%s", - "item.gtceu.tool.behavior.strip_log": "§5Ремісник:§f Обсічує колоди", - "item.gtceu.tool.behavior.remove_wax": "§6Очисник:§f знімає віск", - "item.gtceu.tool.behavior.plunger": "§9Вантуз:§f викачує рідини", - "item.gtceu.tool.behavior.crop_harvesting": "§aЖнивар:§f збирає дозрілі культури", - "item.gtceu.tool.behavior.silk_ice": "§bЛьодоріз:§f Шовково добуває лід", - "item.gtceu.tool.behavior.scrape": "§bПолірувальник:§f видаляє окиснення", - "item.gtceu.tool.behavior.shield_disable": "§cБрутал:§f знешкоджує щити", - "item.gtceu.tool.behavior.ground_tilling": "§eФермер:§f Оре ґрунт", - "item.gtceu.tool.behavior.grass_path": "§eКаток:§f створює трав'яні доріжки", - "item.gtceu.tool.behavior.rail_rotation": "§eЗалізничний інженер:§f повертає рейки", - "item.gtceu.tool.behavior.torch_place": "§eСпелеолог:§f розміщує смолоскипи на ПКМ", + "tool.gtceu.behavior.relocate_mining": "§2Магнетизм:§f телепортує добуті блоки та дроп мобів", + "tool.gtceu.behavior.block_rotation": "§2Механіка:§f Обертає блоки", + "tool.gtceu.behavior.damage_boost": "§4Збільшення шкоди:§f додаткова шкода проти %s", + "tool.gtceu.behavior.tree_felling": "§4Лісоруб:§f повал дерев", + "tool.gtceu.behavior.aoe_mining": "§5Ефект по площі:§f %sx%sx%s", + "tool.gtceu.behavior.strip_log": "§5Ремісник:§f Обсічує колоди", + "tool.gtceu.behavior.remove_wax": "§6Очисник:§f знімає віск", + "tool.gtceu.behavior.plunger": "§9Вантуз:§f викачує рідини", + "tool.gtceu.behavior.crop_harvesting": "§aЖнивар:§f збирає дозрілі культури", + "tool.gtceu.behavior.silk_ice": "§bЛьодоріз:§f Шовково добуває лід", + "tool.gtceu.behavior.scrape": "§bПолірувальник:§f видаляє окиснення", + "tool.gtceu.behavior.shield_disable": "§cБрутал:§f знешкоджує щити", + "tool.gtceu.behavior.ground_tilling": "§eФермер:§f Оре ґрунт", + "tool.gtceu.behavior.grass_path": "§eКаток:§f створює трав'яні доріжки", + "tool.gtceu.behavior.rail_rotation": "§eЗалізничний інженер:§f повертає рейки", + "tool.gtceu.behavior.torch_place": "§eСпелеолог:§f розміщує смолоскипи на ПКМ", "item.gtceu.tool.usable_as": "§8Використовується як:§f %s", "item.gtceu.tool.plunger.tooltip": "§8Видаляє рідини з машин", "item.gtceu.tool.lighter.platinum.tooltip": "§7На ній викарбуваний відомий майстер пранків", @@ -459,29 +459,29 @@ "item.gtceu.invar_lighter": "Інварова запальничка", "item.gtceu.platinum_lighter": "Платинова запальничка", - "gtceu.tool.class.axe": "Сокира", - "gtceu.tool.class.butchery_knife": "М'ясний ніж", - "gtceu.tool.class.crowbar": "Лом", - "gtceu.tool.class.drill": "Бур", - "gtceu.tool.class.file": "Напилок", - "gtceu.tool.class.hammer": "Молот", - "gtceu.tool.class.hoe": "Мотика", - "gtceu.tool.class.knife": "Ніж", - "gtceu.tool.class.mining_hammer": "Шахтарський молот", - "gtceu.tool.class.mortar": "Ступка", - "gtceu.tool.class.pickaxe": "Кайло", - "gtceu.tool.class.plunger": "Вантуз", - "gtceu.tool.class.rolling_pin": "Качалка", - "gtceu.tool.class.saw": "Пила", - "gtceu.tool.class.screwdriver": "Викрутка", - "gtceu.tool.class.scythe": "Коса", - "gtceu.tool.class.shears": "Ножиці", - "gtceu.tool.class.shovel": "Лопата", - "gtceu.tool.class.mallet": "М'який молоток", - "gtceu.tool.class.spade": "Заступ", - "gtceu.tool.class.sword": "Меч", - "gtceu.tool.class.wire_cutter": "Кусачки", - "gtceu.tool.class.wrench": "Гайковий ключ", + "tool.gtceu.class.axe": "Сокира", + "tool.gtceu.class.butchery_knife": "М'ясний ніж", + "tool.gtceu.class.crowbar": "Лом", + "tool.gtceu.class.drill": "Бур", + "tool.gtceu.class.file": "Напилок", + "tool.gtceu.class.hammer": "Молот", + "tool.gtceu.class.hoe": "Мотика", + "tool.gtceu.class.knife": "Ніж", + "tool.gtceu.class.mining_hammer": "Шахтарський молот", + "tool.gtceu.class.mortar": "Ступка", + "tool.gtceu.class.pickaxe": "Кайло", + "tool.gtceu.class.plunger": "Вантуз", + "tool.gtceu.class.rolling_pin": "Качалка", + "tool.gtceu.class.saw": "Пила", + "tool.gtceu.class.screwdriver": "Викрутка", + "tool.gtceu.class.scythe": "Коса", + "tool.gtceu.class.shears": "Ножиці", + "tool.gtceu.class.shovel": "Лопата", + "tool.gtceu.class.mallet": "М'який молоток", + "tool.gtceu.class.spade": "Заступ", + "tool.gtceu.class.sword": "Меч", + "tool.gtceu.class.wire_cutter": "Кусачки", + "tool.gtceu.class.wrench": "Гайковий ключ", "gtceu.multiblock.assembly_line.description": "Конвеєрна лінія - це велика багатоблочна конструкція, що складається з 5 до 16 \"скибок\". теоретично, це великий збиральний апарат, який використовується для створення просунутих крафтових компонентів.", "gtceu.multiblock.charcoal_pile.description.0": "Перетворює колоди на крихке деревне вугілля в зоні 9х4х9 під собою.", @@ -1502,7 +1502,7 @@ "gui.widget.incrementButton.default_tooltip": "Утримуйте Shift, Ctrl чи обидва, щоб змінити кількість", "gtceu.machine.cleanroom.tooltip.hold_ctrl": "Утримуйте CTRL, щоб показати додаткову інформацію конструкції", "behaviour.lighter.tooltip.usage": "Shift+ПКМ, щоб відкрити/закрити", - "item.gtceu.tool.tooltip.repair_info": "§8Утримуйте Shift, щоб показати інформацію з ремонтування", + "tool.gtceu.repair_info.tooltip": "§8Утримуйте Shift, щоб показати інформацію з ремонтування", "block.gtceu.wire_coil.tooltip_extended_info": "§7Утримуйте Shift, щоб показати інформацію з бонусу котушки", "item.behavior.mode_switch.current_mode": "Режим: %s", "item.behavior.mode_switch.mode_switched": "§eРежим встановлено на: %s", @@ -5369,32 +5369,32 @@ "config.gtceu.option.yOffset": "yOffset", "config.gtceu.option.zombieSpawnWithSabers": "zombieSpawnWithSabers", - "gtceu.command.copy.click_to_copy": "Клацніть, щоб скопіювати", - "gtceu.command.copy.copied_and_click": "скопійовано в буфер обміну. Натисніть, щоб скопіювати ще раз", - "gtceu.command.copy.copied_end": "] до буфера обміну", - "gtceu.command.copy.copied_start": "Скопійовано [", - "gtceu.command.hand.electric": "Інформація про електрику: %d / %d EU - Tier: %d; Is Battery: %s", - "gtceu.command.hand.fluid": "Інформація про рідину: %d / %d мВ; Can Fill: %s; Can Drain: %s", - "gtceu.command.hand.fluid2": "Id рідини:", - "gtceu.command.hand.groovy": "Можливість використання§6 /gs hand", - "gtceu.command.hand.item_id": "Предмет: %s (метадані: %d)", - "gtceu.command.hand.material": "Id матеріалу:", - "gtceu.command.hand.meta_item": "Id метапредмету:", - "gtceu.command.hand.no_item": "Перед виконанням цієї команди ви повинні тримати щось в основній або іншій руці.", - "gtceu.command.hand.not_a_player": "Ця команда може бути виконана лише гравцем.", - "gtceu.command.hand.ore_prefix": "Префікс руди:", - "gtceu.command.hand.tag_entries": "§3Записи тегів:", - "gtceu.command.hand.tool_stats": "Класс характеристик інструмента: %s", - "gtceu.command.hand.usage": "Використання: /gtceu hand", - "gtceu.command.recipecheck.begin": "Починаємо перевірку конфлікту рецептів...", - "gtceu.command.recipecheck.end": "Перевірка конфліктів рецептів знайшла %d можливих конфліктів. Перевірте журнал сервера для отримання додаткової інформації", - "gtceu.command.recipecheck.end_no_conflicts": "Конфліктних рецептів не виявлено!", - "gtceu.command.recipecheck.usage": "Використання: /gtceu recipecheck", - "gtceu.command.usage": "Використання: /gtceu ", - "gtceu.command.worldgen.reload.failed": "Не вдалося перезавантажити генерацію світу. Перевірте консоль на наявність помилок.", - "gtceu.command.worldgen.reload.success": "Генерацію світу успішно перезавантажено з конфігурації.", - "gtceu.command.worldgen.reload.usage": "Використання: /gtceu worldgen reload", - "gtceu.command.worldgen.usage": "Використання: /gtceu worldgen ", + "command.gtceu.copy.click_to_copy": "Клацніть, щоб скопіювати", + "command.gtceu.copy.copied_and_click": "скопійовано в буфер обміну. Натисніть, щоб скопіювати ще раз", + "command.gtceu.copy.copied_end": "] до буфера обміну", + "command.gtceu.copy.copied_start": "Скопійовано [", + "command.gtceu.hand.electric": "Інформація про електрику: %d / %d EU - Tier: %d; Is Battery: %s", + "command.gtceu.hand.fluid": "Інформація про рідину: %d / %d мВ; Can Fill: %s; Can Drain: %s", + "command.gtceu.hand.fluid2": "Id рідини:", + "command.gtceu.hand.groovy": "Можливість використання§6 /gs hand", + "command.gtceu.hand.item_id": "Предмет: %s (метадані: %d)", + "command.gtceu.hand.material": "Id матеріалу:", + "command.gtceu.hand.meta_item": "Id метапредмету:", + "command.gtceu.hand.no_item": "Перед виконанням цієї команди ви повинні тримати щось в основній або іншій руці.", + "command.gtceu.hand.not_a_player": "Ця команда може бути виконана лише гравцем.", + "command.gtceu.hand.ore_prefix": "Префікс руди:", + "command.gtceu.hand.tag_entries": "§3Записи тегів:", + "command.gtceu.hand.tool_stats": "Класс характеристик інструмента: %s", + "command.gtceu.hand.usage": "Використання: /gtceu hand", + "command.gtceu.recipecheck.begin": "Починаємо перевірку конфлікту рецептів...", + "command.gtceu.recipecheck.end": "Перевірка конфліктів рецептів знайшла %d можливих конфліктів. Перевірте журнал сервера для отримання додаткової інформації", + "command.gtceu.recipecheck.end_no_conflicts": "Конфліктних рецептів не виявлено!", + "command.gtceu.recipecheck.usage": "Використання: /gtceu recipecheck", + "command.gtceu.usage": "Використання: /gtceu ", + "command.gtceu.worldgen.reload.failed": "Не вдалося перезавантажити генерацію світу. Перевірте консоль на наявність помилок.", + "command.gtceu.worldgen.reload.success": "Генерацію світу успішно перезавантажено з конфігурації.", + "command.gtceu.worldgen.reload.usage": "Використання: /gtceu worldgen reload", + "command.gtceu.worldgen.usage": "Використання: /gtceu worldgen ", "gtceu.key.armor_charging": "Перемикач заряджання інвентаря від броні", "gtceu.key.armor_hover": "Перемикач наведення броні", diff --git a/src/main/resources/assets/gtceu/lang/zh_cn.json b/src/main/resources/assets/gtceu/lang/zh_cn.json index ef7fcd261e3..ac160e887fe 100644 --- a/src/main/resources/assets/gtceu/lang/zh_cn.json +++ b/src/main/resources/assets/gtceu/lang/zh_cn.json @@ -2092,19 +2092,19 @@ "death.attack.gtceu.hoe": "%s被%s锄死了", "death.attack.gtceu.knife": "%2$s绅士地捅了%1$s几刀", "death.attack.gtceu.mallet": "%s被%s用锤头活活敲死了", - "death.attack.gtceu.medical_condition/arsenicosis": "%s死于砷中毒", - "death.attack.gtceu.medical_condition/asbestosis": "%s得了间皮瘤", - "death.attack.gtceu.medical_condition/berylliosis": "%s贪婪地挖掘绿宝石,结果有点过火了", - "death.attack.gtceu.medical_condition/carbon_monoxide_poisoning": "%s离开时炉子还开着", - "death.attack.gtceu.medical_condition/carcinogen": "%s身患白血病", - "death.attack.gtceu.medical_condition/chemical_burns": "%s历经了一场化学事故", - "death.attack.gtceu.medical_condition/irritant": "%s身上长了§n§l极其严重§r的皮疹", - "death.attack.gtceu.medical_condition/methanol_poisoning": "%s在禁酒令下尝试饮用私酿烈酒", - "death.attack.gtceu.medical_condition/nausea": "%s死于恶心", - "death.attack.gtceu.medical_condition/none": "%s死于...什么都没有?", - "death.attack.gtceu.medical_condition/poison": "%s忘了毒物的确有毒", - "death.attack.gtceu.medical_condition/silicosis": "%s不是死于肺结核,而是矽肺病", - "death.attack.gtceu.medical_condition/weak_poison": "%s吞下了铅(或水银!)", + "death.attack.gtceu.medical_condition.arsenicosis": "%s死于砷中毒", + "death.attack.gtceu.medical_condition.asbestosis": "%s得了间皮瘤", + "death.attack.gtceu.medical_condition.berylliosis": "%s贪婪地挖掘绿宝石,结果有点过火了", + "death.attack.gtceu.medical_condition.carbon_monoxide_poisoning": "%s离开时炉子还开着", + "death.attack.gtceu.medical_condition.carcinogen": "%s身患白血病", + "death.attack.gtceu.medical_condition.chemical_burns": "%s历经了一场化学事故", + "death.attack.gtceu.medical_condition.irritant": "%s身上长了§n§l极其严重§r的皮疹", + "death.attack.gtceu.medical_condition.methanol_poisoning": "%s在禁酒令下尝试饮用私酿烈酒", + "death.attack.gtceu.medical_condition.nausea": "%s死于恶心", + "death.attack.gtceu.medical_condition.none": "%s死于...什么都没有?", + "death.attack.gtceu.medical_condition.poison": "%s忘了毒物的确有毒", + "death.attack.gtceu.medical_condition.silicosis": "%s不是死于肺结核,而是矽肺病", + "death.attack.gtceu.medical_condition.weak_poison": "%s吞下了铅(或水银!)", "death.attack.gtceu.mining_hammer": "%s被%s当成矿石砸死了", "death.attack.gtceu.mortar": "%s被%s用研钵磨成了粉", "death.attack.gtceu.pickaxe": "%s被%s用镐子凿死了", @@ -2173,32 +2173,32 @@ "gtceu.circuit_assembler": "电路组装机", "gtceu.coke_oven": "焦炉", "gtceu.combustion_generator": "内燃发电机", - "gtceu.command.copy.click_to_copy": "点击复制", - "gtceu.command.copy.copied_and_click": "已复制到剪贴板,点击再次复制", - "gtceu.command.copy.copied_end": "]到剪贴板", - "gtceu.command.copy.copied_start": "已复制[", - "gtceu.command.hand.electric": "电量信息:%d / %d EU - 等级:%d; 是否为电池:%s", - "gtceu.command.hand.fluid": "流体信息:%d / %d mB;是否可输入:%s; 是否可输出:%s", - "gtceu.command.hand.fluid2": "流体 ID:", - "gtceu.command.hand.groovy": "考虑使用§6/gs hand", - "gtceu.command.hand.item_id": "物品:%s(元数据:%d)", - "gtceu.command.hand.material": "材料 ID:", - "gtceu.command.hand.meta_item": "元物品 ID:", - "gtceu.command.hand.no_item": "在执行此命令之前,您的主手或副手必须拿着物品。", - "gtceu.command.hand.not_a_player": "这个命令只有玩家可以使用。", - "gtceu.command.hand.ore_prefix": "矿物前缀:", - "gtceu.command.hand.tag_entries": "§3标签条目:", - "gtceu.command.hand.tool_stats": "工具状态类:%s", - "gtceu.command.hand.usage": "用法:/gtceu hand", - "gtceu.command.recipecheck.begin": "开始配方冲突检查...", - "gtceu.command.recipecheck.end": "配方冲突检查找到%d可能存在的冲突,查看服务器日志以了解更多信息", - "gtceu.command.recipecheck.end_no_conflicts": "未发现配方冲突!", - "gtceu.command.recipecheck.usage": "用法:/gtceu recipecheck", - "gtceu.command.usage": "用法:/gtceu ", - "gtceu.command.worldgen.reload.failed": "Worldgen重新加载失败。检查控制台是否有错误。", - "gtceu.command.worldgen.reload.success": "Worldgen已成功从配置重新加载。", - "gtceu.command.worldgen.reload.usage": "用法:/gtceu worldgen reload", - "gtceu.command.worldgen.usage": "用法:/gtceu worldgen ", + "command.gtceu.copy.click_to_copy": "点击复制", + "command.gtceu.copy.copied_and_click": "已复制到剪贴板,点击再次复制", + "command.gtceu.copy.copied_end": "]到剪贴板", + "command.gtceu.copy.copied_start": "已复制[", + "command.gtceu.hand.electric": "电量信息:%d / %d EU - 等级:%d; 是否为电池:%s", + "command.gtceu.hand.fluid": "流体信息:%d / %d mB;是否可输入:%s; 是否可输出:%s", + "command.gtceu.hand.fluid2": "流体 ID:", + "command.gtceu.hand.groovy": "考虑使用§6/gs hand", + "command.gtceu.hand.item_id": "物品:%s(元数据:%d)", + "command.gtceu.hand.material": "材料 ID:", + "command.gtceu.hand.meta_item": "元物品 ID:", + "command.gtceu.hand.no_item": "在执行此命令之前,您的主手或副手必须拿着物品。", + "command.gtceu.hand.not_a_player": "这个命令只有玩家可以使用。", + "command.gtceu.hand.ore_prefix": "矿物前缀:", + "command.gtceu.hand.tag_entries": "§3标签条目:", + "command.gtceu.hand.tool_stats": "工具状态类:%s", + "command.gtceu.hand.usage": "用法:/gtceu hand", + "command.gtceu.recipecheck.begin": "开始配方冲突检查...", + "command.gtceu.recipecheck.end": "配方冲突检查找到%d可能存在的冲突,查看服务器日志以了解更多信息", + "command.gtceu.recipecheck.end_no_conflicts": "未发现配方冲突!", + "command.gtceu.recipecheck.usage": "用法:/gtceu recipecheck", + "command.gtceu.usage": "用法:/gtceu ", + "command.gtceu.worldgen.reload.failed": "Worldgen重新加载失败。检查控制台是否有错误。", + "command.gtceu.worldgen.reload.success": "Worldgen已成功从配置重新加载。", + "command.gtceu.worldgen.reload.usage": "用法:/gtceu worldgen reload", + "command.gtceu.worldgen.usage": "用法:/gtceu worldgen ", "gtceu.compressor": "压缩机", "gtceu.cover.activity_detector.message_activity_inverted": "正在以反相模式监控活动状态", "gtceu.cover.activity_detector.message_activity_normal": "正在以普通模式监控活动状态", @@ -3484,29 +3484,29 @@ "gtceu.subtitle.wirecutter": "剪线钳:剪断", "gtceu.subtitle.wrench": "扳手:嘎啦", "gtceu.thermal_centrifuge": "热力离心机", - "gtceu.tool.class.axe": "斧", - "gtceu.tool.class.butchery_knife": "屠刀", - "gtceu.tool.class.crowbar": "撬棍", - "gtceu.tool.class.drill": "电钻", - "gtceu.tool.class.file": "锉", - "gtceu.tool.class.hammer": "锤", - "gtceu.tool.class.hoe": "锄", - "gtceu.tool.class.knife": "刀", - "gtceu.tool.class.mallet": "软锤", - "gtceu.tool.class.mining_hammer": "采矿锤", - "gtceu.tool.class.mortar": "研钵", - "gtceu.tool.class.pickaxe": "镐", - "gtceu.tool.class.plunger": "搋子", - "gtceu.tool.class.rolling_pin": "擀面杖", - "gtceu.tool.class.saw": "锯", - "gtceu.tool.class.screwdriver": "螺丝刀", - "gtceu.tool.class.scythe": "镰刀", - "gtceu.tool.class.shears": "剪刀", - "gtceu.tool.class.shovel": "锹", - "gtceu.tool.class.spade": "铲", - "gtceu.tool.class.sword": "剑", - "gtceu.tool.class.wire_cutter": "剪线钳", - "gtceu.tool.class.wrench": "扳手", + "tool.gtceu.class.axe": "斧", + "tool.gtceu.class.butchery_knife": "屠刀", + "tool.gtceu.class.crowbar": "撬棍", + "tool.gtceu.class.drill": "电钻", + "tool.gtceu.class.file": "锉", + "tool.gtceu.class.hammer": "锤", + "tool.gtceu.class.hoe": "锄", + "tool.gtceu.class.knife": "刀", + "tool.gtceu.class.mallet": "软锤", + "tool.gtceu.class.mining_hammer": "采矿锤", + "tool.gtceu.class.mortar": "研钵", + "tool.gtceu.class.pickaxe": "镐", + "tool.gtceu.class.plunger": "搋子", + "tool.gtceu.class.rolling_pin": "擀面杖", + "tool.gtceu.class.saw": "锯", + "tool.gtceu.class.screwdriver": "螺丝刀", + "tool.gtceu.class.scythe": "镰刀", + "tool.gtceu.class.shears": "剪刀", + "tool.gtceu.class.shovel": "锹", + "tool.gtceu.class.spade": "铲", + "tool.gtceu.class.sword": "剑", + "tool.gtceu.class.wire_cutter": "剪线钳", + "tool.gtceu.class.wrench": "扳手", "gtceu.tool_action.crowbar": "§8使用撬棍卸下覆盖板", "gtceu.tool_action.hammer": "§8使用锻造锤消除声响", "gtceu.tool_action.screwdriver.access_covers": "§8使用螺丝刀访问覆盖板", @@ -4417,22 +4417,22 @@ "item.gtceu.tool.aoe.layers": "层", "item.gtceu.tool.aoe.rows": "行", "item.gtceu.tool.axe": "%s斧", - "item.gtceu.tool.behavior.aoe_mining": "§5作用范围:§f%sx%sx%s", - "item.gtceu.tool.behavior.block_rotation": "§2精械师傅:§f旋转方块", - "item.gtceu.tool.behavior.crop_harvesting": "§a庄稼收割:§f收获成熟的作物", - "item.gtceu.tool.behavior.damage_boost": "§4伤害增益:§f对%s造成额外伤害", - "item.gtceu.tool.behavior.grass_path": "§e园林策划:§f制造草径", - "item.gtceu.tool.behavior.ground_tilling": "§e耕地农夫:§f耕耘土地", - "item.gtceu.tool.behavior.plunger": "§9水管工人:§f清除流体", - "item.gtceu.tool.behavior.rail_rotation": "§e铁路技工:§f旋转轨道", - "item.gtceu.tool.behavior.relocate_mining": "§2磁力吸引:§f吸入采掘的方块与生物掉落物", - "item.gtceu.tool.behavior.remove_wax": "§6清洁试剂:§f脱蜡", - "item.gtceu.tool.behavior.scrape": "§b抛光工艺:§f除锈", - "item.gtceu.tool.behavior.shield_disable": "§c野兽蛮攻:§f无视盾牌", - "item.gtceu.tool.behavior.silk_ice": "§b切冰利刃:§f精准采集冰块", - "item.gtceu.tool.behavior.strip_log": "§5林业工匠:§f剥去原木的表皮", - "item.gtceu.tool.behavior.torch_place": "§e洞窟探客:§f右击放置火把", - "item.gtceu.tool.behavior.tree_felling": "§4伐木好手:§f连锁砍树", + "tool.gtceu.behavior.aoe_mining": "§5作用范围:§f%sx%sx%s", + "tool.gtceu.behavior.block_rotation": "§2精械师傅:§f旋转方块", + "tool.gtceu.behavior.crop_harvesting": "§a庄稼收割:§f收获成熟的作物", + "tool.gtceu.behavior.damage_boost": "§4伤害增益:§f对%s造成额外伤害", + "tool.gtceu.behavior.grass_path": "§e园林策划:§f制造草径", + "tool.gtceu.behavior.ground_tilling": "§e耕地农夫:§f耕耘土地", + "tool.gtceu.behavior.plunger": "§9水管工人:§f清除流体", + "tool.gtceu.behavior.rail_rotation": "§e铁路技工:§f旋转轨道", + "tool.gtceu.behavior.relocate_mining": "§2磁力吸引:§f吸入采掘的方块与生物掉落物", + "tool.gtceu.behavior.remove_wax": "§6清洁试剂:§f脱蜡", + "tool.gtceu.behavior.scrape": "§b抛光工艺:§f除锈", + "tool.gtceu.behavior.shield_disable": "§c野兽蛮攻:§f无视盾牌", + "tool.gtceu.behavior.silk_ice": "§b切冰利刃:§f精准采集冰块", + "tool.gtceu.behavior.strip_log": "§5林业工匠:§f剥去原木的表皮", + "tool.gtceu.behavior.torch_place": "§e洞窟探客:§f右击放置火把", + "tool.gtceu.behavior.tree_felling": "§4伐木好手:§f连锁砍树", "item.gtceu.tool.butchery_knife": "%s屠刀", "item.gtceu.tool.butchery_knife.tooltip": "§8攻击速度较慢", "item.gtceu.tool.buzzsaw": "%s圆锯(§7LV§r)", @@ -4493,16 +4493,16 @@ "item.gtceu.tool.spade": "%s铲", "item.gtceu.tool.spade.tooltip": "§8一次性开采大片区域(除非你蹲下)", "item.gtceu.tool.sword": "%s剑", - "item.gtceu.tool.tooltip.attack_damage": "§c攻击伤害§r:%s", - "item.gtceu.tool.tooltip.attack_speed": "§9攻击速度§r:%s", - "item.gtceu.tool.tooltip.crafting_uses": "§a合成耐久度§r:%s", - "item.gtceu.tool.tooltip.general_uses": "§b耐久度§r:%s", - "item.gtceu.tool.tooltip.harvest_level": "§e采掘等级:%s", - "item.gtceu.tool.tooltip.harvest_level_extra": "§e采掘等级:%s§f(%s§f)", - "item.gtceu.tool.tooltip.max_uses": "§e最大耐久度§r:%s", - "item.gtceu.tool.tooltip.mining_speed": "§d采掘速度§r:%s", - "item.gtceu.tool.tooltip.repair_info": "§8按住SHIFT显示修复详情", - "item.gtceu.tool.tooltip.repair_material": "§8修复材料§r:§f§a%s", + "tool.gtceu.attack_damage.tooltip": "§c攻击伤害§r:%s", + "tool.gtceu.attack_speed.tooltip": "§9攻击速度§r:%s", + "tool.gtceu.crafting_uses.tooltip": "§a合成耐久度§r:%s", + "tool.gtceu.general_uses.tooltip": "§b耐久度§r:%s", + "tool.gtceu.harvest_level.tooltip": "§e采掘等级:%s", + "tool.gtceu.harvest_level_extra.tooltip": "§e采掘等级:%s§f(%s§f)", + "tool.gtceu.max_uses.tooltip": "§e最大耐久度§r:%s", + "tool.gtceu.mining_speed.tooltip": "§d采掘速度§r:%s", + "tool.gtceu.repair_info.tooltip": "§8按住SHIFT显示修复详情", + "tool.gtceu.repair_material.tooltip": "§8修复材料§r:§f§a%s", "item.gtceu.tool.usable_as": "§8可用作§r:§f%s", "item.gtceu.tool.wire_cutter": "%s剪线钳", "item.gtceu.tool.wrench": "%s扳手", diff --git a/src/main/resources/assets/gtceu/lang/zh_tw.json b/src/main/resources/assets/gtceu/lang/zh_tw.json index 098992f538b..8512d430c47 100644 --- a/src/main/resources/assets/gtceu/lang/zh_tw.json +++ b/src/main/resources/assets/gtceu/lang/zh_tw.json @@ -2092,19 +2092,19 @@ "death.attack.gtceu.hoe": "%s被%s鋤死了", "death.attack.gtceu.knife": "%2$s紳士地捅了%1$s幾刀", "death.attack.gtceu.mallet": "%s被%s用錘頭活活敲死了", - "death.attack.gtceu.medical_condition/arsenicosis": "%s死於砷中毒", - "death.attack.gtceu.medical_condition/asbestosis": "%s得了間皮瘤", - "death.attack.gtceu.medical_condition/berylliosis": "%s貪婪地挖掘綠寶石,結果有點過火了", - "death.attack.gtceu.medical_condition/carbon_monoxide_poisoning": "%s離開時爐子還開着", - "death.attack.gtceu.medical_condition/carcinogen": "%s身患白血病", - "death.attack.gtceu.medical_condition/chemical_burns": "%s歷經了一場化學事故", - "death.attack.gtceu.medical_condition/irritant": "%s身上長了§n§l極其嚴重§r的皮疹", - "death.attack.gtceu.medical_condition/methanol_poisoning": "%s在禁酒令下嘗試飲用私釀烈酒", - "death.attack.gtceu.medical_condition/nausea": "%s死於噁心", - "death.attack.gtceu.medical_condition/none": "%s死於...什麼都沒有?", - "death.attack.gtceu.medical_condition/poison": "%s忘了毒物的確有毒", - "death.attack.gtceu.medical_condition/silicosis": "%s不是死於肺結核,而是矽肺病", - "death.attack.gtceu.medical_condition/weak_poison": "%s吞下了鉛(或水銀!)", + "death.attack.gtceu.medical_condition.arsenicosis": "%s死於砷中毒", + "death.attack.gtceu.medical_condition.asbestosis": "%s得了間皮瘤", + "death.attack.gtceu.medical_condition.berylliosis": "%s貪婪地挖掘綠寶石,結果有點過火了", + "death.attack.gtceu.medical_condition.carbon_monoxide_poisoning": "%s離開時爐子還開着", + "death.attack.gtceu.medical_condition.carcinogen": "%s身患白血病", + "death.attack.gtceu.medical_condition.chemical_burns": "%s歷經了一場化學事故", + "death.attack.gtceu.medical_condition.irritant": "%s身上長了§n§l極其嚴重§r的皮疹", + "death.attack.gtceu.medical_condition.methanol_poisoning": "%s在禁酒令下嘗試飲用私釀烈酒", + "death.attack.gtceu.medical_condition.nausea": "%s死於噁心", + "death.attack.gtceu.medical_condition.none": "%s死於...什麼都沒有?", + "death.attack.gtceu.medical_condition.poison": "%s忘了毒物的確有毒", + "death.attack.gtceu.medical_condition.silicosis": "%s不是死於肺結核,而是矽肺病", + "death.attack.gtceu.medical_condition.weak_poison": "%s吞下了鉛(或水銀!)", "death.attack.gtceu.mining_hammer": "%s被%s當成礦砸死了", "death.attack.gtceu.mortar": "%s被%s用研缽磨成了粉", "death.attack.gtceu.pickaxe": "%s被%s用鎬子鑿死了", @@ -2173,32 +2173,32 @@ "gtceu.circuit_assembler": "電路組裝機", "gtceu.coke_oven": "焦爐", "gtceu.combustion_generator": "內燃發電機", - "gtceu.command.copy.click_to_copy": "點選複製", - "gtceu.command.copy.copied_and_click": "已複製到剪貼簿,點選再次複製", - "gtceu.command.copy.copied_end": "]到剪貼簿", - "gtceu.command.copy.copied_start": "已複製[", - "gtceu.command.hand.electric": "電量資訊:%d / %d EU - 等級:%d; 是否為電池:%s", - "gtceu.command.hand.fluid": "流體資訊:%d / %d mB;是否可輸入:%s; 是否可輸出:%s", - "gtceu.command.hand.fluid2": "流體 ID:", - "gtceu.command.hand.groovy": "考慮使用§6/gs hand", - "gtceu.command.hand.item_id": "物品:%s(後設資料:%d)", - "gtceu.command.hand.material": "材料 ID:", - "gtceu.command.hand.meta_item": "元物品 ID:", - "gtceu.command.hand.no_item": "在執行此命令之前,您的主手或副手必須拿著物品。", - "gtceu.command.hand.not_a_player": "這個命令只有玩家可以使用。", - "gtceu.command.hand.ore_prefix": "礦物字首:", - "gtceu.command.hand.tag_entries": "§3標籤條目:", - "gtceu.command.hand.tool_stats": "工具狀態類:%s", - "gtceu.command.hand.usage": "用法:/gtceu hand", - "gtceu.command.recipecheck.begin": "開始配方衝突檢查...", - "gtceu.command.recipecheck.end": "配方衝突檢查詢到%d可能存在的衝突,檢視伺服器日誌以瞭解更多資訊", - "gtceu.command.recipecheck.end_no_conflicts": "未發現配方衝突!", - "gtceu.command.recipecheck.usage": "用法:/gtceu recipecheck", - "gtceu.command.usage": "用法:/gtceu ", - "gtceu.command.worldgen.reload.failed": "Worldgen重新載入失敗。檢查控制台是否有錯誤。", - "gtceu.command.worldgen.reload.success": "Worldgen已成功從設定重新載入。", - "gtceu.command.worldgen.reload.usage": "用法:/gtceu worldgen reload", - "gtceu.command.worldgen.usage": "用法:/gtceu worldgen ", + "command.gtceu.copy.click_to_copy": "點選複製", + "command.gtceu.copy.copied_and_click": "已複製到剪貼簿,點選再次複製", + "command.gtceu.copy.copied_end": "]到剪貼簿", + "command.gtceu.copy.copied_start": "已複製[", + "command.gtceu.hand.electric": "電量資訊:%d / %d EU - 等級:%d; 是否為電池:%s", + "command.gtceu.hand.fluid": "流體資訊:%d / %d mB;是否可輸入:%s; 是否可輸出:%s", + "command.gtceu.hand.fluid2": "流體 ID:", + "command.gtceu.hand.groovy": "考慮使用§6/gs hand", + "command.gtceu.hand.item_id": "物品:%s(後設資料:%d)", + "command.gtceu.hand.material": "材料 ID:", + "command.gtceu.hand.meta_item": "元物品 ID:", + "command.gtceu.hand.no_item": "在執行此命令之前,您的主手或副手必須拿著物品。", + "command.gtceu.hand.not_a_player": "這個命令只有玩家可以使用。", + "command.gtceu.hand.ore_prefix": "礦物字首:", + "command.gtceu.hand.tag_entries": "§3標籤條目:", + "command.gtceu.hand.tool_stats": "工具狀態類:%s", + "command.gtceu.hand.usage": "用法:/gtceu hand", + "command.gtceu.recipecheck.begin": "開始配方衝突檢查...", + "command.gtceu.recipecheck.end": "配方衝突檢查詢到%d可能存在的衝突,檢視伺服器日誌以瞭解更多資訊", + "command.gtceu.recipecheck.end_no_conflicts": "未發現配方衝突!", + "command.gtceu.recipecheck.usage": "用法:/gtceu recipecheck", + "command.gtceu.usage": "用法:/gtceu ", + "command.gtceu.worldgen.reload.failed": "Worldgen重新載入失敗。檢查控制台是否有錯誤。", + "command.gtceu.worldgen.reload.success": "Worldgen已成功從設定重新載入。", + "command.gtceu.worldgen.reload.usage": "用法:/gtceu worldgen reload", + "command.gtceu.worldgen.usage": "用法:/gtceu worldgen ", "gtceu.compressor": "壓縮機", "gtceu.cover.activity_detector.message_activity_inverted": "正在以反相模式監控活動狀態", "gtceu.cover.activity_detector.message_activity_normal": "正在以普通模式監控活動狀態", @@ -3484,29 +3484,29 @@ "gtceu.subtitle.wirecutter": "剪線鉗:剪斷", "gtceu.subtitle.wrench": "扳手:嘎啦", "gtceu.thermal_centrifuge": "熱力離心機", - "gtceu.tool.class.axe": "斧", - "gtceu.tool.class.butchery_knife": "屠刀", - "gtceu.tool.class.crowbar": "撬棍", - "gtceu.tool.class.drill": "電鑽", - "gtceu.tool.class.file": "銼", - "gtceu.tool.class.hammer": "錘", - "gtceu.tool.class.hoe": "鋤", - "gtceu.tool.class.knife": "刀", - "gtceu.tool.class.mallet": "軟錘", - "gtceu.tool.class.mining_hammer": "採礦錘", - "gtceu.tool.class.mortar": "研缽", - "gtceu.tool.class.pickaxe": "鎬", - "gtceu.tool.class.plunger": "搋子", - "gtceu.tool.class.rolling_pin": "擀麵棍", - "gtceu.tool.class.saw": "鋸", - "gtceu.tool.class.screwdriver": "螺絲起子", - "gtceu.tool.class.scythe": "鐮刀", - "gtceu.tool.class.shears": "剪刀", - "gtceu.tool.class.shovel": "鍬", - "gtceu.tool.class.spade": "鏟", - "gtceu.tool.class.sword": "劍", - "gtceu.tool.class.wire_cutter": "剪線鉗", - "gtceu.tool.class.wrench": "扳手", + "tool.gtceu.class.axe": "斧", + "tool.gtceu.class.butchery_knife": "屠刀", + "tool.gtceu.class.crowbar": "撬棍", + "tool.gtceu.class.drill": "電鑽", + "tool.gtceu.class.file": "銼", + "tool.gtceu.class.hammer": "錘", + "tool.gtceu.class.hoe": "鋤", + "tool.gtceu.class.knife": "刀", + "tool.gtceu.class.mallet": "軟錘", + "tool.gtceu.class.mining_hammer": "採礦錘", + "tool.gtceu.class.mortar": "研缽", + "tool.gtceu.class.pickaxe": "鎬", + "tool.gtceu.class.plunger": "搋子", + "tool.gtceu.class.rolling_pin": "擀麵棍", + "tool.gtceu.class.saw": "鋸", + "tool.gtceu.class.screwdriver": "螺絲起子", + "tool.gtceu.class.scythe": "鐮刀", + "tool.gtceu.class.shears": "剪刀", + "tool.gtceu.class.shovel": "鍬", + "tool.gtceu.class.spade": "鏟", + "tool.gtceu.class.sword": "劍", + "tool.gtceu.class.wire_cutter": "剪線鉗", + "tool.gtceu.class.wrench": "扳手", "gtceu.tool_action.crowbar": "§8使用撬棍卸下覆蓋板", "gtceu.tool_action.hammer": "§8使用鍛造錘消除聲響", "gtceu.tool_action.screwdriver.access_covers": "§8使用螺絲起子訪問覆蓋板", @@ -4417,22 +4417,22 @@ "item.gtceu.tool.aoe.layers": "層", "item.gtceu.tool.aoe.rows": "列", "item.gtceu.tool.axe": "%s斧", - "item.gtceu.tool.behavior.aoe_mining": "§5作用範圍:§f%sx%sx%s", - "item.gtceu.tool.behavior.block_rotation": "§2精械師傅:§f旋轉方塊", - "item.gtceu.tool.behavior.crop_harvesting": "§a莊稼收割:§f收穫成熟的作物", - "item.gtceu.tool.behavior.damage_boost": "§4傷害增益:§f對%s造成額外傷害", - "item.gtceu.tool.behavior.grass_path": "§e園林策劃:§f製造草徑", - "item.gtceu.tool.behavior.ground_tilling": "§e耕地農夫:§f耕耘土地", - "item.gtceu.tool.behavior.plunger": "§9水管工人:§f清除流體", - "item.gtceu.tool.behavior.rail_rotation": "§e鐵路技工:§f旋轉軌道", - "item.gtceu.tool.behavior.relocate_mining": "§2磁力吸引:§f採掘的方塊進入物品欄", - "item.gtceu.tool.behavior.remove_wax": "§6清潔試劑:§f脫蠟", - "item.gtceu.tool.behavior.scrape": "§b拋光工藝:§f除鏽", - "item.gtceu.tool.behavior.shield_disable": "§c野獸蠻攻:§f無視盾牌", - "item.gtceu.tool.behavior.silk_ice": "§b切冰利刃:§f絲綢之觸採集冰塊", - "item.gtceu.tool.behavior.strip_log": "§5林業工匠:§f剝去原木的表皮", - "item.gtceu.tool.behavior.torch_place": "§e洞窟探客:§f右擊放置火把", - "item.gtceu.tool.behavior.tree_felling": "§4伐木好手:§f連鎖砍樹", + "tool.gtceu.behavior.aoe_mining": "§5作用範圍:§f%sx%sx%s", + "tool.gtceu.behavior.block_rotation": "§2精械師傅:§f旋轉方塊", + "tool.gtceu.behavior.crop_harvesting": "§a莊稼收割:§f收穫成熟的作物", + "tool.gtceu.behavior.damage_boost": "§4傷害增益:§f對%s造成額外傷害", + "tool.gtceu.behavior.grass_path": "§e園林策劃:§f製造草徑", + "tool.gtceu.behavior.ground_tilling": "§e耕地農夫:§f耕耘土地", + "tool.gtceu.behavior.plunger": "§9水管工人:§f清除流體", + "tool.gtceu.behavior.rail_rotation": "§e鐵路技工:§f旋轉軌道", + "tool.gtceu.behavior.relocate_mining": "§2磁力吸引:§f採掘的方塊進入物品欄", + "tool.gtceu.behavior.remove_wax": "§6清潔試劑:§f脫蠟", + "tool.gtceu.behavior.scrape": "§b拋光工藝:§f除鏽", + "tool.gtceu.behavior.shield_disable": "§c野獸蠻攻:§f無視盾牌", + "tool.gtceu.behavior.silk_ice": "§b切冰利刃:§f絲綢之觸採集冰塊", + "tool.gtceu.behavior.strip_log": "§5林業工匠:§f剝去原木的表皮", + "tool.gtceu.behavior.torch_place": "§e洞窟探客:§f右擊放置火把", + "tool.gtceu.behavior.tree_felling": "§4伐木好手:§f連鎖砍樹", "item.gtceu.tool.butchery_knife": "%s屠刀", "item.gtceu.tool.butchery_knife.tooltip": "§8攻擊速度較慢", "item.gtceu.tool.buzzsaw": "%s圓鋸(§7LV§r)", @@ -4493,16 +4493,16 @@ "item.gtceu.tool.spade": "%s鏟", "item.gtceu.tool.spade.tooltip": "§8一次性開採大片區域(除非你蹲下)", "item.gtceu.tool.sword": "%s劍", - "item.gtceu.tool.tooltip.attack_damage": "§c攻擊傷害§r:%s", - "item.gtceu.tool.tooltip.attack_speed": "§9攻擊速度§r:%s", - "item.gtceu.tool.tooltip.crafting_uses": "§a合成耐久度§r:%s", - "item.gtceu.tool.tooltip.general_uses": "§b耐久度§r:%s", - "item.gtceu.tool.tooltip.harvest_level": "§e採掘等級:%s", - "item.gtceu.tool.tooltip.harvest_level_extra": "§e採掘等級:%s§f(%s§f)", - "item.gtceu.tool.tooltip.max_uses": "§e最大耐久度§r:%s", - "item.gtceu.tool.tooltip.mining_speed": "§d採掘速度§r:%s", - "item.gtceu.tool.tooltip.repair_info": "§8按住SHIFT顯示修復詳情", - "item.gtceu.tool.tooltip.repair_material": "§8修復材料§r:§f§a%s", + "tool.gtceu.attack_damage.tooltip": "§c攻擊傷害§r:%s", + "tool.gtceu.attack_speed.tooltip": "§9攻擊速度§r:%s", + "tool.gtceu.crafting_uses.tooltip": "§a合成耐久度§r:%s", + "tool.gtceu.general_uses.tooltip": "§b耐久度§r:%s", + "tool.gtceu.harvest_level.tooltip": "§e採掘等級:%s", + "tool.gtceu.harvest_level_extra.tooltip": "§e採掘等級:%s§f(%s§f)", + "tool.gtceu.max_uses.tooltip": "§e最大耐久度§r:%s", + "tool.gtceu.mining_speed.tooltip": "§d採掘速度§r:%s", + "tool.gtceu.repair_info.tooltip": "§8按住SHIFT顯示修復詳情", + "tool.gtceu.repair_material.tooltip": "§8修復材料§r:§f§a%s", "item.gtceu.tool.usable_as": "§8可用作§r:§f%s", "item.gtceu.tool.wire_cutter": "%s剪線鉗", "item.gtceu.tool.wrench": "%s扳手", From b67220a76019066fd6f33a68125efff708e857f9 Mon Sep 17 00:00:00 2001 From: Spicierspace153 <21964509+Spicierspace153@users.noreply.github.com> Date: Thu, 19 Jun 2025 22:37:03 -0600 Subject: [PATCH 11/45] start of covers --- .../gtceu/api/cover/filter/TagFilter.java | 2 +- .../gtceu/common/cover/data/FilterMode.java | 2 +- .../gtceu/data/lang/ConfigurationLang.java | 2 +- .../gtceu/data/lang/CoverLang.java | 66 +++++++++++++++---- .../resources/assets/gtceu/lang/ja_jp.json | 32 ++++----- .../resources/assets/gtceu/lang/ru_ru.json | 32 ++++----- .../resources/assets/gtceu/lang/uk_ua.json | 32 ++++----- .../resources/assets/gtceu/lang/zh_cn.json | 32 ++++----- .../resources/assets/gtceu/lang/zh_tw.json | 32 ++++----- 9 files changed, 136 insertions(+), 96 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java index 5137e8a6a35..c47d4a1ee52 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java @@ -61,7 +61,7 @@ public WidgetGroup openConfigurator(int x, int y) { WidgetGroup group = new WidgetGroup(x, y, 18 * 3 + 25, 18 * 3); // 80 55 group.addWidget(new ImageWidget(0, 0, 20, 20, GuiTextures.INFO_ICON) .setHoverTooltips( - LangUtil.getMultiLang("cover.tag_filter.info").toArray(new MutableComponent[0]))); + LangUtil.getMultiLang("cover.gtceu.tag_filter.info").toArray(new MutableComponent[0]))); group.addWidget(new TextFieldWidget(0, 29, 18 * 3 + 25, 12, () -> oreDictFilterExpression, this::setOreDict) .setMaxStringLength(64) .setValidator(input -> { diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/data/FilterMode.java b/src/main/java/com/gregtechceu/gtceu/common/cover/data/FilterMode.java index c7ca25c8239..b71e6bc8e02 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/data/FilterMode.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/data/FilterMode.java @@ -28,7 +28,7 @@ public enum FilterMode implements EnumSelectorWidget.SelectableEnum { @Override public String getTooltip() { - return "cover.filter.mode." + this.localeName; + return "cover.gtceu.filter.mode." + this.localeName; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java index 70ff90e1c37..dd2ca7eaf10 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.config.ConfigHolder; -import static com.gregtechceu.gtceu.data.lang.LangUtil.*; + import com.tterrag.registrate.providers.RegistrateLangProvider; import dev.toma.configuration.Configuration; diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/CoverLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/CoverLang.java index 5de224b870a..90ed541f5af 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/CoverLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/CoverLang.java @@ -7,10 +7,22 @@ public class CoverLang { public static void generateCoverKeys(RegistrateLangProvider provider){ + //todo uses provider.add("cover.filter.blacklist.disabled", "Whitelist"); provider.add("cover.filter.blacklist.enabled", "Blacklist"); + + + //filter + provider.add("cover.gtceu.filter.mode.filter_insert", "Filter Insert"); + provider.add("cover.gtceu.filter.mode.filter_extract", "Filter Extract"); + provider.add("cover.gtceu.filter.mode.filter_both", "Filter Insert/Extract"); + + + + //tag filter + //todo: use these??? provider.add("cover.tag_filter.title", "Tag Filter"); - multilineLang(provider, "cover.tag_filter.info", + multilineLang(provider, "cover.gtceu.tag_filter.info", """ §bAccepts complex expressions §6a & b§r = AND @@ -24,25 +36,38 @@ public static void generateCoverKeys(RegistrateLangProvider provider){ The 'forge:' namespace is assumed if one isn't provided. §bExample: §6*dusts/gold | (gtceu:circuits & !*lv) This matches all gold dusts or all circuits except LV ones"""); - provider.add("cover.tag_filter.test_slot.info", + provider.add("cover.gtceu.test_slot.info", "Insert a item to test if it matches the filter expression"); provider.add("cover.tag_filter.matches", "Item matches"); provider.add("cover.tag_filter.matches_not", "Item does not match"); + + //fluid filter provider.add("cover.fluid_filter.title", "Fluid Filter"); multilineLang(provider, "cover.fluid_filter.config_amount", "Scroll wheel up increases amount, down decreases.\nShift[§6x10§r],Ctrl[§ex100§r],Shift+Ctrl[§ax1000§r]\nRight click increases amount, left click decreases.\nHold shift to double/halve.\nMiddle click to clear"); provider.add("cover.fluid_filter.mode.filter_fill", "Filter Fill"); provider.add("cover.fluid_filter.mode.filter_drain", "Filter Drain"); provider.add("cover.fluid_filter.mode.filter_both", "Filter Fill & Drain"); + + //item filter provider.add("cover.item_filter.title", "Item Filter"); - provider.add("cover.storage.title", "Storage Cover"); - provider.add("cover.filter.mode.filter_insert", "Filter Insert"); - provider.add("cover.filter.mode.filter_extract", "Filter Extract"); - provider.add("cover.filter.mode.filter_both", "Filter Insert/Extract"); - provider.add("cover.item_filter.ignore_damage.enabled", "Ignore Damage"); provider.add("cover.item_filter.ignore_damage.disabled", "Respect Damage"); provider.add("cover.item_filter.ignore_nbt.enabled", "Ignore NBT"); provider.add("cover.item_filter.ignore_nbt.disabled", "Respect NBT"); + provider.add("cover.item_filter.ignore_damage.enabled", "Ignore Damage"); + + // smart filter + provider.add("cover.item_smart_filter.title", "Smart Item Filter"); + provider.add("cover.item_smart_filter.filtering_mode.electrolyzer", "Electrolyzer"); + provider.add("cover.item_smart_filter.filtering_mode.centrifuge", "Centrifuge"); + provider.add("cover.item_smart_filter.filtering_mode.sifter", "Sifter"); + multilineLang(provider, "cover.item_smart_filter.filtering_mode.description", + "Select Machine this Smart Filter will use for filtering.\nIt will automatically pick right portions of items for robotic arm."); + + + provider.add("cover.storage.title", "Storage Cover"); + + //voiding provider.add("cover.voiding.voiding_mode.void_any", "Void Matching"); provider.add("cover.voiding.voiding_mode.void_overflow", "Void Overflow"); multilineLang(provider, "cover.voiding.voiding_mode.description", @@ -57,12 +82,8 @@ public static void generateCoverKeys(RegistrateLangProvider provider){ "§cWARNING!§7 Setting this to \"Enabled\" means that fluids or items WILL be voided."); provider.add("cover.voiding.message.disabled", "Voiding Cover Disabled"); provider.add("cover.voiding.message.enabled", "Voiding Cover Enabled"); - provider.add("cover.item_smart_filter.title", "Smart Item Filter"); - provider.add("cover.item_smart_filter.filtering_mode.electrolyzer", "Electrolyzer"); - provider.add("cover.item_smart_filter.filtering_mode.centrifuge", "Centrifuge"); - provider.add("cover.item_smart_filter.filtering_mode.sifter", "Sifter"); - multilineLang(provider, "cover.item_smart_filter.filtering_mode.description", - "Select Machine this Smart Filter will use for filtering.\nIt will automatically pick right portions of items for robotic arm."); + + // conveyors provider.add("cover.conveyor.title", "Conveyor Cover Settings (%s)"); provider.add("cover.conveyor.transfer_rate", "§7items/sec"); provider.add("cover.conveyor.mode", "Mode: %s"); @@ -78,6 +99,8 @@ public static void generateCoverKeys(RegistrateLangProvider provider){ "If enabled, items will not be inserted when cover is set to pull items from the inventory into pipe.\n§aEnabled"); multilineLang(provider, "cover.conveyor.blocks_input.disabled", "If enabled, items will not be inserted when cover is set to pull items from the inventory into pipe.\n§cDisabled"); + + //cover universal whatever that is provider.add("cover.universal.manual_import_export.mode.disabled", "Manual I/O: §bDisabled\n§7Items / Fluids will only move as specified by the cover and its filter."); provider.add("cover.universal.manual_import_export.mode.filtered", @@ -89,12 +112,16 @@ public static void generateCoverKeys(RegistrateLangProvider provider){ provider.add("cover.conveyor.item_filter.title", "Item Filter"); multiLang(provider, "cover.conveyor.tag.title", "Tag Name", "(use * for wildcard)"); + + // robot arm provider.add("cover.robotic_arm.title", "Robotic Arm Settings (%s)"); provider.add("cover.robotic_arm.transfer_mode.transfer_any", "Transfer Any"); provider.add("cover.robotic_arm.transfer_mode.transfer_exact", "Supply Exact"); provider.add("cover.robotic_arm.transfer_mode.keep_exact", "Keep Exact"); multilineLang(provider, "cover.robotic_arm.transfer_mode.description", "§eTransfer Any§r - in this mode, cover will transfer as many items matching its filter as possible.\n§eSupply Exact§r - in this mode, cover will supply items in portions specified in item filter slots (or variable under this button for tag filter). If amount of items is less than portion size, items won't be moved.\n§eKeep Exact§r - in this mode, cover will keep specified amount of items in the destination inventory, supplying additional amount of items if required.\n§7Tip: left/right click on filter slots to change item amount, use shift clicking to change amount faster."); + + //pump provider.add("cover.pump.title", "Pump Cover Settings (%s)"); provider.add("cover.pump.transfer_rate", "%s"); provider.add("cover.pump.mode.export", "Mode: Export"); @@ -102,11 +129,15 @@ public static void generateCoverKeys(RegistrateLangProvider provider){ provider.add("cover.pump.fluid_filter.title", "Fluid Filter"); provider.add("cover.bucket.mode.bucket", "B"); provider.add("cover.bucket.mode.milli_bucket", "mB"); + + //fluid regulator provider.add("cover.fluid_regulator.title", "Fluid Regulator Settings (%s)"); multilineLang(provider, "cover.fluid_regulator.transfer_mode.description", "§eTransfer Any§r - in this mode, cover will transfer as many fluids matching its filter as possible.\n§eSupply Exact§r - in this mode, cover will supply fluids in portions specified in the window underneath this button. If amount of fluids is less than portion size, fluids won't be moved.\n§eKeep Exact§r - in this mode, cover will keep specified amount of fluids in the destination inventory, supplying additional amount of fluids if required.\n§7Tip: shift click will multiply increase/decrease amounts by 10 and ctrl click will multiply by 100."); provider.add("cover.fluid_regulator.supply_exact", "Supply Exact: %s"); provider.add("cover.fluid_regulator.keep_exact", "Keep Exact: %s"); + + //machine controller provider.add("cover.machine_controller.title", "Machine Controller Settings"); provider.add("cover.machine_controller.normal", "Normal"); provider.add("cover.machine_controller.inverted", "Inverted"); @@ -123,6 +154,8 @@ public static void generateCoverKeys(RegistrateLangProvider provider){ provider.add("cover.machine_controller.mode.cover_east", "Control Cover (East)"); provider.add("cover.machine_controller.mode.cover_west", "Control Cover (West)"); provider.add("cover.machine_controller.mode.null", "Control Nothing"); + + //ender fluid provider.add("cover.ender_fluid_link.title", "Ender Fluid Link"); provider.add("cover.ender_fluid_link.iomode.enabled", "I/O Enabled"); provider.add("cover.ender_fluid_link.iomode.disabled", "I/O Disabled"); @@ -135,6 +168,8 @@ public static void generateCoverKeys(RegistrateLangProvider provider){ provider.add("cover.ender_fluid_link.private.tooltip.enabled", "Switch to public tank mode"); multilineLang(provider, "cover.ender_fluid_link.incomplete_hex", "Inputted color is incomplete!\nIt will be applied once complete (all 8 hex digits)\nClosing the gui will lose edits!"); + + // detector provider.add("cover.detector_base.message_normal_state", "Monitoring Status: Normal"); provider.add("cover.detector_base.message_inverted_state", "Monitoring Status: Inverted"); @@ -147,6 +182,7 @@ public static void generateCoverKeys(RegistrateLangProvider provider){ multilineLang(provider, "cover.advanced_detector.latch.disabled", "Behavior: Continuous\n\n" + detectorLatchDescription); + // advanced energy detector provider.add("cover.advanced_energy_detector.label", "Advanced Energy Detector"); provider.add("cover.advanced_energy_detector.min", "Min"); provider.add("cover.advanced_energy_detector.max", "Max"); @@ -162,6 +198,7 @@ public static void generateCoverKeys(RegistrateLangProvider provider){ multilineLang(provider, "cover.advanced_energy_detector.use_percent.disabled", "Mode: Discrete EU\n\n" + advancedEnergyDetectorModeDescription); + // advanced fluid cover provider.add("cover.advanced_fluid_detector.label", "Advanced Fluid Detector"); var advancedFluidDetectorInvertDescription = "Toggle to invert the redstone logic\nBy default, redstone stops emitting when less than the minimum mB of fluid, and starts emitting when greater than the min mB of fluid up to the set maximum"; multilineLang(provider, "cover.advanced_fluid_detector.invert.enabled", @@ -171,6 +208,7 @@ public static void generateCoverKeys(RegistrateLangProvider provider){ provider.add("cover.advanced_fluid_detector.max", "Max Fluid (mB)"); provider.add("cover.advanced_fluid_detector.min", "Min Fluid (mB)"); + // advanced item detector provider.add("cover.advanced_item_detector.label", "Advanced Item Detector"); var advancedItemDetectorInvertDescription = "Toggle to invert the redstone logic\nBy default, redstone stops emitting when less than the minimum amount of items, and starts emitting when greater than the min amount of items up to the set maximum"; multilineLang(provider, "cover.advanced_item_detector.invert.enabled", @@ -179,6 +217,8 @@ public static void generateCoverKeys(RegistrateLangProvider provider){ "Output: Normal\n\n" + advancedItemDetectorInvertDescription); provider.add("cover.advanced_item_detector.max", "Max Items"); provider.add("cover.advanced_item_detector.min", "Min Items"); + + //shutter provider.add("cover.shutter.message.enabled", "Closed shutter"); provider.add("cover.shutter.message.disabled", "Opened shutter"); diff --git a/src/main/resources/assets/gtceu/lang/ja_jp.json b/src/main/resources/assets/gtceu/lang/ja_jp.json index 5e929b79e85..c91543aa086 100644 --- a/src/main/resources/assets/gtceu/lang/ja_jp.json +++ b/src/main/resources/assets/gtceu/lang/ja_jp.json @@ -1919,9 +1919,9 @@ "cover.ender_fluid_link.title": "液体エンダーリンク", "cover.filter.blacklist.disabled": "ホワイトリスト", "cover.filter.blacklist.enabled": "ブラックリスト", - "cover.filter.mode.filter_both": "搬入/搬出フィルター", - "cover.filter.mode.filter_extract": "搬出フィルター", - "cover.filter.mode.filter_insert": "搬入フィルター", + "cover.gtceu.filter.mode.filter_both": "搬入/搬出フィルター", + "cover.gtceu.filter.mode.filter_extract": "搬出フィルター", + "cover.gtceu.filter.mode.filter_insert": "搬入フィルター", "cover.fluid.voiding.advanced.title": "発展型液体消去設定", "cover.fluid.voiding.title": "液体消去設定", "cover.fluid_filter.config_amount.0": "スクロールホイールを上にすると量が増え、下にすると減る。", @@ -1983,21 +1983,21 @@ "cover.shutter.message.disabled": "シャッターを開く", "cover.shutter.message.enabled": "シャッターを閉じる", "cover.storage.title": "倉庫カバー", - "cover.tag_filter.info.0": "§b複雑な表現も受け入れる", - "cover.tag_filter.info.1": "a & b§r = AND", - "cover.tag_filter.info.2": "§6a | b§r = OR", - "cover.tag_filter.info.3": "§6a ^ b§r = XOR", - "cover.tag_filter.info.4": "§6!a§r = NOT", - "cover.tag_filter.info.5": "§6(a)§r 優先度", - "cover.tag_filter.info.6": "§6*§r ワイルドカード", - "cover.tag_filter.info.7": "§6$§r タグ無し", - "cover.tag_filter.info.8": "§bタグは'名前空間:タグ/サブタイプ'の形式で書かれます。", - "cover.tag_filter.info.9": "指定されていない場合は、'forge:'名前空間になります。", - "cover.tag_filter.info.10": "§b例: §6*dusts/gold | (gtceu:circuits & !*lv)", - "cover.tag_filter.info.11": "これはすべての金の粉かLV以外の電子回路にマッチします。", + "cover.gtceu.tag_filter.info.0": "§b複雑な表現も受け入れる", + "cover.gtceu.tag_filter.info.1": "a & b§r = AND", + "cover.gtceu.tag_filter.info.2": "§6a | b§r = OR", + "cover.gtceu.tag_filter.info.3": "§6a ^ b§r = XOR", + "cover.gtceu.tag_filter.info.4": "§6!a§r = NOT", + "cover.gtceu.tag_filter.info.5": "§6(a)§r 優先度", + "cover.gtceu.tag_filter.info.6": "§6*§r ワイルドカード", + "cover.gtceu.tag_filter.info.7": "§6$§r タグ無し", + "cover.gtceu.tag_filter.info.8": "§bタグは'名前空間:タグ/サブタイプ'の形式で書かれます。", + "cover.gtceu.tag_filter.info.9": "指定されていない場合は、'forge:'名前空間になります。", + "cover.gtceu.tag_filter.info.10": "§b例: §6*dusts/gold | (gtceu:circuits & !*lv)", + "cover.gtceu.tag_filter.info.11": "これはすべての金の粉かLV以外の電子回路にマッチします。", "cover.tag_filter.matches": "アイテムが一致", "cover.tag_filter.matches_not": "アイテムが一致しません", - "cover.tag_filter.test_slot.info": "フィルター式に一致するかテストするためにアイテムを挿入してください", + "cover.gtceu.test_slot.info": "フィルター式に一致するかテストするためにアイテムを挿入してください", "cover.tag_filter.title": "タグフィルター", "cover.universal.manual_import_export.mode.description.0": "§e無効§r - アイテム/液体は、カバーとそのフィルターによって指定された通りにしか動きません。 ", "cover.universal.manual_import_export.mode.description.1": "§eフィルター付き§r - フィルターがあれば、カバーモードに関係なく、アイテム/液体を抽出し、挿入することができます。 ", diff --git a/src/main/resources/assets/gtceu/lang/ru_ru.json b/src/main/resources/assets/gtceu/lang/ru_ru.json index 5f00214670f..11053690030 100644 --- a/src/main/resources/assets/gtceu/lang/ru_ru.json +++ b/src/main/resources/assets/gtceu/lang/ru_ru.json @@ -1366,9 +1366,9 @@ "cover.ender_fluid_link.title": "Жидкостное Эндер соединение", "cover.filter.blacklist.disabled": "Белый список", "cover.filter.blacklist.enabled": "Черный список", - "cover.filter.mode.filter_both": "Фильтрует извлекаемые и помещаемые предметы", - "cover.filter.mode.filter_extract": "Фильтрует извлекаемые предметы", - "cover.filter.mode.filter_insert": "Фильтрует помещаемые предметы", + "cover.gtceu.filter.mode.filter_both": "Фильтрует извлекаемые и помещаемые предметы", + "cover.gtceu.filter.mode.filter_extract": "Фильтрует извлекаемые предметы", + "cover.gtceu.filter.mode.filter_insert": "Фильтрует помещаемые предметы", "cover.fluid.voiding.advanced.title": "Улучшенные настройки удаления жидкости", "cover.fluid.voiding.title": "Настройки удаления жидкости", "cover.fluid_filter.config_amount.0": "Колесо прокрутки вверх увеличивает кол-во, вниз уменьшает.", @@ -1407,19 +1407,19 @@ "cover.machine_controller.normal": "Нормально", "cover.machine_controller.redstone": "Минимальный Редстоун сигнал: %d", "cover.machine_controller.title": "Настройки контроллера механизма", - "cover.tag_filter.info.0": "§bПринимает сложные выражения", - "cover.tag_filter.info.1": "§6a & b§r = И", - "cover.tag_filter.info.2": "§6a | b§r = ИЛИ", - "cover.tag_filter.info.3": "§6a ^ b§r = XOR", - "cover.tag_filter.info.4": "§6!a§r = НЕ", - "cover.tag_filter.info.5": "§6(a)§r для указания приоритета", - "cover.tag_filter.info.6": "§6*§r для подстановочного знака", - "cover.tag_filter.info.7": "§6$§r для не отмеченных", - "cover.tag_filter.info.8": "§bТэги идут в формате 'namespace:tag/subtype'.", - "cover.tag_filter.info.9": "Предполагается пространство имен «forge:», если оно не указано.", + "cover.gtceu.tag_filter.info.0": "§bПринимает сложные выражения", + "cover.gtceu.tag_filter.info.1": "§6a & b§r = И", + "cover.gtceu.tag_filter.info.2": "§6a | b§r = ИЛИ", + "cover.gtceu.tag_filter.info.3": "§6a ^ b§r = XOR", + "cover.gtceu.tag_filter.info.4": "§6!a§r = НЕ", + "cover.gtceu.tag_filter.info.5": "§6(a)§r для указания приоритета", + "cover.gtceu.tag_filter.info.6": "§6*§r для подстановочного знака", + "cover.gtceu.tag_filter.info.7": "§6$§r для не отмеченных", + "cover.gtceu.tag_filter.info.8": "§bТэги идут в формате 'namespace:tag/subtype'.", + "cover.gtceu.tag_filter.info.9": "Предполагается пространство имен «forge:», если оно не указано.", "cover.tag_filter.matches": "Предмет совпадает", "cover.tag_filter.matches_not": "Предмет не совпадает", - "cover.tag_filter.test_slot.info": "Вставьте элемент, чтобы проверить, соответствует ли он выражению фильтра", + "cover.gtceu.test_slot.info": "Вставьте элемент, чтобы проверить, соответствует ли он выражению фильтра", "cover.tag_filter.title": "Фильтр по словарю руд", "cover.pump.fluid_filter.title": "Жидкостный фильтр", "cover.pump.mode.export": "Экспорт", @@ -5487,9 +5487,9 @@ "cover.shutter.message.disabled": "Затвор открыт", "block.gtceu.lp_steam_miner": "Паровой шахтер низкого давления", "block.gtceu.hp_steam_miner": "Паровой шахтер высокого давления", - "cover.tag_filter.info.11": "Это соответствует всей золотой пыли или всем микросхемам, кроме LV вотьтажа.", + "cover.gtceu.tag_filter.info.11": "Это соответствует всей золотой пыли или всем микросхемам, кроме LV вотьтажа.", "gtceu.journeymap.options.layers.bedrock_fluids": "Показать бедроковые залежи жидкости", - "cover.tag_filter.info.10": "§bНапример: §6*dusts/gold | (gtceu:circuits & !*lv)", + "cover.gtceu.tag_filter.info.10": "§bНапример: §6*dusts/gold | (gtceu:circuits & !*lv)", "fluid.gtceu.potion": "Зелье", "gtceu.forming_press.naming.named": "§oНеназванный предмет", "gtceu.forming_press.naming.press": "§oНеназванный пресс", diff --git a/src/main/resources/assets/gtceu/lang/uk_ua.json b/src/main/resources/assets/gtceu/lang/uk_ua.json index ff88f153bcf..a342c049f7d 100644 --- a/src/main/resources/assets/gtceu/lang/uk_ua.json +++ b/src/main/resources/assets/gtceu/lang/uk_ua.json @@ -5469,9 +5469,9 @@ "cover.ender_fluid_link.title": "Рідинний зв'язок Енду", "cover.filter.blacklist.disabled": "Білий список", "cover.filter.blacklist.enabled": "Чорний список", - "cover.filter.mode.filter_both": "Вставка/витягання фільтра", - "cover.filter.mode.filter_extract": "Витягнути фільтр", - "cover.filter.mode.filter_insert": "Вставка фільтра", + "cover.gtceu.filter.mode.filter_both": "Вставка/витягання фільтра", + "cover.gtceu.filter.mode.filter_extract": "Витягнути фільтр", + "cover.gtceu.filter.mode.filter_insert": "Вставка фільтра", "cover.fluid.voiding.advanced.title": "Просунуте налаштування видалення рідини", "cover.fluid.voiding.title": "Налаштування видалення рідини", "cover.fluid_filter.config_amount.0": "Коліщатко вгору збільшує кількість, вниз - зменшує.", @@ -5529,21 +5529,21 @@ "cover.shutter.message.disabled": "Затвор відкрито", "cover.shutter.message.enabled": "Затвор закрито", "cover.storage.title": "Кришка сховища", - "cover.tag_filter.info.0": "§bПриймає складні вирази", - "cover.tag_filter.info.1": "§6a & b§r = AND", - "cover.tag_filter.info.10": "§bПриклад:§6 *dusts/gold | (gtceu:circuits & !*lv)", - "cover.tag_filter.info.11": "Перебирає увесь золотий пил або всі схеми, окрім lv", - "cover.tag_filter.info.2": "§6a | b§r = OR", - "cover.tag_filter.info.3": "§6a ^ b§r = XOR", - "cover.tag_filter.info.4": "§6!a§r = NOT", - "cover.tag_filter.info.5": "§6(a)§r для групування", - "cover.tag_filter.info.6": "§6*§r для підстановки", - "cover.tag_filter.info.7": "§6$§r без тегів", - "cover.tag_filter.info.8": "§bТеги мають вигляд 'namespace:tag/subtype'.", - "cover.tag_filter.info.9": "Простір назв 'forge:' передбачається, якщо його не вказано.", + "cover.gtceu.tag_filter.info.0": "§bПриймає складні вирази", + "cover.gtceu.tag_filter.info.1": "§6a & b§r = AND", + "cover.gtceu.tag_filter.info.10": "§bПриклад:§6 *dusts/gold | (gtceu:circuits & !*lv)", + "cover.gtceu.tag_filter.info.11": "Перебирає увесь золотий пил або всі схеми, окрім lv", + "cover.gtceu.tag_filter.info.2": "§6a | b§r = OR", + "cover.gtceu.tag_filter.info.3": "§6a ^ b§r = XOR", + "cover.gtceu.tag_filter.info.4": "§6!a§r = NOT", + "cover.gtceu.tag_filter.info.5": "§6(a)§r для групування", + "cover.gtceu.tag_filter.info.6": "§6*§r для підстановки", + "cover.gtceu.tag_filter.info.7": "§6$§r без тегів", + "cover.gtceu.tag_filter.info.8": "§bТеги мають вигляд 'namespace:tag/subtype'.", + "cover.gtceu.tag_filter.info.9": "Простір назв 'forge:' передбачається, якщо його не вказано.", "cover.tag_filter.matches": "Предмет збігається", "cover.tag_filter.matches_not": "Предмет не збігається", - "cover.tag_filter.test_slot.info": "Вставте предмет, щоб перевірити, чи відповідає він виразу фільтра", + "cover.gtceu.test_slot.info": "Вставте предмет, щоб перевірити, чи відповідає він виразу фільтра", "cover.tag_filter.title": "Фільтр тегів", "cover.universal.manual_import_export.mode.description.0": "§eВимкнено§r - Предмети/рідини переміщуватимуться лише так, як визначено кришкою та її фільтром. ", "cover.universal.manual_import_export.mode.description.1": "§eДозволити фільтрований§r - поки відповідає фільтру кришки, предмети/рідини можна витягувати та вставляти незалежно від її режиму (якщо такий є). ", diff --git a/src/main/resources/assets/gtceu/lang/zh_cn.json b/src/main/resources/assets/gtceu/lang/zh_cn.json index 4e62711fb17..0c709986358 100644 --- a/src/main/resources/assets/gtceu/lang/zh_cn.json +++ b/src/main/resources/assets/gtceu/lang/zh_cn.json @@ -1974,9 +1974,9 @@ "cover.ender_fluid_link.title": "末影流体连接", "cover.filter.blacklist.disabled": "白名单", "cover.filter.blacklist.enabled": "黑名单", - "cover.filter.mode.filter_both": "过滤两者", - "cover.filter.mode.filter_extract": "过滤输出", - "cover.filter.mode.filter_insert": "过滤输入", + "cover.gtceu.filter.mode.filter_both": "过滤两者", + "cover.gtceu.filter.mode.filter_extract": "过滤输出", + "cover.gtceu.filter.mode.filter_insert": "过滤输入", "cover.fluid.voiding.advanced.title": "高级流体销毁设置", "cover.fluid.voiding.title": "流体销毁设置", "cover.fluid_filter.config_amount.0": "向上或向下滚动鼠标滚轮以增加或减少流体量。", @@ -2038,21 +2038,21 @@ "cover.shutter.message.disabled": "扇板已开启", "cover.shutter.message.enabled": "扇板已关闭", "cover.storage.title": "存储覆盖板", - "cover.tag_filter.info.0": "§b接受复杂表达式", - "cover.tag_filter.info.1": "§6a & b§r = 且(AND)", - "cover.tag_filter.info.10": "§b使用范例:§6*dusts/gold | (gtceu:circuits & !*lv)", - "cover.tag_filter.info.11": "这将匹配所有种类的金粉或LV以外的电路", - "cover.tag_filter.info.2": "§6a | b§r = 或(OR)", - "cover.tag_filter.info.3": "§6a ^ b§r = 异或(XOR)", - "cover.tag_filter.info.4": "§6!a§r = 非(NOT)", - "cover.tag_filter.info.5": "§6(a)§r 改变优先级", - "cover.tag_filter.info.6": "§6*§r 为通配符", - "cover.tag_filter.info.7": "§6$§r 为没有标签的物品/流体等", - "cover.tag_filter.info.8": "§b标签的格式为'命名空间:标签/子类型'。", - "cover.tag_filter.info.9": "如果没有提供命名空间,则为'forge:'。", + "cover.gtceu.tag_filter.info.0": "§b接受复杂表达式", + "cover.gtceu.tag_filter.info.1": "§6a & b§r = 且(AND)", + "cover.gtceu.tag_filter.info.10": "§b使用范例:§6*dusts/gold | (gtceu:circuits & !*lv)", + "cover.gtceu.tag_filter.info.11": "这将匹配所有种类的金粉或LV以外的电路", + "cover.gtceu.tag_filter.info.2": "§6a | b§r = 或(OR)", + "cover.gtceu.tag_filter.info.3": "§6a ^ b§r = 异或(XOR)", + "cover.gtceu.tag_filter.info.4": "§6!a§r = 非(NOT)", + "cover.gtceu.tag_filter.info.5": "§6(a)§r 改变优先级", + "cover.gtceu.tag_filter.info.6": "§6*§r 为通配符", + "cover.gtceu.tag_filter.info.7": "§6$§r 为没有标签的物品/流体等", + "cover.gtceu.tag_filter.info.8": "§b标签的格式为'命名空间:标签/子类型'。", + "cover.gtceu.tag_filter.info.9": "如果没有提供命名空间,则为'forge:'。", "cover.tag_filter.matches": "物品匹配", "cover.tag_filter.matches_not": "物品不匹配", - "cover.tag_filter.test_slot.info": "放入一件物品以测试是否匹配过滤表达式", + "cover.gtceu.test_slot.info": "放入一件物品以测试是否匹配过滤表达式", "cover.tag_filter.title": "标签过滤", "cover.universal.manual_import_export.mode.description.0": "§e禁用§r-仅依照覆盖板与内部过滤器的指定规则传输。", "cover.universal.manual_import_export.mode.description.1": "§e过滤§r-外部I/O将只根据过滤器的指定规则传输,不受覆盖板的限制。", diff --git a/src/main/resources/assets/gtceu/lang/zh_tw.json b/src/main/resources/assets/gtceu/lang/zh_tw.json index 41a9ed15336..0648103e79c 100644 --- a/src/main/resources/assets/gtceu/lang/zh_tw.json +++ b/src/main/resources/assets/gtceu/lang/zh_tw.json @@ -1974,9 +1974,9 @@ "cover.ender_fluid_link.title": "終界流體連線", "cover.filter.blacklist.disabled": "白名單", "cover.filter.blacklist.enabled": "黑名單", - "cover.filter.mode.filter_both": "過濾兩者", - "cover.filter.mode.filter_extract": "過濾輸出", - "cover.filter.mode.filter_insert": "過濾輸入", + "cover.gtceu.filter.mode.filter_both": "過濾兩者", + "cover.gtceu.filter.mode.filter_extract": "過濾輸出", + "cover.gtceu.filter.mode.filter_insert": "過濾輸入", "cover.fluid.voiding.advanced.title": "高階流體銷毀設定", "cover.fluid.voiding.title": "流體銷毀設定", "cover.fluid_filter.config_amount.0": "向上或向下滾動滑鼠滾輪以增加或減少流體量。", @@ -2038,21 +2038,21 @@ "cover.shutter.message.disabled": "扇板已開啟", "cover.shutter.message.enabled": "扇板已關閉", "cover.storage.title": "儲存覆蓋板", - "cover.tag_filter.info.0": "§b接受複雜表示式", - "cover.tag_filter.info.1": "& = 且(AND)", - "cover.tag_filter.info.10": "§b使用範例:§6*dusts/gold | (gtceu:circuits & !*lv)", - "cover.tag_filter.info.11": "這將匹配所有種類的金粉或LV以外的電路", - "cover.tag_filter.info.2": "丨= 或(OR)", - "cover.tag_filter.info.3": "^ = 異或(XOR)", - "cover.tag_filter.info.4": "! = 非(NOT)", - "cover.tag_filter.info.5": "( )表示優先順序", - "cover.tag_filter.info.6": "* 表示萬用字元", - "cover.tag_filter.info.7": "§b例:", - "cover.tag_filter.info.8": "§6dust*Gold | (plate* &! *Double*)", - "cover.tag_filter.info.9": "將匹配所有大小的金粉或所有非雙重板的板", + "cover.gtceu.tag_filter.info.0": "§b接受複雜表示式", + "cover.gtceu.tag_filter.info.1": "& = 且(AND)", + "cover.gtceu.tag_filter.info.10": "§b使用範例:§6*dusts/gold | (gtceu:circuits & !*lv)", + "cover.gtceu.tag_filter.info.11": "這將匹配所有種類的金粉或LV以外的電路", + "cover.gtceu.tag_filter.info.2": "丨= 或(OR)", + "cover.gtceu.tag_filter.info.3": "^ = 異或(XOR)", + "cover.gtceu.tag_filter.info.4": "! = 非(NOT)", + "cover.gtceu.tag_filter.info.5": "( )表示優先順序", + "cover.gtceu.tag_filter.info.6": "* 表示萬用字元", + "cover.gtceu.tag_filter.info.7": "§b例:", + "cover.gtceu.tag_filter.info.8": "§6dust*Gold | (plate* &! *Double*)", + "cover.gtceu.tag_filter.info.9": "將匹配所有大小的金粉或所有非雙重板的板", "cover.tag_filter.matches": "物品匹配", "cover.tag_filter.matches_not": "物品不匹配", - "cover.tag_filter.test_slot.info": "放入一件物品以測試是否匹配過濾表示式", + "cover.gtceu.test_slot.info": "放入一件物品以測試是否匹配過濾表示式", "cover.tag_filter.title": "礦物詞典過濾卡", "cover.universal.manual_import_export.mode.description.0": "§e禁用§r-僅依照覆蓋板與內部過濾卡的指定規則傳輸。", "cover.universal.manual_import_export.mode.description.1": "§e過濾§r-外部I/O將只根據過濾卡的指定規則傳輸,不受覆蓋板的限制。", From 5ee9e1829c970d96f6c4fa1a4bdb48bceca9e10e Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Thu, 19 Jun 2025 23:26:22 -0600 Subject: [PATCH 12/45] subtitles --- .../resources/assets/gtceu/lang/en_ud.json | 78 +++++++++---------- .../resources/assets/gtceu/lang/en_us.json | 78 +++++++++---------- .../resources/assets/gtceu/sounds.json | 78 +++++++++---------- .../gtceu/data/lang/SubtitleLang.java | 78 +++++++++---------- .../resources/assets/gtceu/lang/ja_jp.json | 78 +++++++++---------- .../resources/assets/gtceu/lang/ru_ru.json | 78 +++++++++---------- .../resources/assets/gtceu/lang/uk_ua.json | 78 +++++++++---------- .../resources/assets/gtceu/lang/zh_cn.json | 78 +++++++++---------- .../resources/assets/gtceu/lang/zh_tw.json | 78 +++++++++---------- 9 files changed, 351 insertions(+), 351 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 8aed30d56eb..252ca043392 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -3493,45 +3493,45 @@ "gtceu.sifter": "ɹǝʇɟıS", "gtceu.steam_boiler": "ɹǝןıoᗺ ɯɐǝʇS", "gtceu.steam_turbine": "ǝuıqɹn⟘ ɯɐǝʇS", - "gtceu.subtitle.arc": "buızznq sɔɹⱯ", - "gtceu.subtitle.assembler": "buıʇɔnɹʇsuoɔ ɹǝןqɯǝssⱯ", - "gtceu.subtitle.bath": "buızzıɟ ɥʇɐᗺ", - "gtceu.subtitle.boiler": "buıʇɐǝɥ ɹǝןıoᗺ", - "gtceu.subtitle.centrifuge": "buıuuıds ǝbnɟıɹʇuǝƆ", - "gtceu.subtitle.chainsaw": "buıʌʌǝɹ ʍɐsuıɐɥƆ", - "gtceu.subtitle.chemical": "buıןqqnq ןɐɔıɯǝɥƆ", - "gtceu.subtitle.combustion": "buıʇsnqɯoƆ", - "gtceu.subtitle.compressor": "buızǝǝnbs ɹossǝɹdɯoƆ", - "gtceu.subtitle.computation": "sdǝǝq ɹǝʇndɯoƆ", - "gtceu.subtitle.cooling": "buıɯɯnɥ ɹǝzǝǝɹℲ", - "gtceu.subtitle.cut": "buıɹɹıɥʍ ɹǝʇʇnƆ", - "gtceu.subtitle.drill": "buıןןıɹᗡ", - "gtceu.subtitle.electrolyzer": "buıʞɹɐds ɹǝzʎןoɹʇɔǝןƎ", - "gtceu.subtitle.file": "buıdsɐɹ ǝןıℲ", - "gtceu.subtitle.fire": "buıןʞɔɐɹɔ ǝɹıℲ", - "gtceu.subtitle.forge_hammer": "buıdɯnɥʇ ɹǝɯɯɐH ǝbɹoℲ", - "gtceu.subtitle.furnace": "buıʇɐǝɥ ǝɔɐuɹnℲ", - "gtceu.subtitle.jet_engine": "buıɹɐoɹ ʇǝſ", - "gtceu.subtitle.macerator": "buıɥsnɹɔ ɹoʇɐɹǝɔɐW", - "gtceu.subtitle.metal_pipe": "ʌɐʍ˙0‾0‾ᄅ‾ǝʌɐM‾Ꞁ‾ǝןoԀ‾ןɐʇǝW‾uoıʇɔnɹʇsǝᗡ", - "gtceu.subtitle.miner": "buıʇɐʌɐɔxǝ ɹǝuıW", - "gtceu.subtitle.mixer": "buıɥsoןs ɹǝxıW", - "gtceu.subtitle.mortar": "buıɥsnɹɔ ɹɐʇɹoW", - "gtceu.subtitle.motor": "buıɯɯnɥ ɹoʇoW", - "gtceu.subtitle.plunger": "buıddod ɹǝbunןԀ", - "gtceu.subtitle.portable_scanner": "buıuuɐɔS", - "gtceu.subtitle.portal_closing": "sǝsoןɔ ןɐʇɹoԀ", - "gtceu.subtitle.portal_opening": "suǝdo ןɐʇɹoԀ", - "gtceu.subtitle.replicator": "buıʎdoɔ ɹoʇɐɔıןdǝᴚ", - "gtceu.subtitle.saw": "buıʍɐS", - "gtceu.subtitle.science": "ǝ ɔ u ǝ ı ɔ s", - "gtceu.subtitle.screwdriver": "buıʍǝɹɔS", - "gtceu.subtitle.soft_hammer": "dɐʇ ʇɟoS", - "gtceu.subtitle.spray_can": "buıʎɐɹdS", - "gtceu.subtitle.sus": "˙˙˙snS", - "gtceu.subtitle.turbine": "buızzıɥʍ ǝuıqɹn⟘", - "gtceu.subtitle.wirecutter": "pǝddıus ǝɹıM", - "gtceu.subtitle.wrench": "buıןʇʇɐɹ ɥɔuǝɹM", + "subtitles.gtceu.arc": "buızznq sɔɹⱯ", + "subtitles.gtceu.assembler": "buıʇɔnɹʇsuoɔ ɹǝןqɯǝssⱯ", + "subtitles.gtceu.bath": "buızzıɟ ɥʇɐᗺ", + "subtitles.gtceu.boiler": "buıʇɐǝɥ ɹǝןıoᗺ", + "subtitles.gtceu.centrifuge": "buıuuıds ǝbnɟıɹʇuǝƆ", + "subtitles.gtceu.chainsaw": "buıʌʌǝɹ ʍɐsuıɐɥƆ", + "subtitles.gtceu.chemical": "buıןqqnq ןɐɔıɯǝɥƆ", + "subtitles.gtceu.combustion": "buıʇsnqɯoƆ", + "subtitles.gtceu.compressor": "buızǝǝnbs ɹossǝɹdɯoƆ", + "subtitles.gtceu.computation": "sdǝǝq ɹǝʇndɯoƆ", + "subtitles.gtceu.cooling": "buıɯɯnɥ ɹǝzǝǝɹℲ", + "subtitles.gtceu.cut": "buıɹɹıɥʍ ɹǝʇʇnƆ", + "subtitles.gtceu.drill": "buıןןıɹᗡ", + "subtitles.gtceu.electrolyzer": "buıʞɹɐds ɹǝzʎןoɹʇɔǝןƎ", + "subtitles.gtceu.file": "buıdsɐɹ ǝןıℲ", + "subtitles.gtceu.fire": "buıןʞɔɐɹɔ ǝɹıℲ", + "subtitles.gtceu.forge_hammer": "buıdɯnɥʇ ɹǝɯɯɐH ǝbɹoℲ", + "subtitles.gtceu.furnace": "buıʇɐǝɥ ǝɔɐuɹnℲ", + "subtitles.gtceu.jet_engine": "buıɹɐoɹ ʇǝſ", + "subtitles.gtceu.macerator": "buıɥsnɹɔ ɹoʇɐɹǝɔɐW", + "subtitles.gtceu.metal_pipe": "ʌɐʍ˙0‾0‾ᄅ‾ǝʌɐM‾Ꞁ‾ǝןoԀ‾ןɐʇǝW‾uoıʇɔnɹʇsǝᗡ", + "subtitles.gtceu.miner": "buıʇɐʌɐɔxǝ ɹǝuıW", + "subtitles.gtceu.mixer": "buıɥsoןs ɹǝxıW", + "subtitles.gtceu.mortar": "buıɥsnɹɔ ɹɐʇɹoW", + "subtitles.gtceu.motor": "buıɯɯnɥ ɹoʇoW", + "subtitles.gtceu.plunger": "buıddod ɹǝbunןԀ", + "subtitles.gtceu.portable_scanner": "buıuuɐɔS", + "subtitles.gtceu.portal_closing": "sǝsoןɔ ןɐʇɹoԀ", + "subtitles.gtceu.portal_opening": "suǝdo ןɐʇɹoԀ", + "subtitles.gtceu.replicator": "buıʎdoɔ ɹoʇɐɔıןdǝᴚ", + "subtitles.gtceu.saw": "buıʍɐS", + "subtitles.gtceu.science": "ǝ ɔ u ǝ ı ɔ s", + "subtitles.gtceu.screwdriver": "buıʍǝɹɔS", + "subtitles.gtceu.soft_hammer": "dɐʇ ʇɟoS", + "subtitles.gtceu.spray_can": "buıʎɐɹdS", + "subtitles.gtceu.sus": "˙˙˙snS", + "subtitles.gtceu.turbine": "buızzıɥʍ ǝuıqɹn⟘", + "subtitles.gtceu.wirecutter": "pǝddıus ǝɹıM", + "subtitles.gtceu.wrench": "buıןʇʇɐɹ ɥɔuǝɹM", "gtceu.thermal_centrifuge": "ǝbnɟıɹʇuǝƆ ןɐɯɹǝɥ⟘", "gtceu.tool_action.crowbar": "sɹǝʌoƆ ǝʌoɯǝɹ oʇ ɹɐqʍoɹƆ ǝs∩8§", "gtceu.tool_action.hammer": "spunoS ǝןɟɟnɯ oʇ ɹǝɯɯɐH pɹɐH ǝs∩8§", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 61edefe4708..3d0a354907d 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -3493,45 +3493,45 @@ "gtceu.sifter": "Sifter", "gtceu.steam_boiler": "Steam Boiler", "gtceu.steam_turbine": "Steam Turbine", - "gtceu.subtitle.arc": "Arcs buzzing", - "gtceu.subtitle.assembler": "Assembler constructing", - "gtceu.subtitle.bath": "Bath fizzing", - "gtceu.subtitle.boiler": "Boiler heating", - "gtceu.subtitle.centrifuge": "Centrifuge spinning", - "gtceu.subtitle.chainsaw": "Chainsaw revving", - "gtceu.subtitle.chemical": "Chemical bubbling", - "gtceu.subtitle.combustion": "Combusting", - "gtceu.subtitle.compressor": "Compressor squeezing", - "gtceu.subtitle.computation": "Computer beeps", - "gtceu.subtitle.cooling": "Freezer humming", - "gtceu.subtitle.cut": "Cutter whirring", - "gtceu.subtitle.drill": "Drilling", - "gtceu.subtitle.electrolyzer": "Electrolyzer sparking", - "gtceu.subtitle.file": "File rasping", - "gtceu.subtitle.fire": "Fire crackling", - "gtceu.subtitle.forge_hammer": "Forge Hammer thumping", - "gtceu.subtitle.furnace": "Furnace heating", - "gtceu.subtitle.jet_engine": "Jet roaring", - "gtceu.subtitle.macerator": "Macerator crushing", - "gtceu.subtitle.metal_pipe": "Destruction_Metal_Pole_L_Wave_2_0_0.wav", - "gtceu.subtitle.miner": "Miner excavating", - "gtceu.subtitle.mixer": "Mixer sloshing", - "gtceu.subtitle.mortar": "Mortar crushing", - "gtceu.subtitle.motor": "Motor humming", - "gtceu.subtitle.plunger": "Plunger popping", - "gtceu.subtitle.portable_scanner": "Scanning", - "gtceu.subtitle.portal_closing": "Portal closes", - "gtceu.subtitle.portal_opening": "Portal opens", - "gtceu.subtitle.replicator": "Replicator copying", - "gtceu.subtitle.saw": "Sawing", - "gtceu.subtitle.science": "s c i e n c e", - "gtceu.subtitle.screwdriver": "Screwing", - "gtceu.subtitle.soft_hammer": "Soft tap", - "gtceu.subtitle.spray_can": "Spraying", - "gtceu.subtitle.sus": "Sus...", - "gtceu.subtitle.turbine": "Turbine whizzing", - "gtceu.subtitle.wirecutter": "Wire snipped", - "gtceu.subtitle.wrench": "Wrench rattling", + "subtitles.gtceu.arc": "Arcs buzzing", + "subtitles.gtceu.assembler": "Assembler constructing", + "subtitles.gtceu.bath": "Bath fizzing", + "subtitles.gtceu.boiler": "Boiler heating", + "subtitles.gtceu.centrifuge": "Centrifuge spinning", + "subtitles.gtceu.chainsaw": "Chainsaw revving", + "subtitles.gtceu.chemical": "Chemical bubbling", + "subtitles.gtceu.combustion": "Combusting", + "subtitles.gtceu.compressor": "Compressor squeezing", + "subtitles.gtceu.computation": "Computer beeps", + "subtitles.gtceu.cooling": "Freezer humming", + "subtitles.gtceu.cut": "Cutter whirring", + "subtitles.gtceu.drill": "Drilling", + "subtitles.gtceu.electrolyzer": "Electrolyzer sparking", + "subtitles.gtceu.file": "File rasping", + "subtitles.gtceu.fire": "Fire crackling", + "subtitles.gtceu.forge_hammer": "Forge Hammer thumping", + "subtitles.gtceu.furnace": "Furnace heating", + "subtitles.gtceu.jet_engine": "Jet roaring", + "subtitles.gtceu.macerator": "Macerator crushing", + "subtitles.gtceu.metal_pipe": "Destruction_Metal_Pole_L_Wave_2_0_0.wav", + "subtitles.gtceu.miner": "Miner excavating", + "subtitles.gtceu.mixer": "Mixer sloshing", + "subtitles.gtceu.mortar": "Mortar crushing", + "subtitles.gtceu.motor": "Motor humming", + "subtitles.gtceu.plunger": "Plunger popping", + "subtitles.gtceu.portable_scanner": "Scanning", + "subtitles.gtceu.portal_closing": "Portal closes", + "subtitles.gtceu.portal_opening": "Portal opens", + "subtitles.gtceu.replicator": "Replicator copying", + "subtitles.gtceu.saw": "Sawing", + "subtitles.gtceu.science": "s c i e n c e", + "subtitles.gtceu.screwdriver": "Screwing", + "subtitles.gtceu.soft_hammer": "Soft tap", + "subtitles.gtceu.spray_can": "Spraying", + "subtitles.gtceu.sus": "Sus...", + "subtitles.gtceu.turbine": "Turbine whizzing", + "subtitles.gtceu.wirecutter": "Wire snipped", + "subtitles.gtceu.wrench": "Wrench rattling", "gtceu.thermal_centrifuge": "Thermal Centrifuge", "gtceu.tool_action.crowbar": "§8Use Crowbar to remove Covers", "gtceu.tool_action.hammer": "§8Use Hard Hammer to muffle Sounds", diff --git a/src/generated/resources/assets/gtceu/sounds.json b/src/generated/resources/assets/gtceu/sounds.json index 9318d8e9022..f5d23f052c0 100644 --- a/src/generated/resources/assets/gtceu/sounds.json +++ b/src/generated/resources/assets/gtceu/sounds.json @@ -6,7 +6,7 @@ "name": "gtceu:arc" } ], - "subtitle": "gtceu.subtitle.arc" + "subtitle": "subtitles.gtceu.arc" }, "assembler": { "sounds": [ @@ -15,7 +15,7 @@ "name": "gtceu:assembler" } ], - "subtitle": "gtceu.subtitle.assembler" + "subtitle": "subtitles.gtceu.assembler" }, "bath": { "sounds": [ @@ -24,7 +24,7 @@ "name": "gtceu:bath" } ], - "subtitle": "gtceu.subtitle.bath" + "subtitle": "subtitles.gtceu.bath" }, "boiler": { "sounds": [ @@ -33,7 +33,7 @@ "name": "gtceu:boiler" } ], - "subtitle": "gtceu.subtitle.boiler" + "subtitle": "subtitles.gtceu.boiler" }, "centrifuge": { "sounds": [ @@ -42,7 +42,7 @@ "name": "gtceu:centrifuge" } ], - "subtitle": "gtceu.subtitle.centrifuge" + "subtitle": "subtitles.gtceu.centrifuge" }, "chainsaw": { "sounds": [ @@ -51,7 +51,7 @@ "name": "gtceu:chainsaw" } ], - "subtitle": "gtceu.subtitle.chainsaw" + "subtitle": "subtitles.gtceu.chainsaw" }, "chemical": { "sounds": [ @@ -60,7 +60,7 @@ "name": "gtceu:chemical" } ], - "subtitle": "gtceu.subtitle.chemical" + "subtitle": "subtitles.gtceu.chemical" }, "combustion": { "sounds": [ @@ -69,7 +69,7 @@ "name": "gtceu:combustion" } ], - "subtitle": "gtceu.subtitle.combustion" + "subtitle": "subtitles.gtceu.combustion" }, "compressor": { "sounds": [ @@ -78,7 +78,7 @@ "name": "gtceu:compressor" } ], - "subtitle": "gtceu.subtitle.compressor" + "subtitle": "subtitles.gtceu.compressor" }, "computation": { "sounds": [ @@ -87,7 +87,7 @@ "name": "gtceu:computation" } ], - "subtitle": "gtceu.subtitle.computation" + "subtitle": "subtitles.gtceu.computation" }, "cooling": { "sounds": [ @@ -96,7 +96,7 @@ "name": "gtceu:cooling" } ], - "subtitle": "gtceu.subtitle.cooling" + "subtitle": "subtitles.gtceu.cooling" }, "cut": { "sounds": [ @@ -105,7 +105,7 @@ "name": "gtceu:cut" } ], - "subtitle": "gtceu.subtitle.cut" + "subtitle": "subtitles.gtceu.cut" }, "drill": { "sounds": [ @@ -114,7 +114,7 @@ "name": "gtceu:drill" } ], - "subtitle": "gtceu.subtitle.drill" + "subtitle": "subtitles.gtceu.drill" }, "electrolyzer": { "sounds": [ @@ -123,7 +123,7 @@ "name": "gtceu:electrolyzer" } ], - "subtitle": "gtceu.subtitle.electrolyzer" + "subtitle": "subtitles.gtceu.electrolyzer" }, "file": { "sounds": [ @@ -132,7 +132,7 @@ "name": "gtceu:file" } ], - "subtitle": "gtceu.subtitle.file" + "subtitle": "subtitles.gtceu.file" }, "fire": { "sounds": [ @@ -141,7 +141,7 @@ "name": "gtceu:fire" } ], - "subtitle": "gtceu.subtitle.fire" + "subtitle": "subtitles.gtceu.fire" }, "forge_hammer": { "sounds": [ @@ -150,7 +150,7 @@ "name": "gtceu:forge_hammer" } ], - "subtitle": "gtceu.subtitle.forge_hammer" + "subtitle": "subtitles.gtceu.forge_hammer" }, "furnace": { "sounds": [ @@ -159,7 +159,7 @@ "name": "gtceu:furnace" } ], - "subtitle": "gtceu.subtitle.furnace" + "subtitle": "subtitles.gtceu.furnace" }, "jet_engine": { "sounds": [ @@ -168,7 +168,7 @@ "name": "gtceu:jet_engine" } ], - "subtitle": "gtceu.subtitle.jet_engine" + "subtitle": "subtitles.gtceu.jet_engine" }, "macerator": { "sounds": [ @@ -177,7 +177,7 @@ "name": "gtceu:macerator" } ], - "subtitle": "gtceu.subtitle.macerator" + "subtitle": "subtitles.gtceu.macerator" }, "metal_pipe": { "sounds": [ @@ -186,7 +186,7 @@ "name": "gtceu:metal_pipe" } ], - "subtitle": "gtceu.subtitle.metal_pipe" + "subtitle": "subtitles.gtceu.metal_pipe" }, "miner": { "sounds": [ @@ -195,7 +195,7 @@ "name": "gtceu:miner" } ], - "subtitle": "gtceu.subtitle.miner" + "subtitle": "subtitles.gtceu.miner" }, "mixer": { "sounds": [ @@ -204,7 +204,7 @@ "name": "gtceu:mixer" } ], - "subtitle": "gtceu.subtitle.mixer" + "subtitle": "subtitles.gtceu.mixer" }, "mortar": { "sounds": [ @@ -213,7 +213,7 @@ "name": "gtceu:mortar" } ], - "subtitle": "gtceu.subtitle.mortar" + "subtitle": "subtitles.gtceu.mortar" }, "motor": { "sounds": [ @@ -222,7 +222,7 @@ "name": "gtceu:motor" } ], - "subtitle": "gtceu.subtitle.motor" + "subtitle": "subtitles.gtceu.motor" }, "plunger": { "sounds": [ @@ -231,7 +231,7 @@ "name": "gtceu:plunger" } ], - "subtitle": "gtceu.subtitle.plunger" + "subtitle": "subtitles.gtceu.plunger" }, "portable_scanner": { "sounds": [ @@ -240,7 +240,7 @@ "name": "gtceu:portable_scanner" } ], - "subtitle": "gtceu.subtitle.portable_scanner" + "subtitle": "subtitles.gtceu.portable_scanner" }, "portal_closing": { "sounds": [ @@ -249,7 +249,7 @@ "name": "gtceu:portal_closing" } ], - "subtitle": "gtceu.subtitle.portal_closing" + "subtitle": "subtitles.gtceu.portal_closing" }, "portal_opening": { "sounds": [ @@ -258,7 +258,7 @@ "name": "gtceu:portal_opening" } ], - "subtitle": "gtceu.subtitle.portal_opening" + "subtitle": "subtitles.gtceu.portal_opening" }, "replicator": { "sounds": [ @@ -267,7 +267,7 @@ "name": "gtceu:replicator" } ], - "subtitle": "gtceu.subtitle.replicator" + "subtitle": "subtitles.gtceu.replicator" }, "saw": { "sounds": [ @@ -276,7 +276,7 @@ "name": "gtceu:saw" } ], - "subtitle": "gtceu.subtitle.saw" + "subtitle": "subtitles.gtceu.saw" }, "science": { "sounds": [ @@ -285,7 +285,7 @@ "name": "gtceu:science" } ], - "subtitle": "gtceu.subtitle.science" + "subtitle": "subtitles.gtceu.science" }, "screwdriver": { "sounds": [ @@ -294,7 +294,7 @@ "name": "gtceu:screwdriver" } ], - "subtitle": "gtceu.subtitle.screwdriver" + "subtitle": "subtitles.gtceu.screwdriver" }, "soft_hammer": { "sounds": [ @@ -303,7 +303,7 @@ "name": "gtceu:soft_hammer" } ], - "subtitle": "gtceu.subtitle.soft_hammer" + "subtitle": "subtitles.gtceu.soft_hammer" }, "spray_can": { "sounds": [ @@ -312,7 +312,7 @@ "name": "gtceu:spray_can" } ], - "subtitle": "gtceu.subtitle.spray_can" + "subtitle": "subtitles.gtceu.spray_can" }, "sus": { "sounds": [ @@ -321,7 +321,7 @@ "name": "gtceu:sus" } ], - "subtitle": "gtceu.subtitle.sus" + "subtitle": "subtitles.gtceu.sus" }, "turbine": { "sounds": [ @@ -330,7 +330,7 @@ "name": "gtceu:turbine" } ], - "subtitle": "gtceu.subtitle.turbine" + "subtitle": "subtitles.gtceu.turbine" }, "wirecutter": { "sounds": [ @@ -339,7 +339,7 @@ "name": "gtceu:wirecutter" } ], - "subtitle": "gtceu.subtitle.wirecutter" + "subtitle": "subtitles.gtceu.wirecutter" }, "wrench": { "sounds": [ @@ -348,6 +348,6 @@ "name": "gtceu:wrench" } ], - "subtitle": "gtceu.subtitle.wrench" + "subtitle": "subtitles.gtceu.wrench" } } \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/SubtitleLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/SubtitleLang.java index 49d2cbca946..af126ee0675 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/SubtitleLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/SubtitleLang.java @@ -12,44 +12,44 @@ public static void init(RegistrateLangProvider provider) { private static void generateSubtitleKeys(RegistrateLangProvider provider) { // Subtitles - provider.add("gtceu.subtitle.boiler", "Boiler heating"); - provider.add("gtceu.subtitle.computation", "Computer beeps"); - provider.add("gtceu.subtitle.assembler", "Assembler constructing"); - provider.add("gtceu.subtitle.chainsaw", "Chainsaw revving"); - provider.add("gtceu.subtitle.compressor", "Compressor squeezing"); - provider.add("gtceu.subtitle.centrifuge", "Centrifuge spinning"); - provider.add("gtceu.subtitle.mortar", "Mortar crushing"); - provider.add("gtceu.subtitle.screwdriver", "Screwing"); - provider.add("gtceu.subtitle.saw", "Sawing"); - provider.add("gtceu.subtitle.miner", "Miner excavating"); - provider.add("gtceu.subtitle.turbine", "Turbine whizzing"); - provider.add("gtceu.subtitle.wrench", "Wrench rattling"); - provider.add("gtceu.subtitle.portal_opening", "Portal opens"); - provider.add("gtceu.subtitle.replicator", "Replicator copying"); - provider.add("gtceu.subtitle.arc", "Arcs buzzing"); - provider.add("gtceu.subtitle.combustion", "Combusting"); - provider.add("gtceu.subtitle.portable_scanner", "Scanning"); - provider.add("gtceu.subtitle.macerator", "Macerator crushing"); - provider.add("gtceu.subtitle.jet_engine", "Jet roaring"); - provider.add("gtceu.subtitle.spray_can", "Spraying"); - provider.add("gtceu.subtitle.mixer", "Mixer sloshing"); - provider.add("gtceu.subtitle.fire", "Fire crackling"); - provider.add("gtceu.subtitle.forge_hammer", "Forge Hammer thumping"); - provider.add("gtceu.subtitle.bath", "Bath fizzing"); - provider.add("gtceu.subtitle.soft_hammer", "Soft tap"); - provider.add("gtceu.subtitle.wirecutter", "Wire snipped"); - provider.add("gtceu.subtitle.chemical", "Chemical bubbling"); - provider.add("gtceu.subtitle.file", "File rasping"); - provider.add("gtceu.subtitle.portal_closing", "Portal closes"); - provider.add("gtceu.subtitle.motor", "Motor humming"); - provider.add("gtceu.subtitle.drill", "Drilling"); - provider.add("gtceu.subtitle.cut", "Cutter whirring"); - provider.add("gtceu.subtitle.furnace", "Furnace heating"); - provider.add("gtceu.subtitle.electrolyzer", "Electrolyzer sparking"); - provider.add("gtceu.subtitle.cooling", "Freezer humming"); - provider.add("gtceu.subtitle.plunger", "Plunger popping"); - provider.add("gtceu.subtitle.sus", "Sus..."); - provider.add("gtceu.subtitle.science", "s c i e n c e"); - provider.add("gtceu.subtitle.metal_pipe", "Destruction_Metal_Pole_L_Wave_2_0_0.wav"); + provider.add("subtitles.gtceu.boiler", "Boiler heating"); + provider.add("subtitles.gtceu.computation", "Computer beeps"); + provider.add("subtitles.gtceu.assembler", "Assembler constructing"); + provider.add("subtitles.gtceu.chainsaw", "Chainsaw revving"); + provider.add("subtitles.gtceu.compressor", "Compressor squeezing"); + provider.add("subtitles.gtceu.centrifuge", "Centrifuge spinning"); + provider.add("subtitles.gtceu.mortar", "Mortar crushing"); + provider.add("subtitles.gtceu.screwdriver", "Screwing"); + provider.add("subtitles.gtceu.saw", "Sawing"); + provider.add("subtitles.gtceu.miner", "Miner excavating"); + provider.add("subtitles.gtceu.turbine", "Turbine whizzing"); + provider.add("subtitles.gtceu.wrench", "Wrench rattling"); + provider.add("subtitles.gtceu.portal_opening", "Portal opens"); + provider.add("subtitles.gtceu.replicator", "Replicator copying"); + provider.add("subtitles.gtceu.arc", "Arcs buzzing"); + provider.add("subtitles.gtceu.combustion", "Combusting"); + provider.add("subtitles.gtceu.portable_scanner", "Scanning"); + provider.add("subtitles.gtceu.macerator", "Macerator crushing"); + provider.add("subtitles.gtceu.jet_engine", "Jet roaring"); + provider.add("subtitles.gtceu.spray_can", "Spraying"); + provider.add("subtitles.gtceu.mixer", "Mixer sloshing"); + provider.add("subtitles.gtceu.fire", "Fire crackling"); + provider.add("subtitles.gtceu.forge_hammer", "Forge Hammer thumping"); + provider.add("subtitles.gtceu.bath", "Bath fizzing"); + provider.add("subtitles.gtceu.soft_hammer", "Soft tap"); + provider.add("subtitles.gtceu.wirecutter", "Wire snipped"); + provider.add("subtitles.gtceu.chemical", "Chemical bubbling"); + provider.add("subtitles.gtceu.file", "File rasping"); + provider.add("subtitles.gtceu.portal_closing", "Portal closes"); + provider.add("subtitles.gtceu.motor", "Motor humming"); + provider.add("subtitles.gtceu.drill", "Drilling"); + provider.add("subtitles.gtceu.cut", "Cutter whirring"); + provider.add("subtitles.gtceu.furnace", "Furnace heating"); + provider.add("subtitles.gtceu.electrolyzer", "Electrolyzer sparking"); + provider.add("subtitles.gtceu.cooling", "Freezer humming"); + provider.add("subtitles.gtceu.plunger", "Plunger popping"); + provider.add("subtitles.gtceu.sus", "Sus..."); + provider.add("subtitles.gtceu.science", "s c i e n c e"); + provider.add("subtitles.gtceu.metal_pipe", "Destruction_Metal_Pole_L_Wave_2_0_0.wav"); } } diff --git a/src/main/resources/assets/gtceu/lang/ja_jp.json b/src/main/resources/assets/gtceu/lang/ja_jp.json index 84e0ae98975..7975fa69d01 100644 --- a/src/main/resources/assets/gtceu/lang/ja_jp.json +++ b/src/main/resources/assets/gtceu/lang/ja_jp.json @@ -3385,45 +3385,45 @@ "gtceu.sifter": "選別機", "gtceu.steam_boiler": "蒸気ボイラー", "gtceu.steam_turbine": "蒸気タービン", - "gtceu.subtitle.arc": "鳴り響く円弧", - "gtceu.subtitle.assembler": "アセンブラでの構築", - "gtceu.subtitle.bath": "化学槽の発泡", - "gtceu.subtitle.boiler": "ボイラー加熱", - "gtceu.subtitle.centrifuge": "遠心分離機の回転", - "gtceu.subtitle.chainsaw": "チェーンソーの回転", - "gtceu.subtitle.chemical": "ケミカルバブリング", - "gtceu.subtitle.combustion": "燃焼", - "gtceu.subtitle.compressor": "圧縮機の絞り", - "gtceu.subtitle.computation": "コンピュータのビープ音", - "gtceu.subtitle.cooling": "冷却機の音", - "gtceu.subtitle.cut": "カッターの音", - "gtceu.subtitle.drill": "掘削", - "gtceu.subtitle.electrolyzer": "電解槽の火花", - "gtceu.subtitle.file": "ヤスリがけ", - "gtceu.subtitle.fire": "火のパチパチ音", - "gtceu.subtitle.forge_hammer": "鍛造ハンマーの音", - "gtceu.subtitle.furnace": "かまどの温まる音", - "gtceu.subtitle.jet_engine": "ジェット轟音", - "gtceu.subtitle.macerator": "粉砕機の粉砕の音", - "gtceu.subtitle.metal_pipe": "破壊_金属_極_L_波_2_0_0.wav", - "gtceu.subtitle.miner": "鉱夫の掘削", - "gtceu.subtitle.mixer": "ミキサーの泡立ち", - "gtceu.subtitle.mortar": "モーター破砕", - "gtceu.subtitle.motor": "モーター音", - "gtceu.subtitle.plunger": "ラバーカップの音", - "gtceu.subtitle.portable_scanner": "スキャニング", - "gtceu.subtitle.portal_closing": "ポータルが閉じる音", - "gtceu.subtitle.portal_opening": "ポータルが開く音", - "gtceu.subtitle.replicator": "レプリケーターによるコピー", - "gtceu.subtitle.saw": "製材", - "gtceu.subtitle.science": "サ イ エ ン ス", - "gtceu.subtitle.screwdriver": "ねじ締め", - "gtceu.subtitle.soft_hammer": "ソフトタップ", - "gtceu.subtitle.spray_can": "スプレー", - "gtceu.subtitle.sus": "怪しい...", - "gtceu.subtitle.turbine": "タービン音", - "gtceu.subtitle.wirecutter": "ワイヤーを切断音", - "gtceu.subtitle.wrench": "レンチのガタつき", + "subtitles.gtceu.arc": "鳴り響く円弧", + "subtitles.gtceu.assembler": "アセンブラでの構築", + "subtitles.gtceu.bath": "化学槽の発泡", + "subtitles.gtceu.boiler": "ボイラー加熱", + "subtitles.gtceu.centrifuge": "遠心分離機の回転", + "subtitles.gtceu.chainsaw": "チェーンソーの回転", + "subtitles.gtceu.chemical": "ケミカルバブリング", + "subtitles.gtceu.combustion": "燃焼", + "subtitles.gtceu.compressor": "圧縮機の絞り", + "subtitles.gtceu.computation": "コンピュータのビープ音", + "subtitles.gtceu.cooling": "冷却機の音", + "subtitles.gtceu.cut": "カッターの音", + "subtitles.gtceu.drill": "掘削", + "subtitles.gtceu.electrolyzer": "電解槽の火花", + "subtitles.gtceu.file": "ヤスリがけ", + "subtitles.gtceu.fire": "火のパチパチ音", + "subtitles.gtceu.forge_hammer": "鍛造ハンマーの音", + "subtitles.gtceu.furnace": "かまどの温まる音", + "subtitles.gtceu.jet_engine": "ジェット轟音", + "subtitles.gtceu.macerator": "粉砕機の粉砕の音", + "subtitles.gtceu.metal_pipe": "破壊_金属_極_L_波_2_0_0.wav", + "subtitles.gtceu.miner": "鉱夫の掘削", + "subtitles.gtceu.mixer": "ミキサーの泡立ち", + "subtitles.gtceu.mortar": "モーター破砕", + "subtitles.gtceu.motor": "モーター音", + "subtitles.gtceu.plunger": "ラバーカップの音", + "subtitles.gtceu.portable_scanner": "スキャニング", + "subtitles.gtceu.portal_closing": "ポータルが閉じる音", + "subtitles.gtceu.portal_opening": "ポータルが開く音", + "subtitles.gtceu.replicator": "レプリケーターによるコピー", + "subtitles.gtceu.saw": "製材", + "subtitles.gtceu.science": "サ イ エ ン ス", + "subtitles.gtceu.screwdriver": "ねじ締め", + "subtitles.gtceu.soft_hammer": "ソフトタップ", + "subtitles.gtceu.spray_can": "スプレー", + "subtitles.gtceu.sus": "怪しい...", + "subtitles.gtceu.turbine": "タービン音", + "subtitles.gtceu.wirecutter": "ワイヤーを切断音", + "subtitles.gtceu.wrench": "レンチのガタつき", "gtceu.thermal_centrifuge": "熱遠心分離機", "tool.gtceu.class.axe": "斧", "tool.gtceu.class.butchery_knife": "肉切り包丁", diff --git a/src/main/resources/assets/gtceu/lang/ru_ru.json b/src/main/resources/assets/gtceu/lang/ru_ru.json index a9b718a69b5..6ad57e15293 100644 --- a/src/main/resources/assets/gtceu/lang/ru_ru.json +++ b/src/main/resources/assets/gtceu/lang/ru_ru.json @@ -5025,35 +5025,35 @@ "gtceu.medical_condition.silicosis": "§1Силикоз", "gtceu.medical_condition.weak_poison": "§aСлабо ядовитый", "gtceu.recipe.total_computation": "Вычисление: %s CWU", - "gtceu.subtitle.assembler": "Сборщик собирает", - "gtceu.subtitle.bath": "Ванна шипит", - "gtceu.subtitle.boiler": "Котел нагревается", - "gtceu.subtitle.centrifuge": "Центрифуга вращается", - "gtceu.subtitle.chainsaw": "Бензопила ревет", - "gtceu.subtitle.chemical": "Химикаты булькают", - "gtceu.subtitle.arc": "Дуга жужжит", - "gtceu.subtitle.compressor": "Компрессор сжимает", - "gtceu.subtitle.cooling": "Холодильник жужжит", - "gtceu.subtitle.cut": "Резак режет", - "gtceu.subtitle.drill": "Бурение", - "gtceu.subtitle.electrolyzer": "Электролизер искрит", - "gtceu.subtitle.fire": "Огонь трещит", - "gtceu.subtitle.forge_hammer": "Молот стучит", - "gtceu.subtitle.furnace": "Печь нагревается", - "gtceu.subtitle.jet_engine": "Двигатель ревет", - "gtceu.subtitle.miner": "Шахтер добывает", - "gtceu.subtitle.mixer": "Смеситель плещет", - "gtceu.subtitle.mortar": "Ступа измельчает", - "gtceu.subtitle.motor": "Мотор шумит", - "gtceu.subtitle.plunger": "Вантуз чпокнул", - "gtceu.subtitle.portable_scanner": "Сканирование", - "gtceu.subtitle.portal_closing": "Портал закрывается", - "gtceu.subtitle.portal_opening": "Портал открывается", - "gtceu.subtitle.saw": "Пиление", - "gtceu.subtitle.science": "Н А У К А", - "gtceu.subtitle.screwdriver": "Откручивание", - "gtceu.subtitle.spray_can": "Распыление", - "gtceu.subtitle.sus": "Сус...", + "subtitles.gtceu.assembler": "Сборщик собирает", + "subtitles.gtceu.bath": "Ванна шипит", + "subtitles.gtceu.boiler": "Котел нагревается", + "subtitles.gtceu.centrifuge": "Центрифуга вращается", + "subtitles.gtceu.chainsaw": "Бензопила ревет", + "subtitles.gtceu.chemical": "Химикаты булькают", + "subtitles.gtceu.arc": "Дуга жужжит", + "subtitles.gtceu.compressor": "Компрессор сжимает", + "subtitles.gtceu.cooling": "Холодильник жужжит", + "subtitles.gtceu.cut": "Резак режет", + "subtitles.gtceu.drill": "Бурение", + "subtitles.gtceu.electrolyzer": "Электролизер искрит", + "subtitles.gtceu.fire": "Огонь трещит", + "subtitles.gtceu.forge_hammer": "Молот стучит", + "subtitles.gtceu.furnace": "Печь нагревается", + "subtitles.gtceu.jet_engine": "Двигатель ревет", + "subtitles.gtceu.miner": "Шахтер добывает", + "subtitles.gtceu.mixer": "Смеситель плещет", + "subtitles.gtceu.mortar": "Ступа измельчает", + "subtitles.gtceu.motor": "Мотор шумит", + "subtitles.gtceu.plunger": "Вантуз чпокнул", + "subtitles.gtceu.portable_scanner": "Сканирование", + "subtitles.gtceu.portal_closing": "Портал закрывается", + "subtitles.gtceu.portal_opening": "Портал открывается", + "subtitles.gtceu.saw": "Пиление", + "subtitles.gtceu.science": "Н А У К А", + "subtitles.gtceu.screwdriver": "Откручивание", + "subtitles.gtceu.spray_can": "Распыление", + "subtitles.gtceu.sus": "Сус...", "gtceu.top.auto_output": "Авто. вывод", "gtceu.top.cable_amperage": "Сила тока: ", "gtceu.top.exhaust_vent_blocked": "Заблокировано", @@ -5073,15 +5073,15 @@ "block.gtceu.mv_air_scrubber": "§bУлучшенный очиститель воздуха §r", "config.gtceu.option.energyConsumption": "energyConsumption", "gtceu.medical_condition.carbon_monoxide_poisoning": "§7Отравление угарным газом", - "gtceu.subtitle.file": "Напильник скрежет", - "gtceu.subtitle.macerator": "Измельчитель измельчает", - "gtceu.subtitle.replicator": "Репликатор копирует", + "subtitles.gtceu.file": "Напильник скрежет", + "subtitles.gtceu.macerator": "Измельчитель измельчает", + "subtitles.gtceu.replicator": "Репликатор копирует", "gtceu.top.item_auto_output": "Вывод предметов: %s", "gtceu.medical_condition.description": "§l§cОПАСНЫЙ §7Удерживайте Shift, чтобы просмотреть подробную информацию", - "gtceu.subtitle.combustion": "Сгорание", - "gtceu.subtitle.computation": "Компьютер пикает", - "gtceu.subtitle.metal_pipe": "Очень_громкий_металичнский_труба.wav", - "gtceu.subtitle.soft_hammer": "Тюк", + "subtitles.gtceu.combustion": "Сгорание", + "subtitles.gtceu.computation": "Компьютер пикает", + "subtitles.gtceu.metal_pipe": "Очень_громкий_металичнский_труба.wav", + "subtitles.gtceu.soft_hammer": "Тюк", "gtceu.recipe.environmental_hazard": "§cЗона должна иметь %s", "gtceu.recipe.environmental_hazard.reverse": "§cЗона НЕ должна иметь %s", "gtceu.top.allow_output_input": "Ввод разрешен", @@ -5131,9 +5131,9 @@ "gtceu.hazard_trigger.skin_contact": "Контакт с кожей", "gtceu.jade.cleaned_this_second": "Убирает опасность: %s/с", "gtceu.medical_condition.irritant": "§6Раздражитель", - "gtceu.subtitle.turbine": "Турбина воет", - "gtceu.subtitle.wirecutter": "Провод перекусился", - "gtceu.subtitle.wrench": "Ключ стрекочет", + "subtitles.gtceu.turbine": "Турбина воет", + "subtitles.gtceu.wirecutter": "Провод перекусился", + "subtitles.gtceu.wrench": "Ключ стрекочет", "gtceu.top.cable_voltage": "Напряжение: ", "config.gtceu.option.nanoSaber": "nanoSaber", "config.gtceu.option.nanoSaberBaseDamage": "nanoSaberBaseDamage", diff --git a/src/main/resources/assets/gtceu/lang/uk_ua.json b/src/main/resources/assets/gtceu/lang/uk_ua.json index 4989ca2d479..5002758a67c 100644 --- a/src/main/resources/assets/gtceu/lang/uk_ua.json +++ b/src/main/resources/assets/gtceu/lang/uk_ua.json @@ -5151,45 +5151,45 @@ "armor.gtceu.tooltip.speed": "Збільшує швидкість бігу", "armor.gtceu.tooltip.stepassist": "Збільшує висоту кроку", - "gtceu.subtitle.portable_scanner": "Сканування", - "gtceu.subtitle.assembler": "Збирач конструює", - "gtceu.subtitle.centrifuge": "Центрифуга обертається", - "gtceu.subtitle.compressor": "Компресор віджимає", - "gtceu.subtitle.cut": "Різак дзижчить", - "gtceu.subtitle.electrolyzer": "Електролізер іскрить", - "gtceu.subtitle.forge_hammer": "Ковальський молот стукає", - "gtceu.subtitle.macerator": "Подрібнювач дробить", - "gtceu.subtitle.mixer": "Змішувач міксує", - "gtceu.subtitle.miner": "Шахтар видобуває", - "gtceu.subtitle.arc": "Дуги дзижчать", - "gtceu.subtitle.bath": "Ванна шипить", - "gtceu.subtitle.boiler": "Котел гріється", - "gtceu.subtitle.chainsaw": "Пила гуде", - "gtceu.subtitle.chemical": "Хімікати булькають", - "gtceu.subtitle.combustion": "Горіння", - "gtceu.subtitle.computation": "Комп'ютер тугодумає", - "gtceu.subtitle.metal_pipe": "Руйнування_металевого_стовпа_L_Хвилею_2_0_0.wav", - "gtceu.subtitle.drill": "Свердління", - "gtceu.subtitle.file": "Скрегіт напилка", - "gtceu.subtitle.fire": "Потріскування вогню", - "gtceu.subtitle.cooling": "Морозильник гуде", - "gtceu.subtitle.furnace": "Піч гріється", - "gtceu.subtitle.jet_engine": "Реактивне ревіння", - "gtceu.subtitle.mortar": "Ступка подрібнює", - "gtceu.subtitle.motor": "Двигун гуде", - "gtceu.subtitle.plunger": "Вантуз хлопає", - "gtceu.subtitle.portal_closing": "Портал закривається", - "gtceu.subtitle.portal_opening": "Портал відкривається", - "gtceu.subtitle.replicator": "Реплікатор копіює", - "gtceu.subtitle.science": "н а у к а", - "gtceu.subtitle.saw": "Пиляння", - "gtceu.subtitle.screwdriver": "Закручування", - "gtceu.subtitle.soft_hammer": "М'який тик", - "gtceu.subtitle.spray_can": "Обприскування", - "gtceu.subtitle.sus": "Підозріло...", - "gtceu.subtitle.turbine": "Свист турбіни", - "gtceu.subtitle.wirecutter": "Дріт рветься", - "gtceu.subtitle.wrench": "Ключ брязкає", + "subtitles.gtceu.portable_scanner": "Сканування", + "subtitles.gtceu.assembler": "Збирач конструює", + "subtitles.gtceu.centrifuge": "Центрифуга обертається", + "subtitles.gtceu.compressor": "Компресор віджимає", + "subtitles.gtceu.cut": "Різак дзижчить", + "subtitles.gtceu.electrolyzer": "Електролізер іскрить", + "subtitles.gtceu.forge_hammer": "Ковальський молот стукає", + "subtitles.gtceu.macerator": "Подрібнювач дробить", + "subtitles.gtceu.mixer": "Змішувач міксує", + "subtitles.gtceu.miner": "Шахтар видобуває", + "subtitles.gtceu.arc": "Дуги дзижчать", + "subtitles.gtceu.bath": "Ванна шипить", + "subtitles.gtceu.boiler": "Котел гріється", + "subtitles.gtceu.chainsaw": "Пила гуде", + "subtitles.gtceu.chemical": "Хімікати булькають", + "subtitles.gtceu.combustion": "Горіння", + "subtitles.gtceu.computation": "Комп'ютер тугодумає", + "subtitles.gtceu.metal_pipe": "Руйнування_металевого_стовпа_L_Хвилею_2_0_0.wav", + "subtitles.gtceu.drill": "Свердління", + "subtitles.gtceu.file": "Скрегіт напилка", + "subtitles.gtceu.fire": "Потріскування вогню", + "subtitles.gtceu.cooling": "Морозильник гуде", + "subtitles.gtceu.furnace": "Піч гріється", + "subtitles.gtceu.jet_engine": "Реактивне ревіння", + "subtitles.gtceu.mortar": "Ступка подрібнює", + "subtitles.gtceu.motor": "Двигун гуде", + "subtitles.gtceu.plunger": "Вантуз хлопає", + "subtitles.gtceu.portal_closing": "Портал закривається", + "subtitles.gtceu.portal_opening": "Портал відкривається", + "subtitles.gtceu.replicator": "Реплікатор копіює", + "subtitles.gtceu.science": "н а у к а", + "subtitles.gtceu.saw": "Пиляння", + "subtitles.gtceu.screwdriver": "Закручування", + "subtitles.gtceu.soft_hammer": "М'який тик", + "subtitles.gtceu.spray_can": "Обприскування", + "subtitles.gtceu.sus": "Підозріло...", + "subtitles.gtceu.turbine": "Свист турбіни", + "subtitles.gtceu.wirecutter": "Дріт рветься", + "subtitles.gtceu.wrench": "Ключ брязкає", "config.jade.plugin_gtceu.auto_output_info": "[GTCEu] Інфо автовиведення", "config.jade.plugin_gtceu.cable_info": "[GTCEu] Інфо кабелів", diff --git a/src/main/resources/assets/gtceu/lang/zh_cn.json b/src/main/resources/assets/gtceu/lang/zh_cn.json index b046e4a7b21..4ce557bdbdb 100644 --- a/src/main/resources/assets/gtceu/lang/zh_cn.json +++ b/src/main/resources/assets/gtceu/lang/zh_cn.json @@ -3444,45 +3444,45 @@ "gtceu.sifter": "筛选机", "gtceu.steam_boiler": "蒸汽锅炉", "gtceu.steam_turbine": "蒸汽涡轮", - "gtceu.subtitle.arc": "电弧炉:嗡——", - "gtceu.subtitle.assembler": "组装机:运行中", - "gtceu.subtitle.bath": "化学浸洗机:嘶嘶", - "gtceu.subtitle.boiler": "锅炉:液体沸腾", - "gtceu.subtitle.centrifuge": "离心机:旋转", - "gtceu.subtitle.chainsaw": "链锯:拉动油门", - "gtceu.subtitle.chemical": "化学反应釜:运行中", - "gtceu.subtitle.combustion": "内燃发电机:燃料燃烧", - "gtceu.subtitle.compressor": "压缩机:挤压", - "gtceu.subtitle.computation": "计算机:哔哔", - "gtceu.subtitle.cooling": "真空冷冻机:嗡——", - "gtceu.subtitle.cut": "切割机:嘶嘶叫", - "gtceu.subtitle.drill": "电钻:嗡嗡", - "gtceu.subtitle.electrolyzer": "电解机:爆出火花", - "gtceu.subtitle.file": "锉:磨削", - "gtceu.subtitle.fire": "火:爆裂", - "gtceu.subtitle.forge_hammer": "锻造锤:DUANG", - "gtceu.subtitle.furnace": "电炉:冶炼", - "gtceu.subtitle.jet_engine": "喷气背包:轰轰", - "gtceu.subtitle.macerator": "研磨机:破碎", - "gtceu.subtitle.metal_pipe": "流体管道:Destruction_Metal_Pole_L_Wave_2_0_0.wav", - "gtceu.subtitle.miner": "采矿机:开采", - "gtceu.subtitle.mixer": "搅拌机:搅动", - "gtceu.subtitle.mortar": "研钵:研磨", - "gtceu.subtitle.motor": "马达:转啊转", - "gtceu.subtitle.plunger": "搋子:清理流体", - "gtceu.subtitle.portable_scanner": "便携式扫描仪:扫描", - "gtceu.subtitle.portal_closing": "传送门:关闭", - "gtceu.subtitle.portal_opening": "传送门:开启", - "gtceu.subtitle.replicator": "复制机:运行", - "gtceu.subtitle.saw": "锯:切割", - "gtceu.subtitle.science": "化学反应釜:科!学!", - "gtceu.subtitle.screwdriver": "螺丝刀:拧螺丝", - "gtceu.subtitle.soft_hammer": "软锤:轻敲", - "gtceu.subtitle.spray_can": "喷漆罐:喷涂", - "gtceu.subtitle.sus": "唱片:你有嫌疑", - "gtceu.subtitle.turbine": "涡轮:呼啸", - "gtceu.subtitle.wirecutter": "剪线钳:剪断", - "gtceu.subtitle.wrench": "扳手:嘎啦", + "subtitles.gtceu.arc": "电弧炉:嗡——", + "subtitles.gtceu.assembler": "组装机:运行中", + "subtitles.gtceu.bath": "化学浸洗机:嘶嘶", + "subtitles.gtceu.boiler": "锅炉:液体沸腾", + "subtitles.gtceu.centrifuge": "离心机:旋转", + "subtitles.gtceu.chainsaw": "链锯:拉动油门", + "subtitles.gtceu.chemical": "化学反应釜:运行中", + "subtitles.gtceu.combustion": "内燃发电机:燃料燃烧", + "subtitles.gtceu.compressor": "压缩机:挤压", + "subtitles.gtceu.computation": "计算机:哔哔", + "subtitles.gtceu.cooling": "真空冷冻机:嗡——", + "subtitles.gtceu.cut": "切割机:嘶嘶叫", + "subtitles.gtceu.drill": "电钻:嗡嗡", + "subtitles.gtceu.electrolyzer": "电解机:爆出火花", + "subtitles.gtceu.file": "锉:磨削", + "subtitles.gtceu.fire": "火:爆裂", + "subtitles.gtceu.forge_hammer": "锻造锤:DUANG", + "subtitles.gtceu.furnace": "电炉:冶炼", + "subtitles.gtceu.jet_engine": "喷气背包:轰轰", + "subtitles.gtceu.macerator": "研磨机:破碎", + "subtitles.gtceu.metal_pipe": "流体管道:Destruction_Metal_Pole_L_Wave_2_0_0.wav", + "subtitles.gtceu.miner": "采矿机:开采", + "subtitles.gtceu.mixer": "搅拌机:搅动", + "subtitles.gtceu.mortar": "研钵:研磨", + "subtitles.gtceu.motor": "马达:转啊转", + "subtitles.gtceu.plunger": "搋子:清理流体", + "subtitles.gtceu.portable_scanner": "便携式扫描仪:扫描", + "subtitles.gtceu.portal_closing": "传送门:关闭", + "subtitles.gtceu.portal_opening": "传送门:开启", + "subtitles.gtceu.replicator": "复制机:运行", + "subtitles.gtceu.saw": "锯:切割", + "subtitles.gtceu.science": "化学反应釜:科!学!", + "subtitles.gtceu.screwdriver": "螺丝刀:拧螺丝", + "subtitles.gtceu.soft_hammer": "软锤:轻敲", + "subtitles.gtceu.spray_can": "喷漆罐:喷涂", + "subtitles.gtceu.sus": "唱片:你有嫌疑", + "subtitles.gtceu.turbine": "涡轮:呼啸", + "subtitles.gtceu.wirecutter": "剪线钳:剪断", + "subtitles.gtceu.wrench": "扳手:嘎啦", "gtceu.thermal_centrifuge": "热力离心机", "tool.gtceu.class.axe": "斧", "tool.gtceu.class.butchery_knife": "屠刀", diff --git a/src/main/resources/assets/gtceu/lang/zh_tw.json b/src/main/resources/assets/gtceu/lang/zh_tw.json index 93fcafcf1a9..e8c7ac3bb96 100644 --- a/src/main/resources/assets/gtceu/lang/zh_tw.json +++ b/src/main/resources/assets/gtceu/lang/zh_tw.json @@ -3444,45 +3444,45 @@ "gtceu.sifter": "篩選機", "gtceu.steam_boiler": "蒸汽鍋爐", "gtceu.steam_turbine": "蒸汽渦輪", - "gtceu.subtitle.arc": "電弧爐:嗡——", - "gtceu.subtitle.assembler": "組裝機:運行中", - "gtceu.subtitle.bath": "化學水浴機:嘶嘶", - "gtceu.subtitle.boiler": "鍋爐:液體沸騰", - "gtceu.subtitle.centrifuge": "離心機:旋轉", - "gtceu.subtitle.chainsaw": "鏈鋸:拉動油門", - "gtceu.subtitle.chemical": "化學反應器:運行中", - "gtceu.subtitle.combustion": "內燃發電機:燃料燃燒", - "gtceu.subtitle.compressor": "壓縮機:擠壓", - "gtceu.subtitle.computation": "計算機:嗶嗶", - "gtceu.subtitle.cooling": "真空冷凍機:嗡——", - "gtceu.subtitle.cut": "切割機:嘶嘶叫", - "gtceu.subtitle.drill": "電鑽:嗡嗡", - "gtceu.subtitle.electrolyzer": "電解機:爆出火花", - "gtceu.subtitle.file": "銼:磨削", - "gtceu.subtitle.fire": "火:爆裂", - "gtceu.subtitle.forge_hammer": "鍛造錘:DUANG", - "gtceu.subtitle.furnace": "電爐:冶煉", - "gtceu.subtitle.jet_engine": "噴射背包:轟轟", - "gtceu.subtitle.macerator": "研磨機:破碎", - "gtceu.subtitle.metal_pipe": "流體管道:Destruction_Metal_Pole_L_Wave_2_0_0.wav", - "gtceu.subtitle.miner": "採礦機:開採", - "gtceu.subtitle.mixer": "攪拌機:攪動", - "gtceu.subtitle.mortar": "研缽:研磨", - "gtceu.subtitle.motor": "馬達:轉啊轉", - "gtceu.subtitle.plunger": "搋子:清理流體", - "gtceu.subtitle.portable_scanner": "便攜式掃描儀:掃描", - "gtceu.subtitle.portal_closing": "傳送門:關閉", - "gtceu.subtitle.portal_opening": "傳送門:開啟", - "gtceu.subtitle.replicator": "複製機:運行", - "gtceu.subtitle.saw": "鋸:切割", - "gtceu.subtitle.science": "化學反應器:科!學!", - "gtceu.subtitle.screwdriver": "螺絲刀:擰螺絲", - "gtceu.subtitle.soft_hammer": "軟錘:輕敲", - "gtceu.subtitle.spray_can": "噴漆罐:噴塗", - "gtceu.subtitle.sus": "唱片:你有嫌疑", - "gtceu.subtitle.turbine": "渦輪:呼嘯", - "gtceu.subtitle.wirecutter": "剪線鉗:剪斷", - "gtceu.subtitle.wrench": "扳手:嘎啦", + "subtitles.gtceu.arc": "電弧爐:嗡——", + "subtitles.gtceu.assembler": "組裝機:運行中", + "subtitles.gtceu.bath": "化學水浴機:嘶嘶", + "subtitles.gtceu.boiler": "鍋爐:液體沸騰", + "subtitles.gtceu.centrifuge": "離心機:旋轉", + "subtitles.gtceu.chainsaw": "鏈鋸:拉動油門", + "subtitles.gtceu.chemical": "化學反應器:運行中", + "subtitles.gtceu.combustion": "內燃發電機:燃料燃燒", + "subtitles.gtceu.compressor": "壓縮機:擠壓", + "subtitles.gtceu.computation": "計算機:嗶嗶", + "subtitles.gtceu.cooling": "真空冷凍機:嗡——", + "subtitles.gtceu.cut": "切割機:嘶嘶叫", + "subtitles.gtceu.drill": "電鑽:嗡嗡", + "subtitles.gtceu.electrolyzer": "電解機:爆出火花", + "subtitles.gtceu.file": "銼:磨削", + "subtitles.gtceu.fire": "火:爆裂", + "subtitles.gtceu.forge_hammer": "鍛造錘:DUANG", + "subtitles.gtceu.furnace": "電爐:冶煉", + "subtitles.gtceu.jet_engine": "噴射背包:轟轟", + "subtitles.gtceu.macerator": "研磨機:破碎", + "subtitles.gtceu.metal_pipe": "流體管道:Destruction_Metal_Pole_L_Wave_2_0_0.wav", + "subtitles.gtceu.miner": "採礦機:開採", + "subtitles.gtceu.mixer": "攪拌機:攪動", + "subtitles.gtceu.mortar": "研缽:研磨", + "subtitles.gtceu.motor": "馬達:轉啊轉", + "subtitles.gtceu.plunger": "搋子:清理流體", + "subtitles.gtceu.portable_scanner": "便攜式掃描儀:掃描", + "subtitles.gtceu.portal_closing": "傳送門:關閉", + "subtitles.gtceu.portal_opening": "傳送門:開啟", + "subtitles.gtceu.replicator": "複製機:運行", + "subtitles.gtceu.saw": "鋸:切割", + "subtitles.gtceu.science": "化學反應器:科!學!", + "subtitles.gtceu.screwdriver": "螺絲刀:擰螺絲", + "subtitles.gtceu.soft_hammer": "軟錘:輕敲", + "subtitles.gtceu.spray_can": "噴漆罐:噴塗", + "subtitles.gtceu.sus": "唱片:你有嫌疑", + "subtitles.gtceu.turbine": "渦輪:呼嘯", + "subtitles.gtceu.wirecutter": "剪線鉗:剪斷", + "subtitles.gtceu.wrench": "扳手:嘎啦", "gtceu.thermal_centrifuge": "熱力離心機", "tool.gtceu.class.axe": "斧", "tool.gtceu.class.butchery_knife": "屠刀", From d7a80ec63859ceaeafb566e99e81f2b0a016b70d Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Sun, 22 Jun 2025 01:19:15 -0600 Subject: [PATCH 13/45] finish the moving of LangHandler, all lang values are now in dedicated files --- .../resources/assets/gtceu/lang/en_ud.json | 176 +++---- .../resources/assets/gtceu/lang/en_us.json | 176 +++---- .../api/gui/widget/EnumSelectorWidget.java | 1 - .../api/gui/widget/ToggleButtonWidget.java | 1 - .../CircuitFancyConfigurator.java | 1 - .../pattern/predicates/SimplePredicate.java | 2 - .../gtceu/data/lang/ArmorLang.java | 5 +- .../gtceu/data/lang/BlockLang.java | 21 +- .../gtceu/data/lang/ConfigurationLang.java | 4 +- .../gtceu/data/lang/CoverLang.java | 108 ++++- .../gregtechceu/gtceu/data/lang/GUILang.java | 247 ++++++++++ .../gtceu/data/lang/HazardLang.java | 8 +- .../gtceu/data/lang/IntegrationLang.java | 78 ++- .../gregtechceu/gtceu/data/lang/ItemLang.java | 48 +- .../gtceu/data/lang/LangHandler.java | 447 +----------------- .../gtceu/data/lang/MachineLang.java | 51 ++ .../gtceu/data/lang/MaterialLang.java | 133 +++--- .../gregtechceu/gtceu/data/lang/ToolLang.java | 42 +- 18 files changed, 815 insertions(+), 734 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/data/lang/GUILang.java diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 252ca043392..b0b3b9b39d1 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -1,37 +1,37 @@ { "armor.gtceu.energy_share.disable": "pǝןqɐsıp buıbɹɐɥɔ sʇǝbpɐ⅁ :ʎןddnS ʎbɹǝuƎ", - "armor.gtceu.energy_share.enable": "pǝןqɐuǝ buıbɹɐɥɔ sʇǝbpɐ⅁ :ʎןddnS ʎbɹǝuƎ", + "armor.gtceu.energy_share.enable": "pǝןqɐuǝ buıbɹɐɥɔ sʇǝbpɐ⅁ :ʎןddnS ʎbɹǝuƎɐ§", "armor.gtceu.energy_share.error": "¡buıbɹɐɥɔ sʇǝbpɐb ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ʎןddnS ʎbɹǝuƎ", "armor.gtceu.energy_share.tooltip": "%s :ǝpoɯ ʎןddnS", "armor.gtceu.energy_share.tooltip.guide": "ɯǝʇı buıpןoɥ uǝɥʍ ʞɔıןɔ ʇɥbıɹ-ʇɟıɥs ǝpoɯ ǝbuɐɥɔ o⟘", "armor.gtceu.hud.energy_lvl": "%s :ןǝʌǝꞀ ʎbɹǝuƎ", - "armor.gtceu.hud.engine_enabled": "%s :pǝןqɐuƎ ǝuıbuƎ", + "armor.gtceu.hud.engine_enabled": "%s :pǝןqɐuƎ ǝuıbuƎɐ§", "armor.gtceu.hud.fuel_lvl": "%s :ןǝʌǝꞀ ןǝnℲ", "armor.gtceu.hud.gravi_engine": "%s :ǝuıbuƎıʌɐɹ⅁", "armor.gtceu.hud.hover_mode": "%s :ǝpoW ɹǝʌoH", "armor.gtceu.hud.status.disabled": "ℲℲOɔ§", "armor.gtceu.hud.status.enabled": "NOɐ§", - "armor.gtceu.jetpack.emergency_hover_mode": "¡pǝןqɐuƎ ǝpoW ɹǝʌoH ʎɔuǝbɹǝɯƎ", + "armor.gtceu.jetpack.emergency_hover_mode": "¡pǝןqɐuƎ ǝpoW ɹǝʌoH ʎɔuǝbɹǝɯƎɐ§", "armor.gtceu.jetpack.flight.disable": "pǝןqɐsıᗡ ʇɥbıןℲ :ʞɔɐdʇǝſ", "armor.gtceu.jetpack.flight.enable": "pǝןqɐuƎ ʇɥbıןℲ :ʞɔɐdʇǝſ", "armor.gtceu.jetpack.hover.disable": "pǝןqɐsıᗡ ǝpoW ɹǝʌoH :ʞɔɐdʇǝſ", "armor.gtceu.jetpack.hover.enable": "pǝןqɐuƎ ǝpoW ɹǝʌoH :ʞɔɐdʇǝſ", - "armor.gtceu.message.nightvision.disabled": "ɟɟOɔ§ :uoısıΛʇɥbıNq§", - "armor.gtceu.message.nightvision.enabled": "uOɐ§ :uoısıΛʇɥbıNq§", - "armor.gtceu.message.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§", - "armor.gtceu.nms.boosted_jump.disabled": "pǝןqɐsıᗡ ʇsooᗺ dɯnſ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nms.boosted_jump.enabled": "pǝןqɐuƎ ʇsooᗺ dɯnſ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nms.charge.disable": "pǝןqɐsıᗡ buıbɹɐɥƆ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nms.charge.enable": "pǝןqɐuƎ buıbɹɐɥƆ :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.message.nightvision.disabled": "ɟɟOɔ§ :uoısıΛʇɥbıN", + "armor.gtceu.message.nightvision.enabled": "uOɐ§ :uoısıΛʇɥbıN", + "armor.gtceu.message.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoN", + "armor.gtceu.nms.boosted_jump.disabled": "pǝןqɐsıᗡ ʇsooᗺ dɯnſɔ§ :ǝʇınS ™ǝןɔsnWouɐN ", + "armor.gtceu.nms.boosted_jump.enabled": "pǝןqɐuƎ ʇsooᗺ dɯnſɐ§ :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.nms.charge.disable": "pǝןqɐsıᗡ buıbɹɐɥƆɔ§ :ǝʇınS ™ǝןɔsnWouɐN ", + "armor.gtceu.nms.charge.enabled": "pǝןqɐuƎ buıbɹɐɥƆɐ§ :ǝʇınS ™ǝןɔsnWouɐN", "armor.gtceu.nms.charge.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nms.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıN :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nms.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıN :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.nms.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıNɔ§ :ǝʇınS ™ǝןɔsnWouɐN ", + "armor.gtceu.nms.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıNɐ§ :ǝʇınS ™ǝןɔsnWouɐN", "armor.gtceu.nms.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.qts.charge.disable": "pǝןqɐsıᗡ buıbɹɐɥƆ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "armor.gtceu.qts.charge.enable": "pǝןqɐuƎ buıbɹɐɥƆ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.qts.charge.disable": "pǝןqɐsıᗡ buıbɹɐɥƆɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.qts.charge.enabled": "pǝןqɐuƎ buıbɹɐɥƆɐ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", "armor.gtceu.qts.charge.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "armor.gtceu.qts.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıN :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "armor.gtceu.qts.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıN :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.qts.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.qts.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıNɐ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", "armor.gtceu.qts.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", "armor.gtceu.tooltip.autoeat": "ʎɹoʇuǝʌuI ɯoɹɟ pooℲ buıs∩ ʎq ɹɐᗺ pooℲ sǝɥsıuǝןdǝᴚ", "armor.gtceu.tooltip.breath": "ɹɐᗺ ɥʇɐǝɹᗺ ɹǝʇɐʍɹǝpu∩ sǝɥsıuǝןdǝᴚ", @@ -2047,9 +2047,6 @@ "cover.ender_fluid_link.tooltip.list_button": "ʇsıן ןǝuuɐɥɔ ʍoɥS", "cover.filter.blacklist.disabled": "ʇsıןǝʇıɥM", "cover.filter.blacklist.enabled": "ʇsıןʞɔɐןᗺ", - "cover.filter.mode.filter_both": "ʇɔɐɹʇxƎ/ʇɹǝsuI ɹǝʇןıℲ", - "cover.filter.mode.filter_extract": "ʇɔɐɹʇxƎ ɹǝʇןıℲ", - "cover.filter.mode.filter_insert": "ʇɹǝsuI ɹǝʇןıℲ", "cover.fluid.voiding.advanced.title": "sbuıʇʇǝS buıpıoΛ pınןℲ pǝɔuɐʌpⱯ", "cover.fluid.voiding.title": "sbuıʇʇǝS buıpıoΛ pınןℲ", "cover.fluid_filter.config_amount.0": "˙sǝsɐǝɹɔǝp uʍop 'ʇunoɯɐ sǝsɐǝɹɔuı dn ןǝǝɥʍ ןןoɹɔS", @@ -2068,6 +2065,22 @@ "cover.fluid_regulator.transfer_mode.description.1": "˙pǝʌoɯ ǝq ʇ,uoʍ spınןɟ 'ǝzıs uoıʇɹod uɐɥʇ ssǝן sı spınןɟ ɟo ʇunoɯɐ ɟI ˙uoʇʇnq sıɥʇ ɥʇɐǝuɹǝpun ʍopuıʍ ǝɥʇ uı pǝıɟıɔǝds suoıʇɹod uı spınןɟ ʎןddns ןןıʍ ɹǝʌoɔ 'ǝpoɯ sıɥʇ uı - ɹ§ʇɔɐxƎ ʎןddnSǝ§", "cover.fluid_regulator.transfer_mode.description.2": "˙pǝɹınbǝɹ ɟı spınןɟ ɟo ʇunoɯɐ ןɐuoıʇıppɐ buıʎןddns 'ʎɹoʇuǝʌuı uoıʇɐuıʇsǝp ǝɥʇ uı spınןɟ ɟo ʇunoɯɐ pǝıɟıɔǝds dǝǝʞ ןןıʍ ɹǝʌoɔ 'ǝpoɯ sıɥʇ uı - ɹ§ʇɔɐxƎ dǝǝʞǝ§", "cover.fluid_regulator.transfer_mode.description.3": "˙00Ɩ ʎq ʎןdıʇןnɯ ןןıʍ ʞɔıןɔ ןɹʇɔ puɐ 0Ɩ ʎq sʇunoɯɐ ǝsɐǝɹɔǝp/ǝsɐǝɹɔuı ʎןdıʇןnɯ ןןıʍ ʞɔıןɔ ʇɟıɥs :dı⟘ㄥ§", + "cover.gtceu.filter.mode.filter_both": "ʇɔɐɹʇxƎ/ʇɹǝsuI ɹǝʇןıℲ", + "cover.gtceu.filter.mode.filter_extract": "ʇɔɐɹʇxƎ ɹǝʇןıℲ", + "cover.gtceu.filter.mode.filter_insert": "ʇɹǝsuI ɹǝʇןıℲ", + "cover.gtceu.tag_filter.info.0": "suoıssǝɹdxǝ xǝןdɯoɔ sʇdǝɔɔⱯq§", + "cover.gtceu.tag_filter.info.1": "ᗡNⱯ = ɹ§q & ɐ9§", + "cover.gtceu.tag_filter.info.10": ")ʌן*¡ & sʇınɔɹıɔ:nǝɔʇb( | pןob/sʇsnp*9§ :ǝןdɯɐxƎq§", + "cover.gtceu.tag_filter.info.11": "sǝuo ΛꞀ ʇdǝɔxǝ sʇınɔɹıɔ ןןɐ ɹo sʇsnp pןob ןןɐ sǝɥɔʇɐɯ sıɥ⟘", + "cover.gtceu.tag_filter.info.2": "ᴚO = ɹ§q | ɐ9§", + "cover.gtceu.tag_filter.info.3": "ᴚOX = ɹ§q ^ ɐ9§", + "cover.gtceu.tag_filter.info.4": "⟘ON = ɹ§ɐ¡9§", + "cover.gtceu.tag_filter.info.5": "buıdnoɹb ɹoɟ ɹ§)ɐ(9§", + "cover.gtceu.tag_filter.info.6": "pɹɐɔpןıʍ ɹoɟ ɹ§*9§", + "cover.gtceu.tag_filter.info.7": "pǝbbɐʇun ɹoɟ ɹ§$9§", + "cover.gtceu.tag_filter.info.8": "˙,ǝdʎʇqns/bɐʇ:ǝɔɐdsǝɯɐu, ɯɹoɟ ǝɥʇ uı ǝɯoɔ sbɐ⟘q§", + "cover.gtceu.tag_filter.info.9": "˙pǝpıʌoɹd ʇ,usı ǝuo ɟı pǝɯnssɐ sı ǝɔɐdsǝɯɐu ,:ǝbɹoɟ, ǝɥ⟘", + "cover.gtceu.test_slot.info": "uoıssǝɹdxǝ ɹǝʇןıɟ ǝɥʇ sǝɥɔʇɐɯ ʇı ɟı ʇsǝʇ oʇ ɯǝʇı ɐ ʇɹǝsuI", "cover.item.voiding.advanced.title": "sbuıʇʇǝS buıpıoΛ ɯǝʇI pǝɔuɐʌpⱯ", "cover.item.voiding.title": "sbuıʇʇǝS buıpıoΛ ɯǝʇI", "cover.item_filter.ignore_damage.disabled": "ǝbɐɯɐᗡ ʇɔǝdsǝᴚ", @@ -2111,21 +2124,8 @@ "cover.shutter.message.disabled": "ɹǝʇʇnɥs pǝuǝdO", "cover.shutter.message.enabled": "ɹǝʇʇnɥs pǝsoןƆ", "cover.storage.title": "ɹǝʌoƆ ǝbɐɹoʇS", - "cover.tag_filter.info.0": "suoıssǝɹdxǝ xǝןdɯoɔ sʇdǝɔɔⱯq§", - "cover.tag_filter.info.1": "ᗡNⱯ = ɹ§q & ɐ9§", - "cover.tag_filter.info.10": ")ʌן*¡ & sʇınɔɹıɔ:nǝɔʇb( | pןob/sʇsnp*9§ :ǝןdɯɐxƎq§", - "cover.tag_filter.info.11": "sǝuo ΛꞀ ʇdǝɔxǝ sʇınɔɹıɔ ןןɐ ɹo sʇsnp pןob ןןɐ sǝɥɔʇɐɯ sıɥ⟘", - "cover.tag_filter.info.2": "ᴚO = ɹ§q | ɐ9§", - "cover.tag_filter.info.3": "ᴚOX = ɹ§q ^ ɐ9§", - "cover.tag_filter.info.4": "⟘ON = ɹ§ɐ¡9§", - "cover.tag_filter.info.5": "buıdnoɹb ɹoɟ ɹ§)ɐ(9§", - "cover.tag_filter.info.6": "pɹɐɔpןıʍ ɹoɟ ɹ§*9§", - "cover.tag_filter.info.7": "pǝbbɐʇun ɹoɟ ɹ§$9§", - "cover.tag_filter.info.8": "˙,ǝdʎʇqns/bɐʇ:ǝɔɐdsǝɯɐu, ɯɹoɟ ǝɥʇ uı ǝɯoɔ sbɐ⟘q§", - "cover.tag_filter.info.9": "˙pǝpıʌoɹd ʇ,usı ǝuo ɟı pǝɯnssɐ sı ǝɔɐdsǝɯɐu ,:ǝbɹoɟ, ǝɥ⟘", "cover.tag_filter.matches": "sǝɥɔʇɐɯ ɯǝʇI", "cover.tag_filter.matches_not": "ɥɔʇɐɯ ʇou sǝop ɯǝʇI", - "cover.tag_filter.test_slot.info": "uoıssǝɹdxǝ ɹǝʇןıɟ ǝɥʇ sǝɥɔʇɐɯ ʇı ɟı ʇsǝʇ oʇ ɯǝʇı ɐ ʇɹǝsuI", "cover.tag_filter.title": "ɹǝʇןıℲ bɐ⟘", "cover.universal.manual_import_export.mode.description.0": " ˙ɹǝʇןıɟ sʇı puɐ ɹǝʌoɔ ǝɥʇ ʎq pǝıɟıɔǝds sɐ ǝʌoɯ ʎןuo ןןıʍ spınןɟ/sɯǝʇI - ɹ§pǝןqɐsıᗡǝ§", "cover.universal.manual_import_export.mode.description.1": " ˙)ʎuɐ ɟı( sǝɥɔʇɐɯ ɹǝʇןıɟ sʇı sɐ buoן sɐ 'ǝpoɯ ɹǝʌoɔ ǝɥʇ ɟo ʎןʇuǝpuǝdǝpuı pǝʇɹǝsuı puɐ pǝʇɔɐɹʇxǝ ǝq uɐɔ spınןɟ/sɯǝʇI - ɹ§pǝɹǝʇןıℲ ʍoןןⱯǝ§", @@ -2205,7 +2205,24 @@ "entity.gtceu.industrial_tnt": "⟘N⟘ ןɐıɹʇsnpuI", "entity.gtceu.powderbarrel": "ןǝɹɹɐqɹǝpʍoԀ", "fluid.empty": "ʎʇdɯƎ", + "fluid.gtceu.amount": "ᗺɯ %d/%d :ʇunoɯⱯ6§", + "fluid.gtceu.click_combined": "˙)ʞɔɐʇs ןןnɟ ɐ ɹoɟ ʞɔıןɔ-ʇɟıɥS( ʞuɐʇ ǝɥʇㄥ§ ןןıɟq§ ɹoㄥ§ ʎʇdɯǝɔ§ oʇ ɹǝuıɐʇuoƆ pınןℲ ɐ ɥʇıʍ ʞɔıןƆㄥ§", + "fluid.gtceu.click_to_empty": "˙)ʞɔɐʇs ןןnɟ ɐ ɹoɟ ʞɔıןɔ-ʇɟıɥS( ʞuɐʇ ǝɥʇㄥ§ ʎʇdɯǝɔ§ oʇ ɹǝuıɐʇuoƆ pınןℲ ɐ ɥʇıʍ ʞɔıןƆㄥ§", + "fluid.gtceu.click_to_fill": "˙)ʞɔɐʇs ןןnɟ ɐ ɹoɟ ʞɔıןɔ-ʇɟıɥS( ʞuɐʇ ǝɥʇㄥ§ ןןıɟq§ oʇ ɹǝuıɐʇuoƆ pınןℲ ɐ ɥʇıʍ ʞɔıןƆㄥ§", + "fluid.gtceu.empty": "ʎʇdɯƎ", + "fluid.gtceu.gas_generic": "sɐ⅁ %s", + "fluid.gtceu.gas_vapor": "ɹodɐΛ %s", + "fluid.gtceu.generic": "%s", + "fluid.gtceu.liquid_generic": "%s pınbıꞀ", + "fluid.gtceu.molten": "%s uǝʇןoW", + "fluid.gtceu.plasma": "ɐɯsɐןԀ %s", "fluid.gtceu.potion": "uoıʇoԀ", + "fluid.gtceu.tooltip.acid": "¡ǝɹɐɔ ɥʇıʍ ǝןpuɐH ¡ɔıpıɔⱯ9§", + "fluid.gtceu.tooltip.cryogenic": "¡ǝɹɐɔ ɥʇıʍ ǝןpuɐH ¡ɔıuǝboʎɹƆq§", + "fluid.gtceu.tooltip.gas": "snoǝsɐ⅁ :ǝʇɐʇSɐ§", + "fluid.gtceu.tooltip.liquid": "pınbıꞀ :ǝʇɐʇSɐ§", + "fluid.gtceu.tooltip.plasma": "ɐɯsɐןԀ :ǝʇɐʇSɐ§", + "fluid.gtceu.tooltip.temperature": "ʞ %d :ǝɹnʇɐɹǝdɯǝ⟘ɔ§", "fluid.spawnlocation.name": "uoıʇɐɯɹoɟuI uıǝΛ pınןℲ", "fluid.tile.lava": "ɐʌɐꞀ", "fluid.tile.water": "ɹǝʇɐM", @@ -2294,23 +2311,6 @@ "gtceu.extractor": "ɹoʇɔɐɹʇxƎ", "gtceu.extruder": "ɹǝpnɹʇxƎ", "gtceu.fermenter": "ɹǝʇuǝɯɹǝℲ", - "gtceu.fluid.amount": "ᗺɯ %d/%d :ʇunoɯⱯ6§", - "gtceu.fluid.click_combined": "˙)ʞɔɐʇs ןןnɟ ɐ ɹoɟ ʞɔıןɔ-ʇɟıɥS( ʞuɐʇ ǝɥʇㄥ§ ןןıɟq§ ɹoㄥ§ ʎʇdɯǝɔ§ oʇ ɹǝuıɐʇuoƆ pınןℲ ɐ ɥʇıʍ ʞɔıןƆㄥ§", - "gtceu.fluid.click_to_empty": "˙)ʞɔɐʇs ןןnɟ ɐ ɹoɟ ʞɔıןɔ-ʇɟıɥS( ʞuɐʇ ǝɥʇㄥ§ ʎʇdɯǝɔ§ oʇ ɹǝuıɐʇuoƆ pınןℲ ɐ ɥʇıʍ ʞɔıןƆㄥ§", - "gtceu.fluid.click_to_fill": "˙)ʞɔɐʇs ןןnɟ ɐ ɹoɟ ʞɔıןɔ-ʇɟıɥS( ʞuɐʇ ǝɥʇㄥ§ ןןıɟq§ oʇ ɹǝuıɐʇuoƆ pınןℲ ɐ ɥʇıʍ ʞɔıןƆㄥ§", - "gtceu.fluid.empty": "ʎʇdɯƎ", - "gtceu.fluid.gas_generic": "sɐ⅁ %s", - "gtceu.fluid.gas_vapor": "ɹodɐΛ %s", - "gtceu.fluid.generic": "%s", - "gtceu.fluid.liquid_generic": "%s pınbıꞀ", - "gtceu.fluid.molten": "%s uǝʇןoW", - "gtceu.fluid.plasma": "ɐɯsɐןԀ %s", - "gtceu.fluid.state_gas": "snoǝsɐ⅁ :ǝʇɐʇSɐ§", - "gtceu.fluid.state_liquid": "pınbıꞀ :ǝʇɐʇSɐ§", - "gtceu.fluid.state_plasma": "ɐɯsɐןԀ :ǝʇɐʇSɐ§", - "gtceu.fluid.temperature": "ʞ %d :ǝɹnʇɐɹǝdɯǝ⟘ɔ§", - "gtceu.fluid.temperature.cryogenic": "¡ǝɹɐɔ ɥʇıʍ ǝןpuɐH ¡ɔıuǝboʎɹƆq§", - "gtceu.fluid.type_acid.tooltip": "¡ǝɹɐɔ ɥʇıʍ ǝןpuɐH ¡ɔıpıɔⱯ9§", "gtceu.fluid_heater": "ɹǝʇɐǝH pınןℲ", "gtceu.fluid_pipe.acid_proof": "spıɔⱯ ǝןpuɐɥ uɐƆ9§", "gtceu.fluid_pipe.capacity": "ᗺɯ %dɟ§ :ʎʇıɔɐdɐƆ6§", @@ -3493,45 +3493,6 @@ "gtceu.sifter": "ɹǝʇɟıS", "gtceu.steam_boiler": "ɹǝןıoᗺ ɯɐǝʇS", "gtceu.steam_turbine": "ǝuıqɹn⟘ ɯɐǝʇS", - "subtitles.gtceu.arc": "buızznq sɔɹⱯ", - "subtitles.gtceu.assembler": "buıʇɔnɹʇsuoɔ ɹǝןqɯǝssⱯ", - "subtitles.gtceu.bath": "buızzıɟ ɥʇɐᗺ", - "subtitles.gtceu.boiler": "buıʇɐǝɥ ɹǝןıoᗺ", - "subtitles.gtceu.centrifuge": "buıuuıds ǝbnɟıɹʇuǝƆ", - "subtitles.gtceu.chainsaw": "buıʌʌǝɹ ʍɐsuıɐɥƆ", - "subtitles.gtceu.chemical": "buıןqqnq ןɐɔıɯǝɥƆ", - "subtitles.gtceu.combustion": "buıʇsnqɯoƆ", - "subtitles.gtceu.compressor": "buızǝǝnbs ɹossǝɹdɯoƆ", - "subtitles.gtceu.computation": "sdǝǝq ɹǝʇndɯoƆ", - "subtitles.gtceu.cooling": "buıɯɯnɥ ɹǝzǝǝɹℲ", - "subtitles.gtceu.cut": "buıɹɹıɥʍ ɹǝʇʇnƆ", - "subtitles.gtceu.drill": "buıןןıɹᗡ", - "subtitles.gtceu.electrolyzer": "buıʞɹɐds ɹǝzʎןoɹʇɔǝןƎ", - "subtitles.gtceu.file": "buıdsɐɹ ǝןıℲ", - "subtitles.gtceu.fire": "buıןʞɔɐɹɔ ǝɹıℲ", - "subtitles.gtceu.forge_hammer": "buıdɯnɥʇ ɹǝɯɯɐH ǝbɹoℲ", - "subtitles.gtceu.furnace": "buıʇɐǝɥ ǝɔɐuɹnℲ", - "subtitles.gtceu.jet_engine": "buıɹɐoɹ ʇǝſ", - "subtitles.gtceu.macerator": "buıɥsnɹɔ ɹoʇɐɹǝɔɐW", - "subtitles.gtceu.metal_pipe": "ʌɐʍ˙0‾0‾ᄅ‾ǝʌɐM‾Ꞁ‾ǝןoԀ‾ןɐʇǝW‾uoıʇɔnɹʇsǝᗡ", - "subtitles.gtceu.miner": "buıʇɐʌɐɔxǝ ɹǝuıW", - "subtitles.gtceu.mixer": "buıɥsoןs ɹǝxıW", - "subtitles.gtceu.mortar": "buıɥsnɹɔ ɹɐʇɹoW", - "subtitles.gtceu.motor": "buıɯɯnɥ ɹoʇoW", - "subtitles.gtceu.plunger": "buıddod ɹǝbunןԀ", - "subtitles.gtceu.portable_scanner": "buıuuɐɔS", - "subtitles.gtceu.portal_closing": "sǝsoןɔ ןɐʇɹoԀ", - "subtitles.gtceu.portal_opening": "suǝdo ןɐʇɹoԀ", - "subtitles.gtceu.replicator": "buıʎdoɔ ɹoʇɐɔıןdǝᴚ", - "subtitles.gtceu.saw": "buıʍɐS", - "subtitles.gtceu.science": "ǝ ɔ u ǝ ı ɔ s", - "subtitles.gtceu.screwdriver": "buıʍǝɹɔS", - "subtitles.gtceu.soft_hammer": "dɐʇ ʇɟoS", - "subtitles.gtceu.spray_can": "buıʎɐɹdS", - "subtitles.gtceu.sus": "˙˙˙snS", - "subtitles.gtceu.turbine": "buızzıɥʍ ǝuıqɹn⟘", - "subtitles.gtceu.wirecutter": "pǝddıus ǝɹıM", - "subtitles.gtceu.wrench": "buıןʇʇɐɹ ɥɔuǝɹM", "gtceu.thermal_centrifuge": "ǝbnɟıɹʇuǝƆ ןɐɯɹǝɥ⟘", "gtceu.tool_action.crowbar": "sɹǝʌoƆ ǝʌoɯǝɹ oʇ ɹɐqʍoɹƆ ǝs∩8§", "gtceu.tool_action.hammer": "spunoS ǝןɟɟnɯ oʇ ɹǝɯɯɐH pɹɐH ǝs∩8§", @@ -5380,6 +5341,45 @@ "recipe.condition.rock_breaker.tooltip": "punoɹɐ sʞɔoןq pınןℲ", "recipe.condition.steam_vent.tooltip": "ʇuǝʌ ɯɐǝʇs uɐǝןƆ", "recipe.condition.thunder.tooltip": "%d :ןǝʌǝꞀ ɹǝpunɥ⟘", + "subtitles.gtceu.arc": "buızznq sɔɹⱯ", + "subtitles.gtceu.assembler": "buıʇɔnɹʇsuoɔ ɹǝןqɯǝssⱯ", + "subtitles.gtceu.bath": "buızzıɟ ɥʇɐᗺ", + "subtitles.gtceu.boiler": "buıʇɐǝɥ ɹǝןıoᗺ", + "subtitles.gtceu.centrifuge": "buıuuıds ǝbnɟıɹʇuǝƆ", + "subtitles.gtceu.chainsaw": "buıʌʌǝɹ ʍɐsuıɐɥƆ", + "subtitles.gtceu.chemical": "buıןqqnq ןɐɔıɯǝɥƆ", + "subtitles.gtceu.combustion": "buıʇsnqɯoƆ", + "subtitles.gtceu.compressor": "buızǝǝnbs ɹossǝɹdɯoƆ", + "subtitles.gtceu.computation": "sdǝǝq ɹǝʇndɯoƆ", + "subtitles.gtceu.cooling": "buıɯɯnɥ ɹǝzǝǝɹℲ", + "subtitles.gtceu.cut": "buıɹɹıɥʍ ɹǝʇʇnƆ", + "subtitles.gtceu.drill": "buıןןıɹᗡ", + "subtitles.gtceu.electrolyzer": "buıʞɹɐds ɹǝzʎןoɹʇɔǝןƎ", + "subtitles.gtceu.file": "buıdsɐɹ ǝןıℲ", + "subtitles.gtceu.fire": "buıןʞɔɐɹɔ ǝɹıℲ", + "subtitles.gtceu.forge_hammer": "buıdɯnɥʇ ɹǝɯɯɐH ǝbɹoℲ", + "subtitles.gtceu.furnace": "buıʇɐǝɥ ǝɔɐuɹnℲ", + "subtitles.gtceu.jet_engine": "buıɹɐoɹ ʇǝſ", + "subtitles.gtceu.macerator": "buıɥsnɹɔ ɹoʇɐɹǝɔɐW", + "subtitles.gtceu.metal_pipe": "ʌɐʍ˙0‾0‾ᄅ‾ǝʌɐM‾Ꞁ‾ǝןoԀ‾ןɐʇǝW‾uoıʇɔnɹʇsǝᗡ", + "subtitles.gtceu.miner": "buıʇɐʌɐɔxǝ ɹǝuıW", + "subtitles.gtceu.mixer": "buıɥsoןs ɹǝxıW", + "subtitles.gtceu.mortar": "buıɥsnɹɔ ɹɐʇɹoW", + "subtitles.gtceu.motor": "buıɯɯnɥ ɹoʇoW", + "subtitles.gtceu.plunger": "buıddod ɹǝbunןԀ", + "subtitles.gtceu.portable_scanner": "buıuuɐɔS", + "subtitles.gtceu.portal_closing": "sǝsoןɔ ןɐʇɹoԀ", + "subtitles.gtceu.portal_opening": "suǝdo ןɐʇɹoԀ", + "subtitles.gtceu.replicator": "buıʎdoɔ ɹoʇɐɔıןdǝᴚ", + "subtitles.gtceu.saw": "buıʍɐS", + "subtitles.gtceu.science": "ǝ ɔ u ǝ ı ɔ s", + "subtitles.gtceu.screwdriver": "buıʍǝɹɔS", + "subtitles.gtceu.soft_hammer": "dɐʇ ʇɟoS", + "subtitles.gtceu.spray_can": "buıʎɐɹdS", + "subtitles.gtceu.sus": "˙˙˙snS", + "subtitles.gtceu.turbine": "buızzıɥʍ ǝuıqɹn⟘", + "subtitles.gtceu.wirecutter": "pǝddıus ǝɹıM", + "subtitles.gtceu.wrench": "buıןʇʇɐɹ ɥɔuǝɹM", "tagprefix.andesite": "ǝɹO %s ǝʇısǝpuⱯ", "tagprefix.basalt": "ǝɹO %s ʇןɐsɐᗺ", "tagprefix.blackstone": "ǝɹO %s ǝuoʇsʞɔɐןᗺ", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 3d0a354907d..134e119efba 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -1,37 +1,37 @@ { "armor.gtceu.energy_share.disable": "Energy Supply: Gadgets charging disabled", - "armor.gtceu.energy_share.enable": "Energy Supply: Gadgets charging enabled", + "armor.gtceu.energy_share.enable": "§aEnergy Supply: Gadgets charging enabled", "armor.gtceu.energy_share.error": "Energy Supply: §cNot enough power for gadgets charging!", "armor.gtceu.energy_share.tooltip": "Supply mode: %s", "armor.gtceu.energy_share.tooltip.guide": "To change mode shift-right click when holding item", "armor.gtceu.hud.energy_lvl": "Energy Level: %s", - "armor.gtceu.hud.engine_enabled": "Engine Enabled: %s", + "armor.gtceu.hud.engine_enabled": "§aEngine Enabled: %s", "armor.gtceu.hud.fuel_lvl": "Fuel Level: %s", "armor.gtceu.hud.gravi_engine": "GraviEngine: %s", "armor.gtceu.hud.hover_mode": "Hover Mode: %s", "armor.gtceu.hud.status.disabled": "§cOFF", "armor.gtceu.hud.status.enabled": "§aON", - "armor.gtceu.jetpack.emergency_hover_mode": "Emergency Hover Mode Enabled!", + "armor.gtceu.jetpack.emergency_hover_mode": "§aEmergency Hover Mode Enabled!", "armor.gtceu.jetpack.flight.disable": "Jetpack: Flight Disabled", "armor.gtceu.jetpack.flight.enable": "Jetpack: Flight Enabled", "armor.gtceu.jetpack.hover.disable": "Jetpack: Hover Mode Disabled", "armor.gtceu.jetpack.hover.enable": "Jetpack: Hover Mode Enabled", - "armor.gtceu.message.nightvision.disabled": "§bNightVision: §cOff", - "armor.gtceu.message.nightvision.enabled": "§bNightVision: §aOn", - "armor.gtceu.message.nightvision.error": "§cNot enough power!", - "armor.gtceu.nms.boosted_jump.disabled": "NanoMuscle™ Suite: Jump Boost Disabled", - "armor.gtceu.nms.boosted_jump.enabled": "NanoMuscle™ Suite: Jump Boost Enabled", - "armor.gtceu.nms.charge.disable": "NanoMuscle™ Suite: Charging Disabled", - "armor.gtceu.nms.charge.enable": "NanoMuscle™ Suite: Charging Enabled", + "armor.gtceu.message.nightvision.disabled": "NightVision: §cOff", + "armor.gtceu.message.nightvision.enabled": "NightVision: §aOn", + "armor.gtceu.message.nightvision.error": "Not enough power!", + "armor.gtceu.nms.boosted_jump.disabled": " NanoMuscle™ Suite: §cJump Boost Disabled", + "armor.gtceu.nms.boosted_jump.enabled": "NanoMuscle™ Suite: §aJump Boost Enabled", + "armor.gtceu.nms.charge.disable": " NanoMuscle™ Suite: §cCharging Disabled", + "armor.gtceu.nms.charge.enabled": "NanoMuscle™ Suite: §aCharging Enabled", "armor.gtceu.nms.charge.error": "NanoMuscle™ Suite: §cNot enough power for charging!", - "armor.gtceu.nms.nightvision.disabled": "NanoMuscle™ Suite: NightVision Disabled", - "armor.gtceu.nms.nightvision.enabled": "NanoMuscle™ Suite: NightVision Enabled", + "armor.gtceu.nms.nightvision.disabled": " NanoMuscle™ Suite: §cNightVision Disabled", + "armor.gtceu.nms.nightvision.enabled": "NanoMuscle™ Suite: §aNightVision Enabled", "armor.gtceu.nms.nightvision.error": "NanoMuscle™ Suite: §cNot enough power!", - "armor.gtceu.qts.charge.disable": "QuarkTech™ Suite: Charging Disabled", - "armor.gtceu.qts.charge.enable": "QuarkTech™ Suite: Charging Enabled", + "armor.gtceu.qts.charge.disable": "QuarkTech™ Suite: §cCharging Disabled", + "armor.gtceu.qts.charge.enabled": "QuarkTech™ Suite: §aCharging Enabled", "armor.gtceu.qts.charge.error": "QuarkTech™ Suite: §cNot enough power for charging!", - "armor.gtceu.qts.nightvision.disabled": "QuarkTech™ Suite: NightVision Disabled", - "armor.gtceu.qts.nightvision.enabled": "QuarkTech™ Suite: NightVision Enabled", + "armor.gtceu.qts.nightvision.disabled": "QuarkTech™ Suite: §cNightVision Disabled", + "armor.gtceu.qts.nightvision.enabled": "QuarkTech™ Suite: §aNightVision Enabled", "armor.gtceu.qts.nightvision.error": "QuarkTech™ Suite: §cNot enough power!", "armor.gtceu.tooltip.autoeat": "Replenishes Food Bar by Using Food from Inventory", "armor.gtceu.tooltip.breath": "Replenishes Underwater Breath Bar", @@ -2047,9 +2047,6 @@ "cover.ender_fluid_link.tooltip.list_button": "Show channel list", "cover.filter.blacklist.disabled": "Whitelist", "cover.filter.blacklist.enabled": "Blacklist", - "cover.filter.mode.filter_both": "Filter Insert/Extract", - "cover.filter.mode.filter_extract": "Filter Extract", - "cover.filter.mode.filter_insert": "Filter Insert", "cover.fluid.voiding.advanced.title": "Advanced Fluid Voiding Settings", "cover.fluid.voiding.title": "Fluid Voiding Settings", "cover.fluid_filter.config_amount.0": "Scroll wheel up increases amount, down decreases.", @@ -2068,6 +2065,22 @@ "cover.fluid_regulator.transfer_mode.description.1": "§eSupply Exact§r - in this mode, cover will supply fluids in portions specified in the window underneath this button. If amount of fluids is less than portion size, fluids won't be moved.", "cover.fluid_regulator.transfer_mode.description.2": "§eKeep Exact§r - in this mode, cover will keep specified amount of fluids in the destination inventory, supplying additional amount of fluids if required.", "cover.fluid_regulator.transfer_mode.description.3": "§7Tip: shift click will multiply increase/decrease amounts by 10 and ctrl click will multiply by 100.", + "cover.gtceu.filter.mode.filter_both": "Filter Insert/Extract", + "cover.gtceu.filter.mode.filter_extract": "Filter Extract", + "cover.gtceu.filter.mode.filter_insert": "Filter Insert", + "cover.gtceu.tag_filter.info.0": "§bAccepts complex expressions", + "cover.gtceu.tag_filter.info.1": "§6a & b§r = AND", + "cover.gtceu.tag_filter.info.10": "§bExample: §6*dusts/gold | (gtceu:circuits & !*lv)", + "cover.gtceu.tag_filter.info.11": "This matches all gold dusts or all circuits except LV ones", + "cover.gtceu.tag_filter.info.2": "§6a | b§r = OR", + "cover.gtceu.tag_filter.info.3": "§6a ^ b§r = XOR", + "cover.gtceu.tag_filter.info.4": "§6!a§r = NOT", + "cover.gtceu.tag_filter.info.5": "§6(a)§r for grouping", + "cover.gtceu.tag_filter.info.6": "§6*§r for wildcard", + "cover.gtceu.tag_filter.info.7": "§6$§r for untagged", + "cover.gtceu.tag_filter.info.8": "§bTags come in the form 'namespace:tag/subtype'.", + "cover.gtceu.tag_filter.info.9": "The 'forge:' namespace is assumed if one isn't provided.", + "cover.gtceu.test_slot.info": "Insert a item to test if it matches the filter expression", "cover.item.voiding.advanced.title": "Advanced Item Voiding Settings", "cover.item.voiding.title": "Item Voiding Settings", "cover.item_filter.ignore_damage.disabled": "Respect Damage", @@ -2111,21 +2124,8 @@ "cover.shutter.message.disabled": "Opened shutter", "cover.shutter.message.enabled": "Closed shutter", "cover.storage.title": "Storage Cover", - "cover.tag_filter.info.0": "§bAccepts complex expressions", - "cover.tag_filter.info.1": "§6a & b§r = AND", - "cover.tag_filter.info.10": "§bExample: §6*dusts/gold | (gtceu:circuits & !*lv)", - "cover.tag_filter.info.11": "This matches all gold dusts or all circuits except LV ones", - "cover.tag_filter.info.2": "§6a | b§r = OR", - "cover.tag_filter.info.3": "§6a ^ b§r = XOR", - "cover.tag_filter.info.4": "§6!a§r = NOT", - "cover.tag_filter.info.5": "§6(a)§r for grouping", - "cover.tag_filter.info.6": "§6*§r for wildcard", - "cover.tag_filter.info.7": "§6$§r for untagged", - "cover.tag_filter.info.8": "§bTags come in the form 'namespace:tag/subtype'.", - "cover.tag_filter.info.9": "The 'forge:' namespace is assumed if one isn't provided.", "cover.tag_filter.matches": "Item matches", "cover.tag_filter.matches_not": "Item does not match", - "cover.tag_filter.test_slot.info": "Insert a item to test if it matches the filter expression", "cover.tag_filter.title": "Tag Filter", "cover.universal.manual_import_export.mode.description.0": "§eDisabled§r - Items/fluids will only move as specified by the cover and its filter. ", "cover.universal.manual_import_export.mode.description.1": "§eAllow Filtered§r - Items/fluids can be extracted and inserted independently of the cover mode, as long as its filter matches (if any). ", @@ -2205,7 +2205,24 @@ "entity.gtceu.industrial_tnt": "Industrial TNT", "entity.gtceu.powderbarrel": "Powderbarrel", "fluid.empty": "Empty", + "fluid.gtceu.amount": "§9Amount: %d/%d mB", + "fluid.gtceu.click_combined": "§7Click with a Fluid Container to §cempty §7or §bfill §7the tank (Shift-click for a full stack).", + "fluid.gtceu.click_to_empty": "§7Click with a Fluid Container to §cempty §7the tank (Shift-click for a full stack).", + "fluid.gtceu.click_to_fill": "§7Click with a Fluid Container to §bfill §7the tank (Shift-click for a full stack).", + "fluid.gtceu.empty": "Empty", + "fluid.gtceu.gas_generic": "%s Gas", + "fluid.gtceu.gas_vapor": "%s Vapor", + "fluid.gtceu.generic": "%s", + "fluid.gtceu.liquid_generic": "Liquid %s", + "fluid.gtceu.molten": "Molten %s", + "fluid.gtceu.plasma": "%s Plasma", "fluid.gtceu.potion": "Potion", + "fluid.gtceu.tooltip.acid": "§6Acidic! Handle with care!", + "fluid.gtceu.tooltip.cryogenic": "§bCryogenic! Handle with care!", + "fluid.gtceu.tooltip.gas": "§aState: Gaseous", + "fluid.gtceu.tooltip.liquid": "§aState: Liquid", + "fluid.gtceu.tooltip.plasma": "§aState: Plasma", + "fluid.gtceu.tooltip.temperature": "§cTemperature: %d K", "fluid.spawnlocation.name": "Fluid Vein Information", "fluid.tile.lava": "Lava", "fluid.tile.water": "Water", @@ -2294,23 +2311,6 @@ "gtceu.extractor": "Extractor", "gtceu.extruder": "Extruder", "gtceu.fermenter": "Fermenter", - "gtceu.fluid.amount": "§9Amount: %d/%d mB", - "gtceu.fluid.click_combined": "§7Click with a Fluid Container to §cempty §7or §bfill §7the tank (Shift-click for a full stack).", - "gtceu.fluid.click_to_empty": "§7Click with a Fluid Container to §cempty §7the tank (Shift-click for a full stack).", - "gtceu.fluid.click_to_fill": "§7Click with a Fluid Container to §bfill §7the tank (Shift-click for a full stack).", - "gtceu.fluid.empty": "Empty", - "gtceu.fluid.gas_generic": "%s Gas", - "gtceu.fluid.gas_vapor": "%s Vapor", - "gtceu.fluid.generic": "%s", - "gtceu.fluid.liquid_generic": "Liquid %s", - "gtceu.fluid.molten": "Molten %s", - "gtceu.fluid.plasma": "%s Plasma", - "gtceu.fluid.state_gas": "§aState: Gaseous", - "gtceu.fluid.state_liquid": "§aState: Liquid", - "gtceu.fluid.state_plasma": "§aState: Plasma", - "gtceu.fluid.temperature": "§cTemperature: %d K", - "gtceu.fluid.temperature.cryogenic": "§bCryogenic! Handle with care!", - "gtceu.fluid.type_acid.tooltip": "§6Acidic! Handle with care!", "gtceu.fluid_heater": "Fluid Heater", "gtceu.fluid_pipe.acid_proof": "§6Can handle Acids", "gtceu.fluid_pipe.capacity": "§9Capacity: §f%d mB", @@ -3493,45 +3493,6 @@ "gtceu.sifter": "Sifter", "gtceu.steam_boiler": "Steam Boiler", "gtceu.steam_turbine": "Steam Turbine", - "subtitles.gtceu.arc": "Arcs buzzing", - "subtitles.gtceu.assembler": "Assembler constructing", - "subtitles.gtceu.bath": "Bath fizzing", - "subtitles.gtceu.boiler": "Boiler heating", - "subtitles.gtceu.centrifuge": "Centrifuge spinning", - "subtitles.gtceu.chainsaw": "Chainsaw revving", - "subtitles.gtceu.chemical": "Chemical bubbling", - "subtitles.gtceu.combustion": "Combusting", - "subtitles.gtceu.compressor": "Compressor squeezing", - "subtitles.gtceu.computation": "Computer beeps", - "subtitles.gtceu.cooling": "Freezer humming", - "subtitles.gtceu.cut": "Cutter whirring", - "subtitles.gtceu.drill": "Drilling", - "subtitles.gtceu.electrolyzer": "Electrolyzer sparking", - "subtitles.gtceu.file": "File rasping", - "subtitles.gtceu.fire": "Fire crackling", - "subtitles.gtceu.forge_hammer": "Forge Hammer thumping", - "subtitles.gtceu.furnace": "Furnace heating", - "subtitles.gtceu.jet_engine": "Jet roaring", - "subtitles.gtceu.macerator": "Macerator crushing", - "subtitles.gtceu.metal_pipe": "Destruction_Metal_Pole_L_Wave_2_0_0.wav", - "subtitles.gtceu.miner": "Miner excavating", - "subtitles.gtceu.mixer": "Mixer sloshing", - "subtitles.gtceu.mortar": "Mortar crushing", - "subtitles.gtceu.motor": "Motor humming", - "subtitles.gtceu.plunger": "Plunger popping", - "subtitles.gtceu.portable_scanner": "Scanning", - "subtitles.gtceu.portal_closing": "Portal closes", - "subtitles.gtceu.portal_opening": "Portal opens", - "subtitles.gtceu.replicator": "Replicator copying", - "subtitles.gtceu.saw": "Sawing", - "subtitles.gtceu.science": "s c i e n c e", - "subtitles.gtceu.screwdriver": "Screwing", - "subtitles.gtceu.soft_hammer": "Soft tap", - "subtitles.gtceu.spray_can": "Spraying", - "subtitles.gtceu.sus": "Sus...", - "subtitles.gtceu.turbine": "Turbine whizzing", - "subtitles.gtceu.wirecutter": "Wire snipped", - "subtitles.gtceu.wrench": "Wrench rattling", "gtceu.thermal_centrifuge": "Thermal Centrifuge", "gtceu.tool_action.crowbar": "§8Use Crowbar to remove Covers", "gtceu.tool_action.hammer": "§8Use Hard Hammer to muffle Sounds", @@ -5380,6 +5341,45 @@ "recipe.condition.rock_breaker.tooltip": "Fluid blocks around", "recipe.condition.steam_vent.tooltip": "Clean steam vent", "recipe.condition.thunder.tooltip": "Thunder Level: %d", + "subtitles.gtceu.arc": "Arcs buzzing", + "subtitles.gtceu.assembler": "Assembler constructing", + "subtitles.gtceu.bath": "Bath fizzing", + "subtitles.gtceu.boiler": "Boiler heating", + "subtitles.gtceu.centrifuge": "Centrifuge spinning", + "subtitles.gtceu.chainsaw": "Chainsaw revving", + "subtitles.gtceu.chemical": "Chemical bubbling", + "subtitles.gtceu.combustion": "Combusting", + "subtitles.gtceu.compressor": "Compressor squeezing", + "subtitles.gtceu.computation": "Computer beeps", + "subtitles.gtceu.cooling": "Freezer humming", + "subtitles.gtceu.cut": "Cutter whirring", + "subtitles.gtceu.drill": "Drilling", + "subtitles.gtceu.electrolyzer": "Electrolyzer sparking", + "subtitles.gtceu.file": "File rasping", + "subtitles.gtceu.fire": "Fire crackling", + "subtitles.gtceu.forge_hammer": "Forge Hammer thumping", + "subtitles.gtceu.furnace": "Furnace heating", + "subtitles.gtceu.jet_engine": "Jet roaring", + "subtitles.gtceu.macerator": "Macerator crushing", + "subtitles.gtceu.metal_pipe": "Destruction_Metal_Pole_L_Wave_2_0_0.wav", + "subtitles.gtceu.miner": "Miner excavating", + "subtitles.gtceu.mixer": "Mixer sloshing", + "subtitles.gtceu.mortar": "Mortar crushing", + "subtitles.gtceu.motor": "Motor humming", + "subtitles.gtceu.plunger": "Plunger popping", + "subtitles.gtceu.portable_scanner": "Scanning", + "subtitles.gtceu.portal_closing": "Portal closes", + "subtitles.gtceu.portal_opening": "Portal opens", + "subtitles.gtceu.replicator": "Replicator copying", + "subtitles.gtceu.saw": "Sawing", + "subtitles.gtceu.science": "s c i e n c e", + "subtitles.gtceu.screwdriver": "Screwing", + "subtitles.gtceu.soft_hammer": "Soft tap", + "subtitles.gtceu.spray_can": "Spraying", + "subtitles.gtceu.sus": "Sus...", + "subtitles.gtceu.turbine": "Turbine whizzing", + "subtitles.gtceu.wirecutter": "Wire snipped", + "subtitles.gtceu.wrench": "Wrench rattling", "tagprefix.andesite": "Andesite %s Ore", "tagprefix.basalt": "Basalt %s Ore", "tagprefix.blackstone": "Blackstone %s Ore", diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/EnumSelectorWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/EnumSelectorWidget.java index 5ccca01a291..65275047910 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/EnumSelectorWidget.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/EnumSelectorWidget.java @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.data.lang.LangUtil; -import com.gregtechceu.gtceu.data.lang.LangUtil; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.widget.CycleButtonWidget; diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ToggleButtonWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ToggleButtonWidget.java index cb4f3011588..2d0562dec69 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ToggleButtonWidget.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ToggleButtonWidget.java @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.data.lang.LangUtil; -import com.gregtechceu.gtceu.data.lang.LangUtil; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CircuitFancyConfigurator.java b/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CircuitFancyConfigurator.java index b8a3f71d326..fdfde2e30f5 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CircuitFancyConfigurator.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CircuitFancyConfigurator.java @@ -9,7 +9,6 @@ import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangUtil; -import com.gregtechceu.gtceu.data.lang.LangUtil; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.texture.ItemStackTexture; diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/SimplePredicate.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/SimplePredicate.java index 324495f6ba8..b1bd8ba5c6c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/SimplePredicate.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/SimplePredicate.java @@ -8,7 +8,6 @@ import com.gregtechceu.gtceu.api.pattern.error.SinglePredicateError; import com.gregtechceu.gtceu.data.lang.LangUtil; -import com.gregtechceu.gtceu.data.lang.LangUtil; import com.lowdragmc.lowdraglib.utils.BlockInfo; import net.minecraft.client.Minecraft; @@ -24,7 +23,6 @@ import it.unimi.dsi.fastutil.longs.Long2ObjectArrayMap; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import it.unimi.dsi.fastutil.longs.LongOpenHashSet; -import org.apache.commons.codec.language.bm.Lang; import org.jetbrains.annotations.Nullable; import java.util.*; diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java index 95f8ded7150..1e3669b178f 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java @@ -38,14 +38,11 @@ private static void generateArmorKeys(RegistrateLangProvider provider) { provider.add("armor.gtceu.jetpack.hover.disable", "Jetpack: Hover Mode Disabled"); provider.add("armor.gtceu.jetpack.emergency_hover_mode", "§aEmergency Hover Mode Enabled!"); - // action bar messages provider.add("armor.gtceu.message.nightvision.enabled", "NightVision: §aOn"); provider.add("armor.gtceu.message.nightvision.disabled", "NightVision: §cOff"); provider.add("armor.gtceu.message.nightvision.error", "Not enough power!"); - - - } + } private static void generateTooltipKeys(RegistrateLangProvider provider) { provider.add("item.liquid_fuel_jetpack.tooltip", "Uses Combustion Generator Fuels for Thrust"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java index 1d271104390..90b13d7af5d 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java @@ -32,7 +32,7 @@ private static void generateBlockKeys(RegistrateLangProvider provider) { replace(provider, "block.gtceu.wire_coil.tooltip_cracking", "§8Cracking Unit:"); replace(provider, "block.gtceu.wire_coil.tooltip_energy_cracking", " §aEnergy Usage: §f%s%%"); - // Substation capacitors + // Substation Capacitors provider.add("block.gtceu.substation_capacitor.tooltip_empty", "§7For filling space in your Power Substation"); provider.add("block.gtceu.substation_capacitor.tooltip_filled", "§cEnergy Capacity: §f%d EU"); @@ -110,6 +110,25 @@ private static void generateBlockKeys(RegistrateLangProvider provider) { replace(provider, GTBlocks.BATTERY_EMPTY_TIER_III.get().getDescriptionId(), "Empty Tier III Capacitor"); replace(provider, GTBlocks.BATTERY_LAPOTRONIC_UV.get().getDescriptionId(), "UV Lapotronic Capacitor"); replace(provider, GTBlocks.BATTERY_ULTIMATE_UHV.get().getDescriptionId(), "UHV Ultimate Capacitor"); + + // Decor Stuff + replace(provider, "block.gtceu.yellow_stripes_block.a", "Yellow Stripes Block"); + replace(provider, "block.gtceu.yellow_stripes_block.b", "Yellow Stripes Block"); + replace(provider, "block.gtceu.yellow_stripes_block.c", "Yellow Stripes Block"); + replace(provider, "block.gtceu.yellow_stripes_block.d", "Yellow Stripes Block"); + + // Extra stone blocks + provider.add("tile.gtceu.seal.name", "Sealed Block"); + provider.add("tile.gtceu.foam.name", "Foam"); + provider.add("tile.gtceu.reinforced_foam.name", "Reinforced Foam"); + provider.add("tile.gtceu.petrified_foam.name", "Petrified Foam"); + provider.add("tile.gtceu.reinforced_stone.name", "Reinforced Stone"); + provider.add("tile.gtceu.brittle_charcoal.name", "Brittle Charcoal"); + multilineLang(provider, "tile.gtceu.brittle_charcoal.tooltip", + "Produced by the Charcoal Pile Igniter.\nMine this to get Charcoal."); + + // Surface Rocks + provider.add("block.surface_rock", "%s Surface Rock"); } private static void generatePipeKeys(RegistrateLangProvider provider) { diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java index 79a3aa596f3..9bcec4e51d3 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.config.ConfigHolder; - import com.tterrag.registrate.providers.RegistrateLangProvider; import dev.toma.configuration.Configuration; import dev.toma.configuration.config.format.ConfigFormats; @@ -22,7 +21,8 @@ public static void init(RegistrateLangProvider provider) { dfs(provider, new HashSet<>(), Configuration.registerConfig(ConfigHolder.class, ConfigFormats.yaml()).getValueMap()); } - //depth first search === dfs + + // depth first search === dfs private static void dfs(RegistrateLangProvider provider, Set added, Map> map) { for (var entry : map.entrySet()) { var id = entry.getValue().getId(); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/CoverLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/CoverLang.java index e7aeacc7531..0b86cf5473c 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/CoverLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/CoverLang.java @@ -11,21 +11,17 @@ public static void init(RegistrateLangProvider provider) { } private static void generateCoverKeys(RegistrateLangProvider provider) { - - //todo uses + // todo uses provider.add("cover.filter.blacklist.disabled", "Whitelist"); provider.add("cover.filter.blacklist.enabled", "Blacklist"); - - //filter + // Filter IO provider.add("cover.gtceu.filter.mode.filter_insert", "Filter Insert"); provider.add("cover.gtceu.filter.mode.filter_extract", "Filter Extract"); provider.add("cover.gtceu.filter.mode.filter_both", "Filter Insert/Extract"); - - - //tag filter - //todo: use these??? + // Tag filter + // todo: use these??? provider.add("cover.tag_filter.title", "Tag Filter"); multilineLang(provider, "cover.gtceu.tag_filter.info", """ @@ -46,7 +42,7 @@ private static void generateCoverKeys(RegistrateLangProvider provider) { provider.add("cover.tag_filter.matches", "Item matches"); provider.add("cover.tag_filter.matches_not", "Item does not match"); - //fluid filter + // Fluid filter provider.add("cover.fluid_filter.title", "Fluid Filter"); multilineLang(provider, "cover.fluid_filter.config_amount", "Scroll wheel up increases amount, down decreases.\nShift[§6x10§r],Ctrl[§ex100§r],Shift+Ctrl[§ax1000§r]\nRight click increases amount, left click decreases.\nHold shift to double/halve.\nMiddle click to clear"); @@ -54,14 +50,16 @@ private static void generateCoverKeys(RegistrateLangProvider provider) { provider.add("cover.fluid_filter.mode.filter_drain", "Filter Drain"); provider.add("cover.fluid_filter.mode.filter_both", "Filter Fill & Drain"); - //item filter + // Item filter provider.add("cover.item_filter.title", "Item Filter"); provider.add("cover.item_filter.ignore_damage.disabled", "Respect Damage"); provider.add("cover.item_filter.ignore_nbt.enabled", "Ignore NBT"); provider.add("cover.item_filter.ignore_nbt.disabled", "Respect NBT"); provider.add("cover.item_filter.ignore_damage.enabled", "Ignore Damage"); + provider.add("gtceu.item_filter.empty_item", "Empty (No Item)"); + provider.add("gtceu.item_filter.footer", "§eClick with item to override"); - // smart filter + // Smart filter provider.add("cover.item_smart_filter.title", "Smart Item Filter"); provider.add("cover.item_smart_filter.filtering_mode.electrolyzer", "Electrolyzer"); provider.add("cover.item_smart_filter.filtering_mode.centrifuge", "Centrifuge"); @@ -69,10 +67,10 @@ private static void generateCoverKeys(RegistrateLangProvider provider) { multilineLang(provider, "cover.item_smart_filter.filtering_mode.description", "Select Machine this Smart Filter will use for filtering.\nIt will automatically pick right portions of items for robotic arm."); - + // Storage Cover provider.add("cover.storage.title", "Storage Cover"); - //voiding + // Voiding provider.add("cover.voiding.voiding_mode.void_any", "Void Matching"); provider.add("cover.voiding.voiding_mode.void_overflow", "Void Overflow"); multilineLang(provider, "cover.voiding.voiding_mode.description", @@ -88,7 +86,7 @@ private static void generateCoverKeys(RegistrateLangProvider provider) { provider.add("cover.voiding.message.disabled", "Voiding Cover Disabled"); provider.add("cover.voiding.message.enabled", "Voiding Cover Enabled"); - // conveyors + // Conveyors provider.add("cover.conveyor.title", "Conveyor Cover Settings (%s)"); provider.add("cover.conveyor.transfer_rate", "§7items/sec"); provider.add("cover.conveyor.mode", "Mode: %s"); @@ -105,7 +103,7 @@ private static void generateCoverKeys(RegistrateLangProvider provider) { multilineLang(provider, "cover.conveyor.blocks_input.disabled", "If enabled, items will not be inserted when cover is set to pull items from the inventory into pipe.\n§cDisabled"); - //cover universal whatever that is + // Common cover key entries provider.add("cover.universal.manual_import_export.mode.disabled", "Manual I/O: §bDisabled\n§7Items / Fluids will only move as specified by the cover and its filter."); provider.add("cover.universal.manual_import_export.mode.filtered", @@ -118,7 +116,7 @@ private static void generateCoverKeys(RegistrateLangProvider provider) { multiLang(provider, "cover.conveyor.tag.title", "Tag Name", "(use * for wildcard)"); - // robot arm + // Robot arm provider.add("cover.robotic_arm.title", "Robotic Arm Settings (%s)"); provider.add("cover.robotic_arm.transfer_mode.transfer_any", "Transfer Any"); provider.add("cover.robotic_arm.transfer_mode.transfer_exact", "Supply Exact"); @@ -126,7 +124,7 @@ private static void generateCoverKeys(RegistrateLangProvider provider) { multilineLang(provider, "cover.robotic_arm.transfer_mode.description", "§eTransfer Any§r - in this mode, cover will transfer as many items matching its filter as possible.\n§eSupply Exact§r - in this mode, cover will supply items in portions specified in item filter slots (or variable under this button for tag filter). If amount of items is less than portion size, items won't be moved.\n§eKeep Exact§r - in this mode, cover will keep specified amount of items in the destination inventory, supplying additional amount of items if required.\n§7Tip: left/right click on filter slots to change item amount, use shift clicking to change amount faster."); - //pump + // Pump provider.add("cover.pump.title", "Pump Cover Settings (%s)"); provider.add("cover.pump.transfer_rate", "%s"); provider.add("cover.pump.mode.export", "Mode: Export"); @@ -135,14 +133,14 @@ private static void generateCoverKeys(RegistrateLangProvider provider) { provider.add("cover.bucket.mode.bucket", "B"); provider.add("cover.bucket.mode.milli_bucket", "mB"); - //fluid regulator + // Fluid regulator provider.add("cover.fluid_regulator.title", "Fluid Regulator Settings (%s)"); multilineLang(provider, "cover.fluid_regulator.transfer_mode.description", "§eTransfer Any§r - in this mode, cover will transfer as many fluids matching its filter as possible.\n§eSupply Exact§r - in this mode, cover will supply fluids in portions specified in the window underneath this button. If amount of fluids is less than portion size, fluids won't be moved.\n§eKeep Exact§r - in this mode, cover will keep specified amount of fluids in the destination inventory, supplying additional amount of fluids if required.\n§7Tip: shift click will multiply increase/decrease amounts by 10 and ctrl click will multiply by 100."); provider.add("cover.fluid_regulator.supply_exact", "Supply Exact: %s"); provider.add("cover.fluid_regulator.keep_exact", "Keep Exact: %s"); - //machine controller + // Machine controller provider.add("cover.machine_controller.title", "Machine Controller Settings"); provider.add("cover.machine_controller.normal", "Normal"); provider.add("cover.machine_controller.inverted", "Inverted"); @@ -160,7 +158,7 @@ private static void generateCoverKeys(RegistrateLangProvider provider) { provider.add("cover.machine_controller.mode.cover_west", "Control Cover (West)"); provider.add("cover.machine_controller.mode.null", "Control Nothing"); - //ender fluid + // Ender fluid provider.add("cover.ender_fluid_link.title", "Ender Fluid Link"); provider.add("cover.ender_fluid_link.iomode.enabled", "I/O Enabled"); provider.add("cover.ender_fluid_link.iomode.disabled", "I/O Disabled"); @@ -174,7 +172,7 @@ private static void generateCoverKeys(RegistrateLangProvider provider) { multilineLang(provider, "cover.ender_fluid_link.incomplete_hex", "Inputted color is incomplete!\nIt will be applied once complete (all 8 hex digits)\nClosing the gui will lose edits!"); - // detector + // Detector provider.add("cover.detector_base.message_normal_state", "Monitoring Status: Normal"); provider.add("cover.detector_base.message_inverted_state", "Monitoring Status: Inverted"); @@ -187,7 +185,13 @@ private static void generateCoverKeys(RegistrateLangProvider provider) { multilineLang(provider, "cover.advanced_detector.latch.disabled", "Behavior: Continuous\n\n" + detectorLatchDescription); - // advanced energy detector + // Energy Detector + provider.add("gtceu.cover.energy_detector.message_electricity_storage_normal", + "Monitoring Normal Electricity Storage"); + provider.add("gtceu.cover.energy_detector.message_electricity_storage_inverted", + "Monitoring Inverted Electricity Storage"); + + // Advanced energy detector provider.add("cover.advanced_energy_detector.label", "Advanced Energy Detector"); provider.add("cover.advanced_energy_detector.min", "Min"); provider.add("cover.advanced_energy_detector.max", "Max"); @@ -203,7 +207,13 @@ private static void generateCoverKeys(RegistrateLangProvider provider) { multilineLang(provider, "cover.advanced_energy_detector.use_percent.disabled", "Mode: Discrete EU\n\n" + advancedEnergyDetectorModeDescription); - // advanced fluid cover + // Fluid detector + provider.add("gtceu.cover.fluid_detector.message_fluid_storage_normal", + "Monitoring Normal Fluid Storage"); + provider.add("gtceu.cover.fluid_detector.message_fluid_storage_inverted", + "Monitoring Inverted Fluid Storage"); + + // Advanced fluid detector provider.add("cover.advanced_fluid_detector.label", "Advanced Fluid Detector"); var advancedFluidDetectorInvertDescription = "Toggle to invert the redstone logic\nBy default, redstone stops emitting when less than the minimum mB of fluid, and starts emitting when greater than the min mB of fluid up to the set maximum"; multilineLang(provider, "cover.advanced_fluid_detector.invert.enabled", @@ -213,7 +223,12 @@ private static void generateCoverKeys(RegistrateLangProvider provider) { provider.add("cover.advanced_fluid_detector.max", "Max Fluid (mB)"); provider.add("cover.advanced_fluid_detector.min", "Min Fluid (mB)"); - // advanced item detector + // Item detector + provider.add("gtceu.cover.item_detector.message_item_storage_normal", "Monitoring Normal Item Storage"); + provider.add("gtceu.cover.item_detector.message_item_storage_inverted", + "Monitoring Inverted Item Storage"); + + // Advanced item detector provider.add("cover.advanced_item_detector.label", "Advanced Item Detector"); var advancedItemDetectorInvertDescription = "Toggle to invert the redstone logic\nBy default, redstone stops emitting when less than the minimum amount of items, and starts emitting when greater than the min amount of items up to the set maximum"; multilineLang(provider, "cover.advanced_item_detector.invert.enabled", @@ -223,8 +238,51 @@ private static void generateCoverKeys(RegistrateLangProvider provider) { provider.add("cover.advanced_item_detector.max", "Max Items"); provider.add("cover.advanced_item_detector.min", "Min Items"); - //shutter + // Activity detector + provider.add("gtceu.cover.activity_detector.message_activity_normal", + "Monitoring Normal Activity Status"); + provider.add("gtceu.cover.activity_detector.message_activity_inverted", + "Monitoring Inverted Activity Status"); + provider.add("gtceu.cover.activity_detector_advanced.message_activity_normal", + "Monitoring Normal Progress Status"); + provider.add("gtceu.cover.activity_detector_advanced.message_activity_inverted", + "Monitoring Inverted Progress Status"); + + // Shutter provider.add("cover.shutter.message.enabled", "Closed shutter"); provider.add("cover.shutter.message.disabled", "Opened shutter"); + + // Proxy cover + provider.add("item.cover.digital.mode.proxy.disabled", "Click to enable Proxy Mode"); + provider.add("item.cover.digital.mode.proxy.enabled", "Proxy Mode enabled"); + provider.add("item.cover.digital.mode.machine.disabled", "Click to enable Machine Mode"); + provider.add("item.cover.digital.mode.machine.enabled", "Machine Mode enabled"); + provider.add("item.cover.digital.mode.energy.disabled", "Click to enable Energy Mode"); + provider.add("item.cover.digital.mode.energy.enabled", "Energy Mode enabled"); + provider.add("item.cover.digital.mode.item.disabled", "Click to enable Item Mode"); + provider.add("item.cover.digital.mode.item.enabled", "Item Mode enabled"); + provider.add("item.cover.digital.mode.fluid.disabled", "Click to enable Fluid Mode"); + provider.add("item.cover.digital.mode.fluid.enabled", "Fluid Mode enabled"); + + // Digital wireless cover + multiLang(provider, "item.cover.digital.wireless.tooltip", + "§fWirelessly§7 connects machines to the §fCentral Monitor§7 as §fCover§7.", + "§fRight Click§7 on the §fCentral Monitor§7 to remotely bind to it.", + "§fSneak Right Click§7 to remove the current binding.", + "§aBinding: §f%s"); + + // Central Monitor + provider.add("monitor.gui.title.back", "Back"); + provider.add("monitor.gui.title.scale", "Scale:"); + provider.add("monitor.gui.title.argb", "ARGB:"); + provider.add("monitor.gui.title.slot", "Slot:"); + provider.add("monitor.gui.title.plugin", "Plugin:"); + provider.add("monitor.gui.title.config", "Config"); + + provider.add("item.plugin.tooltips.1", + "Plugins can be added to the screen for more functionality."); + provider.add("item.plugin.proxy.tooltips.1", "(Please adjust to proxy mode in the screen)"); + provider.add("item.cover.digital.tooltip", + "Connects machines over §fPower Cables§7 to the §fCentral Monitor§7 as §fCover§7."); } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/GUILang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/GUILang.java new file mode 100644 index 00000000000..bbb4f6bfd30 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/GUILang.java @@ -0,0 +1,247 @@ +package com.gregtechceu.gtceu.data.lang; + +import com.tterrag.registrate.providers.RegistrateLangProvider; + +import static com.gregtechceu.gtceu.data.lang.LangUtil.multiLang; +import static com.gregtechceu.gtceu.data.lang.LangUtil.multilineLang; + +public class GUILang { + + public static void init(RegistrateLangProvider provider) { + generateKeybindKeys(provider); + generateWidgetKeys(provider); + generateTooltipKeys(provider); + generateLDLibKeys(provider); + } + + private static void generateLDLibKeys(RegistrateLangProvider provider) { + provider.add("gtceu.gui.editor.tips.citation", "Number of citations"); + provider.add("gtceu.gui.editor.group.recipe_type", "cap"); + provider.add("ldlib.gui.editor.register.editor.gtceu.rtui", "RecipeType UI Project"); + provider.add("ldlib.gui.editor.register.editor.gtceu.mui", "Machine UI Project"); + provider.add("ldlib.gui.editor.register.editor.gtceu.template_tab", "templates"); + provider.add("ldlib.gui.editor.group.widget.gtm_container", "GTM Container Widgets"); + provider.add("ldlib.gui.editor.register.widget.container.gtm_item_slot", "GTM Item Slot"); + provider.add("ldlib.gui.editor.register.widget.container.gtm_fluid_slot", "GTM Fluid Slot"); + provider.add("ldlib.gui.editor.register.widget.container.gtm_phantom_item_slot", "GTM Phantom Item Slot"); + provider.add("ldlib.gui.editor.register.widget.container.gtm_phantom_fluid_slot", "GTM Phantom Fluid Slot"); + } + + private static void generateKeybindKeys(RegistrateLangProvider provider) { + provider.add("gtceu.key.armor_mode_switch", "Armor Mode Switch"); + provider.add("gtceu.key.armor_hover", "Armor Hover Toggle"); + provider.add("gtceu.key.enable_jetpack", "Enable Jetpack"); + provider.add("gtceu.key.enable_boots", "Enable Boosted Jump"); + provider.add("gtceu.key.armor_charging", "Armor Charging to Inventory Toggle"); + provider.add("gtceu.key.tool_aoe_change", "Tool AoE Mode Switch"); + provider.add("gtceu.debug.f3_h.enabled", + "GregTech has modified the debug info! For Developers: enable the misc:debug config option in the GregTech config file to see more"); + } + + private static void generateTooltipKeys(RegistrateLangProvider provider) { + provider.add("gtceu.part_sharing.disabled", "Multiblock Sharing §4Disabled"); + provider.add("gtceu.part_sharing.enabled", "Multiblock Sharing §aEnabled"); + provider.add("gtceu.universal.liters", "%s mB"); + provider.add("gtceu.universal.kiloliters", "%s B"); + provider.add("gtceu.universal.tooltip.voltage_in", "§aVoltage IN: §f%d EU/t (%s§f)"); + provider.add("gtceu.universal.tooltip.max_voltage_in", "§aMax Voltage IN: §f%d (%s§f)"); + provider.add("gtceu.universal.tooltip.voltage_out", "§aVoltage OUT: §f%d EU/t (%s§f)"); + provider.add("gtceu.universal.tooltip.max_voltage_out", "§aMax Voltage OUT: §f%d (%s§f)"); + provider.add("gtceu.universal.tooltip.voltage_in_out", "§aVoltage IN/OUT: §f%d EU/t (%s§f)"); + provider.add("gtceu.universal.tooltip.max_voltage_in_out", "§aMax Voltage IN/OUT: §f%d EU/t (%s§f)"); + provider.add("gtceu.universal.tooltip.amperage_in", "§eAmperage IN: §f%dA"); + provider.add("gtceu.universal.tooltip.amperage_in_till", "§eAmperage IN up to: §f%dA"); + provider.add("gtceu.universal.tooltip.amperage_out", "§eAmperage OUT: §f%dA"); + provider.add("gtceu.universal.tooltip.amperage_out_till", "§eAmperage OUT up to: §f%dA"); + provider.add("gtceu.universal.tooltip.amperage_in_out", "§eAmperage IN/OUT: §f%dA"); + provider.add("gtceu.universal.tooltip.amperage_in_out_till", "§eAmperage IN/OUT up to: §f%dA"); + provider.add("gtceu.universal.tooltip.energy_storage_capacity", "§cEnergy Capacity: §r%d EU"); + provider.add("gtceu.universal.tooltip.energy_tier_range", "§aAllowed Voltage Tiers: §f%s §f- %s"); + provider.add("gtceu.universal.tooltip.item_storage_capacity", "§6Item Slots: §f%d"); + provider.add("gtceu.universal.tooltip.item_storage_total", "§6Item Capacity: §f%d items"); + provider.add("gtceu.universal.tooltip.item_stored", "§dItem Stored: §f%s, %d items"); + provider.add("gtceu.universal.tooltip.item_transfer_rate", "§bTransfer Rate: §f%d items/s"); + provider.add("gtceu.universal.tooltip.item_transfer_rate_stacks", "§bTransfer Rate: §f%d stacks/s"); + provider.add("gtceu.universal.tooltip.fluid_storage_capacity", "§9Fluid Capacity: §f%d mB"); + provider.add("gtceu.universal.tooltip.fluid_storage_capacity_mult", + "§9Fluid Capacity: §f%d §7Tanks, §f%d mB §7each"); + provider.add("gtceu.universal.tooltip.fluid_stored", "§2Fluid Stored: §f%s, %d mB"); + provider.add("gtceu.universal.tooltip.fluid_transfer_rate", "§bTransfer Rate: §f%d mB/t"); + provider.add("gtceu.universal.tooltip.parallel", "§dMax Parallel: §f%d"); + provider.add("gtceu.universal.tooltip.working_area", "§bWorking Area: §f%dx%d"); + provider.add("gtceu.universal.tooltip.chunk_mode", "Chunk Mode: "); + provider.add("gtceu.universal.tooltip.silk_touch", "Silk Touch: "); + provider.add("gtceu.universal.tooltip.working_area_chunks", "§bWorking Area: §f%dx%d Chunks"); + provider.add("gtceu.universal.tooltip.working_area_max", "§bMax Working Area: §f%dx%d"); + provider.add("gtceu.universal.tooltip.working_area_chunks_max", "§bMax Working Area: §f%dx%d Chunks"); + provider.add("gtceu.universal.tooltip.uses_per_tick", "Uses §f%d EU/t §7while working"); + provider.add("gtceu.universal.tooltip.uses_per_tick_steam", "Uses §f%d mB/t §7of §fSteam §7while working"); + provider.add("gtceu.universal.tooltip.uses_per_hour_lubricant", + "Uses §f%d mB/hr §7of §6Lubricant §7while working"); + provider.add("gtceu.universal.tooltip.uses_per_second", "Uses §f%d EU/s §7while working"); + provider.add("gtceu.universal.tooltip.uses_per_op", "Uses §f%d EU/operation"); + provider.add("gtceu.universal.tooltip.base_production_eut", "§eBase Production: §f%d EU/t"); + provider.add("gtceu.universal.tooltip.base_production_fluid", "§eBase Production: §f%d mB/t"); + provider.add("gtceu.universal.tooltip.produces_fluid", "§eProduces: §f%d mB/t"); + provider.add("gtceu.universal.tooltip.terrain_resist", + "This Machine will not explode when exposed to the Elements"); + provider.add("gtceu.universal.tooltip.requires_redstone", "§4Requires Redstone power"); + provider.add("gtceu.universal.tooltip.deprecated", + "§4§lWARNING:§r§4 DEPRECATED. WILL BE REMOVED IN A FUTURE VERSION.§r"); + + provider.add("gtceu.tooltip.hold_shift", "§7Hold SHIFT for more info"); + provider.add("gtceu.tooltip.hold_ctrl", "§7Hold CTRL for more info"); + provider.add("gtceu.tooltip.fluid_pipe_hold_shift", "§7Hold SHIFT to show Fluid Containment Info"); + provider.add("gtceu.tooltip.tool_fluid_hold_shift", + "§7Hold SHIFT to show Fluid Containment and Tool Info"); + + // Trinary + provider.add("gtceu.tooltip.status.trinary.false", "False"); + provider.add("gtceu.tooltip.status.trinary.true", "True"); + provider.add("gtceu.tooltip.status.trinary.unknown", "Unknown"); + + // Directionality + provider.add("gtceu.direction.tooltip.up", "Up"); + provider.add("gtceu.direction.tooltip.down", "Down"); + provider.add("gtceu.direction.tooltip.left", "Left"); + provider.add("gtceu.direction.tooltip.right", "Right"); + provider.add("gtceu.direction.tooltip.back", "Back"); + provider.add("gtceu.direction.tooltip.front", "Front"); + } + + private static void generateWidgetKeys(RegistrateLangProvider provider) { + // General UI Keys + provider.add("gtceu.gui.title_bar.back", "Back"); + provider.add("gtceu.gui.title_bar.page_switcher", "Pages"); + provider.add("gtceu.gui.fuel_amount", "Fuel Amount:"); + provider.add("gtceu.gui.fluid_amount", "Fluid Amount:"); + provider.add("gtceu.gui.toggle_view.disabled", "Toggle View (Fluids)"); + provider.add("gtceu.gui.toggle_view.enabled", "Toggle View (Items)"); + multilineLang(provider, "gtceu.gui.overclock.enabled", "Overclocking Enabled.\nClick to Disable"); + multilineLang(provider, "gtceu.gui.overclock.disabled", "Overclocking Disabled.\nClick to Enable"); + multilineLang(provider, "gtceu.gui.overclock.description", + "Overclock Button\n§7Recipes can overclock up to the set tier"); + provider.add("gtceu.gui.overclock.off", "X"); + provider.add("gtceu.gui.sort", "Sort"); + provider.add("gtceu.gui.fluid_auto_output.tooltip.enabled", "Fluid Auto-Output Enabled"); + provider.add("gtceu.gui.fluid_auto_output.tooltip.disabled", "Fluid Auto-Output Disabled"); + provider.add("gtceu.gui.fluid_auto_input.tooltip.enabled", "Fluid Auto-Input Enabled"); + provider.add("gtceu.gui.fluid_auto_input.tooltip.disabled", "Fluid Auto-Input Disabled"); + provider.add("gtceu.gui.item_auto_output.tooltip.enabled", "Item Auto-Output Enabled"); + provider.add("gtceu.gui.item_auto_output.tooltip.disabled", "Item Auto-Output Disabled"); + provider.add("gtceu.gui.item_auto_input.tooltip.enabled", "Item Auto-Input Enabled"); + provider.add("gtceu.gui.item_auto_input.tooltip.disabled", "Item Auto-Input Disabled"); + multilineLang(provider, "gtceu.gui.charger_slot.tooltip", + "§fCharger Slot§r\n§7Draws power from %s batteries§r\n§7Charges %s tools and batteries"); + multilineLang(provider, "gtceu.gui.configurator_slot.tooltip", + "§fConfigurator Slot§r\n§7Place a §6Programmed Circuit§7 in this slot to\n§7change its configured value.\n§7Hold §6Shift§7 when clicking buttons to change by §65.\n§aA Programmed Circuit in this slot is also valid for recipe inputs.§r"); + provider.add("gtceu.gui.fluid_lock.tooltip.enabled", "Fluid Locking Enabled"); + provider.add("gtceu.gui.fluid_lock.tooltip.disabled", "Fluid Locking Disabled"); + provider.add("gtceu.gui.fluid_voiding_partial.tooltip.enabled", "Fluid Voiding Enabled"); + provider.add("gtceu.gui.fluid_voiding_partial.tooltip.disabled", "Fluid Voiding Disabled"); + provider.add("gtceu.gui.item_lock.tooltip.enabled", "Item Locking Enabled"); + provider.add("gtceu.gui.item_lock.tooltip.disabled", "Item Locking Disabled"); + provider.add("gtceu.gui.item_voiding_partial.tooltip.enabled", "Item Voiding Enabled"); + provider.add("gtceu.gui.item_voiding_partial.tooltip.disabled", "Item Voiding Disabled"); + multilineLang(provider, "gtceu.gui.silktouch.enabled", + "Silk Touch Enabled: Click to Disable.\n§7Switching requires an idle machine."); + multilineLang(provider, "gtceu.gui.silktouch.disabled", + "Silk Touch Disabled: Click to Enable.\n§7Switching requires an idle machine."); + multilineLang(provider, "gtceu.gui.chunkmode.enabled", + "Chunk Mode Enabled: Click to Disable.\n§7Switching requires an idle machine."); + multilineLang(provider, "gtceu.gui.chunkmode.disabled", + "Chunk Mode Disabled: Click to Enable.\n§7Switching requires an idle machine."); + multilineLang(provider, "gtceu.gui.multiblock_item_voiding", "Voiding Mode\n§7Voiding §6Items"); + multilineLang(provider, "gtceu.gui.multiblock_fluid_voiding", "Voiding Mode\n§7Voiding §9Fluids"); + multilineLang(provider, "gtceu.gui.multiblock_item_fluid_voiding", + "Voiding Mode\n§7Voiding §6Items §7and §9Fluids"); + multilineLang(provider, "gtceu.gui.multiblock_no_voiding", "Voiding Mode\n§7Voiding Nothing"); + multilineLang(provider, "gtceu.gui.fisher_mode.tooltip", + "Toggle junk items\nOff costs 2 string per operation"); + + // Multiblock Page + provider.add("gtceu.multiblock.page_switcher.io.import", "§2Inputs"); + provider.add("gtceu.multiblock.page_switcher.io.export", "§4Outputs"); + provider.add("gtceu.multiblock.page_switcher.io.both", "§5Combined Inputs + Outputs"); + + // Generic Buttons + provider.add("gui.widget.incrementButton.default_tooltip", + "Hold Shift, Ctrl or both to change the amount"); + provider.add("gui.widget.recipeProgressWidget.default_tooltip", "Show Recipes"); + + // NBT Clearing + provider.add("gtceu.universal.clear_nbt_recipe.tooltip", "§cThis will destroy all contents!"); + + // EIO style gui + provider.add("gtceu.gui.cover_setting.title", "Cover Settings"); + provider.add("gtceu.gui.output_setting.title", "Output Settings"); + provider.add("gtceu.gui.circuit.title", "Circuit Settings"); + multiLang(provider, "gtceu.gui.output_setting.tooltips", "left-click to tune the item auto output", + "right-click to tune the fluid auto output."); + provider.add("gtceu.gui.item_auto_output.allow_input.enabled", + "allow items input from the output side"); + provider.add("gtceu.gui.item_auto_output.allow_input.disabled", + "disable items input from the output side"); + provider.add("gtceu.gui.fluid_auto_output.allow_input.enabled", + "allow fluids input from the output side"); + provider.add("gtceu.gui.fluid_auto_output.allow_input.disabled", + "disable fluids input from the output side"); + provider.add("gtceu.gui.auto_output.name", "auto"); + provider.add("gtceu.gui.overclock.title", "Overclock Tier"); + provider.add("gtceu.gui.overclock.range", "Available Tiers [%s, %s]"); + + // Content + provider.add("gtceu.gui.content.per_tick", "§aConsumed/Produced Per Tick§r"); + provider.add("gtceu.gui.content.tips.per_tick_short", "§a/tick§r"); + provider.add("gtceu.gui.content.tips.per_second_short", "§a/second§r"); + + provider.add("gtceu.gui.content.units.per_tick", "/t"); + provider.add("gtceu.gui.content.units.per_second", "/s"); + + // Recipe Logic + multiLang(provider, "gtceu.oc.tooltip", "Min: %s", "Left click to increase the OC", + "Right click to decrease the OC", "Middle click to reset the OC", + "Hold Shift to change by Perfect OC"); + + // Recipe Capabilities + provider.add("recipe.capability.eu.name", "GTCEu Energy"); + provider.add("recipe.capability.fluid.name", "Fluid"); + provider.add("recipe.capability.item.name", "Item"); + provider.add("gtceu.recipe_type.show_recipes", "Show Recipes"); + provider.add("gtceu.recipe_logic.insufficient_fuel", "Insufficient Fuel"); + provider.add("gtceu.recipe_logic.insufficient_in", "Insufficient Inputs"); + provider.add("gtceu.recipe_logic.insufficient_out", "Insufficient Outputs"); + provider.add("gtceu.recipe_logic.condition_fails", "Condition Fails"); + provider.add("gtceu.recipe_logic.no_contents", "Recipe has no Contents"); + provider.add("gtceu.recipe_logic.no_capabilities", "Machine has no Capabilities"); + + // Chance Logic + provider.add("gtceu.gui.content.chance_nc", "§cNot Consumed§r"); + provider.add("gtceu.gui.content.chance_nc_short", "§cNC§r"); + provider.add("gtceu.gui.content.chance_base", "Base Chance: %s%%"); + provider.add("gtceu.gui.content.chance_base_logic", "Base Chance: %s%% (%s)"); + provider.add("gtceu.gui.content.chance_tier_boost_plus", "Bonus Chance: +%s%%/tier"); + provider.add("gtceu.gui.content.chance_tier_boost_minus", "Bonus Chance: -%s%%/tier"); + provider.add("gtceu.gui.content.chance_boosted", "Chance at Tier: %s%%"); + provider.add("gtceu.gui.content.chance_boosted_logic", "Chance at Tier: %s%% (%s)"); + provider.add("gtceu.gui.content.count_range", "%s-%sx"); + + provider.add("gtceu.chance_logic.or", "OR"); + provider.add("gtceu.chance_logic.and", "AND"); + provider.add("gtceu.chance_logic.xor", "XOR"); + provider.add("gtceu.chance_logic.first", "FIRST"); + provider.add("gtceu.chance_logic.none", "NONE"); + + // AE Widgets + provider.add("gtceu.gui.me_network.online", "Network Status: §2Online§r"); + provider.add("gtceu.gui.me_network.offline", "Network Status: §4Offline§r"); + provider.add("gtceu.gui.waiting_list", "Sending Queue:"); + provider.add("gtceu.gui.config_slot", "§fConfig Slot§r"); + provider.add("gtceu.gui.config_slot.set", "§7Click to §bset/select§7 config slot.§r"); + provider.add("gtceu.gui.config_slot.scroll", "§7Scroll wheel to §achange§7 config amount.§r"); + provider.add("gtceu.gui.config_slot.remove", "§7Right click to §4clear§7 config slot.§r"); + provider.add("gtceu.gui.config_slot.set_only", "§7Click to §bset§7 config slot.§r"); + provider.add("gtceu.gui.config_slot.auto_pull_managed", "§4Disabled:§7 Managed by Auto-Pull"); + provider.add("gtceu.gui.me_bus.auto_pull_button", "Click to toggle automatic item pulling from ME"); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java index 3a20adcbdfd..62c73444b18 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java @@ -26,18 +26,24 @@ private static void generateHazardKeys(RegistrateLangProvider provider) { provider.add("gtceu.medical_condition.methanol_poisoning", "§6Methanol Poisoning"); provider.add("gtceu.medical_condition.carbon_monoxide_poisoning", "§7Carbon Monoxide Poisoning"); provider.add("gtceu.medical_condition.none", "§2Not Dangerous"); + provider.add("gtceu.hazard_trigger.description", "Caused by:"); provider.add("gtceu.hazard_trigger.protection.description", "Protects from:"); provider.add("gtceu.hazard_trigger.inhalation", "Inhalation"); provider.add("gtceu.hazard_trigger.any", "Any contact"); - provider.add("gtceu.hazard_trigger.skin_contact", "Skin contact"); provider.add("gtceu.hazard_trigger.none", "Nothing"); + provider.add("gtceu.medical_condition.antidote.description", "§aAntidote §7Hold Shift to show details"); provider.add("gtceu.medical_condition.antidote.description_shift", "§aCures these conditions:"); provider.add("gtceu.medical_condition.antidote.description.effect_removed", "Removes %s%% of current conditions' effects"); provider.add("gtceu.medical_condition.antidote.description.effect_removed.all", "Removes all of current conditions' effects"); + + provider.add("gtceu.tooltip.potion.header", "§6Contains effects:"); + provider.add("gtceu.tooltip.potion.each", "%s %s §7for§r %s §7ticks with a§r %s%% §7chance of happening§r"); + + provider.add("effect.gtceu.weak_poison", "Weak Poison"); } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java index db4d0f8079a..a282b86e4dd 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java @@ -17,20 +17,64 @@ public static void init(RegistrateLangProvider provider) { initWailaLikeLang(provider); initMinimapLang(provider); initOwnershipLang(provider); + + // Curios + provider.add("curios.identifier.gtceu_magnet", "GTCEu Magnet"); } /** JEI, REI, EMI */ private static void initRecipeViewerLang(RegistrateLangProvider provider) { provider.add("gtceu.jei.multiblock_info", "Multiblock Info"); + provider.add("gtceu.jei.ore_processing_diagram", "Ore Processing Diagram"); provider.add("gtceu.jei.ore_vein_diagram", "Ore Vein Diagram"); + provider.add("gtceu.jei.programmed_circuit", "Programmed Circuit Page"); + provider.add("gtceu.jei.bedrock_fluid_diagram", "Bedrock Fluid Diagram"); provider.add("gtceu.jei.bedrock_ore_diagram", "Bedrock Ore Diagram"); + + // Ore vein + provider.add("ore.spawnlocation.name", "Ore Spawn Information"); provider.add("gtceu.jei.ore_vein_diagram.chance", "§eChance: %s§r"); provider.add("gtceu.jei.ore_vein_diagram.spawn_range", "Spawn Range:"); provider.add("gtceu.jei.ore_vein_diagram.weight", "Weight: %s"); provider.add("gtceu.jei.ore_vein_diagram.dimensions", "Dimensions:"); + multiLang(provider, "gtceu.jei.ore.primary", "Top Ore", "Spawns in the top %d layers of the vein"); + multiLang(provider, "gtceu.jei.ore.secondary", "Bottom Ore", + "Spawns in the bottom %d layers of the vein"); + multiLang(provider, "gtceu.jei.ore.between", "Between Ore", + "Spawns in the middle %d layers of the vein, with other ores"); + multiLang(provider, "gtceu.jei.ore.sporadic", "Sporadic Ore", "Spawns anywhere in the vein"); + provider.add("gtceu.jei.ore.biome_weighting_title", "§dModified Biome Total Weights:"); + provider.add("gtceu.jei.ore.biome_weighting", "§d%s Weight: §3%d"); + provider.add("gtceu.jei.ore.biome_weighting_no_spawn", "§d%s Weight: §cCannot Spawn"); + provider.add("gtceu.jei.ore.ore_weight", "Weight in vein: %d%%"); + multiLang(provider, "gtceu.jei.ore.surface_rock", + "Surface Rocks with this material denote vein spawn locations.", + "They can be broken for 3 Tiny Piles of the dust, with Fortune giving a bonus."); + + // Fluid vein + provider.add("fluid.spawnlocation.name", "Fluid Vein Information"); + provider.add("gtceu.jei.fluid.vein_weight", "Vein Weight: %d"); + provider.add("gtceu.jei.fluid.min_yield", "Minimum Yield: %d"); + provider.add("gtceu.jei.fluid.max_yield", "Maximum Yield: %d"); + provider.add("gtceu.jei.fluid.depletion_chance", "Depletion Chance: %d%%"); + provider.add("gtceu.jei.fluid.depletion_amount", "Depletion Amount: %d"); + provider.add("gtceu.jei.fluid.depleted_rate", "Depleted Yield: %d"); + provider.add("gtceu.jei.fluid.dimension", "Dimensions:"); + provider.add("gtceu.jei.fluid.weight_hover", + "The Weight of the vein. Hover over the fluid to see any possible biome modifications"); + provider.add("gtceu.jei.fluid.min_hover", + "The minimum yield that any fluid vein of this fluid can have"); + provider.add("gtceu.jei.fluid.max_hover", + "The maximum yield that any fluid vein of this fluid can have"); + provider.add("gtceu.jei.fluid.dep_chance_hover", + "The percentage chance for the vein to be depleted upon harvest"); + provider.add("gtceu.jei.fluid.dep_amount_hover", "The amount the vein will be depleted by"); + provider.add("gtceu.jei.fluid.dep_yield_hover", + "The maximum yield of the vein when it is fully depleted"); + GTRegistries.ORE_VEINS.unfreeze(); GTOres.init(); for (GTOreDefinition oreDefinition : GTRegistries.ORE_VEINS) { @@ -94,16 +138,37 @@ private static void initWailaLikeLang(RegistrateLangProvider provider) { provider.add("gtceu.top.buffer_bound_pos", "Bound To - X: %s, Y: %s, Z: %s"); provider.add("gtceu.top.proxies_bound", "Buffer Proxies Bound: %s"); + provider.add("gtceu.top.energy_stored", " / %d EU"); + provider.add("gtceu.top.progress_computation", " / %s CWU"); + provider.add("gtceu.top.progress_sec", " / %s s"); + provider.add("gtceu.top.progress_tick", " / %s t"); + provider.add("gtceu.jade.energy_stored", "%d / %d EU"); provider.add("gtceu.jade.progress_computation", "%s / %s CWU"); provider.add("gtceu.jade.progress_sec", "%s / %s s"); provider.add("gtceu.jade.progress_tick", "%s / %s t"); provider.add("gtceu.jade.cleaned_this_second", "Cleaned hazard: %s/s"); - provider.add("gtceu.top.energy_stored", " / %d EU"); - provider.add("gtceu.top.progress_computation", " / %s CWU"); - provider.add("gtceu.top.progress_sec", " / %s s"); - provider.add("gtceu.top.progress_tick", " / %s t"); + provider.add("config.jade.plugin_gtceu.controllable_provider", "[GTCEu] Controllable"); + provider.add("config.jade.plugin_gtceu.workable_provider", "[GTCEu] Workable"); + provider.add("config.jade.plugin_gtceu.electric_container_provider", "[GTCEu] Electric Container"); + provider.add("config.jade.plugin_gtceu.recipe_logic_provider", "[GTCEu] Recipe Logic"); + provider.add("config.jade.plugin_gtceu.hazard_cleaner_provider", "[GTCEu] Hazard Cleaner"); + provider.add("config.jade.plugin_gtceu.recipe_output_info", "[GTCEu] Recipe Output Info"); + provider.add("config.jade.plugin_gtceu.auto_output_info", "[GTCEu] Auto Output Info"); + provider.add("config.jade.plugin_gtceu.cable_info", "[GTCEu] Cable Info"); + provider.add("config.jade.plugin_gtceu.exhaust_vent_info", "[GTCEu] Exhaust Vent Info"); + provider.add("config.jade.plugin_gtceu.steam_boiler_info", "[GTCEu] Steam Boiler Info"); + provider.add("config.jade.plugin_gtceu.machine_mode", "[GTCEu] Machine Mode"); + provider.add("config.jade.plugin_gtceu.maintenance_info", "[GTCEu] Maintenance Info"); + provider.add("config.jade.plugin_gtceu.multiblock_structure", "[GTCEu] MultiBlock Structure"); + provider.add("config.jade.plugin_gtceu.parallel_info", "[GTCEu] Parallel Info"); + provider.add("config.jade.plugin_gtceu.primitive_pump", "[GTCEu] Primitive Pump Info"); + provider.add("config.jade.plugin_gtceu.transformer", "[GTCEu] Transformer Info"); + provider.add("config.jade.plugin_gtceu.stained_color", "[GTCEu] Stained Block Info"); + provider.add("config.jade.plugin_gtceu.me_pattern_buffer", "[GTCEu] Pattern Buffer Info"); + provider.add("config.jade.plugin_gtceu.me_pattern_buffer_proxy", "[GTCEu] Pattern Buffer Proxy Info"); + provider.add("config.jade.plugin_gtceu.energy_converter_provider", "[GTCEu] Energy Converter Mode"); } private static void initMinimapLang(RegistrateLangProvider provider) { @@ -118,6 +183,11 @@ private static void initMinimapLang(RegistrateLangProvider provider) { provider.add("gtceu.journeymap.options.layers.ore_veins", "Show Ore Veins"); provider.add("gtceu.journeymap.options.layers.bedrock_fluids", "Show Bedrock Fluid Veins"); provider.add("gtceu.journeymap.options.layers.hide_depleted", "Hide Depleted Veins"); + + provider.add("gtceu.button.ore_veins", "Show GT Ore Veins"); + provider.add("gtceu.button.bedrock_fluids", "Show Bedrock Fluid Veins"); + provider.add("gtceu.button.hide_depleted", "Hide Depleted Veins"); + provider.add("gtceu.button.show_depleted", "Show Depleted Veins"); } private static void initOwnershipLang(RegistrateLangProvider provider) { diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java index 77ed2096d96..292e1bbf42d 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java @@ -16,6 +16,7 @@ public static void init(RegistrateLangProvider provider) { initItemNames(provider); initItemTooltips(provider); generateBehaviorKeys(provider); + provider.add("item.invalid.name", "Invalid item"); } @@ -484,8 +485,11 @@ private static void initItemTooltips(RegistrateLangProvider provider) { provider.add("item.gtceu.terminal.tooltip", "Shift + R-Click on a controller to automatically build the multi-block"); + // Records provider.add("item.gtceu.sus_record.desc", "§7sussy!"); + provider.add("item.record.sus.tooltip", "§7Leonz - Among Us Drip"); + // Voltage Coils provider.add("item.gtceu.ulv_voltage_coil.tooltip", "Primitive Coil"); provider.add("item.gtceu.lv_voltage_coil.tooltip", "Basic Coil"); provider.add("item.gtceu.mv_voltage_coil.tooltip", "Good Coil"); @@ -501,6 +505,30 @@ private static void initItemTooltips(RegistrateLangProvider provider) { provider.add("item.gtceu.uxv_voltage_coil.tooltip", "Epic Coil"); provider.add("item.gtceu.opv_voltage_coil.tooltip", "Legendary Coil"); provider.add("item.gtceu.max_voltage_coil.tooltip", "Maximum Coil"); + + provider.add("item.int_circuit.configuration", "Configuration: %d"); + + provider.add("item.gtceu.nan_certificate.tooltip", "Challenge Accepted!"); + provider.add("item.gtceu.blacklight.tooltip", "Long-Wave §dUltraviolet§7 light source"); + + provider.add("item.clipboard.tooltip", + "Can be written on (without any writing Instrument). Right-click on Wall to place, and Shift-Right-Click to remove"); + + provider.add("item.gtceu.turbine_rotor.tooltip", "Turbine Rotors for your power station"); + + // Terminal + provider.add("item.terminal.tooltip", "Sharp tools make good work"); + provider.add("item.terminal.tooltip.creative", "§bCreative Mode"); + provider.add("item.terminal.tooltip.hardware", "§aHardware: %d"); + + provider.add("item.generic.fluid_container.tooltip", "%d/%dL %s"); + + // General Electric Tools + provider.add("item.generic.electric_item.tooltip", "%d/%d EU - Tier %s"); + provider.add("item.generic.electric_item.stored", "%d/%d EU (%s)"); + provider.add("item.electric.discharge_mode.enabled", "§eDischarge Mode Enabled"); + provider.add("item.electric.discharge_mode.disabled", "§eDischarge Mode Disabled"); + provider.add("item.electric.discharge_mode.tooltip", "Use while sneaking to toggle discharge mode"); } public static void generateBehaviorKeys(RegistrateLangProvider provider) { @@ -517,6 +545,16 @@ public static void generateBehaviorKeys(RegistrateLangProvider provider) { provider.add("behaviour.hammer", "Turns on and off Muffling for Machines (by hitting them)"); provider.add("behaviour.wrench", "Rotates Blocks on Rightclick"); provider.add("behaviour.boor.by", "by %s"); + provider.add("behavior.item_magnet.enabled", "§aMagnetic Field Enabled"); + provider.add("behavior.item_magnet.disabled", "§cMagnetic Field Disabled"); + + // Wrench configuration + provider.add("item.machine_configuration.mode", "§aConfiguration Mode:§r %s"); + provider.add("gtceu.mode.fluid", "§9Fluid§r"); + provider.add("gtceu.mode.item", "§6Item§r"); + provider.add("gtceu.mode.both", "§dBoth (Fluid And Item)§r"); + + // Spray can provider.add("behaviour.paintspray.solvent.tooltip", "Can remove color from things"); provider.add("behaviour.paintspray.white.tooltip", "Can paint things in White"); provider.add("behaviour.paintspray.orange.tooltip", "Can paint things in Orange"); @@ -535,7 +573,7 @@ public static void generateBehaviorKeys(RegistrateLangProvider provider) { provider.add("behaviour.paintspray.red.tooltip", "Can paint things in Red"); provider.add("behaviour.paintspray.black.tooltip", "Can paint things in Black"); provider.add("behaviour.paintspray.uses", "Remaining Uses: %d"); - provider.add("behaviour.prospecting", "Usable for Prospecting"); + provider.add("behaviour.meta.machine.config.copy.tooltip", "§7Sneak + R-Click to copy machine configuration"); provider.add("behaviour.meta.machine.config.paste.tooltip", "§7R-Click to paste machine configuration"); provider.add("behaviour.setting.allow.input.from.output.tooltip", "%s input from output side is %s"); @@ -544,6 +582,8 @@ public static void generateBehaviorKeys(RegistrateLangProvider provider) { provider.add("behaviour.setting.muffled.tooltip", "Muffling %s"); provider.add("item.toggle.advanced.info.tooltip", "§8"); + // Prospector + provider.add("behaviour.prospecting", "Usable for Prospecting"); provider.add("item.prospector.mode.ores", "§aOre Prospection Mode§r"); provider.add("item.prospector.mode.fluid", "§bFluid Prospection Mode§r"); provider.add("item.prospector.mode.bedrock_ore", "§bBedrock Ore Prospection Mode§r"); @@ -551,6 +591,8 @@ public static void generateBehaviorKeys(RegistrateLangProvider provider) { provider.add("item.prospector.tooltip.modes", "Available Modes:"); provider.add("behavior.prospector.not_enough_energy", "Not Enough Energy!"); provider.add("behavior.prospector.added_waypoint", "Created waypoint named %s!"); + + // Portable scanner provider.add("item.tricorder_scanner.tooltip", "Tricorder"); provider.add("item.debug_scanner.tooltip", "Tricorder"); provider.add("behavior.portable_scanner.bedrock_fluid.amount", "Fluid In Deposit: %s %s - %s%%"); @@ -610,5 +652,9 @@ public static void generateBehaviorKeys(RegistrateLangProvider provider) { provider.add("behavior.portable_scanner.mode.show_electrical_info", "Show electrical info"); provider.add("behavior.portable_scanner.mode.show_recipe_info", "Show recipe info"); provider.add("behavior.portable_scanner.mode.show_environmental_info", "Show environmental info"); + + // Data Stick + provider.add("behavior.data_item.assemblyline.title", "§nAssembly Line Construction Data:"); + provider.add("behavior.data_item.assemblyline.data", "- §a%s"); } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java index 406d29f1e05..adb27fb8f78 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -20,7 +20,6 @@ public class LangHandler { * Keys must be in all caps * Key combos must follow the format KEY1 + KEY2 (for example, SHIFT + R-CLICK) * - * @param provider */ public static void init(RegistrateLangProvider provider) { @@ -30,6 +29,7 @@ public static void init(RegistrateLangProvider provider) { CommandLang.init(provider); ConfigurationLang.init(provider); CoverLang.init(provider); + GUILang.init(provider); HazardLang.init(provider); IntegrationLang.init(provider); ItemLang.init(provider); @@ -38,450 +38,5 @@ public static void init(RegistrateLangProvider provider) { RecipeLang.init(provider); SubtitleLang.init(provider); ToolLang.init(provider); - - generateTooltipKeys(provider); - - provider.add("gtceu.gui.editor.tips.citation", "Number of citations"); - provider.add("gtceu.gui.editor.group.recipe_type", "cap"); - provider.add("ldlib.gui.editor.register.editor.gtceu.rtui", "RecipeType UI Project"); - provider.add("ldlib.gui.editor.register.editor.gtceu.mui", "Machine UI Project"); - provider.add("ldlib.gui.editor.register.editor.gtceu.template_tab", "templates"); - provider.add("ldlib.gui.editor.group.widget.gtm_container", "GTM Container Widgets"); - provider.add("ldlib.gui.editor.register.widget.container.gtm_item_slot", "GTM Item Slot"); - provider.add("ldlib.gui.editor.register.widget.container.gtm_fluid_slot", "GTM Fluid Slot"); - provider.add("ldlib.gui.editor.register.widget.container.gtm_phantom_item_slot", "GTM Phantom Item Slot"); - provider.add("ldlib.gui.editor.register.widget.container.gtm_phantom_fluid_slot", "GTM Phantom Fluid Slot"); - - provider.add("curios.identifier.gtceu_magnet", "GTCEu Magnet"); - // capabilities - provider.add("recipe.capability.eu.name", "GTCEu Energy"); - provider.add("recipe.capability.fluid.name", "Fluid"); - provider.add("recipe.capability.item.name", "Item"); - multiLang(provider, "gtceu.oc.tooltip", "Min: %s", "Left click to increase the OC", - "Right click to decrease the OC", "Middle click to reset the OC", - "Hold Shift to change by Perfect OC"); - - provider.add("gtceu.multiblock.page_switcher.io.import", "§2Inputs"); - provider.add("gtceu.multiblock.page_switcher.io.export", "§4Outputs"); - provider.add("gtceu.multiblock.page_switcher.io.both", "§5Combined Inputs + Outputs"); - - provider.add("enchantment.disjunction", "Disjunction"); - - provider.add("fluid.empty", "Empty"); - provider.add("item.generic.fluid_container.tooltip", "%d/%dL %s"); - provider.add("item.generic.electric_item.tooltip", "%d/%d EU - Tier %s"); - provider.add("item.generic.electric_item.stored", "%d/%d EU (%s)"); - provider.add("item.electric.discharge_mode.enabled", "§eDischarge Mode Enabled"); - provider.add("item.electric.discharge_mode.disabled", "§eDischarge Mode Disabled"); - provider.add("item.electric.discharge_mode.tooltip", "Use while sneaking to toggle discharge mode"); - provider.add("item.dust.tooltip.purify", "Right click a Cauldron to get clean Dust"); - provider.add("item.crushed.tooltip.purify", "Right click a Cauldron to get Purified Ore"); - provider.add("item.int_circuit.configuration", "Configuration: %d"); - - provider.add("item.machine_configuration.mode", "§aConfiguration Mode:§r %s"); - provider.add("gtceu.mode.fluid", "§9Fluid§r"); - provider.add("gtceu.mode.item", "§6Item§r"); - provider.add("gtceu.mode.both", "§dBoth (Fluid And Item)§r"); - provider.add("gtceu.multiblock.dimension", "§eDimensions: §r%sx%sx%s"); - - provider.add("item.gtceu.tool.replace_tool_head", "Craft with a new Tool Head to replace it"); - provider.add("item.gtceu.tool.usable_as", "§8Usable as: §f%s"); - - provider.add("item.gtceu.tool.aoe.rows", "Rows"); - provider.add("item.gtceu.tool.aoe.columns", "Columns"); - provider.add("item.gtceu.tool.aoe.layers", "Layers"); - - provider.add("item.gtceu.turbine_rotor.tooltip", "Turbine Rotors for your power station"); - provider.add("item.clipboard.tooltip", - "Can be written on (without any writing Instrument). Right-click on Wall to place, and Shift-Right-Click to remove"); - - provider.add("item.tool.tooltip.primary_material", "§fMaterial: §e%s"); - provider.add("item.tool.tooltip.durability", "§fDurability: §a%d / %d"); - provider.add("item.tool.tooltip.rotor.efficiency", "Turbine Efficiency: §9%d%%"); - provider.add("item.tool.tooltip.rotor.power", "Turbine Power: §9%d%%"); - - provider.add("item.record.sus.tooltip", "§7Leonz - Among Us Drip"); - provider.add("item.gtceu.nan_certificate.tooltip", "Challenge Accepted!"); - provider.add("item.gtceu.blacklight.tooltip", "Long-Wave §dUltraviolet§7 light source"); - provider.add("gui.widget.incrementButton.default_tooltip", - "Hold Shift, Ctrl or both to change the amount"); - provider.add("gui.widget.recipeProgressWidget.default_tooltip", "Show Recipes"); - multilineLang(provider, "gtceu.recipe_memory_widget.tooltip", - "§7Left click to automatically input this recipe into the crafting grid\n§7Shift click to lock/unlock this recipe"); - - replace(provider, "item.gtceu.bucket", "%s Bucket"); - - provider.add("item.netherrack_nether_quartz", "Nether Quartz Ore"); - provider.add("block.surface_rock", "%s Surface Rock"); - - provider.add("enchantment.damage.disjunction", "Disjunction"); - provider.add("enchantment.gtceu.disjunction.description", - "Applies Weakness and Slowness to Ender-related mobs."); - provider.add("enchantment.hard_hammer", "Hammering"); - provider.add("enchantment.gtceu.hard_hammer.description", - "Breaks blocks as if they were mined with a GregTech Hammer."); - - provider.add("tile.gtceu.seal.name", "Sealed Block"); - provider.add("tile.gtceu.foam.name", "Foam"); - provider.add("tile.gtceu.reinforced_foam.name", "Reinforced Foam"); - provider.add("tile.gtceu.petrified_foam.name", "Petrified Foam"); - provider.add("tile.gtceu.reinforced_stone.name", "Reinforced Stone"); - provider.add("tile.gtceu.brittle_charcoal.name", "Brittle Charcoal"); - multilineLang(provider, "tile.gtceu.brittle_charcoal.tooltip", - "Produced by the Charcoal Pile Igniter.\nMine this to get Charcoal."); - - provider.add("behavior.item_magnet.enabled", "§aMagnetic Field Enabled"); - provider.add("behavior.item_magnet.disabled", "§cMagnetic Field Disabled"); - provider.add("behavior.data_item.assemblyline.title", "§nAssembly Line Construction Data:"); - provider.add("behavior.data_item.assemblyline.data", "- §a%s"); - - provider.add("item.terminal.tooltip", "Sharp tools make good work"); - provider.add("item.terminal.tooltip.creative", "§bCreative Mode"); - provider.add("item.terminal.tooltip.hardware", "§aHardware: %d"); - provider.add("item.plugin.tooltips.1", - "Plugins can be added to the screen for more functionality."); - provider.add("item.plugin.proxy.tooltips.1", "(Please adjust to proxy mode in the screen)"); - provider.add("item.cover.digital.tooltip", - "Connects machines over §fPower Cables§7 to the §fCentral Monitor§7 as §fCover§7."); - - provider.add("gtceu.machine.drum.enable_output", "Will drain Fluid to downward adjacent Tanks"); - provider.add("gtceu.machine.drum.disable_output", "Will not drain Fluid"); - provider.add("gtceu.machine.locked_safe.malfunctioning", "§cMalfunctioning!"); - provider.add("gtceu.machine.locked_safe.requirements", "§7Replacements required:"); - - multilineLang(provider, "gtceu.machine.workbench.tooltip", - "Better than Forestry\nHas Item Storage, Tool Storage, pulls from adjacent Inventories, and saves Recipes."); - provider.add("gtceu.machine.workbench.tab.workbench", "Crafting"); - provider.add("gtceu.machine.workbench.tab.item_list", "Storage"); - multilineLang(provider, "gtceu.machine.workbench.storage_note", - "(Available items from connected\ninventories usable for crafting)"); - provider.add("gtceu.item_list.item_stored", "§7Stored: %d"); - provider.add("gtceu.machine.workbench.tab.crafting", "Crafting"); - provider.add("gtceu.machine.workbench.tab.container", "Container"); - - provider.add("gtceu.machine.parallel_hatch.display", "Adjust the maximum parallel of the multiblock"); - provider.add("gtceu.machine.basic.input_from_output_side.allow", "Allow Input from Output Side: "); - provider.add("gtceu.machine.basic.input_from_output_side.disallow", - "Disallow Input from Output Side: "); - provider.add("gtceu.machine.muffle.on", "Sound Muffling: Enabled"); - provider.add("gtceu.machine.muffle.off", "Sound Muffling: Disabled"); - provider.add("gtceu.machine.perfect_oc", "Does not lose energy efficiency when overclocked."); - provider.add("gtceu.machine.parallel_limit", "Can run up to §b%d§r§7 Recipes at once."); - - provider.add("gtceu.machine.multiblock.tank.tooltip", - "Fill and drain through the controller or tank valves."); - provider.add("gtceu.machine.tank_valve.tooltip", - "Use to fill and drain multiblock tanks. Auto outputs when facing down."); - - provider.add("item.cover.digital.mode.proxy.disabled", "Click to enable Proxy Mode"); - provider.add("item.cover.digital.mode.proxy.enabled", "Proxy Mode enabled"); - provider.add("item.cover.digital.mode.machine.disabled", "Click to enable Machine Mode"); - provider.add("item.cover.digital.mode.machine.enabled", "Machine Mode enabled"); - provider.add("item.cover.digital.mode.energy.disabled", "Click to enable Energy Mode"); - provider.add("item.cover.digital.mode.energy.enabled", "Energy Mode enabled"); - provider.add("item.cover.digital.mode.item.disabled", "Click to enable Item Mode"); - provider.add("item.cover.digital.mode.item.enabled", "Item Mode enabled"); - provider.add("item.cover.digital.mode.fluid.disabled", "Click to enable Fluid Mode"); - provider.add("item.cover.digital.mode.fluid.enabled", "Fluid Mode enabled"); - - // todo: own method (gui/tooltip/???) - provider.add("gtceu.part_sharing.disabled", "Multiblock Sharing §4Disabled"); - provider.add("gtceu.part_sharing.enabled", "Multiblock Sharing §aEnabled"); - provider.add("gtceu.universal.liters", "%s mB"); - provider.add("gtceu.universal.kiloliters", "%s B"); - provider.add("gtceu.universal.tooltip.voltage_in", "§aVoltage IN: §f%d EU/t (%s§f)"); - provider.add("gtceu.universal.tooltip.max_voltage_in", "§aMax Voltage IN: §f%d (%s§f)"); - provider.add("gtceu.universal.tooltip.voltage_out", "§aVoltage OUT: §f%d EU/t (%s§f)"); - provider.add("gtceu.universal.tooltip.max_voltage_out", "§aMax Voltage OUT: §f%d (%s§f)"); - provider.add("gtceu.universal.tooltip.voltage_in_out", "§aVoltage IN/OUT: §f%d EU/t (%s§f)"); - provider.add("gtceu.universal.tooltip.max_voltage_in_out", "§aMax Voltage IN/OUT: §f%d EU/t (%s§f)"); - provider.add("gtceu.universal.tooltip.amperage_in", "§eAmperage IN: §f%dA"); - provider.add("gtceu.universal.tooltip.amperage_in_till", "§eAmperage IN up to: §f%dA"); - provider.add("gtceu.universal.tooltip.amperage_out", "§eAmperage OUT: §f%dA"); - provider.add("gtceu.universal.tooltip.amperage_out_till", "§eAmperage OUT up to: §f%dA"); - provider.add("gtceu.universal.tooltip.amperage_in_out", "§eAmperage IN/OUT: §f%dA"); - provider.add("gtceu.universal.tooltip.amperage_in_out_till", "§eAmperage IN/OUT up to: §f%dA"); - provider.add("gtceu.universal.tooltip.energy_storage_capacity", "§cEnergy Capacity: §r%d EU"); - provider.add("gtceu.universal.tooltip.energy_tier_range", "§aAllowed Voltage Tiers: §f%s §f- %s"); - provider.add("gtceu.universal.tooltip.item_storage_capacity", "§6Item Slots: §f%d"); - provider.add("gtceu.universal.tooltip.item_storage_total", "§6Item Capacity: §f%d items"); - provider.add("gtceu.universal.tooltip.item_stored", "§dItem Stored: §f%s, %d items"); - provider.add("gtceu.universal.tooltip.item_transfer_rate", "§bTransfer Rate: §f%d items/s"); - provider.add("gtceu.universal.tooltip.item_transfer_rate_stacks", "§bTransfer Rate: §f%d stacks/s"); - provider.add("gtceu.universal.tooltip.fluid_storage_capacity", "§9Fluid Capacity: §f%d mB"); - provider.add("gtceu.universal.tooltip.fluid_storage_capacity_mult", - "§9Fluid Capacity: §f%d §7Tanks, §f%d mB §7each"); - provider.add("gtceu.universal.tooltip.fluid_stored", "§2Fluid Stored: §f%s, %d mB"); - provider.add("gtceu.universal.tooltip.fluid_transfer_rate", "§bTransfer Rate: §f%d mB/t"); - provider.add("gtceu.universal.tooltip.parallel", "§dMax Parallel: §f%d"); - provider.add("gtceu.universal.tooltip.working_area", "§bWorking Area: §f%dx%d"); - provider.add("gtceu.universal.tooltip.chunk_mode", "Chunk Mode: "); - provider.add("gtceu.universal.tooltip.silk_touch", "Silk Touch: "); - provider.add("gtceu.universal.tooltip.working_area_chunks", "§bWorking Area: §f%dx%d Chunks"); - provider.add("gtceu.universal.tooltip.working_area_max", "§bMax Working Area: §f%dx%d"); - provider.add("gtceu.universal.tooltip.working_area_chunks_max", "§bMax Working Area: §f%dx%d Chunks"); - provider.add("gtceu.universal.tooltip.uses_per_tick", "Uses §f%d EU/t §7while working"); - provider.add("gtceu.universal.tooltip.uses_per_tick_steam", "Uses §f%d mB/t §7of §fSteam §7while working"); - provider.add("gtceu.universal.tooltip.uses_per_hour_lubricant", - "Uses §f%d mB/hr §7of §6Lubricant §7while working"); - provider.add("gtceu.universal.tooltip.uses_per_second", "Uses §f%d EU/s §7while working"); - provider.add("gtceu.universal.tooltip.uses_per_op", "Uses §f%d EU/operation"); - provider.add("gtceu.universal.tooltip.base_production_eut", "§eBase Production: §f%d EU/t"); - provider.add("gtceu.universal.tooltip.base_production_fluid", "§eBase Production: §f%d mB/t"); - provider.add("gtceu.universal.tooltip.produces_fluid", "§eProduces: §f%d mB/t"); - provider.add("gtceu.universal.tooltip.terrain_resist", - "This Machine will not explode when exposed to the Elements"); - provider.add("gtceu.universal.tooltip.requires_redstone", "§4Requires Redstone power"); - provider.add("gtceu.universal.tooltip.deprecated", - "§4§lWARNING:§r§4 DEPRECATED. WILL BE REMOVED IN A FUTURE VERSION.§r"); - - provider.add("gtceu.gui.title_bar.back", "Back"); - provider.add("gtceu.gui.title_bar.page_switcher", "Pages"); - provider.add("gtceu.gui.fuel_amount", "Fuel Amount:"); - provider.add("gtceu.gui.fluid_amount", "Fluid Amount:"); - provider.add("gtceu.gui.toggle_view.disabled", "Toggle View (Fluids)"); - provider.add("gtceu.gui.toggle_view.enabled", "Toggle View (Items)"); - multilineLang(provider, "gtceu.gui.overclock.enabled", "Overclocking Enabled.\nClick to Disable"); - multilineLang(provider, "gtceu.gui.overclock.disabled", "Overclocking Disabled.\nClick to Enable"); - multilineLang(provider, "gtceu.gui.overclock.description", - "Overclock Button\n§7Recipes can overclock up to the set tier"); - provider.add("gtceu.gui.overclock.off", "X"); - provider.add("gtceu.gui.sort", "Sort"); - provider.add("gtceu.gui.fluid_auto_output.tooltip.enabled", "Fluid Auto-Output Enabled"); - provider.add("gtceu.gui.fluid_auto_output.tooltip.disabled", "Fluid Auto-Output Disabled"); - provider.add("gtceu.gui.fluid_auto_input.tooltip.enabled", "Fluid Auto-Input Enabled"); - provider.add("gtceu.gui.fluid_auto_input.tooltip.disabled", "Fluid Auto-Input Disabled"); - provider.add("gtceu.gui.item_auto_output.tooltip.enabled", "Item Auto-Output Enabled"); - provider.add("gtceu.gui.item_auto_output.tooltip.disabled", "Item Auto-Output Disabled"); - provider.add("gtceu.gui.item_auto_input.tooltip.enabled", "Item Auto-Input Enabled"); - provider.add("gtceu.gui.item_auto_input.tooltip.disabled", "Item Auto-Input Disabled"); - multilineLang(provider, "gtceu.gui.charger_slot.tooltip", - "§fCharger Slot§r\n§7Draws power from %s batteries§r\n§7Charges %s tools and batteries"); - multilineLang(provider, "gtceu.gui.configurator_slot.tooltip", - "§fConfigurator Slot§r\n§7Place a §6Programmed Circuit§7 in this slot to\n§7change its configured value.\n§7Hold §6Shift§7 when clicking buttons to change by §65.\n§aA Programmed Circuit in this slot is also valid for recipe inputs.§r"); - provider.add("gtceu.gui.fluid_lock.tooltip.enabled", "Fluid Locking Enabled"); - provider.add("gtceu.gui.fluid_lock.tooltip.disabled", "Fluid Locking Disabled"); - provider.add("gtceu.gui.fluid_voiding_partial.tooltip.enabled", "Fluid Voiding Enabled"); - provider.add("gtceu.gui.fluid_voiding_partial.tooltip.disabled", "Fluid Voiding Disabled"); - provider.add("gtceu.gui.item_lock.tooltip.enabled", "Item Locking Enabled"); - provider.add("gtceu.gui.item_lock.tooltip.disabled", "Item Locking Disabled"); - provider.add("gtceu.gui.item_voiding_partial.tooltip.enabled", "Item Voiding Enabled"); - provider.add("gtceu.gui.item_voiding_partial.tooltip.disabled", "Item Voiding Disabled"); - multilineLang(provider, "gtceu.gui.silktouch.enabled", - "Silk Touch Enabled: Click to Disable.\n§7Switching requires an idle machine."); - multilineLang(provider, "gtceu.gui.silktouch.disabled", - "Silk Touch Disabled: Click to Enable.\n§7Switching requires an idle machine."); - multilineLang(provider, "gtceu.gui.chunkmode.enabled", - "Chunk Mode Enabled: Click to Disable.\n§7Switching requires an idle machine."); - multilineLang(provider, "gtceu.gui.chunkmode.disabled", - "Chunk Mode Disabled: Click to Enable.\n§7Switching requires an idle machine."); - multilineLang(provider, "gtceu.gui.multiblock_item_voiding", "Voiding Mode\n§7Voiding §6Items"); - multilineLang(provider, "gtceu.gui.multiblock_fluid_voiding", "Voiding Mode\n§7Voiding §9Fluids"); - multilineLang(provider, "gtceu.gui.multiblock_item_fluid_voiding", - "Voiding Mode\n§7Voiding §6Items §7and §9Fluids"); - multilineLang(provider, "gtceu.gui.multiblock_no_voiding", "Voiding Mode\n§7Voiding Nothing"); - multilineLang(provider, "gtceu.gui.fisher_mode.tooltip", - "Toggle junk items\nOff costs 2 string per operation"); - provider.add("ore.spawnlocation.name", "Ore Spawn Information"); - multiLang(provider, "gtceu.jei.ore.surface_rock", - "Surface Rocks with this material denote vein spawn locations.", - "They can be broken for 3 Tiny Piles of the dust, with Fortune giving a bonus."); - provider.add("gtceu.jei.ore.biome_weighting_title", "§dModified Biome Total Weights:"); - provider.add("gtceu.jei.ore.biome_weighting", "§d%s Weight: §3%d"); - provider.add("gtceu.jei.ore.biome_weighting_no_spawn", "§d%s Weight: §cCannot Spawn"); - provider.add("gtceu.jei.ore.ore_weight", "Weight in vein: %d%%"); - multiLang(provider, "gtceu.jei.ore.primary", "Top Ore", "Spawns in the top %d layers of the vein"); - multiLang(provider, "gtceu.jei.ore.secondary", "Bottom Ore", - "Spawns in the bottom %d layers of the vein"); - multiLang(provider, "gtceu.jei.ore.between", "Between Ore", - "Spawns in the middle %d layers of the vein, with other ores"); - multiLang(provider, "gtceu.jei.ore.sporadic", "Sporadic Ore", "Spawns anywhere in the vein"); - provider.add("fluid.spawnlocation.name", "Fluid Vein Information"); - provider.add("gtceu.jei.fluid.vein_weight", "Vein Weight: %d"); - provider.add("gtceu.jei.fluid.min_yield", "Minimum Yield: %d"); - provider.add("gtceu.jei.fluid.max_yield", "Maximum Yield: %d"); - provider.add("gtceu.jei.fluid.depletion_chance", "Depletion Chance: %d%%"); - provider.add("gtceu.jei.fluid.depletion_amount", "Depletion Amount: %d"); - provider.add("gtceu.jei.fluid.depleted_rate", "Depleted Yield: %d"); - provider.add("gtceu.jei.fluid.dimension", "Dimensions:"); - provider.add("gtceu.jei.fluid.weight_hover", - "The Weight of the vein. Hover over the fluid to see any possible biome modifications"); - provider.add("gtceu.jei.fluid.min_hover", - "The minimum yield that any fluid vein of this fluid can have"); - provider.add("gtceu.jei.fluid.max_hover", - "The maximum yield that any fluid vein of this fluid can have"); - provider.add("gtceu.jei.fluid.dep_chance_hover", - "The percentage chance for the vein to be depleted upon harvest"); - provider.add("gtceu.jei.fluid.dep_amount_hover", "The amount the vein will be depleted by"); - provider.add("gtceu.jei.fluid.dep_yield_hover", - "The maximum yield of the vein when it is fully depleted"); - provider.add("gtceu.jei.materials.average_mass", "Average mass: %d"); - provider.add("gtceu.jei.materials.average_protons", "Average protons: %d"); - provider.add("gtceu.jei.materials.average_neutrons", "Average neutrons: %d"); - provider.add("gtceu.item_filter.empty_item", "Empty (No Item)"); - provider.add("gtceu.item_filter.footer", "§eClick with item to override"); - - provider.add("gtceu.universal.clear_nbt_recipe.tooltip", "§cThis will destroy all contents!"); - provider.add("gtceu.cover.energy_detector.message_electricity_storage_normal", - "Monitoring Normal Electricity Storage"); - provider.add("gtceu.cover.energy_detector.message_electricity_storage_inverted", - "Monitoring Inverted Electricity Storage"); - provider.add("gtceu.cover.fluid_detector.message_fluid_storage_normal", - "Monitoring Normal Fluid Storage"); - provider.add("gtceu.cover.fluid_detector.message_fluid_storage_inverted", - "Monitoring Inverted Fluid Storage"); - provider.add("gtceu.cover.item_detector.message_item_storage_normal", "Monitoring Normal Item Storage"); - provider.add("gtceu.cover.item_detector.message_item_storage_inverted", - "Monitoring Inverted Item Storage"); - provider.add("gtceu.cover.activity_detector.message_activity_normal", - "Monitoring Normal Activity Status"); - provider.add("gtceu.cover.activity_detector.message_activity_inverted", - "Monitoring Inverted Activity Status"); - provider.add("gtceu.cover.activity_detector_advanced.message_activity_normal", - "Monitoring Normal Progress Status"); - provider.add("gtceu.cover.activity_detector_advanced.message_activity_inverted", - "Monitoring Inverted Progress Status"); - - multiLang(provider, "item.cover.digital.wireless.tooltip", - "§fWirelessly§7 connects machines to the §fCentral Monitor§7 as §fCover§7.", - "§fRight Click§7 on the §fCentral Monitor§7 to remotely bind to it.", - "§fSneak Right Click§7 to remove the current binding.", - "§aBinding: §f%s"); - provider.add("monitor.gui.title.back", "Back"); - provider.add("monitor.gui.title.scale", "Scale:"); - provider.add("monitor.gui.title.argb", "ARGB:"); - provider.add("monitor.gui.title.slot", "Slot:"); - provider.add("monitor.gui.title.plugin", "Plugin:"); - provider.add("monitor.gui.title.config", "Config"); - provider.add("fluid.tile.lava", "Lava"); - provider.add("fluid.tile.water", "Water"); - provider.add("gtceu.key.armor_mode_switch", "Armor Mode Switch"); - provider.add("gtceu.key.armor_hover", "Armor Hover Toggle"); - provider.add("gtceu.key.enable_jetpack", "Enable Jetpack"); - provider.add("gtceu.key.enable_boots", "Enable Boosted Jump"); - provider.add("gtceu.key.armor_charging", "Armor Charging to Inventory Toggle"); - provider.add("gtceu.key.tool_aoe_change", "Tool AoE Mode Switch"); - provider.add("gtceu.debug.f3_h.enabled", - "GregTech has modified the debug info! For Developers: enable the misc:debug config option in the GregTech config file to see more"); - provider.add("config.jade.plugin_gtceu.controllable_provider", "[GTCEu] Controllable"); - provider.add("config.jade.plugin_gtceu.workable_provider", "[GTCEu] Workable"); - provider.add("config.jade.plugin_gtceu.electric_container_provider", "[GTCEu] Electric Container"); - provider.add("config.jade.plugin_gtceu.recipe_logic_provider", "[GTCEu] Recipe Logic"); - provider.add("config.jade.plugin_gtceu.hazard_cleaner_provider", "[GTCEu] Hazard Cleaner"); - provider.add("config.jade.plugin_gtceu.recipe_output_info", "[GTCEu] Recipe Output Info"); - provider.add("config.jade.plugin_gtceu.auto_output_info", "[GTCEu] Auto Output Info"); - provider.add("config.jade.plugin_gtceu.cable_info", "[GTCEu] Cable Info"); - provider.add("config.jade.plugin_gtceu.exhaust_vent_info", "[GTCEu] Exhaust Vent Info"); - provider.add("config.jade.plugin_gtceu.steam_boiler_info", "[GTCEu] Steam Boiler Info"); - provider.add("config.jade.plugin_gtceu.machine_mode", "[GTCEu] Machine Mode"); - provider.add("config.jade.plugin_gtceu.maintenance_info", "[GTCEu] Maintenance Info"); - provider.add("config.jade.plugin_gtceu.multiblock_structure", "[GTCEu] MultiBlock Structure"); - provider.add("config.jade.plugin_gtceu.parallel_info", "[GTCEu] Parallel Info"); - provider.add("config.jade.plugin_gtceu.primitive_pump", "[GTCEu] Primitive Pump Info"); - provider.add("config.jade.plugin_gtceu.transformer", "[GTCEu] Transformer Info"); - provider.add("config.jade.plugin_gtceu.stained_color", "[GTCEu] Stained Block Info"); - provider.add("config.jade.plugin_gtceu.me_pattern_buffer", "[GTCEu] Pattern Buffer Info"); - provider.add("config.jade.plugin_gtceu.me_pattern_buffer_proxy", "[GTCEu] Pattern Buffer Proxy Info"); - provider.add("config.jade.plugin_gtceu.energy_converter_provider", "[GTCEu] Energy Converter Mode"); - - // gui - provider.add("gtceu.button.ore_veins", "Show GT Ore Veins"); - provider.add("gtceu.button.bedrock_fluids", "Show Bedrock Fluid Veins"); - provider.add("gtceu.button.hide_depleted", "Hide Depleted Veins"); - provider.add("gtceu.button.show_depleted", "Show Depleted Veins"); - provider.add("gtceu.recipe_type.show_recipes", "Show Recipes"); - provider.add("gtceu.recipe_logic.insufficient_fuel", "Insufficient Fuel"); - provider.add("gtceu.recipe_logic.insufficient_in", "Insufficient Inputs"); - provider.add("gtceu.recipe_logic.insufficient_out", "Insufficient Outputs"); - provider.add("gtceu.recipe_logic.condition_fails", "Condition Fails"); - provider.add("gtceu.recipe_logic.no_contents", "Recipe has no Contents"); - provider.add("gtceu.recipe_logic.no_capabilities", "Machine has no Capabilities"); - provider.add("gtceu.gui.cover_setting.title", "Cover Settings"); - provider.add("gtceu.gui.output_setting.title", "Output Settings"); - provider.add("gtceu.gui.circuit.title", "Circuit Settings"); - multiLang(provider, "gtceu.gui.output_setting.tooltips", "left-click to tune the item auto output", - "right-click to tune the fluid auto output."); - provider.add("gtceu.gui.item_auto_output.allow_input.enabled", - "allow items input from the output side"); - provider.add("gtceu.gui.item_auto_output.allow_input.disabled", - "disable items input from the output side"); - provider.add("gtceu.gui.fluid_auto_output.allow_input.enabled", - "allow fluids input from the output side"); - provider.add("gtceu.gui.fluid_auto_output.allow_input.disabled", - "disable fluids input from the output side"); - provider.add("gtceu.gui.auto_output.name", "auto"); - provider.add("gtceu.gui.overclock.title", "Overclock Tier"); - provider.add("gtceu.gui.overclock.range", "Available Tiers [%s, %s]"); - - provider.add("gtceu.gui.machinemode.title", "Active Machine Mode"); - provider.add("gtceu.gui.machinemode", "Active Machine Mode: %s"); - provider.add("gtceu.machine.available_recipe_map_1.tooltip", "Available Recipe Types: %s"); - provider.add("gtceu.machine.available_recipe_map_2.tooltip", "Available Recipe Types: %s, %s"); - provider.add("gtceu.machine.available_recipe_map_3.tooltip", "Available Recipe Types: %s, %s, %s"); - provider.add("gtceu.machine.available_recipe_map_4.tooltip", "Available Recipe Types: %s, %s, %s, %s"); - - provider.add("gtceu.gui.content.chance_nc", "§cNot Consumed§r"); - provider.add("gtceu.gui.content.chance_nc_short", "§cNC§r"); - provider.add("gtceu.gui.content.chance_base", "Base Chance: %s%%"); - provider.add("gtceu.gui.content.chance_base_logic", "Base Chance: %s%% (%s)"); - provider.add("gtceu.gui.content.chance_tier_boost_plus", "Bonus Chance: +%s%%/tier"); - provider.add("gtceu.gui.content.chance_tier_boost_minus", "Bonus Chance: -%s%%/tier"); - provider.add("gtceu.gui.content.chance_boosted", "Chance at Tier: %s%%"); - provider.add("gtceu.gui.content.chance_boosted_logic", "Chance at Tier: %s%% (%s)"); - provider.add("gtceu.gui.content.count_range", "%s-%sx"); - - provider.add("gtceu.chance_logic.or", "OR"); - provider.add("gtceu.chance_logic.and", "AND"); - provider.add("gtceu.chance_logic.xor", "XOR"); - provider.add("gtceu.chance_logic.first", "FIRST"); - provider.add("gtceu.chance_logic.none", "NONE"); - - provider.add("gtceu.gui.content.per_tick", "§aConsumed/Produced Per Tick§r"); - provider.add("gtceu.gui.content.tips.per_tick_short", "§a/tick§r"); - provider.add("gtceu.gui.content.tips.per_second_short", "§a/second§r"); - - provider.add("gtceu.gui.content.units.per_tick", "/t"); - provider.add("gtceu.gui.content.units.per_second", "/s"); - - provider.add("gtceu.gui.me_network.online", "Network Status: §2Online§r"); - provider.add("gtceu.gui.me_network.offline", "Network Status: §4Offline§r"); - provider.add("gtceu.gui.waiting_list", "Sending Queue:"); - provider.add("gtceu.gui.config_slot", "§fConfig Slot§r"); - provider.add("gtceu.gui.config_slot.set", "§7Click to §bset/select§7 config slot.§r"); - provider.add("gtceu.gui.config_slot.scroll", "§7Scroll wheel to §achange§7 config amount.§r"); - provider.add("gtceu.gui.config_slot.remove", "§7Right click to §4clear§7 config slot.§r"); - provider.add("gtceu.gui.config_slot.set_only", "§7Click to §bset§7 config slot.§r"); - provider.add("gtceu.gui.config_slot.auto_pull_managed", "§4Disabled:§7 Managed by Auto-Pull"); - provider.add("gtceu.gui.me_bus.auto_pull_button", "Click to toggle automatic item pulling from ME"); - - // Decor Stuff - replace(provider, "block.gtceu.yellow_stripes_block.a", "Yellow Stripes Block"); - replace(provider, "block.gtceu.yellow_stripes_block.b", "Yellow Stripes Block"); - replace(provider, "block.gtceu.yellow_stripes_block.c", "Yellow Stripes Block"); - replace(provider, "block.gtceu.yellow_stripes_block.d", "Yellow Stripes Block"); - - provider.add("effect.gtceu.weak_poison", "Weak Poison"); - - provider.add("gtceu.tooltip.potion.header", "§6Contains effects:"); - provider.add("gtceu.tooltip.potion.each", "%s %s §7for§r %s §7ticks with a§r %s%% §7chance of happening§r"); - - provider.add("gtceu.direction.tooltip.up", "Up"); - provider.add("gtceu.direction.tooltip.down", "Down"); - provider.add("gtceu.direction.tooltip.left", "Left"); - provider.add("gtceu.direction.tooltip.right", "Right"); - provider.add("gtceu.direction.tooltip.back", "Back"); - provider.add("gtceu.direction.tooltip.front", "Front"); - - provider.add("gtceu.tooltip.status.trinary.false", "False"); - provider.add("gtceu.tooltip.status.trinary.true", "True"); - provider.add("gtceu.tooltip.status.trinary.unknown", "Unknown"); - } - - public static void generateTooltipKeys(RegistrateLangProvider provider) { - provider.add("gtceu.tooltip.hold_shift", "§7Hold SHIFT for more info"); - provider.add("gtceu.tooltip.hold_ctrl", "§7Hold CTRL for more info"); - provider.add("gtceu.tooltip.fluid_pipe_hold_shift", "§7Hold SHIFT to show Fluid Containment Info"); - provider.add("gtceu.tooltip.tool_fluid_hold_shift", - "§7Hold SHIFT to show Fluid Containment and Tool Info"); } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java index 4cca1b5f4fb..7ca8f5b4cbf 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java @@ -351,6 +351,7 @@ protected static void init(RegistrateLangProvider provider) { provider.add("gtceu.machine.quantum_tank.tooltip", "§7Compact place to store all your fluids"); provider.add("gtceu.machine.buffer.tooltip", "A Small Buffer to store Items and Fluids"); + // Gas Collector provider.add("gtceu.machine.lv_gas_collector.tooltip", "§7Collects Gas from the air depending on the dimension"); @@ -378,6 +379,7 @@ protected static void init(RegistrateLangProvider provider) { "§7Collects Gas from the solar system depending on the dimension"); provider.add("gtceu.machine.opv_gas_collector.tooltip", "§7Collects Gas from the universe depending on the dimension"); + // Rock Breaker provider.add("gtceu.machine.lv_rock_crusher.tooltip", "§7Place Water and Lava horizontally adjacent"); provider.add("gtceu.machine.mv_rock_crusher.tooltip", "§7Place Water and Lava horizontally adjacent"); @@ -392,11 +394,13 @@ protected static void init(RegistrateLangProvider provider) { provider.add("gtceu.machine.uiv_rock_crusher.tooltip", "§7Volcanic Formation Chamber"); provider.add("gtceu.machine.uxv_rock_crusher.tooltip", "§7Volcanic Formation Chamber"); provider.add("gtceu.machine.opv_rock_crusher.tooltip", "§7Volcanic Formation Chamber"); + // Fisher provider.add("gtceu.machine.fisher.tooltip", "Costs string to fish. Consumes one string each time."); provider.add("gtceu.machine.fisher.speed", "Catches something every %d ticks"); provider.add("gtceu.machine.fisher.requirement", "Requires a %dx%d centered square of water directly below."); + // World Accelerator provider.add("gtceu.machine.world_accelerator.description", "Tick accelerates nearby blocks in one of 2 modes: §fTile Entity§7 or §fRandom Tick§7. Use Screwdriver to change mode."); @@ -962,6 +966,26 @@ protected static void init(RegistrateLangProvider provider) { provider.add("gtceu.multiblock.hpca.info_bridging_enabled", "Bridging Enabled"); provider.add("gtceu.multiblock.hpca.info_bridging_disabled", "Bridging Disabled"); + provider.add("gtceu.multiblock.dimension", "§eDimensions: §r%sx%sx%s"); + + // General Machine Behavior + provider.add("gtceu.machine.parallel_hatch.display", "Adjust the maximum parallel of the multiblock"); + provider.add("gtceu.machine.basic.input_from_output_side.allow", "Allow Input from Output Side: "); + provider.add("gtceu.machine.basic.input_from_output_side.disallow", + "Disallow Input from Output Side: "); + provider.add("gtceu.machine.muffle.on", "Sound Muffling: Enabled"); + provider.add("gtceu.machine.muffle.off", "Sound Muffling: Disabled"); + provider.add("gtceu.machine.perfect_oc", "Does not lose energy efficiency when overclocked."); + provider.add("gtceu.machine.parallel_limit", "Can run up to §b%d§r§7 Recipes at once."); + + // Recipe Maps + provider.add("gtceu.gui.machinemode.title", "Active Machine Mode"); + provider.add("gtceu.gui.machinemode", "Active Machine Mode: %s"); + provider.add("gtceu.machine.available_recipe_map_1.tooltip", "Available Recipe Types: %s"); + provider.add("gtceu.machine.available_recipe_map_2.tooltip", "Available Recipe Types: %s, %s"); + provider.add("gtceu.machine.available_recipe_map_3.tooltip", "Available Recipe Types: %s, %s, %s"); + provider.add("gtceu.machine.available_recipe_map_4.tooltip", "Available Recipe Types: %s, %s, %s, %s"); + provider.add("gtceu.creative.chest.item", "Item"); provider.add("gtceu.creative.chest.ipc", "Items per Cycle"); provider.add("gtceu.creative.chest.tpc", "Ticks per Cycle"); @@ -975,6 +999,33 @@ protected static void init(RegistrateLangProvider provider) { provider.add("gtceu.creative.computation.average", "Average Requested CWUt"); provider.add("gtceu.creative.activity.on", "Active"); provider.add("gtceu.creative.activity.off", "Not active"); + + // Multiblock Tanks + provider.add("gtceu.machine.multiblock.tank.tooltip", + "Fill and drain through the controller or tank valves."); + provider.add("gtceu.machine.tank_valve.tooltip", + "Use to fill and drain multiblock tanks. Auto outputs when facing down."); + + // Workbench + multilineLang(provider, "gtceu.machine.workbench.tooltip", + "Better than Forestry\nHas Item Storage, Tool Storage, pulls from adjacent Inventories, and saves Recipes."); + provider.add("gtceu.machine.workbench.tab.workbench", "Crafting"); + provider.add("gtceu.machine.workbench.tab.item_list", "Storage"); + multilineLang(provider, "gtceu.machine.workbench.storage_note", + "(Available items from connected\ninventories usable for crafting)"); + provider.add("gtceu.item_list.item_stored", "§7Stored: %d"); + provider.add("gtceu.machine.workbench.tab.crafting", "Crafting"); + provider.add("gtceu.machine.workbench.tab.container", "Container"); + multilineLang(provider, "gtceu.recipe_memory_widget.tooltip", + "§7Left click to automatically input this recipe into the crafting grid\n§7Shift click to lock/unlock this recipe"); + + // Safe + provider.add("gtceu.machine.locked_safe.malfunctioning", "§cMalfunctioning!"); + provider.add("gtceu.machine.locked_safe.requirements", "§7Replacements required:"); + + // Drums + provider.add("gtceu.machine.drum.enable_output", "Will drain Fluid to downward adjacent Tanks"); + provider.add("gtceu.machine.drum.disable_output", "Will not drain Fluid"); } public static void standardTooltips(RegistrateLangProvider provider, String root, String machine, diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java index b098f638516..806d8291a02 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java @@ -2,10 +2,10 @@ import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.chemical.material.registry.MaterialRegistry; -import com.gregtechceu.gtceu.common.data.GTMaterials; import com.tterrag.registrate.providers.RegistrateLangProvider; +import static com.gregtechceu.gtceu.common.data.GTMaterials.*; import static com.gregtechceu.gtceu.data.lang.LangUtil.*; import static com.gregtechceu.gtceu.utils.FormattingUtil.toEnglishName; @@ -17,91 +17,94 @@ public static void generate(RegistrateLangProvider provider, MaterialRegistry re } public static void init(RegistrateLangProvider provider) { + generateMaterialKeys(provider); generateCustomMaterialNames(provider); generateFluidKeys(provider); } private static void generateCustomMaterialNames(RegistrateLangProvider provider) { - replace(provider, GTMaterials.FullersEarth.getUnlocalizedName(), "Fuller's Earth"); - replace(provider, GTMaterials.Cooperite.getUnlocalizedName(), "Sheldonite"); // greg's humor is now on - - //1.20.1... - replace(provider, GTMaterials.HSSG.getUnlocalizedName(), "HSS-G"); - replace(provider, GTMaterials.HSSE.getUnlocalizedName(), "HSS-E"); - replace(provider, GTMaterials.HSSS.getUnlocalizedName(), "HSS-S"); - replace(provider, GTMaterials.RTMAlloy.getUnlocalizedName(), "RTM Alloy"); - replace(provider, GTMaterials.HSLASteel.getUnlocalizedName(), "HSLA Steel"); - - replace(provider, GTMaterials.UUMatter.getUnlocalizedName(), "UU-Matter"); - replace(provider, GTMaterials.PCBCoolant.getUnlocalizedName(), "PCB Coolant"); - replace(provider, GTMaterials.TungstenSteel.getUnlocalizedName(), "Tungstensteel"); - replace(provider, GTMaterials.Iron3Chloride.getUnlocalizedName(), "Iron III Chloride"); - replace(provider, GTMaterials.Iron2Chloride.getUnlocalizedName(), "Iron II Chloride"); - replace(provider, GTMaterials.OilHeavy.getUnlocalizedName(), "Heavy Oil"); + replace(provider, FullersEarth.getUnlocalizedName(), "Fuller's Earth"); + // greg's humor is now on 1.20.1... + replace(provider, Cooperite.getUnlocalizedName(), "Sheldonite"); + replace(provider, HSSG.getUnlocalizedName(), "HSS-G"); + replace(provider, HSSE.getUnlocalizedName(), "HSS-E"); + replace(provider, HSSS.getUnlocalizedName(), "HSS-S"); + replace(provider, RTMAlloy.getUnlocalizedName(), "RTM Alloy"); + replace(provider, HSLASteel.getUnlocalizedName(), "HSLA Steel"); + + replace(provider, UUMatter.getUnlocalizedName(), "UU-Matter"); + replace(provider, PCBCoolant.getUnlocalizedName(), "PCB Coolant"); + replace(provider, TungstenSteel.getUnlocalizedName(), "Tungstensteel"); + replace(provider, Iron3Chloride.getUnlocalizedName(), "Iron III Chloride"); + replace(provider, Iron2Chloride.getUnlocalizedName(), "Iron II Chloride"); + replace(provider, OilHeavy.getUnlocalizedName(), "Heavy Oil"); replace(provider, "block.gtceu.oil_heavy", "Heavy Oil"); - replace(provider, GTMaterials.OilLight.getUnlocalizedName(), "Light Oil"); + replace(provider, OilLight.getUnlocalizedName(), "Light Oil"); replace(provider, "block.gtceu.oil_light", "Light Oil"); - replace(provider, GTMaterials.RawOil.getUnlocalizedName(), "Raw Oil"); + replace(provider, RawOil.getUnlocalizedName(), "Raw Oil"); replace(provider, "block.gtceu.oil_medium", "Raw Oil"); - replace(provider, GTMaterials.HydroCrackedButadiene.getUnlocalizedName(), "Hydro-Cracked Butadiene"); - replace(provider, GTMaterials.HydroCrackedButane.getUnlocalizedName(), "Hydro-Cracked Butane"); - replace(provider, GTMaterials.HydroCrackedButene.getUnlocalizedName(), "Hydro-Cracked Butene"); - replace(provider, GTMaterials.HydroCrackedButene.getUnlocalizedName(), "Hydro-Cracked Butene"); - replace(provider, GTMaterials.HydroCrackedEthane.getUnlocalizedName(), "Hydro-Cracked Ethane"); - replace(provider, GTMaterials.HydroCrackedEthylene.getUnlocalizedName(), "Hydro-Cracked Ethylene"); - replace(provider, GTMaterials.HydroCrackedPropane.getUnlocalizedName(), "Hydro-Cracked Propane"); - replace(provider, GTMaterials.HydroCrackedPropene.getUnlocalizedName(), "Hydro-Cracked Propene"); - replace(provider, GTMaterials.SteamCrackedButadiene.getUnlocalizedName(), "Steam-Cracked Butadiene"); - replace(provider, GTMaterials.SteamCrackedButane.getUnlocalizedName(), "Steam-Cracked Butane"); - replace(provider, GTMaterials.SteamCrackedButene.getUnlocalizedName(), "Steam-Cracked Butene"); - replace(provider, GTMaterials.SteamCrackedButene.getUnlocalizedName(), "Steam-Cracked Butene"); - replace(provider, GTMaterials.SteamCrackedEthane.getUnlocalizedName(), "Steam-Cracked Ethane"); - replace(provider, GTMaterials.SteamCrackedEthylene.getUnlocalizedName(), "Steam-Cracked Ethylene"); - replace(provider, GTMaterials.SteamCrackedPropane.getUnlocalizedName(), "Steam-Cracked Propane"); - replace(provider, GTMaterials.SteamCrackedPropene.getUnlocalizedName(), "Steam-Cracked Propene"); - replace(provider, GTMaterials.LightlyHydroCrackedGas.getUnlocalizedName(), "Lightly Hydro-Cracked Gas"); - replace(provider, GTMaterials.LightlyHydroCrackedHeavyFuel.getUnlocalizedName(), + replace(provider, HydroCrackedButadiene.getUnlocalizedName(), "Hydro-Cracked Butadiene"); + replace(provider, HydroCrackedButane.getUnlocalizedName(), "Hydro-Cracked Butane"); + replace(provider, HydroCrackedButene.getUnlocalizedName(), "Hydro-Cracked Butene"); + replace(provider, HydroCrackedButene.getUnlocalizedName(), "Hydro-Cracked Butene"); + replace(provider, HydroCrackedEthane.getUnlocalizedName(), "Hydro-Cracked Ethane"); + replace(provider, HydroCrackedEthylene.getUnlocalizedName(), "Hydro-Cracked Ethylene"); + replace(provider, HydroCrackedPropane.getUnlocalizedName(), "Hydro-Cracked Propane"); + replace(provider, HydroCrackedPropene.getUnlocalizedName(), "Hydro-Cracked Propene"); + replace(provider, SteamCrackedButadiene.getUnlocalizedName(), "Steam-Cracked Butadiene"); + replace(provider, SteamCrackedButane.getUnlocalizedName(), "Steam-Cracked Butane"); + replace(provider, SteamCrackedButene.getUnlocalizedName(), "Steam-Cracked Butene"); + replace(provider, SteamCrackedButene.getUnlocalizedName(), "Steam-Cracked Butene"); + replace(provider, SteamCrackedEthane.getUnlocalizedName(), "Steam-Cracked Ethane"); + replace(provider, SteamCrackedEthylene.getUnlocalizedName(), "Steam-Cracked Ethylene"); + replace(provider, SteamCrackedPropane.getUnlocalizedName(), "Steam-Cracked Propane"); + replace(provider, SteamCrackedPropene.getUnlocalizedName(), "Steam-Cracked Propene"); + replace(provider, LightlyHydroCrackedGas.getUnlocalizedName(), "Lightly Hydro-Cracked Gas"); + replace(provider, LightlyHydroCrackedHeavyFuel.getUnlocalizedName(), "Lightly Hydro-Cracked Heavy Fuel"); - replace(provider, GTMaterials.LightlyHydroCrackedLightFuel.getUnlocalizedName(), + replace(provider, LightlyHydroCrackedLightFuel.getUnlocalizedName(), "Lightly Hydro-Cracked Light Fuel"); - replace(provider, GTMaterials.LightlyHydroCrackedNaphtha.getUnlocalizedName(), + replace(provider, LightlyHydroCrackedNaphtha.getUnlocalizedName(), "Lightly Hydro-Cracked Naphtha"); - replace(provider, GTMaterials.LightlySteamCrackedGas.getUnlocalizedName(), "Lightly Steam-Cracked Gas"); - replace(provider, GTMaterials.LightlySteamCrackedHeavyFuel.getUnlocalizedName(), + replace(provider, LightlySteamCrackedGas.getUnlocalizedName(), "Lightly Steam-Cracked Gas"); + replace(provider, LightlySteamCrackedHeavyFuel.getUnlocalizedName(), "Lightly Steam-Cracked Heavy Fuel"); - replace(provider, GTMaterials.LightlySteamCrackedLightFuel.getUnlocalizedName(), + replace(provider, LightlySteamCrackedLightFuel.getUnlocalizedName(), "Lightly Steam-Cracked Light Fuel"); - replace(provider, GTMaterials.LightlySteamCrackedNaphtha.getUnlocalizedName(), + replace(provider, LightlySteamCrackedNaphtha.getUnlocalizedName(), "Lightly Steam-Cracked Naphtha"); - replace(provider, GTMaterials.SeverelyHydroCrackedGas.getUnlocalizedName(), + replace(provider, SeverelyHydroCrackedGas.getUnlocalizedName(), "Severely Hydro-Cracked Gas"); - replace(provider, GTMaterials.SeverelyHydroCrackedHeavyFuel.getUnlocalizedName(), + replace(provider, SeverelyHydroCrackedHeavyFuel.getUnlocalizedName(), "Severely Hydro-Cracked Heavy Fuel"); - replace(provider, GTMaterials.SeverelyHydroCrackedLightFuel.getUnlocalizedName(), + replace(provider, SeverelyHydroCrackedLightFuel.getUnlocalizedName(), "Severely Hydro-Cracked Light Fuel"); - replace(provider, GTMaterials.SeverelyHydroCrackedNaphtha.getUnlocalizedName(), + replace(provider, SeverelyHydroCrackedNaphtha.getUnlocalizedName(), "Severely Hydro-Cracked Naphtha"); - replace(provider, GTMaterials.SeverelySteamCrackedGas.getUnlocalizedName(), + replace(provider, SeverelySteamCrackedGas.getUnlocalizedName(), "Severely Steam-Cracked Gas"); - replace(provider, GTMaterials.SeverelySteamCrackedHeavyFuel.getUnlocalizedName(), + replace(provider, SeverelySteamCrackedHeavyFuel.getUnlocalizedName(), "Severely Steam-Cracked Heavy Fuel"); - replace(provider, GTMaterials.SeverelySteamCrackedLightFuel.getUnlocalizedName(), + replace(provider, SeverelySteamCrackedLightFuel.getUnlocalizedName(), "Severely Steam-Cracked Light Fuel"); - replace(provider, GTMaterials.SeverelySteamCrackedNaphtha.getUnlocalizedName(), + replace(provider, SeverelySteamCrackedNaphtha.getUnlocalizedName(), "Severely Steam-Cracked Naphtha"); - replace(provider, GTMaterials.LPG.getUnlocalizedName(), "LPG"); + replace(provider, LPG.getUnlocalizedName(), "LPG"); - replace(provider, GTMaterials.Zeron100.getUnlocalizedName(), "Zeron-100"); - replace(provider, GTMaterials.IncoloyMA956.getUnlocalizedName(), "Incoloy MA-956"); - replace(provider, GTMaterials.Stellite100.getUnlocalizedName(), "Stellite-100"); - replace(provider, GTMaterials.HastelloyC276.getUnlocalizedName(), "Hastelloy C-276"); - } - - private static void generateFluidKeys(RegistrateLangProvider provider){ + replace(provider, Zeron100.getUnlocalizedName(), "Zeron-100"); + replace(provider, IncoloyMA956.getUnlocalizedName(), "Incoloy MA-956"); + replace(provider, Stellite100.getUnlocalizedName(), "Stellite-100"); + replace(provider, HastelloyC276.getUnlocalizedName(), "Hastelloy C-276"); + provider.add("item.netherrack_nether_quartz", "Nether Quartz Ore"); + provider.add("fluid.empty", "Empty"); + provider.add("fluid.tile.lava", "Lava"); + provider.add("fluid.tile.water", "Water"); + } + private static void generateFluidKeys(RegistrateLangProvider provider) { provider.add("fluid.gtceu.liquid_generic", "Liquid %s"); provider.add("fluid.gtceu.generic", "%s"); provider.add("fluid.gtceu.gas_generic", "%s Gas"); @@ -109,7 +112,7 @@ private static void generateFluidKeys(RegistrateLangProvider provider){ provider.add("fluid.gtceu.plasma", "%s Plasma"); provider.add("fluid.gtceu.molten", "Molten %s"); - //ui + // ui provider.add("fluid.gtceu.empty", "Empty"); provider.add("fluid.gtceu.amount", "§9Amount: %d/%d mB"); provider.add("fluid.gtceu.click_to_fill", @@ -119,7 +122,7 @@ private static void generateFluidKeys(RegistrateLangProvider provider){ provider.add("fluid.gtceu.click_to_empty", "§7Click with a Fluid Container to §cempty §7the tank (Shift-click for a full stack)."); - //tooltips + // tooltips provider.add("fluid.gtceu.tooltip.temperature", "§cTemperature: %d K"); provider.add("fluid.gtceu.tooltip.cryogenic", "§bCryogenic! Handle with care!"); provider.add("fluid.gtceu.tooltip.gas", "§aState: Gaseous"); @@ -128,4 +131,12 @@ private static void generateFluidKeys(RegistrateLangProvider provider){ provider.add("fluid.gtceu.tooltip.acid", "§6Acidic! Handle with care!"); } + private static void generateMaterialKeys(RegistrateLangProvider provider) { + provider.add("gtceu.jei.materials.average_mass", "Average mass: %d"); + provider.add("gtceu.jei.materials.average_protons", "Average protons: %d"); + provider.add("gtceu.jei.materials.average_neutrons", "Average neutrons: %d"); + + provider.add("item.dust.tooltip.purify", "Right click a Cauldron to get clean Dust"); + provider.add("item.crushed.tooltip.purify", "Right click a Cauldron to get Purified Ore"); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java index c1b137908b5..3106ec3ae49 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java @@ -8,12 +8,13 @@ public class ToolLang { public static void init(RegistrateLangProvider provider) { initDeathMessages(provider); - generateToolClassKey(provider); + generateToolClassKeys(provider); generateToolKeys(provider); generateTooltips(provider); - generateBehaviorKey(provider); + generateBehaviorKeys(provider); generateActionKeys(provider); - initToolInfo(provider); + generateToolInfoKeys(provider); + generateEnchantKeys(provider); } private static void initDeathMessages(RegistrateLangProvider provider) { @@ -73,7 +74,7 @@ private static void initDeathMessages(RegistrateLangProvider provider) { provider.add("death.attack.gtceu.medical_condition.carbon_monoxide_poisoning", "%s left the stove on"); } - public static void generateToolClassKey(RegistrateLangProvider provider) { + public static void generateToolClassKeys(RegistrateLangProvider provider) { provider.add("tool.gtceu.class.sword", "Sword"); provider.add("tool.gtceu.class.pickaxe", "Pickaxe"); provider.add("tool.gtceu.class.shovel", "Shovel"); @@ -99,7 +100,7 @@ public static void generateToolClassKey(RegistrateLangProvider provider) { provider.add("tool.gtceu.class.drill", "Drill"); } - public static void generateBehaviorKey(RegistrateLangProvider provider) { + public static void generateBehaviorKeys(RegistrateLangProvider provider) { provider.add("tool.gtceu.behavior.silk_ice", "§bIce Cutter: §fSilk Harvests Ice"); provider.add("tool.gtceu.behavior.torch_place", "§eSpelunker: §fPlaces Torches on Right-Click"); provider.add("tool.gtceu.behavior.tree_felling", "§4Lumberjack: §fTree Felling"); @@ -117,6 +118,11 @@ public static void generateBehaviorKey(RegistrateLangProvider provider) { provider.add("tool.gtceu.behavior.block_rotation", "§2Mechanic: §fRotates Blocks"); provider.add("tool.gtceu.behavior.damage_boost", "§4Damage Boost: §fExtra damage against %s"); + // AOE + provider.add("item.gtceu.tool.aoe.rows", "Rows"); + provider.add("item.gtceu.tool.aoe.columns", "Columns"); + provider.add("item.gtceu.tool.aoe.layers", "Layers"); + // mode switching provider.add("item.behavior.mode_switch.tooltip", "Use while sneaking to switch mode"); provider.add("item.behavior.mode_switch.mode_switched", "§eMode Set to: %s"); @@ -131,6 +137,7 @@ public static void generateToolKeys(RegistrateLangProvider provider) { replace(provider, "item.gtceu.tool.axe", "%s Axe"); replace(provider, "item.gtceu.tool.hoe", "%s Hoe"); replace(provider, "item.gtceu.tool.saw", "%s Saw"); + replace(provider, "item.gtceu.bucket", "%s Bucket"); replace(provider, "item.gtceu.tool.hammer", "%s Hammer"); replace(provider, "item.gtceu.tool.mallet", "%s Soft Mallet"); @@ -196,8 +203,6 @@ public static void generateTooltips(RegistrateLangProvider provider) { multiLang(provider, "item.gtceu.tool.harvest_level", "§8Wood", "§7Stone", "§aIron", "§bDiamond", "§dNetherite", "§9Duranium", "§cNeutronium"); - provider.add("tool.gtceu.repair_info.tooltip", "§8Hold SHIFT to show Repair Info"); - provider.add("tool.gtceu.repair_material.tooltip", "§8Repair with: §f§a%s"); } public static void generateActionKeys(RegistrateLangProvider provider) { @@ -222,5 +227,26 @@ public static void generateActionKeys(RegistrateLangProvider provider) { provider.add("gtceu.tool_action.tape", "§8Use Tape to fix Maintenance Problems"); } - private static void initToolInfo(RegistrateLangProvider provider) {} + private static void generateToolInfoKeys(RegistrateLangProvider provider) { + provider.add("item.tool.tooltip.primary_material", "§fMaterial: §e%s"); + provider.add("item.tool.tooltip.durability", "§fDurability: §a%d / %d"); + provider.add("item.tool.tooltip.rotor.efficiency", "Turbine Efficiency: §9%d%%"); + provider.add("item.tool.tooltip.rotor.power", "Turbine Power: §9%d%%"); + + provider.add("tool.gtceu.repair_info.tooltip", "§8Hold SHIFT to show Repair Info"); + provider.add("tool.gtceu.repair_material.tooltip", "§8Repair with: §f§a%s"); + + provider.add("item.gtceu.tool.replace_tool_head", "Craft with a new Tool Head to replace it"); + provider.add("item.gtceu.tool.usable_as", "§8Usable as: §f%s"); + } + + private static void generateEnchantKeys(RegistrateLangProvider provider) { + provider.add("enchantment.disjunction", "Disjunction"); + provider.add("enchantment.damage.disjunction", "Disjunction"); + provider.add("enchantment.gtceu.disjunction.description", + "Applies Weakness and Slowness to Ender-related mobs."); + provider.add("enchantment.hard_hammer", "Hammering"); + provider.add("enchantment.gtceu.hard_hammer.description", + "Breaks blocks as if they were mined with a GregTech Hammer."); + } } From aacf2e357c43dd987205a07cc1901a3ed7dcf836 Mon Sep 17 00:00:00 2001 From: Spicierspace153 <21964509+Spicierspace153@users.noreply.github.com> Date: Sun, 22 Jun 2025 23:18:39 -0600 Subject: [PATCH 14/45] remove juicers pr --- .../gregtechceu/gtceu/data/lang/CommandLang.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java index 16d06a6097a..4622ec00d36 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java @@ -12,21 +12,28 @@ public static void init(RegistrateLangProvider provider) { private static void generateCommandLang(RegistrateLangProvider provider) { provider.add("command.gtceu.dump_data.success", "Dumped %s resources from registry %s to %s"); + + // prospection commands provider.add("command.gtceu.place_vein.failure", "Failed to place vein %s at position %s"); provider.add("command.gtceu.place_vein.success", "Placed vein %s at position %s"); provider.add("command.gtceu.share_prospection_data.notification", "%s is sharing prospecting data with you!"); + + // medical conditions provider.add("command.gtceu.medical_condition.get", "Player %s has these medical conditions:"); provider.add("command.gtceu.medical_condition.get.empty", "Player %s has no medical conditions."); provider.add("command.gtceu.medical_condition.get.element", "Condition %s§r: %s minutes %s seconds"); provider.add("command.gtceu.medical_condition.get.element.permanent", "Condition %s§r: %s minutes %s seconds (permanent)"); + // gtceu worldgen provider.add("command.gtceu.usage", "Usage: /gtceu "); provider.add("command.gtceu.worldgen.usage", "Usage: /gtceu worldgen "); provider.add("command.gtceu.worldgen.reload.usage", "Usage: /gtceu worldgen reload"); provider.add("command.gtceu.worldgen.reload.success", "Worldgen successfully reloaded from config."); provider.add("command.gtceu.worldgen.reload.failed", "Worldgen reload failed. Check console for errors."); + + // gtceu hand provider.add("command.gtceu.hand.groovy", "Consider using §6/gs hand"); provider.add("command.gtceu.hand.usage", "Usage: /gtceu hand"); provider.add("command.gtceu.hand.item_id", "Item: %s (Metadata: %d)"); @@ -41,15 +48,21 @@ private static void generateCommandLang(RegistrateLangProvider provider) { provider.add("command.gtceu.hand.not_a_player", "This command is only usable by a player."); provider.add("command.gtceu.hand.no_item", "You must hold something in main hand or off hand before executing this command."); + + // recipe check command provider.add("command.gtceu.recipecheck.usage", "Usage: /gtceu recipecheck"); provider.add("command.gtceu.recipecheck.begin", "Starting recipe conflict check..."); provider.add("command.gtceu.recipecheck.end", "Recipe conflict check found %d possible conflicts. Check the server log for more info"); provider.add("command.gtceu.recipecheck.end_no_conflicts", "No recipe conflicts found!"); - provider.add("command.gtceu.copy.copied_and_click", "copied to clipboard. Click to copy again"); + + // copy command + provider.add("command.gtceu.copy.copied_and_click", "Copied to clipboard. Click to copy again"); provider.add("command.gtceu.copy.click_to_copy", "Click to copy"); provider.add("command.gtceu.copy.copied_start", "Copied ["); provider.add("command.gtceu.copy.copied_end", "] to the clipboard"); + + // old cape provider provider.add("gtceu.chat.cape", "§5Congrats: you just unlocked a new cape! See the Cape Selector terminal app to use it.§r"); } From 62ecda51ea7d0193b6348e347a0a8679396b7e16 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Mon, 23 Jun 2025 00:12:54 -0600 Subject: [PATCH 15/45] merge 1.20.1 pre 7.0 --- .../com/gregtechceu/gtceu/data/lang/CommandLang.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java index 4622ec00d36..2493cc8a664 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java @@ -65,5 +65,17 @@ private static void generateCommandLang(RegistrateLangProvider provider) { // old cape provider provider.add("gtceu.chat.cape", "§5Congrats: you just unlocked a new cape! See the Cape Selector terminal app to use it.§r"); + + // New Cape Command + provider.add("command.gtceu.cape.give.failed", "No new capes were unlocked"); + provider.add("command.gtceu.cape.give.success.multiple", "Unlocked %s capes for %s players"); + provider.add("command.gtceu.cape.give.success.single", "Unlocked %s capes for %s"); + provider.add("command.gtceu.cape.take.failed", "No capes could be removed"); + provider.add("command.gtceu.cape.take.success.multiple", "Took %s capes from %s players"); + provider.add("command.gtceu.cape.take.success.single", "Took %s capes from %s"); + provider.add("command.gtceu.cape.use.failed", + "%s can't use cape %s because they don't have it (or it doesn't exist)!"); + provider.add("command.gtceu.cape.use.success", "%s is now using cape %s"); + provider.add("command.gtceu.cape.use.success.none", "%s is no longer using a cape"); } } From 311d0f3ddbea43b6c54103099c3f7e73f2dfe9c6 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Mon, 23 Jun 2025 03:05:59 -0600 Subject: [PATCH 16/45] more Lang cleanup, fix various broken lang keys --- .../resources/assets/gtceu/lang/en_ud.json | 46 ++--- .../resources/assets/gtceu/lang/en_us.json | 46 ++--- .../gtceu/common/data/GTBlocks.java | 14 +- .../gtceu/data/lang/ArmorLang.java | 13 +- .../gtceu/data/lang/BlockLang.java | 126 +++++++------ .../gtceu/data/lang/CommandLang.java | 16 +- .../gtceu/data/lang/HazardLang.java | 5 + .../gtceu/data/lang/IntegrationLang.java | 62 ++++++- .../gregtechceu/gtceu/data/lang/ItemLang.java | 165 +++++++++++++++--- .../gtceu/data/lang/MaterialLang.java | 26 ++- .../gtceu/data/lang/RecipeLang.java | 17 +- .../gtceu/data/lang/SubtitleLang.java | 23 ++- .../gregtechceu/gtceu/data/lang/ToolLang.java | 31 +++- .../provider/HazardCleanerInfoProvider.java | 6 +- .../resources/assets/gtceu/lang/ja_jp.json | 12 +- .../resources/assets/gtceu/lang/ru_ru.json | 12 +- .../resources/assets/gtceu/lang/uk_ua.json | 12 +- .../resources/assets/gtceu/lang/zh_cn.json | 12 +- .../resources/assets/gtceu/lang/zh_tw.json | 12 +- 19 files changed, 451 insertions(+), 205 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index b0b3b9b39d1..14d664a5d0d 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -137,7 +137,6 @@ "behaviour.soft_hammer.enabled": "pǝןqɐuƎ buıʞɹoM", "behaviour.soft_hammer.idle_after_cycle": "ǝןɔʎɔ ʇuǝɹɹnɔ ɹǝʇɟɐ ǝuıɥɔɐɯ ǝsnɐԀ", "behaviour.wrench": "ʞɔıןɔʇɥbıᴚ uo sʞɔoןᗺ sǝʇɐʇoᴚ", - "block.filter_casing.tooltip": "ʇuǝɯuoɹıʌuǝ ㄥ§ǝǝɹℲ-ǝןɔıʇɹɐԀɐ§ ɐ sǝʇɐǝɹƆ", "block.gtceu.acid_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH pıɔⱯ", "block.gtceu.active_transformer": "ɹǝɯɹoɟsuɐɹ⟘ ǝʌıʇɔⱯ", "block.gtceu.advanced_computer_casing": "buısɐƆ ɹǝʇndɯoƆ pǝɔuɐʌpⱯ", @@ -165,6 +164,8 @@ "block.gtceu.blue_studs": "spnʇS ǝnןᗺ", "block.gtceu.boss_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH ssoᗺ", "block.gtceu.brittle_charcoal": "ןɐoɔɹɐɥƆ ǝןʇʇıɹᗺ", + "block.gtceu.brittle_charcoal.tooltip.0": "˙ɹǝʇıubI ǝןıԀ ןɐoɔɹɐɥƆ ǝɥʇ ʎq pǝɔnpoɹԀ", + "block.gtceu.brittle_charcoal.tooltip.1": "˙ןɐoɔɹɐɥƆ ʇǝb oʇ sıɥʇ ǝuıW", "block.gtceu.bronze_brick_casing": "buısɐƆ ǝzuoɹᗺ pǝʞɔıɹᗺ", "block.gtceu.bronze_crate": "ǝʇɐɹƆ ǝzuoɹᗺ", "block.gtceu.bronze_drum": "ɯnɹᗡ ǝzuoɹᗺ", @@ -325,6 +326,7 @@ "block.gtceu.extreme_combustion_engine": "ǝuıbuƎ uoıʇsnqɯoƆ ǝɯǝɹʇxƎ", "block.gtceu.extreme_engine_intake_casing": "buısɐƆ ǝʞɐʇuI ǝuıbuƎ ǝɯǝɹʇxƎ", "block.gtceu.filter_casing": "buısɐƆ ɹǝʇןıℲ", + "block.gtceu.filter_casing.tooltip": "ʇuǝɯuoɹıʌuǝ ㄥ§ǝǝɹℲ-ǝןɔıʇɹɐԀɐ§ ɐ sǝʇɐǝɹƆ", "block.gtceu.fire_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH ǝɹıℲ", "block.gtceu.firebricks": "sʞɔıɹqǝɹıℲ", "block.gtceu.foam": "ɯɐoℲ", @@ -1098,6 +1100,7 @@ "block.gtceu.rubber_stairs": "sɹıɐʇS ɹǝqqnᴚ", "block.gtceu.rubber_trapdoor": "ɹoopdɐɹ⟘ ɹǝqqnᴚ", "block.gtceu.rubber_wood": "pooM ɹǝqqnᴚ", + "block.gtceu.seal": "ʞɔoןᗺ pǝןɐǝS", "block.gtceu.secure_maceration_casing": "buısɐƆ uoıʇɐɹǝɔɐW ǝɹnɔǝS", "block.gtceu.shock_proof_cutting_casing": "buısɐƆ buıʇʇnƆ ɟooɹԀ ʞɔoɥS", "block.gtceu.slicing_blades": "sǝpɐןᗺ buıɔıןS", @@ -1146,6 +1149,7 @@ "block.gtceu.steel_tank_valve": "ǝʌןɐΛ ʞuɐ⟘ ןǝǝʇS", "block.gtceu.steel_turbine_casing": "buısɐƆ ǝuıqɹn⟘ ɯnıןɐubɐW", "block.gtceu.sterilizing_filter_casing": "buısɐƆ ɹǝʇןıℲ buızıןıɹǝʇS", + "block.gtceu.sterilizing_filter_casing.tooltip": "ʇuǝɯuoɹıʌuǝ ㄥ§pǝzıןıɹǝʇSɐ§ ɐ sǝʇɐǝɹƆ", "block.gtceu.stress_proof_casing": "buısɐƆ ɟooɹԀ ssǝɹʇS", "block.gtceu.stripped_rubber_log": "boꞀ ɹǝqqnᴚ pǝddıɹʇS", "block.gtceu.stripped_rubber_wood": "pooM ɹǝqqnᴚ pǝddıɹʇS", @@ -1648,12 +1652,10 @@ "block.gtceu.yellow_lamp": "dɯɐꞀ ʍoןןǝʎ", "block.gtceu.yellow_large_metal_sheet": "ʇǝǝɥS ןɐʇǝW ǝbɹɐꞀ ʍoןןǝʎ", "block.gtceu.yellow_metal_sheet": "ʇǝǝɥS ןɐʇǝW ʍoןןǝʎ", - "block.gtceu.yellow_stripes_block.a": "ʞɔoןᗺ sǝdıɹʇS ʍoןןǝʎ", - "block.gtceu.yellow_stripes_block.b": "ʞɔoןᗺ sǝdıɹʇS ʍoןןǝʎ", - "block.gtceu.yellow_stripes_block.c": "ʞɔoןᗺ sǝdıɹʇS ʍoןןǝʎ", - "block.gtceu.yellow_stripes_block.d": "ʞɔoןᗺ sǝdıɹʇS ʍoןןǝʎ", - "block.gtceu.yellow_stripes_block_a": "Ɐ ʞɔoןᗺ sǝdıɹʇS ʍoןןǝʎ", - "block.gtceu.yellow_stripes_block_b": "ᗺ ʞɔoןᗺ sǝdıɹʇS ʍoןןǝʎ", + "block.gtceu.yellow_stripes_block_a": "ʞɔoןᗺ sǝdıɹʇS ʍoןןǝʎ", + "block.gtceu.yellow_stripes_block_b": "ʞɔoןᗺ sǝdıɹʇS ʍoןןǝʎ", + "block.gtceu.yellow_stripes_block_c": "ʞɔoןᗺ sǝdıɹʇS ʍoןןǝʎ", + "block.gtceu.yellow_stripes_block_d": "ʞɔoןᗺ sǝdıɹʇS ʍoןןǝʎ", "block.gtceu.yellow_studs": "spnʇS ʍoןןǝʎ", "block.gtceu.zpm_1024a_laser_source_hatch": "ɥɔʇɐH ǝɔɹnoS ɹǝsɐꞀ ɹ§Ɐǝ§ㄣᄅ0'Ɩ ɹ§WԀZɔ§", "block.gtceu.zpm_1024a_laser_target_hatch": "ɥɔʇɐH ʇǝbɹɐ⟘ ɹǝsɐꞀ ɹ§Ɐǝ§ㄣᄅ0'Ɩ ɹ§WԀZɔ§", @@ -1742,12 +1744,20 @@ "block.gtceu.zpm_transformer_4a": "ɹǝɯɹoɟsuɐɹ⟘ )xㄣ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ WԀZɔ§", "block.gtceu.zpm_wiremill": "ɹ§III ןןıɯǝɹıM ǝʇıןƎɔ§", "block.gtceu.zpm_world_accelerator": "ɹ§III ɹoʇɐɹǝןǝɔɔⱯ pןɹoM ǝʇıןƎɔ§", - "block.sterilizing_filter_casing.tooltip": "ʇuǝɯuoɹıʌuǝ ㄥ§pǝzıןıɹǝʇSɐ§ ɐ sǝʇɐǝɹƆ", "block.surface_rock": "ʞɔoᴚ ǝɔɐɟɹnS %s", "button.gtceu.mark_as_depleted.name": "pǝʇǝןdǝᗡ sɐ ʞɹɐW", "button.gtceu.toggle_waypoint.name": "ʇuıodʎɐM ǝןbbo⟘", + "command.gtceu.cape.give.failed": "pǝʞɔoןun ǝɹǝʍ sǝdɐɔ ʍǝu oN", + "command.gtceu.cape.give.success.multiple": "sɹǝʎɐןd %s ɹoɟ sǝdɐɔ %s pǝʞɔoןu∩", + "command.gtceu.cape.give.success.single": "%s ɹoɟ sǝdɐɔ %s pǝʞɔoןu∩", + "command.gtceu.cape.take.failed": "pǝʌoɯǝɹ ǝq pןnoɔ sǝdɐɔ oN", + "command.gtceu.cape.take.success.multiple": "sɹǝʎɐןd %s ɯoɹɟ sǝdɐɔ %s ʞoo⟘", + "command.gtceu.cape.take.success.single": "%s ɯoɹɟ sǝdɐɔ %s ʞoo⟘", + "command.gtceu.cape.use.failed": "¡)ʇsıxǝ ʇ,usǝop ʇı ɹo( ʇı ǝʌɐɥ ʇ,uop ʎǝɥʇ ǝsnɐɔǝq %s ǝdɐɔ ǝsn ʇ,uɐɔ %s", + "command.gtceu.cape.use.success": "%s ǝdɐɔ buısn ʍou sı %s", + "command.gtceu.cape.use.success.none": "ǝdɐɔ ɐ buısn ɹǝbuoן ou sı %s", "command.gtceu.copy.click_to_copy": "ʎdoɔ oʇ ʞɔıןƆ", - "command.gtceu.copy.copied_and_click": "uıɐbɐ ʎdoɔ oʇ ʞɔıןƆ ˙pɹɐoqdıןɔ oʇ pǝıdoɔ", + "command.gtceu.copy.copied_and_click": "uıɐbɐ ʎdoɔ oʇ ʞɔıןƆ ˙pɹɐoqdıןɔ oʇ pǝıdoƆ", "command.gtceu.copy.copied_end": "pɹɐoqdıןɔ ǝɥʇ oʇ ]", "command.gtceu.copy.copied_start": "[ pǝıdoƆ", "command.gtceu.dump_data.success": "%s oʇ %s ʎɹʇsıbǝɹ ɯoɹɟ sǝɔɹnosǝɹ %s pǝdɯnᗡ", @@ -3230,6 +3240,8 @@ "gtceu.multiblock.data_bank.description": "˙sǝןnpoW ɐʇɐᗡ uo ɐʇɐp ɥɔɹɐǝsǝɹ xǝןdɯoɔ ǝɹoɯ pɐǝɹ oʇ sǝuıꞀ ʎןqɯǝssⱯ sǝןqɐuǝ ʇı 'ʎןןɐuoıʇıppⱯ ˙sǝuıꞀ ʎןqɯǝssⱯ ǝןdıʇןnɯ uǝǝʍʇǝq ɐʇɐᗡ ɥɔɹɐǝsǝᴚ ǝuıꞀ ʎןqɯǝssⱯ buıɹɐɥs ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı ʞuɐᗺ ɐʇɐᗡ ǝɥ⟘", "gtceu.multiblock.data_bank.providing": "˙ɐʇɐp buıpıʌoɹԀ", "gtceu.multiblock.dimension": "%sx%sx%sɹ§ :suoısuǝɯıᗡǝ§", + "gtceu.multiblock.dimensions.0": " :suoısuǝɯıᗡ", + "gtceu.multiblock.dimensions.1": " %s :ɹ§ɥʇdǝᗡן§6§ '%s :ɹ§ʇɥbıǝHן§ɐ§ '%s :ɹ§ɥʇpıMן§ɔ§ ", "gtceu.multiblock.distillation_tower.description": "˙uoıʇısod ʎuɐ uı spınןɟ ʇɹǝsuı puɐ sɯǝʇı ʇndʇno uɐɔ ɹǝʎɐן ɯoʇʇoq ǝɥ⟘ ˙ǝuo puoɔǝs ǝɥʇ ɯoɹɟ buıʇɹɐʇs 'ɥɔʇɐɥ ʇndʇno ǝuo ʎןʇɔɐxǝ ǝʌɐɥ ʇsnɯ ɹǝʎɐן ɥɔɐƎ ˙sʇɔnpoɹdʎq ɹıǝɥʇ ɟo ǝɯos puɐ ןıO ɟo sǝdʎʇ snoıɹɐʌ ǝɥʇ buıןןıʇsıp ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı ɹǝʍo⟘ uoıʇɐןןıʇsıᗡ ǝɥ⟘", "gtceu.multiblock.distillation_tower.distilling_fluid": "%s buıןןıʇsıᗡ", "gtceu.multiblock.electric_blast_furnace.description": "˙ʎoןןɐ ɥɐpɐnbɐu puɐ 'ɯnıuɐʇıʇ 'ןǝǝʇs ssǝןuıɐʇs 'ɯnıuıɯnןɐ sɐ ɥɔns 'sןɐʇǝɯ puɐ sʎoןןɐ ɹǝıʇ-ɥbıɥ buıuıɐʇqo ɹoɟ pǝɹınbǝɹ sı ʇI ˙sǝɹo buıuıɟǝɹ puɐ sןɐʇǝɯ buıʞooɔ 'sʎoןןɐ buıʇןǝɯs ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı )ℲᗺƎ( ǝɔɐuɹnℲ ʇsɐןᗺ ɔıɹʇɔǝןƎ ǝɥ⟘", @@ -3650,7 +3662,6 @@ "item.generic.electric_item.stored": ")%s( ∩Ǝ %d/%d", "item.generic.electric_item.tooltip": "%s ɹǝı⟘ - ∩Ǝ %d/%d", "item.generic.fluid_container.tooltip": "%s Ꞁ%d/%d", - "item.glass_lens": ")ǝʇıɥM( suǝꞀ ssɐן⅁", "item.gtceu.activity_detector_cover": "ɹoʇɔǝʇǝᗡ ʎʇıʌıʇɔⱯ", "item.gtceu.activity_detector_cover.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ǝuoʇspǝᴚ sɐ ㄥ§snʇɐʇS ʎʇıʌıʇɔⱯɟ§ ʇno sǝʌı⅁ㄥ§", "item.gtceu.advanced_activity_detector_cover": "ɹoʇɔǝʇǝᗡ ʎʇıʌıʇɔⱯ pǝɔuɐʌpⱯ", @@ -3899,6 +3910,7 @@ "item.gtceu.gelled_toluene": "ǝuǝnןo⟘ pǝןןǝ⅁", "item.gtceu.gelled_toluene.tooltip": "ǝʌısoןdxƎ ʍɐᴚㄥ§", "item.gtceu.glass_gem": "ןɐʇsʎɹƆ ssɐן⅁", + "item.gtceu.glass_lens": ")ǝʇıɥM( suǝꞀ ssɐן⅁", "item.gtceu.glass_plate": "ǝuɐԀ ssɐן⅁", "item.gtceu.glass_tube": "ǝqn⟘ ssɐן⅁", "item.gtceu.glass_vial": "ןɐıΛ ssɐן⅁ %s", @@ -4160,6 +4172,7 @@ "item.gtceu.naquadah_boule.tooltip": "ʇınɔɹıƆ ʍɐᴚㄥ§", "item.gtceu.naquadah_wafer": "ɹǝɟɐM pǝdop-ɥɐpɐnbɐN", "item.gtceu.naquadah_wafer.tooltip": "ʇınɔɹıƆ ʍɐᴚㄥ§", + "item.gtceu.nether_quartz_netherrack": "ǝɹO zʇɹɐnὉ ɹǝɥʇǝN", "item.gtceu.neuro_processing_unit": "ʇıu∩ buıssǝɔoɹԀ oɹnǝN", "item.gtceu.neuro_processing_unit.tooltip": "∩ԀƆ oɹnǝNㄥ§", "item.gtceu.neutron_reflector": "ɹoʇɔǝןɟǝᴚ uoɹʇnǝN ɯnıpıɹI", @@ -4385,7 +4398,8 @@ "item.gtceu.storage_cover": "ɹǝʌoƆ ǝbɐɹoʇS", "item.gtceu.sugar_gem": "ǝqnƆ ɹɐbnS", "item.gtceu.sus_record": "ɔsıᗡ ɔısnW", - "item.gtceu.sus_record.desc": "¡ʎssnsㄥ§", + "item.gtceu.sus_record.desc": "dıɹᗡ s∩ buoɯⱯ - zuoǝꞀㄥ§", + "item.gtceu.sus_record.tooltip": "¡ʎssnsㄥ§", "item.gtceu.sword_extruder_mold.tooltip": "spɹoʍS buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", "item.gtceu.tag_filter.tooltip.0": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ㄥ§bɐ⟘ɟ§ ɥʇıʍ O/I ㄥ§ɯǝʇIɟ§ sɹǝʇןıℲㄥ§", "item.gtceu.tag_filter.tooltip.1": "˙ǝpɐɹbdn ㄥ§ɯɹⱯ ɔıʇoqoᴚɟ§ puɐ ㄥ§ǝןnpoW ɹoʎǝʌuoƆɟ§ ɐ sɐ pǝsn ǝq uɐƆ", @@ -4625,7 +4639,6 @@ "item.invalid.name": "ɯǝʇı pıןɐʌuI", "item.liquid_fuel_jetpack.tooltip": "ʇsnɹɥ⟘ ɹoɟ sןǝnℲ ɹoʇɐɹǝuǝ⅁ uoıʇsnqɯoƆ sǝs∩", "item.machine_configuration.mode": "%s ɹ§:ǝpoW uoıʇɐɹnbıɟuoƆɐ§", - "item.netherrack_nether_quartz": "ǝɹO zʇɹɐnὉ ɹǝɥʇǝN", "item.plugin.proxy.tooltips.1": ")uǝǝɹɔs ǝɥʇ uı ǝpoɯ ʎxoɹd oʇ ʇsnظpɐ ǝsɐǝןԀ(", "item.plugin.tooltips.1": "˙ʎʇıןɐuoıʇɔunɟ ǝɹoɯ ɹoɟ uǝǝɹɔs ǝɥʇ oʇ pǝppɐ ǝq uɐɔ suıbnןԀ", "item.prospector.mode.bedrock_ore": "ɹ§ǝpoW uoıʇɔǝdsoɹԀ ǝɹO ʞɔoɹpǝᗺq§", @@ -4633,7 +4646,6 @@ "item.prospector.mode.ores": "ɹ§ǝpoW uoıʇɔǝdsoɹԀ ǝɹOɐ§", "item.prospector.tooltip.modes": ":sǝpoW ǝןqɐןıɐʌⱯ", "item.prospector.tooltip.radius": "snıpɐᴚ ʞunɥƆ %s ɐ uı ǝbuɐɹ suɐɔS", - "item.record.sus.tooltip": "dıɹᗡ s∩ buoɯⱯ - zuoǝꞀㄥ§", "item.terminal.tooltip": "ʞɹoʍ poob ǝʞɐɯ sןooʇ dɹɐɥS", "item.terminal.tooltip.creative": "ǝpoW ǝʌıʇɐǝɹƆq§", "item.terminal.tooltip.hardware": "%d :ǝɹɐʍpɹɐHɐ§", @@ -5484,14 +5496,6 @@ "tagprefix.wire_gt_quadruple": "ǝɹıM %s xㄣ", "tagprefix.wire_gt_single": "ǝɹıM %s xƖ", "tagprefix.wrench_tip": "dı⟘ ɥɔuǝɹM %s", - "tile.gtceu.brittle_charcoal.name": "ןɐoɔɹɐɥƆ ǝןʇʇıɹᗺ", - "tile.gtceu.brittle_charcoal.tooltip.0": "˙ɹǝʇıubI ǝןıԀ ןɐoɔɹɐɥƆ ǝɥʇ ʎq pǝɔnpoɹԀ", - "tile.gtceu.brittle_charcoal.tooltip.1": "˙ןɐoɔɹɐɥƆ ʇǝb oʇ sıɥʇ ǝuıW", - "tile.gtceu.foam.name": "ɯɐoℲ", - "tile.gtceu.petrified_foam.name": "ɯɐoℲ pǝıɟıɹʇǝԀ", - "tile.gtceu.reinforced_foam.name": "ɯɐoℲ pǝɔɹoɟuıǝᴚ", - "tile.gtceu.reinforced_stone.name": "ǝuoʇS pǝɔɹoɟuıǝᴚ", - "tile.gtceu.seal.name": "ʞɔoןᗺ pǝןɐǝS", "tool.gtceu.attack_damage.tooltip": "ǝbɐɯɐᗡ ʞɔɐʇʇⱯɔ§ %s", "tool.gtceu.attack_speed.tooltip": "pǝǝdS ʞɔɐʇʇⱯ6§ %s", "tool.gtceu.behavior.aoe_mining": "%sx%sx%sɟ§ :ʇɔǝɟɟƎ-ɟo-ɐǝɹⱯϛ§", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 134e119efba..620151a34f8 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -137,7 +137,6 @@ "behaviour.soft_hammer.enabled": "Working Enabled", "behaviour.soft_hammer.idle_after_cycle": "Pause machine after current cycle", "behaviour.wrench": "Rotates Blocks on Rightclick", - "block.filter_casing.tooltip": "Creates a §aParticle-Free§7 environment", "block.gtceu.acid_hazard_sign_block": "Acid Hazard Sign Block", "block.gtceu.active_transformer": "Active Transformer", "block.gtceu.advanced_computer_casing": "Advanced Computer Casing", @@ -165,6 +164,8 @@ "block.gtceu.blue_studs": "Blue Studs", "block.gtceu.boss_hazard_sign_block": "Boss Hazard Sign Block", "block.gtceu.brittle_charcoal": "Brittle Charcoal", + "block.gtceu.brittle_charcoal.tooltip.0": "Produced by the Charcoal Pile Igniter.", + "block.gtceu.brittle_charcoal.tooltip.1": "Mine this to get Charcoal.", "block.gtceu.bronze_brick_casing": "Bricked Bronze Casing", "block.gtceu.bronze_crate": "Bronze Crate", "block.gtceu.bronze_drum": "Bronze Drum", @@ -325,6 +326,7 @@ "block.gtceu.extreme_combustion_engine": "Extreme Combustion Engine", "block.gtceu.extreme_engine_intake_casing": "Extreme Engine Intake Casing", "block.gtceu.filter_casing": "Filter Casing", + "block.gtceu.filter_casing.tooltip": "Creates a §aParticle-Free§7 environment", "block.gtceu.fire_hazard_sign_block": "Fire Hazard Sign Block", "block.gtceu.firebricks": "Firebricks", "block.gtceu.foam": "Foam", @@ -1098,6 +1100,7 @@ "block.gtceu.rubber_stairs": "Rubber Stairs", "block.gtceu.rubber_trapdoor": "Rubber Trapdoor", "block.gtceu.rubber_wood": "Rubber Wood", + "block.gtceu.seal": "Sealed Block", "block.gtceu.secure_maceration_casing": "Secure Maceration Casing", "block.gtceu.shock_proof_cutting_casing": "Shock Proof Cutting Casing", "block.gtceu.slicing_blades": "Slicing Blades", @@ -1146,6 +1149,7 @@ "block.gtceu.steel_tank_valve": "Steel Tank Valve", "block.gtceu.steel_turbine_casing": "Magnalium Turbine Casing", "block.gtceu.sterilizing_filter_casing": "Sterilizing Filter Casing", + "block.gtceu.sterilizing_filter_casing.tooltip": "Creates a §aSterilized§7 environment", "block.gtceu.stress_proof_casing": "Stress Proof Casing", "block.gtceu.stripped_rubber_log": "Stripped Rubber Log", "block.gtceu.stripped_rubber_wood": "Stripped Rubber Wood", @@ -1648,12 +1652,10 @@ "block.gtceu.yellow_lamp": "Yellow Lamp", "block.gtceu.yellow_large_metal_sheet": "Yellow Large Metal Sheet", "block.gtceu.yellow_metal_sheet": "Yellow Metal Sheet", - "block.gtceu.yellow_stripes_block.a": "Yellow Stripes Block", - "block.gtceu.yellow_stripes_block.b": "Yellow Stripes Block", - "block.gtceu.yellow_stripes_block.c": "Yellow Stripes Block", - "block.gtceu.yellow_stripes_block.d": "Yellow Stripes Block", - "block.gtceu.yellow_stripes_block_a": "Yellow Stripes Block A", - "block.gtceu.yellow_stripes_block_b": "Yellow Stripes Block B", + "block.gtceu.yellow_stripes_block_a": "Yellow Stripes Block", + "block.gtceu.yellow_stripes_block_b": "Yellow Stripes Block", + "block.gtceu.yellow_stripes_block_c": "Yellow Stripes Block", + "block.gtceu.yellow_stripes_block_d": "Yellow Stripes Block", "block.gtceu.yellow_studs": "Yellow Studs", "block.gtceu.zpm_1024a_laser_source_hatch": "§cZPM§r 1,024§eA§r Laser Source Hatch", "block.gtceu.zpm_1024a_laser_target_hatch": "§cZPM§r 1,024§eA§r Laser Target Hatch", @@ -1742,12 +1744,20 @@ "block.gtceu.zpm_transformer_4a": "§cZPM Voltage§r Hi-Amp (4x) Transformer", "block.gtceu.zpm_wiremill": "§cElite Wiremill III§r", "block.gtceu.zpm_world_accelerator": "§cElite World Accelerator III§r", - "block.sterilizing_filter_casing.tooltip": "Creates a §aSterilized§7 environment", "block.surface_rock": "%s Surface Rock", "button.gtceu.mark_as_depleted.name": "Mark as Depleted", "button.gtceu.toggle_waypoint.name": "Toggle Waypoint", + "command.gtceu.cape.give.failed": "No new capes were unlocked", + "command.gtceu.cape.give.success.multiple": "Unlocked %s capes for %s players", + "command.gtceu.cape.give.success.single": "Unlocked %s capes for %s", + "command.gtceu.cape.take.failed": "No capes could be removed", + "command.gtceu.cape.take.success.multiple": "Took %s capes from %s players", + "command.gtceu.cape.take.success.single": "Took %s capes from %s", + "command.gtceu.cape.use.failed": "%s can't use cape %s because they don't have it (or it doesn't exist)!", + "command.gtceu.cape.use.success": "%s is now using cape %s", + "command.gtceu.cape.use.success.none": "%s is no longer using a cape", "command.gtceu.copy.click_to_copy": "Click to copy", - "command.gtceu.copy.copied_and_click": "copied to clipboard. Click to copy again", + "command.gtceu.copy.copied_and_click": "Copied to clipboard. Click to copy again", "command.gtceu.copy.copied_end": "] to the clipboard", "command.gtceu.copy.copied_start": "Copied [", "command.gtceu.dump_data.success": "Dumped %s resources from registry %s to %s", @@ -3230,6 +3240,8 @@ "gtceu.multiblock.data_bank.description": "The Data Bank is a multiblock structure used for sharing Assembly Line Research Data between multiple Assembly Lines. Additionally, it enables Assembly Lines to read more complex research data on Data Modules.", "gtceu.multiblock.data_bank.providing": "Providing data.", "gtceu.multiblock.dimension": "§eDimensions: §r%sx%sx%s", + "gtceu.multiblock.dimensions.0": "Dimensions: ", + "gtceu.multiblock.dimensions.1": " §c§lWidth§r: %s, §a§lHeight§r: %s, §9§lDepth§r: %s ", "gtceu.multiblock.distillation_tower.description": "The Distillation Tower is a multiblock structure used for distilling the various types of Oil and some of their byproducts. Each layer must have exactly one output hatch, starting from the second one. The bottom layer can output items and insert fluids in any position.", "gtceu.multiblock.distillation_tower.distilling_fluid": "Distilling %s", "gtceu.multiblock.electric_blast_furnace.description": "The Electric Blast Furnace (EBF) is a multiblock structure used for smelting alloys, cooking metals and refining ores. It is required for obtaining high-tier alloys and metals, such as aluminium, stainless steel, titanium, and naquadah alloy.", @@ -3650,7 +3662,6 @@ "item.generic.electric_item.stored": "%d/%d EU (%s)", "item.generic.electric_item.tooltip": "%d/%d EU - Tier %s", "item.generic.fluid_container.tooltip": "%d/%dL %s", - "item.glass_lens": "Glass Lens (White)", "item.gtceu.activity_detector_cover": "Activity Detector", "item.gtceu.activity_detector_cover.tooltip": "§7Gives out §fActivity Status§7 as Redstone as §fCover§7.", "item.gtceu.advanced_activity_detector_cover": "Advanced Activity Detector", @@ -3899,6 +3910,7 @@ "item.gtceu.gelled_toluene": "Gelled Toluene", "item.gtceu.gelled_toluene.tooltip": "§7Raw Explosive", "item.gtceu.glass_gem": "Glass Crystal", + "item.gtceu.glass_lens": "Glass Lens (White)", "item.gtceu.glass_plate": "Glass Pane", "item.gtceu.glass_tube": "Glass Tube", "item.gtceu.glass_vial": "%s Glass Vial", @@ -4160,6 +4172,7 @@ "item.gtceu.naquadah_boule.tooltip": "§7Raw Circuit", "item.gtceu.naquadah_wafer": "Naquadah-doped Wafer", "item.gtceu.naquadah_wafer.tooltip": "§7Raw Circuit", + "item.gtceu.nether_quartz_netherrack": "Nether Quartz Ore", "item.gtceu.neuro_processing_unit": "Neuro Processing Unit", "item.gtceu.neuro_processing_unit.tooltip": "§7Neuro CPU", "item.gtceu.neutron_reflector": "Iridium Neutron Reflector", @@ -4385,7 +4398,8 @@ "item.gtceu.storage_cover": "Storage Cover", "item.gtceu.sugar_gem": "Sugar Cube", "item.gtceu.sus_record": "Music Disc", - "item.gtceu.sus_record.desc": "§7sussy!", + "item.gtceu.sus_record.desc": "§7Leonz - Among Us Drip", + "item.gtceu.sus_record.tooltip": "§7sussy!", "item.gtceu.sword_extruder_mold.tooltip": "§7Extruder Shape for making Swords", "item.gtceu.tag_filter.tooltip.0": "§7Filters §fItem§7 I/O with §fTag§7 as §fCover§7.", "item.gtceu.tag_filter.tooltip.1": "Can be used as a §fConveyor Module§7 and §fRobotic Arm§7 upgrade.", @@ -4625,7 +4639,6 @@ "item.invalid.name": "Invalid item", "item.liquid_fuel_jetpack.tooltip": "Uses Combustion Generator Fuels for Thrust", "item.machine_configuration.mode": "§aConfiguration Mode:§r %s", - "item.netherrack_nether_quartz": "Nether Quartz Ore", "item.plugin.proxy.tooltips.1": "(Please adjust to proxy mode in the screen)", "item.plugin.tooltips.1": "Plugins can be added to the screen for more functionality.", "item.prospector.mode.bedrock_ore": "§bBedrock Ore Prospection Mode§r", @@ -4633,7 +4646,6 @@ "item.prospector.mode.ores": "§aOre Prospection Mode§r", "item.prospector.tooltip.modes": "Available Modes:", "item.prospector.tooltip.radius": "Scans range in a %s Chunk Radius", - "item.record.sus.tooltip": "§7Leonz - Among Us Drip", "item.terminal.tooltip": "Sharp tools make good work", "item.terminal.tooltip.creative": "§bCreative Mode", "item.terminal.tooltip.hardware": "§aHardware: %d", @@ -5484,14 +5496,6 @@ "tagprefix.wire_gt_quadruple": "4x %s Wire", "tagprefix.wire_gt_single": "1x %s Wire", "tagprefix.wrench_tip": "%s Wrench Tip", - "tile.gtceu.brittle_charcoal.name": "Brittle Charcoal", - "tile.gtceu.brittle_charcoal.tooltip.0": "Produced by the Charcoal Pile Igniter.", - "tile.gtceu.brittle_charcoal.tooltip.1": "Mine this to get Charcoal.", - "tile.gtceu.foam.name": "Foam", - "tile.gtceu.petrified_foam.name": "Petrified Foam", - "tile.gtceu.reinforced_foam.name": "Reinforced Foam", - "tile.gtceu.reinforced_stone.name": "Reinforced Stone", - "tile.gtceu.seal.name": "Sealed Block", "tool.gtceu.attack_damage.tooltip": "%s §cAttack Damage", "tool.gtceu.attack_speed.tooltip": "%s §9Attack Speed", "tool.gtceu.behavior.aoe_mining": "§5Area-of-Effect: §f%sx%sx%s", diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java index b16edf4d173..738f631c628 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java @@ -33,7 +33,6 @@ import net.minecraft.client.renderer.BiomeColors; import net.minecraft.client.renderer.RenderType; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BlockTags; @@ -41,7 +40,6 @@ import net.minecraft.util.RandomSource; import net.minecraft.world.item.*; import net.minecraft.world.level.FoliageColor; -import net.minecraft.world.level.Level; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.grower.AbstractTreeGrower; import net.minecraft.world.level.block.state.BlockBehaviour; @@ -73,7 +71,6 @@ import com.tterrag.registrate.util.nullness.NonNullFunction; import com.tterrag.registrate.util.nullness.NonNullSupplier; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.function.Supplier; @@ -1202,16 +1199,7 @@ public static ItemColor leavesItemColor() { .lang("Brittle Charcoal") .tag(BlockTags.MINEABLE_WITH_SHOVEL) .blockstate(GTModels.cubeAllModel("brittle_charcoal", GTCEu.id("block/misc/brittle_charcoal"))) - .item((b, p) -> new BlockItem(b, p) { - - @Override - public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltipComponents, - TooltipFlag isAdvanced) { - super.appendHoverText(stack, level, tooltipComponents, isAdvanced); - tooltipComponents.add(1, Component.translatable("tile.gtceu.brittle_charcoal.tooltip.0")); - tooltipComponents.add(2, Component.translatable("tile.gtceu.brittle_charcoal.tooltip.1")); - } - }) + .item() .build() .register(); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java index 1e3669b178f..deb11c9ef51 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java @@ -13,7 +13,7 @@ public static void init(RegistrateLangProvider provider) { } private static void generateArmorKeys(RegistrateLangProvider provider) { - // nanomuscle suit + // NanoMuscle Suit provider.add("armor.gtceu.nms.nightvision.enabled", "NanoMuscle™ Suite: §aNightVision Enabled"); provider.add("armor.gtceu.nms.nightvision.disabled", " NanoMuscle™ Suite: §cNightVision Disabled"); provider.add("armor.gtceu.nms.boosted_jump.enabled", "NanoMuscle™ Suite: §aJump Boost Enabled"); @@ -23,7 +23,7 @@ private static void generateArmorKeys(RegistrateLangProvider provider) { provider.add("armor.gtceu.nms.charge.disable", " NanoMuscle™ Suite: §cCharging Disabled"); provider.add("armor.gtceu.nms.charge.error", "NanoMuscle™ Suite: §cNot enough power for charging!"); - // quantum suit + // Quantum Suit provider.add("armor.gtceu.qts.nightvision.enabled", "QuarkTech™ Suite: §aNightVision Enabled"); provider.add("armor.gtceu.qts.nightvision.disabled", "QuarkTech™ Suite: §cNightVision Disabled"); provider.add("armor.gtceu.qts.nightvision.error", "QuarkTech™ Suite: §cNot enough power!"); @@ -31,14 +31,14 @@ private static void generateArmorKeys(RegistrateLangProvider provider) { provider.add("armor.gtceu.qts.charge.disable", "QuarkTech™ Suite: §cCharging Disabled"); provider.add("armor.gtceu.qts.charge.error", "QuarkTech™ Suite: §cNot enough power for charging!"); - // jetpacks + // Jetpacks provider.add("armor.gtceu.jetpack.flight.enable", "Jetpack: Flight Enabled"); provider.add("armor.gtceu.jetpack.flight.disable", "Jetpack: Flight Disabled"); provider.add("armor.gtceu.jetpack.hover.enable", "Jetpack: Hover Mode Enabled"); provider.add("armor.gtceu.jetpack.hover.disable", "Jetpack: Hover Mode Disabled"); provider.add("armor.gtceu.jetpack.emergency_hover_mode", "§aEmergency Hover Mode Enabled!"); - // action bar messages + // Night Vision provider.add("armor.gtceu.message.nightvision.enabled", "NightVision: §aOn"); provider.add("armor.gtceu.message.nightvision.disabled", "NightVision: §cOff"); provider.add("armor.gtceu.message.nightvision.error", "Not enough power!"); @@ -47,7 +47,7 @@ private static void generateArmorKeys(RegistrateLangProvider provider) { private static void generateTooltipKeys(RegistrateLangProvider provider) { provider.add("item.liquid_fuel_jetpack.tooltip", "Uses Combustion Generator Fuels for Thrust"); - // basic ability tooltips + // Armor Abilities provider.add("armor.gtceu.tooltip.stepassist", "Provides Step-Assist"); provider.add("armor.gtceu.tooltip.speed", "Increases Running Speed"); provider.add("armor.gtceu.tooltip.jump", "Increases Jump Height and Distance"); @@ -58,7 +58,7 @@ private static void generateTooltipKeys(RegistrateLangProvider provider) { provider.add("armor.gtceu.tooltip.breath", "Replenishes Underwater Breath Bar"); provider.add("armor.gtceu.tooltip.autoeat", "Replenishes Food Bar by Using Food from Inventory"); - // energy tooltips (iaddinfo) + // Energy Tooltips (iaddinfo) provider.add("armor.gtceu.energy_share.error", "Energy Supply: §cNot enough power for gadgets charging!"); provider.add("armor.gtceu.energy_share.enable", "§aEnergy Supply: Gadgets charging enabled"); provider.add("armor.gtceu.energy_share.disable", "Energy Supply: Gadgets charging disabled"); @@ -68,6 +68,7 @@ private static void generateTooltipKeys(RegistrateLangProvider provider) { } private static void generateHudKeys(RegistrateLangProvider provider) { + // HUD Information provider.add("armor.gtceu.hud.status.enabled", "§aON"); provider.add("armor.gtceu.hud.status.disabled", "§cOFF"); provider.add("armor.gtceu.hud.energy_lvl", "Energy Level: %s"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java index 90b13d7af5d..fc60763324c 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java @@ -10,31 +10,26 @@ public class BlockLang { public static void init(RegistrateLangProvider provider) { generateBlockKeys(provider); + generateBlockTooltips(provider); generatePipeKeys(provider); } private static void generateBlockKeys(RegistrateLangProvider provider) { - provider.add("block.gtceu.lamp.tooltip.inverted", "Inverted"); - provider.add("block.gtceu.lamp.tooltip.no_bloom", "No Bloom"); - provider.add("block.gtceu.lamp.tooltip.no_light", "No Light"); - // Coils replace(provider, "block.gtceu.hssg_coil_block", "HSS-G Coil Block"); replace(provider, "block.gtceu.rtm_alloy_coil_block", "RTM Alloy Coil Block"); - replace(provider, "block.gtceu.wire_coil.tooltip_extended_info", "§7Hold SHIFT to show Coil Bonus Info"); - replace(provider, "block.gtceu.wire_coil.tooltip_heat", "§cBase Heat Capacity: §f%d K"); - replace(provider, "block.gtceu.wire_coil.tooltip_smelter", "§8Multi Smelter:"); - replace(provider, "block.gtceu.wire_coil.tooltip_parallel_smelter", " §5Max Parallel: §f%s"); - replace(provider, "block.gtceu.wire_coil.tooltip_energy_smelter", " §aEnergy Usage: §f%s EU/t §8per recipe"); - replace(provider, "block.gtceu.wire_coil.tooltip_pyro", "§8Pyrolyse Oven:"); - replace(provider, "block.gtceu.wire_coil.tooltip_speed_pyro", " §bProcessing Speed: §f%s%%"); - replace(provider, "block.gtceu.wire_coil.tooltip_cracking", "§8Cracking Unit:"); - replace(provider, "block.gtceu.wire_coil.tooltip_energy_cracking", " §aEnergy Usage: §f%s%%"); - // Substation Capacitors - provider.add("block.gtceu.substation_capacitor.tooltip_empty", "§7For filling space in your Power Substation"); - provider.add("block.gtceu.substation_capacitor.tooltip_filled", "§cEnergy Capacity: §f%d EU"); + replace(provider, GTBlocks.BATTERY_EMPTY_TIER_I.get().getDescriptionId(), "Empty Tier I Capacitor"); + replace(provider, GTBlocks.BATTERY_EMPTY_TIER_II.get().getDescriptionId(), "Empty Tier II Capacitor"); + replace(provider, GTBlocks.BATTERY_EMPTY_TIER_III.get().getDescriptionId(), "Empty Tier III Capacitor"); + + replace(provider, GTBlocks.BATTERY_LAPOTRONIC_EV.get().getDescriptionId(), "EV Lapotronic Capacitor"); + replace(provider, GTBlocks.BATTERY_LAPOTRONIC_IV.get().getDescriptionId(), "IV Lapotronic Capacitor"); + replace(provider, GTBlocks.BATTERY_LAPOTRONIC_LuV.get().getDescriptionId(), "LuV Lapotronic Capacitor"); + replace(provider, GTBlocks.BATTERY_LAPOTRONIC_ZPM.get().getDescriptionId(), "ZPM Lapotronic Capacitor"); + replace(provider, GTBlocks.BATTERY_LAPOTRONIC_UV.get().getDescriptionId(), "UV Lapotronic Capacitor"); + replace(provider, GTBlocks.BATTERY_ULTIMATE_UHV.get().getDescriptionId(), "UHV Ultimate Capacitor"); // Casings replace(provider, "block.gtceu.bronze_brick_casing", "Bricked Bronze Casing"); @@ -51,29 +46,32 @@ private static void generateBlockKeys(RegistrateLangProvider provider) { replace(provider, "block.gtceu.casing_grate", "Grate Machine Casing"); replace(provider, "block.gtceu.assembly_line_unit", "Assembly Control Casing"); replace(provider, "block.gtceu.ptfe_pipe_casing", "PTFE Pipe Casing"); + + // Gearboxes replace(provider, "block.gtceu.bronze_gearbox", "Bronze Gearbox Casing"); replace(provider, "block.gtceu.steel_gearbox", "Steel Gearbox Casing"); replace(provider, "block.gtceu.stainless_steel_gearbox", "Stainless Steel Gearbox Casing"); replace(provider, "block.gtceu.titanium_gearbox", "Titanium Gearbox Casing"); replace(provider, "block.gtceu.tungstensteel_gearbox", "Tungstensteel Gearbox Casing"); + + // Turbine Casing replace(provider, "block.gtceu.steel_turbine_casing", "Magnalium Turbine Casing"); replace(provider, "block.gtceu.titanium_turbine_casing", "Titanium Turbine Casing"); replace(provider, "block.gtceu.stainless_steel_turbine_casing", "Stainless Turbine Casing"); replace(provider, "block.gtceu.tungstensteel_turbine_casing", "Tungstensteel Turbine Casing"); + + // Pipe Casing replace(provider, "block.gtceu.bronze_pipe_casing", "Bronze Pipe Casing"); replace(provider, "block.gtceu.steel_pipe_casing", "Steel Pipe Casing"); replace(provider, "block.gtceu.titanium_pipe_casing", "Titanium Pipe Casing"); replace(provider, "block.gtceu.tungstensteel_pipe_casing", "Tungstensteel Pipe Casing"); replace(provider, "block.gtceu.palladium_substation", "Palladium Substation Casing"); + // Bricked Casings replace(provider, "block.gtceu.steam_casing_bronze", "Bronze Hull"); - provider.add("block.gtceu.steam_casing_bronze.tooltip", "§7For your first Steam Machines"); replace(provider, "block.gtceu.steam_casing_bricked_bronze", "Bricked Bronze Hull"); - provider.add("block.gtceu.steam_casing_bricked_bronze.tooltip", "§7For your first Steam Machines"); replace(provider, "block.gtceu.steam_casing_steel", "Steel Hull"); - provider.add("block.gtceu.steam_casing_steel.tooltip", "§7For improved Steam Machines"); replace(provider, "block.gtceu.steam_casing_bricked_steel", "Bricked Wrought Iron Hull"); - provider.add("block.gtceu.steam_casing_bricked_steel.tooltip", "§7For improved Steam Machines"); // GCYM Casings replace(provider, "block.gtceu.laser_safe_engraving_casing", "Laser-Safe Engraving Casing"); @@ -81,15 +79,13 @@ private static void generateBlockKeys(RegistrateLangProvider provider) { replace(provider, "block.gtceu.reaction_safe_mixing_casing", "Reaction-Safe Mixing Casing"); replace(provider, "block.gtceu.vibration_safe_casing", "Vibration-Safe Casing"); + // Fusion Casings replace(provider, "block.gtceu.superconducting_coil", "Superconducting Coil Block"); replace(provider, "block.gtceu.fusion_coil", "Fusion Coil Block"); replace(provider, "block.gtceu.fusion_casing", "Fusion Machine Casing"); replace(provider, "block.gtceu.fusion_casing_mk2", "Fusion Machine Casing MK II"); replace(provider, "block.gtceu.fusion_casing_mk3", "Fusion Machine Casing MK III"); - provider.add("block.filter_casing.tooltip", "Creates a §aParticle-Free§7 environment"); - provider.add("block.sterilizing_filter_casing.tooltip", "Creates a §aSterilized§7 environment"); - provider.add("block.gtceu.explosive.breaking_tooltip", "Primes explosion when mined, sneak mine to pick back up"); provider.add("block.gtceu.explosive.lighting_tooltip", "Cannot be lit with Redstone"); @@ -97,47 +93,68 @@ private static void generateBlockKeys(RegistrateLangProvider provider) { "Slightly larger than TNT, drops all destroyed Blocks as Items"); provider.add("block.gtceu.itnt.drops_tooltip", "Much larger than TNT, drops all destroyed Blocks as Items"); - provider.add("block.gtceu.normal_laser_pipe.tooltip", - "§7Transmitting power with §fno loss§7 in straight lines"); - provider.add("block.gtceu.normal_optical_pipe.tooltip", "§7Transmitting §fComputation§7 or §fResearch Data§7"); - - replace(provider, GTBlocks.BATTERY_EMPTY_TIER_I.get().getDescriptionId(), "Empty Tier I Capacitor"); - replace(provider, GTBlocks.BATTERY_LAPOTRONIC_EV.get().getDescriptionId(), "EV Lapotronic Capacitor"); - replace(provider, GTBlocks.BATTERY_LAPOTRONIC_IV.get().getDescriptionId(), "IV Lapotronic Capacitor"); - replace(provider, GTBlocks.BATTERY_EMPTY_TIER_II.get().getDescriptionId(), "Empty Tier II Capacitor"); - replace(provider, GTBlocks.BATTERY_LAPOTRONIC_LuV.get().getDescriptionId(), "LuV Lapotronic Capacitor"); - replace(provider, GTBlocks.BATTERY_LAPOTRONIC_ZPM.get().getDescriptionId(), "ZPM Lapotronic Capacitor"); - replace(provider, GTBlocks.BATTERY_EMPTY_TIER_III.get().getDescriptionId(), "Empty Tier III Capacitor"); - replace(provider, GTBlocks.BATTERY_LAPOTRONIC_UV.get().getDescriptionId(), "UV Lapotronic Capacitor"); - replace(provider, GTBlocks.BATTERY_ULTIMATE_UHV.get().getDescriptionId(), "UHV Ultimate Capacitor"); - // Decor Stuff - replace(provider, "block.gtceu.yellow_stripes_block.a", "Yellow Stripes Block"); - replace(provider, "block.gtceu.yellow_stripes_block.b", "Yellow Stripes Block"); - replace(provider, "block.gtceu.yellow_stripes_block.c", "Yellow Stripes Block"); - replace(provider, "block.gtceu.yellow_stripes_block.d", "Yellow Stripes Block"); + replace(provider, "block.gtceu.yellow_stripes_block_a", "Yellow Stripes Block"); + replace(provider, "block.gtceu.yellow_stripes_block_b", "Yellow Stripes Block"); + replace(provider, "block.gtceu.yellow_stripes_block_c", "Yellow Stripes Block"); + replace(provider, "block.gtceu.yellow_stripes_block_d", "Yellow Stripes Block"); // Extra stone blocks - provider.add("tile.gtceu.seal.name", "Sealed Block"); - provider.add("tile.gtceu.foam.name", "Foam"); - provider.add("tile.gtceu.reinforced_foam.name", "Reinforced Foam"); - provider.add("tile.gtceu.petrified_foam.name", "Petrified Foam"); - provider.add("tile.gtceu.reinforced_stone.name", "Reinforced Stone"); - provider.add("tile.gtceu.brittle_charcoal.name", "Brittle Charcoal"); - multilineLang(provider, "tile.gtceu.brittle_charcoal.tooltip", - "Produced by the Charcoal Pile Igniter.\nMine this to get Charcoal."); + provider.add("block.gtceu.seal", "Sealed Block"); + // provider.add("block.gtceu.foam", "Foam"); + // provider.add("block.gtceu.reinforced_foam", "Reinforced Foam"); + // provider.add("block.gtceu.petrified_foam", "Petrified Foam"); + // provider.add("block.gtceu.reinforced_stone", "Reinforced Stone"); + // provider.add("block.gtceu.brittle_charcoal", "Brittle Charcoal"); // Surface Rocks provider.add("block.surface_rock", "%s Surface Rock"); } + private static void generateBlockTooltips(RegistrateLangProvider provider) { + // Coil Tooltip + replace(provider, "block.gtceu.wire_coil.tooltip_extended_info", "§7Hold SHIFT to show Coil Bonus Info"); + replace(provider, "block.gtceu.wire_coil.tooltip_heat", "§cBase Heat Capacity: §f%d K"); + replace(provider, "block.gtceu.wire_coil.tooltip_smelter", "§8Multi Smelter:"); + replace(provider, "block.gtceu.wire_coil.tooltip_parallel_smelter", " §5Max Parallel: §f%s"); + replace(provider, "block.gtceu.wire_coil.tooltip_energy_smelter", " §aEnergy Usage: §f%s EU/t §8per recipe"); + replace(provider, "block.gtceu.wire_coil.tooltip_pyro", "§8Pyrolyse Oven:"); + replace(provider, "block.gtceu.wire_coil.tooltip_speed_pyro", " §bProcessing Speed: §f%s%%"); + replace(provider, "block.gtceu.wire_coil.tooltip_cracking", "§8Cracking Unit:"); + replace(provider, "block.gtceu.wire_coil.tooltip_energy_cracking", " §aEnergy Usage: §f%s%%"); + + // Substation Capacitors + provider.add("block.gtceu.substation_capacitor.tooltip_empty", "§7For filling space in your Power Substation"); + provider.add("block.gtceu.substation_capacitor.tooltip_filled", "§cEnergy Capacity: §f%d EU"); + + // Bricked Casings + provider.add("block.gtceu.steam_casing_bronze.tooltip", "§7For your first Steam Machines"); + provider.add("block.gtceu.steam_casing_bricked_bronze.tooltip", "§7For your first Steam Machines"); + provider.add("block.gtceu.steam_casing_steel.tooltip", "§7For improved Steam Machines"); + provider.add("block.gtceu.steam_casing_bricked_steel.tooltip", "§7For improved Steam Machines"); + + // Filter Casings + provider.add("block.gtceu.filter_casing.tooltip", "Creates a §aParticle-Free§7 environment"); + provider.add("block.gtceu.sterilizing_filter_casing.tooltip", "Creates a §aSterilized§7 environment"); + + // Lamps + provider.add("block.gtceu.lamp.tooltip.inverted", "Inverted"); + provider.add("block.gtceu.lamp.tooltip.no_bloom", "No Bloom"); + provider.add("block.gtceu.lamp.tooltip.no_light", "No Light"); + + // Charcoal + multilineLang(provider, "block.gtceu.brittle_charcoal.tooltip", + "Produced by the Charcoal Pile Igniter.\nMine this to get Charcoal."); + } + private static void generatePipeKeys(RegistrateLangProvider provider) { - // cable + // Cables provider.add("gtceu.cable.voltage", "§aMax Voltage:§r §a%d §a(%s§a)"); provider.add("gtceu.cable.amperage", "§eMax Amperage:§r §e%d"); provider.add("gtceu.cable.loss_per_block", "§cLoss/Meter/Ampere:§r §c%d§7 EU-Volt"); provider.add("gtceu.cable.superconductor", "%s §dSuperconductor"); + // Fluid Pipes provider.add("gtceu.fluid_pipe.capacity", "§9Capacity: §f%d mB"); provider.add("gtceu.fluid_pipe.max_temperature", "§cTemperature Limit: §f%d K"); provider.add("gtceu.fluid_pipe.channels", "§eChannels: §f%d"); @@ -146,7 +163,16 @@ private static void generatePipeKeys(RegistrateLangProvider provider) { provider.add("gtceu.fluid_pipe.cryo_proof", "§6Can handle Cryogenics"); provider.add("gtceu.fluid_pipe.plasma_proof", "§6Can handle all Plasmas"); provider.add("gtceu.fluid_pipe.not_gas_proof", "§4Gases may leak!"); + + // Item Pipes provider.add("gtceu.item_pipe.priority", "§9Priority: §f%d"); + + // Duct Pipes provider.add("gtceu.duct_pipe.transfer_rate", "§bAir transfer rate: %s"); + + // Optical/Laser + provider.add("block.gtceu.normal_laser_pipe.tooltip", + "§7Transmitting power with §fno loss§7 in straight lines"); + provider.add("block.gtceu.normal_optical_pipe.tooltip", "§7Transmitting §fComputation§7 or §fResearch Data§7"); } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java index 2493cc8a664..a29191b4509 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java @@ -13,19 +13,19 @@ public static void init(RegistrateLangProvider provider) { private static void generateCommandLang(RegistrateLangProvider provider) { provider.add("command.gtceu.dump_data.success", "Dumped %s resources from registry %s to %s"); - // prospection commands + // Prospection Commands provider.add("command.gtceu.place_vein.failure", "Failed to place vein %s at position %s"); provider.add("command.gtceu.place_vein.success", "Placed vein %s at position %s"); provider.add("command.gtceu.share_prospection_data.notification", "%s is sharing prospecting data with you!"); - // medical conditions + // Medical Conditions provider.add("command.gtceu.medical_condition.get", "Player %s has these medical conditions:"); provider.add("command.gtceu.medical_condition.get.empty", "Player %s has no medical conditions."); provider.add("command.gtceu.medical_condition.get.element", "Condition %s§r: %s minutes %s seconds"); provider.add("command.gtceu.medical_condition.get.element.permanent", "Condition %s§r: %s minutes %s seconds (permanent)"); - // gtceu worldgen + // GT Worldgen provider.add("command.gtceu.usage", "Usage: /gtceu "); provider.add("command.gtceu.worldgen.usage", "Usage: /gtceu worldgen "); provider.add("command.gtceu.worldgen.reload.usage", "Usage: /gtceu worldgen reload"); @@ -33,7 +33,7 @@ private static void generateCommandLang(RegistrateLangProvider provider) { provider.add("command.gtceu.worldgen.reload.failed", "Worldgen reload failed. Check console for errors."); - // gtceu hand + // GT Hand (useless) provider.add("command.gtceu.hand.groovy", "Consider using §6/gs hand"); provider.add("command.gtceu.hand.usage", "Usage: /gtceu hand"); provider.add("command.gtceu.hand.item_id", "Item: %s (Metadata: %d)"); @@ -49,24 +49,24 @@ private static void generateCommandLang(RegistrateLangProvider provider) { provider.add("command.gtceu.hand.no_item", "You must hold something in main hand or off hand before executing this command."); - // recipe check command + // Recipe Check provider.add("command.gtceu.recipecheck.usage", "Usage: /gtceu recipecheck"); provider.add("command.gtceu.recipecheck.begin", "Starting recipe conflict check..."); provider.add("command.gtceu.recipecheck.end", "Recipe conflict check found %d possible conflicts. Check the server log for more info"); provider.add("command.gtceu.recipecheck.end_no_conflicts", "No recipe conflicts found!"); - // copy command + // Copy command provider.add("command.gtceu.copy.copied_and_click", "Copied to clipboard. Click to copy again"); provider.add("command.gtceu.copy.click_to_copy", "Click to copy"); provider.add("command.gtceu.copy.copied_start", "Copied ["); provider.add("command.gtceu.copy.copied_end", "] to the clipboard"); - // old cape provider + // Cape Message provider.add("gtceu.chat.cape", "§5Congrats: you just unlocked a new cape! See the Cape Selector terminal app to use it.§r"); - // New Cape Command + // New Cape Commands provider.add("command.gtceu.cape.give.failed", "No new capes were unlocked"); provider.add("command.gtceu.cape.give.success.multiple", "Unlocked %s capes for %s players"); provider.add("command.gtceu.cape.give.success.single", "Unlocked %s capes for %s"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java index 62c73444b18..e8f5323beb5 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java @@ -11,6 +11,7 @@ public static void init(RegistrateLangProvider provider) { } private static void generateHazardKeys(RegistrateLangProvider provider) { + // Medical Conditions provider.add("gtceu.medical_condition.description", "§l§cHAZARDOUS §7Hold Shift to show details"); provider.add("gtceu.medical_condition.description_shift", "§l§cHAZARDOUS:"); provider.add("gtceu.medical_condition.chemical_burns", "§5Chemical burns"); @@ -27,6 +28,7 @@ private static void generateHazardKeys(RegistrateLangProvider provider) { provider.add("gtceu.medical_condition.carbon_monoxide_poisoning", "§7Carbon Monoxide Poisoning"); provider.add("gtceu.medical_condition.none", "§2Not Dangerous"); + // Hazard Triggers provider.add("gtceu.hazard_trigger.description", "Caused by:"); provider.add("gtceu.hazard_trigger.protection.description", "Protects from:"); provider.add("gtceu.hazard_trigger.inhalation", "Inhalation"); @@ -34,6 +36,7 @@ private static void generateHazardKeys(RegistrateLangProvider provider) { provider.add("gtceu.hazard_trigger.skin_contact", "Skin contact"); provider.add("gtceu.hazard_trigger.none", "Nothing"); + // Antidote provider.add("gtceu.medical_condition.antidote.description", "§aAntidote §7Hold Shift to show details"); provider.add("gtceu.medical_condition.antidote.description_shift", "§aCures these conditions:"); provider.add("gtceu.medical_condition.antidote.description.effect_removed", @@ -41,9 +44,11 @@ private static void generateHazardKeys(RegistrateLangProvider provider) { provider.add("gtceu.medical_condition.antidote.description.effect_removed.all", "Removes all of current conditions' effects"); + // Potion provider.add("gtceu.tooltip.potion.header", "§6Contains effects:"); provider.add("gtceu.tooltip.potion.each", "%s %s §7for§r %s §7ticks with a§r %s%% §7chance of happening§r"); + // Poison provider.add("effect.gtceu.weak_poison", "Weak Poison"); } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java index a282b86e4dd..2fa0e25becd 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java @@ -34,35 +34,45 @@ private static void initRecipeViewerLang(RegistrateLangProvider provider) { provider.add("gtceu.jei.bedrock_fluid_diagram", "Bedrock Fluid Diagram"); provider.add("gtceu.jei.bedrock_ore_diagram", "Bedrock Ore Diagram"); - // Ore vein + // Ore Veins provider.add("ore.spawnlocation.name", "Ore Spawn Information"); + provider.add("gtceu.jei.ore_vein_diagram.chance", "§eChance: %s§r"); provider.add("gtceu.jei.ore_vein_diagram.spawn_range", "Spawn Range:"); provider.add("gtceu.jei.ore_vein_diagram.weight", "Weight: %s"); provider.add("gtceu.jei.ore_vein_diagram.dimensions", "Dimensions:"); - multiLang(provider, "gtceu.jei.ore.primary", "Top Ore", "Spawns in the top %d layers of the vein"); + + multiLang(provider, "gtceu.jei.ore.primary", "Top Ore", + "Spawns in the top %d layers of the vein"); multiLang(provider, "gtceu.jei.ore.secondary", "Bottom Ore", "Spawns in the bottom %d layers of the vein"); multiLang(provider, "gtceu.jei.ore.between", "Between Ore", "Spawns in the middle %d layers of the vein, with other ores"); - multiLang(provider, "gtceu.jei.ore.sporadic", "Sporadic Ore", "Spawns anywhere in the vein"); + multiLang(provider, "gtceu.jei.ore.sporadic", "Sporadic Ore", + "Spawns anywhere in the vein"); + provider.add("gtceu.jei.ore.biome_weighting_title", "§dModified Biome Total Weights:"); provider.add("gtceu.jei.ore.biome_weighting", "§d%s Weight: §3%d"); provider.add("gtceu.jei.ore.biome_weighting_no_spawn", "§d%s Weight: §cCannot Spawn"); provider.add("gtceu.jei.ore.ore_weight", "Weight in vein: %d%%"); + + // Surface Rock multiLang(provider, "gtceu.jei.ore.surface_rock", "Surface Rocks with this material denote vein spawn locations.", "They can be broken for 3 Tiny Piles of the dust, with Fortune giving a bonus."); // Fluid vein provider.add("fluid.spawnlocation.name", "Fluid Vein Information"); + provider.add("gtceu.jei.fluid.vein_weight", "Vein Weight: %d"); provider.add("gtceu.jei.fluid.min_yield", "Minimum Yield: %d"); provider.add("gtceu.jei.fluid.max_yield", "Maximum Yield: %d"); provider.add("gtceu.jei.fluid.depletion_chance", "Depletion Chance: %d%%"); provider.add("gtceu.jei.fluid.depletion_amount", "Depletion Amount: %d"); provider.add("gtceu.jei.fluid.depleted_rate", "Depleted Yield: %d"); + provider.add("gtceu.jei.fluid.dimension", "Dimensions:"); + provider.add("gtceu.jei.fluid.weight_hover", "The Weight of the vein. Hover over the fluid to see any possible biome modifications"); provider.add("gtceu.jei.fluid.min_hover", @@ -75,6 +85,7 @@ private static void initRecipeViewerLang(RegistrateLangProvider provider) { provider.add("gtceu.jei.fluid.dep_yield_hover", "The maximum yield of the vein when it is fully depleted"); + // Vein Names GTRegistries.ORE_VEINS.unfreeze(); GTOres.init(); for (GTOreDefinition oreDefinition : GTRegistries.ORE_VEINS) { @@ -88,6 +99,7 @@ private static void initRecipeViewerLang(RegistrateLangProvider provider) { provider.add("gtceu.jei.bedrock_fluid." + name, RegistrateLangProvider.toEnglishName(name)); } + // Potion provider.add("gtceu.rei.group.potion_fluids", "Potion Fluids"); } @@ -96,17 +108,25 @@ private static void initWailaLikeLang(RegistrateLangProvider provider) { provider.add("gtceu.top.working_disabled", "Working Disabled"); provider.add("gtceu.top.energy_consumption", "Using"); provider.add("gtceu.top.energy_production", "Producing"); + + // Transformers provider.add("gtceu.top.transform_up", "§cStep Up§r %s"); provider.add("gtceu.top.transform_down", "§aStep Down§r %s"); provider.add("gtceu.top.transform_input", "§6Input:§r %s"); provider.add("gtceu.top.transform_output", "§9Output:§r %s"); provider.add("gtceu.top.convert_eu", "Converting §eEU§r -> §cFE§r"); provider.add("gtceu.top.convert_fe", "Converting §cFE§r -> §eEU§r"); + + // Generators provider.add("gtceu.top.fuel_min_consume", "Needs"); provider.add("gtceu.top.fuel_none", "No fuel"); + + // Multiblock Structures provider.add("gtceu.top.invalid_structure", "Structure Incomplete"); provider.add("gtceu.top.valid_structure", "Structure Formed"); provider.add("gtceu.top.obstructed_structure", "Structure Obstructed"); + + // Maintenance provider.add("gtceu.top.maintenance_fixed", "Maintenance Fine"); provider.add("gtceu.top.maintenance_broken", "Needs Maintenance"); provider.add("gtceu.top.maintenance.wrench", "Pipe is loose"); @@ -115,25 +135,45 @@ private static void initWailaLikeLang(RegistrateLangProvider provider) { provider.add("gtceu.top.maintenance.hard_hammer", "Plating is dented"); provider.add("gtceu.top.maintenance.wire_cutter", "Wires burned out"); provider.add("gtceu.top.maintenance.crowbar", "That doesn't belong there"); + + // Steam Venting + provider.add("gtceu.top.exhaust_vent_direction", "Exhaust Vent: %s"); + provider.add("gtceu.top.exhaust_vent_blocked", "Blocked"); + + // Primitive Pump provider.add("gtceu.top.primitive_pump_production", "Production: %s mB/s"); + + // Ender Link Cover?? provider.add("gtceu.top.filter.label", "Filter:"); provider.add("gtceu.top.link_cover.color", "Color:"); provider.add("gtceu.top.mode.export", "Exporting"); provider.add("gtceu.top.mode.import", "Importing"); + + // Extra Cover Provider provider.add("gtceu.top.unit.items", "Items"); provider.add("gtceu.top.unit.fluid_milibuckets", "L"); provider.add("gtceu.top.unit.fluid_buckets", "kL"); + + // Recipe Provider provider.add("gtceu.top.recipe_output", "Recipe Outputs:"); provider.add("gtceu.top.item_auto_output", "Item Output: %s"); provider.add("gtceu.top.fluid_auto_output", "Fluid Output: %s"); + + // IO Provider provider.add("gtceu.top.auto_output", "Auto Output"); provider.add("gtceu.top.allow_output_input", "Allow Input"); + + // Cable Provider provider.add("gtceu.top.cable_voltage", "Voltage: "); provider.add("gtceu.top.cable_amperage", "Amperage: "); - provider.add("gtceu.top.exhaust_vent_direction", "Exhaust Vent: %s"); - provider.add("gtceu.top.exhaust_vent_blocked", "Blocked"); + + // Machine Mode Provider provider.add("gtceu.top.machine_mode", "Machine Mode: "); + + // Color Provider provider.add("gtceu.top.stained", "Colored: %s"); + + // Proxy/Buffers provider.add("gtceu.top.buffer_not_bound", "Buffer Not Currently Bound"); provider.add("gtceu.top.buffer_bound_pos", "Bound To - X: %s, Y: %s, Z: %s"); provider.add("gtceu.top.proxies_bound", "Buffer Proxies Bound: %s"); @@ -147,8 +187,11 @@ private static void initWailaLikeLang(RegistrateLangProvider provider) { provider.add("gtceu.jade.progress_computation", "%s / %s CWU"); provider.add("gtceu.jade.progress_sec", "%s / %s s"); provider.add("gtceu.jade.progress_tick", "%s / %s t"); + + // Hazard Provider provider.add("gtceu.jade.cleaned_this_second", "Cleaned hazard: %s/s"); + // Plugin Names provider.add("config.jade.plugin_gtceu.controllable_provider", "[GTCEu] Controllable"); provider.add("config.jade.plugin_gtceu.workable_provider", "[GTCEu] Workable"); provider.add("config.jade.plugin_gtceu.electric_container_provider", "[GTCEu] Electric Container"); @@ -172,18 +215,22 @@ private static void initWailaLikeLang(RegistrateLangProvider provider) { } private static void initMinimapLang(RegistrateLangProvider provider) { + // Tooltip/Name provider.add("gtceu.minimap.ore_vein.depleted", "Depleted"); + // Chat Messages provider.add("message.gtceu.new_veins.amount", "Prospected %d new veins!"); provider.add("message.gtceu.new_veins.name", "Prospected %s!"); - provider.add("button.gtceu.mark_as_depleted.name", "Mark as Depleted"); - provider.add("button.gtceu.toggle_waypoint.name", "Toggle Waypoint"); + // Options provider.add("gtceu.journeymap.options.layers", "Prospection layers"); provider.add("gtceu.journeymap.options.layers.ore_veins", "Show Ore Veins"); provider.add("gtceu.journeymap.options.layers.bedrock_fluids", "Show Bedrock Fluid Veins"); provider.add("gtceu.journeymap.options.layers.hide_depleted", "Hide Depleted Veins"); + // Buttons + provider.add("button.gtceu.mark_as_depleted.name", "Mark as Depleted"); + provider.add("button.gtceu.toggle_waypoint.name", "Toggle Waypoint"); provider.add("gtceu.button.ore_veins", "Show GT Ore Veins"); provider.add("gtceu.button.bedrock_fluids", "Show Bedrock Fluid Veins"); provider.add("gtceu.button.hide_depleted", "Hide Depleted Veins"); @@ -191,6 +238,7 @@ private static void initMinimapLang(RegistrateLangProvider provider) { } private static void initOwnershipLang(RegistrateLangProvider provider) { + // Team Names provider.add("gtceu.ownership.name.player", "Player"); provider.add("gtceu.ownership.name.ftb", "FTB Teams"); provider.add("gtceu.ownership.name.argonauts", "Argonauts Guild"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java index 292e1bbf42d..1326c00d134 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java @@ -36,15 +36,17 @@ private static void initGeneratedNames(RegistrateLangProvider provider) { provider.add("gtceu.recipe.category.chem_dyes", "Chemical Dyeing"); provider.add("gtceu.recipe.category.ingot_molding", "Metal Molding"); - // TagPrefix + // All TagPrefixes for (TagPrefix tagPrefix : TagPrefix.values()) { provider.add(tagPrefix.getUnlocalizedName(), tagPrefix.langValue); } - // GTToolType + + // All GTToolTypes for (GTToolType toolType : GTToolType.getTypes().values()) { provider.add(toolType.getUnlocalizedName(), toEnglishName(toolType.name)); } + // Tag Prefix provider.add("tagprefix.polymer.plate", "%s Sheet"); provider.add("tagprefix.polymer.foil", "Thin %s Sheet"); provider.add("tagprefix.polymer.nugget", "%s Chip"); @@ -55,20 +57,26 @@ private static void initGeneratedNames(RegistrateLangProvider provider) { provider.add("tagprefix.polymer.dust", "%s Pulp"); provider.add("tagprefix.polymer.ingot", "%s Ingot"); + // Material Items provider.add("item.gtceu.tiny_gunpowder_dust", "Tiny Pile of Gunpowder"); provider.add("item.gtceu.small_gunpowder_dust", "Small Pile of Gunpowder"); + provider.add("item.gtceu.tiny_paper_dust", "Tiny Pile of Chad"); provider.add("item.gtceu.small_paper_dust", "Small Pile of Chad"); provider.add("item.gtceu.paper_dust", "Chad"); + provider.add("item.gtceu.tiny_rare_earth_dust", "Tiny Pile of Rare Earth"); provider.add("item.gtceu.small_rare_earth_dust", "Small Pile of Rare Earth"); provider.add("item.gtceu.rare_earth_dust", "Rare Earth"); + provider.add("item.gtceu.tiny_ash_dust", "Tiny Pile of Ashes"); provider.add("item.gtceu.small_ash_dust", "Small Pile of Ashes"); provider.add("item.gtceu.ash_dust", "Ashes"); + provider.add("item.gtceu.tiny_bone_dust", "Tiny Pile of Bone Meal"); provider.add("item.gtceu.small_bone_dust", "Small Pile of Bone Meal"); provider.add("item.gtceu.bone_dust", "Bone Meal"); + provider.add("item.gtceu.refined_cassiterite_sand_ore", "Refined Cassiterite Sand"); provider.add("item.gtceu.purified_cassiterite_sand_ore", "Purified Cassiterite Sand"); provider.add("item.gtceu.crushed_cassiterite_sand_ore", "Ground Cassiterite Sand"); @@ -77,31 +85,38 @@ private static void initGeneratedNames(RegistrateLangProvider provider) { provider.add("item.gtceu.impure_cassiterite_sand_dust", "Impure Pile of Cassiterite Sand"); provider.add("item.gtceu.pure_cassiterite_sand_dust", "Purified Pile of Cassiterite Sand"); provider.add("item.gtceu.cassiterite_sand_dust", "Cassiterite Sand"); + provider.add("item.gtceu.tiny_dark_ash_dust", "Tiny Pile of Dark Ashes"); provider.add("item.gtceu.small_dark_ash_dust", "Small Pile of Dark Ashes"); provider.add("item.gtceu.dark_ash_dust", "Dark Ashes"); + provider.add("item.gtceu.tiny_ice_dust", "Tiny Pile of Crushed Ice"); provider.add("item.gtceu.small_ice_dust", "Small Pile of Crushed Ice"); provider.add("item.gtceu.ice_dust", "Crushed Ice"); + provider.add("item.gtceu.sugar_gem", "Sugar Cube"); provider.add("item.gtceu.chipped_sugar_gem", "Small Sugar Cubes"); provider.add("item.gtceu.flawed_sugar_gem", "Tiny Sugar Cube"); + provider.add("item.gtceu.tiny_rock_salt_dust", "Tiny Pile of Rock Salt"); provider.add("item.gtceu.small_rock_salt_dust", "Small Pile of Rock Salt"); provider.add("item.gtceu.impure_rock_salt_dust", "Impure Pile of Rock Salt"); provider.add("item.gtceu.pure_rock_salt_dust", "Purified Pile of Rock Salt"); provider.add("item.gtceu.rock_salt_dust", "Rock Salt"); + provider.add("item.gtceu.tiny_salt_dust", "Tiny Pile of Salt"); provider.add("item.gtceu.small_salt_dust", "Small Pile of Salt"); provider.add("item.gtceu.impure_salt_dust", "Impure Pile of Salt"); provider.add("item.gtceu.pure_salt_dust", "Purified Pile of Salt"); provider.add("item.gtceu.salt_dust", "Salt"); + provider.add("item.gtceu.tiny_wood_dust", "Tiny Pile of Wood Pulp"); provider.add("item.gtceu.small_wood_dust", "Small Pile of Wood Pulp"); provider.add("item.gtceu.wood_dust", "Wood Pulp"); provider.add("item.gtceu.wood_plate", "Wood Plank"); provider.add("item.gtceu.long_wood_rod", "Long Wood Stick"); provider.add("item.gtceu.wood_bolt", "Short Wood Stick"); + provider.add("item.gtceu.tiny_treated_wood_dust", "Tiny Pile of Treated Wood Pulp"); provider.add("item.gtceu.small_treated_wood_dust", "Small Pile of Treated Wood Pulp"); provider.add("item.gtceu.treated_wood_dust", "Treated Wood Pulp"); @@ -109,31 +124,41 @@ private static void initGeneratedNames(RegistrateLangProvider provider) { provider.add("item.gtceu.treated_wood_rod", "Treated Wood Stick"); provider.add("item.gtceu.long_treated_wood_rod", "Long Treated Wood Stick"); provider.add("item.gtceu.treated_wood_bolt", "Short Treated Wood Stick"); + provider.add("item.gtceu.glass_gem", "Glass Crystal"); provider.add("item.gtceu.chipped_glass_gem", "Chipped Glass Crystal"); provider.add("item.gtceu.flawed_glass_gem", "Flawed Glass Crystal"); provider.add("item.gtceu.flawless_glass_gem", "Flawless Glass Crystal"); provider.add("item.gtceu.exquisite_glass_gem", "Exquisite Glass Crystal"); provider.add("item.gtceu.glass_plate", "Glass Pane"); + provider.add("item.gtceu.glass_lens", "Glass Lens (White)"); + provider.add("item.gtceu.tiny_blaze_dust", "Tiny Pile of Blaze Powder"); provider.add("item.gtceu.small_blaze_dust", "Small Pile of Blaze Powder"); + provider.add("item.gtceu.tiny_sugar_dust", "Tiny Pile of Sugar"); provider.add("item.gtceu.small_sugar_dust", "Small Pile of Sugar"); + provider.add("item.gtceu.tiny_basaltic_mineral_sand_dust", "Tiny Pile of Basaltic Mineral Sand"); provider.add("item.gtceu.small_basaltic_mineral_sand_dust", "Small Pile of Basaltic Mineral Sand"); provider.add("item.gtceu.basaltic_mineral_sand_dust", "Basaltic Mineral Sand"); + provider.add("item.gtceu.tiny_granitic_mineral_sand_dust", "Tiny Pile of Granitic Mineral Sand"); provider.add("item.gtceu.small_granitic_mineral_sand_dust", "Small Pile of Granitic Mineral Sand"); provider.add("item.gtceu.granitic_mineral_sand_dust", "Granitic Mineral Sand"); + provider.add("item.gtceu.tiny_garnet_sand_dust", "Tiny Pile of Garnet Sand"); provider.add("item.gtceu.small_garnet_sand_dust", "Small Pile of Garnet Sand"); provider.add("item.gtceu.garnet_sand_dust", "Garnet Sand"); + provider.add("item.gtceu.tiny_quartz_sand_dust", "Tiny Pile of Quartz Sand"); provider.add("item.gtceu.small_quartz_sand_dust", "Small Pile of Quartz Sand"); provider.add("item.gtceu.quartz_sand_dust", "Quartz Sand"); + provider.add("item.gtceu.tiny_glauconite_sand_dust", "Tiny Pile of Glauconite Sand"); provider.add("item.gtceu.small_glauconite_sand_dust", "Small Pile of Glauconite Sand"); provider.add("item.gtceu.glauconite_sand_dust", "Glauconite Sand"); + provider.add("item.gtceu.refined_bentonite_ore", "Refined Bentonite"); provider.add("item.gtceu.purified_bentonite_ore", "Purified Bentonite"); provider.add("item.gtceu.crushed_bentonite_ore", "Ground Bentonite"); @@ -142,9 +167,11 @@ private static void initGeneratedNames(RegistrateLangProvider provider) { provider.add("item.gtceu.impure_bentonite_dust", "Impure Pile of Bentonite"); provider.add("item.gtceu.pure_bentonite_dust", "Purified Pile of Bentonite"); provider.add("item.gtceu.bentonite_dust", "Bentonite"); + provider.add("item.gtceu.tiny_fullers_earth_dust", "Tiny Pile of Fullers Earth"); provider.add("item.gtceu.small_fullers_earth_dust", "Small Pile of Fullers Earth"); provider.add("item.gtceu.fullers_earth_dust", "Fullers Earth"); + provider.add("item.gtceu.refined_pitchblende_ore", "Refined Pitchblende"); provider.add("item.gtceu.purified_pitchblende_ore", "Purified Pitchblende"); provider.add("item.gtceu.crushed_pitchblende_ore", "Ground Pitchblende"); @@ -153,6 +180,7 @@ private static void initGeneratedNames(RegistrateLangProvider provider) { provider.add("item.gtceu.impure_pitchblende_dust", "Impure Pile of Pitchblende"); provider.add("item.gtceu.pure_pitchblende_dust", "Purified Pile of Pitchblende"); provider.add("item.gtceu.pitchblende_dust", "Pitchblende"); + provider.add("item.gtceu.refined_talc_ore", "Refined Talc"); provider.add("item.gtceu.purified_talc_ore", "Purified Talc"); provider.add("item.gtceu.crushed_talc_ore_ore", "Ground Talc"); @@ -161,32 +189,42 @@ private static void initGeneratedNames(RegistrateLangProvider provider) { provider.add("item.gtceu.impure_talc_dust", "Impure Pile of Talc"); provider.add("item.gtceu.pure_talc_dust", "Purified Pile of Talc"); provider.add("item.gtceu.talc_dust", "Talc"); + provider.add("item.gtceu.tiny_wheat_dust", "Tiny Pile of Flour"); provider.add("item.gtceu.small_wheat_dust", "Small Pile of Flour"); provider.add("item.gtceu.wheat_dust", "Flour"); + provider.add("item.gtceu.tiny_meat_dust", "Tiny Pile of Mince Meat"); provider.add("item.gtceu.small_meat_dust", "Small Pile of Mince Meat"); provider.add("item.gtceu.meat_dust", "Mince Meat"); + provider.add("item.gtceu.borosilicate_glass_ingot", "Borosilicate Glass Bar"); provider.add("item.gtceu.fine_borosilicate_glass_wire", "Borosilicate Glass Fibers"); + provider.add("item.gtceu.tiny_platinum_group_sludge_dust", "Tiny Clump of Platinum Group Sludge"); provider.add("item.gtceu.small_platinum_group_sludge_dust", "Small Clump of Platinum Group Sludge"); provider.add("item.gtceu.platinum_group_sludge_dust", "Platinum Group Sludge"); + provider.add("item.gtceu.tiny_platinum_raw_dust", "Tiny Pile of Raw Platinum Powder"); provider.add("item.gtceu.small_platinum_raw_dust", "Small Pile of Raw Platinum Powder"); provider.add("item.gtceu.platinum_raw_dust", "Raw Platinum Powder"); + provider.add("item.gtceu.tiny_palladium_raw_dust", "Tiny Pile of Raw Palladium Powder"); provider.add("item.gtceu.small_palladium_raw_dust", "Small Pile of Raw Palladium Powder"); provider.add("item.gtceu.palladium_raw_dust", "Raw Palladium Powder"); + provider.add("item.gtceu.tiny_inert_metal_mixture_dust", "Tiny Pile of Inert Metal Mixture"); provider.add("item.gtceu.small_inert_metal_mixture_dust", "Small Pile of Inert Metal Mixture"); provider.add("item.gtceu.inert_metal_mixture_dust", "Inert Metal Mixture"); + provider.add("item.gtceu.tiny_rarest_metal_mixture_dust", "Tiny Pile of Rarest Metal Mixture"); provider.add("item.gtceu.small_rarest_metal_mixture_dust", "Small Pile of Rarest Metal Mixture"); provider.add("item.gtceu.rarest_metal_mixture_dust", "Rarest Metal Mixture"); + provider.add("item.gtceu.tiny_platinum_sludge_residue_dust", "Tiny Pile of Platinum Sludge Residue"); provider.add("item.gtceu.small_platinum_sludge_residue_dust", "Small Pile of Platinum Sludge Residue"); provider.add("item.gtceu.platinum_sludge_residue_dust", "Platinum Sludge Residue"); + provider.add("item.gtceu.tiny_iridium_metal_residue_dust", "Tiny Pile of Iridium Metal Residue"); provider.add("item.gtceu.small_iridium_metal_residue_dust", "Small Pile of Iridium Metal Residue"); provider.add("item.gtceu.iridium_metal_residue_dust", "Iridium Metal Residue"); @@ -197,8 +235,11 @@ private static void initItemNames(RegistrateLangProvider provider) { } private static void initItemTooltips(RegistrateLangProvider provider) { - provider.add("item.gtceu.empty_mold.tooltip", "§7Raw Plate to make Molds and Extrude Shapes"); + // Nano Saber provider.add("item.gtceu.nano_saber.tooltip", "§7Ryujin no ken wo kurae!"); + + // Casting Molds + provider.add("item.gtceu.empty_mold.tooltip", "§7Raw Plate to make Molds and Extrude Shapes"); provider.add("item.gtceu.plate_casting_mold.tooltip", "§7Mold for making Plates"); provider.add("item.gtceu.casing_casting_mold.tooltip", "§7Mold for making Item Casings"); provider.add("item.gtceu.gear_casting_mold.tooltip", "§7Mold for making Gears"); @@ -213,6 +254,8 @@ private static void initItemTooltips(RegistrateLangProvider provider) { "§7Mold for naming Items in the Forming Press (rename Mold with Anvil)"); provider.add("item.gtceu.gear_casting_mold.small.tooltip", "§7Mold for making small Gears"); provider.add("item.gtceu.rotor_casting_mold.tooltip", "§7Mold for making Rotors"); + + // Extruder Shapes provider.add("item.gtceu.plate_extruder_mold.tooltip", "§7Extruder Shape for making Plates"); provider.add("item.gtceu.rod_extruder_mold.tooltip", "§7Extruder Shape for making Rods"); provider.add("item.gtceu.bolt_extruder_mold.tooltip", "§7Extruder Shape for making Bolts"); @@ -242,10 +285,16 @@ private static void initItemTooltips(RegistrateLangProvider provider) { provider.add("item.gtceu.foil_extruder_mold.tooltip", "§7Extruder Shape for making Foils from Non-Metals"); provider.add("item.gtceu.rod_long_extruder_mold.tooltip", "§7Extruder Shape for making Long Rods"); provider.add("item.gtceu.rotor_extruder_mold.tooltip", "§7Extruder Shape for making Rotors"); + provider.add("item.gtceu.empty_spray_can.tooltip", "§7Can be filled with sprays of various colors"); + provider.add("fluid_cell.empty", "Empty"); + + // Lighters provider.add("item.gtceu.tool.matchbox.tooltip", "§7This is not a Car"); provider.add("item.gtceu.tool.lighter.platinum.tooltip", "§7A known Prank Master is engraved on it"); + + // Batteries provider.add("item.gtceu.lv_battery_hull.tooltip", "§7An empty LV Battery Hull"); provider.add("item.gtceu.mv_battery_hull.tooltip", "§7An empty §bMV §7Battery Hull"); provider.add("item.gtceu.hv_battery_hull.tooltip", "§7An empty §6HV §7Battery Hull"); @@ -254,11 +303,15 @@ private static void initItemTooltips(RegistrateLangProvider provider) { provider.add("item.gtceu.luv_battery_hull.tooltip", "§7An empty §dLuV §7Battery Hull"); provider.add("item.gtceu.zpm_battery_hull.tooltip", "§7An empty §fZPM §7Battery Hull"); provider.add("item.gtceu.uv_battery_hull.tooltip", "§7An empty §3UV §7Battery Hull"); + + // Battery Behavior provider.add("item.gtceu.battery.charge_time", "§aHolds %s %s of Power (%s)"); provider.add("item.gtceu.battery.charge_detailed", "%s/%s EU§7 - Tier %s §7(%s/%s %s remaining§7)"); provider.add("item.gtceu.battery.charge_unit.second", "seconds"); provider.add("item.gtceu.battery.charge_unit.minute", "minutes"); provider.add("item.gtceu.battery.charge_unit.hour", "hours"); + + // Rechargeable Batteries provider.add("item.gtceu.ulv_tantalum_battery.tooltip", "§7Reusable Battery"); provider.add("item.gtceu.lv_cadmium_battery.tooltip", "§7Reusable Battery"); provider.add("item.gtceu.lv_lithium_battery.tooltip", "§7Reusable Battery"); @@ -274,6 +327,7 @@ private static void initItemTooltips(RegistrateLangProvider provider) { provider.add("item.gtceu.luv_vanadium_battery.tooltip", "§7Reusable Battery"); provider.add("item.gtceu.zpm_naquadria_battery.tooltip", "§7Reusable Battery"); provider.add("item.gtceu.uv_naquadria_battery.tooltip", "§7Reusable Battery"); + provider.add("item.gtceu.energy_crystal.tooltip", "§7Reusable Battery"); provider.add("item.gtceu.lapotron_crystal.tooltip", "§7Reusable Battery"); provider.add("item.gtceu.lapotronic_energy_orb.tooltip", "§7Reusable Battery"); @@ -281,18 +335,26 @@ private static void initItemTooltips(RegistrateLangProvider provider) { provider.add("item.gtceu.energy_module.tooltip", "§7Reusable Battery"); provider.add("item.gtceu.energy_cluster.tooltip", "§7Reusable Battery"); provider.add("item.gtceu.max_battery.tooltip", "§7Fill this to win Minecraft"); + + // Cover Tooltips provider.add("item.gtceu.electric.pump.tooltip", "§7Transfers §fFluids§7 at specific rates as §fCover§7."); provider.add("item.gtceu.fluid.regulator.tooltip", "§7Limits §fFluids§7 to specific quantities as §fCover§7."); provider.add("item.gtceu.conveyor.module.tooltip", "§7Transfers §fItems§7 at specific rates as §fCover§7."); provider.add("item.gtceu.robot.arm.tooltip", "§7Limits §fItems§7 to specific quantities as §fCover§7."); + + // Data Items provider.add("item.gtceu.data_stick.tooltip", "§7A Low Capacity Data Storage"); provider.add("item.gtceu.data_orb.tooltip", "§7A High Capacity Data Storage"); + + // Programmed Circuit multilineLang(provider, "item.gtceu.programmed_circuit.tooltip", "Use to open configuration GUI\nShift-Right-Click on a machine\nwith a circuit slot to set it to\nthis circuit's value."); provider.add("item.gtceu.circuit.integrated.gui", "§7Programmed Circuit Configuration"); + provider.add("item.int_circuit.configuration", "Configuration: %d"); // multilineLang(provider, "item.gtceu.circuit.integrated.jei_description", "JEI is only showing recipes for the // given configuration.\n\nYou can select a configuration in the Programmed Circuit configuration tab."); - provider.add("item.glass_lens", "Glass Lens (White)"); // todo move to material overrides + + // Boules provider.add("item.gtceu.silicon_boule.tooltip", "§7Raw Circuit"); provider.add("item.gtceu.phosphorus_boule.tooltip", "§7Raw Circuit"); provider.add("item.gtceu.naquadah_boule.tooltip", "§7Raw Circuit"); @@ -301,6 +363,8 @@ private static void initItemTooltips(RegistrateLangProvider provider) { provider.add("item.gtceu.phosphorus_wafer.tooltip", "§7Raw Circuit"); provider.add("item.gtceu.naquadah_wafer.tooltip", "§7Raw Circuit"); provider.add("item.gtceu.neutronium_wafer.tooltip", "§7Raw Circuit"); + + // Boards provider.add("item.gtceu.resin_circuit_board.tooltip", "§7A Coated Board"); provider.add("item.gtceu.phenolic_circuit_board.tooltip", "§7A Good Board"); provider.add("item.gtceu.plastic_circuit_board.tooltip", "§7A Good Board"); @@ -308,6 +372,7 @@ private static void initItemTooltips(RegistrateLangProvider provider) { provider.add("item.gtceu.fiber_reinforced_circuit_board.tooltip", "§7An Extreme Board"); provider.add("item.gtceu.multilayer_fiber_reinforced_circuit_board.tooltip", "§7An Elite Board"); provider.add("item.gtceu.wetware_circuit_board.tooltip", "§7The Board that keeps life"); + provider.add("item.gtceu.resin_printed_circuit_board.tooltip", "§7A Basic Circuit Board"); provider.add("item.gtceu.phenolic_printed_circuit_board.tooltip", "§7A Good Circuit Board"); provider.add("item.gtceu.plastic_printed_circuit_board.tooltip", "§7A Good Circuit Board"); @@ -316,22 +381,28 @@ private static void initItemTooltips(RegistrateLangProvider provider) { provider.add("item.gtceu.multilayer_fiber_reinforced_printed_circuit_board.tooltip", "§7An Elite Circuit Board"); provider.add("item.gtceu.wetware_printed_circuit_board.tooltip", "§7The Board that keeps life"); + + // Circuit Components multilineLang(provider, "item.gtceu.vacuum_tube.tooltip", "§7Technically a Diode\n§cULV-Tier"); provider.add("item.gtceu.diode.tooltip", "§7Basic Electronic Component"); provider.add("item.gtceu.resistor.tooltip", "§7Basic Electronic Component"); provider.add("item.gtceu.transistor.tooltip", "§7Basic Electronic Component"); provider.add("item.gtceu.capacitor.tooltip", "§7Basic Electronic Component"); provider.add("item.gtceu.inductor.tooltip", "§7A Small Coil"); + provider.add("item.gtceu.smd_diode.tooltip", "§7Electronic Component"); provider.add("item.gtceu.smd_capacitor.tooltip", "§7Electronic Component"); provider.add("item.gtceu.smd_transistor.tooltip", "§7Electronic Component"); provider.add("item.gtceu.smd_resistor.tooltip", "§7Electronic Component"); provider.add("item.gtceu.smd_inductor.tooltip", "§7Electronic Component"); + provider.add("item.gtceu.advanced_smd_diode.tooltip", "§7Advanced Electronic Component"); provider.add("item.gtceu.advanced_smd_capacitor.tooltip", "§7Advanced Electronic Component"); provider.add("item.gtceu.advanced_smd_transistor.tooltip", "§7Advanced Electronic Component"); provider.add("item.gtceu.advanced_smd_resistor.tooltip", "§7Advanced Electronic Component"); provider.add("item.gtceu.advanced_smd_inductor.tooltip", "§7Advanced Electronic Component"); + + // Wafers provider.add("item.gtceu.highly_advanced_soc_wafer.tooltip", "§7Raw Highly Advanced Circuit"); provider.add("item.gtceu.advanced_soc_wafer.tooltip", "§7Raw Advanced Circuit"); provider.add("item.gtceu.ilc_wafer.tooltip", "§7Raw Integrated Circuit"); @@ -355,6 +426,8 @@ private static void initItemTooltips(RegistrateLangProvider provider) { provider.add("item.gtceu.crystal_soc.tooltip", "§7Crystal System on Chip"); provider.add("item.gtceu.advanced_soc.tooltip", "§7Advanced System on Chip"); provider.add("item.gtceu.highly_advanced_soc.tooltip", "§7Highly Advanced System on Chip"); + + // Chips provider.add("item.gtceu.ilc_chip.tooltip", "§7Integrated Logic Circuit"); provider.add("item.gtceu.cpu_chip.tooltip", "§7Central Processing Unit"); provider.add("item.gtceu.hpic_chip.tooltip", "§7High Power IC"); @@ -369,16 +442,20 @@ private static void initItemTooltips(RegistrateLangProvider provider) { provider.add("item.gtceu.ram_chip.tooltip", "§7Random Access Memory"); provider.add("item.gtceu.soc.tooltip", "§7System on Chip"); provider.add("item.gtceu.simple_soc.tooltip", "§7Simple System on Chip"); + + // Circuits multilineLang(provider, "item.gtceu.basic_electronic_circuit.tooltip", "§7Your First Circuit\n§cLV-Tier Circuit"); multilineLang(provider, "item.gtceu.good_electronic_circuit.tooltip", "§7Your Second Circuit\n§cMV-Tier Circuit"); + multilineLang(provider, "item.gtceu.basic_integrated_circuit.tooltip", "§7Smaller and more powerful\n§6LV-Tier Circuit"); multilineLang(provider, "item.gtceu.good_integrated_circuit.tooltip", "§7Smaller and more powerful\n§6MV-Tier Circuit"); multilineLang(provider, "item.gtceu.advanced_integrated_circuit.tooltip", "§7Smaller and more powerful\n§6HV-Tier Circuit"); + multilineLang(provider, "item.gtceu.nand_chip.tooltip", "§7A Superior Simple Circuit\n§6ULV-Tier Circuit"); multilineLang(provider, "item.gtceu.microchip_processor.tooltip", "§7A Superior Basic Circuit\n§eLV-Tier Circuit"); @@ -390,11 +467,13 @@ private static void initItemTooltips(RegistrateLangProvider provider) { "§7Amazing Computation Speed!\n§eEV-Tier Circuit"); multilineLang(provider, "item.gtceu.micro_processor_mainframe.tooltip", "§7Amazing Computation Speed!\n§eIV-Tier Circuit"); + multilineLang(provider, "item.gtceu.nano_processor.tooltip", "§7Smaller than ever\n§bHV-Tier Circuit"); multilineLang(provider, "item.gtceu.nano_processor_assembly.tooltip", "§7Smaller than ever\n§bEV-Tier Circuit"); multilineLang(provider, "item.gtceu.nano_processor_computer.tooltip", "§7Smaller than ever\n§bIV-Tier Circuit"); multilineLang(provider, "item.gtceu.nano_processor_mainframe.tooltip", "§7Smaller than ever\n§bLuV-Tier Circuit"); + multilineLang(provider, "item.gtceu.quantum_processor.tooltip", "§7Quantum Computing comes to life!\n§aEV-Tier Circuit"); multilineLang(provider, "item.gtceu.quantum_processor_assembly.tooltip", @@ -403,6 +482,7 @@ private static void initItemTooltips(RegistrateLangProvider provider) { "§7Quantum Computing comes to life!\n§aLuV-Tier Circuit"); multilineLang(provider, "item.gtceu.quantum_processor_mainframe.tooltip", "§7Quantum Computing comes to life!\n§aZPM-Tier Circuit"); + multilineLang(provider, "item.gtceu.crystal_processor.tooltip", "§7Taking Advantage of Crystal Engraving\n§9IV-Tier Circuit"); multilineLang(provider, "item.gtceu.crystal_processor_assembly.tooltip", @@ -411,6 +491,7 @@ private static void initItemTooltips(RegistrateLangProvider provider) { "§7Taking Advantage of Crystal Engraving\n§9ZPM-Tier Circuit"); multilineLang(provider, "item.gtceu.crystal_processor_mainframe.tooltip", "§7Taking Advantage of Crystal Engraving\n§9UV-Tier Circuit"); + multilineLang(provider, "item.gtceu.wetware_processor.tooltip", "§7You have a feeling like it's watching you\n§4LuV-Tier Circuit"); multilineLang(provider, "item.gtceu.wetware_processor_assembly.tooltip", @@ -419,14 +500,13 @@ private static void initItemTooltips(RegistrateLangProvider provider) { "§7Ultimate fusion of Flesh and Machine\n§4UV-Tier Circuit"); multilineLang(provider, "item.gtceu.wetware_processor_mainframe.tooltip", "§7The best Man has ever seen\n§4UHV-Tier Circuit"); - provider.add("item.gtceu.stem_cells.tooltip", "§7Raw Intelligence"); - provider.add("item.gtceu.neuro_processing_unit.tooltip", "§7Neuro CPU"); - provider.add("item.gtceu.petri_dish.tooltip", "§7For cultivating Cells"); - provider.add("item.gtceu.neutron_reflector.tooltip", "§7Indestructible"); - provider.add("item.gtceu.duct_tape.tooltip", "§7If you can't fix it with this, use more of it!"); + + // Stars provider.add("item.gtceu.quantum_eye.tooltip", "§7Improved Ender Eye"); provider.add("item.gtceu.quantum_star.tooltip", "§7Improved Nether Star"); provider.add("item.gtceu.gravi_star.tooltip", "§7Ultimate Nether Star"); + + // Filters multilineLang(provider, "item.gtceu.item_filter.tooltip", "§7Filters §fItem§7 I/O as §fCover§7.\nCan be used as a §fConveyor Module§7 and §fRobotic Arm§7 upgrade."); multilineLang(provider, "item.gtceu.item_tag_filter.tooltip", @@ -474,20 +554,40 @@ private static void initItemTooltips(RegistrateLangProvider provider) { "§7Fills attached containers with §9Water§7 as §fCover§7."); provider.add("item.gtceu.ender_fluid_link_cover.tooltip", "§7Transports §fFluids§7 with a §fWireless §dEnder§f Connection§7 as §fCover§7."); + + // Misc Items provider.add("item.gtceu.gelled_toluene.tooltip", "§7Raw Explosive"); provider.add("item.gtceu.bottle.purple.drink.tooltip", "§7How about Lemonade. Or some Ice Tea? I got Purple Drink!"); multilineLang(provider, "item.gtceu.foam_sprayer.tooltip", "§7Sprays Construction Foam\nUse on a frame to foam connected frames\nFoam can be colored"); provider.add("item.gtceu.firebrick.tooltip", "§7Heat resistant"); + provider.add("item.gtceu.basic_tape.tooltip", "§7Not strong enough for mechanical issues\nCan be used to pick up crates without dropping their items"); + provider.add("item.gtceu.duct_tape.tooltip", "§7If you can't fix it with this, use more of it!"); + + provider.add("item.gtceu.stem_cells.tooltip", "§7Raw Intelligence"); + provider.add("item.gtceu.neuro_processing_unit.tooltip", "§7Neuro CPU"); + provider.add("item.gtceu.petri_dish.tooltip", "§7For cultivating Cells"); + provider.add("item.gtceu.neutron_reflector.tooltip", "§7Indestructible"); + provider.add("item.gtceu.blacklight.tooltip", "Long-Wave §dUltraviolet§7 light source"); + + provider.add("item.gtceu.nan_certificate.tooltip", "Challenge Accepted!"); + + // Turbines + provider.add("item.gtceu.turbine_rotor.tooltip", "Turbine Rotors for your power station"); + + // Terminal provider.add("item.gtceu.terminal.tooltip", "Shift + R-Click on a controller to automatically build the multi-block"); + provider.add("item.terminal.tooltip", "Sharp tools make good work"); + provider.add("item.terminal.tooltip.creative", "§bCreative Mode"); + provider.add("item.terminal.tooltip.hardware", "§aHardware: %d"); // Records - provider.add("item.gtceu.sus_record.desc", "§7sussy!"); - provider.add("item.record.sus.tooltip", "§7Leonz - Among Us Drip"); + provider.add("item.gtceu.sus_record.tooltip", "§7sussy!"); + provider.add("item.gtceu.sus_record.desc", "§7Leonz - Among Us Drip"); // Voltage Coils provider.add("item.gtceu.ulv_voltage_coil.tooltip", "Primitive Coil"); @@ -506,21 +606,10 @@ private static void initItemTooltips(RegistrateLangProvider provider) { provider.add("item.gtceu.opv_voltage_coil.tooltip", "Legendary Coil"); provider.add("item.gtceu.max_voltage_coil.tooltip", "Maximum Coil"); - provider.add("item.int_circuit.configuration", "Configuration: %d"); - - provider.add("item.gtceu.nan_certificate.tooltip", "Challenge Accepted!"); - provider.add("item.gtceu.blacklight.tooltip", "Long-Wave §dUltraviolet§7 light source"); - + // Clipboard provider.add("item.clipboard.tooltip", "Can be written on (without any writing Instrument). Right-click on Wall to place, and Shift-Right-Click to remove"); - provider.add("item.gtceu.turbine_rotor.tooltip", "Turbine Rotors for your power station"); - - // Terminal - provider.add("item.terminal.tooltip", "Sharp tools make good work"); - provider.add("item.terminal.tooltip.creative", "§bCreative Mode"); - provider.add("item.terminal.tooltip.hardware", "§aHardware: %d"); - provider.add("item.generic.fluid_container.tooltip", "%d/%dL %s"); // General Electric Tools @@ -532,23 +621,30 @@ private static void initItemTooltips(RegistrateLangProvider provider) { } public static void generateBehaviorKeys(RegistrateLangProvider provider) { + // Item Behaviors provider.add("behaviour.hoe", "Can till dirt"); provider.add("behaviour.soft_hammer", "Activates and Deactivates Machines"); provider.add("behaviour.soft_hammer.enabled", "Working Enabled"); provider.add("behaviour.soft_hammer.disabled", "Working Disabled"); provider.add("behaviour.soft_hammer.idle_after_cycle", "Pause machine after current cycle"); + provider.add("behaviour.lighter.tooltip.description", "Can light things on fire"); provider.add("behaviour.lighter.tooltip.usage", "Shift-right click to open/close"); provider.add("behaviour.lighter.fluid.tooltip", "Can light things on fire with Butane or Propane"); provider.add("behaviour.lighter.uses", "Remaining uses: %d"); + provider.add("behavior.toggle_energy_consumer.tooltip", "Use to toggle mode"); provider.add("behaviour.hammer", "Turns on and off Muffling for Machines (by hitting them)"); provider.add("behaviour.wrench", "Rotates Blocks on Rightclick"); + + // Susso provider.add("behaviour.boor.by", "by %s"); + + // Magnet provider.add("behavior.item_magnet.enabled", "§aMagnetic Field Enabled"); provider.add("behavior.item_magnet.disabled", "§cMagnetic Field Disabled"); - // Wrench configuration + // Wrench Configuration provider.add("item.machine_configuration.mode", "§aConfiguration Mode:§r %s"); provider.add("gtceu.mode.fluid", "§9Fluid§r"); provider.add("gtceu.mode.item", "§6Item§r"); @@ -574,6 +670,7 @@ public static void generateBehaviorKeys(RegistrateLangProvider provider) { provider.add("behaviour.paintspray.black.tooltip", "Can paint things in Black"); provider.add("behaviour.paintspray.uses", "Remaining Uses: %d"); + // Copy/Paste Configuration provider.add("behaviour.meta.machine.config.copy.tooltip", "§7Sneak + R-Click to copy machine configuration"); provider.add("behaviour.meta.machine.config.paste.tooltip", "§7R-Click to paste machine configuration"); provider.add("behaviour.setting.allow.input.from.output.tooltip", "%s input from output side is %s"); @@ -592,19 +689,24 @@ public static void generateBehaviorKeys(RegistrateLangProvider provider) { provider.add("behavior.prospector.not_enough_energy", "Not Enough Energy!"); provider.add("behavior.prospector.added_waypoint", "Created waypoint named %s!"); - // Portable scanner + // Portable Scanner provider.add("item.tricorder_scanner.tooltip", "Tricorder"); provider.add("item.debug_scanner.tooltip", "Tricorder"); + provider.add("behavior.portable_scanner.bedrock_fluid.amount", "Fluid In Deposit: %s %s - %s%%"); provider.add("behavior.portable_scanner.bedrock_fluid.amount_unknown", "Fluid In Deposit: %s%%"); provider.add("behavior.portable_scanner.bedrock_fluid.nothing", "Fluid In Deposit: §6Nothing§r"); + provider.add("behavior.portable_scanner.environmental_hazard", "Environmental Hazard In Chunk: %s§r - %s ppm"); provider.add("behavior.portable_scanner.environmental_hazard.nothing", "Environmental Hazard In Chunk: §6Nothing§r"); + provider.add("behavior.portable_scanner.local_hazard", "Local Hazard In Area: %s§r - %s ppm"); provider.add("behavior.portable_scanner.local_hazard.nothing", "Local Hazard In Area: §6Nothing§r"); + provider.add("behavior.portable_scanner.block_hardness", "Hardness: %s Blast Resistance: %s"); provider.add("behavior.portable_scanner.block_name", "Name: %s MetaData: %s"); + provider.add("behavior.portable_scanner.debug_cpu_load", "Average CPU load of ~%sns over %s ticks with worst time of %sns."); provider.add("behavior.portable_scanner.debug_cpu_load_seconds", "This is %s seconds."); @@ -615,36 +717,47 @@ public static void generateBehaviorKeys(RegistrateLangProvider provider) { provider.add("behavior.portable_scanner.debug_machine_invalid_null=invalid! MetaTileEntity =", " null!"); provider.add("behavior.portable_scanner.debug_machine_valid", " valid"); + provider.add("behavior.portable_scanner.divider", "========================="); + provider.add("behavior.portable_scanner.energy_container_in", "Max IN: %s (%s) EU at %s A"); provider.add("behavior.portable_scanner.energy_container_out", "Max OUT: %s (%s) EU at %s A"); provider.add("behavior.portable_scanner.energy_container_storage", "Energy: %s EU / %s EU"); + provider.add("behavior.portable_scanner.eu_per_sec", "Average (last second): %s EU/t"); provider.add("behavior.portable_scanner.amp_per_sec", "Average (last second): %s A"); provider.add("behavior.portable_scanner.machine_disabled", "Disabled."); + provider.add("behavior.portable_scanner.machine_front_facing", "Front Facing: %s"); + provider.add("behavior.portable_scanner.machine_upwards_facing", "Upwards Facing: %s"); + provider.add("behavior.portable_scanner.machine_ownership", "§2Machine Owner Type: %s§r"); provider.add("behavior.portable_scanner.guild_name", "§2Guild Name: %s§r"); provider.add("behavior.portable_scanner.team_name", "§2Team Name: %s§r"); provider.add("behavior.portable_scanner.player_name", "§2Player Name: %s§r, §7Player Online: %s§r"); + provider.add("behavior.portable_scanner.machine_power_loss", "Shut down due to power loss."); provider.add("behavior.portable_scanner.machine_progress", "Progress/Load: %s / %s"); - provider.add("behavior.portable_scanner.machine_upwards_facing", "Upwards Facing: %s"); + provider.add("behavior.portable_scanner.muffled", "Muffled."); + provider.add("behavior.portable_scanner.multiblock_energy_input", "Max Energy Income: %s EU/t Tier: %s"); provider.add("behavior.portable_scanner.multiblock_energy_output", "Max Energy Output: %s EU/t Tier: %s"); provider.add("behavior.portable_scanner.multiblock_maintenance", "Problems: %s"); provider.add("behavior.portable_scanner.multiblock_parallel", "Multi Processing: %s"); + provider.add("behavior.portable_scanner.position", "----- X: %s Y: %s Z: %s D: %s -----"); provider.add("behavior.portable_scanner.state", "%s: %s"); provider.add("behavior.portable_scanner.tank", "Tank %s: %s mB / %s mB %s"); provider.add("behavior.portable_scanner.tanks_empty", "All Tanks Empty"); + provider.add("behavior.portable_scanner.workable_consumption", "Probably Uses: %s EU/t at %s A"); provider.add("behavior.portable_scanner.workable_production", "Probably Produces: %s EU/t at %s A"); provider.add("behavior.portable_scanner.workable_progress", "Progress: %s s / %s s"); provider.add("behavior.portable_scanner.workable_stored_energy", "Stored Energy: %s EU / %s EU"); + provider.add("behavior.portable_scanner.mode.caption", "Display mode: %s"); provider.add("behavior.portable_scanner.mode.show_all_info", "Show all info"); provider.add("behavior.portable_scanner.mode.show_block_info", "Show block info"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java index 806d8291a02..9ba52bc4047 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java @@ -26,6 +26,7 @@ private static void generateCustomMaterialNames(RegistrateLangProvider provider) replace(provider, FullersEarth.getUnlocalizedName(), "Fuller's Earth"); // greg's humor is now on 1.20.1... replace(provider, Cooperite.getUnlocalizedName(), "Sheldonite"); + replace(provider, HSSG.getUnlocalizedName(), "HSS-G"); replace(provider, HSSE.getUnlocalizedName(), "HSS-E"); replace(provider, HSSS.getUnlocalizedName(), "HSS-S"); @@ -35,8 +36,10 @@ private static void generateCustomMaterialNames(RegistrateLangProvider provider) replace(provider, UUMatter.getUnlocalizedName(), "UU-Matter"); replace(provider, PCBCoolant.getUnlocalizedName(), "PCB Coolant"); replace(provider, TungstenSteel.getUnlocalizedName(), "Tungstensteel"); + replace(provider, Iron3Chloride.getUnlocalizedName(), "Iron III Chloride"); replace(provider, Iron2Chloride.getUnlocalizedName(), "Iron II Chloride"); + replace(provider, OilHeavy.getUnlocalizedName(), "Heavy Oil"); replace(provider, "block.gtceu.oil_heavy", "Heavy Oil"); replace(provider, OilLight.getUnlocalizedName(), "Light Oil"); @@ -52,6 +55,7 @@ private static void generateCustomMaterialNames(RegistrateLangProvider provider) replace(provider, HydroCrackedEthylene.getUnlocalizedName(), "Hydro-Cracked Ethylene"); replace(provider, HydroCrackedPropane.getUnlocalizedName(), "Hydro-Cracked Propane"); replace(provider, HydroCrackedPropene.getUnlocalizedName(), "Hydro-Cracked Propene"); + replace(provider, SteamCrackedButadiene.getUnlocalizedName(), "Steam-Cracked Butadiene"); replace(provider, SteamCrackedButane.getUnlocalizedName(), "Steam-Cracked Butane"); replace(provider, SteamCrackedButene.getUnlocalizedName(), "Steam-Cracked Butene"); @@ -60,6 +64,7 @@ private static void generateCustomMaterialNames(RegistrateLangProvider provider) replace(provider, SteamCrackedEthylene.getUnlocalizedName(), "Steam-Cracked Ethylene"); replace(provider, SteamCrackedPropane.getUnlocalizedName(), "Steam-Cracked Propane"); replace(provider, SteamCrackedPropene.getUnlocalizedName(), "Steam-Cracked Propene"); + replace(provider, LightlyHydroCrackedGas.getUnlocalizedName(), "Lightly Hydro-Cracked Gas"); replace(provider, LightlyHydroCrackedHeavyFuel.getUnlocalizedName(), "Lightly Hydro-Cracked Heavy Fuel"); @@ -74,6 +79,7 @@ private static void generateCustomMaterialNames(RegistrateLangProvider provider) "Lightly Steam-Cracked Light Fuel"); replace(provider, LightlySteamCrackedNaphtha.getUnlocalizedName(), "Lightly Steam-Cracked Naphtha"); + replace(provider, SeverelyHydroCrackedGas.getUnlocalizedName(), "Severely Hydro-Cracked Gas"); replace(provider, SeverelyHydroCrackedHeavyFuel.getUnlocalizedName(), @@ -97,14 +103,13 @@ private static void generateCustomMaterialNames(RegistrateLangProvider provider) replace(provider, Stellite100.getUnlocalizedName(), "Stellite-100"); replace(provider, HastelloyC276.getUnlocalizedName(), "Hastelloy C-276"); - provider.add("item.netherrack_nether_quartz", "Nether Quartz Ore"); - - provider.add("fluid.empty", "Empty"); - provider.add("fluid.tile.lava", "Lava"); - provider.add("fluid.tile.water", "Water"); + // replace(provider, GTMaterialBlocks.MATERIAL_BLOCKS.get(TagPrefix.oreNetherrack, + // NetherQuartz).get().getDescriptionId(), "Nether Quartz Ore"); + replace(provider, "item.gtceu.nether_quartz_netherrack", "Nether Quartz Ore"); } private static void generateFluidKeys(RegistrateLangProvider provider) { + // Fluid Types provider.add("fluid.gtceu.liquid_generic", "Liquid %s"); provider.add("fluid.gtceu.generic", "%s"); provider.add("fluid.gtceu.gas_generic", "%s Gas"); @@ -112,7 +117,7 @@ private static void generateFluidKeys(RegistrateLangProvider provider) { provider.add("fluid.gtceu.plasma", "%s Plasma"); provider.add("fluid.gtceu.molten", "Molten %s"); - // ui + // Fluid Widgets provider.add("fluid.gtceu.empty", "Empty"); provider.add("fluid.gtceu.amount", "§9Amount: %d/%d mB"); provider.add("fluid.gtceu.click_to_fill", @@ -122,20 +127,27 @@ private static void generateFluidKeys(RegistrateLangProvider provider) { provider.add("fluid.gtceu.click_to_empty", "§7Click with a Fluid Container to §cempty §7the tank (Shift-click for a full stack)."); - // tooltips + // Fluid Tooltips provider.add("fluid.gtceu.tooltip.temperature", "§cTemperature: %d K"); provider.add("fluid.gtceu.tooltip.cryogenic", "§bCryogenic! Handle with care!"); provider.add("fluid.gtceu.tooltip.gas", "§aState: Gaseous"); provider.add("fluid.gtceu.tooltip.liquid", "§aState: Liquid"); provider.add("fluid.gtceu.tooltip.plasma", "§aState: Plasma"); provider.add("fluid.gtceu.tooltip.acid", "§6Acidic! Handle with care!"); + + // Fluid Tiles? + provider.add("fluid.empty", "Empty"); + provider.add("fluid.tile.lava", "Lava"); + provider.add("fluid.tile.water", "Water"); } private static void generateMaterialKeys(RegistrateLangProvider provider) { + // Material Page provider.add("gtceu.jei.materials.average_mass", "Average mass: %d"); provider.add("gtceu.jei.materials.average_protons", "Average protons: %d"); provider.add("gtceu.jei.materials.average_neutrons", "Average neutrons: %d"); + // Cauldron Washing provider.add("item.dust.tooltip.purify", "Right click a Cauldron to get clean Dust"); provider.add("item.crushed.tooltip.purify", "Right click a Cauldron to get Purified Ore"); } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java index 3f371c9315c..5afea946a69 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java @@ -13,50 +13,65 @@ public static void init(RegistrateLangProvider provider) { } private static void generateRecipeConditions(RegistrateLangProvider provider) { + // Recipe Conditions provider.add("recipe.condition.thunder.tooltip", "Thunder Level: %d"); provider.add("recipe.condition.rain.tooltip", "Rain Level: %d"); provider.add("recipe.condition.dimension.tooltip", "Dimension: %s"); provider.add("recipe.condition.dimension_marker.tooltip", "Dimension:"); provider.add("recipe.condition.biome.tooltip", "Biome: %s"); provider.add("recipe.condition.pos_y.tooltip", "Y Level: %d <= Y <= %d"); + provider.add("recipe.condition.steam_vent.tooltip", "Clean steam vent"); provider.add("recipe.condition.rock_breaker.tooltip", "Fluid blocks around"); provider.add("recipe.condition.adjacent_block.tooltip", "Blocks around"); provider.add("recipe.condition.eu_to_start.tooltip", "EU to Start: %d%s"); + provider.add("recipe.condition.daytime.day.tooltip", "Requires day time to work"); provider.add("recipe.condition.daytime.night.tooltip", "Requires night time to work"); + provider.add("recipe.condition.gamestage.unlocked_stage", "Unlocked at stage: %s"); provider.add("recipe.condition.gamestage.locked_stage", "Locked at stage: %s"); + provider.add("recipe.condition.quest.completed.tooltip", "Requires %s completed"); provider.add("recipe.condition.quest.not_completed.tooltip", "Requires %s not completed"); } private static void generateRecipeDataKeys(RegistrateLangProvider provider) { + // Recipe Data provider.add("gtceu.recipe.total", "Total: %s EU"); provider.add("gtceu.recipe.max_eu", "Max. EU: %s EU"); provider.add("gtceu.recipe.eu", "Usage: %s EU/t"); provider.add("gtceu.recipe.eu_inverted", "Generation: %s EU/t"); + provider.add("gtceu.recipe.duration", "Duration: %s secs"); provider.add("gtceu.recipe.amperage", "Amperage: %s"); + provider.add("gtceu.recipe.not_consumed", "Does not get consumed in the process"); provider.add("gtceu.recipe.chance", "Chance: %s +%s/tier"); + provider.add("gtceu.recipe.temperature", "Temp: %sK"); provider.add("gtceu.recipe.coil.tier", "Coil: %s"); + provider.add("gtceu.recipe.explosive", "Explosive: %s"); provider.add("gtceu.recipe.eu_to_start", "EU To Start: %sEU%s"); provider.add("gtceu.recipe.dimensions", "Dimensions: %s"); - provider.add("gtceu.recipe.cleanroom", "Requires %s"); + provider.add("gtceu.recipe.environmental_hazard.reverse", "§cArea must be free of %s"); provider.add("gtceu.recipe.environmental_hazard", "§cArea must have %s"); + + provider.add("gtceu.recipe.cleanroom", "Requires %s"); provider.add("gtceu.recipe.cleanroom.display_name", "Cleanroom"); provider.add("gtceu.recipe.cleanroom_sterile.display_name", "Sterile Cleanroom"); + provider.add("gtceu.recipe.research", "Requires Research"); provider.add("gtceu.recipe.scan_for_research", "Scan for Assembly Line"); + provider.add("gtceu.recipe.computation_per_tick", "Min. Computation: %s CWU/t"); provider.add("gtceu.recipe.total_computation", "Computation: %s CWU"); } private static void generateMiscKeys(RegistrateLangProvider provider) { + // IO provider.add("gtceu.io.import", "Import"); provider.add("gtceu.io.export", "Export"); provider.add("gtceu.io.both", "Both"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/SubtitleLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/SubtitleLang.java index af126ee0675..f0bcbbe89f7 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/SubtitleLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/SubtitleLang.java @@ -12,18 +12,14 @@ public static void init(RegistrateLangProvider provider) { private static void generateSubtitleKeys(RegistrateLangProvider provider) { // Subtitles + // Machines provider.add("subtitles.gtceu.boiler", "Boiler heating"); provider.add("subtitles.gtceu.computation", "Computer beeps"); provider.add("subtitles.gtceu.assembler", "Assembler constructing"); - provider.add("subtitles.gtceu.chainsaw", "Chainsaw revving"); provider.add("subtitles.gtceu.compressor", "Compressor squeezing"); provider.add("subtitles.gtceu.centrifuge", "Centrifuge spinning"); - provider.add("subtitles.gtceu.mortar", "Mortar crushing"); - provider.add("subtitles.gtceu.screwdriver", "Screwing"); - provider.add("subtitles.gtceu.saw", "Sawing"); provider.add("subtitles.gtceu.miner", "Miner excavating"); provider.add("subtitles.gtceu.turbine", "Turbine whizzing"); - provider.add("subtitles.gtceu.wrench", "Wrench rattling"); provider.add("subtitles.gtceu.portal_opening", "Portal opens"); provider.add("subtitles.gtceu.replicator", "Replicator copying"); provider.add("subtitles.gtceu.arc", "Arcs buzzing"); @@ -31,11 +27,15 @@ private static void generateSubtitleKeys(RegistrateLangProvider provider) { provider.add("subtitles.gtceu.portable_scanner", "Scanning"); provider.add("subtitles.gtceu.macerator", "Macerator crushing"); provider.add("subtitles.gtceu.jet_engine", "Jet roaring"); - provider.add("subtitles.gtceu.spray_can", "Spraying"); provider.add("subtitles.gtceu.mixer", "Mixer sloshing"); provider.add("subtitles.gtceu.fire", "Fire crackling"); provider.add("subtitles.gtceu.forge_hammer", "Forge Hammer thumping"); provider.add("subtitles.gtceu.bath", "Bath fizzing"); + provider.add("subtitles.gtceu.furnace", "Furnace heating"); + provider.add("subtitles.gtceu.electrolyzer", "Electrolyzer sparking"); + provider.add("subtitles.gtceu.cooling", "Freezer humming"); + + // Crafting Tools provider.add("subtitles.gtceu.soft_hammer", "Soft tap"); provider.add("subtitles.gtceu.wirecutter", "Wire snipped"); provider.add("subtitles.gtceu.chemical", "Chemical bubbling"); @@ -44,10 +44,15 @@ private static void generateSubtitleKeys(RegistrateLangProvider provider) { provider.add("subtitles.gtceu.motor", "Motor humming"); provider.add("subtitles.gtceu.drill", "Drilling"); provider.add("subtitles.gtceu.cut", "Cutter whirring"); - provider.add("subtitles.gtceu.furnace", "Furnace heating"); - provider.add("subtitles.gtceu.electrolyzer", "Electrolyzer sparking"); - provider.add("subtitles.gtceu.cooling", "Freezer humming"); provider.add("subtitles.gtceu.plunger", "Plunger popping"); + provider.add("subtitles.gtceu.mortar", "Mortar crushing"); + provider.add("subtitles.gtceu.screwdriver", "Screwing"); + provider.add("subtitles.gtceu.saw", "Sawing"); + provider.add("subtitles.gtceu.chainsaw", "Chainsaw revving"); + provider.add("subtitles.gtceu.wrench", "Wrench rattling"); + + provider.add("subtitles.gtceu.spray_can", "Spraying"); + provider.add("subtitles.gtceu.sus", "Sus..."); provider.add("subtitles.gtceu.science", "s c i e n c e"); provider.add("subtitles.gtceu.metal_pipe", "Destruction_Metal_Pole_L_Wave_2_0_0.wav"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java index 3106ec3ae49..80aba6d2a6e 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java @@ -18,6 +18,7 @@ public static void init(RegistrateLangProvider provider) { } private static void initDeathMessages(RegistrateLangProvider provider) { + // Death Messages provider.add("death.attack.gtceu.heat", "%s was boiled alive"); provider.add("death.attack.gtceu.frost", "%s explored cryogenics"); provider.add("death.attack.gtceu.chemical", "%s had a chemical accident"); @@ -44,6 +45,7 @@ private static void initDeathMessages(RegistrateLangProvider provider) { provider.add("death.attack.gtceu.scythe", "%s had their soul taken by %s"); provider.add("death.attack.gtceu.knife", "%s was gently poked by %s"); provider.add("death.attack.gtceu.butchery_knife", "%s was butchered by %s"); + provider.add("death.attack.gtceu.drill_lv", "%s was drilled with 32V by %s"); provider.add("death.attack.gtceu.drill_mv", "%s was drilled with 128V by %s"); provider.add("death.attack.gtceu.drill_hv", "%s was drilled with 512V by %s"); @@ -56,6 +58,7 @@ private static void initDeathMessages(RegistrateLangProvider provider) { provider.add("death.attack.gtceu.buzzsaw", "%s got buzzed by %s"); provider.add("death.attack.gtceu.screwdriver_lv", "%s had their screws removed by %s"); + // Medical Deaths provider.add("death.attack.gtceu.medical_condition.asbestosis", "%s got mesothelioma"); provider.add("death.attack.gtceu.medical_condition.chemical_burns", "%s had a chemical accident"); provider.add("death.attack.gtceu.medical_condition.poison", @@ -75,6 +78,7 @@ private static void initDeathMessages(RegistrateLangProvider provider) { } public static void generateToolClassKeys(RegistrateLangProvider provider) { + // Tool Names provider.add("tool.gtceu.class.sword", "Sword"); provider.add("tool.gtceu.class.pickaxe", "Pickaxe"); provider.add("tool.gtceu.class.shovel", "Shovel"); @@ -101,6 +105,7 @@ public static void generateToolClassKeys(RegistrateLangProvider provider) { } public static void generateBehaviorKeys(RegistrateLangProvider provider) { + // Generic Tool Behaviors provider.add("tool.gtceu.behavior.silk_ice", "§bIce Cutter: §fSilk Harvests Ice"); provider.add("tool.gtceu.behavior.torch_place", "§eSpelunker: §fPlaces Torches on Right-Click"); provider.add("tool.gtceu.behavior.tree_felling", "§4Lumberjack: §fTree Felling"); @@ -123,14 +128,14 @@ public static void generateBehaviorKeys(RegistrateLangProvider provider) { provider.add("item.gtceu.tool.aoe.columns", "Columns"); provider.add("item.gtceu.tool.aoe.layers", "Layers"); - // mode switching + // Wrench Mode Switch provider.add("item.behavior.mode_switch.tooltip", "Use while sneaking to switch mode"); provider.add("item.behavior.mode_switch.mode_switched", "§eMode Set to: %s"); provider.add("item.behavior.mode_switch.current_mode", "Mode: %s"); } public static void generateToolKeys(RegistrateLangProvider provider) { - // tool names + // Tool Names replace(provider, "item.gtceu.tool.sword", "%s Sword"); replace(provider, "item.gtceu.tool.pickaxe", "%s Pickaxe"); replace(provider, "item.gtceu.tool.shovel", "%s Shovel"); @@ -151,27 +156,36 @@ public static void generateToolKeys(RegistrateLangProvider provider) { replace(provider, "item.gtceu.tool.butchery_knife", "%s Butchery Knife"); replace(provider, "item.gtceu.tool.scythe", "%s Scythe"); replace(provider, "item.gtceu.tool.rolling_pin", "%s Rolling Pin"); + replace(provider, "item.gtceu.tool.lv_drill", "%s Drill (LV)"); replace(provider, "item.gtceu.tool.mv_drill", "%s Drill (MV)"); replace(provider, "item.gtceu.tool.hv_drill", "%s Drill (HV)"); replace(provider, "item.gtceu.tool.ev_drill", "%s Drill (EV)"); replace(provider, "item.gtceu.tool.iv_drill", "%s Drill (IV)"); + replace(provider, "item.gtceu.tool.lv_wirecutter", "%s Wire Cutter (LV)"); replace(provider, "item.gtceu.tool.hv_wirecutter", "%s Wire Cutter (HV)"); replace(provider, "item.gtceu.tool.iv_wirecutter", "%s Wire Cutter (IV)"); + replace(provider, "item.gtceu.tool.mining_hammer", "%s Mining Hammer"); replace(provider, "item.gtceu.tool.spade", "%s Spade"); + replace(provider, "item.gtceu.tool.lv_chainsaw", "%s Chainsaw (LV)"); replace(provider, "item.gtceu.tool.mv_chainsaw", "%s Chainsaw (MV)"); replace(provider, "item.gtceu.tool.hv_chainsaw", "%s Chainsaw (HV)"); + replace(provider, "item.gtceu.tool.lv_wrench", "%s Wrench (LV)"); replace(provider, "item.gtceu.tool.hv_wrench", "%s Wrench (HV)"); replace(provider, "item.gtceu.tool.iv_wrench", "%s Wrench (IV)"); + replace(provider, "item.gtceu.tool.buzzsaw", "%s Buzzsaw (LV)"); replace(provider, "item.gtceu.tool.lv_screwdriver", "%s Screwdriver (LV)"); replace(provider, "item.gtceu.tool.plunger", "%s Plunger"); replace(provider, "item.gtceu.tool.shears", "%s Shears"); + } + public static void generateTooltips(RegistrateLangProvider provider) { + // Tool Tooltips provider.add("item.gtceu.tool.hammer.tooltip", "§8Crushes Blocks when harvesting them"); multilineLang(provider, "item.gtceu.tool.mallet.tooltip", "§8Sneak to Pause Machine After Current Recipe.\n§8Stops/Starts Machines"); @@ -189,9 +203,8 @@ public static void generateToolKeys(RegistrateLangProvider provider) { provider.add("item.gtceu.tool.buzzsaw.tooltip", "§8Not suitable for harvesting Blocks"); provider.add("item.gtceu.tool.lv_screwdriver.tooltip", "§8Adjusts Covers and Machines"); provider.add("item.gtceu.tool.plunger.tooltip", "§8Removes Fluids from Machines"); - } - public static void generateTooltips(RegistrateLangProvider provider) { + // Tool Stats Tooltips provider.add("tool.gtceu.crafting_uses.tooltip", "%s §aCrafting Uses"); provider.add("tool.gtceu.max_uses.tooltip", "%s §eTotal Durability"); provider.add("tool.gtceu.general_uses.tooltip", "%s §bDurability"); @@ -206,7 +219,9 @@ public static void generateTooltips(RegistrateLangProvider provider) { } public static void generateActionKeys(RegistrateLangProvider provider) { + // Tool Actions? provider.add("gtceu.tool_action.show_tooltips", "Hold SHIFT to show Tool Info"); + provider.add("gtceu.tool_action.screwdriver.auto_output_covers", "§8Use Screwdriver to Allow Input from Output Side or access Covers"); provider.add("gtceu.tool_action.screwdriver.toggle_mode_covers", @@ -216,18 +231,24 @@ public static void generateActionKeys(RegistrateLangProvider provider) { "§8Use Screwdriver to toggle Item collapsing"); provider.add("gtceu.tool_action.screwdriver.auto_output", "§8Use Screwdriver to toggle Auto-Output"); provider.add("gtceu.tool_action.screwdriver.toggle_mode", "§8Use Screwdriver to toggle Modes"); + provider.add("gtceu.tool_action.wrench.set_facing", "§8Use Wrench to set Facing"); provider.add("gtceu.tool_action.wrench.connect", "§8Use Wrench to set Connections, sneak to block Connections"); + provider.add("gtceu.tool_action.wire_cutter.connect", "§8Use Wire Cutters to set Connections"); + provider.add("gtceu.tool_action.soft_mallet.reset", "§8Use Soft Mallet to toggle Working"); provider.add("gtceu.tool_action.soft_mallet.toggle_mode", "§8Use Soft Mallet to toggle Modes"); + provider.add("gtceu.tool_action.hammer", "§8Use Hard Hammer to muffle Sounds"); provider.add("gtceu.tool_action.crowbar", "§8Use Crowbar to remove Covers"); + provider.add("gtceu.tool_action.tape", "§8Use Tape to fix Maintenance Problems"); } private static void generateToolInfoKeys(RegistrateLangProvider provider) { + // Tool Material Information provider.add("item.tool.tooltip.primary_material", "§fMaterial: §e%s"); provider.add("item.tool.tooltip.durability", "§fDurability: §a%d / %d"); provider.add("item.tool.tooltip.rotor.efficiency", "Turbine Efficiency: §9%d%%"); @@ -241,10 +262,12 @@ private static void generateToolInfoKeys(RegistrateLangProvider provider) { } private static void generateEnchantKeys(RegistrateLangProvider provider) { + // Enchantments provider.add("enchantment.disjunction", "Disjunction"); provider.add("enchantment.damage.disjunction", "Disjunction"); provider.add("enchantment.gtceu.disjunction.description", "Applies Weakness and Slowness to Ender-related mobs."); + provider.add("enchantment.hard_hammer", "Hammering"); provider.add("enchantment.gtceu.hard_hammer.description", "Breaks blocks as if they were mined with a GregTech Hammer."); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/HazardCleanerInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/HazardCleanerInfoProvider.java index 6fb64aa38f1..f43b2b0cc65 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/HazardCleanerInfoProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/HazardCleanerInfoProvider.java @@ -35,7 +35,9 @@ protected IEnvironmentalHazardCleaner getCapability(Level level, BlockPos pos, @ protected void addProbeInfo(IEnvironmentalHazardCleaner capability, IProbeInfo probeInfo, Player player, BlockEntity blockEntity, IProbeHitData data) { float cleaned = capability.getRemovedLastSecond(); - probeInfo.element(new ElementText(Component.translatable("gtceu.jade.cleaned_this_second", cleaned), - probeInfo.defaultTextStyle())); + if (cleaned > 0) { + probeInfo.element(new ElementText(Component.translatable("gtceu.jade.cleaned_this_second", cleaned), + probeInfo.defaultTextStyle())); + } } } diff --git a/src/main/resources/assets/gtceu/lang/ja_jp.json b/src/main/resources/assets/gtceu/lang/ja_jp.json index 7975fa69d01..742383e19f0 100644 --- a/src/main/resources/assets/gtceu/lang/ja_jp.json +++ b/src/main/resources/assets/gtceu/lang/ja_jp.json @@ -94,7 +94,7 @@ "behaviour.soft_hammer.enabled": "作業開始", "behaviour.soft_hammer.idle_after_cycle": "現在のサイクルが終了したら機械を一時停止", "behaviour.wrench": "右クリックでブロックを回転", - "block.filter_casing.tooltip": "§a無塵§7環境を構築する", + "block.gtceu.filter_casing.tooltip": "§a無塵§7環境を構築する", "block.gtceu.acid_hazard_sign_block": "酸危害警告ブロック", "block.gtceu.active_transformer": "大型変圧器", "block.gtceu.advanced_computer_casing": "発展型コンピュータ外装", @@ -1655,7 +1655,7 @@ "block.gtceu.zpm_transformer_4a": "4A対応§cZPM§r変圧器", "block.gtceu.zpm_wiremill": "§c精鋭型ワイヤー作製機 III§r", "block.gtceu.zpm_world_accelerator": "§c精鋭型世界加速機 III§r", - "block.sterilizing_filter_casing.tooltip": "§a滅菌§7環境を構築する", + "block.gtceu.sterilizing_filter_casing.tooltip": "§a滅菌§7環境を構築する", "block.surface_rock": "%sの小石", "button.gtceu.mark_as_depleted.name": "枯渇済みとしてマーク", "button.gtceu.toggle_waypoint.name": "ウェイポイントを切り替え", @@ -3572,7 +3572,7 @@ "gui.gtceu.share_tank.title": "共有タンク在庫", "gui.widget.incrementButton.default_tooltip": "Shift、Ctrlまたはその両方で量を変更", "gui.widget.recipeProgressWidget.default_tooltip": "レシピを表示", - "item.glass_lens": "白いガラスレンズ", + "item.gtceu.glass_lens": "白いガラスレンズ", "item.gtceu.activity_detector_cover": "動作検出器", "item.gtceu.activity_detector_cover.tooltip": "§7レッドストーン信号として§f動作状態§7を検出する§fカバー§7", "item.gtceu.advanced_activity_detector_cover": "発展型動作検出器", @@ -4308,7 +4308,7 @@ "item.gtceu.storage_cover": "倉庫カバー", "item.gtceu.sugar_gem": "砂糖の塊", "item.gtceu.sus_record": "レコード", - "item.gtceu.sus_record.desc": "§7サッシー!", + "item.gtceu.sus_record.tooltip": "§7サッシー!", "item.gtceu.sword_extruder_mold.tooltip": "§7剣の刃を作る為の押出形成用金型", "item.gtceu.tag_filter.tooltip.0": "§fアイテム§7の入出力を§fタグ§7でフィルタリングする§fカバー§7です。", "item.gtceu.tag_filter.tooltip.1": "§fコンベアモジュール§7および§fロボットアーム§7のアップグレード。", @@ -4570,7 +4570,7 @@ "item.gtceu.zpm_voltage_coil": "Zero Point Module Voltage コイル", "item.gtceu.zpm_voltage_coil.tooltip": "素晴らしいコイル", "item.invalid.name": "無効なアイテム", - "item.netherrack_nether_quartz": "ネザークォーツ鉱石", + "item.gtceu.nether_quartz_netherrack": "ネザークォーツ鉱石", "item.toggle.advanced.info.tooltip": "§8<シフトで保存された設定を表示>", "itemGroup.gtceu.decoration": "GregTechCEu装飾ブロック", "itemGroup.gtceu.item": "GregTechCEuアイテム", @@ -5323,7 +5323,7 @@ "item.prospector.mode.ores": "§a鉱石探知モード§r", "item.prospector.tooltip.modes": "利用可能なモード:", "item.prospector.tooltip.radius": "半径%sチャンクの液体と鉱石をスキャン", - "item.record.sus.tooltip": "§7Leonz - Among Us Drip", + "item.gtceu.sus_record.desc": "§7Leonz - Among Us Drip", "item.terminal.tooltip": "良い仕事をする賢い道具", "item.terminal.tooltip.creative": "§bクリエイティブモード", "item.terminal.tooltip.hardware": "§aハードウェア: %d", diff --git a/src/main/resources/assets/gtceu/lang/ru_ru.json b/src/main/resources/assets/gtceu/lang/ru_ru.json index 6ad57e15293..df3ab958678 100644 --- a/src/main/resources/assets/gtceu/lang/ru_ru.json +++ b/src/main/resources/assets/gtceu/lang/ru_ru.json @@ -2744,7 +2744,7 @@ "item.gtceu.zpm_solar_panel": "Солнечная панель (§fZPM§r)", "item.gtceu.zpm_voltage_coil": "Катушка (§fZPM§r)", "item.invalid.name": "Недопустимый предмет", - "item.netherrack_nether_quartz": "Незер-кварцевая руда", + "item.gtceu.nether_quartz_netherrack": "Незер-кварцевая руда", "itemGroup.gtceu.decoration": "GregTechCEu Декорации", "itemGroup.gtceu.item": "GregTechCEu Предметы", "itemGroup.gtceu.machine": "GregTechCEu Механизмы", @@ -2831,7 +2831,7 @@ "item.prospector.mode.ores": "§aРежим разведки руды", "item.prospector.tooltip.modes": "Возможные режимы:", "item.prospector.tooltip.radius": "Сканирует в радиусе %s чанка(ов)", - "item.record.sus.tooltip": "§7Leonz - Among Us Drip", + "item.gtceu.sus_record.desc": "§7Leonz - Among Us Drip", "item.terminal.tooltip": "Правильные инструменты делают хорошую работу", "item.terminal.tooltip.creative": "§bТворческий режим", "item.terminal.tooltip.hardware": "§aДополнений: %d", @@ -3164,7 +3164,7 @@ "gtceu.machine.mv_replicator.tooltip": "§7Производство чистейших элементов", "gtceu.machine.mv_scanner.tooltip": "§7Сканирует материалов и не только", "gtceu.machine.mv_sifter.tooltip": "§7Сохраняйте спокойствие и продолжайте просеивать", - "block.filter_casing.tooltip": "Создает среду §aбез частиц§7", + "block.gtceu.filter_casing.tooltip": "Создает среду §aбез частиц§7", "block.gtceu.iv_input_hatch_4x": "Четверной входной люк (§9IV§r)", "block.gtceu.iv_input_hatch_9x": "Девятерной входной люк (§9IV§r)", "block.gtceu.iv_output_hatch_4x": "Четверной выходной люк (§9IV§r)", @@ -3187,7 +3187,7 @@ "block.gtceu.uhv_input_hatch_4x": "Четверной входной люк (§4UHV§r)", "block.gtceu.uiv_output_hatch_4x": "Четверной выходной люк (§2UIV§r)", "block.gtceu.uxv_output_hatch_4x": "Четверной выходной люк (§eUXV§r)", - "block.sterilizing_filter_casing.tooltip": "Создает §aстерилизованную§7 среду", + "block.gtceu.sterilizing_filter_casing.tooltip": "Создает §aстерилизованную§7 среду", "config.gtceu.option.rngDamageElectricTools": "rngDamageElectricTools", "gtceu.machine.ev_arc_furnace.tooltip": "§7Кому нужна доменная печь?", "gtceu.machine.ev_assembler.tooltip": "§7Мстители, общий сбор!", @@ -3389,7 +3389,7 @@ "tool.gtceu.class.saw": "Пила", "tool.gtceu.class.screwdriver": "Отвертка", "tool.gtceu.class.shovel": "Лопата", - "item.glass_lens": "Стеклянная линза (Белый)", + "item.gtceu.glass_lens": "Стеклянная линза (Белый)", "item.gtceu.activity_detector_cover.tooltip": "§7Выдает §fПрогресс Работы§7 Сигналом Красного камня как §fУлучшение механизма§7.", "item.gtceu.advanced_activity_detector_cover.tooltip": "§7Выдает §fСтатус прогресса§7 Сигналом Красного камня как §fУлучшение механизма§7.", "item.gtceu.advanced_energy_detector_cover.tooltip": "§7Даёт §fRS-триггеру контроль§7 за §fУровнем энергии§7 Сигналом Красного камня как §fУлучшение механизма§7.", @@ -4885,7 +4885,7 @@ "item.gtceu.nightvision_goggles": "Прибор ночного виденья (ПНВ)", "item.gtceu.quarktech_helmet": "QuarkTech™ Шлем", "item.gtceu.quarktech_leggings": "QuarkTech™ Поножи", - "item.gtceu.sus_record.desc": "§7Сус!", + "item.gtceu.sus_record.tooltip": "§7Сус!", "config.gtceu.option.armorHud": "armorHud", "config.gtceu.option.hudOffsetY": "hudOffsetY", "item.gtceu.advanced_quarktech_chestplate": "Улучшенная QuarkTech™ Кираса", diff --git a/src/main/resources/assets/gtceu/lang/uk_ua.json b/src/main/resources/assets/gtceu/lang/uk_ua.json index 5002758a67c..3dd1c8e949b 100644 --- a/src/main/resources/assets/gtceu/lang/uk_ua.json +++ b/src/main/resources/assets/gtceu/lang/uk_ua.json @@ -127,7 +127,7 @@ "item.gtceu.pink_glass_lens": "Скляна лінза (Рожева)", "item.gtceu.purple_glass_lens": "Скляна лінза (Фіолетова)", "item.gtceu.red_glass_lens": "Скляна лінза (Червона)", - "item.glass_lens": "Скляна лінза (Біла)", + "item.gtceu.glass_lens": "Скляна лінза (Біла)", "item.gtceu.yellow_glass_lens": "Скляна лінза (Жовта)", "tagprefix.bolt": "Болт (%s)", "tagprefix.dye": "Бравник (%s)", @@ -357,8 +357,8 @@ "item.gtceu.programmed_circuit.tooltip.2": "плати, щоб встановити її", "item.gtceu.programmed_circuit.tooltip.3": "на значення цієї плати.", "item.gtceu.sus_record": "Платівка", - "item.gtceu.sus_record.desc": "§7підозріло!", - "item.record.sus.tooltip": "§7Leonz - Among Us Drip", + "item.gtceu.sus_record.tooltip": "§7підозріло!", + "item.gtceu.sus_record.desc": "§7Leonz - Among Us Drip", "tool.gtceu.attack_speed.tooltip": "%s§9 швидкости атаки", "tool.gtceu.crafting_uses.tooltip": "%s§a використань у майструванні", @@ -2463,7 +2463,7 @@ "item.gtceu.sugar_gem": "Кубик цукру", "item.gtceu.wood_bolt": "Коротка палиця", "item.gtceu.wood_plate": "Дерев'яна дошка", - "item.netherrack_nether_quartz": "Незерська кварцова руда", + "item.gtceu.nether_quartz_netherrack": "Незерська кварцова руда", "item.gtceu.advanced_electric_jetpack": "Просунутий електричний реактивний ранець", "item.gtceu.basic_tape.tooltip": "§7Не достатньо міцний для механічних проблем\nМожна використовувати для підняття ящиків, не скидаючи предмети з них", "item.gtceu.black_dye_spray_can": "Аерозольний балончик (чорний)", @@ -4966,8 +4966,8 @@ "gtceu.steam_boiler": "Паровий котел", "gtceu.steam_turbine": "Парова турбіна", - "block.filter_casing.tooltip": "Створює§a вільне від частинок§7 середовище", - "block.sterilizing_filter_casing.tooltip": "Створює§a стерильне§7 середовище", + "block.gtceu.filter_casing.tooltip": "Створює§a вільне від частинок§7 середовище", + "block.gtceu.sterilizing_filter_casing.tooltip": "Створює§a стерильне§7 середовище", "button.gtceu.mark_as_depleted.name": "Позначити як виснажений", "button.gtceu.toggle_waypoint.name": "Перемикнути маршрутну точку", "curios.identifier.gtceu_magnet": "GTCEu магніт", diff --git a/src/main/resources/assets/gtceu/lang/zh_cn.json b/src/main/resources/assets/gtceu/lang/zh_cn.json index 3f6a4a91a1c..94db995c22a 100644 --- a/src/main/resources/assets/gtceu/lang/zh_cn.json +++ b/src/main/resources/assets/gtceu/lang/zh_cn.json @@ -94,7 +94,7 @@ "behaviour.soft_hammer.enabled": "已恢复工作", "behaviour.soft_hammer.idle_after_cycle": "当前周期结束后暂停机器", "behaviour.wrench": "右击以旋转方块", - "block.filter_casing.tooltip": "创建一个§a无尘§r环境", + "block.gtceu.filter_casing.tooltip": "创建一个§a无尘§r环境", "block.gtceu.acid_hazard_sign_block": "强酸危害警示方块", "block.gtceu.active_transformer": "有源变压器", "block.gtceu.advanced_computer_casing": "高级计算机外壳", @@ -1699,7 +1699,7 @@ "block.gtceu.zpm_transformer_4a": "§c零点压§r高流变压器(§cZPM§r)", "block.gtceu.zpm_wiremill": "§c精英线材轧机 III§r", "block.gtceu.zpm_world_accelerator": "§c精英世界加速器 III§r", - "block.sterilizing_filter_casing.tooltip": "创造一个§a无菌§r环境", + "block.gtceu.sterilizing_filter_casing.tooltip": "创造一个§a无菌§r环境", "block.surface_rock": "地表岩石(%s)", "button.gtceu.mark_as_depleted.name": "标记为枯竭", "button.gtceu.toggle_waypoint.name": "切换路径点", @@ -3641,7 +3641,7 @@ "gui.gtceu.share_tank.title": "共享流体库存", "gui.widget.incrementButton.default_tooltip": "按住Shift,Ctrl键或同时按住这两个键来改变数量", "gui.widget.recipeProgressWidget.default_tooltip": "查看配方", - "item.glass_lens": "玻璃透镜(白色)", + "item.gtceu.glass_lens": "玻璃透镜(白色)", "item.gtceu.activity_detector_cover": "活跃探测覆盖板", "item.gtceu.activity_detector_cover.tooltip": "§7作§f覆盖板§7时依照§f机器活跃状态§7发出红石信号。", "item.gtceu.advanced_activity_detector_cover": "进阶活跃状态探测器", @@ -4376,7 +4376,7 @@ "item.gtceu.storage_cover": "存储覆盖板", "item.gtceu.sugar_gem": "方糖", "item.gtceu.sus_record": "音乐唱片", - "item.gtceu.sus_record.desc": "§7可疑!", + "item.gtceu.sus_record.tooltip": "§7可疑!", "item.gtceu.sword_extruder_mold.tooltip": "§7用来制作剑刃的模头", "item.gtceu.tag_filter.tooltip.0": "作§f覆盖板§7时以§f标签§7过滤§f物品§7的输入/输出。", "item.gtceu.tag_filter.tooltip.1": "亦可为§f传送带§7和§f机械臂§7提供此功能。", @@ -4639,7 +4639,7 @@ "item.gtceu.zpm_voltage_coil": "零点压线圈", "item.gtceu.zpm_voltage_coil.tooltip": "超级线圈", "item.invalid.name": "无效物品", - "item.netherrack_nether_quartz": "下界石英矿石", + "item.gtceu.nether_quartz_netherrack": "下界石英矿石", "item.toggle.advanced.info.tooltip": "§8<按住Shift查阅已存储配置信息>", "itemGroup.gtceu.decoration": "格雷科技 | 装饰方块", "itemGroup.gtceu.item": "格雷科技 | 物品", @@ -5394,7 +5394,7 @@ "item.prospector.mode.ores": "§a矿石探勘模式§r", "item.prospector.tooltip.modes": "可用模式:", "item.prospector.tooltip.radius": "扫描半径:%s", - "item.record.sus.tooltip": "§7Leonz - Among Us Drip", + "item.gtceu.sus_record.desc": "§7Leonz - Among Us Drip", "item.terminal.tooltip": "工欲善其事,必先利其器。", "item.terminal.tooltip.creative": "§b创造模式", "item.terminal.tooltip.hardware": "§a硬件:%d", diff --git a/src/main/resources/assets/gtceu/lang/zh_tw.json b/src/main/resources/assets/gtceu/lang/zh_tw.json index e8c7ac3bb96..afe08839eed 100644 --- a/src/main/resources/assets/gtceu/lang/zh_tw.json +++ b/src/main/resources/assets/gtceu/lang/zh_tw.json @@ -94,7 +94,7 @@ "behaviour.soft_hammer.enabled": "已恢復工作", "behaviour.soft_hammer.idle_after_cycle": "當前週期結束後暫停機器", "behaviour.wrench": "右擊以旋轉方塊", - "block.filter_casing.tooltip": "建立一個§a無塵§r環境", + "block.gtceu.filter_casing.tooltip": "建立一個§a無塵§r環境", "block.gtceu.acid_hazard_sign_block": "強酸危害警示方塊", "block.gtceu.active_transformer": "有源變壓器", "block.gtceu.advanced_computer_casing": "高階電腦外殼", @@ -1699,7 +1699,7 @@ "block.gtceu.zpm_transformer_4a": "§c零點壓§r高流變壓器(§cZPM§r)", "block.gtceu.zpm_wiremill": "§c精英線材軋機 III§r", "block.gtceu.zpm_world_accelerator": "§c精英世界加速器 III§r", - "block.sterilizing_filter_casing.tooltip": "創造一個§a無菌§r環境", + "block.gtceu.sterilizing_filter_casing.tooltip": "創造一個§a無菌§r環境", "block.surface_rock": "地表岩石(%s)", "button.gtceu.mark_as_depleted.name": "標記為枯竭", "button.gtceu.toggle_waypoint.name": "切換路徑點", @@ -3635,7 +3635,7 @@ "gui.gtceu.share_tank.title": "共享流體庫存", "gui.widget.incrementButton.default_tooltip": "按住Shift,Ctrl鍵或同時按住這兩個鍵來改變數量", "gui.widget.recipeProgressWidget.default_tooltip": "檢視配方", - "item.glass_lens": "玻璃透鏡(白色)", + "item.gtceu.glass_lens": "玻璃透鏡(白色)", "item.gtceu.activity_detector_cover": "活躍探測覆蓋板", "item.gtceu.activity_detector_cover.tooltip": "§7作§f覆蓋板§7時依照§f機器活躍狀態§7發出紅石訊號。", "item.gtceu.advanced_activity_detector_cover": "進階活躍狀態探測器", @@ -4371,7 +4371,7 @@ "item.gtceu.storage_cover": "儲存覆蓋板", "item.gtceu.sugar_gem": "方糖", "item.gtceu.sus_record": "音樂唱片", - "item.gtceu.sus_record.desc": "可疑!", + "item.gtceu.sus_record.tooltip": "可疑!", "item.gtceu.sword_extruder_mold.tooltip": "§7用來製作劍刃的擠壓模具", "item.gtceu.tag_filter.tooltip.0": "§7作§f覆蓋板§7時以§f礦物詞典§7過濾§f物品§7的輸入/輸出。", "item.gtceu.tag_filter.tooltip.1": "§7亦可用於§f傳送帶§7與§f機械臂§7。", @@ -4634,7 +4634,7 @@ "item.gtceu.zpm_voltage_coil": "零點壓線圈(§cZPM§r)", "item.gtceu.zpm_voltage_coil.tooltip": "超級線圈", "item.invalid.name": "無效物品", - "item.netherrack_nether_quartz": "地獄石英礦", + "item.gtceu.nether_quartz_netherrack": "地獄石英礦", "item.toggle.advanced.info.tooltip": "§8<按住Shift查閱已儲存設定資訊>", "itemGroup.gtceu.decoration": "格雷科技 | 裝飾方塊", "itemGroup.gtceu.item": "格雷科技 | 物品", @@ -5383,7 +5383,7 @@ "item.prospector.mode.ores": "§a礦探勘模式§r", "item.prospector.tooltip.modes": "可用模式:", "item.prospector.tooltip.radius": "掃描半徑:%s", - "item.record.sus.tooltip": "§7Leonz - Among Us Drip", + "item.gtceu.sus_record.desc": "§7Leonz - Among Us Drip", "item.terminal.tooltip": "工欲善其事,必先利其器。", "item.terminal.tooltip.creative": "§b創造模式", "item.terminal.tooltip.hardware": "§a硬體:%d", From 5f65c800250877ec1af5ab258e0ee4299fb0e38e Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Tue, 24 Jun 2025 01:50:36 -0600 Subject: [PATCH 17/45] machine lang :sob: --- .../resources/assets/gtceu/lang/en_ud.json | 10 +- .../resources/assets/gtceu/lang/en_us.json | 10 +- .../gtceu/data/lang/MachineLang.java | 1393 ++++++++++------- 3 files changed, 844 insertions(+), 569 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 14d664a5d0d..4b229849e01 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -2708,6 +2708,7 @@ "gtceu.machine.hp_steam_furnace.tooltip": "ɯɐǝʇS pǝssǝɹdɯoɔ ɥʇıʍ sbuıɥʇ buıʇןǝɯSㄥ§", "gtceu.machine.hp_steam_liquid_boiler.tooltip": "ɹǝןıoᗺ pınbıꞀ ɯɐǝʇS ןןɐɯS uɐɥʇ ɹǝʇsɐℲㄥ§", "gtceu.machine.hp_steam_macerator.tooltip": "sǝɹO ɹnoʎ buıʇɐɹǝɔɐWㄥ§", + "gtceu.machine.hp_steam_miner.tooltip": "¡ɹǝuıW ǝɥʇ ʍoןǝq sǝɹo sǝuıWㄥ§", "gtceu.machine.hp_steam_rock_crusher.tooltip": "ʇuǝɔɐظpɐ ʎןןɐʇuozıɹoɥ ɐʌɐꞀ puɐ ɹǝʇɐM ǝɔɐןԀㄥ§", "gtceu.machine.hp_steam_solar_boiler.tooltip": "unS ʎq ɹǝʍoԀ ɯɐǝʇSㄥ§", "gtceu.machine.hp_steam_solid_boiler.tooltip": "ɹǝןıoᗺ ןǝnℲ pıןoS ɯɐǝʇS ןןɐɯS ǝɥʇ uɐɥʇ ɹǝʇsɐℲㄥ§", @@ -2846,6 +2847,7 @@ "gtceu.machine.lp_steam_furnace.tooltip": "ɯɐǝʇS pǝssǝɹdɯoɔ ɥʇıʍ sbuıɥʇ buıʇןǝɯSㄥ§", "gtceu.machine.lp_steam_liquid_boiler.tooltip": "spınbıꞀ ɟɟo buıuunɹ ɹǝןıoᗺ Ɐㄥ§", "gtceu.machine.lp_steam_macerator.tooltip": "sǝɹO ɹnoʎ buıʇɐɹǝɔɐWㄥ§", + "gtceu.machine.lp_steam_miner.tooltip": "¡ɹǝuıW ǝɥʇ ʍoןǝq sǝɹo sǝuıWㄥ§", "gtceu.machine.lp_steam_rock_crusher.tooltip": "ʇuǝɔɐظpɐ ʎןןɐʇuozıɹoɥ ɐʌɐꞀ puɐ ɹǝʇɐM ǝɔɐןԀㄥ§", "gtceu.machine.lp_steam_solar_boiler.tooltip": "unS ʎq ɹǝʍoԀ ɯɐǝʇSㄥ§", "gtceu.machine.lp_steam_solid_boiler.tooltip": "ɹǝʍoԀ ɯɐǝʇS ʇǝb oʇ ʎɐʍ ʎןɹɐǝ uⱯㄥ§", @@ -3061,7 +3063,6 @@ "gtceu.machine.steam_boiler.heat_amount": "%% %s :ʎʇıɔɐdɐƆ ʇɐǝH", "gtceu.machine.steam_bus.tooltip": "sʞɔoןqıʇןnɯ ɯɐǝʇs-uou ɥʇıʍ ʞɹoʍ ʇou sǝoᗡ", "gtceu.machine.steam_grinder.tooltip": "sʇɔnpoɹdʎᗺ ǝɥʇ ʇnoɥʇıʍ ɹoʇɐɹǝɔɐW ʞɔoןqıʇןnɯ Ɐ", - "gtceu.machine.steam_miner.tooltip": "¡ɹǝuıW ǝɥʇ ʍoןǝq sǝɹo sǝuıWㄥ§", "gtceu.machine.steam_oven.tooltip": "ɹǝʇןǝɯS-ıʇןnW ɥʇıʍ pǝsnɟuoɔ ǝq oʇ ʇoN", "gtceu.machine.steam_turbine.tooltip": "∩Ǝ oʇuı ɯɐǝʇS sʇɹǝʌuoƆㄥ§", "gtceu.machine.substation_hatch.input.tooltip": "uoıʇɐʇsqnS ɹǝʍoԀ ǝɥʇ ɹoɟ ʇnduI ʎbɹǝuƎ", @@ -3223,9 +3224,10 @@ "gtceu.multiblock.central_monitor.width": "%d :ɥʇpıM uǝǝɹɔS", "gtceu.multiblock.charcoal_pile.description.0": "˙ʇı ɥʇɐǝuǝq ɐǝɹɐ 6xㄣx6 ɐ uı ןɐoɔɹɐɥƆ ǝןʇʇıɹᗺ oʇuı sboן sʇɹǝʌuoƆ", "gtceu.multiblock.charcoal_pile.description.1": "", - "gtceu.multiblock.charcoal_pile.description.2": "˙ʇıd ǝɥʇ ǝpısuı ǝq uɐɔ ɹıɐ oN ˙ɟooɹ puɐ sןןɐʍ ǝɥʇ ɹoɟ pǝsn ǝq uɐɔ ʞɔoןq pǝʇɐןǝɹ-punoɹb ʎuɐ puɐ 'sʞɔıɹq ɯoɹɟ ǝpɐɯ ǝq ʇsnɯ ʇıd ǝɥʇ ɟo ɹooןɟ ǝɥ⟘", - "gtceu.multiblock.charcoal_pile.description.3": "", - "gtceu.multiblock.charcoal_pile.description.4": "˙ʇuǝıɔıɟɟǝ ǝɹoɯ ǝɹɐ ʇnq 'sboן ssǝɔoɹd oʇ ǝɯıʇ ǝɹoɯ ǝʞɐʇ sʇıd ɹǝbɹɐꞀ", + "gtceu.multiblock.charcoal_pile.description.2": "˙ɟooɹ puɐ sןןɐʍ ǝɥʇ ɹoɟ pǝsn ǝq uɐɔ ʞɔoןq pǝʇɐןǝɹ-punoɹb ʎuɐ puɐ 'sʞɔıɹq ɯoɹɟ ǝpɐɯ ǝq ʇsnɯ ʇıd ǝɥʇ ɟo ɹooןɟ ǝɥ⟘", + "gtceu.multiblock.charcoal_pile.description.3": "˙ʇıd ǝɥʇ ǝpısuı ǝq uɐɔ ɹıɐ oN", + "gtceu.multiblock.charcoal_pile.description.4": "", + "gtceu.multiblock.charcoal_pile.description.5": "˙ʇuǝıɔıɟɟǝ ǝɹoɯ ǝɹɐ ʇnq 'sboן ssǝɔoɹd oʇ ǝɯıʇ ǝɹoɯ ǝʞɐʇ sʇıd ɹǝbɹɐꞀ", "gtceu.multiblock.cleanroom.clean_amount": "%s%%ɐ§ :ssǝuıןuɐǝןƆ", "gtceu.multiblock.cleanroom.clean_state": "NⱯƎꞀƆɐ§ :snʇɐʇS", "gtceu.multiblock.cleanroom.dirty_state": "ᗡƎ⟘ⱯNIWⱯ⟘NOƆㄣ§ :snʇɐʇS", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 620151a34f8..6f96365b066 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -2708,6 +2708,7 @@ "gtceu.machine.hp_steam_furnace.tooltip": "§7Smelting things with compressed Steam", "gtceu.machine.hp_steam_liquid_boiler.tooltip": "§7Faster than Small Steam Liquid Boiler", "gtceu.machine.hp_steam_macerator.tooltip": "§7Macerating your Ores", + "gtceu.machine.hp_steam_miner.tooltip": "§7Mines ores below the Miner!", "gtceu.machine.hp_steam_rock_crusher.tooltip": "§7Place Water and Lava horizontally adjacent", "gtceu.machine.hp_steam_solar_boiler.tooltip": "§7Steam Power by Sun", "gtceu.machine.hp_steam_solid_boiler.tooltip": "§7Faster than the Small Steam Solid Fuel Boiler", @@ -2846,6 +2847,7 @@ "gtceu.machine.lp_steam_furnace.tooltip": "§7Smelting things with compressed Steam", "gtceu.machine.lp_steam_liquid_boiler.tooltip": "§7A Boiler running off Liquids", "gtceu.machine.lp_steam_macerator.tooltip": "§7Macerating your Ores", + "gtceu.machine.lp_steam_miner.tooltip": "§7Mines ores below the Miner!", "gtceu.machine.lp_steam_rock_crusher.tooltip": "§7Place Water and Lava horizontally adjacent", "gtceu.machine.lp_steam_solar_boiler.tooltip": "§7Steam Power by Sun", "gtceu.machine.lp_steam_solid_boiler.tooltip": "§7An early way to get Steam Power", @@ -3061,7 +3063,6 @@ "gtceu.machine.steam_boiler.heat_amount": "Heat Capacity: %s %%", "gtceu.machine.steam_bus.tooltip": "Does not work with non-steam multiblocks", "gtceu.machine.steam_grinder.tooltip": "A multiblock Macerator without the Byproducts", - "gtceu.machine.steam_miner.tooltip": "§7Mines ores below the Miner!", "gtceu.machine.steam_oven.tooltip": "Not to be confused with Multi-Smelter", "gtceu.machine.steam_turbine.tooltip": "§7Converts Steam into EU", "gtceu.machine.substation_hatch.input.tooltip": "Energy Input for the Power Substation", @@ -3223,9 +3224,10 @@ "gtceu.multiblock.central_monitor.width": "Screen Width: %d", "gtceu.multiblock.charcoal_pile.description.0": "Converts logs into Brittle Charcoal in a 9x4x9 area beneath it.", "gtceu.multiblock.charcoal_pile.description.1": "", - "gtceu.multiblock.charcoal_pile.description.2": "The floor of the pit must be made from bricks, and any ground-related block can be used for the walls and roof. No air can be inside the pit.", - "gtceu.multiblock.charcoal_pile.description.3": "", - "gtceu.multiblock.charcoal_pile.description.4": "Larger pits take more time to process logs, but are more efficient.", + "gtceu.multiblock.charcoal_pile.description.2": "The floor of the pit must be made from bricks, and any ground-related block can be used for the walls and roof.", + "gtceu.multiblock.charcoal_pile.description.3": "No air can be inside the pit.", + "gtceu.multiblock.charcoal_pile.description.4": "", + "gtceu.multiblock.charcoal_pile.description.5": "Larger pits take more time to process logs, but are more efficient.", "gtceu.multiblock.cleanroom.clean_amount": "Cleanliness: §a%s%%", "gtceu.multiblock.cleanroom.clean_state": "Status: §aCLEAN", "gtceu.multiblock.cleanroom.dirty_state": "Status: §4CONTAMINATED", diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java index ed1b67a6f9c..fdf759525ec 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java @@ -6,62 +6,230 @@ public class MachineLang { - protected static void init(RegistrateLangProvider provider) { + public static void init(RegistrateLangProvider provider) { + generateSteamMachines(provider); + + generateGeneralMachineTooltips(provider); + generateGeneralMultiblockTooltips(provider); + + generateCustomPerTierMachineTooltips(provider); + generateCustomMachineTooltips(provider); + + generateCustomMultiblockTooltips(provider); + generateCustomMultiblockPartTooltips(provider); + generateMultiblockKeys(provider); + } - // Custom machine names - replace(provider, "block.gtceu.steam_large_turbine", "Large Steam Turbine"); - replace(provider, "block.gtceu.gas_large_turbine", "Large Gas Turbine"); - replace(provider, "block.gtceu.plasma_large_turbine", "Large Plasma Turbine"); + public static void standardTooltips(RegistrateLangProvider provider, String root, String machine, + String lowTier, + String midTier, String highTier) { + makeElectricMachineTooltipLVtoUV(provider, root, machine, + lowTier, lowTier, lowTier, + lowTier, midTier, midTier, midTier, + highTier); + } - // Steam machines + private static void generateSteamMachines(RegistrateLangProvider provider) { + makeSteamMachineTooltip(provider, "gtceu.machine", "steam_solid_boiler", + "An early way to get Steam Power", "Faster than the Small Steam Solid Fuel Boiler"); + makeSteamMachineTooltip(provider, "gtceu.machine", "steam_solar_boiler", + "Steam Power by Sun", "Steam Power by Sun"); + makeSteamMachineTooltip(provider, "gtceu.machine", "steam_liquid_boiler", + "A Boiler running off Liquids", "Faster than Small Steam Liquid Boiler"); + makeSteamMachineTooltip(provider, "gtceu.machine", "steam_extractor", + "Extracting your first Rubber", "Extracting your first Rubber"); + makeSteamMachineTooltip(provider, "gtceu.machine", "steam_macerator", + "Macerating your Ores", "Macerating your Ores"); + makeSteamMachineTooltip(provider, "gtceu.machine", "steam_compressor", + "Compressing Items", "Compressing Items"); + makeSteamMachineTooltip(provider, "gtceu.machine", "steam_forge_hammer", + "Forge Hammer", "Forge Hammer"); + makeSteamMachineTooltip(provider, "gtceu.machine", "steam_furnace", + "Smelting things with compressed Steam", "Smelting things with compressed Steam"); + makeSteamMachineTooltip(provider, "gtceu.machine", "steam_alloy_smelter", + "Combination Smelter", "Combination Smelter"); + makeSteamMachineTooltip(provider, "gtceu.machine", "steam_rock_crusher", + "Place Water and Lava horizontally adjacent", "Place Water and Lava horizontally adjacent"); + makeSteamMachineTooltip(provider, "gtceu.machine", "steam_miner", + "Mines ores below the Miner!", "Mines ores below the Miner!"); + + // unused replace(provider, "block.gtceu.steam_solid_boiler.bronze", "Small Steam Solid Boiler"); replace(provider, "block.gtceu.steam_liquid_boiler.bronze", "Small Steam Liquid Boiler"); + } - provider.add("gtceu.machine.lp_steam_solid_boiler.tooltip", "§7An early way to get Steam Power"); - provider.add("gtceu.machine.hp_steam_solid_boiler.tooltip", - "§7Faster than the Small Steam Solid Fuel Boiler"); - provider.add("gtceu.machine.lp_steam_solar_boiler.tooltip", "§7Steam Power by Sun"); - provider.add("gtceu.machine.hp_steam_solar_boiler.tooltip", "§7Steam Power by Sun"); - provider.add("gtceu.machine.lp_steam_liquid_boiler.tooltip", "§7A Boiler running off Liquids"); - provider.add("gtceu.machine.hp_steam_liquid_boiler.tooltip", "§7Faster than Small Steam Liquid Boiler"); - provider.add("gtceu.machine.steam_boiler.heat_amount", "Heat Capacity: %s %%"); + private static void generateGeneralMachineTooltips(RegistrateLangProvider provider) { + // General Machine Behavior + provider.add("gtceu.machine.basic.input_from_output_side.allow", "Allow Input from Output Side: "); + provider.add("gtceu.machine.basic.input_from_output_side.disallow", + "Disallow Input from Output Side: "); + provider.add("gtceu.machine.muffle.on", "Sound Muffling: Enabled"); + provider.add("gtceu.machine.muffle.off", "Sound Muffling: Disabled"); + provider.add("gtceu.machine.perfect_oc", "Does not lose energy efficiency when overclocked."); + } - provider.add("gtceu.machine.lp_steam_extractor.tooltip", "§7Extracting your first Rubber"); - provider.add("gtceu.machine.hp_steam_extractor.tooltip", "§7Extracting your first Rubber"); - provider.add("gtceu.machine.lp_steam_macerator.tooltip", "§7Macerating your Ores"); - provider.add("gtceu.machine.hp_steam_macerator.tooltip", "§7Macerating your Ores"); - provider.add("gtceu.machine.lp_steam_compressor.tooltip", "§7Compressing Items"); - provider.add("gtceu.machine.hp_steam_compressor.tooltip", "§7Compressing Items"); - provider.add("gtceu.machine.lp_steam_forge_hammer.tooltip", "§7Forge Hammer"); - provider.add("gtceu.machine.hp_steam_forge_hammer.tooltip", "§7Forge Hammer"); - provider.add("gtceu.machine.lp_steam_furnace.tooltip", "§7Smelting things with compressed Steam"); - provider.add("gtceu.machine.hp_steam_furnace.tooltip", "§7Smelting things with compressed Steam"); - provider.add("gtceu.machine.lp_steam_alloy_smelter.tooltip", "§7Combination Smelter"); - provider.add("gtceu.machine.hp_steam_alloy_smelter.tooltip", "§7Combination Smelter"); - provider.add("gtceu.machine.lp_steam_rock_crusher.tooltip", - "§7Place Water and Lava horizontally adjacent"); - provider.add("gtceu.machine.hp_steam_rock_crusher.tooltip", - "§7Place Water and Lava horizontally adjacent"); - provider.add("gtceu.machine.steam_miner.tooltip", "§7Mines ores below the Miner!"); + /** + * For Tooltips that are NOT in the form {@code mod.machine.tier_name.tooltip} + */ + private static void generateCustomMachineTooltips(RegistrateLangProvider provider) { + // Steam Boilers + provider.add("gtceu.machine.boiler.info.heating.up", "§cHeating up§r%s"); + provider.add("gtceu.machine.boiler.info.cooling.down", "§9Cooling down§r%s"); + provider.add("gtceu.machine.boiler.info.producing.steam", " §a(boiling water)"); + provider.add("gtceu.machine.steam_boiler.heat_amount", "Heat Capacity: %s %%"); + // Generators provider.add("gtceu.machine.combustion_generator.tooltip", "§7Requires flammable Liquids"); provider.add("gtceu.machine.steam_turbine.tooltip", "§7Converts Steam into EU"); provider.add("gtceu.machine.gas_turbine.tooltip", "§7Requires flammable Gases"); + // Machine Hull + provider.add("gtceu.machine.hull.tooltip", + "§7You just need §5I§dm§4a§cg§ei§an§ba§3t§7i§1o§5n§7 to use this"); + + // Battery Buffer + provider.add("gtceu.battery_buffer.average_input", "Average input: %s EU/t"); + provider.add("gtceu.battery_buffer.average_output", "Average output: %s EU/t"); + + // Transformer + provider.add("gtceu.machine.transformer.description", "§7Transforms Energy between voltage tiers"); + provider.add("gtceu.machine.transformer.tooltip_tool_usage", + "Starts as §fTransform Down§7, use Screwdriver to change"); + provider.add("gtceu.machine.transformer.tooltip_transform_down", + "§aTransform Down: §f%dA %s EU (%s§f) -> %dA %s EU (%s§f)"); + provider.add("gtceu.machine.transformer.message_transform_down", + "Transforming Down, In: %s EU %dA, Out: %s EU %dA"); + provider.add("gtceu.machine.transformer.tooltip_transform_up", + "§cTransform Up: §f%dA %s EU (%s§f) -> %dA %s EU (%s§f)"); + provider.add("gtceu.machine.transformer.message_transform_up", + "Transforming Up, In: %s EU %dA, Out: %s EU %dA"); + + // Diode + provider.add("gtceu.machine.diode.message", "Max Amperage throughput: %s"); + provider.add("gtceu.machine.diode.tooltip_tool_usage", + "Hit with a Soft Mallet to change Amperage flow."); + provider.add("gtceu.machine.diode.tooltip_general", + "Allows Energy Flow in one direction and limits Amperage"); + provider.add("gtceu.machine.diode.tooltip_starts_at", "Starts as §f1A§7, use Soft Mallet to change"); + + // Energy Converter + provider.add("gtceu.machine.energy_converter.description", "Converts Energy between EU and FE"); + provider.add("gtceu.machine.energy_converter.tooltip_tool_usage", + "Starts as §fFE Converter§7, use Soft Mallet to change"); + provider.add("gtceu.machine.energy_converter.tooltip_conversion_native", + "§cNative Conversion: §f%d FE -> %dA %d EU (%s§f)"); + provider.add("gtceu.machine.energy_converter.message_conversion_native", + "Converting Native Energy, In: %d FE, Out: %dA %d EU"); + provider.add("gtceu.machine.energy_converter.tooltip_conversion_eu", + "§aEU Conversion: §f%dA %d EU (%s§f) -> %d Native"); + provider.add("gtceu.machine.energy_converter.message_conversion_eu", + "Converting EU, In: %dA %d EU, Out: %d Native"); + + // Pump + provider.add("gtceu.machine.pump.tooltip", "§7The best way to empty Oceans!"); + provider.add("gtceu.machine.pump.tooltip_buckets", "§f%d §7ticks per Bucket"); + + // Item Collector + provider.add("gtceu.machine.item_collector.gui.collect_range", + "Collect within an area of %sx%s blocks"); + provider.add("gtceu.machine.item_collector.tooltip", "Collects Items around itself"); + + // Fisher + provider.add("gtceu.machine.fisher.tooltip", "Costs string to fish. Consumes one string each time."); + provider.add("gtceu.machine.fisher.speed", "Catches something every %d ticks"); + provider.add("gtceu.machine.fisher.requirement", + "Requires a %dx%d centered square of water directly below."); + + // World Accelerator + provider.add("gtceu.machine.world_accelerator.description", + "Tick accelerates nearby blocks in one of 2 modes: §fTile Entity§7 or §fRandom Tick§7. Use Screwdriver to change mode."); + provider.add("gtceu.machine.world_accelerator.working_area", "§bWorking Area:"); + provider.add("gtceu.machine.world_accelerator.working_area_tile", + " Block Entity Mode:§f Adjacent Blocks"); + provider.add("gtceu.machine.world_accelerator.working_area_random", " Random Tick Mode:§f %dx%d"); + provider.add("gtceu.machine.world_accelerator.mode_tile", "Block Entity Mode"); + provider.add("gtceu.machine.world_accelerator.mode_entity", "Random Tick Mode"); + + // Forming Press + provider.add("gtceu.forming_press.naming.press", "§oNamed Press"); + provider.add("gtceu.forming_press.naming.to_name", "§oItem to Name"); + provider.add("gtceu.forming_press.naming.named", "§oNamed Item"); + + // Scanner + provider.add("gtceu.scanner.copy_stick_from", "§oStick to Copy"); + provider.add("gtceu.scanner.copy_stick_empty", "§oEmpty Stick"); + provider.add("gtceu.scanner.copy_stick_to", "§oCopy of Stick"); + + // Miner + provider.add("gtceu.machine.miner.tooltip", "§7Mines ores below the Miner! Starts as §f%sx%s §7area"); + provider.add("gtceu.machine.miner.per_block", "§7takes §f%ds §7per Block"); + + // Buffer + provider.add("gtceu.machine.buffer.tooltip", "A Small Buffer to store Items and Fluids"); + + // Block Breaker provider.add("gtceu.machine.block_breaker.tooltip", "§7Mines block on front face and collects its drops"); provider.add("gtceu.machine.block_breaker.speed_bonus", "§eSpeed Bonus: §f%d%%"); - provider.add("gtceu.machine.boiler.info.heating.up", "§cHeating up§r%s"); - provider.add("gtceu.machine.boiler.info.cooling.down", "§9Cooling down§r%s"); - provider.add("gtceu.machine.boiler.info.producing.steam", " §a(boiling water)"); + // Creative Chest/Tank + provider.add("gtceu.machine.quantum_chest.tooltip", "§7Better than Storage Drawers"); + provider.add("gtceu.machine.quantum_chest.items_stored", "Item Amount:"); + provider.add("gtceu.machine.quantum_tank.tooltip", "§7Compact place to store all your fluids"); + + provider.add("gtceu.creative.chest.item", "Item"); + provider.add("gtceu.creative.chest.ipc", "Items per Cycle"); + provider.add("gtceu.creative.chest.tpc", "Ticks per Cycle"); + provider.add("gtceu.creative.tank.fluid", "Fluid"); + provider.add("gtceu.creative.tank.mbpc", "mB per Cycle"); + provider.add("gtceu.creative.tank.tpc", "Ticks per Cycle"); + provider.add("gtceu.creative.energy.amperage", "Amperage"); + provider.add("gtceu.creative.energy.voltage", "Voltage"); + provider.add("gtceu.creative.energy.sink", "Sink"); + provider.add("gtceu.creative.energy.source", "Source"); + provider.add("gtceu.creative.computation.average", "Average Requested CWUt"); + provider.add("gtceu.creative.activity.on", "Active"); + provider.add("gtceu.creative.activity.off", "Not active"); + + // Workbench + multilineLang(provider, "gtceu.machine.workbench.tooltip", + "Better than Forestry\nHas Item Storage, Tool Storage, pulls from adjacent Inventories, and saves Recipes."); + provider.add("gtceu.machine.workbench.tab.workbench", "Crafting"); + provider.add("gtceu.machine.workbench.tab.item_list", "Storage"); + multilineLang(provider, "gtceu.machine.workbench.storage_note", + "(Available items from connected\ninventories usable for crafting)"); + provider.add("gtceu.item_list.item_stored", "§7Stored: %d"); + provider.add("gtceu.machine.workbench.tab.crafting", "Crafting"); + provider.add("gtceu.machine.workbench.tab.container", "Container"); + multilineLang(provider, "gtceu.recipe_memory_widget.tooltip", + "§7Left click to automatically input this recipe into the crafting grid\n§7Shift click to lock/unlock this recipe"); + + // Safe + provider.add("gtceu.machine.locked_safe.malfunctioning", "§cMalfunctioning!"); + provider.add("gtceu.machine.locked_safe.requirements", "§7Replacements required:"); + + // Drums + provider.add("gtceu.machine.drum.enable_output", "Will drain Fluid to downward adjacent Tanks"); + provider.add("gtceu.machine.drum.disable_output", "Will not drain Fluid"); - /////////////////////////////////////////////////// - // Standard Machines // - // Ones done with more unique tooltips are first / - /////////////////////////////////////////////////// + // Long Distance Pipeline + multiLang(provider, "gtceu.machine.endpoint.tooltip", + "Connect with §fLong Distance Pipe§7 blocks to create a pipeline.", + "Pipelines must have exactly §f1 Input§7 and §f1 Output§7 endpoint.", + "Only pipeline endpoints need to be §fchunk-loaded§7."); + provider.add("block.gtceu.long_distance_item_pipeline_no_network", "No network found"); + provider.add("block.gtceu.long_distance_item_pipeline_input_endpoint", "Input Endpoint"); + provider.add("block.gtceu.long_distance_item_pipeline_output_endpoint", "Output Endpoint"); + provider.add("block.gtceu.long_distance_item_pipeline_network_header", "Network:"); + provider.add("block.gtceu.long_distance_item_pipeline_pipe_count", " - Pipes: %s"); + provider.add("block.gtceu.long_distance_item_pipeline_input_pos", " - Input: %s"); + provider.add("block.gtceu.long_distance_item_pipeline_output_pos", " - Output: %s"); + provider.add("gtceu.machine.endpoint.tooltip.min_length", "§bMinimum Endpoint Distance: §f%d Blocks"); + } + private static void generateCustomPerTierMachineTooltips(RegistrateLangProvider provider) { + // Macerator provider.add("gtceu.machine.lv_macerator.tooltip", "§7Shredding your Ores without Byproducts"); provider.add("gtceu.machine.mv_macerator.tooltip", "§7Shredding your Ores without Byproducts"); provider.add("gtceu.machine.hv_macerator.tooltip", "§7Shredding your Ores with Byproducts"); @@ -71,6 +239,7 @@ protected static void init(RegistrateLangProvider provider) { provider.add("gtceu.machine.zpm_macerator.tooltip", "§7Blend-O-Matic 9003"); provider.add("gtceu.machine.uv_macerator.tooltip", "§7Shape Eliminator"); + // Centrifuge provider.add("gtceu.machine.lv_centrifuge.tooltip", "§7Separating Molecules"); provider.add("gtceu.machine.mv_centrifuge.tooltip", "§7Separating Molecules"); provider.add("gtceu.machine.hv_centrifuge.tooltip", "§7Separating Molecules"); @@ -80,6 +249,7 @@ protected static void init(RegistrateLangProvider provider) { provider.add("gtceu.machine.zpm_centrifuge.tooltip", "§7Molecular Cyclone"); provider.add("gtceu.machine.uv_centrifuge.tooltip", "§7Molecular Tornado"); + // Laser Engraver provider.add("gtceu.machine.lv_laser_engraver.tooltip", "§7Don't look directly at the Laser"); provider.add("gtceu.machine.mv_laser_engraver.tooltip", "§7Don't look directly at the Laser"); provider.add("gtceu.machine.hv_laser_engraver.tooltip", "§7Don't look directly at the Laser"); @@ -89,6 +259,7 @@ protected static void init(RegistrateLangProvider provider) { provider.add("gtceu.machine.zpm_laser_engraver.tooltip", "§7With the Power of 32.64 MW"); provider.add("gtceu.machine.uv_laser_engraver.tooltip", "§7Exact Photon Cannon"); + // Thermal Centrifuge provider.add("gtceu.machine.lv_thermal_centrifuge.tooltip", "§7Separating Ores more precisely"); provider.add("gtceu.machine.mv_thermal_centrifuge.tooltip", "§7Separating Ores more precisely"); provider.add("gtceu.machine.hv_thermal_centrifuge.tooltip", "§7Separating Ores more precisely"); @@ -98,6 +269,7 @@ protected static void init(RegistrateLangProvider provider) { provider.add("gtceu.machine.zpm_thermal_centrifuge.tooltip", "§7Blaze Sweatshop T-6352"); provider.add("gtceu.machine.uv_thermal_centrifuge.tooltip", "§7Fire Cyclone"); + // Electrolyzer provider.add("gtceu.machine.lv_electrolyzer.tooltip", "§7Electrolyzing Molecules"); provider.add("gtceu.machine.mv_electrolyzer.tooltip", "§7Electrolyzing Molecules"); provider.add("gtceu.machine.hv_electrolyzer.tooltip", "§7Electrolyzing Molecules"); @@ -107,6 +279,7 @@ protected static void init(RegistrateLangProvider provider) { provider.add("gtceu.machine.zpm_electrolyzer.tooltip", "§7Molecular Disintegrator E-4908"); provider.add("gtceu.machine.uv_electrolyzer.tooltip", "§7Atomic Ionizer"); + // Lathe provider.add("gtceu.machine.lv_lathe.tooltip", "§7Produces Rods more efficiently"); provider.add("gtceu.machine.mv_lathe.tooltip", "§7Produces Rods more efficiently"); provider.add("gtceu.machine.hv_lathe.tooltip", "§7Produces Rods more efficiently"); @@ -116,6 +289,7 @@ protected static void init(RegistrateLangProvider provider) { provider.add("gtceu.machine.zpm_lathe.tooltip", "§7Turn-O-Matic L-5908"); provider.add("gtceu.machine.uv_lathe.tooltip", "§7Rotation Grinder"); + // Ore Washer provider.add("gtceu.machine.lv_ore_washer.tooltip", "§7Getting more Byproducts from your Ores"); provider.add("gtceu.machine.mv_ore_washer.tooltip", "§7Getting more Byproducts from your Ores"); provider.add("gtceu.machine.hv_ore_washer.tooltip", "§7Getting more Byproducts from your Ores"); @@ -125,233 +299,216 @@ protected static void init(RegistrateLangProvider provider) { provider.add("gtceu.machine.zpm_ore_washer.tooltip", "§7Repurposed Laundry-Washer I-362"); provider.add("gtceu.machine.uv_ore_washer.tooltip", "§7Miniature Car Wash"); + // Electric Furnace standardTooltips(provider, "gtceu.machine", "electric_furnace", "Not like using a Commodore 64", "Electron Excitement Processor", "Atom Stimulator"); + // Alloy Smelter standardTooltips(provider, "gtceu.machine", "alloy_smelter", "HighTech combination Smelter", "Alloy Integrator", "Metal Amalgamator"); + // Arc Furnace standardTooltips(provider, "gtceu.machine", "arc_furnace", "Who needs a Blast Furnace?", "Discharge Heater", "Short Circuit Heater"); + // Assembler standardTooltips(provider, "gtceu.machine", "assembler", "Avengers, Assemble!", "NOT a Crafting Table", "Assembly Constructor"); + // Autoclave standardTooltips(provider, "gtceu.machine", "autoclave", "Crystallizing your Dusts", "Pressure Cooker", "Encumbrance Unit"); + // Bender standardTooltips(provider, "gtceu.machine", "bender", "Boo, he's bad! We want BENDER!!!", "Shape Distorter", "Matter Deformer"); + // Brewery standardTooltips(provider, "gtceu.machine", "brewery", "Compact and efficient potion brewing", "Brewing your Drinks", "Brew Rusher"); + // Canner standardTooltips(provider, "gtceu.machine", "canner", "Puts things into and out of Containers", "Can Operator", "Can Actuator"); + // Chemical Bath standardTooltips(provider, "gtceu.machine", "chemical_bath", "Bathing Ores in Chemicals to separate them", "Chemical Soaker", "Chemical Dunktron"); + // Chemical Reactor standardTooltips(provider, "gtceu.machine", "chemical_reactor", "Letting Chemicals react with each other", "Chemical Performer", "Reaction Catalyzer"); + // Compressor standardTooltips(provider, "gtceu.machine", "compressor", "Compress-O-Matic C77", "Singularity Condenser", "Matter Constrictor"); + // Cutter standardTooltips(provider, "gtceu.machine", "cutter", "Slice'N Dice", "Matter Cleaver", "Object Divider"); + // Distillery standardTooltips(provider, "gtceu.machine", "distillery", "Extracting most relevant Parts of Fluids", "Condensation Separator", "Fraction Splitter"); + // Electromagnetic Separator standardTooltips(provider, "gtceu.machine", "electromagnetic_separator", "Separating the magnetic Ores from the rest", "EM Categorizer", "EMF Dispeller"); + // Extractor standardTooltips(provider, "gtceu.machine", "extractor", "Dejuicer-Device of Doom - D123", "Vacuum Extractinator", "Liquefying Sucker"); + // Extruder standardTooltips(provider, "gtceu.machine", "extruder", "Universal Machine for Metal Working", "Material Displacer", "Shape Driver"); + // Fermenter standardTooltips(provider, "gtceu.machine", "fermenter", "Fermenting Fluids", "Fermentation Hastener", "Respiration Controller"); + // Fluid Heater standardTooltips(provider, "gtceu.machine", "fluid_heater", "Heating up your Fluids", "Heat Infuser", "Thermal Imbuer"); + // Fluid Solidifier standardTooltips(provider, "gtceu.machine", "fluid_solidifier", "Cools Fluids down to form Solids", "Not an Ice Machine", "Fluid Petrificator"); + // Forge Hammer standardTooltips(provider, "gtceu.machine", "forge_hammer", "Stop, Hammertime!", "Plate Forger", "Impact Modulator"); + // Forming Press standardTooltips(provider, "gtceu.machine", "forming_press", "Imprinting Images into things", "Object Layerer", "Surface Shifter"); + // Mixer standardTooltips(provider, "gtceu.machine", "mixer", "Will it Blend?", "Matter Organizer", "Material Homogenizer"); + // Packer standardTooltips(provider, "gtceu.machine", "packer", "Puts things into and Grabs things out of Boxes", "Boxinator", "Amazon Warehouse"); + // Polarizer standardTooltips(provider, "gtceu.machine", "polarizer", "Bipolarising your Magnets", "Magnetism Inducer", "Magnetic Field Rearranger"); + // Sifter standardTooltips(provider, "gtceu.machine", "sifter", "Stay calm and keep sifting", "Sponsored by TFC", "Pulsation Filter"); + // Wiremill standardTooltips(provider, "gtceu.machine", "wiremill", "Produces Wires more efficiently", "Ingot Elongator", "Wire Transfigurator"); + // Circuit Assembler standardTooltips(provider, "gtceu.machine", "circuit_assembler", "Pick-n-Place all over the place", "Electronics Manufacturer", "Computation Factory"); + // Mass Fabricator standardTooltips(provider, "gtceu.machine", "mass_fabricator", "UUM Matter * Fabrication Squared", "Genesis Factory", "Existence Initiator"); + // Replicator standardTooltips(provider, "gtceu.machine", "replicator", "Producing the Purest of Elements", "Matter Paster", "Elemental Composer"); + // Scanner standardTooltips(provider, "gtceu.machine", "scanner", "Scans Materials and other things", "Anomaly Detector", "Electron Microscope"); - provider.add("gtceu.creative_tooltip.1", "§7You just need"); - provider.add("gtceu.creative_tooltip.2", " Creative Mode"); - provider.add("gtceu.creative_tooltip.3", "§7 to use this"); - provider.add("gtceu.machine.hull.tooltip", - "§7You just need §5I§dm§4a§cg§ei§an§ba§3t§7i§1o§5n§7 to use this"); - provider.add("gtceu.battery_buffer.average_input", "Average input: %s EU/t"); - provider.add("gtceu.battery_buffer.average_output", "Average output: %s EU/t"); - provider.add("gtceu.machine.transformer.description", "§7Transforms Energy between voltage tiers"); - provider.add("gtceu.machine.transformer.tooltip_tool_usage", - "Starts as §fTransform Down§7, use Screwdriver to change"); - provider.add("gtceu.machine.transformer.tooltip_transform_down", - "§aTransform Down: §f%dA %s EU (%s§f) -> %dA %s EU (%s§f)"); - provider.add("gtceu.machine.transformer.message_transform_down", - "Transforming Down, In: %s EU %dA, Out: %s EU %dA"); - provider.add("gtceu.machine.transformer.tooltip_transform_up", - "§cTransform Up: §f%dA %s EU (%s§f) -> %dA %s EU (%s§f)"); - provider.add("gtceu.machine.transformer.message_transform_up", - "Transforming Up, In: %s EU %dA, Out: %s EU %dA"); - - provider.add("gtceu.machine.diode.message", "Max Amperage throughput: %s"); - provider.add("gtceu.machine.diode.tooltip_tool_usage", - "Hit with a Soft Mallet to change Amperage flow."); - provider.add("gtceu.machine.diode.tooltip_general", - "Allows Energy Flow in one direction and limits Amperage"); - provider.add("gtceu.machine.diode.tooltip_starts_at", "Starts as §f1A§7, use Soft Mallet to change"); - provider.add("gtceu.machine.energy_converter.description", "Converts Energy between EU and FE"); - provider.add("gtceu.machine.energy_converter.tooltip_tool_usage", - "Starts as §fFE Converter§7, use Soft Mallet to change"); - provider.add("gtceu.machine.energy_converter.tooltip_conversion_native", - "§cNative Conversion: §f%d FE -> %dA %d EU (%s§f)"); - provider.add("gtceu.machine.energy_converter.message_conversion_native", - "Converting Native Energy, In: %d FE, Out: %dA %d EU"); - provider.add("gtceu.machine.energy_converter.tooltip_conversion_eu", - "§aEU Conversion: §f%dA %d EU (%s§f) -> %d Native"); - provider.add("gtceu.machine.energy_converter.message_conversion_eu", - "Converting EU, In: %dA %d EU, Out: %d Native"); - provider.add("gtceu.machine.pump.tooltip", "§7The best way to empty Oceans!"); - provider.add("gtceu.machine.pump.tooltip_buckets", "§f%d §7ticks per Bucket"); - provider.add("gtceu.machine.item_collector.gui.collect_range", - "Collect within an area of %sx%s blocks"); - provider.add("gtceu.machine.item_collector.tooltip", "Collects Items around itself"); - provider.add("gtceu.machine.quantum_chest.tooltip", "§7Better than Storage Drawers"); - provider.add("gtceu.machine.quantum_chest.items_stored", "Item Amount:"); - provider.add("gtceu.machine.quantum_tank.tooltip", "§7Compact place to store all your fluids"); - - provider.add("gtceu.machine.buffer.tooltip", "A Small Buffer to store Items and Fluids"); - // Gas Collector provider.add("gtceu.machine.lv_gas_collector.tooltip", "§7Collects Gas from the air depending on the dimension"); @@ -394,200 +551,184 @@ protected static void init(RegistrateLangProvider provider) { provider.add("gtceu.machine.uiv_rock_crusher.tooltip", "§7Volcanic Formation Chamber"); provider.add("gtceu.machine.uxv_rock_crusher.tooltip", "§7Volcanic Formation Chamber"); provider.add("gtceu.machine.opv_rock_crusher.tooltip", "§7Volcanic Formation Chamber"); + } - // Fisher - provider.add("gtceu.machine.fisher.tooltip", "Costs string to fish. Consumes one string each time."); - provider.add("gtceu.machine.fisher.speed", "Catches something every %d ticks"); - provider.add("gtceu.machine.fisher.requirement", - "Requires a %dx%d centered square of water directly below."); + private static void generateGeneralMultiblockTooltips(RegistrateLangProvider provider) { + provider.add("gtceu.multiblock.dimension", "§eDimensions: §r%sx%sx%s"); - // World Accelerator - provider.add("gtceu.machine.world_accelerator.description", - "Tick accelerates nearby blocks in one of 2 modes: §fTile Entity§7 or §fRandom Tick§7. Use Screwdriver to change mode."); - provider.add("gtceu.machine.world_accelerator.working_area", "§bWorking Area:"); - provider.add("gtceu.machine.world_accelerator.working_area_tile", - " Block Entity Mode:§f Adjacent Blocks"); - provider.add("gtceu.machine.world_accelerator.working_area_random", " Random Tick Mode:§f %dx%d"); - provider.add("gtceu.machine.world_accelerator.mode_tile", "Block Entity Mode"); - provider.add("gtceu.machine.world_accelerator.mode_entity", "Random Tick Mode"); + provider.add("gtceu.machine.parallel_limit", "Can run up to §b%d§r§7 Recipes at once."); + } - // Forming Press - provider.add("gtceu.forming_press.naming.press", "§oNamed Press"); - provider.add("gtceu.forming_press.naming.to_name", "§oItem to Name"); - provider.add("gtceu.forming_press.naming.named", "§oNamed Item"); + private static void generateCustomMultiblockTooltips(RegistrateLangProvider provider) { + // Primitive Water Pump + provider.add("gtceu.multiblock.primitive_water_pump.description", + "The Primitive Water Pump is a pre-Steam Era multiblock that collects water once per second, depending on the Biome it is in. It can use a Pump, ULV, or LV Output Hatch, increasing the amount of water per tier. Follows the formula: Biome Coefficient * Hatch Multiplier."); + multilineLang(provider, "gtceu.multiblock.primitive_water_pump.extra1", + "Biome Coefficient:\n Ocean, River: 1000 mB/s\n Swamp: 800 mB/s\n Jungle: 350 mB/s\n Snowy: 300 mB/s\n Plains, Forest: 250 mB/s\n Taiga: 175 mB/s\n Beach: 170 mB/s\n Other: 100 mB/s"); + multilineLang(provider, "gtceu.multiblock.primitive_water_pump.extra2", + "Hatch Multipliers:\n Pump Hatch: 1x\n ULV Output Hatch: 2x\n LV Output Hatch: 4x\n\nWhile raining in the Pump's Biome, the total water production will be increased by 50%%."); + provider.add("gtceu.machine.primitive_water_pump.tooltip", "Endervoir at Home"); - // Scanner - provider.add("gtceu.scanner.copy_stick_from", "§oStick to Copy"); - provider.add("gtceu.scanner.copy_stick_empty", "§oEmpty Stick"); - provider.add("gtceu.scanner.copy_stick_to", "§oCopy of Stick"); + // Primitive Blast Furnace + provider.add("gtceu.multiblock.primitive_blast_furnace.bronze.description", + "The Primitive Blast Furnace (PBF) is a multiblock structure used for cooking steel in the early game. Although not very fast, it will provide you with steel for your first setups."); + provider.add("gtceu.machine.primitive_blast_furnace.bronze.tooltip", "Making your first Steel"); - // rotor/tool recipes - provider.add("gtceu.auto_decomp.rotor", "Turbine Rotor"); - provider.add("gtceu.auto_decomp.tool", "Non-electric tool"); + // Electric Blast Furnace + provider.add("gtceu.machine.electric_blast_furnace.tooltip", "Where's the electric smoker?"); + provider.add("gtceu.multiblock.blast_furnace.max_temperature", "Heat Capacity: %s"); + multiLang(provider, "gtceu.machine.electric_blast_furnace.tooltip", + "For every §f900K§7 above the recipe temperature, a multiplicative §f95%%§7 energy multiplier is applied pre-overclocking.", + "For every §f1800K§7 above the recipe temperature, one overclock becomes §f100%% efficient§7 (perfect overclock).", + "For every voltage tier above §bMV§7, temperature is increased by §f100K§7."); + provider.add("gtceu.multiblock.electric_blast_furnace.description", + "The Electric Blast Furnace (EBF) is a multiblock structure used for smelting alloys, cooking metals and refining ores. It is required for obtaining high-tier alloys and metals, such as aluminium, stainless steel, titanium, and naquadah alloy."); - // HPCA Components - provider.add("gtceu.machine.hpca.empty_component.tooltip", "Just for filling space"); - provider.add("gtceu.machine.hpca.heat_sink_component.tooltip", "Free cooling! Is anything free?"); - provider.add("gtceu.machine.hpca.active_cooler_component.tooltip", "Less free, more effective cooling"); - provider.add("gtceu.machine.hpca.computation_component.tooltip", "Baby's first computation"); - provider.add("gtceu.machine.hpca.advanced_computation_component.tooltip", "Computation big leagues"); - provider.add("gtceu.machine.hpca.bridge_component.tooltip", - "So that's where the \"Array\" in HPCA comes from"); - - provider.add("gtceu.machine.hpca.computation_component.damaged.name", - "Damaged HPCA Computation Component"); - provider.add("gtceu.machine.hpca.computation_component.damaged.tooltip", "Free recyclable materials"); - provider.add("gtceu.machine.hpca.advanced_computation_component.damaged.name", - "Damaged HPCA Advanced Computation Component"); - provider.add("gtceu.machine.hpca.advanced_computation_component.damaged.tooltip", - "It only cost an arm and a leg"); - - provider.add("gtceu.machine.hpca.component_general.upkeep_eut", "§eUpkeep Energy: §f%d EU/t"); - provider.add("gtceu.machine.hpca.component_general.max_eut", "§6Max Energy: §f%d EU/t"); - provider.add("gtceu.machine.hpca.component_type.cooler_passive", "§bCooler Type: §fPassive"); - provider.add("gtceu.machine.hpca.component_type.cooler_active", "§bCooler Type: §fActive"); - provider.add("gtceu.machine.hpca.component_type.cooler_cooling", "§aProvides: §f%d Cooling"); - provider.add("gtceu.machine.hpca.component_type.cooler_active_coolant", - "§cRequires up to: §f%d mB/t %s"); - provider.add("gtceu.machine.hpca.component_type.computation_cwut", "§9Computation: §f%d CWU/t"); - provider.add("gtceu.machine.hpca.component_type.computation_cooling", "§cRequires up to: §f%d Cooling"); - provider.add("gtceu.machine.hpca.component_type.bridge", - "Allows §fHPCA§7 to connect to §fNetwork Switches§7"); - provider.add("gtceu.machine.hpca.component_type.damaged", "Can be damaged by HPCA overheating!"); - - multiLang(provider, "gtceu.machine.electric_blast_furnace.tooltip", - "For every §f900K§7 above the recipe temperature, a multiplicative §f95%%§7 energy multiplier is applied pre-overclocking.", - "For every §f1800K§7 above the recipe temperature, one overclock becomes §f100%% efficient§7 (perfect overclock).", - "For every voltage tier above §bMV§7, temperature is increased by §f100K§7."); - - provider.add("gtceu.machine.coke_oven_hatch.tooltip", "§7Allows automation access for the Coke Oven."); - - provider.add("gtceu.machine.canner.jei_description", - "You can fill and empty any fluid containers with the Fluid Canner (e.g. Buckets or Fluid Cells)"); - - provider.add("gtceu.machine.large_combustion_engine.tooltip.boost_regular", - "Supply §f20 mB/s§7 of Oxygen to produce up to §f%s EU/t§7 at §f2x§7 fuel consumption."); - provider.add("gtceu.machine.large_combustion_engine.tooltip.boost_extreme", - "Supply §f80 mB/s§7 of Liquid Oxygen to produce up to §f%s EU/t§7 at §f2x§7 fuel consumption."); - - provider.add("gtceu.machine.fusion_reactor.capacity", "§7Maximum Energy Storage: §e%sM EU"); - provider.add("gtceu.machine.fusion_reactor.overclocking", - "Overclocks double energy and halve duration."); - // Miner - provider.add("gtceu.machine.miner.tooltip", "§7Mines ores below the Miner! Starts as §f%sx%s §7area"); - provider.add("gtceu.machine.miner.per_block", "§7takes §f%ds §7per Block"); - provider.add("gtceu.machine.miner.multi.modes", "Has Silk Touch and Chunk Aligned Modes."); - provider.add("gtceu.machine.miner.multi.production", - "Produces §f3x§7 more crushed ore than a §fMacerator§7."); - provider.add("gtceu.machine.miner.fluid_usage", "Uses §f%d mB/t §7of §f%s§7, doubled per overclock."); - provider.add("gtceu.machine.miner.multi.description", - "A multiblock mining machine that covers a large area and produces huge quantity of ore."); - provider.add("gtceu.machine.miner.startx", "sX: %d"); - provider.add("gtceu.machine.miner.starty", "sY: %d"); - provider.add("gtceu.machine.miner.startz", "sZ: %d"); - provider.add("gtceu.machine.miner.minex", "mX: %d"); - provider.add("gtceu.machine.miner.miney", "mY: %d"); - provider.add("gtceu.machine.miner.minez", "mZ: %d"); - provider.add("gtceu.machine.miner.radius", "Radius: %d"); - provider.add("gtceu.machine.miner.chunkradius", "Chunk Radius: %d"); - - provider.add("gtceu.machine.fluid_drilling_rig.description", - "§7Drills fluids from veins under bedrock."); - provider.add("gtceu.machine.fluid_drilling_rig.production", - "§eProduction Multiplier: §f%dx, %fx overclocked"); - provider.add("gtceu.machine.fluid_drilling_rig.depletion", "§bDepletion Rate: §f%s%%"); - - provider.add("gtceu.machine.bedrock_ore_miner.description", "§7Drills ores from veins under bedrock."); - provider.add("gtceu.machine.bedrock_ore_miner.production", - "§eProduction Multiplier: §f%dx, %fx overclocked"); - provider.add("gtceu.machine.bedrock_ore_miner.depletion", "§bDepletion Rate: §f%s%%"); - - // Cleanroom - multiLang(provider, "gtceu.machine.cleanroom.tooltip", - "Place machines inside to run cleanroom recipes.", - "Uses §f30 EU/t§7 when dirty, §f4 EU/t§7 when clean.", - "Overclocking increases cleaning per cycle.", - "§bSize: §f5x5x5 to 15x15x15", - "Requires §fFilter Casings §7in the ceiling, excluding the edges.", - "Accepts up to §f4 Doors§7! Remains clean when the door is open.", - "Generators, Mufflers, Drills, and Primitive Machines are too dirty for the cleanroom!", - "Send power through §fHulls §7or §fDiodes §7in the walls."); - provider.add("gtceu.machine.cleanroom.tooltip.hold_ctrl", - "Hold CTRL to show additional Structure Information"); - provider.add("gtceu.machine.cleanroom.tooltip.ae2.channels", - "Send up to §f8 AE2 Channels §7through §fHulls§7 in the walls."); - provider.add("gtceu.machine.cleanroom.tooltip.ae2.no_channels", - "Send §aAE2 Networks§7 through §fHulls§7 in the walls."); - provider.add("gtceu.multiblock.cleanroom.clean_state", "Status: §aCLEAN"); - provider.add("gtceu.multiblock.cleanroom.dirty_state", "Status: §4CONTAMINATED"); - provider.add("gtceu.multiblock.cleanroom.clean_amount", "Cleanliness: §a%s%%"); - multilineLang(provider, "gtceu.multiblock.dimensions", "Dimensions: \n" + - " §c§lWidth§r: %s, §a§lHeight§r: %s, §9§lDepth§r: %s "); - - multiLang(provider, "gtceu.machine.charcoal_pile.tooltip", - "Turns Logs into §aCharcoal§7 when §cignited§7.", - "Right Click with fire-starting items to start.", - "Pyrolysis occurs in up to a §b9x4x9§7 space beneath.", - "Logs must be not be exposed to §eAir§7!"); - multilineLang(provider, "gtceu.multiblock.charcoal_pile.description", - "Converts logs into Brittle Charcoal in a 9x4x9 area beneath it.\n\nThe floor of the pit must be made from bricks, and any ground-related block can be used for the walls and roof. No air can be inside the pit.\n\nLarger pits take more time to process logs, but are more efficient."); - - provider.add("gtceu.multiblock.central_monitor.low_power", "Low Power"); - provider.add("gtceu.multiblock.central_monitor.height", "Screen Height:"); - provider.add("gtceu.multiblock.central_monitor.width", "Screen Width: %d"); - provider.add("gtceu.multiblock.central_monitor.height_modify", "Modify Height: %d"); - multiLang(provider, "gtceu.multiblock.central_monitor.tooltip", - "This is a machine that monitors machines proxied by the Digital Interface Cover. You can easily monitor the Fluids, Items, Energy, and States of machines proxied in Energy Network.", - "You can build the central monitor screen from 3X2 to %dX%d (width X height).", - "The default height is 3. You can adjust the screen height in the GUI before the structure is formed.", - "Energy consumption: %d EU/s for each screen."); - multiLang(provider, "gtceu.multiblock.monitor_screen.tooltip", - "The GUI can be opened with a right-click of a screwdriver.", - "The proxy mode of Digital Interface Cover can delegate machines' capabilities and GUI. (Yes, you can connect pipes directly on the screen.)", - "The screen also supports plugins."); + // Coke Oven + provider.add("gtceu.machine.coke_oven.tooltip", "Making better fuels for Steel and Power"); + provider.add("gtceu.multiblock.coke_oven.description", + "The Coke Oven is a multiblock structure used for getting coke and creosote in the early game. It doesn't require fuel and has an internal tank of 32 buckets for creosote. Its inventory can be accessed via its Coke Oven Hatch."); + // Steam Grinder provider.add("gtceu.multiblock.steam_grinder.description", "A Multiblock Macerator at the Steam Age. Requires at least 14 Bronze Casings to form. Cannot use normal Input/Output busses, nor Fluid Hatches other than the Steam Hatch."); + provider.add("gtceu.machine.steam_grinder.tooltip", "A multiblock Macerator without the Byproducts"); + + // Steam Oven + provider.add("gtceu.multiblock.steam_oven.description", + "A Multi Smelter at the Steam Age. Requires at least 6 Bronze Casings to form. Cannot use normal Input/Output busses, nor Fluid Hatches other than the Steam Hatch. Steam Hatch must be on the bottom layer, no more than one."); + provider.add("gtceu.machine.steam_oven.tooltip", "Not to be confused with Multi-Smelter"); + + // General Steam Multiblocks provider.add("gtceu.multiblock.steam.low_steam", "Not enough Steam to run!"); provider.add("gtceu.multiblock.steam.steam_stored", "Steam: %s / %s mb"); provider.add("gtceu.multiblock.steam.duration_modifier", "Takes §f1.5x §7base duration to process, not affected by number of items."); provider.add("gtceu.machine.steam.steam_hatch.tooltip", "§eAccepted Fluid: §fSteam"); provider.add("gtceu.machine.steam_bus.tooltip", "Does not work with non-steam multiblocks"); - provider.add("gtceu.multiblock.steam_oven.description", - "A Multi Smelter at the Steam Age. Requires at least 6 Bronze Casings to form. Cannot use normal Input/Output busses, nor Fluid Hatches other than the Steam Hatch. Steam Hatch must be on the bottom layer, no more than one."); provider.add("gtceu.multiblock.require_steam_parts", "Requires Steam Hatches and Buses!"); - provider.add("gtceu.multiblock.title", "Multiblock Pattern"); - // Misc multiblock descriptions - provider.add("gtceu.multiblock.primitive_blast_furnace.bronze.description", - "The Primitive Blast Furnace (PBF) is a multiblock structure used for cooking steel in the early game. Although not very fast, it will provide you with steel for your first setups."); - provider.add("gtceu.multiblock.coke_oven.description", - "The Coke Oven is a multiblock structure used for getting coke and creosote in the early game. It doesn't require fuel and has an internal tank of 32 buckets for creosote. Its inventory can be accessed via its Coke Oven Hatch."); + // Large Boiler + provider.add("gtceu.multiblock.large_boiler.description", + "Large Boilers are multiblocks that generate steam from an energy source and water. Said energy source is either any Solid Fuel with a Burn Time, or a Diesel/Semi-Fluid Fuel. Can be throttled back in increments of 5%% to reduce Steam output and Fuel consumption."); + provider.add("gtceu.machine.large_boiler.bronze.tooltip", "We need more Steam!"); + provider.add("gtceu.machine.large_boiler.steel.tooltip", "Charcoal Incinerator"); + provider.add("gtceu.machine.large_boiler.titanium.tooltip", "Where's the Magic Super Fuel?"); + provider.add("gtceu.machine.large_boiler.tungstensteel.tooltip", "How do you even fuel this thing?"); + provider.add("gtceu.multiblock.large_boiler.max_temperature", + "Max Temperature: %dK, Steam Production: %dmB/t"); + provider.add("gtceu.multiblock.large_boiler.efficiency", "Efficiency: %s"); + provider.add("gtceu.multiblock.large_boiler.temperature", "Temperature: %sK / %sK"); + provider.add("gtceu.multiblock.large_boiler.steam_output", "Steam Output: %s mB/t"); + provider.add("gtceu.multiblock.large_boiler.throttle", "Throttle: %d"); + provider.add("gtceu.multiblock.large_boiler.throttle.tooltip", + "Boiler can output less Steam and consume less fuel (efficiency is not lost, does not affect heat-up time)"); + provider.add("gtceu.multiblock.large_boiler.throttle_modify", "Modify Throttle:"); + provider.add("gtceu.multiblock.large_boiler.rate_tooltip", + "§7Produces §f%d L §7of Steam with §f1 Coal"); + provider.add("gtceu.multiblock.large_boiler.heat_time_tooltip", "§7Takes §f%d seconds §7to boiling up"); + provider.add("gtceu.multiblock.large_boiler.explosion_tooltip", + "Will explode if provided Fuel with no Water"); + + // Multi Smelter + provider.add("gtceu.machine.multi_furnace.tooltip", "Just like the Oven at Home"); + provider.add("gtceu.multiblock.multi_furnace.description", + "The Multi Smelter is a multiblock structure used for smelting massive amounts of items at once. Different tiers of coils provide a speed boost and energy efficiency gain. 32 is the base value of items smelted per operation, and can be multiplied by using higher level coils."); + provider.add("gtceu.multiblock.multi_furnace.heating_coil_level", "Heating Coil Level: %s"); + provider.add("gtceu.multiblock.multi_furnace.heating_coil_discount", "Heating Coil EU Boost: %sx"); + + // Large Chemical Reactor + provider.add("gtceu.multiblock.large_chemical_reactor.description", + "The Large Chemical Reactor performs chemical reactions at 100%% energy efficiency. Overclocks multiply both speed and energy by 4. The multiblock requires exactly 1 Cupronickel Coil Block, which must be placed adjacent to the PTFE Pipe casing located in the center."); + provider.add("gtceu.machine.large_chemical_reactor.tooltip", "Black Box Reactor"); + + // Vacuum Freezer + provider.add("gtceu.machine.vacuum_freezer.tooltip", "Aluminium Ice Box"); provider.add("gtceu.multiblock.vacuum_freezer.description", "The Vacuum Freezer is a multiblock structure mainly used for freezing Hot Ingots into regular Ingots. However, it can also freeze other substances, such as Water."); - provider.add("gtceu.multiblock.implosion_compressor.description", - "The Implosion Compressor is a multiblock structure that uses explosives to turn gem dusts into their corresponding gems."); + + // Pyrolyse Oven provider.add("gtceu.multiblock.pyrolyse_oven.description", "The Pyrolyse Oven is a multiblock structure used for turning Logs into Charcoal and Creosote Oil, or Ash and Heavy Oil."); + provider.add("gtceu.machine.pyrolyse_oven.tooltip", "Electric Coke Oven"); + provider.add("gtceu.machine.pyrolyse_oven.tooltip.1", + "§6Cupronickel §7coils are §f25%%§7 slower. Every coil after §bKanthal§7 increases speed by §f50%%§7."); + provider.add("gtceu.multiblock.pyrolyse_oven.speed", "Processing Speed: %s%%"); + + // Implosion Compressor + provider.add("gtceu.machine.implosion_compressor.tooltip", "The only Machine you want to go Boom"); + provider.add("gtceu.multiblock.implosion_compressor.description", + "The Implosion Compressor is a multiblock structure that uses explosives to turn gem dusts into their corresponding gems."); + + // Cracker + provider.add("gtceu.machine.cracker.tooltip", "Makes Oil useful"); + provider.add("gtceu.machine.cracker.tooltip.1", + "Every coil after §6Cupronickel§7 reduces energy usage by §f10%%§7."); provider.add("gtceu.multiblock.cracker.description", "The Oil Cracking Unit is a multiblock structure used for turning Light and Heavy Fuel into their Cracked variants."); + provider.add("gtceu.multiblock.cracking_unit.energy", "Energy Usage: %s%%"); + + // Distillation Tower + provider.add("gtceu.machine.distillation_tower.tooltip", "Fluid Refinery"); + provider.add("gtceu.multiblock.distillation_tower.description", + "The Distillation Tower is a multiblock structure used for distilling the various types of Oil and some of their byproducts. Each layer must have exactly one output hatch, starting from the second one. The bottom layer can output items and insert fluids in any position."); + provider.add("gtceu.multiblock.distillation_tower.distilling_fluid", "Distilling %s"); + + // Assembly Line + provider.add("gtceu.multiblock.assembly_line.description", + "The Assembly Line is a large multiblock structure consisting of 5 to 16 \"slices\". In theory, it's large Assembling Machine, used for creating advanced crafting components."); + provider.add("gtceu.machine.assembly_line.tooltip", "Not a multiblock Assembling Machine!"); + + // Combustion Engine + provider.add("gtceu.machine.large_combustion_engine.tooltip", "Fuel Ignition Chamber"); + provider.add("gtceu.machine.extreme_combustion_engine.tooltip", "Extreme Chemical Energy Releaser"); + provider.add("gtceu.machine.large_combustion_engine.tooltip.boost_regular", + "Supply §f20 mB/s§7 of Oxygen to produce up to §f%s EU/t§7 at §f2x§7 fuel consumption."); + provider.add("gtceu.machine.large_combustion_engine.tooltip.boost_extreme", + "Supply §f80 mB/s§7 of Liquid Oxygen to produce up to §f%s EU/t§7 at §f2x§7 fuel consumption."); provider.add("gtceu.multiblock.large_combustion_engine.description", "The Large Combustion Engine is a multiblock structure that acts as a Combustion Generator for EV power."); provider.add("gtceu.multiblock.extreme_combustion_engine.description", "The Extreme Combustion Engine is a multiblock structure that acts as a Combustion Generator for IV power."); - provider.add("gtceu.multiblock.distillation_tower.description", - "The Distillation Tower is a multiblock structure used for distilling the various types of Oil and some of their byproducts. Each layer must have exactly one output hatch, starting from the second one. The bottom layer can output items and insert fluids in any position."); - provider.add("gtceu.multiblock.electric_blast_furnace.description", - "The Electric Blast Furnace (EBF) is a multiblock structure used for smelting alloys, cooking metals and refining ores. It is required for obtaining high-tier alloys and metals, such as aluminium, stainless steel, titanium, and naquadah alloy."); - provider.add("gtceu.multiblock.multi_furnace.description", - "The Multi Smelter is a multiblock structure used for smelting massive amounts of items at once. Different tiers of coils provide a speed boost and energy efficiency gain. 32 is the base value of items smelted per operation, and can be multiplied by using higher level coils."); - provider.add("gtceu.multiblock.large_boiler.description", - "Large Boilers are multiblocks that generate steam from an energy source and water. Said energy source is either any Solid Fuel with a Burn Time, or a Diesel/Semi-Fluid Fuel. Can be throttled back in increments of 5%% to reduce Steam output and Fuel consumption."); + provider.add("gtceu.multiblock.large_combustion_engine.lubricant_amount", "Lubricant Amount: %sL"); + provider.add("gtceu.multiblock.large_combustion_engine.oxygen_amount", "Oxygen Amount: %sL"); + provider.add("gtceu.multiblock.large_combustion_engine.liquid_oxygen_amount", + "Liquid Oxygen Amount: %sL"); + provider.add("gtceu.multiblock.large_combustion_engine.oxygen_boosted", "§bOxygen boosted."); + provider.add("gtceu.multiblock.large_combustion_engine.liquid_oxygen_boosted", + "§bLiquid Oxygen boosted."); + provider.add("gtceu.multiblock.large_combustion_engine.boost_disallowed", + "§bUpgrade the Dynamo Hatch to enable Oxygen Boosting."); + provider.add("gtceu.multiblock.large_combustion_engine.supply_oxygen_to_boost", + "Supply Oxygen to boost."); + provider.add("gtceu.multiblock.large_combustion_engine.supply_liquid_oxygen_to_boost", + "Supply Liquid Oxygen to boost."); + provider.add("gtceu.multiblock.large_combustion_engine.obstructed", "Engine Intakes Obstructed."); + + // Turbines + replace(provider, "block.gtceu.steam_large_turbine", "Large Steam Turbine"); + replace(provider, "block.gtceu.gas_large_turbine", "Large Gas Turbine"); + replace(provider, "block.gtceu.plasma_large_turbine", "Large Plasma Turbine"); + provider.add("gtceu.machine.large_turbine.steam.tooltip", "Do not put your Head in it"); + provider.add("gtceu.machine.large_turbine.gas.tooltip", "Not a Jet Engine"); + provider.add("gtceu.machine.large_turbine.plasma.tooltip", "Plasma Energy Siphon"); + provider.add("gtceu.multiblock.turbine.fuel_amount", "Fuel Amount: %sL (%s)"); + provider.add("gtceu.multiblock.turbine.rotor_speed", "Rotor Speed: %s/%s RPM"); + provider.add("gtceu.multiblock.turbine.rotor_durability", "Rotor Durability: %s%%"); + provider.add("gtceu.multiblock.turbine.efficiency", "Turbine Efficiency: %s%%"); + provider.add("gtceu.multiblock.turbine.energy_per_tick", "Energy Output: %s/%s EU/t"); + provider.add("gtceu.multiblock.turbine.energy_per_tick_maxed", "Energy Output: %s EU/t"); + provider.add("gtceu.multiblock.turbine.obstructed", "Turbine Face Obstructed"); + provider.add("gtceu.multiblock.turbine.efficiency_tooltip", + "Each Rotor Holder above %s§7 adds §f10%% efficiency and multiplies EU/t by 2§7."); + provider.add("gtceu.multiblock.turbine.fuel_needed", "Consumes %s per %s ticks"); provider.add("gtceu.multiblock.large_turbine.description", "Large Turbines are multiblocks that generate power from steam, gases, and plasma by having them spin the turbine's rotor. Energy output is based on rotor efficiency and current speed of turbine. Gearbox casings are used in the center of the structure."); - provider.add("gtceu.multiblock.assembly_line.description", - "The Assembly Line is a large multiblock structure consisting of 5 to 16 \"slices\". In theory, it's large Assembling Machine, used for creating advanced crafting components."); + + // Fusion Reactor + provider.add("gtceu.machine.fusion_reactor.capacity", "§7Maximum Energy Storage: §e%sM EU"); + provider.add("gtceu.machine.fusion_reactor.overclocking", + "Overclocks double energy and halve duration."); provider.add("gtceu.multiblock.luv_fusion_reactor.description", "The Fusion Reactor MK 1 is a large multiblock structure used for fusing elements into heavier ones. It can only use LuV, ZPM, and UV Energy Hatches. For every Hatch it has, its buffer increases by 10M EU, and has a maximum of 160M."); provider.add("gtceu.multiblock.zpm_fusion_reactor.description", @@ -596,78 +737,86 @@ protected static void init(RegistrateLangProvider provider) { "The Fusion Reactor MK 3 is a large multiblock structure used for fusing elements into heavier ones. It can only use UV Energy Hatches. For every Hatch it has, its buffer increases by 40M EU, and has a maximum of 640M."); provider.add("gtceu.multiblock.fusion_reactor.energy", "EU: %d / %d"); provider.add("gtceu.multiblock.fusion_reactor.heat", "Heat: %d"); - provider.add("gtceu.multiblock.large_chemical_reactor.description", - "The Large Chemical Reactor performs chemical reactions at 100%% energy efficiency. Overclocks multiply both speed and energy by 4. The multiblock requires exactly 1 Cupronickel Coil Block, which must be placed adjacent to the PTFE Pipe casing located in the center."); - // Primitive pump - provider.add("gtceu.multiblock.primitive_water_pump.description", - "The Primitive Water Pump is a pre-Steam Era multiblock that collects water once per second, depending on the Biome it is in. It can use a Pump, ULV, or LV Output Hatch, increasing the amount of water per tier. Follows the formula: Biome Coefficient * Hatch Multiplier."); - multilineLang(provider, "gtceu.multiblock.primitive_water_pump.extra1", - "Biome Coefficient:\n Ocean, River: 1000 mB/s\n Swamp: 800 mB/s\n Jungle: 350 mB/s\n Snowy: 300 mB/s\n Plains, Forest: 250 mB/s\n Taiga: 175 mB/s\n Beach: 170 mB/s\n Other: 100 mB/s"); - multilineLang(provider, "gtceu.multiblock.primitive_water_pump.extra2", - "Hatch Multipliers:\n Pump Hatch: 1x\n ULV Output Hatch: 2x\n LV Output Hatch: 4x\n\nWhile raining in the Pump's Biome, the total water production will be increased by 50%%."); - - // Parallel - provider.add("gtceu.multiblock.parallelizable.tooltip", "Can parallelize with Parallel Control Hatches."); - - provider.add("gtceu.machine.parallel_hatch_mk5.tooltip", "Allows to run up to 4 recipes in parallel."); - provider.add("gtceu.machine.parallel_hatch_mk6.tooltip", "Allows to run up to 16 recipes in parallel."); - provider.add("gtceu.machine.parallel_hatch_mk7.tooltip", "Allows to run up to 64 recipes in parallel."); - provider.add("gtceu.machine.parallel_hatch_mk8.tooltip", - "Allows to run up to 256 recipes in parallel."); - // Hatch Limits - Mostly for GCYM Multiblocks that are Hardcoded into GTCEU - provider.add("gtceu.multiblock.exact_hatch_1.tooltip", "§fAccepts Exactly §6One §fEnergy Hatch."); - // More tooltips - provider.add("gtceu.machine.primitive_water_pump.tooltip", "Endervoir at Home"); - provider.add("gtceu.machine.primitive_blast_furnace.bronze.tooltip", "Making your first Steel"); - provider.add("gtceu.machine.electric_blast_furnace.tooltip", "Where's the electric smoker?"); - provider.add("gtceu.machine.vacuum_freezer.tooltip", "Aluminium Ice Box"); - provider.add("gtceu.machine.implosion_compressor.tooltip", "The only Machine you want to go Boom"); - provider.add("gtceu.machine.pyrolyse_oven.tooltip", "Electric Coke Oven"); - provider.add("gtceu.machine.pyrolyse_oven.tooltip.1", - "§6Cupronickel §7coils are §f25%%§7 slower. Every coil after §bKanthal§7 increases speed by §f50%%§7."); - provider.add("gtceu.machine.distillation_tower.tooltip", "Fluid Refinery"); - provider.add("gtceu.machine.multi_furnace.tooltip", "Just like the Oven at Home"); - provider.add("gtceu.machine.large_combustion_engine.tooltip", "Fuel Ignition Chamber"); - provider.add("gtceu.machine.extreme_combustion_engine.tooltip", "Extreme Chemical Energy Releaser"); - provider.add("gtceu.machine.cracker.tooltip", "Makes Oil useful"); - provider.add("gtceu.machine.cracker.tooltip.1", - "Every coil after §6Cupronickel§7 reduces energy usage by §f10%%§7."); - provider.add("gtceu.machine.large_turbine.steam.tooltip", "Do not put your Head in it"); - provider.add("gtceu.machine.large_turbine.gas.tooltip", "Not a Jet Engine"); - provider.add("gtceu.machine.large_turbine.plasma.tooltip", "Plasma Energy Siphon"); - provider.add("gtceu.machine.large_boiler.bronze.tooltip", "We need more Steam!"); - provider.add("gtceu.machine.large_boiler.steel.tooltip", "Charcoal Incinerator"); - provider.add("gtceu.machine.large_boiler.titanium.tooltip", "Where's the Magic Super Fuel?"); - provider.add("gtceu.machine.large_boiler.tungstensteel.tooltip", "How do you even fuel this thing?"); - provider.add("gtceu.machine.coke_oven.tooltip", "Making better fuels for Steel and Power"); - provider.add("gtceu.machine.assembly_line.tooltip", "Not a multiblock Assembling Machine!"); provider.add("gtceu.machine.fusion_reactor.luv.tooltip", "Atomic Alloy Smelter"); provider.add("gtceu.machine.fusion_reactor.zpm.tooltip", "A SUN DOWN ON EARTH"); provider.add("gtceu.machine.fusion_reactor.uv.tooltip", "A WHITE DWARF DOWN ON YOUR BASE"); - provider.add("gtceu.machine.large_chemical_reactor.tooltip", "Black Box Reactor"); - provider.add("gtceu.machine.steam_oven.tooltip", "Not to be confused with Multi-Smelter"); - provider.add("gtceu.machine.steam_grinder.tooltip", "A multiblock Macerator without the Byproducts"); + + // Large Miner provider.add("gtceu.machine.large_miner.ev.tooltip", "Digging Ore instead of You"); provider.add("gtceu.machine.large_miner.iv.tooltip", "Biome Excavator"); provider.add("gtceu.machine.large_miner.luv.tooltip", "Terrestrial Harvester"); - provider.add("gtceu.machine.central_monitor.tooltip", "But can it run Doom?"); - provider.add("gtceu.machine.processing_array.tooltip", "When a few Machines just doesn't cut it"); - provider.add("gtceu.machine.advanced_processing_array.tooltip", "Parallelize the World"); + provider.add("gtceu.machine.miner.multi.modes", "Has Silk Touch and Chunk Aligned Modes."); + provider.add("gtceu.machine.miner.multi.production", + "Produces §f3x§7 more crushed ore than a §fMacerator§7."); + provider.add("gtceu.machine.miner.fluid_usage", "Uses §f%d mB/t §7of §f%s§7, doubled per overclock."); + provider.add("gtceu.machine.miner.multi.description", + "A multiblock mining machine that covers a large area and produces huge quantity of ore."); + provider.add("gtceu.machine.miner.startx", "sX: %d"); + provider.add("gtceu.machine.miner.starty", "sY: %d"); + provider.add("gtceu.machine.miner.startz", "sZ: %d"); + provider.add("gtceu.machine.miner.minex", "mX: %d"); + provider.add("gtceu.machine.miner.miney", "mY: %d"); + provider.add("gtceu.machine.miner.minez", "mZ: %d"); + provider.add("gtceu.machine.miner.radius", "Radius: %d"); + provider.add("gtceu.machine.miner.chunkradius", "Chunk Radius: %d"); + provider.add("gtceu.multiblock.large_miner.done", "Done!"); + provider.add("gtceu.multiblock.large_miner.working", "Working..."); + provider.add("gtceu.multiblock.large_miner.invfull", "Inventory Full!"); + provider.add("gtceu.multiblock.large_miner.needspower", "Needs Power!"); + provider.add("gtceu.multiblock.large_miner.vent", "Venting Blocked!"); + provider.add("gtceu.multiblock.large_miner.steam", "Needs Steam!"); + provider.add("gtceu.multiblock.large_miner.radius", "Radius: §a%d§r Blocks"); + provider.add("gtceu.multiblock.large_miner.errorradius", "§cCannot change radius while working!"); + provider.add("gtceu.multiblock.large_miner.needsfluid", "Needs Drilling Fluid"); + + // Fluid Drilling Rig + provider.add("gtceu.machine.fluid_drilling_rig.description", + "§7Drills fluids from veins under bedrock."); + provider.add("gtceu.machine.fluid_drilling_rig.production", + "§eProduction Multiplier: §f%dx, %fx overclocked"); + provider.add("gtceu.machine.fluid_drilling_rig.depletion", "§bDepletion Rate: §f%s%%"); provider.add("gtceu.machine.mv_fluid_drilling_rig.tooltip", "Oil Extraction Pump"); provider.add("gtceu.machine.hv_fluid_drilling_rig.tooltip", "Does not perform Fracking"); provider.add("gtceu.machine.ev_fluid_drilling_rig.tooltip", "Well Drainer"); - provider.add("gtceu.machine.cleanroom.tooltip", "Keeping those pesky particles out"); - provider.add("gtceu.machine.charcoal_pile.tooltip", "Underground fuel bakery"); + provider.add("gtceu.multiblock.fluid_rig.drilled_fluid", "Fluid: %s"); + provider.add("gtceu.multiblock.fluid_rig.no_fluid_in_area", "None in Area."); + provider.add("gtceu.multiblock.fluid_rig.fluid_amount", "Pumping Rate: %s"); + provider.add("gtceu.multiblock.fluid_rig.vein_depletion", "Vein Size: %s"); + provider.add("gtceu.multiblock.fluid_rig.vein_depleted", "Vein Depleted."); - multiLang(provider, "gtceu.machine.data_bank.tooltip", - "Your Personal NAS", - "Bulk Data Storage. Transfer with Optical Cables.", - "Data Banks can be chained together.", - "Uses §f%s EU/t§7 per Data/Optical Hatch normally.", - "Uses §f%s EU/t§7 per Data/Optical Hatch when chained."); - provider.add("gtceu.multiblock.data_bank.description", - "The Data Bank is a multiblock structure used for sharing Assembly Line Research Data between multiple Assembly Lines. Additionally, it enables Assembly Lines to read more complex research data on Data Modules."); + // Bedrock Miner + provider.add("gtceu.machine.bedrock_ore_miner.description", "§7Drills ores from veins under bedrock."); + provider.add("gtceu.machine.bedrock_ore_miner.production", + "§eProduction Multiplier: §f%dx, %fx overclocked"); + provider.add("gtceu.machine.bedrock_ore_miner.depletion", "§bDepletion Rate: §f%s%%"); + provider.add("gtceu.multiblock.ore_rig.drilled_ores_list", "Ores:"); + provider.add("gtceu.multiblock.ore_rig.drilled_ore_entry", " - %s"); + provider.add("gtceu.multiblock.ore_rig.ore_amount", "Drilling Rate: %s"); + + // Cleanroom + provider.add("gtceu.machine.cleanroom.tooltip", "Keeping those pesky particles out"); + multiLang(provider, "gtceu.machine.cleanroom.tooltip", + "Place machines inside to run cleanroom recipes.", + "Uses §f30 EU/t§7 when dirty, §f4 EU/t§7 when clean.", + "Overclocking increases cleaning per cycle.", + "§bSize: §f5x5x5 to 15x15x15", + "Requires §fFilter Casings §7in the ceiling, excluding the edges.", + "Accepts up to §f4 Doors§7! Remains clean when the door is open.", + "Generators, Mufflers, Drills, and Primitive Machines are too dirty for the cleanroom!", + "Send power through §fHulls §7or §fDiodes §7in the walls."); + provider.add("gtceu.machine.cleanroom.tooltip.hold_ctrl", + "Hold CTRL to show additional Structure Information"); + provider.add("gtceu.machine.cleanroom.tooltip.ae2.channels", + "Send up to §f8 AE2 Channels §7through §fHulls§7 in the walls."); + provider.add("gtceu.machine.cleanroom.tooltip.ae2.no_channels", + "Send §aAE2 Networks§7 through §fHulls§7 in the walls."); + provider.add("gtceu.multiblock.cleanroom.clean_state", "Status: §aCLEAN"); + provider.add("gtceu.multiblock.cleanroom.dirty_state", "Status: §4CONTAMINATED"); + provider.add("gtceu.multiblock.cleanroom.clean_amount", "Cleanliness: §a%s%%"); + multilineLang(provider, "gtceu.multiblock.dimensions", "Dimensions: \n" + + " §c§lWidth§r: %s, §a§lHeight§r: %s, §9§lDepth§r: %s "); + // Power Substation multiLang(provider, "gtceu.machine.power_substation.tooltip", "The heart of a centralized power grid", "§fCapacitors§7 do not need to be all the same tier.", @@ -676,17 +825,71 @@ protected static void init(RegistrateLangProvider provider) { "Capped at §f%d kEU/t§7 passive loss per Capacitor Block.", "Can use", " Laser Hatches§7."); + provider.add("gtceu.multiblock.power_substation.stored", "§7Stored: %s §7EU"); + provider.add("gtceu.multiblock.power_substation.capacity", "§7Capacity: %s §7EU"); + provider.add("gtceu.multiblock.power_substation.passive_drain", "§7Passive Drain: %s §7EU/t"); + provider.add("gtceu.multiblock.power_substation.average_in", "§7Avg. Input: %s §7EU/t"); + provider.add("gtceu.multiblock.power_substation.average_in_hover", + "The average inserted EU into the Power Substation's internal energy bank"); + provider.add("gtceu.multiblock.power_substation.average_out", "§7Avg. Output: %s §7EU/t"); + provider.add("gtceu.multiblock.power_substation.average_out_hover", + "The average extracted EU out of the Power Substation's internal energy bank"); + provider.add("gtceu.multiblock.power_substation.time_to_fill", "§7Time to fill: %s"); + provider.add("gtceu.multiblock.power_substation.time_to_drain", "§7Time to drain: %s"); + provider.add("gtceu.multiblock.power_substation.time_seconds", "%s Seconds"); + provider.add("gtceu.multiblock.power_substation.time_minutes", "%s Minutes"); + provider.add("gtceu.multiblock.power_substation.time_hours", "%s Hours"); + provider.add("gtceu.multiblock.power_substation.time_days", "%s Days"); + provider.add("gtceu.multiblock.power_substation.time_years", "%s Years"); + provider.add("gtceu.multiblock.power_substation.time_forever", "Forever"); + provider.add("gtceu.multiblock.power_substation.under_one_hour_left", + "Less than 1 hour until fully drained!"); + // Active Transformer multiLang(provider, "gtceu.machine.active_transformer.tooltip", "§7Transformers: Lasers in Disguise", "§7Can combine any number of Energy §fInputs§7 into any number of Energy §fOutputs§7.", "§7Can transmit power at incredible distance with", " Lasers§7."); + provider.add("gtceu.multiblock.active_transformer.average_in", "§bAvg. Input: §f%s EU/t"); + provider.add("gtceu.multiblock.active_transformer.average_out", "§bAvg. Output: §f%s EU/t"); + provider.add("gtceu.multiblock.active_transformer.max_input", "§aMax Input: §f%s EU/t"); + provider.add("gtceu.multiblock.active_transformer.max_output", "§cMax Output: §f%s EU/t"); + provider.add("gtceu.multiblock.active_transformer.danger_enabled", "§c§bDANGER: Explosive"); - provider.add("gtceu.machine.laser_hatch.source.tooltip", "§7Transmitting power at distance"); - provider.add("gtceu.machine.laser_hatch.target.tooltip", "§7Receiving power from distance"); - provider.add("gtceu.machine.laser_hatch.both.tooltip", "§cLaser Cables must be in a straight line!§7"); + // Charcoal Pile Ignitor + provider.add("gtceu.machine.charcoal_pile.tooltip", "Underground fuel bakery"); + multiLang(provider, "gtceu.machine.charcoal_pile.tooltip", + "Turns Logs into §aCharcoal§7 when §cignited§7.", + "Right Click with fire-starting items to start.", + "Pyrolysis occurs in up to a §b9x4x9§7 space beneath.", + "Logs must be not be exposed to §eAir§7!"); + multilineLang(provider, "gtceu.multiblock.charcoal_pile.description", + "Converts logs into Brittle Charcoal in a 9x4x9 area beneath it.\n\n" + + "The floor of the pit must be made from bricks, and any ground-related block can be used for the walls and roof.\n" + + "No air can be inside the pit.\n\nLarger pits take more time to process logs, but are more efficient."); + + // Central Monitor + provider.add("gtceu.multiblock.central_monitor.low_power", "Low Power"); + provider.add("gtceu.multiblock.central_monitor.height", "Screen Height:"); + provider.add("gtceu.multiblock.central_monitor.width", "Screen Width: %d"); + provider.add("gtceu.multiblock.central_monitor.height_modify", "Modify Height: %d"); + multiLang(provider, "gtceu.multiblock.central_monitor.tooltip", + "This is a machine that monitors machines proxied by the Digital Interface Cover. You can easily monitor the Fluids, Items, Energy, and States of machines proxied in Energy Network.", + "You can build the central monitor screen from 3X2 to %dX%d (width X height).", + "The default height is 3. You can adjust the screen height in the GUI before the structure is formed.", + "Energy consumption: %d EU/s for each screen."); + multiLang(provider, "gtceu.multiblock.monitor_screen.tooltip", + "The GUI can be opened with a right-click of a screwdriver.", + "The proxy mode of Digital Interface Cover can delegate machines' capabilities and GUI. (Yes, you can connect pipes directly on the screen.)", + "The screen also supports plugins."); + provider.add("gtceu.machine.central_monitor.tooltip", "But can it run Doom?"); + + // Processing Array + provider.add("gtceu.machine.processing_array.tooltip", "When a few Machines just doesn't cut it"); + provider.add("gtceu.machine.advanced_processing_array.tooltip", "Parallelize the World"); + // Research Station multiLang(provider, "gtceu.machine.research_station.tooltip", "More than just a Multiblock Scanner", "Used to scan onto §fData Orbs§7 and §fData Modules§7.", @@ -696,6 +899,7 @@ protected static void init(RegistrateLangProvider provider) { "The Research Station is a multiblock structure used for researching much more complex Assembly Line Research Data. Any Research requiring a Data Orb or Data Module must be scanned in the Research Station. Requires Compute Work Units (CWU/t) to research recipes, which is supplied by High Performance Computing Arrays (HPCAs)."); provider.add("gtceu.machine.research_station.researching", "Researching."); + // Network Switch multiLang(provider, "gtceu.machine.network_switch.tooltip", "Ethernet Hub", "Used to route and distribute §fComputation§7.", @@ -704,43 +908,108 @@ protected static void init(RegistrateLangProvider provider) { provider.add("gtceu.multiblock.network_switch.description", "The Network Switch is a multiblock structure used for distributing Computation from many sources to many destinations. It can accept any number of Computation Data Reception or Transmission Hatches. It is necessary for Research Data which requires much higher Computation, as the Research Station can only accept one Computation Data Reception Hatch. HPCAs must have a Bridge Component for the Network Switch to be able to access their Computation."); + // Data Bank + multiLang(provider, "gtceu.machine.data_bank.tooltip", + "Your Personal NAS", + "Bulk Data Storage. Transfer with Optical Cables.", + "Data Banks can be chained together.", + "Uses §f%s EU/t§7 per Data/Optical Hatch normally.", + "Uses §f%s EU/t§7 per Data/Optical Hatch when chained."); + provider.add("gtceu.multiblock.data_bank.description", + "The Data Bank is a multiblock structure used for sharing Assembly Line Research Data between multiple Assembly Lines. Additionally, it enables Assembly Lines to read more complex research data on Data Modules."); + + provider.add("gtceu.multiblock.data_bank.providing", "Providing data."); + + // HPCA multiLang(provider, "gtceu.machine.high_performance_computation_array.tooltip", "Just your average Supercomputer", "Used to generate §fComputation§7 (and heat).", "Requires HPCA components to generate §fCWU/t§7 (Compute Work Units)."); provider.add("gtceu.multiblock.hpca.description", "The High Performance Computing Array (HPCA) is a multiblock structure used for creating Compute Work Units (CWU/t) for more complex Assembly Line Research Data. The structure has a flexible 3x3 area which can be filled in any way with HPCA components. Different components can provide different amounts of Computation, Cooling, as well as Energy Cost, Coolant Cost, and Heat Production. When used with a Bridge Component, the HPCA can connect to Network Switches for combining and routing Computation from multiple sources to one or more destinations."); + provider.add("gtceu.multiblock.hpca.computation", "Providing: %s"); + provider.add("gtceu.multiblock.hpca.energy", "Using: %s / %s EU/t (%s)"); + provider.add("gtceu.multiblock.hpca.temperature", "Temperature: %s"); + provider.add("gtceu.multiblock.hpca.hover_for_info", "Hover for details"); + provider.add("gtceu.multiblock.hpca.error_damaged", "Damaged component in structure!"); + provider.add("gtceu.multiblock.hpca.error_temperature", + "Temperature above 100C, components may be damaged!"); + provider.add("gtceu.multiblock.hpca.warning_temperature", + "Temperature above 50C, components may be damaged at 100C!"); + provider.add("gtceu.multiblock.hpca.warning_temperature_active_cool", "Fully utilizing active coolers"); + provider.add("gtceu.multiblock.hpca.warning_structure_header", "Structure Warnings:"); + provider.add("gtceu.multiblock.hpca.warning_multiple_bridges", + "- Multiple bridges in structure (provides no additional benefit)"); + provider.add("gtceu.multiblock.hpca.warning_no_computation", "- No computation providers"); + provider.add("gtceu.multiblock.hpca.warning_low_cooling", "- Not enough cooling"); + provider.add("gtceu.multiblock.hpca.info_max_computation", "Max CWU/t: %s"); + provider.add("gtceu.multiblock.hpca.info_max_cooling_demand", "Cooling Demand: %s"); + provider.add("gtceu.multiblock.hpca.info_max_cooling_available", "Cooling Available: %s"); + provider.add("gtceu.multiblock.hpca.info_max_coolant_required", "Coolant Needed: %s"); + provider.add("gtceu.multiblock.hpca.info_coolant_name", "PCB Coolant"); + provider.add("gtceu.multiblock.hpca.info_bridging_enabled", "Bridging Enabled"); + provider.add("gtceu.multiblock.hpca.info_bridging_disabled", "Bridging Disabled"); - multiLang(provider, "gtceu.machine.laser_source_hatch.tooltip", - "Transmitting power at distance", - "§cLaser cables must be in a straight line!§7"); + // Multiblock Tanks + provider.add("gtceu.machine.multiblock.tank.tooltip", + "Fill and drain through the controller or tank valves."); + provider.add("gtceu.machine.tank_valve.tooltip", + "Use to fill and drain multiblock tanks. Auto outputs when facing down."); + provider.add("gtceu.machine.fluid_tank.max_multiblock", "Max Multiblock Size: %dx%dx%d"); + provider.add("gtceu.machine.fluid_tank.fluid", "Contains %s L of %s"); + } - multiLang(provider, "gtceu.machine.laser_target_hatch.tooltip", - "Receiving power from distance", - "§cLaser cables must be in a straight line!§7"); + private static void generateCustomMultiblockPartTooltips(RegistrateLangProvider provider) { + // Primitive Pump Hatch + provider.add("gtceu.machine.pump_hatch.tooltip", "Primitive Fluid Output for Water Pump"); - multiLang(provider, "gtceu.machine.endpoint.tooltip", - "Connect with §fLong Distance Pipe§7 blocks to create a pipeline.", - "Pipelines must have exactly §f1 Input§7 and §f1 Output§7 endpoint.", - "Only pipeline endpoints need to be §fchunk-loaded§7."); - provider.add("block.gtceu.long_distance_item_pipeline_no_network", "No network found"); - provider.add("block.gtceu.long_distance_item_pipeline_input_endpoint", "Input Endpoint"); - provider.add("block.gtceu.long_distance_item_pipeline_output_endpoint", "Output Endpoint"); - provider.add("block.gtceu.long_distance_item_pipeline_network_header", "Network:"); - provider.add("block.gtceu.long_distance_item_pipeline_pipe_count", " - Pipes: %s"); - provider.add("block.gtceu.long_distance_item_pipeline_input_pos", " - Input: %s"); - provider.add("block.gtceu.long_distance_item_pipeline_output_pos", " - Output: %s"); - provider.add("gtceu.machine.endpoint.tooltip.min_length", "§bMinimum Endpoint Distance: §f%d Blocks"); + // Coke Oven Hatch + provider.add("gtceu.machine.coke_oven_hatch.tooltip", "§7Allows automation access for the Coke Oven."); - provider.add("gtceu.bus.collapse_true", "Bus will collapse Items"); - provider.add("gtceu.bus.collapse_false", "Bus will not collapse Items"); - provider.add("gtceu.bus.collapse.error", "Bus must be attached to multiblock first"); + // Maintenance Hatch + provider.add("gtceu.machine.maintenance_hatch.tooltip", "For maintaining Multiblocks"); + multilineLang(provider, "gtceu.machine.maintenance_hatch_configurable.tooltip", + "For finer control over Multiblocks\nStarts with no Maintenance problems!"); + provider.add("gtceu.machine.maintenance_hatch_full_auto.tooltip", + "For automatically maintaining Multiblocks"); + multiLang(provider, "gtceu.machine.maintenance_hatch_cleanroom_auto.tooltip", + "For automatically maintaining Multiblocks with Cleaning!", "Cleans as:"); + provider.add("gtceu.machine.maintenance_hatch_tool_slot.tooltip", + "Click slot with empty hand when required tools are in inventory to solve problems"); + provider.add("gtceu.machine.maintenance_hatch_tape_slot.tooltip", "Insert Tape to prevent problems"); + provider.add("gtceu.maintenance.configurable_duration", "Duration: %fx"); + provider.add("gtceu.maintenance.configurable_duration.unchanged_description", + "Recipes will run at normal speed. Change configuration to update."); + provider.add("gtceu.maintenance.configurable_duration.changed_description", + "Recipes will run with %fx duration, applied before overclocking."); + provider.add("gtceu.maintenance.configurable_duration.modify", "Modify Duration:"); + provider.add("gtceu.maintenance.configurable_time", "Time: %fx"); + provider.add("gtceu.maintenance.configurable_time.unchanged_description", + "Maintenance problems will occur at normal rate. Change configuration to update."); + provider.add("gtceu.maintenance.configurable_time.changed_description", + "Maintenance problems will occur at %fx the normal rate."); + + // Muffler Hatch + multiLang(provider, "gtceu.machine.muffler_hatch.tooltip", "Recovers waste from machines", + "DO NOT OBSTRUCT THE OUTPUT!"); + provider.add("gtceu.muffler.recovery_tooltip", "§bRecovery Chance: §f%d%%"); + + // Parallel Hatch + provider.add("gtceu.machine.parallel_hatch.display", "Adjust the maximum parallel of the multiblock"); + provider.add("gtceu.multiblock.parallelizable.tooltip", "Can parallelize with Parallel Control Hatches."); + provider.add("gtceu.machine.parallel_hatch_mk5.tooltip", "Allows to run up to 4 recipes in parallel."); + provider.add("gtceu.machine.parallel_hatch_mk6.tooltip", "Allows to run up to 16 recipes in parallel."); + provider.add("gtceu.machine.parallel_hatch_mk7.tooltip", "Allows to run up to 64 recipes in parallel."); + provider.add("gtceu.machine.parallel_hatch_mk8.tooltip", + "Allows to run up to 256 recipes in parallel."); - // Hatch tooltips + // Item/Fluid Hatches provider.add("gtceu.machine.item_bus.import.tooltip", "Item Input for Multiblocks"); provider.add("gtceu.machine.item_bus.export.tooltip", "Item Output for Multiblocks"); provider.add("gtceu.machine.fluid_hatch.import.tooltip", "Fluid Input for Multiblocks"); provider.add("gtceu.machine.fluid_hatch.export.tooltip", "Fluid Output for Multiblocks"); + + // Pattern Buffer/Proxy provider.add("block.gtceu.pattern_buffer.desc.0", "§fAllows direct §6AE2 pattern storage §ffor GregTech Multiblocks."); provider.add("block.gtceu.pattern_buffer.desc.1", @@ -765,18 +1034,7 @@ protected static void init(RegistrateLangProvider provider) { provider.add("gui.gtceu.rename.desc", "Rename Pattern Buffer"); provider.add("gui.gtceu.refund_all.desc", "Return Stored Contents to AE2"); - provider.add("gtceu.machine.dual_hatch.import.tooltip", "Item and Fluid Input for Multiblocks"); - provider.add("gtceu.machine.dual_hatch.export.tooltip", "Item and Fluid Output for Multiblocks"); - provider.add("gtceu.machine.energy_hatch.input.tooltip", "Energy Input for Multiblocks"); - provider.add("gtceu.machine.energy_hatch.input_hi_amp.tooltip", - "Multiple Ampere Energy Input for Multiblocks"); - provider.add("gtceu.machine.substation_hatch.input.tooltip", "Energy Input for the Power Substation"); - provider.add("gtceu.machine.energy_hatch.output.tooltip", "Energy Output for Multiblocks"); - provider.add("gtceu.machine.energy_hatch.output_hi_amp.tooltip", - "Multiple Ampere Energy Output for Multiblocks"); - provider.add("gtceu.machine.substation_hatch.output.tooltip", "Energy Output for the Power Substation"); - - // ME parts + // ME Hatches provider.add("gtceu.machine.me.item_export.tooltip", "Stores items directly into an ME network."); provider.add("gtceu.machine.me.fluid_export.tooltip", "Stores fluids directly into an ME network."); provider.add("gtceu.machine.me.fluid_import.tooltip", @@ -784,6 +1042,8 @@ protected static void init(RegistrateLangProvider provider) { provider.add("gtceu.machine.me.item_import.tooltip", "Fetches items from an ME network automatically."); provider.add("gtceu.machine.me.export.tooltip", "Has infinite capacity before connecting to ME network."); + + // ME Stocking multiLang(provider, "gtceu.machine.me.stocking_item.tooltip", "Retrieves items directly from the ME network", "Auto-Pull from ME mode will automatically stock the first 16 items in the ME system, updated every 5 seconds."); multiLang(provider, "gtceu.machine.me.stocking_fluid.tooltip", "Retrieves fluids directly from the ME network", @@ -796,6 +1056,8 @@ protected static void init(RegistrateLangProvider provider) { "Auto-Pull Enabled"); provider.add("gtceu.machine.me.stocking_auto_pull_disabled", "Auto-Pull Disabled"); + + // ME Data Stick Behavior provider.add("gtceu.machine.me.copy_paste.tooltip", "Sneak right-click with Data Stick to copy settings, right-click to apply"); provider.add("gtceu.machine.me.import_copy_settings", @@ -807,268 +1069,246 @@ protected static void init(RegistrateLangProvider provider) { provider.add("gtceu.machine.me.fluid_import.data_stick.name", "§oME Input Hatch Configuration Data"); - multiLang(provider, "gtceu.machine.rotor_holder.tooltip", "Rotor Holder for Multiblocks", - "Holds Rotor in place so it will not fly away"); - - // Maintenance tooltips - provider.add("gtceu.machine.maintenance_hatch.tooltip", "For maintaining Multiblocks"); - multilineLang(provider, "gtceu.machine.maintenance_hatch_configurable.tooltip", - "For finer control over Multiblocks\nStarts with no Maintenance problems!"); - provider.add("gtceu.machine.maintenance_hatch_full_auto.tooltip", - "For automatically maintaining Multiblocks"); - multiLang(provider, "gtceu.machine.maintenance_hatch_cleanroom_auto.tooltip", - "For automatically maintaining Multiblocks with Cleaning!", "Cleans as:"); - provider.add("gtceu.machine.maintenance_hatch_tool_slot.tooltip", - "Click slot with empty hand when required tools are in inventory to solve problems"); - provider.add("gtceu.machine.maintenance_hatch_tape_slot.tooltip", "Insert Tape to prevent problems"); - provider.add("gtceu.maintenance.configurable_duration", "Duration: %fx"); - provider.add("gtceu.maintenance.configurable_duration.unchanged_description", - "Recipes will run at normal speed. Change configuration to update."); - provider.add("gtceu.maintenance.configurable_duration.changed_description", - "Recipes will run with %fx duration, applied before overclocking."); - provider.add("gtceu.maintenance.configurable_duration.modify", "Modify Duration:"); - provider.add("gtceu.maintenance.configurable_time", "Time: %fx"); - provider.add("gtceu.maintenance.configurable_time.unchanged_description", - "Maintenance problems will occur at normal rate. Change configuration to update."); - provider.add("gtceu.maintenance.configurable_time.changed_description", - "Maintenance problems will occur at %fx the normal rate."); + // Dual Hatch + provider.add("gtceu.machine.dual_hatch.import.tooltip", "Item and Fluid Input for Multiblocks"); + provider.add("gtceu.machine.dual_hatch.export.tooltip", "Item and Fluid Output for Multiblocks"); - multiLang(provider, "gtceu.machine.muffler_hatch.tooltip", "Recovers waste from machines", - "DO NOT OBSTRUCT THE OUTPUT!"); - provider.add("gtceu.muffler.recovery_tooltip", "§bRecovery Chance: §f%d%%"); - provider.add("gtceu.machine.pump_hatch.tooltip", "Primitive Fluid Output for Water Pump"); - provider.add("gtceu.machine.machine_hatch.locked", "Machine Interface Locked"); - provider.add("gtceu.machine.machine_hatch.tooltip", - "Specialized Access Bus that only holds valid items"); - provider.add("gtceu.machine.machine_hatch.processing_array", - "When in the §eProcessing Array§7, only holds machines that work in the §eProcessing Array"); - provider.add("gtceu.machine.passthrough_hatch_item.tooltip", "Sends Items from one Side to the other"); - provider.add("gtceu.machine.passthrough_hatch_fluid.tooltip", - "Sends Fluids from one Side to the other"); - provider.add("gtceu.machine.fluid_tank.max_multiblock", "Max Multiblock Size: %dx%dx%d"); - provider.add("gtceu.machine.fluid_tank.fluid", "Contains %s L of %s"); + // Energy Hatch + provider.add("gtceu.machine.energy_hatch.input.tooltip", "Energy Input for Multiblocks"); + provider.add("gtceu.machine.energy_hatch.input_hi_amp.tooltip", + "Multiple Ampere Energy Input for Multiblocks"); + provider.add("gtceu.machine.substation_hatch.input.tooltip", "Energy Input for the Power Substation"); + provider.add("gtceu.machine.energy_hatch.output.tooltip", "Energy Output for Multiblocks"); + provider.add("gtceu.machine.energy_hatch.output_hi_amp.tooltip", + "Multiple Ampere Energy Output for Multiblocks"); + provider.add("gtceu.machine.substation_hatch.output.tooltip", "Energy Output for the Power Substation"); + // Rotor Holder + multiLang(provider, "gtceu.machine.rotor_holder.tooltip", "Rotor Holder for Multiblocks", + "Holds Rotor in place so it will not fly away"); + + // Data Hatches multiLang(provider, "gtceu.machine.data_access_hatch.tooltip", "Data Access for Multiblocks", "Adds §a%s§7 slots for Data Items"); provider.add("gtceu.machine.data_receiver_hatch.tooltip", "Research Data Input for Multiblocks"); provider.add("gtceu.machine.data_transmitter_hatch.tooltip", "Research Data Output for Multiblocks"); + + // Computation Hatches provider.add("gtceu.machine.computation_transmitter_hatch.tooltip", "Computation Data Output for Multiblocks"); provider.add("gtceu.machine.computation_receiver_hatch.tooltip", "Computation Data Input for Multiblocks"); - provider.add("gtceu.machine.object_holder.tooltip", "Advanced Holding Mechanism for Research Station"); - // Multiblock tooltips - provider.add("gtceu.multiblock.blast_furnace.max_temperature", "Heat Capacity: %s"); - provider.add("gtceu.multiblock.multi_furnace.heating_coil_level", "Heating Coil Level: %s"); - provider.add("gtceu.multiblock.multi_furnace.heating_coil_discount", "Heating Coil EU Boost: %sx"); - provider.add("gtceu.multiblock.distillation_tower.distilling_fluid", "Distilling %s"); - provider.add("gtceu.multiblock.large_combustion_engine.lubricant_amount", "Lubricant Amount: %sL"); - provider.add("gtceu.multiblock.large_combustion_engine.oxygen_amount", "Oxygen Amount: %sL"); - provider.add("gtceu.multiblock.large_combustion_engine.liquid_oxygen_amount", - "Liquid Oxygen Amount: %sL"); - provider.add("gtceu.multiblock.large_combustion_engine.oxygen_boosted", "§bOxygen boosted."); - provider.add("gtceu.multiblock.large_combustion_engine.liquid_oxygen_boosted", - "§bLiquid Oxygen boosted."); - provider.add("gtceu.multiblock.large_combustion_engine.boost_disallowed", - "§bUpgrade the Dynamo Hatch to enable Oxygen Boosting."); - provider.add("gtceu.multiblock.large_combustion_engine.supply_oxygen_to_boost", - "Supply Oxygen to boost."); - provider.add("gtceu.multiblock.large_combustion_engine.supply_liquid_oxygen_to_boost", - "Supply Liquid Oxygen to boost."); - provider.add("gtceu.multiblock.large_combustion_engine.obstructed", "Engine Intakes Obstructed."); - provider.add("gtceu.multiblock.turbine.fuel_amount", "Fuel Amount: %sL (%s)"); - provider.add("gtceu.multiblock.turbine.rotor_speed", "Rotor Speed: %s/%s RPM"); - provider.add("gtceu.multiblock.turbine.rotor_durability", "Rotor Durability: %s%%"); - provider.add("gtceu.multiblock.turbine.efficiency", "Turbine Efficiency: %s%%"); - provider.add("gtceu.multiblock.turbine.energy_per_tick", "Energy Output: %s/%s EU/t"); - provider.add("gtceu.multiblock.turbine.energy_per_tick_maxed", "Energy Output: %s EU/t"); - provider.add("gtceu.multiblock.turbine.obstructed", "Turbine Face Obstructed"); - provider.add("gtceu.multiblock.turbine.efficiency_tooltip", - "Each Rotor Holder above %s§7 adds §f10%% efficiency and multiplies EU/t by 2§7."); - provider.add("gtceu.multiblock.turbine.fuel_needed", "Consumes %s per %s ticks"); - provider.add("gtceu.multiblock.large_boiler.max_temperature", - "Max Temperature: %dK, Steam Production: %dmB/t"); - provider.add("gtceu.multiblock.large_boiler.efficiency", "Efficiency: %s"); - provider.add("gtceu.multiblock.large_boiler.temperature", "Temperature: %sK / %sK"); - provider.add("gtceu.multiblock.large_boiler.steam_output", "Steam Output: %s mB/t"); - provider.add("gtceu.multiblock.large_boiler.throttle", "Throttle: %d"); - provider.add("gtceu.multiblock.large_boiler.throttle.tooltip", - "Boiler can output less Steam and consume less fuel (efficiency is not lost, does not affect heat-up time)"); - provider.add("gtceu.multiblock.large_boiler.throttle_modify", "Modify Throttle:"); - provider.add("gtceu.multiblock.large_boiler.rate_tooltip", - "§7Produces §f%d L §7of Steam with §f1 Coal"); - provider.add("gtceu.multiblock.large_boiler.heat_time_tooltip", "§7Takes §f%d seconds §7to boiling up"); - provider.add("gtceu.multiblock.large_boiler.explosion_tooltip", - "Will explode if provided Fuel with no Water"); - provider.add("gtceu.multiblock.large_miner.done", "Done!"); - provider.add("gtceu.multiblock.large_miner.working", "Working..."); - provider.add("gtceu.multiblock.large_miner.invfull", "Inventory Full!"); - provider.add("gtceu.multiblock.large_miner.needspower", "Needs Power!"); - provider.add("gtceu.multiblock.large_miner.vent", "Venting Blocked!"); - provider.add("gtceu.multiblock.large_miner.steam", "Needs Steam!"); - provider.add("gtceu.multiblock.large_miner.radius", "Radius: §a%d§r Blocks"); - provider.add("gtceu.multiblock.large_miner.errorradius", "§cCannot change radius while working!"); - provider.add("gtceu.multiblock.large_miner.needsfluid", "Needs Drilling Fluid"); - provider.add("gtceu.multiblock.fluid_rig.drilled_fluid", "Fluid: %s"); - provider.add("gtceu.multiblock.fluid_rig.no_fluid_in_area", "None in Area."); - provider.add("gtceu.multiblock.fluid_rig.fluid_amount", "Pumping Rate: %s"); - provider.add("gtceu.multiblock.fluid_rig.vein_depletion", "Vein Size: %s"); - provider.add("gtceu.multiblock.fluid_rig.vein_depleted", "Vein Depleted."); - provider.add("gtceu.multiblock.ore_rig.drilled_ores_list", "Ores:"); - provider.add("gtceu.multiblock.ore_rig.drilled_ore_entry", " - %s"); - provider.add("gtceu.multiblock.ore_rig.ore_amount", "Drilling Rate: %s"); - provider.add("gtceu.multiblock.pyrolyse_oven.speed", "Processing Speed: %s%%"); - provider.add("gtceu.multiblock.cracking_unit.energy", "Energy Usage: %s%%"); - provider.add("gtceu.multiblock.power_substation.stored", "§7Stored: %s §7EU"); - provider.add("gtceu.multiblock.power_substation.capacity", "§7Capacity: %s §7EU"); - provider.add("gtceu.multiblock.power_substation.passive_drain", "§7Passive Drain: %s §7EU/t"); - provider.add("gtceu.multiblock.power_substation.average_in", "§7Avg. Input: %s §7EU/t"); - provider.add("gtceu.multiblock.power_substation.average_in_hover", - "The average inserted EU into the Power Substation's internal energy bank"); - provider.add("gtceu.multiblock.power_substation.average_out", "§7Avg. Output: %s §7EU/t"); - provider.add("gtceu.multiblock.power_substation.average_out_hover", - "The average extracted EU out of the Power Substation's internal energy bank"); - provider.add("gtceu.multiblock.power_substation.time_to_fill", "§7Time to fill: %s"); - provider.add("gtceu.multiblock.power_substation.time_to_drain", "§7Time to drain: %s"); - provider.add("gtceu.multiblock.power_substation.time_seconds", "%s Seconds"); - provider.add("gtceu.multiblock.power_substation.time_minutes", "%s Minutes"); - provider.add("gtceu.multiblock.power_substation.time_hours", "%s Hours"); - provider.add("gtceu.multiblock.power_substation.time_days", "%s Days"); - provider.add("gtceu.multiblock.power_substation.time_years", "%s Years"); - provider.add("gtceu.multiblock.power_substation.time_forever", "Forever"); - provider.add("gtceu.multiblock.power_substation.under_one_hour_left", - "Less than 1 hour until fully drained!"); - provider.add("gtceu.multiblock.active_transformer.average_in", "§bAvg. Input: §f%s EU/t"); - provider.add("gtceu.multiblock.active_transformer.average_out", "§bAvg. Output: §f%s EU/t"); - provider.add("gtceu.multiblock.active_transformer.max_input", "§aMax Input: §f%s EU/t"); - provider.add("gtceu.multiblock.active_transformer.max_output", "§cMax Output: §f%s EU/t"); - provider.add("gtceu.multiblock.active_transformer.danger_enabled", "§c§bDANGER: Explosive"); - provider.add("gtceu.multiblock.data_bank.providing", "Providing data."); - provider.add("gtceu.multiblock.hpca.computation", "Providing: %s"); - provider.add("gtceu.multiblock.hpca.energy", "Using: %s / %s EU/t (%s)"); - provider.add("gtceu.multiblock.hpca.temperature", "Temperature: %s"); - provider.add("gtceu.multiblock.hpca.hover_for_info", "Hover for details"); - provider.add("gtceu.multiblock.hpca.error_damaged", "Damaged component in structure!"); - provider.add("gtceu.multiblock.hpca.error_temperature", - "Temperature above 100C, components may be damaged!"); - provider.add("gtceu.multiblock.hpca.warning_temperature", - "Temperature above 50C, components may be damaged at 100C!"); - provider.add("gtceu.multiblock.hpca.warning_temperature_active_cool", "Fully utilizing active coolers"); - provider.add("gtceu.multiblock.hpca.warning_structure_header", "Structure Warnings:"); - provider.add("gtceu.multiblock.hpca.warning_multiple_bridges", - "- Multiple bridges in structure (provides no additional benefit)"); - provider.add("gtceu.multiblock.hpca.warning_no_computation", "- No computation providers"); - provider.add("gtceu.multiblock.hpca.warning_low_cooling", "- Not enough cooling"); - provider.add("gtceu.multiblock.hpca.info_max_computation", "Max CWU/t: %s"); - provider.add("gtceu.multiblock.hpca.info_max_cooling_demand", "Cooling Demand: %s"); - provider.add("gtceu.multiblock.hpca.info_max_cooling_available", "Cooling Available: %s"); - provider.add("gtceu.multiblock.hpca.info_max_coolant_required", "Coolant Needed: %s"); - provider.add("gtceu.multiblock.hpca.info_coolant_name", "PCB Coolant"); - provider.add("gtceu.multiblock.hpca.info_bridging_enabled", "Bridging Enabled"); - provider.add("gtceu.multiblock.hpca.info_bridging_disabled", "Bridging Disabled"); + // HPCA Parts + provider.add("gtceu.machine.hpca.component_general.upkeep_eut", "§eUpkeep Energy: §f%d EU/t"); + provider.add("gtceu.machine.hpca.component_general.max_eut", "§6Max Energy: §f%d EU/t"); + provider.add("gtceu.machine.hpca.component_type.cooler_passive", "§bCooler Type: §fPassive"); + provider.add("gtceu.machine.hpca.component_type.cooler_active", "§bCooler Type: §fActive"); + provider.add("gtceu.machine.hpca.component_type.cooler_cooling", "§aProvides: §f%d Cooling"); + provider.add("gtceu.machine.hpca.component_type.cooler_active_coolant", + "§cRequires up to: §f%d mB/t %s"); + provider.add("gtceu.machine.hpca.component_type.computation_cwut", "§9Computation: §f%d CWU/t"); + provider.add("gtceu.machine.hpca.component_type.computation_cooling", "§cRequires up to: §f%d Cooling"); + provider.add("gtceu.machine.hpca.component_type.bridge", + "Allows §fHPCA§7 to connect to §fNetwork Switches§7"); + provider.add("gtceu.machine.hpca.component_type.damaged", "Can be damaged by HPCA overheating!"); - provider.add("gtceu.multiblock.dimension", "§eDimensions: §r%sx%sx%s"); + provider.add("gtceu.machine.hpca.empty_component.tooltip", "Just for filling space"); + provider.add("gtceu.machine.hpca.heat_sink_component.tooltip", "Free cooling! Is anything free?"); + provider.add("gtceu.machine.hpca.active_cooler_component.tooltip", "Less free, more effective cooling"); + provider.add("gtceu.machine.hpca.computation_component.tooltip", "Baby's first computation"); + provider.add("gtceu.machine.hpca.advanced_computation_component.tooltip", "Computation big leagues"); + provider.add("gtceu.machine.hpca.bridge_component.tooltip", + "So that's where the \"Array\" in HPCA comes from"); - // General Machine Behavior - provider.add("gtceu.machine.parallel_hatch.display", "Adjust the maximum parallel of the multiblock"); - provider.add("gtceu.machine.basic.input_from_output_side.allow", "Allow Input from Output Side: "); - provider.add("gtceu.machine.basic.input_from_output_side.disallow", - "Disallow Input from Output Side: "); - provider.add("gtceu.machine.muffle.on", "Sound Muffling: Enabled"); - provider.add("gtceu.machine.muffle.off", "Sound Muffling: Disabled"); - provider.add("gtceu.machine.perfect_oc", "Does not lose energy efficiency when overclocked."); - provider.add("gtceu.machine.parallel_limit", "Can run up to §b%d§r§7 Recipes at once."); + provider.add("gtceu.machine.hpca.computation_component.damaged.name", + "Damaged HPCA Computation Component"); + provider.add("gtceu.machine.hpca.computation_component.damaged.tooltip", "Free recyclable materials"); + provider.add("gtceu.machine.hpca.advanced_computation_component.damaged.name", + "Damaged HPCA Advanced Computation Component"); + provider.add("gtceu.machine.hpca.advanced_computation_component.damaged.tooltip", + "It only cost an arm and a leg"); - // Recipe Maps - provider.add("gtceu.gui.machinemode.title", "Active Machine Mode"); - provider.add("gtceu.gui.machinemode", "Active Machine Mode: %s"); - provider.add("gtceu.machine.available_recipe_map_1.tooltip", "Available Recipe Types: %s"); - provider.add("gtceu.machine.available_recipe_map_2.tooltip", "Available Recipe Types: %s, %s"); - provider.add("gtceu.machine.available_recipe_map_3.tooltip", "Available Recipe Types: %s, %s, %s"); - provider.add("gtceu.machine.available_recipe_map_4.tooltip", "Available Recipe Types: %s, %s, %s, %s"); + // Object Holder + provider.add("gtceu.machine.object_holder.tooltip", "Advanced Holding Mechanism for Research Station"); - provider.add("gtceu.creative.chest.item", "Item"); - provider.add("gtceu.creative.chest.ipc", "Items per Cycle"); - provider.add("gtceu.creative.chest.tpc", "Ticks per Cycle"); - provider.add("gtceu.creative.tank.fluid", "Fluid"); - provider.add("gtceu.creative.tank.mbpc", "mB per Cycle"); - provider.add("gtceu.creative.tank.tpc", "Ticks per Cycle"); - provider.add("gtceu.creative.energy.amperage", "Amperage"); - provider.add("gtceu.creative.energy.voltage", "Voltage"); - provider.add("gtceu.creative.energy.sink", "Sink"); - provider.add("gtceu.creative.energy.source", "Source"); - provider.add("gtceu.creative.computation.average", "Average Requested CWUt"); - provider.add("gtceu.creative.activity.on", "Active"); - provider.add("gtceu.creative.activity.off", "Not active"); + // Passthrough Hatch + provider.add("gtceu.machine.passthrough_hatch_item.tooltip", "Sends Items from one Side to the other"); + provider.add("gtceu.machine.passthrough_hatch_fluid.tooltip", + "Sends Fluids from one Side to the other"); - // Multiblock Tanks - provider.add("gtceu.machine.multiblock.tank.tooltip", - "Fill and drain through the controller or tank valves."); - provider.add("gtceu.machine.tank_valve.tooltip", - "Use to fill and drain multiblock tanks. Auto outputs when facing down."); + // Laser Hatches + provider.add("gtceu.machine.laser_hatch.source.tooltip", "§7Transmitting power at distance"); + provider.add("gtceu.machine.laser_hatch.target.tooltip", "§7Receiving power from distance"); + provider.add("gtceu.machine.laser_hatch.both.tooltip", "§cLaser Cables must be in a straight line!§7"); + multiLang(provider, "gtceu.machine.laser_source_hatch.tooltip", + "Transmitting power at distance", + "§cLaser cables must be in a straight line!§7"); - // Workbench - multilineLang(provider, "gtceu.machine.workbench.tooltip", - "Better than Forestry\nHas Item Storage, Tool Storage, pulls from adjacent Inventories, and saves Recipes."); - provider.add("gtceu.machine.workbench.tab.workbench", "Crafting"); - provider.add("gtceu.machine.workbench.tab.item_list", "Storage"); - multilineLang(provider, "gtceu.machine.workbench.storage_note", - "(Available items from connected\ninventories usable for crafting)"); - provider.add("gtceu.item_list.item_stored", "§7Stored: %d"); - provider.add("gtceu.machine.workbench.tab.crafting", "Crafting"); - provider.add("gtceu.machine.workbench.tab.container", "Container"); - multilineLang(provider, "gtceu.recipe_memory_widget.tooltip", - "§7Left click to automatically input this recipe into the crafting grid\n§7Shift click to lock/unlock this recipe"); + multiLang(provider, "gtceu.machine.laser_target_hatch.tooltip", + "Receiving power from distance", + "§cLaser cables must be in a straight line!§7"); - // Safe - provider.add("gtceu.machine.locked_safe.malfunctioning", "§cMalfunctioning!"); - provider.add("gtceu.machine.locked_safe.requirements", "§7Replacements required:"); + // Processing Array Machine Hatch + provider.add("gtceu.machine.machine_hatch.locked", "Machine Interface Locked"); + provider.add("gtceu.machine.machine_hatch.tooltip", + "Specialized Access Bus that only holds valid items"); + provider.add("gtceu.machine.machine_hatch.processing_array", + "When in the §eProcessing Array§7, only holds machines that work in the §eProcessing Array"); + } - // Drums - provider.add("gtceu.machine.drum.enable_output", "Will drain Fluid to downward adjacent Tanks"); - provider.add("gtceu.machine.drum.disable_output", "Will not drain Fluid"); + /** + * Generates tooltips for both variants of steam machine + */ + private static void makeSteamMachineTooltip(RegistrateLangProvider provider, String root, String machineName, + String lpTooltip, String hpTooltip) { + provider.add("%s.lp_%s.tooltip".formatted(root, machineName), "§7%s".formatted(lpTooltip)); + provider.add("%s.hp_%s.tooltip".formatted(root, machineName), "§7%s".formatted(hpTooltip)); } - public static void standardTooltips(RegistrateLangProvider provider, String root, String machine, - String lowTier, - String midTier, String highTier) { - provider.add("%s.%s_%s.tooltip".formatted(root, "lv", machine), "§7%s".formatted(lowTier)); - provider.add("%s.%s_%s.tooltip".formatted(root, "mv", machine), "§7%s".formatted(lowTier)); - provider.add("%s.%s_%s.tooltip".formatted(root, "hv", machine), "§7%s".formatted(lowTier)); - provider.add("%s.%s_%s.tooltip".formatted(root, "ev", machine), "§7%s".formatted(lowTier)); - provider.add("%s.%s_%s.tooltip".formatted(root, "iv", machine), "§7%s".formatted(midTier)); - provider.add("%s.%s_%s.tooltip".formatted(root, "luv", machine), "§7%s".formatted(midTier)); - provider.add("%s.%s_%s.tooltip".formatted(root, "zpm", machine), "§7%s".formatted(midTier)); - provider.add("%s.%s_%s.tooltip".formatted(root, "uv", machine), "§7%s".formatted(highTier)); + /** + * Generates tooltips for LV-HV machines + */ + private static void makeElectricMachineTooltipLVtoHV(RegistrateLangProvider provider, String root, + String machineName, + String lvTooltip, String mvTooltip, String hvTooltip) { + makeElectricMachineTooltipULVtoMAX(provider, root, machineName, + null, lvTooltip, mvTooltip, hvTooltip, + null, null, null, null, + null, null, null, null, + null, null, null); + } + + /** + * Generates tooltips for LV-UV machines + */ + private static void makeElectricMachineTooltipLVtoUV(RegistrateLangProvider provider, String root, + String machineName, + String lvTooltip, String mvTooltip, String hvTooltip, + String evTooltip, String ivTooltip, String luvTooltip, + String zpmTooltip, + String uvTooltip) { + makeElectricMachineTooltipULVtoMAX(provider, root, machineName, + null, lvTooltip, mvTooltip, hvTooltip, + evTooltip, ivTooltip, luvTooltip, zpmTooltip, + uvTooltip, null, null, null, + null, null, null); + } + + /** + * Generates tooltips for ULV-MAX Machines
+ * If null it won't be added + */ + private static void makeElectricMachineTooltipULVtoMAX(RegistrateLangProvider provider, String root, + String machineName, + String ulvTooltip, String lvTooltip, String mvTooltip, + String hvTooltip, + String evTooltip, String ivTooltip, String luvTooltip, + String zpmTooltip, + String uvTooltip, String uhvTooltip, String uevTooltip, + String uivTooltip, + String uxvTooltip, String opvTooltip, String maxTooltip) { + if (ulvTooltip != null) { + provider.add("%s.ulv_%s.tooltip".formatted(root, machineName), "§7%s".formatted(ulvTooltip)); + } + if (lvTooltip != null) { + provider.add("%s.lv_%s.tooltip".formatted(root, machineName), "§7%s".formatted(lvTooltip)); + } + if (mvTooltip != null) { + provider.add("%s.mv_%s.tooltip".formatted(root, machineName), "§7%s".formatted(mvTooltip)); + } + if (hvTooltip != null) { + provider.add("%s.hv_%s.tooltip".formatted(root, machineName), "§7%s".formatted(hvTooltip)); + } + if (evTooltip != null) { + provider.add("%s.ev_%s.tooltip".formatted(root, machineName), "§7%s".formatted(evTooltip)); + } + if (ivTooltip != null) { + provider.add("%s.iv_%s.tooltip".formatted(root, machineName), "§7%s".formatted(ivTooltip)); + } + if (luvTooltip != null) { + provider.add("%s.luv_%s.tooltip".formatted(root, machineName), "§7%s".formatted(luvTooltip)); + } + if (zpmTooltip != null) { + provider.add("%s.zpm_%s.tooltip".formatted(root, machineName), "§7%s".formatted(zpmTooltip)); + } + if (uvTooltip != null) { + provider.add("%s.uv_%s.tooltip".formatted(root, machineName), "§7%s".formatted(uvTooltip)); + } + if (uhvTooltip != null) { + provider.add("%s.uhv_%s.tooltip".formatted(root, machineName), "§7%s".formatted(uhvTooltip)); + } + if (uevTooltip != null) { + provider.add("%s.uev_%s.tooltip".formatted(root, machineName), "§7%s".formatted(uevTooltip)); + } + if (uivTooltip != null) { + provider.add("%s.uiv_%s.tooltip".formatted(root, machineName), "§7%s".formatted(uivTooltip)); + } + if (uxvTooltip != null) { + provider.add("%s.uxv_%s.tooltip".formatted(root, machineName), "§7%s".formatted(uxvTooltip)); + } + if (opvTooltip != null) { + provider.add("%s.opv_%s.tooltip".formatted(root, machineName), "§7%s".formatted(opvTooltip)); + } + if (maxTooltip != null) { + provider.add("%s.max_%s.tooltip".formatted(root, machineName), "§7%s".formatted(maxTooltip)); + } } public static void generateMultiblockKeys(RegistrateLangProvider provider) { + // Recipe Logic provider.add("gtceu.multiblock.work_paused", "Work Paused."); provider.add("gtceu.multiblock.running", "Running perfectly."); provider.add("gtceu.multiblock.idling", "§6Idling."); + + // Creative Mode + provider.add("gtceu.creative_tooltip.1", "§7You just need"); + provider.add("gtceu.creative_tooltip.2", " Creative Mode"); + provider.add("gtceu.creative_tooltip.3", "§7 to use this"); + + // Researching provider.add("gtceu.multiblock.research_station.researching", "§6Researching."); + + // Energy Requirement provider.add("gtceu.multiblock.not_enough_energy", "WARNING: Machine needs more energy."); provider.add("gtceu.multiblock.not_enough_energy_output", "WARNING: Energy Dynamo Tier Too Low!"); + + // Recipe Progress provider.add("gtceu.multiblock.waiting", "WARNING: Machine is waiting."); provider.add("gtceu.multiblock.progress_percent", "Progress: %s%%"); provider.add("gtceu.multiblock.progress", "Progress: %ss / %ss (%s%%)"); + + // Recipe Outputs provider.add("gtceu.multiblock.output_line.0", "%s x §e%s§r (%ss/ea)"); provider.add("gtceu.multiblock.output_line.1", "%s x §e%s§r (%s/s)"); provider.add("gtceu.multiblock.output_line.2", "%s ≈ §e%s§r (%ss/ea)"); provider.add("gtceu.multiblock.output_line.3", "%s ≈ §e%s§r (%s/s)"); + + // Structure Validation provider.add("gtceu.multiblock.invalid_structure", "Invalid structure."); provider.add("gtceu.multiblock.invalid_structure.tooltip", "This block is a controller of the multiblock structure. For building help, see structure template in JEI."); provider.add("gtceu.multiblock.validation_failed", "Invalid amount of inputs/outputs."); + + // Pattern Preview + provider.add("gtceu.multiblock.title", "Multiblock Pattern"); + + // Hatch Limitation - Mostly for GCYM Multiblocks that are Hardcoded into GTCEU + provider.add("gtceu.multiblock.exact_hatch_1.tooltip", "§fAccepts Exactly §6One §fEnergy Hatch."); + + // Recipe Tier provider.add("gtceu.multiblock.max_recipe_tier", "Max Recipe Tier: %s"); provider.add("gtceu.multiblock.max_recipe_tier_hover", "The maximum tier of recipes that can be run"); + + // Energy Consumption/Generation provider.add("gtceu.multiblock.max_energy_per_tick", "Max EU/t: §a%s (%s§r)"); provider.add("gtceu.multiblock.max_energy_per_tick_hover", "The maximum EU/t available for running recipes or overclocking"); provider.add("gtceu.multiblock.max_energy_per_tick_amps", "Max EU/t: %s (%sA %s)"); provider.add("gtceu.multiblock.energy_consumption", "Energy Usage: %s EU/t (%s)"); provider.add("gtceu.multiblock.generation_eu", "Outputting: §a%s EU/t"); + + // Maintenence provider.add("gtceu.multiblock.universal.no_problems", "No Maintenance Problems!"); provider.add("gtceu.multiblock.universal.has_problems", "Has Maintenance Problems!"); provider.add("gtceu.multiblock.universal.has_problems_header", @@ -1079,23 +1319,41 @@ public static void generateMultiblockKeys(RegistrateLangProvider provider) { provider.add("gtceu.multiblock.universal.problem.hard_hammer", "§7Plating is dented. (§aHard Hammer§7)"); provider.add("gtceu.multiblock.universal.problem.wire_cutter", "§7Wires burned out. (§aWire Cutter§7)"); provider.add("gtceu.multiblock.universal.problem.crowbar", "§7That doesn't belong there. (§aCrowbar§7)"); + + // Muffler provider.add("gtceu.multiblock.universal.muffler_obstructed", "Muffler Hatch is Obstructed!"); provider.add("gtceu.multiblock.universal.muffler_obstructed.tooltip", "Muffler Hatch must have a block of airspace in front of it."); + + // Rotor provider.add("gtceu.multiblock.universal.rotor_obstructed", "Rotor is Obstructed!"); + + // Distinctness provider.add("gtceu.multiblock.universal.distinct", "Distinct Buses:"); provider.add("gtceu.multiblock.universal.distinct.no", "No"); provider.add("gtceu.multiblock.universal.distinct.yes", "Yes"); provider.add("gtceu.multiblock.universal.distinct.info", "If enabled, each Item Input Bus will be treated as fully distinct from each other for recipe lookup. Useful for things like Programmed Circuits, Extruder Shapes, etc."); + + // Parallel provider.add("gtceu.multiblock.parallel", "Performing up to %d Recipes in Parallel"); provider.add("gtceu.multiblock.parallel.exact", "Performing %d Recipes in Parallel"); + + // Active RecipeMap provider.add("gtceu.multiblock.multiple_recipemaps.header", "Machine Mode:"); provider.add("gtceu.multiblock.multiple_recipemaps.tooltip", "Screwdriver the controller to change which machine mode to use."); provider.add("gtceu.multiblock.multiple_recipemaps_recipes.tooltip", "Machine Modes: §e%s§r"); provider.add("gtceu.multiblock.multiple_recipemaps.switch_message", "The machine must be off to switch modes!"); + provider.add("gtceu.gui.machinemode.title", "Active Machine Mode"); + provider.add("gtceu.gui.machinemode", "Active Machine Mode: %s"); + provider.add("gtceu.machine.available_recipe_map_1.tooltip", "Available Recipe Types: %s"); + provider.add("gtceu.machine.available_recipe_map_2.tooltip", "Available Recipe Types: %s, %s"); + provider.add("gtceu.machine.available_recipe_map_3.tooltip", "Available Recipe Types: %s, %s, %s"); + provider.add("gtceu.machine.available_recipe_map_4.tooltip", "Available Recipe Types: %s, %s, %s, %s"); + + // Multiblock Preview provider.add("gtceu.multiblock.preview.zoom", "Use mousewheel or right-click + drag to zoom"); provider.add("gtceu.multiblock.preview.rotate", "Click and drag to rotate"); provider.add("gtceu.multiblock.preview.select", "Right-click to check candidates"); @@ -1113,11 +1371,24 @@ public static void generateMultiblockKeys(RegistrateLangProvider provider) { provider.add("gtceu.multiblock.pattern.location_end", "§cVery End§r"); provider.add("gtceu.multiblock.pattern.replaceable_air", "Replaceable by Air"); + // Computation provider.add("gtceu.multiblock.computation.max", "Max CWU/t: %s"); provider.add("gtceu.multiblock.computation.usage", "Using: %s"); provider.add("gtceu.multiblock.computation.non_bridging", "Non-bridging connection found"); provider.add("gtceu.multiblock.computation.non_bridging.detailed", "A Reception Hatch is linked to a machine which cannot bridge"); provider.add("gtceu.multiblock.computation.not_enough_computation", "Machine needs more computation!"); + + // Hatch Collapsing + provider.add("gtceu.bus.collapse_true", "Bus will collapse Items"); + provider.add("gtceu.bus.collapse_false", "Bus will not collapse Items"); + provider.add("gtceu.bus.collapse.error", "Bus must be attached to multiblock first"); + + // XEI Categories + provider.add("gtceu.auto_decomp.rotor", "Turbine Rotor"); + provider.add("gtceu.auto_decomp.tool", "Non-electric tool"); + + provider.add("gtceu.machine.canner.jei_description", + "You can fill and empty any fluid containers with the Fluid Canner (e.g. Buckets or Fluid Cells)"); } } From 0678b22d1bc51e9ee49871717a7a030171fc55f7 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Tue, 24 Jun 2025 02:02:08 -0600 Subject: [PATCH 18/45] GUI Lang --- .../gregtechceu/gtceu/data/lang/GUILang.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/GUILang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/GUILang.java index bbb4f6bfd30..d2876856940 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/GUILang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/GUILang.java @@ -39,10 +39,15 @@ private static void generateKeybindKeys(RegistrateLangProvider provider) { } private static void generateTooltipKeys(RegistrateLangProvider provider) { + // Part Sharing provider.add("gtceu.part_sharing.disabled", "Multiblock Sharing §4Disabled"); provider.add("gtceu.part_sharing.enabled", "Multiblock Sharing §aEnabled"); + + // GUI Units provider.add("gtceu.universal.liters", "%s mB"); provider.add("gtceu.universal.kiloliters", "%s B"); + + // EU Tooltip provider.add("gtceu.universal.tooltip.voltage_in", "§aVoltage IN: §f%d EU/t (%s§f)"); provider.add("gtceu.universal.tooltip.max_voltage_in", "§aMax Voltage IN: §f%d (%s§f)"); provider.add("gtceu.universal.tooltip.voltage_out", "§aVoltage OUT: §f%d EU/t (%s§f)"); @@ -55,40 +60,61 @@ private static void generateTooltipKeys(RegistrateLangProvider provider) { provider.add("gtceu.universal.tooltip.amperage_out_till", "§eAmperage OUT up to: §f%dA"); provider.add("gtceu.universal.tooltip.amperage_in_out", "§eAmperage IN/OUT: §f%dA"); provider.add("gtceu.universal.tooltip.amperage_in_out_till", "§eAmperage IN/OUT up to: §f%dA"); + + // EU Storage provider.add("gtceu.universal.tooltip.energy_storage_capacity", "§cEnergy Capacity: §r%d EU"); provider.add("gtceu.universal.tooltip.energy_tier_range", "§aAllowed Voltage Tiers: §f%s §f- %s"); + + // Item Storage/Transfer provider.add("gtceu.universal.tooltip.item_storage_capacity", "§6Item Slots: §f%d"); provider.add("gtceu.universal.tooltip.item_storage_total", "§6Item Capacity: §f%d items"); provider.add("gtceu.universal.tooltip.item_stored", "§dItem Stored: §f%s, %d items"); provider.add("gtceu.universal.tooltip.item_transfer_rate", "§bTransfer Rate: §f%d items/s"); provider.add("gtceu.universal.tooltip.item_transfer_rate_stacks", "§bTransfer Rate: §f%d stacks/s"); + + // Fluid Storage/Transfer provider.add("gtceu.universal.tooltip.fluid_storage_capacity", "§9Fluid Capacity: §f%d mB"); provider.add("gtceu.universal.tooltip.fluid_storage_capacity_mult", "§9Fluid Capacity: §f%d §7Tanks, §f%d mB §7each"); provider.add("gtceu.universal.tooltip.fluid_stored", "§2Fluid Stored: §f%s, %d mB"); provider.add("gtceu.universal.tooltip.fluid_transfer_rate", "§bTransfer Rate: §f%d mB/t"); + + // Parallel provider.add("gtceu.universal.tooltip.parallel", "§dMax Parallel: §f%d"); + + // Miner GUI provider.add("gtceu.universal.tooltip.working_area", "§bWorking Area: §f%dx%d"); provider.add("gtceu.universal.tooltip.chunk_mode", "Chunk Mode: "); provider.add("gtceu.universal.tooltip.silk_touch", "Silk Touch: "); provider.add("gtceu.universal.tooltip.working_area_chunks", "§bWorking Area: §f%dx%d Chunks"); provider.add("gtceu.universal.tooltip.working_area_max", "§bMax Working Area: §f%dx%d"); provider.add("gtceu.universal.tooltip.working_area_chunks_max", "§bMax Working Area: §f%dx%d Chunks"); + + // General Consumption provider.add("gtceu.universal.tooltip.uses_per_tick", "Uses §f%d EU/t §7while working"); provider.add("gtceu.universal.tooltip.uses_per_tick_steam", "Uses §f%d mB/t §7of §fSteam §7while working"); provider.add("gtceu.universal.tooltip.uses_per_hour_lubricant", "Uses §f%d mB/hr §7of §6Lubricant §7while working"); provider.add("gtceu.universal.tooltip.uses_per_second", "Uses §f%d EU/s §7while working"); provider.add("gtceu.universal.tooltip.uses_per_op", "Uses §f%d EU/operation"); + + // General Production provider.add("gtceu.universal.tooltip.base_production_eut", "§eBase Production: §f%d EU/t"); provider.add("gtceu.universal.tooltip.base_production_fluid", "§eBase Production: §f%d mB/t"); provider.add("gtceu.universal.tooltip.produces_fluid", "§eProduces: §f%d mB/t"); + + // Explosion provider.add("gtceu.universal.tooltip.terrain_resist", "This Machine will not explode when exposed to the Elements"); + + // Redstone provider.add("gtceu.universal.tooltip.requires_redstone", "§4Requires Redstone power"); + + // DEPRECATED provider.add("gtceu.universal.tooltip.deprecated", "§4§lWARNING:§r§4 DEPRECATED. WILL BE REMOVED IN A FUTURE VERSION.§r"); + // Tooltip Keybinds provider.add("gtceu.tooltip.hold_shift", "§7Hold SHIFT for more info"); provider.add("gtceu.tooltip.hold_ctrl", "§7Hold CTRL for more info"); provider.add("gtceu.tooltip.fluid_pipe_hold_shift", "§7Hold SHIFT to show Fluid Containment Info"); @@ -113,36 +139,49 @@ private static void generateWidgetKeys(RegistrateLangProvider provider) { // General UI Keys provider.add("gtceu.gui.title_bar.back", "Back"); provider.add("gtceu.gui.title_bar.page_switcher", "Pages"); + provider.add("gtceu.gui.fuel_amount", "Fuel Amount:"); provider.add("gtceu.gui.fluid_amount", "Fluid Amount:"); + provider.add("gtceu.gui.toggle_view.disabled", "Toggle View (Fluids)"); provider.add("gtceu.gui.toggle_view.enabled", "Toggle View (Items)"); + multilineLang(provider, "gtceu.gui.overclock.enabled", "Overclocking Enabled.\nClick to Disable"); multilineLang(provider, "gtceu.gui.overclock.disabled", "Overclocking Disabled.\nClick to Enable"); multilineLang(provider, "gtceu.gui.overclock.description", "Overclock Button\n§7Recipes can overclock up to the set tier"); provider.add("gtceu.gui.overclock.off", "X"); + provider.add("gtceu.gui.sort", "Sort"); + provider.add("gtceu.gui.fluid_auto_output.tooltip.enabled", "Fluid Auto-Output Enabled"); provider.add("gtceu.gui.fluid_auto_output.tooltip.disabled", "Fluid Auto-Output Disabled"); provider.add("gtceu.gui.fluid_auto_input.tooltip.enabled", "Fluid Auto-Input Enabled"); provider.add("gtceu.gui.fluid_auto_input.tooltip.disabled", "Fluid Auto-Input Disabled"); + provider.add("gtceu.gui.item_auto_output.tooltip.enabled", "Item Auto-Output Enabled"); provider.add("gtceu.gui.item_auto_output.tooltip.disabled", "Item Auto-Output Disabled"); provider.add("gtceu.gui.item_auto_input.tooltip.enabled", "Item Auto-Input Enabled"); provider.add("gtceu.gui.item_auto_input.tooltip.disabled", "Item Auto-Input Disabled"); + multilineLang(provider, "gtceu.gui.charger_slot.tooltip", "§fCharger Slot§r\n§7Draws power from %s batteries§r\n§7Charges %s tools and batteries"); multilineLang(provider, "gtceu.gui.configurator_slot.tooltip", "§fConfigurator Slot§r\n§7Place a §6Programmed Circuit§7 in this slot to\n§7change its configured value.\n§7Hold §6Shift§7 when clicking buttons to change by §65.\n§aA Programmed Circuit in this slot is also valid for recipe inputs.§r"); + provider.add("gtceu.gui.fluid_lock.tooltip.enabled", "Fluid Locking Enabled"); provider.add("gtceu.gui.fluid_lock.tooltip.disabled", "Fluid Locking Disabled"); + provider.add("gtceu.gui.fluid_voiding_partial.tooltip.enabled", "Fluid Voiding Enabled"); provider.add("gtceu.gui.fluid_voiding_partial.tooltip.disabled", "Fluid Voiding Disabled"); + provider.add("gtceu.gui.item_lock.tooltip.enabled", "Item Locking Enabled"); provider.add("gtceu.gui.item_lock.tooltip.disabled", "Item Locking Disabled"); + provider.add("gtceu.gui.item_voiding_partial.tooltip.enabled", "Item Voiding Enabled"); provider.add("gtceu.gui.item_voiding_partial.tooltip.disabled", "Item Voiding Disabled"); + + // Miner GUI multilineLang(provider, "gtceu.gui.silktouch.enabled", "Silk Touch Enabled: Click to Disable.\n§7Switching requires an idle machine."); multilineLang(provider, "gtceu.gui.silktouch.disabled", @@ -151,11 +190,15 @@ private static void generateWidgetKeys(RegistrateLangProvider provider) { "Chunk Mode Enabled: Click to Disable.\n§7Switching requires an idle machine."); multilineLang(provider, "gtceu.gui.chunkmode.disabled", "Chunk Mode Disabled: Click to Enable.\n§7Switching requires an idle machine."); + + // Recipe Capability Voiding multilineLang(provider, "gtceu.gui.multiblock_item_voiding", "Voiding Mode\n§7Voiding §6Items"); multilineLang(provider, "gtceu.gui.multiblock_fluid_voiding", "Voiding Mode\n§7Voiding §9Fluids"); multilineLang(provider, "gtceu.gui.multiblock_item_fluid_voiding", "Voiding Mode\n§7Voiding §6Items §7and §9Fluids"); multilineLang(provider, "gtceu.gui.multiblock_no_voiding", "Voiding Mode\n§7Voiding Nothing"); + + // Fisher multilineLang(provider, "gtceu.gui.fisher_mode.tooltip", "Toggle junk items\nOff costs 2 string per operation"); @@ -187,6 +230,8 @@ private static void generateWidgetKeys(RegistrateLangProvider provider) { provider.add("gtceu.gui.fluid_auto_output.allow_input.disabled", "disable fluids input from the output side"); provider.add("gtceu.gui.auto_output.name", "auto"); + + // Overclocking Widget provider.add("gtceu.gui.overclock.title", "Overclock Tier"); provider.add("gtceu.gui.overclock.range", "Available Tiers [%s, %s]"); From e7825848e848d88c3f000e0989dd2fb1bdfb6709 Mon Sep 17 00:00:00 2001 From: Spicierspace153 <21964509+Spicierspace153@users.noreply.github.com> Date: Tue, 24 Jun 2025 15:19:16 -0600 Subject: [PATCH 19/45] requested changes --- .../resources/assets/gtceu/lang/en_ud.json | 52 +++++++++---------- .../resources/assets/gtceu/lang/en_us.json | 52 +++++++++---------- .../medical_condition.arsenicosis.json | 5 -- .../medical_condition.asbestosis.json | 5 -- .../medical_condition.berylliosis.json | 5 -- ...l_condition.carbon_monoxide_poisoning.json | 5 -- .../medical_condition.carcinogen.json | 5 -- .../medical_condition.chemical_burns.json | 5 -- .../medical_condition.irritant.json | 5 -- .../medical_condition.methanol_poisoning.json | 5 -- .../damage_type/medical_condition.nausea.json | 5 -- .../damage_type/medical_condition.none.json | 5 -- .../damage_type/medical_condition.poison.json | 5 -- .../medical_condition.silicosis.json | 5 -- .../medical_condition.weak_poison.json | 5 -- .../medical_condition/arsenicosis.json | 5 ++ .../medical_condition/asbestosis.json | 5 ++ .../medical_condition/berylliosis.json | 5 ++ .../carbon_monoxide_poisoning.json | 5 ++ .../medical_condition/carcinogen.json | 5 ++ .../medical_condition/chemical_burns.json | 5 ++ .../medical_condition/irritant.json | 5 ++ .../medical_condition/methanol_poisoning.json | 5 ++ .../damage_type/medical_condition/nausea.json | 5 ++ .../damage_type/medical_condition/none.json | 5 ++ .../damage_type/medical_condition/poison.json | 5 ++ .../medical_condition/silicosis.json | 5 ++ .../medical_condition/weak_poison.json | 5 ++ .../tags/damage_type/bypasses_armor.json | 26 +++++----- .../medicalcondition/MedicalCondition.java | 2 +- .../gtceu/data/lang/HazardLang.java | 26 +++++----- .../resources/assets/gtceu/lang/ja_jp.json | 52 +++++++++---------- .../resources/assets/gtceu/lang/ru_ru.json | 52 +++++++++---------- .../resources/assets/gtceu/lang/uk_ua.json | 52 +++++++++---------- .../resources/assets/gtceu/lang/zh_cn.json | 52 +++++++++---------- .../resources/assets/gtceu/lang/zh_tw.json | 52 +++++++++---------- 36 files changed, 274 insertions(+), 274 deletions(-) delete mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition.arsenicosis.json delete mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition.asbestosis.json delete mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition.berylliosis.json delete mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition.carbon_monoxide_poisoning.json delete mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition.carcinogen.json delete mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition.chemical_burns.json delete mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition.irritant.json delete mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition.methanol_poisoning.json delete mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition.nausea.json delete mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition.none.json delete mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition.poison.json delete mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition.silicosis.json delete mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition.weak_poison.json create mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition/arsenicosis.json create mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition/asbestosis.json create mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition/berylliosis.json create mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition/carbon_monoxide_poisoning.json create mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition/carcinogen.json create mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition/chemical_burns.json create mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition/irritant.json create mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition/methanol_poisoning.json create mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition/nausea.json create mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition/none.json create mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition/poison.json create mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition/silicosis.json create mode 100644 src/generated/resources/data/gtceu/damage_type/medical_condition/weak_poison.json diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 4b229849e01..78ef77fd9ea 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -2175,19 +2175,19 @@ "death.attack.gtceu.hoe": "%s ʎq pǝןןıʇ pɐǝɥ ɹıǝɥʇ pɐɥ %s", "death.attack.gtceu.knife": "%s ʎq pǝʞod ʎןʇuǝb sɐʍ %s", "death.attack.gtceu.mallet": "%s ʎq ɥʇɐǝp oʇ pǝɹǝɯɯɐɥ ʇob %s", - "death.attack.gtceu.medical_condition.arsenicosis": "buıuosıod ɔıuǝsɹɐ ʇob %s", - "death.attack.gtceu.medical_condition.asbestosis": "ɐɯoıןǝɥʇosǝɯ ʇob %s", - "death.attack.gtceu.medical_condition.berylliosis": "ʎןıpǝǝɹb ooʇ ʇıq ɐ spןɐɹǝɯǝ pǝuıɯ %s", - "death.attack.gtceu.medical_condition.carbon_monoxide_poisoning": "uo ǝʌoʇs ǝɥʇ ʇɟǝן %s", - "death.attack.gtceu.medical_condition.carcinogen": "ɐıɯǝʞnǝן ʇob %s", - "death.attack.gtceu.medical_condition.chemical_burns": "ʇuǝpıɔɔɐ ןɐɔıɯǝɥɔ ɐ pɐɥ %s", - "death.attack.gtceu.medical_condition.irritant": "ɥsɐɹ pɐq ɹ§ʎꞀꞀⱯƎᴚן§u§ ɐ ʇob %s", - "death.attack.gtceu.medical_condition.methanol_poisoning": "uoıʇıqıɥoɹd ǝɥʇ buıɹnp ǝuıɥsuooɯ ʞuıɹp oʇ pǝıɹʇ %s", - "death.attack.gtceu.medical_condition.nausea": "ɐǝsnɐu ɟo pǝıp %s", - "death.attack.gtceu.medical_condition.none": "¿buıɥʇou ˙˙˙ɟo pǝıp %s", - "death.attack.gtceu.medical_condition.poison": "snouosıod 'ʇɔɐɟ uı 'ǝɹɐ sןɐıɹǝʇɐɯ snouosıod ʇɐɥʇ ʇobɹoɟ %s", - "death.attack.gtceu.medical_condition.silicosis": "˙sısoɔıןıs sɐʍ ʇı ˙sısoןnɔɹǝqnʇ ɟo ǝıp ʇ,upıp %s", - "death.attack.gtceu.medical_condition.weak_poison": ")¡ʎɹnɔɹǝɯ ɹo( pɐǝן ǝʇɐ %s", + "death.attack.gtceu.medical_condition/arsenicosis": "buıuosıod ɔıuǝsɹɐ ʇob %s", + "death.attack.gtceu.medical_condition/asbestosis": "ɐɯoıןǝɥʇosǝɯ ʇob %s", + "death.attack.gtceu.medical_condition/berylliosis": "ʎןıpǝǝɹb ooʇ ʇıq ɐ spןɐɹǝɯǝ pǝuıɯ %s", + "death.attack.gtceu.medical_condition/carbon_monoxide_poisoning": "uo ǝʌoʇs ǝɥʇ ʇɟǝן %s", + "death.attack.gtceu.medical_condition/carcinogen": "ɐıɯǝʞnǝן ʇob %s", + "death.attack.gtceu.medical_condition/chemical_burns": "ʇuǝpıɔɔɐ ןɐɔıɯǝɥɔ ɐ pɐɥ %s", + "death.attack.gtceu.medical_condition/irritant": "ɥsɐɹ pɐq ɹ§ʎꞀꞀⱯƎᴚן§u§ ɐ ʇob %s", + "death.attack.gtceu.medical_condition/methanol_poisoning": "uoıʇıqıɥoɹd ǝɥʇ buıɹnp ǝuıɥsuooɯ ʞuıɹp oʇ pǝıɹʇ %s", + "death.attack.gtceu.medical_condition/nausea": "ɐǝsnɐu ɟo pǝıp %s", + "death.attack.gtceu.medical_condition/none": "¿buıɥʇou ˙˙˙ɟo pǝıp %s", + "death.attack.gtceu.medical_condition/poison": "snouosıod 'ʇɔɐɟ uı 'ǝɹɐ sןɐıɹǝʇɐɯ snouosıod ʇɐɥʇ ʇobɹoɟ %s", + "death.attack.gtceu.medical_condition/silicosis": "˙sısoɔıןıs sɐʍ ʇı ˙sısoןnɔɹǝqnʇ ɟo ǝıp ʇ,upıp %s", + "death.attack.gtceu.medical_condition/weak_poison": ")¡ʎɹnɔɹǝɯ ɹo( pɐǝן ǝʇɐ %s", "death.attack.gtceu.mining_hammer": "%s ʎq ǝɹO ɹoɟ uǝʞɐʇsıɯ sɐʍ %s", "death.attack.gtceu.mortar": "%s ʎq ʇsnp oʇ punoɹb sɐʍ %s", "death.attack.gtceu.pickaxe": "%s ʎq pǝuıɯ ʇob %s", @@ -3186,21 +3186,21 @@ "gtceu.medical_condition.antidote.description.effect_removed": "sʇɔǝɟɟǝ ,suoıʇıpuoɔ ʇuǝɹɹnɔ ɟo %s%% sǝʌoɯǝᴚ", "gtceu.medical_condition.antidote.description.effect_removed.all": "sʇɔǝɟɟǝ ,suoıʇıpuoɔ ʇuǝɹɹnɔ ɟo ןןɐ sǝʌoɯǝᴚ", "gtceu.medical_condition.antidote.description_shift": ":suoıʇıpuoɔ ǝsǝɥʇ sǝɹnƆɐ§", - "gtceu.medical_condition.arsenicosis": "sısoɔıuǝsɹⱯq§", - "gtceu.medical_condition.asbestosis": "sısoʇsǝqsⱯp§", - "gtceu.medical_condition.berylliosis": "sısoıןןʎɹǝᗺϛ§", - "gtceu.medical_condition.carbon_monoxide_poisoning": "buıuosıoԀ ǝpıxouoW uoqɹɐƆㄥ§", - "gtceu.medical_condition.carcinogen": "ɔıuǝbouıɔɹɐƆǝ§", - "gtceu.medical_condition.chemical_burns": "suɹnq ןɐɔıɯǝɥƆϛ§", "gtceu.medical_condition.description": "sןıɐʇǝp ʍoɥs oʇ ʇɟıɥS pןoHㄥ§ S∩OᗡᴚⱯZⱯHɔ§ן§", "gtceu.medical_condition.description_shift": ":S∩OᗡᴚⱯZⱯHɔ§ן§", - "gtceu.medical_condition.irritant": "ʇuɐʇıɹɹI9§", - "gtceu.medical_condition.methanol_poisoning": "buıuosıoԀ ןouɐɥʇǝW9§", - "gtceu.medical_condition.nausea": "buıʇɐǝsnɐNƐ§", - "gtceu.medical_condition.none": "snoɹǝbuɐᗡ ʇoNᄅ§", - "gtceu.medical_condition.poison": "snouosıoԀᄅ§", - "gtceu.medical_condition.silicosis": "sısoɔıןıSƖ§", - "gtceu.medical_condition.weak_poison": "snouosıod ʎןʞɐǝMɐ§", + "gtceu.medical_condition/arsenicosis": "sısoɔıuǝsɹⱯq§", + "gtceu.medical_condition/asbestosis": "sısoʇsǝqsⱯp§", + "gtceu.medical_condition/berylliosis": "sısoıןןʎɹǝᗺϛ§", + "gtceu.medical_condition/carbon_monoxide_poisoning": "buıuosıoԀ ǝpıxouoW uoqɹɐƆㄥ§", + "gtceu.medical_condition/carcinogen": "ɔıuǝbouıɔɹɐƆǝ§", + "gtceu.medical_condition/chemical_burns": "suɹnq ןɐɔıɯǝɥƆϛ§", + "gtceu.medical_condition/irritant": "ʇuɐʇıɹɹI9§", + "gtceu.medical_condition/methanol_poisoning": "buıuosıoԀ ןouɐɥʇǝW9§", + "gtceu.medical_condition/nausea": "buıʇɐǝsnɐNƐ§", + "gtceu.medical_condition/none": "snoɹǝbuɐᗡ ʇoNᄅ§", + "gtceu.medical_condition/poison": "snouosıoԀᄅ§", + "gtceu.medical_condition/silicosis": "sısoɔıןıSƖ§", + "gtceu.medical_condition/weak_poison": "snouosıod ʎןʞɐǝMɐ§", "gtceu.minimap.ore_vein.depleted": "pǝʇǝןdǝᗡ", "gtceu.mixer": "ɹǝxıW", "gtceu.mode.both": "ɹ§)ɯǝʇI puⱯ pınןℲ( ɥʇoᗺp§", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 6f96365b066..8dc25e87eb3 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -2175,19 +2175,19 @@ "death.attack.gtceu.hoe": "%s had their head tilled by %s", "death.attack.gtceu.knife": "%s was gently poked by %s", "death.attack.gtceu.mallet": "%s got hammered to death by %s", - "death.attack.gtceu.medical_condition.arsenicosis": "%s got arsenic poisoning", - "death.attack.gtceu.medical_condition.asbestosis": "%s got mesothelioma", - "death.attack.gtceu.medical_condition.berylliosis": "%s mined emeralds a bit too greedily", - "death.attack.gtceu.medical_condition.carbon_monoxide_poisoning": "%s left the stove on", - "death.attack.gtceu.medical_condition.carcinogen": "%s got leukemia", - "death.attack.gtceu.medical_condition.chemical_burns": "%s had a chemical accident", - "death.attack.gtceu.medical_condition.irritant": "%s got a §n§lREALLY§r bad rash", - "death.attack.gtceu.medical_condition.methanol_poisoning": "%s tried to drink moonshine during the prohibition", - "death.attack.gtceu.medical_condition.nausea": "%s died of nausea", - "death.attack.gtceu.medical_condition.none": "%s died of... nothing?", - "death.attack.gtceu.medical_condition.poison": "%s forgot that poisonous materials are, in fact, poisonous", - "death.attack.gtceu.medical_condition.silicosis": "%s didn't die of tuberculosis. it was silicosis.", - "death.attack.gtceu.medical_condition.weak_poison": "%s ate lead (or mercury!)", + "death.attack.gtceu.medical_condition/arsenicosis": "%s got arsenic poisoning", + "death.attack.gtceu.medical_condition/asbestosis": "%s got mesothelioma", + "death.attack.gtceu.medical_condition/berylliosis": "%s mined emeralds a bit too greedily", + "death.attack.gtceu.medical_condition/carbon_monoxide_poisoning": "%s left the stove on", + "death.attack.gtceu.medical_condition/carcinogen": "%s got leukemia", + "death.attack.gtceu.medical_condition/chemical_burns": "%s had a chemical accident", + "death.attack.gtceu.medical_condition/irritant": "%s got a §n§lREALLY§r bad rash", + "death.attack.gtceu.medical_condition/methanol_poisoning": "%s tried to drink moonshine during the prohibition", + "death.attack.gtceu.medical_condition/nausea": "%s died of nausea", + "death.attack.gtceu.medical_condition/none": "%s died of... nothing?", + "death.attack.gtceu.medical_condition/poison": "%s forgot that poisonous materials are, in fact, poisonous", + "death.attack.gtceu.medical_condition/silicosis": "%s didn't die of tuberculosis. it was silicosis.", + "death.attack.gtceu.medical_condition/weak_poison": "%s ate lead (or mercury!)", "death.attack.gtceu.mining_hammer": "%s was mistaken for Ore by %s", "death.attack.gtceu.mortar": "%s was ground to dust by %s", "death.attack.gtceu.pickaxe": "%s got mined by %s", @@ -3186,21 +3186,21 @@ "gtceu.medical_condition.antidote.description.effect_removed": "Removes %s%% of current conditions' effects", "gtceu.medical_condition.antidote.description.effect_removed.all": "Removes all of current conditions' effects", "gtceu.medical_condition.antidote.description_shift": "§aCures these conditions:", - "gtceu.medical_condition.arsenicosis": "§bArsenicosis", - "gtceu.medical_condition.asbestosis": "§dAsbestosis", - "gtceu.medical_condition.berylliosis": "§5Berylliosis", - "gtceu.medical_condition.carbon_monoxide_poisoning": "§7Carbon Monoxide Poisoning", - "gtceu.medical_condition.carcinogen": "§eCarcinogenic", - "gtceu.medical_condition.chemical_burns": "§5Chemical burns", "gtceu.medical_condition.description": "§l§cHAZARDOUS §7Hold Shift to show details", "gtceu.medical_condition.description_shift": "§l§cHAZARDOUS:", - "gtceu.medical_condition.irritant": "§6Irritant", - "gtceu.medical_condition.methanol_poisoning": "§6Methanol Poisoning", - "gtceu.medical_condition.nausea": "§3Nauseating", - "gtceu.medical_condition.none": "§2Not Dangerous", - "gtceu.medical_condition.poison": "§2Poisonous", - "gtceu.medical_condition.silicosis": "§1Silicosis", - "gtceu.medical_condition.weak_poison": "§aWeakly poisonous", + "gtceu.medical_condition/arsenicosis": "§bArsenicosis", + "gtceu.medical_condition/asbestosis": "§dAsbestosis", + "gtceu.medical_condition/berylliosis": "§5Berylliosis", + "gtceu.medical_condition/carbon_monoxide_poisoning": "§7Carbon Monoxide Poisoning", + "gtceu.medical_condition/carcinogen": "§eCarcinogenic", + "gtceu.medical_condition/chemical_burns": "§5Chemical burns", + "gtceu.medical_condition/irritant": "§6Irritant", + "gtceu.medical_condition/methanol_poisoning": "§6Methanol Poisoning", + "gtceu.medical_condition/nausea": "§3Nauseating", + "gtceu.medical_condition/none": "§2Not Dangerous", + "gtceu.medical_condition/poison": "§2Poisonous", + "gtceu.medical_condition/silicosis": "§1Silicosis", + "gtceu.medical_condition/weak_poison": "§aWeakly poisonous", "gtceu.minimap.ore_vein.depleted": "Depleted", "gtceu.mixer": "Mixer", "gtceu.mode.both": "§dBoth (Fluid And Item)§r", diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition.arsenicosis.json b/src/generated/resources/data/gtceu/damage_type/medical_condition.arsenicosis.json deleted file mode 100644 index a69c3585e66..00000000000 --- a/src/generated/resources/data/gtceu/damage_type/medical_condition.arsenicosis.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "exhaustion": 0.0, - "message_id": "gtceu.medical_condition.arsenicosis", - "scaling": "never" -} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition.asbestosis.json b/src/generated/resources/data/gtceu/damage_type/medical_condition.asbestosis.json deleted file mode 100644 index cad216635f1..00000000000 --- a/src/generated/resources/data/gtceu/damage_type/medical_condition.asbestosis.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "exhaustion": 0.0, - "message_id": "gtceu.medical_condition.asbestosis", - "scaling": "never" -} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition.berylliosis.json b/src/generated/resources/data/gtceu/damage_type/medical_condition.berylliosis.json deleted file mode 100644 index e8a6851184c..00000000000 --- a/src/generated/resources/data/gtceu/damage_type/medical_condition.berylliosis.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "exhaustion": 0.0, - "message_id": "gtceu.medical_condition.berylliosis", - "scaling": "never" -} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition.carbon_monoxide_poisoning.json b/src/generated/resources/data/gtceu/damage_type/medical_condition.carbon_monoxide_poisoning.json deleted file mode 100644 index 3551446bb9b..00000000000 --- a/src/generated/resources/data/gtceu/damage_type/medical_condition.carbon_monoxide_poisoning.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "exhaustion": 0.0, - "message_id": "gtceu.medical_condition.carbon_monoxide_poisoning", - "scaling": "never" -} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition.carcinogen.json b/src/generated/resources/data/gtceu/damage_type/medical_condition.carcinogen.json deleted file mode 100644 index eeefbf9c773..00000000000 --- a/src/generated/resources/data/gtceu/damage_type/medical_condition.carcinogen.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "exhaustion": 0.0, - "message_id": "gtceu.medical_condition.carcinogen", - "scaling": "never" -} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition.chemical_burns.json b/src/generated/resources/data/gtceu/damage_type/medical_condition.chemical_burns.json deleted file mode 100644 index 84e1a4dd8eb..00000000000 --- a/src/generated/resources/data/gtceu/damage_type/medical_condition.chemical_burns.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "exhaustion": 0.0, - "message_id": "gtceu.medical_condition.chemical_burns", - "scaling": "never" -} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition.irritant.json b/src/generated/resources/data/gtceu/damage_type/medical_condition.irritant.json deleted file mode 100644 index b61af3b6210..00000000000 --- a/src/generated/resources/data/gtceu/damage_type/medical_condition.irritant.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "exhaustion": 0.0, - "message_id": "gtceu.medical_condition.irritant", - "scaling": "never" -} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition.methanol_poisoning.json b/src/generated/resources/data/gtceu/damage_type/medical_condition.methanol_poisoning.json deleted file mode 100644 index 3147bbb575e..00000000000 --- a/src/generated/resources/data/gtceu/damage_type/medical_condition.methanol_poisoning.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "exhaustion": 0.0, - "message_id": "gtceu.medical_condition.methanol_poisoning", - "scaling": "never" -} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition.nausea.json b/src/generated/resources/data/gtceu/damage_type/medical_condition.nausea.json deleted file mode 100644 index 63710811f94..00000000000 --- a/src/generated/resources/data/gtceu/damage_type/medical_condition.nausea.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "exhaustion": 0.0, - "message_id": "gtceu.medical_condition.nausea", - "scaling": "never" -} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition.none.json b/src/generated/resources/data/gtceu/damage_type/medical_condition.none.json deleted file mode 100644 index 183923ac348..00000000000 --- a/src/generated/resources/data/gtceu/damage_type/medical_condition.none.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "exhaustion": 0.0, - "message_id": "gtceu.medical_condition.none", - "scaling": "never" -} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition.poison.json b/src/generated/resources/data/gtceu/damage_type/medical_condition.poison.json deleted file mode 100644 index 8320d7c4779..00000000000 --- a/src/generated/resources/data/gtceu/damage_type/medical_condition.poison.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "exhaustion": 0.0, - "message_id": "gtceu.medical_condition.poison", - "scaling": "never" -} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition.silicosis.json b/src/generated/resources/data/gtceu/damage_type/medical_condition.silicosis.json deleted file mode 100644 index 797ce17cff8..00000000000 --- a/src/generated/resources/data/gtceu/damage_type/medical_condition.silicosis.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "exhaustion": 0.0, - "message_id": "gtceu.medical_condition.silicosis", - "scaling": "never" -} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition.weak_poison.json b/src/generated/resources/data/gtceu/damage_type/medical_condition.weak_poison.json deleted file mode 100644 index 06edd50e728..00000000000 --- a/src/generated/resources/data/gtceu/damage_type/medical_condition.weak_poison.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "exhaustion": 0.0, - "message_id": "gtceu.medical_condition.weak_poison", - "scaling": "never" -} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition/arsenicosis.json b/src/generated/resources/data/gtceu/damage_type/medical_condition/arsenicosis.json new file mode 100644 index 00000000000..08ca8f8dd62 --- /dev/null +++ b/src/generated/resources/data/gtceu/damage_type/medical_condition/arsenicosis.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "gtceu.medical_condition/arsenicosis", + "scaling": "never" +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition/asbestosis.json b/src/generated/resources/data/gtceu/damage_type/medical_condition/asbestosis.json new file mode 100644 index 00000000000..98deaaf9508 --- /dev/null +++ b/src/generated/resources/data/gtceu/damage_type/medical_condition/asbestosis.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "gtceu.medical_condition/asbestosis", + "scaling": "never" +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition/berylliosis.json b/src/generated/resources/data/gtceu/damage_type/medical_condition/berylliosis.json new file mode 100644 index 00000000000..d7f7f62336a --- /dev/null +++ b/src/generated/resources/data/gtceu/damage_type/medical_condition/berylliosis.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "gtceu.medical_condition/berylliosis", + "scaling": "never" +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition/carbon_monoxide_poisoning.json b/src/generated/resources/data/gtceu/damage_type/medical_condition/carbon_monoxide_poisoning.json new file mode 100644 index 00000000000..960bbd947f7 --- /dev/null +++ b/src/generated/resources/data/gtceu/damage_type/medical_condition/carbon_monoxide_poisoning.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "gtceu.medical_condition/carbon_monoxide_poisoning", + "scaling": "never" +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition/carcinogen.json b/src/generated/resources/data/gtceu/damage_type/medical_condition/carcinogen.json new file mode 100644 index 00000000000..c530e661bfb --- /dev/null +++ b/src/generated/resources/data/gtceu/damage_type/medical_condition/carcinogen.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "gtceu.medical_condition/carcinogen", + "scaling": "never" +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition/chemical_burns.json b/src/generated/resources/data/gtceu/damage_type/medical_condition/chemical_burns.json new file mode 100644 index 00000000000..8c698d13a40 --- /dev/null +++ b/src/generated/resources/data/gtceu/damage_type/medical_condition/chemical_burns.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "gtceu.medical_condition/chemical_burns", + "scaling": "never" +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition/irritant.json b/src/generated/resources/data/gtceu/damage_type/medical_condition/irritant.json new file mode 100644 index 00000000000..14c7116781b --- /dev/null +++ b/src/generated/resources/data/gtceu/damage_type/medical_condition/irritant.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "gtceu.medical_condition/irritant", + "scaling": "never" +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition/methanol_poisoning.json b/src/generated/resources/data/gtceu/damage_type/medical_condition/methanol_poisoning.json new file mode 100644 index 00000000000..189f65c9f81 --- /dev/null +++ b/src/generated/resources/data/gtceu/damage_type/medical_condition/methanol_poisoning.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "gtceu.medical_condition/methanol_poisoning", + "scaling": "never" +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition/nausea.json b/src/generated/resources/data/gtceu/damage_type/medical_condition/nausea.json new file mode 100644 index 00000000000..eeb8707e011 --- /dev/null +++ b/src/generated/resources/data/gtceu/damage_type/medical_condition/nausea.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "gtceu.medical_condition/nausea", + "scaling": "never" +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition/none.json b/src/generated/resources/data/gtceu/damage_type/medical_condition/none.json new file mode 100644 index 00000000000..c80601b472e --- /dev/null +++ b/src/generated/resources/data/gtceu/damage_type/medical_condition/none.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "gtceu.medical_condition/none", + "scaling": "never" +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition/poison.json b/src/generated/resources/data/gtceu/damage_type/medical_condition/poison.json new file mode 100644 index 00000000000..28915a07fe8 --- /dev/null +++ b/src/generated/resources/data/gtceu/damage_type/medical_condition/poison.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "gtceu.medical_condition/poison", + "scaling": "never" +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition/silicosis.json b/src/generated/resources/data/gtceu/damage_type/medical_condition/silicosis.json new file mode 100644 index 00000000000..917b648aecf --- /dev/null +++ b/src/generated/resources/data/gtceu/damage_type/medical_condition/silicosis.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "gtceu.medical_condition/silicosis", + "scaling": "never" +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/damage_type/medical_condition/weak_poison.json b/src/generated/resources/data/gtceu/damage_type/medical_condition/weak_poison.json new file mode 100644 index 00000000000..288237e0f01 --- /dev/null +++ b/src/generated/resources/data/gtceu/damage_type/medical_condition/weak_poison.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "gtceu.medical_condition/weak_poison", + "scaling": "never" +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/damage_type/bypasses_armor.json b/src/generated/resources/data/minecraft/tags/damage_type/bypasses_armor.json index c44fab80111..fc6bd8cfd19 100644 --- a/src/generated/resources/data/minecraft/tags/damage_type/bypasses_armor.json +++ b/src/generated/resources/data/minecraft/tags/damage_type/bypasses_armor.json @@ -1,18 +1,18 @@ { "values": [ - "gtceu:medical_condition.none", - "gtceu:medical_condition.chemical_burns", - "gtceu:medical_condition.poison", - "gtceu:medical_condition.weak_poison", - "gtceu:medical_condition.irritant", - "gtceu:medical_condition.nausea", - "gtceu:medical_condition.carcinogen", - "gtceu:medical_condition.asbestosis", - "gtceu:medical_condition.arsenicosis", - "gtceu:medical_condition.silicosis", - "gtceu:medical_condition.berylliosis", - "gtceu:medical_condition.methanol_poisoning", - "gtceu:medical_condition.carbon_monoxide_poisoning", + "gtceu:medical_condition/none", + "gtceu:medical_condition/chemical_burns", + "gtceu:medical_condition/poison", + "gtceu:medical_condition/weak_poison", + "gtceu:medical_condition/irritant", + "gtceu:medical_condition/nausea", + "gtceu:medical_condition/carcinogen", + "gtceu:medical_condition/asbestosis", + "gtceu:medical_condition/arsenicosis", + "gtceu:medical_condition/silicosis", + "gtceu:medical_condition/berylliosis", + "gtceu:medical_condition/methanol_poisoning", + "gtceu:medical_condition/carbon_monoxide_poisoning", "gtceu:heat", "gtceu:chemical", "gtceu:radiation", diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/medicalcondition/MedicalCondition.java b/src/main/java/com/gregtechceu/gtceu/api/data/medicalcondition/MedicalCondition.java index fe895df3b72..0bd126827ac 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/medicalcondition/MedicalCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/medicalcondition/MedicalCondition.java @@ -49,7 +49,7 @@ public MedicalCondition(String name, int color, int maxProgression, IdleProgress this.color = color; this.maxProgression = maxProgression; this.damageTypeData = new DamageTypeData.Builder() - .simpleId("medical_condition." + name) + .simpleId("medical_condition/" + name) .scaling(DamageScaling.NEVER) .tag(DamageTypeTags.BYPASSES_ARMOR) .build(); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java index e8f5323beb5..7b962f0b8b0 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java @@ -14,19 +14,19 @@ private static void generateHazardKeys(RegistrateLangProvider provider) { // Medical Conditions provider.add("gtceu.medical_condition.description", "§l§cHAZARDOUS §7Hold Shift to show details"); provider.add("gtceu.medical_condition.description_shift", "§l§cHAZARDOUS:"); - provider.add("gtceu.medical_condition.chemical_burns", "§5Chemical burns"); - provider.add("gtceu.medical_condition.poison", "§2Poisonous"); - provider.add("gtceu.medical_condition.weak_poison", "§aWeakly poisonous"); - provider.add("gtceu.medical_condition.irritant", "§6Irritant"); - provider.add("gtceu.medical_condition.nausea", "§3Nauseating"); - provider.add("gtceu.medical_condition.carcinogen", "§eCarcinogenic"); - provider.add("gtceu.medical_condition.asbestosis", "§dAsbestosis"); - provider.add("gtceu.medical_condition.arsenicosis", "§bArsenicosis"); - provider.add("gtceu.medical_condition.silicosis", "§1Silicosis"); - provider.add("gtceu.medical_condition.berylliosis", "§5Berylliosis"); - provider.add("gtceu.medical_condition.methanol_poisoning", "§6Methanol Poisoning"); - provider.add("gtceu.medical_condition.carbon_monoxide_poisoning", "§7Carbon Monoxide Poisoning"); - provider.add("gtceu.medical_condition.none", "§2Not Dangerous"); + provider.add("gtceu.medical_condition/chemical_burns", "§5Chemical burns"); + provider.add("gtceu.medical_condition/poison", "§2Poisonous"); + provider.add("gtceu.medical_condition/weak_poison", "§aWeakly poisonous"); + provider.add("gtceu.medical_condition/irritant", "§6Irritant"); + provider.add("gtceu.medical_condition/nausea", "§3Nauseating"); + provider.add("gtceu.medical_condition/carcinogen", "§eCarcinogenic"); + provider.add("gtceu.medical_condition/asbestosis", "§dAsbestosis"); + provider.add("gtceu.medical_condition/arsenicosis", "§bArsenicosis"); + provider.add("gtceu.medical_condition/silicosis", "§1Silicosis"); + provider.add("gtceu.medical_condition/berylliosis", "§5Berylliosis"); + provider.add("gtceu.medical_condition/methanol_poisoning", "§6Methanol Poisoning"); + provider.add("gtceu.medical_condition/carbon_monoxide_poisoning", "§7Carbon Monoxide Poisoning"); + provider.add("gtceu.medical_condition/none", "§2Not Dangerous"); // Hazard Triggers provider.add("gtceu.hazard_trigger.description", "Caused by:"); diff --git a/src/main/resources/assets/gtceu/lang/ja_jp.json b/src/main/resources/assets/gtceu/lang/ja_jp.json index 742383e19f0..7a885264e27 100644 --- a/src/main/resources/assets/gtceu/lang/ja_jp.json +++ b/src/main/resources/assets/gtceu/lang/ja_jp.json @@ -2037,19 +2037,19 @@ "death.attack.gtceu.hoe": "%s は %s に丸刈りにされた。", "death.attack.gtceu.knife": "%s は %s に背中を血で洗ってもらった。", "death.attack.gtceu.mallet": "%s は %s の新居の土台となった。", - "death.attack.gtceu.medical_condition.arsenicosis": "%s はヒ素中毒になった。", - "death.attack.gtceu.medical_condition.asbestosis": "%s はアスベストに注意を払わなかった。", - "death.attack.gtceu.medical_condition.berylliosis": "%s はベリリウム肺になってしまった。", - "death.attack.gtceu.medical_condition.carbon_monoxide_poisoning": "%s はストーブをつけっぱなしにして一酸化炭素中毒になってしまった。", - "death.attack.gtceu.medical_condition.carcinogen": "%s は白血病になった。", - "death.attack.gtceu.medical_condition.chemical_burns": "%s は化学事故を起こした。", - "death.attack.gtceu.medical_condition.irritant": "%s は§n§ひどい§r発疹になった。", - "death.attack.gtceu.medical_condition.methanol_poisoning": "%s は禁酒法時代に密造酒を飲もうとした。", - "death.attack.gtceu.medical_condition.nausea": "%s は吐き気で死亡した。", - "death.attack.gtceu.medical_condition.none": "%s の死因は...何でもない?", - "death.attack.gtceu.medical_condition.poison": "%s は有毒物質には毒があることを忘れていた。", - "death.attack.gtceu.medical_condition.silicosis": "%s は結核で死んだのではない、珪肺だったのだ。", - "death.attack.gtceu.medical_condition.weak_poison": "%s は鉛(または水銀)を食べた。", + "death.attack.gtceu.medical_condition/arsenicosis": "%s はヒ素中毒になった。", + "death.attack.gtceu.medical_condition/asbestosis": "%s はアスベストに注意を払わなかった。", + "death.attack.gtceu.medical_condition/berylliosis": "%s はベリリウム肺になってしまった。", + "death.attack.gtceu.medical_condition/carbon_monoxide_poisoning": "%s はストーブをつけっぱなしにして一酸化炭素中毒になってしまった。", + "death.attack.gtceu.medical_condition/carcinogen": "%s は白血病になった。", + "death.attack.gtceu.medical_condition/chemical_burns": "%s は化学事故を起こした。", + "death.attack.gtceu.medical_condition/irritant": "%s は§n§ひどい§r発疹になった。", + "death.attack.gtceu.medical_condition/methanol_poisoning": "%s は禁酒法時代に密造酒を飲もうとした。", + "death.attack.gtceu.medical_condition/nausea": "%s は吐き気で死亡した。", + "death.attack.gtceu.medical_condition/none": "%s の死因は...何でもない?", + "death.attack.gtceu.medical_condition/poison": "%s は有毒物質には毒があることを忘れていた。", + "death.attack.gtceu.medical_condition/silicosis": "%s は結核で死んだのではない、珪肺だったのだ。", + "death.attack.gtceu.medical_condition/weak_poison": "%s は鉛(または水銀)を食べた。", "death.attack.gtceu.mining_hammer": "%s のミネラル成分は %s に摂取された。", "death.attack.gtceu.mortar": "%s は %s に身を粉にされた。", "death.attack.gtceu.pickaxe": "%s の人生最大の輝きは %s のツルハシの耐久値を2減らしたことだった。", @@ -3073,21 +3073,21 @@ "gtceu.medical_condition.antidote.description.effect_removed": "現在の状態の効果を%s%%で取り除く", "gtceu.medical_condition.antidote.description.effect_removed.all": "現在の状態の効果をすべて取り除く", "gtceu.medical_condition.antidote.description_shift": "§aこれらの状態を治す:", - "gtceu.medical_condition.arsenicosis": "§bヒ素中毒", - "gtceu.medical_condition.asbestosis": "§dアスベスト症", - "gtceu.medical_condition.berylliosis": "§5ベリリウム症", - "gtceu.medical_condition.carbon_monoxide_poisoning": "§7一酸化炭素中毒", - "gtceu.medical_condition.carcinogen": "§e発がん性", - "gtceu.medical_condition.chemical_burns": "§5化学熱傷", + "gtceu.medical_condition/arsenicosis": "§bヒ素中毒", + "gtceu.medical_condition/asbestosis": "§dアスベスト症", + "gtceu.medical_condition/berylliosis": "§5ベリリウム症", + "gtceu.medical_condition/carbon_monoxide_poisoning": "§7一酸化炭素中毒", + "gtceu.medical_condition/carcinogen": "§e発がん性", + "gtceu.medical_condition/chemical_burns": "§5化学熱傷", "gtceu.medical_condition.description": "§l§c汚染§7 詳細を表示するにはshiftを押す", "gtceu.medical_condition.description_shift": "§l§c汚染:", - "gtceu.medical_condition.irritant": "§6発疹", - "gtceu.medical_condition.methanol_poisoning": "§6メタノール中毒", - "gtceu.medical_condition.nausea": "§3吐き気", - "gtceu.medical_condition.none": "§2危険ではない", - "gtceu.medical_condition.poison": "§2有毒", - "gtceu.medical_condition.silicosis": "§1珪肺", - "gtceu.medical_condition.weak_poison": "§a弱毒", + "gtceu.medical_condition/irritant": "§6発疹", + "gtceu.medical_condition/methanol_poisoning": "§6メタノール中毒", + "gtceu.medical_condition/nausea": "§3吐き気", + "gtceu.medical_condition/none": "§2危険ではない", + "gtceu.medical_condition/poison": "§2有毒", + "gtceu.medical_condition/silicosis": "§1珪肺", + "gtceu.medical_condition/weak_poison": "§a弱毒", "gtceu.minimap.ore_vein.depleted": "枯渇", "gtceu.mixer": "ミキサー", "gtceu.mode.both": "§d両方(液体とアイテム) §r", diff --git a/src/main/resources/assets/gtceu/lang/ru_ru.json b/src/main/resources/assets/gtceu/lang/ru_ru.json index df3ab958678..25aa3a0b252 100644 --- a/src/main/resources/assets/gtceu/lang/ru_ru.json +++ b/src/main/resources/assets/gtceu/lang/ru_ru.json @@ -4976,7 +4976,7 @@ "material.gtceu.potassium_hydroxide": "Гидроксид калия", "material.gtceu.potassium_iodide": "Йодистый калий", "material.gtceu.sodium_nitrite": "Нитрит натрия", - "death.attack.gtceu.medical_condition.poison": "%s забыл что яды ядовиты", + "death.attack.gtceu.medical_condition/poison": "%s забыл что яды ядовиты", "material.gtceu.acetic_anhydride": "Уксусный ангидрид", "material.gtceu.calcium_carbonate": "Карбонат кальция", "material.gtceu.concentrated_bromine_solution": "Концентрированный раствор брома", @@ -5012,18 +5012,18 @@ "gtceu.medical_condition.antidote.description.effect_removed": "Убирает %s%% последствий текущих заболеваний", "gtceu.medical_condition.antidote.description_shift": "§aЛечит следующие заболевания:", "gtceu.medical_condition.antidote.description": "§aАнтидот §7Зажмите Shift, чтобы просмотреть подробную информацию", - "gtceu.medical_condition.arsenicosis": "§bОтравление мышьяком", - "gtceu.medical_condition.asbestosis": "§dАсбестоз", - "gtceu.medical_condition.berylliosis": "§5Бериллиоз", - "gtceu.medical_condition.carcinogen": "§eКанцерогенный", - "gtceu.medical_condition.chemical_burns": "§5Химический ожог", + "gtceu.medical_condition/arsenicosis": "§bОтравление мышьяком", + "gtceu.medical_condition/asbestosis": "§dАсбестоз", + "gtceu.medical_condition/berylliosis": "§5Бериллиоз", + "gtceu.medical_condition/carcinogen": "§eКанцерогенный", + "gtceu.medical_condition/chemical_burns": "§5Химический ожог", "gtceu.medical_condition.description_shift": "§l§cОПАСНЫЙ:", - "gtceu.medical_condition.methanol_poisoning": "§6Отравление метанолом", - "gtceu.medical_condition.nausea": "§3Тошнотворный", - "gtceu.medical_condition.none": "§2Не опасный", - "gtceu.medical_condition.poison": "§2Ядовитый", - "gtceu.medical_condition.silicosis": "§1Силикоз", - "gtceu.medical_condition.weak_poison": "§aСлабо ядовитый", + "gtceu.medical_condition/methanol_poisoning": "§6Отравление метанолом", + "gtceu.medical_condition/nausea": "§3Тошнотворный", + "gtceu.medical_condition/none": "§2Не опасный", + "gtceu.medical_condition/poison": "§2Ядовитый", + "gtceu.medical_condition/silicosis": "§1Силикоз", + "gtceu.medical_condition/weak_poison": "§aСлабо ядовитый", "gtceu.recipe.total_computation": "Вычисление: %s CWU", "subtitles.gtceu.assembler": "Сборщик собирает", "subtitles.gtceu.bath": "Ванна шипит", @@ -5072,7 +5072,7 @@ "config.gtceu.option.ae2": "ae2", "block.gtceu.mv_air_scrubber": "§bУлучшенный очиститель воздуха §r", "config.gtceu.option.energyConsumption": "energyConsumption", - "gtceu.medical_condition.carbon_monoxide_poisoning": "§7Отравление угарным газом", + "gtceu.medical_condition/carbon_monoxide_poisoning": "§7Отравление угарным газом", "subtitles.gtceu.file": "Напильник скрежет", "subtitles.gtceu.macerator": "Измельчитель измельчает", "subtitles.gtceu.replicator": "Репликатор копирует", @@ -5108,18 +5108,18 @@ "config.jade.plugin_gtceu.parallel_info": "[GTCEu] Параллель", "config.jade.plugin_gtceu.recipe_output_info": "[GTCEu] Вывод рецептов", "config.jade.plugin_gtceu.stained_color": "[GTCEu] Окрашенные блоки", - "death.attack.gtceu.medical_condition.arsenicosis": "%s отравился мышьяком", - "death.attack.gtceu.medical_condition.asbestosis": "%s умер от мезотелиомы", - "death.attack.gtceu.medical_condition.berylliosis": "%s добывал Изумруды слишком рьяно", - "death.attack.gtceu.medical_condition.carbon_monoxide_poisoning": "%s оставил плиту включенной", - "death.attack.gtceu.medical_condition.carcinogen": "У %s лейкемия", - "death.attack.gtceu.medical_condition.chemical_burns": "%s попал в химический инцидент", - "death.attack.gtceu.medical_condition.irritant": "%s получил §n§lОЧЕНЬ§r сильную сыпь", - "death.attack.gtceu.medical_condition.methanol_poisoning": "%s пробовал пить самогон во время сухого закона", - "death.attack.gtceu.medical_condition.nausea": "%s умер от тошноты", - "death.attack.gtceu.medical_condition.none": "%s умер от... ничего?", - "death.attack.gtceu.medical_condition.silicosis": "%s умер не от туберкулёза. Это был Силикоз.", - "death.attack.gtceu.medical_condition.weak_poison": "%s поел свинца (или ртути!)", + "death.attack.gtceu.medical_condition/arsenicosis": "%s отравился мышьяком", + "death.attack.gtceu.medical_condition/asbestosis": "%s умер от мезотелиомы", + "death.attack.gtceu.medical_condition/berylliosis": "%s добывал Изумруды слишком рьяно", + "death.attack.gtceu.medical_condition/carbon_monoxide_poisoning": "%s оставил плиту включенной", + "death.attack.gtceu.medical_condition/carcinogen": "У %s лейкемия", + "death.attack.gtceu.medical_condition/chemical_burns": "%s попал в химический инцидент", + "death.attack.gtceu.medical_condition/irritant": "%s получил §n§lОЧЕНЬ§r сильную сыпь", + "death.attack.gtceu.medical_condition/methanol_poisoning": "%s пробовал пить самогон во время сухого закона", + "death.attack.gtceu.medical_condition/nausea": "%s умер от тошноты", + "death.attack.gtceu.medical_condition/none": "%s умер от... ничего?", + "death.attack.gtceu.medical_condition/silicosis": "%s умер не от туберкулёза. Это был Силикоз.", + "death.attack.gtceu.medical_condition/weak_poison": "%s поел свинца (или ртути!)", "gtceu.air_scrubber": "Очиститель воздуха", "gtceu.duct_pipe.transfer_rate": "§bСкорость передачи воздуха: %s", "gtceu.evaporation": "Выпаривание", @@ -5130,7 +5130,7 @@ "gtceu.hazard_trigger.protection.description": "Защищает от:", "gtceu.hazard_trigger.skin_contact": "Контакт с кожей", "gtceu.jade.cleaned_this_second": "Убирает опасность: %s/с", - "gtceu.medical_condition.irritant": "§6Раздражитель", + "gtceu.medical_condition/irritant": "§6Раздражитель", "subtitles.gtceu.turbine": "Турбина воет", "subtitles.gtceu.wirecutter": "Провод перекусился", "subtitles.gtceu.wrench": "Ключ стрекочет", diff --git a/src/main/resources/assets/gtceu/lang/uk_ua.json b/src/main/resources/assets/gtceu/lang/uk_ua.json index 3dd1c8e949b..c9018a1ebff 100644 --- a/src/main/resources/assets/gtceu/lang/uk_ua.json +++ b/src/main/resources/assets/gtceu/lang/uk_ua.json @@ -1,18 +1,18 @@ { "translators": "discord: tenwoc, roll_54. for minestar.com.ua", - "death.attack.gtceu.medical_condition.arsenicosis": "%s отруївся миш'яком", - "death.attack.gtceu.medical_condition.asbestosis": "%s програв мезотеліомі", - "death.attack.gtceu.medical_condition.berylliosis": "%s надто жадав добувати смарагди", - "death.attack.gtceu.medical_condition.carbon_monoxide_poisoning": "%s залишив плиту увімкненою", - "death.attack.gtceu.medical_condition.carcinogen": "%s не витримав лейкемії", - "death.attack.gtceu.medical_condition.chemical_burns": "%s став учасником хімічної аварії", - "death.attack.gtceu.medical_condition.irritant": "%s отримав§n§l дУЖЕ§r сильний висип", - "death.attack.gtceu.medical_condition.methanol_poisoning": "%s наважився випити самогону в час сухого закону", - "death.attack.gtceu.medical_condition.nausea": "%s помер від нудоти", - "death.attack.gtceu.medical_condition.none": "%s помер від... нічого?", - "death.attack.gtceu.medical_condition.poison": "%s забув, що отруйні матеріали дійсно є отруйними", - "death.attack.gtceu.medical_condition.silicosis": "%s помер не від туберкульозу. Його життя обірвав силікоз.", - "death.attack.gtceu.medical_condition.weak_poison": "%s скуштував свинцю (або меркурію!)", + "death.attack.gtceu.medical_condition/arsenicosis": "%s отруївся миш'яком", + "death.attack.gtceu.medical_condition/asbestosis": "%s програв мезотеліомі", + "death.attack.gtceu.medical_condition/berylliosis": "%s надто жадав добувати смарагди", + "death.attack.gtceu.medical_condition/carbon_monoxide_poisoning": "%s залишив плиту увімкненою", + "death.attack.gtceu.medical_condition/carcinogen": "%s не витримав лейкемії", + "death.attack.gtceu.medical_condition/chemical_burns": "%s став учасником хімічної аварії", + "death.attack.gtceu.medical_condition/irritant": "%s отримав§n§l дУЖЕ§r сильний висип", + "death.attack.gtceu.medical_condition/methanol_poisoning": "%s наважився випити самогону в час сухого закону", + "death.attack.gtceu.medical_condition/nausea": "%s помер від нудоти", + "death.attack.gtceu.medical_condition/none": "%s помер від... нічого?", + "death.attack.gtceu.medical_condition/poison": "%s забув, що отруйні матеріали дійсно є отруйними", + "death.attack.gtceu.medical_condition/silicosis": "%s помер не від туберкульозу. Його життя обірвав силікоз.", + "death.attack.gtceu.medical_condition/weak_poison": "%s скуштував свинцю (або меркурію!)", "death.attack.gtceu.explosion": "%s вибухнув", "death.attack.gtceu.explosion.player": "%s вибухнув за допомогою %s", "death.attack.gtceu.frost": "%s пізнав кріогеніку", @@ -1469,19 +1469,19 @@ "gtceu.medical_condition.antidote.description_shift": "§aВиліковує ці ураження:", "gtceu.medical_condition.description": "§l§cНЕБЕЗПЕЧНО§7 Утримуйте Shift для подробиць", "gtceu.medical_condition.description_shift": "§l§cНЕБЕЗПЕКА:", - "gtceu.medical_condition.arsenicosis": "§bОтруєння миш'яком", - "gtceu.medical_condition.asbestosis": "§dАзбестоз", - "gtceu.medical_condition.berylliosis": "§5Бериліоз", - "gtceu.medical_condition.carbon_monoxide_poisoning": "§7Отруєння монооксидом вуглецю", - "gtceu.medical_condition.carcinogen": "§eРадіоактивне опромінення", - "gtceu.medical_condition.chemical_burns": "§5Хімічні опіки", - "gtceu.medical_condition.irritant": "§6Подразення", - "gtceu.medical_condition.methanol_poisoning": "§6Отруєння метанолом", - "gtceu.medical_condition.nausea": "§3Нудота", - "gtceu.medical_condition.none": "§2(Не²)Безпечно", - "gtceu.medical_condition.poison": "§2Отрута", - "gtceu.medical_condition.silicosis": "§1Силікоз", - "gtceu.medical_condition.weak_poison": "§aСлабка отрута", + "gtceu.medical_condition/arsenicosis": "§bОтруєння миш'яком", + "gtceu.medical_condition/asbestosis": "§dАзбестоз", + "gtceu.medical_condition/berylliosis": "§5Бериліоз", + "gtceu.medical_condition/carbon_monoxide_poisoning": "§7Отруєння монооксидом вуглецю", + "gtceu.medical_condition/carcinogen": "§eРадіоактивне опромінення", + "gtceu.medical_condition/chemical_burns": "§5Хімічні опіки", + "gtceu.medical_condition/irritant": "§6Подразення", + "gtceu.medical_condition/methanol_poisoning": "§6Отруєння метанолом", + "gtceu.medical_condition/nausea": "§3Нудота", + "gtceu.medical_condition/none": "§2(Не²)Безпечно", + "gtceu.medical_condition/poison": "§2Отрута", + "gtceu.medical_condition/silicosis": "§1Силікоз", + "gtceu.medical_condition/weak_poison": "§aСлабка отрута", "gtceu.hazard_trigger.description": "Спричиняється:", "gtceu.hazard_trigger.protection.description": "Захищає:", "gtceu.hazard_trigger.any": "При будь-якому контакті", diff --git a/src/main/resources/assets/gtceu/lang/zh_cn.json b/src/main/resources/assets/gtceu/lang/zh_cn.json index 94db995c22a..fc8e9f37416 100644 --- a/src/main/resources/assets/gtceu/lang/zh_cn.json +++ b/src/main/resources/assets/gtceu/lang/zh_cn.json @@ -2096,19 +2096,19 @@ "death.attack.gtceu.hoe": "%s被%s锄死了", "death.attack.gtceu.knife": "%2$s绅士地捅了%1$s几刀", "death.attack.gtceu.mallet": "%s被%s用锤头活活敲死了", - "death.attack.gtceu.medical_condition.arsenicosis": "%s死于砷中毒", - "death.attack.gtceu.medical_condition.asbestosis": "%s得了间皮瘤", - "death.attack.gtceu.medical_condition.berylliosis": "%s贪婪地挖掘绿宝石,结果有点过火了", - "death.attack.gtceu.medical_condition.carbon_monoxide_poisoning": "%s离开时炉子还开着", - "death.attack.gtceu.medical_condition.carcinogen": "%s身患白血病", - "death.attack.gtceu.medical_condition.chemical_burns": "%s历经了一场化学事故", - "death.attack.gtceu.medical_condition.irritant": "%s身上长了§n§l极其严重§r的皮疹", - "death.attack.gtceu.medical_condition.methanol_poisoning": "%s在禁酒令下尝试饮用私酿烈酒", - "death.attack.gtceu.medical_condition.nausea": "%s死于恶心", - "death.attack.gtceu.medical_condition.none": "%s死于...什么都没有?", - "death.attack.gtceu.medical_condition.poison": "%s忘了毒物的确有毒", - "death.attack.gtceu.medical_condition.silicosis": "%s不是死于肺结核,而是矽肺病", - "death.attack.gtceu.medical_condition.weak_poison": "%s吞下了铅(或水银!)", + "death.attack.gtceu.medical_condition/arsenicosis": "%s死于砷中毒", + "death.attack.gtceu.medical_condition/asbestosis": "%s得了间皮瘤", + "death.attack.gtceu.medical_condition/berylliosis": "%s贪婪地挖掘绿宝石,结果有点过火了", + "death.attack.gtceu.medical_condition/carbon_monoxide_poisoning": "%s离开时炉子还开着", + "death.attack.gtceu.medical_condition/carcinogen": "%s身患白血病", + "death.attack.gtceu.medical_condition/chemical_burns": "%s历经了一场化学事故", + "death.attack.gtceu.medical_condition/irritant": "%s身上长了§n§l极其严重§r的皮疹", + "death.attack.gtceu.medical_condition/methanol_poisoning": "%s在禁酒令下尝试饮用私酿烈酒", + "death.attack.gtceu.medical_condition/nausea": "%s死于恶心", + "death.attack.gtceu.medical_condition/none": "%s死于...什么都没有?", + "death.attack.gtceu.medical_condition/poison": "%s忘了毒物的确有毒", + "death.attack.gtceu.medical_condition/silicosis": "%s不是死于肺结核,而是矽肺病", + "death.attack.gtceu.medical_condition/weak_poison": "%s吞下了铅(或水银!)", "death.attack.gtceu.mining_hammer": "%s被%s当成矿石砸死了", "death.attack.gtceu.mortar": "%s被%s用研钵磨成了粉", "death.attack.gtceu.pickaxe": "%s被%s用镐子凿死了", @@ -3132,21 +3132,21 @@ "gtceu.medical_condition.antidote.description.effect_removed": "疾病效果持续时间降低%s%%", "gtceu.medical_condition.antidote.description.effect_removed.all": "消除所有疾病效果", "gtceu.medical_condition.antidote.description_shift": "§a治愈以下疾病:", - "gtceu.medical_condition.arsenicosis": "§b砷中毒", - "gtceu.medical_condition.asbestosis": "§d石棉肺", - "gtceu.medical_condition.berylliosis": "§5铍中毒", - "gtceu.medical_condition.carbon_monoxide_poisoning": "§7一氧化碳污染", - "gtceu.medical_condition.carcinogen": "§e致癌", - "gtceu.medical_condition.chemical_burns": "§5化学烧伤", + "gtceu.medical_condition/arsenicosis": "§b砷中毒", + "gtceu.medical_condition/asbestosis": "§d石棉肺", + "gtceu.medical_condition/berylliosis": "§5铍中毒", + "gtceu.medical_condition/carbon_monoxide_poisoning": "§7一氧化碳污染", + "gtceu.medical_condition/carcinogen": "§e致癌", + "gtceu.medical_condition/chemical_burns": "§5化学烧伤", "gtceu.medical_condition.description": "§c§l危险物质 §7按住Shift以显示详情", "gtceu.medical_condition.description_shift": "§c§l危险物质:", - "gtceu.medical_condition.irritant": "§6刺激性", - "gtceu.medical_condition.methanol_poisoning": "§6甲醇中毒", - "gtceu.medical_condition.nausea": "§3恶心", - "gtceu.medical_condition.none": "§2无害", - "gtceu.medical_condition.poison": "§2中毒", - "gtceu.medical_condition.silicosis": "§1矽肺病", - "gtceu.medical_condition.weak_poison": "§a轻度中毒", + "gtceu.medical_condition/irritant": "§6刺激性", + "gtceu.medical_condition/methanol_poisoning": "§6甲醇中毒", + "gtceu.medical_condition/nausea": "§3恶心", + "gtceu.medical_condition/none": "§2无害", + "gtceu.medical_condition/poison": "§2中毒", + "gtceu.medical_condition/silicosis": "§1矽肺病", + "gtceu.medical_condition/weak_poison": "§a轻度中毒", "gtceu.minimap.ore_vein.depleted": "已枯竭", "gtceu.mixer": "搅拌机", "gtceu.mode.both": "§d全部(流体和物品)§r", diff --git a/src/main/resources/assets/gtceu/lang/zh_tw.json b/src/main/resources/assets/gtceu/lang/zh_tw.json index afe08839eed..b27a5136f03 100644 --- a/src/main/resources/assets/gtceu/lang/zh_tw.json +++ b/src/main/resources/assets/gtceu/lang/zh_tw.json @@ -2092,19 +2092,19 @@ "death.attack.gtceu.hoe": "%s被%s鋤死了", "death.attack.gtceu.knife": "%2$s紳士地捅了%1$s幾刀", "death.attack.gtceu.mallet": "%s被%s用錘頭活活敲死了", - "death.attack.gtceu.medical_condition.arsenicosis": "%s死於砷中毒", - "death.attack.gtceu.medical_condition.asbestosis": "%s得了間皮瘤", - "death.attack.gtceu.medical_condition.berylliosis": "%s貪婪地挖掘綠寶石,結果有點過火了", - "death.attack.gtceu.medical_condition.carbon_monoxide_poisoning": "%s離開時爐子還開着", - "death.attack.gtceu.medical_condition.carcinogen": "%s身患白血病", - "death.attack.gtceu.medical_condition.chemical_burns": "%s歷經了一場化學事故", - "death.attack.gtceu.medical_condition.irritant": "%s身上長了§n§l極其嚴重§r的皮疹", - "death.attack.gtceu.medical_condition.methanol_poisoning": "%s在禁酒令下嘗試飲用私釀烈酒", - "death.attack.gtceu.medical_condition.nausea": "%s死於噁心", - "death.attack.gtceu.medical_condition.none": "%s死於...什麼都沒有?", - "death.attack.gtceu.medical_condition.poison": "%s忘了毒物的確有毒", - "death.attack.gtceu.medical_condition.silicosis": "%s不是死於肺結核,而是矽肺病", - "death.attack.gtceu.medical_condition.weak_poison": "%s吞下了鉛(或水銀!)", + "death.attack.gtceu.medical_condition/arsenicosis": "%s死於砷中毒", + "death.attack.gtceu.medical_condition/asbestosis": "%s得了間皮瘤", + "death.attack.gtceu.medical_condition/berylliosis": "%s貪婪地挖掘綠寶石,結果有點過火了", + "death.attack.gtceu.medical_condition/carbon_monoxide_poisoning": "%s離開時爐子還開着", + "death.attack.gtceu.medical_condition/carcinogen": "%s身患白血病", + "death.attack.gtceu.medical_condition/chemical_burns": "%s歷經了一場化學事故", + "death.attack.gtceu.medical_condition/irritant": "%s身上長了§n§l極其嚴重§r的皮疹", + "death.attack.gtceu.medical_condition/methanol_poisoning": "%s在禁酒令下嘗試飲用私釀烈酒", + "death.attack.gtceu.medical_condition/nausea": "%s死於噁心", + "death.attack.gtceu.medical_condition/none": "%s死於...什麼都沒有?", + "death.attack.gtceu.medical_condition/poison": "%s忘了毒物的確有毒", + "death.attack.gtceu.medical_condition/silicosis": "%s不是死於肺結核,而是矽肺病", + "death.attack.gtceu.medical_condition/weak_poison": "%s吞下了鉛(或水銀!)", "death.attack.gtceu.mining_hammer": "%s被%s當成礦砸死了", "death.attack.gtceu.mortar": "%s被%s用研缽磨成了粉", "death.attack.gtceu.pickaxe": "%s被%s用鎬子鑿死了", @@ -3127,21 +3127,21 @@ "gtceu.medical_condition.antidote.description.effect_removed": "疾病效果持續時間降低%s%%", "gtceu.medical_condition.antidote.description.effect_removed.all": "消除所有疾病效果", "gtceu.medical_condition.antidote.description_shift": "§a治癒以下疾病:", - "gtceu.medical_condition.arsenicosis": "§b砷中毒", - "gtceu.medical_condition.asbestosis": "§d石棉肺", - "gtceu.medical_condition.berylliosis": "§5鈹中毒", - "gtceu.medical_condition.carbon_monoxide_poisoning": "§7一氧化碳汙染", - "gtceu.medical_condition.carcinogen": "§e致癌", - "gtceu.medical_condition.chemical_burns": "§5化學燒傷", + "gtceu.medical_condition/arsenicosis": "§b砷中毒", + "gtceu.medical_condition/asbestosis": "§d石棉肺", + "gtceu.medical_condition/berylliosis": "§5鈹中毒", + "gtceu.medical_condition/carbon_monoxide_poisoning": "§7一氧化碳汙染", + "gtceu.medical_condition/carcinogen": "§e致癌", + "gtceu.medical_condition/chemical_burns": "§5化學燒傷", "gtceu.medical_condition.description": "§c§l危險物質 §7按住Shift以顯示詳情", "gtceu.medical_condition.description_shift": "§c§l危險物質:", - "gtceu.medical_condition.irritant": "§6刺激性", - "gtceu.medical_condition.methanol_poisoning": "§6甲醇中毒", - "gtceu.medical_condition.nausea": "§3噁心", - "gtceu.medical_condition.none": "§2無害", - "gtceu.medical_condition.poison": "§2中毒", - "gtceu.medical_condition.silicosis": "§1矽肺病", - "gtceu.medical_condition.weak_poison": "§a輕度中毒", + "gtceu.medical_condition/irritant": "§6刺激性", + "gtceu.medical_condition/methanol_poisoning": "§6甲醇中毒", + "gtceu.medical_condition/nausea": "§3噁心", + "gtceu.medical_condition/none": "§2無害", + "gtceu.medical_condition/poison": "§2中毒", + "gtceu.medical_condition/silicosis": "§1矽肺病", + "gtceu.medical_condition/weak_poison": "§a輕度中毒", "gtceu.minimap.ore_vein.depleted": "已枯竭", "gtceu.mixer": "攪拌機", "gtceu.mode.both": "§d全部(流體和物品)§r", From ba989df5ff7dfc976e3a3579b0eb30a88a4451b6 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Tue, 24 Jun 2025 23:42:17 -0600 Subject: [PATCH 20/45] requested changes --- .../resources/assets/gtceu/lang/en_ud.json | 27 ++++++------ .../resources/assets/gtceu/lang/en_us.json | 27 ++++++------ .../gtceu/client/TooltipsHandler.java | 6 +-- .../gtceu/data/lang/BlockLang.java | 5 --- .../gtceu/data/lang/HazardLang.java | 18 ++++++++ .../gtceu/data/lang/IntegrationLang.java | 2 +- .../gtceu/data/lang/MaterialLang.java | 2 - .../gregtechceu/gtceu/data/lang/ToolLang.java | 44 +++++-------------- .../resources/assets/gtceu/lang/ja_jp.json | 26 +++++------ .../resources/assets/gtceu/lang/ru_ru.json | 26 +++++------ .../resources/assets/gtceu/lang/uk_ua.json | 26 +++++------ .../resources/assets/gtceu/lang/zh_cn.json | 26 +++++------ .../resources/assets/gtceu/lang/zh_tw.json | 26 +++++------ 13 files changed, 121 insertions(+), 140 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 78ef77fd9ea..70a5fab52cb 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -2175,19 +2175,19 @@ "death.attack.gtceu.hoe": "%s ʎq pǝןןıʇ pɐǝɥ ɹıǝɥʇ pɐɥ %s", "death.attack.gtceu.knife": "%s ʎq pǝʞod ʎןʇuǝb sɐʍ %s", "death.attack.gtceu.mallet": "%s ʎq ɥʇɐǝp oʇ pǝɹǝɯɯɐɥ ʇob %s", - "death.attack.gtceu.medical_condition/arsenicosis": "buıuosıod ɔıuǝsɹɐ ʇob %s", - "death.attack.gtceu.medical_condition/asbestosis": "ɐɯoıןǝɥʇosǝɯ ʇob %s", - "death.attack.gtceu.medical_condition/berylliosis": "ʎןıpǝǝɹb ooʇ ʇıq ɐ spןɐɹǝɯǝ pǝuıɯ %s", - "death.attack.gtceu.medical_condition/carbon_monoxide_poisoning": "uo ǝʌoʇs ǝɥʇ ʇɟǝן %s", - "death.attack.gtceu.medical_condition/carcinogen": "ɐıɯǝʞnǝן ʇob %s", - "death.attack.gtceu.medical_condition/chemical_burns": "ʇuǝpıɔɔɐ ןɐɔıɯǝɥɔ ɐ pɐɥ %s", - "death.attack.gtceu.medical_condition/irritant": "ɥsɐɹ pɐq ɹ§ʎꞀꞀⱯƎᴚן§u§ ɐ ʇob %s", - "death.attack.gtceu.medical_condition/methanol_poisoning": "uoıʇıqıɥoɹd ǝɥʇ buıɹnp ǝuıɥsuooɯ ʞuıɹp oʇ pǝıɹʇ %s", - "death.attack.gtceu.medical_condition/nausea": "ɐǝsnɐu ɟo pǝıp %s", - "death.attack.gtceu.medical_condition/none": "¿buıɥʇou ˙˙˙ɟo pǝıp %s", - "death.attack.gtceu.medical_condition/poison": "snouosıod 'ʇɔɐɟ uı 'ǝɹɐ sןɐıɹǝʇɐɯ snouosıod ʇɐɥʇ ʇobɹoɟ %s", - "death.attack.gtceu.medical_condition/silicosis": "˙sısoɔıןıs sɐʍ ʇı ˙sısoןnɔɹǝqnʇ ɟo ǝıp ʇ,upıp %s", - "death.attack.gtceu.medical_condition/weak_poison": ")¡ʎɹnɔɹǝɯ ɹo( pɐǝן ǝʇɐ %s", + "death.attack.gtceu.medical_condition.arsenicosis": "buıuosıod ɔıuǝsɹɐ ʇob %s", + "death.attack.gtceu.medical_condition.asbestosis": "ɐɯoıןǝɥʇosǝɯ ʇob %s", + "death.attack.gtceu.medical_condition.berylliosis": "ʎןıpǝǝɹb ooʇ ʇıq ɐ spןɐɹǝɯǝ pǝuıɯ %s", + "death.attack.gtceu.medical_condition.carbon_monoxide_poisoning": "uo ǝʌoʇs ǝɥʇ ʇɟǝן %s", + "death.attack.gtceu.medical_condition.carcinogen": "ɐıɯǝʞnǝן ʇob %s", + "death.attack.gtceu.medical_condition.chemical_burns": "ʇuǝpıɔɔɐ ןɐɔıɯǝɥɔ ɐ pɐɥ %s", + "death.attack.gtceu.medical_condition.irritant": "ɥsɐɹ pɐq ɹ§ʎꞀꞀⱯƎᴚן§u§ ɐ ʇob %s", + "death.attack.gtceu.medical_condition.methanol_poisoning": "uoıʇıqıɥoɹd ǝɥʇ buıɹnp ǝuıɥsuooɯ ʞuıɹp oʇ pǝıɹʇ %s", + "death.attack.gtceu.medical_condition.nausea": "ɐǝsnɐu ɟo pǝıp %s", + "death.attack.gtceu.medical_condition.none": "¿buıɥʇou ˙˙˙ɟo pǝıp %s", + "death.attack.gtceu.medical_condition.poison": "snouosıod 'ʇɔɐɟ uı 'ǝɹɐ sןɐıɹǝʇɐɯ snouosıod ʇɐɥʇ ʇobɹoɟ %s", + "death.attack.gtceu.medical_condition.silicosis": "˙sısoɔıןıs sɐʍ ʇı ˙sısoןnɔɹǝqnʇ ɟo ǝıp ʇ,upıp %s", + "death.attack.gtceu.medical_condition.weak_poison": ")¡ʎɹnɔɹǝɯ ɹo( pɐǝן ǝʇɐ %s", "death.attack.gtceu.mining_hammer": "%s ʎq ǝɹO ɹoɟ uǝʞɐʇsıɯ sɐʍ %s", "death.attack.gtceu.mortar": "%s ʎq ʇsnp oʇ punoɹb sɐʍ %s", "death.attack.gtceu.pickaxe": "%s ʎq pǝuıɯ ʇob %s", @@ -2204,7 +2204,6 @@ "death.attack.gtceu.wrench_iv": "%s ʎq suɐןd ɹıǝɥʇ oʇuı uʍoɹɥʇ ɥɔuǝɹM ʎǝʞuoW ɐ pɐɥ %s", "death.attack.gtceu.wrench_lv": "%s ʎq pǝuǝsooן ǝɹǝʍ sǝdıd s,%s", "effect.gtceu.weak_poison": "uosıoԀ ʞɐǝM", - "enchantment.damage.disjunction": "uoıʇɔunظsıᗡ", "enchantment.disjunction": "uoıʇɔunظsıᗡ", "enchantment.gtceu.disjunction.description": "˙sqoɯ pǝʇɐןǝɹ-ɹǝpuƎ oʇ ssǝuʍoןS puɐ ssǝuʞɐǝM sǝıןddⱯ", "enchantment.gtceu.hard_hammer.description": "˙ɹǝɯɯɐH ɥɔǝ⟘bǝɹ⅁ ɐ ɥʇıʍ pǝuıɯ ǝɹǝʍ ʎǝɥʇ ɟı sɐ sʞɔoןq sʞɐǝɹᗺ", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 8dc25e87eb3..8e02476a1a1 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -2175,19 +2175,19 @@ "death.attack.gtceu.hoe": "%s had their head tilled by %s", "death.attack.gtceu.knife": "%s was gently poked by %s", "death.attack.gtceu.mallet": "%s got hammered to death by %s", - "death.attack.gtceu.medical_condition/arsenicosis": "%s got arsenic poisoning", - "death.attack.gtceu.medical_condition/asbestosis": "%s got mesothelioma", - "death.attack.gtceu.medical_condition/berylliosis": "%s mined emeralds a bit too greedily", - "death.attack.gtceu.medical_condition/carbon_monoxide_poisoning": "%s left the stove on", - "death.attack.gtceu.medical_condition/carcinogen": "%s got leukemia", - "death.attack.gtceu.medical_condition/chemical_burns": "%s had a chemical accident", - "death.attack.gtceu.medical_condition/irritant": "%s got a §n§lREALLY§r bad rash", - "death.attack.gtceu.medical_condition/methanol_poisoning": "%s tried to drink moonshine during the prohibition", - "death.attack.gtceu.medical_condition/nausea": "%s died of nausea", - "death.attack.gtceu.medical_condition/none": "%s died of... nothing?", - "death.attack.gtceu.medical_condition/poison": "%s forgot that poisonous materials are, in fact, poisonous", - "death.attack.gtceu.medical_condition/silicosis": "%s didn't die of tuberculosis. it was silicosis.", - "death.attack.gtceu.medical_condition/weak_poison": "%s ate lead (or mercury!)", + "death.attack.gtceu.medical_condition.arsenicosis": "%s got arsenic poisoning", + "death.attack.gtceu.medical_condition.asbestosis": "%s got mesothelioma", + "death.attack.gtceu.medical_condition.berylliosis": "%s mined emeralds a bit too greedily", + "death.attack.gtceu.medical_condition.carbon_monoxide_poisoning": "%s left the stove on", + "death.attack.gtceu.medical_condition.carcinogen": "%s got leukemia", + "death.attack.gtceu.medical_condition.chemical_burns": "%s had a chemical accident", + "death.attack.gtceu.medical_condition.irritant": "%s got a §n§lREALLY§r bad rash", + "death.attack.gtceu.medical_condition.methanol_poisoning": "%s tried to drink moonshine during the prohibition", + "death.attack.gtceu.medical_condition.nausea": "%s died of nausea", + "death.attack.gtceu.medical_condition.none": "%s died of... nothing?", + "death.attack.gtceu.medical_condition.poison": "%s forgot that poisonous materials are, in fact, poisonous", + "death.attack.gtceu.medical_condition.silicosis": "%s didn't die of tuberculosis. it was silicosis.", + "death.attack.gtceu.medical_condition.weak_poison": "%s ate lead (or mercury!)", "death.attack.gtceu.mining_hammer": "%s was mistaken for Ore by %s", "death.attack.gtceu.mortar": "%s was ground to dust by %s", "death.attack.gtceu.pickaxe": "%s got mined by %s", @@ -2204,7 +2204,6 @@ "death.attack.gtceu.wrench_iv": "%s had a Monkey Wrench thrown into their plans by %s", "death.attack.gtceu.wrench_lv": "%s's pipes were loosened by %s", "effect.gtceu.weak_poison": "Weak Poison", - "enchantment.damage.disjunction": "Disjunction", "enchantment.disjunction": "Disjunction", "enchantment.gtceu.disjunction.description": "Applies Weakness and Slowness to Ender-related mobs.", "enchantment.gtceu.hard_hammer.description": "Breaks blocks as if they were mined with a GregTech Hammer.", diff --git a/src/main/java/com/gregtechceu/gtceu/client/TooltipsHandler.java b/src/main/java/com/gregtechceu/gtceu/client/TooltipsHandler.java index a7f778b09f5..071114aa159 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/TooltipsHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/client/TooltipsHandler.java @@ -115,11 +115,7 @@ public static void appendFluidTooltips(FluidStack fluidStack, Consumer tooltips.accept(Component.translatable("fluid.gtceu.tooltip.liquid")); - case GAS -> tooltips.accept(Component.translatable("fluid.gtceu.tooltip.gas")); - case PLASMA -> tooltips.accept(Component.translatable("fluid.gtceu.tooltip.plasma")); - } + tooltips.accept(Component.translatable(state.getTranslationKey())); attributedFluid.getAttributes().forEach(a -> a.appendFluidTooltips(tooltips)); } else { String key = "gtceu.fluid.state_" + (fluidType.isLighterThanAir() ? "gas" : "liquid"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java index fc60763324c..b96f2270cdf 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java @@ -101,11 +101,6 @@ private static void generateBlockKeys(RegistrateLangProvider provider) { // Extra stone blocks provider.add("block.gtceu.seal", "Sealed Block"); - // provider.add("block.gtceu.foam", "Foam"); - // provider.add("block.gtceu.reinforced_foam", "Reinforced Foam"); - // provider.add("block.gtceu.petrified_foam", "Petrified Foam"); - // provider.add("block.gtceu.reinforced_stone", "Reinforced Stone"); - // provider.add("block.gtceu.brittle_charcoal", "Brittle Charcoal"); // Surface Rocks provider.add("block.surface_rock", "%s Surface Rock"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java index 7b962f0b8b0..400f5897cf8 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java @@ -50,5 +50,23 @@ private static void generateHazardKeys(RegistrateLangProvider provider) { // Poison provider.add("effect.gtceu.weak_poison", "Weak Poison"); + + // Medical Deaths + provider.add("death.attack.gtceu.medical_condition.asbestosis", "%s got mesothelioma"); + provider.add("death.attack.gtceu.medical_condition.chemical_burns", "%s had a chemical accident"); + provider.add("death.attack.gtceu.medical_condition.poison", + "%s forgot that poisonous materials are, in fact, poisonous"); + provider.add("death.attack.gtceu.medical_condition.silicosis", + "%s didn't die of tuberculosis. it was silicosis."); + provider.add("death.attack.gtceu.medical_condition.arsenicosis", "%s got arsenic poisoning"); + provider.add("death.attack.gtceu.medical_condition.berylliosis", "%s mined emeralds a bit too greedily"); + provider.add("death.attack.gtceu.medical_condition.carcinogen", "%s got leukemia"); + provider.add("death.attack.gtceu.medical_condition.irritant", "%s got a §n§lREALLY§r bad rash"); + provider.add("death.attack.gtceu.medical_condition.methanol_poisoning", + "%s tried to drink moonshine during the prohibition"); + provider.add("death.attack.gtceu.medical_condition.nausea", "%s died of nausea"); + provider.add("death.attack.gtceu.medical_condition.none", "%s died of... nothing?"); + provider.add("death.attack.gtceu.medical_condition.weak_poison", "%s ate lead (or mercury!)"); + provider.add("death.attack.gtceu.medical_condition.carbon_monoxide_poisoning", "%s left the stove on"); } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java index 2fa0e25becd..cb8b51646b7 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java @@ -222,7 +222,7 @@ private static void initMinimapLang(RegistrateLangProvider provider) { provider.add("message.gtceu.new_veins.amount", "Prospected %d new veins!"); provider.add("message.gtceu.new_veins.name", "Prospected %s!"); - // Options + // JourneyMap button names provider.add("gtceu.journeymap.options.layers", "Prospection layers"); provider.add("gtceu.journeymap.options.layers.ore_veins", "Show Ore Veins"); provider.add("gtceu.journeymap.options.layers.bedrock_fluids", "Show Bedrock Fluid Veins"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java index 9ba52bc4047..83df1423ca9 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java @@ -103,8 +103,6 @@ private static void generateCustomMaterialNames(RegistrateLangProvider provider) replace(provider, Stellite100.getUnlocalizedName(), "Stellite-100"); replace(provider, HastelloyC276.getUnlocalizedName(), "Hastelloy C-276"); - // replace(provider, GTMaterialBlocks.MATERIAL_BLOCKS.get(TagPrefix.oreNetherrack, - // NetherQuartz).get().getDescriptionId(), "Nether Quartz Ore"); replace(provider, "item.gtceu.nether_quartz_netherrack", "Nether Quartz Ore"); } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java index 80aba6d2a6e..9f5e8e52901 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java @@ -13,7 +13,6 @@ public static void init(RegistrateLangProvider provider) { generateTooltips(provider); generateBehaviorKeys(provider); generateActionKeys(provider); - generateToolInfoKeys(provider); generateEnchantKeys(provider); } @@ -57,24 +56,6 @@ private static void initDeathMessages(RegistrateLangProvider provider) { provider.add("death.attack.gtceu.wrench_iv", "%s had a Monkey Wrench thrown into their plans by %s"); provider.add("death.attack.gtceu.buzzsaw", "%s got buzzed by %s"); provider.add("death.attack.gtceu.screwdriver_lv", "%s had their screws removed by %s"); - - // Medical Deaths - provider.add("death.attack.gtceu.medical_condition.asbestosis", "%s got mesothelioma"); - provider.add("death.attack.gtceu.medical_condition.chemical_burns", "%s had a chemical accident"); - provider.add("death.attack.gtceu.medical_condition.poison", - "%s forgot that poisonous materials are, in fact, poisonous"); - provider.add("death.attack.gtceu.medical_condition.silicosis", - "%s didn't die of tuberculosis. it was silicosis."); - provider.add("death.attack.gtceu.medical_condition.arsenicosis", "%s got arsenic poisoning"); - provider.add("death.attack.gtceu.medical_condition.berylliosis", "%s mined emeralds a bit too greedily"); - provider.add("death.attack.gtceu.medical_condition.carcinogen", "%s got leukemia"); - provider.add("death.attack.gtceu.medical_condition.irritant", "%s got a §n§lREALLY§r bad rash"); - provider.add("death.attack.gtceu.medical_condition.methanol_poisoning", - "%s tried to drink moonshine during the prohibition"); - provider.add("death.attack.gtceu.medical_condition.nausea", "%s died of nausea"); - provider.add("death.attack.gtceu.medical_condition.none", "%s died of... nothing?"); - provider.add("death.attack.gtceu.medical_condition.weak_poison", "%s ate lead (or mercury!)"); - provider.add("death.attack.gtceu.medical_condition.carbon_monoxide_poisoning", "%s left the stove on"); } public static void generateToolClassKeys(RegistrateLangProvider provider) { @@ -216,6 +197,16 @@ public static void generateTooltips(RegistrateLangProvider provider) { multiLang(provider, "item.gtceu.tool.harvest_level", "§8Wood", "§7Stone", "§aIron", "§bDiamond", "§dNetherite", "§9Duranium", "§cNeutronium"); + provider.add("tool.gtceu.repair_info.tooltip", "§8Hold SHIFT to show Repair Info"); + provider.add("tool.gtceu.repair_material.tooltip", "§8Repair with: §f§a%s"); + provider.add("item.gtceu.tool.replace_tool_head", "Craft with a new Tool Head to replace it"); + provider.add("item.gtceu.tool.usable_as", "§8Usable as: §f%s"); + + // Rotors + provider.add("item.tool.tooltip.primary_material", "§fMaterial: §e%s"); + provider.add("item.tool.tooltip.durability", "§fDurability: §a%d / %d"); + provider.add("item.tool.tooltip.rotor.efficiency", "Turbine Efficiency: §9%d%%"); + provider.add("item.tool.tooltip.rotor.power", "Turbine Power: §9%d%%"); } public static void generateActionKeys(RegistrateLangProvider provider) { @@ -247,24 +238,9 @@ public static void generateActionKeys(RegistrateLangProvider provider) { provider.add("gtceu.tool_action.tape", "§8Use Tape to fix Maintenance Problems"); } - private static void generateToolInfoKeys(RegistrateLangProvider provider) { - // Tool Material Information - provider.add("item.tool.tooltip.primary_material", "§fMaterial: §e%s"); - provider.add("item.tool.tooltip.durability", "§fDurability: §a%d / %d"); - provider.add("item.tool.tooltip.rotor.efficiency", "Turbine Efficiency: §9%d%%"); - provider.add("item.tool.tooltip.rotor.power", "Turbine Power: §9%d%%"); - - provider.add("tool.gtceu.repair_info.tooltip", "§8Hold SHIFT to show Repair Info"); - provider.add("tool.gtceu.repair_material.tooltip", "§8Repair with: §f§a%s"); - - provider.add("item.gtceu.tool.replace_tool_head", "Craft with a new Tool Head to replace it"); - provider.add("item.gtceu.tool.usable_as", "§8Usable as: §f%s"); - } - private static void generateEnchantKeys(RegistrateLangProvider provider) { // Enchantments provider.add("enchantment.disjunction", "Disjunction"); - provider.add("enchantment.damage.disjunction", "Disjunction"); provider.add("enchantment.gtceu.disjunction.description", "Applies Weakness and Slowness to Ender-related mobs."); diff --git a/src/main/resources/assets/gtceu/lang/ja_jp.json b/src/main/resources/assets/gtceu/lang/ja_jp.json index 7a885264e27..dc90670739d 100644 --- a/src/main/resources/assets/gtceu/lang/ja_jp.json +++ b/src/main/resources/assets/gtceu/lang/ja_jp.json @@ -2037,19 +2037,19 @@ "death.attack.gtceu.hoe": "%s は %s に丸刈りにされた。", "death.attack.gtceu.knife": "%s は %s に背中を血で洗ってもらった。", "death.attack.gtceu.mallet": "%s は %s の新居の土台となった。", - "death.attack.gtceu.medical_condition/arsenicosis": "%s はヒ素中毒になった。", - "death.attack.gtceu.medical_condition/asbestosis": "%s はアスベストに注意を払わなかった。", - "death.attack.gtceu.medical_condition/berylliosis": "%s はベリリウム肺になってしまった。", - "death.attack.gtceu.medical_condition/carbon_monoxide_poisoning": "%s はストーブをつけっぱなしにして一酸化炭素中毒になってしまった。", - "death.attack.gtceu.medical_condition/carcinogen": "%s は白血病になった。", - "death.attack.gtceu.medical_condition/chemical_burns": "%s は化学事故を起こした。", - "death.attack.gtceu.medical_condition/irritant": "%s は§n§ひどい§r発疹になった。", - "death.attack.gtceu.medical_condition/methanol_poisoning": "%s は禁酒法時代に密造酒を飲もうとした。", - "death.attack.gtceu.medical_condition/nausea": "%s は吐き気で死亡した。", - "death.attack.gtceu.medical_condition/none": "%s の死因は...何でもない?", - "death.attack.gtceu.medical_condition/poison": "%s は有毒物質には毒があることを忘れていた。", - "death.attack.gtceu.medical_condition/silicosis": "%s は結核で死んだのではない、珪肺だったのだ。", - "death.attack.gtceu.medical_condition/weak_poison": "%s は鉛(または水銀)を食べた。", + "death.attack.gtceu.medical_condition.arsenicosis": "%s はヒ素中毒になった。", + "death.attack.gtceu.medical_condition.asbestosis": "%s はアスベストに注意を払わなかった。", + "death.attack.gtceu.medical_condition.berylliosis": "%s はベリリウム肺になってしまった。", + "death.attack.gtceu.medical_condition.carbon_monoxide_poisoning": "%s はストーブをつけっぱなしにして一酸化炭素中毒になってしまった。", + "death.attack.gtceu.medical_condition.carcinogen": "%s は白血病になった。", + "death.attack.gtceu.medical_condition.chemical_burns": "%s は化学事故を起こした。", + "death.attack.gtceu.medical_condition.irritant": "%s は§n§ひどい§r発疹になった。", + "death.attack.gtceu.medical_condition.methanol_poisoning": "%s は禁酒法時代に密造酒を飲もうとした。", + "death.attack.gtceu.medical_condition.nausea": "%s は吐き気で死亡した。", + "death.attack.gtceu.medical_condition.none": "%s の死因は...何でもない?", + "death.attack.gtceu.medical_condition.poison": "%s は有毒物質には毒があることを忘れていた。", + "death.attack.gtceu.medical_condition.silicosis": "%s は結核で死んだのではない、珪肺だったのだ。", + "death.attack.gtceu.medical_condition.weak_poison": "%s は鉛(または水銀)を食べた。", "death.attack.gtceu.mining_hammer": "%s のミネラル成分は %s に摂取された。", "death.attack.gtceu.mortar": "%s は %s に身を粉にされた。", "death.attack.gtceu.pickaxe": "%s の人生最大の輝きは %s のツルハシの耐久値を2減らしたことだった。", diff --git a/src/main/resources/assets/gtceu/lang/ru_ru.json b/src/main/resources/assets/gtceu/lang/ru_ru.json index 25aa3a0b252..2938ea20ce3 100644 --- a/src/main/resources/assets/gtceu/lang/ru_ru.json +++ b/src/main/resources/assets/gtceu/lang/ru_ru.json @@ -4976,7 +4976,7 @@ "material.gtceu.potassium_hydroxide": "Гидроксид калия", "material.gtceu.potassium_iodide": "Йодистый калий", "material.gtceu.sodium_nitrite": "Нитрит натрия", - "death.attack.gtceu.medical_condition/poison": "%s забыл что яды ядовиты", + "death.attack.gtceu.medical_condition.poison": "%s забыл что яды ядовиты", "material.gtceu.acetic_anhydride": "Уксусный ангидрид", "material.gtceu.calcium_carbonate": "Карбонат кальция", "material.gtceu.concentrated_bromine_solution": "Концентрированный раствор брома", @@ -5108,18 +5108,18 @@ "config.jade.plugin_gtceu.parallel_info": "[GTCEu] Параллель", "config.jade.plugin_gtceu.recipe_output_info": "[GTCEu] Вывод рецептов", "config.jade.plugin_gtceu.stained_color": "[GTCEu] Окрашенные блоки", - "death.attack.gtceu.medical_condition/arsenicosis": "%s отравился мышьяком", - "death.attack.gtceu.medical_condition/asbestosis": "%s умер от мезотелиомы", - "death.attack.gtceu.medical_condition/berylliosis": "%s добывал Изумруды слишком рьяно", - "death.attack.gtceu.medical_condition/carbon_monoxide_poisoning": "%s оставил плиту включенной", - "death.attack.gtceu.medical_condition/carcinogen": "У %s лейкемия", - "death.attack.gtceu.medical_condition/chemical_burns": "%s попал в химический инцидент", - "death.attack.gtceu.medical_condition/irritant": "%s получил §n§lОЧЕНЬ§r сильную сыпь", - "death.attack.gtceu.medical_condition/methanol_poisoning": "%s пробовал пить самогон во время сухого закона", - "death.attack.gtceu.medical_condition/nausea": "%s умер от тошноты", - "death.attack.gtceu.medical_condition/none": "%s умер от... ничего?", - "death.attack.gtceu.medical_condition/silicosis": "%s умер не от туберкулёза. Это был Силикоз.", - "death.attack.gtceu.medical_condition/weak_poison": "%s поел свинца (или ртути!)", + "death.attack.gtceu.medical_condition.arsenicosis": "%s отравился мышьяком", + "death.attack.gtceu.medical_condition.asbestosis": "%s умер от мезотелиомы", + "death.attack.gtceu.medical_condition.berylliosis": "%s добывал Изумруды слишком рьяно", + "death.attack.gtceu.medical_condition.carbon_monoxide_poisoning": "%s оставил плиту включенной", + "death.attack.gtceu.medical_condition.carcinogen": "У %s лейкемия", + "death.attack.gtceu.medical_condition.chemical_burns": "%s попал в химический инцидент", + "death.attack.gtceu.medical_condition.irritant": "%s получил §n§lОЧЕНЬ§r сильную сыпь", + "death.attack.gtceu.medical_condition.methanol_poisoning": "%s пробовал пить самогон во время сухого закона", + "death.attack.gtceu.medical_condition.nausea": "%s умер от тошноты", + "death.attack.gtceu.medical_condition.none": "%s умер от... ничего?", + "death.attack.gtceu.medical_condition.silicosis": "%s умер не от туберкулёза. Это был Силикоз.", + "death.attack.gtceu.medical_condition.weak_poison": "%s поел свинца (или ртути!)", "gtceu.air_scrubber": "Очиститель воздуха", "gtceu.duct_pipe.transfer_rate": "§bСкорость передачи воздуха: %s", "gtceu.evaporation": "Выпаривание", diff --git a/src/main/resources/assets/gtceu/lang/uk_ua.json b/src/main/resources/assets/gtceu/lang/uk_ua.json index c9018a1ebff..9ba30056aa2 100644 --- a/src/main/resources/assets/gtceu/lang/uk_ua.json +++ b/src/main/resources/assets/gtceu/lang/uk_ua.json @@ -1,18 +1,18 @@ { "translators": "discord: tenwoc, roll_54. for minestar.com.ua", - "death.attack.gtceu.medical_condition/arsenicosis": "%s отруївся миш'яком", - "death.attack.gtceu.medical_condition/asbestosis": "%s програв мезотеліомі", - "death.attack.gtceu.medical_condition/berylliosis": "%s надто жадав добувати смарагди", - "death.attack.gtceu.medical_condition/carbon_monoxide_poisoning": "%s залишив плиту увімкненою", - "death.attack.gtceu.medical_condition/carcinogen": "%s не витримав лейкемії", - "death.attack.gtceu.medical_condition/chemical_burns": "%s став учасником хімічної аварії", - "death.attack.gtceu.medical_condition/irritant": "%s отримав§n§l дУЖЕ§r сильний висип", - "death.attack.gtceu.medical_condition/methanol_poisoning": "%s наважився випити самогону в час сухого закону", - "death.attack.gtceu.medical_condition/nausea": "%s помер від нудоти", - "death.attack.gtceu.medical_condition/none": "%s помер від... нічого?", - "death.attack.gtceu.medical_condition/poison": "%s забув, що отруйні матеріали дійсно є отруйними", - "death.attack.gtceu.medical_condition/silicosis": "%s помер не від туберкульозу. Його життя обірвав силікоз.", - "death.attack.gtceu.medical_condition/weak_poison": "%s скуштував свинцю (або меркурію!)", + "death.attack.gtceu.medical_condition.arsenicosis": "%s отруївся миш'яком", + "death.attack.gtceu.medical_condition.asbestosis": "%s програв мезотеліомі", + "death.attack.gtceu.medical_condition.berylliosis": "%s надто жадав добувати смарагди", + "death.attack.gtceu.medical_condition.carbon_monoxide_poisoning": "%s залишив плиту увімкненою", + "death.attack.gtceu.medical_condition.carcinogen": "%s не витримав лейкемії", + "death.attack.gtceu.medical_condition.chemical_burns": "%s став учасником хімічної аварії", + "death.attack.gtceu.medical_condition.irritant": "%s отримав§n§l дУЖЕ§r сильний висип", + "death.attack.gtceu.medical_condition.methanol_poisoning": "%s наважився випити самогону в час сухого закону", + "death.attack.gtceu.medical_condition.nausea": "%s помер від нудоти", + "death.attack.gtceu.medical_condition.none": "%s помер від... нічого?", + "death.attack.gtceu.medical_condition.poison": "%s забув, що отруйні матеріали дійсно є отруйними", + "death.attack.gtceu.medical_condition.silicosis": "%s помер не від туберкульозу. Його життя обірвав силікоз.", + "death.attack.gtceu.medical_condition.weak_poison": "%s скуштував свинцю (або меркурію!)", "death.attack.gtceu.explosion": "%s вибухнув", "death.attack.gtceu.explosion.player": "%s вибухнув за допомогою %s", "death.attack.gtceu.frost": "%s пізнав кріогеніку", diff --git a/src/main/resources/assets/gtceu/lang/zh_cn.json b/src/main/resources/assets/gtceu/lang/zh_cn.json index fc8e9f37416..828506796fc 100644 --- a/src/main/resources/assets/gtceu/lang/zh_cn.json +++ b/src/main/resources/assets/gtceu/lang/zh_cn.json @@ -2096,19 +2096,19 @@ "death.attack.gtceu.hoe": "%s被%s锄死了", "death.attack.gtceu.knife": "%2$s绅士地捅了%1$s几刀", "death.attack.gtceu.mallet": "%s被%s用锤头活活敲死了", - "death.attack.gtceu.medical_condition/arsenicosis": "%s死于砷中毒", - "death.attack.gtceu.medical_condition/asbestosis": "%s得了间皮瘤", - "death.attack.gtceu.medical_condition/berylliosis": "%s贪婪地挖掘绿宝石,结果有点过火了", - "death.attack.gtceu.medical_condition/carbon_monoxide_poisoning": "%s离开时炉子还开着", - "death.attack.gtceu.medical_condition/carcinogen": "%s身患白血病", - "death.attack.gtceu.medical_condition/chemical_burns": "%s历经了一场化学事故", - "death.attack.gtceu.medical_condition/irritant": "%s身上长了§n§l极其严重§r的皮疹", - "death.attack.gtceu.medical_condition/methanol_poisoning": "%s在禁酒令下尝试饮用私酿烈酒", - "death.attack.gtceu.medical_condition/nausea": "%s死于恶心", - "death.attack.gtceu.medical_condition/none": "%s死于...什么都没有?", - "death.attack.gtceu.medical_condition/poison": "%s忘了毒物的确有毒", - "death.attack.gtceu.medical_condition/silicosis": "%s不是死于肺结核,而是矽肺病", - "death.attack.gtceu.medical_condition/weak_poison": "%s吞下了铅(或水银!)", + "death.attack.gtceu.medical_condition.arsenicosis": "%s死于砷中毒", + "death.attack.gtceu.medical_condition.asbestosis": "%s得了间皮瘤", + "death.attack.gtceu.medical_condition.berylliosis": "%s贪婪地挖掘绿宝石,结果有点过火了", + "death.attack.gtceu.medical_condition.carbon_monoxide_poisoning": "%s离开时炉子还开着", + "death.attack.gtceu.medical_condition.carcinogen": "%s身患白血病", + "death.attack.gtceu.medical_condition.chemical_burns": "%s历经了一场化学事故", + "death.attack.gtceu.medical_condition.irritant": "%s身上长了§n§l极其严重§r的皮疹", + "death.attack.gtceu.medical_condition.methanol_poisoning": "%s在禁酒令下尝试饮用私酿烈酒", + "death.attack.gtceu.medical_condition.nausea": "%s死于恶心", + "death.attack.gtceu.medical_condition.none": "%s死于...什么都没有?", + "death.attack.gtceu.medical_condition.poison": "%s忘了毒物的确有毒", + "death.attack.gtceu.medical_condition.silicosis": "%s不是死于肺结核,而是矽肺病", + "death.attack.gtceu.medical_condition.weak_poison": "%s吞下了铅(或水银!)", "death.attack.gtceu.mining_hammer": "%s被%s当成矿石砸死了", "death.attack.gtceu.mortar": "%s被%s用研钵磨成了粉", "death.attack.gtceu.pickaxe": "%s被%s用镐子凿死了", diff --git a/src/main/resources/assets/gtceu/lang/zh_tw.json b/src/main/resources/assets/gtceu/lang/zh_tw.json index b27a5136f03..1791202a7bf 100644 --- a/src/main/resources/assets/gtceu/lang/zh_tw.json +++ b/src/main/resources/assets/gtceu/lang/zh_tw.json @@ -2092,19 +2092,19 @@ "death.attack.gtceu.hoe": "%s被%s鋤死了", "death.attack.gtceu.knife": "%2$s紳士地捅了%1$s幾刀", "death.attack.gtceu.mallet": "%s被%s用錘頭活活敲死了", - "death.attack.gtceu.medical_condition/arsenicosis": "%s死於砷中毒", - "death.attack.gtceu.medical_condition/asbestosis": "%s得了間皮瘤", - "death.attack.gtceu.medical_condition/berylliosis": "%s貪婪地挖掘綠寶石,結果有點過火了", - "death.attack.gtceu.medical_condition/carbon_monoxide_poisoning": "%s離開時爐子還開着", - "death.attack.gtceu.medical_condition/carcinogen": "%s身患白血病", - "death.attack.gtceu.medical_condition/chemical_burns": "%s歷經了一場化學事故", - "death.attack.gtceu.medical_condition/irritant": "%s身上長了§n§l極其嚴重§r的皮疹", - "death.attack.gtceu.medical_condition/methanol_poisoning": "%s在禁酒令下嘗試飲用私釀烈酒", - "death.attack.gtceu.medical_condition/nausea": "%s死於噁心", - "death.attack.gtceu.medical_condition/none": "%s死於...什麼都沒有?", - "death.attack.gtceu.medical_condition/poison": "%s忘了毒物的確有毒", - "death.attack.gtceu.medical_condition/silicosis": "%s不是死於肺結核,而是矽肺病", - "death.attack.gtceu.medical_condition/weak_poison": "%s吞下了鉛(或水銀!)", + "death.attack.gtceu.medical_condition.arsenicosis": "%s死於砷中毒", + "death.attack.gtceu.medical_condition.asbestosis": "%s得了間皮瘤", + "death.attack.gtceu.medical_condition.berylliosis": "%s貪婪地挖掘綠寶石,結果有點過火了", + "death.attack.gtceu.medical_condition.carbon_monoxide_poisoning": "%s離開時爐子還開着", + "death.attack.gtceu.medical_condition.carcinogen": "%s身患白血病", + "death.attack.gtceu.medical_condition.chemical_burns": "%s歷經了一場化學事故", + "death.attack.gtceu.medical_condition.irritant": "%s身上長了§n§l極其嚴重§r的皮疹", + "death.attack.gtceu.medical_condition.methanol_poisoning": "%s在禁酒令下嘗試飲用私釀烈酒", + "death.attack.gtceu.medical_condition.nausea": "%s死於噁心", + "death.attack.gtceu.medical_condition.none": "%s死於...什麼都沒有?", + "death.attack.gtceu.medical_condition.poison": "%s忘了毒物的確有毒", + "death.attack.gtceu.medical_condition.silicosis": "%s不是死於肺結核,而是矽肺病", + "death.attack.gtceu.medical_condition.weak_poison": "%s吞下了鉛(或水銀!)", "death.attack.gtceu.mining_hammer": "%s被%s當成礦砸死了", "death.attack.gtceu.mortar": "%s被%s用研缽磨成了粉", "death.attack.gtceu.pickaxe": "%s被%s用鎬子鑿死了", From 304c6804df079c3e5571276499095ee2c59ebacf Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Wed, 25 Jun 2025 15:26:15 -0600 Subject: [PATCH 21/45] Pipe connection tooltips --- .../gtceu/api/block/PipeBlock.java | 4 +++ .../gtceu/api/item/PipeBlockItem.java | 6 ++-- .../gtceu/common/block/CableBlock.java | 6 ++++ .../gtceu/common/block/LaserPipeBlock.java | 6 ++++ .../gtceu/common/block/OpticalPipeBlock.java | 6 ++++ .../gregtechceu/gtceu/data/lang/ToolLang.java | 30 +++++++++---------- 6 files changed, 41 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java index e8f3c2abe4a..a33bdc0d815 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java @@ -471,4 +471,8 @@ public List getDrops(BlockState state, LootParams.Builder builder) { } return drops; } + + public GTToolType getPipeTuneTool() { + return GTToolType.WRENCH; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/PipeBlockItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/PipeBlockItem.java index 72bf1949d89..0afee501b2f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/PipeBlockItem.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/PipeBlockItem.java @@ -2,6 +2,7 @@ import com.gregtechceu.gtceu.api.block.PipeBlock; import com.gregtechceu.gtceu.api.capability.ICoverable; +import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.pipenet.IPipeNode; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.GTUtil; @@ -43,9 +44,10 @@ public void appendHoverText(ItemStack stack, @Nullable Level level, List Date: Thu, 26 Jun 2025 00:56:36 -0600 Subject: [PATCH 22/45] recipe type names and categories --- .../resources/assets/gtceu/lang/en_ud.json | 164 +++++++++--------- .../resources/assets/gtceu/lang/en_us.json | 164 +++++++++--------- .../api/recipe/category/GTRecipeCategory.java | 2 +- .../gregtechceu/gtceu/data/lang/ItemLang.java | 13 -- .../gtceu/data/lang/RecipeLang.java | 21 +++ 5 files changed, 186 insertions(+), 178 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 70a5fab52cb..35df653fff3 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -2236,19 +2236,10 @@ "fluid.tile.lava": "ɐʌɐꞀ", "fluid.tile.water": "ɹǝʇɐM", "fluid_cell.empty": "ʎʇdɯƎ", - "gtceu.air_scrubber": "ɹǝqqnɹɔS ɹıⱯ", - "gtceu.alloy_blast_smelter": "ɹǝʇןǝɯS ʇsɐןᗺ ʎoןןⱯ", - "gtceu.alloy_smelter": "ɹǝʇןǝɯS ʎoןןⱯ", - "gtceu.arc_furnace": "ǝɔɐuɹnℲ ɔɹⱯ", - "gtceu.assembler": "ɹǝןqɯǝssⱯ", - "gtceu.assembly_line": "ǝuıꞀ ʎןqɯǝssⱯ", "gtceu.auto_decomp.rotor": "ɹoʇoᴚ ǝuıqɹn⟘", "gtceu.auto_decomp.tool": "ןooʇ ɔıɹʇɔǝןǝ-uoN", - "gtceu.autoclave": "ǝʌɐןɔoʇnⱯ", "gtceu.battery_buffer.average_input": "ʇ/∩Ǝ %s :ʇnduı ǝbɐɹǝʌⱯ", "gtceu.battery_buffer.average_output": "ʇ/∩Ǝ %s :ʇndʇno ǝbɐɹǝʌⱯ", - "gtceu.bender": "ɹǝpuǝᗺ", - "gtceu.brewery": "ʎɹǝʍǝɹᗺ", "gtceu.bus.collapse.error": "ʇsɹıɟ ʞɔoןqıʇןnɯ oʇ pǝɥɔɐʇʇɐ ǝq ʇsnɯ snᗺ", "gtceu.bus.collapse_false": "sɯǝʇI ǝsdɐןןoɔ ʇou ןןıʍ snᗺ", "gtceu.bus.collapse_true": "sɯǝʇI ǝsdɐןןoɔ ןןıʍ snᗺ", @@ -2260,20 +2251,12 @@ "gtceu.cable.loss_per_block": "ʇןoΛ-∩Ǝ ㄥ§%dɔ§ ɹ§:ǝɹǝdɯⱯ/ɹǝʇǝW/ssoꞀɔ§", "gtceu.cable.superconductor": "ɹoʇɔnpuoɔɹǝdnSp§ %s", "gtceu.cable.voltage": ")ɐ§%s(ɐ§ %dɐ§ ɹ§:ǝbɐʇןoΛ xɐWɐ§", - "gtceu.canner": "ɹǝuuɐƆ", - "gtceu.centrifuge": "ǝbnɟıɹʇuǝƆ", "gtceu.chance_logic.and": "ᗡNⱯ", "gtceu.chance_logic.first": "⟘SᴚIℲ", "gtceu.chance_logic.none": "ƎNON", "gtceu.chance_logic.or": "ᴚO", "gtceu.chance_logic.xor": "ᴚOX", "gtceu.chat.cape": "ɹ§˙ʇı ǝsn oʇ ddɐ ןɐuıɯɹǝʇ ɹoʇɔǝןǝS ǝdɐƆ ǝɥʇ ǝǝS ¡ǝdɐɔ ʍǝu ɐ pǝʞɔoןun ʇsnظ noʎ :sʇɐɹbuoƆϛ§", - "gtceu.chemical_bath": "ɥʇɐᗺ ןɐɔıɯǝɥƆ", - "gtceu.chemical_reactor": "ɹoʇɔɐǝᴚ ןɐɔıɯǝɥƆ", - "gtceu.circuit_assembler": "ɹǝןqɯǝssⱯ ʇınɔɹıƆ", - "gtceu.coke_oven": "uǝʌO ǝʞoƆ", - "gtceu.combustion_generator": "ɹoʇɐɹǝuǝ⅁ uoıʇsnqɯoƆ", - "gtceu.compressor": "ɹossǝɹdɯoƆ", "gtceu.cover.activity_detector.message_activity_inverted": "snʇɐʇS ʎʇıʌıʇɔⱯ pǝʇɹǝʌuI buıɹoʇıuoW", "gtceu.cover.activity_detector.message_activity_normal": "snʇɐʇS ʎʇıʌıʇɔⱯ ןɐɯɹoN buıɹoʇıuoW", "gtceu.cover.activity_detector_advanced.message_activity_inverted": "snʇɐʇS ssǝɹboɹԀ pǝʇɹǝʌuI buıɹoʇıuoW", @@ -2284,7 +2267,6 @@ "gtceu.cover.fluid_detector.message_fluid_storage_normal": "ǝbɐɹoʇS pınןℲ ןɐɯɹoN buıɹoʇıuoW", "gtceu.cover.item_detector.message_item_storage_inverted": "ǝbɐɹoʇS ɯǝʇI pǝʇɹǝʌuI buıɹoʇıuoW", "gtceu.cover.item_detector.message_item_storage_normal": "ǝbɐɹoʇS ɯǝʇI ןɐɯɹoN buıɹoʇıuoW", - "gtceu.cracker": "ɹǝʞɔɐɹƆ", "gtceu.creative.activity.off": "ǝʌıʇɔɐ ʇoN", "gtceu.creative.activity.on": "ǝʌıʇɔⱯ", "gtceu.creative.chest.ipc": "ǝןɔʎƆ ɹǝd sɯǝʇI", @@ -2301,7 +2283,6 @@ "gtceu.creative_tooltip.1": "pǝǝu ʇsnظ noʎㄥ§", "gtceu.creative_tooltip.2": "ǝpoW ǝʌıʇɐǝɹƆ ", "gtceu.creative_tooltip.3": "sıɥʇ ǝsn oʇ ㄥ§", - "gtceu.cutter": "ɹǝʇʇnƆ", "gtceu.debug.f3_h.enabled": "ǝɹoɯ ǝǝs oʇ ǝןıɟ bıɟuoɔ ɥɔǝ⟘bǝɹ⅁ ǝɥʇ uı uoıʇdo bıɟuoɔ bnqǝp:ɔsıɯ ǝɥʇ ǝןqɐuǝ :sɹǝdoןǝʌǝᗡ ɹoℲ ¡oɟuı bnqǝp ǝɥʇ pǝıɟıpoɯ sɐɥ ɥɔǝ⟘bǝɹ⅁", "gtceu.direction.tooltip.back": "ʞɔɐᗺ", "gtceu.direction.tooltip.down": "uʍoᗡ", @@ -2309,18 +2290,7 @@ "gtceu.direction.tooltip.left": "ʇɟǝꞀ", "gtceu.direction.tooltip.right": "ʇɥbıᴚ", "gtceu.direction.tooltip.up": "d∩", - "gtceu.distillation_tower": "ɹǝʍo⟘ uoıʇɐןןıʇsıᗡ", - "gtceu.distillery": "ʎɹǝןןıʇsıᗡ", "gtceu.duct_pipe.transfer_rate": "%s :ǝʇɐɹ ɹǝɟsuɐɹʇ ɹıⱯq§", - "gtceu.dummy": "ʎɯɯnᗡ", - "gtceu.electric_blast_furnace": "ǝɔɐuɹnℲ ʇsɐןᗺ ɔıɹʇɔǝןƎ", - "gtceu.electric_furnace": "ǝɔɐuɹnℲ ɔıɹʇɔǝןƎ", - "gtceu.electrolyzer": "ɹǝzʎןoɹʇɔǝןƎ", - "gtceu.electromagnetic_separator": "ɹoʇɐɹɐdǝS ɔıʇǝubɐɯoɹʇɔǝןƎ", - "gtceu.extractor": "ɹoʇɔɐɹʇxƎ", - "gtceu.extruder": "ɹǝpnɹʇxƎ", - "gtceu.fermenter": "ɹǝʇuǝɯɹǝℲ", - "gtceu.fluid_heater": "ɹǝʇɐǝH pınןℲ", "gtceu.fluid_pipe.acid_proof": "spıɔⱯ ǝןpuɐɥ uɐƆ9§", "gtceu.fluid_pipe.capacity": "ᗺɯ %dɟ§ :ʎʇıɔɐdɐƆ6§", "gtceu.fluid_pipe.channels": "%dɟ§ :sןǝuuɐɥƆǝ§", @@ -2329,15 +2299,9 @@ "gtceu.fluid_pipe.max_temperature": "ʞ %dɟ§ :ʇıɯıꞀ ǝɹnʇɐɹǝdɯǝ⟘ɔ§", "gtceu.fluid_pipe.not_gas_proof": "¡ʞɐǝן ʎɐɯ sǝsɐ⅁ㄣ§", "gtceu.fluid_pipe.plasma_proof": "sɐɯsɐןԀ ןןɐ ǝןpuɐɥ uɐƆ9§", - "gtceu.fluid_solidifier": "ɹǝıɟıpıןoS pınןℲ", - "gtceu.forge_hammer": "ɹǝɯɯɐH ǝbɹoℲ", - "gtceu.forming_press": "ssǝɹԀ buıɯɹoℲ", "gtceu.forming_press.naming.named": "ɯǝʇI pǝɯɐNo§", "gtceu.forming_press.naming.press": "ssǝɹԀ pǝɯɐNo§", "gtceu.forming_press.naming.to_name": "ǝɯɐN oʇ ɯǝʇIo§", - "gtceu.fusion_reactor": "ɹoʇɔɐǝᴚ uoısnℲ", - "gtceu.gas_collector": "ɹoʇɔǝןןoƆ sɐ⅁", - "gtceu.gas_turbine": "ǝuıqɹn⟘ sɐ⅁", "gtceu.gui.auto_output.name": "oʇnɐ", "gtceu.gui.charger_slot.tooltip.0": "ɹ§ʇoןS ɹǝbɹɐɥƆɟ§", "gtceu.gui.charger_slot.tooltip.1": "ɹ§sǝıɹǝʇʇɐq %s ɯoɹɟ ɹǝʍod sʍɐɹᗡㄥ§", @@ -2440,7 +2404,6 @@ "gtceu.hazard_trigger.none": "buıɥʇoN", "gtceu.hazard_trigger.protection.description": ":ɯoɹɟ sʇɔǝʇoɹԀ", "gtceu.hazard_trigger.skin_contact": "ʇɔɐʇuoɔ uıʞS", - "gtceu.implosion_compressor": "ɹossǝɹdɯoƆ uoısoןdɯI", "gtceu.io.both": "ɥʇoᗺ", "gtceu.io.export": "ʇɹodxƎ", "gtceu.io.import": "ʇɹodɯI", @@ -2552,11 +2515,6 @@ "gtceu.key.enable_boots": "dɯnſ pǝʇsooᗺ ǝןqɐuƎ", "gtceu.key.enable_jetpack": "ʞɔɐdʇǝſ ǝןqɐuƎ", "gtceu.key.tool_aoe_change": "ɥɔʇıʍS ǝpoW ƎoⱯ ןoo⟘", - "gtceu.large_boiler": "ɹǝןıoᗺ ǝbɹɐꞀ", - "gtceu.large_chemical_reactor": "ɹoʇɔɐǝᴚ ןɐɔıɯǝɥƆ ǝbɹɐꞀ", - "gtceu.laser_engraver": "ɹǝʌɐɹbuƎ ɹǝsɐꞀ", - "gtceu.lathe": "ǝɥʇɐꞀ", - "gtceu.macerator": "ɹoʇɐɹǝɔɐW", "gtceu.machine.active_transformer.tooltip.0": "ǝsınbsıᗡ uı sɹǝsɐꞀ :sɹǝɯɹoɟsuɐɹ⟘ㄥ§", "gtceu.machine.active_transformer.tooltip.1": "˙ㄥ§sʇndʇnOɟ§ ʎbɹǝuƎ ɟo ɹǝqɯnu ʎuɐ oʇuı ㄥ§sʇnduIɟ§ ʎbɹǝuƎ ɟo ɹǝqɯnu ʎuɐ ǝuıqɯoɔ uɐƆㄥ§", "gtceu.machine.active_transformer.tooltip.2": "ɥʇıʍ ǝɔuɐʇsıp ǝןqıpǝɹɔuı ʇɐ ɹǝʍod ʇıɯsuɐɹʇ uɐƆㄥ§", @@ -3201,7 +3159,6 @@ "gtceu.medical_condition/silicosis": "sısoɔıןıSƖ§", "gtceu.medical_condition/weak_poison": "snouosıod ʎןʞɐǝMɐ§", "gtceu.minimap.ore_vein.depleted": "pǝʇǝןdǝᗡ", - "gtceu.mixer": "ɹǝxıW", "gtceu.mode.both": "ɹ§)ɯǝʇI puⱯ pınןℲ( ɥʇoᗺp§", "gtceu.mode.fluid": "ɹ§pınןℲ6§", "gtceu.mode.item": "ɹ§ɯǝʇI9§", @@ -3446,26 +3403,12 @@ "gtceu.oc.tooltip.2": "ƆO ǝɥʇ ǝsɐǝɹɔǝp oʇ ʞɔıןɔ ʇɥbıᴚ", "gtceu.oc.tooltip.3": "ƆO ǝɥʇ ʇǝsǝɹ oʇ ʞɔıןɔ ǝןppıW", "gtceu.oc.tooltip.4": "ƆO ʇɔǝɟɹǝԀ ʎq ǝbuɐɥɔ oʇ ʇɟıɥS pןoH", - "gtceu.ore_washer": "ɹǝɥsɐM ǝɹO", "gtceu.ownership.name.argonauts": "pןın⅁ sʇnɐuobɹⱯ", "gtceu.ownership.name.ftb": "sɯɐǝ⟘ ᗺ⟘Ⅎ", "gtceu.ownership.name.player": "ɹǝʎɐןԀ", - "gtceu.packer": "ɹǝʞɔɐԀ", "gtceu.part_sharing.disabled": "pǝןqɐsıᗡㄣ§ buıɹɐɥS ʞɔoןqıʇןnW", "gtceu.part_sharing.enabled": "pǝןqɐuƎɐ§ buıɹɐɥS ʞɔoןqıʇןnW", - "gtceu.plasma_generator": "ɹoʇɐɹǝuǝ⅁ ɐɯsɐןԀ", - "gtceu.polarizer": "ɹǝzıɹɐןoԀ", - "gtceu.primitive_blast_furnace": "ǝɔɐuɹnℲ ʇsɐןᗺ ǝʌıʇıɯıɹԀ", - "gtceu.pyrolyse_oven": "uǝʌO ǝsʎןoɹʎԀ", "gtceu.recipe.amperage": "%s :ǝbɐɹǝdɯⱯ", - "gtceu.recipe.category.arc_furnace_recycling": "buıddɐɹɔS ɐɯsɐןԀ", - "gtceu.recipe.category.chem_dyes": "buıǝʎᗡ ןɐɔıɯǝɥƆ", - "gtceu.recipe.category.extractor_recycling": "buıʇןǝɯǝᴚ dɐɹɔS", - "gtceu.recipe.category.ingot_molding": "buıpןoW ןɐʇǝW", - "gtceu.recipe.category.macerator_recycling": "buıpuıɹ⅁ ʇɹɐԀ", - "gtceu.recipe.category.ore_bathing": "buıʇɐǝɹ⟘ ǝɹO", - "gtceu.recipe.category.ore_crushing": "buıpuıɹ⅁ ǝɹO", - "gtceu.recipe.category.ore_forging": "buıɥsnɹƆ ǝɹO", "gtceu.recipe.chance": "ɹǝıʇ/%s+ %s :ǝɔuɐɥƆ", "gtceu.recipe.cleanroom": "%s sǝɹınbǝᴚ", "gtceu.recipe.cleanroom.display_name": "ɯooɹuɐǝןƆ", @@ -3497,31 +3440,9 @@ "gtceu.recipe_memory_widget.tooltip.1": "ǝdıɔǝɹ sıɥʇ ʞɔoןun/ʞɔoן oʇ ʞɔıןɔ ʇɟıɥSㄥ§", "gtceu.recipe_type.show_recipes": "sǝdıɔǝᴚ ʍoɥS", "gtceu.rei.group.potion_fluids": "spınןℲ uoıʇoԀ", - "gtceu.research_station": "uoıʇɐʇS ɥɔɹɐǝsǝᴚ", - "gtceu.rock_breaker": "ɹǝʞɐǝɹᗺ ʞɔoᴚ", - "gtceu.scanner": "ɹǝuuɐɔS", "gtceu.scanner.copy_stick_empty": "ʞɔıʇS ʎʇdɯƎo§", "gtceu.scanner.copy_stick_from": "ʎdoƆ oʇ ʞɔıʇSo§", "gtceu.scanner.copy_stick_to": "ʞɔıʇS ɟo ʎdoƆo§", - "gtceu.sifter": "ɹǝʇɟıS", - "gtceu.steam_boiler": "ɹǝןıoᗺ ɯɐǝʇS", - "gtceu.steam_turbine": "ǝuıqɹn⟘ ɯɐǝʇS", - "gtceu.thermal_centrifuge": "ǝbnɟıɹʇuǝƆ ןɐɯɹǝɥ⟘", - "gtceu.tool_action.crowbar": "sɹǝʌoƆ ǝʌoɯǝɹ oʇ ɹɐqʍoɹƆ ǝs∩8§", - "gtceu.tool_action.hammer": "spunoS ǝןɟɟnɯ oʇ ɹǝɯɯɐH pɹɐH ǝs∩8§", - "gtceu.tool_action.screwdriver.access_covers": "sɹǝʌoƆ ssǝɔɔɐ oʇ ɹǝʌıɹpʍǝɹɔS ǝs∩8§", - "gtceu.tool_action.screwdriver.auto_collapse": "buısdɐןןoɔ ɯǝʇI ǝןbboʇ oʇ ɹǝʌıɹpʍǝɹɔS ǝs∩8§", - "gtceu.tool_action.screwdriver.auto_output": "ʇndʇnO-oʇnⱯ ǝןbboʇ oʇ ɹǝʌıɹpʍǝɹɔS ǝs∩8§", - "gtceu.tool_action.screwdriver.auto_output_covers": "sɹǝʌoƆ ssǝɔɔɐ ɹo ǝpıS ʇndʇnO ɯoɹɟ ʇnduI ʍoןןⱯ oʇ ɹǝʌıɹpʍǝɹɔS ǝs∩8§", - "gtceu.tool_action.screwdriver.toggle_mode": "sǝpoW ǝןbboʇ oʇ ɹǝʌıɹpʍǝɹɔS ǝs∩8§", - "gtceu.tool_action.screwdriver.toggle_mode_covers": "sɹǝʌoƆ ssǝɔɔɐ ɹo sǝpoW ǝןbboʇ oʇ ɹǝʌıɹpʍǝɹɔS ǝs∩8§", - "gtceu.tool_action.show_tooltips": "oɟuI ןoo⟘ ʍoɥs oʇ ⟘ℲIHS pןoH", - "gtceu.tool_action.soft_mallet.reset": "buıʞɹoM ǝןbboʇ oʇ ʇǝןןɐW ʇɟoS ǝs∩8§", - "gtceu.tool_action.soft_mallet.toggle_mode": "sǝpoW ǝןbboʇ oʇ ʇǝןןɐW ʇɟoS ǝs∩8§", - "gtceu.tool_action.tape": "sɯǝןqoɹԀ ǝɔuɐuǝʇuıɐW xıɟ oʇ ǝdɐ⟘ ǝs∩8§", - "gtceu.tool_action.wire_cutter.connect": "suoıʇɔǝuuoƆ ʇǝs oʇ sɹǝʇʇnƆ ǝɹıM ǝs∩8§", - "gtceu.tool_action.wrench.connect": "suoıʇɔǝuuoƆ ʞɔoןq oʇ ʞɐǝus 'suoıʇɔǝuuoƆ ʇǝs oʇ ɥɔuǝɹM ǝs∩8§", - "gtceu.tool_action.wrench.set_facing": "buıɔɐℲ ʇǝs oʇ ɥɔuǝɹM ǝs∩8§", "gtceu.tooltip.fluid_pipe_hold_shift": "oɟuI ʇuǝɯuıɐʇuoƆ pınןℲ ʍoɥs oʇ ⟘ℲIHS pןoHㄥ§", "gtceu.tooltip.hold_ctrl": "oɟuı ǝɹoɯ ɹoɟ Ꞁᴚ⟘Ɔ pןoHㄥ§", "gtceu.tooltip.hold_shift": "oɟuı ǝɹoɯ ɹoɟ ⟘ℲIHS pןoHㄥ§", @@ -3624,8 +3545,6 @@ "gtceu.universal.tooltip.working_area_chunks": "sʞunɥƆ %dx%dɟ§ :ɐǝɹⱯ buıʞɹoMq§", "gtceu.universal.tooltip.working_area_chunks_max": "sʞunɥƆ %dx%dɟ§ :ɐǝɹⱯ buıʞɹoM xɐWq§", "gtceu.universal.tooltip.working_area_max": "%dx%dɟ§ :ɐǝɹⱯ buıʞɹoM xɐWq§", - "gtceu.vacuum_freezer": "ɹǝzǝǝɹℲ ɯnnɔɐΛ", - "gtceu.wiremill": "ןןıɯǝɹıM", "gui.gtceu.refund_all.desc": "ᄅƎⱯ oʇ sʇuǝʇuoƆ pǝɹoʇS uɹnʇǝᴚ", "gui.gtceu.rename.desc": "ɹǝɟɟnᗺ uɹǝʇʇɐԀ ǝɯɐuǝᴚ", "gui.gtceu.share_inventory.desc.0": "¡ɹǝɟɟnq uıɥʇıʍ suɹǝʇʇɐd ןןɐ ɥʇıʍ sɯǝʇı pǝʇɹǝsuı sǝɹɐɥS", @@ -5354,6 +5273,72 @@ "recipe.condition.rock_breaker.tooltip": "punoɹɐ sʞɔoןq pınןℲ", "recipe.condition.steam_vent.tooltip": "ʇuǝʌ ɯɐǝʇs uɐǝןƆ", "recipe.condition.thunder.tooltip": "%d :ןǝʌǝꞀ ɹǝpunɥ⟘", + "recipe_type.gtceu.air_scrubber": "ɹǝqqnɹɔS ɹıⱯ", + "recipe_type.gtceu.alloy_blast_smelter": "ɹǝʇןǝɯS ʇsɐןᗺ ʎoןןⱯ", + "recipe_type.gtceu.alloy_smelter": "ɹǝʇןǝɯS ʎoןןⱯ", + "recipe_type.gtceu.arc_furnace": "ǝɔɐuɹnℲ ɔɹⱯ", + "recipe_type.gtceu.assembler": "ɹǝןqɯǝssⱯ", + "recipe_type.gtceu.assembly_line": "ǝuıꞀ ʎןqɯǝssⱯ", + "recipe_type.gtceu.autoclave": "ǝʌɐןɔoʇnⱯ", + "recipe_type.gtceu.bender": "ɹǝpuǝᗺ", + "recipe_type.gtceu.brewery": "ʎɹǝʍǝɹᗺ", + "recipe_type.gtceu.canner": "ɹǝuuɐƆ", + "recipe_type.gtceu.category.arc_furnace_recycling": "buıddɐɹɔS ɐɯsɐןԀ", + "recipe_type.gtceu.category.chem_dyes": "buıǝʎᗡ ןɐɔıɯǝɥƆ", + "recipe_type.gtceu.category.extractor_recycling": "buıʇןǝɯǝᴚ dɐɹɔS", + "recipe_type.gtceu.category.ingot_molding": "buıpןoW ןɐʇǝW", + "recipe_type.gtceu.category.macerator_recycling": "buıpuıɹ⅁ ʇɹɐԀ", + "recipe_type.gtceu.category.ore_bathing": "buıʇɐǝɹ⟘ ǝɹO", + "recipe_type.gtceu.category.ore_crushing": "buıpuıɹ⅁ ǝɹO", + "recipe_type.gtceu.category.ore_forging": "buıɥsnɹƆ ǝɹO", + "recipe_type.gtceu.centrifuge": "ǝbnɟıɹʇuǝƆ", + "recipe_type.gtceu.chemical_bath": "ɥʇɐᗺ ןɐɔıɯǝɥƆ", + "recipe_type.gtceu.chemical_reactor": "ɹoʇɔɐǝᴚ ןɐɔıɯǝɥƆ", + "recipe_type.gtceu.circuit_assembler": "ɹǝןqɯǝssⱯ ʇınɔɹıƆ", + "recipe_type.gtceu.coke_oven": "uǝʌO ǝʞoƆ", + "recipe_type.gtceu.combustion_generator": "ɹoʇɐɹǝuǝ⅁ uoıʇsnqɯoƆ", + "recipe_type.gtceu.compressor": "ɹossǝɹdɯoƆ", + "recipe_type.gtceu.cracker": "ɹǝʞɔɐɹƆ", + "recipe_type.gtceu.cutter": "ɹǝʇʇnƆ", + "recipe_type.gtceu.distillation_tower": "ɹǝʍo⟘ uoıʇɐןןıʇsıᗡ", + "recipe_type.gtceu.distillery": "ʎɹǝןןıʇsıᗡ", + "recipe_type.gtceu.dummy": "ʎɯɯnᗡ", + "recipe_type.gtceu.electric_blast_furnace": "ǝɔɐuɹnℲ ʇsɐןᗺ ɔıɹʇɔǝןƎ", + "recipe_type.gtceu.electric_furnace": "ǝɔɐuɹnℲ ɔıɹʇɔǝןƎ", + "recipe_type.gtceu.electrolyzer": "ɹǝzʎןoɹʇɔǝןƎ", + "recipe_type.gtceu.electromagnetic_separator": "ɹoʇɐɹɐdǝS ɔıʇǝubɐɯoɹʇɔǝןƎ", + "recipe_type.gtceu.extractor": "ɹoʇɔɐɹʇxƎ", + "recipe_type.gtceu.extruder": "ɹǝpnɹʇxƎ", + "recipe_type.gtceu.fermenter": "ɹǝʇuǝɯɹǝℲ", + "recipe_type.gtceu.fluid_heater": "ɹǝʇɐǝH pınןℲ", + "recipe_type.gtceu.fluid_solidifier": "ɹǝıɟıpıןoS pınןℲ", + "recipe_type.gtceu.forge_hammer": "ɹǝɯɯɐH ǝbɹoℲ", + "recipe_type.gtceu.forming_press": "ssǝɹԀ buıɯɹoℲ", + "recipe_type.gtceu.fusion_reactor": "ɹoʇɔɐǝᴚ uoısnℲ", + "recipe_type.gtceu.gas_collector": "ɹoʇɔǝןןoƆ sɐ⅁", + "recipe_type.gtceu.gas_turbine": "ǝuıqɹn⟘ sɐ⅁", + "recipe_type.gtceu.implosion_compressor": "ɹossǝɹdɯoƆ uoısoןdɯI", + "recipe_type.gtceu.large_boiler": "ɹǝןıoᗺ ǝbɹɐꞀ", + "recipe_type.gtceu.large_chemical_reactor": "ɹoʇɔɐǝᴚ ןɐɔıɯǝɥƆ ǝbɹɐꞀ", + "recipe_type.gtceu.laser_engraver": "ɹǝʌɐɹbuƎ ɹǝsɐꞀ", + "recipe_type.gtceu.lathe": "ǝɥʇɐꞀ", + "recipe_type.gtceu.macerator": "ɹoʇɐɹǝɔɐW", + "recipe_type.gtceu.mixer": "ɹǝxıW", + "recipe_type.gtceu.ore_washer": "ɹǝɥsɐM ǝɹO", + "recipe_type.gtceu.packer": "ɹǝʞɔɐԀ", + "recipe_type.gtceu.plasma_generator": "ɹoʇɐɹǝuǝ⅁ ɐɯsɐןԀ", + "recipe_type.gtceu.polarizer": "ɹǝzıɹɐןoԀ", + "recipe_type.gtceu.primitive_blast_furnace": "ǝɔɐuɹnℲ ʇsɐןᗺ ǝʌıʇıɯıɹԀ", + "recipe_type.gtceu.pyrolyse_oven": "uǝʌO ǝsʎןoɹʎԀ", + "recipe_type.gtceu.research_station": "uoıʇɐʇS ɥɔɹɐǝsǝᴚ", + "recipe_type.gtceu.rock_breaker": "ɹǝʞɐǝɹᗺ ʞɔoᴚ", + "recipe_type.gtceu.scanner": "ɹǝuuɐɔS", + "recipe_type.gtceu.sifter": "ɹǝʇɟıS", + "recipe_type.gtceu.steam_boiler": "ɹǝןıoᗺ ɯɐǝʇS", + "recipe_type.gtceu.steam_turbine": "ǝuıqɹn⟘ ɯɐǝʇS", + "recipe_type.gtceu.thermal_centrifuge": "ǝbnɟıɹʇuǝƆ ןɐɯɹǝɥ⟘", + "recipe_type.gtceu.vacuum_freezer": "ɹǝzǝǝɹℲ ɯnnɔɐΛ", + "recipe_type.gtceu.wiremill": "ןןıɯǝɹıM", "subtitles.gtceu.arc": "buızznq sɔɹⱯ", "subtitles.gtceu.assembler": "buıʇɔnɹʇsuoɔ ɹǝןqɯǝssⱯ", "subtitles.gtceu.bath": "buızzıɟ ɥʇɐᗺ", @@ -5545,5 +5530,20 @@ "tool.gtceu.max_uses.tooltip": "ʎʇıןıqɐɹnᗡ ןɐʇo⟘ǝ§ %s", "tool.gtceu.mining_speed.tooltip": "pǝǝdS buıuıWp§ %s", "tool.gtceu.repair_info.tooltip": "oɟuI ɹıɐdǝᴚ ʍoɥs oʇ ⟘ℲIHS pןoH8§", - "tool.gtceu.repair_material.tooltip": "%sɐ§ɟ§ :ɥʇıʍ ɹıɐdǝᴚ8§" + "tool.gtceu.repair_material.tooltip": "%sɐ§ɟ§ :ɥʇıʍ ɹıɐdǝᴚ8§", + "tool_action.gtceu.crowbar": "sɹǝʌoƆ ǝʌoɯǝɹ oʇ ɹɐqʍoɹƆ ǝs∩8§", + "tool_action.gtceu.hammer": "spunoS ǝןɟɟnɯ oʇ ɹǝɯɯɐH pɹɐH ǝs∩8§", + "tool_action.gtceu.screwdriver.access_covers": "sɹǝʌoƆ ssǝɔɔɐ oʇ ɹǝʌıɹpʍǝɹɔS ǝs∩8§", + "tool_action.gtceu.screwdriver.auto_collapse": "buısdɐןןoɔ ɯǝʇI ǝןbboʇ oʇ ɹǝʌıɹpʍǝɹɔS ǝs∩8§", + "tool_action.gtceu.screwdriver.auto_output": "ʇndʇnO-oʇnⱯ ǝןbboʇ oʇ ɹǝʌıɹpʍǝɹɔS ǝs∩8§", + "tool_action.gtceu.screwdriver.auto_output_covers": "sɹǝʌoƆ ssǝɔɔɐ ɹo ǝpıS ʇndʇnO ɯoɹɟ ʇnduI ʍoןןⱯ oʇ ɹǝʌıɹpʍǝɹɔS ǝs∩8§", + "tool_action.gtceu.screwdriver.toggle_mode": "sǝpoW ǝןbboʇ oʇ ɹǝʌıɹpʍǝɹɔS ǝs∩8§", + "tool_action.gtceu.screwdriver.toggle_mode_covers": "sɹǝʌoƆ ssǝɔɔɐ ɹo sǝpoW ǝןbboʇ oʇ ɹǝʌıɹpʍǝɹɔS ǝs∩8§", + "tool_action.gtceu.show_tooltips": "oɟuI ןoo⟘ ʍoɥs oʇ ⟘ℲIHS pןoH", + "tool_action.gtceu.soft_mallet.reset": "buıʞɹoM ǝןbboʇ oʇ ʇǝןןɐW ʇɟoS ǝs∩8§", + "tool_action.gtceu.soft_mallet.toggle_mode": "sǝpoW ǝןbboʇ oʇ ʇǝןןɐW ʇɟoS ǝs∩8§", + "tool_action.gtceu.tape": "sɯǝןqoɹԀ ǝɔuɐuǝʇuıɐW xıɟ oʇ ǝdɐ⟘ ǝs∩8§", + "tool_action.gtceu.wire_cutter.connect": "suoıʇɔǝuuoƆ ʇǝs oʇ sɹǝʇʇnƆ ǝɹıM ǝs∩8§", + "tool_action.gtceu.wrench.connect": "suoıʇɔǝuuoƆ ʞɔoןq oʇ ʞɐǝus 'suoıʇɔǝuuoƆ ʇǝs oʇ ɥɔuǝɹM ǝs∩8§", + "tool_action.gtceu.wrench.set_facing": "buıɔɐℲ ʇǝs oʇ ɥɔuǝɹM ǝs∩8§" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 8e02476a1a1..c53a2351ef9 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -2236,19 +2236,10 @@ "fluid.tile.lava": "Lava", "fluid.tile.water": "Water", "fluid_cell.empty": "Empty", - "gtceu.air_scrubber": "Air Scrubber", - "gtceu.alloy_blast_smelter": "Alloy Blast Smelter", - "gtceu.alloy_smelter": "Alloy Smelter", - "gtceu.arc_furnace": "Arc Furnace", - "gtceu.assembler": "Assembler", - "gtceu.assembly_line": "Assembly Line", "gtceu.auto_decomp.rotor": "Turbine Rotor", "gtceu.auto_decomp.tool": "Non-electric tool", - "gtceu.autoclave": "Autoclave", "gtceu.battery_buffer.average_input": "Average input: %s EU/t", "gtceu.battery_buffer.average_output": "Average output: %s EU/t", - "gtceu.bender": "Bender", - "gtceu.brewery": "Brewery", "gtceu.bus.collapse.error": "Bus must be attached to multiblock first", "gtceu.bus.collapse_false": "Bus will not collapse Items", "gtceu.bus.collapse_true": "Bus will collapse Items", @@ -2260,20 +2251,12 @@ "gtceu.cable.loss_per_block": "§cLoss/Meter/Ampere:§r §c%d§7 EU-Volt", "gtceu.cable.superconductor": "%s §dSuperconductor", "gtceu.cable.voltage": "§aMax Voltage:§r §a%d §a(%s§a)", - "gtceu.canner": "Canner", - "gtceu.centrifuge": "Centrifuge", "gtceu.chance_logic.and": "AND", "gtceu.chance_logic.first": "FIRST", "gtceu.chance_logic.none": "NONE", "gtceu.chance_logic.or": "OR", "gtceu.chance_logic.xor": "XOR", "gtceu.chat.cape": "§5Congrats: you just unlocked a new cape! See the Cape Selector terminal app to use it.§r", - "gtceu.chemical_bath": "Chemical Bath", - "gtceu.chemical_reactor": "Chemical Reactor", - "gtceu.circuit_assembler": "Circuit Assembler", - "gtceu.coke_oven": "Coke Oven", - "gtceu.combustion_generator": "Combustion Generator", - "gtceu.compressor": "Compressor", "gtceu.cover.activity_detector.message_activity_inverted": "Monitoring Inverted Activity Status", "gtceu.cover.activity_detector.message_activity_normal": "Monitoring Normal Activity Status", "gtceu.cover.activity_detector_advanced.message_activity_inverted": "Monitoring Inverted Progress Status", @@ -2284,7 +2267,6 @@ "gtceu.cover.fluid_detector.message_fluid_storage_normal": "Monitoring Normal Fluid Storage", "gtceu.cover.item_detector.message_item_storage_inverted": "Monitoring Inverted Item Storage", "gtceu.cover.item_detector.message_item_storage_normal": "Monitoring Normal Item Storage", - "gtceu.cracker": "Cracker", "gtceu.creative.activity.off": "Not active", "gtceu.creative.activity.on": "Active", "gtceu.creative.chest.ipc": "Items per Cycle", @@ -2301,7 +2283,6 @@ "gtceu.creative_tooltip.1": "§7You just need", "gtceu.creative_tooltip.2": " Creative Mode", "gtceu.creative_tooltip.3": "§7 to use this", - "gtceu.cutter": "Cutter", "gtceu.debug.f3_h.enabled": "GregTech has modified the debug info! For Developers: enable the misc:debug config option in the GregTech config file to see more", "gtceu.direction.tooltip.back": "Back", "gtceu.direction.tooltip.down": "Down", @@ -2309,18 +2290,7 @@ "gtceu.direction.tooltip.left": "Left", "gtceu.direction.tooltip.right": "Right", "gtceu.direction.tooltip.up": "Up", - "gtceu.distillation_tower": "Distillation Tower", - "gtceu.distillery": "Distillery", "gtceu.duct_pipe.transfer_rate": "§bAir transfer rate: %s", - "gtceu.dummy": "Dummy", - "gtceu.electric_blast_furnace": "Electric Blast Furnace", - "gtceu.electric_furnace": "Electric Furnace", - "gtceu.electrolyzer": "Electrolyzer", - "gtceu.electromagnetic_separator": "Electromagnetic Separator", - "gtceu.extractor": "Extractor", - "gtceu.extruder": "Extruder", - "gtceu.fermenter": "Fermenter", - "gtceu.fluid_heater": "Fluid Heater", "gtceu.fluid_pipe.acid_proof": "§6Can handle Acids", "gtceu.fluid_pipe.capacity": "§9Capacity: §f%d mB", "gtceu.fluid_pipe.channels": "§eChannels: §f%d", @@ -2329,15 +2299,9 @@ "gtceu.fluid_pipe.max_temperature": "§cTemperature Limit: §f%d K", "gtceu.fluid_pipe.not_gas_proof": "§4Gases may leak!", "gtceu.fluid_pipe.plasma_proof": "§6Can handle all Plasmas", - "gtceu.fluid_solidifier": "Fluid Solidifier", - "gtceu.forge_hammer": "Forge Hammer", - "gtceu.forming_press": "Forming Press", "gtceu.forming_press.naming.named": "§oNamed Item", "gtceu.forming_press.naming.press": "§oNamed Press", "gtceu.forming_press.naming.to_name": "§oItem to Name", - "gtceu.fusion_reactor": "Fusion Reactor", - "gtceu.gas_collector": "Gas Collector", - "gtceu.gas_turbine": "Gas Turbine", "gtceu.gui.auto_output.name": "auto", "gtceu.gui.charger_slot.tooltip.0": "§fCharger Slot§r", "gtceu.gui.charger_slot.tooltip.1": "§7Draws power from %s batteries§r", @@ -2440,7 +2404,6 @@ "gtceu.hazard_trigger.none": "Nothing", "gtceu.hazard_trigger.protection.description": "Protects from:", "gtceu.hazard_trigger.skin_contact": "Skin contact", - "gtceu.implosion_compressor": "Implosion Compressor", "gtceu.io.both": "Both", "gtceu.io.export": "Export", "gtceu.io.import": "Import", @@ -2552,11 +2515,6 @@ "gtceu.key.enable_boots": "Enable Boosted Jump", "gtceu.key.enable_jetpack": "Enable Jetpack", "gtceu.key.tool_aoe_change": "Tool AoE Mode Switch", - "gtceu.large_boiler": "Large Boiler", - "gtceu.large_chemical_reactor": "Large Chemical Reactor", - "gtceu.laser_engraver": "Laser Engraver", - "gtceu.lathe": "Lathe", - "gtceu.macerator": "Macerator", "gtceu.machine.active_transformer.tooltip.0": "§7Transformers: Lasers in Disguise", "gtceu.machine.active_transformer.tooltip.1": "§7Can combine any number of Energy §fInputs§7 into any number of Energy §fOutputs§7.", "gtceu.machine.active_transformer.tooltip.2": "§7Can transmit power at incredible distance with", @@ -3201,7 +3159,6 @@ "gtceu.medical_condition/silicosis": "§1Silicosis", "gtceu.medical_condition/weak_poison": "§aWeakly poisonous", "gtceu.minimap.ore_vein.depleted": "Depleted", - "gtceu.mixer": "Mixer", "gtceu.mode.both": "§dBoth (Fluid And Item)§r", "gtceu.mode.fluid": "§9Fluid§r", "gtceu.mode.item": "§6Item§r", @@ -3446,26 +3403,12 @@ "gtceu.oc.tooltip.2": "Right click to decrease the OC", "gtceu.oc.tooltip.3": "Middle click to reset the OC", "gtceu.oc.tooltip.4": "Hold Shift to change by Perfect OC", - "gtceu.ore_washer": "Ore Washer", "gtceu.ownership.name.argonauts": "Argonauts Guild", "gtceu.ownership.name.ftb": "FTB Teams", "gtceu.ownership.name.player": "Player", - "gtceu.packer": "Packer", "gtceu.part_sharing.disabled": "Multiblock Sharing §4Disabled", "gtceu.part_sharing.enabled": "Multiblock Sharing §aEnabled", - "gtceu.plasma_generator": "Plasma Generator", - "gtceu.polarizer": "Polarizer", - "gtceu.primitive_blast_furnace": "Primitive Blast Furnace", - "gtceu.pyrolyse_oven": "Pyrolyse Oven", "gtceu.recipe.amperage": "Amperage: %s", - "gtceu.recipe.category.arc_furnace_recycling": "Plasma Scrapping", - "gtceu.recipe.category.chem_dyes": "Chemical Dyeing", - "gtceu.recipe.category.extractor_recycling": "Scrap Remelting", - "gtceu.recipe.category.ingot_molding": "Metal Molding", - "gtceu.recipe.category.macerator_recycling": "Part Grinding", - "gtceu.recipe.category.ore_bathing": "Ore Treating", - "gtceu.recipe.category.ore_crushing": "Ore Grinding", - "gtceu.recipe.category.ore_forging": "Ore Crushing", "gtceu.recipe.chance": "Chance: %s +%s/tier", "gtceu.recipe.cleanroom": "Requires %s", "gtceu.recipe.cleanroom.display_name": "Cleanroom", @@ -3497,31 +3440,9 @@ "gtceu.recipe_memory_widget.tooltip.1": "§7Shift click to lock/unlock this recipe", "gtceu.recipe_type.show_recipes": "Show Recipes", "gtceu.rei.group.potion_fluids": "Potion Fluids", - "gtceu.research_station": "Research Station", - "gtceu.rock_breaker": "Rock Breaker", - "gtceu.scanner": "Scanner", "gtceu.scanner.copy_stick_empty": "§oEmpty Stick", "gtceu.scanner.copy_stick_from": "§oStick to Copy", "gtceu.scanner.copy_stick_to": "§oCopy of Stick", - "gtceu.sifter": "Sifter", - "gtceu.steam_boiler": "Steam Boiler", - "gtceu.steam_turbine": "Steam Turbine", - "gtceu.thermal_centrifuge": "Thermal Centrifuge", - "gtceu.tool_action.crowbar": "§8Use Crowbar to remove Covers", - "gtceu.tool_action.hammer": "§8Use Hard Hammer to muffle Sounds", - "gtceu.tool_action.screwdriver.access_covers": "§8Use Screwdriver to access Covers", - "gtceu.tool_action.screwdriver.auto_collapse": "§8Use Screwdriver to toggle Item collapsing", - "gtceu.tool_action.screwdriver.auto_output": "§8Use Screwdriver to toggle Auto-Output", - "gtceu.tool_action.screwdriver.auto_output_covers": "§8Use Screwdriver to Allow Input from Output Side or access Covers", - "gtceu.tool_action.screwdriver.toggle_mode": "§8Use Screwdriver to toggle Modes", - "gtceu.tool_action.screwdriver.toggle_mode_covers": "§8Use Screwdriver to toggle Modes or access Covers", - "gtceu.tool_action.show_tooltips": "Hold SHIFT to show Tool Info", - "gtceu.tool_action.soft_mallet.reset": "§8Use Soft Mallet to toggle Working", - "gtceu.tool_action.soft_mallet.toggle_mode": "§8Use Soft Mallet to toggle Modes", - "gtceu.tool_action.tape": "§8Use Tape to fix Maintenance Problems", - "gtceu.tool_action.wire_cutter.connect": "§8Use Wire Cutters to set Connections", - "gtceu.tool_action.wrench.connect": "§8Use Wrench to set Connections, sneak to block Connections", - "gtceu.tool_action.wrench.set_facing": "§8Use Wrench to set Facing", "gtceu.tooltip.fluid_pipe_hold_shift": "§7Hold SHIFT to show Fluid Containment Info", "gtceu.tooltip.hold_ctrl": "§7Hold CTRL for more info", "gtceu.tooltip.hold_shift": "§7Hold SHIFT for more info", @@ -3624,8 +3545,6 @@ "gtceu.universal.tooltip.working_area_chunks": "§bWorking Area: §f%dx%d Chunks", "gtceu.universal.tooltip.working_area_chunks_max": "§bMax Working Area: §f%dx%d Chunks", "gtceu.universal.tooltip.working_area_max": "§bMax Working Area: §f%dx%d", - "gtceu.vacuum_freezer": "Vacuum Freezer", - "gtceu.wiremill": "Wiremill", "gui.gtceu.refund_all.desc": "Return Stored Contents to AE2", "gui.gtceu.rename.desc": "Rename Pattern Buffer", "gui.gtceu.share_inventory.desc.0": "Shares inserted items with all patterns within buffer!", @@ -5354,6 +5273,72 @@ "recipe.condition.rock_breaker.tooltip": "Fluid blocks around", "recipe.condition.steam_vent.tooltip": "Clean steam vent", "recipe.condition.thunder.tooltip": "Thunder Level: %d", + "recipe_type.gtceu.air_scrubber": "Air Scrubber", + "recipe_type.gtceu.alloy_blast_smelter": "Alloy Blast Smelter", + "recipe_type.gtceu.alloy_smelter": "Alloy Smelter", + "recipe_type.gtceu.arc_furnace": "Arc Furnace", + "recipe_type.gtceu.assembler": "Assembler", + "recipe_type.gtceu.assembly_line": "Assembly Line", + "recipe_type.gtceu.autoclave": "Autoclave", + "recipe_type.gtceu.bender": "Bender", + "recipe_type.gtceu.brewery": "Brewery", + "recipe_type.gtceu.canner": "Canner", + "recipe_type.gtceu.category.arc_furnace_recycling": "Plasma Scrapping", + "recipe_type.gtceu.category.chem_dyes": "Chemical Dyeing", + "recipe_type.gtceu.category.extractor_recycling": "Scrap Remelting", + "recipe_type.gtceu.category.ingot_molding": "Metal Molding", + "recipe_type.gtceu.category.macerator_recycling": "Part Grinding", + "recipe_type.gtceu.category.ore_bathing": "Ore Treating", + "recipe_type.gtceu.category.ore_crushing": "Ore Grinding", + "recipe_type.gtceu.category.ore_forging": "Ore Crushing", + "recipe_type.gtceu.centrifuge": "Centrifuge", + "recipe_type.gtceu.chemical_bath": "Chemical Bath", + "recipe_type.gtceu.chemical_reactor": "Chemical Reactor", + "recipe_type.gtceu.circuit_assembler": "Circuit Assembler", + "recipe_type.gtceu.coke_oven": "Coke Oven", + "recipe_type.gtceu.combustion_generator": "Combustion Generator", + "recipe_type.gtceu.compressor": "Compressor", + "recipe_type.gtceu.cracker": "Cracker", + "recipe_type.gtceu.cutter": "Cutter", + "recipe_type.gtceu.distillation_tower": "Distillation Tower", + "recipe_type.gtceu.distillery": "Distillery", + "recipe_type.gtceu.dummy": "Dummy", + "recipe_type.gtceu.electric_blast_furnace": "Electric Blast Furnace", + "recipe_type.gtceu.electric_furnace": "Electric Furnace", + "recipe_type.gtceu.electrolyzer": "Electrolyzer", + "recipe_type.gtceu.electromagnetic_separator": "Electromagnetic Separator", + "recipe_type.gtceu.extractor": "Extractor", + "recipe_type.gtceu.extruder": "Extruder", + "recipe_type.gtceu.fermenter": "Fermenter", + "recipe_type.gtceu.fluid_heater": "Fluid Heater", + "recipe_type.gtceu.fluid_solidifier": "Fluid Solidifier", + "recipe_type.gtceu.forge_hammer": "Forge Hammer", + "recipe_type.gtceu.forming_press": "Forming Press", + "recipe_type.gtceu.fusion_reactor": "Fusion Reactor", + "recipe_type.gtceu.gas_collector": "Gas Collector", + "recipe_type.gtceu.gas_turbine": "Gas Turbine", + "recipe_type.gtceu.implosion_compressor": "Implosion Compressor", + "recipe_type.gtceu.large_boiler": "Large Boiler", + "recipe_type.gtceu.large_chemical_reactor": "Large Chemical Reactor", + "recipe_type.gtceu.laser_engraver": "Laser Engraver", + "recipe_type.gtceu.lathe": "Lathe", + "recipe_type.gtceu.macerator": "Macerator", + "recipe_type.gtceu.mixer": "Mixer", + "recipe_type.gtceu.ore_washer": "Ore Washer", + "recipe_type.gtceu.packer": "Packer", + "recipe_type.gtceu.plasma_generator": "Plasma Generator", + "recipe_type.gtceu.polarizer": "Polarizer", + "recipe_type.gtceu.primitive_blast_furnace": "Primitive Blast Furnace", + "recipe_type.gtceu.pyrolyse_oven": "Pyrolyse Oven", + "recipe_type.gtceu.research_station": "Research Station", + "recipe_type.gtceu.rock_breaker": "Rock Breaker", + "recipe_type.gtceu.scanner": "Scanner", + "recipe_type.gtceu.sifter": "Sifter", + "recipe_type.gtceu.steam_boiler": "Steam Boiler", + "recipe_type.gtceu.steam_turbine": "Steam Turbine", + "recipe_type.gtceu.thermal_centrifuge": "Thermal Centrifuge", + "recipe_type.gtceu.vacuum_freezer": "Vacuum Freezer", + "recipe_type.gtceu.wiremill": "Wiremill", "subtitles.gtceu.arc": "Arcs buzzing", "subtitles.gtceu.assembler": "Assembler constructing", "subtitles.gtceu.bath": "Bath fizzing", @@ -5545,5 +5530,20 @@ "tool.gtceu.max_uses.tooltip": "%s §eTotal Durability", "tool.gtceu.mining_speed.tooltip": "%s §dMining Speed", "tool.gtceu.repair_info.tooltip": "§8Hold SHIFT to show Repair Info", - "tool.gtceu.repair_material.tooltip": "§8Repair with: §f§a%s" + "tool.gtceu.repair_material.tooltip": "§8Repair with: §f§a%s", + "tool_action.gtceu.crowbar": "§8Use Crowbar to remove Covers", + "tool_action.gtceu.hammer": "§8Use Hard Hammer to muffle Sounds", + "tool_action.gtceu.screwdriver.access_covers": "§8Use Screwdriver to access Covers", + "tool_action.gtceu.screwdriver.auto_collapse": "§8Use Screwdriver to toggle Item collapsing", + "tool_action.gtceu.screwdriver.auto_output": "§8Use Screwdriver to toggle Auto-Output", + "tool_action.gtceu.screwdriver.auto_output_covers": "§8Use Screwdriver to Allow Input from Output Side or access Covers", + "tool_action.gtceu.screwdriver.toggle_mode": "§8Use Screwdriver to toggle Modes", + "tool_action.gtceu.screwdriver.toggle_mode_covers": "§8Use Screwdriver to toggle Modes or access Covers", + "tool_action.gtceu.show_tooltips": "Hold SHIFT to show Tool Info", + "tool_action.gtceu.soft_mallet.reset": "§8Use Soft Mallet to toggle Working", + "tool_action.gtceu.soft_mallet.toggle_mode": "§8Use Soft Mallet to toggle Modes", + "tool_action.gtceu.tape": "§8Use Tape to fix Maintenance Problems", + "tool_action.gtceu.wire_cutter.connect": "§8Use Wire Cutters to set Connections", + "tool_action.gtceu.wrench.connect": "§8Use Wrench to set Connections, sneak to block Connections", + "tool_action.gtceu.wrench.set_facing": "§8Use Wrench to set Facing" } \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/category/GTRecipeCategory.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/category/GTRecipeCategory.java index a7ee12b579c..27803a2e479 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/category/GTRecipeCategory.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/category/GTRecipeCategory.java @@ -48,7 +48,7 @@ public GTRecipeCategory(@NotNull String categoryName, @NotNull GTRecipeType reci this.recipeType = recipeType; this.name = categoryName; this.registryKey = GTCEu.id(categoryName); - this.languageKey = "%s.recipe.category.%s".formatted(GTCEu.MOD_ID, categoryName); + this.languageKey = "recipe_type.%s.category.%s".formatted(GTCEu.MOD_ID, categoryName); } public static GTRecipeCategory registerDefault(@NotNull GTRecipeType recipeType) { diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java index 1326c00d134..83e96dc44e5 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java @@ -21,20 +21,7 @@ public static void init(RegistrateLangProvider provider) { } private static void initGeneratedNames(RegistrateLangProvider provider) { - // RecipeTypes - for (var recipeType : GTRegistries.RECIPE_TYPES) { - provider.add(recipeType.registryName.toLanguageKey(), toEnglishName(recipeType.registryName.getPath())); - } - // Recipe Categories - provider.add("gtceu.recipe.category.arc_furnace_recycling", "Plasma Scrapping"); - provider.add("gtceu.recipe.category.macerator_recycling", "Part Grinding"); - provider.add("gtceu.recipe.category.extractor_recycling", "Scrap Remelting"); - provider.add("gtceu.recipe.category.ore_crushing", "Ore Grinding"); - provider.add("gtceu.recipe.category.ore_forging", "Ore Crushing"); - provider.add("gtceu.recipe.category.ore_bathing", "Ore Treating"); - provider.add("gtceu.recipe.category.chem_dyes", "Chemical Dyeing"); - provider.add("gtceu.recipe.category.ingot_molding", "Metal Molding"); // All TagPrefixes for (TagPrefix tagPrefix : TagPrefix.values()) { diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java index 5afea946a69..2fd98ba60d5 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java @@ -1,17 +1,38 @@ package com.gregtechceu.gtceu.data.lang; +import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.tterrag.registrate.providers.RegistrateLangProvider; import static com.gregtechceu.gtceu.data.lang.LangUtil.*; +import static com.gregtechceu.gtceu.utils.FormattingUtil.toEnglishName; public class RecipeLang { public static void init(RegistrateLangProvider provider) { + generateRecipeTypes(provider); generateRecipeConditions(provider); generateRecipeDataKeys(provider); generateMiscKeys(provider); } + private static void generateRecipeTypes(RegistrateLangProvider provider) { + // RecipeTypes + for (var recipeType : GTRegistries.RECIPE_TYPES) { + String key = "recipe_type." + recipeType.registryName.toLanguageKey(); + provider.add(key, toEnglishName(recipeType.registryName.getPath())); + } + + // Recipe Categories + provider.add("recipe_type.gtceu.category.arc_furnace_recycling", "Plasma Scrapping"); + provider.add("recipe_type.gtceu.category.macerator_recycling", "Part Grinding"); + provider.add("recipe_type.gtceu.category.extractor_recycling", "Scrap Remelting"); + provider.add("recipe_type.gtceu.category.ore_crushing", "Ore Grinding"); + provider.add("recipe_type.gtceu.category.ore_forging", "Ore Crushing"); + provider.add("recipe_type.gtceu.category.ore_bathing", "Ore Treating"); + provider.add("recipe_type.gtceu.category.chem_dyes", "Chemical Dyeing"); + provider.add("recipe_type.gtceu.category.ingot_molding", "Metal Molding"); + } + private static void generateRecipeConditions(RegistrateLangProvider provider) { // Recipe Conditions provider.add("recipe.condition.thunder.tooltip", "Thunder Level: %d"); From 36e21a1303feb61f96f1a2265798518dc956d300 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Thu, 26 Jun 2025 01:05:27 -0600 Subject: [PATCH 23/45] cauldron washing tooltip keys --- src/generated/resources/assets/gtceu/lang/en_ud.json | 4 ++-- src/generated/resources/assets/gtceu/lang/en_us.json | 4 ++-- .../java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java | 6 +++--- .../java/com/gregtechceu/gtceu/data/lang/MaterialLang.java | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 35df653fff3..9c2d4791092 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -3573,9 +3573,7 @@ "item.cover.digital.wireless.tooltip.1": "˙ʇı oʇ puıq ʎןǝʇoɯǝɹ oʇ ㄥ§ɹoʇıuoW ןɐɹʇuǝƆɟ§ ǝɥʇ uo ㄥ§ʞɔıןƆ ʇɥbıᴚɟ§", "item.cover.digital.wireless.tooltip.2": "˙buıpuıq ʇuǝɹɹnɔ ǝɥʇ ǝʌoɯǝɹ oʇ ㄥ§ʞɔıןƆ ʇɥbıᴚ ʞɐǝuSɟ§", "item.cover.digital.wireless.tooltip.3": "%sɟ§ :buıpuıᗺɐ§", - "item.crushed.tooltip.purify": "ǝɹO pǝıɟıɹnԀ ʇǝb oʇ uoɹpןnɐƆ ɐ ʞɔıןɔ ʇɥbıᴚ", "item.debug_scanner.tooltip": "ɹǝpɹoɔıɹ⟘", - "item.dust.tooltip.purify": "ʇsnᗡ uɐǝןɔ ʇǝb oʇ uoɹpןnɐƆ ɐ ʞɔıןɔ ʇɥbıᴚ", "item.electric.discharge_mode.disabled": "pǝןqɐsıᗡ ǝpoW ǝbɹɐɥɔsıᗡǝ§", "item.electric.discharge_mode.enabled": "pǝןqɐuƎ ǝpoW ǝbɹɐɥɔsıᗡǝ§", "item.electric.discharge_mode.tooltip": "ǝpoɯ ǝbɹɐɥɔsıp ǝןbboʇ oʇ buıʞɐǝus ǝןıɥʍ ǝs∩", @@ -5391,6 +5389,7 @@ "tagprefix.cable_gt_single": "ǝןqɐƆ %s xƖ", "tagprefix.chainsaw_head": "pɐǝH ʍɐsuıɐɥƆ %s", "tagprefix.chipped_gem": "%s pǝddıɥƆ", + "tagprefix.crushed.tooltip.purify": "ǝɹO pǝıɟıɹnԀ ʇǝb oʇ uoɹpןnɐƆ ɐ ʞɔıןɔ ʇɥbıᴚ", "tagprefix.crushed_ore": "ǝɹO %s pǝɥsnɹƆ", "tagprefix.deepslate": "ǝɹO %s ǝʇɐןsdǝǝᗡ", "tagprefix.dense_plate": "ǝʇɐןԀ %s ǝsuǝᗡ", @@ -5423,6 +5422,7 @@ "tagprefix.netherrack": "ǝɹO %s ɹǝɥʇǝN", "tagprefix.nugget": "ʇǝbbnN %s", "tagprefix.null": "ןןnN %s", + "tagprefix.ore_dust.tooltip.purify": "ʇsnᗡ uɐǝןɔ ʇǝb oʇ uoɹpןnɐƆ ɐ ʞɔıןɔ ʇɥbıᴚ", "tagprefix.pipe_huge_fluid": "ǝdıԀ pınןℲ %s ǝbnH", "tagprefix.pipe_huge_item": "ǝdıԀ ɯǝʇI %s ǝbnH", "tagprefix.pipe_huge_restrictive": "ǝdıԀ ɯǝʇI %s ǝʌıʇɔıɹʇsǝᴚ ǝbnH", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index c53a2351ef9..a52e6290c8b 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -3573,9 +3573,7 @@ "item.cover.digital.wireless.tooltip.1": "§fRight Click§7 on the §fCentral Monitor§7 to remotely bind to it.", "item.cover.digital.wireless.tooltip.2": "§fSneak Right Click§7 to remove the current binding.", "item.cover.digital.wireless.tooltip.3": "§aBinding: §f%s", - "item.crushed.tooltip.purify": "Right click a Cauldron to get Purified Ore", "item.debug_scanner.tooltip": "Tricorder", - "item.dust.tooltip.purify": "Right click a Cauldron to get clean Dust", "item.electric.discharge_mode.disabled": "§eDischarge Mode Disabled", "item.electric.discharge_mode.enabled": "§eDischarge Mode Enabled", "item.electric.discharge_mode.tooltip": "Use while sneaking to toggle discharge mode", @@ -5391,6 +5389,7 @@ "tagprefix.cable_gt_single": "1x %s Cable", "tagprefix.chainsaw_head": "%s Chainsaw Head", "tagprefix.chipped_gem": "Chipped %s", + "tagprefix.crushed.tooltip.purify": "Right click a Cauldron to get Purified Ore", "tagprefix.crushed_ore": "Crushed %s Ore", "tagprefix.deepslate": "Deepslate %s Ore", "tagprefix.dense_plate": "Dense %s Plate", @@ -5423,6 +5422,7 @@ "tagprefix.netherrack": "Nether %s Ore", "tagprefix.nugget": "%s Nugget", "tagprefix.null": "%s Null", + "tagprefix.ore_dust.tooltip.purify": "Right click a Cauldron to get clean Dust", "tagprefix.pipe_huge_fluid": "Huge %s Fluid Pipe", "tagprefix.pipe_huge_item": "Huge %s Item Pipe", "tagprefix.pipe_huge_restrictive": "Huge Restrictive %s Item Pipe", diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java b/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java index 5b4d6f9c521..05b3c0a0016 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java @@ -254,7 +254,7 @@ public boolean isEmpty() { .unificationEnabled(true) .generateItem(true) .generationCondition(hasOreProperty) - .tooltip((mat, tooltips) -> tooltips.add(Component.translatable("item.crushed.tooltip.purify"))); + .tooltip((mat, tooltips) -> tooltips.add(Component.translatable("tagprefix.crushed.tooltip.purify"))); // A hot Ingot, which has to be cooled down by a Vacuum Freezer. public static final TagPrefix ingotHot = new TagPrefix("hotIngot") @@ -381,7 +381,7 @@ public boolean isEmpty() { .unificationEnabled(true) .generateItem(true) .generationCondition(hasOreProperty) - .tooltip((mat, tooltips) -> tooltips.add(Component.translatable("item.dust.tooltip.purify"))); + .tooltip((mat, tooltips) -> tooltips.add(Component.translatable("tagprefix.ore_dust.tooltip.purify"))); // Pure Dust worth of one Ingot or Gem. public static final TagPrefix dustPure = new TagPrefix("pureDust") @@ -394,7 +394,7 @@ public boolean isEmpty() { .unificationEnabled(true) .generateItem(true) .generationCondition(hasOreProperty) - .tooltip((mat, tooltips) -> tooltips.add(Component.translatable("item.dust.tooltip.purify"))); + .tooltip((mat, tooltips) -> tooltips.add(Component.translatable("tagprefix.ore_dust.tooltip.purify"))); public static final TagPrefix dust = new TagPrefix("dust") .defaultTagPath("dusts/%s") diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java index 83df1423ca9..4d9eb4ebf59 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java @@ -146,7 +146,7 @@ private static void generateMaterialKeys(RegistrateLangProvider provider) { provider.add("gtceu.jei.materials.average_neutrons", "Average neutrons: %d"); // Cauldron Washing - provider.add("item.dust.tooltip.purify", "Right click a Cauldron to get clean Dust"); - provider.add("item.crushed.tooltip.purify", "Right click a Cauldron to get Purified Ore"); + provider.add("tagprefix.ore_dust.tooltip.purify", "Right click a Cauldron to get clean Dust"); + provider.add("tagprefix.crushed.tooltip.purify", "Right click a Cauldron to get Purified Ore"); } } From 0872d8cf661a221c744bdece5eb4f3511f990263 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Thu, 26 Jun 2025 01:43:11 -0600 Subject: [PATCH 24/45] tool behaviors, tool class, tool info tooltips, turbine rotor tooltips, enchantments --- .../resources/assets/gtceu/lang/en_ud.json | 128 +++++++++--------- .../resources/assets/gtceu/lang/en_us.json | 128 +++++++++--------- .../gregtechceu/gtceu/api/item/IGTTool.java | 34 ++--- .../api/item/component/IMaterialPartItem.java | 4 +- .../common/item/TurbineRotorBehaviour.java | 4 +- .../tool/behavior/BlockRotatingBehavior.java | 2 +- .../tool/behavior/DisableShieldBehavior.java | 2 +- .../tool/behavior/EntityDamageBehavior.java | 4 +- .../item/tool/behavior/GrassPathBehavior.java | 2 +- .../tool/behavior/HarvestCropsBehavior.java | 2 +- .../tool/behavior/HarvestIceBehavior.java | 2 +- .../item/tool/behavior/HoeGroundBehavior.java | 2 +- .../item/tool/behavior/LogStripBehavior.java | 2 +- .../item/tool/behavior/PlungerBehavior.java | 2 +- .../tool/behavior/RotateRailBehavior.java | 2 +- .../item/tool/behavior/ScrapeBehavior.java | 2 +- .../tool/behavior/TorchPlaceBehavior.java | 2 +- .../tool/behavior/TreeFellingBehavior.java | 4 +- .../item/tool/behavior/WaxOffBehavior.java | 2 +- .../gtceu/core/mixins/top/ConfigMixin.java | 2 +- .../gregtechceu/gtceu/data/lang/ToolLang.java | 118 ++++++++-------- .../gtceu/integration/rei/GTREIPlugin.java | 2 +- 22 files changed, 227 insertions(+), 225 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 9c2d4791092..482128a26bb 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -2204,10 +2204,10 @@ "death.attack.gtceu.wrench_iv": "%s ʎq suɐןd ɹıǝɥʇ oʇuı uʍoɹɥʇ ɥɔuǝɹM ʎǝʞuoW ɐ pɐɥ %s", "death.attack.gtceu.wrench_lv": "%s ʎq pǝuǝsooן ǝɹǝʍ sǝdıd s,%s", "effect.gtceu.weak_poison": "uosıoԀ ʞɐǝM", - "enchantment.disjunction": "uoıʇɔunظsıᗡ", + "enchantment.gtceu.disjunction": "uoıʇɔunظsıᗡ", "enchantment.gtceu.disjunction.description": "˙sqoɯ pǝʇɐןǝɹ-ɹǝpuƎ oʇ ssǝuʍoןS puɐ ssǝuʞɐǝM sǝıןddⱯ", + "enchantment.gtceu.hard_hammer": "buıɹǝɯɯɐH", "enchantment.gtceu.hard_hammer.description": "˙ɹǝɯɯɐH ɥɔǝ⟘bǝɹ⅁ ɐ ɥʇıʍ pǝuıɯ ǝɹǝʍ ʎǝɥʇ ɟı sɐ sʞɔoןq sʞɐǝɹᗺ", - "enchantment.hard_hammer": "buıɹǝɯɯɐH", "entity.gtceu.boat": "ʇɐoᗺ", "entity.gtceu.chest_boat": "ʇɐoᗺ ʇsǝɥƆ", "entity.gtceu.dynamite": "ǝʇıɯɐuʎᗡ", @@ -4363,23 +4363,55 @@ "item.gtceu.tool.aoe.layers": "sɹǝʎɐꞀ", "item.gtceu.tool.aoe.rows": "sʍoᴚ", "item.gtceu.tool.axe": "ǝxⱯ %s", + "item.gtceu.tool.behavior.aoe_mining": "%sx%sx%sɟ§ :ʇɔǝɟɟƎ-ɟo-ɐǝɹⱯϛ§", + "item.gtceu.tool.behavior.block_rotation": "sʞɔoןᗺ sǝʇɐʇoᴚɟ§ :ɔıuɐɥɔǝWᄅ§", + "item.gtceu.tool.behavior.crop_harvesting": "sdoɹƆ sʇsǝʌɹɐHɟ§ :ɹǝʇsǝʌɹɐHɐ§", + "item.gtceu.tool.behavior.damage_boost": "%s ʇsuıɐbɐ ǝbɐɯɐp ɐɹʇxƎɟ§ :ʇsooᗺ ǝbɐɯɐᗡㄣ§", + "item.gtceu.tool.behavior.grass_path": "sɥʇɐԀ ssɐɹ⅁ sǝʇɐǝɹƆɟ§ :ɹǝdɐɔspuɐꞀǝ§", + "item.gtceu.tool.behavior.ground_tilling": "punoɹ⅁ sןןı⟘ɟ§ :ɹǝɯɹɐℲǝ§", + "item.gtceu.tool.behavior.plunger": "spınןℲ suıɐɹᗡɟ§ :ɹǝqɯnןԀ6§", + "item.gtceu.tool.behavior.rail_rotation": "sןıɐᴚ sǝʇɐʇoᴚɟ§ :ɹǝǝuıbuƎ pɐoɹןıɐᴚǝ§", + "item.gtceu.tool.behavior.relocate_mining": "sdoɹᗡ qoW puɐ sʞɔoןᗺ pǝuıW sǝʇɐɔoןǝᴚɟ§ :ɔıʇǝubɐWᄅ§", + "item.gtceu.tool.behavior.remove_wax": "xɐM sǝʌoɯǝᴚɟ§ :ɹǝuɐǝןƆ9§", + "item.gtceu.tool.behavior.scrape": "uoıʇɐpıxO sǝʌoɯǝᴚɟ§ :ɹǝɥsıןoԀq§", + "item.gtceu.tool.behavior.shield_disable": "spןǝıɥS sǝןqɐsıᗡɟ§ :ǝʇnɹᗺɔ§", + "item.gtceu.tool.behavior.silk_ice": "ǝɔI sʇsǝʌɹɐH ʞןıSɟ§ :ɹǝʇʇnƆ ǝɔIq§", + "item.gtceu.tool.behavior.strip_log": "sboꞀ sdıɹʇSɟ§ :uɐsıʇɹⱯϛ§", + "item.gtceu.tool.behavior.torch_place": "ʞɔıןƆ-ʇɥbıᴚ uo sǝɥɔɹo⟘ sǝɔɐןԀɟ§ :ɹǝʞunןǝdSǝ§", + "item.gtceu.tool.behavior.tree_felling": "buıןןǝℲ ǝǝɹ⟘ɟ§ :ʞɔɐظɹǝqɯnꞀㄣ§", "item.gtceu.tool.butchery_knife": "ǝɟıuʞ ʎɹǝɥɔʇnᗺ %s", "item.gtceu.tool.butchery_knife.tooltip": "ǝʇɐᴚ ʞɔɐʇʇⱯ ʍoןs ɐ sɐH8§", "item.gtceu.tool.buzzsaw": ")ΛꞀ( ʍɐszznᗺ %s", "item.gtceu.tool.buzzsaw.tooltip": "sʞɔoןᗺ buıʇsǝʌɹɐɥ ɹoɟ ǝןqɐʇıns ʇoN8§", + "item.gtceu.tool.class.axe": "ǝxⱯ", + "item.gtceu.tool.class.butchery_knife": "ǝɟıuʞ ʎɹǝɥɔʇnᗺ", + "item.gtceu.tool.class.crowbar": "ɹɐqʍoɹƆ", + "item.gtceu.tool.class.drill": "ןןıɹᗡ", + "item.gtceu.tool.class.file": "ǝןıℲ", + "item.gtceu.tool.class.hammer": "ɹǝɯɯɐH", + "item.gtceu.tool.class.hoe": "ǝoH", + "item.gtceu.tool.class.knife": "ǝɟıuʞ", + "item.gtceu.tool.class.mallet": "ʇǝןןɐW ʇɟoS", + "item.gtceu.tool.class.mining_hammer": "ɹǝɯɯɐH buıuıW", + "item.gtceu.tool.class.mortar": "ɹɐʇɹoW", + "item.gtceu.tool.class.pickaxe": "ǝxɐʞɔıԀ", + "item.gtceu.tool.class.plunger": "ɹǝbunןԀ", + "item.gtceu.tool.class.rolling_pin": "uıԀ buıןןoᴚ", + "item.gtceu.tool.class.saw": "ʍɐS", + "item.gtceu.tool.class.screwdriver": "ɹǝʌıɹpʍǝɹɔS", + "item.gtceu.tool.class.scythe": "ǝɥʇʎɔS", + "item.gtceu.tool.class.shears": "sɹɐǝɥS", + "item.gtceu.tool.class.shovel": "ןǝʌoɥS", + "item.gtceu.tool.class.spade": "ǝpɐdS", + "item.gtceu.tool.class.sword": "pɹoʍS", + "item.gtceu.tool.class.wire_cutter": "ɹǝʇʇnƆ ǝɹıM", + "item.gtceu.tool.class.wrench": "ɥɔuǝɹM", "item.gtceu.tool.crowbar": "ɹɐqʍoɹƆ %s", "item.gtceu.tool.crowbar.tooltip": "sɹǝʌoƆ sʇunoɯsıᗡ8§", "item.gtceu.tool.ev_drill": ")ΛƎ( ןןıɹᗡ %s", "item.gtceu.tool.file": "ǝןıℲ %s", "item.gtceu.tool.hammer": "ɹǝɯɯɐH %s", "item.gtceu.tool.hammer.tooltip": "ɯǝɥʇ buıʇsǝʌɹɐɥ uǝɥʍ sʞɔoןᗺ sǝɥsnɹƆ8§", - "item.gtceu.tool.harvest_level.0": "pooM8§", - "item.gtceu.tool.harvest_level.1": "ǝuoʇSㄥ§", - "item.gtceu.tool.harvest_level.2": "uoɹIɐ§", - "item.gtceu.tool.harvest_level.3": "puoɯɐıᗡq§", - "item.gtceu.tool.harvest_level.4": "ǝʇıɹǝɥʇǝNp§", - "item.gtceu.tool.harvest_level.5": "ɯnıuɐɹnᗡ6§", - "item.gtceu.tool.harvest_level.6": "ɯnıuoɹʇnǝNɔ§", "item.gtceu.tool.hoe": "ǝoH %s", "item.gtceu.tool.hv_chainsaw": ")ΛH( ʍɐsuıɐɥƆ %s", "item.gtceu.tool.hv_drill": ")ΛH( ןןıɹᗡ %s", @@ -4411,7 +4443,6 @@ "item.gtceu.tool.pickaxe": "ǝxɐʞɔıԀ %s", "item.gtceu.tool.plunger": "ɹǝbunןԀ %s", "item.gtceu.tool.plunger.tooltip": "sǝuıɥɔɐW ɯoɹɟ spınןℲ sǝʌoɯǝᴚ8§", - "item.gtceu.tool.replace_tool_head": "ʇı ǝɔɐןdǝɹ oʇ pɐǝH ןoo⟘ ʍǝu ɐ ɥʇıʍ ʇɟɐɹƆ", "item.gtceu.tool.rolling_pin": "uıԀ buıןןoᴚ %s", "item.gtceu.tool.saw": "ʍɐS %s", "item.gtceu.tool.screwdriver": "ɹǝʌıɹpʍǝɹɔS %s", @@ -4423,7 +4454,6 @@ "item.gtceu.tool.spade": "ǝpɐdS %s", "item.gtceu.tool.spade.tooltip": ")buıɥɔnoɹɔ ǝɹ,noʎ ssǝןun( ǝɔuo ʇɐ ɐǝɹɐ ǝbɹɐן ɐ sǝuıW8§", "item.gtceu.tool.sword": "pɹoʍS %s", - "item.gtceu.tool.usable_as": "%sɟ§ :sɐ ǝןqɐs∩8§", "item.gtceu.tool.wire_cutter": "ɹǝʇʇnƆ ǝɹıM %s", "item.gtceu.tool.wrench": "ɥɔuǝɹM %s", "item.gtceu.tool.wrench.tooltip": "sǝuıɥɔɐW ǝןʇuɐɯsıp oʇ ʞɔıןɔ ʇɟǝן pןoH8§", @@ -4439,6 +4469,10 @@ "item.gtceu.tungsten_steel_fluid_cell": "ןןǝƆ ןǝǝʇsuǝʇsbun⟘ %s", "item.gtceu.turbine_rotor": "ɹoʇoᴚ ǝuıqɹn⟘ %s", "item.gtceu.turbine_rotor.tooltip": "uoıʇɐʇs ɹǝʍod ɹnoʎ ɹoɟ sɹoʇoᴚ ǝuıqɹn⟘", + "item.gtceu.turbine_rotor.tooltip.durability": "%d / %dɐ§ :ʎʇıןıqɐɹnᗡɟ§", + "item.gtceu.turbine_rotor.tooltip.efficiency": "%d%%6§ :ʎɔuǝıɔıɟɟƎ ǝuıqɹn⟘", + "item.gtceu.turbine_rotor.tooltip.power": "%d%%6§ :ɹǝʍoԀ ǝuıqɹn⟘", + "item.gtceu.turbine_rotor.tooltip.primary_material": "%sǝ§ :ןɐıɹǝʇɐWɟ§", "item.gtceu.uev_conveyor_module": "ǝןnpoW ɹoʎǝʌuoƆ ΛƎ∩", "item.gtceu.uev_electric_motor": "ɹoʇoW ɔıɹʇɔǝןƎ ΛƎ∩", "item.gtceu.uev_electric_piston": "uoʇsıԀ ɔıɹʇɔǝןƎ ΛƎ∩", @@ -4568,10 +4602,6 @@ "item.terminal.tooltip.creative": "ǝpoW ǝʌıʇɐǝɹƆq§", "item.terminal.tooltip.hardware": "%d :ǝɹɐʍpɹɐHɐ§", "item.toggle.advanced.info.tooltip": ">uoıʇɐɹnbıɟuoɔ pǝɹoʇs ʍǝıʌ oʇ ʞɐǝuS<8§", - "item.tool.tooltip.durability": "%d / %dɐ§ :ʎʇıןıqɐɹnᗡɟ§", - "item.tool.tooltip.primary_material": "%sǝ§ :ןɐıɹǝʇɐWɟ§", - "item.tool.tooltip.rotor.efficiency": "%d%%6§ :ʎɔuǝıɔıɟɟƎ ǝuıqɹn⟘", - "item.tool.tooltip.rotor.power": "%d%%6§ :ɹǝʍoԀ ǝuıqɹn⟘", "item.tricorder_scanner.tooltip": "ɹǝpɹoɔıɹ⟘", "itemGroup.gtceu.decoration": "sʞɔoןᗺ uoıʇɐɹoɔǝᗡ nƎƆɥɔǝ⟘bǝɹ⅁", "itemGroup.gtceu.item": "sɯǝʇI nƎƆɥɔǝ⟘bǝɹ⅁", @@ -5482,55 +5512,25 @@ "tagprefix.wire_gt_quadruple": "ǝɹıM %s xㄣ", "tagprefix.wire_gt_single": "ǝɹıM %s xƖ", "tagprefix.wrench_tip": "dı⟘ ɥɔuǝɹM %s", - "tool.gtceu.attack_damage.tooltip": "ǝbɐɯɐᗡ ʞɔɐʇʇⱯɔ§ %s", - "tool.gtceu.attack_speed.tooltip": "pǝǝdS ʞɔɐʇʇⱯ6§ %s", - "tool.gtceu.behavior.aoe_mining": "%sx%sx%sɟ§ :ʇɔǝɟɟƎ-ɟo-ɐǝɹⱯϛ§", - "tool.gtceu.behavior.block_rotation": "sʞɔoןᗺ sǝʇɐʇoᴚɟ§ :ɔıuɐɥɔǝWᄅ§", - "tool.gtceu.behavior.crop_harvesting": "sdoɹƆ sʇsǝʌɹɐHɟ§ :ɹǝʇsǝʌɹɐHɐ§", - "tool.gtceu.behavior.damage_boost": "%s ʇsuıɐbɐ ǝbɐɯɐp ɐɹʇxƎɟ§ :ʇsooᗺ ǝbɐɯɐᗡㄣ§", - "tool.gtceu.behavior.grass_path": "sɥʇɐԀ ssɐɹ⅁ sǝʇɐǝɹƆɟ§ :ɹǝdɐɔspuɐꞀǝ§", - "tool.gtceu.behavior.ground_tilling": "punoɹ⅁ sןןı⟘ɟ§ :ɹǝɯɹɐℲǝ§", - "tool.gtceu.behavior.plunger": "spınןℲ suıɐɹᗡɟ§ :ɹǝqɯnןԀ6§", - "tool.gtceu.behavior.rail_rotation": "sןıɐᴚ sǝʇɐʇoᴚɟ§ :ɹǝǝuıbuƎ pɐoɹןıɐᴚǝ§", - "tool.gtceu.behavior.relocate_mining": "sdoɹᗡ qoW puɐ sʞɔoןᗺ pǝuıW sǝʇɐɔoןǝᴚɟ§ :ɔıʇǝubɐWᄅ§", - "tool.gtceu.behavior.remove_wax": "xɐM sǝʌoɯǝᴚɟ§ :ɹǝuɐǝןƆ9§", - "tool.gtceu.behavior.scrape": "uoıʇɐpıxO sǝʌoɯǝᴚɟ§ :ɹǝɥsıןoԀq§", - "tool.gtceu.behavior.shield_disable": "spןǝıɥS sǝןqɐsıᗡɟ§ :ǝʇnɹᗺɔ§", - "tool.gtceu.behavior.silk_ice": "ǝɔI sʇsǝʌɹɐH ʞןıSɟ§ :ɹǝʇʇnƆ ǝɔIq§", - "tool.gtceu.behavior.strip_log": "sboꞀ sdıɹʇSɟ§ :uɐsıʇɹⱯϛ§", - "tool.gtceu.behavior.torch_place": "ʞɔıןƆ-ʇɥbıᴚ uo sǝɥɔɹo⟘ sǝɔɐןԀɟ§ :ɹǝʞunןǝdSǝ§", - "tool.gtceu.behavior.tree_felling": "buıןןǝℲ ǝǝɹ⟘ɟ§ :ʞɔɐظɹǝqɯnꞀㄣ§", - "tool.gtceu.class.axe": "ǝxⱯ", - "tool.gtceu.class.butchery_knife": "ǝɟıuʞ ʎɹǝɥɔʇnᗺ", - "tool.gtceu.class.crowbar": "ɹɐqʍoɹƆ", - "tool.gtceu.class.drill": "ןןıɹᗡ", - "tool.gtceu.class.file": "ǝןıℲ", - "tool.gtceu.class.hammer": "ɹǝɯɯɐH", - "tool.gtceu.class.hoe": "ǝoH", - "tool.gtceu.class.knife": "ǝɟıuʞ", - "tool.gtceu.class.mallet": "ʇǝןןɐW ʇɟoS", - "tool.gtceu.class.mining_hammer": "ɹǝɯɯɐH buıuıW", - "tool.gtceu.class.mortar": "ɹɐʇɹoW", - "tool.gtceu.class.pickaxe": "ǝxɐʞɔıԀ", - "tool.gtceu.class.plunger": "ɹǝbunןԀ", - "tool.gtceu.class.rolling_pin": "uıԀ buıןןoᴚ", - "tool.gtceu.class.saw": "ʍɐS", - "tool.gtceu.class.screwdriver": "ɹǝʌıɹpʍǝɹɔS", - "tool.gtceu.class.scythe": "ǝɥʇʎɔS", - "tool.gtceu.class.shears": "sɹɐǝɥS", - "tool.gtceu.class.shovel": "ןǝʌoɥS", - "tool.gtceu.class.spade": "ǝpɐdS", - "tool.gtceu.class.sword": "pɹoʍS", - "tool.gtceu.class.wire_cutter": "ɹǝʇʇnƆ ǝɹıM", - "tool.gtceu.class.wrench": "ɥɔuǝɹM", - "tool.gtceu.crafting_uses.tooltip": "sǝs∩ buıʇɟɐɹƆɐ§ %s", - "tool.gtceu.general_uses.tooltip": "ʎʇıןıqɐɹnᗡq§ %s", - "tool.gtceu.harvest_level.tooltip": "%s ןǝʌǝꞀ ʇsǝʌɹɐHǝ§", - "tool.gtceu.harvest_level_extra.tooltip": ")ɟ§%s(ɟ§ %s ןǝʌǝꞀ ʇsǝʌɹɐHǝ§", - "tool.gtceu.max_uses.tooltip": "ʎʇıןıqɐɹnᗡ ןɐʇo⟘ǝ§ %s", - "tool.gtceu.mining_speed.tooltip": "pǝǝdS buıuıWp§ %s", - "tool.gtceu.repair_info.tooltip": "oɟuI ɹıɐdǝᴚ ʍoɥs oʇ ⟘ℲIHS pןoH8§", - "tool.gtceu.repair_material.tooltip": "%sɐ§ɟ§ :ɥʇıʍ ɹıɐdǝᴚ8§", + "tool.gtceu.tooltip.attack_damage": "ǝbɐɯɐᗡ ʞɔɐʇʇⱯɔ§ %s", + "tool.gtceu.tooltip.attack_speed": "pǝǝdS ʞɔɐʇʇⱯ6§ %s", + "tool.gtceu.tooltip.crafting_uses": "sǝs∩ buıʇɟɐɹƆɐ§ %s", + "tool.gtceu.tooltip.general_uses": "ʎʇıןıqɐɹnᗡq§ %s", + "tool.gtceu.tooltip.harvest_level": "%s ןǝʌǝꞀ ʇsǝʌɹɐHǝ§", + "tool.gtceu.tooltip.harvest_level_extra": ")ɟ§%s(ɟ§ %s ןǝʌǝꞀ ʇsǝʌɹɐHǝ§", + "tool.gtceu.tooltip.harvest_level_name.0": "pooM8§", + "tool.gtceu.tooltip.harvest_level_name.1": "ǝuoʇSㄥ§", + "tool.gtceu.tooltip.harvest_level_name.2": "uoɹIɐ§", + "tool.gtceu.tooltip.harvest_level_name.3": "puoɯɐıᗡq§", + "tool.gtceu.tooltip.harvest_level_name.4": "ǝʇıɹǝɥʇǝNp§", + "tool.gtceu.tooltip.harvest_level_name.5": "ɯnıuɐɹnᗡ6§", + "tool.gtceu.tooltip.harvest_level_name.6": "ɯnıuoɹʇnǝNɔ§", + "tool.gtceu.tooltip.max_uses": "ʎʇıןıqɐɹnᗡ ןɐʇo⟘ǝ§ %s", + "tool.gtceu.tooltip.mining_speed": "pǝǝdS buıuıWp§ %s", + "tool.gtceu.tooltip.repair_material": "%sɐ§ɟ§ :ɥʇıʍ ɹıɐdǝᴚ8§", + "tool.gtceu.tooltip.replace_tool_head": "ʇı ǝɔɐןdǝɹ oʇ pɐǝH ןoo⟘ ʍǝu ɐ ɥʇıʍ ʇɟɐɹƆ", + "tool.gtceu.tooltip.show_repair_info": "oɟuI ɹıɐdǝᴚ ʍoɥs oʇ ⟘ℲIHS pןoH8§", + "tool.gtceu.tooltip.usable_as": "%sɟ§ :sɐ ǝןqɐs∩8§", "tool_action.gtceu.crowbar": "sɹǝʌoƆ ǝʌoɯǝɹ oʇ ɹɐqʍoɹƆ ǝs∩8§", "tool_action.gtceu.hammer": "spunoS ǝןɟɟnɯ oʇ ɹǝɯɯɐH pɹɐH ǝs∩8§", "tool_action.gtceu.screwdriver.access_covers": "sɹǝʌoƆ ssǝɔɔɐ oʇ ɹǝʌıɹpʍǝɹɔS ǝs∩8§", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index a52e6290c8b..301200e8670 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -2204,10 +2204,10 @@ "death.attack.gtceu.wrench_iv": "%s had a Monkey Wrench thrown into their plans by %s", "death.attack.gtceu.wrench_lv": "%s's pipes were loosened by %s", "effect.gtceu.weak_poison": "Weak Poison", - "enchantment.disjunction": "Disjunction", + "enchantment.gtceu.disjunction": "Disjunction", "enchantment.gtceu.disjunction.description": "Applies Weakness and Slowness to Ender-related mobs.", + "enchantment.gtceu.hard_hammer": "Hammering", "enchantment.gtceu.hard_hammer.description": "Breaks blocks as if they were mined with a GregTech Hammer.", - "enchantment.hard_hammer": "Hammering", "entity.gtceu.boat": "Boat", "entity.gtceu.chest_boat": "Chest Boat", "entity.gtceu.dynamite": "Dynamite", @@ -4363,23 +4363,55 @@ "item.gtceu.tool.aoe.layers": "Layers", "item.gtceu.tool.aoe.rows": "Rows", "item.gtceu.tool.axe": "%s Axe", + "item.gtceu.tool.behavior.aoe_mining": "§5Area-of-Effect: §f%sx%sx%s", + "item.gtceu.tool.behavior.block_rotation": "§2Mechanic: §fRotates Blocks", + "item.gtceu.tool.behavior.crop_harvesting": "§aHarvester: §fHarvests Crops", + "item.gtceu.tool.behavior.damage_boost": "§4Damage Boost: §fExtra damage against %s", + "item.gtceu.tool.behavior.grass_path": "§eLandscaper: §fCreates Grass Paths", + "item.gtceu.tool.behavior.ground_tilling": "§eFarmer: §fTills Ground", + "item.gtceu.tool.behavior.plunger": "§9Plumber: §fDrains Fluids", + "item.gtceu.tool.behavior.rail_rotation": "§eRailroad Engineer: §fRotates Rails", + "item.gtceu.tool.behavior.relocate_mining": "§2Magnetic: §fRelocates Mined Blocks and Mob Drops", + "item.gtceu.tool.behavior.remove_wax": "§6Cleaner: §fRemoves Wax", + "item.gtceu.tool.behavior.scrape": "§bPolisher: §fRemoves Oxidation", + "item.gtceu.tool.behavior.shield_disable": "§cBrute: §fDisables Shields", + "item.gtceu.tool.behavior.silk_ice": "§bIce Cutter: §fSilk Harvests Ice", + "item.gtceu.tool.behavior.strip_log": "§5Artisan: §fStrips Logs", + "item.gtceu.tool.behavior.torch_place": "§eSpelunker: §fPlaces Torches on Right-Click", + "item.gtceu.tool.behavior.tree_felling": "§4Lumberjack: §fTree Felling", "item.gtceu.tool.butchery_knife": "%s Butchery Knife", "item.gtceu.tool.butchery_knife.tooltip": "§8Has a slow Attack Rate", "item.gtceu.tool.buzzsaw": "%s Buzzsaw (LV)", "item.gtceu.tool.buzzsaw.tooltip": "§8Not suitable for harvesting Blocks", + "item.gtceu.tool.class.axe": "Axe", + "item.gtceu.tool.class.butchery_knife": "Butchery Knife", + "item.gtceu.tool.class.crowbar": "Crowbar", + "item.gtceu.tool.class.drill": "Drill", + "item.gtceu.tool.class.file": "File", + "item.gtceu.tool.class.hammer": "Hammer", + "item.gtceu.tool.class.hoe": "Hoe", + "item.gtceu.tool.class.knife": "Knife", + "item.gtceu.tool.class.mallet": "Soft Mallet", + "item.gtceu.tool.class.mining_hammer": "Mining Hammer", + "item.gtceu.tool.class.mortar": "Mortar", + "item.gtceu.tool.class.pickaxe": "Pickaxe", + "item.gtceu.tool.class.plunger": "Plunger", + "item.gtceu.tool.class.rolling_pin": "Rolling Pin", + "item.gtceu.tool.class.saw": "Saw", + "item.gtceu.tool.class.screwdriver": "Screwdriver", + "item.gtceu.tool.class.scythe": "Scythe", + "item.gtceu.tool.class.shears": "Shears", + "item.gtceu.tool.class.shovel": "Shovel", + "item.gtceu.tool.class.spade": "Spade", + "item.gtceu.tool.class.sword": "Sword", + "item.gtceu.tool.class.wire_cutter": "Wire Cutter", + "item.gtceu.tool.class.wrench": "Wrench", "item.gtceu.tool.crowbar": "%s Crowbar", "item.gtceu.tool.crowbar.tooltip": "§8Dismounts Covers", "item.gtceu.tool.ev_drill": "%s Drill (EV)", "item.gtceu.tool.file": "%s File", "item.gtceu.tool.hammer": "%s Hammer", "item.gtceu.tool.hammer.tooltip": "§8Crushes Blocks when harvesting them", - "item.gtceu.tool.harvest_level.0": "§8Wood", - "item.gtceu.tool.harvest_level.1": "§7Stone", - "item.gtceu.tool.harvest_level.2": "§aIron", - "item.gtceu.tool.harvest_level.3": "§bDiamond", - "item.gtceu.tool.harvest_level.4": "§dNetherite", - "item.gtceu.tool.harvest_level.5": "§9Duranium", - "item.gtceu.tool.harvest_level.6": "§cNeutronium", "item.gtceu.tool.hoe": "%s Hoe", "item.gtceu.tool.hv_chainsaw": "%s Chainsaw (HV)", "item.gtceu.tool.hv_drill": "%s Drill (HV)", @@ -4411,7 +4443,6 @@ "item.gtceu.tool.pickaxe": "%s Pickaxe", "item.gtceu.tool.plunger": "%s Plunger", "item.gtceu.tool.plunger.tooltip": "§8Removes Fluids from Machines", - "item.gtceu.tool.replace_tool_head": "Craft with a new Tool Head to replace it", "item.gtceu.tool.rolling_pin": "%s Rolling Pin", "item.gtceu.tool.saw": "%s Saw", "item.gtceu.tool.screwdriver": "%s Screwdriver", @@ -4423,7 +4454,6 @@ "item.gtceu.tool.spade": "%s Spade", "item.gtceu.tool.spade.tooltip": "§8Mines a large area at once (unless you're crouching)", "item.gtceu.tool.sword": "%s Sword", - "item.gtceu.tool.usable_as": "§8Usable as: §f%s", "item.gtceu.tool.wire_cutter": "%s Wire Cutter", "item.gtceu.tool.wrench": "%s Wrench", "item.gtceu.tool.wrench.tooltip": "§8Hold left click to dismantle Machines", @@ -4439,6 +4469,10 @@ "item.gtceu.tungsten_steel_fluid_cell": "%s Tungstensteel Cell", "item.gtceu.turbine_rotor": "%s Turbine Rotor", "item.gtceu.turbine_rotor.tooltip": "Turbine Rotors for your power station", + "item.gtceu.turbine_rotor.tooltip.durability": "§fDurability: §a%d / %d", + "item.gtceu.turbine_rotor.tooltip.efficiency": "Turbine Efficiency: §9%d%%", + "item.gtceu.turbine_rotor.tooltip.power": "Turbine Power: §9%d%%", + "item.gtceu.turbine_rotor.tooltip.primary_material": "§fMaterial: §e%s", "item.gtceu.uev_conveyor_module": "UEV Conveyor Module", "item.gtceu.uev_electric_motor": "UEV Electric Motor", "item.gtceu.uev_electric_piston": "UEV Electric Piston", @@ -4568,10 +4602,6 @@ "item.terminal.tooltip.creative": "§bCreative Mode", "item.terminal.tooltip.hardware": "§aHardware: %d", "item.toggle.advanced.info.tooltip": "§8", - "item.tool.tooltip.durability": "§fDurability: §a%d / %d", - "item.tool.tooltip.primary_material": "§fMaterial: §e%s", - "item.tool.tooltip.rotor.efficiency": "Turbine Efficiency: §9%d%%", - "item.tool.tooltip.rotor.power": "Turbine Power: §9%d%%", "item.tricorder_scanner.tooltip": "Tricorder", "itemGroup.gtceu.decoration": "GregTechCEu Decoration Blocks", "itemGroup.gtceu.item": "GregTechCEu Items", @@ -5482,55 +5512,25 @@ "tagprefix.wire_gt_quadruple": "4x %s Wire", "tagprefix.wire_gt_single": "1x %s Wire", "tagprefix.wrench_tip": "%s Wrench Tip", - "tool.gtceu.attack_damage.tooltip": "%s §cAttack Damage", - "tool.gtceu.attack_speed.tooltip": "%s §9Attack Speed", - "tool.gtceu.behavior.aoe_mining": "§5Area-of-Effect: §f%sx%sx%s", - "tool.gtceu.behavior.block_rotation": "§2Mechanic: §fRotates Blocks", - "tool.gtceu.behavior.crop_harvesting": "§aHarvester: §fHarvests Crops", - "tool.gtceu.behavior.damage_boost": "§4Damage Boost: §fExtra damage against %s", - "tool.gtceu.behavior.grass_path": "§eLandscaper: §fCreates Grass Paths", - "tool.gtceu.behavior.ground_tilling": "§eFarmer: §fTills Ground", - "tool.gtceu.behavior.plunger": "§9Plumber: §fDrains Fluids", - "tool.gtceu.behavior.rail_rotation": "§eRailroad Engineer: §fRotates Rails", - "tool.gtceu.behavior.relocate_mining": "§2Magnetic: §fRelocates Mined Blocks and Mob Drops", - "tool.gtceu.behavior.remove_wax": "§6Cleaner: §fRemoves Wax", - "tool.gtceu.behavior.scrape": "§bPolisher: §fRemoves Oxidation", - "tool.gtceu.behavior.shield_disable": "§cBrute: §fDisables Shields", - "tool.gtceu.behavior.silk_ice": "§bIce Cutter: §fSilk Harvests Ice", - "tool.gtceu.behavior.strip_log": "§5Artisan: §fStrips Logs", - "tool.gtceu.behavior.torch_place": "§eSpelunker: §fPlaces Torches on Right-Click", - "tool.gtceu.behavior.tree_felling": "§4Lumberjack: §fTree Felling", - "tool.gtceu.class.axe": "Axe", - "tool.gtceu.class.butchery_knife": "Butchery Knife", - "tool.gtceu.class.crowbar": "Crowbar", - "tool.gtceu.class.drill": "Drill", - "tool.gtceu.class.file": "File", - "tool.gtceu.class.hammer": "Hammer", - "tool.gtceu.class.hoe": "Hoe", - "tool.gtceu.class.knife": "Knife", - "tool.gtceu.class.mallet": "Soft Mallet", - "tool.gtceu.class.mining_hammer": "Mining Hammer", - "tool.gtceu.class.mortar": "Mortar", - "tool.gtceu.class.pickaxe": "Pickaxe", - "tool.gtceu.class.plunger": "Plunger", - "tool.gtceu.class.rolling_pin": "Rolling Pin", - "tool.gtceu.class.saw": "Saw", - "tool.gtceu.class.screwdriver": "Screwdriver", - "tool.gtceu.class.scythe": "Scythe", - "tool.gtceu.class.shears": "Shears", - "tool.gtceu.class.shovel": "Shovel", - "tool.gtceu.class.spade": "Spade", - "tool.gtceu.class.sword": "Sword", - "tool.gtceu.class.wire_cutter": "Wire Cutter", - "tool.gtceu.class.wrench": "Wrench", - "tool.gtceu.crafting_uses.tooltip": "%s §aCrafting Uses", - "tool.gtceu.general_uses.tooltip": "%s §bDurability", - "tool.gtceu.harvest_level.tooltip": "§eHarvest Level %s", - "tool.gtceu.harvest_level_extra.tooltip": "§eHarvest Level %s §f(%s§f)", - "tool.gtceu.max_uses.tooltip": "%s §eTotal Durability", - "tool.gtceu.mining_speed.tooltip": "%s §dMining Speed", - "tool.gtceu.repair_info.tooltip": "§8Hold SHIFT to show Repair Info", - "tool.gtceu.repair_material.tooltip": "§8Repair with: §f§a%s", + "tool.gtceu.tooltip.attack_damage": "%s §cAttack Damage", + "tool.gtceu.tooltip.attack_speed": "%s §9Attack Speed", + "tool.gtceu.tooltip.crafting_uses": "%s §aCrafting Uses", + "tool.gtceu.tooltip.general_uses": "%s §bDurability", + "tool.gtceu.tooltip.harvest_level": "§eHarvest Level %s", + "tool.gtceu.tooltip.harvest_level_extra": "§eHarvest Level %s §f(%s§f)", + "tool.gtceu.tooltip.harvest_level_name.0": "§8Wood", + "tool.gtceu.tooltip.harvest_level_name.1": "§7Stone", + "tool.gtceu.tooltip.harvest_level_name.2": "§aIron", + "tool.gtceu.tooltip.harvest_level_name.3": "§bDiamond", + "tool.gtceu.tooltip.harvest_level_name.4": "§dNetherite", + "tool.gtceu.tooltip.harvest_level_name.5": "§9Duranium", + "tool.gtceu.tooltip.harvest_level_name.6": "§cNeutronium", + "tool.gtceu.tooltip.max_uses": "%s §eTotal Durability", + "tool.gtceu.tooltip.mining_speed": "%s §dMining Speed", + "tool.gtceu.tooltip.repair_material": "§8Repair with: §f§a%s", + "tool.gtceu.tooltip.replace_tool_head": "Craft with a new Tool Head to replace it", + "tool.gtceu.tooltip.show_repair_info": "§8Hold SHIFT to show Repair Info", + "tool.gtceu.tooltip.usable_as": "§8Usable as: §f%s", "tool_action.gtceu.crowbar": "§8Use Crowbar to remove Covers", "tool_action.gtceu.hammer": "§8Use Hard Hammer to muffle Sounds", "tool_action.gtceu.screwdriver.access_covers": "§8Use Screwdriver to access Covers", diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java b/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java index dc6b7686364..c7615fa934f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java @@ -650,36 +650,36 @@ default int getTotalHarvestLevel(ItemStack stack) { // show this int damageRemaining = tool.getTotalMaxDurability(stack) - stack.getDamageValue() + 1; if (toolStats.isSuitableForCrafting(stack)) { - tooltip.add(Component.translatable("tool.gtceu.crafting_uses.tooltip", FormattingUtil + tooltip.add(Component.translatable("tool.gtceu.tooltip.crafting_uses", FormattingUtil .formatNumbers(damageRemaining / Math.max(1, toolStats.getToolDamagePerCraft(stack))))); } - tooltip.add(Component.translatable("tool.gtceu.max_uses.tooltip", + tooltip.add(Component.translatable("tool.gtceu.tooltip.max_uses", FormattingUtil.formatNumbers(tool.getTotalMaxDurability(stack)))); - tooltip.add(Component.translatable("tool.gtceu.general_uses.tooltip", + tooltip.add(Component.translatable("tool.gtceu.tooltip.general_uses", FormattingUtil.formatNumbers(damageRemaining))); } // attack info if (toolStats.isSuitableForAttacking(stack)) { - tooltip.add(Component.translatable("tool.gtceu.attack_damage.tooltip", + tooltip.add(Component.translatable("tool.gtceu.tooltip.attack_damage", FormattingUtil.formatNumbers(2 + tool.getTotalAttackDamage(stack)))); - tooltip.add(Component.translatable("tool.gtceu.attack_speed.tooltip", + tooltip.add(Component.translatable("tool.gtceu.tooltip.attack_speed", FormattingUtil.formatNumbers(4 + tool.getTotalAttackSpeed(stack)))); } // mining info if (toolStats.isSuitableForBlockBreak(stack)) { - tooltip.add(Component.translatable("tool.gtceu.mining_speed.tooltip", + tooltip.add(Component.translatable("tool.gtceu.tooltip.mining_speed", FormattingUtil.formatNumbers(tool.getTotalToolSpeed(stack)))); int harvestLevel = tool.getTotalHarvestLevel(stack); - String harvestName = "item.gtceu.tool.harvest_level." + harvestLevel; + String harvestName = "tool.gtceu.tooltip.harvest_level_name." + harvestLevel; if (Language.getInstance().has(harvestName)) { // if there's a defined name for the harvest level, use it - tooltip.add(Component.translatable("tool.gtceu.harvest_level_extra.tooltip", harvestLevel, + tooltip.add(Component.translatable("tool.gtceu.tooltip.harvest_level_extra", harvestLevel, Component.translatable(harvestName))); } else { - tooltip.add(Component.translatable("tool.gtceu.harvest_level.tooltip", harvestLevel)); + tooltip.add(Component.translatable("tool.gtceu.tooltip.harvest_level", harvestLevel)); } } @@ -689,7 +689,7 @@ default int getTotalHarvestLevel(ItemStack stack) { if (aoeDefinition != AoESymmetrical.none()) { addedBehaviorNewLine = tooltip.add(CommonComponents.EMPTY); - tooltip.add(Component.translatable("tool.gtceu.behavior.aoe_mining", + tooltip.add(Component.translatable("item.gtceu.tool.behavior.aoe_mining", aoeDefinition.column * 2 + 1, aoeDefinition.row * 2 + 1, aoeDefinition.layer + 1)); } @@ -699,7 +699,7 @@ default int getTotalHarvestLevel(ItemStack stack) { addedBehaviorNewLine = true; tooltip.add(CommonComponents.EMPTY); } - tooltip.add(Component.translatable("tool.gtceu.behavior.relocate_mining")); + tooltip.add(Component.translatable("item.gtceu.tool.behavior.relocate_mining")); } if (!addedBehaviorNewLine && !toolStats.getBehaviors().isEmpty()) { @@ -717,10 +717,10 @@ default int getTotalHarvestLevel(ItemStack stack) { tooltip.add(CommonComponents.EMPTY); // valid tools - tooltip.add(Component.translatable("item.gtceu.tool.usable_as", + tooltip.add(Component.translatable("tool.gtceu.tooltip.usable_as", getToolClassNames(stack).stream() - .filter(s -> Language.getInstance().has("tool.gtceu.class." + s)) - .map(s -> Component.translatable("tool.gtceu.class." + s)) + .filter(s -> Language.getInstance().has("item.gtceu.tool.class." + s)) + .map(s -> Component.translatable("item.gtceu.tool.class." + s)) .collect(Component::empty, FormattingUtil::combineComponents, FormattingUtil::combineComponents))); @@ -741,16 +741,16 @@ default int getTotalHarvestLevel(ItemStack stack) { repairItems.add(TagPrefix.plate.getLocalizedName(material)); } if (!repairItems.isEmpty()) { - tooltip.add(Component.translatable("tool.gtceu.repair_material.tooltip", repairItems.stream() + tooltip.add(Component.translatable("tool.gtceu.tooltip.repair_material", repairItems.stream() .collect(Component::empty, FormattingUtil::combineComponents, FormattingUtil::combineComponents))); } } else { - tooltip.add(Component.translatable("tool.gtceu.repair_info.tooltip")); + tooltip.add(Component.translatable("tool.gtceu.tooltip.show_repair_info")); } } if (this.isElectric()) { - tooltip.add(Component.translatable("item.gtceu.tool.replace_tool_head")); + tooltip.add(Component.translatable("tool.gtceu.tooltip.replace_tool_head")); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/component/IMaterialPartItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/component/IMaterialPartItem.java index 61fe1d56dc6..b4f896d08dd 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/component/IMaterialPartItem.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/component/IMaterialPartItem.java @@ -81,9 +81,9 @@ default void appendHoverText(ItemStack stack, @org.jetbrains.annotations.Nullabl var maxDurability = getPartMaxDurability(stack); var damage = getPartDamage(stack); tooltipComponents - .add(Component.translatable("item.tool.tooltip.durability", maxDurability - damage, maxDurability)); + .add(Component.translatable("item.gtceu.turbine_rotor.tooltip.durability", maxDurability - damage, maxDurability)); tooltipComponents - .add(Component.translatable("item.tool.tooltip.primary_material", material.getLocalizedName())); + .add(Component.translatable("item.gtceu.turbine_rotor.tooltip.primary_material", material.getLocalizedName())); } @OnlyIn(Dist.CLIENT) diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/TurbineRotorBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/TurbineRotorBehaviour.java index 869bc50e2ec..a65c887a97b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/TurbineRotorBehaviour.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/TurbineRotorBehaviour.java @@ -80,8 +80,8 @@ public void appendHoverText(ItemStack stack, @org.jetbrains.annotations.Nullable List tooltipComponents, TooltipFlag isAdvanced) { IMaterialPartItem.super.appendHoverText(stack, level, tooltipComponents, isAdvanced); tooltipComponents - .add(Component.translatable("item.tool.tooltip.rotor.efficiency", getRotorEfficiency(stack))); - tooltipComponents.add(Component.translatable("item.tool.tooltip.rotor.power", getRotorPower(stack))); + .add(Component.translatable("item.gtceu.turbine_rotor.tooltip.efficiency", getRotorEfficiency(stack))); + tooltipComponents.add(Component.translatable("item.gtceu.turbine_rotor.tooltip.power", getRotorPower(stack))); } @Nullable diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/BlockRotatingBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/BlockRotatingBehavior.java index f7902035934..df33c4c90df 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/BlockRotatingBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/BlockRotatingBehavior.java @@ -80,7 +80,7 @@ public InteractionResult onItemUseFirst(ItemStack stack, UseOnContext context) { @Override public void addInformation(@NotNull ItemStack stack, @Nullable Level world, @NotNull List tooltip, @NotNull TooltipFlag flag) { - tooltip.add(Component.translatable("tool.gtceu.behavior.block_rotation")); + tooltip.add(Component.translatable("item.gtceu.tool.behavior.block_rotation")); } public static BlockHitResult retraceBlock(BlockGetter level, Player player, BlockPos pos) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/DisableShieldBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/DisableShieldBehavior.java index e4a242cf3e7..acfe15fe542 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/DisableShieldBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/DisableShieldBehavior.java @@ -34,6 +34,6 @@ public void addBehaviorNBT(@NotNull ItemStack stack, @NotNull CompoundTag tag) { @Override public void addInformation(@NotNull ItemStack stack, @Nullable Level world, @NotNull List tooltip, @NotNull TooltipFlag flag) { - tooltip.add(Component.translatable("tool.gtceu.behavior.shield_disable")); + tooltip.add(Component.translatable("item.gtceu.tool.behavior.shield_disable")); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/EntityDamageBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/EntityDamageBehavior.java index df2bd851008..0b38112fed9 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/EntityDamageBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/EntityDamageBehavior.java @@ -74,8 +74,8 @@ private float getDamageBonus(@NotNull LivingEntity target) { public void addInformation(@NotNull ItemStack stack, @Nullable Level world, @NotNull List tooltip, @NotNull TooltipFlag flag) { if (mobType != null && !mobType.isEmpty()) { - tooltip.add(Component.translatable("tool.gtceu.behavior.damage_boost", - Component.translatable("tool.gtceu.behavior.damage_boost_" + mobType))); + tooltip.add(Component.translatable("item.gtceu.tool.behavior.damage_boost", + Component.translatable("item.gtceu.tool.behavior.damage_boost_" + mobType))); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/GrassPathBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/GrassPathBehavior.java index 207aac268f6..afe621ba97e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/GrassPathBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/GrassPathBehavior.java @@ -123,6 +123,6 @@ protected BlockState getFlattened(BlockState unFlattenedState, UseOnContext cont @Override public void addInformation(@NotNull ItemStack stack, @Nullable Level Level, @NotNull List tooltip, @NotNull TooltipFlag flag) { - tooltip.add(Component.translatable("tool.gtceu.behavior.grass_path")); + tooltip.add(Component.translatable("item.gtceu.tool.behavior.grass_path")); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/HarvestCropsBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/HarvestCropsBehavior.java index 418f7c99473..7b5912f4a12 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/HarvestCropsBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/HarvestCropsBehavior.java @@ -137,6 +137,6 @@ private static void dropListOfItems(Level world, BlockPos pos, List d @Override public void addInformation(@NotNull ItemStack stack, @Nullable Level world, @NotNull List tooltip, @NotNull TooltipFlag flag) { - tooltip.add(Component.translatable("tool.gtceu.behavior.crop_harvesting")); + tooltip.add(Component.translatable("item.gtceu.tool.behavior.crop_harvesting")); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/HarvestIceBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/HarvestIceBehavior.java index a4c40b29322..02cf73c7413 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/HarvestIceBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/HarvestIceBehavior.java @@ -33,6 +33,6 @@ public void addBehaviorNBT(@NotNull ItemStack stack, @NotNull CompoundTag tag) { @Override public void addInformation(@NotNull ItemStack stack, @Nullable Level world, @NotNull List tooltip, @NotNull TooltipFlag flag) { - tooltip.add(Component.translatable("tool.gtceu.behavior.silk_ice")); + tooltip.add(Component.translatable("item.gtceu.tool.behavior.silk_ice")); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/HoeGroundBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/HoeGroundBehavior.java index 61de9c118de..40c6dba91dd 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/HoeGroundBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/HoeGroundBehavior.java @@ -128,6 +128,6 @@ protected boolean tillGround(UseOnContext context, BlockState state) { @Override public void addInformation(@NotNull ItemStack stack, @Nullable Level world, @NotNull List tooltip, @NotNull TooltipFlag flag) { - tooltip.add(Component.translatable("tool.gtceu.behavior.ground_tilling")); + tooltip.add(Component.translatable("item.gtceu.tool.behavior.ground_tilling")); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/LogStripBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/LogStripBehavior.java index 2fa8ed0f034..b0b4fef9c48 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/LogStripBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/LogStripBehavior.java @@ -114,6 +114,6 @@ protected BlockState getStripped(BlockState unscrapedState, UseOnContext context @Override public void addInformation(@NotNull ItemStack stack, @Nullable Level Level, @NotNull List tooltip, @NotNull TooltipFlag flag) { - tooltip.add(Component.translatable("tool.gtceu.behavior.strip_log")); + tooltip.add(Component.translatable("item.gtceu.tool.behavior.strip_log")); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/PlungerBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/PlungerBehavior.java index a8778680da4..154473063f9 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/PlungerBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/PlungerBehavior.java @@ -74,7 +74,7 @@ public InteractionResult onItemUseFirst(ItemStack stack, UseOnContext context) { @Override public void addInformation(@NotNull ItemStack stack, @Nullable Level world, @NotNull List tooltip, @NotNull TooltipFlag flag) { - tooltip.add(Component.translatable("tool.gtceu.behavior.plunger")); + tooltip.add(Component.translatable("item.gtceu.tool.behavior.plunger")); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/RotateRailBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/RotateRailBehavior.java index 8585bc1d8f7..db2576decf8 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/RotateRailBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/RotateRailBehavior.java @@ -44,6 +44,6 @@ public InteractionResult onItemUseFirst(ItemStack stack, UseOnContext context) { @Override public void addInformation(@NotNull ItemStack stack, @Nullable Level world, @NotNull List tooltip, @NotNull TooltipFlag flag) { - tooltip.add(Component.translatable("tool.gtceu.behavior.rail_rotation")); + tooltip.add(Component.translatable("item.gtceu.tool.behavior.rail_rotation")); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/ScrapeBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/ScrapeBehavior.java index 76a4a5dfe6e..b9002464ca6 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/ScrapeBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/ScrapeBehavior.java @@ -118,6 +118,6 @@ protected BlockState getScraped(BlockState unscrapedState, UseOnContext context) @Override public void addInformation(@NotNull ItemStack stack, @Nullable Level Level, @NotNull List tooltip, @NotNull TooltipFlag flag) { - tooltip.add(Component.translatable("tool.gtceu.behavior.scrape")); + tooltip.add(Component.translatable("item.gtceu.tool.behavior.scrape")); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/TorchPlaceBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/TorchPlaceBehavior.java index 720fd73dd26..773e0966f44 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/TorchPlaceBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/TorchPlaceBehavior.java @@ -124,6 +124,6 @@ public void addBehaviorNBT(@NotNull ItemStack stack, @NotNull CompoundTag tag) { @Override public void addInformation(@NotNull ItemStack stack, @Nullable Level Level, @NotNull List tooltip, @NotNull TooltipFlag flag) { - tooltip.add(Component.translatable("tool.gtceu.behavior.torch_place")); + tooltip.add(Component.translatable("item.gtceu.tool.behavior.torch_place")); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/TreeFellingBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/TreeFellingBehavior.java index dc3deb2518b..eb3420fa14d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/TreeFellingBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/TreeFellingBehavior.java @@ -42,7 +42,7 @@ public void addBehaviorNBT(ItemStack stack, CompoundTag tag) { @Override public void addInformation(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flag) { - tooltip.add(Component.translatable("tool.gtceu.behavior.tree_felling")); + tooltip.add(Component.translatable("item.gtceu.tool.behavior.tree_felling")); } @Override @@ -55,7 +55,7 @@ public void addInformation(ItemStack stack, @Nullable Level level, List tooltip, @NotNull TooltipFlag flag) { - tooltip.add(Component.translatable("tool.gtceu.behavior.remove_wax")); + tooltip.add(Component.translatable("item.gtceu.tool.behavior.remove_wax")); } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/top/ConfigMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/top/ConfigMixin.java index 8e0a25ac255..b4e11bda95a 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/top/ConfigMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/top/ConfigMixin.java @@ -38,7 +38,7 @@ public class ConfigMixin { for (GTToolType type : GTToolType.getTypes().values()) { for (TagKey tag : type.itemTags) { if (!tooltypeTagsSet.containsKey(tag.location())) tooltypeTagsSet.put(tag.location(), - Component.translatable("tool.gtceu.class." + type.name).getString()); + Component.translatable("item.gtceu.tool.class." + type.name).getString()); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java index 2cf1b16cf0e..3fa52bc34a3 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java @@ -60,49 +60,49 @@ private static void initDeathMessages(RegistrateLangProvider provider) { public static void generateToolClassKeys(RegistrateLangProvider provider) { // Tool Names - provider.add("tool.gtceu.class.sword", "Sword"); - provider.add("tool.gtceu.class.pickaxe", "Pickaxe"); - provider.add("tool.gtceu.class.shovel", "Shovel"); - provider.add("tool.gtceu.class.axe", "Axe"); - provider.add("tool.gtceu.class.hoe", "Hoe"); - provider.add("tool.gtceu.class.mining_hammer", "Mining Hammer"); - provider.add("tool.gtceu.class.spade", "Spade"); - provider.add("tool.gtceu.class.saw", "Saw"); - provider.add("tool.gtceu.class.hammer", "Hammer"); - provider.add("tool.gtceu.class.mallet", "Soft Mallet"); - provider.add("tool.gtceu.class.wrench", "Wrench"); - provider.add("tool.gtceu.class.file", "File"); - provider.add("tool.gtceu.class.crowbar", "Crowbar"); - provider.add("tool.gtceu.class.screwdriver", "Screwdriver"); - provider.add("tool.gtceu.class.mortar", "Mortar"); - provider.add("tool.gtceu.class.wire_cutter", "Wire Cutter"); - provider.add("tool.gtceu.class.knife", "Knife"); - provider.add("tool.gtceu.class.butchery_knife", "Butchery Knife"); - provider.add("tool.gtceu.class.scythe", "Scythe"); - provider.add("tool.gtceu.class.rolling_pin", "Rolling Pin"); - provider.add("tool.gtceu.class.plunger", "Plunger"); - provider.add("tool.gtceu.class.shears", "Shears"); - provider.add("tool.gtceu.class.drill", "Drill"); + provider.add("item.gtceu.tool.class.sword", "Sword"); + provider.add("item.gtceu.tool.class.pickaxe", "Pickaxe"); + provider.add("item.gtceu.tool.class.shovel", "Shovel"); + provider.add("item.gtceu.tool.class.axe", "Axe"); + provider.add("item.gtceu.tool.class.hoe", "Hoe"); + provider.add("item.gtceu.tool.class.mining_hammer", "Mining Hammer"); + provider.add("item.gtceu.tool.class.spade", "Spade"); + provider.add("item.gtceu.tool.class.saw", "Saw"); + provider.add("item.gtceu.tool.class.hammer", "Hammer"); + provider.add("item.gtceu.tool.class.mallet", "Soft Mallet"); + provider.add("item.gtceu.tool.class.wrench", "Wrench"); + provider.add("item.gtceu.tool.class.file", "File"); + provider.add("item.gtceu.tool.class.crowbar", "Crowbar"); + provider.add("item.gtceu.tool.class.screwdriver", "Screwdriver"); + provider.add("item.gtceu.tool.class.mortar", "Mortar"); + provider.add("item.gtceu.tool.class.wire_cutter", "Wire Cutter"); + provider.add("item.gtceu.tool.class.knife", "Knife"); + provider.add("item.gtceu.tool.class.butchery_knife", "Butchery Knife"); + provider.add("item.gtceu.tool.class.scythe", "Scythe"); + provider.add("item.gtceu.tool.class.rolling_pin", "Rolling Pin"); + provider.add("item.gtceu.tool.class.plunger", "Plunger"); + provider.add("item.gtceu.tool.class.shears", "Shears"); + provider.add("item.gtceu.tool.class.drill", "Drill"); } public static void generateBehaviorKeys(RegistrateLangProvider provider) { // Generic Tool Behaviors - provider.add("tool.gtceu.behavior.silk_ice", "§bIce Cutter: §fSilk Harvests Ice"); - provider.add("tool.gtceu.behavior.torch_place", "§eSpelunker: §fPlaces Torches on Right-Click"); - provider.add("tool.gtceu.behavior.tree_felling", "§4Lumberjack: §fTree Felling"); - provider.add("tool.gtceu.behavior.strip_log", "§5Artisan: §fStrips Logs"); - provider.add("tool.gtceu.behavior.scrape", "§bPolisher: §fRemoves Oxidation"); - provider.add("tool.gtceu.behavior.remove_wax", "§6Cleaner: §fRemoves Wax"); - provider.add("tool.gtceu.behavior.shield_disable", "§cBrute: §fDisables Shields"); - provider.add("tool.gtceu.behavior.relocate_mining", "§2Magnetic: §fRelocates Mined Blocks and Mob Drops"); - provider.add("tool.gtceu.behavior.aoe_mining", "§5Area-of-Effect: §f%sx%sx%s"); - provider.add("tool.gtceu.behavior.ground_tilling", "§eFarmer: §fTills Ground"); - provider.add("tool.gtceu.behavior.grass_path", "§eLandscaper: §fCreates Grass Paths"); - provider.add("tool.gtceu.behavior.rail_rotation", "§eRailroad Engineer: §fRotates Rails"); - provider.add("tool.gtceu.behavior.crop_harvesting", "§aHarvester: §fHarvests Crops"); - provider.add("tool.gtceu.behavior.plunger", "§9Plumber: §fDrains Fluids"); - provider.add("tool.gtceu.behavior.block_rotation", "§2Mechanic: §fRotates Blocks"); - provider.add("tool.gtceu.behavior.damage_boost", "§4Damage Boost: §fExtra damage against %s"); + provider.add("item.gtceu.tool.behavior.silk_ice", "§bIce Cutter: §fSilk Harvests Ice"); + provider.add("item.gtceu.tool.behavior.torch_place", "§eSpelunker: §fPlaces Torches on Right-Click"); + provider.add("item.gtceu.tool.behavior.tree_felling", "§4Lumberjack: §fTree Felling"); + provider.add("item.gtceu.tool.behavior.strip_log", "§5Artisan: §fStrips Logs"); + provider.add("item.gtceu.tool.behavior.scrape", "§bPolisher: §fRemoves Oxidation"); + provider.add("item.gtceu.tool.behavior.remove_wax", "§6Cleaner: §fRemoves Wax"); + provider.add("item.gtceu.tool.behavior.shield_disable", "§cBrute: §fDisables Shields"); + provider.add("item.gtceu.tool.behavior.relocate_mining", "§2Magnetic: §fRelocates Mined Blocks and Mob Drops"); + provider.add("item.gtceu.tool.behavior.aoe_mining", "§5Area-of-Effect: §f%sx%sx%s"); + provider.add("item.gtceu.tool.behavior.ground_tilling", "§eFarmer: §fTills Ground"); + provider.add("item.gtceu.tool.behavior.grass_path", "§eLandscaper: §fCreates Grass Paths"); + provider.add("item.gtceu.tool.behavior.rail_rotation", "§eRailroad Engineer: §fRotates Rails"); + provider.add("item.gtceu.tool.behavior.crop_harvesting", "§aHarvester: §fHarvests Crops"); + provider.add("item.gtceu.tool.behavior.plunger", "§9Plumber: §fDrains Fluids"); + provider.add("item.gtceu.tool.behavior.block_rotation", "§2Mechanic: §fRotates Blocks"); + provider.add("item.gtceu.tool.behavior.damage_boost", "§4Damage Boost: §fExtra damage against %s"); // AOE provider.add("item.gtceu.tool.aoe.rows", "Rows"); @@ -186,27 +186,29 @@ public static void generateTooltips(RegistrateLangProvider provider) { provider.add("item.gtceu.tool.plunger.tooltip", "§8Removes Fluids from Machines"); // Tool Stats Tooltips - provider.add("tool.gtceu.crafting_uses.tooltip", "%s §aCrafting Uses"); - provider.add("tool.gtceu.max_uses.tooltip", "%s §eTotal Durability"); - provider.add("tool.gtceu.general_uses.tooltip", "%s §bDurability"); - provider.add("tool.gtceu.attack_damage.tooltip", "%s §cAttack Damage"); - provider.add("tool.gtceu.attack_speed.tooltip", "%s §9Attack Speed"); - provider.add("tool.gtceu.mining_speed.tooltip", "%s §dMining Speed"); - provider.add("tool.gtceu.harvest_level.tooltip", "§eHarvest Level %s"); - provider.add("tool.gtceu.harvest_level_extra.tooltip", "§eHarvest Level %s §f(%s§f)"); - multiLang(provider, "item.gtceu.tool.harvest_level", + provider.add("tool.gtceu.tooltip.crafting_uses", "%s §aCrafting Uses"); + provider.add("tool.gtceu.tooltip.max_uses", "%s §eTotal Durability"); + provider.add("tool.gtceu.tooltip.general_uses", "%s §bDurability"); + provider.add("tool.gtceu.tooltip.attack_damage", "%s §cAttack Damage"); + provider.add("tool.gtceu.tooltip.attack_speed", "%s §9Attack Speed"); + provider.add("tool.gtceu.tooltip.mining_speed", "%s §dMining Speed"); + provider.add("tool.gtceu.tooltip.harvest_level", "§eHarvest Level %s"); + provider.add("tool.gtceu.tooltip.harvest_level_extra", "§eHarvest Level %s §f(%s§f)"); + multiLang(provider, "tool.gtceu.tooltip.harvest_level_name", "§8Wood", "§7Stone", "§aIron", "§bDiamond", "§dNetherite", "§9Duranium", "§cNeutronium"); - provider.add("tool.gtceu.repair_info.tooltip", "§8Hold SHIFT to show Repair Info"); - provider.add("tool.gtceu.repair_material.tooltip", "§8Repair with: §f§a%s"); - provider.add("item.gtceu.tool.replace_tool_head", "Craft with a new Tool Head to replace it"); - provider.add("item.gtceu.tool.usable_as", "§8Usable as: §f%s"); + + // Repair Info + provider.add("tool.gtceu.tooltip.show_repair_info", "§8Hold SHIFT to show Repair Info"); + provider.add("tool.gtceu.tooltip.repair_material", "§8Repair with: §f§a%s"); + provider.add("tool.gtceu.tooltip.replace_tool_head", "Craft with a new Tool Head to replace it"); + provider.add("tool.gtceu.tooltip.usable_as", "§8Usable as: §f%s"); // Rotors - provider.add("item.tool.tooltip.primary_material", "§fMaterial: §e%s"); - provider.add("item.tool.tooltip.durability", "§fDurability: §a%d / %d"); - provider.add("item.tool.tooltip.rotor.efficiency", "Turbine Efficiency: §9%d%%"); - provider.add("item.tool.tooltip.rotor.power", "Turbine Power: §9%d%%"); + provider.add("item.gtceu.turbine_rotor.tooltip.primary_material", "§fMaterial: §e%s"); + provider.add("item.gtceu.turbine_rotor.tooltip.durability", "§fDurability: §a%d / %d"); + provider.add("item.gtceu.turbine_rotor.tooltip.efficiency", "Turbine Efficiency: §9%d%%"); + provider.add("item.gtceu.turbine_rotor.tooltip.power", "Turbine Power: §9%d%%"); } public static void generateActionKeys(RegistrateLangProvider provider) { @@ -240,11 +242,11 @@ public static void generateActionKeys(RegistrateLangProvider provider) { private static void generateEnchantKeys(RegistrateLangProvider provider) { // Enchantments - provider.add("enchantment.disjunction", "Disjunction"); + provider.add("enchantment.gtceu.disjunction", "Disjunction"); provider.add("enchantment.gtceu.disjunction.description", "Applies Weakness and Slowness to Ender-related mobs."); - provider.add("enchantment.hard_hammer", "Hammering"); + provider.add("enchantment.gtceu.hard_hammer", "Hammering"); provider.add("enchantment.gtceu.hard_hammer.description", "Breaks blocks as if they were mined with a GregTech Hammer."); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/rei/GTREIPlugin.java b/src/main/java/com/gregtechceu/gtceu/integration/rei/GTREIPlugin.java index fe47a83ae50..a2c782efeb9 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/rei/GTREIPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/rei/GTREIPlugin.java @@ -90,7 +90,7 @@ public void registerDisplays(DisplayRegistry registry) { public void registerCollapsibleEntries(CollapsibleEntryRegistry registry) { for (GTToolType toolType : GTToolType.getTypes().values()) { registry.group(GTCEu.id("tool/" + toolType.name), - Component.translatable("tool.gtceu.class." + toolType.name), + Component.translatable("item.gtceu.tool.class." + toolType.name), EntryIngredients.ofItemTag(toolType.itemTags.get(0))); // EntryIngredients.ofItemStacks(GTItems.TOOL_ITEMS.column(toolType).values().stream().filter(Objects::nonNull).map(ItemProviderEntry::get).map(IGTTool::get).collect(Collectors.toSet())) } From f9e9b61c496b3587d9309334780e46de320ea9db Mon Sep 17 00:00:00 2001 From: Karthi <75553966+JuiceyBeans@users.noreply.github.com> Date: Thu, 26 Jun 2025 08:45:34 +0100 Subject: [PATCH 25/45] Armor Lang Refactor (#3274) --- .../resources/assets/gtceu/lang/en_ud.json | 38 ++++---- .../resources/assets/gtceu/lang/en_us.json | 38 ++++---- .../gtceu/api/item/armor/ArmorLogicSuite.java | 2 +- .../item/armor/AdvancedNanoMuscleSuite.java | 16 ++-- .../item/armor/AdvancedQuarkTechSuite.java | 16 ++-- .../gtceu/common/item/armor/Jetpack.java | 4 +- .../common/item/armor/NanoMuscleSuite.java | 6 +- .../common/item/armor/NightvisionGoggles.java | 4 +- .../common/item/armor/PowerlessJetpack.java | 6 +- .../common/item/armor/QuarkTechSuite.java | 6 +- .../gtceu/data/lang/ArmorLang.java | 91 +++++++++---------- 11 files changed, 112 insertions(+), 115 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 482128a26bb..1adb875e103 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -12,27 +12,27 @@ "armor.gtceu.hud.status.disabled": "ℲℲOɔ§", "armor.gtceu.hud.status.enabled": "NOɐ§", "armor.gtceu.jetpack.emergency_hover_mode": "¡pǝןqɐuƎ ǝpoW ɹǝʌoH ʎɔuǝbɹǝɯƎɐ§", - "armor.gtceu.jetpack.flight.disable": "pǝןqɐsıᗡ ʇɥbıןℲ :ʞɔɐdʇǝſ", - "armor.gtceu.jetpack.flight.enable": "pǝןqɐuƎ ʇɥbıןℲ :ʞɔɐdʇǝſ", - "armor.gtceu.jetpack.hover.disable": "pǝןqɐsıᗡ ǝpoW ɹǝʌoH :ʞɔɐdʇǝſ", - "armor.gtceu.jetpack.hover.enable": "pǝןqɐuƎ ǝpoW ɹǝʌoH :ʞɔɐdʇǝſ", + "armor.gtceu.jetpack.flight.disabled": "pǝןqɐsıᗡ ʇɥbıןℲ :ʞɔɐdʇǝſ", + "armor.gtceu.jetpack.flight.enabled": "pǝןqɐuƎ ʇɥbıןℲ :ʞɔɐdʇǝſ", + "armor.gtceu.jetpack.hover.disabled": "pǝןqɐsıᗡ ǝpoW ɹǝʌoH :ʞɔɐdʇǝſ", + "armor.gtceu.jetpack.hover.enabled": "pǝןqɐuƎ ǝpoW ɹǝʌoH :ʞɔɐdʇǝſ", "armor.gtceu.message.nightvision.disabled": "ɟɟOɔ§ :uoısıΛʇɥbıN", "armor.gtceu.message.nightvision.enabled": "uOɐ§ :uoısıΛʇɥbıN", "armor.gtceu.message.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoN", - "armor.gtceu.nms.boosted_jump.disabled": "pǝןqɐsıᗡ ʇsooᗺ dɯnſɔ§ :ǝʇınS ™ǝןɔsnWouɐN ", - "armor.gtceu.nms.boosted_jump.enabled": "pǝןqɐuƎ ʇsooᗺ dɯnſɐ§ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nms.charge.disable": "pǝןqɐsıᗡ buıbɹɐɥƆɔ§ :ǝʇınS ™ǝןɔsnWouɐN ", - "armor.gtceu.nms.charge.enabled": "pǝןqɐuƎ buıbɹɐɥƆɐ§ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nms.charge.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nms.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıNɔ§ :ǝʇınS ™ǝןɔsnWouɐN ", - "armor.gtceu.nms.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıNɐ§ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nms.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.qts.charge.disable": "pǝןqɐsıᗡ buıbɹɐɥƆɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "armor.gtceu.qts.charge.enabled": "pǝןqɐuƎ buıbɹɐɥƆɐ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "armor.gtceu.qts.charge.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "armor.gtceu.qts.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "armor.gtceu.qts.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıNɐ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "armor.gtceu.qts.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.nanomusclesuite.boosted_jump.disabled": "pǝןqɐsıᗡ ʇsooᗺ dɯnſɔ§ :ǝʇınS ™ǝןɔsnWouɐN ", + "armor.gtceu.nanomusclesuite.boosted_jump.enabled": "pǝןqɐuƎ ʇsooᗺ dɯnſɐ§ :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.nanomusclesuite.charge.disable": "pǝןqɐsıᗡ buıbɹɐɥƆɔ§ :ǝʇınS ™ǝןɔsnWouɐN ", + "armor.gtceu.nanomusclesuite.charge.enabled": "pǝןqɐuƎ buıbɹɐɥƆɐ§ :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.nanomusclesuite.charge.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.nanomusclesuite.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıNɔ§ :ǝʇınS ™ǝןɔsnWouɐN ", + "armor.gtceu.nanomusclesuite.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıNɐ§ :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.nanomusclesuite.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.quarktechsuite.charge.disable": "pǝןqɐsıᗡ buıbɹɐɥƆɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.quarktechsuite.charge.enabled": "pǝןqɐuƎ buıbɹɐɥƆɐ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.quarktechsuite.charge.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.quarktechsuite.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.quarktechsuite.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıNɐ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.quarktechsuite.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", "armor.gtceu.tooltip.autoeat": "ʎɹoʇuǝʌuI ɯoɹɟ pooℲ buıs∩ ʎq ɹɐᗺ pooℲ sǝɥsıuǝןdǝᴚ", "armor.gtceu.tooltip.breath": "ɹɐᗺ ɥʇɐǝɹᗺ ɹǝʇɐʍɹǝpu∩ sǝɥsıuǝןdǝᴚ", "armor.gtceu.tooltip.burning": "buıuɹnᗺ sǝıɟıןןnN", @@ -4589,7 +4589,7 @@ "item.gtceu.zpm_voltage_coil.tooltip": "ןıoƆ ɹǝdnS", "item.int_circuit.configuration": "%d :uoıʇɐɹnbıɟuoƆ", "item.invalid.name": "ɯǝʇı pıןɐʌuI", - "item.liquid_fuel_jetpack.tooltip": "ʇsnɹɥ⟘ ɹoɟ sןǝnℲ ɹoʇɐɹǝuǝ⅁ uoıʇsnqɯoƆ sǝs∩", + "item.liquid_fuel_jetpack.tooltip": "ʇsnɹɥ⟘ ɹoɟ sןǝnℲ ɹoʇɐɹǝuǝ⅁ uoıʇsnqɯoƆ sǝs∩ㄥ§", "item.machine_configuration.mode": "%s ɹ§:ǝpoW uoıʇɐɹnbıɟuoƆɐ§", "item.plugin.proxy.tooltips.1": ")uǝǝɹɔs ǝɥʇ uı ǝpoɯ ʎxoɹd oʇ ʇsnظpɐ ǝsɐǝןԀ(", "item.plugin.tooltips.1": "˙ʎʇıןɐuoıʇɔunɟ ǝɹoɯ ɹoɟ uǝǝɹɔs ǝɥʇ oʇ pǝppɐ ǝq uɐɔ suıbnןԀ", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 301200e8670..4f9de2d09e2 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -12,27 +12,27 @@ "armor.gtceu.hud.status.disabled": "§cOFF", "armor.gtceu.hud.status.enabled": "§aON", "armor.gtceu.jetpack.emergency_hover_mode": "§aEmergency Hover Mode Enabled!", - "armor.gtceu.jetpack.flight.disable": "Jetpack: Flight Disabled", - "armor.gtceu.jetpack.flight.enable": "Jetpack: Flight Enabled", - "armor.gtceu.jetpack.hover.disable": "Jetpack: Hover Mode Disabled", - "armor.gtceu.jetpack.hover.enable": "Jetpack: Hover Mode Enabled", + "armor.gtceu.jetpack.flight.disabled": "Jetpack: Flight Disabled", + "armor.gtceu.jetpack.flight.enabled": "Jetpack: Flight Enabled", + "armor.gtceu.jetpack.hover.disabled": "Jetpack: Hover Mode Disabled", + "armor.gtceu.jetpack.hover.enabled": "Jetpack: Hover Mode Enabled", "armor.gtceu.message.nightvision.disabled": "NightVision: §cOff", "armor.gtceu.message.nightvision.enabled": "NightVision: §aOn", "armor.gtceu.message.nightvision.error": "Not enough power!", - "armor.gtceu.nms.boosted_jump.disabled": " NanoMuscle™ Suite: §cJump Boost Disabled", - "armor.gtceu.nms.boosted_jump.enabled": "NanoMuscle™ Suite: §aJump Boost Enabled", - "armor.gtceu.nms.charge.disable": " NanoMuscle™ Suite: §cCharging Disabled", - "armor.gtceu.nms.charge.enabled": "NanoMuscle™ Suite: §aCharging Enabled", - "armor.gtceu.nms.charge.error": "NanoMuscle™ Suite: §cNot enough power for charging!", - "armor.gtceu.nms.nightvision.disabled": " NanoMuscle™ Suite: §cNightVision Disabled", - "armor.gtceu.nms.nightvision.enabled": "NanoMuscle™ Suite: §aNightVision Enabled", - "armor.gtceu.nms.nightvision.error": "NanoMuscle™ Suite: §cNot enough power!", - "armor.gtceu.qts.charge.disable": "QuarkTech™ Suite: §cCharging Disabled", - "armor.gtceu.qts.charge.enabled": "QuarkTech™ Suite: §aCharging Enabled", - "armor.gtceu.qts.charge.error": "QuarkTech™ Suite: §cNot enough power for charging!", - "armor.gtceu.qts.nightvision.disabled": "QuarkTech™ Suite: §cNightVision Disabled", - "armor.gtceu.qts.nightvision.enabled": "QuarkTech™ Suite: §aNightVision Enabled", - "armor.gtceu.qts.nightvision.error": "QuarkTech™ Suite: §cNot enough power!", + "armor.gtceu.nanomusclesuite.boosted_jump.disabled": " NanoMuscle™ Suite: §cJump Boost Disabled", + "armor.gtceu.nanomusclesuite.boosted_jump.enabled": "NanoMuscle™ Suite: §aJump Boost Enabled", + "armor.gtceu.nanomusclesuite.charge.disable": " NanoMuscle™ Suite: §cCharging Disabled", + "armor.gtceu.nanomusclesuite.charge.enabled": "NanoMuscle™ Suite: §aCharging Enabled", + "armor.gtceu.nanomusclesuite.charge.error": "NanoMuscle™ Suite: §cNot enough power for charging!", + "armor.gtceu.nanomusclesuite.nightvision.disabled": " NanoMuscle™ Suite: §cNightVision Disabled", + "armor.gtceu.nanomusclesuite.nightvision.enabled": "NanoMuscle™ Suite: §aNightVision Enabled", + "armor.gtceu.nanomusclesuite.nightvision.error": "NanoMuscle™ Suite: §cNot enough power!", + "armor.gtceu.quarktechsuite.charge.disable": "QuarkTech™ Suite: §cCharging Disabled", + "armor.gtceu.quarktechsuite.charge.enabled": "QuarkTech™ Suite: §aCharging Enabled", + "armor.gtceu.quarktechsuite.charge.error": "QuarkTech™ Suite: §cNot enough power for charging!", + "armor.gtceu.quarktechsuite.nightvision.disabled": "QuarkTech™ Suite: §cNightVision Disabled", + "armor.gtceu.quarktechsuite.nightvision.enabled": "QuarkTech™ Suite: §aNightVision Enabled", + "armor.gtceu.quarktechsuite.nightvision.error": "QuarkTech™ Suite: §cNot enough power!", "armor.gtceu.tooltip.autoeat": "Replenishes Food Bar by Using Food from Inventory", "armor.gtceu.tooltip.breath": "Replenishes Underwater Breath Bar", "armor.gtceu.tooltip.burning": "Nullifies Burning", @@ -4589,7 +4589,7 @@ "item.gtceu.zpm_voltage_coil.tooltip": "Super Coil", "item.int_circuit.configuration": "Configuration: %d", "item.invalid.name": "Invalid item", - "item.liquid_fuel_jetpack.tooltip": "Uses Combustion Generator Fuels for Thrust", + "item.liquid_fuel_jetpack.tooltip": "§7Uses Combustion Generator Fuels for Thrust", "item.machine_configuration.mode": "§aConfiguration Mode:§r %s", "item.plugin.proxy.tooltips.1": "(Please adjust to proxy mode in the screen)", "item.plugin.tooltips.1": "Plugins can be added to the screen for more functionality.", diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/armor/ArmorLogicSuite.java b/src/main/java/com/gregtechceu/gtceu/api/item/armor/ArmorLogicSuite.java index 060d8f064ad..13a6e003cc3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/armor/ArmorLogicSuite.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/armor/ArmorLogicSuite.java @@ -124,7 +124,7 @@ protected static void addCapacityHUD(ItemStack stack, ArmorUtils.ModularHUD hud) if (cont.getCharge() == 0) return; float energyMultiplier = cont.getCharge() * 100.0F / cont.getMaxCharge(); hud.newString( - Component.translatable("armor.gtceu.hud.energy_lvl", String.format("%.1f", energyMultiplier) + "%")); + Component.translatable("armor.gtceu.hud.energy_level", String.format("%.1f", energyMultiplier) + "%")); } @OnlyIn(Dist.CLIENT) diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedNanoMuscleSuite.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedNanoMuscleSuite.java index 705bef72a95..b1bdc11a20c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedNanoMuscleSuite.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedNanoMuscleSuite.java @@ -66,19 +66,19 @@ public void onArmorTick(Level world, Player player, @NotNull ItemStack item) { if (toggleTimer == 0) { if (KeyBind.JETPACK_ENABLE.isKeyDown(player)) { jetpackEnabled = !jetpackEnabled; - messageKey = "armor.gtceu.jetpack.flight." + (jetpackEnabled ? "enable" : "disable"); + messageKey = "armor.gtceu.jetpack.flight." + (jetpackEnabled ? "enabled" : "disabled"); data.putBoolean("enabled", jetpackEnabled); } else if (KeyBind.ARMOR_HOVER.isKeyDown(player)) { hoverMode = !hoverMode; - messageKey = "armor.gtceu.jetpack.hover." + (hoverMode ? "enable" : "disable"); + messageKey = "armor.gtceu.jetpack.hover." + (hoverMode ? "enabled" : "disabled"); data.putBoolean("hover", hoverMode); } else if (KeyBind.ARMOR_CHARGING.isKeyDown(player)) { canShare = !canShare; if (canShare && cont.getCharge() == 0) { // Only allow for charging to be enabled if charge is nonzero - messageKey = "armor.gtceu.nms.charge.error"; + messageKey = "armor.gtceu.nano_muscle_suite.charge.error"; canShare = false; } else { - messageKey = "armor.gtceu.nms.charge." + (canShare ? "enable" : "disable"); + messageKey = "armor.gtceu.nano_muscle_suite.charge." + (canShare ? "enabled" : "disabled"); } data.putBoolean("canShare", canShare); } @@ -155,7 +155,7 @@ public void addInfo(ItemStack itemStack, List lines) { state = canShare ? Component.translatable("armor.gtceu.hud.status.enabled") : Component.translatable("armor.gtceu.hud.status.disabled"); lines.add(Component.translatable("armor.gtceu.energy_share.tooltip", state)); - lines.add(Component.translatable("armor.gtceu.energy_share.tooltip.guide")); + lines.add(Component.translatable("armor.gtceu.energy_share.tooltip.info")); boolean hover = data.contains("hover") && data.getBoolean("hover"); state = hover ? Component.translatable("armor.gtceu.hud.status.enabled") : @@ -180,9 +180,9 @@ public InteractionResultHolder onRightClick(Level world, @NotNull Pla if (canShare && cont.getCharge() == 0) { player.sendSystemMessage(Component.translatable("armor.gtceu.energy_share.error")); } else if (canShare) { - player.sendSystemMessage(Component.translatable("armor.gtceu.energy_share.enable")); + player.sendSystemMessage(Component.translatable("armor.gtceu.energy_share.enabledd")); } else { - player.sendSystemMessage(Component.translatable("armor.gtceu.energy_share.disable")); + player.sendSystemMessage(Component.translatable("armor.gtceu.energy_share.disabledd")); } } @@ -213,7 +213,7 @@ public void drawHUD(ItemStack item, GuiGraphics guiGraphics) { if (data.contains("canShare")) { String status = data.getBoolean("canShare") ? "armor.gtceu.hud.status.enabled" : "armor.gtceu.hud.status.disabled"; - this.HUD.newString(Component.translatable("mataarmor.hud.supply_mode", Component.translatable(status))); + this.HUD.newString(Component.translatable("armor.gtceu.hud.supply_mode", Component.translatable(status))); } if (data.contains("hover")) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedQuarkTechSuite.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedQuarkTechSuite.java index 02a363e140c..101ca1cc2ad 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedQuarkTechSuite.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedQuarkTechSuite.java @@ -66,19 +66,19 @@ public void onArmorTick(Level world, Player player, ItemStack item) { if (toggleTimer == 0) { if (KeyBind.JETPACK_ENABLE.isKeyDown(player)) { jetpackEnabled = !jetpackEnabled; - messageKey = "armor.gtceu.jetpack.flight." + (jetpackEnabled ? "enable" : "disable"); + messageKey = "armor.gtceu.jetpack.flight." + (jetpackEnabled ? "enabled" : "disabled"); data.putBoolean("enabled", jetpackEnabled); } else if (KeyBind.ARMOR_HOVER.isKeyDown(player)) { hoverMode = !hoverMode; - messageKey = "armor.gtceu.jetpack.hover." + (hoverMode ? "enable" : "disable"); + messageKey = "armor.gtceu.jetpack.hover." + (hoverMode ? "enabled" : "disabled"); data.putBoolean("hover", hoverMode); } else if (KeyBind.ARMOR_CHARGING.isKeyDown(player)) { canShare = !canShare; if (canShare && cont.getCharge() == 0) { // Only allow for charging to be enabled if charge is nonzero - messageKey = "armor.gtceu.qts.charge.error"; + messageKey = "armor.gtceu.quark_tech_suite.charge.error"; canShare = false; } else { - messageKey = "armor.gtceu.qts.charge." + (canShare ? "enable" : "disable"); + messageKey = "armor.gtceu.quark_tech_suite.charge." + (canShare ? "enabled" : "disabled"); } data.putBoolean("canShare", canShare); } @@ -161,7 +161,7 @@ public void addInfo(ItemStack itemStack, List lines) { state = canShare ? Component.translatable("armor.gtceu.hud.status.enabled") : Component.translatable("armor.gtceu.hud.status.disabled"); lines.add(Component.translatable("armor.gtceu.energy_share.tooltip", state)); - lines.add(Component.translatable("armor.gtceu.energy_share.tooltip.guide")); + lines.add(Component.translatable("armor.gtceu.energy_share.tooltip.info")); boolean hover = data.contains("hover") && data.getBoolean("hover"); state = hover ? Component.translatable("armor.gtceu.hud.status.enabled") : @@ -185,9 +185,9 @@ public InteractionResultHolder onRightClick(Level world, Player playe if (canShare && cont.getCharge() == 0) { player.sendSystemMessage(Component.translatable("armor.gtceu.energy_share.error")); } else if (canShare) { - player.sendSystemMessage(Component.translatable("armor.gtceu.energy_share.enable")); + player.sendSystemMessage(Component.translatable("armor.gtceu.energy_share.enabledd")); } else { - player.sendSystemMessage(Component.translatable("armor.gtceu.energy_share.disable")); + player.sendSystemMessage(Component.translatable("armor.gtceu.energy_share.disabledd")); } } @@ -218,7 +218,7 @@ public void drawHUD(ItemStack item, GuiGraphics guiGraphics) { if (data.contains("canShare")) { String status = data.getBoolean("canShare") ? "armor.gtceu.hud.status.enabled" : "armor.gtceu.hud.status.disabled"; - this.HUD.newString(Component.translatable("mataarmor.hud.supply_mode", Component.translatable(status))); + this.HUD.newString(Component.translatable("armor.gtceu.hud.supply_mode", Component.translatable(status))); } if (data.contains("hover")) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/Jetpack.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/Jetpack.java index a849d311fde..b62212d6e8e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/Jetpack.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/Jetpack.java @@ -63,11 +63,11 @@ public void onArmorTick(Level world, Player player, @NotNull ItemStack item) { if (toggleTimer == 0) { if (KeyBind.JETPACK_ENABLE.isKeyDown(player)) { jetpackEnabled = !jetpackEnabled; - messageKey = "armor.gtceu.jetpack.flight." + (jetpackEnabled ? "enable" : "disable"); + messageKey = "armor.gtceu.jetpack.flight." + (jetpackEnabled ? "enabled" : "disabled"); data.putBoolean("enabled", jetpackEnabled); } else if (KeyBind.ARMOR_HOVER.isKeyDown(player)) { hoverMode = !hoverMode; - messageKey = "armor.gtceu.jetpack.hover." + (hoverMode ? "enable" : "disable"); + messageKey = "armor.gtceu.jetpack.hover." + (hoverMode ? "enabled" : "disabled"); data.putBoolean("hover", hoverMode); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/NanoMuscleSuite.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/NanoMuscleSuite.java index 97be0cdbc00..4031ab43787 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/NanoMuscleSuite.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/NanoMuscleSuite.java @@ -61,10 +61,10 @@ public void onArmorTick(Level world, Player player, ItemStack itemStack) { toggleTimer = 5; if (item.getCharge() < ArmorUtils.MIN_NIGHTVISION_CHARGE) { nightVision = false; - player.displayClientMessage(Component.translatable("armor.gtceu.nms.nightvision.error"), true); + player.displayClientMessage(Component.translatable("armor.gtceu.nano_muscle_suite.nightvision.error"), true); } else { player.displayClientMessage(Component - .translatable("armor.gtceu.nms.nightvision." + (nightVision ? "enabled" : "disabled")), + .translatable("armor.gtceu.nano_muscle_suite.nightvision." + (nightVision ? "enabled" : "disabled")), true); } } @@ -96,7 +96,7 @@ public static void disableNightVision(@NotNull Level world, Player player, boole if (!world.isClientSide) { player.removeEffect(MobEffects.NIGHT_VISION); if (sendMsg) - player.displayClientMessage(Component.translatable("armor.gtceu.nms.nightvision.disabled"), true); + player.displayClientMessage(Component.translatable("armor.gtceu.nano_muscle_suite.nightvision.disabled"), true); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/NightvisionGoggles.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/NightvisionGoggles.java index ad9556640c4..53aa47c36be 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/NightvisionGoggles.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/NightvisionGoggles.java @@ -46,10 +46,10 @@ public void onArmorTick(Level world, @NotNull Player player, @NotNull ItemStack toggleTimer = 5; if (item.getCharge() < ArmorUtils.MIN_NIGHTVISION_CHARGE) { nightVision = false; - player.displayClientMessage(Component.translatable("armor.gtceu.nms.nightvision.error"), true); + player.displayClientMessage(Component.translatable("armor.gtceu.nano_muscle_suite.nightvision.error"), true); } else { player.displayClientMessage(Component - .translatable("armor.gtceu.nms.nightvision." + (nightVision ? "enabled" : "disabled")), + .translatable("armor.gtceu.nano_muscle_suite.nightvision." + (nightVision ? "enabled" : "disabled")), true); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/PowerlessJetpack.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/PowerlessJetpack.java index a640a39163d..a22a4e7cb9d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/PowerlessJetpack.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/PowerlessJetpack.java @@ -79,11 +79,11 @@ public void onArmorTick(Level world, Player player, @NotNull ItemStack stack) { if (toggleTimer == 0) { if (KeyBind.JETPACK_ENABLE.isKeyDown(player)) { jetpackEnabled = !jetpackEnabled; - messageKey = "armor.gtceu.jetpack.flight." + (jetpackEnabled ? "enable" : "disable"); + messageKey = "armor.gtceu.jetpack.flight." + (jetpackEnabled ? "enabled" : "disabled"); data.putBoolean("enabled", jetpackEnabled); } else if (KeyBind.ARMOR_HOVER.isKeyDown(player)) { hoverMode = !hoverMode; - messageKey = "armor.gtceu.jetpack.hover." + (hoverMode ? "enable" : "disable"); + messageKey = "armor.gtceu.jetpack.hover." + (hoverMode ? "enabled" : "disabled"); data.putBoolean("hover", hoverMode); } @@ -131,7 +131,7 @@ public void drawHUD(@NotNull ItemStack item, GuiGraphics guiGraphics) { if (tank.getFluidInTank(0).getAmount() == 0) return; String formated = String.format("%.1f", (tank.getFluidInTank(0).getAmount() * 100.0F / tank.getTankCapacity(0))); - this.HUD.newString(Component.translatable("armor.gtceu.hud.fuel_lvl", formated + "%")); + this.HUD.newString(Component.translatable("armor.gtceu.hud.fuel_level", formated + "%")); CompoundTag data = item.getTag(); if (data != null) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/QuarkTechSuite.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/QuarkTechSuite.java index fc9d9920a0c..9ab6af00dc6 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/QuarkTechSuite.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/QuarkTechSuite.java @@ -96,10 +96,10 @@ public void onArmorTick(Level world, Player player, ItemStack itemStack) { toggleTimer = 5; if (item.getCharge() < ArmorUtils.MIN_NIGHTVISION_CHARGE) { nightVision = false; - player.displayClientMessage(Component.translatable("armor.gtceu.nms.nightvision.error"), true); + player.displayClientMessage(Component.translatable("armor.gtceu.nano_muscle_suite.nightvision.error"), true); } else { player.displayClientMessage(Component - .translatable("armor.gtceu.nms.nightvision." + (nightVision ? "enabled" : "disabled")), + .translatable("armor.gtceu.nano_muscle_suite.nightvision." + (nightVision ? "enabled" : "disabled")), true); } } @@ -165,7 +165,7 @@ public void onArmorTick(Level world, Player player, ItemStack itemStack) { boostedJump = !boostedJump; boostedJumpTimer = JUMPING_TIMER; player.displayClientMessage(Component - .translatable("armor.gtceu.nms.boosted_jump." + (boostedJump ? "enabled" : "disabled")), true); + .translatable("armor.gtceu.nano_muscle_suite.boosted_jump." + (boostedJump ? "enabled" : "disabled")), true); } if (boostedJump) { if (!world.isClientSide) { diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java index deb11c9ef51..fc5d37c8c6c 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java @@ -2,80 +2,77 @@ import com.tterrag.registrate.providers.RegistrateLangProvider; -import static com.gregtechceu.gtceu.data.lang.LangUtil.*; - public class ArmorLang { public static void init(RegistrateLangProvider provider) { - generateArmorKeys(provider); + generateArmorMessageKeys(provider); generateTooltipKeys(provider); generateHudKeys(provider); } - private static void generateArmorKeys(RegistrateLangProvider provider) { + private static void generateArmorMessageKeys(RegistrateLangProvider provider) { // NanoMuscle Suit - provider.add("armor.gtceu.nms.nightvision.enabled", "NanoMuscle™ Suite: §aNightVision Enabled"); - provider.add("armor.gtceu.nms.nightvision.disabled", " NanoMuscle™ Suite: §cNightVision Disabled"); - provider.add("armor.gtceu.nms.boosted_jump.enabled", "NanoMuscle™ Suite: §aJump Boost Enabled"); - provider.add("armor.gtceu.nms.boosted_jump.disabled", " NanoMuscle™ Suite: §cJump Boost Disabled"); - provider.add("armor.gtceu.nms.nightvision.error", "NanoMuscle™ Suite: §cNot enough power!"); - provider.add("armor.gtceu.nms.charge.enabled", "NanoMuscle™ Suite: §aCharging Enabled"); - provider.add("armor.gtceu.nms.charge.disable", " NanoMuscle™ Suite: §cCharging Disabled"); - provider.add("armor.gtceu.nms.charge.error", "NanoMuscle™ Suite: §cNot enough power for charging!"); + provider.add("armor.gtceu.nano_muscle_suite.nightvision.enabled", "NanoMuscle™ Suite: §aNightVision Enabled"); + provider.add("armor.gtceu.nano_muscle_suite.nightvision.disabled", " NanoMuscle™ Suite: §cNightVision Disabled"); + provider.add("armor.gtceu.nano_muscle_suite.boosted_jump.enabled", "NanoMuscle™ Suite: §aJump Boost Enabled"); + provider.add("armor.gtceu.nano_muscle_suite.boosted_jump.disabled", " NanoMuscle™ Suite: §cJump Boost Disabled"); + provider.add("armor.gtceu.nano_muscle_suite.nightvision.error", "NanoMuscle™ Suite: §cNot enough power!"); + provider.add("armor.gtceu.nano_muscle_suite.charge.enabled", "NanoMuscle™ Suite: §aCharging Enabled"); + provider.add("armor.gtceu.nano_muscle_suite.charge.disabled", " NanoMuscle™ Suite: §cCharging Disabled"); + provider.add("armor.gtceu.nano_muscle_suite.charge.error", "NanoMuscle™ Suite: §cNot enough power for charging!"); // Quantum Suit - provider.add("armor.gtceu.qts.nightvision.enabled", "QuarkTech™ Suite: §aNightVision Enabled"); - provider.add("armor.gtceu.qts.nightvision.disabled", "QuarkTech™ Suite: §cNightVision Disabled"); - provider.add("armor.gtceu.qts.nightvision.error", "QuarkTech™ Suite: §cNot enough power!"); - provider.add("armor.gtceu.qts.charge.enabled", "QuarkTech™ Suite: §aCharging Enabled"); - provider.add("armor.gtceu.qts.charge.disable", "QuarkTech™ Suite: §cCharging Disabled"); - provider.add("armor.gtceu.qts.charge.error", "QuarkTech™ Suite: §cNot enough power for charging!"); + provider.add("armor.gtceu.quark_tech_suite.nightvision.enabled", "QuarkTech™ Suite: §aNightVision Enabled"); + provider.add("armor.gtceu.quark_tech_suite.nightvision.disabled", "QuarkTech™ Suite: §cNightVision Disabled"); + provider.add("armor.gtceu.quark_tech_suite.nightvision.error", "QuarkTech™ Suite: §cNot enough power!"); + provider.add("armor.gtceu.quark_tech_suite.charge.enabled", "QuarkTech™ Suite: §aCharging Enabled"); + provider.add("armor.gtceu.quark_tech_suite.charge.disabled", "QuarkTech™ Suite: §cCharging Disabled"); + provider.add("armor.gtceu.quark_tech_suite.charge.error", "QuarkTech™ Suite: §cNot enough power for charging!"); // Jetpacks - provider.add("armor.gtceu.jetpack.flight.enable", "Jetpack: Flight Enabled"); - provider.add("armor.gtceu.jetpack.flight.disable", "Jetpack: Flight Disabled"); - provider.add("armor.gtceu.jetpack.hover.enable", "Jetpack: Hover Mode Enabled"); - provider.add("armor.gtceu.jetpack.hover.disable", "Jetpack: Hover Mode Disabled"); + provider.add("armor.gtceu.jetpack.flight.enabled", "Jetpack: §aFlight Enabled"); + provider.add("armor.gtceu.jetpack.flight.disabled", "Jetpack: Flight Disabled"); + provider.add("armor.gtceu.jetpack.hover.enabled", "Jetpack: §aHover Mode Enabled"); + provider.add("armor.gtceu.jetpack.hover.disabled", "Jetpack: Hover Mode Disabled"); provider.add("armor.gtceu.jetpack.emergency_hover_mode", "§aEmergency Hover Mode Enabled!"); - // Night Vision - provider.add("armor.gtceu.message.nightvision.enabled", "NightVision: §aOn"); - provider.add("armor.gtceu.message.nightvision.disabled", "NightVision: §cOff"); - provider.add("armor.gtceu.message.nightvision.error", "Not enough power!"); + // Night Vision Goggles + provider.add("armor.gtceu.message.nightvision.enabled", "§7NightVision: §aOn"); + provider.add("armor.gtceu.message.nightvision.disabled", "§7NightVision: §cOff"); + provider.add("armor.gtceu.message.nightvision.error", "§cNot enough power!"); } private static void generateTooltipKeys(RegistrateLangProvider provider) { - provider.add("item.liquid_fuel_jetpack.tooltip", "Uses Combustion Generator Fuels for Thrust"); + provider.add("item.gtceu.liquid_fuel_jetpack.tooltip", "§7Uses Combustion Generator Fuels for Thrust"); //move this to item lang? // Armor Abilities - provider.add("armor.gtceu.tooltip.stepassist", "Provides Step-Assist"); - provider.add("armor.gtceu.tooltip.speed", "Increases Running Speed"); - provider.add("armor.gtceu.tooltip.jump", "Increases Jump Height and Distance"); - provider.add("armor.gtceu.tooltip.falldamage", "Nullifies Fall Damage"); - provider.add("armor.gtceu.tooltip.potions", "Nullifies Harmful Effects"); - provider.add("armor.gtceu.tooltip.burning", "Nullifies Burning"); - provider.add("armor.gtceu.tooltip.freezing", "Prevents Freezing"); - provider.add("armor.gtceu.tooltip.breath", "Replenishes Underwater Breath Bar"); - provider.add("armor.gtceu.tooltip.autoeat", "Replenishes Food Bar by Using Food from Inventory"); + provider.add("armor.gtceu.tooltip.stepassist", "§7Provides Step-Assist"); + provider.add("armor.gtceu.tooltip.speed", "§7Increases Running Speed"); + provider.add("armor.gtceu.tooltip.jump", "§7Increases Jump Height and Distance"); + provider.add("armor.gtceu.tooltip.falldamage", "§7Nullifies Fall Damage"); + provider.add("armor.gtceu.tooltip.potions", "§7Nullifies Harmful Effects"); + provider.add("armor.gtceu.tooltip.burning", "§7Nullifies Burning"); + provider.add("armor.gtceu.tooltip.freezing", "§7Prevents Freezing"); + provider.add("armor.gtceu.tooltip.breath", "§7Replenishes Underwater Breath Bar"); + provider.add("armor.gtceu.tooltip.autoeat", "§7Replenishes Food Bar by Using Food from Inventory"); // Energy Tooltips (iaddinfo) - provider.add("armor.gtceu.energy_share.error", "Energy Supply: §cNot enough power for gadgets charging!"); - provider.add("armor.gtceu.energy_share.enable", "§aEnergy Supply: Gadgets charging enabled"); - provider.add("armor.gtceu.energy_share.disable", "Energy Supply: Gadgets charging disabled"); - provider.add("armor.gtceu.energy_share.tooltip", "Supply mode: %s"); - provider.add("armor.gtceu.energy_share.tooltip.guide", - "To change mode shift-right click when holding item"); + provider.add("armor.gtceu.energy_share.error", "§cNot Enough Power for Charging Gadgets!"); + provider.add("armor.gtceu.energy_share.enabled", "§aGadget Charging Enabled"); + provider.add("armor.gtceu.energy_share.disabled", "§cGadget Charging Disabled"); + provider.add("armor.gtceu.energy_share.tooltip", "Supply Mode: %s"); + provider.add("armor.gtceu.energy_share.tooltip.info", "To change mode, SHIT + R-CLICK when holding item"); } private static void generateHudKeys(RegistrateLangProvider provider) { // HUD Information - provider.add("armor.gtceu.hud.status.enabled", "§aON"); + provider.add("armor.gtceu.hud.status.enabled", "§aON"); //change this to generic tooltip? provider.add("armor.gtceu.hud.status.disabled", "§cOFF"); - provider.add("armor.gtceu.hud.energy_lvl", "Energy Level: %s"); - provider.add("armor.gtceu.hud.engine_enabled", "§aEngine Enabled: %s"); - provider.add("armor.gtceu.hud.fuel_lvl", "Fuel Level: %s"); + provider.add("armor.gtceu.hud.energy_level", "Energy Level: %s"); + provider.add("armor.gtceu.hud.engine_enabled", "Engine: %s"); + provider.add("armor.gtceu.hud.fuel_level", "Fuel Level: %s"); provider.add("armor.gtceu.hud.hover_mode", "Hover Mode: %s"); - provider.add("mataarmor.hud.supply_mode", "Supply Mode: %s"); + provider.add("armor.gtceu.hud.supply_mode", "Supply Mode: %s"); provider.add("armor.gtceu.hud.gravi_engine", "GraviEngine: %s"); } } From f8d944bedf14d4c22dd491f6cd01c7f8de70348c Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Thu, 26 Jun 2025 01:48:47 -0600 Subject: [PATCH 26/45] armor lang datagen --- .../resources/assets/gtceu/lang/en_ud.json | 76 +++++++++---------- .../resources/assets/gtceu/lang/en_us.json | 76 +++++++++---------- 2 files changed, 76 insertions(+), 76 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 1adb875e103..6d8303aa6b5 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -1,47 +1,48 @@ { - "armor.gtceu.energy_share.disable": "pǝןqɐsıp buıbɹɐɥɔ sʇǝbpɐ⅁ :ʎןddnS ʎbɹǝuƎ", - "armor.gtceu.energy_share.enable": "pǝןqɐuǝ buıbɹɐɥɔ sʇǝbpɐ⅁ :ʎןddnS ʎbɹǝuƎɐ§", - "armor.gtceu.energy_share.error": "¡buıbɹɐɥɔ sʇǝbpɐb ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ʎןddnS ʎbɹǝuƎ", - "armor.gtceu.energy_share.tooltip": "%s :ǝpoɯ ʎןddnS", - "armor.gtceu.energy_share.tooltip.guide": "ɯǝʇı buıpןoɥ uǝɥʍ ʞɔıןɔ ʇɥbıɹ-ʇɟıɥs ǝpoɯ ǝbuɐɥɔ o⟘", - "armor.gtceu.hud.energy_lvl": "%s :ןǝʌǝꞀ ʎbɹǝuƎ", - "armor.gtceu.hud.engine_enabled": "%s :pǝןqɐuƎ ǝuıbuƎɐ§", - "armor.gtceu.hud.fuel_lvl": "%s :ןǝʌǝꞀ ןǝnℲ", + "armor.gtceu.energy_share.disabled": "pǝןqɐsıᗡ buıbɹɐɥƆ ʇǝbpɐ⅁ɔ§", + "armor.gtceu.energy_share.enabled": "pǝןqɐuƎ buıbɹɐɥƆ ʇǝbpɐ⅁ɐ§", + "armor.gtceu.energy_share.error": "¡sʇǝbpɐ⅁ buıbɹɐɥƆ ɹoɟ ɹǝʍoԀ ɥbnouƎ ʇoNɔ§", + "armor.gtceu.energy_share.tooltip": "%s :ǝpoW ʎןddnS", + "armor.gtceu.energy_share.tooltip.info": "ɯǝʇı buıpןoɥ uǝɥʍ ʞƆIꞀƆ-ᴚ + ⟘IHS 'ǝpoɯ ǝbuɐɥɔ o⟘", + "armor.gtceu.hud.energy_level": "%s :ןǝʌǝꞀ ʎbɹǝuƎ", + "armor.gtceu.hud.engine_enabled": "%s :ǝuıbuƎ", + "armor.gtceu.hud.fuel_level": "%s :ןǝʌǝꞀ ןǝnℲ", "armor.gtceu.hud.gravi_engine": "%s :ǝuıbuƎıʌɐɹ⅁", "armor.gtceu.hud.hover_mode": "%s :ǝpoW ɹǝʌoH", "armor.gtceu.hud.status.disabled": "ℲℲOɔ§", "armor.gtceu.hud.status.enabled": "NOɐ§", + "armor.gtceu.hud.supply_mode": "%s :ǝpoW ʎןddnS", "armor.gtceu.jetpack.emergency_hover_mode": "¡pǝןqɐuƎ ǝpoW ɹǝʌoH ʎɔuǝbɹǝɯƎɐ§", "armor.gtceu.jetpack.flight.disabled": "pǝןqɐsıᗡ ʇɥbıןℲ :ʞɔɐdʇǝſ", - "armor.gtceu.jetpack.flight.enabled": "pǝןqɐuƎ ʇɥbıןℲ :ʞɔɐdʇǝſ", + "armor.gtceu.jetpack.flight.enabled": "pǝןqɐuƎ ʇɥbıןℲɐ§ :ʞɔɐdʇǝſ", "armor.gtceu.jetpack.hover.disabled": "pǝןqɐsıᗡ ǝpoW ɹǝʌoH :ʞɔɐdʇǝſ", - "armor.gtceu.jetpack.hover.enabled": "pǝןqɐuƎ ǝpoW ɹǝʌoH :ʞɔɐdʇǝſ", - "armor.gtceu.message.nightvision.disabled": "ɟɟOɔ§ :uoısıΛʇɥbıN", - "armor.gtceu.message.nightvision.enabled": "uOɐ§ :uoısıΛʇɥbıN", - "armor.gtceu.message.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoN", - "armor.gtceu.nanomusclesuite.boosted_jump.disabled": "pǝןqɐsıᗡ ʇsooᗺ dɯnſɔ§ :ǝʇınS ™ǝןɔsnWouɐN ", - "armor.gtceu.nanomusclesuite.boosted_jump.enabled": "pǝןqɐuƎ ʇsooᗺ dɯnſɐ§ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nanomusclesuite.charge.disable": "pǝןqɐsıᗡ buıbɹɐɥƆɔ§ :ǝʇınS ™ǝןɔsnWouɐN ", - "armor.gtceu.nanomusclesuite.charge.enabled": "pǝןqɐuƎ buıbɹɐɥƆɐ§ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nanomusclesuite.charge.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nanomusclesuite.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıNɔ§ :ǝʇınS ™ǝןɔsnWouɐN ", - "armor.gtceu.nanomusclesuite.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıNɐ§ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.nanomusclesuite.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", - "armor.gtceu.quarktechsuite.charge.disable": "pǝןqɐsıᗡ buıbɹɐɥƆɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "armor.gtceu.quarktechsuite.charge.enabled": "pǝןqɐuƎ buıbɹɐɥƆɐ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "armor.gtceu.quarktechsuite.charge.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "armor.gtceu.quarktechsuite.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "armor.gtceu.quarktechsuite.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıNɐ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "armor.gtceu.quarktechsuite.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "armor.gtceu.tooltip.autoeat": "ʎɹoʇuǝʌuI ɯoɹɟ pooℲ buıs∩ ʎq ɹɐᗺ pooℲ sǝɥsıuǝןdǝᴚ", - "armor.gtceu.tooltip.breath": "ɹɐᗺ ɥʇɐǝɹᗺ ɹǝʇɐʍɹǝpu∩ sǝɥsıuǝןdǝᴚ", - "armor.gtceu.tooltip.burning": "buıuɹnᗺ sǝıɟıןןnN", - "armor.gtceu.tooltip.falldamage": "ǝbɐɯɐᗡ ןןɐℲ sǝıɟıןןnN", - "armor.gtceu.tooltip.freezing": "buızǝǝɹℲ sʇuǝʌǝɹԀ", - "armor.gtceu.tooltip.jump": "ǝɔuɐʇsıᗡ puɐ ʇɥbıǝH dɯnſ sǝsɐǝɹɔuI", - "armor.gtceu.tooltip.potions": "sʇɔǝɟɟƎ ןnɟɯɹɐH sǝıɟıןןnN", - "armor.gtceu.tooltip.speed": "pǝǝdS buıuunᴚ sǝsɐǝɹɔuI", - "armor.gtceu.tooltip.stepassist": "ʇsıssⱯ-dǝʇS sǝpıʌoɹԀ", + "armor.gtceu.jetpack.hover.enabled": "pǝןqɐuƎ ǝpoW ɹǝʌoHɐ§ :ʞɔɐdʇǝſ", + "armor.gtceu.message.nightvision.disabled": "ɟɟOɔ§ :uoısıΛʇɥbıNㄥ§", + "armor.gtceu.message.nightvision.enabled": "uOɐ§ :uoısıΛʇɥbıNㄥ§", + "armor.gtceu.message.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§", + "armor.gtceu.nano_muscle_suite.boosted_jump.disabled": "pǝןqɐsıᗡ ʇsooᗺ dɯnſɔ§ :ǝʇınS ™ǝןɔsnWouɐN ", + "armor.gtceu.nano_muscle_suite.boosted_jump.enabled": "pǝןqɐuƎ ʇsooᗺ dɯnſɐ§ :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.nano_muscle_suite.charge.disabled": "pǝןqɐsıᗡ buıbɹɐɥƆɔ§ :ǝʇınS ™ǝןɔsnWouɐN ", + "armor.gtceu.nano_muscle_suite.charge.enabled": "pǝןqɐuƎ buıbɹɐɥƆɐ§ :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.nano_muscle_suite.charge.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.nano_muscle_suite.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıNɔ§ :ǝʇınS ™ǝןɔsnWouɐN ", + "armor.gtceu.nano_muscle_suite.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıNɐ§ :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.nano_muscle_suite.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", + "armor.gtceu.quark_tech_suite.charge.disabled": "pǝןqɐsıᗡ buıbɹɐɥƆɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.quark_tech_suite.charge.enabled": "pǝןqɐuƎ buıbɹɐɥƆɐ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.quark_tech_suite.charge.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.quark_tech_suite.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.quark_tech_suite.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıNɐ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.quark_tech_suite.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "armor.gtceu.tooltip.autoeat": "ʎɹoʇuǝʌuI ɯoɹɟ pooℲ buıs∩ ʎq ɹɐᗺ pooℲ sǝɥsıuǝןdǝᴚㄥ§", + "armor.gtceu.tooltip.breath": "ɹɐᗺ ɥʇɐǝɹᗺ ɹǝʇɐʍɹǝpu∩ sǝɥsıuǝןdǝᴚㄥ§", + "armor.gtceu.tooltip.burning": "buıuɹnᗺ sǝıɟıןןnNㄥ§", + "armor.gtceu.tooltip.falldamage": "ǝbɐɯɐᗡ ןןɐℲ sǝıɟıןןnNㄥ§", + "armor.gtceu.tooltip.freezing": "buızǝǝɹℲ sʇuǝʌǝɹԀㄥ§", + "armor.gtceu.tooltip.jump": "ǝɔuɐʇsıᗡ puɐ ʇɥbıǝH dɯnſ sǝsɐǝɹɔuIㄥ§", + "armor.gtceu.tooltip.potions": "sʇɔǝɟɟƎ ןnɟɯɹɐH sǝıɟıןןnNㄥ§", + "armor.gtceu.tooltip.speed": "pǝǝdS buıuunᴚ sǝsɐǝɹɔuIㄥ§", + "armor.gtceu.tooltip.stepassist": "ʇsıssⱯ-dǝʇS sǝpıʌoɹԀㄥ§", "behavior.data_item.assemblyline.data": "%sɐ§ -", "behavior.data_item.assemblyline.title": ":ɐʇɐᗡ uoıʇɔnɹʇsuoƆ ǝuıꞀ ʎןqɯǝssⱯu§", "behavior.item_magnet.disabled": "pǝןqɐsıᗡ pןǝıℲ ɔıʇǝubɐWɔ§", @@ -3952,6 +3953,7 @@ "item.gtceu.lime_dye_spray_can": ")ǝɯıꞀ( uɐƆ ʎɐɹdS", "item.gtceu.lime_glass_lens": ")ǝɯıꞀ( suǝꞀ ssɐן⅁", "item.gtceu.liquid_fuel_jetpack": "ʞɔɐdʇǝſ ןǝnℲ pınbıꞀ", + "item.gtceu.liquid_fuel_jetpack.tooltip": "ʇsnɹɥ⟘ ɹoɟ sןǝnℲ ɹoʇɐɹǝuǝ⅁ uoıʇsnqɯoƆ sǝs∩ㄥ§", "item.gtceu.long_treated_wood_rod": "ʞɔıʇS pooM pǝʇɐǝɹ⟘ buoꞀ", "item.gtceu.long_wood_rod": "ʞɔıʇS pooM buoꞀ", "item.gtceu.lpic_chip": "dıɥƆ ƆIԀꞀ", @@ -4589,7 +4591,6 @@ "item.gtceu.zpm_voltage_coil.tooltip": "ןıoƆ ɹǝdnS", "item.int_circuit.configuration": "%d :uoıʇɐɹnbıɟuoƆ", "item.invalid.name": "ɯǝʇı pıןɐʌuI", - "item.liquid_fuel_jetpack.tooltip": "ʇsnɹɥ⟘ ɹoɟ sןǝnℲ ɹoʇɐɹǝuǝ⅁ uoıʇsnqɯoƆ sǝs∩ㄥ§", "item.machine_configuration.mode": "%s ɹ§:ǝpoW uoıʇɐɹnbıɟuoƆɐ§", "item.plugin.proxy.tooltips.1": ")uǝǝɹɔs ǝɥʇ uı ǝpoɯ ʎxoɹd oʇ ʇsnظpɐ ǝsɐǝןԀ(", "item.plugin.tooltips.1": "˙ʎʇıןɐuoıʇɔunɟ ǝɹoɯ ɹoɟ uǝǝɹɔs ǝɥʇ oʇ pǝppɐ ǝq uɐɔ suıbnןԀ", @@ -4619,7 +4620,6 @@ "ldlib.gui.editor.register.widget.container.gtm_item_slot": "ʇoןS ɯǝʇI W⟘⅁", "ldlib.gui.editor.register.widget.container.gtm_phantom_fluid_slot": "ʇoןS pınןℲ ɯoʇuɐɥԀ W⟘⅁", "ldlib.gui.editor.register.widget.container.gtm_phantom_item_slot": "ʇoןS ɯǝʇI ɯoʇuɐɥԀ W⟘⅁", - "mataarmor.hud.supply_mode": "%s :ǝpoW ʎןddnS", "material.gtceu.acetic_acid": "pıɔⱯ ɔıʇǝɔⱯ", "material.gtceu.acetic_anhydride": "ǝpıɹpʎɥuⱯ ɔıʇǝɔⱯ", "material.gtceu.acetone": "ǝuoʇǝɔⱯ", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 4f9de2d09e2..242a8104832 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -1,47 +1,48 @@ { - "armor.gtceu.energy_share.disable": "Energy Supply: Gadgets charging disabled", - "armor.gtceu.energy_share.enable": "§aEnergy Supply: Gadgets charging enabled", - "armor.gtceu.energy_share.error": "Energy Supply: §cNot enough power for gadgets charging!", - "armor.gtceu.energy_share.tooltip": "Supply mode: %s", - "armor.gtceu.energy_share.tooltip.guide": "To change mode shift-right click when holding item", - "armor.gtceu.hud.energy_lvl": "Energy Level: %s", - "armor.gtceu.hud.engine_enabled": "§aEngine Enabled: %s", - "armor.gtceu.hud.fuel_lvl": "Fuel Level: %s", + "armor.gtceu.energy_share.disabled": "§cGadget Charging Disabled", + "armor.gtceu.energy_share.enabled": "§aGadget Charging Enabled", + "armor.gtceu.energy_share.error": "§cNot Enough Power for Charging Gadgets!", + "armor.gtceu.energy_share.tooltip": "Supply Mode: %s", + "armor.gtceu.energy_share.tooltip.info": "To change mode, SHIT + R-CLICK when holding item", + "armor.gtceu.hud.energy_level": "Energy Level: %s", + "armor.gtceu.hud.engine_enabled": "Engine: %s", + "armor.gtceu.hud.fuel_level": "Fuel Level: %s", "armor.gtceu.hud.gravi_engine": "GraviEngine: %s", "armor.gtceu.hud.hover_mode": "Hover Mode: %s", "armor.gtceu.hud.status.disabled": "§cOFF", "armor.gtceu.hud.status.enabled": "§aON", + "armor.gtceu.hud.supply_mode": "Supply Mode: %s", "armor.gtceu.jetpack.emergency_hover_mode": "§aEmergency Hover Mode Enabled!", "armor.gtceu.jetpack.flight.disabled": "Jetpack: Flight Disabled", - "armor.gtceu.jetpack.flight.enabled": "Jetpack: Flight Enabled", + "armor.gtceu.jetpack.flight.enabled": "Jetpack: §aFlight Enabled", "armor.gtceu.jetpack.hover.disabled": "Jetpack: Hover Mode Disabled", - "armor.gtceu.jetpack.hover.enabled": "Jetpack: Hover Mode Enabled", - "armor.gtceu.message.nightvision.disabled": "NightVision: §cOff", - "armor.gtceu.message.nightvision.enabled": "NightVision: §aOn", - "armor.gtceu.message.nightvision.error": "Not enough power!", - "armor.gtceu.nanomusclesuite.boosted_jump.disabled": " NanoMuscle™ Suite: §cJump Boost Disabled", - "armor.gtceu.nanomusclesuite.boosted_jump.enabled": "NanoMuscle™ Suite: §aJump Boost Enabled", - "armor.gtceu.nanomusclesuite.charge.disable": " NanoMuscle™ Suite: §cCharging Disabled", - "armor.gtceu.nanomusclesuite.charge.enabled": "NanoMuscle™ Suite: §aCharging Enabled", - "armor.gtceu.nanomusclesuite.charge.error": "NanoMuscle™ Suite: §cNot enough power for charging!", - "armor.gtceu.nanomusclesuite.nightvision.disabled": " NanoMuscle™ Suite: §cNightVision Disabled", - "armor.gtceu.nanomusclesuite.nightvision.enabled": "NanoMuscle™ Suite: §aNightVision Enabled", - "armor.gtceu.nanomusclesuite.nightvision.error": "NanoMuscle™ Suite: §cNot enough power!", - "armor.gtceu.quarktechsuite.charge.disable": "QuarkTech™ Suite: §cCharging Disabled", - "armor.gtceu.quarktechsuite.charge.enabled": "QuarkTech™ Suite: §aCharging Enabled", - "armor.gtceu.quarktechsuite.charge.error": "QuarkTech™ Suite: §cNot enough power for charging!", - "armor.gtceu.quarktechsuite.nightvision.disabled": "QuarkTech™ Suite: §cNightVision Disabled", - "armor.gtceu.quarktechsuite.nightvision.enabled": "QuarkTech™ Suite: §aNightVision Enabled", - "armor.gtceu.quarktechsuite.nightvision.error": "QuarkTech™ Suite: §cNot enough power!", - "armor.gtceu.tooltip.autoeat": "Replenishes Food Bar by Using Food from Inventory", - "armor.gtceu.tooltip.breath": "Replenishes Underwater Breath Bar", - "armor.gtceu.tooltip.burning": "Nullifies Burning", - "armor.gtceu.tooltip.falldamage": "Nullifies Fall Damage", - "armor.gtceu.tooltip.freezing": "Prevents Freezing", - "armor.gtceu.tooltip.jump": "Increases Jump Height and Distance", - "armor.gtceu.tooltip.potions": "Nullifies Harmful Effects", - "armor.gtceu.tooltip.speed": "Increases Running Speed", - "armor.gtceu.tooltip.stepassist": "Provides Step-Assist", + "armor.gtceu.jetpack.hover.enabled": "Jetpack: §aHover Mode Enabled", + "armor.gtceu.message.nightvision.disabled": "§7NightVision: §cOff", + "armor.gtceu.message.nightvision.enabled": "§7NightVision: §aOn", + "armor.gtceu.message.nightvision.error": "§cNot enough power!", + "armor.gtceu.nano_muscle_suite.boosted_jump.disabled": " NanoMuscle™ Suite: §cJump Boost Disabled", + "armor.gtceu.nano_muscle_suite.boosted_jump.enabled": "NanoMuscle™ Suite: §aJump Boost Enabled", + "armor.gtceu.nano_muscle_suite.charge.disabled": " NanoMuscle™ Suite: §cCharging Disabled", + "armor.gtceu.nano_muscle_suite.charge.enabled": "NanoMuscle™ Suite: §aCharging Enabled", + "armor.gtceu.nano_muscle_suite.charge.error": "NanoMuscle™ Suite: §cNot enough power for charging!", + "armor.gtceu.nano_muscle_suite.nightvision.disabled": " NanoMuscle™ Suite: §cNightVision Disabled", + "armor.gtceu.nano_muscle_suite.nightvision.enabled": "NanoMuscle™ Suite: §aNightVision Enabled", + "armor.gtceu.nano_muscle_suite.nightvision.error": "NanoMuscle™ Suite: §cNot enough power!", + "armor.gtceu.quark_tech_suite.charge.disabled": "QuarkTech™ Suite: §cCharging Disabled", + "armor.gtceu.quark_tech_suite.charge.enabled": "QuarkTech™ Suite: §aCharging Enabled", + "armor.gtceu.quark_tech_suite.charge.error": "QuarkTech™ Suite: §cNot enough power for charging!", + "armor.gtceu.quark_tech_suite.nightvision.disabled": "QuarkTech™ Suite: §cNightVision Disabled", + "armor.gtceu.quark_tech_suite.nightvision.enabled": "QuarkTech™ Suite: §aNightVision Enabled", + "armor.gtceu.quark_tech_suite.nightvision.error": "QuarkTech™ Suite: §cNot enough power!", + "armor.gtceu.tooltip.autoeat": "§7Replenishes Food Bar by Using Food from Inventory", + "armor.gtceu.tooltip.breath": "§7Replenishes Underwater Breath Bar", + "armor.gtceu.tooltip.burning": "§7Nullifies Burning", + "armor.gtceu.tooltip.falldamage": "§7Nullifies Fall Damage", + "armor.gtceu.tooltip.freezing": "§7Prevents Freezing", + "armor.gtceu.tooltip.jump": "§7Increases Jump Height and Distance", + "armor.gtceu.tooltip.potions": "§7Nullifies Harmful Effects", + "armor.gtceu.tooltip.speed": "§7Increases Running Speed", + "armor.gtceu.tooltip.stepassist": "§7Provides Step-Assist", "behavior.data_item.assemblyline.data": "- §a%s", "behavior.data_item.assemblyline.title": "§nAssembly Line Construction Data:", "behavior.item_magnet.disabled": "§cMagnetic Field Disabled", @@ -3952,6 +3953,7 @@ "item.gtceu.lime_dye_spray_can": "Spray Can (Lime)", "item.gtceu.lime_glass_lens": "Glass Lens (Lime)", "item.gtceu.liquid_fuel_jetpack": "Liquid Fuel Jetpack", + "item.gtceu.liquid_fuel_jetpack.tooltip": "§7Uses Combustion Generator Fuels for Thrust", "item.gtceu.long_treated_wood_rod": "Long Treated Wood Stick", "item.gtceu.long_wood_rod": "Long Wood Stick", "item.gtceu.lpic_chip": "LPIC Chip", @@ -4589,7 +4591,6 @@ "item.gtceu.zpm_voltage_coil.tooltip": "Super Coil", "item.int_circuit.configuration": "Configuration: %d", "item.invalid.name": "Invalid item", - "item.liquid_fuel_jetpack.tooltip": "§7Uses Combustion Generator Fuels for Thrust", "item.machine_configuration.mode": "§aConfiguration Mode:§r %s", "item.plugin.proxy.tooltips.1": "(Please adjust to proxy mode in the screen)", "item.plugin.tooltips.1": "Plugins can be added to the screen for more functionality.", @@ -4619,7 +4620,6 @@ "ldlib.gui.editor.register.widget.container.gtm_item_slot": "GTM Item Slot", "ldlib.gui.editor.register.widget.container.gtm_phantom_fluid_slot": "GTM Phantom Fluid Slot", "ldlib.gui.editor.register.widget.container.gtm_phantom_item_slot": "GTM Phantom Item Slot", - "mataarmor.hud.supply_mode": "Supply Mode: %s", "material.gtceu.acetic_acid": "Acetic Acid", "material.gtceu.acetic_anhydride": "Acetic Anhydride", "material.gtceu.acetone": "Acetone", From 76345d0fdf8226f439a644a96a310e3a36d675e1 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Thu, 26 Jun 2025 01:56:56 -0600 Subject: [PATCH 27/45] configuration lang, add entire path to the keys --- .../resources/assets/gtceu/lang/en_ud.json | 302 +++++++++--------- .../resources/assets/gtceu/lang/en_us.json | 302 +++++++++--------- .../gtceu/data/lang/ConfigurationLang.java | 12 +- 3 files changed, 308 insertions(+), 308 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 6d8303aa6b5..a4dfbf66b4e 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -1791,165 +1791,165 @@ "command.gtceu.worldgen.reload.success": "˙bıɟuoɔ ɯoɹɟ pǝpɐoןǝɹ ʎןןnɟssǝɔɔns uǝbpןɹoM", "command.gtceu.worldgen.reload.usage": "pɐoןǝɹ uǝbpןɹoʍ nǝɔʇb/ :ǝbɐs∩", "command.gtceu.worldgen.usage": ">pɐoןǝɹ< uǝbpןɹoʍ nǝɔʇb/ :ǝbɐs∩", - "config.gtceu.option.addLoot": "ʇooꞀppɐ", - "config.gtceu.option.ae2": "ᄅǝɐ", - "config.gtceu.option.allUniqueStoneTypes": "sǝdʎ⟘ǝuoʇSǝnbıu∩ןןɐ", - "config.gtceu.option.animationTime": "ǝɯı⟘uoıʇɐɯıuɐ", - "config.gtceu.option.armorHud": "pnHɹoɯɹɐ", - "config.gtceu.option.bedrockOreDistance": "ǝɔuɐʇsıᗡǝɹOʞɔoɹpǝq", - "config.gtceu.option.bedrockOreDropTagPrefix": "xıɟǝɹԀbɐ⟘doɹᗡǝɹOʞɔoɹpǝq", - "config.gtceu.option.borderColor": "ɹoןoƆɹǝpɹoq", - "config.gtceu.option.bronzeBoilerHeatSpeed": "pǝǝdSʇɐǝHɹǝןıoᗺǝzuoɹq", - "config.gtceu.option.bronzeBoilerMaxTemperature": "ǝɹnʇɐɹǝdɯǝ⟘xɐWɹǝןıoᗺǝzuoɹq", - "config.gtceu.option.buttonAnchor": "ɹoɥɔuⱯuoʇʇnq", - "config.gtceu.option.casingsPerCraft": "ʇɟɐɹƆɹǝԀsbuısɐɔ", - "config.gtceu.option.cleanMultiblocks": "sʞɔoןqıʇןnWuɐǝןɔ", + "config.gtceu.option.ae2.meHatchEnergyUsage": "ǝbɐs∩ʎbɹǝuƎɥɔʇɐHǝɯ", + "config.gtceu.option.ae2.updateIntervals": "sןɐʌɹǝʇuIǝʇɐpdn", + "config.gtceu.option.armorHud.hudLocation": "uoıʇɐɔoꞀpnɥ", + "config.gtceu.option.armorHud.hudOffsetX": "XʇǝsɟɟOpnɥ", + "config.gtceu.option.armorHud.hudOffsetY": "ʎʇǝsɟɟOpnɥ", "config.gtceu.option.client": "ʇuǝıןɔ", + "config.gtceu.option.client.animationTime": "ǝɯı⟘uoıʇɐɯıuɐ", + "config.gtceu.option.client.armorHud": "pnHɹoɯɹɐ", + "config.gtceu.option.client.defaultPaintingColor": "ɹoןoƆbuıʇuıɐԀʇןnɐɟǝp", + "config.gtceu.option.client.defaultUIColor": "ɹoןoƆI∩ʇןnɐɟǝp", + "config.gtceu.option.client.inWorldPreviewDuration": "uoıʇɐɹnᗡʍǝıʌǝɹԀpןɹoMuı", + "config.gtceu.option.client.machinesEmissiveTextures": "sǝɹnʇxǝ⟘ǝʌıssıɯƎsǝuıɥɔɐɯ", + "config.gtceu.option.client.renderer": "ɹǝɹǝpuǝɹ", + "config.gtceu.option.client.toolCraftingSounds": "spunoSbuıʇɟɐɹƆןooʇ", + "config.gtceu.option.client.toolUseSounds": "spunoSǝs∩ןooʇ", + "config.gtceu.option.client.useVBO": "OᗺΛǝsn", "config.gtceu.option.compat": "ʇɐdɯoɔ", - "config.gtceu.option.debug": "bnqǝp", - "config.gtceu.option.debugWorldgen": "uǝbpןɹoMbnqǝp", - "config.gtceu.option.defaultPaintingColor": "ɹoןoƆbuıʇuıɐԀʇןnɐɟǝp", - "config.gtceu.option.defaultUIColor": "ɹoןoƆI∩ʇןnɐɟǝp", + "config.gtceu.option.compat.ae2": "ᄅǝɐ", + "config.gtceu.option.compat.energy": "ʎbɹǝuǝ", + "config.gtceu.option.compat.hideFacadesInRecipeViewer": "ɹǝʍǝıΛǝdıɔǝᴚuIsǝpɐɔɐℲǝpıɥ", + "config.gtceu.option.compat.hideFilledCellsInRecipeViewer": "ɹǝʍǝıΛǝdıɔǝᴚuIsןןǝƆpǝןןıℲǝpıɥ", + "config.gtceu.option.compat.hideOreProcessingDiagrams": "sɯɐɹbɐıᗡbuıssǝɔoɹԀǝɹOǝpıɥ", + "config.gtceu.option.compat.minimap": "dɐɯıuıɯ", + "config.gtceu.option.compat.removeSmeltingForEBFMetals": "sןɐʇǝWℲᗺƎɹoℲbuıʇןǝɯSǝʌoɯǝɹ", + "config.gtceu.option.compat.showDimensionTier": "ɹǝı⟘uoısuǝɯıᗡʍoɥs", "config.gtceu.option.dev": "ʌǝp", - "config.gtceu.option.direction": "uoıʇɔǝɹıp", - "config.gtceu.option.disableManualCompression": "uoıssǝɹdɯoƆןɐnuɐWǝןqɐsıp", - "config.gtceu.option.doBedrockOres": "sǝɹOʞɔoɹpǝᗺop", - "config.gtceu.option.doSuperflatOres": "sǝɹOʇɐןɟɹǝdnSop", - "config.gtceu.option.doesExplosionDamagesTerrain": "uıɐɹɹǝ⟘sǝbɐɯɐᗡuoısoןdxƎsǝop", - "config.gtceu.option.dumpAssets": "sʇǝssⱯdɯnp", - "config.gtceu.option.dumpRecipes": "sǝdıɔǝᴚdɯnp", - "config.gtceu.option.enableCleanroom": "ɯooɹuɐǝןƆǝןqɐuǝ", - "config.gtceu.option.enableFEConverters": "sɹǝʇɹǝʌuoƆƎℲǝןqɐuǝ", - "config.gtceu.option.enableMaintenance": "ǝɔuɐuǝʇuıɐWǝןqɐuǝ", - "config.gtceu.option.enableResearch": "ɥɔɹɐǝsǝᴚǝןqɐuǝ", - "config.gtceu.option.enableTieredCasings": "sbuısɐƆpǝɹǝı⟘ǝןqɐuǝ", - "config.gtceu.option.enableWorldAccelerators": "sɹoʇɐɹǝןǝɔɔⱯpןɹoMǝןqɐuǝ", - "config.gtceu.option.enchantedTools": "sןoo⟘pǝʇuɐɥɔuǝ", - "config.gtceu.option.energy": "ʎbɹǝuǝ", - "config.gtceu.option.energyConsumption": "uoıʇdɯnsuoƆʎbɹǝuǝ", - "config.gtceu.option.energyUsageMultiplier": "ɹǝıןdıʇןnWǝbɐs∩ʎbɹǝuǝ", - "config.gtceu.option.environmentalHazardDecayRate": "ǝʇɐᴚʎɐɔǝᗡpɹɐzɐHןɐʇuǝɯuoɹıʌuǝ", - "config.gtceu.option.environmentalHazards": "spɹɐzɐHןɐʇuǝɯuoɹıʌuǝ", - "config.gtceu.option.euToFeRatio": "oıʇɐᴚǝℲo⟘nǝ", - "config.gtceu.option.feToEuRatio": "oıʇɐᴚnƎo⟘ǝɟ", - "config.gtceu.option.flintAndSteelRequireSteel": "ןǝǝʇSǝɹınbǝᴚןǝǝʇSpuⱯʇuıןɟ", - "config.gtceu.option.ftbChunksIntegration": "uoıʇɐɹbǝʇuIsʞunɥƆqʇɟ", + "config.gtceu.option.dev.debug": "bnqǝp", + "config.gtceu.option.dev.debugWorldgen": "uǝbpןɹoMbnqǝp", + "config.gtceu.option.dev.doSuperflatOres": "sǝɹOʇɐןɟɹǝdnSop", + "config.gtceu.option.dev.dumpAssets": "sʇǝssⱯdɯnp", + "config.gtceu.option.dev.dumpRecipes": "sǝdıɔǝᴚdɯnp", + "config.gtceu.option.energy.enableFEConverters": "sɹǝʇɹǝʌuoƆƎℲǝןqɐuǝ", + "config.gtceu.option.energy.euToFeRatio": "oıʇɐᴚǝℲo⟘nǝ", + "config.gtceu.option.energy.feToEuRatio": "oıʇɐᴚnƎo⟘ǝɟ", + "config.gtceu.option.energy.nativeEUToFE": "ƎℲo⟘∩Ǝǝʌıʇɐu", "config.gtceu.option.gameplay": "ʎɐןdǝɯɐb", - "config.gtceu.option.generateLowQualityGems": "sɯǝ⅁ʎʇıןɐnὉʍoꞀǝʇɐɹǝuǝb", - "config.gtceu.option.ghostCircuit": "ʇınɔɹıƆʇsoɥb", - "config.gtceu.option.gt6StylePipesCables": "sǝןqɐƆsǝdıԀǝןʎʇS9ʇb", - "config.gtceu.option.hardAdvancedIronRecipes": "sǝdıɔǝᴚuoɹIpǝɔuɐʌpⱯpɹɐɥ", - "config.gtceu.option.hardDyeRecipes": "sǝdıɔǝᴚǝʎᗡpɹɐɥ", - "config.gtceu.option.hardGlassRecipes": "sǝdıɔǝᴚssɐן⅁pɹɐɥ", - "config.gtceu.option.hardIronRecipes": "sǝdıɔǝᴚuoɹIpɹɐɥ", - "config.gtceu.option.hardMiscRecipes": "sǝdıɔǝᴚɔsıWpɹɐɥ", - "config.gtceu.option.hardMultiRecipes": "sǝdıɔǝᴚıʇןnWpɹɐɥ", - "config.gtceu.option.hardRedstoneRecipes": "sǝdıɔǝᴚǝuoʇspǝᴚpɹɐɥ", - "config.gtceu.option.hardToolArmorRecipes": "sǝdıɔǝᴚɹoɯɹⱯןoo⟘pɹɐɥ", - "config.gtceu.option.hardWoodRecipes": "sǝdıɔǝᴚpooMpɹɐɥ", - "config.gtceu.option.harderBrickRecipes": "sǝdıɔǝᴚʞɔıɹᗺɹǝpɹɐɥ", - "config.gtceu.option.harderCharcoalRecipe": "ǝdıɔǝᴚןɐoɔɹɐɥƆɹǝpɹɐɥ", - "config.gtceu.option.harderCircuitRecipes": "sǝdıɔǝᴚʇınɔɹıƆɹǝpɹɐɥ", - "config.gtceu.option.harderRods": "spoᴚɹǝpɹɐɥ", - "config.gtceu.option.harmlessActiveTransformers": "sɹǝɯɹoɟsuɐɹ⟘ǝʌıʇɔⱯssǝןɯɹɐɥ", - "config.gtceu.option.hazardsEnabled": "pǝןqɐuƎspɹɐzɐɥ", - "config.gtceu.option.hideFacadesInRecipeViewer": "ɹǝʍǝıΛǝdıɔǝᴚuIsǝpɐɔɐℲǝpıɥ", - "config.gtceu.option.hideFilledCellsInRecipeViewer": "ɹǝʍǝıΛǝdıɔǝᴚuIsןןǝƆpǝןןıℲǝpıɥ", - "config.gtceu.option.hideOreProcessingDiagrams": "sɯɐɹbɐıᗡbuıssǝɔoɹԀǝɹOǝpıɥ", - "config.gtceu.option.highTierContent": "ʇuǝʇuoƆɹǝı⟘ɥbıɥ", - "config.gtceu.option.hpLiquidBoilerBaseOutput": "ʇndʇnOǝsɐᗺɹǝןıoᗺpınbıꞀdɥ", - "config.gtceu.option.hpSolarBoilerBaseOutput": "ʇndʇnOǝsɐᗺɹǝןıoᗺɹɐןoSdɥ", - "config.gtceu.option.hpSolidBoilerBaseOutput": "ʇndʇnOǝsɐᗺɹǝןıoᗺpıןoSdɥ", - "config.gtceu.option.hudLocation": "uoıʇɐɔoꞀpnɥ", - "config.gtceu.option.hudOffsetX": "XʇǝsɟɟOpnɥ", - "config.gtceu.option.hudOffsetY": "ʎʇǝsɟɟOpnɥ", - "config.gtceu.option.inWorldPreviewDuration": "uoıʇɐɹnᗡʍǝıʌǝɹԀpןɹoMuı", - "config.gtceu.option.increaseDungeonLoot": "ʇooꞀuoǝbunᗡǝsɐǝɹɔuı", - "config.gtceu.option.infiniteBedrockOresFluids": "spınןℲsǝɹOʞɔoɹpǝᗺǝʇıuıɟuı", - "config.gtceu.option.journeyMapIntegration": "uoıʇɐɹbǝʇuIdɐWʎǝuɹnoظ", - "config.gtceu.option.largeBoilers": "sɹǝןıoᗺǝbɹɐן", - "config.gtceu.option.ldFluidPipeMinDistance": "ǝɔuɐʇsıᗡuıWǝdıԀpınןℲpן", - "config.gtceu.option.ldItemPipeMinDistance": "ǝɔuɐʇsıᗡuıWǝdıԀɯǝʇIpן", - "config.gtceu.option.liquidBoilerBaseOutput": "ʇndʇnOǝsɐᗺɹǝןıoᗺpınbıן", - "config.gtceu.option.machineSounds": "spunoSǝuıɥɔɐɯ", + "config.gtceu.option.gameplay.environmentalHazardDecayRate": "ǝʇɐᴚʎɐɔǝᗡpɹɐzɐHןɐʇuǝɯuoɹıʌuǝ", + "config.gtceu.option.gameplay.environmentalHazards": "spɹɐzɐHןɐʇuǝɯuoɹıʌuǝ", + "config.gtceu.option.gameplay.hazardsEnabled": "pǝןqɐuƎspɹɐzɐɥ", + "config.gtceu.option.gameplay.universalHazards": "spɹɐzɐHןɐsɹǝʌıun", + "config.gtceu.option.largeBoilers.bronzeBoilerHeatSpeed": "pǝǝdSʇɐǝHɹǝןıoᗺǝzuoɹq", + "config.gtceu.option.largeBoilers.bronzeBoilerMaxTemperature": "ǝɹnʇɐɹǝdɯǝ⟘xɐWɹǝןıoᗺǝzuoɹq", + "config.gtceu.option.largeBoilers.steamPerWater": "ɹǝʇɐMɹǝԀɯɐǝʇs", + "config.gtceu.option.largeBoilers.steelBoilerHeatSpeed": "pǝǝdSʇɐǝHɹǝןıoᗺןǝǝʇs", + "config.gtceu.option.largeBoilers.steelBoilerMaxTemperature": "ǝɹnʇɐɹǝdɯǝ⟘xɐWɹǝןıoᗺןǝǝʇs", + "config.gtceu.option.largeBoilers.titaniumBoilerHeatSpeed": "pǝǝdSʇɐǝHɹǝןıoᗺɯnıuɐʇıʇ", + "config.gtceu.option.largeBoilers.titaniumBoilerMaxTemperature": "ǝɹnʇɐɹǝdɯǝ⟘xɐWɹǝןıoᗺɯnıuɐʇıʇ", + "config.gtceu.option.largeBoilers.tungstensteelBoilerHeatSpeed": "pǝǝdSʇɐǝHɹǝןıoᗺןǝǝʇsuǝʇsbunʇ", + "config.gtceu.option.largeBoilers.tungstensteelBoilerMaxTemperature": "ǝɹnʇɐɹǝdɯǝ⟘xɐWɹǝןıoᗺןǝǝʇsuǝʇsbunʇ", "config.gtceu.option.machines": "sǝuıɥɔɐɯ", - "config.gtceu.option.machinesEmissiveTextures": "sǝɹnʇxǝ⟘ǝʌıssıɯƎsǝuıɥɔɐɯ", - "config.gtceu.option.meHatchEnergyUsage": "ǝbɐs∩ʎbɹǝuƎɥɔʇɐHǝɯ", - "config.gtceu.option.minerSpeed": "pǝǝdSɹǝuıɯ", - "config.gtceu.option.minimap": "dɐɯıuıɯ", - "config.gtceu.option.nanoSaber": "ɹǝqɐSouɐu", - "config.gtceu.option.nanoSaberBaseDamage": "ǝbɐɯɐᗡǝsɐᗺɹǝqɐSouɐu", - "config.gtceu.option.nanoSaberDamageBoost": "ʇsooᗺǝbɐɯɐᗡɹǝqɐSouɐu", - "config.gtceu.option.nativeEUToFE": "ƎℲo⟘∩Ǝǝʌıʇɐu", - "config.gtceu.option.nerfPaperCrafting": "buıʇɟɐɹƆɹǝdɐԀɟɹǝu", - "config.gtceu.option.nerfWoodCrafting": "buıʇɟɐɹƆpooMɟɹǝu", - "config.gtceu.option.onlyOwnerBreak": "ʞɐǝɹᗺɹǝuʍOʎןuo", - "config.gtceu.option.onlyOwnerGUI": "I∩⅁ɹǝuʍOʎןuo", - "config.gtceu.option.orderedAssemblyLineFluids": "spınןℲǝuıꞀʎןqɯǝssⱯpǝɹǝpɹo", - "config.gtceu.option.orderedAssemblyLineItems": "sɯǝʇIǝuıꞀʎןqɯǝssⱯpǝɹǝpɹo", - "config.gtceu.option.oreBlockProspectRange": "ǝbuɐᴚʇɔǝdsoɹԀʞɔoןᗺǝɹo", - "config.gtceu.option.oreGenerationChunkCacheSize": "ǝzıSǝɥɔɐƆʞunɥƆuoıʇɐɹǝuǝ⅁ǝɹo", - "config.gtceu.option.oreIconSize": "ǝzıSuoɔIǝɹo", - "config.gtceu.option.oreIndicatorChunkCacheSize": "ǝzıSǝɥɔɐƆʞunɥƆɹoʇɐɔıpuIǝɹo", - "config.gtceu.option.oreIndicators": "sɹoʇɐɔıpuIǝɹo", - "config.gtceu.option.oreNamePrefix": "xıɟǝɹԀǝɯɐNǝɹo", - "config.gtceu.option.oreScaleStop": "doʇSǝןɐɔSǝɹo", - "config.gtceu.option.oreVeinGridSize": "ǝzıSpıɹ⅁uıǝΛǝɹo", - "config.gtceu.option.oreVeinRandomOffset": "ʇǝsɟɟOɯopuɐᴚuıǝΛǝɹo", - "config.gtceu.option.oreVeins": "suıǝΛǝɹo", - "config.gtceu.option.ownerOPBypass": "ssɐdʎᗺԀOɹǝuʍo", - "config.gtceu.option.prospectorEnergyUseMultiplier": "ɹǝıןdıʇןnWǝs∩ʎbɹǝuƎɹoʇɔǝdsoɹd", - "config.gtceu.option.recipeProgressLowEnergy": "ʎbɹǝuƎʍoꞀssǝɹboɹԀǝdıɔǝɹ", + "config.gtceu.option.machines.bedrockOreDropTagPrefix": "xıɟǝɹԀbɐ⟘doɹᗡǝɹOʞɔoɹpǝq", + "config.gtceu.option.machines.cleanMultiblocks": "sʞɔoןqıʇןnWuɐǝןɔ", + "config.gtceu.option.machines.doBedrockOres": "sǝɹOʞɔoɹpǝᗺop", + "config.gtceu.option.machines.doesExplosionDamagesTerrain": "uıɐɹɹǝ⟘sǝbɐɯɐᗡuoısoןdxƎsǝop", + "config.gtceu.option.machines.enableCleanroom": "ɯooɹuɐǝןƆǝןqɐuǝ", + "config.gtceu.option.machines.enableMaintenance": "ǝɔuɐuǝʇuıɐWǝןqɐuǝ", + "config.gtceu.option.machines.enableResearch": "ɥɔɹɐǝsǝᴚǝןqɐuǝ", + "config.gtceu.option.machines.enableTieredCasings": "sbuısɐƆpǝɹǝı⟘ǝןqɐuǝ", + "config.gtceu.option.machines.enableWorldAccelerators": "sɹoʇɐɹǝןǝɔɔⱯpןɹoMǝןqɐuǝ", + "config.gtceu.option.machines.energyUsageMultiplier": "ɹǝıןdıʇןnWǝbɐs∩ʎbɹǝuǝ", + "config.gtceu.option.machines.ghostCircuit": "ʇınɔɹıƆʇsoɥb", + "config.gtceu.option.machines.gt6StylePipesCables": "sǝןqɐƆsǝdıԀǝןʎʇS9ʇb", + "config.gtceu.option.machines.harmlessActiveTransformers": "sɹǝɯɹoɟsuɐɹ⟘ǝʌıʇɔⱯssǝןɯɹɐɥ", + "config.gtceu.option.machines.highTierContent": "ʇuǝʇuoƆɹǝı⟘ɥbıɥ", + "config.gtceu.option.machines.largeBoilers": "sɹǝןıoᗺǝbɹɐן", + "config.gtceu.option.machines.ldFluidPipeMinDistance": "ǝɔuɐʇsıᗡuıWǝdıԀpınןℲpן", + "config.gtceu.option.machines.ldItemPipeMinDistance": "ǝɔuɐʇsıᗡuıWǝdıԀɯǝʇIpן", + "config.gtceu.option.machines.machineSounds": "spunoSǝuıɥɔɐɯ", + "config.gtceu.option.machines.minerSpeed": "pǝǝdSɹǝuıɯ", + "config.gtceu.option.machines.onlyOwnerBreak": "ʞɐǝɹᗺɹǝuʍOʎןuo", + "config.gtceu.option.machines.onlyOwnerGUI": "I∩⅁ɹǝuʍOʎןuo", + "config.gtceu.option.machines.orderedAssemblyLineFluids": "spınןℲǝuıꞀʎןqɯǝssⱯpǝɹǝpɹo", + "config.gtceu.option.machines.orderedAssemblyLineItems": "sɯǝʇIǝuıꞀʎןqɯǝssⱯpǝɹǝpɹo", + "config.gtceu.option.machines.ownerOPBypass": "ssɐdʎᗺԀOɹǝuʍo", + "config.gtceu.option.machines.prospectorEnergyUseMultiplier": "ɹǝıןdıʇןnWǝs∩ʎbɹǝuƎɹoʇɔǝdsoɹd", + "config.gtceu.option.machines.recipeProgressLowEnergy": "ʎbɹǝuƎʍoꞀssǝɹboɹԀǝdıɔǝɹ", + "config.gtceu.option.machines.replaceMinedBlocksWith": "ɥʇıMsʞɔoןᗺpǝuıWǝɔɐןdǝɹ", + "config.gtceu.option.machines.requireGTToolsForBlocks": "sʞɔoןᗺɹoℲsןoo⟘⟘⅁ǝɹınbǝɹ", + "config.gtceu.option.machines.shouldWeatherOrTerrainExplosion": "uoısoןdxƎuıɐɹɹǝ⟘ɹOɹǝɥʇɐǝMpןnoɥs", + "config.gtceu.option.machines.smallBoilers": "sɹǝןıoᗺןןɐɯs", + "config.gtceu.option.machines.steamMultiParallelAmount": "ʇunoɯⱯןǝןןɐɹɐԀıʇןnWɯɐǝʇs", + "config.gtceu.option.machines.steelSteamMultiblocks": "sʞɔoןqıʇןnWɯɐǝʇSןǝǝʇs", + "config.gtceu.option.machines.worldAcceleratorBlacklist": "ʇsıןʞɔɐןᗺɹoʇɐɹǝןǝɔɔⱯpןɹoʍ", + "config.gtceu.option.minimap.borderColor": "ɹoןoƆɹǝpɹoq", + "config.gtceu.option.minimap.buttonAnchor": "ɹoɥɔuⱯuoʇʇnq", + "config.gtceu.option.minimap.direction": "uoıʇɔǝɹıp", + "config.gtceu.option.minimap.oreBlockProspectRange": "ǝbuɐᴚʇɔǝdsoɹԀʞɔoןᗺǝɹo", + "config.gtceu.option.minimap.oreIconSize": "ǝzıSuoɔIǝɹo", + "config.gtceu.option.minimap.oreNamePrefix": "xıɟǝɹԀǝɯɐNǝɹo", + "config.gtceu.option.minimap.oreScaleStop": "doʇSǝןɐɔSǝɹo", + "config.gtceu.option.minimap.surfaceRockProspectRange": "ǝbuɐᴚʇɔǝdsoɹԀʞɔoᴚǝɔɐɟɹns", + "config.gtceu.option.minimap.toggle": "ǝןbboʇ", + "config.gtceu.option.minimap.xOffset": "ʇǝsɟɟOx", + "config.gtceu.option.minimap.yOffset": "ʇǝsɟɟOʎ", + "config.gtceu.option.nanoSaber.energyConsumption": "uoıʇdɯnsuoƆʎbɹǝuǝ", + "config.gtceu.option.nanoSaber.nanoSaberBaseDamage": "ǝbɐɯɐᗡǝsɐᗺɹǝqɐSouɐu", + "config.gtceu.option.nanoSaber.nanoSaberDamageBoost": "ʇsooᗺǝbɐɯɐᗡɹǝqɐSouɐu", + "config.gtceu.option.nanoSaber.zombieSpawnWithSabers": "sɹǝqɐSɥʇıMuʍɐdSǝıqɯoz", + "config.gtceu.option.oreVeins.bedrockOreDistance": "ǝɔuɐʇsıᗡǝɹOʞɔoɹpǝq", + "config.gtceu.option.oreVeins.infiniteBedrockOresFluids": "spınןℲsǝɹOʞɔoɹpǝᗺǝʇıuıɟuı", + "config.gtceu.option.oreVeins.oreGenerationChunkCacheSize": "ǝzıSǝɥɔɐƆʞunɥƆuoıʇɐɹǝuǝ⅁ǝɹo", + "config.gtceu.option.oreVeins.oreIndicatorChunkCacheSize": "ǝzıSǝɥɔɐƆʞunɥƆɹoʇɐɔıpuIǝɹo", + "config.gtceu.option.oreVeins.oreIndicators": "sɹoʇɐɔıpuIǝɹo", + "config.gtceu.option.oreVeins.oreVeinGridSize": "ǝzıSpıɹ⅁uıǝΛǝɹo", + "config.gtceu.option.oreVeins.oreVeinRandomOffset": "ʇǝsɟɟOɯopuɐᴚuıǝΛǝɹo", + "config.gtceu.option.oreVeins.removeVanillaLargeOreVeins": "suıǝΛǝɹOǝbɹɐꞀɐןןıuɐΛǝʌoɯǝɹ", + "config.gtceu.option.oreVeins.removeVanillaOreGen": "uǝ⅁ǝɹOɐןןıuɐΛǝʌoɯǝɹ", "config.gtceu.option.recipes": "sǝdıɔǝɹ", - "config.gtceu.option.removeSmeltingForEBFMetals": "sןɐʇǝWℲᗺƎɹoℲbuıʇןǝɯSǝʌoɯǝɹ", - "config.gtceu.option.removeVanillaBlockRecipes": "sǝdıɔǝᴚʞɔoןᗺɐןןıuɐΛǝʌoɯǝɹ", - "config.gtceu.option.removeVanillaLargeOreVeins": "suıǝΛǝɹOǝbɹɐꞀɐןןıuɐΛǝʌoɯǝɹ", - "config.gtceu.option.removeVanillaOreGen": "uǝ⅁ǝɹOɐןןıuɐΛǝʌoɯǝɹ", - "config.gtceu.option.removeVanillaTNTRecipe": "ǝdıɔǝᴚ⟘N⟘ɐןןıuɐΛǝʌoɯǝɹ", - "config.gtceu.option.renderFluids": "spınןℲɹǝpuǝɹ", - "config.gtceu.option.renderer": "ɹǝɹǝpuǝɹ", - "config.gtceu.option.replaceMinedBlocksWith": "ɥʇıMsʞɔoןᗺpǝuıWǝɔɐןdǝɹ", - "config.gtceu.option.requireGTToolsForBlocks": "sʞɔoןᗺɹoℲsןoo⟘⟘⅁ǝɹınbǝɹ", - "config.gtceu.option.rngDamageElectricTools": "sןoo⟘ɔıɹʇɔǝןƎǝbɐɯɐᗡbuɹ", - "config.gtceu.option.rubberTreeSpawnChance": "ǝɔuɐɥƆuʍɐdSǝǝɹ⟘ɹǝqqnɹ", - "config.gtceu.option.sandOresFall": "ןןɐℲsǝɹOpuɐs", - "config.gtceu.option.shouldWeatherOrTerrainExplosion": "uoısoןdxƎuıɐɹɹǝ⟘ɹOɹǝɥʇɐǝMpןnoɥs", - "config.gtceu.option.showDimensionTier": "ɹǝı⟘uoısuǝɯıᗡʍoɥs", - "config.gtceu.option.smallBoilers": "sɹǝןıoᗺןןɐɯs", - "config.gtceu.option.solarBoilerBaseOutput": "ʇndʇnOǝsɐᗺɹǝןıoᗺɹɐןos", - "config.gtceu.option.solidBoilerBaseOutput": "ʇndʇnOǝsɐᗺɹǝןıoᗺpıןos", - "config.gtceu.option.sprayCanChainLength": "ɥʇbuǝꞀuıɐɥƆuɐƆʎɐɹds", - "config.gtceu.option.steamMultiParallelAmount": "ʇunoɯⱯןǝןןɐɹɐԀıʇןnWɯɐǝʇs", - "config.gtceu.option.steamPerWater": "ɹǝʇɐMɹǝԀɯɐǝʇs", - "config.gtceu.option.steelBoilerHeatSpeed": "pǝǝdSʇɐǝHɹǝןıoᗺןǝǝʇs", - "config.gtceu.option.steelBoilerMaxTemperature": "ǝɹnʇɐɹǝdɯǝ⟘xɐWɹǝןıoᗺןǝǝʇs", - "config.gtceu.option.steelSteamMultiblocks": "sʞɔoןqıʇןnWɯɐǝʇSןǝǝʇs", - "config.gtceu.option.surfaceRockProspectRange": "ǝbuɐᴚʇɔǝdsoɹԀʞɔoᴚǝɔɐɟɹns", - "config.gtceu.option.titaniumBoilerHeatSpeed": "pǝǝdSʇɐǝHɹǝןıoᗺɯnıuɐʇıʇ", - "config.gtceu.option.titaniumBoilerMaxTemperature": "ǝɹnʇɐɹǝdɯǝ⟘xɐWɹǝןıoᗺɯnıuɐʇıʇ", - "config.gtceu.option.toggle": "ǝןbboʇ", - "config.gtceu.option.toolCraftingSounds": "spunoSbuıʇɟɐɹƆןooʇ", - "config.gtceu.option.toolUseSounds": "spunoSǝs∩ןooʇ", + "config.gtceu.option.recipes.casingsPerCraft": "ʇɟɐɹƆɹǝԀsbuısɐɔ", + "config.gtceu.option.recipes.disableManualCompression": "uoıssǝɹdɯoƆןɐnuɐWǝןqɐsıp", + "config.gtceu.option.recipes.enchantedTools": "sןoo⟘pǝʇuɐɥɔuǝ", + "config.gtceu.option.recipes.flintAndSteelRequireSteel": "ןǝǝʇSǝɹınbǝᴚןǝǝʇSpuⱯʇuıןɟ", + "config.gtceu.option.recipes.generateLowQualityGems": "sɯǝ⅁ʎʇıןɐnὉʍoꞀǝʇɐɹǝuǝb", + "config.gtceu.option.recipes.hardAdvancedIronRecipes": "sǝdıɔǝᴚuoɹIpǝɔuɐʌpⱯpɹɐɥ", + "config.gtceu.option.recipes.hardDyeRecipes": "sǝdıɔǝᴚǝʎᗡpɹɐɥ", + "config.gtceu.option.recipes.hardGlassRecipes": "sǝdıɔǝᴚssɐן⅁pɹɐɥ", + "config.gtceu.option.recipes.hardIronRecipes": "sǝdıɔǝᴚuoɹIpɹɐɥ", + "config.gtceu.option.recipes.hardMiscRecipes": "sǝdıɔǝᴚɔsıWpɹɐɥ", + "config.gtceu.option.recipes.hardMultiRecipes": "sǝdıɔǝᴚıʇןnWpɹɐɥ", + "config.gtceu.option.recipes.hardRedstoneRecipes": "sǝdıɔǝᴚǝuoʇspǝᴚpɹɐɥ", + "config.gtceu.option.recipes.hardToolArmorRecipes": "sǝdıɔǝᴚɹoɯɹⱯןoo⟘pɹɐɥ", + "config.gtceu.option.recipes.hardWoodRecipes": "sǝdıɔǝᴚpooMpɹɐɥ", + "config.gtceu.option.recipes.harderBrickRecipes": "sǝdıɔǝᴚʞɔıɹᗺɹǝpɹɐɥ", + "config.gtceu.option.recipes.harderCharcoalRecipe": "ǝdıɔǝᴚןɐoɔɹɐɥƆɹǝpɹɐɥ", + "config.gtceu.option.recipes.harderCircuitRecipes": "sǝdıɔǝᴚʇınɔɹıƆɹǝpɹɐɥ", + "config.gtceu.option.recipes.harderRods": "spoᴚɹǝpɹɐɥ", + "config.gtceu.option.recipes.nerfPaperCrafting": "buıʇɟɐɹƆɹǝdɐԀɟɹǝu", + "config.gtceu.option.recipes.nerfWoodCrafting": "buıʇɟɐɹƆpooMɟɹǝu", + "config.gtceu.option.recipes.removeVanillaBlockRecipes": "sǝdıɔǝᴚʞɔoןᗺɐןןıuɐΛǝʌoɯǝɹ", + "config.gtceu.option.recipes.removeVanillaTNTRecipe": "ǝdıɔǝᴚ⟘N⟘ɐןןıuɐΛǝʌoɯǝɹ", + "config.gtceu.option.renderer.renderFluids": "spınןℲɹǝpuǝɹ", + "config.gtceu.option.smallBoilers.hpLiquidBoilerBaseOutput": "ʇndʇnOǝsɐᗺɹǝןıoᗺpınbıꞀdɥ", + "config.gtceu.option.smallBoilers.hpSolarBoilerBaseOutput": "ʇndʇnOǝsɐᗺɹǝןıoᗺɹɐןoSdɥ", + "config.gtceu.option.smallBoilers.hpSolidBoilerBaseOutput": "ʇndʇnOǝsɐᗺɹǝןıoᗺpıןoSdɥ", + "config.gtceu.option.smallBoilers.liquidBoilerBaseOutput": "ʇndʇnOǝsɐᗺɹǝןıoᗺpınbıן", + "config.gtceu.option.smallBoilers.solarBoilerBaseOutput": "ʇndʇnOǝsɐᗺɹǝןıoᗺɹɐןos", + "config.gtceu.option.smallBoilers.solidBoilerBaseOutput": "ʇndʇnOǝsɐᗺɹǝןıoᗺpıןos", + "config.gtceu.option.toggle.ftbChunksIntegration": "uoıʇɐɹbǝʇuIsʞunɥƆqʇɟ", + "config.gtceu.option.toggle.journeyMapIntegration": "uoıʇɐɹbǝʇuIdɐWʎǝuɹnoظ", + "config.gtceu.option.toggle.xaerosMapIntegration": "uoıʇɐɹbǝʇuIdɐWsoɹǝɐx", "config.gtceu.option.tools": "sןooʇ", - "config.gtceu.option.treeFellingDelay": "ʎɐןǝᗡbuıןןǝℲǝǝɹʇ", - "config.gtceu.option.tungstensteelBoilerHeatSpeed": "pǝǝdSʇɐǝHɹǝןıoᗺןǝǝʇsuǝʇsbunʇ", - "config.gtceu.option.tungstensteelBoilerMaxTemperature": "ǝɹnʇɐɹǝdɯǝ⟘xɐWɹǝןıoᗺןǝǝʇsuǝʇsbunʇ", - "config.gtceu.option.universalHazards": "spɹɐzɐHןɐsɹǝʌıun", - "config.gtceu.option.updateIntervals": "sןɐʌɹǝʇuIǝʇɐpdn", - "config.gtceu.option.useVBO": "OᗺΛǝsn", - "config.gtceu.option.voltageTierAdvImpeller": "ɹǝןןǝdɯIʌpⱯɹǝı⟘ǝbɐʇןoʌ", - "config.gtceu.option.voltageTierAdvNanoSuit": "ʇınSouɐNʌpⱯɹǝı⟘ǝbɐʇןoʌ", - "config.gtceu.option.voltageTierAdvQuarkTech": "ɥɔǝ⟘ʞɹɐnὉʌpⱯɹǝı⟘ǝbɐʇןoʌ", - "config.gtceu.option.voltageTierImpeller": "ɹǝןןǝdɯIɹǝı⟘ǝbɐʇןoʌ", - "config.gtceu.option.voltageTierNanoSuit": "ʇınSouɐNɹǝı⟘ǝbɐʇןoʌ", - "config.gtceu.option.voltageTierNightVision": "uoısıΛʇɥbıNɹǝı⟘ǝbɐʇןoʌ", - "config.gtceu.option.voltageTierQuarkTech": "ɥɔǝ⟘ʞɹɐnὉɹǝı⟘ǝbɐʇןoʌ", - "config.gtceu.option.worldAcceleratorBlacklist": "ʇsıןʞɔɐןᗺɹoʇɐɹǝןǝɔɔⱯpןɹoʍ", + "config.gtceu.option.tools.nanoSaber": "ɹǝqɐSouɐu", + "config.gtceu.option.tools.rngDamageElectricTools": "sןoo⟘ɔıɹʇɔǝןƎǝbɐɯɐᗡbuɹ", + "config.gtceu.option.tools.sprayCanChainLength": "ɥʇbuǝꞀuıɐɥƆuɐƆʎɐɹds", + "config.gtceu.option.tools.treeFellingDelay": "ʎɐןǝᗡbuıןןǝℲǝǝɹʇ", + "config.gtceu.option.tools.voltageTierAdvImpeller": "ɹǝןןǝdɯIʌpⱯɹǝı⟘ǝbɐʇןoʌ", + "config.gtceu.option.tools.voltageTierAdvNanoSuit": "ʇınSouɐNʌpⱯɹǝı⟘ǝbɐʇןoʌ", + "config.gtceu.option.tools.voltageTierAdvQuarkTech": "ɥɔǝ⟘ʞɹɐnὉʌpⱯɹǝı⟘ǝbɐʇןoʌ", + "config.gtceu.option.tools.voltageTierImpeller": "ɹǝןןǝdɯIɹǝı⟘ǝbɐʇןoʌ", + "config.gtceu.option.tools.voltageTierNanoSuit": "ʇınSouɐNɹǝı⟘ǝbɐʇןoʌ", + "config.gtceu.option.tools.voltageTierNightVision": "uoısıΛʇɥbıNɹǝı⟘ǝbɐʇןoʌ", + "config.gtceu.option.tools.voltageTierQuarkTech": "ɥɔǝ⟘ʞɹɐnὉɹǝı⟘ǝbɐʇןoʌ", "config.gtceu.option.worldgen": "uǝbpןɹoʍ", - "config.gtceu.option.xOffset": "ʇǝsɟɟOx", - "config.gtceu.option.xaerosMapIntegration": "uoıʇɐɹbǝʇuIdɐWsoɹǝɐx", - "config.gtceu.option.yOffset": "ʇǝsɟɟOʎ", - "config.gtceu.option.zombieSpawnWithSabers": "sɹǝqɐSɥʇıMuʍɐdSǝıqɯoz", + "config.gtceu.option.worldgen.addLoot": "ʇooꞀppɐ", + "config.gtceu.option.worldgen.allUniqueStoneTypes": "sǝdʎ⟘ǝuoʇSǝnbıu∩ןןɐ", + "config.gtceu.option.worldgen.increaseDungeonLoot": "ʇooꞀuoǝbunᗡǝsɐǝɹɔuı", + "config.gtceu.option.worldgen.oreVeins": "suıǝΛǝɹo", + "config.gtceu.option.worldgen.rubberTreeSpawnChance": "ǝɔuɐɥƆuʍɐdSǝǝɹ⟘ɹǝqqnɹ", + "config.gtceu.option.worldgen.sandOresFall": "ןןɐℲsǝɹOpuɐs", "config.jade.plugin_gtceu.auto_output_info": "oɟuI ʇndʇnO oʇnⱯ ]nƎƆ⟘⅁[", "config.jade.plugin_gtceu.cable_info": "oɟuI ǝןqɐƆ ]nƎƆ⟘⅁[", "config.jade.plugin_gtceu.controllable_provider": "ǝןqɐןןoɹʇuoƆ ]nƎƆ⟘⅁[", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 242a8104832..b0551dbda9a 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -1791,165 +1791,165 @@ "command.gtceu.worldgen.reload.success": "Worldgen successfully reloaded from config.", "command.gtceu.worldgen.reload.usage": "Usage: /gtceu worldgen reload", "command.gtceu.worldgen.usage": "Usage: /gtceu worldgen ", - "config.gtceu.option.addLoot": "addLoot", - "config.gtceu.option.ae2": "ae2", - "config.gtceu.option.allUniqueStoneTypes": "allUniqueStoneTypes", - "config.gtceu.option.animationTime": "animationTime", - "config.gtceu.option.armorHud": "armorHud", - "config.gtceu.option.bedrockOreDistance": "bedrockOreDistance", - "config.gtceu.option.bedrockOreDropTagPrefix": "bedrockOreDropTagPrefix", - "config.gtceu.option.borderColor": "borderColor", - "config.gtceu.option.bronzeBoilerHeatSpeed": "bronzeBoilerHeatSpeed", - "config.gtceu.option.bronzeBoilerMaxTemperature": "bronzeBoilerMaxTemperature", - "config.gtceu.option.buttonAnchor": "buttonAnchor", - "config.gtceu.option.casingsPerCraft": "casingsPerCraft", - "config.gtceu.option.cleanMultiblocks": "cleanMultiblocks", + "config.gtceu.option.ae2.meHatchEnergyUsage": "meHatchEnergyUsage", + "config.gtceu.option.ae2.updateIntervals": "updateIntervals", + "config.gtceu.option.armorHud.hudLocation": "hudLocation", + "config.gtceu.option.armorHud.hudOffsetX": "hudOffsetX", + "config.gtceu.option.armorHud.hudOffsetY": "hudOffsetY", "config.gtceu.option.client": "client", + "config.gtceu.option.client.animationTime": "animationTime", + "config.gtceu.option.client.armorHud": "armorHud", + "config.gtceu.option.client.defaultPaintingColor": "defaultPaintingColor", + "config.gtceu.option.client.defaultUIColor": "defaultUIColor", + "config.gtceu.option.client.inWorldPreviewDuration": "inWorldPreviewDuration", + "config.gtceu.option.client.machinesEmissiveTextures": "machinesEmissiveTextures", + "config.gtceu.option.client.renderer": "renderer", + "config.gtceu.option.client.toolCraftingSounds": "toolCraftingSounds", + "config.gtceu.option.client.toolUseSounds": "toolUseSounds", + "config.gtceu.option.client.useVBO": "useVBO", "config.gtceu.option.compat": "compat", - "config.gtceu.option.debug": "debug", - "config.gtceu.option.debugWorldgen": "debugWorldgen", - "config.gtceu.option.defaultPaintingColor": "defaultPaintingColor", - "config.gtceu.option.defaultUIColor": "defaultUIColor", + "config.gtceu.option.compat.ae2": "ae2", + "config.gtceu.option.compat.energy": "energy", + "config.gtceu.option.compat.hideFacadesInRecipeViewer": "hideFacadesInRecipeViewer", + "config.gtceu.option.compat.hideFilledCellsInRecipeViewer": "hideFilledCellsInRecipeViewer", + "config.gtceu.option.compat.hideOreProcessingDiagrams": "hideOreProcessingDiagrams", + "config.gtceu.option.compat.minimap": "minimap", + "config.gtceu.option.compat.removeSmeltingForEBFMetals": "removeSmeltingForEBFMetals", + "config.gtceu.option.compat.showDimensionTier": "showDimensionTier", "config.gtceu.option.dev": "dev", - "config.gtceu.option.direction": "direction", - "config.gtceu.option.disableManualCompression": "disableManualCompression", - "config.gtceu.option.doBedrockOres": "doBedrockOres", - "config.gtceu.option.doSuperflatOres": "doSuperflatOres", - "config.gtceu.option.doesExplosionDamagesTerrain": "doesExplosionDamagesTerrain", - "config.gtceu.option.dumpAssets": "dumpAssets", - "config.gtceu.option.dumpRecipes": "dumpRecipes", - "config.gtceu.option.enableCleanroom": "enableCleanroom", - "config.gtceu.option.enableFEConverters": "enableFEConverters", - "config.gtceu.option.enableMaintenance": "enableMaintenance", - "config.gtceu.option.enableResearch": "enableResearch", - "config.gtceu.option.enableTieredCasings": "enableTieredCasings", - "config.gtceu.option.enableWorldAccelerators": "enableWorldAccelerators", - "config.gtceu.option.enchantedTools": "enchantedTools", - "config.gtceu.option.energy": "energy", - "config.gtceu.option.energyConsumption": "energyConsumption", - "config.gtceu.option.energyUsageMultiplier": "energyUsageMultiplier", - "config.gtceu.option.environmentalHazardDecayRate": "environmentalHazardDecayRate", - "config.gtceu.option.environmentalHazards": "environmentalHazards", - "config.gtceu.option.euToFeRatio": "euToFeRatio", - "config.gtceu.option.feToEuRatio": "feToEuRatio", - "config.gtceu.option.flintAndSteelRequireSteel": "flintAndSteelRequireSteel", - "config.gtceu.option.ftbChunksIntegration": "ftbChunksIntegration", + "config.gtceu.option.dev.debug": "debug", + "config.gtceu.option.dev.debugWorldgen": "debugWorldgen", + "config.gtceu.option.dev.doSuperflatOres": "doSuperflatOres", + "config.gtceu.option.dev.dumpAssets": "dumpAssets", + "config.gtceu.option.dev.dumpRecipes": "dumpRecipes", + "config.gtceu.option.energy.enableFEConverters": "enableFEConverters", + "config.gtceu.option.energy.euToFeRatio": "euToFeRatio", + "config.gtceu.option.energy.feToEuRatio": "feToEuRatio", + "config.gtceu.option.energy.nativeEUToFE": "nativeEUToFE", "config.gtceu.option.gameplay": "gameplay", - "config.gtceu.option.generateLowQualityGems": "generateLowQualityGems", - "config.gtceu.option.ghostCircuit": "ghostCircuit", - "config.gtceu.option.gt6StylePipesCables": "gt6StylePipesCables", - "config.gtceu.option.hardAdvancedIronRecipes": "hardAdvancedIronRecipes", - "config.gtceu.option.hardDyeRecipes": "hardDyeRecipes", - "config.gtceu.option.hardGlassRecipes": "hardGlassRecipes", - "config.gtceu.option.hardIronRecipes": "hardIronRecipes", - "config.gtceu.option.hardMiscRecipes": "hardMiscRecipes", - "config.gtceu.option.hardMultiRecipes": "hardMultiRecipes", - "config.gtceu.option.hardRedstoneRecipes": "hardRedstoneRecipes", - "config.gtceu.option.hardToolArmorRecipes": "hardToolArmorRecipes", - "config.gtceu.option.hardWoodRecipes": "hardWoodRecipes", - "config.gtceu.option.harderBrickRecipes": "harderBrickRecipes", - "config.gtceu.option.harderCharcoalRecipe": "harderCharcoalRecipe", - "config.gtceu.option.harderCircuitRecipes": "harderCircuitRecipes", - "config.gtceu.option.harderRods": "harderRods", - "config.gtceu.option.harmlessActiveTransformers": "harmlessActiveTransformers", - "config.gtceu.option.hazardsEnabled": "hazardsEnabled", - "config.gtceu.option.hideFacadesInRecipeViewer": "hideFacadesInRecipeViewer", - "config.gtceu.option.hideFilledCellsInRecipeViewer": "hideFilledCellsInRecipeViewer", - "config.gtceu.option.hideOreProcessingDiagrams": "hideOreProcessingDiagrams", - "config.gtceu.option.highTierContent": "highTierContent", - "config.gtceu.option.hpLiquidBoilerBaseOutput": "hpLiquidBoilerBaseOutput", - "config.gtceu.option.hpSolarBoilerBaseOutput": "hpSolarBoilerBaseOutput", - "config.gtceu.option.hpSolidBoilerBaseOutput": "hpSolidBoilerBaseOutput", - "config.gtceu.option.hudLocation": "hudLocation", - "config.gtceu.option.hudOffsetX": "hudOffsetX", - "config.gtceu.option.hudOffsetY": "hudOffsetY", - "config.gtceu.option.inWorldPreviewDuration": "inWorldPreviewDuration", - "config.gtceu.option.increaseDungeonLoot": "increaseDungeonLoot", - "config.gtceu.option.infiniteBedrockOresFluids": "infiniteBedrockOresFluids", - "config.gtceu.option.journeyMapIntegration": "journeyMapIntegration", - "config.gtceu.option.largeBoilers": "largeBoilers", - "config.gtceu.option.ldFluidPipeMinDistance": "ldFluidPipeMinDistance", - "config.gtceu.option.ldItemPipeMinDistance": "ldItemPipeMinDistance", - "config.gtceu.option.liquidBoilerBaseOutput": "liquidBoilerBaseOutput", - "config.gtceu.option.machineSounds": "machineSounds", + "config.gtceu.option.gameplay.environmentalHazardDecayRate": "environmentalHazardDecayRate", + "config.gtceu.option.gameplay.environmentalHazards": "environmentalHazards", + "config.gtceu.option.gameplay.hazardsEnabled": "hazardsEnabled", + "config.gtceu.option.gameplay.universalHazards": "universalHazards", + "config.gtceu.option.largeBoilers.bronzeBoilerHeatSpeed": "bronzeBoilerHeatSpeed", + "config.gtceu.option.largeBoilers.bronzeBoilerMaxTemperature": "bronzeBoilerMaxTemperature", + "config.gtceu.option.largeBoilers.steamPerWater": "steamPerWater", + "config.gtceu.option.largeBoilers.steelBoilerHeatSpeed": "steelBoilerHeatSpeed", + "config.gtceu.option.largeBoilers.steelBoilerMaxTemperature": "steelBoilerMaxTemperature", + "config.gtceu.option.largeBoilers.titaniumBoilerHeatSpeed": "titaniumBoilerHeatSpeed", + "config.gtceu.option.largeBoilers.titaniumBoilerMaxTemperature": "titaniumBoilerMaxTemperature", + "config.gtceu.option.largeBoilers.tungstensteelBoilerHeatSpeed": "tungstensteelBoilerHeatSpeed", + "config.gtceu.option.largeBoilers.tungstensteelBoilerMaxTemperature": "tungstensteelBoilerMaxTemperature", "config.gtceu.option.machines": "machines", - "config.gtceu.option.machinesEmissiveTextures": "machinesEmissiveTextures", - "config.gtceu.option.meHatchEnergyUsage": "meHatchEnergyUsage", - "config.gtceu.option.minerSpeed": "minerSpeed", - "config.gtceu.option.minimap": "minimap", - "config.gtceu.option.nanoSaber": "nanoSaber", - "config.gtceu.option.nanoSaberBaseDamage": "nanoSaberBaseDamage", - "config.gtceu.option.nanoSaberDamageBoost": "nanoSaberDamageBoost", - "config.gtceu.option.nativeEUToFE": "nativeEUToFE", - "config.gtceu.option.nerfPaperCrafting": "nerfPaperCrafting", - "config.gtceu.option.nerfWoodCrafting": "nerfWoodCrafting", - "config.gtceu.option.onlyOwnerBreak": "onlyOwnerBreak", - "config.gtceu.option.onlyOwnerGUI": "onlyOwnerGUI", - "config.gtceu.option.orderedAssemblyLineFluids": "orderedAssemblyLineFluids", - "config.gtceu.option.orderedAssemblyLineItems": "orderedAssemblyLineItems", - "config.gtceu.option.oreBlockProspectRange": "oreBlockProspectRange", - "config.gtceu.option.oreGenerationChunkCacheSize": "oreGenerationChunkCacheSize", - "config.gtceu.option.oreIconSize": "oreIconSize", - "config.gtceu.option.oreIndicatorChunkCacheSize": "oreIndicatorChunkCacheSize", - "config.gtceu.option.oreIndicators": "oreIndicators", - "config.gtceu.option.oreNamePrefix": "oreNamePrefix", - "config.gtceu.option.oreScaleStop": "oreScaleStop", - "config.gtceu.option.oreVeinGridSize": "oreVeinGridSize", - "config.gtceu.option.oreVeinRandomOffset": "oreVeinRandomOffset", - "config.gtceu.option.oreVeins": "oreVeins", - "config.gtceu.option.ownerOPBypass": "ownerOPBypass", - "config.gtceu.option.prospectorEnergyUseMultiplier": "prospectorEnergyUseMultiplier", - "config.gtceu.option.recipeProgressLowEnergy": "recipeProgressLowEnergy", + "config.gtceu.option.machines.bedrockOreDropTagPrefix": "bedrockOreDropTagPrefix", + "config.gtceu.option.machines.cleanMultiblocks": "cleanMultiblocks", + "config.gtceu.option.machines.doBedrockOres": "doBedrockOres", + "config.gtceu.option.machines.doesExplosionDamagesTerrain": "doesExplosionDamagesTerrain", + "config.gtceu.option.machines.enableCleanroom": "enableCleanroom", + "config.gtceu.option.machines.enableMaintenance": "enableMaintenance", + "config.gtceu.option.machines.enableResearch": "enableResearch", + "config.gtceu.option.machines.enableTieredCasings": "enableTieredCasings", + "config.gtceu.option.machines.enableWorldAccelerators": "enableWorldAccelerators", + "config.gtceu.option.machines.energyUsageMultiplier": "energyUsageMultiplier", + "config.gtceu.option.machines.ghostCircuit": "ghostCircuit", + "config.gtceu.option.machines.gt6StylePipesCables": "gt6StylePipesCables", + "config.gtceu.option.machines.harmlessActiveTransformers": "harmlessActiveTransformers", + "config.gtceu.option.machines.highTierContent": "highTierContent", + "config.gtceu.option.machines.largeBoilers": "largeBoilers", + "config.gtceu.option.machines.ldFluidPipeMinDistance": "ldFluidPipeMinDistance", + "config.gtceu.option.machines.ldItemPipeMinDistance": "ldItemPipeMinDistance", + "config.gtceu.option.machines.machineSounds": "machineSounds", + "config.gtceu.option.machines.minerSpeed": "minerSpeed", + "config.gtceu.option.machines.onlyOwnerBreak": "onlyOwnerBreak", + "config.gtceu.option.machines.onlyOwnerGUI": "onlyOwnerGUI", + "config.gtceu.option.machines.orderedAssemblyLineFluids": "orderedAssemblyLineFluids", + "config.gtceu.option.machines.orderedAssemblyLineItems": "orderedAssemblyLineItems", + "config.gtceu.option.machines.ownerOPBypass": "ownerOPBypass", + "config.gtceu.option.machines.prospectorEnergyUseMultiplier": "prospectorEnergyUseMultiplier", + "config.gtceu.option.machines.recipeProgressLowEnergy": "recipeProgressLowEnergy", + "config.gtceu.option.machines.replaceMinedBlocksWith": "replaceMinedBlocksWith", + "config.gtceu.option.machines.requireGTToolsForBlocks": "requireGTToolsForBlocks", + "config.gtceu.option.machines.shouldWeatherOrTerrainExplosion": "shouldWeatherOrTerrainExplosion", + "config.gtceu.option.machines.smallBoilers": "smallBoilers", + "config.gtceu.option.machines.steamMultiParallelAmount": "steamMultiParallelAmount", + "config.gtceu.option.machines.steelSteamMultiblocks": "steelSteamMultiblocks", + "config.gtceu.option.machines.worldAcceleratorBlacklist": "worldAcceleratorBlacklist", + "config.gtceu.option.minimap.borderColor": "borderColor", + "config.gtceu.option.minimap.buttonAnchor": "buttonAnchor", + "config.gtceu.option.minimap.direction": "direction", + "config.gtceu.option.minimap.oreBlockProspectRange": "oreBlockProspectRange", + "config.gtceu.option.minimap.oreIconSize": "oreIconSize", + "config.gtceu.option.minimap.oreNamePrefix": "oreNamePrefix", + "config.gtceu.option.minimap.oreScaleStop": "oreScaleStop", + "config.gtceu.option.minimap.surfaceRockProspectRange": "surfaceRockProspectRange", + "config.gtceu.option.minimap.toggle": "toggle", + "config.gtceu.option.minimap.xOffset": "xOffset", + "config.gtceu.option.minimap.yOffset": "yOffset", + "config.gtceu.option.nanoSaber.energyConsumption": "energyConsumption", + "config.gtceu.option.nanoSaber.nanoSaberBaseDamage": "nanoSaberBaseDamage", + "config.gtceu.option.nanoSaber.nanoSaberDamageBoost": "nanoSaberDamageBoost", + "config.gtceu.option.nanoSaber.zombieSpawnWithSabers": "zombieSpawnWithSabers", + "config.gtceu.option.oreVeins.bedrockOreDistance": "bedrockOreDistance", + "config.gtceu.option.oreVeins.infiniteBedrockOresFluids": "infiniteBedrockOresFluids", + "config.gtceu.option.oreVeins.oreGenerationChunkCacheSize": "oreGenerationChunkCacheSize", + "config.gtceu.option.oreVeins.oreIndicatorChunkCacheSize": "oreIndicatorChunkCacheSize", + "config.gtceu.option.oreVeins.oreIndicators": "oreIndicators", + "config.gtceu.option.oreVeins.oreVeinGridSize": "oreVeinGridSize", + "config.gtceu.option.oreVeins.oreVeinRandomOffset": "oreVeinRandomOffset", + "config.gtceu.option.oreVeins.removeVanillaLargeOreVeins": "removeVanillaLargeOreVeins", + "config.gtceu.option.oreVeins.removeVanillaOreGen": "removeVanillaOreGen", "config.gtceu.option.recipes": "recipes", - "config.gtceu.option.removeSmeltingForEBFMetals": "removeSmeltingForEBFMetals", - "config.gtceu.option.removeVanillaBlockRecipes": "removeVanillaBlockRecipes", - "config.gtceu.option.removeVanillaLargeOreVeins": "removeVanillaLargeOreVeins", - "config.gtceu.option.removeVanillaOreGen": "removeVanillaOreGen", - "config.gtceu.option.removeVanillaTNTRecipe": "removeVanillaTNTRecipe", - "config.gtceu.option.renderFluids": "renderFluids", - "config.gtceu.option.renderer": "renderer", - "config.gtceu.option.replaceMinedBlocksWith": "replaceMinedBlocksWith", - "config.gtceu.option.requireGTToolsForBlocks": "requireGTToolsForBlocks", - "config.gtceu.option.rngDamageElectricTools": "rngDamageElectricTools", - "config.gtceu.option.rubberTreeSpawnChance": "rubberTreeSpawnChance", - "config.gtceu.option.sandOresFall": "sandOresFall", - "config.gtceu.option.shouldWeatherOrTerrainExplosion": "shouldWeatherOrTerrainExplosion", - "config.gtceu.option.showDimensionTier": "showDimensionTier", - "config.gtceu.option.smallBoilers": "smallBoilers", - "config.gtceu.option.solarBoilerBaseOutput": "solarBoilerBaseOutput", - "config.gtceu.option.solidBoilerBaseOutput": "solidBoilerBaseOutput", - "config.gtceu.option.sprayCanChainLength": "sprayCanChainLength", - "config.gtceu.option.steamMultiParallelAmount": "steamMultiParallelAmount", - "config.gtceu.option.steamPerWater": "steamPerWater", - "config.gtceu.option.steelBoilerHeatSpeed": "steelBoilerHeatSpeed", - "config.gtceu.option.steelBoilerMaxTemperature": "steelBoilerMaxTemperature", - "config.gtceu.option.steelSteamMultiblocks": "steelSteamMultiblocks", - "config.gtceu.option.surfaceRockProspectRange": "surfaceRockProspectRange", - "config.gtceu.option.titaniumBoilerHeatSpeed": "titaniumBoilerHeatSpeed", - "config.gtceu.option.titaniumBoilerMaxTemperature": "titaniumBoilerMaxTemperature", - "config.gtceu.option.toggle": "toggle", - "config.gtceu.option.toolCraftingSounds": "toolCraftingSounds", - "config.gtceu.option.toolUseSounds": "toolUseSounds", + "config.gtceu.option.recipes.casingsPerCraft": "casingsPerCraft", + "config.gtceu.option.recipes.disableManualCompression": "disableManualCompression", + "config.gtceu.option.recipes.enchantedTools": "enchantedTools", + "config.gtceu.option.recipes.flintAndSteelRequireSteel": "flintAndSteelRequireSteel", + "config.gtceu.option.recipes.generateLowQualityGems": "generateLowQualityGems", + "config.gtceu.option.recipes.hardAdvancedIronRecipes": "hardAdvancedIronRecipes", + "config.gtceu.option.recipes.hardDyeRecipes": "hardDyeRecipes", + "config.gtceu.option.recipes.hardGlassRecipes": "hardGlassRecipes", + "config.gtceu.option.recipes.hardIronRecipes": "hardIronRecipes", + "config.gtceu.option.recipes.hardMiscRecipes": "hardMiscRecipes", + "config.gtceu.option.recipes.hardMultiRecipes": "hardMultiRecipes", + "config.gtceu.option.recipes.hardRedstoneRecipes": "hardRedstoneRecipes", + "config.gtceu.option.recipes.hardToolArmorRecipes": "hardToolArmorRecipes", + "config.gtceu.option.recipes.hardWoodRecipes": "hardWoodRecipes", + "config.gtceu.option.recipes.harderBrickRecipes": "harderBrickRecipes", + "config.gtceu.option.recipes.harderCharcoalRecipe": "harderCharcoalRecipe", + "config.gtceu.option.recipes.harderCircuitRecipes": "harderCircuitRecipes", + "config.gtceu.option.recipes.harderRods": "harderRods", + "config.gtceu.option.recipes.nerfPaperCrafting": "nerfPaperCrafting", + "config.gtceu.option.recipes.nerfWoodCrafting": "nerfWoodCrafting", + "config.gtceu.option.recipes.removeVanillaBlockRecipes": "removeVanillaBlockRecipes", + "config.gtceu.option.recipes.removeVanillaTNTRecipe": "removeVanillaTNTRecipe", + "config.gtceu.option.renderer.renderFluids": "renderFluids", + "config.gtceu.option.smallBoilers.hpLiquidBoilerBaseOutput": "hpLiquidBoilerBaseOutput", + "config.gtceu.option.smallBoilers.hpSolarBoilerBaseOutput": "hpSolarBoilerBaseOutput", + "config.gtceu.option.smallBoilers.hpSolidBoilerBaseOutput": "hpSolidBoilerBaseOutput", + "config.gtceu.option.smallBoilers.liquidBoilerBaseOutput": "liquidBoilerBaseOutput", + "config.gtceu.option.smallBoilers.solarBoilerBaseOutput": "solarBoilerBaseOutput", + "config.gtceu.option.smallBoilers.solidBoilerBaseOutput": "solidBoilerBaseOutput", + "config.gtceu.option.toggle.ftbChunksIntegration": "ftbChunksIntegration", + "config.gtceu.option.toggle.journeyMapIntegration": "journeyMapIntegration", + "config.gtceu.option.toggle.xaerosMapIntegration": "xaerosMapIntegration", "config.gtceu.option.tools": "tools", - "config.gtceu.option.treeFellingDelay": "treeFellingDelay", - "config.gtceu.option.tungstensteelBoilerHeatSpeed": "tungstensteelBoilerHeatSpeed", - "config.gtceu.option.tungstensteelBoilerMaxTemperature": "tungstensteelBoilerMaxTemperature", - "config.gtceu.option.universalHazards": "universalHazards", - "config.gtceu.option.updateIntervals": "updateIntervals", - "config.gtceu.option.useVBO": "useVBO", - "config.gtceu.option.voltageTierAdvImpeller": "voltageTierAdvImpeller", - "config.gtceu.option.voltageTierAdvNanoSuit": "voltageTierAdvNanoSuit", - "config.gtceu.option.voltageTierAdvQuarkTech": "voltageTierAdvQuarkTech", - "config.gtceu.option.voltageTierImpeller": "voltageTierImpeller", - "config.gtceu.option.voltageTierNanoSuit": "voltageTierNanoSuit", - "config.gtceu.option.voltageTierNightVision": "voltageTierNightVision", - "config.gtceu.option.voltageTierQuarkTech": "voltageTierQuarkTech", - "config.gtceu.option.worldAcceleratorBlacklist": "worldAcceleratorBlacklist", + "config.gtceu.option.tools.nanoSaber": "nanoSaber", + "config.gtceu.option.tools.rngDamageElectricTools": "rngDamageElectricTools", + "config.gtceu.option.tools.sprayCanChainLength": "sprayCanChainLength", + "config.gtceu.option.tools.treeFellingDelay": "treeFellingDelay", + "config.gtceu.option.tools.voltageTierAdvImpeller": "voltageTierAdvImpeller", + "config.gtceu.option.tools.voltageTierAdvNanoSuit": "voltageTierAdvNanoSuit", + "config.gtceu.option.tools.voltageTierAdvQuarkTech": "voltageTierAdvQuarkTech", + "config.gtceu.option.tools.voltageTierImpeller": "voltageTierImpeller", + "config.gtceu.option.tools.voltageTierNanoSuit": "voltageTierNanoSuit", + "config.gtceu.option.tools.voltageTierNightVision": "voltageTierNightVision", + "config.gtceu.option.tools.voltageTierQuarkTech": "voltageTierQuarkTech", "config.gtceu.option.worldgen": "worldgen", - "config.gtceu.option.xOffset": "xOffset", - "config.gtceu.option.xaerosMapIntegration": "xaerosMapIntegration", - "config.gtceu.option.yOffset": "yOffset", - "config.gtceu.option.zombieSpawnWithSabers": "zombieSpawnWithSabers", + "config.gtceu.option.worldgen.addLoot": "addLoot", + "config.gtceu.option.worldgen.allUniqueStoneTypes": "allUniqueStoneTypes", + "config.gtceu.option.worldgen.increaseDungeonLoot": "increaseDungeonLoot", + "config.gtceu.option.worldgen.oreVeins": "oreVeins", + "config.gtceu.option.worldgen.rubberTreeSpawnChance": "rubberTreeSpawnChance", + "config.gtceu.option.worldgen.sandOresFall": "sandOresFall", "config.jade.plugin_gtceu.auto_output_info": "[GTCEu] Auto Output Info", "config.jade.plugin_gtceu.cable_info": "[GTCEu] Cable Info", "config.jade.plugin_gtceu.controllable_provider": "[GTCEu] Controllable", diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java index 9bcec4e51d3..92719b5f39b 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java @@ -18,19 +18,19 @@ public class ConfigurationLang { public static void init(RegistrateLangProvider provider) { - dfs(provider, new HashSet<>(), - Configuration.registerConfig(ConfigHolder.class, ConfigFormats.yaml()).getValueMap()); + recurseGenerateConfigLang(provider, new HashSet<>(), + Configuration.registerConfig(ConfigHolder.class, ConfigFormats.yaml()).getValueMap(), ""); } - // depth first search === dfs - private static void dfs(RegistrateLangProvider provider, Set added, Map> map) { + + private static void recurseGenerateConfigLang(RegistrateLangProvider provider, Set added, Map> map, String parentKey) { for (var entry : map.entrySet()) { var id = entry.getValue().getId(); if (added.add(id)) { - provider.add(String.format("config.%s.option.%s", GTCEu.MOD_ID, id), id); + provider.add(String.format("config.%s.option%s.%s", GTCEu.MOD_ID, parentKey, id), id); } if (entry.getValue() instanceof ObjectValue objectValue) { - dfs(provider, added, objectValue.get()); + recurseGenerateConfigLang(provider, added, objectValue.get(), "." + id); } } } From d7fe3860e529319fc90ca13790dc0eccbbb3d41c Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Thu, 26 Jun 2025 02:28:07 -0600 Subject: [PATCH 28/45] Fluid pipe tooltips, item pipe tooltips, cable tooltips, fluid tooltips --- .../resources/assets/gtceu/lang/en_ud.json | 42 +++++++++---------- .../resources/assets/gtceu/lang/en_us.json | 42 +++++++++---------- .../api/capability/IPropertyFluidFilter.java | 10 ++--- .../gtceu/api/fluids/FluidState.java | 6 +-- .../api/fluids/attribute/FluidAttributes.java | 4 +- .../api/item/component/ThermalFluidStats.java | 12 +++--- .../gtceu/client/TooltipsHandler.java | 4 +- .../gtceu/common/block/CableBlock.java | 8 ++-- .../gtceu/common/block/DuctPipeBlock.java | 2 +- .../gtceu/common/block/FluidPipeBlock.java | 14 +++---- .../gtceu/common/block/ItemPipeBlock.java | 2 +- .../gtceu/data/lang/BlockLang.java | 28 ++++++------- .../gtceu/data/lang/MaterialLang.java | 12 +++--- 13 files changed, 93 insertions(+), 93 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index a4dfbf66b4e..2bc86562c4a 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -2227,12 +2227,6 @@ "fluid.gtceu.molten": "%s uǝʇןoW", "fluid.gtceu.plasma": "ɐɯsɐןԀ %s", "fluid.gtceu.potion": "uoıʇoԀ", - "fluid.gtceu.tooltip.acid": "¡ǝɹɐɔ ɥʇıʍ ǝןpuɐH ¡ɔıpıɔⱯ9§", - "fluid.gtceu.tooltip.cryogenic": "¡ǝɹɐɔ ɥʇıʍ ǝןpuɐH ¡ɔıuǝboʎɹƆq§", - "fluid.gtceu.tooltip.gas": "snoǝsɐ⅁ :ǝʇɐʇSɐ§", - "fluid.gtceu.tooltip.liquid": "pınbıꞀ :ǝʇɐʇSɐ§", - "fluid.gtceu.tooltip.plasma": "ɐɯsɐןԀ :ǝʇɐʇSɐ§", - "fluid.gtceu.tooltip.temperature": "ʞ %d :ǝɹnʇɐɹǝdɯǝ⟘ɔ§", "fluid.spawnlocation.name": "uoıʇɐɯɹoɟuI uıǝΛ pınןℲ", "fluid.tile.lava": "ɐʌɐꞀ", "fluid.tile.water": "ɹǝʇɐM", @@ -2248,10 +2242,6 @@ "gtceu.button.hide_depleted": "suıǝΛ pǝʇǝןdǝᗡ ǝpıH", "gtceu.button.ore_veins": "suıǝΛ ǝɹO ⟘⅁ ʍoɥS", "gtceu.button.show_depleted": "suıǝΛ pǝʇǝןdǝᗡ ʍoɥS", - "gtceu.cable.amperage": "%dǝ§ ɹ§:ǝbɐɹǝdɯⱯ xɐWǝ§", - "gtceu.cable.loss_per_block": "ʇןoΛ-∩Ǝ ㄥ§%dɔ§ ɹ§:ǝɹǝdɯⱯ/ɹǝʇǝW/ssoꞀɔ§", - "gtceu.cable.superconductor": "ɹoʇɔnpuoɔɹǝdnSp§ %s", - "gtceu.cable.voltage": ")ɐ§%s(ɐ§ %dɐ§ ɹ§:ǝbɐʇןoΛ xɐWɐ§", "gtceu.chance_logic.and": "ᗡNⱯ", "gtceu.chance_logic.first": "⟘SᴚIℲ", "gtceu.chance_logic.none": "ƎNON", @@ -2291,15 +2281,6 @@ "gtceu.direction.tooltip.left": "ʇɟǝꞀ", "gtceu.direction.tooltip.right": "ʇɥbıᴚ", "gtceu.direction.tooltip.up": "d∩", - "gtceu.duct_pipe.transfer_rate": "%s :ǝʇɐɹ ɹǝɟsuɐɹʇ ɹıⱯq§", - "gtceu.fluid_pipe.acid_proof": "spıɔⱯ ǝןpuɐɥ uɐƆ9§", - "gtceu.fluid_pipe.capacity": "ᗺɯ %dɟ§ :ʎʇıɔɐdɐƆ6§", - "gtceu.fluid_pipe.channels": "%dɟ§ :sןǝuuɐɥƆǝ§", - "gtceu.fluid_pipe.cryo_proof": "sɔıuǝboʎɹƆ ǝןpuɐɥ uɐƆ9§", - "gtceu.fluid_pipe.gas_proof": "sǝsɐ⅁ ǝןpuɐɥ uɐƆ9§", - "gtceu.fluid_pipe.max_temperature": "ʞ %dɟ§ :ʇıɯıꞀ ǝɹnʇɐɹǝdɯǝ⟘ɔ§", - "gtceu.fluid_pipe.not_gas_proof": "¡ʞɐǝן ʎɐɯ sǝsɐ⅁ㄣ§", - "gtceu.fluid_pipe.plasma_proof": "sɐɯsɐןԀ ןןɐ ǝןpuɐɥ uɐƆ9§", "gtceu.forming_press.naming.named": "ɯǝʇI pǝɯɐNo§", "gtceu.forming_press.naming.press": "ssǝɹԀ pǝɯɐNo§", "gtceu.forming_press.naming.to_name": "ǝɯɐN oʇ ɯǝʇIo§", @@ -2412,7 +2393,6 @@ "gtceu.item_filter.empty_item": ")ɯǝʇI oN( ʎʇdɯƎ", "gtceu.item_filter.footer": "ǝpıɹɹǝʌo oʇ ɯǝʇı ɥʇıʍ ʞɔıןƆǝ§", "gtceu.item_list.item_stored": "%d :pǝɹoʇSㄥ§", - "gtceu.item_pipe.priority": "%dɟ§ :ʎʇıɹoıɹԀ6§", "gtceu.jade.cleaned_this_second": "s/%s :pɹɐzɐɥ pǝuɐǝןƆ", "gtceu.jade.energy_stored": "∩Ǝ %d / %d", "gtceu.jade.progress_computation": "∩MƆ %s / %s", @@ -5545,5 +5525,25 @@ "tool_action.gtceu.tape": "sɯǝןqoɹԀ ǝɔuɐuǝʇuıɐW xıɟ oʇ ǝdɐ⟘ ǝs∩8§", "tool_action.gtceu.wire_cutter.connect": "suoıʇɔǝuuoƆ ʇǝs oʇ sɹǝʇʇnƆ ǝɹıM ǝs∩8§", "tool_action.gtceu.wrench.connect": "suoıʇɔǝuuoƆ ʞɔoןq oʇ ʞɐǝus 'suoıʇɔǝuuoƆ ʇǝs oʇ ɥɔuǝɹM ǝs∩8§", - "tool_action.gtceu.wrench.set_facing": "buıɔɐℲ ʇǝs oʇ ɥɔuǝɹM ǝs∩8§" + "tool_action.gtceu.wrench.set_facing": "buıɔɐℲ ʇǝs oʇ ɥɔuǝɹM ǝs∩8§", + "tooltip.gtceu.cable.amperage": "%dǝ§ ɹ§:ǝbɐɹǝdɯⱯ xɐWǝ§", + "tooltip.gtceu.cable.loss_per_block": "ʇןoΛ-∩Ǝ ㄥ§%dɔ§ ɹ§:ǝɹǝdɯⱯ/ɹǝʇǝW/ssoꞀɔ§", + "tooltip.gtceu.cable.superconductor": "ɹoʇɔnpuoɔɹǝdnSp§ %s", + "tooltip.gtceu.cable.voltage": ")ɐ§%s(ɐ§ %dɐ§ ɹ§:ǝbɐʇןoΛ xɐWɐ§", + "tooltip.gtceu.duct_pipe.transfer_rate": "%s :ǝʇɐɹ ɹǝɟsuɐɹʇ ɹıⱯq§", + "tooltip.gtceu.fluid_pipe.acid_proof": "spıɔⱯ ǝןpuɐɥ uɐƆ9§", + "tooltip.gtceu.fluid_pipe.capacity": "ᗺɯ %dɟ§ :ʎʇıɔɐdɐƆ6§", + "tooltip.gtceu.fluid_pipe.channels": "%dɟ§ :sןǝuuɐɥƆǝ§", + "tooltip.gtceu.fluid_pipe.cryo_proof": "sɔıuǝboʎɹƆ ǝןpuɐɥ uɐƆ9§", + "tooltip.gtceu.fluid_pipe.gas_proof": "sǝsɐ⅁ ǝןpuɐɥ uɐƆ9§", + "tooltip.gtceu.fluid_pipe.max_temperature": "ʞ %dɟ§ :ʇıɯıꞀ ǝɹnʇɐɹǝdɯǝ⟘ɔ§", + "tooltip.gtceu.fluid_pipe.not_gas_proof": "¡ʞɐǝן ʎɐɯ sǝsɐ⅁ㄣ§", + "tooltip.gtceu.fluid_pipe.plasma_proof": "sɐɯsɐןԀ ןןɐ ǝןpuɐɥ uɐƆ9§", + "tooltip.gtceu.fluid_property.acid": "¡ǝɹɐɔ ɥʇıʍ ǝןpuɐH ¡ɔıpıɔⱯ9§", + "tooltip.gtceu.fluid_property.cryogenic": "¡ǝɹɐɔ ɥʇıʍ ǝןpuɐH ¡ɔıuǝboʎɹƆq§", + "tooltip.gtceu.fluid_property.temperature": "ʞ %d :ǝɹnʇɐɹǝdɯǝ⟘ɔ§", + "tooltip.gtceu.fluid_state.gas": "snoǝsɐ⅁ :ǝʇɐʇSɐ§", + "tooltip.gtceu.fluid_state.liquid": "pınbıꞀ :ǝʇɐʇSɐ§", + "tooltip.gtceu.fluid_state.plasma": "ɐɯsɐןԀ :ǝʇɐʇSɐ§", + "tooltip.gtceu.item_pipe.priority": "%dɟ§ :ʎʇıɹoıɹԀ6§" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index b0551dbda9a..54736a73c0d 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -2227,12 +2227,6 @@ "fluid.gtceu.molten": "Molten %s", "fluid.gtceu.plasma": "%s Plasma", "fluid.gtceu.potion": "Potion", - "fluid.gtceu.tooltip.acid": "§6Acidic! Handle with care!", - "fluid.gtceu.tooltip.cryogenic": "§bCryogenic! Handle with care!", - "fluid.gtceu.tooltip.gas": "§aState: Gaseous", - "fluid.gtceu.tooltip.liquid": "§aState: Liquid", - "fluid.gtceu.tooltip.plasma": "§aState: Plasma", - "fluid.gtceu.tooltip.temperature": "§cTemperature: %d K", "fluid.spawnlocation.name": "Fluid Vein Information", "fluid.tile.lava": "Lava", "fluid.tile.water": "Water", @@ -2248,10 +2242,6 @@ "gtceu.button.hide_depleted": "Hide Depleted Veins", "gtceu.button.ore_veins": "Show GT Ore Veins", "gtceu.button.show_depleted": "Show Depleted Veins", - "gtceu.cable.amperage": "§eMax Amperage:§r §e%d", - "gtceu.cable.loss_per_block": "§cLoss/Meter/Ampere:§r §c%d§7 EU-Volt", - "gtceu.cable.superconductor": "%s §dSuperconductor", - "gtceu.cable.voltage": "§aMax Voltage:§r §a%d §a(%s§a)", "gtceu.chance_logic.and": "AND", "gtceu.chance_logic.first": "FIRST", "gtceu.chance_logic.none": "NONE", @@ -2291,15 +2281,6 @@ "gtceu.direction.tooltip.left": "Left", "gtceu.direction.tooltip.right": "Right", "gtceu.direction.tooltip.up": "Up", - "gtceu.duct_pipe.transfer_rate": "§bAir transfer rate: %s", - "gtceu.fluid_pipe.acid_proof": "§6Can handle Acids", - "gtceu.fluid_pipe.capacity": "§9Capacity: §f%d mB", - "gtceu.fluid_pipe.channels": "§eChannels: §f%d", - "gtceu.fluid_pipe.cryo_proof": "§6Can handle Cryogenics", - "gtceu.fluid_pipe.gas_proof": "§6Can handle Gases", - "gtceu.fluid_pipe.max_temperature": "§cTemperature Limit: §f%d K", - "gtceu.fluid_pipe.not_gas_proof": "§4Gases may leak!", - "gtceu.fluid_pipe.plasma_proof": "§6Can handle all Plasmas", "gtceu.forming_press.naming.named": "§oNamed Item", "gtceu.forming_press.naming.press": "§oNamed Press", "gtceu.forming_press.naming.to_name": "§oItem to Name", @@ -2412,7 +2393,6 @@ "gtceu.item_filter.empty_item": "Empty (No Item)", "gtceu.item_filter.footer": "§eClick with item to override", "gtceu.item_list.item_stored": "§7Stored: %d", - "gtceu.item_pipe.priority": "§9Priority: §f%d", "gtceu.jade.cleaned_this_second": "Cleaned hazard: %s/s", "gtceu.jade.energy_stored": "%d / %d EU", "gtceu.jade.progress_computation": "%s / %s CWU", @@ -5545,5 +5525,25 @@ "tool_action.gtceu.tape": "§8Use Tape to fix Maintenance Problems", "tool_action.gtceu.wire_cutter.connect": "§8Use Wire Cutters to set Connections", "tool_action.gtceu.wrench.connect": "§8Use Wrench to set Connections, sneak to block Connections", - "tool_action.gtceu.wrench.set_facing": "§8Use Wrench to set Facing" + "tool_action.gtceu.wrench.set_facing": "§8Use Wrench to set Facing", + "tooltip.gtceu.cable.amperage": "§eMax Amperage:§r §e%d", + "tooltip.gtceu.cable.loss_per_block": "§cLoss/Meter/Ampere:§r §c%d§7 EU-Volt", + "tooltip.gtceu.cable.superconductor": "%s §dSuperconductor", + "tooltip.gtceu.cable.voltage": "§aMax Voltage:§r §a%d §a(%s§a)", + "tooltip.gtceu.duct_pipe.transfer_rate": "§bAir transfer rate: %s", + "tooltip.gtceu.fluid_pipe.acid_proof": "§6Can handle Acids", + "tooltip.gtceu.fluid_pipe.capacity": "§9Capacity: §f%d mB", + "tooltip.gtceu.fluid_pipe.channels": "§eChannels: §f%d", + "tooltip.gtceu.fluid_pipe.cryo_proof": "§6Can handle Cryogenics", + "tooltip.gtceu.fluid_pipe.gas_proof": "§6Can handle Gases", + "tooltip.gtceu.fluid_pipe.max_temperature": "§cTemperature Limit: §f%d K", + "tooltip.gtceu.fluid_pipe.not_gas_proof": "§4Gases may leak!", + "tooltip.gtceu.fluid_pipe.plasma_proof": "§6Can handle all Plasmas", + "tooltip.gtceu.fluid_property.acid": "§6Acidic! Handle with care!", + "tooltip.gtceu.fluid_property.cryogenic": "§bCryogenic! Handle with care!", + "tooltip.gtceu.fluid_property.temperature": "§cTemperature: %d K", + "tooltip.gtceu.fluid_state.gas": "§aState: Gaseous", + "tooltip.gtceu.fluid_state.liquid": "§aState: Liquid", + "tooltip.gtceu.fluid_state.plasma": "§aState: Plasma", + "tooltip.gtceu.item_pipe.priority": "§9Priority: §f%d" } \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/IPropertyFluidFilter.java b/src/main/java/com/gregtechceu/gtceu/api/capability/IPropertyFluidFilter.java index 59642e443a5..546bfb5ad6c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/IPropertyFluidFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/IPropertyFluidFilter.java @@ -86,12 +86,12 @@ default boolean test(@NotNull FluidStack stack) { default void appendTooltips(@NotNull List tooltip, boolean showToolsInfo, boolean showTemperatureInfo) { if (GTUtil.isShiftDown()) { if (showTemperatureInfo) - tooltip.add(Component.translatable("gtceu.fluid_pipe.max_temperature", + tooltip.add(Component.translatable("tooltip.gtceu.fluid_pipe.max_temperature", FormattingUtil.formatNumbers(getMaxFluidTemperature()))); - if (isGasProof()) tooltip.add(Component.translatable("gtceu.fluid_pipe.gas_proof")); - else tooltip.add(Component.translatable("gtceu.fluid_pipe.not_gas_proof")); - if (isPlasmaProof()) tooltip.add(Component.translatable("gtceu.fluid_pipe.plasma_proof")); - if (isCryoProof()) tooltip.add(Component.translatable("gtceu.fluid_pipe.cryo_proof")); + if (isGasProof()) tooltip.add(Component.translatable("tooltip.gtceu.fluid_pipe.gas_proof")); + else tooltip.add(Component.translatable("tooltip.gtceu.fluid_pipe.not_gas_proof")); + if (isPlasmaProof()) tooltip.add(Component.translatable("tooltip.gtceu.fluid_pipe.plasma_proof")); + if (isCryoProof()) tooltip.add(Component.translatable("tooltip.gtceu.fluid_pipe.cryo_proof")); getContainedAttributes().forEach(a -> a.appendContainerTooltips(tooltip::add)); } else if (isGasProof() || isCryoProof() || isPlasmaProof() || !getContainedAttributes().isEmpty()) { if (showToolsInfo) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidState.java b/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidState.java index 704636c6941..7c0851d3ba2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidState.java +++ b/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidState.java @@ -11,9 +11,9 @@ public enum FluidState { - LIQUID("fluid.gtceu.tooltip.liquid", CustomTags.LIQUID_FLUIDS), - GAS("fluid.gtceu.tooltip.gas", Tags.Fluids.GASEOUS), - PLASMA("fluid.gtceu.tooltip.plasma", CustomTags.PLASMA_FLUIDS), + LIQUID("tooltip.gtceu.fluid_state.liquid", CustomTags.LIQUID_FLUIDS), + GAS("tooltip.gtceu.fluid_state.gas", Tags.Fluids.GASEOUS), + PLASMA("tooltip.gtceu.fluid_state.plasma", CustomTags.PLASMA_FLUIDS), ; @Getter diff --git a/src/main/java/com/gregtechceu/gtceu/api/fluids/attribute/FluidAttributes.java b/src/main/java/com/gregtechceu/gtceu/api/fluids/attribute/FluidAttributes.java index 2a330ca5726..d426c52c2b2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/fluids/attribute/FluidAttributes.java +++ b/src/main/java/com/gregtechceu/gtceu/api/fluids/attribute/FluidAttributes.java @@ -10,8 +10,8 @@ public final class FluidAttributes { * Attribute for acidic fluids. */ public static final FluidAttribute ACID = new FluidAttribute(GTCEu.id("acid"), - list -> list.accept(Component.translatable("fluid.gtceu.tooltip.acid")), - list -> list.accept(Component.translatable("gtceu.fluid_pipe.acid_proof"))); + list -> list.accept(Component.translatable("tooltip.gtceu.fluid_property.acid")), + list -> list.accept(Component.translatable("tooltip.gtceu.fluid_pipe.acid_proof"))); private FluidAttributes() {} } diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/component/ThermalFluidStats.java b/src/main/java/com/gregtechceu/gtceu/api/item/component/ThermalFluidStats.java index 8b997683bfc..efea323646a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/component/ThermalFluidStats.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/component/ThermalFluidStats.java @@ -85,13 +85,13 @@ public void appendHoverText(ItemStack stack, @Nullable Level level, List public void appendHoverText(ItemStack stack, @Nullable BlockGetter level, List tooltip, TooltipFlag flag) { super.appendHoverText(stack, level, tooltip, flag); - tooltip.add(Component.translatable("gtceu.duct_pipe.transfer_rate", + tooltip.add(Component.translatable("tooltip.gtceu.duct_pipe.transfer_rate", this.pipeType.modifyProperties(this.properties).getTransferRate())); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/block/FluidPipeBlock.java b/src/main/java/com/gregtechceu/gtceu/common/block/FluidPipeBlock.java index 56bf336e3ad..0530ce2ca9d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/block/FluidPipeBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/common/block/FluidPipeBlock.java @@ -92,10 +92,10 @@ public void appendHoverText(ItemStack stack, @Nullable BlockGetter level, List 1) { - tooltip.add(Component.translatable("gtceu.fluid_pipe.channels", properties.getChannels())); + tooltip.add(Component.translatable("tooltip.gtceu.fluid_pipe.channels", properties.getChannels())); } if (!GTUtil.isShiftDown()) { @@ -104,13 +104,13 @@ public void appendHoverText(ItemStack stack, @Nullable BlockGetter level, List Date: Thu, 26 Jun 2025 04:59:08 -0600 Subject: [PATCH 29/45] UHV-MAX machine lang, eu generator tooltip blurbs, fixed xei recipe category lang, coil lang formatting, spotless --- .../resources/assets/gtceu/lang/en_ud.json | 275 +++++++++++++++++- .../resources/assets/gtceu/lang/en_us.json | 275 +++++++++++++++++- .../gtceu/api/item/PipeBlockItem.java | 1 - .../api/item/component/IMaterialPartItem.java | 6 +- .../api/recipe/category/GTRecipeCategory.java | 2 +- .../gtceu/client/TooltipsHandler.java | 2 +- .../gtceu/common/block/BatteryBlock.java | 4 +- .../gtceu/common/block/CoilBlock.java | 18 +- .../gtceu/common/block/FluidPipeBlock.java | 3 +- .../gtceu/common/data/GTMachines.java | 12 +- .../common/data/machines/GTMachineUtils.java | 17 +- .../item/armor/AdvancedNanoMuscleSuite.java | 3 +- .../item/armor/AdvancedQuarkTechSuite.java | 3 +- .../common/item/armor/NanoMuscleSuite.java | 9 +- .../common/item/armor/NightvisionGoggles.java | 6 +- .../common/item/armor/QuarkTechSuite.java | 10 +- .../gtceu/data/lang/ArmorLang.java | 17 +- .../gtceu/data/lang/BlockLang.java | 24 +- .../gtceu/data/lang/ConfigurationLang.java | 4 +- .../gregtechceu/gtceu/data/lang/ItemLang.java | 3 - .../gtceu/data/lang/MachineLang.java | 58 +++- .../gtceu/data/lang/RecipeLang.java | 1 + 22 files changed, 653 insertions(+), 100 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 2bc86562c4a..2b3be57c69c 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -1155,8 +1155,8 @@ "block.gtceu.stripped_rubber_log": "boꞀ ɹǝqqnᴚ pǝddıɹʇS", "block.gtceu.stripped_rubber_wood": "pooM ɹǝqqnᴚ pǝddıɹʇS", "block.gtceu.sturdy_machine_casing": "buısɐƆ ǝuıɥɔɐW Ǝ-SSH ʎpɹnʇS", - "block.gtceu.substation_capacitor.tooltip_empty": "uoıʇɐʇsqnS ɹǝʍoԀ ɹnoʎ uı ǝɔɐds buıןןıɟ ɹoℲㄥ§", - "block.gtceu.substation_capacitor.tooltip_filled": "∩Ǝ %dɟ§ :ʎʇıɔɐdɐƆ ʎbɹǝuƎɔ§", + "block.gtceu.substation_capacitor.tooltip.empty": "uoıʇɐʇsqnS ɹǝʍoԀ ɹnoʎ uı ǝɔɐds buıןןıɟ ɹoℲㄥ§", + "block.gtceu.substation_capacitor.tooltip.filled": "∩Ǝ %dɟ§ :ʎʇıɔɐdɐƆ ʎbɹǝuƎɔ§", "block.gtceu.superconducting_coil": "ʞɔoןᗺ ןıoƆ buıʇɔnpuoɔɹǝdnS", "block.gtceu.tempered_glass": "ssɐן⅁ pǝɹǝdɯǝ⟘", "block.gtceu.the_end_marker": "puƎ ǝɥ⟘", @@ -1635,15 +1635,15 @@ "block.gtceu.white_large_metal_sheet": "ʇǝǝɥS ןɐʇǝW ǝbɹɐꞀ ǝʇıɥM", "block.gtceu.white_metal_sheet": "ʇǝǝɥS ןɐʇǝW ǝʇıɥM", "block.gtceu.white_studs": "spnʇS ǝʇıɥM", - "block.gtceu.wire_coil.tooltip_cracking": ":ʇıu∩ buıʞɔɐɹƆ8§", - "block.gtceu.wire_coil.tooltip_energy_cracking": "%s%%ɟ§ :ǝbɐs∩ ʎbɹǝuƎɐ§ ", - "block.gtceu.wire_coil.tooltip_energy_smelter": "ǝdıɔǝɹ ɹǝd8§ ʇ/∩Ǝ %sɟ§ :ǝbɐs∩ ʎbɹǝuƎɐ§ ", - "block.gtceu.wire_coil.tooltip_extended_info": "oɟuI snuoᗺ ןıoƆ ʍoɥs oʇ ⟘ℲIHS pןoHㄥ§", - "block.gtceu.wire_coil.tooltip_heat": "ʞ %dɟ§ :ʎʇıɔɐdɐƆ ʇɐǝH ǝsɐᗺɔ§", - "block.gtceu.wire_coil.tooltip_parallel_smelter": "%sɟ§ :ןǝןןɐɹɐԀ xɐWϛ§ ", - "block.gtceu.wire_coil.tooltip_pyro": ":uǝʌO ǝsʎןoɹʎԀ8§", - "block.gtceu.wire_coil.tooltip_smelter": ":ɹǝʇןǝɯS ıʇןnW8§", - "block.gtceu.wire_coil.tooltip_speed_pyro": "%s%%ɟ§ :pǝǝdS buıssǝɔoɹԀq§ ", + "block.gtceu.wire_coil.tooltip.cracking": ":ʇıu∩ buıʞɔɐɹƆ8§", + "block.gtceu.wire_coil.tooltip.energy_cracking": "%s%%ɟ§ :ǝbɐs∩ ʎbɹǝuƎɐ§ ", + "block.gtceu.wire_coil.tooltip.energy_smelter": "ǝdıɔǝɹ ɹǝd8§ ʇ/∩Ǝ %sɟ§ :ǝbɐs∩ ʎbɹǝuƎɐ§ ", + "block.gtceu.wire_coil.tooltip.extended_info": "oɟuI snuoᗺ ןıoƆ ʍoɥs oʇ ⟘ℲIHS pןoHㄥ§", + "block.gtceu.wire_coil.tooltip.heat": "ʞ %dɟ§ :ʎʇıɔɐdɐƆ ʇɐǝH ǝsɐᗺɔ§", + "block.gtceu.wire_coil.tooltip.parallel_smelter": "%sɟ§ :ןǝןןɐɹɐԀ xɐWϛ§ ", + "block.gtceu.wire_coil.tooltip.pyro": ":uǝʌO ǝsʎןoɹʎԀ8§", + "block.gtceu.wire_coil.tooltip.smelter": ":ɹǝʇןǝɯS ıʇןnW8§", + "block.gtceu.wire_coil.tooltip.speed_pyro": "%s%%ɟ§ :pǝǝdS buıssǝɔoɹԀq§ ", "block.gtceu.wood_crate": "ǝʇɐɹƆ uǝpooM", "block.gtceu.wood_drum": "ןǝɹɹɐᗺ uǝpooM", "block.gtceu.wood_wall": "ןןɐM pooM", @@ -2538,7 +2538,6 @@ "gtceu.machine.cleanroom.tooltip.hold_ctrl": "uoıʇɐɯɹoɟuI ǝɹnʇɔnɹʇS ןɐuoıʇıppɐ ʍoɥs oʇ Ꞁᴚ⟘Ɔ pןoH", "gtceu.machine.coke_oven.tooltip": "ɹǝʍoԀ puɐ ןǝǝʇS ɹoɟ sןǝnɟ ɹǝʇʇǝq buıʞɐW", "gtceu.machine.coke_oven_hatch.tooltip": "˙uǝʌO ǝʞoƆ ǝɥʇ ɹoɟ ssǝɔɔɐ uoıʇɐɯoʇnɐ sʍoןןⱯㄥ§", - "gtceu.machine.combustion_generator.tooltip": "spınbıꞀ ǝןqɐɯɯɐןɟ sǝɹınbǝᴚㄥ§", "gtceu.machine.computation_receiver_hatch.tooltip": "sʞɔoןqıʇןnW ɹoɟ ʇnduI ɐʇɐᗡ uoıʇɐʇndɯoƆ", "gtceu.machine.computation_transmitter_hatch.tooltip": "sʞɔoןqıʇןnW ɹoɟ ʇndʇnO ɐʇɐᗡ uoıʇɐʇndɯoƆ", "gtceu.machine.cracker.tooltip": "ןnɟǝsn ןıO sǝʞɐW", @@ -2635,7 +2634,6 @@ "gtceu.machine.fusion_reactor.overclocking": "˙uoıʇɐɹnp ǝʌןɐɥ puɐ ʎbɹǝuǝ ǝןqnop sʞɔoןɔɹǝʌO", "gtceu.machine.fusion_reactor.uv.tooltip": "ƎSⱯᗺ ᴚ∩Oʎ NO NMOᗡ ℲᴚⱯMᗡ Ǝ⟘IHM Ɐ", "gtceu.machine.fusion_reactor.zpm.tooltip": "H⟘ᴚⱯƎ NO NMOᗡ N∩S Ɐ", - "gtceu.machine.gas_turbine.tooltip": "sǝsɐ⅁ ǝןqɐɯɯɐןɟ sǝɹınbǝᴚㄥ§", "gtceu.machine.high_performance_computation_array.tooltip.0": "ɹǝʇndɯoɔɹǝdnS ǝbɐɹǝʌɐ ɹnoʎ ʇsnſ", "gtceu.machine.high_performance_computation_array.tooltip.1": "˙)ʇɐǝɥ puɐ( ㄥ§uoıʇɐʇndɯoƆɟ§ ǝʇɐɹǝuǝb oʇ pǝs∩", "gtceu.machine.high_performance_computation_array.tooltip.2": "˙)sʇıu∩ ʞɹoM ǝʇndɯoƆ( ㄥ§ʇ/∩MƆɟ§ ǝʇɐɹǝuǝb oʇ sʇuǝuodɯoɔ ⱯƆԀH sǝɹınbǝᴚ", @@ -2878,6 +2876,36 @@ "gtceu.machine.maintenance_hatch_full_auto.tooltip": "sʞɔoןqıʇןnW buıuıɐʇuıɐɯ ʎןןɐɔıʇɐɯoʇnɐ ɹoℲ", "gtceu.machine.maintenance_hatch_tape_slot.tooltip": "sɯǝןqoɹd ʇuǝʌǝɹd oʇ ǝdɐ⟘ ʇɹǝsuI", "gtceu.machine.maintenance_hatch_tool_slot.tooltip": "sɯǝןqoɹd ǝʌןos oʇ ʎɹoʇuǝʌuı uı ǝɹɐ sןooʇ pǝɹınbǝɹ uǝɥʍ puɐɥ ʎʇdɯǝ ɥʇıʍ ʇoןs ʞɔıןƆ", + "gtceu.machine.max_alloy_smelter.tooltip": "ɹoʇɐɯɐbןɐɯⱯ ןɐʇǝWㄥ§", + "gtceu.machine.max_arc_furnace.tooltip": "ɹǝʇɐǝH ʇınɔɹıƆ ʇɹoɥSㄥ§", + "gtceu.machine.max_assembler.tooltip": "ɹoʇɔnɹʇsuoƆ ʎןqɯǝssⱯㄥ§", + "gtceu.machine.max_autoclave.tooltip": "ʇıu∩ ǝɔuɐɹqɯnɔuƎㄥ§", + "gtceu.machine.max_bender.tooltip": "ɹǝɯɹoɟǝᗡ ɹǝʇʇɐWㄥ§", + "gtceu.machine.max_brewery.tooltip": "ɹǝɥsnᴚ ʍǝɹᗺㄥ§", + "gtceu.machine.max_canner.tooltip": "ɹoʇɐnʇɔⱯ uɐƆㄥ§", + "gtceu.machine.max_chemical_bath.tooltip": "uoɹʇʞunᗡ ןɐɔıɯǝɥƆㄥ§", + "gtceu.machine.max_chemical_reactor.tooltip": "ɹǝzʎןɐʇɐƆ uoıʇɔɐǝᴚㄥ§", + "gtceu.machine.max_circuit_assembler.tooltip": "ʎɹoʇɔɐℲ uoıʇɐʇndɯoƆㄥ§", + "gtceu.machine.max_compressor.tooltip": "ɹoʇɔıɹʇsuoƆ ɹǝʇʇɐWㄥ§", + "gtceu.machine.max_cutter.tooltip": "ɹǝpıʌıᗡ ʇɔǝظqOㄥ§", + "gtceu.machine.max_distillery.tooltip": "ɹǝʇʇıןdS uoıʇɔɐɹℲㄥ§", + "gtceu.machine.max_electric_furnace.tooltip": "ɹoʇɐןnɯıʇS ɯoʇⱯㄥ§", + "gtceu.machine.max_electromagnetic_separator.tooltip": "ɹǝןןǝdsıᗡ ℲWƎㄥ§", + "gtceu.machine.max_extractor.tooltip": "ɹǝʞɔnS buıʎɟǝnbıꞀㄥ§", + "gtceu.machine.max_extruder.tooltip": "ɹǝʌıɹᗡ ǝdɐɥSㄥ§", + "gtceu.machine.max_fermenter.tooltip": "ɹǝןןoɹʇuoƆ uoıʇɐɹıdsǝᴚㄥ§", + "gtceu.machine.max_fluid_heater.tooltip": "ɹǝnqɯI ןɐɯɹǝɥ⟘ㄥ§", + "gtceu.machine.max_fluid_solidifier.tooltip": "ɹoʇɐɔıɟıɹʇǝԀ pınןℲㄥ§", + "gtceu.machine.max_forge_hammer.tooltip": "ɹoʇɐןnpoW ʇɔɐdɯIㄥ§", + "gtceu.machine.max_forming_press.tooltip": "ɹǝʇɟıɥS ǝɔɐɟɹnSㄥ§", + "gtceu.machine.max_mass_fabricator.tooltip": "ɹoʇɐıʇıuI ǝɔuǝʇsıxƎㄥ§", + "gtceu.machine.max_mixer.tooltip": "ɹǝzıuǝboɯoH ןɐıɹǝʇɐWㄥ§", + "gtceu.machine.max_packer.tooltip": "ǝsnoɥǝɹɐM uozɐɯⱯㄥ§", + "gtceu.machine.max_polarizer.tooltip": "ɹǝbuɐɹɹɐǝᴚ pןǝıℲ ɔıʇǝubɐWㄥ§", + "gtceu.machine.max_replicator.tooltip": "ɹǝsodɯoƆ ןɐʇuǝɯǝןƎㄥ§", + "gtceu.machine.max_scanner.tooltip": "ǝdoɔsoɹɔıW uoɹʇɔǝןƎㄥ§", + "gtceu.machine.max_sifter.tooltip": "ɹǝʇןıℲ uoıʇɐsןnԀㄥ§", + "gtceu.machine.max_wiremill.tooltip": "ɹoʇɐɹnbıɟsuɐɹ⟘ ǝɹıMㄥ§", "gtceu.machine.me.copy_paste.tooltip": "ʎןddɐ oʇ ʞɔıןɔ-ʇɥbıɹ 'sbuıʇʇǝs ʎdoɔ oʇ ʞɔıʇS ɐʇɐᗡ ɥʇıʍ ʞɔıןɔ-ʇɥbıɹ ʞɐǝuS", "gtceu.machine.me.export.tooltip": "˙ʞɹoʍʇǝu ƎW oʇ buıʇɔǝuuoɔ ǝɹoɟǝq ʎʇıɔɐdɐɔ ǝʇıuıɟuı sɐH", "gtceu.machine.me.fluid_export.tooltip": "˙ʞɹoʍʇǝu ƎW uɐ oʇuı ʎןʇɔǝɹıp spınןɟ sǝɹoʇS", @@ -2961,8 +2989,45 @@ "gtceu.machine.network_switch.tooltip.2": "˙ㄥ§sɹǝʇʇıɯsuɐɹ⟘ɟ§ uoıʇɐʇndɯoƆ ɟo ɹǝqɯnu ʎuɐ oʇuı ㄥ§sɹǝʌıǝɔǝᴚɟ§ uoıʇɐʇndɯoƆ ɟo ɹǝqɯnu ʎuɐ ǝuıqɯoɔ uɐƆ", "gtceu.machine.network_switch.tooltip.3": "˙ɥɔʇɐH ɐʇɐᗡ uoıʇɐʇndɯoƆ ɹǝd ㄥ§ʇ/∩Ǝ %sɟ§ sǝs∩", "gtceu.machine.object_holder.tooltip": "uoıʇɐʇS ɥɔɹɐǝsǝᴚ ɹoɟ ɯsıuɐɥɔǝW buıpןoH pǝɔuɐʌpⱯ", + "gtceu.machine.opv_alloy_smelter.tooltip": "ɹoʇɐɯɐbןɐɯⱯ ןɐʇǝWㄥ§", + "gtceu.machine.opv_arc_furnace.tooltip": "ɹǝʇɐǝH ʇınɔɹıƆ ʇɹoɥSㄥ§", + "gtceu.machine.opv_assembler.tooltip": "ɹoʇɔnɹʇsuoƆ ʎןqɯǝssⱯㄥ§", + "gtceu.machine.opv_autoclave.tooltip": "ʇıu∩ ǝɔuɐɹqɯnɔuƎㄥ§", + "gtceu.machine.opv_bender.tooltip": "ɹǝɯɹoɟǝᗡ ɹǝʇʇɐWㄥ§", + "gtceu.machine.opv_brewery.tooltip": "ɹǝɥsnᴚ ʍǝɹᗺㄥ§", + "gtceu.machine.opv_canner.tooltip": "ɹoʇɐnʇɔⱯ uɐƆㄥ§", + "gtceu.machine.opv_centrifuge.tooltip": "opɐuɹo⟘ ɹɐןnɔǝןoWㄥ§", + "gtceu.machine.opv_chemical_bath.tooltip": "uoɹʇʞunᗡ ןɐɔıɯǝɥƆㄥ§", + "gtceu.machine.opv_chemical_reactor.tooltip": "ɹǝzʎןɐʇɐƆ uoıʇɔɐǝᴚㄥ§", + "gtceu.machine.opv_circuit_assembler.tooltip": "ʎɹoʇɔɐℲ uoıʇɐʇndɯoƆㄥ§", + "gtceu.machine.opv_compressor.tooltip": "ɹoʇɔıɹʇsuoƆ ɹǝʇʇɐWㄥ§", + "gtceu.machine.opv_cutter.tooltip": "ɹǝpıʌıᗡ ʇɔǝظqOㄥ§", + "gtceu.machine.opv_distillery.tooltip": "ɹǝʇʇıןdS uoıʇɔɐɹℲㄥ§", + "gtceu.machine.opv_electric_furnace.tooltip": "ɹoʇɐןnɯıʇS ɯoʇⱯㄥ§", + "gtceu.machine.opv_electrolyzer.tooltip": "ɹǝzıuoI ɔıɯoʇⱯㄥ§", + "gtceu.machine.opv_electromagnetic_separator.tooltip": "ɹǝןןǝdsıᗡ ℲWƎㄥ§", + "gtceu.machine.opv_extractor.tooltip": "ɹǝʞɔnS buıʎɟǝnbıꞀㄥ§", + "gtceu.machine.opv_extruder.tooltip": "ɹǝʌıɹᗡ ǝdɐɥSㄥ§", + "gtceu.machine.opv_fermenter.tooltip": "ɹǝןןoɹʇuoƆ uoıʇɐɹıdsǝᴚㄥ§", + "gtceu.machine.opv_fluid_heater.tooltip": "ɹǝnqɯI ןɐɯɹǝɥ⟘ㄥ§", + "gtceu.machine.opv_fluid_solidifier.tooltip": "ɹoʇɐɔıɟıɹʇǝԀ pınןℲㄥ§", + "gtceu.machine.opv_forge_hammer.tooltip": "ɹoʇɐןnpoW ʇɔɐdɯIㄥ§", + "gtceu.machine.opv_forming_press.tooltip": "ɹǝʇɟıɥS ǝɔɐɟɹnSㄥ§", "gtceu.machine.opv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ǝsɹǝʌıun ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", + "gtceu.machine.opv_laser_engraver.tooltip": "uouuɐƆ uoʇoɥԀ ʇɔɐxƎㄥ§", + "gtceu.machine.opv_lathe.tooltip": "ɹǝpuıɹ⅁ uoıʇɐʇoᴚㄥ§", + "gtceu.machine.opv_macerator.tooltip": "ɹoʇɐuıɯıןƎ ǝdɐɥSㄥ§", + "gtceu.machine.opv_mass_fabricator.tooltip": "ɹoʇɐıʇıuI ǝɔuǝʇsıxƎㄥ§", + "gtceu.machine.opv_mixer.tooltip": "ɹǝzıuǝboɯoH ןɐıɹǝʇɐWㄥ§", + "gtceu.machine.opv_ore_washer.tooltip": "ɥsɐM ɹɐƆ ǝɹnʇɐıuıWㄥ§", + "gtceu.machine.opv_packer.tooltip": "ǝsnoɥǝɹɐM uozɐɯⱯㄥ§", + "gtceu.machine.opv_polarizer.tooltip": "ɹǝbuɐɹɹɐǝᴚ pןǝıℲ ɔıʇǝubɐWㄥ§", + "gtceu.machine.opv_replicator.tooltip": "ɹǝsodɯoƆ ןɐʇuǝɯǝןƎㄥ§", "gtceu.machine.opv_rock_crusher.tooltip": "ɹǝqɯɐɥƆ uoıʇɐɯɹoℲ ɔıuɐɔןoΛㄥ§", + "gtceu.machine.opv_scanner.tooltip": "ǝdoɔsoɹɔıW uoɹʇɔǝןƎㄥ§", + "gtceu.machine.opv_sifter.tooltip": "ɹǝʇןıℲ uoıʇɐsןnԀㄥ§", + "gtceu.machine.opv_thermal_centrifuge.tooltip": "ǝuoןɔʎƆ ǝɹıℲㄥ§", + "gtceu.machine.opv_wiremill.tooltip": "ɹoʇɐɹnbıɟsuɐɹ⟘ ǝɹıMㄥ§", "gtceu.machine.parallel_hatch.display": "ʞɔoןqıʇןnɯ ǝɥʇ ɟo ןǝןןɐɹɐd ɯnɯıxɐɯ ǝɥʇ ʇsnظpⱯ", "gtceu.machine.parallel_hatch_mk5.tooltip": "˙ןǝןןɐɹɐd uı sǝdıɔǝɹ ㄣ oʇ dn unɹ oʇ sʍoןןⱯ", "gtceu.machine.parallel_hatch_mk6.tooltip": "˙ןǝןןɐɹɐd uı sǝdıɔǝɹ 9Ɩ oʇ dn unɹ oʇ sʍoןןⱯ", @@ -3002,22 +3067,162 @@ "gtceu.machine.steam_bus.tooltip": "sʞɔoןqıʇןnɯ ɯɐǝʇs-uou ɥʇıʍ ʞɹoʍ ʇou sǝoᗡ", "gtceu.machine.steam_grinder.tooltip": "sʇɔnpoɹdʎᗺ ǝɥʇ ʇnoɥʇıʍ ɹoʇɐɹǝɔɐW ʞɔoןqıʇןnɯ Ɐ", "gtceu.machine.steam_oven.tooltip": "ɹǝʇןǝɯS-ıʇןnW ɥʇıʍ pǝsnɟuoɔ ǝq oʇ ʇoN", - "gtceu.machine.steam_turbine.tooltip": "∩Ǝ oʇuı ɯɐǝʇS sʇɹǝʌuoƆㄥ§", "gtceu.machine.substation_hatch.input.tooltip": "uoıʇɐʇsqnS ɹǝʍoԀ ǝɥʇ ɹoɟ ʇnduI ʎbɹǝuƎ", "gtceu.machine.substation_hatch.output.tooltip": "uoıʇɐʇsqnS ɹǝʍoԀ ǝɥʇ ɹoɟ ʇndʇnO ʎbɹǝuƎ", "gtceu.machine.tank_valve.tooltip": "˙uʍop buıɔɐɟ uǝɥʍ sʇndʇno oʇnⱯ ˙sʞuɐʇ ʞɔoןqıʇןnɯ uıɐɹp puɐ ןןıɟ oʇ ǝs∩", "gtceu.machine.transformer.description": "sɹǝıʇ ǝbɐʇןoʌ uǝǝʍʇǝq ʎbɹǝuƎ sɯɹoɟsuɐɹ⟘ㄥ§", "gtceu.machine.transformer.message_transform_down": "Ɐ%d ∩Ǝ %s :ʇnO 'Ɐ%d ∩Ǝ %s :uI 'uʍoᗡ buıɯɹoɟsuɐɹ⟘", "gtceu.machine.transformer.message_transform_up": "Ɐ%d ∩Ǝ %s :ʇnO 'Ɐ%d ∩Ǝ %s :uI 'd∩ buıɯɹoɟsuɐɹ⟘", - "gtceu.machine.transformer.tooltip_tool_usage": "ǝbuɐɥɔ oʇ ɹǝʌıɹpʍǝɹɔS ǝsn 'ㄥ§uʍoᗡ ɯɹoɟsuɐɹ⟘ɟ§ sɐ sʇɹɐʇS", + "gtceu.machine.transformer.tooltip_tool_usage": "ǝbuɐɥɔ oʇ ɹǝʌıɹpʍǝɹɔS ǝsn 'ㄥ§uʍoᗡ ɯɹoɟsuɐɹ⟘ɟ§ sɐ sʇɹɐʇSㄥ§", "gtceu.machine.transformer.tooltip_transform_down": ")ɟ§%s( ∩Ǝ %s Ɐ%d >- )ɟ§%s( ∩Ǝ %s Ɐ%dɟ§ :uʍoᗡ ɯɹoɟsuɐɹ⟘ɐ§", "gtceu.machine.transformer.tooltip_transform_up": ")ɟ§%s( ∩Ǝ %s Ɐ%d >- )ɟ§%s( ∩Ǝ %s Ɐ%dɟ§ :d∩ ɯɹoɟsuɐɹ⟘ɔ§", + "gtceu.machine.uev_alloy_smelter.tooltip": "ɹoʇɐɯɐbןɐɯⱯ ןɐʇǝWㄥ§", + "gtceu.machine.uev_arc_furnace.tooltip": "ɹǝʇɐǝH ʇınɔɹıƆ ʇɹoɥSㄥ§", + "gtceu.machine.uev_assembler.tooltip": "ɹoʇɔnɹʇsuoƆ ʎןqɯǝssⱯㄥ§", + "gtceu.machine.uev_autoclave.tooltip": "ʇıu∩ ǝɔuɐɹqɯnɔuƎㄥ§", + "gtceu.machine.uev_bender.tooltip": "ɹǝɯɹoɟǝᗡ ɹǝʇʇɐWㄥ§", + "gtceu.machine.uev_brewery.tooltip": "ɹǝɥsnᴚ ʍǝɹᗺㄥ§", + "gtceu.machine.uev_canner.tooltip": "ɹoʇɐnʇɔⱯ uɐƆㄥ§", + "gtceu.machine.uev_centrifuge.tooltip": "opɐuɹo⟘ ɹɐןnɔǝןoWㄥ§", + "gtceu.machine.uev_chemical_bath.tooltip": "uoɹʇʞunᗡ ןɐɔıɯǝɥƆㄥ§", + "gtceu.machine.uev_chemical_reactor.tooltip": "ɹǝzʎןɐʇɐƆ uoıʇɔɐǝᴚㄥ§", + "gtceu.machine.uev_circuit_assembler.tooltip": "ʎɹoʇɔɐℲ uoıʇɐʇndɯoƆㄥ§", + "gtceu.machine.uev_compressor.tooltip": "ɹoʇɔıɹʇsuoƆ ɹǝʇʇɐWㄥ§", + "gtceu.machine.uev_cutter.tooltip": "ɹǝpıʌıᗡ ʇɔǝظqOㄥ§", + "gtceu.machine.uev_distillery.tooltip": "ɹǝʇʇıןdS uoıʇɔɐɹℲㄥ§", + "gtceu.machine.uev_electric_furnace.tooltip": "ɹoʇɐןnɯıʇS ɯoʇⱯㄥ§", + "gtceu.machine.uev_electrolyzer.tooltip": "ɹǝzıuoI ɔıɯoʇⱯㄥ§", + "gtceu.machine.uev_electromagnetic_separator.tooltip": "ɹǝןןǝdsıᗡ ℲWƎㄥ§", + "gtceu.machine.uev_extractor.tooltip": "ɹǝʞɔnS buıʎɟǝnbıꞀㄥ§", + "gtceu.machine.uev_extruder.tooltip": "ɹǝʌıɹᗡ ǝdɐɥSㄥ§", + "gtceu.machine.uev_fermenter.tooltip": "ɹǝןןoɹʇuoƆ uoıʇɐɹıdsǝᴚㄥ§", + "gtceu.machine.uev_fluid_heater.tooltip": "ɹǝnqɯI ןɐɯɹǝɥ⟘ㄥ§", + "gtceu.machine.uev_fluid_solidifier.tooltip": "ɹoʇɐɔıɟıɹʇǝԀ pınןℲㄥ§", + "gtceu.machine.uev_forge_hammer.tooltip": "ɹoʇɐןnpoW ʇɔɐdɯIㄥ§", + "gtceu.machine.uev_forming_press.tooltip": "ɹǝʇɟıɥS ǝɔɐɟɹnSㄥ§", "gtceu.machine.uev_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɯǝʇsʎs ɹɐןos ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", + "gtceu.machine.uev_laser_engraver.tooltip": "uouuɐƆ uoʇoɥԀ ʇɔɐxƎㄥ§", + "gtceu.machine.uev_lathe.tooltip": "ɹǝpuıɹ⅁ uoıʇɐʇoᴚㄥ§", + "gtceu.machine.uev_macerator.tooltip": "ɹoʇɐuıɯıןƎ ǝdɐɥSㄥ§", + "gtceu.machine.uev_mass_fabricator.tooltip": "ɹoʇɐıʇıuI ǝɔuǝʇsıxƎㄥ§", + "gtceu.machine.uev_mixer.tooltip": "ɹǝzıuǝboɯoH ןɐıɹǝʇɐWㄥ§", + "gtceu.machine.uev_ore_washer.tooltip": "ɥsɐM ɹɐƆ ǝɹnʇɐıuıWㄥ§", + "gtceu.machine.uev_packer.tooltip": "ǝsnoɥǝɹɐM uozɐɯⱯㄥ§", + "gtceu.machine.uev_polarizer.tooltip": "ɹǝbuɐɹɹɐǝᴚ pןǝıℲ ɔıʇǝubɐWㄥ§", + "gtceu.machine.uev_replicator.tooltip": "ɹǝsodɯoƆ ןɐʇuǝɯǝןƎㄥ§", "gtceu.machine.uev_rock_crusher.tooltip": "ɹǝqɯɐɥƆ uoıʇɐɯɹoℲ ɔıuɐɔןoΛㄥ§", + "gtceu.machine.uev_scanner.tooltip": "ǝdoɔsoɹɔıW uoɹʇɔǝןƎㄥ§", + "gtceu.machine.uev_sifter.tooltip": "ɹǝʇןıℲ uoıʇɐsןnԀㄥ§", + "gtceu.machine.uev_thermal_centrifuge.tooltip": "ǝuoןɔʎƆ ǝɹıℲㄥ§", + "gtceu.machine.uev_wiremill.tooltip": "ɹoʇɐɹnbıɟsuɐɹ⟘ ǝɹıMㄥ§", + "gtceu.machine.uhv_alloy_smelter.tooltip": "ɹoʇɐɯɐbןɐɯⱯ ןɐʇǝWㄥ§", + "gtceu.machine.uhv_arc_furnace.tooltip": "ɹǝʇɐǝH ʇınɔɹıƆ ʇɹoɥSㄥ§", + "gtceu.machine.uhv_assembler.tooltip": "ɹoʇɔnɹʇsuoƆ ʎןqɯǝssⱯㄥ§", + "gtceu.machine.uhv_autoclave.tooltip": "ʇıu∩ ǝɔuɐɹqɯnɔuƎㄥ§", + "gtceu.machine.uhv_bender.tooltip": "ɹǝɯɹoɟǝᗡ ɹǝʇʇɐWㄥ§", + "gtceu.machine.uhv_brewery.tooltip": "ɹǝɥsnᴚ ʍǝɹᗺㄥ§", + "gtceu.machine.uhv_canner.tooltip": "ɹoʇɐnʇɔⱯ uɐƆㄥ§", + "gtceu.machine.uhv_centrifuge.tooltip": "opɐuɹo⟘ ɹɐןnɔǝןoWㄥ§", + "gtceu.machine.uhv_chemical_bath.tooltip": "uoɹʇʞunᗡ ןɐɔıɯǝɥƆㄥ§", + "gtceu.machine.uhv_chemical_reactor.tooltip": "ɹǝzʎןɐʇɐƆ uoıʇɔɐǝᴚㄥ§", + "gtceu.machine.uhv_circuit_assembler.tooltip": "ʎɹoʇɔɐℲ uoıʇɐʇndɯoƆㄥ§", + "gtceu.machine.uhv_compressor.tooltip": "ɹoʇɔıɹʇsuoƆ ɹǝʇʇɐWㄥ§", + "gtceu.machine.uhv_cutter.tooltip": "ɹǝpıʌıᗡ ʇɔǝظqOㄥ§", + "gtceu.machine.uhv_distillery.tooltip": "ɹǝʇʇıןdS uoıʇɔɐɹℲㄥ§", + "gtceu.machine.uhv_electric_furnace.tooltip": "ɹoʇɐןnɯıʇS ɯoʇⱯㄥ§", + "gtceu.machine.uhv_electrolyzer.tooltip": "ɹǝzıuoI ɔıɯoʇⱯㄥ§", + "gtceu.machine.uhv_electromagnetic_separator.tooltip": "ɹǝןןǝdsıᗡ ℲWƎㄥ§", + "gtceu.machine.uhv_extractor.tooltip": "ɹǝʞɔnS buıʎɟǝnbıꞀㄥ§", + "gtceu.machine.uhv_extruder.tooltip": "ɹǝʌıɹᗡ ǝdɐɥSㄥ§", + "gtceu.machine.uhv_fermenter.tooltip": "ɹǝןןoɹʇuoƆ uoıʇɐɹıdsǝᴚㄥ§", + "gtceu.machine.uhv_fluid_heater.tooltip": "ɹǝnqɯI ןɐɯɹǝɥ⟘ㄥ§", + "gtceu.machine.uhv_fluid_solidifier.tooltip": "ɹoʇɐɔıɟıɹʇǝԀ pınןℲㄥ§", + "gtceu.machine.uhv_forge_hammer.tooltip": "ɹoʇɐןnpoW ʇɔɐdɯIㄥ§", + "gtceu.machine.uhv_forming_press.tooltip": "ɹǝʇɟıɥS ǝɔɐɟɹnSㄥ§", "gtceu.machine.uhv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɯǝʇsʎs ɹɐןos ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", + "gtceu.machine.uhv_laser_engraver.tooltip": "uouuɐƆ uoʇoɥԀ ʇɔɐxƎㄥ§", + "gtceu.machine.uhv_lathe.tooltip": "ɹǝpuıɹ⅁ uoıʇɐʇoᴚㄥ§", + "gtceu.machine.uhv_macerator.tooltip": "ɹoʇɐuıɯıןƎ ǝdɐɥSㄥ§", + "gtceu.machine.uhv_mass_fabricator.tooltip": "ɹoʇɐıʇıuI ǝɔuǝʇsıxƎㄥ§", + "gtceu.machine.uhv_mixer.tooltip": "ɹǝzıuǝboɯoH ןɐıɹǝʇɐWㄥ§", + "gtceu.machine.uhv_ore_washer.tooltip": "ɥsɐM ɹɐƆ ǝɹnʇɐıuıWㄥ§", + "gtceu.machine.uhv_packer.tooltip": "ǝsnoɥǝɹɐM uozɐɯⱯㄥ§", + "gtceu.machine.uhv_polarizer.tooltip": "ɹǝbuɐɹɹɐǝᴚ pןǝıℲ ɔıʇǝubɐWㄥ§", + "gtceu.machine.uhv_replicator.tooltip": "ɹǝsodɯoƆ ןɐʇuǝɯǝןƎㄥ§", "gtceu.machine.uhv_rock_crusher.tooltip": "ɹǝqɯɐɥƆ uoıʇɐɯɹoℲ ɔıuɐɔןoΛㄥ§", + "gtceu.machine.uhv_scanner.tooltip": "ǝdoɔsoɹɔıW uoɹʇɔǝןƎㄥ§", + "gtceu.machine.uhv_sifter.tooltip": "ɹǝʇןıℲ uoıʇɐsןnԀㄥ§", + "gtceu.machine.uhv_thermal_centrifuge.tooltip": "ǝuoןɔʎƆ ǝɹıℲㄥ§", + "gtceu.machine.uhv_wiremill.tooltip": "ɹoʇɐɹnbıɟsuɐɹ⟘ ǝɹıMㄥ§", + "gtceu.machine.uiv_alloy_smelter.tooltip": "ɹoʇɐɯɐbןɐɯⱯ ןɐʇǝWㄥ§", + "gtceu.machine.uiv_arc_furnace.tooltip": "ɹǝʇɐǝH ʇınɔɹıƆ ʇɹoɥSㄥ§", + "gtceu.machine.uiv_assembler.tooltip": "ɹoʇɔnɹʇsuoƆ ʎןqɯǝssⱯㄥ§", + "gtceu.machine.uiv_autoclave.tooltip": "ʇıu∩ ǝɔuɐɹqɯnɔuƎㄥ§", + "gtceu.machine.uiv_bender.tooltip": "ɹǝɯɹoɟǝᗡ ɹǝʇʇɐWㄥ§", + "gtceu.machine.uiv_brewery.tooltip": "ɹǝɥsnᴚ ʍǝɹᗺㄥ§", + "gtceu.machine.uiv_canner.tooltip": "ɹoʇɐnʇɔⱯ uɐƆㄥ§", + "gtceu.machine.uiv_centrifuge.tooltip": "opɐuɹo⟘ ɹɐןnɔǝןoWㄥ§", + "gtceu.machine.uiv_chemical_bath.tooltip": "uoɹʇʞunᗡ ןɐɔıɯǝɥƆㄥ§", + "gtceu.machine.uiv_chemical_reactor.tooltip": "ɹǝzʎןɐʇɐƆ uoıʇɔɐǝᴚㄥ§", + "gtceu.machine.uiv_circuit_assembler.tooltip": "ʎɹoʇɔɐℲ uoıʇɐʇndɯoƆㄥ§", + "gtceu.machine.uiv_compressor.tooltip": "ɹoʇɔıɹʇsuoƆ ɹǝʇʇɐWㄥ§", + "gtceu.machine.uiv_cutter.tooltip": "ɹǝpıʌıᗡ ʇɔǝظqOㄥ§", + "gtceu.machine.uiv_distillery.tooltip": "ɹǝʇʇıןdS uoıʇɔɐɹℲㄥ§", + "gtceu.machine.uiv_electric_furnace.tooltip": "ɹoʇɐןnɯıʇS ɯoʇⱯㄥ§", + "gtceu.machine.uiv_electrolyzer.tooltip": "ɹǝzıuoI ɔıɯoʇⱯㄥ§", + "gtceu.machine.uiv_electromagnetic_separator.tooltip": "ɹǝןןǝdsıᗡ ℲWƎㄥ§", + "gtceu.machine.uiv_extractor.tooltip": "ɹǝʞɔnS buıʎɟǝnbıꞀㄥ§", + "gtceu.machine.uiv_extruder.tooltip": "ɹǝʌıɹᗡ ǝdɐɥSㄥ§", + "gtceu.machine.uiv_fermenter.tooltip": "ɹǝןןoɹʇuoƆ uoıʇɐɹıdsǝᴚㄥ§", + "gtceu.machine.uiv_fluid_heater.tooltip": "ɹǝnqɯI ןɐɯɹǝɥ⟘ㄥ§", + "gtceu.machine.uiv_fluid_solidifier.tooltip": "ɹoʇɐɔıɟıɹʇǝԀ pınןℲㄥ§", + "gtceu.machine.uiv_forge_hammer.tooltip": "ɹoʇɐןnpoW ʇɔɐdɯIㄥ§", + "gtceu.machine.uiv_forming_press.tooltip": "ɹǝʇɟıɥS ǝɔɐɟɹnSㄥ§", "gtceu.machine.uiv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɯǝʇsʎs ɹɐןos ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", + "gtceu.machine.uiv_laser_engraver.tooltip": "uouuɐƆ uoʇoɥԀ ʇɔɐxƎㄥ§", + "gtceu.machine.uiv_lathe.tooltip": "ɹǝpuıɹ⅁ uoıʇɐʇoᴚㄥ§", + "gtceu.machine.uiv_macerator.tooltip": "ɹoʇɐuıɯıןƎ ǝdɐɥSㄥ§", + "gtceu.machine.uiv_mass_fabricator.tooltip": "ɹoʇɐıʇıuI ǝɔuǝʇsıxƎㄥ§", + "gtceu.machine.uiv_mixer.tooltip": "ɹǝzıuǝboɯoH ןɐıɹǝʇɐWㄥ§", + "gtceu.machine.uiv_ore_washer.tooltip": "ɥsɐM ɹɐƆ ǝɹnʇɐıuıWㄥ§", + "gtceu.machine.uiv_packer.tooltip": "ǝsnoɥǝɹɐM uozɐɯⱯㄥ§", + "gtceu.machine.uiv_polarizer.tooltip": "ɹǝbuɐɹɹɐǝᴚ pןǝıℲ ɔıʇǝubɐWㄥ§", + "gtceu.machine.uiv_replicator.tooltip": "ɹǝsodɯoƆ ןɐʇuǝɯǝןƎㄥ§", "gtceu.machine.uiv_rock_crusher.tooltip": "ɹǝqɯɐɥƆ uoıʇɐɯɹoℲ ɔıuɐɔןoΛㄥ§", + "gtceu.machine.uiv_scanner.tooltip": "ǝdoɔsoɹɔıW uoɹʇɔǝןƎㄥ§", + "gtceu.machine.uiv_sifter.tooltip": "ɹǝʇןıℲ uoıʇɐsןnԀㄥ§", + "gtceu.machine.uiv_thermal_centrifuge.tooltip": "ǝuoןɔʎƆ ǝɹıℲㄥ§", + "gtceu.machine.uiv_wiremill.tooltip": "ɹoʇɐɹnbıɟsuɐɹ⟘ ǝɹıMㄥ§", + "gtceu.machine.ulv_alloy_smelter.tooltip": "ɹǝʇןǝɯS uoıʇɐuıqɯoɔ ɥɔǝ⟘ɥbıHㄥ§", + "gtceu.machine.ulv_arc_furnace.tooltip": "¿ǝɔɐuɹnℲ ʇsɐןᗺ ɐ spǝǝu oɥMㄥ§", + "gtceu.machine.ulv_assembler.tooltip": "¡ǝןqɯǝssⱯ 'sɹǝbuǝʌⱯㄥ§", + "gtceu.machine.ulv_autoclave.tooltip": "sʇsnᗡ ɹnoʎ buızıןןɐʇsʎɹƆㄥ§", + "gtceu.machine.ulv_bender.tooltip": "¡¡¡ᴚƎᗡNƎᗺ ʇuɐʍ ǝM ¡pɐq s,ǝɥ 'ooᗺㄥ§", + "gtceu.machine.ulv_brewery.tooltip": "buıʍǝɹq uoıʇod ʇuǝıɔıɟɟǝ puɐ ʇɔɐdɯoƆㄥ§", + "gtceu.machine.ulv_canner.tooltip": "sɹǝuıɐʇuoƆ ɟo ʇno puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", + "gtceu.machine.ulv_chemical_bath.tooltip": "ɯǝɥʇ ǝʇɐɹɐdǝs oʇ sןɐɔıɯǝɥƆ uı sǝɹO buıɥʇɐᗺㄥ§", + "gtceu.machine.ulv_chemical_reactor.tooltip": "ɹǝɥʇo ɥɔɐǝ ɥʇıʍ ʇɔɐǝɹ sןɐɔıɯǝɥƆ buıʇʇǝꞀㄥ§", + "gtceu.machine.ulv_circuit_assembler.tooltip": "ǝɔɐןd ǝɥʇ ɹǝʌo ןןɐ ǝɔɐןԀ-u-ʞɔıԀㄥ§", + "gtceu.machine.ulv_compressor.tooltip": "ㄥㄥƆ ɔıʇɐW-O-ssǝɹdɯoƆㄥ§", + "gtceu.machine.ulv_cutter.tooltip": "ǝɔıᗡ N,ǝɔıןSㄥ§", + "gtceu.machine.ulv_distillery.tooltip": "spınןℲ ɟo sʇɹɐԀ ʇuɐʌǝןǝɹ ʇsoɯ buıʇɔɐɹʇxƎㄥ§", + "gtceu.machine.ulv_electric_furnace.tooltip": "ㄣ9 ǝɹopoɯɯoƆ ɐ buısn ǝʞıן ʇoNㄥ§", + "gtceu.machine.ulv_electromagnetic_separator.tooltip": "ʇsǝɹ ǝɥʇ ɯoɹɟ sǝɹO ɔıʇǝubɐɯ ǝɥʇ buıʇɐɹɐdǝSㄥ§", + "gtceu.machine.ulv_extractor.tooltip": "ƐᄅƖᗡ - ɯooᗡ ɟo ǝɔıʌǝᗡ-ɹǝɔınظǝᗡㄥ§", + "gtceu.machine.ulv_extruder.tooltip": "buıʞɹoM ןɐʇǝW ɹoɟ ǝuıɥɔɐW ןɐsɹǝʌıu∩ㄥ§", + "gtceu.machine.ulv_fermenter.tooltip": "spınןℲ buıʇuǝɯɹǝℲㄥ§", + "gtceu.machine.ulv_fluid_heater.tooltip": "spınןℲ ɹnoʎ dn buıʇɐǝHㄥ§", + "gtceu.machine.ulv_fluid_solidifier.tooltip": "spıןoS ɯɹoɟ oʇ uʍop spınןℲ sןooƆㄥ§", + "gtceu.machine.ulv_forge_hammer.tooltip": "¡ǝɯıʇɹǝɯɯɐH 'doʇSㄥ§", + "gtceu.machine.ulv_forming_press.tooltip": "sbuıɥʇ oʇuı sǝbɐɯI buıʇuıɹdɯIㄥ§", + "gtceu.machine.ulv_mass_fabricator.tooltip": "pǝɹɐnbS uoıʇɐɔıɹqɐℲ * ɹǝʇʇɐW W∩∩ㄥ§", + "gtceu.machine.ulv_mixer.tooltip": "¿puǝןᗺ ʇı ןןıMㄥ§", + "gtceu.machine.ulv_packer.tooltip": "sǝxoᗺ ɟo ʇno sbuıɥʇ sqɐɹ⅁ puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", + "gtceu.machine.ulv_polarizer.tooltip": "sʇǝubɐW ɹnoʎ buısıɹɐןodıᗺㄥ§", + "gtceu.machine.ulv_replicator.tooltip": "sʇuǝɯǝןƎ ɟo ʇsǝɹnԀ ǝɥʇ buıɔnpoɹԀㄥ§", + "gtceu.machine.ulv_scanner.tooltip": "sbuıɥʇ ɹǝɥʇo puɐ sןɐıɹǝʇɐW suɐɔSㄥ§", + "gtceu.machine.ulv_sifter.tooltip": "buıʇɟıs dǝǝʞ puɐ ɯןɐɔ ʎɐʇSㄥ§", + "gtceu.machine.ulv_wiremill.tooltip": "ʎןʇuǝıɔıɟɟǝ ǝɹoɯ sǝɹıM sǝɔnpoɹԀㄥ§", "gtceu.machine.uv_alloy_smelter.tooltip": "ɹoʇɐɯɐbןɐɯⱯ ןɐʇǝWㄥ§", "gtceu.machine.uv_arc_furnace.tooltip": "ɹǝʇɐǝH ʇınɔɹıƆ ʇɹoɥSㄥ§", "gtceu.machine.uv_assembler.tooltip": "ɹoʇɔnɹʇsuoƆ ʎןqɯǝssⱯㄥ§", @@ -3057,8 +3262,45 @@ "gtceu.machine.uv_sifter.tooltip": "ɹǝʇןıℲ uoıʇɐsןnԀㄥ§", "gtceu.machine.uv_thermal_centrifuge.tooltip": "ǝuoןɔʎƆ ǝɹıℲㄥ§", "gtceu.machine.uv_wiremill.tooltip": "ɹoʇɐɹnbıɟsuɐɹ⟘ ǝɹıMㄥ§", + "gtceu.machine.uxv_alloy_smelter.tooltip": "ɹoʇɐɯɐbןɐɯⱯ ןɐʇǝWㄥ§", + "gtceu.machine.uxv_arc_furnace.tooltip": "ɹǝʇɐǝH ʇınɔɹıƆ ʇɹoɥSㄥ§", + "gtceu.machine.uxv_assembler.tooltip": "ɹoʇɔnɹʇsuoƆ ʎןqɯǝssⱯㄥ§", + "gtceu.machine.uxv_autoclave.tooltip": "ʇıu∩ ǝɔuɐɹqɯnɔuƎㄥ§", + "gtceu.machine.uxv_bender.tooltip": "ɹǝɯɹoɟǝᗡ ɹǝʇʇɐWㄥ§", + "gtceu.machine.uxv_brewery.tooltip": "ɹǝɥsnᴚ ʍǝɹᗺㄥ§", + "gtceu.machine.uxv_canner.tooltip": "ɹoʇɐnʇɔⱯ uɐƆㄥ§", + "gtceu.machine.uxv_centrifuge.tooltip": "opɐuɹo⟘ ɹɐןnɔǝןoWㄥ§", + "gtceu.machine.uxv_chemical_bath.tooltip": "uoɹʇʞunᗡ ןɐɔıɯǝɥƆㄥ§", + "gtceu.machine.uxv_chemical_reactor.tooltip": "ɹǝzʎןɐʇɐƆ uoıʇɔɐǝᴚㄥ§", + "gtceu.machine.uxv_circuit_assembler.tooltip": "ʎɹoʇɔɐℲ uoıʇɐʇndɯoƆㄥ§", + "gtceu.machine.uxv_compressor.tooltip": "ɹoʇɔıɹʇsuoƆ ɹǝʇʇɐWㄥ§", + "gtceu.machine.uxv_cutter.tooltip": "ɹǝpıʌıᗡ ʇɔǝظqOㄥ§", + "gtceu.machine.uxv_distillery.tooltip": "ɹǝʇʇıןdS uoıʇɔɐɹℲㄥ§", + "gtceu.machine.uxv_electric_furnace.tooltip": "ɹoʇɐןnɯıʇS ɯoʇⱯㄥ§", + "gtceu.machine.uxv_electrolyzer.tooltip": "ɹǝzıuoI ɔıɯoʇⱯㄥ§", + "gtceu.machine.uxv_electromagnetic_separator.tooltip": "ɹǝןןǝdsıᗡ ℲWƎㄥ§", + "gtceu.machine.uxv_extractor.tooltip": "ɹǝʞɔnS buıʎɟǝnbıꞀㄥ§", + "gtceu.machine.uxv_extruder.tooltip": "ɹǝʌıɹᗡ ǝdɐɥSㄥ§", + "gtceu.machine.uxv_fermenter.tooltip": "ɹǝןןoɹʇuoƆ uoıʇɐɹıdsǝᴚㄥ§", + "gtceu.machine.uxv_fluid_heater.tooltip": "ɹǝnqɯI ןɐɯɹǝɥ⟘ㄥ§", + "gtceu.machine.uxv_fluid_solidifier.tooltip": "ɹoʇɐɔıɟıɹʇǝԀ pınןℲㄥ§", + "gtceu.machine.uxv_forge_hammer.tooltip": "ɹoʇɐןnpoW ʇɔɐdɯIㄥ§", + "gtceu.machine.uxv_forming_press.tooltip": "ɹǝʇɟıɥS ǝɔɐɟɹnSㄥ§", "gtceu.machine.uxv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɯǝʇsʎs ɹɐןos ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", + "gtceu.machine.uxv_laser_engraver.tooltip": "uouuɐƆ uoʇoɥԀ ʇɔɐxƎㄥ§", + "gtceu.machine.uxv_lathe.tooltip": "ɹǝpuıɹ⅁ uoıʇɐʇoᴚㄥ§", + "gtceu.machine.uxv_macerator.tooltip": "ɹoʇɐuıɯıןƎ ǝdɐɥSㄥ§", + "gtceu.machine.uxv_mass_fabricator.tooltip": "ɹoʇɐıʇıuI ǝɔuǝʇsıxƎㄥ§", + "gtceu.machine.uxv_mixer.tooltip": "ɹǝzıuǝboɯoH ןɐıɹǝʇɐWㄥ§", + "gtceu.machine.uxv_ore_washer.tooltip": "ɥsɐM ɹɐƆ ǝɹnʇɐıuıWㄥ§", + "gtceu.machine.uxv_packer.tooltip": "ǝsnoɥǝɹɐM uozɐɯⱯㄥ§", + "gtceu.machine.uxv_polarizer.tooltip": "ɹǝbuɐɹɹɐǝᴚ pןǝıℲ ɔıʇǝubɐWㄥ§", + "gtceu.machine.uxv_replicator.tooltip": "ɹǝsodɯoƆ ןɐʇuǝɯǝןƎㄥ§", "gtceu.machine.uxv_rock_crusher.tooltip": "ɹǝqɯɐɥƆ uoıʇɐɯɹoℲ ɔıuɐɔןoΛㄥ§", + "gtceu.machine.uxv_scanner.tooltip": "ǝdoɔsoɹɔıW uoɹʇɔǝןƎㄥ§", + "gtceu.machine.uxv_sifter.tooltip": "ɹǝʇןıℲ uoıʇɐsןnԀㄥ§", + "gtceu.machine.uxv_thermal_centrifuge.tooltip": "ǝuoןɔʎƆ ǝɹıℲㄥ§", + "gtceu.machine.uxv_wiremill.tooltip": "ɹoʇɐɹnbıɟsuɐɹ⟘ ǝɹıMㄥ§", "gtceu.machine.vacuum_freezer.tooltip": "xoᗺ ǝɔI ɯnıuıɯnןⱯ", "gtceu.machine.workbench.storage_note.0": "pǝʇɔǝuuoɔ ɯoɹɟ sɯǝʇı ǝןqɐןıɐʌⱯ(", "gtceu.machine.workbench.storage_note.1": ")buıʇɟɐɹɔ ɹoɟ ǝןqɐsn sǝıɹoʇuǝʌuı", @@ -5305,6 +5547,7 @@ "recipe_type.gtceu.circuit_assembler": "ɹǝןqɯǝssⱯ ʇınɔɹıƆ", "recipe_type.gtceu.coke_oven": "uǝʌO ǝʞoƆ", "recipe_type.gtceu.combustion_generator": "ɹoʇɐɹǝuǝ⅁ uoıʇsnqɯoƆ", + "recipe_type.gtceu.combustion_generator.tooltip": "spınbıꞀ ǝןqɐɯɯɐןɟ sǝɹınbǝᴚㄥ§", "recipe_type.gtceu.compressor": "ɹossǝɹdɯoƆ", "recipe_type.gtceu.cracker": "ɹǝʞɔɐɹƆ", "recipe_type.gtceu.cutter": "ɹǝʇʇnƆ", @@ -5325,6 +5568,7 @@ "recipe_type.gtceu.fusion_reactor": "ɹoʇɔɐǝᴚ uoısnℲ", "recipe_type.gtceu.gas_collector": "ɹoʇɔǝןןoƆ sɐ⅁", "recipe_type.gtceu.gas_turbine": "ǝuıqɹn⟘ sɐ⅁", + "recipe_type.gtceu.gas_turbine.tooltip": "sǝsɐ⅁ ǝןqɐɯɯɐןɟ sǝɹınbǝᴚㄥ§", "recipe_type.gtceu.implosion_compressor": "ɹossǝɹdɯoƆ uoısoןdɯI", "recipe_type.gtceu.large_boiler": "ɹǝןıoᗺ ǝbɹɐꞀ", "recipe_type.gtceu.large_chemical_reactor": "ɹoʇɔɐǝᴚ ןɐɔıɯǝɥƆ ǝbɹɐꞀ", @@ -5344,6 +5588,7 @@ "recipe_type.gtceu.sifter": "ɹǝʇɟıS", "recipe_type.gtceu.steam_boiler": "ɹǝןıoᗺ ɯɐǝʇS", "recipe_type.gtceu.steam_turbine": "ǝuıqɹn⟘ ɯɐǝʇS", + "recipe_type.gtceu.steam_turbine.tooltip": "∩Ǝ oʇuı ɯɐǝʇS sʇɹǝʌuoƆㄥ§", "recipe_type.gtceu.thermal_centrifuge": "ǝbnɟıɹʇuǝƆ ןɐɯɹǝɥ⟘", "recipe_type.gtceu.vacuum_freezer": "ɹǝzǝǝɹℲ ɯnnɔɐΛ", "recipe_type.gtceu.wiremill": "ןןıɯǝɹıM", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 54736a73c0d..6001f4f93fd 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -1155,8 +1155,8 @@ "block.gtceu.stripped_rubber_log": "Stripped Rubber Log", "block.gtceu.stripped_rubber_wood": "Stripped Rubber Wood", "block.gtceu.sturdy_machine_casing": "Sturdy HSS-E Machine Casing", - "block.gtceu.substation_capacitor.tooltip_empty": "§7For filling space in your Power Substation", - "block.gtceu.substation_capacitor.tooltip_filled": "§cEnergy Capacity: §f%d EU", + "block.gtceu.substation_capacitor.tooltip.empty": "§7For filling space in your Power Substation", + "block.gtceu.substation_capacitor.tooltip.filled": "§cEnergy Capacity: §f%d EU", "block.gtceu.superconducting_coil": "Superconducting Coil Block", "block.gtceu.tempered_glass": "Tempered Glass", "block.gtceu.the_end_marker": "The End", @@ -1635,15 +1635,15 @@ "block.gtceu.white_large_metal_sheet": "White Large Metal Sheet", "block.gtceu.white_metal_sheet": "White Metal Sheet", "block.gtceu.white_studs": "White Studs", - "block.gtceu.wire_coil.tooltip_cracking": "§8Cracking Unit:", - "block.gtceu.wire_coil.tooltip_energy_cracking": " §aEnergy Usage: §f%s%%", - "block.gtceu.wire_coil.tooltip_energy_smelter": " §aEnergy Usage: §f%s EU/t §8per recipe", - "block.gtceu.wire_coil.tooltip_extended_info": "§7Hold SHIFT to show Coil Bonus Info", - "block.gtceu.wire_coil.tooltip_heat": "§cBase Heat Capacity: §f%d K", - "block.gtceu.wire_coil.tooltip_parallel_smelter": " §5Max Parallel: §f%s", - "block.gtceu.wire_coil.tooltip_pyro": "§8Pyrolyse Oven:", - "block.gtceu.wire_coil.tooltip_smelter": "§8Multi Smelter:", - "block.gtceu.wire_coil.tooltip_speed_pyro": " §bProcessing Speed: §f%s%%", + "block.gtceu.wire_coil.tooltip.cracking": "§8Cracking Unit:", + "block.gtceu.wire_coil.tooltip.energy_cracking": " §aEnergy Usage: §f%s%%", + "block.gtceu.wire_coil.tooltip.energy_smelter": " §aEnergy Usage: §f%s EU/t §8per recipe", + "block.gtceu.wire_coil.tooltip.extended_info": "§7Hold SHIFT to show Coil Bonus Info", + "block.gtceu.wire_coil.tooltip.heat": "§cBase Heat Capacity: §f%d K", + "block.gtceu.wire_coil.tooltip.parallel_smelter": " §5Max Parallel: §f%s", + "block.gtceu.wire_coil.tooltip.pyro": "§8Pyrolyse Oven:", + "block.gtceu.wire_coil.tooltip.smelter": "§8Multi Smelter:", + "block.gtceu.wire_coil.tooltip.speed_pyro": " §bProcessing Speed: §f%s%%", "block.gtceu.wood_crate": "Wooden Crate", "block.gtceu.wood_drum": "Wooden Barrel", "block.gtceu.wood_wall": "Wood Wall", @@ -2538,7 +2538,6 @@ "gtceu.machine.cleanroom.tooltip.hold_ctrl": "Hold CTRL to show additional Structure Information", "gtceu.machine.coke_oven.tooltip": "Making better fuels for Steel and Power", "gtceu.machine.coke_oven_hatch.tooltip": "§7Allows automation access for the Coke Oven.", - "gtceu.machine.combustion_generator.tooltip": "§7Requires flammable Liquids", "gtceu.machine.computation_receiver_hatch.tooltip": "Computation Data Input for Multiblocks", "gtceu.machine.computation_transmitter_hatch.tooltip": "Computation Data Output for Multiblocks", "gtceu.machine.cracker.tooltip": "Makes Oil useful", @@ -2635,7 +2634,6 @@ "gtceu.machine.fusion_reactor.overclocking": "Overclocks double energy and halve duration.", "gtceu.machine.fusion_reactor.uv.tooltip": "A WHITE DWARF DOWN ON YOUR BASE", "gtceu.machine.fusion_reactor.zpm.tooltip": "A SUN DOWN ON EARTH", - "gtceu.machine.gas_turbine.tooltip": "§7Requires flammable Gases", "gtceu.machine.high_performance_computation_array.tooltip.0": "Just your average Supercomputer", "gtceu.machine.high_performance_computation_array.tooltip.1": "Used to generate §fComputation§7 (and heat).", "gtceu.machine.high_performance_computation_array.tooltip.2": "Requires HPCA components to generate §fCWU/t§7 (Compute Work Units).", @@ -2878,6 +2876,36 @@ "gtceu.machine.maintenance_hatch_full_auto.tooltip": "For automatically maintaining Multiblocks", "gtceu.machine.maintenance_hatch_tape_slot.tooltip": "Insert Tape to prevent problems", "gtceu.machine.maintenance_hatch_tool_slot.tooltip": "Click slot with empty hand when required tools are in inventory to solve problems", + "gtceu.machine.max_alloy_smelter.tooltip": "§7Metal Amalgamator", + "gtceu.machine.max_arc_furnace.tooltip": "§7Short Circuit Heater", + "gtceu.machine.max_assembler.tooltip": "§7Assembly Constructor", + "gtceu.machine.max_autoclave.tooltip": "§7Encumbrance Unit", + "gtceu.machine.max_bender.tooltip": "§7Matter Deformer", + "gtceu.machine.max_brewery.tooltip": "§7Brew Rusher", + "gtceu.machine.max_canner.tooltip": "§7Can Actuator", + "gtceu.machine.max_chemical_bath.tooltip": "§7Chemical Dunktron", + "gtceu.machine.max_chemical_reactor.tooltip": "§7Reaction Catalyzer", + "gtceu.machine.max_circuit_assembler.tooltip": "§7Computation Factory", + "gtceu.machine.max_compressor.tooltip": "§7Matter Constrictor", + "gtceu.machine.max_cutter.tooltip": "§7Object Divider", + "gtceu.machine.max_distillery.tooltip": "§7Fraction Splitter", + "gtceu.machine.max_electric_furnace.tooltip": "§7Atom Stimulator", + "gtceu.machine.max_electromagnetic_separator.tooltip": "§7EMF Dispeller", + "gtceu.machine.max_extractor.tooltip": "§7Liquefying Sucker", + "gtceu.machine.max_extruder.tooltip": "§7Shape Driver", + "gtceu.machine.max_fermenter.tooltip": "§7Respiration Controller", + "gtceu.machine.max_fluid_heater.tooltip": "§7Thermal Imbuer", + "gtceu.machine.max_fluid_solidifier.tooltip": "§7Fluid Petrificator", + "gtceu.machine.max_forge_hammer.tooltip": "§7Impact Modulator", + "gtceu.machine.max_forming_press.tooltip": "§7Surface Shifter", + "gtceu.machine.max_mass_fabricator.tooltip": "§7Existence Initiator", + "gtceu.machine.max_mixer.tooltip": "§7Material Homogenizer", + "gtceu.machine.max_packer.tooltip": "§7Amazon Warehouse", + "gtceu.machine.max_polarizer.tooltip": "§7Magnetic Field Rearranger", + "gtceu.machine.max_replicator.tooltip": "§7Elemental Composer", + "gtceu.machine.max_scanner.tooltip": "§7Electron Microscope", + "gtceu.machine.max_sifter.tooltip": "§7Pulsation Filter", + "gtceu.machine.max_wiremill.tooltip": "§7Wire Transfigurator", "gtceu.machine.me.copy_paste.tooltip": "Sneak right-click with Data Stick to copy settings, right-click to apply", "gtceu.machine.me.export.tooltip": "Has infinite capacity before connecting to ME network.", "gtceu.machine.me.fluid_export.tooltip": "Stores fluids directly into an ME network.", @@ -2961,8 +2989,45 @@ "gtceu.machine.network_switch.tooltip.2": "Can combine any number of Computation §fReceivers§7 into any number of Computation §fTransmitters§7.", "gtceu.machine.network_switch.tooltip.3": "Uses §f%s EU/t§7 per Computation Data Hatch.", "gtceu.machine.object_holder.tooltip": "Advanced Holding Mechanism for Research Station", + "gtceu.machine.opv_alloy_smelter.tooltip": "§7Metal Amalgamator", + "gtceu.machine.opv_arc_furnace.tooltip": "§7Short Circuit Heater", + "gtceu.machine.opv_assembler.tooltip": "§7Assembly Constructor", + "gtceu.machine.opv_autoclave.tooltip": "§7Encumbrance Unit", + "gtceu.machine.opv_bender.tooltip": "§7Matter Deformer", + "gtceu.machine.opv_brewery.tooltip": "§7Brew Rusher", + "gtceu.machine.opv_canner.tooltip": "§7Can Actuator", + "gtceu.machine.opv_centrifuge.tooltip": "§7Molecular Tornado", + "gtceu.machine.opv_chemical_bath.tooltip": "§7Chemical Dunktron", + "gtceu.machine.opv_chemical_reactor.tooltip": "§7Reaction Catalyzer", + "gtceu.machine.opv_circuit_assembler.tooltip": "§7Computation Factory", + "gtceu.machine.opv_compressor.tooltip": "§7Matter Constrictor", + "gtceu.machine.opv_cutter.tooltip": "§7Object Divider", + "gtceu.machine.opv_distillery.tooltip": "§7Fraction Splitter", + "gtceu.machine.opv_electric_furnace.tooltip": "§7Atom Stimulator", + "gtceu.machine.opv_electrolyzer.tooltip": "§7Atomic Ionizer", + "gtceu.machine.opv_electromagnetic_separator.tooltip": "§7EMF Dispeller", + "gtceu.machine.opv_extractor.tooltip": "§7Liquefying Sucker", + "gtceu.machine.opv_extruder.tooltip": "§7Shape Driver", + "gtceu.machine.opv_fermenter.tooltip": "§7Respiration Controller", + "gtceu.machine.opv_fluid_heater.tooltip": "§7Thermal Imbuer", + "gtceu.machine.opv_fluid_solidifier.tooltip": "§7Fluid Petrificator", + "gtceu.machine.opv_forge_hammer.tooltip": "§7Impact Modulator", + "gtceu.machine.opv_forming_press.tooltip": "§7Surface Shifter", "gtceu.machine.opv_gas_collector.tooltip": "§7Collects Gas from the universe depending on the dimension", + "gtceu.machine.opv_laser_engraver.tooltip": "§7Exact Photon Cannon", + "gtceu.machine.opv_lathe.tooltip": "§7Rotation Grinder", + "gtceu.machine.opv_macerator.tooltip": "§7Shape Eliminator", + "gtceu.machine.opv_mass_fabricator.tooltip": "§7Existence Initiator", + "gtceu.machine.opv_mixer.tooltip": "§7Material Homogenizer", + "gtceu.machine.opv_ore_washer.tooltip": "§7Miniature Car Wash", + "gtceu.machine.opv_packer.tooltip": "§7Amazon Warehouse", + "gtceu.machine.opv_polarizer.tooltip": "§7Magnetic Field Rearranger", + "gtceu.machine.opv_replicator.tooltip": "§7Elemental Composer", "gtceu.machine.opv_rock_crusher.tooltip": "§7Volcanic Formation Chamber", + "gtceu.machine.opv_scanner.tooltip": "§7Electron Microscope", + "gtceu.machine.opv_sifter.tooltip": "§7Pulsation Filter", + "gtceu.machine.opv_thermal_centrifuge.tooltip": "§7Fire Cyclone", + "gtceu.machine.opv_wiremill.tooltip": "§7Wire Transfigurator", "gtceu.machine.parallel_hatch.display": "Adjust the maximum parallel of the multiblock", "gtceu.machine.parallel_hatch_mk5.tooltip": "Allows to run up to 4 recipes in parallel.", "gtceu.machine.parallel_hatch_mk6.tooltip": "Allows to run up to 16 recipes in parallel.", @@ -3002,22 +3067,162 @@ "gtceu.machine.steam_bus.tooltip": "Does not work with non-steam multiblocks", "gtceu.machine.steam_grinder.tooltip": "A multiblock Macerator without the Byproducts", "gtceu.machine.steam_oven.tooltip": "Not to be confused with Multi-Smelter", - "gtceu.machine.steam_turbine.tooltip": "§7Converts Steam into EU", "gtceu.machine.substation_hatch.input.tooltip": "Energy Input for the Power Substation", "gtceu.machine.substation_hatch.output.tooltip": "Energy Output for the Power Substation", "gtceu.machine.tank_valve.tooltip": "Use to fill and drain multiblock tanks. Auto outputs when facing down.", "gtceu.machine.transformer.description": "§7Transforms Energy between voltage tiers", "gtceu.machine.transformer.message_transform_down": "Transforming Down, In: %s EU %dA, Out: %s EU %dA", "gtceu.machine.transformer.message_transform_up": "Transforming Up, In: %s EU %dA, Out: %s EU %dA", - "gtceu.machine.transformer.tooltip_tool_usage": "Starts as §fTransform Down§7, use Screwdriver to change", + "gtceu.machine.transformer.tooltip_tool_usage": "§7Starts as §fTransform Down§7, use Screwdriver to change", "gtceu.machine.transformer.tooltip_transform_down": "§aTransform Down: §f%dA %s EU (%s§f) -> %dA %s EU (%s§f)", "gtceu.machine.transformer.tooltip_transform_up": "§cTransform Up: §f%dA %s EU (%s§f) -> %dA %s EU (%s§f)", + "gtceu.machine.uev_alloy_smelter.tooltip": "§7Metal Amalgamator", + "gtceu.machine.uev_arc_furnace.tooltip": "§7Short Circuit Heater", + "gtceu.machine.uev_assembler.tooltip": "§7Assembly Constructor", + "gtceu.machine.uev_autoclave.tooltip": "§7Encumbrance Unit", + "gtceu.machine.uev_bender.tooltip": "§7Matter Deformer", + "gtceu.machine.uev_brewery.tooltip": "§7Brew Rusher", + "gtceu.machine.uev_canner.tooltip": "§7Can Actuator", + "gtceu.machine.uev_centrifuge.tooltip": "§7Molecular Tornado", + "gtceu.machine.uev_chemical_bath.tooltip": "§7Chemical Dunktron", + "gtceu.machine.uev_chemical_reactor.tooltip": "§7Reaction Catalyzer", + "gtceu.machine.uev_circuit_assembler.tooltip": "§7Computation Factory", + "gtceu.machine.uev_compressor.tooltip": "§7Matter Constrictor", + "gtceu.machine.uev_cutter.tooltip": "§7Object Divider", + "gtceu.machine.uev_distillery.tooltip": "§7Fraction Splitter", + "gtceu.machine.uev_electric_furnace.tooltip": "§7Atom Stimulator", + "gtceu.machine.uev_electrolyzer.tooltip": "§7Atomic Ionizer", + "gtceu.machine.uev_electromagnetic_separator.tooltip": "§7EMF Dispeller", + "gtceu.machine.uev_extractor.tooltip": "§7Liquefying Sucker", + "gtceu.machine.uev_extruder.tooltip": "§7Shape Driver", + "gtceu.machine.uev_fermenter.tooltip": "§7Respiration Controller", + "gtceu.machine.uev_fluid_heater.tooltip": "§7Thermal Imbuer", + "gtceu.machine.uev_fluid_solidifier.tooltip": "§7Fluid Petrificator", + "gtceu.machine.uev_forge_hammer.tooltip": "§7Impact Modulator", + "gtceu.machine.uev_forming_press.tooltip": "§7Surface Shifter", "gtceu.machine.uev_gas_collector.tooltip": "§7Collects Gas from the solar system depending on the dimension", + "gtceu.machine.uev_laser_engraver.tooltip": "§7Exact Photon Cannon", + "gtceu.machine.uev_lathe.tooltip": "§7Rotation Grinder", + "gtceu.machine.uev_macerator.tooltip": "§7Shape Eliminator", + "gtceu.machine.uev_mass_fabricator.tooltip": "§7Existence Initiator", + "gtceu.machine.uev_mixer.tooltip": "§7Material Homogenizer", + "gtceu.machine.uev_ore_washer.tooltip": "§7Miniature Car Wash", + "gtceu.machine.uev_packer.tooltip": "§7Amazon Warehouse", + "gtceu.machine.uev_polarizer.tooltip": "§7Magnetic Field Rearranger", + "gtceu.machine.uev_replicator.tooltip": "§7Elemental Composer", "gtceu.machine.uev_rock_crusher.tooltip": "§7Volcanic Formation Chamber", + "gtceu.machine.uev_scanner.tooltip": "§7Electron Microscope", + "gtceu.machine.uev_sifter.tooltip": "§7Pulsation Filter", + "gtceu.machine.uev_thermal_centrifuge.tooltip": "§7Fire Cyclone", + "gtceu.machine.uev_wiremill.tooltip": "§7Wire Transfigurator", + "gtceu.machine.uhv_alloy_smelter.tooltip": "§7Metal Amalgamator", + "gtceu.machine.uhv_arc_furnace.tooltip": "§7Short Circuit Heater", + "gtceu.machine.uhv_assembler.tooltip": "§7Assembly Constructor", + "gtceu.machine.uhv_autoclave.tooltip": "§7Encumbrance Unit", + "gtceu.machine.uhv_bender.tooltip": "§7Matter Deformer", + "gtceu.machine.uhv_brewery.tooltip": "§7Brew Rusher", + "gtceu.machine.uhv_canner.tooltip": "§7Can Actuator", + "gtceu.machine.uhv_centrifuge.tooltip": "§7Molecular Tornado", + "gtceu.machine.uhv_chemical_bath.tooltip": "§7Chemical Dunktron", + "gtceu.machine.uhv_chemical_reactor.tooltip": "§7Reaction Catalyzer", + "gtceu.machine.uhv_circuit_assembler.tooltip": "§7Computation Factory", + "gtceu.machine.uhv_compressor.tooltip": "§7Matter Constrictor", + "gtceu.machine.uhv_cutter.tooltip": "§7Object Divider", + "gtceu.machine.uhv_distillery.tooltip": "§7Fraction Splitter", + "gtceu.machine.uhv_electric_furnace.tooltip": "§7Atom Stimulator", + "gtceu.machine.uhv_electrolyzer.tooltip": "§7Atomic Ionizer", + "gtceu.machine.uhv_electromagnetic_separator.tooltip": "§7EMF Dispeller", + "gtceu.machine.uhv_extractor.tooltip": "§7Liquefying Sucker", + "gtceu.machine.uhv_extruder.tooltip": "§7Shape Driver", + "gtceu.machine.uhv_fermenter.tooltip": "§7Respiration Controller", + "gtceu.machine.uhv_fluid_heater.tooltip": "§7Thermal Imbuer", + "gtceu.machine.uhv_fluid_solidifier.tooltip": "§7Fluid Petrificator", + "gtceu.machine.uhv_forge_hammer.tooltip": "§7Impact Modulator", + "gtceu.machine.uhv_forming_press.tooltip": "§7Surface Shifter", "gtceu.machine.uhv_gas_collector.tooltip": "§7Collects Gas from the solar system depending on the dimension", + "gtceu.machine.uhv_laser_engraver.tooltip": "§7Exact Photon Cannon", + "gtceu.machine.uhv_lathe.tooltip": "§7Rotation Grinder", + "gtceu.machine.uhv_macerator.tooltip": "§7Shape Eliminator", + "gtceu.machine.uhv_mass_fabricator.tooltip": "§7Existence Initiator", + "gtceu.machine.uhv_mixer.tooltip": "§7Material Homogenizer", + "gtceu.machine.uhv_ore_washer.tooltip": "§7Miniature Car Wash", + "gtceu.machine.uhv_packer.tooltip": "§7Amazon Warehouse", + "gtceu.machine.uhv_polarizer.tooltip": "§7Magnetic Field Rearranger", + "gtceu.machine.uhv_replicator.tooltip": "§7Elemental Composer", "gtceu.machine.uhv_rock_crusher.tooltip": "§7Volcanic Formation Chamber", + "gtceu.machine.uhv_scanner.tooltip": "§7Electron Microscope", + "gtceu.machine.uhv_sifter.tooltip": "§7Pulsation Filter", + "gtceu.machine.uhv_thermal_centrifuge.tooltip": "§7Fire Cyclone", + "gtceu.machine.uhv_wiremill.tooltip": "§7Wire Transfigurator", + "gtceu.machine.uiv_alloy_smelter.tooltip": "§7Metal Amalgamator", + "gtceu.machine.uiv_arc_furnace.tooltip": "§7Short Circuit Heater", + "gtceu.machine.uiv_assembler.tooltip": "§7Assembly Constructor", + "gtceu.machine.uiv_autoclave.tooltip": "§7Encumbrance Unit", + "gtceu.machine.uiv_bender.tooltip": "§7Matter Deformer", + "gtceu.machine.uiv_brewery.tooltip": "§7Brew Rusher", + "gtceu.machine.uiv_canner.tooltip": "§7Can Actuator", + "gtceu.machine.uiv_centrifuge.tooltip": "§7Molecular Tornado", + "gtceu.machine.uiv_chemical_bath.tooltip": "§7Chemical Dunktron", + "gtceu.machine.uiv_chemical_reactor.tooltip": "§7Reaction Catalyzer", + "gtceu.machine.uiv_circuit_assembler.tooltip": "§7Computation Factory", + "gtceu.machine.uiv_compressor.tooltip": "§7Matter Constrictor", + "gtceu.machine.uiv_cutter.tooltip": "§7Object Divider", + "gtceu.machine.uiv_distillery.tooltip": "§7Fraction Splitter", + "gtceu.machine.uiv_electric_furnace.tooltip": "§7Atom Stimulator", + "gtceu.machine.uiv_electrolyzer.tooltip": "§7Atomic Ionizer", + "gtceu.machine.uiv_electromagnetic_separator.tooltip": "§7EMF Dispeller", + "gtceu.machine.uiv_extractor.tooltip": "§7Liquefying Sucker", + "gtceu.machine.uiv_extruder.tooltip": "§7Shape Driver", + "gtceu.machine.uiv_fermenter.tooltip": "§7Respiration Controller", + "gtceu.machine.uiv_fluid_heater.tooltip": "§7Thermal Imbuer", + "gtceu.machine.uiv_fluid_solidifier.tooltip": "§7Fluid Petrificator", + "gtceu.machine.uiv_forge_hammer.tooltip": "§7Impact Modulator", + "gtceu.machine.uiv_forming_press.tooltip": "§7Surface Shifter", "gtceu.machine.uiv_gas_collector.tooltip": "§7Collects Gas from the solar system depending on the dimension", + "gtceu.machine.uiv_laser_engraver.tooltip": "§7Exact Photon Cannon", + "gtceu.machine.uiv_lathe.tooltip": "§7Rotation Grinder", + "gtceu.machine.uiv_macerator.tooltip": "§7Shape Eliminator", + "gtceu.machine.uiv_mass_fabricator.tooltip": "§7Existence Initiator", + "gtceu.machine.uiv_mixer.tooltip": "§7Material Homogenizer", + "gtceu.machine.uiv_ore_washer.tooltip": "§7Miniature Car Wash", + "gtceu.machine.uiv_packer.tooltip": "§7Amazon Warehouse", + "gtceu.machine.uiv_polarizer.tooltip": "§7Magnetic Field Rearranger", + "gtceu.machine.uiv_replicator.tooltip": "§7Elemental Composer", "gtceu.machine.uiv_rock_crusher.tooltip": "§7Volcanic Formation Chamber", + "gtceu.machine.uiv_scanner.tooltip": "§7Electron Microscope", + "gtceu.machine.uiv_sifter.tooltip": "§7Pulsation Filter", + "gtceu.machine.uiv_thermal_centrifuge.tooltip": "§7Fire Cyclone", + "gtceu.machine.uiv_wiremill.tooltip": "§7Wire Transfigurator", + "gtceu.machine.ulv_alloy_smelter.tooltip": "§7HighTech combination Smelter", + "gtceu.machine.ulv_arc_furnace.tooltip": "§7Who needs a Blast Furnace?", + "gtceu.machine.ulv_assembler.tooltip": "§7Avengers, Assemble!", + "gtceu.machine.ulv_autoclave.tooltip": "§7Crystallizing your Dusts", + "gtceu.machine.ulv_bender.tooltip": "§7Boo, he's bad! We want BENDER!!!", + "gtceu.machine.ulv_brewery.tooltip": "§7Compact and efficient potion brewing", + "gtceu.machine.ulv_canner.tooltip": "§7Puts things into and out of Containers", + "gtceu.machine.ulv_chemical_bath.tooltip": "§7Bathing Ores in Chemicals to separate them", + "gtceu.machine.ulv_chemical_reactor.tooltip": "§7Letting Chemicals react with each other", + "gtceu.machine.ulv_circuit_assembler.tooltip": "§7Pick-n-Place all over the place", + "gtceu.machine.ulv_compressor.tooltip": "§7Compress-O-Matic C77", + "gtceu.machine.ulv_cutter.tooltip": "§7Slice'N Dice", + "gtceu.machine.ulv_distillery.tooltip": "§7Extracting most relevant Parts of Fluids", + "gtceu.machine.ulv_electric_furnace.tooltip": "§7Not like using a Commodore 64", + "gtceu.machine.ulv_electromagnetic_separator.tooltip": "§7Separating the magnetic Ores from the rest", + "gtceu.machine.ulv_extractor.tooltip": "§7Dejuicer-Device of Doom - D123", + "gtceu.machine.ulv_extruder.tooltip": "§7Universal Machine for Metal Working", + "gtceu.machine.ulv_fermenter.tooltip": "§7Fermenting Fluids", + "gtceu.machine.ulv_fluid_heater.tooltip": "§7Heating up your Fluids", + "gtceu.machine.ulv_fluid_solidifier.tooltip": "§7Cools Fluids down to form Solids", + "gtceu.machine.ulv_forge_hammer.tooltip": "§7Stop, Hammertime!", + "gtceu.machine.ulv_forming_press.tooltip": "§7Imprinting Images into things", + "gtceu.machine.ulv_mass_fabricator.tooltip": "§7UUM Matter * Fabrication Squared", + "gtceu.machine.ulv_mixer.tooltip": "§7Will it Blend?", + "gtceu.machine.ulv_packer.tooltip": "§7Puts things into and Grabs things out of Boxes", + "gtceu.machine.ulv_polarizer.tooltip": "§7Bipolarising your Magnets", + "gtceu.machine.ulv_replicator.tooltip": "§7Producing the Purest of Elements", + "gtceu.machine.ulv_scanner.tooltip": "§7Scans Materials and other things", + "gtceu.machine.ulv_sifter.tooltip": "§7Stay calm and keep sifting", + "gtceu.machine.ulv_wiremill.tooltip": "§7Produces Wires more efficiently", "gtceu.machine.uv_alloy_smelter.tooltip": "§7Metal Amalgamator", "gtceu.machine.uv_arc_furnace.tooltip": "§7Short Circuit Heater", "gtceu.machine.uv_assembler.tooltip": "§7Assembly Constructor", @@ -3057,8 +3262,45 @@ "gtceu.machine.uv_sifter.tooltip": "§7Pulsation Filter", "gtceu.machine.uv_thermal_centrifuge.tooltip": "§7Fire Cyclone", "gtceu.machine.uv_wiremill.tooltip": "§7Wire Transfigurator", + "gtceu.machine.uxv_alloy_smelter.tooltip": "§7Metal Amalgamator", + "gtceu.machine.uxv_arc_furnace.tooltip": "§7Short Circuit Heater", + "gtceu.machine.uxv_assembler.tooltip": "§7Assembly Constructor", + "gtceu.machine.uxv_autoclave.tooltip": "§7Encumbrance Unit", + "gtceu.machine.uxv_bender.tooltip": "§7Matter Deformer", + "gtceu.machine.uxv_brewery.tooltip": "§7Brew Rusher", + "gtceu.machine.uxv_canner.tooltip": "§7Can Actuator", + "gtceu.machine.uxv_centrifuge.tooltip": "§7Molecular Tornado", + "gtceu.machine.uxv_chemical_bath.tooltip": "§7Chemical Dunktron", + "gtceu.machine.uxv_chemical_reactor.tooltip": "§7Reaction Catalyzer", + "gtceu.machine.uxv_circuit_assembler.tooltip": "§7Computation Factory", + "gtceu.machine.uxv_compressor.tooltip": "§7Matter Constrictor", + "gtceu.machine.uxv_cutter.tooltip": "§7Object Divider", + "gtceu.machine.uxv_distillery.tooltip": "§7Fraction Splitter", + "gtceu.machine.uxv_electric_furnace.tooltip": "§7Atom Stimulator", + "gtceu.machine.uxv_electrolyzer.tooltip": "§7Atomic Ionizer", + "gtceu.machine.uxv_electromagnetic_separator.tooltip": "§7EMF Dispeller", + "gtceu.machine.uxv_extractor.tooltip": "§7Liquefying Sucker", + "gtceu.machine.uxv_extruder.tooltip": "§7Shape Driver", + "gtceu.machine.uxv_fermenter.tooltip": "§7Respiration Controller", + "gtceu.machine.uxv_fluid_heater.tooltip": "§7Thermal Imbuer", + "gtceu.machine.uxv_fluid_solidifier.tooltip": "§7Fluid Petrificator", + "gtceu.machine.uxv_forge_hammer.tooltip": "§7Impact Modulator", + "gtceu.machine.uxv_forming_press.tooltip": "§7Surface Shifter", "gtceu.machine.uxv_gas_collector.tooltip": "§7Collects Gas from the solar system depending on the dimension", + "gtceu.machine.uxv_laser_engraver.tooltip": "§7Exact Photon Cannon", + "gtceu.machine.uxv_lathe.tooltip": "§7Rotation Grinder", + "gtceu.machine.uxv_macerator.tooltip": "§7Shape Eliminator", + "gtceu.machine.uxv_mass_fabricator.tooltip": "§7Existence Initiator", + "gtceu.machine.uxv_mixer.tooltip": "§7Material Homogenizer", + "gtceu.machine.uxv_ore_washer.tooltip": "§7Miniature Car Wash", + "gtceu.machine.uxv_packer.tooltip": "§7Amazon Warehouse", + "gtceu.machine.uxv_polarizer.tooltip": "§7Magnetic Field Rearranger", + "gtceu.machine.uxv_replicator.tooltip": "§7Elemental Composer", "gtceu.machine.uxv_rock_crusher.tooltip": "§7Volcanic Formation Chamber", + "gtceu.machine.uxv_scanner.tooltip": "§7Electron Microscope", + "gtceu.machine.uxv_sifter.tooltip": "§7Pulsation Filter", + "gtceu.machine.uxv_thermal_centrifuge.tooltip": "§7Fire Cyclone", + "gtceu.machine.uxv_wiremill.tooltip": "§7Wire Transfigurator", "gtceu.machine.vacuum_freezer.tooltip": "Aluminium Ice Box", "gtceu.machine.workbench.storage_note.0": "(Available items from connected", "gtceu.machine.workbench.storage_note.1": "inventories usable for crafting)", @@ -5305,6 +5547,7 @@ "recipe_type.gtceu.circuit_assembler": "Circuit Assembler", "recipe_type.gtceu.coke_oven": "Coke Oven", "recipe_type.gtceu.combustion_generator": "Combustion Generator", + "recipe_type.gtceu.combustion_generator.tooltip": "§7Requires flammable Liquids", "recipe_type.gtceu.compressor": "Compressor", "recipe_type.gtceu.cracker": "Cracker", "recipe_type.gtceu.cutter": "Cutter", @@ -5325,6 +5568,7 @@ "recipe_type.gtceu.fusion_reactor": "Fusion Reactor", "recipe_type.gtceu.gas_collector": "Gas Collector", "recipe_type.gtceu.gas_turbine": "Gas Turbine", + "recipe_type.gtceu.gas_turbine.tooltip": "§7Requires flammable Gases", "recipe_type.gtceu.implosion_compressor": "Implosion Compressor", "recipe_type.gtceu.large_boiler": "Large Boiler", "recipe_type.gtceu.large_chemical_reactor": "Large Chemical Reactor", @@ -5344,6 +5588,7 @@ "recipe_type.gtceu.sifter": "Sifter", "recipe_type.gtceu.steam_boiler": "Steam Boiler", "recipe_type.gtceu.steam_turbine": "Steam Turbine", + "recipe_type.gtceu.steam_turbine.tooltip": "§7Converts Steam into EU", "recipe_type.gtceu.thermal_centrifuge": "Thermal Centrifuge", "recipe_type.gtceu.vacuum_freezer": "Vacuum Freezer", "recipe_type.gtceu.wiremill": "Wiremill", diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/PipeBlockItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/PipeBlockItem.java index 0afee501b2f..c2e06ddd5dc 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/PipeBlockItem.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/PipeBlockItem.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.api.block.PipeBlock; import com.gregtechceu.gtceu.api.capability.ICoverable; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.pipenet.IPipeNode; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.GTUtil; diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/component/IMaterialPartItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/component/IMaterialPartItem.java index b4f896d08dd..16cc4e685ff 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/component/IMaterialPartItem.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/component/IMaterialPartItem.java @@ -81,9 +81,11 @@ default void appendHoverText(ItemStack stack, @org.jetbrains.annotations.Nullabl var maxDurability = getPartMaxDurability(stack); var damage = getPartDamage(stack); tooltipComponents - .add(Component.translatable("item.gtceu.turbine_rotor.tooltip.durability", maxDurability - damage, maxDurability)); + .add(Component.translatable("item.gtceu.turbine_rotor.tooltip.durability", maxDurability - damage, + maxDurability)); tooltipComponents - .add(Component.translatable("item.gtceu.turbine_rotor.tooltip.primary_material", material.getLocalizedName())); + .add(Component.translatable("item.gtceu.turbine_rotor.tooltip.primary_material", + material.getLocalizedName())); } @OnlyIn(Dist.CLIENT) diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/category/GTRecipeCategory.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/category/GTRecipeCategory.java index 27803a2e479..86e87ed1b9f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/category/GTRecipeCategory.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/category/GTRecipeCategory.java @@ -41,7 +41,7 @@ public GTRecipeCategory(@NotNull GTRecipeType recipeType) { this.recipeType = recipeType; this.name = recipeType.registryName.getPath(); this.registryKey = recipeType.registryName; - this.languageKey = recipeType.registryName.toLanguageKey(); + this.languageKey = "recipe_type.%s".formatted(recipeType.registryName.toLanguageKey()); } public GTRecipeCategory(@NotNull String categoryName, @NotNull GTRecipeType recipeType) { diff --git a/src/main/java/com/gregtechceu/gtceu/client/TooltipsHandler.java b/src/main/java/com/gregtechceu/gtceu/client/TooltipsHandler.java index 44027434024..f6987e2c02f 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/TooltipsHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/client/TooltipsHandler.java @@ -118,7 +118,7 @@ public static void appendFluidTooltips(FluidStack fluidStack, Consumer a.appendFluidTooltips(tooltips)); } else { - String key = "gtceu.fluid.state_" + (fluidType.isLighterThanAir() ? "gas" : "liquid"); + String key = "tooltip.gtceu.fluid_state." + (fluidType.isLighterThanAir() ? "gas" : "liquid"); tooltips.accept(Component.translatable(key)); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/block/BatteryBlock.java b/src/main/java/com/gregtechceu/gtceu/common/block/BatteryBlock.java index 137fcaa1cc4..ab8c6195e7c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/block/BatteryBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/common/block/BatteryBlock.java @@ -36,9 +36,9 @@ public void appendHoverText(ItemStack stack, @Nullable BlockGetter level, List 1) { tooltip.add(Component.translatable("tooltip.gtceu.fluid_pipe.channels", properties.getChannels())); diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java index 63e9ffdba62..6d7148031e9 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java @@ -272,14 +272,14 @@ public class GTMachines { // **** Simple Generator ****// ////////////////////////////////////// public static final MachineDefinition[] COMBUSTION = registerSimpleGenerator("combustion", - GTRecipeTypes.COMBUSTION_GENERATOR_FUELS, genericGeneratorTankSizeFunction, 0.1f, GTValues.LV, GTValues.MV, - GTValues.HV); + GTRecipeTypes.COMBUSTION_GENERATOR_FUELS, true, genericGeneratorTankSizeFunction, 0.1f, + GTValues.LV, GTValues.MV, GTValues.HV); public static final MachineDefinition[] STEAM_TURBINE = registerSimpleGenerator("steam_turbine", - GTRecipeTypes.STEAM_TURBINE_FUELS, steamGeneratorTankSizeFunction, 0.0f, GTValues.LV, GTValues.MV, - GTValues.HV); + GTRecipeTypes.STEAM_TURBINE_FUELS, true, steamGeneratorTankSizeFunction, 0.0f, + GTValues.LV, GTValues.MV, GTValues.HV); public static final MachineDefinition[] GAS_TURBINE = registerSimpleGenerator("gas_turbine", - GTRecipeTypes.GAS_TURBINE_FUELS, genericGeneratorTankSizeFunction, 0.1f, GTValues.LV, GTValues.MV, - GTValues.HV); + GTRecipeTypes.GAS_TURBINE_FUELS, true, genericGeneratorTankSizeFunction, 0.1f, + GTValues.LV, GTValues.MV, GTValues.HV); ////////////////////////////////////// // ******** Electric ********// diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMachineUtils.java b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMachineUtils.java index 2ce5c99e36f..63b0d739183 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMachineUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMachineUtils.java @@ -60,6 +60,7 @@ import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidType; +import com.google.common.collect.Streams; import it.unimi.dsi.fastutil.Pair; import it.unimi.dsi.fastutil.ints.Int2IntFunction; import it.unimi.dsi.fastutil.objects.Object2IntArrayMap; @@ -67,6 +68,7 @@ import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Locale; import java.util.function.BiConsumer; @@ -244,10 +246,16 @@ public static MachineDefinition[] registerTransformerMachines(String langName, i } public static MachineDefinition[] registerSimpleGenerator(String name, - GTRecipeType recipeType, + GTRecipeType recipeType, boolean addRecipeTooltip, Int2IntFunction tankScalingFunction, float hazardStrengthPerOperation, int... tiers) { + List machineTooltips = new ArrayList<>(); + if (addRecipeTooltip) { + var regName = recipeType.registryName; + machineTooltips.add(Component.translatable(regName.toLanguageKey("recipe_type", "tooltip"))); + } + return registerTieredMachines(name, (holder, tier) -> new SimpleGeneratorMachine(holder, tier, hazardStrengthPerOperation * tier, tankScalingFunction), @@ -260,8 +268,11 @@ public static MachineDefinition[] registerSimpleGenerator(String name, .addOutputLimit(ItemRecipeCapability.CAP, 0) .addOutputLimit(FluidRecipeCapability.CAP, 0) .renderer(() -> new SimpleGeneratorMachineRenderer(tier, GTCEu.id("block/generators/" + name))) - .tooltips(workableTiered(tier, GTValues.V[tier], GTValues.V[tier] * 64, recipeType, - tankScalingFunction.applyAsInt(tier), false)) + .tooltips(Streams + .concat(machineTooltips.stream(), + Arrays.stream(workableTiered(tier, V[tier], V[tier] * 64, recipeType, + tankScalingFunction.applyAsInt(tier), false))) + .toArray(Component[]::new)) .register(), tiers); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedNanoMuscleSuite.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedNanoMuscleSuite.java index b1bdc11a20c..37f1950eb8f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedNanoMuscleSuite.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedNanoMuscleSuite.java @@ -213,7 +213,8 @@ public void drawHUD(ItemStack item, GuiGraphics guiGraphics) { if (data.contains("canShare")) { String status = data.getBoolean("canShare") ? "armor.gtceu.hud.status.enabled" : "armor.gtceu.hud.status.disabled"; - this.HUD.newString(Component.translatable("armor.gtceu.hud.supply_mode", Component.translatable(status))); + this.HUD.newString( + Component.translatable("armor.gtceu.hud.supply_mode", Component.translatable(status))); } if (data.contains("hover")) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedQuarkTechSuite.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedQuarkTechSuite.java index 101ca1cc2ad..bbbf7a96b63 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedQuarkTechSuite.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedQuarkTechSuite.java @@ -218,7 +218,8 @@ public void drawHUD(ItemStack item, GuiGraphics guiGraphics) { if (data.contains("canShare")) { String status = data.getBoolean("canShare") ? "armor.gtceu.hud.status.enabled" : "armor.gtceu.hud.status.disabled"; - this.HUD.newString(Component.translatable("armor.gtceu.hud.supply_mode", Component.translatable(status))); + this.HUD.newString( + Component.translatable("armor.gtceu.hud.supply_mode", Component.translatable(status))); } if (data.contains("hover")) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/NanoMuscleSuite.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/NanoMuscleSuite.java index 4031ab43787..7fb832a5131 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/NanoMuscleSuite.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/NanoMuscleSuite.java @@ -61,10 +61,12 @@ public void onArmorTick(Level world, Player player, ItemStack itemStack) { toggleTimer = 5; if (item.getCharge() < ArmorUtils.MIN_NIGHTVISION_CHARGE) { nightVision = false; - player.displayClientMessage(Component.translatable("armor.gtceu.nano_muscle_suite.nightvision.error"), true); + player.displayClientMessage( + Component.translatable("armor.gtceu.nano_muscle_suite.nightvision.error"), true); } else { player.displayClientMessage(Component - .translatable("armor.gtceu.nano_muscle_suite.nightvision." + (nightVision ? "enabled" : "disabled")), + .translatable("armor.gtceu.nano_muscle_suite.nightvision." + + (nightVision ? "enabled" : "disabled")), true); } } @@ -96,7 +98,8 @@ public static void disableNightVision(@NotNull Level world, Player player, boole if (!world.isClientSide) { player.removeEffect(MobEffects.NIGHT_VISION); if (sendMsg) - player.displayClientMessage(Component.translatable("armor.gtceu.nano_muscle_suite.nightvision.disabled"), true); + player.displayClientMessage( + Component.translatable("armor.gtceu.nano_muscle_suite.nightvision.disabled"), true); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/NightvisionGoggles.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/NightvisionGoggles.java index 53aa47c36be..de4ca554dc5 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/NightvisionGoggles.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/NightvisionGoggles.java @@ -46,10 +46,12 @@ public void onArmorTick(Level world, @NotNull Player player, @NotNull ItemStack toggleTimer = 5; if (item.getCharge() < ArmorUtils.MIN_NIGHTVISION_CHARGE) { nightVision = false; - player.displayClientMessage(Component.translatable("armor.gtceu.nano_muscle_suite.nightvision.error"), true); + player.displayClientMessage( + Component.translatable("armor.gtceu.nano_muscle_suite.nightvision.error"), true); } else { player.displayClientMessage(Component - .translatable("armor.gtceu.nano_muscle_suite.nightvision." + (nightVision ? "enabled" : "disabled")), + .translatable("armor.gtceu.nano_muscle_suite.nightvision." + + (nightVision ? "enabled" : "disabled")), true); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/QuarkTechSuite.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/QuarkTechSuite.java index 9ab6af00dc6..8317c922a73 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/QuarkTechSuite.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/QuarkTechSuite.java @@ -96,10 +96,12 @@ public void onArmorTick(Level world, Player player, ItemStack itemStack) { toggleTimer = 5; if (item.getCharge() < ArmorUtils.MIN_NIGHTVISION_CHARGE) { nightVision = false; - player.displayClientMessage(Component.translatable("armor.gtceu.nano_muscle_suite.nightvision.error"), true); + player.displayClientMessage( + Component.translatable("armor.gtceu.nano_muscle_suite.nightvision.error"), true); } else { player.displayClientMessage(Component - .translatable("armor.gtceu.nano_muscle_suite.nightvision." + (nightVision ? "enabled" : "disabled")), + .translatable("armor.gtceu.nano_muscle_suite.nightvision." + + (nightVision ? "enabled" : "disabled")), true); } } @@ -165,7 +167,9 @@ public void onArmorTick(Level world, Player player, ItemStack itemStack) { boostedJump = !boostedJump; boostedJumpTimer = JUMPING_TIMER; player.displayClientMessage(Component - .translatable("armor.gtceu.nano_muscle_suite.boosted_jump." + (boostedJump ? "enabled" : "disabled")), true); + .translatable( + "armor.gtceu.nano_muscle_suite.boosted_jump." + (boostedJump ? "enabled" : "disabled")), + true); } if (boostedJump) { if (!world.isClientSide) { diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java index fc5d37c8c6c..fc5dc68de49 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java @@ -13,13 +13,16 @@ public static void init(RegistrateLangProvider provider) { private static void generateArmorMessageKeys(RegistrateLangProvider provider) { // NanoMuscle Suit provider.add("armor.gtceu.nano_muscle_suite.nightvision.enabled", "NanoMuscle™ Suite: §aNightVision Enabled"); - provider.add("armor.gtceu.nano_muscle_suite.nightvision.disabled", " NanoMuscle™ Suite: §cNightVision Disabled"); + provider.add("armor.gtceu.nano_muscle_suite.nightvision.disabled", + " NanoMuscle™ Suite: §cNightVision Disabled"); provider.add("armor.gtceu.nano_muscle_suite.boosted_jump.enabled", "NanoMuscle™ Suite: §aJump Boost Enabled"); - provider.add("armor.gtceu.nano_muscle_suite.boosted_jump.disabled", " NanoMuscle™ Suite: §cJump Boost Disabled"); + provider.add("armor.gtceu.nano_muscle_suite.boosted_jump.disabled", + " NanoMuscle™ Suite: §cJump Boost Disabled"); provider.add("armor.gtceu.nano_muscle_suite.nightvision.error", "NanoMuscle™ Suite: §cNot enough power!"); provider.add("armor.gtceu.nano_muscle_suite.charge.enabled", "NanoMuscle™ Suite: §aCharging Enabled"); provider.add("armor.gtceu.nano_muscle_suite.charge.disabled", " NanoMuscle™ Suite: §cCharging Disabled"); - provider.add("armor.gtceu.nano_muscle_suite.charge.error", "NanoMuscle™ Suite: §cNot enough power for charging!"); + provider.add("armor.gtceu.nano_muscle_suite.charge.error", + "NanoMuscle™ Suite: §cNot enough power for charging!"); // Quantum Suit provider.add("armor.gtceu.quark_tech_suite.nightvision.enabled", "QuarkTech™ Suite: §aNightVision Enabled"); @@ -43,7 +46,11 @@ private static void generateArmorMessageKeys(RegistrateLangProvider provider) { } private static void generateTooltipKeys(RegistrateLangProvider provider) { - provider.add("item.gtceu.liquid_fuel_jetpack.tooltip", "§7Uses Combustion Generator Fuels for Thrust"); //move this to item lang? + provider.add("item.gtceu.liquid_fuel_jetpack.tooltip", "§7Uses Combustion Generator Fuels for Thrust"); // move + // this + // to + // item + // lang? // Armor Abilities provider.add("armor.gtceu.tooltip.stepassist", "§7Provides Step-Assist"); @@ -66,7 +73,7 @@ private static void generateTooltipKeys(RegistrateLangProvider provider) { private static void generateHudKeys(RegistrateLangProvider provider) { // HUD Information - provider.add("armor.gtceu.hud.status.enabled", "§aON"); //change this to generic tooltip? + provider.add("armor.gtceu.hud.status.enabled", "§aON"); // change this to generic tooltip? provider.add("armor.gtceu.hud.status.disabled", "§cOFF"); provider.add("armor.gtceu.hud.energy_level", "Energy Level: %s"); provider.add("armor.gtceu.hud.engine_enabled", "Engine: %s"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java index 7c5e05dd9dc..cb1ad81bcae 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java @@ -46,6 +46,7 @@ private static void generateBlockKeys(RegistrateLangProvider provider) { replace(provider, "block.gtceu.casing_grate", "Grate Machine Casing"); replace(provider, "block.gtceu.assembly_line_unit", "Assembly Control Casing"); replace(provider, "block.gtceu.ptfe_pipe_casing", "PTFE Pipe Casing"); + replace(provider, "block.gtceu.palladium_substation", "Palladium Substation Casing"); // Gearboxes replace(provider, "block.gtceu.bronze_gearbox", "Bronze Gearbox Casing"); @@ -65,7 +66,6 @@ private static void generateBlockKeys(RegistrateLangProvider provider) { replace(provider, "block.gtceu.steel_pipe_casing", "Steel Pipe Casing"); replace(provider, "block.gtceu.titanium_pipe_casing", "Titanium Pipe Casing"); replace(provider, "block.gtceu.tungstensteel_pipe_casing", "Tungstensteel Pipe Casing"); - replace(provider, "block.gtceu.palladium_substation", "Palladium Substation Casing"); // Bricked Casings replace(provider, "block.gtceu.steam_casing_bronze", "Bronze Hull"); @@ -108,19 +108,19 @@ private static void generateBlockKeys(RegistrateLangProvider provider) { private static void generateBlockTooltips(RegistrateLangProvider provider) { // Coil Tooltip - replace(provider, "block.gtceu.wire_coil.tooltip_extended_info", "§7Hold SHIFT to show Coil Bonus Info"); - replace(provider, "block.gtceu.wire_coil.tooltip_heat", "§cBase Heat Capacity: §f%d K"); - replace(provider, "block.gtceu.wire_coil.tooltip_smelter", "§8Multi Smelter:"); - replace(provider, "block.gtceu.wire_coil.tooltip_parallel_smelter", " §5Max Parallel: §f%s"); - replace(provider, "block.gtceu.wire_coil.tooltip_energy_smelter", " §aEnergy Usage: §f%s EU/t §8per recipe"); - replace(provider, "block.gtceu.wire_coil.tooltip_pyro", "§8Pyrolyse Oven:"); - replace(provider, "block.gtceu.wire_coil.tooltip_speed_pyro", " §bProcessing Speed: §f%s%%"); - replace(provider, "block.gtceu.wire_coil.tooltip_cracking", "§8Cracking Unit:"); - replace(provider, "block.gtceu.wire_coil.tooltip_energy_cracking", " §aEnergy Usage: §f%s%%"); + replace(provider, "block.gtceu.wire_coil.tooltip.extended_info", "§7Hold SHIFT to show Coil Bonus Info"); + replace(provider, "block.gtceu.wire_coil.tooltip.heat", "§cBase Heat Capacity: §f%d K"); + replace(provider, "block.gtceu.wire_coil.tooltip.smelter", "§8Multi Smelter:"); + replace(provider, "block.gtceu.wire_coil.tooltip.parallel_smelter", " §5Max Parallel: §f%s"); + replace(provider, "block.gtceu.wire_coil.tooltip.energy_smelter", " §aEnergy Usage: §f%s EU/t §8per recipe"); + replace(provider, "block.gtceu.wire_coil.tooltip.pyro", "§8Pyrolyse Oven:"); + replace(provider, "block.gtceu.wire_coil.tooltip.speed_pyro", " §bProcessing Speed: §f%s%%"); + replace(provider, "block.gtceu.wire_coil.tooltip.cracking", "§8Cracking Unit:"); + replace(provider, "block.gtceu.wire_coil.tooltip.energy_cracking", " §aEnergy Usage: §f%s%%"); // Substation Capacitors - provider.add("block.gtceu.substation_capacitor.tooltip_empty", "§7For filling space in your Power Substation"); - provider.add("block.gtceu.substation_capacitor.tooltip_filled", "§cEnergy Capacity: §f%d EU"); + provider.add("block.gtceu.substation_capacitor.tooltip.empty", "§7For filling space in your Power Substation"); + provider.add("block.gtceu.substation_capacitor.tooltip.filled", "§cEnergy Capacity: §f%d EU"); // Bricked Casings provider.add("block.gtceu.steam_casing_bronze.tooltip", "§7For your first Steam Machines"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java index 92719b5f39b..08d3b6e81ac 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java @@ -22,8 +22,8 @@ public static void init(RegistrateLangProvider provider) { Configuration.registerConfig(ConfigHolder.class, ConfigFormats.yaml()).getValueMap(), ""); } - - private static void recurseGenerateConfigLang(RegistrateLangProvider provider, Set added, Map> map, String parentKey) { + private static void recurseGenerateConfigLang(RegistrateLangProvider provider, Set added, + Map> map, String parentKey) { for (var entry : map.entrySet()) { var id = entry.getValue().getId(); if (added.add(id)) { diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java index 83e96dc44e5..c56c66d9241 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.tterrag.registrate.providers.RegistrateLangProvider; @@ -21,8 +20,6 @@ public static void init(RegistrateLangProvider provider) { } private static void initGeneratedNames(RegistrateLangProvider provider) { - - // All TagPrefixes for (TagPrefix tagPrefix : TagPrefix.values()) { provider.add(tagPrefix.getUnlocalizedName(), tagPrefix.langValue); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java index fdf759525ec..8f70bee03b0 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java @@ -24,10 +24,11 @@ public static void init(RegistrateLangProvider provider) { public static void standardTooltips(RegistrateLangProvider provider, String root, String machine, String lowTier, String midTier, String highTier) { - makeElectricMachineTooltipLVtoUV(provider, root, machine, - lowTier, lowTier, lowTier, + makeElectricMachineTooltipULVtoMAX(provider, root, machine, + lowTier, lowTier, lowTier, lowTier, lowTier, midTier, midTier, midTier, - highTier); + highTier, highTier, highTier, highTier, + highTier, highTier, highTier); } private static void generateSteamMachines(RegistrateLangProvider provider) { @@ -80,9 +81,9 @@ private static void generateCustomMachineTooltips(RegistrateLangProvider provide provider.add("gtceu.machine.steam_boiler.heat_amount", "Heat Capacity: %s %%"); // Generators - provider.add("gtceu.machine.combustion_generator.tooltip", "§7Requires flammable Liquids"); - provider.add("gtceu.machine.steam_turbine.tooltip", "§7Converts Steam into EU"); - provider.add("gtceu.machine.gas_turbine.tooltip", "§7Requires flammable Gases"); + provider.add("recipe_type.gtceu.combustion_generator.tooltip", "§7Requires flammable Liquids"); + provider.add("recipe_type.gtceu.steam_turbine.tooltip", "§7Converts Steam into EU"); + provider.add("recipe_type.gtceu.gas_turbine.tooltip", "§7Requires flammable Gases"); // Machine Hull provider.add("gtceu.machine.hull.tooltip", @@ -95,7 +96,7 @@ private static void generateCustomMachineTooltips(RegistrateLangProvider provide // Transformer provider.add("gtceu.machine.transformer.description", "§7Transforms Energy between voltage tiers"); provider.add("gtceu.machine.transformer.tooltip_tool_usage", - "Starts as §fTransform Down§7, use Screwdriver to change"); + "§7Starts as §fTransform Down§7, use Screwdriver to change"); provider.add("gtceu.machine.transformer.tooltip_transform_down", "§aTransform Down: §f%dA %s EU (%s§f) -> %dA %s EU (%s§f)"); provider.add("gtceu.machine.transformer.message_transform_down", @@ -238,6 +239,11 @@ private static void generateCustomPerTierMachineTooltips(RegistrateLangProvider provider.add("gtceu.machine.luv_macerator.tooltip", "§7Blend-O-Matic 9002"); provider.add("gtceu.machine.zpm_macerator.tooltip", "§7Blend-O-Matic 9003"); provider.add("gtceu.machine.uv_macerator.tooltip", "§7Shape Eliminator"); + provider.add("gtceu.machine.uhv_macerator.tooltip", "§7Shape Eliminator"); + provider.add("gtceu.machine.uev_macerator.tooltip", "§7Shape Eliminator"); + provider.add("gtceu.machine.uiv_macerator.tooltip", "§7Shape Eliminator"); + provider.add("gtceu.machine.uxv_macerator.tooltip", "§7Shape Eliminator"); + provider.add("gtceu.machine.opv_macerator.tooltip", "§7Shape Eliminator"); // Centrifuge provider.add("gtceu.machine.lv_centrifuge.tooltip", "§7Separating Molecules"); @@ -248,6 +254,11 @@ private static void generateCustomPerTierMachineTooltips(RegistrateLangProvider provider.add("gtceu.machine.luv_centrifuge.tooltip", "§7Molecular Cyclone"); provider.add("gtceu.machine.zpm_centrifuge.tooltip", "§7Molecular Cyclone"); provider.add("gtceu.machine.uv_centrifuge.tooltip", "§7Molecular Tornado"); + provider.add("gtceu.machine.uhv_centrifuge.tooltip", "§7Molecular Tornado"); + provider.add("gtceu.machine.uev_centrifuge.tooltip", "§7Molecular Tornado"); + provider.add("gtceu.machine.uiv_centrifuge.tooltip", "§7Molecular Tornado"); + provider.add("gtceu.machine.uxv_centrifuge.tooltip", "§7Molecular Tornado"); + provider.add("gtceu.machine.opv_centrifuge.tooltip", "§7Molecular Tornado"); // Laser Engraver provider.add("gtceu.machine.lv_laser_engraver.tooltip", "§7Don't look directly at the Laser"); @@ -258,6 +269,11 @@ private static void generateCustomPerTierMachineTooltips(RegistrateLangProvider provider.add("gtceu.machine.luv_laser_engraver.tooltip", "§7With the Power of 8.16 MW"); provider.add("gtceu.machine.zpm_laser_engraver.tooltip", "§7With the Power of 32.64 MW"); provider.add("gtceu.machine.uv_laser_engraver.tooltip", "§7Exact Photon Cannon"); + provider.add("gtceu.machine.uhv_laser_engraver.tooltip", "§7Exact Photon Cannon"); + provider.add("gtceu.machine.uev_laser_engraver.tooltip", "§7Exact Photon Cannon"); + provider.add("gtceu.machine.uiv_laser_engraver.tooltip", "§7Exact Photon Cannon"); + provider.add("gtceu.machine.uxv_laser_engraver.tooltip", "§7Exact Photon Cannon"); + provider.add("gtceu.machine.opv_laser_engraver.tooltip", "§7Exact Photon Cannon"); // Thermal Centrifuge provider.add("gtceu.machine.lv_thermal_centrifuge.tooltip", "§7Separating Ores more precisely"); @@ -268,6 +284,11 @@ private static void generateCustomPerTierMachineTooltips(RegistrateLangProvider provider.add("gtceu.machine.luv_thermal_centrifuge.tooltip", "§7Blaze Sweatshop T-6351"); provider.add("gtceu.machine.zpm_thermal_centrifuge.tooltip", "§7Blaze Sweatshop T-6352"); provider.add("gtceu.machine.uv_thermal_centrifuge.tooltip", "§7Fire Cyclone"); + provider.add("gtceu.machine.uhv_thermal_centrifuge.tooltip", "§7Fire Cyclone"); + provider.add("gtceu.machine.uev_thermal_centrifuge.tooltip", "§7Fire Cyclone"); + provider.add("gtceu.machine.uiv_thermal_centrifuge.tooltip", "§7Fire Cyclone"); + provider.add("gtceu.machine.uxv_thermal_centrifuge.tooltip", "§7Fire Cyclone"); + provider.add("gtceu.machine.opv_thermal_centrifuge.tooltip", "§7Fire Cyclone"); // Electrolyzer provider.add("gtceu.machine.lv_electrolyzer.tooltip", "§7Electrolyzing Molecules"); @@ -278,6 +299,11 @@ private static void generateCustomPerTierMachineTooltips(RegistrateLangProvider provider.add("gtceu.machine.luv_electrolyzer.tooltip", "§7Molecular Disintegrator E-4907"); provider.add("gtceu.machine.zpm_electrolyzer.tooltip", "§7Molecular Disintegrator E-4908"); provider.add("gtceu.machine.uv_electrolyzer.tooltip", "§7Atomic Ionizer"); + provider.add("gtceu.machine.uhv_electrolyzer.tooltip", "§7Atomic Ionizer"); + provider.add("gtceu.machine.uev_electrolyzer.tooltip", "§7Atomic Ionizer"); + provider.add("gtceu.machine.uiv_electrolyzer.tooltip", "§7Atomic Ionizer"); + provider.add("gtceu.machine.uxv_electrolyzer.tooltip", "§7Atomic Ionizer"); + provider.add("gtceu.machine.opv_electrolyzer.tooltip", "§7Atomic Ionizer"); // Lathe provider.add("gtceu.machine.lv_lathe.tooltip", "§7Produces Rods more efficiently"); @@ -288,6 +314,11 @@ private static void generateCustomPerTierMachineTooltips(RegistrateLangProvider provider.add("gtceu.machine.luv_lathe.tooltip", "§7Turn-O-Matic L-5907"); provider.add("gtceu.machine.zpm_lathe.tooltip", "§7Turn-O-Matic L-5908"); provider.add("gtceu.machine.uv_lathe.tooltip", "§7Rotation Grinder"); + provider.add("gtceu.machine.uhv_lathe.tooltip", "§7Rotation Grinder"); + provider.add("gtceu.machine.uev_lathe.tooltip", "§7Rotation Grinder"); + provider.add("gtceu.machine.uiv_lathe.tooltip", "§7Rotation Grinder"); + provider.add("gtceu.machine.uxv_lathe.tooltip", "§7Rotation Grinder"); + provider.add("gtceu.machine.opv_lathe.tooltip", "§7Rotation Grinder"); // Ore Washer provider.add("gtceu.machine.lv_ore_washer.tooltip", "§7Getting more Byproducts from your Ores"); @@ -298,6 +329,11 @@ private static void generateCustomPerTierMachineTooltips(RegistrateLangProvider provider.add("gtceu.machine.luv_ore_washer.tooltip", "§7Repurposed Laundry-Washer I-361"); provider.add("gtceu.machine.zpm_ore_washer.tooltip", "§7Repurposed Laundry-Washer I-362"); provider.add("gtceu.machine.uv_ore_washer.tooltip", "§7Miniature Car Wash"); + provider.add("gtceu.machine.uhv_ore_washer.tooltip", "§7Miniature Car Wash"); + provider.add("gtceu.machine.uev_ore_washer.tooltip", "§7Miniature Car Wash"); + provider.add("gtceu.machine.uiv_ore_washer.tooltip", "§7Miniature Car Wash"); + provider.add("gtceu.machine.uxv_ore_washer.tooltip", "§7Miniature Car Wash"); + provider.add("gtceu.machine.opv_ore_washer.tooltip", "§7Miniature Car Wash"); // Electric Furnace standardTooltips(provider, "gtceu.machine", @@ -1202,11 +1238,9 @@ private static void makeElectricMachineTooltipLVtoUV(RegistrateLangProvider prov private static void makeElectricMachineTooltipULVtoMAX(RegistrateLangProvider provider, String root, String machineName, String ulvTooltip, String lvTooltip, String mvTooltip, - String hvTooltip, - String evTooltip, String ivTooltip, String luvTooltip, - String zpmTooltip, - String uvTooltip, String uhvTooltip, String uevTooltip, - String uivTooltip, + String hvTooltip, String evTooltip, String ivTooltip, + String luvTooltip, String zpmTooltip, String uvTooltip, + String uhvTooltip, String uevTooltip, String uivTooltip, String uxvTooltip, String opvTooltip, String maxTooltip) { if (ulvTooltip != null) { provider.add("%s.ulv_%s.tooltip".formatted(root, machineName), "§7%s".formatted(ulvTooltip)); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java index 2fd98ba60d5..343525bc610 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.data.lang; import com.gregtechceu.gtceu.api.registry.GTRegistries; + import com.tterrag.registrate.providers.RegistrateLangProvider; import static com.gregtechceu.gtceu.data.lang.LangUtil.*; From c67b507e29225126a34d076620fa7dce97d72751 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Thu, 26 Jun 2025 17:13:03 -0600 Subject: [PATCH 30/45] gtceu.machine -> machine.gtceu, fix hard coded recipe type mod lang, large boiler tooltips, start tooltips for multiblocks --- .../resources/assets/gtceu/lang/en_ud.json | 1318 ++++++++--------- .../resources/assets/gtceu/lang/en_us.json | 1318 ++++++++--------- .../gtceu/api/block/MetaMachineBlock.java | 5 +- .../gtceu/api/machine/MetaMachine.java | 5 +- .../api/machine/steam/SteamBoilerMachine.java | 2 +- .../gtceu/common/data/GTMachines.java | 48 +- .../common/data/machines/GCYMMachines.java | 76 +- .../common/data/machines/GTMachineUtils.java | 28 +- .../common/data/machines/GTMultiMachines.java | 5 +- .../machine/electric/ConverterMachine.java | 4 +- .../machine/electric/TransformerMachine.java | 4 +- .../electric/WorldAcceleratorMachine.java | 2 +- .../multiblock/part/DiodePartMachine.java | 2 +- .../common/machine/storage/DrumMachine.java | 2 +- .../machine/storage/QuantumChestMachine.java | 2 +- .../gtceu/data/lang/MachineLang.java | 498 +++---- .../provider/SteamBoilerBlockProvider.java | 8 +- .../top/provider/SteamBoilerInfoProvider.java | 8 +- 18 files changed, 1660 insertions(+), 1675 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 2b3be57c69c..8c2b091b531 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -2502,21 +2502,9 @@ "gtceu.machine.active_transformer.tooltip.3": "˙ㄥ§sɹǝsɐꞀ ", "gtceu.machine.advanced_processing_array.tooltip": "pןɹoM ǝɥʇ ǝzıןǝןןɐɹɐԀ", "gtceu.machine.assembly_line.tooltip": "¡ǝuıɥɔɐW buıןqɯǝssⱯ ʞɔoןqıʇןnɯ ɐ ʇoN", - "gtceu.machine.available_recipe_map_1.tooltip": "%s :sǝdʎ⟘ ǝdıɔǝᴚ ǝןqɐןıɐʌⱯ", - "gtceu.machine.available_recipe_map_2.tooltip": "%s '%s :sǝdʎ⟘ ǝdıɔǝᴚ ǝןqɐןıɐʌⱯ", - "gtceu.machine.available_recipe_map_3.tooltip": "%s '%s '%s :sǝdʎ⟘ ǝdıɔǝᴚ ǝןqɐןıɐʌⱯ", - "gtceu.machine.available_recipe_map_4.tooltip": "%s '%s '%s '%s :sǝdʎ⟘ ǝdıɔǝᴚ ǝןqɐןıɐʌⱯ", - "gtceu.machine.basic.input_from_output_side.allow": " :ǝpıS ʇndʇnO ɯoɹɟ ʇnduI ʍoןןⱯ", - "gtceu.machine.basic.input_from_output_side.disallow": " :ǝpıS ʇndʇnO ɯoɹɟ ʇnduI ʍoןןɐsıᗡ", "gtceu.machine.bedrock_ore_miner.depletion": "%s%%ɟ§ :ǝʇɐᴚ uoıʇǝןdǝᗡq§", "gtceu.machine.bedrock_ore_miner.description": "˙ʞɔoɹpǝq ɹǝpun suıǝʌ ɯoɹɟ sǝɹo sןןıɹᗡㄥ§", "gtceu.machine.bedrock_ore_miner.production": "pǝʞɔoןɔɹǝʌo xɟ% 'x%dɟ§ :ɹǝıןdıʇןnW uoıʇɔnpoɹԀǝ§", - "gtceu.machine.block_breaker.speed_bonus": "%d%%ɟ§ :snuoᗺ pǝǝdSǝ§", - "gtceu.machine.block_breaker.tooltip": "sdoɹp sʇı sʇɔǝןןoɔ puɐ ǝɔɐɟ ʇuoɹɟ uo ʞɔoןq sǝuıWㄥ§", - "gtceu.machine.boiler.info.cooling.down": "%sɹ§uʍop buıןooƆ6§", - "gtceu.machine.boiler.info.heating.up": "%sɹ§dn buıʇɐǝHɔ§", - "gtceu.machine.boiler.info.producing.steam": ")ɹǝʇɐʍ buıןıoq(ɐ§ ", - "gtceu.machine.buffer.tooltip": "spınןℲ puɐ sɯǝʇI ǝɹoʇs oʇ ɹǝɟɟnᗺ ןןɐɯS Ɐ", "gtceu.machine.canner.jei_description": ")sןןǝƆ pınןℲ ɹo sʇǝʞɔnᗺ ˙b˙ǝ( ɹǝuuɐƆ pınןℲ ǝɥʇ ɥʇıʍ sɹǝuıɐʇuoɔ pınןɟ ʎuɐ ʎʇdɯǝ puɐ ןןıɟ uɐɔ noʎ", "gtceu.machine.central_monitor.tooltip": "¿ɯooᗡ unɹ ʇı uɐɔ ʇnᗺ", "gtceu.machine.charcoal_pile.tooltip": "ʎɹǝʞɐq ןǝnɟ punoɹbɹǝpu∩", @@ -2536,7 +2524,6 @@ "gtceu.machine.cleanroom.tooltip.ae2.channels": "˙sןןɐʍ ǝɥʇ uı ㄥ§sןןnHɟ§ ɥbnoɹɥʇㄥ§ sןǝuuɐɥƆ ᄅƎⱯ 8ɟ§ oʇ dn puǝS", "gtceu.machine.cleanroom.tooltip.ae2.no_channels": "˙sןןɐʍ ǝɥʇ uı ㄥ§sןןnHɟ§ ɥbnoɹɥʇ ㄥ§sʞɹoʍʇǝN ᄅƎⱯɐ§ puǝS", "gtceu.machine.cleanroom.tooltip.hold_ctrl": "uoıʇɐɯɹoɟuI ǝɹnʇɔnɹʇS ןɐuoıʇıppɐ ʍoɥs oʇ Ꞁᴚ⟘Ɔ pןoH", - "gtceu.machine.coke_oven.tooltip": "ɹǝʍoԀ puɐ ןǝǝʇS ɹoɟ sןǝnɟ ɹǝʇʇǝq buıʞɐW", "gtceu.machine.coke_oven_hatch.tooltip": "˙uǝʌO ǝʞoƆ ǝɥʇ ɹoɟ ssǝɔɔɐ uoıʇɐɯoʇnɐ sʍoןןⱯㄥ§", "gtceu.machine.computation_receiver_hatch.tooltip": "sʞɔoןqıʇןnW ɹoɟ ʇnduI ɐʇɐᗡ uoıʇɐʇndɯoƆ", "gtceu.machine.computation_transmitter_hatch.tooltip": "sʞɔoןqıʇןnW ɹoɟ ʇndʇnO ɐʇɐᗡ uoıʇɐʇndɯoƆ", @@ -2551,77 +2538,19 @@ "gtceu.machine.data_bank.tooltip.4": "˙pǝuıɐɥɔ uǝɥʍ ɥɔʇɐH ןɐɔıʇdO/ɐʇɐᗡ ɹǝd ㄥ§ʇ/∩Ǝ %sɟ§ sǝs∩", "gtceu.machine.data_receiver_hatch.tooltip": "sʞɔoןqıʇןnW ɹoɟ ʇnduI ɐʇɐᗡ ɥɔɹɐǝsǝᴚ", "gtceu.machine.data_transmitter_hatch.tooltip": "sʞɔoןqıʇןnW ɹoɟ ʇndʇnO ɐʇɐᗡ ɥɔɹɐǝsǝᴚ", - "gtceu.machine.diode.message": "%s :ʇndɥbnoɹɥʇ ǝbɐɹǝdɯⱯ xɐW", - "gtceu.machine.diode.tooltip_general": "ǝbɐɹǝdɯⱯ sʇıɯıן puɐ uoıʇɔǝɹıp ǝuo uı ʍoןℲ ʎbɹǝuƎ sʍoןןⱯ", - "gtceu.machine.diode.tooltip_starts_at": "ǝbuɐɥɔ oʇ ʇǝןןɐW ʇɟoS ǝsn 'ㄥ§ⱯƖɟ§ sɐ sʇɹɐʇS", - "gtceu.machine.diode.tooltip_tool_usage": "˙ʍoןɟ ǝbɐɹǝdɯⱯ ǝbuɐɥɔ oʇ ʇǝןןɐW ʇɟoS ɐ ɥʇıʍ ʇıH", "gtceu.machine.distillation_tower.tooltip": "ʎɹǝuıɟǝᴚ pınןℲ", - "gtceu.machine.drum.disable_output": "pınןℲ uıɐɹp ʇou ןןıM", - "gtceu.machine.drum.enable_output": "sʞuɐ⟘ ʇuǝɔɐظpɐ pɹɐʍuʍop oʇ pınןℲ uıɐɹp ןןıM", "gtceu.machine.dual_hatch.export.tooltip": "sʞɔoןqıʇןnW ɹoɟ ʇndʇnO pınןℲ puɐ ɯǝʇI", "gtceu.machine.dual_hatch.import.tooltip": "sʞɔoןqıʇןnW ɹoɟ ʇnduI pınןℲ puɐ ɯǝʇI", - "gtceu.machine.electric_blast_furnace.tooltip": "¿ɹǝʞoɯs ɔıɹʇɔǝןǝ ǝɥʇ s,ǝɹǝɥM", - "gtceu.machine.electric_blast_furnace.tooltip.0": "˙buıʞɔoןɔɹǝʌo-ǝɹd pǝıןddɐ sı ɹǝıןdıʇןnɯ ʎbɹǝuǝ ㄥ§%%ϛ6ɟ§ ǝʌıʇɐɔıןdıʇןnɯ ɐ 'ǝɹnʇɐɹǝdɯǝʇ ǝdıɔǝɹ ǝɥʇ ǝʌoqɐ ㄥ§ʞ006ɟ§ ʎɹǝʌǝ ɹoℲ", - "gtceu.machine.electric_blast_furnace.tooltip.1": "˙)ʞɔoןɔɹǝʌo ʇɔǝɟɹǝd( ㄥ§ʇuǝıɔıɟɟǝ %%00Ɩɟ§ sǝɯoɔǝq ʞɔoןɔɹǝʌo ǝuo 'ǝɹnʇɐɹǝdɯǝʇ ǝdıɔǝɹ ǝɥʇ ǝʌoqɐ ㄥ§ʞ008Ɩɟ§ ʎɹǝʌǝ ɹoℲ", - "gtceu.machine.electric_blast_furnace.tooltip.2": "˙ㄥ§ʞ00Ɩɟ§ ʎq pǝsɐǝɹɔuı sı ǝɹnʇɐɹǝdɯǝʇ 'ㄥ§ΛWq§ ǝʌoqɐ ɹǝıʇ ǝbɐʇןoʌ ʎɹǝʌǝ ɹoℲ", "gtceu.machine.endpoint.tooltip.0": "˙ǝuıןǝdıd ɐ ǝʇɐǝɹɔ oʇ sʞɔoןq ㄥ§ǝdıԀ ǝɔuɐʇsıᗡ buoꞀɟ§ ɥʇıʍ ʇɔǝuuoƆ", "gtceu.machine.endpoint.tooltip.1": "˙ʇuıodpuǝ ㄥ§ʇndʇnO Ɩɟ§ puɐ ㄥ§ʇnduI Ɩɟ§ ʎןʇɔɐxǝ ǝʌɐɥ ʇsnɯ sǝuıןǝdıԀ", "gtceu.machine.endpoint.tooltip.2": "˙ㄥ§pǝpɐoן-ʞunɥɔɟ§ ǝq oʇ pǝǝu sʇuıodpuǝ ǝuıןǝdıd ʎןuO", "gtceu.machine.endpoint.tooltip.min_length": "sʞɔoןᗺ %dɟ§ :ǝɔuɐʇsıᗡ ʇuıodpuƎ ɯnɯıuıWq§", - "gtceu.machine.energy_converter.description": "ƎℲ puɐ ∩Ǝ uǝǝʍʇǝq ʎbɹǝuƎ sʇɹǝʌuoƆ", - "gtceu.machine.energy_converter.message_conversion_eu": "ǝʌıʇɐN %d :ʇnO '∩Ǝ %d Ɐ%d :uI '∩Ǝ buıʇɹǝʌuoƆ", - "gtceu.machine.energy_converter.message_conversion_native": "∩Ǝ %d Ɐ%d :ʇnO 'ƎℲ %d :uI 'ʎbɹǝuƎ ǝʌıʇɐN buıʇɹǝʌuoƆ", - "gtceu.machine.energy_converter.tooltip_conversion_eu": "ǝʌıʇɐN %d >- )ɟ§%s( ∩Ǝ %d Ɐ%dɟ§ :uoısɹǝʌuoƆ ∩Ǝɐ§", - "gtceu.machine.energy_converter.tooltip_conversion_native": ")ɟ§%s( ∩Ǝ %d Ɐ%d >- ƎℲ %dɟ§ :uoısɹǝʌuoƆ ǝʌıʇɐNɔ§", - "gtceu.machine.energy_converter.tooltip_tool_usage": "ǝbuɐɥɔ oʇ ʇǝןןɐW ʇɟoS ǝsn 'ㄥ§ɹǝʇɹǝʌuoƆ ƎℲɟ§ sɐ sʇɹɐʇS", "gtceu.machine.energy_hatch.input.tooltip": "sʞɔoןqıʇןnW ɹoɟ ʇnduI ʎbɹǝuƎ", "gtceu.machine.energy_hatch.input_hi_amp.tooltip": "sʞɔoןqıʇןnW ɹoɟ ʇnduI ʎbɹǝuƎ ǝɹǝdɯⱯ ǝןdıʇןnW", "gtceu.machine.energy_hatch.output.tooltip": "sʞɔoןqıʇןnW ɹoɟ ʇndʇnO ʎbɹǝuƎ", "gtceu.machine.energy_hatch.output_hi_amp.tooltip": "sʞɔoןqıʇןnW ɹoɟ ʇndʇnO ʎbɹǝuƎ ǝɹǝdɯⱯ ǝןdıʇןnW", - "gtceu.machine.ev_alloy_smelter.tooltip": "ɹǝʇןǝɯS uoıʇɐuıqɯoɔ ɥɔǝ⟘ɥbıHㄥ§", - "gtceu.machine.ev_arc_furnace.tooltip": "¿ǝɔɐuɹnℲ ʇsɐןᗺ ɐ spǝǝu oɥMㄥ§", - "gtceu.machine.ev_assembler.tooltip": "¡ǝןqɯǝssⱯ 'sɹǝbuǝʌⱯㄥ§", - "gtceu.machine.ev_autoclave.tooltip": "sʇsnᗡ ɹnoʎ buızıןןɐʇsʎɹƆㄥ§", - "gtceu.machine.ev_bender.tooltip": "¡¡¡ᴚƎᗡNƎᗺ ʇuɐʍ ǝM ¡pɐq s,ǝɥ 'ooᗺㄥ§", - "gtceu.machine.ev_brewery.tooltip": "buıʍǝɹq uoıʇod ʇuǝıɔıɟɟǝ puɐ ʇɔɐdɯoƆㄥ§", - "gtceu.machine.ev_canner.tooltip": "sɹǝuıɐʇuoƆ ɟo ʇno puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", - "gtceu.machine.ev_centrifuge.tooltip": "ɹoʇɐɹɐdǝS ɹɐןnɔǝןoWㄥ§", - "gtceu.machine.ev_chemical_bath.tooltip": "ɯǝɥʇ ǝʇɐɹɐdǝs oʇ sןɐɔıɯǝɥƆ uı sǝɹO buıɥʇɐᗺㄥ§", - "gtceu.machine.ev_chemical_reactor.tooltip": "ɹǝɥʇo ɥɔɐǝ ɥʇıʍ ʇɔɐǝɹ sןɐɔıɯǝɥƆ buıʇʇǝꞀㄥ§", - "gtceu.machine.ev_circuit_assembler.tooltip": "ǝɔɐןd ǝɥʇ ɹǝʌo ןןɐ ǝɔɐןԀ-u-ʞɔıԀㄥ§", - "gtceu.machine.ev_compressor.tooltip": "ㄥㄥƆ ɔıʇɐW-O-ssǝɹdɯoƆㄥ§", - "gtceu.machine.ev_cutter.tooltip": "ǝɔıᗡ N,ǝɔıןSㄥ§", - "gtceu.machine.ev_distillery.tooltip": "spınןℲ ɟo sʇɹɐԀ ʇuɐʌǝןǝɹ ʇsoɯ buıʇɔɐɹʇxƎㄥ§", - "gtceu.machine.ev_electric_furnace.tooltip": "ㄣ9 ǝɹopoɯɯoƆ ɐ buısn ǝʞıן ʇoNㄥ§", - "gtceu.machine.ev_electrolyzer.tooltip": "sǝןnɔǝןoW buızʎןoɹʇɔǝןƎㄥ§", - "gtceu.machine.ev_electromagnetic_separator.tooltip": "ʇsǝɹ ǝɥʇ ɯoɹɟ sǝɹO ɔıʇǝubɐɯ ǝɥʇ buıʇɐɹɐdǝSㄥ§", - "gtceu.machine.ev_extractor.tooltip": "ƐᄅƖᗡ - ɯooᗡ ɟo ǝɔıʌǝᗡ-ɹǝɔınظǝᗡㄥ§", - "gtceu.machine.ev_extruder.tooltip": "buıʞɹoM ןɐʇǝW ɹoɟ ǝuıɥɔɐW ןɐsɹǝʌıu∩ㄥ§", - "gtceu.machine.ev_fermenter.tooltip": "spınןℲ buıʇuǝɯɹǝℲㄥ§", "gtceu.machine.ev_fluid_drilling_rig.tooltip": "ɹǝuıɐɹᗡ ןןǝM", - "gtceu.machine.ev_fluid_heater.tooltip": "spınןℲ ɹnoʎ dn buıʇɐǝHㄥ§", - "gtceu.machine.ev_fluid_solidifier.tooltip": "spıןoS ɯɹoɟ oʇ uʍop spınןℲ sןooƆㄥ§", - "gtceu.machine.ev_forge_hammer.tooltip": "¡ǝɯıʇɹǝɯɯɐH 'doʇSㄥ§", - "gtceu.machine.ev_forming_press.tooltip": "sbuıɥʇ oʇuı sǝbɐɯI buıʇuıɹdɯIㄥ§", - "gtceu.machine.ev_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɹıɐ ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", - "gtceu.machine.ev_laser_engraver.tooltip": "ɹǝsɐꞀ ǝɥʇ ʇɐ ʎןʇɔǝɹıp ʞooן ʇ,uoᗡㄥ§", - "gtceu.machine.ev_lathe.tooltip": "ʎןʇuǝıɔıɟɟǝ ǝɹoɯ spoᴚ sǝɔnpoɹԀㄥ§", - "gtceu.machine.ev_macerator.tooltip": "sʇɔnpoɹdʎᗺ ɥʇıʍ sǝɹO ɹnoʎ buıppǝɹɥSㄥ§", - "gtceu.machine.ev_mass_fabricator.tooltip": "pǝɹɐnbS uoıʇɐɔıɹqɐℲ * ɹǝʇʇɐW W∩∩ㄥ§", - "gtceu.machine.ev_mixer.tooltip": "¿puǝןᗺ ʇı ןןıMㄥ§", - "gtceu.machine.ev_ore_washer.tooltip": "sǝɹO ɹnoʎ ɯoɹɟ sʇɔnpoɹdʎᗺ ǝɹoɯ buıʇʇǝ⅁ㄥ§", - "gtceu.machine.ev_packer.tooltip": "sǝxoᗺ ɟo ʇno sbuıɥʇ sqɐɹ⅁ puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", - "gtceu.machine.ev_polarizer.tooltip": "sʇǝubɐW ɹnoʎ buısıɹɐןodıᗺㄥ§", - "gtceu.machine.ev_replicator.tooltip": "sʇuǝɯǝןƎ ɟo ʇsǝɹnԀ ǝɥʇ buıɔnpoɹԀㄥ§", - "gtceu.machine.ev_rock_crusher.tooltip": "ʇuǝɔɐظpɐ ʎןןɐʇuozıɹoɥ ɐʌɐꞀ puɐ ɹǝʇɐM ǝɔɐןԀㄥ§", - "gtceu.machine.ev_scanner.tooltip": "sbuıɥʇ ɹǝɥʇo puɐ sןɐıɹǝʇɐW suɐɔSㄥ§", - "gtceu.machine.ev_sifter.tooltip": "buıʇɟıs dǝǝʞ puɐ ɯןɐɔ ʎɐʇSㄥ§", - "gtceu.machine.ev_thermal_centrifuge.tooltip": "ʎןǝsıɔǝɹd ǝɹoɯ sǝɹO buıʇɐɹɐdǝSㄥ§", - "gtceu.machine.ev_wiremill.tooltip": "ʎןʇuǝıɔıɟɟǝ ǝɹoɯ sǝɹıM sǝɔnpoɹԀㄥ§", "gtceu.machine.extreme_combustion_engine.tooltip": "ɹǝsɐǝןǝᴚ ʎbɹǝuƎ ןɐɔıɯǝɥƆ ǝɯǝɹʇxƎ", - "gtceu.machine.fisher.requirement": "˙ʍoןǝq ʎןʇɔǝɹıp ɹǝʇɐʍ ɟo ǝɹɐnbs pǝɹǝʇuǝɔ %dx%d ɐ sǝɹınbǝᴚ", - "gtceu.machine.fisher.speed": "sʞɔıʇ %d ʎɹǝʌǝ buıɥʇǝɯos sǝɥɔʇɐƆ", - "gtceu.machine.fisher.tooltip": "˙ǝɯıʇ ɥɔɐǝ buıɹʇs ǝuo sǝɯnsuoƆ ˙ɥsıɟ oʇ buıɹʇs sʇsoƆ", "gtceu.machine.fluid_drilling_rig.depletion": "%s%%ɟ§ :ǝʇɐᴚ uoıʇǝןdǝᗡq§", "gtceu.machine.fluid_drilling_rig.description": "˙ʞɔoɹpǝq ɹǝpun suıǝʌ ɯoɹɟ spınןɟ sןןıɹᗡㄥ§", "gtceu.machine.fluid_drilling_rig.production": "pǝʞɔoןɔɹǝʌo xɟ% 'x%dɟ§ :ɹǝıןdıʇןnW uoıʇɔnpoɹԀǝ§", @@ -2637,17 +2566,6 @@ "gtceu.machine.high_performance_computation_array.tooltip.0": "ɹǝʇndɯoɔɹǝdnS ǝbɐɹǝʌɐ ɹnoʎ ʇsnſ", "gtceu.machine.high_performance_computation_array.tooltip.1": "˙)ʇɐǝɥ puɐ( ㄥ§uoıʇɐʇndɯoƆɟ§ ǝʇɐɹǝuǝb oʇ pǝs∩", "gtceu.machine.high_performance_computation_array.tooltip.2": "˙)sʇıu∩ ʞɹoM ǝʇndɯoƆ( ㄥ§ʇ/∩MƆɟ§ ǝʇɐɹǝuǝb oʇ sʇuǝuodɯoɔ ⱯƆԀH sǝɹınbǝᴚ", - "gtceu.machine.hp_steam_alloy_smelter.tooltip": "ɹǝʇןǝɯS uoıʇɐuıqɯoƆㄥ§", - "gtceu.machine.hp_steam_compressor.tooltip": "sɯǝʇI buıssǝɹdɯoƆㄥ§", - "gtceu.machine.hp_steam_extractor.tooltip": "ɹǝqqnᴚ ʇsɹıɟ ɹnoʎ buıʇɔɐɹʇxƎㄥ§", - "gtceu.machine.hp_steam_forge_hammer.tooltip": "ɹǝɯɯɐH ǝbɹoℲㄥ§", - "gtceu.machine.hp_steam_furnace.tooltip": "ɯɐǝʇS pǝssǝɹdɯoɔ ɥʇıʍ sbuıɥʇ buıʇןǝɯSㄥ§", - "gtceu.machine.hp_steam_liquid_boiler.tooltip": "ɹǝןıoᗺ pınbıꞀ ɯɐǝʇS ןןɐɯS uɐɥʇ ɹǝʇsɐℲㄥ§", - "gtceu.machine.hp_steam_macerator.tooltip": "sǝɹO ɹnoʎ buıʇɐɹǝɔɐWㄥ§", - "gtceu.machine.hp_steam_miner.tooltip": "¡ɹǝuıW ǝɥʇ ʍoןǝq sǝɹo sǝuıWㄥ§", - "gtceu.machine.hp_steam_rock_crusher.tooltip": "ʇuǝɔɐظpɐ ʎןןɐʇuozıɹoɥ ɐʌɐꞀ puɐ ɹǝʇɐM ǝɔɐןԀㄥ§", - "gtceu.machine.hp_steam_solar_boiler.tooltip": "unS ʎq ɹǝʍoԀ ɯɐǝʇSㄥ§", - "gtceu.machine.hp_steam_solid_boiler.tooltip": "ɹǝןıoᗺ ןǝnℲ pıןoS ɯɐǝʇS ןןɐɯS ǝɥʇ uɐɥʇ ɹǝʇsɐℲㄥ§", "gtceu.machine.hpca.active_cooler_component.tooltip": "buıןooɔ ǝʌıʇɔǝɟɟǝ ǝɹoɯ 'ǝǝɹɟ ssǝꞀ", "gtceu.machine.hpca.advanced_computation_component.damaged.name": "ʇuǝuodɯoƆ uoıʇɐʇndɯoƆ pǝɔuɐʌpⱯ ⱯƆԀH pǝbɐɯɐᗡ", "gtceu.machine.hpca.advanced_computation_component.damaged.tooltip": "bǝן ɐ puɐ ɯɹɐ uɐ ʇsoɔ ʎןuo ʇI", @@ -2668,96 +2586,10 @@ "gtceu.machine.hpca.computation_component.tooltip": "uoıʇɐʇndɯoɔ ʇsɹıɟ s,ʎqɐᗺ", "gtceu.machine.hpca.empty_component.tooltip": "ǝɔɐds buıןןıɟ ɹoɟ ʇsnſ", "gtceu.machine.hpca.heat_sink_component.tooltip": "¿ǝǝɹɟ buıɥʇʎuɐ sI ¡buıןooɔ ǝǝɹℲ", - "gtceu.machine.hull.tooltip": "sıɥʇ ǝsn oʇ ㄥ§uϛ§oƖ§ıㄥ§ʇƐ§ɐq§uɐ§ıǝ§bɔ§ɐㄣ§ɯp§Iϛ§ pǝǝu ʇsnظ noʎㄥ§", - "gtceu.machine.hv_alloy_smelter.tooltip": "ɹǝʇןǝɯS uoıʇɐuıqɯoɔ ɥɔǝ⟘ɥbıHㄥ§", - "gtceu.machine.hv_arc_furnace.tooltip": "¿ǝɔɐuɹnℲ ʇsɐןᗺ ɐ spǝǝu oɥMㄥ§", - "gtceu.machine.hv_assembler.tooltip": "¡ǝןqɯǝssⱯ 'sɹǝbuǝʌⱯㄥ§", - "gtceu.machine.hv_autoclave.tooltip": "sʇsnᗡ ɹnoʎ buızıןןɐʇsʎɹƆㄥ§", - "gtceu.machine.hv_bender.tooltip": "¡¡¡ᴚƎᗡNƎᗺ ʇuɐʍ ǝM ¡pɐq s,ǝɥ 'ooᗺㄥ§", - "gtceu.machine.hv_brewery.tooltip": "buıʍǝɹq uoıʇod ʇuǝıɔıɟɟǝ puɐ ʇɔɐdɯoƆㄥ§", - "gtceu.machine.hv_canner.tooltip": "sɹǝuıɐʇuoƆ ɟo ʇno puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", - "gtceu.machine.hv_centrifuge.tooltip": "sǝןnɔǝןoW buıʇɐɹɐdǝSㄥ§", - "gtceu.machine.hv_chemical_bath.tooltip": "ɯǝɥʇ ǝʇɐɹɐdǝs oʇ sןɐɔıɯǝɥƆ uı sǝɹO buıɥʇɐᗺㄥ§", - "gtceu.machine.hv_chemical_reactor.tooltip": "ɹǝɥʇo ɥɔɐǝ ɥʇıʍ ʇɔɐǝɹ sןɐɔıɯǝɥƆ buıʇʇǝꞀㄥ§", - "gtceu.machine.hv_circuit_assembler.tooltip": "ǝɔɐןd ǝɥʇ ɹǝʌo ןןɐ ǝɔɐןԀ-u-ʞɔıԀㄥ§", - "gtceu.machine.hv_compressor.tooltip": "ㄥㄥƆ ɔıʇɐW-O-ssǝɹdɯoƆㄥ§", - "gtceu.machine.hv_cutter.tooltip": "ǝɔıᗡ N,ǝɔıןSㄥ§", - "gtceu.machine.hv_distillery.tooltip": "spınןℲ ɟo sʇɹɐԀ ʇuɐʌǝןǝɹ ʇsoɯ buıʇɔɐɹʇxƎㄥ§", - "gtceu.machine.hv_electric_furnace.tooltip": "ㄣ9 ǝɹopoɯɯoƆ ɐ buısn ǝʞıן ʇoNㄥ§", - "gtceu.machine.hv_electrolyzer.tooltip": "sǝןnɔǝןoW buızʎןoɹʇɔǝןƎㄥ§", - "gtceu.machine.hv_electromagnetic_separator.tooltip": "ʇsǝɹ ǝɥʇ ɯoɹɟ sǝɹO ɔıʇǝubɐɯ ǝɥʇ buıʇɐɹɐdǝSㄥ§", - "gtceu.machine.hv_extractor.tooltip": "ƐᄅƖᗡ - ɯooᗡ ɟo ǝɔıʌǝᗡ-ɹǝɔınظǝᗡㄥ§", - "gtceu.machine.hv_extruder.tooltip": "buıʞɹoM ןɐʇǝW ɹoɟ ǝuıɥɔɐW ןɐsɹǝʌıu∩ㄥ§", - "gtceu.machine.hv_fermenter.tooltip": "spınןℲ buıʇuǝɯɹǝℲㄥ§", "gtceu.machine.hv_fluid_drilling_rig.tooltip": "buıʞɔɐɹℲ ɯɹoɟɹǝd ʇou sǝoᗡ", - "gtceu.machine.hv_fluid_heater.tooltip": "spınןℲ ɹnoʎ dn buıʇɐǝHㄥ§", - "gtceu.machine.hv_fluid_solidifier.tooltip": "spıןoS ɯɹoɟ oʇ uʍop spınןℲ sןooƆㄥ§", - "gtceu.machine.hv_forge_hammer.tooltip": "¡ǝɯıʇɹǝɯɯɐH 'doʇSㄥ§", - "gtceu.machine.hv_forming_press.tooltip": "sbuıɥʇ oʇuı sǝbɐɯI buıʇuıɹdɯIㄥ§", - "gtceu.machine.hv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɹıɐ ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", - "gtceu.machine.hv_laser_engraver.tooltip": "ɹǝsɐꞀ ǝɥʇ ʇɐ ʎןʇɔǝɹıp ʞooן ʇ,uoᗡㄥ§", - "gtceu.machine.hv_lathe.tooltip": "ʎןʇuǝıɔıɟɟǝ ǝɹoɯ spoᴚ sǝɔnpoɹԀㄥ§", - "gtceu.machine.hv_macerator.tooltip": "sʇɔnpoɹdʎᗺ ɥʇıʍ sǝɹO ɹnoʎ buıppǝɹɥSㄥ§", - "gtceu.machine.hv_mass_fabricator.tooltip": "pǝɹɐnbS uoıʇɐɔıɹqɐℲ * ɹǝʇʇɐW W∩∩ㄥ§", - "gtceu.machine.hv_mixer.tooltip": "¿puǝןᗺ ʇı ןןıMㄥ§", - "gtceu.machine.hv_ore_washer.tooltip": "sǝɹO ɹnoʎ ɯoɹɟ sʇɔnpoɹdʎᗺ ǝɹoɯ buıʇʇǝ⅁ㄥ§", - "gtceu.machine.hv_packer.tooltip": "sǝxoᗺ ɟo ʇno sbuıɥʇ sqɐɹ⅁ puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", - "gtceu.machine.hv_polarizer.tooltip": "sʇǝubɐW ɹnoʎ buısıɹɐןodıᗺㄥ§", - "gtceu.machine.hv_replicator.tooltip": "sʇuǝɯǝןƎ ɟo ʇsǝɹnԀ ǝɥʇ buıɔnpoɹԀㄥ§", - "gtceu.machine.hv_rock_crusher.tooltip": "ʇuǝɔɐظpɐ ʎןןɐʇuozıɹoɥ ɐʌɐꞀ puɐ ɹǝʇɐM ǝɔɐןԀㄥ§", - "gtceu.machine.hv_scanner.tooltip": "sbuıɥʇ ɹǝɥʇo puɐ sןɐıɹǝʇɐW suɐɔSㄥ§", - "gtceu.machine.hv_sifter.tooltip": "buıʇɟıs dǝǝʞ puɐ ɯןɐɔ ʎɐʇSㄥ§", - "gtceu.machine.hv_thermal_centrifuge.tooltip": "ʎןǝsıɔǝɹd ǝɹoɯ sǝɹO buıʇɐɹɐdǝSㄥ§", - "gtceu.machine.hv_wiremill.tooltip": "ʎןʇuǝıɔıɟɟǝ ǝɹoɯ sǝɹıM sǝɔnpoɹԀㄥ§", "gtceu.machine.implosion_compressor.tooltip": "ɯooᗺ ob oʇ ʇuɐʍ noʎ ǝuıɥɔɐW ʎןuo ǝɥ⟘", "gtceu.machine.item_bus.export.tooltip": "sʞɔoןqıʇןnW ɹoɟ ʇndʇnO ɯǝʇI", "gtceu.machine.item_bus.import.tooltip": "sʞɔoןqıʇןnW ɹoɟ ʇnduI ɯǝʇI", - "gtceu.machine.item_collector.gui.collect_range": "sʞɔoןq %sx%s ɟo ɐǝɹɐ uɐ uıɥʇıʍ ʇɔǝןןoƆ", - "gtceu.machine.item_collector.tooltip": "ɟןǝsʇı punoɹɐ sɯǝʇI sʇɔǝןןoƆ", - "gtceu.machine.iv_alloy_smelter.tooltip": "ɹoʇɐɹbǝʇuI ʎoןןⱯㄥ§", - "gtceu.machine.iv_arc_furnace.tooltip": "ɹǝʇɐǝH ǝbɹɐɥɔsıᗡㄥ§", - "gtceu.machine.iv_assembler.tooltip": "ǝןqɐ⟘ buıʇɟɐɹƆ ɐ ⟘ONㄥ§", - "gtceu.machine.iv_autoclave.tooltip": "ɹǝʞooƆ ǝɹnssǝɹԀㄥ§", - "gtceu.machine.iv_bender.tooltip": "ɹǝʇɹoʇsıᗡ ǝdɐɥSㄥ§", - "gtceu.machine.iv_brewery.tooltip": "sʞuıɹᗡ ɹnoʎ buıʍǝɹᗺㄥ§", - "gtceu.machine.iv_canner.tooltip": "ɹoʇɐɹǝdO uɐƆㄥ§", - "gtceu.machine.iv_centrifuge.tooltip": "ǝuoןɔʎƆ ɹɐןnɔǝןoWㄥ§", - "gtceu.machine.iv_chemical_bath.tooltip": "ɹǝʞɐoS ןɐɔıɯǝɥƆㄥ§", - "gtceu.machine.iv_chemical_reactor.tooltip": "ɹǝɯɹoɟɹǝԀ ןɐɔıɯǝɥƆㄥ§", - "gtceu.machine.iv_circuit_assembler.tooltip": "ɹǝɹnʇɔɐɟnuɐW sɔıuoɹʇɔǝןƎㄥ§", - "gtceu.machine.iv_compressor.tooltip": "ɹǝsuǝpuoƆ ʎʇıɹɐןnbuıSㄥ§", - "gtceu.machine.iv_cutter.tooltip": "ɹǝʌɐǝןƆ ɹǝʇʇɐWㄥ§", - "gtceu.machine.iv_distillery.tooltip": "ɹoʇɐɹɐdǝS uoıʇɐsuǝpuoƆㄥ§", - "gtceu.machine.iv_electric_furnace.tooltip": "ɹossǝɔoɹԀ ʇuǝɯǝʇıɔxƎ uoɹʇɔǝןƎㄥ§", - "gtceu.machine.iv_electrolyzer.tooltip": "906ㄣ-Ǝ ɹoʇɐɹbǝʇuısıᗡ ɹɐןnɔǝןoWㄥ§", - "gtceu.machine.iv_electromagnetic_separator.tooltip": "ɹǝzıɹobǝʇɐƆ WƎㄥ§", - "gtceu.machine.iv_extractor.tooltip": "ɹoʇɐuıʇɔɐɹʇxƎ ɯnnɔɐΛㄥ§", - "gtceu.machine.iv_extruder.tooltip": "ɹǝɔɐןdsıᗡ ןɐıɹǝʇɐWㄥ§", - "gtceu.machine.iv_fermenter.tooltip": "ɹǝuǝʇsɐH uoıʇɐʇuǝɯɹǝℲㄥ§", - "gtceu.machine.iv_fluid_heater.tooltip": "ɹǝsnɟuI ʇɐǝHㄥ§", - "gtceu.machine.iv_fluid_solidifier.tooltip": "ǝuıɥɔɐW ǝɔI uɐ ʇoNㄥ§", - "gtceu.machine.iv_forge_hammer.tooltip": "ɹǝbɹoℲ ǝʇɐןԀㄥ§", - "gtceu.machine.iv_forming_press.tooltip": "ɹǝɹǝʎɐꞀ ʇɔǝظqOㄥ§", - "gtceu.machine.iv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ǝɹǝɥdsoɯʇɐ ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", - "gtceu.machine.iv_laser_engraver.tooltip": "MW ㄣ0˙ᄅ ɟo ɹǝʍoԀ ǝɥʇ ɥʇıMㄥ§", - "gtceu.machine.iv_lathe.tooltip": "906ϛ-Ꞁ ɔıʇɐW-O-uɹn⟘ㄥ§", - "gtceu.machine.iv_macerator.tooltip": "Ɩ006 ɔıʇɐW-O-puǝןᗺㄥ§", - "gtceu.machine.iv_mass_fabricator.tooltip": "ʎɹoʇɔɐℲ sısǝuǝ⅁ㄥ§", - "gtceu.machine.iv_mixer.tooltip": "ɹǝzıuɐbɹO ɹǝʇʇɐWㄥ§", - "gtceu.machine.iv_ore_washer.tooltip": "09Ɛ-I ɹǝɥsɐM-ʎɹpunɐꞀ pǝsodɹndǝᴚㄥ§", - "gtceu.machine.iv_packer.tooltip": "ɹoʇɐuıxoᗺㄥ§", - "gtceu.machine.iv_polarizer.tooltip": "ɹǝɔnpuI ɯsıʇǝubɐWㄥ§", - "gtceu.machine.iv_replicator.tooltip": "ɹǝʇsɐԀ ɹǝʇʇɐWㄥ§", - "gtceu.machine.iv_rock_crusher.tooltip": "00ᄅ8-ᴚ ɹǝıɟıpıןoS ɐɯbɐW ɔıuǝboʎɹƆㄥ§", - "gtceu.machine.iv_scanner.tooltip": "ɹoʇɔǝʇǝᗡ ʎןɐɯouⱯㄥ§", - "gtceu.machine.iv_sifter.tooltip": "ƆℲ⟘ ʎq pǝɹosuodSㄥ§", - "gtceu.machine.iv_thermal_centrifuge.tooltip": "0ϛƐ9-⟘ doɥsʇɐǝʍS ǝzɐןᗺㄥ§", - "gtceu.machine.iv_wiremill.tooltip": "ɹoʇɐbuoןƎ ʇobuIㄥ§", - "gtceu.machine.large_boiler.bronze.tooltip": "¡ɯɐǝʇS ǝɹoɯ pǝǝu ǝM", - "gtceu.machine.large_boiler.steel.tooltip": "ɹoʇɐɹǝuıɔuI ןɐoɔɹɐɥƆ", - "gtceu.machine.large_boiler.titanium.tooltip": "¿ןǝnℲ ɹǝdnS ɔıbɐW ǝɥʇ s,ǝɹǝɥM", - "gtceu.machine.large_boiler.tungstensteel.tooltip": "¿buıɥʇ sıɥʇ ןǝnɟ uǝʌǝ noʎ op ʍoH", - "gtceu.machine.large_chemical_reactor.tooltip": "ɹoʇɔɐǝᴚ xoᗺ ʞɔɐןᗺ", "gtceu.machine.large_combustion_engine.tooltip": "ɹǝqɯɐɥƆ uoıʇıubI ןǝnℲ", "gtceu.machine.large_combustion_engine.tooltip.boost_extreme": "˙uoıʇdɯnsuoɔ ןǝnɟ ㄥ§xᄅɟ§ ʇɐ ㄥ§ʇ/∩Ǝ %sɟ§ oʇ dn ǝɔnpoɹd oʇ uǝbʎxO pınbıꞀ ɟo ㄥ§s/ᗺɯ 08ɟ§ ʎןddnS", "gtceu.machine.large_combustion_engine.tooltip.boost_regular": "˙uoıʇdɯnsuoɔ ןǝnɟ ㄥ§xᄅɟ§ ʇɐ ㄥ§ʇ/∩Ǝ %sɟ§ oʇ dn ǝɔnpoɹd oʇ uǝbʎxO ɟo ㄥ§s/ᗺɯ 0ᄅɟ§ ʎןddnS", @@ -2776,95 +2608,6 @@ "gtceu.machine.laser_target_hatch.tooltip.1": "ㄥ§¡ǝuıן ʇɥbıɐɹʇs ɐ uı ǝq ʇsnɯ sǝןqɐɔ ɹǝsɐꞀɔ§", "gtceu.machine.locked_safe.malfunctioning": "¡buıuoıʇɔunɟןɐWɔ§", "gtceu.machine.locked_safe.requirements": ":pǝɹınbǝɹ sʇuǝɯǝɔɐןdǝᴚㄥ§", - "gtceu.machine.lp_steam_alloy_smelter.tooltip": "ɹǝʇןǝɯS uoıʇɐuıqɯoƆㄥ§", - "gtceu.machine.lp_steam_compressor.tooltip": "sɯǝʇI buıssǝɹdɯoƆㄥ§", - "gtceu.machine.lp_steam_extractor.tooltip": "ɹǝqqnᴚ ʇsɹıɟ ɹnoʎ buıʇɔɐɹʇxƎㄥ§", - "gtceu.machine.lp_steam_forge_hammer.tooltip": "ɹǝɯɯɐH ǝbɹoℲㄥ§", - "gtceu.machine.lp_steam_furnace.tooltip": "ɯɐǝʇS pǝssǝɹdɯoɔ ɥʇıʍ sbuıɥʇ buıʇןǝɯSㄥ§", - "gtceu.machine.lp_steam_liquid_boiler.tooltip": "spınbıꞀ ɟɟo buıuunɹ ɹǝןıoᗺ Ɐㄥ§", - "gtceu.machine.lp_steam_macerator.tooltip": "sǝɹO ɹnoʎ buıʇɐɹǝɔɐWㄥ§", - "gtceu.machine.lp_steam_miner.tooltip": "¡ɹǝuıW ǝɥʇ ʍoןǝq sǝɹo sǝuıWㄥ§", - "gtceu.machine.lp_steam_rock_crusher.tooltip": "ʇuǝɔɐظpɐ ʎןןɐʇuozıɹoɥ ɐʌɐꞀ puɐ ɹǝʇɐM ǝɔɐןԀㄥ§", - "gtceu.machine.lp_steam_solar_boiler.tooltip": "unS ʎq ɹǝʍoԀ ɯɐǝʇSㄥ§", - "gtceu.machine.lp_steam_solid_boiler.tooltip": "ɹǝʍoԀ ɯɐǝʇS ʇǝb oʇ ʎɐʍ ʎןɹɐǝ uⱯㄥ§", - "gtceu.machine.luv_alloy_smelter.tooltip": "ɹoʇɐɹbǝʇuI ʎoןןⱯㄥ§", - "gtceu.machine.luv_arc_furnace.tooltip": "ɹǝʇɐǝH ǝbɹɐɥɔsıᗡㄥ§", - "gtceu.machine.luv_assembler.tooltip": "ǝןqɐ⟘ buıʇɟɐɹƆ ɐ ⟘ONㄥ§", - "gtceu.machine.luv_autoclave.tooltip": "ɹǝʞooƆ ǝɹnssǝɹԀㄥ§", - "gtceu.machine.luv_bender.tooltip": "ɹǝʇɹoʇsıᗡ ǝdɐɥSㄥ§", - "gtceu.machine.luv_brewery.tooltip": "sʞuıɹᗡ ɹnoʎ buıʍǝɹᗺㄥ§", - "gtceu.machine.luv_canner.tooltip": "ɹoʇɐɹǝdO uɐƆㄥ§", - "gtceu.machine.luv_centrifuge.tooltip": "ǝuoןɔʎƆ ɹɐןnɔǝןoWㄥ§", - "gtceu.machine.luv_chemical_bath.tooltip": "ɹǝʞɐoS ןɐɔıɯǝɥƆㄥ§", - "gtceu.machine.luv_chemical_reactor.tooltip": "ɹǝɯɹoɟɹǝԀ ןɐɔıɯǝɥƆㄥ§", - "gtceu.machine.luv_circuit_assembler.tooltip": "ɹǝɹnʇɔɐɟnuɐW sɔıuoɹʇɔǝןƎㄥ§", - "gtceu.machine.luv_compressor.tooltip": "ɹǝsuǝpuoƆ ʎʇıɹɐןnbuıSㄥ§", - "gtceu.machine.luv_cutter.tooltip": "ɹǝʌɐǝןƆ ɹǝʇʇɐWㄥ§", - "gtceu.machine.luv_distillery.tooltip": "ɹoʇɐɹɐdǝS uoıʇɐsuǝpuoƆㄥ§", - "gtceu.machine.luv_electric_furnace.tooltip": "ɹossǝɔoɹԀ ʇuǝɯǝʇıɔxƎ uoɹʇɔǝןƎㄥ§", - "gtceu.machine.luv_electrolyzer.tooltip": "ㄥ06ㄣ-Ǝ ɹoʇɐɹbǝʇuısıᗡ ɹɐןnɔǝןoWㄥ§", - "gtceu.machine.luv_electromagnetic_separator.tooltip": "ɹǝzıɹobǝʇɐƆ WƎㄥ§", - "gtceu.machine.luv_extractor.tooltip": "ɹoʇɐuıʇɔɐɹʇxƎ ɯnnɔɐΛㄥ§", - "gtceu.machine.luv_extruder.tooltip": "ɹǝɔɐןdsıᗡ ןɐıɹǝʇɐWㄥ§", - "gtceu.machine.luv_fermenter.tooltip": "ɹǝuǝʇsɐH uoıʇɐʇuǝɯɹǝℲㄥ§", - "gtceu.machine.luv_fluid_heater.tooltip": "ɹǝsnɟuI ʇɐǝHㄥ§", - "gtceu.machine.luv_fluid_solidifier.tooltip": "ǝuıɥɔɐW ǝɔI uɐ ʇoNㄥ§", - "gtceu.machine.luv_forge_hammer.tooltip": "ɹǝbɹoℲ ǝʇɐןԀㄥ§", - "gtceu.machine.luv_forming_press.tooltip": "ɹǝɹǝʎɐꞀ ʇɔǝظqOㄥ§", - "gtceu.machine.luv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ǝɹǝɥdsoɯʇɐ ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", - "gtceu.machine.luv_laser_engraver.tooltip": "MW 9Ɩ˙8 ɟo ɹǝʍoԀ ǝɥʇ ɥʇıMㄥ§", - "gtceu.machine.luv_lathe.tooltip": "ㄥ06ϛ-Ꞁ ɔıʇɐW-O-uɹn⟘ㄥ§", - "gtceu.machine.luv_macerator.tooltip": "ᄅ006 ɔıʇɐW-O-puǝןᗺㄥ§", - "gtceu.machine.luv_mass_fabricator.tooltip": "ʎɹoʇɔɐℲ sısǝuǝ⅁ㄥ§", - "gtceu.machine.luv_mixer.tooltip": "ɹǝzıuɐbɹO ɹǝʇʇɐWㄥ§", - "gtceu.machine.luv_ore_washer.tooltip": "Ɩ9Ɛ-I ɹǝɥsɐM-ʎɹpunɐꞀ pǝsodɹndǝᴚㄥ§", - "gtceu.machine.luv_packer.tooltip": "ɹoʇɐuıxoᗺㄥ§", - "gtceu.machine.luv_polarizer.tooltip": "ɹǝɔnpuI ɯsıʇǝubɐWㄥ§", - "gtceu.machine.luv_replicator.tooltip": "ɹǝʇsɐԀ ɹǝʇʇɐWㄥ§", - "gtceu.machine.luv_rock_crusher.tooltip": "00ᄅ6-ᴚ ɹǝıɟıpıןoS ɐɯbɐW ɔıuǝboʎɹƆㄥ§", - "gtceu.machine.luv_scanner.tooltip": "ɹoʇɔǝʇǝᗡ ʎןɐɯouⱯㄥ§", - "gtceu.machine.luv_sifter.tooltip": "ƆℲ⟘ ʎq pǝɹosuodSㄥ§", - "gtceu.machine.luv_thermal_centrifuge.tooltip": "ƖϛƐ9-⟘ doɥsʇɐǝʍS ǝzɐןᗺㄥ§", - "gtceu.machine.luv_wiremill.tooltip": "ɹoʇɐbuoןƎ ʇobuIㄥ§", - "gtceu.machine.lv_alloy_smelter.tooltip": "ɹǝʇןǝɯS uoıʇɐuıqɯoɔ ɥɔǝ⟘ɥbıHㄥ§", - "gtceu.machine.lv_arc_furnace.tooltip": "¿ǝɔɐuɹnℲ ʇsɐןᗺ ɐ spǝǝu oɥMㄥ§", - "gtceu.machine.lv_assembler.tooltip": "¡ǝןqɯǝssⱯ 'sɹǝbuǝʌⱯㄥ§", - "gtceu.machine.lv_autoclave.tooltip": "sʇsnᗡ ɹnoʎ buızıןןɐʇsʎɹƆㄥ§", - "gtceu.machine.lv_bender.tooltip": "¡¡¡ᴚƎᗡNƎᗺ ʇuɐʍ ǝM ¡pɐq s,ǝɥ 'ooᗺㄥ§", - "gtceu.machine.lv_brewery.tooltip": "buıʍǝɹq uoıʇod ʇuǝıɔıɟɟǝ puɐ ʇɔɐdɯoƆㄥ§", - "gtceu.machine.lv_canner.tooltip": "sɹǝuıɐʇuoƆ ɟo ʇno puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", - "gtceu.machine.lv_centrifuge.tooltip": "sǝןnɔǝןoW buıʇɐɹɐdǝSㄥ§", - "gtceu.machine.lv_chemical_bath.tooltip": "ɯǝɥʇ ǝʇɐɹɐdǝs oʇ sןɐɔıɯǝɥƆ uı sǝɹO buıɥʇɐᗺㄥ§", - "gtceu.machine.lv_chemical_reactor.tooltip": "ɹǝɥʇo ɥɔɐǝ ɥʇıʍ ʇɔɐǝɹ sןɐɔıɯǝɥƆ buıʇʇǝꞀㄥ§", - "gtceu.machine.lv_circuit_assembler.tooltip": "ǝɔɐןd ǝɥʇ ɹǝʌo ןןɐ ǝɔɐןԀ-u-ʞɔıԀㄥ§", - "gtceu.machine.lv_compressor.tooltip": "ㄥㄥƆ ɔıʇɐW-O-ssǝɹdɯoƆㄥ§", - "gtceu.machine.lv_cutter.tooltip": "ǝɔıᗡ N,ǝɔıןSㄥ§", - "gtceu.machine.lv_distillery.tooltip": "spınןℲ ɟo sʇɹɐԀ ʇuɐʌǝןǝɹ ʇsoɯ buıʇɔɐɹʇxƎㄥ§", - "gtceu.machine.lv_electric_furnace.tooltip": "ㄣ9 ǝɹopoɯɯoƆ ɐ buısn ǝʞıן ʇoNㄥ§", - "gtceu.machine.lv_electrolyzer.tooltip": "sǝןnɔǝןoW buızʎןoɹʇɔǝןƎㄥ§", - "gtceu.machine.lv_electromagnetic_separator.tooltip": "ʇsǝɹ ǝɥʇ ɯoɹɟ sǝɹO ɔıʇǝubɐɯ ǝɥʇ buıʇɐɹɐdǝSㄥ§", - "gtceu.machine.lv_extractor.tooltip": "ƐᄅƖᗡ - ɯooᗡ ɟo ǝɔıʌǝᗡ-ɹǝɔınظǝᗡㄥ§", - "gtceu.machine.lv_extruder.tooltip": "buıʞɹoM ןɐʇǝW ɹoɟ ǝuıɥɔɐW ןɐsɹǝʌıu∩ㄥ§", - "gtceu.machine.lv_fermenter.tooltip": "spınןℲ buıʇuǝɯɹǝℲㄥ§", - "gtceu.machine.lv_fluid_heater.tooltip": "spınןℲ ɹnoʎ dn buıʇɐǝHㄥ§", - "gtceu.machine.lv_fluid_solidifier.tooltip": "spıןoS ɯɹoɟ oʇ uʍop spınןℲ sןooƆㄥ§", - "gtceu.machine.lv_forge_hammer.tooltip": "¡ǝɯıʇɹǝɯɯɐH 'doʇSㄥ§", - "gtceu.machine.lv_forming_press.tooltip": "sbuıɥʇ oʇuı sǝbɐɯI buıʇuıɹdɯIㄥ§", - "gtceu.machine.lv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɹıɐ ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", - "gtceu.machine.lv_laser_engraver.tooltip": "ɹǝsɐꞀ ǝɥʇ ʇɐ ʎןʇɔǝɹıp ʞooן ʇ,uoᗡㄥ§", - "gtceu.machine.lv_lathe.tooltip": "ʎןʇuǝıɔıɟɟǝ ǝɹoɯ spoᴚ sǝɔnpoɹԀㄥ§", - "gtceu.machine.lv_macerator.tooltip": "sʇɔnpoɹdʎᗺ ʇnoɥʇıʍ sǝɹO ɹnoʎ buıppǝɹɥSㄥ§", - "gtceu.machine.lv_mass_fabricator.tooltip": "pǝɹɐnbS uoıʇɐɔıɹqɐℲ * ɹǝʇʇɐW W∩∩ㄥ§", - "gtceu.machine.lv_mixer.tooltip": "¿puǝןᗺ ʇı ןןıMㄥ§", - "gtceu.machine.lv_ore_washer.tooltip": "sǝɹO ɹnoʎ ɯoɹɟ sʇɔnpoɹdʎᗺ ǝɹoɯ buıʇʇǝ⅁ㄥ§", - "gtceu.machine.lv_packer.tooltip": "sǝxoᗺ ɟo ʇno sbuıɥʇ sqɐɹ⅁ puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", - "gtceu.machine.lv_polarizer.tooltip": "sʇǝubɐW ɹnoʎ buısıɹɐןodıᗺㄥ§", - "gtceu.machine.lv_replicator.tooltip": "sʇuǝɯǝןƎ ɟo ʇsǝɹnԀ ǝɥʇ buıɔnpoɹԀㄥ§", - "gtceu.machine.lv_rock_crusher.tooltip": "ʇuǝɔɐظpɐ ʎןןɐʇuozıɹoɥ ɐʌɐꞀ puɐ ɹǝʇɐM ǝɔɐןԀㄥ§", - "gtceu.machine.lv_scanner.tooltip": "sbuıɥʇ ɹǝɥʇo puɐ sןɐıɹǝʇɐW suɐɔSㄥ§", - "gtceu.machine.lv_sifter.tooltip": "buıʇɟıs dǝǝʞ puɐ ɯןɐɔ ʎɐʇSㄥ§", - "gtceu.machine.lv_thermal_centrifuge.tooltip": "ʎןǝsıɔǝɹd ǝɹoɯ sǝɹO buıʇɐɹɐdǝSㄥ§", - "gtceu.machine.lv_wiremill.tooltip": "ʎןʇuǝıɔıɟɟǝ ǝɹoɯ sǝɹıM sǝɔnpoɹԀㄥ§", "gtceu.machine.machine_hatch.locked": "pǝʞɔoꞀ ǝɔɐɟɹǝʇuI ǝuıɥɔɐW", "gtceu.machine.machine_hatch.processing_array": "ʎɐɹɹⱯ buıssǝɔoɹԀǝ§ ǝɥʇ uı ʞɹoʍ ʇɐɥʇ sǝuıɥɔɐɯ spןoɥ ʎןuo 'ㄥ§ʎɐɹɹⱯ buıssǝɔoɹԀǝ§ ǝɥʇ uı uǝɥM", "gtceu.machine.machine_hatch.tooltip": "sɯǝʇı pıןɐʌ spןoɥ ʎןuo ʇɐɥʇ snᗺ ssǝɔɔⱯ pǝzıןɐıɔǝdS", @@ -2876,36 +2619,6 @@ "gtceu.machine.maintenance_hatch_full_auto.tooltip": "sʞɔoןqıʇןnW buıuıɐʇuıɐɯ ʎןןɐɔıʇɐɯoʇnɐ ɹoℲ", "gtceu.machine.maintenance_hatch_tape_slot.tooltip": "sɯǝןqoɹd ʇuǝʌǝɹd oʇ ǝdɐ⟘ ʇɹǝsuI", "gtceu.machine.maintenance_hatch_tool_slot.tooltip": "sɯǝןqoɹd ǝʌןos oʇ ʎɹoʇuǝʌuı uı ǝɹɐ sןooʇ pǝɹınbǝɹ uǝɥʍ puɐɥ ʎʇdɯǝ ɥʇıʍ ʇoןs ʞɔıןƆ", - "gtceu.machine.max_alloy_smelter.tooltip": "ɹoʇɐɯɐbןɐɯⱯ ןɐʇǝWㄥ§", - "gtceu.machine.max_arc_furnace.tooltip": "ɹǝʇɐǝH ʇınɔɹıƆ ʇɹoɥSㄥ§", - "gtceu.machine.max_assembler.tooltip": "ɹoʇɔnɹʇsuoƆ ʎןqɯǝssⱯㄥ§", - "gtceu.machine.max_autoclave.tooltip": "ʇıu∩ ǝɔuɐɹqɯnɔuƎㄥ§", - "gtceu.machine.max_bender.tooltip": "ɹǝɯɹoɟǝᗡ ɹǝʇʇɐWㄥ§", - "gtceu.machine.max_brewery.tooltip": "ɹǝɥsnᴚ ʍǝɹᗺㄥ§", - "gtceu.machine.max_canner.tooltip": "ɹoʇɐnʇɔⱯ uɐƆㄥ§", - "gtceu.machine.max_chemical_bath.tooltip": "uoɹʇʞunᗡ ןɐɔıɯǝɥƆㄥ§", - "gtceu.machine.max_chemical_reactor.tooltip": "ɹǝzʎןɐʇɐƆ uoıʇɔɐǝᴚㄥ§", - "gtceu.machine.max_circuit_assembler.tooltip": "ʎɹoʇɔɐℲ uoıʇɐʇndɯoƆㄥ§", - "gtceu.machine.max_compressor.tooltip": "ɹoʇɔıɹʇsuoƆ ɹǝʇʇɐWㄥ§", - "gtceu.machine.max_cutter.tooltip": "ɹǝpıʌıᗡ ʇɔǝظqOㄥ§", - "gtceu.machine.max_distillery.tooltip": "ɹǝʇʇıןdS uoıʇɔɐɹℲㄥ§", - "gtceu.machine.max_electric_furnace.tooltip": "ɹoʇɐןnɯıʇS ɯoʇⱯㄥ§", - "gtceu.machine.max_electromagnetic_separator.tooltip": "ɹǝןןǝdsıᗡ ℲWƎㄥ§", - "gtceu.machine.max_extractor.tooltip": "ɹǝʞɔnS buıʎɟǝnbıꞀㄥ§", - "gtceu.machine.max_extruder.tooltip": "ɹǝʌıɹᗡ ǝdɐɥSㄥ§", - "gtceu.machine.max_fermenter.tooltip": "ɹǝןןoɹʇuoƆ uoıʇɐɹıdsǝᴚㄥ§", - "gtceu.machine.max_fluid_heater.tooltip": "ɹǝnqɯI ןɐɯɹǝɥ⟘ㄥ§", - "gtceu.machine.max_fluid_solidifier.tooltip": "ɹoʇɐɔıɟıɹʇǝԀ pınןℲㄥ§", - "gtceu.machine.max_forge_hammer.tooltip": "ɹoʇɐןnpoW ʇɔɐdɯIㄥ§", - "gtceu.machine.max_forming_press.tooltip": "ɹǝʇɟıɥS ǝɔɐɟɹnSㄥ§", - "gtceu.machine.max_mass_fabricator.tooltip": "ɹoʇɐıʇıuI ǝɔuǝʇsıxƎㄥ§", - "gtceu.machine.max_mixer.tooltip": "ɹǝzıuǝboɯoH ןɐıɹǝʇɐWㄥ§", - "gtceu.machine.max_packer.tooltip": "ǝsnoɥǝɹɐM uozɐɯⱯㄥ§", - "gtceu.machine.max_polarizer.tooltip": "ɹǝbuɐɹɹɐǝᴚ pןǝıℲ ɔıʇǝubɐWㄥ§", - "gtceu.machine.max_replicator.tooltip": "ɹǝsodɯoƆ ןɐʇuǝɯǝןƎㄥ§", - "gtceu.machine.max_scanner.tooltip": "ǝdoɔsoɹɔıW uoɹʇɔǝןƎㄥ§", - "gtceu.machine.max_sifter.tooltip": "ɹǝʇןıℲ uoıʇɐsןnԀㄥ§", - "gtceu.machine.max_wiremill.tooltip": "ɹoʇɐɹnbıɟsuɐɹ⟘ ǝɹıMㄥ§", "gtceu.machine.me.copy_paste.tooltip": "ʎןddɐ oʇ ʞɔıןɔ-ʇɥbıɹ 'sbuıʇʇǝs ʎdoɔ oʇ ʞɔıʇS ɐʇɐᗡ ɥʇıʍ ʞɔıןɔ-ʇɥbıɹ ʞɐǝuS", "gtceu.machine.me.export.tooltip": "˙ʞɹoʍʇǝu ƎW oʇ buıʇɔǝuuoɔ ǝɹoɟǝq ʎʇıɔɐdɐɔ ǝʇıuıɟuı sɐH", "gtceu.machine.me.fluid_export.tooltip": "˙ʞɹoʍʇǝu ƎW uɐ oʇuı ʎןʇɔǝɹıp spınןɟ sǝɹoʇS", @@ -2932,102 +2645,19 @@ "gtceu.machine.miner.multi.description": "˙ǝɹo ɟo ʎʇıʇuɐnb ǝbnɥ sǝɔnpoɹd puɐ ɐǝɹɐ ǝbɹɐן ɐ sɹǝʌoɔ ʇɐɥʇ ǝuıɥɔɐɯ buıuıɯ ʞɔoןqıʇןnɯ Ɐ", "gtceu.machine.miner.multi.modes": "˙sǝpoW pǝubıןⱯ ʞunɥƆ puɐ ɥɔno⟘ ʞןıS sɐH", "gtceu.machine.miner.multi.production": "˙ㄥ§ɹoʇɐɹǝɔɐWɟ§ ɐ uɐɥʇ ǝɹo pǝɥsnɹɔ ǝɹoɯ ㄥ§xƐɟ§ sǝɔnpoɹԀ", - "gtceu.machine.miner.per_block": "ʞɔoןᗺ ɹǝdㄥ§ %dsɟ§ sǝʞɐʇㄥ§", "gtceu.machine.miner.radius": "%d :snıpɐᴚ", "gtceu.machine.miner.startx": "%d :Xs", "gtceu.machine.miner.starty": "%d :ʎs", "gtceu.machine.miner.startz": "%d :Zs", - "gtceu.machine.miner.tooltip": "ɐǝɹɐㄥ§ %sx%sɟ§ sɐ sʇɹɐʇS ¡ɹǝuıW ǝɥʇ ʍoןǝq sǝɹo sǝuıWㄥ§", - "gtceu.machine.muffle.off": "pǝןqɐsıᗡ :buıןɟɟnW punoS", - "gtceu.machine.muffle.on": "pǝןqɐuƎ :buıןɟɟnW punoS", "gtceu.machine.muffler_hatch.tooltip.0": "sǝuıɥɔɐɯ ɯoɹɟ ǝʇsɐʍ sɹǝʌoɔǝᴚ", "gtceu.machine.muffler_hatch.tooltip.1": "¡⟘∩Ԁ⟘∩O ƎH⟘ ⟘Ɔ∩ᴚ⟘SᗺO ⟘ON Oᗡ", - "gtceu.machine.multi_furnace.tooltip": "ǝɯoH ʇɐ uǝʌO ǝɥʇ ǝʞıן ʇsnſ", "gtceu.machine.multiblock.tank.tooltip": "˙sǝʌןɐʌ ʞuɐʇ ɹo ɹǝןןoɹʇuoɔ ǝɥʇ ɥbnoɹɥʇ uıɐɹp puɐ ןןıℲ", - "gtceu.machine.mv_alloy_smelter.tooltip": "ɹǝʇןǝɯS uoıʇɐuıqɯoɔ ɥɔǝ⟘ɥbıHㄥ§", - "gtceu.machine.mv_arc_furnace.tooltip": "¿ǝɔɐuɹnℲ ʇsɐןᗺ ɐ spǝǝu oɥMㄥ§", - "gtceu.machine.mv_assembler.tooltip": "¡ǝןqɯǝssⱯ 'sɹǝbuǝʌⱯㄥ§", - "gtceu.machine.mv_autoclave.tooltip": "sʇsnᗡ ɹnoʎ buızıןןɐʇsʎɹƆㄥ§", - "gtceu.machine.mv_bender.tooltip": "¡¡¡ᴚƎᗡNƎᗺ ʇuɐʍ ǝM ¡pɐq s,ǝɥ 'ooᗺㄥ§", - "gtceu.machine.mv_brewery.tooltip": "buıʍǝɹq uoıʇod ʇuǝıɔıɟɟǝ puɐ ʇɔɐdɯoƆㄥ§", - "gtceu.machine.mv_canner.tooltip": "sɹǝuıɐʇuoƆ ɟo ʇno puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", - "gtceu.machine.mv_centrifuge.tooltip": "sǝןnɔǝןoW buıʇɐɹɐdǝSㄥ§", - "gtceu.machine.mv_chemical_bath.tooltip": "ɯǝɥʇ ǝʇɐɹɐdǝs oʇ sןɐɔıɯǝɥƆ uı sǝɹO buıɥʇɐᗺㄥ§", - "gtceu.machine.mv_chemical_reactor.tooltip": "ɹǝɥʇo ɥɔɐǝ ɥʇıʍ ʇɔɐǝɹ sןɐɔıɯǝɥƆ buıʇʇǝꞀㄥ§", - "gtceu.machine.mv_circuit_assembler.tooltip": "ǝɔɐןd ǝɥʇ ɹǝʌo ןןɐ ǝɔɐןԀ-u-ʞɔıԀㄥ§", - "gtceu.machine.mv_compressor.tooltip": "ㄥㄥƆ ɔıʇɐW-O-ssǝɹdɯoƆㄥ§", - "gtceu.machine.mv_cutter.tooltip": "ǝɔıᗡ N,ǝɔıןSㄥ§", - "gtceu.machine.mv_distillery.tooltip": "spınןℲ ɟo sʇɹɐԀ ʇuɐʌǝןǝɹ ʇsoɯ buıʇɔɐɹʇxƎㄥ§", - "gtceu.machine.mv_electric_furnace.tooltip": "ㄣ9 ǝɹopoɯɯoƆ ɐ buısn ǝʞıן ʇoNㄥ§", - "gtceu.machine.mv_electrolyzer.tooltip": "sǝןnɔǝןoW buızʎןoɹʇɔǝןƎㄥ§", - "gtceu.machine.mv_electromagnetic_separator.tooltip": "ʇsǝɹ ǝɥʇ ɯoɹɟ sǝɹO ɔıʇǝubɐɯ ǝɥʇ buıʇɐɹɐdǝSㄥ§", - "gtceu.machine.mv_extractor.tooltip": "ƐᄅƖᗡ - ɯooᗡ ɟo ǝɔıʌǝᗡ-ɹǝɔınظǝᗡㄥ§", - "gtceu.machine.mv_extruder.tooltip": "buıʞɹoM ןɐʇǝW ɹoɟ ǝuıɥɔɐW ןɐsɹǝʌıu∩ㄥ§", - "gtceu.machine.mv_fermenter.tooltip": "spınןℲ buıʇuǝɯɹǝℲㄥ§", "gtceu.machine.mv_fluid_drilling_rig.tooltip": "dɯnԀ uoıʇɔɐɹʇxƎ ןıO", - "gtceu.machine.mv_fluid_heater.tooltip": "spınןℲ ɹnoʎ dn buıʇɐǝHㄥ§", - "gtceu.machine.mv_fluid_solidifier.tooltip": "spıןoS ɯɹoɟ oʇ uʍop spınןℲ sןooƆㄥ§", - "gtceu.machine.mv_forge_hammer.tooltip": "¡ǝɯıʇɹǝɯɯɐH 'doʇSㄥ§", - "gtceu.machine.mv_forming_press.tooltip": "sbuıɥʇ oʇuı sǝbɐɯI buıʇuıɹdɯIㄥ§", - "gtceu.machine.mv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɹıɐ ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", - "gtceu.machine.mv_laser_engraver.tooltip": "ɹǝsɐꞀ ǝɥʇ ʇɐ ʎןʇɔǝɹıp ʞooן ʇ,uoᗡㄥ§", - "gtceu.machine.mv_lathe.tooltip": "ʎןʇuǝıɔıɟɟǝ ǝɹoɯ spoᴚ sǝɔnpoɹԀㄥ§", - "gtceu.machine.mv_macerator.tooltip": "sʇɔnpoɹdʎᗺ ʇnoɥʇıʍ sǝɹO ɹnoʎ buıppǝɹɥSㄥ§", - "gtceu.machine.mv_mass_fabricator.tooltip": "pǝɹɐnbS uoıʇɐɔıɹqɐℲ * ɹǝʇʇɐW W∩∩ㄥ§", - "gtceu.machine.mv_mixer.tooltip": "¿puǝןᗺ ʇı ןןıMㄥ§", - "gtceu.machine.mv_ore_washer.tooltip": "sǝɹO ɹnoʎ ɯoɹɟ sʇɔnpoɹdʎᗺ ǝɹoɯ buıʇʇǝ⅁ㄥ§", - "gtceu.machine.mv_packer.tooltip": "sǝxoᗺ ɟo ʇno sbuıɥʇ sqɐɹ⅁ puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", - "gtceu.machine.mv_polarizer.tooltip": "sʇǝubɐW ɹnoʎ buısıɹɐןodıᗺㄥ§", - "gtceu.machine.mv_replicator.tooltip": "sʇuǝɯǝןƎ ɟo ʇsǝɹnԀ ǝɥʇ buıɔnpoɹԀㄥ§", - "gtceu.machine.mv_rock_crusher.tooltip": "ʇuǝɔɐظpɐ ʎןןɐʇuozıɹoɥ ɐʌɐꞀ puɐ ɹǝʇɐM ǝɔɐןԀㄥ§", - "gtceu.machine.mv_scanner.tooltip": "sbuıɥʇ ɹǝɥʇo puɐ sןɐıɹǝʇɐW suɐɔSㄥ§", - "gtceu.machine.mv_sifter.tooltip": "buıʇɟıs dǝǝʞ puɐ ɯןɐɔ ʎɐʇSㄥ§", - "gtceu.machine.mv_thermal_centrifuge.tooltip": "ʎןǝsıɔǝɹd ǝɹoɯ sǝɹO buıʇɐɹɐdǝSㄥ§", - "gtceu.machine.mv_wiremill.tooltip": "ʎןʇuǝıɔıɟɟǝ ǝɹoɯ sǝɹıM sǝɔnpoɹԀㄥ§", "gtceu.machine.network_switch.tooltip.0": "qnH ʇǝuɹǝɥʇƎ", "gtceu.machine.network_switch.tooltip.1": "˙ㄥ§uoıʇɐʇndɯoƆɟ§ ǝʇnqıɹʇsıp puɐ ǝʇnoɹ oʇ pǝs∩", "gtceu.machine.network_switch.tooltip.2": "˙ㄥ§sɹǝʇʇıɯsuɐɹ⟘ɟ§ uoıʇɐʇndɯoƆ ɟo ɹǝqɯnu ʎuɐ oʇuı ㄥ§sɹǝʌıǝɔǝᴚɟ§ uoıʇɐʇndɯoƆ ɟo ɹǝqɯnu ʎuɐ ǝuıqɯoɔ uɐƆ", "gtceu.machine.network_switch.tooltip.3": "˙ɥɔʇɐH ɐʇɐᗡ uoıʇɐʇndɯoƆ ɹǝd ㄥ§ʇ/∩Ǝ %sɟ§ sǝs∩", "gtceu.machine.object_holder.tooltip": "uoıʇɐʇS ɥɔɹɐǝsǝᴚ ɹoɟ ɯsıuɐɥɔǝW buıpןoH pǝɔuɐʌpⱯ", - "gtceu.machine.opv_alloy_smelter.tooltip": "ɹoʇɐɯɐbןɐɯⱯ ןɐʇǝWㄥ§", - "gtceu.machine.opv_arc_furnace.tooltip": "ɹǝʇɐǝH ʇınɔɹıƆ ʇɹoɥSㄥ§", - "gtceu.machine.opv_assembler.tooltip": "ɹoʇɔnɹʇsuoƆ ʎןqɯǝssⱯㄥ§", - "gtceu.machine.opv_autoclave.tooltip": "ʇıu∩ ǝɔuɐɹqɯnɔuƎㄥ§", - "gtceu.machine.opv_bender.tooltip": "ɹǝɯɹoɟǝᗡ ɹǝʇʇɐWㄥ§", - "gtceu.machine.opv_brewery.tooltip": "ɹǝɥsnᴚ ʍǝɹᗺㄥ§", - "gtceu.machine.opv_canner.tooltip": "ɹoʇɐnʇɔⱯ uɐƆㄥ§", - "gtceu.machine.opv_centrifuge.tooltip": "opɐuɹo⟘ ɹɐןnɔǝןoWㄥ§", - "gtceu.machine.opv_chemical_bath.tooltip": "uoɹʇʞunᗡ ןɐɔıɯǝɥƆㄥ§", - "gtceu.machine.opv_chemical_reactor.tooltip": "ɹǝzʎןɐʇɐƆ uoıʇɔɐǝᴚㄥ§", - "gtceu.machine.opv_circuit_assembler.tooltip": "ʎɹoʇɔɐℲ uoıʇɐʇndɯoƆㄥ§", - "gtceu.machine.opv_compressor.tooltip": "ɹoʇɔıɹʇsuoƆ ɹǝʇʇɐWㄥ§", - "gtceu.machine.opv_cutter.tooltip": "ɹǝpıʌıᗡ ʇɔǝظqOㄥ§", - "gtceu.machine.opv_distillery.tooltip": "ɹǝʇʇıןdS uoıʇɔɐɹℲㄥ§", - "gtceu.machine.opv_electric_furnace.tooltip": "ɹoʇɐןnɯıʇS ɯoʇⱯㄥ§", - "gtceu.machine.opv_electrolyzer.tooltip": "ɹǝzıuoI ɔıɯoʇⱯㄥ§", - "gtceu.machine.opv_electromagnetic_separator.tooltip": "ɹǝןןǝdsıᗡ ℲWƎㄥ§", - "gtceu.machine.opv_extractor.tooltip": "ɹǝʞɔnS buıʎɟǝnbıꞀㄥ§", - "gtceu.machine.opv_extruder.tooltip": "ɹǝʌıɹᗡ ǝdɐɥSㄥ§", - "gtceu.machine.opv_fermenter.tooltip": "ɹǝןןoɹʇuoƆ uoıʇɐɹıdsǝᴚㄥ§", - "gtceu.machine.opv_fluid_heater.tooltip": "ɹǝnqɯI ןɐɯɹǝɥ⟘ㄥ§", - "gtceu.machine.opv_fluid_solidifier.tooltip": "ɹoʇɐɔıɟıɹʇǝԀ pınןℲㄥ§", - "gtceu.machine.opv_forge_hammer.tooltip": "ɹoʇɐןnpoW ʇɔɐdɯIㄥ§", - "gtceu.machine.opv_forming_press.tooltip": "ɹǝʇɟıɥS ǝɔɐɟɹnSㄥ§", - "gtceu.machine.opv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ǝsɹǝʌıun ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", - "gtceu.machine.opv_laser_engraver.tooltip": "uouuɐƆ uoʇoɥԀ ʇɔɐxƎㄥ§", - "gtceu.machine.opv_lathe.tooltip": "ɹǝpuıɹ⅁ uoıʇɐʇoᴚㄥ§", - "gtceu.machine.opv_macerator.tooltip": "ɹoʇɐuıɯıןƎ ǝdɐɥSㄥ§", - "gtceu.machine.opv_mass_fabricator.tooltip": "ɹoʇɐıʇıuI ǝɔuǝʇsıxƎㄥ§", - "gtceu.machine.opv_mixer.tooltip": "ɹǝzıuǝboɯoH ןɐıɹǝʇɐWㄥ§", - "gtceu.machine.opv_ore_washer.tooltip": "ɥsɐM ɹɐƆ ǝɹnʇɐıuıWㄥ§", - "gtceu.machine.opv_packer.tooltip": "ǝsnoɥǝɹɐM uozɐɯⱯㄥ§", - "gtceu.machine.opv_polarizer.tooltip": "ɹǝbuɐɹɹɐǝᴚ pןǝıℲ ɔıʇǝubɐWㄥ§", - "gtceu.machine.opv_replicator.tooltip": "ɹǝsodɯoƆ ןɐʇuǝɯǝןƎㄥ§", - "gtceu.machine.opv_rock_crusher.tooltip": "ɹǝqɯɐɥƆ uoıʇɐɯɹoℲ ɔıuɐɔןoΛㄥ§", - "gtceu.machine.opv_scanner.tooltip": "ǝdoɔsoɹɔıW uoɹʇɔǝןƎㄥ§", - "gtceu.machine.opv_sifter.tooltip": "ɹǝʇןıℲ uoıʇɐsןnԀㄥ§", - "gtceu.machine.opv_thermal_centrifuge.tooltip": "ǝuoןɔʎƆ ǝɹıℲㄥ§", - "gtceu.machine.opv_wiremill.tooltip": "ɹoʇɐɹnbıɟsuɐɹ⟘ ǝɹıMㄥ§", "gtceu.machine.parallel_hatch.display": "ʞɔoןqıʇןnɯ ǝɥʇ ɟo ןǝןןɐɹɐd ɯnɯıxɐɯ ǝɥʇ ʇsnظpⱯ", "gtceu.machine.parallel_hatch_mk5.tooltip": "˙ןǝןןɐɹɐd uı sǝdıɔǝɹ ㄣ oʇ dn unɹ oʇ sʍoןןⱯ", "gtceu.machine.parallel_hatch_mk6.tooltip": "˙ןǝןןɐɹɐd uı sǝdıɔǝɹ 9Ɩ oʇ dn unɹ oʇ sʍoןןⱯ", @@ -3036,7 +2666,6 @@ "gtceu.machine.parallel_limit": "˙ǝɔuo ʇɐ sǝdıɔǝᴚ ㄥ§ɹ§%dq§ oʇ dn unɹ uɐƆ", "gtceu.machine.passthrough_hatch_fluid.tooltip": "ɹǝɥʇo ǝɥʇ oʇ ǝpıS ǝuo ɯoɹɟ spınןℲ spuǝS", "gtceu.machine.passthrough_hatch_item.tooltip": "ɹǝɥʇo ǝɥʇ oʇ ǝpıS ǝuo ɯoɹɟ sɯǝʇI spuǝS", - "gtceu.machine.perfect_oc": "˙pǝʞɔoןɔɹǝʌo uǝɥʍ ʎɔuǝıɔıɟɟǝ ʎbɹǝuǝ ǝsoן ʇou sǝoᗡ", "gtceu.machine.power_substation.tooltip.0": "pıɹb ɹǝʍod pǝzıןɐɹʇuǝɔ ɐ ɟo ʇɹɐǝɥ ǝɥ⟘", "gtceu.machine.power_substation.tooltip.1": "˙ɹǝıʇ ǝɯɐs ǝɥʇ ןןɐ ǝq oʇ pǝǝu ʇou op ㄥ§sɹoʇıɔɐdɐƆɟ§", "gtceu.machine.power_substation.tooltip.2": "˙ㄥ§sɹǝʎɐꞀ ɹoʇıɔɐdɐƆ %dɟ§ oʇ dn sʍoןןⱯ", @@ -3044,17 +2673,10 @@ "gtceu.machine.power_substation.tooltip.4": "˙ʞɔoןᗺ ɹoʇıɔɐdɐƆ ɹǝd ssoן ǝʌıssɐd ㄥ§ʇ/∩Ǝʞ %dɟ§ ʇɐ pǝddɐƆ", "gtceu.machine.power_substation.tooltip.5": "ǝsn uɐƆ", "gtceu.machine.power_substation.tooltip.6": "˙ㄥ§sǝɥɔʇɐH ɹǝsɐꞀ ", - "gtceu.machine.primitive_blast_furnace.bronze.tooltip": "ןǝǝʇS ʇsɹıɟ ɹnoʎ buıʞɐW", - "gtceu.machine.primitive_water_pump.tooltip": "ǝɯoH ʇɐ ɹıoʌɹǝpuƎ", "gtceu.machine.processing_array.tooltip": "ʇı ʇnɔ ʇ,usǝop ʇsnظ sǝuıɥɔɐW ʍǝɟ ɐ uǝɥM", - "gtceu.machine.pump.tooltip": "¡suɐǝɔO ʎʇdɯǝ oʇ ʎɐʍ ʇsǝq ǝɥ⟘ㄥ§", - "gtceu.machine.pump.tooltip_buckets": "ʇǝʞɔnᗺ ɹǝd sʞɔıʇㄥ§ %dɟ§", "gtceu.machine.pump_hatch.tooltip": "dɯnԀ ɹǝʇɐM ɹoɟ ʇndʇnO pınןℲ ǝʌıʇıɯıɹԀ", "gtceu.machine.pyrolyse_oven.tooltip": "uǝʌO ǝʞoƆ ɔıɹʇɔǝןƎ", "gtceu.machine.pyrolyse_oven.tooltip.1": "˙ㄥ§%%0ϛɟ§ ʎq pǝǝds sǝsɐǝɹɔuı ㄥ§ןɐɥʇuɐʞq§ ɹǝʇɟɐ ןıoɔ ʎɹǝʌƎ ˙ɹǝʍoןs ㄥ§%%ϛᄅɟ§ ǝɹɐ sןıoɔㄥ§ ןǝʞɔıuoɹdnƆ9§", - "gtceu.machine.quantum_chest.items_stored": ":ʇunoɯⱯ ɯǝʇI", - "gtceu.machine.quantum_chest.tooltip": "sɹǝʍɐɹᗡ ǝbɐɹoʇS uɐɥʇ ɹǝʇʇǝᗺㄥ§", - "gtceu.machine.quantum_tank.tooltip": "spınןɟ ɹnoʎ ןןɐ ǝɹoʇs oʇ ǝɔɐןd ʇɔɐdɯoƆㄥ§", "gtceu.machine.research_station.researching": "˙buıɥɔɹɐǝsǝᴚ", "gtceu.machine.research_station.tooltip.0": "ɹǝuuɐɔS ʞɔoןqıʇןnW ɐ ʇsnظ uɐɥʇ ǝɹoW", "gtceu.machine.research_station.tooltip.1": "˙ㄥ§sǝןnpoW ɐʇɐᗡɟ§ puɐ ㄥ§sqɹO ɐʇɐᗡɟ§ oʇuo uɐɔs oʇ pǝs∩", @@ -3062,245 +2684,9 @@ "gtceu.machine.research_station.tooltip.3": "˙ɹǝʇsɐɟ unɹ oʇ ǝdıɔǝɹ ǝɥʇ sʍoןןɐ uoıʇɐʇndɯoƆ ǝɹoɯ buıpıʌoɹԀ", "gtceu.machine.rotor_holder.tooltip.0": "sʞɔoןqıʇןnW ɹoɟ ɹǝpןoH ɹoʇoᴚ", "gtceu.machine.rotor_holder.tooltip.1": "ʎɐʍɐ ʎןɟ ʇou ןןıʍ ʇı os ǝɔɐןd uı ɹoʇoᴚ spןoH", - "gtceu.machine.steam.steam_hatch.tooltip": "ɯɐǝʇSɟ§ :pınןℲ pǝʇdǝɔɔⱯǝ§", - "gtceu.machine.steam_boiler.heat_amount": "%% %s :ʎʇıɔɐdɐƆ ʇɐǝH", - "gtceu.machine.steam_bus.tooltip": "sʞɔoןqıʇןnɯ ɯɐǝʇs-uou ɥʇıʍ ʞɹoʍ ʇou sǝoᗡ", - "gtceu.machine.steam_grinder.tooltip": "sʇɔnpoɹdʎᗺ ǝɥʇ ʇnoɥʇıʍ ɹoʇɐɹǝɔɐW ʞɔoןqıʇןnɯ Ɐ", - "gtceu.machine.steam_oven.tooltip": "ɹǝʇןǝɯS-ıʇןnW ɥʇıʍ pǝsnɟuoɔ ǝq oʇ ʇoN", "gtceu.machine.substation_hatch.input.tooltip": "uoıʇɐʇsqnS ɹǝʍoԀ ǝɥʇ ɹoɟ ʇnduI ʎbɹǝuƎ", "gtceu.machine.substation_hatch.output.tooltip": "uoıʇɐʇsqnS ɹǝʍoԀ ǝɥʇ ɹoɟ ʇndʇnO ʎbɹǝuƎ", "gtceu.machine.tank_valve.tooltip": "˙uʍop buıɔɐɟ uǝɥʍ sʇndʇno oʇnⱯ ˙sʞuɐʇ ʞɔoןqıʇןnɯ uıɐɹp puɐ ןןıɟ oʇ ǝs∩", - "gtceu.machine.transformer.description": "sɹǝıʇ ǝbɐʇןoʌ uǝǝʍʇǝq ʎbɹǝuƎ sɯɹoɟsuɐɹ⟘ㄥ§", - "gtceu.machine.transformer.message_transform_down": "Ɐ%d ∩Ǝ %s :ʇnO 'Ɐ%d ∩Ǝ %s :uI 'uʍoᗡ buıɯɹoɟsuɐɹ⟘", - "gtceu.machine.transformer.message_transform_up": "Ɐ%d ∩Ǝ %s :ʇnO 'Ɐ%d ∩Ǝ %s :uI 'd∩ buıɯɹoɟsuɐɹ⟘", - "gtceu.machine.transformer.tooltip_tool_usage": "ǝbuɐɥɔ oʇ ɹǝʌıɹpʍǝɹɔS ǝsn 'ㄥ§uʍoᗡ ɯɹoɟsuɐɹ⟘ɟ§ sɐ sʇɹɐʇSㄥ§", - "gtceu.machine.transformer.tooltip_transform_down": ")ɟ§%s( ∩Ǝ %s Ɐ%d >- )ɟ§%s( ∩Ǝ %s Ɐ%dɟ§ :uʍoᗡ ɯɹoɟsuɐɹ⟘ɐ§", - "gtceu.machine.transformer.tooltip_transform_up": ")ɟ§%s( ∩Ǝ %s Ɐ%d >- )ɟ§%s( ∩Ǝ %s Ɐ%dɟ§ :d∩ ɯɹoɟsuɐɹ⟘ɔ§", - "gtceu.machine.uev_alloy_smelter.tooltip": "ɹoʇɐɯɐbןɐɯⱯ ןɐʇǝWㄥ§", - "gtceu.machine.uev_arc_furnace.tooltip": "ɹǝʇɐǝH ʇınɔɹıƆ ʇɹoɥSㄥ§", - "gtceu.machine.uev_assembler.tooltip": "ɹoʇɔnɹʇsuoƆ ʎןqɯǝssⱯㄥ§", - "gtceu.machine.uev_autoclave.tooltip": "ʇıu∩ ǝɔuɐɹqɯnɔuƎㄥ§", - "gtceu.machine.uev_bender.tooltip": "ɹǝɯɹoɟǝᗡ ɹǝʇʇɐWㄥ§", - "gtceu.machine.uev_brewery.tooltip": "ɹǝɥsnᴚ ʍǝɹᗺㄥ§", - "gtceu.machine.uev_canner.tooltip": "ɹoʇɐnʇɔⱯ uɐƆㄥ§", - "gtceu.machine.uev_centrifuge.tooltip": "opɐuɹo⟘ ɹɐןnɔǝןoWㄥ§", - "gtceu.machine.uev_chemical_bath.tooltip": "uoɹʇʞunᗡ ןɐɔıɯǝɥƆㄥ§", - "gtceu.machine.uev_chemical_reactor.tooltip": "ɹǝzʎןɐʇɐƆ uoıʇɔɐǝᴚㄥ§", - "gtceu.machine.uev_circuit_assembler.tooltip": "ʎɹoʇɔɐℲ uoıʇɐʇndɯoƆㄥ§", - "gtceu.machine.uev_compressor.tooltip": "ɹoʇɔıɹʇsuoƆ ɹǝʇʇɐWㄥ§", - "gtceu.machine.uev_cutter.tooltip": "ɹǝpıʌıᗡ ʇɔǝظqOㄥ§", - "gtceu.machine.uev_distillery.tooltip": "ɹǝʇʇıןdS uoıʇɔɐɹℲㄥ§", - "gtceu.machine.uev_electric_furnace.tooltip": "ɹoʇɐןnɯıʇS ɯoʇⱯㄥ§", - "gtceu.machine.uev_electrolyzer.tooltip": "ɹǝzıuoI ɔıɯoʇⱯㄥ§", - "gtceu.machine.uev_electromagnetic_separator.tooltip": "ɹǝןןǝdsıᗡ ℲWƎㄥ§", - "gtceu.machine.uev_extractor.tooltip": "ɹǝʞɔnS buıʎɟǝnbıꞀㄥ§", - "gtceu.machine.uev_extruder.tooltip": "ɹǝʌıɹᗡ ǝdɐɥSㄥ§", - "gtceu.machine.uev_fermenter.tooltip": "ɹǝןןoɹʇuoƆ uoıʇɐɹıdsǝᴚㄥ§", - "gtceu.machine.uev_fluid_heater.tooltip": "ɹǝnqɯI ןɐɯɹǝɥ⟘ㄥ§", - "gtceu.machine.uev_fluid_solidifier.tooltip": "ɹoʇɐɔıɟıɹʇǝԀ pınןℲㄥ§", - "gtceu.machine.uev_forge_hammer.tooltip": "ɹoʇɐןnpoW ʇɔɐdɯIㄥ§", - "gtceu.machine.uev_forming_press.tooltip": "ɹǝʇɟıɥS ǝɔɐɟɹnSㄥ§", - "gtceu.machine.uev_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɯǝʇsʎs ɹɐןos ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", - "gtceu.machine.uev_laser_engraver.tooltip": "uouuɐƆ uoʇoɥԀ ʇɔɐxƎㄥ§", - "gtceu.machine.uev_lathe.tooltip": "ɹǝpuıɹ⅁ uoıʇɐʇoᴚㄥ§", - "gtceu.machine.uev_macerator.tooltip": "ɹoʇɐuıɯıןƎ ǝdɐɥSㄥ§", - "gtceu.machine.uev_mass_fabricator.tooltip": "ɹoʇɐıʇıuI ǝɔuǝʇsıxƎㄥ§", - "gtceu.machine.uev_mixer.tooltip": "ɹǝzıuǝboɯoH ןɐıɹǝʇɐWㄥ§", - "gtceu.machine.uev_ore_washer.tooltip": "ɥsɐM ɹɐƆ ǝɹnʇɐıuıWㄥ§", - "gtceu.machine.uev_packer.tooltip": "ǝsnoɥǝɹɐM uozɐɯⱯㄥ§", - "gtceu.machine.uev_polarizer.tooltip": "ɹǝbuɐɹɹɐǝᴚ pןǝıℲ ɔıʇǝubɐWㄥ§", - "gtceu.machine.uev_replicator.tooltip": "ɹǝsodɯoƆ ןɐʇuǝɯǝןƎㄥ§", - "gtceu.machine.uev_rock_crusher.tooltip": "ɹǝqɯɐɥƆ uoıʇɐɯɹoℲ ɔıuɐɔןoΛㄥ§", - "gtceu.machine.uev_scanner.tooltip": "ǝdoɔsoɹɔıW uoɹʇɔǝןƎㄥ§", - "gtceu.machine.uev_sifter.tooltip": "ɹǝʇןıℲ uoıʇɐsןnԀㄥ§", - "gtceu.machine.uev_thermal_centrifuge.tooltip": "ǝuoןɔʎƆ ǝɹıℲㄥ§", - "gtceu.machine.uev_wiremill.tooltip": "ɹoʇɐɹnbıɟsuɐɹ⟘ ǝɹıMㄥ§", - "gtceu.machine.uhv_alloy_smelter.tooltip": "ɹoʇɐɯɐbןɐɯⱯ ןɐʇǝWㄥ§", - "gtceu.machine.uhv_arc_furnace.tooltip": "ɹǝʇɐǝH ʇınɔɹıƆ ʇɹoɥSㄥ§", - "gtceu.machine.uhv_assembler.tooltip": "ɹoʇɔnɹʇsuoƆ ʎןqɯǝssⱯㄥ§", - "gtceu.machine.uhv_autoclave.tooltip": "ʇıu∩ ǝɔuɐɹqɯnɔuƎㄥ§", - "gtceu.machine.uhv_bender.tooltip": "ɹǝɯɹoɟǝᗡ ɹǝʇʇɐWㄥ§", - "gtceu.machine.uhv_brewery.tooltip": "ɹǝɥsnᴚ ʍǝɹᗺㄥ§", - "gtceu.machine.uhv_canner.tooltip": "ɹoʇɐnʇɔⱯ uɐƆㄥ§", - "gtceu.machine.uhv_centrifuge.tooltip": "opɐuɹo⟘ ɹɐןnɔǝןoWㄥ§", - "gtceu.machine.uhv_chemical_bath.tooltip": "uoɹʇʞunᗡ ןɐɔıɯǝɥƆㄥ§", - "gtceu.machine.uhv_chemical_reactor.tooltip": "ɹǝzʎןɐʇɐƆ uoıʇɔɐǝᴚㄥ§", - "gtceu.machine.uhv_circuit_assembler.tooltip": "ʎɹoʇɔɐℲ uoıʇɐʇndɯoƆㄥ§", - "gtceu.machine.uhv_compressor.tooltip": "ɹoʇɔıɹʇsuoƆ ɹǝʇʇɐWㄥ§", - "gtceu.machine.uhv_cutter.tooltip": "ɹǝpıʌıᗡ ʇɔǝظqOㄥ§", - "gtceu.machine.uhv_distillery.tooltip": "ɹǝʇʇıןdS uoıʇɔɐɹℲㄥ§", - "gtceu.machine.uhv_electric_furnace.tooltip": "ɹoʇɐןnɯıʇS ɯoʇⱯㄥ§", - "gtceu.machine.uhv_electrolyzer.tooltip": "ɹǝzıuoI ɔıɯoʇⱯㄥ§", - "gtceu.machine.uhv_electromagnetic_separator.tooltip": "ɹǝןןǝdsıᗡ ℲWƎㄥ§", - "gtceu.machine.uhv_extractor.tooltip": "ɹǝʞɔnS buıʎɟǝnbıꞀㄥ§", - "gtceu.machine.uhv_extruder.tooltip": "ɹǝʌıɹᗡ ǝdɐɥSㄥ§", - "gtceu.machine.uhv_fermenter.tooltip": "ɹǝןןoɹʇuoƆ uoıʇɐɹıdsǝᴚㄥ§", - "gtceu.machine.uhv_fluid_heater.tooltip": "ɹǝnqɯI ןɐɯɹǝɥ⟘ㄥ§", - "gtceu.machine.uhv_fluid_solidifier.tooltip": "ɹoʇɐɔıɟıɹʇǝԀ pınןℲㄥ§", - "gtceu.machine.uhv_forge_hammer.tooltip": "ɹoʇɐןnpoW ʇɔɐdɯIㄥ§", - "gtceu.machine.uhv_forming_press.tooltip": "ɹǝʇɟıɥS ǝɔɐɟɹnSㄥ§", - "gtceu.machine.uhv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɯǝʇsʎs ɹɐןos ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", - "gtceu.machine.uhv_laser_engraver.tooltip": "uouuɐƆ uoʇoɥԀ ʇɔɐxƎㄥ§", - "gtceu.machine.uhv_lathe.tooltip": "ɹǝpuıɹ⅁ uoıʇɐʇoᴚㄥ§", - "gtceu.machine.uhv_macerator.tooltip": "ɹoʇɐuıɯıןƎ ǝdɐɥSㄥ§", - "gtceu.machine.uhv_mass_fabricator.tooltip": "ɹoʇɐıʇıuI ǝɔuǝʇsıxƎㄥ§", - "gtceu.machine.uhv_mixer.tooltip": "ɹǝzıuǝboɯoH ןɐıɹǝʇɐWㄥ§", - "gtceu.machine.uhv_ore_washer.tooltip": "ɥsɐM ɹɐƆ ǝɹnʇɐıuıWㄥ§", - "gtceu.machine.uhv_packer.tooltip": "ǝsnoɥǝɹɐM uozɐɯⱯㄥ§", - "gtceu.machine.uhv_polarizer.tooltip": "ɹǝbuɐɹɹɐǝᴚ pןǝıℲ ɔıʇǝubɐWㄥ§", - "gtceu.machine.uhv_replicator.tooltip": "ɹǝsodɯoƆ ןɐʇuǝɯǝןƎㄥ§", - "gtceu.machine.uhv_rock_crusher.tooltip": "ɹǝqɯɐɥƆ uoıʇɐɯɹoℲ ɔıuɐɔןoΛㄥ§", - "gtceu.machine.uhv_scanner.tooltip": "ǝdoɔsoɹɔıW uoɹʇɔǝןƎㄥ§", - "gtceu.machine.uhv_sifter.tooltip": "ɹǝʇןıℲ uoıʇɐsןnԀㄥ§", - "gtceu.machine.uhv_thermal_centrifuge.tooltip": "ǝuoןɔʎƆ ǝɹıℲㄥ§", - "gtceu.machine.uhv_wiremill.tooltip": "ɹoʇɐɹnbıɟsuɐɹ⟘ ǝɹıMㄥ§", - "gtceu.machine.uiv_alloy_smelter.tooltip": "ɹoʇɐɯɐbןɐɯⱯ ןɐʇǝWㄥ§", - "gtceu.machine.uiv_arc_furnace.tooltip": "ɹǝʇɐǝH ʇınɔɹıƆ ʇɹoɥSㄥ§", - "gtceu.machine.uiv_assembler.tooltip": "ɹoʇɔnɹʇsuoƆ ʎןqɯǝssⱯㄥ§", - "gtceu.machine.uiv_autoclave.tooltip": "ʇıu∩ ǝɔuɐɹqɯnɔuƎㄥ§", - "gtceu.machine.uiv_bender.tooltip": "ɹǝɯɹoɟǝᗡ ɹǝʇʇɐWㄥ§", - "gtceu.machine.uiv_brewery.tooltip": "ɹǝɥsnᴚ ʍǝɹᗺㄥ§", - "gtceu.machine.uiv_canner.tooltip": "ɹoʇɐnʇɔⱯ uɐƆㄥ§", - "gtceu.machine.uiv_centrifuge.tooltip": "opɐuɹo⟘ ɹɐןnɔǝןoWㄥ§", - "gtceu.machine.uiv_chemical_bath.tooltip": "uoɹʇʞunᗡ ןɐɔıɯǝɥƆㄥ§", - "gtceu.machine.uiv_chemical_reactor.tooltip": "ɹǝzʎןɐʇɐƆ uoıʇɔɐǝᴚㄥ§", - "gtceu.machine.uiv_circuit_assembler.tooltip": "ʎɹoʇɔɐℲ uoıʇɐʇndɯoƆㄥ§", - "gtceu.machine.uiv_compressor.tooltip": "ɹoʇɔıɹʇsuoƆ ɹǝʇʇɐWㄥ§", - "gtceu.machine.uiv_cutter.tooltip": "ɹǝpıʌıᗡ ʇɔǝظqOㄥ§", - "gtceu.machine.uiv_distillery.tooltip": "ɹǝʇʇıןdS uoıʇɔɐɹℲㄥ§", - "gtceu.machine.uiv_electric_furnace.tooltip": "ɹoʇɐןnɯıʇS ɯoʇⱯㄥ§", - "gtceu.machine.uiv_electrolyzer.tooltip": "ɹǝzıuoI ɔıɯoʇⱯㄥ§", - "gtceu.machine.uiv_electromagnetic_separator.tooltip": "ɹǝןןǝdsıᗡ ℲWƎㄥ§", - "gtceu.machine.uiv_extractor.tooltip": "ɹǝʞɔnS buıʎɟǝnbıꞀㄥ§", - "gtceu.machine.uiv_extruder.tooltip": "ɹǝʌıɹᗡ ǝdɐɥSㄥ§", - "gtceu.machine.uiv_fermenter.tooltip": "ɹǝןןoɹʇuoƆ uoıʇɐɹıdsǝᴚㄥ§", - "gtceu.machine.uiv_fluid_heater.tooltip": "ɹǝnqɯI ןɐɯɹǝɥ⟘ㄥ§", - "gtceu.machine.uiv_fluid_solidifier.tooltip": "ɹoʇɐɔıɟıɹʇǝԀ pınןℲㄥ§", - "gtceu.machine.uiv_forge_hammer.tooltip": "ɹoʇɐןnpoW ʇɔɐdɯIㄥ§", - "gtceu.machine.uiv_forming_press.tooltip": "ɹǝʇɟıɥS ǝɔɐɟɹnSㄥ§", - "gtceu.machine.uiv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɯǝʇsʎs ɹɐןos ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", - "gtceu.machine.uiv_laser_engraver.tooltip": "uouuɐƆ uoʇoɥԀ ʇɔɐxƎㄥ§", - "gtceu.machine.uiv_lathe.tooltip": "ɹǝpuıɹ⅁ uoıʇɐʇoᴚㄥ§", - "gtceu.machine.uiv_macerator.tooltip": "ɹoʇɐuıɯıןƎ ǝdɐɥSㄥ§", - "gtceu.machine.uiv_mass_fabricator.tooltip": "ɹoʇɐıʇıuI ǝɔuǝʇsıxƎㄥ§", - "gtceu.machine.uiv_mixer.tooltip": "ɹǝzıuǝboɯoH ןɐıɹǝʇɐWㄥ§", - "gtceu.machine.uiv_ore_washer.tooltip": "ɥsɐM ɹɐƆ ǝɹnʇɐıuıWㄥ§", - "gtceu.machine.uiv_packer.tooltip": "ǝsnoɥǝɹɐM uozɐɯⱯㄥ§", - "gtceu.machine.uiv_polarizer.tooltip": "ɹǝbuɐɹɹɐǝᴚ pןǝıℲ ɔıʇǝubɐWㄥ§", - "gtceu.machine.uiv_replicator.tooltip": "ɹǝsodɯoƆ ןɐʇuǝɯǝןƎㄥ§", - "gtceu.machine.uiv_rock_crusher.tooltip": "ɹǝqɯɐɥƆ uoıʇɐɯɹoℲ ɔıuɐɔןoΛㄥ§", - "gtceu.machine.uiv_scanner.tooltip": "ǝdoɔsoɹɔıW uoɹʇɔǝןƎㄥ§", - "gtceu.machine.uiv_sifter.tooltip": "ɹǝʇןıℲ uoıʇɐsןnԀㄥ§", - "gtceu.machine.uiv_thermal_centrifuge.tooltip": "ǝuoןɔʎƆ ǝɹıℲㄥ§", - "gtceu.machine.uiv_wiremill.tooltip": "ɹoʇɐɹnbıɟsuɐɹ⟘ ǝɹıMㄥ§", - "gtceu.machine.ulv_alloy_smelter.tooltip": "ɹǝʇןǝɯS uoıʇɐuıqɯoɔ ɥɔǝ⟘ɥbıHㄥ§", - "gtceu.machine.ulv_arc_furnace.tooltip": "¿ǝɔɐuɹnℲ ʇsɐןᗺ ɐ spǝǝu oɥMㄥ§", - "gtceu.machine.ulv_assembler.tooltip": "¡ǝןqɯǝssⱯ 'sɹǝbuǝʌⱯㄥ§", - "gtceu.machine.ulv_autoclave.tooltip": "sʇsnᗡ ɹnoʎ buızıןןɐʇsʎɹƆㄥ§", - "gtceu.machine.ulv_bender.tooltip": "¡¡¡ᴚƎᗡNƎᗺ ʇuɐʍ ǝM ¡pɐq s,ǝɥ 'ooᗺㄥ§", - "gtceu.machine.ulv_brewery.tooltip": "buıʍǝɹq uoıʇod ʇuǝıɔıɟɟǝ puɐ ʇɔɐdɯoƆㄥ§", - "gtceu.machine.ulv_canner.tooltip": "sɹǝuıɐʇuoƆ ɟo ʇno puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", - "gtceu.machine.ulv_chemical_bath.tooltip": "ɯǝɥʇ ǝʇɐɹɐdǝs oʇ sןɐɔıɯǝɥƆ uı sǝɹO buıɥʇɐᗺㄥ§", - "gtceu.machine.ulv_chemical_reactor.tooltip": "ɹǝɥʇo ɥɔɐǝ ɥʇıʍ ʇɔɐǝɹ sןɐɔıɯǝɥƆ buıʇʇǝꞀㄥ§", - "gtceu.machine.ulv_circuit_assembler.tooltip": "ǝɔɐןd ǝɥʇ ɹǝʌo ןןɐ ǝɔɐןԀ-u-ʞɔıԀㄥ§", - "gtceu.machine.ulv_compressor.tooltip": "ㄥㄥƆ ɔıʇɐW-O-ssǝɹdɯoƆㄥ§", - "gtceu.machine.ulv_cutter.tooltip": "ǝɔıᗡ N,ǝɔıןSㄥ§", - "gtceu.machine.ulv_distillery.tooltip": "spınןℲ ɟo sʇɹɐԀ ʇuɐʌǝןǝɹ ʇsoɯ buıʇɔɐɹʇxƎㄥ§", - "gtceu.machine.ulv_electric_furnace.tooltip": "ㄣ9 ǝɹopoɯɯoƆ ɐ buısn ǝʞıן ʇoNㄥ§", - "gtceu.machine.ulv_electromagnetic_separator.tooltip": "ʇsǝɹ ǝɥʇ ɯoɹɟ sǝɹO ɔıʇǝubɐɯ ǝɥʇ buıʇɐɹɐdǝSㄥ§", - "gtceu.machine.ulv_extractor.tooltip": "ƐᄅƖᗡ - ɯooᗡ ɟo ǝɔıʌǝᗡ-ɹǝɔınظǝᗡㄥ§", - "gtceu.machine.ulv_extruder.tooltip": "buıʞɹoM ןɐʇǝW ɹoɟ ǝuıɥɔɐW ןɐsɹǝʌıu∩ㄥ§", - "gtceu.machine.ulv_fermenter.tooltip": "spınןℲ buıʇuǝɯɹǝℲㄥ§", - "gtceu.machine.ulv_fluid_heater.tooltip": "spınןℲ ɹnoʎ dn buıʇɐǝHㄥ§", - "gtceu.machine.ulv_fluid_solidifier.tooltip": "spıןoS ɯɹoɟ oʇ uʍop spınןℲ sןooƆㄥ§", - "gtceu.machine.ulv_forge_hammer.tooltip": "¡ǝɯıʇɹǝɯɯɐH 'doʇSㄥ§", - "gtceu.machine.ulv_forming_press.tooltip": "sbuıɥʇ oʇuı sǝbɐɯI buıʇuıɹdɯIㄥ§", - "gtceu.machine.ulv_mass_fabricator.tooltip": "pǝɹɐnbS uoıʇɐɔıɹqɐℲ * ɹǝʇʇɐW W∩∩ㄥ§", - "gtceu.machine.ulv_mixer.tooltip": "¿puǝןᗺ ʇı ןןıMㄥ§", - "gtceu.machine.ulv_packer.tooltip": "sǝxoᗺ ɟo ʇno sbuıɥʇ sqɐɹ⅁ puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", - "gtceu.machine.ulv_polarizer.tooltip": "sʇǝubɐW ɹnoʎ buısıɹɐןodıᗺㄥ§", - "gtceu.machine.ulv_replicator.tooltip": "sʇuǝɯǝןƎ ɟo ʇsǝɹnԀ ǝɥʇ buıɔnpoɹԀㄥ§", - "gtceu.machine.ulv_scanner.tooltip": "sbuıɥʇ ɹǝɥʇo puɐ sןɐıɹǝʇɐW suɐɔSㄥ§", - "gtceu.machine.ulv_sifter.tooltip": "buıʇɟıs dǝǝʞ puɐ ɯןɐɔ ʎɐʇSㄥ§", - "gtceu.machine.ulv_wiremill.tooltip": "ʎןʇuǝıɔıɟɟǝ ǝɹoɯ sǝɹıM sǝɔnpoɹԀㄥ§", - "gtceu.machine.uv_alloy_smelter.tooltip": "ɹoʇɐɯɐbןɐɯⱯ ןɐʇǝWㄥ§", - "gtceu.machine.uv_arc_furnace.tooltip": "ɹǝʇɐǝH ʇınɔɹıƆ ʇɹoɥSㄥ§", - "gtceu.machine.uv_assembler.tooltip": "ɹoʇɔnɹʇsuoƆ ʎןqɯǝssⱯㄥ§", - "gtceu.machine.uv_autoclave.tooltip": "ʇıu∩ ǝɔuɐɹqɯnɔuƎㄥ§", - "gtceu.machine.uv_bender.tooltip": "ɹǝɯɹoɟǝᗡ ɹǝʇʇɐWㄥ§", - "gtceu.machine.uv_brewery.tooltip": "ɹǝɥsnᴚ ʍǝɹᗺㄥ§", - "gtceu.machine.uv_canner.tooltip": "ɹoʇɐnʇɔⱯ uɐƆㄥ§", - "gtceu.machine.uv_centrifuge.tooltip": "opɐuɹo⟘ ɹɐןnɔǝןoWㄥ§", - "gtceu.machine.uv_chemical_bath.tooltip": "uoɹʇʞunᗡ ןɐɔıɯǝɥƆㄥ§", - "gtceu.machine.uv_chemical_reactor.tooltip": "ɹǝzʎןɐʇɐƆ uoıʇɔɐǝᴚㄥ§", - "gtceu.machine.uv_circuit_assembler.tooltip": "ʎɹoʇɔɐℲ uoıʇɐʇndɯoƆㄥ§", - "gtceu.machine.uv_compressor.tooltip": "ɹoʇɔıɹʇsuoƆ ɹǝʇʇɐWㄥ§", - "gtceu.machine.uv_cutter.tooltip": "ɹǝpıʌıᗡ ʇɔǝظqOㄥ§", - "gtceu.machine.uv_distillery.tooltip": "ɹǝʇʇıןdS uoıʇɔɐɹℲㄥ§", - "gtceu.machine.uv_electric_furnace.tooltip": "ɹoʇɐןnɯıʇS ɯoʇⱯㄥ§", - "gtceu.machine.uv_electrolyzer.tooltip": "ɹǝzıuoI ɔıɯoʇⱯㄥ§", - "gtceu.machine.uv_electromagnetic_separator.tooltip": "ɹǝןןǝdsıᗡ ℲWƎㄥ§", - "gtceu.machine.uv_extractor.tooltip": "ɹǝʞɔnS buıʎɟǝnbıꞀㄥ§", - "gtceu.machine.uv_extruder.tooltip": "ɹǝʌıɹᗡ ǝdɐɥSㄥ§", - "gtceu.machine.uv_fermenter.tooltip": "ɹǝןןoɹʇuoƆ uoıʇɐɹıdsǝᴚㄥ§", - "gtceu.machine.uv_fluid_heater.tooltip": "ɹǝnqɯI ןɐɯɹǝɥ⟘ㄥ§", - "gtceu.machine.uv_fluid_solidifier.tooltip": "ɹoʇɐɔıɟıɹʇǝԀ pınןℲㄥ§", - "gtceu.machine.uv_forge_hammer.tooltip": "ɹoʇɐןnpoW ʇɔɐdɯIㄥ§", - "gtceu.machine.uv_forming_press.tooltip": "ɹǝʇɟıɥS ǝɔɐɟɹnSㄥ§", - "gtceu.machine.uv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɯǝʇsʎs ɹɐןos ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", - "gtceu.machine.uv_laser_engraver.tooltip": "uouuɐƆ uoʇoɥԀ ʇɔɐxƎㄥ§", - "gtceu.machine.uv_lathe.tooltip": "ɹǝpuıɹ⅁ uoıʇɐʇoᴚㄥ§", - "gtceu.machine.uv_macerator.tooltip": "ɹoʇɐuıɯıןƎ ǝdɐɥSㄥ§", - "gtceu.machine.uv_mass_fabricator.tooltip": "ɹoʇɐıʇıuI ǝɔuǝʇsıxƎㄥ§", - "gtceu.machine.uv_mixer.tooltip": "ɹǝzıuǝboɯoH ןɐıɹǝʇɐWㄥ§", - "gtceu.machine.uv_ore_washer.tooltip": "ɥsɐM ɹɐƆ ǝɹnʇɐıuıWㄥ§", - "gtceu.machine.uv_packer.tooltip": "ǝsnoɥǝɹɐM uozɐɯⱯㄥ§", - "gtceu.machine.uv_polarizer.tooltip": "ɹǝbuɐɹɹɐǝᴚ pןǝıℲ ɔıʇǝubɐWㄥ§", - "gtceu.machine.uv_replicator.tooltip": "ɹǝsodɯoƆ ןɐʇuǝɯǝןƎㄥ§", - "gtceu.machine.uv_rock_crusher.tooltip": "ɹǝqɯɐɥƆ uoıʇɐɯɹoℲ ɔıuɐɔןoΛㄥ§", - "gtceu.machine.uv_scanner.tooltip": "ǝdoɔsoɹɔıW uoɹʇɔǝןƎㄥ§", - "gtceu.machine.uv_sifter.tooltip": "ɹǝʇןıℲ uoıʇɐsןnԀㄥ§", - "gtceu.machine.uv_thermal_centrifuge.tooltip": "ǝuoןɔʎƆ ǝɹıℲㄥ§", - "gtceu.machine.uv_wiremill.tooltip": "ɹoʇɐɹnbıɟsuɐɹ⟘ ǝɹıMㄥ§", - "gtceu.machine.uxv_alloy_smelter.tooltip": "ɹoʇɐɯɐbןɐɯⱯ ןɐʇǝWㄥ§", - "gtceu.machine.uxv_arc_furnace.tooltip": "ɹǝʇɐǝH ʇınɔɹıƆ ʇɹoɥSㄥ§", - "gtceu.machine.uxv_assembler.tooltip": "ɹoʇɔnɹʇsuoƆ ʎןqɯǝssⱯㄥ§", - "gtceu.machine.uxv_autoclave.tooltip": "ʇıu∩ ǝɔuɐɹqɯnɔuƎㄥ§", - "gtceu.machine.uxv_bender.tooltip": "ɹǝɯɹoɟǝᗡ ɹǝʇʇɐWㄥ§", - "gtceu.machine.uxv_brewery.tooltip": "ɹǝɥsnᴚ ʍǝɹᗺㄥ§", - "gtceu.machine.uxv_canner.tooltip": "ɹoʇɐnʇɔⱯ uɐƆㄥ§", - "gtceu.machine.uxv_centrifuge.tooltip": "opɐuɹo⟘ ɹɐןnɔǝןoWㄥ§", - "gtceu.machine.uxv_chemical_bath.tooltip": "uoɹʇʞunᗡ ןɐɔıɯǝɥƆㄥ§", - "gtceu.machine.uxv_chemical_reactor.tooltip": "ɹǝzʎןɐʇɐƆ uoıʇɔɐǝᴚㄥ§", - "gtceu.machine.uxv_circuit_assembler.tooltip": "ʎɹoʇɔɐℲ uoıʇɐʇndɯoƆㄥ§", - "gtceu.machine.uxv_compressor.tooltip": "ɹoʇɔıɹʇsuoƆ ɹǝʇʇɐWㄥ§", - "gtceu.machine.uxv_cutter.tooltip": "ɹǝpıʌıᗡ ʇɔǝظqOㄥ§", - "gtceu.machine.uxv_distillery.tooltip": "ɹǝʇʇıןdS uoıʇɔɐɹℲㄥ§", - "gtceu.machine.uxv_electric_furnace.tooltip": "ɹoʇɐןnɯıʇS ɯoʇⱯㄥ§", - "gtceu.machine.uxv_electrolyzer.tooltip": "ɹǝzıuoI ɔıɯoʇⱯㄥ§", - "gtceu.machine.uxv_electromagnetic_separator.tooltip": "ɹǝןןǝdsıᗡ ℲWƎㄥ§", - "gtceu.machine.uxv_extractor.tooltip": "ɹǝʞɔnS buıʎɟǝnbıꞀㄥ§", - "gtceu.machine.uxv_extruder.tooltip": "ɹǝʌıɹᗡ ǝdɐɥSㄥ§", - "gtceu.machine.uxv_fermenter.tooltip": "ɹǝןןoɹʇuoƆ uoıʇɐɹıdsǝᴚㄥ§", - "gtceu.machine.uxv_fluid_heater.tooltip": "ɹǝnqɯI ןɐɯɹǝɥ⟘ㄥ§", - "gtceu.machine.uxv_fluid_solidifier.tooltip": "ɹoʇɐɔıɟıɹʇǝԀ pınןℲㄥ§", - "gtceu.machine.uxv_forge_hammer.tooltip": "ɹoʇɐןnpoW ʇɔɐdɯIㄥ§", - "gtceu.machine.uxv_forming_press.tooltip": "ɹǝʇɟıɥS ǝɔɐɟɹnSㄥ§", - "gtceu.machine.uxv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɯǝʇsʎs ɹɐןos ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", - "gtceu.machine.uxv_laser_engraver.tooltip": "uouuɐƆ uoʇoɥԀ ʇɔɐxƎㄥ§", - "gtceu.machine.uxv_lathe.tooltip": "ɹǝpuıɹ⅁ uoıʇɐʇoᴚㄥ§", - "gtceu.machine.uxv_macerator.tooltip": "ɹoʇɐuıɯıןƎ ǝdɐɥSㄥ§", - "gtceu.machine.uxv_mass_fabricator.tooltip": "ɹoʇɐıʇıuI ǝɔuǝʇsıxƎㄥ§", - "gtceu.machine.uxv_mixer.tooltip": "ɹǝzıuǝboɯoH ןɐıɹǝʇɐWㄥ§", - "gtceu.machine.uxv_ore_washer.tooltip": "ɥsɐM ɹɐƆ ǝɹnʇɐıuıWㄥ§", - "gtceu.machine.uxv_packer.tooltip": "ǝsnoɥǝɹɐM uozɐɯⱯㄥ§", - "gtceu.machine.uxv_polarizer.tooltip": "ɹǝbuɐɹɹɐǝᴚ pןǝıℲ ɔıʇǝubɐWㄥ§", - "gtceu.machine.uxv_replicator.tooltip": "ɹǝsodɯoƆ ןɐʇuǝɯǝןƎㄥ§", - "gtceu.machine.uxv_rock_crusher.tooltip": "ɹǝqɯɐɥƆ uoıʇɐɯɹoℲ ɔıuɐɔןoΛㄥ§", - "gtceu.machine.uxv_scanner.tooltip": "ǝdoɔsoɹɔıW uoɹʇɔǝןƎㄥ§", - "gtceu.machine.uxv_sifter.tooltip": "ɹǝʇןıℲ uoıʇɐsןnԀㄥ§", - "gtceu.machine.uxv_thermal_centrifuge.tooltip": "ǝuoןɔʎƆ ǝɹıℲㄥ§", - "gtceu.machine.uxv_wiremill.tooltip": "ɹoʇɐɹnbıɟsuɐɹ⟘ ǝɹıMㄥ§", "gtceu.machine.vacuum_freezer.tooltip": "xoᗺ ǝɔI ɯnıuıɯnןⱯ", "gtceu.machine.workbench.storage_note.0": "pǝʇɔǝuuoɔ ɯoɹɟ sɯǝʇı ǝןqɐןıɐʌⱯ(", "gtceu.machine.workbench.storage_note.1": ")buıʇɟɐɹɔ ɹoɟ ǝןqɐsn sǝıɹoʇuǝʌuı", @@ -3310,51 +2696,6 @@ "gtceu.machine.workbench.tab.workbench": "buıʇɟɐɹƆ", "gtceu.machine.workbench.tooltip.0": "ʎɹʇsǝɹoℲ uɐɥʇ ɹǝʇʇǝᗺ", "gtceu.machine.workbench.tooltip.1": "˙sǝdıɔǝᴚ sǝʌɐs puɐ 'sǝıɹoʇuǝʌuI ʇuǝɔɐظpɐ ɯoɹɟ sןןnd 'ǝbɐɹoʇS ןoo⟘ 'ǝbɐɹoʇS ɯǝʇI sɐH", - "gtceu.machine.world_accelerator.description": "˙ǝpoɯ ǝbuɐɥɔ oʇ ɹǝʌıɹpʍǝɹɔS ǝs∩ ˙ㄥ§ʞɔı⟘ ɯopuɐᴚɟ§ ɹo ㄥ§ʎʇıʇuƎ ǝןı⟘ɟ§ :sǝpoɯ ᄅ ɟo ǝuo uı sʞɔoןq ʎqɹɐǝu sǝʇɐɹǝןǝɔɔɐ ʞɔı⟘", - "gtceu.machine.world_accelerator.mode_entity": "ǝpoW ʞɔı⟘ ɯopuɐᴚ", - "gtceu.machine.world_accelerator.mode_tile": "ǝpoW ʎʇıʇuƎ ʞɔoןᗺ", - "gtceu.machine.world_accelerator.working_area": ":ɐǝɹⱯ buıʞɹoMq§", - "gtceu.machine.world_accelerator.working_area_random": "%dx%d ɟ§:ǝpoW ʞɔı⟘ ɯopuɐᴚ ", - "gtceu.machine.world_accelerator.working_area_tile": "sʞɔoןᗺ ʇuǝɔɐظpⱯ ɟ§:ǝpoW ʎʇıʇuƎ ʞɔoןᗺ ", - "gtceu.machine.zpm_alloy_smelter.tooltip": "ɹoʇɐɹbǝʇuI ʎoןןⱯㄥ§", - "gtceu.machine.zpm_arc_furnace.tooltip": "ɹǝʇɐǝH ǝbɹɐɥɔsıᗡㄥ§", - "gtceu.machine.zpm_assembler.tooltip": "ǝןqɐ⟘ buıʇɟɐɹƆ ɐ ⟘ONㄥ§", - "gtceu.machine.zpm_autoclave.tooltip": "ɹǝʞooƆ ǝɹnssǝɹԀㄥ§", - "gtceu.machine.zpm_bender.tooltip": "ɹǝʇɹoʇsıᗡ ǝdɐɥSㄥ§", - "gtceu.machine.zpm_brewery.tooltip": "sʞuıɹᗡ ɹnoʎ buıʍǝɹᗺㄥ§", - "gtceu.machine.zpm_canner.tooltip": "ɹoʇɐɹǝdO uɐƆㄥ§", - "gtceu.machine.zpm_centrifuge.tooltip": "ǝuoןɔʎƆ ɹɐןnɔǝןoWㄥ§", - "gtceu.machine.zpm_chemical_bath.tooltip": "ɹǝʞɐoS ןɐɔıɯǝɥƆㄥ§", - "gtceu.machine.zpm_chemical_reactor.tooltip": "ɹǝɯɹoɟɹǝԀ ןɐɔıɯǝɥƆㄥ§", - "gtceu.machine.zpm_circuit_assembler.tooltip": "ɹǝɹnʇɔɐɟnuɐW sɔıuoɹʇɔǝןƎㄥ§", - "gtceu.machine.zpm_compressor.tooltip": "ɹǝsuǝpuoƆ ʎʇıɹɐןnbuıSㄥ§", - "gtceu.machine.zpm_cutter.tooltip": "ɹǝʌɐǝןƆ ɹǝʇʇɐWㄥ§", - "gtceu.machine.zpm_distillery.tooltip": "ɹoʇɐɹɐdǝS uoıʇɐsuǝpuoƆㄥ§", - "gtceu.machine.zpm_electric_furnace.tooltip": "ɹossǝɔoɹԀ ʇuǝɯǝʇıɔxƎ uoɹʇɔǝןƎㄥ§", - "gtceu.machine.zpm_electrolyzer.tooltip": "806ㄣ-Ǝ ɹoʇɐɹbǝʇuısıᗡ ɹɐןnɔǝןoWㄥ§", - "gtceu.machine.zpm_electromagnetic_separator.tooltip": "ɹǝzıɹobǝʇɐƆ WƎㄥ§", - "gtceu.machine.zpm_extractor.tooltip": "ɹoʇɐuıʇɔɐɹʇxƎ ɯnnɔɐΛㄥ§", - "gtceu.machine.zpm_extruder.tooltip": "ɹǝɔɐןdsıᗡ ןɐıɹǝʇɐWㄥ§", - "gtceu.machine.zpm_fermenter.tooltip": "ɹǝuǝʇsɐH uoıʇɐʇuǝɯɹǝℲㄥ§", - "gtceu.machine.zpm_fluid_heater.tooltip": "ɹǝsnɟuI ʇɐǝHㄥ§", - "gtceu.machine.zpm_fluid_solidifier.tooltip": "ǝuıɥɔɐW ǝɔI uɐ ʇoNㄥ§", - "gtceu.machine.zpm_forge_hammer.tooltip": "ɹǝbɹoℲ ǝʇɐןԀㄥ§", - "gtceu.machine.zpm_forming_press.tooltip": "ɹǝɹǝʎɐꞀ ʇɔǝظqOㄥ§", - "gtceu.machine.zpm_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ǝɹǝɥdsoɯʇɐ ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", - "gtceu.machine.zpm_laser_engraver.tooltip": "MW ㄣ9˙ᄅƐ ɟo ɹǝʍoԀ ǝɥʇ ɥʇıMㄥ§", - "gtceu.machine.zpm_lathe.tooltip": "806ϛ-Ꞁ ɔıʇɐW-O-uɹn⟘ㄥ§", - "gtceu.machine.zpm_macerator.tooltip": "Ɛ006 ɔıʇɐW-O-puǝןᗺㄥ§", - "gtceu.machine.zpm_mass_fabricator.tooltip": "ʎɹoʇɔɐℲ sısǝuǝ⅁ㄥ§", - "gtceu.machine.zpm_mixer.tooltip": "ɹǝzıuɐbɹO ɹǝʇʇɐWㄥ§", - "gtceu.machine.zpm_ore_washer.tooltip": "ᄅ9Ɛ-I ɹǝɥsɐM-ʎɹpunɐꞀ pǝsodɹndǝᴚㄥ§", - "gtceu.machine.zpm_packer.tooltip": "ɹoʇɐuıxoᗺㄥ§", - "gtceu.machine.zpm_polarizer.tooltip": "ɹǝɔnpuI ɯsıʇǝubɐWㄥ§", - "gtceu.machine.zpm_replicator.tooltip": "ɹǝʇsɐԀ ɹǝʇʇɐWㄥ§", - "gtceu.machine.zpm_rock_crusher.tooltip": "00ᄅ0Ɩ-ᴚ ɹǝıɟıpıןoS ɐɯbɐW ɔıuǝboʎɹƆㄥ§", - "gtceu.machine.zpm_scanner.tooltip": "ɹoʇɔǝʇǝᗡ ʎןɐɯouⱯㄥ§", - "gtceu.machine.zpm_sifter.tooltip": "ƆℲ⟘ ʎq pǝɹosuodSㄥ§", - "gtceu.machine.zpm_thermal_centrifuge.tooltip": "ᄅϛƐ9-⟘ doɥsʇɐǝʍS ǝzɐןᗺㄥ§", - "gtceu.machine.zpm_wiremill.tooltip": "ɹoʇɐbuoןƎ ʇobuIㄥ§", "gtceu.maintenance.configurable_duration": "xɟ% :uoıʇɐɹnᗡ", "gtceu.maintenance.configurable_duration.changed_description": "˙buıʞɔoןɔɹǝʌo ǝɹoɟǝq pǝıןddɐ 'uoıʇɐɹnp xɟ% ɥʇıʍ unɹ ןןıʍ sǝdıɔǝᴚ", "gtceu.maintenance.configurable_duration.modify": ":uoıʇɐɹnᗡ ʎɟıpoW", @@ -4842,6 +4183,665 @@ "ldlib.gui.editor.register.widget.container.gtm_item_slot": "ʇoןS ɯǝʇI W⟘⅁", "ldlib.gui.editor.register.widget.container.gtm_phantom_fluid_slot": "ʇoןS pınןℲ ɯoʇuɐɥԀ W⟘⅁", "ldlib.gui.editor.register.widget.container.gtm_phantom_item_slot": "ʇoןS ɯǝʇI ɯoʇuɐɥԀ W⟘⅁", + "machine.gtceu.available_recipe_map_1.tooltip": "%s :sǝdʎ⟘ ǝdıɔǝᴚ ǝןqɐןıɐʌⱯ", + "machine.gtceu.available_recipe_map_2.tooltip": "%s '%s :sǝdʎ⟘ ǝdıɔǝᴚ ǝןqɐןıɐʌⱯ", + "machine.gtceu.available_recipe_map_3.tooltip": "%s '%s '%s :sǝdʎ⟘ ǝdıɔǝᴚ ǝןqɐןıɐʌⱯ", + "machine.gtceu.available_recipe_map_4.tooltip": "%s '%s '%s '%s :sǝdʎ⟘ ǝdıɔǝᴚ ǝןqɐןıɐʌⱯ", + "machine.gtceu.basic.input_from_output_side.allow": " :ǝpıS ʇndʇnO ɯoɹɟ ʇnduI ʍoןןⱯ", + "machine.gtceu.basic.input_from_output_side.disallow": " :ǝpıS ʇndʇnO ɯoɹɟ ʇnduI ʍoןןɐsıᗡ", + "machine.gtceu.block_breaker.speed_bonus": "%d%%ɟ§ :snuoᗺ pǝǝdSǝ§", + "machine.gtceu.block_breaker.tooltip": "sdoɹp sʇı sʇɔǝןןoɔ puɐ ǝɔɐɟ ʇuoɹɟ uo ʞɔoןq sǝuıWㄥ§", + "machine.gtceu.boiler.heat_info": "%% %s :ʎʇıɔɐdɐƆ ʇɐǝH", + "machine.gtceu.boiler.info.cooling.down": "%sɹ§uʍop buıןooƆ6§", + "machine.gtceu.boiler.info.heating.up": "%sɹ§dn buıʇɐǝHɔ§", + "machine.gtceu.boiler.info.producing.steam": ")ɹǝʇɐʍ buıןıoq(ɐ§ ", + "machine.gtceu.bronze_large_boiler.tooltip": "¡ɯɐǝʇS ǝɹoɯ pǝǝu ǝM", + "machine.gtceu.buffer.tooltip": "spınןℲ puɐ sɯǝʇI ǝɹoʇs oʇ ɹǝɟɟnᗺ ןןɐɯS Ɐ", + "machine.gtceu.coke_oven.tooltip": "ɹǝʍoԀ puɐ ןǝǝʇS ɹoɟ sןǝnɟ ɹǝʇʇǝq buıʞɐW", + "machine.gtceu.diodemessage": "%s :ʇndɥbnoɹɥʇ ǝbɐɹǝdɯⱯ xɐW", + "machine.gtceu.diodetooltip_general": "ǝbɐɹǝdɯⱯ sʇıɯıן puɐ uoıʇɔǝɹıp ǝuo uı ʍoןℲ ʎbɹǝuƎ sʍoןןⱯ", + "machine.gtceu.diodetooltip_starts_at": "ǝbuɐɥɔ oʇ ʇǝןןɐW ʇɟoS ǝsn 'ㄥ§ⱯƖɟ§ sɐ sʇɹɐʇS", + "machine.gtceu.diodetooltip_tool_usage": "˙ʍoןɟ ǝbɐɹǝdɯⱯ ǝbuɐɥɔ oʇ ʇǝןןɐW ʇɟoS ɐ ɥʇıʍ ʇıH", + "machine.gtceu.drum.disable_output": "pınןℲ uıɐɹp ʇou ןןıM", + "machine.gtceu.drum.enable_output": "sʞuɐ⟘ ʇuǝɔɐظpɐ pɹɐʍuʍop oʇ pınןℲ uıɐɹp ןןıM", + "machine.gtceu.electric_blast_furnace.tooltip": "¿ɹǝʞoɯs ɔıɹʇɔǝןǝ ǝɥʇ s,ǝɹǝɥM", + "machine.gtceu.electric_blast_furnace.tooltip.0": "˙buıʞɔoןɔɹǝʌo-ǝɹd pǝıןddɐ sı ɹǝıןdıʇןnɯ ʎbɹǝuǝ ㄥ§%%ϛ6ɟ§ ǝʌıʇɐɔıןdıʇןnɯ ɐ 'ǝɹnʇɐɹǝdɯǝʇ ǝdıɔǝɹ ǝɥʇ ǝʌoqɐ ㄥ§ʞ006ɟ§ ʎɹǝʌǝ ɹoℲ", + "machine.gtceu.electric_blast_furnace.tooltip.1": "˙)ʞɔoןɔɹǝʌo ʇɔǝɟɹǝd( ㄥ§ʇuǝıɔıɟɟǝ %%00Ɩɟ§ sǝɯoɔǝq ʞɔoןɔɹǝʌo ǝuo 'ǝɹnʇɐɹǝdɯǝʇ ǝdıɔǝɹ ǝɥʇ ǝʌoqɐ ㄥ§ʞ008Ɩɟ§ ʎɹǝʌǝ ɹoℲ", + "machine.gtceu.electric_blast_furnace.tooltip.2": "˙ㄥ§ʞ00Ɩɟ§ ʎq pǝsɐǝɹɔuı sı ǝɹnʇɐɹǝdɯǝʇ 'ㄥ§ΛWq§ ǝʌoqɐ ɹǝıʇ ǝbɐʇןoʌ ʎɹǝʌǝ ɹoℲ", + "machine.gtceu.energy_converter.description": "ƎℲ puɐ ∩Ǝ uǝǝʍʇǝq ʎbɹǝuƎ sʇɹǝʌuoƆ", + "machine.gtceu.energy_converter.message_conversion_eu": "ǝʌıʇɐN %d :ʇnO '∩Ǝ %d Ɐ%d :uI '∩Ǝ buıʇɹǝʌuoƆ", + "machine.gtceu.energy_converter.message_conversion_native": "∩Ǝ %d Ɐ%d :ʇnO 'ƎℲ %d :uI 'ʎbɹǝuƎ ǝʌıʇɐN buıʇɹǝʌuoƆ", + "machine.gtceu.energy_converter.tooltip_conversion_eu": "ǝʌıʇɐN %d >- )ɟ§%s( ∩Ǝ %d Ɐ%dɟ§ :uoısɹǝʌuoƆ ∩Ǝɐ§", + "machine.gtceu.energy_converter.tooltip_conversion_native": ")ɟ§%s( ∩Ǝ %d Ɐ%d >- ƎℲ %dɟ§ :uoısɹǝʌuoƆ ǝʌıʇɐNɔ§", + "machine.gtceu.energy_converter.tooltip_tool_usage": "ǝbuɐɥɔ oʇ ʇǝןןɐW ʇɟoS ǝsn 'ㄥ§ɹǝʇɹǝʌuoƆ ƎℲɟ§ sɐ sʇɹɐʇS", + "machine.gtceu.ev_alloy_smelter.tooltip": "ɹǝʇןǝɯS uoıʇɐuıqɯoɔ ɥɔǝ⟘ɥbıHㄥ§", + "machine.gtceu.ev_arc_furnace.tooltip": "¿ǝɔɐuɹnℲ ʇsɐןᗺ ɐ spǝǝu oɥMㄥ§", + "machine.gtceu.ev_assembler.tooltip": "¡ǝןqɯǝssⱯ 'sɹǝbuǝʌⱯㄥ§", + "machine.gtceu.ev_autoclave.tooltip": "sʇsnᗡ ɹnoʎ buızıןןɐʇsʎɹƆㄥ§", + "machine.gtceu.ev_bender.tooltip": "¡¡¡ᴚƎᗡNƎᗺ ʇuɐʍ ǝM ¡pɐq s,ǝɥ 'ooᗺㄥ§", + "machine.gtceu.ev_brewery.tooltip": "buıʍǝɹq uoıʇod ʇuǝıɔıɟɟǝ puɐ ʇɔɐdɯoƆㄥ§", + "machine.gtceu.ev_canner.tooltip": "sɹǝuıɐʇuoƆ ɟo ʇno puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", + "machine.gtceu.ev_centrifuge.tooltip": "ɹoʇɐɹɐdǝS ɹɐןnɔǝןoWㄥ§", + "machine.gtceu.ev_chemical_bath.tooltip": "ɯǝɥʇ ǝʇɐɹɐdǝs oʇ sןɐɔıɯǝɥƆ uı sǝɹO buıɥʇɐᗺㄥ§", + "machine.gtceu.ev_chemical_reactor.tooltip": "ɹǝɥʇo ɥɔɐǝ ɥʇıʍ ʇɔɐǝɹ sןɐɔıɯǝɥƆ buıʇʇǝꞀㄥ§", + "machine.gtceu.ev_circuit_assembler.tooltip": "ǝɔɐןd ǝɥʇ ɹǝʌo ןןɐ ǝɔɐןԀ-u-ʞɔıԀㄥ§", + "machine.gtceu.ev_compressor.tooltip": "ㄥㄥƆ ɔıʇɐW-O-ssǝɹdɯoƆㄥ§", + "machine.gtceu.ev_cutter.tooltip": "ǝɔıᗡ N,ǝɔıןSㄥ§", + "machine.gtceu.ev_distillery.tooltip": "spınןℲ ɟo sʇɹɐԀ ʇuɐʌǝןǝɹ ʇsoɯ buıʇɔɐɹʇxƎㄥ§", + "machine.gtceu.ev_electric_furnace.tooltip": "ㄣ9 ǝɹopoɯɯoƆ ɐ buısn ǝʞıן ʇoNㄥ§", + "machine.gtceu.ev_electrolyzer.tooltip": "sǝןnɔǝןoW buızʎןoɹʇɔǝןƎㄥ§", + "machine.gtceu.ev_electromagnetic_separator.tooltip": "ʇsǝɹ ǝɥʇ ɯoɹɟ sǝɹO ɔıʇǝubɐɯ ǝɥʇ buıʇɐɹɐdǝSㄥ§", + "machine.gtceu.ev_extractor.tooltip": "ƐᄅƖᗡ - ɯooᗡ ɟo ǝɔıʌǝᗡ-ɹǝɔınظǝᗡㄥ§", + "machine.gtceu.ev_extruder.tooltip": "buıʞɹoM ןɐʇǝW ɹoɟ ǝuıɥɔɐW ןɐsɹǝʌıu∩ㄥ§", + "machine.gtceu.ev_fermenter.tooltip": "spınןℲ buıʇuǝɯɹǝℲㄥ§", + "machine.gtceu.ev_fluid_heater.tooltip": "spınןℲ ɹnoʎ dn buıʇɐǝHㄥ§", + "machine.gtceu.ev_fluid_solidifier.tooltip": "spıןoS ɯɹoɟ oʇ uʍop spınןℲ sןooƆㄥ§", + "machine.gtceu.ev_forge_hammer.tooltip": "¡ǝɯıʇɹǝɯɯɐH 'doʇSㄥ§", + "machine.gtceu.ev_forming_press.tooltip": "sbuıɥʇ oʇuı sǝbɐɯI buıʇuıɹdɯIㄥ§", + "machine.gtceu.ev_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɹıɐ ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", + "machine.gtceu.ev_laser_engraver.tooltip": "ɹǝsɐꞀ ǝɥʇ ʇɐ ʎןʇɔǝɹıp ʞooן ʇ,uoᗡㄥ§", + "machine.gtceu.ev_lathe.tooltip": "ʎןʇuǝıɔıɟɟǝ ǝɹoɯ spoᴚ sǝɔnpoɹԀㄥ§", + "machine.gtceu.ev_macerator.tooltip": "sʇɔnpoɹdʎᗺ ɥʇıʍ sǝɹO ɹnoʎ buıppǝɹɥSㄥ§", + "machine.gtceu.ev_mass_fabricator.tooltip": "pǝɹɐnbS uoıʇɐɔıɹqɐℲ * ɹǝʇʇɐW W∩∩ㄥ§", + "machine.gtceu.ev_mixer.tooltip": "¿puǝןᗺ ʇı ןןıMㄥ§", + "machine.gtceu.ev_ore_washer.tooltip": "sǝɹO ɹnoʎ ɯoɹɟ sʇɔnpoɹdʎᗺ ǝɹoɯ buıʇʇǝ⅁ㄥ§", + "machine.gtceu.ev_packer.tooltip": "sǝxoᗺ ɟo ʇno sbuıɥʇ sqɐɹ⅁ puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", + "machine.gtceu.ev_polarizer.tooltip": "sʇǝubɐW ɹnoʎ buısıɹɐןodıᗺㄥ§", + "machine.gtceu.ev_replicator.tooltip": "sʇuǝɯǝןƎ ɟo ʇsǝɹnԀ ǝɥʇ buıɔnpoɹԀㄥ§", + "machine.gtceu.ev_rock_crusher.tooltip": "ʇuǝɔɐظpɐ ʎןןɐʇuozıɹoɥ ɐʌɐꞀ puɐ ɹǝʇɐM ǝɔɐןԀㄥ§", + "machine.gtceu.ev_scanner.tooltip": "sbuıɥʇ ɹǝɥʇo puɐ sןɐıɹǝʇɐW suɐɔSㄥ§", + "machine.gtceu.ev_sifter.tooltip": "buıʇɟıs dǝǝʞ puɐ ɯןɐɔ ʎɐʇSㄥ§", + "machine.gtceu.ev_thermal_centrifuge.tooltip": "ʎןǝsıɔǝɹd ǝɹoɯ sǝɹO buıʇɐɹɐdǝSㄥ§", + "machine.gtceu.ev_wiremill.tooltip": "ʎןʇuǝıɔıɟɟǝ ǝɹoɯ sǝɹıM sǝɔnpoɹԀㄥ§", + "machine.gtceu.fisher.requirement": "˙ʍoןǝq ʎןʇɔǝɹıp ɹǝʇɐʍ ɟo ǝɹɐnbs pǝɹǝʇuǝɔ %dx%d ɐ sǝɹınbǝᴚ", + "machine.gtceu.fisher.speed": "sʞɔıʇ %d ʎɹǝʌǝ buıɥʇǝɯos sǝɥɔʇɐƆ", + "machine.gtceu.fisher.tooltip": "˙ǝɯıʇ ɥɔɐǝ buıɹʇs ǝuo sǝɯnsuoƆ ˙ɥsıɟ oʇ buıɹʇs sʇsoƆ", + "machine.gtceu.hp_steam_alloy_smelter.tooltip": "ɹǝʇןǝɯS uoıʇɐuıqɯoƆㄥ§", + "machine.gtceu.hp_steam_compressor.tooltip": "sɯǝʇI buıssǝɹdɯoƆㄥ§", + "machine.gtceu.hp_steam_extractor.tooltip": "ɹǝqqnᴚ ʇsɹıɟ ɹnoʎ buıʇɔɐɹʇxƎㄥ§", + "machine.gtceu.hp_steam_forge_hammer.tooltip": "ɹǝɯɯɐH ǝbɹoℲㄥ§", + "machine.gtceu.hp_steam_furnace.tooltip": "ɯɐǝʇS pǝssǝɹdɯoɔ ɥʇıʍ sbuıɥʇ buıʇןǝɯSㄥ§", + "machine.gtceu.hp_steam_liquid_boiler.tooltip": "ɹǝןıoᗺ pınbıꞀ ɯɐǝʇS ןןɐɯS uɐɥʇ ɹǝʇsɐℲㄥ§", + "machine.gtceu.hp_steam_macerator.tooltip": "sǝɹO ɹnoʎ buıʇɐɹǝɔɐWㄥ§", + "machine.gtceu.hp_steam_miner.tooltip": "¡ɹǝuıW ǝɥʇ ʍoןǝq sǝɹo sǝuıWㄥ§", + "machine.gtceu.hp_steam_rock_crusher.tooltip": "ʇuǝɔɐظpɐ ʎןןɐʇuozıɹoɥ ɐʌɐꞀ puɐ ɹǝʇɐM ǝɔɐןԀㄥ§", + "machine.gtceu.hp_steam_solar_boiler.tooltip": "unS ʎq ɹǝʍoԀ ɯɐǝʇSㄥ§", + "machine.gtceu.hp_steam_solid_boiler.tooltip": "ɹǝןıoᗺ ןǝnℲ pıןoS ɯɐǝʇS ןןɐɯS ǝɥʇ uɐɥʇ ɹǝʇsɐℲㄥ§", + "machine.gtceu.hull.tooltip": "sıɥʇ ǝsn oʇ ㄥ§uϛ§oƖ§ıㄥ§ʇƐ§ɐq§uɐ§ıǝ§bɔ§ɐㄣ§ɯp§Iϛ§ pǝǝu ʇsnظ noʎㄥ§", + "machine.gtceu.hv_alloy_smelter.tooltip": "ɹǝʇןǝɯS uoıʇɐuıqɯoɔ ɥɔǝ⟘ɥbıHㄥ§", + "machine.gtceu.hv_arc_furnace.tooltip": "¿ǝɔɐuɹnℲ ʇsɐןᗺ ɐ spǝǝu oɥMㄥ§", + "machine.gtceu.hv_assembler.tooltip": "¡ǝןqɯǝssⱯ 'sɹǝbuǝʌⱯㄥ§", + "machine.gtceu.hv_autoclave.tooltip": "sʇsnᗡ ɹnoʎ buızıןןɐʇsʎɹƆㄥ§", + "machine.gtceu.hv_bender.tooltip": "¡¡¡ᴚƎᗡNƎᗺ ʇuɐʍ ǝM ¡pɐq s,ǝɥ 'ooᗺㄥ§", + "machine.gtceu.hv_brewery.tooltip": "buıʍǝɹq uoıʇod ʇuǝıɔıɟɟǝ puɐ ʇɔɐdɯoƆㄥ§", + "machine.gtceu.hv_canner.tooltip": "sɹǝuıɐʇuoƆ ɟo ʇno puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", + "machine.gtceu.hv_centrifuge.tooltip": "sǝןnɔǝןoW buıʇɐɹɐdǝSㄥ§", + "machine.gtceu.hv_chemical_bath.tooltip": "ɯǝɥʇ ǝʇɐɹɐdǝs oʇ sןɐɔıɯǝɥƆ uı sǝɹO buıɥʇɐᗺㄥ§", + "machine.gtceu.hv_chemical_reactor.tooltip": "ɹǝɥʇo ɥɔɐǝ ɥʇıʍ ʇɔɐǝɹ sןɐɔıɯǝɥƆ buıʇʇǝꞀㄥ§", + "machine.gtceu.hv_circuit_assembler.tooltip": "ǝɔɐןd ǝɥʇ ɹǝʌo ןןɐ ǝɔɐןԀ-u-ʞɔıԀㄥ§", + "machine.gtceu.hv_compressor.tooltip": "ㄥㄥƆ ɔıʇɐW-O-ssǝɹdɯoƆㄥ§", + "machine.gtceu.hv_cutter.tooltip": "ǝɔıᗡ N,ǝɔıןSㄥ§", + "machine.gtceu.hv_distillery.tooltip": "spınןℲ ɟo sʇɹɐԀ ʇuɐʌǝןǝɹ ʇsoɯ buıʇɔɐɹʇxƎㄥ§", + "machine.gtceu.hv_electric_furnace.tooltip": "ㄣ9 ǝɹopoɯɯoƆ ɐ buısn ǝʞıן ʇoNㄥ§", + "machine.gtceu.hv_electrolyzer.tooltip": "sǝןnɔǝןoW buızʎןoɹʇɔǝןƎㄥ§", + "machine.gtceu.hv_electromagnetic_separator.tooltip": "ʇsǝɹ ǝɥʇ ɯoɹɟ sǝɹO ɔıʇǝubɐɯ ǝɥʇ buıʇɐɹɐdǝSㄥ§", + "machine.gtceu.hv_extractor.tooltip": "ƐᄅƖᗡ - ɯooᗡ ɟo ǝɔıʌǝᗡ-ɹǝɔınظǝᗡㄥ§", + "machine.gtceu.hv_extruder.tooltip": "buıʞɹoM ןɐʇǝW ɹoɟ ǝuıɥɔɐW ןɐsɹǝʌıu∩ㄥ§", + "machine.gtceu.hv_fermenter.tooltip": "spınןℲ buıʇuǝɯɹǝℲㄥ§", + "machine.gtceu.hv_fluid_heater.tooltip": "spınןℲ ɹnoʎ dn buıʇɐǝHㄥ§", + "machine.gtceu.hv_fluid_solidifier.tooltip": "spıןoS ɯɹoɟ oʇ uʍop spınןℲ sןooƆㄥ§", + "machine.gtceu.hv_forge_hammer.tooltip": "¡ǝɯıʇɹǝɯɯɐH 'doʇSㄥ§", + "machine.gtceu.hv_forming_press.tooltip": "sbuıɥʇ oʇuı sǝbɐɯI buıʇuıɹdɯIㄥ§", + "machine.gtceu.hv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɹıɐ ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", + "machine.gtceu.hv_laser_engraver.tooltip": "ɹǝsɐꞀ ǝɥʇ ʇɐ ʎןʇɔǝɹıp ʞooן ʇ,uoᗡㄥ§", + "machine.gtceu.hv_lathe.tooltip": "ʎןʇuǝıɔıɟɟǝ ǝɹoɯ spoᴚ sǝɔnpoɹԀㄥ§", + "machine.gtceu.hv_macerator.tooltip": "sʇɔnpoɹdʎᗺ ɥʇıʍ sǝɹO ɹnoʎ buıppǝɹɥSㄥ§", + "machine.gtceu.hv_mass_fabricator.tooltip": "pǝɹɐnbS uoıʇɐɔıɹqɐℲ * ɹǝʇʇɐW W∩∩ㄥ§", + "machine.gtceu.hv_mixer.tooltip": "¿puǝןᗺ ʇı ןןıMㄥ§", + "machine.gtceu.hv_ore_washer.tooltip": "sǝɹO ɹnoʎ ɯoɹɟ sʇɔnpoɹdʎᗺ ǝɹoɯ buıʇʇǝ⅁ㄥ§", + "machine.gtceu.hv_packer.tooltip": "sǝxoᗺ ɟo ʇno sbuıɥʇ sqɐɹ⅁ puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", + "machine.gtceu.hv_polarizer.tooltip": "sʇǝubɐW ɹnoʎ buısıɹɐןodıᗺㄥ§", + "machine.gtceu.hv_replicator.tooltip": "sʇuǝɯǝןƎ ɟo ʇsǝɹnԀ ǝɥʇ buıɔnpoɹԀㄥ§", + "machine.gtceu.hv_rock_crusher.tooltip": "ʇuǝɔɐظpɐ ʎןןɐʇuozıɹoɥ ɐʌɐꞀ puɐ ɹǝʇɐM ǝɔɐןԀㄥ§", + "machine.gtceu.hv_scanner.tooltip": "sbuıɥʇ ɹǝɥʇo puɐ sןɐıɹǝʇɐW suɐɔSㄥ§", + "machine.gtceu.hv_sifter.tooltip": "buıʇɟıs dǝǝʞ puɐ ɯןɐɔ ʎɐʇSㄥ§", + "machine.gtceu.hv_thermal_centrifuge.tooltip": "ʎןǝsıɔǝɹd ǝɹoɯ sǝɹO buıʇɐɹɐdǝSㄥ§", + "machine.gtceu.hv_wiremill.tooltip": "ʎןʇuǝıɔıɟɟǝ ǝɹoɯ sǝɹıM sǝɔnpoɹԀㄥ§", + "machine.gtceu.item_collector.gui.collect_range": "sʞɔoןq %sx%s ɟo ɐǝɹɐ uɐ uıɥʇıʍ ʇɔǝןןoƆ", + "machine.gtceu.item_collector.tooltip": "ɟןǝsʇı punoɹɐ sɯǝʇI sʇɔǝןןoƆ", + "machine.gtceu.iv_alloy_smelter.tooltip": "ɹoʇɐɹbǝʇuI ʎoןןⱯㄥ§", + "machine.gtceu.iv_arc_furnace.tooltip": "ɹǝʇɐǝH ǝbɹɐɥɔsıᗡㄥ§", + "machine.gtceu.iv_assembler.tooltip": "ǝןqɐ⟘ buıʇɟɐɹƆ ɐ ⟘ONㄥ§", + "machine.gtceu.iv_autoclave.tooltip": "ɹǝʞooƆ ǝɹnssǝɹԀㄥ§", + "machine.gtceu.iv_bender.tooltip": "ɹǝʇɹoʇsıᗡ ǝdɐɥSㄥ§", + "machine.gtceu.iv_brewery.tooltip": "sʞuıɹᗡ ɹnoʎ buıʍǝɹᗺㄥ§", + "machine.gtceu.iv_canner.tooltip": "ɹoʇɐɹǝdO uɐƆㄥ§", + "machine.gtceu.iv_centrifuge.tooltip": "ǝuoןɔʎƆ ɹɐןnɔǝןoWㄥ§", + "machine.gtceu.iv_chemical_bath.tooltip": "ɹǝʞɐoS ןɐɔıɯǝɥƆㄥ§", + "machine.gtceu.iv_chemical_reactor.tooltip": "ɹǝɯɹoɟɹǝԀ ןɐɔıɯǝɥƆㄥ§", + "machine.gtceu.iv_circuit_assembler.tooltip": "ɹǝɹnʇɔɐɟnuɐW sɔıuoɹʇɔǝןƎㄥ§", + "machine.gtceu.iv_compressor.tooltip": "ɹǝsuǝpuoƆ ʎʇıɹɐןnbuıSㄥ§", + "machine.gtceu.iv_cutter.tooltip": "ɹǝʌɐǝןƆ ɹǝʇʇɐWㄥ§", + "machine.gtceu.iv_distillery.tooltip": "ɹoʇɐɹɐdǝS uoıʇɐsuǝpuoƆㄥ§", + "machine.gtceu.iv_electric_furnace.tooltip": "ɹossǝɔoɹԀ ʇuǝɯǝʇıɔxƎ uoɹʇɔǝןƎㄥ§", + "machine.gtceu.iv_electrolyzer.tooltip": "906ㄣ-Ǝ ɹoʇɐɹbǝʇuısıᗡ ɹɐןnɔǝןoWㄥ§", + "machine.gtceu.iv_electromagnetic_separator.tooltip": "ɹǝzıɹobǝʇɐƆ WƎㄥ§", + "machine.gtceu.iv_extractor.tooltip": "ɹoʇɐuıʇɔɐɹʇxƎ ɯnnɔɐΛㄥ§", + "machine.gtceu.iv_extruder.tooltip": "ɹǝɔɐןdsıᗡ ןɐıɹǝʇɐWㄥ§", + "machine.gtceu.iv_fermenter.tooltip": "ɹǝuǝʇsɐH uoıʇɐʇuǝɯɹǝℲㄥ§", + "machine.gtceu.iv_fluid_heater.tooltip": "ɹǝsnɟuI ʇɐǝHㄥ§", + "machine.gtceu.iv_fluid_solidifier.tooltip": "ǝuıɥɔɐW ǝɔI uɐ ʇoNㄥ§", + "machine.gtceu.iv_forge_hammer.tooltip": "ɹǝbɹoℲ ǝʇɐןԀㄥ§", + "machine.gtceu.iv_forming_press.tooltip": "ɹǝɹǝʎɐꞀ ʇɔǝظqOㄥ§", + "machine.gtceu.iv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ǝɹǝɥdsoɯʇɐ ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", + "machine.gtceu.iv_laser_engraver.tooltip": "MW ㄣ0˙ᄅ ɟo ɹǝʍoԀ ǝɥʇ ɥʇıMㄥ§", + "machine.gtceu.iv_lathe.tooltip": "906ϛ-Ꞁ ɔıʇɐW-O-uɹn⟘ㄥ§", + "machine.gtceu.iv_macerator.tooltip": "Ɩ006 ɔıʇɐW-O-puǝןᗺㄥ§", + "machine.gtceu.iv_mass_fabricator.tooltip": "ʎɹoʇɔɐℲ sısǝuǝ⅁ㄥ§", + "machine.gtceu.iv_mixer.tooltip": "ɹǝzıuɐbɹO ɹǝʇʇɐWㄥ§", + "machine.gtceu.iv_ore_washer.tooltip": "09Ɛ-I ɹǝɥsɐM-ʎɹpunɐꞀ pǝsodɹndǝᴚㄥ§", + "machine.gtceu.iv_packer.tooltip": "ɹoʇɐuıxoᗺㄥ§", + "machine.gtceu.iv_polarizer.tooltip": "ɹǝɔnpuI ɯsıʇǝubɐWㄥ§", + "machine.gtceu.iv_replicator.tooltip": "ɹǝʇsɐԀ ɹǝʇʇɐWㄥ§", + "machine.gtceu.iv_rock_crusher.tooltip": "00ᄅ8-ᴚ ɹǝıɟıpıןoS ɐɯbɐW ɔıuǝboʎɹƆㄥ§", + "machine.gtceu.iv_scanner.tooltip": "ɹoʇɔǝʇǝᗡ ʎןɐɯouⱯㄥ§", + "machine.gtceu.iv_sifter.tooltip": "ƆℲ⟘ ʎq pǝɹosuodSㄥ§", + "machine.gtceu.iv_thermal_centrifuge.tooltip": "0ϛƐ9-⟘ doɥsʇɐǝʍS ǝzɐןᗺㄥ§", + "machine.gtceu.iv_wiremill.tooltip": "ɹoʇɐbuoןƎ ʇobuIㄥ§", + "machine.gtceu.large_chemical_reactor.tooltip": "ɹoʇɔɐǝᴚ xoᗺ ʞɔɐןᗺ", + "machine.gtceu.lp_steam_alloy_smelter.tooltip": "ɹǝʇןǝɯS uoıʇɐuıqɯoƆㄥ§", + "machine.gtceu.lp_steam_compressor.tooltip": "sɯǝʇI buıssǝɹdɯoƆㄥ§", + "machine.gtceu.lp_steam_extractor.tooltip": "ɹǝqqnᴚ ʇsɹıɟ ɹnoʎ buıʇɔɐɹʇxƎㄥ§", + "machine.gtceu.lp_steam_forge_hammer.tooltip": "ɹǝɯɯɐH ǝbɹoℲㄥ§", + "machine.gtceu.lp_steam_furnace.tooltip": "ɯɐǝʇS pǝssǝɹdɯoɔ ɥʇıʍ sbuıɥʇ buıʇןǝɯSㄥ§", + "machine.gtceu.lp_steam_liquid_boiler.tooltip": "spınbıꞀ ɟɟo buıuunɹ ɹǝןıoᗺ Ɐㄥ§", + "machine.gtceu.lp_steam_macerator.tooltip": "sǝɹO ɹnoʎ buıʇɐɹǝɔɐWㄥ§", + "machine.gtceu.lp_steam_miner.tooltip": "¡ɹǝuıW ǝɥʇ ʍoןǝq sǝɹo sǝuıWㄥ§", + "machine.gtceu.lp_steam_rock_crusher.tooltip": "ʇuǝɔɐظpɐ ʎןןɐʇuozıɹoɥ ɐʌɐꞀ puɐ ɹǝʇɐM ǝɔɐןԀㄥ§", + "machine.gtceu.lp_steam_solar_boiler.tooltip": "unS ʎq ɹǝʍoԀ ɯɐǝʇSㄥ§", + "machine.gtceu.lp_steam_solid_boiler.tooltip": "ɹǝʍoԀ ɯɐǝʇS ʇǝb oʇ ʎɐʍ ʎןɹɐǝ uⱯㄥ§", + "machine.gtceu.luv_alloy_smelter.tooltip": "ɹoʇɐɹbǝʇuI ʎoןןⱯㄥ§", + "machine.gtceu.luv_arc_furnace.tooltip": "ɹǝʇɐǝH ǝbɹɐɥɔsıᗡㄥ§", + "machine.gtceu.luv_assembler.tooltip": "ǝןqɐ⟘ buıʇɟɐɹƆ ɐ ⟘ONㄥ§", + "machine.gtceu.luv_autoclave.tooltip": "ɹǝʞooƆ ǝɹnssǝɹԀㄥ§", + "machine.gtceu.luv_bender.tooltip": "ɹǝʇɹoʇsıᗡ ǝdɐɥSㄥ§", + "machine.gtceu.luv_brewery.tooltip": "sʞuıɹᗡ ɹnoʎ buıʍǝɹᗺㄥ§", + "machine.gtceu.luv_canner.tooltip": "ɹoʇɐɹǝdO uɐƆㄥ§", + "machine.gtceu.luv_centrifuge.tooltip": "ǝuoןɔʎƆ ɹɐןnɔǝןoWㄥ§", + "machine.gtceu.luv_chemical_bath.tooltip": "ɹǝʞɐoS ןɐɔıɯǝɥƆㄥ§", + "machine.gtceu.luv_chemical_reactor.tooltip": "ɹǝɯɹoɟɹǝԀ ןɐɔıɯǝɥƆㄥ§", + "machine.gtceu.luv_circuit_assembler.tooltip": "ɹǝɹnʇɔɐɟnuɐW sɔıuoɹʇɔǝןƎㄥ§", + "machine.gtceu.luv_compressor.tooltip": "ɹǝsuǝpuoƆ ʎʇıɹɐןnbuıSㄥ§", + "machine.gtceu.luv_cutter.tooltip": "ɹǝʌɐǝןƆ ɹǝʇʇɐWㄥ§", + "machine.gtceu.luv_distillery.tooltip": "ɹoʇɐɹɐdǝS uoıʇɐsuǝpuoƆㄥ§", + "machine.gtceu.luv_electric_furnace.tooltip": "ɹossǝɔoɹԀ ʇuǝɯǝʇıɔxƎ uoɹʇɔǝןƎㄥ§", + "machine.gtceu.luv_electrolyzer.tooltip": "ㄥ06ㄣ-Ǝ ɹoʇɐɹbǝʇuısıᗡ ɹɐןnɔǝןoWㄥ§", + "machine.gtceu.luv_electromagnetic_separator.tooltip": "ɹǝzıɹobǝʇɐƆ WƎㄥ§", + "machine.gtceu.luv_extractor.tooltip": "ɹoʇɐuıʇɔɐɹʇxƎ ɯnnɔɐΛㄥ§", + "machine.gtceu.luv_extruder.tooltip": "ɹǝɔɐןdsıᗡ ןɐıɹǝʇɐWㄥ§", + "machine.gtceu.luv_fermenter.tooltip": "ɹǝuǝʇsɐH uoıʇɐʇuǝɯɹǝℲㄥ§", + "machine.gtceu.luv_fluid_heater.tooltip": "ɹǝsnɟuI ʇɐǝHㄥ§", + "machine.gtceu.luv_fluid_solidifier.tooltip": "ǝuıɥɔɐW ǝɔI uɐ ʇoNㄥ§", + "machine.gtceu.luv_forge_hammer.tooltip": "ɹǝbɹoℲ ǝʇɐןԀㄥ§", + "machine.gtceu.luv_forming_press.tooltip": "ɹǝɹǝʎɐꞀ ʇɔǝظqOㄥ§", + "machine.gtceu.luv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ǝɹǝɥdsoɯʇɐ ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", + "machine.gtceu.luv_laser_engraver.tooltip": "MW 9Ɩ˙8 ɟo ɹǝʍoԀ ǝɥʇ ɥʇıMㄥ§", + "machine.gtceu.luv_lathe.tooltip": "ㄥ06ϛ-Ꞁ ɔıʇɐW-O-uɹn⟘ㄥ§", + "machine.gtceu.luv_macerator.tooltip": "ᄅ006 ɔıʇɐW-O-puǝןᗺㄥ§", + "machine.gtceu.luv_mass_fabricator.tooltip": "ʎɹoʇɔɐℲ sısǝuǝ⅁ㄥ§", + "machine.gtceu.luv_mixer.tooltip": "ɹǝzıuɐbɹO ɹǝʇʇɐWㄥ§", + "machine.gtceu.luv_ore_washer.tooltip": "Ɩ9Ɛ-I ɹǝɥsɐM-ʎɹpunɐꞀ pǝsodɹndǝᴚㄥ§", + "machine.gtceu.luv_packer.tooltip": "ɹoʇɐuıxoᗺㄥ§", + "machine.gtceu.luv_polarizer.tooltip": "ɹǝɔnpuI ɯsıʇǝubɐWㄥ§", + "machine.gtceu.luv_replicator.tooltip": "ɹǝʇsɐԀ ɹǝʇʇɐWㄥ§", + "machine.gtceu.luv_rock_crusher.tooltip": "00ᄅ6-ᴚ ɹǝıɟıpıןoS ɐɯbɐW ɔıuǝboʎɹƆㄥ§", + "machine.gtceu.luv_scanner.tooltip": "ɹoʇɔǝʇǝᗡ ʎןɐɯouⱯㄥ§", + "machine.gtceu.luv_sifter.tooltip": "ƆℲ⟘ ʎq pǝɹosuodSㄥ§", + "machine.gtceu.luv_thermal_centrifuge.tooltip": "ƖϛƐ9-⟘ doɥsʇɐǝʍS ǝzɐןᗺㄥ§", + "machine.gtceu.luv_wiremill.tooltip": "ɹoʇɐbuoןƎ ʇobuIㄥ§", + "machine.gtceu.lv_alloy_smelter.tooltip": "ɹǝʇןǝɯS uoıʇɐuıqɯoɔ ɥɔǝ⟘ɥbıHㄥ§", + "machine.gtceu.lv_arc_furnace.tooltip": "¿ǝɔɐuɹnℲ ʇsɐןᗺ ɐ spǝǝu oɥMㄥ§", + "machine.gtceu.lv_assembler.tooltip": "¡ǝןqɯǝssⱯ 'sɹǝbuǝʌⱯㄥ§", + "machine.gtceu.lv_autoclave.tooltip": "sʇsnᗡ ɹnoʎ buızıןןɐʇsʎɹƆㄥ§", + "machine.gtceu.lv_bender.tooltip": "¡¡¡ᴚƎᗡNƎᗺ ʇuɐʍ ǝM ¡pɐq s,ǝɥ 'ooᗺㄥ§", + "machine.gtceu.lv_brewery.tooltip": "buıʍǝɹq uoıʇod ʇuǝıɔıɟɟǝ puɐ ʇɔɐdɯoƆㄥ§", + "machine.gtceu.lv_canner.tooltip": "sɹǝuıɐʇuoƆ ɟo ʇno puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", + "machine.gtceu.lv_centrifuge.tooltip": "sǝןnɔǝןoW buıʇɐɹɐdǝSㄥ§", + "machine.gtceu.lv_chemical_bath.tooltip": "ɯǝɥʇ ǝʇɐɹɐdǝs oʇ sןɐɔıɯǝɥƆ uı sǝɹO buıɥʇɐᗺㄥ§", + "machine.gtceu.lv_chemical_reactor.tooltip": "ɹǝɥʇo ɥɔɐǝ ɥʇıʍ ʇɔɐǝɹ sןɐɔıɯǝɥƆ buıʇʇǝꞀㄥ§", + "machine.gtceu.lv_circuit_assembler.tooltip": "ǝɔɐןd ǝɥʇ ɹǝʌo ןןɐ ǝɔɐןԀ-u-ʞɔıԀㄥ§", + "machine.gtceu.lv_compressor.tooltip": "ㄥㄥƆ ɔıʇɐW-O-ssǝɹdɯoƆㄥ§", + "machine.gtceu.lv_cutter.tooltip": "ǝɔıᗡ N,ǝɔıןSㄥ§", + "machine.gtceu.lv_distillery.tooltip": "spınןℲ ɟo sʇɹɐԀ ʇuɐʌǝןǝɹ ʇsoɯ buıʇɔɐɹʇxƎㄥ§", + "machine.gtceu.lv_electric_furnace.tooltip": "ㄣ9 ǝɹopoɯɯoƆ ɐ buısn ǝʞıן ʇoNㄥ§", + "machine.gtceu.lv_electrolyzer.tooltip": "sǝןnɔǝןoW buızʎןoɹʇɔǝןƎㄥ§", + "machine.gtceu.lv_electromagnetic_separator.tooltip": "ʇsǝɹ ǝɥʇ ɯoɹɟ sǝɹO ɔıʇǝubɐɯ ǝɥʇ buıʇɐɹɐdǝSㄥ§", + "machine.gtceu.lv_extractor.tooltip": "ƐᄅƖᗡ - ɯooᗡ ɟo ǝɔıʌǝᗡ-ɹǝɔınظǝᗡㄥ§", + "machine.gtceu.lv_extruder.tooltip": "buıʞɹoM ןɐʇǝW ɹoɟ ǝuıɥɔɐW ןɐsɹǝʌıu∩ㄥ§", + "machine.gtceu.lv_fermenter.tooltip": "spınןℲ buıʇuǝɯɹǝℲㄥ§", + "machine.gtceu.lv_fluid_heater.tooltip": "spınןℲ ɹnoʎ dn buıʇɐǝHㄥ§", + "machine.gtceu.lv_fluid_solidifier.tooltip": "spıןoS ɯɹoɟ oʇ uʍop spınןℲ sןooƆㄥ§", + "machine.gtceu.lv_forge_hammer.tooltip": "¡ǝɯıʇɹǝɯɯɐH 'doʇSㄥ§", + "machine.gtceu.lv_forming_press.tooltip": "sbuıɥʇ oʇuı sǝbɐɯI buıʇuıɹdɯIㄥ§", + "machine.gtceu.lv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɹıɐ ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", + "machine.gtceu.lv_laser_engraver.tooltip": "ɹǝsɐꞀ ǝɥʇ ʇɐ ʎןʇɔǝɹıp ʞooן ʇ,uoᗡㄥ§", + "machine.gtceu.lv_lathe.tooltip": "ʎןʇuǝıɔıɟɟǝ ǝɹoɯ spoᴚ sǝɔnpoɹԀㄥ§", + "machine.gtceu.lv_macerator.tooltip": "sʇɔnpoɹdʎᗺ ʇnoɥʇıʍ sǝɹO ɹnoʎ buıppǝɹɥSㄥ§", + "machine.gtceu.lv_mass_fabricator.tooltip": "pǝɹɐnbS uoıʇɐɔıɹqɐℲ * ɹǝʇʇɐW W∩∩ㄥ§", + "machine.gtceu.lv_mixer.tooltip": "¿puǝןᗺ ʇı ןןıMㄥ§", + "machine.gtceu.lv_ore_washer.tooltip": "sǝɹO ɹnoʎ ɯoɹɟ sʇɔnpoɹdʎᗺ ǝɹoɯ buıʇʇǝ⅁ㄥ§", + "machine.gtceu.lv_packer.tooltip": "sǝxoᗺ ɟo ʇno sbuıɥʇ sqɐɹ⅁ puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", + "machine.gtceu.lv_polarizer.tooltip": "sʇǝubɐW ɹnoʎ buısıɹɐןodıᗺㄥ§", + "machine.gtceu.lv_replicator.tooltip": "sʇuǝɯǝןƎ ɟo ʇsǝɹnԀ ǝɥʇ buıɔnpoɹԀㄥ§", + "machine.gtceu.lv_rock_crusher.tooltip": "ʇuǝɔɐظpɐ ʎןןɐʇuozıɹoɥ ɐʌɐꞀ puɐ ɹǝʇɐM ǝɔɐןԀㄥ§", + "machine.gtceu.lv_scanner.tooltip": "sbuıɥʇ ɹǝɥʇo puɐ sןɐıɹǝʇɐW suɐɔSㄥ§", + "machine.gtceu.lv_sifter.tooltip": "buıʇɟıs dǝǝʞ puɐ ɯןɐɔ ʎɐʇSㄥ§", + "machine.gtceu.lv_thermal_centrifuge.tooltip": "ʎןǝsıɔǝɹd ǝɹoɯ sǝɹO buıʇɐɹɐdǝSㄥ§", + "machine.gtceu.lv_wiremill.tooltip": "ʎןʇuǝıɔıɟɟǝ ǝɹoɯ sǝɹıM sǝɔnpoɹԀㄥ§", + "machine.gtceu.max_alloy_smelter.tooltip": "ɹoʇɐɯɐbןɐɯⱯ ןɐʇǝWㄥ§", + "machine.gtceu.max_arc_furnace.tooltip": "ɹǝʇɐǝH ʇınɔɹıƆ ʇɹoɥSㄥ§", + "machine.gtceu.max_assembler.tooltip": "ɹoʇɔnɹʇsuoƆ ʎןqɯǝssⱯㄥ§", + "machine.gtceu.max_autoclave.tooltip": "ʇıu∩ ǝɔuɐɹqɯnɔuƎㄥ§", + "machine.gtceu.max_bender.tooltip": "ɹǝɯɹoɟǝᗡ ɹǝʇʇɐWㄥ§", + "machine.gtceu.max_brewery.tooltip": "ɹǝɥsnᴚ ʍǝɹᗺㄥ§", + "machine.gtceu.max_canner.tooltip": "ɹoʇɐnʇɔⱯ uɐƆㄥ§", + "machine.gtceu.max_chemical_bath.tooltip": "uoɹʇʞunᗡ ןɐɔıɯǝɥƆㄥ§", + "machine.gtceu.max_chemical_reactor.tooltip": "ɹǝzʎןɐʇɐƆ uoıʇɔɐǝᴚㄥ§", + "machine.gtceu.max_circuit_assembler.tooltip": "ʎɹoʇɔɐℲ uoıʇɐʇndɯoƆㄥ§", + "machine.gtceu.max_compressor.tooltip": "ɹoʇɔıɹʇsuoƆ ɹǝʇʇɐWㄥ§", + "machine.gtceu.max_cutter.tooltip": "ɹǝpıʌıᗡ ʇɔǝظqOㄥ§", + "machine.gtceu.max_distillery.tooltip": "ɹǝʇʇıןdS uoıʇɔɐɹℲㄥ§", + "machine.gtceu.max_electric_furnace.tooltip": "ɹoʇɐןnɯıʇS ɯoʇⱯㄥ§", + "machine.gtceu.max_electromagnetic_separator.tooltip": "ɹǝןןǝdsıᗡ ℲWƎㄥ§", + "machine.gtceu.max_extractor.tooltip": "ɹǝʞɔnS buıʎɟǝnbıꞀㄥ§", + "machine.gtceu.max_extruder.tooltip": "ɹǝʌıɹᗡ ǝdɐɥSㄥ§", + "machine.gtceu.max_fermenter.tooltip": "ɹǝןןoɹʇuoƆ uoıʇɐɹıdsǝᴚㄥ§", + "machine.gtceu.max_fluid_heater.tooltip": "ɹǝnqɯI ןɐɯɹǝɥ⟘ㄥ§", + "machine.gtceu.max_fluid_solidifier.tooltip": "ɹoʇɐɔıɟıɹʇǝԀ pınןℲㄥ§", + "machine.gtceu.max_forge_hammer.tooltip": "ɹoʇɐןnpoW ʇɔɐdɯIㄥ§", + "machine.gtceu.max_forming_press.tooltip": "ɹǝʇɟıɥS ǝɔɐɟɹnSㄥ§", + "machine.gtceu.max_mass_fabricator.tooltip": "ɹoʇɐıʇıuI ǝɔuǝʇsıxƎㄥ§", + "machine.gtceu.max_mixer.tooltip": "ɹǝzıuǝboɯoH ןɐıɹǝʇɐWㄥ§", + "machine.gtceu.max_packer.tooltip": "ǝsnoɥǝɹɐM uozɐɯⱯㄥ§", + "machine.gtceu.max_polarizer.tooltip": "ɹǝbuɐɹɹɐǝᴚ pןǝıℲ ɔıʇǝubɐWㄥ§", + "machine.gtceu.max_replicator.tooltip": "ɹǝsodɯoƆ ןɐʇuǝɯǝןƎㄥ§", + "machine.gtceu.max_scanner.tooltip": "ǝdoɔsoɹɔıW uoɹʇɔǝןƎㄥ§", + "machine.gtceu.max_sifter.tooltip": "ɹǝʇןıℲ uoıʇɐsןnԀㄥ§", + "machine.gtceu.max_wiremill.tooltip": "ɹoʇɐɹnbıɟsuɐɹ⟘ ǝɹıMㄥ§", + "machine.gtceu.miner.per_block": "ʞɔoןᗺ ɹǝdㄥ§ %dsɟ§ sǝʞɐʇㄥ§", + "machine.gtceu.miner.tooltip": "ɐǝɹɐㄥ§ %sx%sɟ§ sɐ sʇɹɐʇS ¡ɹǝuıW ǝɥʇ ʍoןǝq sǝɹo sǝuıWㄥ§", + "machine.gtceu.muffle.off": "pǝןqɐsıᗡ :buıןɟɟnW punoS", + "machine.gtceu.muffle.on": "pǝןqɐuƎ :buıןɟɟnW punoS", + "machine.gtceu.multi_smelter.tooltip": "ǝɯoH ʇɐ uǝʌO ǝɥʇ ǝʞıן ʇsnſ", + "machine.gtceu.mv_alloy_smelter.tooltip": "ɹǝʇןǝɯS uoıʇɐuıqɯoɔ ɥɔǝ⟘ɥbıHㄥ§", + "machine.gtceu.mv_arc_furnace.tooltip": "¿ǝɔɐuɹnℲ ʇsɐןᗺ ɐ spǝǝu oɥMㄥ§", + "machine.gtceu.mv_assembler.tooltip": "¡ǝןqɯǝssⱯ 'sɹǝbuǝʌⱯㄥ§", + "machine.gtceu.mv_autoclave.tooltip": "sʇsnᗡ ɹnoʎ buızıןןɐʇsʎɹƆㄥ§", + "machine.gtceu.mv_bender.tooltip": "¡¡¡ᴚƎᗡNƎᗺ ʇuɐʍ ǝM ¡pɐq s,ǝɥ 'ooᗺㄥ§", + "machine.gtceu.mv_brewery.tooltip": "buıʍǝɹq uoıʇod ʇuǝıɔıɟɟǝ puɐ ʇɔɐdɯoƆㄥ§", + "machine.gtceu.mv_canner.tooltip": "sɹǝuıɐʇuoƆ ɟo ʇno puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", + "machine.gtceu.mv_centrifuge.tooltip": "sǝןnɔǝןoW buıʇɐɹɐdǝSㄥ§", + "machine.gtceu.mv_chemical_bath.tooltip": "ɯǝɥʇ ǝʇɐɹɐdǝs oʇ sןɐɔıɯǝɥƆ uı sǝɹO buıɥʇɐᗺㄥ§", + "machine.gtceu.mv_chemical_reactor.tooltip": "ɹǝɥʇo ɥɔɐǝ ɥʇıʍ ʇɔɐǝɹ sןɐɔıɯǝɥƆ buıʇʇǝꞀㄥ§", + "machine.gtceu.mv_circuit_assembler.tooltip": "ǝɔɐןd ǝɥʇ ɹǝʌo ןןɐ ǝɔɐןԀ-u-ʞɔıԀㄥ§", + "machine.gtceu.mv_compressor.tooltip": "ㄥㄥƆ ɔıʇɐW-O-ssǝɹdɯoƆㄥ§", + "machine.gtceu.mv_cutter.tooltip": "ǝɔıᗡ N,ǝɔıןSㄥ§", + "machine.gtceu.mv_distillery.tooltip": "spınןℲ ɟo sʇɹɐԀ ʇuɐʌǝןǝɹ ʇsoɯ buıʇɔɐɹʇxƎㄥ§", + "machine.gtceu.mv_electric_furnace.tooltip": "ㄣ9 ǝɹopoɯɯoƆ ɐ buısn ǝʞıן ʇoNㄥ§", + "machine.gtceu.mv_electrolyzer.tooltip": "sǝןnɔǝןoW buızʎןoɹʇɔǝןƎㄥ§", + "machine.gtceu.mv_electromagnetic_separator.tooltip": "ʇsǝɹ ǝɥʇ ɯoɹɟ sǝɹO ɔıʇǝubɐɯ ǝɥʇ buıʇɐɹɐdǝSㄥ§", + "machine.gtceu.mv_extractor.tooltip": "ƐᄅƖᗡ - ɯooᗡ ɟo ǝɔıʌǝᗡ-ɹǝɔınظǝᗡㄥ§", + "machine.gtceu.mv_extruder.tooltip": "buıʞɹoM ןɐʇǝW ɹoɟ ǝuıɥɔɐW ןɐsɹǝʌıu∩ㄥ§", + "machine.gtceu.mv_fermenter.tooltip": "spınןℲ buıʇuǝɯɹǝℲㄥ§", + "machine.gtceu.mv_fluid_heater.tooltip": "spınןℲ ɹnoʎ dn buıʇɐǝHㄥ§", + "machine.gtceu.mv_fluid_solidifier.tooltip": "spıןoS ɯɹoɟ oʇ uʍop spınןℲ sןooƆㄥ§", + "machine.gtceu.mv_forge_hammer.tooltip": "¡ǝɯıʇɹǝɯɯɐH 'doʇSㄥ§", + "machine.gtceu.mv_forming_press.tooltip": "sbuıɥʇ oʇuı sǝbɐɯI buıʇuıɹdɯIㄥ§", + "machine.gtceu.mv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɹıɐ ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", + "machine.gtceu.mv_laser_engraver.tooltip": "ɹǝsɐꞀ ǝɥʇ ʇɐ ʎןʇɔǝɹıp ʞooן ʇ,uoᗡㄥ§", + "machine.gtceu.mv_lathe.tooltip": "ʎןʇuǝıɔıɟɟǝ ǝɹoɯ spoᴚ sǝɔnpoɹԀㄥ§", + "machine.gtceu.mv_macerator.tooltip": "sʇɔnpoɹdʎᗺ ʇnoɥʇıʍ sǝɹO ɹnoʎ buıppǝɹɥSㄥ§", + "machine.gtceu.mv_mass_fabricator.tooltip": "pǝɹɐnbS uoıʇɐɔıɹqɐℲ * ɹǝʇʇɐW W∩∩ㄥ§", + "machine.gtceu.mv_mixer.tooltip": "¿puǝןᗺ ʇı ןןıMㄥ§", + "machine.gtceu.mv_ore_washer.tooltip": "sǝɹO ɹnoʎ ɯoɹɟ sʇɔnpoɹdʎᗺ ǝɹoɯ buıʇʇǝ⅁ㄥ§", + "machine.gtceu.mv_packer.tooltip": "sǝxoᗺ ɟo ʇno sbuıɥʇ sqɐɹ⅁ puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", + "machine.gtceu.mv_polarizer.tooltip": "sʇǝubɐW ɹnoʎ buısıɹɐןodıᗺㄥ§", + "machine.gtceu.mv_replicator.tooltip": "sʇuǝɯǝןƎ ɟo ʇsǝɹnԀ ǝɥʇ buıɔnpoɹԀㄥ§", + "machine.gtceu.mv_rock_crusher.tooltip": "ʇuǝɔɐظpɐ ʎןןɐʇuozıɹoɥ ɐʌɐꞀ puɐ ɹǝʇɐM ǝɔɐןԀㄥ§", + "machine.gtceu.mv_scanner.tooltip": "sbuıɥʇ ɹǝɥʇo puɐ sןɐıɹǝʇɐW suɐɔSㄥ§", + "machine.gtceu.mv_sifter.tooltip": "buıʇɟıs dǝǝʞ puɐ ɯןɐɔ ʎɐʇSㄥ§", + "machine.gtceu.mv_thermal_centrifuge.tooltip": "ʎןǝsıɔǝɹd ǝɹoɯ sǝɹO buıʇɐɹɐdǝSㄥ§", + "machine.gtceu.mv_wiremill.tooltip": "ʎןʇuǝıɔıɟɟǝ ǝɹoɯ sǝɹıM sǝɔnpoɹԀㄥ§", + "machine.gtceu.opv_alloy_smelter.tooltip": "ɹoʇɐɯɐbןɐɯⱯ ןɐʇǝWㄥ§", + "machine.gtceu.opv_arc_furnace.tooltip": "ɹǝʇɐǝH ʇınɔɹıƆ ʇɹoɥSㄥ§", + "machine.gtceu.opv_assembler.tooltip": "ɹoʇɔnɹʇsuoƆ ʎןqɯǝssⱯㄥ§", + "machine.gtceu.opv_autoclave.tooltip": "ʇıu∩ ǝɔuɐɹqɯnɔuƎㄥ§", + "machine.gtceu.opv_bender.tooltip": "ɹǝɯɹoɟǝᗡ ɹǝʇʇɐWㄥ§", + "machine.gtceu.opv_brewery.tooltip": "ɹǝɥsnᴚ ʍǝɹᗺㄥ§", + "machine.gtceu.opv_canner.tooltip": "ɹoʇɐnʇɔⱯ uɐƆㄥ§", + "machine.gtceu.opv_centrifuge.tooltip": "opɐuɹo⟘ ɹɐןnɔǝןoWㄥ§", + "machine.gtceu.opv_chemical_bath.tooltip": "uoɹʇʞunᗡ ןɐɔıɯǝɥƆㄥ§", + "machine.gtceu.opv_chemical_reactor.tooltip": "ɹǝzʎןɐʇɐƆ uoıʇɔɐǝᴚㄥ§", + "machine.gtceu.opv_circuit_assembler.tooltip": "ʎɹoʇɔɐℲ uoıʇɐʇndɯoƆㄥ§", + "machine.gtceu.opv_compressor.tooltip": "ɹoʇɔıɹʇsuoƆ ɹǝʇʇɐWㄥ§", + "machine.gtceu.opv_cutter.tooltip": "ɹǝpıʌıᗡ ʇɔǝظqOㄥ§", + "machine.gtceu.opv_distillery.tooltip": "ɹǝʇʇıןdS uoıʇɔɐɹℲㄥ§", + "machine.gtceu.opv_electric_furnace.tooltip": "ɹoʇɐןnɯıʇS ɯoʇⱯㄥ§", + "machine.gtceu.opv_electrolyzer.tooltip": "ɹǝzıuoI ɔıɯoʇⱯㄥ§", + "machine.gtceu.opv_electromagnetic_separator.tooltip": "ɹǝןןǝdsıᗡ ℲWƎㄥ§", + "machine.gtceu.opv_extractor.tooltip": "ɹǝʞɔnS buıʎɟǝnbıꞀㄥ§", + "machine.gtceu.opv_extruder.tooltip": "ɹǝʌıɹᗡ ǝdɐɥSㄥ§", + "machine.gtceu.opv_fermenter.tooltip": "ɹǝןןoɹʇuoƆ uoıʇɐɹıdsǝᴚㄥ§", + "machine.gtceu.opv_fluid_heater.tooltip": "ɹǝnqɯI ןɐɯɹǝɥ⟘ㄥ§", + "machine.gtceu.opv_fluid_solidifier.tooltip": "ɹoʇɐɔıɟıɹʇǝԀ pınןℲㄥ§", + "machine.gtceu.opv_forge_hammer.tooltip": "ɹoʇɐןnpoW ʇɔɐdɯIㄥ§", + "machine.gtceu.opv_forming_press.tooltip": "ɹǝʇɟıɥS ǝɔɐɟɹnSㄥ§", + "machine.gtceu.opv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ǝsɹǝʌıun ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", + "machine.gtceu.opv_laser_engraver.tooltip": "uouuɐƆ uoʇoɥԀ ʇɔɐxƎㄥ§", + "machine.gtceu.opv_lathe.tooltip": "ɹǝpuıɹ⅁ uoıʇɐʇoᴚㄥ§", + "machine.gtceu.opv_macerator.tooltip": "ɹoʇɐuıɯıןƎ ǝdɐɥSㄥ§", + "machine.gtceu.opv_mass_fabricator.tooltip": "ɹoʇɐıʇıuI ǝɔuǝʇsıxƎㄥ§", + "machine.gtceu.opv_mixer.tooltip": "ɹǝzıuǝboɯoH ןɐıɹǝʇɐWㄥ§", + "machine.gtceu.opv_ore_washer.tooltip": "ɥsɐM ɹɐƆ ǝɹnʇɐıuıWㄥ§", + "machine.gtceu.opv_packer.tooltip": "ǝsnoɥǝɹɐM uozɐɯⱯㄥ§", + "machine.gtceu.opv_polarizer.tooltip": "ɹǝbuɐɹɹɐǝᴚ pןǝıℲ ɔıʇǝubɐWㄥ§", + "machine.gtceu.opv_replicator.tooltip": "ɹǝsodɯoƆ ןɐʇuǝɯǝןƎㄥ§", + "machine.gtceu.opv_rock_crusher.tooltip": "ɹǝqɯɐɥƆ uoıʇɐɯɹoℲ ɔıuɐɔןoΛㄥ§", + "machine.gtceu.opv_scanner.tooltip": "ǝdoɔsoɹɔıW uoɹʇɔǝןƎㄥ§", + "machine.gtceu.opv_sifter.tooltip": "ɹǝʇןıℲ uoıʇɐsןnԀㄥ§", + "machine.gtceu.opv_thermal_centrifuge.tooltip": "ǝuoןɔʎƆ ǝɹıℲㄥ§", + "machine.gtceu.opv_wiremill.tooltip": "ɹoʇɐɹnbıɟsuɐɹ⟘ ǝɹıMㄥ§", + "machine.gtceu.perfect_oc": "˙pǝʞɔoןɔɹǝʌo uǝɥʍ ʎɔuǝıɔıɟɟǝ ʎbɹǝuǝ ǝsoן ʇou sǝoᗡ", + "machine.gtceu.primitive_blast_furnace.tooltip": "ןǝǝʇS ʇsɹıɟ ɹnoʎ buıʞɐW", + "machine.gtceu.primitive_pump.tooltip": "ǝɯoH ʇɐ ɹıoʌɹǝpuƎ", + "machine.gtceu.pump.tooltip": "¡suɐǝɔO ʎʇdɯǝ oʇ ʎɐʍ ʇsǝq ǝɥ⟘ㄥ§", + "machine.gtceu.pump.tooltip_buckets": "ʇǝʞɔnᗺ ɹǝd sʞɔıʇㄥ§ %dɟ§", + "machine.gtceu.quantum_chest.items_stored": ":ʇunoɯⱯ ɯǝʇI", + "machine.gtceu.quantum_chest.tooltip": "sɹǝʍɐɹᗡ ǝbɐɹoʇS uɐɥʇ ɹǝʇʇǝᗺㄥ§", + "machine.gtceu.quantum_tank.tooltip": "spınןɟ ɹnoʎ ןןɐ ǝɹoʇs oʇ ǝɔɐןd ʇɔɐdɯoƆㄥ§", + "machine.gtceu.steam.steam_hatch.tooltip": "ɯɐǝʇSɟ§ :pınןℲ pǝʇdǝɔɔⱯǝ§", + "machine.gtceu.steam_bus.tooltip": "sʞɔoןqıʇןnɯ ɯɐǝʇs-uou ɥʇıʍ ʞɹoʍ ʇou sǝoᗡ", + "machine.gtceu.steam_grinder.tooltip": "sʇɔnpoɹdʎᗺ ǝɥʇ ʇnoɥʇıʍ ɹoʇɐɹǝɔɐW ʞɔoןqıʇןnɯ Ɐ", + "machine.gtceu.steam_oven.tooltip": "ɹǝʇןǝɯS-ıʇןnW ɥʇıʍ pǝsnɟuoɔ ǝq oʇ ʇoN", + "machine.gtceu.steel_large_boiler.tooltip": "ɹoʇɐɹǝuıɔuI ןɐoɔɹɐɥƆ", + "machine.gtceu.titanium_large_boiler.tooltip": "¿ןǝnℲ ɹǝdnS ɔıbɐW ǝɥʇ s,ǝɹǝɥM", + "machine.gtceu.transformer.description": "sɹǝıʇ ǝbɐʇןoʌ uǝǝʍʇǝq ʎbɹǝuƎ sɯɹoɟsuɐɹ⟘ㄥ§", + "machine.gtceu.transformer.message_transform_down": "Ɐ%d ∩Ǝ %s :ʇnO 'Ɐ%d ∩Ǝ %s :uI 'uʍoᗡ buıɯɹoɟsuɐɹ⟘", + "machine.gtceu.transformer.message_transform_up": "Ɐ%d ∩Ǝ %s :ʇnO 'Ɐ%d ∩Ǝ %s :uI 'd∩ buıɯɹoɟsuɐɹ⟘", + "machine.gtceu.transformer.tooltip_tool_usage": "ǝbuɐɥɔ oʇ ɹǝʌıɹpʍǝɹɔS ǝsn 'ㄥ§uʍoᗡ ɯɹoɟsuɐɹ⟘ɟ§ sɐ sʇɹɐʇSㄥ§", + "machine.gtceu.transformer.tooltip_transform_down": ")ɟ§%s( ∩Ǝ %s Ɐ%d >- )ɟ§%s( ∩Ǝ %s Ɐ%dɟ§ :uʍoᗡ ɯɹoɟsuɐɹ⟘ɐ§", + "machine.gtceu.transformer.tooltip_transform_up": ")ɟ§%s( ∩Ǝ %s Ɐ%d >- )ɟ§%s( ∩Ǝ %s Ɐ%dɟ§ :d∩ ɯɹoɟsuɐɹ⟘ɔ§", + "machine.gtceu.tungstensteel_large_boiler.tooltip": "¿buıɥʇ sıɥʇ ןǝnɟ uǝʌǝ noʎ op ʍoH", + "machine.gtceu.uev_alloy_smelter.tooltip": "ɹoʇɐɯɐbןɐɯⱯ ןɐʇǝWㄥ§", + "machine.gtceu.uev_arc_furnace.tooltip": "ɹǝʇɐǝH ʇınɔɹıƆ ʇɹoɥSㄥ§", + "machine.gtceu.uev_assembler.tooltip": "ɹoʇɔnɹʇsuoƆ ʎןqɯǝssⱯㄥ§", + "machine.gtceu.uev_autoclave.tooltip": "ʇıu∩ ǝɔuɐɹqɯnɔuƎㄥ§", + "machine.gtceu.uev_bender.tooltip": "ɹǝɯɹoɟǝᗡ ɹǝʇʇɐWㄥ§", + "machine.gtceu.uev_brewery.tooltip": "ɹǝɥsnᴚ ʍǝɹᗺㄥ§", + "machine.gtceu.uev_canner.tooltip": "ɹoʇɐnʇɔⱯ uɐƆㄥ§", + "machine.gtceu.uev_centrifuge.tooltip": "opɐuɹo⟘ ɹɐןnɔǝןoWㄥ§", + "machine.gtceu.uev_chemical_bath.tooltip": "uoɹʇʞunᗡ ןɐɔıɯǝɥƆㄥ§", + "machine.gtceu.uev_chemical_reactor.tooltip": "ɹǝzʎןɐʇɐƆ uoıʇɔɐǝᴚㄥ§", + "machine.gtceu.uev_circuit_assembler.tooltip": "ʎɹoʇɔɐℲ uoıʇɐʇndɯoƆㄥ§", + "machine.gtceu.uev_compressor.tooltip": "ɹoʇɔıɹʇsuoƆ ɹǝʇʇɐWㄥ§", + "machine.gtceu.uev_cutter.tooltip": "ɹǝpıʌıᗡ ʇɔǝظqOㄥ§", + "machine.gtceu.uev_distillery.tooltip": "ɹǝʇʇıןdS uoıʇɔɐɹℲㄥ§", + "machine.gtceu.uev_electric_furnace.tooltip": "ɹoʇɐןnɯıʇS ɯoʇⱯㄥ§", + "machine.gtceu.uev_electrolyzer.tooltip": "ɹǝzıuoI ɔıɯoʇⱯㄥ§", + "machine.gtceu.uev_electromagnetic_separator.tooltip": "ɹǝןןǝdsıᗡ ℲWƎㄥ§", + "machine.gtceu.uev_extractor.tooltip": "ɹǝʞɔnS buıʎɟǝnbıꞀㄥ§", + "machine.gtceu.uev_extruder.tooltip": "ɹǝʌıɹᗡ ǝdɐɥSㄥ§", + "machine.gtceu.uev_fermenter.tooltip": "ɹǝןןoɹʇuoƆ uoıʇɐɹıdsǝᴚㄥ§", + "machine.gtceu.uev_fluid_heater.tooltip": "ɹǝnqɯI ןɐɯɹǝɥ⟘ㄥ§", + "machine.gtceu.uev_fluid_solidifier.tooltip": "ɹoʇɐɔıɟıɹʇǝԀ pınןℲㄥ§", + "machine.gtceu.uev_forge_hammer.tooltip": "ɹoʇɐןnpoW ʇɔɐdɯIㄥ§", + "machine.gtceu.uev_forming_press.tooltip": "ɹǝʇɟıɥS ǝɔɐɟɹnSㄥ§", + "machine.gtceu.uev_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɯǝʇsʎs ɹɐןos ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", + "machine.gtceu.uev_laser_engraver.tooltip": "uouuɐƆ uoʇoɥԀ ʇɔɐxƎㄥ§", + "machine.gtceu.uev_lathe.tooltip": "ɹǝpuıɹ⅁ uoıʇɐʇoᴚㄥ§", + "machine.gtceu.uev_macerator.tooltip": "ɹoʇɐuıɯıןƎ ǝdɐɥSㄥ§", + "machine.gtceu.uev_mass_fabricator.tooltip": "ɹoʇɐıʇıuI ǝɔuǝʇsıxƎㄥ§", + "machine.gtceu.uev_mixer.tooltip": "ɹǝzıuǝboɯoH ןɐıɹǝʇɐWㄥ§", + "machine.gtceu.uev_ore_washer.tooltip": "ɥsɐM ɹɐƆ ǝɹnʇɐıuıWㄥ§", + "machine.gtceu.uev_packer.tooltip": "ǝsnoɥǝɹɐM uozɐɯⱯㄥ§", + "machine.gtceu.uev_polarizer.tooltip": "ɹǝbuɐɹɹɐǝᴚ pןǝıℲ ɔıʇǝubɐWㄥ§", + "machine.gtceu.uev_replicator.tooltip": "ɹǝsodɯoƆ ןɐʇuǝɯǝןƎㄥ§", + "machine.gtceu.uev_rock_crusher.tooltip": "ɹǝqɯɐɥƆ uoıʇɐɯɹoℲ ɔıuɐɔןoΛㄥ§", + "machine.gtceu.uev_scanner.tooltip": "ǝdoɔsoɹɔıW uoɹʇɔǝןƎㄥ§", + "machine.gtceu.uev_sifter.tooltip": "ɹǝʇןıℲ uoıʇɐsןnԀㄥ§", + "machine.gtceu.uev_thermal_centrifuge.tooltip": "ǝuoןɔʎƆ ǝɹıℲㄥ§", + "machine.gtceu.uev_wiremill.tooltip": "ɹoʇɐɹnbıɟsuɐɹ⟘ ǝɹıMㄥ§", + "machine.gtceu.uhv_alloy_smelter.tooltip": "ɹoʇɐɯɐbןɐɯⱯ ןɐʇǝWㄥ§", + "machine.gtceu.uhv_arc_furnace.tooltip": "ɹǝʇɐǝH ʇınɔɹıƆ ʇɹoɥSㄥ§", + "machine.gtceu.uhv_assembler.tooltip": "ɹoʇɔnɹʇsuoƆ ʎןqɯǝssⱯㄥ§", + "machine.gtceu.uhv_autoclave.tooltip": "ʇıu∩ ǝɔuɐɹqɯnɔuƎㄥ§", + "machine.gtceu.uhv_bender.tooltip": "ɹǝɯɹoɟǝᗡ ɹǝʇʇɐWㄥ§", + "machine.gtceu.uhv_brewery.tooltip": "ɹǝɥsnᴚ ʍǝɹᗺㄥ§", + "machine.gtceu.uhv_canner.tooltip": "ɹoʇɐnʇɔⱯ uɐƆㄥ§", + "machine.gtceu.uhv_centrifuge.tooltip": "opɐuɹo⟘ ɹɐןnɔǝןoWㄥ§", + "machine.gtceu.uhv_chemical_bath.tooltip": "uoɹʇʞunᗡ ןɐɔıɯǝɥƆㄥ§", + "machine.gtceu.uhv_chemical_reactor.tooltip": "ɹǝzʎןɐʇɐƆ uoıʇɔɐǝᴚㄥ§", + "machine.gtceu.uhv_circuit_assembler.tooltip": "ʎɹoʇɔɐℲ uoıʇɐʇndɯoƆㄥ§", + "machine.gtceu.uhv_compressor.tooltip": "ɹoʇɔıɹʇsuoƆ ɹǝʇʇɐWㄥ§", + "machine.gtceu.uhv_cutter.tooltip": "ɹǝpıʌıᗡ ʇɔǝظqOㄥ§", + "machine.gtceu.uhv_distillery.tooltip": "ɹǝʇʇıןdS uoıʇɔɐɹℲㄥ§", + "machine.gtceu.uhv_electric_furnace.tooltip": "ɹoʇɐןnɯıʇS ɯoʇⱯㄥ§", + "machine.gtceu.uhv_electrolyzer.tooltip": "ɹǝzıuoI ɔıɯoʇⱯㄥ§", + "machine.gtceu.uhv_electromagnetic_separator.tooltip": "ɹǝןןǝdsıᗡ ℲWƎㄥ§", + "machine.gtceu.uhv_extractor.tooltip": "ɹǝʞɔnS buıʎɟǝnbıꞀㄥ§", + "machine.gtceu.uhv_extruder.tooltip": "ɹǝʌıɹᗡ ǝdɐɥSㄥ§", + "machine.gtceu.uhv_fermenter.tooltip": "ɹǝןןoɹʇuoƆ uoıʇɐɹıdsǝᴚㄥ§", + "machine.gtceu.uhv_fluid_heater.tooltip": "ɹǝnqɯI ןɐɯɹǝɥ⟘ㄥ§", + "machine.gtceu.uhv_fluid_solidifier.tooltip": "ɹoʇɐɔıɟıɹʇǝԀ pınןℲㄥ§", + "machine.gtceu.uhv_forge_hammer.tooltip": "ɹoʇɐןnpoW ʇɔɐdɯIㄥ§", + "machine.gtceu.uhv_forming_press.tooltip": "ɹǝʇɟıɥS ǝɔɐɟɹnSㄥ§", + "machine.gtceu.uhv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɯǝʇsʎs ɹɐןos ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", + "machine.gtceu.uhv_laser_engraver.tooltip": "uouuɐƆ uoʇoɥԀ ʇɔɐxƎㄥ§", + "machine.gtceu.uhv_lathe.tooltip": "ɹǝpuıɹ⅁ uoıʇɐʇoᴚㄥ§", + "machine.gtceu.uhv_macerator.tooltip": "ɹoʇɐuıɯıןƎ ǝdɐɥSㄥ§", + "machine.gtceu.uhv_mass_fabricator.tooltip": "ɹoʇɐıʇıuI ǝɔuǝʇsıxƎㄥ§", + "machine.gtceu.uhv_mixer.tooltip": "ɹǝzıuǝboɯoH ןɐıɹǝʇɐWㄥ§", + "machine.gtceu.uhv_ore_washer.tooltip": "ɥsɐM ɹɐƆ ǝɹnʇɐıuıWㄥ§", + "machine.gtceu.uhv_packer.tooltip": "ǝsnoɥǝɹɐM uozɐɯⱯㄥ§", + "machine.gtceu.uhv_polarizer.tooltip": "ɹǝbuɐɹɹɐǝᴚ pןǝıℲ ɔıʇǝubɐWㄥ§", + "machine.gtceu.uhv_replicator.tooltip": "ɹǝsodɯoƆ ןɐʇuǝɯǝןƎㄥ§", + "machine.gtceu.uhv_rock_crusher.tooltip": "ɹǝqɯɐɥƆ uoıʇɐɯɹoℲ ɔıuɐɔןoΛㄥ§", + "machine.gtceu.uhv_scanner.tooltip": "ǝdoɔsoɹɔıW uoɹʇɔǝןƎㄥ§", + "machine.gtceu.uhv_sifter.tooltip": "ɹǝʇןıℲ uoıʇɐsןnԀㄥ§", + "machine.gtceu.uhv_thermal_centrifuge.tooltip": "ǝuoןɔʎƆ ǝɹıℲㄥ§", + "machine.gtceu.uhv_wiremill.tooltip": "ɹoʇɐɹnbıɟsuɐɹ⟘ ǝɹıMㄥ§", + "machine.gtceu.uiv_alloy_smelter.tooltip": "ɹoʇɐɯɐbןɐɯⱯ ןɐʇǝWㄥ§", + "machine.gtceu.uiv_arc_furnace.tooltip": "ɹǝʇɐǝH ʇınɔɹıƆ ʇɹoɥSㄥ§", + "machine.gtceu.uiv_assembler.tooltip": "ɹoʇɔnɹʇsuoƆ ʎןqɯǝssⱯㄥ§", + "machine.gtceu.uiv_autoclave.tooltip": "ʇıu∩ ǝɔuɐɹqɯnɔuƎㄥ§", + "machine.gtceu.uiv_bender.tooltip": "ɹǝɯɹoɟǝᗡ ɹǝʇʇɐWㄥ§", + "machine.gtceu.uiv_brewery.tooltip": "ɹǝɥsnᴚ ʍǝɹᗺㄥ§", + "machine.gtceu.uiv_canner.tooltip": "ɹoʇɐnʇɔⱯ uɐƆㄥ§", + "machine.gtceu.uiv_centrifuge.tooltip": "opɐuɹo⟘ ɹɐןnɔǝןoWㄥ§", + "machine.gtceu.uiv_chemical_bath.tooltip": "uoɹʇʞunᗡ ןɐɔıɯǝɥƆㄥ§", + "machine.gtceu.uiv_chemical_reactor.tooltip": "ɹǝzʎןɐʇɐƆ uoıʇɔɐǝᴚㄥ§", + "machine.gtceu.uiv_circuit_assembler.tooltip": "ʎɹoʇɔɐℲ uoıʇɐʇndɯoƆㄥ§", + "machine.gtceu.uiv_compressor.tooltip": "ɹoʇɔıɹʇsuoƆ ɹǝʇʇɐWㄥ§", + "machine.gtceu.uiv_cutter.tooltip": "ɹǝpıʌıᗡ ʇɔǝظqOㄥ§", + "machine.gtceu.uiv_distillery.tooltip": "ɹǝʇʇıןdS uoıʇɔɐɹℲㄥ§", + "machine.gtceu.uiv_electric_furnace.tooltip": "ɹoʇɐןnɯıʇS ɯoʇⱯㄥ§", + "machine.gtceu.uiv_electrolyzer.tooltip": "ɹǝzıuoI ɔıɯoʇⱯㄥ§", + "machine.gtceu.uiv_electromagnetic_separator.tooltip": "ɹǝןןǝdsıᗡ ℲWƎㄥ§", + "machine.gtceu.uiv_extractor.tooltip": "ɹǝʞɔnS buıʎɟǝnbıꞀㄥ§", + "machine.gtceu.uiv_extruder.tooltip": "ɹǝʌıɹᗡ ǝdɐɥSㄥ§", + "machine.gtceu.uiv_fermenter.tooltip": "ɹǝןןoɹʇuoƆ uoıʇɐɹıdsǝᴚㄥ§", + "machine.gtceu.uiv_fluid_heater.tooltip": "ɹǝnqɯI ןɐɯɹǝɥ⟘ㄥ§", + "machine.gtceu.uiv_fluid_solidifier.tooltip": "ɹoʇɐɔıɟıɹʇǝԀ pınןℲㄥ§", + "machine.gtceu.uiv_forge_hammer.tooltip": "ɹoʇɐןnpoW ʇɔɐdɯIㄥ§", + "machine.gtceu.uiv_forming_press.tooltip": "ɹǝʇɟıɥS ǝɔɐɟɹnSㄥ§", + "machine.gtceu.uiv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɯǝʇsʎs ɹɐןos ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", + "machine.gtceu.uiv_laser_engraver.tooltip": "uouuɐƆ uoʇoɥԀ ʇɔɐxƎㄥ§", + "machine.gtceu.uiv_lathe.tooltip": "ɹǝpuıɹ⅁ uoıʇɐʇoᴚㄥ§", + "machine.gtceu.uiv_macerator.tooltip": "ɹoʇɐuıɯıןƎ ǝdɐɥSㄥ§", + "machine.gtceu.uiv_mass_fabricator.tooltip": "ɹoʇɐıʇıuI ǝɔuǝʇsıxƎㄥ§", + "machine.gtceu.uiv_mixer.tooltip": "ɹǝzıuǝboɯoH ןɐıɹǝʇɐWㄥ§", + "machine.gtceu.uiv_ore_washer.tooltip": "ɥsɐM ɹɐƆ ǝɹnʇɐıuıWㄥ§", + "machine.gtceu.uiv_packer.tooltip": "ǝsnoɥǝɹɐM uozɐɯⱯㄥ§", + "machine.gtceu.uiv_polarizer.tooltip": "ɹǝbuɐɹɹɐǝᴚ pןǝıℲ ɔıʇǝubɐWㄥ§", + "machine.gtceu.uiv_replicator.tooltip": "ɹǝsodɯoƆ ןɐʇuǝɯǝןƎㄥ§", + "machine.gtceu.uiv_rock_crusher.tooltip": "ɹǝqɯɐɥƆ uoıʇɐɯɹoℲ ɔıuɐɔןoΛㄥ§", + "machine.gtceu.uiv_scanner.tooltip": "ǝdoɔsoɹɔıW uoɹʇɔǝןƎㄥ§", + "machine.gtceu.uiv_sifter.tooltip": "ɹǝʇןıℲ uoıʇɐsןnԀㄥ§", + "machine.gtceu.uiv_thermal_centrifuge.tooltip": "ǝuoןɔʎƆ ǝɹıℲㄥ§", + "machine.gtceu.uiv_wiremill.tooltip": "ɹoʇɐɹnbıɟsuɐɹ⟘ ǝɹıMㄥ§", + "machine.gtceu.ulv_alloy_smelter.tooltip": "ɹǝʇןǝɯS uoıʇɐuıqɯoɔ ɥɔǝ⟘ɥbıHㄥ§", + "machine.gtceu.ulv_arc_furnace.tooltip": "¿ǝɔɐuɹnℲ ʇsɐןᗺ ɐ spǝǝu oɥMㄥ§", + "machine.gtceu.ulv_assembler.tooltip": "¡ǝןqɯǝssⱯ 'sɹǝbuǝʌⱯㄥ§", + "machine.gtceu.ulv_autoclave.tooltip": "sʇsnᗡ ɹnoʎ buızıןןɐʇsʎɹƆㄥ§", + "machine.gtceu.ulv_bender.tooltip": "¡¡¡ᴚƎᗡNƎᗺ ʇuɐʍ ǝM ¡pɐq s,ǝɥ 'ooᗺㄥ§", + "machine.gtceu.ulv_brewery.tooltip": "buıʍǝɹq uoıʇod ʇuǝıɔıɟɟǝ puɐ ʇɔɐdɯoƆㄥ§", + "machine.gtceu.ulv_canner.tooltip": "sɹǝuıɐʇuoƆ ɟo ʇno puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", + "machine.gtceu.ulv_chemical_bath.tooltip": "ɯǝɥʇ ǝʇɐɹɐdǝs oʇ sןɐɔıɯǝɥƆ uı sǝɹO buıɥʇɐᗺㄥ§", + "machine.gtceu.ulv_chemical_reactor.tooltip": "ɹǝɥʇo ɥɔɐǝ ɥʇıʍ ʇɔɐǝɹ sןɐɔıɯǝɥƆ buıʇʇǝꞀㄥ§", + "machine.gtceu.ulv_circuit_assembler.tooltip": "ǝɔɐןd ǝɥʇ ɹǝʌo ןןɐ ǝɔɐןԀ-u-ʞɔıԀㄥ§", + "machine.gtceu.ulv_compressor.tooltip": "ㄥㄥƆ ɔıʇɐW-O-ssǝɹdɯoƆㄥ§", + "machine.gtceu.ulv_cutter.tooltip": "ǝɔıᗡ N,ǝɔıןSㄥ§", + "machine.gtceu.ulv_distillery.tooltip": "spınןℲ ɟo sʇɹɐԀ ʇuɐʌǝןǝɹ ʇsoɯ buıʇɔɐɹʇxƎㄥ§", + "machine.gtceu.ulv_electric_furnace.tooltip": "ㄣ9 ǝɹopoɯɯoƆ ɐ buısn ǝʞıן ʇoNㄥ§", + "machine.gtceu.ulv_electromagnetic_separator.tooltip": "ʇsǝɹ ǝɥʇ ɯoɹɟ sǝɹO ɔıʇǝubɐɯ ǝɥʇ buıʇɐɹɐdǝSㄥ§", + "machine.gtceu.ulv_extractor.tooltip": "ƐᄅƖᗡ - ɯooᗡ ɟo ǝɔıʌǝᗡ-ɹǝɔınظǝᗡㄥ§", + "machine.gtceu.ulv_extruder.tooltip": "buıʞɹoM ןɐʇǝW ɹoɟ ǝuıɥɔɐW ןɐsɹǝʌıu∩ㄥ§", + "machine.gtceu.ulv_fermenter.tooltip": "spınןℲ buıʇuǝɯɹǝℲㄥ§", + "machine.gtceu.ulv_fluid_heater.tooltip": "spınןℲ ɹnoʎ dn buıʇɐǝHㄥ§", + "machine.gtceu.ulv_fluid_solidifier.tooltip": "spıןoS ɯɹoɟ oʇ uʍop spınןℲ sןooƆㄥ§", + "machine.gtceu.ulv_forge_hammer.tooltip": "¡ǝɯıʇɹǝɯɯɐH 'doʇSㄥ§", + "machine.gtceu.ulv_forming_press.tooltip": "sbuıɥʇ oʇuı sǝbɐɯI buıʇuıɹdɯIㄥ§", + "machine.gtceu.ulv_mass_fabricator.tooltip": "pǝɹɐnbS uoıʇɐɔıɹqɐℲ * ɹǝʇʇɐW W∩∩ㄥ§", + "machine.gtceu.ulv_mixer.tooltip": "¿puǝןᗺ ʇı ןןıMㄥ§", + "machine.gtceu.ulv_packer.tooltip": "sǝxoᗺ ɟo ʇno sbuıɥʇ sqɐɹ⅁ puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", + "machine.gtceu.ulv_polarizer.tooltip": "sʇǝubɐW ɹnoʎ buısıɹɐןodıᗺㄥ§", + "machine.gtceu.ulv_replicator.tooltip": "sʇuǝɯǝןƎ ɟo ʇsǝɹnԀ ǝɥʇ buıɔnpoɹԀㄥ§", + "machine.gtceu.ulv_scanner.tooltip": "sbuıɥʇ ɹǝɥʇo puɐ sןɐıɹǝʇɐW suɐɔSㄥ§", + "machine.gtceu.ulv_sifter.tooltip": "buıʇɟıs dǝǝʞ puɐ ɯןɐɔ ʎɐʇSㄥ§", + "machine.gtceu.ulv_wiremill.tooltip": "ʎןʇuǝıɔıɟɟǝ ǝɹoɯ sǝɹıM sǝɔnpoɹԀㄥ§", + "machine.gtceu.uv_alloy_smelter.tooltip": "ɹoʇɐɯɐbןɐɯⱯ ןɐʇǝWㄥ§", + "machine.gtceu.uv_arc_furnace.tooltip": "ɹǝʇɐǝH ʇınɔɹıƆ ʇɹoɥSㄥ§", + "machine.gtceu.uv_assembler.tooltip": "ɹoʇɔnɹʇsuoƆ ʎןqɯǝssⱯㄥ§", + "machine.gtceu.uv_autoclave.tooltip": "ʇıu∩ ǝɔuɐɹqɯnɔuƎㄥ§", + "machine.gtceu.uv_bender.tooltip": "ɹǝɯɹoɟǝᗡ ɹǝʇʇɐWㄥ§", + "machine.gtceu.uv_brewery.tooltip": "ɹǝɥsnᴚ ʍǝɹᗺㄥ§", + "machine.gtceu.uv_canner.tooltip": "ɹoʇɐnʇɔⱯ uɐƆㄥ§", + "machine.gtceu.uv_centrifuge.tooltip": "opɐuɹo⟘ ɹɐןnɔǝןoWㄥ§", + "machine.gtceu.uv_chemical_bath.tooltip": "uoɹʇʞunᗡ ןɐɔıɯǝɥƆㄥ§", + "machine.gtceu.uv_chemical_reactor.tooltip": "ɹǝzʎןɐʇɐƆ uoıʇɔɐǝᴚㄥ§", + "machine.gtceu.uv_circuit_assembler.tooltip": "ʎɹoʇɔɐℲ uoıʇɐʇndɯoƆㄥ§", + "machine.gtceu.uv_compressor.tooltip": "ɹoʇɔıɹʇsuoƆ ɹǝʇʇɐWㄥ§", + "machine.gtceu.uv_cutter.tooltip": "ɹǝpıʌıᗡ ʇɔǝظqOㄥ§", + "machine.gtceu.uv_distillery.tooltip": "ɹǝʇʇıןdS uoıʇɔɐɹℲㄥ§", + "machine.gtceu.uv_electric_furnace.tooltip": "ɹoʇɐןnɯıʇS ɯoʇⱯㄥ§", + "machine.gtceu.uv_electrolyzer.tooltip": "ɹǝzıuoI ɔıɯoʇⱯㄥ§", + "machine.gtceu.uv_electromagnetic_separator.tooltip": "ɹǝןןǝdsıᗡ ℲWƎㄥ§", + "machine.gtceu.uv_extractor.tooltip": "ɹǝʞɔnS buıʎɟǝnbıꞀㄥ§", + "machine.gtceu.uv_extruder.tooltip": "ɹǝʌıɹᗡ ǝdɐɥSㄥ§", + "machine.gtceu.uv_fermenter.tooltip": "ɹǝןןoɹʇuoƆ uoıʇɐɹıdsǝᴚㄥ§", + "machine.gtceu.uv_fluid_heater.tooltip": "ɹǝnqɯI ןɐɯɹǝɥ⟘ㄥ§", + "machine.gtceu.uv_fluid_solidifier.tooltip": "ɹoʇɐɔıɟıɹʇǝԀ pınןℲㄥ§", + "machine.gtceu.uv_forge_hammer.tooltip": "ɹoʇɐןnpoW ʇɔɐdɯIㄥ§", + "machine.gtceu.uv_forming_press.tooltip": "ɹǝʇɟıɥS ǝɔɐɟɹnSㄥ§", + "machine.gtceu.uv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɯǝʇsʎs ɹɐןos ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", + "machine.gtceu.uv_laser_engraver.tooltip": "uouuɐƆ uoʇoɥԀ ʇɔɐxƎㄥ§", + "machine.gtceu.uv_lathe.tooltip": "ɹǝpuıɹ⅁ uoıʇɐʇoᴚㄥ§", + "machine.gtceu.uv_macerator.tooltip": "ɹoʇɐuıɯıןƎ ǝdɐɥSㄥ§", + "machine.gtceu.uv_mass_fabricator.tooltip": "ɹoʇɐıʇıuI ǝɔuǝʇsıxƎㄥ§", + "machine.gtceu.uv_mixer.tooltip": "ɹǝzıuǝboɯoH ןɐıɹǝʇɐWㄥ§", + "machine.gtceu.uv_ore_washer.tooltip": "ɥsɐM ɹɐƆ ǝɹnʇɐıuıWㄥ§", + "machine.gtceu.uv_packer.tooltip": "ǝsnoɥǝɹɐM uozɐɯⱯㄥ§", + "machine.gtceu.uv_polarizer.tooltip": "ɹǝbuɐɹɹɐǝᴚ pןǝıℲ ɔıʇǝubɐWㄥ§", + "machine.gtceu.uv_replicator.tooltip": "ɹǝsodɯoƆ ןɐʇuǝɯǝןƎㄥ§", + "machine.gtceu.uv_rock_crusher.tooltip": "ɹǝqɯɐɥƆ uoıʇɐɯɹoℲ ɔıuɐɔןoΛㄥ§", + "machine.gtceu.uv_scanner.tooltip": "ǝdoɔsoɹɔıW uoɹʇɔǝןƎㄥ§", + "machine.gtceu.uv_sifter.tooltip": "ɹǝʇןıℲ uoıʇɐsןnԀㄥ§", + "machine.gtceu.uv_thermal_centrifuge.tooltip": "ǝuoןɔʎƆ ǝɹıℲㄥ§", + "machine.gtceu.uv_wiremill.tooltip": "ɹoʇɐɹnbıɟsuɐɹ⟘ ǝɹıMㄥ§", + "machine.gtceu.uxv_alloy_smelter.tooltip": "ɹoʇɐɯɐbןɐɯⱯ ןɐʇǝWㄥ§", + "machine.gtceu.uxv_arc_furnace.tooltip": "ɹǝʇɐǝH ʇınɔɹıƆ ʇɹoɥSㄥ§", + "machine.gtceu.uxv_assembler.tooltip": "ɹoʇɔnɹʇsuoƆ ʎןqɯǝssⱯㄥ§", + "machine.gtceu.uxv_autoclave.tooltip": "ʇıu∩ ǝɔuɐɹqɯnɔuƎㄥ§", + "machine.gtceu.uxv_bender.tooltip": "ɹǝɯɹoɟǝᗡ ɹǝʇʇɐWㄥ§", + "machine.gtceu.uxv_brewery.tooltip": "ɹǝɥsnᴚ ʍǝɹᗺㄥ§", + "machine.gtceu.uxv_canner.tooltip": "ɹoʇɐnʇɔⱯ uɐƆㄥ§", + "machine.gtceu.uxv_centrifuge.tooltip": "opɐuɹo⟘ ɹɐןnɔǝןoWㄥ§", + "machine.gtceu.uxv_chemical_bath.tooltip": "uoɹʇʞunᗡ ןɐɔıɯǝɥƆㄥ§", + "machine.gtceu.uxv_chemical_reactor.tooltip": "ɹǝzʎןɐʇɐƆ uoıʇɔɐǝᴚㄥ§", + "machine.gtceu.uxv_circuit_assembler.tooltip": "ʎɹoʇɔɐℲ uoıʇɐʇndɯoƆㄥ§", + "machine.gtceu.uxv_compressor.tooltip": "ɹoʇɔıɹʇsuoƆ ɹǝʇʇɐWㄥ§", + "machine.gtceu.uxv_cutter.tooltip": "ɹǝpıʌıᗡ ʇɔǝظqOㄥ§", + "machine.gtceu.uxv_distillery.tooltip": "ɹǝʇʇıןdS uoıʇɔɐɹℲㄥ§", + "machine.gtceu.uxv_electric_furnace.tooltip": "ɹoʇɐןnɯıʇS ɯoʇⱯㄥ§", + "machine.gtceu.uxv_electrolyzer.tooltip": "ɹǝzıuoI ɔıɯoʇⱯㄥ§", + "machine.gtceu.uxv_electromagnetic_separator.tooltip": "ɹǝןןǝdsıᗡ ℲWƎㄥ§", + "machine.gtceu.uxv_extractor.tooltip": "ɹǝʞɔnS buıʎɟǝnbıꞀㄥ§", + "machine.gtceu.uxv_extruder.tooltip": "ɹǝʌıɹᗡ ǝdɐɥSㄥ§", + "machine.gtceu.uxv_fermenter.tooltip": "ɹǝןןoɹʇuoƆ uoıʇɐɹıdsǝᴚㄥ§", + "machine.gtceu.uxv_fluid_heater.tooltip": "ɹǝnqɯI ןɐɯɹǝɥ⟘ㄥ§", + "machine.gtceu.uxv_fluid_solidifier.tooltip": "ɹoʇɐɔıɟıɹʇǝԀ pınןℲㄥ§", + "machine.gtceu.uxv_forge_hammer.tooltip": "ɹoʇɐןnpoW ʇɔɐdɯIㄥ§", + "machine.gtceu.uxv_forming_press.tooltip": "ɹǝʇɟıɥS ǝɔɐɟɹnSㄥ§", + "machine.gtceu.uxv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɯǝʇsʎs ɹɐןos ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", + "machine.gtceu.uxv_laser_engraver.tooltip": "uouuɐƆ uoʇoɥԀ ʇɔɐxƎㄥ§", + "machine.gtceu.uxv_lathe.tooltip": "ɹǝpuıɹ⅁ uoıʇɐʇoᴚㄥ§", + "machine.gtceu.uxv_macerator.tooltip": "ɹoʇɐuıɯıןƎ ǝdɐɥSㄥ§", + "machine.gtceu.uxv_mass_fabricator.tooltip": "ɹoʇɐıʇıuI ǝɔuǝʇsıxƎㄥ§", + "machine.gtceu.uxv_mixer.tooltip": "ɹǝzıuǝboɯoH ןɐıɹǝʇɐWㄥ§", + "machine.gtceu.uxv_ore_washer.tooltip": "ɥsɐM ɹɐƆ ǝɹnʇɐıuıWㄥ§", + "machine.gtceu.uxv_packer.tooltip": "ǝsnoɥǝɹɐM uozɐɯⱯㄥ§", + "machine.gtceu.uxv_polarizer.tooltip": "ɹǝbuɐɹɹɐǝᴚ pןǝıℲ ɔıʇǝubɐWㄥ§", + "machine.gtceu.uxv_replicator.tooltip": "ɹǝsodɯoƆ ןɐʇuǝɯǝןƎㄥ§", + "machine.gtceu.uxv_rock_crusher.tooltip": "ɹǝqɯɐɥƆ uoıʇɐɯɹoℲ ɔıuɐɔןoΛㄥ§", + "machine.gtceu.uxv_scanner.tooltip": "ǝdoɔsoɹɔıW uoɹʇɔǝןƎㄥ§", + "machine.gtceu.uxv_sifter.tooltip": "ɹǝʇןıℲ uoıʇɐsןnԀㄥ§", + "machine.gtceu.uxv_thermal_centrifuge.tooltip": "ǝuoןɔʎƆ ǝɹıℲㄥ§", + "machine.gtceu.uxv_wiremill.tooltip": "ɹoʇɐɹnbıɟsuɐɹ⟘ ǝɹıMㄥ§", + "machine.gtceu.world_accelerator.description": "˙ǝpoɯ ǝbuɐɥɔ oʇ ɹǝʌıɹpʍǝɹɔS ǝs∩ ˙ㄥ§ʞɔı⟘ ɯopuɐᴚɟ§ ɹo ㄥ§ʎʇıʇuƎ ǝןı⟘ɟ§ :sǝpoɯ ᄅ ɟo ǝuo uı sʞɔoןq ʎqɹɐǝu sǝʇɐɹǝןǝɔɔɐ ʞɔı⟘", + "machine.gtceu.world_accelerator.mode_entity": "ǝpoW ʞɔı⟘ ɯopuɐᴚ", + "machine.gtceu.world_accelerator.mode_tile": "ǝpoW ʎʇıʇuƎ ʞɔoןᗺ", + "machine.gtceu.world_accelerator.working_area": ":ɐǝɹⱯ buıʞɹoMq§", + "machine.gtceu.world_accelerator.working_area_random": "%dx%d ɟ§:ǝpoW ʞɔı⟘ ɯopuɐᴚ ", + "machine.gtceu.world_accelerator.working_area_tile": "sʞɔoןᗺ ʇuǝɔɐظpⱯ ɟ§:ǝpoW ʎʇıʇuƎ ʞɔoןᗺ ", + "machine.gtceu.zpm_alloy_smelter.tooltip": "ɹoʇɐɹbǝʇuI ʎoןןⱯㄥ§", + "machine.gtceu.zpm_arc_furnace.tooltip": "ɹǝʇɐǝH ǝbɹɐɥɔsıᗡㄥ§", + "machine.gtceu.zpm_assembler.tooltip": "ǝןqɐ⟘ buıʇɟɐɹƆ ɐ ⟘ONㄥ§", + "machine.gtceu.zpm_autoclave.tooltip": "ɹǝʞooƆ ǝɹnssǝɹԀㄥ§", + "machine.gtceu.zpm_bender.tooltip": "ɹǝʇɹoʇsıᗡ ǝdɐɥSㄥ§", + "machine.gtceu.zpm_brewery.tooltip": "sʞuıɹᗡ ɹnoʎ buıʍǝɹᗺㄥ§", + "machine.gtceu.zpm_canner.tooltip": "ɹoʇɐɹǝdO uɐƆㄥ§", + "machine.gtceu.zpm_centrifuge.tooltip": "ǝuoןɔʎƆ ɹɐןnɔǝןoWㄥ§", + "machine.gtceu.zpm_chemical_bath.tooltip": "ɹǝʞɐoS ןɐɔıɯǝɥƆㄥ§", + "machine.gtceu.zpm_chemical_reactor.tooltip": "ɹǝɯɹoɟɹǝԀ ןɐɔıɯǝɥƆㄥ§", + "machine.gtceu.zpm_circuit_assembler.tooltip": "ɹǝɹnʇɔɐɟnuɐW sɔıuoɹʇɔǝןƎㄥ§", + "machine.gtceu.zpm_compressor.tooltip": "ɹǝsuǝpuoƆ ʎʇıɹɐןnbuıSㄥ§", + "machine.gtceu.zpm_cutter.tooltip": "ɹǝʌɐǝןƆ ɹǝʇʇɐWㄥ§", + "machine.gtceu.zpm_distillery.tooltip": "ɹoʇɐɹɐdǝS uoıʇɐsuǝpuoƆㄥ§", + "machine.gtceu.zpm_electric_furnace.tooltip": "ɹossǝɔoɹԀ ʇuǝɯǝʇıɔxƎ uoɹʇɔǝןƎㄥ§", + "machine.gtceu.zpm_electrolyzer.tooltip": "806ㄣ-Ǝ ɹoʇɐɹbǝʇuısıᗡ ɹɐןnɔǝןoWㄥ§", + "machine.gtceu.zpm_electromagnetic_separator.tooltip": "ɹǝzıɹobǝʇɐƆ WƎㄥ§", + "machine.gtceu.zpm_extractor.tooltip": "ɹoʇɐuıʇɔɐɹʇxƎ ɯnnɔɐΛㄥ§", + "machine.gtceu.zpm_extruder.tooltip": "ɹǝɔɐןdsıᗡ ןɐıɹǝʇɐWㄥ§", + "machine.gtceu.zpm_fermenter.tooltip": "ɹǝuǝʇsɐH uoıʇɐʇuǝɯɹǝℲㄥ§", + "machine.gtceu.zpm_fluid_heater.tooltip": "ɹǝsnɟuI ʇɐǝHㄥ§", + "machine.gtceu.zpm_fluid_solidifier.tooltip": "ǝuıɥɔɐW ǝɔI uɐ ʇoNㄥ§", + "machine.gtceu.zpm_forge_hammer.tooltip": "ɹǝbɹoℲ ǝʇɐןԀㄥ§", + "machine.gtceu.zpm_forming_press.tooltip": "ɹǝɹǝʎɐꞀ ʇɔǝظqOㄥ§", + "machine.gtceu.zpm_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ǝɹǝɥdsoɯʇɐ ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", + "machine.gtceu.zpm_laser_engraver.tooltip": "MW ㄣ9˙ᄅƐ ɟo ɹǝʍoԀ ǝɥʇ ɥʇıMㄥ§", + "machine.gtceu.zpm_lathe.tooltip": "806ϛ-Ꞁ ɔıʇɐW-O-uɹn⟘ㄥ§", + "machine.gtceu.zpm_macerator.tooltip": "Ɛ006 ɔıʇɐW-O-puǝןᗺㄥ§", + "machine.gtceu.zpm_mass_fabricator.tooltip": "ʎɹoʇɔɐℲ sısǝuǝ⅁ㄥ§", + "machine.gtceu.zpm_mixer.tooltip": "ɹǝzıuɐbɹO ɹǝʇʇɐWㄥ§", + "machine.gtceu.zpm_ore_washer.tooltip": "ᄅ9Ɛ-I ɹǝɥsɐM-ʎɹpunɐꞀ pǝsodɹndǝᴚㄥ§", + "machine.gtceu.zpm_packer.tooltip": "ɹoʇɐuıxoᗺㄥ§", + "machine.gtceu.zpm_polarizer.tooltip": "ɹǝɔnpuI ɯsıʇǝubɐWㄥ§", + "machine.gtceu.zpm_replicator.tooltip": "ɹǝʇsɐԀ ɹǝʇʇɐWㄥ§", + "machine.gtceu.zpm_rock_crusher.tooltip": "00ᄅ0Ɩ-ᴚ ɹǝıɟıpıןoS ɐɯbɐW ɔıuǝboʎɹƆㄥ§", + "machine.gtceu.zpm_scanner.tooltip": "ɹoʇɔǝʇǝᗡ ʎןɐɯouⱯㄥ§", + "machine.gtceu.zpm_sifter.tooltip": "ƆℲ⟘ ʎq pǝɹosuodSㄥ§", + "machine.gtceu.zpm_thermal_centrifuge.tooltip": "ᄅϛƐ9-⟘ doɥsʇɐǝʍS ǝzɐןᗺㄥ§", + "machine.gtceu.zpm_wiremill.tooltip": "ɹoʇɐbuoןƎ ʇobuIㄥ§", "material.gtceu.acetic_acid": "pıɔⱯ ɔıʇǝɔⱯ", "material.gtceu.acetic_anhydride": "ǝpıɹpʎɥuⱯ ɔıʇǝɔⱯ", "material.gtceu.acetone": "ǝuoʇǝɔⱯ", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 6001f4f93fd..40030a5817c 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -2502,21 +2502,9 @@ "gtceu.machine.active_transformer.tooltip.3": " Lasers§7.", "gtceu.machine.advanced_processing_array.tooltip": "Parallelize the World", "gtceu.machine.assembly_line.tooltip": "Not a multiblock Assembling Machine!", - "gtceu.machine.available_recipe_map_1.tooltip": "Available Recipe Types: %s", - "gtceu.machine.available_recipe_map_2.tooltip": "Available Recipe Types: %s, %s", - "gtceu.machine.available_recipe_map_3.tooltip": "Available Recipe Types: %s, %s, %s", - "gtceu.machine.available_recipe_map_4.tooltip": "Available Recipe Types: %s, %s, %s, %s", - "gtceu.machine.basic.input_from_output_side.allow": "Allow Input from Output Side: ", - "gtceu.machine.basic.input_from_output_side.disallow": "Disallow Input from Output Side: ", "gtceu.machine.bedrock_ore_miner.depletion": "§bDepletion Rate: §f%s%%", "gtceu.machine.bedrock_ore_miner.description": "§7Drills ores from veins under bedrock.", "gtceu.machine.bedrock_ore_miner.production": "§eProduction Multiplier: §f%dx, %fx overclocked", - "gtceu.machine.block_breaker.speed_bonus": "§eSpeed Bonus: §f%d%%", - "gtceu.machine.block_breaker.tooltip": "§7Mines block on front face and collects its drops", - "gtceu.machine.boiler.info.cooling.down": "§9Cooling down§r%s", - "gtceu.machine.boiler.info.heating.up": "§cHeating up§r%s", - "gtceu.machine.boiler.info.producing.steam": " §a(boiling water)", - "gtceu.machine.buffer.tooltip": "A Small Buffer to store Items and Fluids", "gtceu.machine.canner.jei_description": "You can fill and empty any fluid containers with the Fluid Canner (e.g. Buckets or Fluid Cells)", "gtceu.machine.central_monitor.tooltip": "But can it run Doom?", "gtceu.machine.charcoal_pile.tooltip": "Underground fuel bakery", @@ -2536,7 +2524,6 @@ "gtceu.machine.cleanroom.tooltip.ae2.channels": "Send up to §f8 AE2 Channels §7through §fHulls§7 in the walls.", "gtceu.machine.cleanroom.tooltip.ae2.no_channels": "Send §aAE2 Networks§7 through §fHulls§7 in the walls.", "gtceu.machine.cleanroom.tooltip.hold_ctrl": "Hold CTRL to show additional Structure Information", - "gtceu.machine.coke_oven.tooltip": "Making better fuels for Steel and Power", "gtceu.machine.coke_oven_hatch.tooltip": "§7Allows automation access for the Coke Oven.", "gtceu.machine.computation_receiver_hatch.tooltip": "Computation Data Input for Multiblocks", "gtceu.machine.computation_transmitter_hatch.tooltip": "Computation Data Output for Multiblocks", @@ -2551,77 +2538,19 @@ "gtceu.machine.data_bank.tooltip.4": "Uses §f%s EU/t§7 per Data/Optical Hatch when chained.", "gtceu.machine.data_receiver_hatch.tooltip": "Research Data Input for Multiblocks", "gtceu.machine.data_transmitter_hatch.tooltip": "Research Data Output for Multiblocks", - "gtceu.machine.diode.message": "Max Amperage throughput: %s", - "gtceu.machine.diode.tooltip_general": "Allows Energy Flow in one direction and limits Amperage", - "gtceu.machine.diode.tooltip_starts_at": "Starts as §f1A§7, use Soft Mallet to change", - "gtceu.machine.diode.tooltip_tool_usage": "Hit with a Soft Mallet to change Amperage flow.", "gtceu.machine.distillation_tower.tooltip": "Fluid Refinery", - "gtceu.machine.drum.disable_output": "Will not drain Fluid", - "gtceu.machine.drum.enable_output": "Will drain Fluid to downward adjacent Tanks", "gtceu.machine.dual_hatch.export.tooltip": "Item and Fluid Output for Multiblocks", "gtceu.machine.dual_hatch.import.tooltip": "Item and Fluid Input for Multiblocks", - "gtceu.machine.electric_blast_furnace.tooltip": "Where's the electric smoker?", - "gtceu.machine.electric_blast_furnace.tooltip.0": "For every §f900K§7 above the recipe temperature, a multiplicative §f95%%§7 energy multiplier is applied pre-overclocking.", - "gtceu.machine.electric_blast_furnace.tooltip.1": "For every §f1800K§7 above the recipe temperature, one overclock becomes §f100%% efficient§7 (perfect overclock).", - "gtceu.machine.electric_blast_furnace.tooltip.2": "For every voltage tier above §bMV§7, temperature is increased by §f100K§7.", "gtceu.machine.endpoint.tooltip.0": "Connect with §fLong Distance Pipe§7 blocks to create a pipeline.", "gtceu.machine.endpoint.tooltip.1": "Pipelines must have exactly §f1 Input§7 and §f1 Output§7 endpoint.", "gtceu.machine.endpoint.tooltip.2": "Only pipeline endpoints need to be §fchunk-loaded§7.", "gtceu.machine.endpoint.tooltip.min_length": "§bMinimum Endpoint Distance: §f%d Blocks", - "gtceu.machine.energy_converter.description": "Converts Energy between EU and FE", - "gtceu.machine.energy_converter.message_conversion_eu": "Converting EU, In: %dA %d EU, Out: %d Native", - "gtceu.machine.energy_converter.message_conversion_native": "Converting Native Energy, In: %d FE, Out: %dA %d EU", - "gtceu.machine.energy_converter.tooltip_conversion_eu": "§aEU Conversion: §f%dA %d EU (%s§f) -> %d Native", - "gtceu.machine.energy_converter.tooltip_conversion_native": "§cNative Conversion: §f%d FE -> %dA %d EU (%s§f)", - "gtceu.machine.energy_converter.tooltip_tool_usage": "Starts as §fFE Converter§7, use Soft Mallet to change", "gtceu.machine.energy_hatch.input.tooltip": "Energy Input for Multiblocks", "gtceu.machine.energy_hatch.input_hi_amp.tooltip": "Multiple Ampere Energy Input for Multiblocks", "gtceu.machine.energy_hatch.output.tooltip": "Energy Output for Multiblocks", "gtceu.machine.energy_hatch.output_hi_amp.tooltip": "Multiple Ampere Energy Output for Multiblocks", - "gtceu.machine.ev_alloy_smelter.tooltip": "§7HighTech combination Smelter", - "gtceu.machine.ev_arc_furnace.tooltip": "§7Who needs a Blast Furnace?", - "gtceu.machine.ev_assembler.tooltip": "§7Avengers, Assemble!", - "gtceu.machine.ev_autoclave.tooltip": "§7Crystallizing your Dusts", - "gtceu.machine.ev_bender.tooltip": "§7Boo, he's bad! We want BENDER!!!", - "gtceu.machine.ev_brewery.tooltip": "§7Compact and efficient potion brewing", - "gtceu.machine.ev_canner.tooltip": "§7Puts things into and out of Containers", - "gtceu.machine.ev_centrifuge.tooltip": "§7Molecular Separator", - "gtceu.machine.ev_chemical_bath.tooltip": "§7Bathing Ores in Chemicals to separate them", - "gtceu.machine.ev_chemical_reactor.tooltip": "§7Letting Chemicals react with each other", - "gtceu.machine.ev_circuit_assembler.tooltip": "§7Pick-n-Place all over the place", - "gtceu.machine.ev_compressor.tooltip": "§7Compress-O-Matic C77", - "gtceu.machine.ev_cutter.tooltip": "§7Slice'N Dice", - "gtceu.machine.ev_distillery.tooltip": "§7Extracting most relevant Parts of Fluids", - "gtceu.machine.ev_electric_furnace.tooltip": "§7Not like using a Commodore 64", - "gtceu.machine.ev_electrolyzer.tooltip": "§7Electrolyzing Molecules", - "gtceu.machine.ev_electromagnetic_separator.tooltip": "§7Separating the magnetic Ores from the rest", - "gtceu.machine.ev_extractor.tooltip": "§7Dejuicer-Device of Doom - D123", - "gtceu.machine.ev_extruder.tooltip": "§7Universal Machine for Metal Working", - "gtceu.machine.ev_fermenter.tooltip": "§7Fermenting Fluids", "gtceu.machine.ev_fluid_drilling_rig.tooltip": "Well Drainer", - "gtceu.machine.ev_fluid_heater.tooltip": "§7Heating up your Fluids", - "gtceu.machine.ev_fluid_solidifier.tooltip": "§7Cools Fluids down to form Solids", - "gtceu.machine.ev_forge_hammer.tooltip": "§7Stop, Hammertime!", - "gtceu.machine.ev_forming_press.tooltip": "§7Imprinting Images into things", - "gtceu.machine.ev_gas_collector.tooltip": "§7Collects Gas from the air depending on the dimension", - "gtceu.machine.ev_laser_engraver.tooltip": "§7Don't look directly at the Laser", - "gtceu.machine.ev_lathe.tooltip": "§7Produces Rods more efficiently", - "gtceu.machine.ev_macerator.tooltip": "§7Shredding your Ores with Byproducts", - "gtceu.machine.ev_mass_fabricator.tooltip": "§7UUM Matter * Fabrication Squared", - "gtceu.machine.ev_mixer.tooltip": "§7Will it Blend?", - "gtceu.machine.ev_ore_washer.tooltip": "§7Getting more Byproducts from your Ores", - "gtceu.machine.ev_packer.tooltip": "§7Puts things into and Grabs things out of Boxes", - "gtceu.machine.ev_polarizer.tooltip": "§7Bipolarising your Magnets", - "gtceu.machine.ev_replicator.tooltip": "§7Producing the Purest of Elements", - "gtceu.machine.ev_rock_crusher.tooltip": "§7Place Water and Lava horizontally adjacent", - "gtceu.machine.ev_scanner.tooltip": "§7Scans Materials and other things", - "gtceu.machine.ev_sifter.tooltip": "§7Stay calm and keep sifting", - "gtceu.machine.ev_thermal_centrifuge.tooltip": "§7Separating Ores more precisely", - "gtceu.machine.ev_wiremill.tooltip": "§7Produces Wires more efficiently", "gtceu.machine.extreme_combustion_engine.tooltip": "Extreme Chemical Energy Releaser", - "gtceu.machine.fisher.requirement": "Requires a %dx%d centered square of water directly below.", - "gtceu.machine.fisher.speed": "Catches something every %d ticks", - "gtceu.machine.fisher.tooltip": "Costs string to fish. Consumes one string each time.", "gtceu.machine.fluid_drilling_rig.depletion": "§bDepletion Rate: §f%s%%", "gtceu.machine.fluid_drilling_rig.description": "§7Drills fluids from veins under bedrock.", "gtceu.machine.fluid_drilling_rig.production": "§eProduction Multiplier: §f%dx, %fx overclocked", @@ -2637,17 +2566,6 @@ "gtceu.machine.high_performance_computation_array.tooltip.0": "Just your average Supercomputer", "gtceu.machine.high_performance_computation_array.tooltip.1": "Used to generate §fComputation§7 (and heat).", "gtceu.machine.high_performance_computation_array.tooltip.2": "Requires HPCA components to generate §fCWU/t§7 (Compute Work Units).", - "gtceu.machine.hp_steam_alloy_smelter.tooltip": "§7Combination Smelter", - "gtceu.machine.hp_steam_compressor.tooltip": "§7Compressing Items", - "gtceu.machine.hp_steam_extractor.tooltip": "§7Extracting your first Rubber", - "gtceu.machine.hp_steam_forge_hammer.tooltip": "§7Forge Hammer", - "gtceu.machine.hp_steam_furnace.tooltip": "§7Smelting things with compressed Steam", - "gtceu.machine.hp_steam_liquid_boiler.tooltip": "§7Faster than Small Steam Liquid Boiler", - "gtceu.machine.hp_steam_macerator.tooltip": "§7Macerating your Ores", - "gtceu.machine.hp_steam_miner.tooltip": "§7Mines ores below the Miner!", - "gtceu.machine.hp_steam_rock_crusher.tooltip": "§7Place Water and Lava horizontally adjacent", - "gtceu.machine.hp_steam_solar_boiler.tooltip": "§7Steam Power by Sun", - "gtceu.machine.hp_steam_solid_boiler.tooltip": "§7Faster than the Small Steam Solid Fuel Boiler", "gtceu.machine.hpca.active_cooler_component.tooltip": "Less free, more effective cooling", "gtceu.machine.hpca.advanced_computation_component.damaged.name": "Damaged HPCA Advanced Computation Component", "gtceu.machine.hpca.advanced_computation_component.damaged.tooltip": "It only cost an arm and a leg", @@ -2668,96 +2586,10 @@ "gtceu.machine.hpca.computation_component.tooltip": "Baby's first computation", "gtceu.machine.hpca.empty_component.tooltip": "Just for filling space", "gtceu.machine.hpca.heat_sink_component.tooltip": "Free cooling! Is anything free?", - "gtceu.machine.hull.tooltip": "§7You just need §5I§dm§4a§cg§ei§an§ba§3t§7i§1o§5n§7 to use this", - "gtceu.machine.hv_alloy_smelter.tooltip": "§7HighTech combination Smelter", - "gtceu.machine.hv_arc_furnace.tooltip": "§7Who needs a Blast Furnace?", - "gtceu.machine.hv_assembler.tooltip": "§7Avengers, Assemble!", - "gtceu.machine.hv_autoclave.tooltip": "§7Crystallizing your Dusts", - "gtceu.machine.hv_bender.tooltip": "§7Boo, he's bad! We want BENDER!!!", - "gtceu.machine.hv_brewery.tooltip": "§7Compact and efficient potion brewing", - "gtceu.machine.hv_canner.tooltip": "§7Puts things into and out of Containers", - "gtceu.machine.hv_centrifuge.tooltip": "§7Separating Molecules", - "gtceu.machine.hv_chemical_bath.tooltip": "§7Bathing Ores in Chemicals to separate them", - "gtceu.machine.hv_chemical_reactor.tooltip": "§7Letting Chemicals react with each other", - "gtceu.machine.hv_circuit_assembler.tooltip": "§7Pick-n-Place all over the place", - "gtceu.machine.hv_compressor.tooltip": "§7Compress-O-Matic C77", - "gtceu.machine.hv_cutter.tooltip": "§7Slice'N Dice", - "gtceu.machine.hv_distillery.tooltip": "§7Extracting most relevant Parts of Fluids", - "gtceu.machine.hv_electric_furnace.tooltip": "§7Not like using a Commodore 64", - "gtceu.machine.hv_electrolyzer.tooltip": "§7Electrolyzing Molecules", - "gtceu.machine.hv_electromagnetic_separator.tooltip": "§7Separating the magnetic Ores from the rest", - "gtceu.machine.hv_extractor.tooltip": "§7Dejuicer-Device of Doom - D123", - "gtceu.machine.hv_extruder.tooltip": "§7Universal Machine for Metal Working", - "gtceu.machine.hv_fermenter.tooltip": "§7Fermenting Fluids", "gtceu.machine.hv_fluid_drilling_rig.tooltip": "Does not perform Fracking", - "gtceu.machine.hv_fluid_heater.tooltip": "§7Heating up your Fluids", - "gtceu.machine.hv_fluid_solidifier.tooltip": "§7Cools Fluids down to form Solids", - "gtceu.machine.hv_forge_hammer.tooltip": "§7Stop, Hammertime!", - "gtceu.machine.hv_forming_press.tooltip": "§7Imprinting Images into things", - "gtceu.machine.hv_gas_collector.tooltip": "§7Collects Gas from the air depending on the dimension", - "gtceu.machine.hv_laser_engraver.tooltip": "§7Don't look directly at the Laser", - "gtceu.machine.hv_lathe.tooltip": "§7Produces Rods more efficiently", - "gtceu.machine.hv_macerator.tooltip": "§7Shredding your Ores with Byproducts", - "gtceu.machine.hv_mass_fabricator.tooltip": "§7UUM Matter * Fabrication Squared", - "gtceu.machine.hv_mixer.tooltip": "§7Will it Blend?", - "gtceu.machine.hv_ore_washer.tooltip": "§7Getting more Byproducts from your Ores", - "gtceu.machine.hv_packer.tooltip": "§7Puts things into and Grabs things out of Boxes", - "gtceu.machine.hv_polarizer.tooltip": "§7Bipolarising your Magnets", - "gtceu.machine.hv_replicator.tooltip": "§7Producing the Purest of Elements", - "gtceu.machine.hv_rock_crusher.tooltip": "§7Place Water and Lava horizontally adjacent", - "gtceu.machine.hv_scanner.tooltip": "§7Scans Materials and other things", - "gtceu.machine.hv_sifter.tooltip": "§7Stay calm and keep sifting", - "gtceu.machine.hv_thermal_centrifuge.tooltip": "§7Separating Ores more precisely", - "gtceu.machine.hv_wiremill.tooltip": "§7Produces Wires more efficiently", "gtceu.machine.implosion_compressor.tooltip": "The only Machine you want to go Boom", "gtceu.machine.item_bus.export.tooltip": "Item Output for Multiblocks", "gtceu.machine.item_bus.import.tooltip": "Item Input for Multiblocks", - "gtceu.machine.item_collector.gui.collect_range": "Collect within an area of %sx%s blocks", - "gtceu.machine.item_collector.tooltip": "Collects Items around itself", - "gtceu.machine.iv_alloy_smelter.tooltip": "§7Alloy Integrator", - "gtceu.machine.iv_arc_furnace.tooltip": "§7Discharge Heater", - "gtceu.machine.iv_assembler.tooltip": "§7NOT a Crafting Table", - "gtceu.machine.iv_autoclave.tooltip": "§7Pressure Cooker", - "gtceu.machine.iv_bender.tooltip": "§7Shape Distorter", - "gtceu.machine.iv_brewery.tooltip": "§7Brewing your Drinks", - "gtceu.machine.iv_canner.tooltip": "§7Can Operator", - "gtceu.machine.iv_centrifuge.tooltip": "§7Molecular Cyclone", - "gtceu.machine.iv_chemical_bath.tooltip": "§7Chemical Soaker", - "gtceu.machine.iv_chemical_reactor.tooltip": "§7Chemical Performer", - "gtceu.machine.iv_circuit_assembler.tooltip": "§7Electronics Manufacturer", - "gtceu.machine.iv_compressor.tooltip": "§7Singularity Condenser", - "gtceu.machine.iv_cutter.tooltip": "§7Matter Cleaver", - "gtceu.machine.iv_distillery.tooltip": "§7Condensation Separator", - "gtceu.machine.iv_electric_furnace.tooltip": "§7Electron Excitement Processor", - "gtceu.machine.iv_electrolyzer.tooltip": "§7Molecular Disintegrator E-4906", - "gtceu.machine.iv_electromagnetic_separator.tooltip": "§7EM Categorizer", - "gtceu.machine.iv_extractor.tooltip": "§7Vacuum Extractinator", - "gtceu.machine.iv_extruder.tooltip": "§7Material Displacer", - "gtceu.machine.iv_fermenter.tooltip": "§7Fermentation Hastener", - "gtceu.machine.iv_fluid_heater.tooltip": "§7Heat Infuser", - "gtceu.machine.iv_fluid_solidifier.tooltip": "§7Not an Ice Machine", - "gtceu.machine.iv_forge_hammer.tooltip": "§7Plate Forger", - "gtceu.machine.iv_forming_press.tooltip": "§7Object Layerer", - "gtceu.machine.iv_gas_collector.tooltip": "§7Collects Gas from the atmosphere depending on the dimension", - "gtceu.machine.iv_laser_engraver.tooltip": "§7With the Power of 2.04 MW", - "gtceu.machine.iv_lathe.tooltip": "§7Turn-O-Matic L-5906", - "gtceu.machine.iv_macerator.tooltip": "§7Blend-O-Matic 9001", - "gtceu.machine.iv_mass_fabricator.tooltip": "§7Genesis Factory", - "gtceu.machine.iv_mixer.tooltip": "§7Matter Organizer", - "gtceu.machine.iv_ore_washer.tooltip": "§7Repurposed Laundry-Washer I-360", - "gtceu.machine.iv_packer.tooltip": "§7Boxinator", - "gtceu.machine.iv_polarizer.tooltip": "§7Magnetism Inducer", - "gtceu.machine.iv_replicator.tooltip": "§7Matter Paster", - "gtceu.machine.iv_rock_crusher.tooltip": "§7Cryogenic Magma Solidifier R-8200", - "gtceu.machine.iv_scanner.tooltip": "§7Anomaly Detector", - "gtceu.machine.iv_sifter.tooltip": "§7Sponsored by TFC", - "gtceu.machine.iv_thermal_centrifuge.tooltip": "§7Blaze Sweatshop T-6350", - "gtceu.machine.iv_wiremill.tooltip": "§7Ingot Elongator", - "gtceu.machine.large_boiler.bronze.tooltip": "We need more Steam!", - "gtceu.machine.large_boiler.steel.tooltip": "Charcoal Incinerator", - "gtceu.machine.large_boiler.titanium.tooltip": "Where's the Magic Super Fuel?", - "gtceu.machine.large_boiler.tungstensteel.tooltip": "How do you even fuel this thing?", - "gtceu.machine.large_chemical_reactor.tooltip": "Black Box Reactor", "gtceu.machine.large_combustion_engine.tooltip": "Fuel Ignition Chamber", "gtceu.machine.large_combustion_engine.tooltip.boost_extreme": "Supply §f80 mB/s§7 of Liquid Oxygen to produce up to §f%s EU/t§7 at §f2x§7 fuel consumption.", "gtceu.machine.large_combustion_engine.tooltip.boost_regular": "Supply §f20 mB/s§7 of Oxygen to produce up to §f%s EU/t§7 at §f2x§7 fuel consumption.", @@ -2776,95 +2608,6 @@ "gtceu.machine.laser_target_hatch.tooltip.1": "§cLaser cables must be in a straight line!§7", "gtceu.machine.locked_safe.malfunctioning": "§cMalfunctioning!", "gtceu.machine.locked_safe.requirements": "§7Replacements required:", - "gtceu.machine.lp_steam_alloy_smelter.tooltip": "§7Combination Smelter", - "gtceu.machine.lp_steam_compressor.tooltip": "§7Compressing Items", - "gtceu.machine.lp_steam_extractor.tooltip": "§7Extracting your first Rubber", - "gtceu.machine.lp_steam_forge_hammer.tooltip": "§7Forge Hammer", - "gtceu.machine.lp_steam_furnace.tooltip": "§7Smelting things with compressed Steam", - "gtceu.machine.lp_steam_liquid_boiler.tooltip": "§7A Boiler running off Liquids", - "gtceu.machine.lp_steam_macerator.tooltip": "§7Macerating your Ores", - "gtceu.machine.lp_steam_miner.tooltip": "§7Mines ores below the Miner!", - "gtceu.machine.lp_steam_rock_crusher.tooltip": "§7Place Water and Lava horizontally adjacent", - "gtceu.machine.lp_steam_solar_boiler.tooltip": "§7Steam Power by Sun", - "gtceu.machine.lp_steam_solid_boiler.tooltip": "§7An early way to get Steam Power", - "gtceu.machine.luv_alloy_smelter.tooltip": "§7Alloy Integrator", - "gtceu.machine.luv_arc_furnace.tooltip": "§7Discharge Heater", - "gtceu.machine.luv_assembler.tooltip": "§7NOT a Crafting Table", - "gtceu.machine.luv_autoclave.tooltip": "§7Pressure Cooker", - "gtceu.machine.luv_bender.tooltip": "§7Shape Distorter", - "gtceu.machine.luv_brewery.tooltip": "§7Brewing your Drinks", - "gtceu.machine.luv_canner.tooltip": "§7Can Operator", - "gtceu.machine.luv_centrifuge.tooltip": "§7Molecular Cyclone", - "gtceu.machine.luv_chemical_bath.tooltip": "§7Chemical Soaker", - "gtceu.machine.luv_chemical_reactor.tooltip": "§7Chemical Performer", - "gtceu.machine.luv_circuit_assembler.tooltip": "§7Electronics Manufacturer", - "gtceu.machine.luv_compressor.tooltip": "§7Singularity Condenser", - "gtceu.machine.luv_cutter.tooltip": "§7Matter Cleaver", - "gtceu.machine.luv_distillery.tooltip": "§7Condensation Separator", - "gtceu.machine.luv_electric_furnace.tooltip": "§7Electron Excitement Processor", - "gtceu.machine.luv_electrolyzer.tooltip": "§7Molecular Disintegrator E-4907", - "gtceu.machine.luv_electromagnetic_separator.tooltip": "§7EM Categorizer", - "gtceu.machine.luv_extractor.tooltip": "§7Vacuum Extractinator", - "gtceu.machine.luv_extruder.tooltip": "§7Material Displacer", - "gtceu.machine.luv_fermenter.tooltip": "§7Fermentation Hastener", - "gtceu.machine.luv_fluid_heater.tooltip": "§7Heat Infuser", - "gtceu.machine.luv_fluid_solidifier.tooltip": "§7Not an Ice Machine", - "gtceu.machine.luv_forge_hammer.tooltip": "§7Plate Forger", - "gtceu.machine.luv_forming_press.tooltip": "§7Object Layerer", - "gtceu.machine.luv_gas_collector.tooltip": "§7Collects Gas from the atmosphere depending on the dimension", - "gtceu.machine.luv_laser_engraver.tooltip": "§7With the Power of 8.16 MW", - "gtceu.machine.luv_lathe.tooltip": "§7Turn-O-Matic L-5907", - "gtceu.machine.luv_macerator.tooltip": "§7Blend-O-Matic 9002", - "gtceu.machine.luv_mass_fabricator.tooltip": "§7Genesis Factory", - "gtceu.machine.luv_mixer.tooltip": "§7Matter Organizer", - "gtceu.machine.luv_ore_washer.tooltip": "§7Repurposed Laundry-Washer I-361", - "gtceu.machine.luv_packer.tooltip": "§7Boxinator", - "gtceu.machine.luv_polarizer.tooltip": "§7Magnetism Inducer", - "gtceu.machine.luv_replicator.tooltip": "§7Matter Paster", - "gtceu.machine.luv_rock_crusher.tooltip": "§7Cryogenic Magma Solidifier R-9200", - "gtceu.machine.luv_scanner.tooltip": "§7Anomaly Detector", - "gtceu.machine.luv_sifter.tooltip": "§7Sponsored by TFC", - "gtceu.machine.luv_thermal_centrifuge.tooltip": "§7Blaze Sweatshop T-6351", - "gtceu.machine.luv_wiremill.tooltip": "§7Ingot Elongator", - "gtceu.machine.lv_alloy_smelter.tooltip": "§7HighTech combination Smelter", - "gtceu.machine.lv_arc_furnace.tooltip": "§7Who needs a Blast Furnace?", - "gtceu.machine.lv_assembler.tooltip": "§7Avengers, Assemble!", - "gtceu.machine.lv_autoclave.tooltip": "§7Crystallizing your Dusts", - "gtceu.machine.lv_bender.tooltip": "§7Boo, he's bad! We want BENDER!!!", - "gtceu.machine.lv_brewery.tooltip": "§7Compact and efficient potion brewing", - "gtceu.machine.lv_canner.tooltip": "§7Puts things into and out of Containers", - "gtceu.machine.lv_centrifuge.tooltip": "§7Separating Molecules", - "gtceu.machine.lv_chemical_bath.tooltip": "§7Bathing Ores in Chemicals to separate them", - "gtceu.machine.lv_chemical_reactor.tooltip": "§7Letting Chemicals react with each other", - "gtceu.machine.lv_circuit_assembler.tooltip": "§7Pick-n-Place all over the place", - "gtceu.machine.lv_compressor.tooltip": "§7Compress-O-Matic C77", - "gtceu.machine.lv_cutter.tooltip": "§7Slice'N Dice", - "gtceu.machine.lv_distillery.tooltip": "§7Extracting most relevant Parts of Fluids", - "gtceu.machine.lv_electric_furnace.tooltip": "§7Not like using a Commodore 64", - "gtceu.machine.lv_electrolyzer.tooltip": "§7Electrolyzing Molecules", - "gtceu.machine.lv_electromagnetic_separator.tooltip": "§7Separating the magnetic Ores from the rest", - "gtceu.machine.lv_extractor.tooltip": "§7Dejuicer-Device of Doom - D123", - "gtceu.machine.lv_extruder.tooltip": "§7Universal Machine for Metal Working", - "gtceu.machine.lv_fermenter.tooltip": "§7Fermenting Fluids", - "gtceu.machine.lv_fluid_heater.tooltip": "§7Heating up your Fluids", - "gtceu.machine.lv_fluid_solidifier.tooltip": "§7Cools Fluids down to form Solids", - "gtceu.machine.lv_forge_hammer.tooltip": "§7Stop, Hammertime!", - "gtceu.machine.lv_forming_press.tooltip": "§7Imprinting Images into things", - "gtceu.machine.lv_gas_collector.tooltip": "§7Collects Gas from the air depending on the dimension", - "gtceu.machine.lv_laser_engraver.tooltip": "§7Don't look directly at the Laser", - "gtceu.machine.lv_lathe.tooltip": "§7Produces Rods more efficiently", - "gtceu.machine.lv_macerator.tooltip": "§7Shredding your Ores without Byproducts", - "gtceu.machine.lv_mass_fabricator.tooltip": "§7UUM Matter * Fabrication Squared", - "gtceu.machine.lv_mixer.tooltip": "§7Will it Blend?", - "gtceu.machine.lv_ore_washer.tooltip": "§7Getting more Byproducts from your Ores", - "gtceu.machine.lv_packer.tooltip": "§7Puts things into and Grabs things out of Boxes", - "gtceu.machine.lv_polarizer.tooltip": "§7Bipolarising your Magnets", - "gtceu.machine.lv_replicator.tooltip": "§7Producing the Purest of Elements", - "gtceu.machine.lv_rock_crusher.tooltip": "§7Place Water and Lava horizontally adjacent", - "gtceu.machine.lv_scanner.tooltip": "§7Scans Materials and other things", - "gtceu.machine.lv_sifter.tooltip": "§7Stay calm and keep sifting", - "gtceu.machine.lv_thermal_centrifuge.tooltip": "§7Separating Ores more precisely", - "gtceu.machine.lv_wiremill.tooltip": "§7Produces Wires more efficiently", "gtceu.machine.machine_hatch.locked": "Machine Interface Locked", "gtceu.machine.machine_hatch.processing_array": "When in the §eProcessing Array§7, only holds machines that work in the §eProcessing Array", "gtceu.machine.machine_hatch.tooltip": "Specialized Access Bus that only holds valid items", @@ -2876,36 +2619,6 @@ "gtceu.machine.maintenance_hatch_full_auto.tooltip": "For automatically maintaining Multiblocks", "gtceu.machine.maintenance_hatch_tape_slot.tooltip": "Insert Tape to prevent problems", "gtceu.machine.maintenance_hatch_tool_slot.tooltip": "Click slot with empty hand when required tools are in inventory to solve problems", - "gtceu.machine.max_alloy_smelter.tooltip": "§7Metal Amalgamator", - "gtceu.machine.max_arc_furnace.tooltip": "§7Short Circuit Heater", - "gtceu.machine.max_assembler.tooltip": "§7Assembly Constructor", - "gtceu.machine.max_autoclave.tooltip": "§7Encumbrance Unit", - "gtceu.machine.max_bender.tooltip": "§7Matter Deformer", - "gtceu.machine.max_brewery.tooltip": "§7Brew Rusher", - "gtceu.machine.max_canner.tooltip": "§7Can Actuator", - "gtceu.machine.max_chemical_bath.tooltip": "§7Chemical Dunktron", - "gtceu.machine.max_chemical_reactor.tooltip": "§7Reaction Catalyzer", - "gtceu.machine.max_circuit_assembler.tooltip": "§7Computation Factory", - "gtceu.machine.max_compressor.tooltip": "§7Matter Constrictor", - "gtceu.machine.max_cutter.tooltip": "§7Object Divider", - "gtceu.machine.max_distillery.tooltip": "§7Fraction Splitter", - "gtceu.machine.max_electric_furnace.tooltip": "§7Atom Stimulator", - "gtceu.machine.max_electromagnetic_separator.tooltip": "§7EMF Dispeller", - "gtceu.machine.max_extractor.tooltip": "§7Liquefying Sucker", - "gtceu.machine.max_extruder.tooltip": "§7Shape Driver", - "gtceu.machine.max_fermenter.tooltip": "§7Respiration Controller", - "gtceu.machine.max_fluid_heater.tooltip": "§7Thermal Imbuer", - "gtceu.machine.max_fluid_solidifier.tooltip": "§7Fluid Petrificator", - "gtceu.machine.max_forge_hammer.tooltip": "§7Impact Modulator", - "gtceu.machine.max_forming_press.tooltip": "§7Surface Shifter", - "gtceu.machine.max_mass_fabricator.tooltip": "§7Existence Initiator", - "gtceu.machine.max_mixer.tooltip": "§7Material Homogenizer", - "gtceu.machine.max_packer.tooltip": "§7Amazon Warehouse", - "gtceu.machine.max_polarizer.tooltip": "§7Magnetic Field Rearranger", - "gtceu.machine.max_replicator.tooltip": "§7Elemental Composer", - "gtceu.machine.max_scanner.tooltip": "§7Electron Microscope", - "gtceu.machine.max_sifter.tooltip": "§7Pulsation Filter", - "gtceu.machine.max_wiremill.tooltip": "§7Wire Transfigurator", "gtceu.machine.me.copy_paste.tooltip": "Sneak right-click with Data Stick to copy settings, right-click to apply", "gtceu.machine.me.export.tooltip": "Has infinite capacity before connecting to ME network.", "gtceu.machine.me.fluid_export.tooltip": "Stores fluids directly into an ME network.", @@ -2932,102 +2645,19 @@ "gtceu.machine.miner.multi.description": "A multiblock mining machine that covers a large area and produces huge quantity of ore.", "gtceu.machine.miner.multi.modes": "Has Silk Touch and Chunk Aligned Modes.", "gtceu.machine.miner.multi.production": "Produces §f3x§7 more crushed ore than a §fMacerator§7.", - "gtceu.machine.miner.per_block": "§7takes §f%ds §7per Block", "gtceu.machine.miner.radius": "Radius: %d", "gtceu.machine.miner.startx": "sX: %d", "gtceu.machine.miner.starty": "sY: %d", "gtceu.machine.miner.startz": "sZ: %d", - "gtceu.machine.miner.tooltip": "§7Mines ores below the Miner! Starts as §f%sx%s §7area", - "gtceu.machine.muffle.off": "Sound Muffling: Disabled", - "gtceu.machine.muffle.on": "Sound Muffling: Enabled", "gtceu.machine.muffler_hatch.tooltip.0": "Recovers waste from machines", "gtceu.machine.muffler_hatch.tooltip.1": "DO NOT OBSTRUCT THE OUTPUT!", - "gtceu.machine.multi_furnace.tooltip": "Just like the Oven at Home", "gtceu.machine.multiblock.tank.tooltip": "Fill and drain through the controller or tank valves.", - "gtceu.machine.mv_alloy_smelter.tooltip": "§7HighTech combination Smelter", - "gtceu.machine.mv_arc_furnace.tooltip": "§7Who needs a Blast Furnace?", - "gtceu.machine.mv_assembler.tooltip": "§7Avengers, Assemble!", - "gtceu.machine.mv_autoclave.tooltip": "§7Crystallizing your Dusts", - "gtceu.machine.mv_bender.tooltip": "§7Boo, he's bad! We want BENDER!!!", - "gtceu.machine.mv_brewery.tooltip": "§7Compact and efficient potion brewing", - "gtceu.machine.mv_canner.tooltip": "§7Puts things into and out of Containers", - "gtceu.machine.mv_centrifuge.tooltip": "§7Separating Molecules", - "gtceu.machine.mv_chemical_bath.tooltip": "§7Bathing Ores in Chemicals to separate them", - "gtceu.machine.mv_chemical_reactor.tooltip": "§7Letting Chemicals react with each other", - "gtceu.machine.mv_circuit_assembler.tooltip": "§7Pick-n-Place all over the place", - "gtceu.machine.mv_compressor.tooltip": "§7Compress-O-Matic C77", - "gtceu.machine.mv_cutter.tooltip": "§7Slice'N Dice", - "gtceu.machine.mv_distillery.tooltip": "§7Extracting most relevant Parts of Fluids", - "gtceu.machine.mv_electric_furnace.tooltip": "§7Not like using a Commodore 64", - "gtceu.machine.mv_electrolyzer.tooltip": "§7Electrolyzing Molecules", - "gtceu.machine.mv_electromagnetic_separator.tooltip": "§7Separating the magnetic Ores from the rest", - "gtceu.machine.mv_extractor.tooltip": "§7Dejuicer-Device of Doom - D123", - "gtceu.machine.mv_extruder.tooltip": "§7Universal Machine for Metal Working", - "gtceu.machine.mv_fermenter.tooltip": "§7Fermenting Fluids", "gtceu.machine.mv_fluid_drilling_rig.tooltip": "Oil Extraction Pump", - "gtceu.machine.mv_fluid_heater.tooltip": "§7Heating up your Fluids", - "gtceu.machine.mv_fluid_solidifier.tooltip": "§7Cools Fluids down to form Solids", - "gtceu.machine.mv_forge_hammer.tooltip": "§7Stop, Hammertime!", - "gtceu.machine.mv_forming_press.tooltip": "§7Imprinting Images into things", - "gtceu.machine.mv_gas_collector.tooltip": "§7Collects Gas from the air depending on the dimension", - "gtceu.machine.mv_laser_engraver.tooltip": "§7Don't look directly at the Laser", - "gtceu.machine.mv_lathe.tooltip": "§7Produces Rods more efficiently", - "gtceu.machine.mv_macerator.tooltip": "§7Shredding your Ores without Byproducts", - "gtceu.machine.mv_mass_fabricator.tooltip": "§7UUM Matter * Fabrication Squared", - "gtceu.machine.mv_mixer.tooltip": "§7Will it Blend?", - "gtceu.machine.mv_ore_washer.tooltip": "§7Getting more Byproducts from your Ores", - "gtceu.machine.mv_packer.tooltip": "§7Puts things into and Grabs things out of Boxes", - "gtceu.machine.mv_polarizer.tooltip": "§7Bipolarising your Magnets", - "gtceu.machine.mv_replicator.tooltip": "§7Producing the Purest of Elements", - "gtceu.machine.mv_rock_crusher.tooltip": "§7Place Water and Lava horizontally adjacent", - "gtceu.machine.mv_scanner.tooltip": "§7Scans Materials and other things", - "gtceu.machine.mv_sifter.tooltip": "§7Stay calm and keep sifting", - "gtceu.machine.mv_thermal_centrifuge.tooltip": "§7Separating Ores more precisely", - "gtceu.machine.mv_wiremill.tooltip": "§7Produces Wires more efficiently", "gtceu.machine.network_switch.tooltip.0": "Ethernet Hub", "gtceu.machine.network_switch.tooltip.1": "Used to route and distribute §fComputation§7.", "gtceu.machine.network_switch.tooltip.2": "Can combine any number of Computation §fReceivers§7 into any number of Computation §fTransmitters§7.", "gtceu.machine.network_switch.tooltip.3": "Uses §f%s EU/t§7 per Computation Data Hatch.", "gtceu.machine.object_holder.tooltip": "Advanced Holding Mechanism for Research Station", - "gtceu.machine.opv_alloy_smelter.tooltip": "§7Metal Amalgamator", - "gtceu.machine.opv_arc_furnace.tooltip": "§7Short Circuit Heater", - "gtceu.machine.opv_assembler.tooltip": "§7Assembly Constructor", - "gtceu.machine.opv_autoclave.tooltip": "§7Encumbrance Unit", - "gtceu.machine.opv_bender.tooltip": "§7Matter Deformer", - "gtceu.machine.opv_brewery.tooltip": "§7Brew Rusher", - "gtceu.machine.opv_canner.tooltip": "§7Can Actuator", - "gtceu.machine.opv_centrifuge.tooltip": "§7Molecular Tornado", - "gtceu.machine.opv_chemical_bath.tooltip": "§7Chemical Dunktron", - "gtceu.machine.opv_chemical_reactor.tooltip": "§7Reaction Catalyzer", - "gtceu.machine.opv_circuit_assembler.tooltip": "§7Computation Factory", - "gtceu.machine.opv_compressor.tooltip": "§7Matter Constrictor", - "gtceu.machine.opv_cutter.tooltip": "§7Object Divider", - "gtceu.machine.opv_distillery.tooltip": "§7Fraction Splitter", - "gtceu.machine.opv_electric_furnace.tooltip": "§7Atom Stimulator", - "gtceu.machine.opv_electrolyzer.tooltip": "§7Atomic Ionizer", - "gtceu.machine.opv_electromagnetic_separator.tooltip": "§7EMF Dispeller", - "gtceu.machine.opv_extractor.tooltip": "§7Liquefying Sucker", - "gtceu.machine.opv_extruder.tooltip": "§7Shape Driver", - "gtceu.machine.opv_fermenter.tooltip": "§7Respiration Controller", - "gtceu.machine.opv_fluid_heater.tooltip": "§7Thermal Imbuer", - "gtceu.machine.opv_fluid_solidifier.tooltip": "§7Fluid Petrificator", - "gtceu.machine.opv_forge_hammer.tooltip": "§7Impact Modulator", - "gtceu.machine.opv_forming_press.tooltip": "§7Surface Shifter", - "gtceu.machine.opv_gas_collector.tooltip": "§7Collects Gas from the universe depending on the dimension", - "gtceu.machine.opv_laser_engraver.tooltip": "§7Exact Photon Cannon", - "gtceu.machine.opv_lathe.tooltip": "§7Rotation Grinder", - "gtceu.machine.opv_macerator.tooltip": "§7Shape Eliminator", - "gtceu.machine.opv_mass_fabricator.tooltip": "§7Existence Initiator", - "gtceu.machine.opv_mixer.tooltip": "§7Material Homogenizer", - "gtceu.machine.opv_ore_washer.tooltip": "§7Miniature Car Wash", - "gtceu.machine.opv_packer.tooltip": "§7Amazon Warehouse", - "gtceu.machine.opv_polarizer.tooltip": "§7Magnetic Field Rearranger", - "gtceu.machine.opv_replicator.tooltip": "§7Elemental Composer", - "gtceu.machine.opv_rock_crusher.tooltip": "§7Volcanic Formation Chamber", - "gtceu.machine.opv_scanner.tooltip": "§7Electron Microscope", - "gtceu.machine.opv_sifter.tooltip": "§7Pulsation Filter", - "gtceu.machine.opv_thermal_centrifuge.tooltip": "§7Fire Cyclone", - "gtceu.machine.opv_wiremill.tooltip": "§7Wire Transfigurator", "gtceu.machine.parallel_hatch.display": "Adjust the maximum parallel of the multiblock", "gtceu.machine.parallel_hatch_mk5.tooltip": "Allows to run up to 4 recipes in parallel.", "gtceu.machine.parallel_hatch_mk6.tooltip": "Allows to run up to 16 recipes in parallel.", @@ -3036,7 +2666,6 @@ "gtceu.machine.parallel_limit": "Can run up to §b%d§r§7 Recipes at once.", "gtceu.machine.passthrough_hatch_fluid.tooltip": "Sends Fluids from one Side to the other", "gtceu.machine.passthrough_hatch_item.tooltip": "Sends Items from one Side to the other", - "gtceu.machine.perfect_oc": "Does not lose energy efficiency when overclocked.", "gtceu.machine.power_substation.tooltip.0": "The heart of a centralized power grid", "gtceu.machine.power_substation.tooltip.1": "§fCapacitors§7 do not need to be all the same tier.", "gtceu.machine.power_substation.tooltip.2": "Allows up to §f%d Capacitor Layers§7.", @@ -3044,17 +2673,10 @@ "gtceu.machine.power_substation.tooltip.4": "Capped at §f%d kEU/t§7 passive loss per Capacitor Block.", "gtceu.machine.power_substation.tooltip.5": "Can use", "gtceu.machine.power_substation.tooltip.6": " Laser Hatches§7.", - "gtceu.machine.primitive_blast_furnace.bronze.tooltip": "Making your first Steel", - "gtceu.machine.primitive_water_pump.tooltip": "Endervoir at Home", "gtceu.machine.processing_array.tooltip": "When a few Machines just doesn't cut it", - "gtceu.machine.pump.tooltip": "§7The best way to empty Oceans!", - "gtceu.machine.pump.tooltip_buckets": "§f%d §7ticks per Bucket", "gtceu.machine.pump_hatch.tooltip": "Primitive Fluid Output for Water Pump", "gtceu.machine.pyrolyse_oven.tooltip": "Electric Coke Oven", "gtceu.machine.pyrolyse_oven.tooltip.1": "§6Cupronickel §7coils are §f25%%§7 slower. Every coil after §bKanthal§7 increases speed by §f50%%§7.", - "gtceu.machine.quantum_chest.items_stored": "Item Amount:", - "gtceu.machine.quantum_chest.tooltip": "§7Better than Storage Drawers", - "gtceu.machine.quantum_tank.tooltip": "§7Compact place to store all your fluids", "gtceu.machine.research_station.researching": "Researching.", "gtceu.machine.research_station.tooltip.0": "More than just a Multiblock Scanner", "gtceu.machine.research_station.tooltip.1": "Used to scan onto §fData Orbs§7 and §fData Modules§7.", @@ -3062,245 +2684,9 @@ "gtceu.machine.research_station.tooltip.3": "Providing more Computation allows the recipe to run faster.", "gtceu.machine.rotor_holder.tooltip.0": "Rotor Holder for Multiblocks", "gtceu.machine.rotor_holder.tooltip.1": "Holds Rotor in place so it will not fly away", - "gtceu.machine.steam.steam_hatch.tooltip": "§eAccepted Fluid: §fSteam", - "gtceu.machine.steam_boiler.heat_amount": "Heat Capacity: %s %%", - "gtceu.machine.steam_bus.tooltip": "Does not work with non-steam multiblocks", - "gtceu.machine.steam_grinder.tooltip": "A multiblock Macerator without the Byproducts", - "gtceu.machine.steam_oven.tooltip": "Not to be confused with Multi-Smelter", "gtceu.machine.substation_hatch.input.tooltip": "Energy Input for the Power Substation", "gtceu.machine.substation_hatch.output.tooltip": "Energy Output for the Power Substation", "gtceu.machine.tank_valve.tooltip": "Use to fill and drain multiblock tanks. Auto outputs when facing down.", - "gtceu.machine.transformer.description": "§7Transforms Energy between voltage tiers", - "gtceu.machine.transformer.message_transform_down": "Transforming Down, In: %s EU %dA, Out: %s EU %dA", - "gtceu.machine.transformer.message_transform_up": "Transforming Up, In: %s EU %dA, Out: %s EU %dA", - "gtceu.machine.transformer.tooltip_tool_usage": "§7Starts as §fTransform Down§7, use Screwdriver to change", - "gtceu.machine.transformer.tooltip_transform_down": "§aTransform Down: §f%dA %s EU (%s§f) -> %dA %s EU (%s§f)", - "gtceu.machine.transformer.tooltip_transform_up": "§cTransform Up: §f%dA %s EU (%s§f) -> %dA %s EU (%s§f)", - "gtceu.machine.uev_alloy_smelter.tooltip": "§7Metal Amalgamator", - "gtceu.machine.uev_arc_furnace.tooltip": "§7Short Circuit Heater", - "gtceu.machine.uev_assembler.tooltip": "§7Assembly Constructor", - "gtceu.machine.uev_autoclave.tooltip": "§7Encumbrance Unit", - "gtceu.machine.uev_bender.tooltip": "§7Matter Deformer", - "gtceu.machine.uev_brewery.tooltip": "§7Brew Rusher", - "gtceu.machine.uev_canner.tooltip": "§7Can Actuator", - "gtceu.machine.uev_centrifuge.tooltip": "§7Molecular Tornado", - "gtceu.machine.uev_chemical_bath.tooltip": "§7Chemical Dunktron", - "gtceu.machine.uev_chemical_reactor.tooltip": "§7Reaction Catalyzer", - "gtceu.machine.uev_circuit_assembler.tooltip": "§7Computation Factory", - "gtceu.machine.uev_compressor.tooltip": "§7Matter Constrictor", - "gtceu.machine.uev_cutter.tooltip": "§7Object Divider", - "gtceu.machine.uev_distillery.tooltip": "§7Fraction Splitter", - "gtceu.machine.uev_electric_furnace.tooltip": "§7Atom Stimulator", - "gtceu.machine.uev_electrolyzer.tooltip": "§7Atomic Ionizer", - "gtceu.machine.uev_electromagnetic_separator.tooltip": "§7EMF Dispeller", - "gtceu.machine.uev_extractor.tooltip": "§7Liquefying Sucker", - "gtceu.machine.uev_extruder.tooltip": "§7Shape Driver", - "gtceu.machine.uev_fermenter.tooltip": "§7Respiration Controller", - "gtceu.machine.uev_fluid_heater.tooltip": "§7Thermal Imbuer", - "gtceu.machine.uev_fluid_solidifier.tooltip": "§7Fluid Petrificator", - "gtceu.machine.uev_forge_hammer.tooltip": "§7Impact Modulator", - "gtceu.machine.uev_forming_press.tooltip": "§7Surface Shifter", - "gtceu.machine.uev_gas_collector.tooltip": "§7Collects Gas from the solar system depending on the dimension", - "gtceu.machine.uev_laser_engraver.tooltip": "§7Exact Photon Cannon", - "gtceu.machine.uev_lathe.tooltip": "§7Rotation Grinder", - "gtceu.machine.uev_macerator.tooltip": "§7Shape Eliminator", - "gtceu.machine.uev_mass_fabricator.tooltip": "§7Existence Initiator", - "gtceu.machine.uev_mixer.tooltip": "§7Material Homogenizer", - "gtceu.machine.uev_ore_washer.tooltip": "§7Miniature Car Wash", - "gtceu.machine.uev_packer.tooltip": "§7Amazon Warehouse", - "gtceu.machine.uev_polarizer.tooltip": "§7Magnetic Field Rearranger", - "gtceu.machine.uev_replicator.tooltip": "§7Elemental Composer", - "gtceu.machine.uev_rock_crusher.tooltip": "§7Volcanic Formation Chamber", - "gtceu.machine.uev_scanner.tooltip": "§7Electron Microscope", - "gtceu.machine.uev_sifter.tooltip": "§7Pulsation Filter", - "gtceu.machine.uev_thermal_centrifuge.tooltip": "§7Fire Cyclone", - "gtceu.machine.uev_wiremill.tooltip": "§7Wire Transfigurator", - "gtceu.machine.uhv_alloy_smelter.tooltip": "§7Metal Amalgamator", - "gtceu.machine.uhv_arc_furnace.tooltip": "§7Short Circuit Heater", - "gtceu.machine.uhv_assembler.tooltip": "§7Assembly Constructor", - "gtceu.machine.uhv_autoclave.tooltip": "§7Encumbrance Unit", - "gtceu.machine.uhv_bender.tooltip": "§7Matter Deformer", - "gtceu.machine.uhv_brewery.tooltip": "§7Brew Rusher", - "gtceu.machine.uhv_canner.tooltip": "§7Can Actuator", - "gtceu.machine.uhv_centrifuge.tooltip": "§7Molecular Tornado", - "gtceu.machine.uhv_chemical_bath.tooltip": "§7Chemical Dunktron", - "gtceu.machine.uhv_chemical_reactor.tooltip": "§7Reaction Catalyzer", - "gtceu.machine.uhv_circuit_assembler.tooltip": "§7Computation Factory", - "gtceu.machine.uhv_compressor.tooltip": "§7Matter Constrictor", - "gtceu.machine.uhv_cutter.tooltip": "§7Object Divider", - "gtceu.machine.uhv_distillery.tooltip": "§7Fraction Splitter", - "gtceu.machine.uhv_electric_furnace.tooltip": "§7Atom Stimulator", - "gtceu.machine.uhv_electrolyzer.tooltip": "§7Atomic Ionizer", - "gtceu.machine.uhv_electromagnetic_separator.tooltip": "§7EMF Dispeller", - "gtceu.machine.uhv_extractor.tooltip": "§7Liquefying Sucker", - "gtceu.machine.uhv_extruder.tooltip": "§7Shape Driver", - "gtceu.machine.uhv_fermenter.tooltip": "§7Respiration Controller", - "gtceu.machine.uhv_fluid_heater.tooltip": "§7Thermal Imbuer", - "gtceu.machine.uhv_fluid_solidifier.tooltip": "§7Fluid Petrificator", - "gtceu.machine.uhv_forge_hammer.tooltip": "§7Impact Modulator", - "gtceu.machine.uhv_forming_press.tooltip": "§7Surface Shifter", - "gtceu.machine.uhv_gas_collector.tooltip": "§7Collects Gas from the solar system depending on the dimension", - "gtceu.machine.uhv_laser_engraver.tooltip": "§7Exact Photon Cannon", - "gtceu.machine.uhv_lathe.tooltip": "§7Rotation Grinder", - "gtceu.machine.uhv_macerator.tooltip": "§7Shape Eliminator", - "gtceu.machine.uhv_mass_fabricator.tooltip": "§7Existence Initiator", - "gtceu.machine.uhv_mixer.tooltip": "§7Material Homogenizer", - "gtceu.machine.uhv_ore_washer.tooltip": "§7Miniature Car Wash", - "gtceu.machine.uhv_packer.tooltip": "§7Amazon Warehouse", - "gtceu.machine.uhv_polarizer.tooltip": "§7Magnetic Field Rearranger", - "gtceu.machine.uhv_replicator.tooltip": "§7Elemental Composer", - "gtceu.machine.uhv_rock_crusher.tooltip": "§7Volcanic Formation Chamber", - "gtceu.machine.uhv_scanner.tooltip": "§7Electron Microscope", - "gtceu.machine.uhv_sifter.tooltip": "§7Pulsation Filter", - "gtceu.machine.uhv_thermal_centrifuge.tooltip": "§7Fire Cyclone", - "gtceu.machine.uhv_wiremill.tooltip": "§7Wire Transfigurator", - "gtceu.machine.uiv_alloy_smelter.tooltip": "§7Metal Amalgamator", - "gtceu.machine.uiv_arc_furnace.tooltip": "§7Short Circuit Heater", - "gtceu.machine.uiv_assembler.tooltip": "§7Assembly Constructor", - "gtceu.machine.uiv_autoclave.tooltip": "§7Encumbrance Unit", - "gtceu.machine.uiv_bender.tooltip": "§7Matter Deformer", - "gtceu.machine.uiv_brewery.tooltip": "§7Brew Rusher", - "gtceu.machine.uiv_canner.tooltip": "§7Can Actuator", - "gtceu.machine.uiv_centrifuge.tooltip": "§7Molecular Tornado", - "gtceu.machine.uiv_chemical_bath.tooltip": "§7Chemical Dunktron", - "gtceu.machine.uiv_chemical_reactor.tooltip": "§7Reaction Catalyzer", - "gtceu.machine.uiv_circuit_assembler.tooltip": "§7Computation Factory", - "gtceu.machine.uiv_compressor.tooltip": "§7Matter Constrictor", - "gtceu.machine.uiv_cutter.tooltip": "§7Object Divider", - "gtceu.machine.uiv_distillery.tooltip": "§7Fraction Splitter", - "gtceu.machine.uiv_electric_furnace.tooltip": "§7Atom Stimulator", - "gtceu.machine.uiv_electrolyzer.tooltip": "§7Atomic Ionizer", - "gtceu.machine.uiv_electromagnetic_separator.tooltip": "§7EMF Dispeller", - "gtceu.machine.uiv_extractor.tooltip": "§7Liquefying Sucker", - "gtceu.machine.uiv_extruder.tooltip": "§7Shape Driver", - "gtceu.machine.uiv_fermenter.tooltip": "§7Respiration Controller", - "gtceu.machine.uiv_fluid_heater.tooltip": "§7Thermal Imbuer", - "gtceu.machine.uiv_fluid_solidifier.tooltip": "§7Fluid Petrificator", - "gtceu.machine.uiv_forge_hammer.tooltip": "§7Impact Modulator", - "gtceu.machine.uiv_forming_press.tooltip": "§7Surface Shifter", - "gtceu.machine.uiv_gas_collector.tooltip": "§7Collects Gas from the solar system depending on the dimension", - "gtceu.machine.uiv_laser_engraver.tooltip": "§7Exact Photon Cannon", - "gtceu.machine.uiv_lathe.tooltip": "§7Rotation Grinder", - "gtceu.machine.uiv_macerator.tooltip": "§7Shape Eliminator", - "gtceu.machine.uiv_mass_fabricator.tooltip": "§7Existence Initiator", - "gtceu.machine.uiv_mixer.tooltip": "§7Material Homogenizer", - "gtceu.machine.uiv_ore_washer.tooltip": "§7Miniature Car Wash", - "gtceu.machine.uiv_packer.tooltip": "§7Amazon Warehouse", - "gtceu.machine.uiv_polarizer.tooltip": "§7Magnetic Field Rearranger", - "gtceu.machine.uiv_replicator.tooltip": "§7Elemental Composer", - "gtceu.machine.uiv_rock_crusher.tooltip": "§7Volcanic Formation Chamber", - "gtceu.machine.uiv_scanner.tooltip": "§7Electron Microscope", - "gtceu.machine.uiv_sifter.tooltip": "§7Pulsation Filter", - "gtceu.machine.uiv_thermal_centrifuge.tooltip": "§7Fire Cyclone", - "gtceu.machine.uiv_wiremill.tooltip": "§7Wire Transfigurator", - "gtceu.machine.ulv_alloy_smelter.tooltip": "§7HighTech combination Smelter", - "gtceu.machine.ulv_arc_furnace.tooltip": "§7Who needs a Blast Furnace?", - "gtceu.machine.ulv_assembler.tooltip": "§7Avengers, Assemble!", - "gtceu.machine.ulv_autoclave.tooltip": "§7Crystallizing your Dusts", - "gtceu.machine.ulv_bender.tooltip": "§7Boo, he's bad! We want BENDER!!!", - "gtceu.machine.ulv_brewery.tooltip": "§7Compact and efficient potion brewing", - "gtceu.machine.ulv_canner.tooltip": "§7Puts things into and out of Containers", - "gtceu.machine.ulv_chemical_bath.tooltip": "§7Bathing Ores in Chemicals to separate them", - "gtceu.machine.ulv_chemical_reactor.tooltip": "§7Letting Chemicals react with each other", - "gtceu.machine.ulv_circuit_assembler.tooltip": "§7Pick-n-Place all over the place", - "gtceu.machine.ulv_compressor.tooltip": "§7Compress-O-Matic C77", - "gtceu.machine.ulv_cutter.tooltip": "§7Slice'N Dice", - "gtceu.machine.ulv_distillery.tooltip": "§7Extracting most relevant Parts of Fluids", - "gtceu.machine.ulv_electric_furnace.tooltip": "§7Not like using a Commodore 64", - "gtceu.machine.ulv_electromagnetic_separator.tooltip": "§7Separating the magnetic Ores from the rest", - "gtceu.machine.ulv_extractor.tooltip": "§7Dejuicer-Device of Doom - D123", - "gtceu.machine.ulv_extruder.tooltip": "§7Universal Machine for Metal Working", - "gtceu.machine.ulv_fermenter.tooltip": "§7Fermenting Fluids", - "gtceu.machine.ulv_fluid_heater.tooltip": "§7Heating up your Fluids", - "gtceu.machine.ulv_fluid_solidifier.tooltip": "§7Cools Fluids down to form Solids", - "gtceu.machine.ulv_forge_hammer.tooltip": "§7Stop, Hammertime!", - "gtceu.machine.ulv_forming_press.tooltip": "§7Imprinting Images into things", - "gtceu.machine.ulv_mass_fabricator.tooltip": "§7UUM Matter * Fabrication Squared", - "gtceu.machine.ulv_mixer.tooltip": "§7Will it Blend?", - "gtceu.machine.ulv_packer.tooltip": "§7Puts things into and Grabs things out of Boxes", - "gtceu.machine.ulv_polarizer.tooltip": "§7Bipolarising your Magnets", - "gtceu.machine.ulv_replicator.tooltip": "§7Producing the Purest of Elements", - "gtceu.machine.ulv_scanner.tooltip": "§7Scans Materials and other things", - "gtceu.machine.ulv_sifter.tooltip": "§7Stay calm and keep sifting", - "gtceu.machine.ulv_wiremill.tooltip": "§7Produces Wires more efficiently", - "gtceu.machine.uv_alloy_smelter.tooltip": "§7Metal Amalgamator", - "gtceu.machine.uv_arc_furnace.tooltip": "§7Short Circuit Heater", - "gtceu.machine.uv_assembler.tooltip": "§7Assembly Constructor", - "gtceu.machine.uv_autoclave.tooltip": "§7Encumbrance Unit", - "gtceu.machine.uv_bender.tooltip": "§7Matter Deformer", - "gtceu.machine.uv_brewery.tooltip": "§7Brew Rusher", - "gtceu.machine.uv_canner.tooltip": "§7Can Actuator", - "gtceu.machine.uv_centrifuge.tooltip": "§7Molecular Tornado", - "gtceu.machine.uv_chemical_bath.tooltip": "§7Chemical Dunktron", - "gtceu.machine.uv_chemical_reactor.tooltip": "§7Reaction Catalyzer", - "gtceu.machine.uv_circuit_assembler.tooltip": "§7Computation Factory", - "gtceu.machine.uv_compressor.tooltip": "§7Matter Constrictor", - "gtceu.machine.uv_cutter.tooltip": "§7Object Divider", - "gtceu.machine.uv_distillery.tooltip": "§7Fraction Splitter", - "gtceu.machine.uv_electric_furnace.tooltip": "§7Atom Stimulator", - "gtceu.machine.uv_electrolyzer.tooltip": "§7Atomic Ionizer", - "gtceu.machine.uv_electromagnetic_separator.tooltip": "§7EMF Dispeller", - "gtceu.machine.uv_extractor.tooltip": "§7Liquefying Sucker", - "gtceu.machine.uv_extruder.tooltip": "§7Shape Driver", - "gtceu.machine.uv_fermenter.tooltip": "§7Respiration Controller", - "gtceu.machine.uv_fluid_heater.tooltip": "§7Thermal Imbuer", - "gtceu.machine.uv_fluid_solidifier.tooltip": "§7Fluid Petrificator", - "gtceu.machine.uv_forge_hammer.tooltip": "§7Impact Modulator", - "gtceu.machine.uv_forming_press.tooltip": "§7Surface Shifter", - "gtceu.machine.uv_gas_collector.tooltip": "§7Collects Gas from the solar system depending on the dimension", - "gtceu.machine.uv_laser_engraver.tooltip": "§7Exact Photon Cannon", - "gtceu.machine.uv_lathe.tooltip": "§7Rotation Grinder", - "gtceu.machine.uv_macerator.tooltip": "§7Shape Eliminator", - "gtceu.machine.uv_mass_fabricator.tooltip": "§7Existence Initiator", - "gtceu.machine.uv_mixer.tooltip": "§7Material Homogenizer", - "gtceu.machine.uv_ore_washer.tooltip": "§7Miniature Car Wash", - "gtceu.machine.uv_packer.tooltip": "§7Amazon Warehouse", - "gtceu.machine.uv_polarizer.tooltip": "§7Magnetic Field Rearranger", - "gtceu.machine.uv_replicator.tooltip": "§7Elemental Composer", - "gtceu.machine.uv_rock_crusher.tooltip": "§7Volcanic Formation Chamber", - "gtceu.machine.uv_scanner.tooltip": "§7Electron Microscope", - "gtceu.machine.uv_sifter.tooltip": "§7Pulsation Filter", - "gtceu.machine.uv_thermal_centrifuge.tooltip": "§7Fire Cyclone", - "gtceu.machine.uv_wiremill.tooltip": "§7Wire Transfigurator", - "gtceu.machine.uxv_alloy_smelter.tooltip": "§7Metal Amalgamator", - "gtceu.machine.uxv_arc_furnace.tooltip": "§7Short Circuit Heater", - "gtceu.machine.uxv_assembler.tooltip": "§7Assembly Constructor", - "gtceu.machine.uxv_autoclave.tooltip": "§7Encumbrance Unit", - "gtceu.machine.uxv_bender.tooltip": "§7Matter Deformer", - "gtceu.machine.uxv_brewery.tooltip": "§7Brew Rusher", - "gtceu.machine.uxv_canner.tooltip": "§7Can Actuator", - "gtceu.machine.uxv_centrifuge.tooltip": "§7Molecular Tornado", - "gtceu.machine.uxv_chemical_bath.tooltip": "§7Chemical Dunktron", - "gtceu.machine.uxv_chemical_reactor.tooltip": "§7Reaction Catalyzer", - "gtceu.machine.uxv_circuit_assembler.tooltip": "§7Computation Factory", - "gtceu.machine.uxv_compressor.tooltip": "§7Matter Constrictor", - "gtceu.machine.uxv_cutter.tooltip": "§7Object Divider", - "gtceu.machine.uxv_distillery.tooltip": "§7Fraction Splitter", - "gtceu.machine.uxv_electric_furnace.tooltip": "§7Atom Stimulator", - "gtceu.machine.uxv_electrolyzer.tooltip": "§7Atomic Ionizer", - "gtceu.machine.uxv_electromagnetic_separator.tooltip": "§7EMF Dispeller", - "gtceu.machine.uxv_extractor.tooltip": "§7Liquefying Sucker", - "gtceu.machine.uxv_extruder.tooltip": "§7Shape Driver", - "gtceu.machine.uxv_fermenter.tooltip": "§7Respiration Controller", - "gtceu.machine.uxv_fluid_heater.tooltip": "§7Thermal Imbuer", - "gtceu.machine.uxv_fluid_solidifier.tooltip": "§7Fluid Petrificator", - "gtceu.machine.uxv_forge_hammer.tooltip": "§7Impact Modulator", - "gtceu.machine.uxv_forming_press.tooltip": "§7Surface Shifter", - "gtceu.machine.uxv_gas_collector.tooltip": "§7Collects Gas from the solar system depending on the dimension", - "gtceu.machine.uxv_laser_engraver.tooltip": "§7Exact Photon Cannon", - "gtceu.machine.uxv_lathe.tooltip": "§7Rotation Grinder", - "gtceu.machine.uxv_macerator.tooltip": "§7Shape Eliminator", - "gtceu.machine.uxv_mass_fabricator.tooltip": "§7Existence Initiator", - "gtceu.machine.uxv_mixer.tooltip": "§7Material Homogenizer", - "gtceu.machine.uxv_ore_washer.tooltip": "§7Miniature Car Wash", - "gtceu.machine.uxv_packer.tooltip": "§7Amazon Warehouse", - "gtceu.machine.uxv_polarizer.tooltip": "§7Magnetic Field Rearranger", - "gtceu.machine.uxv_replicator.tooltip": "§7Elemental Composer", - "gtceu.machine.uxv_rock_crusher.tooltip": "§7Volcanic Formation Chamber", - "gtceu.machine.uxv_scanner.tooltip": "§7Electron Microscope", - "gtceu.machine.uxv_sifter.tooltip": "§7Pulsation Filter", - "gtceu.machine.uxv_thermal_centrifuge.tooltip": "§7Fire Cyclone", - "gtceu.machine.uxv_wiremill.tooltip": "§7Wire Transfigurator", "gtceu.machine.vacuum_freezer.tooltip": "Aluminium Ice Box", "gtceu.machine.workbench.storage_note.0": "(Available items from connected", "gtceu.machine.workbench.storage_note.1": "inventories usable for crafting)", @@ -3310,51 +2696,6 @@ "gtceu.machine.workbench.tab.workbench": "Crafting", "gtceu.machine.workbench.tooltip.0": "Better than Forestry", "gtceu.machine.workbench.tooltip.1": "Has Item Storage, Tool Storage, pulls from adjacent Inventories, and saves Recipes.", - "gtceu.machine.world_accelerator.description": "Tick accelerates nearby blocks in one of 2 modes: §fTile Entity§7 or §fRandom Tick§7. Use Screwdriver to change mode.", - "gtceu.machine.world_accelerator.mode_entity": "Random Tick Mode", - "gtceu.machine.world_accelerator.mode_tile": "Block Entity Mode", - "gtceu.machine.world_accelerator.working_area": "§bWorking Area:", - "gtceu.machine.world_accelerator.working_area_random": " Random Tick Mode:§f %dx%d", - "gtceu.machine.world_accelerator.working_area_tile": " Block Entity Mode:§f Adjacent Blocks", - "gtceu.machine.zpm_alloy_smelter.tooltip": "§7Alloy Integrator", - "gtceu.machine.zpm_arc_furnace.tooltip": "§7Discharge Heater", - "gtceu.machine.zpm_assembler.tooltip": "§7NOT a Crafting Table", - "gtceu.machine.zpm_autoclave.tooltip": "§7Pressure Cooker", - "gtceu.machine.zpm_bender.tooltip": "§7Shape Distorter", - "gtceu.machine.zpm_brewery.tooltip": "§7Brewing your Drinks", - "gtceu.machine.zpm_canner.tooltip": "§7Can Operator", - "gtceu.machine.zpm_centrifuge.tooltip": "§7Molecular Cyclone", - "gtceu.machine.zpm_chemical_bath.tooltip": "§7Chemical Soaker", - "gtceu.machine.zpm_chemical_reactor.tooltip": "§7Chemical Performer", - "gtceu.machine.zpm_circuit_assembler.tooltip": "§7Electronics Manufacturer", - "gtceu.machine.zpm_compressor.tooltip": "§7Singularity Condenser", - "gtceu.machine.zpm_cutter.tooltip": "§7Matter Cleaver", - "gtceu.machine.zpm_distillery.tooltip": "§7Condensation Separator", - "gtceu.machine.zpm_electric_furnace.tooltip": "§7Electron Excitement Processor", - "gtceu.machine.zpm_electrolyzer.tooltip": "§7Molecular Disintegrator E-4908", - "gtceu.machine.zpm_electromagnetic_separator.tooltip": "§7EM Categorizer", - "gtceu.machine.zpm_extractor.tooltip": "§7Vacuum Extractinator", - "gtceu.machine.zpm_extruder.tooltip": "§7Material Displacer", - "gtceu.machine.zpm_fermenter.tooltip": "§7Fermentation Hastener", - "gtceu.machine.zpm_fluid_heater.tooltip": "§7Heat Infuser", - "gtceu.machine.zpm_fluid_solidifier.tooltip": "§7Not an Ice Machine", - "gtceu.machine.zpm_forge_hammer.tooltip": "§7Plate Forger", - "gtceu.machine.zpm_forming_press.tooltip": "§7Object Layerer", - "gtceu.machine.zpm_gas_collector.tooltip": "§7Collects Gas from the atmosphere depending on the dimension", - "gtceu.machine.zpm_laser_engraver.tooltip": "§7With the Power of 32.64 MW", - "gtceu.machine.zpm_lathe.tooltip": "§7Turn-O-Matic L-5908", - "gtceu.machine.zpm_macerator.tooltip": "§7Blend-O-Matic 9003", - "gtceu.machine.zpm_mass_fabricator.tooltip": "§7Genesis Factory", - "gtceu.machine.zpm_mixer.tooltip": "§7Matter Organizer", - "gtceu.machine.zpm_ore_washer.tooltip": "§7Repurposed Laundry-Washer I-362", - "gtceu.machine.zpm_packer.tooltip": "§7Boxinator", - "gtceu.machine.zpm_polarizer.tooltip": "§7Magnetism Inducer", - "gtceu.machine.zpm_replicator.tooltip": "§7Matter Paster", - "gtceu.machine.zpm_rock_crusher.tooltip": "§7Cryogenic Magma Solidifier R-10200", - "gtceu.machine.zpm_scanner.tooltip": "§7Anomaly Detector", - "gtceu.machine.zpm_sifter.tooltip": "§7Sponsored by TFC", - "gtceu.machine.zpm_thermal_centrifuge.tooltip": "§7Blaze Sweatshop T-6352", - "gtceu.machine.zpm_wiremill.tooltip": "§7Ingot Elongator", "gtceu.maintenance.configurable_duration": "Duration: %fx", "gtceu.maintenance.configurable_duration.changed_description": "Recipes will run with %fx duration, applied before overclocking.", "gtceu.maintenance.configurable_duration.modify": "Modify Duration:", @@ -4842,6 +4183,665 @@ "ldlib.gui.editor.register.widget.container.gtm_item_slot": "GTM Item Slot", "ldlib.gui.editor.register.widget.container.gtm_phantom_fluid_slot": "GTM Phantom Fluid Slot", "ldlib.gui.editor.register.widget.container.gtm_phantom_item_slot": "GTM Phantom Item Slot", + "machine.gtceu.available_recipe_map_1.tooltip": "Available Recipe Types: %s", + "machine.gtceu.available_recipe_map_2.tooltip": "Available Recipe Types: %s, %s", + "machine.gtceu.available_recipe_map_3.tooltip": "Available Recipe Types: %s, %s, %s", + "machine.gtceu.available_recipe_map_4.tooltip": "Available Recipe Types: %s, %s, %s, %s", + "machine.gtceu.basic.input_from_output_side.allow": "Allow Input from Output Side: ", + "machine.gtceu.basic.input_from_output_side.disallow": "Disallow Input from Output Side: ", + "machine.gtceu.block_breaker.speed_bonus": "§eSpeed Bonus: §f%d%%", + "machine.gtceu.block_breaker.tooltip": "§7Mines block on front face and collects its drops", + "machine.gtceu.boiler.heat_info": "Heat Capacity: %s %%", + "machine.gtceu.boiler.info.cooling.down": "§9Cooling down§r%s", + "machine.gtceu.boiler.info.heating.up": "§cHeating up§r%s", + "machine.gtceu.boiler.info.producing.steam": " §a(boiling water)", + "machine.gtceu.bronze_large_boiler.tooltip": "We need more Steam!", + "machine.gtceu.buffer.tooltip": "A Small Buffer to store Items and Fluids", + "machine.gtceu.coke_oven.tooltip": "Making better fuels for Steel and Power", + "machine.gtceu.diodemessage": "Max Amperage throughput: %s", + "machine.gtceu.diodetooltip_general": "Allows Energy Flow in one direction and limits Amperage", + "machine.gtceu.diodetooltip_starts_at": "Starts as §f1A§7, use Soft Mallet to change", + "machine.gtceu.diodetooltip_tool_usage": "Hit with a Soft Mallet to change Amperage flow.", + "machine.gtceu.drum.disable_output": "Will not drain Fluid", + "machine.gtceu.drum.enable_output": "Will drain Fluid to downward adjacent Tanks", + "machine.gtceu.electric_blast_furnace.tooltip": "Where's the electric smoker?", + "machine.gtceu.electric_blast_furnace.tooltip.0": "For every §f900K§7 above the recipe temperature, a multiplicative §f95%%§7 energy multiplier is applied pre-overclocking.", + "machine.gtceu.electric_blast_furnace.tooltip.1": "For every §f1800K§7 above the recipe temperature, one overclock becomes §f100%% efficient§7 (perfect overclock).", + "machine.gtceu.electric_blast_furnace.tooltip.2": "For every voltage tier above §bMV§7, temperature is increased by §f100K§7.", + "machine.gtceu.energy_converter.description": "Converts Energy between EU and FE", + "machine.gtceu.energy_converter.message_conversion_eu": "Converting EU, In: %dA %d EU, Out: %d Native", + "machine.gtceu.energy_converter.message_conversion_native": "Converting Native Energy, In: %d FE, Out: %dA %d EU", + "machine.gtceu.energy_converter.tooltip_conversion_eu": "§aEU Conversion: §f%dA %d EU (%s§f) -> %d Native", + "machine.gtceu.energy_converter.tooltip_conversion_native": "§cNative Conversion: §f%d FE -> %dA %d EU (%s§f)", + "machine.gtceu.energy_converter.tooltip_tool_usage": "Starts as §fFE Converter§7, use Soft Mallet to change", + "machine.gtceu.ev_alloy_smelter.tooltip": "§7HighTech combination Smelter", + "machine.gtceu.ev_arc_furnace.tooltip": "§7Who needs a Blast Furnace?", + "machine.gtceu.ev_assembler.tooltip": "§7Avengers, Assemble!", + "machine.gtceu.ev_autoclave.tooltip": "§7Crystallizing your Dusts", + "machine.gtceu.ev_bender.tooltip": "§7Boo, he's bad! We want BENDER!!!", + "machine.gtceu.ev_brewery.tooltip": "§7Compact and efficient potion brewing", + "machine.gtceu.ev_canner.tooltip": "§7Puts things into and out of Containers", + "machine.gtceu.ev_centrifuge.tooltip": "§7Molecular Separator", + "machine.gtceu.ev_chemical_bath.tooltip": "§7Bathing Ores in Chemicals to separate them", + "machine.gtceu.ev_chemical_reactor.tooltip": "§7Letting Chemicals react with each other", + "machine.gtceu.ev_circuit_assembler.tooltip": "§7Pick-n-Place all over the place", + "machine.gtceu.ev_compressor.tooltip": "§7Compress-O-Matic C77", + "machine.gtceu.ev_cutter.tooltip": "§7Slice'N Dice", + "machine.gtceu.ev_distillery.tooltip": "§7Extracting most relevant Parts of Fluids", + "machine.gtceu.ev_electric_furnace.tooltip": "§7Not like using a Commodore 64", + "machine.gtceu.ev_electrolyzer.tooltip": "§7Electrolyzing Molecules", + "machine.gtceu.ev_electromagnetic_separator.tooltip": "§7Separating the magnetic Ores from the rest", + "machine.gtceu.ev_extractor.tooltip": "§7Dejuicer-Device of Doom - D123", + "machine.gtceu.ev_extruder.tooltip": "§7Universal Machine for Metal Working", + "machine.gtceu.ev_fermenter.tooltip": "§7Fermenting Fluids", + "machine.gtceu.ev_fluid_heater.tooltip": "§7Heating up your Fluids", + "machine.gtceu.ev_fluid_solidifier.tooltip": "§7Cools Fluids down to form Solids", + "machine.gtceu.ev_forge_hammer.tooltip": "§7Stop, Hammertime!", + "machine.gtceu.ev_forming_press.tooltip": "§7Imprinting Images into things", + "machine.gtceu.ev_gas_collector.tooltip": "§7Collects Gas from the air depending on the dimension", + "machine.gtceu.ev_laser_engraver.tooltip": "§7Don't look directly at the Laser", + "machine.gtceu.ev_lathe.tooltip": "§7Produces Rods more efficiently", + "machine.gtceu.ev_macerator.tooltip": "§7Shredding your Ores with Byproducts", + "machine.gtceu.ev_mass_fabricator.tooltip": "§7UUM Matter * Fabrication Squared", + "machine.gtceu.ev_mixer.tooltip": "§7Will it Blend?", + "machine.gtceu.ev_ore_washer.tooltip": "§7Getting more Byproducts from your Ores", + "machine.gtceu.ev_packer.tooltip": "§7Puts things into and Grabs things out of Boxes", + "machine.gtceu.ev_polarizer.tooltip": "§7Bipolarising your Magnets", + "machine.gtceu.ev_replicator.tooltip": "§7Producing the Purest of Elements", + "machine.gtceu.ev_rock_crusher.tooltip": "§7Place Water and Lava horizontally adjacent", + "machine.gtceu.ev_scanner.tooltip": "§7Scans Materials and other things", + "machine.gtceu.ev_sifter.tooltip": "§7Stay calm and keep sifting", + "machine.gtceu.ev_thermal_centrifuge.tooltip": "§7Separating Ores more precisely", + "machine.gtceu.ev_wiremill.tooltip": "§7Produces Wires more efficiently", + "machine.gtceu.fisher.requirement": "Requires a %dx%d centered square of water directly below.", + "machine.gtceu.fisher.speed": "Catches something every %d ticks", + "machine.gtceu.fisher.tooltip": "Costs string to fish. Consumes one string each time.", + "machine.gtceu.hp_steam_alloy_smelter.tooltip": "§7Combination Smelter", + "machine.gtceu.hp_steam_compressor.tooltip": "§7Compressing Items", + "machine.gtceu.hp_steam_extractor.tooltip": "§7Extracting your first Rubber", + "machine.gtceu.hp_steam_forge_hammer.tooltip": "§7Forge Hammer", + "machine.gtceu.hp_steam_furnace.tooltip": "§7Smelting things with compressed Steam", + "machine.gtceu.hp_steam_liquid_boiler.tooltip": "§7Faster than Small Steam Liquid Boiler", + "machine.gtceu.hp_steam_macerator.tooltip": "§7Macerating your Ores", + "machine.gtceu.hp_steam_miner.tooltip": "§7Mines ores below the Miner!", + "machine.gtceu.hp_steam_rock_crusher.tooltip": "§7Place Water and Lava horizontally adjacent", + "machine.gtceu.hp_steam_solar_boiler.tooltip": "§7Steam Power by Sun", + "machine.gtceu.hp_steam_solid_boiler.tooltip": "§7Faster than the Small Steam Solid Fuel Boiler", + "machine.gtceu.hull.tooltip": "§7You just need §5I§dm§4a§cg§ei§an§ba§3t§7i§1o§5n§7 to use this", + "machine.gtceu.hv_alloy_smelter.tooltip": "§7HighTech combination Smelter", + "machine.gtceu.hv_arc_furnace.tooltip": "§7Who needs a Blast Furnace?", + "machine.gtceu.hv_assembler.tooltip": "§7Avengers, Assemble!", + "machine.gtceu.hv_autoclave.tooltip": "§7Crystallizing your Dusts", + "machine.gtceu.hv_bender.tooltip": "§7Boo, he's bad! We want BENDER!!!", + "machine.gtceu.hv_brewery.tooltip": "§7Compact and efficient potion brewing", + "machine.gtceu.hv_canner.tooltip": "§7Puts things into and out of Containers", + "machine.gtceu.hv_centrifuge.tooltip": "§7Separating Molecules", + "machine.gtceu.hv_chemical_bath.tooltip": "§7Bathing Ores in Chemicals to separate them", + "machine.gtceu.hv_chemical_reactor.tooltip": "§7Letting Chemicals react with each other", + "machine.gtceu.hv_circuit_assembler.tooltip": "§7Pick-n-Place all over the place", + "machine.gtceu.hv_compressor.tooltip": "§7Compress-O-Matic C77", + "machine.gtceu.hv_cutter.tooltip": "§7Slice'N Dice", + "machine.gtceu.hv_distillery.tooltip": "§7Extracting most relevant Parts of Fluids", + "machine.gtceu.hv_electric_furnace.tooltip": "§7Not like using a Commodore 64", + "machine.gtceu.hv_electrolyzer.tooltip": "§7Electrolyzing Molecules", + "machine.gtceu.hv_electromagnetic_separator.tooltip": "§7Separating the magnetic Ores from the rest", + "machine.gtceu.hv_extractor.tooltip": "§7Dejuicer-Device of Doom - D123", + "machine.gtceu.hv_extruder.tooltip": "§7Universal Machine for Metal Working", + "machine.gtceu.hv_fermenter.tooltip": "§7Fermenting Fluids", + "machine.gtceu.hv_fluid_heater.tooltip": "§7Heating up your Fluids", + "machine.gtceu.hv_fluid_solidifier.tooltip": "§7Cools Fluids down to form Solids", + "machine.gtceu.hv_forge_hammer.tooltip": "§7Stop, Hammertime!", + "machine.gtceu.hv_forming_press.tooltip": "§7Imprinting Images into things", + "machine.gtceu.hv_gas_collector.tooltip": "§7Collects Gas from the air depending on the dimension", + "machine.gtceu.hv_laser_engraver.tooltip": "§7Don't look directly at the Laser", + "machine.gtceu.hv_lathe.tooltip": "§7Produces Rods more efficiently", + "machine.gtceu.hv_macerator.tooltip": "§7Shredding your Ores with Byproducts", + "machine.gtceu.hv_mass_fabricator.tooltip": "§7UUM Matter * Fabrication Squared", + "machine.gtceu.hv_mixer.tooltip": "§7Will it Blend?", + "machine.gtceu.hv_ore_washer.tooltip": "§7Getting more Byproducts from your Ores", + "machine.gtceu.hv_packer.tooltip": "§7Puts things into and Grabs things out of Boxes", + "machine.gtceu.hv_polarizer.tooltip": "§7Bipolarising your Magnets", + "machine.gtceu.hv_replicator.tooltip": "§7Producing the Purest of Elements", + "machine.gtceu.hv_rock_crusher.tooltip": "§7Place Water and Lava horizontally adjacent", + "machine.gtceu.hv_scanner.tooltip": "§7Scans Materials and other things", + "machine.gtceu.hv_sifter.tooltip": "§7Stay calm and keep sifting", + "machine.gtceu.hv_thermal_centrifuge.tooltip": "§7Separating Ores more precisely", + "machine.gtceu.hv_wiremill.tooltip": "§7Produces Wires more efficiently", + "machine.gtceu.item_collector.gui.collect_range": "Collect within an area of %sx%s blocks", + "machine.gtceu.item_collector.tooltip": "Collects Items around itself", + "machine.gtceu.iv_alloy_smelter.tooltip": "§7Alloy Integrator", + "machine.gtceu.iv_arc_furnace.tooltip": "§7Discharge Heater", + "machine.gtceu.iv_assembler.tooltip": "§7NOT a Crafting Table", + "machine.gtceu.iv_autoclave.tooltip": "§7Pressure Cooker", + "machine.gtceu.iv_bender.tooltip": "§7Shape Distorter", + "machine.gtceu.iv_brewery.tooltip": "§7Brewing your Drinks", + "machine.gtceu.iv_canner.tooltip": "§7Can Operator", + "machine.gtceu.iv_centrifuge.tooltip": "§7Molecular Cyclone", + "machine.gtceu.iv_chemical_bath.tooltip": "§7Chemical Soaker", + "machine.gtceu.iv_chemical_reactor.tooltip": "§7Chemical Performer", + "machine.gtceu.iv_circuit_assembler.tooltip": "§7Electronics Manufacturer", + "machine.gtceu.iv_compressor.tooltip": "§7Singularity Condenser", + "machine.gtceu.iv_cutter.tooltip": "§7Matter Cleaver", + "machine.gtceu.iv_distillery.tooltip": "§7Condensation Separator", + "machine.gtceu.iv_electric_furnace.tooltip": "§7Electron Excitement Processor", + "machine.gtceu.iv_electrolyzer.tooltip": "§7Molecular Disintegrator E-4906", + "machine.gtceu.iv_electromagnetic_separator.tooltip": "§7EM Categorizer", + "machine.gtceu.iv_extractor.tooltip": "§7Vacuum Extractinator", + "machine.gtceu.iv_extruder.tooltip": "§7Material Displacer", + "machine.gtceu.iv_fermenter.tooltip": "§7Fermentation Hastener", + "machine.gtceu.iv_fluid_heater.tooltip": "§7Heat Infuser", + "machine.gtceu.iv_fluid_solidifier.tooltip": "§7Not an Ice Machine", + "machine.gtceu.iv_forge_hammer.tooltip": "§7Plate Forger", + "machine.gtceu.iv_forming_press.tooltip": "§7Object Layerer", + "machine.gtceu.iv_gas_collector.tooltip": "§7Collects Gas from the atmosphere depending on the dimension", + "machine.gtceu.iv_laser_engraver.tooltip": "§7With the Power of 2.04 MW", + "machine.gtceu.iv_lathe.tooltip": "§7Turn-O-Matic L-5906", + "machine.gtceu.iv_macerator.tooltip": "§7Blend-O-Matic 9001", + "machine.gtceu.iv_mass_fabricator.tooltip": "§7Genesis Factory", + "machine.gtceu.iv_mixer.tooltip": "§7Matter Organizer", + "machine.gtceu.iv_ore_washer.tooltip": "§7Repurposed Laundry-Washer I-360", + "machine.gtceu.iv_packer.tooltip": "§7Boxinator", + "machine.gtceu.iv_polarizer.tooltip": "§7Magnetism Inducer", + "machine.gtceu.iv_replicator.tooltip": "§7Matter Paster", + "machine.gtceu.iv_rock_crusher.tooltip": "§7Cryogenic Magma Solidifier R-8200", + "machine.gtceu.iv_scanner.tooltip": "§7Anomaly Detector", + "machine.gtceu.iv_sifter.tooltip": "§7Sponsored by TFC", + "machine.gtceu.iv_thermal_centrifuge.tooltip": "§7Blaze Sweatshop T-6350", + "machine.gtceu.iv_wiremill.tooltip": "§7Ingot Elongator", + "machine.gtceu.large_chemical_reactor.tooltip": "Black Box Reactor", + "machine.gtceu.lp_steam_alloy_smelter.tooltip": "§7Combination Smelter", + "machine.gtceu.lp_steam_compressor.tooltip": "§7Compressing Items", + "machine.gtceu.lp_steam_extractor.tooltip": "§7Extracting your first Rubber", + "machine.gtceu.lp_steam_forge_hammer.tooltip": "§7Forge Hammer", + "machine.gtceu.lp_steam_furnace.tooltip": "§7Smelting things with compressed Steam", + "machine.gtceu.lp_steam_liquid_boiler.tooltip": "§7A Boiler running off Liquids", + "machine.gtceu.lp_steam_macerator.tooltip": "§7Macerating your Ores", + "machine.gtceu.lp_steam_miner.tooltip": "§7Mines ores below the Miner!", + "machine.gtceu.lp_steam_rock_crusher.tooltip": "§7Place Water and Lava horizontally adjacent", + "machine.gtceu.lp_steam_solar_boiler.tooltip": "§7Steam Power by Sun", + "machine.gtceu.lp_steam_solid_boiler.tooltip": "§7An early way to get Steam Power", + "machine.gtceu.luv_alloy_smelter.tooltip": "§7Alloy Integrator", + "machine.gtceu.luv_arc_furnace.tooltip": "§7Discharge Heater", + "machine.gtceu.luv_assembler.tooltip": "§7NOT a Crafting Table", + "machine.gtceu.luv_autoclave.tooltip": "§7Pressure Cooker", + "machine.gtceu.luv_bender.tooltip": "§7Shape Distorter", + "machine.gtceu.luv_brewery.tooltip": "§7Brewing your Drinks", + "machine.gtceu.luv_canner.tooltip": "§7Can Operator", + "machine.gtceu.luv_centrifuge.tooltip": "§7Molecular Cyclone", + "machine.gtceu.luv_chemical_bath.tooltip": "§7Chemical Soaker", + "machine.gtceu.luv_chemical_reactor.tooltip": "§7Chemical Performer", + "machine.gtceu.luv_circuit_assembler.tooltip": "§7Electronics Manufacturer", + "machine.gtceu.luv_compressor.tooltip": "§7Singularity Condenser", + "machine.gtceu.luv_cutter.tooltip": "§7Matter Cleaver", + "machine.gtceu.luv_distillery.tooltip": "§7Condensation Separator", + "machine.gtceu.luv_electric_furnace.tooltip": "§7Electron Excitement Processor", + "machine.gtceu.luv_electrolyzer.tooltip": "§7Molecular Disintegrator E-4907", + "machine.gtceu.luv_electromagnetic_separator.tooltip": "§7EM Categorizer", + "machine.gtceu.luv_extractor.tooltip": "§7Vacuum Extractinator", + "machine.gtceu.luv_extruder.tooltip": "§7Material Displacer", + "machine.gtceu.luv_fermenter.tooltip": "§7Fermentation Hastener", + "machine.gtceu.luv_fluid_heater.tooltip": "§7Heat Infuser", + "machine.gtceu.luv_fluid_solidifier.tooltip": "§7Not an Ice Machine", + "machine.gtceu.luv_forge_hammer.tooltip": "§7Plate Forger", + "machine.gtceu.luv_forming_press.tooltip": "§7Object Layerer", + "machine.gtceu.luv_gas_collector.tooltip": "§7Collects Gas from the atmosphere depending on the dimension", + "machine.gtceu.luv_laser_engraver.tooltip": "§7With the Power of 8.16 MW", + "machine.gtceu.luv_lathe.tooltip": "§7Turn-O-Matic L-5907", + "machine.gtceu.luv_macerator.tooltip": "§7Blend-O-Matic 9002", + "machine.gtceu.luv_mass_fabricator.tooltip": "§7Genesis Factory", + "machine.gtceu.luv_mixer.tooltip": "§7Matter Organizer", + "machine.gtceu.luv_ore_washer.tooltip": "§7Repurposed Laundry-Washer I-361", + "machine.gtceu.luv_packer.tooltip": "§7Boxinator", + "machine.gtceu.luv_polarizer.tooltip": "§7Magnetism Inducer", + "machine.gtceu.luv_replicator.tooltip": "§7Matter Paster", + "machine.gtceu.luv_rock_crusher.tooltip": "§7Cryogenic Magma Solidifier R-9200", + "machine.gtceu.luv_scanner.tooltip": "§7Anomaly Detector", + "machine.gtceu.luv_sifter.tooltip": "§7Sponsored by TFC", + "machine.gtceu.luv_thermal_centrifuge.tooltip": "§7Blaze Sweatshop T-6351", + "machine.gtceu.luv_wiremill.tooltip": "§7Ingot Elongator", + "machine.gtceu.lv_alloy_smelter.tooltip": "§7HighTech combination Smelter", + "machine.gtceu.lv_arc_furnace.tooltip": "§7Who needs a Blast Furnace?", + "machine.gtceu.lv_assembler.tooltip": "§7Avengers, Assemble!", + "machine.gtceu.lv_autoclave.tooltip": "§7Crystallizing your Dusts", + "machine.gtceu.lv_bender.tooltip": "§7Boo, he's bad! We want BENDER!!!", + "machine.gtceu.lv_brewery.tooltip": "§7Compact and efficient potion brewing", + "machine.gtceu.lv_canner.tooltip": "§7Puts things into and out of Containers", + "machine.gtceu.lv_centrifuge.tooltip": "§7Separating Molecules", + "machine.gtceu.lv_chemical_bath.tooltip": "§7Bathing Ores in Chemicals to separate them", + "machine.gtceu.lv_chemical_reactor.tooltip": "§7Letting Chemicals react with each other", + "machine.gtceu.lv_circuit_assembler.tooltip": "§7Pick-n-Place all over the place", + "machine.gtceu.lv_compressor.tooltip": "§7Compress-O-Matic C77", + "machine.gtceu.lv_cutter.tooltip": "§7Slice'N Dice", + "machine.gtceu.lv_distillery.tooltip": "§7Extracting most relevant Parts of Fluids", + "machine.gtceu.lv_electric_furnace.tooltip": "§7Not like using a Commodore 64", + "machine.gtceu.lv_electrolyzer.tooltip": "§7Electrolyzing Molecules", + "machine.gtceu.lv_electromagnetic_separator.tooltip": "§7Separating the magnetic Ores from the rest", + "machine.gtceu.lv_extractor.tooltip": "§7Dejuicer-Device of Doom - D123", + "machine.gtceu.lv_extruder.tooltip": "§7Universal Machine for Metal Working", + "machine.gtceu.lv_fermenter.tooltip": "§7Fermenting Fluids", + "machine.gtceu.lv_fluid_heater.tooltip": "§7Heating up your Fluids", + "machine.gtceu.lv_fluid_solidifier.tooltip": "§7Cools Fluids down to form Solids", + "machine.gtceu.lv_forge_hammer.tooltip": "§7Stop, Hammertime!", + "machine.gtceu.lv_forming_press.tooltip": "§7Imprinting Images into things", + "machine.gtceu.lv_gas_collector.tooltip": "§7Collects Gas from the air depending on the dimension", + "machine.gtceu.lv_laser_engraver.tooltip": "§7Don't look directly at the Laser", + "machine.gtceu.lv_lathe.tooltip": "§7Produces Rods more efficiently", + "machine.gtceu.lv_macerator.tooltip": "§7Shredding your Ores without Byproducts", + "machine.gtceu.lv_mass_fabricator.tooltip": "§7UUM Matter * Fabrication Squared", + "machine.gtceu.lv_mixer.tooltip": "§7Will it Blend?", + "machine.gtceu.lv_ore_washer.tooltip": "§7Getting more Byproducts from your Ores", + "machine.gtceu.lv_packer.tooltip": "§7Puts things into and Grabs things out of Boxes", + "machine.gtceu.lv_polarizer.tooltip": "§7Bipolarising your Magnets", + "machine.gtceu.lv_replicator.tooltip": "§7Producing the Purest of Elements", + "machine.gtceu.lv_rock_crusher.tooltip": "§7Place Water and Lava horizontally adjacent", + "machine.gtceu.lv_scanner.tooltip": "§7Scans Materials and other things", + "machine.gtceu.lv_sifter.tooltip": "§7Stay calm and keep sifting", + "machine.gtceu.lv_thermal_centrifuge.tooltip": "§7Separating Ores more precisely", + "machine.gtceu.lv_wiremill.tooltip": "§7Produces Wires more efficiently", + "machine.gtceu.max_alloy_smelter.tooltip": "§7Metal Amalgamator", + "machine.gtceu.max_arc_furnace.tooltip": "§7Short Circuit Heater", + "machine.gtceu.max_assembler.tooltip": "§7Assembly Constructor", + "machine.gtceu.max_autoclave.tooltip": "§7Encumbrance Unit", + "machine.gtceu.max_bender.tooltip": "§7Matter Deformer", + "machine.gtceu.max_brewery.tooltip": "§7Brew Rusher", + "machine.gtceu.max_canner.tooltip": "§7Can Actuator", + "machine.gtceu.max_chemical_bath.tooltip": "§7Chemical Dunktron", + "machine.gtceu.max_chemical_reactor.tooltip": "§7Reaction Catalyzer", + "machine.gtceu.max_circuit_assembler.tooltip": "§7Computation Factory", + "machine.gtceu.max_compressor.tooltip": "§7Matter Constrictor", + "machine.gtceu.max_cutter.tooltip": "§7Object Divider", + "machine.gtceu.max_distillery.tooltip": "§7Fraction Splitter", + "machine.gtceu.max_electric_furnace.tooltip": "§7Atom Stimulator", + "machine.gtceu.max_electromagnetic_separator.tooltip": "§7EMF Dispeller", + "machine.gtceu.max_extractor.tooltip": "§7Liquefying Sucker", + "machine.gtceu.max_extruder.tooltip": "§7Shape Driver", + "machine.gtceu.max_fermenter.tooltip": "§7Respiration Controller", + "machine.gtceu.max_fluid_heater.tooltip": "§7Thermal Imbuer", + "machine.gtceu.max_fluid_solidifier.tooltip": "§7Fluid Petrificator", + "machine.gtceu.max_forge_hammer.tooltip": "§7Impact Modulator", + "machine.gtceu.max_forming_press.tooltip": "§7Surface Shifter", + "machine.gtceu.max_mass_fabricator.tooltip": "§7Existence Initiator", + "machine.gtceu.max_mixer.tooltip": "§7Material Homogenizer", + "machine.gtceu.max_packer.tooltip": "§7Amazon Warehouse", + "machine.gtceu.max_polarizer.tooltip": "§7Magnetic Field Rearranger", + "machine.gtceu.max_replicator.tooltip": "§7Elemental Composer", + "machine.gtceu.max_scanner.tooltip": "§7Electron Microscope", + "machine.gtceu.max_sifter.tooltip": "§7Pulsation Filter", + "machine.gtceu.max_wiremill.tooltip": "§7Wire Transfigurator", + "machine.gtceu.miner.per_block": "§7takes §f%ds §7per Block", + "machine.gtceu.miner.tooltip": "§7Mines ores below the Miner! Starts as §f%sx%s §7area", + "machine.gtceu.muffle.off": "Sound Muffling: Disabled", + "machine.gtceu.muffle.on": "Sound Muffling: Enabled", + "machine.gtceu.multi_smelter.tooltip": "Just like the Oven at Home", + "machine.gtceu.mv_alloy_smelter.tooltip": "§7HighTech combination Smelter", + "machine.gtceu.mv_arc_furnace.tooltip": "§7Who needs a Blast Furnace?", + "machine.gtceu.mv_assembler.tooltip": "§7Avengers, Assemble!", + "machine.gtceu.mv_autoclave.tooltip": "§7Crystallizing your Dusts", + "machine.gtceu.mv_bender.tooltip": "§7Boo, he's bad! We want BENDER!!!", + "machine.gtceu.mv_brewery.tooltip": "§7Compact and efficient potion brewing", + "machine.gtceu.mv_canner.tooltip": "§7Puts things into and out of Containers", + "machine.gtceu.mv_centrifuge.tooltip": "§7Separating Molecules", + "machine.gtceu.mv_chemical_bath.tooltip": "§7Bathing Ores in Chemicals to separate them", + "machine.gtceu.mv_chemical_reactor.tooltip": "§7Letting Chemicals react with each other", + "machine.gtceu.mv_circuit_assembler.tooltip": "§7Pick-n-Place all over the place", + "machine.gtceu.mv_compressor.tooltip": "§7Compress-O-Matic C77", + "machine.gtceu.mv_cutter.tooltip": "§7Slice'N Dice", + "machine.gtceu.mv_distillery.tooltip": "§7Extracting most relevant Parts of Fluids", + "machine.gtceu.mv_electric_furnace.tooltip": "§7Not like using a Commodore 64", + "machine.gtceu.mv_electrolyzer.tooltip": "§7Electrolyzing Molecules", + "machine.gtceu.mv_electromagnetic_separator.tooltip": "§7Separating the magnetic Ores from the rest", + "machine.gtceu.mv_extractor.tooltip": "§7Dejuicer-Device of Doom - D123", + "machine.gtceu.mv_extruder.tooltip": "§7Universal Machine for Metal Working", + "machine.gtceu.mv_fermenter.tooltip": "§7Fermenting Fluids", + "machine.gtceu.mv_fluid_heater.tooltip": "§7Heating up your Fluids", + "machine.gtceu.mv_fluid_solidifier.tooltip": "§7Cools Fluids down to form Solids", + "machine.gtceu.mv_forge_hammer.tooltip": "§7Stop, Hammertime!", + "machine.gtceu.mv_forming_press.tooltip": "§7Imprinting Images into things", + "machine.gtceu.mv_gas_collector.tooltip": "§7Collects Gas from the air depending on the dimension", + "machine.gtceu.mv_laser_engraver.tooltip": "§7Don't look directly at the Laser", + "machine.gtceu.mv_lathe.tooltip": "§7Produces Rods more efficiently", + "machine.gtceu.mv_macerator.tooltip": "§7Shredding your Ores without Byproducts", + "machine.gtceu.mv_mass_fabricator.tooltip": "§7UUM Matter * Fabrication Squared", + "machine.gtceu.mv_mixer.tooltip": "§7Will it Blend?", + "machine.gtceu.mv_ore_washer.tooltip": "§7Getting more Byproducts from your Ores", + "machine.gtceu.mv_packer.tooltip": "§7Puts things into and Grabs things out of Boxes", + "machine.gtceu.mv_polarizer.tooltip": "§7Bipolarising your Magnets", + "machine.gtceu.mv_replicator.tooltip": "§7Producing the Purest of Elements", + "machine.gtceu.mv_rock_crusher.tooltip": "§7Place Water and Lava horizontally adjacent", + "machine.gtceu.mv_scanner.tooltip": "§7Scans Materials and other things", + "machine.gtceu.mv_sifter.tooltip": "§7Stay calm and keep sifting", + "machine.gtceu.mv_thermal_centrifuge.tooltip": "§7Separating Ores more precisely", + "machine.gtceu.mv_wiremill.tooltip": "§7Produces Wires more efficiently", + "machine.gtceu.opv_alloy_smelter.tooltip": "§7Metal Amalgamator", + "machine.gtceu.opv_arc_furnace.tooltip": "§7Short Circuit Heater", + "machine.gtceu.opv_assembler.tooltip": "§7Assembly Constructor", + "machine.gtceu.opv_autoclave.tooltip": "§7Encumbrance Unit", + "machine.gtceu.opv_bender.tooltip": "§7Matter Deformer", + "machine.gtceu.opv_brewery.tooltip": "§7Brew Rusher", + "machine.gtceu.opv_canner.tooltip": "§7Can Actuator", + "machine.gtceu.opv_centrifuge.tooltip": "§7Molecular Tornado", + "machine.gtceu.opv_chemical_bath.tooltip": "§7Chemical Dunktron", + "machine.gtceu.opv_chemical_reactor.tooltip": "§7Reaction Catalyzer", + "machine.gtceu.opv_circuit_assembler.tooltip": "§7Computation Factory", + "machine.gtceu.opv_compressor.tooltip": "§7Matter Constrictor", + "machine.gtceu.opv_cutter.tooltip": "§7Object Divider", + "machine.gtceu.opv_distillery.tooltip": "§7Fraction Splitter", + "machine.gtceu.opv_electric_furnace.tooltip": "§7Atom Stimulator", + "machine.gtceu.opv_electrolyzer.tooltip": "§7Atomic Ionizer", + "machine.gtceu.opv_electromagnetic_separator.tooltip": "§7EMF Dispeller", + "machine.gtceu.opv_extractor.tooltip": "§7Liquefying Sucker", + "machine.gtceu.opv_extruder.tooltip": "§7Shape Driver", + "machine.gtceu.opv_fermenter.tooltip": "§7Respiration Controller", + "machine.gtceu.opv_fluid_heater.tooltip": "§7Thermal Imbuer", + "machine.gtceu.opv_fluid_solidifier.tooltip": "§7Fluid Petrificator", + "machine.gtceu.opv_forge_hammer.tooltip": "§7Impact Modulator", + "machine.gtceu.opv_forming_press.tooltip": "§7Surface Shifter", + "machine.gtceu.opv_gas_collector.tooltip": "§7Collects Gas from the universe depending on the dimension", + "machine.gtceu.opv_laser_engraver.tooltip": "§7Exact Photon Cannon", + "machine.gtceu.opv_lathe.tooltip": "§7Rotation Grinder", + "machine.gtceu.opv_macerator.tooltip": "§7Shape Eliminator", + "machine.gtceu.opv_mass_fabricator.tooltip": "§7Existence Initiator", + "machine.gtceu.opv_mixer.tooltip": "§7Material Homogenizer", + "machine.gtceu.opv_ore_washer.tooltip": "§7Miniature Car Wash", + "machine.gtceu.opv_packer.tooltip": "§7Amazon Warehouse", + "machine.gtceu.opv_polarizer.tooltip": "§7Magnetic Field Rearranger", + "machine.gtceu.opv_replicator.tooltip": "§7Elemental Composer", + "machine.gtceu.opv_rock_crusher.tooltip": "§7Volcanic Formation Chamber", + "machine.gtceu.opv_scanner.tooltip": "§7Electron Microscope", + "machine.gtceu.opv_sifter.tooltip": "§7Pulsation Filter", + "machine.gtceu.opv_thermal_centrifuge.tooltip": "§7Fire Cyclone", + "machine.gtceu.opv_wiremill.tooltip": "§7Wire Transfigurator", + "machine.gtceu.perfect_oc": "Does not lose energy efficiency when overclocked.", + "machine.gtceu.primitive_blast_furnace.tooltip": "Making your first Steel", + "machine.gtceu.primitive_pump.tooltip": "Endervoir at Home", + "machine.gtceu.pump.tooltip": "§7The best way to empty Oceans!", + "machine.gtceu.pump.tooltip_buckets": "§f%d §7ticks per Bucket", + "machine.gtceu.quantum_chest.items_stored": "Item Amount:", + "machine.gtceu.quantum_chest.tooltip": "§7Better than Storage Drawers", + "machine.gtceu.quantum_tank.tooltip": "§7Compact place to store all your fluids", + "machine.gtceu.steam.steam_hatch.tooltip": "§eAccepted Fluid: §fSteam", + "machine.gtceu.steam_bus.tooltip": "Does not work with non-steam multiblocks", + "machine.gtceu.steam_grinder.tooltip": "A multiblock Macerator without the Byproducts", + "machine.gtceu.steam_oven.tooltip": "Not to be confused with Multi-Smelter", + "machine.gtceu.steel_large_boiler.tooltip": "Charcoal Incinerator", + "machine.gtceu.titanium_large_boiler.tooltip": "Where's the Magic Super Fuel?", + "machine.gtceu.transformer.description": "§7Transforms Energy between voltage tiers", + "machine.gtceu.transformer.message_transform_down": "Transforming Down, In: %s EU %dA, Out: %s EU %dA", + "machine.gtceu.transformer.message_transform_up": "Transforming Up, In: %s EU %dA, Out: %s EU %dA", + "machine.gtceu.transformer.tooltip_tool_usage": "§7Starts as §fTransform Down§7, use Screwdriver to change", + "machine.gtceu.transformer.tooltip_transform_down": "§aTransform Down: §f%dA %s EU (%s§f) -> %dA %s EU (%s§f)", + "machine.gtceu.transformer.tooltip_transform_up": "§cTransform Up: §f%dA %s EU (%s§f) -> %dA %s EU (%s§f)", + "machine.gtceu.tungstensteel_large_boiler.tooltip": "How do you even fuel this thing?", + "machine.gtceu.uev_alloy_smelter.tooltip": "§7Metal Amalgamator", + "machine.gtceu.uev_arc_furnace.tooltip": "§7Short Circuit Heater", + "machine.gtceu.uev_assembler.tooltip": "§7Assembly Constructor", + "machine.gtceu.uev_autoclave.tooltip": "§7Encumbrance Unit", + "machine.gtceu.uev_bender.tooltip": "§7Matter Deformer", + "machine.gtceu.uev_brewery.tooltip": "§7Brew Rusher", + "machine.gtceu.uev_canner.tooltip": "§7Can Actuator", + "machine.gtceu.uev_centrifuge.tooltip": "§7Molecular Tornado", + "machine.gtceu.uev_chemical_bath.tooltip": "§7Chemical Dunktron", + "machine.gtceu.uev_chemical_reactor.tooltip": "§7Reaction Catalyzer", + "machine.gtceu.uev_circuit_assembler.tooltip": "§7Computation Factory", + "machine.gtceu.uev_compressor.tooltip": "§7Matter Constrictor", + "machine.gtceu.uev_cutter.tooltip": "§7Object Divider", + "machine.gtceu.uev_distillery.tooltip": "§7Fraction Splitter", + "machine.gtceu.uev_electric_furnace.tooltip": "§7Atom Stimulator", + "machine.gtceu.uev_electrolyzer.tooltip": "§7Atomic Ionizer", + "machine.gtceu.uev_electromagnetic_separator.tooltip": "§7EMF Dispeller", + "machine.gtceu.uev_extractor.tooltip": "§7Liquefying Sucker", + "machine.gtceu.uev_extruder.tooltip": "§7Shape Driver", + "machine.gtceu.uev_fermenter.tooltip": "§7Respiration Controller", + "machine.gtceu.uev_fluid_heater.tooltip": "§7Thermal Imbuer", + "machine.gtceu.uev_fluid_solidifier.tooltip": "§7Fluid Petrificator", + "machine.gtceu.uev_forge_hammer.tooltip": "§7Impact Modulator", + "machine.gtceu.uev_forming_press.tooltip": "§7Surface Shifter", + "machine.gtceu.uev_gas_collector.tooltip": "§7Collects Gas from the solar system depending on the dimension", + "machine.gtceu.uev_laser_engraver.tooltip": "§7Exact Photon Cannon", + "machine.gtceu.uev_lathe.tooltip": "§7Rotation Grinder", + "machine.gtceu.uev_macerator.tooltip": "§7Shape Eliminator", + "machine.gtceu.uev_mass_fabricator.tooltip": "§7Existence Initiator", + "machine.gtceu.uev_mixer.tooltip": "§7Material Homogenizer", + "machine.gtceu.uev_ore_washer.tooltip": "§7Miniature Car Wash", + "machine.gtceu.uev_packer.tooltip": "§7Amazon Warehouse", + "machine.gtceu.uev_polarizer.tooltip": "§7Magnetic Field Rearranger", + "machine.gtceu.uev_replicator.tooltip": "§7Elemental Composer", + "machine.gtceu.uev_rock_crusher.tooltip": "§7Volcanic Formation Chamber", + "machine.gtceu.uev_scanner.tooltip": "§7Electron Microscope", + "machine.gtceu.uev_sifter.tooltip": "§7Pulsation Filter", + "machine.gtceu.uev_thermal_centrifuge.tooltip": "§7Fire Cyclone", + "machine.gtceu.uev_wiremill.tooltip": "§7Wire Transfigurator", + "machine.gtceu.uhv_alloy_smelter.tooltip": "§7Metal Amalgamator", + "machine.gtceu.uhv_arc_furnace.tooltip": "§7Short Circuit Heater", + "machine.gtceu.uhv_assembler.tooltip": "§7Assembly Constructor", + "machine.gtceu.uhv_autoclave.tooltip": "§7Encumbrance Unit", + "machine.gtceu.uhv_bender.tooltip": "§7Matter Deformer", + "machine.gtceu.uhv_brewery.tooltip": "§7Brew Rusher", + "machine.gtceu.uhv_canner.tooltip": "§7Can Actuator", + "machine.gtceu.uhv_centrifuge.tooltip": "§7Molecular Tornado", + "machine.gtceu.uhv_chemical_bath.tooltip": "§7Chemical Dunktron", + "machine.gtceu.uhv_chemical_reactor.tooltip": "§7Reaction Catalyzer", + "machine.gtceu.uhv_circuit_assembler.tooltip": "§7Computation Factory", + "machine.gtceu.uhv_compressor.tooltip": "§7Matter Constrictor", + "machine.gtceu.uhv_cutter.tooltip": "§7Object Divider", + "machine.gtceu.uhv_distillery.tooltip": "§7Fraction Splitter", + "machine.gtceu.uhv_electric_furnace.tooltip": "§7Atom Stimulator", + "machine.gtceu.uhv_electrolyzer.tooltip": "§7Atomic Ionizer", + "machine.gtceu.uhv_electromagnetic_separator.tooltip": "§7EMF Dispeller", + "machine.gtceu.uhv_extractor.tooltip": "§7Liquefying Sucker", + "machine.gtceu.uhv_extruder.tooltip": "§7Shape Driver", + "machine.gtceu.uhv_fermenter.tooltip": "§7Respiration Controller", + "machine.gtceu.uhv_fluid_heater.tooltip": "§7Thermal Imbuer", + "machine.gtceu.uhv_fluid_solidifier.tooltip": "§7Fluid Petrificator", + "machine.gtceu.uhv_forge_hammer.tooltip": "§7Impact Modulator", + "machine.gtceu.uhv_forming_press.tooltip": "§7Surface Shifter", + "machine.gtceu.uhv_gas_collector.tooltip": "§7Collects Gas from the solar system depending on the dimension", + "machine.gtceu.uhv_laser_engraver.tooltip": "§7Exact Photon Cannon", + "machine.gtceu.uhv_lathe.tooltip": "§7Rotation Grinder", + "machine.gtceu.uhv_macerator.tooltip": "§7Shape Eliminator", + "machine.gtceu.uhv_mass_fabricator.tooltip": "§7Existence Initiator", + "machine.gtceu.uhv_mixer.tooltip": "§7Material Homogenizer", + "machine.gtceu.uhv_ore_washer.tooltip": "§7Miniature Car Wash", + "machine.gtceu.uhv_packer.tooltip": "§7Amazon Warehouse", + "machine.gtceu.uhv_polarizer.tooltip": "§7Magnetic Field Rearranger", + "machine.gtceu.uhv_replicator.tooltip": "§7Elemental Composer", + "machine.gtceu.uhv_rock_crusher.tooltip": "§7Volcanic Formation Chamber", + "machine.gtceu.uhv_scanner.tooltip": "§7Electron Microscope", + "machine.gtceu.uhv_sifter.tooltip": "§7Pulsation Filter", + "machine.gtceu.uhv_thermal_centrifuge.tooltip": "§7Fire Cyclone", + "machine.gtceu.uhv_wiremill.tooltip": "§7Wire Transfigurator", + "machine.gtceu.uiv_alloy_smelter.tooltip": "§7Metal Amalgamator", + "machine.gtceu.uiv_arc_furnace.tooltip": "§7Short Circuit Heater", + "machine.gtceu.uiv_assembler.tooltip": "§7Assembly Constructor", + "machine.gtceu.uiv_autoclave.tooltip": "§7Encumbrance Unit", + "machine.gtceu.uiv_bender.tooltip": "§7Matter Deformer", + "machine.gtceu.uiv_brewery.tooltip": "§7Brew Rusher", + "machine.gtceu.uiv_canner.tooltip": "§7Can Actuator", + "machine.gtceu.uiv_centrifuge.tooltip": "§7Molecular Tornado", + "machine.gtceu.uiv_chemical_bath.tooltip": "§7Chemical Dunktron", + "machine.gtceu.uiv_chemical_reactor.tooltip": "§7Reaction Catalyzer", + "machine.gtceu.uiv_circuit_assembler.tooltip": "§7Computation Factory", + "machine.gtceu.uiv_compressor.tooltip": "§7Matter Constrictor", + "machine.gtceu.uiv_cutter.tooltip": "§7Object Divider", + "machine.gtceu.uiv_distillery.tooltip": "§7Fraction Splitter", + "machine.gtceu.uiv_electric_furnace.tooltip": "§7Atom Stimulator", + "machine.gtceu.uiv_electrolyzer.tooltip": "§7Atomic Ionizer", + "machine.gtceu.uiv_electromagnetic_separator.tooltip": "§7EMF Dispeller", + "machine.gtceu.uiv_extractor.tooltip": "§7Liquefying Sucker", + "machine.gtceu.uiv_extruder.tooltip": "§7Shape Driver", + "machine.gtceu.uiv_fermenter.tooltip": "§7Respiration Controller", + "machine.gtceu.uiv_fluid_heater.tooltip": "§7Thermal Imbuer", + "machine.gtceu.uiv_fluid_solidifier.tooltip": "§7Fluid Petrificator", + "machine.gtceu.uiv_forge_hammer.tooltip": "§7Impact Modulator", + "machine.gtceu.uiv_forming_press.tooltip": "§7Surface Shifter", + "machine.gtceu.uiv_gas_collector.tooltip": "§7Collects Gas from the solar system depending on the dimension", + "machine.gtceu.uiv_laser_engraver.tooltip": "§7Exact Photon Cannon", + "machine.gtceu.uiv_lathe.tooltip": "§7Rotation Grinder", + "machine.gtceu.uiv_macerator.tooltip": "§7Shape Eliminator", + "machine.gtceu.uiv_mass_fabricator.tooltip": "§7Existence Initiator", + "machine.gtceu.uiv_mixer.tooltip": "§7Material Homogenizer", + "machine.gtceu.uiv_ore_washer.tooltip": "§7Miniature Car Wash", + "machine.gtceu.uiv_packer.tooltip": "§7Amazon Warehouse", + "machine.gtceu.uiv_polarizer.tooltip": "§7Magnetic Field Rearranger", + "machine.gtceu.uiv_replicator.tooltip": "§7Elemental Composer", + "machine.gtceu.uiv_rock_crusher.tooltip": "§7Volcanic Formation Chamber", + "machine.gtceu.uiv_scanner.tooltip": "§7Electron Microscope", + "machine.gtceu.uiv_sifter.tooltip": "§7Pulsation Filter", + "machine.gtceu.uiv_thermal_centrifuge.tooltip": "§7Fire Cyclone", + "machine.gtceu.uiv_wiremill.tooltip": "§7Wire Transfigurator", + "machine.gtceu.ulv_alloy_smelter.tooltip": "§7HighTech combination Smelter", + "machine.gtceu.ulv_arc_furnace.tooltip": "§7Who needs a Blast Furnace?", + "machine.gtceu.ulv_assembler.tooltip": "§7Avengers, Assemble!", + "machine.gtceu.ulv_autoclave.tooltip": "§7Crystallizing your Dusts", + "machine.gtceu.ulv_bender.tooltip": "§7Boo, he's bad! We want BENDER!!!", + "machine.gtceu.ulv_brewery.tooltip": "§7Compact and efficient potion brewing", + "machine.gtceu.ulv_canner.tooltip": "§7Puts things into and out of Containers", + "machine.gtceu.ulv_chemical_bath.tooltip": "§7Bathing Ores in Chemicals to separate them", + "machine.gtceu.ulv_chemical_reactor.tooltip": "§7Letting Chemicals react with each other", + "machine.gtceu.ulv_circuit_assembler.tooltip": "§7Pick-n-Place all over the place", + "machine.gtceu.ulv_compressor.tooltip": "§7Compress-O-Matic C77", + "machine.gtceu.ulv_cutter.tooltip": "§7Slice'N Dice", + "machine.gtceu.ulv_distillery.tooltip": "§7Extracting most relevant Parts of Fluids", + "machine.gtceu.ulv_electric_furnace.tooltip": "§7Not like using a Commodore 64", + "machine.gtceu.ulv_electromagnetic_separator.tooltip": "§7Separating the magnetic Ores from the rest", + "machine.gtceu.ulv_extractor.tooltip": "§7Dejuicer-Device of Doom - D123", + "machine.gtceu.ulv_extruder.tooltip": "§7Universal Machine for Metal Working", + "machine.gtceu.ulv_fermenter.tooltip": "§7Fermenting Fluids", + "machine.gtceu.ulv_fluid_heater.tooltip": "§7Heating up your Fluids", + "machine.gtceu.ulv_fluid_solidifier.tooltip": "§7Cools Fluids down to form Solids", + "machine.gtceu.ulv_forge_hammer.tooltip": "§7Stop, Hammertime!", + "machine.gtceu.ulv_forming_press.tooltip": "§7Imprinting Images into things", + "machine.gtceu.ulv_mass_fabricator.tooltip": "§7UUM Matter * Fabrication Squared", + "machine.gtceu.ulv_mixer.tooltip": "§7Will it Blend?", + "machine.gtceu.ulv_packer.tooltip": "§7Puts things into and Grabs things out of Boxes", + "machine.gtceu.ulv_polarizer.tooltip": "§7Bipolarising your Magnets", + "machine.gtceu.ulv_replicator.tooltip": "§7Producing the Purest of Elements", + "machine.gtceu.ulv_scanner.tooltip": "§7Scans Materials and other things", + "machine.gtceu.ulv_sifter.tooltip": "§7Stay calm and keep sifting", + "machine.gtceu.ulv_wiremill.tooltip": "§7Produces Wires more efficiently", + "machine.gtceu.uv_alloy_smelter.tooltip": "§7Metal Amalgamator", + "machine.gtceu.uv_arc_furnace.tooltip": "§7Short Circuit Heater", + "machine.gtceu.uv_assembler.tooltip": "§7Assembly Constructor", + "machine.gtceu.uv_autoclave.tooltip": "§7Encumbrance Unit", + "machine.gtceu.uv_bender.tooltip": "§7Matter Deformer", + "machine.gtceu.uv_brewery.tooltip": "§7Brew Rusher", + "machine.gtceu.uv_canner.tooltip": "§7Can Actuator", + "machine.gtceu.uv_centrifuge.tooltip": "§7Molecular Tornado", + "machine.gtceu.uv_chemical_bath.tooltip": "§7Chemical Dunktron", + "machine.gtceu.uv_chemical_reactor.tooltip": "§7Reaction Catalyzer", + "machine.gtceu.uv_circuit_assembler.tooltip": "§7Computation Factory", + "machine.gtceu.uv_compressor.tooltip": "§7Matter Constrictor", + "machine.gtceu.uv_cutter.tooltip": "§7Object Divider", + "machine.gtceu.uv_distillery.tooltip": "§7Fraction Splitter", + "machine.gtceu.uv_electric_furnace.tooltip": "§7Atom Stimulator", + "machine.gtceu.uv_electrolyzer.tooltip": "§7Atomic Ionizer", + "machine.gtceu.uv_electromagnetic_separator.tooltip": "§7EMF Dispeller", + "machine.gtceu.uv_extractor.tooltip": "§7Liquefying Sucker", + "machine.gtceu.uv_extruder.tooltip": "§7Shape Driver", + "machine.gtceu.uv_fermenter.tooltip": "§7Respiration Controller", + "machine.gtceu.uv_fluid_heater.tooltip": "§7Thermal Imbuer", + "machine.gtceu.uv_fluid_solidifier.tooltip": "§7Fluid Petrificator", + "machine.gtceu.uv_forge_hammer.tooltip": "§7Impact Modulator", + "machine.gtceu.uv_forming_press.tooltip": "§7Surface Shifter", + "machine.gtceu.uv_gas_collector.tooltip": "§7Collects Gas from the solar system depending on the dimension", + "machine.gtceu.uv_laser_engraver.tooltip": "§7Exact Photon Cannon", + "machine.gtceu.uv_lathe.tooltip": "§7Rotation Grinder", + "machine.gtceu.uv_macerator.tooltip": "§7Shape Eliminator", + "machine.gtceu.uv_mass_fabricator.tooltip": "§7Existence Initiator", + "machine.gtceu.uv_mixer.tooltip": "§7Material Homogenizer", + "machine.gtceu.uv_ore_washer.tooltip": "§7Miniature Car Wash", + "machine.gtceu.uv_packer.tooltip": "§7Amazon Warehouse", + "machine.gtceu.uv_polarizer.tooltip": "§7Magnetic Field Rearranger", + "machine.gtceu.uv_replicator.tooltip": "§7Elemental Composer", + "machine.gtceu.uv_rock_crusher.tooltip": "§7Volcanic Formation Chamber", + "machine.gtceu.uv_scanner.tooltip": "§7Electron Microscope", + "machine.gtceu.uv_sifter.tooltip": "§7Pulsation Filter", + "machine.gtceu.uv_thermal_centrifuge.tooltip": "§7Fire Cyclone", + "machine.gtceu.uv_wiremill.tooltip": "§7Wire Transfigurator", + "machine.gtceu.uxv_alloy_smelter.tooltip": "§7Metal Amalgamator", + "machine.gtceu.uxv_arc_furnace.tooltip": "§7Short Circuit Heater", + "machine.gtceu.uxv_assembler.tooltip": "§7Assembly Constructor", + "machine.gtceu.uxv_autoclave.tooltip": "§7Encumbrance Unit", + "machine.gtceu.uxv_bender.tooltip": "§7Matter Deformer", + "machine.gtceu.uxv_brewery.tooltip": "§7Brew Rusher", + "machine.gtceu.uxv_canner.tooltip": "§7Can Actuator", + "machine.gtceu.uxv_centrifuge.tooltip": "§7Molecular Tornado", + "machine.gtceu.uxv_chemical_bath.tooltip": "§7Chemical Dunktron", + "machine.gtceu.uxv_chemical_reactor.tooltip": "§7Reaction Catalyzer", + "machine.gtceu.uxv_circuit_assembler.tooltip": "§7Computation Factory", + "machine.gtceu.uxv_compressor.tooltip": "§7Matter Constrictor", + "machine.gtceu.uxv_cutter.tooltip": "§7Object Divider", + "machine.gtceu.uxv_distillery.tooltip": "§7Fraction Splitter", + "machine.gtceu.uxv_electric_furnace.tooltip": "§7Atom Stimulator", + "machine.gtceu.uxv_electrolyzer.tooltip": "§7Atomic Ionizer", + "machine.gtceu.uxv_electromagnetic_separator.tooltip": "§7EMF Dispeller", + "machine.gtceu.uxv_extractor.tooltip": "§7Liquefying Sucker", + "machine.gtceu.uxv_extruder.tooltip": "§7Shape Driver", + "machine.gtceu.uxv_fermenter.tooltip": "§7Respiration Controller", + "machine.gtceu.uxv_fluid_heater.tooltip": "§7Thermal Imbuer", + "machine.gtceu.uxv_fluid_solidifier.tooltip": "§7Fluid Petrificator", + "machine.gtceu.uxv_forge_hammer.tooltip": "§7Impact Modulator", + "machine.gtceu.uxv_forming_press.tooltip": "§7Surface Shifter", + "machine.gtceu.uxv_gas_collector.tooltip": "§7Collects Gas from the solar system depending on the dimension", + "machine.gtceu.uxv_laser_engraver.tooltip": "§7Exact Photon Cannon", + "machine.gtceu.uxv_lathe.tooltip": "§7Rotation Grinder", + "machine.gtceu.uxv_macerator.tooltip": "§7Shape Eliminator", + "machine.gtceu.uxv_mass_fabricator.tooltip": "§7Existence Initiator", + "machine.gtceu.uxv_mixer.tooltip": "§7Material Homogenizer", + "machine.gtceu.uxv_ore_washer.tooltip": "§7Miniature Car Wash", + "machine.gtceu.uxv_packer.tooltip": "§7Amazon Warehouse", + "machine.gtceu.uxv_polarizer.tooltip": "§7Magnetic Field Rearranger", + "machine.gtceu.uxv_replicator.tooltip": "§7Elemental Composer", + "machine.gtceu.uxv_rock_crusher.tooltip": "§7Volcanic Formation Chamber", + "machine.gtceu.uxv_scanner.tooltip": "§7Electron Microscope", + "machine.gtceu.uxv_sifter.tooltip": "§7Pulsation Filter", + "machine.gtceu.uxv_thermal_centrifuge.tooltip": "§7Fire Cyclone", + "machine.gtceu.uxv_wiremill.tooltip": "§7Wire Transfigurator", + "machine.gtceu.world_accelerator.description": "Tick accelerates nearby blocks in one of 2 modes: §fTile Entity§7 or §fRandom Tick§7. Use Screwdriver to change mode.", + "machine.gtceu.world_accelerator.mode_entity": "Random Tick Mode", + "machine.gtceu.world_accelerator.mode_tile": "Block Entity Mode", + "machine.gtceu.world_accelerator.working_area": "§bWorking Area:", + "machine.gtceu.world_accelerator.working_area_random": " Random Tick Mode:§f %dx%d", + "machine.gtceu.world_accelerator.working_area_tile": " Block Entity Mode:§f Adjacent Blocks", + "machine.gtceu.zpm_alloy_smelter.tooltip": "§7Alloy Integrator", + "machine.gtceu.zpm_arc_furnace.tooltip": "§7Discharge Heater", + "machine.gtceu.zpm_assembler.tooltip": "§7NOT a Crafting Table", + "machine.gtceu.zpm_autoclave.tooltip": "§7Pressure Cooker", + "machine.gtceu.zpm_bender.tooltip": "§7Shape Distorter", + "machine.gtceu.zpm_brewery.tooltip": "§7Brewing your Drinks", + "machine.gtceu.zpm_canner.tooltip": "§7Can Operator", + "machine.gtceu.zpm_centrifuge.tooltip": "§7Molecular Cyclone", + "machine.gtceu.zpm_chemical_bath.tooltip": "§7Chemical Soaker", + "machine.gtceu.zpm_chemical_reactor.tooltip": "§7Chemical Performer", + "machine.gtceu.zpm_circuit_assembler.tooltip": "§7Electronics Manufacturer", + "machine.gtceu.zpm_compressor.tooltip": "§7Singularity Condenser", + "machine.gtceu.zpm_cutter.tooltip": "§7Matter Cleaver", + "machine.gtceu.zpm_distillery.tooltip": "§7Condensation Separator", + "machine.gtceu.zpm_electric_furnace.tooltip": "§7Electron Excitement Processor", + "machine.gtceu.zpm_electrolyzer.tooltip": "§7Molecular Disintegrator E-4908", + "machine.gtceu.zpm_electromagnetic_separator.tooltip": "§7EM Categorizer", + "machine.gtceu.zpm_extractor.tooltip": "§7Vacuum Extractinator", + "machine.gtceu.zpm_extruder.tooltip": "§7Material Displacer", + "machine.gtceu.zpm_fermenter.tooltip": "§7Fermentation Hastener", + "machine.gtceu.zpm_fluid_heater.tooltip": "§7Heat Infuser", + "machine.gtceu.zpm_fluid_solidifier.tooltip": "§7Not an Ice Machine", + "machine.gtceu.zpm_forge_hammer.tooltip": "§7Plate Forger", + "machine.gtceu.zpm_forming_press.tooltip": "§7Object Layerer", + "machine.gtceu.zpm_gas_collector.tooltip": "§7Collects Gas from the atmosphere depending on the dimension", + "machine.gtceu.zpm_laser_engraver.tooltip": "§7With the Power of 32.64 MW", + "machine.gtceu.zpm_lathe.tooltip": "§7Turn-O-Matic L-5908", + "machine.gtceu.zpm_macerator.tooltip": "§7Blend-O-Matic 9003", + "machine.gtceu.zpm_mass_fabricator.tooltip": "§7Genesis Factory", + "machine.gtceu.zpm_mixer.tooltip": "§7Matter Organizer", + "machine.gtceu.zpm_ore_washer.tooltip": "§7Repurposed Laundry-Washer I-362", + "machine.gtceu.zpm_packer.tooltip": "§7Boxinator", + "machine.gtceu.zpm_polarizer.tooltip": "§7Magnetism Inducer", + "machine.gtceu.zpm_replicator.tooltip": "§7Matter Paster", + "machine.gtceu.zpm_rock_crusher.tooltip": "§7Cryogenic Magma Solidifier R-10200", + "machine.gtceu.zpm_scanner.tooltip": "§7Anomaly Detector", + "machine.gtceu.zpm_sifter.tooltip": "§7Sponsored by TFC", + "machine.gtceu.zpm_thermal_centrifuge.tooltip": "§7Blaze Sweatshop T-6352", + "machine.gtceu.zpm_wiremill.tooltip": "§7Ingot Elongator", "material.gtceu.acetic_acid": "Acetic Acid", "material.gtceu.acetic_anhydride": "Acetic Anhydride", "material.gtceu.acetone": "Acetone", diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java index f48ef9e220d..517446bc244 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -201,8 +201,9 @@ public ItemStack getCloneItemStack(BlockGetter level, BlockPos pos, BlockState s public void appendHoverText(ItemStack stack, @Nullable BlockGetter level, List tooltip, TooltipFlag flag) { definition.getTooltipBuilder().accept(stack, tooltip); - String mainKey = String.format("%s.machine.%s.tooltip", definition.getId().getNamespace(), - definition.getId().getPath()); + String mainKey = definition.getId().toLanguageKey("machine", "tooltip"); + /* String mainKey = String.format("%s.machine.%s.tooltip", definition.getId().getNamespace(), + definition.getId().getPath());*/ if (GTUtil.isShiftDown()) { if (definition instanceof MultiblockMachineDefinition multiblockDefinition) { var pattern = multiblockDefinition.getPatternFactory().get(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java index ec3d41d3a37..bb8bf697231 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -798,8 +798,9 @@ public boolean showFancyTooltip() { public void onAddFancyInformationTooltip(List tooltips) { getDefinition().getTooltipBuilder().accept(getDefinition().asStack(), tooltips); - String mainKey = String.format("%s.machine.%s.tooltip", getDefinition().getId().getNamespace(), - getDefinition().getId().getPath()); + /*String mainKey = String.format("%s.machine.%s.tooltip", getDefinition().getId().getNamespace(), + getDefinition().getId().getPath());*/ + String mainKey = getDefinition().getId().toLanguageKey("machine", "tooltip"); if (Language.getInstance().has(mainKey)) { tooltips.add(0, Component.translatable(mainKey)); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java index 6a73cd0bf3a..c731f6bd62f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java @@ -362,7 +362,7 @@ protected void randomDisplayTick(RandomSource random, float x, float y, float z) public List getDataInfo(PortableScannerBehavior.DisplayMode mode) { if (mode == PortableScannerBehavior.DisplayMode.SHOW_ALL || mode == PortableScannerBehavior.DisplayMode.SHOW_MACHINE_INFO) { - return Collections.singletonList(Component.translatable("gtceu.machine.steam_boiler.heat_amount", + return Collections.singletonList(Component.translatable("machine.gtceu.boiler.heat_info", FormattingUtil.formatNumbers((int) (getTemperaturePercent() * 100)))); } return new ArrayList<>(); diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java index 6d7148031e9..fd23bcb6f0f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java @@ -133,7 +133,7 @@ public class GTMachines { .recipeType(DUMMY_RECIPES) .tooltips(Component.translatable("gtceu.universal.tooltip.uses_per_tick_steam", isHP ? 32 : 16) .append(ChatFormatting.GRAY + ", ") - .append(Component.translatable("gtceu.machine.miner.per_block", + .append(Component.translatable("machine.gtceu.miner.per_block", isHP ? 240 / 20 : 280 / 20))) .tooltipBuilder((item, tooltip) -> { int maxArea = IMiner.getWorkingArea(isHP ? 6 : 4); @@ -339,7 +339,7 @@ public class GTMachines { .rotationState(RotationState.ALL) .tieredHullRenderer(GTCEu.id("block/machine/pump_machine")) .langValue("%s Pump %s".formatted(VLVH[tier], VLVT[tier])) - .tooltips(Component.translatable("gtceu.machine.pump.tooltip"), + .tooltips(Component.translatable("machine.gtceu.pump.tooltip"), Component.translatable("gtceu.universal.tooltip.voltage_in", FormattingUtil.formatNumbers(GTValues.V[tier]), GTValues.VNF[tier]), @@ -359,9 +359,9 @@ public class GTMachines { .editableUI(FisherMachine.EDITABLE_UI_CREATOR.apply(GTCEu.id("fisher"), (tier + 1) * (tier + 1))) .tieredHullRenderer(GTCEu.id("block/machine/fisher_machine")) .langValue("%s Fisher %s".formatted(VLVH[tier], VLVT[tier])) - .tooltips(Component.translatable("gtceu.machine.fisher.tooltip"), - Component.translatable("gtceu.machine.fisher.speed", FisherMachine.calcMaxProgress(tier)), - Component.translatable("gtceu.machine.fisher.requirement", FisherMachine.WATER_CHECK_SIZE, + .tooltips(Component.translatable("machine.gtceu.fisher.tooltip"), + Component.translatable("machine.gtceu.fisher.speed", FisherMachine.calcMaxProgress(tier)), + Component.translatable("machine.gtceu.fisher.requirement", FisherMachine.WATER_CHECK_SIZE, FisherMachine.WATER_CHECK_SIZE), Component.translatable("gtceu.universal.tooltip.voltage_in", FormattingUtil.formatNumbers(GTValues.V[tier]), @@ -379,8 +379,8 @@ public class GTMachines { (tier + 1) * (tier + 1))) .tieredHullRenderer(GTCEu.id("block/machine/block_breaker_machine")) .langValue("%s Block Breaker %s".formatted(VLVH[tier], VLVT[tier])) - .tooltips(Component.translatable("gtceu.machine.block_breaker.tooltip"), - Component.translatable("gtceu.machine.block_breaker.speed_bonus", + .tooltips(Component.translatable("machine.gtceu.block_breaker.tooltip"), + Component.translatable("machine.gtceu.block_breaker.speed_bonus", (int) (BlockBreakerMachine.getEfficiencyMultiplier(tier) * 100)), Component.translatable("gtceu.universal.tooltip.voltage_in", FormattingUtil.formatNumbers(GTValues.V[tier]), @@ -403,10 +403,10 @@ public class GTMachines { int maxArea = IMiner.getWorkingArea(tier * 8); long energyPerTick = GTValues.V[tier - 1]; int tickSpeed = ConfigHolder.INSTANCE.machines.minerSpeed / (tier * 2); - tooltip.add(Component.translatable("gtceu.machine.miner.tooltip", maxArea, maxArea)); + tooltip.add(Component.translatable("machine.gtceu.miner.tooltip", maxArea, maxArea)); tooltip.add(Component.translatable("gtceu.universal.tooltip.uses_per_tick", energyPerTick) .append(Component.literal(", ").withStyle(ChatFormatting.GRAY)) - .append(Component.translatable("gtceu.machine.miner.per_block", tickSpeed / 20))); + .append(Component.translatable("machine.gtceu.miner.per_block", tickSpeed / 20))); tooltip.add(Component.translatable("gtceu.universal.tooltip.voltage_in", FormattingUtil.formatNumbers(GTValues.V[tier]), GTValues.VNF[tier])); @@ -429,7 +429,7 @@ public class GTMachines { GTCEu.id("block/machines/world_accelerator"))) .tooltipBuilder((stack, tooltip) -> { int randTickWorkingArea = 3 + (tier - 1) * 2; - tooltip.add(Component.translatable("gtceu.machine.world_accelerator.description")); + tooltip.add(Component.translatable("machine.gtceu.world_accelerator.description")); tooltip.add(Component.translatable("gtceu.universal.tooltip.voltage_in", FormattingUtil.formatNumbers(GTValues.V[tier]), @@ -437,9 +437,9 @@ public class GTMachines { tooltip.add(Component.translatable("gtceu.universal.tooltip.energy_storage_capacity", FormattingUtil.formatNumbers(GTValues.V[tier] * 64L))); - tooltip.add(Component.translatable("gtceu.machine.world_accelerator.working_area")); - tooltip.add(Component.translatable("gtceu.machine.world_accelerator.working_area_tile")); - tooltip.add(Component.translatable("gtceu.machine.world_accelerator.working_area_random", + tooltip.add(Component.translatable("machine.gtceu.world_accelerator.working_area")); + tooltip.add(Component.translatable("machine.gtceu.world_accelerator.working_area_tile")); + tooltip.add(Component.translatable("machine.gtceu.world_accelerator.working_area_random", randTickWorkingArea, randTickWorkingArea)); }) .register(), @@ -456,8 +456,8 @@ public class GTMachines { .renderer(() -> new WorkableTieredHullMachineRenderer(tier, GTCEu.id("block/machines/item_collector"))) .tooltips( - Component.translatable("gtceu.machine.item_collector.tooltip"), - Component.translatable("gtceu.machine.item_collector.gui.collect_range", + Component.translatable("machine.gtceu.item_collector.tooltip"), + Component.translatable("machine.gtceu.item_collector.gui.collect_range", IntMath.pow(2, tier + 2), IntMath.pow(2, tier + 2)), Component.translatable("gtceu.universal.tooltip.voltage_in", FormattingUtil.formatNumbers(GTValues.V[tier]), @@ -478,7 +478,7 @@ public class GTMachines { .rotationState(RotationState.NONE) .tieredHullRenderer(GTCEu.id("block/machine/buffer")) .tooltips( - Component.translatable("gtceu.machine.buffer.tooltip"), + Component.translatable("machine.gtceu.buffer.tooltip"), Component.translatable( "gtceu.universal.tooltip.item_storage_capacity", BufferMachine.getInventorySize(tier)), @@ -559,7 +559,7 @@ public class GTMachines { .renderer(() -> new QuantumChestRenderer(tier)) .hasTESR(true) .tooltipBuilder(CHEST_TOOLTIPS) - .tooltips(Component.translatable("gtceu.machine.quantum_chest.tooltip"), + .tooltips(Component.translatable("machine.gtceu.quantum_chest.tooltip"), Component.translatable("gtceu.universal.tooltip.item_storage_total", FormattingUtil.formatNumbers(4_000_000 * (long) Math.pow(2, tier - 1)))) .register(), @@ -576,7 +576,7 @@ public class GTMachines { .renderer(() -> new QuantumChestRenderer(tier)) .hasTESR(true) .tooltipBuilder(CHEST_TOOLTIPS) - .tooltips(Component.translatable("gtceu.machine.quantum_chest.tooltip"), + .tooltips(Component.translatable("machine.gtceu.quantum_chest.tooltip"), Component.translatable("gtceu.universal.tooltip.item_storage_total", FormattingUtil.formatNumbers(4_000_000 * (long) Math.pow(2, tier - 1)))) .register(), @@ -593,7 +593,7 @@ public class GTMachines { .renderer(() -> new QuantumTankRenderer(tier)) .hasTESR(true) .tooltipBuilder(TANK_TOOLTIPS) - .tooltips(Component.translatable("gtceu.machine.quantum_tank.tooltip"), + .tooltips(Component.translatable("machine.gtceu.quantum_tank.tooltip"), Component.translatable("gtceu.universal.tooltip.fluid_storage_capacity", FormattingUtil.formatNumbers(4_000_000 * (long) Math.pow(2, tier - 1)))) .register(), @@ -610,7 +610,7 @@ public class GTMachines { .renderer(() -> new QuantumTankRenderer(tier)) .hasTESR(true) .tooltipBuilder(TANK_TOOLTIPS) - .tooltips(Component.translatable("gtceu.machine.quantum_tank.tooltip"), + .tooltips(Component.translatable("machine.gtceu.quantum_tank.tooltip"), Component.translatable("gtceu.universal.tooltip.fluid_storage_capacity", FormattingUtil.formatNumbers(4_000_000 * (long) Math.pow(2, tier - 1)))) .register(), @@ -868,7 +868,7 @@ public class GTMachines { .overlaySteamHullRenderer("item_bus.import") .langValue("Steam Input Bus") .tooltips(Component.translatable("gtceu.machine.item_bus.import.tooltip"), - Component.translatable("gtceu.machine.steam_bus.tooltip"), + Component.translatable("machine.gtceu.steam_bus.tooltip"), Component.translatable("gtceu.universal.tooltip.item_storage_capacity", 4)) .register(); @@ -879,7 +879,7 @@ public class GTMachines { .overlaySteamHullRenderer("item_bus.export") .langValue("Steam Output Bus") .tooltips(Component.translatable("gtceu.machine.item_bus.export.tooltip"), - Component.translatable("gtceu.machine.steam_bus.tooltip"), + Component.translatable("machine.gtceu.steam_bus.tooltip"), Component.translatable("gtceu.universal.tooltip.item_storage_capacity", 4)) .register(); @@ -1039,8 +1039,8 @@ public class GTMachines { .rotationState(RotationState.ALL) .abilities(PartAbility.PASSTHROUGH_HATCH) .renderer(() -> new DiodeRenderer(tier)) - .tooltips(Component.translatable("gtceu.machine.diode.tooltip_general"), - Component.translatable("gtceu.machine.diode.tooltip_starts_at"), + .tooltips(Component.translatable("machine.gtceu.diodetooltip_general"), + Component.translatable("machine.gtceu.diodetooltip_starts_at"), Component.translatable("gtceu.universal.tooltip.voltage_in_out", FormattingUtil.formatNumbers(GTValues.V[tier]), GTValues.VNF[tier]), diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GCYMMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GCYMMachines.java index 8f23bd1fa31..bcf0f1ef0e9 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GCYMMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GCYMMachines.java @@ -77,8 +77,7 @@ public static void init() {} .multiblock("large_maceration_tower", LargeMacerationTowerMachine::new) .langValue("Large Maceration Tower") .tooltips(Component.translatable("gtceu.multiblock.parallelizable.tooltip")) - .tooltips(Component.translatable("gtceu.machine.available_recipe_map_1.tooltip", - Component.translatable("gtceu.macerator"))) + .tooltips(GTMachineUtils.getAvailableRecipeMapTooltip(MACERATOR_RECIPES)) .rotationState(RotationState.ALL) .recipeType(MACERATOR_RECIPES) .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, @@ -105,8 +104,7 @@ public static void init() {} .multiblock("large_chemical_bath", LargeChemicalBathMachine::new) .langValue("Large Chemical Bath") .tooltips(Component.translatable("gtceu.multiblock.parallelizable.tooltip")) - .tooltips(Component.translatable("gtceu.machine.available_recipe_map_2.tooltip", - Component.translatable("gtceu.ore_washer"), Component.translatable("gtceu.chemical_bath"))) + .tooltips(GTMachineUtils.getAvailableRecipeMapTooltip(ORE_WASHER_RECIPES, CHEMICAL_BATH_RECIPES)) .rotationState(RotationState.ALL) .recipeTypes(CHEMICAL_BATH_RECIPES, ORE_WASHER_RECIPES) .renderer(() -> new LargeChemicalBathRenderer(GTCEu.id("block/casings/gcym/watertight_casing"), @@ -136,8 +134,7 @@ public static void init() {} .multiblock("large_centrifuge", WorkableElectricMultiblockMachine::new) .langValue("Large Centrifugal Unit") .tooltips(Component.translatable("gtceu.multiblock.parallelizable.tooltip")) - .tooltips(Component.translatable("gtceu.machine.available_recipe_map_2.tooltip", - Component.translatable("gtceu.centrifuge"), Component.translatable("gtceu.thermal_centrifuge"))) + .tooltips(GTMachineUtils.getAvailableRecipeMapTooltip(CENTRIFUGE_RECIPES, THERMAL_CENTRIFUGE_RECIPES)) .rotationState(RotationState.ALL) .recipeTypes(CENTRIFUGE_RECIPES, THERMAL_CENTRIFUGE_RECIPES) .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, @@ -165,8 +162,7 @@ public static void init() {} .multiblock("large_mixer", LargeMixerMachine::new) .langValue("Large Mixing Vessel") .tooltips(Component.translatable("gtceu.multiblock.parallelizable.tooltip")) - .tooltips(Component.translatable("gtceu.machine.available_recipe_map_1.tooltip", - Component.translatable("gtceu.mixer"))) + .tooltips(GTMachineUtils.getAvailableRecipeMapTooltip(MIXER_RECIPES)) .rotationState(RotationState.ALL) .recipeType(MIXER_RECIPES) .renderer(() -> new LargeMixerRenderer(GTCEu.id("block/casings/gcym/reaction_safe_mixing_casing"), @@ -197,8 +193,7 @@ public static void init() {} .multiblock("large_electrolyzer", WorkableElectricMultiblockMachine::new) .langValue("Large Electrolysis Chamber") .tooltips(Component.translatable("gtceu.multiblock.parallelizable.tooltip")) - .tooltips(Component.translatable("gtceu.machine.available_recipe_map_1.tooltip", - Component.translatable("gtceu.electrolyzer"))) + .tooltips(GTMachineUtils.getAvailableRecipeMapTooltip(ELECTROLYZER_RECIPES)) .rotationState(RotationState.ALL) .recipeType(ELECTROLYZER_RECIPES) .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, @@ -223,9 +218,7 @@ public static void init() {} .multiblock("large_electromagnet", WorkableElectricMultiblockMachine::new) .langValue("Large Electromagnet") .tooltips(Component.translatable("gtceu.multiblock.parallelizable.tooltip")) - .tooltips(Component.translatable("gtceu.machine.available_recipe_map_2.tooltip", - Component.translatable("gtceu.electromagnetic_separator"), - Component.translatable("gtceu.polarizer"))) + .tooltips(GTMachineUtils.getAvailableRecipeMapTooltip(ELECTROMAGNETIC_SEPARATOR_RECIPES, POLARIZER_RECIPES)) .rotationState(RotationState.ALL) .recipeTypes(ELECTROMAGNETIC_SEPARATOR_RECIPES, POLARIZER_RECIPES) .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, @@ -250,8 +243,7 @@ public static void init() {} .multiblock("large_packer", WorkableElectricMultiblockMachine::new) .langValue("Large Packaging Machine") .tooltips(Component.translatable("gtceu.multiblock.parallelizable.tooltip")) - .tooltips(Component.translatable("gtceu.machine.available_recipe_map_1.tooltip", - Component.translatable("gtceu.packer"))) + .tooltips(GTMachineUtils.getAvailableRecipeMapTooltip(PACKER_RECIPES)) .rotationState(RotationState.ALL) .recipeType(GTRecipeTypes.PACKER_RECIPES) .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, @@ -279,8 +271,7 @@ public static void init() {} .langValue("Large Assembling Factory") .tooltips(Component.translatable("gtceu.multiblock.parallelizable.tooltip")) .tooltips(Component.translatable("gtceu.multiblock.exact_hatch_1.tooltip")) - .tooltips(Component.translatable("gtceu.machine.available_recipe_map_1.tooltip", - Component.translatable("gtceu.assembler"))) + .tooltips(GTMachineUtils.getAvailableRecipeMapTooltip(ASSEMBLER_RECIPES)) .conditionalTooltip(GTMachineUtils.defaultEnvironmentRequirement(), ConfigHolder.INSTANCE.gameplay.environmentalHazards) .rotationState(RotationState.ALL) @@ -310,8 +301,7 @@ public static void init() {} .multiblock("large_circuit_assembler", WorkableElectricMultiblockMachine::new) .langValue("Large Circuit Assembling Facility") .tooltips(Component.translatable("gtceu.multiblock.parallelizable.tooltip")) - .tooltips(Component.translatable("gtceu.machine.available_recipe_map_1.tooltip", - Component.translatable("gtceu.circuit_assembler"))) + .tooltips(GTMachineUtils.getAvailableRecipeMapTooltip(CIRCUIT_ASSEMBLER_RECIPES)) .tooltips(Component.translatable("gtceu.multiblock.exact_hatch_1.tooltip")) .conditionalTooltip(GTMachineUtils.defaultEnvironmentRequirement(), ConfigHolder.INSTANCE.gameplay.environmentalHazards) @@ -346,8 +336,7 @@ public static void init() {} .multiblock("large_arc_smelter", WorkableElectricMultiblockMachine::new) .langValue("Large Arc Smelter") .tooltips(Component.translatable("gtceu.multiblock.parallelizable.tooltip")) - .tooltips(Component.translatable("gtceu.machine.available_recipe_map_1.tooltip", - Component.translatable("gtceu.arc_furnace"))) + .tooltips(GTMachineUtils.getAvailableRecipeMapTooltip(ARC_FURNACE_RECIPES)) .rotationState(RotationState.ALL) .recipeType(ARC_FURNACE_RECIPES) .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, @@ -376,8 +365,7 @@ public static void init() {} .multiblock("large_engraving_laser", WorkableElectricMultiblockMachine::new) .langValue("Large Engraving Laser") .tooltips(Component.translatable("gtceu.multiblock.parallelizable.tooltip")) - .tooltips(Component.translatable("gtceu.machine.available_recipe_map_1.tooltip", - Component.translatable("gtceu.laser_engraver"))) + .tooltips(GTMachineUtils.getAvailableRecipeMapTooltip(LASER_ENGRAVER_RECIPES)) .conditionalTooltip(GTMachineUtils.defaultEnvironmentRequirement(), ConfigHolder.INSTANCE.gameplay.environmentalHazards) .rotationState(RotationState.ALL) @@ -408,8 +396,7 @@ public static void init() {} .multiblock("large_sifting_funnel", WorkableElectricMultiblockMachine::new) .langValue("Large Sifting Funnel") .tooltips(Component.translatable("gtceu.multiblock.parallelizable.tooltip")) - .tooltips(Component.translatable("gtceu.machine.available_recipe_map_1.tooltip", - Component.translatable("gtceu.sifter"))) + .tooltips(GTMachineUtils.getAvailableRecipeMapTooltip(SIFTER_RECIPES)) .rotationState(RotationState.ALL) .recipeType(SIFTER_RECIPES) .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, @@ -436,8 +423,7 @@ public static void init() {} public final static MultiblockMachineDefinition BLAST_ALLOY_SMELTER = REGISTRATE .multiblock("alloy_blast_smelter", CoilWorkableElectricMultiblockMachine::new) .langValue("Alloy Blast Smelter") - .tooltips(Component.translatable("gtceu.machine.available_recipe_map_1.tooltip", - Component.translatable("gtceu.alloy_blast_smelter"))) + .tooltips(GTMachineUtils.getAvailableRecipeMapTooltip(ALLOY_BLAST_RECIPES)) .tooltips(Component.translatable("gtceu.machine.electric_blast_furnace.tooltip.0"), Component.translatable("gtceu.machine.electric_blast_furnace.tooltip.1"), Component.translatable("gtceu.machine.electric_blast_furnace.tooltip.2")) @@ -505,8 +491,7 @@ public static void init() {} .multiblock("large_autoclave", WorkableElectricMultiblockMachine::new) .langValue("Large Crystallization Chamber") .tooltips(Component.translatable("gtceu.multiblock.parallelizable.tooltip")) - .tooltips(Component.translatable("gtceu.machine.available_recipe_map_1.tooltip", - Component.translatable("gtceu.autoclave"))) + .tooltips(GTMachineUtils.getAvailableRecipeMapTooltip(AUTOCLAVE_RECIPES)) .rotationState(RotationState.ALL) .recipeType(AUTOCLAVE_RECIPES) .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, @@ -533,9 +518,8 @@ public static void init() {} .multiblock("large_material_press", WorkableElectricMultiblockMachine::new) .langValue("Large Material Press") .tooltips(Component.translatable("gtceu.multiblock.parallelizable.tooltip")) - .tooltips(Component.translatable("gtceu.machine.available_recipe_map_4.tooltip", - Component.translatable("gtceu.bender"), Component.translatable("gtceu.compressor"), - Component.translatable("gtceu.forge_hammer"), Component.translatable("gtceu.forming_press"))) + .tooltips(GTMachineUtils.getAvailableRecipeMapTooltip(BENDER_RECIPES, COMPRESSOR_RECIPES, + FORGE_HAMMER_RECIPES, FORMING_PRESS_RECIPES)) .rotationState(RotationState.ALL) .recipeTypes(BENDER_RECIPES, COMPRESSOR_RECIPES, FORGE_HAMMER_RECIPES, FORMING_PRESS_RECIPES) .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, @@ -561,9 +545,7 @@ public static void init() {} .multiblock("large_brewer", WorkableElectricMultiblockMachine::new) .langValue("Large Brewing Vat") .tooltips(Component.translatable("gtceu.multiblock.parallelizable.tooltip")) - .tooltips(Component.translatable("gtceu.machine.available_recipe_map_3.tooltip", - Component.translatable("gtceu.brewery"), Component.translatable("gtceu.fermenter"), - Component.translatable("gtceu.fluid_heater"))) + .tooltips(GTMachineUtils.getAvailableRecipeMapTooltip(BREWING_RECIPES, FERMENTING_RECIPES, FLUID_HEATER_RECIPES)) .rotationState(RotationState.ALL) .recipeTypes(BREWING_RECIPES, FERMENTING_RECIPES, FLUID_HEATER_RECIPES) .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, @@ -592,8 +574,7 @@ public static void init() {} .multiblock("large_cutter", WorkableElectricMultiblockMachine::new) .langValue("Large Cutting Saw") .tooltips(Component.translatable("gtceu.multiblock.parallelizable.tooltip")) - .tooltips(Component.translatable("gtceu.machine.available_recipe_map_2.tooltip", - Component.translatable("gtceu.cutter"), Component.translatable("gtceu.lathe"))) + .tooltips(GTMachineUtils.getAvailableRecipeMapTooltip(CUTTER_RECIPES, LATHE_RECIPES)) .rotationState(RotationState.ALL) .recipeTypes(CUTTER_RECIPES, LATHE_RECIPES) .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, @@ -621,8 +602,7 @@ public static void init() {} .multiblock("large_distillery", DistillationTowerMachine::new) .langValue("Large Fractionating Distillery") .tooltips(Component.translatable("gtceu.multiblock.parallelizable.tooltip")) - .tooltips(Component.translatable("gtceu.machine.available_recipe_map_2.tooltip", - Component.translatable("gtceu.distillation_tower"), Component.translatable("gtceu.distillery"))) + .tooltips(GTMachineUtils.getAvailableRecipeMapTooltip(DISTILLATION_RECIPES, DISTILLERY_RECIPES)) .rotationState(RotationState.NON_Y_AXIS) .recipeTypes(DISTILLATION_RECIPES, DISTILLERY_RECIPES) .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, @@ -713,8 +693,7 @@ public static void init() {} .multiblock("large_extractor", WorkableElectricMultiblockMachine::new) .langValue("Large Extraction Machine") .tooltips(Component.translatable("gtceu.multiblock.parallelizable.tooltip")) - .tooltips(Component.translatable("gtceu.machine.available_recipe_map_2.tooltip", - Component.translatable("gtceu.extractor"), Component.translatable("gtceu.canner"))) + .tooltips(GTMachineUtils.getAvailableRecipeMapTooltip(EXTRACTOR_RECIPES, CANNER_RECIPES)) .rotationState(RotationState.ALL) .recipeTypes(EXTRACTOR_RECIPES, CANNER_RECIPES) .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, @@ -739,8 +718,7 @@ public static void init() {} .multiblock("large_extruder", WorkableElectricMultiblockMachine::new) .langValue("Large Extrusion Machine") .tooltips(Component.translatable("gtceu.multiblock.parallelizable.tooltip")) - .tooltips(Component.translatable("gtceu.machine.available_recipe_map_1.tooltip", - Component.translatable("gtceu.extruder"))) + .tooltips(GTMachineUtils.getAvailableRecipeMapTooltip(EXTRUDER_RECIPES)) .rotationState(RotationState.ALL) .recipeType(EXTRUDER_RECIPES) .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, @@ -769,8 +747,7 @@ public static void init() {} .multiblock("large_solidifier", WorkableElectricMultiblockMachine::new) .langValue("Large Solidification Array") .tooltips(Component.translatable("gtceu.multiblock.parallelizable.tooltip")) - .tooltips(Component.translatable("gtceu.machine.available_recipe_map_1.tooltip", - Component.translatable("gtceu.fluid_solidifier"))) + .tooltips(GTMachineUtils.getAvailableRecipeMapTooltip(FLUID_SOLIDFICATION_RECIPES)) .rotationState(RotationState.ALL) .recipeType(FLUID_SOLIDFICATION_RECIPES) .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, @@ -798,8 +775,7 @@ public static void init() {} .multiblock("large_wiremill", WorkableElectricMultiblockMachine::new) .langValue("Large Wire Factory") .tooltips(Component.translatable("gtceu.multiblock.parallelizable.tooltip")) - .tooltips(Component.translatable("gtceu.machine.available_recipe_map_1.tooltip", - Component.translatable("gtceu.wiremill"))) + .tooltips(GTMachineUtils.getAvailableRecipeMapTooltip(WIREMILL_RECIPES)) .rotationState(RotationState.ALL) .recipeType(WIREMILL_RECIPES) .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, @@ -824,8 +800,7 @@ public static void init() {} .multiblock("mega_blast_furnace", CoilWorkableElectricMultiblockMachine::new) .langValue("Rotary Hearth Furnace") .tooltips(Component.translatable("gtceu.multiblock.parallelizable.tooltip")) - .tooltips(Component.translatable("gtceu.machine.available_recipe_map_1.tooltip", - Component.translatable("gtceu.electric_blast_furnace"))) + .tooltips(GTMachineUtils.getAvailableRecipeMapTooltip(BLAST_RECIPES)) .tooltips(Component.translatable("gtceu.machine.electric_blast_furnace.tooltip.0"), Component.translatable("gtceu.machine.electric_blast_furnace.tooltip.1"), Component.translatable("gtceu.machine.electric_blast_furnace.tooltip.2")) @@ -1002,8 +977,7 @@ public static void init() {} .multiblock("mega_vacuum_freezer", WorkableElectricMultiblockMachine::new) .langValue("Bulk Blast Chiller") .tooltips(Component.translatable("gtceu.multiblock.parallelizable.tooltip")) - .tooltips(Component.translatable("gtceu.machine.available_recipe_map_1.tooltip", - Component.translatable("gtceu.vacuum_freezer"))) + .tooltips(GTMachineUtils.getAvailableRecipeMapTooltip(VACUUM_RECIPES)) .rotationState(RotationState.ALL) .recipeType(VACUUM_RECIPES) .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMachineUtils.java b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMachineUtils.java index 63b0d739183..9b389b6ec06 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMachineUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMachineUtils.java @@ -229,14 +229,14 @@ public static MachineDefinition[] registerTransformerMachines(String langName, i .renderer(() -> new TransformerRenderer(tier, baseAmp)) .langValue("%s %sTransformer".formatted(VCF[tier] + VOLTAGE_NAMES[tier] + ChatFormatting.RESET, langName)) - .tooltips(Component.translatable("gtceu.machine.transformer.description"), - Component.translatable("gtceu.machine.transformer.tooltip_tool_usage"), - Component.translatable("gtceu.machine.transformer.tooltip_transform_down", + .tooltips(Component.translatable("machine.gtceu.transformer.description"), + Component.translatable("machine.gtceu.transformer.tooltip_tool_usage"), + Component.translatable("machine.gtceu.transformer.tooltip_transform_down", baseAmp, FormattingUtil.formatNumbers(GTValues.V[tier + 1]), GTValues.VNF[tier + 1], baseAmp * 4, FormattingUtil.formatNumbers(GTValues.V[tier]), GTValues.VNF[tier]), - Component.translatable("gtceu.machine.transformer.tooltip_transform_up", + Component.translatable("machine.gtceu.transformer.tooltip_transform_up", baseAmp * 4, FormattingUtil.formatNumbers(GTValues.V[tier]), GTValues.VNF[tier], baseAmp, FormattingUtil.formatNumbers(GTValues.V[tier + 1]), GTValues.VNF[tier + 1])) @@ -338,13 +338,13 @@ public static MachineDefinition[] registerConverter(int amperage) { .langValue("%s %s§eA§r Energy Converter".formatted(VCF[tier] + VN[tier] + ChatFormatting.RESET, amperage)) .renderer(() -> new ConverterRenderer(tier, amperage)) - .tooltips(Component.translatable("gtceu.machine.energy_converter.description"), - Component.translatable("gtceu.machine.energy_converter.tooltip_tool_usage"), - Component.translatable("gtceu.machine.energy_converter.tooltip_conversion_native", + .tooltips(Component.translatable("machine.gtceu.energy_converter.description"), + Component.translatable("machine.gtceu.energy_converter.tooltip_tool_usage"), + Component.translatable("machine.gtceu.energy_converter.tooltip_conversion_native", FeCompat.toFeLong(V[tier] * amperage, FeCompat.ratio(true)), amperage, V[tier], GTValues.VNF[tier]), - Component.translatable("gtceu.machine.energy_converter.tooltip_conversion_eu", amperage, + Component.translatable("machine.gtceu.energy_converter.tooltip_conversion_eu", amperage, V[tier], GTValues.VNF[tier], FeCompat.toFeLong(V[tier] * amperage, FeCompat.ratio(false)))) @@ -412,7 +412,7 @@ public static MachineDefinition registerDrum(Material material, int capacity, St pipeprops.appendTooltips(list, false, true); } }) - .tooltips(Component.translatable("gtceu.machine.quantum_tank.tooltip"), + .tooltips(Component.translatable("machine.gtceu.quantum_tank.tooltip"), Component.translatable("gtceu.universal.tooltip.fluid_storage_capacity", FormattingUtil.formatNumbers(capacity))) .paintingColor(wooden ? 0xFFFFFF : material.getMaterialRGB()) @@ -693,5 +693,15 @@ public static Component[] workableTiered(int tier, long voltage, long energyCapa return tooltipComponents.toArray(Component[]::new); } + public static Component getAvailableRecipeMapTooltip(GTRecipeType... recipeTypes) { + if(recipeTypes != null) { + String key = "machine.gtceu.available_recipe_map_" + recipeTypes.length + ".tooltip"; + return Component.translatable(key, Arrays.stream(recipeTypes) + .map(recipeType -> Component.translatable(recipeType.getCategory().getLanguageKey())) + .toArray()); + } + return Component.empty(); + } + public static void init() {} } diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMultiMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMultiMachines.java index c779b35d305..8812d2299f1 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMultiMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMultiMachines.java @@ -54,7 +54,7 @@ import static com.gregtechceu.gtceu.common.data.GTBlocks.*; import static com.gregtechceu.gtceu.common.data.GTMachines.*; import static com.gregtechceu.gtceu.common.data.GTMaterials.DrillingFluid; -import static com.gregtechceu.gtceu.common.data.GTRecipeTypes.DUMMY_RECIPES; +import static com.gregtechceu.gtceu.common.data.GTRecipeTypes.*; import static com.gregtechceu.gtceu.common.data.machines.GTMachineUtils.*; import static com.gregtechceu.gtceu.common.registry.GTRegistration.REGISTRATE; import static com.gregtechceu.gtceu.utils.FormattingUtil.toRomanNumeral; @@ -330,8 +330,7 @@ public class GTMultiMachines { .recipeTypes(GTRecipeTypes.FURNACE_RECIPES, GTRecipeTypes.ALLOY_SMELTER_RECIPES) .recipeModifiers(GTRecipeModifiers::multiSmelterParallel) .appearanceBlock(CASING_INVAR_HEATPROOF) - .tooltips(Component.translatable("gtceu.machine.available_recipe_map_2.tooltip", - Component.translatable("gtceu.electric_furnace"), Component.translatable("gtceu.alloy_smelter"))) + .tooltips(GTMachineUtils.getAvailableRecipeMapTooltip(FURNACE_RECIPES, ALLOY_SMELTER_RECIPES)) .pattern(definition -> FactoryBlockPattern.start() .aisle("XXX", "CCC", "XXX") .aisle("XXX", "C#C", "XMX") diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ConverterMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ConverterMachine.java index 9f62034eb6b..60c3c89e8d5 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ConverterMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ConverterMachine.java @@ -75,7 +75,7 @@ public InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand if (getConverterTrait().isFeToEu()) { setFeToEu(false); playerIn.sendSystemMessage( - Component.translatable("gtceu.machine.energy_converter.message_conversion_eu", + Component.translatable("machine.gtceu.energy_converter.message_conversion_eu", getConverterTrait().getAmps(), getConverterTrait().getVoltage(), FeCompat.toFeLong( getConverterTrait().getVoltage() * getConverterTrait().getAmps(), @@ -83,7 +83,7 @@ public InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand } else { setFeToEu(true); playerIn.sendSystemMessage( - Component.translatable("gtceu.machine.energy_converter.message_conversion_native", + Component.translatable("machine.gtceu.energy_converter.message_conversion_native", FeCompat.toFeLong( getConverterTrait().getVoltage() * getConverterTrait().getAmps(), FeCompat.ratio(true)), diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/TransformerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/TransformerMachine.java index 236581da258..90d578594a0 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/TransformerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/TransformerMachine.java @@ -126,8 +126,8 @@ protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand if (!isRemote()) { setTransformUp(!isTransformUp()); playerIn.sendSystemMessage(Component.translatable( - isTransformUp() ? "gtceu.machine.transformer.message_transform_up" : - "gtceu.machine.transformer.message_transform_down", + isTransformUp() ? "machine.gtceu.transformer.message_transform_up" : + "machine.gtceu.transformer.message_transform_down", energyContainer.getInputVoltage(), energyContainer.getInputAmperage(), energyContainer.getOutputVoltage(), energyContainer.getOutputAmperage())); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/WorldAcceleratorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/WorldAcceleratorMachine.java index 9b09d62bf1a..833c1711cf7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/WorldAcceleratorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/WorldAcceleratorMachine.java @@ -242,7 +242,7 @@ protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand h if (!isRemote()) { isRandomTickMode = !isRandomTickMode; playerIn.sendSystemMessage(Component.translatable(isRandomTickMode ? - "gtceu.machine.world_accelerator.mode_entity" : "gtceu.machine.world_accelerator.mode_tile")); + "machine.gtceu.world_accelerator.mode_entity" : "machine.gtceu.world_accelerator.mode_tile")); scheduleRenderUpdate(); } return InteractionResult.CONSUME; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DiodePartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DiodePartMachine.java index bd89057d41d..cb61e0f0578 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DiodePartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DiodePartMachine.java @@ -102,7 +102,7 @@ protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand h scheduleRenderUpdate(); return InteractionResult.CONSUME; } - playerIn.sendSystemMessage(Component.translatable("gtceu.machine.diode.message", amps)); + playerIn.sendSystemMessage(Component.translatable("machine.gtceu.diodemessage", amps)); return InteractionResult.CONSUME; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java index ca3df71a46c..e2871f5ef55 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java @@ -219,7 +219,7 @@ protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand if (!playerIn.isShiftKeyDown()) { setAutoOutputFluids(!isAutoOutputFluids()); playerIn.sendSystemMessage(Component - .translatable("gtceu.machine.drum." + (autoOutputFluids ? "enable" : "disable") + "_output")); + .translatable("machine.gtceu.drum." + (autoOutputFluids ? "enable" : "disable") + "_output")); return InteractionResult.SUCCESS; } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java index 1b1c49116ba..7d7141a125b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java @@ -366,7 +366,7 @@ public Widget createUIWidget() { var group = new WidgetGroup(0, 0, 109, 63); var importItems = createImportItems(); group.addWidget(new ImageWidget(4, 4, 81, 55, GuiTextures.DISPLAY)) - .addWidget(new LabelWidget(8, 8, "gtceu.machine.quantum_chest.items_stored")) + .addWidget(new LabelWidget(8, 8, "machine.gtceu.quantum_chest.items_stored")) .addWidget(new LabelWidget(8, 18, () -> FormattingUtil.formatNumbers(storedAmount)) .setTextColor(-1) .setDropShadow(true)) diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java index 8f70bee03b0..bcd1e5cf449 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java @@ -32,27 +32,27 @@ public static void standardTooltips(RegistrateLangProvider provider, String root } private static void generateSteamMachines(RegistrateLangProvider provider) { - makeSteamMachineTooltip(provider, "gtceu.machine", "steam_solid_boiler", + makeSteamMachineTooltip(provider, "gtceu", "steam_solid_boiler", "An early way to get Steam Power", "Faster than the Small Steam Solid Fuel Boiler"); - makeSteamMachineTooltip(provider, "gtceu.machine", "steam_solar_boiler", + makeSteamMachineTooltip(provider, "gtceu", "steam_solar_boiler", "Steam Power by Sun", "Steam Power by Sun"); - makeSteamMachineTooltip(provider, "gtceu.machine", "steam_liquid_boiler", + makeSteamMachineTooltip(provider, "gtceu", "steam_liquid_boiler", "A Boiler running off Liquids", "Faster than Small Steam Liquid Boiler"); - makeSteamMachineTooltip(provider, "gtceu.machine", "steam_extractor", + makeSteamMachineTooltip(provider, "gtceu", "steam_extractor", "Extracting your first Rubber", "Extracting your first Rubber"); - makeSteamMachineTooltip(provider, "gtceu.machine", "steam_macerator", + makeSteamMachineTooltip(provider, "gtceu", "steam_macerator", "Macerating your Ores", "Macerating your Ores"); - makeSteamMachineTooltip(provider, "gtceu.machine", "steam_compressor", + makeSteamMachineTooltip(provider, "gtceu", "steam_compressor", "Compressing Items", "Compressing Items"); - makeSteamMachineTooltip(provider, "gtceu.machine", "steam_forge_hammer", + makeSteamMachineTooltip(provider, "gtceu", "steam_forge_hammer", "Forge Hammer", "Forge Hammer"); - makeSteamMachineTooltip(provider, "gtceu.machine", "steam_furnace", + makeSteamMachineTooltip(provider, "gtceu", "steam_furnace", "Smelting things with compressed Steam", "Smelting things with compressed Steam"); - makeSteamMachineTooltip(provider, "gtceu.machine", "steam_alloy_smelter", + makeSteamMachineTooltip(provider, "gtceu", "steam_alloy_smelter", "Combination Smelter", "Combination Smelter"); - makeSteamMachineTooltip(provider, "gtceu.machine", "steam_rock_crusher", + makeSteamMachineTooltip(provider, "gtceu", "steam_rock_crusher", "Place Water and Lava horizontally adjacent", "Place Water and Lava horizontally adjacent"); - makeSteamMachineTooltip(provider, "gtceu.machine", "steam_miner", + makeSteamMachineTooltip(provider, "gtceu", "steam_miner", "Mines ores below the Miner!", "Mines ores below the Miner!"); // unused @@ -62,12 +62,12 @@ private static void generateSteamMachines(RegistrateLangProvider provider) { private static void generateGeneralMachineTooltips(RegistrateLangProvider provider) { // General Machine Behavior - provider.add("gtceu.machine.basic.input_from_output_side.allow", "Allow Input from Output Side: "); - provider.add("gtceu.machine.basic.input_from_output_side.disallow", + provider.add("machine.gtceu.basic.input_from_output_side.allow", "Allow Input from Output Side: "); + provider.add("machine.gtceu.basic.input_from_output_side.disallow", "Disallow Input from Output Side: "); - provider.add("gtceu.machine.muffle.on", "Sound Muffling: Enabled"); - provider.add("gtceu.machine.muffle.off", "Sound Muffling: Disabled"); - provider.add("gtceu.machine.perfect_oc", "Does not lose energy efficiency when overclocked."); + provider.add("machine.gtceu.muffle.on", "Sound Muffling: Enabled"); + provider.add("machine.gtceu.muffle.off", "Sound Muffling: Disabled"); + provider.add("machine.gtceu.perfect_oc", "Does not lose energy efficiency when overclocked."); } /** @@ -75,10 +75,10 @@ private static void generateGeneralMachineTooltips(RegistrateLangProvider provid */ private static void generateCustomMachineTooltips(RegistrateLangProvider provider) { // Steam Boilers - provider.add("gtceu.machine.boiler.info.heating.up", "§cHeating up§r%s"); - provider.add("gtceu.machine.boiler.info.cooling.down", "§9Cooling down§r%s"); - provider.add("gtceu.machine.boiler.info.producing.steam", " §a(boiling water)"); - provider.add("gtceu.machine.steam_boiler.heat_amount", "Heat Capacity: %s %%"); + provider.add("machine.gtceu.boiler.info.heating.up", "§cHeating up§r%s"); + provider.add("machine.gtceu.boiler.info.cooling.down", "§9Cooling down§r%s"); + provider.add("machine.gtceu.boiler.info.producing.steam", " §a(boiling water)"); + provider.add("machine.gtceu.boiler.heat_info", "Heat Capacity: %s %%"); // Generators provider.add("recipe_type.gtceu.combustion_generator.tooltip", "§7Requires flammable Liquids"); @@ -86,7 +86,7 @@ private static void generateCustomMachineTooltips(RegistrateLangProvider provide provider.add("recipe_type.gtceu.gas_turbine.tooltip", "§7Requires flammable Gases"); // Machine Hull - provider.add("gtceu.machine.hull.tooltip", + provider.add("machine.gtceu.hull.tooltip", "§7You just need §5I§dm§4a§cg§ei§an§ba§3t§7i§1o§5n§7 to use this"); // Battery Buffer @@ -94,63 +94,63 @@ private static void generateCustomMachineTooltips(RegistrateLangProvider provide provider.add("gtceu.battery_buffer.average_output", "Average output: %s EU/t"); // Transformer - provider.add("gtceu.machine.transformer.description", "§7Transforms Energy between voltage tiers"); - provider.add("gtceu.machine.transformer.tooltip_tool_usage", + provider.add("machine.gtceu.transformer.description", "§7Transforms Energy between voltage tiers"); + provider.add("machine.gtceu.transformer.tooltip_tool_usage", "§7Starts as §fTransform Down§7, use Screwdriver to change"); - provider.add("gtceu.machine.transformer.tooltip_transform_down", + provider.add("machine.gtceu.transformer.tooltip_transform_down", "§aTransform Down: §f%dA %s EU (%s§f) -> %dA %s EU (%s§f)"); - provider.add("gtceu.machine.transformer.message_transform_down", + provider.add("machine.gtceu.transformer.message_transform_down", "Transforming Down, In: %s EU %dA, Out: %s EU %dA"); - provider.add("gtceu.machine.transformer.tooltip_transform_up", + provider.add("machine.gtceu.transformer.tooltip_transform_up", "§cTransform Up: §f%dA %s EU (%s§f) -> %dA %s EU (%s§f)"); - provider.add("gtceu.machine.transformer.message_transform_up", + provider.add("machine.gtceu.transformer.message_transform_up", "Transforming Up, In: %s EU %dA, Out: %s EU %dA"); // Diode - provider.add("gtceu.machine.diode.message", "Max Amperage throughput: %s"); - provider.add("gtceu.machine.diode.tooltip_tool_usage", + provider.add("machine.gtceu.diodemessage", "Max Amperage throughput: %s"); + provider.add("machine.gtceu.diodetooltip_tool_usage", "Hit with a Soft Mallet to change Amperage flow."); - provider.add("gtceu.machine.diode.tooltip_general", + provider.add("machine.gtceu.diodetooltip_general", "Allows Energy Flow in one direction and limits Amperage"); - provider.add("gtceu.machine.diode.tooltip_starts_at", "Starts as §f1A§7, use Soft Mallet to change"); + provider.add("machine.gtceu.diodetooltip_starts_at", "Starts as §f1A§7, use Soft Mallet to change"); // Energy Converter - provider.add("gtceu.machine.energy_converter.description", "Converts Energy between EU and FE"); - provider.add("gtceu.machine.energy_converter.tooltip_tool_usage", + provider.add("machine.gtceu.energy_converter.description", "Converts Energy between EU and FE"); + provider.add("machine.gtceu.energy_converter.tooltip_tool_usage", "Starts as §fFE Converter§7, use Soft Mallet to change"); - provider.add("gtceu.machine.energy_converter.tooltip_conversion_native", + provider.add("machine.gtceu.energy_converter.tooltip_conversion_native", "§cNative Conversion: §f%d FE -> %dA %d EU (%s§f)"); - provider.add("gtceu.machine.energy_converter.message_conversion_native", + provider.add("machine.gtceu.energy_converter.message_conversion_native", "Converting Native Energy, In: %d FE, Out: %dA %d EU"); - provider.add("gtceu.machine.energy_converter.tooltip_conversion_eu", + provider.add("machine.gtceu.energy_converter.tooltip_conversion_eu", "§aEU Conversion: §f%dA %d EU (%s§f) -> %d Native"); - provider.add("gtceu.machine.energy_converter.message_conversion_eu", + provider.add("machine.gtceu.energy_converter.message_conversion_eu", "Converting EU, In: %dA %d EU, Out: %d Native"); // Pump - provider.add("gtceu.machine.pump.tooltip", "§7The best way to empty Oceans!"); - provider.add("gtceu.machine.pump.tooltip_buckets", "§f%d §7ticks per Bucket"); + provider.add("machine.gtceu.pump.tooltip", "§7The best way to empty Oceans!"); + provider.add("machine.gtceu.pump.tooltip_buckets", "§f%d §7ticks per Bucket"); // Item Collector - provider.add("gtceu.machine.item_collector.gui.collect_range", + provider.add("machine.gtceu.item_collector.tooltip", "Collects Items around itself"); + provider.add("machine.gtceu.item_collector.gui.collect_range", "Collect within an area of %sx%s blocks"); - provider.add("gtceu.machine.item_collector.tooltip", "Collects Items around itself"); // Fisher - provider.add("gtceu.machine.fisher.tooltip", "Costs string to fish. Consumes one string each time."); - provider.add("gtceu.machine.fisher.speed", "Catches something every %d ticks"); - provider.add("gtceu.machine.fisher.requirement", + provider.add("machine.gtceu.fisher.tooltip", "Costs string to fish. Consumes one string each time."); + provider.add("machine.gtceu.fisher.speed", "Catches something every %d ticks"); + provider.add("machine.gtceu.fisher.requirement", "Requires a %dx%d centered square of water directly below."); // World Accelerator - provider.add("gtceu.machine.world_accelerator.description", + provider.add("machine.gtceu.world_accelerator.description", "Tick accelerates nearby blocks in one of 2 modes: §fTile Entity§7 or §fRandom Tick§7. Use Screwdriver to change mode."); - provider.add("gtceu.machine.world_accelerator.working_area", "§bWorking Area:"); - provider.add("gtceu.machine.world_accelerator.working_area_tile", + provider.add("machine.gtceu.world_accelerator.working_area", "§bWorking Area:"); + provider.add("machine.gtceu.world_accelerator.working_area_tile", " Block Entity Mode:§f Adjacent Blocks"); - provider.add("gtceu.machine.world_accelerator.working_area_random", " Random Tick Mode:§f %dx%d"); - provider.add("gtceu.machine.world_accelerator.mode_tile", "Block Entity Mode"); - provider.add("gtceu.machine.world_accelerator.mode_entity", "Random Tick Mode"); + provider.add("machine.gtceu.world_accelerator.working_area_random", " Random Tick Mode:§f %dx%d"); + provider.add("machine.gtceu.world_accelerator.mode_tile", "Block Entity Mode"); + provider.add("machine.gtceu.world_accelerator.mode_entity", "Random Tick Mode"); // Forming Press provider.add("gtceu.forming_press.naming.press", "§oNamed Press"); @@ -163,21 +163,21 @@ private static void generateCustomMachineTooltips(RegistrateLangProvider provide provider.add("gtceu.scanner.copy_stick_to", "§oCopy of Stick"); // Miner - provider.add("gtceu.machine.miner.tooltip", "§7Mines ores below the Miner! Starts as §f%sx%s §7area"); - provider.add("gtceu.machine.miner.per_block", "§7takes §f%ds §7per Block"); + provider.add("machine.gtceu.miner.tooltip", "§7Mines ores below the Miner! Starts as §f%sx%s §7area"); + provider.add("machine.gtceu.miner.per_block", "§7takes §f%ds §7per Block"); // Buffer - provider.add("gtceu.machine.buffer.tooltip", "A Small Buffer to store Items and Fluids"); + provider.add("machine.gtceu.buffer.tooltip", "A Small Buffer to store Items and Fluids"); // Block Breaker - provider.add("gtceu.machine.block_breaker.tooltip", + provider.add("machine.gtceu.block_breaker.tooltip", "§7Mines block on front face and collects its drops"); - provider.add("gtceu.machine.block_breaker.speed_bonus", "§eSpeed Bonus: §f%d%%"); + provider.add("machine.gtceu.block_breaker.speed_bonus", "§eSpeed Bonus: §f%d%%"); // Creative Chest/Tank - provider.add("gtceu.machine.quantum_chest.tooltip", "§7Better than Storage Drawers"); - provider.add("gtceu.machine.quantum_chest.items_stored", "Item Amount:"); - provider.add("gtceu.machine.quantum_tank.tooltip", "§7Compact place to store all your fluids"); + provider.add("machine.gtceu.quantum_chest.tooltip", "§7Better than Storage Drawers"); + provider.add("machine.gtceu.quantum_chest.items_stored", "Item Amount:"); + provider.add("machine.gtceu.quantum_tank.tooltip", "§7Compact place to store all your fluids"); provider.add("gtceu.creative.chest.item", "Item"); provider.add("gtceu.creative.chest.ipc", "Items per Cycle"); @@ -211,8 +211,8 @@ private static void generateCustomMachineTooltips(RegistrateLangProvider provide provider.add("gtceu.machine.locked_safe.requirements", "§7Replacements required:"); // Drums - provider.add("gtceu.machine.drum.enable_output", "Will drain Fluid to downward adjacent Tanks"); - provider.add("gtceu.machine.drum.disable_output", "Will not drain Fluid"); + provider.add("machine.gtceu.drum.enable_output", "Will drain Fluid to downward adjacent Tanks"); + provider.add("machine.gtceu.drum.disable_output", "Will not drain Fluid"); // Long Distance Pipeline multiLang(provider, "gtceu.machine.endpoint.tooltip", @@ -231,362 +231,362 @@ private static void generateCustomMachineTooltips(RegistrateLangProvider provide private static void generateCustomPerTierMachineTooltips(RegistrateLangProvider provider) { // Macerator - provider.add("gtceu.machine.lv_macerator.tooltip", "§7Shredding your Ores without Byproducts"); - provider.add("gtceu.machine.mv_macerator.tooltip", "§7Shredding your Ores without Byproducts"); - provider.add("gtceu.machine.hv_macerator.tooltip", "§7Shredding your Ores with Byproducts"); - provider.add("gtceu.machine.ev_macerator.tooltip", "§7Shredding your Ores with Byproducts"); - provider.add("gtceu.machine.iv_macerator.tooltip", "§7Blend-O-Matic 9001"); - provider.add("gtceu.machine.luv_macerator.tooltip", "§7Blend-O-Matic 9002"); - provider.add("gtceu.machine.zpm_macerator.tooltip", "§7Blend-O-Matic 9003"); - provider.add("gtceu.machine.uv_macerator.tooltip", "§7Shape Eliminator"); - provider.add("gtceu.machine.uhv_macerator.tooltip", "§7Shape Eliminator"); - provider.add("gtceu.machine.uev_macerator.tooltip", "§7Shape Eliminator"); - provider.add("gtceu.machine.uiv_macerator.tooltip", "§7Shape Eliminator"); - provider.add("gtceu.machine.uxv_macerator.tooltip", "§7Shape Eliminator"); - provider.add("gtceu.machine.opv_macerator.tooltip", "§7Shape Eliminator"); + provider.add("machine.gtceu.lv_macerator.tooltip", "§7Shredding your Ores without Byproducts"); + provider.add("machine.gtceu.mv_macerator.tooltip", "§7Shredding your Ores without Byproducts"); + provider.add("machine.gtceu.hv_macerator.tooltip", "§7Shredding your Ores with Byproducts"); + provider.add("machine.gtceu.ev_macerator.tooltip", "§7Shredding your Ores with Byproducts"); + provider.add("machine.gtceu.iv_macerator.tooltip", "§7Blend-O-Matic 9001"); + provider.add("machine.gtceu.luv_macerator.tooltip", "§7Blend-O-Matic 9002"); + provider.add("machine.gtceu.zpm_macerator.tooltip", "§7Blend-O-Matic 9003"); + provider.add("machine.gtceu.uv_macerator.tooltip", "§7Shape Eliminator"); + provider.add("machine.gtceu.uhv_macerator.tooltip", "§7Shape Eliminator"); + provider.add("machine.gtceu.uev_macerator.tooltip", "§7Shape Eliminator"); + provider.add("machine.gtceu.uiv_macerator.tooltip", "§7Shape Eliminator"); + provider.add("machine.gtceu.uxv_macerator.tooltip", "§7Shape Eliminator"); + provider.add("machine.gtceu.opv_macerator.tooltip", "§7Shape Eliminator"); // Centrifuge - provider.add("gtceu.machine.lv_centrifuge.tooltip", "§7Separating Molecules"); - provider.add("gtceu.machine.mv_centrifuge.tooltip", "§7Separating Molecules"); - provider.add("gtceu.machine.hv_centrifuge.tooltip", "§7Separating Molecules"); - provider.add("gtceu.machine.ev_centrifuge.tooltip", "§7Molecular Separator"); - provider.add("gtceu.machine.iv_centrifuge.tooltip", "§7Molecular Cyclone"); - provider.add("gtceu.machine.luv_centrifuge.tooltip", "§7Molecular Cyclone"); - provider.add("gtceu.machine.zpm_centrifuge.tooltip", "§7Molecular Cyclone"); - provider.add("gtceu.machine.uv_centrifuge.tooltip", "§7Molecular Tornado"); - provider.add("gtceu.machine.uhv_centrifuge.tooltip", "§7Molecular Tornado"); - provider.add("gtceu.machine.uev_centrifuge.tooltip", "§7Molecular Tornado"); - provider.add("gtceu.machine.uiv_centrifuge.tooltip", "§7Molecular Tornado"); - provider.add("gtceu.machine.uxv_centrifuge.tooltip", "§7Molecular Tornado"); - provider.add("gtceu.machine.opv_centrifuge.tooltip", "§7Molecular Tornado"); + provider.add("machine.gtceu.lv_centrifuge.tooltip", "§7Separating Molecules"); + provider.add("machine.gtceu.mv_centrifuge.tooltip", "§7Separating Molecules"); + provider.add("machine.gtceu.hv_centrifuge.tooltip", "§7Separating Molecules"); + provider.add("machine.gtceu.ev_centrifuge.tooltip", "§7Molecular Separator"); + provider.add("machine.gtceu.iv_centrifuge.tooltip", "§7Molecular Cyclone"); + provider.add("machine.gtceu.luv_centrifuge.tooltip", "§7Molecular Cyclone"); + provider.add("machine.gtceu.zpm_centrifuge.tooltip", "§7Molecular Cyclone"); + provider.add("machine.gtceu.uv_centrifuge.tooltip", "§7Molecular Tornado"); + provider.add("machine.gtceu.uhv_centrifuge.tooltip", "§7Molecular Tornado"); + provider.add("machine.gtceu.uev_centrifuge.tooltip", "§7Molecular Tornado"); + provider.add("machine.gtceu.uiv_centrifuge.tooltip", "§7Molecular Tornado"); + provider.add("machine.gtceu.uxv_centrifuge.tooltip", "§7Molecular Tornado"); + provider.add("machine.gtceu.opv_centrifuge.tooltip", "§7Molecular Tornado"); // Laser Engraver - provider.add("gtceu.machine.lv_laser_engraver.tooltip", "§7Don't look directly at the Laser"); - provider.add("gtceu.machine.mv_laser_engraver.tooltip", "§7Don't look directly at the Laser"); - provider.add("gtceu.machine.hv_laser_engraver.tooltip", "§7Don't look directly at the Laser"); - provider.add("gtceu.machine.ev_laser_engraver.tooltip", "§7Don't look directly at the Laser"); - provider.add("gtceu.machine.iv_laser_engraver.tooltip", "§7With the Power of 2.04 MW"); - provider.add("gtceu.machine.luv_laser_engraver.tooltip", "§7With the Power of 8.16 MW"); - provider.add("gtceu.machine.zpm_laser_engraver.tooltip", "§7With the Power of 32.64 MW"); - provider.add("gtceu.machine.uv_laser_engraver.tooltip", "§7Exact Photon Cannon"); - provider.add("gtceu.machine.uhv_laser_engraver.tooltip", "§7Exact Photon Cannon"); - provider.add("gtceu.machine.uev_laser_engraver.tooltip", "§7Exact Photon Cannon"); - provider.add("gtceu.machine.uiv_laser_engraver.tooltip", "§7Exact Photon Cannon"); - provider.add("gtceu.machine.uxv_laser_engraver.tooltip", "§7Exact Photon Cannon"); - provider.add("gtceu.machine.opv_laser_engraver.tooltip", "§7Exact Photon Cannon"); + provider.add("machine.gtceu.lv_laser_engraver.tooltip", "§7Don't look directly at the Laser"); + provider.add("machine.gtceu.mv_laser_engraver.tooltip", "§7Don't look directly at the Laser"); + provider.add("machine.gtceu.hv_laser_engraver.tooltip", "§7Don't look directly at the Laser"); + provider.add("machine.gtceu.ev_laser_engraver.tooltip", "§7Don't look directly at the Laser"); + provider.add("machine.gtceu.iv_laser_engraver.tooltip", "§7With the Power of 2.04 MW"); + provider.add("machine.gtceu.luv_laser_engraver.tooltip", "§7With the Power of 8.16 MW"); + provider.add("machine.gtceu.zpm_laser_engraver.tooltip", "§7With the Power of 32.64 MW"); + provider.add("machine.gtceu.uv_laser_engraver.tooltip", "§7Exact Photon Cannon"); + provider.add("machine.gtceu.uhv_laser_engraver.tooltip", "§7Exact Photon Cannon"); + provider.add("machine.gtceu.uev_laser_engraver.tooltip", "§7Exact Photon Cannon"); + provider.add("machine.gtceu.uiv_laser_engraver.tooltip", "§7Exact Photon Cannon"); + provider.add("machine.gtceu.uxv_laser_engraver.tooltip", "§7Exact Photon Cannon"); + provider.add("machine.gtceu.opv_laser_engraver.tooltip", "§7Exact Photon Cannon"); // Thermal Centrifuge - provider.add("gtceu.machine.lv_thermal_centrifuge.tooltip", "§7Separating Ores more precisely"); - provider.add("gtceu.machine.mv_thermal_centrifuge.tooltip", "§7Separating Ores more precisely"); - provider.add("gtceu.machine.hv_thermal_centrifuge.tooltip", "§7Separating Ores more precisely"); - provider.add("gtceu.machine.ev_thermal_centrifuge.tooltip", "§7Separating Ores more precisely"); - provider.add("gtceu.machine.iv_thermal_centrifuge.tooltip", "§7Blaze Sweatshop T-6350"); - provider.add("gtceu.machine.luv_thermal_centrifuge.tooltip", "§7Blaze Sweatshop T-6351"); - provider.add("gtceu.machine.zpm_thermal_centrifuge.tooltip", "§7Blaze Sweatshop T-6352"); - provider.add("gtceu.machine.uv_thermal_centrifuge.tooltip", "§7Fire Cyclone"); - provider.add("gtceu.machine.uhv_thermal_centrifuge.tooltip", "§7Fire Cyclone"); - provider.add("gtceu.machine.uev_thermal_centrifuge.tooltip", "§7Fire Cyclone"); - provider.add("gtceu.machine.uiv_thermal_centrifuge.tooltip", "§7Fire Cyclone"); - provider.add("gtceu.machine.uxv_thermal_centrifuge.tooltip", "§7Fire Cyclone"); - provider.add("gtceu.machine.opv_thermal_centrifuge.tooltip", "§7Fire Cyclone"); + provider.add("machine.gtceu.lv_thermal_centrifuge.tooltip", "§7Separating Ores more precisely"); + provider.add("machine.gtceu.mv_thermal_centrifuge.tooltip", "§7Separating Ores more precisely"); + provider.add("machine.gtceu.hv_thermal_centrifuge.tooltip", "§7Separating Ores more precisely"); + provider.add("machine.gtceu.ev_thermal_centrifuge.tooltip", "§7Separating Ores more precisely"); + provider.add("machine.gtceu.iv_thermal_centrifuge.tooltip", "§7Blaze Sweatshop T-6350"); + provider.add("machine.gtceu.luv_thermal_centrifuge.tooltip", "§7Blaze Sweatshop T-6351"); + provider.add("machine.gtceu.zpm_thermal_centrifuge.tooltip", "§7Blaze Sweatshop T-6352"); + provider.add("machine.gtceu.uv_thermal_centrifuge.tooltip", "§7Fire Cyclone"); + provider.add("machine.gtceu.uhv_thermal_centrifuge.tooltip", "§7Fire Cyclone"); + provider.add("machine.gtceu.uev_thermal_centrifuge.tooltip", "§7Fire Cyclone"); + provider.add("machine.gtceu.uiv_thermal_centrifuge.tooltip", "§7Fire Cyclone"); + provider.add("machine.gtceu.uxv_thermal_centrifuge.tooltip", "§7Fire Cyclone"); + provider.add("machine.gtceu.opv_thermal_centrifuge.tooltip", "§7Fire Cyclone"); // Electrolyzer - provider.add("gtceu.machine.lv_electrolyzer.tooltip", "§7Electrolyzing Molecules"); - provider.add("gtceu.machine.mv_electrolyzer.tooltip", "§7Electrolyzing Molecules"); - provider.add("gtceu.machine.hv_electrolyzer.tooltip", "§7Electrolyzing Molecules"); - provider.add("gtceu.machine.ev_electrolyzer.tooltip", "§7Electrolyzing Molecules"); - provider.add("gtceu.machine.iv_electrolyzer.tooltip", "§7Molecular Disintegrator E-4906"); - provider.add("gtceu.machine.luv_electrolyzer.tooltip", "§7Molecular Disintegrator E-4907"); - provider.add("gtceu.machine.zpm_electrolyzer.tooltip", "§7Molecular Disintegrator E-4908"); - provider.add("gtceu.machine.uv_electrolyzer.tooltip", "§7Atomic Ionizer"); - provider.add("gtceu.machine.uhv_electrolyzer.tooltip", "§7Atomic Ionizer"); - provider.add("gtceu.machine.uev_electrolyzer.tooltip", "§7Atomic Ionizer"); - provider.add("gtceu.machine.uiv_electrolyzer.tooltip", "§7Atomic Ionizer"); - provider.add("gtceu.machine.uxv_electrolyzer.tooltip", "§7Atomic Ionizer"); - provider.add("gtceu.machine.opv_electrolyzer.tooltip", "§7Atomic Ionizer"); + provider.add("machine.gtceu.lv_electrolyzer.tooltip", "§7Electrolyzing Molecules"); + provider.add("machine.gtceu.mv_electrolyzer.tooltip", "§7Electrolyzing Molecules"); + provider.add("machine.gtceu.hv_electrolyzer.tooltip", "§7Electrolyzing Molecules"); + provider.add("machine.gtceu.ev_electrolyzer.tooltip", "§7Electrolyzing Molecules"); + provider.add("machine.gtceu.iv_electrolyzer.tooltip", "§7Molecular Disintegrator E-4906"); + provider.add("machine.gtceu.luv_electrolyzer.tooltip", "§7Molecular Disintegrator E-4907"); + provider.add("machine.gtceu.zpm_electrolyzer.tooltip", "§7Molecular Disintegrator E-4908"); + provider.add("machine.gtceu.uv_electrolyzer.tooltip", "§7Atomic Ionizer"); + provider.add("machine.gtceu.uhv_electrolyzer.tooltip", "§7Atomic Ionizer"); + provider.add("machine.gtceu.uev_electrolyzer.tooltip", "§7Atomic Ionizer"); + provider.add("machine.gtceu.uiv_electrolyzer.tooltip", "§7Atomic Ionizer"); + provider.add("machine.gtceu.uxv_electrolyzer.tooltip", "§7Atomic Ionizer"); + provider.add("machine.gtceu.opv_electrolyzer.tooltip", "§7Atomic Ionizer"); // Lathe - provider.add("gtceu.machine.lv_lathe.tooltip", "§7Produces Rods more efficiently"); - provider.add("gtceu.machine.mv_lathe.tooltip", "§7Produces Rods more efficiently"); - provider.add("gtceu.machine.hv_lathe.tooltip", "§7Produces Rods more efficiently"); - provider.add("gtceu.machine.ev_lathe.tooltip", "§7Produces Rods more efficiently"); - provider.add("gtceu.machine.iv_lathe.tooltip", "§7Turn-O-Matic L-5906"); - provider.add("gtceu.machine.luv_lathe.tooltip", "§7Turn-O-Matic L-5907"); - provider.add("gtceu.machine.zpm_lathe.tooltip", "§7Turn-O-Matic L-5908"); - provider.add("gtceu.machine.uv_lathe.tooltip", "§7Rotation Grinder"); - provider.add("gtceu.machine.uhv_lathe.tooltip", "§7Rotation Grinder"); - provider.add("gtceu.machine.uev_lathe.tooltip", "§7Rotation Grinder"); - provider.add("gtceu.machine.uiv_lathe.tooltip", "§7Rotation Grinder"); - provider.add("gtceu.machine.uxv_lathe.tooltip", "§7Rotation Grinder"); - provider.add("gtceu.machine.opv_lathe.tooltip", "§7Rotation Grinder"); + provider.add("machine.gtceu.lv_lathe.tooltip", "§7Produces Rods more efficiently"); + provider.add("machine.gtceu.mv_lathe.tooltip", "§7Produces Rods more efficiently"); + provider.add("machine.gtceu.hv_lathe.tooltip", "§7Produces Rods more efficiently"); + provider.add("machine.gtceu.ev_lathe.tooltip", "§7Produces Rods more efficiently"); + provider.add("machine.gtceu.iv_lathe.tooltip", "§7Turn-O-Matic L-5906"); + provider.add("machine.gtceu.luv_lathe.tooltip", "§7Turn-O-Matic L-5907"); + provider.add("machine.gtceu.zpm_lathe.tooltip", "§7Turn-O-Matic L-5908"); + provider.add("machine.gtceu.uv_lathe.tooltip", "§7Rotation Grinder"); + provider.add("machine.gtceu.uhv_lathe.tooltip", "§7Rotation Grinder"); + provider.add("machine.gtceu.uev_lathe.tooltip", "§7Rotation Grinder"); + provider.add("machine.gtceu.uiv_lathe.tooltip", "§7Rotation Grinder"); + provider.add("machine.gtceu.uxv_lathe.tooltip", "§7Rotation Grinder"); + provider.add("machine.gtceu.opv_lathe.tooltip", "§7Rotation Grinder"); // Ore Washer - provider.add("gtceu.machine.lv_ore_washer.tooltip", "§7Getting more Byproducts from your Ores"); - provider.add("gtceu.machine.mv_ore_washer.tooltip", "§7Getting more Byproducts from your Ores"); - provider.add("gtceu.machine.hv_ore_washer.tooltip", "§7Getting more Byproducts from your Ores"); - provider.add("gtceu.machine.ev_ore_washer.tooltip", "§7Getting more Byproducts from your Ores"); - provider.add("gtceu.machine.iv_ore_washer.tooltip", "§7Repurposed Laundry-Washer I-360"); - provider.add("gtceu.machine.luv_ore_washer.tooltip", "§7Repurposed Laundry-Washer I-361"); - provider.add("gtceu.machine.zpm_ore_washer.tooltip", "§7Repurposed Laundry-Washer I-362"); - provider.add("gtceu.machine.uv_ore_washer.tooltip", "§7Miniature Car Wash"); - provider.add("gtceu.machine.uhv_ore_washer.tooltip", "§7Miniature Car Wash"); - provider.add("gtceu.machine.uev_ore_washer.tooltip", "§7Miniature Car Wash"); - provider.add("gtceu.machine.uiv_ore_washer.tooltip", "§7Miniature Car Wash"); - provider.add("gtceu.machine.uxv_ore_washer.tooltip", "§7Miniature Car Wash"); - provider.add("gtceu.machine.opv_ore_washer.tooltip", "§7Miniature Car Wash"); + provider.add("machine.gtceu.lv_ore_washer.tooltip", "§7Getting more Byproducts from your Ores"); + provider.add("machine.gtceu.mv_ore_washer.tooltip", "§7Getting more Byproducts from your Ores"); + provider.add("machine.gtceu.hv_ore_washer.tooltip", "§7Getting more Byproducts from your Ores"); + provider.add("machine.gtceu.ev_ore_washer.tooltip", "§7Getting more Byproducts from your Ores"); + provider.add("machine.gtceu.iv_ore_washer.tooltip", "§7Repurposed Laundry-Washer I-360"); + provider.add("machine.gtceu.luv_ore_washer.tooltip", "§7Repurposed Laundry-Washer I-361"); + provider.add("machine.gtceu.zpm_ore_washer.tooltip", "§7Repurposed Laundry-Washer I-362"); + provider.add("machine.gtceu.uv_ore_washer.tooltip", "§7Miniature Car Wash"); + provider.add("machine.gtceu.uhv_ore_washer.tooltip", "§7Miniature Car Wash"); + provider.add("machine.gtceu.uev_ore_washer.tooltip", "§7Miniature Car Wash"); + provider.add("machine.gtceu.uiv_ore_washer.tooltip", "§7Miniature Car Wash"); + provider.add("machine.gtceu.uxv_ore_washer.tooltip", "§7Miniature Car Wash"); + provider.add("machine.gtceu.opv_ore_washer.tooltip", "§7Miniature Car Wash"); // Electric Furnace - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "electric_furnace", "Not like using a Commodore 64", "Electron Excitement Processor", "Atom Stimulator"); // Alloy Smelter - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "alloy_smelter", "HighTech combination Smelter", "Alloy Integrator", "Metal Amalgamator"); // Arc Furnace - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "arc_furnace", "Who needs a Blast Furnace?", "Discharge Heater", "Short Circuit Heater"); // Assembler - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "assembler", "Avengers, Assemble!", "NOT a Crafting Table", "Assembly Constructor"); // Autoclave - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "autoclave", "Crystallizing your Dusts", "Pressure Cooker", "Encumbrance Unit"); // Bender - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "bender", "Boo, he's bad! We want BENDER!!!", "Shape Distorter", "Matter Deformer"); // Brewery - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "brewery", "Compact and efficient potion brewing", "Brewing your Drinks", "Brew Rusher"); // Canner - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "canner", "Puts things into and out of Containers", "Can Operator", "Can Actuator"); // Chemical Bath - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "chemical_bath", "Bathing Ores in Chemicals to separate them", "Chemical Soaker", "Chemical Dunktron"); // Chemical Reactor - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "chemical_reactor", "Letting Chemicals react with each other", "Chemical Performer", "Reaction Catalyzer"); // Compressor - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "compressor", "Compress-O-Matic C77", "Singularity Condenser", "Matter Constrictor"); // Cutter - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "cutter", "Slice'N Dice", "Matter Cleaver", "Object Divider"); // Distillery - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "distillery", "Extracting most relevant Parts of Fluids", "Condensation Separator", "Fraction Splitter"); // Electromagnetic Separator - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "electromagnetic_separator", "Separating the magnetic Ores from the rest", "EM Categorizer", "EMF Dispeller"); // Extractor - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "extractor", "Dejuicer-Device of Doom - D123", "Vacuum Extractinator", "Liquefying Sucker"); // Extruder - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "extruder", "Universal Machine for Metal Working", "Material Displacer", "Shape Driver"); // Fermenter - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "fermenter", "Fermenting Fluids", "Fermentation Hastener", "Respiration Controller"); // Fluid Heater - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "fluid_heater", "Heating up your Fluids", "Heat Infuser", "Thermal Imbuer"); // Fluid Solidifier - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "fluid_solidifier", "Cools Fluids down to form Solids", "Not an Ice Machine", "Fluid Petrificator"); // Forge Hammer - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "forge_hammer", "Stop, Hammertime!", "Plate Forger", "Impact Modulator"); // Forming Press - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "forming_press", "Imprinting Images into things", "Object Layerer", "Surface Shifter"); // Mixer - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "mixer", "Will it Blend?", "Matter Organizer", "Material Homogenizer"); // Packer - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "packer", "Puts things into and Grabs things out of Boxes", "Boxinator", "Amazon Warehouse"); // Polarizer - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "polarizer", "Bipolarising your Magnets", "Magnetism Inducer", "Magnetic Field Rearranger"); // Sifter - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "sifter", "Stay calm and keep sifting", "Sponsored by TFC", "Pulsation Filter"); // Wiremill - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "wiremill", "Produces Wires more efficiently", "Ingot Elongator", "Wire Transfigurator"); // Circuit Assembler - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "circuit_assembler", "Pick-n-Place all over the place", "Electronics Manufacturer", "Computation Factory"); // Mass Fabricator - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "mass_fabricator", "UUM Matter * Fabrication Squared", "Genesis Factory", "Existence Initiator"); // Replicator - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "replicator", "Producing the Purest of Elements", "Matter Paster", "Elemental Composer"); // Scanner - standardTooltips(provider, "gtceu.machine", + standardTooltips(provider, "gtceu", "scanner", "Scans Materials and other things", "Anomaly Detector", "Electron Microscope"); // Gas Collector - provider.add("gtceu.machine.lv_gas_collector.tooltip", + provider.add("machine.gtceu.lv_gas_collector.tooltip", "§7Collects Gas from the air depending on the dimension"); - provider.add("gtceu.machine.mv_gas_collector.tooltip", + provider.add("machine.gtceu.mv_gas_collector.tooltip", "§7Collects Gas from the air depending on the dimension"); - provider.add("gtceu.machine.hv_gas_collector.tooltip", + provider.add("machine.gtceu.hv_gas_collector.tooltip", "§7Collects Gas from the air depending on the dimension"); - provider.add("gtceu.machine.ev_gas_collector.tooltip", + provider.add("machine.gtceu.ev_gas_collector.tooltip", "§7Collects Gas from the air depending on the dimension"); - provider.add("gtceu.machine.iv_gas_collector.tooltip", + provider.add("machine.gtceu.iv_gas_collector.tooltip", "§7Collects Gas from the atmosphere depending on the dimension"); - provider.add("gtceu.machine.luv_gas_collector.tooltip", + provider.add("machine.gtceu.luv_gas_collector.tooltip", "§7Collects Gas from the atmosphere depending on the dimension"); - provider.add("gtceu.machine.zpm_gas_collector.tooltip", + provider.add("machine.gtceu.zpm_gas_collector.tooltip", "§7Collects Gas from the atmosphere depending on the dimension"); - provider.add("gtceu.machine.uv_gas_collector.tooltip", + provider.add("machine.gtceu.uv_gas_collector.tooltip", "§7Collects Gas from the solar system depending on the dimension"); - provider.add("gtceu.machine.uhv_gas_collector.tooltip", + provider.add("machine.gtceu.uhv_gas_collector.tooltip", "§7Collects Gas from the solar system depending on the dimension"); - provider.add("gtceu.machine.uev_gas_collector.tooltip", + provider.add("machine.gtceu.uev_gas_collector.tooltip", "§7Collects Gas from the solar system depending on the dimension"); - provider.add("gtceu.machine.uiv_gas_collector.tooltip", + provider.add("machine.gtceu.uiv_gas_collector.tooltip", "§7Collects Gas from the solar system depending on the dimension"); - provider.add("gtceu.machine.uxv_gas_collector.tooltip", + provider.add("machine.gtceu.uxv_gas_collector.tooltip", "§7Collects Gas from the solar system depending on the dimension"); - provider.add("gtceu.machine.opv_gas_collector.tooltip", + provider.add("machine.gtceu.opv_gas_collector.tooltip", "§7Collects Gas from the universe depending on the dimension"); // Rock Breaker - provider.add("gtceu.machine.lv_rock_crusher.tooltip", "§7Place Water and Lava horizontally adjacent"); - provider.add("gtceu.machine.mv_rock_crusher.tooltip", "§7Place Water and Lava horizontally adjacent"); - provider.add("gtceu.machine.hv_rock_crusher.tooltip", "§7Place Water and Lava horizontally adjacent"); - provider.add("gtceu.machine.ev_rock_crusher.tooltip", "§7Place Water and Lava horizontally adjacent"); - provider.add("gtceu.machine.iv_rock_crusher.tooltip", "§7Cryogenic Magma Solidifier R-8200"); - provider.add("gtceu.machine.luv_rock_crusher.tooltip", "§7Cryogenic Magma Solidifier R-9200"); - provider.add("gtceu.machine.zpm_rock_crusher.tooltip", "§7Cryogenic Magma Solidifier R-10200"); - provider.add("gtceu.machine.uv_rock_crusher.tooltip", "§7Volcanic Formation Chamber"); - provider.add("gtceu.machine.uhv_rock_crusher.tooltip", "§7Volcanic Formation Chamber"); - provider.add("gtceu.machine.uev_rock_crusher.tooltip", "§7Volcanic Formation Chamber"); - provider.add("gtceu.machine.uiv_rock_crusher.tooltip", "§7Volcanic Formation Chamber"); - provider.add("gtceu.machine.uxv_rock_crusher.tooltip", "§7Volcanic Formation Chamber"); - provider.add("gtceu.machine.opv_rock_crusher.tooltip", "§7Volcanic Formation Chamber"); + provider.add("machine.gtceu.lv_rock_crusher.tooltip", "§7Place Water and Lava horizontally adjacent"); + provider.add("machine.gtceu.mv_rock_crusher.tooltip", "§7Place Water and Lava horizontally adjacent"); + provider.add("machine.gtceu.hv_rock_crusher.tooltip", "§7Place Water and Lava horizontally adjacent"); + provider.add("machine.gtceu.ev_rock_crusher.tooltip", "§7Place Water and Lava horizontally adjacent"); + provider.add("machine.gtceu.iv_rock_crusher.tooltip", "§7Cryogenic Magma Solidifier R-8200"); + provider.add("machine.gtceu.luv_rock_crusher.tooltip", "§7Cryogenic Magma Solidifier R-9200"); + provider.add("machine.gtceu.zpm_rock_crusher.tooltip", "§7Cryogenic Magma Solidifier R-10200"); + provider.add("machine.gtceu.uv_rock_crusher.tooltip", "§7Volcanic Formation Chamber"); + provider.add("machine.gtceu.uhv_rock_crusher.tooltip", "§7Volcanic Formation Chamber"); + provider.add("machine.gtceu.uev_rock_crusher.tooltip", "§7Volcanic Formation Chamber"); + provider.add("machine.gtceu.uiv_rock_crusher.tooltip", "§7Volcanic Formation Chamber"); + provider.add("machine.gtceu.uxv_rock_crusher.tooltip", "§7Volcanic Formation Chamber"); + provider.add("machine.gtceu.opv_rock_crusher.tooltip", "§7Volcanic Formation Chamber"); } private static void generateGeneralMultiblockTooltips(RegistrateLangProvider provider) { @@ -597,23 +597,23 @@ private static void generateGeneralMultiblockTooltips(RegistrateLangProvider pro private static void generateCustomMultiblockTooltips(RegistrateLangProvider provider) { // Primitive Water Pump + provider.add("machine.gtceu.primitive_pump.tooltip", "Endervoir at Home"); provider.add("gtceu.multiblock.primitive_water_pump.description", "The Primitive Water Pump is a pre-Steam Era multiblock that collects water once per second, depending on the Biome it is in. It can use a Pump, ULV, or LV Output Hatch, increasing the amount of water per tier. Follows the formula: Biome Coefficient * Hatch Multiplier."); multilineLang(provider, "gtceu.multiblock.primitive_water_pump.extra1", "Biome Coefficient:\n Ocean, River: 1000 mB/s\n Swamp: 800 mB/s\n Jungle: 350 mB/s\n Snowy: 300 mB/s\n Plains, Forest: 250 mB/s\n Taiga: 175 mB/s\n Beach: 170 mB/s\n Other: 100 mB/s"); multilineLang(provider, "gtceu.multiblock.primitive_water_pump.extra2", "Hatch Multipliers:\n Pump Hatch: 1x\n ULV Output Hatch: 2x\n LV Output Hatch: 4x\n\nWhile raining in the Pump's Biome, the total water production will be increased by 50%%."); - provider.add("gtceu.machine.primitive_water_pump.tooltip", "Endervoir at Home"); // Primitive Blast Furnace + provider.add("machine.gtceu.primitive_blast_furnace.tooltip", "Making your first Steel"); provider.add("gtceu.multiblock.primitive_blast_furnace.bronze.description", "The Primitive Blast Furnace (PBF) is a multiblock structure used for cooking steel in the early game. Although not very fast, it will provide you with steel for your first setups."); - provider.add("gtceu.machine.primitive_blast_furnace.bronze.tooltip", "Making your first Steel"); // Electric Blast Furnace - provider.add("gtceu.machine.electric_blast_furnace.tooltip", "Where's the electric smoker?"); + provider.add("machine.gtceu.electric_blast_furnace.tooltip", "Where's the electric smoker?"); provider.add("gtceu.multiblock.blast_furnace.max_temperature", "Heat Capacity: %s"); - multiLang(provider, "gtceu.machine.electric_blast_furnace.tooltip", + multiLang(provider, "machine.gtceu.electric_blast_furnace.tooltip", "For every §f900K§7 above the recipe temperature, a multiplicative §f95%%§7 energy multiplier is applied pre-overclocking.", "For every §f1800K§7 above the recipe temperature, one overclock becomes §f100%% efficient§7 (perfect overclock).", "For every voltage tier above §bMV§7, temperature is increased by §f100K§7."); @@ -621,36 +621,36 @@ private static void generateCustomMultiblockTooltips(RegistrateLangProvider prov "The Electric Blast Furnace (EBF) is a multiblock structure used for smelting alloys, cooking metals and refining ores. It is required for obtaining high-tier alloys and metals, such as aluminium, stainless steel, titanium, and naquadah alloy."); // Coke Oven - provider.add("gtceu.machine.coke_oven.tooltip", "Making better fuels for Steel and Power"); + provider.add("machine.gtceu.coke_oven.tooltip", "Making better fuels for Steel and Power"); provider.add("gtceu.multiblock.coke_oven.description", "The Coke Oven is a multiblock structure used for getting coke and creosote in the early game. It doesn't require fuel and has an internal tank of 32 buckets for creosote. Its inventory can be accessed via its Coke Oven Hatch."); // Steam Grinder + provider.add("machine.gtceu.steam_grinder.tooltip", "A multiblock Macerator without the Byproducts"); provider.add("gtceu.multiblock.steam_grinder.description", "A Multiblock Macerator at the Steam Age. Requires at least 14 Bronze Casings to form. Cannot use normal Input/Output busses, nor Fluid Hatches other than the Steam Hatch."); - provider.add("gtceu.machine.steam_grinder.tooltip", "A multiblock Macerator without the Byproducts"); // Steam Oven + provider.add("machine.gtceu.steam_oven.tooltip", "Not to be confused with Multi-Smelter"); provider.add("gtceu.multiblock.steam_oven.description", "A Multi Smelter at the Steam Age. Requires at least 6 Bronze Casings to form. Cannot use normal Input/Output busses, nor Fluid Hatches other than the Steam Hatch. Steam Hatch must be on the bottom layer, no more than one."); - provider.add("gtceu.machine.steam_oven.tooltip", "Not to be confused with Multi-Smelter"); // General Steam Multiblocks provider.add("gtceu.multiblock.steam.low_steam", "Not enough Steam to run!"); provider.add("gtceu.multiblock.steam.steam_stored", "Steam: %s / %s mb"); provider.add("gtceu.multiblock.steam.duration_modifier", "Takes §f1.5x §7base duration to process, not affected by number of items."); - provider.add("gtceu.machine.steam.steam_hatch.tooltip", "§eAccepted Fluid: §fSteam"); - provider.add("gtceu.machine.steam_bus.tooltip", "Does not work with non-steam multiblocks"); + provider.add("machine.gtceu.steam.steam_hatch.tooltip", "§eAccepted Fluid: §fSteam"); + provider.add("machine.gtceu.steam_bus.tooltip", "Does not work with non-steam multiblocks"); provider.add("gtceu.multiblock.require_steam_parts", "Requires Steam Hatches and Buses!"); // Large Boiler + provider.add("machine.gtceu.bronze_large_boiler.tooltip", "We need more Steam!"); + provider.add("machine.gtceu.steel_large_boiler.tooltip", "Charcoal Incinerator"); + provider.add("machine.gtceu.titanium_large_boiler.tooltip", "Where's the Magic Super Fuel?"); + provider.add("machine.gtceu.tungstensteel_large_boiler.tooltip", "How do you even fuel this thing?"); provider.add("gtceu.multiblock.large_boiler.description", "Large Boilers are multiblocks that generate steam from an energy source and water. Said energy source is either any Solid Fuel with a Burn Time, or a Diesel/Semi-Fluid Fuel. Can be throttled back in increments of 5%% to reduce Steam output and Fuel consumption."); - provider.add("gtceu.machine.large_boiler.bronze.tooltip", "We need more Steam!"); - provider.add("gtceu.machine.large_boiler.steel.tooltip", "Charcoal Incinerator"); - provider.add("gtceu.machine.large_boiler.titanium.tooltip", "Where's the Magic Super Fuel?"); - provider.add("gtceu.machine.large_boiler.tungstensteel.tooltip", "How do you even fuel this thing?"); provider.add("gtceu.multiblock.large_boiler.max_temperature", "Max Temperature: %dK, Steam Production: %dmB/t"); provider.add("gtceu.multiblock.large_boiler.efficiency", "Efficiency: %s"); @@ -667,7 +667,7 @@ private static void generateCustomMultiblockTooltips(RegistrateLangProvider prov "Will explode if provided Fuel with no Water"); // Multi Smelter - provider.add("gtceu.machine.multi_furnace.tooltip", "Just like the Oven at Home"); + provider.add("machine.gtceu.multi_smelter.tooltip", "Just like the Oven at Home"); provider.add("gtceu.multiblock.multi_furnace.description", "The Multi Smelter is a multiblock structure used for smelting massive amounts of items at once. Different tiers of coils provide a speed boost and energy efficiency gain. 32 is the base value of items smelted per operation, and can be multiplied by using higher level coils."); provider.add("gtceu.multiblock.multi_furnace.heating_coil_level", "Heating Coil Level: %s"); @@ -676,7 +676,7 @@ private static void generateCustomMultiblockTooltips(RegistrateLangProvider prov // Large Chemical Reactor provider.add("gtceu.multiblock.large_chemical_reactor.description", "The Large Chemical Reactor performs chemical reactions at 100%% energy efficiency. Overclocks multiply both speed and energy by 4. The multiblock requires exactly 1 Cupronickel Coil Block, which must be placed adjacent to the PTFE Pipe casing located in the center."); - provider.add("gtceu.machine.large_chemical_reactor.tooltip", "Black Box Reactor"); + provider.add("machine.gtceu.large_chemical_reactor.tooltip", "Black Box Reactor"); // Vacuum Freezer provider.add("gtceu.machine.vacuum_freezer.tooltip", "Aluminium Ice Box"); @@ -1196,19 +1196,19 @@ private static void generateCustomMultiblockPartTooltips(RegistrateLangProvider /** * Generates tooltips for both variants of steam machine */ - private static void makeSteamMachineTooltip(RegistrateLangProvider provider, String root, String machineName, + private static void makeSteamMachineTooltip(RegistrateLangProvider provider, String modId, String machineName, String lpTooltip, String hpTooltip) { - provider.add("%s.lp_%s.tooltip".formatted(root, machineName), "§7%s".formatted(lpTooltip)); - provider.add("%s.hp_%s.tooltip".formatted(root, machineName), "§7%s".formatted(hpTooltip)); + provider.add("machine.%s.lp_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(lpTooltip)); + provider.add("machine.%s.hp_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(hpTooltip)); } /** * Generates tooltips for LV-HV machines */ - private static void makeElectricMachineTooltipLVtoHV(RegistrateLangProvider provider, String root, + private static void makeElectricMachineTooltipLVtoHV(RegistrateLangProvider provider, String modId, String machineName, String lvTooltip, String mvTooltip, String hvTooltip) { - makeElectricMachineTooltipULVtoMAX(provider, root, machineName, + makeElectricMachineTooltipULVtoMAX(provider, modId, machineName, null, lvTooltip, mvTooltip, hvTooltip, null, null, null, null, null, null, null, null, @@ -1218,13 +1218,13 @@ private static void makeElectricMachineTooltipLVtoHV(RegistrateLangProvider prov /** * Generates tooltips for LV-UV machines */ - private static void makeElectricMachineTooltipLVtoUV(RegistrateLangProvider provider, String root, + private static void makeElectricMachineTooltipLVtoUV(RegistrateLangProvider provider, String modId, String machineName, String lvTooltip, String mvTooltip, String hvTooltip, String evTooltip, String ivTooltip, String luvTooltip, String zpmTooltip, String uvTooltip) { - makeElectricMachineTooltipULVtoMAX(provider, root, machineName, + makeElectricMachineTooltipULVtoMAX(provider, modId, machineName, null, lvTooltip, mvTooltip, hvTooltip, evTooltip, ivTooltip, luvTooltip, zpmTooltip, uvTooltip, null, null, null, @@ -1235,7 +1235,7 @@ private static void makeElectricMachineTooltipLVtoUV(RegistrateLangProvider prov * Generates tooltips for ULV-MAX Machines
* If null it won't be added */ - private static void makeElectricMachineTooltipULVtoMAX(RegistrateLangProvider provider, String root, + private static void makeElectricMachineTooltipULVtoMAX(RegistrateLangProvider provider, String modId, String machineName, String ulvTooltip, String lvTooltip, String mvTooltip, String hvTooltip, String evTooltip, String ivTooltip, @@ -1243,49 +1243,49 @@ private static void makeElectricMachineTooltipULVtoMAX(RegistrateLangProvider pr String uhvTooltip, String uevTooltip, String uivTooltip, String uxvTooltip, String opvTooltip, String maxTooltip) { if (ulvTooltip != null) { - provider.add("%s.ulv_%s.tooltip".formatted(root, machineName), "§7%s".formatted(ulvTooltip)); + provider.add("machine.%s.ulv_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(ulvTooltip)); } if (lvTooltip != null) { - provider.add("%s.lv_%s.tooltip".formatted(root, machineName), "§7%s".formatted(lvTooltip)); + provider.add("machine.%s.lv_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(lvTooltip)); } if (mvTooltip != null) { - provider.add("%s.mv_%s.tooltip".formatted(root, machineName), "§7%s".formatted(mvTooltip)); + provider.add("machine.%s.mv_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(mvTooltip)); } if (hvTooltip != null) { - provider.add("%s.hv_%s.tooltip".formatted(root, machineName), "§7%s".formatted(hvTooltip)); + provider.add("machine.%s.hv_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(hvTooltip)); } if (evTooltip != null) { - provider.add("%s.ev_%s.tooltip".formatted(root, machineName), "§7%s".formatted(evTooltip)); + provider.add("machine.%s.ev_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(evTooltip)); } if (ivTooltip != null) { - provider.add("%s.iv_%s.tooltip".formatted(root, machineName), "§7%s".formatted(ivTooltip)); + provider.add("machine.%s.iv_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(ivTooltip)); } if (luvTooltip != null) { - provider.add("%s.luv_%s.tooltip".formatted(root, machineName), "§7%s".formatted(luvTooltip)); + provider.add("machine.%s.luv_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(luvTooltip)); } if (zpmTooltip != null) { - provider.add("%s.zpm_%s.tooltip".formatted(root, machineName), "§7%s".formatted(zpmTooltip)); + provider.add("machine.%s.zpm_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(zpmTooltip)); } if (uvTooltip != null) { - provider.add("%s.uv_%s.tooltip".formatted(root, machineName), "§7%s".formatted(uvTooltip)); + provider.add("machine.%s.uv_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(uvTooltip)); } if (uhvTooltip != null) { - provider.add("%s.uhv_%s.tooltip".formatted(root, machineName), "§7%s".formatted(uhvTooltip)); + provider.add("machine.%s.uhv_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(uhvTooltip)); } if (uevTooltip != null) { - provider.add("%s.uev_%s.tooltip".formatted(root, machineName), "§7%s".formatted(uevTooltip)); + provider.add("machine.%s.uev_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(uevTooltip)); } if (uivTooltip != null) { - provider.add("%s.uiv_%s.tooltip".formatted(root, machineName), "§7%s".formatted(uivTooltip)); + provider.add("machine.%s.uiv_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(uivTooltip)); } if (uxvTooltip != null) { - provider.add("%s.uxv_%s.tooltip".formatted(root, machineName), "§7%s".formatted(uxvTooltip)); + provider.add("machine.%s.uxv_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(uxvTooltip)); } if (opvTooltip != null) { - provider.add("%s.opv_%s.tooltip".formatted(root, machineName), "§7%s".formatted(opvTooltip)); + provider.add("machine.%s.opv_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(opvTooltip)); } if (maxTooltip != null) { - provider.add("%s.max_%s.tooltip".formatted(root, machineName), "§7%s".formatted(maxTooltip)); + provider.add("machine.%s.max_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(maxTooltip)); } } @@ -1382,10 +1382,10 @@ public static void generateMultiblockKeys(RegistrateLangProvider provider) { "The machine must be off to switch modes!"); provider.add("gtceu.gui.machinemode.title", "Active Machine Mode"); provider.add("gtceu.gui.machinemode", "Active Machine Mode: %s"); - provider.add("gtceu.machine.available_recipe_map_1.tooltip", "Available Recipe Types: %s"); - provider.add("gtceu.machine.available_recipe_map_2.tooltip", "Available Recipe Types: %s, %s"); - provider.add("gtceu.machine.available_recipe_map_3.tooltip", "Available Recipe Types: %s, %s, %s"); - provider.add("gtceu.machine.available_recipe_map_4.tooltip", "Available Recipe Types: %s, %s, %s, %s"); + provider.add("machine.gtceu.available_recipe_map_1.tooltip", "Available Recipe Types: %s"); + provider.add("machine.gtceu.available_recipe_map_2.tooltip", "Available Recipe Types: %s, %s"); + provider.add("machine.gtceu.available_recipe_map_3.tooltip", "Available Recipe Types: %s, %s, %s"); + provider.add("machine.gtceu.available_recipe_map_4.tooltip", "Available Recipe Types: %s, %s, %s, %s"); // Multiblock Preview provider.add("gtceu.multiblock.preview.zoom", "Use mousewheel or right-click + drag to zoom"); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/SteamBoilerBlockProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/SteamBoilerBlockProvider.java index 7d57cd8cec8..b96c839f9f2 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/SteamBoilerBlockProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/SteamBoilerBlockProvider.java @@ -43,11 +43,11 @@ protected void addTooltip(CompoundTag capData, ITooltip tooltip, Player player, BlockEntity blockEntity, IPluginConfig config) { var producing = capData.getBoolean("producingSteam"); if (capData.getBoolean("heatingUp")) { - tooltip.add(Component.translatable("gtceu.machine.boiler.info.heating.up", - producing ? Component.translatable("gtceu.machine.boiler.info.producing.steam") : "")); + tooltip.add(Component.translatable("machine.gtceu.boiler.info.heating.up", + producing ? Component.translatable("machine.gtceu.boiler.info.producing.steam") : "")); } else if (capData.getBoolean("coolingDown")) { - tooltip.add(Component.translatable("gtceu.machine.boiler.info.cooling.down", - producing ? Component.translatable("gtceu.machine.boiler.info.producing.steam") : "")); + tooltip.add(Component.translatable("machine.gtceu.boiler.info.cooling.down", + producing ? Component.translatable("machine.gtceu.boiler.info.producing.steam") : "")); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/SteamBoilerInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/SteamBoilerInfoProvider.java index 59e113a66a7..2100bdd7fc6 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/SteamBoilerInfoProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/SteamBoilerInfoProvider.java @@ -35,11 +35,11 @@ protected void addProbeInfo(SteamBoilerMachine capability, IProbeInfo probeInfo, var producingSteam = !capability.isHasNoWater() && capability.getCurrentTemperature() >= 100; if (capability.getRecipeLogic().isWorking()) { - horizontalPane.text("gtceu.machine.boiler.info.heating.up", - producingSteam ? Component.translatable("gtceu.machine.boiler.info.producing.steam") : ""); + horizontalPane.text("machine.gtceu.boiler.info.heating.up", + producingSteam ? Component.translatable("machine.gtceu.boiler.info.producing.steam") : ""); } else if (capability.getCurrentTemperature() > 0) { - horizontalPane.text("gtceu.machine.boiler.info.cooling.down", - producingSteam ? Component.translatable("gtceu.machine.boiler.info.producing.steam") : ""); + horizontalPane.text("machine.gtceu.boiler.info.cooling.down", + producingSteam ? Component.translatable("machine.gtceu.boiler.info.producing.steam") : ""); } } From 1d0e17677e6e5d24357b6f9ea588826d1e11aed5 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Fri, 27 Jun 2025 00:59:32 -0600 Subject: [PATCH 31/45] remove upside down lang (#3278) Co-authored-by: screret <68943070+screret@users.noreply.github.com> --- gradle/forge.versions.toml | 6 +- .../gtceu/api/cover/filter/TagFilter.java | 3 +- .../api/gui/widget/EnumSelectorWidget.java | 4 +- .../api/gui/widget/ToggleButtonWidget.java | 3 +- .../api/item/component/ElectricStats.java | 18 +- .../api/machine/SimpleTieredMachine.java | 5 +- .../CircuitFancyConfigurator.java | 4 +- .../gtceu/api/recipe/GTRecipeType.java | 13 +- .../api/registry/registrate/GTRegistrate.java | 2 +- .../registrate/provider/GTLangProvider.java | 136 ++++ .../gtceu/client/TooltipsHandler.java | 3 +- .../gregtechceu/gtceu/common/CommonProxy.java | 27 +- .../gtceu/common/data/GCYMRecipeTypes.java | 13 +- .../gtceu/common/data/GTItems.java | 29 +- .../gtceu/common/data/GTMachines.java | 2 +- .../gtceu/common/data/GTRecipeTypes.java | 14 +- .../data/machines/GTResearchMachines.java | 5 +- .../fluid/potion/PotionFluidHelper.java | 11 +- .../machine/electric/BlockBreakerMachine.java | 2 +- .../machine/electric/FisherMachine.java | 4 +- .../electric/ItemCollectorMachine.java | 2 +- .../common/machine/electric/MinerMachine.java | 2 +- .../electric/PowerSubstationMachine.java | 10 +- .../gtceu/config/ConfigHolder.java | 749 +++++++++--------- .../AbstractRegistrateAccessor.java | 2 +- .../registrate/LanguageProviderAccessor.java | 15 + .../RegistrateDataProviderAccessor.java | 16 + .../gtceu/data/GregTechDatagen.java | 15 +- .../gtceu/data/lang/AdvancementLang.java | 6 +- .../gtceu/data/lang/ArmorLang.java | 17 +- .../gtceu/data/lang/BlockLang.java | 145 ++-- .../gtceu/data/lang/CommandLang.java | 8 +- .../gtceu/data/lang/ConfigurationLang.java | 38 +- .../gtceu/data/lang/CoverLang.java | 64 +- .../gregtechceu/gtceu/data/lang/GUILang.java | 50 +- .../gtceu/data/lang/HazardLang.java | 8 +- .../gtceu/data/lang/IntegrationLang.java | 30 +- .../gregtechceu/gtceu/data/lang/ItemLang.java | 107 ++- .../gtceu/data/lang/LangHandler.java | 6 +- .../gregtechceu/gtceu/data/lang/LangUtil.java | 279 ++----- .../gtceu/data/lang/MachineLang.java | 163 ++-- .../gtceu/data/lang/MaterialLang.java | 140 ++-- .../gtceu/data/lang/RecipeLang.java | 30 +- .../gtceu/data/lang/SubtitleLang.java | 8 +- .../gregtechceu/gtceu/data/lang/ToolLang.java | 116 ++- .../xei/widgets/GTRecipeWidget.java | 4 +- .../gtceu/utils/FormattingUtil.java | 20 + src/main/resources/gtceu.mixins.json | 4 +- 48 files changed, 1210 insertions(+), 1148 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/api/registry/registrate/provider/GTLangProvider.java rename src/main/java/com/gregtechceu/gtceu/core/mixins/{ => registrate}/AbstractRegistrateAccessor.java (93%) create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/registrate/LanguageProviderAccessor.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/registrate/RegistrateDataProviderAccessor.java diff --git a/gradle/forge.versions.toml b/gradle/forge.versions.toml index bbb6d567c7c..fc86f6f7813 100644 --- a/gradle/forge.versions.toml +++ b/gradle/forge.versions.toml @@ -1,7 +1,7 @@ [versions] ldlib = "1.0.39" registrate = "MC1.20-1.3.11" -configuration = "2.2.0" +configuration = "3.1.0" mixinExtras = "0.2.0" jei = "15.20.0.105" @@ -46,12 +46,14 @@ ftblibrary-cm = "5567591" ftbteams-cm = "5267190" ftbquests-cm = "6167056" ftbchunks-cm = "5956390" +# version 3.1.0, the 1.20 versions aren't on an actual maven so we have to use cursemaven for now. +configurationcm = "5840405" [libraries] ldlib = { module = "com.lowdragmc.ldlib:ldlib-forge-1.20.1", version.ref = "ldlib" } registrate = { module = "com.tterrag.registrate:Registrate", version.ref = "registrate" } -configuration = { module = "dev.toma.configuration:configuration-forge-1.20.1", version.ref = "configuration" } +configuration = { module = "curse.maven:configuration-444699", version.ref = "configurationcm" } mixinExtras-common = { module = "io.github.llamalad7:mixinextras-common", version.ref = "mixinExtras" } mixinExtras-forge = { module = "io.github.llamalad7:mixinextras-forge", version.ref = "mixinExtras" } diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java index b6277ceeaf7..963d458e03e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java @@ -58,8 +58,7 @@ public void setOreDict(String oreDict) { public WidgetGroup openConfigurator(int x, int y) { WidgetGroup group = new WidgetGroup(x, y, 18 * 3 + 25, 18 * 3); // 80 55 group.addWidget(new ImageWidget(0, 0, 20, 20, GuiTextures.INFO_ICON) - .setHoverTooltips( - LangUtil.getMultiLang("cover.gtceu.tag_filter.info").toArray(new MutableComponent[0]))); + .setHoverTooltips(LangUtil.getMultiLang("cover.gtceu.tag_filter.info"))); group.addWidget(new TextFieldWidget(0, 29, 18 * 3 + 25, 12, () -> oreDictFilterExpression, this::setOreDict) .setMaxStringLength(64) .setValidator(input -> { diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/EnumSelectorWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/EnumSelectorWidget.java index 65275047910..a92bcdb0944 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/EnumSelectorWidget.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/EnumSelectorWidget.java @@ -47,8 +47,8 @@ public interface SelectableEnum { private BiFunction textureSupplier = (value, texture) -> new GuiTextureGroup( GuiTextures.VANILLA_BUTTON, texture); - private BiFunction> tooltipSupplier = (value, key) -> List - .copyOf(LangUtil.getSingleOrMultiLang(key)); + private BiFunction> tooltipSupplier = (value, key) -> Arrays + .asList(LangUtil.getSingleOrMultiLang(key)); public EnumSelectorWidget(int xPosition, int yPosition, int width, int height, T[] values, T initialValue, Consumer onChanged) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ToggleButtonWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ToggleButtonWidget.java index 2d0562dec69..465ef637459 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ToggleButtonWidget.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ToggleButtonWidget.java @@ -67,8 +67,7 @@ protected void updateHoverTooltips() { if (!isMultiLang) { setHoverTooltips(tooltipText + (isPressed ? ".enabled" : ".disabled")); } else { - setHoverTooltips( - List.copyOf(LangUtil.getMultiLang(tooltipText + (isPressed ? ".enabled" : ".disabled")))); + setHoverTooltips(LangUtil.getMultiLang(tooltipText + (isPressed ? ".enabled" : ".disabled"))); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/component/ElectricStats.java b/src/main/java/com/gregtechceu/gtceu/api/item/component/ElectricStats.java index 3a41d746d19..bb22f06cc59 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/component/ElectricStats.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/component/ElectricStats.java @@ -198,7 +198,7 @@ public static void addCurrentChargeTooltip(List tooltip, long current Duration durationMax = Duration.between(start, max); long currentChargeTime; long maxChargeTime; - Component unit; + String unitKey; ChatFormatting color = ChatFormatting.RED; if (percentage > 0.5) { @@ -211,22 +211,22 @@ public static void addCurrentChargeTooltip(List tooltip, long current if (durationCurrent.getSeconds() <= 60) { maxChargeTime = durationMax.getSeconds(); currentChargeTime = durationCurrent.toSeconds(); - unit = Component.translatable("item.gtceu.battery.charge_unit.second"); + unitKey = "gtceu.gui.seconds"; } else if (durationCurrent.toMinutes() <= 60) { maxChargeTime = durationMax.toMinutes(); currentChargeTime = durationCurrent.toMinutes(); - unit = Component.translatable("item.gtceu.battery.charge_unit.minute"); + unitKey = "gui.minutes"; } else { maxChargeTime = durationMax.toHours(); currentChargeTime = durationCurrent.toHours(); - unit = Component.translatable("item.gtceu.battery.charge_unit.hour"); + unitKey = "gui.hours"; } tooltip.add(Component.translatable("item.gtceu.battery.charge_detailed", - FormattingUtil.formatNumbers(currentCharge), FormattingUtil.formatNumbers(maxCharge), - GTValues.VNF[tier], - FormattingUtil.formatNumbers(currentChargeTime), FormattingUtil.formatNumbers(maxChargeTime), - unit) - .withStyle(color)); + FormattingUtil.formatNumbers(currentCharge), FormattingUtil.formatNumbers(maxCharge), + GTValues.VNF[tier], + FormattingUtil.formatNumbers(currentChargeTime), + Component.translatable(unitKey, FormattingUtil.formatNumbers(maxChargeTime)) + ).withStyle(color)); } else { tooltip.add(Component.translatable("item.generic.electric_item.tooltip", FormattingUtil.formatNumbers(currentCharge), FormattingUtil.formatNumbers(maxCharge), diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java index 1a4e2de3027..cc4f28347f9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java @@ -373,7 +373,7 @@ protected static EditableUI createBatterySlot() slotWidget.setCanPutItems(true); slotWidget.setCanTakeItems(true); slotWidget.setHoverTooltips(LangUtil.getMultiLang("gtceu.gui.charger_slot.tooltip", - GTValues.VNF[machine.getTier()], GTValues.VNF[machine.getTier()]).toArray(Component[]::new)); + GTValues.VNF[machine.getTier()], GTValues.VNF[machine.getTier()])); }); } @@ -389,8 +389,7 @@ protected static EditableUI createC slotWidget.setCircuitInventory(machine.circuitInventory); slotWidget.setCanPutItems(false); slotWidget.setCanTakeItems(false); - slotWidget.setHoverTooltips( - LangUtil.getMultiLang("gtceu.gui.configurator_slot.tooltip").toArray(Component[]::new)); + slotWidget.setHoverTooltips(LangUtil.getMultiLang("gtceu.gui.configurator_slot.tooltip")); }); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CircuitFancyConfigurator.java b/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CircuitFancyConfigurator.java index fdfde2e30f5..e0b172991b5 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CircuitFancyConfigurator.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CircuitFancyConfigurator.java @@ -165,9 +165,7 @@ public Widget createConfigurator() { @Override public List getTooltips() { var list = new ArrayList<>(IFancyConfigurator.super.getTooltips()); - list.addAll(Arrays.stream( - LangUtil.getMultiLang("gtceu.gui.configurator_slot.tooltip").toArray(new MutableComponent[0])) - .toList()); + list.addAll(Arrays.asList(LangUtil.getMultiLang("gtceu.gui.configurator_slot.tooltip"))); return list; } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeType.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeType.java index a53ddd30e27..7341ed6c30b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeType.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeType.java @@ -21,6 +21,7 @@ import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.data.recipes.FinishedRecipe; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Recipe; @@ -71,7 +72,7 @@ public class GTRecipeType implements RecipeType { @Getter protected SoundEntry sound; @Getter - protected List> dataInfos = new ArrayList<>(); + protected List> dataInfos = new ArrayList<>(); @Getter @Setter protected boolean isScanner; @@ -174,7 +175,7 @@ public GTRecipeType setXEIVisible(boolean XEIVisible) { return this; } - public GTRecipeType addDataInfo(Function dataInfo) { + public GTRecipeType addDataInfo(Function dataInfo) { this.dataInfos.add(dataInfo); return this; } @@ -194,6 +195,14 @@ public String toString() { return registryName.toString(); } + public String getLanguageKey() { + return this.registryName.toLanguageKey("recipe_type"); + } + + public Component getTranslation() { + return Component.translatable(getLanguageKey()); + } + @Nullable public GTRecipe getRecipe(RecipeManager recipeManager, ResourceLocation id) { var recipes = ((RecipeManagerInvoker) recipeManager).getRecipeFromType(this); diff --git a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/GTRegistrate.java b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/GTRegistrate.java index 6a63a23c11f..2e0323c5c9b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/GTRegistrate.java +++ b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/GTRegistrate.java @@ -13,7 +13,7 @@ import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.registry.registrate.forge.GTFluidBuilder; -import com.gregtechceu.gtceu.core.mixins.AbstractRegistrateAccessor; +import com.gregtechceu.gtceu.core.mixins.registrate.AbstractRegistrateAccessor; import com.gregtechceu.gtceu.utils.FormattingUtil; import net.minecraft.MethodsReturnNonnullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/provider/GTLangProvider.java b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/provider/GTLangProvider.java new file mode 100644 index 00000000000..3ebf76076ae --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/provider/GTLangProvider.java @@ -0,0 +1,136 @@ +package com.gregtechceu.gtceu.api.registry.registrate.provider; + +import com.gregtechceu.gtceu.core.mixins.registrate.LanguageProviderAccessor; + +import net.minecraft.data.CachedOutput; +import net.minecraft.data.DataProvider; +import net.minecraft.data.PackOutput; +import net.minecraft.world.level.ItemLike; +import net.minecraftforge.data.event.GatherDataEvent; + +import com.google.gson.JsonObject; +import com.tterrag.registrate.AbstractRegistrate; +import com.tterrag.registrate.providers.ProviderType; +import com.tterrag.registrate.providers.RegistrateLangProvider; +import com.tterrag.registrate.providers.RegistrateProvider; +import com.tterrag.registrate.util.nullness.NonNullSupplier; +import org.jetbrains.annotations.NotNull; + +import java.nio.file.Path; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; + +public class GTLangProvider extends RegistrateLangProvider implements RegistrateProvider { + + protected final AbstractRegistrate owner; + protected final PackOutput output; + + public GTLangProvider(AbstractRegistrate owner, GatherDataEvent event, + Map, RegistrateProvider> existing) { + super(owner, event.getGenerator().getPackOutput()); + this.owner = owner; + this.output = event.getGenerator().getPackOutput(); + } + + @Override + public @NotNull String getName() { + return "Lang (en_us)"; + } + + @Override + public @NotNull CompletableFuture run(@NotNull CachedOutput cache) { + addTranslations(); + + var translations = ((LanguageProviderAccessor) this).gtceu$getData(); + if (translations.isEmpty()) { + return CompletableFuture.completedFuture(null); + } + + JsonObject json = new JsonObject(); + translations.forEach(json::addProperty); + + Path target = this.output.getOutputFolder(PackOutput.Target.RESOURCE_PACK) + .resolve(this.owner.getModid()).resolve("lang").resolve("en_us.json"); + return DataProvider.saveStable(cache, json, target); + } + + /** + * Registers multiple values under the same key. + *

+ * For example, a cumbersome way to add translations would be the following: + *

 {@code
+     * provider.add("terminal.fluid_prospector.tier.0", "radius size 1");
+     * provider.add("terminal.fluid_prospector.tier.1", "radius size 2");
+     * provider.add("terminal.fluid_prospector.tier.2", "radius size 3");
+     * } 
+ *

+ * + * Instead, {@link #addMultiLang} can be used for the same result: + *
 {@code
+     * provider.addMultiLang("terminal.fluid_prospector.tier", "radius size 1", "radius size 2", "radius size 3");
+     * } 
+ * + * In situations requiring a large number of generated translations, the + * following could be used instead, which + * generates translations for 100 tiers: + *
 {@code
+     * provider.addMultiLang("terminal.fluid_prospector.tier", IntStream.of(100)
+     *                 .map(i -> i + 1)
+     *                 .mapToObj(Integer::toString)
+     *                 .map(i -> "radius size " + i)
+     *                 .toArray(String[]::new));
+     * } 
+ * + * @param key Base key of the translation. The real key for each translation will be appended by ".0" for + * the first, ".1" for the second, etc. This ensures that the keys are unique. + * @param lines All translation lines. + */ + public void addMultiLang(String key, String... lines) { + for (var i = 0; i < lines.length; i++) { + add(key + "." + i, lines[i]); + } + } + + /** + * Adds one translation to the given lang provider per line in the given + * multiline (a multiline is a String containing newline characters). For example, + *
 {@code
+     * provider.addMultiline("gtceu.gui.overclock.enabled", "Overclocking Enabled.\nClick to Disable");
+     * } 
+ * + * Results in the following translations: + *
 {@code
+     * "gtceu.gui.overclock.enabled.0": "Overclocking Enabled.",
+     * "gtceu.gui.overclock.enabled.1": "Click to Disable",
+     * } 
+ *

+ * + * @param key Base key of the translation. The real key for each line will be appended by ".0" for the + * first line, ".1" for the second, etc. This ensures that the keys are unique. + * @param multiline The multiline string + */ + public void addMultiline(String key, String multiline) { + var lines = multiline.split("\n"); + addMultiLang(key, lines); + } + + @Override + public void addTooltip(NonNullSupplier item, @NotNull String tooltip) { + add(item.get().asItem().getDescriptionId() + ".tooltip", tooltip); + } + + public void addTooltip(@NotNull NonNullSupplier item, String... tooltip) { + addMultiLang(item.get().asItem().getDescriptionId() + ".tooltip", tooltip); + } + + @Override + public void addTooltip(@NotNull NonNullSupplier item, List<@NotNull String> tooltip) { + addTooltip(item, tooltip.toArray(String[]::new)); + } + + @Override + public void add(@NotNull String key, @NotNull String value) { + ((LanguageProviderAccessor) this).gtceu$getData().put(key, value); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/TooltipsHandler.java b/src/main/java/com/gregtechceu/gtceu/client/TooltipsHandler.java index f6987e2c02f..3612337b2f1 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/TooltipsHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/client/TooltipsHandler.java @@ -18,7 +18,6 @@ import net.minecraft.ChatFormatting; import net.minecraft.locale.Language; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; import net.minecraft.tags.FluidTags; import net.minecraft.world.item.BucketItem; import net.minecraft.world.item.ItemStack; @@ -65,7 +64,7 @@ public static void appendTooltips(ItemStack stack, TooltipFlag flag, List multiLang = LangUtil.getMultiLang(tooltipKey); + var multiLang = LangUtil.getListMultiLang(tooltipKey); if (multiLang != null && !multiLang.isEmpty()) { tooltips.addAll(1, multiLang); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java index 705d33ac739..3a6ca8f733e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java @@ -24,6 +24,7 @@ import com.gregtechceu.gtceu.api.recipe.ingredient.IntProviderIngredient; import com.gregtechceu.gtceu.api.recipe.ingredient.SizedIngredient; import com.gregtechceu.gtceu.api.registry.GTRegistries; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTLangProvider; import com.gregtechceu.gtceu.common.data.*; import com.gregtechceu.gtceu.common.data.machines.GTMachineUtils; import com.gregtechceu.gtceu.common.data.materials.GTFoods; @@ -34,7 +35,7 @@ import com.gregtechceu.gtceu.common.registry.GTRegistration; import com.gregtechceu.gtceu.common.unification.material.MaterialRegistryManager; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.core.mixins.AbstractRegistrateAccessor; +import com.gregtechceu.gtceu.core.mixins.registrate.AbstractRegistrateAccessor; import com.gregtechceu.gtceu.data.GregTechDatagen; import com.gregtechceu.gtceu.data.lang.MaterialLang; import com.gregtechceu.gtceu.data.loot.ChestGenHooks; @@ -70,13 +71,7 @@ import net.minecraftforge.fml.javafmlmod.FMLModContainer; import net.minecraftforge.registries.RegisterEvent; -import com.google.common.collect.Multimaps; import com.tterrag.registrate.providers.ProviderType; -import com.tterrag.registrate.providers.RegistrateLangProvider; -import com.tterrag.registrate.providers.RegistrateProvider; -import com.tterrag.registrate.util.nullness.NonNullConsumer; - -import java.util.List; public class CommonProxy { @@ -109,6 +104,10 @@ public static void init() { UIFactory.register(MachineUIFactory.INSTANCE); UIFactory.register(CoverUIFactory.INSTANCE); UIFactory.register(GTUIEditorFactory.INSTANCE); + + // Initialize the provider replacements before any content is loaded so we can use them safely + GregTechDatagen.initPre(); + GTPlacerTypes.init(); GTRecipeCapabilities.init(); GTRecipeConditions.init(); @@ -141,22 +140,14 @@ public static void init() { // fabric exclusive, squeeze this in here to register before stuff is used GTRegistration.REGISTRATE.registerRegistrate(); - GregTechDatagen.init(); + GregTechDatagen.initPost(); // Register all material manager registries, for materials with mod ids. GTCEuAPI.materialManager.getRegistries().forEach(registry -> { // Force the material lang generator to be at index 0, so that addons' lang generators can override it. AbstractRegistrateAccessor accessor = (AbstractRegistrateAccessor) registry.getRegistrate(); if (accessor.getDoDatagen().get()) { - // noinspection UnstableApiUsage - List> providers = Multimaps.asMap(accessor.getDatagens()) - .get(ProviderType.LANG); - if (providers.isEmpty()) { - providers.add( - (provider) -> MaterialLang.generate((RegistrateLangProvider) provider, registry)); - } else { - providers.add(0, - (provider) -> MaterialLang.generate((RegistrateLangProvider) provider, registry)); - } + var providers = accessor.getDatagens().get(ProviderType.LANG); + providers.add(0, (provider) -> MaterialLang.generate((GTLangProvider) provider, registry)); } registry.getRegistrate() diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GCYMRecipeTypes.java b/src/main/java/com/gregtechceu/gtceu/common/data/GCYMRecipeTypes.java index cba81582187..2daa428266d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GCYMRecipeTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GCYMRecipeTypes.java @@ -9,9 +9,8 @@ import com.gregtechceu.gtceu.integration.xei.handlers.item.CycleItemStackHandler; import com.gregtechceu.gtceu.utils.FormattingUtil; -import com.lowdragmc.lowdraglib.utils.LocalizationUtils; - -import net.minecraft.client.resources.language.I18n; +import net.minecraft.network.chat.CommonComponents; +import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; import java.util.ArrayList; @@ -38,17 +37,17 @@ public class GCYMRecipeTypes { .setSlotOverlay(true, true, true, GuiTextures.FURNACE_OVERLAY_2) .addDataInfo(data -> { int temp = data.getInt("ebf_temp"); - return LocalizationUtils.format("gtceu.recipe.temperature", FormattingUtil.formatNumbers(temp)); + return Component.translatable("gtceu.recipe.temperature", FormattingUtil.formatNumbers(temp)); }) .addDataInfo(data -> { int temp = data.getInt("ebf_temp"); ICoilType requiredCoil = ICoilType.getMinRequiredType(temp); if (requiredCoil != null && !requiredCoil.getMaterial().isNull()) { - return LocalizationUtils.format("gtceu.recipe.coil.tier", - I18n.get(requiredCoil.getMaterial().getUnlocalizedName())); + return Component.translatable("gtceu.recipe.coil.tier", + requiredCoil.getMaterial().getLocalizedName()); } - return ""; + return CommonComponents.EMPTY; }) .setMaxTooltips(4) .setUiBuilder((recipe, widgetGroup) -> { diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java index dc8066fde0e..7b5521773f2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java @@ -64,7 +64,6 @@ import com.tterrag.registrate.builders.ItemBuilder; import com.tterrag.registrate.providers.DataGenContext; import com.tterrag.registrate.providers.ProviderType; -import com.tterrag.registrate.providers.RegistrateLangProvider; import com.tterrag.registrate.util.entry.ItemEntry; import com.tterrag.registrate.util.nullness.NonNullBiConsumer; import com.tterrag.registrate.util.nullness.NonNullConsumer; @@ -1911,7 +1910,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry COVER_SOLAR_PANEL_ULV = REGISTRATE .item("ulv_solar_panel", ComponentItem::create).lang("Ultra Low Voltage Solar Panel") .onRegister(attach(new TooltipBehavior(lines -> { - lines.addAll(LangUtil.getMultiLang("item.gtceu.solar_panel.tooltip")); + lines.addAll(LangUtil.getListMultiLang("item.gtceu.solar_panel.tooltip")); lines.add(Component.translatable("gtceu.universal.tooltip.voltage_out", GTValues.V[GTValues.ULV], GTValues.VNF[GTValues.ULV])); }))).onRegister(attach(new CoverPlaceBehavior(GTCovers.SOLAR_PANEL[0]))) @@ -1919,7 +1918,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry COVER_SOLAR_PANEL_LV = REGISTRATE .item("lv_solar_panel", ComponentItem::create).lang("Low Voltage Solar Panel") .onRegister(attach(new TooltipBehavior(lines -> { - lines.addAll(LangUtil.getMultiLang("item.gtceu.solar_panel.tooltip")); + lines.addAll(LangUtil.getListMultiLang("item.gtceu.solar_panel.tooltip")); lines.add(Component.translatable("gtceu.universal.tooltip.voltage_out", GTValues.V[GTValues.LV], GTValues.VNF[GTValues.LV])); }))).onRegister(attach(new CoverPlaceBehavior(GTCovers.SOLAR_PANEL[1]))) @@ -1927,7 +1926,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry COVER_SOLAR_PANEL_MV = REGISTRATE .item("mv_solar_panel", ComponentItem::create).lang("Medium Voltage Solar Panel") .onRegister(attach(new TooltipBehavior(lines -> { - lines.addAll(LangUtil.getMultiLang("item.gtceu.solar_panel.tooltip")); + lines.addAll(LangUtil.getListMultiLang("item.gtceu.solar_panel.tooltip")); lines.add(Component.translatable("gtceu.universal.tooltip.voltage_out", GTValues.V[GTValues.MV], GTValues.VNF[GTValues.MV])); }))).onRegister(attach(new CoverPlaceBehavior(GTCovers.SOLAR_PANEL[2]))) @@ -1935,7 +1934,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry COVER_SOLAR_PANEL_HV = REGISTRATE .item("hv_solar_panel", ComponentItem::create).lang("High Voltage Solar Panel") .onRegister(attach(new TooltipBehavior(lines -> { - lines.addAll(LangUtil.getMultiLang("item.gtceu.solar_panel.tooltip")); + lines.addAll(LangUtil.getListMultiLang("item.gtceu.solar_panel.tooltip")); lines.add(Component.translatable("gtceu.universal.tooltip.voltage_out", GTValues.V[GTValues.HV], GTValues.VNF[GTValues.HV])); }))).onRegister(attach(new CoverPlaceBehavior(GTCovers.SOLAR_PANEL[3]))) @@ -1943,7 +1942,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry COVER_SOLAR_PANEL_EV = REGISTRATE .item("ev_solar_panel", ComponentItem::create).lang("Extreme Voltage Solar Panel") .onRegister(attach(new TooltipBehavior(lines -> { - lines.addAll(LangUtil.getMultiLang("item.gtceu.solar_panel.tooltip")); + lines.addAll(LangUtil.getListMultiLang("item.gtceu.solar_panel.tooltip")); lines.add(Component.translatable("gtceu.universal.tooltip.voltage_out", GTValues.V[GTValues.EV], GTValues.VNF[GTValues.EV])); }))).onRegister(attach(new CoverPlaceBehavior(GTCovers.SOLAR_PANEL[4]))) @@ -1951,7 +1950,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry COVER_SOLAR_PANEL_IV = REGISTRATE .item("iv_solar_panel", ComponentItem::create).lang("Insane Voltage Solar Panel") .onRegister(attach(new TooltipBehavior(lines -> { - lines.addAll(LangUtil.getMultiLang("item.gtceu.solar_panel.tooltip")); + lines.addAll(LangUtil.getListMultiLang("item.gtceu.solar_panel.tooltip")); lines.add(Component.translatable("gtceu.universal.tooltip.voltage_out", GTValues.V[GTValues.IV], GTValues.VNF[GTValues.IV])); }))).onRegister(attach(new CoverPlaceBehavior(GTCovers.SOLAR_PANEL[5]))) @@ -1959,7 +1958,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry COVER_SOLAR_PANEL_LuV = REGISTRATE .item("luv_solar_panel", ComponentItem::create).lang("Ludicrous Voltage Solar Panel") .onRegister(attach(new TooltipBehavior(lines -> { - lines.addAll(LangUtil.getMultiLang("item.gtceu.solar_panel.tooltip")); + lines.addAll(LangUtil.getListMultiLang("item.gtceu.solar_panel.tooltip")); lines.add(Component.translatable("gtceu.universal.tooltip.voltage_out", GTValues.V[GTValues.LuV], GTValues.VNF[GTValues.LuV])); }))).onRegister(attach(new CoverPlaceBehavior(GTCovers.SOLAR_PANEL[6]))) @@ -1967,7 +1966,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry COVER_SOLAR_PANEL_ZPM = REGISTRATE .item("zpm_solar_panel", ComponentItem::create).lang("Zero Point Module Solar Panel") .onRegister(attach(new TooltipBehavior(lines -> { - lines.addAll(LangUtil.getMultiLang("item.gtceu.solar_panel.tooltip")); + lines.addAll(LangUtil.getListMultiLang("item.gtceu.solar_panel.tooltip")); lines.add(Component.translatable("gtceu.universal.tooltip.voltage_out", GTValues.V[GTValues.ZPM], GTValues.VNF[GTValues.ZPM])); }))).onRegister(attach(new CoverPlaceBehavior(GTCovers.SOLAR_PANEL[7]))) @@ -1975,7 +1974,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry COVER_SOLAR_PANEL_UV = REGISTRATE .item("uv_solar_panel", ComponentItem::create).lang("Ultimate Voltage Solar Panel") .onRegister(attach(new TooltipBehavior(lines -> { - lines.addAll(LangUtil.getMultiLang("item.gtceu.solar_panel.tooltip")); + lines.addAll(LangUtil.getListMultiLang("item.gtceu.solar_panel.tooltip")); lines.add(Component.translatable("gtceu.universal.tooltip.voltage_out", GTValues.V[GTValues.UV], GTValues.VNF[GTValues.UV])); }))).onRegister(attach(new CoverPlaceBehavior(GTCovers.SOLAR_PANEL[8]))) @@ -2600,16 +2599,6 @@ public static ResourceLocation getTierName(Tier tier) { return TierSortingRegistry.getName(tier); } - @NotNull - private static < - T extends Item> NonNullBiConsumer, RegistrateLangProvider> reverseLangValue() { - return (ctx, prov) -> { - var names = Arrays.stream(ctx.getName().split("/.")).collect(Collectors.toList()); - Collections.reverse(names); - prov.add(ctx.get(), names.stream().map(StringUtils::capitalize).collect(Collectors.joining(" "))); - }; - } - @FunctionalInterface public interface StackProperty { diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java index fd23bcb6f0f..901e25ee8c5 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java @@ -300,7 +300,7 @@ public class GTMachines { .rotationState(RotationState.ALL) .tier(LV) .tieredHullRenderer(GTCEu.id("block/machine/ld_item_endpoint_machine")) - .tooltips(LangUtil.getMultiLang("gtceu.machine.endpoint.tooltip").toArray(Component[]::new)) + .tooltips(LangUtil.getMultiLang("gtceu.machine.endpoint.tooltip")) .tooltipBuilder((stack, tooltip) -> { if (ConfigHolder.INSTANCE.machines.ldItemPipeMinDistance > 0) { tooltip.add(Component.translatable("gtceu.machine.endpoint.tooltip.min_length", diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java index 7f093a7807d..6c5d4df117e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java @@ -24,12 +24,12 @@ import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder; import com.gregtechceu.gtceu.integration.kjs.GTRegistryInfo; import com.gregtechceu.gtceu.integration.xei.handlers.item.CycleItemStackHandler; +import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.ResearchManager; -import com.lowdragmc.lowdraglib.utils.LocalizationUtils; - -import net.minecraft.client.resources.language.I18n; import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.chat.CommonComponents; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; @@ -500,17 +500,17 @@ public class GTRecipeTypes { .setMaxIOSize(3, 3, 1, 1).setEUIO(IO.IN) .addDataInfo(data -> { int temp = data.getInt("ebf_temp"); - return LocalizationUtils.format("gtceu.recipe.temperature", temp); + return Component.translatable("gtceu.recipe.temperature", FormattingUtil.formatNumbers(temp)); }) .addDataInfo(data -> { int temp = data.getInt("ebf_temp"); ICoilType requiredCoil = ICoilType.getMinRequiredType(temp); if (requiredCoil != null && !requiredCoil.getMaterial().isNull()) { - return LocalizationUtils.format("gtceu.recipe.coil.tier", - I18n.get(requiredCoil.getMaterial().getUnlocalizedName())); + return Component.translatable("gtceu.recipe.coil.tier", + requiredCoil.getMaterial().getLocalizedName()); } - return ""; + return CommonComponents.EMPTY; }) .setUiBuilder((recipe, widgetGroup) -> { int temp = recipe.data.getInt("ebf_temp"); diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTResearchMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTResearchMachines.java index d34297bea41..1c170fb6e39 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTResearchMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTResearchMachines.java @@ -62,7 +62,7 @@ public class GTResearchMachines { .rotationState(RotationState.NON_Y_AXIS) .recipeType(GTRecipeTypes.RESEARCH_STATION_RECIPES) .appearanceBlock(ADVANCED_COMPUTER_CASING) - .tooltipBuilder((s, l) -> l.addAll(LangUtil.getMultiLang("gtceu.machine.research_station.tooltip"))) + .tooltips(LangUtil.getMultiLang("gtceu.machine.research_station.tooltip")) .pattern(definition -> FactoryBlockPattern.start() .aisle("XXX", "VVV", "PPP", "PPP", "PPP", "VVV", "XXX") .aisle("XXX", "VAV", "AAA", "AAA", "AAA", "VAV", "XXX") @@ -196,8 +196,7 @@ public class GTResearchMachines { // good API addition for packdevs .appearanceBlock(COMPUTER_CASING) .recipeType(GTRecipeTypes.DUMMY_RECIPES) - .tooltipBuilder((s, l) -> l - .addAll(LangUtil.getMultiLang("gtceu.machine.high_performance_computation_array.tooltip"))) + .tooltips(LangUtil.getMultiLang("gtceu.machine.high_performance_computation_array.tooltip")) .pattern(definition -> FactoryBlockPattern.start() .aisle("AA", "CC", "CC", "CC", "AA") .aisle("VA", "XV", "XV", "XV", "VA") diff --git a/src/main/java/com/gregtechceu/gtceu/common/fluid/potion/PotionFluidHelper.java b/src/main/java/com/gregtechceu/gtceu/common/fluid/potion/PotionFluidHelper.java index 57fe115bb54..a63ff1a0cee 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/fluid/potion/PotionFluidHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/common/fluid/potion/PotionFluidHelper.java @@ -187,21 +187,20 @@ public static Component formatDuration(MobEffectInstance effect) { Instant start = Instant.now(); Instant max = Instant.now().plusSeconds(time / 20); Duration durationMax = Duration.between(start, max); - - Component unit; + String unitKey; if (durationMax.getSeconds() <= 60) { time = GTMath.saturatedCast(durationMax.getSeconds()); - unit = Component.translatable("item.gtceu.battery.charge_unit.second"); + unitKey = "gtceu.gui.seconds"; } else if (durationMax.toMinutes() <= 60) { time = GTMath.saturatedCast(durationMax.toMinutes()); - unit = Component.translatable("item.gtceu.battery.charge_unit.minute"); + unitKey = "gui.minutes"; } else { time = GTMath.saturatedCast(durationMax.toHours()); - unit = Component.translatable("item.gtceu.battery.charge_unit.hour"); + unitKey = "gui.hours"; } - return Component.literal(FormattingUtil.formatNumbers(time)).append(unit); + return Component.translatable(unitKey, FormattingUtil.formatNumbers(time)); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java index 0317f2e52d6..e3a1a719114 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java @@ -395,7 +395,7 @@ protected static EditableUI createBatterySlot() slotWidget.setCanPutItems(true); slotWidget.setCanTakeItems(true); slotWidget.setHoverTooltips(LangUtil.getMultiLang("gtceu.gui.charger_slot.tooltip", - GTValues.VNF[machine.getTier()], GTValues.VNF[machine.getTier()]).toArray(new MutableComponent[0])); + GTValues.VNF[machine.getTier()], GTValues.VNF[machine.getTier()])); }); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java index 11e77582e72..902f71bd732 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java @@ -423,7 +423,7 @@ protected static EditableUI createBatterySlot() { slotWidget.setCanPutItems(true); slotWidget.setCanTakeItems(true); slotWidget.setHoverTooltips(LangUtil.getMultiLang("gtceu.gui.charger_slot.tooltip", - GTValues.VNF[machine.getTier()], GTValues.VNF[machine.getTier()]).toArray(new MutableComponent[0])); + GTValues.VNF[machine.getTier()], GTValues.VNF[machine.getTier()])); }); } @@ -437,7 +437,7 @@ protected static EditableUI createJunkButton( toggleButtonWidget.setSupplier(machine::isJunkEnabled); toggleButtonWidget.setOnPressCallback((data, bool) -> machine.setJunkEnabled(bool)); toggleButtonWidget.setHoverTooltips(LangUtil.getMultiLang("gtceu.gui.fisher_mode.tooltip", - GTValues.VNF[machine.getTier()], GTValues.VNF[machine.getTier()]).toArray(new MutableComponent[0])); + GTValues.VNF[machine.getTier()], GTValues.VNF[machine.getTier()])); }); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java index af08394da38..da0f7587d57 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java @@ -446,7 +446,7 @@ protected static EditableUI createBatterySlot( slotWidget.setCanPutItems(true); slotWidget.setCanTakeItems(true); slotWidget.setHoverTooltips(LangUtil.getMultiLang("gtceu.gui.charger_slot.tooltip", - GTValues.VNF[machine.getTier()], GTValues.VNF[machine.getTier()]).toArray(new MutableComponent[0])); + GTValues.VNF[machine.getTier()], GTValues.VNF[machine.getTier()])); }); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java index 9f95d20535d..50b5ba103c0 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java @@ -334,7 +334,7 @@ protected static EditableUI createBatterySlot() { slotWidget.setCanPutItems(true); slotWidget.setCanTakeItems(true); slotWidget.setHoverTooltips(LangUtil.getMultiLang("gtceu.gui.charger_slot.tooltip", - GTValues.VNF[machine.getTier()], GTValues.VNF[machine.getTier()]).toArray(new MutableComponent[0])); + GTValues.VNF[machine.getTier()], GTValues.VNF[machine.getTier()])); }); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java index c75fc8b59e7..95a6ef20242 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java @@ -279,19 +279,19 @@ private static MutableComponent getTimeToFillDrainText(BigInteger timeToFillSeco long fillTime; if (duration.getSeconds() <= 180) { fillTime = duration.getSeconds(); - key = "gtceu.multiblock.power_substation.time_seconds"; + key = "gtceu.gui.seconds"; } else if (duration.toMinutes() <= 180) { fillTime = duration.toMinutes(); - key = "gtceu.multiblock.power_substation.time_minutes"; + key = "gui.minutes"; } else if (duration.toHours() <= 72) { fillTime = duration.toHours(); - key = "gtceu.multiblock.power_substation.time_hours"; + key = "gui.hours"; } else if (duration.toDays() <= 730) { // 2 years fillTime = duration.toDays(); - key = "gtceu.multiblock.power_substation.time_days"; + key = "gui.days"; } else if (duration.toDays() / 365 < 1_000_000) { fillTime = duration.toDays() / 365; - key = "gtceu.multiblock.power_substation.time_years"; + key = "gtceu.gui.years"; } else { return Component.translatable("gtceu.multiblock.power_substation.time_forever"); } diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index 6ee82d90984..a014cc4b578 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -8,6 +8,8 @@ import dev.toma.configuration.Configuration; import dev.toma.configuration.config.Config; import dev.toma.configuration.config.Configurable; +import dev.toma.configuration.config.Configurable.*; +import dev.toma.configuration.config.UpdateRestrictions; import dev.toma.configuration.config.format.ConfigFormats; @Config(id = GTCEu.MOD_ID) @@ -19,113 +21,115 @@ public class ConfigHolder { public static void init() { synchronized (LOCK) { if (INSTANCE == null) { - INSTANCE = Configuration.registerConfig(ConfigHolder.class, ConfigFormats.yaml()).getConfigInstance(); + INSTANCE = Configuration.registerConfig(ConfigHolder.class, ConfigFormats.YAML).getConfigInstance(); } } } - @Configurable + @Configurable(key = LocalizationKey.FULL) public RecipeConfigs recipes = new RecipeConfigs(); - @Configurable + @Configurable(key = LocalizationKey.FULL) + @UpdateRestriction(UpdateRestrictions.MAIN_MENU) public WorldGenConfigs worldgen = new WorldGenConfigs(); - @Configurable + @Configurable(key = LocalizationKey.FULL) + @UpdateRestriction(UpdateRestrictions.GAME_RESTART) public MachineConfigs machines = new MachineConfigs(); - @Configurable + @Configurable(key = LocalizationKey.FULL) public ClientConfigs client = new ClientConfigs(); - @Configurable - @Configurable.Comment("Config options for Tools and Armor") + @Configurable(key = LocalizationKey.FULL) + @Comment("Config options for Tools and Armor") public ToolConfigs tools = new ToolConfigs(); - @Configurable - @Configurable.Comment("Config options for Game Mechanics") + @Configurable(key = LocalizationKey.FULL) + @Comment("Config options for Game Mechanics") public GameplayConfigs gameplay = new GameplayConfigs(); - @Configurable - @Configurable.Comment("Config options for Mod Compatibility") + @Configurable(key = LocalizationKey.FULL) + @Comment("Config options for Mod Compatibility") public CompatibilityConfigs compat = new CompatibilityConfigs(); - @Configurable + @Configurable(key = LocalizationKey.FULL) public DeveloperConfigs dev = new DeveloperConfigs(); public static class RecipeConfigs { - @Configurable - @Configurable.Comment({ "Whether to generate Flawed and Chipped Gems for materials and recipes involving them.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether to generate Flawed and Chipped Gems for materials and recipes involving them.", "Useful for mods like TerraFirmaCraft.", "Default: false" }) public boolean generateLowQualityGems = false; // default false - @Configurable - @Configurable.Comment({ "Whether to remove Block/Ingot compression and decompression in the Crafting Table.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether to remove Block/Ingot compression and decompression in the Crafting Table.", "Default: true" }) public boolean disableManualCompression = true; // default true - @Configurable - @Configurable.Comment({ + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Change the recipe of Rods in the Lathe to 1 Rod and 2 Small Piles of Dust, instead of 2 Rods.", "Default: false" }) public boolean harderRods = false; // default false - @Configurable - @Configurable.Comment({ + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether to make crafting recipes for Bricks, Firebricks, Nether Bricks, and Coke Bricks harder.", "Default: false" }) public boolean harderBrickRecipes = false; // default false - @Configurable - @Configurable.Comment({ "Whether to nerf Wood crafting to 2 Planks from 1 Log, and 2 Sticks from 2 Planks.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether to nerf Wood crafting to 2 Planks from 1 Log, and 2 Sticks from 2 Planks.", "Default: false" }) public boolean nerfWoodCrafting = false; // default false - @Configurable - @Configurable.Comment({ "Whether to make Wood related recipes harder.", "Excludes sticks and planks.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether to make Wood related recipes harder.", "Excludes sticks and planks.", "Default: false" }) public boolean hardWoodRecipes = false; // default false - @Configurable - @Configurable.Comment({ "Recipes for Buckets, Cauldrons, Hoppers, and Iron Bars" + + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Recipes for Buckets, Cauldrons, Hoppers, and Iron Bars" + " require Iron Plates, Rods, and more.", "Default: true" }) public boolean hardIronRecipes = true; // default true - @Configurable - @Configurable.Comment({ "Whether to make Redstone related recipes harder.", "Default: false" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether to make Redstone related recipes harder.", "Default: false" }) public boolean hardRedstoneRecipes = false; // default false - @Configurable - @Configurable.Comment({ "Whether to make Vanilla Tools and Armor recipes harder.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether to make Vanilla Tools and Armor recipes harder.", "Excludes Flint and Steel, and Buckets.", "Default: false" }) public boolean hardToolArmorRecipes = false; // default false - @Configurable - @Configurable.Comment({ "Whether to make miscellaneous recipes harder.", "Default: false" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether to make miscellaneous recipes harder.", "Default: false" }) public boolean hardMiscRecipes = false; // default false - @Configurable - @Configurable.Comment({ "Whether to make Glass related recipes harder. Default: true" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether to make Glass related recipes harder. Default: true" }) public boolean hardGlassRecipes = true; // default true - @Configurable - @Configurable.Comment({ "Whether to nerf the Paper crafting recipe.", "Default: true" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether to nerf the Paper crafting recipe.", "Default: true" }) public boolean nerfPaperCrafting = true; // default true - @Configurable - @Configurable.Comment({ "Recipes for items like Iron Doors, Trapdoors, Anvil" + + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Recipes for items like Iron Doors, Trapdoors, Anvil" + " require Iron Plates, Rods, and more.", "Default: false" }) public boolean hardAdvancedIronRecipes = false; // default false - @Configurable - @Configurable.Comment({ "Whether to make coloring blocks like Concrete or Glass harder.", "Default: false" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether to make coloring blocks like Concrete or Glass harder.", "Default: false" }) public boolean hardDyeRecipes = false; // default false - @Configurable - @Configurable.Comment({ "Whether to remove charcoal smelting recipes from the vanilla furnace.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether to remove charcoal smelting recipes from the vanilla furnace.", "Default: true" }) public boolean harderCharcoalRecipe = true; // default true - @Configurable - @Configurable.Comment({ "Whether to make the Flint and Steel recipe require steel parts.", "Default: true." }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether to make the Flint and Steel recipe require steel parts.", "Default: true." }) public boolean flintAndSteelRequireSteel = true; // default true - @Configurable - @Configurable.Comment({ "Whether to remove Vanilla Block Recipes from the Crafting Table.", "Default: false" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether to remove Vanilla Block Recipes from the Crafting Table.", "Default: false" }) public boolean removeVanillaBlockRecipes = false; // default false - @Configurable - @Configurable.Comment({ "Whether to remove Vanilla TNT Recipe from the Crafting Table.", "Default: true" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether to remove Vanilla TNT Recipe from the Crafting Table.", "Default: true" }) public boolean removeVanillaTNTRecipe = true; // default true - @Configurable - @Configurable.Comment({ "How many Multiblock Casings to make per craft. Either 1, 2, or 3.", "Default: 2" }) - @Configurable.Range(min = 1, max = 3) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "How many Multiblock Casings to make per craft. Either 1, 2, or 3.", "Default: 2" }) + @Range(min = 1, max = 3) public int casingsPerCraft = 2; - @Configurable - @Configurable.Comment({ + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether to nerf the output amounts of the first circuit in a set to 1 (from 2) and SoC to 2 (from 4).", "Default: false" }) public boolean harderCircuitRecipes = false; - @Configurable - @Configurable.Comment({ "Whether to nerf machine controller recipes.", "Default: false" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether to nerf machine controller recipes.", "Default: false" }) public boolean hardMultiRecipes = false; // default false - @Configurable - @Configurable.Comment({ + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether tools should have enchants or not. Like the flint sword getting fire aspect.", "Default: true" }) public boolean enchantedTools = true; @@ -133,148 +137,150 @@ public static class RecipeConfigs { public static class CompatibilityConfigs { - @Configurable - @Configurable.Comment("Config options regarding GTEU compatibility with other energy systems") + @Configurable(key = LocalizationKey.FULL) + @Comment("Config options regarding GTEU compatibility with other energy systems") public EnergyCompatConfig energy = new EnergyCompatConfig(); - @Configurable - @Configurable.Comment("Config options regarding GTCEu compatibility with AE2") + @Configurable(key = LocalizationKey.FULL) + @Comment("Config options regarding GTCEu compatibility with AE2") public AE2CompatConfig ae2 = new AE2CompatConfig(); - @Configurable - @Configurable.Comment("Config options regarding GTCEu compatibility with minimap mods") + @Configurable(key = LocalizationKey.FULL) + @Comment("Config options regarding GTCEu compatibility with minimap mods") public MinimapCompatConfig minimap = new MinimapCompatConfig(); - @Configurable - @Configurable.Comment({ "Whether to hide facades of all blocks in JEI and creative search menu.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether to hide facades of all blocks in JEI and creative search menu.", "Default: true" }) // todo: implement or purge public boolean hideFacadesInRecipeViewer = true; - @Configurable - @Configurable.Comment({ "Whether to hide filled cells in JEI and creative search menu.", "Default: true" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether to hide filled cells in JEI and creative search menu.", "Default: true" }) // todo: implement or purge public boolean hideFilledCellsInRecipeViewer = true; - @Configurable - @Configurable.Comment({ "Whether to hide the ore processing diagrams in JEI", "Default: false" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether to hide the ore processing diagrams in JEI", "Default: false" }) public boolean hideOreProcessingDiagrams = false; - @Configurable - @Configurable.Comment({ + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether Gregtech should remove smelting recipes from the vanilla furnace for ingots requiring the Electric Blast Furnace.", "Default: true" }) // todo: implement or purge public boolean removeSmeltingForEBFMetals = true; - @Configurable - @Configurable.Comment({ "Whether dimension markers should show the dimension tier value.", "Default: false" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether dimension markers should show the dimension tier value.", "Default: false" }) public boolean showDimensionTier = false; public static class EnergyCompatConfig { - @Configurable - @Configurable.Comment({ "Enable Native GTEU to Forge Energy (RF and alike) on GT Cables and Wires.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Enable Native GTEU to Forge Energy (RF and alike) on GT Cables and Wires.", "This does not enable nor disable Converters.", "Default: true" }) public boolean nativeEUToFE = true; - @Configurable - @Configurable.Comment({ "Enable GTEU to FE (and vice versa) Converters.", "Default: false" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Enable GTEU to FE (and vice versa) Converters.", "Default: false" }) + @UpdateRestriction(UpdateRestrictions.GAME_RESTART) public boolean enableFEConverters = false; - @Configurable - @Configurable.Comment({ "Forge Energy to GTEU ratio for converting FE to EU.", "Only affects converters.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Forge Energy to GTEU ratio for converting FE to EU.", "Only affects converters.", "Default: 4 FE == 1 EU" }) - @Configurable.Range(min = 1, max = 16) + @Range(min = 1, max = 16) public int feToEuRatio = 4; - @Configurable - @Configurable.Comment({ "GTEU to Forge Energy ratio for converting EU to FE.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "GTEU to Forge Energy ratio for converting EU to FE.", "Affects native conversion and Converters.", "Default: 4 FE == 1 EU" }) - @Configurable.Range(min = 1, max = 16) + @Range(min = 1, max = 16) public int euToFeRatio = 4; } public static class AE2CompatConfig { - @Configurable - @Configurable.Comment({ "The interval between ME Hatch/Bus interact ME network.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "The interval between ME Hatch/Bus interact ME network.", "It may cause lag if the interval is too small.", "Default: 2 sec" }) - @Configurable.Range(min = 1, max = 80) + @Range(min = 1, max = 80) public int updateIntervals = 40; - @Configurable - @Configurable.Comment({ "The energy consumption of ME Hatch/Bus.", "Default: 1.0AE/t" }) - @Configurable.DecimalRange(min = 0.0, max = 10.0) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "The energy consumption of ME Hatch/Bus.", "Default: 1.0AE/t" }) + @DecimalRange(min = 0.0, max = 10.0) + @UpdateRestriction(UpdateRestrictions.MAIN_MENU) public double meHatchEnergyUsage = 1.0; } public static class MinimapCompatConfig { - @Configurable - @Configurable.Comment({ - "Toggle specific map mod integration on/off (need to restart for this to take effect)" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Toggle specific map mod integration on/off" }) + @UpdateRestriction(UpdateRestrictions.GAME_RESTART) public Toggle toggle = new Toggle(); - @Configurable - @Configurable.Comment({ "The radius, in blocks, that picking up a surface rock will search for veins in.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "The radius, in blocks, that picking up a surface rock will search for veins in.", "-1 to disable.", "Default: 24" }) - @Configurable.Range(min = 1) + @Range(min = 1) public int surfaceRockProspectRange = 24; - @Configurable - @Configurable.Comment({ "The radius, in blocks, that clicking an ore block will search for veins in.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "The radius, in blocks, that clicking an ore block will search for veins in.", "-1 to disable", "Default: 24" }) - @Configurable.Range(min = 1) + @Range(min = 1) public int oreBlockProspectRange = 24; - @Configurable - @Configurable.Comment("The map scale at which displayed ores will stop scaling.") - @Configurable.DecimalRange(min = 0.1, max = 16) + @Configurable(key = LocalizationKey.FULL) + @Comment("The map scale at which displayed ores will stop scaling.") + @DecimalRange(min = 0.1, max = 16) // todo: implement or purge public float oreScaleStop = 1; - @Configurable - @Configurable.Comment("The size, in pixels, of ore icons on the map") - @Configurable.Range(min = 4) + @Configurable(key = LocalizationKey.FULL) + @Comment("The size, in pixels, of ore icons on the map") + @Range(min = 4) public int oreIconSize = 32; - @Configurable - @Configurable.Comment("The string prepending ore names in the ore vein tooltip") + @Configurable(key = LocalizationKey.FULL) + @Comment("The string prepending ore names in the ore vein tooltip") public String oreNamePrefix = "- "; - @Configurable - @Configurable.Comment({ "The color to draw a box around the ore icon with.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "The color to draw a box around the ore icon with.", "Accepts either an ARGB hex color prefixed with # or the string 'material' to use the ore's material color" }) public String borderColor = "#00000000"; - @Configurable - @Configurable.Comment({ "Which part of the screen to anchor buttons to", "Default: \"BOTTOM_LEFT\"" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Which part of the screen to anchor buttons to", "Default: \"BOTTOM_LEFT\"" }) public Anchor buttonAnchor = Anchor.BOTTOM_LEFT; - @Configurable - @Configurable.Comment({ "Which direction the buttons will go", "Default: \"VERTICAL\"" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Which direction the buttons will go", "Default: \"VERTICAL\"" }) public Direction direction = Direction.VERTICAL; - @Configurable - @Configurable.Comment({ "How horizontally far away from the anchor to place the buttons", "Default: 20" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "How horizontally far away from the anchor to place the buttons", "Default: 20" }) public int xOffset = 20; - @Configurable - @Configurable.Comment({ "How vertically far away from the anchor to place the buttons", "Default: 0" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "How vertically far away from the anchor to place the buttons", "Default: 0" }) public int yOffset = 0; public static class Toggle { - @Configurable - @Configurable.Comment({ "FTB Chunks integration enabled" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "FTB Chunks integration enabled" }) public boolean ftbChunksIntegration = false; - @Configurable - @Configurable.Comment({ "Journey Map integration enabled" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Journey Map integration enabled" }) public boolean journeyMapIntegration = true; - @Configurable - @Configurable.Comment({ "Xaerox's map integration enabled" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Xaerox's map integration enabled" }) public boolean xaerosMapIntegration = true; } @@ -327,76 +333,81 @@ public int getBorderColor(int materialColor) { public static class WorldGenConfigs { - @Configurable - @Configurable.Comment({ "Rubber Tree spawn chance (decimal % per chunk)", "Default: 0.5" }) - @Configurable.DecimalRange(min = 0f, max = 1f) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Rubber Tree spawn chance (decimal % per chunk)", "Default: 0.5" }) + @DecimalRange(min = 0f, max = 1f) public float rubberTreeSpawnChance = 0.5f; - @Configurable - @Configurable.Comment({ "Should all Stone Types drop unique Ore Item Blocks?", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Should all Stone Types drop unique Ore Item Blocks?", "Default: false (meaning only Stone, Netherrack, and Endstone)" }) + @UpdateRestriction(UpdateRestrictions.MAIN_MENU) public boolean allUniqueStoneTypes = false; - @Configurable - @Configurable.Comment({ "Should Sand-like ores fall?", "This includes gravel, sand, and red sand ores.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Should Sand-like ores fall?", "This includes gravel, sand, and red sand ores.", "Default: false (no falling ores)" }) public boolean sandOresFall = false; - @Configurable - @Configurable.Comment({ + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether to increase number of rolls for dungeon chests. Increases dungeon loot drastically.", "Default: true", "WARNING: Currently unimplemented." }) + @UpdateRestriction(UpdateRestrictions.MAIN_MENU) public boolean increaseDungeonLoot = true; - @Configurable - @Configurable.Comment({ "Allow GregTech to add additional GregTech Items as loot in various structures.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Allow GregTech to add additional GregTech Items as loot in various structures.", "Default: true" }) + @UpdateRestriction(UpdateRestrictions.MAIN_MENU) public boolean addLoot = true; - @Configurable + @Configurable(key = LocalizationKey.FULL) public OreVeinConfigs oreVeins = new OreVeinConfigs(); public static class OreVeinConfigs { - @Configurable - @Configurable.Range(min = 1, max = 32) - @Configurable.Comment({ + @Configurable(key = LocalizationKey.FULL) + @Range(min = 1, max = 32) + @Comment({ "The grid size (in chunks) for ore vein generation", "Default: 3" }) public int oreVeinGridSize = 3; - @Configurable - @Configurable.Range(min = 0, max = 32 * 16) - @Configurable.Comment({ + @Configurable(key = LocalizationKey.FULL) + @Range(min = 0, max = 32 * 16) + @Comment({ "The maximum random offset (in blocks) from the grid for generating an ore vein.", "Default: 12" }) public int oreVeinRandomOffset = 12; - @Configurable - @Configurable.Comment({ "Prevents regular vanilla ores from being generated outside GregTech ore veins", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Prevents regular vanilla ores from being generated outside GregTech ore veins", "Default: true" }) + @UpdateRestriction(UpdateRestrictions.MAIN_MENU) public boolean removeVanillaOreGen = true; - @Configurable - @Configurable.Comment({ "Prevents vanilla's large ore veins from being generated", "Default: true" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Prevents vanilla's large ore veins from being generated", "Default: true" }) + @UpdateRestriction(UpdateRestrictions.MAIN_MENU) public boolean removeVanillaLargeOreVeins = true; - @Configurable - @Configurable.Comment({ "Distance between bedrock ore veins in chunks, if enabled.", "Default: 16" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Distance between bedrock ore veins in chunks, if enabled.", "Default: 16" }) public int bedrockOreDistance = 16; - @Configurable - @Configurable.Comment({ "Make bedrock ore/fluid veins infinite?", "Default: false" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Make bedrock ore/fluid veins infinite?", "Default: false" }) public boolean infiniteBedrockOresFluids = false; - @Configurable - @Configurable.Comment({ "Generate ores indicators above ore veins", "Default: true" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Generate ores indicators above ore veins", "Default: true" }) public boolean oreIndicators = true; - @Configurable - @Configurable.Comment({ + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Sets the maximum number of chunks that may be cached for ore vein generation.", "Higher values may improve world generation performance, but at the cost of more RAM usage.", "If you substantially increase the ore vein grid size, random vein offset, or have very large (custom) veins, you may need to increase this value as well.", "Default: 512 (requires restarting the server / re-opening the world)" }) public int oreGenerationChunkCacheSize = 512; - @Configurable - @Configurable.Comment({ + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Sets the maximum number of chunks for which ore indicators may be cached.", "If you register any custom veins with very large indicator ranges (or modify existing ones that way), you may need to increase this value.", "Default: 2048 (requires restarting the server / re-opening the world)" @@ -407,180 +418,196 @@ public static class OreVeinConfigs { public static class MachineConfigs { - @Configurable - @Configurable.Comment({ "Whether insufficient energy supply should reset Machine recipe progress to zero.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether insufficient energy supply should reset Machine recipe progress to zero.", "If true, progress will reset.", "If false, progress will decrease to zero with 2x speed", "Default: false" }) public boolean recipeProgressLowEnergy = false; - @Configurable - @Configurable.Comment({ + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether to require a Wrench, Wirecutter, or other GregTech tools to break machines, casings, wires, and more.", "Default: false" }) + @UpdateRestriction(UpdateRestrictions.MAIN_MENU) public boolean requireGTToolsForBlocks = false; - @Configurable - @Configurable.Comment({ + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether machines explode in rainy weather or when placed next to certain terrain, such as fire or lava", "Default: false" }) + @UpdateRestriction(UpdateRestrictions.GAME_RESTART) public boolean shouldWeatherOrTerrainExplosion = false; - @Configurable - @Configurable.Comment({ "Energy use multiplier for electric items.", "Default: 100" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Energy use multiplier for electric items.", "Default: 100" }) public int energyUsageMultiplier = 100; - @Configurable - @Configurable.Comment({ "Energy use multiplier for prospectors.", "Default: 100" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Energy use multiplier for prospectors.", "Default: 100" }) public int prospectorEnergyUseMultiplier = 100; - @Configurable - @Configurable.Comment({ "Whether machines or boilers damage the terrain when they explode.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether machines or boilers damage the terrain when they explode.", "Note machines and boilers always explode when overloaded with power or met with special conditions, regardless of this config.", "Default: true" }) public boolean doesExplosionDamagesTerrain = true; - @Configurable - @Configurable.Comment({ + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Enables Safe Active Transformers, removing their ability to explode if unformed while transmitting/receiving power.", "Default: false" }) public boolean harmlessActiveTransformers = false; - @Configurable - @Configurable.Comment({ "Whether to play machine sounds while machines are active.", "Default: true" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether to play machine sounds while machines are active.", "Default: true" }) public boolean machineSounds = true; - @Configurable - @Configurable.Comment({ "Whether Steam Multiblocks should use Steel instead of Bronze.", "Default: false" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether Steam Multiblocks should use Steel instead of Bronze.", "Default: false" }) + @UpdateRestriction(UpdateRestrictions.GAME_RESTART) public boolean steelSteamMultiblocks = false; - @Configurable - @Configurable.Comment({ "Whether to enable the cleanroom, required for various recipes.", "Default: true" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether to enable the cleanroom, required for various recipes.", "Default: true" }) + @UpdateRestriction(UpdateRestrictions.GAME_RESTART) public boolean enableCleanroom = true; - @Configurable - @Configurable.Comment({ "Whether multiblocks should ignore all cleanroom requirements.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether multiblocks should ignore all cleanroom requirements.", "This does nothing if enableCleanroom is false.", "Default: false" }) public boolean cleanMultiblocks = false; - @Configurable - @Configurable.Comment({ "Block to replace mined ores with in the miner and multiblock miner.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Block to replace mined ores with in the miner and multiblock miner.", "Default: minecraft:cobblestone" }) public String replaceMinedBlocksWith = "minecraft:cobblestone"; - @Configurable - @Configurable.Comment({ "Whether to enable Assembly Line research for recipes.", "Default: true" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether to enable Assembly Line research for recipes.", "Default: true" }) + @UpdateRestriction(UpdateRestrictions.MAIN_MENU) public boolean enableResearch = true; - @Configurable - @Configurable.Comment({ "Whether to enable the Maintenance Hatch, required for Multiblocks.", "Default: true" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether to enable the Maintenance Hatch, required for Multiblocks.", "Default: true" }) + @UpdateRestriction(UpdateRestrictions.GAME_RESTART) public boolean enableMaintenance = true; - @Configurable - @Configurable.Comment({ + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether to enable World Accelerators, which accelerate ticks for surrounding Tile Entities, Crops, etc.", "Default: true" }) + @UpdateRestriction(UpdateRestrictions.MAIN_MENU) public boolean enableWorldAccelerators = true; - @Configurable - @Configurable.Comment({ "List of TileEntities that the World Accelerator should not accelerate.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "List of TileEntities that the World Accelerator should not accelerate.", "GregTech TileEntities are always blocked.", "Entries must be in a fully qualified format. For example: appeng.tile.networking.TileController", "Default: none" }) + @UpdateRestriction(UpdateRestrictions.GAME_RESTART) public String[] worldAcceleratorBlacklist = new String[0]; - @Configurable - @Configurable.Comment({ + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether to use GT6-style pipe and cable connections, meaning they will not auto-connect " + "unless placed directly onto another pipe or cable.", "Default: true" }) public boolean gt6StylePipesCables = true; - @Configurable - @Configurable.Comment({ "Whether the machine's circuit slot need to be inserted a real circuit." }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether the machine's circuit slot need to be inserted a real circuit." }) public boolean ghostCircuit = true; - @Configurable - @Configurable.Comment({ "Whether to add a \"Bedrock Ore Miner\" (also enables bedrock ore generation)", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether to add a \"Bedrock Ore Miner\" (also enables bedrock ore generation)", "Default: false" }) + @UpdateRestriction(UpdateRestrictions.GAME_RESTART) public boolean doBedrockOres = false; - @Configurable - @Configurable.Comment({ "What Kind of material should the bedrock ore miner output?", "Default: \"raw\"" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "What Kind of material should the bedrock ore miner output?", "Default: \"raw\"" }) public String bedrockOreDropTagPrefix = "raw"; - @Configurable - @Configurable.Range(min = 120, max = 800) - @Configurable.Comment({ "The base amount of ticks per block for electric singleblock ore miners", + @Configurable(key = LocalizationKey.FULL) + @Range(min = 120, max = 800) + @Comment({ "The base amount of ticks per block for electric singleblock ore miners", "Default: 320" }) + @UpdateRestriction(UpdateRestrictions.GAME_RESTART) public int minerSpeed = 320; - @Configurable - @Configurable.Comment({ "Makes nearly every GCYM Multiblock require blocks which set their maximum voltages.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Makes nearly every GCYM Multiblock require blocks which set their maximum voltages.", "Default: false" }) + @UpdateRestriction(UpdateRestrictions.GAME_RESTART) // todo: implement or purge public boolean enableTieredCasings = false; - @Configurable - @Configurable.Comment({ "Minimum distance between Long Distance Item Pipe Endpoints", "Default: 50" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Minimum distance between Long Distance Item Pipe Endpoints", "Default: 50" }) public int ldItemPipeMinDistance = 50; - @Configurable - @Configurable.Comment({ "Minimum distance betweeb Long Distance Fluid Pipe Endpoints", "Default: 50" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Minimum distance betweeb Long Distance Fluid Pipe Endpoints", "Default: 50" }) public int ldFluidPipeMinDistance = 50; - @Configurable - @Configurable.Comment({ "Whether ONLY owners can open a machine gui", "Default: false" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether ONLY owners can open a machine gui", "Default: false" }) public boolean onlyOwnerGUI = false; - @Configurable - @Configurable.Comment({ "Whether ONLY owners can break a machine", "Default: false" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether ONLY owners can break a machine", "Default: false" }) public boolean onlyOwnerBreak = false; - @Configurable - @Configurable.Comment({ "Minimum op level to bypass the ownership checks", "Default: 2" }) - @Configurable.Range(min = Commands.LEVEL_ALL, max = Commands.LEVEL_OWNERS) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Minimum op level to bypass the ownership checks", "Default: 2" }) + @Range(min = Commands.LEVEL_ALL, max = Commands.LEVEL_OWNERS) public int ownerOPBypass = Commands.LEVEL_GAMEMASTERS; /** * Addons mods should not reference this config directly. * Use {@link GTCEuAPI#isHighTier()} instead. */ - @Configurable - @Configurable.Comment({ "If High Tier (>UV-tier) GT content should be registered.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "If High Tier (>UV-tier) GT content should be registered.", "Items and Machines enabled with this config will have missing recipes by default.", "This is intended for modpack developers only, and is not playable without custom tweaks or addons.", "Other mods can override this to true, regardless of the config file.", "Default: false" }) + @UpdateRestriction(UpdateRestrictions.GAME_RESTART) public boolean highTierContent = false; - @Configurable - @Configurable.Comment({ "Whether the Assembly Line should require the item inputs to be in order.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether the Assembly Line should require the item inputs to be in order.", "Default: true" }) + @UpdateRestriction(UpdateRestrictions.GAME_RESTART) public boolean orderedAssemblyLineItems = true; - @Configurable - @Configurable.Comment({ "Whether the Assembly Line should require the fluid inputs to be in order.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether the Assembly Line should require the fluid inputs to be in order.", "(Requires Ordered Assembly Line Item Inputs to be enabled.)", "Default: false" }) + @UpdateRestriction(UpdateRestrictions.GAME_RESTART) public boolean orderedAssemblyLineFluids = false; - @Configurable - @Configurable.Comment({ + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Default maximum parallel of steam multiblocks", "Default: 8" }) public int steamMultiParallelAmount = 8; - @Configurable - @Configurable.Comment("Small Steam Boiler Options") + @Configurable(key = LocalizationKey.FULL) + @Comment("Small Steam Boiler Options") + @UpdateRestriction(UpdateRestrictions.GAME_RESTART) public SmallBoilers smallBoilers = new SmallBoilers(); - @Configurable - @Configurable.Comment("Large Steam Boiler Options") + @Configurable(key = LocalizationKey.FULL) + @Comment("Large Steam Boiler Options") + @UpdateRestriction(UpdateRestrictions.GAME_RESTART) public LargeBoilers largeBoilers = new LargeBoilers(); public static class SmallBoilers { - @Configurable - @Configurable.Comment({ "The amount of steam a Steam Solid Boiler produces per second at max temperature.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "The amount of steam a Steam Solid Boiler produces per second at max temperature.", "Default: 120" }) public int solidBoilerBaseOutput = 120; - @Configurable - @Configurable.Comment({ + @Configurable(key = LocalizationKey.FULL) + @Comment({ "The amount of steam a High Pressure Steam Solid Boiler produces per second at max temperature.", "Default: 300" }) public int hpSolidBoilerBaseOutput = 300; - @Configurable - @Configurable.Comment({ "The amount of steam a Steam Liquid Boiler produces per second at max temperature.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "The amount of steam a Steam Liquid Boiler produces per second at max temperature.", "Default: 240" }) public int liquidBoilerBaseOutput = 240; - @Configurable - @Configurable.Comment({ + @Configurable(key = LocalizationKey.FULL) + @Comment({ "The amount of steam a High Pressure Steam Liquid Boiler produces per second at max temperature.", "Default: 600" }) public int hpLiquidBoilerBaseOutput = 600; - @Configurable - @Configurable.Comment({ "The amount of steam a Steam Solar Boiler produces per second at max temperature.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "The amount of steam a Steam Solar Boiler produces per second at max temperature.", "Default: 120" }) public int solarBoilerBaseOutput = 120; - @Configurable - @Configurable.Comment({ + @Configurable(key = LocalizationKey.FULL) + @Comment({ "The amount of steam a High Pressure Steam Solar Boiler produces per second at max temperature.", "Default: 360" }) public int hpSolarBoilerBaseOutput = 360; @@ -588,208 +615,224 @@ public static class SmallBoilers { public static class LargeBoilers { - @Configurable - @Configurable.Comment({ "The conversion rate between water and steam in Large Boilers.", "Default: 160" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "The conversion rate between water and steam in Large Boilers.", "Default: 160" }) public int steamPerWater = 160; - @Configurable - @Configurable.Comment({ "The max temperature of the Large Bronze Boiler.", "Default: 800" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "The max temperature of the Large Bronze Boiler.", "Default: 800" }) public int bronzeBoilerMaxTemperature = 800; - @Configurable - @Configurable.Comment({ "The heat speed of the Large Bronze Boiler.", "Default: 1" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "The heat speed of the Large Bronze Boiler.", "Default: 1" }) public int bronzeBoilerHeatSpeed = 1; - @Configurable - @Configurable.Comment({ "The max temperature of the Large Steel Boiler.", "Default: 1800" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "The max temperature of the Large Steel Boiler.", "Default: 1800" }) public int steelBoilerMaxTemperature = 1800; - @Configurable - @Configurable.Comment({ "The heat speed of the Large Steel Boiler.", "Default: 1" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "The heat speed of the Large Steel Boiler.", "Default: 1" }) public int steelBoilerHeatSpeed = 1; - @Configurable - @Configurable.Comment({ "The max temperature of the Large Titanium Boiler.", "Default: 3200" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "The max temperature of the Large Titanium Boiler.", "Default: 3200" }) public int titaniumBoilerMaxTemperature = 3200; - @Configurable - @Configurable.Comment({ "The heat speed of the Large Titanium Boiler.", "Default: 1" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "The heat speed of the Large Titanium Boiler.", "Default: 1" }) public int titaniumBoilerHeatSpeed = 1; - @Configurable - @Configurable.Comment({ "The max temperature of the Large Tungstensteel Boiler.", "Default: 6400" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "The max temperature of the Large Tungstensteel Boiler.", "Default: 6400" }) public int tungstensteelBoilerMaxTemperature = 6400; - @Configurable - @Configurable.Comment({ "The heat speed of the Large Tungstensteel Boiler.", "Default: 2" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "The heat speed of the Large Tungstensteel Boiler.", "Default: 2" }) public int tungstensteelBoilerHeatSpeed = 2; } } public static class ToolConfigs { - @Configurable - @Configurable.Comment({ "Random chance for electric tools to take actual damage", "Default: 10%" }) - @Configurable.Range(min = 0, max = 100) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Random chance for electric tools to take actual damage", "Default: 10%" }) + @Range(min = 0, max = 100) public int rngDamageElectricTools = 10; - @Configurable - @Configurable.Comment({ "Amount of blocks that can be spray painted at once", "Default: 16" }) - @Configurable.Range(min = 1, max = 512) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Amount of blocks that can be spray painted at once", "Default: 16" }) + @Range(min = 1, max = 512) public int sprayCanChainLength = 16; - @Configurable - @Configurable.Comment({ "Delay in ticks between each log being broken when tree felling", "Default: 2" }) - @Configurable.Range(min = 1, max = 400) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Delay in ticks between each log being broken when tree felling", "Default: 2" }) + @Range(min = 1, max = 400) public int treeFellingDelay = 2; - @Configurable - @Configurable.Comment("NanoSaber Options") + @Configurable(key = LocalizationKey.FULL) + @Comment("NanoSaber Options") + @UpdateRestriction(UpdateRestrictions.MAIN_MENU) public NanoSaber nanoSaber = new NanoSaber(); - @Configurable - @Configurable.Comment("NightVision Goggles Voltage Tier. Default: 1 (LV)") - @Configurable.Range(min = 0, max = 14) + @Configurable(key = LocalizationKey.FULL) + @Comment("NightVision Goggles Voltage Tier. Default: 1 (LV)") + @Range(min = 0, max = 14) + @UpdateRestriction(UpdateRestrictions.GAME_RESTART) public int voltageTierNightVision = 1; - @Configurable - @Configurable.Comment("NanoSuit Voltage Tier. Default: 3 (HV)") - @Configurable.Range(min = 0, max = 14) + @Configurable(key = LocalizationKey.FULL) + @Comment("NanoSuit Voltage Tier. Default: 3 (HV)") + @Range(min = 0, max = 14) + @UpdateRestriction(UpdateRestrictions.GAME_RESTART) public int voltageTierNanoSuit = 3; - @Configurable - @Configurable.Comment({ "Advanced NanoSuit Chestplate Voltage Tier.", "Default: 3 (HV)" }) - @Configurable.Range(min = 0, max = 14) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Advanced NanoSuit Chestplate Voltage Tier.", "Default: 3 (HV)" }) + @Range(min = 0, max = 14) + @UpdateRestriction(UpdateRestrictions.GAME_RESTART) public int voltageTierAdvNanoSuit = 3; - @Configurable - @Configurable.Comment({ "QuarkTech Suit Voltage Tier.", "Default: 5 (IV)" }) - @Configurable.Range(min = 0, max = 14) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "QuarkTech Suit Voltage Tier.", "Default: 5 (IV)" }) + @Range(min = 0, max = 14) + @UpdateRestriction(UpdateRestrictions.GAME_RESTART) public int voltageTierQuarkTech = 5; - @Configurable - @Configurable.Comment({ "Advanced QuarkTech Suit Chestplate Voltage Tier.", "Default: 5 (LuV)" }) - @Configurable.Range(min = 0, max = 14) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Advanced QuarkTech Suit Chestplate Voltage Tier.", "Default: 5 (LuV)" }) + @Range(min = 0, max = 14) + @UpdateRestriction(UpdateRestrictions.GAME_RESTART) public int voltageTierAdvQuarkTech = 6; - @Configurable - @Configurable.Comment({ "Electric Impeller Jetpack Voltage Tier.", "Default: 2 (MV)" }) - @Configurable.Range(min = 0, max = 14) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Electric Impeller Jetpack Voltage Tier.", "Default: 2 (MV)" }) + @Range(min = 0, max = 14) + @UpdateRestriction(UpdateRestrictions.GAME_RESTART) public int voltageTierImpeller = 2; - @Configurable - @Configurable.Comment({ "Advanced Electric Jetpack Voltage Tier.", "Default: 3 (HV)" }) - @Configurable.Range(min = 0, max = 14) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Advanced Electric Jetpack Voltage Tier.", "Default: 3 (HV)" }) + @Range(min = 0, max = 14) + @UpdateRestriction(UpdateRestrictions.GAME_RESTART) public int voltageTierAdvImpeller = 3; public static class NanoSaber { - @Configurable - @Configurable.DecimalRange(min = 0, max = 100) - @Configurable.Comment({ "The additional damage added when the NanoSaber is powered.", "Default: 20.0" }) + @Configurable(key = LocalizationKey.FULL) + @DecimalRange(min = 0, max = 100) + @Comment({ "The additional damage added when the NanoSaber is powered.", "Default: 20.0" }) + @UpdateRestriction(UpdateRestrictions.GAME_RESTART) public double nanoSaberDamageBoost = 20; - @Configurable - @Configurable.DecimalRange(min = 0, max = 100) - @Configurable.Comment({ "The base damage of the NanoSaber.", "Default: 5.0" }) + @Configurable(key = LocalizationKey.FULL) + @DecimalRange(min = 0, max = 100) + @Comment({ "The base damage of the NanoSaber.", "Default: 5.0" }) public double nanoSaberBaseDamage = 5; - @Configurable - @Configurable.Comment({ "Should Zombies spawn with charged, active NanoSabers on hard difficulty?", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Should Zombies spawn with charged, active NanoSabers on hard difficulty?", "Default: true" }) public boolean zombieSpawnWithSabers = true; - @Configurable - @Configurable.Range(min = 1, max = 512) - @Configurable.Comment({ "The EU/t consumption of the NanoSaber.", "Default: 64" }) + @Configurable(key = LocalizationKey.FULL) + @Range(min = 1, max = 512) + @Comment({ "The EU/t consumption of the NanoSaber.", "Default: 64" }) + @UpdateRestriction(UpdateRestrictions.GAME_RESTART) public int energyConsumption = 64; } } public static class GameplayConfigs { - @Configurable - @Configurable.Comment({ "Enable hazardous materials", "Default: true" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Enable hazardous materials", "Default: true" }) + @UpdateRestriction(UpdateRestrictions.GAME_RESTART) public boolean hazardsEnabled = true; - @Configurable - @Configurable.Comment({ "Whether hazards are applied to all valid items, or just GT's.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether hazards are applied to all valid items, or just GT's.", "true = all, false = GT only.", "Default: true" }) public boolean universalHazards = true; - @Configurable - @Configurable.Comment({ "Whether environmental hazards like pollution or radiation are active", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether environmental hazards like pollution or radiation are active", "Default: false" }) + @UpdateRestriction(UpdateRestrictions.GAME_RESTART) public boolean environmentalHazards = false; - @Configurable - @Configurable.Comment({ "How much environmental hazards decay per chunk, per tick.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "How much environmental hazards decay per chunk, per tick.", "Default: 0.001" }) public float environmentalHazardDecayRate = 0.001f; } public static class ClientConfigs { - @Configurable - @Configurable.Comment({ "Whether or not to enable Emissive Textures for GregTech Machines.", "Default: true" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether or not to enable Emissive Textures for GregTech Machines.", "Default: true" }) + @UpdateRestriction(UpdateRestrictions.MAIN_MENU) public boolean machinesEmissiveTextures = true; - @Configurable - @Configurable.Comment({ "Whether or not sounds should be played when using tools outside of crafting.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether or not sounds should be played when using tools outside of crafting.", "Default: true" }) public boolean toolUseSounds = true; - @Configurable - @Configurable.Comment({ "Whether or not sounds should be played when crafting with tools.", "Default: true" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Whether or not sounds should be played when crafting with tools.", "Default: true" }) public boolean toolCraftingSounds = true; - @Configurable - @Configurable.Comment({ "The default color to overlay onto machines.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "The default color to overlay onto machines.", "#FFFFFF is no coloring (default).", "#D2DCFF is the classic blue from GT5." }) - @Configurable.StringPattern(value = "#[0-9a-fA-F]{1,6}") - @Configurable.Gui.ColorValue + @StringPattern(value = "#[0-9a-fA-F]{1,6}") + @Gui.ColorValue + @UpdateRestriction(UpdateRestrictions.GAME_RESTART) public String defaultPaintingColor = "#FFFFFF"; - @Configurable - @Configurable.Comment({ "The default color to overlay onto Machine (and other) UIs.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "The default color to overlay onto Machine (and other) UIs.", "16777215 (#FFFFFF) is no coloring (like GTCE) (default).", "13819135 (#D2DCFF in decimal) is the classic blue from GT5." }) - @Configurable.StringPattern(value = "#[0-9a-fA-F]{1,6}") - @Configurable.Gui.ColorValue + @StringPattern(value = "#[0-9a-fA-F]{1,6}") + @Gui.ColorValue public String defaultUIColor = "#FFFFFF"; - @Configurable - @Configurable.Comment({ "Use VBO cache for multiblock preview.", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Use VBO cache for multiblock preview.", "Disable if you have issues with rendering multiblocks.", "Default: true" }) + @UpdateRestriction(UpdateRestrictions.MAIN_MENU) public boolean useVBO = true; - @Configurable - @Configurable.Comment({ "Duration of the multiblock in-world preview (s)", "Default: 10" }) - @Configurable.Range(min = 1, max = 999) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Duration of the multiblock in-world preview (s)", "Default: 10" }) + @Range(min = 1, max = 999) public int inWorldPreviewDuration = 10; - @Configurable - @Configurable.Comment({ "Duration of UI animations in ms", "Default: 300" }) - @Configurable.Range(min = 1) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Duration of UI animations in ms", "Default: 300" }) + @Range(min = 1) public int animationTime = 300; - @Configurable + @Configurable(key = LocalizationKey.FULL) public ArmorHud armorHud = new ArmorHud(); - @Configurable + @Configurable(key = LocalizationKey.FULL) public RendererConfigs renderer = new RendererConfigs(); public static class ArmorHud { - @Configurable - @Configurable.Comment({ "Sets HUD location", "1 - left-upper corner", "2 - right-upper corner", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Sets HUD location", "1 - left-upper corner", "2 - right-upper corner", "3 - left-bottom corner", "4 - right-bottom corner", "Default: 1" }) - @Configurable.Range(min = 1, max = 4) + @Range(min = 1, max = 4) public int hudLocation = 1; - @Configurable - @Configurable.Comment({ "Horizontal offset of HUD.", "Default: 0" }) - @Configurable.Range(min = 0, max = 100) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Horizontal offset of HUD.", "Default: 0" }) + @Range(min = 0, max = 100) public int hudOffsetX = 0; - @Configurable - @Configurable.Comment({ "Vertical offset of HUD.", "Default: 0" }) - @Configurable.Range(min = 0, max = 100) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Vertical offset of HUD.", "Default: 0" }) + @Range(min = 0, max = 100) public int hudOffsetY = 0; } + + public static class RendererConfigs { + + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Render fluids in multiblocks that support them?", "Default: true" }) + public boolean renderFluids = true; + } } public static class DeveloperConfigs { - @Configurable - @Configurable.Comment({ "Debug general events? (will print recipe conficts etc. to server's debug.log)", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Debug general events? (will print recipe conficts etc. to server's debug.log)", "Default: false" }) + @UpdateRestriction(UpdateRestrictions.MAIN_MENU) public boolean debug = false; - @Configurable - @Configurable.Comment({ "Debug ore vein placement? (will print placed veins to server's debug.log)", + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Debug ore vein placement? (will print placed veins to server's debug.log)", "Default: false (no placement printout in debug.log)" }) public boolean debugWorldgen = false; - @Configurable - @Configurable.Comment({ "Generate ores in superflat worlds?", "Default: false" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Generate ores in superflat worlds?", "Default: false" }) public boolean doSuperflatOres = false; - @Configurable - @Configurable.Comment({ "Dump all registered GT recipes?", "Default: false" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Dump all registered GT recipes?", "Default: false" }) public boolean dumpRecipes = false; - @Configurable - @Configurable.Comment({ "Dump all registered GT models/blockstates/etc?", "Default: false" }) + @Configurable(key = LocalizationKey.FULL) + @Comment({ "Dump all registered GT models/blockstates/etc?", "Default: false" }) public boolean dumpAssets = false; } - - public static class RendererConfigs { - - @Configurable - @Configurable.Comment({ "Render fluids in multiblocks that support them?", "Default: true" }) - public boolean renderFluids = true; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/AbstractRegistrateAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/registrate/AbstractRegistrateAccessor.java similarity index 93% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/AbstractRegistrateAccessor.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/registrate/AbstractRegistrateAccessor.java index 801fa24fc68..8546afae25e 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/AbstractRegistrateAccessor.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/registrate/AbstractRegistrateAccessor.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.core.mixins; +package com.gregtechceu.gtceu.core.mixins.registrate; import com.google.common.collect.ListMultimap; import com.tterrag.registrate.AbstractRegistrate; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/registrate/LanguageProviderAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/registrate/LanguageProviderAccessor.java new file mode 100644 index 00000000000..56e02a8647e --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/registrate/LanguageProviderAccessor.java @@ -0,0 +1,15 @@ +package com.gregtechceu.gtceu.core.mixins.registrate; + +import net.minecraftforge.common.data.LanguageProvider; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.Map; + +@Mixin(value = LanguageProvider.class, remap = false) +public interface LanguageProviderAccessor { + + @Accessor("data") + Map gtceu$getData(); +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/registrate/RegistrateDataProviderAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/registrate/RegistrateDataProviderAccessor.java new file mode 100644 index 00000000000..795638b44ea --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/registrate/RegistrateDataProviderAccessor.java @@ -0,0 +1,16 @@ +package com.gregtechceu.gtceu.core.mixins.registrate; + +import com.google.common.collect.BiMap; +import com.tterrag.registrate.providers.ProviderType; +import com.tterrag.registrate.providers.RegistrateDataProvider; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(value = RegistrateDataProvider.class, remap = false) +public interface RegistrateDataProviderAccessor { + + @Accessor("TYPES") + static BiMap> gtceu$getTypes() { + throw new AssertionError(); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/data/GregTechDatagen.java b/src/main/java/com/gregtechceu/gtceu/data/GregTechDatagen.java index 59136571878..bfc232db44f 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/GregTechDatagen.java +++ b/src/main/java/com/gregtechceu/gtceu/data/GregTechDatagen.java @@ -1,6 +1,8 @@ package com.gregtechceu.gtceu.data; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTLangProvider; import com.gregtechceu.gtceu.common.registry.GTRegistration; +import com.gregtechceu.gtceu.core.mixins.registrate.RegistrateDataProviderAccessor; import com.gregtechceu.gtceu.data.lang.LangHandler; import com.gregtechceu.gtceu.data.tags.*; @@ -8,11 +10,20 @@ public class GregTechDatagen { - public static void init() { + // we only register this so the class gets loaded. the key gets overwritten in #initPre. + private static final ProviderType LANG_PROVIDER = ProviderType.register("ex_lang", GTLangProvider::new); + + public static void initPre() { + // replace some default providers with ours + RegistrateDataProviderAccessor.gtceu$getTypes().forcePut("lang", LANG_PROVIDER); + } + + public static void initPost() { GTRegistration.REGISTRATE.addDataGenerator(ProviderType.BLOCK_TAGS, BlockTagLoader::init); GTRegistration.REGISTRATE.addDataGenerator(ProviderType.ITEM_TAGS, ItemTagLoader::init); GTRegistration.REGISTRATE.addDataGenerator(ProviderType.FLUID_TAGS, FluidTagLoader::init); GTRegistration.REGISTRATE.addDataGenerator(ProviderType.ENTITY_TAGS, EntityTypeTagLoader::init); - GTRegistration.REGISTRATE.addDataGenerator(ProviderType.LANG, LangHandler::init); + + GTRegistration.REGISTRATE.addDataGenerator(ProviderType.LANG, p -> LangHandler.init((GTLangProvider) p)); } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/AdvancementLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/AdvancementLang.java index 623cd889aaf..ce5cb6ea5a2 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/AdvancementLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/AdvancementLang.java @@ -1,12 +1,10 @@ package com.gregtechceu.gtceu.data.lang; -import com.tterrag.registrate.providers.RegistrateLangProvider; - -import static com.gregtechceu.gtceu.data.lang.LangUtil.*; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTLangProvider; public class AdvancementLang { - public static void init(RegistrateLangProvider provider) { + public static void init(GTLangProvider provider) { // todo advancements /* * provider.add("gtceu.advancement.root_steam.name", "Steam Age"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java index fc5dc68de49..bd9448f3f5e 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java @@ -1,16 +1,16 @@ package com.gregtechceu.gtceu.data.lang; -import com.tterrag.registrate.providers.RegistrateLangProvider; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTLangProvider; public class ArmorLang { - public static void init(RegistrateLangProvider provider) { + public static void init(GTLangProvider provider) { generateArmorMessageKeys(provider); generateTooltipKeys(provider); generateHudKeys(provider); } - private static void generateArmorMessageKeys(RegistrateLangProvider provider) { + private static void generateArmorMessageKeys(GTLangProvider provider) { // NanoMuscle Suit provider.add("armor.gtceu.nano_muscle_suite.nightvision.enabled", "NanoMuscle™ Suite: §aNightVision Enabled"); provider.add("armor.gtceu.nano_muscle_suite.nightvision.disabled", @@ -45,12 +45,9 @@ private static void generateArmorMessageKeys(RegistrateLangProvider provider) { provider.add("armor.gtceu.message.nightvision.error", "§cNot enough power!"); } - private static void generateTooltipKeys(RegistrateLangProvider provider) { - provider.add("item.gtceu.liquid_fuel_jetpack.tooltip", "§7Uses Combustion Generator Fuels for Thrust"); // move - // this - // to - // item - // lang? + private static void generateTooltipKeys(GTLangProvider provider) { + // move this to item lang? + provider.add("item.gtceu.liquid_fuel_jetpack.tooltip", "§7Uses Combustion Generator Fuels for Thrust"); // Armor Abilities provider.add("armor.gtceu.tooltip.stepassist", "§7Provides Step-Assist"); @@ -71,7 +68,7 @@ private static void generateTooltipKeys(RegistrateLangProvider provider) { provider.add("armor.gtceu.energy_share.tooltip.info", "To change mode, SHIT + R-CLICK when holding item"); } - private static void generateHudKeys(RegistrateLangProvider provider) { + private static void generateHudKeys(GTLangProvider provider) { // HUD Information provider.add("armor.gtceu.hud.status.enabled", "§aON"); // change this to generic tooltip? provider.add("armor.gtceu.hud.status.disabled", "§cOFF"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java index cb1ad81bcae..de163af40dd 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java @@ -1,90 +1,87 @@ package com.gregtechceu.gtceu.data.lang; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTLangProvider; import com.gregtechceu.gtceu.common.data.GTBlocks; -import com.tterrag.registrate.providers.RegistrateLangProvider; - -import static com.gregtechceu.gtceu.data.lang.LangUtil.*; - public class BlockLang { - public static void init(RegistrateLangProvider provider) { + public static void init(GTLangProvider provider) { generateBlockKeys(provider); generateBlockTooltips(provider); generatePipeKeys(provider); } - private static void generateBlockKeys(RegistrateLangProvider provider) { + private static void generateBlockKeys(GTLangProvider provider) { // Coils - replace(provider, "block.gtceu.hssg_coil_block", "HSS-G Coil Block"); - replace(provider, "block.gtceu.rtm_alloy_coil_block", "RTM Alloy Coil Block"); + provider.add("block.gtceu.hssg_coil_block", "HSS-G Coil Block"); + provider.add("block.gtceu.rtm_alloy_coil_block", "RTM Alloy Coil Block"); // Substation Capacitors - replace(provider, GTBlocks.BATTERY_EMPTY_TIER_I.get().getDescriptionId(), "Empty Tier I Capacitor"); - replace(provider, GTBlocks.BATTERY_EMPTY_TIER_II.get().getDescriptionId(), "Empty Tier II Capacitor"); - replace(provider, GTBlocks.BATTERY_EMPTY_TIER_III.get().getDescriptionId(), "Empty Tier III Capacitor"); + provider.add(GTBlocks.BATTERY_EMPTY_TIER_I.get().getDescriptionId(), "Empty Tier I Capacitor"); + provider.add(GTBlocks.BATTERY_EMPTY_TIER_II.get().getDescriptionId(), "Empty Tier II Capacitor"); + provider.add(GTBlocks.BATTERY_EMPTY_TIER_III.get().getDescriptionId(), "Empty Tier III Capacitor"); - replace(provider, GTBlocks.BATTERY_LAPOTRONIC_EV.get().getDescriptionId(), "EV Lapotronic Capacitor"); - replace(provider, GTBlocks.BATTERY_LAPOTRONIC_IV.get().getDescriptionId(), "IV Lapotronic Capacitor"); - replace(provider, GTBlocks.BATTERY_LAPOTRONIC_LuV.get().getDescriptionId(), "LuV Lapotronic Capacitor"); - replace(provider, GTBlocks.BATTERY_LAPOTRONIC_ZPM.get().getDescriptionId(), "ZPM Lapotronic Capacitor"); - replace(provider, GTBlocks.BATTERY_LAPOTRONIC_UV.get().getDescriptionId(), "UV Lapotronic Capacitor"); - replace(provider, GTBlocks.BATTERY_ULTIMATE_UHV.get().getDescriptionId(), "UHV Ultimate Capacitor"); + provider.add(GTBlocks.BATTERY_LAPOTRONIC_EV.get().getDescriptionId(), "EV Lapotronic Capacitor"); + provider.add(GTBlocks.BATTERY_LAPOTRONIC_IV.get().getDescriptionId(), "IV Lapotronic Capacitor"); + provider.add(GTBlocks.BATTERY_LAPOTRONIC_LuV.get().getDescriptionId(), "LuV Lapotronic Capacitor"); + provider.add(GTBlocks.BATTERY_LAPOTRONIC_ZPM.get().getDescriptionId(), "ZPM Lapotronic Capacitor"); + provider.add(GTBlocks.BATTERY_LAPOTRONIC_UV.get().getDescriptionId(), "UV Lapotronic Capacitor"); + provider.add(GTBlocks.BATTERY_ULTIMATE_UHV.get().getDescriptionId(), "UHV Ultimate Capacitor"); // Casings - replace(provider, "block.gtceu.bronze_brick_casing", "Bricked Bronze Casing"); - replace(provider, "block.gtceu.steel_brick_casing", "Bricked Wrought Iron Casing"); - replace(provider, "block.gtceu.heatproof_machine_casing", "Heat Proof Invar Machine Casing"); - replace(provider, "block.gtceu.frostproof_machine_casing", "Frost Proof Aluminium Machine Casing"); - replace(provider, "block.gtceu.steel_machine_casing", "Solid Steel Machine Casing"); - replace(provider, "block.gtceu.clean_machine_casing", "Clean Stainless Steel Casing"); - replace(provider, "block.gtceu.stable_machine_casing", "Stable Titanium Machine Casing"); - replace(provider, "block.gtceu.robust_machine_casing", "Robust Tungstensteel Machine Casing"); - replace(provider, "block.gtceu.casing_coke_bricks", "Coke Oven Bricks"); - replace(provider, "block.gtceu.inert_machine_casing", "Chemically Inert PTFE Machine Casing"); - replace(provider, "block.gtceu.sturdy_machine_casing", "Sturdy HSS-E Machine Casing"); - replace(provider, "block.gtceu.casing_grate", "Grate Machine Casing"); - replace(provider, "block.gtceu.assembly_line_unit", "Assembly Control Casing"); - replace(provider, "block.gtceu.ptfe_pipe_casing", "PTFE Pipe Casing"); - replace(provider, "block.gtceu.palladium_substation", "Palladium Substation Casing"); + provider.add("block.gtceu.bronze_brick_casing", "Bricked Bronze Casing"); + provider.add("block.gtceu.steel_brick_casing", "Bricked Wrought Iron Casing"); + provider.add("block.gtceu.heatproof_machine_casing", "Heat Proof Invar Machine Casing"); + provider.add("block.gtceu.frostproof_machine_casing", "Frost Proof Aluminium Machine Casing"); + provider.add("block.gtceu.steel_machine_casing", "Solid Steel Machine Casing"); + provider.add("block.gtceu.clean_machine_casing", "Clean Stainless Steel Casing"); + provider.add("block.gtceu.stable_machine_casing", "Stable Titanium Machine Casing"); + provider.add("block.gtceu.robust_machine_casing", "Robust Tungstensteel Machine Casing"); + provider.add("block.gtceu.casing_coke_bricks", "Coke Oven Bricks"); + provider.add("block.gtceu.inert_machine_casing", "Chemically Inert PTFE Machine Casing"); + provider.add("block.gtceu.sturdy_machine_casing", "Sturdy HSS-E Machine Casing"); + provider.add("block.gtceu.casing_grate", "Grate Machine Casing"); + provider.add("block.gtceu.assembly_line_unit", "Assembly Control Casing"); + provider.add("block.gtceu.ptfe_pipe_casing", "PTFE Pipe Casing"); + provider.add("block.gtceu.palladium_substation", "Palladium Substation Casing"); // Gearboxes - replace(provider, "block.gtceu.bronze_gearbox", "Bronze Gearbox Casing"); - replace(provider, "block.gtceu.steel_gearbox", "Steel Gearbox Casing"); - replace(provider, "block.gtceu.stainless_steel_gearbox", "Stainless Steel Gearbox Casing"); - replace(provider, "block.gtceu.titanium_gearbox", "Titanium Gearbox Casing"); - replace(provider, "block.gtceu.tungstensteel_gearbox", "Tungstensteel Gearbox Casing"); + provider.add("block.gtceu.bronze_gearbox", "Bronze Gearbox Casing"); + provider.add("block.gtceu.steel_gearbox", "Steel Gearbox Casing"); + provider.add("block.gtceu.stainless_steel_gearbox", "Stainless Steel Gearbox Casing"); + provider.add("block.gtceu.titanium_gearbox", "Titanium Gearbox Casing"); + provider.add("block.gtceu.tungstensteel_gearbox", "Tungstensteel Gearbox Casing"); // Turbine Casing - replace(provider, "block.gtceu.steel_turbine_casing", "Magnalium Turbine Casing"); - replace(provider, "block.gtceu.titanium_turbine_casing", "Titanium Turbine Casing"); - replace(provider, "block.gtceu.stainless_steel_turbine_casing", "Stainless Turbine Casing"); - replace(provider, "block.gtceu.tungstensteel_turbine_casing", "Tungstensteel Turbine Casing"); + provider.add("block.gtceu.steel_turbine_casing", "Magnalium Turbine Casing"); + provider.add("block.gtceu.titanium_turbine_casing", "Titanium Turbine Casing"); + provider.add("block.gtceu.stainless_steel_turbine_casing", "Stainless Turbine Casing"); + provider.add("block.gtceu.tungstensteel_turbine_casing", "Tungstensteel Turbine Casing"); // Pipe Casing - replace(provider, "block.gtceu.bronze_pipe_casing", "Bronze Pipe Casing"); - replace(provider, "block.gtceu.steel_pipe_casing", "Steel Pipe Casing"); - replace(provider, "block.gtceu.titanium_pipe_casing", "Titanium Pipe Casing"); - replace(provider, "block.gtceu.tungstensteel_pipe_casing", "Tungstensteel Pipe Casing"); + provider.add("block.gtceu.bronze_pipe_casing", "Bronze Pipe Casing"); + provider.add("block.gtceu.steel_pipe_casing", "Steel Pipe Casing"); + provider.add("block.gtceu.titanium_pipe_casing", "Titanium Pipe Casing"); + provider.add("block.gtceu.tungstensteel_pipe_casing", "Tungstensteel Pipe Casing"); // Bricked Casings - replace(provider, "block.gtceu.steam_casing_bronze", "Bronze Hull"); - replace(provider, "block.gtceu.steam_casing_bricked_bronze", "Bricked Bronze Hull"); - replace(provider, "block.gtceu.steam_casing_steel", "Steel Hull"); - replace(provider, "block.gtceu.steam_casing_bricked_steel", "Bricked Wrought Iron Hull"); + provider.add("block.gtceu.steam_casing_bronze", "Bronze Hull"); + provider.add("block.gtceu.steam_casing_bricked_bronze", "Bricked Bronze Hull"); + provider.add("block.gtceu.steam_casing_steel", "Steel Hull"); + provider.add("block.gtceu.steam_casing_bricked_steel", "Bricked Wrought Iron Hull"); // GCYM Casings - replace(provider, "block.gtceu.laser_safe_engraving_casing", "Laser-Safe Engraving Casing"); - replace(provider, "block.gtceu.large_scale_assembler_casing", "Large-Scale Assembler Casing"); - replace(provider, "block.gtceu.reaction_safe_mixing_casing", "Reaction-Safe Mixing Casing"); - replace(provider, "block.gtceu.vibration_safe_casing", "Vibration-Safe Casing"); + provider.add("block.gtceu.laser_safe_engraving_casing", "Laser-Safe Engraving Casing"); + provider.add("block.gtceu.large_scale_assembler_casing", "Large-Scale Assembler Casing"); + provider.add("block.gtceu.reaction_safe_mixing_casing", "Reaction-Safe Mixing Casing"); + provider.add("block.gtceu.vibration_safe_casing", "Vibration-Safe Casing"); // Fusion Casings - replace(provider, "block.gtceu.superconducting_coil", "Superconducting Coil Block"); - replace(provider, "block.gtceu.fusion_coil", "Fusion Coil Block"); - replace(provider, "block.gtceu.fusion_casing", "Fusion Machine Casing"); - replace(provider, "block.gtceu.fusion_casing_mk2", "Fusion Machine Casing MK II"); - replace(provider, "block.gtceu.fusion_casing_mk3", "Fusion Machine Casing MK III"); + provider.add("block.gtceu.superconducting_coil", "Superconducting Coil Block"); + provider.add("block.gtceu.fusion_coil", "Fusion Coil Block"); + provider.add("block.gtceu.fusion_casing", "Fusion Machine Casing"); + provider.add("block.gtceu.fusion_casing_mk2", "Fusion Machine Casing MK II"); + provider.add("block.gtceu.fusion_casing_mk3", "Fusion Machine Casing MK III"); provider.add("block.gtceu.explosive.breaking_tooltip", "Primes explosion when mined, sneak mine to pick back up"); @@ -94,10 +91,10 @@ private static void generateBlockKeys(RegistrateLangProvider provider) { provider.add("block.gtceu.itnt.drops_tooltip", "Much larger than TNT, drops all destroyed Blocks as Items"); // Decor Stuff - replace(provider, "block.gtceu.yellow_stripes_block_a", "Yellow Stripes Block"); - replace(provider, "block.gtceu.yellow_stripes_block_b", "Yellow Stripes Block"); - replace(provider, "block.gtceu.yellow_stripes_block_c", "Yellow Stripes Block"); - replace(provider, "block.gtceu.yellow_stripes_block_d", "Yellow Stripes Block"); + provider.add("block.gtceu.yellow_stripes_block_a", "Yellow Stripes Block"); + provider.add("block.gtceu.yellow_stripes_block_b", "Yellow Stripes Block"); + provider.add("block.gtceu.yellow_stripes_block_c", "Yellow Stripes Block"); + provider.add("block.gtceu.yellow_stripes_block_d", "Yellow Stripes Block"); // Extra stone blocks provider.add("block.gtceu.seal", "Sealed Block"); @@ -106,17 +103,17 @@ private static void generateBlockKeys(RegistrateLangProvider provider) { provider.add("block.surface_rock", "%s Surface Rock"); } - private static void generateBlockTooltips(RegistrateLangProvider provider) { + private static void generateBlockTooltips(GTLangProvider provider) { // Coil Tooltip - replace(provider, "block.gtceu.wire_coil.tooltip.extended_info", "§7Hold SHIFT to show Coil Bonus Info"); - replace(provider, "block.gtceu.wire_coil.tooltip.heat", "§cBase Heat Capacity: §f%d K"); - replace(provider, "block.gtceu.wire_coil.tooltip.smelter", "§8Multi Smelter:"); - replace(provider, "block.gtceu.wire_coil.tooltip.parallel_smelter", " §5Max Parallel: §f%s"); - replace(provider, "block.gtceu.wire_coil.tooltip.energy_smelter", " §aEnergy Usage: §f%s EU/t §8per recipe"); - replace(provider, "block.gtceu.wire_coil.tooltip.pyro", "§8Pyrolyse Oven:"); - replace(provider, "block.gtceu.wire_coil.tooltip.speed_pyro", " §bProcessing Speed: §f%s%%"); - replace(provider, "block.gtceu.wire_coil.tooltip.cracking", "§8Cracking Unit:"); - replace(provider, "block.gtceu.wire_coil.tooltip.energy_cracking", " §aEnergy Usage: §f%s%%"); + provider.add("block.gtceu.wire_coil.tooltip.extended_info", "§7Hold SHIFT to show Coil Bonus Info"); + provider.add("block.gtceu.wire_coil.tooltip.heat", "§cBase Heat Capacity: §f%d K"); + provider.add("block.gtceu.wire_coil.tooltip.smelter", "§8Multi Smelter:"); + provider.add("block.gtceu.wire_coil.tooltip.parallel_smelter", " §5Max Parallel: §f%s"); + provider.add("block.gtceu.wire_coil.tooltip.energy_smelter", " §aEnergy Usage: §f%s EU/t §8per recipe"); + provider.add("block.gtceu.wire_coil.tooltip.pyro", "§8Pyrolyse Oven:"); + provider.add("block.gtceu.wire_coil.tooltip.speed_pyro", " §bProcessing Speed: §f%s%%"); + provider.add("block.gtceu.wire_coil.tooltip.cracking", "§8Cracking Unit:"); + provider.add("block.gtceu.wire_coil.tooltip.energy_cracking", " §aEnergy Usage: §f%s%%"); // Substation Capacitors provider.add("block.gtceu.substation_capacitor.tooltip.empty", "§7For filling space in your Power Substation"); @@ -138,11 +135,11 @@ private static void generateBlockTooltips(RegistrateLangProvider provider) { provider.add("block.gtceu.lamp.tooltip.no_light", "No Light"); // Charcoal - multilineLang(provider, "block.gtceu.brittle_charcoal.tooltip", + provider.addMultiline("block.gtceu.brittle_charcoal.tooltip", "Produced by the Charcoal Pile Igniter.\nMine this to get Charcoal."); } - private static void generatePipeKeys(RegistrateLangProvider provider) { + private static void generatePipeKeys(GTLangProvider provider) { // Cables provider.add("tooltip.gtceu.cable.voltage", "§aMax Voltage:§r §a%d §a(%s§a)"); provider.add("tooltip.gtceu.cable.amperage", "§eMax Amperage:§r §e%d"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java index a29191b4509..7854df822be 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java @@ -1,16 +1,14 @@ package com.gregtechceu.gtceu.data.lang; -import com.tterrag.registrate.providers.RegistrateLangProvider; - -import static com.gregtechceu.gtceu.data.lang.LangUtil.*; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTLangProvider; public class CommandLang { - public static void init(RegistrateLangProvider provider) { + public static void init(GTLangProvider provider) { generateCommandLang(provider); } - private static void generateCommandLang(RegistrateLangProvider provider) { + private static void generateCommandLang(GTLangProvider provider) { provider.add("command.gtceu.dump_data.success", "Dumped %s resources from registry %s to %s"); // Prospection Commands diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java index 08d3b6e81ac..6699feee7fe 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java @@ -1,36 +1,30 @@ package com.gregtechceu.gtceu.data.lang; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTLangProvider; -import com.tterrag.registrate.providers.RegistrateLangProvider; import dev.toma.configuration.Configuration; -import dev.toma.configuration.config.format.ConfigFormats; -import dev.toma.configuration.config.value.ConfigValue; -import dev.toma.configuration.config.value.ObjectValue; +import dev.toma.configuration.config.value.IConfigValue; +import dev.toma.configuration.config.value.IHierarchical; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import static com.gregtechceu.gtceu.data.lang.LangUtil.*; +import java.util.*; public class ConfigurationLang { - public static void init(RegistrateLangProvider provider) { - recurseGenerateConfigLang(provider, new HashSet<>(), - Configuration.registerConfig(ConfigHolder.class, ConfigFormats.yaml()).getValueMap(), ""); + public static void init(GTLangProvider provider) { + recurseGenerateConfigLang(provider, Configuration.getConfig(GTCEu.MOD_ID).get().values()); } - private static void recurseGenerateConfigLang(RegistrateLangProvider provider, Set added, - Map> map, String parentKey) { - for (var entry : map.entrySet()) { - var id = entry.getValue().getId(); - if (added.add(id)) { - provider.add(String.format("config.%s.option%s.%s", GTCEu.MOD_ID, parentKey, id), id); - } - if (entry.getValue() instanceof ObjectValue objectValue) { - recurseGenerateConfigLang(provider, added, objectValue.get(), "." + id); + private static void recurseGenerateConfigLang(GTLangProvider provider, + Collection> values) { + for (var entry : values) { + provider.add("config.gtceu.option." + entry.getPath(), entry.getId()); + if (entry instanceof IHierarchical hierarchical) { + var children = hierarchical.getChildrenKeys().stream() + .map(hierarchical::getChildById) + .filter(Objects::nonNull) + .toList(); + recurseGenerateConfigLang(provider, children); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/CoverLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/CoverLang.java index 0b86cf5473c..d554e48ffac 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/CoverLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/CoverLang.java @@ -1,16 +1,14 @@ package com.gregtechceu.gtceu.data.lang; -import com.tterrag.registrate.providers.RegistrateLangProvider; - -import static com.gregtechceu.gtceu.data.lang.LangUtil.*; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTLangProvider; public class CoverLang { - public static void init(RegistrateLangProvider provider) { + public static void init(GTLangProvider provider) { generateCoverKeys(provider); } - private static void generateCoverKeys(RegistrateLangProvider provider) { + private static void generateCoverKeys(GTLangProvider provider) { // todo uses provider.add("cover.filter.blacklist.disabled", "Whitelist"); provider.add("cover.filter.blacklist.enabled", "Blacklist"); @@ -23,7 +21,7 @@ private static void generateCoverKeys(RegistrateLangProvider provider) { // Tag filter // todo: use these??? provider.add("cover.tag_filter.title", "Tag Filter"); - multilineLang(provider, "cover.gtceu.tag_filter.info", + provider.addMultiline("cover.gtceu.tag_filter.info", """ §bAccepts complex expressions §6a & b§r = AND @@ -44,7 +42,7 @@ private static void generateCoverKeys(RegistrateLangProvider provider) { // Fluid filter provider.add("cover.fluid_filter.title", "Fluid Filter"); - multilineLang(provider, "cover.fluid_filter.config_amount", + provider.addMultiline("cover.fluid_filter.config_amount", "Scroll wheel up increases amount, down decreases.\nShift[§6x10§r],Ctrl[§ex100§r],Shift+Ctrl[§ax1000§r]\nRight click increases amount, left click decreases.\nHold shift to double/halve.\nMiddle click to clear"); provider.add("cover.fluid_filter.mode.filter_fill", "Filter Fill"); provider.add("cover.fluid_filter.mode.filter_drain", "Filter Drain"); @@ -64,7 +62,7 @@ private static void generateCoverKeys(RegistrateLangProvider provider) { provider.add("cover.item_smart_filter.filtering_mode.electrolyzer", "Electrolyzer"); provider.add("cover.item_smart_filter.filtering_mode.centrifuge", "Centrifuge"); provider.add("cover.item_smart_filter.filtering_mode.sifter", "Sifter"); - multilineLang(provider, "cover.item_smart_filter.filtering_mode.description", + provider.addMultiline("cover.item_smart_filter.filtering_mode.description", "Select Machine this Smart Filter will use for filtering.\nIt will automatically pick right portions of items for robotic arm."); // Storage Cover @@ -73,7 +71,7 @@ private static void generateCoverKeys(RegistrateLangProvider provider) { // Voiding provider.add("cover.voiding.voiding_mode.void_any", "Void Matching"); provider.add("cover.voiding.voiding_mode.void_overflow", "Void Overflow"); - multilineLang(provider, "cover.voiding.voiding_mode.description", + provider.addMultiline("cover.voiding.voiding_mode.description", "§eVoid Matching§r will void anything matching the filter. \n§eVoid Overflow§r will void anything matching the filter, up to the specified amount."); provider.add("cover.fluid.voiding.title", "Fluid Voiding Settings"); provider.add("cover.fluid.voiding.advanced.title", "Advanced Fluid Voiding Settings"); @@ -92,15 +90,15 @@ private static void generateCoverKeys(RegistrateLangProvider provider) { provider.add("cover.conveyor.mode", "Mode: %s"); provider.add("cover.conveyor.mode.export", "Mode: Export"); provider.add("cover.conveyor.mode.import", "Mode: Import"); - multilineLang(provider, "cover.conveyor.distribution.round_robin_global", + provider.addMultiline("cover.conveyor.distribution.round_robin_global", "Distribution Mode: §bRound Robin\n§7Splits items equally across connected inventories"); - multilineLang(provider, "cover.conveyor.distribution.round_robin_prio", + provider.addMultiline("cover.conveyor.distribution.round_robin_prio", "Distribution Mode: §bRound Robin with Priority\n§7Tries to split items across connected inventories and considers higher priorities first.\n§7Restrictive item pipes lower the priority of a path."); - multilineLang(provider, "cover.conveyor.distribution.insert_first", + provider.addMultiline("cover.conveyor.distribution.insert_first", "Distribution Mode: §bPriority\n§7Will insert into the first inventory with the highest priority it can find.\n§7Restrictive item pipes lower the priority of a path."); - multilineLang(provider, "cover.conveyor.blocks_input.enabled", + provider.addMultiline("cover.conveyor.blocks_input.enabled", "If enabled, items will not be inserted when cover is set to pull items from the inventory into pipe.\n§aEnabled"); - multilineLang(provider, "cover.conveyor.blocks_input.disabled", + provider.addMultiline("cover.conveyor.blocks_input.disabled", "If enabled, items will not be inserted when cover is set to pull items from the inventory into pipe.\n§cDisabled"); // Common cover key entries @@ -110,10 +108,10 @@ private static void generateCoverKeys(RegistrateLangProvider provider) { "Manual I/O: §bFiltered\n§7Items / Fluids can be extracted and inserted independently of the cover mode, as long as its filter matches (if any)"); provider.add("cover.universal.manual_import_export.mode.unfiltered", "Manual I/O: §bUnfiltered\n§7Items / Fluids can be moved independently of the cover mode. The filter only applies to what is inserted or extracted by this cover itself."); - multilineLang(provider, "cover.universal.manual_import_export.mode.description", + provider.addMultiline("cover.universal.manual_import_export.mode.description", "§eDisabled§r - Items/fluids will only move as specified by the cover and its filter. \n§eAllow Filtered§r - Items/fluids can be extracted and inserted independently of the cover mode, as long as its filter matches (if any). \n§eAllow Unfiltered§r - Items/fluids can be moved independently of the cover mode. Filter applies to the items inserted or extracted by this cover"); provider.add("cover.conveyor.item_filter.title", "Item Filter"); - multiLang(provider, "cover.conveyor.tag.title", "Tag Name", + provider.addMultiLang("cover.conveyor.tag.title", "Tag Name", "(use * for wildcard)"); // Robot arm @@ -121,7 +119,7 @@ private static void generateCoverKeys(RegistrateLangProvider provider) { provider.add("cover.robotic_arm.transfer_mode.transfer_any", "Transfer Any"); provider.add("cover.robotic_arm.transfer_mode.transfer_exact", "Supply Exact"); provider.add("cover.robotic_arm.transfer_mode.keep_exact", "Keep Exact"); - multilineLang(provider, "cover.robotic_arm.transfer_mode.description", + provider.addMultiline("cover.robotic_arm.transfer_mode.description", "§eTransfer Any§r - in this mode, cover will transfer as many items matching its filter as possible.\n§eSupply Exact§r - in this mode, cover will supply items in portions specified in item filter slots (or variable under this button for tag filter). If amount of items is less than portion size, items won't be moved.\n§eKeep Exact§r - in this mode, cover will keep specified amount of items in the destination inventory, supplying additional amount of items if required.\n§7Tip: left/right click on filter slots to change item amount, use shift clicking to change amount faster."); // Pump @@ -135,7 +133,7 @@ private static void generateCoverKeys(RegistrateLangProvider provider) { // Fluid regulator provider.add("cover.fluid_regulator.title", "Fluid Regulator Settings (%s)"); - multilineLang(provider, "cover.fluid_regulator.transfer_mode.description", + provider.addMultiline("cover.fluid_regulator.transfer_mode.description", "§eTransfer Any§r - in this mode, cover will transfer as many fluids matching its filter as possible.\n§eSupply Exact§r - in this mode, cover will supply fluids in portions specified in the window underneath this button. If amount of fluids is less than portion size, fluids won't be moved.\n§eKeep Exact§r - in this mode, cover will keep specified amount of fluids in the destination inventory, supplying additional amount of fluids if required.\n§7Tip: shift click will multiply increase/decrease amounts by 10 and ctrl click will multiply by 100."); provider.add("cover.fluid_regulator.supply_exact", "Supply Exact: %s"); provider.add("cover.fluid_regulator.keep_exact", "Keep Exact: %s"); @@ -144,9 +142,9 @@ private static void generateCoverKeys(RegistrateLangProvider provider) { provider.add("cover.machine_controller.title", "Machine Controller Settings"); provider.add("cover.machine_controller.normal", "Normal"); provider.add("cover.machine_controller.inverted", "Inverted"); - multilineLang(provider, "cover.machine_controller.invert.enabled", + provider.addMultiline("cover.machine_controller.invert.enabled", "§eInverted§r - in this mode, the cover will require a signal stronger than the set redstone level to run"); - multilineLang(provider, "cover.machine_controller.invert.disabled", + provider.addMultiline("cover.machine_controller.invert.disabled", "§eNormal§r - in this mode, the cover will require a signal weaker than the set redstone level to run"); provider.add("cover.machine_controller.redstone", "Min Redstone Strength: %d"); provider.add("cover.machine_controller.mode.machine", "Control Machine"); @@ -166,10 +164,10 @@ private static void generateCoverKeys(RegistrateLangProvider provider) { provider.add("cover.ender_fluid_link.tooltip.channel_name", "Set channel name with input text"); provider.add("cover.ender_fluid_link.tooltip.list_button", "Show channel list"); provider.add("cover.ender_fluid_link.tooltip.clear_button", "Clear channel description"); - multilineLang(provider, "cover.ender_fluid_link.private.tooltip.disabled", + provider.addMultiline("cover.ender_fluid_link.private.tooltip.disabled", "Switch to private tank mode\nPrivate mode uses the player who originally placed the cover"); provider.add("cover.ender_fluid_link.private.tooltip.enabled", "Switch to public tank mode"); - multilineLang(provider, "cover.ender_fluid_link.incomplete_hex", + provider.addMultiline("cover.ender_fluid_link.incomplete_hex", "Inputted color is incomplete!\nIt will be applied once complete (all 8 hex digits)\nClosing the gui will lose edits!"); // Detector @@ -180,9 +178,9 @@ private static void generateCoverKeys(RegistrateLangProvider provider) { Change the redstone behavior of this Cover. §eContinuous§7 - Default; values less than the minimum output 0; values higher than the maximum output 15; values between min and max output between 0 and 15 §eLatched§7 - output 15 until above max, then output 0 until below min"""; - multilineLang(provider, "cover.advanced_detector.latch.enabled", + provider.addMultiline("cover.advanced_detector.latch.enabled", "Behavior: Latched\n\n" + detectorLatchDescription); - multilineLang(provider, "cover.advanced_detector.latch.disabled", + provider.addMultiline("cover.advanced_detector.latch.disabled", "Behavior: Continuous\n\n" + detectorLatchDescription); // Energy Detector @@ -197,14 +195,14 @@ private static void generateCoverKeys(RegistrateLangProvider provider) { provider.add("cover.advanced_energy_detector.max", "Max"); var advancedEnergyDetectorInvertDescription = "Toggle to invert the redstone logic\nBy default, redstone is emitted when less than the minimum EU, and stops emitting when greater than the max EU"; - multilineLang(provider, "cover.advanced_energy_detector.invert.enabled", + provider.addMultiline("cover.advanced_energy_detector.invert.enabled", "Output: Inverted\n\n" + advancedEnergyDetectorInvertDescription); - multilineLang(provider, "cover.advanced_energy_detector.invert.disabled", + provider.addMultiline("cover.advanced_energy_detector.invert.disabled", "Output: Normal\n\n" + advancedEnergyDetectorInvertDescription); var advancedEnergyDetectorModeDescription = "Change between using discrete EU values or percentages for comparing min/max against an attached energy storage."; - multilineLang(provider, "cover.advanced_energy_detector.use_percent.enabled", + provider.addMultiline("cover.advanced_energy_detector.use_percent.enabled", "Mode: Percentage\n\n" + advancedEnergyDetectorModeDescription); - multilineLang(provider, "cover.advanced_energy_detector.use_percent.disabled", + provider.addMultiline("cover.advanced_energy_detector.use_percent.disabled", "Mode: Discrete EU\n\n" + advancedEnergyDetectorModeDescription); // Fluid detector @@ -216,9 +214,9 @@ private static void generateCoverKeys(RegistrateLangProvider provider) { // Advanced fluid detector provider.add("cover.advanced_fluid_detector.label", "Advanced Fluid Detector"); var advancedFluidDetectorInvertDescription = "Toggle to invert the redstone logic\nBy default, redstone stops emitting when less than the minimum mB of fluid, and starts emitting when greater than the min mB of fluid up to the set maximum"; - multilineLang(provider, "cover.advanced_fluid_detector.invert.enabled", + provider.addMultiline("cover.advanced_fluid_detector.invert.enabled", "Output: Inverted\n\n" + advancedFluidDetectorInvertDescription); - multilineLang(provider, "cover.advanced_fluid_detector.invert.disabled", + provider.addMultiline("cover.advanced_fluid_detector.invert.disabled", "Output: Normal\n\n" + advancedFluidDetectorInvertDescription); provider.add("cover.advanced_fluid_detector.max", "Max Fluid (mB)"); provider.add("cover.advanced_fluid_detector.min", "Min Fluid (mB)"); @@ -231,9 +229,9 @@ private static void generateCoverKeys(RegistrateLangProvider provider) { // Advanced item detector provider.add("cover.advanced_item_detector.label", "Advanced Item Detector"); var advancedItemDetectorInvertDescription = "Toggle to invert the redstone logic\nBy default, redstone stops emitting when less than the minimum amount of items, and starts emitting when greater than the min amount of items up to the set maximum"; - multilineLang(provider, "cover.advanced_item_detector.invert.enabled", + provider.addMultiline("cover.advanced_item_detector.invert.enabled", "Output: Inverted\n\n" + advancedItemDetectorInvertDescription); - multilineLang(provider, "cover.advanced_item_detector.invert.disabled", + provider.addMultiline("cover.advanced_item_detector.invert.disabled", "Output: Normal\n\n" + advancedItemDetectorInvertDescription); provider.add("cover.advanced_item_detector.max", "Max Items"); provider.add("cover.advanced_item_detector.min", "Min Items"); @@ -265,7 +263,7 @@ private static void generateCoverKeys(RegistrateLangProvider provider) { provider.add("item.cover.digital.mode.fluid.enabled", "Fluid Mode enabled"); // Digital wireless cover - multiLang(provider, "item.cover.digital.wireless.tooltip", + provider.addMultiLang("item.cover.digital.wireless.tooltip", "§fWirelessly§7 connects machines to the §fCentral Monitor§7 as §fCover§7.", "§fRight Click§7 on the §fCentral Monitor§7 to remotely bind to it.", "§fSneak Right Click§7 to remove the current binding.", diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/GUILang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/GUILang.java index d2876856940..3610285d22c 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/GUILang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/GUILang.java @@ -1,20 +1,17 @@ package com.gregtechceu.gtceu.data.lang; -import com.tterrag.registrate.providers.RegistrateLangProvider; - -import static com.gregtechceu.gtceu.data.lang.LangUtil.multiLang; -import static com.gregtechceu.gtceu.data.lang.LangUtil.multilineLang; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTLangProvider; public class GUILang { - public static void init(RegistrateLangProvider provider) { + public static void init(GTLangProvider provider) { generateKeybindKeys(provider); generateWidgetKeys(provider); generateTooltipKeys(provider); generateLDLibKeys(provider); } - private static void generateLDLibKeys(RegistrateLangProvider provider) { + private static void generateLDLibKeys(GTLangProvider provider) { provider.add("gtceu.gui.editor.tips.citation", "Number of citations"); provider.add("gtceu.gui.editor.group.recipe_type", "cap"); provider.add("ldlib.gui.editor.register.editor.gtceu.rtui", "RecipeType UI Project"); @@ -27,7 +24,7 @@ private static void generateLDLibKeys(RegistrateLangProvider provider) { provider.add("ldlib.gui.editor.register.widget.container.gtm_phantom_fluid_slot", "GTM Phantom Fluid Slot"); } - private static void generateKeybindKeys(RegistrateLangProvider provider) { + private static void generateKeybindKeys(GTLangProvider provider) { provider.add("gtceu.key.armor_mode_switch", "Armor Mode Switch"); provider.add("gtceu.key.armor_hover", "Armor Hover Toggle"); provider.add("gtceu.key.enable_jetpack", "Enable Jetpack"); @@ -38,7 +35,7 @@ private static void generateKeybindKeys(RegistrateLangProvider provider) { "GregTech has modified the debug info! For Developers: enable the misc:debug config option in the GregTech config file to see more"); } - private static void generateTooltipKeys(RegistrateLangProvider provider) { + private static void generateTooltipKeys(GTLangProvider provider) { // Part Sharing provider.add("gtceu.part_sharing.disabled", "Multiblock Sharing §4Disabled"); provider.add("gtceu.part_sharing.enabled", "Multiblock Sharing §aEnabled"); @@ -65,6 +62,9 @@ private static void generateTooltipKeys(RegistrateLangProvider provider) { provider.add("gtceu.universal.tooltip.energy_storage_capacity", "§cEnergy Capacity: §r%d EU"); provider.add("gtceu.universal.tooltip.energy_tier_range", "§aAllowed Voltage Tiers: §f%s §f- %s"); + provider.add("gtceu.gui.seconds", "%s second(s)"); + provider.add("gtceu.gui.years", "%s year(s)"); + // Item Storage/Transfer provider.add("gtceu.universal.tooltip.item_storage_capacity", "§6Item Slots: §f%d"); provider.add("gtceu.universal.tooltip.item_storage_total", "§6Item Capacity: §f%d items"); @@ -135,7 +135,7 @@ private static void generateTooltipKeys(RegistrateLangProvider provider) { provider.add("gtceu.direction.tooltip.front", "Front"); } - private static void generateWidgetKeys(RegistrateLangProvider provider) { + private static void generateWidgetKeys(GTLangProvider provider) { // General UI Keys provider.add("gtceu.gui.title_bar.back", "Back"); provider.add("gtceu.gui.title_bar.page_switcher", "Pages"); @@ -146,9 +146,9 @@ private static void generateWidgetKeys(RegistrateLangProvider provider) { provider.add("gtceu.gui.toggle_view.disabled", "Toggle View (Fluids)"); provider.add("gtceu.gui.toggle_view.enabled", "Toggle View (Items)"); - multilineLang(provider, "gtceu.gui.overclock.enabled", "Overclocking Enabled.\nClick to Disable"); - multilineLang(provider, "gtceu.gui.overclock.disabled", "Overclocking Disabled.\nClick to Enable"); - multilineLang(provider, "gtceu.gui.overclock.description", + provider.addMultiline("gtceu.gui.overclock.enabled", "Overclocking Enabled.\nClick to Disable"); + provider.addMultiline("gtceu.gui.overclock.disabled", "Overclocking Disabled.\nClick to Enable"); + provider.addMultiline("gtceu.gui.overclock.description", "Overclock Button\n§7Recipes can overclock up to the set tier"); provider.add("gtceu.gui.overclock.off", "X"); @@ -164,9 +164,9 @@ private static void generateWidgetKeys(RegistrateLangProvider provider) { provider.add("gtceu.gui.item_auto_input.tooltip.enabled", "Item Auto-Input Enabled"); provider.add("gtceu.gui.item_auto_input.tooltip.disabled", "Item Auto-Input Disabled"); - multilineLang(provider, "gtceu.gui.charger_slot.tooltip", + provider.addMultiline("gtceu.gui.charger_slot.tooltip", "§fCharger Slot§r\n§7Draws power from %s batteries§r\n§7Charges %s tools and batteries"); - multilineLang(provider, "gtceu.gui.configurator_slot.tooltip", + provider.addMultiline("gtceu.gui.configurator_slot.tooltip", "§fConfigurator Slot§r\n§7Place a §6Programmed Circuit§7 in this slot to\n§7change its configured value.\n§7Hold §6Shift§7 when clicking buttons to change by §65.\n§aA Programmed Circuit in this slot is also valid for recipe inputs.§r"); provider.add("gtceu.gui.fluid_lock.tooltip.enabled", "Fluid Locking Enabled"); @@ -182,24 +182,24 @@ private static void generateWidgetKeys(RegistrateLangProvider provider) { provider.add("gtceu.gui.item_voiding_partial.tooltip.disabled", "Item Voiding Disabled"); // Miner GUI - multilineLang(provider, "gtceu.gui.silktouch.enabled", + provider.addMultiline("gtceu.gui.silktouch.enabled", "Silk Touch Enabled: Click to Disable.\n§7Switching requires an idle machine."); - multilineLang(provider, "gtceu.gui.silktouch.disabled", + provider.addMultiline("gtceu.gui.silktouch.disabled", "Silk Touch Disabled: Click to Enable.\n§7Switching requires an idle machine."); - multilineLang(provider, "gtceu.gui.chunkmode.enabled", + provider.addMultiline("gtceu.gui.chunkmode.enabled", "Chunk Mode Enabled: Click to Disable.\n§7Switching requires an idle machine."); - multilineLang(provider, "gtceu.gui.chunkmode.disabled", + provider.addMultiline("gtceu.gui.chunkmode.disabled", "Chunk Mode Disabled: Click to Enable.\n§7Switching requires an idle machine."); // Recipe Capability Voiding - multilineLang(provider, "gtceu.gui.multiblock_item_voiding", "Voiding Mode\n§7Voiding §6Items"); - multilineLang(provider, "gtceu.gui.multiblock_fluid_voiding", "Voiding Mode\n§7Voiding §9Fluids"); - multilineLang(provider, "gtceu.gui.multiblock_item_fluid_voiding", + provider.addMultiline("gtceu.gui.multiblock_item_voiding", "Voiding Mode\n§7Voiding §6Items"); + provider.addMultiline("gtceu.gui.multiblock_fluid_voiding", "Voiding Mode\n§7Voiding §9Fluids"); + provider.addMultiline("gtceu.gui.multiblock_item_fluid_voiding", "Voiding Mode\n§7Voiding §6Items §7and §9Fluids"); - multilineLang(provider, "gtceu.gui.multiblock_no_voiding", "Voiding Mode\n§7Voiding Nothing"); + provider.addMultiline("gtceu.gui.multiblock_no_voiding", "Voiding Mode\n§7Voiding Nothing"); // Fisher - multilineLang(provider, "gtceu.gui.fisher_mode.tooltip", + provider.addMultiline("gtceu.gui.fisher_mode.tooltip", "Toggle junk items\nOff costs 2 string per operation"); // Multiblock Page @@ -219,7 +219,7 @@ private static void generateWidgetKeys(RegistrateLangProvider provider) { provider.add("gtceu.gui.cover_setting.title", "Cover Settings"); provider.add("gtceu.gui.output_setting.title", "Output Settings"); provider.add("gtceu.gui.circuit.title", "Circuit Settings"); - multiLang(provider, "gtceu.gui.output_setting.tooltips", "left-click to tune the item auto output", + provider.addMultiLang("gtceu.gui.output_setting.tooltips", "left-click to tune the item auto output", "right-click to tune the fluid auto output."); provider.add("gtceu.gui.item_auto_output.allow_input.enabled", "allow items input from the output side"); @@ -244,7 +244,7 @@ private static void generateWidgetKeys(RegistrateLangProvider provider) { provider.add("gtceu.gui.content.units.per_second", "/s"); // Recipe Logic - multiLang(provider, "gtceu.oc.tooltip", "Min: %s", "Left click to increase the OC", + provider.addMultiLang("gtceu.oc.tooltip", "Min: %s", "Left click to increase the OC", "Right click to decrease the OC", "Middle click to reset the OC", "Hold Shift to change by Perfect OC"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java index 400f5897cf8..680be3327c4 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java @@ -1,16 +1,14 @@ package com.gregtechceu.gtceu.data.lang; -import com.tterrag.registrate.providers.RegistrateLangProvider; - -import static com.gregtechceu.gtceu.data.lang.LangUtil.*; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTLangProvider; public class HazardLang { - public static void init(RegistrateLangProvider provider) { + public static void init(GTLangProvider provider) { generateHazardKeys(provider); } - private static void generateHazardKeys(RegistrateLangProvider provider) { + private static void generateHazardKeys(GTLangProvider provider) { // Medical Conditions provider.add("gtceu.medical_condition.description", "§l§cHAZARDOUS §7Hold Shift to show details"); provider.add("gtceu.medical_condition.description_shift", "§l§cHAZARDOUS:"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java index cb8b51646b7..be2b34eea96 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java @@ -3,16 +3,14 @@ import com.gregtechceu.gtceu.api.data.worldgen.GTOreDefinition; import com.gregtechceu.gtceu.api.data.worldgen.bedrockfluid.BedrockFluidDefinition; import com.gregtechceu.gtceu.api.registry.GTRegistries; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTLangProvider; import com.gregtechceu.gtceu.common.data.GTBedrockFluids; import com.gregtechceu.gtceu.common.data.GTOres; - -import com.tterrag.registrate.providers.RegistrateLangProvider; - -import static com.gregtechceu.gtceu.data.lang.LangUtil.*; +import com.gregtechceu.gtceu.utils.FormattingUtil; public class IntegrationLang { - public static void init(RegistrateLangProvider provider) { + public static void init(GTLangProvider provider) { initRecipeViewerLang(provider); initWailaLikeLang(provider); initMinimapLang(provider); @@ -23,7 +21,7 @@ public static void init(RegistrateLangProvider provider) { } /** JEI, REI, EMI */ - private static void initRecipeViewerLang(RegistrateLangProvider provider) { + private static void initRecipeViewerLang(GTLangProvider provider) { provider.add("gtceu.jei.multiblock_info", "Multiblock Info"); provider.add("gtceu.jei.ore_processing_diagram", "Ore Processing Diagram"); @@ -42,13 +40,13 @@ private static void initRecipeViewerLang(RegistrateLangProvider provider) { provider.add("gtceu.jei.ore_vein_diagram.weight", "Weight: %s"); provider.add("gtceu.jei.ore_vein_diagram.dimensions", "Dimensions:"); - multiLang(provider, "gtceu.jei.ore.primary", "Top Ore", + provider.addMultiLang("gtceu.jei.ore.primary", "Top Ore", "Spawns in the top %d layers of the vein"); - multiLang(provider, "gtceu.jei.ore.secondary", "Bottom Ore", + provider.addMultiLang("gtceu.jei.ore.secondary", "Bottom Ore", "Spawns in the bottom %d layers of the vein"); - multiLang(provider, "gtceu.jei.ore.between", "Between Ore", + provider.addMultiLang("gtceu.jei.ore.between", "Between Ore", "Spawns in the middle %d layers of the vein, with other ores"); - multiLang(provider, "gtceu.jei.ore.sporadic", "Sporadic Ore", + provider.addMultiLang("gtceu.jei.ore.sporadic", "Sporadic Ore", "Spawns anywhere in the vein"); provider.add("gtceu.jei.ore.biome_weighting_title", "§dModified Biome Total Weights:"); @@ -57,7 +55,7 @@ private static void initRecipeViewerLang(RegistrateLangProvider provider) { provider.add("gtceu.jei.ore.ore_weight", "Weight in vein: %d%%"); // Surface Rock - multiLang(provider, "gtceu.jei.ore.surface_rock", + provider.addMultiLang("gtceu.jei.ore.surface_rock", "Surface Rocks with this material denote vein spawn locations.", "They can be broken for 3 Tiny Piles of the dust, with Fortune giving a bonus."); @@ -90,13 +88,13 @@ private static void initRecipeViewerLang(RegistrateLangProvider provider) { GTOres.init(); for (GTOreDefinition oreDefinition : GTRegistries.ORE_VEINS) { String name = GTRegistries.ORE_VEINS.getKey(oreDefinition).getPath(); - provider.add("gtceu.jei.ore_vein." + name, RegistrateLangProvider.toEnglishName(name)); + provider.add("gtceu.jei.ore_vein." + name, FormattingUtil.toEnglishName(name)); } GTRegistries.BEDROCK_FLUID_DEFINITIONS.unfreeze(); GTBedrockFluids.init(); for (BedrockFluidDefinition fluid : GTRegistries.BEDROCK_FLUID_DEFINITIONS) { String name = GTRegistries.BEDROCK_FLUID_DEFINITIONS.getKey(fluid).getPath(); - provider.add("gtceu.jei.bedrock_fluid." + name, RegistrateLangProvider.toEnglishName(name)); + provider.add("gtceu.jei.bedrock_fluid." + name, FormattingUtil.toEnglishName(name)); } // Potion @@ -104,7 +102,7 @@ private static void initRecipeViewerLang(RegistrateLangProvider provider) { } /** Jade, TheOneProbe, WTHIT */ - private static void initWailaLikeLang(RegistrateLangProvider provider) { + private static void initWailaLikeLang(GTLangProvider provider) { provider.add("gtceu.top.working_disabled", "Working Disabled"); provider.add("gtceu.top.energy_consumption", "Using"); provider.add("gtceu.top.energy_production", "Producing"); @@ -214,7 +212,7 @@ private static void initWailaLikeLang(RegistrateLangProvider provider) { provider.add("config.jade.plugin_gtceu.energy_converter_provider", "[GTCEu] Energy Converter Mode"); } - private static void initMinimapLang(RegistrateLangProvider provider) { + private static void initMinimapLang(GTLangProvider provider) { // Tooltip/Name provider.add("gtceu.minimap.ore_vein.depleted", "Depleted"); @@ -237,7 +235,7 @@ private static void initMinimapLang(RegistrateLangProvider provider) { provider.add("gtceu.button.show_depleted", "Show Depleted Veins"); } - private static void initOwnershipLang(RegistrateLangProvider provider) { + private static void initOwnershipLang(GTLangProvider provider) { // Team Names provider.add("gtceu.ownership.name.player", "Player"); provider.add("gtceu.ownership.name.ftb", "FTB Teams"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java index c56c66d9241..30d4fe89c3c 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java @@ -2,15 +2,13 @@ import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.item.tool.GTToolType; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTLangProvider; -import com.tterrag.registrate.providers.RegistrateLangProvider; - -import static com.gregtechceu.gtceu.data.lang.LangUtil.*; import static com.gregtechceu.gtceu.utils.FormattingUtil.toEnglishName; public class ItemLang { - public static void init(RegistrateLangProvider provider) { + public static void init(GTLangProvider provider) { initGeneratedNames(provider); initItemNames(provider); initItemTooltips(provider); @@ -19,7 +17,7 @@ public static void init(RegistrateLangProvider provider) { provider.add("item.invalid.name", "Invalid item"); } - private static void initGeneratedNames(RegistrateLangProvider provider) { + private static void initGeneratedNames(GTLangProvider provider) { // All TagPrefixes for (TagPrefix tagPrefix : TagPrefix.values()) { provider.add(tagPrefix.getUnlocalizedName(), tagPrefix.langValue); @@ -214,11 +212,11 @@ private static void initGeneratedNames(RegistrateLangProvider provider) { provider.add("item.gtceu.iridium_metal_residue_dust", "Iridium Metal Residue"); } - private static void initItemNames(RegistrateLangProvider provider) { - replace(provider, "item.gtceu.tungsten_steel_fluid_cell", "%s Tungstensteel Cell"); + private static void initItemNames(GTLangProvider provider) { + provider.add("item.gtceu.tungsten_steel_fluid_cell", "%s Tungstensteel Cell"); } - private static void initItemTooltips(RegistrateLangProvider provider) { + private static void initItemTooltips(GTLangProvider provider) { // Nano Saber provider.add("item.gtceu.nano_saber.tooltip", "§7Ryujin no ken wo kurae!"); @@ -290,10 +288,7 @@ private static void initItemTooltips(RegistrateLangProvider provider) { // Battery Behavior provider.add("item.gtceu.battery.charge_time", "§aHolds %s %s of Power (%s)"); - provider.add("item.gtceu.battery.charge_detailed", "%s/%s EU§7 - Tier %s §7(%s/%s %s remaining§7)"); - provider.add("item.gtceu.battery.charge_unit.second", "seconds"); - provider.add("item.gtceu.battery.charge_unit.minute", "minutes"); - provider.add("item.gtceu.battery.charge_unit.hour", "hours"); + provider.add("item.gtceu.battery.charge_detailed", "%s/%s EU§7 - Tier %s §7(%s/%s remaining§7)"); // Rechargeable Batteries provider.add("item.gtceu.ulv_tantalum_battery.tooltip", "§7Reusable Battery"); @@ -331,11 +326,11 @@ private static void initItemTooltips(RegistrateLangProvider provider) { provider.add("item.gtceu.data_orb.tooltip", "§7A High Capacity Data Storage"); // Programmed Circuit - multilineLang(provider, "item.gtceu.programmed_circuit.tooltip", + provider.addMultiline("item.gtceu.programmed_circuit.tooltip", "Use to open configuration GUI\nShift-Right-Click on a machine\nwith a circuit slot to set it to\nthis circuit's value."); provider.add("item.gtceu.circuit.integrated.gui", "§7Programmed Circuit Configuration"); provider.add("item.int_circuit.configuration", "Configuration: %d"); - // multilineLang(provider, "item.gtceu.circuit.integrated.jei_description", "JEI is only showing recipes for the + // provider.addMultiline("item.gtceu.circuit.integrated.jei_description", "JEI is only showing recipes for the // given configuration.\n\nYou can select a configuration in the Programmed Circuit configuration tab."); // Boules @@ -367,7 +362,7 @@ private static void initItemTooltips(RegistrateLangProvider provider) { provider.add("item.gtceu.wetware_printed_circuit_board.tooltip", "§7The Board that keeps life"); // Circuit Components - multilineLang(provider, "item.gtceu.vacuum_tube.tooltip", "§7Technically a Diode\n§cULV-Tier"); + provider.addMultiline("item.gtceu.vacuum_tube.tooltip", "§7Technically a Diode\n§cULV-Tier"); provider.add("item.gtceu.diode.tooltip", "§7Basic Electronic Component"); provider.add("item.gtceu.resistor.tooltip", "§7Basic Electronic Component"); provider.add("item.gtceu.transistor.tooltip", "§7Basic Electronic Component"); @@ -428,61 +423,61 @@ private static void initItemTooltips(RegistrateLangProvider provider) { provider.add("item.gtceu.simple_soc.tooltip", "§7Simple System on Chip"); // Circuits - multilineLang(provider, "item.gtceu.basic_electronic_circuit.tooltip", + provider.addMultiline("item.gtceu.basic_electronic_circuit.tooltip", "§7Your First Circuit\n§cLV-Tier Circuit"); - multilineLang(provider, "item.gtceu.good_electronic_circuit.tooltip", + provider.addMultiline("item.gtceu.good_electronic_circuit.tooltip", "§7Your Second Circuit\n§cMV-Tier Circuit"); - multilineLang(provider, "item.gtceu.basic_integrated_circuit.tooltip", + provider.addMultiline("item.gtceu.basic_integrated_circuit.tooltip", "§7Smaller and more powerful\n§6LV-Tier Circuit"); - multilineLang(provider, "item.gtceu.good_integrated_circuit.tooltip", + provider.addMultiline("item.gtceu.good_integrated_circuit.tooltip", "§7Smaller and more powerful\n§6MV-Tier Circuit"); - multilineLang(provider, "item.gtceu.advanced_integrated_circuit.tooltip", + provider.addMultiline("item.gtceu.advanced_integrated_circuit.tooltip", "§7Smaller and more powerful\n§6HV-Tier Circuit"); - multilineLang(provider, "item.gtceu.nand_chip.tooltip", "§7A Superior Simple Circuit\n§6ULV-Tier Circuit"); - multilineLang(provider, "item.gtceu.microchip_processor.tooltip", + provider.addMultiline("item.gtceu.nand_chip.tooltip", "§7A Superior Simple Circuit\n§6ULV-Tier Circuit"); + provider.addMultiline("item.gtceu.microchip_processor.tooltip", "§7A Superior Basic Circuit\n§eLV-Tier Circuit"); - multilineLang(provider, "item.gtceu.micro_processor.tooltip", + provider.addMultiline("item.gtceu.micro_processor.tooltip", "§7Amazing Computation Speed!\n§eMV-Tier Circuit"); - multilineLang(provider, "item.gtceu.micro_processor_assembly.tooltip", + provider.addMultiline("item.gtceu.micro_processor_assembly.tooltip", "§7Amazing Computation Speed!\n§eHV-Tier Circuit"); - multilineLang(provider, "item.gtceu.micro_processor_computer.tooltip", + provider.addMultiline("item.gtceu.micro_processor_computer.tooltip", "§7Amazing Computation Speed!\n§eEV-Tier Circuit"); - multilineLang(provider, "item.gtceu.micro_processor_mainframe.tooltip", + provider.addMultiline("item.gtceu.micro_processor_mainframe.tooltip", "§7Amazing Computation Speed!\n§eIV-Tier Circuit"); - multilineLang(provider, "item.gtceu.nano_processor.tooltip", "§7Smaller than ever\n§bHV-Tier Circuit"); - multilineLang(provider, "item.gtceu.nano_processor_assembly.tooltip", "§7Smaller than ever\n§bEV-Tier Circuit"); - multilineLang(provider, "item.gtceu.nano_processor_computer.tooltip", "§7Smaller than ever\n§bIV-Tier Circuit"); - multilineLang(provider, "item.gtceu.nano_processor_mainframe.tooltip", + provider.addMultiline("item.gtceu.nano_processor.tooltip", "§7Smaller than ever\n§bHV-Tier Circuit"); + provider.addMultiline("item.gtceu.nano_processor_assembly.tooltip", "§7Smaller than ever\n§bEV-Tier Circuit"); + provider.addMultiline("item.gtceu.nano_processor_computer.tooltip", "§7Smaller than ever\n§bIV-Tier Circuit"); + provider.addMultiline("item.gtceu.nano_processor_mainframe.tooltip", "§7Smaller than ever\n§bLuV-Tier Circuit"); - multilineLang(provider, "item.gtceu.quantum_processor.tooltip", + provider.addMultiline("item.gtceu.quantum_processor.tooltip", "§7Quantum Computing comes to life!\n§aEV-Tier Circuit"); - multilineLang(provider, "item.gtceu.quantum_processor_assembly.tooltip", + provider.addMultiline("item.gtceu.quantum_processor_assembly.tooltip", "§7Quantum Computing comes to life!\n§aIV-Tier Circuit"); - multilineLang(provider, "item.gtceu.quantum_processor_computer.tooltip", + provider.addMultiline("item.gtceu.quantum_processor_computer.tooltip", "§7Quantum Computing comes to life!\n§aLuV-Tier Circuit"); - multilineLang(provider, "item.gtceu.quantum_processor_mainframe.tooltip", + provider.addMultiline("item.gtceu.quantum_processor_mainframe.tooltip", "§7Quantum Computing comes to life!\n§aZPM-Tier Circuit"); - multilineLang(provider, "item.gtceu.crystal_processor.tooltip", + provider.addMultiline("item.gtceu.crystal_processor.tooltip", "§7Taking Advantage of Crystal Engraving\n§9IV-Tier Circuit"); - multilineLang(provider, "item.gtceu.crystal_processor_assembly.tooltip", + provider.addMultiline("item.gtceu.crystal_processor_assembly.tooltip", "§7Taking Advantage of Crystal Engraving\n§9LuV-Tier Circuit"); - multilineLang(provider, "item.gtceu.crystal_processor_computer.tooltip", + provider.addMultiline("item.gtceu.crystal_processor_computer.tooltip", "§7Taking Advantage of Crystal Engraving\n§9ZPM-Tier Circuit"); - multilineLang(provider, "item.gtceu.crystal_processor_mainframe.tooltip", + provider.addMultiline("item.gtceu.crystal_processor_mainframe.tooltip", "§7Taking Advantage of Crystal Engraving\n§9UV-Tier Circuit"); - multilineLang(provider, "item.gtceu.wetware_processor.tooltip", + provider.addMultiline("item.gtceu.wetware_processor.tooltip", "§7You have a feeling like it's watching you\n§4LuV-Tier Circuit"); - multilineLang(provider, "item.gtceu.wetware_processor_assembly.tooltip", + provider.addMultiline("item.gtceu.wetware_processor_assembly.tooltip", "§7Can run Minecraft\n§4ZPM-Tier Circuit"); - multilineLang(provider, "item.gtceu.wetware_processor_computer.tooltip", + provider.addMultiline("item.gtceu.wetware_processor_computer.tooltip", "§7Ultimate fusion of Flesh and Machine\n§4UV-Tier Circuit"); - multilineLang(provider, "item.gtceu.wetware_processor_mainframe.tooltip", + provider.addMultiline("item.gtceu.wetware_processor_mainframe.tooltip", "§7The best Man has ever seen\n§4UHV-Tier Circuit"); // Stars @@ -491,17 +486,17 @@ private static void initItemTooltips(RegistrateLangProvider provider) { provider.add("item.gtceu.gravi_star.tooltip", "§7Ultimate Nether Star"); // Filters - multilineLang(provider, "item.gtceu.item_filter.tooltip", + provider.addMultiline("item.gtceu.item_filter.tooltip", "§7Filters §fItem§7 I/O as §fCover§7.\nCan be used as a §fConveyor Module§7 and §fRobotic Arm§7 upgrade."); - multilineLang(provider, "item.gtceu.item_tag_filter.tooltip", + provider.addMultiline("item.gtceu.item_tag_filter.tooltip", "§7Filters §fItem§7 I/O with §fItem Tags§7 as §fCover§7.\nCan be used as a §fConveyor Module§7 and §fRobotic Arm§7 upgrade."); - multilineLang(provider, "item.gtceu.tag_filter.tooltip", + provider.addMultiline("item.gtceu.tag_filter.tooltip", "§7Filters §fItem§7 I/O with §fTag§7 as §fCover§7.\nCan be used as a §fConveyor Module§7 and §fRobotic Arm§7 upgrade."); - multilineLang(provider, "item.gtceu.fluid_filter.tooltip", + provider.addMultiline("item.gtceu.fluid_filter.tooltip", "§7Filters §fFluid§7 I/O as §fCover§7.\nCan be used as an §fElectric Pump§7 and §fFluid Regulator§7 upgrade."); - multilineLang(provider, "item.gtceu.fluid_tag_filter.tooltip", + provider.addMultiline("item.gtceu.fluid_tag_filter.tooltip", "§7Filters §fFluid§7 I/O with §fFluid Tags§7 as §fCover§7.\nCan be used as an §fElectric Pump§7 and §fFluid Regulator§7 upgrade."); - multilineLang(provider, "item.gtceu.item_smart_filter.tooltip", + provider.addMultiline("item.gtceu.item_smart_filter.tooltip", "§7Filters §fItem§7 I/O with §fMachine Recipes§7 as §fCover§7.\nCan be used as a §fConveyor Module§7 and §fRobotic Arm§7 upgrade."); provider.add("item.gtceu.machine_controller.tooltip", "§7Turns Machines §fON/OFF§7 as §fCover§7."); provider.add("item.gtceu.activity_detector_cover.tooltip", @@ -519,20 +514,20 @@ private static void initItemTooltips(RegistrateLangProvider provider) { "§7Gives out §fEnergy Amount§7 as Redstone as §fCover§7."); provider.add("item.gtceu.advanced_energy_detector_cover.tooltip", "§7Gives §fRS-Latch§7 controlled §fEnergy Status§7 as Redstone as §fCover§7."); - multilineLang(provider, "item.gtceu.fluid_voiding_cover.tooltip", + provider.addMultiline("item.gtceu.fluid_voiding_cover.tooltip", "§7Voids §fFluids§7 as §fCover§7.\nActivate with §fSoft Mallet§7 after placement."); - multilineLang(provider, "item.gtceu.advanced_fluid_voiding_cover.tooltip", + provider.addMultiline("item.gtceu.advanced_fluid_voiding_cover.tooltip", "§7Voids §fFluids§7 with amount control as §fCover§7.\nActivate with §fSoft Mallet§7 after placement."); - multilineLang(provider, "item.gtceu.item_voiding_cover.tooltip", + provider.addMultiline("item.gtceu.item_voiding_cover.tooltip", "§7Voids §fItems§7 as §fCover§7.\nActivate with §fSoft Mallet§7 after placement."); - multilineLang(provider, "item.gtceu.advanced_item_voiding_cover.tooltip", + provider.addMultiline("item.gtceu.advanced_item_voiding_cover.tooltip", "§7Voids §fItems§7 with amount control as §fCover§7.\nActivate with §fSoft Mallet§7 after placement."); - multilineLang(provider, "item.gtceu.facade_cover.tooltip", + provider.addMultiline("item.gtceu.facade_cover.tooltip", "§7Decorative Outfit §fCover§7.\n§7Crafted using 3 Iron Plates and any block"); provider.add("item.gtceu.computer_monitor_cover.tooltip", "§7Displays §fData§7 as §fCover§7."); provider.add("item.gtceu.shutter_module_cover.tooltip", "§fBlocks Transfer§7 through attached Side as §fCover§7."); - multilineLang(provider, "item.gtceu.solar_panel.tooltip", + provider.addMultiline("item.gtceu.solar_panel.tooltip", "§7May the Sun be with you.\nProduces §fEnergy§7 from the §eSun§7 as §fCover§7."); provider.add("item.gtceu.infinite_water_cover.tooltip", "§7Fills attached containers with §9Water§7 as §fCover§7."); @@ -543,7 +538,7 @@ private static void initItemTooltips(RegistrateLangProvider provider) { provider.add("item.gtceu.gelled_toluene.tooltip", "§7Raw Explosive"); provider.add("item.gtceu.bottle.purple.drink.tooltip", "§7How about Lemonade. Or some Ice Tea? I got Purple Drink!"); - multilineLang(provider, "item.gtceu.foam_sprayer.tooltip", + provider.addMultiline("item.gtceu.foam_sprayer.tooltip", "§7Sprays Construction Foam\nUse on a frame to foam connected frames\nFoam can be colored"); provider.add("item.gtceu.firebrick.tooltip", "§7Heat resistant"); @@ -604,7 +599,7 @@ private static void initItemTooltips(RegistrateLangProvider provider) { provider.add("item.electric.discharge_mode.tooltip", "Use while sneaking to toggle discharge mode"); } - public static void generateBehaviorKeys(RegistrateLangProvider provider) { + public static void generateBehaviorKeys(GTLangProvider provider) { // Item Behaviors provider.add("behaviour.hoe", "Can till dirt"); provider.add("behaviour.soft_hammer", "Activates and Deactivates Machines"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java index adb27fb8f78..ad42eff98dc 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -1,8 +1,6 @@ package com.gregtechceu.gtceu.data.lang; -import com.tterrag.registrate.providers.RegistrateLangProvider; - -import static com.gregtechceu.gtceu.data.lang.LangUtil.*; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTLangProvider; public class LangHandler { @@ -22,7 +20,7 @@ public class LangHandler { * */ - public static void init(RegistrateLangProvider provider) { + public static void init(GTLangProvider provider) { AdvancementLang.init(provider); ArmorLang.init(provider); BlockLang.init(provider); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangUtil.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangUtil.java index 3dd1e295790..182e9ead847 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangUtil.java @@ -3,187 +3,131 @@ import net.minecraft.locale.Language; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; -import net.minecraftforge.common.data.LanguageProvider; -import com.tterrag.registrate.providers.RegistrateLangProvider; -import org.jetbrains.annotations.NotNull; - -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; -import java.util.Map; import java.util.stream.Collectors; +import java.util.stream.Stream; public class LangUtil { /** * Returns the sub-key consisting of the given key plus the given index.
- * E.g.,
- * - *
-     * getSubKey("terminal.fluid_prospector.tier", 0)
-     * 
- * - * returns the String: - * - *
-     * 
-     * "terminal.fluid_prospector.tier.0"
-     * 
+ * E.g., {@code getSubKey("terminal.fluid_prospector.tier", 0)} returns the string
+ * {@code "terminal.fluid_prospector.tier.0"} * * @param key Base key of the sub-key. - * @param index Index of the sub-key. - * @return Sub-key consisting of key and index. + * @param index Index of the sub-key + * @return Sub-key consisting of key and index */ protected static String getSubKey(String key, int index) { return key + "." + index; } - /** - * Registers multiple values under the same key with a given provider.
- *
- * For example, a cumbersome way to add translations would be the following:
- * - *
-     * provider.add("terminal.fluid_prospector.tier.0", "radius size 1");
-     * provider.add("terminal.fluid_prospector.tier.1", "radius size 2");
-     * provider.add("terminal.fluid_prospector.tier.2", "radius size 3");
-     * 
- * - * Instead, multiLang can be used for the same result: - * - *
-     * multiLang(provider, "terminal.fluid_prospector.tier", "radius size 1", "radius size 2", "radius size 3");
-     * 
- * - * In situations requiring a large number of generated translations, the - * following could be used instead, which - * generates translations for 100 tiers: - * - *
-     * multiLang(provider, "terminal.fluid_prospector.tier", IntStream.of(100)
-     *                 .map(i -> i + 1)
-     *                 .mapToObj(Integer::toString)
-     *                 .map(i -> "radius size " + i)
-     *                 .toArray(String[]::new));
-     * 
- * - * @param provider The provider to add to. - * @param key Base key of the key-value-pairs. The real key for each - * translation will be appended by ".0" for - * the first, ".1" for the second, etc. This ensures that the - * keys are unique. - * @param values All translation values. - */ - protected static void multiLang(RegistrateLangProvider provider, String key, String... values) { - for (var i = 0; i < values.length; i++) { - provider.add(getSubKey(key, i), values[i]); + protected static Stream getMultiLangKeys(String key) { + var output = new ArrayList(); + var i = 0; + var next = getSubKey(key, i); + while (Language.getInstance().has(next)) { + output.add(next); + next = getSubKey(key, ++i); } + return output.stream(); } /** - * Gets all translation components from a multi lang's sub-keys.
- * E.g., given a multi lang: - * - *
-     * multiLang(provider, "terminal.fluid_prospector.tier", "radius size 1", "radius size 2", "radius size 3");
-     * 
- * + * Gets all translation strings from a multi lang's sub-keys.
+ * E.g., given a multi lang + * {@code provider.addMultiLang("terminal.fluid_prospector.tier", "radius size 1", "radius size 2", "radius size 3");},
* The following code can be used to print out the translations: - * - *
-     * for (var component : getMultiLang("terminal.fluid_prospector.tier")) {
+     * 
 {@code
+     * for (var component : getMultiLang("terminal.fluid_prospector.tier")) {
      *     System.out.println(component.getString());
-     * }
-     * 
- * - * Result: - * - *
-     * radius size 1
+     * }
+     * } 
+ * And the output would be: + *
 {@code
+     * radius size 1
      * radius size 2
-     * radius size 3
-     * 
+ * radius size 3 + * }
* - * @param key Base key of the multi lang. E.g. "terminal.fluid_prospector.tier". + * @param key Base key of the multi lang. E.g. {@code "terminal.fluid_prospector.tier"} * @return Returns all translation components from a multi lang's sub-keys */ - public static List getMultiLang(String key) { - var outputKeys = new ArrayList(); - var i = 0; - var next = getSubKey(key, i); - while (Language.getInstance().has(next)) { - outputKeys.add(next); - next = getSubKey(key, ++i); - } - return outputKeys.stream().map(Component::translatable).collect(Collectors.toList()); + public static Component[] getMultiLang(String key) { + return getListMultiLang(key).toArray(Component[]::new); } /** - * Gets all translation components from a multi lang's sub-keys. Supports - * additional arguments for the translation - * components.
- * E.g., given a multi lang: - * - *
-     * multiLang(provider, "terminal.fluid_prospector.tier", "radius size 1", "radius size 2", "radius size 3");
-     * 
+ * A variation of {@link #getMultiLang(String)} that returns a list instead of an array. * + * @param key Base key of the multi lang. E.g. {@code "terminal.fluid_prospector.tier"} + * @return Returns all translation components from a multi lang's sub-keys + * @see #getMultiLang(String) + */ + public static List getListMultiLang(String key) { + return getMultiLangKeys(key).map(Component::translatable).collect(Collectors.toList()); + } + + /** + * Gets all translation strings from a multi lang's sub-keys.
+ * E.g., given a multi lang + * {@code provider.addMultiLang("terminal.fluid_prospector.info", "prospection radius %s", "Can prospect %s");},
* The following code can be used to print out the translations: - * - *
-     * for (var component : getMultiLang("terminal.fluid_prospector.tier")) {
+     * 
 {@code
+     * for (var component : getMultiLang("terminal.fluid_prospector.info", 5, "Ores")) {
      *     System.out.println(component.getString());
-     * }
-     * 
- * - * Result: - * - *
-     * radius size 1
-     * radius size 2
-     * radius size 3
-     * 
+ * } + * }
+ * And the output would be: + *
 {@code
+     * prospection radius 5
+     * Can prospect Ores
+     * } 
+ * + * @param key Base key of the multi lang. E.g. {@code "terminal.fluid_prospector.info"} + * @param args The arguments to pass to each {@link Component} of this multi lang + * @return Returns all translation components from a multi lang's sub-keys + */ + public static Component[] getMultiLang(String key, Object... args) { + return getMultiLangKeys(key).map(k -> Component.translatable(k, args)).toArray(Component[]::new); + } + + /** + * A variation of {@link #getMultiLang(String, Object...)} )} that returns a list instead of an array. * - * @param key Base key of the multi lang. E.g. "terminal.fluid_prospector.tier". - * @return Returns all translation components from a multi lang's sub-keys. + * @param key Base key of the multi lang. E.g. {@code "terminal.fluid_prospector.info"} + * @param args The arguments to pass to each {@link Component} of this multi lang + * @return Returns all translation components from a multi lang's sub-keys + * @see #getMultiLang(String, Object...) */ - public static List getMultiLang(String key, Object... args) { - var outputKeys = new ArrayList(); - var i = 0; - var next = getSubKey(key, i); - while (Language.getInstance().has(next)) { - outputKeys.add(next); - next = getSubKey(key, ++i); - } - return outputKeys.stream().map(k -> Component.translatable(k, args)).collect(Collectors.toList()); + public static List getListMultiLang(String key, Object... args) { + return getMultiLangKeys(key).map(k -> Component.translatable(k, args)).collect(Collectors.toList()); } /** - * See {@link #getMultiLang(String)}. If no multiline key is available, get - * single instead. + * Returns a multi lang if one is available, and if it isn't, gets a singular value instead. * - * @param key Base key of the multi lang. E.g. "terminal.fluid_prospector.tier". - * @return Returns all translation components from a multi lang's sub-keys. + * @param key Base key of the multi lang. E.g. {@code "terminal.fluid_prospector.tier"}. + * @return Returns all translation components from a multi lang's sub-keys + * @see #getMultiLang(String) */ - public static List getSingleOrMultiLang(String key) { - List multiLang = getMultiLang(key); + public static Component[] getSingleOrMultiLang(String key) { + Component[] multiLang = getMultiLang(key); - if (!multiLang.isEmpty()) { + if (multiLang.length > 0) { return multiLang; } - return List.of(Component.translatable(key)); + return new Component[] { Component.translatable(key) }; } /** * Gets a single translation from a multi lang. * - * @param key Base key of the multi lang. E.g. "gtceu.gui.overclock.enabled". - * @param index Index of the single translation. E.g. 3 would return - * "gtceu.gui.overclock.enabled.3". + * @param key Base key of the multi lang. E.g. {@code "gtceu.gui.overclock.enabled"} + * @param index Index of the single translation. E.g. 3 would return {@code "gtceu.gui.overclock.enabled.3"} * @return Returns a single translation from a multi lang. */ public static MutableComponent getFromMultiLang(String key, int index) { @@ -194,75 +138,12 @@ public static MutableComponent getFromMultiLang(String key, int index) { * Gets a single translation from a multi lang. Supports additional arguments * for the translation component. * - * @param key Base key of the multi lang. E.g. "gtceu.gui.overclock.enabled". - * @param index Index of the single translation. E.g. 3 would return - * "gtceu.gui.overclock.enabled.3". + * @param key Base key of the multi lang. E.g. {@code "gtceu.gui.overclock.enabled"} + * @param index Index of the single translation. E.g. 3 would return {@code "gtceu.gui.overclock.enabled.3"} + * @param args The arguments to pass to the component * @return Returns a single translation from a multi lang. */ public static MutableComponent getFromMultiLang(String key, int index, Object... args) { return Component.translatable(getSubKey(key, index), args); } - - /** - * Adds one key-value-pair to the given lang provider per line in the given - * multiline (a multiline is a String - * containing newline characters).
- * Example: - * - *
-     * multilineLang(provider, "gtceu.gui.overclock.enabled", "Overclocking Enabled.\nClick to Disable");
-     * 
- * - * This results in the following translations:
- * - *
-     * "gtceu.gui.overclock.enabled.0": "Overclocking Enabled.",
-     * "gtceu.gui.overclock.enabled.1": "Click to Disable",
-     * 
- * - * @param provider The provider to add to. - * @param key Base key of the key-value-pair. The real key for each line - * will be appended by ".0" for the - * first line, ".1" for the second, etc. This ensures that the - * keys are unique. - * @param multiline The multiline string. It is a multiline because it contains - * at least one newline character '\n'. - */ - protected static void multilineLang(RegistrateLangProvider provider, String key, String multiline) { - var lines = multiline.split("\n"); - multiLang(provider, key, lines); - } - - /** - * Replace a value in a language provider's mappings - * - * @param provider the provider whose mappings should be modified - * @param key the key for the value - * @param value the value to use in place of the old one - */ - public static void replace(@NotNull RegistrateLangProvider provider, @NotNull String key, - @NotNull String value) { - try { - // the regular lang mappings - Field field = LanguageProvider.class.getDeclaredField("data"); - field.setAccessible(true); - // noinspection unchecked - Map map = (Map) field.get(provider); - map.put(key, value); - - // upside-down lang mappings - Field upsideDownField = RegistrateLangProvider.class.getDeclaredField("upsideDown"); - upsideDownField.setAccessible(true); - // noinspection unchecked - map = (Map) field.get(upsideDownField.get(provider)); - - Method toUpsideDown = RegistrateLangProvider.class.getDeclaredMethod("toUpsideDown", - String.class); - toUpsideDown.setAccessible(true); - - map.put(key, (String) toUpsideDown.invoke(provider, value)); - } catch (NoSuchFieldException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - throw new RuntimeException("Error replacing entry in datagen.", e); - } - } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java index bcd1e5cf449..33f82343517 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java @@ -1,12 +1,11 @@ package com.gregtechceu.gtceu.data.lang; -import com.tterrag.registrate.providers.RegistrateLangProvider; - -import static com.gregtechceu.gtceu.data.lang.LangUtil.*; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTLangProvider; +import net.minecraft.ChatFormatting; public class MachineLang { - public static void init(RegistrateLangProvider provider) { + public static void init(GTLangProvider provider) { generateSteamMachines(provider); generateGeneralMachineTooltips(provider); @@ -21,9 +20,8 @@ public static void init(RegistrateLangProvider provider) { generateMultiblockKeys(provider); } - public static void standardTooltips(RegistrateLangProvider provider, String root, String machine, - String lowTier, - String midTier, String highTier) { + public static void standardTooltips(GTLangProvider provider, String root, String machine, + String lowTier, String midTier, String highTier) { makeElectricMachineTooltipULVtoMAX(provider, root, machine, lowTier, lowTier, lowTier, lowTier, lowTier, midTier, midTier, midTier, @@ -31,7 +29,7 @@ public static void standardTooltips(RegistrateLangProvider provider, String root highTier, highTier, highTier); } - private static void generateSteamMachines(RegistrateLangProvider provider) { + private static void generateSteamMachines(GTLangProvider provider) { makeSteamMachineTooltip(provider, "gtceu", "steam_solid_boiler", "An early way to get Steam Power", "Faster than the Small Steam Solid Fuel Boiler"); makeSteamMachineTooltip(provider, "gtceu", "steam_solar_boiler", @@ -56,11 +54,11 @@ private static void generateSteamMachines(RegistrateLangProvider provider) { "Mines ores below the Miner!", "Mines ores below the Miner!"); // unused - replace(provider, "block.gtceu.steam_solid_boiler.bronze", "Small Steam Solid Boiler"); - replace(provider, "block.gtceu.steam_liquid_boiler.bronze", "Small Steam Liquid Boiler"); + provider.add("block.gtceu.steam_solid_boiler.bronze", "Small Steam Solid Boiler"); + provider.add("block.gtceu.steam_liquid_boiler.bronze", "Small Steam Liquid Boiler"); } - private static void generateGeneralMachineTooltips(RegistrateLangProvider provider) { + private static void generateGeneralMachineTooltips(GTLangProvider provider) { // General Machine Behavior provider.add("machine.gtceu.basic.input_from_output_side.allow", "Allow Input from Output Side: "); provider.add("machine.gtceu.basic.input_from_output_side.disallow", @@ -73,7 +71,7 @@ private static void generateGeneralMachineTooltips(RegistrateLangProvider provid /** * For Tooltips that are NOT in the form {@code mod.machine.tier_name.tooltip} */ - private static void generateCustomMachineTooltips(RegistrateLangProvider provider) { + private static void generateCustomMachineTooltips(GTLangProvider provider) { // Steam Boilers provider.add("machine.gtceu.boiler.info.heating.up", "§cHeating up§r%s"); provider.add("machine.gtceu.boiler.info.cooling.down", "§9Cooling down§r%s"); @@ -194,16 +192,16 @@ private static void generateCustomMachineTooltips(RegistrateLangProvider provide provider.add("gtceu.creative.activity.off", "Not active"); // Workbench - multilineLang(provider, "gtceu.machine.workbench.tooltip", + provider.addMultiline("gtceu.machine.workbench.tooltip", "Better than Forestry\nHas Item Storage, Tool Storage, pulls from adjacent Inventories, and saves Recipes."); provider.add("gtceu.machine.workbench.tab.workbench", "Crafting"); provider.add("gtceu.machine.workbench.tab.item_list", "Storage"); - multilineLang(provider, "gtceu.machine.workbench.storage_note", + provider.addMultiline("gtceu.machine.workbench.storage_note", "(Available items from connected\ninventories usable for crafting)"); provider.add("gtceu.item_list.item_stored", "§7Stored: %d"); provider.add("gtceu.machine.workbench.tab.crafting", "Crafting"); provider.add("gtceu.machine.workbench.tab.container", "Container"); - multilineLang(provider, "gtceu.recipe_memory_widget.tooltip", + provider.addMultiline("gtceu.recipe_memory_widget.tooltip", "§7Left click to automatically input this recipe into the crafting grid\n§7Shift click to lock/unlock this recipe"); // Safe @@ -215,7 +213,7 @@ private static void generateCustomMachineTooltips(RegistrateLangProvider provide provider.add("machine.gtceu.drum.disable_output", "Will not drain Fluid"); // Long Distance Pipeline - multiLang(provider, "gtceu.machine.endpoint.tooltip", + provider.addMultiLang("gtceu.machine.endpoint.tooltip", "Connect with §fLong Distance Pipe§7 blocks to create a pipeline.", "Pipelines must have exactly §f1 Input§7 and §f1 Output§7 endpoint.", "Only pipeline endpoints need to be §fchunk-loaded§7."); @@ -229,7 +227,7 @@ private static void generateCustomMachineTooltips(RegistrateLangProvider provide provider.add("gtceu.machine.endpoint.tooltip.min_length", "§bMinimum Endpoint Distance: §f%d Blocks"); } - private static void generateCustomPerTierMachineTooltips(RegistrateLangProvider provider) { + private static void generateCustomPerTierMachineTooltips(GTLangProvider provider) { // Macerator provider.add("machine.gtceu.lv_macerator.tooltip", "§7Shredding your Ores without Byproducts"); provider.add("machine.gtceu.mv_macerator.tooltip", "§7Shredding your Ores without Byproducts"); @@ -589,20 +587,20 @@ private static void generateCustomPerTierMachineTooltips(RegistrateLangProvider provider.add("machine.gtceu.opv_rock_crusher.tooltip", "§7Volcanic Formation Chamber"); } - private static void generateGeneralMultiblockTooltips(RegistrateLangProvider provider) { + private static void generateGeneralMultiblockTooltips(GTLangProvider provider) { provider.add("gtceu.multiblock.dimension", "§eDimensions: §r%sx%sx%s"); provider.add("gtceu.machine.parallel_limit", "Can run up to §b%d§r§7 Recipes at once."); } - private static void generateCustomMultiblockTooltips(RegistrateLangProvider provider) { + private static void generateCustomMultiblockTooltips(GTLangProvider provider) { // Primitive Water Pump provider.add("machine.gtceu.primitive_pump.tooltip", "Endervoir at Home"); provider.add("gtceu.multiblock.primitive_water_pump.description", "The Primitive Water Pump is a pre-Steam Era multiblock that collects water once per second, depending on the Biome it is in. It can use a Pump, ULV, or LV Output Hatch, increasing the amount of water per tier. Follows the formula: Biome Coefficient * Hatch Multiplier."); - multilineLang(provider, "gtceu.multiblock.primitive_water_pump.extra1", + provider.addMultiline("gtceu.multiblock.primitive_water_pump.extra1", "Biome Coefficient:\n Ocean, River: 1000 mB/s\n Swamp: 800 mB/s\n Jungle: 350 mB/s\n Snowy: 300 mB/s\n Plains, Forest: 250 mB/s\n Taiga: 175 mB/s\n Beach: 170 mB/s\n Other: 100 mB/s"); - multilineLang(provider, "gtceu.multiblock.primitive_water_pump.extra2", + provider.addMultiline("gtceu.multiblock.primitive_water_pump.extra2", "Hatch Multipliers:\n Pump Hatch: 1x\n ULV Output Hatch: 2x\n LV Output Hatch: 4x\n\nWhile raining in the Pump's Biome, the total water production will be increased by 50%%."); // Primitive Blast Furnace @@ -613,7 +611,7 @@ private static void generateCustomMultiblockTooltips(RegistrateLangProvider prov // Electric Blast Furnace provider.add("machine.gtceu.electric_blast_furnace.tooltip", "Where's the electric smoker?"); provider.add("gtceu.multiblock.blast_furnace.max_temperature", "Heat Capacity: %s"); - multiLang(provider, "machine.gtceu.electric_blast_furnace.tooltip", + provider.addMultiLang("machine.gtceu.electric_blast_furnace.tooltip", "For every §f900K§7 above the recipe temperature, a multiplicative §f95%%§7 energy multiplier is applied pre-overclocking.", "For every §f1800K§7 above the recipe temperature, one overclock becomes §f100%% efficient§7 (perfect overclock).", "For every voltage tier above §bMV§7, temperature is increased by §f100K§7."); @@ -742,9 +740,9 @@ private static void generateCustomMultiblockTooltips(RegistrateLangProvider prov provider.add("gtceu.multiblock.large_combustion_engine.obstructed", "Engine Intakes Obstructed."); // Turbines - replace(provider, "block.gtceu.steam_large_turbine", "Large Steam Turbine"); - replace(provider, "block.gtceu.gas_large_turbine", "Large Gas Turbine"); - replace(provider, "block.gtceu.plasma_large_turbine", "Large Plasma Turbine"); + provider.add("block.gtceu.steam_large_turbine", "Large Steam Turbine"); + provider.add("block.gtceu.gas_large_turbine", "Large Gas Turbine"); + provider.add("block.gtceu.plasma_large_turbine", "Large Plasma Turbine"); provider.add("gtceu.machine.large_turbine.steam.tooltip", "Do not put your Head in it"); provider.add("gtceu.machine.large_turbine.gas.tooltip", "Not a Jet Engine"); provider.add("gtceu.machine.large_turbine.plasma.tooltip", "Plasma Energy Siphon"); @@ -831,7 +829,7 @@ private static void generateCustomMultiblockTooltips(RegistrateLangProvider prov // Cleanroom provider.add("gtceu.machine.cleanroom.tooltip", "Keeping those pesky particles out"); - multiLang(provider, "gtceu.machine.cleanroom.tooltip", + provider.addMultiLang("gtceu.machine.cleanroom.tooltip", "Place machines inside to run cleanroom recipes.", "Uses §f30 EU/t§7 when dirty, §f4 EU/t§7 when clean.", "Overclocking increases cleaning per cycle.", @@ -849,11 +847,11 @@ private static void generateCustomMultiblockTooltips(RegistrateLangProvider prov provider.add("gtceu.multiblock.cleanroom.clean_state", "Status: §aCLEAN"); provider.add("gtceu.multiblock.cleanroom.dirty_state", "Status: §4CONTAMINATED"); provider.add("gtceu.multiblock.cleanroom.clean_amount", "Cleanliness: §a%s%%"); - multilineLang(provider, "gtceu.multiblock.dimensions", "Dimensions: \n" + - " §c§lWidth§r: %s, §a§lHeight§r: %s, §9§lDepth§r: %s "); + provider.addMultiline("gtceu.multiblock.dimensions", "Dimensions: \n" + + " §c§lWidth§r: %s, §a§lHeight§r: %s, §9§lDepth§r: %s "); // Power Substation - multiLang(provider, "gtceu.machine.power_substation.tooltip", + provider.addMultiLang("gtceu.machine.power_substation.tooltip", "The heart of a centralized power grid", "§fCapacitors§7 do not need to be all the same tier.", "Allows up to §f%d Capacitor Layers§7.", @@ -872,17 +870,12 @@ private static void generateCustomMultiblockTooltips(RegistrateLangProvider prov "The average extracted EU out of the Power Substation's internal energy bank"); provider.add("gtceu.multiblock.power_substation.time_to_fill", "§7Time to fill: %s"); provider.add("gtceu.multiblock.power_substation.time_to_drain", "§7Time to drain: %s"); - provider.add("gtceu.multiblock.power_substation.time_seconds", "%s Seconds"); - provider.add("gtceu.multiblock.power_substation.time_minutes", "%s Minutes"); - provider.add("gtceu.multiblock.power_substation.time_hours", "%s Hours"); - provider.add("gtceu.multiblock.power_substation.time_days", "%s Days"); - provider.add("gtceu.multiblock.power_substation.time_years", "%s Years"); provider.add("gtceu.multiblock.power_substation.time_forever", "Forever"); provider.add("gtceu.multiblock.power_substation.under_one_hour_left", "Less than 1 hour until fully drained!"); // Active Transformer - multiLang(provider, "gtceu.machine.active_transformer.tooltip", + provider.addMultiLang("gtceu.machine.active_transformer.tooltip", "§7Transformers: Lasers in Disguise", "§7Can combine any number of Energy §fInputs§7 into any number of Energy §fOutputs§7.", "§7Can transmit power at incredible distance with", @@ -895,27 +888,31 @@ private static void generateCustomMultiblockTooltips(RegistrateLangProvider prov // Charcoal Pile Ignitor provider.add("gtceu.machine.charcoal_pile.tooltip", "Underground fuel bakery"); - multiLang(provider, "gtceu.machine.charcoal_pile.tooltip", + provider.addMultiLang("gtceu.machine.charcoal_pile.tooltip", "Turns Logs into §aCharcoal§7 when §cignited§7.", "Right Click with fire-starting items to start.", "Pyrolysis occurs in up to a §b9x4x9§7 space beneath.", "Logs must be not be exposed to §eAir§7!"); - multilineLang(provider, "gtceu.multiblock.charcoal_pile.description", - "Converts logs into Brittle Charcoal in a 9x4x9 area beneath it.\n\n" + - "The floor of the pit must be made from bricks, and any ground-related block can be used for the walls and roof.\n" + - "No air can be inside the pit.\n\nLarger pits take more time to process logs, but are more efficient."); + provider.addMultiline("gtceu.multiblock.charcoal_pile.description", + """ + Converts logs into Brittle Charcoal in a 9x4x9 area beneath it. + + The floor of the pit must be made from bricks, and any ground-related block can be used for the walls and roof. + No air can be inside the pit. + + Larger pits take more time to process logs, but are more efficient."""); // Central Monitor provider.add("gtceu.multiblock.central_monitor.low_power", "Low Power"); provider.add("gtceu.multiblock.central_monitor.height", "Screen Height:"); provider.add("gtceu.multiblock.central_monitor.width", "Screen Width: %d"); provider.add("gtceu.multiblock.central_monitor.height_modify", "Modify Height: %d"); - multiLang(provider, "gtceu.multiblock.central_monitor.tooltip", + provider.addMultiLang("gtceu.multiblock.central_monitor.tooltip", "This is a machine that monitors machines proxied by the Digital Interface Cover. You can easily monitor the Fluids, Items, Energy, and States of machines proxied in Energy Network.", "You can build the central monitor screen from 3X2 to %dX%d (width X height).", "The default height is 3. You can adjust the screen height in the GUI before the structure is formed.", "Energy consumption: %d EU/s for each screen."); - multiLang(provider, "gtceu.multiblock.monitor_screen.tooltip", + provider.addMultiLang("gtceu.multiblock.monitor_screen.tooltip", "The GUI can be opened with a right-click of a screwdriver.", "The proxy mode of Digital Interface Cover can delegate machines' capabilities and GUI. (Yes, you can connect pipes directly on the screen.)", "The screen also supports plugins."); @@ -926,7 +923,7 @@ private static void generateCustomMultiblockTooltips(RegistrateLangProvider prov provider.add("gtceu.machine.advanced_processing_array.tooltip", "Parallelize the World"); // Research Station - multiLang(provider, "gtceu.machine.research_station.tooltip", + provider.addMultiLang("gtceu.machine.research_station.tooltip", "More than just a Multiblock Scanner", "Used to scan onto §fData Orbs§7 and §fData Modules§7.", "Requires §fComputation§7 to work.", @@ -936,7 +933,7 @@ private static void generateCustomMultiblockTooltips(RegistrateLangProvider prov provider.add("gtceu.machine.research_station.researching", "Researching."); // Network Switch - multiLang(provider, "gtceu.machine.network_switch.tooltip", + provider.addMultiLang("gtceu.machine.network_switch.tooltip", "Ethernet Hub", "Used to route and distribute §fComputation§7.", "Can combine any number of Computation §fReceivers§7 into any number of Computation §fTransmitters§7.", @@ -945,7 +942,7 @@ private static void generateCustomMultiblockTooltips(RegistrateLangProvider prov "The Network Switch is a multiblock structure used for distributing Computation from many sources to many destinations. It can accept any number of Computation Data Reception or Transmission Hatches. It is necessary for Research Data which requires much higher Computation, as the Research Station can only accept one Computation Data Reception Hatch. HPCAs must have a Bridge Component for the Network Switch to be able to access their Computation."); // Data Bank - multiLang(provider, "gtceu.machine.data_bank.tooltip", + provider.addMultiLang("gtceu.machine.data_bank.tooltip", "Your Personal NAS", "Bulk Data Storage. Transfer with Optical Cables.", "Data Banks can be chained together.", @@ -957,7 +954,7 @@ private static void generateCustomMultiblockTooltips(RegistrateLangProvider prov provider.add("gtceu.multiblock.data_bank.providing", "Providing data."); // HPCA - multiLang(provider, "gtceu.machine.high_performance_computation_array.tooltip", + provider.addMultiLang("gtceu.machine.high_performance_computation_array.tooltip", "Just your average Supercomputer", "Used to generate §fComputation§7 (and heat).", "Requires HPCA components to generate §fCWU/t§7 (Compute Work Units)."); @@ -995,7 +992,7 @@ private static void generateCustomMultiblockTooltips(RegistrateLangProvider prov provider.add("gtceu.machine.fluid_tank.fluid", "Contains %s L of %s"); } - private static void generateCustomMultiblockPartTooltips(RegistrateLangProvider provider) { + private static void generateCustomMultiblockPartTooltips(GTLangProvider provider) { // Primitive Pump Hatch provider.add("gtceu.machine.pump_hatch.tooltip", "Primitive Fluid Output for Water Pump"); @@ -1004,11 +1001,11 @@ private static void generateCustomMultiblockPartTooltips(RegistrateLangProvider // Maintenance Hatch provider.add("gtceu.machine.maintenance_hatch.tooltip", "For maintaining Multiblocks"); - multilineLang(provider, "gtceu.machine.maintenance_hatch_configurable.tooltip", + provider.addMultiline("gtceu.machine.maintenance_hatch_configurable.tooltip", "For finer control over Multiblocks\nStarts with no Maintenance problems!"); provider.add("gtceu.machine.maintenance_hatch_full_auto.tooltip", "For automatically maintaining Multiblocks"); - multiLang(provider, "gtceu.machine.maintenance_hatch_cleanroom_auto.tooltip", + provider.addMultiLang("gtceu.machine.maintenance_hatch_cleanroom_auto.tooltip", "For automatically maintaining Multiblocks with Cleaning!", "Cleans as:"); provider.add("gtceu.machine.maintenance_hatch_tool_slot.tooltip", "Click slot with empty hand when required tools are in inventory to solve problems"); @@ -1026,7 +1023,7 @@ private static void generateCustomMultiblockPartTooltips(RegistrateLangProvider "Maintenance problems will occur at %fx the normal rate."); // Muffler Hatch - multiLang(provider, "gtceu.machine.muffler_hatch.tooltip", "Recovers waste from machines", + provider.addMultiLang("gtceu.machine.muffler_hatch.tooltip", "Recovers waste from machines", "DO NOT OBSTRUCT THE OUTPUT!"); provider.add("gtceu.muffler.recovery_tooltip", "§bRecovery Chance: §f%d%%"); @@ -1080,9 +1077,9 @@ private static void generateCustomMultiblockPartTooltips(RegistrateLangProvider "Has infinite capacity before connecting to ME network."); // ME Stocking - multiLang(provider, "gtceu.machine.me.stocking_item.tooltip", "Retrieves items directly from the ME network", + provider.addMultiLang("gtceu.machine.me.stocking_item.tooltip", "Retrieves items directly from the ME network", "Auto-Pull from ME mode will automatically stock the first 16 items in the ME system, updated every 5 seconds."); - multiLang(provider, "gtceu.machine.me.stocking_fluid.tooltip", "Retrieves fluids directly from the ME network", + provider.addMultiLang("gtceu.machine.me.stocking_fluid.tooltip", "Retrieves fluids directly from the ME network", "Auto-Pull from ME mode will automatically stock the first 16 fluids in the ME system, updated every 5 seconds."); provider.add("gtceu.machine.me_import_item_hatch.configs.tooltip", "Keeps 16 item types in stock"); @@ -1120,11 +1117,11 @@ private static void generateCustomMultiblockPartTooltips(RegistrateLangProvider provider.add("gtceu.machine.substation_hatch.output.tooltip", "Energy Output for the Power Substation"); // Rotor Holder - multiLang(provider, "gtceu.machine.rotor_holder.tooltip", "Rotor Holder for Multiblocks", + provider.addMultiLang("gtceu.machine.rotor_holder.tooltip", "Rotor Holder for Multiblocks", "Holds Rotor in place so it will not fly away"); // Data Hatches - multiLang(provider, "gtceu.machine.data_access_hatch.tooltip", "Data Access for Multiblocks", + provider.addMultiLang("gtceu.machine.data_access_hatch.tooltip", "Data Access for Multiblocks", "Adds §a%s§7 slots for Data Items"); provider.add("gtceu.machine.data_receiver_hatch.tooltip", "Research Data Input for Multiblocks"); provider.add("gtceu.machine.data_transmitter_hatch.tooltip", "Research Data Output for Multiblocks"); @@ -1177,11 +1174,11 @@ private static void generateCustomMultiblockPartTooltips(RegistrateLangProvider provider.add("gtceu.machine.laser_hatch.source.tooltip", "§7Transmitting power at distance"); provider.add("gtceu.machine.laser_hatch.target.tooltip", "§7Receiving power from distance"); provider.add("gtceu.machine.laser_hatch.both.tooltip", "§cLaser Cables must be in a straight line!§7"); - multiLang(provider, "gtceu.machine.laser_source_hatch.tooltip", + provider.addMultiLang("gtceu.machine.laser_source_hatch.tooltip", "Transmitting power at distance", "§cLaser cables must be in a straight line!§7"); - multiLang(provider, "gtceu.machine.laser_target_hatch.tooltip", + provider.addMultiLang("gtceu.machine.laser_target_hatch.tooltip", "Receiving power from distance", "§cLaser cables must be in a straight line!§7"); @@ -1196,17 +1193,16 @@ private static void generateCustomMultiblockPartTooltips(RegistrateLangProvider /** * Generates tooltips for both variants of steam machine */ - private static void makeSteamMachineTooltip(RegistrateLangProvider provider, String modId, String machineName, + private static void makeSteamMachineTooltip(GTLangProvider provider, String modId, String machineName, String lpTooltip, String hpTooltip) { - provider.add("machine.%s.lp_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(lpTooltip)); - provider.add("machine.%s.hp_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(hpTooltip)); + provider.add("machine.%s.lp_%s.tooltip".formatted(modId, machineName), ChatFormatting.GRAY + lpTooltip); + provider.add("machine.%s.hp_%s.tooltip".formatted(modId, machineName), ChatFormatting.GRAY + hpTooltip); } /** * Generates tooltips for LV-HV machines */ - private static void makeElectricMachineTooltipLVtoHV(RegistrateLangProvider provider, String modId, - String machineName, + private static void makeElectricMachineTooltipLVtoHV(GTLangProvider provider, String modId, String machineName, String lvTooltip, String mvTooltip, String hvTooltip) { makeElectricMachineTooltipULVtoMAX(provider, modId, machineName, null, lvTooltip, mvTooltip, hvTooltip, @@ -1218,12 +1214,10 @@ private static void makeElectricMachineTooltipLVtoHV(RegistrateLangProvider prov /** * Generates tooltips for LV-UV machines */ - private static void makeElectricMachineTooltipLVtoUV(RegistrateLangProvider provider, String modId, - String machineName, + private static void makeElectricMachineTooltipLVtoUV(GTLangProvider provider, String modId, String machineName, String lvTooltip, String mvTooltip, String hvTooltip, String evTooltip, String ivTooltip, String luvTooltip, - String zpmTooltip, - String uvTooltip) { + String zpmTooltip, String uvTooltip) { makeElectricMachineTooltipULVtoMAX(provider, modId, machineName, null, lvTooltip, mvTooltip, hvTooltip, evTooltip, ivTooltip, luvTooltip, zpmTooltip, @@ -1233,63 +1227,62 @@ private static void makeElectricMachineTooltipLVtoUV(RegistrateLangProvider prov /** * Generates tooltips for ULV-MAX Machines
- * If null it won't be added + * If a parameter is {@code null}, it won't be added. */ - private static void makeElectricMachineTooltipULVtoMAX(RegistrateLangProvider provider, String modId, - String machineName, + private static void makeElectricMachineTooltipULVtoMAX(GTLangProvider provider, String modId, String machineName, String ulvTooltip, String lvTooltip, String mvTooltip, String hvTooltip, String evTooltip, String ivTooltip, String luvTooltip, String zpmTooltip, String uvTooltip, String uhvTooltip, String uevTooltip, String uivTooltip, String uxvTooltip, String opvTooltip, String maxTooltip) { if (ulvTooltip != null) { - provider.add("machine.%s.ulv_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(ulvTooltip)); + provider.add("machine.%s.ulv_%s.tooltip".formatted(modId, machineName), ChatFormatting.GRAY + ulvTooltip); } if (lvTooltip != null) { - provider.add("machine.%s.lv_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(lvTooltip)); + provider.add("machine.%s.lv_%s.tooltip".formatted(modId, machineName), ChatFormatting.GRAY + lvTooltip); } if (mvTooltip != null) { - provider.add("machine.%s.mv_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(mvTooltip)); + provider.add("machine.%s.mv_%s.tooltip".formatted(modId, machineName), ChatFormatting.GRAY + mvTooltip); } if (hvTooltip != null) { - provider.add("machine.%s.hv_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(hvTooltip)); + provider.add("machine.%s.hv_%s.tooltip".formatted(modId, machineName), ChatFormatting.GRAY + hvTooltip); } if (evTooltip != null) { - provider.add("machine.%s.ev_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(evTooltip)); + provider.add("machine.%s.ev_%s.tooltip".formatted(modId, machineName), ChatFormatting.GRAY + evTooltip); } if (ivTooltip != null) { - provider.add("machine.%s.iv_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(ivTooltip)); + provider.add("machine.%s.iv_%s.tooltip".formatted(modId, machineName), ChatFormatting.GRAY + ivTooltip); } if (luvTooltip != null) { - provider.add("machine.%s.luv_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(luvTooltip)); + provider.add("machine.%s.luv_%s.tooltip".formatted(modId, machineName), ChatFormatting.GRAY + luvTooltip); } if (zpmTooltip != null) { - provider.add("machine.%s.zpm_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(zpmTooltip)); + provider.add("machine.%s.zpm_%s.tooltip".formatted(modId, machineName), ChatFormatting.GRAY + zpmTooltip); } if (uvTooltip != null) { - provider.add("machine.%s.uv_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(uvTooltip)); + provider.add("machine.%s.uv_%s.tooltip".formatted(modId, machineName), ChatFormatting.GRAY + uvTooltip); } if (uhvTooltip != null) { - provider.add("machine.%s.uhv_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(uhvTooltip)); + provider.add("machine.%s.uhv_%s.tooltip".formatted(modId, machineName), ChatFormatting.GRAY + uhvTooltip); } if (uevTooltip != null) { - provider.add("machine.%s.uev_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(uevTooltip)); + provider.add("machine.%s.uev_%s.tooltip".formatted(modId, machineName), ChatFormatting.GRAY + uevTooltip); } if (uivTooltip != null) { - provider.add("machine.%s.uiv_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(uivTooltip)); + provider.add("machine.%s.uiv_%s.tooltip".formatted(modId, machineName), ChatFormatting.GRAY + uivTooltip); } if (uxvTooltip != null) { - provider.add("machine.%s.uxv_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(uxvTooltip)); + provider.add("machine.%s.uxv_%s.tooltip".formatted(modId, machineName), ChatFormatting.GRAY + uxvTooltip); } if (opvTooltip != null) { - provider.add("machine.%s.opv_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(opvTooltip)); + provider.add("machine.%s.opv_%s.tooltip".formatted(modId, machineName), ChatFormatting.GRAY + opvTooltip); } if (maxTooltip != null) { - provider.add("machine.%s.max_%s.tooltip".formatted(modId, machineName), "§7%s".formatted(maxTooltip)); + provider.add("machine.%s.max_%s.tooltip".formatted(modId, machineName), ChatFormatting.GRAY + maxTooltip); } } - public static void generateMultiblockKeys(RegistrateLangProvider provider) { + public static void generateMultiblockKeys(GTLangProvider provider) { // Recipe Logic provider.add("gtceu.multiblock.work_paused", "Work Paused."); provider.add("gtceu.multiblock.running", "Running perfectly."); @@ -1394,7 +1387,7 @@ public static void generateMultiblockKeys(RegistrateLangProvider provider) { provider.add("gtceu.multiblock.pattern.error", "Expected components (%s) at (%s)."); provider.add("gtceu.multiblock.pattern.error.limited_exact", "§cExactly: %d§r"); provider.add("gtceu.multiblock.pattern.error.limited_within", "§cBetween %d and %d§r"); - multiLang(provider, "gtceu.multiblock.pattern.error.limited", "§cMaximum: %d§r", "§cMinimum: %d§r", + provider.addMultiLang("gtceu.multiblock.pattern.error.limited", "§cMaximum: %d§r", "§cMinimum: %d§r", "§cMaximum: %d per layer§r", "§cMinimum: %d per layer§r"); provider.add("gtceu.multiblock.pattern.error.coils", "§cAll heating coils must be the same§r"); provider.add("gtceu.multiblock.pattern.error.filters", "§cAll filters must be the same§r"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java index e3ad59d5fa2..cb8d23bd3e0 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java @@ -2,111 +2,109 @@ import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.chemical.material.registry.MaterialRegistry; - -import com.tterrag.registrate.providers.RegistrateLangProvider; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTLangProvider; import static com.gregtechceu.gtceu.common.data.GTMaterials.*; -import static com.gregtechceu.gtceu.data.lang.LangUtil.*; import static com.gregtechceu.gtceu.utils.FormattingUtil.toEnglishName; public class MaterialLang { - public static void generate(RegistrateLangProvider provider, MaterialRegistry registry) { + public static void generate(GTLangProvider provider, MaterialRegistry registry) { for (Material material : registry.getAllMaterials()) provider.add(material.getUnlocalizedName(), toEnglishName(material.getName())); } - public static void init(RegistrateLangProvider provider) { + public static void init(GTLangProvider provider) { generateMaterialKeys(provider); generateCustomMaterialNames(provider); generateFluidKeys(provider); } - private static void generateCustomMaterialNames(RegistrateLangProvider provider) { - replace(provider, FullersEarth.getUnlocalizedName(), "Fuller's Earth"); + private static void generateCustomMaterialNames(GTLangProvider provider) { + provider.add(FullersEarth.getUnlocalizedName(), "Fuller's Earth"); // greg's humor is now on 1.20.1... - replace(provider, Cooperite.getUnlocalizedName(), "Sheldonite"); - - replace(provider, HSSG.getUnlocalizedName(), "HSS-G"); - replace(provider, HSSE.getUnlocalizedName(), "HSS-E"); - replace(provider, HSSS.getUnlocalizedName(), "HSS-S"); - replace(provider, RTMAlloy.getUnlocalizedName(), "RTM Alloy"); - replace(provider, HSLASteel.getUnlocalizedName(), "HSLA Steel"); - - replace(provider, UUMatter.getUnlocalizedName(), "UU-Matter"); - replace(provider, PCBCoolant.getUnlocalizedName(), "PCB Coolant"); - replace(provider, TungstenSteel.getUnlocalizedName(), "Tungstensteel"); - - replace(provider, Iron3Chloride.getUnlocalizedName(), "Iron III Chloride"); - replace(provider, Iron2Chloride.getUnlocalizedName(), "Iron II Chloride"); - - replace(provider, OilHeavy.getUnlocalizedName(), "Heavy Oil"); - replace(provider, "block.gtceu.oil_heavy", "Heavy Oil"); - replace(provider, OilLight.getUnlocalizedName(), "Light Oil"); - replace(provider, "block.gtceu.oil_light", "Light Oil"); - replace(provider, RawOil.getUnlocalizedName(), "Raw Oil"); - replace(provider, "block.gtceu.oil_medium", "Raw Oil"); - - replace(provider, HydroCrackedButadiene.getUnlocalizedName(), "Hydro-Cracked Butadiene"); - replace(provider, HydroCrackedButane.getUnlocalizedName(), "Hydro-Cracked Butane"); - replace(provider, HydroCrackedButene.getUnlocalizedName(), "Hydro-Cracked Butene"); - replace(provider, HydroCrackedButene.getUnlocalizedName(), "Hydro-Cracked Butene"); - replace(provider, HydroCrackedEthane.getUnlocalizedName(), "Hydro-Cracked Ethane"); - replace(provider, HydroCrackedEthylene.getUnlocalizedName(), "Hydro-Cracked Ethylene"); - replace(provider, HydroCrackedPropane.getUnlocalizedName(), "Hydro-Cracked Propane"); - replace(provider, HydroCrackedPropene.getUnlocalizedName(), "Hydro-Cracked Propene"); - - replace(provider, SteamCrackedButadiene.getUnlocalizedName(), "Steam-Cracked Butadiene"); - replace(provider, SteamCrackedButane.getUnlocalizedName(), "Steam-Cracked Butane"); - replace(provider, SteamCrackedButene.getUnlocalizedName(), "Steam-Cracked Butene"); - replace(provider, SteamCrackedButene.getUnlocalizedName(), "Steam-Cracked Butene"); - replace(provider, SteamCrackedEthane.getUnlocalizedName(), "Steam-Cracked Ethane"); - replace(provider, SteamCrackedEthylene.getUnlocalizedName(), "Steam-Cracked Ethylene"); - replace(provider, SteamCrackedPropane.getUnlocalizedName(), "Steam-Cracked Propane"); - replace(provider, SteamCrackedPropene.getUnlocalizedName(), "Steam-Cracked Propene"); - - replace(provider, LightlyHydroCrackedGas.getUnlocalizedName(), "Lightly Hydro-Cracked Gas"); - replace(provider, LightlyHydroCrackedHeavyFuel.getUnlocalizedName(), + provider.add(Cooperite.getUnlocalizedName(), "Sheldonite"); + + provider.add(HSSG.getUnlocalizedName(), "HSS-G"); + provider.add(HSSE.getUnlocalizedName(), "HSS-E"); + provider.add(HSSS.getUnlocalizedName(), "HSS-S"); + provider.add(RTMAlloy.getUnlocalizedName(), "RTM Alloy"); + provider.add(HSLASteel.getUnlocalizedName(), "HSLA Steel"); + + provider.add(UUMatter.getUnlocalizedName(), "UU-Matter"); + provider.add(PCBCoolant.getUnlocalizedName(), "PCB Coolant"); + provider.add(TungstenSteel.getUnlocalizedName(), "Tungstensteel"); + + provider.add(Iron3Chloride.getUnlocalizedName(), "Iron III Chloride"); + provider.add(Iron2Chloride.getUnlocalizedName(), "Iron II Chloride"); + + provider.add(OilHeavy.getUnlocalizedName(), "Heavy Oil"); + provider.add("block.gtceu.oil_heavy", "Heavy Oil"); + provider.add(OilLight.getUnlocalizedName(), "Light Oil"); + provider.add("block.gtceu.oil_light", "Light Oil"); + provider.add(RawOil.getUnlocalizedName(), "Raw Oil"); + provider.add("block.gtceu.oil_medium", "Raw Oil"); + + provider.add(HydroCrackedButadiene.getUnlocalizedName(), "Hydro-Cracked Butadiene"); + provider.add(HydroCrackedButane.getUnlocalizedName(), "Hydro-Cracked Butane"); + provider.add(HydroCrackedButene.getUnlocalizedName(), "Hydro-Cracked Butene"); + provider.add(HydroCrackedButene.getUnlocalizedName(), "Hydro-Cracked Butene"); + provider.add(HydroCrackedEthane.getUnlocalizedName(), "Hydro-Cracked Ethane"); + provider.add(HydroCrackedEthylene.getUnlocalizedName(), "Hydro-Cracked Ethylene"); + provider.add(HydroCrackedPropane.getUnlocalizedName(), "Hydro-Cracked Propane"); + provider.add(HydroCrackedPropene.getUnlocalizedName(), "Hydro-Cracked Propene"); + + provider.add(SteamCrackedButadiene.getUnlocalizedName(), "Steam-Cracked Butadiene"); + provider.add(SteamCrackedButane.getUnlocalizedName(), "Steam-Cracked Butane"); + provider.add(SteamCrackedButene.getUnlocalizedName(), "Steam-Cracked Butene"); + provider.add(SteamCrackedButene.getUnlocalizedName(), "Steam-Cracked Butene"); + provider.add(SteamCrackedEthane.getUnlocalizedName(), "Steam-Cracked Ethane"); + provider.add(SteamCrackedEthylene.getUnlocalizedName(), "Steam-Cracked Ethylene"); + provider.add(SteamCrackedPropane.getUnlocalizedName(), "Steam-Cracked Propane"); + provider.add(SteamCrackedPropene.getUnlocalizedName(), "Steam-Cracked Propene"); + + provider.add(LightlyHydroCrackedGas.getUnlocalizedName(), "Lightly Hydro-Cracked Gas"); + provider.add(LightlyHydroCrackedHeavyFuel.getUnlocalizedName(), "Lightly Hydro-Cracked Heavy Fuel"); - replace(provider, LightlyHydroCrackedLightFuel.getUnlocalizedName(), + provider.add(LightlyHydroCrackedLightFuel.getUnlocalizedName(), "Lightly Hydro-Cracked Light Fuel"); - replace(provider, LightlyHydroCrackedNaphtha.getUnlocalizedName(), + provider.add(LightlyHydroCrackedNaphtha.getUnlocalizedName(), "Lightly Hydro-Cracked Naphtha"); - replace(provider, LightlySteamCrackedGas.getUnlocalizedName(), "Lightly Steam-Cracked Gas"); - replace(provider, LightlySteamCrackedHeavyFuel.getUnlocalizedName(), + provider.add(LightlySteamCrackedGas.getUnlocalizedName(), "Lightly Steam-Cracked Gas"); + provider.add(LightlySteamCrackedHeavyFuel.getUnlocalizedName(), "Lightly Steam-Cracked Heavy Fuel"); - replace(provider, LightlySteamCrackedLightFuel.getUnlocalizedName(), + provider.add(LightlySteamCrackedLightFuel.getUnlocalizedName(), "Lightly Steam-Cracked Light Fuel"); - replace(provider, LightlySteamCrackedNaphtha.getUnlocalizedName(), + provider.add(LightlySteamCrackedNaphtha.getUnlocalizedName(), "Lightly Steam-Cracked Naphtha"); - replace(provider, SeverelyHydroCrackedGas.getUnlocalizedName(), + provider.add(SeverelyHydroCrackedGas.getUnlocalizedName(), "Severely Hydro-Cracked Gas"); - replace(provider, SeverelyHydroCrackedHeavyFuel.getUnlocalizedName(), + provider.add(SeverelyHydroCrackedHeavyFuel.getUnlocalizedName(), "Severely Hydro-Cracked Heavy Fuel"); - replace(provider, SeverelyHydroCrackedLightFuel.getUnlocalizedName(), + provider.add(SeverelyHydroCrackedLightFuel.getUnlocalizedName(), "Severely Hydro-Cracked Light Fuel"); - replace(provider, SeverelyHydroCrackedNaphtha.getUnlocalizedName(), + provider.add(SeverelyHydroCrackedNaphtha.getUnlocalizedName(), "Severely Hydro-Cracked Naphtha"); - replace(provider, SeverelySteamCrackedGas.getUnlocalizedName(), + provider.add(SeverelySteamCrackedGas.getUnlocalizedName(), "Severely Steam-Cracked Gas"); - replace(provider, SeverelySteamCrackedHeavyFuel.getUnlocalizedName(), + provider.add(SeverelySteamCrackedHeavyFuel.getUnlocalizedName(), "Severely Steam-Cracked Heavy Fuel"); - replace(provider, SeverelySteamCrackedLightFuel.getUnlocalizedName(), + provider.add(SeverelySteamCrackedLightFuel.getUnlocalizedName(), "Severely Steam-Cracked Light Fuel"); - replace(provider, SeverelySteamCrackedNaphtha.getUnlocalizedName(), + provider.add(SeverelySteamCrackedNaphtha.getUnlocalizedName(), "Severely Steam-Cracked Naphtha"); - replace(provider, LPG.getUnlocalizedName(), "LPG"); + provider.add(LPG.getUnlocalizedName(), "LPG"); - replace(provider, Zeron100.getUnlocalizedName(), "Zeron-100"); - replace(provider, IncoloyMA956.getUnlocalizedName(), "Incoloy MA-956"); - replace(provider, Stellite100.getUnlocalizedName(), "Stellite-100"); - replace(provider, HastelloyC276.getUnlocalizedName(), "Hastelloy C-276"); + provider.add(Zeron100.getUnlocalizedName(), "Zeron-100"); + provider.add(IncoloyMA956.getUnlocalizedName(), "Incoloy MA-956"); + provider.add(Stellite100.getUnlocalizedName(), "Stellite-100"); + provider.add(HastelloyC276.getUnlocalizedName(), "Hastelloy C-276"); - replace(provider, "item.gtceu.nether_quartz_netherrack", "Nether Quartz Ore"); + provider.add("item.gtceu.nether_quartz_netherrack", "Nether Quartz Ore"); } - private static void generateFluidKeys(RegistrateLangProvider provider) { + private static void generateFluidKeys(GTLangProvider provider) { // Fluid Types provider.add("fluid.gtceu.liquid_generic", "Liquid %s"); provider.add("fluid.gtceu.generic", "%s"); @@ -139,7 +137,7 @@ private static void generateFluidKeys(RegistrateLangProvider provider) { provider.add("fluid.tile.water", "Water"); } - private static void generateMaterialKeys(RegistrateLangProvider provider) { + private static void generateMaterialKeys(GTLangProvider provider) { // Material Page provider.add("gtceu.jei.materials.average_mass", "Average mass: %d"); provider.add("gtceu.jei.materials.average_protons", "Average protons: %d"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java index 343525bc610..741576ad481 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java @@ -1,26 +1,23 @@ package com.gregtechceu.gtceu.data.lang; import com.gregtechceu.gtceu.api.registry.GTRegistries; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTLangProvider; -import com.tterrag.registrate.providers.RegistrateLangProvider; - -import static com.gregtechceu.gtceu.data.lang.LangUtil.*; import static com.gregtechceu.gtceu.utils.FormattingUtil.toEnglishName; public class RecipeLang { - public static void init(RegistrateLangProvider provider) { + public static void init(GTLangProvider provider) { generateRecipeTypes(provider); generateRecipeConditions(provider); generateRecipeDataKeys(provider); generateMiscKeys(provider); } - private static void generateRecipeTypes(RegistrateLangProvider provider) { + private static void generateRecipeTypes(GTLangProvider provider) { // RecipeTypes for (var recipeType : GTRegistries.RECIPE_TYPES) { - String key = "recipe_type." + recipeType.registryName.toLanguageKey(); - provider.add(key, toEnglishName(recipeType.registryName.getPath())); + provider.add(recipeType.getLanguageKey(), toEnglishName(recipeType.registryName.getPath())); } // Recipe Categories @@ -34,7 +31,7 @@ private static void generateRecipeTypes(RegistrateLangProvider provider) { provider.add("recipe_type.gtceu.category.ingot_molding", "Metal Molding"); } - private static void generateRecipeConditions(RegistrateLangProvider provider) { + private static void generateRecipeConditions(GTLangProvider provider) { // Recipe Conditions provider.add("recipe.condition.thunder.tooltip", "Thunder Level: %d"); provider.add("recipe.condition.rain.tooltip", "Rain Level: %d"); @@ -58,23 +55,25 @@ private static void generateRecipeConditions(RegistrateLangProvider provider) { provider.add("recipe.condition.quest.not_completed.tooltip", "Requires %s not completed"); } - private static void generateRecipeDataKeys(RegistrateLangProvider provider) { + private static void generateRecipeDataKeys(GTLangProvider provider) { // Recipe Data provider.add("gtceu.recipe.total", "Total: %s EU"); provider.add("gtceu.recipe.max_eu", "Max. EU: %s EU"); provider.add("gtceu.recipe.eu", "Usage: %s EU/t"); provider.add("gtceu.recipe.eu_inverted", "Generation: %s EU/t"); + provider.add("gtceu.recipe.scan_for_research", "Scan for Assembly Line"); + provider.add("gtceu.recipe.computation_per_tick", "Min. Computation: %s CWU/t"); + provider.add("gtceu.recipe.total_computation", "Computation: %s CWU"); + provider.add("gtceu.recipe.duration", "Duration: %s secs"); provider.add("gtceu.recipe.amperage", "Amperage: %s"); provider.add("gtceu.recipe.not_consumed", "Does not get consumed in the process"); provider.add("gtceu.recipe.chance", "Chance: %s +%s/tier"); - provider.add("gtceu.recipe.temperature", "Temp: %sK"); - provider.add("gtceu.recipe.coil.tier", "Coil: %s"); - provider.add("gtceu.recipe.explosive", "Explosive: %s"); + // TODO make the ones below this comment recipe condition keys provider.add("gtceu.recipe.eu_to_start", "EU To Start: %sEU%s"); provider.add("gtceu.recipe.dimensions", "Dimensions: %s"); @@ -86,13 +85,12 @@ private static void generateRecipeDataKeys(RegistrateLangProvider provider) { provider.add("gtceu.recipe.cleanroom_sterile.display_name", "Sterile Cleanroom"); provider.add("gtceu.recipe.research", "Requires Research"); - provider.add("gtceu.recipe.scan_for_research", "Scan for Assembly Line"); - provider.add("gtceu.recipe.computation_per_tick", "Min. Computation: %s CWU/t"); - provider.add("gtceu.recipe.total_computation", "Computation: %s CWU"); + provider.add("gtceu.recipe.temperature", "Temp: %sK"); + provider.add("gtceu.recipe.coil.tier", "Coil: %s"); } - private static void generateMiscKeys(RegistrateLangProvider provider) { + private static void generateMiscKeys(GTLangProvider provider) { // IO provider.add("gtceu.io.import", "Import"); provider.add("gtceu.io.export", "Export"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/SubtitleLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/SubtitleLang.java index f0bcbbe89f7..ea16088c710 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/SubtitleLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/SubtitleLang.java @@ -1,16 +1,14 @@ package com.gregtechceu.gtceu.data.lang; -import com.tterrag.registrate.providers.RegistrateLangProvider; - -import static com.gregtechceu.gtceu.data.lang.LangUtil.*; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTLangProvider; public class SubtitleLang { - public static void init(RegistrateLangProvider provider) { + public static void init(GTLangProvider provider) { generateSubtitleKeys(provider); } - private static void generateSubtitleKeys(RegistrateLangProvider provider) { + private static void generateSubtitleKeys(GTLangProvider provider) { // Subtitles // Machines provider.add("subtitles.gtceu.boiler", "Boiler heating"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java index 3fa52bc34a3..9eaa2919d75 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java @@ -1,12 +1,10 @@ package com.gregtechceu.gtceu.data.lang; -import com.tterrag.registrate.providers.RegistrateLangProvider; - -import static com.gregtechceu.gtceu.data.lang.LangUtil.*; +import com.gregtechceu.gtceu.api.registry.registrate.provider.GTLangProvider; public class ToolLang { - public static void init(RegistrateLangProvider provider) { + public static void init(GTLangProvider provider) { initDeathMessages(provider); generateToolClassKeys(provider); generateToolKeys(provider); @@ -16,7 +14,7 @@ public static void init(RegistrateLangProvider provider) { generateEnchantKeys(provider); } - private static void initDeathMessages(RegistrateLangProvider provider) { + private static void initDeathMessages(GTLangProvider provider) { // Death Messages provider.add("death.attack.gtceu.heat", "%s was boiled alive"); provider.add("death.attack.gtceu.frost", "%s explored cryogenics"); @@ -58,7 +56,7 @@ private static void initDeathMessages(RegistrateLangProvider provider) { provider.add("death.attack.gtceu.screwdriver_lv", "%s had their screws removed by %s"); } - public static void generateToolClassKeys(RegistrateLangProvider provider) { + public static void generateToolClassKeys(GTLangProvider provider) { // Tool Names provider.add("item.gtceu.tool.class.sword", "Sword"); provider.add("item.gtceu.tool.class.pickaxe", "Pickaxe"); @@ -85,7 +83,7 @@ public static void generateToolClassKeys(RegistrateLangProvider provider) { provider.add("item.gtceu.tool.class.drill", "Drill"); } - public static void generateBehaviorKeys(RegistrateLangProvider provider) { + public static void generateBehaviorKeys(GTLangProvider provider) { // Generic Tool Behaviors provider.add("item.gtceu.tool.behavior.silk_ice", "§bIce Cutter: §fSilk Harvests Ice"); provider.add("item.gtceu.tool.behavior.torch_place", "§eSpelunker: §fPlaces Torches on Right-Click"); @@ -115,60 +113,60 @@ public static void generateBehaviorKeys(RegistrateLangProvider provider) { provider.add("item.behavior.mode_switch.current_mode", "Mode: %s"); } - public static void generateToolKeys(RegistrateLangProvider provider) { + public static void generateToolKeys(GTLangProvider provider) { // Tool Names - replace(provider, "item.gtceu.tool.sword", "%s Sword"); - replace(provider, "item.gtceu.tool.pickaxe", "%s Pickaxe"); - replace(provider, "item.gtceu.tool.shovel", "%s Shovel"); - replace(provider, "item.gtceu.tool.axe", "%s Axe"); - replace(provider, "item.gtceu.tool.hoe", "%s Hoe"); - replace(provider, "item.gtceu.tool.saw", "%s Saw"); - replace(provider, "item.gtceu.bucket", "%s Bucket"); - - replace(provider, "item.gtceu.tool.hammer", "%s Hammer"); - replace(provider, "item.gtceu.tool.mallet", "%s Soft Mallet"); - replace(provider, "item.gtceu.tool.wrench", "%s Wrench"); - replace(provider, "item.gtceu.tool.file", "%s File"); - replace(provider, "item.gtceu.tool.crowbar", "%s Crowbar"); - replace(provider, "item.gtceu.tool.screwdriver", "%s Screwdriver"); - replace(provider, "item.gtceu.tool.mortar", "%s Mortar"); - replace(provider, "item.gtceu.tool.wire_cutter", "%s Wire Cutter"); - replace(provider, "item.gtceu.tool.knife", "%s Knife"); - replace(provider, "item.gtceu.tool.butchery_knife", "%s Butchery Knife"); - replace(provider, "item.gtceu.tool.scythe", "%s Scythe"); - replace(provider, "item.gtceu.tool.rolling_pin", "%s Rolling Pin"); - - replace(provider, "item.gtceu.tool.lv_drill", "%s Drill (LV)"); - replace(provider, "item.gtceu.tool.mv_drill", "%s Drill (MV)"); - replace(provider, "item.gtceu.tool.hv_drill", "%s Drill (HV)"); - replace(provider, "item.gtceu.tool.ev_drill", "%s Drill (EV)"); - replace(provider, "item.gtceu.tool.iv_drill", "%s Drill (IV)"); - - replace(provider, "item.gtceu.tool.lv_wirecutter", "%s Wire Cutter (LV)"); - replace(provider, "item.gtceu.tool.hv_wirecutter", "%s Wire Cutter (HV)"); - replace(provider, "item.gtceu.tool.iv_wirecutter", "%s Wire Cutter (IV)"); - - replace(provider, "item.gtceu.tool.mining_hammer", "%s Mining Hammer"); - replace(provider, "item.gtceu.tool.spade", "%s Spade"); - - replace(provider, "item.gtceu.tool.lv_chainsaw", "%s Chainsaw (LV)"); - replace(provider, "item.gtceu.tool.mv_chainsaw", "%s Chainsaw (MV)"); - replace(provider, "item.gtceu.tool.hv_chainsaw", "%s Chainsaw (HV)"); - - replace(provider, "item.gtceu.tool.lv_wrench", "%s Wrench (LV)"); - replace(provider, "item.gtceu.tool.hv_wrench", "%s Wrench (HV)"); - replace(provider, "item.gtceu.tool.iv_wrench", "%s Wrench (IV)"); - - replace(provider, "item.gtceu.tool.buzzsaw", "%s Buzzsaw (LV)"); - replace(provider, "item.gtceu.tool.lv_screwdriver", "%s Screwdriver (LV)"); - replace(provider, "item.gtceu.tool.plunger", "%s Plunger"); - replace(provider, "item.gtceu.tool.shears", "%s Shears"); + provider.add("item.gtceu.tool.sword", "%s Sword"); + provider.add("item.gtceu.tool.pickaxe", "%s Pickaxe"); + provider.add("item.gtceu.tool.shovel", "%s Shovel"); + provider.add("item.gtceu.tool.axe", "%s Axe"); + provider.add("item.gtceu.tool.hoe", "%s Hoe"); + provider.add("item.gtceu.tool.saw", "%s Saw"); + provider.add("item.gtceu.bucket", "%s Bucket"); + + provider.add("item.gtceu.tool.hammer", "%s Hammer"); + provider.add("item.gtceu.tool.mallet", "%s Soft Mallet"); + provider.add("item.gtceu.tool.wrench", "%s Wrench"); + provider.add("item.gtceu.tool.file", "%s File"); + provider.add("item.gtceu.tool.crowbar", "%s Crowbar"); + provider.add("item.gtceu.tool.screwdriver", "%s Screwdriver"); + provider.add("item.gtceu.tool.mortar", "%s Mortar"); + provider.add("item.gtceu.tool.wire_cutter", "%s Wire Cutter"); + provider.add("item.gtceu.tool.knife", "%s Knife"); + provider.add("item.gtceu.tool.butchery_knife", "%s Butchery Knife"); + provider.add("item.gtceu.tool.scythe", "%s Scythe"); + provider.add("item.gtceu.tool.rolling_pin", "%s Rolling Pin"); + + provider.add("item.gtceu.tool.lv_drill", "%s Drill (LV)"); + provider.add("item.gtceu.tool.mv_drill", "%s Drill (MV)"); + provider.add("item.gtceu.tool.hv_drill", "%s Drill (HV)"); + provider.add("item.gtceu.tool.ev_drill", "%s Drill (EV)"); + provider.add("item.gtceu.tool.iv_drill", "%s Drill (IV)"); + + provider.add("item.gtceu.tool.lv_wirecutter", "%s Wire Cutter (LV)"); + provider.add("item.gtceu.tool.hv_wirecutter", "%s Wire Cutter (HV)"); + provider.add("item.gtceu.tool.iv_wirecutter", "%s Wire Cutter (IV)"); + + provider.add("item.gtceu.tool.mining_hammer", "%s Mining Hammer"); + provider.add("item.gtceu.tool.spade", "%s Spade"); + + provider.add("item.gtceu.tool.lv_chainsaw", "%s Chainsaw (LV)"); + provider.add("item.gtceu.tool.mv_chainsaw", "%s Chainsaw (MV)"); + provider.add("item.gtceu.tool.hv_chainsaw", "%s Chainsaw (HV)"); + + provider.add("item.gtceu.tool.lv_wrench", "%s Wrench (LV)"); + provider.add("item.gtceu.tool.hv_wrench", "%s Wrench (HV)"); + provider.add("item.gtceu.tool.iv_wrench", "%s Wrench (IV)"); + + provider.add("item.gtceu.tool.buzzsaw", "%s Buzzsaw (LV)"); + provider.add("item.gtceu.tool.lv_screwdriver", "%s Screwdriver (LV)"); + provider.add("item.gtceu.tool.plunger", "%s Plunger"); + provider.add("item.gtceu.tool.shears", "%s Shears"); } - public static void generateTooltips(RegistrateLangProvider provider) { + public static void generateTooltips(GTLangProvider provider) { // Tool Tooltips provider.add("item.gtceu.tool.hammer.tooltip", "§8Crushes Blocks when harvesting them"); - multilineLang(provider, "item.gtceu.tool.mallet.tooltip", + provider.addMultiline("item.gtceu.tool.mallet.tooltip", "§8Sneak to Pause Machine After Current Recipe.\n§8Stops/Starts Machines"); provider.add("item.gtceu.tool.wrench.tooltip", "§8Hold left click to dismantle Machines"); provider.add("item.gtceu.tool.crowbar.tooltip", "§8Dismounts Covers"); @@ -194,7 +192,7 @@ public static void generateTooltips(RegistrateLangProvider provider) { provider.add("tool.gtceu.tooltip.mining_speed", "%s §dMining Speed"); provider.add("tool.gtceu.tooltip.harvest_level", "§eHarvest Level %s"); provider.add("tool.gtceu.tooltip.harvest_level_extra", "§eHarvest Level %s §f(%s§f)"); - multiLang(provider, "tool.gtceu.tooltip.harvest_level_name", + provider.addMultiLang("tool.gtceu.tooltip.harvest_level_name", "§8Wood", "§7Stone", "§aIron", "§bDiamond", "§dNetherite", "§9Duranium", "§cNeutronium"); @@ -211,7 +209,7 @@ public static void generateTooltips(RegistrateLangProvider provider) { provider.add("item.gtceu.turbine_rotor.tooltip.power", "Turbine Power: §9%d%%"); } - public static void generateActionKeys(RegistrateLangProvider provider) { + public static void generateActionKeys(GTLangProvider provider) { // Tool Actions? provider.add("tool_action.gtceu.show_tooltips", "Hold SHIFT to show Tool Info"); @@ -240,7 +238,7 @@ public static void generateActionKeys(RegistrateLangProvider provider) { provider.add("tool_action.gtceu.tape", "§8Use Tape to fix Maintenance Problems"); } - private static void generateEnchantKeys(RegistrateLangProvider provider) { + private static void generateEnchantKeys(GTLangProvider provider) { // Enchantments provider.add("enchantment.gtceu.disjunction", "Disjunction"); provider.add("enchantment.gtceu.disjunction.description", diff --git a/src/main/java/com/gregtechceu/gtceu/integration/xei/widgets/GTRecipeWidget.java b/src/main/java/com/gregtechceu/gtceu/integration/xei/widgets/GTRecipeWidget.java index 51195c18a20..b272fe0f484 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/xei/widgets/GTRecipeWidget.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/xei/widgets/GTRecipeWidget.java @@ -137,8 +137,8 @@ private void setRecipeWidget() { .setBackgroundTexture(IGuiTexture.EMPTY)); } else addWidget(new LabelWidget(3 - xOffset, yOffset += LINE_HEIGHT, condition.getTooltips().getString())); } - for (Function dataInfo : recipe.recipeType.getDataInfos()) { - addWidget(new LabelWidget(3 - xOffset, yOffset += LINE_HEIGHT, dataInfo.apply(recipe.data))); + for (Function dataInfo : recipe.recipeType.getDataInfos()) { + addWidget(new LabelWidget(3 - xOffset, yOffset += LINE_HEIGHT, dataInfo.apply(recipe.data).getString())); } recipe.recipeType.getRecipeUI().appendJEIUI(recipe, this); } diff --git a/src/main/java/com/gregtechceu/gtceu/utils/FormattingUtil.java b/src/main/java/com/gregtechceu/gtceu/utils/FormattingUtil.java index 09edf06c3f3..d7865947631 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/FormattingUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/FormattingUtil.java @@ -174,6 +174,26 @@ public static String lowerUnderscoreToUpperCamel(String string) { return result.toString(); } + public static MutableComponent years(String years) { + return Component.translatable("gtceu.gui.years", years); + } + + public static MutableComponent days(String days) { + return Component.translatable("gui.days", days); + } + + public static MutableComponent hours(String hours) { + return Component.translatable("gui.hours", hours); + } + + public static MutableComponent minutes(String minutes) { + return Component.translatable("gui.minutes", minutes); + } + + public static MutableComponent seconds(String seconds) { + return Component.translatable("gtceu.gui.seconds", seconds); + } + public static String formatPercent(double number) { return String.format("%,.2f", number); } diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 797b5a7e4c0..c40d37e4a31 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -28,7 +28,6 @@ "xaeroworldmap.WorldMapSessionMixin" ], "mixins": [ - "AbstractRegistrateAccessor", "BlockBehaviourAccessor", "BlockMixin", "BlockPropertiesAccessor", @@ -67,6 +66,9 @@ "jei.FluidHelperMixin", "ldlib.ModularWrapperWidgetMixin", "ldlib.SyncUtilsMixin", + "registrate.AbstractRegistrateAccessor", + "registrate.RegistrateDataProviderAccessor", + "registrate.LanguageProviderAccessor", "rei.InputSlotCrafterMixin", "rei.RecipeFinderMixin", "top.ConfigMixin" From 81120cf07fc8767d0b4f39f4fa2e949594836588 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Sat, 28 Jun 2025 15:11:56 -0600 Subject: [PATCH 32/45] more machine tooltips --- .../common/data/machines/GTMultiMachines.java | 4 +- .../gtceu/data/lang/MachineLang.java | 51 ++++++++++--------- 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMultiMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMultiMachines.java index 8812d2299f1..e61ad4e109a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMultiMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMultiMachines.java @@ -315,7 +315,7 @@ public class GTMultiMachines { }) .workableCasingRenderer(GTCEu.id("block/casings/voltage/ulv/side"), GTCEu.id("block/multiblock/pyrolyse_oven")) - .tooltips(Component.translatable("gtceu.machine.pyrolyse_oven.tooltip.1")) + .tooltips(Component.translatable("machine.gtceu.pyrolyse_oven.coil_tooltip")) .additionalDisplay((controller, components) -> { if (controller instanceof CoilWorkableElectricMultiblockMachine coilMachine && controller.isFormed()) { components.add(Component.translatable("gtceu.multiblock.pyrolyse_oven.speed", @@ -418,7 +418,7 @@ public class GTMultiMachines { }) .workableCasingRenderer(GTCEu.id("block/casings/solid/machine_casing_clean_stainless_steel"), GTCEu.id("block/multiblock/cracking_unit")) - .tooltips(Component.translatable("gtceu.machine.cracker.tooltip.1")) + .tooltips(Component.translatable("machine.gtceu.cracker.coil_tooltip")) .additionalDisplay((controller, components) -> { if (controller instanceof CoilWorkableElectricMultiblockMachine coilMachine && controller.isFormed()) { components.add(Component.translatable("gtceu.multiblock.cracking_unit.energy", diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java index 33f82343517..73cc92ecfc0 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java @@ -672,50 +672,50 @@ private static void generateCustomMultiblockTooltips(GTLangProvider provider) { provider.add("gtceu.multiblock.multi_furnace.heating_coil_discount", "Heating Coil EU Boost: %sx"); // Large Chemical Reactor + provider.add("machine.gtceu.large_chemical_reactor.tooltip", "Black Box Reactor"); provider.add("gtceu.multiblock.large_chemical_reactor.description", "The Large Chemical Reactor performs chemical reactions at 100%% energy efficiency. Overclocks multiply both speed and energy by 4. The multiblock requires exactly 1 Cupronickel Coil Block, which must be placed adjacent to the PTFE Pipe casing located in the center."); - provider.add("machine.gtceu.large_chemical_reactor.tooltip", "Black Box Reactor"); // Vacuum Freezer - provider.add("gtceu.machine.vacuum_freezer.tooltip", "Aluminium Ice Box"); + provider.add("machine.gtceu.vacuum_freezer.tooltip", "Aluminium Ice Box"); provider.add("gtceu.multiblock.vacuum_freezer.description", "The Vacuum Freezer is a multiblock structure mainly used for freezing Hot Ingots into regular Ingots. However, it can also freeze other substances, such as Water."); // Pyrolyse Oven provider.add("gtceu.multiblock.pyrolyse_oven.description", "The Pyrolyse Oven is a multiblock structure used for turning Logs into Charcoal and Creosote Oil, or Ash and Heavy Oil."); - provider.add("gtceu.machine.pyrolyse_oven.tooltip", "Electric Coke Oven"); - provider.add("gtceu.machine.pyrolyse_oven.tooltip.1", + provider.add("machine.gtceu.pyrolyse_oven.tooltip", "Electric Coke Oven"); + provider.add("machine.gtceu.pyrolyse_oven.coil_tooltip", "§6Cupronickel §7coils are §f25%%§7 slower. Every coil after §bKanthal§7 increases speed by §f50%%§7."); provider.add("gtceu.multiblock.pyrolyse_oven.speed", "Processing Speed: %s%%"); // Implosion Compressor - provider.add("gtceu.machine.implosion_compressor.tooltip", "The only Machine you want to go Boom"); + provider.add("machine.gtceu.implosion_compressor.tooltip", "The only Machine you want to go Boom"); provider.add("gtceu.multiblock.implosion_compressor.description", "The Implosion Compressor is a multiblock structure that uses explosives to turn gem dusts into their corresponding gems."); // Cracker - provider.add("gtceu.machine.cracker.tooltip", "Makes Oil useful"); - provider.add("gtceu.machine.cracker.tooltip.1", + provider.add("machine.gtceu.cracker.tooltip", "Makes Oil useful"); + provider.add("machine.gtceu.cracker.coil_tooltip", "Every coil after §6Cupronickel§7 reduces energy usage by §f10%%§7."); provider.add("gtceu.multiblock.cracker.description", "The Oil Cracking Unit is a multiblock structure used for turning Light and Heavy Fuel into their Cracked variants."); provider.add("gtceu.multiblock.cracking_unit.energy", "Energy Usage: %s%%"); // Distillation Tower - provider.add("gtceu.machine.distillation_tower.tooltip", "Fluid Refinery"); + provider.add("machine.gtceu.distillation_tower.tooltip", "Fluid Refinery"); provider.add("gtceu.multiblock.distillation_tower.description", "The Distillation Tower is a multiblock structure used for distilling the various types of Oil and some of their byproducts. Each layer must have exactly one output hatch, starting from the second one. The bottom layer can output items and insert fluids in any position."); provider.add("gtceu.multiblock.distillation_tower.distilling_fluid", "Distilling %s"); // Assembly Line + provider.add("machine.gtceu.assembly_line.tooltip", "Not a multiblock Assembling Machine!"); provider.add("gtceu.multiblock.assembly_line.description", "The Assembly Line is a large multiblock structure consisting of 5 to 16 \"slices\". In theory, it's large Assembling Machine, used for creating advanced crafting components."); - provider.add("gtceu.machine.assembly_line.tooltip", "Not a multiblock Assembling Machine!"); // Combustion Engine - provider.add("gtceu.machine.large_combustion_engine.tooltip", "Fuel Ignition Chamber"); - provider.add("gtceu.machine.extreme_combustion_engine.tooltip", "Extreme Chemical Energy Releaser"); + provider.add("machine.gtceu.large_combustion_engine.tooltip", "Fuel Ignition Chamber"); + provider.add("machine.gtceu.extreme_combustion_engine.tooltip", "Extreme Chemical Energy Releaser"); provider.add("gtceu.machine.large_combustion_engine.tooltip.boost_regular", "Supply §f20 mB/s§7 of Oxygen to produce up to §f%s EU/t§7 at §f2x§7 fuel consumption."); provider.add("gtceu.machine.large_combustion_engine.tooltip.boost_extreme", @@ -743,9 +743,9 @@ private static void generateCustomMultiblockTooltips(GTLangProvider provider) { provider.add("block.gtceu.steam_large_turbine", "Large Steam Turbine"); provider.add("block.gtceu.gas_large_turbine", "Large Gas Turbine"); provider.add("block.gtceu.plasma_large_turbine", "Large Plasma Turbine"); - provider.add("gtceu.machine.large_turbine.steam.tooltip", "Do not put your Head in it"); - provider.add("gtceu.machine.large_turbine.gas.tooltip", "Not a Jet Engine"); - provider.add("gtceu.machine.large_turbine.plasma.tooltip", "Plasma Energy Siphon"); + provider.add("machine.gtceu.steam_large_turbine.tooltip", "Do not put your Head in it"); + provider.add("machine.gtceu.gas_large_turbine.tooltip", "Not a Jet Engine"); + provider.add("machine.gtceu.plasma_large_turbine.tooltip", "Plasma Energy Siphon"); provider.add("gtceu.multiblock.turbine.fuel_amount", "Fuel Amount: %sL (%s)"); provider.add("gtceu.multiblock.turbine.rotor_speed", "Rotor Speed: %s/%s RPM"); provider.add("gtceu.multiblock.turbine.rotor_durability", "Rotor Durability: %s%%"); @@ -760,6 +760,9 @@ private static void generateCustomMultiblockTooltips(GTLangProvider provider) { "Large Turbines are multiblocks that generate power from steam, gases, and plasma by having them spin the turbine's rotor. Energy output is based on rotor efficiency and current speed of turbine. Gearbox casings are used in the center of the structure."); // Fusion Reactor + provider.add("machine.gtceu.luv_fusion_reactor.tooltip", "Atomic Alloy Smelter"); + provider.add("machine.gtceu.zpm_fusion_reactor.tooltip", "A SUN DOWN ON EARTH"); + provider.add("machine.gtceu.uv_fusion_reactor.tooltip", "A WHITE DWARF DOWN ON YOUR BASE"); provider.add("gtceu.machine.fusion_reactor.capacity", "§7Maximum Energy Storage: §e%sM EU"); provider.add("gtceu.machine.fusion_reactor.overclocking", "Overclocks double energy and halve duration."); @@ -771,14 +774,12 @@ private static void generateCustomMultiblockTooltips(GTLangProvider provider) { "The Fusion Reactor MK 3 is a large multiblock structure used for fusing elements into heavier ones. It can only use UV Energy Hatches. For every Hatch it has, its buffer increases by 40M EU, and has a maximum of 640M."); provider.add("gtceu.multiblock.fusion_reactor.energy", "EU: %d / %d"); provider.add("gtceu.multiblock.fusion_reactor.heat", "Heat: %d"); - provider.add("gtceu.machine.fusion_reactor.luv.tooltip", "Atomic Alloy Smelter"); - provider.add("gtceu.machine.fusion_reactor.zpm.tooltip", "A SUN DOWN ON EARTH"); - provider.add("gtceu.machine.fusion_reactor.uv.tooltip", "A WHITE DWARF DOWN ON YOUR BASE"); + // Large Miner - provider.add("gtceu.machine.large_miner.ev.tooltip", "Digging Ore instead of You"); - provider.add("gtceu.machine.large_miner.iv.tooltip", "Biome Excavator"); - provider.add("gtceu.machine.large_miner.luv.tooltip", "Terrestrial Harvester"); + provider.add("machine.gtceu.ev_large_miner.tooltip", "Digging Ore instead of You"); + provider.add("machine.gtceu.iv_large_miner.tooltip", "Biome Excavator"); + provider.add("machine.gtceu.luv_large_miner.tooltip", "Terrestrial Harvester"); provider.add("gtceu.machine.miner.multi.modes", "Has Silk Touch and Chunk Aligned Modes."); provider.add("gtceu.machine.miner.multi.production", "Produces §f3x§7 more crushed ore than a §fMacerator§7."); @@ -804,14 +805,14 @@ private static void generateCustomMultiblockTooltips(GTLangProvider provider) { provider.add("gtceu.multiblock.large_miner.needsfluid", "Needs Drilling Fluid"); // Fluid Drilling Rig + provider.add("machine.gtceu.mv_fluid_drilling_rig.tooltip", "Oil Extraction Pump"); + provider.add("machine.gtceu.hv_fluid_drilling_rig.tooltip", "Does not perform Fracking"); + provider.add("machine.gtceu.ev_fluid_drilling_rig.tooltip", "Well Drainer"); provider.add("gtceu.machine.fluid_drilling_rig.description", "§7Drills fluids from veins under bedrock."); provider.add("gtceu.machine.fluid_drilling_rig.production", "§eProduction Multiplier: §f%dx, %fx overclocked"); provider.add("gtceu.machine.fluid_drilling_rig.depletion", "§bDepletion Rate: §f%s%%"); - provider.add("gtceu.machine.mv_fluid_drilling_rig.tooltip", "Oil Extraction Pump"); - provider.add("gtceu.machine.hv_fluid_drilling_rig.tooltip", "Does not perform Fracking"); - provider.add("gtceu.machine.ev_fluid_drilling_rig.tooltip", "Well Drainer"); provider.add("gtceu.multiblock.fluid_rig.drilled_fluid", "Fluid: %s"); provider.add("gtceu.multiblock.fluid_rig.no_fluid_in_area", "None in Area."); provider.add("gtceu.multiblock.fluid_rig.fluid_amount", "Pumping Rate: %s"); @@ -828,7 +829,7 @@ private static void generateCustomMultiblockTooltips(GTLangProvider provider) { provider.add("gtceu.multiblock.ore_rig.ore_amount", "Drilling Rate: %s"); // Cleanroom - provider.add("gtceu.machine.cleanroom.tooltip", "Keeping those pesky particles out"); + provider.add("machine.gtceu.cleanroom.tooltip", "Keeping those pesky particles out"); provider.addMultiLang("gtceu.machine.cleanroom.tooltip", "Place machines inside to run cleanroom recipes.", "Uses §f30 EU/t§7 when dirty, §f4 EU/t§7 when clean.", @@ -887,7 +888,7 @@ private static void generateCustomMultiblockTooltips(GTLangProvider provider) { provider.add("gtceu.multiblock.active_transformer.danger_enabled", "§c§bDANGER: Explosive"); // Charcoal Pile Ignitor - provider.add("gtceu.machine.charcoal_pile.tooltip", "Underground fuel bakery"); + provider.add("machine.gtceu.charcoal_pile_igniter.tooltip", "Underground fuel bakery"); provider.addMultiLang("gtceu.machine.charcoal_pile.tooltip", "Turns Logs into §aCharcoal§7 when §cignited§7.", "Right Click with fire-starting items to start.", From 0c115ff607262319150dd68f005fea1cbdec0a71 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Fri, 22 May 2026 17:27:48 -0600 Subject: [PATCH 33/45] slams keyboard --- .../resources/assets/gtceu/lang/en_ud.json | 5982 ----------------- .../resources/assets/gtceu/lang/en_us.json | 2140 +++--- .../gtceu/api/block/MetaMachineBlock.java | 6 +- .../gtceu/api/cover/filter/TagFilter.java | 1 - .../api/gui/widget/ToggleButtonWidget.java | 1 - .../AutoOutputFluidConfigHandler.java | 7 +- .../handlers/AutoOutputItemConfigHandler.java | 7 +- .../api/item/component/ElectricStats.java | 9 +- .../gtceu/api/machine/MetaMachine.java | 6 +- .../api/machine/SimpleTieredMachine.java | 2 - .../CircuitFancyConfigurator.java | 1 - .../api/placeholder/PlaceholderHandler.java | 6 +- .../api/registry/registrate/GTRegistrate.java | 1 - .../registrate/provider/GTLangProvider.java | 19 +- .../gtceu/client/TooltipsHandler.java | 3 +- .../gregtechceu/gtceu/common/CommonProxy.java | 8 +- .../gtceu/common/block/LaserPipeBlock.java | 2 - .../gtceu/common/block/OpticalPipeBlock.java | 2 - .../common/cover/ComputerMonitorCover.java | 15 +- .../gtceu/common/data/GTItems.java | 3 - .../gtceu/common/data/GTRecipeTypes.java | 5 +- .../common/data/machines/GCYMMachines.java | 3 +- .../common/data/machines/GTMachineUtils.java | 5 +- .../common/data/machines/GTMultiMachines.java | 2 +- .../common/item/armor/NanoMuscleSuite.java | 6 +- .../common/item/armor/QuarkTechSuite.java | 11 +- .../machine/electric/BlockBreakerMachine.java | 5 +- .../machine/electric/FisherMachine.java | 5 +- .../electric/ItemCollectorMachine.java | 5 +- .../common/machine/electric/MinerMachine.java | 3 - .../electric/CentralMonitorMachine.java | 6 +- .../gtceu/data/GregTechDatagen.java | 5 +- .../gtceu/data/lang/ArmorLang.java | 17 +- .../gtceu/data/lang/BlockLang.java | 6 +- .../gtceu/data/lang/CommandLang.java | 55 +- .../gtceu/data/lang/CoverLang.java | 5 +- .../gregtechceu/gtceu/data/lang/GUILang.java | 49 +- .../gtceu/data/lang/HazardLang.java | 64 +- .../gtceu/data/lang/IntegrationLang.java | 3 + .../gregtechceu/gtceu/data/lang/ItemLang.java | 40 +- .../gregtechceu/gtceu/data/lang/LangUtil.java | 8 +- .../gtceu/data/lang/MachineLang.java | 367 +- .../gtceu/data/lang/MaterialLang.java | 168 +- .../gtceu/data/lang/RecipeLang.java | 14 +- .../gregtechceu/gtceu/data/lang/ToolLang.java | 12 + .../xei/widgets/GTRecipeWidget.java | 4 +- 46 files changed, 1762 insertions(+), 7332 deletions(-) delete mode 100644 src/generated/resources/assets/gtceu/lang/en_ud.json diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json deleted file mode 100644 index 0d9e0086a6a..00000000000 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ /dev/null @@ -1,5982 +0,0 @@ -{ - "behavior.data_item.data": "%sɐ§ -", - "behavior.data_item.title": ":ɐʇɐᗡ uoıʇɔnɹʇsuoƆ %su§", - "behavior.item_magnet.disabled": "pǝןqɐsıᗡ pןǝıℲ ɔıʇǝubɐWɔ§", - "behavior.item_magnet.enabled": "pǝןqɐuƎ pןǝıℲ ɔıʇǝubɐWɐ§", - "behavior.portable_scanner.amp_per_sec": "Ɐ %s :)puoɔǝs ʇsɐן( ǝbɐɹǝʌⱯ", - "behavior.portable_scanner.bedrock_fluid.amount": "%s%% - %s %s :ʇısodǝᗡ uI pınןℲ", - "behavior.portable_scanner.bedrock_fluid.amount_unknown": "%s%% :ʇısodǝᗡ uI pınןℲ", - "behavior.portable_scanner.bedrock_fluid.nothing": "ɹ§buıɥʇoN9§ :ʇısodǝᗡ uI pınןℲ", - "behavior.portable_scanner.block_hardness": "%s :ǝɔuɐʇsısǝᴚ ʇsɐןᗺ %s :ssǝupɹɐH", - "behavior.portable_scanner.block_name": "%s :ɐʇɐᗡɐʇǝW %s :ǝɯɐN", - "behavior.portable_scanner.debug_cpu_load": "˙su%s ɟo ǝɯıʇ ʇsɹoʍ ɥʇıʍ sʞɔıʇ %s ɹǝʌo su%s~ ɟo pɐoן ∩ԀƆ ǝbɐɹǝʌⱯ", - "behavior.portable_scanner.debug_cpu_load_seconds": "˙spuoɔǝs %s sı sıɥ⟘", - "behavior.portable_scanner.debug_lag_count": "˙ɹǝʌɹǝS ǝɥʇ uo )sɯ%s uɐɥʇ ɹǝbuoן buıʞɐʇ buıɥʇʎuɐ( sbuıuɹɐM ǝʞıdS bɐꞀ %s pǝsnɐƆ", - "behavior.portable_scanner.debug_machine": "%s :ᗡI-ɐʇǝW", - "behavior.portable_scanner.debug_machine_invalid": "¡pıןɐʌuı ", - "behavior.portable_scanner.debug_machine_valid": "pıןɐʌ ", - "behavior.portable_scanner.divider": "=========================", - "behavior.portable_scanner.energy_container_in": "Ɐ %s ʇɐ ∩Ǝ )%s( %s :NI xɐW", - "behavior.portable_scanner.energy_container_out": "Ɐ %s ʇɐ ∩Ǝ )%s( %s :⟘∩O xɐW", - "behavior.portable_scanner.energy_container_storage": "∩Ǝ %s / ∩Ǝ %s :ʎbɹǝuƎ", - "behavior.portable_scanner.environmental_hazard": "ɯdd %s - ɹ§%s :ʞunɥƆ uI pɹɐzɐH ןɐʇuǝɯuoɹıʌuƎ", - "behavior.portable_scanner.environmental_hazard.nothing": "ɹ§buıɥʇoN9§ :ʞunɥƆ uI pɹɐzɐH ןɐʇuǝɯuoɹıʌuƎ", - "behavior.portable_scanner.eu_per_sec": "ʇ/∩Ǝ %s :)puoɔǝs ʇsɐן( ǝbɐɹǝʌⱯ", - "behavior.portable_scanner.guild_name": "ɹ§%s :ǝɯɐN pןın⅁ᄅ§", - "behavior.portable_scanner.local_hazard": "ɯdd %s - ɹ§%s :ɐǝɹⱯ uI pɹɐzɐH ןɐɔoꞀ", - "behavior.portable_scanner.local_hazard.nothing": "ɹ§buıɥʇoN9§ :ɐǝɹⱯ uI pɹɐzɐH ןɐɔoꞀ", - "behavior.portable_scanner.machine_disabled": "˙pǝןqɐsıᗡ", - "behavior.portable_scanner.machine_front_facing": "%s :buıɔɐℲ ʇuoɹℲ", - "behavior.portable_scanner.machine_ownership": "ɹ§%s :ǝdʎ⟘ ɹǝuʍO ǝuıɥɔɐWᄅ§", - "behavior.portable_scanner.machine_power_loss": "˙ssoן ɹǝʍod oʇ ǝnp uʍop ʇnɥS", - "behavior.portable_scanner.machine_progress": "%s / %s :pɐoꞀ/ssǝɹboɹԀ", - "behavior.portable_scanner.machine_upwards_facing": "%s :buıɔɐℲ spɹɐʍd∩", - "behavior.portable_scanner.mode.caption": "%s :ǝpoɯ ʎɐןdsıᗡ", - "behavior.portable_scanner.mode.show_all_info": ")oɟuı ןɐuɹǝʇuı buıpnןɔxǝ( oɟuı ןןɐ ʍoɥS", - "behavior.portable_scanner.mode.show_block_info": "oɟuı ʞɔoןq ʍoɥS", - "behavior.portable_scanner.mode.show_electrical_info": "oɟuı ןɐɔıɹʇɔǝןǝ ʍoɥS", - "behavior.portable_scanner.mode.show_environmental_info": "oɟuı ןɐʇuǝɯuoɹıʌuǝ ʍoɥS", - "behavior.portable_scanner.mode.show_internal_info": "oɟuı buıbbnqǝp ןɐuɹǝʇuı ʍoɥS", - "behavior.portable_scanner.mode.show_machine_info": "oɟuı ǝuıɥɔɐɯ ʍoɥS", - "behavior.portable_scanner.mode.show_recipe_info": "oɟuı ǝdıɔǝɹ ʍoɥS", - "behavior.portable_scanner.muffled": "˙pǝןɟɟnW", - "behavior.portable_scanner.multiblock_energy_input": "%s :ɹǝı⟘ ʇ/∩Ǝ %s :ǝɯoɔuI ʎbɹǝuƎ xɐW", - "behavior.portable_scanner.multiblock_energy_output": "%s :ɹǝı⟘ ʇ/∩Ǝ %s :ʇndʇnO ʎbɹǝuƎ xɐW", - "behavior.portable_scanner.multiblock_maintenance": "%s :sɯǝןqoɹԀ", - "behavior.portable_scanner.multiblock_parallel": "%s :buıssǝɔoɹԀ ıʇןnW", - "behavior.portable_scanner.player_name": "ɹ§%s :ǝuıןuO ɹǝʎɐןԀㄥ§ 'ɹ§%s :ǝɯɐN ɹǝʎɐןԀᄅ§", - "behavior.portable_scanner.position": "----- %s :ᗡ %s :Z %s :ʎ %s :X -----", - "behavior.portable_scanner.state": "%s :%s", - "behavior.portable_scanner.tank": "%s ᗺɯ %s / ᗺɯ %s :%s ʞuɐ⟘", - "behavior.portable_scanner.tanks_empty": "ʎʇdɯƎ sʞuɐ⟘ ןןⱯ", - "behavior.portable_scanner.team_name": "ɹ§%s :ǝɯɐN ɯɐǝ⟘ᄅ§", - "behavior.portable_scanner.workable_consumption": "Ɐ %s ʇɐ ʇ/∩Ǝ %s :sǝs∩ ʎןqɐqoɹԀ", - "behavior.portable_scanner.workable_production": "Ɐ %s ʇɐ ʇ/∩Ǝ %s :sǝɔnpoɹԀ ʎןqɐqoɹԀ", - "behavior.portable_scanner.workable_progress": "s %s / s %s :ssǝɹboɹԀ", - "behavior.portable_scanner.workable_stored_energy": "∩Ǝ %s / ∩Ǝ %s :ʎbɹǝuƎ pǝɹoʇS", - "behavior.prospector.added_waypoint": "¡%s pǝɯɐu ʇuıodʎɐʍ pǝʇɐǝɹƆ", - "behavior.prospector.not_enough_energy": "¡ʎbɹǝuƎ ɥbnouƎ ʇoN", - "behavior.toggle_energy_consumer.tooltip": "ǝpoɯ ǝןbboʇ oʇ ǝs∩", - "behaviour.boor.by": "%s ʎq", - "behaviour.hammer": ")ɯǝɥʇ buıʇʇıɥ ʎq( sǝuıɥɔɐW ɹoɟ buıןɟɟnW ɟɟo puɐ uo suɹn⟘", - "behaviour.hoe": "ʇɹıp ןןıʇ uɐƆ", - "behaviour.lighter.fluid.tooltip": "ǝuɐdoɹԀ ɹo ǝuɐʇnᗺ ɥʇıʍ ǝɹıɟ uo sbuıɥʇ ʇɥbıן uɐƆ", - "behaviour.lighter.tooltip.description": "ǝɹıɟ uo sbuıɥʇ ʇɥbıן uɐƆ", - "behaviour.lighter.tooltip.usage": "ǝsoןɔ/uǝdo oʇ ʞɔıןɔ ʇɥbıɹ-ʇɟıɥS", - "behaviour.lighter.uses": "%d :sǝsn buıuıɐɯǝᴚ", - "behaviour.memory_card.client_msg.cleared": "pǝɹɐǝןɔ uoıʇɐɹnbıɟuoɔ pǝɹoʇS", - "behaviour.memory_card.client_msg.copied": "uoıʇɐɹnbıɟuoɔ ǝuıɥɔɐɯ pǝıdoƆ", - "behaviour.memory_card.client_msg.missing_items": "uoıʇɐɹnbıɟuoɔ ǝʇsɐd oʇ pǝɹınbǝɹ sɯǝʇı buıssıW", - "behaviour.memory_card.client_msg.pasted": "uoıʇɐɹnbıɟuoɔ ǝuıɥɔɐɯ pǝıןddⱯ", - "behaviour.memory_card.copy_target": "%s :buıʎdoƆ", - "behaviour.memory_card.disabled": "ɹ§pǝןqɐsıᗡɔ§", - "behaviour.memory_card.enabled": "ɹ§pǝןqɐuƎɐ§", - "behaviour.memory_card.tooltip.copy": "˙pǝʇǝbɹɐʇ sı ǝdıd ɹo ǝuıɥɔɐɯ ɐ uɐɥʇ ɹǝɥʇo ʞɔoןq ɐ ɟı ɐʇɐp pǝɹoʇs ɹɐǝןɔ ɹo 'uoıʇɐɹnbıɟuoɔ ʎdoɔ oʇ ʞɔıןƆ-ᴚ + ʞɐǝuSㄥ§", - "behaviour.memory_card.tooltip.items_to_paste": ":uoıʇɐɹnbıɟuoɔ sıɥʇ ǝʇsɐd oʇ pǝpǝǝu ǝɹɐ sɯǝʇı buıʍoןןoɟ ǝɥ⟘", - "behaviour.memory_card.tooltip.paste": "uoıʇɐɹnbıɟuoɔ ǝuıɥɔɐɯ ǝʇsɐd oʇ ʞɔıןƆ-ᴚㄥ§", - "behaviour.memory_card.tooltip.view_stored": ">uoıʇɐɹnbıɟuoɔ pǝɹoʇs ʍǝıʌ oʇ ʞɐǝuS<8§", - "behaviour.paintspray.black.tooltip": "ʞɔɐןᗺ uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.blue.tooltip": "ǝnןᗺ uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.brown.tooltip": "uʍoɹᗺ uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.cyan.tooltip": "uɐʎƆ uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.gray.tooltip": "ʎɐɹ⅁ uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.green.tooltip": "uǝǝɹ⅁ uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.light_blue.tooltip": "ǝnןᗺ ʇɥbıꞀ uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.light_gray.tooltip": "ʎɐɹ⅁ ʇɥbıꞀ uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.lime.tooltip": "ǝɯıꞀ uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.magenta.tooltip": "ɐʇuǝbɐW uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.orange.tooltip": "ǝbuɐɹO uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.pink.tooltip": "ʞuıԀ uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.purple.tooltip": "ǝןdɹnԀ uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.red.tooltip": "pǝᴚ uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.solvent.tooltip": "sbuıɥʇ ɯoɹɟ ɹoןoɔ ǝʌoɯǝɹ uɐƆ", - "behaviour.paintspray.uses": "%d :sǝs∩ buıuıɐɯǝᴚ", - "behaviour.paintspray.white.tooltip": "ǝʇıɥM uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.paintspray.yellow.tooltip": "ʍoןןǝʎ uı sbuıɥʇ ʇuıɐd uɐƆ", - "behaviour.prospecting": "buıʇɔǝdsoɹԀ ɹoɟ ǝןqɐs∩", - "behaviour.setting.tooltip.allow_input": "ɹ§ʇnduI ʍoןןⱯᄅ§", - "behaviour.setting.tooltip.auto_output": "ɹ§ʇndʇnO oʇnⱯᄅ§", - "behaviour.setting.tooltip.auto_output_allow_input": "ɹ§ʇnduI ʍoןןⱯ/ʇndʇnO oʇnⱯᄅ§", - "behaviour.setting.tooltip.circuit_config": " :ʇınɔɹıƆ pǝɯɯɐɹboɹԀ", - "behaviour.setting.tooltip.fluid_io": ")%s( %s :ʇndʇnO pınןℲ", - "behaviour.setting.tooltip.item_io": ")%s( %s :ʇndʇnO ɯǝʇI", - "behaviour.setting.tooltip.muffled": "%s buıןɟɟnW", - "behaviour.setting.tooltip.pipe_blocked_connections": "%s :sǝpıs pǝɹǝʇʇnɥs ǝdıԀ", - "behaviour.setting.tooltip.pipe_connections": "%s :suoıʇɔǝuuoɔ ǝdıԀ", - "behaviour.soft_hammer": "sǝuıɥɔɐW sǝʇɐʌıʇɔɐǝᗡ puɐ sǝʇɐʌıʇɔⱯ", - "behaviour.soft_hammer.disabled": "pǝןqɐsıᗡ buıʞɹoM", - "behaviour.soft_hammer.disabled_cycle": "ǝןɔʎɔ ʇuǝɹɹnɔ ɹǝʇɟɐ pǝןqɐsıᗡ buıʞɹoM", - "behaviour.soft_hammer.enabled": "pǝןqɐuƎ buıʞɹoM", - "behaviour.wrench": "ʞɔıןɔʇɥbıᴚ uo sʞɔoןᗺ sǝʇɐʇoᴚ", - "block.filter_casing.tooltip": "ʇuǝɯuoɹıʌuǝ ㄥ§ǝǝɹℲ-ǝןɔıʇɹɐԀɐ§ ɐ sǝʇɐǝɹƆ", - "block.gtceu.acid_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH pıɔⱯ", - "block.gtceu.active_transformer": "ɹǝɯɹoɟsuɐɹ⟘ ǝʌıʇɔⱯ", - "block.gtceu.advanced_computer_casing": "buısɐƆ ɹǝʇndɯoƆ pǝɔuɐʌpⱯ", - "block.gtceu.advanced_data_access_hatch": "ɥɔʇɐH ssǝɔɔⱯ ɐʇɐᗡ pǝɔuɐʌpⱯ", - "block.gtceu.advanced_monitor": "ɹoʇıuoW pǝɔuɐʌpⱯ", - "block.gtceu.alloy_blast_smelter": "ɹǝʇןǝɯS ʇsɐןᗺ ʎoןןⱯ", - "block.gtceu.aluminium_crate": "ǝʇɐɹƆ ɯnıuıɯnןⱯ", - "block.gtceu.aluminium_drum": "ɯnɹᗡ ɯnıuıɯnןⱯ", - "block.gtceu.antimatter_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH ɹǝʇʇɐɯıʇuⱯ", - "block.gtceu.assembly_line": "ǝuıꞀ ʎןqɯǝssⱯ", - "block.gtceu.assembly_line_casing": "buısɐƆ ǝuıꞀ ʎןqɯǝssⱯ", - "block.gtceu.assembly_line_grating": "buıʇɐɹ⅁ ǝuıꞀ ʎןqɯǝssⱯ", - "block.gtceu.assembly_line_unit": "buısɐƆ ןoɹʇuoƆ ʎןqɯǝssⱯ", - "block.gtceu.atomic_casing": "buısɐƆ ɔıɯoʇⱯ", - "block.gtceu.auto_maintenance_hatch": "ɥɔʇɐH ǝɔuɐuǝʇuıɐW oʇnⱯ", - "block.gtceu.basic_data_access_hatch": "ɥɔʇɐH ssǝɔɔⱯ ɐʇɐᗡ ɔısɐᗺ", - "block.gtceu.bio_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH oıᗺ", - "block.gtceu.black_borderless_lamp": "dɯɐꞀ ssǝןɹǝpɹoᗺ ʞɔɐןᗺ", - "block.gtceu.black_lamp": "dɯɐꞀ ʞɔɐןᗺ", - "block.gtceu.black_large_metal_sheet": "ʇǝǝɥS ןɐʇǝW ǝbɹɐꞀ ʞɔɐןᗺ", - "block.gtceu.black_metal_sheet": "ʇǝǝɥS ןɐʇǝW ʞɔɐןᗺ", - "block.gtceu.black_studs": "spnʇS ʞɔɐןᗺ", - "block.gtceu.blue_borderless_lamp": "dɯɐꞀ ssǝןɹǝpɹoᗺ ǝnןᗺ", - "block.gtceu.blue_lamp": "dɯɐꞀ ǝnןᗺ", - "block.gtceu.blue_large_metal_sheet": "ʇǝǝɥS ןɐʇǝW ǝbɹɐꞀ ǝnןᗺ", - "block.gtceu.blue_metal_sheet": "ʇǝǝɥS ןɐʇǝW ǝnןᗺ", - "block.gtceu.blue_studs": "spnʇS ǝnןᗺ", - "block.gtceu.boss_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH ssoᗺ", - "block.gtceu.brittle_charcoal": "ןɐoɔɹɐɥƆ ǝןʇʇıɹᗺ", - "block.gtceu.bronze_brick_casing": "buısɐƆ ǝzuoɹᗺ pǝʞɔıɹᗺ", - "block.gtceu.bronze_crate": "ǝʇɐɹƆ ǝzuoɹᗺ", - "block.gtceu.bronze_drum": "ɯnɹᗡ ǝzuoɹᗺ", - "block.gtceu.bronze_firebox_casing": "buısɐƆ xoqǝɹıℲ ǝzuoɹᗺ", - "block.gtceu.bronze_gearbox": "buısɐƆ xoqɹɐǝ⅁ ǝzuoɹᗺ", - "block.gtceu.bronze_large_boiler": "ɹǝןıoᗺ ǝzuoɹᗺ ǝbɹɐꞀ", - "block.gtceu.bronze_machine_casing": "buısɐƆ ǝuıɥɔɐW ǝzuoɹᗺ", - "block.gtceu.bronze_multiblock_tank": "ʞuɐ⟘ ʞɔoןqıʇןnW ǝzuoɹᗺ", - "block.gtceu.bronze_pipe_casing": "buısɐƆ ǝdıԀ ǝzuoɹᗺ", - "block.gtceu.bronze_tank_valve": "ǝʌןɐΛ ʞuɐ⟘ ǝzuoɹᗺ", - "block.gtceu.brown_borderless_lamp": "dɯɐꞀ ssǝןɹǝpɹoᗺ uʍoɹᗺ", - "block.gtceu.brown_lamp": "dɯɐꞀ uʍoɹᗺ", - "block.gtceu.brown_large_metal_sheet": "ʇǝǝɥS ןɐʇǝW ǝbɹɐꞀ uʍoɹᗺ", - "block.gtceu.brown_metal_sheet": "ʇǝǝɥS ןɐʇǝW uʍoɹᗺ", - "block.gtceu.brown_studs": "spnʇS uʍoɹᗺ", - "block.gtceu.casing_coke_bricks": "sʞɔıɹᗺ uǝʌO ǝʞoƆ", - "block.gtceu.casing_grate": "buısɐƆ ǝuıɥɔɐW ǝʇɐɹ⅁", - "block.gtceu.causality_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH ʎʇıןɐsnɐƆ", - "block.gtceu.central_monitor": "ɹoʇıuoW ןɐɹʇuǝƆ", - "block.gtceu.charcoal_pile_igniter": "ɹǝʇıubI ǝןıԀ ןɐoɔɹɐɥƆ", - "block.gtceu.chiseled_dark_concrete": "ǝʇǝɹɔuoƆ ʞɹɐᗡ pǝןǝsıɥƆ", - "block.gtceu.chiseled_light_concrete": "ǝʇǝɹɔuoƆ ʇɥbıꞀ pǝןǝsıɥƆ", - "block.gtceu.chiseled_marble": "ǝןqɹɐW pǝןǝsıɥƆ", - "block.gtceu.chiseled_red_granite": "ǝʇıuɐɹ⅁ pǝᴚ pǝןǝsıɥƆ", - "block.gtceu.clean_machine_casing": "buısɐƆ ןǝǝʇS ssǝןuıɐʇS uɐǝןƆ", - "block.gtceu.cleaning_maintenance_hatch": "ɥɔʇɐH ǝɔuɐuǝʇuıɐW buıuɐǝןƆ", - "block.gtceu.cleanroom": "ɯooɹuɐǝןƆ", - "block.gtceu.cleanroom_glass": "ssɐן⅁ ɯooɹuɐǝןƆ", - "block.gtceu.coke_oven": "uǝʌO ǝʞoƆ", - "block.gtceu.coke_oven_bricks": "sʞɔıɹᗺ uǝʌO ǝʞoƆ", - "block.gtceu.coke_oven_hatch": "ɥɔʇɐH uǝʌO ǝʞoƆ", - "block.gtceu.computation_receiver_hatch": "ɥɔʇɐH uoıʇdǝɔǝᴚ ɐʇɐᗡ uoıʇɐʇndɯoƆ", - "block.gtceu.computation_transmitter_hatch": "ɥɔʇɐH uoıssıɯsuɐɹ⟘ ɐʇɐᗡ uoıʇɐʇndɯoƆ", - "block.gtceu.computer_casing": "buısɐƆ ɹǝʇndɯoƆ", - "block.gtceu.computer_heat_vent": "ʇuǝΛ ʇɐǝH ɹǝʇndɯoƆ", - "block.gtceu.configurable_maintenance_hatch": "ɥɔʇɐH ǝɔuɐuǝʇuıɐW ǝןqɐɹnbıɟuoƆ", - "block.gtceu.corrosion_proof_casing": "buısɐƆ ɟooɹԀ uoısoɹɹoƆ", - "block.gtceu.cracked_dark_concrete_bricks": "sʞɔıɹᗺ ǝʇǝɹɔuoƆ ʞɹɐᗡ pǝʞɔɐɹƆ", - "block.gtceu.cracked_light_concrete_bricks": "sʞɔıɹᗺ ǝʇǝɹɔuoƆ ʇɥbıꞀ pǝʞɔɐɹƆ", - "block.gtceu.cracked_marble_bricks": "sʞɔıɹᗺ ǝןqɹɐW pǝʞɔɐɹƆ", - "block.gtceu.cracked_red_granite_bricks": "sʞɔıɹᗺ ǝʇıuɐɹ⅁ pǝᴚ pǝʞɔɐɹƆ", - "block.gtceu.cracker": "ɹǝʞɔɐɹƆ", - "block.gtceu.creative_chest": "ʇsǝɥƆ ǝʌıʇɐǝɹƆ", - "block.gtceu.creative_computation_provider": "ɹǝpıʌoɹԀ uoıʇɐʇndɯoƆ ǝʌıʇɐǝɹƆ", - "block.gtceu.creative_data_access_hatch": "ɥɔʇɐH ssǝɔɔⱯ ɐʇɐᗡ ǝʌıʇɐǝɹƆ", - "block.gtceu.creative_energy": "ʎbɹǝuƎ ǝʌıʇɐǝɹƆ", - "block.gtceu.creative_tank": "ʞuɐ⟘ ǝʌıʇɐǝɹƆ", - "block.gtceu.creosote": "ǝʇosoǝɹƆ", - "block.gtceu.crushing_wheels": "sןǝǝɥM buıɥsnɹƆ", - "block.gtceu.cupronickel_coil_block": "ʞɔoןᗺ ןıoƆ ןǝʞɔıuoɹdnƆ", - "block.gtceu.cyan_borderless_lamp": "dɯɐꞀ ssǝןɹǝpɹoᗺ uɐʎƆ", - "block.gtceu.cyan_lamp": "dɯɐꞀ uɐʎƆ", - "block.gtceu.cyan_large_metal_sheet": "ʇǝǝɥS ןɐʇǝW ǝbɹɐꞀ uɐʎƆ", - "block.gtceu.cyan_metal_sheet": "ʇǝǝɥS ןɐʇǝW uɐʎƆ", - "block.gtceu.cyan_studs": "spnʇS uɐʎƆ", - "block.gtceu.dark_concrete": "ǝʇǝɹɔuoƆ ʞɹɐᗡ", - "block.gtceu.dark_concrete_bricks": "sʞɔıɹᗺ ǝʇǝɹɔuoƆ ʞɹɐᗡ", - "block.gtceu.dark_concrete_cobblestone": "ǝuoʇsǝןqqoƆ ǝʇǝɹɔuoƆ ʞɹɐᗡ", - "block.gtceu.dark_concrete_small_tile": "ǝןı⟘ ןןɐɯS ǝʇǝɹɔuoƆ ʞɹɐᗡ", - "block.gtceu.dark_concrete_tile": "ǝןı⟘ ǝʇǝɹɔuoƆ ʞɹɐᗡ", - "block.gtceu.dark_concrete_windmill_a": "Ɐ ןןıɯpuıM ǝʇǝɹɔuoƆ ʞɹɐᗡ", - "block.gtceu.dark_concrete_windmill_b": "ᗺ ןןıɯpuıM ǝʇǝɹɔuoƆ ʞɹɐᗡ", - "block.gtceu.data_access_hatch": "ɥɔʇɐH ssǝɔɔⱯ ɐʇɐᗡ", - "block.gtceu.data_bank": "ʞuɐᗺ ɐʇɐᗡ", - "block.gtceu.data_receiver_hatch": "ɥɔʇɐH uoıʇdǝɔǝᴚ ɐʇɐᗡ ןɐɔıʇdO", - "block.gtceu.data_transmitter_hatch": "ɥɔʇɐH uoıssıɯsuɐɹ⟘ ɐʇɐᗡ ןɐɔıʇdO", - "block.gtceu.distillation_tower": "ɹǝʍo⟘ uoıʇɐןןıʇsıᗡ", - "block.gtceu.electric_blast_furnace": "ǝɔɐuɹnℲ ʇsɐןᗺ ɔıɹʇɔǝןƎ", - "block.gtceu.electrolytic_cell": "ןןǝƆ ɔıʇʎןoɹʇɔǝןƎ", - "block.gtceu.empty_tier_i_battery": "ɹoʇıɔɐdɐƆ I ɹǝı⟘ ʎʇdɯƎ", - "block.gtceu.empty_tier_ii_battery": "ɹoʇıɔɐdɐƆ II ɹǝı⟘ ʎʇdɯƎ", - "block.gtceu.empty_tier_iii_battery": "ɹoʇıɔɐdɐƆ III ɹǝı⟘ ʎʇdɯƎ", - "block.gtceu.engine_intake_casing": "buısɐƆ ǝʞɐʇuI ǝuıbuƎ", - "block.gtceu.ev_16a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§9Ɩ ɹ§ΛƎϛ§", - "block.gtceu.ev_1a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§Ɩ ɹ§ΛƎϛ§", - "block.gtceu.ev_4a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§ㄣ ɹ§ΛƎϛ§", - "block.gtceu.ev_8a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§8 ɹ§ΛƎϛ§", - "block.gtceu.ev_air_scrubber": "ɹ§III ɹǝqqnɹɔS ɹıⱯ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_alloy_smelter": "ɹ§III ɹǝʇןǝɯS ʎoןןⱯ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_arc_furnace": "ɹ§III ǝɔɐuɹnℲ ɔɹⱯ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_assembler": "ɹ§III ɹǝןqɯǝssⱯ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_autoclave": "ɹ§III ǝʌɐןɔoʇnⱯ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_battery_buffer_16x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x9Ɩ ɹ§ǝbɐʇןoΛ ǝɯǝɹʇxƎϛ§", - "block.gtceu.ev_battery_buffer_4x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ xㄣ ɹ§ǝbɐʇןoΛ ǝɯǝɹʇxƎϛ§", - "block.gtceu.ev_battery_buffer_8x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x8 ɹ§ǝbɐʇןoΛ ǝɯǝɹʇxƎϛ§", - "block.gtceu.ev_bedrock_ore_miner": "ɹ§III ɹǝuıW ǝɹO ʞɔoɹpǝᗺ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_bender": "ɹ§III ɹǝpuǝᗺ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_block_breaker": "ɹ§III ɹǝʞɐǝɹᗺ ʞɔoןᗺ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_brewery": "ɹ§III ʎɹǝʍǝɹᗺ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_canner": "ɹ§III ɹǝuuɐƆ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_centrifuge": "ɹ§III ǝbnɟıɹʇuǝƆ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_charger_4x": "ɹǝbɹɐɥƆ oqɹn⟘ xㄣ ɹ§ǝbɐʇןoΛ ǝɯǝɹʇxƎϛ§", - "block.gtceu.ev_chemical_bath": "ɹ§III ɥʇɐᗺ ןɐɔıɯǝɥƆ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_chemical_reactor": "ɹ§III ɹoʇɔɐǝᴚ ןɐɔıɯǝɥƆ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_circuit_assembler": "ɹ§III ɹǝןqɯǝssⱯ ʇınɔɹıƆ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_compressor": "ɹ§III ɹossǝɹdɯoƆ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_cutter": "ɹ§III ɹǝʇʇnƆ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_diode": "ǝpoıᗡ ΛƎϛ§", - "block.gtceu.ev_distillery": "ɹ§III ʎɹǝןןıʇsıᗡ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_electric_furnace": "ɹ§III ǝɔɐuɹnℲ ɔıɹʇɔǝןƎ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_electrolyzer": "ɹ§III ɹǝzʎןoɹʇɔǝןƎ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_electromagnetic_separator": "ɹ§III ɹoʇɐɹɐdǝS ɔıʇǝubɐɯoɹʇɔǝןƎ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_energy_input_hatch": "ɥɔʇɐH ʎbɹǝuƎ ΛƎϛ§", - "block.gtceu.ev_energy_input_hatch_16a": "ɥɔʇɐH ʎbɹǝuƎ Ɐ9Ɩ ΛƎϛ§", - "block.gtceu.ev_energy_input_hatch_4a": "ɥɔʇɐH ʎbɹǝuƎ Ɐㄣ ΛƎϛ§", - "block.gtceu.ev_energy_output_hatch": "ɥɔʇɐH oɯɐuʎᗡ ΛƎϛ§", - "block.gtceu.ev_energy_output_hatch_16a": "ɥɔʇɐH oɯɐuʎᗡ Ɐ9Ɩ ΛƎϛ§", - "block.gtceu.ev_energy_output_hatch_4a": "ɥɔʇɐH oɯɐuʎᗡ Ɐㄣ ΛƎϛ§", - "block.gtceu.ev_extractor": "ɹ§III ɹoʇɔɐɹʇxƎ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_extruder": "ɹ§III ɹǝpnɹʇxƎ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_fermenter": "ɹ§III ɹǝʇuǝɯɹǝℲ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_fisher": "ɹ§III ɹǝɥsıℲ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_fluid_drilling_rig": "ɹ§III bıᴚ buıןןıɹᗡ pınןℲ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_fluid_heater": "ɹ§III ɹǝʇɐǝH pınןℲ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_fluid_passthrough_hatch": "ɥɔʇɐH ɥbnoɹɥʇssɐԀ pınןℲ ΛƎϛ§", - "block.gtceu.ev_fluid_solidifier": "ɹ§III ɹǝıɟıpıןoS pınןℲ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_forge_hammer": "ɹ§III ɹǝɯɯɐH ǝbɹoℲ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_forming_press": "ɹ§III ssǝɹԀ buıɯɹoℲ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_gas_collector": "ɹ§III ɹoʇɔǝןןoƆ sɐ⅁ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_hermetic_casing": "ΛI buısɐƆ ɔıʇǝɯɹǝH", - "block.gtceu.ev_input_bus": "snᗺ ʇnduI ΛƎϛ§", - "block.gtceu.ev_input_hatch": "ɥɔʇɐH ʇnduI ΛƎϛ§", - "block.gtceu.ev_input_hatch_4x": "ɥɔʇɐH ʇnduI ǝןdnɹpɐnὉ ΛƎϛ§", - "block.gtceu.ev_input_hatch_9x": "ɥɔʇɐH ʇnduI ǝןdnuoN ΛƎϛ§", - "block.gtceu.ev_item_collector": "ɹ§III ɹoʇɔǝןןoƆ ɯǝʇI pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_item_passthrough_hatch": "ɥɔʇɐH ɥbnoɹɥʇssɐԀ ɯǝʇI ΛƎϛ§", - "block.gtceu.ev_lapotronic_battery": "ɹoʇıɔɐdɐƆ ɔıuoɹʇodɐꞀ ΛƎ", - "block.gtceu.ev_large_miner": "ɹ§III ɹǝuıW ǝbɹɐꞀ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_laser_engraver": "ɹ§III ɹǝʌɐɹbuƎ ɹǝsɐꞀ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_lathe": "ɹ§III ǝɥʇɐꞀ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_macerator": "ɹ§III ɹoʇɐɹǝɔɐW pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_machine_casing": "buısɐƆ ǝuıɥɔɐW ΛƎ", - "block.gtceu.ev_machine_hull": "ןןnH ǝuıɥɔɐWɟ§ ΛƎϛ§", - "block.gtceu.ev_mixer": "ɹ§III ɹǝxıW pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_muffler_hatch": "ΛƎϛ§ ɥɔʇɐH ɹǝןɟɟnW", - "block.gtceu.ev_ore_washer": "ɹ§III ɹǝɥsɐM ǝɹO pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_output_bus": "snᗺ ʇndʇnO ΛƎϛ§", - "block.gtceu.ev_output_hatch": "ɥɔʇɐH ʇndʇnO ΛƎϛ§", - "block.gtceu.ev_output_hatch_4x": "ɥɔʇɐH ʇndʇnO ǝןdnɹpɐnὉ ΛƎϛ§", - "block.gtceu.ev_output_hatch_9x": "ɥɔʇɐH ʇndʇnO ǝןdnuoN ΛƎϛ§", - "block.gtceu.ev_packer": "ɹ§III ɹǝʞɔɐԀ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_polarizer": "ɹ§III ɹǝzıɹɐןoԀ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_pump": "ɹ§III dɯnԀ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_rock_crusher": "ɹ§III ɹǝɥsnɹƆ ʞɔoᴚ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_rotor_holder": "ɹǝpןoH ɹoʇoᴚ ΛƎϛ§", - "block.gtceu.ev_scanner": "ɹ§III ɹǝuuɐɔS pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_sifter": "ɹ§III ɹǝʇɟıS pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_substation_input_hatch_64a": "ɥɔʇɐH ʎbɹǝuƎ uoıʇɐʇsqnS Ɐㄣ9 ΛƎϛ§", - "block.gtceu.ev_substation_output_hatch_64a": "ɥɔʇɐH oɯɐuʎᗡ uoıʇɐʇsqnS Ɐㄣ9 ΛƎϛ§", - "block.gtceu.ev_super_chest": "ΛI ʇsǝɥƆ ɹǝdnS", - "block.gtceu.ev_super_tank": "ΛI ʞuɐ⟘ ɹǝdnS", - "block.gtceu.ev_thermal_centrifuge": "ɹ§III ǝbnɟıɹʇuǝƆ ןɐɯɹǝɥ⟘ pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_transformer_16a": "ɹǝɯɹoɟsuɐɹ⟘ ɹǝʍoԀ ɹ§ǝbɐʇןoΛ ǝɯǝɹʇxƎϛ§", - "block.gtceu.ev_transformer_1a": "ɹǝɯɹoɟsuɐɹ⟘ ɹ§ǝbɐʇןoΛ ǝɯǝɹʇxƎϛ§", - "block.gtceu.ev_transformer_2a": "ɹǝɯɹoɟsuɐɹ⟘ )xᄅ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ ǝɯǝɹʇxƎϛ§", - "block.gtceu.ev_transformer_4a": "ɹǝɯɹoɟsuɐɹ⟘ )xㄣ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ ǝɯǝɹʇxƎϛ§", - "block.gtceu.ev_wiremill": "ɹ§III ןןıɯǝɹıM pǝɔuɐʌpⱯϛ§", - "block.gtceu.ev_world_accelerator": "ɹ§III ɹoʇɐɹǝןǝɔɔⱯ pןɹoM pǝɔuɐʌpⱯϛ§", - "block.gtceu.explosion_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH uoısoןdxƎ", - "block.gtceu.explosive.breaking_tooltip": "dn ʞɔɐq ʞɔıd oʇ ǝuıɯ ʞɐǝus 'pǝuıɯ uǝɥʍ uoısoןdxǝ sǝɯıɹԀ", - "block.gtceu.explosive.lighting_tooltip": "ǝuoʇspǝᴚ ɥʇıʍ ʇıן ǝq ʇouuɐƆ", - "block.gtceu.extreme_combustion_engine": "ǝuıbuƎ uoıʇsnqɯoƆ ǝɯǝɹʇxƎ", - "block.gtceu.extreme_engine_intake_casing": "buısɐƆ ǝʞɐʇuI ǝuıbuƎ ǝɯǝɹʇxƎ", - "block.gtceu.filter_casing": "buısɐƆ ɹǝʇןıℲ", - "block.gtceu.fire_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH ǝɹıℲ", - "block.gtceu.firebricks": "sʞɔıɹqǝɹıℲ", - "block.gtceu.foam": "ɯɐoℲ", - "block.gtceu.frost_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH ʇsoɹℲ", - "block.gtceu.frostproof_machine_casing": "buısɐƆ ǝuıɥɔɐW ɯnıuıɯnןⱯ ɟooɹԀ ʇsoɹℲ", - "block.gtceu.fusion_casing": "buısɐƆ ǝuıɥɔɐW uoısnℲ", - "block.gtceu.fusion_casing_mk2": "II ʞW buısɐƆ ǝuıɥɔɐW uoısnℲ", - "block.gtceu.fusion_casing_mk3": "III ʞW buısɐƆ ǝuıɥɔɐW uoısnℲ", - "block.gtceu.fusion_coil": "ʞɔoןᗺ ןıoƆ uoısnℲ", - "block.gtceu.fusion_glass": "ssɐן⅁ uoısnℲ", - "block.gtceu.gas_large_turbine": "ǝuıqɹn⟘ sɐ⅁ ǝbɹɐꞀ", - "block.gtceu.generic_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH ɔıɹǝuǝ⅁", - "block.gtceu.gold_drum": "ɯnɹᗡ pןo⅁", - "block.gtceu.gray_borderless_lamp": "dɯɐꞀ ssǝןɹǝpɹoᗺ ʎɐɹ⅁", - "block.gtceu.gray_lamp": "dɯɐꞀ ʎɐɹ⅁", - "block.gtceu.gray_large_metal_sheet": "ʇǝǝɥS ןɐʇǝW ǝbɹɐꞀ ʎɐɹ⅁", - "block.gtceu.gray_metal_sheet": "ʇǝǝɥS ןɐʇǝW ʎɐɹ⅁", - "block.gtceu.gray_studs": "spnʇS ʎɐɹ⅁", - "block.gtceu.green_borderless_lamp": "dɯɐꞀ ssǝןɹǝpɹoᗺ uǝǝɹ⅁", - "block.gtceu.green_lamp": "dɯɐꞀ uǝǝɹ⅁", - "block.gtceu.green_large_metal_sheet": "ʇǝǝɥS ןɐʇǝW ǝbɹɐꞀ uǝǝɹ⅁", - "block.gtceu.green_metal_sheet": "ʇǝǝɥS ןɐʇǝW uǝǝɹ⅁", - "block.gtceu.green_studs": "spnʇS uǝǝɹ⅁", - "block.gtceu.gregification_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH uoıʇɐɔıɟıbǝɹ⅁", - "block.gtceu.heat_vent": "ʇuǝΛ ʇɐǝH", - "block.gtceu.heatproof_machine_casing": "buısɐƆ ǝuıɥɔɐW ɹɐʌuI ɟooɹԀ ʇɐǝH", - "block.gtceu.high_performance_computation_array": ")ⱯƆԀH( ʎɐɹɹⱯ uoıʇɐʇndɯoƆ ǝɔuɐɯɹoɟɹǝԀ ɥbıH", - "block.gtceu.high_power_casing": "buısɐƆ ɹǝʍoԀ ɥbıH", - "block.gtceu.high_pressure_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH ǝɹnssǝɹԀ ɥbıH", - "block.gtceu.high_temperature_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH ǝɹnʇɐɹǝdɯǝ⟘ ɥbıH", - "block.gtceu.high_temperature_smelting_casing": "buısɐƆ buıʇןǝɯS ǝɹnʇɐɹǝdɯǝ⟘ ɥbıH", - "block.gtceu.high_voltage_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH ǝbɐʇןoΛ ɥbıH", - "block.gtceu.hp_steam_alloy_smelter": "ɹǝʇןǝɯS ʎoןןⱯ ɯɐǝʇS ǝɹnssǝɹԀ ɥbıH", - "block.gtceu.hp_steam_compressor": "ɹossǝɹdɯoƆ ɯɐǝʇS ǝɹnssǝɹԀ ɥbıH", - "block.gtceu.hp_steam_extractor": "ɹoʇɔɐɹʇxƎ ɯɐǝʇS ǝɹnssǝɹԀ ɥbıH", - "block.gtceu.hp_steam_forge_hammer": "ɹǝɯɯɐH ǝbɹoℲ ɯɐǝʇS ǝɹnssǝɹԀ ɥbıH", - "block.gtceu.hp_steam_furnace": "ǝɔɐuɹnℲ ɯɐǝʇS ǝɹnssǝɹԀ ɥbıH", - "block.gtceu.hp_steam_liquid_boiler": "ɹǝןıoᗺ pınbıꞀ ɯɐǝʇS ǝɹnssǝɹԀ ɥbıH", - "block.gtceu.hp_steam_macerator": "ɹoʇɐɹǝɔɐW ɯɐǝʇS ǝɹnssǝɹԀ ɥbıH", - "block.gtceu.hp_steam_miner": "ɹǝuıW ɯɐǝʇS ǝɹnssǝɹԀ ɥbıH", - "block.gtceu.hp_steam_rock_crusher": "ɹǝɥsnɹƆ ʞɔoᴚ ɯɐǝʇS ǝɹnssǝɹԀ ɥbıH", - "block.gtceu.hp_steam_solar_boiler": "ɹǝןıoᗺ ɹɐןoS ɯɐǝʇS ǝɹnssǝɹԀ ɥbıH", - "block.gtceu.hp_steam_solid_boiler": "ɹǝןıoᗺ pıןoS ɯɐǝʇS ǝɹnssǝɹԀ ɥbıH", - "block.gtceu.hpca_active_cooler_component": "ʇuǝuodɯoƆ buıןooƆ ǝʌıʇɔⱯ ⱯƆԀH", - "block.gtceu.hpca_advanced_computation_component": "ʇuǝuodɯoƆ uoıʇɐʇndɯoƆ pǝɔuɐʌpⱯ ⱯƆԀH", - "block.gtceu.hpca_bridge_component": "ʇuǝuodɯoƆ ǝbpıɹᗺ ⱯƆԀH", - "block.gtceu.hpca_computation_component": "ʇuǝuodɯoƆ uoıʇɐʇndɯoƆ ⱯƆԀH", - "block.gtceu.hpca_empty_component": "ʇuǝuodɯoƆ ⱯƆԀH ʎʇdɯƎ", - "block.gtceu.hpca_heat_sink_component": "ʇuǝuodɯoƆ ʞuıS ʇɐǝH ⱯƆԀH", - "block.gtceu.hssg_coil_block": "ʞɔoןᗺ ןıoƆ ⅁-SSH", - "block.gtceu.huge_duct_pipe": "ǝdıԀ ʇɔnᗡ ǝbnH", - "block.gtceu.hv_16a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§9Ɩ ɹ§ΛH9§", - "block.gtceu.hv_1a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§Ɩ ɹ§ΛH9§", - "block.gtceu.hv_4a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§ㄣ ɹ§ΛH9§", - "block.gtceu.hv_8a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§8 ɹ§ΛH9§", - "block.gtceu.hv_air_scrubber": "ɹ§II ɹǝqqnɹɔS ɹıⱯ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_alloy_smelter": "ɹ§II ɹǝʇןǝɯS ʎoןןⱯ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_arc_furnace": "ɹ§II ǝɔɐuɹnℲ ɔɹⱯ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_assembler": "ɹ§II ɹǝןqɯǝssⱯ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_autoclave": "ɹ§II ǝʌɐןɔoʇnⱯ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_battery_buffer_16x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x9Ɩ ɹ§ǝbɐʇןoΛ ɥbıH9§", - "block.gtceu.hv_battery_buffer_4x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ xㄣ ɹ§ǝbɐʇןoΛ ɥbıH9§", - "block.gtceu.hv_battery_buffer_8x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x8 ɹ§ǝbɐʇןoΛ ɥbıH9§", - "block.gtceu.hv_bedrock_ore_miner": "ɹ§II ɹǝuıW ǝɹO ʞɔoɹpǝᗺ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_bender": "ɹ§II ɹǝpuǝᗺ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_block_breaker": "ɹ§II ɹǝʞɐǝɹᗺ ʞɔoןᗺ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_brewery": "ɹ§II ʎɹǝʍǝɹᗺ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_buffer": "ɹ§II ɹǝɟɟnᗺ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_canner": "ɹ§II ɹǝuuɐƆ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_centrifuge": "ɹ§II ǝbnɟıɹʇuǝƆ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_charger_4x": "ɹǝbɹɐɥƆ oqɹn⟘ xㄣ ɹ§ǝbɐʇןoΛ ɥbıH9§", - "block.gtceu.hv_chemical_bath": "ɹ§II ɥʇɐᗺ ןɐɔıɯǝɥƆ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_chemical_reactor": "ɹ§II ɹoʇɔɐǝᴚ ןɐɔıɯǝɥƆ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_circuit_assembler": "ɹ§II ɹǝןqɯǝssⱯ ʇınɔɹıƆ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_combustion": "ɹ§II ɹoʇɐɹǝuǝ⅁ uoıʇsnqɯoƆ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_compressor": "ɹ§II ɹossǝɹdɯoƆ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_cutter": "ɹ§II ɹǝʇʇnƆ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_diode": "ǝpoıᗡ ΛH9§", - "block.gtceu.hv_distillery": "ɹ§II ʎɹǝןןıʇsıᗡ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_electric_furnace": "ɹ§II ǝɔɐuɹnℲ ɔıɹʇɔǝןƎ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_electrolyzer": "ɹ§II ɹǝzʎןoɹʇɔǝןƎ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_electromagnetic_separator": "ɹ§II ɹoʇɐɹɐdǝS ɔıʇǝubɐɯoɹʇɔǝןƎ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_energy_input_hatch": "ɥɔʇɐH ʎbɹǝuƎ ΛH9§", - "block.gtceu.hv_energy_output_hatch": "ɥɔʇɐH oɯɐuʎᗡ ΛH9§", - "block.gtceu.hv_extractor": "ɹ§II ɹoʇɔɐɹʇxƎ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_extruder": "ɹ§II ɹǝpnɹʇxƎ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_fermenter": "ɹ§II ɹǝʇuǝɯɹǝℲ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_fisher": "ɹ§II ɹǝɥsıℲ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_fluid_drilling_rig": "ɹ§II bıᴚ buıןןıɹᗡ pınןℲ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_fluid_heater": "ɹ§II ɹǝʇɐǝH pınןℲ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_fluid_passthrough_hatch": "ɥɔʇɐH ɥbnoɹɥʇssɐԀ pınןℲ ΛH9§", - "block.gtceu.hv_fluid_solidifier": "ɹ§II ɹǝıɟıpıןoS pınןℲ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_forge_hammer": "ɹ§II ɹǝɯɯɐH ǝbɹoℲ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_forming_press": "ɹ§II ssǝɹԀ buıɯɹoℲ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_gas_collector": "ɹ§II ɹoʇɔǝןןoƆ sɐ⅁ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_gas_turbine": "ɹ§II ɹoʇɐɹǝuǝ⅁ ǝuıqɹn⟘ sɐ⅁ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_hermetic_casing": "III buısɐƆ ɔıʇǝɯɹǝH", - "block.gtceu.hv_input_bus": "snᗺ ʇnduI ΛH9§", - "block.gtceu.hv_input_hatch": "ɥɔʇɐH ʇnduI ΛH9§", - "block.gtceu.hv_item_collector": "ɹ§II ɹoʇɔǝןןoƆ ɯǝʇI pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_item_passthrough_hatch": "ɥɔʇɐH ɥbnoɹɥʇssɐԀ ɯǝʇI ΛH9§", - "block.gtceu.hv_laser_engraver": "ɹ§II ɹǝʌɐɹbuƎ ɹǝsɐꞀ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_lathe": "ɹ§II ǝɥʇɐꞀ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_macerator": "ɹ§II ɹoʇɐɹǝɔɐW pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_machine_casing": "buısɐƆ ǝuıɥɔɐW ΛH", - "block.gtceu.hv_machine_hull": "ןןnH ǝuıɥɔɐWɟ§ ΛH9§", - "block.gtceu.hv_miner": "ɹ§II ɹǝuıW pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_mixer": "ɹ§II ɹǝxıW pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_muffler_hatch": "ΛH9§ ɥɔʇɐH ɹǝןɟɟnW", - "block.gtceu.hv_ore_washer": "ɹ§II ɹǝɥsɐM ǝɹO pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_output_bus": "snᗺ ʇndʇnO ΛH9§", - "block.gtceu.hv_output_hatch": "ɥɔʇɐH ʇndʇnO ΛH9§", - "block.gtceu.hv_packer": "ɹ§II ɹǝʞɔɐԀ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_polarizer": "ɹ§II ɹǝzıɹɐןoԀ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_pump": "ɹ§II dɯnԀ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_rock_crusher": "ɹ§II ɹǝɥsnɹƆ ʞɔoᴚ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_rotor_holder": "ɹǝpןoH ɹoʇoᴚ ΛH9§", - "block.gtceu.hv_scanner": "ɹ§II ɹǝuuɐɔS pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_sifter": "ɹ§II ɹǝʇɟıS pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_steam_turbine": "ɹ§II ɹoʇɐɹǝuǝ⅁ ǝuıqɹn⟘ ɯɐǝʇS pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_super_chest": "III ʇsǝɥƆ ɹǝdnS", - "block.gtceu.hv_super_tank": "III ʞuɐ⟘ ɹǝdnS", - "block.gtceu.hv_thermal_centrifuge": "ɹ§II ǝbnɟıɹʇuǝƆ ןɐɯɹǝɥ⟘ pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_transformer_16a": "ɹǝɯɹoɟsuɐɹ⟘ ɹǝʍoԀ ɹ§ǝbɐʇןoΛ ɥbıH9§", - "block.gtceu.hv_transformer_1a": "ɹǝɯɹoɟsuɐɹ⟘ ɹ§ǝbɐʇןoΛ ɥbıH9§", - "block.gtceu.hv_transformer_2a": "ɹǝɯɹoɟsuɐɹ⟘ )xᄅ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ ɥbıH9§", - "block.gtceu.hv_transformer_4a": "ɹǝɯɹoɟsuɐɹ⟘ )xㄣ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ ɥbıH9§", - "block.gtceu.hv_wiremill": "ɹ§II ןןıɯǝɹıM pǝɔuɐʌpⱯ9§", - "block.gtceu.hv_world_accelerator": "ɹ§II ɹoʇɐɹǝןǝɔɔⱯ pןɹoM pǝɔuɐʌpⱯ9§", - "block.gtceu.implosion_compressor": "ɹossǝɹdɯoƆ uoısoןdɯI", - "block.gtceu.industrial_steam_casing": "buısɐƆ ɯɐǝʇS ןɐıɹʇsnpuI", - "block.gtceu.industrial_tnt": "⟘N⟘ ןɐıɹʇsnpuI", - "block.gtceu.inert_machine_casing": "buısɐƆ ǝuıɥɔɐW ƎℲ⟘Ԁ ʇɹǝuI ʎןןɐɔıɯǝɥƆ", - "block.gtceu.itnt.drops_tooltip": "sɯǝʇI sɐ sʞɔoןᗺ pǝʎoɹʇsǝp ןןɐ sdoɹp '⟘N⟘ uɐɥʇ ɹǝbɹɐן ɥɔnW", - "block.gtceu.iv_1024a_laser_source_hatch": "ɥɔʇɐH ǝɔɹnoS ɹǝsɐꞀ ɹ§Ɐǝ§ㄣᄅ0'Ɩ ɹ§ΛI6§", - "block.gtceu.iv_1024a_laser_target_hatch": "ɥɔʇɐH ʇǝbɹɐ⟘ ɹǝsɐꞀ ɹ§Ɐǝ§ㄣᄅ0'Ɩ ɹ§ΛI6§", - "block.gtceu.iv_16a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§9Ɩ ɹ§ΛI6§", - "block.gtceu.iv_1a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§Ɩ ɹ§ΛI6§", - "block.gtceu.iv_256a_laser_source_hatch": "ɥɔʇɐH ǝɔɹnoS ɹǝsɐꞀ ɹ§Ɐǝ§9ϛᄅ ɹ§ΛI6§", - "block.gtceu.iv_256a_laser_target_hatch": "ɥɔʇɐH ʇǝbɹɐ⟘ ɹǝsɐꞀ ɹ§Ɐǝ§9ϛᄅ ɹ§ΛI6§", - "block.gtceu.iv_4096a_laser_source_hatch": "ɥɔʇɐH ǝɔɹnoS ɹǝsɐꞀ ɹ§Ɐǝ§960'ㄣ ɹ§ΛI6§", - "block.gtceu.iv_4096a_laser_target_hatch": "ɥɔʇɐH ʇǝbɹɐ⟘ ɹǝsɐꞀ ɹ§Ɐǝ§960'ㄣ ɹ§ΛI6§", - "block.gtceu.iv_4a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§ㄣ ɹ§ΛI6§", - "block.gtceu.iv_8a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§8 ɹ§ΛI6§", - "block.gtceu.iv_alloy_smelter": "ɹ§ ɹǝʇןǝɯS ʎoןןⱯ ǝʇıןƎ6§", - "block.gtceu.iv_arc_furnace": "ɹ§ ǝɔɐuɹnℲ ɔɹⱯ ǝʇıןƎ6§", - "block.gtceu.iv_assembler": "ɹ§ ɹǝןqɯǝssⱯ ǝʇıןƎ6§", - "block.gtceu.iv_autoclave": "ɹ§ ǝʌɐןɔoʇnⱯ ǝʇıןƎ6§", - "block.gtceu.iv_battery_buffer_16x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x9Ɩ ɹ§ǝbɐʇןoΛ ǝuɐsuI6§", - "block.gtceu.iv_battery_buffer_4x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ xㄣ ɹ§ǝbɐʇןoΛ ǝuɐsuI6§", - "block.gtceu.iv_battery_buffer_8x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x8 ɹ§ǝbɐʇןoΛ ǝuɐsuI6§", - "block.gtceu.iv_bender": "ɹ§ ɹǝpuǝᗺ ǝʇıןƎ6§", - "block.gtceu.iv_brewery": "ɹ§ ʎɹǝʍǝɹᗺ ǝʇıןƎ6§", - "block.gtceu.iv_canner": "ɹ§ ɹǝuuɐƆ ǝʇıןƎ6§", - "block.gtceu.iv_centrifuge": "ɹ§ ǝbnɟıɹʇuǝƆ ǝʇıןƎ6§", - "block.gtceu.iv_charger_4x": "ɹǝbɹɐɥƆ oqɹn⟘ xㄣ ɹ§ǝbɐʇןoΛ ǝuɐsuI6§", - "block.gtceu.iv_chemical_bath": "ɹ§ ɥʇɐᗺ ןɐɔıɯǝɥƆ ǝʇıןƎ6§", - "block.gtceu.iv_chemical_reactor": "ɹ§ ɹoʇɔɐǝᴚ ןɐɔıɯǝɥƆ ǝʇıןƎ6§", - "block.gtceu.iv_circuit_assembler": "ɹ§ ɹǝןqɯǝssⱯ ʇınɔɹıƆ ǝʇıןƎ6§", - "block.gtceu.iv_compressor": "ɹ§ ɹossǝɹdɯoƆ ǝʇıןƎ6§", - "block.gtceu.iv_cutter": "ɹ§ ɹǝʇʇnƆ ǝʇıןƎ6§", - "block.gtceu.iv_diode": "ǝpoıᗡ ΛI6§", - "block.gtceu.iv_distillery": "ɹ§ ʎɹǝןןıʇsıᗡ ǝʇıןƎ6§", - "block.gtceu.iv_electric_furnace": "ɹ§ ǝɔɐuɹnℲ ɔıɹʇɔǝןƎ ǝʇıןƎ6§", - "block.gtceu.iv_electrolyzer": "ɹ§ ɹǝzʎןoɹʇɔǝןƎ ǝʇıןƎ6§", - "block.gtceu.iv_electromagnetic_separator": "ɹ§ ɹoʇɐɹɐdǝS ɔıʇǝubɐɯoɹʇɔǝןƎ ǝʇıןƎ6§", - "block.gtceu.iv_energy_input_hatch": "ɥɔʇɐH ʎbɹǝuƎ ΛI6§", - "block.gtceu.iv_energy_input_hatch_16a": "ɥɔʇɐH ʎbɹǝuƎ Ɐ9Ɩ ΛI6§", - "block.gtceu.iv_energy_input_hatch_4a": "ɥɔʇɐH ʎbɹǝuƎ Ɐㄣ ΛI6§", - "block.gtceu.iv_energy_output_hatch": "ɥɔʇɐH oɯɐuʎᗡ ΛI6§", - "block.gtceu.iv_energy_output_hatch_16a": "ɥɔʇɐH oɯɐuʎᗡ Ɐ9Ɩ ΛI6§", - "block.gtceu.iv_energy_output_hatch_4a": "ɥɔʇɐH oɯɐuʎᗡ Ɐㄣ ΛI6§", - "block.gtceu.iv_extractor": "ɹ§ ɹoʇɔɐɹʇxƎ ǝʇıןƎ6§", - "block.gtceu.iv_extruder": "ɹ§ ɹǝpnɹʇxƎ ǝʇıןƎ6§", - "block.gtceu.iv_fermenter": "ɹ§ ɹǝʇuǝɯɹǝℲ ǝʇıןƎ6§", - "block.gtceu.iv_fisher": "ɹ§ ɹǝɥsıℲ ǝʇıןƎ6§", - "block.gtceu.iv_fluid_heater": "ɹ§ ɹǝʇɐǝH pınןℲ ǝʇıןƎ6§", - "block.gtceu.iv_fluid_passthrough_hatch": "ɥɔʇɐH ɥbnoɹɥʇssɐԀ pınןℲ ΛI6§", - "block.gtceu.iv_fluid_solidifier": "ɹ§ ɹǝıɟıpıןoS pınןℲ ǝʇıןƎ6§", - "block.gtceu.iv_forge_hammer": "ɹ§ ɹǝɯɯɐH ǝbɹoℲ ǝʇıןƎ6§", - "block.gtceu.iv_forming_press": "ɹ§ ssǝɹԀ buıɯɹoℲ ǝʇıןƎ6§", - "block.gtceu.iv_gas_collector": "ɹ§ ɹoʇɔǝןןoƆ sɐ⅁ ǝʇıןƎ6§", - "block.gtceu.iv_hermetic_casing": "Λ buısɐƆ ɔıʇǝɯɹǝH", - "block.gtceu.iv_input_bus": "snᗺ ʇnduI ΛI6§", - "block.gtceu.iv_input_hatch": "ɥɔʇɐH ʇnduI ΛI6§", - "block.gtceu.iv_input_hatch_4x": "ɥɔʇɐH ʇnduI ǝןdnɹpɐnὉ ΛI6§", - "block.gtceu.iv_input_hatch_9x": "ɥɔʇɐH ʇnduI ǝןdnuoN ΛI6§", - "block.gtceu.iv_item_passthrough_hatch": "ɥɔʇɐH ɥbnoɹɥʇssɐԀ ɯǝʇI ΛI6§", - "block.gtceu.iv_lapotronic_battery": "ɹoʇıɔɐdɐƆ ɔıuoɹʇodɐꞀ ΛI", - "block.gtceu.iv_large_miner": "ɹ§ ɹǝuıW ǝbɹɐꞀ ǝʇıןƎ6§", - "block.gtceu.iv_laser_engraver": "ɹ§ ɹǝʌɐɹbuƎ ɹǝsɐꞀ ǝʇıןƎ6§", - "block.gtceu.iv_lathe": "ɹ§ ǝɥʇɐꞀ ǝʇıןƎ6§", - "block.gtceu.iv_macerator": "ɹ§ ɹoʇɐɹǝɔɐW ǝʇıןƎ6§", - "block.gtceu.iv_machine_casing": "buısɐƆ ǝuıɥɔɐW ΛI", - "block.gtceu.iv_machine_hull": "ןןnH ǝuıɥɔɐWɟ§ ΛI6§", - "block.gtceu.iv_mixer": "ɹ§ ɹǝxıW ǝʇıןƎ6§", - "block.gtceu.iv_muffler_hatch": "ΛI6§ ɥɔʇɐH ɹǝןɟɟnW", - "block.gtceu.iv_ore_washer": "ɹ§ ɹǝɥsɐM ǝɹO ǝʇıןƎ6§", - "block.gtceu.iv_output_bus": "snᗺ ʇndʇnO ΛI6§", - "block.gtceu.iv_output_hatch": "ɥɔʇɐH ʇndʇnO ΛI6§", - "block.gtceu.iv_output_hatch_4x": "ɥɔʇɐH ʇndʇnO ǝןdnɹpɐnὉ ΛI6§", - "block.gtceu.iv_output_hatch_9x": "ɥɔʇɐH ʇndʇnO ǝןdnuoN ΛI6§", - "block.gtceu.iv_packer": "ɹ§ ɹǝʞɔɐԀ ǝʇıןƎ6§", - "block.gtceu.iv_parallel_hatch": "ɥɔʇɐH ןoɹʇuoƆ ןǝןןɐɹɐԀ ǝʇıןƎ", - "block.gtceu.iv_polarizer": "ɹ§ ɹǝzıɹɐןoԀ ǝʇıןƎ6§", - "block.gtceu.iv_quantum_chest": "Λ ʇsǝɥƆ ɯnʇuɐnὉ", - "block.gtceu.iv_quantum_tank": "Λ ʞuɐ⟘ ɯnʇuɐnὉ", - "block.gtceu.iv_rock_crusher": "ɹ§ ɹǝɥsnɹƆ ʞɔoᴚ ǝʇıןƎ6§", - "block.gtceu.iv_rotor_holder": "ɹǝpןoH ɹoʇoᴚ ΛI6§", - "block.gtceu.iv_scanner": "ɹ§ ɹǝuuɐɔS ǝʇıןƎ6§", - "block.gtceu.iv_sifter": "ɹ§ ɹǝʇɟıS ǝʇıןƎ6§", - "block.gtceu.iv_substation_input_hatch_64a": "ɥɔʇɐH ʎbɹǝuƎ uoıʇɐʇsqnS Ɐㄣ9 ΛI6§", - "block.gtceu.iv_substation_output_hatch_64a": "ɥɔʇɐH oɯɐuʎᗡ uoıʇɐʇsqnS Ɐㄣ9 ΛI6§", - "block.gtceu.iv_thermal_centrifuge": "ɹ§ ǝbnɟıɹʇuǝƆ ןɐɯɹǝɥ⟘ ǝʇıןƎ6§", - "block.gtceu.iv_transformer_16a": "ɹǝɯɹoɟsuɐɹ⟘ ɹǝʍoԀ ɹ§ǝbɐʇןoΛ ǝuɐsuI6§", - "block.gtceu.iv_transformer_1a": "ɹǝɯɹoɟsuɐɹ⟘ ɹ§ǝbɐʇןoΛ ǝuɐsuI6§", - "block.gtceu.iv_transformer_2a": "ɹǝɯɹoɟsuɐɹ⟘ )xᄅ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ ǝuɐsuI6§", - "block.gtceu.iv_transformer_4a": "ɹǝɯɹoɟsuɐɹ⟘ )xㄣ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ ǝuɐsuI6§", - "block.gtceu.iv_wiremill": "ɹ§ ןןıɯǝɹıM ǝʇıןƎ6§", - "block.gtceu.iv_world_accelerator": "ɹ§ ɹoʇɐɹǝןǝɔɔⱯ pןɹoM ǝʇıןƎ6§", - "block.gtceu.kanthal_coil_block": "ʞɔoןᗺ ןıoƆ ןɐɥʇuɐʞ", - "block.gtceu.laminated_glass": "ssɐן⅁ pǝʇɐuıɯɐꞀ", - "block.gtceu.lamp.tooltip.inverted": "pǝʇɹǝʌuI", - "block.gtceu.lamp.tooltip.no_bloom": "ɯooןᗺ oN", - "block.gtceu.lamp.tooltip.no_light": "ʇɥbıꞀ oN", - "block.gtceu.large_arc_smelter": "ɹǝʇןǝɯS ɔɹⱯ ǝbɹɐꞀ", - "block.gtceu.large_assembler": "ʎɹoʇɔɐℲ buıןqɯǝssⱯ ǝbɹɐꞀ", - "block.gtceu.large_autoclave": "ɹǝqɯɐɥƆ uoıʇɐzıןןɐʇsʎɹƆ ǝbɹɐꞀ", - "block.gtceu.large_brewer": "ʇɐΛ buıʍǝɹᗺ ǝbɹɐꞀ", - "block.gtceu.large_centrifuge": "ʇıu∩ ןɐbnɟıɹʇuǝƆ ǝbɹɐꞀ", - "block.gtceu.large_chemical_bath": "ɥʇɐᗺ ןɐɔıɯǝɥƆ ǝbɹɐꞀ", - "block.gtceu.large_chemical_reactor": "ɹoʇɔɐǝᴚ ןɐɔıɯǝɥƆ ǝbɹɐꞀ", - "block.gtceu.large_circuit_assembler": "ʎʇıןıɔɐℲ buıןqɯǝssⱯ ʇınɔɹıƆ ǝbɹɐꞀ", - "block.gtceu.large_combustion_engine": "ǝuıbuƎ uoıʇsnqɯoƆ ǝbɹɐꞀ", - "block.gtceu.large_cutter": "ʍɐS buıʇʇnƆ ǝbɹɐꞀ", - "block.gtceu.large_distillery": "ʎɹǝןןıʇsıᗡ buıʇɐuoıʇɔɐɹℲ ǝbɹɐꞀ", - "block.gtceu.large_duct_pipe": "ǝdıԀ ʇɔnᗡ ǝbɹɐꞀ", - "block.gtceu.large_electrolyzer": "ɹǝqɯɐɥƆ sısʎןoɹʇɔǝןƎ ǝbɹɐꞀ", - "block.gtceu.large_electromagnet": "ʇǝubɐɯoɹʇɔǝןƎ ǝbɹɐꞀ", - "block.gtceu.large_engraving_laser": "ɹǝsɐꞀ buıʌɐɹbuƎ ǝbɹɐꞀ", - "block.gtceu.large_extractor": "ǝuıɥɔɐW uoıʇɔɐɹʇxƎ ǝbɹɐꞀ", - "block.gtceu.large_extruder": "ǝuıɥɔɐW uoısnɹʇxƎ ǝbɹɐꞀ", - "block.gtceu.large_maceration_tower": "ɹǝʍo⟘ uoıʇɐɹǝɔɐW ǝbɹɐꞀ", - "block.gtceu.large_material_press": "ssǝɹԀ ןɐıɹǝʇɐW ǝbɹɐꞀ", - "block.gtceu.large_mixer": "ןǝssǝΛ buıxıW ǝbɹɐꞀ", - "block.gtceu.large_packer": "ǝuıɥɔɐW buıbɐʞɔɐԀ ǝbɹɐꞀ", - "block.gtceu.large_scale_assembler_casing": "buısɐƆ ɹǝןqɯǝssⱯ ǝןɐɔS-ǝbɹɐꞀ", - "block.gtceu.large_sifting_funnel": "ןǝuunℲ buıʇɟıS ǝbɹɐꞀ", - "block.gtceu.large_solidifier": "ʎɐɹɹⱯ uoıʇɐɔıɟıpıןoS ǝbɹɐꞀ", - "block.gtceu.large_wiremill": "ʎɹoʇɔɐℲ ǝɹıM ǝbɹɐꞀ", - "block.gtceu.laser_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH ɹǝsɐꞀ", - "block.gtceu.laser_safe_engraving_casing": "buısɐƆ buıʌɐɹbuƎ ǝɟɐS-ɹǝsɐꞀ", - "block.gtceu.light_blue_borderless_lamp": "dɯɐꞀ ssǝןɹǝpɹoᗺ ǝnןᗺ ʇɥbıꞀ", - "block.gtceu.light_blue_lamp": "dɯɐꞀ ǝnןᗺ ʇɥbıꞀ", - "block.gtceu.light_blue_large_metal_sheet": "ʇǝǝɥS ןɐʇǝW ǝbɹɐꞀ ǝnןᗺ ʇɥbıꞀ", - "block.gtceu.light_blue_metal_sheet": "ʇǝǝɥS ןɐʇǝW ǝnןᗺ ʇɥbıꞀ", - "block.gtceu.light_blue_studs": "spnʇS ǝnןᗺ ʇɥbıꞀ", - "block.gtceu.light_concrete": "ǝʇǝɹɔuoƆ ʇɥbıꞀ", - "block.gtceu.light_concrete_bricks": "sʞɔıɹᗺ ǝʇǝɹɔuoƆ ʇɥbıꞀ", - "block.gtceu.light_concrete_cobblestone": "ǝuoʇsǝןqqoƆ ǝʇǝɹɔuoƆ ʇɥbıꞀ", - "block.gtceu.light_concrete_small_tile": "ǝןı⟘ ןןɐɯS ǝʇǝɹɔuoƆ ʇɥbıꞀ", - "block.gtceu.light_concrete_tile": "ǝןı⟘ ǝʇǝɹɔuoƆ ʇɥbıꞀ", - "block.gtceu.light_concrete_windmill_a": "Ɐ ןןıɯpuıM ǝʇǝɹɔuoƆ ʇɥbıꞀ", - "block.gtceu.light_concrete_windmill_b": "ᗺ ןןıɯpuıM ǝʇǝɹɔuoƆ ʇɥbıꞀ", - "block.gtceu.light_gray_borderless_lamp": "dɯɐꞀ ssǝןɹǝpɹoᗺ ʎɐɹ⅁ ʇɥbıꞀ", - "block.gtceu.light_gray_lamp": "dɯɐꞀ ʎɐɹ⅁ ʇɥbıꞀ", - "block.gtceu.light_gray_large_metal_sheet": "ʇǝǝɥS ןɐʇǝW ǝbɹɐꞀ ʎɐɹ⅁ ʇɥbıꞀ", - "block.gtceu.light_gray_metal_sheet": "ʇǝǝɥS ןɐʇǝW ʎɐɹ⅁ ʇɥbıꞀ", - "block.gtceu.light_gray_studs": "spnʇS ʎɐɹ⅁ ʇɥbıꞀ", - "block.gtceu.lime_borderless_lamp": "dɯɐꞀ ssǝןɹǝpɹoᗺ ǝɯıꞀ", - "block.gtceu.lime_lamp": "dɯɐꞀ ǝɯıꞀ", - "block.gtceu.lime_large_metal_sheet": "ʇǝǝɥS ןɐʇǝW ǝbɹɐꞀ ǝɯıꞀ", - "block.gtceu.lime_metal_sheet": "ʇǝǝɥS ןɐʇǝW ǝɯıꞀ", - "block.gtceu.lime_studs": "spnʇS ǝɯıꞀ", - "block.gtceu.long_distance_fluid_pipeline": "ǝuıןǝdıԀ pınןℲ ǝɔuɐʇsıᗡ buoꞀ", - "block.gtceu.long_distance_fluid_pipeline_endpoint": "ʇuıodpuƎ ǝuıןǝdıԀ pınןℲ ǝɔuɐʇsıᗡ buoꞀ", - "block.gtceu.long_distance_item_pipeline": "ǝuıןǝdıԀ ɯǝʇI ǝɔuɐʇsıᗡ buoꞀ", - "block.gtceu.long_distance_item_pipeline_endpoint": "ʇuıodpuƎ ǝuıןǝdıԀ ɯǝʇI ǝɔuɐʇsıᗡ buoꞀ", - "block.gtceu.long_distance_item_pipeline_input_endpoint": "ʇuıodpuƎ ʇnduI", - "block.gtceu.long_distance_item_pipeline_input_pos": "%s :ʇnduI - ", - "block.gtceu.long_distance_item_pipeline_network_header": ":ʞɹoʍʇǝN", - "block.gtceu.long_distance_item_pipeline_no_network": "punoɟ ʞɹoʍʇǝu oN", - "block.gtceu.long_distance_item_pipeline_output_endpoint": "ʇuıodpuƎ ʇndʇnO", - "block.gtceu.long_distance_item_pipeline_output_pos": "%s :ʇndʇnO - ", - "block.gtceu.long_distance_item_pipeline_pipe_count": "%s :sǝdıԀ - ", - "block.gtceu.lp_steam_alloy_smelter": "ɹǝʇןǝɯS ʎoןןⱯ ɯɐǝʇS ǝɹnssǝɹԀ ʍoꞀ", - "block.gtceu.lp_steam_compressor": "ɹossǝɹdɯoƆ ɯɐǝʇS ǝɹnssǝɹԀ ʍoꞀ", - "block.gtceu.lp_steam_extractor": "ɹoʇɔɐɹʇxƎ ɯɐǝʇS ǝɹnssǝɹԀ ʍoꞀ", - "block.gtceu.lp_steam_forge_hammer": "ɹǝɯɯɐH ǝbɹoℲ ɯɐǝʇS ǝɹnssǝɹԀ ʍoꞀ", - "block.gtceu.lp_steam_furnace": "ǝɔɐuɹnℲ ɯɐǝʇS ǝɹnssǝɹԀ ʍoꞀ", - "block.gtceu.lp_steam_liquid_boiler": "ɹǝןıoᗺ pınbıꞀ ɯɐǝʇS ǝɹnssǝɹԀ ʍoꞀ", - "block.gtceu.lp_steam_macerator": "ɹoʇɐɹǝɔɐW ɯɐǝʇS ǝɹnssǝɹԀ ʍoꞀ", - "block.gtceu.lp_steam_miner": "ɹǝuıW ɯɐǝʇS ǝɹnssǝɹԀ ʍoꞀ", - "block.gtceu.lp_steam_rock_crusher": "ɹǝɥsnɹƆ ʞɔoᴚ ɯɐǝʇS ǝɹnssǝɹԀ ʍoꞀ", - "block.gtceu.lp_steam_solar_boiler": "ɹǝןıoᗺ ɹɐןoS ɯɐǝʇS ǝɹnssǝɹԀ ʍoꞀ", - "block.gtceu.lp_steam_solid_boiler": "ɹǝןıoᗺ pıןoS ɯɐǝʇS ǝɹnssǝɹԀ ʍoꞀ", - "block.gtceu.luv_1024a_laser_source_hatch": "ɥɔʇɐH ǝɔɹnoS ɹǝsɐꞀ ɹ§Ɐǝ§ㄣᄅ0'Ɩ ɹ§ΛnꞀp§", - "block.gtceu.luv_1024a_laser_target_hatch": "ɥɔʇɐH ʇǝbɹɐ⟘ ɹǝsɐꞀ ɹ§Ɐǝ§ㄣᄅ0'Ɩ ɹ§ΛnꞀp§", - "block.gtceu.luv_16a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§9Ɩ ɹ§ΛnꞀp§", - "block.gtceu.luv_1a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§Ɩ ɹ§ΛnꞀp§", - "block.gtceu.luv_256a_laser_source_hatch": "ɥɔʇɐH ǝɔɹnoS ɹǝsɐꞀ ɹ§Ɐǝ§9ϛᄅ ɹ§ΛnꞀp§", - "block.gtceu.luv_256a_laser_target_hatch": "ɥɔʇɐH ʇǝbɹɐ⟘ ɹǝsɐꞀ ɹ§Ɐǝ§9ϛᄅ ɹ§ΛnꞀp§", - "block.gtceu.luv_4096a_laser_source_hatch": "ɥɔʇɐH ǝɔɹnoS ɹǝsɐꞀ ɹ§Ɐǝ§960'ㄣ ɹ§ΛnꞀp§", - "block.gtceu.luv_4096a_laser_target_hatch": "ɥɔʇɐH ʇǝbɹɐ⟘ ɹǝsɐꞀ ɹ§Ɐǝ§960'ㄣ ɹ§ΛnꞀp§", - "block.gtceu.luv_4a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§ㄣ ɹ§ΛnꞀp§", - "block.gtceu.luv_8a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§8 ɹ§ΛnꞀp§", - "block.gtceu.luv_alloy_smelter": "ɹ§II ɹǝʇןǝɯS ʎoןןⱯ ǝʇıןƎp§", - "block.gtceu.luv_arc_furnace": "ɹ§II ǝɔɐuɹnℲ ɔɹⱯ ǝʇıןƎp§", - "block.gtceu.luv_assembler": "ɹ§II ɹǝןqɯǝssⱯ ǝʇıןƎp§", - "block.gtceu.luv_autoclave": "ɹ§II ǝʌɐןɔoʇnⱯ ǝʇıןƎp§", - "block.gtceu.luv_battery_buffer_16x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x9Ɩ ɹ§ǝbɐʇןoΛ snoɹɔıpnꞀp§", - "block.gtceu.luv_battery_buffer_4x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ xㄣ ɹ§ǝbɐʇןoΛ snoɹɔıpnꞀp§", - "block.gtceu.luv_battery_buffer_8x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x8 ɹ§ǝbɐʇןoΛ snoɹɔıpnꞀp§", - "block.gtceu.luv_bender": "ɹ§II ɹǝpuǝᗺ ǝʇıןƎp§", - "block.gtceu.luv_brewery": "ɹ§II ʎɹǝʍǝɹᗺ ǝʇıןƎp§", - "block.gtceu.luv_canner": "ɹ§II ɹǝuuɐƆ ǝʇıןƎp§", - "block.gtceu.luv_centrifuge": "ɹ§II ǝbnɟıɹʇuǝƆ ǝʇıןƎp§", - "block.gtceu.luv_charger_4x": "ɹǝbɹɐɥƆ oqɹn⟘ xㄣ ɹ§ǝbɐʇןoΛ snoɹɔıpnꞀp§", - "block.gtceu.luv_chemical_bath": "ɹ§II ɥʇɐᗺ ןɐɔıɯǝɥƆ ǝʇıןƎp§", - "block.gtceu.luv_chemical_reactor": "ɹ§II ɹoʇɔɐǝᴚ ןɐɔıɯǝɥƆ ǝʇıןƎp§", - "block.gtceu.luv_circuit_assembler": "ɹ§II ɹǝןqɯǝssⱯ ʇınɔɹıƆ ǝʇıןƎp§", - "block.gtceu.luv_compressor": "ɹ§II ɹossǝɹdɯoƆ ǝʇıןƎp§", - "block.gtceu.luv_cutter": "ɹ§II ɹǝʇʇnƆ ǝʇıןƎp§", - "block.gtceu.luv_diode": "ǝpoıᗡ ΛnꞀp§", - "block.gtceu.luv_distillery": "ɹ§II ʎɹǝןןıʇsıᗡ ǝʇıןƎp§", - "block.gtceu.luv_dual_input_hatch": "ɥɔʇɐH ʇnduI ןɐnᗡ ΛnꞀp§", - "block.gtceu.luv_dual_output_hatch": "ɥɔʇɐH ʇndʇnO ןɐnᗡ ΛnꞀp§", - "block.gtceu.luv_electric_furnace": "ɹ§II ǝɔɐuɹnℲ ɔıɹʇɔǝןƎ ǝʇıןƎp§", - "block.gtceu.luv_electrolyzer": "ɹ§II ɹǝzʎןoɹʇɔǝןƎ ǝʇıןƎp§", - "block.gtceu.luv_electromagnetic_separator": "ɹ§II ɹoʇɐɹɐdǝS ɔıʇǝubɐɯoɹʇɔǝןƎ ǝʇıןƎp§", - "block.gtceu.luv_energy_input_hatch": "ɥɔʇɐH ʎbɹǝuƎ ΛnꞀp§", - "block.gtceu.luv_energy_input_hatch_16a": "ɥɔʇɐH ʎbɹǝuƎ Ɐ9Ɩ ΛnꞀp§", - "block.gtceu.luv_energy_input_hatch_4a": "ɥɔʇɐH ʎbɹǝuƎ Ɐㄣ ΛnꞀp§", - "block.gtceu.luv_energy_output_hatch": "ɥɔʇɐH oɯɐuʎᗡ ΛnꞀp§", - "block.gtceu.luv_energy_output_hatch_16a": "ɥɔʇɐH oɯɐuʎᗡ Ɐ9Ɩ ΛnꞀp§", - "block.gtceu.luv_energy_output_hatch_4a": "ɥɔʇɐH oɯɐuʎᗡ Ɐㄣ ΛnꞀp§", - "block.gtceu.luv_extractor": "ɹ§II ɹoʇɔɐɹʇxƎ ǝʇıןƎp§", - "block.gtceu.luv_extruder": "ɹ§II ɹǝpnɹʇxƎ ǝʇıןƎp§", - "block.gtceu.luv_fermenter": "ɹ§II ɹǝʇuǝɯɹǝℲ ǝʇıןƎp§", - "block.gtceu.luv_fisher": "ɹ§II ɹǝɥsıℲ ǝʇıןƎp§", - "block.gtceu.luv_fluid_heater": "ɹ§II ɹǝʇɐǝH pınןℲ ǝʇıןƎp§", - "block.gtceu.luv_fluid_passthrough_hatch": "ɥɔʇɐH ɥbnoɹɥʇssɐԀ pınןℲ ΛnꞀp§", - "block.gtceu.luv_fluid_solidifier": "ɹ§II ɹǝıɟıpıןoS pınןℲ ǝʇıןƎp§", - "block.gtceu.luv_forge_hammer": "ɹ§II ɹǝɯɯɐH ǝbɹoℲ ǝʇıןƎp§", - "block.gtceu.luv_forming_press": "ɹ§II ssǝɹԀ buıɯɹoℲ ǝʇıןƎp§", - "block.gtceu.luv_fusion_reactor": "I ʞW ɹǝʇndɯoƆ ɹoʇɔɐǝᴚ uoısnℲ", - "block.gtceu.luv_gas_collector": "ɹ§II ɹoʇɔǝןןoƆ sɐ⅁ ǝʇıןƎp§", - "block.gtceu.luv_hermetic_casing": "IΛ buısɐƆ ɔıʇǝɯɹǝH", - "block.gtceu.luv_input_bus": "snᗺ ʇnduI ΛnꞀp§", - "block.gtceu.luv_input_hatch": "ɥɔʇɐH ʇnduI ΛnꞀp§", - "block.gtceu.luv_input_hatch_4x": "ɥɔʇɐH ʇnduI ǝןdnɹpɐnὉ ΛnꞀp§", - "block.gtceu.luv_input_hatch_9x": "ɥɔʇɐH ʇnduI ǝןdnuoN ΛnꞀp§", - "block.gtceu.luv_item_passthrough_hatch": "ɥɔʇɐH ɥbnoɹɥʇssɐԀ ɯǝʇI ΛnꞀp§", - "block.gtceu.luv_lapotronic_battery": "ɹoʇıɔɐdɐƆ ɔıuoɹʇodɐꞀ ΛnꞀ", - "block.gtceu.luv_large_miner": "ɹ§II ɹǝuıW ǝbɹɐꞀ ǝʇıןƎp§", - "block.gtceu.luv_laser_engraver": "ɹ§II ɹǝʌɐɹbuƎ ɹǝsɐꞀ ǝʇıןƎp§", - "block.gtceu.luv_lathe": "ɹ§II ǝɥʇɐꞀ ǝʇıןƎp§", - "block.gtceu.luv_macerator": "ɹ§II ɹoʇɐɹǝɔɐW ǝʇıןƎp§", - "block.gtceu.luv_machine_casing": "buısɐƆ ǝuıɥɔɐW ΛnꞀ", - "block.gtceu.luv_machine_hull": "ןןnH ǝuıɥɔɐWɟ§ ΛnꞀp§", - "block.gtceu.luv_mixer": "ɹ§II ɹǝxıW ǝʇıןƎp§", - "block.gtceu.luv_muffler_hatch": "ΛnꞀp§ ɥɔʇɐH ɹǝןɟɟnW", - "block.gtceu.luv_ore_washer": "ɹ§II ɹǝɥsɐM ǝɹO ǝʇıןƎp§", - "block.gtceu.luv_output_bus": "snᗺ ʇndʇnO ΛnꞀp§", - "block.gtceu.luv_output_hatch": "ɥɔʇɐH ʇndʇnO ΛnꞀp§", - "block.gtceu.luv_output_hatch_4x": "ɥɔʇɐH ʇndʇnO ǝןdnɹpɐnὉ ΛnꞀp§", - "block.gtceu.luv_output_hatch_9x": "ɥɔʇɐH ʇndʇnO ǝןdnuoN ΛnꞀp§", - "block.gtceu.luv_packer": "ɹ§II ɹǝʞɔɐԀ ǝʇıןƎp§", - "block.gtceu.luv_parallel_hatch": "ɥɔʇɐH ןoɹʇuoƆ ןǝןןɐɹɐԀ ɹǝʇsɐW", - "block.gtceu.luv_polarizer": "ɹ§II ɹǝzıɹɐןoԀ ǝʇıןƎp§", - "block.gtceu.luv_quantum_chest": "IΛ ʇsǝɥƆ ɯnʇuɐnὉ", - "block.gtceu.luv_quantum_tank": "IΛ ʞuɐ⟘ ɯnʇuɐnὉ", - "block.gtceu.luv_rock_crusher": "ɹ§II ɹǝɥsnɹƆ ʞɔoᴚ ǝʇıןƎp§", - "block.gtceu.luv_rotor_holder": "ɹǝpןoH ɹoʇoᴚ ΛnꞀp§", - "block.gtceu.luv_scanner": "ɹ§II ɹǝuuɐɔS ǝʇıןƎp§", - "block.gtceu.luv_sifter": "ɹ§II ɹǝʇɟıS ǝʇıןƎp§", - "block.gtceu.luv_substation_input_hatch_64a": "ɥɔʇɐH ʎbɹǝuƎ uoıʇɐʇsqnS Ɐㄣ9 ΛnꞀp§", - "block.gtceu.luv_substation_output_hatch_64a": "ɥɔʇɐH oɯɐuʎᗡ uoıʇɐʇsqnS Ɐㄣ9 ΛnꞀp§", - "block.gtceu.luv_thermal_centrifuge": "ɹ§II ǝbnɟıɹʇuǝƆ ןɐɯɹǝɥ⟘ ǝʇıןƎp§", - "block.gtceu.luv_transformer_16a": "ɹǝɯɹoɟsuɐɹ⟘ ɹǝʍoԀ ɹ§ǝbɐʇןoΛ snoɹɔıpnꞀp§", - "block.gtceu.luv_transformer_1a": "ɹǝɯɹoɟsuɐɹ⟘ ɹ§ǝbɐʇןoΛ snoɹɔıpnꞀp§", - "block.gtceu.luv_transformer_2a": "ɹǝɯɹoɟsuɐɹ⟘ )xᄅ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ snoɹɔıpnꞀp§", - "block.gtceu.luv_transformer_4a": "ɹǝɯɹoɟsuɐɹ⟘ )xㄣ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ snoɹɔıpnꞀp§", - "block.gtceu.luv_wiremill": "ɹ§II ןןıɯǝɹıM ǝʇıןƎp§", - "block.gtceu.luv_world_accelerator": "ɹ§II ɹoʇɐɹǝןǝɔɔⱯ pןɹoM ǝʇıןƎp§", - "block.gtceu.lv_16a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§9Ɩ ɹ§ΛꞀㄥ§", - "block.gtceu.lv_1a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§Ɩ ɹ§ΛꞀㄥ§", - "block.gtceu.lv_4a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§ㄣ ɹ§ΛꞀㄥ§", - "block.gtceu.lv_8a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§8 ɹ§ΛꞀㄥ§", - "block.gtceu.lv_air_scrubber": "ɹ§ ɹǝqqnɹɔS ɹıⱯ ɔısɐᗺ", - "block.gtceu.lv_alloy_smelter": "ɹ§ ɹǝʇןǝɯS ʎoןןⱯ ɔısɐᗺ", - "block.gtceu.lv_arc_furnace": "ɹ§ ǝɔɐuɹnℲ ɔɹⱯ ɔısɐᗺ", - "block.gtceu.lv_assembler": "ɹ§ ɹǝןqɯǝssⱯ ɔısɐᗺ", - "block.gtceu.lv_autoclave": "ɹ§ ǝʌɐןɔoʇnⱯ ɔısɐᗺ", - "block.gtceu.lv_battery_buffer_16x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x9Ɩ ɹ§ǝbɐʇןoΛ ʍoꞀㄥ§", - "block.gtceu.lv_battery_buffer_4x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ xㄣ ɹ§ǝbɐʇןoΛ ʍoꞀㄥ§", - "block.gtceu.lv_battery_buffer_8x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x8 ɹ§ǝbɐʇןoΛ ʍoꞀㄥ§", - "block.gtceu.lv_bender": "ɹ§ ɹǝpuǝᗺ ɔısɐᗺ", - "block.gtceu.lv_block_breaker": "ɹ§ ɹǝʞɐǝɹᗺ ʞɔoןᗺ ɔısɐᗺ", - "block.gtceu.lv_brewery": "ɹ§ ʎɹǝʍǝɹᗺ ɔısɐᗺ", - "block.gtceu.lv_buffer": "ɹ§ ɹǝɟɟnᗺ ɔısɐᗺ", - "block.gtceu.lv_canner": "ɹ§ ɹǝuuɐƆ ɔısɐᗺ", - "block.gtceu.lv_centrifuge": "ɹ§ ǝbnɟıɹʇuǝƆ ɔısɐᗺ", - "block.gtceu.lv_charger_4x": "ɹǝbɹɐɥƆ oqɹn⟘ xㄣ ɹ§ǝbɐʇןoΛ ʍoꞀㄥ§", - "block.gtceu.lv_chemical_bath": "ɹ§ ɥʇɐᗺ ןɐɔıɯǝɥƆ ɔısɐᗺ", - "block.gtceu.lv_chemical_reactor": "ɹ§ ɹoʇɔɐǝᴚ ןɐɔıɯǝɥƆ ɔısɐᗺ", - "block.gtceu.lv_circuit_assembler": "ɹ§ ɹǝןqɯǝssⱯ ʇınɔɹıƆ ɔısɐᗺ", - "block.gtceu.lv_combustion": "ɹ§ ɹoʇɐɹǝuǝ⅁ uoıʇsnqɯoƆ ɔısɐᗺ", - "block.gtceu.lv_compressor": "ɹ§ ɹossǝɹdɯoƆ ɔısɐᗺ", - "block.gtceu.lv_cutter": "ɹ§ ɹǝʇʇnƆ ɔısɐᗺ", - "block.gtceu.lv_diode": "ǝpoıᗡ ΛꞀㄥ§", - "block.gtceu.lv_distillery": "ɹ§ ʎɹǝןןıʇsıᗡ ɔısɐᗺ", - "block.gtceu.lv_electric_furnace": "ɹ§ ǝɔɐuɹnℲ ɔıɹʇɔǝןƎ ɔısɐᗺ", - "block.gtceu.lv_electrolyzer": "ɹ§ ɹǝzʎןoɹʇɔǝןƎ ɔısɐᗺ", - "block.gtceu.lv_electromagnetic_separator": "ɹ§ ɹoʇɐɹɐdǝS ɔıʇǝubɐɯoɹʇɔǝןƎ ɔısɐᗺ", - "block.gtceu.lv_energy_input_hatch": "ɥɔʇɐH ʎbɹǝuƎ ΛꞀㄥ§", - "block.gtceu.lv_energy_output_hatch": "ɥɔʇɐH oɯɐuʎᗡ ΛꞀㄥ§", - "block.gtceu.lv_extractor": "ɹ§ ɹoʇɔɐɹʇxƎ ɔısɐᗺ", - "block.gtceu.lv_extruder": "ɹ§ ɹǝpnɹʇxƎ ɔısɐᗺ", - "block.gtceu.lv_fermenter": "ɹ§ ɹǝʇuǝɯɹǝℲ ɔısɐᗺ", - "block.gtceu.lv_fisher": "ɹ§ ɹǝɥsıℲ ɔısɐᗺ", - "block.gtceu.lv_fluid_heater": "ɹ§ ɹǝʇɐǝH pınןℲ ɔısɐᗺ", - "block.gtceu.lv_fluid_passthrough_hatch": "ɥɔʇɐH ɥbnoɹɥʇssɐԀ pınןℲ ΛꞀㄥ§", - "block.gtceu.lv_fluid_solidifier": "ɹ§ ɹǝıɟıpıןoS pınןℲ ɔısɐᗺ", - "block.gtceu.lv_forge_hammer": "ɹ§ ɹǝɯɯɐH ǝbɹoℲ ɔısɐᗺ", - "block.gtceu.lv_forming_press": "ɹ§ ssǝɹԀ buıɯɹoℲ ɔısɐᗺ", - "block.gtceu.lv_gas_collector": "ɹ§ ɹoʇɔǝןןoƆ sɐ⅁ ɔısɐᗺ", - "block.gtceu.lv_gas_turbine": "ɹ§ ɹoʇɐɹǝuǝ⅁ ǝuıqɹn⟘ sɐ⅁ ɔısɐᗺ", - "block.gtceu.lv_hermetic_casing": "I buısɐƆ ɔıʇǝɯɹǝH", - "block.gtceu.lv_input_bus": "snᗺ ʇnduI ΛꞀㄥ§", - "block.gtceu.lv_input_hatch": "ɥɔʇɐH ʇnduI ΛꞀㄥ§", - "block.gtceu.lv_item_collector": "ɹ§ ɹoʇɔǝןןoƆ ɯǝʇI ɔısɐᗺ", - "block.gtceu.lv_item_passthrough_hatch": "ɥɔʇɐH ɥbnoɹɥʇssɐԀ ɯǝʇI ΛꞀㄥ§", - "block.gtceu.lv_laser_engraver": "ɹ§ ɹǝʌɐɹbuƎ ɹǝsɐꞀ ɔısɐᗺ", - "block.gtceu.lv_lathe": "ɹ§ ǝɥʇɐꞀ ɔısɐᗺ", - "block.gtceu.lv_macerator": "ɹ§ ɹoʇɐɹǝɔɐW ɔısɐᗺ", - "block.gtceu.lv_machine_casing": "buısɐƆ ǝuıɥɔɐW ΛꞀ", - "block.gtceu.lv_machine_hull": "ןןnH ǝuıɥɔɐWɟ§ ΛꞀㄥ§", - "block.gtceu.lv_miner": "ɹ§ ɹǝuıW ɔısɐᗺ", - "block.gtceu.lv_mixer": "ɹ§ ɹǝxıW ɔısɐᗺ", - "block.gtceu.lv_muffler_hatch": "ΛꞀㄥ§ ɥɔʇɐH ɹǝןɟɟnW", - "block.gtceu.lv_ore_washer": "ɹ§ ɹǝɥsɐM ǝɹO ɔısɐᗺ", - "block.gtceu.lv_output_bus": "snᗺ ʇndʇnO ΛꞀㄥ§", - "block.gtceu.lv_output_hatch": "ɥɔʇɐH ʇndʇnO ΛꞀㄥ§", - "block.gtceu.lv_packer": "ɹ§ ɹǝʞɔɐԀ ɔısɐᗺ", - "block.gtceu.lv_polarizer": "ɹ§ ɹǝzıɹɐןoԀ ɔısɐᗺ", - "block.gtceu.lv_pump": "ɹ§ dɯnԀ ɔısɐᗺ", - "block.gtceu.lv_rock_crusher": "ɹ§ ɹǝɥsnɹƆ ʞɔoᴚ ɔısɐᗺ", - "block.gtceu.lv_scanner": "ɹ§ ɹǝuuɐɔS ɔısɐᗺ", - "block.gtceu.lv_sifter": "ɹ§ ɹǝʇɟıS ɔısɐᗺ", - "block.gtceu.lv_steam_turbine": "ɹ§ ɹoʇɐɹǝuǝ⅁ ǝuıqɹn⟘ ɯɐǝʇS ɔısɐᗺ", - "block.gtceu.lv_super_chest": "I ʇsǝɥƆ ɹǝdnS", - "block.gtceu.lv_super_tank": "I ʞuɐ⟘ ɹǝdnS", - "block.gtceu.lv_thermal_centrifuge": "ɹ§ ǝbnɟıɹʇuǝƆ ןɐɯɹǝɥ⟘ ɔısɐᗺ", - "block.gtceu.lv_transformer_16a": "ɹǝɯɹoɟsuɐɹ⟘ ɹǝʍoԀ ɹ§ǝbɐʇןoΛ ʍoꞀㄥ§", - "block.gtceu.lv_transformer_1a": "ɹǝɯɹoɟsuɐɹ⟘ ɹ§ǝbɐʇןoΛ ʍoꞀㄥ§", - "block.gtceu.lv_transformer_2a": "ɹǝɯɹoɟsuɐɹ⟘ )xᄅ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ ʍoꞀㄥ§", - "block.gtceu.lv_transformer_4a": "ɹǝɯɹoɟsuɐɹ⟘ )xㄣ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ ʍoꞀㄥ§", - "block.gtceu.lv_wiremill": "ɹ§ ןןıɯǝɹıM ɔısɐᗺ", - "block.gtceu.lv_world_accelerator": "ɹ§ ɹoʇɐɹǝןǝɔɔⱯ pןɹoM ɔısɐᗺ", - "block.gtceu.magenta_borderless_lamp": "dɯɐꞀ ssǝןɹǝpɹoᗺ ɐʇuǝbɐW", - "block.gtceu.magenta_lamp": "dɯɐꞀ ɐʇuǝbɐW", - "block.gtceu.magenta_large_metal_sheet": "ʇǝǝɥS ןɐʇǝW ǝbɹɐꞀ ɐʇuǝbɐW", - "block.gtceu.magenta_metal_sheet": "ʇǝǝɥS ןɐʇǝW ɐʇuǝbɐW", - "block.gtceu.magenta_studs": "spnʇS ɐʇuǝbɐW", - "block.gtceu.magic_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH ɔıbɐW", - "block.gtceu.magnetic_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH ɔıʇǝubɐW", - "block.gtceu.maintenance_hatch": "ɥɔʇɐH ǝɔuɐuǝʇuıɐW", - "block.gtceu.marble": "ǝןqɹɐW", - "block.gtceu.marble_bricks": "sʞɔıɹᗺ ǝןqɹɐW", - "block.gtceu.marble_cobblestone": "ǝuoʇsǝןqqoƆ ǝןqɹɐW", - "block.gtceu.marble_small_tile": "ǝןı⟘ ןןɐɯS ǝןqɹɐW", - "block.gtceu.marble_tile": "ǝןı⟘ ǝןqɹɐW", - "block.gtceu.marble_windmill_a": "Ɐ ןןıɯpuıM ǝןqɹɐW", - "block.gtceu.marble_windmill_b": "ᗺ ןןıɯpuıM ǝןqɹɐW", - "block.gtceu.max_16a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§9Ɩ ɹ§XⱯWן§ɔ§", - "block.gtceu.max_1a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§Ɩ ɹ§XⱯWן§ɔ§", - "block.gtceu.max_4a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§ㄣ ɹ§XⱯWן§ɔ§", - "block.gtceu.max_8a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§8 ɹ§XⱯWן§ɔ§", - "block.gtceu.max_battery_buffer_16x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x9Ɩ ɹ§ǝbɐʇןoΛ ɯnɯıxɐWן§ɔ§", - "block.gtceu.max_battery_buffer_4x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ xㄣ ɹ§ǝbɐʇןoΛ ɯnɯıxɐWן§ɔ§", - "block.gtceu.max_battery_buffer_8x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x8 ɹ§ǝbɐʇןoΛ ɯnɯıxɐWן§ɔ§", - "block.gtceu.max_charger_4x": "ɹǝbɹɐɥƆ oqɹn⟘ xㄣ ɹ§ǝbɐʇןoΛ ɯnɯıxɐWן§ɔ§", - "block.gtceu.max_dual_input_hatch": "ɥɔʇɐH ʇnduI ןɐnᗡ XⱯWן§ɔ§", - "block.gtceu.max_dual_output_hatch": "ɥɔʇɐH ʇndʇnO ןɐnᗡ XⱯWן§ɔ§", - "block.gtceu.max_energy_input_hatch": "ɥɔʇɐH ʎbɹǝuƎ XⱯWן§ɔ§", - "block.gtceu.max_energy_input_hatch_16a": "ɥɔʇɐH ʎbɹǝuƎ Ɐ9Ɩ XⱯWן§ɔ§", - "block.gtceu.max_energy_input_hatch_4a": "ɥɔʇɐH ʎbɹǝuƎ Ɐㄣ XⱯWן§ɔ§", - "block.gtceu.max_energy_output_hatch": "ɥɔʇɐH oɯɐuʎᗡ XⱯWן§ɔ§", - "block.gtceu.max_energy_output_hatch_16a": "ɥɔʇɐH oɯɐuʎᗡ Ɐ9Ɩ XⱯWן§ɔ§", - "block.gtceu.max_energy_output_hatch_4a": "ɥɔʇɐH oɯɐuʎᗡ Ɐㄣ XⱯWן§ɔ§", - "block.gtceu.max_input_bus": "snᗺ ʇnduI XⱯWן§ɔ§", - "block.gtceu.max_input_hatch": "ɥɔʇɐH ʇnduI XⱯWן§ɔ§", - "block.gtceu.max_input_hatch_4x": "ɥɔʇɐH ʇnduI ǝןdnɹpɐnὉ XⱯWן§ɔ§", - "block.gtceu.max_input_hatch_9x": "ɥɔʇɐH ʇnduI ǝןdnuoN XⱯWן§ɔ§", - "block.gtceu.max_machine_casing": "buısɐƆ ǝuıɥɔɐW XⱯW", - "block.gtceu.max_machine_hull": "ןןnH ǝuıɥɔɐWɟ§ XⱯWן§ɔ§", - "block.gtceu.max_output_bus": "snᗺ ʇndʇnO XⱯWן§ɔ§", - "block.gtceu.max_output_hatch": "ɥɔʇɐH ʇndʇnO XⱯWן§ɔ§", - "block.gtceu.max_output_hatch_4x": "ɥɔʇɐH ʇndʇnO ǝןdnɹpɐnὉ XⱯWן§ɔ§", - "block.gtceu.max_output_hatch_9x": "ɥɔʇɐH ʇndʇnO ǝןdnuoN XⱯWן§ɔ§", - "block.gtceu.max_substation_input_hatch_64a": "ɥɔʇɐH ʎbɹǝuƎ uoıʇɐʇsqnS Ɐㄣ9 XⱯWן§ɔ§", - "block.gtceu.max_substation_output_hatch_64a": "ɥɔʇɐH oɯɐuʎᗡ uoıʇɐʇsqnS Ɐㄣ9 XⱯWן§ɔ§", - "block.gtceu.me_input_bus": "snᗺ ʇnduI ƎW", - "block.gtceu.me_input_hatch": "ɥɔʇɐH ʇnduI ƎW", - "block.gtceu.me_output_bus": "snᗺ ʇndʇnO ƎW", - "block.gtceu.me_output_hatch": "ɥɔʇɐH ʇndʇnO ƎW", - "block.gtceu.me_pattern_buffer": "ɹǝɟɟnᗺ uɹǝʇʇɐԀ ƎW", - "block.gtceu.me_pattern_buffer_proxy": "ʎxoɹԀ ɹǝɟɟnᗺ uɹǝʇʇɐԀ ƎW", - "block.gtceu.me_stocking_input_bus": "snᗺ ʇnduI buıʞɔoʇS ƎW", - "block.gtceu.me_stocking_input_hatch": "ɥɔʇɐH ʇnduI buıʞɔoʇS ƎW", - "block.gtceu.mega_blast_furnace": "ǝɔɐuɹnℲ ɥʇɹɐǝH ʎɹɐʇoᴚ", - "block.gtceu.mega_vacuum_freezer": "ɹǝןןıɥƆ ʇsɐןᗺ ʞןnᗺ", - "block.gtceu.miner_pipe": "ǝdıԀ ɹǝuıW", - "block.gtceu.mob_infestation_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH uoıʇɐʇsǝɟuI qoW", - "block.gtceu.mob_spawner_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH ɹǝuʍɐdS qoW", - "block.gtceu.molybdenum_disilicide_coil_block": "ʞɔoןᗺ ןıoƆ ǝpıɔıןısıᗡ ɯnuǝpqʎןoW", - "block.gtceu.monitor": "ɹoʇıuoW", - "block.gtceu.mossy_dark_concrete_bricks": "sʞɔıɹᗺ ǝʇǝɹɔuoƆ ʞɹɐᗡ ʎssoW", - "block.gtceu.mossy_dark_concrete_cobblestone": "ǝuoʇsǝןqqoƆ ǝʇǝɹɔuoƆ ʞɹɐᗡ ʎssoW", - "block.gtceu.mossy_light_concrete_bricks": "sʞɔıɹᗺ ǝʇǝɹɔuoƆ ʇɥbıꞀ ʎssoW", - "block.gtceu.mossy_light_concrete_cobblestone": "ǝuoʇsǝןqqoƆ ǝʇǝɹɔuoƆ ʇɥbıꞀ ʎssoW", - "block.gtceu.mossy_marble_bricks": "sʞɔıɹᗺ ǝןqɹɐW ʎssoW", - "block.gtceu.mossy_marble_cobblestone": "ǝuoʇsǝןqqoƆ ǝןqɹɐW ʎssoW", - "block.gtceu.mossy_red_granite_bricks": "sʞɔıɹᗺ ǝʇıuɐɹ⅁ pǝᴚ ʎssoW", - "block.gtceu.mossy_red_granite_cobblestone": "ǝuoʇsǝןqqoƆ ǝʇıuɐɹ⅁ pǝᴚ ʎssoW", - "block.gtceu.multi_smelter": "ɹǝʇןǝɯS ıʇןnW", - "block.gtceu.mv_16a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§9Ɩ ɹ§ΛWq§", - "block.gtceu.mv_1a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§Ɩ ɹ§ΛWq§", - "block.gtceu.mv_4a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§ㄣ ɹ§ΛWq§", - "block.gtceu.mv_8a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§8 ɹ§ΛWq§", - "block.gtceu.mv_air_scrubber": "ɹ§ ɹǝqqnɹɔS ɹıⱯ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_alloy_smelter": "ɹ§ ɹǝʇןǝɯS ʎoןןⱯ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_arc_furnace": "ɹ§ ǝɔɐuɹnℲ ɔɹⱯ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_assembler": "ɹ§ ɹǝןqɯǝssⱯ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_autoclave": "ɹ§ ǝʌɐןɔoʇnⱯ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_battery_buffer_16x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x9Ɩ ɹ§ǝbɐʇןoΛ ɯnıpǝWq§", - "block.gtceu.mv_battery_buffer_4x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ xㄣ ɹ§ǝbɐʇןoΛ ɯnıpǝWq§", - "block.gtceu.mv_battery_buffer_8x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x8 ɹ§ǝbɐʇןoΛ ɯnıpǝWq§", - "block.gtceu.mv_bedrock_ore_miner": "ɹ§ ɹǝuıW ǝɹO ʞɔoɹpǝᗺ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_bender": "ɹ§ ɹǝpuǝᗺ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_block_breaker": "ɹ§ ɹǝʞɐǝɹᗺ ʞɔoןᗺ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_brewery": "ɹ§ ʎɹǝʍǝɹᗺ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_buffer": "ɹ§ ɹǝɟɟnᗺ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_canner": "ɹ§ ɹǝuuɐƆ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_centrifuge": "ɹ§ ǝbnɟıɹʇuǝƆ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_charger_4x": "ɹǝbɹɐɥƆ oqɹn⟘ xㄣ ɹ§ǝbɐʇןoΛ ɯnıpǝWq§", - "block.gtceu.mv_chemical_bath": "ɹ§ ɥʇɐᗺ ןɐɔıɯǝɥƆ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_chemical_reactor": "ɹ§ ɹoʇɔɐǝᴚ ןɐɔıɯǝɥƆ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_circuit_assembler": "ɹ§ ɹǝןqɯǝssⱯ ʇınɔɹıƆ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_combustion": "ɹ§ ɹoʇɐɹǝuǝ⅁ uoıʇsnqɯoƆ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_compressor": "ɹ§ ɹossǝɹdɯoƆ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_cutter": "ɹ§ ɹǝʇʇnƆ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_diode": "ǝpoıᗡ ΛWq§", - "block.gtceu.mv_distillery": "ɹ§ ʎɹǝןןıʇsıᗡ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_electric_furnace": "ɹ§ ǝɔɐuɹnℲ ɔıɹʇɔǝןƎ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_electrolyzer": "ɹ§ ɹǝzʎןoɹʇɔǝןƎ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_electromagnetic_separator": "ɹ§ ɹoʇɐɹɐdǝS ɔıʇǝubɐɯoɹʇɔǝןƎ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_energy_input_hatch": "ɥɔʇɐH ʎbɹǝuƎ ΛWq§", - "block.gtceu.mv_energy_output_hatch": "ɥɔʇɐH oɯɐuʎᗡ ΛWq§", - "block.gtceu.mv_extractor": "ɹ§ ɹoʇɔɐɹʇxƎ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_extruder": "ɹ§ ɹǝpnɹʇxƎ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_fermenter": "ɹ§ ɹǝʇuǝɯɹǝℲ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_fisher": "ɹ§ ɹǝɥsıℲ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_fluid_drilling_rig": "ɹ§ bıᴚ buıןןıɹᗡ pınןℲ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_fluid_heater": "ɹ§ ɹǝʇɐǝH pınןℲ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_fluid_passthrough_hatch": "ɥɔʇɐH ɥbnoɹɥʇssɐԀ pınןℲ ΛWq§", - "block.gtceu.mv_fluid_solidifier": "ɹ§ ɹǝıɟıpıןoS pınןℲ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_forge_hammer": "ɹ§ ɹǝɯɯɐH ǝbɹoℲ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_forming_press": "ɹ§ ssǝɹԀ buıɯɹoℲ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_gas_collector": "ɹ§ ɹoʇɔǝןןoƆ sɐ⅁ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_gas_turbine": "ɹ§ ɹoʇɐɹǝuǝ⅁ ǝuıqɹn⟘ sɐ⅁ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_hermetic_casing": "II buısɐƆ ɔıʇǝɯɹǝH", - "block.gtceu.mv_input_bus": "snᗺ ʇnduI ΛWq§", - "block.gtceu.mv_input_hatch": "ɥɔʇɐH ʇnduI ΛWq§", - "block.gtceu.mv_item_collector": "ɹ§ ɹoʇɔǝןןoƆ ɯǝʇI pǝɔuɐʌpⱯq§", - "block.gtceu.mv_item_passthrough_hatch": "ɥɔʇɐH ɥbnoɹɥʇssɐԀ ɯǝʇI ΛWq§", - "block.gtceu.mv_laser_engraver": "ɹ§ ɹǝʌɐɹbuƎ ɹǝsɐꞀ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_lathe": "ɹ§ ǝɥʇɐꞀ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_macerator": "ɹ§ ɹoʇɐɹǝɔɐW pǝɔuɐʌpⱯq§", - "block.gtceu.mv_machine_casing": "buısɐƆ ǝuıɥɔɐW ΛW", - "block.gtceu.mv_machine_hull": "ןןnH ǝuıɥɔɐWɟ§ ΛWq§", - "block.gtceu.mv_miner": "ɹ§ ɹǝuıW pǝɔuɐʌpⱯq§", - "block.gtceu.mv_mixer": "ɹ§ ɹǝxıW pǝɔuɐʌpⱯq§", - "block.gtceu.mv_muffler_hatch": "ΛWq§ ɥɔʇɐH ɹǝןɟɟnW", - "block.gtceu.mv_ore_washer": "ɹ§ ɹǝɥsɐM ǝɹO pǝɔuɐʌpⱯq§", - "block.gtceu.mv_output_bus": "snᗺ ʇndʇnO ΛWq§", - "block.gtceu.mv_output_hatch": "ɥɔʇɐH ʇndʇnO ΛWq§", - "block.gtceu.mv_packer": "ɹ§ ɹǝʞɔɐԀ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_polarizer": "ɹ§ ɹǝzıɹɐןoԀ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_pump": "ɹ§ dɯnԀ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_rock_crusher": "ɹ§ ɹǝɥsnɹƆ ʞɔoᴚ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_scanner": "ɹ§ ɹǝuuɐɔS pǝɔuɐʌpⱯq§", - "block.gtceu.mv_sifter": "ɹ§ ɹǝʇɟıS pǝɔuɐʌpⱯq§", - "block.gtceu.mv_steam_turbine": "ɹ§ ɹoʇɐɹǝuǝ⅁ ǝuıqɹn⟘ ɯɐǝʇS pǝɔuɐʌpⱯq§", - "block.gtceu.mv_super_chest": "II ʇsǝɥƆ ɹǝdnS", - "block.gtceu.mv_super_tank": "II ʞuɐ⟘ ɹǝdnS", - "block.gtceu.mv_thermal_centrifuge": "ɹ§ ǝbnɟıɹʇuǝƆ ןɐɯɹǝɥ⟘ pǝɔuɐʌpⱯq§", - "block.gtceu.mv_transformer_16a": "ɹǝɯɹoɟsuɐɹ⟘ ɹǝʍoԀ ɹ§ǝbɐʇןoΛ ɯnıpǝWq§", - "block.gtceu.mv_transformer_1a": "ɹǝɯɹoɟsuɐɹ⟘ ɹ§ǝbɐʇןoΛ ɯnıpǝWq§", - "block.gtceu.mv_transformer_2a": "ɹǝɯɹoɟsuɐɹ⟘ )xᄅ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ ɯnıpǝWq§", - "block.gtceu.mv_transformer_4a": "ɹǝɯɹoɟsuɐɹ⟘ )xㄣ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ ɯnıpǝWq§", - "block.gtceu.mv_wiremill": "ɹ§ ןןıɯǝɹıM pǝɔuɐʌpⱯq§", - "block.gtceu.mv_world_accelerator": "ɹ§ ɹoʇɐɹǝןǝɔɔⱯ pןɹoM pǝɔuɐʌpⱯq§", - "block.gtceu.naquadah_coil_block": "ʞɔoןᗺ ןıoƆ ɥɐpɐnbɐN", - "block.gtceu.network_switch": "ɥɔʇıʍS ʞɹoʍʇǝN", - "block.gtceu.nichrome_coil_block": "ʞɔoןᗺ ןıoƆ ǝɯoɹɥɔıN", - "block.gtceu.noise_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH ǝsıoN", - "block.gtceu.nonconducting_casing": "buısɐƆ buıʇɔnpuoɔuoN", - "block.gtceu.normal_duct_pipe": "ǝdıԀ ʇɔnᗡ ןɐɯɹoN", - "block.gtceu.normal_laser_pipe": "ǝdıԀ ɹǝsɐꞀ ןɐɯɹoN", - "block.gtceu.normal_laser_pipe.tooltip": "sǝuıן ʇɥbıɐɹʇs uı ㄥ§ssoן ouɟ§ ɥʇıʍ ɹǝʍod buıʇʇıɯsuɐɹ⟘ㄥ§", - "block.gtceu.normal_optical_pipe": "ǝןqɐƆ ɹǝqıℲ ןɐɔıʇdO", - "block.gtceu.normal_optical_pipe.tooltip": "ㄥ§ɐʇɐᗡ ɥɔɹɐǝsǝᴚɟ§ ɹo ㄥ§uoıʇɐʇndɯoƆɟ§ buıʇʇıɯsuɐɹ⟘ㄥ§", - "block.gtceu.object_holder": "ɹǝpןoH ʇɔǝظqO", - "block.gtceu.oil": "ןıO", - "block.gtceu.oil_heavy": "ןıO ʎʌɐǝH", - "block.gtceu.oil_light": "ןıO ʇɥbıꞀ", - "block.gtceu.oil_medium": "ןıO ʍɐᴚ", - "block.gtceu.opv_1024a_laser_source_hatch": "ɥɔʇɐH ǝɔɹnoS ɹǝsɐꞀ ɹ§Ɐǝ§ㄣᄅ0'Ɩ ɹ§ΛdOן§6§", - "block.gtceu.opv_1024a_laser_target_hatch": "ɥɔʇɐH ʇǝbɹɐ⟘ ɹǝsɐꞀ ɹ§Ɐǝ§ㄣᄅ0'Ɩ ɹ§ΛdOן§6§", - "block.gtceu.opv_16a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§9Ɩ ɹ§ΛdOן§6§", - "block.gtceu.opv_1a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§Ɩ ɹ§ΛdOן§6§", - "block.gtceu.opv_256a_laser_source_hatch": "ɥɔʇɐH ǝɔɹnoS ɹǝsɐꞀ ɹ§Ɐǝ§9ϛᄅ ɹ§ΛdOן§6§", - "block.gtceu.opv_256a_laser_target_hatch": "ɥɔʇɐH ʇǝbɹɐ⟘ ɹǝsɐꞀ ɹ§Ɐǝ§9ϛᄅ ɹ§ΛdOן§6§", - "block.gtceu.opv_4096a_laser_source_hatch": "ɥɔʇɐH ǝɔɹnoS ɹǝsɐꞀ ɹ§Ɐǝ§960'ㄣ ɹ§ΛdOן§6§", - "block.gtceu.opv_4096a_laser_target_hatch": "ɥɔʇɐH ʇǝbɹɐ⟘ ɹǝsɐꞀ ɹ§Ɐǝ§960'ㄣ ɹ§ΛdOן§6§", - "block.gtceu.opv_4a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§ㄣ ɹ§ΛdOן§6§", - "block.gtceu.opv_8a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§8 ɹ§ΛdOן§6§", - "block.gtceu.opv_alloy_smelter": "ɹ§ ɹǝʇןǝɯS ʎoןןⱯ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_arc_furnace": "ɹ§ ǝɔɐuɹnℲ ɔɹⱯ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_assembler": "ɹ§ ɹǝןqɯǝssⱯ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_autoclave": "ɹ§ ǝʌɐןɔoʇnⱯ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_battery_buffer_16x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x9Ɩ ɹ§ǝbɐʇןoΛ pǝɹǝʍodɹǝʌOן§6§", - "block.gtceu.opv_battery_buffer_4x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ xㄣ ɹ§ǝbɐʇןoΛ pǝɹǝʍodɹǝʌOן§6§", - "block.gtceu.opv_battery_buffer_8x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x8 ɹ§ǝbɐʇןoΛ pǝɹǝʍodɹǝʌOן§6§", - "block.gtceu.opv_bender": "ɹ§ ɹǝpuǝᗺ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_brewery": "ɹ§ ʎɹǝʍǝɹᗺ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_canner": "ɹ§ ɹǝuuɐƆ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_centrifuge": "ɹ§ ǝbnɟıɹʇuǝƆ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_charger_4x": "ɹǝbɹɐɥƆ oqɹn⟘ xㄣ ɹ§ǝbɐʇןoΛ pǝɹǝʍodɹǝʌOן§6§", - "block.gtceu.opv_chemical_bath": "ɹ§ ɥʇɐᗺ ןɐɔıɯǝɥƆ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_chemical_reactor": "ɹ§ ɹoʇɔɐǝᴚ ןɐɔıɯǝɥƆ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_circuit_assembler": "ɹ§ ɹǝןqɯǝssⱯ ʇınɔɹıƆ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_compressor": "ɹ§ ɹossǝɹdɯoƆ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_cutter": "ɹ§ ɹǝʇʇnƆ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_diode": "ǝpoıᗡ ΛdOן§6§", - "block.gtceu.opv_distillery": "ɹ§ ʎɹǝןןıʇsıᗡ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_dual_input_hatch": "ɥɔʇɐH ʇnduI ןɐnᗡ ΛdOן§6§", - "block.gtceu.opv_dual_output_hatch": "ɥɔʇɐH ʇndʇnO ןɐnᗡ ΛdOן§6§", - "block.gtceu.opv_electric_furnace": "ɹ§ ǝɔɐuɹnℲ ɔıɹʇɔǝןƎ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_electrolyzer": "ɹ§ ɹǝzʎןoɹʇɔǝןƎ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_electromagnetic_separator": "ɹ§ ɹoʇɐɹɐdǝS ɔıʇǝubɐɯoɹʇɔǝןƎ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_energy_input_hatch": "ɥɔʇɐH ʎbɹǝuƎ ΛdOן§6§", - "block.gtceu.opv_energy_input_hatch_16a": "ɥɔʇɐH ʎbɹǝuƎ Ɐ9Ɩ ΛdOן§6§", - "block.gtceu.opv_energy_input_hatch_4a": "ɥɔʇɐH ʎbɹǝuƎ Ɐㄣ ΛdOן§6§", - "block.gtceu.opv_energy_output_hatch": "ɥɔʇɐH oɯɐuʎᗡ ΛdOן§6§", - "block.gtceu.opv_energy_output_hatch_16a": "ɥɔʇɐH oɯɐuʎᗡ Ɐ9Ɩ ΛdOן§6§", - "block.gtceu.opv_energy_output_hatch_4a": "ɥɔʇɐH oɯɐuʎᗡ Ɐㄣ ΛdOן§6§", - "block.gtceu.opv_extractor": "ɹ§ ɹoʇɔɐɹʇxƎ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_extruder": "ɹ§ ɹǝpnɹʇxƎ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_fermenter": "ɹ§ ɹǝʇuǝɯɹǝℲ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_fluid_heater": "ɹ§ ɹǝʇɐǝH pınןℲ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_fluid_passthrough_hatch": "ɥɔʇɐH ɥbnoɹɥʇssɐԀ pınןℲ ΛdOן§6§", - "block.gtceu.opv_fluid_solidifier": "ɹ§ ɹǝıɟıpıןoS pınןℲ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_forge_hammer": "ɹ§ ɹǝɯɯɐH ǝbɹoℲ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_forming_press": "ɹ§ ssǝɹԀ buıɯɹoℲ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_gas_collector": "ɹ§ ɹoʇɔǝןןoƆ sɐ⅁ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_input_bus": "snᗺ ʇnduI ΛdOן§6§", - "block.gtceu.opv_input_hatch": "ɥɔʇɐH ʇnduI ΛdOן§6§", - "block.gtceu.opv_input_hatch_4x": "ɥɔʇɐH ʇnduI ǝןdnɹpɐnὉ ΛdOן§6§", - "block.gtceu.opv_input_hatch_9x": "ɥɔʇɐH ʇnduI ǝןdnuoN ΛdOן§6§", - "block.gtceu.opv_item_passthrough_hatch": "ɥɔʇɐH ɥbnoɹɥʇssɐԀ ɯǝʇI ΛdOן§6§", - "block.gtceu.opv_laser_engraver": "ɹ§ ɹǝʌɐɹbuƎ ɹǝsɐꞀ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_lathe": "ɹ§ ǝɥʇɐꞀ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_macerator": "ɹ§ ɹoʇɐɹǝɔɐW ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_machine_casing": "buısɐƆ ǝuıɥɔɐW ΛdO", - "block.gtceu.opv_machine_hull": "ןןnH ǝuıɥɔɐWɟ§ ΛdOן§6§", - "block.gtceu.opv_mixer": "ɹ§ ɹǝxıW ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_muffler_hatch": "ΛdOן§6§ ɥɔʇɐH ɹǝןɟɟnW", - "block.gtceu.opv_ore_washer": "ɹ§ ɹǝɥsɐM ǝɹO ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_output_bus": "snᗺ ʇndʇnO ΛdOן§6§", - "block.gtceu.opv_output_hatch": "ɥɔʇɐH ʇndʇnO ΛdOן§6§", - "block.gtceu.opv_output_hatch_4x": "ɥɔʇɐH ʇndʇnO ǝןdnɹpɐnὉ ΛdOן§6§", - "block.gtceu.opv_output_hatch_9x": "ɥɔʇɐH ʇndʇnO ǝןdnuoN ΛdOן§6§", - "block.gtceu.opv_packer": "ɹ§ ɹǝʞɔɐԀ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_polarizer": "ɹ§ ɹǝzıɹɐןoԀ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_quantum_chest": "IIIX ʇsǝɥƆ ɯnʇuɐnὉ", - "block.gtceu.opv_quantum_tank": "IIIX ʞuɐ⟘ ɯnʇuɐnὉ", - "block.gtceu.opv_rock_crusher": "ɹ§ ɹǝɥsnɹƆ ʞɔoᴚ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_rotor_holder": "ɹǝpןoH ɹoʇoᴚ ΛdOן§6§", - "block.gtceu.opv_scanner": "ɹ§ ɹǝuuɐɔS ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_sifter": "ɹ§ ɹǝʇɟıS ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_substation_input_hatch_64a": "ɥɔʇɐH ʎbɹǝuƎ uoıʇɐʇsqnS Ɐㄣ9 ΛdOן§6§", - "block.gtceu.opv_substation_output_hatch_64a": "ɥɔʇɐH oɯɐuʎᗡ uoıʇɐʇsqnS Ɐㄣ9 ΛdOן§6§", - "block.gtceu.opv_thermal_centrifuge": "ɹ§ ǝbnɟıɹʇuǝƆ ןɐɯɹǝɥ⟘ ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.opv_transformer_16a": "ɹǝɯɹoɟsuɐɹ⟘ ɹǝʍoԀ ɹ§ǝbɐʇןoΛ pǝɹǝʍodɹǝʌOן§6§", - "block.gtceu.opv_transformer_1a": "ɹǝɯɹoɟsuɐɹ⟘ ɹ§ǝbɐʇןoΛ pǝɹǝʍodɹǝʌOן§6§", - "block.gtceu.opv_transformer_2a": "ɹǝɯɹoɟsuɐɹ⟘ )xᄅ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ pǝɹǝʍodɹǝʌOן§6§", - "block.gtceu.opv_transformer_4a": "ɹǝɯɹoɟsuɐɹ⟘ )xㄣ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ pǝɹǝʍodɹǝʌOן§6§", - "block.gtceu.opv_wiremill": "ɹ§ ןןıɯǝɹıM ʎɹɐpuǝbǝꞀן§6§", - "block.gtceu.orange_borderless_lamp": "dɯɐꞀ ssǝןɹǝpɹoᗺ ǝbuɐɹO", - "block.gtceu.orange_lamp": "dɯɐꞀ ǝbuɐɹO", - "block.gtceu.orange_large_metal_sheet": "ʇǝǝɥS ןɐʇǝW ǝbɹɐꞀ ǝbuɐɹO", - "block.gtceu.orange_metal_sheet": "ʇǝǝɥS ןɐʇǝW ǝbuɐɹO", - "block.gtceu.orange_studs": "spnʇS ǝbuɐɹO", - "block.gtceu.overworld_marker": "pןɹoʍɹǝʌO", - "block.gtceu.palladium_substation": "buısɐƆ uoıʇɐʇsqnS ɯnıpɐןןɐԀ", - "block.gtceu.pattern_buffer.desc.0": "˙sʞɔoןqıʇןnW ɥɔǝ⟘bǝɹ⅁ ɹoɟɟ§ ǝbɐɹoʇs uɹǝʇʇɐd ᄅƎⱯ9§ ʇɔǝɹıp sʍoןןⱯɟ§", - "block.gtceu.pattern_buffer.desc.1": "˙ʇǝbpıʍɟ§ ʎɹoʇuǝʌuı pǝɹɐɥs9§ ǝɥʇ uı pǝɹoʇs buıɥʇʎuɐ ǝzıןıʇn uɐɔ suɹǝʇʇɐԀ ᄅƎⱯɟ§", - "block.gtceu.pattern_buffer.desc.2": "¡ɹǝɥʇǝboʇ sǝuıɥɔɐɯ ʞuıן oʇɟ§ ʞɔıʇsɐʇɐpq§ ɐ ɥʇıʍɟ§ sǝıxoɹԀ ɹǝɟɟnᗺ uɹǝʇʇɐԀ9§ ʞuıꞀɟ§", - "block.gtceu.pattern_buffer_proxy.desc.0": "˙ɟ§ɹǝɟɟnᗺ uɹǝʇʇɐԀ ƎW9§ ɹɐןnbuıs ɐ oʇ sǝuıɥɔɐɯ ʎuɐɯ buıʞuıן sʍoןןⱯɟ§", - "block.gtceu.pattern_buffer_proxy.desc.1": "˙ɟ§ɹǝɟɟnq ןɐuıbıɹo9§ ǝɥʇ uıɥʇıʍ pןǝɥ suɹǝʇʇɐd ǝɥʇ ǝɹɐɥs ןןıʍ sǝıxoɹd pǝʇɔǝuuoɔ ןןⱯɟ§", - "block.gtceu.pattern_buffer_proxy.desc.2": "¡ʍoɹb ʎɹoʇɔɐɟ ǝɥʇ ʇǝꞀɟ§", - "block.gtceu.petrified_foam": "ɯɐoℲ pǝıɟıɹʇǝԀ", - "block.gtceu.pink_borderless_lamp": "dɯɐꞀ ssǝןɹǝpɹoᗺ ʞuıԀ", - "block.gtceu.pink_lamp": "dɯɐꞀ ʞuıԀ", - "block.gtceu.pink_large_metal_sheet": "ʇǝǝɥS ןɐʇǝW ǝbɹɐꞀ ʞuıԀ", - "block.gtceu.pink_metal_sheet": "ʇǝǝɥS ןɐʇǝW ʞuıԀ", - "block.gtceu.pink_studs": "spnʇS ʞuıԀ", - "block.gtceu.plascrete": "ǝʇǝɹɔsɐןԀ", - "block.gtceu.plasma_large_turbine": "ǝuıqɹn⟘ ɐɯsɐןԀ ǝbɹɐꞀ", - "block.gtceu.polished_dark_concrete": "ǝʇǝɹɔuoƆ ʞɹɐᗡ pǝɥsıןoԀ", - "block.gtceu.polished_light_concrete": "ǝʇǝɹɔuoƆ ʇɥbıꞀ pǝɥsıןoԀ", - "block.gtceu.polished_marble": "ǝןqɹɐW pǝɥsıןoԀ", - "block.gtceu.polished_red_granite": "ǝʇıuɐɹ⅁ pǝᴚ pǝɥsıןoԀ", - "block.gtceu.powderbarrel": "ןǝɹɹɐqɹǝpʍoԀ", - "block.gtceu.powderbarrel.drops_tooltip": "sɯǝʇI sɐ sʞɔoןᗺ pǝʎoɹʇsǝp ןןɐ sdoɹp '⟘N⟘ uɐɥʇ ɹǝbɹɐן ʎןʇɥbıןS", - "block.gtceu.power_substation": "uoıʇɐʇsqnS ɹǝʍoԀ", - "block.gtceu.primitive_blast_furnace": "ǝɔɐuɹnℲ ʇsɐןᗺ ǝʌıʇıɯıɹԀ", - "block.gtceu.primitive_pump": "dɯnԀ ǝʌıʇıɯıɹԀ", - "block.gtceu.ptfe_pipe_casing": "buısɐƆ ǝdıԀ ƎℲ⟘Ԁ", - "block.gtceu.pump_deck": "ʞɔǝᗡ dɯnԀ", - "block.gtceu.pump_hatch": "ɥɔʇɐH dɯnԀ", - "block.gtceu.purple_borderless_lamp": "dɯɐꞀ ssǝןɹǝpɹoᗺ ǝןdɹnԀ", - "block.gtceu.purple_lamp": "dɯɐꞀ ǝןdɹnԀ", - "block.gtceu.purple_large_metal_sheet": "ʇǝǝɥS ןɐʇǝW ǝbɹɐꞀ ǝןdɹnԀ", - "block.gtceu.purple_metal_sheet": "ʇǝǝɥS ןɐʇǝW ǝןdɹnԀ", - "block.gtceu.purple_studs": "spnʇS ǝןdɹnԀ", - "block.gtceu.pyrolyse_oven": "uǝʌO ǝsʎןoɹʎԀ", - "block.gtceu.radioactive_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH ǝʌıʇɔɐoıpɐᴚ", - "block.gtceu.reaction_safe_mixing_casing": "buısɐƆ buıxıW ǝɟɐS-uoıʇɔɐǝᴚ", - "block.gtceu.red_borderless_lamp": "dɯɐꞀ ssǝןɹǝpɹoᗺ pǝᴚ", - "block.gtceu.red_granite": "ǝʇıuɐɹ⅁ pǝᴚ", - "block.gtceu.red_granite_bricks": "sʞɔıɹᗺ ǝʇıuɐɹ⅁ pǝᴚ", - "block.gtceu.red_granite_cobblestone": "ǝuoʇsǝןqqoƆ ǝʇıuɐɹ⅁ pǝᴚ", - "block.gtceu.red_granite_small_tile": "ǝןı⟘ ןןɐɯS ǝʇıuɐɹ⅁ pǝᴚ", - "block.gtceu.red_granite_tile": "ǝןı⟘ ǝʇıuɐɹ⅁ pǝᴚ", - "block.gtceu.red_granite_windmill_a": "Ɐ ןןıɯpuıM ǝʇıuɐɹ⅁ pǝᴚ", - "block.gtceu.red_granite_windmill_b": "ᗺ ןןıɯpuıM ǝʇıuɐɹ⅁ pǝᴚ", - "block.gtceu.red_lamp": "dɯɐꞀ pǝᴚ", - "block.gtceu.red_large_metal_sheet": "ʇǝǝɥS ןɐʇǝW ǝbɹɐꞀ pǝᴚ", - "block.gtceu.red_metal_sheet": "ʇǝǝɥS ןɐʇǝW pǝᴚ", - "block.gtceu.red_studs": "spnʇS pǝᴚ", - "block.gtceu.reinforced_foam": "ɯɐoℲ pǝɔɹoɟuıǝᴚ", - "block.gtceu.reinforced_stone": "ǝuoʇS pǝɔɹoɟuıǝᴚ", - "block.gtceu.research_station": "uoıʇɐʇS ɥɔɹɐǝsǝᴚ", - "block.gtceu.reservoir_hatch": "ɥɔʇɐH ɹıoʌɹǝsǝᴚ", - "block.gtceu.robust_machine_casing": "buısɐƆ ǝuıɥɔɐW ןǝǝʇsuǝʇsbun⟘ ʇsnqoᴚ", - "block.gtceu.rtm_alloy_coil_block": "ʞɔoןᗺ ןıoƆ ʎoןןⱯ W⟘ᴚ", - "block.gtceu.rubber_button": "uoʇʇnᗺ ɹǝqqnᴚ", - "block.gtceu.rubber_door": "ɹooᗡ ɹǝqqnᴚ", - "block.gtceu.rubber_fence": "ǝɔuǝℲ ɹǝqqnᴚ", - "block.gtceu.rubber_fence_gate": "ǝʇɐ⅁ ǝɔuǝℲ ɹǝqqnᴚ", - "block.gtceu.rubber_hanging_sign": "ubıS buıbuɐH ןןɐM ɹǝqqnᴚ", - "block.gtceu.rubber_leaves": "sǝʌɐǝꞀ ɹǝqqnᴚ", - "block.gtceu.rubber_log": "boꞀ ɹǝqqnᴚ", - "block.gtceu.rubber_planks": "sʞuɐןԀ ɹǝqqnᴚ", - "block.gtceu.rubber_pressure_plate": "ǝʇɐןԀ ǝɹnssǝɹԀ ɹǝqqnᴚ", - "block.gtceu.rubber_sapling": "buıןdɐS ɹǝqqnᴚ", - "block.gtceu.rubber_sign": "ubıS ןןɐM ɹǝqqnᴚ", - "block.gtceu.rubber_slab": "qɐןS ɹǝqqnᴚ", - "block.gtceu.rubber_stairs": "sɹıɐʇS ɹǝqqnᴚ", - "block.gtceu.rubber_trapdoor": "ɹoopdɐɹ⟘ ɹǝqqnᴚ", - "block.gtceu.rubber_wood": "pooM ɹǝqqnᴚ", - "block.gtceu.secure_maceration_casing": "buısɐƆ uoıʇɐɹǝɔɐW ǝɹnɔǝS", - "block.gtceu.shock_proof_cutting_casing": "buısɐƆ buıʇʇnƆ ɟooɹԀ ʞɔoɥS", - "block.gtceu.slicing_blades": "sǝpɐןᗺ buıɔıןS", - "block.gtceu.small_dark_concrete_bricks": "sʞɔıɹᗺ ǝʇǝɹɔuoƆ ʞɹɐᗡ ןןɐɯS", - "block.gtceu.small_duct_pipe": "ǝdıԀ ʇɔnᗡ ןןɐɯS", - "block.gtceu.small_light_concrete_bricks": "sʞɔıɹᗺ ǝʇǝɹɔuoƆ ʇɥbıꞀ ןןɐɯS", - "block.gtceu.small_marble_bricks": "sʞɔıɹᗺ ǝןqɹɐW ןןɐɯS", - "block.gtceu.small_red_granite_bricks": "sʞɔıɹᗺ ǝʇıuɐɹ⅁ pǝᴚ ןןɐɯS", - "block.gtceu.solid_machine_casing": "buısɐƆ ǝuıɥɔɐW pıןoS", - "block.gtceu.spatial_storage_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH ǝbɐɹoʇS ןɐıʇɐdS", - "block.gtceu.square_dark_concrete_bricks": "sʞɔıɹᗺ ǝʇǝɹɔuoƆ ʞɹɐᗡ ǝɹɐnbS", - "block.gtceu.square_light_concrete_bricks": "sʞɔıɹᗺ ǝʇǝɹɔuoƆ ʇɥbıꞀ ǝɹɐnbS", - "block.gtceu.square_marble_bricks": "sʞɔıɹᗺ ǝןqɹɐW ǝɹɐnbS", - "block.gtceu.square_red_granite_bricks": "sʞɔıɹᗺ ǝʇıuɐɹ⅁ pǝᴚ ǝɹɐnbS", - "block.gtceu.stable_machine_casing": "buısɐƆ ǝuıɥɔɐW ɯnıuɐʇı⟘ ǝןqɐʇS", - "block.gtceu.stainless_steel_crate": "ǝʇɐɹƆ ןǝǝʇS ssǝןuıɐʇS", - "block.gtceu.stainless_steel_drum": "ɯnɹᗡ ןǝǝʇS ssǝןuıɐʇS", - "block.gtceu.stainless_steel_gearbox": "buısɐƆ xoqɹɐǝ⅁ ןǝǝʇS ssǝןuıɐʇS", - "block.gtceu.stainless_steel_turbine_casing": "buısɐƆ ǝuıqɹn⟘ ssǝןuıɐʇS", - "block.gtceu.steam_casing_bricked_bronze": "ןןnH ǝzuoɹᗺ pǝʞɔıɹᗺ", - "block.gtceu.steam_casing_bricked_bronze.tooltip": "sǝuıɥɔɐW ɯɐǝʇS ʇsɹıɟ ɹnoʎ ɹoℲㄥ§", - "block.gtceu.steam_casing_bricked_steel": "ןןnH uoɹI ʇɥbnoɹM pǝʞɔıɹᗺ", - "block.gtceu.steam_casing_bricked_steel.tooltip": "sǝuıɥɔɐW ɯɐǝʇS pǝʌoɹdɯı ɹoℲㄥ§", - "block.gtceu.steam_casing_bronze": "ןןnH ǝzuoɹᗺ", - "block.gtceu.steam_casing_bronze.tooltip": "sǝuıɥɔɐW ɯɐǝʇS ʇsɹıɟ ɹnoʎ ɹoℲㄥ§", - "block.gtceu.steam_casing_steel": "ןןnH ןǝǝʇS", - "block.gtceu.steam_casing_steel.tooltip": "sǝuıɥɔɐW ɯɐǝʇS pǝʌoɹdɯı ɹoℲㄥ§", - "block.gtceu.steam_grinder": "ɹǝpuıɹ⅁ ɯɐǝʇS", - "block.gtceu.steam_input_bus": "snᗺ ʇnduI ɯɐǝʇS", - "block.gtceu.steam_input_hatch": "ɥɔʇɐH ʇnduI ɯɐǝʇS", - "block.gtceu.steam_large_turbine": "ǝuıqɹn⟘ ɯɐǝʇS ǝbɹɐꞀ", - "block.gtceu.steam_liquid_boiler.bronze": "ɹǝןıoᗺ pınbıꞀ ɯɐǝʇS ןןɐɯS", - "block.gtceu.steam_machine_casing": "buısɐƆ ǝuıɥɔɐW ɯɐǝʇS", - "block.gtceu.steam_output_bus": "snᗺ ʇndʇnO ɯɐǝʇS", - "block.gtceu.steam_oven": "uǝʌO ɯɐǝʇS", - "block.gtceu.steam_solid_boiler.bronze": "ɹǝןıoᗺ pıןoS ɯɐǝʇS ןןɐɯS", - "block.gtceu.steel_brick_casing": "buısɐƆ uoɹI ʇɥbnoɹM pǝʞɔıɹᗺ", - "block.gtceu.steel_crate": "ǝʇɐɹƆ ןǝǝʇS", - "block.gtceu.steel_drum": "ɯnɹᗡ ןǝǝʇS", - "block.gtceu.steel_firebox_casing": "buısɐƆ xoqǝɹıℲ ןǝǝʇS", - "block.gtceu.steel_gearbox": "buısɐƆ xoqɹɐǝ⅁ ןǝǝʇS", - "block.gtceu.steel_large_boiler": "ɹǝןıoᗺ ןǝǝʇS ǝbɹɐꞀ", - "block.gtceu.steel_machine_casing": "buısɐƆ ǝuıɥɔɐW ןǝǝʇS pıןoS", - "block.gtceu.steel_multiblock_tank": "ʞuɐ⟘ ʞɔoןqıʇןnW ןǝǝʇS", - "block.gtceu.steel_pipe_casing": "buısɐƆ ǝdıԀ ןǝǝʇS", - "block.gtceu.steel_tank_valve": "ǝʌןɐΛ ʞuɐ⟘ ןǝǝʇS", - "block.gtceu.steel_turbine_casing": "buısɐƆ ǝuıqɹn⟘ ɯnıןɐubɐW", - "block.gtceu.sterilizing_filter_casing": "buısɐƆ ɹǝʇןıℲ buızıןıɹǝʇS", - "block.gtceu.stress_proof_casing": "buısɐƆ ɟooɹԀ ssǝɹʇS", - "block.gtceu.stripped_rubber_log": "boꞀ ɹǝqqnᴚ pǝddıɹʇS", - "block.gtceu.stripped_rubber_wood": "pooM ɹǝqqnᴚ pǝddıɹʇS", - "block.gtceu.sturdy_machine_casing": "buısɐƆ ǝuıɥɔɐW Ǝ-SSH ʎpɹnʇS", - "block.gtceu.substation_capacitor.tooltip_empty": "uoıʇɐʇsqnS ɹǝʍoԀ ɹnoʎ uı ǝɔɐds buıןןıɟ ɹoℲㄥ§", - "block.gtceu.substation_capacitor.tooltip_filled": "∩Ǝ %dɟ§ :ʎʇıɔɐdɐƆ ʎbɹǝuƎɔ§", - "block.gtceu.superconducting_coil": "ʞɔoןᗺ ןıoƆ buıʇɔnpuoɔɹǝdnS", - "block.gtceu.tempered_glass": "ssɐן⅁ pǝɹǝdɯǝ⟘", - "block.gtceu.the_end_marker": "puƎ ǝɥ⟘", - "block.gtceu.the_nether_marker": "ɹǝɥʇǝN ǝɥ⟘", - "block.gtceu.titanium_crate": "ǝʇɐɹƆ ɯnıuɐʇı⟘", - "block.gtceu.titanium_drum": "ɯnɹᗡ ɯnıuɐʇı⟘", - "block.gtceu.titanium_firebox_casing": "buısɐƆ xoqǝɹıℲ ɯnıuɐʇı⟘", - "block.gtceu.titanium_gearbox": "buısɐƆ xoqɹɐǝ⅁ ɯnıuɐʇı⟘", - "block.gtceu.titanium_large_boiler": "ɹǝןıoᗺ ɯnıuɐʇı⟘ ǝbɹɐꞀ", - "block.gtceu.titanium_pipe_casing": "buısɐƆ ǝdıԀ ɯnıuɐʇı⟘", - "block.gtceu.titanium_turbine_casing": "buısɐƆ ǝuıqɹn⟘ ɯnıuɐʇı⟘", - "block.gtceu.treated_wood_button": "uoʇʇnᗺ pooM pǝʇɐǝɹ⟘", - "block.gtceu.treated_wood_door": "ɹooᗡ pooM pǝʇɐǝɹ⟘", - "block.gtceu.treated_wood_fence": "ǝɔuǝℲ pooM pǝʇɐǝɹ⟘", - "block.gtceu.treated_wood_fence_gate": "ǝʇɐ⅁ ǝɔuǝℲ pooM pǝʇɐǝɹ⟘", - "block.gtceu.treated_wood_hanging_sign": "ubıS buıbuɐH ןןɐM pooM pǝʇɐǝɹ⟘", - "block.gtceu.treated_wood_planks": "sʞuɐןԀ pooM pǝʇɐǝɹ⟘", - "block.gtceu.treated_wood_pressure_plate": "ǝʇɐןԀ ǝɹnssǝɹԀ pooM pǝʇɐǝɹ⟘", - "block.gtceu.treated_wood_sign": "ubıS ןןɐM pooM pǝʇɐǝɹ⟘", - "block.gtceu.treated_wood_slab": "qɐןS pooM pǝʇɐǝɹ⟘", - "block.gtceu.treated_wood_stairs": "sɹıɐʇS pooM pǝʇɐǝɹ⟘", - "block.gtceu.treated_wood_trapdoor": "ɹoopdɐɹ⟘ pooM pǝʇɐǝɹ⟘", - "block.gtceu.trinium_coil_block": "ʞɔoןᗺ ןıoƆ ɯnıuıɹ⟘", - "block.gtceu.tritanium_coil_block": "ʞɔoןᗺ ןıoƆ ɯnıuɐʇıɹ⟘", - "block.gtceu.tungsten_steel_crate": "ǝʇɐɹƆ ןǝǝʇsuǝʇsbun⟘", - "block.gtceu.tungsten_steel_drum": "ɯnɹᗡ ןǝǝʇsuǝʇsbun⟘", - "block.gtceu.tungstensteel_firebox_casing": "buısɐƆ xoqǝɹıℲ ןǝǝʇsuǝʇsbun⟘", - "block.gtceu.tungstensteel_gearbox": "buısɐƆ xoqɹɐǝ⅁ ןǝǝʇsuǝʇsbun⟘", - "block.gtceu.tungstensteel_large_boiler": "ɹǝןıoᗺ ןǝǝʇsuǝʇsbun⟘ ǝbɹɐꞀ", - "block.gtceu.tungstensteel_pipe_casing": "buısɐƆ ǝdıԀ ןǝǝʇsuǝʇsbun⟘", - "block.gtceu.tungstensteel_turbine_casing": "buısɐƆ ǝuıqɹn⟘ ןǝǝʇsuǝʇsbun⟘", - "block.gtceu.turret_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH ʇǝɹɹn⟘", - "block.gtceu.uev_1024a_laser_source_hatch": "ɥɔʇɐH ǝɔɹnoS ɹǝsɐꞀ ɹ§Ɐǝ§ㄣᄅ0'Ɩ ɹ§ΛƎ∩ɐ§", - "block.gtceu.uev_1024a_laser_target_hatch": "ɥɔʇɐH ʇǝbɹɐ⟘ ɹǝsɐꞀ ɹ§Ɐǝ§ㄣᄅ0'Ɩ ɹ§ΛƎ∩ɐ§", - "block.gtceu.uev_16a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§9Ɩ ɹ§ΛƎ∩ɐ§", - "block.gtceu.uev_1a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§Ɩ ɹ§ΛƎ∩ɐ§", - "block.gtceu.uev_256a_laser_source_hatch": "ɥɔʇɐH ǝɔɹnoS ɹǝsɐꞀ ɹ§Ɐǝ§9ϛᄅ ɹ§ΛƎ∩ɐ§", - "block.gtceu.uev_256a_laser_target_hatch": "ɥɔʇɐH ʇǝbɹɐ⟘ ɹǝsɐꞀ ɹ§Ɐǝ§9ϛᄅ ɹ§ΛƎ∩ɐ§", - "block.gtceu.uev_4096a_laser_source_hatch": "ɥɔʇɐH ǝɔɹnoS ɹǝsɐꞀ ɹ§Ɐǝ§960'ㄣ ɹ§ΛƎ∩ɐ§", - "block.gtceu.uev_4096a_laser_target_hatch": "ɥɔʇɐH ʇǝbɹɐ⟘ ɹǝsɐꞀ ɹ§Ɐǝ§960'ㄣ ɹ§ΛƎ∩ɐ§", - "block.gtceu.uev_4a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§ㄣ ɹ§ΛƎ∩ɐ§", - "block.gtceu.uev_8a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§8 ɹ§ΛƎ∩ɐ§", - "block.gtceu.uev_alloy_smelter": "ɹ§II ɹǝʇןǝɯS ʎoןןⱯ ɔıdƎɐ§", - "block.gtceu.uev_arc_furnace": "ɹ§II ǝɔɐuɹnℲ ɔɹⱯ ɔıdƎɐ§", - "block.gtceu.uev_assembler": "ɹ§II ɹǝןqɯǝssⱯ ɔıdƎɐ§", - "block.gtceu.uev_autoclave": "ɹ§II ǝʌɐןɔoʇnⱯ ɔıdƎɐ§", - "block.gtceu.uev_battery_buffer_16x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x9Ɩ ɹ§ǝbɐʇןoΛ ǝʌıssǝɔxƎ ɐɹʇן∩ɐ§", - "block.gtceu.uev_battery_buffer_4x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ xㄣ ɹ§ǝbɐʇןoΛ ǝʌıssǝɔxƎ ɐɹʇן∩ɐ§", - "block.gtceu.uev_battery_buffer_8x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x8 ɹ§ǝbɐʇןoΛ ǝʌıssǝɔxƎ ɐɹʇן∩ɐ§", - "block.gtceu.uev_bender": "ɹ§II ɹǝpuǝᗺ ɔıdƎɐ§", - "block.gtceu.uev_brewery": "ɹ§II ʎɹǝʍǝɹᗺ ɔıdƎɐ§", - "block.gtceu.uev_canner": "ɹ§II ɹǝuuɐƆ ɔıdƎɐ§", - "block.gtceu.uev_centrifuge": "ɹ§II ǝbnɟıɹʇuǝƆ ɔıdƎɐ§", - "block.gtceu.uev_charger_4x": "ɹǝbɹɐɥƆ oqɹn⟘ xㄣ ɹ§ǝbɐʇןoΛ ǝʌıssǝɔxƎ ɐɹʇן∩ɐ§", - "block.gtceu.uev_chemical_bath": "ɹ§II ɥʇɐᗺ ןɐɔıɯǝɥƆ ɔıdƎɐ§", - "block.gtceu.uev_chemical_reactor": "ɹ§II ɹoʇɔɐǝᴚ ןɐɔıɯǝɥƆ ɔıdƎɐ§", - "block.gtceu.uev_circuit_assembler": "ɹ§II ɹǝןqɯǝssⱯ ʇınɔɹıƆ ɔıdƎɐ§", - "block.gtceu.uev_compressor": "ɹ§II ɹossǝɹdɯoƆ ɔıdƎɐ§", - "block.gtceu.uev_cutter": "ɹ§II ɹǝʇʇnƆ ɔıdƎɐ§", - "block.gtceu.uev_diode": "ǝpoıᗡ ΛƎ∩ɐ§", - "block.gtceu.uev_distillery": "ɹ§II ʎɹǝןןıʇsıᗡ ɔıdƎɐ§", - "block.gtceu.uev_dual_input_hatch": "ɥɔʇɐH ʇnduI ןɐnᗡ ΛƎ∩ɐ§", - "block.gtceu.uev_dual_output_hatch": "ɥɔʇɐH ʇndʇnO ןɐnᗡ ΛƎ∩ɐ§", - "block.gtceu.uev_electric_furnace": "ɹ§II ǝɔɐuɹnℲ ɔıɹʇɔǝןƎ ɔıdƎɐ§", - "block.gtceu.uev_electrolyzer": "ɹ§II ɹǝzʎןoɹʇɔǝןƎ ɔıdƎɐ§", - "block.gtceu.uev_electromagnetic_separator": "ɹ§II ɹoʇɐɹɐdǝS ɔıʇǝubɐɯoɹʇɔǝןƎ ɔıdƎɐ§", - "block.gtceu.uev_energy_input_hatch": "ɥɔʇɐH ʎbɹǝuƎ ΛƎ∩ɐ§", - "block.gtceu.uev_energy_input_hatch_16a": "ɥɔʇɐH ʎbɹǝuƎ Ɐ9Ɩ ΛƎ∩ɐ§", - "block.gtceu.uev_energy_input_hatch_4a": "ɥɔʇɐH ʎbɹǝuƎ Ɐㄣ ΛƎ∩ɐ§", - "block.gtceu.uev_energy_output_hatch": "ɥɔʇɐH oɯɐuʎᗡ ΛƎ∩ɐ§", - "block.gtceu.uev_energy_output_hatch_16a": "ɥɔʇɐH oɯɐuʎᗡ Ɐ9Ɩ ΛƎ∩ɐ§", - "block.gtceu.uev_energy_output_hatch_4a": "ɥɔʇɐH oɯɐuʎᗡ Ɐㄣ ΛƎ∩ɐ§", - "block.gtceu.uev_extractor": "ɹ§II ɹoʇɔɐɹʇxƎ ɔıdƎɐ§", - "block.gtceu.uev_extruder": "ɹ§II ɹǝpnɹʇxƎ ɔıdƎɐ§", - "block.gtceu.uev_fermenter": "ɹ§II ɹǝʇuǝɯɹǝℲ ɔıdƎɐ§", - "block.gtceu.uev_fluid_heater": "ɹ§II ɹǝʇɐǝH pınןℲ ɔıdƎɐ§", - "block.gtceu.uev_fluid_passthrough_hatch": "ɥɔʇɐH ɥbnoɹɥʇssɐԀ pınןℲ ΛƎ∩ɐ§", - "block.gtceu.uev_fluid_solidifier": "ɹ§II ɹǝıɟıpıןoS pınןℲ ɔıdƎɐ§", - "block.gtceu.uev_forge_hammer": "ɹ§II ɹǝɯɯɐH ǝbɹoℲ ɔıdƎɐ§", - "block.gtceu.uev_forming_press": "ɹ§II ssǝɹԀ buıɯɹoℲ ɔıdƎɐ§", - "block.gtceu.uev_gas_collector": "ɹ§II ɹoʇɔǝןןoƆ sɐ⅁ ɔıdƎɐ§", - "block.gtceu.uev_input_bus": "snᗺ ʇnduI ΛƎ∩ɐ§", - "block.gtceu.uev_input_hatch": "ɥɔʇɐH ʇnduI ΛƎ∩ɐ§", - "block.gtceu.uev_input_hatch_4x": "ɥɔʇɐH ʇnduI ǝןdnɹpɐnὉ ΛƎ∩ɐ§", - "block.gtceu.uev_input_hatch_9x": "ɥɔʇɐH ʇnduI ǝןdnuoN ΛƎ∩ɐ§", - "block.gtceu.uev_item_passthrough_hatch": "ɥɔʇɐH ɥbnoɹɥʇssɐԀ ɯǝʇI ΛƎ∩ɐ§", - "block.gtceu.uev_laser_engraver": "ɹ§II ɹǝʌɐɹbuƎ ɹǝsɐꞀ ɔıdƎɐ§", - "block.gtceu.uev_lathe": "ɹ§II ǝɥʇɐꞀ ɔıdƎɐ§", - "block.gtceu.uev_macerator": "ɹ§II ɹoʇɐɹǝɔɐW ɔıdƎɐ§", - "block.gtceu.uev_machine_casing": "buısɐƆ ǝuıɥɔɐW ΛƎ∩", - "block.gtceu.uev_machine_hull": "ןןnH ǝuıɥɔɐWɟ§ ΛƎ∩ɐ§", - "block.gtceu.uev_mixer": "ɹ§II ɹǝxıW ɔıdƎɐ§", - "block.gtceu.uev_muffler_hatch": "ΛƎ∩ɐ§ ɥɔʇɐH ɹǝןɟɟnW", - "block.gtceu.uev_ore_washer": "ɹ§II ɹǝɥsɐM ǝɹO ɔıdƎɐ§", - "block.gtceu.uev_output_bus": "snᗺ ʇndʇnO ΛƎ∩ɐ§", - "block.gtceu.uev_output_hatch": "ɥɔʇɐH ʇndʇnO ΛƎ∩ɐ§", - "block.gtceu.uev_output_hatch_4x": "ɥɔʇɐH ʇndʇnO ǝןdnɹpɐnὉ ΛƎ∩ɐ§", - "block.gtceu.uev_output_hatch_9x": "ɥɔʇɐH ʇndʇnO ǝןdnuoN ΛƎ∩ɐ§", - "block.gtceu.uev_packer": "ɹ§II ɹǝʞɔɐԀ ɔıdƎɐ§", - "block.gtceu.uev_polarizer": "ɹ§II ɹǝzıɹɐןoԀ ɔıdƎɐ§", - "block.gtceu.uev_quantum_chest": "X ʇsǝɥƆ ɯnʇuɐnὉ", - "block.gtceu.uev_quantum_tank": "X ʞuɐ⟘ ɯnʇuɐnὉ", - "block.gtceu.uev_rock_crusher": "ɹ§II ɹǝɥsnɹƆ ʞɔoᴚ ɔıdƎɐ§", - "block.gtceu.uev_rotor_holder": "ɹǝpןoH ɹoʇoᴚ ΛƎ∩ɐ§", - "block.gtceu.uev_scanner": "ɹ§II ɹǝuuɐɔS ɔıdƎɐ§", - "block.gtceu.uev_sifter": "ɹ§II ɹǝʇɟıS ɔıdƎɐ§", - "block.gtceu.uev_substation_input_hatch_64a": "ɥɔʇɐH ʎbɹǝuƎ uoıʇɐʇsqnS Ɐㄣ9 ΛƎ∩ɐ§", - "block.gtceu.uev_substation_output_hatch_64a": "ɥɔʇɐH oɯɐuʎᗡ uoıʇɐʇsqnS Ɐㄣ9 ΛƎ∩ɐ§", - "block.gtceu.uev_thermal_centrifuge": "ɹ§II ǝbnɟıɹʇuǝƆ ןɐɯɹǝɥ⟘ ɔıdƎɐ§", - "block.gtceu.uev_transformer_16a": "ɹǝɯɹoɟsuɐɹ⟘ ɹǝʍoԀ ɹ§ǝbɐʇןoΛ ǝʌıssǝɔxƎ ɐɹʇן∩ɐ§", - "block.gtceu.uev_transformer_1a": "ɹǝɯɹoɟsuɐɹ⟘ ɹ§ǝbɐʇןoΛ ǝʌıssǝɔxƎ ɐɹʇן∩ɐ§", - "block.gtceu.uev_transformer_2a": "ɹǝɯɹoɟsuɐɹ⟘ )xᄅ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ ǝʌıssǝɔxƎ ɐɹʇן∩ɐ§", - "block.gtceu.uev_transformer_4a": "ɹǝɯɹoɟsuɐɹ⟘ )xㄣ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ ǝʌıssǝɔxƎ ɐɹʇן∩ɐ§", - "block.gtceu.uev_wiremill": "ɹ§II ןןıɯǝɹıM ɔıdƎɐ§", - "block.gtceu.uhv_1024a_laser_source_hatch": "ɥɔʇɐH ǝɔɹnoS ɹǝsɐꞀ ɹ§Ɐǝ§ㄣᄅ0'Ɩ ɹ§ΛH∩ㄣ§", - "block.gtceu.uhv_1024a_laser_target_hatch": "ɥɔʇɐH ʇǝbɹɐ⟘ ɹǝsɐꞀ ɹ§Ɐǝ§ㄣᄅ0'Ɩ ɹ§ΛH∩ㄣ§", - "block.gtceu.uhv_16a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§9Ɩ ɹ§ΛH∩ㄣ§", - "block.gtceu.uhv_1a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§Ɩ ɹ§ΛH∩ㄣ§", - "block.gtceu.uhv_256a_laser_source_hatch": "ɥɔʇɐH ǝɔɹnoS ɹǝsɐꞀ ɹ§Ɐǝ§9ϛᄅ ɹ§ΛH∩ㄣ§", - "block.gtceu.uhv_256a_laser_target_hatch": "ɥɔʇɐH ʇǝbɹɐ⟘ ɹǝsɐꞀ ɹ§Ɐǝ§9ϛᄅ ɹ§ΛH∩ㄣ§", - "block.gtceu.uhv_4096a_laser_source_hatch": "ɥɔʇɐH ǝɔɹnoS ɹǝsɐꞀ ɹ§Ɐǝ§960'ㄣ ɹ§ΛH∩ㄣ§", - "block.gtceu.uhv_4096a_laser_target_hatch": "ɥɔʇɐH ʇǝbɹɐ⟘ ɹǝsɐꞀ ɹ§Ɐǝ§960'ㄣ ɹ§ΛH∩ㄣ§", - "block.gtceu.uhv_4a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§ㄣ ɹ§ΛH∩ㄣ§", - "block.gtceu.uhv_8a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§8 ɹ§ΛH∩ㄣ§", - "block.gtceu.uhv_alloy_smelter": "ɹ§ ɹǝʇןǝɯS ʎoןןⱯ ɔıdƎㄣ§", - "block.gtceu.uhv_arc_furnace": "ɹ§ ǝɔɐuɹnℲ ɔɹⱯ ɔıdƎㄣ§", - "block.gtceu.uhv_assembler": "ɹ§ ɹǝןqɯǝssⱯ ɔıdƎㄣ§", - "block.gtceu.uhv_autoclave": "ɹ§ ǝʌɐןɔoʇnⱯ ɔıdƎㄣ§", - "block.gtceu.uhv_battery_buffer_16x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x9Ɩ ɹ§ǝbɐʇןoΛ ɥbıH ɐɹʇן∩ㄣ§", - "block.gtceu.uhv_battery_buffer_4x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ xㄣ ɹ§ǝbɐʇןoΛ ɥbıH ɐɹʇן∩ㄣ§", - "block.gtceu.uhv_battery_buffer_8x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x8 ɹ§ǝbɐʇןoΛ ɥbıH ɐɹʇן∩ㄣ§", - "block.gtceu.uhv_bender": "ɹ§ ɹǝpuǝᗺ ɔıdƎㄣ§", - "block.gtceu.uhv_brewery": "ɹ§ ʎɹǝʍǝɹᗺ ɔıdƎㄣ§", - "block.gtceu.uhv_canner": "ɹ§ ɹǝuuɐƆ ɔıdƎㄣ§", - "block.gtceu.uhv_centrifuge": "ɹ§ ǝbnɟıɹʇuǝƆ ɔıdƎㄣ§", - "block.gtceu.uhv_charger_4x": "ɹǝbɹɐɥƆ oqɹn⟘ xㄣ ɹ§ǝbɐʇןoΛ ɥbıH ɐɹʇן∩ㄣ§", - "block.gtceu.uhv_chemical_bath": "ɹ§ ɥʇɐᗺ ןɐɔıɯǝɥƆ ɔıdƎㄣ§", - "block.gtceu.uhv_chemical_reactor": "ɹ§ ɹoʇɔɐǝᴚ ןɐɔıɯǝɥƆ ɔıdƎㄣ§", - "block.gtceu.uhv_circuit_assembler": "ɹ§ ɹǝןqɯǝssⱯ ʇınɔɹıƆ ɔıdƎㄣ§", - "block.gtceu.uhv_compressor": "ɹ§ ɹossǝɹdɯoƆ ɔıdƎㄣ§", - "block.gtceu.uhv_cutter": "ɹ§ ɹǝʇʇnƆ ɔıdƎㄣ§", - "block.gtceu.uhv_diode": "ǝpoıᗡ ΛH∩ㄣ§", - "block.gtceu.uhv_distillery": "ɹ§ ʎɹǝןןıʇsıᗡ ɔıdƎㄣ§", - "block.gtceu.uhv_dual_input_hatch": "ɥɔʇɐH ʇnduI ןɐnᗡ ΛH∩ㄣ§", - "block.gtceu.uhv_dual_output_hatch": "ɥɔʇɐH ʇndʇnO ןɐnᗡ ΛH∩ㄣ§", - "block.gtceu.uhv_electric_furnace": "ɹ§ ǝɔɐuɹnℲ ɔıɹʇɔǝןƎ ɔıdƎㄣ§", - "block.gtceu.uhv_electrolyzer": "ɹ§ ɹǝzʎןoɹʇɔǝןƎ ɔıdƎㄣ§", - "block.gtceu.uhv_electromagnetic_separator": "ɹ§ ɹoʇɐɹɐdǝS ɔıʇǝubɐɯoɹʇɔǝןƎ ɔıdƎㄣ§", - "block.gtceu.uhv_energy_input_hatch": "ɥɔʇɐH ʎbɹǝuƎ ΛH∩ㄣ§", - "block.gtceu.uhv_energy_input_hatch_16a": "ɥɔʇɐH ʎbɹǝuƎ Ɐ9Ɩ ΛH∩ㄣ§", - "block.gtceu.uhv_energy_input_hatch_4a": "ɥɔʇɐH ʎbɹǝuƎ Ɐㄣ ΛH∩ㄣ§", - "block.gtceu.uhv_energy_output_hatch": "ɥɔʇɐH oɯɐuʎᗡ ΛH∩ㄣ§", - "block.gtceu.uhv_energy_output_hatch_16a": "ɥɔʇɐH oɯɐuʎᗡ Ɐ9Ɩ ΛH∩ㄣ§", - "block.gtceu.uhv_energy_output_hatch_4a": "ɥɔʇɐH oɯɐuʎᗡ Ɐㄣ ΛH∩ㄣ§", - "block.gtceu.uhv_extractor": "ɹ§ ɹoʇɔɐɹʇxƎ ɔıdƎㄣ§", - "block.gtceu.uhv_extruder": "ɹ§ ɹǝpnɹʇxƎ ɔıdƎㄣ§", - "block.gtceu.uhv_fermenter": "ɹ§ ɹǝʇuǝɯɹǝℲ ɔıdƎㄣ§", - "block.gtceu.uhv_fluid_heater": "ɹ§ ɹǝʇɐǝH pınןℲ ɔıdƎㄣ§", - "block.gtceu.uhv_fluid_passthrough_hatch": "ɥɔʇɐH ɥbnoɹɥʇssɐԀ pınןℲ ΛH∩ㄣ§", - "block.gtceu.uhv_fluid_solidifier": "ɹ§ ɹǝıɟıpıןoS pınןℲ ɔıdƎㄣ§", - "block.gtceu.uhv_forge_hammer": "ɹ§ ɹǝɯɯɐH ǝbɹoℲ ɔıdƎㄣ§", - "block.gtceu.uhv_forming_press": "ɹ§ ssǝɹԀ buıɯɹoℲ ɔıdƎㄣ§", - "block.gtceu.uhv_gas_collector": "ɹ§ ɹoʇɔǝןןoƆ sɐ⅁ ɔıdƎㄣ§", - "block.gtceu.uhv_hermetic_casing": "XI buısɐƆ ɔıʇǝɯɹǝH", - "block.gtceu.uhv_input_bus": "snᗺ ʇnduI ΛH∩ㄣ§", - "block.gtceu.uhv_input_hatch": "ɥɔʇɐH ʇnduI ΛH∩ㄣ§", - "block.gtceu.uhv_input_hatch_4x": "ɥɔʇɐH ʇnduI ǝןdnɹpɐnὉ ΛH∩ㄣ§", - "block.gtceu.uhv_input_hatch_9x": "ɥɔʇɐH ʇnduI ǝןdnuoN ΛH∩ㄣ§", - "block.gtceu.uhv_item_passthrough_hatch": "ɥɔʇɐH ɥbnoɹɥʇssɐԀ ɯǝʇI ΛH∩ㄣ§", - "block.gtceu.uhv_laser_engraver": "ɹ§ ɹǝʌɐɹbuƎ ɹǝsɐꞀ ɔıdƎㄣ§", - "block.gtceu.uhv_lathe": "ɹ§ ǝɥʇɐꞀ ɔıdƎㄣ§", - "block.gtceu.uhv_macerator": "ɹ§ ɹoʇɐɹǝɔɐW ɔıdƎㄣ§", - "block.gtceu.uhv_machine_casing": "buısɐƆ ǝuıɥɔɐW ΛH∩", - "block.gtceu.uhv_machine_hull": "ןןnH ǝuıɥɔɐWɟ§ ΛH∩ㄣ§", - "block.gtceu.uhv_mixer": "ɹ§ ɹǝxıW ɔıdƎㄣ§", - "block.gtceu.uhv_muffler_hatch": "ΛH∩ㄣ§ ɥɔʇɐH ɹǝןɟɟnW", - "block.gtceu.uhv_ore_washer": "ɹ§ ɹǝɥsɐM ǝɹO ɔıdƎㄣ§", - "block.gtceu.uhv_output_bus": "snᗺ ʇndʇnO ΛH∩ㄣ§", - "block.gtceu.uhv_output_hatch": "ɥɔʇɐH ʇndʇnO ΛH∩ㄣ§", - "block.gtceu.uhv_output_hatch_4x": "ɥɔʇɐH ʇndʇnO ǝןdnɹpɐnὉ ΛH∩ㄣ§", - "block.gtceu.uhv_output_hatch_9x": "ɥɔʇɐH ʇndʇnO ǝןdnuoN ΛH∩ㄣ§", - "block.gtceu.uhv_packer": "ɹ§ ɹǝʞɔɐԀ ɔıdƎㄣ§", - "block.gtceu.uhv_polarizer": "ɹ§ ɹǝzıɹɐןoԀ ɔıdƎㄣ§", - "block.gtceu.uhv_quantum_chest": "XI ʇsǝɥƆ ɯnʇuɐnὉ", - "block.gtceu.uhv_quantum_tank": "XI ʞuɐ⟘ ɯnʇuɐnὉ", - "block.gtceu.uhv_rock_crusher": "ɹ§ ɹǝɥsnɹƆ ʞɔoᴚ ɔıdƎㄣ§", - "block.gtceu.uhv_rotor_holder": "ɹǝpןoH ɹoʇoᴚ ΛH∩ㄣ§", - "block.gtceu.uhv_scanner": "ɹ§ ɹǝuuɐɔS ɔıdƎㄣ§", - "block.gtceu.uhv_sifter": "ɹ§ ɹǝʇɟıS ɔıdƎㄣ§", - "block.gtceu.uhv_substation_input_hatch_64a": "ɥɔʇɐH ʎbɹǝuƎ uoıʇɐʇsqnS Ɐㄣ9 ΛH∩ㄣ§", - "block.gtceu.uhv_substation_output_hatch_64a": "ɥɔʇɐH oɯɐuʎᗡ uoıʇɐʇsqnS Ɐㄣ9 ΛH∩ㄣ§", - "block.gtceu.uhv_thermal_centrifuge": "ɹ§ ǝbnɟıɹʇuǝƆ ןɐɯɹǝɥ⟘ ɔıdƎㄣ§", - "block.gtceu.uhv_transformer_16a": "ɹǝɯɹoɟsuɐɹ⟘ ɹǝʍoԀ ɹ§ǝbɐʇןoΛ ɥbıH ɐɹʇן∩ㄣ§", - "block.gtceu.uhv_transformer_1a": "ɹǝɯɹoɟsuɐɹ⟘ ɹ§ǝbɐʇןoΛ ɥbıH ɐɹʇן∩ㄣ§", - "block.gtceu.uhv_transformer_2a": "ɹǝɯɹoɟsuɐɹ⟘ )xᄅ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ ɥbıH ɐɹʇן∩ㄣ§", - "block.gtceu.uhv_transformer_4a": "ɹǝɯɹoɟsuɐɹ⟘ )xㄣ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ ɥbıH ɐɹʇן∩ㄣ§", - "block.gtceu.uhv_ultimate_battery": "ɹoʇıɔɐdɐƆ ǝʇɐɯıʇן∩ ΛH∩", - "block.gtceu.uhv_wiremill": "ɹ§ ןןıɯǝɹıM ɔıdƎㄣ§", - "block.gtceu.uiv_1024a_laser_source_hatch": "ɥɔʇɐH ǝɔɹnoS ɹǝsɐꞀ ɹ§Ɐǝ§ㄣᄅ0'Ɩ ɹ§ΛI∩ᄅ§", - "block.gtceu.uiv_1024a_laser_target_hatch": "ɥɔʇɐH ʇǝbɹɐ⟘ ɹǝsɐꞀ ɹ§Ɐǝ§ㄣᄅ0'Ɩ ɹ§ΛI∩ᄅ§", - "block.gtceu.uiv_16a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§9Ɩ ɹ§ΛI∩ᄅ§", - "block.gtceu.uiv_1a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§Ɩ ɹ§ΛI∩ᄅ§", - "block.gtceu.uiv_256a_laser_source_hatch": "ɥɔʇɐH ǝɔɹnoS ɹǝsɐꞀ ɹ§Ɐǝ§9ϛᄅ ɹ§ΛI∩ᄅ§", - "block.gtceu.uiv_256a_laser_target_hatch": "ɥɔʇɐH ʇǝbɹɐ⟘ ɹǝsɐꞀ ɹ§Ɐǝ§9ϛᄅ ɹ§ΛI∩ᄅ§", - "block.gtceu.uiv_4096a_laser_source_hatch": "ɥɔʇɐH ǝɔɹnoS ɹǝsɐꞀ ɹ§Ɐǝ§960'ㄣ ɹ§ΛI∩ᄅ§", - "block.gtceu.uiv_4096a_laser_target_hatch": "ɥɔʇɐH ʇǝbɹɐ⟘ ɹǝsɐꞀ ɹ§Ɐǝ§960'ㄣ ɹ§ΛI∩ᄅ§", - "block.gtceu.uiv_4a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§ㄣ ɹ§ΛI∩ᄅ§", - "block.gtceu.uiv_8a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§8 ɹ§ΛI∩ᄅ§", - "block.gtceu.uiv_alloy_smelter": "ɹ§III ɹǝʇןǝɯS ʎoןןⱯ ɔıdƎᄅ§", - "block.gtceu.uiv_arc_furnace": "ɹ§III ǝɔɐuɹnℲ ɔɹⱯ ɔıdƎᄅ§", - "block.gtceu.uiv_assembler": "ɹ§III ɹǝןqɯǝssⱯ ɔıdƎᄅ§", - "block.gtceu.uiv_autoclave": "ɹ§III ǝʌɐןɔoʇnⱯ ɔıdƎᄅ§", - "block.gtceu.uiv_battery_buffer_16x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x9Ɩ ɹ§ǝbɐʇןoΛ ǝsuǝɯɯI ɐɹʇן∩ᄅ§", - "block.gtceu.uiv_battery_buffer_4x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ xㄣ ɹ§ǝbɐʇןoΛ ǝsuǝɯɯI ɐɹʇן∩ᄅ§", - "block.gtceu.uiv_battery_buffer_8x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x8 ɹ§ǝbɐʇןoΛ ǝsuǝɯɯI ɐɹʇן∩ᄅ§", - "block.gtceu.uiv_bender": "ɹ§III ɹǝpuǝᗺ ɔıdƎᄅ§", - "block.gtceu.uiv_brewery": "ɹ§III ʎɹǝʍǝɹᗺ ɔıdƎᄅ§", - "block.gtceu.uiv_canner": "ɹ§III ɹǝuuɐƆ ɔıdƎᄅ§", - "block.gtceu.uiv_centrifuge": "ɹ§III ǝbnɟıɹʇuǝƆ ɔıdƎᄅ§", - "block.gtceu.uiv_charger_4x": "ɹǝbɹɐɥƆ oqɹn⟘ xㄣ ɹ§ǝbɐʇןoΛ ǝsuǝɯɯI ɐɹʇן∩ᄅ§", - "block.gtceu.uiv_chemical_bath": "ɹ§III ɥʇɐᗺ ןɐɔıɯǝɥƆ ɔıdƎᄅ§", - "block.gtceu.uiv_chemical_reactor": "ɹ§III ɹoʇɔɐǝᴚ ןɐɔıɯǝɥƆ ɔıdƎᄅ§", - "block.gtceu.uiv_circuit_assembler": "ɹ§III ɹǝןqɯǝssⱯ ʇınɔɹıƆ ɔıdƎᄅ§", - "block.gtceu.uiv_compressor": "ɹ§III ɹossǝɹdɯoƆ ɔıdƎᄅ§", - "block.gtceu.uiv_cutter": "ɹ§III ɹǝʇʇnƆ ɔıdƎᄅ§", - "block.gtceu.uiv_diode": "ǝpoıᗡ ΛI∩ᄅ§", - "block.gtceu.uiv_distillery": "ɹ§III ʎɹǝןןıʇsıᗡ ɔıdƎᄅ§", - "block.gtceu.uiv_dual_input_hatch": "ɥɔʇɐH ʇnduI ןɐnᗡ ΛI∩ᄅ§", - "block.gtceu.uiv_dual_output_hatch": "ɥɔʇɐH ʇndʇnO ןɐnᗡ ΛI∩ᄅ§", - "block.gtceu.uiv_electric_furnace": "ɹ§III ǝɔɐuɹnℲ ɔıɹʇɔǝןƎ ɔıdƎᄅ§", - "block.gtceu.uiv_electrolyzer": "ɹ§III ɹǝzʎןoɹʇɔǝןƎ ɔıdƎᄅ§", - "block.gtceu.uiv_electromagnetic_separator": "ɹ§III ɹoʇɐɹɐdǝS ɔıʇǝubɐɯoɹʇɔǝןƎ ɔıdƎᄅ§", - "block.gtceu.uiv_energy_input_hatch": "ɥɔʇɐH ʎbɹǝuƎ ΛI∩ᄅ§", - "block.gtceu.uiv_energy_input_hatch_16a": "ɥɔʇɐH ʎbɹǝuƎ Ɐ9Ɩ ΛI∩ᄅ§", - "block.gtceu.uiv_energy_input_hatch_4a": "ɥɔʇɐH ʎbɹǝuƎ Ɐㄣ ΛI∩ᄅ§", - "block.gtceu.uiv_energy_output_hatch": "ɥɔʇɐH oɯɐuʎᗡ ΛI∩ᄅ§", - "block.gtceu.uiv_energy_output_hatch_16a": "ɥɔʇɐH oɯɐuʎᗡ Ɐ9Ɩ ΛI∩ᄅ§", - "block.gtceu.uiv_energy_output_hatch_4a": "ɥɔʇɐH oɯɐuʎᗡ Ɐㄣ ΛI∩ᄅ§", - "block.gtceu.uiv_extractor": "ɹ§III ɹoʇɔɐɹʇxƎ ɔıdƎᄅ§", - "block.gtceu.uiv_extruder": "ɹ§III ɹǝpnɹʇxƎ ɔıdƎᄅ§", - "block.gtceu.uiv_fermenter": "ɹ§III ɹǝʇuǝɯɹǝℲ ɔıdƎᄅ§", - "block.gtceu.uiv_fluid_heater": "ɹ§III ɹǝʇɐǝH pınןℲ ɔıdƎᄅ§", - "block.gtceu.uiv_fluid_passthrough_hatch": "ɥɔʇɐH ɥbnoɹɥʇssɐԀ pınןℲ ΛI∩ᄅ§", - "block.gtceu.uiv_fluid_solidifier": "ɹ§III ɹǝıɟıpıןoS pınןℲ ɔıdƎᄅ§", - "block.gtceu.uiv_forge_hammer": "ɹ§III ɹǝɯɯɐH ǝbɹoℲ ɔıdƎᄅ§", - "block.gtceu.uiv_forming_press": "ɹ§III ssǝɹԀ buıɯɹoℲ ɔıdƎᄅ§", - "block.gtceu.uiv_gas_collector": "ɹ§III ɹoʇɔǝןןoƆ sɐ⅁ ɔıdƎᄅ§", - "block.gtceu.uiv_input_bus": "snᗺ ʇnduI ΛI∩ᄅ§", - "block.gtceu.uiv_input_hatch": "ɥɔʇɐH ʇnduI ΛI∩ᄅ§", - "block.gtceu.uiv_input_hatch_4x": "ɥɔʇɐH ʇnduI ǝןdnɹpɐnὉ ΛI∩ᄅ§", - "block.gtceu.uiv_input_hatch_9x": "ɥɔʇɐH ʇnduI ǝןdnuoN ΛI∩ᄅ§", - "block.gtceu.uiv_item_passthrough_hatch": "ɥɔʇɐH ɥbnoɹɥʇssɐԀ ɯǝʇI ΛI∩ᄅ§", - "block.gtceu.uiv_laser_engraver": "ɹ§III ɹǝʌɐɹbuƎ ɹǝsɐꞀ ɔıdƎᄅ§", - "block.gtceu.uiv_lathe": "ɹ§III ǝɥʇɐꞀ ɔıdƎᄅ§", - "block.gtceu.uiv_macerator": "ɹ§III ɹoʇɐɹǝɔɐW ɔıdƎᄅ§", - "block.gtceu.uiv_machine_casing": "buısɐƆ ǝuıɥɔɐW ΛI∩", - "block.gtceu.uiv_machine_hull": "ןןnH ǝuıɥɔɐWɟ§ ΛI∩ᄅ§", - "block.gtceu.uiv_mixer": "ɹ§III ɹǝxıW ɔıdƎᄅ§", - "block.gtceu.uiv_muffler_hatch": "ΛI∩ᄅ§ ɥɔʇɐH ɹǝןɟɟnW", - "block.gtceu.uiv_ore_washer": "ɹ§III ɹǝɥsɐM ǝɹO ɔıdƎᄅ§", - "block.gtceu.uiv_output_bus": "snᗺ ʇndʇnO ΛI∩ᄅ§", - "block.gtceu.uiv_output_hatch": "ɥɔʇɐH ʇndʇnO ΛI∩ᄅ§", - "block.gtceu.uiv_output_hatch_4x": "ɥɔʇɐH ʇndʇnO ǝןdnɹpɐnὉ ΛI∩ᄅ§", - "block.gtceu.uiv_output_hatch_9x": "ɥɔʇɐH ʇndʇnO ǝןdnuoN ΛI∩ᄅ§", - "block.gtceu.uiv_packer": "ɹ§III ɹǝʞɔɐԀ ɔıdƎᄅ§", - "block.gtceu.uiv_polarizer": "ɹ§III ɹǝzıɹɐןoԀ ɔıdƎᄅ§", - "block.gtceu.uiv_quantum_chest": "IX ʇsǝɥƆ ɯnʇuɐnὉ", - "block.gtceu.uiv_quantum_tank": "IX ʞuɐ⟘ ɯnʇuɐnὉ", - "block.gtceu.uiv_rock_crusher": "ɹ§III ɹǝɥsnɹƆ ʞɔoᴚ ɔıdƎᄅ§", - "block.gtceu.uiv_rotor_holder": "ɹǝpןoH ɹoʇoᴚ ΛI∩ᄅ§", - "block.gtceu.uiv_scanner": "ɹ§III ɹǝuuɐɔS ɔıdƎᄅ§", - "block.gtceu.uiv_sifter": "ɹ§III ɹǝʇɟıS ɔıdƎᄅ§", - "block.gtceu.uiv_substation_input_hatch_64a": "ɥɔʇɐH ʎbɹǝuƎ uoıʇɐʇsqnS Ɐㄣ9 ΛI∩ᄅ§", - "block.gtceu.uiv_substation_output_hatch_64a": "ɥɔʇɐH oɯɐuʎᗡ uoıʇɐʇsqnS Ɐㄣ9 ΛI∩ᄅ§", - "block.gtceu.uiv_thermal_centrifuge": "ɹ§III ǝbnɟıɹʇuǝƆ ןɐɯɹǝɥ⟘ ɔıdƎᄅ§", - "block.gtceu.uiv_transformer_16a": "ɹǝɯɹoɟsuɐɹ⟘ ɹǝʍoԀ ɹ§ǝbɐʇןoΛ ǝsuǝɯɯI ɐɹʇן∩ᄅ§", - "block.gtceu.uiv_transformer_1a": "ɹǝɯɹoɟsuɐɹ⟘ ɹ§ǝbɐʇןoΛ ǝsuǝɯɯI ɐɹʇן∩ᄅ§", - "block.gtceu.uiv_transformer_2a": "ɹǝɯɹoɟsuɐɹ⟘ )xᄅ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ ǝsuǝɯɯI ɐɹʇן∩ᄅ§", - "block.gtceu.uiv_transformer_4a": "ɹǝɯɹoɟsuɐɹ⟘ )xㄣ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ ǝsuǝɯɯI ɐɹʇן∩ᄅ§", - "block.gtceu.uiv_wiremill": "ɹ§III ןןıɯǝɹıM ɔıdƎᄅ§", - "block.gtceu.ulv_16a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§9Ɩ ɹ§ΛꞀ∩8§", - "block.gtceu.ulv_1a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§Ɩ ɹ§ΛꞀ∩8§", - "block.gtceu.ulv_4a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§ㄣ ɹ§ΛꞀ∩8§", - "block.gtceu.ulv_8a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§8 ɹ§ΛꞀ∩8§", - "block.gtceu.ulv_battery_buffer_16x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x9Ɩ ɹ§ǝbɐʇןoΛ ʍoꞀ ɐɹʇן∩8§", - "block.gtceu.ulv_battery_buffer_4x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ xㄣ ɹ§ǝbɐʇןoΛ ʍoꞀ ɐɹʇן∩8§", - "block.gtceu.ulv_battery_buffer_8x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x8 ɹ§ǝbɐʇןoΛ ʍoꞀ ɐɹʇן∩8§", - "block.gtceu.ulv_charger_4x": "ɹǝbɹɐɥƆ oqɹn⟘ xㄣ ɹ§ǝbɐʇןoΛ ʍoꞀ ɐɹʇן∩8§", - "block.gtceu.ulv_energy_input_hatch": "ɥɔʇɐH ʎbɹǝuƎ ΛꞀ∩8§", - "block.gtceu.ulv_energy_output_hatch": "ɥɔʇɐH oɯɐuʎᗡ ΛꞀ∩8§", - "block.gtceu.ulv_input_bus": "snᗺ ʇnduI ΛꞀ∩8§", - "block.gtceu.ulv_input_hatch": "ɥɔʇɐH ʇnduI ΛꞀ∩8§", - "block.gtceu.ulv_machine_casing": "buısɐƆ ǝuıɥɔɐW ΛꞀ∩", - "block.gtceu.ulv_machine_hull": "ןןnH ǝuıɥɔɐWɟ§ ΛꞀ∩8§", - "block.gtceu.ulv_output_bus": "snᗺ ʇndʇnO ΛꞀ∩8§", - "block.gtceu.ulv_output_hatch": "ɥɔʇɐH ʇndʇnO ΛꞀ∩8§", - "block.gtceu.ulv_transformer_16a": "ɹǝɯɹoɟsuɐɹ⟘ ɹǝʍoԀ ɹ§ǝbɐʇןoΛ ʍoꞀ ɐɹʇן∩8§", - "block.gtceu.ulv_transformer_1a": "ɹǝɯɹoɟsuɐɹ⟘ ɹ§ǝbɐʇןoΛ ʍoꞀ ɐɹʇן∩8§", - "block.gtceu.ulv_transformer_2a": "ɹǝɯɹoɟsuɐɹ⟘ )xᄅ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ ʍoꞀ ɐɹʇן∩8§", - "block.gtceu.ulv_transformer_4a": "ɹǝɯɹoɟsuɐɹ⟘ )xㄣ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ ʍoꞀ ɐɹʇן∩8§", - "block.gtceu.uv_1024a_laser_source_hatch": "ɥɔʇɐH ǝɔɹnoS ɹǝsɐꞀ ɹ§Ɐǝ§ㄣᄅ0'Ɩ ɹ§Λ∩Ɛ§", - "block.gtceu.uv_1024a_laser_target_hatch": "ɥɔʇɐH ʇǝbɹɐ⟘ ɹǝsɐꞀ ɹ§Ɐǝ§ㄣᄅ0'Ɩ ɹ§Λ∩Ɛ§", - "block.gtceu.uv_16a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§9Ɩ ɹ§Λ∩Ɛ§", - "block.gtceu.uv_1a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§Ɩ ɹ§Λ∩Ɛ§", - "block.gtceu.uv_256a_laser_source_hatch": "ɥɔʇɐH ǝɔɹnoS ɹǝsɐꞀ ɹ§Ɐǝ§9ϛᄅ ɹ§Λ∩Ɛ§", - "block.gtceu.uv_256a_laser_target_hatch": "ɥɔʇɐH ʇǝbɹɐ⟘ ɹǝsɐꞀ ɹ§Ɐǝ§9ϛᄅ ɹ§Λ∩Ɛ§", - "block.gtceu.uv_4096a_laser_source_hatch": "ɥɔʇɐH ǝɔɹnoS ɹǝsɐꞀ ɹ§Ɐǝ§960'ㄣ ɹ§Λ∩Ɛ§", - "block.gtceu.uv_4096a_laser_target_hatch": "ɥɔʇɐH ʇǝbɹɐ⟘ ɹǝsɐꞀ ɹ§Ɐǝ§960'ㄣ ɹ§Λ∩Ɛ§", - "block.gtceu.uv_4a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§ㄣ ɹ§Λ∩Ɛ§", - "block.gtceu.uv_8a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§8 ɹ§Λ∩Ɛ§", - "block.gtceu.uv_alloy_smelter": "ɹ§ ɹǝʇןǝɯS ʎoןןⱯ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_arc_furnace": "ɹ§ ǝɔɐuɹnℲ ɔɹⱯ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_assembler": "ɹ§ ɹǝןqɯǝssⱯ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_autoclave": "ɹ§ ǝʌɐןɔoʇnⱯ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_battery_buffer_16x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x9Ɩ ɹ§ǝbɐʇןoΛ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_battery_buffer_4x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ xㄣ ɹ§ǝbɐʇןoΛ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_battery_buffer_8x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x8 ɹ§ǝbɐʇןoΛ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_bender": "ɹ§ ɹǝpuǝᗺ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_brewery": "ɹ§ ʎɹǝʍǝɹᗺ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_canner": "ɹ§ ɹǝuuɐƆ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_centrifuge": "ɹ§ ǝbnɟıɹʇuǝƆ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_charger_4x": "ɹǝbɹɐɥƆ oqɹn⟘ xㄣ ɹ§ǝbɐʇןoΛ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_chemical_bath": "ɹ§ ɥʇɐᗺ ןɐɔıɯǝɥƆ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_chemical_reactor": "ɹ§ ɹoʇɔɐǝᴚ ןɐɔıɯǝɥƆ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_circuit_assembler": "ɹ§ ɹǝןqɯǝssⱯ ʇınɔɹıƆ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_compressor": "ɹ§ ɹossǝɹdɯoƆ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_cutter": "ɹ§ ɹǝʇʇnƆ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_diode": "ǝpoıᗡ Λ∩Ɛ§", - "block.gtceu.uv_distillery": "ɹ§ ʎɹǝןןıʇsıᗡ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_dual_input_hatch": "ɥɔʇɐH ʇnduI ןɐnᗡ Λ∩Ɛ§", - "block.gtceu.uv_dual_output_hatch": "ɥɔʇɐH ʇndʇnO ןɐnᗡ Λ∩Ɛ§", - "block.gtceu.uv_electric_furnace": "ɹ§ ǝɔɐuɹnℲ ɔıɹʇɔǝןƎ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_electrolyzer": "ɹ§ ɹǝzʎןoɹʇɔǝןƎ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_electromagnetic_separator": "ɹ§ ɹoʇɐɹɐdǝS ɔıʇǝubɐɯoɹʇɔǝןƎ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_energy_input_hatch": "ɥɔʇɐH ʎbɹǝuƎ Λ∩Ɛ§", - "block.gtceu.uv_energy_input_hatch_16a": "ɥɔʇɐH ʎbɹǝuƎ Ɐ9Ɩ Λ∩Ɛ§", - "block.gtceu.uv_energy_input_hatch_4a": "ɥɔʇɐH ʎbɹǝuƎ Ɐㄣ Λ∩Ɛ§", - "block.gtceu.uv_energy_output_hatch": "ɥɔʇɐH oɯɐuʎᗡ Λ∩Ɛ§", - "block.gtceu.uv_energy_output_hatch_16a": "ɥɔʇɐH oɯɐuʎᗡ Ɐ9Ɩ Λ∩Ɛ§", - "block.gtceu.uv_energy_output_hatch_4a": "ɥɔʇɐH oɯɐuʎᗡ Ɐㄣ Λ∩Ɛ§", - "block.gtceu.uv_extractor": "ɹ§ ɹoʇɔɐɹʇxƎ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_extruder": "ɹ§ ɹǝpnɹʇxƎ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_fermenter": "ɹ§ ɹǝʇuǝɯɹǝℲ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_fluid_heater": "ɹ§ ɹǝʇɐǝH pınןℲ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_fluid_passthrough_hatch": "ɥɔʇɐH ɥbnoɹɥʇssɐԀ pınןℲ Λ∩Ɛ§", - "block.gtceu.uv_fluid_solidifier": "ɹ§ ɹǝıɟıpıןoS pınןℲ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_forge_hammer": "ɹ§ ɹǝɯɯɐH ǝbɹoℲ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_forming_press": "ɹ§ ssǝɹԀ buıɯɹoℲ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_fusion_reactor": "III ʞW ɹǝʇndɯoƆ ɹoʇɔɐǝᴚ uoısnℲ", - "block.gtceu.uv_gas_collector": "ɹ§ ɹoʇɔǝןןoƆ sɐ⅁ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_hermetic_casing": "IIIΛ buısɐƆ ɔıʇǝɯɹǝH", - "block.gtceu.uv_input_bus": "snᗺ ʇnduI Λ∩Ɛ§", - "block.gtceu.uv_input_hatch": "ɥɔʇɐH ʇnduI Λ∩Ɛ§", - "block.gtceu.uv_input_hatch_4x": "ɥɔʇɐH ʇnduI ǝןdnɹpɐnὉ Λ∩Ɛ§", - "block.gtceu.uv_input_hatch_9x": "ɥɔʇɐH ʇnduI ǝןdnuoN Λ∩Ɛ§", - "block.gtceu.uv_item_passthrough_hatch": "ɥɔʇɐH ɥbnoɹɥʇssɐԀ ɯǝʇI Λ∩Ɛ§", - "block.gtceu.uv_lapotronic_battery": "ɹoʇıɔɐdɐƆ ɔıuoɹʇodɐꞀ Λ∩", - "block.gtceu.uv_laser_engraver": "ɹ§ ɹǝʌɐɹbuƎ ɹǝsɐꞀ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_lathe": "ɹ§ ǝɥʇɐꞀ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_macerator": "ɹ§ ɹoʇɐɹǝɔɐW ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_machine_casing": "buısɐƆ ǝuıɥɔɐW Λ∩", - "block.gtceu.uv_machine_hull": "ןןnH ǝuıɥɔɐWɟ§ Λ∩Ɛ§", - "block.gtceu.uv_mixer": "ɹ§ ɹǝxıW ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_muffler_hatch": "Λ∩Ɛ§ ɥɔʇɐH ɹǝןɟɟnW", - "block.gtceu.uv_ore_washer": "ɹ§ ɹǝɥsɐM ǝɹO ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_output_bus": "snᗺ ʇndʇnO Λ∩Ɛ§", - "block.gtceu.uv_output_hatch": "ɥɔʇɐH ʇndʇnO Λ∩Ɛ§", - "block.gtceu.uv_output_hatch_4x": "ɥɔʇɐH ʇndʇnO ǝןdnɹpɐnὉ Λ∩Ɛ§", - "block.gtceu.uv_output_hatch_9x": "ɥɔʇɐH ʇndʇnO ǝןdnuoN Λ∩Ɛ§", - "block.gtceu.uv_packer": "ɹ§ ɹǝʞɔɐԀ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_parallel_hatch": "ɥɔʇɐH ןoɹʇuoƆ ןǝןןɐɹɐԀ ɹǝdnS", - "block.gtceu.uv_polarizer": "ɹ§ ɹǝzıɹɐןoԀ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_quantum_chest": "IIIΛ ʇsǝɥƆ ɯnʇuɐnὉ", - "block.gtceu.uv_quantum_tank": "IIIΛ ʞuɐ⟘ ɯnʇuɐnὉ", - "block.gtceu.uv_rock_crusher": "ɹ§ ɹǝɥsnɹƆ ʞɔoᴚ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_rotor_holder": "ɹǝpןoH ɹoʇoᴚ Λ∩Ɛ§", - "block.gtceu.uv_scanner": "ɹ§ ɹǝuuɐɔS ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_sifter": "ɹ§ ɹǝʇɟıS ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_substation_input_hatch_64a": "ɥɔʇɐH ʎbɹǝuƎ uoıʇɐʇsqnS Ɐㄣ9 Λ∩Ɛ§", - "block.gtceu.uv_substation_output_hatch_64a": "ɥɔʇɐH oɯɐuʎᗡ uoıʇɐʇsqnS Ɐㄣ9 Λ∩Ɛ§", - "block.gtceu.uv_thermal_centrifuge": "ɹ§ ǝbnɟıɹʇuǝƆ ןɐɯɹǝɥ⟘ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_transformer_16a": "ɹǝɯɹoɟsuɐɹ⟘ ɹǝʍoԀ ɹ§ǝbɐʇןoΛ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_transformer_1a": "ɹǝɯɹoɟsuɐɹ⟘ ɹ§ǝbɐʇןoΛ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_transformer_2a": "ɹǝɯɹoɟsuɐɹ⟘ )xᄅ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_transformer_4a": "ɹǝɯɹoɟsuɐɹ⟘ )xㄣ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_wiremill": "ɹ§ ןןıɯǝɹıM ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uv_world_accelerator": "ɹ§ ɹoʇɐɹǝןǝɔɔⱯ pןɹoM ǝʇɐɯıʇן∩Ɛ§", - "block.gtceu.uxv_1024a_laser_source_hatch": "ɥɔʇɐH ǝɔɹnoS ɹǝsɐꞀ ɹ§Ɐǝ§ㄣᄅ0'Ɩ ɹ§ΛX∩ǝ§", - "block.gtceu.uxv_1024a_laser_target_hatch": "ɥɔʇɐH ʇǝbɹɐ⟘ ɹǝsɐꞀ ɹ§Ɐǝ§ㄣᄅ0'Ɩ ɹ§ΛX∩ǝ§", - "block.gtceu.uxv_16a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§9Ɩ ɹ§ΛX∩ǝ§", - "block.gtceu.uxv_1a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§Ɩ ɹ§ΛX∩ǝ§", - "block.gtceu.uxv_256a_laser_source_hatch": "ɥɔʇɐH ǝɔɹnoS ɹǝsɐꞀ ɹ§Ɐǝ§9ϛᄅ ɹ§ΛX∩ǝ§", - "block.gtceu.uxv_256a_laser_target_hatch": "ɥɔʇɐH ʇǝbɹɐ⟘ ɹǝsɐꞀ ɹ§Ɐǝ§9ϛᄅ ɹ§ΛX∩ǝ§", - "block.gtceu.uxv_4096a_laser_source_hatch": "ɥɔʇɐH ǝɔɹnoS ɹǝsɐꞀ ɹ§Ɐǝ§960'ㄣ ɹ§ΛX∩ǝ§", - "block.gtceu.uxv_4096a_laser_target_hatch": "ɥɔʇɐH ʇǝbɹɐ⟘ ɹǝsɐꞀ ɹ§Ɐǝ§960'ㄣ ɹ§ΛX∩ǝ§", - "block.gtceu.uxv_4a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§ㄣ ɹ§ΛX∩ǝ§", - "block.gtceu.uxv_8a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§8 ɹ§ΛX∩ǝ§", - "block.gtceu.uxv_alloy_smelter": "ɹ§ΛI ɹǝʇןǝɯS ʎoןןⱯ ɔıdƎǝ§", - "block.gtceu.uxv_arc_furnace": "ɹ§ΛI ǝɔɐuɹnℲ ɔɹⱯ ɔıdƎǝ§", - "block.gtceu.uxv_assembler": "ɹ§ΛI ɹǝןqɯǝssⱯ ɔıdƎǝ§", - "block.gtceu.uxv_autoclave": "ɹ§ΛI ǝʌɐןɔoʇnⱯ ɔıdƎǝ§", - "block.gtceu.uxv_battery_buffer_16x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x9Ɩ ɹ§ǝbɐʇןoΛ ǝɯǝɹʇxƎ ɐɹʇן∩ǝ§", - "block.gtceu.uxv_battery_buffer_4x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ xㄣ ɹ§ǝbɐʇןoΛ ǝɯǝɹʇxƎ ɐɹʇן∩ǝ§", - "block.gtceu.uxv_battery_buffer_8x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x8 ɹ§ǝbɐʇןoΛ ǝɯǝɹʇxƎ ɐɹʇן∩ǝ§", - "block.gtceu.uxv_bender": "ɹ§ΛI ɹǝpuǝᗺ ɔıdƎǝ§", - "block.gtceu.uxv_brewery": "ɹ§ΛI ʎɹǝʍǝɹᗺ ɔıdƎǝ§", - "block.gtceu.uxv_canner": "ɹ§ΛI ɹǝuuɐƆ ɔıdƎǝ§", - "block.gtceu.uxv_centrifuge": "ɹ§ΛI ǝbnɟıɹʇuǝƆ ɔıdƎǝ§", - "block.gtceu.uxv_charger_4x": "ɹǝbɹɐɥƆ oqɹn⟘ xㄣ ɹ§ǝbɐʇןoΛ ǝɯǝɹʇxƎ ɐɹʇן∩ǝ§", - "block.gtceu.uxv_chemical_bath": "ɹ§ΛI ɥʇɐᗺ ןɐɔıɯǝɥƆ ɔıdƎǝ§", - "block.gtceu.uxv_chemical_reactor": "ɹ§ΛI ɹoʇɔɐǝᴚ ןɐɔıɯǝɥƆ ɔıdƎǝ§", - "block.gtceu.uxv_circuit_assembler": "ɹ§ΛI ɹǝןqɯǝssⱯ ʇınɔɹıƆ ɔıdƎǝ§", - "block.gtceu.uxv_compressor": "ɹ§ΛI ɹossǝɹdɯoƆ ɔıdƎǝ§", - "block.gtceu.uxv_cutter": "ɹ§ΛI ɹǝʇʇnƆ ɔıdƎǝ§", - "block.gtceu.uxv_diode": "ǝpoıᗡ ΛX∩ǝ§", - "block.gtceu.uxv_distillery": "ɹ§ΛI ʎɹǝןןıʇsıᗡ ɔıdƎǝ§", - "block.gtceu.uxv_dual_input_hatch": "ɥɔʇɐH ʇnduI ןɐnᗡ ΛX∩ǝ§", - "block.gtceu.uxv_dual_output_hatch": "ɥɔʇɐH ʇndʇnO ןɐnᗡ ΛX∩ǝ§", - "block.gtceu.uxv_electric_furnace": "ɹ§ΛI ǝɔɐuɹnℲ ɔıɹʇɔǝןƎ ɔıdƎǝ§", - "block.gtceu.uxv_electrolyzer": "ɹ§ΛI ɹǝzʎןoɹʇɔǝןƎ ɔıdƎǝ§", - "block.gtceu.uxv_electromagnetic_separator": "ɹ§ΛI ɹoʇɐɹɐdǝS ɔıʇǝubɐɯoɹʇɔǝןƎ ɔıdƎǝ§", - "block.gtceu.uxv_energy_input_hatch": "ɥɔʇɐH ʎbɹǝuƎ ΛX∩ǝ§", - "block.gtceu.uxv_energy_input_hatch_16a": "ɥɔʇɐH ʎbɹǝuƎ Ɐ9Ɩ ΛX∩ǝ§", - "block.gtceu.uxv_energy_input_hatch_4a": "ɥɔʇɐH ʎbɹǝuƎ Ɐㄣ ΛX∩ǝ§", - "block.gtceu.uxv_energy_output_hatch": "ɥɔʇɐH oɯɐuʎᗡ ΛX∩ǝ§", - "block.gtceu.uxv_energy_output_hatch_16a": "ɥɔʇɐH oɯɐuʎᗡ Ɐ9Ɩ ΛX∩ǝ§", - "block.gtceu.uxv_energy_output_hatch_4a": "ɥɔʇɐH oɯɐuʎᗡ Ɐㄣ ΛX∩ǝ§", - "block.gtceu.uxv_extractor": "ɹ§ΛI ɹoʇɔɐɹʇxƎ ɔıdƎǝ§", - "block.gtceu.uxv_extruder": "ɹ§ΛI ɹǝpnɹʇxƎ ɔıdƎǝ§", - "block.gtceu.uxv_fermenter": "ɹ§ΛI ɹǝʇuǝɯɹǝℲ ɔıdƎǝ§", - "block.gtceu.uxv_fluid_heater": "ɹ§ΛI ɹǝʇɐǝH pınןℲ ɔıdƎǝ§", - "block.gtceu.uxv_fluid_passthrough_hatch": "ɥɔʇɐH ɥbnoɹɥʇssɐԀ pınןℲ ΛX∩ǝ§", - "block.gtceu.uxv_fluid_solidifier": "ɹ§ΛI ɹǝıɟıpıןoS pınןℲ ɔıdƎǝ§", - "block.gtceu.uxv_forge_hammer": "ɹ§ΛI ɹǝɯɯɐH ǝbɹoℲ ɔıdƎǝ§", - "block.gtceu.uxv_forming_press": "ɹ§ΛI ssǝɹԀ buıɯɹoℲ ɔıdƎǝ§", - "block.gtceu.uxv_gas_collector": "ɹ§ΛI ɹoʇɔǝןןoƆ sɐ⅁ ɔıdƎǝ§", - "block.gtceu.uxv_input_bus": "snᗺ ʇnduI ΛX∩ǝ§", - "block.gtceu.uxv_input_hatch": "ɥɔʇɐH ʇnduI ΛX∩ǝ§", - "block.gtceu.uxv_input_hatch_4x": "ɥɔʇɐH ʇnduI ǝןdnɹpɐnὉ ΛX∩ǝ§", - "block.gtceu.uxv_input_hatch_9x": "ɥɔʇɐH ʇnduI ǝןdnuoN ΛX∩ǝ§", - "block.gtceu.uxv_item_passthrough_hatch": "ɥɔʇɐH ɥbnoɹɥʇssɐԀ ɯǝʇI ΛX∩ǝ§", - "block.gtceu.uxv_laser_engraver": "ɹ§ΛI ɹǝʌɐɹbuƎ ɹǝsɐꞀ ɔıdƎǝ§", - "block.gtceu.uxv_lathe": "ɹ§ΛI ǝɥʇɐꞀ ɔıdƎǝ§", - "block.gtceu.uxv_macerator": "ɹ§ΛI ɹoʇɐɹǝɔɐW ɔıdƎǝ§", - "block.gtceu.uxv_machine_casing": "buısɐƆ ǝuıɥɔɐW ΛX∩", - "block.gtceu.uxv_machine_hull": "ןןnH ǝuıɥɔɐWɟ§ ΛX∩ǝ§", - "block.gtceu.uxv_mixer": "ɹ§ΛI ɹǝxıW ɔıdƎǝ§", - "block.gtceu.uxv_muffler_hatch": "ΛX∩ǝ§ ɥɔʇɐH ɹǝןɟɟnW", - "block.gtceu.uxv_ore_washer": "ɹ§ΛI ɹǝɥsɐM ǝɹO ɔıdƎǝ§", - "block.gtceu.uxv_output_bus": "snᗺ ʇndʇnO ΛX∩ǝ§", - "block.gtceu.uxv_output_hatch": "ɥɔʇɐH ʇndʇnO ΛX∩ǝ§", - "block.gtceu.uxv_output_hatch_4x": "ɥɔʇɐH ʇndʇnO ǝןdnɹpɐnὉ ΛX∩ǝ§", - "block.gtceu.uxv_output_hatch_9x": "ɥɔʇɐH ʇndʇnO ǝןdnuoN ΛX∩ǝ§", - "block.gtceu.uxv_packer": "ɹ§ΛI ɹǝʞɔɐԀ ɔıdƎǝ§", - "block.gtceu.uxv_polarizer": "ɹ§ΛI ɹǝzıɹɐןoԀ ɔıdƎǝ§", - "block.gtceu.uxv_quantum_chest": "IIX ʇsǝɥƆ ɯnʇuɐnὉ", - "block.gtceu.uxv_quantum_tank": "IIX ʞuɐ⟘ ɯnʇuɐnὉ", - "block.gtceu.uxv_rock_crusher": "ɹ§ΛI ɹǝɥsnɹƆ ʞɔoᴚ ɔıdƎǝ§", - "block.gtceu.uxv_rotor_holder": "ɹǝpןoH ɹoʇoᴚ ΛX∩ǝ§", - "block.gtceu.uxv_scanner": "ɹ§ΛI ɹǝuuɐɔS ɔıdƎǝ§", - "block.gtceu.uxv_sifter": "ɹ§ΛI ɹǝʇɟıS ɔıdƎǝ§", - "block.gtceu.uxv_substation_input_hatch_64a": "ɥɔʇɐH ʎbɹǝuƎ uoıʇɐʇsqnS Ɐㄣ9 ΛX∩ǝ§", - "block.gtceu.uxv_substation_output_hatch_64a": "ɥɔʇɐH oɯɐuʎᗡ uoıʇɐʇsqnS Ɐㄣ9 ΛX∩ǝ§", - "block.gtceu.uxv_thermal_centrifuge": "ɹ§ΛI ǝbnɟıɹʇuǝƆ ןɐɯɹǝɥ⟘ ɔıdƎǝ§", - "block.gtceu.uxv_transformer_16a": "ɹǝɯɹoɟsuɐɹ⟘ ɹǝʍoԀ ɹ§ǝbɐʇןoΛ ǝɯǝɹʇxƎ ɐɹʇן∩ǝ§", - "block.gtceu.uxv_transformer_1a": "ɹǝɯɹoɟsuɐɹ⟘ ɹ§ǝbɐʇןoΛ ǝɯǝɹʇxƎ ɐɹʇן∩ǝ§", - "block.gtceu.uxv_transformer_2a": "ɹǝɯɹoɟsuɐɹ⟘ )xᄅ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ ǝɯǝɹʇxƎ ɐɹʇן∩ǝ§", - "block.gtceu.uxv_transformer_4a": "ɹǝɯɹoɟsuɐɹ⟘ )xㄣ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ ǝɯǝɹʇxƎ ɐɹʇן∩ǝ§", - "block.gtceu.uxv_wiremill": "ɹ§ΛI ןןıɯǝɹıM ɔıdƎǝ§", - "block.gtceu.vacuum_freezer": "ɹǝzǝǝɹℲ ɯnnɔɐΛ", - "block.gtceu.vibration_safe_casing": "buısɐƆ ǝɟɐS-uoıʇɐɹqıΛ", - "block.gtceu.void_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH pıoΛ", - "block.gtceu.watertight_casing": "buısɐƆ ʇɥbıʇɹǝʇɐM", - "block.gtceu.white_borderless_lamp": "dɯɐꞀ ssǝןɹǝpɹoᗺ ǝʇıɥM", - "block.gtceu.white_lamp": "dɯɐꞀ ǝʇıɥM", - "block.gtceu.white_large_metal_sheet": "ʇǝǝɥS ןɐʇǝW ǝbɹɐꞀ ǝʇıɥM", - "block.gtceu.white_metal_sheet": "ʇǝǝɥS ןɐʇǝW ǝʇıɥM", - "block.gtceu.white_studs": "spnʇS ǝʇıɥM", - "block.gtceu.wire_coil.tooltip_cracking": ":ʇıu∩ buıʞɔɐɹƆ8§", - "block.gtceu.wire_coil.tooltip_energy_cracking": "%s%%ɟ§ :ǝbɐs∩ ʎbɹǝuƎɐ§ ", - "block.gtceu.wire_coil.tooltip_energy_smelter": "ʇ/∩Ǝ %sɟ§ :ǝbɐs∩ ʎbɹǝuƎɐ§ ", - "block.gtceu.wire_coil.tooltip_extended_info": "oɟuI snuoᗺ ןıoƆ ʍoɥs oʇ ⟘ℲIHS pןoHㄥ§", - "block.gtceu.wire_coil.tooltip_heat": "ʞ %dɟ§ :ʎʇıɔɐdɐƆ ʇɐǝH ǝsɐᗺɔ§", - "block.gtceu.wire_coil.tooltip_parallel_smelter": "%sɟ§ :ןǝןןɐɹɐԀ xɐWϛ§ ", - "block.gtceu.wire_coil.tooltip_pyro": ":uǝʌO ǝsʎןoɹʎԀ8§", - "block.gtceu.wire_coil.tooltip_smelter": ":ɹǝʇןǝɯS ıʇןnW8§", - "block.gtceu.wire_coil.tooltip_speed_pyro": "%s%%ɟ§ :pǝǝdS buıssǝɔoɹԀq§ ", - "block.gtceu.wood_crate": "ǝʇɐɹƆ uǝpooM", - "block.gtceu.wood_drum": "ןǝɹɹɐᗺ uǝpooM", - "block.gtceu.wood_wall": "ןןɐM pooM", - "block.gtceu.wooden_multiblock_tank": "ʞuɐ⟘ ʞɔoןqıʇןnW uǝpooM", - "block.gtceu.wooden_tank_valve": "ǝʌןɐΛ ʞuɐ⟘ uǝpooM", - "block.gtceu.yellow_borderless_lamp": "dɯɐꞀ ssǝןɹǝpɹoᗺ ʍoןןǝʎ", - "block.gtceu.yellow_lamp": "dɯɐꞀ ʍoןןǝʎ", - "block.gtceu.yellow_large_metal_sheet": "ʇǝǝɥS ןɐʇǝW ǝbɹɐꞀ ʍoןןǝʎ", - "block.gtceu.yellow_metal_sheet": "ʇǝǝɥS ןɐʇǝW ʍoןןǝʎ", - "block.gtceu.yellow_stripes_block.a": "ʞɔoןᗺ sǝdıɹʇS ʍoןןǝʎ", - "block.gtceu.yellow_stripes_block.b": "ʞɔoןᗺ sǝdıɹʇS ʍoןןǝʎ", - "block.gtceu.yellow_stripes_block.c": "ʞɔoןᗺ sǝdıɹʇS ʍoןןǝʎ", - "block.gtceu.yellow_stripes_block.d": "ʞɔoןᗺ sǝdıɹʇS ʍoןןǝʎ", - "block.gtceu.yellow_stripes_block_a": "Ɐ ʞɔoןᗺ sǝdıɹʇS ʍoןןǝʎ", - "block.gtceu.yellow_stripes_block_b": "ᗺ ʞɔoןᗺ sǝdıɹʇS ʍoןןǝʎ", - "block.gtceu.yellow_studs": "spnʇS ʍoןןǝʎ", - "block.gtceu.zpm_1024a_laser_source_hatch": "ɥɔʇɐH ǝɔɹnoS ɹǝsɐꞀ ɹ§Ɐǝ§ㄣᄅ0'Ɩ ɹ§WԀZɔ§", - "block.gtceu.zpm_1024a_laser_target_hatch": "ɥɔʇɐH ʇǝbɹɐ⟘ ɹǝsɐꞀ ɹ§Ɐǝ§ㄣᄅ0'Ɩ ɹ§WԀZɔ§", - "block.gtceu.zpm_16a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§9Ɩ ɹ§WԀZɔ§", - "block.gtceu.zpm_1a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§Ɩ ɹ§WԀZɔ§", - "block.gtceu.zpm_256a_laser_source_hatch": "ɥɔʇɐH ǝɔɹnoS ɹǝsɐꞀ ɹ§Ɐǝ§9ϛᄅ ɹ§WԀZɔ§", - "block.gtceu.zpm_256a_laser_target_hatch": "ɥɔʇɐH ʇǝbɹɐ⟘ ɹǝsɐꞀ ɹ§Ɐǝ§9ϛᄅ ɹ§WԀZɔ§", - "block.gtceu.zpm_4096a_laser_source_hatch": "ɥɔʇɐH ǝɔɹnoS ɹǝsɐꞀ ɹ§Ɐǝ§960'ㄣ ɹ§WԀZɔ§", - "block.gtceu.zpm_4096a_laser_target_hatch": "ɥɔʇɐH ʇǝbɹɐ⟘ ɹǝsɐꞀ ɹ§Ɐǝ§960'ㄣ ɹ§WԀZɔ§", - "block.gtceu.zpm_4a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§ㄣ ɹ§WԀZɔ§", - "block.gtceu.zpm_8a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§8 ɹ§WԀZɔ§", - "block.gtceu.zpm_alloy_smelter": "ɹ§III ɹǝʇןǝɯS ʎoןןⱯ ǝʇıןƎɔ§", - "block.gtceu.zpm_arc_furnace": "ɹ§III ǝɔɐuɹnℲ ɔɹⱯ ǝʇıןƎɔ§", - "block.gtceu.zpm_assembler": "ɹ§III ɹǝןqɯǝssⱯ ǝʇıןƎɔ§", - "block.gtceu.zpm_autoclave": "ɹ§III ǝʌɐןɔoʇnⱯ ǝʇıןƎɔ§", - "block.gtceu.zpm_battery_buffer_16x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x9Ɩ ɹ§ǝbɐʇןoΛ WԀZɔ§", - "block.gtceu.zpm_battery_buffer_4x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ xㄣ ɹ§ǝbɐʇןoΛ WԀZɔ§", - "block.gtceu.zpm_battery_buffer_8x": "ɹǝɟɟnᗺ ʎɹǝʇʇɐᗺ x8 ɹ§ǝbɐʇןoΛ WԀZɔ§", - "block.gtceu.zpm_bender": "ɹ§III ɹǝpuǝᗺ ǝʇıןƎɔ§", - "block.gtceu.zpm_brewery": "ɹ§III ʎɹǝʍǝɹᗺ ǝʇıןƎɔ§", - "block.gtceu.zpm_canner": "ɹ§III ɹǝuuɐƆ ǝʇıןƎɔ§", - "block.gtceu.zpm_centrifuge": "ɹ§III ǝbnɟıɹʇuǝƆ ǝʇıןƎɔ§", - "block.gtceu.zpm_charger_4x": "ɹǝbɹɐɥƆ oqɹn⟘ xㄣ ɹ§ǝbɐʇןoΛ WԀZɔ§", - "block.gtceu.zpm_chemical_bath": "ɹ§III ɥʇɐᗺ ןɐɔıɯǝɥƆ ǝʇıןƎɔ§", - "block.gtceu.zpm_chemical_reactor": "ɹ§III ɹoʇɔɐǝᴚ ןɐɔıɯǝɥƆ ǝʇıןƎɔ§", - "block.gtceu.zpm_circuit_assembler": "ɹ§III ɹǝןqɯǝssⱯ ʇınɔɹıƆ ǝʇıןƎɔ§", - "block.gtceu.zpm_compressor": "ɹ§III ɹossǝɹdɯoƆ ǝʇıןƎɔ§", - "block.gtceu.zpm_cutter": "ɹ§III ɹǝʇʇnƆ ǝʇıןƎɔ§", - "block.gtceu.zpm_diode": "ǝpoıᗡ WԀZɔ§", - "block.gtceu.zpm_distillery": "ɹ§III ʎɹǝןןıʇsıᗡ ǝʇıןƎɔ§", - "block.gtceu.zpm_dual_input_hatch": "ɥɔʇɐH ʇnduI ןɐnᗡ WԀZɔ§", - "block.gtceu.zpm_dual_output_hatch": "ɥɔʇɐH ʇndʇnO ןɐnᗡ WԀZɔ§", - "block.gtceu.zpm_electric_furnace": "ɹ§III ǝɔɐuɹnℲ ɔıɹʇɔǝןƎ ǝʇıןƎɔ§", - "block.gtceu.zpm_electrolyzer": "ɹ§III ɹǝzʎןoɹʇɔǝןƎ ǝʇıןƎɔ§", - "block.gtceu.zpm_electromagnetic_separator": "ɹ§III ɹoʇɐɹɐdǝS ɔıʇǝubɐɯoɹʇɔǝןƎ ǝʇıןƎɔ§", - "block.gtceu.zpm_energy_input_hatch": "ɥɔʇɐH ʎbɹǝuƎ WԀZɔ§", - "block.gtceu.zpm_energy_input_hatch_16a": "ɥɔʇɐH ʎbɹǝuƎ Ɐ9Ɩ WԀZɔ§", - "block.gtceu.zpm_energy_input_hatch_4a": "ɥɔʇɐH ʎbɹǝuƎ Ɐㄣ WԀZɔ§", - "block.gtceu.zpm_energy_output_hatch": "ɥɔʇɐH oɯɐuʎᗡ WԀZɔ§", - "block.gtceu.zpm_energy_output_hatch_16a": "ɥɔʇɐH oɯɐuʎᗡ Ɐ9Ɩ WԀZɔ§", - "block.gtceu.zpm_energy_output_hatch_4a": "ɥɔʇɐH oɯɐuʎᗡ Ɐㄣ WԀZɔ§", - "block.gtceu.zpm_extractor": "ɹ§III ɹoʇɔɐɹʇxƎ ǝʇıןƎɔ§", - "block.gtceu.zpm_extruder": "ɹ§III ɹǝpnɹʇxƎ ǝʇıןƎɔ§", - "block.gtceu.zpm_fermenter": "ɹ§III ɹǝʇuǝɯɹǝℲ ǝʇıןƎɔ§", - "block.gtceu.zpm_fluid_heater": "ɹ§III ɹǝʇɐǝH pınןℲ ǝʇıןƎɔ§", - "block.gtceu.zpm_fluid_passthrough_hatch": "ɥɔʇɐH ɥbnoɹɥʇssɐԀ pınןℲ WԀZɔ§", - "block.gtceu.zpm_fluid_solidifier": "ɹ§III ɹǝıɟıpıןoS pınןℲ ǝʇıןƎɔ§", - "block.gtceu.zpm_forge_hammer": "ɹ§III ɹǝɯɯɐH ǝbɹoℲ ǝʇıןƎɔ§", - "block.gtceu.zpm_forming_press": "ɹ§III ssǝɹԀ buıɯɹoℲ ǝʇıןƎɔ§", - "block.gtceu.zpm_fusion_reactor": "II ʞW ɹǝʇndɯoƆ ɹoʇɔɐǝᴚ uoısnℲ", - "block.gtceu.zpm_gas_collector": "ɹ§III ɹoʇɔǝןןoƆ sɐ⅁ ǝʇıןƎɔ§", - "block.gtceu.zpm_hermetic_casing": "IIΛ buısɐƆ ɔıʇǝɯɹǝH", - "block.gtceu.zpm_input_bus": "snᗺ ʇnduI WԀZɔ§", - "block.gtceu.zpm_input_hatch": "ɥɔʇɐH ʇnduI WԀZɔ§", - "block.gtceu.zpm_input_hatch_4x": "ɥɔʇɐH ʇnduI ǝןdnɹpɐnὉ WԀZɔ§", - "block.gtceu.zpm_input_hatch_9x": "ɥɔʇɐH ʇnduI ǝןdnuoN WԀZɔ§", - "block.gtceu.zpm_item_passthrough_hatch": "ɥɔʇɐH ɥbnoɹɥʇssɐԀ ɯǝʇI WԀZɔ§", - "block.gtceu.zpm_lapotronic_battery": "ɹoʇıɔɐdɐƆ ɔıuoɹʇodɐꞀ WԀZ", - "block.gtceu.zpm_laser_engraver": "ɹ§III ɹǝʌɐɹbuƎ ɹǝsɐꞀ ǝʇıןƎɔ§", - "block.gtceu.zpm_lathe": "ɹ§III ǝɥʇɐꞀ ǝʇıןƎɔ§", - "block.gtceu.zpm_macerator": "ɹ§III ɹoʇɐɹǝɔɐW ǝʇıןƎɔ§", - "block.gtceu.zpm_machine_casing": "buısɐƆ ǝuıɥɔɐW WԀZ", - "block.gtceu.zpm_machine_hull": "ןןnH ǝuıɥɔɐWɟ§ WԀZɔ§", - "block.gtceu.zpm_mixer": "ɹ§III ɹǝxıW ǝʇıןƎɔ§", - "block.gtceu.zpm_muffler_hatch": "WԀZɔ§ ɥɔʇɐH ɹǝןɟɟnW", - "block.gtceu.zpm_ore_washer": "ɹ§III ɹǝɥsɐM ǝɹO ǝʇıןƎɔ§", - "block.gtceu.zpm_output_bus": "snᗺ ʇndʇnO WԀZɔ§", - "block.gtceu.zpm_output_hatch": "ɥɔʇɐH ʇndʇnO WԀZɔ§", - "block.gtceu.zpm_output_hatch_4x": "ɥɔʇɐH ʇndʇnO ǝןdnɹpɐnὉ WԀZɔ§", - "block.gtceu.zpm_output_hatch_9x": "ɥɔʇɐH ʇndʇnO ǝןdnuoN WԀZɔ§", - "block.gtceu.zpm_packer": "ɹ§III ɹǝʞɔɐԀ ǝʇıןƎɔ§", - "block.gtceu.zpm_parallel_hatch": "ɥɔʇɐH ןoɹʇuoƆ ןǝןןɐɹɐԀ ǝʇɐɯıʇן∩", - "block.gtceu.zpm_polarizer": "ɹ§III ɹǝzıɹɐןoԀ ǝʇıןƎɔ§", - "block.gtceu.zpm_quantum_chest": "IIΛ ʇsǝɥƆ ɯnʇuɐnὉ", - "block.gtceu.zpm_quantum_tank": "IIΛ ʞuɐ⟘ ɯnʇuɐnὉ", - "block.gtceu.zpm_rock_crusher": "ɹ§III ɹǝɥsnɹƆ ʞɔoᴚ ǝʇıןƎɔ§", - "block.gtceu.zpm_rotor_holder": "ɹǝpןoH ɹoʇoᴚ WԀZɔ§", - "block.gtceu.zpm_scanner": "ɹ§III ɹǝuuɐɔS ǝʇıןƎɔ§", - "block.gtceu.zpm_sifter": "ɹ§III ɹǝʇɟıS ǝʇıןƎɔ§", - "block.gtceu.zpm_substation_input_hatch_64a": "ɥɔʇɐH ʎbɹǝuƎ uoıʇɐʇsqnS Ɐㄣ9 WԀZɔ§", - "block.gtceu.zpm_substation_output_hatch_64a": "ɥɔʇɐH oɯɐuʎᗡ uoıʇɐʇsqnS Ɐㄣ9 WԀZɔ§", - "block.gtceu.zpm_thermal_centrifuge": "ɹ§III ǝbnɟıɹʇuǝƆ ןɐɯɹǝɥ⟘ ǝʇıןƎɔ§", - "block.gtceu.zpm_transformer_16a": "ɹǝɯɹoɟsuɐɹ⟘ ɹǝʍoԀ ɹ§ǝbɐʇןoΛ WԀZɔ§", - "block.gtceu.zpm_transformer_1a": "ɹǝɯɹoɟsuɐɹ⟘ ɹ§ǝbɐʇןoΛ WԀZɔ§", - "block.gtceu.zpm_transformer_2a": "ɹǝɯɹoɟsuɐɹ⟘ )xᄅ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ WԀZɔ§", - "block.gtceu.zpm_transformer_4a": "ɹǝɯɹoɟsuɐɹ⟘ )xㄣ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ WԀZɔ§", - "block.gtceu.zpm_wiremill": "ɹ§III ןןıɯǝɹıM ǝʇıןƎɔ§", - "block.gtceu.zpm_world_accelerator": "ɹ§III ɹoʇɐɹǝןǝɔɔⱯ pןɹoM ǝʇıןƎɔ§", - "block.sterilizing_filter_casing.tooltip": "ʇuǝɯuoɹıʌuǝ ㄥ§pǝzıןıɹǝʇSɐ§ ɐ sǝʇɐǝɹƆ", - "block.surface_rock": "ʞɔoᴚ ǝɔɐɟɹnS %s", - "button.gtceu.mark_as_depleted.name": "pǝʇǝןdǝᗡ sɐ ʞɹɐW", - "button.gtceu.toggle_waypoint.name": "ʇuıodʎɐM ǝןbbo⟘", - "command.gtceu.cape.failure.does_not_exist": "ʇsıxǝ ʇou sǝop %s ǝdɐƆ", - "command.gtceu.cape.give.failed": "pǝʞɔoןun ǝɹǝʍ sǝdɐɔ ʍǝu oN", - "command.gtceu.cape.give.success.multiple": "sɹǝʎɐןd %s ɹoɟ sǝdɐɔ %s pǝʞɔoןu∩", - "command.gtceu.cape.give.success.single": "%s ɹoɟ sǝdɐɔ %s pǝʞɔoןu∩", - "command.gtceu.cape.take.failed": "pǝʌoɯǝɹ ǝq pןnoɔ sǝdɐɔ oN", - "command.gtceu.cape.take.success.multiple": "sɹǝʎɐןd %s ɯoɹɟ sǝdɐɔ %s ʞoo⟘", - "command.gtceu.cape.take.success.single": "%s ɯoɹɟ sǝdɐɔ %s ʞoo⟘", - "command.gtceu.cape.use.failed": "¡)ʇsıxǝ ʇ,usǝop ʇı ɹo( ʇı ǝʌɐɥ ʇ,uop ʎǝɥʇ ǝsnɐɔǝq %s ǝdɐɔ ǝsn ʇ,uɐɔ %s", - "command.gtceu.cape.use.success": "%s ǝdɐɔ buısn ʍou sı %s", - "command.gtceu.cape.use.success.none": "ǝdɐɔ ɐ buısn ɹǝbuoן ou sı %s", - "command.gtceu.dump_data.success": "%s oʇ %s ʎɹʇsıbǝɹ ɯoɹɟ sǝɔɹnosǝɹ %s pǝdɯnᗡ", - "command.gtceu.medical_condition.clear.everything.failed": "ǝʌoɯǝɹ oʇ suoıʇıpuoɔ ou sɐɥ ʇǝbɹɐ⟘", - "command.gtceu.medical_condition.clear.everything.success.multiple": "sʇǝbɹɐʇ %s ɯoɹɟ suoıʇıpuoɔ ןןɐ pǝʌoɯǝᴚ", - "command.gtceu.medical_condition.clear.everything.success.single": "%s ɯoɹɟ suoıʇıpuoɔ ןןɐ pǝʌoɯǝᴚ", - "command.gtceu.medical_condition.clear.specific.failed": "uoıʇıpuoɔ pǝʇsǝnbǝɹ ǝɥʇ ǝʌɐɥ ʇ,usǝop ʇǝbɹɐ⟘", - "command.gtceu.medical_condition.clear.specific.success.multiple": "sʇǝbɹɐʇ %s ɯoɹɟ %s pǝʌoɯǝᴚ", - "command.gtceu.medical_condition.clear.specific.success.single": "%s ɯoɹɟ %s pǝʌoɯǝᴚ", - "command.gtceu.medical_condition.get": "sɐɥ %s", - "command.gtceu.medical_condition.get.element": "spuoɔǝs %s sǝʇnuıɯ %s ɹoɟ %s -", - "command.gtceu.medical_condition.get.element.permanent": ")ʇuǝuɐɯɹǝd( spuoɔǝs %s sǝʇnuıɯ %s ɹoɟ %s -", - "command.gtceu.medical_condition.get.empty": "˙ʎɥʇןɐǝɥ ʎןʇɔǝɟɹǝd sı %s", - "command.gtceu.medical_condition.get.symptoms": ":sɯoʇdɯʎs ǝsǝɥʇ sɐɥ %s ʎןʇuǝɹɹnƆ", - "command.gtceu.medical_condition.get.symptoms.element": "%s -", - "command.gtceu.medical_condition.get.symptoms.empty": "˙sɯoʇdɯʎs ou sɐɥ %s", - "command.gtceu.medical_condition.give.failed": ")ʇǝbɹɐʇ pıןɐʌuı( uoıʇıpuoɔ sıɥʇ ʎןddɐ oʇ ǝןqɐu∩", - "command.gtceu.medical_condition.give.success.multiple": "sʇǝbɹɐʇ %s oʇ %s pǝıןddⱯ", - "command.gtceu.medical_condition.give.success.single": "%s oʇ %s pǝıןddⱯ", - "command.gtceu.place_vein.failure": "%s uoıʇısod ʇɐ %s uıǝʌ ǝɔɐןd oʇ pǝןıɐℲ", - "command.gtceu.place_vein.success": "%s uoıʇısod ʇɐ %s uıǝʌ pǝɔɐןԀ", - "command.gtceu.share_prospection_data.notification": "¡noʎ ɥʇıʍ ɐʇɐp buıʇɔǝdsoɹd buıɹɐɥs sı %s", - "config.gtceu.option.addLoot": "ʇooꞀppɐ", - "config.gtceu.option.ae2": "ᄅǝɐ", - "config.gtceu.option.allowedImageDomains": "suıɐɯoᗡǝbɐɯIpǝʍoןןɐ", - "config.gtceu.option.animationTime": "ǝɯı⟘uoıʇɐɯıuɐ", - "config.gtceu.option.arcRecyclingYield": "pןǝıʎbuıןɔʎɔǝᴚɔɹɐ", - "config.gtceu.option.armorHud": "pnHɹoɯɹɐ", - "config.gtceu.option.autoRebuildResources": "sǝɔɹnosǝᴚpןınqǝᴚoʇnɐ", - "config.gtceu.option.batchDuration": "uoıʇɐɹnᗡɥɔʇɐq", - "config.gtceu.option.bedrockOreDistance": "ǝɔuɐʇsıᗡǝɹOʞɔoɹpǝq", - "config.gtceu.option.bedrockOreDropTagPrefix": "xıɟǝɹԀbɐ⟘doɹᗡǝɹOʞɔoɹpǝq", - "config.gtceu.option.borderColor": "ɹoןoƆɹǝpɹoq", - "config.gtceu.option.bronzeBoilerHeatSpeed": "pǝǝdSʇɐǝHɹǝןıoᗺǝzuoɹq", - "config.gtceu.option.bronzeBoilerMaxTemperature": "ǝɹnʇɐɹǝdɯǝ⟘xɐWɹǝןıoᗺǝzuoɹq", - "config.gtceu.option.buttonAnchor": "ɹoɥɔuⱯuoʇʇnq", - "config.gtceu.option.casingsPerCraft": "ʇɟɐɹƆɹǝԀsbuısɐɔ", - "config.gtceu.option.cleanMultiblocks": "sʞɔoןqıʇןnWuɐǝןɔ", - "config.gtceu.option.client": "ʇuǝıןɔ", - "config.gtceu.option.coloredMaterialBlockOutline": "ǝuıןʇnOʞɔoןᗺןɐıɹǝʇɐWpǝɹoןoɔ", - "config.gtceu.option.coloredTieredMachineOutline": "ǝuıןʇnOǝuıɥɔɐWpǝɹǝı⟘pǝɹoןoɔ", - "config.gtceu.option.coloredWireOutline": "ǝuıןʇnOǝɹıMpǝɹoןoɔ", - "config.gtceu.option.compat": "ʇɐdɯoɔ", - "config.gtceu.option.createCompat": "ʇɐdɯoƆǝʇɐǝɹɔ", - "config.gtceu.option.debug": "bnqǝp", - "config.gtceu.option.debugWorldgen": "uǝbpןɹoMbnqǝp", - "config.gtceu.option.defaultPaintingColor": "ɹoןoƆbuıʇuıɐԀʇןnɐɟǝp", - "config.gtceu.option.defaultUIColor": "ɹoןoƆI∩ʇןnɐɟǝp", - "config.gtceu.option.dev": "ʌǝp", - "config.gtceu.option.direction": "uoıʇɔǝɹıp", - "config.gtceu.option.disableManualCompression": "uoıssǝɹdɯoƆןɐnuɐWǝןqɐsıp", - "config.gtceu.option.doBedrockOres": "sǝɹOʞɔoɹpǝᗺop", - "config.gtceu.option.doSuperflatOres": "sǝɹOʇɐןɟɹǝdnSop", - "config.gtceu.option.doesExplosionDamagesTerrain": "uıɐɹɹǝ⟘sǝbɐɯɐᗡuoısoןdxƎsǝop", - "config.gtceu.option.drum": "ɯnɹp", - "config.gtceu.option.dumpAssets": "sʇǝssⱯdɯnp", - "config.gtceu.option.dumpRecipes": "sǝdıɔǝᴚdɯnp", - "config.gtceu.option.enableArcRecycling": "buıןɔʎɔǝᴚɔɹⱯǝןqɐuǝ", - "config.gtceu.option.enableCleanroom": "ɯooɹuɐǝןƆǝןqɐuǝ", - "config.gtceu.option.enableExtractorRecycling": "buıןɔʎɔǝᴚɹoʇɔɐɹʇxƎǝןqɐuǝ", - "config.gtceu.option.enableFEConverters": "sɹǝʇɹǝʌuoƆƎℲǝןqɐuǝ", - "config.gtceu.option.enableMaceratorRecycling": "buıןɔʎɔǝᴚɹoʇɐɹǝɔɐWǝןqɐuǝ", - "config.gtceu.option.enableMaintenance": "ǝɔuɐuǝʇuıɐWǝןqɐuǝ", - "config.gtceu.option.enableResearch": "ɥɔɹɐǝsǝᴚǝןqɐuǝ", - "config.gtceu.option.enableTieredCasings": "sbuısɐƆpǝɹǝı⟘ǝןqɐuǝ", - "config.gtceu.option.enableWorldAccelerators": "sɹoʇɐɹǝןǝɔɔⱯpןɹoMǝןqɐuǝ", - "config.gtceu.option.enchantedTools": "sןoo⟘pǝʇuɐɥɔuǝ", - "config.gtceu.option.energy": "ʎbɹǝuǝ", - "config.gtceu.option.energyConsumption": "uoıʇdɯnsuoƆʎbɹǝuǝ", - "config.gtceu.option.energyUsageMultiplier": "ɹǝıןdıʇןnWǝbɐs∩ʎbɹǝuǝ", - "config.gtceu.option.environmentalHazardDecayRate": "ǝʇɐᴚʎɐɔǝᗡpɹɐzɐHןɐʇuǝɯuoɹıʌuǝ", - "config.gtceu.option.environmentalHazards": "spɹɐzɐHןɐʇuǝɯuoɹıʌuǝ", - "config.gtceu.option.euToFeRatio": "oıʇɐᴚǝℲo⟘nǝ", - "config.gtceu.option.extractorRecyclingYield": "pןǝıʎbuıןɔʎɔǝᴚɹoʇɔɐɹʇxǝ", - "config.gtceu.option.feToEuRatio": "oıʇɐᴚnƎo⟘ǝɟ", - "config.gtceu.option.flintAndSteelRequireSteel": "ןǝǝʇSǝɹınbǝᴚןǝǝʇSpuⱯʇuıןɟ", - "config.gtceu.option.ftbChunksIntegration": "uoıʇɐɹbǝʇuIsʞunɥƆqʇɟ", - "config.gtceu.option.gameplay": "ʎɐןdǝɯɐb", - "config.gtceu.option.generateLowQualityGems": "sɯǝ⅁ʎʇıןɐnὉʍoꞀǝʇɐɹǝuǝb", - "config.gtceu.option.ghostCircuit": "ʇınɔɹıƆʇsoɥb", - "config.gtceu.option.gt6StylePipesCables": "sǝןqɐƆsǝdıԀǝןʎʇS9ʇb", - "config.gtceu.option.hardAdvancedIronRecipes": "sǝdıɔǝᴚuoɹIpǝɔuɐʌpⱯpɹɐɥ", - "config.gtceu.option.hardDyeRecipes": "sǝdıɔǝᴚǝʎᗡpɹɐɥ", - "config.gtceu.option.hardGlassRecipes": "sǝdıɔǝᴚssɐן⅁pɹɐɥ", - "config.gtceu.option.hardIronRecipes": "sǝdıɔǝᴚuoɹIpɹɐɥ", - "config.gtceu.option.hardMiscRecipes": "sǝdıɔǝᴚɔsıWpɹɐɥ", - "config.gtceu.option.hardMultiRecipes": "sǝdıɔǝᴚıʇןnWpɹɐɥ", - "config.gtceu.option.hardRedstoneRecipes": "sǝdıɔǝᴚǝuoʇspǝᴚpɹɐɥ", - "config.gtceu.option.hardToolArmorRecipes": "sǝdıɔǝᴚɹoɯɹⱯןoo⟘pɹɐɥ", - "config.gtceu.option.hardWoodRecipes": "sǝdıɔǝᴚpooMpɹɐɥ", - "config.gtceu.option.harderBrickRecipes": "sǝdıɔǝᴚʞɔıɹᗺɹǝpɹɐɥ", - "config.gtceu.option.harderCharcoalRecipe": "ǝdıɔǝᴚןɐoɔɹɐɥƆɹǝpɹɐɥ", - "config.gtceu.option.harderCircuitRecipes": "sǝdıɔǝᴚʇınɔɹıƆɹǝpɹɐɥ", - "config.gtceu.option.harderRods": "spoᴚɹǝpɹɐɥ", - "config.gtceu.option.harmlessActiveTransformers": "sɹǝɯɹoɟsuɐɹ⟘ǝʌıʇɔⱯssǝןɯɹɐɥ", - "config.gtceu.option.hazardsEnabled": "pǝןqɐuƎspɹɐzɐɥ", - "config.gtceu.option.hideFacadesInRecipeViewer": "ɹǝʍǝıΛǝdıɔǝᴚuIsǝpɐɔɐℲǝpıɥ", - "config.gtceu.option.hideFilledCellsInRecipeViewer": "ɹǝʍǝıΛǝdıɔǝᴚuIsןןǝƆpǝןןıℲǝpıɥ", - "config.gtceu.option.hideOreProcessingDiagrams": "sɯɐɹbɐıᗡbuıssǝɔoɹԀǝɹOǝpıɥ", - "config.gtceu.option.highTierContent": "ʇuǝʇuoƆɹǝı⟘ɥbıɥ", - "config.gtceu.option.hpLiquidBoilerBaseOutput": "ʇndʇnOǝsɐᗺɹǝןıoᗺpınbıꞀdɥ", - "config.gtceu.option.hpSolarBoilerBaseOutput": "ʇndʇnOǝsɐᗺɹǝןıoᗺɹɐןoSdɥ", - "config.gtceu.option.hpSolidBoilerBaseOutput": "ʇndʇnOǝsɐᗺɹǝןıoᗺpıןoSdɥ", - "config.gtceu.option.hudLocation": "uoıʇɐɔoꞀpnɥ", - "config.gtceu.option.hudOffsetX": "XʇǝsɟɟOpnɥ", - "config.gtceu.option.hudOffsetY": "ʎʇǝsɟɟOpnɥ", - "config.gtceu.option.inWorldPreviewDuration": "uoıʇɐɹnᗡʍǝıʌǝɹԀpןɹoMuı", - "config.gtceu.option.increaseDungeonLoot": "ʇooꞀuoǝbunᗡǝsɐǝɹɔuı", - "config.gtceu.option.infiniteBedrockOresFluids": "spınןℲsǝɹOʞɔoɹpǝᗺǝʇıuıɟuı", - "config.gtceu.option.journeyMapIntegration": "uoıʇɐɹbǝʇuIdɐWʎǝuɹnoظ", - "config.gtceu.option.largeBoilers": "sɹǝןıoᗺǝbɹɐן", - "config.gtceu.option.ldFluidPipeMinDistance": "ǝɔuɐʇsıᗡuıWǝdıԀpınןℲpן", - "config.gtceu.option.ldItemPipeMinDistance": "ǝɔuɐʇsıᗡuıWǝdıԀɯǝʇIpן", - "config.gtceu.option.liquidBoilerBaseOutput": "ʇndʇnOǝsɐᗺɹǝןıoᗺpınbıן", - "config.gtceu.option.maceratorRecyclingYield": "pןǝıʎbuıןɔʎɔǝᴚɹoʇɐɹǝɔɐɯ", - "config.gtceu.option.machineSounds": "spunoSǝuıɥɔɐɯ", - "config.gtceu.option.machines": "sǝuıɥɔɐɯ", - "config.gtceu.option.machinesEmissiveTextures": "sǝɹnʇxǝ⟘ǝʌıssıɯƎsǝuıɥɔɐɯ", - "config.gtceu.option.machinesHaveBERsByDefault": "ʇןnɐɟǝᗡʎᗺsᴚƎᗺǝʌɐHsǝuıɥɔɐɯ", - "config.gtceu.option.maintenanceCheckRate": "ǝʇɐᴚʞɔǝɥƆǝɔuɐuǝʇuıɐɯ", - "config.gtceu.option.meHatchEnergyUsage": "ǝbɐs∩ʎbɹǝuƎɥɔʇɐHǝɯ", - "config.gtceu.option.minerSpeed": "pǝǝdSɹǝuıɯ", - "config.gtceu.option.minimap": "dɐɯıuıɯ", - "config.gtceu.option.nanoSaber": "ɹǝqɐSouɐu", - "config.gtceu.option.nanoSaberBaseDamage": "ǝbɐɯɐᗡǝsɐᗺɹǝqɐSouɐu", - "config.gtceu.option.nanoSaberDamageBoost": "ʇsooᗺǝbɐɯɐᗡɹǝqɐSouɐu", - "config.gtceu.option.nativeEUToFE": "ƎℲo⟘∩Ǝǝʌıʇɐu", - "config.gtceu.option.nerfPaperCrafting": "buıʇɟɐɹƆɹǝdɐԀɟɹǝu", - "config.gtceu.option.nerfWoodCrafting": "buıʇɟɐɹƆpooMɟɹǝu", - "config.gtceu.option.onlyOwnerBreak": "ʞɐǝɹᗺɹǝuʍOʎןuo", - "config.gtceu.option.onlyOwnerGUI": "I∩⅁ɹǝuʍOʎןuo", - "config.gtceu.option.orderedAssemblyLineFluids": "spınןℲǝuıꞀʎןqɯǝssⱯpǝɹǝpɹo", - "config.gtceu.option.orderedAssemblyLineItems": "sɯǝʇIǝuıꞀʎןqɯǝssⱯpǝɹǝpɹo", - "config.gtceu.option.oreBlockProspectRange": "ǝbuɐᴚʇɔǝdsoɹԀʞɔoןᗺǝɹo", - "config.gtceu.option.oreGenerationChunkCacheSize": "ǝzıSǝɥɔɐƆʞunɥƆuoıʇɐɹǝuǝ⅁ǝɹo", - "config.gtceu.option.oreIconSize": "ǝzıSuoɔIǝɹo", - "config.gtceu.option.oreIndicatorChunkCacheSize": "ǝzıSǝɥɔɐƆʞunɥƆɹoʇɐɔıpuIǝɹo", - "config.gtceu.option.oreIndicators": "sɹoʇɐɔıpuIǝɹo", - "config.gtceu.option.oreNamePrefix": "xıɟǝɹԀǝɯɐNǝɹo", - "config.gtceu.option.oreScaleStop": "doʇSǝןɐɔSǝɹo", - "config.gtceu.option.oreVeinGridSize": "ǝzıSpıɹ⅁uıǝΛǝɹo", - "config.gtceu.option.oreVeinRandomOffset": "ʇǝsɟɟOɯopuɐᴚuıǝΛǝɹo", - "config.gtceu.option.oreVeins": "suıǝΛǝɹo", - "config.gtceu.option.ownerOPBypass": "ssɐdʎᗺԀOɹǝuʍo", - "config.gtceu.option.prospectorEnergyUseMultiplier": "ɹǝıןdıʇןnWǝs∩ʎbɹǝuƎɹoʇɔǝdsoɹd", - "config.gtceu.option.quantumTank": "ʞuɐ⟘ɯnʇuɐnb", - "config.gtceu.option.recipes": "sǝdıɔǝɹ", - "config.gtceu.option.removeSmeltingForEBFMetals": "sןɐʇǝWℲᗺƎɹoℲbuıʇןǝɯSǝʌoɯǝɹ", - "config.gtceu.option.removeVanillaBlockRecipes": "sǝdıɔǝᴚʞɔoןᗺɐןןıuɐΛǝʌoɯǝɹ", - "config.gtceu.option.removeVanillaLargeOreVeins": "suıǝΛǝɹOǝbɹɐꞀɐןןıuɐΛǝʌoɯǝɹ", - "config.gtceu.option.removeVanillaOreGen": "uǝ⅁ǝɹOɐןןıuɐΛǝʌoɯǝɹ", - "config.gtceu.option.removeVanillaTNTRecipe": "ǝdıɔǝᴚ⟘N⟘ɐןןıuɐΛǝʌoɯǝɹ", - "config.gtceu.option.renderFluids": "spınןℲɹǝpuǝɹ", - "config.gtceu.option.renderGrowingPlants": "sʇuɐןԀbuıʍoɹ⅁ɹǝpuǝɹ", - "config.gtceu.option.renderer": "ɹǝɹǝpuǝɹ", - "config.gtceu.option.replaceMinedBlocksWith": "ɥʇıMsʞɔoןᗺpǝuıWǝɔɐןdǝɹ", - "config.gtceu.option.replaceWithCobbleVersion": "uoısɹǝΛǝןqqoƆɥʇıMǝɔɐןdǝɹ", - "config.gtceu.option.requireGTToolsForBlocks": "sʞɔoןᗺɹoℲsןoo⟘⟘⅁ǝɹınbǝɹ", - "config.gtceu.option.rngDamageElectricTools": "sןoo⟘ɔıɹʇɔǝןƎǝbɐɯɐᗡbuɹ", - "config.gtceu.option.rubberTreeSpawnChance": "ǝɔuɐɥƆuʍɐdSǝǝɹ⟘ɹǝqqnɹ", - "config.gtceu.option.sandOresFall": "ןןɐℲsǝɹOpuɐs", - "config.gtceu.option.shouldWeatherOrTerrainExplosion": "uoısoןdxƎuıɐɹɹǝ⟘ɹOɹǝɥʇɐǝMpןnoɥs", - "config.gtceu.option.showDimensionTier": "ɹǝı⟘uoısuǝɯıᗡʍoɥs", - "config.gtceu.option.smallBoilers": "sɹǝןıoᗺןןɐɯs", - "config.gtceu.option.solarBoilerBaseOutput": "ʇndʇnOǝsɐᗺɹǝןıoᗺɹɐןos", - "config.gtceu.option.solidBoilerBaseOutput": "ʇndʇnOǝsɐᗺɹǝןıoᗺpıןos", - "config.gtceu.option.sprayCanChainLength": "ɥʇbuǝꞀuıɐɥƆuɐƆʎɐɹds", - "config.gtceu.option.steamMultiParallelAmount": "ʇunoɯⱯןǝןןɐɹɐԀıʇןnWɯɐǝʇs", - "config.gtceu.option.steamPerWater": "ɹǝʇɐMɹǝԀɯɐǝʇs", - "config.gtceu.option.steelBoilerHeatSpeed": "pǝǝdSʇɐǝHɹǝןıoᗺןǝǝʇs", - "config.gtceu.option.steelBoilerMaxTemperature": "ǝɹnʇɐɹǝdɯǝ⟘xɐWɹǝןıoᗺןǝǝʇs", - "config.gtceu.option.steelSteamMultiblocks": "sʞɔoןqıʇןnWɯɐǝʇSןǝǝʇs", - "config.gtceu.option.surfaceRockProspectRange": "ǝbuɐᴚʇɔǝdsoɹԀʞɔoᴚǝɔɐɟɹns", - "config.gtceu.option.tankItemFluidPreview": "ʍǝıʌǝɹԀpınןℲɯǝʇIʞuɐʇ", - "config.gtceu.option.temperaturesInCelsius": "snısןǝƆuIsǝɹnʇɐɹǝdɯǝʇ", - "config.gtceu.option.titaniumBoilerHeatSpeed": "pǝǝdSʇɐǝHɹǝןıoᗺɯnıuɐʇıʇ", - "config.gtceu.option.titaniumBoilerMaxTemperature": "ǝɹnʇɐɹǝdɯǝ⟘xɐWɹǝןıoᗺɯnıuɐʇıʇ", - "config.gtceu.option.toggle": "ǝןbboʇ", - "config.gtceu.option.toolCraftingSounds": "spunoSbuıʇɟɐɹƆןooʇ", - "config.gtceu.option.toolUseSounds": "spunoSǝs∩ןooʇ", - "config.gtceu.option.tools": "sןooʇ", - "config.gtceu.option.treeFellingDelay": "ʎɐןǝᗡbuıןןǝℲǝǝɹʇ", - "config.gtceu.option.tungstensteelBoilerHeatSpeed": "pǝǝdSʇɐǝHɹǝןıoᗺןǝǝʇsuǝʇsbunʇ", - "config.gtceu.option.tungstensteelBoilerMaxTemperature": "ǝɹnʇɐɹǝdɯǝ⟘xɐWɹǝןıoᗺןǝǝʇsuǝʇsbunʇ", - "config.gtceu.option.universalHazards": "spɹɐzɐHןɐsɹǝʌıun", - "config.gtceu.option.updateIntervals": "sןɐʌɹǝʇuIǝʇɐpdn", - "config.gtceu.option.useVBO": "OᗺΛǝsn", - "config.gtceu.option.voltageTierAdvImpeller": "ɹǝןןǝdɯIʌpⱯɹǝı⟘ǝbɐʇןoʌ", - "config.gtceu.option.voltageTierAdvNanoSuit": "ʇınSouɐNʌpⱯɹǝı⟘ǝbɐʇןoʌ", - "config.gtceu.option.voltageTierAdvQuarkTech": "ɥɔǝ⟘ʞɹɐnὉʌpⱯɹǝı⟘ǝbɐʇןoʌ", - "config.gtceu.option.voltageTierImpeller": "ɹǝןןǝdɯIɹǝı⟘ǝbɐʇןoʌ", - "config.gtceu.option.voltageTierNanoSuit": "ʇınSouɐNɹǝı⟘ǝbɐʇןoʌ", - "config.gtceu.option.voltageTierNightVision": "uoısıΛʇɥbıNɹǝı⟘ǝbɐʇןoʌ", - "config.gtceu.option.voltageTierQuarkTech": "ɥɔǝ⟘ʞɹɐnὉɹǝı⟘ǝbɐʇןoʌ", - "config.gtceu.option.worldAcceleratorBlacklist": "ʇsıןʞɔɐןᗺɹoʇɐɹǝןǝɔɔⱯpןɹoʍ", - "config.gtceu.option.worldgen": "uǝbpןɹoʍ", - "config.gtceu.option.xOffset": "ʇǝsɟɟOx", - "config.gtceu.option.xaerosMapIntegration": "uoıʇɐɹbǝʇuIdɐWsoɹǝɐx", - "config.gtceu.option.yOffset": "ʇǝsɟɟOʎ", - "config.gtceu.option.zombieSpawnWithSabers": "sɹǝqɐSɥʇıMuʍɐdSǝıqɯoz", - "config.jade.plugin_gtceu.auto_output_info": "oɟuI ʇndʇnO oʇnⱯ ]nƎƆ⟘⅁[", - "config.jade.plugin_gtceu.battery_info": "oɟuı ʎɹǝʇʇɐᗺ ]nƎƆ⟘⅁[", - "config.jade.plugin_gtceu.cable_info": "oɟuI ǝןqɐƆ ]nƎƆ⟘⅁[", - "config.jade.plugin_gtceu.controllable_provider": "ǝןqɐןןoɹʇuoƆ ]nƎƆ⟘⅁[", - "config.jade.plugin_gtceu.data_bank": "oɟuI ʞuɐᗺ ɐʇɐᗡ ]nƎƆ⟘⅁[", - "config.jade.plugin_gtceu.electric_container_provider": "ɹǝuıɐʇuoƆ ɔıɹʇɔǝןƎ ]nƎƆ⟘⅁[", - "config.jade.plugin_gtceu.energy_converter_provider": "ǝpoW ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ]nƎƆ⟘⅁[", - "config.jade.plugin_gtceu.exhaust_vent_info": "oɟuI ʇuǝΛ ʇsnɐɥxƎ ]nƎƆ⟘⅁[", - "config.jade.plugin_gtceu.hazard_cleaner_provider": "ɹǝuɐǝןƆ pɹɐzɐH ]nƎƆ⟘⅁[", - "config.jade.plugin_gtceu.ldp_endpoint": "oɟuI ʇuıodpuƎ ǝuıןǝdıԀ ǝɔuɐʇsıᗡ buoꞀ ]nƎƆ⟘⅁[", - "config.jade.plugin_gtceu.machine_mode": "ǝpoW ǝuıɥɔɐW ]nƎƆ⟘⅁[", - "config.jade.plugin_gtceu.maintenance_info": "oɟuI ǝɔuɐuǝʇuıɐW ]nƎƆ⟘⅁[", - "config.jade.plugin_gtceu.me_pattern_buffer": "oɟuI ɹǝɟɟnᗺ uɹǝʇʇɐԀ ]nƎƆ⟘⅁[", - "config.jade.plugin_gtceu.me_pattern_buffer_proxy": "oɟuI ʎxoɹԀ ɹǝɟɟnᗺ uɹǝʇʇɐԀ ]nƎƆ⟘⅁[", - "config.jade.plugin_gtceu.multiblock_structure": "ǝɹnʇɔnɹʇS ʞɔoןᗺıʇןnW ]nƎƆ⟘⅁[", - "config.jade.plugin_gtceu.parallel_info": "oɟuI ןǝןןɐɹɐԀ ]nƎƆ⟘⅁[", - "config.jade.plugin_gtceu.primitive_pump": "oɟuI dɯnԀ ǝʌıʇıɯıɹԀ ]nƎƆ⟘⅁[", - "config.jade.plugin_gtceu.recipe_logic_provider": "ɔıboꞀ ǝdıɔǝᴚ ]nƎƆ⟘⅁[", - "config.jade.plugin_gtceu.recipe_output_info": "oɟuI ʇndʇnO ǝdıɔǝᴚ ]nƎƆ⟘⅁[", - "config.jade.plugin_gtceu.stained_color": "oɟuI ʞɔoןᗺ pǝuıɐʇS ]nƎƆ⟘⅁[", - "config.jade.plugin_gtceu.steam_boiler_info": "oɟuI ɹǝןıoᗺ ɯɐǝʇS ]nƎƆ⟘⅁[", - "config.jade.plugin_gtceu.transformer": "oɟuI ɹǝɯɹoɟsuɐɹ⟘ ]nƎƆ⟘⅁[", - "config.jade.plugin_gtceu.workable_provider": "ǝןqɐʞɹoM ]nƎƆ⟘⅁[", - "config.screen.gtceu": "uoıʇɐɹnbıɟuoƆ nƎƆɥɔǝ⟘bǝɹ⅁", - "cover.advanced_detector.latch.disabled.0": "snonuıʇuoƆ :ɹoıʌɐɥǝᗺ", - "cover.advanced_detector.latch.disabled.1": "", - "cover.advanced_detector.latch.disabled.2": "˙ɹǝʌoƆ sıɥʇ ɟo ɹoıʌɐɥǝq ǝuoʇspǝɹ ǝɥʇ ǝbuɐɥƆ", - "cover.advanced_detector.latch.disabled.3": "ϛƖ puɐ 0 uǝǝʍʇǝq ʇndʇno xɐɯ puɐ uıɯ uǝǝʍʇǝq sǝnןɐʌ ؛ϛƖ ʇndʇno ɯnɯıxɐɯ ǝɥʇ uɐɥʇ ɹǝɥbıɥ sǝnןɐʌ ؛0 ʇndʇno ɯnɯıuıɯ ǝɥʇ uɐɥʇ ssǝן sǝnןɐʌ ؛ʇןnɐɟǝᗡ - ㄥ§snonuıʇuoƆǝ§", - "cover.advanced_detector.latch.disabled.4": "uıɯ ʍoןǝq ןıʇun 0 ʇndʇno uǝɥʇ 'xɐɯ ǝʌoqɐ ןıʇun ϛƖ ʇndʇno - ㄥ§pǝɥɔʇɐꞀǝ§", - "cover.advanced_detector.latch.enabled.0": "pǝɥɔʇɐꞀ :ɹoıʌɐɥǝᗺ", - "cover.advanced_detector.latch.enabled.1": "", - "cover.advanced_detector.latch.enabled.2": "˙ɹǝʌoƆ sıɥʇ ɟo ɹoıʌɐɥǝq ǝuoʇspǝɹ ǝɥʇ ǝbuɐɥƆ", - "cover.advanced_detector.latch.enabled.3": "ϛƖ puɐ 0 uǝǝʍʇǝq ʇndʇno xɐɯ puɐ uıɯ uǝǝʍʇǝq sǝnןɐʌ ؛ϛƖ ʇndʇno ɯnɯıxɐɯ ǝɥʇ uɐɥʇ ɹǝɥbıɥ sǝnןɐʌ ؛0 ʇndʇno ɯnɯıuıɯ ǝɥʇ uɐɥʇ ssǝן sǝnןɐʌ ؛ʇןnɐɟǝᗡ - ㄥ§snonuıʇuoƆǝ§", - "cover.advanced_detector.latch.enabled.4": "uıɯ ʍoןǝq ןıʇun 0 ʇndʇno uǝɥʇ 'xɐɯ ǝʌoqɐ ןıʇun ϛƖ ʇndʇno - ㄥ§pǝɥɔʇɐꞀǝ§", - "cover.advanced_energy_detector.invert.disabled.0": "ןɐɯɹoN :ʇndʇnO", - "cover.advanced_energy_detector.invert.disabled.1": "", - "cover.advanced_energy_detector.invert.disabled.2": "ɔıboן ǝuoʇspǝɹ ǝɥʇ ʇɹǝʌuı oʇ ǝןbbo⟘", - "cover.advanced_energy_detector.invert.disabled.3": "∩Ǝ xɐɯ ǝɥʇ uɐɥʇ ɹǝʇɐǝɹb uǝɥʍ buıʇʇıɯǝ sdoʇs puɐ '∩Ǝ ɯnɯıuıɯ ǝɥʇ uɐɥʇ ssǝן uǝɥʍ pǝʇʇıɯǝ sı ǝuoʇspǝɹ 'ʇןnɐɟǝp ʎᗺ", - "cover.advanced_energy_detector.invert.enabled.0": "pǝʇɹǝʌuI :ʇndʇnO", - "cover.advanced_energy_detector.invert.enabled.1": "", - "cover.advanced_energy_detector.invert.enabled.2": "ɔıboן ǝuoʇspǝɹ ǝɥʇ ʇɹǝʌuı oʇ ǝןbbo⟘", - "cover.advanced_energy_detector.invert.enabled.3": "∩Ǝ xɐɯ ǝɥʇ uɐɥʇ ɹǝʇɐǝɹb uǝɥʍ buıʇʇıɯǝ sdoʇs puɐ '∩Ǝ ɯnɯıuıɯ ǝɥʇ uɐɥʇ ssǝן uǝɥʍ pǝʇʇıɯǝ sı ǝuoʇspǝɹ 'ʇןnɐɟǝp ʎᗺ", - "cover.advanced_energy_detector.label": "ɹoʇɔǝʇǝᗡ ʎbɹǝuƎ pǝɔuɐʌpⱯ", - "cover.advanced_energy_detector.max": "xɐW", - "cover.advanced_energy_detector.min": "uıW", - "cover.advanced_energy_detector.use_percent.disabled.0": "∩Ǝ ǝʇǝɹɔsıᗡ :ǝpoW", - "cover.advanced_energy_detector.use_percent.disabled.1": "", - "cover.advanced_energy_detector.use_percent.disabled.2": "˙ǝbɐɹoʇs ʎbɹǝuǝ pǝɥɔɐʇʇɐ uɐ ʇsuıɐbɐ xɐɯ/uıɯ buıɹɐdɯoɔ ɹoɟ sǝbɐʇuǝɔɹǝd ɹo sǝnןɐʌ ∩Ǝ ǝʇǝɹɔsıp buısn uǝǝʍʇǝq ǝbuɐɥƆ", - "cover.advanced_energy_detector.use_percent.enabled.0": "ǝbɐʇuǝɔɹǝԀ :ǝpoW", - "cover.advanced_energy_detector.use_percent.enabled.1": "", - "cover.advanced_energy_detector.use_percent.enabled.2": "˙ǝbɐɹoʇs ʎbɹǝuǝ pǝɥɔɐʇʇɐ uɐ ʇsuıɐbɐ xɐɯ/uıɯ buıɹɐdɯoɔ ɹoɟ sǝbɐʇuǝɔɹǝd ɹo sǝnןɐʌ ∩Ǝ ǝʇǝɹɔsıp buısn uǝǝʍʇǝq ǝbuɐɥƆ", - "cover.advanced_fluid_detector.invert.disabled.0": "ןɐɯɹoN :ʇndʇnO", - "cover.advanced_fluid_detector.invert.disabled.1": "", - "cover.advanced_fluid_detector.invert.disabled.2": "ɔıboן ǝuoʇspǝɹ ǝɥʇ ʇɹǝʌuı oʇ ǝןbbo⟘", - "cover.advanced_fluid_detector.invert.disabled.3": "ɯnɯıxɐɯ ʇǝs ǝɥʇ oʇ dn pınןɟ ɟo ᗺɯ uıɯ ǝɥʇ uɐɥʇ ɹǝʇɐǝɹb uǝɥʍ buıʇʇıɯǝ sʇɹɐʇs puɐ 'pınןɟ ɟo ᗺɯ ɯnɯıuıɯ ǝɥʇ uɐɥʇ ssǝן uǝɥʍ buıʇʇıɯǝ sdoʇs ǝuoʇspǝɹ 'ʇןnɐɟǝp ʎᗺ", - "cover.advanced_fluid_detector.invert.enabled.0": "pǝʇɹǝʌuI :ʇndʇnO", - "cover.advanced_fluid_detector.invert.enabled.1": "", - "cover.advanced_fluid_detector.invert.enabled.2": "ɔıboן ǝuoʇspǝɹ ǝɥʇ ʇɹǝʌuı oʇ ǝןbbo⟘", - "cover.advanced_fluid_detector.invert.enabled.3": "ɯnɯıxɐɯ ʇǝs ǝɥʇ oʇ dn pınןɟ ɟo ᗺɯ uıɯ ǝɥʇ uɐɥʇ ɹǝʇɐǝɹb uǝɥʍ buıʇʇıɯǝ sʇɹɐʇs puɐ 'pınןɟ ɟo ᗺɯ ɯnɯıuıɯ ǝɥʇ uɐɥʇ ssǝן uǝɥʍ buıʇʇıɯǝ sdoʇs ǝuoʇspǝɹ 'ʇןnɐɟǝp ʎᗺ", - "cover.advanced_fluid_detector.label": "ɹoʇɔǝʇǝᗡ pınןℲ pǝɔuɐʌpⱯ", - "cover.advanced_fluid_detector.max": ")ᗺɯ( pınןℲ xɐW", - "cover.advanced_fluid_detector.min": ")ᗺɯ( pınןℲ uıW", - "cover.advanced_item_detector.invert.disabled.0": "ןɐɯɹoN :ʇndʇnO", - "cover.advanced_item_detector.invert.disabled.1": "", - "cover.advanced_item_detector.invert.disabled.2": "ɔıboן ǝuoʇspǝɹ ǝɥʇ ʇɹǝʌuı oʇ ǝןbbo⟘", - "cover.advanced_item_detector.invert.disabled.3": "ɯnɯıxɐɯ ʇǝs ǝɥʇ oʇ dn sɯǝʇı ɟo ʇunoɯɐ uıɯ ǝɥʇ uɐɥʇ ɹǝʇɐǝɹb uǝɥʍ buıʇʇıɯǝ sʇɹɐʇs puɐ 'sɯǝʇı ɟo ʇunoɯɐ ɯnɯıuıɯ ǝɥʇ uɐɥʇ ssǝן uǝɥʍ buıʇʇıɯǝ sdoʇs ǝuoʇspǝɹ 'ʇןnɐɟǝp ʎᗺ", - "cover.advanced_item_detector.invert.enabled.0": "pǝʇɹǝʌuI :ʇndʇnO", - "cover.advanced_item_detector.invert.enabled.1": "", - "cover.advanced_item_detector.invert.enabled.2": "ɔıboן ǝuoʇspǝɹ ǝɥʇ ʇɹǝʌuı oʇ ǝןbbo⟘", - "cover.advanced_item_detector.invert.enabled.3": "ɯnɯıxɐɯ ʇǝs ǝɥʇ oʇ dn sɯǝʇı ɟo ʇunoɯɐ uıɯ ǝɥʇ uɐɥʇ ɹǝʇɐǝɹb uǝɥʍ buıʇʇıɯǝ sʇɹɐʇs puɐ 'sɯǝʇı ɟo ʇunoɯɐ ɯnɯıuıɯ ǝɥʇ uɐɥʇ ssǝן uǝɥʍ buıʇʇıɯǝ sdoʇs ǝuoʇspǝɹ 'ʇןnɐɟǝp ʎᗺ", - "cover.advanced_item_detector.label": "ɹoʇɔǝʇǝᗡ ɯǝʇI pǝɔuɐʌpⱯ", - "cover.advanced_item_detector.max": "sɯǝʇI xɐW", - "cover.advanced_item_detector.min": "sɯǝʇI uıW", - "cover.bucket.mode.bucket": "ᗺ", - "cover.bucket.mode.milli_bucket": "ᗺɯ", - "cover.conveyor.blocks_input.disabled.0": "˙ǝdıd oʇuı ʎɹoʇuǝʌuı ǝɥʇ ɯoɹɟ sɯǝʇı ןןnd oʇ ʇǝs sı ɹǝʌoɔ uǝɥʍ pǝʇɹǝsuı ǝq ʇou ןןıʍ sɯǝʇı 'pǝןqɐuǝ ɟI", - "cover.conveyor.blocks_input.disabled.1": "pǝןqɐsıᗡɔ§", - "cover.conveyor.blocks_input.enabled.0": "˙ǝdıd oʇuı ʎɹoʇuǝʌuı ǝɥʇ ɯoɹɟ sɯǝʇı ןןnd oʇ ʇǝs sı ɹǝʌoɔ uǝɥʍ pǝʇɹǝsuı ǝq ʇou ןןıʍ sɯǝʇı 'pǝןqɐuǝ ɟI", - "cover.conveyor.blocks_input.enabled.1": "pǝןqɐuƎɐ§", - "cover.conveyor.distribution.insert_first.0": "ʎʇıɹoıɹԀq§ :ǝpoW uoıʇnqıɹʇsıᗡ", - "cover.conveyor.distribution.insert_first.1": "˙puıɟ uɐɔ ʇı ʎʇıɹoıɹd ʇsǝɥbıɥ ǝɥʇ ɥʇıʍ ʎɹoʇuǝʌuı ʇsɹıɟ ǝɥʇ oʇuı ʇɹǝsuı ןןıMㄥ§", - "cover.conveyor.distribution.insert_first.2": "˙ɥʇɐd ɐ ɟo ʎʇıɹoıɹd ǝɥʇ ɹǝʍoן sǝdıd ɯǝʇı ǝʌıʇɔıɹʇsǝᴚㄥ§", - "cover.conveyor.distribution.round_robin_global.0": "uıqoᴚ punoᴚq§ :ǝpoW uoıʇnqıɹʇsıᗡ", - "cover.conveyor.distribution.round_robin_global.1": "sǝıɹoʇuǝʌuı pǝʇɔǝuuoɔ ssoɹɔɐ ʎןןɐnbǝ sɯǝʇı sʇıןdSㄥ§", - "cover.conveyor.distribution.round_robin_prio.0": "uoıʇɔıɹʇsǝᴚ ɥʇıʍ uıqoᴚ punoᴚq§ :ǝpoW uoıʇnqıɹʇsıᗡ", - "cover.conveyor.distribution.round_robin_prio.1": "˙sǝıɹoʇuǝʌuı pǝʇɔǝuuoɔ ssoɹɔɐ ʎןןɐnbǝ sɯǝʇı ʇıןds oʇ sǝıɹ⟘ㄥ§", - "cover.conveyor.distribution.round_robin_prio.2": "˙ǝןqɐןıɐʌɐ ǝɹɐ sɥʇɐd ɹǝɥʇo ou ssǝןun sǝdıd ɯǝʇı ǝʌıʇɔıɹʇsǝᴚ uʍop sɯǝʇı puǝs ʇou ןןıMㄥ§", - "cover.conveyor.item_filter.title": "ɹǝʇןıℲ ɯǝʇI", - "cover.conveyor.mode": "%s :ǝpoW", - "cover.conveyor.mode.export": "ʇɹodxƎ :ǝpoW", - "cover.conveyor.mode.import": "ʇɹodɯI :ǝpoW", - "cover.conveyor.tag.title.0": "ǝɯɐN bɐ⟘", - "cover.conveyor.tag.title.1": ")pɹɐɔpןıʍ ɹoɟ * ǝsn(", - "cover.conveyor.title": ")%s( sbuıʇʇǝS ɹǝʌoƆ ɹoʎǝʌuoƆ", - "cover.conveyor.transfer_rate": "ɔǝs/sɯǝʇıㄥ§", - "cover.detector_base.message_inverted_state": "pǝʇɹǝʌuI :snʇɐʇS buıɹoʇıuoW", - "cover.detector_base.message_normal_state": "ןɐɯɹoN :snʇɐʇS buıɹoʇıuoW", - "cover.ender_fluid_link.incomplete_hex.0": "¡ǝʇǝןdɯoɔuı sı ɹoןoɔ pǝʇʇnduI", - "cover.ender_fluid_link.incomplete_hex.1": ")sʇıbıp xǝɥ 8 ןןɐ( ǝʇǝןdɯoɔ ǝɔuo pǝıןddɐ ǝq ןןıʍ ʇI", - "cover.ender_fluid_link.incomplete_hex.2": "¡sʇıpǝ ǝsoן ןןıʍ ınb ǝɥʇ buısoןƆ", - "cover.ender_fluid_link.iomode.disabled": "pǝןqɐsıᗡ O/I", - "cover.ender_fluid_link.iomode.enabled": "pǝןqɐuƎ O/I", - "cover.ender_fluid_link.private.tooltip.disabled.0": "ǝpoɯ ʞuɐʇ ǝʇɐʌıɹd oʇ ɥɔʇıʍS", - "cover.ender_fluid_link.private.tooltip.disabled.1": "ɹǝʌoɔ ǝɥʇ pǝɔɐןd ʎןןɐuıbıɹo oɥʍ ɹǝʎɐןd ǝɥʇ sǝsn ǝpoɯ ǝʇɐʌıɹԀ", - "cover.ender_fluid_link.private.tooltip.enabled": "ǝpoɯ ʞuɐʇ ɔıןqnd oʇ ɥɔʇıʍS", - "cover.ender_fluid_link.title": "ʞuıꞀ pınןℲ ɹǝpuƎ", - "cover.ender_fluid_link.tooltip.channel_description": "ʇxǝʇ ʇnduı ɥʇıʍ uoıʇdıɹɔsǝp ןǝuuɐɥɔ ʇǝS", - "cover.ender_fluid_link.tooltip.channel_name": "ʇxǝʇ ʇnduı ɥʇıʍ ǝɯɐu ןǝuuɐɥɔ ʇǝS", - "cover.ender_fluid_link.tooltip.clear_button": "uoıʇdıɹɔsǝp ןǝuuɐɥɔ ɹɐǝןƆ", - "cover.ender_fluid_link.tooltip.list_button": "ʇsıן ןǝuuɐɥɔ ʍoɥS", - "cover.ender_item_link.title": "ʞuıꞀ ɯǝʇI ɹǝpuƎ", - "cover.ender_redstone_link.title": "ʞuıꞀ ǝuoʇspǝᴚ ɹǝpuƎ", - "cover.filter.blacklist.disabled": "ʇsıןǝʇıɥM", - "cover.filter.blacklist.enabled": "ʇsıןʞɔɐןᗺ", - "cover.filter.mode.filter_both": "ʇɔɐɹʇxƎ/ʇɹǝsuI ɹǝʇןıℲ", - "cover.filter.mode.filter_extract": "ʇɔɐɹʇxƎ ɹǝʇןıℲ", - "cover.filter.mode.filter_insert": "ʇɹǝsuI ɹǝʇןıℲ", - "cover.fluid.voiding.advanced.title": "sbuıʇʇǝS buıpıoΛ pınןℲ pǝɔuɐʌpⱯ", - "cover.fluid.voiding.title": "sbuıʇʇǝS buıpıoΛ pınןℲ", - "cover.fluid_filter.config_amount.0": "˙sǝsɐǝɹɔǝp uʍop 'ʇunoɯɐ sǝsɐǝɹɔuı dn ןǝǝɥʍ ןןoɹɔS", - "cover.fluid_filter.config_amount.1": "]ɹ§000Ɩxɐ§[ןɹʇƆ+ʇɟıɥS']ɹ§00Ɩxǝ§[ןɹʇƆ']ɹ§0Ɩx9§[ʇɟıɥS", - "cover.fluid_filter.config_amount.2": "˙sǝsɐǝɹɔǝp ʞɔıןɔ ʇɟǝן 'ʇunoɯɐ sǝsɐǝɹɔuı ʞɔıןɔ ʇɥbıᴚ", - "cover.fluid_filter.config_amount.3": "˙ǝʌןɐɥ/ǝןqnop oʇ ʇɟıɥs pןoH", - "cover.fluid_filter.config_amount.4": "ɹɐǝןɔ oʇ ʞɔıןɔ ǝןppıW", - "cover.fluid_filter.mode.filter_both": "uıɐɹᗡ & ןןıℲ ɹǝʇןıℲ", - "cover.fluid_filter.mode.filter_drain": "uıɐɹᗡ ɹǝʇןıℲ", - "cover.fluid_filter.mode.filter_fill": "ןןıℲ ɹǝʇןıℲ", - "cover.fluid_filter.title": "ɹǝʇןıℲ pınןℲ", - "cover.fluid_regulator.keep_exact": "%s :ʇɔɐxƎ dǝǝʞ", - "cover.fluid_regulator.supply_exact": "%s :ʇɔɐxƎ ʎןddnS", - "cover.fluid_regulator.title": ")%s( sbuıʇʇǝS ɹoʇɐןnbǝᴚ pınןℲ", - "cover.fluid_regulator.transfer_mode.description.0": "˙ǝןqıssod sɐ ɹǝʇןıɟ sʇı buıɥɔʇɐɯ spınןɟ ʎuɐɯ sɐ ɹǝɟsuɐɹʇ ןןıʍ ɹǝʌoɔ 'ǝpoɯ sıɥʇ uı - ɹ§ʎuⱯ ɹǝɟsuɐɹ⟘ǝ§", - "cover.fluid_regulator.transfer_mode.description.1": "˙pǝʌoɯ ǝq ʇ,uoʍ spınןɟ 'ǝzıs uoıʇɹod uɐɥʇ ssǝן sı spınןɟ ɟo ʇunoɯɐ ɟI ˙uoʇʇnq sıɥʇ ɥʇɐǝuɹǝpun ʍopuıʍ ǝɥʇ uı pǝıɟıɔǝds suoıʇɹod uı spınןɟ ʎןddns ןןıʍ ɹǝʌoɔ 'ǝpoɯ sıɥʇ uı - ɹ§ʇɔɐxƎ ʎןddnSǝ§", - "cover.fluid_regulator.transfer_mode.description.2": "˙pǝɹınbǝɹ ɟı spınןɟ ɟo ʇunoɯɐ ןɐuoıʇıppɐ buıʎןddns 'ʎɹoʇuǝʌuı uoıʇɐuıʇsǝp ǝɥʇ uı spınןɟ ɟo ʇunoɯɐ pǝıɟıɔǝds dǝǝʞ ןןıʍ ɹǝʌoɔ 'ǝpoɯ sıɥʇ uı - ɹ§ʇɔɐxƎ dǝǝʞǝ§", - "cover.fluid_regulator.transfer_mode.description.3": "˙00Ɩ ʎq ʎןdıʇןnɯ ןןıʍ ʞɔıןɔ ןɹʇɔ puɐ 0Ɩ ʎq sʇunoɯɐ ǝsɐǝɹɔǝp/ǝsɐǝɹɔuı ʎןdıʇןnɯ ןןıʍ ʞɔıןɔ ʇɟıɥs :dı⟘ㄥ§", - "cover.item.voiding.advanced.title": "sbuıʇʇǝS buıpıoΛ ɯǝʇI pǝɔuɐʌpⱯ", - "cover.item.voiding.title": "sbuıʇʇǝS buıpıoΛ ɯǝʇI", - "cover.item_filter.ignore_damage.disabled": "ǝbɐɯɐᗡ ʇɔǝdsǝᴚ", - "cover.item_filter.ignore_damage.enabled": "ǝbɐɯɐᗡ ǝɹoubI", - "cover.item_filter.ignore_nbt.disabled": "⟘ᗺN ʇɔǝdsǝᴚ", - "cover.item_filter.ignore_nbt.enabled": "⟘ᗺN ǝɹoubI", - "cover.item_filter.title": "ɹǝʇןıℲ ɯǝʇI", - "cover.item_smart_filter.filtering_mode.centrifuge": "ǝbnɟıɹʇuǝƆ", - "cover.item_smart_filter.filtering_mode.description.0": "˙buıɹǝʇןıɟ ɹoɟ ǝsn ןןıʍ ɹǝʇןıℲ ʇɹɐɯS sıɥʇ ǝuıɥɔɐW ʇɔǝןǝS", - "cover.item_smart_filter.filtering_mode.description.1": "˙ɯɹɐ ɔıʇoqoɹ ɹoɟ sɯǝʇı ɟo suoıʇɹod ʇɥbıɹ ʞɔıd ʎןןɐɔıʇɐɯoʇnɐ ןןıʍ ʇI", - "cover.item_smart_filter.filtering_mode.electrolyzer": "ɹǝzʎןoɹʇɔǝןƎ", - "cover.item_smart_filter.filtering_mode.sifter": "ɹǝʇɟıS", - "cover.item_smart_filter.title": "ɹǝʇןıℲ ɯǝʇI ʇɹɐɯS", - "cover.machine_controller.invert.disabled.0": "unɹ oʇ ןǝʌǝן ǝuoʇspǝɹ ʇǝs ǝɥʇ uɐɥʇ ɹǝʞɐǝʍ ןɐubıs ɐ ǝɹınbǝɹ ןןıʍ ɹǝʌoɔ ǝɥʇ 'ǝpoɯ sıɥʇ uı - ɹ§ןɐɯɹoNǝ§", - "cover.machine_controller.invert.enabled.0": "unɹ oʇ ןǝʌǝן ǝuoʇspǝɹ ʇǝs ǝɥʇ uɐɥʇ ɹǝbuoɹʇs ןɐubıs ɐ ǝɹınbǝɹ ןןıʍ ɹǝʌoɔ ǝɥʇ 'ǝpoɯ sıɥʇ uı - ɹ§pǝʇɹǝʌuIǝ§", - "cover.machine_controller.inverted": "pǝʇɹǝʌuI", - "cover.machine_controller.mode.cover_down": ")ɯoʇʇoᗺ( ɹǝʌoƆ ןoɹʇuoƆ", - "cover.machine_controller.mode.cover_east": ")ʇsɐƎ( ɹǝʌoƆ ןoɹʇuoƆ", - "cover.machine_controller.mode.cover_north": ")ɥʇɹoN( ɹǝʌoƆ ןoɹʇuoƆ", - "cover.machine_controller.mode.cover_south": ")ɥʇnoS( ɹǝʌoƆ ןoɹʇuoƆ", - "cover.machine_controller.mode.cover_up": ")do⟘( ɹǝʌoƆ ןoɹʇuoƆ", - "cover.machine_controller.mode.cover_west": ")ʇsǝM( ɹǝʌoƆ ןoɹʇuoƆ", - "cover.machine_controller.mode.machine": "ǝuıɥɔɐW ןoɹʇuoƆ", - "cover.machine_controller.mode.null": "buıɥʇoN ןoɹʇuoƆ", - "cover.machine_controller.normal": "ןɐɯɹoN", - "cover.machine_controller.redstone": "%d :ɥʇbuǝɹʇS ǝuoʇspǝᴚ uıW", - "cover.machine_controller.suspend_powerfail": ":buıןıɐℲ ɹǝʍoԀ ʇuǝʌǝɹԀ", - "cover.machine_controller.title": "sbuıʇʇǝS ɹǝןןoɹʇuoƆ ǝuıɥɔɐW", - "cover.pump.fluid_filter.title": "ɹǝʇןıℲ pınןℲ", - "cover.pump.mode.export": "ʇɹodxƎ :ǝpoW", - "cover.pump.mode.import": "ʇɹodɯI :ǝpoW", - "cover.pump.title": ")%s( sbuıʇʇǝS ɹǝʌoƆ dɯnԀ", - "cover.pump.transfer_rate": "%s", - "cover.robotic_arm.title": ")%s( sbuıʇʇǝS ɯɹⱯ ɔıʇoqoᴚ", - "cover.robotic_arm.transfer_mode.description.0": "˙ǝןqıssod sɐ ɹǝʇןıɟ sʇı buıɥɔʇɐɯ sɯǝʇı ʎuɐɯ sɐ ɹǝɟsuɐɹʇ ןןıʍ ɹǝʌoɔ 'ǝpoɯ sıɥʇ uı - ɹ§ʎuⱯ ɹǝɟsuɐɹ⟘ǝ§", - "cover.robotic_arm.transfer_mode.description.1": "˙pǝʌoɯ ǝq ʇ,uoʍ sɯǝʇı 'ǝzıs uoıʇɹod uɐɥʇ ssǝן sı sɯǝʇı ɟo ʇunoɯɐ ɟI ˙)ɹǝʇןıɟ bɐʇ ɹoɟ uoʇʇnq sıɥʇ ɹǝpun ǝןqɐıɹɐʌ ɹo( sʇoןs ɹǝʇןıɟ ɯǝʇı uı pǝıɟıɔǝds suoıʇɹod uı sɯǝʇı ʎןddns ןןıʍ ɹǝʌoɔ 'ǝpoɯ sıɥʇ uı - ɹ§ʇɔɐxƎ ʎןddnSǝ§", - "cover.robotic_arm.transfer_mode.description.2": "˙pǝɹınbǝɹ ɟı sɯǝʇı ɟo ʇunoɯɐ ןɐuoıʇıppɐ buıʎןddns 'ʎɹoʇuǝʌuı uoıʇɐuıʇsǝp ǝɥʇ uı sɯǝʇı ɟo ʇunoɯɐ pǝıɟıɔǝds dǝǝʞ ןןıʍ ɹǝʌoɔ 'ǝpoɯ sıɥʇ uı - ɹ§ʇɔɐxƎ dǝǝʞǝ§", - "cover.robotic_arm.transfer_mode.description.3": "˙ɹǝʇsɐɟ ʇunoɯɐ ǝbuɐɥɔ oʇ buıʞɔıןɔ ʇɟıɥs ǝsn 'ʇunoɯɐ ɯǝʇı ǝbuɐɥɔ oʇ sʇoןs ɹǝʇןıɟ uo ʞɔıןɔ ʇɥbıɹ/ʇɟǝן :dı⟘ㄥ§", - "cover.robotic_arm.transfer_mode.keep_exact": "ʇɔɐxƎ dǝǝʞ", - "cover.robotic_arm.transfer_mode.transfer_any": "ʎuⱯ ɹǝɟsuɐɹ⟘", - "cover.robotic_arm.transfer_mode.transfer_exact": "ʇɔɐxƎ ʎןddnS", - "cover.shutter.message.disabled": "ɹǝʇʇnɥs pǝuǝdO", - "cover.shutter.message.enabled": "ɹǝʇʇnɥs pǝsoןƆ", - "cover.storage.title": "ɹǝʌoƆ ǝbɐɹoʇS", - "cover.tag_filter.info.0": "suoıssǝɹdxǝ xǝןdɯoɔ sʇdǝɔɔⱯq§", - "cover.tag_filter.info.1": "ᗡNⱯ = ɹ§q & ɐ9§", - "cover.tag_filter.info.10": ")ʌן*¡ & sʇınɔɹıɔ:nǝɔʇb( | pןob/sʇsnp*9§ :ǝןdɯɐxƎq§", - "cover.tag_filter.info.11": "sǝuo ΛꞀ ʇdǝɔxǝ sʇınɔɹıɔ ןןɐ ɹo sʇsnp pןob ןןɐ sǝɥɔʇɐɯ sıɥ⟘", - "cover.tag_filter.info.2": "ᴚO = ɹ§q | ɐ9§", - "cover.tag_filter.info.3": "ᴚOX = ɹ§q ^ ɐ9§", - "cover.tag_filter.info.4": "⟘ON = ɹ§ɐ¡9§", - "cover.tag_filter.info.5": "buıdnoɹb ɹoɟ ɹ§)ɐ(9§", - "cover.tag_filter.info.6": "pɹɐɔpןıʍ ɹoɟ ɹ§*9§", - "cover.tag_filter.info.7": "pǝbbɐʇun ɹoɟ ɹ§$9§", - "cover.tag_filter.info.8": "˙,ǝdʎʇqns/bɐʇ:ǝɔɐdsǝɯɐu, ɯɹoɟ ǝɥʇ uı ǝɯoɔ sbɐ⟘q§", - "cover.tag_filter.info.9": "˙pǝpıʌoɹd ʇ,usı ǝuo ɟı pǝɯnssɐ sı ǝɔɐdsǝɯɐu ,:ǝbɹoɟ, ǝɥ⟘", - "cover.tag_filter.matches": "sǝɥɔʇɐɯ ɯǝʇI", - "cover.tag_filter.matches_not": "ɥɔʇɐɯ ʇou sǝop ɯǝʇI", - "cover.tag_filter.test_slot.info": "uoıssǝɹdxǝ ɹǝʇןıɟ ǝɥʇ sǝɥɔʇɐɯ ʇı ɟı ʇsǝʇ oʇ ɯǝʇı ɐ ʇɹǝsuI", - "cover.tag_filter.title": "ɹǝʇןıℲ bɐ⟘", - "cover.universal.manual_import_export.mode.description.0": " ˙ɹǝʇןıɟ sʇı puɐ ɹǝʌoɔ ǝɥʇ ʎq pǝıɟıɔǝds sɐ ǝʌoɯ ʎןuo ןןıʍ spınןɟ/sɯǝʇI - ɹ§pǝןqɐsıᗡǝ§", - "cover.universal.manual_import_export.mode.description.1": " ˙)ʎuɐ ɟı( sǝɥɔʇɐɯ ɹǝʇןıɟ sʇı sɐ buoן sɐ 'ǝpoɯ ɹǝʌoɔ ǝɥʇ ɟo ʎןʇuǝpuǝdǝpuı pǝʇɹǝsuı puɐ pǝʇɔɐɹʇxǝ ǝq uɐɔ spınןɟ/sɯǝʇI - ɹ§pǝɹǝʇןıℲ ʍoןןⱯǝ§", - "cover.universal.manual_import_export.mode.description.2": "ɹǝʌoɔ sıɥʇ ʎq pǝʇɔɐɹʇxǝ ɹo pǝʇɹǝsuı sɯǝʇı ǝɥʇ oʇ sǝıןddɐ ɹǝʇןıℲ ˙ǝpoɯ ɹǝʌoɔ ǝɥʇ ɟo ʎןʇuǝpuǝdǝpuı pǝʌoɯ ǝq uɐɔ spınןɟ/sɯǝʇI - ɹ§pǝɹǝʇןıɟu∩ ʍoןןⱯǝ§", - "cover.universal.manual_import_export.mode.disabled": "˙ɹǝʇןıɟ sʇı puɐ ɹǝʌoɔ ǝɥʇ ʎq pǝıɟıɔǝds sɐ ǝʌoɯ ʎןuo ןןıʍ spınןℲ / sɯǝʇIㄥ§\npǝןqɐsıᗡq§ :O/I ןɐnuɐW", - "cover.universal.manual_import_export.mode.filtered": ")ʎuɐ ɟı( sǝɥɔʇɐɯ ɹǝʇןıɟ sʇı sɐ buoן sɐ 'ǝpoɯ ɹǝʌoɔ ǝɥʇ ɟo ʎןʇuǝpuǝdǝpuı pǝʇɹǝsuı puɐ pǝʇɔɐɹʇxǝ ǝq uɐɔ spınןℲ / sɯǝʇIㄥ§\npǝɹǝʇןıℲq§ :O/I ןɐnuɐW", - "cover.universal.manual_import_export.mode.unfiltered": "˙ɟןǝsʇı ɹǝʌoɔ sıɥʇ ʎq pǝʇɔɐɹʇxǝ ɹo pǝʇɹǝsuı sı ʇɐɥʍ oʇ sǝıןddɐ ʎןuo ɹǝʇןıɟ ǝɥ⟘ ˙ǝpoɯ ɹǝʌoɔ ǝɥʇ ɟo ʎןʇuǝpuǝdǝpuı pǝʌoɯ ǝq uɐɔ spınןℲ / sɯǝʇIㄥ§\npǝɹǝʇןıɟu∩q§ :O/I ןɐnuɐW", - "cover.voiding.label.disabled": "pǝןqɐsıᗡ", - "cover.voiding.label.enabled": "pǝןqɐuƎ", - "cover.voiding.message.disabled": "pǝןqɐsıᗡ ɹǝʌoƆ buıpıoΛ", - "cover.voiding.message.enabled": "pǝןqɐuƎ ɹǝʌoƆ buıpıoΛ", - "cover.voiding.tooltip": "˙pǝpıoʌ ǝq ꞀꞀIM sɯǝʇı ɹo spınןɟ ʇɐɥʇ suɐǝɯ \"pǝןqɐuƎ\" oʇ sıɥʇ buıʇʇǝS ㄥ§¡⅁NINᴚⱯMɔ§", - "cover.voiding.voiding_mode.description.0": " ˙ɹǝʇןıɟ ǝɥʇ buıɥɔʇɐɯ buıɥʇʎuɐ pıoʌ ןןıʍ ɹ§buıɥɔʇɐW pıoΛǝ§", - "cover.voiding.voiding_mode.description.1": "˙ʇunoɯɐ pǝıɟıɔǝds ǝɥʇ oʇ dn 'ɹǝʇןıɟ ǝɥʇ buıɥɔʇɐɯ buıɥʇʎuɐ pıoʌ ןןıʍ ɹ§ʍoןɟɹǝʌO pıoΛǝ§", - "cover.voiding.voiding_mode.void_any": "buıɥɔʇɐW pıoΛ", - "cover.voiding.voiding_mode.void_overflow": "ʍoןɟɹǝʌO pıoΛ", - "curios.identifier.gtceu_magnet": "ʇǝubɐW nƎƆ⟘⅁", - "death.attack.gtceu.axe": "%s ʎq pǝddoɥɔ sɐʍ %s", - "death.attack.gtceu.butchery_knife": "%s ʎq pǝɹǝɥɔʇnq sɐʍ %s", - "death.attack.gtceu.buzzsaw": "%s ʎq pǝzznq sɐʍ %s", - "death.attack.gtceu.chainsaw_lv": "%s ʎq pǝɹɔɐssɐɯ sɐʍ %s", - "death.attack.gtceu.chemical": "ʇuǝpıɔɔɐ ןɐɔıɯǝɥɔ ɐ pɐɥ %s", - "death.attack.gtceu.crowbar": "%s oʇ ǝɟıן ɐ ɟןɐɥ ʇsoן %s", - "death.attack.gtceu.drill_ev": "%s ʎq Λ8ㄣ0ᄅ ɥʇıʍ pǝןןıɹp sɐʍ %s", - "death.attack.gtceu.drill_hv": "%s ʎq ΛᄅƖϛ ɥʇıʍ pǝןןıɹp sɐʍ %s", - "death.attack.gtceu.drill_iv": "%s ʎq Λᄅ6Ɩ8 ɥʇıʍ pǝןןıɹp sɐʍ %s", - "death.attack.gtceu.drill_lv": "%s ʎq ΛᄅƐ ɥʇıʍ pǝןןıɹp sɐʍ %s", - "death.attack.gtceu.drill_mv": "%s ʎq Λ8ᄅƖ ɥʇıʍ pǝןןıɹp sɐʍ %s", - "death.attack.gtceu.electric": "pǝʇnɔoɹʇɔǝןǝ sɐʍ %s", - "death.attack.gtceu.file": "%s ʎq ,pɐǝᗡ, ɹoɟ ᗡ pǝןıɟ uǝǝq sɐɥ %s", - "death.attack.gtceu.frost": "sɔıuǝboʎɹɔ pǝɹoןdxǝ %s", - "death.attack.gtceu.hammer": "%s ʎq pǝɥsɐnbs sɐʍ %s", - "death.attack.gtceu.heat": "ǝʌıןɐ pǝןıoq sɐʍ %s", - "death.attack.gtceu.heat.player": "%s ʎq ǝʌıןɐ pǝןıoq sɐʍ %s", - "death.attack.gtceu.hoe": "%s ʎq pǝןןıʇ pɐǝɥ ɹıǝɥʇ pɐɥ %s", - "death.attack.gtceu.knife": "%s ʎq pǝʞod ʎןʇuǝb sɐʍ %s", - "death.attack.gtceu.mallet": "%s ʎq ɥʇɐǝp oʇ pǝɹǝɯɯɐɥ sɐʍ %s", - "death.attack.gtceu.medical_condition/arsenicosis": "buıuosıod ɔıuǝsɹɐ ʇob %s", - "death.attack.gtceu.medical_condition/asbestosis": "ɐɯoıןǝɥʇosǝɯ ʇob %s", - "death.attack.gtceu.medical_condition/berylliosis": "ʎןıpǝǝɹb ooʇ ʇıq ɐ spןɐɹǝɯǝ pǝuıɯ %s", - "death.attack.gtceu.medical_condition/carbon_monoxide_poisoning": "uo ǝʌoʇs ǝɥʇ ʇɟǝן %s", - "death.attack.gtceu.medical_condition/carcinogen": "ɐıɯǝʞnǝן ʇob %s", - "death.attack.gtceu.medical_condition/chemical_burns": "ʇuǝpıɔɔɐ ןɐɔıɯǝɥɔ ɐ pɐɥ %s", - "death.attack.gtceu.medical_condition/irritant": "ɥsɐɹ pɐq ɹ§ʎꞀꞀⱯƎᴚן§u§ ɐ ʇob %s", - "death.attack.gtceu.medical_condition/methanol_poisoning": "uoıʇıqıɥoɹd ǝɥʇ buıɹnp ǝuıɥsuooɯ ʞuıɹp oʇ pǝıɹʇ %s", - "death.attack.gtceu.medical_condition/nausea": "ɐǝsnɐu oʇ pǝqɯnɔɔns %s", - "death.attack.gtceu.medical_condition/none": "¿buıɥʇou ˙˙˙ɟo pǝıp %s", - "death.attack.gtceu.medical_condition/poison": "snouosıod 'ʇɔɐɟ uı 'ǝɹɐ sןɐıɹǝʇɐɯ snouosıod ʇɐɥʇ ʇobɹoɟ %s", - "death.attack.gtceu.medical_condition/silicosis": "sısoɔıןıs sɐʍ ʇI ˙sısoןnɔɹǝqnʇ ɟo ǝıp ʇ,upıp %s", - "death.attack.gtceu.medical_condition/weak_poison": "pɐǝן ǝʇɐ %s", - "death.attack.gtceu.mining_hammer": "%s ʎq ǝɹO ɹoɟ uǝʞɐʇsıɯ sɐʍ %s", - "death.attack.gtceu.mortar": "%s ʎq ʇsnp oʇ punoɹb sɐʍ %s", - "death.attack.gtceu.pickaxe": "%s ʎq pǝuıɯ sɐʍ %s", - "death.attack.gtceu.radiation": "ʍou ʎoظ ɥʇıʍ sʍoןb %s", - "death.attack.gtceu.screwdriver": "¡ǝɯıʇ ʇsɐן ǝɥʇ ɹoɟ %s ɥʇıʍ pǝʍǝɹɔs sɐɥ %s", - "death.attack.gtceu.screwdriver_lv": "%s ʎq pǝʌoɯǝɹ sʍǝɹɔs ɹıǝɥʇ pɐɥ %s", - "death.attack.gtceu.scythe": "%s ʎq uǝʞɐʇ ןnos ɹıǝɥʇ pɐɥ %s", - "death.attack.gtceu.shovel": "%s ʎq dn bnp sɐʍ %s", - "death.attack.gtceu.spade": "%s ʎq pǝʇɐʌɐɔxǝ sɐʍ %s", - "death.attack.gtceu.turbine": "ǝuıqɹnʇ ɐ oʇuı pɐǝɥ ɹıǝɥʇ ʇnd %s", - "death.attack.gtceu.wire_cutter": "%s ɟo ǝuıɥɔɐW ʇɹoddnS ǝɟıꞀ ǝɥʇ ɹoɟ ǝןqɐɔ ǝɥʇ ʇnɔ sɐɥ %s", - "death.attack.gtceu.wrench": "¡ɥɔuǝɹM ǝɥʇ ɥʇıʍ ʞɔɐɥʍ ɐ %s ǝʌɐb %s", - "death.attack.gtceu.wrench_hv": "%s ʎq pǝuǝsooן ǝɹǝʍ sǝdıd s,%s", - "death.attack.gtceu.wrench_iv": "%s ʎq suɐןd ɹıǝɥʇ oʇuı uʍoɹɥʇ ɥɔuǝɹʍ ɐ pɐɥ %s", - "death.attack.gtceu.wrench_lv": "%s ʎq pǝuǝsooן ǝɹǝʍ sǝdıd s,%s", - "effect.gtceu.weak_poison": "uosıoԀ ʞɐǝM", - "enchantment.damage.disjunction": "uoıʇɔunظsıᗡ", - "enchantment.disjunction": "uoıʇɔunظsıᗡ", - "enchantment.gtceu.disjunction.description": "˙sqoɯ pǝʇɐןǝɹ-ɹǝpuƎ oʇ ssǝuʍoןS puɐ ssǝuʞɐǝM sǝıןddⱯ", - "enchantment.gtceu.hard_hammer.description": "˙ɹǝɯɯɐH ɥɔǝ⟘bǝɹ⅁ ɐ ɥʇıʍ pǝuıɯ ǝɹǝʍ ʎǝɥʇ ɟı sɐ sʞɔoןq sʞɐǝɹᗺ", - "enchantment.hard_hammer": "buıɹǝɯɯɐH", - "entity.gtceu.boat": "ʇɐoᗺ", - "entity.gtceu.chest_boat": "ʇɐoᗺ ʇsǝɥƆ", - "entity.gtceu.dynamite": "ǝʇıɯɐuʎᗡ", - "entity.gtceu.industrial_tnt": "⟘N⟘ ןɐıɹʇsnpuI", - "entity.gtceu.powderbarrel": "ןǝɹɹɐqɹǝpʍoԀ", - "fluid.empty": "ʎʇdɯƎ", - "fluid.gtceu.potion": "uoıʇoԀ", - "fluid.spawnlocation.name": "uoıʇɐɯɹoɟuI uıǝΛ pınןℲ", - "fluid.tile.lava": "ɐʌɐꞀ", - "fluid.tile.water": "ɹǝʇɐM", - "fluid_cell.empty": "ʎʇdɯƎ", - "gtceu.air_scrubber": "ɹǝqqnɹɔS ɹıⱯ", - "gtceu.alloy_blast_smelter": "ɹǝʇןǝɯS ʇsɐןᗺ ʎoןןⱯ", - "gtceu.alloy_smelter": "ɹǝʇןǝɯS ʎoןןⱯ", - "gtceu.arc_furnace": "ǝɔɐuɹnℲ ɔɹⱯ", - "gtceu.assembler": "ɹǝןqɯǝssⱯ", - "gtceu.assembly_line": "ǝuıꞀ ʎןqɯǝssⱯ", - "gtceu.auto_decomp.rotor": "ɹoʇoᴚ ǝuıqɹn⟘", - "gtceu.auto_decomp.tool": "ןooʇ ɔıɹʇɔǝןǝ-uoN", - "gtceu.autoclave": "ǝʌɐןɔoʇnⱯ", - "gtceu.battery_buffer.average_input": "ʇ/∩Ǝ %s :ʇnduı ǝbɐɹǝʌⱯ", - "gtceu.battery_buffer.average_output": "ʇ/∩Ǝ %s :ʇndʇno ǝbɐɹǝʌⱯ", - "gtceu.bender": "ɹǝpuǝᗺ", - "gtceu.brewery": "ʎɹǝʍǝɹᗺ", - "gtceu.bus.collapse.error": "ʇsɹıɟ ʞɔoןqıʇןnɯ oʇ pǝɥɔɐʇʇɐ ǝq ʇsnɯ snᗺ", - "gtceu.bus.collapse_false": "sɯǝʇI ǝsdɐןןoɔ ʇou ןןıʍ snᗺ", - "gtceu.bus.collapse_true": "sɯǝʇI ǝsdɐןןoɔ ןןıʍ snᗺ", - "gtceu.button.bedrock_fluids": "suıǝΛ pınןℲ ʞɔoɹpǝᗺ ʍoɥS", - "gtceu.button.hide_depleted": "suıǝΛ pǝʇǝןdǝᗡ ǝpıH", - "gtceu.button.ore_veins": "suıǝΛ ǝɹO ⟘⅁ ʍoɥS", - "gtceu.button.show_depleted": "suıǝΛ pǝʇǝןdǝᗡ ʍoɥS", - "gtceu.cable.amperage": "%dǝ§ ɹ§:ǝbɐɹǝdɯⱯ xɐWǝ§", - "gtceu.cable.loss_per_block": "ʇןoΛ-∩Ǝ ㄥ§%dɔ§ ɹ§:ǝɹǝdɯⱯ/ɹǝʇǝW/ssoꞀɔ§", - "gtceu.cable.superconductor": "ɹoʇɔnpuoɔɹǝdnSp§ %s", - "gtceu.cable.voltage": ")ɐ§%s(ɐ§ %dɐ§ ɹ§:ǝbɐʇןoΛ xɐWɐ§", - "gtceu.canner": "ɹǝuuɐƆ", - "gtceu.central_monitor.gui.create_group": "dnoɹb ǝʇɐǝɹƆ", - "gtceu.central_monitor.gui.currently_editing": "%s :buıʇıpǝ ʎןʇuǝɹɹnƆ", - "gtceu.central_monitor.gui.remove_from_group": "dnoɹb ɯoɹɟ ǝʌoɯǝᴚ", - "gtceu.central_monitor.gui.set_target": "ʇǝbɹɐʇ ʇǝS", - "gtceu.central_monitor.info_tooltip.0": "˙ʇı uı ǝןnpoɯ Ɩ ǝʌɐɥ ʎןuo ʎɐɯ dnoɹb Ɐ ˙ʇsɹıɟ sdnoɹb oʇuı ɯǝɥʇ ʇıןds oʇ ǝʌɐɥ noʎ 'sɹoʇıuoɯ ǝsn oʇ ɹǝpɹo uI", - "gtceu.central_monitor.info_tooltip.1": "˙,dnoɹb ǝʇɐǝɹƆ, ʞɔıןɔ uǝɥʇ 'buıʞɔıןɔ-ʇɟǝן ʎq ɯǝɥʇ ʇɔǝןǝS", - "gtceu.central_monitor.info_tooltip.2": "˙ǝbɐd ǝɯɐs ǝɥʇ uı ʇı ǝɹnbıɟuoɔ uɐɔ noʎ 'ǝןnpoɯ ɐ ʇɹǝsuı uɐɔ noʎ dnoɹb ǝɥʇ ɹoɟ ǝbɐd sbuıʇʇǝs ǝɥʇ uı uǝɥ⟘", - "gtceu.central_monitor.info_tooltip.3": "˙,dnoɹb ɯoɹɟ ǝʌoɯǝᴚ, ʞɔıןɔ puɐ sʇuǝuodɯoɔ s,ʇı ɟo ןןɐ ʇɔǝןǝs 'dnoɹb ɐ ǝʇǝןǝp o⟘", - "gtceu.central_monitor.info_tooltip.4": "˙ʇɔǝןǝsun oʇ uıɐbɐ ʞɔıןƆ ˙ǝɯɐu s,ʇı uo buıʞɔıןɔ ʎq dnoɹb ɐ ɟo sʇuǝuodɯoɔ ןןɐ ʇɔǝןǝs ʎןʞɔınb uɐɔ noʎ", - "gtceu.central_monitor.info_tooltip.5": "˙ʇuǝuodɯoɔ ʇǝbɹɐʇ ǝɥʇ uo ʞɔıןɔ-ʇɥbıɹ puɐ dnoɹb ʇɐɥʇ ɟo ʇuǝuodɯoɔ ʎuɐ ʇɔǝןǝs dnoɹb ɐ ɹoɟ ʇǝbɹɐʇ ɐ ʇǝs oʇ 'ʇǝbɹɐʇ ʎǝɥʇ ʞɔoןq ǝɥʇ uo buıpuǝdǝp sbuıɥʇ ʎɐןdsıp ʎɐɯ sǝןnpoɯ ǝɯoS", - "gtceu.central_monitor.info_tooltip.6": "˙ʇɐɥʇ ɹoɟ ɹǝʌoɔ ɹǝʇʇıɯsuɐɹʇ ssǝןǝɹıʍ ǝɥʇ ǝsn oʇ ǝʌɐɥ noʎ 'ʞɔoןqıʇןnɯ ǝɥʇ uı ʇou sı ʇɐɥʇ ʇǝbɹɐʇ ɐ ʇɔǝןǝs oʇ ɥsıʍ ʎɐɯ noʎ", - "gtceu.central_monitor.info_tooltip.7": "˙ʞɔoןqıʇןnɯ ǝɥʇ uı ɥɔʇɐɥ ssǝɔɔɐ ɐʇɐp ɐ oʇuı ʞɔıʇs ɐʇɐp ʇɐɥʇ ʇnd puɐ ʞɔıʇs ɐʇɐp ɐ ɥʇıʍ ʇı ʞɔıןɔ-ʇɥbıɹ 'ʞɔoןq ʇǝbɹɐʇ ǝɥʇ uo ɹǝʌoɔ ǝɥʇ ǝɔɐןԀ", - "gtceu.central_monitor.info_tooltip.8": "˙pǝɹɐǝddɐ ʇɐɥʇ pןǝıɟ ɹǝqɯnu ǝɥʇ uı ʞɔıʇs ɐʇɐp ɹnoʎ ɟo xǝpuı ʇoןs ǝɥʇ ʇǝs puɐ 'ʇǝbɹɐʇ ǝɥʇ sɐ ɥɔʇɐɥ ssǝɔɔɐ ɐʇɐp ǝɥʇ ʇɔǝןǝs uǝɥ⟘", - "gtceu.central_monitor.size": ")%d+Ɩ+%d(x)%d+Ɩ+%d( :ǝzıS", - "gtceu.centrifuge": "ǝbnɟıɹʇuǝƆ", - "gtceu.chance_logic.and": "ᗡNⱯ", - "gtceu.chance_logic.first": "⟘SᴚIℲ", - "gtceu.chance_logic.none": "ƎNON", - "gtceu.chance_logic.or": "ᴚO", - "gtceu.chance_logic.xor": "ᴚOX", - "gtceu.chat.cape": "ɹ§˙ʇı ǝsn oʇ ddɐ ןɐuıɯɹǝʇ ɹoʇɔǝןǝS ǝdɐƆ ǝɥʇ ǝǝS ¡ǝdɐɔ ʍǝu ɐ pǝʞɔoןun ʇsnظ noʎ :sʇɐɹbuoƆϛ§", - "gtceu.chemical_bath": "ɥʇɐᗺ ןɐɔıɯǝɥƆ", - "gtceu.chemical_reactor": "ɹoʇɔɐǝᴚ ןɐɔıɯǝɥƆ", - "gtceu.circuit_assembler": "ɹǝןqɯǝssⱯ ʇınɔɹıƆ", - "gtceu.coke_oven": "uǝʌO ǝʞoƆ", - "gtceu.combustion_generator": "ɹoʇɐɹǝuǝ⅁ uoıʇsnqɯoƆ", - "gtceu.compressor": "ɹossǝɹdɯoƆ", - "gtceu.computer_monitor_cover.error.bf_invalid": "%d ʇɐ ɹǝʇɔɐɹɐɥɔ pıןɐʌuI", - "gtceu.computer_monitor_cover.error.bf_invalid_num": "%d ɹǝqɯnu ןoqɯʎs buıssǝɔoɹd uǝɥʍ %d xǝpuı ʇɐ ɹǝqɯnu pıןɐʌuI", - "gtceu.computer_monitor_cover.error.exception": "%s :pǝɹɹnɔɔo uoıʇdǝɔxǝ pǝʇɔǝdxǝu∩", - "gtceu.computer_monitor_cover.error.invalid_args": "¡sʇuǝɯnbɹɐ pıןɐʌuI", - "gtceu.computer_monitor_cover.error.invalid_number": "¡,%s, ɹǝqɯnu pıןɐʌuI", - "gtceu.computer_monitor_cover.error.missing_item": "¡%d ʇoןs uı %s buıssıW", - "gtceu.computer_monitor_cover.error.no_ae": "¡ʞɹoʍʇǝu ᄅƎⱯ uɐ ǝʌɐɥ ʇou sǝop ɹǝpןoɥ ɹǝʌoƆ", - "gtceu.computer_monitor_cover.error.no_cover": "¡ɹǝʌoɔ oN", - "gtceu.computer_monitor_cover.error.no_placeholder": "¡,%s, :ɹǝpןoɥǝɔɐןd ɥɔns oN", - "gtceu.computer_monitor_cover.error.not_enough_args": "¡%d ʇob 'sbɹɐ %d ʇsɐǝן ʇɐ pǝʇɔǝdxƎ", - "gtceu.computer_monitor_cover.error.not_in_range": "%d ʇob ')ǝʌısnןɔuı( %d puɐ %d uǝǝʍʇǝq ǝq oʇ %s pǝʇɔǝdxƎ", - "gtceu.computer_monitor_cover.error.not_supported": "¡ɹǝʌoɔ/ʞɔoןq sıɥʇ ʎq pǝʇɹoddns ʇou sı ǝɹnʇɐǝɟ sıɥ⟘", - "gtceu.computer_monitor_cover.error.unclosed_bracket": "¡ʇǝʞɔɐɹq pǝsoןɔu∩", - "gtceu.computer_monitor_cover.error.unexpected_bracket": "¡ʇǝʞɔɐɹq buısoןɔ pǝʇɔǝdxǝu∩", - "gtceu.computer_monitor_cover.error.wrong_number_of_args": "¡%d ʇob 'sbɹɐ %d pǝʇɔǝdxƎ", - "gtceu.cover.activity_detector.message_activity_inverted": "snʇɐʇS ʎʇıʌıʇɔⱯ pǝʇɹǝʌuI buıɹoʇıuoW", - "gtceu.cover.activity_detector.message_activity_normal": "snʇɐʇS ʎʇıʌıʇɔⱯ ןɐɯɹoN buıɹoʇıuoW", - "gtceu.cover.activity_detector_advanced.message_activity_inverted": "snʇɐʇS ssǝɹboɹԀ pǝʇɹǝʌuI buıɹoʇıuoW", - "gtceu.cover.activity_detector_advanced.message_activity_normal": "snʇɐʇS ssǝɹboɹԀ ןɐɯɹoN buıɹoʇıuoW", - "gtceu.cover.energy_detector.message_electricity_storage_inverted": "ǝbɐɹoʇS ʎʇıɔıɹʇɔǝןƎ pǝʇɹǝʌuI buıɹoʇıuoW", - "gtceu.cover.energy_detector.message_electricity_storage_normal": "ǝbɐɹoʇS ʎʇıɔıɹʇɔǝןƎ ןɐɯɹoN buıɹoʇıuoW", - "gtceu.cover.fluid_detector.message_fluid_storage_inverted": "ǝbɐɹoʇS pınןℲ pǝʇɹǝʌuI buıɹoʇıuoW", - "gtceu.cover.fluid_detector.message_fluid_storage_normal": "ǝbɐɹoʇS pınןℲ ןɐɯɹoN buıɹoʇıuoW", - "gtceu.cover.item_detector.message_item_storage_inverted": "ǝbɐɹoʇS ɯǝʇI pǝʇɹǝʌuI buıɹoʇıuoW", - "gtceu.cover.item_detector.message_item_storage_normal": "ǝbɐɹoʇS ɯǝʇI ןɐɯɹoN buıɹoʇıuoW", - "gtceu.cracker": "ɹǝʞɔɐɹƆ", - "gtceu.creative.activity.off": "ǝʌıʇɔɐ ʇoN", - "gtceu.creative.activity.on": "ǝʌıʇɔⱯ", - "gtceu.creative.chest.ipc": "ǝןɔʎƆ ɹǝd sɯǝʇI", - "gtceu.creative.chest.item": "ɯǝʇI", - "gtceu.creative.chest.tpc": "ǝןɔʎƆ ɹǝd sʞɔı⟘", - "gtceu.creative.computation.average": "ʇ∩MƆ pǝʇsǝnbǝᴚ ǝbɐɹǝʌⱯ", - "gtceu.creative.energy.amperage": "ǝbɐɹǝdɯⱯ", - "gtceu.creative.energy.sink": "ʞuıS", - "gtceu.creative.energy.source": "ǝɔɹnoS", - "gtceu.creative.energy.voltage": "ǝbɐʇןoΛ", - "gtceu.creative.tank.fluid": "pınןℲ", - "gtceu.creative.tank.mbpc": "ǝןɔʎƆ ɹǝd ᗺɯ", - "gtceu.creative.tank.tpc": "ǝןɔʎƆ ɹǝd sʞɔı⟘", - "gtceu.creative_tooltip.1": "pǝǝu ʇsnظ noʎㄥ§", - "gtceu.creative_tooltip.2": "ǝpoW ǝʌıʇɐǝɹƆ ", - "gtceu.creative_tooltip.3": "sıɥʇ ǝsn oʇ ㄥ§", - "gtceu.cutter": "ɹǝʇʇnƆ", - "gtceu.debug.f3_h.enabled": "ǝɹoɯ ǝǝs oʇ ǝןıɟ bıɟuoɔ ɥɔǝ⟘bǝɹ⅁ ǝɥʇ uı uoıʇdo bıɟuoɔ bnqǝp:ɔsıɯ ǝɥʇ ǝןqɐuǝ :sɹǝdoןǝʌǝᗡ ɹoℲ ¡oɟuı bnqǝp ǝɥʇ pǝıɟıpoɯ sɐɥ ɥɔǝ⟘bǝɹ⅁", - "gtceu.debug.resource_rebuild.done": "%s uı ǝuop pןınqǝɹ ǝɔɹnosǝɹ ǝןpɐɹ⅁", - "gtceu.debug.resource_rebuild.start": ")sǝɔɹnosǝᴚssǝɔoɹd: ʍǝןpɐɹb/˙( pןınqǝɹ ǝɔɹnosǝɹ ǝןpɐɹb buıʞoʌuI", - "gtceu.direction.tooltip.back": "ʞɔɐᗺ", - "gtceu.direction.tooltip.down": "uʍoᗡ", - "gtceu.direction.tooltip.front": "ʇuoɹℲ", - "gtceu.direction.tooltip.left": "ʇɟǝꞀ", - "gtceu.direction.tooltip.right": "ʇɥbıᴚ", - "gtceu.direction.tooltip.up": "d∩", - "gtceu.display_source.computer_monitor_cover": "ɹǝʌoƆ ɹoʇıuoW ɹǝʇndɯoƆ", - "gtceu.display_target.computer_monitor_cover": "ɹǝʌoƆ ɹoʇıuoW ɹǝʇndɯoƆ", - "gtceu.distillation_tower": "ɹǝʍo⟘ uoıʇɐןןıʇsıᗡ", - "gtceu.distillery": "ʎɹǝןןıʇsıᗡ", - "gtceu.duct_pipe.transfer_rate": "%s :ǝʇɐɹ ɹǝɟsuɐɹʇ ɹıⱯq§", - "gtceu.dummy": "ʎɯɯnᗡ", - "gtceu.electric_blast_furnace": "ǝɔɐuɹnℲ ʇsɐןᗺ ɔıɹʇɔǝןƎ", - "gtceu.electric_furnace": "ǝɔɐuɹnℲ ɔıɹʇɔǝןƎ", - "gtceu.electrolyzer": "ɹǝzʎןoɹʇɔǝןƎ", - "gtceu.electromagnetic_separator": "ɹoʇɐɹɐdǝS ɔıʇǝubɐɯoɹʇɔǝןƎ", - "gtceu.ender_item_link_cover.title": "ʞuıꞀ ɯǝʇI ɹǝpuƎ", - "gtceu.ender_item_link_cover.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ㄥ§uoıʇɔǝuuoƆ ɟ§ɹǝpuƎp§ ssǝןǝɹıMɟ§ ɐ ɥʇıʍ ㄥ§sɯǝʇIɟ§ sʇɹodsuɐɹ⟘ㄥ§", - "gtceu.ender_redstone_link_cover.label": "%d :ɹǝʍod ǝuoʇspǝᴚ", - "gtceu.ender_redstone_link_cover.title": "ʞuıꞀ ǝuoʇspǝᴚ ɹǝpuƎ", - "gtceu.ender_redstone_link_cover.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ㄥ§uoıʇɔǝuuoƆ ɟ§ɹǝpuƎp§ ssǝןǝɹıMɟ§ ɐ ɥʇıʍ ㄥ§sןɐubıs ǝuoʇspǝᴚɟ§ sʇıɯsuɐɹ⟘ㄥ§", - "gtceu.extractor": "ɹoʇɔɐɹʇxƎ", - "gtceu.extruder": "ɹǝpnɹʇxƎ", - "gtceu.fermenter": "ɹǝʇuǝɯɹǝℲ", - "gtceu.fluid.amount": "ᗺɯ %d/%d :ʇunoɯⱯ6§", - "gtceu.fluid.click_combined": "˙)ʞɔɐʇs ןןnɟ ɐ ɹoɟ ʞɔıןɔ-ʇɟıɥS( ʞuɐʇ ǝɥʇㄥ§ ןןıɟq§ ɹoㄥ§ ʎʇdɯǝɔ§ oʇ ɹǝuıɐʇuoƆ pınןℲ ɐ ɥʇıʍ ʞɔıןƆㄥ§", - "gtceu.fluid.click_to_empty": "˙)ʞɔɐʇs ןןnɟ ɐ ɹoɟ ʞɔıןɔ-ʇɟıɥS( ʞuɐʇ ǝɥʇㄥ§ ʎʇdɯǝɔ§ oʇ ɹǝuıɐʇuoƆ pınןℲ ɐ ɥʇıʍ ʞɔıןƆㄥ§", - "gtceu.fluid.click_to_fill": "˙)ʞɔɐʇs ןןnɟ ɐ ɹoɟ ʞɔıןɔ-ʇɟıɥS( ʞuɐʇ ǝɥʇㄥ§ ןןıɟq§ oʇ ɹǝuıɐʇuoƆ pınןℲ ɐ ɥʇıʍ ʞɔıןƆㄥ§", - "gtceu.fluid.empty": "ʎʇdɯƎ", - "gtceu.fluid.gas_generic": "sɐ⅁ %s", - "gtceu.fluid.gas_vapor": "ɹodɐΛ %s", - "gtceu.fluid.generic": "%s", - "gtceu.fluid.liquid_generic": "%s pınbıꞀ", - "gtceu.fluid.molten": "%s uǝʇןoW", - "gtceu.fluid.plasma": "ɐɯsɐןԀ %s", - "gtceu.fluid.state_gas": "snoǝsɐ⅁ :ǝʇɐʇSɐ§", - "gtceu.fluid.state_liquid": "pınbıꞀ :ǝʇɐʇSɐ§", - "gtceu.fluid.state_plasma": "ɐɯsɐןԀ :ǝʇɐʇSɐ§", - "gtceu.fluid.temperature": "%s :ǝɹnʇɐɹǝdɯǝ⟘ɔ§", - "gtceu.fluid.temperature.cryogenic": "¡ǝɹɐɔ ɥʇıʍ ǝןpuɐH ¡ɔıuǝboʎɹƆq§", - "gtceu.fluid.type_acid.tooltip": "¡ǝɹɐɔ ɥʇıʍ ǝןpuɐH ¡ɔıpıɔⱯ9§", - "gtceu.fluid_heater": "ɹǝʇɐǝH pınןℲ", - "gtceu.fluid_pipe.acid_proof": "spıɔⱯ ǝןpuɐɥ uɐƆ9§", - "gtceu.fluid_pipe.capacity": "ᗺɯ %dɟ§ :ʎʇıɔɐdɐƆ6§", - "gtceu.fluid_pipe.channels": "%dɟ§ :sןǝuuɐɥƆǝ§", - "gtceu.fluid_pipe.cryo_proof": "sɔıuǝboʎɹƆ ǝןpuɐɥ uɐƆ9§", - "gtceu.fluid_pipe.gas_proof": "sǝsɐ⅁ ǝןpuɐɥ uɐƆ9§", - "gtceu.fluid_pipe.max_temperature": "%sɟ§ :ʇıɯıꞀ ǝɹnʇɐɹǝdɯǝ⟘ɔ§", - "gtceu.fluid_pipe.not_gas_proof": "¡ʞɐǝן ʎɐɯ sǝsɐ⅁ㄣ§", - "gtceu.fluid_pipe.plasma_proof": "sɐɯsɐןԀ ןןɐ ǝןpuɐɥ uɐƆ9§", - "gtceu.fluid_solidifier": "ɹǝıɟıpıןoS pınןℲ", - "gtceu.forge_hammer": "ɹǝɯɯɐH ǝbɹoℲ", - "gtceu.forming_press": "ssǝɹԀ buıɯɹoℲ", - "gtceu.forming_press.naming.named": "ɯǝʇI pǝɯɐNo§", - "gtceu.forming_press.naming.press": "ssǝɹԀ pǝɯɐNo§", - "gtceu.forming_press.naming.to_name": "ǝɯɐN oʇ ɯǝʇIo§", - "gtceu.fusion_reactor": "ɹoʇɔɐǝᴚ uoısnℲ", - "gtceu.gas_collector": "ɹoʇɔǝןןoƆ sɐ⅁", - "gtceu.gas_turbine": "ǝuıqɹn⟘ sɐ⅁", - "gtceu.gui.adv_stocking_config.min_fluid_count": "buıןןnԀ pǝʇɐɯoʇnⱯ ɹoɟ ǝzıS ʞɔɐʇS pınןℲ ɯnɯıuıW", - "gtceu.gui.adv_stocking_config.min_item_count": "buıןןnԀ pǝʇɐɯoʇnⱯ ɹoɟ ǝzıS ʞɔɐʇS ɯǝʇI ɯnɯıuıW", - "gtceu.gui.adv_stocking_config.ticks_per_cycle": "sǝʇɐpdn ʇsıן ɯǝʇı uǝǝʍʇǝq ʎɐןǝᗡ", - "gtceu.gui.adv_stocking_config.title": "buıʞɔoʇS ɔıʇɐɯoʇnⱯ ǝɹnbıɟuoƆ", - "gtceu.gui.all_voiding": "ןןⱯɔ§ buıpıoΛㄥ§", - "gtceu.gui.auto_output.name": "oʇnɐ", - "gtceu.gui.central_monitor.group": "%s :dnoɹ⅁", - "gtceu.gui.central_monitor.group_default_name": "%d# dnoɹ⅁", - "gtceu.gui.central_monitor.none": "ǝuou", - "gtceu.gui.central_monitor.text_scale": "ǝןɐɔs ʇxǝ⟘", - "gtceu.gui.charger_slot.tooltip.0": "ɹ§ʇoןS ɹǝbɹɐɥƆɟ§", - "gtceu.gui.charger_slot.tooltip.1": "ɹ§sǝıɹǝʇʇɐq %s ɯoɹɟ ɹǝʍod sʍɐɹᗡㄥ§", - "gtceu.gui.charger_slot.tooltip.2": "sǝıɹǝʇʇɐq puɐ sןooʇ %s sǝbɹɐɥƆㄥ§", - "gtceu.gui.chunkmode.disabled.0": "˙ǝןqɐuƎ oʇ ʞɔıןƆ :pǝןqɐsıᗡ ǝpoW ʞunɥƆ", - "gtceu.gui.chunkmode.disabled.1": "˙ǝuıɥɔɐɯ ǝןpı uɐ sǝɹınbǝɹ buıɥɔʇıʍSㄥ§", - "gtceu.gui.chunkmode.enabled.0": "˙ǝןqɐsıᗡ oʇ ʞɔıןƆ :pǝןqɐuƎ ǝpoW ʞunɥƆ", - "gtceu.gui.chunkmode.enabled.1": "˙ǝuıɥɔɐɯ ǝןpı uɐ sǝɹınbǝɹ buıɥɔʇıʍSㄥ§", - "gtceu.gui.circuit.title": "sbuıʇʇǝS ʇınɔɹıƆ", - "gtceu.gui.computer_monitor_cover.edit_blank_placeholders": "sɹǝpןoɥǝɔɐןd ʞuɐןq ʇıpƎ", - "gtceu.gui.computer_monitor_cover.edit_displayed_text": "ʇxǝʇ pǝʎɐןdsıp ʇıpƎ", - "gtceu.gui.computer_monitor_cover.main_textbox_tooltip.0": "˙ǝɹǝɥ %d ǝuıן uo ʎɐןdsıp oʇ buıɹʇs ʇnduI", - "gtceu.gui.computer_monitor_cover.main_textbox_tooltip.1": ",∩Ǝ }ʎʇıɔɐdɐƆʎbɹǝuǝ{/}ʎbɹǝuǝ{ :ʎbɹǝuƎ, :ǝןdɯɐxǝ ɹoɟ 'sɹǝpןoɥǝɔɐןd ǝʌɐɥ uɐɔ ʇI", - "gtceu.gui.computer_monitor_cover.main_textbox_tooltip.2": "˙sɹǝpןoɥǝɔɐןd ɹǝɥʇo ǝpısuı ǝq osןɐ uɐɔ sɹǝpןoɥǝɔɐןԀ", - "gtceu.gui.computer_monitor_cover.placeholder_reference.0": ":sɹǝpןoɥǝɔɐןd ןןⱯ", - "gtceu.gui.computer_monitor_cover.placeholder_reference.1": ")oɟuı ǝɹoɯ ɹoɟ ɹǝʌoɥ(", - "gtceu.gui.computer_monitor_cover.second_page_textbox_tooltip.0": "˙ǝɹǝɥ ,}{, %s ɟo ǝɔɐןd uı pǝsn ǝq oʇ ɹǝpןoɥǝɔɐןd ʇnduI", - "gtceu.gui.computer_monitor_cover.second_page_textbox_tooltip.1": "˙sǝxoq ʇxǝʇ ǝsǝɥʇ uı ,ʎʇıɔɐdɐƆʎbɹǝuǝ, puɐ ,ʎbɹǝuǝ, puɐ ,∩Ǝ }{/}{ :ʎbɹǝuƎ, buıɹʇs ɐ ǝʌɐɥ uɐɔ noʎ 'ǝןdɯɐxǝ ɹoℲ", - "gtceu.gui.computer_monitor_cover.slot_tooltip.0": "ǝɔuǝɹǝɟǝɹ uɐɔ sɹǝpןoɥǝɔɐןd ǝɯos ʇɐɥʇ sɯǝʇı ɹoɟ ʇoןs Ɐ", - "gtceu.gui.computer_monitor_cover.slot_tooltip.1": "%d :ɹǝqɯnu ʇoןS", - "gtceu.gui.computer_monitor_cover.update_interval": ")sʞɔıʇ uı( ןɐʌɹǝʇuı ǝʇɐpd∩", - "gtceu.gui.config_slot": "ɹ§ʇoןS bıɟuoƆɟ§", - "gtceu.gui.config_slot.auto_pull_managed": "ןןnԀ-oʇnⱯ ʎq pǝbɐuɐW ㄥ§:pǝןqɐsıᗡㄣ§", - "gtceu.gui.config_slot.remove": "ɹ§˙ʇoןs bıɟuoɔ ㄥ§ɹɐǝןɔㄣ§ oʇ ʞɔıןɔ ʇɥbıᴚㄥ§", - "gtceu.gui.config_slot.scroll": "ɹ§˙ʇunoɯɐ bıɟuoɔ ㄥ§ǝbuɐɥɔɐ§ oʇ ןǝǝɥʍ ןןoɹɔSㄥ§", - "gtceu.gui.config_slot.set": "ɹ§˙ʇoןs bıɟuoɔ ㄥ§ʇɔǝןǝs/ʇǝsq§ oʇ ʞɔıןƆㄥ§", - "gtceu.gui.config_slot.set_only": "ɹ§˙ʇoןs bıɟuoɔ ㄥ§ʇǝsq§ oʇ ʞɔıןƆㄥ§", - "gtceu.gui.configurator_slot.tooltip.0": "ɹ§ʇoןS ɹoʇɐɹnbıɟuoƆɟ§", - "gtceu.gui.configurator_slot.tooltip.1": "oʇ ʇoןs sıɥʇ uı ㄥ§ʇınɔɹıƆ pǝɯɯɐɹboɹԀ9§ ɐ ǝɔɐןԀㄥ§", - "gtceu.gui.configurator_slot.tooltip.2": "˙ǝnןɐʌ pǝɹnbıɟuoɔ sʇı ǝbuɐɥɔㄥ§", - "gtceu.gui.configurator_slot.tooltip.3": "˙ϛ9§ ʎq ǝbuɐɥɔ oʇ suoʇʇnq buıʞɔıןɔ uǝɥʍ ㄥ§ʇɟıɥS9§ pןoHㄥ§", - "gtceu.gui.configurator_slot.tooltip.4": "ɹ§˙sʇnduı ǝdıɔǝɹ ɹoɟ pıןɐʌ osןɐ sı ʇoןs sıɥʇ uı ʇınɔɹıƆ pǝɯɯɐɹboɹԀ Ɐɐ§", - "gtceu.gui.content.chance_base": "%s%% :ǝɔuɐɥƆ ǝsɐᗺ", - "gtceu.gui.content.chance_base_logic": ")%s( %s%% :ǝɔuɐɥƆ ǝsɐᗺ", - "gtceu.gui.content.chance_boosted": "%s%% :ɹǝı⟘ ʇɐ ǝɔuɐɥƆ", - "gtceu.gui.content.chance_boosted_logic": ")%s( %s%% :ɹǝı⟘ ʇɐ ǝɔuɐɥƆ", - "gtceu.gui.content.chance_nc": "ɹ§pǝɯnsuoƆ ʇoNɔ§", - "gtceu.gui.content.chance_nc_short": "ɹ§ƆNɔ§", - "gtceu.gui.content.chance_no_boost": "%s%% :ǝɔuɐɥƆ", - "gtceu.gui.content.chance_no_boost_logic": ")%s( %s%% :ǝɔuɐɥƆ", - "gtceu.gui.content.chance_tier_boost_minus": "ɹǝıʇ/%s%%- :ǝɔuɐɥƆ snuoᗺ", - "gtceu.gui.content.chance_tier_boost_plus": "ɹǝıʇ/%s%%+ :ǝɔuɐɥƆ snuoᗺ", - "gtceu.gui.content.count_range": "x%s-%s", - "gtceu.gui.content.fluid_range": "ᗺɯ%s-%s", - "gtceu.gui.content.per_tick": "ɹ§ʞɔı⟘ ɹǝԀ pǝɔnpoɹԀ/pǝɯnsuoƆɐ§", - "gtceu.gui.content.range": "%s-%s", - "gtceu.gui.content.times_item": "%s x", - "gtceu.gui.content.tips.per_second_short": "ɹ§puoɔǝs/ɐ§", - "gtceu.gui.content.tips.per_tick_short": "ɹ§ʞɔıʇ/ɐ§", - "gtceu.gui.content.units.per_second": "s/", - "gtceu.gui.content.units.per_tick": "ʇ/", - "gtceu.gui.cover_setting.title": "sbuıʇʇǝS ɹǝʌoƆ", - "gtceu.gui.directional_setting.tab_tooltip": "buıʇʇǝS ןɐuoıʇɔǝɹıᗡ ǝbuɐɥƆ", - "gtceu.gui.directional_setting.title": "buıʇʇǝS ןɐuoıʇɔǝɹıᗡ", - "gtceu.gui.editor.group.recipe_type": "dɐɔ", - "gtceu.gui.editor.tips.citation": "suoıʇɐʇıɔ ɟo ɹǝqɯnN", - "gtceu.gui.fisher_mode.tooltip.0": "sɯǝʇı ʞunظ ǝןbbo⟘", - "gtceu.gui.fisher_mode.tooltip.1": "uoıʇɐɹǝdo ɹǝd buıɹʇs ᄅ sʇsoɔ ɟɟO", - "gtceu.gui.fluid_amount": ":ʇunoɯⱯ pınןℲ", - "gtceu.gui.fluid_auto_input.tooltip.disabled": "pǝןqɐsıᗡ ʇnduI-oʇnⱯ pınןℲ", - "gtceu.gui.fluid_auto_input.tooltip.enabled": "pǝןqɐuƎ ʇnduI-oʇnⱯ pınןℲ", - "gtceu.gui.fluid_auto_output.allow_input.disabled": "ǝpıs ʇndʇno ǝɥʇ ɯoɹɟ ʇnduı spınןɟ ǝןqɐsıp", - "gtceu.gui.fluid_auto_output.allow_input.enabled": "ǝpıs ʇndʇno ǝɥʇ ɯoɹɟ ʇnduı spınןɟ ʍoןןɐ", - "gtceu.gui.fluid_auto_output.disabled": "pǝןqɐsıᗡɔ§ :ʇndʇnO oʇnⱯ pınןℲ", - "gtceu.gui.fluid_auto_output.enabled": "pǝןqɐuƎɐ§ :ʇndʇnO oʇnⱯ pınןℲ", - "gtceu.gui.fluid_auto_output.other_direction.0": "uoıʇɔǝɹıᗡ ɹǝɥʇO9§ :ʇndʇnO oʇnⱯ pınןℲ", - "gtceu.gui.fluid_auto_output.other_direction.1": "˙uoıʇɔǝɹıp ɹǝɥʇouɐ oʇ ʇǝs sı ʇndʇno pınןɟ s,ǝuıɥɔɐɯ ǝɥ⟘ㄥ§", - "gtceu.gui.fluid_auto_output.other_direction.2": "˙ǝpıs pǝʇɔǝןǝs ʎןʇuǝɹɹnɔ ǝɥʇ oʇ ʇndʇno ǝɥʇ ǝʌoɯ oʇ ʞɔıןƆㄥ§", - "gtceu.gui.fluid_auto_output.tooltip.disabled": "pǝןqɐsıᗡ ʇndʇnO-oʇnⱯ pınןℲ", - "gtceu.gui.fluid_auto_output.tooltip.enabled": "pǝןqɐuƎ ʇndʇnO-oʇnⱯ pınןℲ", - "gtceu.gui.fluid_auto_output.unselected.0": "ʇndʇnO oʇnⱯ pınןℲ", - "gtceu.gui.fluid_auto_output.unselected.1": "˙ʇndʇno sʇı ǝɹnbıɟuoɔ oʇ ǝuıɥɔɐɯ ǝɥʇ ɟo ǝpıs ɐ ʇɔǝןǝSㄥ§", - "gtceu.gui.fluid_lock.tooltip.disabled": "pǝןqɐsıᗡ buıʞɔoꞀ pınןℲ", - "gtceu.gui.fluid_lock.tooltip.enabled": "pǝןqɐuƎ buıʞɔoꞀ pınןℲ", - "gtceu.gui.fluid_voiding": "spınןℲ6§ buıpıoΛㄥ§", - "gtceu.gui.fluid_voiding_partial.tooltip.disabled": "pǝןqɐsıᗡ buıpıoΛ pınןℲ", - "gtceu.gui.fluid_voiding_partial.tooltip.enabled": "pǝןqɐuƎ buıpıoΛ pınןℲ", - "gtceu.gui.fuel_amount": ":ʇunoɯⱯ ןǝnℲ", - "gtceu.gui.item_auto_input.tooltip.disabled": "pǝןqɐsıᗡ ʇnduI-oʇnⱯ ɯǝʇI", - "gtceu.gui.item_auto_input.tooltip.enabled": "pǝןqɐuƎ ʇnduI-oʇnⱯ ɯǝʇI", - "gtceu.gui.item_auto_output.allow_input.disabled": "ǝpıs ʇndʇno ǝɥʇ ɯoɹɟ ʇnduı sɯǝʇı ǝןqɐsıp", - "gtceu.gui.item_auto_output.allow_input.enabled": "ǝpıs ʇndʇno ǝɥʇ ɯoɹɟ ʇnduı sɯǝʇı ʍoןןɐ", - "gtceu.gui.item_auto_output.disabled": "pǝןqɐsıᗡɔ§ :ʇndʇnO oʇnⱯ ɯǝʇI", - "gtceu.gui.item_auto_output.enabled": "pǝןqɐuƎɐ§ :ʇndʇnO oʇnⱯ ɯǝʇI", - "gtceu.gui.item_auto_output.other_direction.0": "uoıʇɔǝɹıᗡ ɹǝɥʇO9§ :ʇndʇnO oʇnⱯ ɯǝʇI", - "gtceu.gui.item_auto_output.other_direction.1": "˙uoıʇɔǝɹıp ɹǝɥʇouɐ oʇ ʇǝs sı ʇndʇno ɯǝʇı s,ǝuıɥɔɐɯ ǝɥ⟘ㄥ§", - "gtceu.gui.item_auto_output.other_direction.2": "˙ǝpıs pǝʇɔǝןǝs ʎןʇuǝɹɹnɔ ǝɥʇ oʇ ʇndʇno ǝɥʇ ǝʌoɯ oʇ ʞɔıןƆㄥ§", - "gtceu.gui.item_auto_output.tooltip.disabled": "pǝןqɐsıᗡ ʇndʇnO-oʇnⱯ ɯǝʇI", - "gtceu.gui.item_auto_output.tooltip.enabled": "pǝןqɐuƎ ʇndʇnO-oʇnⱯ ɯǝʇI", - "gtceu.gui.item_auto_output.unselected.0": "ʇndʇnO oʇnⱯ ɯǝʇI", - "gtceu.gui.item_auto_output.unselected.1": "˙ʇndʇno sʇı ǝɹnbıɟuoɔ oʇ ǝuıɥɔɐɯ ǝɥʇ ɟo ǝpıs ɐ ʇɔǝןǝSㄥ§", - "gtceu.gui.item_lock.tooltip.disabled": "pǝןqɐsıᗡ buıʞɔoꞀ ɯǝʇI", - "gtceu.gui.item_lock.tooltip.enabled": "pǝןqɐuƎ buıʞɔoꞀ ɯǝʇI", - "gtceu.gui.item_voiding": "sɯǝʇI9§ buıpıoΛㄥ§", - "gtceu.gui.item_voiding_partial.tooltip.disabled": "pǝןqɐsıᗡ buıpıoΛ ɯǝʇI", - "gtceu.gui.item_voiding_partial.tooltip.enabled": "pǝןqɐuƎ buıpıoΛ ɯǝʇI", - "gtceu.gui.machinemode": "%s :ǝpoW ǝuıɥɔɐW ǝʌıʇɔⱯ", - "gtceu.gui.machinemode.tab_tooltip": "ǝpoW ǝuıɥɔɐW ǝʌıʇɔɐ ǝbuɐɥƆ", - "gtceu.gui.machinemode.title": "ǝpoW ǝuıɥɔɐW ǝʌıʇɔⱯ", - "gtceu.gui.me_bus.auto_pull_button": "ƎW ɯoɹɟ buıןןnd ɯǝʇı ɔıʇɐɯoʇnɐ ǝןbboʇ oʇ ʞɔıןƆ", - "gtceu.gui.me_network.offline": "ɹ§ǝuıןɟɟOㄣ§ :snʇɐʇS ʞɹoʍʇǝN", - "gtceu.gui.me_network.online": "ɹ§ǝuıןuOᄅ§ :snʇɐʇS ʞɹoʍʇǝN", - "gtceu.gui.multiblock.voiding_mode": ":ǝpoW buıpıoΛ", - "gtceu.gui.no_voiding": "buıɥʇoN buıpıoΛㄥ§", - "gtceu.gui.output_setting.title": "sbuıʇʇǝS ʇndʇnO", - "gtceu.gui.output_setting.tooltips.0": "ʇndʇno oʇnɐ ɯǝʇı ǝɥʇ ǝunʇ oʇ ʞɔıןɔ-ʇɟǝן", - "gtceu.gui.output_setting.tooltips.1": "˙ʇndʇno oʇnɐ pınןɟ ǝɥʇ ǝunʇ oʇ ʞɔıןɔ-ʇɥbıɹ", - "gtceu.gui.overclock.description.0": "uoʇʇnᗺ ʞɔoןɔɹǝʌO", - "gtceu.gui.overclock.description.1": "ɹǝıʇ ʇǝs ǝɥʇ oʇ dn ʞɔoןɔɹǝʌo uɐɔ sǝdıɔǝᴚㄥ§", - "gtceu.gui.overclock.disabled.0": "˙pǝןqɐsıᗡ buıʞɔoןɔɹǝʌO", - "gtceu.gui.overclock.disabled.1": "ǝןqɐuƎ oʇ ʞɔıןƆ", - "gtceu.gui.overclock.enabled.0": "˙pǝןqɐuƎ buıʞɔoןɔɹǝʌO", - "gtceu.gui.overclock.enabled.1": "ǝןqɐsıᗡ oʇ ʞɔıןƆ", - "gtceu.gui.overclock.off": "X", - "gtceu.gui.overclock.range": "]%s '%s[ sɹǝı⟘ ǝןqɐןıɐʌⱯ", - "gtceu.gui.overclock.title": "ɹǝı⟘ ʞɔoןɔɹǝʌO", - "gtceu.gui.silktouch.disabled.0": "˙ǝןqɐuƎ oʇ ʞɔıןƆ :pǝןqɐsıᗡ ɥɔno⟘ ʞןıS", - "gtceu.gui.silktouch.disabled.1": "˙ǝuıɥɔɐɯ ǝןpı uɐ sǝɹınbǝɹ buıɥɔʇıʍSㄥ§", - "gtceu.gui.silktouch.enabled.0": "˙ǝןqɐsıᗡ oʇ ʞɔıןƆ :pǝןqɐuƎ ɥɔno⟘ ʞןıS", - "gtceu.gui.silktouch.enabled.1": "˙ǝuıɥɔɐɯ ǝןpı uɐ sǝɹınbǝɹ buıɥɔʇıʍSㄥ§", - "gtceu.gui.sort": "ʇɹoS", - "gtceu.gui.title.adv_stocking_config.min_fluid_count": "ʇunoƆ pınןℲ ˙uıW", - "gtceu.gui.title.adv_stocking_config.min_item_count": "ʇunoƆ ɯǝʇI ˙uıW", - "gtceu.gui.title.adv_stocking_config.ticks_per_cycle": "ǝןɔʎƆ ɹǝԀ sʞɔı⟘", - "gtceu.gui.title_bar.back": "ʞɔɐᗺ", - "gtceu.gui.title_bar.page_switcher": "sǝbɐԀ", - "gtceu.gui.toggle_view.disabled": ")spınןℲ( ʍǝıΛ ǝןbbo⟘", - "gtceu.gui.toggle_view.enabled": ")sɯǝʇI( ʍǝıΛ ǝןbbo⟘", - "gtceu.gui.waiting_list": ":ǝnǝnὉ buıpuǝS", - "gtceu.implosion_compressor": "ɹossǝɹdɯoƆ uoısoןdɯI", - "gtceu.io.both": "ɥʇoᗺ", - "gtceu.io.export": "ʇɹodxƎ", - "gtceu.io.import": "ʇɹodɯI", - "gtceu.io.none": "ǝuoN", - "gtceu.item_filter.empty_item": ")ɯǝʇI oN( ʎʇdɯƎ", - "gtceu.item_filter.footer": "ǝpıɹɹǝʌo oʇ ɯǝʇı ɥʇıʍ ʞɔıןƆǝ§", - "gtceu.item_list.item_stored": "%d :pǝɹoʇSㄥ§", - "gtceu.item_pipe.priority": "%dɟ§ :ʎʇıɹoıɹԀ6§", - "gtceu.jade.amperage_use": "Ɐ %s", - "gtceu.jade.at": " @ ", - "gtceu.jade.changes_eu_sec": "s/∩Ǝ %s", - "gtceu.jade.cleaned_this_second": "s/%s :pɹɐzɐɥ pǝuɐǝןƆ", - "gtceu.jade.days": "sʎɐp %s", - "gtceu.jade.energy_stored": "∩Ǝ %d / %d", - "gtceu.jade.fluid_use": "ʇ/ᗺɯ %s", - "gtceu.jade.hours": "sɹnoɥ %s", - "gtceu.jade.minutes": "sǝʇnuıɯ %s", - "gtceu.jade.progress_computation": "∩MƆ %s / %s", - "gtceu.jade.progress_sec": "s %s / %s", - "gtceu.jade.progress_tick": "ʇ %s / %s", - "gtceu.jade.remaining_charge_time": "%s :pǝbɹɐɥɔ ןıʇu∩", - "gtceu.jade.remaining_discharge_time": "%s :ʎʇdɯǝ ןıʇu∩", - "gtceu.jade.seconds": "spuoɔǝs %s", - "gtceu.jade.years": "sɹɐǝʎ %s", - "gtceu.jei.bedrock_fluid.heavy_oil_deposit": "ʇısodǝᗡ ןıO ʎʌɐǝH", - "gtceu.jei.bedrock_fluid.lava_deposit": "ʇısodǝᗡ ɐʌɐꞀ", - "gtceu.jei.bedrock_fluid.light_oil_deposit": "ʇısodǝᗡ ןıO ʇɥbıꞀ", - "gtceu.jei.bedrock_fluid.natural_gas_deposit": "ʇısodǝᗡ sɐ⅁ ןɐɹnʇɐN", - "gtceu.jei.bedrock_fluid.nether_natural_gas_deposit": "ʇısodǝᗡ sɐ⅁ ןɐɹnʇɐN ɹǝɥʇǝN", - "gtceu.jei.bedrock_fluid.oil_deposit": "ʇısodǝᗡ ןıO", - "gtceu.jei.bedrock_fluid.raw_oil_deposit": "ʇısodǝᗡ ןıO ʍɐᴚ", - "gtceu.jei.bedrock_fluid.salt_water_deposit": "ʇısodǝᗡ ɹǝʇɐM ʇןɐS", - "gtceu.jei.bedrock_fluid_diagram": "ɯɐɹbɐıᗡ pınןℲ ʞɔoɹpǝᗺ", - "gtceu.jei.bedrock_ore_diagram": "ɯɐɹbɐıᗡ ǝɹO ʞɔoɹpǝᗺ", - "gtceu.jei.fluid.dep_amount_hover": "ʎq pǝʇǝןdǝp ǝq ןןıʍ uıǝʌ ǝɥʇ ʇunoɯɐ ǝɥ⟘", - "gtceu.jei.fluid.dep_chance_hover": "ʇsǝʌɹɐɥ uodn pǝʇǝןdǝp ǝq oʇ uıǝʌ ǝɥʇ ɹoɟ ǝɔuɐɥɔ ǝbɐʇuǝɔɹǝd ǝɥ⟘", - "gtceu.jei.fluid.dep_yield_hover": "pǝʇǝןdǝp ʎןןnɟ sı ʇı uǝɥʍ uıǝʌ ǝɥʇ ɟo pןǝıʎ ɯnɯıxɐɯ ǝɥ⟘", - "gtceu.jei.fluid.depleted_rate": "%d :pןǝıʎ pǝʇǝןdǝᗡ", - "gtceu.jei.fluid.depletion_amount": "%d :ʇunoɯⱯ uoıʇǝןdǝᗡ", - "gtceu.jei.fluid.depletion_chance": "%d%% :ǝɔuɐɥƆ uoıʇǝןdǝᗡ", - "gtceu.jei.fluid.dimension": ":suoısuǝɯıᗡ", - "gtceu.jei.fluid.max_hover": "ǝʌɐɥ uɐɔ pınןɟ sıɥʇ ɟo uıǝʌ pınןɟ ʎuɐ ʇɐɥʇ pןǝıʎ ɯnɯıxɐɯ ǝɥ⟘", - "gtceu.jei.fluid.max_yield": "%d :pןǝıʎ ɯnɯıxɐW", - "gtceu.jei.fluid.min_hover": "ǝʌɐɥ uɐɔ pınןɟ sıɥʇ ɟo uıǝʌ pınןɟ ʎuɐ ʇɐɥʇ pןǝıʎ ɯnɯıuıɯ ǝɥ⟘", - "gtceu.jei.fluid.min_yield": "%d :pןǝıʎ ɯnɯıuıW", - "gtceu.jei.fluid.vein_weight": "%d :ʇɥbıǝM uıǝΛ", - "gtceu.jei.fluid.weight_hover": "suoıʇɐɔıɟıpoɯ ǝɯoıq ǝןqıssod ʎuɐ ǝǝs oʇ pınןɟ ǝɥʇ ɹǝʌo ɹǝʌoH ˙uıǝʌ ǝɥʇ ɟo ʇɥbıǝM ǝɥ⟘", - "gtceu.jei.materials.average_mass": "%d :ssɐɯ ǝbɐɹǝʌⱯ", - "gtceu.jei.materials.average_neutrons": "%d :suoɹʇnǝu ǝbɐɹǝʌⱯ", - "gtceu.jei.materials.average_protons": "%d :suoʇoɹd ǝbɐɹǝʌⱯ", - "gtceu.jei.multiblock_info": "oɟuI ʞɔoןqıʇןnW", - "gtceu.jei.ore.between.0": "ǝɹO uǝǝʍʇǝᗺ", - "gtceu.jei.ore.between.1": "sǝɹo ɹǝɥʇo ɥʇıʍ 'uıǝʌ ǝɥʇ ɟo sɹǝʎɐן %d ǝןppıɯ ǝɥʇ uı suʍɐdS", - "gtceu.jei.ore.biome_weighting": "%dƐ§ :ʇɥbıǝM %sp§", - "gtceu.jei.ore.biome_weighting_no_spawn": "uʍɐdS ʇouuɐƆɔ§ :ʇɥbıǝM %sp§", - "gtceu.jei.ore.biome_weighting_title": ":sʇɥbıǝM ןɐʇo⟘ ǝɯoıᗺ pǝıɟıpoWp§", - "gtceu.jei.ore.ore_weight": "%d%% :uıǝʌ uı ʇɥbıǝM", - "gtceu.jei.ore.primary.0": "ǝɹO do⟘", - "gtceu.jei.ore.primary.1": "uıǝʌ ǝɥʇ ɟo sɹǝʎɐן %d doʇ ǝɥʇ uı suʍɐdS", - "gtceu.jei.ore.secondary.0": "ǝɹO ɯoʇʇoᗺ", - "gtceu.jei.ore.secondary.1": "uıǝʌ ǝɥʇ ɟo sɹǝʎɐן %d ɯoʇʇoq ǝɥʇ uı suʍɐdS", - "gtceu.jei.ore.sporadic.0": "ǝɹO ɔıpɐɹodS", - "gtceu.jei.ore.sporadic.1": "uıǝʌ ǝɥʇ uı ǝɹǝɥʍʎuɐ suʍɐdS", - "gtceu.jei.ore.surface_rock.0": "˙suoıʇɐɔoן uʍɐds uıǝʌ ǝʇouǝp ןɐıɹǝʇɐɯ sıɥʇ ɥʇıʍ sʞɔoᴚ ǝɔɐɟɹnS", - "gtceu.jei.ore.surface_rock.1": "˙snuoq ɐ buıʌıb ǝunʇɹoℲ ɥʇıʍ 'ʇsnp ǝɥʇ ɟo sǝןıԀ ʎuı⟘ Ɛ ɹoɟ uǝʞoɹq ǝq uɐɔ ʎǝɥ⟘", - "gtceu.jei.ore_processing_diagram": "ɯɐɹbɐıᗡ buıssǝɔoɹԀ ǝɹO", - "gtceu.jei.ore_vein.apatite_vein": "uıǝΛ ǝʇıʇɐdⱯ", - "gtceu.jei.ore_vein.banded_iron_vein": "uıǝΛ uoɹI pǝpuɐᗺ", - "gtceu.jei.ore_vein.bauxite_vein_end": "puƎ uıǝΛ ǝʇıxnɐᗺ", - "gtceu.jei.ore_vein.beryllium_vein": "uıǝΛ ɯnıןןʎɹǝᗺ", - "gtceu.jei.ore_vein.cassiterite_vein": "uıǝΛ ǝʇıɹǝʇıssɐƆ", - "gtceu.jei.ore_vein.certus_quartz": "zʇɹɐnὉ snʇɹǝƆ", - "gtceu.jei.ore_vein.coal_vein": "uıǝΛ ןɐoƆ", - "gtceu.jei.ore_vein.copper_tin_vein": "uıǝΛ uı⟘ ɹǝddoƆ", - "gtceu.jei.ore_vein.copper_vein": "uıǝΛ ɹǝddoƆ", - "gtceu.jei.ore_vein.diamond_vein": "uıǝΛ puoɯɐıᗡ", - "gtceu.jei.ore_vein.galena_vein": "uıǝΛ ɐuǝןɐ⅁", - "gtceu.jei.ore_vein.garnet_tin_vein": "uıǝΛ uı⟘ ʇǝuɹɐ⅁", - "gtceu.jei.ore_vein.garnet_vein": "uıǝΛ ʇǝuɹɐ⅁", - "gtceu.jei.ore_vein.iron_vein": "uıǝΛ uoɹI", - "gtceu.jei.ore_vein.lapis_vein": "uıǝΛ sıdɐꞀ", - "gtceu.jei.ore_vein.lubricant_vein": "uıǝΛ ʇuɐɔıɹqnꞀ", - "gtceu.jei.ore_vein.magnetite_vein_end": "puƎ uıǝΛ ǝʇıʇǝubɐW", - "gtceu.jei.ore_vein.magnetite_vein_ow": "ʍO uıǝΛ ǝʇıʇǝubɐW", - "gtceu.jei.ore_vein.manganese_vein": "uıǝΛ ǝsǝuɐbuɐW", - "gtceu.jei.ore_vein.manganese_vein_ow": "ʍO uıǝΛ ǝsǝuɐbuɐW", - "gtceu.jei.ore_vein.mica_vein": "uıǝΛ ɐɔıW", - "gtceu.jei.ore_vein.mineral_sand_vein": "uıǝΛ puɐS ןɐɹǝuıW", - "gtceu.jei.ore_vein.molybdenum_vein": "uıǝΛ ɯnuǝpqʎןoW", - "gtceu.jei.ore_vein.monazite_vein": "uıǝΛ ǝʇızɐuoW", - "gtceu.jei.ore_vein.naquadah_vein": "uıǝΛ ɥɐpɐnbɐN", - "gtceu.jei.ore_vein.nether_quartz_vein": "uıǝΛ zʇɹɐnὉ ɹǝɥʇǝN", - "gtceu.jei.ore_vein.nickel_vein": "uıǝΛ ןǝʞɔıN", - "gtceu.jei.ore_vein.oilsands_vein": "uıǝΛ spuɐsןıO", - "gtceu.jei.ore_vein.olivine_vein": "uıǝΛ ǝuıʌıןO", - "gtceu.jei.ore_vein.pitchblende_vein_end": "puƎ uıǝΛ ǝpuǝןqɥɔʇıԀ", - "gtceu.jei.ore_vein.redstone_vein": "uıǝΛ ǝuoʇspǝᴚ", - "gtceu.jei.ore_vein.redstone_vein_ow": "ʍO uıǝΛ ǝuoʇspǝᴚ", - "gtceu.jei.ore_vein.saltpeter_vein": "uıǝΛ ɹǝʇǝdʇןɐS", - "gtceu.jei.ore_vein.salts_vein": "uıǝΛ sʇןɐS", - "gtceu.jei.ore_vein.sapphire_vein": "uıǝΛ ǝɹıɥddɐS", - "gtceu.jei.ore_vein.scheelite_vein": "uıǝΛ ǝʇıןǝǝɥɔS", - "gtceu.jei.ore_vein.sheldonite_vein": "uıǝΛ ǝʇıuopןǝɥS", - "gtceu.jei.ore_vein.sulfur_vein": "uıǝΛ ɹnɟןnS", - "gtceu.jei.ore_vein.tetrahedrite_vein": "uıǝΛ ǝʇıɹpǝɥɐɹʇǝ⟘", - "gtceu.jei.ore_vein.topaz_vein": "uıǝΛ zɐdo⟘", - "gtceu.jei.ore_vein_diagram": "ɯɐɹbɐıᗡ uıǝΛ ǝɹO", - "gtceu.jei.ore_vein_diagram.chance": "ɹ§%s :ǝɔuɐɥƆǝ§", - "gtceu.jei.ore_vein_diagram.dimensions": ":suoısuǝɯıᗡ", - "gtceu.jei.ore_vein_diagram.spawn_range": ":ǝbuɐᴚ uʍɐdS", - "gtceu.jei.ore_vein_diagram.weight": "%s :ʇɥbıǝM", - "gtceu.jei.programmed_circuit": "ǝbɐԀ ʇınɔɹıƆ pǝɯɯɐɹboɹԀ", - "gtceu.journeymap.options.layers": "sɹǝʎɐן uoıʇɔǝdsoɹԀ", - "gtceu.journeymap.options.layers.bedrock_fluids": "suıǝΛ pınןℲ ʞɔoɹpǝᗺ ʍoɥS", - "gtceu.journeymap.options.layers.hide_depleted": "suıǝΛ pǝʇǝןdǝᗡ ǝpıH", - "gtceu.journeymap.options.layers.ore_veins": "suıǝΛ ǝɹO ʍoɥS", - "gtceu.key.armor_charging": "ǝןbbo⟘ ʎɹoʇuǝʌuI oʇ buıbɹɐɥƆ ɹoɯɹⱯ", - "gtceu.key.armor_hover": "ǝןbbo⟘ ɹǝʌoH ɹoɯɹⱯ", - "gtceu.key.armor_mode_switch": "ɥɔʇıʍS ǝpoW ɹoɯɹⱯ", - "gtceu.key.enable_boots": "dɯnſ pǝʇsooᗺ ǝןqɐuƎ", - "gtceu.key.enable_jetpack": "ʞɔɐdʇǝſ ǝןqɐuƎ", - "gtceu.key.enable_step_assist": "ʇsıssⱯdǝʇS ǝןqɐuƎ", - "gtceu.key.tool_aoe_change": "ɥɔʇıʍS ǝpoW ƎoⱯ ןoo⟘", - "gtceu.large_boiler": "ɹǝןıoᗺ ǝbɹɐꞀ", - "gtceu.large_chemical_reactor": "ɹoʇɔɐǝᴚ ןɐɔıɯǝɥƆ ǝbɹɐꞀ", - "gtceu.laser_engraver": "ɹǝʌɐɹbuƎ ɹǝsɐꞀ", - "gtceu.lathe": "ǝɥʇɐꞀ", - "gtceu.macerator": "ɹoʇɐɹǝɔɐW", - "gtceu.machine.active_transformer.tooltip.0": "ǝsınbsıᗡ uı sɹǝsɐꞀ :sɹǝɯɹoɟsuɐɹ⟘ㄥ§", - "gtceu.machine.active_transformer.tooltip.1": "˙ㄥ§sʇndʇnOɟ§ ʎbɹǝuƎ ɟo ɹǝqɯnu ʎuɐ oʇuı ㄥ§sʇnduIɟ§ ʎbɹǝuƎ ɟo ɹǝqɯnu ʎuɐ ǝuıqɯoɔ uɐƆㄥ§", - "gtceu.machine.active_transformer.tooltip.2": "ɥʇıʍ ǝɔuɐʇsıp ǝןqıpǝɹɔuı ʇɐ ɹǝʍod ʇıɯsuɐɹʇ uɐƆㄥ§", - "gtceu.machine.active_transformer.tooltip.3": "˙ㄥ§sɹǝsɐꞀ ", - "gtceu.machine.advanced_processing_array.tooltip": "pןɹoM ǝɥʇ ǝzıןǝןןɐɹɐԀ", - "gtceu.machine.assembly_line.tooltip": "¡ǝuıɥɔɐW buıןqɯǝssⱯ ʞɔoןqıʇןnɯ ɐ ʇoN", - "gtceu.machine.available_recipe_map_1.tooltip": "%s :sǝdʎ⟘ ǝdıɔǝᴚ ǝןqɐןıɐʌⱯ", - "gtceu.machine.available_recipe_map_2.tooltip": "%s '%s :sǝdʎ⟘ ǝdıɔǝᴚ ǝןqɐןıɐʌⱯ", - "gtceu.machine.available_recipe_map_3.tooltip": "%s '%s '%s :sǝdʎ⟘ ǝdıɔǝᴚ ǝןqɐןıɐʌⱯ", - "gtceu.machine.available_recipe_map_4.tooltip": "%s '%s '%s '%s :sǝdʎ⟘ ǝdıɔǝᴚ ǝןqɐןıɐʌⱯ", - "gtceu.machine.basic.input_from_output_side.allow": " :ǝpıS ʇndʇnO ɯoɹɟ ʇnduI ʍoןןⱯ", - "gtceu.machine.basic.input_from_output_side.disallow": " :ǝpıS ʇndʇnO ɯoɹɟ ʇnduI ʍoןןɐsıᗡ", - "gtceu.machine.batch_disabled": "pǝןqɐsıᗡ buıɥɔʇɐᗺ", - "gtceu.machine.batch_enabled": "pǝןqɐuƎ buıɥɔʇɐᗺ", - "gtceu.machine.bedrock_ore_miner.depletion": "%s%%ɟ§ :ǝʇɐᴚ uoıʇǝןdǝᗡq§", - "gtceu.machine.bedrock_ore_miner.description": "˙ʞɔoɹpǝq ɹǝpun suıǝʌ ɯoɹɟ sǝɹo sןןıɹᗡㄥ§", - "gtceu.machine.bedrock_ore_miner.production": "pǝʞɔoןɔɹǝʌo xɟ% 'x%dɟ§ :ɹǝıןdıʇןnW uoıʇɔnpoɹԀǝ§", - "gtceu.machine.block_breaker.speed_bonus": "%d%%ɟ§ :snuoᗺ pǝǝdSǝ§", - "gtceu.machine.block_breaker.tooltip": "sdoɹp sʇı sʇɔǝןןoɔ puɐ ǝɔɐɟ ʇuoɹɟ uo ʞɔoןq sǝuıWㄥ§", - "gtceu.machine.boiler.info.cooling.down": "ɹ§buıןooƆ6§", - "gtceu.machine.boiler.info.heating.up": "ɹ§buıʇɐǝHɔ§", - "gtceu.machine.boiler.info.production.data": "ʇ/ᗺɯ ɐ§%s buıɔnpoɹԀɐ§", - "gtceu.machine.buffer.tooltip": "spınןℲ puɐ sɯǝʇI ǝɹoʇs oʇ ɹǝɟɟnᗺ ןןɐɯS Ɐ", - "gtceu.machine.canner.jei_description": ")sןןǝƆ pınןℲ ɹo sʇǝʞɔnᗺ ˙b˙ǝ( ɹǝuuɐƆ pınןℲ ǝɥʇ ɥʇıʍ sɹǝuıɐʇuoɔ pınןɟ ʎuɐ ʎʇdɯǝ puɐ ןןıɟ uɐɔ noʎ", - "gtceu.machine.central_monitor.tooltip": "¿ɯooᗡ unɹ ʇı uɐɔ ʇnᗺ", - "gtceu.machine.charcoal_pile.tooltip": "ʎɹǝʞɐq ןǝnɟ punoɹbɹǝpu∩", - "gtceu.machine.charcoal_pile.tooltip.0": "˙ㄥ§pǝʇıubıɔ§ uǝɥʍ ㄥ§ןɐoɔɹɐɥƆɐ§ oʇuı sboꞀ suɹn⟘", - "gtceu.machine.charcoal_pile.tooltip.1": "˙ʇɹɐʇs oʇ sɯǝʇı buıʇɹɐʇs-ǝɹıɟ ɥʇıʍ ʞɔıןƆ ʇɥbıᴚ", - "gtceu.machine.charcoal_pile.tooltip.2": "˙ɥʇɐǝuǝq ǝɔɐds ㄥ§6xㄣx6q§ ɐ oʇ dn uı sɹnɔɔo sısʎןoɹʎԀ", - "gtceu.machine.charcoal_pile.tooltip.3": "¡ㄥ§ɹıⱯǝ§ oʇ pǝsodxǝ ǝq ʇou ǝq ʇsnɯ sboꞀ", - "gtceu.machine.cleanroom.tooltip": "ʇno sǝןɔıʇɹɐd ʎʞsǝd ǝsoɥʇ buıdǝǝʞ", - "gtceu.machine.cleanroom.tooltip.0": "˙sǝdıɔǝɹ ɯooɹuɐǝןɔ unɹ oʇ ǝpısuı sǝuıɥɔɐɯ ǝɔɐןԀ", - "gtceu.machine.cleanroom.tooltip.1": "˙uɐǝןɔ uǝɥʍ ㄥ§ʇ/∩Ǝ ㄣɟ§ 'ʎʇɹıp uǝɥʍ ㄥ§ʇ/∩Ǝ 0Ɛɟ§ sǝs∩", - "gtceu.machine.cleanroom.tooltip.2": "˙ǝןɔʎɔ ɹǝd buıuɐǝןɔ sǝsɐǝɹɔuı buıʞɔoןɔɹǝʌO", - "gtceu.machine.cleanroom.tooltip.3": "ϛƖxϛƖxϛƖ oʇ ϛxϛxϛɟ§ :ǝzıSq§", - "gtceu.machine.cleanroom.tooltip.4": "˙sǝbpǝ ǝɥʇ buıpnןɔxǝ 'buıןıǝɔ ǝɥʇ uıㄥ§ sbuısɐƆ ɹǝʇןıℲɟ§ sǝɹınbǝᴚ", - "gtceu.machine.cleanroom.tooltip.5": "˙uǝdo sı ɹoop ǝɥʇ uǝɥʍ uɐǝןɔ suıɐɯǝᴚ ¡ㄥ§sɹooᗡ ㄣɟ§ oʇ dn sʇdǝɔɔⱯ", - "gtceu.machine.cleanroom.tooltip.6": "¡ɯooɹuɐǝןɔ ǝɥʇ ɹoɟ ʎʇɹıp ooʇ ǝɹɐ sǝuıɥɔɐW ǝʌıʇıɯıɹԀ puɐ 'sןןıɹᗡ 'sɹǝןɟɟnW 'sɹoʇɐɹǝuǝ⅁", - "gtceu.machine.cleanroom.tooltip.7": "˙sןןɐʍ ǝɥʇ uıㄥ§ sǝpoıᗡɟ§ ɹoㄥ§ sןןnHɟ§ ɥbnoɹɥʇ ɹǝʍod puǝS", - "gtceu.machine.cleanroom.tooltip.ae2.channels": "˙sןןɐʍ ǝɥʇ uı ㄥ§sןןnHɟ§ ɥbnoɹɥʇㄥ§ sןǝuuɐɥƆ ᄅƎⱯ 8ɟ§ oʇ dn puǝS", - "gtceu.machine.cleanroom.tooltip.ae2.no_channels": "˙sןןɐʍ ǝɥʇ uı ㄥ§sןןnHɟ§ ɥbnoɹɥʇ ㄥ§sʞɹoʍʇǝN ᄅƎⱯɐ§ puǝS", - "gtceu.machine.cleanroom.tooltip.hold_ctrl": "uoıʇɐɯɹoɟuI ǝɹnʇɔnɹʇS ןɐuoıʇıppɐ ʍoɥs oʇ Ꞁᴚ⟘Ɔ pןoH", - "gtceu.machine.coke_oven.tooltip": "ɹǝʍoԀ puɐ ןǝǝʇS ɹoɟ sןǝnɟ ɹǝʇʇǝq buıʞɐW", - "gtceu.machine.coke_oven_hatch.tooltip": "˙uǝʌO ǝʞoƆ ǝɥʇ ɹoɟ ssǝɔɔɐ uoıʇɐɯoʇnɐ sʍoןןⱯㄥ§", - "gtceu.machine.combustion_generator.tooltip": "spınbıꞀ ǝןqɐɯɯɐןɟ sǝɹınbǝᴚㄥ§", - "gtceu.machine.computation_receiver_hatch.tooltip": "sʞɔoןqıʇןnW ɹoɟ ʇnduI ɐʇɐᗡ uoıʇɐʇndɯoƆ", - "gtceu.machine.computation_transmitter_hatch.tooltip": "sʞɔoןqıʇןnW ɹoɟ ʇndʇnO ɐʇɐᗡ uoıʇɐʇndɯoƆ", - "gtceu.machine.cracker.tooltip": "ןnɟǝsn ןıO sǝʞɐW", - "gtceu.machine.cracker.tooltip.1": "˙ㄥ§%%0Ɩɟ§ ʎq ǝbɐsn ʎbɹǝuǝ sǝɔnpǝɹ ㄥ§ןǝʞɔıuoɹdnƆ9§ ɹǝʇɟɐ ןıoɔ ʎɹǝʌƎ", - "gtceu.machine.data_access_hatch.tooltip.0": "sʞɔoןqıʇןnW ɹoɟ ssǝɔɔⱯ ɐʇɐᗡ", - "gtceu.machine.data_access_hatch.tooltip.1": "sɯǝʇI ɐʇɐᗡ ɹoɟ sʇoןs ㄥ§%sɐ§ sppⱯ", - "gtceu.machine.data_bank.tooltip.0": "SⱯN ןɐuosɹǝԀ ɹnoʎ", - "gtceu.machine.data_bank.tooltip.1": "˙sǝןqɐƆ ןɐɔıʇdO ɥʇıʍ ɹǝɟsuɐɹ⟘ ˙ǝbɐɹoʇS ɐʇɐᗡ ʞןnᗺ", - "gtceu.machine.data_bank.tooltip.2": "˙ɹǝɥʇǝboʇ pǝuıɐɥɔ ǝq uɐɔ sʞuɐᗺ ɐʇɐᗡ", - "gtceu.machine.data_bank.tooltip.3": "˙ʎןןɐɯɹou ɥɔʇɐH ןɐɔıʇdO/ɐʇɐᗡ ɹǝd ㄥ§ʇ/∩Ǝ %sɟ§ sǝs∩", - "gtceu.machine.data_bank.tooltip.4": "˙pǝuıɐɥɔ uǝɥʍ ɥɔʇɐH ןɐɔıʇdO/ɐʇɐᗡ ɹǝd ㄥ§ʇ/∩Ǝ %sɟ§ sǝs∩", - "gtceu.machine.data_receiver_hatch.tooltip": "sʞɔoןqıʇןnW ɹoɟ ʇnduI ɐʇɐᗡ ɥɔɹɐǝsǝᴚ", - "gtceu.machine.data_transmitter_hatch.tooltip": "sʞɔoןqıʇןnW ɹoɟ ʇndʇnO ɐʇɐᗡ ɥɔɹɐǝsǝᴚ", - "gtceu.machine.diode.message": "%s :ʇndɥbnoɹɥʇ ǝbɐɹǝdɯⱯ xɐW", - "gtceu.machine.diode.tooltip_general": "ǝbɐɹǝdɯⱯ sʇıɯıן puɐ uoıʇɔǝɹıp ǝuo uı ʍoןℲ ʎbɹǝuƎ sʍoןןⱯ", - "gtceu.machine.diode.tooltip_starts_at": "ǝbuɐɥɔ oʇ ʇǝןןɐW ʇɟoS ǝsn 'ㄥ§ⱯƖɟ§ sɐ sʇɹɐʇS", - "gtceu.machine.diode.tooltip_tool_usage": "˙ʍoןɟ ǝbɐɹǝdɯⱯ ǝbuɐɥɔ oʇ ʇǝןןɐW ʇɟoS ɐ ɥʇıʍ ʇıH", - "gtceu.machine.distillation_tower.tooltip": "ʎɹǝuıɟǝᴚ pınןℲ", - "gtceu.machine.drum.disable_output": "pınןℲ uıɐɹp ʇou ןןıM", - "gtceu.machine.drum.enable_output": "sʞuɐ⟘ ʇuǝɔɐظpɐ pɹɐʍuʍop oʇ pınןℲ uıɐɹp ןןıM", - "gtceu.machine.dual_hatch.export.tooltip": "sʞɔoןqıʇןnW ɹoɟ ʇndʇnO pınןℲ puɐ ɯǝʇI", - "gtceu.machine.dual_hatch.import.tooltip": "sʞɔoןqıʇןnW ɹoɟ ʇnduI pınןℲ puɐ ɯǝʇI", - "gtceu.machine.electric_blast_furnace.tooltip": "¿ɹǝʞoɯs ɔıɹʇɔǝןǝ ǝɥʇ s,ǝɹǝɥM", - "gtceu.machine.electric_blast_furnace.tooltip.0": "˙buıʞɔoןɔɹǝʌo-ǝɹd pǝıןddɐ sı ɹǝıןdıʇןnɯ ʎbɹǝuǝ ㄥ§%%ϛ6ɟ§ ǝʌıʇɐɔıןdıʇןnɯ ɐ 'ǝɹnʇɐɹǝdɯǝʇ ǝdıɔǝɹ ǝɥʇ ǝʌoqɐ ㄥ§ʞ006ɟ§ ʎɹǝʌǝ ɹoℲ", - "gtceu.machine.electric_blast_furnace.tooltip.1": "˙)ʞɔoןɔɹǝʌo ʇɔǝɟɹǝd( ㄥ§ʇuǝıɔıɟɟǝ %%00Ɩɟ§ sǝɯoɔǝq ʞɔoןɔɹǝʌo ǝuo 'ǝɹnʇɐɹǝdɯǝʇ ǝdıɔǝɹ ǝɥʇ ǝʌoqɐ ㄥ§ʞ008Ɩɟ§ ʎɹǝʌǝ ɹoℲ", - "gtceu.machine.electric_blast_furnace.tooltip.2": "˙ㄥ§ʞ00Ɩɟ§ ʎq pǝsɐǝɹɔuı sı ǝɹnʇɐɹǝdɯǝʇ 'ㄥ§ΛWq§ ǝʌoqɐ ɹǝıʇ ǝbɐʇןoʌ ʎɹǝʌǝ ɹoℲ", - "gtceu.machine.endpoint.tooltip.0": "˙ǝuıןǝdıd ɐ ǝʇɐǝɹɔ oʇ sʞɔoןq ㄥ§ǝdıԀ ǝɔuɐʇsıᗡ buoꞀɟ§ ɥʇıʍ ʇɔǝuuoƆ", - "gtceu.machine.endpoint.tooltip.1": "˙ʇuıodpuǝ ㄥ§ʇndʇnO Ɩɟ§ puɐ ㄥ§ʇnduI Ɩɟ§ ʎןʇɔɐxǝ ǝʌɐɥ ʇsnɯ sǝuıןǝdıԀ", - "gtceu.machine.endpoint.tooltip.2": "˙ㄥ§pǝpɐoן-ʞunɥɔɟ§ ǝq oʇ pǝǝu sʇuıodpuǝ ǝuıןǝdıd ʎןuO", - "gtceu.machine.endpoint.tooltip.min_length": "sʞɔoןᗺ %dɟ§ :ǝɔuɐʇsıᗡ ʇuıodpuƎ ɯnɯıuıWq§", - "gtceu.machine.energy_converter.description": "ƎℲ puɐ ∩Ǝ uǝǝʍʇǝq ʎbɹǝuƎ sʇɹǝʌuoƆ", - "gtceu.machine.energy_converter.message_conversion_eu": "ǝʌıʇɐN %d :ʇnO '∩Ǝ %d Ɐ%d :uI '∩Ǝ buıʇɹǝʌuoƆ", - "gtceu.machine.energy_converter.message_conversion_native": "∩Ǝ %d Ɐ%d :ʇnO 'ƎℲ %d :uI 'ʎbɹǝuƎ ǝʌıʇɐN buıʇɹǝʌuoƆ", - "gtceu.machine.energy_converter.tooltip_conversion_eu": "ǝʌıʇɐN %d >- )ɟ§%s( ∩Ǝ %d Ɐ%dɟ§ :uoısɹǝʌuoƆ ∩Ǝɐ§", - "gtceu.machine.energy_converter.tooltip_conversion_native": ")ɟ§%s( ∩Ǝ %d Ɐ%d >- ƎℲ %dɟ§ :uoısɹǝʌuoƆ ǝʌıʇɐNɔ§", - "gtceu.machine.energy_converter.tooltip_tool_usage": "ǝbuɐɥɔ oʇ ʇǝןןɐW ʇɟoS ǝsn 'ㄥ§ɹǝʇɹǝʌuoƆ ƎℲɟ§ sɐ sʇɹɐʇS", - "gtceu.machine.energy_hatch.input.tooltip": "sʞɔoןqıʇןnW ɹoɟ ʇnduI ʎbɹǝuƎ", - "gtceu.machine.energy_hatch.input_hi_amp.tooltip": "sʞɔoןqıʇןnW ɹoɟ ʇnduI ʎbɹǝuƎ ǝɹǝdɯⱯ ǝןdıʇןnW", - "gtceu.machine.energy_hatch.output.tooltip": "sʞɔoןqıʇןnW ɹoɟ ʇndʇnO ʎbɹǝuƎ", - "gtceu.machine.energy_hatch.output_hi_amp.tooltip": "sʞɔoןqıʇןnW ɹoɟ ʇndʇnO ʎbɹǝuƎ ǝɹǝdɯⱯ ǝןdıʇןnW", - "gtceu.machine.ev_alloy_smelter.tooltip": "ɹǝʇןǝɯS uoıʇɐuıqɯoɔ ɥɔǝ⟘ɥbıHㄥ§", - "gtceu.machine.ev_arc_furnace.tooltip": "¿ǝɔɐuɹnℲ ʇsɐןᗺ ɐ spǝǝu oɥMㄥ§", - "gtceu.machine.ev_assembler.tooltip": "¡ǝןqɯǝssⱯ 'sɹǝbuǝʌⱯㄥ§", - "gtceu.machine.ev_autoclave.tooltip": "sʇsnᗡ ɹnoʎ buızıןןɐʇsʎɹƆㄥ§", - "gtceu.machine.ev_bender.tooltip": "¡¡¡ᴚƎᗡNƎᗺ ʇuɐʍ ǝM ¡pɐq s,ǝɥ 'ooᗺㄥ§", - "gtceu.machine.ev_brewery.tooltip": "buıʍǝɹq uoıʇod ʇuǝıɔıɟɟǝ puɐ ʇɔɐdɯoƆㄥ§", - "gtceu.machine.ev_canner.tooltip": "sɹǝuıɐʇuoƆ ɟo ʇno puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", - "gtceu.machine.ev_centrifuge.tooltip": "ɹoʇɐɹɐdǝS ɹɐןnɔǝןoWㄥ§", - "gtceu.machine.ev_chemical_bath.tooltip": "ɯǝɥʇ ǝʇɐɹɐdǝs oʇ sןɐɔıɯǝɥƆ uı sǝɹO buıɥʇɐᗺㄥ§", - "gtceu.machine.ev_chemical_reactor.tooltip": "ɹǝɥʇo ɥɔɐǝ ɥʇıʍ ʇɔɐǝɹ sןɐɔıɯǝɥƆ buıʇʇǝꞀㄥ§", - "gtceu.machine.ev_circuit_assembler.tooltip": "ǝɔɐןd ǝɥʇ ɹǝʌo ןןɐ ǝɔɐןԀ-u-ʞɔıԀㄥ§", - "gtceu.machine.ev_compressor.tooltip": "ㄥㄥƆ ɔıʇɐW-O-ssǝɹdɯoƆㄥ§", - "gtceu.machine.ev_cutter.tooltip": "ǝɔıᗡ N,ǝɔıןSㄥ§", - "gtceu.machine.ev_distillery.tooltip": "spınןℲ ɟo sʇɹɐԀ ʇuɐʌǝןǝɹ ʇsoɯ buıʇɔɐɹʇxƎㄥ§", - "gtceu.machine.ev_electric_furnace.tooltip": "ㄣ9 ǝɹopoɯɯoƆ ɐ buısn ǝʞıן ʇoNㄥ§", - "gtceu.machine.ev_electrolyzer.tooltip": "sǝןnɔǝןoW buızʎןoɹʇɔǝןƎㄥ§", - "gtceu.machine.ev_electromagnetic_separator.tooltip": "ʇsǝɹ ǝɥʇ ɯoɹɟ sǝɹO ɔıʇǝubɐɯ ǝɥʇ buıʇɐɹɐdǝSㄥ§", - "gtceu.machine.ev_extractor.tooltip": "ƐᄅƖᗡ - ɯooᗡ ɟo ǝɔıʌǝᗡ-ɹǝɔınظǝᗡㄥ§", - "gtceu.machine.ev_extruder.tooltip": "buıʞɹoM ןɐʇǝW ɹoɟ ǝuıɥɔɐW ןɐsɹǝʌıu∩ㄥ§", - "gtceu.machine.ev_fermenter.tooltip": "spınןℲ buıʇuǝɯɹǝℲㄥ§", - "gtceu.machine.ev_fluid_drilling_rig.tooltip": "ɹǝuıɐɹᗡ ןןǝM", - "gtceu.machine.ev_fluid_heater.tooltip": "spınןℲ ɹnoʎ dn buıʇɐǝHㄥ§", - "gtceu.machine.ev_fluid_solidifier.tooltip": "spıןoS ɯɹoɟ oʇ uʍop spınןℲ sןooƆㄥ§", - "gtceu.machine.ev_forge_hammer.tooltip": "¡ǝɯıʇɹǝɯɯɐH 'doʇSㄥ§", - "gtceu.machine.ev_forming_press.tooltip": "sbuıɥʇ oʇuı sǝbɐɯI buıʇuıɹdɯIㄥ§", - "gtceu.machine.ev_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɹıɐ ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", - "gtceu.machine.ev_laser_engraver.tooltip": "ɹǝsɐꞀ ǝɥʇ ʇɐ ʎןʇɔǝɹıp ʞooן ʇ,uoᗡㄥ§", - "gtceu.machine.ev_lathe.tooltip": "ʎןʇuǝıɔıɟɟǝ ǝɹoɯ spoᴚ sǝɔnpoɹԀㄥ§", - "gtceu.machine.ev_macerator.tooltip": "sʇɔnpoɹdʎᗺ ɥʇıʍ sǝɹO ɹnoʎ buıppǝɹɥSㄥ§", - "gtceu.machine.ev_mass_fabricator.tooltip": "pǝɹɐnbS uoıʇɐɔıɹqɐℲ * ɹǝʇʇɐW W∩∩ㄥ§", - "gtceu.machine.ev_mixer.tooltip": "¿puǝןᗺ ʇı ןןıMㄥ§", - "gtceu.machine.ev_ore_washer.tooltip": "sǝɹO ɹnoʎ ɯoɹɟ sʇɔnpoɹdʎᗺ ǝɹoɯ buıʇʇǝ⅁ㄥ§", - "gtceu.machine.ev_packer.tooltip": "sǝxoᗺ ɟo ʇno sbuıɥʇ sqɐɹ⅁ puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", - "gtceu.machine.ev_polarizer.tooltip": "sʇǝubɐW ɹnoʎ buısıɹɐןodıᗺㄥ§", - "gtceu.machine.ev_replicator.tooltip": "sʇuǝɯǝןƎ ɟo ʇsǝɹnԀ ǝɥʇ buıɔnpoɹԀㄥ§", - "gtceu.machine.ev_rock_crusher.tooltip": "ʇuǝɔɐظpɐ ʎןןɐʇuozıɹoɥ ɐʌɐꞀ puɐ ɹǝʇɐM ǝɔɐןԀㄥ§", - "gtceu.machine.ev_scanner.tooltip": "sbuıɥʇ ɹǝɥʇo puɐ sןɐıɹǝʇɐW suɐɔSㄥ§", - "gtceu.machine.ev_sifter.tooltip": "buıʇɟıs dǝǝʞ puɐ ɯןɐɔ ʎɐʇSㄥ§", - "gtceu.machine.ev_thermal_centrifuge.tooltip": "ʎןǝsıɔǝɹd ǝɹoɯ sǝɹO buıʇɐɹɐdǝSㄥ§", - "gtceu.machine.ev_wiremill.tooltip": "ʎןʇuǝıɔıɟɟǝ ǝɹoɯ sǝɹıM sǝɔnpoɹԀㄥ§", - "gtceu.machine.extreme_combustion_engine.tooltip": "ɹǝsɐǝןǝᴚ ʎbɹǝuƎ ןɐɔıɯǝɥƆ ǝɯǝɹʇxƎ", - "gtceu.machine.fisher.requirement": "˙ʍoןǝq ʎןʇɔǝɹıp ɹǝʇɐʍ ɟo ǝɹɐnbs pǝɹǝʇuǝɔ %dx%d ɐ sǝɹınbǝᴚ", - "gtceu.machine.fisher.speed": "sʞɔıʇ %d ʎɹǝʌǝ buıɥʇǝɯos sǝɥɔʇɐƆ", - "gtceu.machine.fisher.tooltip": "˙ǝɯıʇ ɥɔɐǝ buıɹʇs ǝuo sǝɯnsuoƆ ˙ɥsıɟ oʇ buıɹʇs sʇsoƆ", - "gtceu.machine.fluid_drilling_rig.depletion": "%s%%ɟ§ :ǝʇɐᴚ uoıʇǝןdǝᗡq§", - "gtceu.machine.fluid_drilling_rig.description": "˙ʞɔoɹpǝq ɹǝpun suıǝʌ ɯoɹɟ spınןɟ sןןıɹᗡㄥ§", - "gtceu.machine.fluid_drilling_rig.production": "pǝʞɔoןɔɹǝʌo xɟ% 'x%dɟ§ :ɹǝıןdıʇןnW uoıʇɔnpoɹԀǝ§", - "gtceu.machine.fluid_hatch.export.tooltip": "sʞɔoןqıʇןnW ɹoɟ ʇndʇnO pınןℲ", - "gtceu.machine.fluid_hatch.import.tooltip": "sʞɔoןqıʇןnW ɹoɟ ʇnduI pınןℲ", - "gtceu.machine.fluid_tank.fluid": "%s ɟo Ꞁ %s suıɐʇuoƆ", - "gtceu.machine.fluid_tank.max_multiblock": "%dx%dx%d :ǝzıS ʞɔoןqıʇןnW xɐW", - "gtceu.machine.fusion_reactor.capacity": "∩Ǝ W%sǝ§ :ǝbɐɹoʇS ʎbɹǝuƎ ɯnɯıxɐWㄥ§", - "gtceu.machine.fusion_reactor.luv.tooltip": "ɹǝʇןǝɯS ʎoןןⱯ ɔıɯoʇⱯ", - "gtceu.machine.fusion_reactor.overclocking": "˙uoıʇɐɹnp ǝʌןɐɥ puɐ ʎbɹǝuǝ ǝןqnop sʞɔoןɔɹǝʌO", - "gtceu.machine.fusion_reactor.uv.tooltip": "ƎSⱯᗺ ᴚ∩Oʎ NO NMOᗡ ℲᴚⱯMᗡ Ǝ⟘IHM Ɐ", - "gtceu.machine.fusion_reactor.zpm.tooltip": "H⟘ᴚⱯƎ NO NMOᗡ N∩S Ɐ", - "gtceu.machine.gas_turbine.tooltip": "sǝsɐ⅁ ǝןqɐɯɯɐןɟ sǝɹınbǝᴚㄥ§", - "gtceu.machine.high_performance_computation_array.tooltip.0": "ɹǝʇndɯoɔɹǝdnS ǝbɐɹǝʌɐ ɹnoʎ ʇsnſ", - "gtceu.machine.high_performance_computation_array.tooltip.1": "˙)ʇɐǝɥ puɐ( ㄥ§uoıʇɐʇndɯoƆɟ§ ǝʇɐɹǝuǝb oʇ pǝs∩", - "gtceu.machine.high_performance_computation_array.tooltip.2": "˙)sʇıu∩ ʞɹoM ǝʇndɯoƆ( ㄥ§ʇ/∩MƆɟ§ ǝʇɐɹǝuǝb oʇ sʇuǝuodɯoɔ ⱯƆԀH sǝɹınbǝᴚ", - "gtceu.machine.hp_steam_alloy_smelter.tooltip": "ɹǝʇןǝɯS uoıʇɐuıqɯoƆㄥ§", - "gtceu.machine.hp_steam_compressor.tooltip": "sɯǝʇI buıssǝɹdɯoƆㄥ§", - "gtceu.machine.hp_steam_extractor.tooltip": "ɹǝqqnᴚ ʇsɹıɟ ɹnoʎ buıʇɔɐɹʇxƎㄥ§", - "gtceu.machine.hp_steam_forge_hammer.tooltip": "ɹǝɯɯɐH ǝbɹoℲㄥ§", - "gtceu.machine.hp_steam_furnace.tooltip": "ɯɐǝʇS pǝssǝɹdɯoɔ ɥʇıʍ sbuıɥʇ buıʇןǝɯSㄥ§", - "gtceu.machine.hp_steam_liquid_boiler.tooltip": "ɹǝןıoᗺ pınbıꞀ ɯɐǝʇS ןןɐɯS uɐɥʇ ɹǝʇsɐℲㄥ§", - "gtceu.machine.hp_steam_macerator.tooltip": "sʇɔnpoɹdʎᗺ ʇnoɥʇıʍ sǝɹO ɹnoʎ buıʇɐɹǝɔɐWㄥ§", - "gtceu.machine.hp_steam_rock_crusher.tooltip": "ʇuǝɔɐظpɐ ʎןןɐʇuozıɹoɥ ɐʌɐꞀ puɐ ɹǝʇɐM ǝɔɐןԀㄥ§", - "gtceu.machine.hp_steam_solar_boiler.tooltip": "unS ʎq ɹǝʍoԀ ɯɐǝʇSㄥ§", - "gtceu.machine.hp_steam_solid_boiler.tooltip": "ɹǝןıoᗺ ןǝnℲ pıןoS ɯɐǝʇS ןןɐɯS ǝɥʇ uɐɥʇ ɹǝʇsɐℲㄥ§", - "gtceu.machine.hpca.active_cooler_component.tooltip": "buıןooɔ ǝʌıʇɔǝɟɟǝ ǝɹoɯ 'ǝǝɹɟ ssǝꞀ", - "gtceu.machine.hpca.advanced_computation_component.damaged.name": "ʇuǝuodɯoƆ uoıʇɐʇndɯoƆ pǝɔuɐʌpⱯ ⱯƆԀH pǝbɐɯɐᗡ", - "gtceu.machine.hpca.advanced_computation_component.damaged.tooltip": "bǝן ɐ puɐ ɯɹɐ uɐ ʇsoɔ ʎןuo ʇI", - "gtceu.machine.hpca.advanced_computation_component.tooltip": "sǝnbɐǝן bıq uoıʇɐʇndɯoƆ", - "gtceu.machine.hpca.bridge_component.tooltip": "ɯoɹɟ sǝɯoɔ ⱯƆԀH uı \"ʎɐɹɹⱯ\" ǝɥʇ ǝɹǝɥʍ s,ʇɐɥʇ oS", - "gtceu.machine.hpca.component_general.max_eut": "ʇ/∩Ǝ %dɟ§ :ʎbɹǝuƎ xɐW9§", - "gtceu.machine.hpca.component_general.upkeep_eut": "ʇ/∩Ǝ %dɟ§ :ʎbɹǝuƎ dǝǝʞd∩ǝ§", - "gtceu.machine.hpca.component_type.bridge": "ㄥ§sǝɥɔʇıʍS ʞɹoʍʇǝNɟ§ oʇ ʇɔǝuuoɔ oʇ ㄥ§ⱯƆԀHɟ§ sʍoןןⱯ", - "gtceu.machine.hpca.component_type.computation_cooling": "buıןooƆ %dɟ§ :oʇ dn sǝɹınbǝᴚɔ§", - "gtceu.machine.hpca.component_type.computation_cwut": "ʇ/∩MƆ %dɟ§ :uoıʇɐʇndɯoƆ6§", - "gtceu.machine.hpca.component_type.cooler_active": "ǝʌıʇɔⱯɟ§ :ǝdʎ⟘ ɹǝןooƆq§", - "gtceu.machine.hpca.component_type.cooler_active_coolant": "%s ʇ/ᗺɯ %dɟ§ :oʇ dn sǝɹınbǝᴚɔ§", - "gtceu.machine.hpca.component_type.cooler_cooling": "buıןooƆ %dɟ§ :sǝpıʌoɹԀɐ§", - "gtceu.machine.hpca.component_type.cooler_passive": "ǝʌıssɐԀɟ§ :ǝdʎ⟘ ɹǝןooƆq§", - "gtceu.machine.hpca.component_type.damaged": "¡buıʇɐǝɥɹǝʌo ⱯƆԀH ʎq pǝbɐɯɐp ǝq uɐƆ", - "gtceu.machine.hpca.computation_component.damaged.name": "ʇuǝuodɯoƆ uoıʇɐʇndɯoƆ ⱯƆԀH pǝbɐɯɐᗡ", - "gtceu.machine.hpca.computation_component.damaged.tooltip": "sןɐıɹǝʇɐɯ ǝןqɐןɔʎɔǝɹ ǝǝɹℲ", - "gtceu.machine.hpca.computation_component.tooltip": "uoıʇɐʇndɯoɔ ʇsɹıɟ s,ʎqɐᗺ", - "gtceu.machine.hpca.empty_component.tooltip": "ǝɔɐds buıןןıɟ ɹoɟ ʇsnſ", - "gtceu.machine.hpca.heat_sink_component.tooltip": "¿ǝǝɹɟ buıɥʇʎuɐ sI ¡buıןooɔ ǝǝɹℲ", - "gtceu.machine.hull.tooltip": "sıɥʇ ǝsn oʇ ㄥ§uϛ§oƖ§ıㄥ§ʇƐ§ɐq§uɐ§ıǝ§bɔ§ɐㄣ§ɯp§Iϛ§ pǝǝu ʇsnظ noʎㄥ§", - "gtceu.machine.hv_alloy_smelter.tooltip": "ɹǝʇןǝɯS uoıʇɐuıqɯoɔ ɥɔǝ⟘ɥbıHㄥ§", - "gtceu.machine.hv_arc_furnace.tooltip": "¿ǝɔɐuɹnℲ ʇsɐןᗺ ɐ spǝǝu oɥMㄥ§", - "gtceu.machine.hv_assembler.tooltip": "¡ǝןqɯǝssⱯ 'sɹǝbuǝʌⱯㄥ§", - "gtceu.machine.hv_autoclave.tooltip": "sʇsnᗡ ɹnoʎ buızıןןɐʇsʎɹƆㄥ§", - "gtceu.machine.hv_bender.tooltip": "¡¡¡ᴚƎᗡNƎᗺ ʇuɐʍ ǝM ¡pɐq s,ǝɥ 'ooᗺㄥ§", - "gtceu.machine.hv_brewery.tooltip": "buıʍǝɹq uoıʇod ʇuǝıɔıɟɟǝ puɐ ʇɔɐdɯoƆㄥ§", - "gtceu.machine.hv_canner.tooltip": "sɹǝuıɐʇuoƆ ɟo ʇno puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", - "gtceu.machine.hv_centrifuge.tooltip": "sǝןnɔǝןoW buıʇɐɹɐdǝSㄥ§", - "gtceu.machine.hv_chemical_bath.tooltip": "ɯǝɥʇ ǝʇɐɹɐdǝs oʇ sןɐɔıɯǝɥƆ uı sǝɹO buıɥʇɐᗺㄥ§", - "gtceu.machine.hv_chemical_reactor.tooltip": "ɹǝɥʇo ɥɔɐǝ ɥʇıʍ ʇɔɐǝɹ sןɐɔıɯǝɥƆ buıʇʇǝꞀㄥ§", - "gtceu.machine.hv_circuit_assembler.tooltip": "ǝɔɐןd ǝɥʇ ɹǝʌo ןןɐ ǝɔɐןԀ-u-ʞɔıԀㄥ§", - "gtceu.machine.hv_compressor.tooltip": "ㄥㄥƆ ɔıʇɐW-O-ssǝɹdɯoƆㄥ§", - "gtceu.machine.hv_cutter.tooltip": "ǝɔıᗡ N,ǝɔıןSㄥ§", - "gtceu.machine.hv_distillery.tooltip": "spınןℲ ɟo sʇɹɐԀ ʇuɐʌǝןǝɹ ʇsoɯ buıʇɔɐɹʇxƎㄥ§", - "gtceu.machine.hv_electric_furnace.tooltip": "ㄣ9 ǝɹopoɯɯoƆ ɐ buısn ǝʞıן ʇoNㄥ§", - "gtceu.machine.hv_electrolyzer.tooltip": "sǝןnɔǝןoW buızʎןoɹʇɔǝןƎㄥ§", - "gtceu.machine.hv_electromagnetic_separator.tooltip": "ʇsǝɹ ǝɥʇ ɯoɹɟ sǝɹO ɔıʇǝubɐɯ ǝɥʇ buıʇɐɹɐdǝSㄥ§", - "gtceu.machine.hv_extractor.tooltip": "ƐᄅƖᗡ - ɯooᗡ ɟo ǝɔıʌǝᗡ-ɹǝɔınظǝᗡㄥ§", - "gtceu.machine.hv_extruder.tooltip": "buıʞɹoM ןɐʇǝW ɹoɟ ǝuıɥɔɐW ןɐsɹǝʌıu∩ㄥ§", - "gtceu.machine.hv_fermenter.tooltip": "spınןℲ buıʇuǝɯɹǝℲㄥ§", - "gtceu.machine.hv_fluid_drilling_rig.tooltip": "buıʞɔɐɹℲ ɯɹoɟɹǝd ʇou sǝoᗡ", - "gtceu.machine.hv_fluid_heater.tooltip": "spınןℲ ɹnoʎ dn buıʇɐǝHㄥ§", - "gtceu.machine.hv_fluid_solidifier.tooltip": "spıןoS ɯɹoɟ oʇ uʍop spınןℲ sןooƆㄥ§", - "gtceu.machine.hv_forge_hammer.tooltip": "¡ǝɯıʇɹǝɯɯɐH 'doʇSㄥ§", - "gtceu.machine.hv_forming_press.tooltip": "sbuıɥʇ oʇuı sǝbɐɯI buıʇuıɹdɯIㄥ§", - "gtceu.machine.hv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɹıɐ ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", - "gtceu.machine.hv_laser_engraver.tooltip": "ɹǝsɐꞀ ǝɥʇ ʇɐ ʎןʇɔǝɹıp ʞooן ʇ,uoᗡㄥ§", - "gtceu.machine.hv_lathe.tooltip": "ʎןʇuǝıɔıɟɟǝ ǝɹoɯ spoᴚ sǝɔnpoɹԀㄥ§", - "gtceu.machine.hv_macerator.tooltip": "sʇɔnpoɹdʎᗺ ɥʇıʍ sǝɹO ɹnoʎ buıppǝɹɥSㄥ§", - "gtceu.machine.hv_mass_fabricator.tooltip": "pǝɹɐnbS uoıʇɐɔıɹqɐℲ * ɹǝʇʇɐW W∩∩ㄥ§", - "gtceu.machine.hv_mixer.tooltip": "¿puǝןᗺ ʇı ןןıMㄥ§", - "gtceu.machine.hv_ore_washer.tooltip": "sǝɹO ɹnoʎ ɯoɹɟ sʇɔnpoɹdʎᗺ ǝɹoɯ buıʇʇǝ⅁ㄥ§", - "gtceu.machine.hv_packer.tooltip": "sǝxoᗺ ɟo ʇno sbuıɥʇ sqɐɹ⅁ puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", - "gtceu.machine.hv_polarizer.tooltip": "sʇǝubɐW ɹnoʎ buısıɹɐןodıᗺㄥ§", - "gtceu.machine.hv_replicator.tooltip": "sʇuǝɯǝןƎ ɟo ʇsǝɹnԀ ǝɥʇ buıɔnpoɹԀㄥ§", - "gtceu.machine.hv_rock_crusher.tooltip": "ʇuǝɔɐظpɐ ʎןןɐʇuozıɹoɥ ɐʌɐꞀ puɐ ɹǝʇɐM ǝɔɐןԀㄥ§", - "gtceu.machine.hv_scanner.tooltip": "sbuıɥʇ ɹǝɥʇo puɐ sןɐıɹǝʇɐW suɐɔSㄥ§", - "gtceu.machine.hv_sifter.tooltip": "buıʇɟıs dǝǝʞ puɐ ɯןɐɔ ʎɐʇSㄥ§", - "gtceu.machine.hv_thermal_centrifuge.tooltip": "ʎןǝsıɔǝɹd ǝɹoɯ sǝɹO buıʇɐɹɐdǝSㄥ§", - "gtceu.machine.hv_wiremill.tooltip": "ʎןʇuǝıɔıɟɟǝ ǝɹoɯ sǝɹıM sǝɔnpoɹԀㄥ§", - "gtceu.machine.implosion_compressor.tooltip": "ɯooᗺ ob oʇ ʇuɐʍ noʎ ǝuıɥɔɐW ʎןuo ǝɥ⟘", - "gtceu.machine.item_bus.export.tooltip": "sʞɔoןqıʇןnW ɹoɟ ʇndʇnO ɯǝʇI", - "gtceu.machine.item_bus.import.tooltip": "sʞɔoןqıʇןnW ɹoɟ ʇnduI ɯǝʇI", - "gtceu.machine.item_collector.gui.collect_range": "sʞɔoןq %sx%s ɟo ɐǝɹɐ uɐ uıɥʇıʍ ʇɔǝןןoƆ", - "gtceu.machine.item_collector.tooltip": "ɟןǝsʇı punoɹɐ sɯǝʇI sʇɔǝןןoƆ", - "gtceu.machine.iv_alloy_smelter.tooltip": "ɹoʇɐɹbǝʇuI ʎoןןⱯㄥ§", - "gtceu.machine.iv_arc_furnace.tooltip": "ɹǝʇɐǝH ǝbɹɐɥɔsıᗡㄥ§", - "gtceu.machine.iv_assembler.tooltip": "ǝןqɐ⟘ buıʇɟɐɹƆ ɐ ⟘ONㄥ§", - "gtceu.machine.iv_autoclave.tooltip": "ɹǝʞooƆ ǝɹnssǝɹԀㄥ§", - "gtceu.machine.iv_bender.tooltip": "ɹǝʇɹoʇsıᗡ ǝdɐɥSㄥ§", - "gtceu.machine.iv_brewery.tooltip": "sʞuıɹᗡ ɹnoʎ buıʍǝɹᗺㄥ§", - "gtceu.machine.iv_canner.tooltip": "ɹoʇɐɹǝdO uɐƆㄥ§", - "gtceu.machine.iv_centrifuge.tooltip": "ǝuoןɔʎƆ ɹɐןnɔǝןoWㄥ§", - "gtceu.machine.iv_chemical_bath.tooltip": "ɹǝʞɐoS ןɐɔıɯǝɥƆㄥ§", - "gtceu.machine.iv_chemical_reactor.tooltip": "ɹǝɯɹoɟɹǝԀ ןɐɔıɯǝɥƆㄥ§", - "gtceu.machine.iv_circuit_assembler.tooltip": "ɹǝɹnʇɔɐɟnuɐW sɔıuoɹʇɔǝןƎㄥ§", - "gtceu.machine.iv_compressor.tooltip": "ɹǝsuǝpuoƆ ʎʇıɹɐןnbuıSㄥ§", - "gtceu.machine.iv_cutter.tooltip": "ɹǝʌɐǝןƆ ɹǝʇʇɐWㄥ§", - "gtceu.machine.iv_distillery.tooltip": "ɹoʇɐɹɐdǝS uoıʇɐsuǝpuoƆㄥ§", - "gtceu.machine.iv_electric_furnace.tooltip": "ɹossǝɔoɹԀ ʇuǝɯǝʇıɔxƎ uoɹʇɔǝןƎㄥ§", - "gtceu.machine.iv_electrolyzer.tooltip": "906ㄣ-Ǝ ɹoʇɐɹbǝʇuısıᗡ ɹɐןnɔǝןoWㄥ§", - "gtceu.machine.iv_electromagnetic_separator.tooltip": "ɹǝzıɹobǝʇɐƆ WƎㄥ§", - "gtceu.machine.iv_extractor.tooltip": "ɹoʇɐuıʇɔɐɹʇxƎ ɯnnɔɐΛㄥ§", - "gtceu.machine.iv_extruder.tooltip": "ɹǝɔɐןdsıᗡ ןɐıɹǝʇɐWㄥ§", - "gtceu.machine.iv_fermenter.tooltip": "ɹǝuǝʇsɐH uoıʇɐʇuǝɯɹǝℲㄥ§", - "gtceu.machine.iv_fluid_heater.tooltip": "ɹǝsnɟuI ʇɐǝHㄥ§", - "gtceu.machine.iv_fluid_solidifier.tooltip": "ǝuıɥɔɐW ǝɔI uɐ ʇoNㄥ§", - "gtceu.machine.iv_forge_hammer.tooltip": "ɹǝbɹoℲ ǝʇɐןԀㄥ§", - "gtceu.machine.iv_forming_press.tooltip": "ɹǝɹǝʎɐꞀ ʇɔǝظqOㄥ§", - "gtceu.machine.iv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ǝɹǝɥdsoɯʇɐ ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", - "gtceu.machine.iv_laser_engraver.tooltip": "MW ㄣ0˙ᄅ ɟo ɹǝʍoԀ ǝɥʇ ɥʇıMㄥ§", - "gtceu.machine.iv_lathe.tooltip": "906ϛ-Ꞁ ɔıʇɐW-O-uɹn⟘ㄥ§", - "gtceu.machine.iv_macerator.tooltip": "Ɩ006 ɔıʇɐW-O-puǝןᗺㄥ§", - "gtceu.machine.iv_mass_fabricator.tooltip": "ʎɹoʇɔɐℲ sısǝuǝ⅁ㄥ§", - "gtceu.machine.iv_mixer.tooltip": "ɹǝzıuɐbɹO ɹǝʇʇɐWㄥ§", - "gtceu.machine.iv_ore_washer.tooltip": "09Ɛ-I ɹǝɥsɐM-ʎɹpunɐꞀ pǝsodɹndǝᴚㄥ§", - "gtceu.machine.iv_packer.tooltip": "ɹoʇɐuıxoᗺㄥ§", - "gtceu.machine.iv_polarizer.tooltip": "ɹǝɔnpuI ɯsıʇǝubɐWㄥ§", - "gtceu.machine.iv_replicator.tooltip": "ɹǝʇsɐԀ ɹǝʇʇɐWㄥ§", - "gtceu.machine.iv_rock_crusher.tooltip": "00ᄅ8-ᴚ ɹǝıɟıpıןoS ɐɯbɐW ɔıuǝboʎɹƆㄥ§", - "gtceu.machine.iv_scanner.tooltip": "ɹoʇɔǝʇǝᗡ ʎןɐɯouⱯㄥ§", - "gtceu.machine.iv_sifter.tooltip": "ƆℲ⟘ ʎq pǝɹosuodSㄥ§", - "gtceu.machine.iv_thermal_centrifuge.tooltip": "0ϛƐ9-⟘ doɥsʇɐǝʍS ǝzɐןᗺㄥ§", - "gtceu.machine.iv_wiremill.tooltip": "ɹoʇɐbuoןƎ ʇobuIㄥ§", - "gtceu.machine.large_boiler.bronze.tooltip": "¡ɯɐǝʇS ǝɹoɯ pǝǝu ǝM", - "gtceu.machine.large_boiler.steel.tooltip": "ɹoʇɐɹǝuıɔuI ןɐoɔɹɐɥƆ", - "gtceu.machine.large_boiler.titanium.tooltip": "¿ןǝnℲ ɹǝdnS ɔıbɐW ǝɥʇ s,ǝɹǝɥM", - "gtceu.machine.large_boiler.tungstensteel.tooltip": "¿buıɥʇ sıɥʇ ןǝnɟ uǝʌǝ noʎ op ʍoH", - "gtceu.machine.large_chemical_reactor.tooltip": "ɹoʇɔɐǝᴚ xoᗺ ʞɔɐןᗺ", - "gtceu.machine.large_combustion_engine.tooltip": "ɹǝqɯɐɥƆ uoıʇıubI ןǝnℲ", - "gtceu.machine.large_combustion_engine.tooltip.boost_extreme": "˙uoıʇdɯnsuoɔ ןǝnɟ ㄥ§xᄅɟ§ ʇɐ ㄥ§ʇ/∩Ǝ %sɟ§ oʇ dn ǝɔnpoɹd oʇ uǝbʎxO pınbıꞀ ɟo ㄥ§s/ᗺɯ 08ɟ§ ʎןddnS", - "gtceu.machine.large_combustion_engine.tooltip.boost_regular": "˙uoıʇdɯnsuoɔ ןǝnɟ ㄥ§xᄅɟ§ ʇɐ ㄥ§ʇ/∩Ǝ %sɟ§ oʇ dn ǝɔnpoɹd oʇ uǝbʎxO ɟo ㄥ§s/ᗺɯ 0ᄅɟ§ ʎןddnS", - "gtceu.machine.large_miner.ev.tooltip": "noʎ ɟo pɐǝʇsuı ǝɹO buıbbıᗡ", - "gtceu.machine.large_miner.iv.tooltip": "ɹoʇɐʌɐɔxƎ ǝɯoıᗺ", - "gtceu.machine.large_miner.luv.tooltip": "ɹǝʇsǝʌɹɐH ןɐıɹʇsǝɹɹǝ⟘", - "gtceu.machine.large_turbine.gas.tooltip": "ǝuıbuƎ ʇǝſ ɐ ʇoN", - "gtceu.machine.large_turbine.plasma.tooltip": "uoɥdıS ʎbɹǝuƎ ɐɯsɐןԀ", - "gtceu.machine.large_turbine.steam.tooltip": "ʇı uı pɐǝH ɹnoʎ ʇnd ʇou oᗡ", - "gtceu.machine.laser_hatch.both.tooltip": "ㄥ§¡ǝuıן ʇɥbıɐɹʇs ɐ uı ǝq ʇsnɯ sǝןqɐƆ ɹǝsɐꞀɔ§", - "gtceu.machine.laser_hatch.source.tooltip": "ǝɔuɐʇsıp ʇɐ ɹǝʍod buıʇʇıɯsuɐɹ⟘ㄥ§", - "gtceu.machine.laser_hatch.target.tooltip": "ǝɔuɐʇsıp ɯoɹɟ ɹǝʍod buıʌıǝɔǝᴚㄥ§", - "gtceu.machine.laser_source_hatch.tooltip.0": "ǝɔuɐʇsıp ʇɐ ɹǝʍod buıʇʇıɯsuɐɹ⟘", - "gtceu.machine.laser_source_hatch.tooltip.1": "ㄥ§¡ǝuıן ʇɥbıɐɹʇs ɐ uı ǝq ʇsnɯ sǝןqɐɔ ɹǝsɐꞀɔ§", - "gtceu.machine.laser_target_hatch.tooltip.0": "ǝɔuɐʇsıp ɯoɹɟ ɹǝʍod buıʌıǝɔǝᴚ", - "gtceu.machine.laser_target_hatch.tooltip.1": "ㄥ§¡ǝuıן ʇɥbıɐɹʇs ɐ uı ǝq ʇsnɯ sǝןqɐɔ ɹǝsɐꞀɔ§", - "gtceu.machine.locked_safe.malfunctioning": "¡buıuoıʇɔunɟןɐWɔ§", - "gtceu.machine.locked_safe.requirements": ":pǝɹınbǝɹ sʇuǝɯǝɔɐןdǝᴚㄥ§", - "gtceu.machine.lp_steam_alloy_smelter.tooltip": "ɹǝʇןǝɯS uoıʇɐuıqɯoƆㄥ§", - "gtceu.machine.lp_steam_compressor.tooltip": "sɯǝʇI buıssǝɹdɯoƆㄥ§", - "gtceu.machine.lp_steam_extractor.tooltip": "ɹǝqqnᴚ ʇsɹıɟ ɹnoʎ buıʇɔɐɹʇxƎㄥ§", - "gtceu.machine.lp_steam_forge_hammer.tooltip": "ɹǝɯɯɐH ǝbɹoℲㄥ§", - "gtceu.machine.lp_steam_furnace.tooltip": "ɯɐǝʇS pǝssǝɹdɯoɔ ɥʇıʍ sbuıɥʇ buıʇןǝɯSㄥ§", - "gtceu.machine.lp_steam_liquid_boiler.tooltip": "spınbıꞀ ɟɟo buıuunɹ ɹǝןıoᗺ Ɐㄥ§", - "gtceu.machine.lp_steam_macerator.tooltip": "sʇɔnpoɹdʎᗺ ʇnoɥʇıʍ sǝɹO ɹnoʎ buıʇɐɹǝɔɐWㄥ§", - "gtceu.machine.lp_steam_rock_crusher.tooltip": "ʇuǝɔɐظpɐ ʎןןɐʇuozıɹoɥ ɐʌɐꞀ puɐ ɹǝʇɐM ǝɔɐןԀㄥ§", - "gtceu.machine.lp_steam_solar_boiler.tooltip": "unS ʎq ɹǝʍoԀ ɯɐǝʇSㄥ§", - "gtceu.machine.lp_steam_solid_boiler.tooltip": "ɹǝʍoԀ ɯɐǝʇS ʇǝb oʇ ʎɐʍ ʎןɹɐǝ uⱯㄥ§", - "gtceu.machine.luv_alloy_smelter.tooltip": "ɹoʇɐɹbǝʇuI ʎoןןⱯㄥ§", - "gtceu.machine.luv_arc_furnace.tooltip": "ɹǝʇɐǝH ǝbɹɐɥɔsıᗡㄥ§", - "gtceu.machine.luv_assembler.tooltip": "ǝןqɐ⟘ buıʇɟɐɹƆ ɐ ⟘ONㄥ§", - "gtceu.machine.luv_autoclave.tooltip": "ɹǝʞooƆ ǝɹnssǝɹԀㄥ§", - "gtceu.machine.luv_bender.tooltip": "ɹǝʇɹoʇsıᗡ ǝdɐɥSㄥ§", - "gtceu.machine.luv_brewery.tooltip": "sʞuıɹᗡ ɹnoʎ buıʍǝɹᗺㄥ§", - "gtceu.machine.luv_canner.tooltip": "ɹoʇɐɹǝdO uɐƆㄥ§", - "gtceu.machine.luv_centrifuge.tooltip": "ǝuoןɔʎƆ ɹɐןnɔǝןoWㄥ§", - "gtceu.machine.luv_chemical_bath.tooltip": "ɹǝʞɐoS ןɐɔıɯǝɥƆㄥ§", - "gtceu.machine.luv_chemical_reactor.tooltip": "ɹǝɯɹoɟɹǝԀ ןɐɔıɯǝɥƆㄥ§", - "gtceu.machine.luv_circuit_assembler.tooltip": "ɹǝɹnʇɔɐɟnuɐW sɔıuoɹʇɔǝןƎㄥ§", - "gtceu.machine.luv_compressor.tooltip": "ɹǝsuǝpuoƆ ʎʇıɹɐןnbuıSㄥ§", - "gtceu.machine.luv_cutter.tooltip": "ɹǝʌɐǝןƆ ɹǝʇʇɐWㄥ§", - "gtceu.machine.luv_distillery.tooltip": "ɹoʇɐɹɐdǝS uoıʇɐsuǝpuoƆㄥ§", - "gtceu.machine.luv_electric_furnace.tooltip": "ɹossǝɔoɹԀ ʇuǝɯǝʇıɔxƎ uoɹʇɔǝןƎㄥ§", - "gtceu.machine.luv_electrolyzer.tooltip": "ㄥ06ㄣ-Ǝ ɹoʇɐɹbǝʇuısıᗡ ɹɐןnɔǝןoWㄥ§", - "gtceu.machine.luv_electromagnetic_separator.tooltip": "ɹǝzıɹobǝʇɐƆ WƎㄥ§", - "gtceu.machine.luv_extractor.tooltip": "ɹoʇɐuıʇɔɐɹʇxƎ ɯnnɔɐΛㄥ§", - "gtceu.machine.luv_extruder.tooltip": "ɹǝɔɐןdsıᗡ ןɐıɹǝʇɐWㄥ§", - "gtceu.machine.luv_fermenter.tooltip": "ɹǝuǝʇsɐH uoıʇɐʇuǝɯɹǝℲㄥ§", - "gtceu.machine.luv_fluid_heater.tooltip": "ɹǝsnɟuI ʇɐǝHㄥ§", - "gtceu.machine.luv_fluid_solidifier.tooltip": "ǝuıɥɔɐW ǝɔI uɐ ʇoNㄥ§", - "gtceu.machine.luv_forge_hammer.tooltip": "ɹǝbɹoℲ ǝʇɐןԀㄥ§", - "gtceu.machine.luv_forming_press.tooltip": "ɹǝɹǝʎɐꞀ ʇɔǝظqOㄥ§", - "gtceu.machine.luv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ǝɹǝɥdsoɯʇɐ ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", - "gtceu.machine.luv_laser_engraver.tooltip": "MW 9Ɩ˙8 ɟo ɹǝʍoԀ ǝɥʇ ɥʇıMㄥ§", - "gtceu.machine.luv_lathe.tooltip": "ㄥ06ϛ-Ꞁ ɔıʇɐW-O-uɹn⟘ㄥ§", - "gtceu.machine.luv_macerator.tooltip": "ᄅ006 ɔıʇɐW-O-puǝןᗺㄥ§", - "gtceu.machine.luv_mass_fabricator.tooltip": "ʎɹoʇɔɐℲ sısǝuǝ⅁ㄥ§", - "gtceu.machine.luv_mixer.tooltip": "ɹǝzıuɐbɹO ɹǝʇʇɐWㄥ§", - "gtceu.machine.luv_ore_washer.tooltip": "Ɩ9Ɛ-I ɹǝɥsɐM-ʎɹpunɐꞀ pǝsodɹndǝᴚㄥ§", - "gtceu.machine.luv_packer.tooltip": "ɹoʇɐuıxoᗺㄥ§", - "gtceu.machine.luv_polarizer.tooltip": "ɹǝɔnpuI ɯsıʇǝubɐWㄥ§", - "gtceu.machine.luv_replicator.tooltip": "ɹǝʇsɐԀ ɹǝʇʇɐWㄥ§", - "gtceu.machine.luv_rock_crusher.tooltip": "00ᄅ6-ᴚ ɹǝıɟıpıןoS ɐɯbɐW ɔıuǝboʎɹƆㄥ§", - "gtceu.machine.luv_scanner.tooltip": "ɹoʇɔǝʇǝᗡ ʎןɐɯouⱯㄥ§", - "gtceu.machine.luv_sifter.tooltip": "ƆℲ⟘ ʎq pǝɹosuodSㄥ§", - "gtceu.machine.luv_thermal_centrifuge.tooltip": "ƖϛƐ9-⟘ doɥsʇɐǝʍS ǝzɐןᗺㄥ§", - "gtceu.machine.luv_wiremill.tooltip": "ɹoʇɐbuoןƎ ʇobuIㄥ§", - "gtceu.machine.lv_alloy_smelter.tooltip": "ɹǝʇןǝɯS uoıʇɐuıqɯoɔ ɥɔǝ⟘ɥbıHㄥ§", - "gtceu.machine.lv_arc_furnace.tooltip": "¿ǝɔɐuɹnℲ ʇsɐןᗺ ɐ spǝǝu oɥMㄥ§", - "gtceu.machine.lv_assembler.tooltip": "¡ǝןqɯǝssⱯ 'sɹǝbuǝʌⱯㄥ§", - "gtceu.machine.lv_autoclave.tooltip": "sʇsnᗡ ɹnoʎ buızıןןɐʇsʎɹƆㄥ§", - "gtceu.machine.lv_bender.tooltip": "¡¡¡ᴚƎᗡNƎᗺ ʇuɐʍ ǝM ¡pɐq s,ǝɥ 'ooᗺㄥ§", - "gtceu.machine.lv_brewery.tooltip": "buıʍǝɹq uoıʇod ʇuǝıɔıɟɟǝ puɐ ʇɔɐdɯoƆㄥ§", - "gtceu.machine.lv_canner.tooltip": "sɹǝuıɐʇuoƆ ɟo ʇno puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", - "gtceu.machine.lv_centrifuge.tooltip": "sǝןnɔǝןoW buıʇɐɹɐdǝSㄥ§", - "gtceu.machine.lv_chemical_bath.tooltip": "ɯǝɥʇ ǝʇɐɹɐdǝs oʇ sןɐɔıɯǝɥƆ uı sǝɹO buıɥʇɐᗺㄥ§", - "gtceu.machine.lv_chemical_reactor.tooltip": "ɹǝɥʇo ɥɔɐǝ ɥʇıʍ ʇɔɐǝɹ sןɐɔıɯǝɥƆ buıʇʇǝꞀㄥ§", - "gtceu.machine.lv_circuit_assembler.tooltip": "ǝɔɐןd ǝɥʇ ɹǝʌo ןןɐ ǝɔɐןԀ-u-ʞɔıԀㄥ§", - "gtceu.machine.lv_compressor.tooltip": "ㄥㄥƆ ɔıʇɐW-O-ssǝɹdɯoƆㄥ§", - "gtceu.machine.lv_cutter.tooltip": "ǝɔıᗡ N,ǝɔıןSㄥ§", - "gtceu.machine.lv_distillery.tooltip": "spınןℲ ɟo sʇɹɐԀ ʇuɐʌǝןǝɹ ʇsoɯ buıʇɔɐɹʇxƎㄥ§", - "gtceu.machine.lv_electric_furnace.tooltip": "ㄣ9 ǝɹopoɯɯoƆ ɐ buısn ǝʞıן ʇoNㄥ§", - "gtceu.machine.lv_electrolyzer.tooltip": "sǝןnɔǝןoW buızʎןoɹʇɔǝןƎㄥ§", - "gtceu.machine.lv_electromagnetic_separator.tooltip": "ʇsǝɹ ǝɥʇ ɯoɹɟ sǝɹO ɔıʇǝubɐɯ ǝɥʇ buıʇɐɹɐdǝSㄥ§", - "gtceu.machine.lv_extractor.tooltip": "ƐᄅƖᗡ - ɯooᗡ ɟo ǝɔıʌǝᗡ-ɹǝɔınظǝᗡㄥ§", - "gtceu.machine.lv_extruder.tooltip": "buıʞɹoM ןɐʇǝW ɹoɟ ǝuıɥɔɐW ןɐsɹǝʌıu∩ㄥ§", - "gtceu.machine.lv_fermenter.tooltip": "spınןℲ buıʇuǝɯɹǝℲㄥ§", - "gtceu.machine.lv_fluid_heater.tooltip": "spınןℲ ɹnoʎ dn buıʇɐǝHㄥ§", - "gtceu.machine.lv_fluid_solidifier.tooltip": "spıןoS ɯɹoɟ oʇ uʍop spınןℲ sןooƆㄥ§", - "gtceu.machine.lv_forge_hammer.tooltip": "¡ǝɯıʇɹǝɯɯɐH 'doʇSㄥ§", - "gtceu.machine.lv_forming_press.tooltip": "sbuıɥʇ oʇuı sǝbɐɯI buıʇuıɹdɯIㄥ§", - "gtceu.machine.lv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɹıɐ ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", - "gtceu.machine.lv_laser_engraver.tooltip": "ɹǝsɐꞀ ǝɥʇ ʇɐ ʎןʇɔǝɹıp ʞooן ʇ,uoᗡㄥ§", - "gtceu.machine.lv_lathe.tooltip": "ʎןʇuǝıɔıɟɟǝ ǝɹoɯ spoᴚ sǝɔnpoɹԀㄥ§", - "gtceu.machine.lv_macerator.tooltip": "sʇɔnpoɹdʎᗺ ʇnoɥʇıʍ sǝɹO ɹnoʎ buıppǝɹɥSㄥ§", - "gtceu.machine.lv_mass_fabricator.tooltip": "pǝɹɐnbS uoıʇɐɔıɹqɐℲ * ɹǝʇʇɐW W∩∩ㄥ§", - "gtceu.machine.lv_mixer.tooltip": "¿puǝןᗺ ʇı ןןıMㄥ§", - "gtceu.machine.lv_ore_washer.tooltip": "sǝɹO ɹnoʎ ɯoɹɟ sʇɔnpoɹdʎᗺ ǝɹoɯ buıʇʇǝ⅁ㄥ§", - "gtceu.machine.lv_packer.tooltip": "sǝxoᗺ ɟo ʇno sbuıɥʇ sqɐɹ⅁ puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", - "gtceu.machine.lv_polarizer.tooltip": "sʇǝubɐW ɹnoʎ buısıɹɐןodıᗺㄥ§", - "gtceu.machine.lv_replicator.tooltip": "sʇuǝɯǝןƎ ɟo ʇsǝɹnԀ ǝɥʇ buıɔnpoɹԀㄥ§", - "gtceu.machine.lv_rock_crusher.tooltip": "ʇuǝɔɐظpɐ ʎןןɐʇuozıɹoɥ ɐʌɐꞀ puɐ ɹǝʇɐM ǝɔɐןԀㄥ§", - "gtceu.machine.lv_scanner.tooltip": "sbuıɥʇ ɹǝɥʇo puɐ sןɐıɹǝʇɐW suɐɔSㄥ§", - "gtceu.machine.lv_sifter.tooltip": "buıʇɟıs dǝǝʞ puɐ ɯןɐɔ ʎɐʇSㄥ§", - "gtceu.machine.lv_thermal_centrifuge.tooltip": "ʎןǝsıɔǝɹd ǝɹoɯ sǝɹO buıʇɐɹɐdǝSㄥ§", - "gtceu.machine.lv_wiremill.tooltip": "ʎןʇuǝıɔıɟɟǝ ǝɹoɯ sǝɹıM sǝɔnpoɹԀㄥ§", - "gtceu.machine.machine_hatch.locked": "pǝʞɔoꞀ ǝɔɐɟɹǝʇuI ǝuıɥɔɐW", - "gtceu.machine.machine_hatch.processing_array": "ʎɐɹɹⱯ buıssǝɔoɹԀǝ§ ǝɥʇ uı ʞɹoʍ ʇɐɥʇ sǝuıɥɔɐɯ spןoɥ ʎןuo 'ㄥ§ʎɐɹɹⱯ buıssǝɔoɹԀǝ§ ǝɥʇ uı uǝɥM", - "gtceu.machine.machine_hatch.tooltip": "sɯǝʇı pıןɐʌ spןoɥ ʎןuo ʇɐɥʇ snᗺ ssǝɔɔⱯ pǝzıןɐıɔǝdS", - "gtceu.machine.maintenance_hatch.tooltip": "sʞɔoןqıʇןnW buıuıɐʇuıɐɯ ɹoℲ", - "gtceu.machine.maintenance_hatch_cleanroom_auto.tooltip.0": "¡buıuɐǝןƆ ɥʇıʍ sʞɔoןqıʇןnW buıuıɐʇuıɐɯ ʎןןɐɔıʇɐɯoʇnɐ ɹoℲ", - "gtceu.machine.maintenance_hatch_cleanroom_auto.tooltip.1": ":sɐ suɐǝןƆ", - "gtceu.machine.maintenance_hatch_configurable.tooltip.0": "sʞɔoןqıʇןnW ɹǝʌo ןoɹʇuoɔ ɹǝuıɟ ɹoℲ", - "gtceu.machine.maintenance_hatch_configurable.tooltip.1": "¡sɯǝןqoɹd ǝɔuɐuǝʇuıɐW ou ɥʇıʍ sʇɹɐʇS", - "gtceu.machine.maintenance_hatch_full_auto.tooltip": "sʞɔoןqıʇןnW buıuıɐʇuıɐɯ ʎןןɐɔıʇɐɯoʇnɐ ɹoℲ", - "gtceu.machine.maintenance_hatch_tape_slot.tooltip": "sɯǝןqoɹd ʇuǝʌǝɹd oʇ ǝdɐ⟘ ʇɹǝsuI", - "gtceu.machine.maintenance_hatch_tool_slot.tooltip": "sɯǝןqoɹd ǝʌןos oʇ ʎɹoʇuǝʌuı uı ǝɹɐ sןooʇ pǝɹınbǝɹ uǝɥʍ puɐɥ ʎʇdɯǝ ɥʇıʍ ʇoןs ʞɔıןƆ", - "gtceu.machine.me.copy_paste.tooltip": "ʎןddɐ oʇ ʞɔıןɔ-ʇɥbıɹ 'sbuıʇʇǝs ʎdoɔ oʇ ʞɔıʇS ɐʇɐᗡ ɥʇıʍ ʞɔıןɔ-ʇɥbıɹ ʞɐǝuS", - "gtceu.machine.me.export.tooltip": "˙ʞɹoʍʇǝu ƎW oʇ buıʇɔǝuuoɔ ǝɹoɟǝq ʎʇıɔɐdɐɔ ǝʇıuıɟuı sɐH", - "gtceu.machine.me.fluid_export.tooltip": "˙ʞɹoʍʇǝu ƎW uɐ oʇuı ʎןʇɔǝɹıp spınןɟ sǝɹoʇS", - "gtceu.machine.me.fluid_import.data_stick.name": "ɐʇɐᗡ uoıʇɐɹnbıɟuoƆ ɥɔʇɐH ʇnduI ƎWo§", - "gtceu.machine.me.fluid_import.tooltip": "˙ʎןןɐɔıʇɐɯoʇnɐ ʞɹoʍʇǝu ƎW uɐ ɯoɹɟ spınןɟ sǝɥɔʇǝℲ", - "gtceu.machine.me.import_copy_settings": "ʞɔıʇS ɐʇɐᗡ oʇ sbuıʇʇǝs pǝʌɐS", - "gtceu.machine.me.import_paste_settings": "ʞɔıʇS ɐʇɐᗡ ɯoɹɟ sbuıʇʇǝs pǝıןddⱯ", - "gtceu.machine.me.item_export.tooltip": "˙ʞɹoʍʇǝu ƎW uɐ oʇuı ʎןʇɔǝɹıp sɯǝʇı sǝɹoʇS", - "gtceu.machine.me.item_import.data_stick.name": "ɐʇɐᗡ uoıʇɐɹnbıɟuoƆ snᗺ ʇnduI ƎWo§", - "gtceu.machine.me.item_import.tooltip": "˙ʎןןɐɔıʇɐɯoʇnɐ ʞɹoʍʇǝu ƎW uɐ ɯoɹɟ sɯǝʇı sǝɥɔʇǝℲ", - "gtceu.machine.me.stocking_auto_pull_disabled": "pǝןqɐsıᗡ ןןnԀ-oʇnⱯ", - "gtceu.machine.me.stocking_auto_pull_enabled": "pǝןqɐuƎ ןןnԀ-oʇnⱯ", - "gtceu.machine.me.stocking_fluid.tooltip.0": "ʞɹoʍʇǝu ƎW ǝɥʇ ɯoɹɟ ʎןʇɔǝɹıp spınןɟ sǝʌǝıɹʇǝᴚ", - "gtceu.machine.me.stocking_fluid.tooltip.1": "˙spuoɔǝs ϛ ʎɹǝʌǝ pǝʇɐpdn 'ɯǝʇsʎs ƎW ǝɥʇ uı spınןɟ 9Ɩ ʇsɹıɟ ǝɥʇ ʞɔoʇs ʎןןɐɔıʇɐɯoʇnɐ ןןıʍ ǝpoɯ ƎW ɯoɹɟ ןןnԀ-oʇnⱯ", - "gtceu.machine.me.stocking_item.tooltip.0": "ʞɹoʍʇǝu ƎW ǝɥʇ ɯoɹɟ ʎןʇɔǝɹıp sɯǝʇı sǝʌǝıɹʇǝᴚ", - "gtceu.machine.me.stocking_item.tooltip.1": "˙spuoɔǝs ϛ ʎɹǝʌǝ pǝʇɐpdn 'ɯǝʇsʎs ƎW ǝɥʇ uı sɯǝʇı 9Ɩ ʇsɹıɟ ǝɥʇ ʞɔoʇs ʎןןɐɔıʇɐɯoʇnɐ ןןıʍ ǝpoɯ ƎW ɯoɹɟ ןןnԀ-oʇnⱯ", - "gtceu.machine.me_import_fluid_hatch.configs.tooltip": "ʞɔoʇs uı sǝdʎʇ pınןɟ 9Ɩ sdǝǝʞ", - "gtceu.machine.me_import_item_hatch.configs.tooltip": "ʞɔoʇs uı sǝdʎʇ ɯǝʇı 9Ɩ sdǝǝʞ", - "gtceu.machine.miner.chunkradius": "%d :snıpɐᴚ ʞunɥƆ", - "gtceu.machine.miner.fluid_usage": "˙ʞɔoןɔɹǝʌo ɹǝd pǝןqnop 'ㄥ§%sɟ§ ɟoㄥ§ ʇ/ᗺɯ %dɟ§ sǝs∩", - "gtceu.machine.miner.minex": "%d :Xɯ", - "gtceu.machine.miner.miney": "%d :ʎɯ", - "gtceu.machine.miner.minez": "%d :Zɯ", - "gtceu.machine.miner.multi.description": "˙ǝɹo ɟo ʎʇıʇuɐnb ǝbnɥ sǝɔnpoɹd puɐ ɐǝɹɐ ǝbɹɐן ɐ sɹǝʌoɔ ʇɐɥʇ ǝuıɥɔɐɯ buıuıɯ ʞɔoןqıʇןnɯ Ɐ", - "gtceu.machine.miner.multi.modes": "˙sǝpoW pǝubıןⱯ ʞunɥƆ puɐ ɥɔno⟘ ʞןıS sɐH", - "gtceu.machine.miner.multi.production": "˙ㄥ§ɹoʇɐɹǝɔɐWɟ§ ɐ uɐɥʇ ǝɹo pǝɥsnɹɔ ǝɹoɯ ㄥ§xƐɟ§ sǝɔnpoɹԀ", - "gtceu.machine.miner.per_block": "ʞɔoןᗺ ɹǝdㄥ§ %dsɟ§ sǝʞɐʇㄥ§", - "gtceu.machine.miner.progress": "%d/%d :ssǝɹboɹԀ", - "gtceu.machine.miner.radius": "%d :snıpɐᴚ", - "gtceu.machine.miner.startx": "%d :Xs", - "gtceu.machine.miner.starty": "%d :ʎs", - "gtceu.machine.miner.startz": "%d :Zs", - "gtceu.machine.miner.tooltip": "ɐǝɹɐㄥ§ %sx%sɟ§ sɐ sʇɹɐʇS ¡ɹǝuıW ǝɥʇ ʍoןǝq sǝɹo sǝuıWㄥ§", - "gtceu.machine.muffle.off": "pǝןqɐsıᗡ :buıןɟɟnW punoS", - "gtceu.machine.muffle.on": "pǝןqɐuƎ :buıןɟɟnW punoS", - "gtceu.machine.muffler_hatch.tooltip.0": "sǝuıɥɔɐɯ ɯoɹɟ ǝʇsɐʍ sɹǝʌoɔǝᴚ", - "gtceu.machine.muffler_hatch.tooltip.1": "¡⟘∩Ԁ⟘∩O ƎH⟘ ⟘Ɔ∩ᴚ⟘SᗺO ⟘ON Oᗡ", - "gtceu.machine.multi_furnace.tooltip": "ǝɯoH ʇɐ uǝʌO ǝɥʇ ǝʞıן ʇsnſ", - "gtceu.machine.multiblock.tank.tooltip": "˙sǝʌןɐʌ ʞuɐʇ ɹo ɹǝןןoɹʇuoɔ ǝɥʇ ɥbnoɹɥʇ uıɐɹp puɐ ןןıℲ", - "gtceu.machine.mv_alloy_smelter.tooltip": "ɹǝʇןǝɯS uoıʇɐuıqɯoɔ ɥɔǝ⟘ɥbıHㄥ§", - "gtceu.machine.mv_arc_furnace.tooltip": "¿ǝɔɐuɹnℲ ʇsɐןᗺ ɐ spǝǝu oɥMㄥ§", - "gtceu.machine.mv_assembler.tooltip": "¡ǝןqɯǝssⱯ 'sɹǝbuǝʌⱯㄥ§", - "gtceu.machine.mv_autoclave.tooltip": "sʇsnᗡ ɹnoʎ buızıןןɐʇsʎɹƆㄥ§", - "gtceu.machine.mv_bender.tooltip": "¡¡¡ᴚƎᗡNƎᗺ ʇuɐʍ ǝM ¡pɐq s,ǝɥ 'ooᗺㄥ§", - "gtceu.machine.mv_brewery.tooltip": "buıʍǝɹq uoıʇod ʇuǝıɔıɟɟǝ puɐ ʇɔɐdɯoƆㄥ§", - "gtceu.machine.mv_canner.tooltip": "sɹǝuıɐʇuoƆ ɟo ʇno puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", - "gtceu.machine.mv_centrifuge.tooltip": "sǝןnɔǝןoW buıʇɐɹɐdǝSㄥ§", - "gtceu.machine.mv_chemical_bath.tooltip": "ɯǝɥʇ ǝʇɐɹɐdǝs oʇ sןɐɔıɯǝɥƆ uı sǝɹO buıɥʇɐᗺㄥ§", - "gtceu.machine.mv_chemical_reactor.tooltip": "ɹǝɥʇo ɥɔɐǝ ɥʇıʍ ʇɔɐǝɹ sןɐɔıɯǝɥƆ buıʇʇǝꞀㄥ§", - "gtceu.machine.mv_circuit_assembler.tooltip": "ǝɔɐןd ǝɥʇ ɹǝʌo ןןɐ ǝɔɐןԀ-u-ʞɔıԀㄥ§", - "gtceu.machine.mv_compressor.tooltip": "ㄥㄥƆ ɔıʇɐW-O-ssǝɹdɯoƆㄥ§", - "gtceu.machine.mv_cutter.tooltip": "ǝɔıᗡ N,ǝɔıןSㄥ§", - "gtceu.machine.mv_distillery.tooltip": "spınןℲ ɟo sʇɹɐԀ ʇuɐʌǝןǝɹ ʇsoɯ buıʇɔɐɹʇxƎㄥ§", - "gtceu.machine.mv_electric_furnace.tooltip": "ㄣ9 ǝɹopoɯɯoƆ ɐ buısn ǝʞıן ʇoNㄥ§", - "gtceu.machine.mv_electrolyzer.tooltip": "sǝןnɔǝןoW buızʎןoɹʇɔǝןƎㄥ§", - "gtceu.machine.mv_electromagnetic_separator.tooltip": "ʇsǝɹ ǝɥʇ ɯoɹɟ sǝɹO ɔıʇǝubɐɯ ǝɥʇ buıʇɐɹɐdǝSㄥ§", - "gtceu.machine.mv_extractor.tooltip": "ƐᄅƖᗡ - ɯooᗡ ɟo ǝɔıʌǝᗡ-ɹǝɔınظǝᗡㄥ§", - "gtceu.machine.mv_extruder.tooltip": "buıʞɹoM ןɐʇǝW ɹoɟ ǝuıɥɔɐW ןɐsɹǝʌıu∩ㄥ§", - "gtceu.machine.mv_fermenter.tooltip": "spınןℲ buıʇuǝɯɹǝℲㄥ§", - "gtceu.machine.mv_fluid_drilling_rig.tooltip": "dɯnԀ uoıʇɔɐɹʇxƎ ןıO", - "gtceu.machine.mv_fluid_heater.tooltip": "spınןℲ ɹnoʎ dn buıʇɐǝHㄥ§", - "gtceu.machine.mv_fluid_solidifier.tooltip": "spıןoS ɯɹoɟ oʇ uʍop spınןℲ sןooƆㄥ§", - "gtceu.machine.mv_forge_hammer.tooltip": "¡ǝɯıʇɹǝɯɯɐH 'doʇSㄥ§", - "gtceu.machine.mv_forming_press.tooltip": "sbuıɥʇ oʇuı sǝbɐɯI buıʇuıɹdɯIㄥ§", - "gtceu.machine.mv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɹıɐ ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", - "gtceu.machine.mv_laser_engraver.tooltip": "ɹǝsɐꞀ ǝɥʇ ʇɐ ʎןʇɔǝɹıp ʞooן ʇ,uoᗡㄥ§", - "gtceu.machine.mv_lathe.tooltip": "ʎןʇuǝıɔıɟɟǝ ǝɹoɯ spoᴚ sǝɔnpoɹԀㄥ§", - "gtceu.machine.mv_macerator.tooltip": "sʇɔnpoɹdʎᗺ ʇnoɥʇıʍ sǝɹO ɹnoʎ buıppǝɹɥSㄥ§", - "gtceu.machine.mv_mass_fabricator.tooltip": "pǝɹɐnbS uoıʇɐɔıɹqɐℲ * ɹǝʇʇɐW W∩∩ㄥ§", - "gtceu.machine.mv_mixer.tooltip": "¿puǝןᗺ ʇı ןןıMㄥ§", - "gtceu.machine.mv_ore_washer.tooltip": "sǝɹO ɹnoʎ ɯoɹɟ sʇɔnpoɹdʎᗺ ǝɹoɯ buıʇʇǝ⅁ㄥ§", - "gtceu.machine.mv_packer.tooltip": "sǝxoᗺ ɟo ʇno sbuıɥʇ sqɐɹ⅁ puɐ oʇuı sbuıɥʇ sʇnԀㄥ§", - "gtceu.machine.mv_polarizer.tooltip": "sʇǝubɐW ɹnoʎ buısıɹɐןodıᗺㄥ§", - "gtceu.machine.mv_replicator.tooltip": "sʇuǝɯǝןƎ ɟo ʇsǝɹnԀ ǝɥʇ buıɔnpoɹԀㄥ§", - "gtceu.machine.mv_rock_crusher.tooltip": "ʇuǝɔɐظpɐ ʎןןɐʇuozıɹoɥ ɐʌɐꞀ puɐ ɹǝʇɐM ǝɔɐןԀㄥ§", - "gtceu.machine.mv_scanner.tooltip": "sbuıɥʇ ɹǝɥʇo puɐ sןɐıɹǝʇɐW suɐɔSㄥ§", - "gtceu.machine.mv_sifter.tooltip": "buıʇɟıs dǝǝʞ puɐ ɯןɐɔ ʎɐʇSㄥ§", - "gtceu.machine.mv_thermal_centrifuge.tooltip": "ʎןǝsıɔǝɹd ǝɹoɯ sǝɹO buıʇɐɹɐdǝSㄥ§", - "gtceu.machine.mv_wiremill.tooltip": "ʎןʇuǝıɔıɟɟǝ ǝɹoɯ sǝɹıM sǝɔnpoɹԀㄥ§", - "gtceu.machine.network_switch.tooltip.0": "qnH ʇǝuɹǝɥʇƎ", - "gtceu.machine.network_switch.tooltip.1": "˙ㄥ§uoıʇɐʇndɯoƆɟ§ ǝʇnqıɹʇsıp puɐ ǝʇnoɹ oʇ pǝs∩", - "gtceu.machine.network_switch.tooltip.2": "˙ㄥ§sɹǝʇʇıɯsuɐɹ⟘ɟ§ uoıʇɐʇndɯoƆ ɟo ɹǝqɯnu ʎuɐ oʇuı ㄥ§sɹǝʌıǝɔǝᴚɟ§ uoıʇɐʇndɯoƆ ɟo ɹǝqɯnu ʎuɐ ǝuıqɯoɔ uɐƆ", - "gtceu.machine.network_switch.tooltip.3": "˙ɥɔʇɐH ɐʇɐᗡ uoıʇɐʇndɯoƆ ɹǝd ㄥ§ʇ/∩Ǝ %sɟ§ sǝs∩", - "gtceu.machine.object_holder.tooltip": "uoıʇɐʇS ɥɔɹɐǝsǝᴚ ɹoɟ ɯsıuɐɥɔǝW buıpןoH pǝɔuɐʌpⱯ", - "gtceu.machine.opv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ǝsɹǝʌıun ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", - "gtceu.machine.opv_rock_crusher.tooltip": "ɹǝqɯɐɥƆ uoıʇɐɯɹoℲ ɔıuɐɔןoΛㄥ§", - "gtceu.machine.parallel_hatch.display": "ʞɔoןqıʇןnɯ ǝɥʇ ɟo ןǝןןɐɹɐd ɯnɯıxɐɯ ǝɥʇ ʇsnظpⱯ", - "gtceu.machine.parallel_hatch_mk5.tooltip": "˙ןǝןןɐɹɐd uı sǝdıɔǝɹ ㄣ oʇ dn unɹ oʇ sʍoןןⱯ", - "gtceu.machine.parallel_hatch_mk6.tooltip": "˙ןǝןןɐɹɐd uı sǝdıɔǝɹ 9Ɩ oʇ dn unɹ oʇ sʍoןןⱯ", - "gtceu.machine.parallel_hatch_mk7.tooltip": "˙ןǝןןɐɹɐd uı sǝdıɔǝɹ ㄣ9 oʇ dn unɹ oʇ sʍoןןⱯ", - "gtceu.machine.parallel_hatch_mk8.tooltip": "˙ןǝןןɐɹɐd uı sǝdıɔǝɹ 9ϛᄅ oʇ dn unɹ oʇ sʍoןןⱯ", - "gtceu.machine.parallel_limit": "˙ǝɔuo ʇɐ sǝdıɔǝᴚ ㄥ§ɹ§%dq§ oʇ dn unɹ uɐƆ", - "gtceu.machine.passthrough_hatch_fluid.tooltip": "ɹǝɥʇo ǝɥʇ oʇ ǝpıS ǝuo ɯoɹɟ spınןℲ spuǝS", - "gtceu.machine.passthrough_hatch_item.tooltip": "ɹǝɥʇo ǝɥʇ oʇ ǝpıS ǝuo ɯoɹɟ sɯǝʇI spuǝS", - "gtceu.machine.perfect_oc": "˙pǝʞɔoןɔɹǝʌo uǝɥʍ ʎɔuǝıɔıɟɟǝ ʎbɹǝuǝ ǝsoן ʇou sǝoᗡ", - "gtceu.machine.power_substation.tooltip.0": "pıɹb ɹǝʍod pǝzıןɐɹʇuǝɔ ɐ ɟo ʇɹɐǝɥ ǝɥ⟘", - "gtceu.machine.power_substation.tooltip.1": "˙ɹǝıʇ ǝɯɐs ǝɥʇ ןןɐ ǝq oʇ pǝǝu ʇou op ㄥ§sɹoʇıɔɐdɐƆɟ§", - "gtceu.machine.power_substation.tooltip.2": "˙ㄥ§sɹǝʎɐꞀ ɹoʇıɔɐdɐƆ %dɟ§ oʇ dn sʍoןןⱯ", - "gtceu.machine.power_substation.tooltip.3": "˙ㄥ§sɹnoɥ ㄣᄅɟ§ ʎɹǝʌǝ ʎʇıɔɐdɐɔ ןɐʇoʇ ɟo ㄥ§%%Ɩɟ§ oʇ ןɐnbǝ ʎbɹǝuǝ sǝsoꞀ", - "gtceu.machine.power_substation.tooltip.4": "˙ʞɔoןᗺ ɹoʇıɔɐdɐƆ ɹǝd ssoן ǝʌıssɐd ㄥ§ʇ/∩Ǝʞ %dɟ§ ʇɐ pǝddɐƆ", - "gtceu.machine.power_substation.tooltip.5": "ǝsn uɐƆ", - "gtceu.machine.power_substation.tooltip.6": "˙ㄥ§sǝɥɔʇɐH ɹǝsɐꞀ ", - "gtceu.machine.primitive_blast_furnace.bronze.tooltip": "ןǝǝʇS ʇsɹıɟ ɹnoʎ buıʞɐW", - "gtceu.machine.primitive_water_pump.tooltip": "ǝɯoH ʇɐ ɹıoʌɹǝpuƎ", - "gtceu.machine.processing_array.tooltip": "ʇı ʇnɔ ʇ,usǝop ʇsnظ sǝuıɥɔɐW ʍǝɟ ɐ uǝɥM", - "gtceu.machine.pump.tooltip": "¡suɐǝɔO ʎʇdɯǝ oʇ ʎɐʍ ʇsǝq ǝɥ⟘ㄥ§", - "gtceu.machine.pump.tooltip_buckets": "ʇǝʞɔnᗺ ɹǝd sʞɔıʇㄥ§ %dɟ§", - "gtceu.machine.pump_hatch.tooltip": "dɯnԀ ɹǝʇɐM ɹoɟ ʇndʇnO pınןℲ ǝʌıʇıɯıɹԀ", - "gtceu.machine.pyrolyse_oven.tooltip": "uǝʌO ǝʞoƆ ɔıɹʇɔǝןƎ", - "gtceu.machine.pyrolyse_oven.tooltip.1": "˙ㄥ§%%0ϛɟ§ ʎq pǝǝds sǝsɐǝɹɔuı ㄥ§ןɐɥʇuɐʞq§ ɹǝʇɟɐ ןıoɔ ʎɹǝʌƎ ˙ɹǝʍoןs ㄥ§%%ϛᄅɟ§ ǝɹɐ sןıoɔㄥ§ ןǝʞɔıuoɹdnƆ9§", - "gtceu.machine.quantum_chest.items_stored": ":ʇunoɯⱯ ɯǝʇI", - "gtceu.machine.quantum_chest.tooltip": "sɹǝʍɐɹᗡ ǝbɐɹoʇS uɐɥʇ ɹǝʇʇǝᗺㄥ§", - "gtceu.machine.quantum_tank.tooltip": "spınןɟ ɹnoʎ ןןɐ ǝɹoʇs oʇ ǝɔɐןd ʇɔɐdɯoƆㄥ§", - "gtceu.machine.research_station.researching": "˙buıɥɔɹɐǝsǝᴚ", - "gtceu.machine.research_station.tooltip.0": "ɹǝuuɐɔS ʞɔoןqıʇןnW ɐ ʇsnظ uɐɥʇ ǝɹoW", - "gtceu.machine.research_station.tooltip.1": "˙ㄥ§sǝןnpoW ɐʇɐᗡɟ§ puɐ ㄥ§sqɹO ɐʇɐᗡɟ§ oʇuo uɐɔs oʇ pǝs∩", - "gtceu.machine.research_station.tooltip.2": "˙ʞɹoʍ oʇ ㄥ§uoıʇɐʇndɯoƆɟ§ sǝɹınbǝᴚ", - "gtceu.machine.research_station.tooltip.3": "˙ɹǝʇsɐɟ unɹ oʇ ǝdıɔǝɹ ǝɥʇ sʍoןןɐ uoıʇɐʇndɯoƆ ǝɹoɯ buıpıʌoɹԀ", - "gtceu.machine.rotor_holder.tooltip.0": "sʞɔoןqıʇןnW ɹoɟ ɹǝpןoH ɹoʇoᴚ", - "gtceu.machine.rotor_holder.tooltip.1": "ʎɐʍɐ ʎןɟ ʇou ןןıʍ ʇı os ǝɔɐןd uı ɹoʇoᴚ spןoH", - "gtceu.machine.steam.steam_hatch.tooltip": "ɯɐǝʇSɟ§ :pınןℲ pǝʇdǝɔɔⱯǝ§", - "gtceu.machine.steam_boiler.heat_amount": "%% %s :ʎʇıɔɐdɐƆ ʇɐǝH", - "gtceu.machine.steam_bus.tooltip": "sʞɔoןqıʇןnɯ ɯɐǝʇs-uou ɥʇıʍ ʞɹoʍ ʇou sǝoᗡ", - "gtceu.machine.steam_grinder.tooltip": "sʇɔnpoɹdʎᗺ ǝɥʇ ʇnoɥʇıʍ ɹoʇɐɹǝɔɐW ʞɔoןqıʇןnɯ Ɐ", - "gtceu.machine.steam_miner.tooltip": "¡ɹǝuıW ǝɥʇ ʍoןǝq sǝɹo sǝuıWㄥ§", - "gtceu.machine.steam_oven.tooltip": "ɹǝʇןǝɯS-ıʇןnW ɥʇıʍ pǝsnɟuoɔ ǝq oʇ ʇoN", - "gtceu.machine.steam_turbine.tooltip": "∩Ǝ oʇuı ɯɐǝʇS sʇɹǝʌuoƆㄥ§", - "gtceu.machine.substation_hatch.input.tooltip": "uoıʇɐʇsqnS ɹǝʍoԀ ǝɥʇ ɹoɟ ʇnduI ʎbɹǝuƎ", - "gtceu.machine.substation_hatch.output.tooltip": "uoıʇɐʇsqnS ɹǝʍoԀ ǝɥʇ ɹoɟ ʇndʇnO ʎbɹǝuƎ", - "gtceu.machine.tank_valve.tooltip": "˙uʍop buıɔɐɟ uǝɥʍ sʇndʇno oʇnⱯ ˙sʞuɐʇ ʞɔoןqıʇןnɯ uıɐɹp puɐ ןןıɟ oʇ ǝs∩", - "gtceu.machine.transformer.description": "sɹǝıʇ ǝbɐʇןoʌ uǝǝʍʇǝq ʎbɹǝuƎ sɯɹoɟsuɐɹ⟘ㄥ§", - "gtceu.machine.transformer.message_transform_down": "Ɐ%d ∩Ǝ %s :ʇnO 'Ɐ%d ∩Ǝ %s :uI 'uʍoᗡ buıɯɹoɟsuɐɹ⟘", - "gtceu.machine.transformer.message_transform_up": "Ɐ%d ∩Ǝ %s :ʇnO 'Ɐ%d ∩Ǝ %s :uI 'd∩ buıɯɹoɟsuɐɹ⟘", - "gtceu.machine.transformer.tooltip_tool_usage": "ǝbuɐɥɔ oʇ ɹǝʌıɹpʍǝɹɔS ǝsn 'ㄥ§uʍoᗡ ɯɹoɟsuɐɹ⟘ɟ§ sɐ sʇɹɐʇS", - "gtceu.machine.transformer.tooltip_transform_down": ")ɟ§%s( ∩Ǝ %s Ɐ%d >- )ɟ§%s( ∩Ǝ %s Ɐ%dɟ§ :uʍoᗡ ɯɹoɟsuɐɹ⟘ɐ§", - "gtceu.machine.transformer.tooltip_transform_up": ")ɟ§%s( ∩Ǝ %s Ɐ%d >- )ɟ§%s( ∩Ǝ %s Ɐ%dɟ§ :d∩ ɯɹoɟsuɐɹ⟘ɔ§", - "gtceu.machine.uev_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɯǝʇsʎs ɹɐןos ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", - "gtceu.machine.uev_rock_crusher.tooltip": "ɹǝqɯɐɥƆ uoıʇɐɯɹoℲ ɔıuɐɔןoΛㄥ§", - "gtceu.machine.uhv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɯǝʇsʎs ɹɐןos ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", - "gtceu.machine.uhv_rock_crusher.tooltip": "ɹǝqɯɐɥƆ uoıʇɐɯɹoℲ ɔıuɐɔןoΛㄥ§", - "gtceu.machine.uiv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɯǝʇsʎs ɹɐןos ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", - "gtceu.machine.uiv_rock_crusher.tooltip": "ɹǝqɯɐɥƆ uoıʇɐɯɹoℲ ɔıuɐɔןoΛㄥ§", - "gtceu.machine.uv_alloy_smelter.tooltip": "ɹoʇɐɯɐbןɐɯⱯ ןɐʇǝWㄥ§", - "gtceu.machine.uv_arc_furnace.tooltip": "ɹǝʇɐǝH ʇınɔɹıƆ ʇɹoɥSㄥ§", - "gtceu.machine.uv_assembler.tooltip": "ɹoʇɔnɹʇsuoƆ ʎןqɯǝssⱯㄥ§", - "gtceu.machine.uv_autoclave.tooltip": "ʇıu∩ ǝɔuɐɹqɯnɔuƎㄥ§", - "gtceu.machine.uv_bender.tooltip": "ɹǝɯɹoɟǝᗡ ɹǝʇʇɐWㄥ§", - "gtceu.machine.uv_brewery.tooltip": "ɹǝɥsnᴚ ʍǝɹᗺㄥ§", - "gtceu.machine.uv_canner.tooltip": "ɹoʇɐnʇɔⱯ uɐƆㄥ§", - "gtceu.machine.uv_centrifuge.tooltip": "opɐuɹo⟘ ɹɐןnɔǝןoWㄥ§", - "gtceu.machine.uv_chemical_bath.tooltip": "uoɹʇʞunᗡ ןɐɔıɯǝɥƆㄥ§", - "gtceu.machine.uv_chemical_reactor.tooltip": "ɹǝzʎןɐʇɐƆ uoıʇɔɐǝᴚㄥ§", - "gtceu.machine.uv_circuit_assembler.tooltip": "ʎɹoʇɔɐℲ uoıʇɐʇndɯoƆㄥ§", - "gtceu.machine.uv_compressor.tooltip": "ɹoʇɔıɹʇsuoƆ ɹǝʇʇɐWㄥ§", - "gtceu.machine.uv_cutter.tooltip": "ɹǝpıʌıᗡ ʇɔǝظqOㄥ§", - "gtceu.machine.uv_distillery.tooltip": "ɹǝʇʇıןdS uoıʇɔɐɹℲㄥ§", - "gtceu.machine.uv_electric_furnace.tooltip": "ɹoʇɐןnɯıʇS ɯoʇⱯㄥ§", - "gtceu.machine.uv_electrolyzer.tooltip": "ɹǝzıuoI ɔıɯoʇⱯㄥ§", - "gtceu.machine.uv_electromagnetic_separator.tooltip": "ɹǝןןǝdsıᗡ ℲWƎㄥ§", - "gtceu.machine.uv_extractor.tooltip": "ɹǝʞɔnS buıʎɟǝnbıꞀㄥ§", - "gtceu.machine.uv_extruder.tooltip": "ɹǝʌıɹᗡ ǝdɐɥSㄥ§", - "gtceu.machine.uv_fermenter.tooltip": "ɹǝןןoɹʇuoƆ uoıʇɐɹıdsǝᴚㄥ§", - "gtceu.machine.uv_fluid_heater.tooltip": "ɹǝnqɯI ןɐɯɹǝɥ⟘ㄥ§", - "gtceu.machine.uv_fluid_solidifier.tooltip": "ɹoʇɐɔıɟıɹʇǝԀ pınןℲㄥ§", - "gtceu.machine.uv_forge_hammer.tooltip": "ɹoʇɐןnpoW ʇɔɐdɯIㄥ§", - "gtceu.machine.uv_forming_press.tooltip": "ɹǝʇɟıɥS ǝɔɐɟɹnSㄥ§", - "gtceu.machine.uv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɯǝʇsʎs ɹɐןos ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", - "gtceu.machine.uv_laser_engraver.tooltip": "uouuɐƆ uoʇoɥԀ ʇɔɐxƎㄥ§", - "gtceu.machine.uv_lathe.tooltip": "ɹǝpuıɹ⅁ uoıʇɐʇoᴚㄥ§", - "gtceu.machine.uv_macerator.tooltip": "ɹoʇɐuıɯıןƎ ǝdɐɥSㄥ§", - "gtceu.machine.uv_mass_fabricator.tooltip": "ɹoʇɐıʇıuI ǝɔuǝʇsıxƎㄥ§", - "gtceu.machine.uv_mixer.tooltip": "ɹǝzıuǝboɯoH ןɐıɹǝʇɐWㄥ§", - "gtceu.machine.uv_ore_washer.tooltip": "ɥsɐM ɹɐƆ ǝɹnʇɐıuıWㄥ§", - "gtceu.machine.uv_packer.tooltip": "ǝsnoɥǝɹɐM uozɐɯⱯㄥ§", - "gtceu.machine.uv_polarizer.tooltip": "ɹǝbuɐɹɹɐǝᴚ pןǝıℲ ɔıʇǝubɐWㄥ§", - "gtceu.machine.uv_replicator.tooltip": "ɹǝsodɯoƆ ןɐʇuǝɯǝןƎㄥ§", - "gtceu.machine.uv_rock_crusher.tooltip": "ɹǝqɯɐɥƆ uoıʇɐɯɹoℲ ɔıuɐɔןoΛㄥ§", - "gtceu.machine.uv_scanner.tooltip": "ǝdoɔsoɹɔıW uoɹʇɔǝןƎㄥ§", - "gtceu.machine.uv_sifter.tooltip": "ɹǝʇןıℲ uoıʇɐsןnԀㄥ§", - "gtceu.machine.uv_thermal_centrifuge.tooltip": "ǝuoןɔʎƆ ǝɹıℲㄥ§", - "gtceu.machine.uv_wiremill.tooltip": "ɹoʇɐɹnbıɟsuɐɹ⟘ ǝɹıMㄥ§", - "gtceu.machine.uxv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ɯǝʇsʎs ɹɐןos ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", - "gtceu.machine.uxv_rock_crusher.tooltip": "ɹǝqɯɐɥƆ uoıʇɐɯɹoℲ ɔıuɐɔןoΛㄥ§", - "gtceu.machine.vacuum_freezer.tooltip": "xoᗺ ǝɔI ɯnıuıɯnןⱯ", - "gtceu.machine.workbench.storage_note.0": "pǝʇɔǝuuoɔ ɯoɹɟ sɯǝʇı ǝןqɐןıɐʌⱯ(", - "gtceu.machine.workbench.storage_note.1": ")buıʇɟɐɹɔ ɹoɟ ǝןqɐsn sǝıɹoʇuǝʌuı", - "gtceu.machine.workbench.tab.container": "ɹǝuıɐʇuoƆ", - "gtceu.machine.workbench.tab.crafting": "buıʇɟɐɹƆ", - "gtceu.machine.workbench.tab.item_list": "ǝbɐɹoʇS", - "gtceu.machine.workbench.tab.workbench": "buıʇɟɐɹƆ", - "gtceu.machine.workbench.tooltip.0": "ʎɹʇsǝɹoℲ uɐɥʇ ɹǝʇʇǝᗺ", - "gtceu.machine.workbench.tooltip.1": "˙sǝdıɔǝᴚ sǝʌɐs puɐ 'sǝıɹoʇuǝʌuI ʇuǝɔɐظpɐ ɯoɹɟ sןןnd 'ǝbɐɹoʇS ןoo⟘ 'ǝbɐɹoʇS ɯǝʇI sɐH", - "gtceu.machine.world_accelerator.description": "˙ǝpoɯ ǝbuɐɥɔ oʇ ɹǝʌıɹpʍǝɹɔS ǝs∩ ˙ㄥ§ʞɔı⟘ ɯopuɐᴚɟ§ ɹo ㄥ§ʎʇıʇuƎ ǝןı⟘ɟ§ :sǝpoɯ ᄅ ɟo ǝuo uı sʞɔoןq ʎqɹɐǝu sǝʇɐɹǝןǝɔɔɐ ʞɔı⟘", - "gtceu.machine.world_accelerator.mode_entity": "ǝpoW ʞɔı⟘ ɯopuɐᴚ", - "gtceu.machine.world_accelerator.mode_tile": "ǝpoW ʎʇıʇuƎ ʞɔoןᗺ", - "gtceu.machine.world_accelerator.working_area": ":ɐǝɹⱯ buıʞɹoMq§", - "gtceu.machine.world_accelerator.working_area_random": "%dx%d ɟ§:ǝpoW ʞɔı⟘ ɯopuɐᴚ ", - "gtceu.machine.world_accelerator.working_area_tile": "sʞɔoןᗺ ʇuǝɔɐظpⱯ ɟ§:ǝpoW ʎʇıʇuƎ ʞɔoןᗺ ", - "gtceu.machine.zpm_alloy_smelter.tooltip": "ɹoʇɐɹbǝʇuI ʎoןןⱯㄥ§", - "gtceu.machine.zpm_arc_furnace.tooltip": "ɹǝʇɐǝH ǝbɹɐɥɔsıᗡㄥ§", - "gtceu.machine.zpm_assembler.tooltip": "ǝןqɐ⟘ buıʇɟɐɹƆ ɐ ⟘ONㄥ§", - "gtceu.machine.zpm_autoclave.tooltip": "ɹǝʞooƆ ǝɹnssǝɹԀㄥ§", - "gtceu.machine.zpm_bender.tooltip": "ɹǝʇɹoʇsıᗡ ǝdɐɥSㄥ§", - "gtceu.machine.zpm_brewery.tooltip": "sʞuıɹᗡ ɹnoʎ buıʍǝɹᗺㄥ§", - "gtceu.machine.zpm_canner.tooltip": "ɹoʇɐɹǝdO uɐƆㄥ§", - "gtceu.machine.zpm_centrifuge.tooltip": "ǝuoןɔʎƆ ɹɐןnɔǝןoWㄥ§", - "gtceu.machine.zpm_chemical_bath.tooltip": "ɹǝʞɐoS ןɐɔıɯǝɥƆㄥ§", - "gtceu.machine.zpm_chemical_reactor.tooltip": "ɹǝɯɹoɟɹǝԀ ןɐɔıɯǝɥƆㄥ§", - "gtceu.machine.zpm_circuit_assembler.tooltip": "ɹǝɹnʇɔɐɟnuɐW sɔıuoɹʇɔǝןƎㄥ§", - "gtceu.machine.zpm_compressor.tooltip": "ɹǝsuǝpuoƆ ʎʇıɹɐןnbuıSㄥ§", - "gtceu.machine.zpm_cutter.tooltip": "ɹǝʌɐǝןƆ ɹǝʇʇɐWㄥ§", - "gtceu.machine.zpm_distillery.tooltip": "ɹoʇɐɹɐdǝS uoıʇɐsuǝpuoƆㄥ§", - "gtceu.machine.zpm_electric_furnace.tooltip": "ɹossǝɔoɹԀ ʇuǝɯǝʇıɔxƎ uoɹʇɔǝןƎㄥ§", - "gtceu.machine.zpm_electrolyzer.tooltip": "806ㄣ-Ǝ ɹoʇɐɹbǝʇuısıᗡ ɹɐןnɔǝןoWㄥ§", - "gtceu.machine.zpm_electromagnetic_separator.tooltip": "ɹǝzıɹobǝʇɐƆ WƎㄥ§", - "gtceu.machine.zpm_extractor.tooltip": "ɹoʇɐuıʇɔɐɹʇxƎ ɯnnɔɐΛㄥ§", - "gtceu.machine.zpm_extruder.tooltip": "ɹǝɔɐןdsıᗡ ןɐıɹǝʇɐWㄥ§", - "gtceu.machine.zpm_fermenter.tooltip": "ɹǝuǝʇsɐH uoıʇɐʇuǝɯɹǝℲㄥ§", - "gtceu.machine.zpm_fluid_heater.tooltip": "ɹǝsnɟuI ʇɐǝHㄥ§", - "gtceu.machine.zpm_fluid_solidifier.tooltip": "ǝuıɥɔɐW ǝɔI uɐ ʇoNㄥ§", - "gtceu.machine.zpm_forge_hammer.tooltip": "ɹǝbɹoℲ ǝʇɐןԀㄥ§", - "gtceu.machine.zpm_forming_press.tooltip": "ɹǝɹǝʎɐꞀ ʇɔǝظqOㄥ§", - "gtceu.machine.zpm_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ǝɹǝɥdsoɯʇɐ ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", - "gtceu.machine.zpm_laser_engraver.tooltip": "MW ㄣ9˙ᄅƐ ɟo ɹǝʍoԀ ǝɥʇ ɥʇıMㄥ§", - "gtceu.machine.zpm_lathe.tooltip": "806ϛ-Ꞁ ɔıʇɐW-O-uɹn⟘ㄥ§", - "gtceu.machine.zpm_macerator.tooltip": "Ɛ006 ɔıʇɐW-O-puǝןᗺㄥ§", - "gtceu.machine.zpm_mass_fabricator.tooltip": "ʎɹoʇɔɐℲ sısǝuǝ⅁ㄥ§", - "gtceu.machine.zpm_mixer.tooltip": "ɹǝzıuɐbɹO ɹǝʇʇɐWㄥ§", - "gtceu.machine.zpm_ore_washer.tooltip": "ᄅ9Ɛ-I ɹǝɥsɐM-ʎɹpunɐꞀ pǝsodɹndǝᴚㄥ§", - "gtceu.machine.zpm_packer.tooltip": "ɹoʇɐuıxoᗺㄥ§", - "gtceu.machine.zpm_polarizer.tooltip": "ɹǝɔnpuI ɯsıʇǝubɐWㄥ§", - "gtceu.machine.zpm_replicator.tooltip": "ɹǝʇsɐԀ ɹǝʇʇɐWㄥ§", - "gtceu.machine.zpm_rock_crusher.tooltip": "00ᄅ0Ɩ-ᴚ ɹǝıɟıpıןoS ɐɯbɐW ɔıuǝboʎɹƆㄥ§", - "gtceu.machine.zpm_scanner.tooltip": "ɹoʇɔǝʇǝᗡ ʎןɐɯouⱯㄥ§", - "gtceu.machine.zpm_sifter.tooltip": "ƆℲ⟘ ʎq pǝɹosuodSㄥ§", - "gtceu.machine.zpm_thermal_centrifuge.tooltip": "ᄅϛƐ9-⟘ doɥsʇɐǝʍS ǝzɐןᗺㄥ§", - "gtceu.machine.zpm_wiremill.tooltip": "ɹoʇɐbuoןƎ ʇobuIㄥ§", - "gtceu.maintenance.configurable_duration": "xɟ% :uoıʇɐɹnᗡ", - "gtceu.maintenance.configurable_duration.changed_description": "˙buıʞɔoןɔɹǝʌo ǝɹoɟǝq pǝıןddɐ 'uoıʇɐɹnp xɟ% ɥʇıʍ unɹ ןןıʍ sǝdıɔǝᴚ", - "gtceu.maintenance.configurable_duration.modify": ":uoıʇɐɹnᗡ ʎɟıpoW", - "gtceu.maintenance.configurable_duration.unchanged_description": "˙ǝʇɐpdn oʇ uoıʇɐɹnbıɟuoɔ ǝbuɐɥƆ ˙pǝǝds ןɐɯɹou ʇɐ unɹ ןןıʍ sǝdıɔǝᴚ", - "gtceu.maintenance.configurable_time": "xɟ% :ǝɯı⟘", - "gtceu.maintenance.configurable_time.changed_description": "˙ǝʇɐɹ ןɐɯɹou ǝɥʇ xɟ% ʇɐ ɹnɔɔo ןןıʍ sɯǝןqoɹd ǝɔuɐuǝʇuıɐW", - "gtceu.maintenance.configurable_time.unchanged_description": "˙ǝʇɐpdn oʇ uoıʇɐɹnbıɟuoɔ ǝbuɐɥƆ ˙ǝʇɐɹ ןɐɯɹou ʇɐ ɹnɔɔo ןןıʍ sɯǝןqoɹd ǝɔuɐuǝʇuıɐW", - "gtceu.minimap.ore_vein.depleted": "pǝʇǝןdǝᗡ", - "gtceu.mixer": "ɹǝxıW", - "gtceu.mode.both": "ɹ§)ɯǝʇI puⱯ pınןℲ( ɥʇoᗺp§", - "gtceu.mode.fluid": "ɹ§pınןℲ6§", - "gtceu.mode.item": "ɹ§ɯǝʇI9§", - "gtceu.muffler.recovery_tooltip": "%d%%ɟ§ :ǝɔuɐɥƆ ʎɹǝʌoɔǝᴚq§", - "gtceu.multiblock.active_transformer.average_in": "ʇ/∩Ǝ %sɟ§ :ʇnduI ˙bʌⱯq§", - "gtceu.multiblock.active_transformer.average_out": "ʇ/∩Ǝ %sɟ§ :ʇndʇnO ˙bʌⱯq§", - "gtceu.multiblock.active_transformer.danger_enabled": "ǝʌısoןdxƎ :ᴚƎ⅁NⱯᗡq§ɔ§", - "gtceu.multiblock.active_transformer.max_input": "ʇ/∩Ǝ %sɟ§ :ʇnduI xɐWɐ§", - "gtceu.multiblock.active_transformer.max_output": "ʇ/∩Ǝ %sɟ§ :ʇndʇnO xɐWɔ§", - "gtceu.multiblock.assembly_line.description": "˙sʇuǝuodɯoɔ buıʇɟɐɹɔ pǝɔuɐʌpɐ buıʇɐǝɹɔ ɹoɟ pǝsn 'ǝuıɥɔɐW buıןqɯǝssⱯ ǝbɹɐן s,ʇı 'ʎɹoǝɥʇ uI ˙\"sǝɔıןs\" 9Ɩ oʇ ϛ ɟo buıʇsısuoɔ ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ǝbɹɐן ɐ sı ǝuıꞀ ʎןqɯǝssⱯ ǝɥ⟘", - "gtceu.multiblock.batch_enabled": "buıɥɔʇɐᗺ ɯoɹɟ x%d -", - "gtceu.multiblock.blast_furnace.max_temperature": "%s :ʎʇıɔɐdɐƆ ʇɐǝH", - "gtceu.multiblock.central_monitor.height": ":ʇɥbıǝH uǝǝɹɔS", - "gtceu.multiblock.central_monitor.height_modify": "%d :ʇɥbıǝH ʎɟıpoW", - "gtceu.multiblock.central_monitor.low_power": "ɹǝʍoԀ ʍoꞀ", - "gtceu.multiblock.central_monitor.tooltip.0": "˙ʞɹoʍʇǝN ʎbɹǝuƎ uı pǝıxoɹd sǝuıɥɔɐɯ ɟo sǝʇɐʇS puɐ 'ʎbɹǝuƎ 'sɯǝʇI 'spınןℲ ǝɥʇ ɹoʇıuoɯ ʎןısɐǝ uɐɔ noʎ ˙ɹǝʌoƆ ǝɔɐɟɹǝʇuI ןɐʇıbıᗡ ǝɥʇ ʎq pǝıxoɹd sǝuıɥɔɐɯ sɹoʇıuoɯ ʇɐɥʇ ǝuıɥɔɐɯ ɐ sı sıɥ⟘", - "gtceu.multiblock.central_monitor.tooltip.1": "˙)ʇɥbıǝɥ X ɥʇpıʍ( %dX%d oʇ ᄅXƐ ɯoɹɟ uǝǝɹɔs ɹoʇıuoɯ ןɐɹʇuǝɔ ǝɥʇ pןınq uɐɔ noʎ", - "gtceu.multiblock.central_monitor.tooltip.2": "˙pǝɯɹoɟ sı ǝɹnʇɔnɹʇs ǝɥʇ ǝɹoɟǝq I∩⅁ ǝɥʇ uı ʇɥbıǝɥ uǝǝɹɔs ǝɥʇ ʇsnظpɐ uɐɔ noʎ ˙Ɛ sı ʇɥbıǝɥ ʇןnɐɟǝp ǝɥ⟘", - "gtceu.multiblock.central_monitor.tooltip.3": "˙uǝǝɹɔs ɥɔɐǝ ɹoɟ s/∩Ǝ %d :uoıʇdɯnsuoɔ ʎbɹǝuƎ", - "gtceu.multiblock.central_monitor.width": "%d :ɥʇpıM uǝǝɹɔS", - "gtceu.multiblock.charcoal_pile.description.0": "˙ʇı ɥʇɐǝuǝq ɐǝɹɐ 6xㄣx6 ɐ uı ןɐoɔɹɐɥƆ ǝןʇʇıɹᗺ oʇuı sboן sʇɹǝʌuoƆ", - "gtceu.multiblock.charcoal_pile.description.1": "", - "gtceu.multiblock.charcoal_pile.description.2": "˙ʇıd ǝɥʇ ǝpısuı ǝq uɐɔ ɹıɐ oN ˙ɟooɹ puɐ sןןɐʍ ǝɥʇ ɹoɟ pǝsn ǝq uɐɔ ʞɔoןq pǝʇɐןǝɹ-punoɹb ʎuɐ puɐ 'sʞɔıɹq ɯoɹɟ ǝpɐɯ ǝq ʇsnɯ ʇıd ǝɥʇ ɟo ɹooןɟ ǝɥ⟘", - "gtceu.multiblock.charcoal_pile.description.3": "", - "gtceu.multiblock.charcoal_pile.description.4": "˙ʇuǝıɔıɟɟǝ ǝɹoɯ ǝɹɐ ʇnq 'sboן ssǝɔoɹd oʇ ǝɯıʇ ǝɹoɯ ǝʞɐʇ sʇıd ɹǝbɹɐꞀ", - "gtceu.multiblock.cleanroom.clean_amount": "%s%%ɐ§ :ssǝuıןuɐǝןƆ", - "gtceu.multiblock.cleanroom.clean_state": "NⱯƎꞀƆɐ§ :snʇɐʇS", - "gtceu.multiblock.cleanroom.dirty_state": "ᗡƎ⟘ⱯNIWⱯ⟘NOƆㄣ§ :snʇɐʇS", - "gtceu.multiblock.coke_oven.description": "˙ɥɔʇɐH uǝʌO ǝʞoƆ sʇı ɐıʌ pǝssǝɔɔɐ ǝq uɐɔ ʎɹoʇuǝʌuı sʇI ˙ǝʇosoǝɹɔ ɹoɟ sʇǝʞɔnq ᄅƐ ɟo ʞuɐʇ ןɐuɹǝʇuı uɐ sɐɥ puɐ ןǝnɟ ǝɹınbǝɹ ʇ,usǝop ʇI ˙ǝɯɐb ʎןɹɐǝ ǝɥʇ uı ǝʇosoǝɹɔ puɐ ǝʞoɔ buıʇʇǝb ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı uǝʌO ǝʞoƆ ǝɥ⟘", - "gtceu.multiblock.computation.max": "%s :ʇ/∩MƆ xɐW", - "gtceu.multiblock.computation.non_bridging": "punoɟ uoıʇɔǝuuoɔ buıbpıɹq-uoN", - "gtceu.multiblock.computation.non_bridging.detailed": "ǝbpıɹq ʇouuɐɔ ɥɔıɥʍ ǝuıɥɔɐɯ ɐ oʇ pǝʞuıן sı ɥɔʇɐH uoıʇdǝɔǝᴚ Ɐ", - "gtceu.multiblock.computation.not_enough_computation": "¡uoıʇɐʇndɯoɔ ǝɹoɯ spǝǝu ǝuıɥɔɐW", - "gtceu.multiblock.computation.usage": "%s :buıs∩", - "gtceu.multiblock.cracker.description": "˙sʇuɐıɹɐʌ pǝʞɔɐɹƆ ɹıǝɥʇ oʇuı ןǝnℲ ʎʌɐǝH puɐ ʇɥbıꞀ buıuɹnʇ ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı ʇıu∩ buıʞɔɐɹƆ ןıO ǝɥ⟘", - "gtceu.multiblock.cracking_unit.energy": "%s%% :ǝbɐs∩ ʎbɹǝuƎ", - "gtceu.multiblock.data_bank.description": "˙sǝןnpoW ɐʇɐᗡ uo ɐʇɐp ɥɔɹɐǝsǝɹ xǝןdɯoɔ ǝɹoɯ pɐǝɹ oʇ sǝuıꞀ ʎןqɯǝssⱯ sǝןqɐuǝ ʇı 'ʎןןɐuoıʇıppⱯ ˙sǝuıꞀ ʎןqɯǝssⱯ ǝןdıʇןnɯ uǝǝʍʇǝq ɐʇɐᗡ ɥɔɹɐǝsǝᴚ ǝuıꞀ ʎןqɯǝssⱯ buıɹɐɥs ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı ʞuɐᗺ ɐʇɐᗡ ǝɥ⟘", - "gtceu.multiblock.data_bank.providing": "˙ɐʇɐp buıpıʌoɹԀ", - "gtceu.multiblock.dimension": "%sx%sx%sɹ§ :suoısuǝɯıᗡǝ§", - "gtceu.multiblock.dimensions.0": " :suoısuǝɯıᗡ", - "gtceu.multiblock.dimensions.1": " %s :ɹ§ɥʇdǝᗡן§6§ '%s :ɹ§ʇɥbıǝHן§ɐ§ '%s :ɹ§ɥʇpıMן§ɔ§ ", - "gtceu.multiblock.distillation_tower.description": "˙uoıʇısod ʎuɐ uı spınןɟ ʇɹǝsuı puɐ sɯǝʇı ʇndʇno uɐɔ ɹǝʎɐן ɯoʇʇoq ǝɥ⟘ ˙ǝuo puoɔǝs ǝɥʇ ɯoɹɟ buıʇɹɐʇs 'ɥɔʇɐɥ ʇndʇno ǝuo ʎןʇɔɐxǝ ǝʌɐɥ ʇsnɯ ɹǝʎɐן ɥɔɐƎ ˙sʇɔnpoɹdʎq ɹıǝɥʇ ɟo ǝɯos puɐ ןıO ɟo sǝdʎʇ snoıɹɐʌ ǝɥʇ buıןןıʇsıp ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı ɹǝʍo⟘ uoıʇɐןןıʇsıᗡ ǝɥ⟘", - "gtceu.multiblock.distillation_tower.distilling_fluid": "%s buıןןıʇsıᗡ", - "gtceu.multiblock.electric_blast_furnace.description": "˙ʎoןןɐ ɥɐpɐnbɐu puɐ 'ɯnıuɐʇıʇ 'ןǝǝʇs ssǝןuıɐʇs 'ɯnıuıɯnןɐ sɐ ɥɔns 'sןɐʇǝɯ puɐ sʎoןןɐ ɹǝıʇ-ɥbıɥ buıuıɐʇqo ɹoɟ pǝɹınbǝɹ sı ʇI ˙sǝɹo buıuıɟǝɹ puɐ sןɐʇǝɯ buıʞooɔ 'sʎoןןɐ buıʇןǝɯs ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı )ℲᗺƎ( ǝɔɐuɹnℲ ʇsɐןᗺ ɔıɹʇɔǝןƎ ǝɥ⟘", - "gtceu.multiblock.energy_consumption": ")%s( ʇ/∩Ǝ %s :ǝbɐs∩ ʎbɹǝuƎ", - "gtceu.multiblock.exact_hatch_1.tooltip": "˙ɥɔʇɐH ʎbɹǝuƎɟ§ ǝuO9§ ʎןʇɔɐxƎ sʇdǝɔɔⱯɟ§", - "gtceu.multiblock.extreme_combustion_engine.description": "˙ɹǝʍod ΛI ɹoɟ ɹoʇɐɹǝuǝ⅁ uoıʇsnqɯoƆ ɐ sɐ sʇɔɐ ʇɐɥʇ ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı ǝuıbuƎ uoıʇsnqɯoƆ ǝɯǝɹʇxƎ ǝɥ⟘", - "gtceu.multiblock.fluid_rig.drilled_fluid": "%s :pınןℲ", - "gtceu.multiblock.fluid_rig.fluid_amount": "%s :ǝʇɐᴚ buıdɯnԀ", - "gtceu.multiblock.fluid_rig.no_fluid_in_area": "˙ɐǝɹⱯ uı ǝuoN", - "gtceu.multiblock.fluid_rig.vein_depleted": "˙pǝʇǝןdǝᗡ uıǝΛ", - "gtceu.multiblock.fluid_rig.vein_depletion": "%s :ǝzıS uıǝΛ", - "gtceu.multiblock.fusion_reactor.energy": "%d / %d :∩Ǝ", - "gtceu.multiblock.fusion_reactor.heat": "%d :ʇɐǝH", - "gtceu.multiblock.generation_eu": "ʇ/∩Ǝ %sɐ§ :buıʇʇndʇnO", - "gtceu.multiblock.hpca.computation": "%s :buıpıʌoɹԀ", - "gtceu.multiblock.hpca.description": "˙suoıʇɐuıʇsǝp ǝɹoɯ ɹo ǝuo oʇ sǝɔɹnos ǝןdıʇןnɯ ɯoɹɟ uoıʇɐʇndɯoƆ buıʇnoɹ puɐ buıuıqɯoɔ ɹoɟ sǝɥɔʇıʍS ʞɹoʍʇǝN oʇ ʇɔǝuuoɔ uɐɔ ⱯƆԀH ǝɥʇ 'ʇuǝuodɯoƆ ǝbpıɹᗺ ɐ ɥʇıʍ pǝsn uǝɥM ˙uoıʇɔnpoɹԀ ʇɐǝH puɐ 'ʇsoƆ ʇuɐןooƆ 'ʇsoƆ ʎbɹǝuƎ sɐ ןןǝʍ sɐ 'buıןooƆ 'uoıʇɐʇndɯoƆ ɟo sʇunoɯɐ ʇuǝɹǝɟɟıp ǝpıʌoɹd uɐɔ sʇuǝuodɯoɔ ʇuǝɹǝɟɟıᗡ ˙sʇuǝuodɯoɔ ⱯƆԀH ɥʇıʍ ʎɐʍ ʎuɐ uı pǝןןıɟ ǝq uɐɔ ɥɔıɥʍ ɐǝɹɐ ƐxƐ ǝןqıxǝןɟ ɐ sɐɥ ǝɹnʇɔnɹʇs ǝɥ⟘ ˙ɐʇɐᗡ ɥɔɹɐǝsǝᴚ ǝuıꞀ ʎןqɯǝssⱯ xǝןdɯoɔ ǝɹoɯ ɹoɟ )ʇ/∩MƆ( sʇıu∩ ʞɹoM ǝʇndɯoƆ buıʇɐǝɹɔ ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı )ⱯƆԀH( ʎɐɹɹⱯ buıʇndɯoƆ ǝɔuɐɯɹoɟɹǝԀ ɥbıH ǝɥ⟘", - "gtceu.multiblock.hpca.energy": ")%s( ʇ/∩Ǝ %s / %s :buıs∩", - "gtceu.multiblock.hpca.error_damaged": "¡ǝɹnʇɔnɹʇs uı ʇuǝuodɯoɔ pǝbɐɯɐᗡ", - "gtceu.multiblock.hpca.error_temperature": "¡pǝbɐɯɐp ǝq ʎɐɯ sʇuǝuodɯoɔ 'Ɔ00Ɩ ǝʌoqɐ ǝɹnʇɐɹǝdɯǝ⟘", - "gtceu.multiblock.hpca.hover_for_info": "sןıɐʇǝp ɹoɟ ɹǝʌoH", - "gtceu.multiblock.hpca.info_bridging_disabled": "pǝןqɐsıᗡ buıbpıɹᗺ", - "gtceu.multiblock.hpca.info_bridging_enabled": "pǝןqɐuƎ buıbpıɹᗺ", - "gtceu.multiblock.hpca.info_coolant_name": "ʇuɐןooƆ ᗺƆԀ", - "gtceu.multiblock.hpca.info_max_computation": "%s :ʇ/∩MƆ xɐW", - "gtceu.multiblock.hpca.info_max_coolant_required": "%s :pǝpǝǝN ʇuɐןooƆ", - "gtceu.multiblock.hpca.info_max_cooling_available": "%s :ǝןqɐןıɐʌⱯ buıןooƆ", - "gtceu.multiblock.hpca.info_max_cooling_demand": "%s :puɐɯǝᗡ buıןooƆ", - "gtceu.multiblock.hpca.temperature": "%s :ǝɹnʇɐɹǝdɯǝ⟘", - "gtceu.multiblock.hpca.warning_low_cooling": "buıןooɔ ɥbnouǝ ʇoN -", - "gtceu.multiblock.hpca.warning_multiple_bridges": ")ʇıɟǝuǝq ןɐuoıʇıppɐ ou sǝpıʌoɹd( ǝɹnʇɔnɹʇs uı sǝbpıɹq ǝןdıʇןnW -", - "gtceu.multiblock.hpca.warning_no_computation": "sɹǝpıʌoɹd uoıʇɐʇndɯoɔ oN -", - "gtceu.multiblock.hpca.warning_structure_header": ":sbuıuɹɐM ǝɹnʇɔnɹʇS", - "gtceu.multiblock.hpca.warning_temperature": "¡Ɔ00Ɩ ʇɐ pǝbɐɯɐp ǝq ʎɐɯ sʇuǝuodɯoɔ 'Ɔ0ϛ ǝʌoqɐ ǝɹnʇɐɹǝdɯǝ⟘", - "gtceu.multiblock.hpca.warning_temperature_active_cool": "sɹǝןooɔ ǝʌıʇɔɐ buızıןıʇn ʎןןnℲ", - "gtceu.multiblock.idling": "˙buıןpI9§", - "gtceu.multiblock.implosion_compressor.description": "˙sɯǝb buıpuodsǝɹɹoɔ ɹıǝɥʇ oʇuı sʇsnp ɯǝb uɹnʇ oʇ sǝʌısoןdxǝ sǝsn ʇɐɥʇ ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı ɹossǝɹdɯoƆ uoısoןdɯI ǝɥ⟘", - "gtceu.multiblock.invalid_structure": "˙ǝɹnʇɔnɹʇs pıןɐʌuI", - "gtceu.multiblock.invalid_structure.tooltip": "˙IƎſ uı ǝʇɐןdɯǝʇ ǝɹnʇɔnɹʇs ǝǝs 'dןǝɥ buıpןınq ɹoℲ ˙ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ǝɥʇ ɟo ɹǝןןoɹʇuoɔ ɐ sı ʞɔoןq sıɥ⟘", - "gtceu.multiblock.large_boiler.description": "˙uoıʇdɯnsuoɔ ןǝnℲ puɐ ʇndʇno ɯɐǝʇS ǝɔnpǝɹ oʇ %%ϛ ɟo sʇuǝɯǝɹɔuı uı ʞɔɐq pǝןʇʇoɹɥʇ ǝq uɐƆ ˙ןǝnℲ pınןℲ-ıɯǝS/ןǝsǝıᗡ ɐ ɹo 'ǝɯı⟘ uɹnᗺ ɐ ɥʇıʍ ןǝnℲ pıןoS ʎuɐ ɹǝɥʇıǝ sı ǝɔɹnos ʎbɹǝuǝ pıɐS ˙ɹǝʇɐʍ puɐ ǝɔɹnos ʎbɹǝuǝ uɐ ɯoɹɟ ɯɐǝʇs ǝʇɐɹǝuǝb ʇɐɥʇ sʞɔoןqıʇןnɯ ǝɹɐ sɹǝןıoᗺ ǝbɹɐꞀ", - "gtceu.multiblock.large_boiler.efficiency": "%s :ʎɔuǝıɔıɟɟƎ", - "gtceu.multiblock.large_boiler.explosion_tooltip": "ɹǝʇɐM ou ɥʇıʍ ןǝnℲ pǝpıʌoɹd ɟı ǝpoןdxǝ ןןıM", - "gtceu.multiblock.large_boiler.heat_time_tooltip": "dn buıןıoq oʇㄥ§ spuoɔǝs %dɟ§ sǝʞɐ⟘ㄥ§", - "gtceu.multiblock.large_boiler.max_temperature": "ʇ/ᗺɯ%d :uoıʇɔnpoɹԀ ɯɐǝʇS 'ʞ%d :ǝɹnʇɐɹǝdɯǝ⟘ xɐW", - "gtceu.multiblock.large_boiler.rate_tooltip": "ןɐoƆ Ɩɟ§ ɥʇıʍ ɯɐǝʇS ɟoㄥ§ Ꞁ %dɟ§ sǝɔnpoɹԀㄥ§", - "gtceu.multiblock.large_boiler.steam_output": "ʇ/ᗺɯ %s :ʇndʇnO ɯɐǝʇS", - "gtceu.multiblock.large_boiler.temperature": "ʞ%s / ʞ%s :ǝɹnʇɐɹǝdɯǝ⟘", - "gtceu.multiblock.large_boiler.throttle": "%d :ǝןʇʇoɹɥ⟘", - "gtceu.multiblock.large_boiler.throttle.tooltip": ")ǝɯıʇ dn-ʇɐǝɥ ʇɔǝɟɟɐ ʇou sǝop 'ʇsoן ʇou sı ʎɔuǝıɔıɟɟǝ( ןǝnɟ ssǝן ǝɯnsuoɔ puɐ ɯɐǝʇS ssǝן ʇndʇno uɐɔ ɹǝןıoᗺ", - "gtceu.multiblock.large_boiler.throttle_modify": ":ǝןʇʇoɹɥ⟘ ʎɟıpoW", - "gtceu.multiblock.large_chemical_reactor.description": "˙ɹǝʇuǝɔ ǝɥʇ uı pǝʇɐɔoן buısɐɔ ǝdıԀ ƎℲ⟘Ԁ ǝɥʇ oʇ ʇuǝɔɐظpɐ pǝɔɐןd ǝq ʇsnɯ ɥɔıɥʍ 'ʞɔoןᗺ ןıoƆ ןǝʞɔıuoɹdnƆ Ɩ ʎןʇɔɐxǝ sǝɹınbǝɹ ʞɔoןqıʇןnɯ ǝɥ⟘ ˙ㄣ ʎq ʎbɹǝuǝ puɐ pǝǝds ɥʇoq ʎןdıʇןnɯ sʞɔoןɔɹǝʌO ˙ʎɔuǝıɔıɟɟǝ ʎbɹǝuǝ %%00Ɩ ʇɐ suoıʇɔɐǝɹ ןɐɔıɯǝɥɔ sɯɹoɟɹǝd ɹoʇɔɐǝᴚ ןɐɔıɯǝɥƆ ǝbɹɐꞀ ǝɥ⟘", - "gtceu.multiblock.large_combustion_engine.boost_disallowed": "˙buıʇsooᗺ uǝbʎxO ǝןqɐuǝ oʇ ɥɔʇɐH oɯɐuʎᗡ ǝɥʇ ǝpɐɹbd∩q§", - "gtceu.multiblock.large_combustion_engine.description": "˙ɹǝʍod ΛƎ ɹoɟ ɹoʇɐɹǝuǝ⅁ uoıʇsnqɯoƆ ɐ sɐ sʇɔɐ ʇɐɥʇ ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı ǝuıbuƎ uoıʇsnqɯoƆ ǝbɹɐꞀ ǝɥ⟘", - "gtceu.multiblock.large_combustion_engine.liquid_oxygen_amount": "Ꞁ%s :ʇunoɯⱯ uǝbʎxO pınbıꞀ", - "gtceu.multiblock.large_combustion_engine.liquid_oxygen_boosted": "˙pǝʇsooq uǝbʎxO pınbıꞀq§", - "gtceu.multiblock.large_combustion_engine.lubricant_amount": "Ꞁ%s :ʇunoɯⱯ ʇuɐɔıɹqnꞀ", - "gtceu.multiblock.large_combustion_engine.obstructed": "˙pǝʇɔnɹʇsqO sǝʞɐʇuI ǝuıbuƎ", - "gtceu.multiblock.large_combustion_engine.oxygen_amount": "Ꞁ%s :ʇunoɯⱯ uǝbʎxO", - "gtceu.multiblock.large_combustion_engine.oxygen_boosted": "˙pǝʇsooq uǝbʎxOq§", - "gtceu.multiblock.large_combustion_engine.supply_liquid_oxygen_to_boost": "˙ʇsooq oʇ uǝbʎxO pınbıꞀ ʎןddnS", - "gtceu.multiblock.large_combustion_engine.supply_oxygen_to_boost": "˙ʇsooq oʇ uǝbʎxO ʎןddnS", - "gtceu.multiblock.large_miner.done": "¡ǝuoᗡ", - "gtceu.multiblock.large_miner.errorradius": "¡buıʞɹoʍ ǝןıɥʍ snıpɐɹ ǝbuɐɥɔ ʇouuɐƆɔ§", - "gtceu.multiblock.large_miner.invfull": "¡ןןnℲ ʎɹoʇuǝʌuI", - "gtceu.multiblock.large_miner.needsfluid": "pınןℲ buıןןıɹᗡ spǝǝN", - "gtceu.multiblock.large_miner.needspower": "¡ɹǝʍoԀ spǝǝN", - "gtceu.multiblock.large_miner.radius": "sʞɔoןᗺ ɹ§%dɐ§ :snıpɐᴚ", - "gtceu.multiblock.large_miner.steam": "¡ɯɐǝʇS spǝǝN", - "gtceu.multiblock.large_miner.vent": "¡pǝʞɔoןᗺ buıʇuǝΛ", - "gtceu.multiblock.large_miner.working": "˙˙˙buıʞɹoM", - "gtceu.multiblock.large_turbine.description": "˙ǝɹnʇɔnɹʇs ǝɥʇ ɟo ɹǝʇuǝɔ ǝɥʇ uı pǝsn ǝɹɐ sbuısɐɔ xoqɹɐǝ⅁ ˙ǝuıqɹnʇ ɟo pǝǝds ʇuǝɹɹnɔ puɐ ʎɔuǝıɔıɟɟǝ ɹoʇoɹ uo pǝsɐq sı ʇndʇno ʎbɹǝuƎ ˙ɹoʇoɹ s,ǝuıqɹnʇ ǝɥʇ uıds ɯǝɥʇ buıʌɐɥ ʎq ɐɯsɐןd puɐ 'sǝsɐb 'ɯɐǝʇs ɯoɹɟ ɹǝʍod ǝʇɐɹǝuǝb ʇɐɥʇ sʞɔoןqıʇןnɯ ǝɹɐ sǝuıqɹn⟘ ǝbɹɐꞀ", - "gtceu.multiblock.luv_fusion_reactor.description": "˙W09Ɩ ɟo ɯnɯıxɐɯ ɐ sɐɥ puɐ '∩Ǝ W0Ɩ ʎq sǝsɐǝɹɔuı ɹǝɟɟnq sʇı 'sɐɥ ʇı ɥɔʇɐH ʎɹǝʌǝ ɹoℲ ˙sǝɥɔʇɐH ʎbɹǝuƎ Λ∩ puɐ 'WԀZ 'ΛnꞀ ǝsn ʎןuo uɐɔ ʇI ˙sǝuo ɹǝıʌɐǝɥ oʇuı sʇuǝɯǝןǝ buısnɟ ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ǝbɹɐן ɐ sı Ɩ ʞW ɹoʇɔɐǝᴚ uoısnℲ ǝɥ⟘", - "gtceu.multiblock.max_energy_per_tick": ")ɹ§%s( %sɐ§ :ʇ/∩Ǝ xɐW", - "gtceu.multiblock.max_energy_per_tick_amps": ")%s Ɐ%s( %s :ʇ/∩Ǝ xɐW", - "gtceu.multiblock.max_energy_per_tick_hover": "buıʞɔoןɔɹǝʌo ɹo sǝdıɔǝɹ buıuunɹ ɹoɟ ǝןqɐןıɐʌɐ ʇ/∩Ǝ ɯnɯıxɐɯ ǝɥ⟘", - "gtceu.multiblock.max_recipe_tier": "%s :ɹǝı⟘ ǝdıɔǝᴚ xɐW", - "gtceu.multiblock.max_recipe_tier_hover": "unɹ ǝq uɐɔ ʇɐɥʇ sǝdıɔǝɹ ɟo ɹǝıʇ ɯnɯıxɐɯ ǝɥ⟘", - "gtceu.multiblock.monitor_screen.tooltip.0": "˙ɹǝʌıɹpʍǝɹɔs ɐ ɟo ʞɔıןɔ-ʇɥbıɹ ɐ ɥʇıʍ pǝuǝdo ǝq uɐɔ I∩⅁ ǝɥ⟘", - "gtceu.multiblock.monitor_screen.tooltip.1": ")˙uǝǝɹɔs ǝɥʇ uo ʎןʇɔǝɹıp sǝdıd ʇɔǝuuoɔ uɐɔ noʎ 'sǝʎ( ˙I∩⅁ puɐ sǝıʇıןıqɐdɐɔ ,sǝuıɥɔɐɯ ǝʇɐbǝןǝp uɐɔ ɹǝʌoƆ ǝɔɐɟɹǝʇuI ןɐʇıbıᗡ ɟo ǝpoɯ ʎxoɹd ǝɥ⟘", - "gtceu.multiblock.monitor_screen.tooltip.2": "˙suıbnןd sʇɹoddns osןɐ uǝǝɹɔs ǝɥ⟘", - "gtceu.multiblock.multi_furnace.description": "˙sןıoɔ ןǝʌǝן ɹǝɥbıɥ buısn ʎq pǝıןdıʇןnɯ ǝq uɐɔ puɐ 'uoıʇɐɹǝdo ɹǝd pǝʇןǝɯs sɯǝʇı ɟo ǝnןɐʌ ǝsɐq ǝɥʇ sı ᄅƐ ˙uıɐb ʎɔuǝıɔıɟɟǝ ʎbɹǝuǝ puɐ ʇsooq pǝǝds ɐ ǝpıʌoɹd sןıoɔ ɟo sɹǝıʇ ʇuǝɹǝɟɟıᗡ ˙ǝɔuo ʇɐ sɯǝʇı ɟo sʇunoɯɐ ǝʌıssɐɯ buıʇןǝɯs ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı ɹǝʇןǝɯS ıʇןnW ǝɥ⟘", - "gtceu.multiblock.multi_furnace.heating_coil_discount": "x%s :ʇsooᗺ ∩Ǝ ןıoƆ buıʇɐǝH", - "gtceu.multiblock.multi_furnace.heating_coil_level": "%s :ןǝʌǝꞀ ןıoƆ buıʇɐǝH", - "gtceu.multiblock.multiple_recipemaps.header": ":ǝpoW ǝuıɥɔɐW", - "gtceu.multiblock.multiple_recipemaps.switch_message": "¡sǝpoɯ ɥɔʇıʍs oʇ ɟɟo ǝq ʇsnɯ ǝuıɥɔɐɯ ǝɥ⟘", - "gtceu.multiblock.multiple_recipemaps.tooltip": "˙ǝsn oʇ ǝpoɯ ǝuıɥɔɐɯ ɥɔıɥʍ ǝbuɐɥɔ oʇ ɹǝןןoɹʇuoɔ ǝɥʇ ɹǝʌıɹpʍǝɹɔS", - "gtceu.multiblock.multiple_recipemaps_recipes.tooltip": "ɹ§%sǝ§ :sǝpoW ǝuıɥɔɐW", - "gtceu.multiblock.network_switch.description": "˙uoıʇɐʇndɯoƆ ɹıǝɥʇ ssǝɔɔɐ oʇ ǝןqɐ ǝq oʇ ɥɔʇıʍS ʞɹoʍʇǝN ǝɥʇ ɹoɟ ʇuǝuodɯoƆ ǝbpıɹᗺ ɐ ǝʌɐɥ ʇsnɯ sⱯƆԀH ˙ɥɔʇɐH uoıʇdǝɔǝᴚ ɐʇɐᗡ uoıʇɐʇndɯoƆ ǝuo ʇdǝɔɔɐ ʎןuo uɐɔ uoıʇɐʇS ɥɔɹɐǝsǝᴚ ǝɥʇ sɐ 'uoıʇɐʇndɯoƆ ɹǝɥbıɥ ɥɔnɯ sǝɹınbǝɹ ɥɔıɥʍ ɐʇɐᗡ ɥɔɹɐǝsǝᴚ ɹoɟ ʎɹɐssǝɔǝu sı ʇI ˙sǝɥɔʇɐH uoıssıɯsuɐɹ⟘ ɹo uoıʇdǝɔǝᴚ ɐʇɐᗡ uoıʇɐʇndɯoƆ ɟo ɹǝqɯnu ʎuɐ ʇdǝɔɔɐ uɐɔ ʇI ˙suoıʇɐuıʇsǝp ʎuɐɯ oʇ sǝɔɹnos ʎuɐɯ ɯoɹɟ uoıʇɐʇndɯoƆ buıʇnqıɹʇsıp ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı ɥɔʇıʍS ʞɹoʍʇǝN ǝɥ⟘", - "gtceu.multiblock.not_enough_energy": "˙ʎbɹǝuǝ ǝɹoɯ spǝǝu ǝuıɥɔɐW :⅁NINᴚⱯM", - "gtceu.multiblock.not_enough_energy_output": "¡ʍoꞀ oo⟘ ɹǝı⟘ oɯɐuʎᗡ ʎbɹǝuƎ :⅁NINᴚⱯM", - "gtceu.multiblock.ore_rig.drilled_ore_entry": "%s - ", - "gtceu.multiblock.ore_rig.drilled_ores_list": ":sǝɹO", - "gtceu.multiblock.ore_rig.ore_amount": "%s :ǝʇɐᴚ buıןןıɹᗡ", - "gtceu.multiblock.output_line.0": ")ɐǝ/%ss( ɹ§%sǝ§ x %s", - "gtceu.multiblock.output_line.1": ")s/%s( ɹ§%sǝ§ x %s", - "gtceu.multiblock.output_line.2": ")ɐǝ/%ss( ɹ§%sǝ§ ≈ %s", - "gtceu.multiblock.output_line.3": ")s/%s( ɹ§%sǝ§ ≈ %s", - "gtceu.multiblock.page_switcher.io.both": "sʇndʇnO + sʇnduI pǝuıqɯoƆϛ§", - "gtceu.multiblock.page_switcher.io.export": "sʇndʇnOㄣ§", - "gtceu.multiblock.page_switcher.io.import": "sʇnduIᄅ§", - "gtceu.multiblock.parallel": "ןǝןןɐɹɐԀ uı sǝdıɔǝᴚ %d oʇ dn buıɯɹoɟɹǝԀ", - "gtceu.multiblock.parallel.exact": "sןǝןןɐɹɐԀ ɯoɹɟ x%d -", - "gtceu.multiblock.parallelizable.tooltip": "˙sǝɥɔʇɐH ןoɹʇuoƆ ןǝןןɐɹɐԀ ɥʇıʍ ǝzıןǝןןɐɹɐd uɐƆ", - "gtceu.multiblock.pattern.clear_amount_1": "ɹ§ʇuoɹɟ uı ǝɔɐds ƖxƖxƖ ɹɐǝןɔ ɐ ǝʌɐɥ ʇsnW9§", - "gtceu.multiblock.pattern.clear_amount_3": "ɹ§ʇuoɹɟ uı ǝɔɐds ƖxƐxƐ ɹɐǝןɔ ɐ ǝʌɐɥ ʇsnW9§", - "gtceu.multiblock.pattern.error": "˙)%s( ʇɐ )%s( sʇuǝuodɯoɔ pǝʇɔǝdxƎ", - "gtceu.multiblock.pattern.error.batteries": "ɹ§ǝɯɐs ǝɥʇ ǝq ʇsnɯ sǝıɹǝʇʇɐq ןןⱯɔ§", - "gtceu.multiblock.pattern.error.coils": "ɹ§ǝɯɐs ǝɥʇ ǝq ʇsnɯ sןıoɔ buıʇɐǝɥ ןןⱯɔ§", - "gtceu.multiblock.pattern.error.filters": "ɹ§ǝɯɐs ǝɥʇ ǝq ʇsnɯ sɹǝʇןıɟ ןןⱯɔ§", - "gtceu.multiblock.pattern.error.limited.0": "ɹ§%d :ɯnɯıxɐWɔ§", - "gtceu.multiblock.pattern.error.limited.1": "ɹ§%d :ɯnɯıuıWɔ§", - "gtceu.multiblock.pattern.error.limited.2": "ɹ§ɹǝʎɐן ɹǝd %d :ɯnɯıxɐWɔ§", - "gtceu.multiblock.pattern.error.limited.3": "ɹ§ɹǝʎɐן ɹǝd %d :ɯnɯıuıWɔ§", - "gtceu.multiblock.pattern.error.limited_exact": "ɹ§%d :ʎןʇɔɐxƎɔ§", - "gtceu.multiblock.pattern.error.limited_within": "ɹ§%d puɐ %d uǝǝʍʇǝᗺɔ§", - "gtceu.multiblock.pattern.location_end": "ɹ§puƎ ʎɹǝΛɔ§", - "gtceu.multiblock.pattern.replaceable_air": "ɹıⱯ ʎq ǝןqɐǝɔɐןdǝᴚ", - "gtceu.multiblock.pattern.single": "ɹ§pǝsn ǝq uɐɔ ʞɔoןq sıɥʇ ʎןuO9§", - "gtceu.multiblock.power_substation.average_in": "ʇ/∩Ǝㄥ§ %s :ʇnduI ˙bʌⱯㄥ§", - "gtceu.multiblock.power_substation.average_in_hover": "ʞuɐq ʎbɹǝuǝ ןɐuɹǝʇuı s,uoıʇɐʇsqnS ɹǝʍoԀ ǝɥʇ oʇuı ∩Ǝ pǝʇɹǝsuı ǝbɐɹǝʌɐ ǝɥ⟘", - "gtceu.multiblock.power_substation.average_out": "ʇ/∩Ǝㄥ§ %s :ʇndʇnO ˙bʌⱯㄥ§", - "gtceu.multiblock.power_substation.average_out_hover": "ʞuɐq ʎbɹǝuǝ ןɐuɹǝʇuı s,uoıʇɐʇsqnS ɹǝʍoԀ ǝɥʇ ɟo ʇno ∩Ǝ pǝʇɔɐɹʇxǝ ǝbɐɹǝʌɐ ǝɥ⟘", - "gtceu.multiblock.power_substation.capacity": "∩Ǝㄥ§ %s :ʎʇıɔɐdɐƆㄥ§", - "gtceu.multiblock.power_substation.passive_drain": "ʇ/∩Ǝㄥ§ %s :uıɐɹᗡ ǝʌıssɐԀㄥ§", - "gtceu.multiblock.power_substation.stored": "∩Ǝㄥ§ %s :pǝɹoʇSㄥ§", - "gtceu.multiblock.power_substation.time_days": "sʎɐᗡ %s", - "gtceu.multiblock.power_substation.time_forever": "ɹǝʌǝɹoℲ", - "gtceu.multiblock.power_substation.time_hours": "sɹnoH %s", - "gtceu.multiblock.power_substation.time_minutes": "sǝʇnuıW %s", - "gtceu.multiblock.power_substation.time_seconds": "spuoɔǝS %s", - "gtceu.multiblock.power_substation.time_to_drain": "%s :uıɐɹp oʇ ǝɯı⟘ㄥ§", - "gtceu.multiblock.power_substation.time_to_fill": "%s :ןןıɟ oʇ ǝɯı⟘ㄥ§", - "gtceu.multiblock.power_substation.time_years": "sɹɐǝʎ %s", - "gtceu.multiblock.power_substation.under_one_hour_left": "¡pǝuıɐɹp ʎןןnɟ ןıʇun ɹnoɥ Ɩ uɐɥʇ ssǝꞀ", - "gtceu.multiblock.preview.rotate": "ǝʇɐʇoɹ oʇ bɐɹp puɐ ʞɔıןƆ", - "gtceu.multiblock.preview.select": "sǝʇɐpıpuɐɔ ʞɔǝɥɔ oʇ ʞɔıןɔ-ʇɥbıᴚ", - "gtceu.multiblock.preview.zoom": "ɯooz oʇ bɐɹp + ʞɔıןɔ-ʇɥbıɹ ɹo ןǝǝɥʍǝsnoɯ ǝs∩", - "gtceu.multiblock.primitive_blast_furnace.bronze.description": "˙sdnʇǝs ʇsɹıɟ ɹnoʎ ɹoɟ ןǝǝʇs ɥʇıʍ noʎ ǝpıʌoɹd ןןıʍ ʇı 'ʇsɐɟ ʎɹǝʌ ʇou ɥbnoɥʇןⱯ ˙ǝɯɐb ʎןɹɐǝ ǝɥʇ uı ןǝǝʇs buıʞooɔ ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı )ℲᗺԀ( ǝɔɐuɹnℲ ʇsɐןᗺ ǝʌıʇıɯıɹԀ ǝɥ⟘", - "gtceu.multiblock.primitive_water_pump.description": "˙ɹǝıןdıʇןnW ɥɔʇɐH * ʇuǝıɔıɟɟǝoƆ ǝɯoıᗺ :ɐןnɯɹoɟ ǝɥʇ sʍoןןoℲ ˙ɹǝıʇ ɹǝd ɹǝʇɐʍ ɟo ʇunoɯɐ ǝɥʇ buısɐǝɹɔuı 'ɥɔʇɐH ʇndʇnO ΛꞀ ɹo 'ΛꞀ∩ 'dɯnԀ ɐ ǝsn uɐɔ ʇI ˙uı sı ʇı ǝɯoıᗺ ǝɥʇ uo buıpuǝdǝp 'puoɔǝs ɹǝd ǝɔuo ɹǝʇɐʍ sʇɔǝןןoɔ ʇɐɥʇ ʞɔoןqıʇןnɯ ɐɹƎ ɯɐǝʇS-ǝɹd ɐ sı dɯnԀ ɹǝʇɐM ǝʌıʇıɯıɹԀ ǝɥ⟘", - "gtceu.multiblock.primitive_water_pump.extra1.0": ":ʇuǝıɔıɟɟǝoƆ ǝɯoıᗺ", - "gtceu.multiblock.primitive_water_pump.extra1.1": "s/ᗺɯ 000Ɩ :ɹǝʌıᴚ 'uɐǝɔO ", - "gtceu.multiblock.primitive_water_pump.extra1.2": "s/ᗺɯ 008 :dɯɐʍS ", - "gtceu.multiblock.primitive_water_pump.extra1.3": "s/ᗺɯ 0ϛƐ :ǝןbunſ ", - "gtceu.multiblock.primitive_water_pump.extra1.4": "s/ᗺɯ 00Ɛ :ʎʍouS ", - "gtceu.multiblock.primitive_water_pump.extra1.5": "s/ᗺɯ 0ϛᄅ :ʇsǝɹoℲ 'suıɐןԀ ", - "gtceu.multiblock.primitive_water_pump.extra1.6": "s/ᗺɯ ϛㄥƖ :ɐbıɐ⟘ ", - "gtceu.multiblock.primitive_water_pump.extra1.7": "s/ᗺɯ 0ㄥƖ :ɥɔɐǝᗺ ", - "gtceu.multiblock.primitive_water_pump.extra1.8": "s/ᗺɯ 00Ɩ :ɹǝɥʇO ", - "gtceu.multiblock.primitive_water_pump.extra2.0": ":sɹǝıןdıʇןnW ɥɔʇɐH", - "gtceu.multiblock.primitive_water_pump.extra2.1": "xƖ :ɥɔʇɐH dɯnԀ ", - "gtceu.multiblock.primitive_water_pump.extra2.2": "xᄅ :ɥɔʇɐH ʇndʇnO ΛꞀ∩ ", - "gtceu.multiblock.primitive_water_pump.extra2.3": "xㄣ :ɥɔʇɐH ʇndʇnO ΛꞀ ", - "gtceu.multiblock.primitive_water_pump.extra2.4": "", - "gtceu.multiblock.primitive_water_pump.extra2.5": "˙%%0ϛ ʎq pǝsɐǝɹɔuı ǝq ןןıʍ uoıʇɔnpoɹd ɹǝʇɐʍ ןɐʇoʇ ǝɥʇ 'ǝɯoıᗺ s,dɯnԀ ǝɥʇ uı buıuıɐɹ ǝןıɥM", - "gtceu.multiblock.progress": ")%s%%( %ss / %ss :ssǝɹboɹԀ", - "gtceu.multiblock.progress_percent": "%s%% :ssǝɹboɹԀ", - "gtceu.multiblock.pyrolyse_oven.description": "˙ןıO ʎʌɐǝH puɐ ɥsⱯ ɹo 'ןıO ǝʇosoǝɹƆ puɐ ןɐoɔɹɐɥƆ oʇuı sboꞀ buıuɹnʇ ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı uǝʌO ǝsʎןoɹʎԀ ǝɥ⟘", - "gtceu.multiblock.pyrolyse_oven.speed": "%s%% :pǝǝdS buıssǝɔoɹԀ", - "gtceu.multiblock.require_steam_parts": "¡sǝsnᗺ puɐ sǝɥɔʇɐH ɯɐǝʇS sǝɹınbǝᴚ", - "gtceu.multiblock.research_station.description": "˙)sⱯƆԀH( sʎɐɹɹⱯ buıʇndɯoƆ ǝɔuɐɯɹoɟɹǝԀ ɥbıH ʎq pǝıןddns sı ɥɔıɥʍ 'sǝdıɔǝɹ ɥɔɹɐǝsǝɹ oʇ )ʇ/∩MƆ( sʇıu∩ ʞɹoM ǝʇndɯoƆ sǝɹınbǝᴚ ˙uoıʇɐʇS ɥɔɹɐǝsǝᴚ ǝɥʇ uı pǝuuɐɔs ǝq ʇsnɯ ǝןnpoW ɐʇɐᗡ ɹo qɹO ɐʇɐᗡ ɐ buıɹınbǝɹ ɥɔɹɐǝsǝᴚ ʎuⱯ ˙ɐʇɐᗡ ɥɔɹɐǝsǝᴚ ǝuıꞀ ʎןqɯǝssⱯ xǝןdɯoɔ ǝɹoɯ ɥɔnɯ buıɥɔɹɐǝsǝɹ ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı uoıʇɐʇS ɥɔɹɐǝsǝᴚ ǝɥ⟘", - "gtceu.multiblock.research_station.researching": "˙buıɥɔɹɐǝsǝᴚ9§", - "gtceu.multiblock.running": "˙ʎןʇɔǝɟɹǝd buıuunᴚ", - "gtceu.multiblock.steam.duration_modifier": "˙sɯǝʇı ɟo ɹǝqɯnu ʎq pǝʇɔǝɟɟɐ ʇou 'ssǝɔoɹd oʇ uoıʇɐɹnp ǝsɐqㄥ§ xϛ˙Ɩɟ§ sǝʞɐ⟘", - "gtceu.multiblock.steam.low_steam": "¡unɹ oʇ ɯɐǝʇS ɥbnouǝ ʇoN", - "gtceu.multiblock.steam.steam_stored": "qɯ %s / %s :ɯɐǝʇS", - "gtceu.multiblock.steam_grinder.description": "˙ɥɔʇɐH ɯɐǝʇS ǝɥʇ uɐɥʇ ɹǝɥʇo sǝɥɔʇɐH pınןℲ ɹou 'sǝssnq ʇndʇnO/ʇnduI ןɐɯɹou ǝsn ʇouuɐƆ ˙ɯɹoɟ oʇ sbuısɐƆ ǝzuoɹᗺ ㄣƖ ʇsɐǝן ʇɐ sǝɹınbǝᴚ ˙ǝbⱯ ɯɐǝʇS ǝɥʇ ʇɐ ɹoʇɐɹǝɔɐW ʞɔoןqıʇןnW Ɐ", - "gtceu.multiblock.steam_oven.description": "˙ǝuo uɐɥʇ ǝɹoɯ ou 'ɹǝʎɐן ɯoʇʇoq ǝɥʇ uo ǝq ʇsnɯ ɥɔʇɐH ɯɐǝʇS ˙ɥɔʇɐH ɯɐǝʇS ǝɥʇ uɐɥʇ ɹǝɥʇo sǝɥɔʇɐH pınןℲ ɹou 'sǝssnq ʇndʇnO/ʇnduI ןɐɯɹou ǝsn ʇouuɐƆ ˙ɯɹoɟ oʇ sbuısɐƆ ǝzuoɹᗺ 9 ʇsɐǝן ʇɐ sǝɹınbǝᴚ ˙ǝbⱯ ɯɐǝʇS ǝɥʇ ʇɐ ɹǝʇןǝɯS ıʇןnW Ɐ", - "gtceu.multiblock.subtick_parallels": "buıʞɔoןɔɹǝʌO ɯoɹɟ x%d -", - "gtceu.multiblock.title": "uɹǝʇʇɐԀ ʞɔoןqıʇןnW", - "gtceu.multiblock.total_runs": "ǝɔuo ʇɐ sǝdıɔǝᴚ %d buıɯɹoɟɹǝԀ", - "gtceu.multiblock.turbine.efficiency": "%s%% :ʎɔuǝıɔıɟɟƎ ǝuıqɹn⟘", - "gtceu.multiblock.turbine.efficiency_tooltip": "˙ㄥ§ᄅ ʎq ʇ/∩Ǝ sǝıןdıʇןnɯ puɐ ʎɔuǝıɔıɟɟǝ %%0Ɩɟ§ sppɐ ㄥ§%s ǝʌoqɐ ɹǝpןoH ɹoʇoᴚ ɥɔɐƎ", - "gtceu.multiblock.turbine.energy_per_tick": "ʇ/∩Ǝ %s/%s :ʇndʇnO ʎbɹǝuƎ", - "gtceu.multiblock.turbine.energy_per_tick_maxed": "ʇ/∩Ǝ %s :ʇndʇnO ʎbɹǝuƎ", - "gtceu.multiblock.turbine.fuel_amount": ")%s( Ꞁ%s :ʇunoɯⱯ ןǝnℲ", - "gtceu.multiblock.turbine.fuel_needed": "sʞɔıʇ %s ɹǝd %s sǝɯnsuoƆ", - "gtceu.multiblock.turbine.obstructed": "pǝʇɔnɹʇsqO ǝɔɐℲ ǝuıqɹn⟘", - "gtceu.multiblock.turbine.rotor_durability": "%s%% :ʎʇıןıqɐɹnᗡ ɹoʇoᴚ", - "gtceu.multiblock.turbine.rotor_speed": "WԀᴚ %s/%s :pǝǝdS ɹoʇoᴚ", - "gtceu.multiblock.universal.distinct": ":sǝsnᗺ ʇɔuıʇsıᗡ", - "gtceu.multiblock.universal.distinct.info": "˙ɔʇǝ 'sǝdɐɥS ɹǝpnɹʇxƎ 'sʇınɔɹıƆ pǝɯɯɐɹboɹԀ ǝʞıן sbuıɥʇ ɹoɟ ןnɟǝs∩ ˙dnʞooן ǝdıɔǝɹ ɹoɟ ɹǝɥʇo ɥɔɐǝ ɯoɹɟ ʇɔuıʇsıp ʎןןnɟ sɐ pǝʇɐǝɹʇ ǝq ןןıʍ snᗺ ʇnduI ɯǝʇI ɥɔɐǝ 'pǝןqɐuǝ ɟI", - "gtceu.multiblock.universal.distinct.no": "oN", - "gtceu.multiblock.universal.distinct.yes": "sǝʎ", - "gtceu.multiblock.universal.has_problems": "¡sɯǝןqoɹԀ ǝɔuɐuǝʇuıɐW sɐH", - "gtceu.multiblock.universal.has_problems_header": ":ɥɔʇɐH ǝɔuɐuǝʇuıɐW ɐ uı sǝnssı buıʍoןןoɟ ǝɥʇ xıℲ", - "gtceu.multiblock.universal.muffler_obstructed": "¡pǝʇɔnɹʇsqO sı ɥɔʇɐH ɹǝןɟɟnW", - "gtceu.multiblock.universal.muffler_obstructed.tooltip": "˙ʇı ɟo ʇuoɹɟ uı ǝɔɐdsɹıɐ ɟo ʞɔoןq ɐ ǝʌɐɥ ʇsnɯ ɥɔʇɐH ɹǝןɟɟnW", - "gtceu.multiblock.universal.no_problems": "¡sɯǝןqoɹԀ ǝɔuɐuǝʇuıɐW oN", - "gtceu.multiblock.universal.problem.crowbar": ")ㄥ§ɹɐqʍoɹƆɐ§( ˙ǝɹǝɥʇ buoןǝq ʇ,usǝop ʇɐɥ⟘ㄥ§", - "gtceu.multiblock.universal.problem.hard_hammer": ")ㄥ§ɹǝɯɯɐH pɹɐHɐ§( ˙pǝʇuǝp sı buıʇɐןԀㄥ§", - "gtceu.multiblock.universal.problem.screwdriver": ")ㄥ§ɹǝʌıɹpʍǝɹɔSɐ§( ˙ǝsooן ǝɹɐ sʍǝɹɔSㄥ§", - "gtceu.multiblock.universal.problem.soft_mallet": ")ㄥ§ʇǝןןɐW ʇɟoSɐ§( ˙ʞɔnʇs sı buıɥʇǝɯoSㄥ§", - "gtceu.multiblock.universal.problem.wire_cutter": ")ㄥ§ɹǝʇʇnƆ ǝɹıMɐ§( ˙ʇno pǝuɹnq sǝɹıMㄥ§", - "gtceu.multiblock.universal.problem.wrench": ")ㄥ§ɥɔuǝɹMɐ§( ˙ǝsooן sı ǝdıԀㄥ§", - "gtceu.multiblock.universal.rotor_obstructed": "¡pǝʇɔnɹʇsqO sı ɹoʇoᴚ", - "gtceu.multiblock.uv_fusion_reactor.description": "˙W0ㄣ9 ɟo ɯnɯıxɐɯ ɐ sɐɥ puɐ '∩Ǝ W0ㄣ ʎq sǝsɐǝɹɔuı ɹǝɟɟnq sʇı 'sɐɥ ʇı ɥɔʇɐH ʎɹǝʌǝ ɹoℲ ˙sǝɥɔʇɐH ʎbɹǝuƎ Λ∩ ǝsn ʎןuo uɐɔ ʇI ˙sǝuo ɹǝıʌɐǝɥ oʇuı sʇuǝɯǝןǝ buısnɟ ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ǝbɹɐן ɐ sı Ɛ ʞW ɹoʇɔɐǝᴚ uoısnℲ ǝɥ⟘", - "gtceu.multiblock.vacuum_freezer.description": "˙ɹǝʇɐM sɐ ɥɔns 'sǝɔuɐʇsqns ɹǝɥʇo ǝzǝǝɹɟ osןɐ uɐɔ ʇı 'ɹǝʌǝʍoH ˙sʇobuI ɹɐןnbǝɹ oʇuı sʇobuI ʇoH buızǝǝɹɟ ɹoɟ pǝsn ʎןuıɐɯ ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı ɹǝzǝǝɹℲ ɯnnɔɐΛ ǝɥ⟘", - "gtceu.multiblock.validation_failed": "˙sʇndʇno/sʇnduı ɟo ʇunoɯɐ pıןɐʌuI", - "gtceu.multiblock.waiting": "˙buıʇıɐʍ sı ǝuıɥɔɐW :⅁NINᴚⱯM", - "gtceu.multiblock.work_paused": "˙pǝsnɐԀ ʞɹoM", - "gtceu.multiblock.zpm_fusion_reactor.description": "˙W0ᄅƐ ɟo ɯnɯıxɐɯ ɐ sɐɥ puɐ '∩Ǝ W0ᄅ ʎq sǝsɐǝɹɔuı ɹǝɟɟnq sʇı 'sɐɥ ʇı ɥɔʇɐH ʎɹǝʌǝ ɹoℲ ˙sǝɥɔʇɐH ʎbɹǝuƎ Λ∩ puɐ WԀZ ǝsn ʎןuo uɐɔ ʇI ˙sǝuo ɹǝıʌɐǝɥ oʇuı sʇuǝɯǝןǝ buısnɟ ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ǝbɹɐן ɐ sı ᄅ ʞW ɹoʇɔɐǝᴚ uoısnℲ ǝɥ⟘", - "gtceu.oc.tooltip.0": "%s :uıW", - "gtceu.oc.tooltip.1": "ƆO ǝɥʇ ǝsɐǝɹɔuı oʇ ʞɔıןɔ ʇɟǝꞀ", - "gtceu.oc.tooltip.2": "ƆO ǝɥʇ ǝsɐǝɹɔǝp oʇ ʞɔıןɔ ʇɥbıᴚ", - "gtceu.oc.tooltip.3": "ƆO ǝɥʇ ʇǝsǝɹ oʇ ʞɔıןɔ ǝןppıW", - "gtceu.oc.tooltip.4": "ƆO ʇɔǝɟɹǝԀ ʎq ǝbuɐɥɔ oʇ ʇɟıɥS pןoH", - "gtceu.ore_washer": "ɹǝɥsɐM ǝɹO", - "gtceu.ownership.name.argonauts": "pןın⅁ sʇnɐuobɹⱯ", - "gtceu.ownership.name.ftb": "sɯɐǝ⟘ ᗺ⟘Ⅎ", - "gtceu.ownership.name.player": "ɹǝʎɐןԀ", - "gtceu.packer": "ɹǝʞɔɐԀ", - "gtceu.part_sharing.disabled": "pǝןqɐsıᗡㄣ§ buıɹɐɥS ʞɔoןqıʇןnW", - "gtceu.part_sharing.enabled": "pǝןqɐuƎɐ§ buıɹɐɥS ʞɔoןqıʇןnW", - "gtceu.placeholder_info.active.0": "˙ǝsıʍɹǝɥʇo 0 'ǝdıɔǝɹ ɐ buıuunɹ ʎןʇuǝɹɹnɔ sı oʇ pǝɥɔɐʇʇɐ sı ɹǝʌoɔ ǝɥʇ ʞɔoןq ǝɥʇ ɟı Ɩ ɐ suɹnʇǝᴚ", - "gtceu.placeholder_info.active.1": ":ǝbɐs∩", - "gtceu.placeholder_info.active.2": "ǝdıɔǝɹ buıuunɹ ʎןʇuǝɹɹnɔ ɐ s,ǝɹǝɥʇ ɹǝɥʇǝɥʍ >- }ǝʌıʇɔɐ{ ", - "gtceu.placeholder_info.ae2crafting.0": "˙uo sı ɹǝʌoɔ sıɥʇ ʞɔoןq ǝɥʇ ɟo ʞɹoʍʇǝu ƎW ǝɥʇ uı buıʇɟɐɹɔ-oʇnɐ ʇnoqɐ uoıʇɐɯɹoɟuı suɹnʇǝᴚ", - "gtceu.placeholder_info.ae2crafting.1": ":ǝbɐs∩", - "gtceu.placeholder_info.ae2crafting.10": "ǝןpı sı ∩ԀƆ ǝɥʇ ɟı 0 ɹo ')spuoɔǝsouɐu uı( ʇɟɐɹɔ ǝɥʇ ɟo ʇɹɐʇs ǝɥʇ ɯoɹɟ pǝsdɐןǝ ǝɯıʇ ɟo ʇunoɯɐ ǝɥʇ >- }ǝɯıʇ >xǝpuı< ʇǝb buıʇɟɐɹɔᄅǝɐ{ ", - "gtceu.placeholder_info.ae2crafting.2": "ʞɹoʍʇǝu ƎW ǝɥʇ uı s∩ԀƆ buıʇɟɐɹɔ ɟo ʇunoɯɐ ǝɥʇ >- }ʇunoɯɐ ʇǝb buıʇɟɐɹɔᄅǝɐ{ ", - "gtceu.placeholder_info.ae2crafting.3": "sɐɥ ∩ԀƆ pǝıɟıɔǝds ǝɥʇ ǝbɐɹoʇs buıʇɟɐɹɔ ɟo ʇunoɯɐ ǝɥʇ >- }ǝbɐɹoʇs >xǝpuı< ʇǝb buıʇɟɐɹɔᄅǝɐ{ ", - "gtceu.placeholder_info.ae2crafting.4": "sɐɥ ∩ԀƆ pǝıɟıɔǝds ǝɥʇ sɹossǝɔoɹd-oɔ ɟo ʇunoɯɐ ǝɥʇ >- }spɐǝɹɥʇ >xǝpuı< ʇǝb buıʇɟɐɹɔᄅǝɐ{ ", - "gtceu.placeholder_info.ae2crafting.5": "∩ԀƆ buıʇɟɐɹɔ pǝıɟıɔǝds ǝɥʇ ɟo ǝɯɐu ǝɥʇ >- }ǝɯɐu >xǝpuı< ʇǝb buıʇɟɐɹɔᄅǝɐ{ ", - "gtceu.placeholder_info.ae2crafting.6": ")sʇsǝnbǝɹ ɥʇoq ɹo ɔıʇɐɯoʇnɐ 'ןɐnuɐɯ ɹoɟ pǝsn( ∩ԀƆ buıʇɟɐɹɔ pǝıɟıɔǝds ǝɥʇ ɟo ǝpoɯ uoıʇɔǝןǝs ǝɥʇ >- }ǝpoWuoıʇɔǝןǝs >xǝpuı< ʇǝb buıʇɟɐɹɔᄅǝɐ{ ", - "gtceu.placeholder_info.ae2crafting.7": "ǝןpı sı ∩ԀƆ ǝɥʇ ɟı 0 ɹo 'pǝʇsǝnbǝɹ sɐʍ ʇɐɥʇ ɯǝʇı ǝɥʇ ɟo ʇunoɯɐ ǝɥʇ >- }ʇunoɯɐ >xǝpuı< ʇǝb buıʇɟɐɹɔᄅǝɐ{ ", - "gtceu.placeholder_info.ae2crafting.8": "ǝןpı sı ∩ԀƆ ǝɥʇ ɟı 0 ɹo 'pǝʇsǝnbǝɹ sɐʍ ʇɐɥʇ ɯǝʇı ǝɥʇ ɟo ǝɯɐu ʎɐןdsıp ǝɥʇ >- }ɯǝʇı >xǝpuı< ʇǝb buıʇɟɐɹɔᄅǝɐ{ ", - "gtceu.placeholder_info.ae2crafting.9": "ǝןpı sı ∩ԀƆ ǝɥʇ ɟı 0 ɹo 'ssǝɹboɹd qoظ buıʇɟɐɹɔ ǝɥʇ >- }ssǝɹboɹd >xǝpuı< ʇǝb buıʇɟɐɹɔᄅǝɐ{ ", - "gtceu.placeholder_info.ae2energy.0": "˙uo sı ɹǝʌoɔ sıɥʇ ʞɔoןq ǝɥʇ ɟo ʞɹoʍʇǝu ƎW ǝɥʇ uı pǝɹoʇs ʎןʇuǝɹɹnɔ ʎbɹǝuǝ ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.ae2energy.1": ":ǝbɐs∩", - "gtceu.placeholder_info.ae2energy.2": ")sʇıun ƎⱯ uı( ʞɹoʍʇǝu ƎW ǝɥʇ uı ʎbɹǝuǝ ǝɥʇ >- }ʎbɹǝuǝᄅǝɐ{ ", - "gtceu.placeholder_info.ae2fluidCount.0": "˙oʇ pǝɥɔɐʇʇɐ sı ɹǝʌoɔ sıɥʇ ʞɔoןq ǝɥʇ ɟo ʞɹoʍʇǝu ƎW ǝɥʇ uı sɯǝʇı sʇunoɔ ʇnq 'ʇunoƆpınןɟ sɐ ǝɯɐS", - "gtceu.placeholder_info.ae2fluidCount.1": "¡bɐן ǝsnɐɔ ʎɐɯ spınןɟ ןןɐ buıʇunoɔ ʇɐɥʇ ǝʇoN", - "gtceu.placeholder_info.ae2fluidCount.2": ":ǝbɐs∩", - "gtceu.placeholder_info.ae2fluidCount.3": "pǝıɟıɔǝds ɟı pIpınןɟ ɥʇıʍ pınןɟ ǝɥʇ ɹo 'spınןɟ ןןɐ ɟo ʇunoɯɐ ǝɥʇ >- }]pIpınןɟ[ ʇunoƆpınןɟ{ ", - "gtceu.placeholder_info.ae2itemCount.0": "˙oʇ pǝɥɔɐʇʇɐ sı ɹǝʌoɔ sıɥʇ ʞɔoןq ǝɥʇ ɟo ʞɹoʍʇǝu ƎW ǝɥʇ uı sɯǝʇı sʇunoɔ ʇnq 'ʇunoƆɯǝʇı sɐ ǝɯɐS", - "gtceu.placeholder_info.ae2itemCount.1": "¡bɐן ǝsnɐɔ ʎɐɯ sɯǝʇı ןןɐ ɹo ɹǝʇןıɟ ʎq buıʇunoɔ ʇɐɥʇ ǝʇoN", - "gtceu.placeholder_info.ae2itemCount.2": ":ǝbɐs∩", - "gtceu.placeholder_info.ae2itemCount.3": "ʇunoɯɐ ɯǝʇı ןɐʇoʇ >- }ʇunoƆɯǝʇı{ ", - "gtceu.placeholder_info.ae2itemCount.4": "pı‾ɯǝʇı oʇ ןɐnbǝ spı ɥʇıʍ sɯǝʇı ɟo ʇunoɯɐ >- }>pı‾ɯǝʇı< ʇunoƆɯǝʇı{ ", - "gtceu.placeholder_info.ae2itemCount.5": "ɹǝʌoɔ sıɥʇ ɟo ʇoןs pǝıɟıɔǝds uı ɹǝʇןıɟ buıɥɔʇɐɯ sɯǝʇı ɟo ʇunoɯɐ >- }>pı‾ʇoןs< ɹǝʇןıɟ ʇunoƆɯǝʇı{ ", - "gtceu.placeholder_info.ae2maxPower.0": "˙uo sı ɹǝʌoɔ sıɥʇ ʞɔoןq ǝɥʇ ɟo ʞɹoʍʇǝu ƎW ǝɥʇ ɟo ʎʇıɔɐdɐɔ ʎbɹǝuǝ ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.ae2maxPower.1": ":ǝbɐs∩", - "gtceu.placeholder_info.ae2maxPower.2": "ʞɹoʍʇǝu ƎW ǝɥʇ ɟo ʎʇıɔɐdɐɔ ʎbɹǝuǝ ǝɥʇ >- }ɹǝʍoԀxɐɯᄅǝɐ{ ", - "gtceu.placeholder_info.ae2powerUsage.0": "˙uo sı ɹǝʌoɔ sıɥʇ ʞɔoןq ǝɥʇ ɟo ʞɹoʍʇǝu ƎW ǝɥʇ ɟo uoıʇdɯnsuoɔ ʎbɹǝuǝ ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.ae2powerUsage.1": ":ǝbɐs∩", - "gtceu.placeholder_info.ae2powerUsage.2": "ʞɹoʍʇǝu ƎW ǝɥʇ ɟo uoıʇdɯnsuoɔ ʎbɹǝuǝ ǝɥʇ >- }ǝbɐs∩ɹǝʍodᄅǝɐ{ ", - "gtceu.placeholder_info.ae2spatial.0": "˙uo sı ɹǝʌoɔ sıɥʇ ʞɔoןq ǝɥʇ ɟo ʞɹoʍʇǝu ƎW ǝɥʇ uı O/I ןɐıʇɐds ʇnoqɐ uoıʇɐɯɹoɟuı suɹnʇǝᴚ", - "gtceu.placeholder_info.ae2spatial.1": ":ǝbɐs∩", - "gtceu.placeholder_info.ae2spatial.2": "O/I ןɐıʇɐds ǝʇɐıʇıuı oʇ pǝɹınbǝɹ ɹǝʍod ɟo ʇunoɯɐ ǝɥʇ >- }ɹǝʍod ןɐıʇɐdsᄅǝɐ{ ", - "gtceu.placeholder_info.ae2spatial.3": ")SԀS( ǝɹnʇɔnɹʇS ʇuǝɯuıɐʇuoƆ ןɐıʇɐdS ǝɥʇ ɟo ʎɔuǝıɔıɟɟǝ ǝɥʇ >- }ʎɔuǝıɔıɟɟǝ ןɐıʇɐdsᄅǝɐ{ ", - "gtceu.placeholder_info.ae2spatial.4": "),}Zǝzıs{x}ʎǝzıs{x}Xǝzıs{ :ǝzıS, :ǝןdɯɐxǝ( sıxɐ pǝıɟıɔǝds ǝɥʇ buoןɐ SԀS ǝɥʇ ɟo ǝzıs ǝɥʇ >- }>Z|ʎ|X<ǝzıs ןɐıʇɐdsᄅǝɐ{ ", - "gtceu.placeholder_info.amperage.0": "˙uo sı ɹǝʌoɔ ǝɥʇ ǝןqɐɔ/ǝɹıʍ ǝɥʇ uı ǝbɐɹǝdɯɐ ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.amperage.1": ":ǝbɐs∩", - "gtceu.placeholder_info.amperage.2": "ǝןqɐɔ/ǝɹıʍ ǝɥʇ uı ǝʇɐɹǝdɯɐ ǝɥʇ >- }ǝbɐɹǝdɯɐ{ ", - "gtceu.placeholder_info.bf.0": ":ǝbɐs∩", - "gtceu.placeholder_info.bf.1": "buıɹʇs ʎʇdɯǝ >- }>ǝpoɔ< >xǝpuı‾ʇoןs‾ɯǝʇı‾ɐʇɐp< ɟq{ ", - "gtceu.placeholder_info.block.0": "˙)█( ןoqɯʎs ʞɔoןq ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.block.1": ":ǝbɐs∩", - "gtceu.placeholder_info.block.2": ",█, >- }ʞɔoןq{ ", - "gtceu.placeholder_info.blockNbt.0": "ʎʇıʇuǝ ʞɔoןq ǝɥʇ ɟo ⟘ᗺN ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.blockNbt.1": ":ǝbɐs∩", - "gtceu.placeholder_info.blockNbt.2": "ʇqu ʎʇıʇuǝ ʞɔoןq ןןnɟ >- }ʇqNʞɔoןq{ ", - "gtceu.placeholder_info.blockNbt.3": "ʇqu ǝɥʇ ɟo ʇɹɐd >- }˙˙˙ ]ᄅʎǝʞ[ ]Ɩʎǝʞ[ ʇqNʞɔoןq{ ", - "gtceu.placeholder_info.bufferText.0": "ʇɟɐɹƆɹǝʇndɯoƆ ʎq ǝןqıssǝɔɔɐ ɹǝɟɟnq ɐ ɯoɹɟ ʇxǝʇ ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.bufferText.1": ":ǝbɐs∩", - "gtceu.placeholder_info.bufferText.2": ")00Ɩ-Ɩ sı ǝuıן( ǝuıן pǝıɟıɔǝds ǝɥʇ uo ɹǝɟɟnq ǝɥʇ ɯoɹɟ ʇxǝʇ >- }>ǝuıן< ʇxǝ⟘ɹǝɟɟnq{ ", - "gtceu.placeholder_info.calc.0": "˙uoıʇɐɹǝdo ɹo uoıʇɔunɟ ɥʇɐɯ ɐ ɟo ʇןnsǝɹ ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.calc.1": ":ǝbɐs∩", - "gtceu.placeholder_info.calc.2": "buıɹʇs‾ʎuɐ >- }>buıɹʇs‾ʎuɐ< ɔןɐɔ{ ", - "gtceu.placeholder_info.calc.3": "uoıʇɐɹǝdo pǝıɟıɔǝds ǝɥʇ ɟo ʇןnsǝɹ ǝɥʇ >- }>bɹɐ< >~|ʇɹbs|ןıǝɔ|ɹooןɟ|punoɹ< ɔןɐɔ{ ", - "gtceu.placeholder_info.calc.4": "uoıʇɐɹǝdo pǝıɟıɔǝds ǝɥʇ ɟo ʇןnsǝɹ ǝɥʇ >- }>bɹɐ‾puoɔǝs< >%|<<|>>|//|/|*|-|+< >bɹɐ‾ʇsɹıɟ< ɔןɐɔ{ ", - "gtceu.placeholder_info.click.0": "ʞɔıʇ ʇuǝɹɹnɔ ǝɥʇ ǝɹoɟǝq pǝʞɔıןɔ sɐʍ ɹoʇıuoɯ pǝɔuɐʌpɐ pǝʇǝbɹɐʇ ǝɥʇ ɹǝɥʇǝɥʍ suɹnʇǝᴚ", - "gtceu.placeholder_info.click.1": ":ǝbɐs∩", - "gtceu.placeholder_info.click.2": "ǝsıʍɹǝɥʇo \"0\" 'pǝʞɔıןɔ sɐʍ ɹoʇıuoɯ pǝɔuɐʌpɐ pǝʇǝbɹɐʇ ǝɥʇ ɟı \"Ɩ\" >- }ʞɔıןɔ{ ", - "gtceu.placeholder_info.click.3": ")Ɩ puɐ 0 uǝǝʍʇǝq( ʞɔıןɔ ʇsɐן ǝɥʇ ɟo uoıʇısod x ǝɥʇ >- }x ʞɔıןɔ{ ", - "gtceu.placeholder_info.click.4": ")Ɩ puɐ 0 uǝǝʍʇǝq( ʞɔıןɔ ʇsɐן ǝɥʇ ɟo uoıʇısod ʎ ǝɥʇ >- }ʎ ʞɔıןɔ{ ", - "gtceu.placeholder_info.cmd.0": "˙ʇndʇno ɹıǝɥʇ suɹnʇǝɹ puɐ spuɐɯɯoɔ ʇɟɐɹɔǝuıW sǝʇnɔǝxƎ", - "gtceu.placeholder_info.cmd.1": "˙ʇı ɥʇıʍ buıʞɔıןɔ-ʇɥbıɹ ʎq ɟןǝsɹnoʎ oʇ ɯǝʇı ɐʇɐp ʎuɐ puıq 'ɹǝʎɐןd ɐ oʇ punoq ɯǝʇı ɐʇɐp ɐ sǝɹınbǝᴚ", - "gtceu.placeholder_info.cmd.2": ":ǝbɐs∩", - "gtceu.placeholder_info.cmd.3": "ʇndʇno puɐɯɯoɔ >- }>puɐɯɯoɔ< >xǝpuı‾ʇoןs< pɯɔ{ ", - "gtceu.placeholder_info.cmp.0": "sʇuǝɯnbɹɐ s,ʇı uı uoıssǝɹdxǝ ǝɥʇ uo pǝsɐq 0 ɹo Ɩ ɐ suɹnʇǝᴚ", - "gtceu.placeholder_info.cmp.1": ":ǝbɐs∩", - "gtceu.placeholder_info.cmp.2": "=¡ '== '=< '=> '< '> ɟo ǝuo sı ɹoʇɐɹǝdo '0 ɹo Ɩ >- }>q< >ɹoʇɐɹǝdo< >ɐ< dɯɔ{ ", - "gtceu.placeholder_info.color.0": "˙pǝsn ǝq uɐɔ sɹoןoɔ ʇɐɥɔ ʇɟɐɹɔǝuıɯ ʇןnɐɟǝp ןןⱯ ˙ʇuǝɯnbɹɐ ʇsɹıɟ ǝɥʇ ɯoɹɟ ɹoןoɔ ǝɥʇ ɥʇıʍ pǝɹoןoɔ 'ʇuǝɯnbɹɐ puoɔǝs ǝɥʇ ɯoɹɟ ʇxǝʇ ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.color.1": ":ǝbɐs∩", - "gtceu.placeholder_info.color.2": "ʇxǝʇ pǝɹoןoɔ >- }>ʇxǝʇ< >ɹoןoɔ< ɹoןoɔ{ ", - "gtceu.placeholder_info.combine.0": ")sʇuǝɯnbɹɐ ǝɥʇ uǝǝʍʇǝq sǝɔɐds ןןɐ buıdɐɔsǝ ʎq( buıɹʇs ǝןbuıs ɐ oʇuı sʇuǝɯnbɹɐ s,ʇı ɟo ןןɐ sǝuıqɯoƆ", - "gtceu.placeholder_info.combine.1": "\"ouɯ \\ןʞظ \\ıɥb \\ɟǝp \\ɔqɐ\" >- }ouɯ ןʞظ ıɥb ɟǝp ɔqɐ ǝuıqɯoɔ{ :ǝןdɯɐxƎ", - "gtceu.placeholder_info.combine.2": ":ǝbɐs∩", - "gtceu.placeholder_info.combine.3": "sɹǝpןoɥǝɔɐןd ɹǝɥʇɹnɟ uı ʇuǝɯnbɹɐ ǝןbuıs ɐ sɐ pǝʇɐǝɹʇ ǝq ןןıʍ ʇɐɥʇ buıɹʇs ɐ >- }˙˙˙ ]Ɛbɹɐ[ ]ᄅbɹɐ[ ]Ɩbɹɐ[ ǝuıqɯoɔ{ ", - "gtceu.placeholder_info.count.0": ")\"0˙0\" =¡ \"0\" os 'sbuıɹʇs sɐ pǝɹɐdɯoɔ( ʇsɹıɟ ǝɥʇ oʇ ןɐnbǝ ǝɹɐ sʇuǝɯnbɹɐ pǝpıʌoɹd ǝɥʇ ɟo ʎuɐɯ ʍoɥ suɹnʇǝᴚ", - "gtceu.placeholder_info.count.1": ":ǝbɐs∩", - "gtceu.placeholder_info.count.2": "ʇsɹıɟ ǝɥʇ oʇ ןɐnbǝ ǝɹɐ ʇɐɥʇ sʇuǝɯnbɹɐ ɟo ʇunoɯɐ ǝɥʇ >- }˙˙˙ ]ㄣbɹɐ[ ]Ɛbɹɐ[ ]ᄅbɹɐ[ >Ɩbɹɐ< ʇunoɔ{ ", - "gtceu.placeholder_info.data.0": "˙sʇoןs ǝɥʇ ɟo ǝuo uı )ǝןnpoɯ/qɹo/ʞɔıʇs ɐʇɐp( ɯǝʇı ɐʇɐp ɐ ɯoɹɟ ɐʇɐp ǝɯos sǝʌǝıɹʇǝɹ ɹo sǝɹoʇS", - "gtceu.placeholder_info.data.1": "˙)ʇqu ɯǝʇı ɐʇɐp ǝɥʇ uı pǝɹoʇs sı ʇɐɥʇ )Ɩ - ʎʇıɔɐdɐɔ( oʇ 0 ɯoɹɟ ɹǝbǝʇuı uɐ sı d( d ǝnןɐʌ ǝɥʇ ɥʇıʍ pǝɔɐןdǝɹ ǝq ןןıʍ ʇı 'ʎʇdɯǝ ʇuǝɯnbɹɐ >xǝpuı< ǝɥʇ ǝʌɐǝן noʎ ɟI", - "gtceu.placeholder_info.data.2": "˙ɥɔʇɐɥ ɐʇɐp ɐ ǝpısuı ǝןnpoɯ ʇxǝʇ sıɥʇ ʎq pǝʇǝbɹɐʇ ʎןʇuǝɹɹnɔ sı ʇɐɥʇ ʞɔıʇs ɐʇɐp ǝɥʇ ǝʇɐןndıuɐɯ ןןıʍ ɹǝpןoɥǝɔɐןd sıɥʇ '0 oʇ ןɐnbǝ sı ʇuǝɯnbɹɐ ʇoןs ǝɥʇ ɟI", - "gtceu.placeholder_info.data.3": ":ǝbɐs∩", - "gtceu.placeholder_info.data.4": "ʇoןs pǝıɟıɔǝds ǝɥʇ uı ɯǝʇı ǝɥʇ uı pǝɹoʇs ɐʇɐp ǝɥʇ >- }>xǝpuı< >ʇoןs< ʇǝb ɐʇɐp{ ", - "gtceu.placeholder_info.data.5": "buıɹʇs ʎʇdɯǝ uɐ suɹnʇǝɹ 'ʇoןs pǝıɟıɔǝds ǝɥʇ uı ɯǝʇı ǝɥʇ uı pǝɹoʇs ɐʇɐp ǝɥʇ sʇǝs >- }>ǝnןɐʌ< >xǝpuı< >ʇoןs< ʇǝs ɐʇɐp{ ", - "gtceu.placeholder_info.data.6": "d >- }>ʇoןs< dʇǝb ɐʇɐp{ ", - "gtceu.placeholder_info.data.7": "buıɹʇs ʎʇdɯǝ uɐ suɹnʇǝɹ 'd sʇǝs >- }>ǝnןɐʌ< >ʇoןs< dʇǝs ɐʇɐp{ ", - "gtceu.placeholder_info.data.8": "0 oʇ d sʇǝs 'ʎʇıɔɐdɐɔ oʇ ןɐnbǝ ɹo uɐɥʇ ǝɹoɯ sǝɯoɔǝq d ɟı 'Ɩ ʎq d sʇuǝɯǝɹɔuı >- }>ʇoןs< ɔuı ɐʇɐp{ ", - "gtceu.placeholder_info.data.9": ")Ɩ - ʎʇıɔɐdɐɔ( oʇ d sʇǝs '0 uɐɥʇ ssǝן sǝɯoɔǝq d ɟı 'Ɩ ʎq d sʇuǝɯǝɹɔǝp >- }>ʇoןs< ɔǝp ɐʇɐp{ ", - "gtceu.placeholder_info.displayTarget.0": "˙ʞuıן ʎɐןdsıp ɐ buısn ɹǝʌoɔ sıɥʇ oʇ pǝʇʇıɯsuɐɹʇ sɐʍ ʇɐɥʇ ǝuıן pǝıɟıɔǝds ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.displayTarget.1": ":ǝbɐs∩", - "gtceu.placeholder_info.displayTarget.2": ")00Ɩ-Ɩ sı ɹǝqɯnu ǝuıן( ǝuıן pǝıɟıɔǝds ǝɥʇ uo ʇxǝʇ ǝɥʇ >- }>ɹǝqɯnu‾ǝuıן< ʇǝbɹɐ⟘ʎɐןdsıp{ ", - "gtceu.placeholder_info.ender.0": "sɹǝʌoɔ ʞuıן ɹǝpuǝ ɥʇıʍ sʇɔɐɹǝʇuI", - "gtceu.placeholder_info.ender.1": "ɹǝʎɐןd ɐ oʇ punoq ɯǝʇı ɐʇɐp ɐ ɥʇıʍ pǝpıʌoɹd ɟı sןǝuuɐɥɔ ǝʇɐʌıɹd ɥʇıʍ ʇɔɐɹǝʇuı uɐƆ", - "gtceu.placeholder_info.ender.10": ")buıɹʇs ʎʇdɯǝ '0 ʇou( ʎʇdɯǝ ʇɟǝן ǝq ʎɐɯ ʇuǝɯnbɹɐ ʇoןs‾ɯǝʇı‾ɐʇɐp‾ɹǝʎɐןd ǝɥ⟘", - "gtceu.placeholder_info.ender.2": ":ǝbɐs∩", - "gtceu.placeholder_info.ender.3": "ʇunoɔ ɯǝʇı >- }]ʇoןs‾ɯǝʇı‾ɐʇɐp‾ɹǝʎɐןd[ >ןǝuuɐɥɔ< ɯǝʇı ɹǝpuǝ{ ", - "gtceu.placeholder_info.ender.4": "ɹǝɟɟnq s,ʞuıן ɹǝpuǝ ǝɥʇ ɯoɹɟ ɯǝʇı Ɩ ןןnd >- }]ʇoןs‾ɯǝʇı‾ɐʇɐp‾ɹǝʎɐןd[ >ןǝuuɐɥɔ< ןןnԀɯǝʇı ɹǝpuǝ{ ", - "gtceu.placeholder_info.ender.5": "ɹǝɟɟnq s,ʞuıן ɹǝpuǝ ǝɥʇ oʇ ɯǝʇı Ɩ ɥsnd >- }]ʇoןs‾ɯǝʇı‾ɐʇɐp‾ɹǝʎɐןd[ >ןǝuuɐɥɔ< ɥsnԀɯǝʇı ɹǝpuǝ{ ", - "gtceu.placeholder_info.ender.6": ")\"ʇɹıp:ʇɟɐɹɔǝuıɯ 9ᄅ\" ˙xǝ( ɹǝɟɟnq s,ʞuıן ɹǝpuǝ ǝɥʇ uı ɯǝʇı ǝɥʇ ɟo pı ǝɥʇ >- }]ʇoןs‾ɯǝʇı‾ɐʇɐp‾ɹǝʎɐןd[ >ןǝuuɐɥɔ< pIɯǝʇı ɹǝpuǝ{ ", - "gtceu.placeholder_info.ender.7": "ʇunoɔ pınןɟ >- }]ʇoןs‾ɯǝʇı‾ɐʇɐp‾ɹǝʎɐןd[ >ןǝuuɐɥɔ< pınןɟ ɹǝpuǝ{ ", - "gtceu.placeholder_info.ender.8": "ןǝʌǝן ןɐubıs ǝuoʇspǝɹ >- ]ʇoןs‾ɯǝʇı‾ɐʇɐp‾ɹǝʎɐןd[ >ןǝuuɐɥɔ< ǝuoʇspǝɹ ɹǝpuǝ{ ", - "gtceu.placeholder_info.ender.9": "buıɹʇs ʎʇdɯǝ suɹnʇǝɹ 'ʞuıן ǝuoʇspǝɹ ɹǝpuǝ ǝɥʇ oʇ pǝʇndʇno ןɐubıs ǝuoʇspǝɹ ǝɥʇ sʇǝs >- >ןɐubıs< >ʇoןs‾ɯǝʇı‾ɐʇɐp‾ɹǝʎɐןd< >ןǝuuɐɥɔ< ǝuoʇspǝɹ ɹǝpuǝ{ ", - "gtceu.placeholder_info.energy.0": "˙pǝɹoʇs ʎbɹǝuǝ ɟo ʇunoɯɐ ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.energy.1": ":ǝbɐs∩", - "gtceu.placeholder_info.energy.2": "pǝɹoʇs ʎbɹǝuǝ ɟo ʇunoɯɐ ǝɥʇ >- }ʎbɹǝuǝ{ ", - "gtceu.placeholder_info.energyCapacity.0": "pǝɹoʇs ǝq uɐɔ ʇɐɥʇ ʎbɹǝuǝ ɟo ʇunoɯɐ xɐɯ ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.energyCapacity.1": ":ǝbɐs∩", - "gtceu.placeholder_info.energyCapacity.2": "ʎʇıɔɐdɐɔ ʎbɹǝuǝ ǝɥʇ >- }ʎʇıɔɐdɐƆʎbɹǝuǝ{", - "gtceu.placeholder_info.eval.0": "sɹǝpןoɥǝɔɐןd ʎɐɯ ɥɔıɥʍ buıɹʇs pǝpıʌoɹd ǝɥʇ buıʇɐnןɐʌǝ ɟo ʇןnsǝɹ ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.eval.1": ":ǝbɐs∩", - "gtceu.placeholder_info.eval.2": "bɟǝpɔqɐ >- }bɟǝpɔqɐ ןɐʌǝ{ ", - "gtceu.placeholder_info.eval.3": " ɐ ɐ ɐ ɐ ɐ :ɐ buıʇɐǝdǝɹ >- \"}\"\\ ɐ\"\\ ϛ ʇɐǝdǝɹ{ :ɐ buıʇɐǝdǝɹ\" ןɐʌǝ{ ", - "gtceu.placeholder_info.eval.4": "}ʇxǝʇ ɯopuɐɹ ǝɯos{ >- \"\\\"}ʇxǝʇ ɯopuɐɹ ǝɯos{\"\"\\ ןɐʌǝ{ ", - "gtceu.placeholder_info.eval.5": "ʇxǝʇ ǝɹoɯ }sǝɔɐds ɥʇıʍ buıɥʇǝɯos{ ʇxǝʇ >- \"ʇxǝʇ ǝɹoɯ \"\"\\\"}sǝɔɐds ɥʇıʍ buıɥʇǝɯos{\"\"\\\" ʇxǝʇ\" ןɐʌǝ{ ", - "gtceu.placeholder_info.fluidCount.0": "˙)pǝɹǝʇןıɟ ǝq uɐɔ( spınןɟ ɟo ʇunoɯɐ ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.fluidCount.1": ":ǝbɐs∩", - "gtceu.placeholder_info.fluidCount.2": "pǝıɟıɔǝds ɟı pIpınןɟ ɥʇıʍ pınןɟ ǝɥʇ ɹo 'spınןɟ ןןɐ ɟo ʇunoɯɐ ǝɥʇ >- }]pIpınןɟ[ ʇunoƆpınןɟ{ ", - "gtceu.placeholder_info.formatInt.0": "ɹǝbǝʇuı pǝpıʌoɹd ǝɥʇ ɟo uoıʇɐʇuǝsǝɹdǝɹ buıɹʇs ɐ suɹnʇǝᴚ", - "gtceu.placeholder_info.formatInt.1": "Wㄣᄅ˙Ɩ >- }ㄥϛㄣ9ƐᄅƖ ʇuIʇɐɯɹoɟ{ :ǝןdɯɐxƎ", - "gtceu.placeholder_info.formatInt.2": ":ǝbɐs∩", - "gtceu.placeholder_info.formatInt.3": "ʇuı ǝɥʇ ɟo uoıʇɐʇuǝsǝɹdǝɹ buıɹʇs >- }>bɹɐ< ʇuIʇɐɯɹoɟ{ ", - "gtceu.placeholder_info.fromAscii.0": "ǝpoɔ IIƆSⱯ pǝpıʌoɹd ǝɥʇ ʎq pǝʇuǝsǝɹdǝɹ ɹǝʇɔɐɹɐɥɔ ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.fromAscii.1": ":ǝbɐs∩", - "gtceu.placeholder_info.fromAscii.2": "ɹǝʇɔɐɹɐɥɔ ɐ >- }>ǝpoɔ‾ɹɐɥɔ< ııɔsⱯɯoɹɟ{ ", - "gtceu.placeholder_info.if.0": "˙0 oʇ ןɐnbǝ ʇou sı puɐ buıɹʇs ʎʇdɯǝ uɐ ʇou sı ʇı ɟı ǝnɹʇ pǝɹǝpısuoɔ sı uoıʇıpuoɔ ǝɥ⟘ ˙uoıʇıpuoɔ ǝɥʇ uo buıpuǝdǝp sʇuǝɯnbɹɐ ǝɥʇ ɟo ǝuo suɹnʇǝᴚ", - "gtceu.placeholder_info.if.1": ":ǝbɐs∩", - "gtceu.placeholder_info.if.2": "}]ǝsןɐɟ‾ɟı‾pǝuɹnʇǝɹ[ >ǝnɹʇ‾ɟı‾pǝuɹnʇǝɹ< >uoıʇıpuoɔ< ɟı{ ", - "gtceu.placeholder_info.item.0": "ʇoןs pǝıɟıɔǝds ɐ uı ɯǝʇı ǝɥʇ ɟo pı puɐ ʇunoɯɐ ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.item.1": ":ǝbɐs∩", - "gtceu.placeholder_info.item.2": ")ǝןdɯɐxǝ ɹoɟ( \"puoɯɐıp:ʇɟɐɹɔǝuıɯ ƖƐ\" >- }>ʇoןs< ɯǝʇı{ ", - "gtceu.placeholder_info.itemCount.0": "˙)pǝɹǝʇןıɟ ǝq uɐɔ( sɯǝʇı ɟo ʇunoɯɐ ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.itemCount.1": ":ǝbɐs∩", - "gtceu.placeholder_info.itemCount.2": "ʇunoɯɐ ɯǝʇı ןɐʇoʇ >- }ʇunoƆɯǝʇı{ ", - "gtceu.placeholder_info.itemCount.3": "pı‾ɯǝʇı oʇ ןɐnbǝ spı ɥʇıʍ sɯǝʇı ɟo ʇunoɯɐ >- }>pı‾ɯǝʇı< ʇunoƆɯǝʇı{ ", - "gtceu.placeholder_info.itemCount.4": "ɹǝʌoɔ sıɥʇ ɟo ʇoןs pǝıɟıɔǝds uı ɹǝʇןıɟ buıɥɔʇɐɯ sɯǝʇı ɟo ʇunoɯɐ >- }>pı‾ʇoןs< ɹǝʇןıɟ ʇunoƆɯǝʇı{ ", - "gtceu.placeholder_info.maintenance.0": "˙ǝsıʍɹǝɥʇo 0 'oʇ pǝɥɔɐʇʇɐ sı ɹǝʌoɔ ǝɥʇ ʞɔoןq ǝɥʇ uı sɯǝןqoɹd ǝɔuɐuǝʇuıɐɯ ǝɹɐ ǝɹǝɥʇ ɟı Ɩ ɐ suɹnʇǝᴚ", - "gtceu.placeholder_info.maintenance.1": ",}ʞO ᗡƎᴚI∩ὉƎᴚ \\⅁NIXIℲ }ǝɔuɐuǝʇuıɐɯ{ ɟı{ :snʇɐʇs ǝɔuɐuǝʇuıɐW, :ǝןdɯɐxƎ", - "gtceu.placeholder_info.maintenance.2": ":ǝbɐs∩", - "gtceu.placeholder_info.maintenance.3": "sɯǝןqoɹd ǝɔuɐuǝʇuıɐɯ ǝɹɐ ǝɹǝɥʇ ɹǝɥʇǝɥʍ >- }ǝɔuɐuǝʇuıɐɯ{ ", - "gtceu.placeholder_info.maxProgress.0": "˙oʇ pǝɥɔɐʇʇɐ sı ɹǝʌoɔ sıɥʇ ʞɔoןq ǝɥʇ ɟo ǝdıɔǝɹ buıuunɹ ʎןʇuǝɹɹnɔ ǝɥʇ ɟo ssǝɹboɹd ɯnɯıxɐɯ ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.maxProgress.1": ",%}00Ɩ * }}ssǝɹboɹԀxɐɯ{ / }ssǝɹboɹd{ ɔןɐɔ{ ɔןɐɔ{ :ssǝɹboɹԀ, :ǝןdɯɐxƎ", - "gtceu.placeholder_info.maxProgress.2": ":ǝbɐs∩", - "gtceu.placeholder_info.maxProgress.3": "ǝdıɔǝɹ buıuunɹ ʎןʇuǝɹɹnɔ ǝɥʇ ɟo ssǝɹboɹd xɐɯ ǝɥʇ >- }ssǝɹboɹԀxɐɯ{ ", - "gtceu.placeholder_info.module.0": ")ɹǝʌoɔ ɐ uı ʞɹoʍ ʇou sǝop( ɹoʇıuoɯ ןɐɹʇuǝɔ ǝɥʇ oʇuo ʇoןs pǝıɟıɔǝds ǝɥʇ uı ǝןnpoɯ ǝɥʇ sɹǝpuǝᴚ", - "gtceu.placeholder_info.module.1": ":ǝbɐs∩", - "gtceu.placeholder_info.module.2": "buıɹʇs ʎʇdɯǝ >- }>ʎ< >x< >ʇoןs< ǝןnpoɯ{ ", - "gtceu.placeholder_info.nbt.0": "ʇoןs pǝıɟıɔǝds ǝɥʇ uı ɯǝʇı ǝɥʇ ɟo ɐʇɐp ʇqu ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.nbt.1": ":ǝbɐs∩", - "gtceu.placeholder_info.nbt.2": "]˙˙˙[]Ɛʎǝʞ[]ᄅʎǝʞ[]Ɩʎǝʞ[ʇqu‾ɯǝʇı >- }˙˙˙ ]Ɛʎǝʞ[ ]ᄅʎǝʞ[ ]Ɩʎǝʞ[ >ʇoןs< ʇqu{ ", - "gtceu.placeholder_info.obf.0": "˙pǝʇɐɔsnɟqo 'ʇuǝɯnbɹɐ ʇsɹıɟ ǝɥʇ ɯoɹɟ ʇxǝʇ ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.obf.1": ":ǝbɐs∩", - "gtceu.placeholder_info.obf.2": "ʇxǝʇ pǝʇɐɔsnɟqo >- }>ʇxǝʇ< ɟqo{ ", - "gtceu.placeholder_info.previousText.0": "˙)buıddɐɹʍ-ǝuıן ǝɹoɟǝq( ǝuıן pǝıɟıɔǝds ǝɥʇ ʇɐ ɹǝʌoɔ sıɥʇ ʎq pǝʎɐןdsıp ʎןsnoıʌǝɹd sɐʍ ʇɐɥʇ ʇxǝʇ ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.previousText.1": ":ǝbɐs∩", - "gtceu.placeholder_info.previousText.2": ")Ɩ ʇɐ sʇɹɐʇs xǝpuı( ǝuıן pǝıɟıɔǝds ǝɥʇ uo pǝʎɐןdsıp ʎןsnoıʌǝɹd ʇxǝʇ ǝɥʇ >- }>ǝuıן< ʇxǝ⟘snoıʌǝɹd{ ", - "gtceu.placeholder_info.progress.0": "˙oʇ pǝɥɔɐʇʇɐ sı ɹǝʌoɔ sıɥʇ ʞɔoןq ǝɥʇ ɟo ǝdıɔǝɹ buıuunɹ ʎןʇuǝɹɹnɔ ǝɥʇ ɟo ssǝɹboɹd ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.progress.1": "}ssǝɹboɹԀxɐɯ{ puɐ 0 uǝǝʍʇǝq ɹǝbǝʇuı uɐ sı ssǝɹboɹd ʇɐɥʇ ǝʇoN", - "gtceu.placeholder_info.progress.2": ":ǝbɐs∩", - "gtceu.placeholder_info.progress.3": "ǝdıɔǝɹ buıuunɹ ʎןʇuǝɹɹnɔ ǝɥʇ ɟo ssǝɹboɹd ǝɥʇ >- }ssǝɹboɹd{ ", - "gtceu.placeholder_info.quad.0": ")sǝɔıʇɹǝʌ ㄣ ןןɐ ɹoɟ sɹǝʇǝɯɐɹɐd ʎɟıɔǝds ʇsnɯ( pɐnb ɐ sʍɐɹᗡ", - "gtceu.placeholder_info.quad.1": ":ǝbɐs∩", - "gtceu.placeholder_info.quad.2": "buıɹʇs ʎʇdɯǝ >- }>ㄣɹoןoɔ< >Ɛɹoןoɔ< >ᄅɹoןoɔ< >Ɩɹoןoɔ< >ㄣʎ< >ㄣx< >Ɛʎ< >Ɛx< >ᄅʎ< >ᄅx< >Ɩʎ< >Ɩx< pɐnb{ ", - "gtceu.placeholder_info.random.0": "˙)ǝʌısnןɔuı( ןɐʌɹǝʇuı pǝıɟıɔǝds ǝɥʇ uı ɹǝqɯnu ɯopuɐɹ ɐ suɹnʇǝᴚ", - "gtceu.placeholder_info.random.1": ":ǝbɐs∩", - "gtceu.placeholder_info.random.2": ")ǝʌısnןɔuı( xɐɯ puɐ uıɯ uǝǝʍʇǝq ɹǝqɯnu ɯopuɐɹ ɐ >- }>xɐɯ< >uıɯ< ɯopuɐɹ{ ", - "gtceu.placeholder_info.rect.0": "ǝzıs puɐ sǝʇɐuıpɹooɔ pǝıɟıɔǝds ǝɥʇ ɥʇıʍ uoıʇısod pǝıɟıɔǝds ǝɥʇ ʇɐ ǝןbuɐʇɔǝɹ ɐ sʍɐɹᗡ", - "gtceu.placeholder_info.rect.1": ":ǝbɐs∩", - "gtceu.placeholder_info.rect.2": "buıɹʇs ʎʇdɯǝ >- }>ᗺ⅁ᴚⱯɹoןoɔ< >ʇɥbıǝɥ< >ɥʇpıʍ< >ʎ< >x< ʇɔǝɹ{ ", - "gtceu.placeholder_info.rect.3": ")Ɩ 'ᄅ( ǝzıs ǝɥʇ ɥʇıʍ )ϛᄅ˙0 'ϛ˙0( ʇɐ ǝןbuɐʇɔǝɹ ǝʇıɥʍ ɐ sʍɐɹp >- }ℲℲℲℲℲℲℲℲx0 Ɩ ᄅ ϛᄅ˙0 ϛ˙0 ʇɔǝɹ{ ", - "gtceu.placeholder_info.redstone.0": "ɥʇbuǝɹʇs ʇndʇno ǝuoʇspǝɹ ǝɥʇ sʇǝs ɹo ɥʇbuǝɹʇs ןɐubıs ǝuoʇspǝɹ ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.redstone.1": ":ǝbɐs∩", - "gtceu.placeholder_info.redstone.2": "ǝpıs pǝıɟıɔǝds ǝɥʇ ʇɐ )ϛƖ-0( ɥʇbuǝɹʇs ןɐubıs ǝuoʇspǝɹ >- }>ʇsǝʍ|ʇsɐǝ|ɥʇnos|ɥʇɹou|uʍop|dn< ʇǝb ǝuoʇspǝɹ{ ", - "gtceu.placeholder_info.redstone.3": ")9-0 'ʇɥbıɹ oʇ ʇɟǝן ɯoɹɟ( ɹǝןןoɹʇuoɔ ǝɥʇ ǝpısuı ʎɔuǝnbǝɹɟ ǝɥʇ ɟo xǝpuı ǝɥʇ sı xǝpuı‾ʇoןs‾bǝɹɟ ˙xǝpuı‾ʇoןs# ʇoןs uı ɹǝןןoɹʇuoɔ pǝʞuıן ɐ ʎq pǝıɟıɔǝds ʎɔuǝnbǝɹɟ ʞuıן ǝuoʇspǝɹ ǝʇɐǝɹƆ ɐ ɟo ɥʇbuǝɹʇs ןɐubıs ǝuoʇspǝɹ >- }>xǝpuı‾ʇoןs‾bǝɹɟ< >xǝpuı‾ʇoןs< ʞuıן ʇǝb ǝuoʇspǝɹ{ ", - "gtceu.placeholder_info.redstone.4": "ǝpıs s,ɹǝʌoɔ sıɥʇ ɯoɹɟ ɥʇbuǝɹʇs ʇndʇno ǝuoʇspǝɹ ǝɥʇ sʇǝs 'buıɹʇs ʎʇdɯǝ >- }>ɹǝʍod< ʇǝs ǝuoʇspǝɹ{ ", - "gtceu.placeholder_info.redstone.5": "ʎɔuǝnbǝɹɟ ʞuıן ǝuoʇspǝɹ ǝʇɐǝɹƆ pǝıɟıɔǝds ǝɥʇ uo ɹǝʍod ǝuoʇspǝɹ pǝıɟıɔǝds ǝɥʇ sʇsɐɔpɐoɹq 'buıɹʇs ʎʇdɯǝ >- }>ɹǝʍod< >xǝpuı‾ʇoןs‾bǝɹɟ< >xǝpuı‾ʇoןs< ʞuıן ʇǝs ǝuoʇspǝɹ{ ", - "gtceu.placeholder_info.repeat.0": "˙ʇuǝɯnbɹɐ ʇsɹıɟ ǝɥʇ uı pǝıɟıɔǝds sǝɯıʇ ɟo ʇunoɯɐ ǝɥʇ pǝʇɐǝdǝɹ 'sʇuǝɯnbɹɐ puoɔǝs ǝɥʇ ɯoɹɟ ʇxǝʇ ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.repeat.1": ":ǝbɐs∩", - "gtceu.placeholder_info.repeat.2": "sǝɯıʇ ɟo ʇunoɯɐ pǝıɟıɔǝds ǝɥʇ pǝʇɐǝdǝɹ ʇxǝʇ >- }>ʇxǝʇ< >ʇunoɯɐ< ʇɐǝdǝɹ{ ", - "gtceu.placeholder_info.select.0": ")0 ɯoɹɟ buıʇɹɐʇs( xǝpuı pǝıɟıɔǝds ǝɥʇ ʇɐ ʇuǝɯnbɹɐ ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.select.1": ":ǝbɐs∩", - "gtceu.placeholder_info.select.2": "xǝpuı pǝıɟıɔǝds ǝɥʇ ʇɐ ʇuǝɯnbɹɐ >- ˙˙˙ ]Ɛbɹɐ[ ]ᄅbɹɐ[ ]Ɩbɹɐ[ >xǝpuı< ʇɔǝןǝs{ ", - "gtceu.placeholder_info.setImage.0": "ʇoןs pǝıɟıɔǝds ǝɥʇ uı ǝןnpoɯ ǝbɐɯı uɐ uı Ꞁᴚ∩ ǝbɐɯı ǝɥʇ sʇǝS", - "gtceu.placeholder_info.setImage.1": ":ǝbɐs∩", - "gtceu.placeholder_info.setImage.2": "buıɹʇs ʎʇdɯǝ >- }>ןɹn< >ʇoןs< ǝbɐɯIʇǝs{ ", - "gtceu.placeholder_info.setTargetSlot.0": "˙ʇoןs ɥɔʇɐɥ ɐʇɐp pǝʇǝbɹɐʇ ǝɥʇ ɟo xǝpuı ǝɥʇ sʇǝS", - "gtceu.placeholder_info.setTargetSlot.1": "˙sǝʇnɔǝxǝ ɹǝpןoɥǝɔɐןd sıɥʇ ɹǝʇɟɐ ʎןǝʇɐıpǝɯɯı ʇɔǝɟɟǝ ǝʞɐʇ ןןıʍ ǝbuɐɥɔ ǝɥ⟘", - "gtceu.placeholder_info.setTargetSlot.2": ")ʇǝbɹɐʇ ʍǝu ǝɥʇ ǝɔuǝɹǝɟǝɹ ןןıʍ sɹǝpןoɥǝɔɐןd ɹǝɥʇɹnℲ(", - "gtceu.placeholder_info.setTargetSlot.3": ":ǝbɐs∩", - "gtceu.placeholder_info.setTargetSlot.4": "buıɹʇs ʎʇdɯǝ >- }>ʇoןs< ʇoןSʇǝbɹɐ⟘ʇǝs{ ", - "gtceu.placeholder_info.strike.0": "ʇno pǝssoɹɔ sɐʍ ʇı ɟı sɐ ʇı buıʎɐןdsıp 'ʇxǝʇ ʇsɹıɟ ǝɥʇ ɯoɹɟ ʇxǝʇ ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.strike.1": ":ǝbɐs∩", - "gtceu.placeholder_info.strike.2": "ʇxǝʇ ʇno-pǝssoɹɔ >- }>ʇxǝʇ< ǝʞıɹʇs{ ", - "gtceu.placeholder_info.subList.0": ")0 ɯoɹɟ buıʇɹɐʇs( )ǝʌısnןɔxǝ( ɹ oʇ )ǝʌısnןɔuı( ן ɯoɹɟ sǝxǝpuı ɥʇıʍ ɯoɹɟ sʇuǝɯnbɹɐ suɹnʇǝᴚ", - "gtceu.placeholder_info.subList.1": ":ǝbɐs∩", - "gtceu.placeholder_info.subList.2": "sǝɔɐds ʎq pǝʇɐɹɐdǝs ɹ oʇ ן ɯoɹɟ sǝxǝpuı ɥʇıʍ sʇuǝɯnbɹɐ ןןɐ >- }˙˙˙ ]Ɩbɹɐ[ ]0bɹɐ[ >ʇɥbıɹ< >ʇɟǝן< ʇsıꞀqns{ ", - "gtceu.placeholder_info.targetSlot.0": "ʇoןs ɥɔʇɐɥ ɐʇɐp pǝʇǝbɹɐʇ ǝɥʇ ɟo xǝpuı ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.targetSlot.1": ":ǝbɐs∩", - "gtceu.placeholder_info.targetSlot.2": ")9Ɩ/6/ㄣ oʇ Ɩ ɯoɹɟ( >ʇoןs< >- }ʇoןSʇǝbɹɐʇ{ ", - "gtceu.placeholder_info.tick.0": "˙pǝɔɐןd sɐʍ ɹǝʌoɔ sıɥʇ uǝɥʍ ɯoɹɟ pǝssɐd sʞɔıʇ ɟo ʇunoɯɐ ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.tick.1": ":ǝbɐs∩", - "gtceu.placeholder_info.tick.2": "sʞɔıʇ ɟo ʇunoɯɐ ǝɥʇ >- }ʞɔıʇ{ ", - "gtceu.placeholder_info.tm.0": "ןoqɯʎs ™ ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.tm.1": ":ǝbɐs∩", - "gtceu.placeholder_info.tm.2": "ןoqɯʎs ™ ǝɥʇ >- }ɯʇ{ ", - "gtceu.placeholder_info.toAscii.0": "ɹǝʇɔɐɹɐɥɔ pǝpıʌoɹd ǝɥʇ ɟo ǝpoɔ IIƆSⱯ ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.toAscii.1": ":ǝbɐs∩", - "gtceu.placeholder_info.toAscii.2": "ɹǝʇɔɐɹɐɥɔ ǝɥʇ ɟo ǝpoɔ IIƆSⱯ >- }>ɹǝʇɔɐɹɐɥɔ< ııɔsⱯoʇ{ ", - "gtceu.placeholder_info.toChars.0": "ɯǝɥʇ uǝǝʍʇǝq sǝɔɐds ɥʇıʍ buıɹʇs pǝpıʌoɹd ǝɥʇ ɟo sɹǝʇɔɐɹɐɥɔ ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.toChars.1": ",ǝ ן d ɯ ɐ x ǝ, >- }ǝןdɯɐxǝ sɹɐɥƆoʇ{ :ǝןdɯɐxƎ", - "gtceu.placeholder_info.toChars.2": ":ǝbɐs∩", - "gtceu.placeholder_info.toChars.3": "sɹǝʇɔɐɹɐɥɔ >- }>bɹɐ< sɹɐɥƆoʇ{ ", - "gtceu.placeholder_info.underline.0": "pǝuıןɹǝpun 'ʇuǝɯnbɹɐ ʇsɹıɟ ǝɥʇ ɯoɹɟ ʇxǝʇ ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.underline.1": ":ǝbɐs∩", - "gtceu.placeholder_info.underline.2": "ʇxǝʇ pǝuıןɹǝpun >- }>ʇxǝʇ< ǝuıןɹǝpun{ ", - "gtceu.placeholder_info.voltage.0": "˙uo sı ɹǝʌoɔ ǝɥʇ ǝןqɐɔ/ǝɹıʍ ǝɥʇ uı ǝbɐʇןoʌ ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.voltage.1": ":ǝbɐs∩", - "gtceu.placeholder_info.voltage.2": "ǝןqɐɔ/ǝɹıʍ ǝɥʇ uı ǝbɐʇןoʌ ǝɥʇ >- }ǝbɐʇןoʌ{ ", - "gtceu.plasma_generator": "ɹoʇɐɹǝuǝ⅁ ɐɯsɐןԀ", - "gtceu.polarizer": "ɹǝzıɹɐןoԀ", - "gtceu.primitive_blast_furnace": "ǝɔɐuɹnℲ ʇsɐןᗺ ǝʌıʇıɯıɹԀ", - "gtceu.provider.computer_monitor_cover.error.no_target": "dnoɹb ɹoʇıuoɯ ǝɥʇ ɹoɟ pǝʇɔǝןǝs ʇǝbɹɐʇ oN", - "gtceu.pyrolyse_oven": "uǝʌO ǝsʎןoɹʎԀ", - "gtceu.recipe.byproduct_tier": "+ɹ§%s ɯoɹɟ sʇɔnpoɹdʎᗺ", - "gtceu.recipe.category.arc_furnace_recycling": "buıddɐɹɔS ɔɹⱯ", - "gtceu.recipe.category.chem_dyes": "buıǝʎᗡ ןɐɔıɯǝɥƆ", - "gtceu.recipe.category.extractor_recycling": "buıʇןǝɯǝᴚ dɐɹɔS", - "gtceu.recipe.category.ingot_molding": "buıpןoW ןɐʇǝW", - "gtceu.recipe.category.macerator_recycling": "buıpuıɹ⅁ ʇɹɐԀ", - "gtceu.recipe.category.ore_bathing": "buıʇɐǝɹ⟘ ǝɹO", - "gtceu.recipe.category.ore_crushing": "buıpuıɹ⅁ ǝɹO", - "gtceu.recipe.category.ore_forging": "buıɥsnɹƆ ǝɹO", - "gtceu.recipe.chance": "ɹǝıʇ/%s+ %s :ǝɔuɐɥƆ", - "gtceu.recipe.cleanroom": "%s sǝɹınbǝᴚ", - "gtceu.recipe.cleanroom.display_name": "ɯooɹuɐǝןƆ", - "gtceu.recipe.cleanroom_sterile.display_name": "ɯooɹuɐǝןƆ ǝןıɹǝʇS", - "gtceu.recipe.coil.tier": "%s :ןıoƆ", - "gtceu.recipe.computation_per_tick": "ʇ/∩MƆ %s :uoıʇɐʇndɯoƆ ˙uıW", - "gtceu.recipe.dimensions": "%s :suoısuǝɯıᗡ", - "gtceu.recipe.duration": "sɔǝs %s :uoıʇɐɹnᗡ", - "gtceu.recipe.environmental_hazard": "%s ǝʌɐɥ ʇsnɯ ɐǝɹⱯɔ§", - "gtceu.recipe.environmental_hazard.reverse": "%s ɟo ǝǝɹɟ ǝq ʇsnɯ ɐǝɹⱯɔ§", - "gtceu.recipe.eu": "%s @ Ɐ %s :ǝbɐs∩", - "gtceu.recipe.eu.total": "ʇ/∩Ǝ %s", - "gtceu.recipe.eu_inverted": "%s @ Ɐ %s :uoıʇɐɹǝuǝ⅁", - "gtceu.recipe.eu_to_start": "%s∩Ǝ%s :ʇɹɐʇS o⟘ ∩Ǝ", - "gtceu.recipe.explosive": "%s :ǝʌısoןdxƎ", - "gtceu.recipe.max_eu": "∩Ǝ %s :∩Ǝ ˙xɐW", - "gtceu.recipe.not_consumed": "ssǝɔoɹd ǝɥʇ uı pǝɯnsuoɔ ʇǝb ʇou sǝoᗡ", - "gtceu.recipe.research": "ɥɔɹɐǝsǝᴚ sǝɹınbǝᴚ", - "gtceu.recipe.scan_for_research": "ǝuıꞀ ʎןqɯǝssⱯ ɹoɟ uɐɔS", - "gtceu.recipe.temperature": "%s :dɯǝ⟘", - "gtceu.recipe.total": "∩Ǝ %s :ןɐʇo⟘", - "gtceu.recipe.total_computation": "∩MƆ %s :uoıʇɐʇndɯoƆ", - "gtceu.recipe.total_eu": "ʇ/∩Ǝ %s :ǝbɐs∩ ןɐʇo⟘", - "gtceu.recipe.voltage": "%s @ Ɐ %s :ǝbɐs∩", - "gtceu.recipe_logic.condition_fails": "sןıɐℲ uoıʇıpuoƆ", - "gtceu.recipe_logic.insufficient_fuel": "ןǝnℲ ʇuǝıɔıɟɟnsuI", - "gtceu.recipe_logic.insufficient_in": "sʇnduI ʇuǝıɔıɟɟnsuI", - "gtceu.recipe_logic.insufficient_out": "sʇndʇnO ʇuǝıɔıɟɟnsuI", - "gtceu.recipe_logic.no_capabilities": "sǝıʇıןıqɐdɐƆ ou sɐɥ ǝuıɥɔɐW", - "gtceu.recipe_logic.no_contents": "sʇuǝʇuoƆ ou sɐɥ ǝdıɔǝᴚ", - "gtceu.recipe_logic.recipe_waiting": " :buıʇıɐM ǝdıɔǝᴚ", - "gtceu.recipe_logic.setup_fail": " :ǝdıɔǝɹ dnʇǝs oʇ ןıɐℲ", - "gtceu.recipe_memory_widget.tooltip.0": "pıɹb buıʇɟɐɹɔ ǝɥʇ oʇuı ǝdıɔǝɹ sıɥʇ ʇnduı ʎןןɐɔıʇɐɯoʇnɐ oʇ ʞɔıןɔ ʇɟǝꞀㄥ§", - "gtceu.recipe_memory_widget.tooltip.1": "ǝdıɔǝɹ sıɥʇ ʞɔoןun/ʞɔoן oʇ ʞɔıןɔ ʇɟıɥSㄥ§", - "gtceu.recipe_modifier.coil_temperature_too_low": "ʍoꞀ oo⟘ ǝɹnʇɐɹǝdɯǝ⟘ ןıoƆ", - "gtceu.recipe_modifier.default_fail": "ןıɐℲ ɹǝıɟıpoW ǝdıɔǝᴚ", - "gtceu.recipe_modifier.insufficient_eu_to_start_fusion": "uoıʇɔɐǝᴚ uoısnℲ ǝʇɐıʇıuI oʇ ʎbɹǝuƎ ʇuǝıɔıɟɟnsuI", - "gtceu.recipe_modifier.insufficient_voltage": "ʍoꞀ oo⟘ ɹǝı⟘ ǝbɐʇןoΛ", - "gtceu.recipe_type.show_recipes": "sǝdıɔǝᴚ ʍoɥS", - "gtceu.rei.group.potion_fluids": "spınןℲ uoıʇoԀ", - "gtceu.research_station": "uoıʇɐʇS ɥɔɹɐǝsǝᴚ", - "gtceu.rock_breaker": "ɹǝʞɐǝɹᗺ ʞɔoᴚ", - "gtceu.scanner": "ɹǝuuɐɔS", - "gtceu.scanner.copy_stick_empty": "ʞɔıʇS ʎʇdɯƎo§", - "gtceu.scanner.copy_stick_from": "ʎdoƆ oʇ ʞɔıʇSo§", - "gtceu.scanner.copy_stick_to": "ʞɔıʇS ɟo ʎdoƆo§", - "gtceu.sifter": "ɹǝʇɟıS", - "gtceu.steam_boiler": "ɹǝןıoᗺ ɯɐǝʇS", - "gtceu.steam_turbine": "ǝuıqɹn⟘ ɯɐǝʇS", - "gtceu.subtitle.arc": "buızznq sɔɹⱯ", - "gtceu.subtitle.assembler": "buıʇɔnɹʇsuoɔ ɹǝןqɯǝssⱯ", - "gtceu.subtitle.bath": "buızzıɟ ɥʇɐᗺ", - "gtceu.subtitle.boiler": "buıʇɐǝɥ ɹǝןıoᗺ", - "gtceu.subtitle.centrifuge": "buıuuıds ǝbnɟıɹʇuǝƆ", - "gtceu.subtitle.chainsaw": "buıʌʌǝɹ ʍɐsuıɐɥƆ", - "gtceu.subtitle.chemical": "buıןqqnq ןɐɔıɯǝɥƆ", - "gtceu.subtitle.combustion": "buıʇsnqɯoƆ", - "gtceu.subtitle.compressor": "buızǝǝnbs ɹossǝɹdɯoƆ", - "gtceu.subtitle.computation": "sdǝǝq ɹǝʇndɯoƆ", - "gtceu.subtitle.cooling": "buıɯɯnɥ ɹǝzǝǝɹℲ", - "gtceu.subtitle.cut": "buıɹɹıɥʍ ɹǝʇʇnƆ", - "gtceu.subtitle.drill": "buıןןıɹᗡ", - "gtceu.subtitle.electrolyzer": "buıʞɹɐds ɹǝzʎןoɹʇɔǝןƎ", - "gtceu.subtitle.file": "buıdsɐɹ ǝןıℲ", - "gtceu.subtitle.fire": "buıןʞɔɐɹɔ ǝɹıℲ", - "gtceu.subtitle.forge_hammer": "buıdɯnɥʇ ɹǝɯɯɐH ǝbɹoℲ", - "gtceu.subtitle.furnace": "buıʇɐǝɥ ǝɔɐuɹnℲ", - "gtceu.subtitle.jet_engine": "buıɹɐoɹ ʇǝſ", - "gtceu.subtitle.macerator": "buıɥsnɹɔ ɹoʇɐɹǝɔɐW", - "gtceu.subtitle.metal_pipe": "ʌɐʍ˙0‾0‾ᄅ‾ǝʌɐM‾Ꞁ‾ǝןoԀ‾ןɐʇǝW‾uoıʇɔnɹʇsǝᗡ", - "gtceu.subtitle.miner": "buıʇɐʌɐɔxǝ ɹǝuıW", - "gtceu.subtitle.mixer": "buıɥsoןs ɹǝxıW", - "gtceu.subtitle.mortar": "buıɥsnɹɔ ɹɐʇɹoW", - "gtceu.subtitle.motor": "buıɯɯnɥ ɹoʇoW", - "gtceu.subtitle.plunger": "buıddod ɹǝbunןԀ", - "gtceu.subtitle.portable_scanner": "buıuuɐɔS", - "gtceu.subtitle.portal_closing": "sǝsoןɔ ןɐʇɹoԀ", - "gtceu.subtitle.portal_opening": "suǝdo ןɐʇɹoԀ", - "gtceu.subtitle.replicator": "buıʎdoɔ ɹoʇɐɔıןdǝᴚ", - "gtceu.subtitle.saw": "buıʍɐS", - "gtceu.subtitle.science": "ǝ ɔ u ǝ ı ɔ s", - "gtceu.subtitle.screwdriver": "buıʍǝɹɔS", - "gtceu.subtitle.soft_hammer": "dɐʇ ʇɟoS", - "gtceu.subtitle.spray_can": "buıʎɐɹdS", - "gtceu.subtitle.sus": "˙˙˙snS", - "gtceu.subtitle.turbine": "buızzıɥʍ ǝuıqɹn⟘", - "gtceu.subtitle.wirecutter": "pǝddıus ǝɹıM", - "gtceu.subtitle.wrench": "buıןʇʇɐɹ ɥɔuǝɹM", - "gtceu.thermal_centrifuge": "ǝbnɟıɹʇuǝƆ ןɐɯɹǝɥ⟘", - "gtceu.tool.class.axe": "ǝxⱯ", - "gtceu.tool.class.butchery_knife": "ǝɟıuʞ ʎɹǝɥɔʇnᗺ", - "gtceu.tool.class.crowbar": "ɹɐqʍoɹƆ", - "gtceu.tool.class.drill": "ןןıɹᗡ", - "gtceu.tool.class.file": "ǝןıℲ", - "gtceu.tool.class.hammer": "ɹǝɯɯɐH", - "gtceu.tool.class.hoe": "ǝoH", - "gtceu.tool.class.knife": "ǝɟıuʞ", - "gtceu.tool.class.mallet": "ʇǝןןɐW ʇɟoS", - "gtceu.tool.class.mining_hammer": "ɹǝɯɯɐH buıuıW", - "gtceu.tool.class.mortar": "ɹɐʇɹoW", - "gtceu.tool.class.pickaxe": "ǝxɐʞɔıԀ", - "gtceu.tool.class.plunger": "ɹǝbunןԀ", - "gtceu.tool.class.rolling_pin": "uıԀ buıןןoᴚ", - "gtceu.tool.class.saw": "ʍɐS", - "gtceu.tool.class.screwdriver": "ɹǝʌıɹpʍǝɹɔS", - "gtceu.tool.class.scythe": "ǝɥʇʎɔS", - "gtceu.tool.class.shears": "sɹɐǝɥS", - "gtceu.tool.class.shovel": "ןǝʌoɥS", - "gtceu.tool.class.spade": "ǝpɐdS", - "gtceu.tool.class.sword": "pɹoʍS", - "gtceu.tool.class.wire_cutter": "ɹǝʇʇnƆ ǝɹıM", - "gtceu.tool.class.wrench": "ɥɔuǝɹM", - "gtceu.tool_action.crowbar": "sɹǝʌoƆ ǝʌoɯǝɹ oʇ ɹɐqʍoɹƆ ǝs∩8§", - "gtceu.tool_action.hammer": "spunoS ǝןɟɟnɯ oʇ ɹǝɯɯɐH pɹɐH ǝs∩8§", - "gtceu.tool_action.screwdriver.access_covers": "sɹǝʌoƆ ssǝɔɔɐ oʇ ɹǝʌıɹpʍǝɹɔS ǝs∩8§", - "gtceu.tool_action.screwdriver.auto_collapse": "buısdɐןןoɔ ɯǝʇI ǝןbboʇ oʇ ɹǝʌıɹpʍǝɹɔS ǝs∩8§", - "gtceu.tool_action.screwdriver.auto_output": "ʇndʇnO-oʇnⱯ ǝןbboʇ oʇ ɹǝʌıɹpʍǝɹɔS ǝs∩8§", - "gtceu.tool_action.screwdriver.auto_output_covers": "sɹǝʌoƆ ssǝɔɔɐ ɹo ǝpıS ʇndʇnO ɯoɹɟ ʇnduI ʍoןןⱯ oʇ ɹǝʌıɹpʍǝɹɔS ǝs∩8§", - "gtceu.tool_action.screwdriver.toggle_mode": "sǝpoW ǝןbboʇ oʇ ɹǝʌıɹpʍǝɹɔS ǝs∩8§", - "gtceu.tool_action.screwdriver.toggle_mode_covers": "sɹǝʌoƆ ssǝɔɔɐ ɹo sǝpoW ǝןbboʇ oʇ ɹǝʌıɹpʍǝɹɔS ǝs∩8§", - "gtceu.tool_action.show_tooltips": "oɟuI ןoo⟘ ʍoɥs oʇ ⟘ℲIHS pןoH", - "gtceu.tool_action.soft_mallet.reset": "buıʞɹoM ǝןbboʇ oʇ ʇǝןןɐW ʇɟoS ǝs∩8§", - "gtceu.tool_action.soft_mallet.toggle_mode": "sǝpoW ǝןbboʇ oʇ ʇǝןןɐW ʇɟoS ǝs∩8§", - "gtceu.tool_action.tape": "sɯǝןqoɹԀ ǝɔuɐuǝʇuıɐW xıɟ oʇ ǝdɐ⟘ ǝs∩8§", - "gtceu.tool_action.wire_cutter.connect": "suoıʇɔǝuuoƆ ʇǝs oʇ sɹǝʇʇnƆ ǝɹıM ǝs∩8§", - "gtceu.tool_action.wrench.connect": "suoıʇɔǝuuoƆ ʞɔoןq oʇ ʞɐǝus 'suoıʇɔǝuuoƆ ʇǝs oʇ ɥɔuǝɹM ǝs∩8§", - "gtceu.tool_action.wrench.set_facing": "buıɔɐℲ ʇǝs oʇ ɥɔuǝɹM ǝs∩8§", - "gtceu.tooltip.computer_monitor_config": "ɐʇɐp uoıʇɐɹnbıɟuoɔ ɹǝʌoɔ ɹoʇıuoɯ ɹǝʇndɯoɔ buıɹoʇS", - "gtceu.tooltip.computer_monitor_data": "%s :ɐʇɐp buıɹoʇS", - "gtceu.tooltip.fluid_pipe_hold_shift": "oɟuI ʇuǝɯuıɐʇuoƆ pınןℲ ʍoɥs oʇ ⟘ℲIHS pןoHㄥ§", - "gtceu.tooltip.hold_ctrl": "oɟuı ǝɹoɯ ɹoɟ Ꞁᴚ⟘Ɔ pןoHㄥ§", - "gtceu.tooltip.hold_shift": "oɟuı ǝɹoɯ ɹoɟ ⟘ℲIHS pןoHㄥ§", - "gtceu.tooltip.player_bind": "%s :ɹǝʎɐןd oʇ punoᗺ", - "gtceu.tooltip.potion.each": "ɹ§buıuǝddɐɥ ɟo ǝɔuɐɥɔㄥ§ %s%% ɹ§ɐ ɥʇıʍ sʞɔıʇㄥ§ %s ɹ§ɹoɟㄥ§ %s %s", - "gtceu.tooltip.potion.header": ":sʇɔǝɟɟǝ suıɐʇuoƆ9§", - "gtceu.tooltip.proxy_bind": "%s %s %s ʇɐ ɹǝɟɟnᗺ uɹǝʇʇɐԀ ɐ oʇ buıpuıᗺɟ§", - "gtceu.tooltip.status.trinary.false": "ǝsןɐℲ", - "gtceu.tooltip.status.trinary.true": "ǝnɹ⟘", - "gtceu.tooltip.status.trinary.unknown": "uʍouʞu∩", - "gtceu.tooltip.tool_fluid_hold_shift": "oɟuI ןoo⟘ puɐ ʇuǝɯuıɐʇuoƆ pınןℲ ʍoɥs oʇ ⟘ℲIHS pןoHㄥ§", - "gtceu.tooltip.wireless_transmitter_bind": "%s uı %s buıɔɐɟ %s %s %s ʇɐ ɹǝʌoɔ ɹǝʇʇıɯsuɐɹʇ ɐ oʇ buıpuıᗺ", - "gtceu.top.allow_output_input": "ʇnduI ʍoןןⱯ", - "gtceu.top.auto_output": "ʇndʇnO oʇnⱯ", - "gtceu.top.buffer_bound_pos": "%s :Z '%s :ʎ '%s :X - o⟘ punoᗺ", - "gtceu.top.buffer_not_bound": "punoᗺ ʎןʇuǝɹɹnƆ ʇoN ɹǝɟɟnᗺ", - "gtceu.top.cable_amperage": " :ǝbɐɹǝdɯⱯ", - "gtceu.top.cable_voltage": " :ǝbɐʇןoΛ", - "gtceu.top.convert_eu": "ɹ§ƎℲɔ§ >- ɹ§∩Ǝǝ§ buıʇɹǝʌuoƆ", - "gtceu.top.convert_fe": "ɹ§∩Ǝǝ§ >- ɹ§ƎℲɔ§ buıʇɹǝʌuoƆ", - "gtceu.top.energy_consumption": "buıs∩", - "gtceu.top.energy_production": "buıɔnpoɹԀ", - "gtceu.top.energy_stored": "∩Ǝ %d / ", - "gtceu.top.exhaust_vent_blocked": "pǝʞɔoןᗺ", - "gtceu.top.exhaust_vent_direction": "%s :ʇuǝΛ ʇsnɐɥxƎ", - "gtceu.top.filter.label": ":ɹǝʇןıℲ", - "gtceu.top.fluid_auto_output": "%s :ʇndʇnO pınןℲ", - "gtceu.top.fuel_min_consume": "spǝǝN", - "gtceu.top.fuel_none": "ןǝnɟ oN", - "gtceu.top.invalid_structure": "ǝʇǝןdɯoɔuI ǝɹnʇɔnɹʇS", - "gtceu.top.item_auto_output": "%s :ʇndʇnO ɯǝʇI", - "gtceu.top.ldp_endpoint.io_type": "%s :ǝdʎ⟘ OI", - "gtceu.top.ldp_endpoint.is_formed": "ɹ§pǝɯɹoℲ ǝuıןǝdıԀɐ§", - "gtceu.top.ldp_endpoint.not_formed": "ɹ§ǝʇǝןdɯoɔuI ǝuıןǝdıԀɔ§", - "gtceu.top.ldp_endpoint.output_direction": "%s :uoıʇɔǝɹıᗡ ʇndʇnO", - "gtceu.top.link_cover.color": ":ɹoןoƆ", - "gtceu.top.machine_mode": " :ǝpoW ǝuıɥɔɐW", - "gtceu.top.maintenance.crowbar": "ǝɹǝɥʇ buoןǝq ʇ,usǝop ʇɐɥ⟘", - "gtceu.top.maintenance.hard_hammer": "pǝʇuǝp sı buıʇɐןԀ", - "gtceu.top.maintenance.screwdriver": "ǝsooן ǝɹɐ sʍǝɹɔS", - "gtceu.top.maintenance.soft_mallet": "ʞɔnʇs sı buıɥʇǝɯoS", - "gtceu.top.maintenance.wire_cutter": "ʇno pǝuɹnq sǝɹıM", - "gtceu.top.maintenance.wrench": "ǝsooן sı ǝdıԀ", - "gtceu.top.maintenance_broken": "ǝɔuɐuǝʇuıɐW spǝǝN", - "gtceu.top.maintenance_fixed": "ǝuıℲ ǝɔuɐuǝʇuıɐW", - "gtceu.top.mode.export": "buıʇɹodxƎ", - "gtceu.top.mode.import": "buıʇɹodɯI", - "gtceu.top.obstructed_structure": "pǝʇɔnɹʇsqO ǝɹnʇɔnɹʇS", - "gtceu.top.primitive_pump_production": "s/ᗺɯ %s :uoıʇɔnpoɹԀ", - "gtceu.top.progress_computation": "∩MƆ %s / ", - "gtceu.top.progress_sec": "s %s / ", - "gtceu.top.progress_tick": "ʇ %s / ", - "gtceu.top.proxies_bound": "%s :punoᗺ sǝıxoɹԀ ɹǝɟɟnᗺ", - "gtceu.top.recipe_output": ":sʇndʇnO ǝdıɔǝᴚ", - "gtceu.top.stained": "%s :pǝɹoןoƆ", - "gtceu.top.transform_down": "%s ɹ§uʍoᗡ dǝʇSɐ§", - "gtceu.top.transform_input": "%s ɹ§:ʇnduI9§", - "gtceu.top.transform_output": "%s ɹ§:ʇndʇnO6§", - "gtceu.top.transform_up": "%s ɹ§d∩ dǝʇSɔ§", - "gtceu.top.unit.fluid_buckets": "Ꞁʞ", - "gtceu.top.unit.fluid_milibuckets": "Ꞁ", - "gtceu.top.unit.items": "sɯǝʇI", - "gtceu.top.valid_structure": "pǝɯɹoℲ ǝɹnʇɔnɹʇS", - "gtceu.top.working_disabled": "pǝןqɐsıᗡ buıʞɹoM", - "gtceu.universal.clear_nbt_recipe.tooltip": "¡sʇuǝʇuoɔ ןןɐ ʎoɹʇsǝp ןןıʍ sıɥ⟘ɔ§", - "gtceu.universal.kiloliters": "ᗺ %s", - "gtceu.universal.liters": "ᗺɯ %s", - "gtceu.universal.padded_parentheses": " )%s( ", - "gtceu.universal.padded_spaced_parentheses": " ) %s ( ", - "gtceu.universal.parentheses": ")%s(", - "gtceu.universal.spaced_parentheses": ") %s (", - "gtceu.universal.tooltip.amperage_in": "Ɐ%dɟ§ :NI ǝbɐɹǝdɯⱯǝ§", - "gtceu.universal.tooltip.amperage_in_out": "Ɐ%dɟ§ :⟘∩O/NI ǝbɐɹǝdɯⱯǝ§", - "gtceu.universal.tooltip.amperage_in_out_till": "Ɐ%dɟ§ :oʇ dn ⟘∩O/NI ǝbɐɹǝdɯⱯǝ§", - "gtceu.universal.tooltip.amperage_in_till": "Ɐ%dɟ§ :oʇ dn NI ǝbɐɹǝdɯⱯǝ§", - "gtceu.universal.tooltip.amperage_out": "Ɐ%dɟ§ :⟘∩O ǝbɐɹǝdɯⱯǝ§", - "gtceu.universal.tooltip.amperage_out_till": "Ɐ%dɟ§ :oʇ dn ⟘∩O ǝbɐɹǝdɯⱯǝ§", - "gtceu.universal.tooltip.base_production_eut": "ʇ/∩Ǝ %dɟ§ :uoıʇɔnpoɹԀ ǝsɐᗺǝ§", - "gtceu.universal.tooltip.base_production_fluid": "ʇ/ᗺɯ %dɟ§ :uoıʇɔnpoɹԀ ǝsɐᗺǝ§", - "gtceu.universal.tooltip.chunk_mode": " :ǝpoW ʞunɥƆ", - "gtceu.universal.tooltip.deprecated": "ɹ§˙NOISᴚƎΛ Ǝᴚ∩⟘∩Ⅎ Ɐ NI ᗡƎΛOWƎᴚ Ǝᗺ ꞀꞀIM ˙ᗡƎ⟘ⱯƆƎᴚԀƎᗡ ㄣ§ɹ§:⅁NINᴚⱯMן§ㄣ§", - "gtceu.universal.tooltip.energy_storage_capacity": "∩Ǝ %dɹ§ :ʎʇıɔɐdɐƆ ʎbɹǝuƎɔ§", - "gtceu.universal.tooltip.energy_tier_range": "%s -ɟ§ %sɟ§ :sɹǝı⟘ ǝbɐʇןoΛ pǝʍoןןⱯɐ§", - "gtceu.universal.tooltip.fluid_storage_capacity": "ᗺɯ %dɟ§ :ʎʇıɔɐdɐƆ pınןℲ6§", - "gtceu.universal.tooltip.fluid_storage_capacity_mult": "ɥɔɐǝㄥ§ ᗺɯ %dɟ§ 'sʞuɐ⟘ㄥ§ %dɟ§ :ʎʇıɔɐdɐƆ pınןℲ6§", - "gtceu.universal.tooltip.fluid_stored": "ᗺɯ %d '%sɟ§ :pǝɹoʇS pınןℲᄅ§", - "gtceu.universal.tooltip.fluid_transfer_rate": "ʇ/ᗺɯ %dɟ§ :ǝʇɐᴚ ɹǝɟsuɐɹ⟘q§", - "gtceu.universal.tooltip.item_storage_capacity": "%dɟ§ :sʇoןS ɯǝʇI9§", - "gtceu.universal.tooltip.item_storage_total": "sɯǝʇı %dɟ§ :ʎʇıɔɐdɐƆ ɯǝʇI9§", - "gtceu.universal.tooltip.item_stored": "sɯǝʇı %d '%sɟ§ :pǝɹoʇS ɯǝʇIp§", - "gtceu.universal.tooltip.item_transfer_rate": "s/sɯǝʇı %dɟ§ :ǝʇɐᴚ ɹǝɟsuɐɹ⟘q§", - "gtceu.universal.tooltip.item_transfer_rate_stacks": "s/sʞɔɐʇs %dɟ§ :ǝʇɐᴚ ɹǝɟsuɐɹ⟘q§", - "gtceu.universal.tooltip.max_voltage_in": ")ɟ§%s( %dɟ§ :NI ǝbɐʇןoΛ xɐWɐ§", - "gtceu.universal.tooltip.max_voltage_in_out": ")ɟ§%s( ʇ/∩Ǝ %dɟ§ :⟘∩O/NI ǝbɐʇןoΛ xɐWɐ§", - "gtceu.universal.tooltip.max_voltage_out": ")ɟ§%s( %dɟ§ :⟘∩O ǝbɐʇןoΛ xɐWɐ§", - "gtceu.universal.tooltip.parallel": "%dɟ§ :ןǝןןɐɹɐԀ xɐWp§", - "gtceu.universal.tooltip.produces_fluid": "ʇ/ᗺɯ %dɟ§ :sǝɔnpoɹԀǝ§", - "gtceu.universal.tooltip.requires_redstone": "ɹǝʍod ǝuoʇspǝᴚ sǝɹınbǝᴚㄣ§", - "gtceu.universal.tooltip.silk_touch": " :ɥɔno⟘ ʞןıS", - "gtceu.universal.tooltip.terrain_resist": "sʇuǝɯǝןƎ ǝɥʇ oʇ pǝsodxǝ uǝɥʍ ǝpoןdxǝ ʇou ןןıʍ ǝuıɥɔɐW sıɥ⟘", - "gtceu.universal.tooltip.uses_per_hour_lubricant": "buıʞɹoʍ ǝןıɥʍㄥ§ ʇuɐɔıɹqnꞀ9§ ɟoㄥ§ ɹɥ/ᗺɯ %dɟ§ sǝs∩", - "gtceu.universal.tooltip.uses_per_op": "uoıʇɐɹǝdo/∩Ǝ %dɟ§ sǝs∩", - "gtceu.universal.tooltip.uses_per_second": "buıʞɹoʍ ǝןıɥʍㄥ§ s/∩Ǝ %dɟ§ sǝs∩", - "gtceu.universal.tooltip.uses_per_tick": "buıʞɹoʍ ǝןıɥʍㄥ§ ʇ/∩Ǝ %dɟ§ sǝs∩", - "gtceu.universal.tooltip.uses_per_tick_steam": "buıʞɹoʍ ǝןıɥʍㄥ§ ɯɐǝʇSɟ§ ɟoㄥ§ ʇ/ᗺɯ %dɟ§ sǝs∩", - "gtceu.universal.tooltip.voltage_in": ")ɟ§%s( ʇ/∩Ǝ %dɟ§ :NI ǝbɐʇןoΛɐ§", - "gtceu.universal.tooltip.voltage_in_out": ")ɟ§%s( ʇ/∩Ǝ %dɟ§ :⟘∩O/NI ǝbɐʇןoΛɐ§", - "gtceu.universal.tooltip.voltage_out": ")ɟ§%s( ʇ/∩Ǝ %dɟ§ :⟘∩O ǝbɐʇןoΛɐ§", - "gtceu.universal.tooltip.working_area": "%dx%dɟ§ :ɐǝɹⱯ buıʞɹoMq§", - "gtceu.universal.tooltip.working_area_chunks": "sʞunɥƆ %dx%dɟ§ :ɐǝɹⱯ buıʞɹoMq§", - "gtceu.universal.tooltip.working_area_chunks_max": "sʞunɥƆ %dx%dɟ§ :ɐǝɹⱯ buıʞɹoM xɐWq§", - "gtceu.universal.tooltip.working_area_max": "%dx%dɟ§ :ɐǝɹⱯ buıʞɹoM xɐWq§", - "gtceu.vacuum_freezer": "ɹǝzǝǝɹℲ ɯnnɔɐΛ", - "gtceu.wiremill": "ןןıɯǝɹıM", - "gui.gtceu.refund_all.desc": "ᄅƎⱯ oʇ sʇuǝʇuoƆ pǝɹoʇS uɹnʇǝᴚ", - "gui.gtceu.rename.desc": "ɹǝɟɟnᗺ uɹǝʇʇɐԀ ǝɯɐuǝᴚ", - "gui.gtceu.share_inventory.desc.0": "¡ɹǝɟɟnq uıɥʇıʍ suɹǝʇʇɐd ןןɐ ɥʇıʍ sɯǝʇı pǝʇɹǝsuı sǝɹɐɥS", - "gui.gtceu.share_inventory.desc.1": "sʇsʎןɐʇɐɔ buıɹoʇs ʎq uoıʇɐɯoʇnɐ ןnɟɹǝʍod sʍoןןⱯ", - "gui.gtceu.share_inventory.title": "ʎɹoʇuǝʌuI ɯǝʇI pǝɹɐɥS", - "gui.gtceu.share_tank.desc.0": "¡ɹǝɟɟnq uıɥʇıʍ suɹǝʇʇɐd ןןɐ ɥʇıʍ ˙ɔʇǝ/sǝssɐb/spınןɟ pǝʇɹǝsuı sǝɹɐɥS", - "gui.gtceu.share_tank.title": "ʎɹoʇuǝʌuI ʞuɐ⟘ pǝɹɐɥS", - "gui.widget.incrementButton.default_tooltip": "ʇunoɯɐ ǝɥʇ ǝbuɐɥɔ oʇ ɥʇoq ɹo ןɹʇƆ 'ʇɟıɥS pןoH", - "gui.widget.recipeProgressWidget.default_tooltip": "sǝdıɔǝᴚ ʍoɥS", - "item.glass_lens": ")ǝʇıɥM( suǝꞀ ssɐן⅁", - "item.gtceu.activity_detector_cover": "ɹoʇɔǝʇǝᗡ ʎʇıʌıʇɔⱯ", - "item.gtceu.activity_detector_cover.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ǝuoʇspǝᴚ sɐ ㄥ§snʇɐʇS ʎʇıʌıʇɔⱯɟ§ ʇno sǝʌı⅁ㄥ§", - "item.gtceu.advanced_activity_detector_cover": "ɹoʇɔǝʇǝᗡ ʎʇıʌıʇɔⱯ pǝɔuɐʌpⱯ", - "item.gtceu.advanced_activity_detector_cover.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ǝuoʇspǝᴚ sɐ ㄥ§ssǝɹboɹԀ ǝuıɥɔɐWɟ§ ʇno sǝʌı⅁ㄥ§", - "item.gtceu.advanced_electric_jetpack": "ʞɔɐdʇǝſ ɔıɹʇɔǝןƎ pǝɔuɐʌpⱯ", - "item.gtceu.advanced_energy_detector_cover": "ɹoʇɔǝʇǝᗡ ʎbɹǝuƎ pǝɔuɐʌpⱯ", - "item.gtceu.advanced_energy_detector_cover.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ǝuoʇspǝᴚ sɐ ㄥ§snʇɐʇS ʎbɹǝuƎɟ§ pǝןןoɹʇuoɔ ㄥ§ɥɔʇɐꞀ-Sᴚɟ§ sǝʌı⅁ㄥ§", - "item.gtceu.advanced_fluid_detector_cover": "ɹoʇɔǝʇǝᗡ pınןℲ pǝɔuɐʌpⱯ", - "item.gtceu.advanced_fluid_detector_cover.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ǝuoʇspǝᴚ sɐ ㄥ§snʇɐʇS ǝbɐɹoʇS pınןℲɟ§ pǝןןoɹʇuoɔ ㄥ§ɥɔʇɐꞀ-Sᴚɟ§ sǝʌı⅁ㄥ§", - "item.gtceu.advanced_fluid_voiding_cover": "ɹǝʌoƆ buıpıoΛ pınןℲ pǝɔuɐʌpⱯ", - "item.gtceu.advanced_fluid_voiding_cover.tooltip.0": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ןoɹʇuoɔ ʇunoɯɐ ɥʇıʍ ㄥ§spınןℲɟ§ spıoΛㄥ§", - "item.gtceu.advanced_fluid_voiding_cover.tooltip.1": "˙ʇuǝɯǝɔɐןd ɹǝʇɟɐ ㄥ§ʇǝןןɐW ʇɟoSɟ§ ɥʇıʍ ǝʇɐʌıʇɔⱯ", - "item.gtceu.advanced_integrated_circuit": "ʇınɔɹıƆ pǝʇɐɹbǝʇuI pǝɔuɐʌpⱯ", - "item.gtceu.advanced_integrated_circuit.tooltip.0": "ןnɟɹǝʍod ǝɹoɯ puɐ ɹǝןןɐɯSㄥ§", - "item.gtceu.advanced_integrated_circuit.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-ΛH9§", - "item.gtceu.advanced_item_detector_cover": "ɹoʇɔǝʇǝᗡ ɯǝʇI pǝɔuɐʌpⱯ", - "item.gtceu.advanced_item_detector_cover.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ǝuoʇspǝᴚ sɐ ㄥ§snʇɐʇS ǝbɐɹoʇS ɯǝʇIɟ§ pǝןןoɹʇuoɔ ㄥ§ɥɔʇɐꞀ-Sᴚɟ§ sǝʌı⅁ㄥ§", - "item.gtceu.advanced_item_voiding_cover": "ɹǝʌoƆ buıpıoΛ ɯǝʇI pǝɔuɐʌpⱯ", - "item.gtceu.advanced_item_voiding_cover.tooltip.0": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ןoɹʇuoɔ ʇunoɯɐ ɥʇıʍ ㄥ§sɯǝʇIɟ§ spıoΛㄥ§", - "item.gtceu.advanced_item_voiding_cover.tooltip.1": "˙ʇuǝɯǝɔɐןd ɹǝʇɟɐ ㄥ§ʇǝןןɐW ʇɟoSɟ§ ɥʇıʍ ǝʇɐʌıʇɔⱯ", - "item.gtceu.advanced_nanomuscle_chestplate": "ǝʇɐןdʇsǝɥƆ ǝʇınS ™ǝןɔsnWouɐN pǝɔuɐʌpⱯ", - "item.gtceu.advanced_power_thruster": "ɹǝʇsnɹɥ⟘ ɹǝʍoԀ pǝɔuɐʌpⱯ", - "item.gtceu.advanced_quarktech_chestplate": "ǝʇɐןdʇsǝɥƆ ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ pǝɔuɐʌpⱯ", - "item.gtceu.advanced_smd_capacitor": "ɹoʇıɔɐdɐƆ ᗡWS pǝɔuɐʌpⱯ", - "item.gtceu.advanced_smd_capacitor.tooltip": "ʇuǝuodɯoƆ ɔıuoɹʇɔǝןƎ pǝɔuɐʌpⱯㄥ§", - "item.gtceu.advanced_smd_diode": "ǝpoıᗡ ᗡWS pǝɔuɐʌpⱯ", - "item.gtceu.advanced_smd_diode.tooltip": "ʇuǝuodɯoƆ ɔıuoɹʇɔǝןƎ pǝɔuɐʌpⱯㄥ§", - "item.gtceu.advanced_smd_inductor": "ɹoʇɔnpuI ᗡWS pǝɔuɐʌpⱯ", - "item.gtceu.advanced_smd_inductor.tooltip": "ʇuǝuodɯoƆ ɔıuoɹʇɔǝןƎ pǝɔuɐʌpⱯㄥ§", - "item.gtceu.advanced_smd_resistor": "ɹoʇsısǝᴚ ᗡWS pǝɔuɐʌpⱯ", - "item.gtceu.advanced_smd_resistor.tooltip": "ʇuǝuodɯoƆ ɔıuoɹʇɔǝןƎ pǝɔuɐʌpⱯㄥ§", - "item.gtceu.advanced_smd_transistor": "ɹoʇsısuɐɹ⟘ ᗡWS pǝɔuɐʌpⱯ", - "item.gtceu.advanced_smd_transistor.tooltip": "ʇuǝuodɯoƆ ɔıuoɹʇɔǝןƎ pǝɔuɐʌpⱯㄥ§", - "item.gtceu.advanced_soc": "ƆoSⱯ", - "item.gtceu.advanced_soc.tooltip": "dıɥƆ uo ɯǝʇsʎS pǝɔuɐʌpⱯㄥ§", - "item.gtceu.advanced_soc_wafer": "ɹǝɟɐM ƆoSⱯ", - "item.gtceu.advanced_soc_wafer.tooltip": "ʇınɔɹıƆ pǝɔuɐʌpⱯ ʍɐᴚㄥ§", - "item.gtceu.aluminium_fluid_cell": "ןןǝƆ ɯnıuıɯnןⱯ %s", - "item.gtceu.anvil_casting_mold": ")ןıʌuⱯ( pןoW buıʇsɐƆ", - "item.gtceu.anvil_casting_mold.tooltip": "sןıʌuⱯ buıdɐɥs ɹoɟ pןoWㄥ§", - "item.gtceu.armor.boots": "sʇooᗺ %s", - "item.gtceu.armor.chestplate": "ǝʇɐןdʇsǝɥƆ %s", - "item.gtceu.armor.helmet": "ʇǝɯןǝH %s", - "item.gtceu.armor.leggings": "sbuıbbǝꞀ %s", - "item.gtceu.ash_dust": "sǝɥsⱯ", - "item.gtceu.axe_extruder_mold.tooltip": "sǝxⱯ buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.ball_casting_mold": ")ןןɐᗺ( pןoW buıʇsɐƆ", - "item.gtceu.ball_casting_mold.tooltip": "sןןɐᗺ buıʞɐɯ ɹoɟ pןoWㄥ§", - "item.gtceu.basaltic_mineral_sand_dust": "puɐS ןɐɹǝuıW ɔıʇןɐsɐᗺ", - "item.gtceu.basic_electronic_circuit": "ʇınɔɹıƆ ɔıuoɹʇɔǝןƎ ɔısɐᗺ", - "item.gtceu.basic_electronic_circuit.tooltip.0": "ʇınɔɹıƆ ʇsɹıℲ ɹnoʎㄥ§", - "item.gtceu.basic_electronic_circuit.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-ΛꞀɔ§", - "item.gtceu.basic_integrated_circuit": "ʇınɔɹıƆ pǝʇɐɹbǝʇuI ɔısɐᗺ", - "item.gtceu.basic_integrated_circuit.tooltip.0": "ןnɟɹǝʍod ǝɹoɯ puɐ ɹǝןןɐɯSㄥ§", - "item.gtceu.basic_integrated_circuit.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-ΛꞀ9§", - "item.gtceu.basic_tape": "ǝdɐ⟘", - "item.gtceu.basic_tape.tooltip": "sɯǝʇı ɹıǝɥʇ buıddoɹp ʇnoɥʇıʍ sǝʇɐɹɔ dn ʞɔıd oʇ pǝsn ǝq uɐƆ\nsǝnssı ןɐɔıuɐɥɔǝɯ ɹoɟ ɥbnouǝ buoɹʇs ʇoNㄥ§", - "item.gtceu.battery.charge_detailed": ")ㄥ§buıuıɐɯǝɹ %s %s/%s(ㄥ§ %s ɹǝı⟘ - ㄥ§∩Ǝ %s/%s", - "item.gtceu.battery.charge_time": ")%s( ɹǝʍoԀ ɟo %s %s spןoHɐ§", - "item.gtceu.battery.charge_unit.hour": "sɹnoɥ", - "item.gtceu.battery.charge_unit.minute": "sǝʇnuıɯ", - "item.gtceu.battery.charge_unit.second": "spuoɔǝs", - "item.gtceu.bentonite_dust": "ǝʇıuoʇuǝᗺ", - "item.gtceu.bio_chaff": "ɟɟɐɥƆ oıᗺ", - "item.gtceu.black_dye_spray_can": ")ʞɔɐןᗺ( uɐƆ ʎɐɹdS", - "item.gtceu.black_glass_lens": ")ʞɔɐןᗺ( suǝꞀ ssɐן⅁", - "item.gtceu.blacklight": "ʇɥbıןʞɔɐןᗺ", - "item.gtceu.blacklight.tooltip": "ǝɔɹnos ʇɥbıן ㄥ§ʇǝןoıʌɐɹʇן∩p§ ǝʌɐM-buoꞀ", - "item.gtceu.block_casting_mold": ")ʞɔoןᗺ( pןoW buıʇsɐƆ", - "item.gtceu.block_casting_mold.tooltip": "sʞɔoןᗺ buıʞɐɯ ɹoɟ pןoWㄥ§", - "item.gtceu.block_extruder_mold": ")ʞɔoןᗺ( pןoW ɹǝpnɹʇxƎ", - "item.gtceu.block_extruder_mold.tooltip": "sʞɔoןᗺ buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.blue_dye_spray_can": ")ǝnןᗺ( uɐƆ ʎɐɹdS", - "item.gtceu.blue_glass_lens": ")ǝnןᗺ( suǝꞀ ssɐן⅁", - "item.gtceu.bolt_extruder_mold": ")ʇןoᗺ( pןoW ɹǝpnɹʇxƎ", - "item.gtceu.bolt_extruder_mold.tooltip": "sʇןoᗺ buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.bone_dust": "ןɐǝW ǝuoᗺ", - "item.gtceu.borosilicate_glass_ingot": "ɹɐᗺ ssɐן⅁ ǝʇɐɔıןısoɹoᗺ", - "item.gtceu.bottle.purple.drink.tooltip": "¡ʞuıɹᗡ ǝןdɹnԀ ʇob I ¿ɐǝ⟘ ǝɔI ǝɯos ɹO ˙ǝpɐuoɯǝꞀ ʇnoqɐ ʍoHㄥ§", - "item.gtceu.bottle_casting_mold": ")ǝןʇʇoᗺ( pןoW buıʇsɐƆ", - "item.gtceu.bottle_casting_mold.tooltip": "sǝןʇʇoᗺ buıʞɐɯ ɹoɟ pןoWㄥ§", - "item.gtceu.bottle_extruder_mold": ")ǝןʇʇoᗺ( pןoW ɹǝpnɹʇxƎ", - "item.gtceu.bottle_extruder_mold.tooltip": "sǝןʇʇoᗺ buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.brick_wooden_form": "ɯɹoℲ uǝpooM ʞɔıɹᗺ", - "item.gtceu.brown_dye_spray_can": ")uʍoɹᗺ( uɐƆ ʎɐɹdS", - "item.gtceu.brown_glass_lens": ")uʍoɹᗺ( suǝꞀ ssɐן⅁", - "item.gtceu.bucket": "ʇǝʞɔnᗺ %s", - "item.gtceu.capacitor": "ɹoʇıɔɐdɐƆ", - "item.gtceu.capacitor.tooltip": "ʇuǝuodɯoƆ ɔıuoɹʇɔǝןƎ ɔısɐᗺㄥ§", - "item.gtceu.carbon_fiber_mesh": "ɥsǝW ɹǝqıℲ uoqɹɐƆ", - "item.gtceu.carbon_fiber_plate": "ǝʇɐןԀ ɹǝqıℲ uoqɹɐƆ", - "item.gtceu.carbon_fibers": "sɹǝqıℲ uoqɹɐƆ ʍɐᴚ", - "item.gtceu.casing_casting_mold.tooltip": "sbuısɐƆ ɯǝʇI buıʞɐɯ ɹoɟ pןoWㄥ§", - "item.gtceu.casing_extruder_mold.tooltip": "sbuısɐƆ ɯǝʇI buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.cassiterite_sand_dust": "puɐS ǝʇıɹǝʇıssɐƆ", - "item.gtceu.cell_extruder_mold": ")ןןǝƆ( pןoW ɹǝpnɹʇxƎ", - "item.gtceu.cell_extruder_mold.tooltip": "sןןǝƆ buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.chemical_black_dye": "ǝʎᗡ ʞɔɐןᗺ ןɐɔıɯǝɥƆ", - "item.gtceu.chemical_blue_dye": "ǝʎᗡ ǝnןᗺ ןɐɔıɯǝɥƆ", - "item.gtceu.chemical_brown_dye": "ǝʎᗡ uʍoɹᗺ ןɐɔıɯǝɥƆ", - "item.gtceu.chemical_cyan_dye": "ǝʎᗡ uɐʎƆ ןɐɔıɯǝɥƆ", - "item.gtceu.chemical_gray_dye": "ǝʎᗡ ʎɐɹ⅁ ןɐɔıɯǝɥƆ", - "item.gtceu.chemical_green_dye": "ǝʎᗡ uǝǝɹ⅁ ןɐɔıɯǝɥƆ", - "item.gtceu.chemical_light_blue_dye": "ǝʎᗡ ǝnןᗺ ʇɥbıꞀ ןɐɔıɯǝɥƆ", - "item.gtceu.chemical_light_gray_dye": "ǝʎᗡ ʎɐɹ⅁ ʇɥbıꞀ ןɐɔıɯǝɥƆ", - "item.gtceu.chemical_lime_dye": "ǝʎᗡ ǝɯıꞀ ןɐɔıɯǝɥƆ", - "item.gtceu.chemical_magenta_dye": "ǝʎᗡ ɐʇuǝbɐW ןɐɔıɯǝɥƆ", - "item.gtceu.chemical_orange_dye": "ǝʎᗡ ǝbuɐɹO ןɐɔıɯǝɥƆ", - "item.gtceu.chemical_pink_dye": "ǝʎᗡ ʞuıԀ ןɐɔıɯǝɥƆ", - "item.gtceu.chemical_purple_dye": "ǝʎᗡ ǝןdɹnԀ ןɐɔıɯǝɥƆ", - "item.gtceu.chemical_red_dye": "ǝʎᗡ pǝᴚ ןɐɔıɯǝɥƆ", - "item.gtceu.chemical_white_dye": "ǝʎᗡ ǝʇıɥM ןɐɔıɯǝɥƆ", - "item.gtceu.chemical_yellow_dye": "ǝʎᗡ ʍoןןǝʎ ןɐɔıɯǝɥƆ", - "item.gtceu.chipped_glass_gem": "ןɐʇsʎɹƆ ssɐן⅁ pǝddıɥƆ", - "item.gtceu.chipped_sugar_gem": "sǝqnƆ ɹɐbnS ןןɐɯS", - "item.gtceu.circuit.integrated.gui": "uoıʇɐɹnbıɟuoƆ ʇınɔɹıƆ pǝɯɯɐɹboɹԀㄥ§", - "item.gtceu.coke_oven_brick": "ʞɔıɹᗺ uǝʌO ǝʞoƆ", - "item.gtceu.compressed_clay": "ʎɐןƆ pǝssǝɹdɯoƆ", - "item.gtceu.compressed_coke_clay": "ʎɐןƆ ǝʞoƆ pǝssǝɹdɯoƆ", - "item.gtceu.compressed_fireclay": "ʎɐןɔǝɹıℲ pǝssǝɹdɯoƆ", - "item.gtceu.computer_monitor_cover": "ɹoʇıuoW ɹǝʇndɯoƆ", - "item.gtceu.computer_monitor_cover.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ㄥ§ɐʇɐᗡɟ§ sʎɐןdsıᗡㄥ§", - "item.gtceu.conveyor.module.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ sǝʇɐɹ ɔıɟıɔǝds ʇɐ ㄥ§sɯǝʇIɟ§ sɹǝɟsuɐɹ⟘ㄥ§", - "item.gtceu.cpu_chip": "dıɥƆ ∩ԀƆ", - "item.gtceu.cpu_chip.tooltip": "ʇıu∩ buıssǝɔoɹԀ ןɐɹʇuǝƆㄥ§", - "item.gtceu.cpu_wafer": "ɹǝɟɐM ∩ԀƆ", - "item.gtceu.cpu_wafer.tooltip": "ʇıu∩ buıssǝɔoɹԀ ʍɐᴚㄥ§", - "item.gtceu.crushed_bentonite_ore": "ǝʇıuoʇuǝᗺ punoɹ⅁", - "item.gtceu.crushed_cassiterite_sand_ore": "puɐS ǝʇıɹǝʇıssɐƆ punoɹ⅁", - "item.gtceu.crushed_pitchblende_ore": "ǝpuǝןqɥɔʇıԀ punoɹ⅁", - "item.gtceu.crushed_talc_ore_ore": "ɔןɐ⟘ punoɹ⅁", - "item.gtceu.crystal_cpu": "∩ԀƆ ןɐʇsʎɹƆ", - "item.gtceu.crystal_cpu.tooltip": "ʇıu∩ buıssǝɔoɹԀ ןɐʇsʎɹƆㄥ§", - "item.gtceu.crystal_processor": "ɹossǝɔoɹԀ ןɐʇsʎɹƆ", - "item.gtceu.crystal_processor.tooltip.0": "buıʌɐɹbuƎ ןɐʇsʎɹƆ ɟo ǝbɐʇuɐʌpⱯ buıʞɐ⟘ㄥ§", - "item.gtceu.crystal_processor.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-ΛI6§", - "item.gtceu.crystal_processor_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹԀ ןɐʇsʎɹƆ", - "item.gtceu.crystal_processor_assembly.tooltip.0": "buıʌɐɹbuƎ ןɐʇsʎɹƆ ɟo ǝbɐʇuɐʌpⱯ buıʞɐ⟘ㄥ§", - "item.gtceu.crystal_processor_assembly.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-ΛnꞀ6§", - "item.gtceu.crystal_processor_computer": "ɹǝʇndɯoɔɹǝdnS ɹossǝɔoɹԀ ןɐʇsʎɹƆ", - "item.gtceu.crystal_processor_computer.tooltip.0": "buıʌɐɹbuƎ ןɐʇsʎɹƆ ɟo ǝbɐʇuɐʌpⱯ buıʞɐ⟘ㄥ§", - "item.gtceu.crystal_processor_computer.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-WԀZ6§", - "item.gtceu.crystal_processor_mainframe": "ǝɯɐɹɟuıɐW ɹossǝɔoɹԀ ןɐʇsʎɹƆ", - "item.gtceu.crystal_processor_mainframe.tooltip.0": "buıʌɐɹbuƎ ןɐʇsʎɹƆ ɟo ǝbɐʇuɐʌpⱯ buıʞɐ⟘ㄥ§", - "item.gtceu.crystal_processor_mainframe.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-Λ∩6§", - "item.gtceu.crystal_soc": "ƆoS ןɐʇsʎɹƆ", - "item.gtceu.crystal_soc.tooltip": "dıɥƆ uo ɯǝʇsʎS ןɐʇsʎɹƆㄥ§", - "item.gtceu.cyan_dye_spray_can": ")uɐʎƆ( uɐƆ ʎɐɹdS", - "item.gtceu.cyan_glass_lens": ")uɐʎƆ( suǝꞀ ssɐן⅁", - "item.gtceu.cylinder_casting_mold": ")ɹǝpuıןʎƆ( pןoW buıʇsɐƆ", - "item.gtceu.cylinder_casting_mold.tooltip": "sɹǝpuıןʎƆ buıdɐɥs ɹoɟ pןoWㄥ§", - "item.gtceu.dark_ash_dust": "sǝɥsⱯ ʞɹɐᗡ", - "item.gtceu.data_module": "ǝןnpoW ɐʇɐᗡ", - "item.gtceu.data_orb": "qɹO ɐʇɐᗡ", - "item.gtceu.data_orb.tooltip": "ǝbɐɹoʇS ɐʇɐᗡ ʎʇıɔɐdɐƆ ɥbıH Ɐㄥ§", - "item.gtceu.data_stick": "ʞɔıʇS ɐʇɐᗡ", - "item.gtceu.data_stick.tooltip": "ǝbɐɹoʇS ɐʇɐᗡ ʎʇıɔɐdɐƆ ʍoꞀ Ɐㄥ§", - "item.gtceu.diamond_grinding_head": "pɐǝH buıpuıɹ⅁ puoɯɐıᗡ", - "item.gtceu.diode": "ǝpoıᗡ", - "item.gtceu.diode.tooltip": "ʇuǝuodɯoƆ ɔıuoɹʇɔǝןƎ ɔısɐᗺㄥ§", - "item.gtceu.dough": "ɥbnoᗡ", - "item.gtceu.duct_tape": "ㄣ8-ꞀⱯℲ ǝdɐ⟘ ʇɔnᗡ pǝɔɹoɟuıǝᴚ pǝɔuɐʌpⱯ ǝɔɐdsoɹǝⱯ ɥɔǝ⟘uıɐɹᗺ", - "item.gtceu.duct_tape.tooltip": "¡ʇı ɟo ǝɹoɯ ǝsn 'sıɥʇ ɥʇıʍ ʇı xıɟ ʇ,uɐɔ noʎ ɟIㄥ§", - "item.gtceu.dynamite": "ǝʇıɯɐuʎᗡ", - "item.gtceu.electric.pump.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ sǝʇɐɹ ɔıɟıɔǝds ʇɐ ㄥ§spınןℲɟ§ sɹǝɟsuɐɹ⟘ㄥ§", - "item.gtceu.electric_jetpack": "ʞɔɐdʇǝſ ɔıɹʇɔǝןƎ", - "item.gtceu.empty_mold": "pןoW ʎʇdɯƎ", - "item.gtceu.empty_mold.tooltip": "sǝdɐɥS ǝpnɹʇxƎ puɐ spןoW ǝʞɐɯ oʇ ǝʇɐןԀ ʍɐᴚㄥ§", - "item.gtceu.empty_spray_can": ")ʎʇdɯƎ( uɐƆ ʎɐɹdS", - "item.gtceu.empty_spray_can.tooltip": "sɹoןoɔ snoıɹɐʌ ɟo sʎɐɹds ɥʇıʍ pǝןןıɟ ǝq uɐƆㄥ§", - "item.gtceu.empty_wooden_form": "ɯɹoℲ uǝpooM ʎʇdɯƎ", - "item.gtceu.ender_fluid_link_cover": "ʞuıꞀ pınןℲ ɹǝpuƎ", - "item.gtceu.ender_fluid_link_cover.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ㄥ§uoıʇɔǝuuoƆ ɟ§ɹǝpuƎp§ ssǝןǝɹıMɟ§ ɐ ɥʇıʍ ㄥ§spınןℲɟ§ sʇɹodsuɐɹ⟘ㄥ§", - "item.gtceu.ender_item_link_cover": "ʞuıꞀ ɯǝʇI ɹǝpuƎ", - "item.gtceu.ender_redstone_link_cover": "ʞuıꞀ ǝuoʇspǝᴚ ɹǝpuƎ", - "item.gtceu.energium_dust": "ʇsnᗡ ɯnıbɹǝuƎ", - "item.gtceu.energy_cluster": "ɹǝʇsnןƆ ʎbɹǝuƎ", - "item.gtceu.energy_cluster.tooltip": "ʎɹǝʇʇɐᗺ ǝןqɐsnǝᴚㄥ§", - "item.gtceu.energy_crystal": "ןɐʇsʎɹƆ ɯnıbɹǝuƎ", - "item.gtceu.energy_crystal.tooltip": "ʎɹǝʇʇɐᗺ ǝןqɐsnǝᴚㄥ§", - "item.gtceu.energy_detector_cover": "ɹoʇɔǝʇǝᗡ ʎbɹǝuƎ", - "item.gtceu.energy_detector_cover.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ǝuoʇspǝᴚ sɐ ㄥ§ʇunoɯⱯ ʎbɹǝuƎɟ§ ʇno sǝʌı⅁ㄥ§", - "item.gtceu.energy_module": "ǝןnpoW ʎbɹǝuƎ", - "item.gtceu.energy_module.tooltip": "ʎɹǝʇʇɐᗺ ǝןqɐsnǝᴚㄥ§", - "item.gtceu.engraved_crystal_chip": "dıɥƆ ןɐʇsʎɹƆ pǝʌɐɹbuƎ", - "item.gtceu.engraved_crystal_chip.tooltip": "sʇınɔɹıƆ ɹoɟ pǝpǝǝNㄥ§", - "item.gtceu.engraved_lapotron_crystal_chip": "dıɥƆ ןɐʇsʎɹƆ uoɹʇodɐꞀ pǝʌɐɹbuƎ", - "item.gtceu.epoxy_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ ʎxodƎ", - "item.gtceu.epoxy_circuit_board.tooltip": "pɹɐoᗺ pǝɔuɐʌpⱯ uⱯㄥ§", - "item.gtceu.epoxy_printed_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ pǝʇuıɹԀ ʎxodƎ", - "item.gtceu.epoxy_printed_circuit_board.tooltip": "pɹɐoᗺ ʇınɔɹıƆ pǝɔuɐʌpⱯ uⱯㄥ§", - "item.gtceu.ev_battery_hull": "ןןnH ʎɹǝʇʇɐᗺ ɯnıpɐuɐΛ ןןɐɯS", - "item.gtceu.ev_battery_hull.tooltip": "ןןnH ʎɹǝʇʇɐᗺㄥ§ ΛƎϛ§ ʎʇdɯǝ uⱯㄥ§", - "item.gtceu.ev_conveyor_module": "ǝןnpoW ɹoʎǝʌuoƆ ΛƎ", - "item.gtceu.ev_electric_motor": "ɹoʇoW ɔıɹʇɔǝןƎ ΛƎ", - "item.gtceu.ev_electric_piston": "uoʇsıԀ ɔıɹʇɔǝןƎ ΛƎ", - "item.gtceu.ev_electric_pump": "dɯnԀ ɔıɹʇɔǝןƎ ΛƎ", - "item.gtceu.ev_emitter": "ɹǝʇʇıɯƎ ΛƎ", - "item.gtceu.ev_field_generator": "ɹoʇɐɹǝuǝ⅁ pןǝıℲ ΛƎ", - "item.gtceu.ev_fluid_regulator": "ɹoʇɐןnbǝᴚ pınןℲ ΛƎ", - "item.gtceu.ev_power_unit": "ʇıu∩ ɹǝʍoԀ ΛƎ", - "item.gtceu.ev_robot_arm": "ɯɹⱯ ʇoqoᴚ ΛƎ", - "item.gtceu.ev_sensor": "ɹosuǝS ΛƎ", - "item.gtceu.ev_solar_panel": "ןǝuɐԀ ɹɐןoS ǝbɐʇןoΛ ǝɯǝɹʇxƎ", - "item.gtceu.ev_vanadium_battery": "ʎɹǝʇʇɐᗺ ɯnıpɐuɐΛ ןןɐɯS", - "item.gtceu.ev_vanadium_battery.tooltip": "ʎɹǝʇʇɐᗺ ǝןqɐsnǝᴚㄥ§", - "item.gtceu.ev_voltage_coil": "ןıoƆ ǝbɐʇןoΛ ǝɯǝɹʇxƎ", - "item.gtceu.ev_voltage_coil.tooltip": "ןıoƆ ǝɯǝɹʇxƎ", - "item.gtceu.exquisite_glass_gem": "ןɐʇsʎɹƆ ssɐן⅁ ǝʇısınbxƎ", - "item.gtceu.facade_cover": "ǝpɐɔɐℲ ɹǝʌoƆ %s", - "item.gtceu.facade_cover.tooltip.0": "˙ㄥ§ɹǝʌoƆɟ§ ʇıɟʇnO ǝʌıʇɐɹoɔǝᗡㄥ§", - "item.gtceu.facade_cover.tooltip.1": "ʞɔoןq ʎuɐ puɐ ǝʇɐןԀ uoɹI uɐ buısn pǝʇɟɐɹƆㄥ§", - "item.gtceu.face_mask": "ʞsɐW ǝɔɐℲ", - "item.gtceu.fertilizer": "ɹǝzıןıʇɹǝℲ", - "item.gtceu.fiber_reinforced_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ pǝɔɹoɟuıǝᴚ-ɹǝqıℲ", - "item.gtceu.fiber_reinforced_circuit_board.tooltip": "pɹɐoᗺ ǝɯǝɹʇxƎ uⱯㄥ§", - "item.gtceu.fiber_reinforced_printed_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ pǝʇuıɹԀ pǝɔɹoɟuıǝᴚ-ɹǝqıℲ", - "item.gtceu.fiber_reinforced_printed_circuit_board.tooltip": "pɹɐoᗺ ʇınɔɹıƆ pǝɔuɐʌpⱯ ǝɹoW Ɐㄥ§", - "item.gtceu.file_extruder_mold.tooltip": "sǝןıℲ buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.fine_borosilicate_glass_wire": "sɹǝqıℲ ssɐן⅁ ǝʇɐɔıןısoɹoᗺ", - "item.gtceu.firebrick": "ʞɔıɹqǝɹıℲ", - "item.gtceu.firebrick.tooltip": "ʇuɐʇsısǝɹ ʇɐǝHㄥ§", - "item.gtceu.flawed_glass_gem": "ןɐʇsʎɹƆ ssɐן⅁ pǝʍɐןℲ", - "item.gtceu.flawed_sugar_gem": "ǝqnƆ ɹɐbnS ʎuı⟘", - "item.gtceu.flawless_glass_gem": "ןɐʇsʎɹƆ ssɐן⅁ ssǝןʍɐןℲ", - "item.gtceu.fluid.regulator.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ sǝıʇıʇuɐnb ɔıɟıɔǝds oʇ ㄥ§spınןℲɟ§ sʇıɯıꞀㄥ§", - "item.gtceu.fluid_cell": "ןןǝƆ pınןℲ %s", - "item.gtceu.fluid_detector_cover": "ɹoʇɔǝʇǝᗡ pınןℲ", - "item.gtceu.fluid_detector_cover.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ǝuoʇspǝᴚ sɐ ㄥ§ʇunoɯⱯ pınןℲɟ§ ʇno sǝʌı⅁ㄥ§", - "item.gtceu.fluid_filter": "ɹǝʇןıℲ pınןℲ", - "item.gtceu.fluid_filter.tooltip.0": "˙ㄥ§ɹǝʌoƆɟ§ sɐ O/I ㄥ§pınןℲɟ§ sɹǝʇןıℲㄥ§", - "item.gtceu.fluid_filter.tooltip.1": "˙ǝpɐɹbdn ㄥ§ɹoʇɐןnbǝᴚ pınןℲɟ§ puɐ ㄥ§dɯnԀ ɔıɹʇɔǝןƎɟ§ uɐ sɐ pǝsn ǝq uɐƆ", - "item.gtceu.fluid_tag_filter": "ɹǝʇןıℲ bɐ⟘ pınןℲ", - "item.gtceu.fluid_tag_filter.tooltip.0": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ㄥ§sbɐ⟘ pınןℲɟ§ ɥʇıʍ O/I ㄥ§pınןℲɟ§ sɹǝʇןıℲㄥ§", - "item.gtceu.fluid_tag_filter.tooltip.1": "˙ǝpɐɹbdn ㄥ§ɹoʇɐןnbǝᴚ pınןℲɟ§ puɐ ㄥ§dɯnԀ ɔıɹʇɔǝןƎɟ§ uɐ sɐ pǝsn ǝq uɐƆ", - "item.gtceu.fluid_voiding_cover": "ɹǝʌoƆ buıpıoΛ pınןℲ", - "item.gtceu.fluid_voiding_cover.tooltip.0": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ㄥ§spınןℲɟ§ spıoΛㄥ§", - "item.gtceu.fluid_voiding_cover.tooltip.1": "˙ʇuǝɯǝɔɐןd ɹǝʇɟɐ ㄥ§ʇǝןןɐW ʇɟoSɟ§ ɥʇıʍ ǝʇɐʌıʇɔⱯ", - "item.gtceu.foam_sprayer.tooltip.0": "ɯɐoℲ uoıʇɔnɹʇsuoƆ sʎɐɹdSㄥ§", - "item.gtceu.foam_sprayer.tooltip.1": "sǝɯɐɹɟ pǝʇɔǝuuoɔ ɯɐoɟ oʇ ǝɯɐɹɟ ɐ uo ǝs∩", - "item.gtceu.foam_sprayer.tooltip.2": "pǝɹoןoɔ ǝq uɐɔ ɯɐoℲ", - "item.gtceu.foil_extruder_mold": ")ןıoℲ( pןoW ɹǝpnɹʇxƎ", - "item.gtceu.foil_extruder_mold.tooltip": "sןɐʇǝW-uoN ɯoɹɟ sןıoℲ buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.fullers_earth_dust": "ɥʇɹɐƎ sɹǝןןnℲ", - "item.gtceu.garnet_sand_dust": "puɐS ʇǝuɹɐ⅁", - "item.gtceu.gear_casting_mold": ")ɹɐǝ⅁( pןoW buıʇsɐƆ", - "item.gtceu.gear_casting_mold.small.tooltip": "sɹɐǝ⅁ ןןɐɯs buıʞɐɯ ɹoɟ pןoWㄥ§", - "item.gtceu.gear_casting_mold.tooltip": "sɹɐǝ⅁ buıʞɐɯ ɹoɟ pןoWㄥ§", - "item.gtceu.gear_extruder_mold": ")ɹɐǝ⅁( pןoW ɹǝpnɹʇxƎ", - "item.gtceu.gear_extruder_mold.tooltip": "sɹɐǝ⅁ buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.gear_small_extruder_mold.tooltip": "sɹɐǝ⅁ ןןɐɯS buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.gelled_toluene": "ǝuǝnןo⟘ pǝןןǝ⅁", - "item.gtceu.gelled_toluene.tooltip": "ǝʌısoןdxƎ ʍɐᴚㄥ§", - "item.gtceu.glass_gem": "ןɐʇsʎɹƆ ssɐן⅁", - "item.gtceu.glass_plate": "ǝuɐԀ ssɐן⅁", - "item.gtceu.glass_tube": "ǝqn⟘ ssɐן⅁", - "item.gtceu.glass_vial": "ןɐıΛ ssɐן⅁ %s", - "item.gtceu.glauconite_sand_dust": "puɐS ǝʇıuoɔnɐן⅁", - "item.gtceu.good_electronic_circuit": "ʇınɔɹıƆ ɔıuoɹʇɔǝןƎ poo⅁", - "item.gtceu.good_electronic_circuit.tooltip.0": "ʇınɔɹıƆ puoɔǝS ɹnoʎㄥ§", - "item.gtceu.good_electronic_circuit.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-ΛWɔ§", - "item.gtceu.good_integrated_circuit": "ʇınɔɹıƆ pǝʇɐɹbǝʇuI poo⅁", - "item.gtceu.good_integrated_circuit.tooltip.0": "ןnɟɹǝʍod ǝɹoɯ puɐ ɹǝןןɐɯSㄥ§", - "item.gtceu.good_integrated_circuit.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-ΛW9§", - "item.gtceu.granitic_mineral_sand_dust": "puɐS ןɐɹǝuıW ɔıʇıuɐɹ⅁", - "item.gtceu.gravi_star": "ɹɐʇS-ıʌɐɹ⅁", - "item.gtceu.gravi_star.tooltip": "ɹɐʇS ɹǝɥʇǝN ǝʇɐɯıʇן∩ㄥ§", - "item.gtceu.gravitation_engine_unit": "ʇıu∩ ǝuıbuƎ uoıʇɐʇıʌɐɹ⅁", - "item.gtceu.gray_dye_spray_can": ")ʎɐɹ⅁( uɐƆ ʎɐɹdS", - "item.gtceu.gray_glass_lens": ")ʎɐɹ⅁( suǝꞀ ssɐן⅁", - "item.gtceu.green_dye_spray_can": ")uǝǝɹ⅁( uɐƆ ʎɐɹdS", - "item.gtceu.green_glass_lens": ")uǝǝɹ⅁( suǝꞀ ssɐן⅁", - "item.gtceu.hammer_extruder_mold.tooltip": "sɹǝɯɯɐH buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.hazmat_boots": "sʇooᗺ ʇınS sןɐıɹǝʇɐW snopɹɐzɐH", - "item.gtceu.hazmat_chestpiece": "ǝɔǝıdʇsǝɥƆ ʇınS sןɐıɹǝʇɐW snopɹɐzɐH", - "item.gtceu.hazmat_headpiece": "ǝɔǝıdpɐǝH ʇınS sןɐıɹǝʇɐW snopɹɐzɐH", - "item.gtceu.hazmat_leggings": "sbuıbbǝꞀ ʇınS sןɐıɹǝʇɐW snopɹɐzɐH", - "item.gtceu.highly_advanced_soc": "ƆoSⱯH", - "item.gtceu.highly_advanced_soc.tooltip": "dıɥƆ uo ɯǝʇsʎS pǝɔuɐʌpⱯ ʎןɥbıHㄥ§", - "item.gtceu.highly_advanced_soc_wafer": "ɹǝɟɐM ƆoSⱯH", - "item.gtceu.highly_advanced_soc_wafer.tooltip": "ʇınɔɹıƆ pǝɔuɐʌpⱯ ʎןɥbıH ʍɐᴚㄥ§", - "item.gtceu.hoe_extruder_mold.tooltip": "sǝoH buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.hpic_chip": "dıɥƆ ƆIԀH", - "item.gtceu.hpic_chip.tooltip": "ƆI ɹǝʍoԀ ɥbıHㄥ§", - "item.gtceu.hpic_wafer": "ɹǝɟɐM ƆIԀH", - "item.gtceu.hpic_wafer.tooltip": "ʇınɔɹıƆ ɹǝʍoԀ ɥbıH ʍɐᴚㄥ§", - "item.gtceu.huge_pipe_casting_mold": ")ǝdıԀ ǝbnH( pןoW buıʇsɐƆ", - "item.gtceu.huge_pipe_extruder_mold": ")ǝdıԀ ǝbnH( pןoW ɹǝpnɹʇxƎ", - "item.gtceu.hv_battery_hull": "ןןnH ʎɹǝʇʇɐᗺ ǝbɹɐꞀ", - "item.gtceu.hv_battery_hull.tooltip": "ןןnH ʎɹǝʇʇɐᗺㄥ§ ΛH9§ ʎʇdɯǝ uⱯㄥ§", - "item.gtceu.hv_cadmium_battery": "ʎɹǝʇʇɐᗺ ɯnıɯpɐƆ ǝbɹɐꞀ", - "item.gtceu.hv_cadmium_battery.tooltip": "ʎɹǝʇʇɐᗺ ǝןqɐsnǝᴚㄥ§", - "item.gtceu.hv_conveyor_module": "ǝןnpoW ɹoʎǝʌuoƆ ΛH", - "item.gtceu.hv_electric_motor": "ɹoʇoW ɔıɹʇɔǝןƎ ΛH", - "item.gtceu.hv_electric_piston": "uoʇsıԀ ɔıɹʇɔǝןƎ ΛH", - "item.gtceu.hv_electric_pump": "dɯnԀ ɔıɹʇɔǝןƎ ΛH", - "item.gtceu.hv_emitter": "ɹǝʇʇıɯƎ ΛH", - "item.gtceu.hv_field_generator": "ɹoʇɐɹǝuǝ⅁ pןǝıℲ ΛH", - "item.gtceu.hv_fluid_regulator": "ɹoʇɐןnbǝᴚ pınןℲ ΛH", - "item.gtceu.hv_item_magnet": "ʇǝubɐW ɯǝʇI ΛH", - "item.gtceu.hv_lithium_battery": "ʎɹǝʇʇɐᗺ ɯnıɥʇıꞀ ǝbɹɐꞀ", - "item.gtceu.hv_lithium_battery.tooltip": "ʎɹǝʇʇɐᗺ ǝןqɐsnǝᴚㄥ§", - "item.gtceu.hv_power_unit": "ʇıu∩ ɹǝʍoԀ ΛH", - "item.gtceu.hv_robot_arm": "ɯɹⱯ ʇoqoᴚ ΛH", - "item.gtceu.hv_sensor": "ɹosuǝS ΛH", - "item.gtceu.hv_sodium_battery": "ʎɹǝʇʇɐᗺ ɯnıpoS ǝbɹɐꞀ", - "item.gtceu.hv_sodium_battery.tooltip": "ʎɹǝʇʇɐᗺ ǝןqɐsnǝᴚㄥ§", - "item.gtceu.hv_solar_panel": "ןǝuɐԀ ɹɐןoS ǝbɐʇןoΛ ɥbıH", - "item.gtceu.hv_voltage_coil": "ןıoƆ ǝbɐʇןoΛ ɥbıH", - "item.gtceu.hv_voltage_coil.tooltip": "ןıoƆ pǝɔuɐʌpⱯ", - "item.gtceu.ice_dust": "ǝɔI pǝɥsnɹƆ", - "item.gtceu.ilc_chip": "dıɥƆ ƆI", - "item.gtceu.ilc_chip.tooltip": "ʇınɔɹıƆ ɔıboꞀ pǝʇɐɹbǝʇuIㄥ§", - "item.gtceu.ilc_wafer": "ɹǝɟɐM ƆꞀI", - "item.gtceu.ilc_wafer.tooltip": "ʇınɔɹıƆ pǝʇɐɹbǝʇuI ʍɐᴚㄥ§", - "item.gtceu.image_module": "ǝןnpoW ǝbɐɯI", - "item.gtceu.impure_bentonite_dust": "ǝʇıuoʇuǝᗺ ɟo ǝןıԀ ǝɹndɯI", - "item.gtceu.impure_cassiterite_sand_dust": "puɐS ǝʇıɹǝʇıssɐƆ ɟo ǝןıԀ ǝɹndɯI", - "item.gtceu.impure_pitchblende_dust": "ǝpuǝןqɥɔʇıԀ ɟo ǝןıԀ ǝɹndɯI", - "item.gtceu.impure_rock_salt_dust": "ʇןɐS ʞɔoᴚ ɟo ǝןıԀ ǝɹndɯI", - "item.gtceu.impure_salt_dust": "ʇןɐS ɟo ǝןıԀ ǝɹndɯI", - "item.gtceu.impure_talc_dust": "ɔןɐ⟘ ɟo ǝןıԀ ǝɹndɯI", - "item.gtceu.inductor": "ɹoʇɔnpuI", - "item.gtceu.inductor.tooltip": "ןıoƆ ןןɐɯS Ɐㄥ§", - "item.gtceu.inert_metal_mixture_dust": "ǝɹnʇxıW ןɐʇǝW ʇɹǝuI", - "item.gtceu.infinite_water_cover": "ɹǝʌoƆ ɹǝʇɐM ǝʇıuıɟuI", - "item.gtceu.infinite_water_cover.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ㄥ§ɹǝʇɐM6§ ɥʇıʍ sɹǝuıɐʇuoɔ pǝɥɔɐʇʇɐ sןןıℲㄥ§", - "item.gtceu.ingot_casting_mold": ")ʇobuI( pןoW buıʇsɐƆ", - "item.gtceu.ingot_casting_mold.tooltip": "sʇobuI buıʞɐɯ ɹoɟ pןoWㄥ§", - "item.gtceu.ingot_extruder_mold": ")ʇobuI( pןoW ɹǝpnɹʇxƎ", - "item.gtceu.ingot_extruder_mold.tooltip": "¿ǝɔɐuɹnℲ ɐ ǝsn ʇsnظ ǝʍ ʇ,uɐɔ 'ʇıɐʍ 'ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.invar_lighter": "ɹǝʇɥbıꞀ ɹɐʌuI", - "item.gtceu.iridium_metal_residue_dust": "ǝnpısǝᴚ ןɐʇǝW ɯnıpıɹI", - "item.gtceu.iron_minecart_wheels": "sןǝǝɥM ʇɹɐɔǝuıW uoɹI", - "item.gtceu.item_detector_cover": "ɹoʇɔǝʇǝᗡ ɯǝʇI", - "item.gtceu.item_detector_cover.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ǝuoʇspǝᴚ sɐ ㄥ§ʇunoɯⱯ ɯǝʇIɟ§ ʇno sǝʌı⅁ㄥ§", - "item.gtceu.item_filter": "ɹǝʇןıℲ ɯǝʇI", - "item.gtceu.item_filter.tooltip.0": "˙ㄥ§ɹǝʌoƆɟ§ sɐ O/I ㄥ§ɯǝʇIɟ§ sɹǝʇןıℲㄥ§", - "item.gtceu.item_filter.tooltip.1": "˙ǝpɐɹbdn ㄥ§ɯɹⱯ ɔıʇoqoᴚɟ§ puɐ ㄥ§ǝןnpoW ɹoʎǝʌuoƆɟ§ ɐ sɐ pǝsn ǝq uɐƆ", - "item.gtceu.item_smart_filter": "ɹǝʇןıℲ ɯǝʇI ʇɹɐɯS", - "item.gtceu.item_smart_filter.tooltip.0": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ㄥ§sǝdıɔǝᴚ ǝuıɥɔɐWɟ§ ɥʇıʍ O/I ㄥ§ɯǝʇIɟ§ sɹǝʇןıℲㄥ§", - "item.gtceu.item_smart_filter.tooltip.1": "˙ǝpɐɹbdn ㄥ§ɯɹⱯ ɔıʇoqoᴚɟ§ puɐ ㄥ§ǝןnpoW ɹoʎǝʌuoƆɟ§ ɐ sɐ pǝsn ǝq uɐƆ", - "item.gtceu.item_tag_filter": "ɹǝʇןıℲ bɐ⟘ ɯǝʇI", - "item.gtceu.item_tag_filter.tooltip.0": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ㄥ§sbɐ⟘ ɯǝʇIɟ§ ɥʇıʍ O/I ㄥ§ɯǝʇIɟ§ sɹǝʇןıℲㄥ§", - "item.gtceu.item_tag_filter.tooltip.1": "˙ǝpɐɹbdn ㄥ§ɯɹⱯ ɔıʇoqoᴚɟ§ puɐ ㄥ§ǝןnpoW ɹoʎǝʌuoƆɟ§ ɐ sɐ pǝsn ǝq uɐƆ", - "item.gtceu.item_voiding_cover": "ɹǝʌoƆ buıpıoΛ ɯǝʇI", - "item.gtceu.item_voiding_cover.tooltip.0": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ㄥ§sɯǝʇIɟ§ spıoΛㄥ§", - "item.gtceu.item_voiding_cover.tooltip.1": "˙ʇuǝɯǝɔɐןd ɹǝʇɟɐ ㄥ§ʇǝןןɐW ʇɟoSɟ§ ɥʇıʍ ǝʇɐʌıʇɔⱯ", - "item.gtceu.iv_battery_hull": "ןןnH ʎɹǝʇʇɐᗺ ɯnıpɐuɐΛ ɯnıpǝW", - "item.gtceu.iv_battery_hull.tooltip": "ןןnH ʎɹǝʇʇɐᗺㄥ§ ΛIƖ§ ʎʇdɯǝ uⱯㄥ§", - "item.gtceu.iv_conveyor_module": "ǝןnpoW ɹoʎǝʌuoƆ ΛI", - "item.gtceu.iv_electric_motor": "ɹoʇoW ɔıɹʇɔǝןƎ ΛI", - "item.gtceu.iv_electric_piston": "uoʇsıԀ ɔıɹʇɔǝןƎ ΛI", - "item.gtceu.iv_electric_pump": "dɯnԀ ɔıɹʇɔǝןƎ ΛI", - "item.gtceu.iv_emitter": "ɹǝʇʇıɯƎ ΛI", - "item.gtceu.iv_field_generator": "ɹoʇɐɹǝuǝ⅁ pןǝıℲ ΛI", - "item.gtceu.iv_fluid_regulator": "ɹoʇɐןnbǝᴚ pınןℲ ΛI", - "item.gtceu.iv_power_unit": "ʇıu∩ ɹǝʍoԀ ΛI", - "item.gtceu.iv_robot_arm": "ɯɹⱯ ʇoqoᴚ ΛI", - "item.gtceu.iv_sensor": "ɹosuǝS ΛI", - "item.gtceu.iv_solar_panel": "ןǝuɐԀ ɹɐןoS ǝbɐʇןoΛ ǝuɐsuI", - "item.gtceu.iv_vanadium_battery": "ʎɹǝʇʇɐᗺ ɯnıpɐuɐΛ ɯnıpǝW", - "item.gtceu.iv_vanadium_battery.tooltip": "ʎɹǝʇʇɐᗺ ǝןqɐsnǝᴚㄥ§", - "item.gtceu.iv_voltage_coil": "ןıoƆ ǝbɐʇןoΛ ǝuɐsuI", - "item.gtceu.iv_voltage_coil.tooltip": "ןıoƆ ǝʇıןƎ", - "item.gtceu.lapotron_crystal": "ןɐʇsʎɹƆ uoɹʇodɐꞀ", - "item.gtceu.lapotron_crystal.tooltip": "ʎɹǝʇʇɐᗺ ǝןqɐsnǝᴚㄥ§", - "item.gtceu.lapotronic_energy_orb": "qɹO ʎbɹǝuƎ ɔıuoɹʇodɐꞀ", - "item.gtceu.lapotronic_energy_orb.tooltip": "ʎɹǝʇʇɐᗺ ǝןqɐsnǝᴚㄥ§", - "item.gtceu.lapotronic_energy_orb_cluster": "ɹǝʇsnןƆ qɹO ʎbɹǝuƎ ɔıuoɹʇodɐꞀ", - "item.gtceu.lapotronic_energy_orb_cluster.tooltip": "ʎɹǝʇʇɐᗺ ǝןqɐsnǝᴚㄥ§", - "item.gtceu.large_pipe_casting_mold": ")ǝdıԀ ǝbɹɐꞀ( pןoW buıʇsɐƆ", - "item.gtceu.large_pipe_extruder_mold": ")ǝdıԀ ǝbɹɐꞀ( pןoW ɹǝpnɹʇxƎ", - "item.gtceu.light_blue_dye_spray_can": ")ǝnןᗺ ʇɥbıꞀ( uɐƆ ʎɐɹdS", - "item.gtceu.light_blue_glass_lens": ")ǝnןᗺ ʇɥbıꞀ( suǝꞀ ssɐן⅁", - "item.gtceu.light_gray_dye_spray_can": ")ʎɐɹ⅁ ʇɥbıꞀ( uɐƆ ʎɐɹdS", - "item.gtceu.light_gray_glass_lens": ")ʎɐɹ⅁ ʇɥbıꞀ( suǝꞀ ssɐן⅁", - "item.gtceu.lime_dye_spray_can": ")ǝɯıꞀ( uɐƆ ʎɐɹdS", - "item.gtceu.lime_glass_lens": ")ǝɯıꞀ( suǝꞀ ssɐן⅁", - "item.gtceu.liquid_fuel_jetpack": "ʞɔɐdʇǝſ ןǝnℲ pınbıꞀ", - "item.gtceu.long_treated_wood_rod": "ʞɔıʇS pooM pǝʇɐǝɹ⟘ buoꞀ", - "item.gtceu.long_wood_rod": "ʞɔıʇS pooM buoꞀ", - "item.gtceu.lpic_chip": "dıɥƆ ƆIԀꞀ", - "item.gtceu.lpic_chip.tooltip": "ƆI ɹǝʍoԀ ʍoꞀㄥ§", - "item.gtceu.lpic_wafer": "ɹǝɟɐM ƆIԀꞀ", - "item.gtceu.lpic_wafer.tooltip": "ʇınɔɹıƆ ɹǝʍoԀ ʍoꞀ ʍɐᴚㄥ§", - "item.gtceu.luv_battery_hull": "ןןnH ʎɹǝʇʇɐᗺ ɯnıpɐuɐΛ ǝbɹɐꞀ", - "item.gtceu.luv_battery_hull.tooltip": "ןןnH ʎɹǝʇʇɐᗺㄥ§ ΛnꞀp§ ʎʇdɯǝ uⱯㄥ§", - "item.gtceu.luv_conveyor_module": "ǝןnpoW ɹoʎǝʌuoƆ ΛnꞀ", - "item.gtceu.luv_electric_motor": "ɹoʇoW ɔıɹʇɔǝןƎ ΛnꞀ", - "item.gtceu.luv_electric_piston": "uoʇsıԀ ɔıɹʇɔǝןƎ ΛnꞀ", - "item.gtceu.luv_electric_pump": "dɯnԀ ɔıɹʇɔǝןƎ ΛnꞀ", - "item.gtceu.luv_emitter": "ɹǝʇʇıɯƎ ΛnꞀ", - "item.gtceu.luv_field_generator": "ɹoʇɐɹǝuǝ⅁ pןǝıℲ ΛnꞀ", - "item.gtceu.luv_fluid_regulator": "ɹoʇɐןnbǝᴚ pınןℲ ΛnꞀ", - "item.gtceu.luv_robot_arm": "ɯɹⱯ ʇoqoᴚ ΛnꞀ", - "item.gtceu.luv_sensor": "ɹosuǝS ΛnꞀ", - "item.gtceu.luv_solar_panel": "ןǝuɐԀ ɹɐןoS ǝbɐʇןoΛ snoɹɔıpnꞀ", - "item.gtceu.luv_vanadium_battery": "ʎɹǝʇʇɐᗺ ɯnıpɐuɐΛ ǝbɹɐꞀ", - "item.gtceu.luv_vanadium_battery.tooltip": "ʎɹǝʇʇɐᗺ ǝןqɐsnǝᴚㄥ§", - "item.gtceu.luv_voltage_coil": "ןıoƆ ǝbɐʇןoΛ snoɹɔıpnꞀ", - "item.gtceu.luv_voltage_coil.tooltip": "ןıoƆ ɹǝʇsɐW", - "item.gtceu.lv_battery_hull": "ןןnH ʎɹǝʇʇɐᗺ ןןɐɯS", - "item.gtceu.lv_battery_hull.tooltip": "ןןnH ʎɹǝʇʇɐᗺ ΛꞀ ʎʇdɯǝ uⱯㄥ§", - "item.gtceu.lv_cadmium_battery": "ʎɹǝʇʇɐᗺ ɯnıɯpɐƆ ןןɐɯS", - "item.gtceu.lv_cadmium_battery.tooltip": "ʎɹǝʇʇɐᗺ ǝןqɐsnǝᴚㄥ§", - "item.gtceu.lv_conveyor_module": "ǝןnpoW ɹoʎǝʌuoƆ ΛꞀ", - "item.gtceu.lv_electric_motor": "ɹoʇoW ɔıɹʇɔǝןƎ ΛꞀ", - "item.gtceu.lv_electric_piston": "uoʇsıԀ ɔıɹʇɔǝןƎ ΛꞀ", - "item.gtceu.lv_electric_pump": "dɯnԀ ɔıɹʇɔǝןƎ ΛꞀ", - "item.gtceu.lv_emitter": "ɹǝʇʇıɯƎ ΛꞀ", - "item.gtceu.lv_field_generator": "ɹoʇɐɹǝuǝ⅁ pןǝıℲ ΛꞀ", - "item.gtceu.lv_fluid_regulator": "ɹoʇɐןnbǝᴚ pınןℲ ΛꞀ", - "item.gtceu.lv_item_magnet": "ʇǝubɐW ɯǝʇI ΛꞀ", - "item.gtceu.lv_lithium_battery": "ʎɹǝʇʇɐᗺ ɯnıɥʇıꞀ ןןɐɯS", - "item.gtceu.lv_lithium_battery.tooltip": "ʎɹǝʇʇɐᗺ ǝןqɐsnǝᴚㄥ§", - "item.gtceu.lv_power_unit": "ʇıu∩ ɹǝʍoԀ ΛꞀ", - "item.gtceu.lv_robot_arm": "ɯɹⱯ ʇoqoᴚ ΛꞀ", - "item.gtceu.lv_sensor": "ɹosuǝS ΛꞀ", - "item.gtceu.lv_sodium_battery": "ʎɹǝʇʇɐᗺ ɯnıpoS ןןɐɯS", - "item.gtceu.lv_sodium_battery.tooltip": "ʎɹǝʇʇɐᗺ ǝןqɐsnǝᴚㄥ§", - "item.gtceu.lv_solar_panel": "ןǝuɐԀ ɹɐןoS ǝbɐʇןoΛ ʍoꞀ", - "item.gtceu.lv_voltage_coil": "ןıoƆ ǝbɐʇןoΛ ʍoꞀ", - "item.gtceu.lv_voltage_coil.tooltip": "ןıoƆ ɔısɐᗺ", - "item.gtceu.machine_controller.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ㄥ§ℲℲO/NOɟ§ sǝuıɥɔɐW suɹn⟘ㄥ§", - "item.gtceu.machine_controller_cover": "ɹǝןןoɹʇuoƆ ǝuıɥɔɐW", - "item.gtceu.machine_memory_card": "pɹɐƆ ʎɹoɯǝW ǝuıɥɔɐW", - "item.gtceu.magenta_dye_spray_can": ")ɐʇuǝbɐW( uɐƆ ʎɐɹdS", - "item.gtceu.magenta_glass_lens": ")ɐʇuǝbɐW( suǝꞀ ssɐן⅁", - "item.gtceu.maintenance_detector_cover": "ɹoʇɔǝʇǝᗡ ǝɔuɐuǝʇuıɐW", - "item.gtceu.mask_filter": "ɹǝʇןıℲ ʞsɐW sɐ⅁", - "item.gtceu.matchbox": "xoqɥɔʇɐW", - "item.gtceu.matches": "sǝɥɔʇɐW", - "item.gtceu.max_battery": "ʎɹǝʇʇɐᗺ ǝʇɐɯıʇן∩", - "item.gtceu.max_battery.tooltip": "ʇɟɐɹɔǝuıW uıʍ oʇ sıɥʇ ןןıℲㄥ§", - "item.gtceu.max_voltage_coil.tooltip": "ןıoƆ ɯnɯıxɐW", - "item.gtceu.meat_dust": "ʇɐǝW ǝɔuıW", - "item.gtceu.micro_processor": "ɹossǝɔoɹdoɹɔıW", - "item.gtceu.micro_processor.tooltip.0": "¡pǝǝdS uoıʇɐʇndɯoƆ buızɐɯⱯㄥ§", - "item.gtceu.micro_processor.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-ΛWǝ§", - "item.gtceu.micro_processor_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹdoɹɔıW", - "item.gtceu.micro_processor_assembly.tooltip.0": "¡pǝǝdS uoıʇɐʇndɯoƆ buızɐɯⱯㄥ§", - "item.gtceu.micro_processor_assembly.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-ΛHǝ§", - "item.gtceu.micro_processor_computer": "ɹǝʇndɯoɔɹǝdnS ɹossǝɔoɹdoɹɔıW", - "item.gtceu.micro_processor_computer.tooltip.0": "¡pǝǝdS uoıʇɐʇndɯoƆ buızɐɯⱯㄥ§", - "item.gtceu.micro_processor_computer.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-ΛƎǝ§", - "item.gtceu.micro_processor_mainframe": "ǝɯɐɹɟuıɐW ɹossǝɔoɹdoɹɔıW", - "item.gtceu.micro_processor_mainframe.tooltip.0": "¡pǝǝdS uoıʇɐʇndɯoƆ buızɐɯⱯㄥ§", - "item.gtceu.micro_processor_mainframe.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-ΛIǝ§", - "item.gtceu.microchip_processor": "ɹossǝɔoɹԀ dıɥɔoɹɔıW", - "item.gtceu.microchip_processor.tooltip.0": "ʇınɔɹıƆ ɔısɐᗺ ɹoıɹǝdnS Ɐㄥ§", - "item.gtceu.microchip_processor.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-ΛꞀǝ§", - "item.gtceu.mpic_chip": "dıɥƆ ƆIԀW", - "item.gtceu.mpic_chip.tooltip": "ƆI ɹǝʍoԀㄥ§", - "item.gtceu.mpic_wafer": "ɹǝɟɐM ƆIԀW", - "item.gtceu.mpic_wafer.tooltip": "ʇınɔɹıƆ ɹǝʍoԀ ʍɐᴚㄥ§", - "item.gtceu.multilayer_fiber_reinforced_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ pǝɔɹoɟuıǝᴚ-ɹǝqıℲ ɹǝʎɐן-ıʇןnW", - "item.gtceu.multilayer_fiber_reinforced_circuit_board.tooltip": "pɹɐoᗺ ǝʇıןƎ uⱯㄥ§", - "item.gtceu.multilayer_fiber_reinforced_printed_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ pǝʇuıɹԀ pǝɔɹoɟuıǝᴚ-ɹǝqıℲ ɹǝʎɐן-ıʇןnW", - "item.gtceu.multilayer_fiber_reinforced_printed_circuit_board.tooltip": "pɹɐoᗺ ʇınɔɹıƆ ǝʇıןƎ uⱯㄥ§", - "item.gtceu.mv_battery_hull": "ןןnH ʎɹǝʇʇɐᗺ ɯnıpǝW", - "item.gtceu.mv_battery_hull.tooltip": "ןןnH ʎɹǝʇʇɐᗺㄥ§ ΛWq§ ʎʇdɯǝ uⱯㄥ§", - "item.gtceu.mv_cadmium_battery": "ʎɹǝʇʇɐᗺ ɯnıɯpɐƆ ɯnıpǝW", - "item.gtceu.mv_cadmium_battery.tooltip": "ʎɹǝʇʇɐᗺ ǝןqɐsnǝᴚㄥ§", - "item.gtceu.mv_conveyor_module": "ǝןnpoW ɹoʎǝʌuoƆ ΛW", - "item.gtceu.mv_electric_motor": "ɹoʇoW ɔıɹʇɔǝןƎ ΛW", - "item.gtceu.mv_electric_piston": "uoʇsıԀ ɔıɹʇɔǝןƎ ΛW", - "item.gtceu.mv_electric_pump": "dɯnԀ ɔıɹʇɔǝןƎ ΛW", - "item.gtceu.mv_emitter": "ɹǝʇʇıɯƎ ΛW", - "item.gtceu.mv_field_generator": "ɹoʇɐɹǝuǝ⅁ pןǝıℲ ΛW", - "item.gtceu.mv_fluid_regulator": "ɹoʇɐןnbǝᴚ pınןℲ ΛW", - "item.gtceu.mv_lithium_battery": "ʎɹǝʇʇɐᗺ ɯnıɥʇıꞀ ɯnıpǝW", - "item.gtceu.mv_lithium_battery.tooltip": "ʎɹǝʇʇɐᗺ ǝןqɐsnǝᴚㄥ§", - "item.gtceu.mv_power_unit": "ʇıu∩ ɹǝʍoԀ ΛW", - "item.gtceu.mv_robot_arm": "ɯɹⱯ ʇoqoᴚ ΛW", - "item.gtceu.mv_sensor": "ɹosuǝS ΛW", - "item.gtceu.mv_sodium_battery": "ʎɹǝʇʇɐᗺ ɯnıpoS ɯnıpǝW", - "item.gtceu.mv_sodium_battery.tooltip": "ʎɹǝʇʇɐᗺ ǝןqɐsnǝᴚㄥ§", - "item.gtceu.mv_solar_panel": "ןǝuɐԀ ɹɐןoS ǝbɐʇןoΛ ɯnıpǝW", - "item.gtceu.mv_voltage_coil": "ןıoƆ ǝbɐʇןoΛ ɯnıpǝW", - "item.gtceu.mv_voltage_coil.tooltip": "ןıoƆ poo⅁", - "item.gtceu.name_casting_mold": ")ǝɯɐN( pןoW buıʇsɐƆ", - "item.gtceu.name_casting_mold.tooltip": ")ןıʌuⱯ ɥʇıʍ pןoW ǝɯɐuǝɹ( ssǝɹԀ buıɯɹoℲ ǝɥʇ uı sɯǝʇI buıɯɐu ɹoɟ pןoWㄥ§", - "item.gtceu.nan_certificate": "ǝɹoɯʎuⱯ qooN ɐ buıǝᗺ ʇoN ɟo ǝʇɐɔıɟıʇɹǝƆ", - "item.gtceu.nan_certificate.tooltip": "¡pǝʇdǝɔɔⱯ ǝbuǝןןɐɥƆ", - "item.gtceu.nand_chip": "dıɥƆ ᗡNⱯN", - "item.gtceu.nand_chip.tooltip.0": "ʇınɔɹıƆ ǝןdɯıS ɹoıɹǝdnS Ɐㄥ§", - "item.gtceu.nand_chip.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-ΛꞀ∩9§", - "item.gtceu.nand_memory_chip": "dıɥƆ ʎɹoɯǝW ᗡNⱯN", - "item.gtceu.nand_memory_chip.tooltip": "ǝʇɐ⅁ ɔıboꞀ ᗡNⱯNㄥ§", - "item.gtceu.nand_memory_wafer": "ɹǝɟɐM ʎɹoɯǝW ᗡNⱯN", - "item.gtceu.nand_memory_wafer.tooltip": "ǝʇɐ⅁ ɔıboꞀ ʍɐᴚㄥ§", - "item.gtceu.nano_cpu_chip": "dıɥƆ ∩ԀƆ ouɐN", - "item.gtceu.nano_cpu_chip.tooltip": "ʇıu∩ buıssǝɔoɹԀ ןɐɹʇuǝƆ ouɐNㄥ§", - "item.gtceu.nano_cpu_wafer": "ɹǝɟɐM ∩ԀƆ ouɐN", - "item.gtceu.nano_cpu_wafer.tooltip": "ʇınɔɹıƆ ouɐN ʍɐᴚㄥ§", - "item.gtceu.nano_processor": "ɹossǝɔoɹdouɐN", - "item.gtceu.nano_processor.tooltip.0": "ɹǝʌǝ uɐɥʇ ɹǝןןɐɯSㄥ§", - "item.gtceu.nano_processor.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-ΛHq§", - "item.gtceu.nano_processor_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹdouɐN", - "item.gtceu.nano_processor_assembly.tooltip.0": "ɹǝʌǝ uɐɥʇ ɹǝןןɐɯSㄥ§", - "item.gtceu.nano_processor_assembly.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-ΛƎq§", - "item.gtceu.nano_processor_computer": "ɹǝʇndɯoɔɹǝdnS ɹossǝɔoɹdouɐN", - "item.gtceu.nano_processor_computer.tooltip.0": "ɹǝʌǝ uɐɥʇ ɹǝןןɐɯSㄥ§", - "item.gtceu.nano_processor_computer.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-ΛIq§", - "item.gtceu.nano_processor_mainframe": "ǝɯɐɹɟuıɐW ɹossǝɔoɹdouɐN", - "item.gtceu.nano_processor_mainframe.tooltip.0": "ɹǝʌǝ uɐɥʇ ɹǝןןɐɯSㄥ§", - "item.gtceu.nano_processor_mainframe.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-ΛnꞀq§", - "item.gtceu.nano_saber": "ɹǝqɐS ouɐN", - "item.gtceu.nano_saber.tooltip": "¡ǝɐɹnʞ oʍ uǝʞ ou uıظnʎᴚㄥ§", - "item.gtceu.nanomuscle_boots": "sʇooᗺ ǝʇınS ™ǝןɔsnWouɐN", - "item.gtceu.nanomuscle_chestplate": "ǝʇɐןdʇsǝɥƆ ǝʇınS ™ǝןɔsnWouɐN", - "item.gtceu.nanomuscle_helmet": "ʇǝɯןǝH ǝʇınS ™ǝןɔsnWouɐN", - "item.gtceu.nanomuscle_leggings": "sbuıbbǝꞀ ǝʇınS ™ǝןɔsnWouɐN", - "item.gtceu.naquadah_boule": "ǝןnoᗺ uoɔıןıS ǝuıןןɐʇsʎɹɔouoW pǝdop-ɥɐpɐnbɐN", - "item.gtceu.naquadah_boule.tooltip": "ʇınɔɹıƆ ʍɐᴚㄥ§", - "item.gtceu.naquadah_wafer": "ɹǝɟɐM pǝdop-ɥɐpɐnbɐN", - "item.gtceu.naquadah_wafer.tooltip": "ʇınɔɹıƆ ʍɐᴚㄥ§", - "item.gtceu.neuro_processing_unit": "ʇıu∩ buıssǝɔoɹԀ oɹnǝN", - "item.gtceu.neuro_processing_unit.tooltip": "∩ԀƆ oɹnǝNㄥ§", - "item.gtceu.neutron_reflector": "ɹoʇɔǝןɟǝᴚ uoɹʇnǝN ɯnıpıɹI", - "item.gtceu.neutron_reflector.tooltip": "ǝןqıʇɔnɹʇsǝpuIㄥ§", - "item.gtceu.neutronium_boule": "ǝןnoᗺ uoɔıןıS ǝuıןןɐʇsʎɹɔouoW pǝdop-ɯnıuoɹʇnǝN", - "item.gtceu.neutronium_boule.tooltip": "ʇınɔɹıƆ ʍɐᴚㄥ§", - "item.gtceu.neutronium_wafer": "ɹǝɟɐM pǝdop-ɯnıuoɹʇnǝN", - "item.gtceu.neutronium_wafer.tooltip": "ʇınɔɹıƆ ʍɐᴚㄥ§", - "item.gtceu.nightvision_goggles": "sǝןbbo⅁ uoısıʌʇɥbıN", - "item.gtceu.nor_memory_chip": "dıɥƆ ʎɹoɯǝW ᴚON", - "item.gtceu.nor_memory_chip.tooltip": "ǝʇɐ⅁ ɔıboꞀ ᴚONㄥ§", - "item.gtceu.nor_memory_wafer": "ɹǝɟɐM ʎɹoɯǝW ᴚON", - "item.gtceu.nor_memory_wafer.tooltip": "ǝʇɐ⅁ ɔıboꞀ ʍɐᴚㄥ§", - "item.gtceu.normal_pipe_casting_mold": ")ǝdıԀ ןɐɯɹoN( pןoW buıʇsɐƆ", - "item.gtceu.normal_pipe_extruder_mold": ")ǝdıԀ ןɐɯɹoN( pןoW ɹǝpnɹʇxƎ", - "item.gtceu.nugget_casting_mold": ")ʇǝbbnN( pןoW buıʇsɐƆ", - "item.gtceu.nugget_casting_mold.tooltip": "sʇǝbbnN buıʞɐɯ ɹoɟ pןoWㄥ§", - "item.gtceu.opv_conveyor_module": "ǝןnpoW ɹoʎǝʌuoƆ ΛdO", - "item.gtceu.opv_electric_motor": "ɹoʇoW ɔıɹʇɔǝןƎ ΛdO", - "item.gtceu.opv_electric_piston": "uoʇsıԀ ɔıɹʇɔǝןƎ ΛdO", - "item.gtceu.opv_electric_pump": "dɯnԀ ɔıɹʇɔǝןƎ ΛdO", - "item.gtceu.opv_emitter": "ɹǝʇʇıɯƎ ΛdO", - "item.gtceu.opv_field_generator": "ɹoʇɐɹǝuǝ⅁ pןǝıℲ ΛdO", - "item.gtceu.opv_fluid_regulator": "ɹoʇɐןnbǝᴚ pınןℲ ΛdO", - "item.gtceu.opv_robot_arm": "ɯɹⱯ ʇoqoᴚ ΛdO", - "item.gtceu.opv_sensor": "ɹosuǝS ΛdO", - "item.gtceu.opv_voltage_coil.tooltip": "ןıoƆ ʎɹɐpuǝbǝꞀ", - "item.gtceu.orange_dye_spray_can": ")ǝbuɐɹO( uɐƆ ʎɐɹdS", - "item.gtceu.orange_glass_lens": ")ǝbuɐɹO( suǝꞀ ssɐן⅁", - "item.gtceu.palladium_raw_dust": "ɹǝpʍoԀ ɯnıpɐןןɐԀ ʍɐᴚ", - "item.gtceu.paper_dust": "pɐɥƆ", - "item.gtceu.paracetamol_pill": "ןןıԀ ןoɯɐʇǝɔɐɹɐԀ", - "item.gtceu.petri_dish": "ɥsıᗡ ıɹʇǝԀ", - "item.gtceu.petri_dish.tooltip": "sןןǝƆ buıʇɐʌıʇןnɔ ɹoℲㄥ§", - "item.gtceu.phenolic_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ ɔıןouǝɥԀ", - "item.gtceu.phenolic_circuit_board.tooltip": "pɹɐoᗺ poo⅁ Ɐㄥ§", - "item.gtceu.phenolic_printed_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ pǝʇuıɹԀ ɔıןouǝɥԀ", - "item.gtceu.phenolic_printed_circuit_board.tooltip": "pɹɐoᗺ ʇınɔɹıƆ poo⅁ Ɐㄥ§", - "item.gtceu.phosphorus_boule": "ǝןnoᗺ uoɔıןıS ǝuıןןɐʇsʎɹɔouoW pǝdop-snɹoɥdsoɥԀ", - "item.gtceu.phosphorus_boule.tooltip": "ʇınɔɹıƆ ʍɐᴚㄥ§", - "item.gtceu.phosphorus_wafer": "ɹǝɟɐM pǝdop-snɹoɥdsoɥԀ", - "item.gtceu.phosphorus_wafer.tooltip": "ʇınɔɹıƆ ʍɐᴚㄥ§", - "item.gtceu.pickaxe_extruder_mold.tooltip": "sǝxɐʞɔıԀ buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.pill_casting_mold": ")ןןıԀ( pןoW buıʇsɐƆ", - "item.gtceu.pink_dye_spray_can": ")ʞuıԀ( uɐƆ ʎɐɹdS", - "item.gtceu.pink_glass_lens": ")ʞuıԀ( suǝꞀ ssɐן⅁", - "item.gtceu.pipe.huge_casting_mold.tooltip": "sǝdıԀ ʞɔoןᗺ ןןnɟ buıʞɐɯ ɹoɟ pןoWㄥ§", - "item.gtceu.pipe.huge_extruder_mold.tooltip": "sǝdıԀ ʞɔoןᗺ ןןnɟ buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.pipe.large_casting_mold.tooltip": "sǝdıԀ ǝbɹɐן buıʞɐɯ ɹoɟ pןoWㄥ§", - "item.gtceu.pipe.large_extruder_mold.tooltip": "sǝdıԀ ǝbɹɐן buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.pipe.normal_casting_mold.tooltip": "sǝdıԀ buıʞɐɯ ɹoɟ pןoWㄥ§", - "item.gtceu.pipe.normal_extruder_mold.tooltip": "sǝdıԀ buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.pipe.small_casting_mold.tooltip": "sǝdıԀ ןןɐɯs buıʞɐɯ ɹoɟ pןoWㄥ§", - "item.gtceu.pipe.small_extruder_mold.tooltip": "sǝdıԀ ןןɐɯs buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.pipe.tiny_casting_mold.tooltip": "sǝdıԀ ʎuıʇ buıʞɐɯ ɹoɟ pןoWㄥ§", - "item.gtceu.pipe.tiny_extruder_mold.tooltip": "sǝdıԀ ʎuıʇ buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.pitchblende_dust": "ǝpuǝןqɥɔʇıԀ", - "item.gtceu.plant_ball": "ןןɐᗺ ʇuɐןԀ", - "item.gtceu.plastic_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ ɔıʇsɐןԀ", - "item.gtceu.plastic_circuit_board.tooltip": "pɹɐoᗺ poo⅁ Ɐㄥ§", - "item.gtceu.plastic_printed_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ pǝʇuıɹԀ ɔıʇsɐןԀ", - "item.gtceu.plastic_printed_circuit_board.tooltip": "pɹɐoᗺ ʇınɔɹıƆ poo⅁ Ɐㄥ§", - "item.gtceu.plate_casting_mold": ")ǝʇɐןԀ( pןoW buıʇsɐƆ", - "item.gtceu.plate_casting_mold.tooltip": "sǝʇɐןԀ buıʞɐɯ ɹoɟ pןoWㄥ§", - "item.gtceu.plate_extruder_mold": ")ǝʇɐןԀ( pןoW ɹǝpnɹʇxƎ", - "item.gtceu.plate_extruder_mold.tooltip": "sǝʇɐןԀ buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.platinum_group_sludge_dust": "ǝbpnןS dnoɹ⅁ ɯnuıʇɐןԀ", - "item.gtceu.platinum_lighter": "ɹǝʇɥbıꞀ ɯnuıʇɐןԀ", - "item.gtceu.platinum_raw_dust": "ɹǝpʍoԀ ɯnuıʇɐןԀ ʍɐᴚ", - "item.gtceu.platinum_sludge_residue_dust": "ǝnpısǝᴚ ǝbpnןS ɯnuıʇɐןԀ", - "item.gtceu.portable_debug_scanner": "ɹǝuuɐɔS bnqǝᗡ ǝןqɐʇɹoԀ", - "item.gtceu.portable_scanner": "ɹǝuuɐɔS ǝןqɐʇɹoԀ", - "item.gtceu.power_thruster": "ɹǝʇsnɹɥ⟘ ɹǝʍoԀ", - "item.gtceu.programmed_circuit": "ʇınɔɹıƆ pǝɯɯɐɹboɹԀ", - "item.gtceu.programmed_circuit.tooltip.0": "I∩⅁ uoıʇɐɹnbıɟuoɔ uǝdo oʇ ǝs∩", - "item.gtceu.programmed_circuit.tooltip.1": "ǝuıɥɔɐɯ ɐ uo ʞɔıןƆ-ʇɥbıᴚ-ʇɟıɥS", - "item.gtceu.programmed_circuit.tooltip.2": "oʇ ʇı ʇǝs oʇ ʇoןs ʇınɔɹıɔ ɐ ɥʇıʍ", - "item.gtceu.programmed_circuit.tooltip.3": "˙ǝnןɐʌ s,ʇınɔɹıɔ sıɥʇ", - "item.gtceu.prospector.hv": ")ΛH( ɹoʇɔǝdsoɹԀ pǝɔuɐʌpⱯ", - "item.gtceu.prospector.luv": ")ΛnꞀ( ɹoʇɔǝdsoɹԀ ɹǝdnS", - "item.gtceu.prospector.lv": ")ΛꞀ( ɹoʇɔǝdsoɹԀ ǝɹO", - "item.gtceu.pure_bentonite_dust": "ǝʇıuoʇuǝᗺ ɟo ǝןıԀ pǝıɟıɹnԀ", - "item.gtceu.pure_cassiterite_sand_dust": "puɐS ǝʇıɹǝʇıssɐƆ ɟo ǝןıԀ pǝıɟıɹnԀ", - "item.gtceu.pure_pitchblende_dust": "ǝpuǝןqɥɔʇıԀ ɟo ǝןıԀ pǝıɟıɹnԀ", - "item.gtceu.pure_rock_salt_dust": "ʇןɐS ʞɔoᴚ ɟo ǝןıԀ pǝıɟıɹnԀ", - "item.gtceu.pure_salt_dust": "ʇןɐS ɟo ǝןıԀ pǝıɟıɹnԀ", - "item.gtceu.pure_talc_dust": "ɔןɐ⟘ ɟo ǝןıԀ pǝıɟıɹnԀ", - "item.gtceu.purified_bentonite_ore": "ǝʇıuoʇuǝᗺ pǝıɟıɹnԀ", - "item.gtceu.purified_cassiterite_sand_ore": "puɐS ǝʇıɹǝʇıssɐƆ pǝıɟıɹnԀ", - "item.gtceu.purified_pitchblende_ore": "ǝpuǝןqɥɔʇıԀ pǝıɟıɹnԀ", - "item.gtceu.purified_talc_ore": "ɔןɐ⟘ pǝıɟıɹnԀ", - "item.gtceu.purple_drink": "ʞuıɹᗡ ǝןdɹnԀ", - "item.gtceu.purple_dye_spray_can": ")ǝןdɹnԀ( uɐƆ ʎɐɹdS", - "item.gtceu.purple_glass_lens": ")ǝןdɹnԀ( suǝꞀ ssɐן⅁", - "item.gtceu.qbit_cpu_chip": "dıɥƆ ∩ԀƆ ʇıqnὉ", - "item.gtceu.qbit_cpu_chip.tooltip": "ʇıu∩ buıssǝɔoɹԀ ןɐɹʇuǝƆ ʇıqnὉㄥ§", - "item.gtceu.qbit_cpu_wafer": "ɹǝɟɐM ∩ԀƆ ʇıqnὉ", - "item.gtceu.qbit_cpu_wafer.tooltip": "ʇınɔɹıƆ ʇıqnὉ ʍɐᴚㄥ§", - "item.gtceu.quantum_eye": "ǝʎƎ ɯnʇuɐnὉ", - "item.gtceu.quantum_eye.tooltip": "ǝʎƎ ɹǝpuƎ pǝʌoɹdɯIㄥ§", - "item.gtceu.quantum_processor": "ɹossǝɔoɹԀ ɯnʇuɐnὉ", - "item.gtceu.quantum_processor.tooltip.0": "¡ǝɟıן oʇ sǝɯoɔ buıʇndɯoƆ ɯnʇuɐnὉㄥ§", - "item.gtceu.quantum_processor.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-ΛƎɐ§", - "item.gtceu.quantum_processor_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹԀ ɯnʇuɐnὉ", - "item.gtceu.quantum_processor_assembly.tooltip.0": "¡ǝɟıן oʇ sǝɯoɔ buıʇndɯoƆ ɯnʇuɐnὉㄥ§", - "item.gtceu.quantum_processor_assembly.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-ΛIɐ§", - "item.gtceu.quantum_processor_computer": "ɹǝʇndɯoɔɹǝdnS ɹossǝɔoɹԀ ɯnʇuɐnὉ", - "item.gtceu.quantum_processor_computer.tooltip.0": "¡ǝɟıן oʇ sǝɯoɔ buıʇndɯoƆ ɯnʇuɐnὉㄥ§", - "item.gtceu.quantum_processor_computer.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-ΛnꞀɐ§", - "item.gtceu.quantum_processor_mainframe": "ǝɯɐɹɟuıɐW ɹossǝɔoɹԀ ɯnʇuɐnὉ", - "item.gtceu.quantum_processor_mainframe.tooltip.0": "¡ǝɟıן oʇ sǝɯoɔ buıʇndɯoƆ ɯnʇuɐnὉㄥ§", - "item.gtceu.quantum_processor_mainframe.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-WԀZɐ§", - "item.gtceu.quantum_star": "ɹɐʇS ɯnʇuɐnὉ", - "item.gtceu.quantum_star.tooltip": "ɹɐʇS ɹǝɥʇǝN pǝʌoɹdɯIㄥ§", - "item.gtceu.quarktech_boots": "sʇooᗺ ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "item.gtceu.quarktech_chestplate": "ǝʇɐןdʇsǝɥƆ ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "item.gtceu.quarktech_helmet": "ʇǝɯןǝH ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "item.gtceu.quarktech_leggings": "sbuıbbǝꞀ ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "item.gtceu.quartz_sand_dust": "puɐS zʇɹɐnὉ", - "item.gtceu.rad_away_pill": "ןןıԀ ™ʎɐʍⱯpɐᴚ", - "item.gtceu.ram_chip": "dıɥƆ WⱯᴚ", - "item.gtceu.ram_chip.tooltip": "ʎɹoɯǝW ssǝɔɔⱯ ɯopuɐᴚㄥ§", - "item.gtceu.ram_wafer": "ɹǝɟɐM WⱯᴚ", - "item.gtceu.ram_wafer.tooltip": "ʎɹoɯǝW ʍɐᴚㄥ§", - "item.gtceu.rare_earth_dust": "ɥʇɹɐƎ ǝɹɐᴚ", - "item.gtceu.rarest_metal_mixture_dust": "ǝɹnʇxıW ןɐʇǝW ʇsǝɹɐᴚ", - "item.gtceu.raw_crystal_chip": "dıɥƆ ןɐʇsʎɹƆ ʍɐᴚ", - "item.gtceu.raw_crystal_chip.tooltip": "ɹossǝɔoɹԀ ןɐʇsʎɹƆ ʍɐᴚㄥ§", - "item.gtceu.raw_crystal_chip_parts": "sʇɹɐԀ dıɥƆ ןɐʇsʎɹƆ ʍɐᴚ", - "item.gtceu.raw_crystal_chip_parts.tooltip": "sʇɹɐԀ ɹossǝɔoɹԀ ןɐʇsʎɹƆ ʍɐᴚㄥ§", - "item.gtceu.red_dye_spray_can": ")pǝᴚ( uɐƆ ʎɐɹdS", - "item.gtceu.red_glass_lens": ")pǝᴚ( suǝꞀ ssɐן⅁", - "item.gtceu.refined_bentonite_ore": "ǝʇıuoʇuǝᗺ pǝuıɟǝᴚ", - "item.gtceu.refined_cassiterite_sand_ore": "puɐS ǝʇıɹǝʇıssɐƆ pǝuıɟǝᴚ", - "item.gtceu.refined_pitchblende_ore": "ǝpuǝןqɥɔʇıԀ pǝuıɟǝᴚ", - "item.gtceu.refined_talc_ore": "ɔןɐ⟘ pǝuıɟǝᴚ", - "item.gtceu.resin_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ uısǝᴚ", - "item.gtceu.resin_circuit_board.tooltip": "pɹɐoᗺ pǝʇɐoƆ Ɐㄥ§", - "item.gtceu.resin_printed_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ pǝʇuıɹԀ uısǝᴚ", - "item.gtceu.resin_printed_circuit_board.tooltip": "pɹɐoᗺ ʇınɔɹıƆ ɔısɐᗺ Ɐㄥ§", - "item.gtceu.resistor": "ɹoʇsısǝᴚ", - "item.gtceu.resistor.tooltip": "ʇuǝuodɯoƆ ɔıuoɹʇɔǝןƎ ɔısɐᗺㄥ§", - "item.gtceu.ring_extruder_mold": ")buıᴚ( pןoW ɹǝpnɹʇxƎ", - "item.gtceu.ring_extruder_mold.tooltip": "sbuıᴚ buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.robot.arm.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ sǝıʇıʇuɐnb ɔıɟıɔǝds oʇ ㄥ§sɯǝʇIɟ§ sʇıɯıꞀㄥ§", - "item.gtceu.rock_salt_dust": "ʇןɐS ʞɔoᴚ", - "item.gtceu.rod_extruder_mold": ")poᴚ( pןoW ɹǝpnɹʇxƎ", - "item.gtceu.rod_extruder_mold.tooltip": "spoᴚ buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.rod_long_extruder_mold.tooltip": "spoᴚ buoꞀ buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.rotor_casting_mold": ")ɹoʇoᴚ( pןoW buıʇsɐƆ", - "item.gtceu.rotor_casting_mold.tooltip": "sɹoʇoᴚ buıʞɐɯ ɹoɟ pןoWㄥ§", - "item.gtceu.rotor_extruder_mold": ")ɹoʇoᴚ( pןoW ɹǝpnɹʇxƎ", - "item.gtceu.rotor_extruder_mold.tooltip": "sɹoʇoᴚ buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.rubber_boat": "ʇɐoᗺ ɹǝqqnᴚ", - "item.gtceu.rubber_chest_boat": "ʇsǝɥƆ ɥʇıʍ ʇɐoᗺ ɹǝqqnᴚ", - "item.gtceu.rubber_gloves": "sǝʌoן⅁ ɹǝqqnᴚ", - "item.gtceu.salt_dust": "ʇןɐS", - "item.gtceu.saw_extruder_mold.tooltip": "sʍɐS buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.shovel_extruder_mold.tooltip": "sןǝʌoɥS buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.shutter_module_cover": "ǝןnpoW ɹǝʇʇnɥS", - "item.gtceu.shutter_module_cover.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ǝpıS pǝɥɔɐʇʇɐ ɥbnoɹɥʇ ㄥ§ɹǝɟsuɐɹ⟘ sʞɔoןᗺɟ§", - "item.gtceu.silicon_boule": "ǝןnoᗺ uoɔıןıS ǝuıןןɐʇsʎɹɔouoW", - "item.gtceu.silicon_boule.tooltip": "ʇınɔɹıƆ ʍɐᴚㄥ§", - "item.gtceu.silicon_wafer": "ɹǝɟɐM uoɔıןıS", - "item.gtceu.silicon_wafer.tooltip": "ʇınɔɹıƆ ʍɐᴚㄥ§", - "item.gtceu.simple_soc": "ƆoS ǝןdɯıS", - "item.gtceu.simple_soc.tooltip": "dıɥƆ uo ɯǝʇsʎS ǝןdɯıSㄥ§", - "item.gtceu.simple_soc_wafer": "ɹǝɟɐM ƆoS ǝןdɯıS", - "item.gtceu.simple_soc_wafer.tooltip": "ʇınɔɹıƆ ǝןdɯıS ʍɐᴚㄥ§", - "item.gtceu.small_ash_dust": "sǝɥsⱯ ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_basaltic_mineral_sand_dust": "puɐS ןɐɹǝuıW ɔıʇןɐsɐᗺ ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_bentonite_dust": "ǝʇıuoʇuǝᗺ ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_blaze_dust": "ɹǝpʍoԀ ǝzɐןᗺ ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_bone_dust": "ןɐǝW ǝuoᗺ ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_cassiterite_sand_dust": "puɐS ǝʇıɹǝʇıssɐƆ ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_dark_ash_dust": "sǝɥsⱯ ʞɹɐᗡ ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_fullers_earth_dust": "ɥʇɹɐƎ sɹǝןןnℲ ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_garnet_sand_dust": "puɐS ʇǝuɹɐ⅁ ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_gear_casting_mold": ")ɹɐǝ⅁ ןןɐɯS( pןoW buıʇsɐƆ", - "item.gtceu.small_gear_extruder_mold": ")ɹɐǝ⅁ ןןɐɯS( pןoW ɹǝpnɹʇxƎ", - "item.gtceu.small_glauconite_sand_dust": "puɐS ǝʇıuoɔnɐן⅁ ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_granitic_mineral_sand_dust": "puɐS ןɐɹǝuıW ɔıʇıuɐɹ⅁ ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_gunpowder_dust": "ɹǝpʍodun⅁ ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_ice_dust": "ǝɔI pǝɥsnɹƆ ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_inert_metal_mixture_dust": "ǝɹnʇxıW ןɐʇǝW ʇɹǝuI ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_iridium_metal_residue_dust": "ǝnpısǝᴚ ןɐʇǝW ɯnıpıɹI ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_meat_dust": "ʇɐǝW ǝɔuıW ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_palladium_raw_dust": "ɹǝpʍoԀ ɯnıpɐןןɐԀ ʍɐᴚ ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_paper_dust": "pɐɥƆ ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_pipe_casting_mold": ")ǝdıԀ ןןɐɯS( pןoW buıʇsɐƆ", - "item.gtceu.small_pipe_extruder_mold": ")ǝdıԀ ןןɐɯS( pןoW ɹǝpnɹʇxƎ", - "item.gtceu.small_pitchblende_dust": "ǝpuǝןqɥɔʇıԀ ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_platinum_group_sludge_dust": "ǝbpnןS dnoɹ⅁ ɯnuıʇɐןԀ ɟo dɯnןƆ ןןɐɯS", - "item.gtceu.small_platinum_raw_dust": "ɹǝpʍoԀ ɯnuıʇɐןԀ ʍɐᴚ ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_platinum_sludge_residue_dust": "ǝnpısǝᴚ ǝbpnןS ɯnuıʇɐןԀ ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_quartz_sand_dust": "puɐS zʇɹɐnὉ ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_rare_earth_dust": "ɥʇɹɐƎ ǝɹɐᴚ ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_rarest_metal_mixture_dust": "ǝɹnʇxıW ןɐʇǝW ʇsǝɹɐᴚ ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_rock_salt_dust": "ʇןɐS ʞɔoᴚ ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_salt_dust": "ʇןɐS ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_sugar_dust": "ɹɐbnS ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_talc_dust": "ɔןɐ⟘ ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_treated_wood_dust": "dןnԀ pooM pǝʇɐǝɹ⟘ ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_wheat_dust": "ɹnoןℲ ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.small_wood_dust": "dןnԀ pooM ɟo ǝןıԀ ןןɐɯS", - "item.gtceu.smd_capacitor": "ɹoʇıɔɐdɐƆ ᗡWS", - "item.gtceu.smd_capacitor.tooltip": "ʇuǝuodɯoƆ ɔıuoɹʇɔǝןƎㄥ§", - "item.gtceu.smd_diode": "ǝpoıᗡ ᗡWS", - "item.gtceu.smd_diode.tooltip": "ʇuǝuodɯoƆ ɔıuoɹʇɔǝןƎㄥ§", - "item.gtceu.smd_inductor": "ɹoʇɔnpuI ᗡWS", - "item.gtceu.smd_inductor.tooltip": "ʇuǝuodɯoƆ ɔıuoɹʇɔǝןƎㄥ§", - "item.gtceu.smd_resistor": "ɹoʇsısǝᴚ ᗡWS", - "item.gtceu.smd_resistor.tooltip": "ʇuǝuodɯoƆ ɔıuoɹʇɔǝןƎㄥ§", - "item.gtceu.smd_transistor": "ɹoʇsısuɐɹ⟘ ᗡWS", - "item.gtceu.smd_transistor.tooltip": "ʇuǝuodɯoƆ ɔıuoɹʇɔǝןƎㄥ§", - "item.gtceu.soc": "ƆoS", - "item.gtceu.soc.tooltip": "dıɥƆ uo ɯǝʇsʎSㄥ§", - "item.gtceu.soc_wafer": "ɹǝɟɐM ƆoS", - "item.gtceu.soc_wafer.tooltip": "ʇınɔɹıƆ ɔısɐᗺ ʍɐᴚㄥ§", - "item.gtceu.solar_panel": "ןǝuɐԀ ɹɐןoS", - "item.gtceu.solar_panel.tooltip.0": "˙noʎ ɥʇıʍ ǝq unS ǝɥʇ ʎɐWㄥ§", - "item.gtceu.solar_panel.tooltip.1": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ㄥ§unSǝ§ ǝɥʇ ɯoɹɟ ㄥ§ʎbɹǝuƎɟ§ sǝɔnpoɹԀ", - "item.gtceu.solvent_spray_can": ")ʇuǝʌןoS( uɐƆ ʎɐɹdS", - "item.gtceu.stainless_steel_fluid_cell": "ןןǝƆ ןǝǝʇS ssǝןuıɐʇS %s", - "item.gtceu.steel_fluid_cell": "ןןǝƆ ןǝǝʇS %s", - "item.gtceu.steel_minecart_wheels": "sןǝǝɥM ʇɹɐɔǝuıW ןǝǝʇS", - "item.gtceu.stem_cells": "sןןǝƆ ɯǝʇS", - "item.gtceu.stem_cells.tooltip": "ǝɔuǝbıןןǝʇuI ʍɐᴚㄥ§", - "item.gtceu.sticky_resin": "uısǝᴚ ʎʞɔıʇS", - "item.gtceu.storage_cover": "ɹǝʌoƆ ǝbɐɹoʇS", - "item.gtceu.sugar_gem": "ǝqnƆ ɹɐbnS", - "item.gtceu.sus_record": "ɔsıᗡ ɔısnW", - "item.gtceu.sus_record.desc": "¡ʎssnsㄥ§", - "item.gtceu.sword_extruder_mold.tooltip": "spɹoʍS buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.tag_filter.tooltip.0": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ㄥ§bɐ⟘ɟ§ ɥʇıʍ O/I ㄥ§ɯǝʇIɟ§ sɹǝʇןıℲㄥ§", - "item.gtceu.tag_filter.tooltip.1": "˙ǝpɐɹbdn ㄥ§ɯɹⱯ ɔıʇoqoᴚɟ§ puɐ ㄥ§ǝןnpoW ɹoʎǝʌuoƆɟ§ ɐ sɐ pǝsn ǝq uɐƆ", - "item.gtceu.talc_dust": "ɔןɐ⟘", - "item.gtceu.tantalum_capacitor": "ɹoʇıɔɐdɐƆ ɯnןɐʇuɐ⟘", - "item.gtceu.terminal": "ןɐuıɯɹǝ⟘", - "item.gtceu.terminal.tooltip": "ʎɹoʇuǝʌuı ɹnoʎ ɯoɹɟ sɯǝʇı ɥʇıʍ ʞɔoןqıʇןnɯ ɐ pןınq ʎןןɐɔıʇɐɯoʇnɐ oʇ ɹǝןןoɹʇuoɔ ɐ uo ʞɔıןƆ-ᴚ + ʇɟıɥS", - "item.gtceu.text_module": "ǝןnpoW ʇxǝ⟘", - "item.gtceu.tiny_ash_dust": "sǝɥsⱯ ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_basaltic_mineral_sand_dust": "puɐS ןɐɹǝuıW ɔıʇןɐsɐᗺ ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_bentonite_dust": "ǝʇıuoʇuǝᗺ ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_blaze_dust": "ɹǝpʍoԀ ǝzɐןᗺ ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_bone_dust": "ןɐǝW ǝuoᗺ ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_cassiterite_sand_dust": "puɐS ǝʇıɹǝʇıssɐƆ ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_dark_ash_dust": "sǝɥsⱯ ʞɹɐᗡ ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_fullers_earth_dust": "ɥʇɹɐƎ sɹǝןןnℲ ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_garnet_sand_dust": "puɐS ʇǝuɹɐ⅁ ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_glauconite_sand_dust": "puɐS ǝʇıuoɔnɐן⅁ ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_granitic_mineral_sand_dust": "puɐS ןɐɹǝuıW ɔıʇıuɐɹ⅁ ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_gunpowder_dust": "ɹǝpʍodun⅁ ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_ice_dust": "ǝɔI pǝɥsnɹƆ ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_inert_metal_mixture_dust": "ǝɹnʇxıW ןɐʇǝW ʇɹǝuI ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_iridium_metal_residue_dust": "ǝnpısǝᴚ ןɐʇǝW ɯnıpıɹI ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_meat_dust": "ʇɐǝW ǝɔuıW ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_palladium_raw_dust": "ɹǝpʍoԀ ɯnıpɐןןɐԀ ʍɐᴚ ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_paper_dust": "pɐɥƆ ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_pipe_casting_mold": ")ǝdıԀ ʎuı⟘( pןoW buıʇsɐƆ", - "item.gtceu.tiny_pipe_extruder_mold": ")ǝdıԀ ʎuı⟘( pןoW ɹǝpnɹʇxƎ", - "item.gtceu.tiny_pitchblende_dust": "ǝpuǝןqɥɔʇıԀ ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_platinum_group_sludge_dust": "ǝbpnןS dnoɹ⅁ ɯnuıʇɐןԀ ɟo dɯnןƆ ʎuı⟘", - "item.gtceu.tiny_platinum_raw_dust": "ɹǝpʍoԀ ɯnuıʇɐןԀ ʍɐᴚ ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_platinum_sludge_residue_dust": "ǝnpısǝᴚ ǝbpnןS ɯnuıʇɐןԀ ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_quartz_sand_dust": "puɐS zʇɹɐnὉ ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_rare_earth_dust": "ɥʇɹɐƎ ǝɹɐᴚ ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_rarest_metal_mixture_dust": "ǝɹnʇxıW ןɐʇǝW ʇsǝɹɐᴚ ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_rock_salt_dust": "ʇןɐS ʞɔoᴚ ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_salt_dust": "ʇןɐS ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_sugar_dust": "ɹɐbnS ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_talc_dust": "ɔןɐ⟘ ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_treated_wood_dust": "dןnԀ pooM pǝʇɐǝɹ⟘ ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_wheat_dust": "ɹnoןℲ ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.tiny_wood_dust": "dןnԀ pooM ɟo ǝןıԀ ʎuı⟘", - "item.gtceu.titanium_fluid_cell": "ןןǝƆ ɯnıuɐʇı⟘ %s", - "item.gtceu.tool.aoe.columns": "suɯnןoƆ", - "item.gtceu.tool.aoe.layers": "sɹǝʎɐꞀ", - "item.gtceu.tool.aoe.rows": "sʍoᴚ", - "item.gtceu.tool.axe": "ǝxⱯ %s", - "item.gtceu.tool.behavior.aoe_mining": "%sx%sx%sɟ§ :ʇɔǝɟɟƎ-ɟo-ɐǝɹⱯϛ§", - "item.gtceu.tool.behavior.block_rotation": "sʞɔoןᗺ sǝʇɐʇoᴚɟ§ :ɔıuɐɥɔǝWᄅ§", - "item.gtceu.tool.behavior.crop_harvesting": "sdoɹƆ sʇsǝʌɹɐHɟ§ :ɹǝʇsǝʌɹɐHɐ§", - "item.gtceu.tool.behavior.damage_boost": "%s ʇsuıɐbɐ ǝbɐɯɐp ɐɹʇxƎɟ§ :ʇsooᗺ ǝbɐɯɐᗡㄣ§", - "item.gtceu.tool.behavior.dowse_campfire": "sǝɹıɟdɯɐƆ sǝsʍoᗡɟ§ :ɹǝʇɥbıɟǝɹıℲ9§", - "item.gtceu.tool.behavior.grass_path": "sɥʇɐԀ ssɐɹ⅁ sǝʇɐǝɹƆɟ§ :ɹǝdɐɔspuɐꞀǝ§", - "item.gtceu.tool.behavior.ground_tilling": "punoɹ⅁ sןןı⟘ɟ§ :ɹǝɯɹɐℲǝ§", - "item.gtceu.tool.behavior.plunger": "spınןℲ suıɐɹᗡɟ§ :ɹǝqɯnןԀ6§", - "item.gtceu.tool.behavior.prospecting.air": "ʇǝʞɔod ɹıɐ uɐ punoℲ", - "item.gtceu.tool.behavior.prospecting.changing": "ǝbuɐɥɔ ןɐıɹǝʇɐɯ pǝʇɔǝʇǝᗡ", - "item.gtceu.tool.behavior.prospecting.lava": "ɐʌɐן punoℲ", - "item.gtceu.tool.behavior.prospecting.ore": "%s :ǝɹo punoℲ", - "item.gtceu.tool.behavior.prospecting.water": "ɹǝʇɐʍ punoℲ", - "item.gtceu.tool.behavior.rail_rotation": "sןıɐᴚ sǝʇɐʇoᴚɟ§ :ɹǝǝuıbuƎ pɐoɹןıɐᴚǝ§", - "item.gtceu.tool.behavior.relocate_mining": "sdoɹᗡ qoW puɐ sʞɔoןᗺ pǝuıW sǝʇɐɔoןǝᴚɟ§ :ɔıʇǝubɐWᄅ§", - "item.gtceu.tool.behavior.remove_wax": "xɐM sǝʌoɯǝᴚɟ§ :ɹǝuɐǝןƆ9§", - "item.gtceu.tool.behavior.scrape": "uoıʇɐpıxO sǝʌoɯǝᴚɟ§ :ɹǝɥsıןoԀq§", - "item.gtceu.tool.behavior.shield_disable": "spןǝıɥS sǝןqɐsıᗡɟ§ :ǝʇnɹᗺɔ§", - "item.gtceu.tool.behavior.silk_ice": "ǝɔI sʇsǝʌɹɐH ʞןıSɟ§ :ɹǝʇʇnƆ ǝɔIq§", - "item.gtceu.tool.behavior.strip_log": "sboꞀ sdıɹʇSɟ§ :uɐsıʇɹⱯϛ§", - "item.gtceu.tool.behavior.torch_place": "ʞɔıןƆ-ʇɥbıᴚ uo sǝɥɔɹo⟘ sǝɔɐןԀɟ§ :ɹǝʞunןǝdSǝ§", - "item.gtceu.tool.behavior.tree_felling": "buıןןǝℲ ǝǝɹ⟘ɟ§ :ʞɔɐظɹǝqɯnꞀㄣ§", - "item.gtceu.tool.butchery_knife": "ǝɟıuʞ ʎɹǝɥɔʇnᗺ %s", - "item.gtceu.tool.butchery_knife.tooltip": "ǝʇɐᴚ ʞɔɐʇʇⱯ ʍoןs ɐ sɐH8§", - "item.gtceu.tool.buzzsaw": ")ΛꞀ( ʍɐszznᗺ %s", - "item.gtceu.tool.buzzsaw.tooltip": "sʞɔoןᗺ buıʇsǝʌɹɐɥ ɹoɟ ǝןqɐʇıns ʇoN8§", - "item.gtceu.tool.crowbar": "ɹɐqʍoɹƆ %s", - "item.gtceu.tool.crowbar.tooltip": "sɹǝʌoƆ sʇunoɯsıᗡ8§", - "item.gtceu.tool.ev_drill": ")ΛƎ( ןןıɹᗡ %s", - "item.gtceu.tool.file": "ǝןıℲ %s", - "item.gtceu.tool.hammer": "ɹǝɯɯɐH %s", - "item.gtceu.tool.hammer.tooltip": "ɯǝɥʇ buıʇsǝʌɹɐɥ uǝɥʍ sʞɔoןᗺ sǝɥsnɹƆ8§", - "item.gtceu.tool.harvest_level.0": "pooM8§", - "item.gtceu.tool.harvest_level.1": "ǝuoʇSㄥ§", - "item.gtceu.tool.harvest_level.2": "uoɹIɐ§", - "item.gtceu.tool.harvest_level.3": "puoɯɐıᗡq§", - "item.gtceu.tool.harvest_level.4": "ǝʇıɹǝɥʇǝNp§", - "item.gtceu.tool.harvest_level.5": "ɯnıuɐɹnᗡ6§", - "item.gtceu.tool.harvest_level.6": "ɯnıuoɹʇnǝNɔ§", - "item.gtceu.tool.hoe": "ǝoH %s", - "item.gtceu.tool.hv_chainsaw": ")ΛH( ʍɐsuıɐɥƆ %s", - "item.gtceu.tool.hv_drill": ")ΛH( ןןıɹᗡ %s", - "item.gtceu.tool.hv_screwdriver": ")ΛH( ɹǝʌıɹpʍǝɹɔS %s", - "item.gtceu.tool.hv_screwdriver.tooltip": "sǝuıɥɔɐW puɐ sɹǝʌoƆ sʇsnظpⱯ8§", - "item.gtceu.tool.hv_wirecutter": ")ΛH( ɹǝʇʇnƆ ǝɹıM %s", - "item.gtceu.tool.hv_wrench": ")ΛH( ɥɔuǝɹM %s", - "item.gtceu.tool.hv_wrench.tooltip": "sǝuıɥɔɐW ǝןʇuɐɯsıp oʇ ʞɔıןɔ ʇɟǝן pןoH8§", - "item.gtceu.tool.iv_chainsaw": ")ΛI( ʍɐsuıɐɥƆ %s", - "item.gtceu.tool.iv_drill": ")ΛI( ןןıɹᗡ %s", - "item.gtceu.tool.iv_screwdriver": ")ΛI( ɹǝʌıɹpʍǝɹɔS %s", - "item.gtceu.tool.iv_screwdriver.tooltip": "sǝuıɥɔɐW puɐ sɹǝʌoƆ sʇsnظpⱯ8§", - "item.gtceu.tool.iv_wirecutter": ")ΛI( ɹǝʇʇnƆ ǝɹıM %s", - "item.gtceu.tool.iv_wrench": ")ΛI( ɥɔuǝɹM %s", - "item.gtceu.tool.iv_wrench.tooltip": "sǝuıɥɔɐW ǝןʇuɐɯsıp oʇ ʞɔıןɔ ʇɟǝן pןoH8§", - "item.gtceu.tool.knife": "ǝɟıuʞ %s", - "item.gtceu.tool.lighter.platinum.tooltip": "ʇı uo pǝʌɐɹbuǝ sı ɹǝʇsɐW ʞuɐɹԀ uʍouʞ Ɐㄥ§", - "item.gtceu.tool.lv_chainsaw": ")ΛꞀ( ʍɐsuıɐɥƆ %s", - "item.gtceu.tool.lv_drill": ")ΛꞀ( ןןıɹᗡ %s", - "item.gtceu.tool.lv_screwdriver": ")ΛꞀ( ɹǝʌıɹpʍǝɹɔS %s", - "item.gtceu.tool.lv_screwdriver.tooltip": "sǝuıɥɔɐW puɐ sɹǝʌoƆ sʇsnظpⱯ8§", - "item.gtceu.tool.lv_wirecutter": ")ΛꞀ( ɹǝʇʇnƆ ǝɹıM %s", - "item.gtceu.tool.lv_wrench": ")ΛꞀ( ɥɔuǝɹM %s", - "item.gtceu.tool.lv_wrench.tooltip": "sǝuıɥɔɐW ǝןʇuɐɯsıp oʇ ʞɔıןɔ ʇɟǝן pןoH8§", - "item.gtceu.tool.mallet": "ʇǝןןɐW ʇɟoS %s", - "item.gtceu.tool.mallet.tooltip.0": "˙ǝdıɔǝᴚ ʇuǝɹɹnƆ ɹǝʇɟⱯ ǝuıɥɔɐW ǝsnɐԀ oʇ ʞɐǝuS8§", - "item.gtceu.tool.mallet.tooltip.1": "sǝuıɥɔɐW sʇɹɐʇS/sdoʇS8§", - "item.gtceu.tool.matchbox.tooltip": "ɹɐƆ ɐ ʇou sı sıɥ⟘ㄥ§", - "item.gtceu.tool.mining_hammer": "ɹǝɯɯɐH buıuıW %s", - "item.gtceu.tool.mining_hammer.tooltip": ")buıɥɔnoɹɔ ǝɹ,noʎ ssǝןun( ǝɔuo ʇɐ ɐǝɹɐ ǝbɹɐן ɐ sǝuıW8§", - "item.gtceu.tool.mortar": "ɹɐʇɹoW %s", - "item.gtceu.tool.mv_chainsaw": ")ΛW( ʍɐsuıɐɥƆ %s", - "item.gtceu.tool.mv_drill": ")ΛW( ןןıɹᗡ %s", - "item.gtceu.tool.pickaxe": "ǝxɐʞɔıԀ %s", - "item.gtceu.tool.plunger": "ɹǝbunןԀ %s", - "item.gtceu.tool.plunger.tooltip": "sǝuıɥɔɐW ɯoɹɟ spınןℲ sǝʌoɯǝᴚ8§", - "item.gtceu.tool.replace_tool_head": "ʇı ǝɔɐןdǝɹ oʇ pɐǝH ןoo⟘ ʍǝu ɐ ɥʇıʍ ʇɟɐɹƆ", - "item.gtceu.tool.rolling_pin": "uıԀ buıןןoᴚ %s", - "item.gtceu.tool.saw": "ʍɐS %s", - "item.gtceu.tool.screwdriver": "ɹǝʌıɹpʍǝɹɔS %s", - "item.gtceu.tool.screwdriver.tooltip": "sǝuıɥɔɐW puɐ sɹǝʌoƆ sʇsnظpⱯ8§", - "item.gtceu.tool.scythe": "ǝɥʇʎɔS %s", - "item.gtceu.tool.scythe.tooltip": "ǝsuǝS ǝʞɐɯ ʇ,usǝop ǝɥʇʎɔS ɐ ǝsnɐɔǝᗺ8§", - "item.gtceu.tool.shears": "sɹɐǝɥS %s", - "item.gtceu.tool.shovel": "ןǝʌoɥS %s", - "item.gtceu.tool.spade": "ǝpɐdS %s", - "item.gtceu.tool.spade.tooltip": ")buıɥɔnoɹɔ ǝɹ,noʎ ssǝןun( ǝɔuo ʇɐ ɐǝɹɐ ǝbɹɐן ɐ sǝuıW8§", - "item.gtceu.tool.sword": "pɹoʍS %s", - "item.gtceu.tool.tooltip.attack_damage": "ǝbɐɯɐᗡ ʞɔɐʇʇⱯɔ§ %s", - "item.gtceu.tool.tooltip.attack_speed": "pǝǝdS ʞɔɐʇʇⱯ6§ %s", - "item.gtceu.tool.tooltip.crafting_uses": "sǝs∩ buıʇɟɐɹƆɐ§ %s", - "item.gtceu.tool.tooltip.default_enchantments": ":sʇuǝɯʇuɐɥɔuƎ ʇןnɐɟǝᗡϛ§", - "item.gtceu.tool.tooltip.general_uses": "ʎʇıןıqɐɹnᗡq§ %s", - "item.gtceu.tool.tooltip.harvest_level": "%s ןǝʌǝꞀ ʇsǝʌɹɐHǝ§", - "item.gtceu.tool.tooltip.harvest_level_extra": ")ɟ§%s(ɟ§ %s ןǝʌǝꞀ ʇsǝʌɹɐHǝ§", - "item.gtceu.tool.tooltip.max_uses": "ʎʇıןıqɐɹnᗡ ןɐʇo⟘ǝ§ %s", - "item.gtceu.tool.tooltip.mining_speed": "pǝǝdS buıuıWp§ %s", - "item.gtceu.tool.tooltip.repair_info": "oɟuI ɹıɐdǝᴚ ʍoɥs oʇ ⟘ℲIHS pןoH8§", - "item.gtceu.tool.tooltip.repair_material": "%sɐ§ɟ§ :ɥʇıʍ ɹıɐdǝᴚ8§", - "item.gtceu.tool.usable_as": "%sɟ§ :sɐ ǝןqɐs∩8§", - "item.gtceu.tool.wire_cutter": "ɹǝʇʇnƆ ǝɹıM %s", - "item.gtceu.tool.wrench": "ɥɔuǝɹM %s", - "item.gtceu.tool.wrench.tooltip": "sǝuıɥɔɐW ǝןʇuɐɯsıp oʇ ʞɔıןɔ ʇɟǝן pןoH8§", - "item.gtceu.transistor": "ɹoʇsısuɐɹ⟘", - "item.gtceu.transistor.tooltip": "ʇuǝuodɯoƆ ɔıuoɹʇɔǝןƎ ɔısɐᗺㄥ§", - "item.gtceu.treated_wood_boat": "ʇɐoᗺ pooM pǝʇɐǝɹ⟘", - "item.gtceu.treated_wood_bolt": "ʞɔıʇS pooM pǝʇɐǝɹ⟘ ʇɹoɥS", - "item.gtceu.treated_wood_chest_boat": "ʇsǝɥƆ ɥʇıʍ ʇɐoᗺ pooM pǝʇɐǝɹ⟘", - "item.gtceu.treated_wood_dust": "dןnԀ pooM pǝʇɐǝɹ⟘", - "item.gtceu.treated_wood_plate": "ʞuɐןԀ pooM pǝʇɐǝɹ⟘", - "item.gtceu.treated_wood_rod": "ʞɔıʇS pooM pǝʇɐǝɹ⟘", - "item.gtceu.tungsten_grinding_head": "pɐǝH buıpuıɹ⅁ uǝʇsbun⟘", - "item.gtceu.tungsten_steel_fluid_cell": "ןןǝƆ ןǝǝʇsuǝʇsbun⟘ %s", - "item.gtceu.turbine_rotor": "ɹoʇoᴚ ǝuıqɹn⟘ %s", - "item.gtceu.turbine_rotor.tooltip": "uoıʇɐʇs ɹǝʍod ɹnoʎ ɹoɟ sɹoʇoᴚ ǝuıqɹn⟘", - "item.gtceu.uev_conveyor_module": "ǝןnpoW ɹoʎǝʌuoƆ ΛƎ∩", - "item.gtceu.uev_electric_motor": "ɹoʇoW ɔıɹʇɔǝןƎ ΛƎ∩", - "item.gtceu.uev_electric_piston": "uoʇsıԀ ɔıɹʇɔǝןƎ ΛƎ∩", - "item.gtceu.uev_electric_pump": "dɯnԀ ɔıɹʇɔǝןƎ ΛƎ∩", - "item.gtceu.uev_emitter": "ɹǝʇʇıɯƎ ΛƎ∩", - "item.gtceu.uev_field_generator": "ɹoʇɐɹǝuǝ⅁ pןǝıℲ ΛƎ∩", - "item.gtceu.uev_fluid_regulator": "ɹoʇɐןnbǝᴚ pınןℲ ΛƎ∩", - "item.gtceu.uev_robot_arm": "ɯɹⱯ ʇoqoᴚ ΛƎ∩", - "item.gtceu.uev_sensor": "ɹosuǝS ΛƎ∩", - "item.gtceu.uev_voltage_coil.tooltip": "ןıoƆ ןɐǝɹu∩", - "item.gtceu.uhpic_chip": "dıɥƆ ƆIԀH∩", - "item.gtceu.uhpic_chip.tooltip": "ƆI ɹǝʍoԀ ɥbıH ɐɹʇן∩ㄥ§", - "item.gtceu.uhpic_wafer": "ɹǝɟɐM ƆIԀH∩", - "item.gtceu.uhpic_wafer.tooltip": "ʇınɔɹıƆ ɹǝʍoԀ ɥbıH ɐɹʇן∩ ʍɐᴚㄥ§", - "item.gtceu.uhv_conveyor_module": "ǝןnpoW ɹoʎǝʌuoƆ ΛH∩", - "item.gtceu.uhv_electric_motor": "ɹoʇoW ɔıɹʇɔǝןƎ ΛH∩", - "item.gtceu.uhv_electric_piston": "uoʇsıԀ ɔıɹʇɔǝןƎ ΛH∩", - "item.gtceu.uhv_electric_pump": "dɯnԀ ɔıɹʇɔǝןƎ ΛH∩", - "item.gtceu.uhv_emitter": "ɹǝʇʇıɯƎ ΛH∩", - "item.gtceu.uhv_field_generator": "ɹoʇɐɹǝuǝ⅁ pןǝıℲ ΛH∩", - "item.gtceu.uhv_fluid_regulator": "ɹoʇɐןnbǝᴚ pınןℲ ΛH∩", - "item.gtceu.uhv_robot_arm": "ɯɹⱯ ʇoqoᴚ ΛH∩", - "item.gtceu.uhv_sensor": "ɹosuǝS ΛH∩", - "item.gtceu.uhv_voltage_coil.tooltip": "ןıoƆ ɐɹʇן∩", - "item.gtceu.uiv_conveyor_module": "ǝןnpoW ɹoʎǝʌuoƆ ΛI∩", - "item.gtceu.uiv_electric_motor": "ɹoʇoW ɔıɹʇɔǝןƎ ΛI∩", - "item.gtceu.uiv_electric_piston": "uoʇsıԀ ɔıɹʇɔǝןƎ ΛI∩", - "item.gtceu.uiv_electric_pump": "dɯnԀ ɔıɹʇɔǝןƎ ΛI∩", - "item.gtceu.uiv_emitter": "ɹǝʇʇıɯƎ ΛI∩", - "item.gtceu.uiv_field_generator": "ɹoʇɐɹǝuǝ⅁ pןǝıℲ ΛI∩", - "item.gtceu.uiv_fluid_regulator": "ɹoʇɐןnbǝᴚ pınןℲ ΛI∩", - "item.gtceu.uiv_robot_arm": "ɯɹⱯ ʇoqoᴚ ΛI∩", - "item.gtceu.uiv_sensor": "ɹosuǝS ΛI∩", - "item.gtceu.uiv_voltage_coil.tooltip": "ןıoƆ ǝuɐsuI", - "item.gtceu.ulpic_chip": "dıɥƆ ƆIԀꞀ∩", - "item.gtceu.ulpic_chip.tooltip": "ƆI ɹǝʍoԀ ʍoꞀ ɐɹʇן∩ㄥ§", - "item.gtceu.ulpic_wafer": "ɹǝɟɐM ƆIԀꞀ∩", - "item.gtceu.ulpic_wafer.tooltip": "ʇınɔɹıƆ ɹǝʍoԀ ʍoꞀ ɐɹʇן∩ ʍɐᴚㄥ§", - "item.gtceu.ulv_solar_panel": "ןǝuɐԀ ɹɐןoS ǝbɐʇןoΛ ʍoꞀ ɐɹʇן∩", - "item.gtceu.ulv_tantalum_battery.tooltip": "ʎɹǝʇʇɐᗺ ǝןqɐsnǝᴚㄥ§", - "item.gtceu.ulv_voltage_coil": "ןıoƆ ǝbɐʇןoΛ ʍoꞀ ɐɹʇן∩", - "item.gtceu.ulv_voltage_coil.tooltip": "ןıoƆ ǝʌıʇıɯıɹԀ", - "item.gtceu.universal_fluid_cell": "ןןǝƆ ןɐsɹǝʌıu∩ %s", - "item.gtceu.uv_battery_hull": "ןןnH ʎɹǝʇʇɐᗺ ɐıɹpɐnbɐN ǝbɹɐꞀ", - "item.gtceu.uv_battery_hull.tooltip": "ןןnH ʎɹǝʇʇɐᗺㄥ§ Λ∩Ɛ§ ʎʇdɯǝ uⱯㄥ§", - "item.gtceu.uv_conveyor_module": "ǝןnpoW ɹoʎǝʌuoƆ Λ∩", - "item.gtceu.uv_electric_motor": "ɹoʇoW ɔıɹʇɔǝןƎ Λ∩", - "item.gtceu.uv_electric_piston": "uoʇsıԀ ɔıɹʇɔǝןƎ Λ∩", - "item.gtceu.uv_electric_pump": "dɯnԀ ɔıɹʇɔǝןƎ Λ∩", - "item.gtceu.uv_emitter": "ɹǝʇʇıɯƎ Λ∩", - "item.gtceu.uv_field_generator": "ɹoʇɐɹǝuǝ⅁ pןǝıℲ Λ∩", - "item.gtceu.uv_fluid_regulator": "ɹoʇɐןnbǝᴚ pınןℲ Λ∩", - "item.gtceu.uv_naquadria_battery": "ʎɹǝʇʇɐᗺ ɐıɹpɐnbɐN ǝbɹɐꞀ", - "item.gtceu.uv_naquadria_battery.tooltip": "ʎɹǝʇʇɐᗺ ǝןqɐsnǝᴚㄥ§", - "item.gtceu.uv_robot_arm": "ɯɹⱯ ʇoqoᴚ Λ∩", - "item.gtceu.uv_sensor": "ɹosuǝS Λ∩", - "item.gtceu.uv_solar_panel": "ןǝuɐԀ ɹɐןoS ǝbɐʇןoΛ ǝʇɐɯıʇן∩", - "item.gtceu.uv_voltage_coil": "ןıoƆ ǝbɐʇןoΛ ǝʇɐɯıʇן∩", - "item.gtceu.uv_voltage_coil.tooltip": "ןıoƆ ǝʇɐɯıʇן∩", - "item.gtceu.uxv_conveyor_module": "ǝןnpoW ɹoʎǝʌuoƆ ΛX∩", - "item.gtceu.uxv_electric_motor": "ɹoʇoW ɔıɹʇɔǝןƎ ΛX∩", - "item.gtceu.uxv_electric_piston": "uoʇsıԀ ɔıɹʇɔǝןƎ ΛX∩", - "item.gtceu.uxv_electric_pump": "dɯnԀ ɔıɹʇɔǝןƎ ΛX∩", - "item.gtceu.uxv_emitter": "ɹǝʇʇıɯƎ ΛX∩", - "item.gtceu.uxv_field_generator": "ɹoʇɐɹǝuǝ⅁ pןǝıℲ ΛX∩", - "item.gtceu.uxv_fluid_regulator": "ɹoʇɐןnbǝᴚ pınןℲ ΛX∩", - "item.gtceu.uxv_robot_arm": "ɯɹⱯ ʇoqoᴚ ΛX∩", - "item.gtceu.uxv_sensor": "ɹosuǝS ΛX∩", - "item.gtceu.uxv_voltage_coil.tooltip": "ןıoƆ ɔıdƎ", - "item.gtceu.vacuum_tube": "ǝqn⟘ ɯnnɔɐΛ", - "item.gtceu.vacuum_tube.tooltip.0": "ǝpoıᗡ ɐ ʎןןɐɔıuɥɔǝ⟘ㄥ§", - "item.gtceu.vacuum_tube.tooltip.1": "ɹǝı⟘-ΛꞀ∩ɔ§", - "item.gtceu.wetware_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ ǝɹɐʍʇǝM", - "item.gtceu.wetware_circuit_board.tooltip": "ǝɟıן sdǝǝʞ ʇɐɥʇ pɹɐoᗺ ǝɥ⟘ㄥ§", - "item.gtceu.wetware_printed_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ pǝʇuıɹԀ ǝɹɐʍʇǝM", - "item.gtceu.wetware_printed_circuit_board.tooltip": "ǝɟıן sdǝǝʞ ʇɐɥʇ pɹɐoᗺ ǝɥ⟘ㄥ§", - "item.gtceu.wetware_processor": "ɹossǝɔoɹԀ ǝɹɐʍʇǝM", - "item.gtceu.wetware_processor.tooltip.0": "noʎ buıɥɔʇɐʍ s,ʇı ǝʞıן buıןǝǝɟ ɐ ǝʌɐɥ noʎㄥ§", - "item.gtceu.wetware_processor.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-ΛnꞀㄣ§", - "item.gtceu.wetware_processor_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹԀ ǝɹɐʍʇǝM", - "item.gtceu.wetware_processor_assembly.tooltip.0": "ʇɟɐɹɔǝuıW unɹ uɐƆㄥ§", - "item.gtceu.wetware_processor_assembly.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-WԀZㄣ§", - "item.gtceu.wetware_processor_computer": "ɹǝʇndɯoɔɹǝdnS ɹossǝɔoɹԀ ǝɹɐʍʇǝM", - "item.gtceu.wetware_processor_computer.tooltip.0": "ǝuıɥɔɐW puɐ ɥsǝןℲ ɟo uoısnɟ ǝʇɐɯıʇן∩ㄥ§", - "item.gtceu.wetware_processor_computer.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-Λ∩ㄣ§", - "item.gtceu.wetware_processor_mainframe": "ǝɯɐɹɟuıɐW ɹossǝɔoɹԀ ǝɹɐʍʇǝM", - "item.gtceu.wetware_processor_mainframe.tooltip.0": "uǝǝs ɹǝʌǝ sɐɥ uɐW ʇsǝq ǝɥ⟘ㄥ§", - "item.gtceu.wetware_processor_mainframe.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-ΛH∩ㄣ§", - "item.gtceu.wheat_dust": "ɹnoןℲ", - "item.gtceu.white_dye_spray_can": ")ǝʇıɥM( uɐƆ ʎɐɹdS", - "item.gtceu.wire_extruder_mold": ")ǝɹıM( pןoW ɹǝpnɹʇxƎ", - "item.gtceu.wire_extruder_mold.tooltip": "sǝɹıM buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.wireless_transmitter_cover": "ɹǝʇʇıɯsuɐɹ⟘ ssǝןǝɹıM", - "item.gtceu.wood_bolt": "ʞɔıʇS pooM ʇɹoɥS", - "item.gtceu.wood_dust": "dןnԀ pooM", - "item.gtceu.wood_plate": "ʞuɐןԀ pooM", - "item.gtceu.yellow_dye_spray_can": ")ʍoןןǝʎ( uɐƆ ʎɐɹdS", - "item.gtceu.yellow_glass_lens": ")ʍoןןǝʎ( suǝꞀ ssɐן⅁", - "item.gtceu.zero_point_module": "ǝןnpoW ʇuıoԀ oɹǝZ", - "item.gtceu.zpm_battery_hull": "ןןnH ʎɹǝʇʇɐᗺ ɐıɹpɐnbɐN ɯnıpǝW", - "item.gtceu.zpm_battery_hull.tooltip": "ןןnH ʎɹǝʇʇɐᗺㄥ§ WԀZɟ§ ʎʇdɯǝ uⱯㄥ§", - "item.gtceu.zpm_conveyor_module": "ǝןnpoW ɹoʎǝʌuoƆ WԀZ", - "item.gtceu.zpm_electric_motor": "ɹoʇoW ɔıɹʇɔǝןƎ WԀZ", - "item.gtceu.zpm_electric_piston": "uoʇsıԀ ɔıɹʇɔǝןƎ WԀZ", - "item.gtceu.zpm_electric_pump": "dɯnԀ ɔıɹʇɔǝןƎ WԀZ", - "item.gtceu.zpm_emitter": "ɹǝʇʇıɯƎ WԀZ", - "item.gtceu.zpm_field_generator": "ɹoʇɐɹǝuǝ⅁ pןǝıℲ WԀZ", - "item.gtceu.zpm_fluid_regulator": "ɹoʇɐןnbǝᴚ pınןℲ WԀZ", - "item.gtceu.zpm_naquadria_battery": "ʎɹǝʇʇɐᗺ ɐıɹpɐnbɐN ɯnıpǝW", - "item.gtceu.zpm_naquadria_battery.tooltip": "ʎɹǝʇʇɐᗺ ǝןqɐsnǝᴚㄥ§", - "item.gtceu.zpm_robot_arm": "ɯɹⱯ ʇoqoᴚ WԀZ", - "item.gtceu.zpm_sensor": "ɹosuǝS WԀZ", - "item.gtceu.zpm_solar_panel": "ןǝuɐԀ ɹɐןoS ǝןnpoW ʇuıoԀ oɹǝZ", - "item.gtceu.zpm_voltage_coil": "ןıoƆ ǝbɐʇןoΛ ǝןnpoW ʇuıoԀ oɹǝZ", - "item.gtceu.zpm_voltage_coil.tooltip": "ןıoƆ ɹǝdnS", - "item.invalid.name": "ɯǝʇı pıןɐʌuI", - "item.netherrack_nether_quartz": "ǝɹO zʇɹɐnὉ ɹǝɥʇǝN", - "itemGroup.gtceu.decoration": "sʞɔoןᗺ uoıʇɐɹoɔǝᗡ nƎƆɥɔǝ⟘bǝɹ⅁", - "itemGroup.gtceu.item": "sɯǝʇI nƎƆɥɔǝ⟘bǝɹ⅁", - "itemGroup.gtceu.machine": "sǝuıɥɔɐW nƎƆɥɔǝ⟘bǝɹ⅁", - "itemGroup.gtceu.material_block": "sʞɔoןᗺ ןɐıɹǝʇɐW nƎƆɥɔǝ⟘bǝɹ⅁", - "itemGroup.gtceu.material_fluid": "sɹǝuıɐʇuoƆ pınןℲ ןɐıɹǝʇɐW nƎƆɥɔǝ⟘bǝɹ⅁", - "itemGroup.gtceu.material_item": "sɯǝʇI ןɐıɹǝʇɐW nƎƆɥɔǝ⟘bǝɹ⅁", - "itemGroup.gtceu.material_pipe": "sǝdıԀ ןɐıɹǝʇɐW nƎƆɥɔǝ⟘bǝɹ⅁", - "itemGroup.gtceu.tool": "sןoo⟘ nƎƆɥɔǝ⟘bǝɹ⅁", - "ldlib.gui.editor.group.widget.gtm_container": "sʇǝbpıM ɹǝuıɐʇuoƆ W⟘⅁", - "ldlib.gui.editor.register.editor.gtceu.mui": "ʇɔǝظoɹԀ I∩ ǝuıɥɔɐW", - "ldlib.gui.editor.register.editor.gtceu.rtui": "ʇɔǝظoɹԀ I∩ ǝdʎ⟘ǝdıɔǝᴚ", - "ldlib.gui.editor.register.editor.gtceu.template_tab": "sǝʇɐןdɯǝʇ", - "ldlib.gui.editor.register.widget.container.gtm_fluid_slot": "ʇoןS pınןℲ W⟘⅁", - "ldlib.gui.editor.register.widget.container.gtm_item_slot": "ʇoןS ɯǝʇI W⟘⅁", - "ldlib.gui.editor.register.widget.container.gtm_phantom_fluid_slot": "ʇoןS pınןℲ ɯoʇuɐɥԀ W⟘⅁", - "ldlib.gui.editor.register.widget.container.gtm_phantom_item_slot": "ʇoןS ɯǝʇI ɯoʇuɐɥԀ W⟘⅁", - "mataarmor.hud.supply_mode": "%s :ǝpoW ʎןddnS", - "material.gtceu.acetic_acid": "pıɔⱯ ɔıʇǝɔⱯ", - "material.gtceu.acetic_anhydride": "ǝpıɹpʎɥuⱯ ɔıʇǝɔⱯ", - "material.gtceu.acetone": "ǝuoʇǝɔⱯ", - "material.gtceu.acidic_enriched_naquadah_solution": "uoıʇnןoS ɥɐpɐnbɐN pǝɥɔıɹuƎ ɔıpıɔⱯ", - "material.gtceu.acidic_naquadria_solution": "uoıʇnןoS ɐıɹpɐnbɐN ɔıpıɔⱯ", - "material.gtceu.acidic_osmium_solution": "uoıʇnןoS ɯnıɯsO ɔıpıɔⱯ", - "material.gtceu.actinium": "ɯnıuıʇɔⱯ", - "material.gtceu.activated_carbon": "uoqɹɐƆ pǝʇɐʌıʇɔⱯ", - "material.gtceu.agar": "ɹɐbⱯ", - "material.gtceu.air": "ɹıⱯ", - "material.gtceu.allyl_chloride": "ǝpıɹoןɥƆ ןʎןןⱯ", - "material.gtceu.almandine": "ǝuıpuɐɯןⱯ", - "material.gtceu.aluminium": "ɯnıuıɯnןⱯ", - "material.gtceu.aluminium_sulfite": "ǝʇıɟןnS ɯnıuıɯnןⱯ", - "material.gtceu.alunite": "ǝʇıunןⱯ", - "material.gtceu.americium": "ɯnıɔıɹǝɯⱯ", - "material.gtceu.amethyst": "ʇsʎɥʇǝɯⱯ", - "material.gtceu.aminophenol": "ןouǝɥdouıɯⱯ", - "material.gtceu.ammonia": "ɐıuoɯɯⱯ", - "material.gtceu.ammonium_chloride": "ǝpıɹoןɥƆ ɯnıuoɯɯⱯ", - "material.gtceu.ammonium_formate": "ǝʇɐɯɹoℲ ɯnıuoɯɯⱯ", - "material.gtceu.andesite": "ǝʇısǝpuⱯ", - "material.gtceu.andradite": "ǝʇıpɐɹpuⱯ", - "material.gtceu.annealed_copper": "ɹǝddoƆ pǝןɐǝuuⱯ", - "material.gtceu.antimony": "ʎuoɯıʇuⱯ", - "material.gtceu.antimony_trifluoride": "ǝpıɹonןɟıɹ⟘ ʎuoɯıʇuⱯ", - "material.gtceu.antimony_trioxide": "ǝpıxoıɹ⟘ ʎuoɯıʇuⱯ", - "material.gtceu.apatite": "ǝʇıʇɐdⱯ", - "material.gtceu.aqua_regia": "ɐıbǝᴚ ɐnbⱯ", - "material.gtceu.argon": "uobɹⱯ", - "material.gtceu.arsenic": "ɔıuǝsɹⱯ", - "material.gtceu.arsenic_trioxide": "ǝpıxoıɹ⟘ ɔıuǝsɹⱯ", - "material.gtceu.asbestos": "soʇsǝqsⱯ", - "material.gtceu.ash": "ɥsⱯ", - "material.gtceu.astatine": "ǝuıʇɐʇsⱯ", - "material.gtceu.bacteria": "ɐıɹǝʇɔɐᗺ", - "material.gtceu.bacterial_sludge": "ǝbpnןS ןɐıɹǝʇɔɐᗺ", - "material.gtceu.barite": "ǝʇıɹɐᗺ", - "material.gtceu.barium": "ɯnıɹɐᗺ", - "material.gtceu.barium_sulfide": "ǝpıɟןnS ɯnıɹɐᗺ", - "material.gtceu.basalt": "ʇןɐsɐᗺ", - "material.gtceu.basaltic_mineral_sand": "puɐS ןɐɹǝuıW ɔıʇןɐsɐᗺ", - "material.gtceu.bastnasite": "ǝʇısɐuʇsɐᗺ", - "material.gtceu.battery_alloy": "ʎoןןⱯ ʎɹǝʇʇɐᗺ", - "material.gtceu.bauxite": "ǝʇıxnɐᗺ", - "material.gtceu.bauxite_slag": "bɐןS ǝʇıxnɐᗺ", - "material.gtceu.bauxite_sludge": "ǝbpnןS ǝʇıxnɐᗺ", - "material.gtceu.bauxite_slurry": "ʎɹɹnןS ǝʇıxnɐᗺ", - "material.gtceu.bentonite": "ǝʇıuoʇuǝᗺ", - "material.gtceu.benzene": "ǝuǝzuǝᗺ", - "material.gtceu.berkelium": "ɯnıןǝʞɹǝᗺ", - "material.gtceu.beryllium": "ɯnıןןʎɹǝᗺ", - "material.gtceu.bio_diesel": "ןǝsǝıᗡ oıᗺ", - "material.gtceu.biomass": "ssɐɯoıᗺ", - "material.gtceu.biotite": "ǝʇıʇoıᗺ", - "material.gtceu.biphenyl": "ןʎuǝɥdıᗺ", - "material.gtceu.bismuth": "ɥʇnɯsıᗺ", - "material.gtceu.bismuth_bronze": "ǝzuoɹᗺ ɥʇnɯsıᗺ", - "material.gtceu.bisphenol_a": "Ɐ ןouǝɥdsıᗺ", - "material.gtceu.black_bronze": "ǝzuoɹᗺ ʞɔɐןᗺ", - "material.gtceu.black_dye": "ǝʎᗡ ʞɔɐןᗺ", - "material.gtceu.black_steel": "ןǝǝʇS ʞɔɐןᗺ", - "material.gtceu.blackstone": "ǝuoʇsʞɔɐןᗺ", - "material.gtceu.blaze": "ǝzɐןᗺ", - "material.gtceu.blue_alloy": "ʎoןןⱯ ǝnןᗺ", - "material.gtceu.blue_dye": "ǝʎᗡ ǝnןᗺ", - "material.gtceu.blue_steel": "ןǝǝʇS ǝnןᗺ", - "material.gtceu.blue_topaz": "zɐdo⟘ ǝnןᗺ", - "material.gtceu.bohrium": "ɯnıɹɥoᗺ", - "material.gtceu.bone": "ǝuoᗺ", - "material.gtceu.borax": "xɐɹoᗺ", - "material.gtceu.bornite": "ǝʇıuɹoᗺ", - "material.gtceu.boron": "uoɹoᗺ", - "material.gtceu.borosilicate_glass": "ssɐן⅁ ǝʇɐɔıןısoɹoᗺ", - "material.gtceu.brass": "ssɐɹᗺ", - "material.gtceu.brick": "ʞɔıɹᗺ", - "material.gtceu.bromine": "ǝuıɯoɹᗺ", - "material.gtceu.bronze": "ǝzuoɹᗺ", - "material.gtceu.brown_dye": "ǝʎᗡ uʍoɹᗺ", - "material.gtceu.butadiene": "ǝuǝıpɐʇnᗺ", - "material.gtceu.butane": "ǝuɐʇnᗺ", - "material.gtceu.butene": "ǝuǝʇnᗺ", - "material.gtceu.butyraldehyde": "ǝpʎɥǝpןɐɹʎʇnᗺ", - "material.gtceu.cadmium": "ɯnıɯpɐƆ", - "material.gtceu.caesium": "ɯnısǝɐƆ", - "material.gtceu.calcite": "ǝʇıɔןɐƆ", - "material.gtceu.calcium": "ɯnıɔןɐƆ", - "material.gtceu.calcium_carbonate": "ǝʇɐuoqɹɐƆ ɯnıɔןɐƆ", - "material.gtceu.calcium_chloride": "ǝpıɹoןɥƆ ɯnıɔןɐƆ", - "material.gtceu.calcium_ferrocyanide": "ǝpıuɐʎɔoɹɹǝℲ ɯnıɔןɐƆ", - "material.gtceu.calcium_hydroxide": "ǝpıxoɹpʎH ɯnıɔןɐƆ", - "material.gtceu.calcium_phosphide": "ǝpıɥdsoɥԀ ɯnıɔןɐƆ", - "material.gtceu.californium": "ɯnıuɹoɟıןɐƆ", - "material.gtceu.caprolactam": "ɯɐʇɔɐןoɹdɐƆ", - "material.gtceu.carbon": "uoqɹɐƆ", - "material.gtceu.carbon_dioxide": "ǝpıxoıᗡ uoqɹɐƆ", - "material.gtceu.carbon_monoxide": "ǝpıxouoW uoqɹɐƆ", - "material.gtceu.cassiterite": "ǝʇıɹǝʇıssɐƆ", - "material.gtceu.cassiterite_sand": "puɐS ǝʇıɹǝʇıssɐƆ", - "material.gtceu.cerium": "ɯnıɹǝƆ", - "material.gtceu.certus_quartz": "zʇɹɐnὉ snʇɹǝƆ", - "material.gtceu.cetane_boosted_diesel": "ןǝsǝıᗡ pǝʇsooᗺ ǝuɐʇǝƆ", - "material.gtceu.chalcocite": "ǝʇıɔoɔןɐɥƆ", - "material.gtceu.chalcopyrite": "ǝʇıɹʎdoɔןɐɥƆ", - "material.gtceu.charcoal": "ןɐoɔɹɐɥƆ", - "material.gtceu.charcoal_byproducts": "sʇɔnpoɹdʎᗺ ןɐoɔɹɐɥƆ", - "material.gtceu.chlorine": "ǝuıɹoןɥƆ", - "material.gtceu.chlorobenzene": "ǝuǝzuǝqoɹoןɥƆ", - "material.gtceu.chloroform": "ɯɹoɟoɹoןɥƆ", - "material.gtceu.chloromethane": "ǝuɐɥʇǝɯoɹoןɥƆ", - "material.gtceu.chromite": "ǝʇıɯoɹɥƆ", - "material.gtceu.chromium": "ɯnıɯoɹɥƆ", - "material.gtceu.chromium_trioxide": "ǝpıxoıɹ⟘ ɯnıɯoɹɥƆ", - "material.gtceu.cinnabar": "ɹɐqɐuuıƆ", - "material.gtceu.clay": "ʎɐןƆ", - "material.gtceu.coal": "ןɐoƆ", - "material.gtceu.coal_gas": "sɐ⅁ ןɐoƆ", - "material.gtceu.coal_tar": "ɹɐ⟘ ןɐoƆ", - "material.gtceu.cobalt": "ʇןɐqoƆ", - "material.gtceu.cobalt_brass": "ssɐɹᗺ ʇןɐqoƆ", - "material.gtceu.cobalt_oxide": "ǝpıxO ʇןɐqoƆ", - "material.gtceu.cobaltite": "ǝʇıʇןɐqoƆ", - "material.gtceu.cocoa": "ɐoɔoƆ", - "material.gtceu.coke": "ǝʞoƆ", - "material.gtceu.collagen": "uǝbɐןןoƆ", - "material.gtceu.concrete": "ǝʇǝɹɔuoƆ", - "material.gtceu.construction_foam": "ɯɐoℲ uoıʇɔnɹʇsuoƆ", - "material.gtceu.cooperite": "ǝʇıuopןǝɥS", - "material.gtceu.copernicium": "ɯnıɔıuɹǝdoƆ", - "material.gtceu.copper": "ɹǝddoƆ", - "material.gtceu.cracked_bauxite_slurry": "ʎɹɹnןS ǝʇıxnɐᗺ pǝʞɔɐɹƆ", - "material.gtceu.creosote": "ǝʇosoǝɹƆ", - "material.gtceu.cumene": "ǝuǝɯnƆ", - "material.gtceu.cupric_oxide": "ǝpıxO ɔıɹdnƆ", - "material.gtceu.cupronickel": "ןǝʞɔıuoɹdnƆ", - "material.gtceu.curium": "ɯnıɹnƆ", - "material.gtceu.cyan_dye": "ǝʎᗡ uɐʎƆ", - "material.gtceu.cyclohexane": "ǝuɐxǝɥoןɔʎƆ", - "material.gtceu.cyclohexanone_oxime": "ǝɯıxO ǝuouɐxǝɥoןɔʎƆ", - "material.gtceu.damascus_steel": "ןǝǝʇS snɔsɐɯɐᗡ", - "material.gtceu.dark_ash": "ɥsⱯ ʞɹɐᗡ", - "material.gtceu.darmstadtium": "ɯnıʇpɐʇsɯɹɐᗡ", - "material.gtceu.decalcified_bauxite_sludge": "ǝbpnןS ǝʇıxnɐᗺ pǝıɟıɔןɐɔǝᗡ", - "material.gtceu.deepslate": "ǝʇɐןsdǝǝᗡ", - "material.gtceu.depleted_uranium_hexafluoride": "ǝpıɹonןɟɐxǝH ɯnıuɐɹ∩ pǝʇǝןdǝᗡ", - "material.gtceu.deuterium": "ɯnıɹǝʇnǝᗡ", - "material.gtceu.diaminobenzidine": "ǝuıpızuǝqouıɯɐıᗡ", - "material.gtceu.diamond": "puoɯɐıᗡ", - "material.gtceu.diatomite": "ǝʇıɯoʇɐıᗡ", - "material.gtceu.dichlorobenzene": "ǝuǝzuǝqoɹoןɥɔıᗡ", - "material.gtceu.dichlorobenzidine": "ǝuıpızuǝqoɹoןɥɔıᗡ", - "material.gtceu.dichloroethane": "ǝuɐɥʇǝoɹoןɥɔıᗡ", - "material.gtceu.diesel": "ןǝsǝıᗡ", - "material.gtceu.diethylenetriamine": "ǝuıɯɐıɹʇǝuǝןʎɥʇǝıᗡ", - "material.gtceu.diethylenetriamine_pentaacetonitrile": "ǝןıɹʇıuoʇǝɔɐɐʇuǝԀ ǝuıɯɐıɹʇǝuǝןʎɥʇǝıᗡ", - "material.gtceu.diethylenetriaminepentaacetic_acid": "pıɔⱯ ɔıʇǝɔɐɐʇuǝdǝuıɯɐıɹʇǝuǝןʎɥʇǝıᗡ", - "material.gtceu.diluted_hydrochloric_acid": "pıɔⱯ ɔıɹoןɥɔoɹpʎH pǝʇnןıᗡ", - "material.gtceu.diluted_sulfuric_acid": "pıɔⱯ ɔıɹnɟןnS pǝʇnןıᗡ", - "material.gtceu.dimethylamine": "ǝuıɯɐןʎɥʇǝɯıᗡ", - "material.gtceu.dimethylbenzene": "ǝuǝzuǝqןʎɥʇǝɯıᗡ", - "material.gtceu.dimethyldichlorosilane": "ǝuɐןısoɹoןɥɔıpןʎɥʇǝɯıᗡ", - "material.gtceu.dimethylhydrazine": "ǝuızɐɹpʎɥןʎɥʇǝɯıᗡ", - "material.gtceu.dinitrogen_tetroxide": "ǝpıxoɹʇǝ⟘ uǝboɹʇıuıᗡ", - "material.gtceu.diorite": "ǝʇıɹoıᗡ", - "material.gtceu.diphenyl_isophthalate": "ǝʇɐןɐɥʇɥdosI ןʎuǝɥdıᗡ", - "material.gtceu.dissolved_calcium_acetate": "ǝʇɐʇǝɔⱯ ɯnıɔןɐƆ pǝʌןossıᗡ", - "material.gtceu.distilled_water": "ɹǝʇɐM pǝןןıʇsıᗡ", - "material.gtceu.drilling_fluid": "pınןℲ buıןןıɹᗡ", - "material.gtceu.dubnium": "ɯnıuqnᗡ", - "material.gtceu.duranium": "ɯnıuɐɹnᗡ", - "material.gtceu.dysprosium": "ɯnısoɹdsʎᗡ", - "material.gtceu.echo_shard": "pɹɐɥS oɥɔƎ", - "material.gtceu.einsteinium": "ɯnıuıǝʇsuıƎ", - "material.gtceu.electrotine": "ǝuıʇoɹʇɔǝןƎ", - "material.gtceu.electrum": "ɯnɹʇɔǝןƎ", - "material.gtceu.emerald": "pןɐɹǝɯƎ", - "material.gtceu.ender_air": "ɹıⱯ ɹǝpuƎ", - "material.gtceu.ender_eye": "ǝʎƎ ɹǝpuƎ", - "material.gtceu.ender_pearl": "ןɹɐǝԀ ɹǝpuƎ", - "material.gtceu.endstone": "ǝuoʇspuƎ", - "material.gtceu.enriched_bacterial_sludge": "ǝbpnןS ןɐıɹǝʇɔɐᗺ pǝɥɔıɹuƎ", - "material.gtceu.enriched_naquadah": "ɥɐpɐnbɐN pǝɥɔıɹuƎ", - "material.gtceu.enriched_naquadah_solution": "uoıʇnןoS ɥɐpɐnbɐN pǝɥɔıɹuƎ", - "material.gtceu.enriched_naquadah_sulfate": "ǝʇɐɟןnS ɥɐpɐnbɐN pǝɥɔıɹuƎ", - "material.gtceu.enriched_naquadah_trinium_europium_duranide": "ǝpıuɐɹnᗡ ɯnıdoɹnƎ ɯnıuıɹ⟘ ɥɐpɐnbɐN pǝɥɔıɹuƎ", - "material.gtceu.enriched_naquadah_waste": "ǝʇsɐM ɥɐpɐnbɐN pǝɥɔıɹuƎ", - "material.gtceu.enriched_uranium_hexafluoride": "ǝpıɹonןɟɐxǝH ɯnıuɐɹ∩ pǝɥɔıɹuƎ", - "material.gtceu.epichlorohydrin": "uıɹpʎɥoɹoןɥɔıdƎ", - "material.gtceu.epoxy": "ʎxodƎ", - "material.gtceu.erbium": "ɯnıqɹƎ", - "material.gtceu.ethane": "ǝuɐɥʇƎ", - "material.gtceu.ethanol": "ןouɐɥʇƎ", - "material.gtceu.ethenone": "ǝuouǝɥʇƎ", - "material.gtceu.ethyl_tertbutyl_ether": "ɹǝɥʇƎ ןʎʇnqʇɹǝ⟘ ןʎɥʇƎ", - "material.gtceu.ethylbenzene": "ǝuǝzuǝqןʎɥʇƎ", - "material.gtceu.ethylene": "ǝuǝןʎɥʇƎ", - "material.gtceu.europium": "ɯnıdoɹnƎ", - "material.gtceu.fermented_biomass": "ssɐɯoıᗺ pǝʇuǝɯɹǝℲ", - "material.gtceu.fermium": "ɯnıɯɹǝℲ", - "material.gtceu.ferrite_mixture": "ǝɹnʇxıW ǝʇıɹɹǝℲ", - "material.gtceu.ferrosilite": "ǝʇıןısoɹɹǝℲ", - "material.gtceu.fireclay": "ʎɐןɔǝɹıℲ", - "material.gtceu.fish_oil": "ןıO ɥsıℲ", - "material.gtceu.flerovium": "ɯnıʌoɹǝןℲ", - "material.gtceu.flint": "ʇuıןℲ", - "material.gtceu.fluorine": "ǝuıɹonןℲ", - "material.gtceu.fluoroantimonic_acid": "pıɔⱯ ɔıuoɯıʇuɐoɹonןℲ", - "material.gtceu.formaldehyde": "ǝpʎɥǝpןɐɯɹoℲ", - "material.gtceu.formamide": "ǝpıɯɐɯɹoℲ", - "material.gtceu.formic_acid": "pıɔⱯ ɔıɯɹoℲ", - "material.gtceu.francium": "ɯnıɔuɐɹℲ", - "material.gtceu.fullers_earth": "ɥʇɹɐƎ s,ɹǝןןnℲ", - "material.gtceu.gadolinium": "ɯnıuıןopɐ⅁", - "material.gtceu.galena": "ɐuǝןɐ⅁", - "material.gtceu.gallium": "ɯnıןןɐ⅁", - "material.gtceu.gallium_arsenide": "ǝpıuǝsɹⱯ ɯnıןןɐ⅁", - "material.gtceu.gallium_sulfide": "ǝpıɟןnS ɯnıןןɐ⅁", - "material.gtceu.garnet_sand": "puɐS ʇǝuɹɐ⅁", - "material.gtceu.garnierite": "ǝʇıɹǝıuɹɐ⅁", - "material.gtceu.gasoline": "ǝuıןosɐ⅁", - "material.gtceu.gelatin": "uıʇɐןǝ⅁", - "material.gtceu.gelatin_mixture": "ǝɹnʇxıW uıʇɐןǝ⅁", - "material.gtceu.germanium": "ɯnıuɐɯɹǝ⅁", - "material.gtceu.glass": "ssɐן⅁", - "material.gtceu.glauconite_sand": "puɐS ǝʇıuoɔnɐן⅁", - "material.gtceu.glowstone": "ǝuoʇsʍoן⅁", - "material.gtceu.glue": "ǝnן⅁", - "material.gtceu.glycerol": "ןoɹǝɔʎן⅁", - "material.gtceu.glyceryl_trinitrate": "ǝʇɐɹʇıuıɹ⟘ ןʎɹǝɔʎן⅁", - "material.gtceu.glycolonitrile": "ǝןıɹʇıuoןoɔʎן⅁", - "material.gtceu.goethite": "ǝʇıɥʇǝo⅁", - "material.gtceu.gold": "pןo⅁", - "material.gtceu.granite": "ǝʇıuɐɹ⅁", - "material.gtceu.granite_red": "pǝᴚ ǝʇıuɐɹ⅁", - "material.gtceu.granitic_mineral_sand": "puɐS ןɐɹǝuıW ɔıʇıuɐɹ⅁", - "material.gtceu.graphene": "ǝuǝɥdɐɹ⅁", - "material.gtceu.graphite": "ǝʇıɥdɐɹ⅁", - "material.gtceu.gray_dye": "ǝʎᗡ ʎɐɹ⅁", - "material.gtceu.green_dye": "ǝʎᗡ uǝǝɹ⅁", - "material.gtceu.green_sapphire": "ǝɹıɥddɐS uǝǝɹ⅁", - "material.gtceu.green_sapphire_slurry": "ʎɹɹnןS ǝɹıɥddɐS uǝǝɹ⅁", - "material.gtceu.grossular": "ɹɐןnssoɹ⅁", - "material.gtceu.gunpowder": "ɹǝpʍodun⅁", - "material.gtceu.gypsum": "ɯnsdʎ⅁", - "material.gtceu.hafnium": "ɯnıuɟɐH", - "material.gtceu.hassium": "ɯnıssɐH", - "material.gtceu.hastelloy_c_276": "9ㄥᄅ-Ɔ ʎoןןǝʇsɐH", - "material.gtceu.hastelloy_x": "X ʎoןןǝʇsɐH", - "material.gtceu.heavy_fuel": "ןǝnℲ ʎʌɐǝH", - "material.gtceu.helium": "ɯnıןǝH", - "material.gtceu.helium_3": "Ɛ ɯnıןǝH", - "material.gtceu.hematite": "ǝʇıʇɐɯǝH", - "material.gtceu.high_octane_gasoline": "ǝuıןosɐ⅁ ǝuɐʇɔO ɥbıH", - "material.gtceu.holmium": "ɯnıɯןoH", - "material.gtceu.hsla_steel": "ןǝǝʇS ⱯꞀSH", - "material.gtceu.hsse": "Ǝ-SSH", - "material.gtceu.hssg": "⅁-SSH", - "material.gtceu.hsss": "S-SSH", - "material.gtceu.hydro_cracked_butadiene": "ǝuǝıpɐʇnᗺ pǝʞɔɐɹƆ-oɹpʎH", - "material.gtceu.hydro_cracked_butane": "ǝuɐʇnᗺ pǝʞɔɐɹƆ-oɹpʎH", - "material.gtceu.hydro_cracked_butene": "ǝuǝʇnᗺ pǝʞɔɐɹƆ-oɹpʎH", - "material.gtceu.hydro_cracked_ethane": "ǝuɐɥʇƎ pǝʞɔɐɹƆ-oɹpʎH", - "material.gtceu.hydro_cracked_ethylene": "ǝuǝןʎɥʇƎ pǝʞɔɐɹƆ-oɹpʎH", - "material.gtceu.hydro_cracked_propane": "ǝuɐdoɹԀ pǝʞɔɐɹƆ-oɹpʎH", - "material.gtceu.hydro_cracked_propene": "ǝuǝdoɹԀ pǝʞɔɐɹƆ-oɹpʎH", - "material.gtceu.hydrochloric_acid": "pıɔⱯ ɔıɹoןɥɔoɹpʎH", - "material.gtceu.hydrofluoric_acid": "pıɔⱯ ɔıɹonןɟoɹpʎH", - "material.gtceu.hydrogen": "uǝboɹpʎH", - "material.gtceu.hydrogen_cyanide": "ǝpıuɐʎƆ uǝboɹpʎH", - "material.gtceu.hydrogen_peroxide": "ǝpıxoɹǝԀ uǝboɹpʎH", - "material.gtceu.hydrogen_sulfide": "ǝpıɟןnS uǝboɹpʎH", - "material.gtceu.hypochlorous_acid": "pıɔⱯ snoɹoןɥɔodʎH", - "material.gtceu.ice": "ǝɔI", - "material.gtceu.ilmenite": "ǝʇıuǝɯןI", - "material.gtceu.ilmenite_slag": "bɐןS ǝʇıuǝɯןI", - "material.gtceu.impure_enriched_naquadah_solution": "uoıʇnןoS ɥɐpɐnbɐN pǝɥɔıɹuƎ ǝɹndɯI", - "material.gtceu.impure_naquadria_solution": "uoıʇnןoS ɐıɹpɐnbɐN ǝɹndɯI", - "material.gtceu.incoloy_ma_956": "9ϛ6-ⱯW ʎoןoɔuI", - "material.gtceu.indium": "ɯnıpuI", - "material.gtceu.indium_concentrate": "ǝʇɐɹʇuǝɔuoƆ ɯnıpuI", - "material.gtceu.indium_gallium_phosphide": "ǝpıɥdsoɥԀ ɯnıןןɐ⅁ ɯnıpuI", - "material.gtceu.indium_phosphide": "ǝpıɥdsoɥԀ ɯnıpuI", - "material.gtceu.indium_tin_barium_titanium_cuprate": "ǝʇɐɹdnƆ ɯnıuɐʇı⟘ ɯnıɹɐᗺ uı⟘ ɯnıpuI", - "material.gtceu.inert_metal_mixture": "ǝɹnʇxıW ןɐʇǝW ʇɹǝuI", - "material.gtceu.invar": "ɹɐʌuI", - "material.gtceu.iodine": "ǝuıpoI", - "material.gtceu.iridium": "ɯnıpıɹI", - "material.gtceu.iridium_chloride": "ǝpıɹoןɥƆ ɯnıpıɹI", - "material.gtceu.iridium_metal_residue": "ǝnpısǝᴚ ןɐʇǝW ɯnıpıɹI", - "material.gtceu.iron": "uoɹI", - "material.gtceu.iron_ii_chloride": "ǝpıɹoןɥƆ II uoɹI", - "material.gtceu.iron_iii_chloride": "ǝpıɹoןɥƆ III uoɹI", - "material.gtceu.isoprene": "ǝuǝɹdosI", - "material.gtceu.kanthal": "ןɐɥʇuɐʞ", - "material.gtceu.krypton": "uoʇdʎɹʞ", - "material.gtceu.kyanite": "ǝʇıuɐʎʞ", - "material.gtceu.lanthanum": "ɯnuɐɥʇuɐꞀ", - "material.gtceu.lapis": "sıdɐꞀ", - "material.gtceu.lapotron": "uoɹʇodɐꞀ", - "material.gtceu.lava": "ɐʌɐꞀ", - "material.gtceu.lawrencium": "ɯnıɔuǝɹʍɐꞀ", - "material.gtceu.lazurite": "ǝʇıɹnzɐꞀ", - "material.gtceu.lead": "pɐǝꞀ", - "material.gtceu.lead_zinc_solution": "uoıʇnןoS ɔuıZ pɐǝꞀ", - "material.gtceu.lepidolite": "ǝʇıןopıdǝꞀ", - "material.gtceu.light_blue_dye": "ǝʎᗡ ǝnןᗺ ʇɥbıꞀ", - "material.gtceu.light_fuel": "ןǝnℲ ʇɥbıꞀ", - "material.gtceu.light_gray_dye": "ǝʎᗡ ʎɐɹ⅁ ʇɥbıꞀ", - "material.gtceu.lightly_hydro_cracked_gas": "sɐ⅁ pǝʞɔɐɹƆ-oɹpʎH ʎןʇɥbıꞀ", - "material.gtceu.lightly_hydro_cracked_heavy_fuel": "ןǝnℲ ʎʌɐǝH pǝʞɔɐɹƆ-oɹpʎH ʎןʇɥbıꞀ", - "material.gtceu.lightly_hydro_cracked_light_fuel": "ןǝnℲ ʇɥbıꞀ pǝʞɔɐɹƆ-oɹpʎH ʎןʇɥbıꞀ", - "material.gtceu.lightly_hydro_cracked_naphtha": "ɐɥʇɥdɐN pǝʞɔɐɹƆ-oɹpʎH ʎןʇɥbıꞀ", - "material.gtceu.lightly_steam_cracked_gas": "sɐ⅁ pǝʞɔɐɹƆ-ɯɐǝʇS ʎןʇɥbıꞀ", - "material.gtceu.lightly_steam_cracked_heavy_fuel": "ןǝnℲ ʎʌɐǝH pǝʞɔɐɹƆ-ɯɐǝʇS ʎןʇɥbıꞀ", - "material.gtceu.lightly_steam_cracked_light_fuel": "ןǝnℲ ʇɥbıꞀ pǝʞɔɐɹƆ-ɯɐǝʇS ʎןʇɥbıꞀ", - "material.gtceu.lightly_steam_cracked_naphtha": "ɐɥʇɥdɐN pǝʞɔɐɹƆ-ɯɐǝʇS ʎןʇɥbıꞀ", - "material.gtceu.lime_dye": "ǝʎᗡ ǝɯıꞀ", - "material.gtceu.liquid_air": "ɹıⱯ pınbıꞀ", - "material.gtceu.liquid_ender_air": "ɹıⱯ ɹǝpuƎ pınbıꞀ", - "material.gtceu.liquid_nether_air": "ɹıⱯ ɹǝɥʇǝN pınbıꞀ", - "material.gtceu.lithium": "ɯnıɥʇıꞀ", - "material.gtceu.lithium_chloride": "ǝpıɹoןɥƆ ɯnıɥʇıꞀ", - "material.gtceu.livermorium": "ɯnıɹoɯɹǝʌıꞀ", - "material.gtceu.lpg": "⅁ԀꞀ", - "material.gtceu.lubricant": "ʇuɐɔıɹqnꞀ", - "material.gtceu.lutetium": "ɯnıʇǝʇnꞀ", - "material.gtceu.magenta_dye": "ǝʎᗡ ɐʇuǝbɐW", - "material.gtceu.magnalium": "ɯnıןɐubɐW", - "material.gtceu.magnesia": "ɐısǝubɐW", - "material.gtceu.magnesite": "ǝʇısǝubɐW", - "material.gtceu.magnesium": "ɯnısǝubɐW", - "material.gtceu.magnesium_chloride": "ǝpıɹoןɥƆ ɯnısǝubɐW", - "material.gtceu.magnesium_diboride": "ǝpıɹoqıᗡ ɯnısǝubɐW", - "material.gtceu.magnetic_iron": "uoɹI ɔıʇǝubɐW", - "material.gtceu.magnetic_neodymium": "ɯnıɯʎpoǝN ɔıʇǝubɐW", - "material.gtceu.magnetic_samarium": "ɯnıɹɐɯɐS ɔıʇǝubɐW", - "material.gtceu.magnetic_steel": "ןǝǝʇS ɔıʇǝubɐW", - "material.gtceu.magnetite": "ǝʇıʇǝubɐW", - "material.gtceu.malachite": "ǝʇıɥɔɐןɐW", - "material.gtceu.manganese": "ǝsǝuɐbuɐW", - "material.gtceu.manganese_phosphide": "ǝpıɥdsoɥԀ ǝsǝuɐbuɐW", - "material.gtceu.maraging_steel_300": "00Ɛ ןǝǝʇS buıbɐɹɐW", - "material.gtceu.marble": "ǝןqɹɐW", - "material.gtceu.massicot": "ʇoɔıssɐW", - "material.gtceu.mc_guffium_239": "6Ɛᄅ ɯnıɟɟn⅁ ɔW", - "material.gtceu.meat": "ʇɐǝW", - "material.gtceu.meitnerium": "ɯnıɹǝuʇıǝW", - "material.gtceu.mendelevium": "ɯnıʌǝןǝpuǝW", - "material.gtceu.mercury": "ʎɹnɔɹǝW", - "material.gtceu.mercury_barium_calcium_cuprate": "ǝʇɐɹdnƆ ɯnıɔןɐƆ ɯnıɹɐᗺ ʎɹnɔɹǝW", - "material.gtceu.metal_mixture": "ǝɹnʇxıW ןɐʇǝW", - "material.gtceu.methane": "ǝuɐɥʇǝW", - "material.gtceu.methanol": "ןouɐɥʇǝW", - "material.gtceu.methyl_acetate": "ǝʇɐʇǝɔⱯ ןʎɥʇǝW", - "material.gtceu.mica": "ɐɔıW", - "material.gtceu.milk": "ʞןıW", - "material.gtceu.mirabilite": "ǝʇıןıqɐɹıW", - "material.gtceu.molybdenite": "ǝʇıuǝpqʎןoW", - "material.gtceu.molybdenum": "ɯnuǝpqʎןoW", - "material.gtceu.molybdenum_disilicide": "ǝpıɔıןısıᗡ ɯnuǝpqʎןoW", - "material.gtceu.monazite": "ǝʇızɐuoW", - "material.gtceu.monochloramine": "ǝuıɯɐɹoןɥɔouoW", - "material.gtceu.moscovium": "ɯnıʌoɔsoW", - "material.gtceu.mutagen": "uǝbɐʇnW", - "material.gtceu.naphtha": "ɐɥʇɥdɐN", - "material.gtceu.naphthalene": "ǝuǝןɐɥʇɥdɐN", - "material.gtceu.naquadah": "ɥɐpɐnbɐN", - "material.gtceu.naquadah_alloy": "ʎoןןⱯ ɥɐpɐnbɐN", - "material.gtceu.naquadria": "ɐıɹpɐnbɐN", - "material.gtceu.naquadria_solution": "uoıʇnןoS ɐıɹpɐnbɐN", - "material.gtceu.naquadria_sulfate": "ǝʇɐɟןnS ɐıɹpɐnbɐN", - "material.gtceu.naquadria_waste": "ǝʇsɐM ɐıɹpɐnbɐN", - "material.gtceu.natural_gas": "sɐ⅁ ןɐɹnʇɐN", - "material.gtceu.neodymium": "ɯnıɯʎpoǝN", - "material.gtceu.neon": "uoǝN", - "material.gtceu.neptunium": "ɯnıunʇdǝN", - "material.gtceu.nether_air": "ɹıⱯ ɹǝɥʇǝN", - "material.gtceu.nether_quartz": "zʇɹɐnὉ ɹǝɥʇǝN", - "material.gtceu.nether_star": "ɹɐʇS ɹǝɥʇǝN", - "material.gtceu.netherite": "ǝʇıɹǝɥʇǝN", - "material.gtceu.netherrack": "ʞɔɐɹɹǝɥʇǝN", - "material.gtceu.neutronium": "ɯnıuoɹʇnǝN", - "material.gtceu.nichrome": "ǝɯoɹɥɔıN", - "material.gtceu.nickel": "ןǝʞɔıN", - "material.gtceu.nickel_zinc_ferrite": "ǝʇıɹɹǝℲ ɔuıZ ןǝʞɔıN", - "material.gtceu.nihonium": "ɯnıuoɥıN", - "material.gtceu.niobium": "ɯnıqoıN", - "material.gtceu.niobium_nitride": "ǝpıɹʇıN ɯnıqoıN", - "material.gtceu.niobium_titanium": "ɯnıuɐʇı⟘ ɯnıqoıN", - "material.gtceu.nitration_mixture": "ǝɹnʇxıW uoıʇɐɹʇıN", - "material.gtceu.nitric_acid": "pıɔⱯ ɔıɹʇıN", - "material.gtceu.nitric_oxide": "ǝpıxO ɔıɹʇıN", - "material.gtceu.nitrobenzene": "ǝuǝzuǝqoɹʇıN", - "material.gtceu.nitrochlorobenzene": "ǝuǝzuǝqoɹoןɥɔoɹʇıN", - "material.gtceu.nitrogen": "uǝboɹʇıN", - "material.gtceu.nitrogen_dioxide": "ǝpıxoıᗡ uǝboɹʇıN", - "material.gtceu.nitrosyl_chloride": "ǝpıɹoןɥƆ ןʎsoɹʇıN", - "material.gtceu.nitrous_oxide": "ǝpıxO snoɹʇıN", - "material.gtceu.nobelium": "ɯnıןǝqoN", - "material.gtceu.obsidian": "uɐıpısqO", - "material.gtceu.octane": "ǝuɐʇɔO", - "material.gtceu.oganesson": "uossǝuɐbO", - "material.gtceu.oil": "ןıO", - "material.gtceu.oil_heavy": "ןıO ʎʌɐǝH", - "material.gtceu.oil_light": "ןıO ʇɥbıꞀ", - "material.gtceu.oil_medium": "ןıO ʍɐᴚ", - "material.gtceu.oilsands": "spuɐsןıO", - "material.gtceu.olivine": "ǝuıʌıןO", - "material.gtceu.opal": "ןɐdO", - "material.gtceu.orange_dye": "ǝʎᗡ ǝbuɐɹO", - "material.gtceu.osmiridium": "ɯnıpıɹıɯsO", - "material.gtceu.osmium": "ɯnıɯsO", - "material.gtceu.osmium_tetroxide": "ǝpıxoɹʇǝ⟘ ɯnıɯsO", - "material.gtceu.oxygen": "uǝbʎxO", - "material.gtceu.palladium": "ɯnıpɐןןɐԀ", - "material.gtceu.palladium_raw": "ʍɐᴚ ɯnıpɐןןɐԀ", - "material.gtceu.paper": "ɹǝdɐԀ", - "material.gtceu.paracetamol": "ןoɯɐʇǝɔɐɹɐԀ", - "material.gtceu.pcb_coolant": "ʇuɐןooƆ ᗺƆԀ", - "material.gtceu.pentlandite": "ǝʇıpuɐןʇuǝԀ", - "material.gtceu.perlite": "ǝʇıןɹǝԀ", - "material.gtceu.phenol": "ןouǝɥԀ", - "material.gtceu.phosphate": "ǝʇɐɥdsoɥԀ", - "material.gtceu.phosphoric_acid": "pıɔⱯ ɔıɹoɥdsoɥԀ", - "material.gtceu.phosphorus": "snɹoɥdsoɥԀ", - "material.gtceu.phosphorus_pentoxide": "ǝpıxoʇuǝԀ snɹoɥdsoɥԀ", - "material.gtceu.phthalic_acid": "pıɔⱯ ɔıןɐɥʇɥԀ", - "material.gtceu.pink_dye": "ǝʎᗡ ʞuıԀ", - "material.gtceu.pitchblende": "ǝpuǝןqɥɔʇıԀ", - "material.gtceu.platinum": "ɯnuıʇɐןԀ", - "material.gtceu.platinum_group_sludge": "ǝbpnןS dnoɹ⅁ ɯnuıʇɐןԀ", - "material.gtceu.platinum_raw": "ʍɐᴚ ɯnuıʇɐןԀ", - "material.gtceu.platinum_sludge_residue": "ǝnpısǝᴚ ǝbpnןS ɯnuıʇɐןԀ", - "material.gtceu.plutonium": "ɯnıuoʇnןԀ", - "material.gtceu.plutonium_241": "Ɩㄣᄅ ɯnıuoʇnןԀ", - "material.gtceu.pollucite": "ǝʇıɔnןןoԀ", - "material.gtceu.polonium": "ɯnıuoןoԀ", - "material.gtceu.polybenzimidazole": "ǝןozɐpıɯızuǝqʎןoԀ", - "material.gtceu.polycaprolactam": "ɯɐʇɔɐןoɹdɐɔʎןoԀ", - "material.gtceu.polychlorinated_biphenyl": "ןʎuǝɥdıᗺ pǝʇɐuıɹoןɥɔʎןoԀ", - "material.gtceu.polydimethylsiloxane": "ǝuɐxoןısןʎɥʇǝɯıpʎןoԀ", - "material.gtceu.polyethylene": "ǝuǝןʎɥʇǝʎןoԀ", - "material.gtceu.polyphenylene_sulfide": "ǝpıɟןnS ǝuǝןʎuǝɥdʎןoԀ", - "material.gtceu.polytetrafluoroethylene": "ǝuǝןʎɥʇǝoɹonןɟɐɹʇǝʇʎןoԀ", - "material.gtceu.polyvinyl_acetate": "ǝʇɐʇǝɔⱯ ןʎuıʌʎןoԀ", - "material.gtceu.polyvinyl_butyral": "ןɐɹʎʇnᗺ ןʎuıʌʎןoԀ", - "material.gtceu.polyvinyl_chloride": "ǝpıɹoןɥƆ ןʎuıʌʎןoԀ", - "material.gtceu.potash": "ɥsɐʇoԀ", - "material.gtceu.potassium": "ɯnıssɐʇoԀ", - "material.gtceu.potassium_carbonate": "ǝʇɐuoqɹɐƆ ɯnıssɐʇoԀ", - "material.gtceu.potassium_cyanide": "ǝpıuɐʎƆ ɯnıssɐʇoԀ", - "material.gtceu.potassium_dichromate": "ǝʇɐɯoɹɥɔıᗡ ɯnıssɐʇoԀ", - "material.gtceu.potassium_feldspar": "ɹɐdspןǝℲ ɯnıssɐʇoԀ", - "material.gtceu.potassium_ferrocyanide": "ǝpıuɐʎɔoɹɹǝℲ ɯnıssɐʇoԀ", - "material.gtceu.potassium_hydroxide": "ǝpıxoɹpʎH ɯnıssɐʇoԀ", - "material.gtceu.potassium_iodide": "ǝpıpoI ɯnıssɐʇoԀ", - "material.gtceu.potassium_sulfate": "ǝʇɐɟןnS ɯnıssɐʇoԀ", - "material.gtceu.potin": "uıʇoԀ", - "material.gtceu.powellite": "ǝʇıןןǝʍoԀ", - "material.gtceu.praseodymium": "ɯnıɯʎpoǝsɐɹԀ", - "material.gtceu.promethium": "ɯnıɥʇǝɯoɹԀ", - "material.gtceu.propane": "ǝuɐdoɹԀ", - "material.gtceu.propene": "ǝuǝdoɹԀ", - "material.gtceu.protactinium": "ɯnıuıʇɔɐʇoɹԀ", - "material.gtceu.prussian_blue": "ǝnןᗺ uɐıssnɹԀ", - "material.gtceu.purple_dye": "ǝʎᗡ ǝןdɹnԀ", - "material.gtceu.pyrite": "ǝʇıɹʎԀ", - "material.gtceu.pyrochlore": "ǝɹoןɥɔoɹʎԀ", - "material.gtceu.pyrolusite": "ǝʇısnןoɹʎԀ", - "material.gtceu.pyrope": "ǝdoɹʎԀ", - "material.gtceu.quartz_sand": "puɐS zʇɹɐnὉ", - "material.gtceu.quartzite": "ǝʇızʇɹɐnὉ", - "material.gtceu.quicklime": "ǝɯıןʞɔınὉ", - "material.gtceu.rad_away": "ʎɐʍⱯ pɐᴚ", - "material.gtceu.radium": "ɯnıpɐᴚ", - "material.gtceu.radon": "uopɐᴚ", - "material.gtceu.rare_earth": "ɥʇɹɐƎ ǝɹɐᴚ", - "material.gtceu.rarest_metal_mixture": "ǝɹnʇxıW ןɐʇǝW ʇsǝɹɐᴚ", - "material.gtceu.raw_gasoline": "ǝuıןosɐ⅁ ʍɐᴚ", - "material.gtceu.raw_growth_medium": "ɯnıpǝW ɥʇʍoɹ⅁ ʍɐᴚ", - "material.gtceu.raw_rubber": "ɹǝqqnᴚ ʍɐᴚ", - "material.gtceu.raw_styrene_butadiene_rubber": "ɹǝqqnᴚ ǝuǝıpɐʇnᗺ ǝuǝɹʎʇS ʍɐᴚ", - "material.gtceu.realgar": "ɹɐbןɐǝᴚ", - "material.gtceu.red_alloy": "ʎoןןⱯ pǝᴚ", - "material.gtceu.red_dye": "ǝʎᗡ pǝᴚ", - "material.gtceu.red_garnet": "ʇǝuɹɐ⅁ pǝᴚ", - "material.gtceu.red_steel": "ןǝǝʇS pǝᴚ", - "material.gtceu.redrock": "ʞɔoɹpǝᴚ", - "material.gtceu.redstone": "ǝuoʇspǝᴚ", - "material.gtceu.refinery_gas": "sɐ⅁ ʎɹǝuıɟǝᴚ", - "material.gtceu.reinforced_epoxy_resin": "uısǝᴚ ʎxodƎ pǝɔɹoɟuıǝᴚ", - "material.gtceu.rhenium": "ɯnıuǝɥᴚ", - "material.gtceu.rhodium": "ɯnıpoɥᴚ", - "material.gtceu.rhodium_plated_palladium": "ɯnıpɐןןɐԀ pǝʇɐןԀ ɯnıpoɥᴚ", - "material.gtceu.rhodium_sulfate": "ǝʇɐɟןnS ɯnıpoɥᴚ", - "material.gtceu.rock_salt": "ʇןɐS ʞɔoᴚ", - "material.gtceu.rocket_fuel": "ןǝnℲ ʇǝʞɔoᴚ", - "material.gtceu.roentgenium": "ɯnıuǝbʇuǝoᴚ", - "material.gtceu.rose_gold": "pןo⅁ ǝsoᴚ", - "material.gtceu.rtm_alloy": "ʎoןןⱯ W⟘ᴚ", - "material.gtceu.rubber": "ɹǝqqnᴚ", - "material.gtceu.rubidium": "ɯnıpıqnᴚ", - "material.gtceu.ruby": "ʎqnᴚ", - "material.gtceu.ruby_slurry": "ʎɹɹnןS ʎqnᴚ", - "material.gtceu.ruridit": "ʇıpıɹnᴚ", - "material.gtceu.ruthenium": "ɯnıuǝɥʇnᴚ", - "material.gtceu.ruthenium_tetroxide": "ǝpıxoɹʇǝ⟘ ɯnıuǝɥʇnᴚ", - "material.gtceu.ruthenium_trinium_americium_neutronate": "ǝʇɐuoɹʇnǝN ɯnıɔıɹǝɯⱯ ɯnıuıɹ⟘ ɯnıuǝɥʇnᴚ", - "material.gtceu.rutherfordium": "ɯnıpɹoɟɹǝɥʇnᴚ", - "material.gtceu.rutile": "ǝןıʇnᴚ", - "material.gtceu.salt": "ʇןɐS", - "material.gtceu.salt_water": "ɹǝʇɐM ʇןɐS", - "material.gtceu.saltpeter": "ɹǝʇǝdʇןɐS", - "material.gtceu.samarium": "ɯnıɹɐɯɐS", - "material.gtceu.samarium_iron_arsenic_oxide": "ǝpıxO ɔıuǝsɹⱯ uoɹI ɯnıɹɐɯɐS", - "material.gtceu.sapphire": "ǝɹıɥddɐS", - "material.gtceu.sapphire_slurry": "ʎɹɹnןS ǝɹıɥddɐS", - "material.gtceu.scandium": "ɯnıpuɐɔS", - "material.gtceu.scheelite": "ǝʇıןǝǝɥɔS", - "material.gtceu.sculk": "ʞןnɔS", - "material.gtceu.seaborgium": "ɯnıbɹoqɐǝS", - "material.gtceu.seed_oil": "ןıO pǝǝS", - "material.gtceu.selenium": "ɯnıuǝןǝS", - "material.gtceu.severely_hydro_cracked_gas": "sɐ⅁ pǝʞɔɐɹƆ-oɹpʎH ʎןǝɹǝʌǝS", - "material.gtceu.severely_hydro_cracked_heavy_fuel": "ןǝnℲ ʎʌɐǝH pǝʞɔɐɹƆ-oɹpʎH ʎןǝɹǝʌǝS", - "material.gtceu.severely_hydro_cracked_light_fuel": "ןǝnℲ ʇɥbıꞀ pǝʞɔɐɹƆ-oɹpʎH ʎןǝɹǝʌǝS", - "material.gtceu.severely_hydro_cracked_naphtha": "ɐɥʇɥdɐN pǝʞɔɐɹƆ-oɹpʎH ʎןǝɹǝʌǝS", - "material.gtceu.severely_steam_cracked_gas": "sɐ⅁ pǝʞɔɐɹƆ-ɯɐǝʇS ʎןǝɹǝʌǝS", - "material.gtceu.severely_steam_cracked_heavy_fuel": "ןǝnℲ ʎʌɐǝH pǝʞɔɐɹƆ-ɯɐǝʇS ʎןǝɹǝʌǝS", - "material.gtceu.severely_steam_cracked_light_fuel": "ןǝnℲ ʇɥbıꞀ pǝʞɔɐɹƆ-ɯɐǝʇS ʎןǝɹǝʌǝS", - "material.gtceu.severely_steam_cracked_naphtha": "ɐɥʇɥdɐN pǝʞɔɐɹƆ-ɯɐǝʇS ʎןǝɹǝʌǝS", - "material.gtceu.silicon": "uoɔıןıS", - "material.gtceu.silicon_dioxide": "ǝpıxoıᗡ uoɔıןıS", - "material.gtceu.silicone_rubber": "ɹǝqqnᴚ ǝuoɔıןıS", - "material.gtceu.silver": "ɹǝʌןıS", - "material.gtceu.soapstone": "ǝuoʇsdɐoS", - "material.gtceu.soda_ash": "ɥsⱯ ɐpoS", - "material.gtceu.sodalite": "ǝʇıןɐpoS", - "material.gtceu.sodium": "ɯnıpoS", - "material.gtceu.sodium_bicarbonate": "ǝʇɐuoqɹɐɔıᗺ ɯnıpoS", - "material.gtceu.sodium_bisulfate": "ǝʇɐɟןnsıᗺ ɯnıpoS", - "material.gtceu.sodium_hydroxide": "ǝpıxoɹpʎH ɯnıpoS", - "material.gtceu.sodium_nitrite": "ǝʇıɹʇıN ɯnıpoS", - "material.gtceu.sodium_persulfate": "ǝʇɐɟןnsɹǝԀ ɯnıpoS", - "material.gtceu.sodium_potassium": "ɯnıssɐʇoԀ ɯnıpoS", - "material.gtceu.sodium_sulfide": "ǝpıɟןnS ɯnıpoS", - "material.gtceu.soldering_alloy": "ʎoןןⱯ buıɹǝpןoS", - "material.gtceu.spessartine": "ǝuıʇɹɐssǝdS", - "material.gtceu.sphalerite": "ǝʇıɹǝןɐɥdS", - "material.gtceu.spodumene": "ǝuǝɯnpodS", - "material.gtceu.stainless_steel": "ןǝǝʇS ssǝןuıɐʇS", - "material.gtceu.steam": "ɯɐǝʇS", - "material.gtceu.steam_cracked_butadiene": "ǝuǝıpɐʇnᗺ pǝʞɔɐɹƆ-ɯɐǝʇS", - "material.gtceu.steam_cracked_butane": "ǝuɐʇnᗺ pǝʞɔɐɹƆ-ɯɐǝʇS", - "material.gtceu.steam_cracked_butene": "ǝuǝʇnᗺ pǝʞɔɐɹƆ-ɯɐǝʇS", - "material.gtceu.steam_cracked_ethane": "ǝuɐɥʇƎ pǝʞɔɐɹƆ-ɯɐǝʇS", - "material.gtceu.steam_cracked_ethylene": "ǝuǝןʎɥʇƎ pǝʞɔɐɹƆ-ɯɐǝʇS", - "material.gtceu.steam_cracked_propane": "ǝuɐdoɹԀ pǝʞɔɐɹƆ-ɯɐǝʇS", - "material.gtceu.steam_cracked_propene": "ǝuǝdoɹԀ pǝʞɔɐɹƆ-ɯɐǝʇS", - "material.gtceu.steel": "ןǝǝʇS", - "material.gtceu.stellite_100": "00Ɩ-ǝʇıןןǝʇS", - "material.gtceu.sterilized_growth_medium": "ɯnıpǝW ɥʇʍoɹ⅁ pǝzıןıɹǝʇS", - "material.gtceu.sterling_silver": "ɹǝʌןıS buıןɹǝʇS", - "material.gtceu.stibnite": "ǝʇıuqıʇS", - "material.gtceu.stone": "ǝuoʇS", - "material.gtceu.strontium": "ɯnıʇuoɹʇS", - "material.gtceu.styrene": "ǝuǝɹʎʇS", - "material.gtceu.styrene_butadiene_rubber": "ɹǝqqnᴚ ǝuǝıpɐʇnᗺ ǝuǝɹʎʇS", - "material.gtceu.sugar": "ɹɐbnS", - "material.gtceu.sulfur": "ɹnɟןnS", - "material.gtceu.sulfur_dioxide": "ǝpıxoıᗡ ɹnɟןnS", - "material.gtceu.sulfur_trioxide": "ǝpıxoıɹ⟘ ɹnɟןnS", - "material.gtceu.sulfuric_acid": "pıɔⱯ ɔıɹnɟןnS", - "material.gtceu.sulfuric_copper_solution": "uoıʇnןoS ɹǝddoƆ ɔıɹnɟןnS", - "material.gtceu.sulfuric_gas": "sɐ⅁ ɔıɹnɟןnS", - "material.gtceu.sulfuric_heavy_fuel": "ןǝnℲ ʎʌɐǝH ɔıɹnɟןnS", - "material.gtceu.sulfuric_light_fuel": "ןǝnℲ ʇɥbıꞀ ɔıɹnɟןnS", - "material.gtceu.sulfuric_naphtha": "ɐɥʇɥdɐN ɔıɹnɟןnS", - "material.gtceu.sulfuric_nickel_solution": "uoıʇnןoS ןǝʞɔıN ɔıɹnɟןnS", - "material.gtceu.talc": "ɔןɐ⟘", - "material.gtceu.tantalite": "ǝʇıןɐʇuɐ⟘", - "material.gtceu.tantalum": "ɯnןɐʇuɐ⟘", - "material.gtceu.tantalum_carbide": "ǝpıqɹɐƆ ɯnןɐʇuɐ⟘", - "material.gtceu.technetium": "ɯnıʇǝuɥɔǝ⟘", - "material.gtceu.tellurium": "ɯnıɹnןןǝ⟘", - "material.gtceu.tennessine": "ǝuıssǝuuǝ⟘", - "material.gtceu.terbium": "ɯnıqɹǝ⟘", - "material.gtceu.tetrafluoroethylene": "ǝuǝןʎɥʇǝoɹonןɟɐɹʇǝ⟘", - "material.gtceu.tetrahedrite": "ǝʇıɹpǝɥɐɹʇǝ⟘", - "material.gtceu.tetranitromethane": "ǝuɐɥʇǝɯoɹʇıuɐɹʇǝ⟘", - "material.gtceu.thallium": "ɯnıןןɐɥ⟘", - "material.gtceu.thorium": "ɯnıɹoɥ⟘", - "material.gtceu.thulium": "ɯnıןnɥ⟘", - "material.gtceu.tin": "uı⟘", - "material.gtceu.tin_alloy": "ʎoןןⱯ uı⟘", - "material.gtceu.titanium": "ɯnıuɐʇı⟘", - "material.gtceu.titanium_carbide": "ǝpıqɹɐƆ ɯnıuɐʇı⟘", - "material.gtceu.titanium_tetrachloride": "ǝpıɹoןɥɔɐɹʇǝ⟘ ɯnıuɐʇı⟘", - "material.gtceu.titanium_trifluoride": "ǝpıɹonןɟıɹ⟘ ɯnıuɐʇı⟘", - "material.gtceu.titanium_tungsten_carbide": "ǝpıqɹɐƆ uǝʇsbun⟘ ɯnıuɐʇı⟘", - "material.gtceu.toluene": "ǝuǝnןo⟘", - "material.gtceu.topaz": "zɐdo⟘", - "material.gtceu.treated_wood": "pooM pǝʇɐǝɹ⟘", - "material.gtceu.tricalcium_phosphate": "ǝʇɐɥdsoɥԀ ɯnıɔןɐɔıɹ⟘", - "material.gtceu.trinium": "ɯnıuıɹ⟘", - "material.gtceu.trinium_sulfide": "ǝpıɟןnS ɯnıuıɹ⟘", - "material.gtceu.tritanium": "ɯnıuɐʇıɹ⟘", - "material.gtceu.tritium": "ɯnıʇıɹ⟘", - "material.gtceu.trona": "ɐuoɹ⟘", - "material.gtceu.tuff": "ɟɟn⟘", - "material.gtceu.tungstate": "ǝʇɐʇsbun⟘", - "material.gtceu.tungsten": "uǝʇsbun⟘", - "material.gtceu.tungsten_carbide": "ǝpıqɹɐƆ uǝʇsbun⟘", - "material.gtceu.tungsten_steel": "ןǝǝʇsuǝʇsbun⟘", - "material.gtceu.tungstic_acid": "pıɔⱯ ɔıʇsbun⟘", - "material.gtceu.ultimet": "ʇǝɯıʇן∩", - "material.gtceu.uraninite": "ǝʇıuıuɐɹ∩", - "material.gtceu.uranium": "ɯnıuɐɹ∩", - "material.gtceu.uranium_235": "ϛƐᄅ ɯnıuɐɹ∩", - "material.gtceu.uranium_hexafluoride": "ǝpıɹonןɟɐxǝH ɯnıuɐɹ∩", - "material.gtceu.uranium_rhodium_dinaquadide": "ǝpıpɐnbɐuıᗡ ɯnıpoɥᴚ ɯnıuɐɹ∩", - "material.gtceu.uranium_triplatinum": "ɯnuıʇɐןdıɹ⟘ ɯnıuɐɹ∩", - "material.gtceu.uu_matter": "ɹǝʇʇɐW-∩∩", - "material.gtceu.uvarovite": "ǝʇıʌoɹɐʌ∩", - "material.gtceu.vanadium": "ɯnıpɐuɐΛ", - "material.gtceu.vanadium_gallium": "ɯnıןןɐ⅁ ɯnıpɐuɐΛ", - "material.gtceu.vanadium_magnetite": "ǝʇıʇǝubɐW ɯnıpɐuɐΛ", - "material.gtceu.vanadium_steel": "ןǝǝʇS ɯnıpɐuɐΛ", - "material.gtceu.vinyl_acetate": "ǝʇɐʇǝɔⱯ ןʎuıΛ", - "material.gtceu.vinyl_chloride": "ǝpıɹoןɥƆ ןʎuıΛ", - "material.gtceu.water": "ɹǝʇɐM", - "material.gtceu.watertight_steel": "ןǝǝʇS ʇɥbıʇɹǝʇɐM", - "material.gtceu.wax": "xɐM", - "material.gtceu.wheat": "ʇɐǝɥM", - "material.gtceu.white_dye": "ǝʎᗡ ǝʇıɥM", - "material.gtceu.wood": "pooM", - "material.gtceu.wood_gas": "sɐ⅁ pooM", - "material.gtceu.wood_tar": "ɹɐ⟘ pooM", - "material.gtceu.wood_vinegar": "ɹɐbǝuıΛ pooM", - "material.gtceu.wrought_iron": "uoɹI ʇɥbnoɹM", - "material.gtceu.wulfenite": "ǝʇıuǝɟןnM", - "material.gtceu.xenon": "uouǝX", - "material.gtceu.yellow_dye": "ǝʎᗡ ʍoןןǝʎ", - "material.gtceu.yellow_garnet": "ʇǝuɹɐ⅁ ʍoןןǝʎ", - "material.gtceu.yellow_limonite": "ǝʇıuoɯıꞀ", - "material.gtceu.ytterbium": "ɯnıqɹǝʇʇʎ", - "material.gtceu.yttrium": "ɯnıɹʇʇʎ", - "material.gtceu.yttrium_barium_cuprate": "ǝʇɐɹdnƆ ɯnıɹɐᗺ ɯnıɹʇʇʎ", - "material.gtceu.zeolite": "ǝʇıןoǝZ", - "material.gtceu.zeron_100": "00Ɩ-uoɹǝZ", - "material.gtceu.zinc": "ɔuıZ", - "material.gtceu.zinc_sulfide": "ǝpıɟןnS ɔuıZ", - "material.gtceu.zincite": "ǝʇıɔuıZ", - "material.gtceu.zirconium": "ɯnıuoɔɹıZ", - "medical_condition.gtceu.arsenicosis": "sısoɔıuǝsɹⱯq§", - "medical_condition.gtceu.asbestosis": "sısoʇsǝqsⱯp§", - "medical_condition.gtceu.carbon_monoxide_poisoning": "buıuosıoԀ ǝpıxouoW uoqɹɐƆㄥ§", - "medical_condition.gtceu.carcinogen": "ɔıuǝbouıɔɹɐƆǝ§", - "medical_condition.gtceu.carcinogen.affected": "ɹǝɔuɐƆǝ§", - "medical_condition.gtceu.chemical_burns": "suɹnq ןɐɔıɯǝɥƆϛ§", - "medical_condition.gtceu.irritant": "ʇuɐʇıɹɹI9§", - "medical_condition.gtceu.irritant.affected": "uoıʇɐʇıɹɹI9§", - "medical_condition.gtceu.methanol_poisoning": "buıuosıoԀ ןouɐɥʇǝW9§", - "medical_condition.gtceu.nausea": "buıʇɐǝsnɐNƐ§", - "medical_condition.gtceu.nausea.affected": "ɐǝsnɐNƐ§", - "medical_condition.gtceu.none": "snoɹǝbuɐᗡ ʇoNᄅ§", - "medical_condition.gtceu.none.affected": "¿buıɥʇoNᄅ§", - "medical_condition.gtceu.poison": "snouosıoԀᄅ§", - "medical_condition.gtceu.poison.affected": "buıuosıoԀᄅ§", - "medical_condition.gtceu.weak_poison": "snouosıod ʎןʞɐǝMɐ§", - "medical_condition.gtceu.weak_poison.affected": "buıuosıod ɹouıWɐ§", - "message.gtceu.new_veins.amount": "¡suıǝʌ ʍǝu %d pǝʇɔǝdsoɹԀ", - "message.gtceu.new_veins.name": "¡%s pǝʇɔǝdsoɹԀ", - "metaarmor.energy_share.disable": "pǝןqɐsıp buıbɹɐɥɔ sʇǝbpɐ⅁ :ʎןddnS ʎbɹǝuƎ", - "metaarmor.energy_share.enable": "pǝןqɐuǝ buıbɹɐɥɔ sʇǝbpɐ⅁ :ʎןddnS ʎbɹǝuƎ", - "metaarmor.energy_share.error": "¡buıbɹɐɥɔ sʇǝbpɐb ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ʎןddnS ʎbɹǝuƎ", - "metaarmor.energy_share.tooltip": "%s :ǝpoɯ ʎןddnS", - "metaarmor.energy_share.tooltip.guide": "ɯǝʇı buıpןoɥ uǝɥʍ ʞɔıןɔ ʇɥbıɹ-ʇɟıɥs ǝpoɯ ǝbuɐɥɔ o⟘", - "metaarmor.hud.energy_lvl": "%s :ןǝʌǝꞀ ʎbɹǝuƎ", - "metaarmor.hud.engine_enabled": "%s :pǝןqɐuƎ ǝuıbuƎ", - "metaarmor.hud.fuel_lvl": "%s :ןǝʌǝꞀ ןǝnℲ", - "metaarmor.hud.gravi_engine": "%s :ǝuıbuƎıʌɐɹ⅁", - "metaarmor.hud.hover_mode": "%s :ǝpoW ɹǝʌoH", - "metaarmor.hud.status.disabled": "ℲℲOɔ§", - "metaarmor.hud.status.enabled": "NOɐ§", - "metaarmor.jetpack.emergency_hover_mode": "¡pǝןqɐuƎ ǝpoW ɹǝʌoH ʎɔuǝbɹǝɯƎ", - "metaarmor.jetpack.flight.disable": "pǝןqɐsıᗡ ʇɥbıןℲ :ʞɔɐdʇǝſ", - "metaarmor.jetpack.flight.enable": "pǝןqɐuƎ ʇɥbıןℲ :ʞɔɐdʇǝſ", - "metaarmor.jetpack.hover.disable": "pǝןqɐsıᗡ ǝpoW ɹǝʌoH :ʞɔɐdʇǝſ", - "metaarmor.jetpack.hover.enable": "pǝןqɐuƎ ǝpoW ɹǝʌoH :ʞɔɐdʇǝſ", - "metaarmor.message.nightvision.disabled": "ɟɟOɔ§ :uoısıΛʇɥbıNq§", - "metaarmor.message.nightvision.enabled": "uOɐ§ :uoısıΛʇɥbıNq§", - "metaarmor.message.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§", - "metaarmor.message.step_assist.disabled": "ɟɟOɔ§ :ʇsıssⱯ-dǝʇSq§", - "metaarmor.message.step_assist.enabled": "uOɐ§ :ʇsıssⱯ-dǝʇSq§", - "metaarmor.nms.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıN :ǝʇınS ™ǝןɔsnWouɐN", - "metaarmor.nms.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıN :ǝʇınS ™ǝןɔsnWouɐN", - "metaarmor.nms.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", - "metaarmor.nms.share.disable": "pǝןqɐsıᗡ buıbɹɐɥƆ :ǝʇınS ™ǝןɔsnWouɐN", - "metaarmor.nms.share.enable": "pǝןqɐuƎ buıbɹɐɥƆ :ǝʇınS ™ǝןɔsnWouɐN", - "metaarmor.nms.share.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", - "metaarmor.nms.step_assist.disabled": "pǝןqɐsıᗡ ʇsıssⱯdǝʇS :ǝʇınS ™ǝןɔsnWouɐN", - "metaarmor.nms.step_assist.enabled": "pǝןqɐuƎ ʇsıssⱯdǝʇS :ǝʇınS ™ǝןɔsnWouɐN", - "metaarmor.qts.boosted_jump.disabled": "pǝןqɐsıᗡ ʇsooᗺ dɯnſ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "metaarmor.qts.boosted_jump.enabled": "pǝןqɐuƎ ʇsooᗺ dɯnſ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "metaarmor.qts.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıN :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "metaarmor.qts.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıN :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "metaarmor.qts.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "metaarmor.qts.share.disable": "pǝןqɐsıᗡ buıbɹɐɥƆ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "metaarmor.qts.share.enable": "pǝןqɐuƎ buıbɹɐɥƆ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "metaarmor.qts.share.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "metaarmor.qts.step_assist.disabled": "pǝןqɐsıᗡ ʇsıssⱯdǝʇS :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "metaarmor.qts.step_assist.enabled": "pǝןqɐuƎ ʇsıssⱯdǝʇS :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", - "metaarmor.tooltip.autoeat": "ʎɹoʇuǝʌuI ɯoɹɟ pooℲ buıs∩ ʎq ɹɐᗺ pooℲ sǝɥsıuǝןdǝᴚ", - "metaarmor.tooltip.breath": "ɹɐᗺ ɥʇɐǝɹᗺ ɹǝʇɐʍɹǝpu∩ sǝɥsıuǝןdǝᴚ", - "metaarmor.tooltip.burning": "buıuɹnᗺ sǝıɟıןןnN", - "metaarmor.tooltip.falldamage": "ǝbɐɯɐᗡ ןןɐℲ sǝıɟıןןnN", - "metaarmor.tooltip.freezing": "buızǝǝɹℲ sʇuǝʌǝɹԀ", - "metaarmor.tooltip.jump": "ǝɔuɐʇsıᗡ puɐ ʇɥbıǝH dɯnſ sǝsɐǝɹɔuI", - "metaarmor.tooltip.potions": "sʇɔǝɟɟƎ ןnɟɯɹɐH sǝıɟıןןnN", - "metaarmor.tooltip.speed": "pǝǝdS buıuunᴚ sǝsɐǝɹɔuI", - "metaarmor.tooltip.stepassist": "ʇsıssⱯ-dǝʇS sǝpıʌoɹԀ", - "metaitem.behavior.mode_switch.current_mode": "%s :ǝpoW", - "metaitem.behavior.mode_switch.mode_switched": "%s :oʇ ʇǝS ǝpoWǝ§", - "metaitem.behavior.mode_switch.tooltip": "ǝpoɯ ɥɔʇıʍs oʇ buıʞɐǝus ǝןıɥʍ ǝs∩", - "metaitem.clipboard.tooltip": "ǝʌoɯǝɹ oʇ ʞɔıןƆ-ʇɥbıᴚ-ʇɟıɥS puɐ 'ǝɔɐןd oʇ ןןɐM uo ʞɔıןɔ-ʇɥbıᴚ ˙)ʇuǝɯnɹʇsuI buıʇıɹʍ ʎuɐ ʇnoɥʇıʍ( uo uǝʇʇıɹʍ ǝq uɐƆ", - "metaitem.cover.digital.mode.energy.disabled": "ǝpoW ʎbɹǝuƎ ǝןqɐuǝ oʇ ʞɔıןƆ", - "metaitem.cover.digital.mode.energy.enabled": "pǝןqɐuǝ ǝpoW ʎbɹǝuƎ", - "metaitem.cover.digital.mode.fluid.disabled": "ǝpoW pınןℲ ǝןqɐuǝ oʇ ʞɔıןƆ", - "metaitem.cover.digital.mode.fluid.enabled": "pǝןqɐuǝ ǝpoW pınןℲ", - "metaitem.cover.digital.mode.item.disabled": "ǝpoW ɯǝʇI ǝןqɐuǝ oʇ ʞɔıןƆ", - "metaitem.cover.digital.mode.item.enabled": "pǝןqɐuǝ ǝpoW ɯǝʇI", - "metaitem.cover.digital.mode.machine.disabled": "ǝpoW ǝuıɥɔɐW ǝןqɐuǝ oʇ ʞɔıןƆ", - "metaitem.cover.digital.mode.machine.enabled": "pǝןqɐuǝ ǝpoW ǝuıɥɔɐW", - "metaitem.cover.digital.mode.proxy.disabled": "ǝpoW ʎxoɹԀ ǝןqɐuǝ oʇ ʞɔıןƆ", - "metaitem.cover.digital.mode.proxy.enabled": "pǝןqɐuǝ ǝpoW ʎxoɹԀ", - "metaitem.cover.digital.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ㄥ§ɹoʇıuoW ןɐɹʇuǝƆɟ§ ǝɥʇ oʇ ㄥ§sǝןqɐƆ ɹǝʍoԀɟ§ ɹǝʌo sǝuıɥɔɐɯ sʇɔǝuuoƆ", - "metaitem.cover.digital.wireless.tooltip.0": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ㄥ§ɹoʇıuoW ןɐɹʇuǝƆɟ§ ǝɥʇ oʇ sǝuıɥɔɐɯ sʇɔǝuuoɔ ㄥ§ʎןssǝןǝɹıMɟ§", - "metaitem.cover.digital.wireless.tooltip.1": "˙ʇı oʇ puıq ʎןǝʇoɯǝɹ oʇ ㄥ§ɹoʇıuoW ןɐɹʇuǝƆɟ§ ǝɥʇ uo ㄥ§ʞɔıןƆ ʇɥbıᴚɟ§", - "metaitem.cover.digital.wireless.tooltip.2": "˙buıpuıq ʇuǝɹɹnɔ ǝɥʇ ǝʌoɯǝɹ oʇ ㄥ§ʞɔıןƆ ʇɥbıᴚ ʞɐǝuSɟ§", - "metaitem.cover.digital.wireless.tooltip.3": "%sɟ§ :buıpuıᗺɐ§", - "metaitem.crushed.tooltip.purify": "ǝɹO pǝıɟıɹnԀ ʇǝb oʇ uoɹpןnɐƆ ɐ ʞɔıןɔ ʇɥbıᴚ", - "metaitem.debug_scanner.tooltip": "ɹǝpɹoɔıɹ⟘", - "metaitem.dust.tooltip.purify": "ʇsnᗡ uɐǝןɔ ʇǝb oʇ uoɹpןnɐƆ ɐ ʞɔıןɔ ʇɥbıᴚ", - "metaitem.electric.discharge_mode.disabled": "pǝןqɐsıᗡ ǝpoW ǝbɹɐɥɔsıᗡǝ§", - "metaitem.electric.discharge_mode.enabled": "pǝןqɐuƎ ǝpoW ǝbɹɐɥɔsıᗡǝ§", - "metaitem.electric.discharge_mode.tooltip": "ǝpoɯ ǝbɹɐɥɔsıp ǝןbboʇ oʇ buıʞɐǝus ǝןıɥʍ ǝs∩", - "metaitem.generic.electric_item.stored": ")%s( ∩Ǝ %d/%d", - "metaitem.generic.electric_item.tooltip": "%s ɹǝı⟘ - ∩Ǝ %d/%d", - "metaitem.generic.fluid_container.tooltip": "%s Ꞁ%d/%d", - "metaitem.int_circuit.configuration": "%d :uoıʇɐɹnbıɟuoƆ", - "metaitem.liquid_fuel_jetpack.tooltip": "ʇsnɹɥ⟘ ɹoɟ sןǝnℲ ɹoʇɐɹǝuǝ⅁ uoıʇsnqɯoƆ sǝs∩", - "metaitem.machine_configuration.mode": "%s ɹ§:ǝpoW uoıʇɐɹnbıɟuoƆɐ§", - "metaitem.plugin.proxy.tooltips.1": ")uǝǝɹɔs ǝɥʇ uı ǝpoɯ ʎxoɹd oʇ ʇsnظpɐ ǝsɐǝןԀ(", - "metaitem.plugin.tooltips.1": "˙ʎʇıןɐuoıʇɔunɟ ǝɹoɯ ɹoɟ uǝǝɹɔs ǝɥʇ oʇ pǝppɐ ǝq uɐɔ suıbnןԀ", - "metaitem.prospector.mode.bedrock_ore": "ɹ§ǝpoW uoıʇɔǝdsoɹԀ ǝɹO ʞɔoɹpǝᗺq§", - "metaitem.prospector.mode.fluid": "ɹ§ǝpoW uoıʇɔǝdsoɹԀ pınןℲq§", - "metaitem.prospector.mode.ores": "ɹ§ǝpoW uoıʇɔǝdsoɹԀ ǝɹOɐ§", - "metaitem.prospector.tooltip.modes": ":sǝpoW ǝןqɐןıɐʌⱯ", - "metaitem.prospector.tooltip.radius": "snıpɐᴚ ʞunɥƆ %s ɐ uı ǝbuɐɹ suɐɔS", - "metaitem.record.sus.tooltip": "dıɹᗡ s∩ buoɯⱯ - zuoǝꞀㄥ§", - "metaitem.terminal.tooltip": "ʞɹoʍ poob ǝʞɐɯ sןooʇ dɹɐɥS", - "metaitem.terminal.tooltip.creative": "ǝpoW ǝʌıʇɐǝɹƆq§", - "metaitem.terminal.tooltip.hardware": "%d :ǝɹɐʍpɹɐHɐ§", - "metaitem.tool.tooltip.durability": "%d / %dɐ§ :ʎʇıןıqɐɹnᗡɟ§", - "metaitem.tool.tooltip.primary_material": "%sǝ§ :ןɐıɹǝʇɐWɟ§", - "metaitem.tool.tooltip.rotor.efficiency": "%d%%6§ :ʎɔuǝıɔıɟɟƎ ǝuıqɹn⟘", - "metaitem.tool.tooltip.rotor.power": "%d%%6§ :ɹǝʍoԀ ǝuıqɹn⟘", - "metaitem.tricorder_scanner.tooltip": "ɹǝpɹoɔıɹ⟘", - "monitor.gui.title.argb": ":ᗺ⅁ᴚⱯ", - "monitor.gui.title.back": "ʞɔɐᗺ", - "monitor.gui.title.config": "bıɟuoƆ", - "monitor.gui.title.plugin": ":uıbnןԀ", - "monitor.gui.title.scale": ":ǝןɐɔS", - "monitor.gui.title.slot": ":ʇoןS", - "ore.spawnlocation.name": "uoıʇɐɯɹoɟuI uʍɐdS ǝɹO", - "recipe.capability.eu.name": "ʎbɹǝuƎ nƎƆ⟘⅁", - "recipe.capability.fluid.name": "pınןℲ", - "recipe.capability.item.name": "ɯǝʇI", - "recipe.condition.adjacent_block.tooltip": "punoɹɐ sʞɔoןᗺ", - "recipe.condition.adjacent_fluid.tooltip": "punoɹɐ sʞɔoןq pınןℲ", - "recipe.condition.biome.tooltip": "%s :ǝɯoıᗺ", - "recipe.condition.daytime.day.tooltip": "ʞɹoʍ oʇ ǝɯıʇ ʎɐp sǝɹınbǝᴚ", - "recipe.condition.daytime.night.tooltip": "ʞɹoʍ oʇ ǝɯıʇ ʇɥbıu sǝɹınbǝᴚ", - "recipe.condition.dimension.tooltip": "%s :uoısuǝɯıᗡ", - "recipe.condition.dimension_marker.tooltip": ":uoısuǝɯıᗡ", - "recipe.condition.eu_to_start.tooltip": "%d%s :ʇɹɐʇS oʇ ∩Ǝ", - "recipe.condition.gamestage.locked_stage": "%s :ǝbɐʇs ʇɐ pǝʞɔoꞀ", - "recipe.condition.gamestage.unlocked_stage": "%s :ǝbɐʇs ʇɐ pǝʞɔoןu∩", - "recipe.condition.pos_y.tooltip": "%d =< ʎ =< %d :ןǝʌǝꞀ ʎ", - "recipe.condition.quest.completed.tooltip": "pǝʇǝןdɯoɔ %s sǝɹınbǝᴚ", - "recipe.condition.quest.not_completed.tooltip": "pǝʇǝןdɯoɔ ʇou %s sǝɹınbǝᴚ", - "recipe.condition.rain.tooltip": "%d :ןǝʌǝꞀ uıɐᴚ", - "recipe.condition.steam_vent.tooltip": "ʇuǝʌ ɯɐǝʇs uɐǝןƆ", - "recipe.condition.thunder.tooltip": "%d :ןǝʌǝꞀ ɹǝpunɥ⟘", - "symptom.gtceu.air_supply_debuff": "ʎʇıɔɐdɐɔ bunן pǝɹǝʍoꞀ", - "symptom.gtceu.blindness": "ssǝupuıןᗺ", - "symptom.gtceu.darkness": "ssǝuʞɹɐᗡ", - "symptom.gtceu.death": "ɥʇɐǝᗡ", - "symptom.gtceu.health_debuff": "ɥʇןɐǝɥ ɯnɯıxɐɯ pǝɹǝʍoꞀ", - "symptom.gtceu.hunger": "ǝʇıʇǝddɐ pǝsɐǝɹɔuI", - "symptom.gtceu.mining_fatigue": "ǝnbıʇɐℲ", - "symptom.gtceu.nausea": "ɐǝsnɐN", - "symptom.gtceu.poisoning": "buıuosıoԀ", - "symptom.gtceu.random_damage": "ǝbɐɯɐp ןɐuoısɐɔɔO", - "symptom.gtceu.slowness": "ssǝuʍoןS", - "symptom.gtceu.weak_poisoning": "buıuosıod ʞɐǝM", - "symptom.gtceu.weakness": "ssǝuʞɐǝM", - "symptom.gtceu.wither": "sısoɹɔǝN", - "tagprefix.andesite": "ǝɹO %s ǝʇısǝpuⱯ", - "tagprefix.basalt": "ǝɹO %s ʇןɐsɐᗺ", - "tagprefix.blackstone": "ǝɹO %s ǝuoʇsʞɔɐןᗺ", - "tagprefix.block": "%s ɟo ʞɔoןᗺ", - "tagprefix.bolt": "ʇןoᗺ %s", - "tagprefix.buzz_saw_blade": "ǝpɐןᗺ ʍɐszznᗺ %s", - "tagprefix.cable_gt_double": "ǝןqɐƆ %s xᄅ", - "tagprefix.cable_gt_hex": "ǝןqɐƆ %s x9Ɩ", - "tagprefix.cable_gt_octal": "ǝןqɐƆ %s x8", - "tagprefix.cable_gt_quadruple": "ǝןqɐƆ %s xㄣ", - "tagprefix.cable_gt_single": "ǝןqɐƆ %s xƖ", - "tagprefix.chainsaw_head": "pɐǝH ʍɐsuıɐɥƆ %s", - "tagprefix.chipped_gem": "%s pǝddıɥƆ", - "tagprefix.crushed_ore": "ǝɹO %s pǝɥsnɹƆ", - "tagprefix.deepslate": "ǝɹO %s ǝʇɐןsdǝǝᗡ", - "tagprefix.dense_plate": "ǝʇɐןԀ %s ǝsuǝᗡ", - "tagprefix.diorite": "ǝɹO %s ǝʇıɹoıᗡ", - "tagprefix.door": "ɹooᗡ %s", - "tagprefix.double_plate": "ǝʇɐןԀ %s ǝןqnoᗡ", - "tagprefix.drill_head": "pɐǝH ןןıɹᗡ %s", - "tagprefix.dust": "ʇsnᗡ %s", - "tagprefix.dye": "ǝʎᗡ %s", - "tagprefix.endstone": "ǝɹO %s puƎ", - "tagprefix.exquisite_gem": "%s ǝʇısınbxƎ", - "tagprefix.fence": "ǝɔuǝℲ %s", - "tagprefix.fence_gate": "ǝʇɐ⅁ ǝɔuǝℲ %s", - "tagprefix.fine_wire": "ǝɹıM %s ǝuıℲ", - "tagprefix.flawed_gem": "%s pǝʍɐןℲ", - "tagprefix.flawless_gem": "%s ssǝןʍɐןℲ", - "tagprefix.foil": "ןıoℲ %s", - "tagprefix.frame": "ǝɯɐɹℲ %s", - "tagprefix.gear": "ɹɐǝ⅁ %s", - "tagprefix.gem": "%s", - "tagprefix.granite": "ǝɹO %s ǝʇıuɐɹ⅁", - "tagprefix.gravel": "ǝɹO %s ןǝʌɐɹ⅁", - "tagprefix.hot_ingot": "ʇobuI %s ʇoH", - "tagprefix.impure_dust": "ʇsnᗡ %s ɟo ǝןıԀ ǝɹndɯI", - "tagprefix.ingot": "ʇobuI %s", - "tagprefix.lens": "suǝꞀ %s", - "tagprefix.log": "boꞀ %s", - "tagprefix.long_rod": "poᴚ %s buoꞀ", - "tagprefix.marble": "ǝɹO %s ǝןqɹɐW", - "tagprefix.netherrack": "ǝɹO %s ɹǝɥʇǝN", - "tagprefix.nugget": "ʇǝbbnN %s", - "tagprefix.null": "ןןnN %s", - "tagprefix.pipe_huge_fluid": "ǝdıԀ pınןℲ %s ǝbnH", - "tagprefix.pipe_huge_item": "ǝdıԀ ɯǝʇI %s ǝbnH", - "tagprefix.pipe_huge_restrictive": "ǝdıԀ ɯǝʇI %s ǝʌıʇɔıɹʇsǝᴚ ǝbnH", - "tagprefix.pipe_large_fluid": "ǝdıԀ pınןℲ %s ǝbɹɐꞀ", - "tagprefix.pipe_large_item": "ǝdıԀ ɯǝʇI %s ǝbɹɐꞀ", - "tagprefix.pipe_large_restrictive": "ǝdıԀ ɯǝʇI %s ǝʌıʇɔıɹʇsǝᴚ ǝbɹɐꞀ", - "tagprefix.pipe_nonuple_fluid": "ǝdıԀ pınןℲ %s ǝןdnuoN", - "tagprefix.pipe_normal_fluid": "ǝdıԀ pınןℲ %s ןɐɯɹoN", - "tagprefix.pipe_normal_item": "ǝdıԀ ɯǝʇI %s ןɐɯɹoN", - "tagprefix.pipe_normal_restrictive": "ǝdıԀ ɯǝʇI %s ǝʌıʇɔıɹʇsǝᴚ ןɐɯɹoN", - "tagprefix.pipe_quadruple_fluid": "ǝdıԀ pınןℲ %s ǝןdnɹpɐnὉ", - "tagprefix.pipe_small_fluid": "ǝdıԀ pınןℲ %s ןןɐɯS", - "tagprefix.pipe_small_item": "ǝdıԀ ɯǝʇI %s ןןɐɯS", - "tagprefix.pipe_small_restrictive": "ǝdıԀ ɯǝʇI %s ǝʌıʇɔıɹʇsǝᴚ ןןɐɯS", - "tagprefix.pipe_tiny_fluid": "ǝdıԀ pınןℲ %s ʎuı⟘", - "tagprefix.planks": "sʞuɐןԀ %s", - "tagprefix.plate": "ǝʇɐןԀ %s", - "tagprefix.polymer.dense_plate": "ʇǝǝɥS %s ǝsuǝᗡ", - "tagprefix.polymer.double_plate": "ʇǝǝɥS %s ǝןqnoᗡ", - "tagprefix.polymer.dust": "dןnԀ %s", - "tagprefix.polymer.foil": "ʇǝǝɥS %s uıɥ⟘", - "tagprefix.polymer.ingot": "ʇobuI %s", - "tagprefix.polymer.nugget": "dıɥƆ %s", - "tagprefix.polymer.plate": "ʇǝǝɥS %s", - "tagprefix.polymer.small_dust": "dןnԀ %s ɟo ǝןıԀ ןןɐɯS", - "tagprefix.polymer.tiny_dust": "dןnԀ %s ɟo ǝןıԀ ʎuı⟘", - "tagprefix.pure_dust": "ʇsnᗡ %s ɟo ǝןıԀ pǝıɟıɹnԀ", - "tagprefix.purified_ore": "ǝɹO %s pǝıɟıɹnԀ", - "tagprefix.raw": "%s ʍɐᴚ", - "tagprefix.raw_ore_block": "%s ʍɐᴚ ɟo ʞɔoןᗺ", - "tagprefix.red_granite": "ǝɹO %s ǝʇıuɐɹ⅁ pǝᴚ", - "tagprefix.red_sand": "ǝɹO %s puɐS pǝᴚ", - "tagprefix.refined_ore": "ǝɹO %s pǝuıɟǝᴚ", - "tagprefix.ring": "buıᴚ %s", - "tagprefix.rock": "%s", - "tagprefix.rod": "poᴚ %s", - "tagprefix.rotor": "ɹoʇoᴚ %s", - "tagprefix.round": "punoᴚ %s", - "tagprefix.sand": "ǝɹO %s puɐS", - "tagprefix.screw": "ʍǝɹɔS %s", - "tagprefix.screwdriver_tip": "dı⟘ ɹǝʌıɹpʍǝɹɔS %s", - "tagprefix.slab": "qɐןS %s", - "tagprefix.small_dust": "ʇsnᗡ %s ɟo ǝןıԀ ןןɐɯS", - "tagprefix.small_gear": "ɹɐǝ⅁ %s ןןɐɯS", - "tagprefix.small_spring": "buıɹdS %s ןןɐɯS", - "tagprefix.spring": "buıɹdS %s", - "tagprefix.stairs": "sɹıɐʇS %s", - "tagprefix.stone": "ǝɹO %s", - "tagprefix.surface_rock": "ʞɔoᴚ ǝɔɐɟɹnS %s", - "tagprefix.tiny_dust": "ʇsnᗡ %s ɟo ǝןıԀ ʎuı⟘", - "tagprefix.tuff": "ǝɹO %s ɟɟn⟘", - "tagprefix.turbine_blade": "ǝpɐןᗺ ǝuıqɹn⟘ %s", - "tagprefix.wire_cutter_head": "pɐǝH ɹǝʇʇnƆ ǝɹıM %s", - "tagprefix.wire_gt_double": "ǝɹıM %s xᄅ", - "tagprefix.wire_gt_hex": "ǝɹıM %s x9Ɩ", - "tagprefix.wire_gt_octal": "ǝɹıM %s x8", - "tagprefix.wire_gt_quadruple": "ǝɹıM %s xㄣ", - "tagprefix.wire_gt_single": "ǝɹıM %s xƖ", - "tagprefix.wrench_tip": "dı⟘ ɥɔuǝɹM %s", - "tile.gtceu.brittle_charcoal.name": "ןɐoɔɹɐɥƆ ǝןʇʇıɹᗺ", - "tile.gtceu.brittle_charcoal.tooltip.0": "˙ɹǝʇıubI ǝןıԀ ןɐoɔɹɐɥƆ ǝɥʇ ʎq pǝɔnpoɹԀ", - "tile.gtceu.brittle_charcoal.tooltip.1": "˙ןɐoɔɹɐɥƆ ʇǝb oʇ sıɥʇ ǝuıW", - "tile.gtceu.foam.name": "ɯɐoℲ", - "tile.gtceu.petrified_foam.name": "ɯɐoℲ pǝıɟıɹʇǝԀ", - "tile.gtceu.reinforced_foam.name": "ɯɐoℲ pǝɔɹoɟuıǝᴚ", - "tile.gtceu.reinforced_stone.name": "ǝuoʇS pǝɔɹoɟuıǝᴚ", - "tile.gtceu.seal.name": "ʞɔoןᗺ pǝןɐǝS", - "tooltip.gtceu.antidote.description": "sןıɐʇǝp ʍoɥs oʇ ʇɟıɥS pןoHㄥ§ ǝʇopıʇuⱯɐ§", - "tooltip.gtceu.antidote.description.effect_removed": "sʇɔǝɟɟǝ ,suoıʇıpuoɔ ʇuǝɹɹnɔ ɟo %s%% sǝʌoɯǝᴚ", - "tooltip.gtceu.antidote.description.effect_removed.all": "sʇɔǝɟɟǝ ,suoıʇıpuoɔ ʇuǝɹɹnɔ ɟo ןןɐ sǝʌoɯǝᴚ", - "tooltip.gtceu.antidote.description_shift": ":suoıʇıpuoɔ ǝsǝɥʇ sǝɹnƆɐ§", - "tooltip.gtceu.hazard_trigger": ":ʎq pǝsnɐƆ", - "tooltip.gtceu.hazard_trigger.any": "ʇɔɐʇuoɔ ʎuⱯ", - "tooltip.gtceu.hazard_trigger.inhalation": "uoıʇɐןɐɥuI", - "tooltip.gtceu.hazard_trigger.none": "buıɥʇoN", - "tooltip.gtceu.hazard_trigger.protection": ":ɯoɹɟ sʇɔǝʇoɹԀ", - "tooltip.gtceu.hazard_trigger.skin_contact": "ʇɔɐʇuoɔ uıʞS", - "tooltip.gtceu.medical_condition.description": "sןıɐʇǝp ʍoɥs oʇ ʇɟıɥS pןoHㄥ§ S∩OᗡᴚⱯZⱯHɔ§ן§", - "tooltip.gtceu.medical_condition.description_shift": ":S∩OᗡᴚⱯZⱯHɔ§ן§" -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 67ddba4f02e..aad420b6f6c 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -1,4 +1,53 @@ { + "armor.gtceu.energy_share.disabled": "§cGadget Charging Disabled", + "armor.gtceu.energy_share.enabled": "§aGadget Charging Enabled", + "armor.gtceu.energy_share.error": "§cNot Enough Power for Charging Gadgets!", + "armor.gtceu.energy_share.tooltip": "Supply Mode: %s", + "armor.gtceu.energy_share.tooltip.info": "To change mode, SHIT + R-CLICK when holding item", + "armor.gtceu.hud.energy_level": "Energy Level: %s", + "armor.gtceu.hud.engine_enabled": "Engine: %s", + "armor.gtceu.hud.fuel_level": "Fuel Level: %s", + "armor.gtceu.hud.gravi_engine": "GraviEngine: %s", + "armor.gtceu.hud.hover_mode": "Hover Mode: %s", + "armor.gtceu.hud.status.disabled": "§cOFF", + "armor.gtceu.hud.status.enabled": "§aON", + "armor.gtceu.hud.supply_mode": "Supply Mode: %s", + "armor.gtceu.jetpack.emergency_hover_mode": "§aEmergency Hover Mode Enabled!", + "armor.gtceu.jetpack.flight.disabled": "Jetpack: Flight Disabled", + "armor.gtceu.jetpack.flight.enabled": "Jetpack: §aFlight Enabled", + "armor.gtceu.jetpack.hover.disabled": "Jetpack: Hover Mode Disabled", + "armor.gtceu.jetpack.hover.enabled": "Jetpack: §aHover Mode Enabled", + "armor.gtceu.message.nightvision.disabled": "§7NightVision: §cOff", + "armor.gtceu.message.nightvision.enabled": "§7NightVision: §aOn", + "armor.gtceu.message.nightvision.error": "§cNot enough power!", + "armor.gtceu.nano_muscle_suite.charge.disabled": " NanoMuscle™ Suite: §cCharging Disabled", + "armor.gtceu.nano_muscle_suite.charge.enabled": "NanoMuscle™ Suite: §aCharging Enabled", + "armor.gtceu.nano_muscle_suite.charge.error": "NanoMuscle™ Suite: §cNot enough power for charging!", + "armor.gtceu.nano_muscle_suite.nightvision.disabled": " NanoMuscle™ Suite: §cNightVision Disabled", + "armor.gtceu.nano_muscle_suite.nightvision.enabled": "NanoMuscle™ Suite: §aNightVision Enabled", + "armor.gtceu.nano_muscle_suite.nightvision.error": "NanoMuscle™ Suite: §cNot enough power!", + "armor.gtceu.nano_muscle_suite.step_assist.disabled": "NanoMuscle™ Suite: StepAssist Disabled", + "armor.gtceu.nano_muscle_suite.step_assist.enabled": "NanoMuscle™ Suite: StepAssist Enabled", + "armor.gtceu.quark_tech_suite.boosted_jump.disabled": "QuarkTech™ Suite: Jump Boost Disabled", + "armor.gtceu.quark_tech_suite.boosted_jump.enabled": "QuarkTech™ Suite: Jump Boost Enabled", + "armor.gtceu.quark_tech_suite.charge.disabled": "QuarkTech™ Suite: §cCharging Disabled", + "armor.gtceu.quark_tech_suite.charge.enabled": "QuarkTech™ Suite: §aCharging Enabled", + "armor.gtceu.quark_tech_suite.charge.error": "QuarkTech™ Suite: §cNot enough power for charging!", + "armor.gtceu.quark_tech_suite.nightvision.disabled": "QuarkTech™ Suite: §cNightVision Disabled", + "armor.gtceu.quark_tech_suite.nightvision.enabled": "QuarkTech™ Suite: §aNightVision Enabled", + "armor.gtceu.quark_tech_suite.nightvision.error": "QuarkTech™ Suite: §cNot enough power!", + "armor.gtceu.quark_tech_suite.step_assist.disabled": "QuarkTech™ Suite: StepAssist Disabled", + "armor.gtceu.quark_tech_suite.step_assist.enabled": "QuarkTech™ Suite: StepAssist Enabled", + "armor.gtceu.tooltip.autoeat": "§7Replenishes Food Bar by Using Food from Inventory", + "armor.gtceu.tooltip.breath": "§7Replenishes Underwater Breath Bar", + "armor.gtceu.tooltip.burning": "§7Nullifies Burning", + "armor.gtceu.tooltip.falldamage": "§7Nullifies Fall Damage", + "armor.gtceu.tooltip.freezing": "§7Prevents Freezing", + "armor.gtceu.tooltip.jump": "§7Increases Jump Height and Distance", + "armor.gtceu.tooltip.potions": "§7Nullifies Harmful Effects", + "armor.gtceu.tooltip.speed": "§7Increases Running Speed", + "armor.gtceu.tooltip.step_assist.disabled": "§bStep-Assist: §cOff", + "armor.gtceu.tooltip.step_assist.enabled": "§bStep-Assist: §aOn", "behavior.data_item.data": "- §a%s", "behavior.data_item.title": "§n%s Construction Data:", "behavior.item_magnet.disabled": "§cMagnetic Field Disabled", @@ -105,10 +154,9 @@ "behaviour.setting.tooltip.pipe_connections": "Pipe connections: %s", "behaviour.soft_hammer": "Activates and Deactivates Machines", "behaviour.soft_hammer.disabled": "Working Disabled", - "behaviour.soft_hammer.disabled_cycle": "Working Disabled after current cycle", + "behaviour.soft_hammer.disabled_cycle": "Working disabled after current cycle", "behaviour.soft_hammer.enabled": "Working Enabled", "behaviour.wrench": "Rotates Blocks on Rightclick", - "block.filter_casing.tooltip": "Creates a §aParticle-Free§7 environment", "block.gtceu.acid_hazard_sign_block": "Acid Hazard Sign Block", "block.gtceu.active_transformer": "Active Transformer", "block.gtceu.advanced_computer_casing": "Advanced Computer Casing", @@ -138,6 +186,8 @@ "block.gtceu.blue_studs": "Blue Studs", "block.gtceu.boss_hazard_sign_block": "Boss Hazard Sign Block", "block.gtceu.brittle_charcoal": "Brittle Charcoal", + "block.gtceu.brittle_charcoal.tooltip.0": "Produced by the Charcoal Pile Igniter.", + "block.gtceu.brittle_charcoal.tooltip.1": "Mine this to get Charcoal.", "block.gtceu.bronze_brick_casing": "Bricked Bronze Casing", "block.gtceu.bronze_crate": "Bronze Crate", "block.gtceu.bronze_drum": "Bronze Drum", @@ -302,6 +352,7 @@ "block.gtceu.extreme_combustion_engine": "Extreme Combustion Engine", "block.gtceu.extreme_engine_intake_casing": "Extreme Engine Intake Casing", "block.gtceu.filter_casing": "Filter Casing", + "block.gtceu.filter_casing.tooltip": "Creates a §aParticle-Free§7 environment", "block.gtceu.fire_hazard_sign_block": "Fire Hazard Sign Block", "block.gtceu.firebricks": "Firebricks", "block.gtceu.foam": "Foam", @@ -918,9 +969,6 @@ "block.gtceu.normal_optical_pipe.tooltip": "§7Transmitting §fComputation§7 or §fResearch Data§7", "block.gtceu.object_holder": "Object Holder", "block.gtceu.oil": "Oil", - "block.gtceu.oil_heavy": "Heavy Oil", - "block.gtceu.oil_light": "Light Oil", - "block.gtceu.oil_medium": "Raw Oil", "block.gtceu.opv_1024a_laser_source_hatch": "§9§lOpV§r 1,024§eA§r Laser Source Hatch", "block.gtceu.opv_1024a_laser_target_hatch": "§9§lOpV§r 1,024§eA§r Laser Target Hatch", "block.gtceu.opv_16a_energy_converter": "§9§lOpV§r 16§eA§r Energy Converter", @@ -1077,6 +1125,7 @@ "block.gtceu.rubber_stairs": "Rubber Stairs", "block.gtceu.rubber_trapdoor": "Rubber Trapdoor", "block.gtceu.rubber_wood": "Rubber Wood", + "block.gtceu.seal": "Sealed Block", "block.gtceu.secure_maceration_casing": "Secure Maceration Casing", "block.gtceu.shock_proof_cutting_casing": "Shock Proof Cutting Casing", "block.gtceu.slicing_blades": "Slicing Blades", @@ -1125,12 +1174,13 @@ "block.gtceu.steel_tank_valve": "Steel Tank Valve", "block.gtceu.steel_turbine_casing": "Magnalium Turbine Casing", "block.gtceu.sterilizing_filter_casing": "Sterilizing Filter Casing", + "block.gtceu.sterilizing_filter_casing.tooltip": "Creates a §aSterilized§7 environment", "block.gtceu.stress_proof_casing": "Stress Proof Casing", "block.gtceu.stripped_rubber_log": "Stripped Rubber Log", "block.gtceu.stripped_rubber_wood": "Stripped Rubber Wood", "block.gtceu.sturdy_machine_casing": "Sturdy HSS-E Machine Casing", - "block.gtceu.substation_capacitor.tooltip_empty": "§7For filling space in your Power Substation", - "block.gtceu.substation_capacitor.tooltip_filled": "§cEnergy Capacity: §f%d EU", + "block.gtceu.substation_capacitor.tooltip.empty": "§7For filling space in your Power Substation", + "block.gtceu.substation_capacitor.tooltip.filled": "§cEnergy Capacity: §f%d EU", "block.gtceu.superconducting_coil": "Superconducting Coil Block", "block.gtceu.tempered_glass": "Tempered Glass", "block.gtceu.the_end_marker": "The End", @@ -1609,15 +1659,15 @@ "block.gtceu.white_large_metal_sheet": "White Large Metal Sheet", "block.gtceu.white_metal_sheet": "White Metal Sheet", "block.gtceu.white_studs": "White Studs", - "block.gtceu.wire_coil.tooltip_cracking": "§8Cracking Unit:", - "block.gtceu.wire_coil.tooltip_energy_cracking": " §aEnergy Usage: §f%s%%", - "block.gtceu.wire_coil.tooltip_energy_smelter": " §aEnergy Usage: §f%s EU/t", - "block.gtceu.wire_coil.tooltip_extended_info": "§7Hold SHIFT to show Coil Bonus Info", - "block.gtceu.wire_coil.tooltip_heat": "§cBase Heat Capacity: §f%d K", - "block.gtceu.wire_coil.tooltip_parallel_smelter": " §5Max Parallel: §f%s", - "block.gtceu.wire_coil.tooltip_pyro": "§8Pyrolyse Oven:", - "block.gtceu.wire_coil.tooltip_smelter": "§8Multi Smelter:", - "block.gtceu.wire_coil.tooltip_speed_pyro": " §bProcessing Speed: §f%s%%", + "block.gtceu.wire_coil.tooltip.cracking": "§8Cracking Unit:", + "block.gtceu.wire_coil.tooltip.energy_cracking": " §aEnergy Usage: §f%s%%", + "block.gtceu.wire_coil.tooltip.energy_smelter": " §aEnergy Usage: §f%s EU/t §8per recipe", + "block.gtceu.wire_coil.tooltip.extended_info": "§7Hold SHIFT to show Coil Bonus Info", + "block.gtceu.wire_coil.tooltip.heat": "§cBase Heat Capacity: §f%d K", + "block.gtceu.wire_coil.tooltip.parallel_smelter": " §5Max Parallel: §f%s", + "block.gtceu.wire_coil.tooltip.pyro": "§8Pyrolyse Oven:", + "block.gtceu.wire_coil.tooltip.smelter": "§8Multi Smelter:", + "block.gtceu.wire_coil.tooltip.speed_pyro": " §bProcessing Speed: §f%s%%", "block.gtceu.wood_crate": "Wooden Crate", "block.gtceu.wood_drum": "Wooden Barrel", "block.gtceu.wood_wall": "Wood Wall", @@ -1627,12 +1677,10 @@ "block.gtceu.yellow_lamp": "Yellow Lamp", "block.gtceu.yellow_large_metal_sheet": "Yellow Large Metal Sheet", "block.gtceu.yellow_metal_sheet": "Yellow Metal Sheet", - "block.gtceu.yellow_stripes_block.a": "Yellow Stripes Block", - "block.gtceu.yellow_stripes_block.b": "Yellow Stripes Block", - "block.gtceu.yellow_stripes_block.c": "Yellow Stripes Block", - "block.gtceu.yellow_stripes_block.d": "Yellow Stripes Block", - "block.gtceu.yellow_stripes_block_a": "Yellow Stripes Block A", - "block.gtceu.yellow_stripes_block_b": "Yellow Stripes Block B", + "block.gtceu.yellow_stripes_block_a": "Yellow Stripes Block", + "block.gtceu.yellow_stripes_block_b": "Yellow Stripes Block", + "block.gtceu.yellow_stripes_block_c": "Yellow Stripes Block", + "block.gtceu.yellow_stripes_block_d": "Yellow Stripes Block", "block.gtceu.yellow_studs": "Yellow Studs", "block.gtceu.zpm_1024a_laser_source_hatch": "§cZPM§r 1,024§eA§r Laser Source Hatch", "block.gtceu.zpm_1024a_laser_target_hatch": "§cZPM§r 1,024§eA§r Laser Target Hatch", @@ -1721,11 +1769,9 @@ "block.gtceu.zpm_transformer_4a": "§cZPM Voltage§r Hi-Amp (4x) Transformer", "block.gtceu.zpm_wiremill": "§cElite Wiremill III§r", "block.gtceu.zpm_world_accelerator": "§cElite World Accelerator III§r", - "block.sterilizing_filter_casing.tooltip": "Creates a §aSterilized§7 environment", "block.surface_rock": "%s Surface Rock", "button.gtceu.mark_as_depleted.name": "Mark as Depleted", "button.gtceu.toggle_waypoint.name": "Toggle Waypoint", - "command.gtceu.cape.failure.does_not_exist": "Cape %s does not exist", "command.gtceu.cape.give.failed": "No new capes were unlocked", "command.gtceu.cape.give.success.multiple": "Unlocked %s capes for %s players", "command.gtceu.cape.give.success.single": "Unlocked %s capes for %s", @@ -1755,6 +1801,11 @@ "command.gtceu.place_vein.failure": "Failed to place vein %s at position %s", "command.gtceu.place_vein.success": "Placed vein %s at position %s", "command.gtceu.share_prospection_data.notification": "%s is sharing prospecting data with you!", + "command.gtceu.usage": "Usage: /gtceu ", + "command.gtceu.worldgen.reload.failed": "Worldgen reload failed. Check console for errors.", + "command.gtceu.worldgen.reload.success": "Worldgen successfully reloaded from config.", + "command.gtceu.worldgen.reload.usage": "Usage: /gtceu worldgen reload", + "command.gtceu.worldgen.usage": "Usage: /gtceu worldgen ", "config.gtceu.option.addLoot": "addLoot", "config.gtceu.option.ae2": "ae2", "config.gtceu.option.allowedImageDomains": "allowedImageDomains", @@ -2047,9 +2098,6 @@ "cover.ender_redstone_link.title": "Ender Redstone Link", "cover.filter.blacklist.disabled": "Whitelist", "cover.filter.blacklist.enabled": "Blacklist", - "cover.filter.mode.filter_both": "Filter Insert/Extract", - "cover.filter.mode.filter_extract": "Filter Extract", - "cover.filter.mode.filter_insert": "Filter Insert", "cover.fluid.voiding.advanced.title": "Advanced Fluid Voiding Settings", "cover.fluid.voiding.title": "Fluid Voiding Settings", "cover.fluid_filter.config_amount.0": "Scroll wheel up increases amount, down decreases.", @@ -2068,6 +2116,22 @@ "cover.fluid_regulator.transfer_mode.description.1": "§eSupply Exact§r - in this mode, cover will supply fluids in portions specified in the window underneath this button. If amount of fluids is less than portion size, fluids won't be moved.", "cover.fluid_regulator.transfer_mode.description.2": "§eKeep Exact§r - in this mode, cover will keep specified amount of fluids in the destination inventory, supplying additional amount of fluids if required.", "cover.fluid_regulator.transfer_mode.description.3": "§7Tip: shift click will multiply increase/decrease amounts by 10 and ctrl click will multiply by 100.", + "cover.gtceu.filter.mode.filter_both": "Filter Insert/Extract", + "cover.gtceu.filter.mode.filter_extract": "Filter Extract", + "cover.gtceu.filter.mode.filter_insert": "Filter Insert", + "cover.gtceu.tag_filter.info.0": "§bAccepts complex expressions", + "cover.gtceu.tag_filter.info.1": "§6a & b§r = AND", + "cover.gtceu.tag_filter.info.10": "§bExample: §6*dusts/gold | (gtceu:circuits & !*lv)", + "cover.gtceu.tag_filter.info.11": "This matches all gold dusts or all circuits except LV ones", + "cover.gtceu.tag_filter.info.2": "§6a | b§r = OR", + "cover.gtceu.tag_filter.info.3": "§6a ^ b§r = XOR", + "cover.gtceu.tag_filter.info.4": "§6!a§r = NOT", + "cover.gtceu.tag_filter.info.5": "§6(a)§r for grouping", + "cover.gtceu.tag_filter.info.6": "§6*§r for wildcard", + "cover.gtceu.tag_filter.info.7": "§6$§r for untagged", + "cover.gtceu.tag_filter.info.8": "§bTags come in the form 'namespace:tag/subtype'.", + "cover.gtceu.tag_filter.info.9": "The 'forge:' namespace is assumed if one isn't provided.", + "cover.gtceu.test_slot.info": "Insert a item to test if it matches the filter expression", "cover.item.voiding.advanced.title": "Advanced Item Voiding Settings", "cover.item.voiding.title": "Item Voiding Settings", "cover.item_filter.ignore_damage.disabled": "Respect Damage", @@ -2112,21 +2176,8 @@ "cover.shutter.message.disabled": "Opened shutter", "cover.shutter.message.enabled": "Closed shutter", "cover.storage.title": "Storage Cover", - "cover.tag_filter.info.0": "§bAccepts complex expressions", - "cover.tag_filter.info.1": "§6a & b§r = AND", - "cover.tag_filter.info.10": "§bExample: §6*dusts/gold | (gtceu:circuits & !*lv)", - "cover.tag_filter.info.11": "This matches all gold dusts or all circuits except LV ones", - "cover.tag_filter.info.2": "§6a | b§r = OR", - "cover.tag_filter.info.3": "§6a ^ b§r = XOR", - "cover.tag_filter.info.4": "§6!a§r = NOT", - "cover.tag_filter.info.5": "§6(a)§r for grouping", - "cover.tag_filter.info.6": "§6*§r for wildcard", - "cover.tag_filter.info.7": "§6$§r for untagged", - "cover.tag_filter.info.8": "§bTags come in the form 'namespace:tag/subtype'.", - "cover.tag_filter.info.9": "The 'forge:' namespace is assumed if one isn't provided.", "cover.tag_filter.matches": "Item matches", "cover.tag_filter.matches_not": "Item does not match", - "cover.tag_filter.test_slot.info": "Insert a item to test if it matches the filter expression", "cover.tag_filter.title": "Tag Filter", "cover.universal.manual_import_export.mode.description.0": "§eDisabled§r - Items/fluids will only move as specified by the cover and its filter. ", "cover.universal.manual_import_export.mode.description.1": "§eAllow Filtered§r - Items/fluids can be extracted and inserted independently of the cover mode, as long as its filter matches (if any). ", @@ -2164,6 +2215,19 @@ "death.attack.gtceu.hoe": "%s had their head tilled by %s", "death.attack.gtceu.knife": "%s was gently poked by %s", "death.attack.gtceu.mallet": "%s was hammered to death by %s", + "death.attack.gtceu.medical_condition.arsenicosis": "%s got arsenic poisoning", + "death.attack.gtceu.medical_condition.asbestosis": "%s got mesothelioma", + "death.attack.gtceu.medical_condition.berylliosis": "%s mined emeralds a bit too greedily", + "death.attack.gtceu.medical_condition.carbon_monoxide_poisoning": "%s left the stove on", + "death.attack.gtceu.medical_condition.carcinogen": "%s got leukemia", + "death.attack.gtceu.medical_condition.chemical_burns": "%s had a chemical accident", + "death.attack.gtceu.medical_condition.irritant": "%s got a §n§lREALLY§r bad rash", + "death.attack.gtceu.medical_condition.methanol_poisoning": "%s tried to drink moonshine during the prohibition", + "death.attack.gtceu.medical_condition.nausea": "%s died of nausea", + "death.attack.gtceu.medical_condition.none": "%s died of... nothing?", + "death.attack.gtceu.medical_condition.poison": "%s forgot that poisonous materials are, in fact, poisonous", + "death.attack.gtceu.medical_condition.silicosis": "%s didn't die of tuberculosis. it was silicosis.", + "death.attack.gtceu.medical_condition.weak_poison": "%s ate lead (or mercury!)", "death.attack.gtceu.medical_condition/arsenicosis": "%s got arsenic poisoning", "death.attack.gtceu.medical_condition/asbestosis": "%s got mesothelioma", "death.attack.gtceu.medical_condition/berylliosis": "%s mined emeralds a bit too greedily", @@ -2193,35 +2257,36 @@ "death.attack.gtceu.wrench_iv": "%s had a wrench thrown into their plans by %s", "death.attack.gtceu.wrench_lv": "%s's pipes were loosened by %s", "effect.gtceu.weak_poison": "Weak Poison", - "enchantment.damage.disjunction": "Disjunction", - "enchantment.disjunction": "Disjunction", + "enchantment.gtceu.disjunction": "Disjunction", "enchantment.gtceu.disjunction.description": "Applies Weakness and Slowness to Ender-related mobs.", + "enchantment.gtceu.hard_hammer": "Hammering", "enchantment.gtceu.hard_hammer.description": "Breaks blocks as if they were mined with a GregTech Hammer.", - "enchantment.hard_hammer": "Hammering", "entity.gtceu.boat": "Boat", "entity.gtceu.chest_boat": "Chest Boat", "entity.gtceu.dynamite": "Dynamite", "entity.gtceu.industrial_tnt": "Industrial TNT", "entity.gtceu.powderbarrel": "Powderbarrel", "fluid.empty": "Empty", + "fluid.gtceu.amount": "§9Amount: %d/%d mB", + "fluid.gtceu.click_combined": "§7Click with a Fluid Container to §cempty §7or §bfill §7the tank (Shift-click for a full stack).", + "fluid.gtceu.click_to_empty": "§7Click with a Fluid Container to §cempty §7the tank (Shift-click for a full stack).", + "fluid.gtceu.click_to_fill": "§7Click with a Fluid Container to §bfill §7the tank (Shift-click for a full stack).", + "fluid.gtceu.empty": "Empty", + "fluid.gtceu.gas_generic": "%s Gas", + "fluid.gtceu.gas_vapor": "%s Vapor", + "fluid.gtceu.generic": "%s", + "fluid.gtceu.liquid_generic": "Liquid %s", + "fluid.gtceu.molten": "Molten %s", + "fluid.gtceu.plasma": "%s Plasma", "fluid.gtceu.potion": "Potion", "fluid.spawnlocation.name": "Fluid Vein Information", "fluid.tile.lava": "Lava", "fluid.tile.water": "Water", "fluid_cell.empty": "Empty", - "gtceu.air_scrubber": "Air Scrubber", - "gtceu.alloy_blast_smelter": "Alloy Blast Smelter", - "gtceu.alloy_smelter": "Alloy Smelter", - "gtceu.arc_furnace": "Arc Furnace", - "gtceu.assembler": "Assembler", - "gtceu.assembly_line": "Assembly Line", "gtceu.auto_decomp.rotor": "Turbine Rotor", "gtceu.auto_decomp.tool": "Non-electric tool", - "gtceu.autoclave": "Autoclave", "gtceu.battery_buffer.average_input": "Average input: %s EU/t", "gtceu.battery_buffer.average_output": "Average output: %s EU/t", - "gtceu.bender": "Bender", - "gtceu.brewery": "Brewery", "gtceu.bus.collapse.error": "Bus must be attached to multiblock first", "gtceu.bus.collapse_false": "Bus will not collapse Items", "gtceu.bus.collapse_true": "Bus will collapse Items", @@ -2229,53 +2294,12 @@ "gtceu.button.hide_depleted": "Hide Depleted Veins", "gtceu.button.ore_veins": "Show GT Ore Veins", "gtceu.button.show_depleted": "Show Depleted Veins", - "gtceu.cable.amperage": "§eMax Amperage:§r §e%d", - "gtceu.cable.loss_per_block": "§cLoss/Meter/Ampere:§r §c%d§7 EU-Volt", - "gtceu.cable.superconductor": "%s §dSuperconductor", - "gtceu.cable.voltage": "§aMax Voltage:§r §a%d §a(%s§a)", - "gtceu.canner": "Canner", - "gtceu.central_monitor.gui.create_group": "Create group", - "gtceu.central_monitor.gui.currently_editing": "Currently editing: %s", - "gtceu.central_monitor.gui.remove_from_group": "Remove from group", - "gtceu.central_monitor.gui.set_target": "Set target", - "gtceu.central_monitor.info_tooltip.0": "In order to use monitors, you have to split them into groups first. A group may only have 1 module in it.", - "gtceu.central_monitor.info_tooltip.1": "Select them by left-clicking, then click 'Create group'.", - "gtceu.central_monitor.info_tooltip.2": "Then in the settings page for the group you can insert a module, you can configure it in the same page.", - "gtceu.central_monitor.info_tooltip.3": "To delete a group, select all of it's components and click 'Remove from group'.", - "gtceu.central_monitor.info_tooltip.4": "You can quickly select all components of a group by clicking on it's name. Click again to unselect.", - "gtceu.central_monitor.info_tooltip.5": "Some modules may display things depending on the block they target, to set a target for a group select any component of that group and right-click on the target component.", - "gtceu.central_monitor.info_tooltip.6": "You may wish to select a target that is not in the multiblock, you have to use the wireless transmitter cover for that.", - "gtceu.central_monitor.info_tooltip.7": "Place the cover on the target block, right-click it with a data stick and put that data stick into a data access hatch in the multiblock.", - "gtceu.central_monitor.info_tooltip.8": "Then select the data access hatch as the target, and set the slot index of your data stick in the number field that appeared.", - "gtceu.central_monitor.size": "Size: (%d+1+%d)x(%d+1+%d)", - "gtceu.centrifuge": "Centrifuge", "gtceu.chance_logic.and": "AND", "gtceu.chance_logic.first": "FIRST", "gtceu.chance_logic.none": "NONE", "gtceu.chance_logic.or": "OR", "gtceu.chance_logic.xor": "XOR", "gtceu.chat.cape": "§5Congrats: you just unlocked a new cape! See the Cape Selector terminal app to use it.§r", - "gtceu.chemical_bath": "Chemical Bath", - "gtceu.chemical_reactor": "Chemical Reactor", - "gtceu.circuit_assembler": "Circuit Assembler", - "gtceu.coke_oven": "Coke Oven", - "gtceu.combustion_generator": "Combustion Generator", - "gtceu.compressor": "Compressor", - "gtceu.computer_monitor_cover.error.bf_invalid": "Invalid character at %d", - "gtceu.computer_monitor_cover.error.bf_invalid_num": "Invalid number at index %d when processing symbol number %d", - "gtceu.computer_monitor_cover.error.exception": "Unexpected exception occurred: %s", - "gtceu.computer_monitor_cover.error.invalid_args": "Invalid arguments!", - "gtceu.computer_monitor_cover.error.invalid_number": "Invalid number '%s'!", - "gtceu.computer_monitor_cover.error.missing_item": "Missing %s in slot %d!", - "gtceu.computer_monitor_cover.error.no_ae": "Cover holder does not have an AE2 network!", - "gtceu.computer_monitor_cover.error.no_cover": "No cover!", - "gtceu.computer_monitor_cover.error.no_placeholder": "No such placeholder: '%s'!", - "gtceu.computer_monitor_cover.error.not_enough_args": "Expected at least %d args, got %d!", - "gtceu.computer_monitor_cover.error.not_in_range": "Expected %s to be between %d and %d (inclusive), got %d", - "gtceu.computer_monitor_cover.error.not_supported": "This feature is not supported by this block/cover!", - "gtceu.computer_monitor_cover.error.unclosed_bracket": "Unclosed bracket!", - "gtceu.computer_monitor_cover.error.unexpected_bracket": "Unexpected closing bracket!", - "gtceu.computer_monitor_cover.error.wrong_number_of_args": "Expected %d args, got %d!", "gtceu.cover.activity_detector.message_activity_inverted": "Monitoring Inverted Activity Status", "gtceu.cover.activity_detector.message_activity_normal": "Monitoring Normal Activity Status", "gtceu.cover.activity_detector_advanced.message_activity_inverted": "Monitoring Inverted Progress Status", @@ -2286,7 +2310,6 @@ "gtceu.cover.fluid_detector.message_fluid_storage_normal": "Monitoring Normal Fluid Storage", "gtceu.cover.item_detector.message_item_storage_inverted": "Monitoring Inverted Item Storage", "gtceu.cover.item_detector.message_item_storage_normal": "Monitoring Normal Item Storage", - "gtceu.cracker": "Cracker", "gtceu.creative.activity.off": "Not active", "gtceu.creative.activity.on": "Active", "gtceu.creative.chest.ipc": "Items per Cycle", @@ -2303,7 +2326,6 @@ "gtceu.creative_tooltip.1": "§7You just need", "gtceu.creative_tooltip.2": " Creative Mode", "gtceu.creative_tooltip.3": "§7 to use this", - "gtceu.cutter": "Cutter", "gtceu.debug.f3_h.enabled": "GregTech has modified the debug info! For Developers: enable the misc:debug config option in the GregTech config file to see more", "gtceu.debug.resource_rebuild.done": "Gradle resource rebuild done in %s", "gtceu.debug.resource_rebuild.start": "Invoking gradle resource rebuild (./gradlew :processResources)", @@ -2313,69 +2335,15 @@ "gtceu.direction.tooltip.left": "Left", "gtceu.direction.tooltip.right": "Right", "gtceu.direction.tooltip.up": "Up", - "gtceu.display_source.computer_monitor_cover": "Computer Monitor Cover", - "gtceu.display_target.computer_monitor_cover": "Computer Monitor Cover", - "gtceu.distillation_tower": "Distillation Tower", - "gtceu.distillery": "Distillery", - "gtceu.duct_pipe.transfer_rate": "§bAir transfer rate: %s", - "gtceu.dummy": "Dummy", - "gtceu.electric_blast_furnace": "Electric Blast Furnace", - "gtceu.electric_furnace": "Electric Furnace", - "gtceu.electrolyzer": "Electrolyzer", - "gtceu.electromagnetic_separator": "Electromagnetic Separator", - "gtceu.ender_item_link_cover.title": "Ender Item Link", - "gtceu.ender_item_link_cover.tooltip": "§7Transports §fItems§7 with a §fWireless §dEnder§f Connection§7 as §fCover§7.", - "gtceu.ender_redstone_link_cover.label": "Redstone power: %d", - "gtceu.ender_redstone_link_cover.title": "Ender Redstone Link", - "gtceu.ender_redstone_link_cover.tooltip": "§7Transmits §fRedstone signals§7 with a §fWireless §dEnder§f Connection§7 as §fCover§7.", - "gtceu.extractor": "Extractor", - "gtceu.extruder": "Extruder", - "gtceu.fermenter": "Fermenter", - "gtceu.fluid.amount": "§9Amount: %d/%d mB", - "gtceu.fluid.click_combined": "§7Click with a Fluid Container to §cempty §7or §bfill §7the tank (Shift-click for a full stack).", - "gtceu.fluid.click_to_empty": "§7Click with a Fluid Container to §cempty §7the tank (Shift-click for a full stack).", - "gtceu.fluid.click_to_fill": "§7Click with a Fluid Container to §bfill §7the tank (Shift-click for a full stack).", - "gtceu.fluid.empty": "Empty", - "gtceu.fluid.gas_generic": "%s Gas", - "gtceu.fluid.gas_vapor": "%s Vapor", - "gtceu.fluid.generic": "%s", - "gtceu.fluid.liquid_generic": "Liquid %s", - "gtceu.fluid.molten": "Molten %s", - "gtceu.fluid.plasma": "%s Plasma", - "gtceu.fluid.state_gas": "§aState: Gaseous", - "gtceu.fluid.state_liquid": "§aState: Liquid", - "gtceu.fluid.state_plasma": "§aState: Plasma", - "gtceu.fluid.temperature": "§cTemperature: %s", - "gtceu.fluid.temperature.cryogenic": "§bCryogenic! Handle with care!", - "gtceu.fluid.type_acid.tooltip": "§6Acidic! Handle with care!", - "gtceu.fluid_heater": "Fluid Heater", - "gtceu.fluid_pipe.acid_proof": "§6Can handle Acids", - "gtceu.fluid_pipe.capacity": "§9Capacity: §f%d mB", - "gtceu.fluid_pipe.channels": "§eChannels: §f%d", - "gtceu.fluid_pipe.cryo_proof": "§6Can handle Cryogenics", - "gtceu.fluid_pipe.gas_proof": "§6Can handle Gases", - "gtceu.fluid_pipe.max_temperature": "§cTemperature Limit: §f%s", - "gtceu.fluid_pipe.not_gas_proof": "§4Gases may leak!", - "gtceu.fluid_pipe.plasma_proof": "§6Can handle all Plasmas", - "gtceu.fluid_solidifier": "Fluid Solidifier", - "gtceu.forge_hammer": "Forge Hammer", - "gtceu.forming_press": "Forming Press", "gtceu.forming_press.naming.named": "§oNamed Item", "gtceu.forming_press.naming.press": "§oNamed Press", "gtceu.forming_press.naming.to_name": "§oItem to Name", - "gtceu.fusion_reactor": "Fusion Reactor", - "gtceu.gas_collector": "Gas Collector", - "gtceu.gas_turbine": "Gas Turbine", "gtceu.gui.adv_stocking_config.min_fluid_count": "Minimum Fluid Stack Size for Automated Pulling", "gtceu.gui.adv_stocking_config.min_item_count": "Minimum Item Stack Size for Automated Pulling", "gtceu.gui.adv_stocking_config.ticks_per_cycle": "Delay between item list updates", "gtceu.gui.adv_stocking_config.title": "Configure Automatic Stocking", "gtceu.gui.all_voiding": "§7Voiding §cAll", "gtceu.gui.auto_output.name": "auto", - "gtceu.gui.central_monitor.group": "Group: %s", - "gtceu.gui.central_monitor.group_default_name": "Group #%d", - "gtceu.gui.central_monitor.none": "none", - "gtceu.gui.central_monitor.text_scale": "Text scale", "gtceu.gui.charger_slot.tooltip.0": "§fCharger Slot§r", "gtceu.gui.charger_slot.tooltip.1": "§7Draws power from %s batteries§r", "gtceu.gui.charger_slot.tooltip.2": "§7Charges %s tools and batteries", @@ -2384,18 +2352,6 @@ "gtceu.gui.chunkmode.enabled.0": "Chunk Mode Enabled: Click to Disable.", "gtceu.gui.chunkmode.enabled.1": "§7Switching requires an idle machine.", "gtceu.gui.circuit.title": "Circuit Settings", - "gtceu.gui.computer_monitor_cover.edit_blank_placeholders": "Edit blank placeholders", - "gtceu.gui.computer_monitor_cover.edit_displayed_text": "Edit displayed text", - "gtceu.gui.computer_monitor_cover.main_textbox_tooltip.0": "Input string to display on line %d here.", - "gtceu.gui.computer_monitor_cover.main_textbox_tooltip.1": "It can have placeholders, for example: 'Energy: {energy}/{energyCapacity} EU'", - "gtceu.gui.computer_monitor_cover.main_textbox_tooltip.2": "Placeholders can also be inside other placeholders.", - "gtceu.gui.computer_monitor_cover.placeholder_reference.0": "All placeholders:", - "gtceu.gui.computer_monitor_cover.placeholder_reference.1": "(hover for more info)", - "gtceu.gui.computer_monitor_cover.second_page_textbox_tooltip.0": "Input placeholder to be used in place of %s '{}' here.", - "gtceu.gui.computer_monitor_cover.second_page_textbox_tooltip.1": "For example, you can have a string 'Energy: {}/{} EU' and 'energy' and 'energyCapacity' in these text boxes.", - "gtceu.gui.computer_monitor_cover.slot_tooltip.0": "A slot for items that some placeholders can reference", - "gtceu.gui.computer_monitor_cover.slot_tooltip.1": "Slot number: %d", - "gtceu.gui.computer_monitor_cover.update_interval": "Update interval (in ticks)", "gtceu.gui.config_slot": "§fConfig Slot§r", "gtceu.gui.config_slot.auto_pull_managed": "§4Disabled:§7 Managed by Auto-Pull", "gtceu.gui.config_slot.remove": "§7Right click to §4clear§7 config slot.§r", @@ -2440,13 +2396,10 @@ "gtceu.gui.fluid_auto_output.allow_input.enabled": "allow fluids input from the output side", "gtceu.gui.fluid_auto_output.disabled": "Fluid Auto Output: §cDisabled", "gtceu.gui.fluid_auto_output.enabled": "Fluid Auto Output: §aEnabled", - "gtceu.gui.fluid_auto_output.other_direction.0": "Fluid Auto Output: §6Other Direction", - "gtceu.gui.fluid_auto_output.other_direction.1": "§7The machine's fluid output is set to another direction.", - "gtceu.gui.fluid_auto_output.other_direction.2": "§7Click to move the output to the currently selected side.", + "gtceu.gui.fluid_auto_output.other_direction.0": "Fluid Auto Output: §6Other Direction\n§7The machine's fluid output is set to another direction.\n§7Click to move the output to the currently selected side.\n", "gtceu.gui.fluid_auto_output.tooltip.disabled": "Fluid Auto-Output Disabled", "gtceu.gui.fluid_auto_output.tooltip.enabled": "Fluid Auto-Output Enabled", - "gtceu.gui.fluid_auto_output.unselected.0": "Fluid Auto Output", - "gtceu.gui.fluid_auto_output.unselected.1": "§7Select a side of the machine to configure its output.", + "gtceu.gui.fluid_auto_output.unselected.0": "Fluid Auto Output\n§7Select a side of the machine to configure its output.\n", "gtceu.gui.fluid_lock.tooltip.disabled": "Fluid Locking Disabled", "gtceu.gui.fluid_lock.tooltip.enabled": "Fluid Locking Enabled", "gtceu.gui.fluid_voiding": "§7Voiding §9Fluids", @@ -2459,13 +2412,10 @@ "gtceu.gui.item_auto_output.allow_input.enabled": "allow items input from the output side", "gtceu.gui.item_auto_output.disabled": "Item Auto Output: §cDisabled", "gtceu.gui.item_auto_output.enabled": "Item Auto Output: §aEnabled", - "gtceu.gui.item_auto_output.other_direction.0": "Item Auto Output: §6Other Direction", - "gtceu.gui.item_auto_output.other_direction.1": "§7The machine's item output is set to another direction.", - "gtceu.gui.item_auto_output.other_direction.2": "§7Click to move the output to the currently selected side.", + "gtceu.gui.item_auto_output.other_direction.0": "Item Auto Output: §6Other Direction\n§7The machine's item output is set to another direction.\n§7Click to move the output to the currently selected side.\n", "gtceu.gui.item_auto_output.tooltip.disabled": "Item Auto-Output Disabled", "gtceu.gui.item_auto_output.tooltip.enabled": "Item Auto-Output Enabled", - "gtceu.gui.item_auto_output.unselected.0": "Item Auto Output", - "gtceu.gui.item_auto_output.unselected.1": "§7Select a side of the machine to configure its output.", + "gtceu.gui.item_auto_output.unselected.0": "Item Auto Output\n§7Select a side of the machine to configure its output.\n", "gtceu.gui.item_lock.tooltip.disabled": "Item Locking Disabled", "gtceu.gui.item_lock.tooltip.enabled": "Item Locking Enabled", "gtceu.gui.item_voiding": "§7Voiding §6Items", @@ -2491,6 +2441,7 @@ "gtceu.gui.overclock.off": "X", "gtceu.gui.overclock.range": "Available Tiers [%s, %s]", "gtceu.gui.overclock.title": "Overclock Tier", + "gtceu.gui.seconds": "%s second(s)", "gtceu.gui.silktouch.disabled.0": "Silk Touch Disabled: Click to Enable.", "gtceu.gui.silktouch.disabled.1": "§7Switching requires an idle machine.", "gtceu.gui.silktouch.enabled.0": "Silk Touch Enabled: Click to Disable.", @@ -2504,7 +2455,7 @@ "gtceu.gui.toggle_view.disabled": "Toggle View (Fluids)", "gtceu.gui.toggle_view.enabled": "Toggle View (Items)", "gtceu.gui.waiting_list": "Sending Queue:", - "gtceu.implosion_compressor": "Implosion Compressor", + "gtceu.gui.years": "%s year(s)", "gtceu.io.both": "Both", "gtceu.io.export": "Export", "gtceu.io.import": "Import", @@ -2512,7 +2463,6 @@ "gtceu.item_filter.empty_item": "Empty (No Item)", "gtceu.item_filter.footer": "§eClick with item to override", "gtceu.item_list.item_stored": "§7Stored: %d", - "gtceu.item_pipe.priority": "§9Priority: §f%d", "gtceu.jade.amperage_use": "%s A", "gtceu.jade.at": " @ ", "gtceu.jade.changes_eu_sec": "%s EU/s", @@ -2628,42 +2578,22 @@ "gtceu.key.enable_jetpack": "Enable Jetpack", "gtceu.key.enable_step_assist": "Enable StepAssist", "gtceu.key.tool_aoe_change": "Tool AoE Mode Switch", - "gtceu.large_boiler": "Large Boiler", - "gtceu.large_chemical_reactor": "Large Chemical Reactor", - "gtceu.laser_engraver": "Laser Engraver", - "gtceu.lathe": "Lathe", - "gtceu.macerator": "Macerator", "gtceu.machine.active_transformer.tooltip.0": "§7Transformers: Lasers in Disguise", "gtceu.machine.active_transformer.tooltip.1": "§7Can combine any number of Energy §fInputs§7 into any number of Energy §fOutputs§7.", "gtceu.machine.active_transformer.tooltip.2": "§7Can transmit power at incredible distance with", "gtceu.machine.active_transformer.tooltip.3": " Lasers§7.", "gtceu.machine.advanced_processing_array.tooltip": "Parallelize the World", - "gtceu.machine.assembly_line.tooltip": "Not a multiblock Assembling Machine!", - "gtceu.machine.available_recipe_map_1.tooltip": "Available Recipe Types: %s", - "gtceu.machine.available_recipe_map_2.tooltip": "Available Recipe Types: %s, %s", - "gtceu.machine.available_recipe_map_3.tooltip": "Available Recipe Types: %s, %s, %s", - "gtceu.machine.available_recipe_map_4.tooltip": "Available Recipe Types: %s, %s, %s, %s", - "gtceu.machine.basic.input_from_output_side.allow": "Allow Input from Output Side: ", - "gtceu.machine.basic.input_from_output_side.disallow": "Disallow Input from Output Side: ", "gtceu.machine.batch_disabled": "Batching Disabled", "gtceu.machine.batch_enabled": "Batching Enabled", "gtceu.machine.bedrock_ore_miner.depletion": "§bDepletion Rate: §f%s%%", "gtceu.machine.bedrock_ore_miner.description": "§7Drills ores from veins under bedrock.", "gtceu.machine.bedrock_ore_miner.production": "§eProduction Multiplier: §f%dx, %fx overclocked", - "gtceu.machine.block_breaker.speed_bonus": "§eSpeed Bonus: §f%d%%", - "gtceu.machine.block_breaker.tooltip": "§7Mines block on front face and collects its drops", - "gtceu.machine.boiler.info.cooling.down": "§9Cooling§r", - "gtceu.machine.boiler.info.heating.up": "§cHeating§r", - "gtceu.machine.boiler.info.production.data": "§aProducing %s§a mB/t", - "gtceu.machine.buffer.tooltip": "A Small Buffer to store Items and Fluids", "gtceu.machine.canner.jei_description": "You can fill and empty any fluid containers with the Fluid Canner (e.g. Buckets or Fluid Cells)", "gtceu.machine.central_monitor.tooltip": "But can it run Doom?", - "gtceu.machine.charcoal_pile.tooltip": "Underground fuel bakery", "gtceu.machine.charcoal_pile.tooltip.0": "Turns Logs into §aCharcoal§7 when §cignited§7.", "gtceu.machine.charcoal_pile.tooltip.1": "Right Click with fire-starting items to start.", "gtceu.machine.charcoal_pile.tooltip.2": "Pyrolysis occurs in up to a §b9x4x9§7 space beneath.", "gtceu.machine.charcoal_pile.tooltip.3": "Logs must be not be exposed to §eAir§7!", - "gtceu.machine.cleanroom.tooltip": "Keeping those pesky particles out", "gtceu.machine.cleanroom.tooltip.0": "Place machines inside to run cleanroom recipes.", "gtceu.machine.cleanroom.tooltip.1": "Uses §f30 EU/t§7 when dirty, §f4 EU/t§7 when clean.", "gtceu.machine.cleanroom.tooltip.2": "Overclocking increases cleaning per cycle.", @@ -2675,13 +2605,9 @@ "gtceu.machine.cleanroom.tooltip.ae2.channels": "Send up to §f8 AE2 Channels §7through §fHulls§7 in the walls.", "gtceu.machine.cleanroom.tooltip.ae2.no_channels": "Send §aAE2 Networks§7 through §fHulls§7 in the walls.", "gtceu.machine.cleanroom.tooltip.hold_ctrl": "Hold CTRL to show additional Structure Information", - "gtceu.machine.coke_oven.tooltip": "Making better fuels for Steel and Power", "gtceu.machine.coke_oven_hatch.tooltip": "§7Allows automation access for the Coke Oven.", - "gtceu.machine.combustion_generator.tooltip": "§7Requires flammable Liquids", "gtceu.machine.computation_receiver_hatch.tooltip": "Computation Data Input for Multiblocks", "gtceu.machine.computation_transmitter_hatch.tooltip": "Computation Data Output for Multiblocks", - "gtceu.machine.cracker.tooltip": "Makes Oil useful", - "gtceu.machine.cracker.tooltip.1": "Every coil after §6Cupronickel§7 reduces energy usage by §f10%%§7.", "gtceu.machine.data_access_hatch.tooltip.0": "Data Access for Multiblocks", "gtceu.machine.data_access_hatch.tooltip.1": "Adds §a%s§7 slots for Data Items", "gtceu.machine.data_bank.tooltip.0": "Your Personal NAS", @@ -2691,77 +2617,16 @@ "gtceu.machine.data_bank.tooltip.4": "Uses §f%s EU/t§7 per Data/Optical Hatch when chained.", "gtceu.machine.data_receiver_hatch.tooltip": "Research Data Input for Multiblocks", "gtceu.machine.data_transmitter_hatch.tooltip": "Research Data Output for Multiblocks", - "gtceu.machine.diode.message": "Max Amperage throughput: %s", - "gtceu.machine.diode.tooltip_general": "Allows Energy Flow in one direction and limits Amperage", - "gtceu.machine.diode.tooltip_starts_at": "Starts as §f1A§7, use Soft Mallet to change", - "gtceu.machine.diode.tooltip_tool_usage": "Hit with a Soft Mallet to change Amperage flow.", - "gtceu.machine.distillation_tower.tooltip": "Fluid Refinery", - "gtceu.machine.drum.disable_output": "Will not drain Fluid", - "gtceu.machine.drum.enable_output": "Will drain Fluid to downward adjacent Tanks", "gtceu.machine.dual_hatch.export.tooltip": "Item and Fluid Output for Multiblocks", "gtceu.machine.dual_hatch.import.tooltip": "Item and Fluid Input for Multiblocks", - "gtceu.machine.electric_blast_furnace.tooltip": "Where's the electric smoker?", - "gtceu.machine.electric_blast_furnace.tooltip.0": "For every §f900K§7 above the recipe temperature, a multiplicative §f95%%§7 energy multiplier is applied pre-overclocking.", - "gtceu.machine.electric_blast_furnace.tooltip.1": "For every §f1800K§7 above the recipe temperature, one overclock becomes §f100%% efficient§7 (perfect overclock).", - "gtceu.machine.electric_blast_furnace.tooltip.2": "For every voltage tier above §bMV§7, temperature is increased by §f100K§7.", "gtceu.machine.endpoint.tooltip.0": "Connect with §fLong Distance Pipe§7 blocks to create a pipeline.", "gtceu.machine.endpoint.tooltip.1": "Pipelines must have exactly §f1 Input§7 and §f1 Output§7 endpoint.", "gtceu.machine.endpoint.tooltip.2": "Only pipeline endpoints need to be §fchunk-loaded§7.", "gtceu.machine.endpoint.tooltip.min_length": "§bMinimum Endpoint Distance: §f%d Blocks", - "gtceu.machine.energy_converter.description": "Converts Energy between EU and FE", - "gtceu.machine.energy_converter.message_conversion_eu": "Converting EU, In: %dA %d EU, Out: %d Native", - "gtceu.machine.energy_converter.message_conversion_native": "Converting Native Energy, In: %d FE, Out: %dA %d EU", - "gtceu.machine.energy_converter.tooltip_conversion_eu": "§aEU Conversion: §f%dA %d EU (%s§f) -> %d Native", - "gtceu.machine.energy_converter.tooltip_conversion_native": "§cNative Conversion: §f%d FE -> %dA %d EU (%s§f)", - "gtceu.machine.energy_converter.tooltip_tool_usage": "Starts as §fFE Converter§7, use Soft Mallet to change", "gtceu.machine.energy_hatch.input.tooltip": "Energy Input for Multiblocks", "gtceu.machine.energy_hatch.input_hi_amp.tooltip": "Multiple Ampere Energy Input for Multiblocks", "gtceu.machine.energy_hatch.output.tooltip": "Energy Output for Multiblocks", "gtceu.machine.energy_hatch.output_hi_amp.tooltip": "Multiple Ampere Energy Output for Multiblocks", - "gtceu.machine.ev_alloy_smelter.tooltip": "§7HighTech combination Smelter", - "gtceu.machine.ev_arc_furnace.tooltip": "§7Who needs a Blast Furnace?", - "gtceu.machine.ev_assembler.tooltip": "§7Avengers, Assemble!", - "gtceu.machine.ev_autoclave.tooltip": "§7Crystallizing your Dusts", - "gtceu.machine.ev_bender.tooltip": "§7Boo, he's bad! We want BENDER!!!", - "gtceu.machine.ev_brewery.tooltip": "§7Compact and efficient potion brewing", - "gtceu.machine.ev_canner.tooltip": "§7Puts things into and out of Containers", - "gtceu.machine.ev_centrifuge.tooltip": "§7Molecular Separator", - "gtceu.machine.ev_chemical_bath.tooltip": "§7Bathing Ores in Chemicals to separate them", - "gtceu.machine.ev_chemical_reactor.tooltip": "§7Letting Chemicals react with each other", - "gtceu.machine.ev_circuit_assembler.tooltip": "§7Pick-n-Place all over the place", - "gtceu.machine.ev_compressor.tooltip": "§7Compress-O-Matic C77", - "gtceu.machine.ev_cutter.tooltip": "§7Slice'N Dice", - "gtceu.machine.ev_distillery.tooltip": "§7Extracting most relevant Parts of Fluids", - "gtceu.machine.ev_electric_furnace.tooltip": "§7Not like using a Commodore 64", - "gtceu.machine.ev_electrolyzer.tooltip": "§7Electrolyzing Molecules", - "gtceu.machine.ev_electromagnetic_separator.tooltip": "§7Separating the magnetic Ores from the rest", - "gtceu.machine.ev_extractor.tooltip": "§7Dejuicer-Device of Doom - D123", - "gtceu.machine.ev_extruder.tooltip": "§7Universal Machine for Metal Working", - "gtceu.machine.ev_fermenter.tooltip": "§7Fermenting Fluids", - "gtceu.machine.ev_fluid_drilling_rig.tooltip": "Well Drainer", - "gtceu.machine.ev_fluid_heater.tooltip": "§7Heating up your Fluids", - "gtceu.machine.ev_fluid_solidifier.tooltip": "§7Cools Fluids down to form Solids", - "gtceu.machine.ev_forge_hammer.tooltip": "§7Stop, Hammertime!", - "gtceu.machine.ev_forming_press.tooltip": "§7Imprinting Images into things", - "gtceu.machine.ev_gas_collector.tooltip": "§7Collects Gas from the air depending on the dimension", - "gtceu.machine.ev_laser_engraver.tooltip": "§7Don't look directly at the Laser", - "gtceu.machine.ev_lathe.tooltip": "§7Produces Rods more efficiently", - "gtceu.machine.ev_macerator.tooltip": "§7Shredding your Ores with Byproducts", - "gtceu.machine.ev_mass_fabricator.tooltip": "§7UUM Matter * Fabrication Squared", - "gtceu.machine.ev_mixer.tooltip": "§7Will it Blend?", - "gtceu.machine.ev_ore_washer.tooltip": "§7Getting more Byproducts from your Ores", - "gtceu.machine.ev_packer.tooltip": "§7Puts things into and Grabs things out of Boxes", - "gtceu.machine.ev_polarizer.tooltip": "§7Bipolarising your Magnets", - "gtceu.machine.ev_replicator.tooltip": "§7Producing the Purest of Elements", - "gtceu.machine.ev_rock_crusher.tooltip": "§7Place Water and Lava horizontally adjacent", - "gtceu.machine.ev_scanner.tooltip": "§7Scans Materials and other things", - "gtceu.machine.ev_sifter.tooltip": "§7Stay calm and keep sifting", - "gtceu.machine.ev_thermal_centrifuge.tooltip": "§7Separating Ores more precisely", - "gtceu.machine.ev_wiremill.tooltip": "§7Produces Wires more efficiently", - "gtceu.machine.extreme_combustion_engine.tooltip": "Extreme Chemical Energy Releaser", - "gtceu.machine.fisher.requirement": "Requires a %dx%d centered square of water directly below.", - "gtceu.machine.fisher.speed": "Catches something every %d ticks", - "gtceu.machine.fisher.tooltip": "Costs string to fish. Consumes one string each time.", "gtceu.machine.fluid_drilling_rig.depletion": "§bDepletion Rate: §f%s%%", "gtceu.machine.fluid_drilling_rig.description": "§7Drills fluids from veins under bedrock.", "gtceu.machine.fluid_drilling_rig.production": "§eProduction Multiplier: §f%dx, %fx overclocked", @@ -2770,24 +2635,10 @@ "gtceu.machine.fluid_tank.fluid": "Contains %s L of %s", "gtceu.machine.fluid_tank.max_multiblock": "Max Multiblock Size: %dx%dx%d", "gtceu.machine.fusion_reactor.capacity": "§7Maximum Energy Storage: §e%sM EU", - "gtceu.machine.fusion_reactor.luv.tooltip": "Atomic Alloy Smelter", "gtceu.machine.fusion_reactor.overclocking": "Overclocks double energy and halve duration.", - "gtceu.machine.fusion_reactor.uv.tooltip": "A WHITE DWARF DOWN ON YOUR BASE", - "gtceu.machine.fusion_reactor.zpm.tooltip": "A SUN DOWN ON EARTH", - "gtceu.machine.gas_turbine.tooltip": "§7Requires flammable Gases", "gtceu.machine.high_performance_computation_array.tooltip.0": "Just your average Supercomputer", "gtceu.machine.high_performance_computation_array.tooltip.1": "Used to generate §fComputation§7 (and heat).", "gtceu.machine.high_performance_computation_array.tooltip.2": "Requires HPCA components to generate §fCWU/t§7 (Compute Work Units).", - "gtceu.machine.hp_steam_alloy_smelter.tooltip": "§7Combination Smelter", - "gtceu.machine.hp_steam_compressor.tooltip": "§7Compressing Items", - "gtceu.machine.hp_steam_extractor.tooltip": "§7Extracting your first Rubber", - "gtceu.machine.hp_steam_forge_hammer.tooltip": "§7Forge Hammer", - "gtceu.machine.hp_steam_furnace.tooltip": "§7Smelting things with compressed Steam", - "gtceu.machine.hp_steam_liquid_boiler.tooltip": "§7Faster than Small Steam Liquid Boiler", - "gtceu.machine.hp_steam_macerator.tooltip": "§7Macerating your Ores without Byproducts", - "gtceu.machine.hp_steam_rock_crusher.tooltip": "§7Place Water and Lava horizontally adjacent", - "gtceu.machine.hp_steam_solar_boiler.tooltip": "§7Steam Power by Sun", - "gtceu.machine.hp_steam_solid_boiler.tooltip": "§7Faster than the Small Steam Solid Fuel Boiler", "gtceu.machine.hpca.active_cooler_component.tooltip": "Less free, more effective cooling", "gtceu.machine.hpca.advanced_computation_component.damaged.name": "Damaged HPCA Advanced Computation Component", "gtceu.machine.hpca.advanced_computation_component.damaged.tooltip": "It only cost an arm and a leg", @@ -2808,105 +2659,10 @@ "gtceu.machine.hpca.computation_component.tooltip": "Baby's first computation", "gtceu.machine.hpca.empty_component.tooltip": "Just for filling space", "gtceu.machine.hpca.heat_sink_component.tooltip": "Free cooling! Is anything free?", - "gtceu.machine.hull.tooltip": "§7You just need §5I§dm§4a§cg§ei§an§ba§3t§7i§1o§5n§7 to use this", - "gtceu.machine.hv_alloy_smelter.tooltip": "§7HighTech combination Smelter", - "gtceu.machine.hv_arc_furnace.tooltip": "§7Who needs a Blast Furnace?", - "gtceu.machine.hv_assembler.tooltip": "§7Avengers, Assemble!", - "gtceu.machine.hv_autoclave.tooltip": "§7Crystallizing your Dusts", - "gtceu.machine.hv_bender.tooltip": "§7Boo, he's bad! We want BENDER!!!", - "gtceu.machine.hv_brewery.tooltip": "§7Compact and efficient potion brewing", - "gtceu.machine.hv_canner.tooltip": "§7Puts things into and out of Containers", - "gtceu.machine.hv_centrifuge.tooltip": "§7Separating Molecules", - "gtceu.machine.hv_chemical_bath.tooltip": "§7Bathing Ores in Chemicals to separate them", - "gtceu.machine.hv_chemical_reactor.tooltip": "§7Letting Chemicals react with each other", - "gtceu.machine.hv_circuit_assembler.tooltip": "§7Pick-n-Place all over the place", - "gtceu.machine.hv_compressor.tooltip": "§7Compress-O-Matic C77", - "gtceu.machine.hv_cutter.tooltip": "§7Slice'N Dice", - "gtceu.machine.hv_distillery.tooltip": "§7Extracting most relevant Parts of Fluids", - "gtceu.machine.hv_electric_furnace.tooltip": "§7Not like using a Commodore 64", - "gtceu.machine.hv_electrolyzer.tooltip": "§7Electrolyzing Molecules", - "gtceu.machine.hv_electromagnetic_separator.tooltip": "§7Separating the magnetic Ores from the rest", - "gtceu.machine.hv_extractor.tooltip": "§7Dejuicer-Device of Doom - D123", - "gtceu.machine.hv_extruder.tooltip": "§7Universal Machine for Metal Working", - "gtceu.machine.hv_fermenter.tooltip": "§7Fermenting Fluids", - "gtceu.machine.hv_fluid_drilling_rig.tooltip": "Does not perform Fracking", - "gtceu.machine.hv_fluid_heater.tooltip": "§7Heating up your Fluids", - "gtceu.machine.hv_fluid_solidifier.tooltip": "§7Cools Fluids down to form Solids", - "gtceu.machine.hv_forge_hammer.tooltip": "§7Stop, Hammertime!", - "gtceu.machine.hv_forming_press.tooltip": "§7Imprinting Images into things", - "gtceu.machine.hv_gas_collector.tooltip": "§7Collects Gas from the air depending on the dimension", - "gtceu.machine.hv_laser_engraver.tooltip": "§7Don't look directly at the Laser", - "gtceu.machine.hv_lathe.tooltip": "§7Produces Rods more efficiently", - "gtceu.machine.hv_macerator.tooltip": "§7Shredding your Ores with Byproducts", - "gtceu.machine.hv_mass_fabricator.tooltip": "§7UUM Matter * Fabrication Squared", - "gtceu.machine.hv_mixer.tooltip": "§7Will it Blend?", - "gtceu.machine.hv_ore_washer.tooltip": "§7Getting more Byproducts from your Ores", - "gtceu.machine.hv_packer.tooltip": "§7Puts things into and Grabs things out of Boxes", - "gtceu.machine.hv_polarizer.tooltip": "§7Bipolarising your Magnets", - "gtceu.machine.hv_replicator.tooltip": "§7Producing the Purest of Elements", - "gtceu.machine.hv_rock_crusher.tooltip": "§7Place Water and Lava horizontally adjacent", - "gtceu.machine.hv_scanner.tooltip": "§7Scans Materials and other things", - "gtceu.machine.hv_sifter.tooltip": "§7Stay calm and keep sifting", - "gtceu.machine.hv_thermal_centrifuge.tooltip": "§7Separating Ores more precisely", - "gtceu.machine.hv_wiremill.tooltip": "§7Produces Wires more efficiently", - "gtceu.machine.implosion_compressor.tooltip": "The only Machine you want to go Boom", "gtceu.machine.item_bus.export.tooltip": "Item Output for Multiblocks", "gtceu.machine.item_bus.import.tooltip": "Item Input for Multiblocks", - "gtceu.machine.item_collector.gui.collect_range": "Collect within an area of %sx%s blocks", - "gtceu.machine.item_collector.tooltip": "Collects Items around itself", - "gtceu.machine.iv_alloy_smelter.tooltip": "§7Alloy Integrator", - "gtceu.machine.iv_arc_furnace.tooltip": "§7Discharge Heater", - "gtceu.machine.iv_assembler.tooltip": "§7NOT a Crafting Table", - "gtceu.machine.iv_autoclave.tooltip": "§7Pressure Cooker", - "gtceu.machine.iv_bender.tooltip": "§7Shape Distorter", - "gtceu.machine.iv_brewery.tooltip": "§7Brewing your Drinks", - "gtceu.machine.iv_canner.tooltip": "§7Can Operator", - "gtceu.machine.iv_centrifuge.tooltip": "§7Molecular Cyclone", - "gtceu.machine.iv_chemical_bath.tooltip": "§7Chemical Soaker", - "gtceu.machine.iv_chemical_reactor.tooltip": "§7Chemical Performer", - "gtceu.machine.iv_circuit_assembler.tooltip": "§7Electronics Manufacturer", - "gtceu.machine.iv_compressor.tooltip": "§7Singularity Condenser", - "gtceu.machine.iv_cutter.tooltip": "§7Matter Cleaver", - "gtceu.machine.iv_distillery.tooltip": "§7Condensation Separator", - "gtceu.machine.iv_electric_furnace.tooltip": "§7Electron Excitement Processor", - "gtceu.machine.iv_electrolyzer.tooltip": "§7Molecular Disintegrator E-4906", - "gtceu.machine.iv_electromagnetic_separator.tooltip": "§7EM Categorizer", - "gtceu.machine.iv_extractor.tooltip": "§7Vacuum Extractinator", - "gtceu.machine.iv_extruder.tooltip": "§7Material Displacer", - "gtceu.machine.iv_fermenter.tooltip": "§7Fermentation Hastener", - "gtceu.machine.iv_fluid_heater.tooltip": "§7Heat Infuser", - "gtceu.machine.iv_fluid_solidifier.tooltip": "§7Not an Ice Machine", - "gtceu.machine.iv_forge_hammer.tooltip": "§7Plate Forger", - "gtceu.machine.iv_forming_press.tooltip": "§7Object Layerer", - "gtceu.machine.iv_gas_collector.tooltip": "§7Collects Gas from the atmosphere depending on the dimension", - "gtceu.machine.iv_laser_engraver.tooltip": "§7With the Power of 2.04 MW", - "gtceu.machine.iv_lathe.tooltip": "§7Turn-O-Matic L-5906", - "gtceu.machine.iv_macerator.tooltip": "§7Blend-O-Matic 9001", - "gtceu.machine.iv_mass_fabricator.tooltip": "§7Genesis Factory", - "gtceu.machine.iv_mixer.tooltip": "§7Matter Organizer", - "gtceu.machine.iv_ore_washer.tooltip": "§7Repurposed Laundry-Washer I-360", - "gtceu.machine.iv_packer.tooltip": "§7Boxinator", - "gtceu.machine.iv_polarizer.tooltip": "§7Magnetism Inducer", - "gtceu.machine.iv_replicator.tooltip": "§7Matter Paster", - "gtceu.machine.iv_rock_crusher.tooltip": "§7Cryogenic Magma Solidifier R-8200", - "gtceu.machine.iv_scanner.tooltip": "§7Anomaly Detector", - "gtceu.machine.iv_sifter.tooltip": "§7Sponsored by TFC", - "gtceu.machine.iv_thermal_centrifuge.tooltip": "§7Blaze Sweatshop T-6350", - "gtceu.machine.iv_wiremill.tooltip": "§7Ingot Elongator", - "gtceu.machine.large_boiler.bronze.tooltip": "We need more Steam!", - "gtceu.machine.large_boiler.steel.tooltip": "Charcoal Incinerator", - "gtceu.machine.large_boiler.titanium.tooltip": "Where's the Magic Super Fuel?", - "gtceu.machine.large_boiler.tungstensteel.tooltip": "How do you even fuel this thing?", - "gtceu.machine.large_chemical_reactor.tooltip": "Black Box Reactor", - "gtceu.machine.large_combustion_engine.tooltip": "Fuel Ignition Chamber", "gtceu.machine.large_combustion_engine.tooltip.boost_extreme": "Supply §f80 mB/s§7 of Liquid Oxygen to produce up to §f%s EU/t§7 at §f2x§7 fuel consumption.", "gtceu.machine.large_combustion_engine.tooltip.boost_regular": "Supply §f20 mB/s§7 of Oxygen to produce up to §f%s EU/t§7 at §f2x§7 fuel consumption.", - "gtceu.machine.large_miner.ev.tooltip": "Digging Ore instead of You", - "gtceu.machine.large_miner.iv.tooltip": "Biome Excavator", - "gtceu.machine.large_miner.luv.tooltip": "Terrestrial Harvester", - "gtceu.machine.large_turbine.gas.tooltip": "Not a Jet Engine", - "gtceu.machine.large_turbine.plasma.tooltip": "Plasma Energy Siphon", - "gtceu.machine.large_turbine.steam.tooltip": "Do not put your Head in it", "gtceu.machine.laser_hatch.both.tooltip": "§cLaser Cables must be in a straight line!§7", "gtceu.machine.laser_hatch.source.tooltip": "§7Transmitting power at distance", "gtceu.machine.laser_hatch.target.tooltip": "§7Receiving power from distance", @@ -2916,94 +2672,6 @@ "gtceu.machine.laser_target_hatch.tooltip.1": "§cLaser cables must be in a straight line!§7", "gtceu.machine.locked_safe.malfunctioning": "§cMalfunctioning!", "gtceu.machine.locked_safe.requirements": "§7Replacements required:", - "gtceu.machine.lp_steam_alloy_smelter.tooltip": "§7Combination Smelter", - "gtceu.machine.lp_steam_compressor.tooltip": "§7Compressing Items", - "gtceu.machine.lp_steam_extractor.tooltip": "§7Extracting your first Rubber", - "gtceu.machine.lp_steam_forge_hammer.tooltip": "§7Forge Hammer", - "gtceu.machine.lp_steam_furnace.tooltip": "§7Smelting things with compressed Steam", - "gtceu.machine.lp_steam_liquid_boiler.tooltip": "§7A Boiler running off Liquids", - "gtceu.machine.lp_steam_macerator.tooltip": "§7Macerating your Ores without Byproducts", - "gtceu.machine.lp_steam_rock_crusher.tooltip": "§7Place Water and Lava horizontally adjacent", - "gtceu.machine.lp_steam_solar_boiler.tooltip": "§7Steam Power by Sun", - "gtceu.machine.lp_steam_solid_boiler.tooltip": "§7An early way to get Steam Power", - "gtceu.machine.luv_alloy_smelter.tooltip": "§7Alloy Integrator", - "gtceu.machine.luv_arc_furnace.tooltip": "§7Discharge Heater", - "gtceu.machine.luv_assembler.tooltip": "§7NOT a Crafting Table", - "gtceu.machine.luv_autoclave.tooltip": "§7Pressure Cooker", - "gtceu.machine.luv_bender.tooltip": "§7Shape Distorter", - "gtceu.machine.luv_brewery.tooltip": "§7Brewing your Drinks", - "gtceu.machine.luv_canner.tooltip": "§7Can Operator", - "gtceu.machine.luv_centrifuge.tooltip": "§7Molecular Cyclone", - "gtceu.machine.luv_chemical_bath.tooltip": "§7Chemical Soaker", - "gtceu.machine.luv_chemical_reactor.tooltip": "§7Chemical Performer", - "gtceu.machine.luv_circuit_assembler.tooltip": "§7Electronics Manufacturer", - "gtceu.machine.luv_compressor.tooltip": "§7Singularity Condenser", - "gtceu.machine.luv_cutter.tooltip": "§7Matter Cleaver", - "gtceu.machine.luv_distillery.tooltip": "§7Condensation Separator", - "gtceu.machine.luv_electric_furnace.tooltip": "§7Electron Excitement Processor", - "gtceu.machine.luv_electrolyzer.tooltip": "§7Molecular Disintegrator E-4907", - "gtceu.machine.luv_electromagnetic_separator.tooltip": "§7EM Categorizer", - "gtceu.machine.luv_extractor.tooltip": "§7Vacuum Extractinator", - "gtceu.machine.luv_extruder.tooltip": "§7Material Displacer", - "gtceu.machine.luv_fermenter.tooltip": "§7Fermentation Hastener", - "gtceu.machine.luv_fluid_heater.tooltip": "§7Heat Infuser", - "gtceu.machine.luv_fluid_solidifier.tooltip": "§7Not an Ice Machine", - "gtceu.machine.luv_forge_hammer.tooltip": "§7Plate Forger", - "gtceu.machine.luv_forming_press.tooltip": "§7Object Layerer", - "gtceu.machine.luv_gas_collector.tooltip": "§7Collects Gas from the atmosphere depending on the dimension", - "gtceu.machine.luv_laser_engraver.tooltip": "§7With the Power of 8.16 MW", - "gtceu.machine.luv_lathe.tooltip": "§7Turn-O-Matic L-5907", - "gtceu.machine.luv_macerator.tooltip": "§7Blend-O-Matic 9002", - "gtceu.machine.luv_mass_fabricator.tooltip": "§7Genesis Factory", - "gtceu.machine.luv_mixer.tooltip": "§7Matter Organizer", - "gtceu.machine.luv_ore_washer.tooltip": "§7Repurposed Laundry-Washer I-361", - "gtceu.machine.luv_packer.tooltip": "§7Boxinator", - "gtceu.machine.luv_polarizer.tooltip": "§7Magnetism Inducer", - "gtceu.machine.luv_replicator.tooltip": "§7Matter Paster", - "gtceu.machine.luv_rock_crusher.tooltip": "§7Cryogenic Magma Solidifier R-9200", - "gtceu.machine.luv_scanner.tooltip": "§7Anomaly Detector", - "gtceu.machine.luv_sifter.tooltip": "§7Sponsored by TFC", - "gtceu.machine.luv_thermal_centrifuge.tooltip": "§7Blaze Sweatshop T-6351", - "gtceu.machine.luv_wiremill.tooltip": "§7Ingot Elongator", - "gtceu.machine.lv_alloy_smelter.tooltip": "§7HighTech combination Smelter", - "gtceu.machine.lv_arc_furnace.tooltip": "§7Who needs a Blast Furnace?", - "gtceu.machine.lv_assembler.tooltip": "§7Avengers, Assemble!", - "gtceu.machine.lv_autoclave.tooltip": "§7Crystallizing your Dusts", - "gtceu.machine.lv_bender.tooltip": "§7Boo, he's bad! We want BENDER!!!", - "gtceu.machine.lv_brewery.tooltip": "§7Compact and efficient potion brewing", - "gtceu.machine.lv_canner.tooltip": "§7Puts things into and out of Containers", - "gtceu.machine.lv_centrifuge.tooltip": "§7Separating Molecules", - "gtceu.machine.lv_chemical_bath.tooltip": "§7Bathing Ores in Chemicals to separate them", - "gtceu.machine.lv_chemical_reactor.tooltip": "§7Letting Chemicals react with each other", - "gtceu.machine.lv_circuit_assembler.tooltip": "§7Pick-n-Place all over the place", - "gtceu.machine.lv_compressor.tooltip": "§7Compress-O-Matic C77", - "gtceu.machine.lv_cutter.tooltip": "§7Slice'N Dice", - "gtceu.machine.lv_distillery.tooltip": "§7Extracting most relevant Parts of Fluids", - "gtceu.machine.lv_electric_furnace.tooltip": "§7Not like using a Commodore 64", - "gtceu.machine.lv_electrolyzer.tooltip": "§7Electrolyzing Molecules", - "gtceu.machine.lv_electromagnetic_separator.tooltip": "§7Separating the magnetic Ores from the rest", - "gtceu.machine.lv_extractor.tooltip": "§7Dejuicer-Device of Doom - D123", - "gtceu.machine.lv_extruder.tooltip": "§7Universal Machine for Metal Working", - "gtceu.machine.lv_fermenter.tooltip": "§7Fermenting Fluids", - "gtceu.machine.lv_fluid_heater.tooltip": "§7Heating up your Fluids", - "gtceu.machine.lv_fluid_solidifier.tooltip": "§7Cools Fluids down to form Solids", - "gtceu.machine.lv_forge_hammer.tooltip": "§7Stop, Hammertime!", - "gtceu.machine.lv_forming_press.tooltip": "§7Imprinting Images into things", - "gtceu.machine.lv_gas_collector.tooltip": "§7Collects Gas from the air depending on the dimension", - "gtceu.machine.lv_laser_engraver.tooltip": "§7Don't look directly at the Laser", - "gtceu.machine.lv_lathe.tooltip": "§7Produces Rods more efficiently", - "gtceu.machine.lv_macerator.tooltip": "§7Shredding your Ores without Byproducts", - "gtceu.machine.lv_mass_fabricator.tooltip": "§7UUM Matter * Fabrication Squared", - "gtceu.machine.lv_mixer.tooltip": "§7Will it Blend?", - "gtceu.machine.lv_ore_washer.tooltip": "§7Getting more Byproducts from your Ores", - "gtceu.machine.lv_packer.tooltip": "§7Puts things into and Grabs things out of Boxes", - "gtceu.machine.lv_polarizer.tooltip": "§7Bipolarising your Magnets", - "gtceu.machine.lv_replicator.tooltip": "§7Producing the Purest of Elements", - "gtceu.machine.lv_rock_crusher.tooltip": "§7Place Water and Lava horizontally adjacent", - "gtceu.machine.lv_scanner.tooltip": "§7Scans Materials and other things", - "gtceu.machine.lv_sifter.tooltip": "§7Stay calm and keep sifting", - "gtceu.machine.lv_thermal_centrifuge.tooltip": "§7Separating Ores more precisely", - "gtceu.machine.lv_wiremill.tooltip": "§7Produces Wires more efficiently", "gtceu.machine.machine_hatch.locked": "Machine Interface Locked", "gtceu.machine.machine_hatch.processing_array": "When in the §eProcessing Array§7, only holds machines that work in the §eProcessing Array", "gtceu.machine.machine_hatch.tooltip": "Specialized Access Bus that only holds valid items", @@ -3041,66 +2709,19 @@ "gtceu.machine.miner.multi.description": "A multiblock mining machine that covers a large area and produces huge quantity of ore.", "gtceu.machine.miner.multi.modes": "Has Silk Touch and Chunk Aligned Modes.", "gtceu.machine.miner.multi.production": "Produces §f3x§7 more crushed ore than a §fMacerator§7.", - "gtceu.machine.miner.per_block": "§7takes §f%ds §7per Block", "gtceu.machine.miner.progress": "Progress: %d/%d", "gtceu.machine.miner.radius": "Radius: %d", "gtceu.machine.miner.startx": "sX: %d", "gtceu.machine.miner.starty": "sY: %d", "gtceu.machine.miner.startz": "sZ: %d", - "gtceu.machine.miner.tooltip": "§7Mines ores below the Miner! Starts as §f%sx%s §7area", - "gtceu.machine.muffle.off": "Sound Muffling: Disabled", - "gtceu.machine.muffle.on": "Sound Muffling: Enabled", "gtceu.machine.muffler_hatch.tooltip.0": "Recovers waste from machines", "gtceu.machine.muffler_hatch.tooltip.1": "DO NOT OBSTRUCT THE OUTPUT!", - "gtceu.machine.multi_furnace.tooltip": "Just like the Oven at Home", "gtceu.machine.multiblock.tank.tooltip": "Fill and drain through the controller or tank valves.", - "gtceu.machine.mv_alloy_smelter.tooltip": "§7HighTech combination Smelter", - "gtceu.machine.mv_arc_furnace.tooltip": "§7Who needs a Blast Furnace?", - "gtceu.machine.mv_assembler.tooltip": "§7Avengers, Assemble!", - "gtceu.machine.mv_autoclave.tooltip": "§7Crystallizing your Dusts", - "gtceu.machine.mv_bender.tooltip": "§7Boo, he's bad! We want BENDER!!!", - "gtceu.machine.mv_brewery.tooltip": "§7Compact and efficient potion brewing", - "gtceu.machine.mv_canner.tooltip": "§7Puts things into and out of Containers", - "gtceu.machine.mv_centrifuge.tooltip": "§7Separating Molecules", - "gtceu.machine.mv_chemical_bath.tooltip": "§7Bathing Ores in Chemicals to separate them", - "gtceu.machine.mv_chemical_reactor.tooltip": "§7Letting Chemicals react with each other", - "gtceu.machine.mv_circuit_assembler.tooltip": "§7Pick-n-Place all over the place", - "gtceu.machine.mv_compressor.tooltip": "§7Compress-O-Matic C77", - "gtceu.machine.mv_cutter.tooltip": "§7Slice'N Dice", - "gtceu.machine.mv_distillery.tooltip": "§7Extracting most relevant Parts of Fluids", - "gtceu.machine.mv_electric_furnace.tooltip": "§7Not like using a Commodore 64", - "gtceu.machine.mv_electrolyzer.tooltip": "§7Electrolyzing Molecules", - "gtceu.machine.mv_electromagnetic_separator.tooltip": "§7Separating the magnetic Ores from the rest", - "gtceu.machine.mv_extractor.tooltip": "§7Dejuicer-Device of Doom - D123", - "gtceu.machine.mv_extruder.tooltip": "§7Universal Machine for Metal Working", - "gtceu.machine.mv_fermenter.tooltip": "§7Fermenting Fluids", - "gtceu.machine.mv_fluid_drilling_rig.tooltip": "Oil Extraction Pump", - "gtceu.machine.mv_fluid_heater.tooltip": "§7Heating up your Fluids", - "gtceu.machine.mv_fluid_solidifier.tooltip": "§7Cools Fluids down to form Solids", - "gtceu.machine.mv_forge_hammer.tooltip": "§7Stop, Hammertime!", - "gtceu.machine.mv_forming_press.tooltip": "§7Imprinting Images into things", - "gtceu.machine.mv_gas_collector.tooltip": "§7Collects Gas from the air depending on the dimension", - "gtceu.machine.mv_laser_engraver.tooltip": "§7Don't look directly at the Laser", - "gtceu.machine.mv_lathe.tooltip": "§7Produces Rods more efficiently", - "gtceu.machine.mv_macerator.tooltip": "§7Shredding your Ores without Byproducts", - "gtceu.machine.mv_mass_fabricator.tooltip": "§7UUM Matter * Fabrication Squared", - "gtceu.machine.mv_mixer.tooltip": "§7Will it Blend?", - "gtceu.machine.mv_ore_washer.tooltip": "§7Getting more Byproducts from your Ores", - "gtceu.machine.mv_packer.tooltip": "§7Puts things into and Grabs things out of Boxes", - "gtceu.machine.mv_polarizer.tooltip": "§7Bipolarising your Magnets", - "gtceu.machine.mv_replicator.tooltip": "§7Producing the Purest of Elements", - "gtceu.machine.mv_rock_crusher.tooltip": "§7Place Water and Lava horizontally adjacent", - "gtceu.machine.mv_scanner.tooltip": "§7Scans Materials and other things", - "gtceu.machine.mv_sifter.tooltip": "§7Stay calm and keep sifting", - "gtceu.machine.mv_thermal_centrifuge.tooltip": "§7Separating Ores more precisely", - "gtceu.machine.mv_wiremill.tooltip": "§7Produces Wires more efficiently", "gtceu.machine.network_switch.tooltip.0": "Ethernet Hub", "gtceu.machine.network_switch.tooltip.1": "Used to route and distribute §fComputation§7.", "gtceu.machine.network_switch.tooltip.2": "Can combine any number of Computation §fReceivers§7 into any number of Computation §fTransmitters§7.", "gtceu.machine.network_switch.tooltip.3": "Uses §f%s EU/t§7 per Computation Data Hatch.", "gtceu.machine.object_holder.tooltip": "Advanced Holding Mechanism for Research Station", - "gtceu.machine.opv_gas_collector.tooltip": "§7Collects Gas from the universe depending on the dimension", - "gtceu.machine.opv_rock_crusher.tooltip": "§7Volcanic Formation Chamber", "gtceu.machine.parallel_hatch.display": "Adjust the maximum parallel of the multiblock", "gtceu.machine.parallel_hatch_mk5.tooltip": "Allows to run up to 4 recipes in parallel.", "gtceu.machine.parallel_hatch_mk6.tooltip": "Allows to run up to 16 recipes in parallel.", @@ -3109,7 +2730,6 @@ "gtceu.machine.parallel_limit": "Can run up to §b%d§r§7 Recipes at once.", "gtceu.machine.passthrough_hatch_fluid.tooltip": "Sends Fluids from one Side to the other", "gtceu.machine.passthrough_hatch_item.tooltip": "Sends Items from one Side to the other", - "gtceu.machine.perfect_oc": "Does not lose energy efficiency when overclocked.", "gtceu.machine.power_substation.tooltip.0": "The heart of a centralized power grid", "gtceu.machine.power_substation.tooltip.1": "§fCapacitors§7 do not need to be all the same tier.", "gtceu.machine.power_substation.tooltip.2": "Allows up to §f%d Capacitor Layers§7.", @@ -3117,17 +2737,8 @@ "gtceu.machine.power_substation.tooltip.4": "Capped at §f%d kEU/t§7 passive loss per Capacitor Block.", "gtceu.machine.power_substation.tooltip.5": "Can use", "gtceu.machine.power_substation.tooltip.6": " Laser Hatches§7.", - "gtceu.machine.primitive_blast_furnace.bronze.tooltip": "Making your first Steel", - "gtceu.machine.primitive_water_pump.tooltip": "Endervoir at Home", "gtceu.machine.processing_array.tooltip": "When a few Machines just doesn't cut it", - "gtceu.machine.pump.tooltip": "§7The best way to empty Oceans!", - "gtceu.machine.pump.tooltip_buckets": "§f%d §7ticks per Bucket", "gtceu.machine.pump_hatch.tooltip": "Primitive Fluid Output for Water Pump", - "gtceu.machine.pyrolyse_oven.tooltip": "Electric Coke Oven", - "gtceu.machine.pyrolyse_oven.tooltip.1": "§6Cupronickel §7coils are §f25%%§7 slower. Every coil after §bKanthal§7 increases speed by §f50%%§7.", - "gtceu.machine.quantum_chest.items_stored": "Item Amount:", - "gtceu.machine.quantum_chest.tooltip": "§7Better than Storage Drawers", - "gtceu.machine.quantum_tank.tooltip": "§7Compact place to store all your fluids", "gtceu.machine.research_station.researching": "Researching.", "gtceu.machine.research_station.tooltip.0": "More than just a Multiblock Scanner", "gtceu.machine.research_station.tooltip.1": "Used to scan onto §fData Orbs§7 and §fData Modules§7.", @@ -3135,70 +2746,9 @@ "gtceu.machine.research_station.tooltip.3": "Providing more Computation allows the recipe to run faster.", "gtceu.machine.rotor_holder.tooltip.0": "Rotor Holder for Multiblocks", "gtceu.machine.rotor_holder.tooltip.1": "Holds Rotor in place so it will not fly away", - "gtceu.machine.steam.steam_hatch.tooltip": "§eAccepted Fluid: §fSteam", - "gtceu.machine.steam_boiler.heat_amount": "Heat Capacity: %s %%", - "gtceu.machine.steam_bus.tooltip": "Does not work with non-steam multiblocks", - "gtceu.machine.steam_grinder.tooltip": "A multiblock Macerator without the Byproducts", - "gtceu.machine.steam_miner.tooltip": "§7Mines ores below the Miner!", - "gtceu.machine.steam_oven.tooltip": "Not to be confused with Multi-Smelter", - "gtceu.machine.steam_turbine.tooltip": "§7Converts Steam into EU", "gtceu.machine.substation_hatch.input.tooltip": "Energy Input for the Power Substation", "gtceu.machine.substation_hatch.output.tooltip": "Energy Output for the Power Substation", "gtceu.machine.tank_valve.tooltip": "Use to fill and drain multiblock tanks. Auto outputs when facing down.", - "gtceu.machine.transformer.description": "§7Transforms Energy between voltage tiers", - "gtceu.machine.transformer.message_transform_down": "Transforming Down, In: %s EU %dA, Out: %s EU %dA", - "gtceu.machine.transformer.message_transform_up": "Transforming Up, In: %s EU %dA, Out: %s EU %dA", - "gtceu.machine.transformer.tooltip_tool_usage": "Starts as §fTransform Down§7, use Screwdriver to change", - "gtceu.machine.transformer.tooltip_transform_down": "§aTransform Down: §f%dA %s EU (%s§f) -> %dA %s EU (%s§f)", - "gtceu.machine.transformer.tooltip_transform_up": "§cTransform Up: §f%dA %s EU (%s§f) -> %dA %s EU (%s§f)", - "gtceu.machine.uev_gas_collector.tooltip": "§7Collects Gas from the solar system depending on the dimension", - "gtceu.machine.uev_rock_crusher.tooltip": "§7Volcanic Formation Chamber", - "gtceu.machine.uhv_gas_collector.tooltip": "§7Collects Gas from the solar system depending on the dimension", - "gtceu.machine.uhv_rock_crusher.tooltip": "§7Volcanic Formation Chamber", - "gtceu.machine.uiv_gas_collector.tooltip": "§7Collects Gas from the solar system depending on the dimension", - "gtceu.machine.uiv_rock_crusher.tooltip": "§7Volcanic Formation Chamber", - "gtceu.machine.uv_alloy_smelter.tooltip": "§7Metal Amalgamator", - "gtceu.machine.uv_arc_furnace.tooltip": "§7Short Circuit Heater", - "gtceu.machine.uv_assembler.tooltip": "§7Assembly Constructor", - "gtceu.machine.uv_autoclave.tooltip": "§7Encumbrance Unit", - "gtceu.machine.uv_bender.tooltip": "§7Matter Deformer", - "gtceu.machine.uv_brewery.tooltip": "§7Brew Rusher", - "gtceu.machine.uv_canner.tooltip": "§7Can Actuator", - "gtceu.machine.uv_centrifuge.tooltip": "§7Molecular Tornado", - "gtceu.machine.uv_chemical_bath.tooltip": "§7Chemical Dunktron", - "gtceu.machine.uv_chemical_reactor.tooltip": "§7Reaction Catalyzer", - "gtceu.machine.uv_circuit_assembler.tooltip": "§7Computation Factory", - "gtceu.machine.uv_compressor.tooltip": "§7Matter Constrictor", - "gtceu.machine.uv_cutter.tooltip": "§7Object Divider", - "gtceu.machine.uv_distillery.tooltip": "§7Fraction Splitter", - "gtceu.machine.uv_electric_furnace.tooltip": "§7Atom Stimulator", - "gtceu.machine.uv_electrolyzer.tooltip": "§7Atomic Ionizer", - "gtceu.machine.uv_electromagnetic_separator.tooltip": "§7EMF Dispeller", - "gtceu.machine.uv_extractor.tooltip": "§7Liquefying Sucker", - "gtceu.machine.uv_extruder.tooltip": "§7Shape Driver", - "gtceu.machine.uv_fermenter.tooltip": "§7Respiration Controller", - "gtceu.machine.uv_fluid_heater.tooltip": "§7Thermal Imbuer", - "gtceu.machine.uv_fluid_solidifier.tooltip": "§7Fluid Petrificator", - "gtceu.machine.uv_forge_hammer.tooltip": "§7Impact Modulator", - "gtceu.machine.uv_forming_press.tooltip": "§7Surface Shifter", - "gtceu.machine.uv_gas_collector.tooltip": "§7Collects Gas from the solar system depending on the dimension", - "gtceu.machine.uv_laser_engraver.tooltip": "§7Exact Photon Cannon", - "gtceu.machine.uv_lathe.tooltip": "§7Rotation Grinder", - "gtceu.machine.uv_macerator.tooltip": "§7Shape Eliminator", - "gtceu.machine.uv_mass_fabricator.tooltip": "§7Existence Initiator", - "gtceu.machine.uv_mixer.tooltip": "§7Material Homogenizer", - "gtceu.machine.uv_ore_washer.tooltip": "§7Miniature Car Wash", - "gtceu.machine.uv_packer.tooltip": "§7Amazon Warehouse", - "gtceu.machine.uv_polarizer.tooltip": "§7Magnetic Field Rearranger", - "gtceu.machine.uv_replicator.tooltip": "§7Elemental Composer", - "gtceu.machine.uv_rock_crusher.tooltip": "§7Volcanic Formation Chamber", - "gtceu.machine.uv_scanner.tooltip": "§7Electron Microscope", - "gtceu.machine.uv_sifter.tooltip": "§7Pulsation Filter", - "gtceu.machine.uv_thermal_centrifuge.tooltip": "§7Fire Cyclone", - "gtceu.machine.uv_wiremill.tooltip": "§7Wire Transfigurator", - "gtceu.machine.uxv_gas_collector.tooltip": "§7Collects Gas from the solar system depending on the dimension", - "gtceu.machine.uxv_rock_crusher.tooltip": "§7Volcanic Formation Chamber", - "gtceu.machine.vacuum_freezer.tooltip": "Aluminium Ice Box", "gtceu.machine.workbench.storage_note.0": "(Available items from connected", "gtceu.machine.workbench.storage_note.1": "inventories usable for crafting)", "gtceu.machine.workbench.tab.container": "Container", @@ -3207,51 +2757,6 @@ "gtceu.machine.workbench.tab.workbench": "Crafting", "gtceu.machine.workbench.tooltip.0": "Better than Forestry", "gtceu.machine.workbench.tooltip.1": "Has Item Storage, Tool Storage, pulls from adjacent Inventories, and saves Recipes.", - "gtceu.machine.world_accelerator.description": "Tick accelerates nearby blocks in one of 2 modes: §fTile Entity§7 or §fRandom Tick§7. Use Screwdriver to change mode.", - "gtceu.machine.world_accelerator.mode_entity": "Random Tick Mode", - "gtceu.machine.world_accelerator.mode_tile": "Block Entity Mode", - "gtceu.machine.world_accelerator.working_area": "§bWorking Area:", - "gtceu.machine.world_accelerator.working_area_random": " Random Tick Mode:§f %dx%d", - "gtceu.machine.world_accelerator.working_area_tile": " Block Entity Mode:§f Adjacent Blocks", - "gtceu.machine.zpm_alloy_smelter.tooltip": "§7Alloy Integrator", - "gtceu.machine.zpm_arc_furnace.tooltip": "§7Discharge Heater", - "gtceu.machine.zpm_assembler.tooltip": "§7NOT a Crafting Table", - "gtceu.machine.zpm_autoclave.tooltip": "§7Pressure Cooker", - "gtceu.machine.zpm_bender.tooltip": "§7Shape Distorter", - "gtceu.machine.zpm_brewery.tooltip": "§7Brewing your Drinks", - "gtceu.machine.zpm_canner.tooltip": "§7Can Operator", - "gtceu.machine.zpm_centrifuge.tooltip": "§7Molecular Cyclone", - "gtceu.machine.zpm_chemical_bath.tooltip": "§7Chemical Soaker", - "gtceu.machine.zpm_chemical_reactor.tooltip": "§7Chemical Performer", - "gtceu.machine.zpm_circuit_assembler.tooltip": "§7Electronics Manufacturer", - "gtceu.machine.zpm_compressor.tooltip": "§7Singularity Condenser", - "gtceu.machine.zpm_cutter.tooltip": "§7Matter Cleaver", - "gtceu.machine.zpm_distillery.tooltip": "§7Condensation Separator", - "gtceu.machine.zpm_electric_furnace.tooltip": "§7Electron Excitement Processor", - "gtceu.machine.zpm_electrolyzer.tooltip": "§7Molecular Disintegrator E-4908", - "gtceu.machine.zpm_electromagnetic_separator.tooltip": "§7EM Categorizer", - "gtceu.machine.zpm_extractor.tooltip": "§7Vacuum Extractinator", - "gtceu.machine.zpm_extruder.tooltip": "§7Material Displacer", - "gtceu.machine.zpm_fermenter.tooltip": "§7Fermentation Hastener", - "gtceu.machine.zpm_fluid_heater.tooltip": "§7Heat Infuser", - "gtceu.machine.zpm_fluid_solidifier.tooltip": "§7Not an Ice Machine", - "gtceu.machine.zpm_forge_hammer.tooltip": "§7Plate Forger", - "gtceu.machine.zpm_forming_press.tooltip": "§7Object Layerer", - "gtceu.machine.zpm_gas_collector.tooltip": "§7Collects Gas from the atmosphere depending on the dimension", - "gtceu.machine.zpm_laser_engraver.tooltip": "§7With the Power of 32.64 MW", - "gtceu.machine.zpm_lathe.tooltip": "§7Turn-O-Matic L-5908", - "gtceu.machine.zpm_macerator.tooltip": "§7Blend-O-Matic 9003", - "gtceu.machine.zpm_mass_fabricator.tooltip": "§7Genesis Factory", - "gtceu.machine.zpm_mixer.tooltip": "§7Matter Organizer", - "gtceu.machine.zpm_ore_washer.tooltip": "§7Repurposed Laundry-Washer I-362", - "gtceu.machine.zpm_packer.tooltip": "§7Boxinator", - "gtceu.machine.zpm_polarizer.tooltip": "§7Magnetism Inducer", - "gtceu.machine.zpm_replicator.tooltip": "§7Matter Paster", - "gtceu.machine.zpm_rock_crusher.tooltip": "§7Cryogenic Magma Solidifier R-10200", - "gtceu.machine.zpm_scanner.tooltip": "§7Anomaly Detector", - "gtceu.machine.zpm_sifter.tooltip": "§7Sponsored by TFC", - "gtceu.machine.zpm_thermal_centrifuge.tooltip": "§7Blaze Sweatshop T-6352", - "gtceu.machine.zpm_wiremill.tooltip": "§7Ingot Elongator", "gtceu.maintenance.configurable_duration": "Duration: %fx", "gtceu.maintenance.configurable_duration.changed_description": "Recipes will run with %fx duration, applied before overclocking.", "gtceu.maintenance.configurable_duration.modify": "Modify Duration:", @@ -3259,8 +2764,10 @@ "gtceu.maintenance.configurable_time": "Time: %fx", "gtceu.maintenance.configurable_time.changed_description": "Maintenance problems will occur at %fx the normal rate.", "gtceu.maintenance.configurable_time.unchanged_description": "Maintenance problems will occur at normal rate. Change configuration to update.", + "gtceu.medical_condition.antidote.description": "§aAntidote §7Hold Shift to show details", + "gtceu.medical_condition.antidote.description.effect_removed": "Removes %s%% of current conditions' effects", + "gtceu.medical_condition.antidote.description_shift": "§aCures these conditions:", "gtceu.minimap.ore_vein.depleted": "Depleted", - "gtceu.mixer": "Mixer", "gtceu.mode.both": "§dBoth (Fluid And Item)§r", "gtceu.mode.fluid": "§9Fluid§r", "gtceu.mode.item": "§6Item§r", @@ -3283,9 +2790,10 @@ "gtceu.multiblock.central_monitor.width": "Screen Width: %d", "gtceu.multiblock.charcoal_pile.description.0": "Converts logs into Brittle Charcoal in a 9x4x9 area beneath it.", "gtceu.multiblock.charcoal_pile.description.1": "", - "gtceu.multiblock.charcoal_pile.description.2": "The floor of the pit must be made from bricks, and any ground-related block can be used for the walls and roof. No air can be inside the pit.", - "gtceu.multiblock.charcoal_pile.description.3": "", - "gtceu.multiblock.charcoal_pile.description.4": "Larger pits take more time to process logs, but are more efficient.", + "gtceu.multiblock.charcoal_pile.description.2": "The floor of the pit must be made from bricks, and any ground-related block can be used for the walls and roof.", + "gtceu.multiblock.charcoal_pile.description.3": "No air can be inside the pit.", + "gtceu.multiblock.charcoal_pile.description.4": "", + "gtceu.multiblock.charcoal_pile.description.5": "Larger pits take more time to process logs, but are more efficient.", "gtceu.multiblock.cleanroom.clean_amount": "Cleanliness: §a%s%%", "gtceu.multiblock.cleanroom.clean_state": "Status: §aCLEAN", "gtceu.multiblock.cleanroom.dirty_state": "Status: §4CONTAMINATED", @@ -3426,14 +2934,9 @@ "gtceu.multiblock.power_substation.capacity": "§7Capacity: %s §7EU", "gtceu.multiblock.power_substation.passive_drain": "§7Passive Drain: %s §7EU/t", "gtceu.multiblock.power_substation.stored": "§7Stored: %s §7EU", - "gtceu.multiblock.power_substation.time_days": "%s Days", "gtceu.multiblock.power_substation.time_forever": "Forever", - "gtceu.multiblock.power_substation.time_hours": "%s Hours", - "gtceu.multiblock.power_substation.time_minutes": "%s Minutes", - "gtceu.multiblock.power_substation.time_seconds": "%s Seconds", "gtceu.multiblock.power_substation.time_to_drain": "§7Time to drain: %s", "gtceu.multiblock.power_substation.time_to_fill": "§7Time to fill: %s", - "gtceu.multiblock.power_substation.time_years": "%s Years", "gtceu.multiblock.power_substation.under_one_hour_left": "Less than 1 hour until fully drained!", "gtceu.multiblock.preview.rotate": "Click and drag to rotate", "gtceu.multiblock.preview.select": "Right-click to check candidates", @@ -3507,246 +3010,12 @@ "gtceu.oc.tooltip.2": "Right click to decrease the OC", "gtceu.oc.tooltip.3": "Middle click to reset the OC", "gtceu.oc.tooltip.4": "Hold Shift to change by Perfect OC", - "gtceu.ore_washer": "Ore Washer", "gtceu.ownership.name.argonauts": "Argonauts Guild", "gtceu.ownership.name.ftb": "FTB Teams", "gtceu.ownership.name.player": "Player", - "gtceu.packer": "Packer", "gtceu.part_sharing.disabled": "Multiblock Sharing §4Disabled", "gtceu.part_sharing.enabled": "Multiblock Sharing §aEnabled", - "gtceu.placeholder_info.active.0": "Returns a 1 if the block the cover is attached to is currently running a recipe, 0 otherwise.", - "gtceu.placeholder_info.active.1": "Usage:", - "gtceu.placeholder_info.active.2": " {active} -> whether there's a currently running recipe", - "gtceu.placeholder_info.ae2crafting.0": "Returns information about auto-crafting in the ME network of the block this cover is on.", - "gtceu.placeholder_info.ae2crafting.1": "Usage:", - "gtceu.placeholder_info.ae2crafting.10": " {ae2crafting get time} -> the amount of time elapsed from the start of the craft (in nanoseconds), or 0 if the CPU is idle", - "gtceu.placeholder_info.ae2crafting.2": " {ae2crafting get amount} -> the amount of crafting CPUs in the ME network", - "gtceu.placeholder_info.ae2crafting.3": " {ae2crafting get storage} -> the amount of crafting storage the specified CPU has", - "gtceu.placeholder_info.ae2crafting.4": " {ae2crafting get threads} -> the amount of co-processors the specified CPU has", - "gtceu.placeholder_info.ae2crafting.5": " {ae2crafting get name} -> the name of the specified crafting CPU", - "gtceu.placeholder_info.ae2crafting.6": " {ae2crafting get selectionMode} -> the selection mode of the specified crafting CPU (used for manual, automatic or both requests)", - "gtceu.placeholder_info.ae2crafting.7": " {ae2crafting get amount} -> the amount of the item that was requested, or 0 if the CPU is idle", - "gtceu.placeholder_info.ae2crafting.8": " {ae2crafting get item} -> the display name of the item that was requested, or 0 if the CPU is idle", - "gtceu.placeholder_info.ae2crafting.9": " {ae2crafting get progress} -> the crafting job progress, or 0 if the CPU is idle", - "gtceu.placeholder_info.ae2energy.0": "Returns the energy currently stored in the ME network of the block this cover is on.", - "gtceu.placeholder_info.ae2energy.1": "Usage:", - "gtceu.placeholder_info.ae2energy.2": " {ae2energy} -> the energy in the ME network (in AE units)", - "gtceu.placeholder_info.ae2fluidCount.0": "Same as fluidCount, but counts items in the ME network of the block this cover is attached to.", - "gtceu.placeholder_info.ae2fluidCount.1": "Note that counting all fluids may cause lag!", - "gtceu.placeholder_info.ae2fluidCount.2": "Usage:", - "gtceu.placeholder_info.ae2fluidCount.3": " {fluidCount [fluidId]} -> the amount of all fluids, or the fluid with fluidId if specified", - "gtceu.placeholder_info.ae2itemCount.0": "Same as itemCount, but counts items in the ME network of the block this cover is attached to.", - "gtceu.placeholder_info.ae2itemCount.1": "Note that counting by filter or all items may cause lag!", - "gtceu.placeholder_info.ae2itemCount.2": "Usage:", - "gtceu.placeholder_info.ae2itemCount.3": " {itemCount} -> total item amount", - "gtceu.placeholder_info.ae2itemCount.4": " {itemCount } -> amount of items with ids equal to item_id", - "gtceu.placeholder_info.ae2itemCount.5": " {itemCount filter } -> amount of items matching filter in specified slot of this cover", - "gtceu.placeholder_info.ae2maxPower.0": "Returns the energy capacity of the ME network of the block this cover is on.", - "gtceu.placeholder_info.ae2maxPower.1": "Usage:", - "gtceu.placeholder_info.ae2maxPower.2": " {ae2maxPower} -> the energy capacity of the ME network", - "gtceu.placeholder_info.ae2powerUsage.0": "Returns the energy consumption of the ME network of the block this cover is on.", - "gtceu.placeholder_info.ae2powerUsage.1": "Usage:", - "gtceu.placeholder_info.ae2powerUsage.2": " {ae2powerUsage} -> the energy consumption of the ME network", - "gtceu.placeholder_info.ae2spatial.0": "Returns information about spatial I/O in the ME network of the block this cover is on.", - "gtceu.placeholder_info.ae2spatial.1": "Usage:", - "gtceu.placeholder_info.ae2spatial.2": " {ae2spatial power} -> the amount of power required to initiate spatial I/O", - "gtceu.placeholder_info.ae2spatial.3": " {ae2spatial efficiency} -> the efficiency of the Spatial Containment Structure (SPS)", - "gtceu.placeholder_info.ae2spatial.4": " {ae2spatial size} -> the size of the SPS along the specified axis (example: 'Size: {sizeX}x{sizeY}x{sizeZ}')", - "gtceu.placeholder_info.amperage.0": "Returns the amperage in the wire/cable the cover is on.", - "gtceu.placeholder_info.amperage.1": "Usage:", - "gtceu.placeholder_info.amperage.2": " {amperage} -> the amperate in the wire/cable", - "gtceu.placeholder_info.bf.0": "Usage:", - "gtceu.placeholder_info.bf.1": " {bf } -> empty string", - "gtceu.placeholder_info.block.0": "Returns the block symbol (█).", - "gtceu.placeholder_info.block.1": "Usage:", - "gtceu.placeholder_info.block.2": " {block} -> '█'", - "gtceu.placeholder_info.blockNbt.0": "Returns the NBT of the block entity", - "gtceu.placeholder_info.blockNbt.1": "Usage:", - "gtceu.placeholder_info.blockNbt.2": " {blockNbt} -> full block entity nbt", - "gtceu.placeholder_info.blockNbt.3": " {blockNbt [key1] [key2] ...} -> part of the nbt", - "gtceu.placeholder_info.bufferText.0": "Returns the text from a buffer accessible by ComputerCraft", - "gtceu.placeholder_info.bufferText.1": "Usage:", - "gtceu.placeholder_info.bufferText.2": " {bufferText } -> text from the buffer on the specified line (line is 1-100)", - "gtceu.placeholder_info.calc.0": "Returns the result of a math function or operation.", - "gtceu.placeholder_info.calc.1": "Usage:", - "gtceu.placeholder_info.calc.2": " {calc } -> any_string", - "gtceu.placeholder_info.calc.3": " {calc } -> the result of the specified operation", - "gtceu.placeholder_info.calc.4": " {calc <+|-|*|/|//|>>|<<|%> } -> the result of the specified operation", - "gtceu.placeholder_info.click.0": "Returns whether the targeted advanced monitor was clicked before the current tick", - "gtceu.placeholder_info.click.1": "Usage:", - "gtceu.placeholder_info.click.2": " {click} -> \"1\" if the targeted advanced monitor was clicked, \"0\" otherwise", - "gtceu.placeholder_info.click.3": " {click x} -> the x position of the last click (between 0 and 1)", - "gtceu.placeholder_info.click.4": " {click y} -> the y position of the last click (between 0 and 1)", - "gtceu.placeholder_info.cmd.0": "Executes Minecraft commands and returns their output.", - "gtceu.placeholder_info.cmd.1": "Requires a data item bound to a player, bind any data item to yourself by right-clicking with it.", - "gtceu.placeholder_info.cmd.2": "Usage:", - "gtceu.placeholder_info.cmd.3": " {cmd } -> command output", - "gtceu.placeholder_info.cmp.0": "Returns a 1 or 0 based on the expression in it's arguments", - "gtceu.placeholder_info.cmp.1": "Usage:", - "gtceu.placeholder_info.cmp.2": " {cmp } -> 1 or 0, operator is one of >, <, >=, <=, ==, !=", - "gtceu.placeholder_info.color.0": "Returns the text from the second argument, colored with the color from the first argument. All default minecraft chat colors can be used.", - "gtceu.placeholder_info.color.1": "Usage:", - "gtceu.placeholder_info.color.2": " {color } -> colored text", - "gtceu.placeholder_info.combine.0": "Combines all of it's arguments into a single string (by escaping all spaces between the arguments)", - "gtceu.placeholder_info.combine.1": "Example: {combine abc def ghi jkl mno} -> \"abc\\ def\\ ghi\\ jkl\\ mno\"", - "gtceu.placeholder_info.combine.2": "Usage:", - "gtceu.placeholder_info.combine.3": " {combine [arg1] [arg2] [arg3] ...} -> a string that will be treated as a single argument in further placeholders", - "gtceu.placeholder_info.count.0": "Returns how many of the provided arguments are equal to the first (compared as strings, so \"0\" != \"0.0\")", - "gtceu.placeholder_info.count.1": "Usage:", - "gtceu.placeholder_info.count.2": " {count [arg2] [arg3] [arg4] ...} -> the amount of arguments that are equal to the first", - "gtceu.placeholder_info.data.0": "Stores or retrieves some data from a data item (data stick/orb/module) in one of the slots.", - "gtceu.placeholder_info.data.1": "If you leave the argument empty, it will be replaced with the value p (p is an integer from 0 to (capacity - 1) that is stored in the data item nbt).", - "gtceu.placeholder_info.data.2": "If the slot argument is equal to 0, this placeholder will manipulate the data stick that is currently targeted by this text module inside a data hatch.", - "gtceu.placeholder_info.data.3": "Usage:", - "gtceu.placeholder_info.data.4": " {data get } -> the data stored in the item in the specified slot", - "gtceu.placeholder_info.data.5": " {data set } -> sets the data stored in the item in the specified slot, returns an empty string", - "gtceu.placeholder_info.data.6": " {data getp } -> p", - "gtceu.placeholder_info.data.7": " {data setp } -> sets p, returns an empty string", - "gtceu.placeholder_info.data.8": " {data inc } -> increments p by 1, if p becomes more than or equal to capacity, sets p to 0", - "gtceu.placeholder_info.data.9": " {data dec } -> decrements p by 1, if p becomes less than 0, sets p to (capacity - 1)", - "gtceu.placeholder_info.displayTarget.0": "Returns the specified line that was transmitted to this cover using a display link.", - "gtceu.placeholder_info.displayTarget.1": "Usage:", - "gtceu.placeholder_info.displayTarget.2": " {displayTarget } -> the text on the specified line (line number is 1-100)", - "gtceu.placeholder_info.ender.0": "Interacts with ender link covers", - "gtceu.placeholder_info.ender.1": "Can interact with private channels if provided with a data item bound to a player", - "gtceu.placeholder_info.ender.10": "The player_data_item_slot argument may be left empty (not 0, empty string)", - "gtceu.placeholder_info.ender.2": "Usage:", - "gtceu.placeholder_info.ender.3": " {ender item [player_data_item_slot]} -> item count", - "gtceu.placeholder_info.ender.4": " {ender itemPull [player_data_item_slot]} -> pull 1 item from the ender link's buffer", - "gtceu.placeholder_info.ender.5": " {ender itemPush [player_data_item_slot]} -> push 1 item to the ender link's buffer", - "gtceu.placeholder_info.ender.6": " {ender itemId [player_data_item_slot]} -> the id of the item in the ender link's buffer (ex. \"26 minecraft:dirt\")", - "gtceu.placeholder_info.ender.7": " {ender fluid [player_data_item_slot]} -> fluid count", - "gtceu.placeholder_info.ender.8": " {ender redstone [player_data_item_slot] -> redstone signal level", - "gtceu.placeholder_info.ender.9": " {ender redstone -> sets the redstone signal outputed to the ender redstone link, returns empty string", - "gtceu.placeholder_info.energy.0": "Returns the amount of energy stored.", - "gtceu.placeholder_info.energy.1": "Usage:", - "gtceu.placeholder_info.energy.2": " {energy} -> the amount of energy stored", - "gtceu.placeholder_info.energyCapacity.0": "Returns the max amount of energy that can be stored", - "gtceu.placeholder_info.energyCapacity.1": "Usage:", - "gtceu.placeholder_info.energyCapacity.2": "{energyCapacity} -> the energy capacity", - "gtceu.placeholder_info.eval.0": "Returns the result of evaluating the provided string which may placeholders", - "gtceu.placeholder_info.eval.1": "Usage:", - "gtceu.placeholder_info.eval.2": " {eval abcdefg} -> abcdefg", - "gtceu.placeholder_info.eval.3": " {eval \"repeating a: {repeat 5 \\\"a \\\"}\" -> repeating a: a a a a a ", - "gtceu.placeholder_info.eval.4": " {eval \\\"\"{some random text}\"\\\" -> {some random text}", - "gtceu.placeholder_info.eval.5": " {eval \"text \"\\\"\"{something with spaces}\"\\\"\" more text\" -> text {something with spaces} more text", - "gtceu.placeholder_info.fluidCount.0": "Returns the amount of fluids (can be filtered).", - "gtceu.placeholder_info.fluidCount.1": "Usage:", - "gtceu.placeholder_info.fluidCount.2": " {fluidCount [fluidId]} -> the amount of all fluids, or the fluid with fluidId if specified", - "gtceu.placeholder_info.formatInt.0": "Returns a string representation of the provided integer", - "gtceu.placeholder_info.formatInt.1": "Example: {formatInt 1236457} -> 1.24M", - "gtceu.placeholder_info.formatInt.2": "Usage:", - "gtceu.placeholder_info.formatInt.3": " {formatInt } -> string representation of the int", - "gtceu.placeholder_info.fromAscii.0": "Returns the character represented by the provided ASCII code", - "gtceu.placeholder_info.fromAscii.1": "Usage:", - "gtceu.placeholder_info.fromAscii.2": " {fromAscii } -> a character", - "gtceu.placeholder_info.if.0": "Returns one of the arguments depending on the condition. The condition is considered true if it is not an empty string and is not equal to 0.", - "gtceu.placeholder_info.if.1": "Usage:", - "gtceu.placeholder_info.if.2": " {if [returned_if_false]}", - "gtceu.placeholder_info.item.0": "Returns the amount and id of the item in a specified slot", - "gtceu.placeholder_info.item.1": "Usage:", - "gtceu.placeholder_info.item.2": " {item } -> \"31 minecraft:diamond\" (for example)", - "gtceu.placeholder_info.itemCount.0": "Returns the amount of items (can be filtered).", - "gtceu.placeholder_info.itemCount.1": "Usage:", - "gtceu.placeholder_info.itemCount.2": " {itemCount} -> total item amount", - "gtceu.placeholder_info.itemCount.3": " {itemCount } -> amount of items with ids equal to item_id", - "gtceu.placeholder_info.itemCount.4": " {itemCount filter } -> amount of items matching filter in specified slot of this cover", - "gtceu.placeholder_info.maintenance.0": "Returns a 1 if there are maintenance problems in the block the cover is attached to, 0 otherwise.", - "gtceu.placeholder_info.maintenance.1": "Example: 'Maintenance status: {if {maintenance} FIXING\\ REQUIRED OK}'", - "gtceu.placeholder_info.maintenance.2": "Usage:", - "gtceu.placeholder_info.maintenance.3": " {maintenance} -> whether there are maintenance problems", - "gtceu.placeholder_info.maxProgress.0": "Returns the maximum progress of the currently running recipe of the block this cover is attached to.", - "gtceu.placeholder_info.maxProgress.1": "Example: 'Progress: {calc {calc {progress} / {maxProgress}} * 100}%'", - "gtceu.placeholder_info.maxProgress.2": "Usage:", - "gtceu.placeholder_info.maxProgress.3": " {maxProgress} -> the max progress of the currently running recipe", - "gtceu.placeholder_info.module.0": "Renders the module in the specified slot onto the central monitor (does not work in a cover)", - "gtceu.placeholder_info.module.1": "Usage:", - "gtceu.placeholder_info.module.2": " {module } -> empty string", - "gtceu.placeholder_info.nbt.0": "Returns the nbt data of the item in the specified slot", - "gtceu.placeholder_info.nbt.1": "Usage:", - "gtceu.placeholder_info.nbt.2": " {nbt [key1] [key2] [key3] ...} -> item_nbt[key1][key2][key3][...]", - "gtceu.placeholder_info.obf.0": "Returns the text from the first argument, obfuscated.", - "gtceu.placeholder_info.obf.1": "Usage:", - "gtceu.placeholder_info.obf.2": " {obf } -> obfuscated text", - "gtceu.placeholder_info.previousText.0": "Returns the text that was previously displayed by this cover at the specified line (before line-wrapping).", - "gtceu.placeholder_info.previousText.1": "Usage:", - "gtceu.placeholder_info.previousText.2": " {previousText } -> the text previously displayed on the specified line (index starts at 1)", - "gtceu.placeholder_info.progress.0": "Returns the progress of the currently running recipe of the block this cover is attached to.", - "gtceu.placeholder_info.progress.1": "Note that progress is an integer between 0 and {maxProgress}", - "gtceu.placeholder_info.progress.2": "Usage:", - "gtceu.placeholder_info.progress.3": " {progress} -> the progress of the currently running recipe", - "gtceu.placeholder_info.quad.0": "Draws a quad (must specify parameters for all 4 vertices)", - "gtceu.placeholder_info.quad.1": "Usage:", - "gtceu.placeholder_info.quad.2": " {quad } -> empty string", - "gtceu.placeholder_info.random.0": "Returns a random number in the specified interval (inclusive).", - "gtceu.placeholder_info.random.1": "Usage:", - "gtceu.placeholder_info.random.2": " {random } -> a random number between min and max (inclusive)", - "gtceu.placeholder_info.rect.0": "Draws a rectangle at the specified position with the specified coordinates and size", - "gtceu.placeholder_info.rect.1": "Usage:", - "gtceu.placeholder_info.rect.2": " {rect } -> empty string", - "gtceu.placeholder_info.rect.3": " {rect 0.5 0.25 2 1 0xFFFFFFFF} -> draws a white rectangle at (0.5, 0.25) with the size (2, 1)", - "gtceu.placeholder_info.redstone.0": "Returns the redstone signal strength or sets the redstone output strength", - "gtceu.placeholder_info.redstone.1": "Usage:", - "gtceu.placeholder_info.redstone.2": " {redstone get } -> redstone signal strength (0-15) at the specified side", - "gtceu.placeholder_info.redstone.3": " {redstone get link } -> redstone signal strength of a Create redstone link frequency specified by a linked controller in slot #slot_index. freq_slot_index is the index of the frequency inside the controller (from left to right, 0-6)", - "gtceu.placeholder_info.redstone.4": " {redstone set } -> empty string, sets the redstone output strength from this cover's side", - "gtceu.placeholder_info.redstone.5": " {redstone set link } -> empty string, broadcasts the specified redstone power on the specified Create redstone link frequency", - "gtceu.placeholder_info.repeat.0": "Returns the text from the second arguments, repeated the amount of times specified in the first argument.", - "gtceu.placeholder_info.repeat.1": "Usage:", - "gtceu.placeholder_info.repeat.2": " {repeat } -> text repeated the specified amount of times", - "gtceu.placeholder_info.select.0": "Returns the argument at the specified index (starting from 0)", - "gtceu.placeholder_info.select.1": "Usage:", - "gtceu.placeholder_info.select.2": " {select [arg1] [arg2] [arg3] ... -> argument at the specified index", - "gtceu.placeholder_info.setImage.0": "Sets the image URL in an image module in the specified slot", - "gtceu.placeholder_info.setImage.1": "Usage:", - "gtceu.placeholder_info.setImage.2": " {setImage } -> empty string", - "gtceu.placeholder_info.setTargetSlot.0": "Sets the index of the targeted data hatch slot.", - "gtceu.placeholder_info.setTargetSlot.1": "The change will take effect immediately after this placeholder executes.", - "gtceu.placeholder_info.setTargetSlot.2": "(Further placeholders will reference the new target)", - "gtceu.placeholder_info.setTargetSlot.3": "Usage:", - "gtceu.placeholder_info.setTargetSlot.4": " {setTargetSlot } -> empty string", - "gtceu.placeholder_info.strike.0": "Returns the text from the first text, displaying it as if it was crossed out", - "gtceu.placeholder_info.strike.1": "Usage:", - "gtceu.placeholder_info.strike.2": " {strike } -> crossed-out text", - "gtceu.placeholder_info.subList.0": "Returns arguments from with indexes from l (inclusive) to r (exclusive) (starting from 0)", - "gtceu.placeholder_info.subList.1": "Usage:", - "gtceu.placeholder_info.subList.2": " {subList [arg0] [arg1] ...} -> all arguments with indexes from l to r separated by spaces", - "gtceu.placeholder_info.targetSlot.0": "Returns the index of the targeted data hatch slot", - "gtceu.placeholder_info.targetSlot.1": "Usage:", - "gtceu.placeholder_info.targetSlot.2": " {targetSlot} -> (from 1 to 4/9/16)", - "gtceu.placeholder_info.tick.0": "Returns the amount of ticks passed from when this cover was placed.", - "gtceu.placeholder_info.tick.1": "Usage:", - "gtceu.placeholder_info.tick.2": " {tick} -> the amount of ticks", - "gtceu.placeholder_info.tm.0": "Returns the ™ symbol", - "gtceu.placeholder_info.tm.1": "Usage:", - "gtceu.placeholder_info.tm.2": " {tm} -> the ™ symbol", - "gtceu.placeholder_info.toAscii.0": "Returns the ASCII code of the provided character", - "gtceu.placeholder_info.toAscii.1": "Usage:", - "gtceu.placeholder_info.toAscii.2": " {toAscii } -> ASCII code of the character", - "gtceu.placeholder_info.toChars.0": "Returns the characters of the provided string with spaces between them", - "gtceu.placeholder_info.toChars.1": "Example: {toChars example} -> 'e x a m p l e'", - "gtceu.placeholder_info.toChars.2": "Usage:", - "gtceu.placeholder_info.toChars.3": " {toChars } -> characters", - "gtceu.placeholder_info.underline.0": "Returns the text from the first argument, underlined", - "gtceu.placeholder_info.underline.1": "Usage:", - "gtceu.placeholder_info.underline.2": " {underline } -> underlined text", - "gtceu.placeholder_info.voltage.0": "Returns the voltage in the wire/cable the cover is on.", - "gtceu.placeholder_info.voltage.1": "Usage:", - "gtceu.placeholder_info.voltage.2": " {voltage} -> the voltage in the wire/cable", - "gtceu.plasma_generator": "Plasma Generator", - "gtceu.polarizer": "Polarizer", - "gtceu.primitive_blast_furnace": "Primitive Blast Furnace", - "gtceu.provider.computer_monitor_cover.error.no_target": "No target selected for the monitor group", - "gtceu.pyrolyse_oven": "Pyrolyse Oven", "gtceu.recipe.byproduct_tier": "Byproducts from %s§r+", - "gtceu.recipe.category.arc_furnace_recycling": "Arc Scrapping", - "gtceu.recipe.category.chem_dyes": "Chemical Dyeing", - "gtceu.recipe.category.extractor_recycling": "Scrap Remelting", - "gtceu.recipe.category.ingot_molding": "Metal Molding", - "gtceu.recipe.category.macerator_recycling": "Part Grinding", - "gtceu.recipe.category.ore_bathing": "Ore Treating", - "gtceu.recipe.category.ore_crushing": "Ore Grinding", - "gtceu.recipe.category.ore_forging": "Ore Crushing", "gtceu.recipe.chance": "Chance: %s +%s/tier", "gtceu.recipe.cleanroom": "Requires %s", "gtceu.recipe.cleanroom.display_name": "Cleanroom", @@ -3777,109 +3046,16 @@ "gtceu.recipe_logic.insufficient_out": "Insufficient Outputs", "gtceu.recipe_logic.no_capabilities": "Machine has no Capabilities", "gtceu.recipe_logic.no_contents": "Recipe has no Contents", - "gtceu.recipe_logic.recipe_waiting": "Recipe Waiting: ", - "gtceu.recipe_logic.setup_fail": "Fail to setup recipe: ", "gtceu.recipe_memory_widget.tooltip.0": "§7Left click to automatically input this recipe into the crafting grid", "gtceu.recipe_memory_widget.tooltip.1": "§7Shift click to lock/unlock this recipe", - "gtceu.recipe_modifier.coil_temperature_too_low": "Coil Temperature Too Low", - "gtceu.recipe_modifier.default_fail": "Recipe Modifier Fail", - "gtceu.recipe_modifier.insufficient_eu_to_start_fusion": "Insufficient Energy to Initiate Fusion Reaction", - "gtceu.recipe_modifier.insufficient_voltage": "Voltage Tier Too Low", "gtceu.recipe_type.show_recipes": "Show Recipes", "gtceu.rei.group.potion_fluids": "Potion Fluids", - "gtceu.research_station": "Research Station", - "gtceu.rock_breaker": "Rock Breaker", - "gtceu.scanner": "Scanner", "gtceu.scanner.copy_stick_empty": "§oEmpty Stick", "gtceu.scanner.copy_stick_from": "§oStick to Copy", "gtceu.scanner.copy_stick_to": "§oCopy of Stick", - "gtceu.sifter": "Sifter", - "gtceu.steam_boiler": "Steam Boiler", - "gtceu.steam_turbine": "Steam Turbine", - "gtceu.subtitle.arc": "Arcs buzzing", - "gtceu.subtitle.assembler": "Assembler constructing", - "gtceu.subtitle.bath": "Bath fizzing", - "gtceu.subtitle.boiler": "Boiler heating", - "gtceu.subtitle.centrifuge": "Centrifuge spinning", - "gtceu.subtitle.chainsaw": "Chainsaw revving", - "gtceu.subtitle.chemical": "Chemical bubbling", - "gtceu.subtitle.combustion": "Combusting", - "gtceu.subtitle.compressor": "Compressor squeezing", - "gtceu.subtitle.computation": "Computer beeps", - "gtceu.subtitle.cooling": "Freezer humming", - "gtceu.subtitle.cut": "Cutter whirring", - "gtceu.subtitle.drill": "Drilling", - "gtceu.subtitle.electrolyzer": "Electrolyzer sparking", - "gtceu.subtitle.file": "File rasping", - "gtceu.subtitle.fire": "Fire crackling", - "gtceu.subtitle.forge_hammer": "Forge Hammer thumping", - "gtceu.subtitle.furnace": "Furnace heating", - "gtceu.subtitle.jet_engine": "Jet roaring", - "gtceu.subtitle.macerator": "Macerator crushing", - "gtceu.subtitle.metal_pipe": "Destruction_Metal_Pole_L_Wave_2_0_0.wav", - "gtceu.subtitle.miner": "Miner excavating", - "gtceu.subtitle.mixer": "Mixer sloshing", - "gtceu.subtitle.mortar": "Mortar crushing", - "gtceu.subtitle.motor": "Motor humming", - "gtceu.subtitle.plunger": "Plunger popping", - "gtceu.subtitle.portable_scanner": "Scanning", - "gtceu.subtitle.portal_closing": "Portal closes", - "gtceu.subtitle.portal_opening": "Portal opens", - "gtceu.subtitle.replicator": "Replicator copying", - "gtceu.subtitle.saw": "Sawing", - "gtceu.subtitle.science": "s c i e n c e", - "gtceu.subtitle.screwdriver": "Screwing", - "gtceu.subtitle.soft_hammer": "Soft tap", - "gtceu.subtitle.spray_can": "Spraying", - "gtceu.subtitle.sus": "Sus...", - "gtceu.subtitle.turbine": "Turbine whizzing", - "gtceu.subtitle.wirecutter": "Wire snipped", - "gtceu.subtitle.wrench": "Wrench rattling", - "gtceu.thermal_centrifuge": "Thermal Centrifuge", - "gtceu.tool.class.axe": "Axe", - "gtceu.tool.class.butchery_knife": "Butchery Knife", - "gtceu.tool.class.crowbar": "Crowbar", - "gtceu.tool.class.drill": "Drill", - "gtceu.tool.class.file": "File", - "gtceu.tool.class.hammer": "Hammer", - "gtceu.tool.class.hoe": "Hoe", - "gtceu.tool.class.knife": "Knife", - "gtceu.tool.class.mallet": "Soft Mallet", - "gtceu.tool.class.mining_hammer": "Mining Hammer", - "gtceu.tool.class.mortar": "Mortar", - "gtceu.tool.class.pickaxe": "Pickaxe", - "gtceu.tool.class.plunger": "Plunger", - "gtceu.tool.class.rolling_pin": "Rolling Pin", - "gtceu.tool.class.saw": "Saw", - "gtceu.tool.class.screwdriver": "Screwdriver", - "gtceu.tool.class.scythe": "Scythe", - "gtceu.tool.class.shears": "Shears", - "gtceu.tool.class.shovel": "Shovel", - "gtceu.tool.class.spade": "Spade", - "gtceu.tool.class.sword": "Sword", - "gtceu.tool.class.wire_cutter": "Wire Cutter", - "gtceu.tool.class.wrench": "Wrench", - "gtceu.tool_action.crowbar": "§8Use Crowbar to remove Covers", - "gtceu.tool_action.hammer": "§8Use Hard Hammer to muffle Sounds", - "gtceu.tool_action.screwdriver.access_covers": "§8Use Screwdriver to access Covers", - "gtceu.tool_action.screwdriver.auto_collapse": "§8Use Screwdriver to toggle Item collapsing", - "gtceu.tool_action.screwdriver.auto_output": "§8Use Screwdriver to toggle Auto-Output", - "gtceu.tool_action.screwdriver.auto_output_covers": "§8Use Screwdriver to Allow Input from Output Side or access Covers", - "gtceu.tool_action.screwdriver.toggle_mode": "§8Use Screwdriver to toggle Modes", - "gtceu.tool_action.screwdriver.toggle_mode_covers": "§8Use Screwdriver to toggle Modes or access Covers", - "gtceu.tool_action.show_tooltips": "Hold SHIFT to show Tool Info", - "gtceu.tool_action.soft_mallet.reset": "§8Use Soft Mallet to toggle Working", - "gtceu.tool_action.soft_mallet.toggle_mode": "§8Use Soft Mallet to toggle Modes", - "gtceu.tool_action.tape": "§8Use Tape to fix Maintenance Problems", - "gtceu.tool_action.wire_cutter.connect": "§8Use Wire Cutters to set Connections", - "gtceu.tool_action.wrench.connect": "§8Use Wrench to set Connections, sneak to block Connections", - "gtceu.tool_action.wrench.set_facing": "§8Use Wrench to set Facing", - "gtceu.tooltip.computer_monitor_config": "Storing computer monitor cover configuration data", - "gtceu.tooltip.computer_monitor_data": "Storing data: %s", "gtceu.tooltip.fluid_pipe_hold_shift": "§7Hold SHIFT to show Fluid Containment Info", "gtceu.tooltip.hold_ctrl": "§7Hold CTRL for more info", "gtceu.tooltip.hold_shift": "§7Hold SHIFT for more info", - "gtceu.tooltip.player_bind": "Bound to player: %s", "gtceu.tooltip.potion.each": "%s %s §7for§r %s §7ticks with a§r %s%% §7chance of happening§r", "gtceu.tooltip.potion.header": "§6Contains effects:", "gtceu.tooltip.proxy_bind": "§fBinding to a Pattern Buffer at %s %s %s", @@ -3887,7 +3063,6 @@ "gtceu.tooltip.status.trinary.true": "True", "gtceu.tooltip.status.trinary.unknown": "Unknown", "gtceu.tooltip.tool_fluid_hold_shift": "§7Hold SHIFT to show Fluid Containment and Tool Info", - "gtceu.tooltip.wireless_transmitter_bind": "Binding to a transmitter cover at %s %s %s facing %s in %s", "gtceu.top.allow_output_input": "Allow Input", "gtceu.top.auto_output": "Auto Output", "gtceu.top.buffer_bound_pos": "Bound To - X: %s, Y: %s, Z: %s", @@ -3988,8 +3163,6 @@ "gtceu.universal.tooltip.working_area_chunks": "§bWorking Area: §f%dx%d Chunks", "gtceu.universal.tooltip.working_area_chunks_max": "§bMax Working Area: §f%dx%d Chunks", "gtceu.universal.tooltip.working_area_max": "§bMax Working Area: §f%dx%d", - "gtceu.vacuum_freezer": "Vacuum Freezer", - "gtceu.wiremill": "Wiremill", "gui.gtceu.refund_all.desc": "Return Stored Contents to AE2", "gui.gtceu.rename.desc": "Rename Pattern Buffer", "gui.gtceu.share_inventory.desc.0": "Shares inserted items with all patterns within buffer!", @@ -3999,7 +3172,32 @@ "gui.gtceu.share_tank.title": "Shared Tank Inventory", "gui.widget.incrementButton.default_tooltip": "Hold Shift, Ctrl or both to change the amount", "gui.widget.recipeProgressWidget.default_tooltip": "Show Recipes", - "item.glass_lens": "Glass Lens (White)", + "item.behavior.mode_switch.current_mode": "Mode: %s", + "item.behavior.mode_switch.mode_switched": "§eMode Set to: %s", + "item.behavior.mode_switch.tooltip": "Use while sneaking to switch mode", + "item.clipboard.tooltip": "Can be written on (without any writing Instrument). Right-click on Wall to place, and Shift-Right-Click to remove", + "item.cover.digital.mode.energy.disabled": "Click to enable Energy Mode", + "item.cover.digital.mode.energy.enabled": "Energy Mode enabled", + "item.cover.digital.mode.fluid.disabled": "Click to enable Fluid Mode", + "item.cover.digital.mode.fluid.enabled": "Fluid Mode enabled", + "item.cover.digital.mode.item.disabled": "Click to enable Item Mode", + "item.cover.digital.mode.item.enabled": "Item Mode enabled", + "item.cover.digital.mode.machine.disabled": "Click to enable Machine Mode", + "item.cover.digital.mode.machine.enabled": "Machine Mode enabled", + "item.cover.digital.mode.proxy.disabled": "Click to enable Proxy Mode", + "item.cover.digital.mode.proxy.enabled": "Proxy Mode enabled", + "item.cover.digital.tooltip": "Connects machines over §fPower Cables§7 to the §fCentral Monitor§7 as §fCover§7.", + "item.cover.digital.wireless.tooltip.0": "§fWirelessly§7 connects machines to the §fCentral Monitor§7 as §fCover§7.", + "item.cover.digital.wireless.tooltip.1": "§fRight Click§7 on the §fCentral Monitor§7 to remotely bind to it.", + "item.cover.digital.wireless.tooltip.2": "§fSneak Right Click§7 to remove the current binding.", + "item.cover.digital.wireless.tooltip.3": "§aBinding: §f%s", + "item.debug_scanner.tooltip": "Tricorder", + "item.electric.discharge_mode.disabled": "§eDischarge Mode Disabled", + "item.electric.discharge_mode.enabled": "§eDischarge Mode Enabled", + "item.electric.discharge_mode.tooltip": "Use while sneaking to toggle discharge mode", + "item.generic.electric_item.stored": "%d/%d EU (%s)", + "item.generic.electric_item.tooltip": "%d/%d EU - Tier %s", + "item.generic.fluid_container.tooltip": "%d/%dL %s", "item.gtceu.activity_detector_cover": "Activity Detector", "item.gtceu.activity_detector_cover.tooltip": "§7Gives out §fActivity Status§7 as Redstone as §fCover§7.", "item.gtceu.advanced_activity_detector_cover": "Advanced Activity Detector", @@ -4057,11 +3255,8 @@ "item.gtceu.basic_integrated_circuit.tooltip.1": "§6LV-Tier Circuit", "item.gtceu.basic_tape": "Tape", "item.gtceu.basic_tape.tooltip": "§7Not strong enough for mechanical issues\nCan be used to pick up crates without dropping their items", - "item.gtceu.battery.charge_detailed": "%s/%s EU§7 - Tier %s §7(%s/%s %s remaining§7)", + "item.gtceu.battery.charge_detailed": "%s/%s EU§7 - Tier %s §7(%s/%s remaining§7)", "item.gtceu.battery.charge_time": "§aHolds %s %s of Power (%s)", - "item.gtceu.battery.charge_unit.hour": "hours", - "item.gtceu.battery.charge_unit.minute": "minutes", - "item.gtceu.battery.charge_unit.second": "seconds", "item.gtceu.bentonite_dust": "Bentonite", "item.gtceu.bio_chaff": "Bio Chaff", "item.gtceu.black_dye_spray_can": "Spray Can (Black)", @@ -4254,6 +3449,7 @@ "item.gtceu.gelled_toluene": "Gelled Toluene", "item.gtceu.gelled_toluene.tooltip": "§7Raw Explosive", "item.gtceu.glass_gem": "Glass Crystal", + "item.gtceu.glass_lens": "Glass Lens (White)", "item.gtceu.glass_plate": "Glass Pane", "item.gtceu.glass_tube": "Glass Tube", "item.gtceu.glass_vial": "%s Glass Vial", @@ -4380,6 +3576,7 @@ "item.gtceu.lime_dye_spray_can": "Spray Can (Lime)", "item.gtceu.lime_glass_lens": "Glass Lens (Lime)", "item.gtceu.liquid_fuel_jetpack": "Liquid Fuel Jetpack", + "item.gtceu.liquid_fuel_jetpack.tooltip": "§7Uses Combustion Generator Fuels for Thrust", "item.gtceu.long_treated_wood_rod": "Long Treated Wood Stick", "item.gtceu.long_wood_rod": "Long Wood Stick", "item.gtceu.lpic_chip": "LPIC Chip", @@ -4518,6 +3715,7 @@ "item.gtceu.naquadah_boule.tooltip": "§7Raw Circuit", "item.gtceu.naquadah_wafer": "Naquadah-doped Wafer", "item.gtceu.naquadah_wafer.tooltip": "§7Raw Circuit", + "item.gtceu.nether_quartz_netherrack": "Nether Quartz Ore", "item.gtceu.neuro_processing_unit": "Neuro Processing Unit", "item.gtceu.neuro_processing_unit.tooltip": "§7Neuro CPU", "item.gtceu.neutron_reflector": "Iridium Neutron Reflector", @@ -4750,7 +3948,8 @@ "item.gtceu.storage_cover": "Storage Cover", "item.gtceu.sugar_gem": "Sugar Cube", "item.gtceu.sus_record": "Music Disc", - "item.gtceu.sus_record.desc": "§7sussy!", + "item.gtceu.sus_record.desc": "§7Leonz - Among Us Drip", + "item.gtceu.sus_record.tooltip": "§7sussy!", "item.gtceu.sword_extruder_mold.tooltip": "§7Extruder Shape for making Swords", "item.gtceu.tag_filter.tooltip.0": "§7Filters §fItem§7 I/O with §fTag§7 as §fCover§7.", "item.gtceu.tag_filter.tooltip.1": "Can be used as a §fConveyor Module§7 and §fRobotic Arm§7 upgrade.", @@ -4824,19 +4023,35 @@ "item.gtceu.tool.butchery_knife.tooltip": "§8Has a slow Attack Rate", "item.gtceu.tool.buzzsaw": "%s Buzzsaw (LV)", "item.gtceu.tool.buzzsaw.tooltip": "§8Not suitable for harvesting Blocks", + "item.gtceu.tool.class.axe": "Axe", + "item.gtceu.tool.class.butchery_knife": "Butchery Knife", + "item.gtceu.tool.class.crowbar": "Crowbar", + "item.gtceu.tool.class.drill": "Drill", + "item.gtceu.tool.class.file": "File", + "item.gtceu.tool.class.hammer": "Hammer", + "item.gtceu.tool.class.hoe": "Hoe", + "item.gtceu.tool.class.knife": "Knife", + "item.gtceu.tool.class.mallet": "Soft Mallet", + "item.gtceu.tool.class.mining_hammer": "Mining Hammer", + "item.gtceu.tool.class.mortar": "Mortar", + "item.gtceu.tool.class.pickaxe": "Pickaxe", + "item.gtceu.tool.class.plunger": "Plunger", + "item.gtceu.tool.class.rolling_pin": "Rolling Pin", + "item.gtceu.tool.class.saw": "Saw", + "item.gtceu.tool.class.screwdriver": "Screwdriver", + "item.gtceu.tool.class.scythe": "Scythe", + "item.gtceu.tool.class.shears": "Shears", + "item.gtceu.tool.class.shovel": "Shovel", + "item.gtceu.tool.class.spade": "Spade", + "item.gtceu.tool.class.sword": "Sword", + "item.gtceu.tool.class.wire_cutter": "Wire Cutter", + "item.gtceu.tool.class.wrench": "Wrench", "item.gtceu.tool.crowbar": "%s Crowbar", "item.gtceu.tool.crowbar.tooltip": "§8Dismounts Covers", "item.gtceu.tool.ev_drill": "%s Drill (EV)", "item.gtceu.tool.file": "%s File", "item.gtceu.tool.hammer": "%s Hammer", "item.gtceu.tool.hammer.tooltip": "§8Crushes Blocks when harvesting them", - "item.gtceu.tool.harvest_level.0": "§8Wood", - "item.gtceu.tool.harvest_level.1": "§7Stone", - "item.gtceu.tool.harvest_level.2": "§aIron", - "item.gtceu.tool.harvest_level.3": "§bDiamond", - "item.gtceu.tool.harvest_level.4": "§dNetherite", - "item.gtceu.tool.harvest_level.5": "§9Duranium", - "item.gtceu.tool.harvest_level.6": "§cNeutronium", "item.gtceu.tool.hoe": "%s Hoe", "item.gtceu.tool.hv_chainsaw": "%s Chainsaw (HV)", "item.gtceu.tool.hv_drill": "%s Drill (HV)", @@ -4873,7 +4088,6 @@ "item.gtceu.tool.pickaxe": "%s Pickaxe", "item.gtceu.tool.plunger": "%s Plunger", "item.gtceu.tool.plunger.tooltip": "§8Removes Fluids from Machines", - "item.gtceu.tool.replace_tool_head": "Craft with a new Tool Head to replace it", "item.gtceu.tool.rolling_pin": "%s Rolling Pin", "item.gtceu.tool.saw": "%s Saw", "item.gtceu.tool.screwdriver": "%s Screwdriver", @@ -4885,18 +4099,7 @@ "item.gtceu.tool.spade": "%s Spade", "item.gtceu.tool.spade.tooltip": "§8Mines a large area at once (unless you're crouching)", "item.gtceu.tool.sword": "%s Sword", - "item.gtceu.tool.tooltip.attack_damage": "%s §cAttack Damage", - "item.gtceu.tool.tooltip.attack_speed": "%s §9Attack Speed", - "item.gtceu.tool.tooltip.crafting_uses": "%s §aCrafting Uses", "item.gtceu.tool.tooltip.default_enchantments": "§5Default Enchantments:", - "item.gtceu.tool.tooltip.general_uses": "%s §bDurability", - "item.gtceu.tool.tooltip.harvest_level": "§eHarvest Level %s", - "item.gtceu.tool.tooltip.harvest_level_extra": "§eHarvest Level %s §f(%s§f)", - "item.gtceu.tool.tooltip.max_uses": "%s §eTotal Durability", - "item.gtceu.tool.tooltip.mining_speed": "%s §dMining Speed", - "item.gtceu.tool.tooltip.repair_info": "§8Hold SHIFT to show Repair Info", - "item.gtceu.tool.tooltip.repair_material": "§8Repair with: §f§a%s", - "item.gtceu.tool.usable_as": "§8Usable as: §f%s", "item.gtceu.tool.wire_cutter": "%s Wire Cutter", "item.gtceu.tool.wrench": "%s Wrench", "item.gtceu.tool.wrench.tooltip": "§8Hold left click to dismantle Machines", @@ -4912,6 +4115,10 @@ "item.gtceu.tungsten_steel_fluid_cell": "%s Tungstensteel Cell", "item.gtceu.turbine_rotor": "%s Turbine Rotor", "item.gtceu.turbine_rotor.tooltip": "Turbine Rotors for your power station", + "item.gtceu.turbine_rotor.tooltip.durability": "§fDurability: §a%d / %d", + "item.gtceu.turbine_rotor.tooltip.efficiency": "Turbine Efficiency: §9%d%%", + "item.gtceu.turbine_rotor.tooltip.power": "Turbine Power: §9%d%%", + "item.gtceu.turbine_rotor.tooltip.primary_material": "§fMaterial: §e%s", "item.gtceu.uev_conveyor_module": "UEV Conveyor Module", "item.gtceu.uev_electric_motor": "UEV Electric Motor", "item.gtceu.uev_electric_piston": "UEV Electric Piston", @@ -5027,8 +4234,20 @@ "item.gtceu.zpm_solar_panel": "Zero Point Module Solar Panel", "item.gtceu.zpm_voltage_coil": "Zero Point Module Voltage Coil", "item.gtceu.zpm_voltage_coil.tooltip": "Super Coil", + "item.int_circuit.configuration": "Configuration: %d", "item.invalid.name": "Invalid item", - "item.netherrack_nether_quartz": "Nether Quartz Ore", + "item.machine_configuration.mode": "§aConfiguration Mode:§r %s", + "item.plugin.proxy.tooltips.1": "(Please adjust to proxy mode in the screen)", + "item.plugin.tooltips.1": "Plugins can be added to the screen for more functionality.", + "item.prospector.mode.bedrock_ore": "§bBedrock Ore Prospection Mode§r", + "item.prospector.mode.fluid": "§bFluid Prospection Mode§r", + "item.prospector.mode.ores": "§aOre Prospection Mode§r", + "item.prospector.tooltip.modes": "Available Modes:", + "item.prospector.tooltip.radius": "Scans range in a %s Chunk Radius", + "item.terminal.tooltip": "Sharp tools make good work", + "item.terminal.tooltip.creative": "§bCreative Mode", + "item.terminal.tooltip.hardware": "§aHardware: %d", + "item.tricorder_scanner.tooltip": "Tricorder", "itemGroup.gtceu.decoration": "GregTechCEu Decoration Blocks", "itemGroup.gtceu.item": "GregTechCEu Items", "itemGroup.gtceu.machine": "GregTechCEu Machines", @@ -5045,7 +4264,689 @@ "ldlib.gui.editor.register.widget.container.gtm_item_slot": "GTM Item Slot", "ldlib.gui.editor.register.widget.container.gtm_phantom_fluid_slot": "GTM Phantom Fluid Slot", "ldlib.gui.editor.register.widget.container.gtm_phantom_item_slot": "GTM Phantom Item Slot", - "mataarmor.hud.supply_mode": "Supply Mode: %s", + "machine.gtceu.assembly_line.tooltip": "Not a multiblock Assembling Machine!", + "machine.gtceu.available_recipe_map_1.tooltip": "Available Recipe Types: %s", + "machine.gtceu.available_recipe_map_2.tooltip": "Available Recipe Types: %s, %s", + "machine.gtceu.available_recipe_map_3.tooltip": "Available Recipe Types: %s, %s, %s", + "machine.gtceu.available_recipe_map_4.tooltip": "Available Recipe Types: %s, %s, %s, %s", + "machine.gtceu.basic.input_from_output_side.allow": "Allow Input from Output Side: ", + "machine.gtceu.basic.input_from_output_side.disallow": "Disallow Input from Output Side: ", + "machine.gtceu.block_breaker.speed_bonus": "§eSpeed Bonus: §f%d%%", + "machine.gtceu.block_breaker.tooltip": "§7Mines block on front face and collects its drops", + "machine.gtceu.boiler.heat_info": "Heat Capacity: %s %%", + "machine.gtceu.boiler.info.cooling.down": "§9Cooling down§r%s", + "machine.gtceu.boiler.info.heating.up": "§cHeating up§r%s", + "machine.gtceu.boiler.info.production.data": "§aProducing %s§a mB/t", + "machine.gtceu.bronze_large_boiler.tooltip": "We need more Steam!", + "machine.gtceu.buffer.tooltip": "A Small Buffer to store Items and Fluids", + "machine.gtceu.charcoal_pile_igniter.tooltip": "Underground fuel bakery", + "machine.gtceu.cleanroom.tooltip": "Keeping those pesky particles out", + "machine.gtceu.coke_oven.tooltip": "Making better fuels for Steel and Power", + "machine.gtceu.cracker.coil_tooltip": "Every coil after §6Cupronickel§7 reduces energy usage by §f10%%§7.", + "machine.gtceu.cracker.tooltip": "Makes Oil useful", + "machine.gtceu.diodemessage": "Max Amperage throughput: %s", + "machine.gtceu.diodetooltip_general": "Allows Energy Flow in one direction and limits Amperage", + "machine.gtceu.diodetooltip_starts_at": "Starts as §f1A§7, use Soft Mallet to change", + "machine.gtceu.diodetooltip_tool_usage": "Hit with a Soft Mallet to change Amperage flow.", + "machine.gtceu.distillation_tower.tooltip": "Fluid Refinery", + "machine.gtceu.drum.disable_output": "Will not drain Fluid", + "machine.gtceu.drum.enable_output": "Will drain Fluid to downward adjacent Tanks", + "machine.gtceu.electric_blast_furnace.tooltip": "Where's the electric smoker?", + "machine.gtceu.electric_blast_furnace.tooltip.0": "For every §f900K§7 above the recipe temperature, a multiplicative §f95%%§7 energy multiplier is applied pre-overclocking.", + "machine.gtceu.electric_blast_furnace.tooltip.1": "For every §f1800K§7 above the recipe temperature, one overclock becomes §f100%% efficient§7 (perfect overclock).", + "machine.gtceu.electric_blast_furnace.tooltip.2": "For every voltage tier above §bMV§7, temperature is increased by §f100K§7.", + "machine.gtceu.energy_converter.description": "Converts Energy between EU and FE", + "machine.gtceu.energy_converter.message_conversion_eu": "Converting EU, In: %dA %d EU, Out: %d Native", + "machine.gtceu.energy_converter.message_conversion_native": "Converting Native Energy, In: %d FE, Out: %dA %d EU", + "machine.gtceu.energy_converter.tooltip_conversion_eu": "§aEU Conversion: §f%dA %d EU (%s§f) -> %d Native", + "machine.gtceu.energy_converter.tooltip_conversion_native": "§cNative Conversion: §f%d FE -> %dA %d EU (%s§f)", + "machine.gtceu.energy_converter.tooltip_tool_usage": "Starts as §fFE Converter§7, use Soft Mallet to change", + "machine.gtceu.ev_alloy_smelter.tooltip": "§7HighTech combination Smelter", + "machine.gtceu.ev_arc_furnace.tooltip": "§7Who needs a Blast Furnace?", + "machine.gtceu.ev_assembler.tooltip": "§7Avengers, Assemble!", + "machine.gtceu.ev_autoclave.tooltip": "§7Crystallizing your Dusts", + "machine.gtceu.ev_bender.tooltip": "§7Boo, he's bad! We want BENDER!!!", + "machine.gtceu.ev_brewery.tooltip": "§7Compact and efficient potion brewing", + "machine.gtceu.ev_canner.tooltip": "§7Puts things into and out of Containers", + "machine.gtceu.ev_centrifuge.tooltip": "§7Molecular Separator", + "machine.gtceu.ev_chemical_bath.tooltip": "§7Bathing Ores in Chemicals to separate them", + "machine.gtceu.ev_chemical_reactor.tooltip": "§7Letting Chemicals react with each other", + "machine.gtceu.ev_circuit_assembler.tooltip": "§7Pick-n-Place all over the place", + "machine.gtceu.ev_compressor.tooltip": "§7Compress-O-Matic C77", + "machine.gtceu.ev_cutter.tooltip": "§7Slice'N Dice", + "machine.gtceu.ev_distillery.tooltip": "§7Extracting most relevant Parts of Fluids", + "machine.gtceu.ev_electric_furnace.tooltip": "§7Not like using a Commodore 64", + "machine.gtceu.ev_electrolyzer.tooltip": "§7Electrolyzing Molecules", + "machine.gtceu.ev_electromagnetic_separator.tooltip": "§7Separating the magnetic Ores from the rest", + "machine.gtceu.ev_extractor.tooltip": "§7Dejuicer-Device of Doom - D123", + "machine.gtceu.ev_extruder.tooltip": "§7Universal Machine for Metal Working", + "machine.gtceu.ev_fermenter.tooltip": "§7Fermenting Fluids", + "machine.gtceu.ev_fluid_drilling_rig.tooltip": "Well Drainer", + "machine.gtceu.ev_fluid_heater.tooltip": "§7Heating up your Fluids", + "machine.gtceu.ev_fluid_solidifier.tooltip": "§7Cools Fluids down to form Solids", + "machine.gtceu.ev_forge_hammer.tooltip": "§7Stop, Hammertime!", + "machine.gtceu.ev_forming_press.tooltip": "§7Imprinting Images into things", + "machine.gtceu.ev_gas_collector.tooltip": "§7Collects Gas from the air depending on the dimension", + "machine.gtceu.ev_large_miner.tooltip": "Digging Ore instead of You", + "machine.gtceu.ev_laser_engraver.tooltip": "§7Don't look directly at the Laser", + "machine.gtceu.ev_lathe.tooltip": "§7Produces Rods more efficiently", + "machine.gtceu.ev_macerator.tooltip": "§7Shredding your Ores with Byproducts", + "machine.gtceu.ev_mass_fabricator.tooltip": "§7UUM Matter * Fabrication Squared", + "machine.gtceu.ev_mixer.tooltip": "§7Will it Blend?", + "machine.gtceu.ev_ore_washer.tooltip": "§7Getting more Byproducts from your Ores", + "machine.gtceu.ev_packer.tooltip": "§7Puts things into and Grabs things out of Boxes", + "machine.gtceu.ev_polarizer.tooltip": "§7Bipolarising your Magnets", + "machine.gtceu.ev_replicator.tooltip": "§7Producing the Purest of Elements", + "machine.gtceu.ev_rock_crusher.tooltip": "§7Place Water and Lava horizontally adjacent", + "machine.gtceu.ev_scanner.tooltip": "§7Scans Materials and other things", + "machine.gtceu.ev_sifter.tooltip": "§7Stay calm and keep sifting", + "machine.gtceu.ev_thermal_centrifuge.tooltip": "§7Separating Ores more precisely", + "machine.gtceu.ev_wiremill.tooltip": "§7Produces Wires more efficiently", + "machine.gtceu.extreme_combustion_engine.tooltip": "Extreme Chemical Energy Releaser", + "machine.gtceu.fisher.requirement": "Requires a %dx%d centered square of water directly below.", + "machine.gtceu.fisher.speed": "Catches something every %d ticks", + "machine.gtceu.fisher.tooltip": "Costs string to fish. Consumes one string each time.", + "machine.gtceu.gas_large_turbine.tooltip": "Not a Jet Engine", + "machine.gtceu.hp_steam_alloy_smelter.tooltip": "§7Combination Smelter", + "machine.gtceu.hp_steam_compressor.tooltip": "§7Compressing Items", + "machine.gtceu.hp_steam_extractor.tooltip": "§7Extracting your first Rubber", + "machine.gtceu.hp_steam_forge_hammer.tooltip": "§7Forge Hammer", + "machine.gtceu.hp_steam_furnace.tooltip": "§7Smelting things with compressed Steam", + "machine.gtceu.hp_steam_liquid_boiler.tooltip": "§7Faster than Small Steam Liquid Boiler", + "machine.gtceu.hp_steam_macerator.tooltip": "§7Macerating your Ores without Byproducts", + "machine.gtceu.hp_steam_miner.tooltip": "§7Mines ores below the Miner!", + "machine.gtceu.hp_steam_rock_crusher.tooltip": "§7Place Water and Lava horizontally adjacent", + "machine.gtceu.hp_steam_solar_boiler.tooltip": "§7Steam Power by Sun", + "machine.gtceu.hp_steam_solid_boiler.tooltip": "§7Faster than the Small Steam Solid Fuel Boiler", + "machine.gtceu.hull.tooltip": "§7You just need §5I§dm§4a§cg§ei§an§ba§3t§7i§1o§5n§7 to use this", + "machine.gtceu.hv_alloy_smelter.tooltip": "§7HighTech combination Smelter", + "machine.gtceu.hv_arc_furnace.tooltip": "§7Who needs a Blast Furnace?", + "machine.gtceu.hv_assembler.tooltip": "§7Avengers, Assemble!", + "machine.gtceu.hv_autoclave.tooltip": "§7Crystallizing your Dusts", + "machine.gtceu.hv_bender.tooltip": "§7Boo, he's bad! We want BENDER!!!", + "machine.gtceu.hv_brewery.tooltip": "§7Compact and efficient potion brewing", + "machine.gtceu.hv_canner.tooltip": "§7Puts things into and out of Containers", + "machine.gtceu.hv_centrifuge.tooltip": "§7Separating Molecules", + "machine.gtceu.hv_chemical_bath.tooltip": "§7Bathing Ores in Chemicals to separate them", + "machine.gtceu.hv_chemical_reactor.tooltip": "§7Letting Chemicals react with each other", + "machine.gtceu.hv_circuit_assembler.tooltip": "§7Pick-n-Place all over the place", + "machine.gtceu.hv_compressor.tooltip": "§7Compress-O-Matic C77", + "machine.gtceu.hv_cutter.tooltip": "§7Slice'N Dice", + "machine.gtceu.hv_distillery.tooltip": "§7Extracting most relevant Parts of Fluids", + "machine.gtceu.hv_electric_furnace.tooltip": "§7Not like using a Commodore 64", + "machine.gtceu.hv_electrolyzer.tooltip": "§7Electrolyzing Molecules", + "machine.gtceu.hv_electromagnetic_separator.tooltip": "§7Separating the magnetic Ores from the rest", + "machine.gtceu.hv_extractor.tooltip": "§7Dejuicer-Device of Doom - D123", + "machine.gtceu.hv_extruder.tooltip": "§7Universal Machine for Metal Working", + "machine.gtceu.hv_fermenter.tooltip": "§7Fermenting Fluids", + "machine.gtceu.hv_fluid_drilling_rig.tooltip": "Does not perform Fracking", + "machine.gtceu.hv_fluid_heater.tooltip": "§7Heating up your Fluids", + "machine.gtceu.hv_fluid_solidifier.tooltip": "§7Cools Fluids down to form Solids", + "machine.gtceu.hv_forge_hammer.tooltip": "§7Stop, Hammertime!", + "machine.gtceu.hv_forming_press.tooltip": "§7Imprinting Images into things", + "machine.gtceu.hv_gas_collector.tooltip": "§7Collects Gas from the air depending on the dimension", + "machine.gtceu.hv_laser_engraver.tooltip": "§7Don't look directly at the Laser", + "machine.gtceu.hv_lathe.tooltip": "§7Produces Rods more efficiently", + "machine.gtceu.hv_macerator.tooltip": "§7Shredding your Ores with Byproducts", + "machine.gtceu.hv_mass_fabricator.tooltip": "§7UUM Matter * Fabrication Squared", + "machine.gtceu.hv_mixer.tooltip": "§7Will it Blend?", + "machine.gtceu.hv_ore_washer.tooltip": "§7Getting more Byproducts from your Ores", + "machine.gtceu.hv_packer.tooltip": "§7Puts things into and Grabs things out of Boxes", + "machine.gtceu.hv_polarizer.tooltip": "§7Bipolarising your Magnets", + "machine.gtceu.hv_replicator.tooltip": "§7Producing the Purest of Elements", + "machine.gtceu.hv_rock_crusher.tooltip": "§7Place Water and Lava horizontally adjacent", + "machine.gtceu.hv_scanner.tooltip": "§7Scans Materials and other things", + "machine.gtceu.hv_sifter.tooltip": "§7Stay calm and keep sifting", + "machine.gtceu.hv_thermal_centrifuge.tooltip": "§7Separating Ores more precisely", + "machine.gtceu.hv_wiremill.tooltip": "§7Produces Wires more efficiently", + "machine.gtceu.implosion_compressor.tooltip": "The only Machine you want to go Boom", + "machine.gtceu.item_collector.gui.collect_range": "Collect within an area of %sx%s blocks", + "machine.gtceu.item_collector.tooltip": "Collects Items around itself", + "machine.gtceu.iv_alloy_smelter.tooltip": "§7Alloy Integrator", + "machine.gtceu.iv_arc_furnace.tooltip": "§7Discharge Heater", + "machine.gtceu.iv_assembler.tooltip": "§7NOT a Crafting Table", + "machine.gtceu.iv_autoclave.tooltip": "§7Pressure Cooker", + "machine.gtceu.iv_bender.tooltip": "§7Shape Distorter", + "machine.gtceu.iv_brewery.tooltip": "§7Brewing your Drinks", + "machine.gtceu.iv_canner.tooltip": "§7Can Operator", + "machine.gtceu.iv_centrifuge.tooltip": "§7Molecular Cyclone", + "machine.gtceu.iv_chemical_bath.tooltip": "§7Chemical Soaker", + "machine.gtceu.iv_chemical_reactor.tooltip": "§7Chemical Performer", + "machine.gtceu.iv_circuit_assembler.tooltip": "§7Electronics Manufacturer", + "machine.gtceu.iv_compressor.tooltip": "§7Singularity Condenser", + "machine.gtceu.iv_cutter.tooltip": "§7Matter Cleaver", + "machine.gtceu.iv_distillery.tooltip": "§7Condensation Separator", + "machine.gtceu.iv_electric_furnace.tooltip": "§7Electron Excitement Processor", + "machine.gtceu.iv_electrolyzer.tooltip": "§7Molecular Disintegrator E-4906", + "machine.gtceu.iv_electromagnetic_separator.tooltip": "§7EM Categorizer", + "machine.gtceu.iv_extractor.tooltip": "§7Vacuum Extractinator", + "machine.gtceu.iv_extruder.tooltip": "§7Material Displacer", + "machine.gtceu.iv_fermenter.tooltip": "§7Fermentation Hastener", + "machine.gtceu.iv_fluid_heater.tooltip": "§7Heat Infuser", + "machine.gtceu.iv_fluid_solidifier.tooltip": "§7Not an Ice Machine", + "machine.gtceu.iv_forge_hammer.tooltip": "§7Plate Forger", + "machine.gtceu.iv_forming_press.tooltip": "§7Object Layerer", + "machine.gtceu.iv_gas_collector.tooltip": "§7Collects Gas from the atmosphere depending on the dimension", + "machine.gtceu.iv_large_miner.tooltip": "Biome Excavator", + "machine.gtceu.iv_laser_engraver.tooltip": "§7With the Power of 2.04 MW", + "machine.gtceu.iv_lathe.tooltip": "§7Turn-O-Matic L-5906", + "machine.gtceu.iv_macerator.tooltip": "§7Blend-O-Matic 9001", + "machine.gtceu.iv_mass_fabricator.tooltip": "§7Genesis Factory", + "machine.gtceu.iv_mixer.tooltip": "§7Matter Organizer", + "machine.gtceu.iv_ore_washer.tooltip": "§7Repurposed Laundry-Washer I-360", + "machine.gtceu.iv_packer.tooltip": "§7Boxinator", + "machine.gtceu.iv_polarizer.tooltip": "§7Magnetism Inducer", + "machine.gtceu.iv_replicator.tooltip": "§7Matter Paster", + "machine.gtceu.iv_rock_crusher.tooltip": "§7Cryogenic Magma Solidifier R-8200", + "machine.gtceu.iv_scanner.tooltip": "§7Anomaly Detector", + "machine.gtceu.iv_sifter.tooltip": "§7Sponsored by TFC", + "machine.gtceu.iv_thermal_centrifuge.tooltip": "§7Blaze Sweatshop T-6350", + "machine.gtceu.iv_wiremill.tooltip": "§7Ingot Elongator", + "machine.gtceu.large_chemical_reactor.tooltip": "Black Box Reactor", + "machine.gtceu.large_combustion_engine.tooltip": "Fuel Ignition Chamber", + "machine.gtceu.lp_steam_alloy_smelter.tooltip": "§7Combination Smelter", + "machine.gtceu.lp_steam_compressor.tooltip": "§7Compressing Items", + "machine.gtceu.lp_steam_extractor.tooltip": "§7Extracting your first Rubber", + "machine.gtceu.lp_steam_forge_hammer.tooltip": "§7Forge Hammer", + "machine.gtceu.lp_steam_furnace.tooltip": "§7Smelting things with compressed Steam", + "machine.gtceu.lp_steam_liquid_boiler.tooltip": "§7A Boiler running off Liquids", + "machine.gtceu.lp_steam_macerator.tooltip": "§7Macerating your Ores", + "machine.gtceu.lp_steam_miner.tooltip": "§7Mines ores below the Miner!", + "machine.gtceu.lp_steam_rock_crusher.tooltip": "§7Place Water and Lava horizontally adjacent", + "machine.gtceu.lp_steam_solar_boiler.tooltip": "§7Steam Power by Sun", + "machine.gtceu.lp_steam_solid_boiler.tooltip": "§7An early way to get Steam Power", + "machine.gtceu.luv_alloy_smelter.tooltip": "§7Alloy Integrator", + "machine.gtceu.luv_arc_furnace.tooltip": "§7Discharge Heater", + "machine.gtceu.luv_assembler.tooltip": "§7NOT a Crafting Table", + "machine.gtceu.luv_autoclave.tooltip": "§7Pressure Cooker", + "machine.gtceu.luv_bender.tooltip": "§7Shape Distorter", + "machine.gtceu.luv_brewery.tooltip": "§7Brewing your Drinks", + "machine.gtceu.luv_canner.tooltip": "§7Can Operator", + "machine.gtceu.luv_centrifuge.tooltip": "§7Molecular Cyclone", + "machine.gtceu.luv_chemical_bath.tooltip": "§7Chemical Soaker", + "machine.gtceu.luv_chemical_reactor.tooltip": "§7Chemical Performer", + "machine.gtceu.luv_circuit_assembler.tooltip": "§7Electronics Manufacturer", + "machine.gtceu.luv_compressor.tooltip": "§7Singularity Condenser", + "machine.gtceu.luv_cutter.tooltip": "§7Matter Cleaver", + "machine.gtceu.luv_distillery.tooltip": "§7Condensation Separator", + "machine.gtceu.luv_electric_furnace.tooltip": "§7Electron Excitement Processor", + "machine.gtceu.luv_electrolyzer.tooltip": "§7Molecular Disintegrator E-4907", + "machine.gtceu.luv_electromagnetic_separator.tooltip": "§7EM Categorizer", + "machine.gtceu.luv_extractor.tooltip": "§7Vacuum Extractinator", + "machine.gtceu.luv_extruder.tooltip": "§7Material Displacer", + "machine.gtceu.luv_fermenter.tooltip": "§7Fermentation Hastener", + "machine.gtceu.luv_fluid_heater.tooltip": "§7Heat Infuser", + "machine.gtceu.luv_fluid_solidifier.tooltip": "§7Not an Ice Machine", + "machine.gtceu.luv_forge_hammer.tooltip": "§7Plate Forger", + "machine.gtceu.luv_forming_press.tooltip": "§7Object Layerer", + "machine.gtceu.luv_fusion_reactor.tooltip": "Atomic Alloy Smelter", + "machine.gtceu.luv_gas_collector.tooltip": "§7Collects Gas from the atmosphere depending on the dimension", + "machine.gtceu.luv_large_miner.tooltip": "Terrestrial Harvester", + "machine.gtceu.luv_laser_engraver.tooltip": "§7With the Power of 8.16 MW", + "machine.gtceu.luv_lathe.tooltip": "§7Turn-O-Matic L-5907", + "machine.gtceu.luv_macerator.tooltip": "§7Blend-O-Matic 9002", + "machine.gtceu.luv_mass_fabricator.tooltip": "§7Genesis Factory", + "machine.gtceu.luv_mixer.tooltip": "§7Matter Organizer", + "machine.gtceu.luv_ore_washer.tooltip": "§7Repurposed Laundry-Washer I-361", + "machine.gtceu.luv_packer.tooltip": "§7Boxinator", + "machine.gtceu.luv_polarizer.tooltip": "§7Magnetism Inducer", + "machine.gtceu.luv_replicator.tooltip": "§7Matter Paster", + "machine.gtceu.luv_rock_crusher.tooltip": "§7Cryogenic Magma Solidifier R-9200", + "machine.gtceu.luv_scanner.tooltip": "§7Anomaly Detector", + "machine.gtceu.luv_sifter.tooltip": "§7Sponsored by TFC", + "machine.gtceu.luv_thermal_centrifuge.tooltip": "§7Blaze Sweatshop T-6351", + "machine.gtceu.luv_wiremill.tooltip": "§7Ingot Elongator", + "machine.gtceu.lv_alloy_smelter.tooltip": "§7HighTech combination Smelter", + "machine.gtceu.lv_arc_furnace.tooltip": "§7Who needs a Blast Furnace?", + "machine.gtceu.lv_assembler.tooltip": "§7Avengers, Assemble!", + "machine.gtceu.lv_autoclave.tooltip": "§7Crystallizing your Dusts", + "machine.gtceu.lv_bender.tooltip": "§7Boo, he's bad! We want BENDER!!!", + "machine.gtceu.lv_brewery.tooltip": "§7Compact and efficient potion brewing", + "machine.gtceu.lv_canner.tooltip": "§7Puts things into and out of Containers", + "machine.gtceu.lv_centrifuge.tooltip": "§7Separating Molecules", + "machine.gtceu.lv_chemical_bath.tooltip": "§7Bathing Ores in Chemicals to separate them", + "machine.gtceu.lv_chemical_reactor.tooltip": "§7Letting Chemicals react with each other", + "machine.gtceu.lv_circuit_assembler.tooltip": "§7Pick-n-Place all over the place", + "machine.gtceu.lv_compressor.tooltip": "§7Compress-O-Matic C77", + "machine.gtceu.lv_cutter.tooltip": "§7Slice'N Dice", + "machine.gtceu.lv_distillery.tooltip": "§7Extracting most relevant Parts of Fluids", + "machine.gtceu.lv_electric_furnace.tooltip": "§7Not like using a Commodore 64", + "machine.gtceu.lv_electrolyzer.tooltip": "§7Electrolyzing Molecules", + "machine.gtceu.lv_electromagnetic_separator.tooltip": "§7Separating the magnetic Ores from the rest", + "machine.gtceu.lv_extractor.tooltip": "§7Dejuicer-Device of Doom - D123", + "machine.gtceu.lv_extruder.tooltip": "§7Universal Machine for Metal Working", + "machine.gtceu.lv_fermenter.tooltip": "§7Fermenting Fluids", + "machine.gtceu.lv_fluid_heater.tooltip": "§7Heating up your Fluids", + "machine.gtceu.lv_fluid_solidifier.tooltip": "§7Cools Fluids down to form Solids", + "machine.gtceu.lv_forge_hammer.tooltip": "§7Stop, Hammertime!", + "machine.gtceu.lv_forming_press.tooltip": "§7Imprinting Images into things", + "machine.gtceu.lv_gas_collector.tooltip": "§7Collects Gas from the air depending on the dimension", + "machine.gtceu.lv_laser_engraver.tooltip": "§7Don't look directly at the Laser", + "machine.gtceu.lv_lathe.tooltip": "§7Produces Rods more efficiently", + "machine.gtceu.lv_macerator.tooltip": "§7Shredding your Ores without Byproducts", + "machine.gtceu.lv_mass_fabricator.tooltip": "§7UUM Matter * Fabrication Squared", + "machine.gtceu.lv_mixer.tooltip": "§7Will it Blend?", + "machine.gtceu.lv_ore_washer.tooltip": "§7Getting more Byproducts from your Ores", + "machine.gtceu.lv_packer.tooltip": "§7Puts things into and Grabs things out of Boxes", + "machine.gtceu.lv_polarizer.tooltip": "§7Bipolarising your Magnets", + "machine.gtceu.lv_replicator.tooltip": "§7Producing the Purest of Elements", + "machine.gtceu.lv_rock_crusher.tooltip": "§7Place Water and Lava horizontally adjacent", + "machine.gtceu.lv_scanner.tooltip": "§7Scans Materials and other things", + "machine.gtceu.lv_sifter.tooltip": "§7Stay calm and keep sifting", + "machine.gtceu.lv_thermal_centrifuge.tooltip": "§7Separating Ores more precisely", + "machine.gtceu.lv_wiremill.tooltip": "§7Produces Wires more efficiently", + "machine.gtceu.max_alloy_smelter.tooltip": "§7Metal Amalgamator", + "machine.gtceu.max_arc_furnace.tooltip": "§7Short Circuit Heater", + "machine.gtceu.max_assembler.tooltip": "§7Assembly Constructor", + "machine.gtceu.max_autoclave.tooltip": "§7Encumbrance Unit", + "machine.gtceu.max_bender.tooltip": "§7Matter Deformer", + "machine.gtceu.max_brewery.tooltip": "§7Brew Rusher", + "machine.gtceu.max_canner.tooltip": "§7Can Actuator", + "machine.gtceu.max_chemical_bath.tooltip": "§7Chemical Dunktron", + "machine.gtceu.max_chemical_reactor.tooltip": "§7Reaction Catalyzer", + "machine.gtceu.max_circuit_assembler.tooltip": "§7Computation Factory", + "machine.gtceu.max_compressor.tooltip": "§7Matter Constrictor", + "machine.gtceu.max_cutter.tooltip": "§7Object Divider", + "machine.gtceu.max_distillery.tooltip": "§7Fraction Splitter", + "machine.gtceu.max_electric_furnace.tooltip": "§7Atom Stimulator", + "machine.gtceu.max_electromagnetic_separator.tooltip": "§7EMF Dispeller", + "machine.gtceu.max_extractor.tooltip": "§7Liquefying Sucker", + "machine.gtceu.max_extruder.tooltip": "§7Shape Driver", + "machine.gtceu.max_fermenter.tooltip": "§7Respiration Controller", + "machine.gtceu.max_fluid_heater.tooltip": "§7Thermal Imbuer", + "machine.gtceu.max_fluid_solidifier.tooltip": "§7Fluid Petrificator", + "machine.gtceu.max_forge_hammer.tooltip": "§7Impact Modulator", + "machine.gtceu.max_forming_press.tooltip": "§7Surface Shifter", + "machine.gtceu.max_mass_fabricator.tooltip": "§7Existence Initiator", + "machine.gtceu.max_mixer.tooltip": "§7Material Homogenizer", + "machine.gtceu.max_packer.tooltip": "§7Amazon Warehouse", + "machine.gtceu.max_polarizer.tooltip": "§7Magnetic Field Rearranger", + "machine.gtceu.max_replicator.tooltip": "§7Elemental Composer", + "machine.gtceu.max_scanner.tooltip": "§7Electron Microscope", + "machine.gtceu.max_sifter.tooltip": "§7Pulsation Filter", + "machine.gtceu.max_wiremill.tooltip": "§7Wire Transfigurator", + "machine.gtceu.miner.per_block": "§7takes §f%ds §7per Block", + "machine.gtceu.miner.tooltip": "§7Mines ores below the Miner! Starts as §f%sx%s §7area", + "machine.gtceu.muffle.off": "Sound Muffling: Disabled", + "machine.gtceu.muffle.on": "Sound Muffling: Enabled", + "machine.gtceu.multi_smelter.tooltip": "Just like the Oven at Home", + "machine.gtceu.mv_alloy_smelter.tooltip": "§7HighTech combination Smelter", + "machine.gtceu.mv_arc_furnace.tooltip": "§7Who needs a Blast Furnace?", + "machine.gtceu.mv_assembler.tooltip": "§7Avengers, Assemble!", + "machine.gtceu.mv_autoclave.tooltip": "§7Crystallizing your Dusts", + "machine.gtceu.mv_bender.tooltip": "§7Boo, he's bad! We want BENDER!!!", + "machine.gtceu.mv_brewery.tooltip": "§7Compact and efficient potion brewing", + "machine.gtceu.mv_canner.tooltip": "§7Puts things into and out of Containers", + "machine.gtceu.mv_centrifuge.tooltip": "§7Separating Molecules", + "machine.gtceu.mv_chemical_bath.tooltip": "§7Bathing Ores in Chemicals to separate them", + "machine.gtceu.mv_chemical_reactor.tooltip": "§7Letting Chemicals react with each other", + "machine.gtceu.mv_circuit_assembler.tooltip": "§7Pick-n-Place all over the place", + "machine.gtceu.mv_compressor.tooltip": "§7Compress-O-Matic C77", + "machine.gtceu.mv_cutter.tooltip": "§7Slice'N Dice", + "machine.gtceu.mv_distillery.tooltip": "§7Extracting most relevant Parts of Fluids", + "machine.gtceu.mv_electric_furnace.tooltip": "§7Not like using a Commodore 64", + "machine.gtceu.mv_electrolyzer.tooltip": "§7Electrolyzing Molecules", + "machine.gtceu.mv_electromagnetic_separator.tooltip": "§7Separating the magnetic Ores from the rest", + "machine.gtceu.mv_extractor.tooltip": "§7Dejuicer-Device of Doom - D123", + "machine.gtceu.mv_extruder.tooltip": "§7Universal Machine for Metal Working", + "machine.gtceu.mv_fermenter.tooltip": "§7Fermenting Fluids", + "machine.gtceu.mv_fluid_drilling_rig.tooltip": "Oil Extraction Pump", + "machine.gtceu.mv_fluid_heater.tooltip": "§7Heating up your Fluids", + "machine.gtceu.mv_fluid_solidifier.tooltip": "§7Cools Fluids down to form Solids", + "machine.gtceu.mv_forge_hammer.tooltip": "§7Stop, Hammertime!", + "machine.gtceu.mv_forming_press.tooltip": "§7Imprinting Images into things", + "machine.gtceu.mv_gas_collector.tooltip": "§7Collects Gas from the air depending on the dimension", + "machine.gtceu.mv_laser_engraver.tooltip": "§7Don't look directly at the Laser", + "machine.gtceu.mv_lathe.tooltip": "§7Produces Rods more efficiently", + "machine.gtceu.mv_macerator.tooltip": "§7Shredding your Ores without Byproducts", + "machine.gtceu.mv_mass_fabricator.tooltip": "§7UUM Matter * Fabrication Squared", + "machine.gtceu.mv_mixer.tooltip": "§7Will it Blend?", + "machine.gtceu.mv_ore_washer.tooltip": "§7Getting more Byproducts from your Ores", + "machine.gtceu.mv_packer.tooltip": "§7Puts things into and Grabs things out of Boxes", + "machine.gtceu.mv_polarizer.tooltip": "§7Bipolarising your Magnets", + "machine.gtceu.mv_replicator.tooltip": "§7Producing the Purest of Elements", + "machine.gtceu.mv_rock_crusher.tooltip": "§7Place Water and Lava horizontally adjacent", + "machine.gtceu.mv_scanner.tooltip": "§7Scans Materials and other things", + "machine.gtceu.mv_sifter.tooltip": "§7Stay calm and keep sifting", + "machine.gtceu.mv_thermal_centrifuge.tooltip": "§7Separating Ores more precisely", + "machine.gtceu.mv_wiremill.tooltip": "§7Produces Wires more efficiently", + "machine.gtceu.opv_alloy_smelter.tooltip": "§7Metal Amalgamator", + "machine.gtceu.opv_arc_furnace.tooltip": "§7Short Circuit Heater", + "machine.gtceu.opv_assembler.tooltip": "§7Assembly Constructor", + "machine.gtceu.opv_autoclave.tooltip": "§7Encumbrance Unit", + "machine.gtceu.opv_bender.tooltip": "§7Matter Deformer", + "machine.gtceu.opv_brewery.tooltip": "§7Brew Rusher", + "machine.gtceu.opv_canner.tooltip": "§7Can Actuator", + "machine.gtceu.opv_centrifuge.tooltip": "§7Molecular Tornado", + "machine.gtceu.opv_chemical_bath.tooltip": "§7Chemical Dunktron", + "machine.gtceu.opv_chemical_reactor.tooltip": "§7Reaction Catalyzer", + "machine.gtceu.opv_circuit_assembler.tooltip": "§7Computation Factory", + "machine.gtceu.opv_compressor.tooltip": "§7Matter Constrictor", + "machine.gtceu.opv_cutter.tooltip": "§7Object Divider", + "machine.gtceu.opv_distillery.tooltip": "§7Fraction Splitter", + "machine.gtceu.opv_electric_furnace.tooltip": "§7Atom Stimulator", + "machine.gtceu.opv_electrolyzer.tooltip": "§7Atomic Ionizer", + "machine.gtceu.opv_electromagnetic_separator.tooltip": "§7EMF Dispeller", + "machine.gtceu.opv_extractor.tooltip": "§7Liquefying Sucker", + "machine.gtceu.opv_extruder.tooltip": "§7Shape Driver", + "machine.gtceu.opv_fermenter.tooltip": "§7Respiration Controller", + "machine.gtceu.opv_fluid_heater.tooltip": "§7Thermal Imbuer", + "machine.gtceu.opv_fluid_solidifier.tooltip": "§7Fluid Petrificator", + "machine.gtceu.opv_forge_hammer.tooltip": "§7Impact Modulator", + "machine.gtceu.opv_forming_press.tooltip": "§7Surface Shifter", + "machine.gtceu.opv_gas_collector.tooltip": "§7Collects Gas from the universe depending on the dimension", + "machine.gtceu.opv_laser_engraver.tooltip": "§7Exact Photon Cannon", + "machine.gtceu.opv_lathe.tooltip": "§7Rotation Grinder", + "machine.gtceu.opv_macerator.tooltip": "§7Shape Eliminator", + "machine.gtceu.opv_mass_fabricator.tooltip": "§7Existence Initiator", + "machine.gtceu.opv_mixer.tooltip": "§7Material Homogenizer", + "machine.gtceu.opv_ore_washer.tooltip": "§7Miniature Car Wash", + "machine.gtceu.opv_packer.tooltip": "§7Amazon Warehouse", + "machine.gtceu.opv_polarizer.tooltip": "§7Magnetic Field Rearranger", + "machine.gtceu.opv_replicator.tooltip": "§7Elemental Composer", + "machine.gtceu.opv_rock_crusher.tooltip": "§7Volcanic Formation Chamber", + "machine.gtceu.opv_scanner.tooltip": "§7Electron Microscope", + "machine.gtceu.opv_sifter.tooltip": "§7Pulsation Filter", + "machine.gtceu.opv_thermal_centrifuge.tooltip": "§7Fire Cyclone", + "machine.gtceu.opv_wiremill.tooltip": "§7Wire Transfigurator", + "machine.gtceu.perfect_oc": "Does not lose energy efficiency when overclocked.", + "machine.gtceu.plasma_large_turbine.tooltip": "Plasma Energy Siphon", + "machine.gtceu.primitive_blast_furnace.tooltip": "Making your first Steel", + "machine.gtceu.primitive_pump.tooltip": "Endervoir at Home", + "machine.gtceu.pump.tooltip": "§7The best way to empty Oceans!", + "machine.gtceu.pump.tooltip_buckets": "§f%d §7ticks per Bucket", + "machine.gtceu.pyrolyse_oven.coil_tooltip": "§6Cupronickel §7coils are §f25%%§7 slower. Every coil after §bKanthal§7 increases speed by §f50%%§7.", + "machine.gtceu.pyrolyse_oven.tooltip": "Electric Coke Oven", + "machine.gtceu.quantum_chest.items_stored": "Item Amount:", + "machine.gtceu.quantum_chest.tooltip": "§7Better than Storage Drawers", + "machine.gtceu.quantum_tank.tooltip": "§7Compact place to store all your fluids", + "machine.gtceu.steam.steam_hatch.tooltip": "§eAccepted Fluid: §fSteam", + "machine.gtceu.steam_bus.tooltip": "Does not work with non-steam multiblocks", + "machine.gtceu.steam_grinder.tooltip": "A multiblock Macerator without the Byproducts", + "machine.gtceu.steam_large_turbine.tooltip": "Do not put your Head in it", + "machine.gtceu.steam_oven.tooltip": "Not to be confused with Multi-Smelter", + "machine.gtceu.steel_large_boiler.tooltip": "Charcoal Incinerator", + "machine.gtceu.titanium_large_boiler.tooltip": "Where's the Magic Super Fuel?", + "machine.gtceu.transformer.description": "§7Transforms Energy between voltage tiers", + "machine.gtceu.transformer.message_transform_down": "Transforming Down, In: %s EU %dA, Out: %s EU %dA", + "machine.gtceu.transformer.message_transform_up": "Transforming Up, In: %s EU %dA, Out: %s EU %dA", + "machine.gtceu.transformer.tooltip_tool_usage": "§7Starts as §fTransform Down§7, use Screwdriver to change", + "machine.gtceu.transformer.tooltip_transform_down": "§aTransform Down: §f%dA %s EU (%s§f) -> %dA %s EU (%s§f)", + "machine.gtceu.transformer.tooltip_transform_up": "§cTransform Up: §f%dA %s EU (%s§f) -> %dA %s EU (%s§f)", + "machine.gtceu.tungstensteel_large_boiler.tooltip": "How do you even fuel this thing?", + "machine.gtceu.uev_alloy_smelter.tooltip": "§7Metal Amalgamator", + "machine.gtceu.uev_arc_furnace.tooltip": "§7Short Circuit Heater", + "machine.gtceu.uev_assembler.tooltip": "§7Assembly Constructor", + "machine.gtceu.uev_autoclave.tooltip": "§7Encumbrance Unit", + "machine.gtceu.uev_bender.tooltip": "§7Matter Deformer", + "machine.gtceu.uev_brewery.tooltip": "§7Brew Rusher", + "machine.gtceu.uev_canner.tooltip": "§7Can Actuator", + "machine.gtceu.uev_centrifuge.tooltip": "§7Molecular Tornado", + "machine.gtceu.uev_chemical_bath.tooltip": "§7Chemical Dunktron", + "machine.gtceu.uev_chemical_reactor.tooltip": "§7Reaction Catalyzer", + "machine.gtceu.uev_circuit_assembler.tooltip": "§7Computation Factory", + "machine.gtceu.uev_compressor.tooltip": "§7Matter Constrictor", + "machine.gtceu.uev_cutter.tooltip": "§7Object Divider", + "machine.gtceu.uev_distillery.tooltip": "§7Fraction Splitter", + "machine.gtceu.uev_electric_furnace.tooltip": "§7Atom Stimulator", + "machine.gtceu.uev_electrolyzer.tooltip": "§7Atomic Ionizer", + "machine.gtceu.uev_electromagnetic_separator.tooltip": "§7EMF Dispeller", + "machine.gtceu.uev_extractor.tooltip": "§7Liquefying Sucker", + "machine.gtceu.uev_extruder.tooltip": "§7Shape Driver", + "machine.gtceu.uev_fermenter.tooltip": "§7Respiration Controller", + "machine.gtceu.uev_fluid_heater.tooltip": "§7Thermal Imbuer", + "machine.gtceu.uev_fluid_solidifier.tooltip": "§7Fluid Petrificator", + "machine.gtceu.uev_forge_hammer.tooltip": "§7Impact Modulator", + "machine.gtceu.uev_forming_press.tooltip": "§7Surface Shifter", + "machine.gtceu.uev_gas_collector.tooltip": "§7Collects Gas from the solar system depending on the dimension", + "machine.gtceu.uev_laser_engraver.tooltip": "§7Exact Photon Cannon", + "machine.gtceu.uev_lathe.tooltip": "§7Rotation Grinder", + "machine.gtceu.uev_macerator.tooltip": "§7Shape Eliminator", + "machine.gtceu.uev_mass_fabricator.tooltip": "§7Existence Initiator", + "machine.gtceu.uev_mixer.tooltip": "§7Material Homogenizer", + "machine.gtceu.uev_ore_washer.tooltip": "§7Miniature Car Wash", + "machine.gtceu.uev_packer.tooltip": "§7Amazon Warehouse", + "machine.gtceu.uev_polarizer.tooltip": "§7Magnetic Field Rearranger", + "machine.gtceu.uev_replicator.tooltip": "§7Elemental Composer", + "machine.gtceu.uev_rock_crusher.tooltip": "§7Volcanic Formation Chamber", + "machine.gtceu.uev_scanner.tooltip": "§7Electron Microscope", + "machine.gtceu.uev_sifter.tooltip": "§7Pulsation Filter", + "machine.gtceu.uev_thermal_centrifuge.tooltip": "§7Fire Cyclone", + "machine.gtceu.uev_wiremill.tooltip": "§7Wire Transfigurator", + "machine.gtceu.uhv_alloy_smelter.tooltip": "§7Metal Amalgamator", + "machine.gtceu.uhv_arc_furnace.tooltip": "§7Short Circuit Heater", + "machine.gtceu.uhv_assembler.tooltip": "§7Assembly Constructor", + "machine.gtceu.uhv_autoclave.tooltip": "§7Encumbrance Unit", + "machine.gtceu.uhv_bender.tooltip": "§7Matter Deformer", + "machine.gtceu.uhv_brewery.tooltip": "§7Brew Rusher", + "machine.gtceu.uhv_canner.tooltip": "§7Can Actuator", + "machine.gtceu.uhv_centrifuge.tooltip": "§7Molecular Tornado", + "machine.gtceu.uhv_chemical_bath.tooltip": "§7Chemical Dunktron", + "machine.gtceu.uhv_chemical_reactor.tooltip": "§7Reaction Catalyzer", + "machine.gtceu.uhv_circuit_assembler.tooltip": "§7Computation Factory", + "machine.gtceu.uhv_compressor.tooltip": "§7Matter Constrictor", + "machine.gtceu.uhv_cutter.tooltip": "§7Object Divider", + "machine.gtceu.uhv_distillery.tooltip": "§7Fraction Splitter", + "machine.gtceu.uhv_electric_furnace.tooltip": "§7Atom Stimulator", + "machine.gtceu.uhv_electrolyzer.tooltip": "§7Atomic Ionizer", + "machine.gtceu.uhv_electromagnetic_separator.tooltip": "§7EMF Dispeller", + "machine.gtceu.uhv_extractor.tooltip": "§7Liquefying Sucker", + "machine.gtceu.uhv_extruder.tooltip": "§7Shape Driver", + "machine.gtceu.uhv_fermenter.tooltip": "§7Respiration Controller", + "machine.gtceu.uhv_fluid_heater.tooltip": "§7Thermal Imbuer", + "machine.gtceu.uhv_fluid_solidifier.tooltip": "§7Fluid Petrificator", + "machine.gtceu.uhv_forge_hammer.tooltip": "§7Impact Modulator", + "machine.gtceu.uhv_forming_press.tooltip": "§7Surface Shifter", + "machine.gtceu.uhv_gas_collector.tooltip": "§7Collects Gas from the solar system depending on the dimension", + "machine.gtceu.uhv_laser_engraver.tooltip": "§7Exact Photon Cannon", + "machine.gtceu.uhv_lathe.tooltip": "§7Rotation Grinder", + "machine.gtceu.uhv_macerator.tooltip": "§7Shape Eliminator", + "machine.gtceu.uhv_mass_fabricator.tooltip": "§7Existence Initiator", + "machine.gtceu.uhv_mixer.tooltip": "§7Material Homogenizer", + "machine.gtceu.uhv_ore_washer.tooltip": "§7Miniature Car Wash", + "machine.gtceu.uhv_packer.tooltip": "§7Amazon Warehouse", + "machine.gtceu.uhv_polarizer.tooltip": "§7Magnetic Field Rearranger", + "machine.gtceu.uhv_replicator.tooltip": "§7Elemental Composer", + "machine.gtceu.uhv_rock_crusher.tooltip": "§7Volcanic Formation Chamber", + "machine.gtceu.uhv_scanner.tooltip": "§7Electron Microscope", + "machine.gtceu.uhv_sifter.tooltip": "§7Pulsation Filter", + "machine.gtceu.uhv_thermal_centrifuge.tooltip": "§7Fire Cyclone", + "machine.gtceu.uhv_wiremill.tooltip": "§7Wire Transfigurator", + "machine.gtceu.uiv_alloy_smelter.tooltip": "§7Metal Amalgamator", + "machine.gtceu.uiv_arc_furnace.tooltip": "§7Short Circuit Heater", + "machine.gtceu.uiv_assembler.tooltip": "§7Assembly Constructor", + "machine.gtceu.uiv_autoclave.tooltip": "§7Encumbrance Unit", + "machine.gtceu.uiv_bender.tooltip": "§7Matter Deformer", + "machine.gtceu.uiv_brewery.tooltip": "§7Brew Rusher", + "machine.gtceu.uiv_canner.tooltip": "§7Can Actuator", + "machine.gtceu.uiv_centrifuge.tooltip": "§7Molecular Tornado", + "machine.gtceu.uiv_chemical_bath.tooltip": "§7Chemical Dunktron", + "machine.gtceu.uiv_chemical_reactor.tooltip": "§7Reaction Catalyzer", + "machine.gtceu.uiv_circuit_assembler.tooltip": "§7Computation Factory", + "machine.gtceu.uiv_compressor.tooltip": "§7Matter Constrictor", + "machine.gtceu.uiv_cutter.tooltip": "§7Object Divider", + "machine.gtceu.uiv_distillery.tooltip": "§7Fraction Splitter", + "machine.gtceu.uiv_electric_furnace.tooltip": "§7Atom Stimulator", + "machine.gtceu.uiv_electrolyzer.tooltip": "§7Atomic Ionizer", + "machine.gtceu.uiv_electromagnetic_separator.tooltip": "§7EMF Dispeller", + "machine.gtceu.uiv_extractor.tooltip": "§7Liquefying Sucker", + "machine.gtceu.uiv_extruder.tooltip": "§7Shape Driver", + "machine.gtceu.uiv_fermenter.tooltip": "§7Respiration Controller", + "machine.gtceu.uiv_fluid_heater.tooltip": "§7Thermal Imbuer", + "machine.gtceu.uiv_fluid_solidifier.tooltip": "§7Fluid Petrificator", + "machine.gtceu.uiv_forge_hammer.tooltip": "§7Impact Modulator", + "machine.gtceu.uiv_forming_press.tooltip": "§7Surface Shifter", + "machine.gtceu.uiv_gas_collector.tooltip": "§7Collects Gas from the solar system depending on the dimension", + "machine.gtceu.uiv_laser_engraver.tooltip": "§7Exact Photon Cannon", + "machine.gtceu.uiv_lathe.tooltip": "§7Rotation Grinder", + "machine.gtceu.uiv_macerator.tooltip": "§7Shape Eliminator", + "machine.gtceu.uiv_mass_fabricator.tooltip": "§7Existence Initiator", + "machine.gtceu.uiv_mixer.tooltip": "§7Material Homogenizer", + "machine.gtceu.uiv_ore_washer.tooltip": "§7Miniature Car Wash", + "machine.gtceu.uiv_packer.tooltip": "§7Amazon Warehouse", + "machine.gtceu.uiv_polarizer.tooltip": "§7Magnetic Field Rearranger", + "machine.gtceu.uiv_replicator.tooltip": "§7Elemental Composer", + "machine.gtceu.uiv_rock_crusher.tooltip": "§7Volcanic Formation Chamber", + "machine.gtceu.uiv_scanner.tooltip": "§7Electron Microscope", + "machine.gtceu.uiv_sifter.tooltip": "§7Pulsation Filter", + "machine.gtceu.uiv_thermal_centrifuge.tooltip": "§7Fire Cyclone", + "machine.gtceu.uiv_wiremill.tooltip": "§7Wire Transfigurator", + "machine.gtceu.ulv_alloy_smelter.tooltip": "§7HighTech combination Smelter", + "machine.gtceu.ulv_arc_furnace.tooltip": "§7Who needs a Blast Furnace?", + "machine.gtceu.ulv_assembler.tooltip": "§7Avengers, Assemble!", + "machine.gtceu.ulv_autoclave.tooltip": "§7Crystallizing your Dusts", + "machine.gtceu.ulv_bender.tooltip": "§7Boo, he's bad! We want BENDER!!!", + "machine.gtceu.ulv_brewery.tooltip": "§7Compact and efficient potion brewing", + "machine.gtceu.ulv_canner.tooltip": "§7Puts things into and out of Containers", + "machine.gtceu.ulv_chemical_bath.tooltip": "§7Bathing Ores in Chemicals to separate them", + "machine.gtceu.ulv_chemical_reactor.tooltip": "§7Letting Chemicals react with each other", + "machine.gtceu.ulv_circuit_assembler.tooltip": "§7Pick-n-Place all over the place", + "machine.gtceu.ulv_compressor.tooltip": "§7Compress-O-Matic C77", + "machine.gtceu.ulv_cutter.tooltip": "§7Slice'N Dice", + "machine.gtceu.ulv_distillery.tooltip": "§7Extracting most relevant Parts of Fluids", + "machine.gtceu.ulv_electric_furnace.tooltip": "§7Not like using a Commodore 64", + "machine.gtceu.ulv_electromagnetic_separator.tooltip": "§7Separating the magnetic Ores from the rest", + "machine.gtceu.ulv_extractor.tooltip": "§7Dejuicer-Device of Doom - D123", + "machine.gtceu.ulv_extruder.tooltip": "§7Universal Machine for Metal Working", + "machine.gtceu.ulv_fermenter.tooltip": "§7Fermenting Fluids", + "machine.gtceu.ulv_fluid_heater.tooltip": "§7Heating up your Fluids", + "machine.gtceu.ulv_fluid_solidifier.tooltip": "§7Cools Fluids down to form Solids", + "machine.gtceu.ulv_forge_hammer.tooltip": "§7Stop, Hammertime!", + "machine.gtceu.ulv_forming_press.tooltip": "§7Imprinting Images into things", + "machine.gtceu.ulv_mass_fabricator.tooltip": "§7UUM Matter * Fabrication Squared", + "machine.gtceu.ulv_mixer.tooltip": "§7Will it Blend?", + "machine.gtceu.ulv_packer.tooltip": "§7Puts things into and Grabs things out of Boxes", + "machine.gtceu.ulv_polarizer.tooltip": "§7Bipolarising your Magnets", + "machine.gtceu.ulv_replicator.tooltip": "§7Producing the Purest of Elements", + "machine.gtceu.ulv_scanner.tooltip": "§7Scans Materials and other things", + "machine.gtceu.ulv_sifter.tooltip": "§7Stay calm and keep sifting", + "machine.gtceu.ulv_wiremill.tooltip": "§7Produces Wires more efficiently", + "machine.gtceu.uv_alloy_smelter.tooltip": "§7Metal Amalgamator", + "machine.gtceu.uv_arc_furnace.tooltip": "§7Short Circuit Heater", + "machine.gtceu.uv_assembler.tooltip": "§7Assembly Constructor", + "machine.gtceu.uv_autoclave.tooltip": "§7Encumbrance Unit", + "machine.gtceu.uv_bender.tooltip": "§7Matter Deformer", + "machine.gtceu.uv_brewery.tooltip": "§7Brew Rusher", + "machine.gtceu.uv_canner.tooltip": "§7Can Actuator", + "machine.gtceu.uv_centrifuge.tooltip": "§7Molecular Tornado", + "machine.gtceu.uv_chemical_bath.tooltip": "§7Chemical Dunktron", + "machine.gtceu.uv_chemical_reactor.tooltip": "§7Reaction Catalyzer", + "machine.gtceu.uv_circuit_assembler.tooltip": "§7Computation Factory", + "machine.gtceu.uv_compressor.tooltip": "§7Matter Constrictor", + "machine.gtceu.uv_cutter.tooltip": "§7Object Divider", + "machine.gtceu.uv_distillery.tooltip": "§7Fraction Splitter", + "machine.gtceu.uv_electric_furnace.tooltip": "§7Atom Stimulator", + "machine.gtceu.uv_electrolyzer.tooltip": "§7Atomic Ionizer", + "machine.gtceu.uv_electromagnetic_separator.tooltip": "§7EMF Dispeller", + "machine.gtceu.uv_extractor.tooltip": "§7Liquefying Sucker", + "machine.gtceu.uv_extruder.tooltip": "§7Shape Driver", + "machine.gtceu.uv_fermenter.tooltip": "§7Respiration Controller", + "machine.gtceu.uv_fluid_heater.tooltip": "§7Thermal Imbuer", + "machine.gtceu.uv_fluid_solidifier.tooltip": "§7Fluid Petrificator", + "machine.gtceu.uv_forge_hammer.tooltip": "§7Impact Modulator", + "machine.gtceu.uv_forming_press.tooltip": "§7Surface Shifter", + "machine.gtceu.uv_fusion_reactor.tooltip": "A WHITE DWARF DOWN ON YOUR BASE", + "machine.gtceu.uv_gas_collector.tooltip": "§7Collects Gas from the solar system depending on the dimension", + "machine.gtceu.uv_laser_engraver.tooltip": "§7Exact Photon Cannon", + "machine.gtceu.uv_lathe.tooltip": "§7Rotation Grinder", + "machine.gtceu.uv_macerator.tooltip": "§7Shape Eliminator", + "machine.gtceu.uv_mass_fabricator.tooltip": "§7Existence Initiator", + "machine.gtceu.uv_mixer.tooltip": "§7Material Homogenizer", + "machine.gtceu.uv_ore_washer.tooltip": "§7Miniature Car Wash", + "machine.gtceu.uv_packer.tooltip": "§7Amazon Warehouse", + "machine.gtceu.uv_polarizer.tooltip": "§7Magnetic Field Rearranger", + "machine.gtceu.uv_replicator.tooltip": "§7Elemental Composer", + "machine.gtceu.uv_rock_crusher.tooltip": "§7Volcanic Formation Chamber", + "machine.gtceu.uv_scanner.tooltip": "§7Electron Microscope", + "machine.gtceu.uv_sifter.tooltip": "§7Pulsation Filter", + "machine.gtceu.uv_thermal_centrifuge.tooltip": "§7Fire Cyclone", + "machine.gtceu.uv_wiremill.tooltip": "§7Wire Transfigurator", + "machine.gtceu.uxv_alloy_smelter.tooltip": "§7Metal Amalgamator", + "machine.gtceu.uxv_arc_furnace.tooltip": "§7Short Circuit Heater", + "machine.gtceu.uxv_assembler.tooltip": "§7Assembly Constructor", + "machine.gtceu.uxv_autoclave.tooltip": "§7Encumbrance Unit", + "machine.gtceu.uxv_bender.tooltip": "§7Matter Deformer", + "machine.gtceu.uxv_brewery.tooltip": "§7Brew Rusher", + "machine.gtceu.uxv_canner.tooltip": "§7Can Actuator", + "machine.gtceu.uxv_centrifuge.tooltip": "§7Molecular Tornado", + "machine.gtceu.uxv_chemical_bath.tooltip": "§7Chemical Dunktron", + "machine.gtceu.uxv_chemical_reactor.tooltip": "§7Reaction Catalyzer", + "machine.gtceu.uxv_circuit_assembler.tooltip": "§7Computation Factory", + "machine.gtceu.uxv_compressor.tooltip": "§7Matter Constrictor", + "machine.gtceu.uxv_cutter.tooltip": "§7Object Divider", + "machine.gtceu.uxv_distillery.tooltip": "§7Fraction Splitter", + "machine.gtceu.uxv_electric_furnace.tooltip": "§7Atom Stimulator", + "machine.gtceu.uxv_electrolyzer.tooltip": "§7Atomic Ionizer", + "machine.gtceu.uxv_electromagnetic_separator.tooltip": "§7EMF Dispeller", + "machine.gtceu.uxv_extractor.tooltip": "§7Liquefying Sucker", + "machine.gtceu.uxv_extruder.tooltip": "§7Shape Driver", + "machine.gtceu.uxv_fermenter.tooltip": "§7Respiration Controller", + "machine.gtceu.uxv_fluid_heater.tooltip": "§7Thermal Imbuer", + "machine.gtceu.uxv_fluid_solidifier.tooltip": "§7Fluid Petrificator", + "machine.gtceu.uxv_forge_hammer.tooltip": "§7Impact Modulator", + "machine.gtceu.uxv_forming_press.tooltip": "§7Surface Shifter", + "machine.gtceu.uxv_gas_collector.tooltip": "§7Collects Gas from the solar system depending on the dimension", + "machine.gtceu.uxv_laser_engraver.tooltip": "§7Exact Photon Cannon", + "machine.gtceu.uxv_lathe.tooltip": "§7Rotation Grinder", + "machine.gtceu.uxv_macerator.tooltip": "§7Shape Eliminator", + "machine.gtceu.uxv_mass_fabricator.tooltip": "§7Existence Initiator", + "machine.gtceu.uxv_mixer.tooltip": "§7Material Homogenizer", + "machine.gtceu.uxv_ore_washer.tooltip": "§7Miniature Car Wash", + "machine.gtceu.uxv_packer.tooltip": "§7Amazon Warehouse", + "machine.gtceu.uxv_polarizer.tooltip": "§7Magnetic Field Rearranger", + "machine.gtceu.uxv_replicator.tooltip": "§7Elemental Composer", + "machine.gtceu.uxv_rock_crusher.tooltip": "§7Volcanic Formation Chamber", + "machine.gtceu.uxv_scanner.tooltip": "§7Electron Microscope", + "machine.gtceu.uxv_sifter.tooltip": "§7Pulsation Filter", + "machine.gtceu.uxv_thermal_centrifuge.tooltip": "§7Fire Cyclone", + "machine.gtceu.uxv_wiremill.tooltip": "§7Wire Transfigurator", + "machine.gtceu.vacuum_freezer.tooltip": "Aluminium Ice Box", + "machine.gtceu.world_accelerator.description": "Tick accelerates nearby blocks in one of 2 modes: §fTile Entity§7 or §fRandom Tick§7. Use Screwdriver to change mode.", + "machine.gtceu.world_accelerator.mode_entity": "Random Tick Mode", + "machine.gtceu.world_accelerator.mode_tile": "Block Entity Mode", + "machine.gtceu.world_accelerator.working_area": "§bWorking Area:", + "machine.gtceu.world_accelerator.working_area_random": " Random Tick Mode:§f %dx%d", + "machine.gtceu.world_accelerator.working_area_tile": " Block Entity Mode:§f Adjacent Blocks", + "machine.gtceu.zpm_alloy_smelter.tooltip": "§7Alloy Integrator", + "machine.gtceu.zpm_arc_furnace.tooltip": "§7Discharge Heater", + "machine.gtceu.zpm_assembler.tooltip": "§7NOT a Crafting Table", + "machine.gtceu.zpm_autoclave.tooltip": "§7Pressure Cooker", + "machine.gtceu.zpm_bender.tooltip": "§7Shape Distorter", + "machine.gtceu.zpm_brewery.tooltip": "§7Brewing your Drinks", + "machine.gtceu.zpm_canner.tooltip": "§7Can Operator", + "machine.gtceu.zpm_centrifuge.tooltip": "§7Molecular Cyclone", + "machine.gtceu.zpm_chemical_bath.tooltip": "§7Chemical Soaker", + "machine.gtceu.zpm_chemical_reactor.tooltip": "§7Chemical Performer", + "machine.gtceu.zpm_circuit_assembler.tooltip": "§7Electronics Manufacturer", + "machine.gtceu.zpm_compressor.tooltip": "§7Singularity Condenser", + "machine.gtceu.zpm_cutter.tooltip": "§7Matter Cleaver", + "machine.gtceu.zpm_distillery.tooltip": "§7Condensation Separator", + "machine.gtceu.zpm_electric_furnace.tooltip": "§7Electron Excitement Processor", + "machine.gtceu.zpm_electrolyzer.tooltip": "§7Molecular Disintegrator E-4908", + "machine.gtceu.zpm_electromagnetic_separator.tooltip": "§7EM Categorizer", + "machine.gtceu.zpm_extractor.tooltip": "§7Vacuum Extractinator", + "machine.gtceu.zpm_extruder.tooltip": "§7Material Displacer", + "machine.gtceu.zpm_fermenter.tooltip": "§7Fermentation Hastener", + "machine.gtceu.zpm_fluid_heater.tooltip": "§7Heat Infuser", + "machine.gtceu.zpm_fluid_solidifier.tooltip": "§7Not an Ice Machine", + "machine.gtceu.zpm_forge_hammer.tooltip": "§7Plate Forger", + "machine.gtceu.zpm_forming_press.tooltip": "§7Object Layerer", + "machine.gtceu.zpm_fusion_reactor.tooltip": "A SUN DOWN ON EARTH", + "machine.gtceu.zpm_gas_collector.tooltip": "§7Collects Gas from the atmosphere depending on the dimension", + "machine.gtceu.zpm_laser_engraver.tooltip": "§7With the Power of 32.64 MW", + "machine.gtceu.zpm_lathe.tooltip": "§7Turn-O-Matic L-5908", + "machine.gtceu.zpm_macerator.tooltip": "§7Blend-O-Matic 9003", + "machine.gtceu.zpm_mass_fabricator.tooltip": "§7Genesis Factory", + "machine.gtceu.zpm_mixer.tooltip": "§7Matter Organizer", + "machine.gtceu.zpm_ore_washer.tooltip": "§7Repurposed Laundry-Washer I-362", + "machine.gtceu.zpm_packer.tooltip": "§7Boxinator", + "machine.gtceu.zpm_polarizer.tooltip": "§7Magnetism Inducer", + "machine.gtceu.zpm_replicator.tooltip": "§7Matter Paster", + "machine.gtceu.zpm_rock_crusher.tooltip": "§7Cryogenic Magma Solidifier R-10200", + "machine.gtceu.zpm_scanner.tooltip": "§7Anomaly Detector", + "machine.gtceu.zpm_sifter.tooltip": "§7Sponsored by TFC", + "machine.gtceu.zpm_thermal_centrifuge.tooltip": "§7Blaze Sweatshop T-6352", + "machine.gtceu.zpm_wiremill.tooltip": "§7Ingot Elongator", "material.gtceu.acetic_acid": "Acetic Acid", "material.gtceu.acetic_anhydride": "Acetic Anhydride", "material.gtceu.acetone": "Acetone", @@ -5719,102 +5620,6 @@ "medical_condition.gtceu.weak_poison.affected": "§aMinor poisoning", "message.gtceu.new_veins.amount": "Prospected %d new veins!", "message.gtceu.new_veins.name": "Prospected %s!", - "metaarmor.energy_share.disable": "Energy Supply: Gadgets charging disabled", - "metaarmor.energy_share.enable": "Energy Supply: Gadgets charging enabled", - "metaarmor.energy_share.error": "Energy Supply: §cNot enough power for gadgets charging!", - "metaarmor.energy_share.tooltip": "Supply mode: %s", - "metaarmor.energy_share.tooltip.guide": "To change mode shift-right click when holding item", - "metaarmor.hud.energy_lvl": "Energy Level: %s", - "metaarmor.hud.engine_enabled": "Engine Enabled: %s", - "metaarmor.hud.fuel_lvl": "Fuel Level: %s", - "metaarmor.hud.gravi_engine": "GraviEngine: %s", - "metaarmor.hud.hover_mode": "Hover Mode: %s", - "metaarmor.hud.status.disabled": "§cOFF", - "metaarmor.hud.status.enabled": "§aON", - "metaarmor.jetpack.emergency_hover_mode": "Emergency Hover Mode Enabled!", - "metaarmor.jetpack.flight.disable": "Jetpack: Flight Disabled", - "metaarmor.jetpack.flight.enable": "Jetpack: Flight Enabled", - "metaarmor.jetpack.hover.disable": "Jetpack: Hover Mode Disabled", - "metaarmor.jetpack.hover.enable": "Jetpack: Hover Mode Enabled", - "metaarmor.message.nightvision.disabled": "§bNightVision: §cOff", - "metaarmor.message.nightvision.enabled": "§bNightVision: §aOn", - "metaarmor.message.nightvision.error": "§cNot enough power!", - "metaarmor.message.step_assist.disabled": "§bStep-Assist: §cOff", - "metaarmor.message.step_assist.enabled": "§bStep-Assist: §aOn", - "metaarmor.nms.nightvision.disabled": "NanoMuscle™ Suite: NightVision Disabled", - "metaarmor.nms.nightvision.enabled": "NanoMuscle™ Suite: NightVision Enabled", - "metaarmor.nms.nightvision.error": "NanoMuscle™ Suite: §cNot enough power!", - "metaarmor.nms.share.disable": "NanoMuscle™ Suite: Charging Disabled", - "metaarmor.nms.share.enable": "NanoMuscle™ Suite: Charging Enabled", - "metaarmor.nms.share.error": "NanoMuscle™ Suite: §cNot enough power for charging!", - "metaarmor.nms.step_assist.disabled": "NanoMuscle™ Suite: StepAssist Disabled", - "metaarmor.nms.step_assist.enabled": "NanoMuscle™ Suite: StepAssist Enabled", - "metaarmor.qts.boosted_jump.disabled": "QuarkTech™ Suite: Jump Boost Disabled", - "metaarmor.qts.boosted_jump.enabled": "QuarkTech™ Suite: Jump Boost Enabled", - "metaarmor.qts.nightvision.disabled": "QuarkTech™ Suite: NightVision Disabled", - "metaarmor.qts.nightvision.enabled": "QuarkTech™ Suite: NightVision Enabled", - "metaarmor.qts.nightvision.error": "QuarkTech™ Suite: §cNot enough power!", - "metaarmor.qts.share.disable": "QuarkTech™ Suite: Charging Disabled", - "metaarmor.qts.share.enable": "QuarkTech™ Suite: Charging Enabled", - "metaarmor.qts.share.error": "QuarkTech™ Suite: §cNot enough power for charging!", - "metaarmor.qts.step_assist.disabled": "QuarkTech™ Suite: StepAssist Disabled", - "metaarmor.qts.step_assist.enabled": "QuarkTech™ Suite: StepAssist Enabled", - "metaarmor.tooltip.autoeat": "Replenishes Food Bar by Using Food from Inventory", - "metaarmor.tooltip.breath": "Replenishes Underwater Breath Bar", - "metaarmor.tooltip.burning": "Nullifies Burning", - "metaarmor.tooltip.falldamage": "Nullifies Fall Damage", - "metaarmor.tooltip.freezing": "Prevents Freezing", - "metaarmor.tooltip.jump": "Increases Jump Height and Distance", - "metaarmor.tooltip.potions": "Nullifies Harmful Effects", - "metaarmor.tooltip.speed": "Increases Running Speed", - "metaarmor.tooltip.stepassist": "Provides Step-Assist", - "metaitem.behavior.mode_switch.current_mode": "Mode: %s", - "metaitem.behavior.mode_switch.mode_switched": "§eMode Set to: %s", - "metaitem.behavior.mode_switch.tooltip": "Use while sneaking to switch mode", - "metaitem.clipboard.tooltip": "Can be written on (without any writing Instrument). Right-click on Wall to place, and Shift-Right-Click to remove", - "metaitem.cover.digital.mode.energy.disabled": "Click to enable Energy Mode", - "metaitem.cover.digital.mode.energy.enabled": "Energy Mode enabled", - "metaitem.cover.digital.mode.fluid.disabled": "Click to enable Fluid Mode", - "metaitem.cover.digital.mode.fluid.enabled": "Fluid Mode enabled", - "metaitem.cover.digital.mode.item.disabled": "Click to enable Item Mode", - "metaitem.cover.digital.mode.item.enabled": "Item Mode enabled", - "metaitem.cover.digital.mode.machine.disabled": "Click to enable Machine Mode", - "metaitem.cover.digital.mode.machine.enabled": "Machine Mode enabled", - "metaitem.cover.digital.mode.proxy.disabled": "Click to enable Proxy Mode", - "metaitem.cover.digital.mode.proxy.enabled": "Proxy Mode enabled", - "metaitem.cover.digital.tooltip": "Connects machines over §fPower Cables§7 to the §fCentral Monitor§7 as §fCover§7.", - "metaitem.cover.digital.wireless.tooltip.0": "§fWirelessly§7 connects machines to the §fCentral Monitor§7 as §fCover§7.", - "metaitem.cover.digital.wireless.tooltip.1": "§fRight Click§7 on the §fCentral Monitor§7 to remotely bind to it.", - "metaitem.cover.digital.wireless.tooltip.2": "§fSneak Right Click§7 to remove the current binding.", - "metaitem.cover.digital.wireless.tooltip.3": "§aBinding: §f%s", - "metaitem.crushed.tooltip.purify": "Right click a Cauldron to get Purified Ore", - "metaitem.debug_scanner.tooltip": "Tricorder", - "metaitem.dust.tooltip.purify": "Right click a Cauldron to get clean Dust", - "metaitem.electric.discharge_mode.disabled": "§eDischarge Mode Disabled", - "metaitem.electric.discharge_mode.enabled": "§eDischarge Mode Enabled", - "metaitem.electric.discharge_mode.tooltip": "Use while sneaking to toggle discharge mode", - "metaitem.generic.electric_item.stored": "%d/%d EU (%s)", - "metaitem.generic.electric_item.tooltip": "%d/%d EU - Tier %s", - "metaitem.generic.fluid_container.tooltip": "%d/%dL %s", - "metaitem.int_circuit.configuration": "Configuration: %d", - "metaitem.liquid_fuel_jetpack.tooltip": "Uses Combustion Generator Fuels for Thrust", - "metaitem.machine_configuration.mode": "§aConfiguration Mode:§r %s", - "metaitem.plugin.proxy.tooltips.1": "(Please adjust to proxy mode in the screen)", - "metaitem.plugin.tooltips.1": "Plugins can be added to the screen for more functionality.", - "metaitem.prospector.mode.bedrock_ore": "§bBedrock Ore Prospection Mode§r", - "metaitem.prospector.mode.fluid": "§bFluid Prospection Mode§r", - "metaitem.prospector.mode.ores": "§aOre Prospection Mode§r", - "metaitem.prospector.tooltip.modes": "Available Modes:", - "metaitem.prospector.tooltip.radius": "Scans range in a %s Chunk Radius", - "metaitem.record.sus.tooltip": "§7Leonz - Among Us Drip", - "metaitem.terminal.tooltip": "Sharp tools make good work", - "metaitem.terminal.tooltip.creative": "§bCreative Mode", - "metaitem.terminal.tooltip.hardware": "§aHardware: %d", - "metaitem.tool.tooltip.durability": "§fDurability: §a%d / %d", - "metaitem.tool.tooltip.primary_material": "§fMaterial: §e%s", - "metaitem.tool.tooltip.rotor.efficiency": "Turbine Efficiency: §9%d%%", - "metaitem.tool.tooltip.rotor.power": "Turbine Power: §9%d%%", - "metaitem.tricorder_scanner.tooltip": "Tricorder", "monitor.gui.title.argb": "ARGB:", "monitor.gui.title.back": "Back", "monitor.gui.title.config": "Config", @@ -5841,6 +5646,114 @@ "recipe.condition.rain.tooltip": "Rain Level: %d", "recipe.condition.steam_vent.tooltip": "Clean steam vent", "recipe.condition.thunder.tooltip": "Thunder Level: %d", + "recipe_type.gtceu.air_scrubber": "Air Scrubber", + "recipe_type.gtceu.alloy_blast_smelter": "Alloy Blast Smelter", + "recipe_type.gtceu.alloy_smelter": "Alloy Smelter", + "recipe_type.gtceu.arc_furnace": "Arc Furnace", + "recipe_type.gtceu.assembler": "Assembler", + "recipe_type.gtceu.assembly_line": "Assembly Line", + "recipe_type.gtceu.autoclave": "Autoclave", + "recipe_type.gtceu.bender": "Bender", + "recipe_type.gtceu.brewery": "Brewery", + "recipe_type.gtceu.canner": "Canner", + "recipe_type.gtceu.category.arc_furnace_recycling": "Plasma Scrapping", + "recipe_type.gtceu.category.chem_dyes": "Chemical Dyeing", + "recipe_type.gtceu.category.extractor_recycling": "Scrap Remelting", + "recipe_type.gtceu.category.ingot_molding": "Metal Molding", + "recipe_type.gtceu.category.macerator_recycling": "Part Grinding", + "recipe_type.gtceu.category.ore_bathing": "Ore Treating", + "recipe_type.gtceu.category.ore_crushing": "Ore Grinding", + "recipe_type.gtceu.category.ore_forging": "Ore Crushing", + "recipe_type.gtceu.centrifuge": "Centrifuge", + "recipe_type.gtceu.chemical_bath": "Chemical Bath", + "recipe_type.gtceu.chemical_reactor": "Chemical Reactor", + "recipe_type.gtceu.circuit_assembler": "Circuit Assembler", + "recipe_type.gtceu.coke_oven": "Coke Oven", + "recipe_type.gtceu.combustion_generator": "Combustion Generator", + "recipe_type.gtceu.combustion_generator.tooltip": "§7Requires flammable Liquids", + "recipe_type.gtceu.compressor": "Compressor", + "recipe_type.gtceu.cracker": "Cracker", + "recipe_type.gtceu.cutter": "Cutter", + "recipe_type.gtceu.distillation_tower": "Distillation Tower", + "recipe_type.gtceu.distillery": "Distillery", + "recipe_type.gtceu.dummy": "Dummy", + "recipe_type.gtceu.electric_blast_furnace": "Electric Blast Furnace", + "recipe_type.gtceu.electric_furnace": "Electric Furnace", + "recipe_type.gtceu.electrolyzer": "Electrolyzer", + "recipe_type.gtceu.electromagnetic_separator": "Electromagnetic Separator", + "recipe_type.gtceu.extractor": "Extractor", + "recipe_type.gtceu.extruder": "Extruder", + "recipe_type.gtceu.fermenter": "Fermenter", + "recipe_type.gtceu.fluid_heater": "Fluid Heater", + "recipe_type.gtceu.fluid_solidifier": "Fluid Solidifier", + "recipe_type.gtceu.forge_hammer": "Forge Hammer", + "recipe_type.gtceu.forming_press": "Forming Press", + "recipe_type.gtceu.fusion_reactor": "Fusion Reactor", + "recipe_type.gtceu.gas_collector": "Gas Collector", + "recipe_type.gtceu.gas_turbine": "Gas Turbine", + "recipe_type.gtceu.gas_turbine.tooltip": "§7Requires flammable Gases", + "recipe_type.gtceu.implosion_compressor": "Implosion Compressor", + "recipe_type.gtceu.large_boiler": "Large Boiler", + "recipe_type.gtceu.large_chemical_reactor": "Large Chemical Reactor", + "recipe_type.gtceu.laser_engraver": "Laser Engraver", + "recipe_type.gtceu.lathe": "Lathe", + "recipe_type.gtceu.macerator": "Macerator", + "recipe_type.gtceu.mixer": "Mixer", + "recipe_type.gtceu.ore_washer": "Ore Washer", + "recipe_type.gtceu.packer": "Packer", + "recipe_type.gtceu.plasma_generator": "Plasma Generator", + "recipe_type.gtceu.polarizer": "Polarizer", + "recipe_type.gtceu.primitive_blast_furnace": "Primitive Blast Furnace", + "recipe_type.gtceu.pyrolyse_oven": "Pyrolyse Oven", + "recipe_type.gtceu.research_station": "Research Station", + "recipe_type.gtceu.rock_breaker": "Rock Breaker", + "recipe_type.gtceu.scanner": "Scanner", + "recipe_type.gtceu.sifter": "Sifter", + "recipe_type.gtceu.steam_boiler": "Steam Boiler", + "recipe_type.gtceu.steam_turbine": "Steam Turbine", + "recipe_type.gtceu.steam_turbine.tooltip": "§7Converts Steam into EU", + "recipe_type.gtceu.thermal_centrifuge": "Thermal Centrifuge", + "recipe_type.gtceu.vacuum_freezer": "Vacuum Freezer", + "recipe_type.gtceu.wiremill": "Wiremill", + "subtitles.gtceu.arc": "Arcs buzzing", + "subtitles.gtceu.assembler": "Assembler constructing", + "subtitles.gtceu.bath": "Bath fizzing", + "subtitles.gtceu.boiler": "Boiler heating", + "subtitles.gtceu.centrifuge": "Centrifuge spinning", + "subtitles.gtceu.chainsaw": "Chainsaw revving", + "subtitles.gtceu.chemical": "Chemical bubbling", + "subtitles.gtceu.combustion": "Combusting", + "subtitles.gtceu.compressor": "Compressor squeezing", + "subtitles.gtceu.computation": "Computer beeps", + "subtitles.gtceu.cooling": "Freezer humming", + "subtitles.gtceu.cut": "Cutter whirring", + "subtitles.gtceu.drill": "Drilling", + "subtitles.gtceu.electrolyzer": "Electrolyzer sparking", + "subtitles.gtceu.file": "File rasping", + "subtitles.gtceu.fire": "Fire crackling", + "subtitles.gtceu.forge_hammer": "Forge Hammer thumping", + "subtitles.gtceu.furnace": "Furnace heating", + "subtitles.gtceu.jet_engine": "Jet roaring", + "subtitles.gtceu.macerator": "Macerator crushing", + "subtitles.gtceu.metal_pipe": "Destruction_Metal_Pole_L_Wave_2_0_0.wav", + "subtitles.gtceu.miner": "Miner excavating", + "subtitles.gtceu.mixer": "Mixer sloshing", + "subtitles.gtceu.mortar": "Mortar crushing", + "subtitles.gtceu.motor": "Motor humming", + "subtitles.gtceu.plunger": "Plunger popping", + "subtitles.gtceu.portable_scanner": "Scanning", + "subtitles.gtceu.portal_closing": "Portal closes", + "subtitles.gtceu.portal_opening": "Portal opens", + "subtitles.gtceu.replicator": "Replicator copying", + "subtitles.gtceu.saw": "Sawing", + "subtitles.gtceu.science": "s c i e n c e", + "subtitles.gtceu.screwdriver": "Screwing", + "subtitles.gtceu.soft_hammer": "Soft tap", + "subtitles.gtceu.spray_can": "Spraying", + "subtitles.gtceu.sus": "Sus...", + "subtitles.gtceu.turbine": "Turbine whizzing", + "subtitles.gtceu.wirecutter": "Wire snipped", + "subtitles.gtceu.wrench": "Wrench rattling", "symptom.gtceu.air_supply_debuff": "Lowered lung capacity", "symptom.gtceu.blindness": "Blindness", "symptom.gtceu.darkness": "Darkness", @@ -5868,6 +5781,7 @@ "tagprefix.cable_gt_single": "1x %s Cable", "tagprefix.chainsaw_head": "%s Chainsaw Head", "tagprefix.chipped_gem": "Chipped %s", + "tagprefix.crushed.tooltip.purify": "Right click a Cauldron to get Purified Ore", "tagprefix.crushed_ore": "Crushed %s Ore", "tagprefix.deepslate": "Deepslate %s Ore", "tagprefix.dense_plate": "Dense %s Plate", @@ -5900,6 +5814,7 @@ "tagprefix.netherrack": "Nether %s Ore", "tagprefix.nugget": "%s Nugget", "tagprefix.null": "%s Null", + "tagprefix.ore_dust.tooltip.purify": "Right click a Cauldron to get clean Dust", "tagprefix.pipe_huge_fluid": "Huge %s Fluid Pipe", "tagprefix.pipe_huge_item": "Huge %s Item Pipe", "tagprefix.pipe_huge_restrictive": "Huge Restrictive %s Item Pipe", @@ -5959,24 +5874,67 @@ "tagprefix.wire_gt_quadruple": "4x %s Wire", "tagprefix.wire_gt_single": "1x %s Wire", "tagprefix.wrench_tip": "%s Wrench Tip", - "tile.gtceu.brittle_charcoal.name": "Brittle Charcoal", - "tile.gtceu.brittle_charcoal.tooltip.0": "Produced by the Charcoal Pile Igniter.", - "tile.gtceu.brittle_charcoal.tooltip.1": "Mine this to get Charcoal.", - "tile.gtceu.foam.name": "Foam", - "tile.gtceu.petrified_foam.name": "Petrified Foam", - "tile.gtceu.reinforced_foam.name": "Reinforced Foam", - "tile.gtceu.reinforced_stone.name": "Reinforced Stone", - "tile.gtceu.seal.name": "Sealed Block", - "tooltip.gtceu.antidote.description": "§aAntidote §7Hold Shift to show details", - "tooltip.gtceu.antidote.description.effect_removed": "Removes %s%% of current conditions' effects", + "tool.gtceu.tooltip.attack_damage": "%s §cAttack Damage", + "tool.gtceu.tooltip.attack_speed": "%s §9Attack Speed", + "tool.gtceu.tooltip.crafting_uses": "%s §aCrafting Uses", + "tool.gtceu.tooltip.general_uses": "%s §bDurability", + "tool.gtceu.tooltip.harvest_level": "§eHarvest Level %s", + "tool.gtceu.tooltip.harvest_level_extra": "§eHarvest Level %s §f(%s§f)", + "tool.gtceu.tooltip.harvest_level_name.0": "§8Wood", + "tool.gtceu.tooltip.harvest_level_name.1": "§7Stone", + "tool.gtceu.tooltip.harvest_level_name.2": "§aIron", + "tool.gtceu.tooltip.harvest_level_name.3": "§bDiamond", + "tool.gtceu.tooltip.harvest_level_name.4": "§dNetherite", + "tool.gtceu.tooltip.harvest_level_name.5": "§9Duranium", + "tool.gtceu.tooltip.harvest_level_name.6": "§cNeutronium", + "tool.gtceu.tooltip.max_uses": "%s §eTotal Durability", + "tool.gtceu.tooltip.mining_speed": "%s §dMining Speed", + "tool.gtceu.tooltip.repair_material": "§8Repair with: §f§a%s", + "tool.gtceu.tooltip.replace_tool_head": "Craft with a new Tool Head to replace it", + "tool.gtceu.tooltip.show_repair_info": "§8Hold SHIFT to show Repair Info", + "tool.gtceu.tooltip.usable_as": "§8Usable as: §f%s", + "tool_action.gtceu.crowbar": "§8Use Crowbar to remove Covers", + "tool_action.gtceu.hammer": "§8Use Hard Hammer to muffle Sounds", + "tool_action.gtceu.screwdriver.access_covers": "§8Use Screwdriver to access Covers", + "tool_action.gtceu.screwdriver.auto_collapse": "§8Use Screwdriver to toggle Item collapsing", + "tool_action.gtceu.screwdriver.auto_output": "§8Use Screwdriver to toggle Auto-Output", + "tool_action.gtceu.screwdriver.auto_output_covers": "§8Use Screwdriver to Allow Input from Output Side or access Covers", + "tool_action.gtceu.screwdriver.toggle_mode": "§8Use Screwdriver to toggle Modes", + "tool_action.gtceu.screwdriver.toggle_mode_covers": "§8Use Screwdriver to toggle Modes or access Covers", + "tool_action.gtceu.show_tooltips": "Hold SHIFT to show Tool Info", + "tool_action.gtceu.soft_mallet.reset": "§8Use Soft Mallet to toggle Working", + "tool_action.gtceu.soft_mallet.toggle_mode": "§8Use Soft Mallet to toggle Modes", + "tool_action.gtceu.tape": "§8Use Tape to fix Maintenance Problems", + "tool_action.gtceu.wire_cutter.connect": "§8Use Wire Cutters to set Connections", + "tool_action.gtceu.wrench.connect": "§8Use Wrench to set Connections, sneak to block Connections", + "tool_action.gtceu.wrench.set_facing": "§8Use Wrench to set Facing", "tooltip.gtceu.antidote.description.effect_removed.all": "Removes all of current conditions' effects", - "tooltip.gtceu.antidote.description_shift": "§aCures these conditions:", + "tooltip.gtceu.cable.amperage": "§eMax Amperage:§r §e%d", + "tooltip.gtceu.cable.loss_per_block": "§cLoss/Meter/Ampere:§r §c%d§7 EU-Volt", + "tooltip.gtceu.cable.superconductor": "%s §dSuperconductor", + "tooltip.gtceu.cable.voltage": "§aMax Voltage:§r §a%d §a(%s§a)", + "tooltip.gtceu.duct_pipe.transfer_rate": "§bAir transfer rate: %s", + "tooltip.gtceu.fluid_pipe.acid_proof": "§6Can handle Acids", + "tooltip.gtceu.fluid_pipe.capacity": "§9Capacity: §f%d mB", + "tooltip.gtceu.fluid_pipe.channels": "§eChannels: §f%d", + "tooltip.gtceu.fluid_pipe.cryo_proof": "§6Can handle Cryogenics", + "tooltip.gtceu.fluid_pipe.gas_proof": "§6Can handle Gases", + "tooltip.gtceu.fluid_pipe.max_temperature": "§cTemperature Limit: §f%s", + "tooltip.gtceu.fluid_pipe.not_gas_proof": "§4Gases may leak!", + "tooltip.gtceu.fluid_pipe.plasma_proof": "§6Can handle all Plasmas", + "tooltip.gtceu.fluid_property.acid": "§6Acidic! Handle with care!", + "tooltip.gtceu.fluid_property.cryogenic": "§bCryogenic! Handle with care!", + "tooltip.gtceu.fluid_property.temperature": "§cTemperature: %s", + "tooltip.gtceu.fluid_state.gas": "§aState: Gaseous", + "tooltip.gtceu.fluid_state.liquid": "§aState: Liquid", + "tooltip.gtceu.fluid_state.plasma": "§aState: Plasma", "tooltip.gtceu.hazard_trigger": "Caused by:", "tooltip.gtceu.hazard_trigger.any": "Any contact", "tooltip.gtceu.hazard_trigger.inhalation": "Inhalation", "tooltip.gtceu.hazard_trigger.none": "Nothing", "tooltip.gtceu.hazard_trigger.protection": "Protects from:", "tooltip.gtceu.hazard_trigger.skin_contact": "Skin contact", + "tooltip.gtceu.item_pipe.priority": "§9Priority: §f%d", "tooltip.gtceu.medical_condition.description": "§l§cHAZARDOUS §7Hold Shift to show details", "tooltip.gtceu.medical_condition.description_shift": "§l§cHAZARDOUS:" } \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java index 2ea0b7d0787..ae0e35cd3be 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -191,8 +191,10 @@ public void appendHoverText(ItemStack stack, @Nullable BlockGetter level, List tooltip, long current unitKey = "gui.hours"; } tooltip.add(Component.translatable("item.gtceu.battery.charge_detailed", - FormattingUtil.formatNumbers(currentCharge), FormattingUtil.formatNumbers(maxCharge), - GTValues.VNF[tier], - FormattingUtil.formatNumbers(currentChargeTime), - Component.translatable(unitKey, FormattingUtil.formatNumbers(maxChargeTime)) - ).withStyle(color)); + FormattingUtil.formatNumbers(currentCharge), FormattingUtil.formatNumbers(maxCharge), + GTValues.VNF[tier], + FormattingUtil.formatNumbers(currentChargeTime), + Component.translatable(unitKey, FormattingUtil.formatNumbers(maxChargeTime))).withStyle(color)); } else { tooltip.add(Component.translatable("item.generic.electric_item.tooltip", FormattingUtil.formatNumbers(currentCharge), FormattingUtil.formatNumbers(maxCharge), diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java index 8b08e581984..db53314c866 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -1011,8 +1011,10 @@ public boolean showFancyTooltip() { public void onAddFancyInformationTooltip(List tooltips) { getDefinition().getTooltipBuilder().accept(getDefinition().asStack(), tooltips); - /*String mainKey = String.format("%s.machine.%s.tooltip", getDefinition().getId().getNamespace(), - getDefinition().getId().getPath());*/ + /* + * String mainKey = String.format("%s.machine.%s.tooltip", getDefinition().getId().getNamespace(), + * getDefinition().getId().getPath()); + */ String mainKey = getDefinition().getId().toLanguageKey("machine", "tooltip"); if (Language.getInstance().has(mainKey)) { tooltips.add(0, Component.translatable(mainKey)); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java index ee320163530..9aa3c3872d0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java @@ -25,8 +25,6 @@ import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangUtil; -import com.gregtechceu.gtceu.utils.GTTransferUtils; -import com.gregtechceu.gtceu.data.lang.LangHandler; import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CircuitFancyConfigurator.java b/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CircuitFancyConfigurator.java index 0622b219f6a..7c7acb65037 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CircuitFancyConfigurator.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CircuitFancyConfigurator.java @@ -19,7 +19,6 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraftforge.items.ItemStackHandler; diff --git a/src/main/java/com/gregtechceu/gtceu/api/placeholder/PlaceholderHandler.java b/src/main/java/com/gregtechceu/gtceu/api/placeholder/PlaceholderHandler.java index 24519f75bb4..8d9123fd996 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/placeholder/PlaceholderHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/placeholder/PlaceholderHandler.java @@ -7,6 +7,7 @@ import com.gregtechceu.gtceu.api.placeholder.exceptions.UnknownPlaceholderException; import com.gregtechceu.gtceu.client.renderer.monitor.IMonitorRenderer; import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; import com.gregtechceu.gtceu.utils.GTStringUtils; import com.gregtechceu.gtceu.utils.GTUtil; @@ -203,8 +204,7 @@ public static Widget getPlaceholderHandlerUI(String filter) { for (String placeholder : placeholders) { TextTextureWidget placeholderName = new TextTextureWidget(0, y, 80, 15, placeholder); placeholderName.getTextTexture().type = TextTexture.TextType.LEFT; - placeholderName.setHoverTooltips(GTStringUtils - .toImmutable(LangHandler.getSingleOrMultiLang("gtceu.placeholder_info." + placeholder))); + placeholderName.setHoverTooltips(LangUtil.getSingleOrMultiLang("gtceu.placeholder_info." + placeholder)); placeholderReference.addWidget(placeholderName); y += 15; } @@ -214,7 +214,7 @@ public static Widget getPlaceholderHandlerUI(String filter) { 280, 0, 160, 15, GTStringUtils.componentsToString( - LangHandler.getMultiLang("gtceu.gui.computer_monitor_cover.placeholder_reference"))); + List.of(LangUtil.getMultiLang("gtceu.gui.computer_monitor_cover.placeholder_reference")))); placeholderReferenceLabel.getTextTexture().type = TextTexture.TextType.LEFT; WidgetGroup out = new WidgetGroup(); out.addWidget(placeholderReferenceLabel); diff --git a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/GTRegistrate.java b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/GTRegistrate.java index 2b4a76919ca..251bc5b670c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/GTRegistrate.java +++ b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/GTRegistrate.java @@ -10,7 +10,6 @@ import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.registry.registrate.forge.GTFluidBuilder; import com.gregtechceu.gtceu.core.mixins.registrate.AbstractRegistrateAccessor; -import com.gregtechceu.gtceu.utils.FormattingUtil; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Registry; diff --git a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/provider/GTLangProvider.java b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/provider/GTLangProvider.java index 3ebf76076ae..87e337c7bb4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/provider/GTLangProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/provider/GTLangProvider.java @@ -59,6 +59,7 @@ public GTLangProvider(AbstractRegistrate owner, GatherDataEvent event, * Registers multiple values under the same key. *

* For example, a cumbersome way to add translations would be the following: + * *

 {@code
      * provider.add("terminal.fluid_prospector.tier.0", "radius size 1");
      * provider.add("terminal.fluid_prospector.tier.1", "radius size 2");
@@ -67,6 +68,7 @@ public GTLangProvider(AbstractRegistrate owner, GatherDataEvent event,
      * 

* * Instead, {@link #addMultiLang} can be used for the same result: + * *
 {@code
      * provider.addMultiLang("terminal.fluid_prospector.tier", "radius size 1", "radius size 2", "radius size 3");
      * } 
@@ -74,17 +76,18 @@ public GTLangProvider(AbstractRegistrate owner, GatherDataEvent event, * In situations requiring a large number of generated translations, the * following could be used instead, which * generates translations for 100 tiers: + * *
 {@code
      * provider.addMultiLang("terminal.fluid_prospector.tier", IntStream.of(100)
-     *                 .map(i -> i + 1)
-     *                 .mapToObj(Integer::toString)
-     *                 .map(i -> "radius size " + i)
-     *                 .toArray(String[]::new));
+     *         .map(i -> i + 1)
+     *         .mapToObj(Integer::toString)
+     *         .map(i -> "radius size " + i)
+     *         .toArray(String[]::new));
      * } 
* - * @param key Base key of the translation. The real key for each translation will be appended by ".0" for - * the first, ".1" for the second, etc. This ensures that the keys are unique. - * @param lines All translation lines. + * @param key Base key of the translation. The real key for each translation will be appended by ".0" for + * the first, ".1" for the second, etc. This ensures that the keys are unique. + * @param lines All translation lines. */ public void addMultiLang(String key, String... lines) { for (var i = 0; i < lines.length; i++) { @@ -95,11 +98,13 @@ public void addMultiLang(String key, String... lines) { /** * Adds one translation to the given lang provider per line in the given * multiline (a multiline is a String containing newline characters). For example, + * *
 {@code
      * provider.addMultiline("gtceu.gui.overclock.enabled", "Overclocking Enabled.\nClick to Disable");
      * } 
* * Results in the following translations: + * *
 {@code
      * "gtceu.gui.overclock.enabled.0": "Overclocking Enabled.",
      * "gtceu.gui.overclock.enabled.1": "Click to Disable",
diff --git a/src/main/java/com/gregtechceu/gtceu/client/TooltipsHandler.java b/src/main/java/com/gregtechceu/gtceu/client/TooltipsHandler.java
index 1d9ab0c4a9b..92e056a953e 100644
--- a/src/main/java/com/gregtechceu/gtceu/client/TooltipsHandler.java
+++ b/src/main/java/com/gregtechceu/gtceu/client/TooltipsHandler.java
@@ -12,9 +12,8 @@
 import com.gregtechceu.gtceu.common.data.GTFluids;
 import com.gregtechceu.gtceu.common.data.GTMaterials;
 import com.gregtechceu.gtceu.common.fluid.potion.PotionFluidHelper;
-import com.gregtechceu.gtceu.data.lang.LangHandler;
-import com.gregtechceu.gtceu.utils.FormattingUtil;
 import com.gregtechceu.gtceu.data.lang.LangUtil;
+import com.gregtechceu.gtceu.utils.FormattingUtil;
 import com.gregtechceu.gtceu.utils.GTUtil;
 
 import net.minecraft.ChatFormatting;
diff --git a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java
index e9df31ca017..0580dbb051d 100644
--- a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java
+++ b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java
@@ -80,7 +80,12 @@
 import net.minecraftforge.fml.javafmlmod.FMLModContainer;
 import net.minecraftforge.registries.RegisterEvent;
 
+import com.google.common.collect.Multimaps;
 import com.tterrag.registrate.providers.ProviderType;
+import com.tterrag.registrate.providers.RegistrateProvider;
+import com.tterrag.registrate.util.nullness.NonNullConsumer;
+
+import java.util.List;
 
 public class CommonProxy {
 
@@ -164,7 +169,8 @@ public static void init() {
                 // noinspection UnstableApiUsage
                 List> providers = Multimaps.asMap(accessor.getDatagens())
                         .get(ProviderType.LANG);
-                NonNullConsumer generator = (provider) -> MaterialLang.generate((GTLangProvider) provider, registry);
+                NonNullConsumer generator = (provider) -> MaterialLang
+                        .generate((GTLangProvider) provider, registry);
                 if (providers == null) {
                     accessor.getDatagens().put(ProviderType.LANG, generator);
                 } else {
diff --git a/src/main/java/com/gregtechceu/gtceu/common/block/LaserPipeBlock.java b/src/main/java/com/gregtechceu/gtceu/common/block/LaserPipeBlock.java
index 6b8fdb3b9b2..34b8860d158 100644
--- a/src/main/java/com/gregtechceu/gtceu/common/block/LaserPipeBlock.java
+++ b/src/main/java/com/gregtechceu/gtceu/common/block/LaserPipeBlock.java
@@ -4,8 +4,6 @@
 import com.gregtechceu.gtceu.api.block.PipeBlock;
 import com.gregtechceu.gtceu.api.block.property.GTBlockStateProperties;
 import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity;
-import com.gregtechceu.gtceu.api.capability.forge.GTCapability;
-import com.gregtechceu.gtceu.api.item.tool.GTToolType;
 import com.gregtechceu.gtceu.api.capability.GTCapability;
 import com.gregtechceu.gtceu.api.item.tool.GTToolType;
 import com.gregtechceu.gtceu.api.pipenet.IPipeNode;
diff --git a/src/main/java/com/gregtechceu/gtceu/common/block/OpticalPipeBlock.java b/src/main/java/com/gregtechceu/gtceu/common/block/OpticalPipeBlock.java
index e1a09b86720..63de5f63004 100644
--- a/src/main/java/com/gregtechceu/gtceu/common/block/OpticalPipeBlock.java
+++ b/src/main/java/com/gregtechceu/gtceu/common/block/OpticalPipeBlock.java
@@ -4,8 +4,6 @@
 import com.gregtechceu.gtceu.api.block.PipeBlock;
 import com.gregtechceu.gtceu.api.block.property.GTBlockStateProperties;
 import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity;
-import com.gregtechceu.gtceu.api.capability.forge.GTCapability;
-import com.gregtechceu.gtceu.api.item.tool.GTToolType;
 import com.gregtechceu.gtceu.api.capability.GTCapability;
 import com.gregtechceu.gtceu.api.item.tool.GTToolType;
 import com.gregtechceu.gtceu.api.pipenet.IPipeNode;
diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ComputerMonitorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ComputerMonitorCover.java
index 38db0276e52..5f61cb52f7e 100644
--- a/src/main/java/com/gregtechceu/gtceu/common/cover/ComputerMonitorCover.java
+++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ComputerMonitorCover.java
@@ -18,6 +18,7 @@
 import com.gregtechceu.gtceu.client.renderer.cover.CoverTextRenderer;
 import com.gregtechceu.gtceu.client.renderer.cover.IDynamicCoverRenderer;
 import com.gregtechceu.gtceu.data.lang.LangHandler;
+import com.gregtechceu.gtceu.data.lang.LangUtil;
 import com.gregtechceu.gtceu.integration.create.GTCreateIntegration;
 import com.gregtechceu.gtceu.utils.GTStringUtils;
 import com.gregtechceu.gtceu.utils.GTUtil;
@@ -135,8 +136,8 @@ public Widget createUIWidget() {
             formatStringInput.setSize(textFieldWidth, 15);
             formatStringInput.setSelfPosition(horizontalPadding + textFieldWidth / 2,
                     10 + verticalPadding + i * (15 + verticalPadding));
-            formatStringInput.setHoverTooltips(GTStringUtils.toImmutable(
-                    LangHandler.getMultiLang("gtceu.gui.computer_monitor_cover.main_textbox_tooltip", i + 1)));
+            formatStringInput.setHoverTooltips(
+                    LangUtil.getMultiLang("gtceu.gui.computer_monitor_cover.main_textbox_tooltip", i + 1));
             int finalI = i;
             if (i >= formatStringLines.size()) formatStringLines.add("");
             formatStringInput.setCurrentString(formatStringLines.get(i));
@@ -148,8 +149,8 @@ public Widget createUIWidget() {
                     horizontalPadding + 50,
                     20 * i);
             slot.setBackgroundTexture(SlotWidget.ITEM_SLOT_TEXTURE);
-            slot.setHoverTooltips(GTStringUtils
-                    .toImmutable(LangHandler.getMultiLang("gtceu.gui.computer_monitor_cover.slot_tooltip", i + 1)));
+            slot.setHoverTooltips(
+                    LangUtil.getMultiLang("gtceu.gui.computer_monitor_cover.slot_tooltip", i + 1));
             mainPage.addWidget(slot);
         }
         for (int i = 0; i < 8; i++) {
@@ -157,9 +158,9 @@ public Widget createUIWidget() {
             formatStringArgsInput.setSize(textFieldWidth, 15);
             formatStringArgsInput.setSelfPosition(textFieldWidth / 2 + horizontalPadding,
                     10 + verticalPadding + i * (15 + verticalPadding));
-            formatStringArgsInput.setHoverTooltips(GTStringUtils.toImmutable(
-                    LangHandler.getMultiLang("gtceu.gui.computer_monitor_cover.second_page_textbox_tooltip",
-                            GTStringUtils.getIntOrderingSuffix(i + 1))));
+            formatStringArgsInput.setHoverTooltips(
+                    LangUtil.getMultiLang("gtceu.gui.computer_monitor_cover.second_page_textbox_tooltip",
+                            GTStringUtils.getIntOrderingSuffix(i + 1)));
 
             int finalI = i;
             if (i >= formatStringArgs.size()) formatStringArgs.add("");
diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java
index 16d1ac507fa..cf843966443 100644
--- a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java
+++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java
@@ -65,18 +65,15 @@
 
 import com.google.common.base.Preconditions;
 import com.tterrag.registrate.builders.ItemBuilder;
-import com.tterrag.registrate.providers.DataGenContext;
 import com.tterrag.registrate.providers.ProviderType;
 import com.tterrag.registrate.util.entry.ItemEntry;
 import com.tterrag.registrate.util.nullness.NonNullBiConsumer;
 import com.tterrag.registrate.util.nullness.NonNullConsumer;
 import com.tterrag.registrate.util.nullness.NonNullFunction;
-import org.apache.commons.lang3.StringUtils;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.*;
 import java.util.function.Supplier;
-import java.util.stream.Collectors;
 
 import static com.gregtechceu.gtceu.common.data.GTCreativeModeTabs.*;
 import static com.gregtechceu.gtceu.common.data.models.GTModels.*;
diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java
index 7a8a266cdd7..83e8c6f1648 100644
--- a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java
+++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java
@@ -28,9 +28,6 @@
 import com.gregtechceu.gtceu.utils.GTMath;
 import com.gregtechceu.gtceu.utils.ResearchManager;
 
-import com.lowdragmc.lowdraglib.utils.LocalizationUtils;
-
-import net.minecraft.client.resources.language.I18n;
 import net.minecraft.core.HolderSet;
 import net.minecraft.core.registries.BuiltInRegistries;
 import net.minecraft.network.chat.CommonComponents;
@@ -148,7 +145,7 @@ public class GTRecipeTypes {
             .setSteamProgressBar(GuiTextures.PROGRESS_BAR_MACERATE_STEAM, LEFT_TO_RIGHT)
             .addCustomRecipeLogic(MaceratorLogic.INSTANCE)
             .setSound(GTSoundEntries.MACERATOR)
-            .addDataInfo(data -> LocalizationUtils.format("gtceu.recipe.byproduct_tier", GTValues.VNF[GTValues.HV]));
+            .addDataInfo(data -> Component.translatable("gtceu.recipe.byproduct_tier", GTValues.VNF[GTValues.HV]));
 
     public final static GTRecipeType CANNER_RECIPES = register("canner", ELECTRIC).setMaxIOSize(2, 2, 1, 1)
             .setEUIO(IO.IN)
diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GCYMMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GCYMMachines.java
index 7be82ae7a0f..862e11650ef 100644
--- a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GCYMMachines.java
+++ b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GCYMMachines.java
@@ -546,7 +546,8 @@ public static void init() {}
             .multiblock("large_brewer", WorkableElectricMultiblockMachine::new)
             .langValue("Large Brewing Vat")
             .tooltips(Component.translatable("gtceu.multiblock.parallelizable.tooltip"))
-            .tooltips(GTMachineUtils.getAvailableRecipeMapTooltip(BREWING_RECIPES, FERMENTING_RECIPES, FLUID_HEATER_RECIPES))
+            .tooltips(GTMachineUtils.getAvailableRecipeMapTooltip(BREWING_RECIPES, FERMENTING_RECIPES,
+                    FLUID_HEATER_RECIPES))
             .rotationState(RotationState.ALL)
             .recipeTypes(BREWING_RECIPES, FERMENTING_RECIPES, FLUID_HEATER_RECIPES)
             .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, OC_NON_PERFECT_SUBTICK, BATCH_MODE)
diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMachineUtils.java b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMachineUtils.java
index 0c6fce4872c..79ee6c6adff 100644
--- a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMachineUtils.java
+++ b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMachineUtils.java
@@ -320,7 +320,8 @@ public static MachineDefinition[] registerSimpleGenerator(String name,
                                                               Int2IntFunction tankScalingFunction,
                                                               float hazardStrengthPerOperation,
                                                               int... tiers) {
-        return registerSimpleGenerator(REGISTRATE, name, recipeType, addRecipeTooltip, tankScalingFunction, hazardStrengthPerOperation,
+        return registerSimpleGenerator(REGISTRATE, name, recipeType, addRecipeTooltip, tankScalingFunction,
+                hazardStrengthPerOperation,
                 tiers);
     }
 
@@ -957,7 +958,7 @@ public static Component[] workableTiered(int tier, long voltage, long energyCapa
     }
 
     public static Component getAvailableRecipeMapTooltip(GTRecipeType... recipeTypes) {
-        if(recipeTypes != null) {
+        if (recipeTypes != null) {
             String key = "machine.gtceu.available_recipe_map_" + recipeTypes.length + ".tooltip";
             return Component.translatable(key, Arrays.stream(recipeTypes)
                     .map(recipeType -> Component.translatable(recipeType.getCategory().getLanguageKey()))
diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMultiMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMultiMachines.java
index 921598713bc..2a672c9ce81 100644
--- a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMultiMachines.java
+++ b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMultiMachines.java
@@ -60,8 +60,8 @@
 import static com.gregtechceu.gtceu.common.data.GTMachines.*;
 import static com.gregtechceu.gtceu.common.data.GTMaterials.DrillingFluid;
 import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.*;
-import static com.gregtechceu.gtceu.common.data.GTRecipeTypes.DUMMY_RECIPES;
 import static com.gregtechceu.gtceu.common.data.GTRecipeTypes.*;
+import static com.gregtechceu.gtceu.common.data.GTRecipeTypes.DUMMY_RECIPES;
 import static com.gregtechceu.gtceu.common.data.machines.GTMachineUtils.*;
 import static com.gregtechceu.gtceu.common.data.models.GTMachineModels.*;
 import static com.gregtechceu.gtceu.common.registry.GTRegistration.REGISTRATE;
diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/NanoMuscleSuite.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/NanoMuscleSuite.java
index 6952bca66f9..d8252ccc43d 100644
--- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/NanoMuscleSuite.java
+++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/NanoMuscleSuite.java
@@ -78,11 +78,13 @@ public void onArmorTick(Level world, Player player, ItemStack itemStack) {
                 if (item.getCharge() < ArmorUtils.MIN_NIGHTVISION_CHARGE) {
                     nightVision = false;
                     if (world.isClientSide())
-                        player.displayClientMessage(Component.translatable("armor.gtceu.nano_muscle_suite.nightvision.error"), true);
+                        player.displayClientMessage(
+                                Component.translatable("armor.gtceu.nano_muscle_suite.nightvision.error"), true);
                 } else {
                     if (world.isClientSide()) player.displayClientMessage(Component
                             .translatable("armor.gtceu.nano_muscle_suite.nightvision." +
-                                    (nightVision ? "enabled" : "disabled")), true);
+                                    (nightVision ? "enabled" : "disabled")),
+                            true);
                 }
             }
 
diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/QuarkTechSuite.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/QuarkTechSuite.java
index 199e8b3340f..8efff0914bf 100644
--- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/QuarkTechSuite.java
+++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/QuarkTechSuite.java
@@ -98,10 +98,13 @@ public void onArmorTick(Level world, Player player, ItemStack itemStack) {
                 toggleTimer = 5;
                 if (item.getCharge() < ArmorUtils.MIN_NIGHTVISION_CHARGE) {
                     nightVision = false;
-                    player.displayClientMessage(Component.translatable("armor.gtceu.nano_muscle_suite.nightvision.error"), true);
+                    player.displayClientMessage(
+                            Component.translatable("armor.gtceu.nano_muscle_suite.nightvision.error"), true);
                 } else {
                     player.displayClientMessage(Component
-                            .translatable("armor.gtceu.nano_muscle_suite.nightvision." + (nightVision ? "enabled" : "disabled")), true);
+                            .translatable("armor.gtceu.nano_muscle_suite.nightvision." +
+                                    (nightVision ? "enabled" : "disabled")),
+                            true);
                 }
             }
 
@@ -166,7 +169,9 @@ public void onArmorTick(Level world, Player player, ItemStack itemStack) {
                 boostedJump = !boostedJump;
                 toggleBootsTimer = JUMPING_TIMER;
                 player.displayClientMessage(Component
-                        .translatable("armor.gtceu.nano_muscle_suite.boosted_jump." + (boostedJump ? "enabled" : "disabled")), true);
+                        .translatable(
+                                "armor.gtceu.quark_tech_suite.boosted_jump." + (boostedJump ? "enabled" : "disabled")),
+                        true);
             }
             if (boostedJump) {
                 if (!world.isClientSide) {
diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java
index 872134b86a3..54535550445 100644
--- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java
+++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java
@@ -19,10 +19,8 @@
 import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler;
 import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait;
 import com.gregtechceu.gtceu.config.ConfigHolder;
-import com.gregtechceu.gtceu.data.lang.LangHandler;
-import com.gregtechceu.gtceu.utils.ISubscription;
 import com.gregtechceu.gtceu.data.lang.LangUtil;
-import com.gregtechceu.gtceu.utils.GTTransferUtils;
+import com.gregtechceu.gtceu.utils.ISubscription;
 
 import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup;
 import com.lowdragmc.lowdraglib.utils.Position;
@@ -30,7 +28,6 @@
 import net.minecraft.MethodsReturnNonnullByDefault;
 import net.minecraft.Util;
 import net.minecraft.core.BlockPos;
-import net.minecraft.network.chat.MutableComponent;
 import net.minecraft.resources.ResourceLocation;
 import net.minecraft.server.level.ServerLevel;
 import net.minecraft.world.item.ItemStack;
diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java
index 826e594fe2f..17acf2c1d7e 100644
--- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java
+++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java
@@ -20,10 +20,8 @@
 import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler;
 import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait;
 import com.gregtechceu.gtceu.config.ConfigHolder;
-import com.gregtechceu.gtceu.data.lang.LangHandler;
-import com.gregtechceu.gtceu.utils.ISubscription;
 import com.gregtechceu.gtceu.data.lang.LangUtil;
-import com.gregtechceu.gtceu.utils.GTTransferUtils;
+import com.gregtechceu.gtceu.utils.ISubscription;
 
 import com.lowdragmc.lowdraglib.gui.texture.ItemStackTexture;
 import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup;
@@ -33,7 +31,6 @@
 import net.minecraft.Util;
 import net.minecraft.core.BlockPos;
 import net.minecraft.core.NonNullList;
-import net.minecraft.network.chat.MutableComponent;
 import net.minecraft.resources.ResourceLocation;
 import net.minecraft.server.level.ServerLevel;
 import net.minecraft.world.entity.EntityType;
diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java
index 762cffe0e68..9d2f25621b4 100644
--- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java
+++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java
@@ -24,10 +24,8 @@
 import com.gregtechceu.gtceu.common.data.GTItems;
 import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait;
 import com.gregtechceu.gtceu.config.ConfigHolder;
-import com.gregtechceu.gtceu.data.lang.LangHandler;
-import com.gregtechceu.gtceu.utils.ISubscription;
 import com.gregtechceu.gtceu.data.lang.LangUtil;
-import com.gregtechceu.gtceu.utils.GTTransferUtils;
+import com.gregtechceu.gtceu.utils.ISubscription;
 
 import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup;
 import com.lowdragmc.lowdraglib.utils.Position;
@@ -35,7 +33,6 @@
 import net.minecraft.MethodsReturnNonnullByDefault;
 import net.minecraft.Util;
 import net.minecraft.core.BlockPos;
-import net.minecraft.network.chat.MutableComponent;
 import net.minecraft.resources.ResourceLocation;
 import net.minecraft.util.Mth;
 import net.minecraft.world.entity.item.ItemEntity;
diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java
index 38146aa8a7a..fb4486cc15d 100644
--- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java
+++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java
@@ -22,8 +22,6 @@
 import com.gregtechceu.gtceu.common.machine.trait.miner.MinerLogic;
 import com.gregtechceu.gtceu.config.ConfigHolder;
 import com.gregtechceu.gtceu.data.lang.LangUtil;
-import com.gregtechceu.gtceu.utils.GTTransferUtils;
-import com.gregtechceu.gtceu.data.lang.LangHandler;
 import com.gregtechceu.gtceu.utils.ExtendedUseOnContext;
 import com.gregtechceu.gtceu.utils.ISubscription;
 
@@ -37,7 +35,6 @@
 import net.minecraft.Util;
 import net.minecraft.core.Direction;
 import net.minecraft.network.chat.Component;
-import net.minecraft.network.chat.MutableComponent;
 import net.minecraft.network.chat.Style;
 import net.minecraft.resources.ResourceLocation;
 import net.minecraft.world.InteractionResult;
diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java
index 73c81b133a4..d47f9a701eb 100644
--- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java
+++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java
@@ -29,6 +29,7 @@
 import com.gregtechceu.gtceu.common.network.GTNetwork;
 import com.gregtechceu.gtceu.common.network.packets.SCPacketMonitorGroupNBTChange;
 import com.gregtechceu.gtceu.data.lang.LangHandler;
+import com.gregtechceu.gtceu.data.lang.LangUtil;
 import com.gregtechceu.gtceu.utils.GTStringUtils;
 import com.gregtechceu.gtceu.utils.GTUtil;
 
@@ -324,7 +325,7 @@ public Widget createUIWidget() {
         ButtonWidget infoWidget = new ButtonWidget(200, 10, 20, 20, null);
         infoWidget.setButtonTexture(GuiTextures.INFO_ICON);
         infoWidget.setHoverTooltips(
-                GTStringUtils.toImmutable(LangHandler.getSingleOrMultiLang("gtceu.central_monitor.info_tooltip")));
+                LangUtil.getSingleOrMultiLang("gtceu.central_monitor.info_tooltip"));
         builder.addWidget(infoWidget);
         List<@Nullable MonitorGroup> configGroup = new ArrayList<>();
         configGroup.add(null);
@@ -346,8 +347,7 @@ public Widget createUIWidget() {
             }));
             for (int i = 0; i < 8; i++) {
                 SlotWidget slot = new SlotWidget(group.getPlaceholderSlotsHandler(), i, -38, 16 * i + 46);
-                slot.setHoverTooltips(GTStringUtils
-                        .toImmutable(LangHandler.getMultiLang("gtceu.gui.computer_monitor_cover.slot_tooltip", i + 1)));
+                slot.setHoverTooltips(LangUtil.getMultiLang("gtceu.gui.computer_monitor_cover.slot_tooltip", i + 1));
                 groupConfig.addWidget(slot);
             }
             SlotWidget slot = new SlotWidget(
diff --git a/src/main/java/com/gregtechceu/gtceu/data/GregTechDatagen.java b/src/main/java/com/gregtechceu/gtceu/data/GregTechDatagen.java
index ba1211d4254..f691ff2e633 100644
--- a/src/main/java/com/gregtechceu/gtceu/data/GregTechDatagen.java
+++ b/src/main/java/com/gregtechceu/gtceu/data/GregTechDatagen.java
@@ -1,7 +1,7 @@
 package com.gregtechceu.gtceu.data;
 
-import com.gregtechceu.gtceu.api.registry.registrate.provider.GTLangProvider;
 import com.gregtechceu.gtceu.api.registry.registrate.provider.GTBlockstateProvider;
+import com.gregtechceu.gtceu.api.registry.registrate.provider.GTLangProvider;
 import com.gregtechceu.gtceu.common.registry.GTRegistration;
 import com.gregtechceu.gtceu.core.mixins.registrate.RegistrateDataProviderAccessor;
 import com.gregtechceu.gtceu.data.lang.LangHandler;
@@ -15,7 +15,8 @@ public class GregTechDatagen {
     // we only register this so the class gets loaded. the key gets overwritten in #initPre.
     private static final ProviderType BLOCKSTATE_PROVIDER = ProviderType.register("ex_blockstate",
             GTBlockstateProvider::new);
-    private static final ProviderType LANG_PROVIDER = ProviderType.register("ex_lang", GTLangProvider::new);
+    private static final ProviderType LANG_PROVIDER = ProviderType.register("ex_lang",
+            GTLangProvider::new);
 
     public static void initPre() {
         // replace some default providers with ours
diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java
index bd9448f3f5e..bf0e97344ea 100644
--- a/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java
+++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java
@@ -8,6 +8,11 @@ public static void init(GTLangProvider provider) {
         generateArmorMessageKeys(provider);
         generateTooltipKeys(provider);
         generateHudKeys(provider);
+
+        provider.add("item.gtceu.armor.helmet", "%s Helmet");
+        provider.add("item.gtceu.armor.chestplate", "%s Chestplate");
+        provider.add("item.gtceu.armor.leggings", "%s Leggings");
+        provider.add("item.gtceu.armor.boots", "%s Boots");
     }
 
     private static void generateArmorMessageKeys(GTLangProvider provider) {
@@ -15,9 +20,8 @@ private static void generateArmorMessageKeys(GTLangProvider provider) {
         provider.add("armor.gtceu.nano_muscle_suite.nightvision.enabled", "NanoMuscle™ Suite: §aNightVision Enabled");
         provider.add("armor.gtceu.nano_muscle_suite.nightvision.disabled",
                 " NanoMuscle™ Suite: §cNightVision Disabled");
-        provider.add("armor.gtceu.nano_muscle_suite.boosted_jump.enabled", "NanoMuscle™ Suite: §aJump Boost Enabled");
-        provider.add("armor.gtceu.nano_muscle_suite.boosted_jump.disabled",
-                " NanoMuscle™ Suite: §cJump Boost Disabled");
+        provider.add("armor.gtceu.nano_muscle_suite.step_assist.disabled", "NanoMuscle™ Suite: StepAssist Disabled");
+        provider.add("armor.gtceu.nano_muscle_suite.step_assist.enabled", "NanoMuscle™ Suite: StepAssist Enabled");
         provider.add("armor.gtceu.nano_muscle_suite.nightvision.error", "NanoMuscle™ Suite: §cNot enough power!");
         provider.add("armor.gtceu.nano_muscle_suite.charge.enabled", "NanoMuscle™ Suite: §aCharging Enabled");
         provider.add("armor.gtceu.nano_muscle_suite.charge.disabled", " NanoMuscle™ Suite: §cCharging Disabled");
@@ -31,6 +35,10 @@ private static void generateArmorMessageKeys(GTLangProvider provider) {
         provider.add("armor.gtceu.quark_tech_suite.charge.enabled", "QuarkTech™ Suite: §aCharging Enabled");
         provider.add("armor.gtceu.quark_tech_suite.charge.disabled", "QuarkTech™ Suite: §cCharging Disabled");
         provider.add("armor.gtceu.quark_tech_suite.charge.error", "QuarkTech™ Suite: §cNot enough power for charging!");
+        provider.add("armor.gtceu.quark_tech_suite.step_assist.disabled", "QuarkTech™ Suite: StepAssist Disabled");
+        provider.add("armor.gtceu.quark_tech_suite.step_assist.enabled", "QuarkTech™ Suite: StepAssist Enabled");
+        provider.add("armor.gtceu.quark_tech_suite.boosted_jump.enabled", "QuarkTech™ Suite: Jump Boost Enabled");
+        provider.add("armor.gtceu.quark_tech_suite.boosted_jump.disabled", "QuarkTech™ Suite: Jump Boost Disabled");
 
         // Jetpacks
         provider.add("armor.gtceu.jetpack.flight.enabled", "Jetpack: §aFlight Enabled");
@@ -50,7 +58,8 @@ private static void generateTooltipKeys(GTLangProvider provider) {
         provider.add("item.gtceu.liquid_fuel_jetpack.tooltip", "§7Uses Combustion Generator Fuels for Thrust");
 
         // Armor Abilities
-        provider.add("armor.gtceu.tooltip.stepassist", "§7Provides Step-Assist");
+        provider.add("armor.gtceu.tooltip.step_assist.enabled", "§bStep-Assist: §aOn");
+        provider.add("armor.gtceu.tooltip.step_assist.disabled", "§bStep-Assist: §cOff");
         provider.add("armor.gtceu.tooltip.speed", "§7Increases Running Speed");
         provider.add("armor.gtceu.tooltip.jump", "§7Increases Jump Height and Distance");
         provider.add("armor.gtceu.tooltip.falldamage", "§7Nullifies Fall Damage");
diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java
index de163af40dd..a06aa55603d 100644
--- a/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java
+++ b/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java
@@ -101,6 +101,10 @@ private static void generateBlockKeys(GTLangProvider provider) {
 
         // Surface Rocks
         provider.add("block.surface_rock", "%s Surface Rock");
+
+        // Fluid blocks
+        provider.add("block.gtceu.oil", "Oil");
+        provider.add("block.gtceu.creosote", "Creosote");
     }
 
     private static void generateBlockTooltips(GTLangProvider provider) {
@@ -148,7 +152,7 @@ private static void generatePipeKeys(GTLangProvider provider) {
 
         // Fluid Pipes
         provider.add("tooltip.gtceu.fluid_pipe.capacity", "§9Capacity: §f%d mB");
-        provider.add("tooltip.gtceu.fluid_pipe.max_temperature", "§cTemperature Limit: §f%d K");
+        provider.add("tooltip.gtceu.fluid_pipe.max_temperature", "§cTemperature Limit: §f%s");
         provider.add("tooltip.gtceu.fluid_pipe.channels", "§eChannels: §f%d");
         provider.add("tooltip.gtceu.fluid_pipe.gas_proof", "§6Can handle Gases");
         provider.add("tooltip.gtceu.fluid_pipe.not_gas_proof", "§4Gases may leak!");
diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java
index 7854df822be..36537ce837c 100644
--- a/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java
+++ b/src/main/java/com/gregtechceu/gtceu/data/lang/CommandLang.java
@@ -10,6 +10,9 @@ public static void init(GTLangProvider provider) {
 
     private static void generateCommandLang(GTLangProvider provider) {
         provider.add("command.gtceu.dump_data.success", "Dumped %s resources from registry %s to %s");
+        provider.add("gtceu.debug.resource_rebuild.done", "Gradle resource rebuild done in %s");
+        provider.add("gtceu.debug.resource_rebuild.start",
+                "Invoking gradle resource rebuild (./gradlew :processResources)");
 
         // Prospection Commands
         provider.add("command.gtceu.place_vein.failure", "Failed to place vein %s at position %s");
@@ -17,11 +20,26 @@ private static void generateCommandLang(GTLangProvider provider) {
         provider.add("command.gtceu.share_prospection_data.notification", "%s is sharing prospecting data with you!");
 
         // Medical Conditions
-        provider.add("command.gtceu.medical_condition.get", "Player %s has these medical conditions:");
-        provider.add("command.gtceu.medical_condition.get.empty", "Player %s has no medical conditions.");
-        provider.add("command.gtceu.medical_condition.get.element", "Condition %s§r: %s minutes %s seconds");
+        provider.add("command.gtceu.medical_condition.clear.everything.failed", "Target has no conditions to remove");
+        provider.add("command.gtceu.medical_condition.clear.everything.success.multiple",
+                "Removed all conditions from %s targets");
+        provider.add("command.gtceu.medical_condition.clear.everything.success.single",
+                "Removed all conditions from %s");
+        provider.add("command.gtceu.medical_condition.clear.specific.failed",
+                "Target doesn't have the requested condition");
+        provider.add("command.gtceu.medical_condition.clear.specific.success.multiple", "Removed %s from %s targets");
+        provider.add("command.gtceu.medical_condition.clear.specific.success.single", "Removed %s from %s");
+        provider.add("command.gtceu.medical_condition.give.failed", "Unable to apply this condition (invalid target)");
+        provider.add("command.gtceu.medical_condition.give.success.multiple", "Applied %s to %s targets");
+        provider.add("command.gtceu.medical_condition.give.success.single", "Applied %s to %s");
+        provider.add("command.gtceu.medical_condition.get", "%s has");
+        provider.add("command.gtceu.medical_condition.get.empty", "%s is perfectly healthy.");
+        provider.add("command.gtceu.medical_condition.get.element", "- %s for %s minutes %s seconds");
         provider.add("command.gtceu.medical_condition.get.element.permanent",
-                "Condition %s§r: %s minutes %s seconds (permanent)");
+                "- %s for %s minutes %s seconds (permanent)");
+        provider.add("command.gtceu.medical_condition.get.symptoms.empty", "%s has no symptoms.");
+        provider.add("command.gtceu.medical_condition.get.symptoms", "Currently %s has these symptoms:");
+        provider.add("command.gtceu.medical_condition.get.symptoms.element", "- %s");
 
         // GT Worldgen
         provider.add("command.gtceu.usage", "Usage: /gtceu ");
@@ -31,35 +49,6 @@ private static void generateCommandLang(GTLangProvider provider) {
         provider.add("command.gtceu.worldgen.reload.failed",
                 "Worldgen reload failed. Check console for errors.");
 
-        // GT Hand (useless)
-        provider.add("command.gtceu.hand.groovy", "Consider using §6/gs hand");
-        provider.add("command.gtceu.hand.usage", "Usage: /gtceu hand");
-        provider.add("command.gtceu.hand.item_id", "Item: %s (Metadata: %d)");
-        provider.add("command.gtceu.hand.electric", "Electric Info: %d / %d EU - Tier: %d; Is Battery: %s");
-        provider.add("command.gtceu.hand.fluid", "Fluid Info: %d / %d mB; Can Fill: %s; Can Drain: %s");
-        provider.add("command.gtceu.hand.fluid2", "Fluid Id:");
-        provider.add("command.gtceu.hand.material", "Material Id:");
-        provider.add("command.gtceu.hand.ore_prefix", "Ore prefix:");
-        provider.add("command.gtceu.hand.meta_item", "MetaItem Id:");
-        provider.add("command.gtceu.hand.tag_entries", "§3Tag entries:");
-        provider.add("command.gtceu.hand.tool_stats", "Tool Stats Class: %s");
-        provider.add("command.gtceu.hand.not_a_player", "This command is only usable by a player.");
-        provider.add("command.gtceu.hand.no_item",
-                "You must hold something in main hand or off hand before executing this command.");
-
-        // Recipe Check
-        provider.add("command.gtceu.recipecheck.usage", "Usage: /gtceu recipecheck");
-        provider.add("command.gtceu.recipecheck.begin", "Starting recipe conflict check...");
-        provider.add("command.gtceu.recipecheck.end",
-                "Recipe conflict check found %d possible conflicts. Check the server log for more info");
-        provider.add("command.gtceu.recipecheck.end_no_conflicts", "No recipe conflicts found!");
-
-        // Copy command
-        provider.add("command.gtceu.copy.copied_and_click", "Copied to clipboard. Click to copy again");
-        provider.add("command.gtceu.copy.click_to_copy", "Click to copy");
-        provider.add("command.gtceu.copy.copied_start", "Copied [");
-        provider.add("command.gtceu.copy.copied_end", "] to the clipboard");
-
         // Cape Message
         provider.add("gtceu.chat.cape",
                 "§5Congrats: you just unlocked a new cape! See the Cape Selector terminal app to use it.§r");
diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/CoverLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/CoverLang.java
index d554e48ffac..98e2e121292 100644
--- a/src/main/java/com/gregtechceu/gtceu/data/lang/CoverLang.java
+++ b/src/main/java/com/gregtechceu/gtceu/data/lang/CoverLang.java
@@ -93,7 +93,7 @@ private static void generateCoverKeys(GTLangProvider provider) {
         provider.addMultiline("cover.conveyor.distribution.round_robin_global",
                 "Distribution Mode: §bRound Robin\n§7Splits items equally across connected inventories");
         provider.addMultiline("cover.conveyor.distribution.round_robin_prio",
-                "Distribution Mode: §bRound Robin with Priority\n§7Tries to split items across connected inventories and considers higher priorities first.\n§7Restrictive item pipes lower the priority of a path.");
+                "Distribution Mode: §bRound Robin with Restriction\n§7Tries to split items equally across connected inventories.\n§7Will not send items down Restrictive item pipes unless no other paths are available.");
         provider.addMultiline("cover.conveyor.distribution.insert_first",
                 "Distribution Mode: §bPriority\n§7Will insert into the first inventory with the highest priority it can find.\n§7Restrictive item pipes lower the priority of a path.");
         provider.addMultiline("cover.conveyor.blocks_input.enabled",
@@ -147,6 +147,7 @@ private static void generateCoverKeys(GTLangProvider provider) {
         provider.addMultiline("cover.machine_controller.invert.disabled",
                 "§eNormal§r - in this mode, the cover will require a signal weaker than the set redstone level to run");
         provider.add("cover.machine_controller.redstone", "Min Redstone Strength: %d");
+        provider.add("cover.machine_controller.suspend_powerfail", "Prevent Power Failing:");
         provider.add("cover.machine_controller.mode.machine", "Control Machine");
         provider.add("cover.machine_controller.mode.cover_up", "Control Cover (Top)");
         provider.add("cover.machine_controller.mode.cover_down", "Control Cover (Bottom)");
@@ -158,6 +159,8 @@ private static void generateCoverKeys(GTLangProvider provider) {
 
         // Ender fluid
         provider.add("cover.ender_fluid_link.title", "Ender Fluid Link");
+        provider.add("cover.ender_item_link.title", "Ender Item Link");
+        provider.add("cover.ender_redstone_link.title", "Ender Redstone Link");
         provider.add("cover.ender_fluid_link.iomode.enabled", "I/O Enabled");
         provider.add("cover.ender_fluid_link.iomode.disabled", "I/O Disabled");
         provider.add("cover.ender_fluid_link.tooltip.channel_description", "Set channel description with input text");
diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/GUILang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/GUILang.java
index 3610285d22c..91289266c4d 100644
--- a/src/main/java/com/gregtechceu/gtceu/data/lang/GUILang.java
+++ b/src/main/java/com/gregtechceu/gtceu/data/lang/GUILang.java
@@ -31,6 +31,7 @@ private static void generateKeybindKeys(GTLangProvider provider) {
         provider.add("gtceu.key.enable_boots", "Enable Boosted Jump");
         provider.add("gtceu.key.armor_charging", "Armor Charging to Inventory Toggle");
         provider.add("gtceu.key.tool_aoe_change", "Tool AoE Mode Switch");
+        provider.add("gtceu.key.enable_step_assist", "Enable StepAssist");
         provider.add("gtceu.debug.f3_h.enabled",
                 "GregTech has modified the debug info! For Developers: enable the misc:debug config option in the GregTech config file to see more");
     }
@@ -44,6 +45,11 @@ private static void generateTooltipKeys(GTLangProvider provider) {
         provider.add("gtceu.universal.liters", "%s mB");
         provider.add("gtceu.universal.kiloliters", "%s B");
 
+        provider.add("gtceu.universal.parentheses", "(%s)");
+        provider.add("gtceu.universal.spaced_parentheses", "( %s )");
+        provider.add("gtceu.universal.padded_parentheses", " (%s) ");
+        provider.add("gtceu.universal.padded_spaced_parentheses", " ( %s ) ");
+
         // EU Tooltip
         provider.add("gtceu.universal.tooltip.voltage_in", "§aVoltage IN: §f%d EU/t (%s§f)");
         provider.add("gtceu.universal.tooltip.max_voltage_in", "§aMax Voltage IN: §f%d (%s§f)");
@@ -192,11 +198,11 @@ private static void generateWidgetKeys(GTLangProvider provider) {
                 "Chunk Mode Disabled: Click to Enable.\n§7Switching requires an idle machine.");
 
         // Recipe Capability Voiding
-        provider.addMultiline("gtceu.gui.multiblock_item_voiding", "Voiding Mode\n§7Voiding §6Items");
-        provider.addMultiline("gtceu.gui.multiblock_fluid_voiding", "Voiding Mode\n§7Voiding §9Fluids");
-        provider.addMultiline("gtceu.gui.multiblock_item_fluid_voiding",
-                "Voiding Mode\n§7Voiding §6Items §7and §9Fluids");
-        provider.addMultiline("gtceu.gui.multiblock_no_voiding", "Voiding Mode\n§7Voiding Nothing");
+        provider.add("gtceu.gui.multiblock.voiding_mode", "Voiding Mode:");
+        provider.add("gtceu.gui.item_voiding", "§7Voiding §6Items");
+        provider.add("gtceu.gui.fluid_voiding", "§7Voiding §9Fluids");
+        provider.add("gtceu.gui.all_voiding", "§7Voiding §cAll");
+        provider.add("gtceu.gui.no_voiding", "§7Voiding Nothing");
 
         // Fisher
         provider.addMultiline("gtceu.gui.fisher_mode.tooltip",
@@ -225,11 +231,39 @@ private static void generateWidgetKeys(GTLangProvider provider) {
                 "allow items input from the output side");
         provider.add("gtceu.gui.item_auto_output.allow_input.disabled",
                 "disable items input from the output side");
+        provider.add("gtceu.gui.item_auto_output.enabled", "Item Auto Output: §aEnabled");
+        provider.add("gtceu.gui.item_auto_output.disabled", "Item Auto Output: §cDisabled");
+        provider.addMultiLang("gtceu.gui.item_auto_output.unselected",
+                """
+                        Item Auto Output
+                        §7Select a side of the machine to configure its output.
+                        """);
+        provider.addMultiLang("gtceu.gui.item_auto_output.other_direction",
+                """
+                        Item Auto Output: §6Other Direction
+                        §7The machine's item output is set to another direction.
+                        §7Click to move the output to the currently selected side.
+                        """);
         provider.add("gtceu.gui.fluid_auto_output.allow_input.enabled",
                 "allow fluids input from the output side");
         provider.add("gtceu.gui.fluid_auto_output.allow_input.disabled",
                 "disable fluids input from the output side");
+        provider.add("gtceu.gui.fluid_auto_output.enabled", "Fluid Auto Output: §aEnabled");
+        provider.add("gtceu.gui.fluid_auto_output.disabled", "Fluid Auto Output: §cDisabled");
+        provider.addMultiLang("gtceu.gui.fluid_auto_output.unselected",
+                """
+                        Fluid Auto Output
+                        §7Select a side of the machine to configure its output.
+                        """);
+        provider.addMultiLang("gtceu.gui.fluid_auto_output.other_direction",
+                """
+                        Fluid Auto Output: §6Other Direction
+                        §7The machine's fluid output is set to another direction.
+                        §7Click to move the output to the currently selected side.
+                        """);
         provider.add("gtceu.gui.auto_output.name", "auto");
+        provider.add("gtceu.gui.directional_setting.title", "Directional Setting");
+        provider.add("gtceu.gui.directional_setting.tab_tooltip", "Change Directional Setting");
 
         // Overclocking Widget
         provider.add("gtceu.gui.overclock.title", "Overclock Tier");
@@ -265,11 +299,16 @@ private static void generateWidgetKeys(GTLangProvider provider) {
         provider.add("gtceu.gui.content.chance_nc_short", "§cNC§r");
         provider.add("gtceu.gui.content.chance_base", "Base Chance: %s%%");
         provider.add("gtceu.gui.content.chance_base_logic", "Base Chance: %s%% (%s)");
+        provider.add("gtceu.gui.content.chance_no_boost", "Chance: %s%%");
+        provider.add("gtceu.gui.content.chance_no_boost_logic", "Chance: %s%% (%s)");
         provider.add("gtceu.gui.content.chance_tier_boost_plus", "Bonus Chance: +%s%%/tier");
         provider.add("gtceu.gui.content.chance_tier_boost_minus", "Bonus Chance: -%s%%/tier");
         provider.add("gtceu.gui.content.chance_boosted", "Chance at Tier: %s%%");
         provider.add("gtceu.gui.content.chance_boosted_logic", "Chance at Tier: %s%% (%s)");
         provider.add("gtceu.gui.content.count_range", "%s-%sx");
+        provider.add("gtceu.gui.content.fluid_range", "%s-%smB");
+        provider.add("gtceu.gui.content.range", "%s-%s");
+        provider.add("gtceu.gui.content.times_item", "x %s");
 
         provider.add("gtceu.chance_logic.or", "OR");
         provider.add("gtceu.chance_logic.and", "AND");
diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java
index 680be3327c4..9aedd5eba49 100644
--- a/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java
+++ b/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java
@@ -10,36 +10,56 @@ public static void init(GTLangProvider provider) {
 
     private static void generateHazardKeys(GTLangProvider provider) {
         // Medical Conditions
-        provider.add("gtceu.medical_condition.description", "§l§cHAZARDOUS §7Hold Shift to show details");
-        provider.add("gtceu.medical_condition.description_shift", "§l§cHAZARDOUS:");
-        provider.add("gtceu.medical_condition/chemical_burns", "§5Chemical burns");
-        provider.add("gtceu.medical_condition/poison", "§2Poisonous");
-        provider.add("gtceu.medical_condition/weak_poison", "§aWeakly poisonous");
-        provider.add("gtceu.medical_condition/irritant", "§6Irritant");
-        provider.add("gtceu.medical_condition/nausea", "§3Nauseating");
-        provider.add("gtceu.medical_condition/carcinogen", "§eCarcinogenic");
-        provider.add("gtceu.medical_condition/asbestosis", "§dAsbestosis");
-        provider.add("gtceu.medical_condition/arsenicosis", "§bArsenicosis");
-        provider.add("gtceu.medical_condition/silicosis", "§1Silicosis");
-        provider.add("gtceu.medical_condition/berylliosis", "§5Berylliosis");
-        provider.add("gtceu.medical_condition/methanol_poisoning", "§6Methanol Poisoning");
-        provider.add("gtceu.medical_condition/carbon_monoxide_poisoning", "§7Carbon Monoxide Poisoning");
-        provider.add("gtceu.medical_condition/none", "§2Not Dangerous");
+        provider.add("tooltip.gtceu.medical_condition.description", "§l§cHAZARDOUS §7Hold Shift to show details");
+        provider.add("tooltip.gtceu.medical_condition.description_shift", "§l§cHAZARDOUS:");
+        provider.add("medical_condition.gtceu.chemical_burns", "§5Chemical burns");
+        provider.add("medical_condition.gtceu.poison", "§2Poisonous");
+        provider.add("medical_condition.gtceu.poison.affected", "§2Poisoning");
+        provider.add("medical_condition.gtceu.weak_poison", "§aWeakly poisonous");
+        provider.add("medical_condition.gtceu.weak_poison.affected", "§aMinor poisoning");
+        provider.add("medical_condition.gtceu.irritant", "§6Irritant");
+        provider.add("medical_condition.gtceu.irritant.affected", "§6Irritation");
+        provider.add("medical_condition.gtceu.nausea", "§3Nauseating");
+        provider.add("medical_condition.gtceu.nausea.affected", "§3Nausea");
+        provider.add("medical_condition.gtceu.carcinogen", "§eCarcinogenic");
+        provider.add("medical_condition.gtceu.carcinogen.affected", "§eCancer");
+        provider.add("medical_condition.gtceu.asbestosis", "§dAsbestosis");
+        provider.add("medical_condition.gtceu.arsenicosis", "§bArsenicosis");
+        provider.add("medical_condition.gtceu.methanol_poisoning", "§6Methanol Poisoning");
+        provider.add("medical_condition.gtceu.carbon_monoxide_poisoning", "§7Carbon Monoxide Poisoning");
+        provider.add("medical_condition.gtceu.none", "§2Not Dangerous");
+        provider.add("medical_condition.gtceu.none.affected", "§2Nothing?");
+
+        // Symptoms
+        provider.add("symptom.gtceu.death", "Death");
+        provider.add("symptom.gtceu.random_damage", "Occasional damage");
+        provider.add("symptom.gtceu.health_debuff", "Lowered maximum health");
+        provider.add("symptom.gtceu.air_supply_debuff", "Lowered lung capacity");
+        provider.add("symptom.gtceu.mining_fatigue", "Fatigue");
+        provider.add("symptom.gtceu.weakness", "Weakness");
+        provider.add("symptom.gtceu.slowness", "Slowness");
+        provider.add("symptom.gtceu.blindness", "Blindness");
+        provider.add("symptom.gtceu.darkness", "Darkness");
+        provider.add("symptom.gtceu.nausea", "Nausea");
+        provider.add("symptom.gtceu.wither", "Necrosis");
+        provider.add("symptom.gtceu.weak_poisoning", "Weak poisoning");
+        provider.add("symptom.gtceu.poisoning", "Poisoning");
+        provider.add("symptom.gtceu.hunger", "Increased appetite");
 
         // Hazard Triggers
-        provider.add("gtceu.hazard_trigger.description", "Caused by:");
-        provider.add("gtceu.hazard_trigger.protection.description", "Protects from:");
-        provider.add("gtceu.hazard_trigger.inhalation", "Inhalation");
-        provider.add("gtceu.hazard_trigger.any", "Any contact");
-        provider.add("gtceu.hazard_trigger.skin_contact", "Skin contact");
-        provider.add("gtceu.hazard_trigger.none", "Nothing");
+        provider.add("tooltip.gtceu.hazard_trigger", "Caused by:");
+        provider.add("tooltip.gtceu.hazard_trigger.protection", "Protects from:");
+        provider.add("tooltip.gtceu.hazard_trigger.inhalation", "Inhalation");
+        provider.add("tooltip.gtceu.hazard_trigger.any", "Any contact");
+        provider.add("tooltip.gtceu.hazard_trigger.skin_contact", "Skin contact");
+        provider.add("tooltip.gtceu.hazard_trigger.none", "Nothing");
 
         // Antidote
         provider.add("gtceu.medical_condition.antidote.description", "§aAntidote §7Hold Shift to show details");
         provider.add("gtceu.medical_condition.antidote.description_shift", "§aCures these conditions:");
         provider.add("gtceu.medical_condition.antidote.description.effect_removed",
                 "Removes %s%% of current conditions' effects");
-        provider.add("gtceu.medical_condition.antidote.description.effect_removed.all",
+        provider.add("tooltip.gtceu.antidote.description.effect_removed.all",
                 "Removes all of current conditions' effects");
 
         // Potion
diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java
index 0bc84b98ded..5f1511b7736 100644
--- a/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java
+++ b/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java
@@ -203,6 +203,7 @@ private static void initWailaLikeLang(GTLangProvider provider) {
         // Plugin Names
         provider.add("config.jade.plugin_gtceu.controllable_provider", "[GTCEu] Controllable");
         provider.add("config.jade.plugin_gtceu.workable_provider", "[GTCEu] Workable");
+        provider.add("config.jade.plugin_gtceu.battery_info", "[GTCEu] Battery info");
         provider.add("config.jade.plugin_gtceu.electric_container_provider", "[GTCEu] Electric Container");
         provider.add("config.jade.plugin_gtceu.recipe_logic_provider", "[GTCEu] Recipe Logic");
         provider.add("config.jade.plugin_gtceu.hazard_cleaner_provider", "[GTCEu] Hazard Cleaner");
@@ -216,11 +217,13 @@ private static void initWailaLikeLang(GTLangProvider provider) {
         provider.add("config.jade.plugin_gtceu.multiblock_structure", "[GTCEu] MultiBlock Structure");
         provider.add("config.jade.plugin_gtceu.parallel_info", "[GTCEu] Parallel Info");
         provider.add("config.jade.plugin_gtceu.primitive_pump", "[GTCEu] Primitive Pump Info");
+        provider.add("config.jade.plugin_gtceu.data_bank", "[GTCEu] Data Bank Info");
         provider.add("config.jade.plugin_gtceu.transformer", "[GTCEu] Transformer Info");
         provider.add("config.jade.plugin_gtceu.stained_color", "[GTCEu] Stained Block Info");
         provider.add("config.jade.plugin_gtceu.me_pattern_buffer", "[GTCEu] Pattern Buffer Info");
         provider.add("config.jade.plugin_gtceu.me_pattern_buffer_proxy", "[GTCEu] Pattern Buffer Proxy Info");
         provider.add("config.jade.plugin_gtceu.energy_converter_provider", "[GTCEu] Energy Converter Mode");
+        provider.add("config.jade.plugin_gtceu.ldp_endpoint", "[GTCEu] Long Distance Pipeline Endpoint Info");
 
         provider.add("gtceu.top.energy_stored", " / %d EU");
         provider.add("gtceu.top.progress_computation", " / %s CWU");
diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java
index 29b0e03f160..d513ac52e45 100644
--- a/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java
+++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java
@@ -610,7 +610,7 @@ public static void generateBehaviorKeys(GTLangProvider provider) {
         provider.add("behaviour.soft_hammer", "Activates and Deactivates Machines");
         provider.add("behaviour.soft_hammer.enabled", "Working Enabled");
         provider.add("behaviour.soft_hammer.disabled", "Working Disabled");
-        provider.add("behaviour.soft_hammer.idle_after_cycle", "Pause machine after current cycle");
+        provider.add("behaviour.soft_hammer.disabled_cycle", "Working disabled after current cycle");
 
         provider.add("behaviour.lighter.tooltip.description", "Can light things on fire");
         provider.add("behaviour.lighter.tooltip.usage", "Shift-right click to open/close");
@@ -655,13 +655,28 @@ public static void generateBehaviorKeys(GTLangProvider provider) {
         provider.add("behaviour.paintspray.uses", "Remaining Uses: %d");
 
         // Copy/Paste Configuration
-        provider.add("behaviour.meta.machine.config.copy.tooltip", "§7Sneak + R-Click to copy machine configuration");
-        provider.add("behaviour.meta.machine.config.paste.tooltip", "§7R-Click to paste machine configuration");
-        provider.add("behaviour.setting.allow.input.from.output.tooltip", "%s input from output side is %s");
-        provider.add("behaviour.setting.output.direction.tooltip", "%s output direction: %s");
-        provider.add("behaviour.setting.item_auto_output.tooltip", "%s auto-output is %s");
-        provider.add("behaviour.setting.muffled.tooltip", "Muffling %s");
-        provider.add("item.toggle.advanced.info.tooltip", "§8");
+        provider.add("behaviour.memory_card.tooltip.copy",
+                "§7Sneak + R-Click to copy configuration, or clear stored data if a block other than a machine or pipe is targeted.");
+        provider.add("behaviour.memory_card.tooltip.paste", "§7R-Click to paste machine configuration");
+        provider.add("behaviour.memory_card.tooltip.view_stored", "§8");
+        provider.add("behaviour.memory_card.client_msg.cleared", "Stored configuration cleared");
+        provider.add("behaviour.memory_card.client_msg.copied", "Copied machine configuration");
+        provider.add("behaviour.memory_card.client_msg.pasted", "Applied machine configuration");
+        provider.add("behaviour.memory_card.client_msg.missing_items", "Missing items required to paste configuration");
+        provider.add("behaviour.memory_card.tooltip.items_to_paste",
+                "The following items are needed to paste this configuration:");
+        provider.add("behaviour.memory_card.enabled", "§aEnabled§r");
+        provider.add("behaviour.memory_card.disabled", "§cDisabled§r");
+        provider.add("behaviour.memory_card.copy_target", "Copying: %s");
+        provider.add("behaviour.setting.tooltip.item_io", "Item Output: %s (%s)");
+        provider.add("behaviour.setting.tooltip.fluid_io", "Fluid Output: %s (%s)");
+        provider.add("behaviour.setting.tooltip.auto_output", "§2Auto Output§r");
+        provider.add("behaviour.setting.tooltip.allow_input", "§2Allow Input§r");
+        provider.add("behaviour.setting.tooltip.auto_output_allow_input", "§2Auto Output/Allow Input§r");
+        provider.add("behaviour.setting.tooltip.pipe_connections", "Pipe connections: %s");
+        provider.add("behaviour.setting.tooltip.pipe_blocked_connections", "Pipe shuttered sides: %s");
+        provider.add("behaviour.setting.tooltip.muffled", "Muffling %s");
+        provider.add("behaviour.setting.tooltip.circuit_config", "Programmed Circuit: ");
 
         // Prospector
         provider.add("behaviour.prospecting", "Usable for Prospecting");
@@ -698,8 +713,6 @@ public static void generateBehaviorKeys(GTLangProvider provider) {
                 "Caused %s Lag Spike Warnings (anything taking longer than %sms) on the Server.");
         provider.add("behavior.portable_scanner.debug_machine", "Meta-ID: %s");
         provider.add("behavior.portable_scanner.debug_machine_invalid", " invalid!");
-        provider.add("behavior.portable_scanner.debug_machine_invalid_null=invalid! MetaTileEntity =",
-                " null!");
         provider.add("behavior.portable_scanner.debug_machine_valid", " valid");
 
         provider.add("behavior.portable_scanner.divider", "=========================");
@@ -743,15 +756,16 @@ public static void generateBehaviorKeys(GTLangProvider provider) {
         provider.add("behavior.portable_scanner.workable_stored_energy", "Stored Energy: %s EU / %s EU");
 
         provider.add("behavior.portable_scanner.mode.caption", "Display mode: %s");
-        provider.add("behavior.portable_scanner.mode.show_all_info", "Show all info");
+        provider.add("behavior.portable_scanner.mode.show_all_info", "Show all info (excluding internal info)");
         provider.add("behavior.portable_scanner.mode.show_block_info", "Show block info");
         provider.add("behavior.portable_scanner.mode.show_machine_info", "Show machine info");
         provider.add("behavior.portable_scanner.mode.show_electrical_info", "Show electrical info");
         provider.add("behavior.portable_scanner.mode.show_recipe_info", "Show recipe info");
         provider.add("behavior.portable_scanner.mode.show_environmental_info", "Show environmental info");
+        provider.add("behavior.portable_scanner.mode.show_internal_info", "Show internal debugging info");
 
         // Data Stick
-        provider.add("behavior.data_item.assemblyline.title", "§nAssembly Line Construction Data:");
-        provider.add("behavior.data_item.assemblyline.data", "- §a%s");
+        provider.add("behavior.data_item.title", "§n%s Construction Data:");
+        provider.add("behavior.data_item.data", "- §a%s");
     }
 }
diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangUtil.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangUtil.java
index 182e9ead847..92b568740ce 100644
--- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangUtil.java
+++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangUtil.java
@@ -40,12 +40,15 @@ protected static Stream getMultiLangKeys(String key) {
      * E.g., given a multi lang
      * {@code provider.addMultiLang("terminal.fluid_prospector.tier", "radius size 1", "radius size 2", "radius size 3");},
* The following code can be used to print out the translations: + * *
 {@code
      * for (var component : getMultiLang("terminal.fluid_prospector.tier")) {
      *     System.out.println(component.getString());
      * }
      * } 
+ * * And the output would be: + * *
 {@code
      * radius size 1
      * radius size 2
@@ -75,12 +78,15 @@ public static List getListMultiLang(String key) {
      * E.g., given a multi lang
      * {@code provider.addMultiLang("terminal.fluid_prospector.info", "prospection radius %s", "Can prospect %s");},
* The following code can be used to print out the translations: + * *
 {@code
      * for (var component : getMultiLang("terminal.fluid_prospector.info", 5, "Ores")) {
      *     System.out.println(component.getString());
      * }
      * } 
+ * * And the output would be: + * *
 {@code
      * prospection radius 5
      * Can prospect Ores
@@ -97,7 +103,7 @@ public static Component[] getMultiLang(String key, Object... args) {
     /**
      * A variation of {@link #getMultiLang(String, Object...)} )} that returns a list instead of an array.
      *
-     * @param key Base key of the multi lang. E.g. {@code "terminal.fluid_prospector.info"}
+     * @param key  Base key of the multi lang. E.g. {@code "terminal.fluid_prospector.info"}
      * @param args The arguments to pass to each {@link Component} of this multi lang
      * @return Returns all translation components from a multi lang's sub-keys
      * @see #getMultiLang(String, Object...)
diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java
index 3d64db6befa..931c9d7b3ce 100644
--- a/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java
+++ b/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java
@@ -1,6 +1,7 @@
 package com.gregtechceu.gtceu.data.lang;
 
 import com.gregtechceu.gtceu.api.registry.registrate.provider.GTLangProvider;
+
 import net.minecraft.ChatFormatting;
 
 public class MachineLang {
@@ -775,7 +776,6 @@ private static void generateCustomMultiblockTooltips(GTLangProvider provider) {
         provider.add("gtceu.multiblock.fusion_reactor.energy", "EU: %d / %d");
         provider.add("gtceu.multiblock.fusion_reactor.heat", "Heat: %d");
 
-
         // Large Miner
         provider.add("machine.gtceu.ev_large_miner.tooltip", "Digging Ore instead of You");
         provider.add("machine.gtceu.iv_large_miner.tooltip", "Biome Excavator");
@@ -850,7 +850,7 @@ private static void generateCustomMultiblockTooltips(GTLangProvider provider) {
         provider.add("gtceu.multiblock.cleanroom.dirty_state", "Status: §4CONTAMINATED");
         provider.add("gtceu.multiblock.cleanroom.clean_amount", "Cleanliness: §a%s%%");
         provider.addMultiline("gtceu.multiblock.dimensions", "Dimensions: \n" +
-                                                             "  §c§lWidth§r: %s, §a§lHeight§r: %s, §9§lDepth§r: %s ");
+                "  §c§lWidth§r: %s, §a§lHeight§r: %s, §9§lDepth§r: %s ");
 
         // Power Substation
         provider.addMultiLang("gtceu.machine.power_substation.tooltip",
@@ -898,10 +898,10 @@ private static void generateCustomMultiblockTooltips(GTLangProvider provider) {
         provider.addMultiline("gtceu.multiblock.charcoal_pile.description",
                 """
                         Converts logs into Brittle Charcoal in a 9x4x9 area beneath it.
-                        
+
                         The floor of the pit must be made from bricks, and any ground-related block can be used for the walls and roof.
                         No air can be inside the pit.
-                        
+
                         Larger pits take more time to process logs, but are more efficient.""");
 
         // Central Monitor
@@ -1081,7 +1081,8 @@ private static void generateCustomMultiblockPartTooltips(GTLangProvider provider
         // ME Stocking
         provider.addMultiLang("gtceu.machine.me.stocking_item.tooltip", "Retrieves items directly from the ME network",
                 "Auto-Pull from ME mode will automatically stock the first 16 items in the ME system, updated every 5 seconds.");
-        provider.addMultiLang("gtceu.machine.me.stocking_fluid.tooltip", "Retrieves fluids directly from the ME network",
+        provider.addMultiLang("gtceu.machine.me.stocking_fluid.tooltip",
+                "Retrieves fluids directly from the ME network",
                 "Auto-Pull from ME mode will automatically stock the first 16 fluids in the ME system, updated every 5 seconds.");
         provider.add("gtceu.machine.me_import_item_hatch.configs.tooltip",
                 "Keeps 16 item types in stock");
@@ -1208,6 +1209,352 @@ private static void generateCustomMultiblockPartTooltips(GTLangProvider provider
                 "When in the §eProcessing Array§7, only holds machines that work in the §eProcessing Array");
     }
 
+    private static void generateCentralMonitorGuiLang(GTLangProvider provider) {
+        provider.add("gtceu.tooltip.wireless_transmitter_bind",
+                "Binding to a transmitter cover at %s %s %s facing %s in %s");
+        provider.add("gtceu.tooltip.computer_monitor_config", "Storing computer monitor cover configuration data");
+        provider.add("gtceu.tooltip.computer_monitor_data", "Storing data: %s");
+        provider.add("gtceu.display_source.computer_monitor_cover", "Computer Monitor Cover");
+        provider.add("gtceu.display_target.computer_monitor_cover", "Computer Monitor Cover");
+        provider.addMultiLang("gtceu.placeholder_info.energy",
+                "Returns the amount of energy stored.",
+                "Usage:",
+                "  {energy} -> the amount of energy stored");
+        provider.addMultiLang("gtceu.placeholder_info.energyCapacity",
+                "Returns the max amount of energy that can be stored",
+                "Usage:",
+                "{energyCapacity} -> the energy capacity");
+        provider.addMultiLang("gtceu.placeholder_info.itemCount",
+                "Returns the amount of items (can be filtered).",
+                "Usage:",
+                "  {itemCount} -> total item amount",
+                "  {itemCount } -> amount of items with ids equal to item_id",
+                "  {itemCount filter } -> amount of items matching filter in specified slot of this cover");
+        provider.addMultiLang("gtceu.placeholder_info.calc",
+                "Returns the result of a math function or operation.",
+                "Usage:",
+                "  {calc } -> any_string",
+                "  {calc  } -> the result of the specified operation",
+                "  {calc  <+|-|*|/|//|>>|<<|%> } -> the result of the specified operation");
+        provider.addMultiLang("gtceu.placeholder_info.if",
+                "Returns one of the arguments depending on the condition. The condition is considered true if it is not an empty string and is not equal to 0.",
+                "Usage:",
+                "  {if   [returned_if_false]}");
+        provider.addMultiLang("gtceu.placeholder_info.obf",
+                "Returns the text from the first argument, obfuscated.",
+                "Usage:",
+                "  {obf } -> obfuscated text");
+        provider.addMultiLang("gtceu.placeholder_info.underline",
+                "Returns the text from the first argument, underlined",
+                "Usage:",
+                "  {underline } -> underlined text");
+        provider.addMultiLang("gtceu.placeholder_info.strike",
+                "Returns the text from the first text, displaying it as if it was crossed out",
+                "Usage:",
+                "  {strike } -> crossed-out text");
+        provider.addMultiLang("gtceu.placeholder_info.color",
+                "Returns the text from the second argument, colored with the color from the first argument. All default minecraft chat colors can be used.",
+                "Usage:",
+                "  {color  } -> colored text");
+        provider.addMultiLang("gtceu.placeholder_info.tick",
+                "Returns the amount of ticks passed from when this cover was placed.",
+                "Usage:",
+                "  {tick} -> the amount of ticks");
+        provider.addMultiLang("gtceu.placeholder_info.block", "Returns the block symbol (█).",
+                "Usage:",
+                "  {block} -> '█'");
+        provider.addMultiLang("gtceu.placeholder_info.repeat",
+                "Returns the text from the second arguments, repeated the amount of times specified in the first argument.",
+                "Usage:",
+                "  {repeat  } -> text repeated the specified amount of times");
+        provider.addMultiLang("gtceu.placeholder_info.random",
+                "Returns a random number in the specified interval (inclusive).",
+                "Usage:",
+                "  {random  } -> a random number between min and max (inclusive)");
+        provider.addMultiLang("gtceu.placeholder_info.select",
+                "Returns the argument at the specified index (starting from 0)",
+                "Usage:",
+                "  {select  [arg1] [arg2] [arg3] ... -> argument at the specified index");
+        provider.addMultiLang("gtceu.placeholder_info.redstone",
+                "Returns the redstone signal strength or sets the redstone output strength",
+                "Usage:",
+                "  {redstone get } -> redstone signal strength (0-15) at the specified side",
+                "  {redstone get link  } -> redstone signal strength of a Create redstone link frequency specified by a linked controller in slot #slot_index. freq_slot_index is the index of the frequency inside the controller (from left to right, 0-6)",
+                "  {redstone set } -> empty string, sets the redstone output strength from this cover's side",
+                "  {redstone set link   } -> empty string, broadcasts the specified redstone power on the specified Create redstone link frequency");
+        provider.addMultiLang("gtceu.placeholder_info.fluidCount",
+                "Returns the amount of fluids (can be filtered).",
+                "Usage:",
+                "  {fluidCount [fluidId]} -> the amount of all fluids, or the fluid with fluidId if specified");
+        provider.addMultiLang("gtceu.placeholder_info.displayTarget",
+                "Returns the specified line that was transmitted to this cover using a display link.",
+                "Usage:",
+                "  {displayTarget } -> the text on the specified line (line number is 1-100)");
+        provider.addMultiLang("gtceu.placeholder_info.previousText",
+                "Returns the text that was previously displayed by this cover at the specified line (before line-wrapping).",
+                "Usage:",
+                "  {previousText } -> the text previously displayed on the specified line (index starts at 1)");
+        provider.addMultiLang("gtceu.placeholder_info.ae2itemCount",
+                "Same as itemCount, but counts items in the ME network of the block this cover is attached to.",
+                "Note that counting by filter or all items may cause lag!",
+                "Usage:",
+                "  {itemCount} -> total item amount",
+                "  {itemCount } -> amount of items with ids equal to item_id",
+                "  {itemCount filter } -> amount of items matching filter in specified slot of this cover");
+        provider.addMultiLang("gtceu.placeholder_info.ae2fluidCount",
+                "Same as fluidCount, but counts items in the ME network of the block this cover is attached to.",
+                "Note that counting all fluids may cause lag!",
+                "Usage:",
+                "  {fluidCount [fluidId]} -> the amount of all fluids, or the fluid with fluidId if specified");
+        provider.addMultiLang("gtceu.placeholder_info.progress",
+                "Returns the progress of the currently running recipe of the block this cover is attached to.",
+                "Note that progress is an integer between 0 and {maxProgress}",
+                "Usage:",
+                "  {progress} -> the progress of the currently running recipe");
+        provider.addMultiLang("gtceu.placeholder_info.maxProgress",
+                "Returns the maximum progress of the currently running recipe of the block this cover is attached to.",
+                "Example: 'Progress: {calc {calc {progress} / {maxProgress}} * 100}%'",
+                "Usage:",
+                "  {maxProgress} -> the max progress of the currently running recipe");
+        provider.addMultiLang("gtceu.placeholder_info.maintenance",
+                "Returns a 1 if there are maintenance problems in the block the cover is attached to, 0 otherwise.",
+                "Example: 'Maintenance status: {if {maintenance} FIXING\\ REQUIRED OK}'",
+                "Usage:",
+                "  {maintenance} -> whether there are maintenance problems");
+        provider.addMultiLang("gtceu.placeholder_info.active",
+                "Returns a 1 if the block the cover is attached to is currently running a recipe, 0 otherwise.",
+                "Usage:",
+                "  {active} -> whether there's a currently running recipe");
+        provider.addMultiLang("gtceu.placeholder_info.voltage",
+                "Returns the voltage in the wire/cable the cover is on.",
+                "Usage:",
+                "  {voltage} -> the voltage in the wire/cable");
+        provider.addMultiLang("gtceu.placeholder_info.amperage",
+                "Returns the amperage in the wire/cable the cover is on.",
+                "Usage:",
+                "  {amperage} -> the amperate in the wire/cable");
+        provider.addMultiLang("gtceu.placeholder_info.ae2energy",
+                "Returns the energy currently stored in the ME network of the block this cover is on.",
+                "Usage:",
+                "  {ae2energy} -> the energy in the ME network (in AE units)");
+        provider.addMultiLang("gtceu.placeholder_info.ae2maxPower",
+                "Returns the energy capacity of the ME network of the block this cover is on.",
+                "Usage:",
+                "  {ae2maxPower} -> the energy capacity of the ME network");
+        provider.addMultiLang("gtceu.placeholder_info.ae2powerUsage",
+                "Returns the energy consumption of the ME network of the block this cover is on.",
+                "Usage:",
+                "  {ae2powerUsage} -> the energy consumption of the ME network");
+        provider.addMultiLang("gtceu.placeholder_info.ae2spatial",
+                "Returns information about spatial I/O in the ME network of the block this cover is on.",
+                "Usage:",
+                "  {ae2spatial power} -> the amount of power required to initiate spatial I/O",
+                "  {ae2spatial efficiency} -> the efficiency of the Spatial Containment Structure (SPS)",
+                "  {ae2spatial size} -> the size of the SPS along the specified axis (example: 'Size: {sizeX}x{sizeY}x{sizeZ}')");
+        provider.addMultiLang("gtceu.placeholder_info.ae2crafting",
+                "Returns information about auto-crafting in the ME network of the block this cover is on.",
+                "Usage:",
+                "  {ae2crafting get amount} -> the amount of crafting CPUs in the ME network",
+                "  {ae2crafting get  storage} -> the amount of crafting storage the specified CPU has",
+                "  {ae2crafting get  threads} -> the amount of co-processors the specified CPU has",
+                "  {ae2crafting get  name} -> the name of the specified crafting CPU",
+                "  {ae2crafting get  selectionMode} -> the selection mode of the specified crafting CPU (used for manual, automatic or both requests)",
+                "  {ae2crafting get  amount} -> the amount of the item that was requested, or 0 if the CPU is idle",
+                "  {ae2crafting get  item} -> the display name of the item that was requested, or 0 if the CPU is idle",
+                "  {ae2crafting get  progress} -> the crafting job progress, or 0 if the CPU is idle",
+                "  {ae2crafting get  time} -> the amount of time elapsed from the start of the craft (in nanoseconds), or 0 if the CPU is idle");
+        provider.addMultiLang("gtceu.placeholder_info.count",
+                "Returns how many of the provided arguments are equal to the first (compared as strings, so \"0\" != \"0.0\")",
+                "Usage:",
+                "  {count  [arg2] [arg3] [arg4] ...} -> the amount of arguments that are equal to the first");
+        provider.addMultiLang("gtceu.placeholder_info.data",
+                "Stores or retrieves some data from a data item (data stick/orb/module) in one of the slots.",
+                "If you leave the  argument empty, it will be replaced with the value p (p is an integer from 0 to (capacity - 1) that is stored in the data item nbt).",
+                "If the slot argument is equal to 0, this placeholder will manipulate the data stick that is currently targeted by this text module inside a data hatch.",
+                "Usage:",
+                "  {data get  } -> the data stored in the item in the specified slot",
+                "  {data set   } -> sets the data stored in the item in the specified slot, returns an empty string",
+                "  {data getp } -> p",
+                "  {data setp  } -> sets p, returns an empty string",
+                "  {data inc } -> increments p by 1, if p becomes more than or equal to capacity, sets p to 0",
+                "  {data dec } -> decrements p by 1, if p becomes less than 0, sets p to (capacity - 1)");
+        provider.addMultiLang("gtceu.placeholder_info.combine",
+                "Combines all of it's arguments into a single string (by escaping all spaces between the arguments)",
+                "Example: {combine abc def ghi jkl mno} -> \"abc\\ def\\ ghi\\ jkl\\ mno\"",
+                "Usage:",
+                "  {combine [arg1] [arg2] [arg3] ...} -> a string that will be treated as a single argument in further placeholders");
+        provider.addMultiLang("gtceu.placeholder_info.nbt",
+                "Returns the nbt data of the item in the specified slot",
+                "Usage:",
+                "  {nbt  [key1] [key2] [key3] ...} -> item_nbt[key1][key2][key3][...]");
+        provider.addMultiLang("gtceu.placeholder_info.toChars",
+                "Returns the characters of the provided string with spaces between them",
+                "Example: {toChars example} -> 'e x a m p l e'",
+                "Usage:",
+                "  {toChars } -> characters");
+        provider.addMultiLang("gtceu.placeholder_info.toAscii",
+                "Returns the ASCII code of the provided character",
+                "Usage:",
+                "  {toAscii } -> ASCII code of the character");
+        provider.addMultiLang("gtceu.placeholder_info.fromAscii",
+                "Returns the character represented by the provided ASCII code",
+                "Usage:",
+                "  {fromAscii } -> a character");
+        provider.addMultiLang("gtceu.gui.computer_monitor_cover.placeholder_reference",
+                "All placeholders:",
+                "(hover for more info)");
+        provider.addMultiLang("gtceu.placeholder_info.subList",
+                "Returns arguments from with indexes from l (inclusive) to r (exclusive) (starting from 0)",
+                "Usage:",
+                "  {subList   [arg0] [arg1] ...} -> all arguments with indexes from l to r separated by spaces");
+        provider.addMultiLang("gtceu.placeholder_info.cmp",
+                "Returns a 1 or 0 based on the expression in it's arguments",
+                "Usage:",
+                "  {cmp   } -> 1 or 0, operator is one of >, <, >=, <=, ==, !=");
+        provider.addMultiLang("gtceu.placeholder_info.bf",
+                "Usage:",
+                "  {bf  } -> empty string");
+        provider.addMultiLang("gtceu.placeholder_info.cmd",
+                "Executes Minecraft commands and returns their output.",
+                "Requires a data item bound to a player, bind any data item to yourself by right-clicking with it.",
+                "Usage:",
+                "  {cmd  } -> command output");
+        provider.addMultiLang("gtceu.placeholder_info.tm",
+                "Returns the ™ symbol",
+                "Usage:",
+                "  {tm} -> the ™ symbol");
+        provider.addMultiLang("gtceu.placeholder_info.formatInt",
+                "Returns a string representation of the provided integer",
+                "Example: {formatInt 1236457} -> 1.24M",
+                "Usage:",
+                "  {formatInt } -> string representation of the int");
+        provider.addMultiLang("gtceu.placeholder_info.click",
+                "Returns whether the targeted advanced monitor was clicked before the current tick",
+                "Usage:",
+                "  {click} -> \"1\" if the targeted advanced monitor was clicked, \"0\" otherwise",
+                "  {click x} -> the x position of the last click (between 0 and 1)",
+                "  {click y} -> the y position of the last click (between 0 and 1)");
+        provider.addMultiLang("gtceu.placeholder_info.ender",
+                "Interacts with ender link covers",
+                "Can interact with private channels if provided with a data item bound to a player",
+                "Usage:",
+                "  {ender item  [player_data_item_slot]} -> item count",
+                "  {ender itemPull  [player_data_item_slot]} -> pull 1 item from the ender link's buffer",
+                "  {ender itemPush  [player_data_item_slot]} -> push 1 item to the ender link's buffer",
+                "  {ender itemId  [player_data_item_slot]} -> the id of the item in the ender link's buffer (ex. \"26 minecraft:dirt\")",
+                "  {ender fluid  [player_data_item_slot]} -> fluid count",
+                "  {ender redstone  [player_data_item_slot] -> redstone signal level",
+                "  {ender redstone    -> sets the redstone signal outputed to the ender redstone link, returns empty string",
+                "The player_data_item_slot argument may be left empty (not 0, empty string)");
+        provider.addMultiLang("gtceu.placeholder_info.eval",
+                "Returns the result of evaluating the provided string which may placeholders",
+                "Usage:",
+                "  {eval abcdefg} -> abcdefg",
+                "  {eval \"repeating a: {repeat 5 \\\"a \\\"}\" -> repeating a: a a a a a ",
+                "  {eval \\\"\"{some random text}\"\\\" -> {some random text}",
+                "  {eval \"text \"\\\"\"{something with spaces}\"\\\"\" more text\" -> text {something with spaces} more text");
+        provider.addMultiLang("gtceu.placeholder_info.module",
+                "Renders the module in the specified slot onto the central monitor (does not work in a cover)",
+                "Usage:",
+                "  {module   } -> empty string");
+        provider.addMultiLang("gtceu.placeholder_info.setImage",
+                "Sets the image URL in an image module in the specified slot",
+                "Usage:",
+                "  {setImage  } -> empty string");
+        provider.addMultiLang("gtceu.placeholder_info.rect",
+                "Draws a rectangle at the specified position with the specified coordinates and size",
+                "Usage:",
+                "  {rect     } -> empty string",
+                "  {rect 0.5 0.25 2 1 0xFFFFFFFF} -> draws a white rectangle at (0.5, 0.25) with the size (2, 1)");
+        provider.addMultiLang("gtceu.placeholder_info.quad",
+                "Draws a quad (must specify parameters for all 4 vertices)",
+                "Usage:",
+                "  {quad            } -> empty string");
+        provider.addMultiLang("gtceu.placeholder_info.item",
+                "Returns the amount and id of the item in a specified slot",
+                "Usage:",
+                "  {item } -> \"31 minecraft:diamond\" (for example)");
+        provider.addMultiLang("gtceu.placeholder_info.bufferText",
+                "Returns the text from a buffer accessible by ComputerCraft",
+                "Usage:",
+                "  {bufferText } -> text from the buffer on the specified line (line is 1-100)");
+        provider.addMultiLang("gtceu.placeholder_info.blockNbt",
+                "Returns the NBT of the block entity",
+                "Usage:",
+                "  {blockNbt} -> full block entity nbt",
+                "  {blockNbt [key1] [key2] ...} -> part of the nbt");
+        provider.addMultiLang("gtceu.placeholder_info.targetSlot",
+                "Returns the index of the targeted data hatch slot",
+                "Usage:",
+                "  {targetSlot} ->  (from 1 to 4/9/16)");
+        provider.addMultiLang("gtceu.placeholder_info.setTargetSlot",
+                "Sets the index of the targeted data hatch slot.",
+                "The change will take effect immediately after this placeholder executes.",
+                "(Further placeholders will reference the new target)",
+                "Usage:",
+                "  {setTargetSlot } -> empty string");
+        provider.add("gtceu.ender_item_link_cover.title", "Ender Item Link");
+        provider.add("gtceu.ender_item_link_cover.tooltip",
+                "§7Transports §fItems§7 with a §fWireless §dEnder§f Connection§7 as §fCover§7.");
+        provider.add("gtceu.ender_redstone_link_cover.title", "Ender Redstone Link");
+        provider.add("gtceu.ender_redstone_link_cover.label", "Redstone power: %d");
+        provider.add("gtceu.ender_redstone_link_cover.tooltip",
+                "§7Transmits §fRedstone signals§7 with a §fWireless §dEnder§f Connection§7 as §fCover§7.");
+        provider.add("gtceu.gui.computer_monitor_cover.update_interval", "Update interval (in ticks)");
+        provider.add("gtceu.gui.computer_monitor_cover.edit_blank_placeholders", "Edit blank placeholders");
+        provider.add("gtceu.gui.computer_monitor_cover.edit_displayed_text", "Edit displayed text");
+        provider.add("gtceu.gui.central_monitor.text_scale", "Text scale");
+        provider.add("gtceu.gui.central_monitor.group", "Group: %s");
+        provider.add("gtceu.gui.central_monitor.group_default_name", "Group #%d");
+        provider.add("gtceu.gui.central_monitor.none", "none");
+        provider.add("gtceu.central_monitor.size", "Size: (%d+1+%d)x(%d+1+%d)");
+        provider.add("gtceu.computer_monitor_cover.error.invalid_number", "Invalid number '%s'!");
+        provider.add("gtceu.computer_monitor_cover.error.wrong_number_of_args", "Expected %d args, got %d!");
+        provider.add("gtceu.computer_monitor_cover.error.not_enough_args", "Expected at least %d args, got %d!");
+        provider.add("gtceu.computer_monitor_cover.error.no_cover", "No cover!");
+        provider.add("gtceu.computer_monitor_cover.error.exception", "Unexpected exception occurred: %s");
+        provider.add("gtceu.computer_monitor_cover.error.not_in_range",
+                "Expected %s to be between %d and %d (inclusive), got %d");
+        provider.add("gtceu.computer_monitor_cover.error.invalid_args", "Invalid arguments!");
+        provider.add("gtceu.computer_monitor_cover.error.missing_item", "Missing %s in slot %d!");
+        provider.add("gtceu.computer_monitor_cover.error.bf_invalid_num",
+                "Invalid number at index %d when processing symbol number %d");
+        provider.add("gtceu.computer_monitor_cover.error.bf_invalid", "Invalid character at %d");
+        provider.add("gtceu.provider.computer_monitor_cover.error.no_target",
+                "No target selected for the monitor group");
+        provider.addMultiLang("gtceu.gui.computer_monitor_cover.main_textbox_tooltip",
+                "Input string to display on line %d here.",
+                "It can have placeholders, for example: 'Energy: {energy}/{energyCapacity} EU'",
+                "Placeholders can also be inside other placeholders.");
+        provider.addMultiLang("gtceu.gui.computer_monitor_cover.slot_tooltip",
+                "A slot for items that some placeholders can reference",
+                "Slot number: %d");
+        provider.addMultiLang("gtceu.gui.computer_monitor_cover.second_page_textbox_tooltip",
+                "Input placeholder to be used in place of %s '{}' here.",
+                "For example, you can have a string 'Energy: {}/{} EU' and 'energy' and 'energyCapacity' in these text boxes.");;
+        provider.add("gtceu.computer_monitor_cover.error.no_placeholder", "No such placeholder: '%s'!");
+        provider.add("gtceu.computer_monitor_cover.error.unclosed_bracket", "Unclosed bracket!");
+        provider.add("gtceu.computer_monitor_cover.error.unexpected_bracket", "Unexpected closing bracket!");
+        provider.add("gtceu.computer_monitor_cover.error.no_ae", "Cover holder does not have an AE2 network!");
+        provider.add("gtceu.computer_monitor_cover.error.not_supported",
+                "This feature is not supported by this block/cover!");
+        provider.add("gtceu.central_monitor.gui.create_group", "Create group");
+        provider.add("gtceu.central_monitor.gui.remove_from_group", "Remove from group");
+        provider.add("gtceu.central_monitor.gui.set_target", "Set target");
+        provider.add("gtceu.central_monitor.gui.currently_editing", "Currently editing: %s");
+        provider.addMultiLang("gtceu.central_monitor.info_tooltip",
+                "In order to use monitors, you have to split them into groups first. A group may only have 1 module in it.",
+                "Select them by left-clicking, then click 'Create group'.",
+                "Then in the settings page for the group you can insert a module, you can configure it in the same page.",
+                "To delete a group, select all of it's components and click 'Remove from group'.",
+                "You can quickly select all components of a group by clicking on it's name. Click again to unselect.",
+                "Some modules may display things depending on the block they target, to set a target for a group select any component of that group and right-click on the target component.",
+                "You may wish to select a target that is not in the multiblock, you have to use the wireless transmitter cover for that.",
+                "Place the cover on the target block, right-click it with a data stick and put that data stick into a data access hatch in the multiblock.",
+                "Then select the data access hatch as the target, and set the slot index of your data stick in the number field that appeared.");
+        provider.add("gtceu.tooltip.player_bind", "Bound to player: %s");
+    }
+
     /**
      * Generates tooltips for both variants of steam machine
      */
@@ -1382,7 +1729,14 @@ public static void generateMultiblockKeys(GTLangProvider provider) {
 
         // Parallel
         provider.add("gtceu.multiblock.parallel", "Performing up to %d Recipes in Parallel");
-        provider.add("gtceu.multiblock.parallel.exact", "Performing %d Recipes in Parallel");
+        provider.add("gtceu.multiblock.total_runs", "Performing %d Recipes at once");
+        provider.add("gtceu.multiblock.parallel.exact", "- %dx from Parallels");
+        provider.add("gtceu.multiblock.batch_enabled", "- %dx from Batching");
+        provider.add("gtceu.multiblock.subtick_parallels", "- %dx from Overclocking");
+
+        // Batching
+        provider.add("gtceu.machine.batch_enabled", "Batching Enabled");
+        provider.add("gtceu.machine.batch_disabled", "Batching Disabled");
 
         // Active RecipeMap
         provider.add("gtceu.multiblock.multiple_recipemaps.header", "Machine Mode:");
@@ -1393,6 +1747,7 @@ public static void generateMultiblockKeys(GTLangProvider provider) {
                 "The machine must be off to switch modes!");
         provider.add("gtceu.gui.machinemode.title", "Active Machine Mode");
         provider.add("gtceu.gui.machinemode", "Active Machine Mode: %s");
+        provider.add("gtceu.gui.machinemode.tab_tooltip", "Change active Machine Mode");
         provider.add("machine.gtceu.available_recipe_map_1.tooltip", "Available Recipe Types: %s");
         provider.add("machine.gtceu.available_recipe_map_2.tooltip", "Available Recipe Types: %s, %s");
         provider.add("machine.gtceu.available_recipe_map_3.tooltip", "Available Recipe Types: %s, %s, %s");
diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java
index cb8d23bd3e0..3462d707b28 100644
--- a/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java
+++ b/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java
@@ -5,13 +5,13 @@
 import com.gregtechceu.gtceu.api.registry.registrate.provider.GTLangProvider;
 
 import static com.gregtechceu.gtceu.common.data.GTMaterials.*;
-import static com.gregtechceu.gtceu.utils.FormattingUtil.toEnglishName;
 
 public class MaterialLang {
 
     public static void generate(GTLangProvider provider, MaterialRegistry registry) {
-        for (Material material : registry.getAllMaterials())
-            provider.add(material.getUnlocalizedName(), toEnglishName(material.getName()));
+        for (Material material : registry.getAllMaterials()) {
+            provider.add(material.getUnlocalizedName(), material.getDefaultTranslation());
+        }
     }
 
     public static void init(GTLangProvider provider) {
@@ -21,85 +21,87 @@ public static void init(GTLangProvider provider) {
     }
 
     private static void generateCustomMaterialNames(GTLangProvider provider) {
-        provider.add(FullersEarth.getUnlocalizedName(), "Fuller's Earth");
-        // greg's humor is now on 1.20.1...
-        provider.add(Cooperite.getUnlocalizedName(), "Sheldonite");
-
-        provider.add(HSSG.getUnlocalizedName(), "HSS-G");
-        provider.add(HSSE.getUnlocalizedName(), "HSS-E");
-        provider.add(HSSS.getUnlocalizedName(), "HSS-S");
-        provider.add(RTMAlloy.getUnlocalizedName(), "RTM Alloy");
-        provider.add(HSLASteel.getUnlocalizedName(), "HSLA Steel");
-
-        provider.add(UUMatter.getUnlocalizedName(), "UU-Matter");
-        provider.add(PCBCoolant.getUnlocalizedName(), "PCB Coolant");
-        provider.add(TungstenSteel.getUnlocalizedName(), "Tungstensteel");
-
-        provider.add(Iron3Chloride.getUnlocalizedName(), "Iron III Chloride");
-        provider.add(Iron2Chloride.getUnlocalizedName(), "Iron II Chloride");
-
-        provider.add(OilHeavy.getUnlocalizedName(), "Heavy Oil");
-        provider.add("block.gtceu.oil_heavy", "Heavy Oil");
-        provider.add(OilLight.getUnlocalizedName(), "Light Oil");
-        provider.add("block.gtceu.oil_light", "Light Oil");
-        provider.add(RawOil.getUnlocalizedName(), "Raw Oil");
-        provider.add("block.gtceu.oil_medium", "Raw Oil");
-
-        provider.add(HydroCrackedButadiene.getUnlocalizedName(), "Hydro-Cracked Butadiene");
-        provider.add(HydroCrackedButane.getUnlocalizedName(), "Hydro-Cracked Butane");
-        provider.add(HydroCrackedButene.getUnlocalizedName(), "Hydro-Cracked Butene");
-        provider.add(HydroCrackedButene.getUnlocalizedName(), "Hydro-Cracked Butene");
-        provider.add(HydroCrackedEthane.getUnlocalizedName(), "Hydro-Cracked Ethane");
-        provider.add(HydroCrackedEthylene.getUnlocalizedName(), "Hydro-Cracked Ethylene");
-        provider.add(HydroCrackedPropane.getUnlocalizedName(), "Hydro-Cracked Propane");
-        provider.add(HydroCrackedPropene.getUnlocalizedName(), "Hydro-Cracked Propene");
-
-        provider.add(SteamCrackedButadiene.getUnlocalizedName(), "Steam-Cracked Butadiene");
-        provider.add(SteamCrackedButane.getUnlocalizedName(), "Steam-Cracked Butane");
-        provider.add(SteamCrackedButene.getUnlocalizedName(), "Steam-Cracked Butene");
-        provider.add(SteamCrackedButene.getUnlocalizedName(), "Steam-Cracked Butene");
-        provider.add(SteamCrackedEthane.getUnlocalizedName(), "Steam-Cracked Ethane");
-        provider.add(SteamCrackedEthylene.getUnlocalizedName(), "Steam-Cracked Ethylene");
-        provider.add(SteamCrackedPropane.getUnlocalizedName(), "Steam-Cracked Propane");
-        provider.add(SteamCrackedPropene.getUnlocalizedName(), "Steam-Cracked Propene");
-
-        provider.add(LightlyHydroCrackedGas.getUnlocalizedName(), "Lightly Hydro-Cracked Gas");
-        provider.add(LightlyHydroCrackedHeavyFuel.getUnlocalizedName(),
-                "Lightly Hydro-Cracked Heavy Fuel");
-        provider.add(LightlyHydroCrackedLightFuel.getUnlocalizedName(),
-                "Lightly Hydro-Cracked Light Fuel");
-        provider.add(LightlyHydroCrackedNaphtha.getUnlocalizedName(),
-                "Lightly Hydro-Cracked Naphtha");
-        provider.add(LightlySteamCrackedGas.getUnlocalizedName(), "Lightly Steam-Cracked Gas");
-        provider.add(LightlySteamCrackedHeavyFuel.getUnlocalizedName(),
-                "Lightly Steam-Cracked Heavy Fuel");
-        provider.add(LightlySteamCrackedLightFuel.getUnlocalizedName(),
-                "Lightly Steam-Cracked Light Fuel");
-        provider.add(LightlySteamCrackedNaphtha.getUnlocalizedName(),
-                "Lightly Steam-Cracked Naphtha");
-
-        provider.add(SeverelyHydroCrackedGas.getUnlocalizedName(),
-                "Severely Hydro-Cracked Gas");
-        provider.add(SeverelyHydroCrackedHeavyFuel.getUnlocalizedName(),
-                "Severely Hydro-Cracked Heavy Fuel");
-        provider.add(SeverelyHydroCrackedLightFuel.getUnlocalizedName(),
-                "Severely Hydro-Cracked Light Fuel");
-        provider.add(SeverelyHydroCrackedNaphtha.getUnlocalizedName(),
-                "Severely Hydro-Cracked Naphtha");
-        provider.add(SeverelySteamCrackedGas.getUnlocalizedName(),
-                "Severely Steam-Cracked Gas");
-        provider.add(SeverelySteamCrackedHeavyFuel.getUnlocalizedName(),
-                "Severely Steam-Cracked Heavy Fuel");
-        provider.add(SeverelySteamCrackedLightFuel.getUnlocalizedName(),
-                "Severely Steam-Cracked Light Fuel");
-        provider.add(SeverelySteamCrackedNaphtha.getUnlocalizedName(),
-                "Severely Steam-Cracked Naphtha");
-        provider.add(LPG.getUnlocalizedName(), "LPG");
-
-        provider.add(Zeron100.getUnlocalizedName(), "Zeron-100");
-        provider.add(IncoloyMA956.getUnlocalizedName(), "Incoloy MA-956");
-        provider.add(Stellite100.getUnlocalizedName(), "Stellite-100");
-        provider.add(HastelloyC276.getUnlocalizedName(), "Hastelloy C-276");
+        /*
+         * provider.add(FullersEarth.getUnlocalizedName(), "Fuller's Earth");
+         * // greg's humor is now on 1.20.1...
+         * provider.add(Cooperite.getUnlocalizedName(), "Sheldonite");
+         * 
+         * provider.add(HSSG.getUnlocalizedName(), "HSS-G");
+         * provider.add(HSSE.getUnlocalizedName(), "HSS-E");
+         * provider.add(HSSS.getUnlocalizedName(), "HSS-S");
+         * provider.add(RTMAlloy.getUnlocalizedName(), "RTM Alloy");
+         * provider.add(HSLASteel.getUnlocalizedName(), "HSLA Steel");
+         * 
+         * provider.add(UUMatter.getUnlocalizedName(), "UU-Matter");
+         * provider.add(PCBCoolant.getUnlocalizedName(), "PCB Coolant");
+         * provider.add(TungstenSteel.getUnlocalizedName(), "Tungstensteel");
+         * 
+         * provider.add(Iron3Chloride.getUnlocalizedName(), "Iron III Chloride");
+         * provider.add(Iron2Chloride.getUnlocalizedName(), "Iron II Chloride");
+         * 
+         * provider.add(OilHeavy.getUnlocalizedName(), "Heavy Oil");
+         * provider.add("block.gtceu.oil_heavy", "Heavy Oil");
+         * provider.add(OilLight.getUnlocalizedName(), "Light Oil");
+         * provider.add("block.gtceu.oil_light", "Light Oil");
+         * provider.add(RawOil.getUnlocalizedName(), "Raw Oil");
+         * provider.add("block.gtceu.oil_medium", "Raw Oil");
+         * 
+         * provider.add(HydroCrackedButadiene.getUnlocalizedName(), "Hydro-Cracked Butadiene");
+         * provider.add(HydroCrackedButane.getUnlocalizedName(), "Hydro-Cracked Butane");
+         * provider.add(HydroCrackedButene.getUnlocalizedName(), "Hydro-Cracked Butene");
+         * provider.add(HydroCrackedButene.getUnlocalizedName(), "Hydro-Cracked Butene");
+         * provider.add(HydroCrackedEthane.getUnlocalizedName(), "Hydro-Cracked Ethane");
+         * provider.add(HydroCrackedEthylene.getUnlocalizedName(), "Hydro-Cracked Ethylene");
+         * provider.add(HydroCrackedPropane.getUnlocalizedName(), "Hydro-Cracked Propane");
+         * provider.add(HydroCrackedPropene.getUnlocalizedName(), "Hydro-Cracked Propene");
+         * 
+         * provider.add(SteamCrackedButadiene.getUnlocalizedName(), "Steam-Cracked Butadiene");
+         * provider.add(SteamCrackedButane.getUnlocalizedName(), "Steam-Cracked Butane");
+         * provider.add(SteamCrackedButene.getUnlocalizedName(), "Steam-Cracked Butene");
+         * provider.add(SteamCrackedButene.getUnlocalizedName(), "Steam-Cracked Butene");
+         * provider.add(SteamCrackedEthane.getUnlocalizedName(), "Steam-Cracked Ethane");
+         * provider.add(SteamCrackedEthylene.getUnlocalizedName(), "Steam-Cracked Ethylene");
+         * provider.add(SteamCrackedPropane.getUnlocalizedName(), "Steam-Cracked Propane");
+         * provider.add(SteamCrackedPropene.getUnlocalizedName(), "Steam-Cracked Propene");
+         * 
+         * provider.add(LightlyHydroCrackedGas.getUnlocalizedName(), "Lightly Hydro-Cracked Gas");
+         * provider.add(LightlyHydroCrackedHeavyFuel.getUnlocalizedName(),
+         * "Lightly Hydro-Cracked Heavy Fuel");
+         * provider.add(LightlyHydroCrackedLightFuel.getUnlocalizedName(),
+         * "Lightly Hydro-Cracked Light Fuel");
+         * provider.add(LightlyHydroCrackedNaphtha.getUnlocalizedName(),
+         * "Lightly Hydro-Cracked Naphtha");
+         * provider.add(LightlySteamCrackedGas.getUnlocalizedName(), "Lightly Steam-Cracked Gas");
+         * provider.add(LightlySteamCrackedHeavyFuel.getUnlocalizedName(),
+         * "Lightly Steam-Cracked Heavy Fuel");
+         * provider.add(LightlySteamCrackedLightFuel.getUnlocalizedName(),
+         * "Lightly Steam-Cracked Light Fuel");
+         * provider.add(LightlySteamCrackedNaphtha.getUnlocalizedName(),
+         * "Lightly Steam-Cracked Naphtha");
+         * 
+         * provider.add(SeverelyHydroCrackedGas.getUnlocalizedName(),
+         * "Severely Hydro-Cracked Gas");
+         * provider.add(SeverelyHydroCrackedHeavyFuel.getUnlocalizedName(),
+         * "Severely Hydro-Cracked Heavy Fuel");
+         * provider.add(SeverelyHydroCrackedLightFuel.getUnlocalizedName(),
+         * "Severely Hydro-Cracked Light Fuel");
+         * provider.add(SeverelyHydroCrackedNaphtha.getUnlocalizedName(),
+         * "Severely Hydro-Cracked Naphtha");
+         * provider.add(SeverelySteamCrackedGas.getUnlocalizedName(),
+         * "Severely Steam-Cracked Gas");
+         * provider.add(SeverelySteamCrackedHeavyFuel.getUnlocalizedName(),
+         * "Severely Steam-Cracked Heavy Fuel");
+         * provider.add(SeverelySteamCrackedLightFuel.getUnlocalizedName(),
+         * "Severely Steam-Cracked Light Fuel");
+         * provider.add(SeverelySteamCrackedNaphtha.getUnlocalizedName(),
+         * "Severely Steam-Cracked Naphtha");
+         * provider.add(LPG.getUnlocalizedName(), "LPG");
+         * 
+         * provider.add(Zeron100.getUnlocalizedName(), "Zeron-100");
+         * provider.add(IncoloyMA956.getUnlocalizedName(), "Incoloy MA-956");
+         * provider.add(Stellite100.getUnlocalizedName(), "Stellite-100");
+         * provider.add(HastelloyC276.getUnlocalizedName(), "Hastelloy C-276");
+         */
 
         provider.add("item.gtceu.nether_quartz_netherrack", "Nether Quartz Ore");
     }
@@ -127,7 +129,7 @@ private static void generateFluidKeys(GTLangProvider provider) {
         provider.add("tooltip.gtceu.fluid_state.gas", "§aState: Gaseous");
         provider.add("tooltip.gtceu.fluid_state.liquid", "§aState: Liquid");
         provider.add("tooltip.gtceu.fluid_state.plasma", "§aState: Plasma");
-        provider.add("tooltip.gtceu.fluid_property.temperature", "§cTemperature: %d K");
+        provider.add("tooltip.gtceu.fluid_property.temperature", "§cTemperature: %s");
         provider.add("tooltip.gtceu.fluid_property.cryogenic", "§bCryogenic! Handle with care!");
         provider.add("tooltip.gtceu.fluid_property.acid", "§6Acidic! Handle with care!");
 
diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java
index 741576ad481..24f293ce438 100644
--- a/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java
+++ b/src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLang.java
@@ -41,7 +41,7 @@ private static void generateRecipeConditions(GTLangProvider provider) {
         provider.add("recipe.condition.pos_y.tooltip", "Y Level: %d <= Y <= %d");
 
         provider.add("recipe.condition.steam_vent.tooltip", "Clean steam vent");
-        provider.add("recipe.condition.rock_breaker.tooltip", "Fluid blocks around");
+        provider.add("recipe.condition.adjacent_fluid.tooltip", "Fluid blocks around");
         provider.add("recipe.condition.adjacent_block.tooltip", "Blocks around");
         provider.add("recipe.condition.eu_to_start.tooltip", "EU to Start: %d%s");
 
@@ -59,15 +59,19 @@ private static void generateRecipeDataKeys(GTLangProvider provider) {
         // Recipe Data
         provider.add("gtceu.recipe.total", "Total: %s EU");
         provider.add("gtceu.recipe.max_eu", "Max. EU: %s EU");
-        provider.add("gtceu.recipe.eu", "Usage: %s EU/t");
-        provider.add("gtceu.recipe.eu_inverted", "Generation: %s EU/t");
+        provider.add("gtceu.recipe.eu", "Usage: %s A @ %s");
+        provider.add("gtceu.recipe.eu_inverted", "Generation: %s A @ %s");
+        provider.add("gtceu.recipe.eu.total", "%s EU/t");
 
         provider.add("gtceu.recipe.scan_for_research", "Scan for Assembly Line");
         provider.add("gtceu.recipe.computation_per_tick", "Min. Computation: %s CWU/t");
         provider.add("gtceu.recipe.total_computation", "Computation: %s CWU");
 
+        provider.add("gtceu.recipe.byproduct_tier", "Byproducts from %s§r+");
+
         provider.add("gtceu.recipe.duration", "Duration: %s secs");
-        provider.add("gtceu.recipe.amperage", "Amperage: %s");
+        provider.add("gtceu.recipe.voltage", "Usage: %s A @ %s");
+        provider.add("gtceu.recipe.total_eu", "Total Usage: %s EU/t");
 
         provider.add("gtceu.recipe.not_consumed", "Does not get consumed in the process");
         provider.add("gtceu.recipe.chance", "Chance: %s +%s/tier");
@@ -86,7 +90,7 @@ private static void generateRecipeDataKeys(GTLangProvider provider) {
 
         provider.add("gtceu.recipe.research", "Requires Research");
 
-        provider.add("gtceu.recipe.temperature", "Temp: %sK");
+        provider.add("gtceu.recipe.temperature", "Temp: %s");
         provider.add("gtceu.recipe.coil.tier", "Coil: %s");
     }
 
diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java
index a12c884bbea..0ba750bb54b 100644
--- a/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java
+++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java
@@ -98,7 +98,13 @@ public static void generateBehaviorKeys(GTLangProvider provider) {
         provider.add("item.gtceu.tool.behavior.crop_harvesting", "§aHarvester: §fHarvests Crops");
         provider.add("item.gtceu.tool.behavior.plunger", "§9Plumber: §fDrains Fluids");
         provider.add("item.gtceu.tool.behavior.block_rotation", "§2Mechanic: §fRotates Blocks");
+        provider.add("item.gtceu.tool.behavior.dowse_campfire", "§6Firefighter: §fDowses Campfires");
         provider.add("item.gtceu.tool.behavior.damage_boost", "§4Damage Boost: §fExtra damage against %s");
+        provider.add("item.gtceu.tool.behavior.prospecting.ore", "Found ore: %s");
+        provider.add("item.gtceu.tool.behavior.prospecting.air", "Found an air pocket");
+        provider.add("item.gtceu.tool.behavior.prospecting.water", "Found water");
+        provider.add("item.gtceu.tool.behavior.prospecting.lava", "Found lava");
+        provider.add("item.gtceu.tool.behavior.prospecting.changing", "Detected material change");
 
         // AOE
         provider.add("item.gtceu.tool.aoe.rows", "Rows");
@@ -167,6 +173,7 @@ public static void generateToolKeys(GTLangProvider provider) {
         provider.add("item.gtceu.tool.lv_chainsaw", "%s Chainsaw (LV)");
         provider.add("item.gtceu.tool.mv_chainsaw", "%s Chainsaw (MV)");
         provider.add("item.gtceu.tool.hv_chainsaw", "%s Chainsaw (HV)");
+        provider.add("item.gtceu.tool.iv_chainsaw", "%s Chainsaw (IV)");
 
         provider.add("item.gtceu.tool.lv_wrench", "%s Wrench (LV)");
         provider.add("item.gtceu.tool.hv_wrench", "%s Wrench (HV)");
@@ -174,6 +181,8 @@ public static void generateToolKeys(GTLangProvider provider) {
 
         provider.add("item.gtceu.tool.buzzsaw", "%s Buzzsaw (LV)");
         provider.add("item.gtceu.tool.lv_screwdriver", "%s Screwdriver (LV)");
+        provider.add("item.gtceu.tool.hv_screwdriver", "%s Screwdriver (HV)");
+        provider.add("item.gtceu.tool.iv_screwdriver", "%s Screwdriver (IV)");
         provider.add("item.gtceu.tool.plunger", "%s Plunger");
         provider.add("item.gtceu.tool.shears", "%s Shears");
     }
@@ -196,6 +205,8 @@ public static void generateTooltips(GTLangProvider provider) {
         provider.add("item.gtceu.tool.iv_wrench.tooltip", "§8Hold left click to dismantle Machines");
         provider.add("item.gtceu.tool.buzzsaw.tooltip", "§8Not suitable for harvesting Blocks");
         provider.add("item.gtceu.tool.lv_screwdriver.tooltip", "§8Adjusts Covers and Machines");
+        provider.add("item.gtceu.tool.hv_screwdriver.tooltip", "§8Adjusts Covers and Machines");
+        provider.add("item.gtceu.tool.iv_screwdriver.tooltip", "§8Adjusts Covers and Machines");
         provider.add("item.gtceu.tool.plunger.tooltip", "§8Removes Fluids from Machines");
 
         // Tool Stats Tooltips
@@ -214,6 +225,7 @@ public static void generateTooltips(GTLangProvider provider) {
         // Repair Info
         provider.add("tool.gtceu.tooltip.show_repair_info", "§8Hold SHIFT to show Repair Info");
         provider.add("tool.gtceu.tooltip.repair_material", "§8Repair with: §f§a%s");
+        provider.add("item.gtceu.tool.tooltip.default_enchantments", "§5Default Enchantments:");
         provider.add("tool.gtceu.tooltip.replace_tool_head", "Craft with a new Tool Head to replace it");
         provider.add("tool.gtceu.tooltip.usable_as", "§8Usable as: §f%s");
 
diff --git a/src/main/java/com/gregtechceu/gtceu/integration/xei/widgets/GTRecipeWidget.java b/src/main/java/com/gregtechceu/gtceu/integration/xei/widgets/GTRecipeWidget.java
index 83dfa7a0127..b5a07e9e7d2 100644
--- a/src/main/java/com/gregtechceu/gtceu/integration/xei/widgets/GTRecipeWidget.java
+++ b/src/main/java/com/gregtechceu/gtceu/integration/xei/widgets/GTRecipeWidget.java
@@ -20,6 +20,7 @@
 import com.gregtechceu.gtceu.common.machine.multiblock.electric.FusionReactorMachine;
 import com.gregtechceu.gtceu.common.recipe.condition.DimensionCondition;
 import com.gregtechceu.gtceu.data.lang.LangHandler;
+import com.gregtechceu.gtceu.data.lang.LangUtil;
 import com.gregtechceu.gtceu.utils.FormattingUtil;
 import com.gregtechceu.gtceu.utils.GTUtil;
 
@@ -186,8 +187,7 @@ private void initializeRecipeTextWidget() {
             addWidget(new ButtonWidget(voltageTextWidget.getPositionX(), voltageTextWidget.getPositionY(),
                     voltageTextWidget.getSizeWidth(), voltageTextWidget.getSizeHeight(),
                     cd -> setRecipeOC(cd.button, cd.isShiftClick))
-                    .setHoverTooltips(LangHandler.getMultiLang("gtceu.oc.tooltip", GTValues.VNF[minTier])
-                            .toArray(Component[]::new)));
+                    .setHoverTooltips(LangUtil.getMultiLang("gtceu.oc.tooltip", GTValues.VNF[minTier])));
             addWidget(this.voltageTextWidget = voltageTextWidget);
         }
     }

From 125835aaf2ab98568217387a02f2ff245bec3e2a Mon Sep 17 00:00:00 2001
From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com>
Date: Mon, 8 Jun 2026 16:23:41 -0600
Subject: [PATCH 34/45] some slight cleanup

---
 .../resources/assets/gtceu/lang/en_us.json    | 72 ++++++++-----------
 .../gtceu/common/block/FluidPipeBlock.java    |  2 +-
 .../item/armor/AdvancedNanoMuscleSuite.java   | 28 ++++----
 .../item/armor/AdvancedQuarkTechSuite.java    | 32 ++++-----
 .../gtceu/common/item/armor/Jetpack.java      | 20 +++---
 .../common/item/armor/NanoMuscleSuite.java    |  8 +--
 .../common/item/armor/NightvisionGoggles.java |  4 +-
 .../common/item/armor/PowerlessJetpack.java   | 20 +++---
 .../common/item/armor/QuarkTechSuite.java     | 10 +--
 .../gtceu/data/lang/ArmorLang.java            | 24 +++----
 .../gtceu/data/lang/BlockLang.java            | 11 +--
 .../gregtechceu/gtceu/data/lang/GUILang.java  | 14 ++--
 .../gtceu/data/lang/HazardLang.java           | 38 +++++-----
 .../gtceu/data/lang/LangHandler.java          | 18 ++---
 .../gregtechceu/gtceu/data/lang/ToolLang.java | 21 +-----
 .../com/gregtechceu/gtceu/utils/GTUtil.java   |  4 +-
 .../gtceu/utils/input/KeyBind.java            | 14 ++--
 .../gtceu/utils/input/SyncedKeyMappings.java  | 14 ++--
 18 files changed, 163 insertions(+), 191 deletions(-)

diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json
index aad420b6f6c..f7c93d2fc07 100644
--- a/src/generated/resources/assets/gtceu/lang/en_us.json
+++ b/src/generated/resources/assets/gtceu/lang/en_us.json
@@ -3,14 +3,14 @@
   "armor.gtceu.energy_share.enabled": "§aGadget Charging Enabled",
   "armor.gtceu.energy_share.error": "§cNot Enough Power for Charging Gadgets!",
   "armor.gtceu.energy_share.tooltip": "Supply Mode: %s",
-  "armor.gtceu.energy_share.tooltip.info": "To change mode, SHIT + R-CLICK when holding item",
+  "armor.gtceu.energy_share.tooltip.info": "To change mode, SHIFT + R-CLICK when holding item",
+  "armor.gtceu.hud.disabled": "§cOFF",
+  "armor.gtceu.hud.enabled": "§aON",
   "armor.gtceu.hud.energy_level": "Energy Level: %s",
-  "armor.gtceu.hud.engine_enabled": "Engine: %s",
+  "armor.gtceu.hud.engine": "Engine: %s",
   "armor.gtceu.hud.fuel_level": "Fuel Level: %s",
   "armor.gtceu.hud.gravi_engine": "GraviEngine: %s",
   "armor.gtceu.hud.hover_mode": "Hover Mode: %s",
-  "armor.gtceu.hud.status.disabled": "§cOFF",
-  "armor.gtceu.hud.status.enabled": "§aON",
   "armor.gtceu.hud.supply_mode": "Supply Mode: %s",
   "armor.gtceu.jetpack.emergency_hover_mode": "§aEmergency Hover Mode Enabled!",
   "armor.gtceu.jetpack.flight.disabled": "Jetpack: Flight Disabled",
@@ -23,9 +23,9 @@
   "armor.gtceu.nano_muscle_suite.charge.disabled": " NanoMuscle™ Suite: §cCharging Disabled",
   "armor.gtceu.nano_muscle_suite.charge.enabled": "NanoMuscle™ Suite: §aCharging Enabled",
   "armor.gtceu.nano_muscle_suite.charge.error": "NanoMuscle™ Suite: §cNot enough power for charging!",
-  "armor.gtceu.nano_muscle_suite.nightvision.disabled": " NanoMuscle™ Suite: §cNightVision Disabled",
-  "armor.gtceu.nano_muscle_suite.nightvision.enabled": "NanoMuscle™ Suite: §aNightVision Enabled",
-  "armor.gtceu.nano_muscle_suite.nightvision.error": "NanoMuscle™ Suite: §cNot enough power!",
+  "armor.gtceu.nano_muscle_suite.night_vision.disabled": " NanoMuscle™ Suite: §cNightVision Disabled",
+  "armor.gtceu.nano_muscle_suite.night_vision.enabled": "NanoMuscle™ Suite: §aNightVision Enabled",
+  "armor.gtceu.nano_muscle_suite.night_vision.error": "NanoMuscle™ Suite: §cNot enough power!",
   "armor.gtceu.nano_muscle_suite.step_assist.disabled": "NanoMuscle™ Suite: StepAssist Disabled",
   "armor.gtceu.nano_muscle_suite.step_assist.enabled": "NanoMuscle™ Suite: StepAssist Enabled",
   "armor.gtceu.quark_tech_suite.boosted_jump.disabled": "QuarkTech™ Suite: Jump Boost Disabled",
@@ -33,15 +33,15 @@
   "armor.gtceu.quark_tech_suite.charge.disabled": "QuarkTech™ Suite: §cCharging Disabled",
   "armor.gtceu.quark_tech_suite.charge.enabled": "QuarkTech™ Suite: §aCharging Enabled",
   "armor.gtceu.quark_tech_suite.charge.error": "QuarkTech™ Suite: §cNot enough power for charging!",
-  "armor.gtceu.quark_tech_suite.nightvision.disabled": "QuarkTech™ Suite: §cNightVision Disabled",
-  "armor.gtceu.quark_tech_suite.nightvision.enabled": "QuarkTech™ Suite: §aNightVision Enabled",
-  "armor.gtceu.quark_tech_suite.nightvision.error": "QuarkTech™ Suite: §cNot enough power!",
+  "armor.gtceu.quark_tech_suite.night_vision.disabled": "QuarkTech™ Suite: §cNightVision Disabled",
+  "armor.gtceu.quark_tech_suite.night_vision.enabled": "QuarkTech™ Suite: §aNightVision Enabled",
+  "armor.gtceu.quark_tech_suite.night_vision.error": "QuarkTech™ Suite: §cNot enough power!",
   "armor.gtceu.quark_tech_suite.step_assist.disabled": "QuarkTech™ Suite: StepAssist Disabled",
   "armor.gtceu.quark_tech_suite.step_assist.enabled": "QuarkTech™ Suite: StepAssist Enabled",
-  "armor.gtceu.tooltip.autoeat": "§7Replenishes Food Bar by Using Food from Inventory",
+  "armor.gtceu.tooltip.auto_eat": "§7Replenishes Food Bar by Using Food from Inventory",
   "armor.gtceu.tooltip.breath": "§7Replenishes Underwater Breath Bar",
   "armor.gtceu.tooltip.burning": "§7Nullifies Burning",
-  "armor.gtceu.tooltip.falldamage": "§7Nullifies Fall Damage",
+  "armor.gtceu.tooltip.fall_damage": "§7Nullifies Fall Damage",
   "armor.gtceu.tooltip.freezing": "§7Prevents Freezing",
   "armor.gtceu.tooltip.jump": "§7Increases Jump Height and Distance",
   "armor.gtceu.tooltip.potions": "§7Nullifies Harmful Effects",
@@ -1677,10 +1677,10 @@
   "block.gtceu.yellow_lamp": "Yellow Lamp",
   "block.gtceu.yellow_large_metal_sheet": "Yellow Large Metal Sheet",
   "block.gtceu.yellow_metal_sheet": "Yellow Metal Sheet",
-  "block.gtceu.yellow_stripes_block_a": "Yellow Stripes Block",
-  "block.gtceu.yellow_stripes_block_b": "Yellow Stripes Block",
-  "block.gtceu.yellow_stripes_block_c": "Yellow Stripes Block",
-  "block.gtceu.yellow_stripes_block_d": "Yellow Stripes Block",
+  "block.gtceu.yellow_stripes_block_a": "Yellow Stripes Block (A)",
+  "block.gtceu.yellow_stripes_block_b": "Yellow Stripes Block (B)",
+  "block.gtceu.yellow_stripes_block_c": "Yellow Stripes Block (C)",
+  "block.gtceu.yellow_stripes_block_d": "Yellow Stripes Block (D)",
   "block.gtceu.yellow_studs": "Yellow Studs",
   "block.gtceu.zpm_1024a_laser_source_hatch": "§cZPM§r 1,024§eA§r Laser Source Hatch",
   "block.gtceu.zpm_1024a_laser_target_hatch": "§cZPM§r 1,024§eA§r Laser Target Hatch",
@@ -2215,19 +2215,6 @@
   "death.attack.gtceu.hoe": "%s had their head tilled by %s",
   "death.attack.gtceu.knife": "%s was gently poked by %s",
   "death.attack.gtceu.mallet": "%s was hammered to death by %s",
-  "death.attack.gtceu.medical_condition.arsenicosis": "%s got arsenic poisoning",
-  "death.attack.gtceu.medical_condition.asbestosis": "%s got mesothelioma",
-  "death.attack.gtceu.medical_condition.berylliosis": "%s mined emeralds a bit too greedily",
-  "death.attack.gtceu.medical_condition.carbon_monoxide_poisoning": "%s left the stove on",
-  "death.attack.gtceu.medical_condition.carcinogen": "%s got leukemia",
-  "death.attack.gtceu.medical_condition.chemical_burns": "%s had a chemical accident",
-  "death.attack.gtceu.medical_condition.irritant": "%s got a §n§lREALLY§r bad rash",
-  "death.attack.gtceu.medical_condition.methanol_poisoning": "%s tried to drink moonshine during the prohibition",
-  "death.attack.gtceu.medical_condition.nausea": "%s died of nausea",
-  "death.attack.gtceu.medical_condition.none": "%s died of... nothing?",
-  "death.attack.gtceu.medical_condition.poison": "%s forgot that poisonous materials are, in fact, poisonous",
-  "death.attack.gtceu.medical_condition.silicosis": "%s didn't die of tuberculosis. it was silicosis.",
-  "death.attack.gtceu.medical_condition.weak_poison": "%s ate lead (or mercury!)",
   "death.attack.gtceu.medical_condition/arsenicosis": "%s got arsenic poisoning",
   "death.attack.gtceu.medical_condition/asbestosis": "%s got mesothelioma",
   "death.attack.gtceu.medical_condition/berylliosis": "%s mined emeralds a bit too greedily",
@@ -2571,13 +2558,6 @@
   "gtceu.journeymap.options.layers.bedrock_fluids": "Show Bedrock Fluid Veins",
   "gtceu.journeymap.options.layers.hide_depleted": "Hide Depleted Veins",
   "gtceu.journeymap.options.layers.ore_veins": "Show Ore Veins",
-  "gtceu.key.armor_charging": "Armor Charging to Inventory Toggle",
-  "gtceu.key.armor_hover": "Armor Hover Toggle",
-  "gtceu.key.armor_mode_switch": "Armor Mode Switch",
-  "gtceu.key.enable_boots": "Enable Boosted Jump",
-  "gtceu.key.enable_jetpack": "Enable Jetpack",
-  "gtceu.key.enable_step_assist": "Enable StepAssist",
-  "gtceu.key.tool_aoe_change": "Tool AoE Mode Switch",
   "gtceu.machine.active_transformer.tooltip.0": "§7Transformers: Lasers in Disguise",
   "gtceu.machine.active_transformer.tooltip.1": "§7Can combine any number of Energy §fInputs§7 into any number of Energy §fOutputs§7.",
   "gtceu.machine.active_transformer.tooltip.2": "§7Can transmit power at incredible distance with",
@@ -2764,9 +2744,6 @@
   "gtceu.maintenance.configurable_time": "Time: %fx",
   "gtceu.maintenance.configurable_time.changed_description": "Maintenance problems will occur at %fx the normal rate.",
   "gtceu.maintenance.configurable_time.unchanged_description": "Maintenance problems will occur at normal rate. Change configuration to update.",
-  "gtceu.medical_condition.antidote.description": "§aAntidote §7Hold Shift to show details",
-  "gtceu.medical_condition.antidote.description.effect_removed": "Removes %s%% of current conditions' effects",
-  "gtceu.medical_condition.antidote.description_shift": "§aCures these conditions:",
   "gtceu.minimap.ore_vein.depleted": "Depleted",
   "gtceu.mode.both": "§dBoth (Fluid And Item)§r",
   "gtceu.mode.fluid": "§9Fluid§r",
@@ -3056,8 +3033,6 @@
   "gtceu.tooltip.fluid_pipe_hold_shift": "§7Hold SHIFT to show Fluid Containment Info",
   "gtceu.tooltip.hold_ctrl": "§7Hold CTRL for more info",
   "gtceu.tooltip.hold_shift": "§7Hold SHIFT for more info",
-  "gtceu.tooltip.potion.each": "%s %s §7for§r %s §7ticks with a§r %s%% §7chance of happening§r",
-  "gtceu.tooltip.potion.header": "§6Contains effects:",
   "gtceu.tooltip.proxy_bind": "§fBinding to a Pattern Buffer at %s %s %s",
   "gtceu.tooltip.status.trinary.false": "False",
   "gtceu.tooltip.status.trinary.true": "True",
@@ -4256,6 +4231,13 @@
   "itemGroup.gtceu.material_item": "GregTechCEu Material Items",
   "itemGroup.gtceu.material_pipe": "GregTechCEu Material Pipes",
   "itemGroup.gtceu.tool": "GregTechCEu Tools",
+  "keybind.gtceu.armor_charging": "Armor Charging to Inventory Toggle",
+  "keybind.gtceu.armor_hover": "Armor Hover Toggle",
+  "keybind.gtceu.armor_mode_switch": "Armor Mode Switch",
+  "keybind.gtceu.enable_boots": "Enable Boosted Jump",
+  "keybind.gtceu.enable_jetpack": "Enable Jetpack",
+  "keybind.gtceu.enable_step_assist": "Enable StepAssist",
+  "keybind.gtceu.tool_aoe_change": "Tool AoE Mode Switch",
   "ldlib.gui.editor.group.widget.gtm_container": "GTM Container Widgets",
   "ldlib.gui.editor.register.editor.gtceu.mui": "Machine UI Project",
   "ldlib.gui.editor.register.editor.gtceu.rtui": "RecipeType UI Project",
@@ -5908,7 +5890,10 @@
   "tool_action.gtceu.wire_cutter.connect": "§8Use Wire Cutters to set Connections",
   "tool_action.gtceu.wrench.connect": "§8Use Wrench to set Connections, sneak to block Connections",
   "tool_action.gtceu.wrench.set_facing": "§8Use Wrench to set Facing",
+  "tooltip.gtceu.antidote.description": "§aAntidote §7Hold Shift to show details",
+  "tooltip.gtceu.antidote.description.effect_removed": "Removes %s%% of current conditions' effects",
   "tooltip.gtceu.antidote.description.effect_removed.all": "Removes all of current conditions' effects",
+  "tooltip.gtceu.antidote.description_shift": "§aCures these conditions:",
   "tooltip.gtceu.cable.amperage": "§eMax Amperage:§r §e%d",
   "tooltip.gtceu.cable.loss_per_block": "§cLoss/Meter/Ampere:§r §c%d§7 EU-Volt",
   "tooltip.gtceu.cable.superconductor": "%s §dSuperconductor",
@@ -5922,6 +5907,7 @@
   "tooltip.gtceu.fluid_pipe.max_temperature": "§cTemperature Limit: §f%s",
   "tooltip.gtceu.fluid_pipe.not_gas_proof": "§4Gases may leak!",
   "tooltip.gtceu.fluid_pipe.plasma_proof": "§6Can handle all Plasmas",
+  "tooltip.gtceu.fluid_pipe.throughput": "§bTransfer Rate: §f%d mB/t",
   "tooltip.gtceu.fluid_property.acid": "§6Acidic! Handle with care!",
   "tooltip.gtceu.fluid_property.cryogenic": "§bCryogenic! Handle with care!",
   "tooltip.gtceu.fluid_property.temperature": "§cTemperature: %s",
@@ -5936,5 +5922,7 @@
   "tooltip.gtceu.hazard_trigger.skin_contact": "Skin contact",
   "tooltip.gtceu.item_pipe.priority": "§9Priority: §f%d",
   "tooltip.gtceu.medical_condition.description": "§l§cHAZARDOUS §7Hold Shift to show details",
-  "tooltip.gtceu.medical_condition.description_shift": "§l§cHAZARDOUS:"
+  "tooltip.gtceu.medical_condition.description_shift": "§l§cHAZARDOUS:",
+  "tooltip.gtceu.potion.each": "%s %s §7for§r %s §7ticks with a§r %s%% §7chance of happening§r",
+  "tooltip.gtceu.potion.header": "§6Contains effects:"
 }
\ No newline at end of file
diff --git a/src/main/java/com/gregtechceu/gtceu/common/block/FluidPipeBlock.java b/src/main/java/com/gregtechceu/gtceu/common/block/FluidPipeBlock.java
index 399fd7be6e6..42a35a1dab8 100644
--- a/src/main/java/com/gregtechceu/gtceu/common/block/FluidPipeBlock.java
+++ b/src/main/java/com/gregtechceu/gtceu/common/block/FluidPipeBlock.java
@@ -93,7 +93,7 @@ public void appendHoverText(ItemStack stack, @Nullable BlockGetter level, List lines) {
         CompoundTag data = itemStack.getOrCreateTag();
         Component state;
         boolean enabled = !data.contains("enabled") || data.getBoolean("enabled");
-        state = enabled ? Component.translatable("armor.gtceu.hud.status.enabled") :
-                Component.translatable("armor.gtceu.hud.status.disabled");
-        lines.add(Component.translatable("armor.gtceu.hud.engine_enabled", state));
+        state = enabled ? Component.translatable("armor.gtceu.hud.enabled") :
+                Component.translatable("armor.gtceu.hud.disabled");
+        lines.add(Component.translatable("armor.gtceu.hud.engine", state));
 
         boolean canShare = data.contains("canShare") && data.getBoolean("canShare");
-        state = canShare ? Component.translatable("armor.gtceu.hud.status.enabled") :
-                Component.translatable("armor.gtceu.hud.status.disabled");
+        state = canShare ? Component.translatable("armor.gtceu.hud.enabled") :
+                Component.translatable("armor.gtceu.hud.disabled");
         lines.add(Component.translatable("armor.gtceu.energy_share.tooltip", state));
         lines.add(Component.translatable("armor.gtceu.energy_share.tooltip.info"));
 
         boolean hover = data.contains("hover") && data.getBoolean("hover");
-        state = hover ? Component.translatable("armor.gtceu.hud.status.enabled") :
-                Component.translatable("armor.gtceu.hud.status.disabled");
+        state = hover ? Component.translatable("armor.gtceu.hud.enabled") :
+                Component.translatable("armor.gtceu.hud.disabled");
         lines.add(Component.translatable("armor.gtceu.hud.hover_mode", state));
     }
 
@@ -205,21 +205,21 @@ public void drawHUD(ItemStack item, GuiGraphics guiGraphics) {
         if (data != null) {
             if (data.contains("enabled")) {
                 Component status = (data.getBoolean("enabled") ?
-                        Component.translatable("armor.gtceu.hud.status.enabled") :
-                        Component.translatable("armor.gtceu.hud.status.disabled"));
-                Component result = Component.translatable("armor.gtceu.hud.engine_enabled", status);
+                        Component.translatable("armor.gtceu.hud.enabled") :
+                        Component.translatable("armor.gtceu.hud.disabled"));
+                Component result = Component.translatable("armor.gtceu.hud.engine", status);
                 this.HUD.newString(result);
             }
             if (data.contains("canShare")) {
-                String status = data.getBoolean("canShare") ? "armor.gtceu.hud.status.enabled" :
-                        "armor.gtceu.hud.status.disabled";
+                String status = data.getBoolean("canShare") ? "armor.gtceu.hud.enabled" :
+                        "armor.gtceu.hud.disabled";
                 this.HUD.newString(
                         Component.translatable("armor.gtceu.hud.supply_mode", Component.translatable(status)));
             }
 
             if (data.contains("hover")) {
-                String status = data.getBoolean("hover") ? "armor.gtceu.hud.status.enabled" :
-                        "armor.gtceu.hud.status.disabled";
+                String status = data.getBoolean("hover") ? "armor.gtceu.hud.enabled" :
+                        "armor.gtceu.hud.disabled";
                 this.HUD.newString(
                         Component.translatable("armor.gtceu.hud.hover_mode", Component.translatable(status)));
             }
diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedQuarkTechSuite.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedQuarkTechSuite.java
index ae2f8b2a2de..2da58979cdd 100644
--- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedQuarkTechSuite.java
+++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/AdvancedQuarkTechSuite.java
@@ -153,19 +153,19 @@ public void addInfo(ItemStack itemStack, List lines) {
         CompoundTag data = itemStack.getOrCreateTag();
         Component state;
         boolean enabled = !data.contains("enabled") || data.getBoolean("enabled");
-        state = enabled ? Component.translatable("armor.gtceu.hud.status.enabled") :
-                Component.translatable("armor.gtceu.hud.status.disabled");
-        lines.add(Component.translatable("armor.gtceu.hud.engine_enabled", state));
+        state = enabled ? Component.translatable("armor.gtceu.hud.enabled") :
+                Component.translatable("armor.gtceu.hud.disabled");
+        lines.add(Component.translatable("armor.gtceu.hud.gravi_engine", state));
 
         boolean canShare = data.contains("canShare") && data.getBoolean("canShare");
-        state = canShare ? Component.translatable("armor.gtceu.hud.status.enabled") :
-                Component.translatable("armor.gtceu.hud.status.disabled");
+        state = canShare ? Component.translatable("armor.gtceu.hud.enabled") :
+                Component.translatable("armor.gtceu.hud.disabled");
         lines.add(Component.translatable("armor.gtceu.energy_share.tooltip", state));
         lines.add(Component.translatable("armor.gtceu.energy_share.tooltip.info"));
 
         boolean hover = data.contains("hover") && data.getBoolean("hover");
-        state = hover ? Component.translatable("armor.gtceu.hud.status.enabled") :
-                Component.translatable("armor.gtceu.hud.status.disabled");
+        state = hover ? Component.translatable("armor.gtceu.hud.enabled") :
+                Component.translatable("armor.gtceu.hud.disabled");
         lines.add(Component.translatable("armor.gtceu.hud.hover_mode", state));
     }
 
@@ -185,9 +185,9 @@ public InteractionResultHolder onRightClick(Level world, Player playe
                 if (canShare && cont.getCharge() == 0) {
                     player.sendSystemMessage(Component.translatable("armor.gtceu.energy_share.error"));
                 } else if (canShare) {
-                    player.sendSystemMessage(Component.translatable("armor.gtceu.energy_share.enabledd"));
+                    player.sendSystemMessage(Component.translatable("armor.gtceu.energy_share.enabled"));
                 } else {
-                    player.sendSystemMessage(Component.translatable("armor.gtceu.energy_share.disabledd"));
+                    player.sendSystemMessage(Component.translatable("armor.gtceu.energy_share.disabled"));
                 }
             }
 
@@ -210,21 +210,21 @@ public void drawHUD(ItemStack item, GuiGraphics guiGraphics) {
         if (data != null) {
             if (data.contains("enabled")) {
                 Component status = (data.getBoolean("enabled") ?
-                        Component.translatable("armor.gtceu.hud.status.enabled") :
-                        Component.translatable("armor.gtceu.hud.status.disabled"));
-                Component result = Component.translatable("armor.gtceu.hud.engine_enabled", status);
+                        Component.translatable("armor.gtceu.hud.enabled") :
+                        Component.translatable("armor.gtceu.hud.disabled"));
+                Component result = Component.translatable("armor.gtceu.hud.gravi_engine", status);
                 this.HUD.newString(result);
             }
             if (data.contains("canShare")) {
-                String status = data.getBoolean("canShare") ? "armor.gtceu.hud.status.enabled" :
-                        "armor.gtceu.hud.status.disabled";
+                String status = data.getBoolean("canShare") ? "armor.gtceu.hud.enabled" :
+                        "armor.gtceu.hud.disabled";
                 this.HUD.newString(
                         Component.translatable("armor.gtceu.hud.supply_mode", Component.translatable(status)));
             }
 
             if (data.contains("hover")) {
-                String status = data.getBoolean("hover") ? "armor.gtceu.hud.status.enabled" :
-                        "armor.gtceu.hud.status.disabled";
+                String status = data.getBoolean("hover") ? "armor.gtceu.hud.enabled" :
+                        "armor.gtceu.hud.disabled";
                 this.HUD.newString(
                         Component.translatable("armor.gtceu.hud.hover_mode", Component.translatable(status)));
             }
diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/Jetpack.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/Jetpack.java
index dbf336c82f0..ca2412ca116 100644
--- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/Jetpack.java
+++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/Jetpack.java
@@ -133,15 +133,15 @@ public void drawHUD(ItemStack item, GuiGraphics guiGraphics) {
         if (data != null) {
             if (data.contains("enabled")) {
                 Component status = (data.getBoolean("enabled") ?
-                        Component.translatable("armor.gtceu.hud.status.enabled") :
-                        Component.translatable("armor.gtceu.hud.status.disabled"));
-                Component result = Component.translatable("armor.gtceu.hud.engine_enabled", status);
+                        Component.translatable("armor.gtceu.hud.enabled") :
+                        Component.translatable("armor.gtceu.hud.disabled"));
+                Component result = Component.translatable("armor.gtceu.hud.engine", status);
                 this.HUD.newString(result);
             }
             if (data.contains("hover")) {
                 Component status = (data.getBoolean("hover") ?
-                        Component.translatable("armor.gtceu.hud.status.enabled") :
-                        Component.translatable("armor.gtceu.hud.status.disabled"));
+                        Component.translatable("armor.gtceu.hud.enabled") :
+                        Component.translatable("armor.gtceu.hud.disabled"));
                 Component result = Component.translatable("armor.gtceu.hud.hover_mode", status);
                 this.HUD.newString(result);
             }
@@ -157,13 +157,13 @@ public void addInfo(ItemStack itemStack, List lines) {
 
         Component state;
         boolean enabled = !data.contains("enabled") || data.getBoolean("enabled");
-        state = enabled ? Component.translatable("armor.gtceu.hud.status.enabled") :
-                Component.translatable("armor.gtceu.hud.status.disabled");
-        lines.add(Component.translatable("armor.gtceu.hud.engine_enabled", state));
+        state = enabled ? Component.translatable("armor.gtceu.hud.enabled") :
+                Component.translatable("armor.gtceu.hud.disabled");
+        lines.add(Component.translatable("armor.gtceu.hud.engine", state));
 
         boolean hover = data.contains("hover") && data.getBoolean("hover");
-        state = hover ? Component.translatable("armor.gtceu.hud.status.enabled") :
-                Component.translatable("armor.gtceu.hud.status.disabled");
+        state = hover ? Component.translatable("armor.gtceu.hud.enabled") :
+                Component.translatable("armor.gtceu.hud.disabled");
         lines.add(Component.translatable("armor.gtceu.hud.hover_mode", state));
     }
 
diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/NanoMuscleSuite.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/NanoMuscleSuite.java
index d8252ccc43d..0c1ced4cee1 100644
--- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/NanoMuscleSuite.java
+++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/NanoMuscleSuite.java
@@ -79,10 +79,10 @@ public void onArmorTick(Level world, Player player, ItemStack itemStack) {
                     nightVision = false;
                     if (world.isClientSide())
                         player.displayClientMessage(
-                                Component.translatable("armor.gtceu.nano_muscle_suite.nightvision.error"), true);
+                                Component.translatable("armor.gtceu.nano_muscle_suite.night_vision.error"), true);
                 } else {
                     if (world.isClientSide()) player.displayClientMessage(Component
-                            .translatable("armor.gtceu.nano_muscle_suite.nightvision." +
+                            .translatable("armor.gtceu.nano_muscle_suite.night_vision." +
                                     (nightVision ? "enabled" : "disabled")),
                             true);
                 }
@@ -113,7 +113,7 @@ public static void disableNightVision(@NotNull Level world, Player player, boole
             player.removeEffect(MobEffects.NIGHT_VISION);
             if (sendMsg)
                 player.displayClientMessage(
-                        Component.translatable("armor.gtceu.nano_muscle_suite.nightvision.disabled"), true);
+                        Component.translatable("armor.gtceu.nano_muscle_suite.night_vision.disabled"), true);
         }
     }
 
@@ -194,7 +194,7 @@ public void addInfo(ItemStack itemStack, List lines) {
             if (nbtData.getBoolean("stepAssist"))
                 lines.add(Component.translatable("armor.gtceu.tooltip.stepassist.enabled"));
             else lines.add(Component.translatable("armor.gtceu.tooltip.stepassist.disabled"));
-            lines.add(Component.translatable("armor.gtceu.tooltip.falldamage"));
+            lines.add(Component.translatable("armor.gtceu.tooltip.fall_damage"));
         }
     }
 }
diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/NightvisionGoggles.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/NightvisionGoggles.java
index 1eb12a78ff3..ec0aecf5e1e 100644
--- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/NightvisionGoggles.java
+++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/NightvisionGoggles.java
@@ -47,10 +47,10 @@ public void onArmorTick(Level world, @NotNull Player player, @NotNull ItemStack
                 if (item.getCharge() < ArmorUtils.MIN_NIGHTVISION_CHARGE) {
                     nightVision = false;
                     player.displayClientMessage(
-                            Component.translatable("armor.gtceu.nano_muscle_suite.nightvision.error"), true);
+                            Component.translatable("armor.gtceu.nano_muscle_suite.night_vision.error"), true);
                 } else {
                     player.displayClientMessage(Component
-                            .translatable("armor.gtceu.nano_muscle_suite.nightvision." +
+                            .translatable("armor.gtceu.nano_muscle_suite.night_vision." +
                                     (nightVision ? "enabled" : "disabled")),
                             true);
                 }
diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/PowerlessJetpack.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/PowerlessJetpack.java
index 47e956508d7..ce8b3c9fad8 100644
--- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/PowerlessJetpack.java
+++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/PowerlessJetpack.java
@@ -140,15 +140,15 @@ public void drawHUD(@NotNull ItemStack item, GuiGraphics guiGraphics) {
             if (data != null) {
                 if (data.contains("enabled")) {
                     Component status = (data.getBoolean("enabled") ?
-                            Component.translatable("armor.gtceu.hud.status.enabled") :
-                            Component.translatable("armor.gtceu.hud.status.disabled"));
-                    Component result = Component.translatable("armor.gtceu.hud.engine_enabled", status);
+                            Component.translatable("armor.gtceu.hud.enabled") :
+                            Component.translatable("armor.gtceu.hud.disabled"));
+                    Component result = Component.translatable("armor.gtceu.hud.engine", status);
                     this.HUD.newString(result);
                 }
                 if (data.contains("hover")) {
                     Component status = (data.getBoolean("hover") ?
-                            Component.translatable("armor.gtceu.hud.status.enabled") :
-                            Component.translatable("armor.gtceu.hud.status.disabled"));
+                            Component.translatable("armor.gtceu.hud.enabled") :
+                            Component.translatable("armor.gtceu.hud.disabled"));
                     Component result = Component.translatable("armor.gtceu.hud.hover_mode", status);
                     this.HUD.newString(result);
                 }
@@ -263,13 +263,13 @@ public void appendHoverText(ItemStack stack, @Nullable Level level, List lines) {
             }
             lines.add(Component.translatable("armor.gtceu.tooltip.potions"));
             lines.add(Component.translatable("armor.gtceu.tooltip.breath"));
-            lines.add(Component.translatable("armor.gtceu.tooltip.autoeat"));
+            lines.add(Component.translatable("armor.gtceu.tooltip.auto_eat"));
         } else if (type == ArmorItem.Type.CHESTPLATE) {
             lines.add(Component.translatable("armor.gtceu.tooltip.burning"));
             lines.add(Component.translatable("armor.gtceu.tooltip.freezing"));
@@ -374,7 +374,7 @@ public void addInfo(ItemStack itemStack, List lines) {
             if (nbtData.getBoolean("stepAssist"))
                 lines.add(Component.translatable("armor.gtceu.tooltip.step_assist.enabled"));
             else lines.add(Component.translatable("armor.gtceu.tooltip.step_assist.disabled"));
-            lines.add(Component.translatable("armor.gtceu.tooltip.falldamage"));
+            lines.add(Component.translatable("armor.gtceu.tooltip.fall_damage"));
             lines.add(Component.translatable("armor.gtceu.tooltip.jump"));
         }
     }
diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java
index bf0e97344ea..570bd08b425 100644
--- a/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java
+++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java
@@ -17,21 +17,21 @@ public static void init(GTLangProvider provider) {
 
     private static void generateArmorMessageKeys(GTLangProvider provider) {
         // NanoMuscle Suit
-        provider.add("armor.gtceu.nano_muscle_suite.nightvision.enabled", "NanoMuscle™ Suite: §aNightVision Enabled");
-        provider.add("armor.gtceu.nano_muscle_suite.nightvision.disabled",
+        provider.add("armor.gtceu.nano_muscle_suite.night_vision.enabled", "NanoMuscle™ Suite: §aNightVision Enabled");
+        provider.add("armor.gtceu.nano_muscle_suite.night_vision.disabled",
                 " NanoMuscle™ Suite: §cNightVision Disabled");
+        provider.add("armor.gtceu.nano_muscle_suite.night_vision.error", "NanoMuscle™ Suite: §cNot enough power!");
         provider.add("armor.gtceu.nano_muscle_suite.step_assist.disabled", "NanoMuscle™ Suite: StepAssist Disabled");
         provider.add("armor.gtceu.nano_muscle_suite.step_assist.enabled", "NanoMuscle™ Suite: StepAssist Enabled");
-        provider.add("armor.gtceu.nano_muscle_suite.nightvision.error", "NanoMuscle™ Suite: §cNot enough power!");
         provider.add("armor.gtceu.nano_muscle_suite.charge.enabled", "NanoMuscle™ Suite: §aCharging Enabled");
         provider.add("armor.gtceu.nano_muscle_suite.charge.disabled", " NanoMuscle™ Suite: §cCharging Disabled");
         provider.add("armor.gtceu.nano_muscle_suite.charge.error",
                 "NanoMuscle™ Suite: §cNot enough power for charging!");
 
         // Quantum Suit
-        provider.add("armor.gtceu.quark_tech_suite.nightvision.enabled", "QuarkTech™ Suite: §aNightVision Enabled");
-        provider.add("armor.gtceu.quark_tech_suite.nightvision.disabled", "QuarkTech™ Suite: §cNightVision Disabled");
-        provider.add("armor.gtceu.quark_tech_suite.nightvision.error", "QuarkTech™ Suite: §cNot enough power!");
+        provider.add("armor.gtceu.quark_tech_suite.night_vision.enabled", "QuarkTech™ Suite: §aNightVision Enabled");
+        provider.add("armor.gtceu.quark_tech_suite.night_vision.disabled", "QuarkTech™ Suite: §cNightVision Disabled");
+        provider.add("armor.gtceu.quark_tech_suite.night_vision.error", "QuarkTech™ Suite: §cNot enough power!");
         provider.add("armor.gtceu.quark_tech_suite.charge.enabled", "QuarkTech™ Suite: §aCharging Enabled");
         provider.add("armor.gtceu.quark_tech_suite.charge.disabled", "QuarkTech™ Suite: §cCharging Disabled");
         provider.add("armor.gtceu.quark_tech_suite.charge.error", "QuarkTech™ Suite: §cNot enough power for charging!");
@@ -62,27 +62,27 @@ private static void generateTooltipKeys(GTLangProvider provider) {
         provider.add("armor.gtceu.tooltip.step_assist.disabled", "§bStep-Assist: §cOff");
         provider.add("armor.gtceu.tooltip.speed", "§7Increases Running Speed");
         provider.add("armor.gtceu.tooltip.jump", "§7Increases Jump Height and Distance");
-        provider.add("armor.gtceu.tooltip.falldamage", "§7Nullifies Fall Damage");
+        provider.add("armor.gtceu.tooltip.fall_damage", "§7Nullifies Fall Damage");
         provider.add("armor.gtceu.tooltip.potions", "§7Nullifies Harmful Effects");
         provider.add("armor.gtceu.tooltip.burning", "§7Nullifies Burning");
         provider.add("armor.gtceu.tooltip.freezing", "§7Prevents Freezing");
         provider.add("armor.gtceu.tooltip.breath", "§7Replenishes Underwater Breath Bar");
-        provider.add("armor.gtceu.tooltip.autoeat", "§7Replenishes Food Bar by Using Food from Inventory");
+        provider.add("armor.gtceu.tooltip.auto_eat", "§7Replenishes Food Bar by Using Food from Inventory");
 
         // Energy Tooltips (iaddinfo)
         provider.add("armor.gtceu.energy_share.error", "§cNot Enough Power for Charging Gadgets!");
         provider.add("armor.gtceu.energy_share.enabled", "§aGadget Charging Enabled");
         provider.add("armor.gtceu.energy_share.disabled", "§cGadget Charging Disabled");
         provider.add("armor.gtceu.energy_share.tooltip", "Supply Mode: %s");
-        provider.add("armor.gtceu.energy_share.tooltip.info", "To change mode, SHIT + R-CLICK when holding item");
+        provider.add("armor.gtceu.energy_share.tooltip.info", "To change mode, SHIFT + R-CLICK when holding item");
     }
 
     private static void generateHudKeys(GTLangProvider provider) {
         // HUD Information
-        provider.add("armor.gtceu.hud.status.enabled", "§aON"); // change this to generic tooltip?
-        provider.add("armor.gtceu.hud.status.disabled", "§cOFF");
+        provider.add("armor.gtceu.hud.enabled", "§aON"); // change this to generic tooltip?
+        provider.add("armor.gtceu.hud.disabled", "§cOFF");
         provider.add("armor.gtceu.hud.energy_level", "Energy Level: %s");
-        provider.add("armor.gtceu.hud.engine_enabled", "Engine: %s");
+        provider.add("armor.gtceu.hud.engine", "Engine: %s");
         provider.add("armor.gtceu.hud.fuel_level", "Fuel Level: %s");
         provider.add("armor.gtceu.hud.hover_mode", "Hover Mode: %s");
         provider.add("armor.gtceu.hud.supply_mode", "Supply Mode: %s");
diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java
index a06aa55603d..c063459933b 100644
--- a/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java
+++ b/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java
@@ -91,10 +91,10 @@ private static void generateBlockKeys(GTLangProvider provider) {
         provider.add("block.gtceu.itnt.drops_tooltip", "Much larger than TNT, drops all destroyed Blocks as Items");
 
         // Decor Stuff
-        provider.add("block.gtceu.yellow_stripes_block_a", "Yellow Stripes Block");
-        provider.add("block.gtceu.yellow_stripes_block_b", "Yellow Stripes Block");
-        provider.add("block.gtceu.yellow_stripes_block_c", "Yellow Stripes Block");
-        provider.add("block.gtceu.yellow_stripes_block_d", "Yellow Stripes Block");
+        provider.add("block.gtceu.yellow_stripes_block_a", "Yellow Stripes Block (A)");
+        provider.add("block.gtceu.yellow_stripes_block_b", "Yellow Stripes Block (B)");
+        provider.add("block.gtceu.yellow_stripes_block_c", "Yellow Stripes Block (C)");
+        provider.add("block.gtceu.yellow_stripes_block_d", "Yellow Stripes Block (D)");
 
         // Extra stone blocks
         provider.add("block.gtceu.seal", "Sealed Block");
@@ -152,8 +152,9 @@ private static void generatePipeKeys(GTLangProvider provider) {
 
         // Fluid Pipes
         provider.add("tooltip.gtceu.fluid_pipe.capacity", "§9Capacity: §f%d mB");
-        provider.add("tooltip.gtceu.fluid_pipe.max_temperature", "§cTemperature Limit: §f%s");
+        provider.add("tooltip.gtceu.fluid_pipe.throughput", "§bTransfer Rate: §f%d mB/t");
         provider.add("tooltip.gtceu.fluid_pipe.channels", "§eChannels: §f%d");
+        provider.add("tooltip.gtceu.fluid_pipe.max_temperature", "§cTemperature Limit: §f%s");
         provider.add("tooltip.gtceu.fluid_pipe.gas_proof", "§6Can handle Gases");
         provider.add("tooltip.gtceu.fluid_pipe.not_gas_proof", "§4Gases may leak!");
         provider.add("tooltip.gtceu.fluid_pipe.acid_proof", "§6Can handle Acids");
diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/GUILang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/GUILang.java
index 91289266c4d..c476748d70a 100644
--- a/src/main/java/com/gregtechceu/gtceu/data/lang/GUILang.java
+++ b/src/main/java/com/gregtechceu/gtceu/data/lang/GUILang.java
@@ -25,13 +25,13 @@ private static void generateLDLibKeys(GTLangProvider provider) {
     }
 
     private static void generateKeybindKeys(GTLangProvider provider) {
-        provider.add("gtceu.key.armor_mode_switch", "Armor Mode Switch");
-        provider.add("gtceu.key.armor_hover", "Armor Hover Toggle");
-        provider.add("gtceu.key.enable_jetpack", "Enable Jetpack");
-        provider.add("gtceu.key.enable_boots", "Enable Boosted Jump");
-        provider.add("gtceu.key.armor_charging", "Armor Charging to Inventory Toggle");
-        provider.add("gtceu.key.tool_aoe_change", "Tool AoE Mode Switch");
-        provider.add("gtceu.key.enable_step_assist", "Enable StepAssist");
+        provider.add("keybind.gtceu.armor_mode_switch", "Armor Mode Switch");
+        provider.add("keybind.gtceu.armor_hover", "Armor Hover Toggle");
+        provider.add("keybind.gtceu.enable_jetpack", "Enable Jetpack");
+        provider.add("keybind.gtceu.enable_boots", "Enable Boosted Jump");
+        provider.add("keybind.gtceu.armor_charging", "Armor Charging to Inventory Toggle");
+        provider.add("keybind.gtceu.tool_aoe_change", "Tool AoE Mode Switch");
+        provider.add("keybind.gtceu.enable_step_assist", "Enable StepAssist");
         provider.add("gtceu.debug.f3_h.enabled",
                 "GregTech has modified the debug info! For Developers: enable the misc:debug config option in the GregTech config file to see more");
     }
diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java
index 9aedd5eba49..bedb3ca5f95 100644
--- a/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java
+++ b/src/main/java/com/gregtechceu/gtceu/data/lang/HazardLang.java
@@ -55,36 +55,36 @@ private static void generateHazardKeys(GTLangProvider provider) {
         provider.add("tooltip.gtceu.hazard_trigger.none", "Nothing");
 
         // Antidote
-        provider.add("gtceu.medical_condition.antidote.description", "§aAntidote §7Hold Shift to show details");
-        provider.add("gtceu.medical_condition.antidote.description_shift", "§aCures these conditions:");
-        provider.add("gtceu.medical_condition.antidote.description.effect_removed",
+        provider.add("tooltip.gtceu.antidote.description", "§aAntidote §7Hold Shift to show details");
+        provider.add("tooltip.gtceu.antidote.description_shift", "§aCures these conditions:");
+        provider.add("tooltip.gtceu.antidote.description.effect_removed",
                 "Removes %s%% of current conditions' effects");
         provider.add("tooltip.gtceu.antidote.description.effect_removed.all",
                 "Removes all of current conditions' effects");
 
         // Potion
-        provider.add("gtceu.tooltip.potion.header", "§6Contains effects:");
-        provider.add("gtceu.tooltip.potion.each", "%s %s §7for§r %s §7ticks with a§r %s%% §7chance of happening§r");
+        provider.add("tooltip.gtceu.potion.header", "§6Contains effects:");
+        provider.add("tooltip.gtceu.potion.each", "%s %s §7for§r %s §7ticks with a§r %s%% §7chance of happening§r");
 
         // Poison
         provider.add("effect.gtceu.weak_poison", "Weak Poison");
 
         // Medical Deaths
-        provider.add("death.attack.gtceu.medical_condition.asbestosis", "%s got mesothelioma");
-        provider.add("death.attack.gtceu.medical_condition.chemical_burns", "%s had a chemical accident");
-        provider.add("death.attack.gtceu.medical_condition.poison",
+        provider.add("death.attack.gtceu.medical_condition/asbestosis", "%s got mesothelioma");
+        provider.add("death.attack.gtceu.medical_condition/chemical_burns", "%s had a chemical accident");
+        provider.add("death.attack.gtceu.medical_condition/poison",
                 "%s forgot that poisonous materials are, in fact, poisonous");
-        provider.add("death.attack.gtceu.medical_condition.silicosis",
-                "%s didn't die of tuberculosis. it was silicosis.");
-        provider.add("death.attack.gtceu.medical_condition.arsenicosis", "%s got arsenic poisoning");
-        provider.add("death.attack.gtceu.medical_condition.berylliosis", "%s mined emeralds a bit too greedily");
-        provider.add("death.attack.gtceu.medical_condition.carcinogen", "%s got leukemia");
-        provider.add("death.attack.gtceu.medical_condition.irritant", "%s got a §n§lREALLY§r bad rash");
-        provider.add("death.attack.gtceu.medical_condition.methanol_poisoning",
+        provider.add("death.attack.gtceu.medical_condition/silicosis",
+                "%s didn't die of tuberculosis. It was silicosis");
+        provider.add("death.attack.gtceu.medical_condition/arsenicosis", "%s got arsenic poisoning");
+        provider.add("death.attack.gtceu.medical_condition/berylliosis", "%s mined emeralds a bit too greedily");
+        provider.add("death.attack.gtceu.medical_condition/carcinogen", "%s got leukemia");
+        provider.add("death.attack.gtceu.medical_condition/irritant", "%s got a §n§lREALLY§r bad rash");
+        provider.add("death.attack.gtceu.medical_condition/methanol_poisoning",
                 "%s tried to drink moonshine during the prohibition");
-        provider.add("death.attack.gtceu.medical_condition.nausea", "%s died of nausea");
-        provider.add("death.attack.gtceu.medical_condition.none", "%s died of... nothing?");
-        provider.add("death.attack.gtceu.medical_condition.weak_poison", "%s ate lead (or mercury!)");
-        provider.add("death.attack.gtceu.medical_condition.carbon_monoxide_poisoning", "%s left the stove on");
+        provider.add("death.attack.gtceu.medical_condition/nausea", "%s succumbed to nausea");
+        provider.add("death.attack.gtceu.medical_condition/none", "%s died of... nothing?");
+        provider.add("death.attack.gtceu.medical_condition/weak_poison", "%s ate lead");
+        provider.add("death.attack.gtceu.medical_condition/carbon_monoxide_poisoning", "%s left the stove on");
     }
 }
diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java
index ad42eff98dc..a1d4c382bec 100644
--- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java
+++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java
@@ -26,15 +26,15 @@ public static void init(GTLangProvider provider) {
         BlockLang.init(provider);
         CommandLang.init(provider);
         ConfigurationLang.init(provider);
-        CoverLang.init(provider);
-        GUILang.init(provider);
+        CoverLang.init(provider); // TODO
+        GUILang.init(provider); // TODO
         HazardLang.init(provider);
-        IntegrationLang.init(provider);
-        ItemLang.init(provider);
-        MachineLang.init(provider);
-        MaterialLang.init(provider);
-        RecipeLang.init(provider);
-        SubtitleLang.init(provider);
-        ToolLang.init(provider);
+        IntegrationLang.init(provider); // TODO
+        ItemLang.init(provider); // TODO
+        MachineLang.init(provider); // TODO
+        MaterialLang.init(provider); // TODO
+        RecipeLang.init(provider); // TODO
+        SubtitleLang.init(provider); // TODO
+        ToolLang.init(provider); // TODO
     }
 }
diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java
index 0ba750bb54b..1d593b337c8 100644
--- a/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java
+++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java
@@ -5,7 +5,7 @@
 public class ToolLang {
 
     public static void init(GTLangProvider provider) {
-        initDeathMessages(provider);
+        generateDeathMessages(provider);
         generateToolClassKeys(provider);
         generateToolKeys(provider);
         generateTooltips(provider);
@@ -14,7 +14,7 @@ public static void init(GTLangProvider provider) {
         generateEnchantKeys(provider);
     }
 
-    private static void initDeathMessages(GTLangProvider provider) {
+    private static void generateDeathMessages(GTLangProvider provider) {
         // Death Messages
         provider.add("death.attack.gtceu.heat", "%s was boiled alive");
         provider.add("death.attack.gtceu.frost", "%s explored cryogenics");
@@ -115,23 +115,6 @@ public static void generateBehaviorKeys(GTLangProvider provider) {
         provider.add("item.behavior.mode_switch.tooltip", "Use while sneaking to switch mode");
         provider.add("item.behavior.mode_switch.mode_switched", "§eMode Set to: %s");
         provider.add("item.behavior.mode_switch.current_mode", "Mode: %s");
-
-        provider.add("death.attack.gtceu.medical_condition/asbestosis", "%s got mesothelioma");
-        provider.add("death.attack.gtceu.medical_condition/chemical_burns", "%s had a chemical accident");
-        provider.add("death.attack.gtceu.medical_condition/poison",
-                "%s forgot that poisonous materials are, in fact, poisonous");
-        provider.add("death.attack.gtceu.medical_condition/silicosis",
-                "%s didn't die of tuberculosis. It was silicosis");
-        provider.add("death.attack.gtceu.medical_condition/arsenicosis", "%s got arsenic poisoning");
-        provider.add("death.attack.gtceu.medical_condition/berylliosis", "%s mined emeralds a bit too greedily");
-        provider.add("death.attack.gtceu.medical_condition/carcinogen", "%s got leukemia");
-        provider.add("death.attack.gtceu.medical_condition/irritant", "%s got a §n§lREALLY§r bad rash");
-        provider.add("death.attack.gtceu.medical_condition/methanol_poisoning",
-                "%s tried to drink moonshine during the prohibition");
-        provider.add("death.attack.gtceu.medical_condition/nausea", "%s succumbed to nausea");
-        provider.add("death.attack.gtceu.medical_condition/none", "%s died of... nothing?");
-        provider.add("death.attack.gtceu.medical_condition/weak_poison", "%s ate lead");
-        provider.add("death.attack.gtceu.medical_condition/carbon_monoxide_poisoning", "%s left the stove on");
     }
 
     public static void generateToolKeys(GTLangProvider provider) {
diff --git a/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java b/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java
index 4660c3efc46..2f44616ddc9 100644
--- a/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java
+++ b/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java
@@ -633,12 +633,12 @@ public static Tuple getMaintenanceText(byte flag) {
 
     public static void addPotionTooltip(List> effects, List list) {
         if (!effects.isEmpty()) {
-            list.add(Component.translatable("gtceu.tooltip.potion.header"));
+            list.add(Component.translatable("tooltip.gtceu.potion.header"));
         }
         effects.forEach(pair -> {
             var effect = pair.getFirst();
             float probability = pair.getSecond();
-            list.add(Component.translatable("gtceu.tooltip.potion.each",
+            list.add(Component.translatable("tooltip.gtceu.potion.each",
                     Component.translatable(effect.getDescriptionId())
                             .setStyle(Style.EMPTY.withColor(ChatFormatting.YELLOW)),
                     Component.translatable("enchantment.level." + (effect.getAmplifier() + 1))
diff --git a/src/main/java/com/gregtechceu/gtceu/utils/input/KeyBind.java b/src/main/java/com/gregtechceu/gtceu/utils/input/KeyBind.java
index 1d26a375c10..798bb4a4cd8 100644
--- a/src/main/java/com/gregtechceu/gtceu/utils/input/KeyBind.java
+++ b/src/main/java/com/gregtechceu/gtceu/utils/input/KeyBind.java
@@ -60,37 +60,37 @@ public enum KeyBind {
      * @deprecated {@link SyncedKeyMappings#ARMOR_MODE_SWITCH}
      */
     @Deprecated
-    ARMOR_MODE_SWITCH("gtceu.key.armor_mode_switch", KeyConflictContext.IN_GAME, InputConstants.KEY_M),
+    ARMOR_MODE_SWITCH("keybind.gtceu.armor_mode_switch", KeyConflictContext.IN_GAME, InputConstants.KEY_M),
     /**
      * @deprecated {@link SyncedKeyMappings#ARMOR_HOVER}
      */
     @Deprecated
-    ARMOR_HOVER("gtceu.key.armor_hover", KeyConflictContext.IN_GAME, InputConstants.KEY_H),
+    ARMOR_HOVER("keybind.gtceu.armor_hover", KeyConflictContext.IN_GAME, InputConstants.KEY_H),
     /**
      * @deprecated {@link SyncedKeyMappings#JETPACK_ENABLE}
      */
     @Deprecated
-    JETPACK_ENABLE("gtceu.key.enable_jetpack", KeyConflictContext.IN_GAME, InputConstants.KEY_G),
+    JETPACK_ENABLE("keybind.gtceu.enable_jetpack", KeyConflictContext.IN_GAME, InputConstants.KEY_G),
     /**
      * @deprecated {@link SyncedKeyMappings#BOOTS_ENABLE}
      */
     @Deprecated
-    BOOTS_ENABLE("gtceu.key.enable_boots", KeyConflictContext.IN_GAME, InputConstants.KEY_PERIOD),
+    BOOTS_ENABLE("keybind.gtceu.enable_boots", KeyConflictContext.IN_GAME, InputConstants.KEY_PERIOD),
     /**
      * @deprecated {@link SyncedKeyMappings#ARMOR_CHARGING}
      */
     @Deprecated
-    ARMOR_CHARGING("gtceu.key.armor_charging", KeyConflictContext.IN_GAME, InputConstants.KEY_N),
+    ARMOR_CHARGING("keybind.gtceu.armor_charging", KeyConflictContext.IN_GAME, InputConstants.KEY_N),
     /**
      * @deprecated {@link SyncedKeyMappings#TOOL_AOE_CHANGE}
      */
     @Deprecated
-    TOOL_AOE_CHANGE("gtceu.key.tool_aoe_change", KeyConflictContext.IN_GAME, InputConstants.KEY_V),
+    TOOL_AOE_CHANGE("keybind.gtceu.tool_aoe_change", KeyConflictContext.IN_GAME, InputConstants.KEY_V),
     /**
      * @deprecated removed
      */
     @Deprecated(forRemoval = true)
-    ACTION("gtceu.key.action", KeyConflictContext.GUI, InputConstants.KEY_DELETE),
+    ACTION("keybind.gtceu.action", KeyConflictContext.GUI, InputConstants.KEY_DELETE),
     ;
 
     /**
diff --git a/src/main/java/com/gregtechceu/gtceu/utils/input/SyncedKeyMappings.java b/src/main/java/com/gregtechceu/gtceu/utils/input/SyncedKeyMappings.java
index f59598a7104..228d77c67ba 100644
--- a/src/main/java/com/gregtechceu/gtceu/utils/input/SyncedKeyMappings.java
+++ b/src/main/java/com/gregtechceu/gtceu/utils/input/SyncedKeyMappings.java
@@ -27,19 +27,19 @@ public final class SyncedKeyMappings {
 
     // GT keymappings
     public static final SyncedKeyMapping ARMOR_MODE_SWITCH = SyncedKeyMapping.createConfigurable(
-            "gtceu.key.armor_mode_switch", KeyConflictContext.IN_GAME, InputConstants.KEY_M);
+            "keybind.gtceu.armor_mode_switch", KeyConflictContext.IN_GAME, InputConstants.KEY_M);
     public static final SyncedKeyMapping ARMOR_HOVER = SyncedKeyMapping.createConfigurable(
-            "gtceu.key.armor_hover", KeyConflictContext.IN_GAME, InputConstants.KEY_H);
+            "keybind.gtceu.armor_hover", KeyConflictContext.IN_GAME, InputConstants.KEY_H);
     public static final SyncedKeyMapping JETPACK_ENABLE = SyncedKeyMapping.createConfigurable(
-            "gtceu.key.enable_jetpack", KeyConflictContext.IN_GAME, InputConstants.KEY_G);
+            "keybind.gtceu.enable_jetpack", KeyConflictContext.IN_GAME, InputConstants.KEY_G);
     public static final SyncedKeyMapping BOOTS_ENABLE = SyncedKeyMapping.createConfigurable(
-            "gtceu.key.enable_boots", KeyConflictContext.IN_GAME, InputConstants.KEY_PERIOD);
+            "keybind.gtceu.enable_boots", KeyConflictContext.IN_GAME, InputConstants.KEY_PERIOD);
     public static final SyncedKeyMapping ARMOR_CHARGING = SyncedKeyMapping.createConfigurable(
-            "gtceu.key.armor_charging", KeyConflictContext.IN_GAME, InputConstants.KEY_N);
+            "keybind.gtceu.armor_charging", KeyConflictContext.IN_GAME, InputConstants.KEY_N);
     public static final SyncedKeyMapping TOOL_AOE_CHANGE = SyncedKeyMapping.createConfigurable(
-            "gtceu.key.tool_aoe_change", KeyConflictContext.IN_GAME, InputConstants.KEY_V);
+            "keybind.gtceu.tool_aoe_change", KeyConflictContext.IN_GAME, InputConstants.KEY_V);
     public static final SyncedKeyMapping STEP_ASSIST_ENABLE = SyncedKeyMapping.createConfigurable(
-            "gtceu.key.enable_step_assist", KeyConflictContext.IN_GAME,
+            "keybind.gtceu.enable_step_assist", KeyConflictContext.IN_GAME,
             InputConstants.KEY_APOSTROPHE);
 
     public static void init() {

From 2f4fe73745f9c051b9e96d1d00e7c68a31c76cca Mon Sep 17 00:00:00 2001
From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com>
Date: Tue, 9 Jun 2026 01:52:01 -0600
Subject: [PATCH 35/45] more cleanup

---
 .../resources/assets/gtceu/lang/en_us.json    | 22 ++---
 .../gtceu/common/block/FluidPipeBlock.java    |  2 +-
 .../common/item/armor/NanoMuscleSuite.java    |  8 +-
 .../common/item/armor/NightvisionGoggles.java |  6 +-
 .../common/item/armor/QuarkTechSuite.java     |  4 +-
 .../common/machine/owner/ArgonautsOwner.java  |  2 +-
 .../gtceu/common/machine/owner/FTBOwner.java  |  2 +-
 .../common/machine/owner/PlayerOwner.java     |  2 +-
 .../mixins/ftbchunks/LargeMapScreenMixin.java |  2 +-
 .../gtceu/data/lang/ArmorLang.java            |  6 +-
 .../gtceu/data/lang/IntegrationLang.java      | 20 ++---
 .../gtceu/data/lang/LangHandler.java          |  2 +-
 .../gtceu/data/lang/MaterialLang.java         | 82 -------------------
 .../map/cache/client/GTClientCache.java       |  2 +-
 .../map/ftbchunks/veins/ore/OreVeinIcon.java  |  2 +-
 .../map/layer/builtin/OreRenderLayer.java     |  4 +-
 16 files changed, 43 insertions(+), 125 deletions(-)

diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json
index f7c93d2fc07..6a0f5dedce5 100644
--- a/src/generated/resources/assets/gtceu/lang/en_us.json
+++ b/src/generated/resources/assets/gtceu/lang/en_us.json
@@ -17,9 +17,9 @@
   "armor.gtceu.jetpack.flight.enabled": "Jetpack: §aFlight Enabled",
   "armor.gtceu.jetpack.hover.disabled": "Jetpack: Hover Mode Disabled",
   "armor.gtceu.jetpack.hover.enabled": "Jetpack: §aHover Mode Enabled",
-  "armor.gtceu.message.nightvision.disabled": "§7NightVision: §cOff",
-  "armor.gtceu.message.nightvision.enabled": "§7NightVision: §aOn",
-  "armor.gtceu.message.nightvision.error": "§cNot enough power!",
+  "armor.gtceu.message.night_vision.disabled": "§7NightVision: §cOff",
+  "armor.gtceu.message.night_vision.enabled": "§7NightVision: §aOn",
+  "armor.gtceu.message.night_vision.error": "§7NightVision Goggles: §cNot enough power!",
   "armor.gtceu.nano_muscle_suite.charge.disabled": " NanoMuscle™ Suite: §cCharging Disabled",
   "armor.gtceu.nano_muscle_suite.charge.enabled": "NanoMuscle™ Suite: §aCharging Enabled",
   "armor.gtceu.nano_muscle_suite.charge.error": "NanoMuscle™ Suite: §cNot enough power for charging!",
@@ -1770,7 +1770,11 @@
   "block.gtceu.zpm_wiremill": "§cElite Wiremill III§r",
   "block.gtceu.zpm_world_accelerator": "§cElite World Accelerator III§r",
   "block.surface_rock": "%s Surface Rock",
+  "button.gtceu.bedrock_fluids": "Show Bedrock Fluid Veins",
+  "button.gtceu.hide_depleted": "Hide Depleted Veins",
   "button.gtceu.mark_as_depleted.name": "Mark as Depleted",
+  "button.gtceu.ore_veins": "Show GT Ore Veins",
+  "button.gtceu.show_depleted": "Show Depleted Veins",
   "button.gtceu.toggle_waypoint.name": "Toggle Waypoint",
   "command.gtceu.cape.give.failed": "No new capes were unlocked",
   "command.gtceu.cape.give.success.multiple": "Unlocked %s capes for %s players",
@@ -2277,10 +2281,6 @@
   "gtceu.bus.collapse.error": "Bus must be attached to multiblock first",
   "gtceu.bus.collapse_false": "Bus will not collapse Items",
   "gtceu.bus.collapse_true": "Bus will collapse Items",
-  "gtceu.button.bedrock_fluids": "Show Bedrock Fluid Veins",
-  "gtceu.button.hide_depleted": "Hide Depleted Veins",
-  "gtceu.button.ore_veins": "Show GT Ore Veins",
-  "gtceu.button.show_depleted": "Show Depleted Veins",
   "gtceu.chance_logic.and": "AND",
   "gtceu.chance_logic.first": "FIRST",
   "gtceu.chance_logic.none": "NONE",
@@ -2744,7 +2744,6 @@
   "gtceu.maintenance.configurable_time": "Time: %fx",
   "gtceu.maintenance.configurable_time.changed_description": "Maintenance problems will occur at %fx the normal rate.",
   "gtceu.maintenance.configurable_time.unchanged_description": "Maintenance problems will occur at normal rate. Change configuration to update.",
-  "gtceu.minimap.ore_vein.depleted": "Depleted",
   "gtceu.mode.both": "§dBoth (Fluid And Item)§r",
   "gtceu.mode.fluid": "§9Fluid§r",
   "gtceu.mode.item": "§6Item§r",
@@ -2987,9 +2986,6 @@
   "gtceu.oc.tooltip.2": "Right click to decrease the OC",
   "gtceu.oc.tooltip.3": "Middle click to reset the OC",
   "gtceu.oc.tooltip.4": "Hold Shift to change by Perfect OC",
-  "gtceu.ownership.name.argonauts": "Argonauts Guild",
-  "gtceu.ownership.name.ftb": "FTB Teams",
-  "gtceu.ownership.name.player": "Player",
   "gtceu.part_sharing.disabled": "Multiblock Sharing §4Disabled",
   "gtceu.part_sharing.enabled": "Multiblock Sharing §aEnabled",
   "gtceu.recipe.byproduct_tier": "Byproducts from %s§r+",
@@ -5602,6 +5598,7 @@
   "medical_condition.gtceu.weak_poison.affected": "§aMinor poisoning",
   "message.gtceu.new_veins.amount": "Prospected %d new veins!",
   "message.gtceu.new_veins.name": "Prospected %s!",
+  "minimap.gtceu.ore_vein.depleted": "Depleted",
   "monitor.gui.title.argb": "ARGB:",
   "monitor.gui.title.back": "Back",
   "monitor.gui.title.config": "Config",
@@ -5609,6 +5606,9 @@
   "monitor.gui.title.scale": "Scale:",
   "monitor.gui.title.slot": "Slot:",
   "ore.spawnlocation.name": "Ore Spawn Information",
+  "ownership.gtceu.name.argonauts": "Argonauts Guild",
+  "ownership.gtceu.name.ftb": "FTB Teams",
+  "ownership.gtceu.name.player": "Player",
   "recipe.capability.eu.name": "GTCEu Energy",
   "recipe.capability.fluid.name": "Fluid",
   "recipe.capability.item.name": "Item",
diff --git a/src/main/java/com/gregtechceu/gtceu/common/block/FluidPipeBlock.java b/src/main/java/com/gregtechceu/gtceu/common/block/FluidPipeBlock.java
index 42a35a1dab8..d521854674a 100644
--- a/src/main/java/com/gregtechceu/gtceu/common/block/FluidPipeBlock.java
+++ b/src/main/java/com/gregtechceu/gtceu/common/block/FluidPipeBlock.java
@@ -93,7 +93,7 @@ public void appendHoverText(ItemStack stack, @Nullable BlockGetter level, List lines) {
 
             boolean nv = nbtData.getBoolean("nightVision");
             if (nv) {
-                lines.add(Component.translatable("armor.gtceu.message.nightvision.enabled"));
+                lines.add(Component.translatable("armor.gtceu.message.night_vision.enabled"));
             } else {
-                lines.add(Component.translatable("armor.gtceu.message.nightvision.disabled"));
+                lines.add(Component.translatable("armor.gtceu.message.night_vision.disabled"));
             }
         } else if (type == ArmorItem.Type.BOOTS) {
             if (nbtData.getBoolean("stepAssist"))
-                lines.add(Component.translatable("armor.gtceu.tooltip.stepassist.enabled"));
-            else lines.add(Component.translatable("armor.gtceu.tooltip.stepassist.disabled"));
+                lines.add(Component.translatable("armor.gtceu.tooltip.step_assist.enabled"));
+            else lines.add(Component.translatable("armor.gtceu.tooltip.step_assist.disabled"));
             lines.add(Component.translatable("armor.gtceu.tooltip.fall_damage"));
         }
     }
diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/NightvisionGoggles.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/NightvisionGoggles.java
index ec0aecf5e1e..da4e15a7505 100644
--- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/NightvisionGoggles.java
+++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/NightvisionGoggles.java
@@ -83,7 +83,7 @@ public static void disableNightVision(@NotNull Level world, Player player, boole
         if (!world.isClientSide) {
             player.removeEffect(MobEffects.NIGHT_VISION);
             if (sendMsg)
-                player.displayClientMessage(Component.translatable("armor.gtceu.message.nightvision.disabled"), true);
+                player.displayClientMessage(Component.translatable("armor.gtceu.message.night_vision.disabled"), true);
         }
     }
 
@@ -99,9 +99,9 @@ public void addInfo(ItemStack itemStack, List lines) {
             CompoundTag nbtData = itemStack.getOrCreateTag();
             boolean nv = nbtData.getBoolean("nightVision");
             if (nv) {
-                lines.add(Component.translatable("armor.gtceu.message.nightvision.enabled"));
+                lines.add(Component.translatable("armor.gtceu.message.night_vision.enabled"));
             } else {
-                lines.add(Component.translatable("armor.gtceu.message.nightvision.disabled"));
+                lines.add(Component.translatable("armor.gtceu.message.night_vision.disabled"));
             }
         }
     }
diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/QuarkTechSuite.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/QuarkTechSuite.java
index a9ab1d43d36..9efdb1778dc 100644
--- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/QuarkTechSuite.java
+++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/QuarkTechSuite.java
@@ -357,9 +357,9 @@ public void addInfo(ItemStack itemStack, List lines) {
             CompoundTag nbtData = itemStack.getOrCreateTag();
             boolean nv = nbtData.getBoolean("nightVision");
             if (nv) {
-                lines.add(Component.translatable("armor.gtceu.message.nightvision.enabled"));
+                lines.add(Component.translatable("armor.gtceu.message.night_vision.enabled"));
             } else {
-                lines.add(Component.translatable("armor.gtceu.message.nightvision.disabled"));
+                lines.add(Component.translatable("armor.gtceu.message.night_vision.disabled"));
             }
             lines.add(Component.translatable("armor.gtceu.tooltip.potions"));
             lines.add(Component.translatable("armor.gtceu.tooltip.breath"));
diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/owner/ArgonautsOwner.java b/src/main/java/com/gregtechceu/gtceu/common/machine/owner/ArgonautsOwner.java
index 6f150354b4c..5f656787ead 100644
--- a/src/main/java/com/gregtechceu/gtceu/common/machine/owner/ArgonautsOwner.java
+++ b/src/main/java/com/gregtechceu/gtceu/common/machine/owner/ArgonautsOwner.java
@@ -17,7 +17,7 @@
 @SuppressWarnings({ "UnstableApiUsage", "removal", "deprecation" })
 public non-sealed class ArgonautsOwner extends MachineOwner {
 
-    private static final Component displayName = Component.translatable("gtceu.ownership.name.argonauts");
+    private static final Component displayName = Component.translatable("ownership.gtceu.name.argonauts");
 
     public ArgonautsOwner(UUID playerUUID) {
         super(playerUUID);
diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/owner/FTBOwner.java b/src/main/java/com/gregtechceu/gtceu/common/machine/owner/FTBOwner.java
index 0e8237a297c..4df2e83a3c4 100644
--- a/src/main/java/com/gregtechceu/gtceu/common/machine/owner/FTBOwner.java
+++ b/src/main/java/com/gregtechceu/gtceu/common/machine/owner/FTBOwner.java
@@ -16,7 +16,7 @@
 
 public non-sealed class FTBOwner extends MachineOwner {
 
-    private static final Component displayName = Component.translatable("gtceu.ownership.name.ftb");
+    private static final Component displayName = Component.translatable("ownership.gtceu.name.ftb");
 
     public FTBOwner(UUID playerUUID) {
         super(playerUUID);
diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/owner/PlayerOwner.java b/src/main/java/com/gregtechceu/gtceu/common/machine/owner/PlayerOwner.java
index a36e3f3ee82..b42189de419 100644
--- a/src/main/java/com/gregtechceu/gtceu/common/machine/owner/PlayerOwner.java
+++ b/src/main/java/com/gregtechceu/gtceu/common/machine/owner/PlayerOwner.java
@@ -12,7 +12,7 @@
 
 public non-sealed class PlayerOwner extends MachineOwner {
 
-    private static final Component displayName = Component.translatable("gtceu.ownership.name.player");
+    private static final Component displayName = Component.translatable("ownership.gtceu.name.player");
 
     public PlayerOwner(UUID playerUUID) {
         super(playerUUID);
diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/ftbchunks/LargeMapScreenMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/ftbchunks/LargeMapScreenMixin.java
index b5f52dd6977..b6cf91c8168 100644
--- a/src/main/java/com/gregtechceu/gtceu/core/mixins/ftbchunks/LargeMapScreenMixin.java
+++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/ftbchunks/LargeMapScreenMixin.java
@@ -33,7 +33,7 @@ public abstract class LargeMapScreenMixin extends BaseScreen {
     private void gtceu$injectAddWidgets(CallbackInfo ci) {
         if (!ConfigHolder.INSTANCE.compat.minimap.toggle.ftbChunksIntegration) return;
         gtceu$injectedWidgets.clear();
-        var prefix = "gtceu.button.";
+        var prefix = "button.gtceu.";
         for (var button : ButtonState.getAllButtons()) {
             var icon = switch (button.name) {
                 case "ore_veins" -> ItemIcon.getItemIcon(Items.RAW_IRON);
diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java
index 570bd08b425..5c4af9254e9 100644
--- a/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java
+++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ArmorLang.java
@@ -48,9 +48,9 @@ private static void generateArmorMessageKeys(GTLangProvider provider) {
         provider.add("armor.gtceu.jetpack.emergency_hover_mode", "§aEmergency Hover Mode Enabled!");
 
         // Night Vision Goggles
-        provider.add("armor.gtceu.message.nightvision.enabled", "§7NightVision: §aOn");
-        provider.add("armor.gtceu.message.nightvision.disabled", "§7NightVision: §cOff");
-        provider.add("armor.gtceu.message.nightvision.error", "§cNot enough power!");
+        provider.add("armor.gtceu.message.night_vision.enabled", "§7NightVision: §aOn");
+        provider.add("armor.gtceu.message.night_vision.disabled", "§7NightVision: §cOff");
+        provider.add("armor.gtceu.message.night_vision.error", "§7NightVision Goggles: §cNot enough power!");
     }
 
     private static void generateTooltipKeys(GTLangProvider provider) {
diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java
index 5f1511b7736..707a8edd0f8 100644
--- a/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java
+++ b/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java
@@ -11,8 +11,8 @@
 public class IntegrationLang {
 
     public static void init(GTLangProvider provider) {
-        initRecipeViewerLang(provider);
-        initWailaLikeLang(provider);
+        initRecipeViewerLang(provider); // TODO
+        initWailaLikeLang(provider); // TODO
         initMinimapLang(provider);
         initOwnershipLang(provider);
 
@@ -238,7 +238,7 @@ private static void initWailaLikeLang(GTLangProvider provider) {
 
     private static void initMinimapLang(GTLangProvider provider) {
         // Tooltip/Name
-        provider.add("gtceu.minimap.ore_vein.depleted", "Depleted");
+        provider.add("minimap.gtceu.ore_vein.depleted", "Depleted");
 
         // Chat Messages
         provider.add("message.gtceu.new_veins.amount", "Prospected %d new veins!");
@@ -253,16 +253,16 @@ private static void initMinimapLang(GTLangProvider provider) {
         // Buttons
         provider.add("button.gtceu.mark_as_depleted.name", "Mark as Depleted");
         provider.add("button.gtceu.toggle_waypoint.name", "Toggle Waypoint");
-        provider.add("gtceu.button.ore_veins", "Show GT Ore Veins");
-        provider.add("gtceu.button.bedrock_fluids", "Show Bedrock Fluid Veins");
-        provider.add("gtceu.button.hide_depleted", "Hide Depleted Veins");
-        provider.add("gtceu.button.show_depleted", "Show Depleted Veins");
+        provider.add("button.gtceu.ore_veins", "Show GT Ore Veins");
+        provider.add("button.gtceu.bedrock_fluids", "Show Bedrock Fluid Veins");
+        provider.add("button.gtceu.hide_depleted", "Hide Depleted Veins");
+        provider.add("button.gtceu.show_depleted", "Show Depleted Veins");
     }
 
     private static void initOwnershipLang(GTLangProvider provider) {
         // Team Names
-        provider.add("gtceu.ownership.name.player", "Player");
-        provider.add("gtceu.ownership.name.ftb", "FTB Teams");
-        provider.add("gtceu.ownership.name.argonauts", "Argonauts Guild");
+        provider.add("ownership.gtceu.name.player", "Player");
+        provider.add("ownership.gtceu.name.ftb", "FTB Teams");
+        provider.add("ownership.gtceu.name.argonauts", "Argonauts Guild");
     }
 }
diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java
index a1d4c382bec..1ebb6110f1c 100644
--- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java
+++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java
@@ -29,7 +29,7 @@ public static void init(GTLangProvider provider) {
         CoverLang.init(provider); // TODO
         GUILang.init(provider); // TODO
         HazardLang.init(provider);
-        IntegrationLang.init(provider); // TODO
+        IntegrationLang.init(provider);
         ItemLang.init(provider); // TODO
         MachineLang.init(provider); // TODO
         MaterialLang.init(provider); // TODO
diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java
index 3462d707b28..b584f672cd7 100644
--- a/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java
+++ b/src/main/java/com/gregtechceu/gtceu/data/lang/MaterialLang.java
@@ -21,88 +21,6 @@ public static void init(GTLangProvider provider) {
     }
 
     private static void generateCustomMaterialNames(GTLangProvider provider) {
-        /*
-         * provider.add(FullersEarth.getUnlocalizedName(), "Fuller's Earth");
-         * // greg's humor is now on 1.20.1...
-         * provider.add(Cooperite.getUnlocalizedName(), "Sheldonite");
-         * 
-         * provider.add(HSSG.getUnlocalizedName(), "HSS-G");
-         * provider.add(HSSE.getUnlocalizedName(), "HSS-E");
-         * provider.add(HSSS.getUnlocalizedName(), "HSS-S");
-         * provider.add(RTMAlloy.getUnlocalizedName(), "RTM Alloy");
-         * provider.add(HSLASteel.getUnlocalizedName(), "HSLA Steel");
-         * 
-         * provider.add(UUMatter.getUnlocalizedName(), "UU-Matter");
-         * provider.add(PCBCoolant.getUnlocalizedName(), "PCB Coolant");
-         * provider.add(TungstenSteel.getUnlocalizedName(), "Tungstensteel");
-         * 
-         * provider.add(Iron3Chloride.getUnlocalizedName(), "Iron III Chloride");
-         * provider.add(Iron2Chloride.getUnlocalizedName(), "Iron II Chloride");
-         * 
-         * provider.add(OilHeavy.getUnlocalizedName(), "Heavy Oil");
-         * provider.add("block.gtceu.oil_heavy", "Heavy Oil");
-         * provider.add(OilLight.getUnlocalizedName(), "Light Oil");
-         * provider.add("block.gtceu.oil_light", "Light Oil");
-         * provider.add(RawOil.getUnlocalizedName(), "Raw Oil");
-         * provider.add("block.gtceu.oil_medium", "Raw Oil");
-         * 
-         * provider.add(HydroCrackedButadiene.getUnlocalizedName(), "Hydro-Cracked Butadiene");
-         * provider.add(HydroCrackedButane.getUnlocalizedName(), "Hydro-Cracked Butane");
-         * provider.add(HydroCrackedButene.getUnlocalizedName(), "Hydro-Cracked Butene");
-         * provider.add(HydroCrackedButene.getUnlocalizedName(), "Hydro-Cracked Butene");
-         * provider.add(HydroCrackedEthane.getUnlocalizedName(), "Hydro-Cracked Ethane");
-         * provider.add(HydroCrackedEthylene.getUnlocalizedName(), "Hydro-Cracked Ethylene");
-         * provider.add(HydroCrackedPropane.getUnlocalizedName(), "Hydro-Cracked Propane");
-         * provider.add(HydroCrackedPropene.getUnlocalizedName(), "Hydro-Cracked Propene");
-         * 
-         * provider.add(SteamCrackedButadiene.getUnlocalizedName(), "Steam-Cracked Butadiene");
-         * provider.add(SteamCrackedButane.getUnlocalizedName(), "Steam-Cracked Butane");
-         * provider.add(SteamCrackedButene.getUnlocalizedName(), "Steam-Cracked Butene");
-         * provider.add(SteamCrackedButene.getUnlocalizedName(), "Steam-Cracked Butene");
-         * provider.add(SteamCrackedEthane.getUnlocalizedName(), "Steam-Cracked Ethane");
-         * provider.add(SteamCrackedEthylene.getUnlocalizedName(), "Steam-Cracked Ethylene");
-         * provider.add(SteamCrackedPropane.getUnlocalizedName(), "Steam-Cracked Propane");
-         * provider.add(SteamCrackedPropene.getUnlocalizedName(), "Steam-Cracked Propene");
-         * 
-         * provider.add(LightlyHydroCrackedGas.getUnlocalizedName(), "Lightly Hydro-Cracked Gas");
-         * provider.add(LightlyHydroCrackedHeavyFuel.getUnlocalizedName(),
-         * "Lightly Hydro-Cracked Heavy Fuel");
-         * provider.add(LightlyHydroCrackedLightFuel.getUnlocalizedName(),
-         * "Lightly Hydro-Cracked Light Fuel");
-         * provider.add(LightlyHydroCrackedNaphtha.getUnlocalizedName(),
-         * "Lightly Hydro-Cracked Naphtha");
-         * provider.add(LightlySteamCrackedGas.getUnlocalizedName(), "Lightly Steam-Cracked Gas");
-         * provider.add(LightlySteamCrackedHeavyFuel.getUnlocalizedName(),
-         * "Lightly Steam-Cracked Heavy Fuel");
-         * provider.add(LightlySteamCrackedLightFuel.getUnlocalizedName(),
-         * "Lightly Steam-Cracked Light Fuel");
-         * provider.add(LightlySteamCrackedNaphtha.getUnlocalizedName(),
-         * "Lightly Steam-Cracked Naphtha");
-         * 
-         * provider.add(SeverelyHydroCrackedGas.getUnlocalizedName(),
-         * "Severely Hydro-Cracked Gas");
-         * provider.add(SeverelyHydroCrackedHeavyFuel.getUnlocalizedName(),
-         * "Severely Hydro-Cracked Heavy Fuel");
-         * provider.add(SeverelyHydroCrackedLightFuel.getUnlocalizedName(),
-         * "Severely Hydro-Cracked Light Fuel");
-         * provider.add(SeverelyHydroCrackedNaphtha.getUnlocalizedName(),
-         * "Severely Hydro-Cracked Naphtha");
-         * provider.add(SeverelySteamCrackedGas.getUnlocalizedName(),
-         * "Severely Steam-Cracked Gas");
-         * provider.add(SeverelySteamCrackedHeavyFuel.getUnlocalizedName(),
-         * "Severely Steam-Cracked Heavy Fuel");
-         * provider.add(SeverelySteamCrackedLightFuel.getUnlocalizedName(),
-         * "Severely Steam-Cracked Light Fuel");
-         * provider.add(SeverelySteamCrackedNaphtha.getUnlocalizedName(),
-         * "Severely Steam-Cracked Naphtha");
-         * provider.add(LPG.getUnlocalizedName(), "LPG");
-         * 
-         * provider.add(Zeron100.getUnlocalizedName(), "Zeron-100");
-         * provider.add(IncoloyMA956.getUnlocalizedName(), "Incoloy MA-956");
-         * provider.add(Stellite100.getUnlocalizedName(), "Stellite-100");
-         * provider.add(HastelloyC276.getUnlocalizedName(), "Hastelloy C-276");
-         */
-
         provider.add("item.gtceu.nether_quartz_netherrack", "Nether Quartz Ore");
     }
 
diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/cache/client/GTClientCache.java b/src/main/java/com/gregtechceu/gtceu/integration/map/cache/client/GTClientCache.java
index fcee40600f4..d7d530770f6 100644
--- a/src/main/java/com/gregtechceu/gtceu/integration/map/cache/client/GTClientCache.java
+++ b/src/main/java/com/gregtechceu/gtceu/integration/map/cache/client/GTClientCache.java
@@ -32,7 +32,7 @@ public void notifyNewVeins(GeneratedVeinMetadata... veins) {
         LocalPlayer player = Minecraft.getInstance().player;
 
         if (player == null) return;
-
+        if (veins.length > 1) player.sendSystemMessage(Component.translatable("message.gtceu.new_veins.amount", veins.length));
         for (var vein : veins) {
             var veinId = vein.id().toString();
             var name = Component.translatable(veinId.replace("gtceu:", "gtceu.jei.ore_vein."));
diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/veins/ore/OreVeinIcon.java b/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/veins/ore/OreVeinIcon.java
index c6cd4331c23..be8086e752c 100644
--- a/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/veins/ore/OreVeinIcon.java
+++ b/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/veins/ore/OreVeinIcon.java
@@ -86,7 +86,7 @@ public boolean onMousePressed(BaseScreen baseScreen, MouseButton mouseButton) {
     private void openContextMenu(LargeMapScreen screen) {
         var title = Component.literal(getName());
         if (veinMetadata.depleted()) {
-            title.append(" (").append(Component.translatable("gtceu.minimap.ore_vein.depleted")).append(")");
+            title.append(" (").append(Component.translatable("minimap.gtceu.ore_vein.depleted")).append(")");
         }
         var markDepleted = new ContextMenuItem(Component.translatable("button.gtceu.mark_as_depleted.name"),
                 Icons.REMOVE,
diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/layer/builtin/OreRenderLayer.java b/src/main/java/com/gregtechceu/gtceu/integration/map/layer/builtin/OreRenderLayer.java
index 31237f97976..18ee33cad91 100644
--- a/src/main/java/com/gregtechceu/gtceu/integration/map/layer/builtin/OreRenderLayer.java
+++ b/src/main/java/com/gregtechceu/gtceu/integration/map/layer/builtin/OreRenderLayer.java
@@ -36,7 +36,7 @@ public static MutableComponent getName(GeneratedVeinMetadata vein) {
         // noinspection ConstantValue IDK, it crashed
         if (vein == null || vein.definition() == null ||
                 ClientProxy.CLIENT_ORE_VEINS.inverse().get(vein.definition()) == null) {
-            return Component.translatable("gtceu.minimap.ore_vein.depleted");
+            return Component.translatable("minimap.gtceu.ore_vein.depleted");
         }
         return Component.translatable("gtceu.jei.ore_vein." + GTOreVeinWidget.getOreName(vein.definition()));
     }
@@ -62,7 +62,7 @@ public static List getTooltip(String name, GeneratedVeinMetadata vein
         final List tooltip = new ArrayList<>();
         var title = Component.literal(name);
         if (vein.depleted()) {
-            title.append(" (").append(Component.translatable("gtceu.minimap.ore_vein.depleted")).append(")");
+            title.append(" (").append(Component.translatable("minimap.gtceu.ore_vein.depleted")).append(")");
         }
         tooltip.add(title);
 

From 410a8caf31c8ca3f2d06dfeec66920811f6eb11d Mon Sep 17 00:00:00 2001
From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com>
Date: Wed, 10 Jun 2026 14:31:43 -0600
Subject: [PATCH 36/45] more cleanup 2

---
 .../resources/assets/gtceu/lang/en_us.json      |  5 ++---
 .../com/gregtechceu/gtceu/api/item/IGTTool.java | 17 +++++++----------
 .../gregtechceu/gtceu/api/sound/SoundEntry.java |  2 +-
 .../gtceu/common/item/armor/IJetpack.java       |  1 +
 .../gtceu/data/lang/LangHandler.java            |  2 +-
 .../gregtechceu/gtceu/data/lang/ToolLang.java   |  6 +++---
 6 files changed, 15 insertions(+), 18 deletions(-)

diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json
index 6a0f5dedce5..d9a2d33eaee 100644
--- a/src/generated/resources/assets/gtceu/lang/en_us.json
+++ b/src/generated/resources/assets/gtceu/lang/en_us.json
@@ -3988,7 +3988,7 @@
   "item.gtceu.tool.behavior.shield_disable": "§cBrute: §fDisables Shields",
   "item.gtceu.tool.behavior.silk_ice": "§bIce Cutter: §fSilk Harvests Ice",
   "item.gtceu.tool.behavior.strip_log": "§5Artisan: §fStrips Logs",
-  "item.gtceu.tool.behavior.torch_place": "§eSpelunker: §fPlaces Torches on Right-Click",
+  "item.gtceu.tool.behavior.torch_place": "§eSpelunker: §fPlaces Torches on RIGHT CLICK",
   "item.gtceu.tool.behavior.tree_felling": "§4Lumberjack: §fTree Felling",
   "item.gtceu.tool.butchery_knife": "%s Butchery Knife",
   "item.gtceu.tool.butchery_knife.tooltip": "§8Has a slow Attack Rate",
@@ -5859,7 +5859,7 @@
   "tool.gtceu.tooltip.attack_damage": "%s §cAttack Damage",
   "tool.gtceu.tooltip.attack_speed": "%s §9Attack Speed",
   "tool.gtceu.tooltip.crafting_uses": "%s §aCrafting Uses",
-  "tool.gtceu.tooltip.general_uses": "%s §bDurability",
+  "tool.gtceu.tooltip.general_uses": "%s/%s §bDurability",
   "tool.gtceu.tooltip.harvest_level": "§eHarvest Level %s",
   "tool.gtceu.tooltip.harvest_level_extra": "§eHarvest Level %s §f(%s§f)",
   "tool.gtceu.tooltip.harvest_level_name.0": "§8Wood",
@@ -5869,7 +5869,6 @@
   "tool.gtceu.tooltip.harvest_level_name.4": "§dNetherite",
   "tool.gtceu.tooltip.harvest_level_name.5": "§9Duranium",
   "tool.gtceu.tooltip.harvest_level_name.6": "§cNeutronium",
-  "tool.gtceu.tooltip.max_uses": "%s §eTotal Durability",
   "tool.gtceu.tooltip.mining_speed": "%s §dMining Speed",
   "tool.gtceu.tooltip.repair_material": "§8Repair with: §f§a%s",
   "tool.gtceu.tooltip.replace_tool_head": "Craft with a new Tool Head to replace it",
diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java b/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java
index bf04320722e..5cb663161af 100644
--- a/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java
+++ b/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java
@@ -688,10 +688,10 @@ default Map getDefaultEnchantments(ItemStack stack) {
                 tooltip.add(Component.translatable("tool.gtceu.tooltip.crafting_uses", FormattingUtil
                         .formatNumbers(damageRemaining / Math.max(1, toolStats.getToolDamagePerCraft(stack)))));
             }
-            tooltip.add(Component.translatable("tool.gtceu.tooltip.max_uses",
-                    FormattingUtil.formatNumbers(tool.getTotalMaxDurability(stack))));
+            //tooltip.add(Component.translatable("tool.gtceu.tooltip.max_uses",
+            //        FormattingUtil.formatNumbers(tool.getTotalMaxDurability(stack))));
             tooltip.add(Component.translatable("tool.gtceu.tooltip.general_uses",
-                    FormattingUtil.formatNumbers(damageRemaining)));
+                    FormattingUtil.formatNumbers(damageRemaining), FormattingUtil.formatNumbers(tool.getTotalMaxDurability(stack) + 1)));
 
         }
 
@@ -743,13 +743,9 @@ default Map getDefaultEnchantments(ItemStack stack) {
         toolStats.getBehaviors().forEach(behavior -> behavior.addInformation(stack, world, tooltip, flag));
 
         // unique tooltip
-        String uniqueTooltip = this.getToolType().getUnlocalizedName() + ".tooltip";
-        if (Language.getInstance().has(uniqueTooltip)) {
-            tooltip.add(CommonComponents.EMPTY);
-            tooltip.add(Component.translatable(uniqueTooltip));
-        }
 
-        tooltip.add(CommonComponents.EMPTY);
+
+
 
         var defaultEnchants = getDefaultEnchantments(stack);
         if (!defaultEnchants.isEmpty()) {
@@ -760,9 +756,10 @@ default Map getDefaultEnchantments(ItemStack stack) {
 
                 tooltip.add(enchant.getFullname(entry.getValue()));
             }
+            tooltip.add(CommonComponents.EMPTY);
         }
 
-        tooltip.add(CommonComponents.EMPTY);
+
 
         // valid tools
         tooltip.add(Component.translatable("tool.gtceu.tooltip.usable_as",
diff --git a/src/main/java/com/gregtechceu/gtceu/api/sound/SoundEntry.java b/src/main/java/com/gregtechceu/gtceu/api/sound/SoundEntry.java
index 31a1dcd0fda..8cc22ab0e0d 100644
--- a/src/main/java/com/gregtechceu/gtceu/api/sound/SoundEntry.java
+++ b/src/main/java/com/gregtechceu/gtceu/api/sound/SoundEntry.java
@@ -41,7 +41,7 @@ public SoundEntry(ResourceLocation id, String subtitle, SoundSource category, in
     public abstract SoundEvent getMainEvent();
 
     public String getSubtitleKey() {
-        return id.getNamespace() + ".subtitle." + id.getPath();
+        return "subtitles." + id.getNamespace() + "." + id.getPath();
     }
 
     public ResourceLocation getId() {
diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/armor/IJetpack.java b/src/main/java/com/gregtechceu/gtceu/common/item/armor/IJetpack.java
index f2269199233..c3336249f5f 100644
--- a/src/main/java/com/gregtechceu/gtceu/common/item/armor/IJetpack.java
+++ b/src/main/java/com/gregtechceu/gtceu/common/item/armor/IJetpack.java
@@ -150,6 +150,7 @@ default void performFlying(@NotNull Player player, boolean flightEnabled, boolea
                         .round(getEnergyPerUse() * (player.isSprinting() ? getSprintEnergyModifier() : 1));
                 drainEnergy(stack, energyUsed);
                 ArmorUtils.spawnParticle(player.level(), player, getParticle(), -0.6D);
+                ArmorUtils.playJetpackSound(player);
             }
 
             // ensure that the player is actually using the jetpack to cancel fall damage
diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java
index 1ebb6110f1c..3b7651db98d 100644
--- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java
+++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java
@@ -34,7 +34,7 @@ public static void init(GTLangProvider provider) {
         MachineLang.init(provider); // TODO
         MaterialLang.init(provider); // TODO
         RecipeLang.init(provider); // TODO
-        SubtitleLang.init(provider); // TODO
+        SubtitleLang.init(provider);
         ToolLang.init(provider); // TODO
     }
 }
diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java
index 1d593b337c8..50478303b35 100644
--- a/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java
+++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ToolLang.java
@@ -84,7 +84,7 @@ public static void generateToolClassKeys(GTLangProvider provider) {
     public static void generateBehaviorKeys(GTLangProvider provider) {
         // Generic Tool Behaviors
         provider.add("item.gtceu.tool.behavior.silk_ice", "§bIce Cutter: §fSilk Harvests Ice");
-        provider.add("item.gtceu.tool.behavior.torch_place", "§eSpelunker: §fPlaces Torches on Right-Click");
+        provider.add("item.gtceu.tool.behavior.torch_place", "§eSpelunker: §fPlaces Torches on RIGHT CLICK");
         provider.add("item.gtceu.tool.behavior.tree_felling", "§4Lumberjack: §fTree Felling");
         provider.add("item.gtceu.tool.behavior.strip_log", "§5Artisan: §fStrips Logs");
         provider.add("item.gtceu.tool.behavior.scrape", "§bPolisher: §fRemoves Oxidation");
@@ -194,8 +194,8 @@ public static void generateTooltips(GTLangProvider provider) {
 
         // Tool Stats Tooltips
         provider.add("tool.gtceu.tooltip.crafting_uses", "%s §aCrafting Uses");
-        provider.add("tool.gtceu.tooltip.max_uses", "%s §eTotal Durability");
-        provider.add("tool.gtceu.tooltip.general_uses", "%s §bDurability");
+        // provider.add("tool.gtceu.tooltip.max_uses", "%s §eTotal Durability");
+        provider.add("tool.gtceu.tooltip.general_uses", "%s / %s §bDurability");
         provider.add("tool.gtceu.tooltip.attack_damage", "%s §cAttack Damage");
         provider.add("tool.gtceu.tooltip.attack_speed", "%s §9Attack Speed");
         provider.add("tool.gtceu.tooltip.mining_speed", "%s §dMining Speed");

From f04da06c3d08ac6ade4b243f82e6e54f48322bf9 Mon Sep 17 00:00:00 2001
From: Gustavo <77560533+gustovafing@users.noreply.github.com>
Date: Wed, 22 Jul 2026 17:52:15 +1000
Subject: [PATCH 37/45] Merge 1.20.1 into lang refacotr (#5166)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Co-authored-by: Jurre Groenendijk 
Co-authored-by: screret <68943070+screret@users.noreply.github.com>
Co-authored-by: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com>
Co-authored-by: YoungOnionMC 
Co-authored-by: Spicierspace153 <21964509+Spicierspace153@users.noreply.github.com>
Co-authored-by: NegaNote 
Co-authored-by: TechLord22 <37029404+TechLord22@users.noreply.github.com>
Co-authored-by: Ghostipedia / Caitlynn <46772882+Ghostipedia@users.noreply.github.com>
Co-authored-by: zetrock1 <144679746+zetrock1@users.noreply.github.com>
Co-authored-by: Ghzdude <44148655+ghzdude@users.noreply.github.com>
Co-authored-by: PureBluez 
Co-authored-by: brachy <45517902+brachy84@users.noreply.github.com>
Co-authored-by: Tar Laboratories <159147059+TarLaboratories@users.noreply.github.com>
Co-authored-by: Phoenixvine <82596737+Phoenixvine32908@users.noreply.github.com>
Co-authored-by: Bernd <133775547+bernd-sbr@users.noreply.github.com>
Co-authored-by: Mqrius 
Co-authored-by: Maya <10861407+serenibyss@users.noreply.github.com>
Co-authored-by: Vertyx 
Co-authored-by: GreenSkiy <162062941+GreenSkiy@users.noreply.github.com>
Co-authored-by: carbonatek <78877330+carbonatek@users.noreply.github.com>
Co-authored-by: htmlcsjs <46023024+htmlcsjs@users.noreply.github.com>
Co-authored-by: 暮心 <97760035+MuuuShin@users.noreply.github.com>
Co-authored-by: DilithiumThoride 
Co-authored-by: dirtcakemc <263226911+dirtcakemc@users.noreply.github.com>
Co-authored-by: 楓 
Co-authored-by: n1xx1 
Co-authored-by: TonyCrane 
Co-authored-by: TarLaboratories 
Co-authored-by: Oktawia <62563806+GilbertzRivi@users.noreply.github.com>
Co-authored-by: Karthi <75553966+JuiceyBeans@users.noreply.github.com>
Co-authored-by: Ghostipedia 
Co-authored-by: Vykonn <79595583+Vykonn@users.noreply.github.com>
Co-authored-by: Jambon123 <68718646+Jambon123@users.noreply.github.com>
Co-authored-by: lolmat13 
Co-authored-by: Reabstraction <107948697+Reabstraction@users.noreply.github.com>
---
 .github/pull_request_template.md              |  23 +-
 .../workflows/log-commits-version-sync.yml    | 122 +++
 .gitignore                                    |   1 +
 AI_POLICY.md                                  |  59 ++
 dependencies.gradle                           |  23 +-
 .../Migrating-From-LDLib-SyncData.md          |   3 +-
 .../Development/Data-Sync-System/Usage.md     |  48 +-
 .../MUI2/Layout_MainAxisAlignments.png        | Bin 0 -> 15105 bytes
 .../Development/MUI2/Syncing/Sync-Basics.md   | 271 ++++++
 .../Development/MUI2/Syncing/Sync-Handlers.md |  94 ++
 .../MUI2/Syncing/Synced-Actions.md            |  50 ++
 .../content/Development/MUI2/Syncing/index.md |   1 +
 docs/content/Development/MUI2/Test-Machine.md |  35 +
 .../content/Development/MUI2/Widget-Layout.md | 189 ++++
 docs/content/Development/MUI2/index.md        |   5 +
 .../Recipe-Logic/Custom-Ingredient.md         |  41 +-
 docs/content/Modpacks/.pages                  |   2 +
 docs/content/Modpacks/Changes/v8.0.0.md       |  50 +-
 .../Examples/Custom-Recipe-Condition.md       |   5 +
 .../Examples/Example_Coil_Multiblock.md       | 102 +++
 .../Examples/Example_Steam_Multiblock.md      |  87 ++
 .../Modpacks/Examples/Example_Turbine.md      |  94 ++
 docs/content/Modpacks/Examples/Greenhouse.md  |   0
 .../Examples/Multiblocks/Greenhouse.md        |   2 +-
 .../Modpacks/Examples/Parallel-Hatch-Part.md  |   2 +-
 .../Modifying-Existing-Materials.md           |  71 +-
 ...Prefixes-and-the-power-of-.setIgnored().md |  22 +
 .../Modpacks/Multiblocks/PartAbility.md       |  19 +
 .../Modpacks/Multiblocks/PatternError.md      |  56 ++
 docs/content/Modpacks/Multiblocks/Patterns.md |  47 +
 .../Modpacks/Multiblocks/Predicates.md        | 131 +++
 .../Modpacks/Multiblocks/StructureChecking.md | 109 +++
 .../Ore-Generation/Bedrock-Fluid-Veins.md     | 121 ++-
 .../Ore-Generation/Bedrock-Ore-Veins.md       | 128 ++-
 .../Other-Topics/Connected-Textures.md        |  63 ++
 .../Modpacks/Other-Topics/Dimension-Icons.md  |  60 ++
 .../Modpacks/Other-Topics/Dynamic-Renders.md  | 121 +++
 gradle/forge.versions.toml                    |  15 +-
 gradle/libs.versions.toml                     |   2 +
 gradle/scripts/moddevgradle.gradle            |   6 +
 gradle/scripts/repositories.gradle            |  18 +-
 gradle/scripts/resources.gradle               |   1 -
 injected_interfaces/interfaces.json           |   8 +-
 .../gtceu/blockstates/active_transformer.json |  68 +-
 .../gtceu/blockstates/advanced_monitor.json   |  68 +-
 .../blockstates/alloy_blast_smelter.json      |  68 +-
 .../gtceu/blockstates/assembly_line.json      |  68 +-
 .../blockstates/bronze_multiblock_tank.json   |  68 +-
 .../gtceu/blockstates/central_monitor.json    |  68 +-
 .../assets/gtceu/blockstates/coke_oven.json   |  68 +-
 .../assets/gtceu/blockstates/cracker.json     |  68 +-
 .../gtceu/blockstates/creative_chest.json     |  68 +-
 .../gtceu/blockstates/creative_tank.json      |  68 +-
 .../assets/gtceu/blockstates/ctm_test.json    |   7 +
 .../assets/gtceu/blockstates/data_bank.json   |  56 +-
 .../blockstates/electric_blast_furnace.json   |  68 +-
 .../blockstates/ev_bedrock_ore_miner.json     |  56 +-
 .../blockstates/ev_fluid_drilling_rig.json    |  68 +-
 .../gtceu/blockstates/ev_large_miner.json     |  56 +-
 .../gtceu/blockstates/ev_super_chest.json     |  68 +-
 .../gtceu/blockstates/ev_super_tank.json      |  68 +-
 .../extreme_combustion_engine.json            |  68 +-
 .../gtceu/blockstates/gas_large_turbine.json  |  68 +-
 .../high_performance_computation_array.json   |  56 +-
 .../blockstates/hv_bedrock_ore_miner.json     |  56 +-
 .../blockstates/hv_fluid_drilling_rig.json    |  68 +-
 .../gtceu/blockstates/hv_super_chest.json     |  68 +-
 .../gtceu/blockstates/hv_super_tank.json      |  68 +-
 .../blockstates/implosion_compressor.json     |  68 +-
 .../gtceu/blockstates/iv_large_miner.json     |  56 +-
 .../gtceu/blockstates/iv_quantum_chest.json   |  68 +-
 .../gtceu/blockstates/iv_quantum_tank.json    |  68 +-
 .../gtceu/blockstates/large_arc_smelter.json  |  68 +-
 .../gtceu/blockstates/large_assembler.json    |  68 +-
 .../gtceu/blockstates/large_autoclave.json    |  68 +-
 .../gtceu/blockstates/large_brewer.json       |  68 +-
 .../gtceu/blockstates/large_centrifuge.json   |  68 +-
 .../blockstates/large_chemical_bath.json      |  68 +-
 .../blockstates/large_chemical_reactor.json   |  68 +-
 .../blockstates/large_circuit_assembler.json  |  68 +-
 .../blockstates/large_combustion_engine.json  |  68 +-
 .../gtceu/blockstates/large_cutter.json       |  68 +-
 .../gtceu/blockstates/large_electrolyzer.json |  68 +-
 .../blockstates/large_electromagnet.json      |  68 +-
 .../blockstates/large_engraving_laser.json    |  68 +-
 .../gtceu/blockstates/large_extractor.json    |  68 +-
 .../gtceu/blockstates/large_extruder.json     |  68 +-
 .../blockstates/large_maceration_tower.json   |  68 +-
 .../blockstates/large_material_press.json     |  68 +-
 .../assets/gtceu/blockstates/large_mixer.json |  68 +-
 .../gtceu/blockstates/large_packer.json       |  68 +-
 .../blockstates/large_sifting_funnel.json     |  68 +-
 .../gtceu/blockstates/large_solidifier.json   |  68 +-
 .../gtceu/blockstates/large_wiremill.json     |  68 +-
 .../gtceu/blockstates/luv_fusion_reactor.json |  68 +-
 .../gtceu/blockstates/luv_large_miner.json    |  56 +-
 .../gtceu/blockstates/luv_quantum_chest.json  |  68 +-
 .../gtceu/blockstates/luv_quantum_tank.json   |  68 +-
 .../gtceu/blockstates/lv_super_chest.json     |  68 +-
 .../gtceu/blockstates/lv_super_tank.json      |  68 +-
 .../gtceu/blockstates/mega_blast_furnace.json |  68 +-
 .../blockstates/mega_vacuum_freezer.json      |  68 +-
 .../gtceu/blockstates/multi_smelter.json      |  68 +-
 .../blockstates/mv_bedrock_ore_miner.json     |  56 +-
 .../blockstates/mv_fluid_drilling_rig.json    |  68 +-
 .../gtceu/blockstates/mv_super_chest.json     |  68 +-
 .../gtceu/blockstates/mv_super_tank.json      |  68 +-
 .../gtceu/blockstates/network_switch.json     |  56 +-
 .../gtceu/blockstates/opv_quantum_chest.json  |  68 +-
 .../gtceu/blockstates/opv_quantum_tank.json   |  68 +-
 .../blockstates/plasma_large_turbine.json     |  68 +-
 .../gtceu/blockstates/power_substation.json   |  68 +-
 .../blockstates/primitive_blast_furnace.json  |  68 +-
 .../gtceu/blockstates/pyrolyse_oven.json      |  68 +-
 .../gtceu/blockstates/research_station.json   |  56 +-
 .../gtceu/blockstates/steam_grinder.json      |  68 +-
 .../blockstates/steam_large_turbine.json      |  68 +-
 .../assets/gtceu/blockstates/steam_oven.json  |  68 +-
 .../blockstates/steel_multiblock_tank.json    |  68 +-
 .../assets/gtceu/blockstates/test_mui.json    |  28 +
 .../gtceu/blockstates/uev_quantum_chest.json  |  68 +-
 .../gtceu/blockstates/uev_quantum_tank.json   |  68 +-
 .../gtceu/blockstates/uhv_quantum_chest.json  |  68 +-
 .../gtceu/blockstates/uhv_quantum_tank.json   |  68 +-
 .../gtceu/blockstates/uiv_quantum_chest.json  |  68 +-
 .../gtceu/blockstates/uiv_quantum_tank.json   |  68 +-
 .../gtceu/blockstates/uv_fusion_reactor.json  |  68 +-
 .../gtceu/blockstates/uv_quantum_chest.json   |  68 +-
 .../gtceu/blockstates/uv_quantum_tank.json    |  68 +-
 .../gtceu/blockstates/uxv_quantum_chest.json  |  68 +-
 .../gtceu/blockstates/uxv_quantum_tank.json   |  68 +-
 .../gtceu/blockstates/vacuum_freezer.json     |  68 +-
 .../blockstates/wooden_multiblock_tank.json   |  68 +-
 .../gtceu/blockstates/zpm_fusion_reactor.json |  68 +-
 .../gtceu/blockstates/zpm_quantum_chest.json  |  68 +-
 .../gtceu/blockstates/zpm_quantum_tank.json   |  68 +-
 .../resources/assets/gtceu/lang/en_us.json    | 385 +++++----
 .../assets/gtceu/models/block/ctm_test.json   |   6 +
 .../block/machine/me_stocking_input_bus.json  |  12 +-
 .../machine/me_stocking_input_hatch.json      |  12 +-
 .../gtceu/models/block/machine/test_mui.json  |  18 +
 .../block/pipe/huge_duct_pipe/connection.json |   4 -
 .../pipe/large_duct_pipe/connection.json      |   4 -
 .../pipe/normal_duct_pipe/connection.json     |   4 -
 .../pipe/normal_laser_pipe/connection.json    |   4 -
 .../normal_laser_pipe/connection_active.json  |   4 -
 .../pipe/normal_optical_pipe/connection.json  |   4 -
 .../connection_active.json                    |   4 -
 .../pipe/small_duct_pipe/connection.json      |   4 -
 .../assets/gtceu/models/item/ctm_test.json    |   3 +
 .../assets/gtceu/models/item/gui_module.json  |   6 +
 .../gtceu/models/item/huge_duct_pipe.json     |   5 +-
 .../gtceu/models/item/large_duct_pipe.json    |   5 +-
 .../gtceu/models/item/normal_duct_pipe.json   |   5 +-
 .../gtceu/models/item/normal_laser_pipe.json  |   9 +-
 .../models/item/normal_optical_pipe.json      |   9 +-
 .../gtceu/models/item/small_duct_pipe.json    |   5 +-
 .../assets/gtceu/models/item/test_mui.json    |   3 +
 .../forge/tags/blocks/mineable/shears.json    |  22 +
 .../tags/blocks/mineable/pickaxe.json         |  32 +
 .../minecraft/tags/items/music_discs.json     |   5 +
 .../java/com/gregtechceu/gtceu/GTCEu.java     |  19 +-
 .../com/gregtechceu/gtceu/api/GTCEuAPI.java   |   3 -
 .../com/gregtechceu/gtceu/api/GTValues.java   |  12 +-
 .../gregtechceu/gtceu/api/addon/IGTAddon.java |  37 +-
 .../api/addon/events/KJSRecipeKeyEvent.java   |   5 +-
 .../events/MaterialCasingCollectionEvent.java |   4 +-
 .../gtceu/api/block/ActiveBlock.java          |   4 +-
 .../gtceu/api/block/ICoilType.java            |  10 +
 .../gtceu/api/block/MetaMachineBlock.java     | 113 +--
 .../gtceu/api/block/PipeBlock.java            |  22 +-
 .../api/block/RendererMaterialBlock.java      |  31 -
 .../property/GTBlockStateProperties.java      |   3 +-
 .../gtceu/api/blockentity/ICopyable.java      |   4 +-
 .../api/blockentity/IGregtechBlockEntity.java |   2 +-
 .../api/blockentity/PipeBlockEntity.java      |  54 +-
 .../gtceu/api/capability/GTCapability.java    |   4 -
 .../api/capability/GTCapabilityHelper.java    |   6 -
 .../gtceu/api/capability/ICoverable.java      |  10 +-
 .../api/capability/IMonitorComponent.java     |   5 +-
 .../IOpticalComputationReceiver.java          |   2 +-
 .../recipe/BlockStateRecipeCapability.java    |   3 +-
 .../recipe/CWURecipeCapability.java           |  38 +-
 .../capability/recipe/EURecipeCapability.java |  28 +-
 .../recipe/FluidRecipeCapability.java         | 151 +---
 .../gtceu/api/capability/recipe/IO.java       |  35 +-
 .../recipe/IRecipeCapabilityHolder.java       |   2 +-
 .../api/capability/recipe/IRecipeHandler.java |   8 +-
 .../recipe/ItemRecipeCapability.java          | 202 +----
 .../capability/recipe/RecipeCapability.java   | 103 ++-
 .../gtceu/api/cover/CoverBehavior.java        |  36 +-
 .../gtceu/api/cover/IMuiCover.java            |  95 +++
 .../gregtechceu/gtceu/api/cover/IUICover.java |  49 --
 .../gtceu/api/cover/filter/Filter.java        |  32 +-
 .../gtceu/api/cover/filter/FilterHandler.java |  50 +-
 .../api/cover/filter/FilterHandlers.java      |  15 +-
 .../gtceu/api/cover/filter/FluidFilter.java   |  15 +-
 .../gtceu/api/cover/filter/ItemFilter.java    |  15 +-
 .../api/cover/filter/SimpleFluidFilter.java   |  94 +-
 .../api/cover/filter/SimpleItemFilter.java    | 114 ++-
 .../api/cover/filter/SmartItemFilter.java     |  83 +-
 .../gtceu/api/cover/filter/TagFilter.java     | 104 +--
 .../api/cover/filter/TagFluidFilter.java      |  16 +-
 .../gtceu/api/cover/filter/TagItemFilter.java |  16 +-
 .../api/data/chemical/ChemicalHelper.java     |   8 +-
 .../material/IMaterialRegistryManager.java    | 117 ---
 .../api/data/chemical/material/Material.java  |  35 +-
 .../material/event/MaterialRegistryEvent.java |  20 -
 .../material/info/MaterialIconSet.java        | 137 ++-
 .../material/info/MaterialIconType.java       |  79 +-
 .../properties/AlloyBlastProperty.java        |  40 +-
 .../material/properties/BlastProperty.java    |   6 +
 .../material/registry/MaterialRegistry.java   | 102 ++-
 .../gtceu/api/data/tag/TagPrefix.java         | 262 +++---
 .../api/data/worldgen/GTLayerPattern.java     |   4 +-
 .../api/data/worldgen/GTOreDefinition.java    |   2 +-
 .../api/data/worldgen/IWorldGenLayer.java     |   6 -
 .../data/worldgen/SimpleWorldGenLayer.java    |  17 +-
 .../api/data/worldgen/WorldGenLayers.java     |  76 +-
 .../data/worldgen/WorldGeneratorUtils.java    |  12 +-
 .../bedrockore/OreVeinWorldEntry.java         |   2 +-
 .../worldgen/bedrockore/WeightedMaterial.java |   4 +-
 .../worldgen/generator/VeinGenerator.java     |   2 +-
 .../indicators/SurfaceIndicatorGenerator.java |  10 +-
 .../generator/veins/ClassicVeinGenerator.java |   4 +-
 .../generator/veins/DikeVeinGenerator.java    |   4 +-
 .../generator/veins/GeodeVeinGenerator.java   |  14 +-
 .../veins/StandardVeinGenerator.java          |   4 +-
 .../generator/veins/VeinedVeinGenerator.java  |   4 +-
 .../api/data/worldgen/ores/OreGenerator.java  |   7 +-
 .../worldgen/ores/OreIndicatorPlacer.java     |   3 +-
 .../api/data/worldgen/ores/OrePlacer.java     |   8 +-
 .../gtceu/api/gui/GuiTextures.java            | 601 -------------
 .../gtceu/api/gui/SteamTexture.java           |  27 -
 .../gregtechceu/gtceu/api/gui/UITemplate.java |  31 -
 .../gtceu/api/gui/WidgetUtils.java            |  52 --
 .../api/gui/editor/EditableMachineUI.java     | 107 ---
 .../gtceu/api/gui/editor/EditableUI.java      |  39 -
 .../gtceu/api/gui/editor/GTUIEditor.java      |  20 -
 .../gtceu/api/gui/editor/IEditableUI.java     |  28 -
 .../api/gui/editor/MachineUIProject.java      | 155 ----
 .../api/gui/editor/RecipeTypeUIProject.java   | 154 ----
 .../gtceu/api/gui/editor/TemplateTab.java     |  13 -
 .../gtceu/api/gui/editor/UIMainPanel.java     |  44 -
 .../gtceu/api/gui/factory/CoverUIFactory.java |  54 --
 .../api/gui/factory/GTUIEditorFactory.java    |  52 --
 .../api/gui/factory/MachineUIFactory.java     |  48 --
 .../api/gui/fancy/ConfiguratorPanel.java      | 449 ----------
 .../api/gui/fancy/FancyMachineUIWidget.java   | 242 ------
 .../api/gui/fancy/IFancyConfigurator.java     |  32 -
 .../gui/fancy/IFancyConfiguratorButton.java   |  96 ---
 .../IFancyCustomClientActionHandler.java      |   8 -
 .../fancy/IFancyCustomMiddleClickAction.java  |  11 -
 .../fancy/IFancyCustomMouseWheelAction.java   |  14 -
 .../gtceu/api/gui/fancy/IFancyTooltip.java    |  53 --
 .../gtceu/api/gui/fancy/IFancyUIProvider.java |  78 --
 .../gtceu/api/gui/fancy/PageSwitcher.java     | 100 ---
 .../gtceu/api/gui/fancy/TabsWidget.java       | 261 ------
 .../gtceu/api/gui/fancy/TitleBarWidget.java   | 121 ---
 .../gtceu/api/gui/fancy/TooltipsPanel.java    |  72 --
 .../api/gui/fancy/VerticalTabsWidget.java     |  62 --
 .../gtceu/api/gui/misc/IGhostFluidTarget.java |  80 --
 .../gtceu/api/gui/misc/IGhostItemTarget.java  |  70 --
 .../gtceu/api/gui/misc/PacketProspecting.java |  46 -
 .../api/gui/texture/ProspectingTexture.java   | 209 -----
 .../api/gui/util/TimedProgressSupplier.java   |  37 -
 .../api/gui/widget/BlockableSlotWidget.java   |  67 --
 .../api/gui/widget/ColorBlockWidget.java      |  65 --
 .../gui/widget/ConfirmTextInputWidget.java    |  73 --
 .../api/gui/widget/CoverConfigurator.java     |  58 --
 .../api/gui/widget/DualProgressWidget.java    | 121 ---
 .../api/gui/widget/EnumSelectorWidget.java    | 134 ---
 .../gui/widget/ExtendedProgressWidget.java    |  88 --
 .../gui/widget/GhostCircuitSlotWidget.java    | 203 -----
 .../gtceu/api/gui/widget/IntInputWidget.java  |  88 --
 .../gtceu/api/gui/widget/LongInputWidget.java |  88 --
 .../api/gui/widget/NumberInputWidget.java     | 208 -----
 .../gui/widget/PatternPreviewSlotWidget.java  | 112 ---
 .../api/gui/widget/PatternPreviewWidget.java  | 513 -----------
 .../api/gui/widget/PhantomFluidWidget.java    | 268 ------
 .../api/gui/widget/PhantomSlotWidget.java     | 258 ------
 .../gui/widget/PredicatedButtonWidget.java    |  70 --
 .../api/gui/widget/PredicatedImageWidget.java |  69 --
 .../api/gui/widget/ProspectingMapWidget.java  | 371 --------
 .../widget/ScrollablePhantomFluidWidget.java  |  78 --
 .../gtceu/api/gui/widget/SlotWidget.java      | 429 ----------
 .../gtceu/api/gui/widget/TankWidget.java      | 720 ----------------
 .../api/gui/widget/ToggleButtonWidget.java    |  73 --
 .../CombinedDirectionalConfigurator.java      | 195 -----
 .../IDirectionalConfigHandler.java            |  50 --
 .../AutoOutputFluidConfigHandler.java         | 154 ----
 .../handlers/AutoOutputItemConfigHandler.java | 152 ----
 .../handlers/CoverableConfigHandler.java      | 218 -----
 .../gtceu/api/item/ComponentItem.java         |  56 +-
 .../gregtechceu/gtceu/api/item/IGTTool.java   | 105 ++-
 .../gtceu/api/item/MaterialBlockItem.java     |  18 +-
 .../api/item/component/ICustomRenderer.java   |  11 -
 .../api/item/component/IItemUIFactory.java    |  26 -
 .../item/component/IMonitorModuleItem.java    |  10 +-
 .../prospector/ProspectingUpdatePacket.java   |  56 ++
 .../component/prospector}/ProspectorMode.java | 258 +++---
 .../gtceu/api/item/tool/GTAxeItem.java        |   6 +
 .../gtceu/api/item/tool/GTHoeItem.java        |   6 +
 .../gtceu/api/item/tool/GTShovelItem.java     |   6 +
 .../gtceu/api/item/tool/GTSwordItem.java      |   6 +
 .../gtceu/api/item/tool/GTToolItem.java       |   6 +
 .../gtceu/api/item/tool/GTToolType.java       |   5 +-
 .../api/item/tool/IToolGridHighlight.java     |  12 +-
 .../gtceu/api/item/tool/ToolHelper.java       |  26 +-
 .../api/item/tool/behavior/IToolBehavior.java |  13 +
 .../item/tool/behavior/IToolUIBehavior.java   |  28 +-
 .../api/machine/MachineCoverContainer.java    |  13 +-
 .../gtceu/api/machine/MachineDefinition.java  |  51 +-
 .../api/machine/MachineInstanceFactory.java   |  39 +
 .../gtceu/api/machine/MetaMachine.java        | 419 +++++----
 .../machine/MultiblockMachineDefinition.java  |  44 +-
 .../api/machine/SimpleGeneratorMachine.java   |  80 +-
 .../api/machine/SimpleTieredMachine.java      | 268 +-----
 .../api/machine/TieredEnergyMachine.java      |  93 +-
 .../api/machine/WorkableTieredMachine.java    |  69 +-
 .../AutoStockingFancyConfigurator.java        |  53 --
 .../fancyconfigurator/ButtonConfigurator.java |  39 -
 .../CircuitFancyConfigurator.java             | 198 -----
 .../CombinedDirectionalFancyConfigurator.java | 110 ---
 .../FancyInvConfigurator.java                 |  68 --
 .../FancySelectorConfigurator.java            |  54 --
 .../FancyTankConfigurator.java                |  68 --
 .../MachineModeFancyConfigurator.java         | 102 ---
 .../api/machine/feature/IDropSaveMachine.java |  39 -
 .../api/machine/feature/IFancyUIMachine.java  | 152 ----
 .../api/machine/feature/IHasCircuitSlot.java  |  12 -
 .../api/machine/feature/IMachineFeature.java  |   3 +-
 .../api/machine/feature/IMuiMachine.java      |  59 ++
 .../machine/feature/IRecipeLogicMachine.java  |  94 +-
 .../gtceu/api/machine/feature/IUIMachine.java |  45 -
 .../gtceu/api/machine/feature/IVoidable.java  |  34 +-
 .../feature/multiblock/IDisplayUIMachine.java |  52 --
 .../feature/multiblock/IDistinctPart.java     |  30 +-
 .../multiblock/IMaintenanceMachine.java       | 191 -----
 .../feature/multiblock/IMultiPart.java        | 152 ----
 .../multiblock/IWorkableMultiController.java  |   9 -
 .../gtceu/api/machine/mui/MachineUIPanel.java |  98 +++
 .../machine/mui/MachineUIPanelBuilder.java    | 174 ++++
 .../api/machine/multiblock/CleanroomType.java |  11 +-
 ...CoilWorkableElectricMultiblockMachine.java |  65 +-
 .../MultiblockControllerMachine.java          | 628 ++++++++------
 .../multiblock/MultiblockDisplayText.java     |  51 +-
 .../api/machine/multiblock/PartAbility.java   |  12 +-
 .../WorkableElectricMultiblockMachine.java    | 176 ++--
 .../multiblock/WorkableMultiblockMachine.java | 137 +--
 .../part/MultiblockPartMachine.java           | 201 ++++-
 .../multiblock/part/TieredIOPartMachine.java  |  16 -
 .../property/GTMachineModelProperties.java    |   4 +-
 .../api/machine/steam/SimpleSteamMachine.java |  98 +--
 .../api/machine/steam/SteamBoilerMachine.java | 113 ++-
 .../steam/SteamEnergyRecipeHandler.java       |  14 +-
 .../gtceu/api/machine/steam/SteamMachine.java |   6 +-
 .../machine/steam/SteamWorkableMachine.java   |  31 +-
 .../gtceu/api/machine/trait/MachineTrait.java |  39 +-
 .../api/machine/trait/MachineTraitHolder.java |  73 +-
 .../trait/RecipeAmperageEnergyContainer.java  |  59 --
 .../feature/IAttachConfiguratorsTrait.java    |  12 +
 .../feature/IRecipeLogicModifierTrait.java    |  62 ++
 .../trait/feature/IRenderingTrait.java        |  14 +-
 .../multiblock/MultiblockMachineTrait.java    |  12 +-
 .../NotifiableComputationContainer.java       |  30 +-
 .../NotifiableEnergyContainer.java            |  11 +-
 .../{ => notifiable}/NotifiableFluidTank.java |  38 +-
 .../NotifiableItemStackHandler.java           |  18 +-
 .../NotifiableLaserContainer.java             |   3 +-
 .../NotifiableRecipeHandlerTrait.java         |   4 +-
 .../trait/notifiable/package-info.java        |   4 +
 .../{ => recipe}/IRecipeHandlerTrait.java     |   2 +-
 .../{ => recipe}/RecipeHandlerGroup.java      |   2 +-
 .../{ => recipe}/RecipeHandlerGroupColor.java |   2 +-
 .../RecipeHandlerGroupDistinctness.java       |   2 +-
 .../trait/{ => recipe}/RecipeHandlerList.java |   9 +-
 .../trait/{ => recipe}/RecipeLogic.java       |  90 +-
 .../machine/trait/recipe/package-info.java    |   4 +
 .../api/misc/IgnoreEnergyRecipeHandler.java   |   6 +-
 .../gtceu/api/misc/ItemRecipeHandler.java     |   5 +-
 .../api/misc/forge/FluidTankHandler.java      |  62 ++
 .../api/misc/virtualregistry/EntryTypes.java  |   7 +-
 .../virtualregistry/VirtualEnderRegistry.java |  86 +-
 .../misc/virtualregistry/VirtualEntry.java    |   5 +-
 .../virtualregistry/VirtualRegistryMap.java   |  60 +-
 .../entries/VirtualItemStorage.java           |   2 -
 .../entries/VirtualRedstone.java              |  42 +-
 .../virtualregistry/entries/VirtualTank.java  |   2 -
 .../virtualregistry/entries/package-info.java |   4 +
 .../misc/virtualregistry/package-info.java    |   4 +
 .../gtceu/api/mui/GTGuiScreen.java            |  33 +
 .../gtceu/api/mui/IItemUIHolder.java          |  53 ++
 .../gtceu/api/mui/MultiblockSchemaInfo.java   | 126 +++
 .../gtceu/api/mui/SteamTextureSet.java        |  37 +
 .../gtceu/api/mui/factory/CoverUIFactory.java |  84 ++
 .../api/mui/factory/MachineUIFactory.java     |  94 ++
 .../gtceu/api/mui/factory/PanelEditor.java    |  15 +
 .../gtceu/api/mui/factory/PanelFactory.java   |  63 ++
 .../multiblock/MultiblockWorldSavedData.java  |  66 ++
 .../gtceu/api/multiblock/OriginOffset.java    |  87 ++
 .../api/multiblock/PatternPredicate.java      | 219 +++++
 .../gtceu/api/multiblock/Predicates.java      | 351 ++++++++
 .../multiblock/error/BlockMatchingError.java  |  55 ++
 .../multiblock/error/CoilMatchingError.java   |  51 ++
 .../multiblock/error/FilterMatchingError.java |  51 ++
 .../api/multiblock/error/GTPatternErrors.java |  30 +
 .../multiblock/error/PartAbilityError.java    |  63 ++
 .../api/multiblock/error/PatternError.java    |  46 +
 .../api/multiblock/error/PatternErrorUI.java  |   9 +
 .../multiblock/error/PatternStringError.java  |  42 +
 .../multiblock/error/PlaceholderError.java    |  37 +
 .../multiblock/error/SimplePatternError.java  |  55 ++
 .../error/SinglePredicateError.java           | 124 +++
 .../api/multiblock/error/package-info.java    |   4 +
 .../gtceu/api/multiblock/package-info.java    |   4 +
 .../pattern/BasicSliceStrategy.java           | 137 +++
 .../api/multiblock/pattern/BlockPattern.java  | 261 ++++++
 .../multiblock/pattern/CurrentBlockInfo.java  |  81 ++
 .../ExpandableMultiblockPatternBuilder.java   |  54 ++
 .../multiblock/pattern/ExpandablePattern.java | 191 +++++
 .../api/multiblock/pattern/IBlockPattern.java |  55 ++
 .../pattern/IStructureChangeIgnored.java      |   3 +
 .../pattern/MultiblockPatternBuilder.java     | 225 +++++
 .../api/multiblock/pattern/PatternSlice.java  |  79 ++
 .../api/multiblock/pattern/PatternState.java  | 150 ++++
 .../api/multiblock/pattern/SliceStrategy.java |  69 ++
 .../api/multiblock/pattern/package-info.java  |   4 +
 .../multiblock/predicates/BasePredicate.java  | 153 ++++
 .../predicates/PredicateBlockTag.java         |  42 +
 .../predicates/PredicateBlocks.java           |  60 ++
 .../predicates/PredicateFluidTag.java         |  40 +
 .../predicates/PredicateFluids.java           |  47 +
 .../predicates/PredicatePartAbility.java      |  65 ++
 .../predicates/PredicateStates.java           |  50 ++
 .../multiblock/predicates/package-info.java   |   4 +
 .../util/AbstractStructureHelper.java         | 144 ++++
 .../gtceu/api/multiblock/util/BlockInfo.java  | 108 +++
 .../multiblock/util/BlockPatternHelper.java   | 293 +++++++
 .../util/ExpandablePatternHelper.java         | 197 +++++
 .../multiblock/util/RelativeDirection.java    | 238 ++++++
 .../api/multiblock/util/package-info.java     |   4 +
 .../gtceu/api/pattern/BlockPattern.java       | 657 --------------
 .../api/pattern/FactoryBlockPattern.java      | 183 ----
 .../api/pattern/MultiblockShapeInfo.java      |  63 --
 .../gtceu/api/pattern/MultiblockState.java    | 203 -----
 .../api/pattern/MultiblockWorldSavedData.java | 141 ---
 .../gtceu/api/pattern/Predicates.java         | 327 -------
 .../api/pattern/TraceabilityPredicate.java    | 236 -----
 .../gtceu/api/pattern/error/PatternError.java |  55 --
 .../api/pattern/error/PatternStringError.java |  17 -
 .../pattern/error/SinglePredicateError.java   |  43 -
 .../pattern/predicates/PredicateBlockTag.java |  42 -
 .../pattern/predicates/PredicateBlocks.java   |  35 -
 .../pattern/predicates/PredicateFluidTag.java |  42 -
 .../pattern/predicates/PredicateFluids.java   |  37 -
 .../pattern/predicates/PredicateStates.java   |  35 -
 .../pattern/predicates/SimplePredicate.java   | 183 ----
 .../api/pattern/util/PatternMatchContext.java |  67 --
 .../api/pattern/util/RelativeDirection.java   | 315 -------
 .../gtceu/api/pipenet/PipeCoverContainer.java |   2 +-
 .../api/placeholder/MultiLineComponent.java   |  13 +
 .../gtceu/api/placeholder/Placeholder.java    |  26 +-
 .../api/placeholder/PlaceholderHandler.java   | 502 +++++++++--
 .../gtceu/api/recipe/GTRecipe.java            |   2 +-
 .../gtceu/api/recipe/GTRecipeSerializer.java  |  41 +-
 .../gtceu/api/recipe/GTRecipeType.java        |  55 +-
 .../gtceu/api/recipe/RecipeCondition.java     |  24 +-
 .../gtceu/api/recipe/RecipeHelper.java        |  41 +-
 .../gtceu/api/recipe/RecipeRunner.java        |  29 +-
 .../api/recipe/category/GTRecipeCategory.java |  16 +-
 .../chance/boost/ChanceBoostFunction.java     |  38 -
 .../api/recipe/chance/logic/ChanceLogic.java  |  90 +-
 .../gtceu/api/recipe/content/Content.java     | 164 +---
 .../recipe/content/IContentSerializer.java    |  20 +-
 .../content/SerializerFluidIngredient.java    |  13 +-
 .../recipe/gui/CapabilityContentBuilder.java  | 197 +++++
 .../gtceu/api/recipe/gui/ContentOverlay.java  | 121 +++
 .../recipe/gui/GTRecipeTypeMachineWidget.java |  88 ++
 .../api/recipe/gui/GTRecipeTypeUILayout.java  | 367 ++++++++
 .../api/recipe/gui/GTRecipeViewerWidget.java  | 255 ++++++
 .../gui/MachineCapabilityLayoutBuilder.java   | 114 +++
 .../api/recipe/gui/ProgressBarTextureSet.java |  36 +
 .../api/recipe/gui/RecipeUIModifier.java      |  38 +
 .../RecipeViewerCapabilityLayoutBuilder.java  | 113 +++
 .../gtceu/api/recipe/gui/package-info.java    |   4 +
 .../recipe/ingredient/IRangedIngredient.java  |   4 +
 .../gtceu/api/recipe/lookup/RecipeDB.java     |   2 +-
 .../api/recipe/lookup/StagingRecipeDB.java    |   4 +-
 .../fluid/FluidStackMapIngredient.java        |   7 +-
 .../api/recipe/modifier/ParallelLogic.java    |   4 +-
 .../recipe/modifier/RecipeModifierList.java   |   2 +-
 .../gtceu/api/recipe/ui/GTRecipeTypeUI.java   | 432 ----------
 .../gtceu/api/registry/GTRegistries.java      |  78 +-
 .../gtceu/api/registry/GTRegistry.java        |  73 +-
 .../api/registry/registrate/GTRegistrate.java | 119 ++-
 .../registry/registrate/MachineBuilder.java   | 219 ++---
 .../registrate/MultiblockMachineBuilder.java  |  73 +-
 .../api/registry/registrate/package-info.java |   7 +-
 .../provider/GTBlockstateProvider.java        |  23 +-
 .../gtceu/api/sync_system/ClassSyncData.java  |  30 +-
 .../api/sync_system/FieldSyncHandler.java     |  84 --
 .../gtceu/api/sync_system/ISyncAnnotated.java |  30 -
 .../gtceu/api/sync_system/SyncDataHolder.java |  93 +-
 .../ResourceLocationReferenceTransformer.java |   4 +-
 .../SyncAnnotatedTransformer.java             |  57 --
 .../data_transformers/ValueTransformers.java  |  27 +-
 .../gtceu/CoverBehaviorTransformer.java       |  22 +-
 .../{ => managed}/ISyncManaged.java           |   9 +-
 .../sync_system/managed/ManagedSavedData.java |  48 ++
 .../{ => managed}/ManagedSyncBlockEntity.java |  20 +-
 .../managed/ManagedSyncEntityBlock.java       |  35 +
 .../api/sync_system/managed/package-info.java |   4 +
 .../transfer/item/CustomItemStackHandler.java |  12 +
 .../item/NotifiableAccountedInvWrapper.java   |   2 +-
 .../gtceu/client/CharTypedEvent.java          |  21 +
 .../gtceu/client/ClientEventListener.java     |  32 +-
 .../gregtechceu/gtceu/client/ClientProxy.java |  39 +-
 .../gtceu/client/EarlyKeyPressEvent.java      |  26 +
 .../gtceu/client/GuiSpriteManager.java        |  50 ++
 .../gtceu/client/ModClientEventListener.java  |  31 +
 .../client/bloom/BloomEventListeners.java     |  96 +++
 .../gtceu/client/bloom/BloomHandler.java      | 258 ++++++
 .../gtceu/client/bloom/BloomRenderTicket.java |  49 ++
 .../gtceu/client/bloom/BloomRenderer.java     | 387 +++++++++
 .../client/bloom/BloomShaderManager.java      | 174 ++++
 .../gtceu/client/bloom/BloomType.java         |  17 +
 .../client/bloom/EffectRenderContext.java     |  74 ++
 .../gtceu/client/bloom/IBloomEffect.java      |  34 +
 .../gtceu/client/bloom/IRenderSetup.java      |  25 +
 .../gtceu/client/bloom/package-info.java      |   4 +
 .../bloom/particle/GTBloomParticle.java       |  18 +
 .../gtceu/client/model/GTModelProperties.java |   1 +
 .../client/model/TextureOverrideModel.java    |  11 +-
 .../gtceu/client/model/ctm/CTMBakedModel.java |  59 ++
 .../client/model/ctm/CTMMeshBuilder.java      | 240 ++++++
 .../client/model/ctm/ConnectionCheck.java     |  86 ++
 .../client/model/ctm/GTTextureMetadata.java   |  68 ++
 .../gtceu/client/model/ctm/ISubmap.java       | 123 +++
 .../model/ctm/OctagonalOrientation.java       | 171 ++++
 .../gtceu/client/model/ctm/Submap.java        |  95 +++
 .../client/model/ctm/TextureConnections.java  | 279 ++++++
 .../gtceu/client/model/ctm/package-info.java  |   4 +
 .../machine/IControllerModelRenderer.java     |   4 +-
 .../model/machine/IMachineRendererModel.java  |   6 +-
 .../client/model/machine/MachineModel.java    |  23 +-
 .../model/machine/overlays/HPCAOverlay.java   |   2 +-
 .../machine/overlays/WorkableOverlays.java    |   2 +-
 .../gtceu/client/model/package-info.java      |   7 +-
 .../client/model/pipe/ActivablePipeModel.java |  23 +-
 .../client/model/pipe/BakedPipeModel.java     |   5 +-
 .../gtceu/client/model/pipe/PipeModel.java    | 109 ++-
 .../client/model/quad/EncodingFormat.java     |  87 ++
 .../gtceu/client/model/quad/Mesh.java         |  74 ++
 .../gtceu/client/model/quad/MeshBuilder.java  |  83 ++
 .../client/model/quad/MutableQuadView.java    | 523 ++++++++++++
 .../gtceu/client/model/quad/QuadView.java     | 398 +++++++++
 .../gtceu/client/model/quad/SpriteFinder.java | 179 ++++
 .../quad}/StaticFaceBakery.java               |  69 +-
 .../gtceu/client/model/quad/package-info.java |   4 +
 .../model/quad/transform/QuadTransform.java   |  23 +
 .../client/mui/schema/MutableSchema.java      | 110 +++
 .../client/particle/GTOverheatParticle.java   | 307 +++++++
 .../gtceu/client/particle/GTParticle.java     | 115 +++
 .../client/particle/GTParticleManager.java    | 222 +++++
 .../gtceu/client/particle/package-info.java   |   4 +
 .../renderer/AABBHighlightRenderer.java       | 126 +++
 .../renderer/BlockHighlightRenderer.java      |  94 +-
 .../gtceu/client/renderer/GTRenderTypes.java  | 157 +++-
 .../MultiblockInWorldPreviewRenderer.java     | 466 ----------
 .../renderer/PatternPreviewRenderer.java      | 537 ++++++++++++
 .../renderer/block/FluidBlockRenderer.java    | 137 ++-
 .../renderer/block/OreBlockRenderer.java      |  13 +-
 .../renderer/cover/FacadeCoverRenderer.java   | 175 ++--
 .../renderer/cover/ICoverableRenderer.java    |  71 +-
 .../renderer/cover/IOCoverRenderer.java       |   6 +-
 .../renderer/cover/SimpleCoverRenderer.java   |   6 +-
 .../renderer/item/ToolChargeBarRenderer.java  |  11 +-
 .../decorator/GTLampItemOverlayRenderer.java  |  13 +-
 .../decorator/GTTankItemFluidPreview.java     |  11 +-
 .../renderer/machine/DynamicRenderHelper.java |   2 +-
 .../machine/impl/BoilerMultiPartRender.java   |  29 +-
 .../machine/impl/CentralMonitorRender.java    |   7 +-
 .../machine/impl/FluidAreaRender.java         |  19 +-
 .../machine/impl/FusionRingRender.java        | 123 ++-
 .../machine/impl/GrowingPlantRender.java      |   6 +-
 .../machine/impl/QuantumChestItemRender.java  |  13 +-
 .../machine/impl/QuantumTankFluidRender.java  |  10 +-
 .../renderer/monitor/MonitorGuiRenderer.java  | 228 +++++
 .../monitor/MonitorImageRenderer.java         |   1 +
 .../renderer/monitor/MonitorTextRenderer.java | 113 ++-
 .../ModulePlaceholderRenderer.java            |   3 +-
 .../gtceu/client/util/AssetEventListener.java |  16 +-
 .../gtceu/client/util/BloomUtils.java         |  19 -
 .../gtceu/client/util/DrawUtil.java           |  80 --
 .../util/ExtendedBlockModelRotation.java      |  95 ++-
 .../client/util/FakeBlockTintGetter.java      | 172 ++++
 .../gtceu/client/util/ModelEventHelper.java   | 229 +++++
 .../gtceu/client/util/ModelUtils.java         | 160 ----
 .../client/util/PoseStackExtensions.java      |  11 -
 .../gtceu/client/util/RenderBufferHelper.java | 256 +++++-
 .../gtceu/client/util/RenderUtil.java         | 185 ++--
 .../client/util/SpriteFunctionWrapper.java    |  28 +
 .../gtceu/client/util/TextureHelper.java      | 211 +++++
 .../client/util/TextureMetadataHelper.java    | 102 +++
 .../gtceu/client/util/package-info.java       |   4 +
 .../client/util/quad/GeometryHelper.java      | 195 +++++
 .../transformers}/GTQuadTransformers.java     |  66 +-
 .../transformers/InterpolationHelper.java     | 127 +++
 .../quad/transformers/QuadCornerKicker.java   | 205 +++++
 .../quad/transformers/QuadPositionForcer.java |  93 ++
 .../quad/transformers/QuadReInterpolator.java | 193 +++++
 .../util/quad/transformers/QuadTinter.java    |  60 ++
 .../gtceu/common/CommonEventListener.java     |  76 +-
 .../gregtechceu/gtceu/common/CommonProxy.java | 112 ++-
 .../gtceu/common/block/CableBlock.java        |   4 +-
 .../common/blockentity/CableBlockEntity.java  | 117 ++-
 .../EnvironmentalHazardSavedData.java         |   2 +-
 .../capability/LocalizedHazardSavedData.java  |   2 +-
 .../capability/MedicalConditionTracker.java   |   4 +-
 .../common/commands/GTClientCommands.java     |  53 +-
 .../gtceu/common/commands/GTCommands.java     |  22 +-
 .../arguments/GTRegistryArgument.java         |   4 +-
 .../commands/arguments/MaterialArgument.java  |   6 +-
 .../commands/arguments/MaterialParser.java    |  14 +-
 .../common/cover/ComputerMonitorCover.java    | 140 +--
 .../gtceu/common/cover/ConveyorCover.java     | 136 ++-
 .../gtceu/common/cover/FacadeCover.java       |   3 +-
 .../gtceu/common/cover/FluidFilterCover.java  |  51 +-
 .../common/cover/FluidRegulatorCover.java     |  95 +--
 .../gtceu/common/cover/ItemFilterCover.java   |  54 +-
 .../common/cover/MachineControllerCover.java  | 240 +++---
 .../gtceu/common/cover/PumpCover.java         | 127 +--
 .../gtceu/common/cover/RobotArmCover.java     |  63 +-
 .../gtceu/common/cover/StorageCover.java      |  82 +-
 .../gtceu/common/cover/data/BucketMode.java   |  18 +-
 .../common/cover/data/ControllerMode.java     |  18 +-
 .../common/cover/data/DistributionMode.java   |  19 +-
 .../gtceu/common/cover/data/FilterMode.java   |  16 +-
 .../gtceu/common/cover/data/ManualIOMode.java |  19 +-
 .../gtceu/common/cover/data/TransferMode.java |  32 +-
 .../gtceu/common/cover/data/VoidingMode.java  |  10 +-
 .../detector/AdvancedEnergyDetectorCover.java | 154 ++--
 .../detector/AdvancedFluidDetectorCover.java  |  89 +-
 .../detector/AdvancedItemDetectorCover.java   |  88 +-
 .../common/cover/detector/DetectorCover.java  |   5 +-
 .../detector/MaintenanceDetectorCover.java    |  11 +-
 .../cover/ender/AbstractEnderLinkCover.java   | 583 +++++--------
 .../cover/ender/EnderFluidLinkCover.java      |  58 +-
 .../cover/ender/EnderItemLinkCover.java       |  52 +-
 .../cover/ender/EnderRedstoneLinkCover.java   |  53 +-
 .../common/cover/ender/package-info.java      |   4 +
 .../voiding/AdvancedFluidVoidingCover.java    |  83 +-
 .../voiding/AdvancedItemVoidingCover.java     |  70 +-
 .../cover/voiding/FluidVoidingCover.java      |  52 +-
 .../cover/voiding/ItemVoidingCover.java       |  52 +-
 .../gtceu/common/data/GCYMRecipeTypes.java    |  52 +-
 .../gtceu/common/data/GTBlocks.java           |  11 +-
 .../gtceu/common/data/GTElements.java         | 348 +++++---
 .../gtceu/common/data/GTFluids.java           |  14 +-
 .../gtceu/common/data/GTItems.java            |   9 +-
 .../gtceu/common/data/GTMachines.java         | 425 +++++----
 .../gtceu/common/data/GTMaterialBlocks.java   |  63 +-
 .../gtceu/common/data/GTMaterialItems.java    |  40 +-
 .../gtceu/common/data/GTMaterials.java        |   4 +-
 .../gtceu/common/data/GTMenuTypes.java        |  26 +
 .../gtceu/common/data/GTPlaceholders.java     | 236 ++++-
 .../common/data/GTRecipeCapabilities.java     |  10 +-
 .../gtceu/common/data/GTRecipeCategories.java |   8 +-
 .../gtceu/common/data/GTRecipeConditions.java |   4 +-
 .../gtceu/common/data/GTRecipeTypes.java      | 510 ++++++-----
 .../gtceu/common/data/GTRecipes.java          |   4 +-
 .../gtceu/common/data/GTSoundEntries.java     |   2 +-
 .../gtceu/common/data/blocks/GTDevBlocks.java |  19 +
 .../common/data/machines/GCYMMachines.java    | 444 ++++------
 .../common/data/machines/GTAEMachines.java    |   5 +-
 .../common/data/machines/GTMachineUtils.java  | 430 ++++------
 .../common/data/machines/GTMultiMachines.java | 582 ++++---------
 .../data/machines/GTResearchMachines.java     | 212 ++---
 .../materials/AlloyBlastPropertyAddition.java |  65 ++
 .../common/data/models/GTMachineModels.java   |   6 +-
 .../gtceu/common/data/models/GTModels.java    |   4 +-
 .../gtceu/common/datafixers/TagFixer.java     |  39 -
 .../item/armor/AdvancedNanoMuscleSuite.java   |   4 +-
 .../common/item/armor/QuarkTechSuite.java     |   4 +-
 .../item/behavior/AntidoteBehavior.java       |  10 +-
 .../item/behavior/DataItemBehavior.java       |   4 +-
 .../item/behavior/FluidFilterBehaviour.java   |  40 +-
 .../item/behavior/IntCircuitBehaviour.java    | 111 +--
 .../item/behavior/ItemFilterBehaviour.java    |  52 +-
 .../item/behavior/ItemMagnetBehavior.java     | 193 +++--
 .../behavior/MachineConfigCopyBehaviour.java  | 133 +--
 .../behavior/PortableScannerBehavior.java     |  11 +-
 .../behavior/ProspectorScannerBehavior.java   | 125 ++-
 .../item/behavior/TerminalBehavior.java       | 145 +++-
 .../item/behavior/TurbineRotorBehaviour.java  |   4 +-
 .../item/modules/GuiModuleBehaviour.java      |  44 +
 .../item/modules/ImageModuleBehaviour.java    |  66 +-
 .../item/modules/TextModuleBehaviour.java     | 125 ++-
 .../tool/behavior/AOEConfigUIBehavior.java    | 197 ++++-
 .../tool/behavior/BlockRotatingBehavior.java  |  41 +-
 .../tool/behavior/DouseCampfireBehavior.java  |   1 -
 .../item/tool/behavior/GrassPathBehavior.java |   1 -
 .../tool/behavior/HarvestCropsBehavior.java   |   3 -
 .../item/tool/behavior/HoeGroundBehavior.java |   1 -
 .../item/tool/behavior/LogStripBehavior.java  |   1 -
 .../item/tool/behavior/PlungerBehavior.java   |   3 +-
 .../item/tool/behavior/ScrapeBehavior.java    |   1 -
 .../item/tool/behavior/ShearBehavior.java     | 195 +++++
 .../item/tool/behavior/WaxOffBehavior.java    |   1 -
 .../machine/GTMachineInstanceFactories.java   | 129 +++
 .../machine/electric/AirScrubberMachine.java  |  24 +-
 .../electric/BatteryBufferMachine.java        | 112 ++-
 .../machine/electric/BlockBreakerMachine.java | 173 +---
 .../machine/electric/ConverterMachine.java    |  49 +-
 .../machine/electric/FisherMachine.java       | 228 ++---
 .../common/machine/electric/HullMachine.java  |  17 +-
 .../electric/ItemCollectorMachine.java        | 225 ++---
 .../common/machine/electric/MinerMachine.java | 305 +++----
 .../common/machine/electric/PumpMachine.java  |  82 +-
 .../machine/electric/RockCrusherMachine.java  |  13 -
 .../machine/electric/TransformerMachine.java  |   2 +-
 .../electric/WorldAcceleratorMachine.java     |  16 +-
 .../common/machine/mui/TestMuiMachine.java    | 744 ++++++++++++++++
 .../electric/ActiveTransformerMachine.java    | 207 +++--
 .../electric/AssemblyLineMachine.java         |  47 +-
 .../electric/BedrockOreMinerMachine.java      | 108 ++-
 .../electric/CentralMonitorMachine.java       | 568 +++----------
 .../multiblock/electric/CleanroomMachine.java | 718 +++++++++-------
 .../electric/DistillationTowerMachine.java    |  55 +-
 .../electric/FluidDrillMachine.java           |  99 +--
 .../electric/FusionReactorMachine.java        |  83 +-
 .../electric/LargeMinerMachine.java           | 134 ++-
 .../electric/MultiblockTankMachine.java       |  65 +-
 .../electric/PowerSubstationMachine.java      | 343 +++++---
 .../gcym/LargeChemicalBathMachine.java        |  55 --
 .../gcym/LargeMacerationTowerMachine.java     |  10 +-
 .../electric/gcym/LargeMixerMachine.java      |  57 --
 .../electric/monitor/MonitorGroup.java        |  35 +-
 .../electric/research/DataBankMachine.java    |  82 +-
 .../electric/research/HPCAMachine.java        | 279 +++---
 .../research/NetworkSwitchMachine.java        |  41 +-
 .../research/ResearchStationMachine.java      |  97 ++-
 .../testmultis/PCBFactoryMachine.java         |  77 ++
 .../LargeCombustionEngineMachine.java         |  89 +-
 .../generator/LargeTurbineMachine.java        |  93 +-
 .../part/AutoMaintenanceHatchPartMachine.java |  31 +-
 .../CleaningMaintenanceHatchPartMachine.java  |   8 +-
 .../multiblock/part/CokeOvenHatch.java        |  21 +-
 .../part/DataAccessHatchMachine.java          |  56 +-
 .../multiblock/part/DiodePartMachine.java     |   2 +-
 .../multiblock/part/DualHatchPartMachine.java |  82 +-
 .../part/EnergyHatchPartMachine.java          |  10 +-
 .../part/FluidHatchPartMachine.java           | 244 ++----
 .../multiblock/part/ItemBusPartMachine.java   | 185 ++--
 .../part/LaserHatchPartMachine.java           |  13 +-
 .../part/MaintenanceHatchPartMachine.java     | 264 ++++--
 .../multiblock/part/MufflerPartMachine.java   |  73 +-
 .../multiblock/part/ObjectHolderMachine.java  |  69 +-
 .../part/OpticalComputationHatchMachine.java  |  13 +-
 .../part/OpticalDataHatchMachine.java         |  18 +-
 .../part/ParallelHatchPartMachine.java        | 112 ++-
 .../multiblock/part/PumpHatchPartMachine.java |  38 +-
 .../part/ReservoirHatchPartMachine.java       |  17 +-
 .../part/RotorHolderPartMachine.java          |  96 +--
 .../part/SteamHatchPartMachine.java           |  36 +-
 .../part/SteamItemBusPartMachine.java         |  45 +-
 .../multiblock/part/TankValvePartMachine.java |   8 +-
 .../part/hpca/HPCABridgePartMachine.java      |  31 -
 .../part/hpca/HPCAComponentPartMachine.java   |  45 +-
 .../part/hpca/HPCAComputationPartMachine.java |  46 -
 .../part/hpca/HPCACoolerPartMachine.java      |  41 -
 .../part/hpca/HPCAEmptyPartMachine.java       |  30 -
 .../monitor/AdvancedMonitorPartMachine.java   |  20 +-
 .../part/monitor/MonitorPartMachine.java      |  36 +-
 .../primitive/CharcoalPileIgniterMachine.java | 299 +++----
 .../multiblock/primitive/CokeOvenMachine.java | 108 ++-
 .../PrimitiveBlastFurnaceMachine.java         | 169 ++--
 .../PrimitiveFancyUIWorkableMachine.java      |  11 -
 .../primitive/PrimitivePumpMachine.java       |  92 +-
 .../primitive/PrimitiveWorkableMachine.java   |  82 +-
 .../multiblock/steam/LargeBoilerMachine.java  | 223 +++--
 .../steam/SteamParallelMultiblockMachine.java | 128 ++-
 .../common/machine/owner/ArgonautsOwner.java  |   2 +-
 .../gtceu/common/machine/owner/FTBOwner.java  |   2 +-
 .../common/machine/owner/PlayerOwner.java     |   2 +-
 .../steam/SteamLiquidBoilerMachine.java       |  56 +-
 .../machine/steam/SteamMinerMachine.java      | 185 ++--
 .../machine/steam/SteamSolarBoiler.java       |  47 +-
 .../steam/SteamSolidBoilerMachine.java        |  65 +-
 .../common/machine/storage/BufferMachine.java |  73 +-
 .../common/machine/storage/CrateMachine.java  |  90 +-
 .../machine/storage/CreativeChestMachine.java | 114 ++-
 .../CreativeComputationProviderMachine.java   |  86 +-
 .../CreativeEnergyContainerMachine.java       | 274 ++++--
 .../machine/storage/CreativeTankMachine.java  | 107 ++-
 .../common/machine/storage/DrumMachine.java   |  28 +-
 .../storage/LongDistanceEndpointMachine.java  |   2 -
 .../machine/storage/QuantumChestMachine.java  | 161 ++--
 .../machine/storage/QuantumTankMachine.java   | 166 ++--
 .../common/machine/trait/AutoOutputTrait.java |  57 +-
 .../machine/trait/BatterySlotTrait.java       |  97 +++
 .../machine/trait/BedrockOreMinerLogic.java   |   2 +-
 .../machine/trait/CentralMonitorLogic.java    |   2 +-
 .../common/machine/trait/CleanroomLogic.java  |   8 +-
 .../common/machine/trait/ConverterTrait.java  |   2 +-
 .../trait/EnvironmentalExplosionTrait.java    |   3 +
 .../trait/ExhaustVentMachineTrait.java        |  15 +-
 .../common/machine/trait/FluidDrillLogic.java |   2 +-
 .../machine/trait/FluidTankProxyTrait.java    |  14 +-
 .../machine/trait/ItemHandlerProxyTrait.java  |   6 +-
 .../trait/ProgrammableCircuitSlotTrait.java   | 125 +++
 .../trait/customlogic/BreweryLogic.java       |   2 +-
 .../trait/customlogic/CannerLogic.java        |   2 +-
 .../trait/customlogic/FormingPressLogic.java  |   2 +-
 .../EnvironmentalHazardCleanerTrait.java      |  14 +-
 .../EnvironmentalHazardEmitterTrait.java      |  11 +-
 .../machine/trait/miner/MinerLogic.java       |  40 +-
 .../MultiblockFluidRendererTrait.java         |  10 +-
 .../gtceu/common/mui/GTByteBufAdapters.java   |  80 ++
 .../gtceu/common/mui/GTGuiTextures.java       | 804 ++++++++++++++++++
 .../gtceu/common/mui/GTGuiTheme.java          | 420 +++++++++
 .../gtceu/common/mui/GTMuiCoverUtil.java      |  81 ++
 .../gtceu/common/mui/GTMuiMachineUtil.java    |  75 ++
 .../gtceu/common/mui/GTMuiWidgets.java        | 767 +++++++++++++++++
 .../common/mui/GTMultiblockTextUtil.java      | 593 +++++++++++++
 .../mui/GTSingleblockMachinePanels.java       |  68 ++
 .../common/mui/drawable/BorderDrawable.java   |  43 +
 .../common/mui/drawable/CycleDrawable.java    |  28 +
 .../mui/factory/CentralMonitorUIFactory.java  | 400 +++++++++
 .../gtceu/common/mui/package-info.java        |   4 +
 .../gtceu/common/mui/widgets/PopupPanel.java  |  62 ++
 .../common/mui/widgets/SimpleDialog.java      |  43 +
 .../common/mui/widgets/SteamDialWidget.java   |  99 +++
 .../prospector/ProspectorMapHandler.java      | 347 ++++++++
 .../prospector/ProspectorMapTexture.java      | 173 ++++
 .../widgets/textfield/CodeEditorWidget.java   | 174 ++++
 .../widgets/textfield/TextEditorWidget.java   |  82 ++
 .../gtceu/common/network/GTNetwork.java       |   6 +
 .../packets/SPacketStartProspectionShare.java |  74 ++
 .../SPacketProspectBedrockFluid.java          |   2 +-
 .../SPacketProspectBedrockOre.java            |   8 +-
 .../common/pipelike/cable/Insulation.java     |  51 +-
 .../condition/AdjacentBlockCondition.java     |  31 +-
 .../condition/AdjacentFluidCondition.java     |  35 +-
 .../recipe/condition/BiomeCondition.java      |   2 +-
 .../recipe/condition/BiomeTagCondition.java   |   2 +-
 .../recipe/condition/CleanroomCondition.java  |   2 +-
 .../recipe/condition/DaytimeCondition.java    |   2 +-
 .../recipe/condition/DimensionCondition.java  |  53 +-
 .../recipe/condition/EUToStartCondition.java  |   2 +-
 .../EnvironmentalHazardCondition.java         |   2 +-
 .../recipe/condition/FTBQuestCondition.java   |   2 +-
 .../recipe/condition/GameStageCondition.java  |   2 +-
 .../condition/HeraclesQuestCondition.java     |   2 +-
 .../recipe/condition/PositionYCondition.java  |   2 +-
 .../recipe/condition/RainingCondition.java    |   2 +-
 .../recipe/condition/ResearchCondition.java   |   9 +-
 .../recipe/condition/ThunderCondition.java    |   2 +-
 .../recipe/condition/VentCondition.java       |   2 +-
 .../recipe/gui/GTRecipeUIModifiers.java       |  69 ++
 .../gtceu/common/registry/GTRegistration.java |   7 +
 .../material/MaterialRegistryImpl.java        |  79 --
 .../material/MaterialRegistryManager.java     | 159 ----
 .../valueprovider/ModifiedIntProvider.java    |  22 +-
 .../gtceu/config/ConfigHolder.java            | 135 ++-
 .../gregtechceu/gtceu/core/IGameRenderer.java |   6 +
 .../gregtechceu/gtceu/core/MixinHelpers.java  |   5 +-
 .../gtceu/core/config/GTEarlyConfig.java      | 349 ++++++++
 .../gregtechceu/gtceu/core/config/Option.java | 110 +++
 .../gtceu/core/config/package-info.java       |   4 +
 .../core/mixins/BeehiveBlockAccessor.java     |  18 +
 .../gtceu/core/mixins/BlockStateAccessor.java |  14 +
 .../gtceu/core/mixins/GTMixinPlugin.java      | 113 ++-
 .../gtceu/core/mixins/LevelMixin.java         |  18 +-
 .../ReloadableResourceManagerAccessor.java    |  16 +
 .../core/mixins/ServerChunkProviderMixin.java |  90 --
 .../mixins/SmithingTransformRecipeMixin.java  |  60 +-
 .../TransientCraftingContainerAccessor.java   |  19 +
 .../mixins/client/AbstractWidgetMixin.java    |  32 +
 .../core/mixins/client/BakedQuadMixin.java    |  39 +-
 .../core/mixins/client/GameRendererMixin.java |  38 +
 .../mixins/client/GuiGraphicsAccessor.java    |   7 +
 .../core/mixins/client/GuiGraphicsMixin.java  | 105 ++-
 .../mixins/client/KeyMappingAccessor.java     |  17 +
 .../mixins/client/KeyboardHandlerMixin.java   |  39 +
 .../mixins/client/LevelRendererMixin.java     |   7 -
 .../mixins/client/ModelBakerImplMixin.java    |  31 +
 .../client/RenderStateShardAccessor.java      |  13 +
 .../core/mixins/client/TextureAtlasMixin.java |  56 ++
 .../mixins/client/VertexConsumerMixin.java    |   9 +
 .../bloom/ForgeModelBlockRendererMixin.java   |  33 +
 .../client/bloom/GameRendererAccessor.java    |  13 +
 .../client/bloom/LevelRendererAccessor.java   |  17 +
 .../client/bloom/LevelRendererMixin.java      |  26 +
 .../client/bloom/ModelBlockRendererMixin.java |  65 ++
 .../client/bloom/PostChainAccessor.java       |  16 +
 .../mixins/client/bloom/QuadLighterMixin.java |  50 ++
 .../mixins/client/bloom/RebuildTaskMixin.java |  70 ++
 .../client/bloom/normal/RenderTypeMixin.java  |  30 +
 .../normal/embeddium/BlockRendererMixin.java  |  84 ++
 .../embeddium/DefaultMaterialsMixin.java      |  28 +
 .../DefaultTerrainRenderPassesMixin.java      |  27 +
 .../embeddium/SodiumWorldRendererMixin.java   |  36 +
 .../oculus/WorldRenderingPhaseMixin.java      |  49 ++
 .../embeddium/BlockRendererMixin.java         |  77 ++
 .../gtceu/core/mixins/emi/EmiApiAccessor.java |  20 +
 .../mixins/ftbchunks/LargeMapScreenMixin.java |   2 +-
 .../core/mixins/ldlib/ClickDataMixin.java     |  33 -
 .../ldlib/ModularWrapperWidgetMixin.java      |  19 -
 .../core/mixins/ldlib/SyncUtilsMixin.java     |  24 -
 .../extensions/BakedQuadExt.java}             |   8 +-
 .../util/extensions/ExtensionHelpers.java     |  14 +
 .../core/util/extensions/QuadLighterExt.java  |  10 +
 .../util/extensions/VertexConsumerExt.java    |  22 +
 .../gtceu/data/lang/ConfigurationLang.java    |   3 +
 .../gtceu/data/lang/IntegrationLang.java      | 258 +++---
 .../gregtechceu/gtceu/data/lang/ItemLang.java |   4 +-
 .../gtceu/data/lang/MachineLang.java          |  13 +-
 .../gtceu/data/lang/MaterialLang.java         |  13 +-
 .../gtceu/data/lang/MultiblockLang.java       |  27 +
 .../gtceu/data/lang/RecipeLang.java           |  24 +
 .../gtceu/data/lang/RecipeLogicLang.java      |  31 -
 .../gtceu/data/loader/GTOreLoader.java        |   2 +-
 .../data/recipe/builder/GTRecipeBuilder.java  |  91 +-
 .../ShapedEnergyTransferRecipeBuilder.java    |  35 +-
 .../recipe/builder/ShapedRecipeBuilder.java   |  39 +-
 .../builder/ShapelessRecipeBuilder.java       |   3 +-
 .../builder/SimpleCookingRecipeBuilder.java   |   3 +-
 .../generated/MaterialRecipeHandler.java      |  10 +-
 .../recipe/generated/OreRecipeHandler.java    |  58 +-
 .../recipe/generated/ToolRecipeHandler.java   |   7 +
 .../data/recipe/misc/CircuitRecipes.java      |  14 +-
 .../data/recipe/misc/MachineRecipeLoader.java |  60 +-
 .../data/recipe/misc/MiscRecipeLoader.java    |  10 +-
 .../recipe/misc/VanillaStandardRecipes.java   |  12 +-
 .../data/recipe/misc/WoodMachineRecipes.java  |   6 +-
 .../alloyblast/AlloyBlastRecipeProducer.java  |  40 +-
 .../chemistry/DistillationRecipes.java        |  14 +-
 .../chemistry/GemSlurryRecipes.java           |  20 +-
 .../chemistry/GrowthMediumRecipes.java        |   4 +-
 .../serialized/chemistry/NaquadahRecipes.java |   4 +-
 .../chemistry/PetrochemRecipes.java           |  28 +-
 .../serialized/chemistry/ReactorRecipes.java  |  16 +-
 .../chemistry/SeparationRecipes.java          | 134 +--
 .../serialized/chemistry/TitaniumRecipes.java |  20 +-
 .../gtceu/data/tags/BlockTagLoader.java       |   8 +
 .../ae2/gui/AEConfigSyncHandler.java          | 117 +++
 .../integration/ae2/gui/AEConfigWidget.java   | 421 +++++++++
 .../integration/ae2/gui/AEGuiHelper.java      | 158 ++++
 .../ae2/gui/AEKeyStorageSyncHandler.java      | 156 ++++
 .../ae2/gui/AEStackDisplayWidget.java         |  79 ++
 .../ae2/gui/ScrollPreservingGrid.java         |  41 +
 .../integration/ae2/gui/package-info.java     |   4 +
 .../ae2/gui/widget/AEFluidConfigWidget.java   |  39 -
 .../ae2/gui/widget/AEItemConfigWidget.java    |  39 -
 .../gui/widget/AETextInputButtonWidget.java   |  91 --
 .../ae2/gui/widget/AmountSetWidget.java       |  87 --
 .../ae2/gui/widget/ConfigWidget.java          | 174 ----
 .../gui/widget/list/AEFluidDisplayWidget.java |  83 --
 .../gui/widget/list/AEItemDisplayWidget.java  |  65 --
 .../ae2/gui/widget/list/AEListGridWidget.java | 233 -----
 .../gui/widget/slot/AEConfigSlotWidget.java   | 108 ---
 .../widget/slot/AEFluidConfigSlotWidget.java  | 312 -------
 .../widget/slot/AEItemConfigSlotWidget.java   | 241 ------
 .../widget/slot/AEPatternViewSlotWidget.java  |  86 --
 .../ae2/machine/MEBusPartMachine.java         |   5 +-
 .../ae2/machine/MEInputBusPartMachine.java    | 123 ++-
 .../ae2/machine/MEInputHatchPartMachine.java  |  95 ++-
 .../ae2/machine/MEOutputBusPartMachine.java   | 104 ++-
 .../ae2/machine/MEOutputHatchPartMachine.java |  96 ++-
 .../machine/MEPatternBufferPartMachine.java   | 728 +++++++++++++---
 .../MEPatternBufferProxyPartMachine.java      |  34 +-
 .../ae2/machine/MEStockingBusPartMachine.java |  91 +-
 .../machine/MEStockingHatchPartMachine.java   |  48 +-
 .../feature/IGridConnectedMachine.java        |   2 +-
 .../feature/multiblock/IAutoPullPart.java     |  20 +-
 .../feature/multiblock/IMEStockingPart.java   |  63 +-
 .../trait/InternalSlotRecipeHandler.java      | 147 ----
 .../machine/trait/ProxySlotRecipeHandler.java |  56 +-
 .../ae2/slot/ExportOnlyAEFluidList.java       |   2 +-
 .../ae2/slot/ExportOnlyAEItemList.java        |   2 +-
 .../cctweaked/CCTweakedPlugin.java            |   4 +
 .../peripherals/MaintenancePeripheral.java    |  47 +
 .../create/GTCreateIntegration.java           |   4 +-
 .../embeddium/GTEmbeddiumCompat.java          |  54 ++
 .../integration/embeddium/package-info.java   |   4 +
 .../multipage/MultiblockInfoEmiCategory.java  |  35 -
 .../multipage/MultiblockInfoEmiRecipe.java    |  54 --
 .../emi/oreprocessing/GTEmiOreProcessing.java |  36 -
 .../emi/orevein/GTBedrockFluid.java           |  33 -
 .../orevein/GTBedrockFluidEmiCategory.java    |  38 -
 .../integration/emi/orevein/GTBedrockOre.java |  33 -
 .../integration/emi/orevein/GTEmiOreVein.java |  44 -
 .../emi/orevein/GTOreVeinEmiCategory.java     |  39 -
 .../integration/emi/recipe/GTEmiRecipe.java   | 112 ---
 .../emi/recipe/GTEmiRecipeHandler.java        |  36 -
 .../gtceu/integration/jade/GTJadePlugin.java  | 124 +--
 .../provider/AutoOutputBlockProvider.java     |  36 +-
 .../provider/BatteryStorageInfoProvider.java  |  95 +--
 .../jade/provider/BlockInfoProvider.java      |  56 --
 .../jade/provider/CableBlockProvider.java     |  18 +-
 .../provider/CapabilityBlockProvider.java     |   7 +-
 .../jade/provider/DataBankBlockProvider.java  |  45 +-
 .../ElectricContainerBlockProvider.java       |   6 +-
 .../provider/EnergyConverterModeProvider.java |  36 +-
 .../provider/ExhaustVentBlockProvider.java    |  23 +-
 .../provider/HazardCleanerBlockProvider.java  |  14 +-
 .../jade/provider/LDPEndpointProvider.java    |  51 +-
 .../provider/MEGridConnectedProvider.java     |  41 +
 .../provider/MEPatternBufferProvider.java     |  46 +-
 .../MEPatternBufferProxyProvider.java         |  74 +-
 .../jade/provider/MachineInfoProvider.java    |  60 ++
 .../jade/provider/MachineModeProvider.java    |  78 +-
 .../jade/provider/MachineTraitProvider.java   |  18 +-
 .../provider/MaintenanceBlockProvider.java    |  25 +-
 .../provider/MultiblockStructureProvider.java |  37 +-
 .../jade/provider/ParallelProvider.java       |  83 +-
 .../provider/PrimitivePumpBlockProvider.java  |  29 +-
 .../jade/provider/RecipeLogicProvider.java    |  33 +-
 .../jade/provider/RecipeOutputProvider.java   |  43 +-
 .../jade/provider/StainedColorProvider.java   |   2 +-
 .../provider/SteamBoilerBlockProvider.java    |  32 +-
 .../provider/TransformerBlockProvider.java    |  81 +-
 .../jade/provider/WorkableBlockProvider.java  |   8 +-
 .../circuit/GTProgrammedCircuitCategory.java  |  57 --
 .../jei/multipage/MultiblockInfoWrapper.java  |  16 -
 .../GTOreProcessingInfoWrapper.java           |  16 -
 .../orevein/GTBedrockFluidInfoWrapper.java    |  16 -
 .../jei/orevein/GTBedrockOreInfoWrapper.java  |  16 -
 .../jei/orevein/GTOreVeinInfoWrapper.java     |  16 -
 .../jei/recipe/GTRecipeWrapper.java           |  17 -
 .../gtceu/integration/kjs/GTRegistryInfo.java |  46 +-
 .../integration/kjs/GregTechKubeJSPlugin.java |  45 +-
 .../kjs/builders/ElementBuilder.java          |   5 +-
 .../kjs/builders/GTRecipeCategoryBuilder.java |  13 +-
 .../kjs/builders/GTRecipeTypeBuilder.java     |  67 +-
 .../kjs/builders/WorldGenLayerBuilder.java    |   2 +-
 .../machine/KJSSteamMachineBuilder.java       |  28 +-
 .../machine/KJSTieredMachineBuilder.java      |  23 +-
 .../machine/KJSTieredMultiblockBuilder.java   |  17 +-
 .../machine/KJSWrappingMultiblockBuilder.java |  14 +-
 .../kjs/recipe/GTRecipeSchema.java            |  67 +-
 .../components/CapabilityMapComponent.java    |  10 +-
 .../kjs/recipe/components/ContentJS.java      |  19 +-
 .../recipe/components/GTRecipeComponents.java |  23 +-
 .../integration/map/GenericMapRenderer.java   |   7 +-
 .../integration/map/GroupingMapRenderer.java  |   7 +-
 .../integration/map/IWaypointHandler.java     |   3 +-
 .../integration/map/WaypointManager.java      |  26 +-
 .../map/cache/client/GTClientCache.java       |  12 +-
 .../map/cache/fluid/FluidCache.java           |   6 +-
 .../map/ftbchunks/FTBChunksRenderer.java      |  11 +-
 .../ftbchunks/FTBChunksWaypointHandler.java   |   5 +-
 .../ftbchunks/veins/fluid/FluidVeinIcon.java  |  26 +-
 .../map/ftbchunks/veins/ore/OreVeinIcon.java  |  59 +-
 .../map/journeymap/JourneymapOptions.java     |  15 +-
 .../map/journeymap/JourneymapRenderer.java    | 160 ++--
 .../journeymap/JourneymapWaypointHandler.java |   4 +-
 .../map/layer/builtin/FluidRenderLayer.java   |  25 +-
 .../map/layer/builtin/OreRenderLayer.java     |  10 +-
 .../map/xaeros/XaeroWaypointHandler.java      |   6 +-
 .../map/xaeros/XaerosRenderer.java            |   9 +-
 .../ore/OreVeinElement.java                   |  21 +-
 .../minimap/fluid/FluidChunkHighlighter.java  |   2 +-
 .../xaeros/minimap/ore/OreVeinElement.java    |  29 -
 .../minimap/ore/OreVeinElementReader.java     |   3 +-
 .../ore/OreVeinElementRenderProvider.java     |   3 +-
 .../minimap/ore/OreVeinElementRenderer.java   |  16 +-
 .../worldmap/fluid/FluidChunkHighlighter.java |  23 +-
 .../worldmap/ore/OreVeinElementReader.java    |   7 +-
 .../ore/OreVeinElementRenderProvider.java     |   9 +-
 .../worldmap/ore/OreVeinElementRenderer.java  |  21 +-
 .../modernfix/GTModernFixIntegration.java     |  20 +-
 .../recipeviewer/CategoryIcon.java            |  82 ++
 .../{ => recipeviewer}/emi/GTEMIPlugin.java   |  25 +-
 .../emi}/GTOreProcessingEmiCategory.java      |  59 +-
 .../emi/MultiblockInfoEmiCategory.java        | 129 +++
 .../emi/ProgrammedCircuitEmiCategory.java}    |  36 +-
 .../orevein/GTBedrockFluidEmiCategory.java    |  72 ++
 .../emi/orevein/GTBedrockOreEmiCategory.java  |  37 +-
 .../emi/orevein/GTOreVeinEmiCategory.java     |  76 ++
 .../emi/recipe/Ae2PatternTerminalHandler.java |   6 +-
 .../recipeviewer/emi/recipe/GTEmiRecipe.java  |  88 ++
 .../emi/recipe/GTRecipeEMICategory.java       |  10 +-
 .../{ => recipeviewer}/jei/GTJEIPlugin.java   |  48 +-
 .../jei/GTOreProcessingJeiCategory.java}      |  31 +-
 .../jei/MultiblockInfoJeiCategory.java}       |  71 +-
 .../jei/ProgrammedCircuitJeiCategory.java     |  45 +
 .../orevein/GTBedrockFluidInfoCategory.java   |  34 +-
 .../jei/orevein/GTBedrockOreInfoCategory.java |  22 +-
 .../jei/orevein/GTOreVeinInfoCategory.java    |  32 +-
 .../jei/recipe/GTRecipeJEICategory.java       |  52 +-
 .../PotionFluidSubtypeInterpreter.java        |   2 +-
 .../rei/GTOreProcessingReiCategory.java}      |  58 +-
 .../{ => recipeviewer}/rei/GTREIPlugin.java   |  27 +-
 .../rei/MultiblockInfoReiCategory.java        | 138 +++
 .../rei/ProgrammedCircuitReiCategory.java     |  46 +
 .../GTBedrockFluidDisplayCategory.java        |  81 ++
 .../orevein/GTBedrockOreDisplayCategory.java  |  86 ++
 .../rei/orevein/GTOreVeinDisplayCategory.java |  82 ++
 .../rei/recipe/GTRecipeDisplay.java           | 103 +++
 .../rei/recipe/GTRecipeREICategory.java       |  26 +-
 .../widgets/GTOreByProduct.java               |  91 +-
 .../widgets/MultiblockPreviewWidget.java      | 496 +++++++++++
 .../widgets/OreProcessingRecipeWidget.java    | 160 ++++
 .../widgets/OreVeinRecipeWidget.java          | 220 +++++
 .../ProgrammedCircuitRecipeWidget.java        |  24 +
 .../circuit/GTProgrammedCircuitCategory.java  |  70 --
 .../rei/multipage/MultiblockInfoDisplay.java  |  26 -
 .../MultiblockInfoDisplayCategory.java        |  61 --
 .../oreprocessing/GTOreProcessingDisplay.java |  26 -
 .../rei/orevein/GTBedrockFluidDisplay.java    |  30 -
 .../GTBedrockFluidDisplayCategory.java        |  73 --
 .../rei/orevein/GTBedrockOreDisplay.java      |  35 -
 .../orevein/GTBedrockOreDisplayCategory.java  |  73 --
 .../rei/orevein/GTOreVeinDisplay.java         |  34 -
 .../rei/orevein/GTOreVeinDisplayCategory.java |  72 --
 .../rei/recipe/GTRecipeDisplay.java           |  44 -
 .../xei/entry/fluid/FluidEntryList.java       |  12 -
 .../xei/entry/fluid/FluidHolderSetList.java   |  53 --
 .../xei/entry/fluid/FluidStackList.java       |  51 --
 .../xei/entry/fluid/FluidTagList.java         |  56 --
 .../xei/entry/item/ItemEntryList.java         |  12 -
 .../xei/entry/item/ItemHolderSetList.java     |  53 --
 .../xei/entry/item/ItemStackList.java         |  55 --
 .../xei/entry/item/ItemTagList.java           |  63 --
 .../fluid/CycleFluidEntryHandler.java         | 101 ---
 .../handlers/item/CycleItemEntryHandler.java  |  97 ---
 .../xei/widgets/GTOreByProductWidget.java     | 194 -----
 .../xei/widgets/GTOreVeinWidget.java          | 258 ------
 .../widgets/GTProgrammedCircuitWidget.java    |  34 -
 .../xei/widgets/GTRecipeWidget.java           | 454 ----------
 .../gregtechceu/gtceu/utils/ArrayHelpers.java | 237 ++++++
 .../gregtechceu/gtceu/utils/BlockPosUtil.java |  97 +++
 .../gtceu/utils/DummyRecipeUtils.java         |  14 +-
 .../gtceu/utils/FluidStackHashStrategy.java   | 113 ---
 .../gtceu/utils/FormattingUtil.java           |  57 +-
 .../com/gregtechceu/gtceu/utils/GTMath.java   | 178 +++-
 .../gtceu/utils/GTMatrixUtils.java            | 193 ++++-
 .../gtceu/utils/GTStringUtils.java            | 131 ++-
 .../gtceu/utils/GTTransferUtils.java          |   2 +-
 .../com/gregtechceu/gtceu/utils/GTUtil.java   | 182 +++-
 .../gtceu/utils/InfiniteEnergyContainer.java  |   2 +-
 .../gtceu/utils/OverlayedTankHandler.java     |   2 +-
 .../gregtechceu/gtceu/utils/ScopedValue.java  |  86 ++
 .../gtceu/utils/TagExprFilter.java            |  62 ++
 .../com/gregtechceu/gtceu/utils/TriState.java | 102 +++
 .../gtceu/utils/data/NBTToJsonConverter.java  |  58 ++
 .../utils/data/TagCompatibilityFixer.java     | 153 +++-
 .../utils/function/IntObjectConsumer.java     |  35 +
 .../gtceu/utils/input/SyncedKeyMapping.java   |  26 +-
 ...Listener.java => TextPressedListener.java} |   2 +-
 .../gtceu/utils/math/ParseResult.java         |  51 ++
 .../utils/math/PostfixPercentOperator.java    |  30 +
 .../gtceu/utils/math/SIPrefix.java            |  90 ++
 .../gtceu/utils/memoization/GTMemoizer.java   |  36 +
 .../utils/memoization/MemoizedSupplier.java   |  20 +-
 .../resources/META-INF/accesstransformer.cfg  |   3 +
 .../assets/gtceu/font/include/mono_space.json |  11 +
 .../assets/gtceu/font/include/monocraft.json  | 101 +++
 .../assets/gtceu/font/monocraft.json          |  16 +
 .../resources/assets/gtceu/lang/de_de.json    | 330 +++----
 .../resources/assets/gtceu/lang/ja_jp.json    | 306 +++----
 .../resources/assets/gtceu/lang/pt_br.json    | 330 +++----
 .../resources/assets/gtceu/lang/ru_ru.json    | 332 ++++----
 .../resources/assets/gtceu/lang/uk_ua.json    | 316 +++----
 .../resources/assets/gtceu/lang/zh_cn.json    | 330 +++----
 .../resources/assets/gtceu/lang/zh_tw.json    | 300 +++----
 .../gtceu/models/item/tools/shears.json       |   8 +
 .../assets/gtceu/shaders/core/black_hole.fsh  | 217 +++++
 .../gtceu/shaders/core/rendertype_bloom.fsh   |  26 +
 .../gtceu/shaders/core/rendertype_bloom.json  |  30 +
 .../gtceu/shaders/core/rendertype_bloom.vsh   |  32 +
 .../shaders/core/rendertype_entity_bloom.fsh  |  30 +
 .../shaders/core/rendertype_entity_bloom.json |  34 +
 .../shaders/core/rendertype_entity_bloom.vsh  |  40 +
 .../gtceu/shaders/post/bloom_unity.json       |  74 ++
 .../gtceu/shaders/post/bloom_unreal.json      | 157 ++++
 .../assets/gtceu/shaders/program/blur.fsh     |  43 +
 .../assets/gtceu/shaders/program/blur.json    |  21 +
 .../gtceu/shaders/program/down_sampling.fsh   |  76 ++
 .../gtceu/shaders/program/down_sampling.json  |  19 +
 .../shaders/program/filter_bloom_color.fsh    |  33 +
 .../shaders/program/filter_bloom_color.json   |  23 +
 .../gtceu/shaders/program/unity_composite.fsh |  26 +
 .../shaders/program/unity_composite.json      |  25 +
 .../shaders/program/unreal_composite.fsh      |  66 ++
 .../shaders/program/unreal_composite.json     |  29 +
 .../gtceu/shaders/program/up_sampling.fsh     |  46 +
 .../gtceu/shaders/program/up_sampling.json    |  20 +
 .../cleanroom/filter_casing.png.mcmeta        |   4 +-
 .../casings/cleanroom/plascrete.png.mcmeta    |   6 +-
 .../sterilizing_filter_casing.png.mcmeta      |   4 +-
 .../coils/machine_coil_cupronickel.png.mcmeta |   6 +-
 .../machine_coil_cupronickel_bloom.png.mcmeta |   7 +-
 ...hine_coil_cupronickel_bloom_ctm.png.mcmeta |   4 +-
 ...achine_coil_diamericium_titanium_bloom.png | Bin 2821 -> 0 bytes
 ...ne_coil_diamericium_titanium_bloom_ctm.png | Bin 2849 -> 0 bytes
 .../coils/machine_coil_hssg.png.mcmeta        |   4 +-
 .../coils/machine_coil_hssg_bloom.png.mcmeta  |   7 +-
 .../machine_coil_hssg_bloom_ctm.png.mcmeta    |   4 +-
 .../coils/machine_coil_kanthal.png.mcmeta     |   4 +-
 .../machine_coil_kanthal_bloom.png.mcmeta     |   7 +-
 .../machine_coil_kanthal_bloom_ctm.png.mcmeta |   4 +-
 ...hine_coil_molybdenum_disilicide.png.mcmeta |   4 +-
 ...oil_molybdenum_disilicide_bloom.png.mcmeta |   7 +-
 ...molybdenum_disilicide_bloom_ctm.png.mcmeta |   4 +-
 .../coils/machine_coil_naquadah.png.mcmeta    |   4 +-
 .../machine_coil_naquadah_bloom.png.mcmeta    |   7 +-
 ...machine_coil_naquadah_bloom_ctm.png.mcmeta |   4 +-
 .../coils/machine_coil_nichrome.png.mcmeta    |   4 +-
 .../machine_coil_nichrome_bloom.png.mcmeta    |   7 +-
 ...machine_coil_nichrome_bloom_ctm.png.mcmeta |   4 +-
 .../coils/machine_coil_rtm_alloy.png.mcmeta   |   4 +-
 .../machine_coil_rtm_alloy_bloom.png.mcmeta   |   7 +-
 ...achine_coil_rtm_alloy_bloom_ctm.png.mcmeta |   4 +-
 .../machine_coil_superconductor.png.mcmeta    |   4 +-
 ...chine_coil_superconductor_bloom.png.mcmeta |   7 +-
 ...e_coil_superconductor_bloom_ctm.png.mcmeta |   4 +-
 .../coils/machine_coil_trinium.png.mcmeta     |   4 +-
 .../machine_coil_trinium_bloom.png.mcmeta     |   7 +-
 .../machine_coil_trinium_bloom_ctm.png.mcmeta |   4 +-
 .../coils/machine_coil_tritanium.png.mcmeta   |   4 +-
 .../machine_coil_tritanium_bloom.png.mcmeta   |   7 +-
 ...achine_coil_tritanium_bloom_ctm.png.mcmeta |   4 +-
 .../machine_coil_tungstensteel.png.mcmeta     |   4 +-
 ...achine_coil_tungstensteel_bloom.png.mcmeta |   7 +-
 ...ne_coil_tungstensteel_bloom_ctm.png.mcmeta |   4 +-
 .../machine_casing_firebox_bronze.png.mcmeta  |   4 +-
 .../machine_casing_firebox_steel.png.mcmeta   |   4 +-
 ...machine_casing_firebox_titanium.png.mcmeta |   4 +-
 ...ne_casing_firebox_tungstensteel.png.mcmeta |   4 +-
 .../casings/fusion/fusion_casing.png.mcmeta   |   4 +-
 .../fusion/fusion_casing_bloom.png.mcmeta     |   7 +-
 .../fusion/fusion_casing_mk2.png.mcmeta       |   4 +-
 .../fusion/fusion_casing_mk3.png.mcmeta       |   4 +-
 .../fusion/superconducting_coil.png.mcmeta    |   4 +-
 .../superconducting_coil_bloom.png.mcmeta     |   7 +-
 .../superconducting_coil_bloom_ctm.png.mcmeta |   4 +-
 .../casings/gcym/atomic_casing.png.mcmeta     |   4 +-
 .../gcym/corrosion_proof_casing.png.mcmeta    |   4 +-
 ...igh_temperature_smelting_casing.png.mcmeta |   4 +-
 .../gcym/industrial_steam_casing.png.mcmeta   |   4 +-
 .../large_scale_assembling_casing.png.mcmeta  |   4 +-
 .../laser_safe_engraving_casing.png.mcmeta    |   4 +-
 .../gcym/nonconducting_casing.png.mcmeta      |   4 +-
 .../reaction_safe_mixing_casing.png.mcmeta    |   4 +-
 .../gcym/secure_maceration_casing.png.mcmeta  |   4 +-
 .../shock_proof_cutting_casing.png.mcmeta     |   4 +-
 .../casings/gcym/sifter_casing.png.mcmeta     |   4 +-
 .../gcym/stress_proof_casing.png.mcmeta       |   4 +-
 .../gcym/vibration_safe_casing.png.mcmeta     |   4 +-
 .../casings/gcym/watertight_casing.png.mcmeta |   4 +-
 .../advanced_computer_casing/back.png.mcmeta  |   4 +-
 .../bottom.png.mcmeta                         |   4 +-
 .../advanced_computer_casing/front.png.mcmeta |   4 +-
 .../advanced_computer_casing/side.png.mcmeta  |   4 +-
 .../advanced_computer_casing/top.png.mcmeta   |   4 +-
 .../hpca/computer_casing/back.png.mcmeta      |   4 +-
 .../hpca/computer_casing/bottom.png.mcmeta    |   4 +-
 .../hpca/computer_casing/front.png.mcmeta     |   4 +-
 .../hpca/computer_casing/side.png.mcmeta      |   4 +-
 .../hpca/computer_casing/top.png.mcmeta       |   4 +-
 .../hpca/computer_heat_vent_side.png.mcmeta   |   4 +-
 .../computer_heat_vent_top_bot.png.mcmeta     |   4 +-
 .../casings/hpca/high_power_casing.png.mcmeta |   4 +-
 ...hine_casing_assembly_line_bloom.png.mcmeta |   5 +-
 ..._casing_turbine_stainless_steel.png.mcmeta |   4 +-
 .../machine_casing_turbine_steel.png.mcmeta   |   4 +-
 ...machine_casing_turbine_titanium.png.mcmeta |   4 +-
 ...ne_casing_turbine_tungstensteel.png.mcmeta |   4 +-
 .../signs/machine_casing_stripes_a.png.mcmeta |   4 +-
 .../signs/machine_casing_stripes_b.png.mcmeta |   4 +-
 .../signs/machine_casing_stripes_c.png.mcmeta |   4 +-
 .../signs/machine_casing_stripes_d.png.mcmeta |   4 +-
 .../casings/slicing_blades/bottom.png.mcmeta  |   4 +-
 .../casings/slicing_blades/side.png.mcmeta    |   4 +-
 .../casings/slicing_blades/top.png.mcmeta     |   4 +-
 ...ine_casing_bronze_plated_bricks.png.mcmeta |   4 +-
 ...ne_casing_clean_stainless_steel.png.mcmeta |   4 +-
 .../machine_casing_frost_proof.png.mcmeta     |   4 +-
 .../solid/machine_casing_heatproof.png.mcmeta |   4 +-
 .../machine_casing_inert_ptfe.png.mcmeta      |   4 +-
 ...ine_casing_palladium_substation.png.mcmeta |   4 +-
 ...ine_casing_robust_tungstensteel.png.mcmeta |   4 +-
 .../machine_casing_solid_steel.png.mcmeta     |   4 +-
 .../machine_casing_stable_titanium.png.mcmeta |   4 +-
 ...ne_casing_stainless_evaporation.png.mcmeta |   4 +-
 .../machine_casing_sturdy_hsse.png.mcmeta     |   4 +-
 ...achine_casing_sturdy_hsse_green.png.mcmeta |   4 +-
 .../transparent/cleanroom_glass.png.mcmeta    |   4 +-
 .../transparent/fusion_glass.png.mcmeta       |   4 +-
 .../transparent/laminated_glass.png.mcmeta    |   4 +-
 .../transparent/tempered_glass.png.mcmeta     |   4 +-
 .../casings/unique/crushing_wheels.png.mcmeta |   4 +-
 .../unique/crushing_wheels_active.png.mcmeta  |   4 +-
 .../casings/unique/heat_vent_bloom.png.mcmeta |   2 +-
 .../casings/unique/slicing_blades.png.mcmeta  |   4 +-
 .../unique/slicing_blades_active.png.mcmeta   |   4 +-
 .../assets/gtceu/textures/block/ctm_test.png  | Bin 0 -> 318 bytes
 .../gtceu/textures/block/ctm_test.png.mcmeta  |   5 +
 .../gtceu/textures/block/ctm_test_ctm.png     | Bin 0 -> 812 bytes
 .../block/lamps/black_bloom.png.mcmeta        |   9 +-
 .../block/lamps/black_bloom_ctm.png.mcmeta    |   4 +-
 .../lamps/black_borderless_bloom.png.mcmeta   |   4 +-
 .../lamps/black_borderless_on.png.mcmeta      |   4 +-
 .../textures/block/lamps/black_off.png.mcmeta |   6 +-
 .../textures/block/lamps/black_on.png.mcmeta  |   8 +-
 .../block/lamps/black_on_ctm.png.mcmeta       |   4 +-
 .../block/lamps/blue_bloom.png.mcmeta         |   8 +-
 .../block/lamps/blue_bloom_ctm.png.mcmeta     |   4 +-
 .../lamps/blue_borderless_bloom.png.mcmeta    |   4 +-
 .../block/lamps/blue_borderless_on.png.mcmeta |   4 +-
 .../textures/block/lamps/blue_off.png.mcmeta  |   6 +-
 .../textures/block/lamps/blue_on.png.mcmeta   |   8 +-
 .../block/lamps/blue_on_ctm.png.mcmeta        |   4 +-
 .../block/lamps/brown_bloom.png.mcmeta        |   8 +-
 .../block/lamps/brown_bloom_ctm.png.mcmeta    |   4 +-
 .../lamps/brown_borderless_bloom.png.mcmeta   |   4 +-
 .../lamps/brown_borderless_on.png.mcmeta      |   4 +-
 .../textures/block/lamps/brown_off.png.mcmeta |   6 +-
 .../textures/block/lamps/brown_on.png.mcmeta  |   8 +-
 .../block/lamps/brown_on_ctm.png.mcmeta       |   4 +-
 .../block/lamps/cyan_bloom.png.mcmeta         |   8 +-
 .../block/lamps/cyan_bloom_ctm.png.mcmeta     |   4 +-
 .../lamps/cyan_borderless_bloom.png.mcmeta    |   4 +-
 .../block/lamps/cyan_borderless_on.png.mcmeta |   4 +-
 .../textures/block/lamps/cyan_off.png.mcmeta  |   6 +-
 .../textures/block/lamps/cyan_on.png.mcmeta   |   8 +-
 .../block/lamps/cyan_on_ctm.png.mcmeta        |   4 +-
 .../block/lamps/gray_bloom.png.mcmeta         |   8 +-
 .../block/lamps/gray_bloom_ctm.png.mcmeta     |   4 +-
 .../lamps/gray_borderless_bloom.png.mcmeta    |   4 +-
 .../block/lamps/gray_borderless_on.png.mcmeta |   4 +-
 .../textures/block/lamps/gray_off.png.mcmeta  |   6 +-
 .../textures/block/lamps/gray_on.png.mcmeta   |   8 +-
 .../block/lamps/gray_on_ctm.png.mcmeta        |   4 +-
 .../block/lamps/green_bloom.png.mcmeta        |   8 +-
 .../block/lamps/green_bloom_ctm.png.mcmeta    |   4 +-
 .../lamps/green_borderless_bloom.png.mcmeta   |   4 +-
 .../lamps/green_borderless_on.png.mcmeta      |   4 +-
 .../block/lamps/green_ctm_on.png.mcmeta       |   4 +-
 .../textures/block/lamps/green_off.png.mcmeta |   6 +-
 .../textures/block/lamps/green_on.png.mcmeta  |   8 +-
 .../block/lamps/light_blue_bloom.png.mcmeta   |   8 +-
 .../lamps/light_blue_bloom_ctm.png.mcmeta     |   4 +-
 .../light_blue_borderless_bloom.png.mcmeta    |   4 +-
 .../lamps/light_blue_borderless_on.png.mcmeta |   4 +-
 .../block/lamps/light_blue_off.png.mcmeta     |   6 +-
 .../block/lamps/light_blue_on.png.mcmeta      |   8 +-
 .../block/lamps/light_blue_on_ctm.png.mcmeta  |   4 +-
 .../block/lamps/light_gray_bloom.png.mcmeta   |   8 +-
 .../lamps/light_gray_bloom_ctm.png.mcmeta     |   4 +-
 .../light_gray_borderless_bloom.png.mcmeta    |   4 +-
 .../lamps/light_gray_borderless_on.png.mcmeta |   4 +-
 .../block/lamps/light_gray_off.png.mcmeta     |   6 +-
 .../block/lamps/light_gray_on.png.mcmeta      |   8 +-
 .../block/lamps/light_gray_on_ctm.png.mcmeta  |   4 +-
 .../block/lamps/lime_bloom.png.mcmeta         |   8 +-
 .../block/lamps/lime_bloom_ctm.png.mcmeta     |   4 +-
 .../lamps/lime_borderless_bloom.png.mcmeta    |   4 +-
 .../block/lamps/lime_borderless_on.png.mcmeta |   4 +-
 .../textures/block/lamps/lime_off.png.mcmeta  |   6 +-
 .../textures/block/lamps/lime_on.png.mcmeta   |   8 +-
 .../block/lamps/lime_on_ctm.png.mcmeta        |   4 +-
 .../block/lamps/magenta_bloom.png.mcmeta      |   8 +-
 .../block/lamps/magenta_bloom_ctm.png.mcmeta  |   4 +-
 .../lamps/magenta_borderless_bloom.png.mcmeta |   4 +-
 .../lamps/magenta_borderless_on.png.mcmeta    |   4 +-
 .../block/lamps/magenta_ctm.png.mcmeta        |   4 +-
 .../block/lamps/magenta_off.png.mcmeta        |   6 +-
 .../block/lamps/magenta_on.png.mcmeta         |   8 +-
 .../block/lamps/orange_bloom.png.mcmeta       |   8 +-
 .../block/lamps/orange_bloom_ctm.png.mcmeta   |   4 +-
 .../lamps/orange_borderless_bloom.png.mcmeta  |   4 +-
 .../block/lamps/orange_borderless_on.png      | Bin 244 -> 189 bytes
 .../lamps/orange_borderless_on.png.mcmeta     |   4 +-
 .../block/lamps/orange_ctm_on.png.mcmeta      |   4 +-
 .../block/lamps/orange_off.png.mcmeta         |   6 +-
 .../textures/block/lamps/orange_on.png.mcmeta |   8 +-
 .../block/lamps/pink_bloom.png.mcmeta         |   8 +-
 .../block/lamps/pink_bloom_ctm.png.mcmeta     |   4 +-
 .../lamps/pink_borderless_bloom.png.mcmeta    |   4 +-
 .../block/lamps/pink_borderless_on.png.mcmeta |   4 +-
 .../textures/block/lamps/pink_off.png.mcmeta  |   6 +-
 .../textures/block/lamps/pink_on.png.mcmeta   |   8 +-
 .../block/lamps/pink_on_ctm.png.mcmeta        |   4 +-
 .../block/lamps/purple_bloom.png.mcmeta       |   8 +-
 .../block/lamps/purple_bloom_ctm.png.mcmeta   |   4 +-
 .../lamps/purple_borderless_bloom.png.mcmeta  |   4 +-
 .../lamps/purple_borderless_on.png.mcmeta     |   4 +-
 .../block/lamps/purple_off.png.mcmeta         |   6 +-
 .../textures/block/lamps/purple_on.png.mcmeta |   8 +-
 .../block/lamps/purple_on_ctm.png.mcmeta      |   4 +-
 .../textures/block/lamps/red_bloom.png.mcmeta |   8 +-
 .../block/lamps/red_bloom_ctm.png.mcmeta      |   4 +-
 .../lamps/red_borderless_bloom.png.mcmeta     |   4 +-
 .../block/lamps/red_borderless_on.png.mcmeta  |   4 +-
 .../textures/block/lamps/red_off.png.mcmeta   |   6 +-
 .../textures/block/lamps/red_on.png.mcmeta    |   8 +-
 .../block/lamps/red_on_ctm.png.mcmeta         |   4 +-
 .../block/lamps/white_bloom.png.mcmeta        |   8 +-
 .../block/lamps/white_bloom_ctm.png.mcmeta    |   4 +-
 .../lamps/white_borderless_bloom.png.mcmeta   |   4 +-
 .../lamps/white_borderless_on.png.mcmeta      |   4 +-
 .../textures/block/lamps/white_off.png.mcmeta |   6 +-
 .../textures/block/lamps/white_on.png.mcmeta  |   8 +-
 .../block/lamps/white_on_ctm.png.mcmeta       |   4 +-
 .../block/lamps/yellow_bloom.png.mcmeta       |   8 +-
 .../block/lamps/yellow_bloom_ctm.png.mcmeta   |   4 +-
 .../lamps/yellow_borderless_bloom.png.mcmeta  |   4 +-
 .../lamps/yellow_borderless_on.png.mcmeta     |   4 +-
 .../block/lamps/yellow_off.png.mcmeta         |   6 +-
 .../textures/block/lamps/yellow_on.png.mcmeta |   8 +-
 .../block/lamps/yellow_on_ctm.png.mcmeta      |   4 +-
 .../overlay_front.png                         | Bin 5718 -> 0 bytes
 .../overlay_front_active.png                  | Bin 10058 -> 0 bytes
 .../overlay_front_active.png.mcmeta           |  10 -
 .../overlay_front_active_emissive.png         | Bin 312 -> 0 bytes
 .../overlay_front_active_emissive.png.mcmeta  |  10 -
 .../overlay_front_emissive.png                | Bin 219 -> 0 bytes
 .../overlay_front_paused.png                  | Bin 571 -> 0 bytes
 .../overlay_front_paused_emissive.png         | Bin 569 -> 0 bytes
 .../processing_array/overlay_front.png        | Bin 5718 -> 0 bytes
 .../processing_array/overlay_front_active.png | Bin 10058 -> 0 bytes
 .../overlay_front_active.png.mcmeta           |  10 -
 .../overlay_front_active_emissive.png         | Bin 312 -> 0 bytes
 .../overlay_front_active_emissive.png.mcmeta  |  10 -
 .../overlay_front_emissive.png                | Bin 219 -> 0 bytes
 .../processing_array/overlay_front_paused.png | Bin 571 -> 0 bytes
 .../overlay_front_paused_emissive.png         | Bin 569 -> 0 bytes
 .../machine/overlay_monitor.png.mcmeta        |   4 +-
 .../ld_fluid_pipe/overlay_emissive.png.mcmeta |   5 +-
 .../ld_item_pipe/overlay_emissive.png.mcmeta  |   5 +-
 .../assets/gtceu/textures/font/LICENSE.txt    |  86 ++
 .../assets/gtceu/textures/font/ascii_mono.png | Bin 0 -> 6524 bytes
 .../textures/font/nonlatin_european_mono.png  | Bin 0 -> 15742 bytes
 .../gtceu/textures/gui/base/background.png    | Bin 193 -> 150 bytes
 .../textures/gui/base/background_bronze.png   | Bin 848 -> 231 bytes
 .../textures/gui/base/background_steel.png    | Bin 839 -> 231 bytes
 .../textures/gui/base/bordered_background.png | Bin 536 -> 463 bytes
 .../gui/base/title_bar_background.png         | Bin 171 -> 139 bytes
 .../textures/gui/cursor/cursor_resize.png     | Bin 0 -> 634 bytes
 .../gui/cursor/cursor_resize_diag.png         | Bin 0 -> 651 bytes
 .../gui/icon/seperator/seperator_simple.png   | Bin 0 -> 100 bytes
 .../gtceu/textures/gui/overlay/mode_eu.png    | Bin 0 -> 128 bytes
 .../textures/gui/overlay/mode_percent.png     | Bin 0 -> 134 bytes
 .../textures/gui/overlay/redstone_off.png     | Bin 0 -> 158 bytes
 .../textures/gui/overlay/redstone_on.png      | Bin 0 -> 193 bytes
 .../gui/overlay/transfer_mode_overlay.png     | Bin 0 -> 378 bytes
 .../progress_bar_hammer_base_bronze.png       | Bin 628 -> 542 bytes
 .../progress_bar_hammer_base_steel.png        | Bin 627 -> 542 bytes
 .../assets/gtceu/textures/gui/slot/item.png   | Bin 0 -> 96 bytes
 .../gtceu/textures/gui/tab/tabs_bottom.png    | Bin 555 -> 0 bytes
 .../gtceu/textures/gui/tab/tabs_left.png      | Bin 648 -> 0 bytes
 .../gtceu/textures/gui/tab/tabs_right.png     | Bin 606 -> 0 bytes
 .../gtceu/textures/gui/tab/tabs_top.png       | Bin 571 -> 0 bytes
 .../textures/gui/widget/steam_dial_bronze.png | Bin 0 -> 580 bytes
 .../textures/gui/widget/steam_dial_steel.png  | Bin 0 -> 524 bytes
 .../{plugin.fake_gui.png => gui_module.png}   | Bin
 .../gtceu/textures/item/plugin.online_pic.png | Bin 1747 -> 0 bytes
 .../gtceu/textures/item/plugin.text.png       | Bin 2921 -> 0 bytes
 .../gtceu/textures/item/tools/shears.png      | Bin 0 -> 4284 bytes
 .../gtceu/textures/item/tools/shears_base.png | Bin 0 -> 252 bytes
 .../textures/item/tools/shears_overlay.png    | Bin 0 -> 170 bytes
 .../gtceu/ui/recipe_type/forge_hammer.rtui    | Bin 7924 -> 0 bytes
 .../assets/gtceu/ui/recipe_type/lathe.rtui    | Bin 9122 -> 0 bytes
 .../data/curios/tags/items/gtceu_magnet.json  |   2 +-
 src/main/resources/gtceu.mixins.json          |  30 +-
 src/main/templates/META-INF/mods.toml         |  12 -
 .../api/machine/trait/RecipeLogicTest.java    |   4 +-
 .../gtceu/api/recipe/InputSeparationTest.java |   2 +-
 .../api/recipe/MultipleEnergyHatchTest.java   |   2 +-
 .../gtceu/api/recipe/OverclockLogicTest.java  |   6 +-
 .../IntProviderFluidIngredientTest.java       | 155 ++--
 .../ingredient/IntProviderIngredientTest.java | 164 ++--
 .../recipe/ingredient/NBTPredicateTest.java   |   2 +-
 .../api/recipe/lookup/GTRecipeLookupTest.java |   4 +-
 .../capability/MedicalConditionTest.java      |   5 +-
 .../cover/AdvancedDetectorCoverTest.java      |   2 +-
 .../gtceu/common/cover/SolarPanelTest.java    |  48 --
 .../electric/AssemblyLineTests.java           |  20 +-
 .../electric/ResearchComputationTests.java    | 225 +++++
 .../condition/AdjacentFluidConditionTest.java |   2 +-
 .../stresstest/RecipeIteratorStressTest.java  |   2 +-
 .../gtceu/gametest/util/TestUtils.java        |  24 +-
 .../ae2/machine/PatternBufferTest.java        |  11 +-
 .../gtceu/structures/ass_line_4aev_4in.nbt    | Bin 1299 -> 1317 bytes
 .../data/gtceu/structures/central_monitor.nbt | Bin 1816 -> 1801 bytes
 .../data/gtceu/structures/electrolyzer.nbt    | Bin 1207 -> 1234 bytes
 .../gtceu/structures/energy/hpca_overload.nbt | Bin 0 -> 1416 bytes
 .../gtceu/structures/energy/lcr_16a_4a_ev.nbt | Bin 1059 -> 1076 bytes
 .../gtceu/structures/energy/lcr_16a_ev.nbt    | Bin 1034 -> 1048 bytes
 .../gtceu/structures/energy/lcr_16a_ev_hv.nbt | Bin 1062 -> 1080 bytes
 .../gtceu/structures/energy/lcr_2x_ev.nbt     | Bin 1032 -> 1044 bytes
 .../gtceu/structures/energy/lcr_4a_ev.nbt     | Bin 1032 -> 1045 bytes
 .../gtceu/structures/energy/lcr_ev_hv.nbt     | Bin 1048 -> 1061 bytes
 .../gtceu/structures/energy/lcr_ev_mv.nbt     | Bin 1047 -> 1060 bytes
 .../gtceu/structures/energy/lcr_iv_16a_ev.nbt | Bin 1060 -> 1078 bytes
 .../resources/data/gtceu/structures/hpca.nbt  | Bin 0 -> 1409 bytes
 .../data/gtceu/structures/hpca_overload.nbt   | Bin 0 -> 1416 bytes
 .../large_centrifuge_zpm_batch_parallel16.nbt | Bin 1354 -> 1378 bytes
 .../resources/data/gtceu/structures/lcr.nbt   | Bin 999 -> 1005 bytes
 .../gtceu/structures/lcr_input_separation.nbt | Bin 1097 -> 1119 bytes
 .../structures/lcr_ranged_ingredients.nbt     | Bin 1136 -> 1160 bytes
 .../gtceu/structures/patternbuffertest.nbt    | Bin 2092 -> 2106 bytes
 .../gtceu/structures/research_computer.nbt    | Bin 0 -> 1705 bytes
 .../structures/research_computer_and_hpca.nbt | Bin 0 -> 2421 bytes
 .../structures/singleblock_chem_reactor.nbt   | Bin 794 -> 803 bytes
 .../resources/data/gtceu/structures/solar.nbt | Bin 848 -> 0 bytes
 1511 files changed, 53444 insertions(+), 38593 deletions(-)
 create mode 100644 .github/workflows/log-commits-version-sync.yml
 create mode 100644 AI_POLICY.md
 create mode 100644 docs/content/Development/MUI2/Layout_MainAxisAlignments.png
 create mode 100644 docs/content/Development/MUI2/Syncing/Sync-Basics.md
 create mode 100644 docs/content/Development/MUI2/Syncing/Sync-Handlers.md
 create mode 100644 docs/content/Development/MUI2/Syncing/Synced-Actions.md
 create mode 100644 docs/content/Development/MUI2/Syncing/index.md
 create mode 100644 docs/content/Development/MUI2/Test-Machine.md
 create mode 100644 docs/content/Development/MUI2/Widget-Layout.md
 create mode 100644 docs/content/Development/MUI2/index.md
 create mode 100644 docs/content/Modpacks/Examples/Example_Coil_Multiblock.md
 create mode 100644 docs/content/Modpacks/Examples/Example_Steam_Multiblock.md
 create mode 100644 docs/content/Modpacks/Examples/Example_Turbine.md
 create mode 100644 docs/content/Modpacks/Examples/Greenhouse.md
 create mode 100644 docs/content/Modpacks/Multiblocks/PartAbility.md
 create mode 100644 docs/content/Modpacks/Multiblocks/PatternError.md
 create mode 100644 docs/content/Modpacks/Multiblocks/Patterns.md
 create mode 100644 docs/content/Modpacks/Multiblocks/Predicates.md
 create mode 100644 docs/content/Modpacks/Multiblocks/StructureChecking.md
 create mode 100644 docs/content/Modpacks/Other-Topics/Connected-Textures.md
 create mode 100644 docs/content/Modpacks/Other-Topics/Dimension-Icons.md
 create mode 100644 docs/content/Modpacks/Other-Topics/Dynamic-Renders.md
 create mode 100644 src/generated/resources/assets/gtceu/blockstates/ctm_test.json
 create mode 100644 src/generated/resources/assets/gtceu/blockstates/test_mui.json
 create mode 100644 src/generated/resources/assets/gtceu/models/block/ctm_test.json
 create mode 100644 src/generated/resources/assets/gtceu/models/block/machine/test_mui.json
 create mode 100644 src/generated/resources/assets/gtceu/models/item/ctm_test.json
 create mode 100644 src/generated/resources/assets/gtceu/models/item/gui_module.json
 create mode 100644 src/generated/resources/assets/gtceu/models/item/test_mui.json
 create mode 100644 src/generated/resources/data/forge/tags/blocks/mineable/shears.json
 create mode 100644 src/generated/resources/data/minecraft/tags/items/music_discs.json
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/block/RendererMaterialBlock.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/cover/IMuiCover.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/cover/IUICover.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/IMaterialRegistryManager.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/event/MaterialRegistryEvent.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/GuiTextures.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/SteamTexture.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/UITemplate.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/WidgetUtils.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/editor/EditableMachineUI.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/editor/EditableUI.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/editor/GTUIEditor.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/editor/IEditableUI.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/editor/MachineUIProject.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/editor/RecipeTypeUIProject.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/editor/TemplateTab.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/editor/UIMainPanel.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/factory/CoverUIFactory.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/factory/GTUIEditorFactory.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/factory/MachineUIFactory.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/fancy/ConfiguratorPanel.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/fancy/FancyMachineUIWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/fancy/IFancyConfigurator.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/fancy/IFancyConfiguratorButton.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/fancy/IFancyCustomClientActionHandler.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/fancy/IFancyCustomMiddleClickAction.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/fancy/IFancyCustomMouseWheelAction.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/fancy/IFancyTooltip.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/fancy/IFancyUIProvider.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/fancy/PageSwitcher.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/fancy/TabsWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/fancy/TitleBarWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/fancy/TooltipsPanel.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/fancy/VerticalTabsWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/misc/IGhostFluidTarget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/misc/IGhostItemTarget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/misc/PacketProspecting.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/texture/ProspectingTexture.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/util/TimedProgressSupplier.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/widget/BlockableSlotWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/widget/ColorBlockWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/widget/ConfirmTextInputWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/widget/CoverConfigurator.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/widget/DualProgressWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/widget/EnumSelectorWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/widget/ExtendedProgressWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/widget/GhostCircuitSlotWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/widget/IntInputWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/widget/LongInputWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/widget/NumberInputWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/widget/PatternPreviewSlotWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/widget/PatternPreviewWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/widget/PhantomFluidWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/widget/PhantomSlotWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/widget/PredicatedButtonWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/widget/PredicatedImageWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/widget/ProspectingMapWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/widget/ScrollablePhantomFluidWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/widget/SlotWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/widget/TankWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/widget/ToggleButtonWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/CombinedDirectionalConfigurator.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/IDirectionalConfigHandler.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputFluidConfigHandler.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputItemConfigHandler.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/CoverableConfigHandler.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/item/component/ICustomRenderer.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/item/component/IItemUIFactory.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/item/component/prospector/ProspectingUpdatePacket.java
 rename src/main/java/com/gregtechceu/gtceu/api/{gui/misc => item/component/prospector}/ProspectorMode.java (52%)
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/MachineInstanceFactory.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/AutoStockingFancyConfigurator.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/ButtonConfigurator.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CircuitFancyConfigurator.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CombinedDirectionalFancyConfigurator.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/FancyInvConfigurator.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/FancySelectorConfigurator.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/FancyTankConfigurator.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/MachineModeFancyConfigurator.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/IDropSaveMachine.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/IFancyUIMachine.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/IHasCircuitSlot.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMuiMachine.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/IUIMachine.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IDisplayUIMachine.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMaintenanceMachine.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMultiPart.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IWorkableMultiController.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/mui/MachineUIPanel.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/mui/MachineUIPanelBuilder.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeAmperageEnergyContainer.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IAttachConfiguratorsTrait.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRecipeLogicModifierTrait.java
 rename src/main/java/com/gregtechceu/gtceu/api/machine/trait/{ => notifiable}/NotifiableComputationContainer.java (91%)
 rename src/main/java/com/gregtechceu/gtceu/api/machine/trait/{ => notifiable}/NotifiableEnergyContainer.java (97%)
 rename src/main/java/com/gregtechceu/gtceu/api/machine/trait/{ => notifiable}/NotifiableFluidTank.java (91%)
 rename src/main/java/com/gregtechceu/gtceu/api/machine/trait/{ => notifiable}/NotifiableItemStackHandler.java (94%)
 rename src/main/java/com/gregtechceu/gtceu/api/machine/trait/{ => notifiable}/NotifiableLaserContainer.java (96%)
 rename src/main/java/com/gregtechceu/gtceu/api/machine/trait/{ => notifiable}/NotifiableRecipeHandlerTrait.java (83%)
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/package-info.java
 rename src/main/java/com/gregtechceu/gtceu/api/machine/trait/{ => recipe}/IRecipeHandlerTrait.java (87%)
 rename src/main/java/com/gregtechceu/gtceu/api/machine/trait/{ => recipe}/RecipeHandlerGroup.java (68%)
 rename src/main/java/com/gregtechceu/gtceu/api/machine/trait/{ => recipe}/RecipeHandlerGroupColor.java (80%)
 rename src/main/java/com/gregtechceu/gtceu/api/machine/trait/{ => recipe}/RecipeHandlerGroupDistinctness.java (67%)
 rename src/main/java/com/gregtechceu/gtceu/api/machine/trait/{ => recipe}/RecipeHandlerList.java (95%)
 rename src/main/java/com/gregtechceu/gtceu/api/machine/trait/{ => recipe}/RecipeLogic.java (90%)
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/package-info.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/misc/forge/FluidTankHandler.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/package-info.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/package-info.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/mui/GTGuiScreen.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/mui/IItemUIHolder.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/mui/MultiblockSchemaInfo.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/mui/SteamTextureSet.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/mui/factory/CoverUIFactory.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/mui/factory/MachineUIFactory.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/mui/factory/PanelEditor.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/mui/factory/PanelFactory.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/MultiblockWorldSavedData.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/OriginOffset.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/PatternPredicate.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/Predicates.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/error/BlockMatchingError.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/error/CoilMatchingError.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/error/FilterMatchingError.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/error/GTPatternErrors.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/error/PartAbilityError.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/error/PatternError.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/error/PatternErrorUI.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/error/PatternStringError.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/error/PlaceholderError.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/error/SimplePatternError.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/error/SinglePredicateError.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/error/package-info.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/package-info.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/BasicSliceStrategy.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/BlockPattern.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/CurrentBlockInfo.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/ExpandableMultiblockPatternBuilder.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/ExpandablePattern.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/IBlockPattern.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/IStructureChangeIgnored.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/MultiblockPatternBuilder.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/PatternSlice.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/PatternState.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/SliceStrategy.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/package-info.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/BasePredicate.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/PredicateBlockTag.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/PredicateBlocks.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/PredicateFluidTag.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/PredicateFluids.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/PredicatePartAbility.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/PredicateStates.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/package-info.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/util/AbstractStructureHelper.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/util/BlockInfo.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/util/BlockPatternHelper.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/util/ExpandablePatternHelper.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/util/RelativeDirection.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/multiblock/util/package-info.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/pattern/BlockPattern.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/pattern/FactoryBlockPattern.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockShapeInfo.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockState.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockWorldSavedData.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/pattern/Predicates.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/pattern/TraceabilityPredicate.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/pattern/error/PatternError.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/pattern/error/PatternStringError.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/pattern/error/SinglePredicateError.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/PredicateBlockTag.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/PredicateBlocks.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/PredicateFluidTag.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/PredicateFluids.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/PredicateStates.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/SimplePredicate.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/pattern/util/PatternMatchContext.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/pattern/util/RelativeDirection.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/recipe/chance/boost/ChanceBoostFunction.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/recipe/gui/CapabilityContentBuilder.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/recipe/gui/ContentOverlay.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/recipe/gui/GTRecipeTypeMachineWidget.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/recipe/gui/GTRecipeTypeUILayout.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/recipe/gui/GTRecipeViewerWidget.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/recipe/gui/MachineCapabilityLayoutBuilder.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/recipe/gui/ProgressBarTextureSet.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/recipe/gui/RecipeUIModifier.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/recipe/gui/RecipeViewerCapabilityLayoutBuilder.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/recipe/gui/package-info.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/recipe/ui/GTRecipeTypeUI.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/FieldSyncHandler.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/ISyncAnnotated.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/SyncAnnotatedTransformer.java
 rename src/main/java/com/gregtechceu/gtceu/api/sync_system/{ => managed}/ISyncManaged.java (77%)
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/managed/ManagedSavedData.java
 rename src/main/java/com/gregtechceu/gtceu/api/sync_system/{ => managed}/ManagedSyncBlockEntity.java (89%)
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/managed/ManagedSyncEntityBlock.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/api/sync_system/managed/package-info.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/CharTypedEvent.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/EarlyKeyPressEvent.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/GuiSpriteManager.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/ModClientEventListener.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/bloom/BloomHandler.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/bloom/BloomRenderTicket.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/bloom/BloomRenderer.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/bloom/BloomType.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/bloom/EffectRenderContext.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/bloom/IBloomEffect.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/bloom/IRenderSetup.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/bloom/package-info.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/bloom/particle/GTBloomParticle.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMMeshBuilder.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/ctm/ConnectionCheck.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/ctm/GTTextureMetadata.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/ctm/ISubmap.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/ctm/OctagonalOrientation.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/ctm/Submap.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/ctm/TextureConnections.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/ctm/package-info.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/quad/EncodingFormat.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/quad/Mesh.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/quad/MeshBuilder.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/quad/MutableQuadView.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/quad/QuadView.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/quad/SpriteFinder.java
 rename src/main/java/com/gregtechceu/gtceu/client/{util => model/quad}/StaticFaceBakery.java (85%)
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/quad/package-info.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/quad/transform/QuadTransform.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/mui/schema/MutableSchema.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/particle/package-info.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/renderer/AABBHighlightRenderer.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/client/renderer/MultiblockInWorldPreviewRenderer.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/renderer/PatternPreviewRenderer.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/renderer/monitor/MonitorGuiRenderer.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/BloomUtils.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/DrawUtil.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/FakeBlockTintGetter.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/ModelEventHelper.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/ModelUtils.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/PoseStackExtensions.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/SpriteFunctionWrapper.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/TextureHelper.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/package-info.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/quad/GeometryHelper.java
 rename src/main/java/com/gregtechceu/gtceu/client/util/{ => quad/transformers}/GTQuadTransformers.java (73%)
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/InterpolationHelper.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadCornerKicker.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadPositionForcer.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadReInterpolator.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadTinter.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/cover/ender/package-info.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/data/GTMenuTypes.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/data/blocks/GTDevBlocks.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/data/materials/AlloyBlastPropertyAddition.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/common/datafixers/TagFixer.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/item/modules/GuiModuleBehaviour.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/ShearBehavior.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/machine/GTMachineInstanceFactories.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/common/machine/electric/RockCrusherMachine.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/machine/mui/TestMuiMachine.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/gcym/LargeChemicalBathMachine.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/gcym/LargeMixerMachine.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/testmultis/PCBFactoryMachine.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCABridgePartMachine.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComputationPartMachine.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCACoolerPartMachine.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAEmptyPartMachine.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveFancyUIWorkableMachine.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/machine/trait/BatterySlotTrait.java
 rename src/main/java/com/gregtechceu/gtceu/{api => common}/machine/trait/FluidTankProxyTrait.java (89%)
 rename src/main/java/com/gregtechceu/gtceu/{api => common}/machine/trait/ItemHandlerProxyTrait.java (91%)
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/machine/trait/ProgrammableCircuitSlotTrait.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/mui/GTByteBufAdapters.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/mui/GTGuiTextures.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/mui/GTGuiTheme.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiCoverUtil.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiMachineUtil.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiWidgets.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/mui/GTMultiblockTextUtil.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/mui/GTSingleblockMachinePanels.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/mui/drawable/BorderDrawable.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/mui/drawable/CycleDrawable.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/mui/factory/CentralMonitorUIFactory.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/mui/package-info.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/mui/widgets/PopupPanel.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/mui/widgets/SimpleDialog.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/mui/widgets/SteamDialWidget.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapHandler.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/mui/widgets/textfield/CodeEditorWidget.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/mui/widgets/textfield/TextEditorWidget.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/network/packets/SPacketStartProspectionShare.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/common/recipe/gui/GTRecipeUIModifiers.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/common/unification/material/MaterialRegistryImpl.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/common/unification/material/MaterialRegistryManager.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/IGameRenderer.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/config/GTEarlyConfig.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/config/Option.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/config/package-info.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/BeehiveBlockAccessor.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/BlockStateAccessor.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/ReloadableResourceManagerAccessor.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/ServerChunkProviderMixin.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/TransientCraftingContainerAccessor.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/AbstractWidgetMixin.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/GameRendererMixin.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/KeyMappingAccessor.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/KeyboardHandlerMixin.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBakerImplMixin.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/RenderStateShardAccessor.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/TextureAtlasMixin.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/VertexConsumerMixin.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ForgeModelBlockRendererMixin.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/GameRendererAccessor.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererAccessor.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ModelBlockRendererMixin.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostChainAccessor.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RebuildTaskMixin.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/BlockRendererMixin.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/DefaultMaterialsMixin.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/DefaultTerrainRenderPassesMixin.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/SodiumWorldRendererMixin.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/embeddium/BlockRendererMixin.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/emi/EmiApiAccessor.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/ldlib/ClickDataMixin.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/ldlib/ModularWrapperWidgetMixin.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/ldlib/SyncUtilsMixin.java
 rename src/main/java/com/gregtechceu/gtceu/core/{IGTBakedQuad.java => util/extensions/BakedQuadExt.java} (61%)
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/util/extensions/ExtensionHelpers.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/util/extensions/QuadLighterExt.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/core/util/extensions/VertexConsumerExt.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/data/lang/MultiblockLang.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/data/lang/RecipeLogicLang.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/AEConfigSyncHandler.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/AEConfigWidget.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/AEGuiHelper.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/AEKeyStorageSyncHandler.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/AEStackDisplayWidget.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/ScrollPreservingGrid.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/package-info.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/widget/AEFluidConfigWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/widget/AEItemConfigWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/widget/AETextInputButtonWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/widget/AmountSetWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/widget/ConfigWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/widget/list/AEFluidDisplayWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/widget/list/AEItemDisplayWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/widget/list/AEListGridWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/widget/slot/AEConfigSlotWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/widget/slot/AEFluidConfigSlotWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/widget/slot/AEItemConfigSlotWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/widget/slot/AEPatternViewSlotWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/InternalSlotRecipeHandler.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/MaintenancePeripheral.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/embeddium/package-info.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/emi/multipage/MultiblockInfoEmiCategory.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/emi/multipage/MultiblockInfoEmiRecipe.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/emi/oreprocessing/GTEmiOreProcessing.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/emi/orevein/GTBedrockFluid.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/emi/orevein/GTBedrockFluidEmiCategory.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/emi/orevein/GTBedrockOre.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/emi/orevein/GTEmiOreVein.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/emi/orevein/GTOreVeinEmiCategory.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/emi/recipe/GTEmiRecipe.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/emi/recipe/GTEmiRecipeHandler.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/jade/provider/BlockInfoProvider.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MEGridConnectedProvider.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineInfoProvider.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/jei/circuit/GTProgrammedCircuitCategory.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/jei/multipage/MultiblockInfoWrapper.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/jei/oreprocessing/GTOreProcessingInfoWrapper.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/jei/orevein/GTBedrockFluidInfoWrapper.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/jei/orevein/GTBedrockOreInfoWrapper.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/jei/orevein/GTOreVeinInfoWrapper.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/jei/recipe/GTRecipeWrapper.java
 rename src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/{worldmap => common}/ore/OreVeinElement.java (55%)
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/ore/OreVeinElement.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/recipeviewer/CategoryIcon.java
 rename src/main/java/com/gregtechceu/gtceu/integration/{ => recipeviewer}/emi/GTEMIPlugin.java (79%)
 rename src/main/java/com/gregtechceu/gtceu/integration/{emi/oreprocessing => recipeviewer/emi}/GTOreProcessingEmiCategory.java (50%)
 create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/recipeviewer/emi/MultiblockInfoEmiCategory.java
 rename src/main/java/com/gregtechceu/gtceu/integration/{emi/circuit/GTProgrammedCircuitCategory.java => recipeviewer/emi/ProgrammedCircuitEmiCategory.java} (55%)
 create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/recipeviewer/emi/orevein/GTBedrockFluidEmiCategory.java
 rename src/main/java/com/gregtechceu/gtceu/integration/{ => recipeviewer}/emi/orevein/GTBedrockOreEmiCategory.java (50%)
 create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/recipeviewer/emi/orevein/GTOreVeinEmiCategory.java
 rename src/main/java/com/gregtechceu/gtceu/integration/{ => recipeviewer}/emi/recipe/Ae2PatternTerminalHandler.java (93%)
 create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/recipeviewer/emi/recipe/GTEmiRecipe.java
 rename src/main/java/com/gregtechceu/gtceu/integration/{ => recipeviewer}/emi/recipe/GTRecipeEMICategory.java (93%)
 rename src/main/java/com/gregtechceu/gtceu/integration/{ => recipeviewer}/jei/GTJEIPlugin.java (74%)
 rename src/main/java/com/gregtechceu/gtceu/integration/{jei/oreprocessing/GTOreProcessingInfoCategory.java => recipeviewer/jei/GTOreProcessingJeiCategory.java} (73%)
 rename src/main/java/com/gregtechceu/gtceu/integration/{jei/multipage/MultiblockInfoCategory.java => recipeviewer/jei/MultiblockInfoJeiCategory.java} (55%)
 create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/recipeviewer/jei/ProgrammedCircuitJeiCategory.java
 rename src/main/java/com/gregtechceu/gtceu/integration/{ => recipeviewer}/jei/orevein/GTBedrockFluidInfoCategory.java (58%)
 rename src/main/java/com/gregtechceu/gtceu/integration/{ => recipeviewer}/jei/orevein/GTBedrockOreInfoCategory.java (68%)
 rename src/main/java/com/gregtechceu/gtceu/integration/{ => recipeviewer}/jei/orevein/GTOreVeinInfoCategory.java (74%)
 rename src/main/java/com/gregtechceu/gtceu/integration/{ => recipeviewer}/jei/recipe/GTRecipeJEICategory.java (63%)
 rename src/main/java/com/gregtechceu/gtceu/integration/{ => recipeviewer}/jei/subtype/PotionFluidSubtypeInterpreter.java (95%)
 rename src/main/java/com/gregtechceu/gtceu/integration/{rei/oreprocessing/GTOreProcessingDisplayCategory.java => recipeviewer/rei/GTOreProcessingReiCategory.java} (57%)
 rename src/main/java/com/gregtechceu/gtceu/integration/{ => recipeviewer}/rei/GTREIPlugin.java (86%)
 create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/recipeviewer/rei/MultiblockInfoReiCategory.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/recipeviewer/rei/ProgrammedCircuitReiCategory.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/recipeviewer/rei/orevein/GTBedrockFluidDisplayCategory.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/recipeviewer/rei/orevein/GTBedrockOreDisplayCategory.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/recipeviewer/rei/orevein/GTOreVeinDisplayCategory.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/recipeviewer/rei/recipe/GTRecipeDisplay.java
 rename src/main/java/com/gregtechceu/gtceu/integration/{ => recipeviewer}/rei/recipe/GTRecipeREICategory.java (82%)
 rename src/main/java/com/gregtechceu/gtceu/integration/{xei => recipeviewer}/widgets/GTOreByProduct.java (82%)
 create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/recipeviewer/widgets/MultiblockPreviewWidget.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/recipeviewer/widgets/OreProcessingRecipeWidget.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/recipeviewer/widgets/OreVeinRecipeWidget.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/recipeviewer/widgets/ProgrammedCircuitRecipeWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/rei/circuit/GTProgrammedCircuitCategory.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/rei/multipage/MultiblockInfoDisplay.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/rei/multipage/MultiblockInfoDisplayCategory.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/rei/oreprocessing/GTOreProcessingDisplay.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/rei/orevein/GTBedrockFluidDisplay.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/rei/orevein/GTBedrockFluidDisplayCategory.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/rei/orevein/GTBedrockOreDisplay.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/rei/orevein/GTBedrockOreDisplayCategory.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/rei/orevein/GTOreVeinDisplay.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/rei/orevein/GTOreVeinDisplayCategory.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/rei/recipe/GTRecipeDisplay.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/xei/entry/fluid/FluidEntryList.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/xei/entry/fluid/FluidHolderSetList.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/xei/entry/fluid/FluidStackList.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/xei/entry/fluid/FluidTagList.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/xei/entry/item/ItemEntryList.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/xei/entry/item/ItemHolderSetList.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/xei/entry/item/ItemStackList.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/xei/entry/item/ItemTagList.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/xei/handlers/fluid/CycleFluidEntryHandler.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/xei/handlers/item/CycleItemEntryHandler.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/xei/widgets/GTOreByProductWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/xei/widgets/GTOreVeinWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/xei/widgets/GTProgrammedCircuitWidget.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/xei/widgets/GTRecipeWidget.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/utils/ArrayHelpers.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/utils/BlockPosUtil.java
 delete mode 100644 src/main/java/com/gregtechceu/gtceu/utils/FluidStackHashStrategy.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/utils/ScopedValue.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/utils/TriState.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/utils/data/NBTToJsonConverter.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/utils/function/IntObjectConsumer.java
 rename src/main/java/com/gregtechceu/gtceu/utils/input/{IKeyPressedListener.java => TextPressedListener.java} (91%)
 create mode 100644 src/main/java/com/gregtechceu/gtceu/utils/math/ParseResult.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/utils/math/PostfixPercentOperator.java
 create mode 100644 src/main/java/com/gregtechceu/gtceu/utils/math/SIPrefix.java
 create mode 100644 src/main/resources/assets/gtceu/font/include/mono_space.json
 create mode 100644 src/main/resources/assets/gtceu/font/include/monocraft.json
 create mode 100644 src/main/resources/assets/gtceu/font/monocraft.json
 create mode 100644 src/main/resources/assets/gtceu/models/item/tools/shears.json
 create mode 100644 src/main/resources/assets/gtceu/shaders/core/black_hole.fsh
 create mode 100644 src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.fsh
 create mode 100644 src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.json
 create mode 100644 src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.vsh
 create mode 100644 src/main/resources/assets/gtceu/shaders/core/rendertype_entity_bloom.fsh
 create mode 100644 src/main/resources/assets/gtceu/shaders/core/rendertype_entity_bloom.json
 create mode 100644 src/main/resources/assets/gtceu/shaders/core/rendertype_entity_bloom.vsh
 create mode 100644 src/main/resources/assets/gtceu/shaders/post/bloom_unity.json
 create mode 100644 src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json
 create mode 100644 src/main/resources/assets/gtceu/shaders/program/blur.fsh
 create mode 100644 src/main/resources/assets/gtceu/shaders/program/blur.json
 create mode 100644 src/main/resources/assets/gtceu/shaders/program/down_sampling.fsh
 create mode 100644 src/main/resources/assets/gtceu/shaders/program/down_sampling.json
 create mode 100644 src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.fsh
 create mode 100644 src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json
 create mode 100644 src/main/resources/assets/gtceu/shaders/program/unity_composite.fsh
 create mode 100644 src/main/resources/assets/gtceu/shaders/program/unity_composite.json
 create mode 100644 src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh
 create mode 100644 src/main/resources/assets/gtceu/shaders/program/unreal_composite.json
 create mode 100644 src/main/resources/assets/gtceu/shaders/program/up_sampling.fsh
 create mode 100644 src/main/resources/assets/gtceu/shaders/program/up_sampling.json
 delete mode 100644 src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_diamericium_titanium_bloom.png
 delete mode 100644 src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_diamericium_titanium_bloom_ctm.png
 create mode 100644 src/main/resources/assets/gtceu/textures/block/ctm_test.png
 create mode 100644 src/main/resources/assets/gtceu/textures/block/ctm_test.png.mcmeta
 create mode 100644 src/main/resources/assets/gtceu/textures/block/ctm_test_ctm.png
 delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/advanced_processing_array/overlay_front.png
 delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/advanced_processing_array/overlay_front_active.png
 delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/advanced_processing_array/overlay_front_active.png.mcmeta
 delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/advanced_processing_array/overlay_front_active_emissive.png
 delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/advanced_processing_array/overlay_front_active_emissive.png.mcmeta
 delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/advanced_processing_array/overlay_front_emissive.png
 delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/advanced_processing_array/overlay_front_paused.png
 delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/advanced_processing_array/overlay_front_paused_emissive.png
 delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/processing_array/overlay_front.png
 delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/processing_array/overlay_front_active.png
 delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/processing_array/overlay_front_active.png.mcmeta
 delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/processing_array/overlay_front_active_emissive.png
 delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/processing_array/overlay_front_active_emissive.png.mcmeta
 delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/processing_array/overlay_front_emissive.png
 delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/processing_array/overlay_front_paused.png
 delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/processing_array/overlay_front_paused_emissive.png
 create mode 100644 src/main/resources/assets/gtceu/textures/font/LICENSE.txt
 create mode 100644 src/main/resources/assets/gtceu/textures/font/ascii_mono.png
 create mode 100644 src/main/resources/assets/gtceu/textures/font/nonlatin_european_mono.png
 create mode 100644 src/main/resources/assets/gtceu/textures/gui/cursor/cursor_resize.png
 create mode 100644 src/main/resources/assets/gtceu/textures/gui/cursor/cursor_resize_diag.png
 create mode 100644 src/main/resources/assets/gtceu/textures/gui/icon/seperator/seperator_simple.png
 create mode 100644 src/main/resources/assets/gtceu/textures/gui/overlay/mode_eu.png
 create mode 100644 src/main/resources/assets/gtceu/textures/gui/overlay/mode_percent.png
 create mode 100644 src/main/resources/assets/gtceu/textures/gui/overlay/redstone_off.png
 create mode 100644 src/main/resources/assets/gtceu/textures/gui/overlay/redstone_on.png
 create mode 100644 src/main/resources/assets/gtceu/textures/gui/overlay/transfer_mode_overlay.png
 create mode 100644 src/main/resources/assets/gtceu/textures/gui/slot/item.png
 delete mode 100644 src/main/resources/assets/gtceu/textures/gui/tab/tabs_bottom.png
 delete mode 100644 src/main/resources/assets/gtceu/textures/gui/tab/tabs_left.png
 delete mode 100644 src/main/resources/assets/gtceu/textures/gui/tab/tabs_right.png
 delete mode 100644 src/main/resources/assets/gtceu/textures/gui/tab/tabs_top.png
 create mode 100644 src/main/resources/assets/gtceu/textures/gui/widget/steam_dial_bronze.png
 create mode 100644 src/main/resources/assets/gtceu/textures/gui/widget/steam_dial_steel.png
 rename src/main/resources/assets/gtceu/textures/item/{plugin.fake_gui.png => gui_module.png} (100%)
 delete mode 100644 src/main/resources/assets/gtceu/textures/item/plugin.online_pic.png
 delete mode 100644 src/main/resources/assets/gtceu/textures/item/plugin.text.png
 create mode 100644 src/main/resources/assets/gtceu/textures/item/tools/shears.png
 create mode 100644 src/main/resources/assets/gtceu/textures/item/tools/shears_base.png
 create mode 100644 src/main/resources/assets/gtceu/textures/item/tools/shears_overlay.png
 delete mode 100644 src/main/resources/assets/gtceu/ui/recipe_type/forge_hammer.rtui
 delete mode 100644 src/main/resources/assets/gtceu/ui/recipe_type/lathe.rtui
 delete mode 100644 src/test/java/com/gregtechceu/gtceu/common/cover/SolarPanelTest.java
 create mode 100644 src/test/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/ResearchComputationTests.java
 create mode 100644 src/test/resources/data/gtceu/structures/energy/hpca_overload.nbt
 create mode 100644 src/test/resources/data/gtceu/structures/hpca.nbt
 create mode 100644 src/test/resources/data/gtceu/structures/hpca_overload.nbt
 create mode 100644 src/test/resources/data/gtceu/structures/research_computer.nbt
 create mode 100644 src/test/resources/data/gtceu/structures/research_computer_and_hpca.nbt
 delete mode 100644 src/test/resources/data/gtceu/structures/solar.nbt

diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index 4132c1a42cb..6b0e38833f4 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -1,10 +1,31 @@
 ## What
 _This section describes what this PR is about. It should be a clear and concise description concerning what this PR is for, why this PR is needed, and why it should be accepted._
+
 _Linking an issue can be used alternatively to writing a description._
 
+
 ## Implementation Details
 _Any implementations in this PR that should be carefully looked over, or that could/should have alternate solutions proposed._
 
+### AI Usage 
+_The usage of AI tools requires honest disclosure, please refer to our [AI Policy](https://github.com/GregTechCEu/GregTech-Modern/blob/1.20.1/AI_POLICY.md.)._
+
+The purpose of this section is to not guilt trip users who engage with these tools but to give us a better understanding of how they were used as well to what extent.
+Users who contribute AI written code are held responsible for the quality of the code as well as understanding the implemented code written by these tools.
+
+**All machine code MUST be reviewed by the pull request submitter before opening. **
+
+- [ ] No AI driven tools were used for this pull request.
+- [ ] Yes AI driven tools were used for this pull request.
+
+_If you answered no and it is discovered the pull request in question used AI tooling, users will be restricted from submitting future pull requests_
+
+_If you answered yes, please fill out the following information_
+#### Agent Used
+_Example: ClaudeCode Opus 4.7, GPT-5.3-Codex, etc_
+#### Agent Usage Description
+_The extent the relevant tools were used for this PR, be concise and clear with what it was used for. Machine code coverage is not inherently bad, but users must review all machine code personally before submitting a pull request._
+  
 ## Outcome
 _A short description of what this PR added/fixed/changed/removed._
 _For correct linking of issues please use any of the Closes/Fixes/Resolves keywords. Example: When a PR is fixing a bug use "Fixes: #number-of-bug"_
@@ -18,4 +39,4 @@ _This section is for screenshots to demonstrate any GUI or rendering changes, or
 ## Potential Compatibility Issues
 _This section is for defining possible compatibility issues. It must be used when there are API changes, item/block/material/machine changes, or recipe changes._
 
-**Please fill in as much useful information as possible. Also, please remove all unused sections, including this and the other explanations.**
\ No newline at end of file
+**Please fill in as much useful information as possible. Also, please remove all unused sections, including this and the other explanations.**
diff --git a/.github/workflows/log-commits-version-sync.yml b/.github/workflows/log-commits-version-sync.yml
new file mode 100644
index 00000000000..b19f3d11c0b
--- /dev/null
+++ b/.github/workflows/log-commits-version-sync.yml
@@ -0,0 +1,122 @@
+name: Log Commits for Version Sync
+
+on:
+  push:
+    branches:
+      - '1.20.1'
+      - '1.21'
+
+permissions:
+  contents: read
+
+concurrency:
+  group: log-commits-to-project
+  cancel-in-progress: false
+
+jobs:
+  log:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Create an issue on the project board for this push
+        env:
+          GH_TOKEN: ${{ secrets.VERSION_SYNC_PROJECT_TOKEN }}
+          PROJECT_BOARD_URL: ${{ secrets.VERSION_SYNC_PROJECT_BOARD_URL }}
+          BRANCH: ${{ github.ref_name }}
+          REPO: ${{ github.repository }}
+          TARGET_REPO: ${{ secrets.VERSION_SYNC_PROJECT_REPO }}
+          AFTER: ${{ github.event.after }}
+          HEAD_COMMIT_MSG: ${{ github.event.head_commit.message }}
+          COMMITS_JSON: ${{ toJSON(github.event.commits) }}
+        run: |
+          set -euo pipefail
+
+          if [ -z "${GH_TOKEN:-}" ]; then
+            echo "::error::PROJECT_TOKEN secret is not set; a PAT with the 'project' scope is required."
+            exit 1
+          fi
+          if ! gh api user --jq '.login' >/dev/null 2>&1; then
+            echo "::error::PROJECT_TOKEN failed to authenticate against the GitHub API."
+            exit 1
+          fi
+
+          if [ -z "${PROJECT_BOARD_URL:-}" ]; then
+            echo "::error::PROJECT_BOARD_URL secret is not set."
+            exit 1
+          fi
+          if [[ "$PROJECT_BOARD_URL" =~ github\.com/(users|orgs)/([^/]+)/projects/([0-9]+) ]]; then
+            OWNER="${BASH_REMATCH[2]}"
+            NUMBER="${BASH_REMATCH[3]}"
+          else
+            echo "::error::PROJECT_BOARD_URL '$PROJECT_BOARD_URL' is not a valid project board URL."
+            exit 1
+          fi
+
+          # each branch's commits need porting to the other branch
+          case "$BRANCH" in
+            1.20.1) STATUS_NAME="To Port 1.20->1.21" ;;
+            1.21)   STATUS_NAME="To Port 1.21->1.20" ;;
+            *)      STATUS_NAME="" ;;
+          esac
+
+          # build a markdown list item for each commit in this push, skipping any
+          # commit whose associated PR carries the "Ignore Version Sync" label
+          LINES_FILE="$(mktemp)"
+          while read -r commit; do
+            [ -n "$commit" ] || continue
+            sha="$(jq -r '.id' <<<"$commit")"
+            short="${sha:0:7}"
+            title="$(jq -r '.message' <<<"$commit" | head -n1)"
+            url="$(jq -r '.url' <<<"$commit")"
+
+            ignored="$(gh api "repos/$REPO/commits/$sha/pulls" \
+              --jq 'any(.[]; .labels[].name == "Ignore Version Sync")')"
+            if [ "$ignored" = "true" ]; then
+              echo "Commit $short belongs to a PR labeled 'Ignore Version Sync', skipping."
+              continue
+            fi
+
+            printf -- '- [`%s`](%s) %s\n' "$short" "$url" "$title" >>"$LINES_FILE"
+          done < <(jq -c '.[]' <<<"$COMMITS_JSON")
+
+          if [ ! -s "$LINES_FILE" ]; then
+            echo "No commits to add to the board."
+            exit 0
+          fi
+          COUNT="$(wc -l <"$LINES_FILE" | tr -d ' ')"
+
+          # resolve the project's node id and its "Status" field/option ids by name
+          PROJECT_ID="$(gh project view "$NUMBER" --owner "$OWNER" --format json --jq '.id')"
+          FIELDS_JSON="$(gh project field-list "$NUMBER" --owner "$OWNER" --format json)"
+          FIELD_ID="$(jq -r '.fields[] | select(.name == "Status") | .id' <<<"$FIELDS_JSON")"
+          OPTION_ID=""
+          if [ -n "$STATUS_NAME" ]; then
+            OPTION_ID="$(jq -r --arg n "$STATUS_NAME" \
+              '.fields[] | select(.name == "Status") | .options[] | select(.name == $n) | .id' \
+              <<<"$FIELDS_JSON")"
+            if [ -z "$OPTION_ID" ]; then
+              echo "::error::Board has no 'Status' option named '$STATUS_NAME'."
+              exit 1
+            fi
+          fi
+
+          # create a single issue for this push
+          BODY="$(printf 'Commits pushed to `%s` (up to `%s`):\n\n%s\n' \
+            "$BRANCH" "${AFTER:0:7}" "$(cat "$LINES_FILE")")"
+          HEAD_TITLE="$(printf '%s' "$HEAD_COMMIT_MSG" | head -n1)"
+          ISSUE_URL="$(gh issue create --repo "$TARGET_REPO" \
+            --title "$HEAD_TITLE" \
+            --body "$BODY")"
+          echo "Created issue $ISSUE_URL"
+
+          # add it to the board
+          ITEM_ID="$(gh project item-add "$NUMBER" --owner "$OWNER" --url "$ISSUE_URL" \
+            --format json --jq '.id')"
+
+          # set its label to the correct port direction for this branch
+          if [ -n "$OPTION_ID" ]; then
+            gh project item-edit --id "$ITEM_ID" --project-id "$PROJECT_ID" \
+              --field-id "$FIELD_ID" --single-select-option-id "$OPTION_ID"
+            echo "Set status to '$STATUS_NAME'."
+          fi
+
+          echo "Added issue to board with $COUNT commit(s)."
diff --git a/.gitignore b/.gitignore
index 1573309b594..c1c44d92c86 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,5 +22,6 @@ classes/
 src/generated/resources/.cache/
 
 *.patch
+*.cap
 *.DS_Store
 
diff --git a/AI_POLICY.md b/AI_POLICY.md
new file mode 100644
index 00000000000..45356542264
--- /dev/null
+++ b/AI_POLICY.md
@@ -0,0 +1,59 @@
+# AI Usage Policy
+
+This project has strict rules for AI usage:
+
+* **All AI usage in any form must be disclosed.** You must state
+the tool you used (e.g. Claude Code, Cursor, Amp) along with
+the extent that the work was AI-assisted.
+* **The human-in-the-loop must fully understand all code.** If you
+can't explain what your changes do and how they interact with the
+greater system without the aid of AI tools, do not contribute
+those changes.
+* **Issues and discussions can use AI assistance but must have a full
+human-in-the-loop.** This means that any content generated with AI
+must have been reviewed *and edited* by a human before submission.
+AI is very good at being overly verbose and including noise that
+distracts from the main point. The author must do their research and
+trim this down.
+* **No AI-generated media is allowed (art, images, videos, audio, etc.).**
+Text and code are the only acceptable AI-generated content, per the
+other rules in this policy.
+* **Bad AI drivers may be blocked** People who produce bad contributions
+that are clearly AI (slop) may be blocked from making future contributions.
+We love to help junior developers learn and grow, but if you're interested
+in that, don't use AI and we'll help you. We're sorry that bad AI
+drivers have ruined this for you.
+
+## There are Humans Here
+
+Please remember that this project is maintained by humans.
+
+Every discussion, issue, and pull request is read and reviewed by
+humans (and sometimes machines, too). It is a boundary point at which
+people interact with each other and the work done. It is rude and
+disrespectful to approach this boundary with low-effort, unqualified
+work, since it puts the burden of validation on the maintainer.
+
+In a perfect world, AI would produce high-quality, accurate work
+every time. But today, that reality depends on the driver of the AI.
+And today, many drivers of AI do not use it well. So, until that
+changes, we need to have strict rules to protect maintainers.
+
+## AI is Welcome Here
+
+This project is accepting of AI assistance, and many maintainers use
+AI tools as a productive part of their workflow. As a project, we
+welcome AI as a tool!
+
+**Our reason for the strict AI policy is not due to an anti-AI stance**, but
+instead due to the number of poor contributions written by AI. It's misuse
+of the tools, not the tools themselves, that is the problem.
+
+This section is included to be transparent about the project's usage of
+AI for people who may disagree with it, and to address the misconception
+that this policy is anti-AI in nature.
+
+## Credits
+
+This policy is adapted and modified from the [Ghostty Project](https://github.com/ghostty-org/ghostty/blob/main/AI_POLICY.md).
+
diff --git a/dependencies.gradle b/dependencies.gradle
index e908852c3e6..602498640fe 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -1,15 +1,18 @@
 dependencies {
     compileOnly(libs.jetbrains.annotations)
 
-    // LDLib
-    jarJar(modApi(forge.ldlib.get()))
-
     // Registrate
     jarJar(modApi(forge.registrate.get()))
 
     // Configuration
     jarJar(modApi(forge.configuration.get()))
 
+    // Math Parser
+    compileOnly(libs.evalEx.get())
+
+    // MUI
+    jarJar(modImplementation(forge.mui.get()))
+
     // Mixin (& Extras)
     annotationProcessor(variantOf(libs.mixin) { classifier("processor") })
     compileOnly(annotationProcessor(forge.mixinExtras.common.get()))
@@ -42,8 +45,7 @@ dependencies {
     modCompileOnly(forge.architectury)
     modCompileOnly(forge.rhino)
 
-    // Shimmer
-    modCompileOnly(forge.shimmer)
+    // Performance
     modCompileOnly(forge.embeddium)
     modCompileOnly(forge.oculus)
     modCompileOnly(forge.modernfix)
@@ -105,9 +107,10 @@ dependencies {
     modExtraLocalRuntime(forge.heracles)
     modExtraLocalRuntime(forge.resourcefullib)
 
-//    modExtraLocalRuntime(forge.xaerosminimap)
-//    modExtraLocalRuntime(forge.xaerosworldmap)
-//    modExtraLocalRuntime(forge.journeymap.forge)
+    modExtraLocalRuntime(forge.xaeroslib)
+    modExtraLocalRuntime(forge.xaerosworldmap)
+    modExtraLocalRuntime(forge.xaerosminimap)
+    modExtraLocalRuntime(forge.journeymap.forge)
 //    modExtraLocalRuntime(forge.ftbchunks)
 
     modExtraLocalRuntime(forge.gamestages)
@@ -119,4 +122,8 @@ dependencies {
     modExtraLocalRuntime(forge.ponder)
     modExtraLocalRuntime(variantOf(forge.create) { classifier("slim") })
     modExtraLocalRuntime(forge.flywheel.forge)
+
+    modLocalRuntime(forge.curios)
+
+
 }
diff --git a/docs/content/Development/Data-Sync-System/Migrating-From-LDLib-SyncData.md b/docs/content/Development/Data-Sync-System/Migrating-From-LDLib-SyncData.md
index 1974be9a0e9..b20e47fb046 100644
--- a/docs/content/Development/Data-Sync-System/Migrating-From-LDLib-SyncData.md
+++ b/docs/content/Development/Data-Sync-System/Migrating-From-LDLib-SyncData.md
@@ -69,9 +69,10 @@ Client sync fields **do not** automatically detect changes. When changing a clie
 - `@RequireRerender` -> `@RerenderOnChanged`
 - `@Persisted` -> `@SaveField`
 - `@UpdateListener` -> `@ClientFieldChangeListener` on listener method.
-- `@DropSaved` - Removed, make machines implement `IDropSaveMachine` instead
+- `@DropSaved` - Replaced with overriding the `loadFromItem`/`saveToItem` methods on `MetaMachine`
 - `@ReadOnlyManaged` and `@LazyManaged` See usage docs for instructions on complex sync objects 
 
+
 ### Other changes
 
  - `saveCustomPersistedData` & `loadCustomPersistedData` methods, and serialization of custom data types - See `ValueTransformer` and `ValueTransformers` classes.
\ No newline at end of file
diff --git a/docs/content/Development/Data-Sync-System/Usage.md b/docs/content/Development/Data-Sync-System/Usage.md
index e7310d3b0c7..88562725e57 100644
--- a/docs/content/Development/Data-Sync-System/Usage.md
+++ b/docs/content/Development/Data-Sync-System/Usage.md
@@ -6,15 +6,12 @@ title: "Usage"
 
 ### Registering classes with the sync system
 
-At the core of the system are the `ISyncManaged` and `ISyncAnnotated` interfaces, which allow for their fields to have sync annotations..
-All block entities which should be synchronised or saved must extend the abstract class `ManagedSyncBlockEntity`.
+At the core of the system is the `ISyncManaged` interface, which allows for fields to have sync annotations.
 
-`ISyncManaged` should be used for classes with any form of persistent state, and cannot be instantiated or reassigned.
-`ISyncAnnotated` should be used for record-like classes that hold data, and must define a no-args constructor. +All `ISyncManaged` objects must belong to a root managed sync object. There are two default types of root sync objects: - -!!! warning - Block entities that inherit `ManagedSyncBlockEntity` must call `ManagedSyncBlockEntity::updateTick`***every tick*** within their ticker, or they will not be saved. +- `ManagedSyncBlockEntity` is a block entity storing its data through the system. The `Block` class using this `BlockEntity` must implement `ManagedSyncEntityBlock`. +- `ManagedSavedData` is a `SavedData` object that stores data through the system. #### Example of `ISyncManaged` usage ```java @@ -32,32 +29,33 @@ class MySyncObject implements ISyncManaged { @SaveField @SyncToClient - private BlockPos syncPos; + private BlockPos syncPos = BlockPos.ZERO; - @SaveField - @SyncToClient - private ExampleSyncAnnotated syncAnnotatedField; + @Getter + private String syncString = ""; public MySyncObject(MetaMachine machine) { this.parentSyncObject = machine; } public void doChanges() { - - syncPos = BlockPos.ZERO; - // Client sync fields do not update automatically. - getSyncDataHolder().markClientSyncFieldDirty("syncPos") - - syncAnnotatedField.someValue = 10; - /* - * Because ISyncAnnotated classes do not manage their own sync state, - * updating a field in an ISyncAnnotated class requires the parent field to be marked as changed. - */ - getSyncDataHolder().markClientSyncFieldDirty("syncAnnotatedField"); + syncPos = new BlockPos(100, 50, 100); + // Client sync fields do not update automatically. + getSyncDataHolder().markClientSyncFieldDirty("syncPos"); + + setSyncString("abcd"); + } + + // It is often good practice to wrap client sync fields in getters/setters, and have the setter update the sync status. + public void setSyncString(String syncString) { + this.syncString = syncString; + getSyncDataHolder().markClientSyncFieldDirty("syncString"); } - private static class ExampleSyncAnnotated implements ISyncAnnotated { - public int someValue = 0; + // Called on the client side when the given sync field is updated. + @ClientFieldChangeListener(fieldName="syncString") + private void onSyncStringChanged() { + } } ``` @@ -91,7 +89,7 @@ The following field types are supported by default: The `ValueTransformer` abstract class defines how a value of type `T` should be serialized. -To add support for an additional type, call `ValueTransformers.registerTransformer(Class cls, ValueTransformer transformer)` or `ValueTransformers.registerTransformerSupplier(Class cls, Supplier> func)` +To add support for an additional type, call `ValueTransformers.registerTransformer(Class cls, ValueTransformer transformer)` or `ValueTransformers.registerGenericTransformerSupplier(Class cls, Supplier> func)` Additionally, fields can be explicitly directed to use a specific value transformer: ```java diff --git a/docs/content/Development/MUI2/Layout_MainAxisAlignments.png b/docs/content/Development/MUI2/Layout_MainAxisAlignments.png new file mode 100644 index 0000000000000000000000000000000000000000..8755499ec3ac273732569670b92824e873c4d979 GIT binary patch literal 15105 zcmeHOdpy+n`bVpz(%MZ{NSjFG7LseMU6+GO7?)&Ra!Oa#$hDX*ibbPUgH5R=Axu<~ z%QhmnDOn{{u9qOE!KE#%epX-zL zoUe3c*Dv3_+Hw(nK0*Av$8!2z|C5_1vYTU`ls#$`9lLvD=Z}eI3CeD_o>@Ml(~K=+ zSA{&M4;lY0c2zI^vT@QX%UH$nPVm>=C;o$f`F12Gjec&_aY|>6Md^pawBP58-&wX^1FQUU3GU3P4Ycq&b@N@H_m8E_nV>RG z#jSI-@R?Kr!tpeD#hAe0xqHt979LB@`=0FrTFYPQlNCoO|AC5@# z&S{89Tj1=HxCzXy%sTzh1fMNwccD{$=btSk0|erNw#ZFHAhyEm9$fH&--M;2$LhZ{?|O(c_TNc zVvycfa^k_nlu@aizu+`Z*7@hAYk_Bq!7di}G2vAB6PZl%_QCHQAU{)MN8DHr3!2i` zv!;%8b?tgjbbXV|cEX?bb=^4SJ8S$^V z$UWbTg{GB+yb!lp4(_|d3TT(BH}BNWj+d6DtXvd@Zg?LwYdbeyCNuZD_XqL|BXu2% zTLIKPk}%C932xGF+bA<>s@iRR*-hm-LjaCJ9Hrewx+CW5AiX*L{6ve$%O%zu=-Nx0 z2B`7H-YnZ$k&vgxyZn(43IorXdG+10rdLwuywO(Kv$o+DT7Bd_(~O_z-U+OrND=J% zu)gb#I1&Bp*m*zReK?7=-5bYMlQe?NQ|k+xWolXpnV5B;05WRHCry)i_-?XpaY_a$ zzx3YUbtk$-jw}PEZjucR?yADZIIHp@iI$BLW>rOEo(*^I62`kIfNs8Pm_p^?!l~mD z$Ry(xa&-LvF?IZ2il9M*im+*t1G$Y$3M-ty~2-b?p4@hQ}Q z!e3pVMDe9!e}KLHfv+^y970dqT*d(o*L?%*d!w31IN)1eB)OqUHD{--v7;GXwnaYp z6ipom!Ny*|1}Rk0|CEQYZs;@9niD>wV|9z=Wu|F8$jKE|6#;l+a)>uq_1f2@__xSd zP&wo;;C>-F_Nt9`%nLtX83Gs26YfJ<#~M8|+yh-=1gV-)(H1e z__a@CM74a9S`|UO2CJ4Vu?=m$rp1EG!;^J_AOS=C={$I|Oe5&QQ{e*5%ukwPUKuz8SoP#&e*qB;-03%uu>XRu?`tl8O3YuAOp^J@1Q7GVSbLu* ztX=mttVVfn#AAIFE@*e{+=x#wJehY`nmZya0;|{P^v1U#r*hKo`m7d6X# z!H11W_gxCla3e#$m~uW56mkf=mivYKBgs{SG@jh;FdQkk+f3VsmUP2FNui zf^vZiGfhNOBlkyQq7=r$#l^gYcQ)mXlY-g{s%l_-LOKkxQkH>pzR|$epvq6}%bP0e z`w3f<2my~~ynjZT>Jw|ou07(|s-csKCQ|k=D*_`~{JJr8S1vkAPDk@y86h7GWRfQy73jIxW)yqzac1NGIu_yyNa!Zp@%0IVh9WQmO6~*lL{DY8Rj%ubc6Tfnz~3UUI+db%8DdK&%~Xqr09RHInq_CE{g|& z57mPpErI7LUAn#|!SGe@3Gi6IVu1uqc|2)~NllT=7`FccD>FXdgjI$)ng@>RB+7%>B{o#b&&GN;fNDICSJ!`R(kQ%|RWfTp}-Iqk^aShaxS{3<|^m zJR6oA7J-xT%@rZlIXB#WfwrVf#Cq(PZo+>N(~%gfw@ zJq`d24^7~(U_N%R$?i-Jz$mr+U+Crj3U^A7Bt`Qd?Gwj>pGU)#u)fsGX8;*LkmJSI zhDH8>pYvfK_wmde#y%3nJvvRffSJ#xHggR?yFZ#+`-O8cI^xlyHz-OoY z!sZ^Y7VbX?l*s-u`Or2*BK5D-!v}O-L$&M64jsN+?E05J@%UFHPQ*EH@V+twNXlkN znQ@5w3?3gU9^puq+YkpMTSq`**7{7HbO1SmqE4Ag1B7cbbW_fvpbkllr-@7M9PJiw zSZz~VLZt14eI#r`^AY{HDG8Xa)4Gq4-s;V_taEJSLWH595} z$ad?tey9|0XlgTW+SBx)Dtn*(l=jm1qjKh?uaIDZ;$wb&$LbIUEA3fwKK4pbJ!fBt zI+u40K2@wQbmJAx!BHi-$FM}L1`Hd4 z56Qe~TT_JnFt&W+f$zwAv(b2@hO>yBs$WUW_mIN0O$+1n+bc~WBP2$F;(OOr7t7D`6YR|nWRw-keQ6JP-LNMtwlkfLK;6%I%xn8~O|kEcqGz2L!Xgn*Z*-{e ztO|!Ub>^`nQB@C)>-!9{?!pgix&7s>;F7VZN?Iyy+wklm%D9|P@<7XzHV5y*N#Tl?tFlI`>WZ{kHFXJ2SkH;~D= zc0~^e`y1bjV@OfI zvSUVdM}o&T z>4e=E+=0myBM)TE!MQGh1WHe`ZjF+{479SB8LTv8cFh0!Wu$&Zf8-Q7Bnu!2;3)-v zEX4zu`V@#*<2$6r=O~-z*3&g6o*@DR!l!uCK0>B=>j>j`IW-6=Yz)znx0Eoj#4((% z3)ByHw4j)mNvIAu#W}X;OV^jno$_R90&MY+#{r>ifsm^TA!%0JK&E35(rDgyv(-yp z`#B0F=Oq>Q9?(VSglbK^>1mXwfS(^kY$;u2V`*5@JSt&)a;hJEFQPQ^R_Bwlv+ZCI zHy&>xtc_t;xlH`%cGi6N4=9BH>{lKQ(MLZ70CF`AW)c0Q#mgTwqS{-){4qx7ITZs& z)f1QD)Z}r7d&#qPU`#yVf)4!LJ@Z(A4)~?@@9_aGS6B7o;4nxxEmY9yDWGh{du=;R zj%EwBwt!y(&tY2qz+9WY8_p*$P6)eh0s`g;(d^W`p*+#R0PsuaCjX#DFbAJbLq^lD zB@b$Y_tzFJmH3D;N#UU>r09Fnw2;vY&|bc?S4T0k`@%^@ZhOdPX0ZqpG@Aj&HMCMi_+D=+SLySR{#!;u7_g`3>vOY z*#Qh*V~GL^MM9_Ab@;$AH2C}~2{^_dlCyB0kCXQN&Li{d{F^@x#&2p0!hJ>C9ya$m zPL8#&f%etHeO5bwcqF5thiHM$!BR$n$N;$=!_@BvuESzSi{#mEwLyt%;!PqNN;l#_ z9*Ti8=lG73jEQoqgH)YL_ez%`B5XyQZy>WVE-Q=YJjz@1-|}iaXA;8 zNj`%Ih#>C&>KBJ_XL9D`V6IWjPC0~ich!XTs9WqhOB=h-1oW`j+D1+GjfE9X=0L>N zQY6iH-wP3_za49mI$Y>#szrhFCg6Nlw}~*CxI*H8dWBB)#GEe%>Gw)*-bYPEk$!~6 zjACE#$q!YFiBC+CVCc6yV7iux5>1?cWWjon;8PzuDbcslO!@8Bg4jt3-o*d1`n$Cj$_RCJ%*rg@OuYn1EYUv5 z2Xsl$r58(u6&9?e)__j(1{Gr z4?c~dS-y;N-DMcPt9*m96PAQr>)?)GRn$opM689U2|o2~aA09=rR1{3@-ByJ$$ZMk z(J1l?kYs^q4Cy`i6l}wWPSvT3vIxiKTUdoLW!^&md$tF&KE36H^7b%e-BLO!8R--h zRjLALJHBMGfPiBKaT-DE`~s~~htX{KK2Z8! z`nF8eYsPg6OzB%scwNF^acf>Wo3yBvpssuD-u)eKv^^1?5=NIid2*WfBvTiRFGxR@ zn!1QLrC3Q0N^TLfww9hnjMUoIuL#A(tw%^yZu(t~l`0EQd$-3BJ}*BpRoUYtzpiR} zvi+0Hio0_EF0MG;DIzU|yY!iE^p24h5qiJ^Q(KUra2}_4iNx<(^*1umv38s?e{pzn z;3N-S#X0$T<}X!(yY%oqxQQtP&}-m;R)5=AICZ>TsP!>yES%hR{G9YqmU|iv z_l(F`oR>~Hws${hWUj?EFFF6}^i>&{k@Om08C#!dAz~i5%le}W z)_zOmVzu@+(V*7}c;{yyKuC$b>R*$xzV?u5frjYa26Mv}?>*IYu(vStwY(xnQwBsWZZ8KQv+h^-V?^_uE5W#3r7wYjrqg zXH%3ZLs*puB>5n`{KRc&OmU__YLY*fdzM&>W%k&}s}Xx@<+C)Bl8#>*s}Wh0Ok1Nw z#Rx0CyIn-KwX`ehvQ6yPO}5zveDi0S*D2CRIUv7Ja-S*1@y@bol<4H};uQDjUsk-h z%-PL`5*yJ50vYLQun*v6qOIF{3LR^AR4uB-Q~f>httH0?_L5yq*`^y>zJ)jiREsX+Tgnk;zNL4}4o8Ut@g zfB`(xI9(I_4k>;s^@USg!R=3o+NThO!$hI;!7nh>9zk6b?<{2k=+VGSk;@exy-poR zOhLIBUDyx__6cgxSD;!m)TnoE3>eM?#Nv|q`d*j}IGUFS<{*`dB-$p=xCZP97Y5DA zS)`suY&OXl0|^uWB9atYdh>p4St}W*1+U{Cpdrlo1K`zF8^D>j*eVM zm>I0^ag0@kfO2{;l#l_(PhdhOE$`$25f8V;}9pHa^B$=!@&X@A4N0Z z#<-P}{SCONaiFvjwJR&yZY>ixV;DeDUV{FL5Bk<>Xz}aPGOy%nTHR-cKy!fEEh`_s z8DL(?gGX@kEtRFs7=MeRA16#H9?d=ht~?9dhkuO#q)h@y%Y0MT?{@&itp0tv&YURG zz5SCSI1k}*`c4nw?U^0gNP1@n)>F#Rg;_nzEySS+9aU;yODTf_1~akGjHt_sF^#jj z7ufjMAfc#ZAsGI(ocYJjWnx`W@$5c^6D@k8%pn2)Xi2N?)SlIc>_l=J#6yj333CX+ z*QZ9Cmfv8~=iA#cR6o=JlSs47hoK5}pZ$#T2=f27MFxu>cEMf>Ma~%+#61JOltCVM z$@!!|5YK)j`aiWF*d1`}8QpE|BWe}oBxtqa4G}xKdpHoe$pKpsb{_|G5SKf_VB{sg z6diKG&}~+;%gk7ajDwu!ABDioEz|Ki#+v)IRZvN9Pf{nI@>Ftz>(Nzk2ka!sY@&YS zMp|rlm@;nMz%dXU!fC;V+e%<}66&OgI|Gx@eDXw`eMb6wFD4{=> z9~`X}f3L8SyNcWPzPmdr>g-Y&&W}?)=^H|tvoSCx2Bdpt6r+PTObekrcK0slOI&YM zx_=|AqT2Eu!o+8C2k=%#J9q>L&5*PxRPO)M^Z8oCIk=uMrMNz0bJ8*f|DVNdd2EQS z=T`&S4FJz;KgD^$-Jzm(^+a%YDE%I|I}{D?4rO-4+{$rWCn{!??Su5`jG%M0x>t1V-%&Yup9 f{V)85E+@A1u+Xv>#=YQQTLmo5Hk%T^^*HeltDUW` literal 0 HcmV?d00001 diff --git a/docs/content/Development/MUI2/Syncing/Sync-Basics.md b/docs/content/Development/MUI2/Syncing/Sync-Basics.md new file mode 100644 index 00000000000..a4e04f8e391 --- /dev/null +++ b/docs/content/Development/MUI2/Syncing/Sync-Basics.md @@ -0,0 +1,271 @@ +--- +title: Sync Basics +--- + +## Basics of Syncing +To display dynamic values on the client, you have to send the data from the server to the client. When making UIs, it is very important to keep track of if and how your data is being synced to the client. There are a few ways to do so, which will be discussed below. + +When opening a UI, a copy of the UI is created both on the server and on the client. It is important to note here that the server's copy will have access to most everything about e.g. the machine, block state, the world etc., but the client's copy will not. + +To sync this data back and forth, you need to use `SyncHandler`s. These will send your data from the server to the client when it updates. + +Because of this, you cannot just use values you create SyncHandlers for directly in the client. An example: + +```java + +var tickSyncValue = new IntSyncValue(() -> this.ticks, (newValue) -> this.ticks = newValue); +for(int i=0;i)` - Queries the supplier every frame to retrieve the component to display +- `new DynamicDrawable(Supplier)` - Queries the supplier every frame to retrieve the drawable to display + + +!!! Note + To convert Texts or Drawables to Widgets, you need to chain `.asWidget()` + +```java +public class MuiTestMachine extends MetaMachine implements IMuiMachine { + + public int ticks = 0; + + public MuiTestMachine(BlockEntityCreationInfo info) { + super(info); + this.subscribeServerTick(() -> ticks++); + } + + @Override + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { + var panel = GTGuis.createPanel(this, 176, 168); + var tickSyncValue = new IntSyncValue(() -> this.ticks, (newValue) -> this.ticks = newValue); + syncManager.syncValue("tickSyncValue", tickSyncValue); + + var column = Flow.column(); + + column.child(Text.dynamic(() -> Component.literal("Ticks: " + this.ticks)) // note that this is a Supplier instead of a Component + .asWidget() + .margin(4)); + + column.child( + new DynamicDrawable(() -> { // note that this is a Supplier instead of an IDrawable + if (ticks % 40 < 20) { // flip every second + return GTGuiTextures.BUTTON_FLUID_OUTPUT; + } else { + return GTGuiTextures.BUTTON_ITEM_OUTPUT; + } + }) + .asWidget() + .background(GTGuiTextures.BACKGROUND_STEEL) + ); + + panel.child(column); + + return panel; + } +} +``` + +Here, we create a basic `SyncValue` for an integer. This takes a `Supplier` and a `Consumer`, more commonly known as a getter and a setter. Generally speaking, `SyncValue`s will take a `Supplier` and `Consumer` of the type of value they are syncing. + +If the value returned by the getter changed on the server, the value gets serialized and sent to the client by the `SyncManager`. The `SyncHandler`'s value can always be manually updated, for example to do client-to-server syncing. + +Then, the value on the client (being set every time the server sends an update) is retrieved every frame by the lambdas used in the dynamic widgets. + +If you want to update the value from the client, you can call `syncValue.setValue()` on the client. This will also update the value on the server side. + +## Method 2: DynamicLinkedSyncHandler + +This method is great for widgets whose structure and layout can change depending on your synced values. + +```java +public class MuiTestMachine extends MetaMachine implements IMuiMachine { + + public int ticks = 0; + + public MuiTestMachine(BlockEntityCreationInfo info) { + super(info); + this.subscribeServerTick(() -> ticks++); + } + + @Override + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { + var panel = GTGuis.createPanel(this, 176, 168); + var tickSyncValue = new IntSyncValue(() -> this.ticks, (newValue) -> this.ticks = newValue); + syncManager.syncValue("tickSyncValue", tickSyncValue); + + DynamicLinkedSyncHandler dynamicLinkedSyncHandler = new DynamicLinkedSyncHandler<>(tickSyncValue) + .widgetProvider((widgetSyncManager, intSyncHandler) -> { + var list = new ListWidget<>() + .widthRel(1) + .coverChildrenHeight() + .crossAxisAlignment(Alignment.CrossAxis.START); + int tickValue = intSyncHandler.getValue(); // It is also possible to just reference this.ticks directly + int amountOfItems = 1 + (tickValue % 200) / 20; + for (int i = 0; i < amountOfItems; i++) { + list.child(Text.str("Value nr. " + (i + 1)).asWidget()); // No need for Text.dynamic since we have the value as a variable here, inside the lambda + } + return list; + }); + + panel.child(new DynamicSyncedWidget<>() + .widthRel(1) + .coverChildrenHeight() + .syncHandler(dynamicLinkedSyncHandler) + .padding(3)); + + return panel; + } +} +``` + +This method works in three steps: + +The first step is creating a `SyncHandler` and registering it to the `PanelSyncManager`. +The second step is creating a `DynamicLinkedSyncHandler` based on the first `SyncHandler`. This is effectively a wrapper class to provide your widget whenever your initial `SyncHandler` updates. +The third step is creating a `DynamicSyncedWidget` with that `DynamicLinkedSyncHandler` as its `SyncHandler`. + +This effectively lets us create a new "version" of the widget whenever our value (in this case the `ticks` int) changes. Furthermore, in this example we have the actual values of the things we want to sync when constructing our widget tree on the client, allowing for much greater customization. + + +!!! note + For even more complex systems where you need to dynamically register sync handlers within the `DynamicLinkedSyncHandler`'s `.widgetProvider(...)`, this can be done by calling `.getOrCreateSyncHandler(...)` on the `widgetSyncManager` parameter of the lambda. + +## Method 3: Types that take SyncHandlers +There are some widgets that have built in support for working directly with SyncHandlers. + +```java +public class MuiTestMachine extends MetaMachine implements IMuiMachine { + + public boolean buttonPressed = false; + + public MuiTestMachine(BlockEntityCreationInfo info) { + super(info); + } + + @Override + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { + var panel = GTGuis.createPanel(this, 176, 168); + + var column = Flow.column().paddingTop(3); + + column.child( + Text.dynamic(() -> Component.literal("Pressed: " + this.buttonPressed)) + .asWidget()); + + var buttonSyncValue = new BooleanSyncValue(() -> this.buttonPressed, (newValue) -> this.buttonPressed = newValue); + column.child(new ToggleButton().value(buttonSyncValue)); + + panel.child(column); + + return panel; + } +} +``` + +Note that in this case, the ToggleButton takes care of registering the SyncValue for us, so we do not register it to the syncManager ourselves. This method is great for simple functions using widgets that support it. + +A few examples of this would be: + +- `new ToggleButton().value(BooleanSyncValue)` - A ToggleButton that affects the Boolean sync value +- `new TextFieldWidget().value(StringSyncValue)` - A TextField that updates the String sync value +- `new ProgressWidget().value(DoubleSyncValue)` - A ProgressWidget (e.g. bar) that shows progress, can also be constructed with `new ProgressWidget().progress(() -> this.progress)` +- `new SliderWidget().value(DoubleSyncValue)` - A SliderWidget that updates the Double sync value + +## Method 4: Manually notifying DynamicSyncHandlers +This method is useful when your custom widget needs complex data coming in, like through multiple sync handlers. + +```java +public class MuiTestMachine extends MetaMachine implements IMuiMachine { + + public int rows = 0; + public int columns = 0; + public int counter = 0; + + public MuiTestMachine(BlockEntityCreationInfo info) { + super(info); + this.subscribeServerTick(() -> { + counter += 1; + if (counter % 20 == 0) { + rows = (rows + 1) % 10; + } + if (counter % 15 == 0) { + columns = (columns + 1) % 10; + } + }); + } + + @Override + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { + var panel = GTGuis.createPanel(this, 200, 200); + + var rowsSyncValue = new IntSyncValue(() -> this.rows, (newValue) -> this.rows = newValue); + syncManager.syncValue("rows", rowsSyncValue); + + var columnsSyncValue = new IntSyncValue(() -> this.columns, (newValue) -> this.columns = newValue); + syncManager.syncValue("columns", columnsSyncValue); + + DynamicSyncHandler gridWidgetHandler = new DynamicSyncHandler().widgetProvider((slotsSyncManger, buffer) -> { + + Flow grid = Flow.column().width(200); + for (int rowNr = 0; rowNr < this.rows; rowNr++) { + Flow row = Flow.row(); + for (int columnNr = 0; columnNr < this.columns; columnNr++) { + row.child(Text.str(rowNr + ", " + columnNr).asWidget().width(20)); + } + grid.child(row); + } + return grid; + }); + + rowsSyncValue.setChangeListener(() -> { + gridWidgetHandler.notifyUpdate(buffer -> {}); + }); + columnsSyncValue.setChangeListener(() -> { + gridWidgetHandler.notifyUpdate(buffer -> {}); + }); + + panel.child(new DynamicSyncedWidget<>().syncHandler(gridWidgetHandler)); + return panel; + } +} +``` + +This is very similar to method 2, but instead of a `DynamicLinkedSyncHandler` we use a normal `DynamicSyncHandler` where we have to manually let it know when to update. We do this in the change listener of our two `SyncValue`s by calling notifyUpdate. + +Do note there's also a buffer where you can serialize data to, to be consumed in the `.widgetProvider(...)` in the spot where in a `DynamicLinkedSyncHandler` our syncValue would be. It is usually not needed to put anything in this buffer. + +## Other sync information + +### SyncHandler panel separation + +SyncValues are separated across panels. So if you do `mainPanelSyncManager.syncValue("rows", rowsSyncValue);` in one panel, you can't just call `popupSyncManager.getSyncHandlerFromMapKey("rows:0")`. +You can, however, call `syncManager.getModularSyncManager().getPanelSyncManager("panel name here").getSyncHandlerFromMapKey("rows:0");`. + +### Value.Dynamic +Sometimes you need to quickly create a Value for something that already exists client side. For this you can use `new [Type]Value.Dynamic(...)`. +For example, if you have a client-only value that's affected by a button, you could do +`panel.child(new ToggleButton().value(new BoolValue.Dynamic(() -> this.toggled, (newValue) -> this.toggled = newValue)));` + +Another reason to use a dynamic value is if you want to change the type of a variable, e.g. `.value(new DoubleValue.Dynamic(() -> (double) this.x, val -> this.x = (double) val)` where x is an int. + +The third reason is if you want to use a `SyncHandler` in two separate widgets that would both auto-register it. +``` + var boolSyncValue = new BooleanSyncValue(() -> this.toggled, (newValue) -> this.toggled = newValue); + panel.child(new ToggleButton().value(boolSyncValue)); + panel.child(new ToggleButton().value(BoolValue.wrap(boolSyncValue)).left(32)); +``` +Without the wrap around the second boolSyncValue call, it would complain of registration of an already registered SyncValue. + diff --git a/docs/content/Development/MUI2/Syncing/Sync-Handlers.md b/docs/content/Development/MUI2/Syncing/Sync-Handlers.md new file mode 100644 index 00000000000..07496634e44 --- /dev/null +++ b/docs/content/Development/MUI2/Syncing/Sync-Handlers.md @@ -0,0 +1,94 @@ +--- +title: Sync Handlers +--- + + +## What are they +A `SyncHandler` is a mechanism that handles the syncing between client and server for MUI2. For its high level usages, see [Sync Basics](Sync-Basics.md). `SyncHandler`s generally can sync anything between client and server, and `SyncValue`s specifically sync data (e.g. a value) between client and server. + +## How they work +You can create a `SyncHandler` with the following syntax: +`new IntSyncValue(() -> this.number, (newValue) -> this.number = newValue)` +This means that to check if the value changed, it will call the first argument (the IntSupplier, `() -> this.number`), and cache the value that gets returned. +Then, whenever that value changes, it will send the changed value to the other side. +Whenever a `SyncHandler` receives a value from the other side, it will call the setter with the value, in this case setting `this.number` to the new value on the client, and cache it for further use/checking. +Do note that this means that a setter isn't necessary. You can use only a getter, and then call `syncHandler.getValue()` to get the last received / cached value. + +!!! Note + By default, `SyncValue`s or `SyncHandler`s don't allow client-to-server syncing. For that you will need to chain `.allowC2S()`. This gets called on the `SyncHandler` itself, so if you're using a builder, after the `.build()` + + + +Here's a list of the built-in `SyncHandler`s: + + + - `BigDecimalSyncValue` + - `BigIntegerSyncValue` + - `BinaryEnumSyncValue` + - `BooleanSyncValue` + - `ByteArraySyncValue` + - `ByteSyncValue` + - `DoubleSyncValue` + - `EnumSyncValue` + - `FloatSyncValue` + - `FluidSlotSyncHandler` + - `GenericCollectionSyncHandler` + - `GenericListSyncHandler` + - `GenericMapSyncHandler` + - `GenericSetSyncHandler` + - `GenericSyncValue` + - `IntSyncValue` + - `LongArraySyncValue` + - `LongSyncValue` + - `ShortSyncValue` + - `StringSyncValue` + +## Generic Sync Handlers + +In the previous list, I specifically want to draw attention to the Generic- SyncHandlers. These can take in custom methods for writing- and reading data for syncing stuff that isn't in this list. +e.g. +```java + GenericListSyncHandler numberListSyncHandler = GenericListSyncHandler.builder() + .getter(() -> this.serverInts) + .setter(v -> this.serverInts = v) + .serializer(FriendlyByteBuf::writeInt) + .deserializer(FriendlyByteBuf::readInt) + .immutableCopy() + .build(); +``` + +To make this easier as to not have to re-invent the (de)serializers, you can use what's called an `IByteBufAdapter`. They hold serialize, deserialize and equals methods. So you could do +```java + GenericSyncValue recipeSyncHandler = GenericSyncValue.builder() + .getter(() -> rlmachine.getRecipeLogic().getLastRecipe()) + .adapter(GTByteBufAdapters.GTRECIPE) + .build(); +``` +Here's a list of existing ByteBufAdapter: + + + - `ByteBufAdapters.ITEM_STACK` + - `ByteBufAdapters.FLUID_STACK` + - `ByteBufAdapters.NBT` + - `ByteBufAdapters.STRING` + - `ByteBufAdapters.BYTE_BUF` + - `ByteBufAdapters.FRIENDLY_BYTE_BUF` + - `ByteBufAdapters.INT` + - `ByteBufAdapters.LONG` + - `ByteBufAdapters.FLOAT` + - `ByteBufAdapters.DOUBLE` + - `ByteBufAdapters.BOOL` + - `ByteBufAdapters.BYTE` + - `ByteBufAdapters.SHORT` + - `ByteBufAdapters.CHAR` + - `ByteBufAdapters.BLOCKSTATE` + - `ByteBufAdapters.BLOCKPOS` + - `ByteBufAdapters.GLOBAL_POS` + - `ByteBufAdapters.RESOURCE_LOCATION` + - `ByteBufAdapters.UUID` + - `ByteBufAdapters.COMPONENT` + - `GTByteBufAdapters.MONITOR_GROUPS` + - `GTByteBufAdapters.PATTERN_ERRORS` + - `GTByteBufAdapters.GTRECIPE` + +It is also possible to make your own ByteBufAdapter from a [CODEC](https://docs.minecraftforge.net/en/latest/datastorage/codecs/) using `ByteBufAdapters.makeAdapter(Codec codec)` \ No newline at end of file diff --git a/docs/content/Development/MUI2/Syncing/Synced-Actions.md b/docs/content/Development/MUI2/Syncing/Synced-Actions.md new file mode 100644 index 00000000000..3fa0ea9989c --- /dev/null +++ b/docs/content/Development/MUI2/Syncing/Synced-Actions.md @@ -0,0 +1,50 @@ +--- +title: Synced Actions +--- + +```java +public class MuiTestMachine extends MetaMachine implements IMuiMachine { + + public MuiTestMachine(BlockEntityCreationInfo info) { + super(info); + } + + public int number = 0; + + @Override + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { + var panel = GTGuis.createPanel(this, 176, 168); + + var numberSyncValue = new IntSyncValue(() -> this.number, (newValue) -> this.number = newValue); + syncManager.syncValue("number", numberSyncValue); + + syncManager.registerServerSyncedAction("randomButtonPressed", (packet) -> { + this.number = getLevel().getRandom().nextInt(); + }); + + Column contents = new Column(); + contents.child(Text.dynamic(() -> Component.literal("Number: " + number)) + .asWidget() + .width(100) + .height(16) + .margin(4)); + + contents.child(new ButtonWidget<>() + .onMousePressed((context, button) -> { + if (button == 0) { + syncManager.callSyncedAction("randomButtonPressed"); + } + return true; + }) + .size(16)); + return panel.child(contents); + } +} + +``` + +Synced actions are useful when you need a client-side input (e.g. a button press) to trigger an action on the server. + +In this case we create a synced action called `randomButtonPressed`, and when the button is pressed on the client, the `randomButtonPressed` signal is sent to the server and the relevant action is executed. + +If you need to pass other data with your action, you can pass a `(packet) -> {...}` as second argument to `callSyncedAction` and serialize your data there, and then deserialize it from the `packet` argument in the synced action definition. \ No newline at end of file diff --git a/docs/content/Development/MUI2/Syncing/index.md b/docs/content/Development/MUI2/Syncing/index.md new file mode 100644 index 00000000000..ed0a1fb6e5f --- /dev/null +++ b/docs/content/Development/MUI2/Syncing/index.md @@ -0,0 +1 @@ +Syncing is the concept of synchronising data between client and server. This folder will contain files relevant to setting up syncing on your UIs. \ No newline at end of file diff --git a/docs/content/Development/MUI2/Test-Machine.md b/docs/content/Development/MUI2/Test-Machine.md new file mode 100644 index 00000000000..1fbdd86787a --- /dev/null +++ b/docs/content/Development/MUI2/Test-Machine.md @@ -0,0 +1,35 @@ +# Making a MUI2 Test Machine +To make a basic machine to test your UI, simply create the following class: + +```java title="MultiMachines.java" +public class MuiTestMachine extends MetaMachine implements IMuiMachine { + + public MuiTestMachine(BlockEntityCreationInfo info) { + super(info); + } + + @Override + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { + var panel = GTGuis.createPanel(this, 176, 168); + // Do stuff with your panel here, add children, etc. + // For example: + panel.child(Text.str("Test machine") + .asWidget() + .margin(4)); + + return panel; + } +} +``` + +and in your machines definitions class, add the following entry: + +```java + public static final MachineDefinition MUI_TEST_MACHINE = REGISTRATE + .machine("mui_test", MuiTestMachine::new) + .model(createOverlayCasingMachineModel(GTCEu.id("block/casings/solid/machine_casing_clean_stainless_steel"), + GTCEu.id("block/machine/part/computer_monitor"))) + .register(); +``` + +Make sure to run datagen after making the initial machine to register the lang keys, model, etc. Running datagen afterward for UI changes is not required. \ No newline at end of file diff --git a/docs/content/Development/MUI2/Widget-Layout.md b/docs/content/Development/MUI2/Widget-Layout.md new file mode 100644 index 00000000000..7f0e6a1cc9b --- /dev/null +++ b/docs/content/Development/MUI2/Widget-Layout.md @@ -0,0 +1,189 @@ +# Widget Layout, Sizing and Positioning + +Each widget has several builder setter methods for position and size. They all come from the `IPositioned` interface. + + +## Coordinate system +- Widget coordinates are local to the widget; (0, 0) is the top-left corner of the widget. +- Positions are relative to the parent by default. + +## Sizing + +- `width(int)` sets the widget width in pixels +- `widthRel(float)` sets the widget width relative to its parent (e.g. if the parent is 120 px wide and we + call `widthRel(0.5f)`, our widget will be 60 px wide) +- `height(int)` and `heightRel(float)` work analogous to previous methods +- `size(int width, int height)` is equivalent to `.width(width).height(height)` +- `size(int val)` is equivalent to `.width(val).height(val)` +- `sizeRel(float width, float height)` and `sizeRel(float val)` work analogous to previous methods +- `fullWidth()` and `fullHeight()` are shortcuts for `widthRel(1f)` and `heightRel(1f)` respectively +- `full()` combines the previous two methods +- `coverChildrenWidth()` makes the widget width wrap tightly around its children +- `coverChildrenHeight()` works analogous to previous method +- `coverChildren()` wraps width and height tightly +- `expanded()` is only useful for children of `Row` and `Column` widgets. It will make the widget expand as much as + possible in the widgets axis (width in row and height in column) + +## Positioning + +We can set position on four different points, two for each axis. `left()`, `right()`, `top()` and `bottom()`. +To understand what they are doing take a look at the following picture: + +![grafik](https://github.com/CleanroomMC/ModularUI/assets/45517902/ab173431-1509-414c-8db4-4545c985a9bd) + +As you can see the methods are fairly self-explanatory. Each of those methods has multiple variants much like `width()` +and `widthRel()`. Only methods for `left()` will be listed here. + +- `left(int x)` sets the x position in pixels relative to its parent +- `leftRel(float x)` sets the x position relative to its parent (f.e. 0.5f will center the widget) +- `leftRelOffset(float val, int offset)` is the same as `leftRel(float x)`, but also adds an `offset` in pixels after the calculation +- `leftRelAnchor(float val, float anchor)` is the same as `leftRel(float x)`, but with a different anchor + (see [Anchor](#anchor)) +- `leftRel(float val, int offset, float anchor)` combines `leftRelOffset()` and `leftRelAnchor()` +- `left(DoubleSupplier val, Measure measure)` is like `left()` and `leftRel()`, but with a dynamic value. Note that the + supplier is only evaluated during resizing. You can't use it for animating widgets. +- `leftRelOffset(DoubleSupplier val, int offset)` is like `leftRelOffset(float val, int offset)` with a dynamic value +- `leftRelAnchor(DoubleSupplier val, float anchor)` is like `leftRelAnchor(float val, float anchor)` with a dynamic + value +- `leftRel(DoubleSupplier val, int offset, float anchor)` combines the two methods above + +All the above variants also exist for `right()`, `top()` and `bottom()`. +Additionally, there is + +- `pos(int x, int y)` combines `left(int x)` and `top(int y)` +- `posRel(float x, float y)` combines `leftRel(float x)` and `topRel(float y)` +- `posRel(Alignment a)` calls `posRel(float x, float y)` using a specific alignment enum value +- `horizontalCenter()` is short for `leftRel(0.5f)` +- `verticalCenter()` is short for `topRel(0.5f)` +- `center()` is short for `posRel(Alignment.Center)` +## Anchor + +The anchor is the point of the widget at which the widget will be positioned with the relative value. The following +picture should make this clear. In the picture `leftRelAnchor(0.5f, 0.3f)` is called. + +![anchor.png](https://raw.githubusercontent.com/CleanroomMC/Website/refs/heads/main/docs/wiki/modularui/anchor.png) + +Here the anchor is placed at `0.3f`, which is about a third of the widget. +And that anchor is positioned at `0.5f` of the parent widget (the center). +Try imagining what happens with different anchor values and play around with it by yourself. + +If we had called `leftRel(float val, int offset, float anchor)`, then the offset would be added after the anchor +and relative position calculation. + +## Combining Size and Position + +You can call multiple different position and size methods, but you should be aware of its effects and limitations. + +Each axis (x and y) has three setters (x has `left()`, `right()` and `width()`, y has `top()`, `bottom()` and `height()`) +without including all the variations. + +!!! Note + You can call at most two setters for each axis, since with two properties set the last one can always be calculated. + +For example of you call `left()` and `right()` then the width can be calculated with `right - left`. +Setting all three properties for an axis will remove one of the other properties and log an info message. + +!!! Note + By default, the position is (0, 0) and the size is 18x18 in pixels for most widgets. + +## Changing the relative Parent + +By default, the size and position are calculated relative to the widget's parent, but that can be changed with +`relative(Area)`, `relative(IGuiElement)` and `relativeToScreen()`. +The parent of all panels is by default the screen. + +!!! Warning + Changing the relative widget might cause some unexpected results in some edge cases. Please notify us if you run + into one of those. + + +## Flow layout (Row / Column) +`Flow` is the core layout widget for arranging children along one axis. + +- `Flow.row()` lays out children **left-to-right** (X axis). +- `Flow.column()` lays out children **top-to-bottom** (Y axis). +- `mainAxisAlignment(...)` controls how children are distributed on the main axis: + - `START`, `CENTER`, `END`, `SPACE_BETWEEN`, `SPACE_AROUND` + - e.g. `Flow.row().mainAxisAlignment(Alignment.MainAxis.CENTER)` centers the row's children horizontally, given that it has a set width +- `crossAxisAlignment(...)` controls alignment on the perpendicular axis: + - `START`, `CENTER`, `END` + - e.g. `Flow.row().crossAxisAlignment(Alignment.CrossAxis.CENTER)` centers the row's children vertically, given that it has a set height +- `childPadding(int)` adds fixed spacing between children. +- `coverChildren()` / `coverChildrenWidth()` / `coverChildrenHeight()` sizes the flow to fit its children. +- `collapseDisabledChild()` does not consider disabled children during position calculations. + - This is useful when the enabled state of children changes dynamically. +- `reverseLayout(bool)` reverses the order that children are drawn. + +Notes: + +- Centering (main or cross axis) requires the flow to have a known size on that axis. If you want a row to center its children horizontally, give it a width (e.g. `widthRel(1f)` or `width(120)`). +- By default, a `Flow` is `full()`, which means they take up as much space as their parents size. + +Here is how all the MainAxisAlignments apply to widgets: + +![MainAxisAlignments](./Layout_MainAxisAlignments.png) + + +## Centering widgets +There are two common ways to center things: + +1) Center a widget within its parent (positioning) + +- `widget.center()` or `widget.posRel(Alignment.Center)` +- `widget.horizontalCenter()` or `widget.verticalCenter()` + +2) Center children inside a Row/Column (layout) + +- `Flow.row().mainAxisAlignment(Alignment.MainAxis.CENTER)` centers children along the flow's direction. +- `Flow.column().crossAxisAlignment(Alignment.CrossAxis.CENTER)` centers children perpendicular to the flow's direction. +- Remember to give the row/column a size on that axis (e.g. `widthRel(1f)` for a row). + +## Margin vs padding +Spacing is handled via two different concepts: + +- Margin: space outside a widget. Layouts (like `Flow`) include margins when positioning children. + - `marginTop(px)`, `marginBottom(px)`, `marginLeft(px)`, `marginRight(px)` set the padding in pixels for the directions + - `margin(all)`, `margin(horizontal, vertical)`, `margin(left, right, top, bottom)` are shortcuts for the respective methods +- Padding: space inside a widget. It reduces the content area and affects how children are placed. + - `paddingTop(px)`, `paddingBottom(px)`, `paddingLeft(px)`, `paddingRight(px)` sets the margin in pixels for the directions + - `padding(all)`, `padding(horizontal, vertical)`, `padding(left, right, top, bottom)` are shortcuts for the respective methods + +## Examples + +### Simple centered panel with a row of buttons +```java +ModularPanel panel = new ModularPanel("example") + .size(176, 168); + +panel.child(new ParentWidget<>() + .size(90, 63) + .align(Alignment.CENTER) + .child(Flow.row() + .coverChildren() + .childPadding(4) + .child(new ButtonWidget<>().size(16)) + .child(new ButtonWidget<>().size(16)) + .child(new ButtonWidget<>().size(16)))); +``` + +### Column with padding and left-aligned content +```java +Flow column = Flow.column() + .widthRel(1f) + .padding(10) + .crossAxisAlignment(Alignment.CrossAxis.START) + .child(new TextWidget<>(Text.str("Title")).marginBottom(4)) + .child(new TextWidget<>(Text.str("Body"))); +``` + +### Slot grid using absolute positioning +```java +ParentWidget slots = new ParentWidget<>(); +for (int y = 0; y < rows; y++) { + for (int x = 0; x < cols; x++) { + slots.child(new ItemSlot() + .left(18 * x) + .top(18 * y)); + } +} +``` diff --git a/docs/content/Development/MUI2/index.md b/docs/content/Development/MUI2/index.md new file mode 100644 index 00000000000..f06372b41a0 --- /dev/null +++ b/docs/content/Development/MUI2/index.md @@ -0,0 +1,5 @@ +# ModularUI 2 +ModularUI 2 is the UI library used in GTM starting from 8.0.0, and is the successor to LDLib UI. +From ModularUI 1.12's github: + +With ModularUI you can build GUIs fast by adding Widgets to panels with layout widgets, so you don't have to calculate positions and sizes yourself. ModularUI is very dynamic and allows for very complicated client-server synced GUIs. \ No newline at end of file diff --git a/docs/content/Development/Recipe-Logic/Custom-Ingredient.md b/docs/content/Development/Recipe-Logic/Custom-Ingredient.md index f535685c6b6..7d1ae5ec740 100644 --- a/docs/content/Development/Recipe-Logic/Custom-Ingredient.md +++ b/docs/content/Development/Recipe-Logic/Custom-Ingredient.md @@ -132,7 +132,7 @@ public class BonkRecipeCapability extends RecipeCapability { public final static BonkRecipeCapability CAP = new BonkRecipeCapability(); protected BonkRecipeCapability() { - super("bonk", 0x777777, false, 5, BonkIngredient.Serializer.INSTANCE); + super(new ResourceLocation("MOD_ID", "bonk"), 0x777777, false, 5, BonkIngredient.Serializer.INSTANCE); } @Override @@ -162,15 +162,13 @@ public class BonkRecipeCapability extends RecipeCapability { } @Override - public void addXEIInfo(WidgetGroup group, int xOffset, GTRecipe recipe, List contents, boolean perTick, - boolean isInput, MutableInt yOffset) { - for (var content : contents) { - var bonkIngredient = BonkRecipeCapability.CAP.of(content); - if(isInput){ - group.addWidget(new LabelWidget(3-xOffset, yOffset.addAndGet(10), "Bonk needed: " + bonkIngredient.getBonk())); - } - // Bonk output not supported for now - } + public List getCapabilityHandlers(MetaMachine machine) { + return machine.getTraits(NotifiableBonkHandler.TYPE); + } + + @SuppressWarnings("unchecked") + public List getCapabilityHandlers(MetaMachine machine, IO io) { + return (List)super.getCapabilityHandlers(machine, io); } } ``` @@ -180,6 +178,8 @@ public class BonkRecipeCapability extends RecipeCapability { public class NotifiableBonkHandler extends NotifiableRecipeHandlerTrait implements ICapabilityTrait { + public static final MachineTraitType TYPE = new MachineTraitType<>(NotifiableBonkHandler.class); + @Getter public final IO handlerIO; @Getter @@ -198,6 +198,11 @@ public class NotifiableBonkHandler extends NotifiableRecipeHandlerTrait getTraitType() { + return TYPE; + } + public boolean addBonk(int bonkToAdd, boolean simulate){ if(bonkToAdd < 0) return false; if((long) bonkToAdd + (long) this.bonk > Integer.MAX_VALUE) return false; @@ -229,7 +234,7 @@ public class NotifiableBonkHandler extends NotifiableRecipeHandlerTrait MetaMachine` instead of `(IMachineBlockEntity) -> MetaMachine` @@ -74,23 +75,8 @@ The constructors for a large number of machines have changed in order to simply #### **All Machines** - Replace the first constructor argument `IMachineBlockEntity holder` with `BlockEntityCreationInfo info` -#### `TieredEnergyMachine` -- Removed `createEnergyContainer` method -- Constructor now has an optional `Supplier` argument -#### `WorkableTieredMachine` -- Removed `createRecipeLogic`, `createImportItemHandler`, `createExportItemHandler`, `createImportFluidHandler`, `createExportFluidHandler` methods -- Added a new constructor: - - `BlockEntityCreationInfo info` - - `int tier` - - `Supplier recipeLogicSupplier` Recipe logic supplier, defaults to the standard `RecipeLogic` class. - - `int importSlots` Item import slots, defaults to the amount of slots in the machine's default recipe type. - - `int exportSlots` Same as above, but for item export slots. - - `int fluidImportSlots` As above, but for fluid import slots. - - `int fluidExportSlots` As above, but for fluid export slots. - - `Int2IntFunction tankScalingFunction` Fluid tank capacity scaling function. -#### `WorkableMultiblockMachine`, `WorkableElectricMultiblockMachine` and `SteamWorkableMachine` -- Removed `createRecipeLogic` method -- Constructor now has an optional `Supplier` argument, defaults to the standard `RecipeLogic` class +#### Machines with `createX` functions (e.g. `createEnergyContainer`, `createRecipeLogic`) +- Creation functions have been removed in favor of arguments being passed into the constructor. #### IMPORTANT MIGRATION NOTE: @@ -109,6 +95,8 @@ When migrating, remove the `this` argument from the machine trait constructor an A large number of machine feature interfaces have been removed, and have had their functionality merged into the standard MetaMachine class, or now use the new machine trait system: +- `IMultiPart` Use the `MultiblockPartMachine` class directly. +- `IWorkableMultiController` Use the `WorkableMultiblockMachine` class directly. - `ITurbineMachine` Use the `LargeTurbineMachine` class directly. - `IRotorHolderMachine` Use the `RotorHolderMachine` class directly. - `IMultiController` Use the `MultiblockControllerMachine` class directly. @@ -123,7 +111,25 @@ A large number of machine feature interfaces have been removed, and have had the - `IHPCAComputationProvider` - Use `HPCAComputationProviderTrait` - `IHPCACoolantProvider` - Use `HPCACoolantProviderTrait` - `IFluidRendererMulti` - Use `MultiblockFluidRendererTrait` +- `IMaintenanceMachine` Use `MaintenanceHatchPartMachine` +## Connected texture reimplementation +The mod's connected texture logic has been reimplemented in GTM proper. +Texture packs, addons, and modpacks will have to change their texture metadata files for connected texures slightly. +A few regexes for fixing all the MCMeta files is follows, run them in order: + +1. Match: `"ldlib":([\s\{]*)"connection"(:\s".*?")(?:,\s.*)?` + Replace with: `"gtceu":$1"connection_texture"$2` +2. Match: `\s*\},\s*"shimmer":\s*\{(\s*"bloom":.*)` + Replace with: `,$1` +3. Match: `(\{\s*)"shimmer":(\s*\{\s*"bloom":.*)` + Replace with: `$1"gtceu":$2` + +## IRecipeHandler nullability +Previously, `handleRecipeInner` should return `null` when there's nothing left to process. This has been changed to requiring an empty list (e.g. the list of remaining ingredients). Returning `null` is now wrong and will crash (NPE). + +## Empty content check for recipe capabilities +As a recipe-matching optimization, input handlers whose `getTotalContentAmount()` returns `0` are now skipped during recipe handling. If your `RecipeCapability` has handlers that legitimately report a total content amount of `0` but can still satisfy a recipe (e.g. rate-based capabilities like computation/CWU, where nothing is "stored" but the handler can still provide), you must now override `RecipeCapability#skipEmptyContentCheck()` to return `true`, otherwise these capabilities will break (their handlers will never be run). ## Other Changes @@ -132,5 +138,11 @@ A large number of machine feature interfaces have been removed, and have had the - `GTFluidImpl` has been merged into `GTFluid`, use `GTFluid.Flowing` and `GTFluid.Source` instead of `GTFluidImpl.Flowing` and `GTFluidImpl.Source`. - Item behaviors have been moved to `common/item/behavior`, and some items have been moved from `api/item` to `common/item`. - Changed the minimum value of the `compat.minimap.surfaceRockProspectRange` and `compat.minimap.oreBlockProspectRange` configs from -1 to 0. The behavior is still disabled with 0. +- All materials are now stored in a single registry, instead of a registry per addon. Replace references to `GTCEuAPI.materialManager` with `GTRegistries.MATERIALS`. - `ChargerMachine` has been merged into `BatteryBufferMachine`. - - Calling the battery buffer constructor with the following args gives the same behaviour as a charger machine: `(info, tier, inventorySize, BatteryBufferMachine.AMPS_PER_BATTERY_CHARGER, 0)` \ No newline at end of file + - Calling the battery buffer constructor with the following args gives the same behaviour as a charger machine: `(info, tier, inventorySize, BatteryBufferMachine.AMPS_PER_BATTERY_CHARGER, 0)` +- Refactored Jade provider code. Use the `MachineInfoProvider` class for jade providers for a specific machine type, and `MachineTraitProvider` for providers for a specific machine trait. +- `GTUtil.getMoltenFluid(Material)` has been moved to `Material.getHotFluid()`. +- `ICopyable::copyConfig`'s `CompoundTag` argument should now be mutated by reference instead of a new one returned (and thus, the return type has been changed to `void`). +- Tiered Chance Boosting has been formally removed from the API (as it was deprecated in v7.0.) `ChancedInput` and `ChancedOutput` kubeJS calls will throw errors if they still had chance boost values as arguments. +- Any custom `IDistinctPart`'s will have to implement `supportsDistinct` if they don't extend `ItemBusPartMachine`. \ No newline at end of file diff --git a/docs/content/Modpacks/Examples/Custom-Recipe-Condition.md b/docs/content/Modpacks/Examples/Custom-Recipe-Condition.md index accfae4e6c9..d16c2ee5310 100644 --- a/docs/content/Modpacks/Examples/Custom-Recipe-Condition.md +++ b/docs/content/Modpacks/Examples/Custom-Recipe-Condition.md @@ -83,6 +83,11 @@ public class ExampleCondition extends RecipeCondition { return Component.literal(String.format("Should be ran at least at height %d", height)); } + public RecipeUIModifier modifyUI() { + return RecipeUIModifier.textLine(Text.of(String.format("Should be ran at least at height %d", height))); + } + + @Override protected boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic recipeLogic) { return recipeLogic.getMachine().getHolder().getCurrentPos().getY() >= height; diff --git a/docs/content/Modpacks/Examples/Example_Coil_Multiblock.md b/docs/content/Modpacks/Examples/Example_Coil_Multiblock.md new file mode 100644 index 00000000000..09fa577b996 --- /dev/null +++ b/docs/content/Modpacks/Examples/Example_Coil_Multiblock.md @@ -0,0 +1,102 @@ +--- +title: "Example Coil Multiblock" +--- + +### Superheated Pyrolyzing Oven Multiblock (by Phoenixvine) + + +Below is an example of a multiblock using the CoilWorkableElectricMultiblockMachine class and the pyrolyseOvenOverclock machine logic. + +### Multiblock +=== "JavaScript" + ```js title="superheated_pyrolyzing_oven_multiblock.js" + // In order to use multiblock logic extending beyond the normal WorkableElectricMultiblockMachine, (This is the multiblock type used by default for kubejs) you need to load a class. Coil multiblocks such as the Electric Blast Furnace, Pyrolyse Oven, and the Cracker use this class. + const CoilWorkableElectricMultiblockMachine = Java.loadClass("com.gregtechceu.gtceu.api.machine.multiblock.CoilWorkableElectricMultiblockMachine") + + GTCEuStartupEvents.registry('gtceu:machine', event => { + event.create("superheated_pyrolyzing_oven", "multiblock") + .machine((holder) => new CoilWorkableElectricMultiblockMachine(holder)) + .rotationState(RotationState.NON_Y_AXIS) + .recipeTypes('pyrolyse_oven') + .recipeModifiers( + [ + GTRecipeModifiers.PARALLEL_HATCH, + (machine, recipe) => GTRecipeModifiers.pyrolyseOvenOverclock(machine, recipe) + ] + ) + .appearanceBlock(GTBlocks.CASING_STEEL_SOLID) + .pattern(definition => FactoryBlockPattern.start() + .aisle("BBCCCBB", "BBCDCBB", "BBCCCBB", "BBCCCBB", "BBEEEBB", "BBEEEBB") + .aisle("BCCCCCB", "BCAFACB", "BCAFACB", "BCGGGCB", "BEAAAEB", "BEHHHEB") + .aisle("CCCCCCC", "CAAFAAC", "CAAFAAC", "CGGGGGC", "EAAAAAE", "EHHHHHE") + .aisle("CCCCCCC", "DFFFFFD", "CFFFFFC", "CGGGGGC", "EAAAAAE", "EHHMHHE") + .aisle("CCCCCCC", "CAAFAAC", "CAAFAAC", "CGGGGGC", "EAAAAAE", "EHHHHHE") + .aisle("BCCCCCB", "BCAFACB", "BCAFACB", "BCGGGCB", "BEAAAEB", "BEHHHEB") + .aisle("BBCCCBB", "BBCICBB", "BBCCCBB", "BBCCCBB", "BBEEEBB", "BBEEEBB") + .where('A', Predicates.blocks("minecraft:air")) + .where('B', Predicates.any()) + .where('C', Predicates.blocks('gtceu:solid_machine_casing').setMinGlobalLimited(10) + .or(Predicates.abilities(PartAbility.MAINTENANCE).setExactLimit(1)) + .or(Predicates.abilities(PartAbility.PARALLEL_HATCH).setMaxGlobalLimited(1)) + .or(Predicates.autoAbilities(definition.getRecipeTypes()))) + .where('D', Predicates.blocks("gtceu:steel_firebox_casing")) + .where('E', Predicates.blocks("gtceu:laminated_glass")) + .where('F', Predicates.blocks("gtceu:ptfe_pipe_casing")) + .where('G', Predicates.heatingCoils()) + .where('H', Predicates.blocks("gtceu:high_temperature_smelting_casing")) + .where('M', Predicates.abilities(PartAbility.MUFFLER).setExactLimit(1)) + .where('I', Predicates.controller(Predicates.blocks(definition.get()))) + .build()) + .workableCasingModel("gtceu:block/casings/solid/machine_casing_solid_steel", + "gtceu:block/multiblock/pyrolyse_oven"); + + }) + ``` + + +=== "Java" + ```java title="MultiMachines.java" + + public static final MultiblockMachineDefinition SUPERHEATED_PYROLYZING_OVEN = REGISTRATE + .multiblock("superheated_pyrolyzing_oven", (holder) -> new CoilWorkableElectricMultiblockMachine(holder)) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(GTRecipeTypes.PYROLYSE_RECIPES) + .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, + (machine, recipe) -> GTRecipeModifiers.pyrolyseOvenOverclock(machine, recipe)) + .appearanceBlock(GTBlocks.CASING_STEEL_SOLID) + .pattern(definition -> FactoryBlockPattern.start() + .aisle("BBCCCBB", "BBCDCBB", "BBCCCBB", "BBCCCBB", "BBEEEBB", "BBEEEBB") + .aisle("BCCCCCB", "BCAFACB", "BCAFACB", "BCGGGCB", "BEAAAEB", "BEHHHEB") + .aisle("CCCCCCC", "CAAFAAC", "CAAFAAC", "CGGGGGC", "EAAAAAE", "EHHHHHE") + .aisle("CCCCCCC", "DFFFFFD", "CFFFFFC", "CGGGGGC", "EAAAAAE", "EHHMHHE") + .aisle("CCCCCCC", "CAAFAAC", "CAAFAAC", "CGGGGGC", "EAAAAAE", "EHHHHHE") + .aisle("BCCCCCB", "BCAFACB", "BCAFACB", "BCGGGCB", "BEAAAEB", "BEHHHEB") + .aisle("BBCCCBB", "BBCICBB", "BBCCCBB", "BBCCCBB", "BBEEEBB", "BBEEEBB") + .where('A', Predicates.air()) + .where('B', Predicates.any()) + .where('C', Predicates.blocks(GTBlocks.CASING_STEEL_SOLID.get()).setMinGlobalLimited(10) + .or(Predicates.abilities(PartAbility.MAINTENANCE).setExactLimit(1)) + .or(Predicates.abilities(PartAbility.PARALLEL_HATCH).setMaxGlobalLimited(1)) + .or(Predicates.autoAbilities(definition.getRecipeTypes()))) + .where('D', Predicates.blocks(GTBlocks.FIREBOX_STEEL.get())) + .where('E', Predicates.blocks(CASING_LAMINATED_GLASS.get())) + .where('F', Predicates.blocks(GTBlocks.CASING_POLYTETRAFLUOROETHYLENE_PIPE.get())) + .where('G', Predicates.heatingCoils()) + .where('H', Predicates.blocks(GCYMBlocks.CASING_HIGH_TEMPERATURE_SMELTING.get())) + .where('M', Predicates.abilities(PartAbility.MUFFLER).setExactLimit(1)) + .where('I', Predicates.controller(Predicates.blocks(definition.get()))) + .build()) + .workableCasingModel(GTCEu.id("block/casings/solid/machine_casing_solid_steel"), + GTCEu.id("block/multiblock/pyrolyse_oven")) + .register(); + ``` + +### Lang + +```json title="en_us.json" +{ + "block.gtceu.superheated_pyrolyzing_oven": "Superheated Pyrolyzing Oven", +} +``` + + diff --git a/docs/content/Modpacks/Examples/Example_Steam_Multiblock.md b/docs/content/Modpacks/Examples/Example_Steam_Multiblock.md new file mode 100644 index 00000000000..57b06f47885 --- /dev/null +++ b/docs/content/Modpacks/Examples/Example_Steam_Multiblock.md @@ -0,0 +1,87 @@ +--- +title: "Example Steam Multiblock" +--- + +### Large Steam Compressor Multiblock + +Below is an example of a multiblock using the SteamParallelMultiblockMachine class. +Steam multiblocks such as the Steam Grinder and Steam Oven use this class. + +### Multiblock + +=== "JavaScript" + ```js title="example_steam_multiblock_multiblock.js" + + // In order to use multiblock logic extending beyond the default multiblock type for KJS (WorkableElectricMultiblockMachine), you need to load a class. + const $SteamMulti = Java.loadClass('com.gregtechceu.gtceu.common.machine.multiblock.steam.SteamParallelMultiblockMachine'); + + GTCEuStartupEvents.registry('gtceu:machine', event => { + event.create('large_steam_compressor', 'multiblock') + .machine((holder) => new $SteamMulti(holder, 4)) + // The number in holder is the max amount of parallel it can use. + .rotationState(RotationState.NON_Y_AXIS) + .recipeType('compressor') + .recipeModifier((machine, recipe) => $SteamMulti.recipeModifier(machine, recipe), true) + .pattern(definition => FactoryBlockPattern.start() + .aisle("BCCCB", "BBCBB", "BBCBB", "BBBBB", "BBBBB") + .aisle("CDDDC", "BDBDB", "BDEDB", "BBDBB", "BBBBB") + .aisle("CDDDC", "CBBBC", "CEFEC", "BDDDB", "BBGBB") + .aisle("CDDDC", "BDBDB", "BDEDB", "BBDBB", "BBBBB") + .aisle("BCCCB", "BBHBB", "BBCBB", "BBBBB", "BBBBB") + .where('B', Predicates.any()) + .where('C', Predicates.blocks('gtceu:steam_machine_casing').setMinGlobalLimited(10) + .or(Predicates.abilities(PartAbility.STEAM_IMPORT_ITEMS).setMaxGlobalLimited(1)) + .or(Predicates.abilities(PartAbility.STEAM).setMaxGlobalLimited(1)) + .or(Predicates.abilities(PartAbility.STEAM_EXPORT_ITEMS).setMaxGlobalLimited(1))) + .where('D', Predicates.blocks("gtceu:industrial_steam_casing")) + .where('E', Predicates.blocks("gtceu:bronze_brick_casing")) + .where('F', Predicates.blocks("gtceu:bronze_firebox_casing")) + .where('G', Predicates.blocks("gtceu:bronze_machine_casing")) + .where('H', Predicates.controller(Predicates.blocks(definition.get()))) + .build()) + .workableCasingModel("gtceu:block/casings/steam/bronze/bottom", + "gtceu:block/machines/compressor") + }) + ``` + +=== "Java" + ```java title="MultiMachines.java" + public static final MultiblockMachineDefinition LARGE_STEAM_COMPRESSOR = REGISTRATE + .multiblock("large_steam_compressor", (holder) -> new SteamParallelMultiblockMachine(holder, 4)) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(COMPRESSOR_RECIPES) + .recipeModifier((machine, recipe) -> SteamParallelMultiblockMachine.recipeModifier(machine, recipe), true) + .pattern(definition -> FactoryBlockPattern.start() + .aisle("BCCCB", "BBCBB", "BBCBB", "BBBBB", "BBBBB") + .aisle("CDDDC", "BDBDB", "BDEDB", "BBDBB", "BBBBB") + .aisle("CDDDC", "CBBBC", "CEFEC", "BDDDB", "BBGBB") + .aisle("CDDDC", "BDBDB", "BDEDB", "BBDBB", "BBBBB") + .aisle("BCCCB", "BBHBB", "BBCBB", "BBBBB", "BBBBB") + .where('B', Predicates.any()) + .where('C', Predicates.blocks(GTBlocks.CASING_BRONZE_BRICKS.get()).setMinGlobalLimited(10) + .or(Predicates.abilities(PartAbility.STEAM_IMPORT_ITEMS).setMaxGlobalLimited(1)) + .or(Predicates.abilities(PartAbility.STEAM).setMaxGlobalLimited(1)) + .or(Predicates.abilities(PartAbility.STEAM_EXPORT_ITEMS).setMaxGlobalLimited(1))) + .where('D', Predicates.blocks(GCYMBlocks.CASING_INDUSTRIAL_STEAM.get())) + .where('E', Predicates.blocks(GTBlocks.BRONZE_BRICKS_HULL.get())) + .where('F', Predicates.blocks(GTBlocks.FIREBOX_BRONZE.get())) + .where('G', Predicates.blocks(GTBlocks.BRONZE_HULL.get())) + .where('H', Predicates.controller(Predicates.blocks(definition.get()))) + .build()) + .workableCasingModel(GTCEu.id("block/casings/steam/bronze/bottom"), + GTCEu.id("block/machines/compressor")) + .register(); + ``` + +### Lang + +```json title="en_us.json" +{ + "block.gtceu.large_steam_compressor": "Large Steam Compressor", +} +``` + + + + + diff --git a/docs/content/Modpacks/Examples/Example_Turbine.md b/docs/content/Modpacks/Examples/Example_Turbine.md new file mode 100644 index 00000000000..4abdeefe1d5 --- /dev/null +++ b/docs/content/Modpacks/Examples/Example_Turbine.md @@ -0,0 +1,94 @@ +--- +title: "Example Turbine" +--- + +### Example Turbine + +Below is an example of a multiblock using the LargeTurbineMachine class for making custom large turbines. + +### Multiblock + +=== "JavaScript" + ```js title="hyper_gas_turbine.js" + // In order to use multiblock logic extending beyond the normal WorkableElectricMultiblockMachine, (This is the multiblock type used by default for kubejs) you need to load a class. LargeTurbineMachines such as the gas, steam, and plasma turbines use this class. + const $LargeTurbineMachine = Java.loadClass("com.gregtechceu.gtceu.common.machine.multiblock.generator.LargeTurbineMachine") + + GTCEuStartupEvents.registry('gtceu:machine', event => { + event.create('hyper_gas_turbine', 'multiblock') + .machine((holder) => new $LargeTurbineMachine(holder, GTValues.LuV)) // The value shows one rotor holder tier above the recommended minimum rotor holder. The tier of rotor holder provides a boost based on the efficiency stat. + .rotationState(RotationState.NON_Y_AXIS) + .recipeTypes("gas_turbine") + .recipeModifiers([GTRecipeModifiers.OC_NON_PERFECT_SUBTICK, GTRecipeModifiers.BATCH_MODE, (machine, recipe) => GTRecipeModifiers.LargeTurbineMachine(machine, recipe)]) + .appearanceBlock(GTBlocks.CASING_TITANIUM_STABLE) + .pattern(definition => FactoryBlockPattern.start() + .aisle("BBBBBBB", "BBBCBBB", "BBBDBBB", "BBBCBBB", "BBBBBBB") + .aisle("BBBCBBB", "BBCACBB", "BBCFCBB", "BBCACBB", "BBBCBBB") + .aisle("BBCCCBB", "BCAAACB", "BCAFACB", "BCAFACB", "BBCCCBB") + .aisle("BCCCCCB", "CAAFAAC", "CFFFFFC", "CAFFFAC", "BCCECCB") + .aisle("BBCCCBB", "BCAAACB", "BCAFACB", "BCAFACB", "BBCCCBB") + .aisle("BBBCBBB", "BBCACBB", "BBCFCBB", "BBCACBB", "BBBCBBB") + .aisle("BBBBBBB", "BBBCBBB", "BBBGBBB", "BBBCBBB", "BBBBBBB") + .where("A", Predicates.blocks("minecraft:air")) + .where("B", Predicates.any()) + .where("C", Predicates.blocks("gtceu:stainless_steel_turbine_casing") + .or(Predicates.autoAbilities(definition.getRecipeTypes())) + .or(Predicates.abilities(PartAbility.MAINTENANCE).setExactLimit(1))) + .where("D", Predicates.ability(PartAbility.MUFFLER).setExactLimit(1)) + .where("E", Predicates.ability(PartAbility.ROTOR_HOLDER).setExactLimit(1)) + .where("F", Predicates.blocks("gtceu:stainless_steel_frame")) + .where("G", Predicates.controller(Predicates.blocks(definition.get()))) + .build()) + .workableCasingModel("gtceu:block/casings/mechanic/machine_casing_turbine_stainless_steel", + "gtceu:block/multiblock/generator/large_gas_turbine") + }); + ``` + +=== "Java" + ```java title="MultiMachines.java" + public static final MultiblockMachineDefinition HYPER_GAS_TURBINE = REGISTRATE + .multiblock("hyper_gas_turbine", (holder) -> new LargeTurbineMachine(holder, GTValues.LuV, 4)) // The value shows one rotor holder tier above the recommended minimum rotor holder. The tier of rotor holder provides a boost based on the efficiency stat. + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(GTRecipeTypes.GAS_TURBINE_FUELS) + .recipeModifiers(GTRecipeModifiers.OC_NON_PERFECT_SUBTICK, GTRecipeModifiers.BATCH_MODE, LargeTurbineMachine::recipeModifier) + .pattern(definition -> FactoryBlockPattern.start() + .aisle("BBBBBBB", "BBBCBBB", "BBBDBBB", "BBBCBBB", "BBBBBBB") + .aisle("BBBCBBB", "BBCACBB", "BBCECBB", "BBCACBB", "BBBCBBB") + .aisle("BBCCCBB", "BCAAACB", "BCAEACB", "BCAEACB", "BBCCCBB") + .aisle("BCCCCCB", "CAAEAAC", "CEEEEEC", "CAEEEAC", "BCCFCCB") + .aisle("BBCCCBB", "BCAAACB", "BCAEACB", "BCAEACB", "BBCCCBB") + .aisle("BBBCBBB", "BBCACBB", "BBCECBB", "BBCACBB", "BBBCBBB") + .aisle("BBBBBBB", "BBBCBBB", "BBBGBBB", "BBBCBBB", "BBBBBBB") + .where("A", Predicates.blocks("minecraft:air")) + .where("B", Predicates.any()) + .where("C", Predicates.blocks("gtceu:stainless_steel_turbine_casing") + .or(Predicates.autoAbilities(definition.getRecipeTypes())) + .or(Predicates.abilities(PartAbility.MAINTENANCE).setExactLimit(1))) + .where("D", Predicates.ability(PartAbility.MUFFLER).setExactLimit(1)) + .where("F", Predicates.ability(PartAbility.ROTOR_HOLDER).setExactLimit(1)) + .where("E", Predicates.blocks("gtceu:stainless_steel_frame")) + .where("G", Predicates.controller(Predicates.blocks(definition.get()))) + .build()) + .workableCasingModel(GTCEu.id("block/casings/steam/bronze/bottom"), + GTCEu.id("block/machines/compressor")) + .register(); + ``` + + +### Lang + +```json title="en_us.json" +{ + "block.gtceu.hyper_gas_turbine": "Hyper Gas Turbine", +} +``` + + + + + + + + + + + diff --git a/docs/content/Modpacks/Examples/Greenhouse.md b/docs/content/Modpacks/Examples/Greenhouse.md new file mode 100644 index 00000000000..e69de29bb2d diff --git a/docs/content/Modpacks/Examples/Multiblocks/Greenhouse.md b/docs/content/Modpacks/Examples/Multiblocks/Greenhouse.md index 76bbe0754b2..77074d524f7 100644 --- a/docs/content/Modpacks/Examples/Multiblocks/Greenhouse.md +++ b/docs/content/Modpacks/Examples/Multiblocks/Greenhouse.md @@ -32,7 +32,7 @@ title: "Greenhouse" ## Multiblock === "JavaScript" ```js title="greenhouse_multiblock.js" - const $RecipeLogic = Java.loadClass('com.gregtechceu.gtceu.api.machine.trait.RecipeLogic') + const $RecipeLogic = Java.loadClass('com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic') const $List = Java.loadClass('java.util.List') GTCEuStartupEvents.registry('gtceu:machine', event => { diff --git a/docs/content/Modpacks/Examples/Parallel-Hatch-Part.md b/docs/content/Modpacks/Examples/Parallel-Hatch-Part.md index 0b4fab16341..2d10349200e 100644 --- a/docs/content/Modpacks/Examples/Parallel-Hatch-Part.md +++ b/docs/content/Modpacks/Examples/Parallel-Hatch-Part.md @@ -37,7 +37,7 @@ GTCEuStartupEvents.registry("gtceu:machine", (event) => { } const $RecipeLogic = Java.loadClass( - "com.gregtechceu.gtceu.api.machine.trait.RecipeLogic" + "com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic" ); builder .langValue(name + " Parallel Control Hatch") diff --git a/docs/content/Modpacks/Materials-and-Elements/Modifying-Existing-Materials.md b/docs/content/Modpacks/Materials-and-Elements/Modifying-Existing-Materials.md index 36283afb9d5..9ca38447118 100644 --- a/docs/content/Modpacks/Materials-and-Elements/Modifying-Existing-Materials.md +++ b/docs/content/Modpacks/Materials-and-Elements/Modifying-Existing-Materials.md @@ -8,23 +8,23 @@ title: Modifying Existing Materials All periodic table elements are present in GT, but some of them don't have any properties attached. You can also add a BlastProperty for EBF autogenerated recipes. You can also do this for other materials such as Obsidian. Here is how you can add them: ```js title="periodic_table_elements.js" - const $IngotProperty = Java.loadClass('com.gregtechceu.gtceu.api.data.chemical.material.properties.IngotProperty'); - const $DustProperty = Java.loadClass('com.gregtechceu.gtceu.api.data.chemical.material.properties.DustProperty'); - const $BlastProperty = Java.loadClass('com.gregtechceu.gtceu.api.data.chemical.material.properties.BlastProperty'); +const $IngotProperty = Java.loadClass('com.gregtechceu.gtceu.api.data.chemical.material.properties.IngotProperty'); +const $DustProperty = Java.loadClass('com.gregtechceu.gtceu.api.data.chemical.material.properties.DustProperty'); +const $BlastProperty = Java.loadClass('com.gregtechceu.gtceu.api.data.chemical.material.properties.BlastProperty'); - GTCEuStartupEvents.registry('gtceu:material', event => { +GTCEuStartupEvents.registry('gtceu:material', event => { - // Ingot - GTMaterials.Zirconium.setProperty(PropertyKey.INGOT, new $IngotProperty()); - GTMaterials.Obsidian.setProperty(PropertyKey.INGOT, new $IngotProperty()); + // Ingot + GTMaterials.Zirconium.setProperty(PropertyKey.INGOT, new $IngotProperty()); + GTMaterials.Obsidian.setProperty(PropertyKey.INGOT, new $IngotProperty()); - // Dust - GTMaterials.Selenium.setProperty(PropertyKey.DUST, new $DustProperty()); + // Dust + GTMaterials.Selenium.setProperty(PropertyKey.DUST, new $DustProperty()); - // Blast Property - GTMaterials.Zirconium.setProperty(PropertyKey.BLAST, new $BlastProperty(8000, 'higher', GTValues.VA[GTValues.MV], 8000)); + // Blast Property + GTMaterials.Zirconium.setProperty(PropertyKey.BLAST, new $BlastProperty(8000, 'higher', GTValues.VA[GTValues.MV], 8000)); - }); +}); ``` Adding fluids to existing materials requires a bit of work with the new FluidStorage system @@ -35,50 +35,57 @@ const $FluidProperty = Java.loadClass('com.gregtechceu.gtceu.api.data.chemical.m const $FluidBuilder = Java.loadClass('com.gregtechceu.gtceu.api.fluids.FluidBuilder'); const $FluidStorageKeys = Java.loadClass('com.gregtechceu.gtceu.api.fluids.store.FluidStorageKeys'); -GTCEuStartupEvents.registry('gtceu:material', event => { - addFluid(GTMaterials.Iodine, $FluidStorageKeys.LIQUID); // Can be LIQUID, GAS, PLASMA or MOLTEN - addFluid(GTMaterials.Oganesson, $FluidStorageKeys.GAS); -} - - let addFluid = (mat, key) => { let prop = new $FluidProperty(); prop.getStorage().enqueueRegistration(key, new $FluidBuilder()); mat.setProperty(PropertyKey.FLUID, prop); } + +GTCEuStartupEvents.registry('gtceu:material', event => { + addFluid(GTMaterials.Iodine, $FluidStorageKeys.LIQUID); // Can be LIQUID, GAS, PLASMA or MOLTEN + addFluid(GTMaterials.Oganesson, $FluidStorageKeys.GAS); +}); ``` You can even add an ore to existing materials: ```js title="ore_property.js" - GTCEuStartupEvents.registry('gtceu:material', event => { +GTCEuStartupEvents.registry('gtceu:material', event => { - const $OreProperty = Java.loadClass('com.gregtechceu.gtceu.api.data.chemical.material.properties.OreProperty'); +const $OreProperty = Java.loadClass('com.gregtechceu.gtceu.api.data.chemical.material.properties.OreProperty'); - // Zinc Ore - GTMaterials.Zinc.setProperty(PropertyKey.ORE, new $OreProperty()); - - }); + GTMaterials.Zinc.setProperty(PropertyKey.ORE, new $OreProperty()); + +}); ``` +Do note that to edit keys that already exist on materials, you have to remove them first: +```js title="modifying_properties.js" +const $WireProperties = Java.loadClass("com.gregtechceu.gtceu.api.data.chemical.material.properties.WireProperties") + +GTCEuStartupEvents.registry('gtceu:material', event => { + GTMaterials.RedAlloy.removeProperty(PropertyKey.WIRE) + GTMaterials.RedAlloy.setProperty(PropertyKey.WIRE, new $WireProperties(8, 1, 0, true)) +}) +``` You can also add flags to existing materials: ```js title="flags.js" - GTCEuStartupEvents.registry('gtceu:material', event => { +GTCEuStartupEvents.registry('gtceu:material', event => { - GTMaterials.Lead.addFlags(GTMaterialFlags.GENERATE_GEAR); // This is for materials already in GTCEU - GTMaterials.get('custom_material_name').addFlags(GTMaterialFlags.GENERATE_FOIL); // This only works for materials added by GTCEU addons - - }); + GTMaterials.Lead.addFlags(GTMaterialFlags.GENERATE_GEAR); // This is for materials already in GTCEU + GTMaterials.get('custom_material_name').addFlags(GTMaterialFlags.GENERATE_FOIL); // This only works for materials added by GTCEU addons + +}); ``` Editing the color of an existing material: ```js title="material_modification.js" - GTCEuStartupEvents.materialModification(event => { - GTMaterials.BismuthBronze.setMaterialARGB(0x82AD92) //(1) - }) +GTCEuStartupEvents.materialModification(event => { + GTMaterials.BismuthBronze.setMaterialARGB(0x82AD92) //(1) +}) ``` 1. Most methods in the [``Material`` class](https://github.com/GregTechCEu/GregTech-Modern/blob/1.20.1/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/Material.java) can be used in the ``materialModification`` event diff --git a/docs/content/Modpacks/Materials-and-Elements/TagPrefixes-and-the-power-of-.setIgnored().md b/docs/content/Modpacks/Materials-and-Elements/TagPrefixes-and-the-power-of-.setIgnored().md index 5438349be25..5ab5c122912 100644 --- a/docs/content/Modpacks/Materials-and-Elements/TagPrefixes-and-the-power-of-.setIgnored().md +++ b/docs/content/Modpacks/Materials-and-Elements/TagPrefixes-and-the-power-of-.setIgnored().md @@ -76,3 +76,25 @@ GTCEuStartupEvents.materialModification(event => { // (1) The `Material` for which you are adjusting the TagPrefix must be registered in GTCEu Modern's material registry; if this material is custom, this is done using `GTCEuStartupEvents.registry()`, as depicted in these docs. + + +## What about fluids? + +Fluids are treated differently to items, their inclusion in a material is a property rather than a TagPrefix or MaterialFlag. +This makes replacing the fluid of a material with a fluid that you or another mod have created require a different approach than setIgnored. +The way to do this is using `GTFluids.handleNonMaterialFluids()` which can be found in the [``GTFluids`` class](https://github.com/GregTechCEu/GregTech-Modern/blob/1.20.1/src/main/java/com/gregtechceu/gtceu/common/data/GTFluids.java) + +`GTFluids.handleNonMaterialFluids()` takes in a `Material` and a `Fluid` or `Supplier` to replace the liquid of the material with the provided fluid. +Assure that the material is registered with a liquid before attempting to replace it with your new fluid. An example is below. + +!!! note "This may differ!" + Depending on the way your fluid is registered you may need to change how you pass the `Fluid` argument, check how it is registered in the mod you are working with. + +```java title="ExampleMaterials.java" +public static void register() { + GLUGG_BRINE = new Material.Builder(MyMod.id("glugg_brine")) + .liquid(new FluidBuilder()).buildAndRegister(); + + GTFluids.handleNonMaterialFluids(GLUGG_BRINE, () -> PVFluidRegistry.BRINE_FLUID_SOURCE.get()); +} +``` diff --git a/docs/content/Modpacks/Multiblocks/PartAbility.md b/docs/content/Modpacks/Multiblocks/PartAbility.md new file mode 100644 index 00000000000..0c21a7d9388 --- /dev/null +++ b/docs/content/Modpacks/Multiblocks/PartAbility.md @@ -0,0 +1,19 @@ +--- +title: PartAbility +--- +PartAbilities are a quick way of creating a PatternPredicate from a similar collection of blocks. Some examples are all EnergyHatches, every MufflerPart, all LaserHatches, etc. + +When you register some block or machine, you can set that block or machine as the value for some specific part abilities tier key. + +```java title="PartAbilityExample.java" +public static PartAbility myPartAbility = new PartAbility("myPartAbility"); // (1) +... +myPartAbility.register(0, Blocks.WOOD); // (2) +``` + +1. How to create a part ability. + +2. How to register values to a part ability. + + + diff --git a/docs/content/Modpacks/Multiblocks/PatternError.md b/docs/content/Modpacks/Multiblocks/PatternError.md new file mode 100644 index 00000000000..fb06cc541ce --- /dev/null +++ b/docs/content/Modpacks/Multiblocks/PatternError.md @@ -0,0 +1,56 @@ +--- +title: PatternError +--- +`PatternError`s are a descriptive way to tell the player why the multiblock has failed to form. They take in an optional BlockPos and required list of candidates. + +Each PatternError also must implement the ui modifier, which is the way to display that information to the player (through the main multiblock GUI). + +```java title="ExamplePatternError.java" +public class MyPatternError extends PatternError { + + // This codec is needed for serialization. It should send all the needed data to display the error on the client. + public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + BlockPos.CODEC.fieldOf("pos").forGetter(PatternError::getPos), + Codec.list(Codec.list(BlockInfo.CODEC)).fieldOf("candidates").forGetter(PatternError::getCandidates)) + .apply(instance, MyPatternError::new)); + + public static final PatternErrorType TYPE = new PatternErrorType(ExampleMod.id("my_pattern_error"), CODEC); + + public MyPatternError(@Nullable BlockPos pos, List> candidates) { + super(pos, candidates); + } + + // The UI modifier adds the widget to be displayed to the user if this error occurs. + public PatternErrorUI getPatternErrorUIModifier() { + return (widget) -> { + widget.child(new ContextMenuButton<>("predicate") + .menuList(l -> l + .maxSize(40) + .children(candidates, candidate -> { + return new ItemDrawable(candidate.getItemStackForm()).asWidget() + .tooltip(r -> r.add(candidate.getItemStackForm().getHoverName())); + }))); + }; + } + + @Override + public PatternErrorType type() { + return TYPE; + } +} +``` + +You also need to register your new PatternErrors statically: + +```java +public class ExampleMod { + public ExampleMod() { + IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); + modEventBus.addGenericListener(PatternError.PatternErrorType.class, this::registerPatternErrors); + } + + private void registerPatternErrors(GTCEuAPI.RegisterEvent event) { + event.register(MyPatternError.TYPE.id(), MyPatternError.TYPE); + } +} +``` diff --git a/docs/content/Modpacks/Multiblocks/Patterns.md b/docs/content/Modpacks/Multiblocks/Patterns.md new file mode 100644 index 00000000000..f2471505cc4 --- /dev/null +++ b/docs/content/Modpacks/Multiblocks/Patterns.md @@ -0,0 +1,47 @@ +--- +title: Patterns +--- +Multiblocks are MetaMachines that, for the sake of structure checking, are composed of two main features, the `IBlockPattern`s they need to form and the `PatternState` they exist in. Multiblocks can hold one or more patterns, each with a corresponding `PatternState`. When creating a multiblock definition, one will usually define a main structure (the part the controller lives in) and any amount of "sub"structures. + +There are two main forms of `IBlockPattern` in base GT Modern, `BlockPattern` and `ExpandablePattern`. + +BlockPatterns are a list of slices which are comprised of a list of strings and a mapping of each character to some `PatternPredicate`. + +ExpandablePatterns are a pattern that checks in some axis aligned cuboid around the pattern's origin and for each block in the bounds runs a `Predicate`. + +When creating a `PatternDefinition` for either a `BlockPattern` or `ExpandablePattern` in a `MultiblockMachineDefinition`, you need to define the iteration directionality and the origin of the pattern. The pattern `OriginOffset` is where each block in the pattern should be relative to (usually where the controller appears in the pattern). + +```java title="ExampleBlockPattern.java" + +public static MultiblockMachineDefinition MY_MACHINE = REGISTRATE + .multiblock("my_machine", (creationInfo) -> new MyMachineClass(creationInfo)) + .rotationState(RotationState.ALL) + .recipeType(GTRecipeTypes.ASSEMBLER_RECIPES) + .appearanceBlock(GTBlocks.CASING_INVAR_HEATPROOF) + .pattern(definition -> MultiblockPatternBuilder.start(RelativeDirection.FRONT, RelativeDirection.UP, RelativeDirection.RIGHT) // (1) + .slice("XXX", "CCC", "CCC", "XXX") // (2) + .sliceRepeatable(1, 3, "XXX", "C#C", "C#C", "XMX") // (3) + .slice("XSX", "CCC", "CCC", "XXX") + .slice("XSXX", "CCCC", "CCCC", "XXXX") // (7) + .where('S', Predicates.controller(definition)) // (4) + .where('X', Predicates.blocks(GTBlocks.CASING_INVAR_HEATPROOF) + .or(Predicates.autoAbilities(GTRecipeTypes.ASSEMBLER_RECIPES))) // (5) + .where('M', Predicates.autoAbilities(false, true, false)) + .where('A', Predicates.blockTag(CustomTags.CLEANROOM_FLOORS)) // (6) + .build()) + .register(); +``` + +1. The three directions passed in `.start()` are the directions to traverse per-slice, per-string-in-slice, and per-char-in-string respectively. The directions are relative based on the controllers front and upwards facing. Calling `.start()` with no arguments uses `BACK, UP, RIGHT`. + +2. How the 2-D view of this specific slice's mapping looks. + +3. A slice with an optional amount of repeats allowed, first value is min allowed(can be zero to make the whole slice optional), second is max allowed. + +4. `.where(char, PatternPredicate)` is how the block info to predicate evaluation mapping happens. + +5. An example complex PatternPredicate. + +6. This char mapping will throw an exception as 'A' does not appear in the pattern slices. + +7. This slice view will throw an exception as all slice's widths and heights must be the same respectively. \ No newline at end of file diff --git a/docs/content/Modpacks/Multiblocks/Predicates.md b/docs/content/Modpacks/Multiblocks/Predicates.md new file mode 100644 index 00000000000..e234d0bdb27 --- /dev/null +++ b/docs/content/Modpacks/Multiblocks/Predicates.md @@ -0,0 +1,131 @@ +--- +title: Predicates +--- +`PatternPredicate`s are the main system of turning some potential block in a multiblock `IBlockPattern` into a valid or invalid state. + +`PatternPredicate` can be composed of one or more `BasePredicate`s which means any of those `BasePredicate`s can succeed for the `PatternPredicate` to succeed (returning no `PatternError`). + +```java title="CustomPredicate.java" +public static PatternPredicate customPredicate() { + return new PatternPredicate("MyDebugName", // (1) + (blockInfo) -> { // (2) + BlockState state = blockInfo.getBlockState(); + if (state.getBlock() == Blocks.OAK_WOOD) { + return null; // (3) + } + return new BlockMatchingError(blockInfo.getBlockPos(), Blocks.OAK_WOOD); // (4) + }, new BlockInfo(Blocks.OAK_WOOD)); // (5) +} +``` + +1. Debug name of the predicate (used in the terminal preview), optional. + +2. The condition for if the PatternPredicate matches. + +3. If the predicate succeeds it MUST return null; + +4. If the predicate fails it will return some `PatternError` (see [Pattern Errors](./PatternError.md)) + +5. The list of all valid candidates for this predicate (used for terminal previewing and autobuilding). + + + +`BasePredicate`s are composed of two values, + +1. The `Predicate predicateError` which runs for each block state this predicate is assigned to and returns that specific error. + +2. The `List candidates` which are all the valid blocks for that predicate. + +3. `BasePredicate`s can also have a global min and max value, which causes specific `PatternError`s if there are too much or not enough of that predicate match succeeding. + +There are several helper methods to make various PatternPredicates: + +```java title="PredicateShortcuts.java" + +PatternPredicate any(); // (1) +PatternPredicate air(); // (2) + +PatternPredicate controller(MultiblockMachineDefinition def); // (3) +PatternPredicate machines(MachineDefinition... definitions); // (4) + +PatternPredicate blocks(String debugName, Block... blocks); // (5) +PatternPredicate blocks(Block... blocks); // (6) +PatternPredicate states(BlockState... allowedStates); // (7) +PatternPredicate fluids(Fluid... fluids); // (8) + +PatternPredicate blockTag(TagKey tag); // (9) +PatternPredicate fluidTag(TagKey tag); // (10) + +PatternPredicate abilities(PartAbility... abilities); // (11) +PatternPredicate ability(PartAbility ability, int... tiers); // (12) +PatternPredicate autoAbilities(GTRecipeType[] recipeType, + boolean checkEnergyIn, boolean checkEnergyOut, + boolean checkItemIn, boolean checkItemOut, + boolean checkFluidIn, boolean checkFluidOut); // (13) +PatternPredicate autoAbilities(GTRecipeType... recipeType); // (14) + +PatternPredicate autoAbilities(boolean checkMaintenance, boolean checkMuffler, + boolean checkParallel); // (15) + +PatternPredicate heatingCoils(); // (16) +PatternPredicate cleanroomFilters(); // (17) +PatternPredicate powerSubstationBatteries(); // (18) +PatternPredicate dataHatchPredicate(); // (19) +PatternPredicate frames(Material... frameMaterials); // (20) +``` + +1. Any block matches, returns no error. + +2. Only AIR can exist here. + +3. Shortcut for `blocks(definition.getBlock())` and sets the controller to that specific predicate. + +4. Must match any of these machines. + +5. Must match any of these blocks. + +6. Must match any of these blocks. + +7. Must match any of these block states. + +8. Must match any of these fluids. + +9. Must match the block tag. + +10. Must match the fluid tag. + +11. Must be one of the blocks in the `PartAbility` (see [Part Abilities](./PartAbility.md)) + +12. Must be one of the blocks in the `PartAbility` (see [Part Abilities](./PartAbility.md)) with one of those tier values. + +13. Fills predicate with the EU, Item and Fluid PartAbilities based on the RecipeType's recipe capability max values. + +14. Fills predicate with any of those RecipeType's recipe capabilities, see // (13) + +15. Fills predicate with Maintenance, Muffler and ParallelHatch PartAbilities. + +16. Fills predicate with CoilBlocks (used in Electric Blast Furnace, Cracking Unit, Rotary Hearth, etc.) + +17. Fills predicate with Cleanroom Filter casings. + +18. Fills predicate with PowerSubstation batteries. + +19. Fills predicate with Data Access and Optical Reception part abilities. + +20. Fills predicate with any GT frame matching those materials or any pipe with one of those frame box materials. + +```java title="ComplexPredicate.java" + +PatternPredicate myCustomPredicate = Predicates.heatingCoils() + .or(Predicates.blocks(Blocks.DIRT)) // (1) + .or(Predicates.frames(GTMaterials.Steel).setExactLimit(20)) // (2) + .or(Predicates.autoAbilities(true, false, true)) + .setMinGlobalLimited(40); // (3) + +``` + +1. To join multiple valid predicates, use `.or(PatternPredicate)` to chain them. + +2. A `BasePredicate` can have its own min and max counts separate to the rest of the `BasePredicates`. + +3. Sets the min count to 40 for the whole `Predicate`. diff --git a/docs/content/Modpacks/Multiblocks/StructureChecking.md b/docs/content/Modpacks/Multiblocks/StructureChecking.md new file mode 100644 index 00000000000..57680859eb3 --- /dev/null +++ b/docs/content/Modpacks/Multiblocks/StructureChecking.md @@ -0,0 +1,109 @@ +--- +title: Structure Checking +--- +The `MultiblockControllerMachine` class has a specific ordering in how it checks and forms the multiblocks. +!!! NOTE + Structure checking/forming only happens on the server side, if you need that information on client it MUST be synced through the annotation system (non ui) or MUI synced values (ui) + +1. When the controller is first placed `checkAndFormStructure()` is called. + +2. For every `IBlockPattern` in its definition, if that corresponding `PatternState` is not already formed: + 1. Each `IBlockPattern` is run through `checkStructurePattern(name)` + 2. If that structure is valid the structure is run through `formStructure(name)` + +3. The `PatternState` is added to the `MultiblockWorldSaveData` for `BlockState` listening + + +In `checkStructurePattern`, the pattern will use its iteration method and ensure every `PatternPredicate` succeeds, for each block position that matches the predicate, that block's information will be put in the `PatternState`'s cache for future use, like retrieving multi parts for recipe logic handler collection. When a predicate fails, it puts the failure reason(s) into the `PatternState` and stops the match iteration early. + +In `formStructure`, every `IMultiPart` found in the `PatternState` cache is attached to that specific controller. + +```java title="MultiPartGathering.java" + +public void formStructure(String substructureName) { + ... + if (patternState.getState() == PatternState.CheckState.VALID_UNCACHED) { + forEachMultiPart(substructureName, part -> { // (1) + if (parts.contains(part)) return true; + + if (part.hasController(getBlockPos()) && !part.canShared(this, substructureName)) { + invalidateStructure(substructureName); + return false; + } + + if (shouldAddPartToController(part)) { + this.parts.add(part); + } + return true; + }); + + for (var part : parts) { + ... + part.addedToController(this, substructureName); + } + ... +} +``` + +1. Execute some runnable for every multipart in this multiblock pattern structure. + +Machine classes can extend `formStructure(name)` for additional information gathering, like the coiled multiblocks. +```java title="WorkableCoilElectricMultiblock.java" +public class CoilWorkableElectricMultiblockMachine extends WorkableElectricMultiblockMachine { // (1) + @Getter + private ICoilType coilType = CoilBlock.CoilType.CUPRONICKEL; + @SyncToClient + @Getter + private int coilTier = 1; + + @Override + public void formStructure(@NotNull String substructureName) { // (2) + super.formStructure(substructureName); + var cache = patternStates.get(substructureName).getCache(); // (3) + ICoilType coilType = null; + for (var entry : cache.long2ObjectEntrySet()) { + var state = entry.getValue().getBlockState(); + if (state.getBlock() instanceof CoilBlock coil) { + if (GTCEuAPI.HEATING_COILS.containsKey(coil.coilType)) { + if (coilType == null) coilType = coil.coilType; + else { + if (coilType != coil.coilType) { + // (4) + patternStates.get(substructureName).setError( + new CoilMatchingError(BlockPos.of(entry.getLongKey()), coilType, coil.coilType)); + invalidateStructure(substructureName); // (5) + return; + } + } + } + } + } + if (coilType != null) { + this.coilType = coilType; + this.coilTier = coilType.getTier(); + getSyncDataHolder().markClientSyncFieldDirty("coilTier"); + } + } +} +``` + +1. WorkableElectricMultiblockMachine extends MultiblockControllerMachine, where `formStructure()` is. + +2. `formStructure` can behave differently depending on what name is passed, for example if you want sub structures to have different forming logic. + +3. How to retrieve information from the pattern cache. + +4. If you want to explicitly invalidate a structure with custom reasoning, make sure to set the `PatternError` so that users know why. + +5. Call `invalidateStructure` manually so that that specific substructure is not formed. + + +Structure check and forming only occurs under a few conditions: + + - the controller is first loaded into world. + + - a block state change occurred somewhere in the bounds of the pattern cache (only for predicates that are not ANY). + + - The multiblock controller has its front or upwards facing rotated. + +Structure checking also no longer happens off thread or asynchronously. diff --git a/docs/content/Modpacks/Ore-Generation/Bedrock-Fluid-Veins.md b/docs/content/Modpacks/Ore-Generation/Bedrock-Fluid-Veins.md index e3766b1a553..a76da3ac572 100644 --- a/docs/content/Modpacks/Ore-Generation/Bedrock-Fluid-Veins.md +++ b/docs/content/Modpacks/Ore-Generation/Bedrock-Fluid-Veins.md @@ -5,26 +5,113 @@ title: Bedrock Fluid Veins # Bedrock Fluid Veins -Bedrock Fluid Veins are invisable veins that exist under the bedrock, to find Fluid Veins you must have at least a HV tier Prospector. A Fluid Drilling Rig must be used to obtain the fluids out of the vein. +Bedrock Fluid Veins are invisible veins that exist under the bedrock, to find Fluid Veins you must have at least a HV tier Prospector. A Fluid Drilling Rig must be used to obtain the fluids out of the vein. ## Creating a Bedrock Fluid Vein -```js title="fluid_veins.js" -// In server events -GTCEuServerEvents.fluidVeins(event => { - - event.add('gtceu:custom_bedrock_fluid_vein', vein => { - vein.dimensions('minecraft:overworld') // (1) - vein.fluid(() => Fluid.of('gtceu:custom_fluid').fluid) - vein.weight(600) - vein.minimumYield(120) - vein.maximumYield(720) - vein.depletionAmount(2) - vein.depletionChance(1) - vein.depletedYield(50) +=== "JavaScript" + ```js title="fluid_veins.js" + // In server events + GTCEuServerEvents.fluidVeins(event => { + event.add('gtceu:custom_bedrock_fluid_vein', vein => { + vein.dimensions('minecraft:overworld') // (1) + vein.fluid(() => Fluid.of('gtceu:custom_fluid').fluid) + vein.weight(600) + vein.minimumYield(120) + vein.maximumYield(720) + vein.depletionAmount(2) + vein.depletionChance(1) + vein.depletedYield(50) + }); }); -}); + ``` + + 1. Dimension where fluid vein will spawn. -``` +=== "Java" + In Java, `.dimensions()` only accepts a `Set>`. For example, this is how you would assign the overworld a variable: + ```java + public static final Set> DIM_OVERWORLD = Set.of(Level.OVERWORLD); + ``` + To have multiple dimensions in the same set, simply add more `ResourceKey` instances into the set itself. Here's an example for all vanilla dimensions: + ```java + public static final Set> DIM_ALL = Set.of(Level.OVERWORLD, Level.NETHER, Level.END); + ``` + You can define this in any class you want (including the one with the bedrock fluid vein definitions themselves), as long as you're able to reference it in the class where you're defining the bedrock fluid veins. + With this done, you can reference said variables in the `BedrockFluidDefinition` builder. Let's use `DIM_OVERWORLD` in this example. + + ```java title="ExampleBedrockFluidVeins.java" + public class ExampleBedrockFluidVeins { + public static void init() {} + + public static final Set> DIM_OVERWORLD = Set.of(Level.OVERWORLD); + + public static final BedrockFluidDefinition CUSTOM_BEDROCK_FLUID_VEIN = BedrockFluidDefinition.builder(ExampleMod.id("custom_bedrock_fluid_vein")) + .dimensions(DIM_OVERWORLD) // (1) + .fluid(CustomFluid::getFluid) // (2) + .weight(600) + .yield(120, 720) + .depletionAmount(2) + .depletionChance(1) + .depletedYield(50) + .register(); + } + ``` -1. Dimension where fluid vein will spawn. \ No newline at end of file + 1. Dimension where fluid vein will spawn. + 2. Replace `CustomFluid` with any GTMaterial you want to get the fluid from. + + As the last step, you need to actually enable the registration of the veins in your class implementing IGTAddon. + + ```java title="ExampleModGTAddon.java" + @GTAddon + public class ExampleModGTAddon implements IGTAddon { + // ... + @Override + public void registerFluidVeins() { + ExampleBedrockFluidVeins.init(); + } + // ... + } + ``` + + +## Modifying a Bedrock Fluid Vein + +=== "JavaScript" + ```js title="fluid_veins.js" + // In server events + GTCEuServerEvents.fluidVeins(event => { + event.modify('gtceu:heavy_oil_deposit', vein => { + vein.setWeight(9999); + }); + }); + ``` + +=== "Java" + ```java title="ExampleBedrockFluidVeins.java" + public class ExampleBedrockFluidVeins { + public static void init() { + GTRegistries.BEDROCK_FLUID_DEFINITIONS.get(GTCEu.id('heavy_oil_deposit')).setWeight(9999); + } + } + ``` + +## Removing a Bedrock Fluid Vein + +=== "JavaScript" + ```js title="fluid_veins.js" + // In server events + GTCEuServerEvents.fluidVeins(event => { + event.remove('gtceu:heavy_oil_deposit'); + }); + ``` + +=== "Java" + ```java title="ExampleBedrockFluidVeins.java" + public class ExampleBedrockFluidVeins { + public static void init() { + GTRegistries.BEDROCK_FLUID_DEFINITIONS.remove(GTCEu.id("heavy_oil_deposit")); + } + } + ``` diff --git a/docs/content/Modpacks/Ore-Generation/Bedrock-Ore-Veins.md b/docs/content/Modpacks/Ore-Generation/Bedrock-Ore-Veins.md index 494f27d36f1..14a3d1ead89 100644 --- a/docs/content/Modpacks/Ore-Generation/Bedrock-Ore-Veins.md +++ b/docs/content/Modpacks/Ore-Generation/Bedrock-Ore-Veins.md @@ -16,24 +16,114 @@ To enable this feature, you need to enable the config option **Machines -> doBed ## Adding Bedrock Veins -By default, the mod doesn't include any bedrock ore veins. - -You can add them using the `bedrockOreVeins` server event: - -```js -GTCEuServerEvents.bedrockOreVeins(event => { - event.add('kubejs:overworld_bedrock_ore_vein_iron', vein => { - vein.weight(100) - .size(3) // (1) - .yield(10, 20) - .material(GTMaterials.Goethite, 5) // (2) - .material(GTMaterials.Limonite, 2) - .material(GTMaterials.Hematite, 2) - .material(GTMaterials.Malachite, 1) - .dimensions('minecraft:overworld') +By default, the mod doesn't include any bedrock ore veins. You can add them in either KubeJS or Java using one of the following: + +=== "JavaScript" + Using the `bedrockOreVeins` server event: + ```js + GTCEuServerEvents.bedrockOreVeins(event => { + event.add('kubejs:overworld_bedrock_ore_vein_iron', vein => { + vein.weight(100) + .size(3) // (1) + .yield(10, 20) + .material(GTMaterials.Goethite, 5) // (2) + .material(GTMaterials.Limonite, 2) + .material(GTMaterials.Hematite, 2) + .material(GTMaterials.Malachite, 1) + .dimensions('minecraft:overworld') + }) }) -}) -``` + ``` + + 1. The diameter of the bedrock vein in chunks + 2. The second parameter defines the chance of each material being mined on each cycle +=== "Java" + In Java, `.dimensions()` only accepts a `Set>`. For example, this is how you would assign the overworld a variable: + ```java + public static final Set> DIM_OVERWORLD = Set.of(Level.OVERWORLD); + ``` + To have multiple dimensions in the same set, simply add more `ResourceKey` instances into the set itself. Here's an example for all vanilla dimensions: + ```java + public static final Set> DIM_ALL = Set.of(Level.OVERWORLD, Level.NETHER, Level.END); + ``` + You can define this in any class you want (including the one with the bedrock ore vein definitions themselves), as long as you're able to reference it in the class where you're defining the bedrock ore veins. + With this done, you can reference said variables in the `BedrockOreDefinition` builder. Let's use `DIM_OVERWORLD` in this example. + + ```java title="ExampleBedrockOreVeins.java" + public class ExampleBedrockOreVeins { + public static void init() {} + + public static final Set> DIM_OVERWORLD = Set.of(Level.OVERWORLD); + + public static final BedrockOreDefinition OVERWORLD_BEDROCK_ORE_VEIN_IRON = BedrockOreDefinition.builder(ExampleMod.id("overworld_bedrock_ore_vein_iron")) + .weight(100) + .size(3) // (1) + .yield(10, 20) + .materials(List.of( + new WeightedMaterial(Goethite, 5), // (2) + new WeightedMaterial(Limonite, 2), + new WeightedMaterial(Hematite, 2), + new WeightedMaterial(Gold, 1) + )) + .dimensions(DIM_OVERWORLD) + .register(); + } + ``` + + 1. The diameter of the bedrock vein in chunks + 2. The second parameter defines the chance of each material being mined on each cycle + + As the last step, you need to actually enable the registration of the veins in your class implementing IGTAddon. + + ```java title="ExampleModGTAddon.java" + @GTAddon + public class ExampleModGTAddon implements IGTAddon { + // ... + @Override + public void registerBedrockOreVeins() { + ExampleBedrockOreVeins.init(); + } + // ... + } + ``` + +## Modifying a Bedrock Ore Vein + +=== "JavaScript" + ```js title="ore_veins.js" + // In server events + GTCEuServerEvents.bedrockOreVeins(event => { + event.modify('gtceu:example_ore', vein => { + vein.weight(9999) + }); + }); + ``` + +=== "Java" + ```java title="ExampleBedrockOreVeins.java" + public class ExampleBedrockOreVeins { + public static void init() { + GTRegistries.BEDROCK_ORE_DEFINITIONS.get(GTCEu.id('example_ore')).weight(9999); + } + } + ``` + + +## Removing a Bedrock Ore Vein + +=== "JavaScript" + ```js title="ore_veins.js" + // In server events + GTCEuServerEvents.bedrockOreVeins(event => { + event.remove('gtceu:example_ore'); + }); + ``` -1. The diameter of the bedrock vein in chunks -2. The second parameter defines the chance of each material being mined on each cycle +=== "Java" + ```java title="ExampleBedrockOreVeins.java" + public class ExampleBedrockOreVeins { + public static void init() { + GTRegistries.BEDROCK_ORE_DEFINITIONS.remove(GTCEu.id("example_ore")); + } + } + ``` diff --git a/docs/content/Modpacks/Other-Topics/Connected-Textures.md b/docs/content/Modpacks/Other-Topics/Connected-Textures.md new file mode 100644 index 00000000000..1b929e6aefe --- /dev/null +++ b/docs/content/Modpacks/Other-Topics/Connected-Textures.md @@ -0,0 +1,63 @@ +--- +title: Creating Connected Textures +--- + +**Connected textures** are, as the name would imply, textures that connect with neighboring blocks. + +The CTM renderer will draw the block faces by assembling 4 quadrants from the 5 available block textures. +The normal `texture.png` is the block's "unconnected" texture, and is used when CTM is disabled or the block +has nothing to connect to. +`texture.png` has the outside corner quadrants and `texture_ctm.png` contains the connections. +``` +┌─────────────────┐ ┌────────────────────────────────┐ +│ texture.png │ │ texture_ctm.png │ +│ ╔══════╤══════╗ │ │ ──────┼────── ║ ─────┼───── ║ │ +│ ║ │ ║ │ │ │ │ │║ │ ║ │ +│ ║ 4/4 │ 4/5 ║ │ │ │ 0/0 │ 0/1 │║ 0/2 │ 0/3 ║ │ +│ ╟──────┼──────╢ │ │ ┼──────┼──────┼╟──────┼──────╢ │ +│ ║ │ ║ │ │ │ │ │║ │ ║ │ +│ ║ 5/4 │ 5/5 ║ │ │ │ 1/0 │ 1/1 │║ 1/2 │ 1/3 ║ │ +│ ╚══════╧══════╝ │ │ ──────┼────── ║ ─────┼───── ║ │ +└─────────────────┘ │ ═══════╤═══════╝ ─────┼───── ╚ │ + │ │ │ ││ │ │ │ + │ │ 2/0 │ 2/1 ││ 2/2 │ 2/3 │ │ + │ ┼──────┼──────┼┼──────┼──────┼ │ + │ │ │ ││ │ │ │ + │ │ 3/0 │ 3/1 ││ 3/2 │ 3/3 │ │ + │ ═══════╧═══════╗ ─────┼───── ╔ │ + └────────────────────────────────┘ +``` + +For example, combining sections 4/4, 2/1, 5/4, and 3/1, we can generate a texture connected to the right! +``` +╔══════╤═══════ +║ │ │ +║ 4/4 │ 2/1 │ +╟──────┼──────┼ +║ │ │ +║ 5/4 │ 3/1 │ +╚══════╧═══════ +``` +Combining sections 0/2, 2/3, 5/4, and 3/1, we can generate a texture in the shape of an L (connected to the right and up): +``` +║ ─────┼───── ╚ +║ │ │ +║ 0/2 │ 2/3 │ +╟──────┼──────┼ +║ │ │ +║ 5/4 │ 3/1 │ +╚══════╧═══════ +``` + + +??? example "Example MCMeta file" + (For a texture `mypack/assets/textures/blocks/texture.png` with a ctm texture `mypack/assets/textures/blocks/texture_ctm.png`) + ```json title="mypack:blocks/texture.png.mcmeta" + { + "gtceu": { + "connection_texture": "mypack:blocks/texture_ctm" + } + } + ``` + The CTM texture layout is [here](https://github.com/GregTechCEu/GregTech-Modern/blob/1.20.1/src/main/resources/assets/gtceu/textures/block/ctm_test.png) for the unconnected texture and [here](https://github.com/GregTechCEu/GregTech-Modern/blob/1.20.1/src/main/resources/assets/gtceu/textures/block/ctm_test_ctm.png) for its connections. + Its MCMeta metadata file is [this one](https://github.com/GregTechCEu/GregTech-Modern/blob/1.20.1/src/main/resources/assets/gtceu/textures/block/ctm_test.png.mcmeta). diff --git a/docs/content/Modpacks/Other-Topics/Dimension-Icons.md b/docs/content/Modpacks/Other-Topics/Dimension-Icons.md new file mode 100644 index 00000000000..439f59f2041 --- /dev/null +++ b/docs/content/Modpacks/Other-Topics/Dimension-Icons.md @@ -0,0 +1,60 @@ +--- +title: Dimension Icons +--- + +Dimension icons are the icons shown when the `dimension` recipe condition, as well as in recipe viewers to show which dimensions an ore vein can be generated in. + +New ones can be made and existing ones can be modified both in `Java` and `KubeJS`. + +To make or modify a dimension icon in `Java` you will need to add a listener to the mod's constructor. + +`modEventBus.addGenericListener(DimensionMarker.class, this::registerDimensionMarkers);` + +Below is an example of making new and modifying existing dimension icons in a Java addon. + +```java +private void registerDimensionMarkers(GTCEuAPI.RegisterEvent event) { + // Making a new icon. + ResourceLocation sceneDimKey = new ResourceLocation(Phantasia.MOD_ID, "scene"); + DimensionMarker sceneMarker = new DimensionMarker( + 3, // Tier + () -> Items.DIAMOND_BLOCK, // Supplier for the actual Icon ItemStack. + "mymod.dimension.example_dimension.name" // Lang key can also be a normal text block. + ); + event.register(sceneDimKey, sceneMarker); + + // Editing an existing icon. + ResourceLocation netherKey = new ResourceLocation("minecraft", "the_nether"); + DimensionMarker upgradedNetherMarker = new DimensionMarker( + 5, + () -> Items.NETHERITE_BLOCK, + "text.mymod.super_nether" + ); + GTRegistries.DIMENSION_MARKERS.registerOrOverride(netherKey, upgradedNetherMarker); +} +``` + +`Dimension Icons` also can be made/edited using `KubeJS` scripts using similar syntax. + +```js +GTCEuStartupEvents.registry("gtceu:dimension_marker", event => { + // Edit existing dimension icon, + const DimensionMarker = Java.loadClass('com.gregtechceu.gtceu.api.data.DimensionMarker') + + let netherKey = new ResourceLocation("minecraft", "the_nether") + + let upgradedNetherMarker = new DimensionMarker( + 5, + Items.NETHERITE_BLOCK, + "text.mymod.super_nether" + ) + + GTRegistries.DIMENSION_MARKERS.registerOrOverride(netherKey, upgradedNetherMarker) + + // New icon + event.create("ad_astra:glacio") + .iconSupplier(() => Item.of("ad_astra:glacio_globe").getItem()) + .tier(0) + .overrideName("Glacio") +}) +``` diff --git a/docs/content/Modpacks/Other-Topics/Dynamic-Renders.md b/docs/content/Modpacks/Other-Topics/Dynamic-Renders.md new file mode 100644 index 00000000000..7592b7fa25e --- /dev/null +++ b/docs/content/Modpacks/Other-Topics/Dynamic-Renders.md @@ -0,0 +1,121 @@ +--- +title: Dynamic Renders +--- + +Dynamic renders allow you to attach custom block entity rendering logic to a machine. They run client-side every frame and can read live machine state to animate or display information in the world. + +### How it works + +A `DynamicRender` is a typed renderer that is attached to a machine model. You create a class that extends `DynamicRender`, where `T` is the machine type it reads from and `S` is the renderer class itself. The renderer is registered during mod initialisation, and attached to a machine definition via `.model([base model].andThen(b -> b.addDynamicRenderer(...)))`. + +### Creating a renderer + +Each renderer needs three things: + +1. A `Codec` for serialization (use `Codec.unit(MyRender::new)` if it has no configuration) +2. A `DynamicRenderType` that wraps the codec +3. A `render(...)` method that does the actual rendering + +```java title="ItemAboveControllerRender.java" +public class ItemAboveControllerRender + extends DynamicRender { + + // spotless:off + public static final Codec CODEC = Codec.unit(ItemAboveControllerRender::new); + public static final DynamicRenderType TYPE = + new DynamicRenderType<>(ItemAboveControllerRender.CODEC); + // spotless:on + + public ItemAboveControllerRender() {} + + @Override + public DynamicRenderType getType() { + return TYPE; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void render(WorkableElectricMultiblockMachine machine, float partialTick, + PoseStack poseStack, MultiBufferSource buffer, + int packedLight, int packedOverlay) { + // recipeLogic.isWorking() is safe here because RecipeLogic.status is @SyncToClient + ItemStack displayStack = machine.recipeLogic.isWorking() + ? new ItemStack(Items.GREEN_WOOL) + : new ItemStack(Items.RED_WOOL); + + poseStack.pushPose(); + poseStack.translate(0.5, 2.5, 0.5); // center of block, 2 blocks up + float totalTick = machine.getLevel().getGameTime() + partialTick; + poseStack.mulPose(new Quaternionf().rotateY(totalTick * Mth.TWO_PI / 60)); + poseStack.scale(0.5f, 0.5f, 0.5f); + + Minecraft.getInstance().getItemRenderer().renderStatic( + displayStack, ItemDisplayContext.FIXED, + LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, + poseStack, buffer, machine.getLevel(), 0); + poseStack.popPose(); + } + + @Override + public boolean shouldRenderOffScreen(WorkableElectricMultiblockMachine machine) { + return true; + } + + @Override + public AABB getRenderBoundingBox(WorkableElectricMultiblockMachine machine) { + BlockPos pos = machine.getBlockPos(); + return new AABB(pos.offset(-1, 0, -1), pos.offset(2, 4, 2)); + } +} +``` + +!!! warning "Server-side data must be synced" + `render(...)` runs on the render thread, so any machine state you read must be sent to clients, for example with `@SyncToClient` . Using server-only fields will silently read stale or default values. `RecipeLogic.status` and `RecipeLogic.isActive` are both `@SyncToClient`, which is why `recipeLogic.isWorking()` works here. If you add fields to a custom machine and want to use them in a renderer, annotate them accordingly. See the [sync annotations reference](../../Development/Data-Sync-System/Annotations.md) for details. + +!!! warning "Renders are global" + Only one instance of the render class exists. Make sure to not store any machine- or instance-specific data in the class. There is also no lifecycle management for BEs going off-screen or being destroyed, so by putting the data in the render class you would have a bunch of stale values and memory leaks. + +### Registering the type + +Register your renderer type in your mod's main java file: + +```java title="ExampleMod.java" +@Mod(ExampleMod.MOD_ID) +public class ExampleMod { + + public ExampleMod() { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> ExampleMod::initializeDynamicRenders); + } + + public static void initializeDynamicRenders() { + DynamicRenderManager.register(ExampleMod.id("item_above_controller"), ItemAboveControllerRender.TYPE); + } +} +``` + +### Attaching to a machine + +Use `.model([base model].andThen(b -> b.addDynamicRenderer(() -> new ...())))` when defining the machine. If the machine previously used the `.workableCasingModel(...)` shorthand, expand it into `.model(createWorkableCasingMachineModel(...).andThen(...))`: + +```java +public static final MultiblockMachineDefinition MY_MACHINE = REGISTRATE + .multiblock("my_machine", WorkableElectricMultiblockMachine::new) + // ... recipe type, pattern, etc. ... + .modelProperty(GTMachineModelProperties.RECIPE_LOGIC_STATUS, RecipeLogic.Status.IDLE) + .model(createWorkableCasingMachineModel( + GTCEu.id("block/casings/solid/machine_casing_inert_ptfe"), + GTCEu.id("block/multiblock/large_chemical_reactor")) + .andThen(b -> b.addDynamicRenderer(() -> new ItemAboveControllerRender()))) + .hasBER(true) + .register(); +``` + +### Optional overrides + +- **`shouldRender(machine, cameraPos)`** — Controls whether the renderer runs at all for a given frame. By default it returns `true` as long as the camera is within the view distance returned by `getViewDistance()`. You can override this to add additional conditions, such as skipping the render when the machine is not working. + +- **`shouldRenderOffScreen(machine)`** — Determines whether the renderer continues to run when the controller block is outside the camera frustum. Defaults to `false`, meaning the renderer is culled along with the block when the block moves out of view. + +- **`getRenderBoundingBox(machine)`** — Defines the bounding box used for off-screen culling when `shouldRenderOffScreen` is `true`. Defaults to a 3×2×3 box centered on the controller. Override this to return a box that tightly wraps your actual rendered content; a box that is too small will cause the render to disappear while still partially visible, and a box that is too large will prevent culling and waste resources. + +- **`getViewDistance()`** — Sets the maximum distance in blocks at which the renderer will run, used by the default `shouldRender` implementation. Defaults to `64`. Lower this for expensive renders that do not need to be visible far away, or raise it if the render needs to be legible from a long distance. diff --git a/gradle/forge.versions.toml b/gradle/forge.versions.toml index 5d03eb25efe..0875a912d2b 100644 --- a/gradle/forge.versions.toml +++ b/gradle/forge.versions.toml @@ -1,16 +1,17 @@ [versions] -ldlib = "1.0.40.b" registrate = "MC1.20-1.3.11" configuration = "3.1.0-forge" mixinExtras = "0.5.0-rc.3" jei = "15.20.0.115" rei = "12.1.785" -emi = "1.1.13+1.20.1" +emi = "1.1.24+1.20.1" ae2 = "15.0.18" +mui = "3.3.1-SNAPSHOT" kubejs = "2001.6.5-build.16" rhino = "2001.2.3-build.10" architectury = "9.2.14" +clothmath = "+" clothconfig = "11.1.136" curios = "5.9.1+1.20.1" kotlinforforge = "4.11.0" @@ -30,7 +31,7 @@ xaerosMinimap = "25.3.10" ## modrinth maven ## jade = "11.6.3" -embeddium = "0.3.31+mc1.20.1" +embeddium = "0.3.31-beta.53+mc1.20.1" oculus = "1.20.1-1.8.0" modernfix = "DdUByV9S" # 5.24.1+mc1.20.1 @@ -53,12 +54,13 @@ ftbquests-cm = "6167056" ftbchunks-cm = "5956390" [libraries] -ldlib = { module = "com.lowdragmc.ldlib:ldlib-forge-1.20.1", version.ref = "ldlib" } registrate = { module = "com.tterrag.registrate:Registrate", version.ref = "registrate" } configuration = { module = "dev.toma.configuration:configuration-1.20.1", version.ref = "configuration" } mixinExtras-common = { module = "io.github.llamalad7:mixinextras-common", version.ref = "mixinExtras" } mixinExtras-forge = { module = "io.github.llamalad7:mixinextras-forge", version.ref = "mixinExtras" } +mui = { module = "brachy.modularui:modularui-mc1.20.1", version.ref = "mui" } + jei-common-api = { module = "mezz.jei:jei-1.20.1-common-api", version.ref = "jei" } jei-forge-api = { module = "mezz.jei:jei-1.20.1-forge-api", version.ref = "jei" } jei-forge-impl = { module = "mezz.jei:jei-1.20.1-forge", version.ref = "jei" } @@ -75,6 +77,7 @@ flywheel-forge = { module = "dev.engine-room.flywheel:flywheel-forge-1.20.1 kubejs = { module = "dev.latvian.mods:kubejs-forge", version.ref = "kubejs" } rhino = { module = "dev.latvian.mods:rhino-forge", version.ref = "rhino" } architectury = { module = "dev.architectury:architectury-forge", version.ref = "architectury" } +clothmath = { module = "me.shedaniel.cloth:basic-math", version.ref = "clothmath" } clothconfig = { module = "me.shedaniel.cloth:cloth-config-forge", version.ref = "clothconfig" } curios = { module = "top.theillusivec4.curios:curios-forge", version.ref = "curios" } kotlinforforge = { module = "thedarkcolour:kotlinforforge", version.ref = "kotlinforforge" } @@ -85,7 +88,7 @@ ftbteams = { module = "dev.ftb.mods:ftb-teams-forge", version.ref = " ftbquests = { module = "dev.ftb.mods:ftb-quests-forge", version.ref = "ftbquests" } ftbchunks = { module = "dev.ftb.mods:ftb-chunks-forge", version.ref = "ftbchunks" } jade = { module = "maven.modrinth:jade", version.ref = "jade" } -embeddium = { module = "maven.modrinth:embeddium", version.ref = "embeddium" } +embeddium = { module = "org.embeddedt:embeddium-1.20.1", version.ref = "embeddium" } oculus = { module = "maven.modrinth:oculus", version.ref = "oculus" } modernfix = { module = "maven.modrinth:modernfix", version.ref = "modernfix" } xaeroslib = { module = "xaero.lib:xaerolib-forge-1.20.1", version.ref = "xaerosLib" } @@ -117,7 +120,7 @@ ftbchunks-cm = { module = "curse.maven:ftb-chunks-forge-314906", version. [bundles] jei = ["jei-common-api", "jei-forge-api", "jei-forge-impl"] -rei = ["rei-plugin", "rei-forge"] +rei = ["rei-plugin", "rei-forge", "clothmath"] rei-runtime = ["rei-forge", "architectury", "clothconfig"] kjs = ["kubejs", "rhino", "architectury"] diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 96029a58b06..880fc1a6e45 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,6 +10,7 @@ lombok = "8.14" jetbrains-annotations = "26.0.1" renderNurse = "0.0.12" mixin = "0.8.7" +evalEx = "3.6.0" [libraries] minecraft = { module = "com.mojang:minecraft", version.ref = "minecraft" } @@ -17,6 +18,7 @@ minecraftForge = { module = "net.minecraftforge:forge", version.ref = " jetbrains-annotations = { module = "org.jetbrains:annotations", version.ref = "jetbrains-annotations" } renderNurse = { module = "net.neoforged:render-nurse", version.ref = "renderNurse" } mixin = { module = "org.spongepowered:mixin", version.ref = "mixin" } +evalEx = { module = "com.ezylang:EvalEx", version.ref = "evalEx" } [plugins] modDevGradle = { id = "net.neoforged.moddev.legacyforge", version.ref = "modDevGradle" } diff --git a/gradle/scripts/moddevgradle.gradle b/gradle/scripts/moddevgradle.gradle index 3f857566965..f24fd0b5211 100644 --- a/gradle/scripts/moddevgradle.gradle +++ b/gradle/scripts/moddevgradle.gradle @@ -152,10 +152,16 @@ legacyForge { // Enable assertions for our classes in dev environment jvmArgument('-ea:com.gregtechceu.gtceu...') + // jvmArgument("-XX:+AllowEnhancedClassRedefinition") + jvmArgument("-XX:+AllowRedefinitionToAddDeleteMethods") + // Recommended logging level for the console // You can set various levels here. // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels logLevel = org.slf4j.event.Level.INFO + + // Disable JOML using scientific notation for its types' toString() outputs + systemProperty 'joml.format', 'false' } } } diff --git a/gradle/scripts/repositories.gradle b/gradle/scripts/repositories.gradle index e68d100ae2a..ec88ce35dd9 100644 --- a/gradle/scripts/repositories.gradle +++ b/gradle/scripts/repositories.gradle @@ -1,17 +1,31 @@ repositories { mavenLocal() mavenCentral() - // force gradle to download FastUtil & LWJGL from the central maven so we can get source artifacts + // force gradle to download FastUtil and LWJGL from the central maven so we can get source artifacts exclusiveContent { // Force forRepository { mavenCentral() } filter { includeGroup("it.unimi.dsi") includeGroup("org.lwjgl") + includeGroupAndSubgroups("io.netty") includeGroup("com.google.guava") includeGroup("io.netty") } } + exclusiveContent { // Create, Ponder, Flywheel + forRepository { maven { url = "https://maven.blamejared.com" } } + filter { + includeGroup("mezz.jei") + includeGroup("org.embeddedt") + } + } + + maven { + name = 'GTCEu Maven' + url = 'https://maven.gtceu.com' + } + maven { // JEI name = "Jared's Maven" url = "https://maven.blamejared.com/" @@ -45,7 +59,7 @@ repositories { } exclusiveContent { // KubeJS and Rhino forRepository { maven { url = "https://maven.latvian.dev/releases" } } - filter { includeGroup("dev.latvian.mods")} + filter { includeGroup("dev.latvian.mods") } } exclusiveContent { // FTB mods forRepository { maven { url = "https://maven.ftb.dev/releases" } } diff --git a/gradle/scripts/resources.gradle b/gradle/scripts/resources.gradle index 72a90fea3b6..0aeba2a2485 100644 --- a/gradle/scripts/resources.gradle +++ b/gradle/scripts/resources.gradle @@ -41,7 +41,6 @@ var generateModMetadata = tasks.register("generateModMetadata", ProcessResources forge_version : forgeVers, // only specify major version of forge configuration_version: forge.versions.configuration.get().split("-")[0], kjs_version : forge.versions.kubejs.get().split("\\.")[0], // only specify major version of kjs - ldlib_version : forge.versions.ldlib.get(), jei_version : forge.versions.jei.get(), emi_version : forge.versions.emi.get(), jade_version : forge.versions.jade.get(), diff --git a/injected_interfaces/interfaces.json b/injected_interfaces/interfaces.json index 1ab154b3032..01ee4dec99d 100644 --- a/injected_interfaces/interfaces.json +++ b/injected_interfaces/interfaces.json @@ -1,6 +1,12 @@ { "net/minecraft/client/renderer/block/model/BakedQuad": [ - "com/gregtechceu/gtceu/core/IGTBakedQuad" + "com/gregtechceu/gtceu/core/util/extensions/BakedQuadExt" + ], + "com/mojang/blaze3d/vertex/VertexConsumer": [ + "com/gregtechceu/gtceu/core/util/extensions/VertexConsumerExt" + ], + "net/minecraftforge/client/model/lighting/QuadLighter": [ + "com/gregtechceu/gtceu/core/util/extensions/QuadLighterExt" ], "net/minecraft/world/entity/Entity": [ "com/gregtechceu/gtceu/core/IFireImmuneEntity", diff --git a/src/generated/resources/assets/gtceu/blockstates/active_transformer.json b/src/generated/resources/assets/gtceu/blockstates/active_transformer.json index eef9c45a4b4..d1d3e8ef9d8 100644 --- a/src/generated/resources/assets/gtceu/blockstates/active_transformer.json +++ b/src/generated/resources/assets/gtceu/blockstates/active_transformer.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/active_transformer" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/active_transformer", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/active_transformer", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/active_transformer" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/active_transformer", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/active_transformer", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/active_transformer" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/active_transformer", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/active_transformer", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/active_transformer", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/active_transformer" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/active_transformer" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/active_transformer" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/active_transformer" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/active_transformer" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/active_transformer" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/active_transformer" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/active_transformer", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/active_transformer", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/active_transformer", - "y": 180 + "model": "gtceu:block/machine/active_transformer" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/active_transformer" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/active_transformer", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/active_transformer", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/active_transformer" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/active_transformer", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/active_transformer", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/active_transformer" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/active_transformer", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/active_transformer", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/active_transformer" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/active_transformer", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/active_transformer", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/active_transformer", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/active_transformer" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/advanced_monitor.json b/src/generated/resources/assets/gtceu/blockstates/advanced_monitor.json index bdbe61ba519..123dedeaf6a 100644 --- a/src/generated/resources/assets/gtceu/blockstates/advanced_monitor.json +++ b/src/generated/resources/assets/gtceu/blockstates/advanced_monitor.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/advanced_monitor" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/advanced_monitor", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/advanced_monitor", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/advanced_monitor" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/advanced_monitor", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/advanced_monitor", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/advanced_monitor" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/advanced_monitor", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/advanced_monitor", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/advanced_monitor", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/advanced_monitor" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/advanced_monitor" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/advanced_monitor" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/advanced_monitor" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/advanced_monitor" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/advanced_monitor" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/advanced_monitor" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/advanced_monitor", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/advanced_monitor", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/advanced_monitor", - "y": 180 + "model": "gtceu:block/machine/advanced_monitor" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/advanced_monitor" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/advanced_monitor", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/advanced_monitor", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/advanced_monitor" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/advanced_monitor", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/advanced_monitor", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/advanced_monitor" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/advanced_monitor", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/advanced_monitor", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/advanced_monitor" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/advanced_monitor", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/advanced_monitor", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/advanced_monitor", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/advanced_monitor" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/alloy_blast_smelter.json b/src/generated/resources/assets/gtceu/blockstates/alloy_blast_smelter.json index a5e78eaf811..3d8e113040c 100644 --- a/src/generated/resources/assets/gtceu/blockstates/alloy_blast_smelter.json +++ b/src/generated/resources/assets/gtceu/blockstates/alloy_blast_smelter.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/alloy_blast_smelter" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/alloy_blast_smelter", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/alloy_blast_smelter", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/alloy_blast_smelter" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/alloy_blast_smelter", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/alloy_blast_smelter", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/alloy_blast_smelter" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/alloy_blast_smelter", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/alloy_blast_smelter", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/alloy_blast_smelter", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/alloy_blast_smelter" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/alloy_blast_smelter" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/alloy_blast_smelter" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/alloy_blast_smelter" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/alloy_blast_smelter" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/alloy_blast_smelter" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/alloy_blast_smelter" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/alloy_blast_smelter", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/alloy_blast_smelter", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/alloy_blast_smelter", - "y": 180 + "model": "gtceu:block/machine/alloy_blast_smelter" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/alloy_blast_smelter" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/alloy_blast_smelter", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/alloy_blast_smelter", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/alloy_blast_smelter" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/alloy_blast_smelter", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/alloy_blast_smelter", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/alloy_blast_smelter" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/alloy_blast_smelter", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/alloy_blast_smelter", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/alloy_blast_smelter" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/alloy_blast_smelter", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/alloy_blast_smelter", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/alloy_blast_smelter", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/alloy_blast_smelter" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/assembly_line.json b/src/generated/resources/assets/gtceu/blockstates/assembly_line.json index f2a64f3b3ac..ba81a4be8ff 100644 --- a/src/generated/resources/assets/gtceu/blockstates/assembly_line.json +++ b/src/generated/resources/assets/gtceu/blockstates/assembly_line.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/assembly_line" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/assembly_line", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/assembly_line", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/assembly_line" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/assembly_line", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/assembly_line", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/assembly_line" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/assembly_line", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/assembly_line", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/assembly_line", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/assembly_line" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/assembly_line" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/assembly_line" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/assembly_line" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/assembly_line" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/assembly_line" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/assembly_line" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/assembly_line", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/assembly_line", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/assembly_line", - "y": 180 + "model": "gtceu:block/machine/assembly_line" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/assembly_line" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/assembly_line", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/assembly_line", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/assembly_line" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/assembly_line", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/assembly_line", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/assembly_line" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/assembly_line", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/assembly_line", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/assembly_line" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/assembly_line", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/assembly_line", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/assembly_line", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/assembly_line" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/bronze_multiblock_tank.json b/src/generated/resources/assets/gtceu/blockstates/bronze_multiblock_tank.json index 4a21f594148..aa954fb0c7e 100644 --- a/src/generated/resources/assets/gtceu/blockstates/bronze_multiblock_tank.json +++ b/src/generated/resources/assets/gtceu/blockstates/bronze_multiblock_tank.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/bronze_multiblock_tank" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/bronze_multiblock_tank", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/bronze_multiblock_tank", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/bronze_multiblock_tank" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/bronze_multiblock_tank", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/bronze_multiblock_tank", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/bronze_multiblock_tank" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/bronze_multiblock_tank", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/bronze_multiblock_tank", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/bronze_multiblock_tank", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/bronze_multiblock_tank" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/bronze_multiblock_tank" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/bronze_multiblock_tank" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/bronze_multiblock_tank" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/bronze_multiblock_tank" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/bronze_multiblock_tank" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/bronze_multiblock_tank" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/bronze_multiblock_tank", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/bronze_multiblock_tank", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/bronze_multiblock_tank", - "y": 180 + "model": "gtceu:block/machine/bronze_multiblock_tank" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/bronze_multiblock_tank" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/bronze_multiblock_tank", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/bronze_multiblock_tank", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/bronze_multiblock_tank" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/bronze_multiblock_tank", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/bronze_multiblock_tank", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/bronze_multiblock_tank" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/bronze_multiblock_tank", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/bronze_multiblock_tank", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/bronze_multiblock_tank" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/bronze_multiblock_tank", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/bronze_multiblock_tank", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/bronze_multiblock_tank", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/bronze_multiblock_tank" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/central_monitor.json b/src/generated/resources/assets/gtceu/blockstates/central_monitor.json index 1786db9760d..639e7265a9a 100644 --- a/src/generated/resources/assets/gtceu/blockstates/central_monitor.json +++ b/src/generated/resources/assets/gtceu/blockstates/central_monitor.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/central_monitor" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/central_monitor", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/central_monitor", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/central_monitor" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/central_monitor", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/central_monitor", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/central_monitor" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/central_monitor", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/central_monitor", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/central_monitor", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/central_monitor" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/central_monitor" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/central_monitor" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/central_monitor" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/central_monitor" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/central_monitor" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/central_monitor" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/central_monitor", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/central_monitor", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/central_monitor", - "y": 180 + "model": "gtceu:block/machine/central_monitor" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/central_monitor" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/central_monitor", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/central_monitor", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/central_monitor" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/central_monitor", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/central_monitor", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/central_monitor" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/central_monitor", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/central_monitor", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/central_monitor" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/central_monitor", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/central_monitor", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/central_monitor", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/central_monitor" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/coke_oven.json b/src/generated/resources/assets/gtceu/blockstates/coke_oven.json index ca5344538cc..c707b9579e5 100644 --- a/src/generated/resources/assets/gtceu/blockstates/coke_oven.json +++ b/src/generated/resources/assets/gtceu/blockstates/coke_oven.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/coke_oven" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/coke_oven", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/coke_oven", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/coke_oven" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/coke_oven", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/coke_oven", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/coke_oven" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/coke_oven", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/coke_oven", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/coke_oven", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/coke_oven" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/coke_oven" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/coke_oven" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/coke_oven" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/coke_oven" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/coke_oven" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/coke_oven" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/coke_oven", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/coke_oven", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/coke_oven", - "y": 180 + "model": "gtceu:block/machine/coke_oven" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/coke_oven" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/coke_oven", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/coke_oven", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/coke_oven" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/coke_oven", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/coke_oven", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/coke_oven" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/coke_oven", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/coke_oven", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/coke_oven" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/coke_oven", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/coke_oven", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/coke_oven", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/coke_oven" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/cracker.json b/src/generated/resources/assets/gtceu/blockstates/cracker.json index 7d5945c3d45..88b72eea6c8 100644 --- a/src/generated/resources/assets/gtceu/blockstates/cracker.json +++ b/src/generated/resources/assets/gtceu/blockstates/cracker.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/cracker" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/cracker", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/cracker", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/cracker" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/cracker", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/cracker", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/cracker" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/cracker", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/cracker", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/cracker", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/cracker" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/cracker" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/cracker" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/cracker" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/cracker" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/cracker" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/cracker" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/cracker", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/cracker", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/cracker", - "y": 180 + "model": "gtceu:block/machine/cracker" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/cracker" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/cracker", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/cracker", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/cracker" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/cracker", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/cracker", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/cracker" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/cracker", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/cracker", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/cracker" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/cracker", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/cracker", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/cracker", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/cracker" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/creative_chest.json b/src/generated/resources/assets/gtceu/blockstates/creative_chest.json index 2c974b92b35..2536336f21e 100644 --- a/src/generated/resources/assets/gtceu/blockstates/creative_chest.json +++ b/src/generated/resources/assets/gtceu/blockstates/creative_chest.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/creative_chest" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/creative_chest", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/creative_chest", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/creative_chest" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/creative_chest", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/creative_chest", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/creative_chest" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/creative_chest", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/creative_chest", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/creative_chest", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/creative_chest" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/creative_chest" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/creative_chest" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/creative_chest" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/creative_chest" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/creative_chest" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/creative_chest" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/creative_chest", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/creative_chest", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/creative_chest", - "y": 180 + "model": "gtceu:block/machine/creative_chest" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/creative_chest" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/creative_chest", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/creative_chest", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/creative_chest" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/creative_chest", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/creative_chest", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/creative_chest" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/creative_chest", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/creative_chest", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/creative_chest" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/creative_chest", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/creative_chest", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/creative_chest", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/creative_chest" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/creative_tank.json b/src/generated/resources/assets/gtceu/blockstates/creative_tank.json index 0fee3db96c1..19bd0a99f2d 100644 --- a/src/generated/resources/assets/gtceu/blockstates/creative_tank.json +++ b/src/generated/resources/assets/gtceu/blockstates/creative_tank.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/creative_tank" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/creative_tank", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/creative_tank", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/creative_tank" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/creative_tank", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/creative_tank", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/creative_tank" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/creative_tank", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/creative_tank", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/creative_tank", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/creative_tank" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/creative_tank" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/creative_tank" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/creative_tank" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/creative_tank" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/creative_tank" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/creative_tank" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/creative_tank", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/creative_tank", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/creative_tank", - "y": 180 + "model": "gtceu:block/machine/creative_tank" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/creative_tank" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/creative_tank", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/creative_tank", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/creative_tank" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/creative_tank", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/creative_tank", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/creative_tank" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/creative_tank", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/creative_tank", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/creative_tank" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/creative_tank", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/creative_tank", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/creative_tank", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/creative_tank" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/ctm_test.json b/src/generated/resources/assets/gtceu/blockstates/ctm_test.json new file mode 100644 index 00000000000..9332a79dea2 --- /dev/null +++ b/src/generated/resources/assets/gtceu/blockstates/ctm_test.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "gtceu:block/ctm_test" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/data_bank.json b/src/generated/resources/assets/gtceu/blockstates/data_bank.json index 926f638ed37..75e93053859 100644 --- a/src/generated/resources/assets/gtceu/blockstates/data_bank.json +++ b/src/generated/resources/assets/gtceu/blockstates/data_bank.json @@ -1,50 +1,68 @@ { "variants": { - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/data_bank", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/data_bank" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/data_bank", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/data_bank", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/data_bank", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/data_bank" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/data_bank" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/data_bank" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/data_bank" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/data_bank" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/data_bank" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/data_bank" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/data_bank", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/data_bank", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/data_bank", - "y": 180 + "model": "gtceu:block/machine/data_bank" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/data_bank" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/data_bank", "y": 180 }, @@ -53,24 +71,30 @@ "model": "gtceu:block/machine/data_bank", "y": 180 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/data_bank", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/data_bank" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/data_bank", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/data_bank", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/data_bank", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/data_bank" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/electric_blast_furnace.json b/src/generated/resources/assets/gtceu/blockstates/electric_blast_furnace.json index 3d48c0cc562..41e00c52c56 100644 --- a/src/generated/resources/assets/gtceu/blockstates/electric_blast_furnace.json +++ b/src/generated/resources/assets/gtceu/blockstates/electric_blast_furnace.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/electric_blast_furnace" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/electric_blast_furnace", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/electric_blast_furnace", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/electric_blast_furnace" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/electric_blast_furnace", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/electric_blast_furnace", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/electric_blast_furnace" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/electric_blast_furnace", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/electric_blast_furnace", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/electric_blast_furnace", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/electric_blast_furnace" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/electric_blast_furnace" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/electric_blast_furnace" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/electric_blast_furnace" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/electric_blast_furnace" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/electric_blast_furnace" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/electric_blast_furnace" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/electric_blast_furnace", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/electric_blast_furnace", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/electric_blast_furnace", - "y": 180 + "model": "gtceu:block/machine/electric_blast_furnace" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/electric_blast_furnace" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/electric_blast_furnace", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/electric_blast_furnace", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/electric_blast_furnace" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/electric_blast_furnace", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/electric_blast_furnace", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/electric_blast_furnace" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/electric_blast_furnace", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/electric_blast_furnace", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/electric_blast_furnace" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/electric_blast_furnace", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/electric_blast_furnace", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/electric_blast_furnace", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/electric_blast_furnace" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/ev_bedrock_ore_miner.json b/src/generated/resources/assets/gtceu/blockstates/ev_bedrock_ore_miner.json index 0813015ba8b..726020eeab8 100644 --- a/src/generated/resources/assets/gtceu/blockstates/ev_bedrock_ore_miner.json +++ b/src/generated/resources/assets/gtceu/blockstates/ev_bedrock_ore_miner.json @@ -1,50 +1,68 @@ { "variants": { - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/ev_bedrock_ore_miner", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/ev_bedrock_ore_miner" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/ev_bedrock_ore_miner", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/ev_bedrock_ore_miner", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/ev_bedrock_ore_miner", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/ev_bedrock_ore_miner" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/ev_bedrock_ore_miner" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/ev_bedrock_ore_miner" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/ev_bedrock_ore_miner" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/ev_bedrock_ore_miner" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/ev_bedrock_ore_miner" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/ev_bedrock_ore_miner" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/ev_bedrock_ore_miner", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/ev_bedrock_ore_miner", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/ev_bedrock_ore_miner", - "y": 180 + "model": "gtceu:block/machine/ev_bedrock_ore_miner" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/ev_bedrock_ore_miner" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/ev_bedrock_ore_miner", "y": 180 }, @@ -53,24 +71,30 @@ "model": "gtceu:block/machine/ev_bedrock_ore_miner", "y": 180 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/ev_bedrock_ore_miner", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/ev_bedrock_ore_miner" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/ev_bedrock_ore_miner", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/ev_bedrock_ore_miner", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/ev_bedrock_ore_miner", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/ev_bedrock_ore_miner" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/ev_fluid_drilling_rig.json b/src/generated/resources/assets/gtceu/blockstates/ev_fluid_drilling_rig.json index 60696c43d2c..c297b687b71 100644 --- a/src/generated/resources/assets/gtceu/blockstates/ev_fluid_drilling_rig.json +++ b/src/generated/resources/assets/gtceu/blockstates/ev_fluid_drilling_rig.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/ev_fluid_drilling_rig" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/ev_fluid_drilling_rig", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/ev_fluid_drilling_rig", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/ev_fluid_drilling_rig" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/ev_fluid_drilling_rig", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/ev_fluid_drilling_rig", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/ev_fluid_drilling_rig" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/ev_fluid_drilling_rig", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/ev_fluid_drilling_rig", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/ev_fluid_drilling_rig", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/ev_fluid_drilling_rig" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/ev_fluid_drilling_rig" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/ev_fluid_drilling_rig" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/ev_fluid_drilling_rig" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/ev_fluid_drilling_rig" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/ev_fluid_drilling_rig" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/ev_fluid_drilling_rig" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/ev_fluid_drilling_rig", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/ev_fluid_drilling_rig", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/ev_fluid_drilling_rig", - "y": 180 + "model": "gtceu:block/machine/ev_fluid_drilling_rig" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/ev_fluid_drilling_rig" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/ev_fluid_drilling_rig", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/ev_fluid_drilling_rig", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/ev_fluid_drilling_rig" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/ev_fluid_drilling_rig", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/ev_fluid_drilling_rig", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/ev_fluid_drilling_rig" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/ev_fluid_drilling_rig", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/ev_fluid_drilling_rig", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/ev_fluid_drilling_rig" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/ev_fluid_drilling_rig", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/ev_fluid_drilling_rig", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/ev_fluid_drilling_rig", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/ev_fluid_drilling_rig" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/ev_large_miner.json b/src/generated/resources/assets/gtceu/blockstates/ev_large_miner.json index ff1f1161f36..dd3965c23f3 100644 --- a/src/generated/resources/assets/gtceu/blockstates/ev_large_miner.json +++ b/src/generated/resources/assets/gtceu/blockstates/ev_large_miner.json @@ -1,50 +1,68 @@ { "variants": { - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/ev_large_miner", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/ev_large_miner" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/ev_large_miner", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/ev_large_miner", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/ev_large_miner", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/ev_large_miner" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/ev_large_miner" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/ev_large_miner" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/ev_large_miner" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/ev_large_miner" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/ev_large_miner" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/ev_large_miner" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/ev_large_miner", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/ev_large_miner", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/ev_large_miner", - "y": 180 + "model": "gtceu:block/machine/ev_large_miner" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/ev_large_miner" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/ev_large_miner", "y": 180 }, @@ -53,24 +71,30 @@ "model": "gtceu:block/machine/ev_large_miner", "y": 180 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/ev_large_miner", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/ev_large_miner" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/ev_large_miner", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/ev_large_miner", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/ev_large_miner", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/ev_large_miner" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/ev_super_chest.json b/src/generated/resources/assets/gtceu/blockstates/ev_super_chest.json index d6eb4d20e65..a6de2f82348 100644 --- a/src/generated/resources/assets/gtceu/blockstates/ev_super_chest.json +++ b/src/generated/resources/assets/gtceu/blockstates/ev_super_chest.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/ev_super_chest" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/ev_super_chest", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/ev_super_chest", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/ev_super_chest" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/ev_super_chest", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/ev_super_chest", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/ev_super_chest" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/ev_super_chest", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/ev_super_chest", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/ev_super_chest", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/ev_super_chest" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/ev_super_chest" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/ev_super_chest" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/ev_super_chest" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/ev_super_chest" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/ev_super_chest" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/ev_super_chest" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/ev_super_chest", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/ev_super_chest", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/ev_super_chest", - "y": 180 + "model": "gtceu:block/machine/ev_super_chest" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/ev_super_chest" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/ev_super_chest", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/ev_super_chest", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/ev_super_chest" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/ev_super_chest", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/ev_super_chest", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/ev_super_chest" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/ev_super_chest", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/ev_super_chest", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/ev_super_chest" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/ev_super_chest", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/ev_super_chest", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/ev_super_chest", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/ev_super_chest" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/ev_super_tank.json b/src/generated/resources/assets/gtceu/blockstates/ev_super_tank.json index 7df483a4f4b..1ccba9192f0 100644 --- a/src/generated/resources/assets/gtceu/blockstates/ev_super_tank.json +++ b/src/generated/resources/assets/gtceu/blockstates/ev_super_tank.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/ev_super_tank" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/ev_super_tank", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/ev_super_tank", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/ev_super_tank" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/ev_super_tank", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/ev_super_tank", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/ev_super_tank" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/ev_super_tank", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/ev_super_tank", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/ev_super_tank", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/ev_super_tank" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/ev_super_tank" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/ev_super_tank" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/ev_super_tank" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/ev_super_tank" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/ev_super_tank" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/ev_super_tank" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/ev_super_tank", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/ev_super_tank", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/ev_super_tank", - "y": 180 + "model": "gtceu:block/machine/ev_super_tank" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/ev_super_tank" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/ev_super_tank", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/ev_super_tank", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/ev_super_tank" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/ev_super_tank", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/ev_super_tank", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/ev_super_tank" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/ev_super_tank", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/ev_super_tank", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/ev_super_tank" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/ev_super_tank", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/ev_super_tank", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/ev_super_tank", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/ev_super_tank" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/extreme_combustion_engine.json b/src/generated/resources/assets/gtceu/blockstates/extreme_combustion_engine.json index 694c7eab010..d3bfd8f1ced 100644 --- a/src/generated/resources/assets/gtceu/blockstates/extreme_combustion_engine.json +++ b/src/generated/resources/assets/gtceu/blockstates/extreme_combustion_engine.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/extreme_combustion_engine" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/extreme_combustion_engine", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/extreme_combustion_engine", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/extreme_combustion_engine" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/extreme_combustion_engine", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/extreme_combustion_engine", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/extreme_combustion_engine" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/extreme_combustion_engine", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/extreme_combustion_engine", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/extreme_combustion_engine", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/extreme_combustion_engine" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/extreme_combustion_engine" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/extreme_combustion_engine" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/extreme_combustion_engine" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/extreme_combustion_engine" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/extreme_combustion_engine" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/extreme_combustion_engine" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/extreme_combustion_engine", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/extreme_combustion_engine", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/extreme_combustion_engine", - "y": 180 + "model": "gtceu:block/machine/extreme_combustion_engine" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/extreme_combustion_engine" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/extreme_combustion_engine", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/extreme_combustion_engine", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/extreme_combustion_engine" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/extreme_combustion_engine", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/extreme_combustion_engine", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/extreme_combustion_engine" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/extreme_combustion_engine", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/extreme_combustion_engine", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/extreme_combustion_engine" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/extreme_combustion_engine", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/extreme_combustion_engine", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/extreme_combustion_engine", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/extreme_combustion_engine" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/gas_large_turbine.json b/src/generated/resources/assets/gtceu/blockstates/gas_large_turbine.json index c6139d92fde..316a123eb3f 100644 --- a/src/generated/resources/assets/gtceu/blockstates/gas_large_turbine.json +++ b/src/generated/resources/assets/gtceu/blockstates/gas_large_turbine.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/gas_large_turbine" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/gas_large_turbine", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/gas_large_turbine", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/gas_large_turbine" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/gas_large_turbine", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/gas_large_turbine", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/gas_large_turbine" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/gas_large_turbine", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/gas_large_turbine", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/gas_large_turbine", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/gas_large_turbine" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/gas_large_turbine" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/gas_large_turbine" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/gas_large_turbine" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/gas_large_turbine" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/gas_large_turbine" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/gas_large_turbine" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/gas_large_turbine", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/gas_large_turbine", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/gas_large_turbine", - "y": 180 + "model": "gtceu:block/machine/gas_large_turbine" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/gas_large_turbine" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/gas_large_turbine", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/gas_large_turbine", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/gas_large_turbine" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/gas_large_turbine", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/gas_large_turbine", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/gas_large_turbine" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/gas_large_turbine", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/gas_large_turbine", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/gas_large_turbine" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/gas_large_turbine", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/gas_large_turbine", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/gas_large_turbine", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/gas_large_turbine" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/high_performance_computation_array.json b/src/generated/resources/assets/gtceu/blockstates/high_performance_computation_array.json index e39725b168a..8c1ea02b9dd 100644 --- a/src/generated/resources/assets/gtceu/blockstates/high_performance_computation_array.json +++ b/src/generated/resources/assets/gtceu/blockstates/high_performance_computation_array.json @@ -1,50 +1,68 @@ { "variants": { - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/high_performance_computation_array", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/high_performance_computation_array" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/high_performance_computation_array", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/high_performance_computation_array", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/high_performance_computation_array", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/high_performance_computation_array" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/high_performance_computation_array" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/high_performance_computation_array" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/high_performance_computation_array" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/high_performance_computation_array" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/high_performance_computation_array" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/high_performance_computation_array" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/high_performance_computation_array", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/high_performance_computation_array", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/high_performance_computation_array", - "y": 180 + "model": "gtceu:block/machine/high_performance_computation_array" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/high_performance_computation_array" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/high_performance_computation_array", "y": 180 }, @@ -53,24 +71,30 @@ "model": "gtceu:block/machine/high_performance_computation_array", "y": 180 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/high_performance_computation_array", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/high_performance_computation_array" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/high_performance_computation_array", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/high_performance_computation_array", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/high_performance_computation_array", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/high_performance_computation_array" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/hv_bedrock_ore_miner.json b/src/generated/resources/assets/gtceu/blockstates/hv_bedrock_ore_miner.json index c91c6a300e8..153718c373c 100644 --- a/src/generated/resources/assets/gtceu/blockstates/hv_bedrock_ore_miner.json +++ b/src/generated/resources/assets/gtceu/blockstates/hv_bedrock_ore_miner.json @@ -1,50 +1,68 @@ { "variants": { - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/hv_bedrock_ore_miner", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/hv_bedrock_ore_miner" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/hv_bedrock_ore_miner", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/hv_bedrock_ore_miner", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/hv_bedrock_ore_miner", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/hv_bedrock_ore_miner" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/hv_bedrock_ore_miner" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/hv_bedrock_ore_miner" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/hv_bedrock_ore_miner" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/hv_bedrock_ore_miner" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/hv_bedrock_ore_miner" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/hv_bedrock_ore_miner" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/hv_bedrock_ore_miner", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/hv_bedrock_ore_miner", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/hv_bedrock_ore_miner", - "y": 180 + "model": "gtceu:block/machine/hv_bedrock_ore_miner" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/hv_bedrock_ore_miner" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/hv_bedrock_ore_miner", "y": 180 }, @@ -53,24 +71,30 @@ "model": "gtceu:block/machine/hv_bedrock_ore_miner", "y": 180 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/hv_bedrock_ore_miner", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/hv_bedrock_ore_miner" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/hv_bedrock_ore_miner", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/hv_bedrock_ore_miner", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/hv_bedrock_ore_miner", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/hv_bedrock_ore_miner" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/hv_fluid_drilling_rig.json b/src/generated/resources/assets/gtceu/blockstates/hv_fluid_drilling_rig.json index 6ab1433dd13..43764b78196 100644 --- a/src/generated/resources/assets/gtceu/blockstates/hv_fluid_drilling_rig.json +++ b/src/generated/resources/assets/gtceu/blockstates/hv_fluid_drilling_rig.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/hv_fluid_drilling_rig" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/hv_fluid_drilling_rig", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/hv_fluid_drilling_rig", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/hv_fluid_drilling_rig" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/hv_fluid_drilling_rig", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/hv_fluid_drilling_rig", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/hv_fluid_drilling_rig" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/hv_fluid_drilling_rig", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/hv_fluid_drilling_rig", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/hv_fluid_drilling_rig", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/hv_fluid_drilling_rig" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/hv_fluid_drilling_rig" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/hv_fluid_drilling_rig" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/hv_fluid_drilling_rig" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/hv_fluid_drilling_rig" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/hv_fluid_drilling_rig" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/hv_fluid_drilling_rig" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/hv_fluid_drilling_rig", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/hv_fluid_drilling_rig", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/hv_fluid_drilling_rig", - "y": 180 + "model": "gtceu:block/machine/hv_fluid_drilling_rig" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/hv_fluid_drilling_rig" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/hv_fluid_drilling_rig", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/hv_fluid_drilling_rig", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/hv_fluid_drilling_rig" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/hv_fluid_drilling_rig", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/hv_fluid_drilling_rig", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/hv_fluid_drilling_rig" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/hv_fluid_drilling_rig", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/hv_fluid_drilling_rig", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/hv_fluid_drilling_rig" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/hv_fluid_drilling_rig", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/hv_fluid_drilling_rig", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/hv_fluid_drilling_rig", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/hv_fluid_drilling_rig" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/hv_super_chest.json b/src/generated/resources/assets/gtceu/blockstates/hv_super_chest.json index c95883888b9..f256e354a7d 100644 --- a/src/generated/resources/assets/gtceu/blockstates/hv_super_chest.json +++ b/src/generated/resources/assets/gtceu/blockstates/hv_super_chest.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/hv_super_chest" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/hv_super_chest", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/hv_super_chest", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/hv_super_chest" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/hv_super_chest", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/hv_super_chest", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/hv_super_chest" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/hv_super_chest", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/hv_super_chest", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/hv_super_chest", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/hv_super_chest" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/hv_super_chest" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/hv_super_chest" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/hv_super_chest" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/hv_super_chest" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/hv_super_chest" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/hv_super_chest" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/hv_super_chest", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/hv_super_chest", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/hv_super_chest", - "y": 180 + "model": "gtceu:block/machine/hv_super_chest" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/hv_super_chest" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/hv_super_chest", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/hv_super_chest", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/hv_super_chest" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/hv_super_chest", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/hv_super_chest", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/hv_super_chest" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/hv_super_chest", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/hv_super_chest", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/hv_super_chest" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/hv_super_chest", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/hv_super_chest", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/hv_super_chest", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/hv_super_chest" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/hv_super_tank.json b/src/generated/resources/assets/gtceu/blockstates/hv_super_tank.json index d4411ac23f7..d83d8031c08 100644 --- a/src/generated/resources/assets/gtceu/blockstates/hv_super_tank.json +++ b/src/generated/resources/assets/gtceu/blockstates/hv_super_tank.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/hv_super_tank" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/hv_super_tank", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/hv_super_tank", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/hv_super_tank" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/hv_super_tank", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/hv_super_tank", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/hv_super_tank" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/hv_super_tank", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/hv_super_tank", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/hv_super_tank", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/hv_super_tank" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/hv_super_tank" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/hv_super_tank" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/hv_super_tank" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/hv_super_tank" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/hv_super_tank" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/hv_super_tank" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/hv_super_tank", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/hv_super_tank", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/hv_super_tank", - "y": 180 + "model": "gtceu:block/machine/hv_super_tank" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/hv_super_tank" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/hv_super_tank", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/hv_super_tank", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/hv_super_tank" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/hv_super_tank", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/hv_super_tank", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/hv_super_tank" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/hv_super_tank", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/hv_super_tank", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/hv_super_tank" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/hv_super_tank", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/hv_super_tank", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/hv_super_tank", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/hv_super_tank" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/implosion_compressor.json b/src/generated/resources/assets/gtceu/blockstates/implosion_compressor.json index 6c4eb6d5c1a..e074b938957 100644 --- a/src/generated/resources/assets/gtceu/blockstates/implosion_compressor.json +++ b/src/generated/resources/assets/gtceu/blockstates/implosion_compressor.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/implosion_compressor" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/implosion_compressor", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/implosion_compressor", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/implosion_compressor" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/implosion_compressor", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/implosion_compressor", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/implosion_compressor" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/implosion_compressor", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/implosion_compressor", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/implosion_compressor", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/implosion_compressor" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/implosion_compressor" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/implosion_compressor" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/implosion_compressor" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/implosion_compressor" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/implosion_compressor" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/implosion_compressor" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/implosion_compressor", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/implosion_compressor", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/implosion_compressor", - "y": 180 + "model": "gtceu:block/machine/implosion_compressor" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/implosion_compressor" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/implosion_compressor", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/implosion_compressor", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/implosion_compressor" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/implosion_compressor", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/implosion_compressor", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/implosion_compressor" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/implosion_compressor", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/implosion_compressor", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/implosion_compressor" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/implosion_compressor", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/implosion_compressor", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/implosion_compressor", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/implosion_compressor" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/iv_large_miner.json b/src/generated/resources/assets/gtceu/blockstates/iv_large_miner.json index f4db9ed93f1..f052a5c4573 100644 --- a/src/generated/resources/assets/gtceu/blockstates/iv_large_miner.json +++ b/src/generated/resources/assets/gtceu/blockstates/iv_large_miner.json @@ -1,50 +1,68 @@ { "variants": { - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/iv_large_miner", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/iv_large_miner" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/iv_large_miner", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/iv_large_miner", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/iv_large_miner", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/iv_large_miner" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/iv_large_miner" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/iv_large_miner" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/iv_large_miner" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/iv_large_miner" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/iv_large_miner" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/iv_large_miner" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/iv_large_miner", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/iv_large_miner", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/iv_large_miner", - "y": 180 + "model": "gtceu:block/machine/iv_large_miner" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/iv_large_miner" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/iv_large_miner", "y": 180 }, @@ -53,24 +71,30 @@ "model": "gtceu:block/machine/iv_large_miner", "y": 180 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/iv_large_miner", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/iv_large_miner" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/iv_large_miner", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/iv_large_miner", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/iv_large_miner", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/iv_large_miner" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/iv_quantum_chest.json b/src/generated/resources/assets/gtceu/blockstates/iv_quantum_chest.json index 78534ddef62..f9a46553826 100644 --- a/src/generated/resources/assets/gtceu/blockstates/iv_quantum_chest.json +++ b/src/generated/resources/assets/gtceu/blockstates/iv_quantum_chest.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/iv_quantum_chest" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/iv_quantum_chest", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/iv_quantum_chest", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/iv_quantum_chest" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/iv_quantum_chest", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/iv_quantum_chest", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/iv_quantum_chest" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/iv_quantum_chest", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/iv_quantum_chest", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/iv_quantum_chest", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/iv_quantum_chest" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/iv_quantum_chest" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/iv_quantum_chest" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/iv_quantum_chest" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/iv_quantum_chest" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/iv_quantum_chest" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/iv_quantum_chest" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/iv_quantum_chest", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/iv_quantum_chest", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/iv_quantum_chest", - "y": 180 + "model": "gtceu:block/machine/iv_quantum_chest" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/iv_quantum_chest" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/iv_quantum_chest", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/iv_quantum_chest", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/iv_quantum_chest" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/iv_quantum_chest", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/iv_quantum_chest", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/iv_quantum_chest" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/iv_quantum_chest", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/iv_quantum_chest", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/iv_quantum_chest" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/iv_quantum_chest", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/iv_quantum_chest", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/iv_quantum_chest", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/iv_quantum_chest" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/iv_quantum_tank.json b/src/generated/resources/assets/gtceu/blockstates/iv_quantum_tank.json index b5947611ccf..6ba358f9089 100644 --- a/src/generated/resources/assets/gtceu/blockstates/iv_quantum_tank.json +++ b/src/generated/resources/assets/gtceu/blockstates/iv_quantum_tank.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/iv_quantum_tank" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/iv_quantum_tank", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/iv_quantum_tank", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/iv_quantum_tank" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/iv_quantum_tank", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/iv_quantum_tank", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/iv_quantum_tank" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/iv_quantum_tank", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/iv_quantum_tank", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/iv_quantum_tank", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/iv_quantum_tank" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/iv_quantum_tank" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/iv_quantum_tank" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/iv_quantum_tank" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/iv_quantum_tank" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/iv_quantum_tank" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/iv_quantum_tank" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/iv_quantum_tank", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/iv_quantum_tank", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/iv_quantum_tank", - "y": 180 + "model": "gtceu:block/machine/iv_quantum_tank" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/iv_quantum_tank" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/iv_quantum_tank", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/iv_quantum_tank", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/iv_quantum_tank" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/iv_quantum_tank", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/iv_quantum_tank", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/iv_quantum_tank" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/iv_quantum_tank", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/iv_quantum_tank", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/iv_quantum_tank" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/iv_quantum_tank", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/iv_quantum_tank", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/iv_quantum_tank", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/iv_quantum_tank" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/large_arc_smelter.json b/src/generated/resources/assets/gtceu/blockstates/large_arc_smelter.json index ad75bbd9202..be24ff27364 100644 --- a/src/generated/resources/assets/gtceu/blockstates/large_arc_smelter.json +++ b/src/generated/resources/assets/gtceu/blockstates/large_arc_smelter.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/large_arc_smelter" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_arc_smelter", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/large_arc_smelter", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/large_arc_smelter" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_arc_smelter", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_arc_smelter", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/large_arc_smelter" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/large_arc_smelter", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/large_arc_smelter", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/large_arc_smelter", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/large_arc_smelter" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_arc_smelter" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/large_arc_smelter" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/large_arc_smelter" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_arc_smelter" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/large_arc_smelter" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/large_arc_smelter" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_arc_smelter", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/large_arc_smelter", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/large_arc_smelter", - "y": 180 + "model": "gtceu:block/machine/large_arc_smelter" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_arc_smelter" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/large_arc_smelter", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/large_arc_smelter", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/large_arc_smelter" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_arc_smelter", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/large_arc_smelter", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/large_arc_smelter" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_arc_smelter", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_arc_smelter", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/large_arc_smelter" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/large_arc_smelter", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/large_arc_smelter", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/large_arc_smelter", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/large_arc_smelter" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/large_assembler.json b/src/generated/resources/assets/gtceu/blockstates/large_assembler.json index 9d2ce23a183..6b26b2edbbb 100644 --- a/src/generated/resources/assets/gtceu/blockstates/large_assembler.json +++ b/src/generated/resources/assets/gtceu/blockstates/large_assembler.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/large_assembler" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_assembler", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/large_assembler", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/large_assembler" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_assembler", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_assembler", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/large_assembler" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/large_assembler", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/large_assembler", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/large_assembler", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/large_assembler" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_assembler" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/large_assembler" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/large_assembler" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_assembler" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/large_assembler" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/large_assembler" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_assembler", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/large_assembler", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/large_assembler", - "y": 180 + "model": "gtceu:block/machine/large_assembler" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_assembler" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/large_assembler", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/large_assembler", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/large_assembler" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_assembler", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/large_assembler", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/large_assembler" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_assembler", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_assembler", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/large_assembler" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/large_assembler", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/large_assembler", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/large_assembler", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/large_assembler" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/large_autoclave.json b/src/generated/resources/assets/gtceu/blockstates/large_autoclave.json index 3d39a47fbc5..d73ffe47f19 100644 --- a/src/generated/resources/assets/gtceu/blockstates/large_autoclave.json +++ b/src/generated/resources/assets/gtceu/blockstates/large_autoclave.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/large_autoclave" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_autoclave", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/large_autoclave", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/large_autoclave" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_autoclave", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_autoclave", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/large_autoclave" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/large_autoclave", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/large_autoclave", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/large_autoclave", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/large_autoclave" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_autoclave" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/large_autoclave" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/large_autoclave" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_autoclave" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/large_autoclave" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/large_autoclave" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_autoclave", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/large_autoclave", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/large_autoclave", - "y": 180 + "model": "gtceu:block/machine/large_autoclave" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_autoclave" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/large_autoclave", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/large_autoclave", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/large_autoclave" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_autoclave", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/large_autoclave", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/large_autoclave" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_autoclave", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_autoclave", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/large_autoclave" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/large_autoclave", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/large_autoclave", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/large_autoclave", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/large_autoclave" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/large_brewer.json b/src/generated/resources/assets/gtceu/blockstates/large_brewer.json index a190ee00ad7..3efb8deee15 100644 --- a/src/generated/resources/assets/gtceu/blockstates/large_brewer.json +++ b/src/generated/resources/assets/gtceu/blockstates/large_brewer.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/large_brewer" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_brewer", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/large_brewer", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/large_brewer" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_brewer", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_brewer", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/large_brewer" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/large_brewer", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/large_brewer", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/large_brewer", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/large_brewer" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_brewer" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/large_brewer" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/large_brewer" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_brewer" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/large_brewer" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/large_brewer" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_brewer", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/large_brewer", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/large_brewer", - "y": 180 + "model": "gtceu:block/machine/large_brewer" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_brewer" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/large_brewer", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/large_brewer", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/large_brewer" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_brewer", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/large_brewer", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/large_brewer" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_brewer", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_brewer", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/large_brewer" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/large_brewer", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/large_brewer", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/large_brewer", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/large_brewer" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/large_centrifuge.json b/src/generated/resources/assets/gtceu/blockstates/large_centrifuge.json index 4aac4190995..806c43642e2 100644 --- a/src/generated/resources/assets/gtceu/blockstates/large_centrifuge.json +++ b/src/generated/resources/assets/gtceu/blockstates/large_centrifuge.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/large_centrifuge" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_centrifuge", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/large_centrifuge", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/large_centrifuge" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_centrifuge", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_centrifuge", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/large_centrifuge" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/large_centrifuge", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/large_centrifuge", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/large_centrifuge", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/large_centrifuge" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_centrifuge" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/large_centrifuge" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/large_centrifuge" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_centrifuge" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/large_centrifuge" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/large_centrifuge" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_centrifuge", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/large_centrifuge", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/large_centrifuge", - "y": 180 + "model": "gtceu:block/machine/large_centrifuge" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_centrifuge" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/large_centrifuge", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/large_centrifuge", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/large_centrifuge" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_centrifuge", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/large_centrifuge", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/large_centrifuge" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_centrifuge", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_centrifuge", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/large_centrifuge" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/large_centrifuge", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/large_centrifuge", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/large_centrifuge", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/large_centrifuge" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/large_chemical_bath.json b/src/generated/resources/assets/gtceu/blockstates/large_chemical_bath.json index 5d09912515c..99550bedb71 100644 --- a/src/generated/resources/assets/gtceu/blockstates/large_chemical_bath.json +++ b/src/generated/resources/assets/gtceu/blockstates/large_chemical_bath.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/large_chemical_bath" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_chemical_bath", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/large_chemical_bath", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/large_chemical_bath" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_chemical_bath", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_chemical_bath", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/large_chemical_bath" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/large_chemical_bath", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/large_chemical_bath", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/large_chemical_bath", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/large_chemical_bath" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_chemical_bath" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/large_chemical_bath" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/large_chemical_bath" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_chemical_bath" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/large_chemical_bath" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/large_chemical_bath" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_chemical_bath", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/large_chemical_bath", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/large_chemical_bath", - "y": 180 + "model": "gtceu:block/machine/large_chemical_bath" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_chemical_bath" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/large_chemical_bath", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/large_chemical_bath", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/large_chemical_bath" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_chemical_bath", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/large_chemical_bath", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/large_chemical_bath" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_chemical_bath", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_chemical_bath", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/large_chemical_bath" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/large_chemical_bath", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/large_chemical_bath", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/large_chemical_bath", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/large_chemical_bath" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/large_chemical_reactor.json b/src/generated/resources/assets/gtceu/blockstates/large_chemical_reactor.json index fdcb902fca6..5ff4a2b2a2c 100644 --- a/src/generated/resources/assets/gtceu/blockstates/large_chemical_reactor.json +++ b/src/generated/resources/assets/gtceu/blockstates/large_chemical_reactor.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/large_chemical_reactor" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_chemical_reactor", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/large_chemical_reactor", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/large_chemical_reactor" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_chemical_reactor", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_chemical_reactor", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/large_chemical_reactor" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/large_chemical_reactor", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/large_chemical_reactor", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/large_chemical_reactor", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/large_chemical_reactor" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_chemical_reactor" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/large_chemical_reactor" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/large_chemical_reactor" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_chemical_reactor" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/large_chemical_reactor" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/large_chemical_reactor" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_chemical_reactor", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/large_chemical_reactor", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/large_chemical_reactor", - "y": 180 + "model": "gtceu:block/machine/large_chemical_reactor" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_chemical_reactor" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/large_chemical_reactor", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/large_chemical_reactor", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/large_chemical_reactor" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_chemical_reactor", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/large_chemical_reactor", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/large_chemical_reactor" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_chemical_reactor", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_chemical_reactor", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/large_chemical_reactor" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/large_chemical_reactor", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/large_chemical_reactor", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/large_chemical_reactor", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/large_chemical_reactor" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/large_circuit_assembler.json b/src/generated/resources/assets/gtceu/blockstates/large_circuit_assembler.json index 8a5e7bbaac0..a88047b144f 100644 --- a/src/generated/resources/assets/gtceu/blockstates/large_circuit_assembler.json +++ b/src/generated/resources/assets/gtceu/blockstates/large_circuit_assembler.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/large_circuit_assembler" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_circuit_assembler", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/large_circuit_assembler", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/large_circuit_assembler" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_circuit_assembler", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_circuit_assembler", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/large_circuit_assembler" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/large_circuit_assembler", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/large_circuit_assembler", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/large_circuit_assembler", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/large_circuit_assembler" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_circuit_assembler" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/large_circuit_assembler" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/large_circuit_assembler" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_circuit_assembler" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/large_circuit_assembler" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/large_circuit_assembler" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_circuit_assembler", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/large_circuit_assembler", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/large_circuit_assembler", - "y": 180 + "model": "gtceu:block/machine/large_circuit_assembler" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_circuit_assembler" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/large_circuit_assembler", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/large_circuit_assembler", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/large_circuit_assembler" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_circuit_assembler", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/large_circuit_assembler", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/large_circuit_assembler" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_circuit_assembler", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_circuit_assembler", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/large_circuit_assembler" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/large_circuit_assembler", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/large_circuit_assembler", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/large_circuit_assembler", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/large_circuit_assembler" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/large_combustion_engine.json b/src/generated/resources/assets/gtceu/blockstates/large_combustion_engine.json index 7fdd9d4c30c..3c6d5e2c36b 100644 --- a/src/generated/resources/assets/gtceu/blockstates/large_combustion_engine.json +++ b/src/generated/resources/assets/gtceu/blockstates/large_combustion_engine.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/large_combustion_engine" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_combustion_engine", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/large_combustion_engine", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/large_combustion_engine" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_combustion_engine", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_combustion_engine", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/large_combustion_engine" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/large_combustion_engine", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/large_combustion_engine", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/large_combustion_engine", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/large_combustion_engine" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_combustion_engine" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/large_combustion_engine" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/large_combustion_engine" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_combustion_engine" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/large_combustion_engine" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/large_combustion_engine" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_combustion_engine", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/large_combustion_engine", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/large_combustion_engine", - "y": 180 + "model": "gtceu:block/machine/large_combustion_engine" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_combustion_engine" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/large_combustion_engine", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/large_combustion_engine", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/large_combustion_engine" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_combustion_engine", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/large_combustion_engine", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/large_combustion_engine" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_combustion_engine", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_combustion_engine", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/large_combustion_engine" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/large_combustion_engine", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/large_combustion_engine", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/large_combustion_engine", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/large_combustion_engine" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/large_cutter.json b/src/generated/resources/assets/gtceu/blockstates/large_cutter.json index e47de3ea3ec..fa397c2b80e 100644 --- a/src/generated/resources/assets/gtceu/blockstates/large_cutter.json +++ b/src/generated/resources/assets/gtceu/blockstates/large_cutter.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/large_cutter" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_cutter", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/large_cutter", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/large_cutter" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_cutter", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_cutter", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/large_cutter" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/large_cutter", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/large_cutter", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/large_cutter", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/large_cutter" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_cutter" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/large_cutter" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/large_cutter" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_cutter" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/large_cutter" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/large_cutter" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_cutter", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/large_cutter", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/large_cutter", - "y": 180 + "model": "gtceu:block/machine/large_cutter" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_cutter" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/large_cutter", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/large_cutter", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/large_cutter" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_cutter", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/large_cutter", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/large_cutter" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_cutter", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_cutter", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/large_cutter" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/large_cutter", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/large_cutter", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/large_cutter", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/large_cutter" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/large_electrolyzer.json b/src/generated/resources/assets/gtceu/blockstates/large_electrolyzer.json index a94b9f0aa01..59834b0c067 100644 --- a/src/generated/resources/assets/gtceu/blockstates/large_electrolyzer.json +++ b/src/generated/resources/assets/gtceu/blockstates/large_electrolyzer.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/large_electrolyzer" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_electrolyzer", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/large_electrolyzer", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/large_electrolyzer" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_electrolyzer", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_electrolyzer", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/large_electrolyzer" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/large_electrolyzer", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/large_electrolyzer", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/large_electrolyzer", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/large_electrolyzer" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_electrolyzer" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/large_electrolyzer" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/large_electrolyzer" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_electrolyzer" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/large_electrolyzer" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/large_electrolyzer" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_electrolyzer", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/large_electrolyzer", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/large_electrolyzer", - "y": 180 + "model": "gtceu:block/machine/large_electrolyzer" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_electrolyzer" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/large_electrolyzer", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/large_electrolyzer", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/large_electrolyzer" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_electrolyzer", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/large_electrolyzer", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/large_electrolyzer" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_electrolyzer", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_electrolyzer", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/large_electrolyzer" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/large_electrolyzer", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/large_electrolyzer", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/large_electrolyzer", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/large_electrolyzer" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/large_electromagnet.json b/src/generated/resources/assets/gtceu/blockstates/large_electromagnet.json index 929665d6ba3..2aea7e3bd1b 100644 --- a/src/generated/resources/assets/gtceu/blockstates/large_electromagnet.json +++ b/src/generated/resources/assets/gtceu/blockstates/large_electromagnet.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/large_electromagnet" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_electromagnet", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/large_electromagnet", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/large_electromagnet" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_electromagnet", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_electromagnet", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/large_electromagnet" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/large_electromagnet", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/large_electromagnet", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/large_electromagnet", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/large_electromagnet" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_electromagnet" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/large_electromagnet" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/large_electromagnet" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_electromagnet" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/large_electromagnet" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/large_electromagnet" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_electromagnet", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/large_electromagnet", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/large_electromagnet", - "y": 180 + "model": "gtceu:block/machine/large_electromagnet" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_electromagnet" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/large_electromagnet", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/large_electromagnet", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/large_electromagnet" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_electromagnet", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/large_electromagnet", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/large_electromagnet" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_electromagnet", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_electromagnet", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/large_electromagnet" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/large_electromagnet", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/large_electromagnet", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/large_electromagnet", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/large_electromagnet" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/large_engraving_laser.json b/src/generated/resources/assets/gtceu/blockstates/large_engraving_laser.json index 167f45bec63..d967b6e317d 100644 --- a/src/generated/resources/assets/gtceu/blockstates/large_engraving_laser.json +++ b/src/generated/resources/assets/gtceu/blockstates/large_engraving_laser.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/large_engraving_laser" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_engraving_laser", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/large_engraving_laser", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/large_engraving_laser" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_engraving_laser", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_engraving_laser", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/large_engraving_laser" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/large_engraving_laser", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/large_engraving_laser", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/large_engraving_laser", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/large_engraving_laser" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_engraving_laser" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/large_engraving_laser" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/large_engraving_laser" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_engraving_laser" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/large_engraving_laser" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/large_engraving_laser" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_engraving_laser", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/large_engraving_laser", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/large_engraving_laser", - "y": 180 + "model": "gtceu:block/machine/large_engraving_laser" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_engraving_laser" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/large_engraving_laser", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/large_engraving_laser", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/large_engraving_laser" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_engraving_laser", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/large_engraving_laser", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/large_engraving_laser" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_engraving_laser", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_engraving_laser", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/large_engraving_laser" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/large_engraving_laser", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/large_engraving_laser", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/large_engraving_laser", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/large_engraving_laser" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/large_extractor.json b/src/generated/resources/assets/gtceu/blockstates/large_extractor.json index 893e6e98011..a2bf5e7fb20 100644 --- a/src/generated/resources/assets/gtceu/blockstates/large_extractor.json +++ b/src/generated/resources/assets/gtceu/blockstates/large_extractor.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/large_extractor" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_extractor", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/large_extractor", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/large_extractor" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_extractor", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_extractor", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/large_extractor" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/large_extractor", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/large_extractor", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/large_extractor", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/large_extractor" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_extractor" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/large_extractor" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/large_extractor" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_extractor" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/large_extractor" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/large_extractor" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_extractor", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/large_extractor", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/large_extractor", - "y": 180 + "model": "gtceu:block/machine/large_extractor" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_extractor" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/large_extractor", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/large_extractor", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/large_extractor" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_extractor", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/large_extractor", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/large_extractor" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_extractor", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_extractor", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/large_extractor" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/large_extractor", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/large_extractor", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/large_extractor", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/large_extractor" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/large_extruder.json b/src/generated/resources/assets/gtceu/blockstates/large_extruder.json index e3cbd7af1a0..cc34bc76098 100644 --- a/src/generated/resources/assets/gtceu/blockstates/large_extruder.json +++ b/src/generated/resources/assets/gtceu/blockstates/large_extruder.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/large_extruder" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_extruder", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/large_extruder", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/large_extruder" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_extruder", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_extruder", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/large_extruder" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/large_extruder", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/large_extruder", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/large_extruder", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/large_extruder" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_extruder" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/large_extruder" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/large_extruder" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_extruder" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/large_extruder" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/large_extruder" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_extruder", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/large_extruder", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/large_extruder", - "y": 180 + "model": "gtceu:block/machine/large_extruder" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_extruder" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/large_extruder", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/large_extruder", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/large_extruder" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_extruder", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/large_extruder", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/large_extruder" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_extruder", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_extruder", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/large_extruder" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/large_extruder", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/large_extruder", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/large_extruder", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/large_extruder" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/large_maceration_tower.json b/src/generated/resources/assets/gtceu/blockstates/large_maceration_tower.json index 04932d5aeeb..9b41578c182 100644 --- a/src/generated/resources/assets/gtceu/blockstates/large_maceration_tower.json +++ b/src/generated/resources/assets/gtceu/blockstates/large_maceration_tower.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/large_maceration_tower" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_maceration_tower", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/large_maceration_tower", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/large_maceration_tower" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_maceration_tower", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_maceration_tower", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/large_maceration_tower" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/large_maceration_tower", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/large_maceration_tower", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/large_maceration_tower", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/large_maceration_tower" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_maceration_tower" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/large_maceration_tower" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/large_maceration_tower" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_maceration_tower" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/large_maceration_tower" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/large_maceration_tower" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_maceration_tower", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/large_maceration_tower", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/large_maceration_tower", - "y": 180 + "model": "gtceu:block/machine/large_maceration_tower" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_maceration_tower" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/large_maceration_tower", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/large_maceration_tower", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/large_maceration_tower" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_maceration_tower", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/large_maceration_tower", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/large_maceration_tower" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_maceration_tower", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_maceration_tower", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/large_maceration_tower" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/large_maceration_tower", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/large_maceration_tower", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/large_maceration_tower", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/large_maceration_tower" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/large_material_press.json b/src/generated/resources/assets/gtceu/blockstates/large_material_press.json index 5d65d7eb49e..19127b03b2d 100644 --- a/src/generated/resources/assets/gtceu/blockstates/large_material_press.json +++ b/src/generated/resources/assets/gtceu/blockstates/large_material_press.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/large_material_press" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_material_press", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/large_material_press", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/large_material_press" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_material_press", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_material_press", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/large_material_press" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/large_material_press", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/large_material_press", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/large_material_press", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/large_material_press" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_material_press" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/large_material_press" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/large_material_press" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_material_press" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/large_material_press" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/large_material_press" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_material_press", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/large_material_press", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/large_material_press", - "y": 180 + "model": "gtceu:block/machine/large_material_press" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_material_press" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/large_material_press", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/large_material_press", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/large_material_press" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_material_press", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/large_material_press", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/large_material_press" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_material_press", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_material_press", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/large_material_press" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/large_material_press", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/large_material_press", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/large_material_press", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/large_material_press" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/large_mixer.json b/src/generated/resources/assets/gtceu/blockstates/large_mixer.json index 8bb60bd8245..8fc270efa3a 100644 --- a/src/generated/resources/assets/gtceu/blockstates/large_mixer.json +++ b/src/generated/resources/assets/gtceu/blockstates/large_mixer.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/large_mixer" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_mixer", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/large_mixer", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/large_mixer" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_mixer", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_mixer", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/large_mixer" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/large_mixer", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/large_mixer", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/large_mixer", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/large_mixer" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_mixer" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/large_mixer" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/large_mixer" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_mixer" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/large_mixer" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/large_mixer" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_mixer", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/large_mixer", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/large_mixer", - "y": 180 + "model": "gtceu:block/machine/large_mixer" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_mixer" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/large_mixer", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/large_mixer", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/large_mixer" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_mixer", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/large_mixer", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/large_mixer" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_mixer", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_mixer", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/large_mixer" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/large_mixer", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/large_mixer", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/large_mixer", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/large_mixer" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/large_packer.json b/src/generated/resources/assets/gtceu/blockstates/large_packer.json index a8d2e8d79ee..0852433ab19 100644 --- a/src/generated/resources/assets/gtceu/blockstates/large_packer.json +++ b/src/generated/resources/assets/gtceu/blockstates/large_packer.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/large_packer" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_packer", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/large_packer", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/large_packer" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_packer", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_packer", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/large_packer" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/large_packer", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/large_packer", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/large_packer", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/large_packer" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_packer" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/large_packer" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/large_packer" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_packer" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/large_packer" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/large_packer" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_packer", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/large_packer", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/large_packer", - "y": 180 + "model": "gtceu:block/machine/large_packer" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_packer" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/large_packer", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/large_packer", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/large_packer" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_packer", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/large_packer", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/large_packer" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_packer", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_packer", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/large_packer" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/large_packer", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/large_packer", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/large_packer", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/large_packer" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/large_sifting_funnel.json b/src/generated/resources/assets/gtceu/blockstates/large_sifting_funnel.json index 491961b0ab5..b5b9eff204b 100644 --- a/src/generated/resources/assets/gtceu/blockstates/large_sifting_funnel.json +++ b/src/generated/resources/assets/gtceu/blockstates/large_sifting_funnel.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/large_sifting_funnel" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_sifting_funnel", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/large_sifting_funnel", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/large_sifting_funnel" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_sifting_funnel", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_sifting_funnel", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/large_sifting_funnel" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/large_sifting_funnel", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/large_sifting_funnel", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/large_sifting_funnel", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/large_sifting_funnel" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_sifting_funnel" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/large_sifting_funnel" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/large_sifting_funnel" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_sifting_funnel" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/large_sifting_funnel" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/large_sifting_funnel" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_sifting_funnel", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/large_sifting_funnel", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/large_sifting_funnel", - "y": 180 + "model": "gtceu:block/machine/large_sifting_funnel" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_sifting_funnel" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/large_sifting_funnel", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/large_sifting_funnel", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/large_sifting_funnel" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_sifting_funnel", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/large_sifting_funnel", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/large_sifting_funnel" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_sifting_funnel", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_sifting_funnel", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/large_sifting_funnel" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/large_sifting_funnel", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/large_sifting_funnel", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/large_sifting_funnel", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/large_sifting_funnel" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/large_solidifier.json b/src/generated/resources/assets/gtceu/blockstates/large_solidifier.json index bb931c2b043..4c1850d1c70 100644 --- a/src/generated/resources/assets/gtceu/blockstates/large_solidifier.json +++ b/src/generated/resources/assets/gtceu/blockstates/large_solidifier.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/large_solidifier" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_solidifier", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/large_solidifier", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/large_solidifier" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_solidifier", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_solidifier", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/large_solidifier" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/large_solidifier", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/large_solidifier", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/large_solidifier", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/large_solidifier" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_solidifier" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/large_solidifier" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/large_solidifier" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_solidifier" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/large_solidifier" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/large_solidifier" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_solidifier", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/large_solidifier", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/large_solidifier", - "y": 180 + "model": "gtceu:block/machine/large_solidifier" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_solidifier" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/large_solidifier", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/large_solidifier", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/large_solidifier" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_solidifier", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/large_solidifier", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/large_solidifier" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_solidifier", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_solidifier", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/large_solidifier" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/large_solidifier", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/large_solidifier", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/large_solidifier", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/large_solidifier" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/large_wiremill.json b/src/generated/resources/assets/gtceu/blockstates/large_wiremill.json index 2553979b12d..e9f306ffe34 100644 --- a/src/generated/resources/assets/gtceu/blockstates/large_wiremill.json +++ b/src/generated/resources/assets/gtceu/blockstates/large_wiremill.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/large_wiremill" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_wiremill", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/large_wiremill", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/large_wiremill" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_wiremill", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_wiremill", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/large_wiremill" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/large_wiremill", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/large_wiremill", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/large_wiremill", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/large_wiremill" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_wiremill" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/large_wiremill" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/large_wiremill" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_wiremill" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/large_wiremill" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/large_wiremill" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/large_wiremill", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/large_wiremill", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/large_wiremill", - "y": 180 + "model": "gtceu:block/machine/large_wiremill" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/large_wiremill" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/large_wiremill", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/large_wiremill", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/large_wiremill" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/large_wiremill", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/large_wiremill", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/large_wiremill" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/large_wiremill", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/large_wiremill", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/large_wiremill" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/large_wiremill", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/large_wiremill", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/large_wiremill", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/large_wiremill" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/luv_fusion_reactor.json b/src/generated/resources/assets/gtceu/blockstates/luv_fusion_reactor.json index e9c318805dc..15ebeaa345a 100644 --- a/src/generated/resources/assets/gtceu/blockstates/luv_fusion_reactor.json +++ b/src/generated/resources/assets/gtceu/blockstates/luv_fusion_reactor.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/luv_fusion_reactor" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/luv_fusion_reactor", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/luv_fusion_reactor", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/luv_fusion_reactor" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/luv_fusion_reactor", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/luv_fusion_reactor", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/luv_fusion_reactor" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/luv_fusion_reactor", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/luv_fusion_reactor", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/luv_fusion_reactor", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/luv_fusion_reactor" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/luv_fusion_reactor" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/luv_fusion_reactor" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/luv_fusion_reactor" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/luv_fusion_reactor" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/luv_fusion_reactor" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/luv_fusion_reactor" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/luv_fusion_reactor", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/luv_fusion_reactor", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/luv_fusion_reactor", - "y": 180 + "model": "gtceu:block/machine/luv_fusion_reactor" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/luv_fusion_reactor" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/luv_fusion_reactor", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/luv_fusion_reactor", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/luv_fusion_reactor" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/luv_fusion_reactor", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/luv_fusion_reactor", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/luv_fusion_reactor" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/luv_fusion_reactor", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/luv_fusion_reactor", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/luv_fusion_reactor" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/luv_fusion_reactor", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/luv_fusion_reactor", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/luv_fusion_reactor", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/luv_fusion_reactor" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/luv_large_miner.json b/src/generated/resources/assets/gtceu/blockstates/luv_large_miner.json index 45a2d8bc2b5..2906d276bfe 100644 --- a/src/generated/resources/assets/gtceu/blockstates/luv_large_miner.json +++ b/src/generated/resources/assets/gtceu/blockstates/luv_large_miner.json @@ -1,50 +1,68 @@ { "variants": { - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/luv_large_miner", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/luv_large_miner" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/luv_large_miner", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/luv_large_miner", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/luv_large_miner", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/luv_large_miner" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/luv_large_miner" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/luv_large_miner" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/luv_large_miner" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/luv_large_miner" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/luv_large_miner" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/luv_large_miner" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/luv_large_miner", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/luv_large_miner", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/luv_large_miner", - "y": 180 + "model": "gtceu:block/machine/luv_large_miner" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/luv_large_miner" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/luv_large_miner", "y": 180 }, @@ -53,24 +71,30 @@ "model": "gtceu:block/machine/luv_large_miner", "y": 180 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/luv_large_miner", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/luv_large_miner" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/luv_large_miner", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/luv_large_miner", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/luv_large_miner", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/luv_large_miner" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/luv_quantum_chest.json b/src/generated/resources/assets/gtceu/blockstates/luv_quantum_chest.json index 74882b02e30..fd6835351f3 100644 --- a/src/generated/resources/assets/gtceu/blockstates/luv_quantum_chest.json +++ b/src/generated/resources/assets/gtceu/blockstates/luv_quantum_chest.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/luv_quantum_chest" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/luv_quantum_chest", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/luv_quantum_chest", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/luv_quantum_chest" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/luv_quantum_chest", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/luv_quantum_chest", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/luv_quantum_chest" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/luv_quantum_chest", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/luv_quantum_chest", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/luv_quantum_chest", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/luv_quantum_chest" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/luv_quantum_chest" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/luv_quantum_chest" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/luv_quantum_chest" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/luv_quantum_chest" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/luv_quantum_chest" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/luv_quantum_chest" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/luv_quantum_chest", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/luv_quantum_chest", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/luv_quantum_chest", - "y": 180 + "model": "gtceu:block/machine/luv_quantum_chest" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/luv_quantum_chest" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/luv_quantum_chest", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/luv_quantum_chest", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/luv_quantum_chest" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/luv_quantum_chest", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/luv_quantum_chest", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/luv_quantum_chest" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/luv_quantum_chest", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/luv_quantum_chest", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/luv_quantum_chest" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/luv_quantum_chest", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/luv_quantum_chest", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/luv_quantum_chest", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/luv_quantum_chest" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/luv_quantum_tank.json b/src/generated/resources/assets/gtceu/blockstates/luv_quantum_tank.json index c10a5142587..f156a1d749d 100644 --- a/src/generated/resources/assets/gtceu/blockstates/luv_quantum_tank.json +++ b/src/generated/resources/assets/gtceu/blockstates/luv_quantum_tank.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/luv_quantum_tank" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/luv_quantum_tank", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/luv_quantum_tank", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/luv_quantum_tank" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/luv_quantum_tank", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/luv_quantum_tank", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/luv_quantum_tank" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/luv_quantum_tank", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/luv_quantum_tank", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/luv_quantum_tank", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/luv_quantum_tank" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/luv_quantum_tank" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/luv_quantum_tank" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/luv_quantum_tank" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/luv_quantum_tank" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/luv_quantum_tank" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/luv_quantum_tank" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/luv_quantum_tank", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/luv_quantum_tank", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/luv_quantum_tank", - "y": 180 + "model": "gtceu:block/machine/luv_quantum_tank" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/luv_quantum_tank" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/luv_quantum_tank", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/luv_quantum_tank", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/luv_quantum_tank" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/luv_quantum_tank", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/luv_quantum_tank", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/luv_quantum_tank" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/luv_quantum_tank", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/luv_quantum_tank", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/luv_quantum_tank" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/luv_quantum_tank", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/luv_quantum_tank", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/luv_quantum_tank", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/luv_quantum_tank" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/lv_super_chest.json b/src/generated/resources/assets/gtceu/blockstates/lv_super_chest.json index d4027ba147d..ed6f289e84d 100644 --- a/src/generated/resources/assets/gtceu/blockstates/lv_super_chest.json +++ b/src/generated/resources/assets/gtceu/blockstates/lv_super_chest.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/lv_super_chest" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/lv_super_chest", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/lv_super_chest", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/lv_super_chest" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/lv_super_chest", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/lv_super_chest", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/lv_super_chest" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/lv_super_chest", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/lv_super_chest", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/lv_super_chest", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/lv_super_chest" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/lv_super_chest" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/lv_super_chest" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/lv_super_chest" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/lv_super_chest" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/lv_super_chest" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/lv_super_chest" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/lv_super_chest", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/lv_super_chest", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/lv_super_chest", - "y": 180 + "model": "gtceu:block/machine/lv_super_chest" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/lv_super_chest" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/lv_super_chest", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/lv_super_chest", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/lv_super_chest" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/lv_super_chest", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/lv_super_chest", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/lv_super_chest" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/lv_super_chest", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/lv_super_chest", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/lv_super_chest" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/lv_super_chest", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/lv_super_chest", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/lv_super_chest", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/lv_super_chest" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/lv_super_tank.json b/src/generated/resources/assets/gtceu/blockstates/lv_super_tank.json index 47d846e231d..01a8312d28b 100644 --- a/src/generated/resources/assets/gtceu/blockstates/lv_super_tank.json +++ b/src/generated/resources/assets/gtceu/blockstates/lv_super_tank.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/lv_super_tank" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/lv_super_tank", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/lv_super_tank", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/lv_super_tank" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/lv_super_tank", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/lv_super_tank", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/lv_super_tank" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/lv_super_tank", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/lv_super_tank", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/lv_super_tank", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/lv_super_tank" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/lv_super_tank" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/lv_super_tank" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/lv_super_tank" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/lv_super_tank" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/lv_super_tank" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/lv_super_tank" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/lv_super_tank", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/lv_super_tank", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/lv_super_tank", - "y": 180 + "model": "gtceu:block/machine/lv_super_tank" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/lv_super_tank" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/lv_super_tank", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/lv_super_tank", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/lv_super_tank" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/lv_super_tank", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/lv_super_tank", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/lv_super_tank" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/lv_super_tank", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/lv_super_tank", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/lv_super_tank" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/lv_super_tank", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/lv_super_tank", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/lv_super_tank", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/lv_super_tank" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/mega_blast_furnace.json b/src/generated/resources/assets/gtceu/blockstates/mega_blast_furnace.json index 8b32ec70922..5632a501c1c 100644 --- a/src/generated/resources/assets/gtceu/blockstates/mega_blast_furnace.json +++ b/src/generated/resources/assets/gtceu/blockstates/mega_blast_furnace.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/mega_blast_furnace" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/mega_blast_furnace", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/mega_blast_furnace", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/mega_blast_furnace" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/mega_blast_furnace", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/mega_blast_furnace", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/mega_blast_furnace" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/mega_blast_furnace", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/mega_blast_furnace", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/mega_blast_furnace", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/mega_blast_furnace" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/mega_blast_furnace" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/mega_blast_furnace" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/mega_blast_furnace" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/mega_blast_furnace" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/mega_blast_furnace" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/mega_blast_furnace" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/mega_blast_furnace", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/mega_blast_furnace", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/mega_blast_furnace", - "y": 180 + "model": "gtceu:block/machine/mega_blast_furnace" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/mega_blast_furnace" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/mega_blast_furnace", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/mega_blast_furnace", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/mega_blast_furnace" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/mega_blast_furnace", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/mega_blast_furnace", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/mega_blast_furnace" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/mega_blast_furnace", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/mega_blast_furnace", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/mega_blast_furnace" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/mega_blast_furnace", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/mega_blast_furnace", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/mega_blast_furnace", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/mega_blast_furnace" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/mega_vacuum_freezer.json b/src/generated/resources/assets/gtceu/blockstates/mega_vacuum_freezer.json index b6f268100a8..c756f374a31 100644 --- a/src/generated/resources/assets/gtceu/blockstates/mega_vacuum_freezer.json +++ b/src/generated/resources/assets/gtceu/blockstates/mega_vacuum_freezer.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/mega_vacuum_freezer" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/mega_vacuum_freezer", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/mega_vacuum_freezer", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/mega_vacuum_freezer" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/mega_vacuum_freezer", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/mega_vacuum_freezer", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/mega_vacuum_freezer" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/mega_vacuum_freezer", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/mega_vacuum_freezer", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/mega_vacuum_freezer", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/mega_vacuum_freezer" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/mega_vacuum_freezer" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/mega_vacuum_freezer" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/mega_vacuum_freezer" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/mega_vacuum_freezer" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/mega_vacuum_freezer" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/mega_vacuum_freezer" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/mega_vacuum_freezer", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/mega_vacuum_freezer", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/mega_vacuum_freezer", - "y": 180 + "model": "gtceu:block/machine/mega_vacuum_freezer" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/mega_vacuum_freezer" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/mega_vacuum_freezer", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/mega_vacuum_freezer", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/mega_vacuum_freezer" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/mega_vacuum_freezer", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/mega_vacuum_freezer", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/mega_vacuum_freezer" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/mega_vacuum_freezer", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/mega_vacuum_freezer", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/mega_vacuum_freezer" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/mega_vacuum_freezer", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/mega_vacuum_freezer", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/mega_vacuum_freezer", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/mega_vacuum_freezer" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/multi_smelter.json b/src/generated/resources/assets/gtceu/blockstates/multi_smelter.json index 9a0a93f4c83..b43bf7982f2 100644 --- a/src/generated/resources/assets/gtceu/blockstates/multi_smelter.json +++ b/src/generated/resources/assets/gtceu/blockstates/multi_smelter.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/multi_smelter" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/multi_smelter", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/multi_smelter", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/multi_smelter" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/multi_smelter", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/multi_smelter", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/multi_smelter" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/multi_smelter", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/multi_smelter", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/multi_smelter", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/multi_smelter" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/multi_smelter" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/multi_smelter" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/multi_smelter" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/multi_smelter" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/multi_smelter" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/multi_smelter" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/multi_smelter", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/multi_smelter", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/multi_smelter", - "y": 180 + "model": "gtceu:block/machine/multi_smelter" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/multi_smelter" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/multi_smelter", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/multi_smelter", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/multi_smelter" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/multi_smelter", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/multi_smelter", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/multi_smelter" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/multi_smelter", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/multi_smelter", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/multi_smelter" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/multi_smelter", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/multi_smelter", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/multi_smelter", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/multi_smelter" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/mv_bedrock_ore_miner.json b/src/generated/resources/assets/gtceu/blockstates/mv_bedrock_ore_miner.json index 314f7a08f3d..73dac157d4b 100644 --- a/src/generated/resources/assets/gtceu/blockstates/mv_bedrock_ore_miner.json +++ b/src/generated/resources/assets/gtceu/blockstates/mv_bedrock_ore_miner.json @@ -1,50 +1,68 @@ { "variants": { - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/mv_bedrock_ore_miner", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/mv_bedrock_ore_miner" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/mv_bedrock_ore_miner", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/mv_bedrock_ore_miner", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/mv_bedrock_ore_miner", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/mv_bedrock_ore_miner" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/mv_bedrock_ore_miner" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/mv_bedrock_ore_miner" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/mv_bedrock_ore_miner" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/mv_bedrock_ore_miner" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/mv_bedrock_ore_miner" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/mv_bedrock_ore_miner" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/mv_bedrock_ore_miner", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/mv_bedrock_ore_miner", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/mv_bedrock_ore_miner", - "y": 180 + "model": "gtceu:block/machine/mv_bedrock_ore_miner" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/mv_bedrock_ore_miner" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/mv_bedrock_ore_miner", "y": 180 }, @@ -53,24 +71,30 @@ "model": "gtceu:block/machine/mv_bedrock_ore_miner", "y": 180 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/mv_bedrock_ore_miner", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/mv_bedrock_ore_miner" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/mv_bedrock_ore_miner", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/mv_bedrock_ore_miner", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/mv_bedrock_ore_miner", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/mv_bedrock_ore_miner" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/mv_fluid_drilling_rig.json b/src/generated/resources/assets/gtceu/blockstates/mv_fluid_drilling_rig.json index da1d03a2d6e..5b34ff71996 100644 --- a/src/generated/resources/assets/gtceu/blockstates/mv_fluid_drilling_rig.json +++ b/src/generated/resources/assets/gtceu/blockstates/mv_fluid_drilling_rig.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/mv_fluid_drilling_rig" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/mv_fluid_drilling_rig", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/mv_fluid_drilling_rig", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/mv_fluid_drilling_rig" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/mv_fluid_drilling_rig", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/mv_fluid_drilling_rig", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/mv_fluid_drilling_rig" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/mv_fluid_drilling_rig", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/mv_fluid_drilling_rig", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/mv_fluid_drilling_rig", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/mv_fluid_drilling_rig" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/mv_fluid_drilling_rig" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/mv_fluid_drilling_rig" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/mv_fluid_drilling_rig" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/mv_fluid_drilling_rig" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/mv_fluid_drilling_rig" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/mv_fluid_drilling_rig" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/mv_fluid_drilling_rig", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/mv_fluid_drilling_rig", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/mv_fluid_drilling_rig", - "y": 180 + "model": "gtceu:block/machine/mv_fluid_drilling_rig" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/mv_fluid_drilling_rig" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/mv_fluid_drilling_rig", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/mv_fluid_drilling_rig", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/mv_fluid_drilling_rig" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/mv_fluid_drilling_rig", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/mv_fluid_drilling_rig", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/mv_fluid_drilling_rig" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/mv_fluid_drilling_rig", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/mv_fluid_drilling_rig", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/mv_fluid_drilling_rig" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/mv_fluid_drilling_rig", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/mv_fluid_drilling_rig", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/mv_fluid_drilling_rig", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/mv_fluid_drilling_rig" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/mv_super_chest.json b/src/generated/resources/assets/gtceu/blockstates/mv_super_chest.json index 96f6da8d960..530218d6714 100644 --- a/src/generated/resources/assets/gtceu/blockstates/mv_super_chest.json +++ b/src/generated/resources/assets/gtceu/blockstates/mv_super_chest.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/mv_super_chest" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/mv_super_chest", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/mv_super_chest", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/mv_super_chest" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/mv_super_chest", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/mv_super_chest", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/mv_super_chest" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/mv_super_chest", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/mv_super_chest", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/mv_super_chest", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/mv_super_chest" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/mv_super_chest" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/mv_super_chest" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/mv_super_chest" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/mv_super_chest" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/mv_super_chest" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/mv_super_chest" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/mv_super_chest", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/mv_super_chest", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/mv_super_chest", - "y": 180 + "model": "gtceu:block/machine/mv_super_chest" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/mv_super_chest" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/mv_super_chest", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/mv_super_chest", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/mv_super_chest" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/mv_super_chest", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/mv_super_chest", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/mv_super_chest" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/mv_super_chest", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/mv_super_chest", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/mv_super_chest" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/mv_super_chest", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/mv_super_chest", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/mv_super_chest", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/mv_super_chest" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/mv_super_tank.json b/src/generated/resources/assets/gtceu/blockstates/mv_super_tank.json index b5ef2d0e64b..27eba9c1760 100644 --- a/src/generated/resources/assets/gtceu/blockstates/mv_super_tank.json +++ b/src/generated/resources/assets/gtceu/blockstates/mv_super_tank.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/mv_super_tank" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/mv_super_tank", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/mv_super_tank", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/mv_super_tank" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/mv_super_tank", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/mv_super_tank", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/mv_super_tank" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/mv_super_tank", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/mv_super_tank", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/mv_super_tank", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/mv_super_tank" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/mv_super_tank" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/mv_super_tank" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/mv_super_tank" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/mv_super_tank" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/mv_super_tank" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/mv_super_tank" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/mv_super_tank", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/mv_super_tank", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/mv_super_tank", - "y": 180 + "model": "gtceu:block/machine/mv_super_tank" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/mv_super_tank" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/mv_super_tank", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/mv_super_tank", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/mv_super_tank" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/mv_super_tank", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/mv_super_tank", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/mv_super_tank" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/mv_super_tank", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/mv_super_tank", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/mv_super_tank" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/mv_super_tank", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/mv_super_tank", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/mv_super_tank", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/mv_super_tank" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/network_switch.json b/src/generated/resources/assets/gtceu/blockstates/network_switch.json index 2339dd756ea..2ae26a1b3c8 100644 --- a/src/generated/resources/assets/gtceu/blockstates/network_switch.json +++ b/src/generated/resources/assets/gtceu/blockstates/network_switch.json @@ -1,50 +1,68 @@ { "variants": { - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/network_switch", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/network_switch" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/network_switch", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/network_switch", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/network_switch", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/network_switch" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/network_switch" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/network_switch" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/network_switch" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/network_switch" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/network_switch" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/network_switch" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/network_switch", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/network_switch", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/network_switch", - "y": 180 + "model": "gtceu:block/machine/network_switch" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/network_switch" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/network_switch", "y": 180 }, @@ -53,24 +71,30 @@ "model": "gtceu:block/machine/network_switch", "y": 180 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/network_switch", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/network_switch" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/network_switch", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/network_switch", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/network_switch", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/network_switch" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/opv_quantum_chest.json b/src/generated/resources/assets/gtceu/blockstates/opv_quantum_chest.json index 75624c6f5eb..72dce9e34b0 100644 --- a/src/generated/resources/assets/gtceu/blockstates/opv_quantum_chest.json +++ b/src/generated/resources/assets/gtceu/blockstates/opv_quantum_chest.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/opv_quantum_chest" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/opv_quantum_chest", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/opv_quantum_chest", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/opv_quantum_chest" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/opv_quantum_chest", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/opv_quantum_chest", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/opv_quantum_chest" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/opv_quantum_chest", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/opv_quantum_chest", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/opv_quantum_chest", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/opv_quantum_chest" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/opv_quantum_chest" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/opv_quantum_chest" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/opv_quantum_chest" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/opv_quantum_chest" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/opv_quantum_chest" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/opv_quantum_chest" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/opv_quantum_chest", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/opv_quantum_chest", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/opv_quantum_chest", - "y": 180 + "model": "gtceu:block/machine/opv_quantum_chest" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/opv_quantum_chest" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/opv_quantum_chest", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/opv_quantum_chest", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/opv_quantum_chest" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/opv_quantum_chest", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/opv_quantum_chest", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/opv_quantum_chest" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/opv_quantum_chest", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/opv_quantum_chest", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/opv_quantum_chest" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/opv_quantum_chest", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/opv_quantum_chest", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/opv_quantum_chest", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/opv_quantum_chest" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/opv_quantum_tank.json b/src/generated/resources/assets/gtceu/blockstates/opv_quantum_tank.json index beebb68f6a4..188587bdcc4 100644 --- a/src/generated/resources/assets/gtceu/blockstates/opv_quantum_tank.json +++ b/src/generated/resources/assets/gtceu/blockstates/opv_quantum_tank.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/opv_quantum_tank" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/opv_quantum_tank", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/opv_quantum_tank", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/opv_quantum_tank" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/opv_quantum_tank", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/opv_quantum_tank", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/opv_quantum_tank" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/opv_quantum_tank", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/opv_quantum_tank", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/opv_quantum_tank", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/opv_quantum_tank" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/opv_quantum_tank" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/opv_quantum_tank" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/opv_quantum_tank" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/opv_quantum_tank" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/opv_quantum_tank" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/opv_quantum_tank" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/opv_quantum_tank", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/opv_quantum_tank", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/opv_quantum_tank", - "y": 180 + "model": "gtceu:block/machine/opv_quantum_tank" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/opv_quantum_tank" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/opv_quantum_tank", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/opv_quantum_tank", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/opv_quantum_tank" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/opv_quantum_tank", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/opv_quantum_tank", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/opv_quantum_tank" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/opv_quantum_tank", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/opv_quantum_tank", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/opv_quantum_tank" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/opv_quantum_tank", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/opv_quantum_tank", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/opv_quantum_tank", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/opv_quantum_tank" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/plasma_large_turbine.json b/src/generated/resources/assets/gtceu/blockstates/plasma_large_turbine.json index 2c36aaf2ace..405b1ac479e 100644 --- a/src/generated/resources/assets/gtceu/blockstates/plasma_large_turbine.json +++ b/src/generated/resources/assets/gtceu/blockstates/plasma_large_turbine.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/plasma_large_turbine" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/plasma_large_turbine", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/plasma_large_turbine", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/plasma_large_turbine" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/plasma_large_turbine", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/plasma_large_turbine", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/plasma_large_turbine" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/plasma_large_turbine", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/plasma_large_turbine", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/plasma_large_turbine", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/plasma_large_turbine" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/plasma_large_turbine" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/plasma_large_turbine" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/plasma_large_turbine" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/plasma_large_turbine" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/plasma_large_turbine" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/plasma_large_turbine" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/plasma_large_turbine", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/plasma_large_turbine", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/plasma_large_turbine", - "y": 180 + "model": "gtceu:block/machine/plasma_large_turbine" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/plasma_large_turbine" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/plasma_large_turbine", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/plasma_large_turbine", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/plasma_large_turbine" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/plasma_large_turbine", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/plasma_large_turbine", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/plasma_large_turbine" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/plasma_large_turbine", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/plasma_large_turbine", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/plasma_large_turbine" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/plasma_large_turbine", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/plasma_large_turbine", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/plasma_large_turbine", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/plasma_large_turbine" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/power_substation.json b/src/generated/resources/assets/gtceu/blockstates/power_substation.json index cb54226d5c2..2b037f1c3c9 100644 --- a/src/generated/resources/assets/gtceu/blockstates/power_substation.json +++ b/src/generated/resources/assets/gtceu/blockstates/power_substation.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/power_substation" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/power_substation", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/power_substation", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/power_substation" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/power_substation", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/power_substation", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/power_substation" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/power_substation", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/power_substation", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/power_substation", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/power_substation" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/power_substation" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/power_substation" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/power_substation" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/power_substation" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/power_substation" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/power_substation" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/power_substation", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/power_substation", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/power_substation", - "y": 180 + "model": "gtceu:block/machine/power_substation" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/power_substation" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/power_substation", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/power_substation", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/power_substation" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/power_substation", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/power_substation", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/power_substation" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/power_substation", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/power_substation", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/power_substation" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/power_substation", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/power_substation", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/power_substation", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/power_substation" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/primitive_blast_furnace.json b/src/generated/resources/assets/gtceu/blockstates/primitive_blast_furnace.json index 23b31f1d044..f37cbb73146 100644 --- a/src/generated/resources/assets/gtceu/blockstates/primitive_blast_furnace.json +++ b/src/generated/resources/assets/gtceu/blockstates/primitive_blast_furnace.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/primitive_blast_furnace" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/primitive_blast_furnace", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/primitive_blast_furnace", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/primitive_blast_furnace" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/primitive_blast_furnace", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/primitive_blast_furnace", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/primitive_blast_furnace" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/primitive_blast_furnace", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/primitive_blast_furnace", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/primitive_blast_furnace", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/primitive_blast_furnace" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/primitive_blast_furnace" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/primitive_blast_furnace" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/primitive_blast_furnace" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/primitive_blast_furnace" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/primitive_blast_furnace" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/primitive_blast_furnace" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/primitive_blast_furnace", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/primitive_blast_furnace", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/primitive_blast_furnace", - "y": 180 + "model": "gtceu:block/machine/primitive_blast_furnace" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/primitive_blast_furnace" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/primitive_blast_furnace", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/primitive_blast_furnace", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/primitive_blast_furnace" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/primitive_blast_furnace", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/primitive_blast_furnace", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/primitive_blast_furnace" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/primitive_blast_furnace", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/primitive_blast_furnace", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/primitive_blast_furnace" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/primitive_blast_furnace", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/primitive_blast_furnace", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/primitive_blast_furnace", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/primitive_blast_furnace" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/pyrolyse_oven.json b/src/generated/resources/assets/gtceu/blockstates/pyrolyse_oven.json index 1b3e550db6a..4223dfb56a9 100644 --- a/src/generated/resources/assets/gtceu/blockstates/pyrolyse_oven.json +++ b/src/generated/resources/assets/gtceu/blockstates/pyrolyse_oven.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/pyrolyse_oven" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/pyrolyse_oven", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/pyrolyse_oven", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/pyrolyse_oven" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/pyrolyse_oven", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/pyrolyse_oven", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/pyrolyse_oven" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/pyrolyse_oven", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/pyrolyse_oven", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/pyrolyse_oven", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/pyrolyse_oven" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/pyrolyse_oven" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/pyrolyse_oven" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/pyrolyse_oven" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/pyrolyse_oven" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/pyrolyse_oven" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/pyrolyse_oven" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/pyrolyse_oven", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/pyrolyse_oven", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/pyrolyse_oven", - "y": 180 + "model": "gtceu:block/machine/pyrolyse_oven" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/pyrolyse_oven" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/pyrolyse_oven", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/pyrolyse_oven", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/pyrolyse_oven" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/pyrolyse_oven", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/pyrolyse_oven", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/pyrolyse_oven" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/pyrolyse_oven", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/pyrolyse_oven", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/pyrolyse_oven" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/pyrolyse_oven", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/pyrolyse_oven", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/pyrolyse_oven", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/pyrolyse_oven" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/research_station.json b/src/generated/resources/assets/gtceu/blockstates/research_station.json index d01f0b952df..f7f4ac40704 100644 --- a/src/generated/resources/assets/gtceu/blockstates/research_station.json +++ b/src/generated/resources/assets/gtceu/blockstates/research_station.json @@ -1,50 +1,68 @@ { "variants": { - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/research_station", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/research_station" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/research_station", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/research_station", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/research_station", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/research_station" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/research_station" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/research_station" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/research_station" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/research_station" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/research_station" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/research_station" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/research_station", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/research_station", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/research_station", - "y": 180 + "model": "gtceu:block/machine/research_station" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/research_station" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/research_station", "y": 180 }, @@ -53,24 +71,30 @@ "model": "gtceu:block/machine/research_station", "y": 180 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/research_station", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/research_station" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/research_station", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/research_station", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/research_station", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/research_station" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/steam_grinder.json b/src/generated/resources/assets/gtceu/blockstates/steam_grinder.json index 1c3cebcb3bd..69a2b78d826 100644 --- a/src/generated/resources/assets/gtceu/blockstates/steam_grinder.json +++ b/src/generated/resources/assets/gtceu/blockstates/steam_grinder.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/steam_grinder" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/steam_grinder", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/steam_grinder", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/steam_grinder" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/steam_grinder", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/steam_grinder", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/steam_grinder" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/steam_grinder", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/steam_grinder", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/steam_grinder", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/steam_grinder" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/steam_grinder" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/steam_grinder" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/steam_grinder" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/steam_grinder" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/steam_grinder" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/steam_grinder" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/steam_grinder", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/steam_grinder", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/steam_grinder", - "y": 180 + "model": "gtceu:block/machine/steam_grinder" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/steam_grinder" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/steam_grinder", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/steam_grinder", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/steam_grinder" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/steam_grinder", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/steam_grinder", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/steam_grinder" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/steam_grinder", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/steam_grinder", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/steam_grinder" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/steam_grinder", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/steam_grinder", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/steam_grinder", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/steam_grinder" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/steam_large_turbine.json b/src/generated/resources/assets/gtceu/blockstates/steam_large_turbine.json index fcc245b3924..c7b7aa3a337 100644 --- a/src/generated/resources/assets/gtceu/blockstates/steam_large_turbine.json +++ b/src/generated/resources/assets/gtceu/blockstates/steam_large_turbine.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/steam_large_turbine" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/steam_large_turbine", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/steam_large_turbine", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/steam_large_turbine" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/steam_large_turbine", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/steam_large_turbine", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/steam_large_turbine" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/steam_large_turbine", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/steam_large_turbine", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/steam_large_turbine", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/steam_large_turbine" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/steam_large_turbine" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/steam_large_turbine" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/steam_large_turbine" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/steam_large_turbine" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/steam_large_turbine" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/steam_large_turbine" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/steam_large_turbine", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/steam_large_turbine", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/steam_large_turbine", - "y": 180 + "model": "gtceu:block/machine/steam_large_turbine" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/steam_large_turbine" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/steam_large_turbine", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/steam_large_turbine", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/steam_large_turbine" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/steam_large_turbine", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/steam_large_turbine", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/steam_large_turbine" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/steam_large_turbine", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/steam_large_turbine", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/steam_large_turbine" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/steam_large_turbine", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/steam_large_turbine", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/steam_large_turbine", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/steam_large_turbine" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/steam_oven.json b/src/generated/resources/assets/gtceu/blockstates/steam_oven.json index b484e015944..2daeba65610 100644 --- a/src/generated/resources/assets/gtceu/blockstates/steam_oven.json +++ b/src/generated/resources/assets/gtceu/blockstates/steam_oven.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/steam_oven" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/steam_oven", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/steam_oven", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/steam_oven" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/steam_oven", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/steam_oven", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/steam_oven" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/steam_oven", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/steam_oven", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/steam_oven", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/steam_oven" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/steam_oven" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/steam_oven" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/steam_oven" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/steam_oven" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/steam_oven" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/steam_oven" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/steam_oven", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/steam_oven", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/steam_oven", - "y": 180 + "model": "gtceu:block/machine/steam_oven" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/steam_oven" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/steam_oven", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/steam_oven", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/steam_oven" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/steam_oven", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/steam_oven", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/steam_oven" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/steam_oven", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/steam_oven", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/steam_oven" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/steam_oven", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/steam_oven", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/steam_oven", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/steam_oven" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/steel_multiblock_tank.json b/src/generated/resources/assets/gtceu/blockstates/steel_multiblock_tank.json index 9fd0d8dbd30..3d84311d4ea 100644 --- a/src/generated/resources/assets/gtceu/blockstates/steel_multiblock_tank.json +++ b/src/generated/resources/assets/gtceu/blockstates/steel_multiblock_tank.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/steel_multiblock_tank" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/steel_multiblock_tank", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/steel_multiblock_tank", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/steel_multiblock_tank" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/steel_multiblock_tank", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/steel_multiblock_tank", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/steel_multiblock_tank" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/steel_multiblock_tank", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/steel_multiblock_tank", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/steel_multiblock_tank", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/steel_multiblock_tank" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/steel_multiblock_tank" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/steel_multiblock_tank" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/steel_multiblock_tank" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/steel_multiblock_tank" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/steel_multiblock_tank" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/steel_multiblock_tank" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/steel_multiblock_tank", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/steel_multiblock_tank", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/steel_multiblock_tank", - "y": 180 + "model": "gtceu:block/machine/steel_multiblock_tank" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/steel_multiblock_tank" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/steel_multiblock_tank", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/steel_multiblock_tank", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/steel_multiblock_tank" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/steel_multiblock_tank", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/steel_multiblock_tank", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/steel_multiblock_tank" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/steel_multiblock_tank", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/steel_multiblock_tank", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/steel_multiblock_tank" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/steel_multiblock_tank", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/steel_multiblock_tank", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/steel_multiblock_tank", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/steel_multiblock_tank" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/test_mui.json b/src/generated/resources/assets/gtceu/blockstates/test_mui.json new file mode 100644 index 00000000000..c96e32638d9 --- /dev/null +++ b/src/generated/resources/assets/gtceu/blockstates/test_mui.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "gtceu:block/machine/test_mui", + "x": 90 + }, + "facing=east": { + "model": "gtceu:block/machine/test_mui", + "y": 90 + }, + "facing=north": { + "model": "gtceu:block/machine/test_mui" + }, + "facing=south": { + "model": "gtceu:block/machine/test_mui", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "gtceu:block/machine/test_mui", + "x": 270 + }, + "facing=west": { + "model": "gtceu:block/machine/test_mui", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/uev_quantum_chest.json b/src/generated/resources/assets/gtceu/blockstates/uev_quantum_chest.json index 49622e34a92..69480ab64c3 100644 --- a/src/generated/resources/assets/gtceu/blockstates/uev_quantum_chest.json +++ b/src/generated/resources/assets/gtceu/blockstates/uev_quantum_chest.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/uev_quantum_chest" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/uev_quantum_chest", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/uev_quantum_chest", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/uev_quantum_chest" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/uev_quantum_chest", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/uev_quantum_chest", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/uev_quantum_chest" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/uev_quantum_chest", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/uev_quantum_chest", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/uev_quantum_chest", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/uev_quantum_chest" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/uev_quantum_chest" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/uev_quantum_chest" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/uev_quantum_chest" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/uev_quantum_chest" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/uev_quantum_chest" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/uev_quantum_chest" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/uev_quantum_chest", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/uev_quantum_chest", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/uev_quantum_chest", - "y": 180 + "model": "gtceu:block/machine/uev_quantum_chest" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/uev_quantum_chest" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/uev_quantum_chest", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/uev_quantum_chest", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/uev_quantum_chest" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/uev_quantum_chest", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/uev_quantum_chest", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/uev_quantum_chest" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/uev_quantum_chest", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/uev_quantum_chest", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/uev_quantum_chest" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/uev_quantum_chest", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/uev_quantum_chest", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/uev_quantum_chest", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/uev_quantum_chest" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/uev_quantum_tank.json b/src/generated/resources/assets/gtceu/blockstates/uev_quantum_tank.json index 5670df108e4..e6a478cde03 100644 --- a/src/generated/resources/assets/gtceu/blockstates/uev_quantum_tank.json +++ b/src/generated/resources/assets/gtceu/blockstates/uev_quantum_tank.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/uev_quantum_tank" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/uev_quantum_tank", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/uev_quantum_tank", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/uev_quantum_tank" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/uev_quantum_tank", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/uev_quantum_tank", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/uev_quantum_tank" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/uev_quantum_tank", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/uev_quantum_tank", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/uev_quantum_tank", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/uev_quantum_tank" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/uev_quantum_tank" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/uev_quantum_tank" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/uev_quantum_tank" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/uev_quantum_tank" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/uev_quantum_tank" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/uev_quantum_tank" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/uev_quantum_tank", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/uev_quantum_tank", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/uev_quantum_tank", - "y": 180 + "model": "gtceu:block/machine/uev_quantum_tank" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/uev_quantum_tank" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/uev_quantum_tank", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/uev_quantum_tank", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/uev_quantum_tank" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/uev_quantum_tank", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/uev_quantum_tank", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/uev_quantum_tank" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/uev_quantum_tank", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/uev_quantum_tank", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/uev_quantum_tank" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/uev_quantum_tank", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/uev_quantum_tank", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/uev_quantum_tank", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/uev_quantum_tank" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/uhv_quantum_chest.json b/src/generated/resources/assets/gtceu/blockstates/uhv_quantum_chest.json index bd544368abc..bf617c11e93 100644 --- a/src/generated/resources/assets/gtceu/blockstates/uhv_quantum_chest.json +++ b/src/generated/resources/assets/gtceu/blockstates/uhv_quantum_chest.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/uhv_quantum_chest" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/uhv_quantum_chest", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/uhv_quantum_chest", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/uhv_quantum_chest" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/uhv_quantum_chest", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/uhv_quantum_chest", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/uhv_quantum_chest" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/uhv_quantum_chest", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/uhv_quantum_chest", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/uhv_quantum_chest", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/uhv_quantum_chest" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/uhv_quantum_chest" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/uhv_quantum_chest" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/uhv_quantum_chest" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/uhv_quantum_chest" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/uhv_quantum_chest" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/uhv_quantum_chest" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/uhv_quantum_chest", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/uhv_quantum_chest", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/uhv_quantum_chest", - "y": 180 + "model": "gtceu:block/machine/uhv_quantum_chest" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/uhv_quantum_chest" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/uhv_quantum_chest", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/uhv_quantum_chest", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/uhv_quantum_chest" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/uhv_quantum_chest", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/uhv_quantum_chest", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/uhv_quantum_chest" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/uhv_quantum_chest", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/uhv_quantum_chest", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/uhv_quantum_chest" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/uhv_quantum_chest", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/uhv_quantum_chest", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/uhv_quantum_chest", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/uhv_quantum_chest" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/uhv_quantum_tank.json b/src/generated/resources/assets/gtceu/blockstates/uhv_quantum_tank.json index 56ad8997441..be9ce846bdf 100644 --- a/src/generated/resources/assets/gtceu/blockstates/uhv_quantum_tank.json +++ b/src/generated/resources/assets/gtceu/blockstates/uhv_quantum_tank.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/uhv_quantum_tank" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/uhv_quantum_tank", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/uhv_quantum_tank", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/uhv_quantum_tank" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/uhv_quantum_tank", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/uhv_quantum_tank", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/uhv_quantum_tank" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/uhv_quantum_tank", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/uhv_quantum_tank", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/uhv_quantum_tank", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/uhv_quantum_tank" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/uhv_quantum_tank" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/uhv_quantum_tank" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/uhv_quantum_tank" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/uhv_quantum_tank" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/uhv_quantum_tank" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/uhv_quantum_tank" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/uhv_quantum_tank", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/uhv_quantum_tank", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/uhv_quantum_tank", - "y": 180 + "model": "gtceu:block/machine/uhv_quantum_tank" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/uhv_quantum_tank" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/uhv_quantum_tank", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/uhv_quantum_tank", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/uhv_quantum_tank" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/uhv_quantum_tank", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/uhv_quantum_tank", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/uhv_quantum_tank" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/uhv_quantum_tank", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/uhv_quantum_tank", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/uhv_quantum_tank" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/uhv_quantum_tank", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/uhv_quantum_tank", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/uhv_quantum_tank", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/uhv_quantum_tank" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/uiv_quantum_chest.json b/src/generated/resources/assets/gtceu/blockstates/uiv_quantum_chest.json index e03a7115f8a..5147d42cea4 100644 --- a/src/generated/resources/assets/gtceu/blockstates/uiv_quantum_chest.json +++ b/src/generated/resources/assets/gtceu/blockstates/uiv_quantum_chest.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/uiv_quantum_chest" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/uiv_quantum_chest", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/uiv_quantum_chest", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/uiv_quantum_chest" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/uiv_quantum_chest", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/uiv_quantum_chest", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/uiv_quantum_chest" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/uiv_quantum_chest", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/uiv_quantum_chest", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/uiv_quantum_chest", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/uiv_quantum_chest" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/uiv_quantum_chest" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/uiv_quantum_chest" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/uiv_quantum_chest" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/uiv_quantum_chest" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/uiv_quantum_chest" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/uiv_quantum_chest" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/uiv_quantum_chest", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/uiv_quantum_chest", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/uiv_quantum_chest", - "y": 180 + "model": "gtceu:block/machine/uiv_quantum_chest" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/uiv_quantum_chest" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/uiv_quantum_chest", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/uiv_quantum_chest", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/uiv_quantum_chest" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/uiv_quantum_chest", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/uiv_quantum_chest", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/uiv_quantum_chest" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/uiv_quantum_chest", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/uiv_quantum_chest", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/uiv_quantum_chest" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/uiv_quantum_chest", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/uiv_quantum_chest", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/uiv_quantum_chest", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/uiv_quantum_chest" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/uiv_quantum_tank.json b/src/generated/resources/assets/gtceu/blockstates/uiv_quantum_tank.json index 7bf49e99838..ab3cdc06f4f 100644 --- a/src/generated/resources/assets/gtceu/blockstates/uiv_quantum_tank.json +++ b/src/generated/resources/assets/gtceu/blockstates/uiv_quantum_tank.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/uiv_quantum_tank" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/uiv_quantum_tank", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/uiv_quantum_tank", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/uiv_quantum_tank" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/uiv_quantum_tank", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/uiv_quantum_tank", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/uiv_quantum_tank" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/uiv_quantum_tank", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/uiv_quantum_tank", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/uiv_quantum_tank", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/uiv_quantum_tank" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/uiv_quantum_tank" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/uiv_quantum_tank" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/uiv_quantum_tank" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/uiv_quantum_tank" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/uiv_quantum_tank" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/uiv_quantum_tank" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/uiv_quantum_tank", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/uiv_quantum_tank", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/uiv_quantum_tank", - "y": 180 + "model": "gtceu:block/machine/uiv_quantum_tank" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/uiv_quantum_tank" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/uiv_quantum_tank", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/uiv_quantum_tank", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/uiv_quantum_tank" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/uiv_quantum_tank", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/uiv_quantum_tank", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/uiv_quantum_tank" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/uiv_quantum_tank", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/uiv_quantum_tank", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/uiv_quantum_tank" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/uiv_quantum_tank", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/uiv_quantum_tank", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/uiv_quantum_tank", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/uiv_quantum_tank" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/uv_fusion_reactor.json b/src/generated/resources/assets/gtceu/blockstates/uv_fusion_reactor.json index 3c3bc086ce3..7eaac40f80b 100644 --- a/src/generated/resources/assets/gtceu/blockstates/uv_fusion_reactor.json +++ b/src/generated/resources/assets/gtceu/blockstates/uv_fusion_reactor.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/uv_fusion_reactor" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/uv_fusion_reactor", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/uv_fusion_reactor", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/uv_fusion_reactor" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/uv_fusion_reactor", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/uv_fusion_reactor", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/uv_fusion_reactor" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/uv_fusion_reactor", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/uv_fusion_reactor", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/uv_fusion_reactor", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/uv_fusion_reactor" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/uv_fusion_reactor" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/uv_fusion_reactor" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/uv_fusion_reactor" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/uv_fusion_reactor" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/uv_fusion_reactor" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/uv_fusion_reactor" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/uv_fusion_reactor", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/uv_fusion_reactor", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/uv_fusion_reactor", - "y": 180 + "model": "gtceu:block/machine/uv_fusion_reactor" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/uv_fusion_reactor" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/uv_fusion_reactor", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/uv_fusion_reactor", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/uv_fusion_reactor" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/uv_fusion_reactor", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/uv_fusion_reactor", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/uv_fusion_reactor" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/uv_fusion_reactor", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/uv_fusion_reactor", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/uv_fusion_reactor" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/uv_fusion_reactor", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/uv_fusion_reactor", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/uv_fusion_reactor", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/uv_fusion_reactor" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/uv_quantum_chest.json b/src/generated/resources/assets/gtceu/blockstates/uv_quantum_chest.json index 7ea6c8c401f..f54514b9f0c 100644 --- a/src/generated/resources/assets/gtceu/blockstates/uv_quantum_chest.json +++ b/src/generated/resources/assets/gtceu/blockstates/uv_quantum_chest.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/uv_quantum_chest" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/uv_quantum_chest", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/uv_quantum_chest", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/uv_quantum_chest" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/uv_quantum_chest", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/uv_quantum_chest", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/uv_quantum_chest" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/uv_quantum_chest", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/uv_quantum_chest", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/uv_quantum_chest", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/uv_quantum_chest" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/uv_quantum_chest" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/uv_quantum_chest" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/uv_quantum_chest" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/uv_quantum_chest" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/uv_quantum_chest" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/uv_quantum_chest" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/uv_quantum_chest", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/uv_quantum_chest", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/uv_quantum_chest", - "y": 180 + "model": "gtceu:block/machine/uv_quantum_chest" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/uv_quantum_chest" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/uv_quantum_chest", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/uv_quantum_chest", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/uv_quantum_chest" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/uv_quantum_chest", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/uv_quantum_chest", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/uv_quantum_chest" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/uv_quantum_chest", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/uv_quantum_chest", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/uv_quantum_chest" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/uv_quantum_chest", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/uv_quantum_chest", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/uv_quantum_chest", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/uv_quantum_chest" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/uv_quantum_tank.json b/src/generated/resources/assets/gtceu/blockstates/uv_quantum_tank.json index ecb663d3d53..b9230047280 100644 --- a/src/generated/resources/assets/gtceu/blockstates/uv_quantum_tank.json +++ b/src/generated/resources/assets/gtceu/blockstates/uv_quantum_tank.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/uv_quantum_tank" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/uv_quantum_tank", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/uv_quantum_tank", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/uv_quantum_tank" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/uv_quantum_tank", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/uv_quantum_tank", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/uv_quantum_tank" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/uv_quantum_tank", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/uv_quantum_tank", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/uv_quantum_tank", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/uv_quantum_tank" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/uv_quantum_tank" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/uv_quantum_tank" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/uv_quantum_tank" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/uv_quantum_tank" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/uv_quantum_tank" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/uv_quantum_tank" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/uv_quantum_tank", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/uv_quantum_tank", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/uv_quantum_tank", - "y": 180 + "model": "gtceu:block/machine/uv_quantum_tank" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/uv_quantum_tank" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/uv_quantum_tank", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/uv_quantum_tank", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/uv_quantum_tank" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/uv_quantum_tank", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/uv_quantum_tank", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/uv_quantum_tank" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/uv_quantum_tank", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/uv_quantum_tank", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/uv_quantum_tank" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/uv_quantum_tank", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/uv_quantum_tank", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/uv_quantum_tank", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/uv_quantum_tank" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/uxv_quantum_chest.json b/src/generated/resources/assets/gtceu/blockstates/uxv_quantum_chest.json index 1b6d98bcc86..980f8f1cad7 100644 --- a/src/generated/resources/assets/gtceu/blockstates/uxv_quantum_chest.json +++ b/src/generated/resources/assets/gtceu/blockstates/uxv_quantum_chest.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/uxv_quantum_chest" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/uxv_quantum_chest", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/uxv_quantum_chest", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/uxv_quantum_chest" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/uxv_quantum_chest", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/uxv_quantum_chest", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/uxv_quantum_chest" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/uxv_quantum_chest", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/uxv_quantum_chest", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/uxv_quantum_chest", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/uxv_quantum_chest" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/uxv_quantum_chest" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/uxv_quantum_chest" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/uxv_quantum_chest" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/uxv_quantum_chest" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/uxv_quantum_chest" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/uxv_quantum_chest" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/uxv_quantum_chest", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/uxv_quantum_chest", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/uxv_quantum_chest", - "y": 180 + "model": "gtceu:block/machine/uxv_quantum_chest" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/uxv_quantum_chest" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/uxv_quantum_chest", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/uxv_quantum_chest", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/uxv_quantum_chest" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/uxv_quantum_chest", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/uxv_quantum_chest", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/uxv_quantum_chest" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/uxv_quantum_chest", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/uxv_quantum_chest", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/uxv_quantum_chest" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/uxv_quantum_chest", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/uxv_quantum_chest", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/uxv_quantum_chest", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/uxv_quantum_chest" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/uxv_quantum_tank.json b/src/generated/resources/assets/gtceu/blockstates/uxv_quantum_tank.json index db88fff044a..ad1c93d228d 100644 --- a/src/generated/resources/assets/gtceu/blockstates/uxv_quantum_tank.json +++ b/src/generated/resources/assets/gtceu/blockstates/uxv_quantum_tank.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/uxv_quantum_tank" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/uxv_quantum_tank", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/uxv_quantum_tank", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/uxv_quantum_tank" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/uxv_quantum_tank", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/uxv_quantum_tank", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/uxv_quantum_tank" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/uxv_quantum_tank", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/uxv_quantum_tank", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/uxv_quantum_tank", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/uxv_quantum_tank" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/uxv_quantum_tank" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/uxv_quantum_tank" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/uxv_quantum_tank" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/uxv_quantum_tank" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/uxv_quantum_tank" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/uxv_quantum_tank" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/uxv_quantum_tank", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/uxv_quantum_tank", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/uxv_quantum_tank", - "y": 180 + "model": "gtceu:block/machine/uxv_quantum_tank" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/uxv_quantum_tank" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/uxv_quantum_tank", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/uxv_quantum_tank", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/uxv_quantum_tank" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/uxv_quantum_tank", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/uxv_quantum_tank", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/uxv_quantum_tank" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/uxv_quantum_tank", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/uxv_quantum_tank", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/uxv_quantum_tank" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/uxv_quantum_tank", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/uxv_quantum_tank", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/uxv_quantum_tank", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/uxv_quantum_tank" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/vacuum_freezer.json b/src/generated/resources/assets/gtceu/blockstates/vacuum_freezer.json index 19a856aeb86..81c446eb559 100644 --- a/src/generated/resources/assets/gtceu/blockstates/vacuum_freezer.json +++ b/src/generated/resources/assets/gtceu/blockstates/vacuum_freezer.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/vacuum_freezer" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/vacuum_freezer", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/vacuum_freezer", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/vacuum_freezer" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/vacuum_freezer", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/vacuum_freezer", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/vacuum_freezer" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/vacuum_freezer", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/vacuum_freezer", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/vacuum_freezer", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/vacuum_freezer" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/vacuum_freezer" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/vacuum_freezer" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/vacuum_freezer" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/vacuum_freezer" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/vacuum_freezer" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/vacuum_freezer" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/vacuum_freezer", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/vacuum_freezer", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/vacuum_freezer", - "y": 180 + "model": "gtceu:block/machine/vacuum_freezer" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/vacuum_freezer" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/vacuum_freezer", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/vacuum_freezer", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/vacuum_freezer" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/vacuum_freezer", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/vacuum_freezer", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/vacuum_freezer" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/vacuum_freezer", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/vacuum_freezer", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/vacuum_freezer" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/vacuum_freezer", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/vacuum_freezer", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/vacuum_freezer", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/vacuum_freezer" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/wooden_multiblock_tank.json b/src/generated/resources/assets/gtceu/blockstates/wooden_multiblock_tank.json index 10ed37aa4e2..45d9c22eec0 100644 --- a/src/generated/resources/assets/gtceu/blockstates/wooden_multiblock_tank.json +++ b/src/generated/resources/assets/gtceu/blockstates/wooden_multiblock_tank.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/wooden_multiblock_tank" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/wooden_multiblock_tank", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/wooden_multiblock_tank", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/wooden_multiblock_tank" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/wooden_multiblock_tank", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/wooden_multiblock_tank", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/wooden_multiblock_tank" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/wooden_multiblock_tank", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/wooden_multiblock_tank", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/wooden_multiblock_tank", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/wooden_multiblock_tank" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/wooden_multiblock_tank" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/wooden_multiblock_tank" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/wooden_multiblock_tank" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/wooden_multiblock_tank" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/wooden_multiblock_tank" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/wooden_multiblock_tank" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/wooden_multiblock_tank", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/wooden_multiblock_tank", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/wooden_multiblock_tank", - "y": 180 + "model": "gtceu:block/machine/wooden_multiblock_tank" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/wooden_multiblock_tank" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/wooden_multiblock_tank", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/wooden_multiblock_tank", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/wooden_multiblock_tank" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/wooden_multiblock_tank", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/wooden_multiblock_tank", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/wooden_multiblock_tank" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/wooden_multiblock_tank", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/wooden_multiblock_tank", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/wooden_multiblock_tank" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/wooden_multiblock_tank", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/wooden_multiblock_tank", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/wooden_multiblock_tank", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/wooden_multiblock_tank" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/zpm_fusion_reactor.json b/src/generated/resources/assets/gtceu/blockstates/zpm_fusion_reactor.json index a4b56a54f0d..ded246cc6b2 100644 --- a/src/generated/resources/assets/gtceu/blockstates/zpm_fusion_reactor.json +++ b/src/generated/resources/assets/gtceu/blockstates/zpm_fusion_reactor.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/zpm_fusion_reactor" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/zpm_fusion_reactor", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/zpm_fusion_reactor", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/zpm_fusion_reactor" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/zpm_fusion_reactor", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/zpm_fusion_reactor", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/zpm_fusion_reactor" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/zpm_fusion_reactor", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/zpm_fusion_reactor", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/zpm_fusion_reactor", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/zpm_fusion_reactor" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/zpm_fusion_reactor" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/zpm_fusion_reactor" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/zpm_fusion_reactor" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/zpm_fusion_reactor" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/zpm_fusion_reactor" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/zpm_fusion_reactor" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/zpm_fusion_reactor", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/zpm_fusion_reactor", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/zpm_fusion_reactor", - "y": 180 + "model": "gtceu:block/machine/zpm_fusion_reactor" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/zpm_fusion_reactor" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/zpm_fusion_reactor", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/zpm_fusion_reactor", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/zpm_fusion_reactor" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/zpm_fusion_reactor", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/zpm_fusion_reactor", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/zpm_fusion_reactor" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/zpm_fusion_reactor", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/zpm_fusion_reactor", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/zpm_fusion_reactor" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/zpm_fusion_reactor", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/zpm_fusion_reactor", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/zpm_fusion_reactor", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/zpm_fusion_reactor" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/zpm_quantum_chest.json b/src/generated/resources/assets/gtceu/blockstates/zpm_quantum_chest.json index 1203273aa37..f0cb84ed560 100644 --- a/src/generated/resources/assets/gtceu/blockstates/zpm_quantum_chest.json +++ b/src/generated/resources/assets/gtceu/blockstates/zpm_quantum_chest.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/zpm_quantum_chest" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/zpm_quantum_chest", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/zpm_quantum_chest", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/zpm_quantum_chest" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/zpm_quantum_chest", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/zpm_quantum_chest", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/zpm_quantum_chest" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/zpm_quantum_chest", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/zpm_quantum_chest", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/zpm_quantum_chest", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/zpm_quantum_chest" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/zpm_quantum_chest" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/zpm_quantum_chest" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/zpm_quantum_chest" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/zpm_quantum_chest" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/zpm_quantum_chest" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/zpm_quantum_chest" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/zpm_quantum_chest", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/zpm_quantum_chest", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/zpm_quantum_chest", - "y": 180 + "model": "gtceu:block/machine/zpm_quantum_chest" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/zpm_quantum_chest" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/zpm_quantum_chest", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/zpm_quantum_chest", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/zpm_quantum_chest" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/zpm_quantum_chest", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/zpm_quantum_chest", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/zpm_quantum_chest" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/zpm_quantum_chest", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/zpm_quantum_chest", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/zpm_quantum_chest" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/zpm_quantum_chest", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/zpm_quantum_chest", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/zpm_quantum_chest", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/zpm_quantum_chest" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/zpm_quantum_tank.json b/src/generated/resources/assets/gtceu/blockstates/zpm_quantum_tank.json index e31f2d56af0..d47d4cbb216 100644 --- a/src/generated/resources/assets/gtceu/blockstates/zpm_quantum_tank.json +++ b/src/generated/resources/assets/gtceu/blockstates/zpm_quantum_tank.json @@ -1,5 +1,8 @@ { "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/zpm_quantum_tank" + }, "facing=down,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/zpm_quantum_tank", @@ -14,56 +17,77 @@ "model": "gtceu:block/machine/zpm_quantum_tank", "x": 90 }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/zpm_quantum_tank" + }, "facing=down,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/zpm_quantum_tank", "x": 90 }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/zpm_quantum_tank", "y": 90 }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/zpm_quantum_tank" + }, "facing=east,upwards_facing=north": { + "gtceu:z": 270, "model": "gtceu:block/machine/zpm_quantum_tank", "y": 90 }, "facing=east,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 90, "model": "gtceu:block/machine/zpm_quantum_tank", "y": 90 }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, + "facing=east,upwards_facing=up": { "model": "gtceu:block/machine/zpm_quantum_tank", "y": 90 }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/zpm_quantum_tank" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/zpm_quantum_tank" + }, "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "gtceu:z": 90, "model": "gtceu:block/machine/zpm_quantum_tank" }, "facing=north,upwards_facing=north": { "model": "gtceu:block/machine/zpm_quantum_tank" }, "facing=north,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/zpm_quantum_tank" + }, + "facing=north,upwards_facing=up": { "model": "gtceu:block/machine/zpm_quantum_tank" }, "facing=north,upwards_facing=west": { - "gtceu:z": 90, + "gtceu:z": 270, "model": "gtceu:block/machine/zpm_quantum_tank" }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/zpm_quantum_tank", + "y": 180 + }, "facing=south,upwards_facing=east": { "gtceu:z": 270, "model": "gtceu:block/machine/zpm_quantum_tank", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "gtceu:block/machine/zpm_quantum_tank", - "y": 180 + "model": "gtceu:block/machine/zpm_quantum_tank" }, "facing=south,upwards_facing=south": { - "gtceu:z": 180, + "model": "gtceu:block/machine/zpm_quantum_tank" + }, + "facing=south,upwards_facing=up": { "model": "gtceu:block/machine/zpm_quantum_tank", "y": 180 }, @@ -72,6 +96,9 @@ "model": "gtceu:block/machine/zpm_quantum_tank", "y": 180 }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/zpm_quantum_tank" + }, "facing=up,upwards_facing=east": { "gtceu:z": 90, "model": "gtceu:block/machine/zpm_quantum_tank", @@ -86,29 +113,38 @@ "model": "gtceu:block/machine/zpm_quantum_tank", "x": 270 }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/zpm_quantum_tank" + }, "facing=up,upwards_facing=west": { "gtceu:z": 270, "model": "gtceu:block/machine/zpm_quantum_tank", "x": 270 }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, "model": "gtceu:block/machine/zpm_quantum_tank", "y": 270 }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/zpm_quantum_tank" + }, "facing=west,upwards_facing=north": { + "gtceu:z": 90, "model": "gtceu:block/machine/zpm_quantum_tank", "y": 270 }, "facing=west,upwards_facing=south": { - "gtceu:z": 180, + "gtceu:z": 270, "model": "gtceu:block/machine/zpm_quantum_tank", "y": 270 }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west,upwards_facing=up": { "model": "gtceu:block/machine/zpm_quantum_tank", "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/zpm_quantum_tank" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index d9a2d33eaee..9d9f564afae 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -237,6 +237,7 @@ "block.gtceu.creative_tank": "Creative Tank", "block.gtceu.creosote": "Creosote", "block.gtceu.crushing_wheels": "Crushing Wheels", + "block.gtceu.ctm_test": "Connected Texture Test Block", "block.gtceu.cupronickel_coil_block": "Cupronickel Coil Block", "block.gtceu.cyan_borderless_lamp": "Cyan Borderless Lamp", "block.gtceu.cyan_lamp": "Cyan Lamp", @@ -1183,6 +1184,7 @@ "block.gtceu.substation_capacitor.tooltip.filled": "§cEnergy Capacity: §f%d EU", "block.gtceu.superconducting_coil": "Superconducting Coil Block", "block.gtceu.tempered_glass": "Tempered Glass", + "block.gtceu.test_mui": "Test Mui", "block.gtceu.the_end_marker": "The End", "block.gtceu.the_nether_marker": "The Nether", "block.gtceu.titanium_crate": "Titanium Crate", @@ -1770,12 +1772,6 @@ "block.gtceu.zpm_wiremill": "§cElite Wiremill III§r", "block.gtceu.zpm_world_accelerator": "§cElite World Accelerator III§r", "block.surface_rock": "%s Surface Rock", - "button.gtceu.bedrock_fluids": "Show Bedrock Fluid Veins", - "button.gtceu.hide_depleted": "Hide Depleted Veins", - "button.gtceu.mark_as_depleted.name": "Mark as Depleted", - "button.gtceu.ore_veins": "Show GT Ore Veins", - "button.gtceu.show_depleted": "Show Depleted Veins", - "button.gtceu.toggle_waypoint.name": "Toggle Waypoint", "command.gtceu.cape.give.failed": "No new capes were unlocked", "command.gtceu.cape.give.success.multiple": "Unlocked %s capes for %s players", "command.gtceu.cape.give.success.single": "Unlocked %s capes for %s", @@ -1817,9 +1813,12 @@ "config.gtceu.option.arcRecyclingYield": "arcRecyclingYield", "config.gtceu.option.armorHud": "armorHud", "config.gtceu.option.autoRebuildResources": "autoRebuildResources", + "config.gtceu.option.baseBrightness": "baseBrightness", "config.gtceu.option.batchDuration": "batchDuration", "config.gtceu.option.bedrockOreDistance": "bedrockOreDistance", "config.gtceu.option.bedrockOreDropTagPrefix": "bedrockOreDropTagPrefix", + "config.gtceu.option.bloom": "bloom", + "config.gtceu.option.bloomType.load_error": "Could not load shaders for the bloom effect, see %s for details", "config.gtceu.option.borderColor": "borderColor", "config.gtceu.option.bronzeBoilerHeatSpeed": "bronzeBoilerHeatSpeed", "config.gtceu.option.bronzeBoilerMaxTemperature": "bronzeBoilerMaxTemperature", @@ -1845,6 +1844,7 @@ "config.gtceu.option.drum": "drum", "config.gtceu.option.dumpAssets": "dumpAssets", "config.gtceu.option.dumpRecipes": "dumpRecipes", + "config.gtceu.option.emissiveTexturesHaveBloom": "emissiveTexturesHaveBloom", "config.gtceu.option.enableArcRecycling": "enableArcRecycling", "config.gtceu.option.enableCleanroom": "enableCleanroom", "config.gtceu.option.enableExtractorRecycling": "enableExtractorRecycling", @@ -1860,6 +1860,7 @@ "config.gtceu.option.energyUsageMultiplier": "energyUsageMultiplier", "config.gtceu.option.environmentalHazardDecayRate": "environmentalHazardDecayRate", "config.gtceu.option.environmentalHazards": "environmentalHazards", + "config.gtceu.option.escRestoresLastText": "escRestoresLastText", "config.gtceu.option.euToFeRatio": "euToFeRatio", "config.gtceu.option.extractorRecyclingYield": "extractorRecyclingYield", "config.gtceu.option.feToEuRatio": "feToEuRatio", @@ -1908,7 +1909,9 @@ "config.gtceu.option.machinesEmissiveTextures": "machinesEmissiveTextures", "config.gtceu.option.machinesHaveBERsByDefault": "machinesHaveBERsByDefault", "config.gtceu.option.maintenanceCheckRate": "maintenanceCheckRate", + "config.gtceu.option.maxBrightness": "maxBrightness", "config.gtceu.option.meHatchEnergyUsage": "meHatchEnergyUsage", + "config.gtceu.option.minBrightness": "minBrightness", "config.gtceu.option.minerSpeed": "minerSpeed", "config.gtceu.option.minimap": "minimap", "config.gtceu.option.nanoSaber": "nanoSaber", @@ -1944,6 +1947,7 @@ "config.gtceu.option.renderGrowingPlants": "renderGrowingPlants", "config.gtceu.option.renderer": "renderer", "config.gtceu.option.replaceMinedBlocksWith": "replaceMinedBlocksWith", + "config.gtceu.option.replaceVanillaTooltips": "replaceVanillaTooltips", "config.gtceu.option.replaceWithCobbleVersion": "replaceWithCobbleVersion", "config.gtceu.option.requireGTToolsForBlocks": "requireGTToolsForBlocks", "config.gtceu.option.rngDamageElectricTools": "rngDamageElectricTools", @@ -1952,6 +1956,7 @@ "config.gtceu.option.shouldWeatherOrTerrainExplosion": "shouldWeatherOrTerrainExplosion", "config.gtceu.option.showDimensionTier": "showDimensionTier", "config.gtceu.option.smallBoilers": "smallBoilers", + "config.gtceu.option.smoothProgressBar": "smoothProgressBar", "config.gtceu.option.solarBoilerBaseOutput": "solarBoilerBaseOutput", "config.gtceu.option.solidBoilerBaseOutput": "solidBoilerBaseOutput", "config.gtceu.option.sprayCanChainLength": "sprayCanChainLength", @@ -1960,6 +1965,8 @@ "config.gtceu.option.steelBoilerHeatSpeed": "steelBoilerHeatSpeed", "config.gtceu.option.steelBoilerMaxTemperature": "steelBoilerMaxTemperature", "config.gtceu.option.steelSteamMultiblocks": "steelSteamMultiblocks", + "config.gtceu.option.step": "step", + "config.gtceu.option.strength": "strength", "config.gtceu.option.surfaceRockProspectRange": "surfaceRockProspectRange", "config.gtceu.option.tankItemFluidPreview": "tankItemFluidPreview", "config.gtceu.option.temperaturesInCelsius": "temperaturesInCelsius", @@ -1969,11 +1976,15 @@ "config.gtceu.option.toolCraftingSounds": "toolCraftingSounds", "config.gtceu.option.toolUseSounds": "toolUseSounds", "config.gtceu.option.tools": "tools", + "config.gtceu.option.tooltipPos": "tooltipPos", "config.gtceu.option.treeFellingDelay": "treeFellingDelay", "config.gtceu.option.tungstensteelBoilerHeatSpeed": "tungstensteelBoilerHeatSpeed", "config.gtceu.option.tungstensteelBoilerMaxTemperature": "tungstensteelBoilerMaxTemperature", + "config.gtceu.option.type": "type", + "config.gtceu.option.ui": "ui", "config.gtceu.option.universalHazards": "universalHazards", "config.gtceu.option.updateIntervals": "updateIntervals", + "config.gtceu.option.useDarkThemeByDefault": "useDarkThemeByDefault", "config.gtceu.option.useVBO": "useVBO", "config.gtceu.option.voltageTierAdvImpeller": "voltageTierAdvImpeller", "config.gtceu.option.voltageTierAdvNanoSuit": "voltageTierAdvNanoSuit", @@ -2270,7 +2281,6 @@ "fluid.gtceu.molten": "Molten %s", "fluid.gtceu.plasma": "%s Plasma", "fluid.gtceu.potion": "Potion", - "fluid.spawnlocation.name": "Fluid Vein Information", "fluid.tile.lava": "Lava", "fluid.tile.water": "Water", "fluid_cell.empty": "Empty", @@ -2450,114 +2460,6 @@ "gtceu.item_filter.empty_item": "Empty (No Item)", "gtceu.item_filter.footer": "§eClick with item to override", "gtceu.item_list.item_stored": "§7Stored: %d", - "gtceu.jade.amperage_use": "%s A", - "gtceu.jade.at": " @ ", - "gtceu.jade.changes_eu_sec": "%s EU/s", - "gtceu.jade.cleaned_this_second": "Cleaned hazard: %s/s", - "gtceu.jade.days": "%s days", - "gtceu.jade.energy_stored": "%d / %d EU", - "gtceu.jade.fluid_use": "%s mB/t", - "gtceu.jade.hours": "%s hours", - "gtceu.jade.minutes": "%s minutes", - "gtceu.jade.progress_computation": "%s / %s CWU", - "gtceu.jade.progress_sec": "%s / %s s", - "gtceu.jade.progress_tick": "%s / %s t", - "gtceu.jade.remaining_charge_time": "Until charged: %s", - "gtceu.jade.remaining_discharge_time": "Until empty: %s", - "gtceu.jade.seconds": "%s seconds", - "gtceu.jade.years": "%s years", - "gtceu.jei.bedrock_fluid.heavy_oil_deposit": "Heavy Oil Deposit", - "gtceu.jei.bedrock_fluid.lava_deposit": "Lava Deposit", - "gtceu.jei.bedrock_fluid.light_oil_deposit": "Light Oil Deposit", - "gtceu.jei.bedrock_fluid.natural_gas_deposit": "Natural Gas Deposit", - "gtceu.jei.bedrock_fluid.nether_natural_gas_deposit": "Nether Natural Gas Deposit", - "gtceu.jei.bedrock_fluid.oil_deposit": "Oil Deposit", - "gtceu.jei.bedrock_fluid.raw_oil_deposit": "Raw Oil Deposit", - "gtceu.jei.bedrock_fluid.salt_water_deposit": "Salt Water Deposit", - "gtceu.jei.bedrock_fluid_diagram": "Bedrock Fluid Diagram", - "gtceu.jei.bedrock_ore_diagram": "Bedrock Ore Diagram", - "gtceu.jei.fluid.dep_amount_hover": "The amount the vein will be depleted by", - "gtceu.jei.fluid.dep_chance_hover": "The percentage chance for the vein to be depleted upon harvest", - "gtceu.jei.fluid.dep_yield_hover": "The maximum yield of the vein when it is fully depleted", - "gtceu.jei.fluid.depleted_rate": "Depleted Yield: %d", - "gtceu.jei.fluid.depletion_amount": "Depletion Amount: %d", - "gtceu.jei.fluid.depletion_chance": "Depletion Chance: %d%%", - "gtceu.jei.fluid.dimension": "Dimensions:", - "gtceu.jei.fluid.max_hover": "The maximum yield that any fluid vein of this fluid can have", - "gtceu.jei.fluid.max_yield": "Maximum Yield: %d", - "gtceu.jei.fluid.min_hover": "The minimum yield that any fluid vein of this fluid can have", - "gtceu.jei.fluid.min_yield": "Minimum Yield: %d", - "gtceu.jei.fluid.vein_weight": "Vein Weight: %d", - "gtceu.jei.fluid.weight_hover": "The Weight of the vein. Hover over the fluid to see any possible biome modifications", - "gtceu.jei.materials.average_mass": "Average mass: %d", - "gtceu.jei.materials.average_neutrons": "Average neutrons: %d", - "gtceu.jei.materials.average_protons": "Average protons: %d", - "gtceu.jei.multiblock_info": "Multiblock Info", - "gtceu.jei.ore.between.0": "Between Ore", - "gtceu.jei.ore.between.1": "Spawns in the middle %d layers of the vein, with other ores", - "gtceu.jei.ore.biome_weighting": "§d%s Weight: §3%d", - "gtceu.jei.ore.biome_weighting_no_spawn": "§d%s Weight: §cCannot Spawn", - "gtceu.jei.ore.biome_weighting_title": "§dModified Biome Total Weights:", - "gtceu.jei.ore.ore_weight": "Weight in vein: %d%%", - "gtceu.jei.ore.primary.0": "Top Ore", - "gtceu.jei.ore.primary.1": "Spawns in the top %d layers of the vein", - "gtceu.jei.ore.secondary.0": "Bottom Ore", - "gtceu.jei.ore.secondary.1": "Spawns in the bottom %d layers of the vein", - "gtceu.jei.ore.sporadic.0": "Sporadic Ore", - "gtceu.jei.ore.sporadic.1": "Spawns anywhere in the vein", - "gtceu.jei.ore.surface_rock.0": "Surface Rocks with this material denote vein spawn locations.", - "gtceu.jei.ore.surface_rock.1": "They can be broken for 3 Tiny Piles of the dust, with Fortune giving a bonus.", - "gtceu.jei.ore_processing_diagram": "Ore Processing Diagram", - "gtceu.jei.ore_vein.apatite_vein": "Apatite Vein", - "gtceu.jei.ore_vein.banded_iron_vein": "Banded Iron Vein", - "gtceu.jei.ore_vein.bauxite_vein_end": "Bauxite Vein End", - "gtceu.jei.ore_vein.beryllium_vein": "Beryllium Vein", - "gtceu.jei.ore_vein.cassiterite_vein": "Cassiterite Vein", - "gtceu.jei.ore_vein.certus_quartz": "Certus Quartz", - "gtceu.jei.ore_vein.coal_vein": "Coal Vein", - "gtceu.jei.ore_vein.copper_tin_vein": "Copper Tin Vein", - "gtceu.jei.ore_vein.copper_vein": "Copper Vein", - "gtceu.jei.ore_vein.diamond_vein": "Diamond Vein", - "gtceu.jei.ore_vein.galena_vein": "Galena Vein", - "gtceu.jei.ore_vein.garnet_tin_vein": "Garnet Tin Vein", - "gtceu.jei.ore_vein.garnet_vein": "Garnet Vein", - "gtceu.jei.ore_vein.iron_vein": "Iron Vein", - "gtceu.jei.ore_vein.lapis_vein": "Lapis Vein", - "gtceu.jei.ore_vein.lubricant_vein": "Lubricant Vein", - "gtceu.jei.ore_vein.magnetite_vein_end": "Magnetite Vein End", - "gtceu.jei.ore_vein.magnetite_vein_ow": "Magnetite Vein Ow", - "gtceu.jei.ore_vein.manganese_vein": "Manganese Vein", - "gtceu.jei.ore_vein.manganese_vein_ow": "Manganese Vein Ow", - "gtceu.jei.ore_vein.mica_vein": "Mica Vein", - "gtceu.jei.ore_vein.mineral_sand_vein": "Mineral Sand Vein", - "gtceu.jei.ore_vein.molybdenum_vein": "Molybdenum Vein", - "gtceu.jei.ore_vein.monazite_vein": "Monazite Vein", - "gtceu.jei.ore_vein.naquadah_vein": "Naquadah Vein", - "gtceu.jei.ore_vein.nether_quartz_vein": "Nether Quartz Vein", - "gtceu.jei.ore_vein.nickel_vein": "Nickel Vein", - "gtceu.jei.ore_vein.oilsands_vein": "Oilsands Vein", - "gtceu.jei.ore_vein.olivine_vein": "Olivine Vein", - "gtceu.jei.ore_vein.pitchblende_vein_end": "Pitchblende Vein End", - "gtceu.jei.ore_vein.redstone_vein": "Redstone Vein", - "gtceu.jei.ore_vein.redstone_vein_ow": "Redstone Vein Ow", - "gtceu.jei.ore_vein.saltpeter_vein": "Saltpeter Vein", - "gtceu.jei.ore_vein.salts_vein": "Salts Vein", - "gtceu.jei.ore_vein.sapphire_vein": "Sapphire Vein", - "gtceu.jei.ore_vein.scheelite_vein": "Scheelite Vein", - "gtceu.jei.ore_vein.sheldonite_vein": "Sheldonite Vein", - "gtceu.jei.ore_vein.sulfur_vein": "Sulfur Vein", - "gtceu.jei.ore_vein.tetrahedrite_vein": "Tetrahedrite Vein", - "gtceu.jei.ore_vein.topaz_vein": "Topaz Vein", - "gtceu.jei.ore_vein_diagram": "Ore Vein Diagram", - "gtceu.jei.ore_vein_diagram.chance": "§eChance: %s§r", - "gtceu.jei.ore_vein_diagram.dimensions": "Dimensions:", - "gtceu.jei.ore_vein_diagram.spawn_range": "Spawn Range:", - "gtceu.jei.ore_vein_diagram.weight": "Weight: %s", - "gtceu.jei.programmed_circuit": "Programmed Circuit Page", - "gtceu.journeymap.options.layers": "Prospection layers", - "gtceu.journeymap.options.layers.bedrock_fluids": "Show Bedrock Fluid Veins", - "gtceu.journeymap.options.layers.hide_depleted": "Hide Depleted Veins", - "gtceu.journeymap.options.layers.ore_veins": "Show Ore Veins", "gtceu.machine.active_transformer.tooltip.0": "§7Transformers: Lasers in Disguise", "gtceu.machine.active_transformer.tooltip.1": "§7Can combine any number of Energy §fInputs§7 into any number of Energy §fOutputs§7.", "gtceu.machine.active_transformer.tooltip.2": "§7Can transmit power at incredible distance with", @@ -2641,8 +2543,8 @@ "gtceu.machine.hpca.heat_sink_component.tooltip": "Free cooling! Is anything free?", "gtceu.machine.item_bus.export.tooltip": "Item Output for Multiblocks", "gtceu.machine.item_bus.import.tooltip": "Item Input for Multiblocks", - "gtceu.machine.large_combustion_engine.tooltip.boost_extreme": "Supply §f80 mB/s§7 of Liquid Oxygen to produce up to §f%s EU/t§7 at §f2x§7 fuel consumption.", - "gtceu.machine.large_combustion_engine.tooltip.boost_regular": "Supply §f20 mB/s§7 of Oxygen to produce up to §f%s EU/t§7 at §f2x§7 fuel consumption.", + "gtceu.machine.large_combustion_engine.tooltip.boost_extreme": "Supply §f80 mB/s§7 of §9Liquid Oxygen§7 to produce up to §f%s EU/t§7 at §f2x§7 fuel consumption.", + "gtceu.machine.large_combustion_engine.tooltip.boost_regular": "Supply §f20 mB/s§7 of §bOxygen§7 to produce up to §f%s EU/t§7 at §f2x§7 fuel consumption.", "gtceu.machine.laser_hatch.both.tooltip": "§cLaser Cables must be in a straight line!§7", "gtceu.machine.laser_hatch.source.tooltip": "§7Transmitting power at distance", "gtceu.machine.laser_hatch.target.tooltip": "§7Receiving power from distance", @@ -2683,17 +2585,14 @@ "gtceu.machine.me_import_item_hatch.configs.tooltip": "Keeps 16 item types in stock", "gtceu.machine.miner.chunkradius": "Chunk Radius: %d", "gtceu.machine.miner.fluid_usage": "Uses §f%d mB/t §7of §f%s§7, doubled per overclock.", - "gtceu.machine.miner.minex": "mX: %d", - "gtceu.machine.miner.miney": "mY: %d", - "gtceu.machine.miner.minez": "mZ: %d", "gtceu.machine.miner.multi.description": "A multiblock mining machine that covers a large area and produces huge quantity of ore.", "gtceu.machine.miner.multi.modes": "Has Silk Touch and Chunk Aligned Modes.", "gtceu.machine.miner.multi.production": "Produces §f3x§7 more crushed ore than a §fMacerator§7.", "gtceu.machine.miner.progress": "Progress: %d/%d", "gtceu.machine.miner.radius": "Radius: %d", - "gtceu.machine.miner.startx": "sX: %d", - "gtceu.machine.miner.starty": "sY: %d", - "gtceu.machine.miner.startz": "sZ: %d", + "gtceu.machine.miner.x": "sX: %d, mX: %d", + "gtceu.machine.miner.y": "sY: %d, mY: %d", + "gtceu.machine.miner.z": "sZ: %d, mZ: %d", "gtceu.machine.muffler_hatch.tooltip.0": "Recovers waste from machines", "gtceu.machine.muffler_hatch.tooltip.1": "DO NOT OBSTRUCT THE OUTPUT!", "gtceu.machine.multiblock.tank.tooltip": "Fill and drain through the controller or tank valves.", @@ -3019,8 +2918,14 @@ "gtceu.recipe_logic.insufficient_out": "Insufficient Outputs", "gtceu.recipe_logic.no_capabilities": "Machine has no Capabilities", "gtceu.recipe_logic.no_contents": "Recipe has no Contents", + "gtceu.recipe_logic.recipe_waiting": "Recipe Waiting: ", + "gtceu.recipe_logic.setup_fail": "Fail to setup recipe: ", "gtceu.recipe_memory_widget.tooltip.0": "§7Left click to automatically input this recipe into the crafting grid", "gtceu.recipe_memory_widget.tooltip.1": "§7Shift click to lock/unlock this recipe", + "gtceu.recipe_modifier.coil_temperature_too_low": "Coil Temperature Too Low", + "gtceu.recipe_modifier.default_fail": "Recipe Modifier Fail", + "gtceu.recipe_modifier.insufficient_eu_to_start_fusion": "Insufficient Energy to Initiate Fusion Reaction", + "gtceu.recipe_modifier.insufficient_voltage": "Voltage Tier Too Low", "gtceu.recipe_type.show_recipes": "Show Recipes", "gtceu.rei.group.potion_fluids": "Potion Fluids", "gtceu.scanner.copy_stick_empty": "§oEmpty Stick", @@ -3034,58 +2939,6 @@ "gtceu.tooltip.status.trinary.true": "True", "gtceu.tooltip.status.trinary.unknown": "Unknown", "gtceu.tooltip.tool_fluid_hold_shift": "§7Hold SHIFT to show Fluid Containment and Tool Info", - "gtceu.top.allow_output_input": "Allow Input", - "gtceu.top.auto_output": "Auto Output", - "gtceu.top.buffer_bound_pos": "Bound To - X: %s, Y: %s, Z: %s", - "gtceu.top.buffer_not_bound": "Buffer Not Currently Bound", - "gtceu.top.cable_amperage": "Amperage: ", - "gtceu.top.cable_voltage": "Voltage: ", - "gtceu.top.convert_eu": "Converting §eEU§r -> §cFE§r", - "gtceu.top.convert_fe": "Converting §cFE§r -> §eEU§r", - "gtceu.top.energy_consumption": "Using", - "gtceu.top.energy_production": "Producing", - "gtceu.top.energy_stored": " / %d EU", - "gtceu.top.exhaust_vent_blocked": "Blocked", - "gtceu.top.exhaust_vent_direction": "Exhaust Vent: %s", - "gtceu.top.filter.label": "Filter:", - "gtceu.top.fluid_auto_output": "Fluid Output: %s", - "gtceu.top.fuel_min_consume": "Needs", - "gtceu.top.fuel_none": "No fuel", - "gtceu.top.invalid_structure": "Structure Incomplete", - "gtceu.top.item_auto_output": "Item Output: %s", - "gtceu.top.ldp_endpoint.io_type": "IO Type: %s", - "gtceu.top.ldp_endpoint.is_formed": "§aPipeline Formed§r", - "gtceu.top.ldp_endpoint.not_formed": "§cPipeline Incomplete§r", - "gtceu.top.ldp_endpoint.output_direction": "Output Direction: %s", - "gtceu.top.link_cover.color": "Color:", - "gtceu.top.machine_mode": "Machine Mode: ", - "gtceu.top.maintenance.crowbar": "That doesn't belong there", - "gtceu.top.maintenance.hard_hammer": "Plating is dented", - "gtceu.top.maintenance.screwdriver": "Screws are loose", - "gtceu.top.maintenance.soft_mallet": "Something is stuck", - "gtceu.top.maintenance.wire_cutter": "Wires burned out", - "gtceu.top.maintenance.wrench": "Pipe is loose", - "gtceu.top.maintenance_broken": "Needs Maintenance", - "gtceu.top.maintenance_fixed": "Maintenance Fine", - "gtceu.top.mode.export": "Exporting", - "gtceu.top.mode.import": "Importing", - "gtceu.top.obstructed_structure": "Structure Obstructed", - "gtceu.top.primitive_pump_production": "Production: %s mB/s", - "gtceu.top.progress_computation": " / %s CWU", - "gtceu.top.progress_sec": " / %s s", - "gtceu.top.progress_tick": " / %s t", - "gtceu.top.proxies_bound": "Buffer Proxies Bound: %s", - "gtceu.top.recipe_output": "Recipe Outputs:", - "gtceu.top.stained": "Colored: %s", - "gtceu.top.transform_down": "§aStep Down§r %s", - "gtceu.top.transform_input": "§6Input:§r %s", - "gtceu.top.transform_output": "§9Output:§r %s", - "gtceu.top.transform_up": "§cStep Up§r %s", - "gtceu.top.unit.fluid_buckets": "kL", - "gtceu.top.unit.fluid_milibuckets": "L", - "gtceu.top.unit.items": "Items", - "gtceu.top.valid_structure": "Structure Formed", - "gtceu.top.working_disabled": "Working Disabled", "gtceu.universal.clear_nbt_recipe.tooltip": "§cThis will destroy all contents!", "gtceu.universal.kiloliters": "%s B", "gtceu.universal.liters": "%s mB", @@ -3143,6 +2996,79 @@ "gui.gtceu.share_tank.title": "Shared Tank Inventory", "gui.widget.incrementButton.default_tooltip": "Hold Shift, Ctrl or both to change the amount", "gui.widget.recipeProgressWidget.default_tooltip": "Show Recipes", + "integration.gtceu.jade.allow_output_input": "Allow Input", + "integration.gtceu.jade.amperage_use": "%s A", + "integration.gtceu.jade.at": " @ ", + "integration.gtceu.jade.auto_output": "Auto Output", + "integration.gtceu.jade.cable.amperage": "Amperage: ", + "integration.gtceu.jade.cable.overloaded": "§cCable Overloaded!§r", + "integration.gtceu.jade.cable.voltage": "Voltage: ", + "integration.gtceu.jade.changes_eu_sec": "%s EU/s", + "integration.gtceu.jade.cleaned_this_second": "Cleaned hazard: %s/s", + "integration.gtceu.jade.convert_eu": "Converting §eEU§r -> §cFE§r", + "integration.gtceu.jade.convert_fe": "Converting §cFE§r -> §eEU§r", + "integration.gtceu.jade.days": "%s days", + "integration.gtceu.jade.energy_consumption": "Using", + "integration.gtceu.jade.energy_production": "Producing", + "integration.gtceu.jade.energy_stored": " / %d EU", + "integration.gtceu.jade.exhaust_vent_blocked": "Blocked", + "integration.gtceu.jade.exhaust_vent_direction": "Exhaust Vent: %s", + "integration.gtceu.jade.filter.label": "Filter:", + "integration.gtceu.jade.fluid_auto_output": "Fluid Output: %s", + "integration.gtceu.jade.fluid_use": "%s mB/t", + "integration.gtceu.jade.fuel_min_consume": "Needs", + "integration.gtceu.jade.fuel_none": "No fuel", + "integration.gtceu.jade.generator.output_too_small": "Energy Output too small!", + "integration.gtceu.jade.hours": "%s hours", + "integration.gtceu.jade.invalid_structure": "Structure Incomplete", + "integration.gtceu.jade.item_auto_output": "Item Output: %s", + "integration.gtceu.jade.ldp_endpoint.io_type": "IO Type: %s", + "integration.gtceu.jade.ldp_endpoint.is_formed": "§aPipeline Formed§r", + "integration.gtceu.jade.ldp_endpoint.not_formed": "§cPipeline Incomplete§r", + "integration.gtceu.jade.ldp_endpoint.output_direction": "Output Direction: %s", + "integration.gtceu.jade.link_cover.color": "Color:", + "integration.gtceu.jade.machine_mode": "Machine Mode: ", + "integration.gtceu.jade.maintenance.crowbar": "That doesn't belong there", + "integration.gtceu.jade.maintenance.hard_hammer": "Plating is dented", + "integration.gtceu.jade.maintenance.screwdriver": "Screws are loose", + "integration.gtceu.jade.maintenance.soft_mallet": "Something is stuck", + "integration.gtceu.jade.maintenance.wire_cutter": "Wires burned out", + "integration.gtceu.jade.maintenance.wrench": "Pipe is loose", + "integration.gtceu.jade.maintenance_broken": "Needs Maintenance", + "integration.gtceu.jade.maintenance_fixed": "Maintenance Fine", + "integration.gtceu.jade.minutes": "%s minutes", + "integration.gtceu.jade.mode.export": "Exporting", + "integration.gtceu.jade.mode.import": "Importing", + "integration.gtceu.jade.obstructed_structure": "Structure Obstructed", + "integration.gtceu.jade.pattern_buffer.bound_to_pos": "Bound To - X: %s, Y: %s, Z: %s", + "integration.gtceu.jade.pattern_buffer.not_bound": "Buffer Not Currently Bound", + "integration.gtceu.jade.pattern_buffer.proxies_bound": "Buffer Proxies Bound: %s", + "integration.gtceu.jade.primitive_pump_production": "Production: %s mB/s", + "integration.gtceu.jade.progress_computation": " / %s CWU", + "integration.gtceu.jade.progress_sec": " / %s s", + "integration.gtceu.jade.progress_tick": " / %s t", + "integration.gtceu.jade.recipe_output": "Recipe Outputs:", + "integration.gtceu.jade.remaining_charge_time": "Until charged: %s", + "integration.gtceu.jade.remaining_discharge_time": "Until empty: %s", + "integration.gtceu.jade.seconds": "%s seconds", + "integration.gtceu.jade.stained": "Colored: %s", + "integration.gtceu.jade.transform_down": "§aStep Down§r %s", + "integration.gtceu.jade.transform_input": "§6Input:§r %s", + "integration.gtceu.jade.transform_output": "§9Output:§r %s", + "integration.gtceu.jade.transform_up": "§cStep Up§r %s", + "integration.gtceu.jade.unit.fluid_buckets": "kL", + "integration.gtceu.jade.unit.fluid_milibuckets": "L", + "integration.gtceu.jade.unit.items": "Items", + "integration.gtceu.jade.valid_structure": "Structure Formed", + "integration.gtceu.jade.working_disabled": "Working Disabled", + "integration.gtceu.jade.years": "%s years", + "integration.gtceu.journeymap.options.layers": "Prospection layers", + "integration.gtceu.journeymap.options.layers.bedrock_fluids": "Show Bedrock Fluid Veins", + "integration.gtceu.journeymap.options.layers.hide_depleted": "Hide Depleted Veins", + "integration.gtceu.journeymap.options.layers.ore_veins": "Show Ore Veins", + "integration.gtceu.ownership.name.argonauts": "Argonauts Guild", + "integration.gtceu.ownership.name.ftb": "FTB Teams", + "integration.gtceu.ownership.name.player": "Player", "item.behavior.mode_switch.current_mode": "Mode: %s", "item.behavior.mode_switch.mode_switched": "§eMode Set to: %s", "item.behavior.mode_switch.tooltip": "Use while sneaking to switch mode", @@ -3439,6 +3365,7 @@ "item.gtceu.gray_glass_lens": "Glass Lens (Gray)", "item.gtceu.green_dye_spray_can": "Spray Can (Green)", "item.gtceu.green_glass_lens": "Glass Lens (Green)", + "item.gtceu.gui_module": "Gui Module", "item.gtceu.hammer_extruder_mold.tooltip": "§7Extruder Shape for making Hammers", "item.gtceu.hazmat_boots": "Hazardous Materials Suit Boots", "item.gtceu.hazmat_chestpiece": "Hazardous Materials Suit Chestpiece", @@ -3919,7 +3846,7 @@ "item.gtceu.storage_cover": "Storage Cover", "item.gtceu.sugar_gem": "Sugar Cube", "item.gtceu.sus_record": "Music Disc", - "item.gtceu.sus_record.desc": "§7Leonz - Among Us Drip", + "item.gtceu.sus_record.desc": "sussy!", "item.gtceu.sus_record.tooltip": "§7sussy!", "item.gtceu.sword_extruder_mold.tooltip": "§7Extruder Shape for making Swords", "item.gtceu.tag_filter.tooltip.0": "§7Filters §fItem§7 I/O with §fTag§7 as §fCover§7.", @@ -4925,6 +4852,14 @@ "machine.gtceu.zpm_sifter.tooltip": "§7Sponsored by TFC", "machine.gtceu.zpm_thermal_centrifuge.tooltip": "§7Blaze Sweatshop T-6352", "machine.gtceu.zpm_wiremill.tooltip": "§7Ingot Elongator", + "map.gtceu.button.bedrock_fluids": "Show Bedrock Fluid Veins", + "map.gtceu.button.hide_depleted": "Hide Depleted Veins", + "map.gtceu.button.mark_as_depleted.name": "Mark as Depleted", + "map.gtceu.button.ore_veins": "Show GT Ore Veins", + "map.gtceu.button.show_depleted": "Show Depleted Veins", + "map.gtceu.button.toggle_waypoint.name": "Toggle Waypoint", + "map.gtceu.new_veins.amount": "Prospected %d new veins!", + "map.gtceu.new_veins.name": "Prospected %s!", "material.gtceu.acetic_acid": "Acetic Acid", "material.gtceu.acetic_anhydride": "Acetic Anhydride", "material.gtceu.acetone": "Acetone", @@ -5596,19 +5531,13 @@ "medical_condition.gtceu.poison.affected": "§2Poisoning", "medical_condition.gtceu.weak_poison": "§aWeakly poisonous", "medical_condition.gtceu.weak_poison.affected": "§aMinor poisoning", - "message.gtceu.new_veins.amount": "Prospected %d new veins!", - "message.gtceu.new_veins.name": "Prospected %s!", - "minimap.gtceu.ore_vein.depleted": "Depleted", + "minimap.gtceu.ore_vein.depleted": "Depleted Vein", "monitor.gui.title.argb": "ARGB:", "monitor.gui.title.back": "Back", "monitor.gui.title.config": "Config", "monitor.gui.title.plugin": "Plugin:", "monitor.gui.title.scale": "Scale:", "monitor.gui.title.slot": "Slot:", - "ore.spawnlocation.name": "Ore Spawn Information", - "ownership.gtceu.name.argonauts": "Argonauts Guild", - "ownership.gtceu.name.ftb": "FTB Teams", - "ownership.gtceu.name.player": "Player", "recipe.capability.eu.name": "GTCEu Energy", "recipe.capability.fluid.name": "Fluid", "recipe.capability.item.name": "Item", @@ -5697,6 +5626,94 @@ "recipe_type.gtceu.thermal_centrifuge": "Thermal Centrifuge", "recipe_type.gtceu.vacuum_freezer": "Vacuum Freezer", "recipe_type.gtceu.wiremill": "Wiremill", + "recipeviewer.gtceu.bedrock_fluid.heavy_oil_deposit": "Heavy Oil Deposit", + "recipeviewer.gtceu.bedrock_fluid.lava_deposit": "Lava Deposit", + "recipeviewer.gtceu.bedrock_fluid.light_oil_deposit": "Light Oil Deposit", + "recipeviewer.gtceu.bedrock_fluid.natural_gas_deposit": "Natural Gas Deposit", + "recipeviewer.gtceu.bedrock_fluid.nether_natural_gas_deposit": "Nether Natural Gas Deposit", + "recipeviewer.gtceu.bedrock_fluid.oil_deposit": "Oil Deposit", + "recipeviewer.gtceu.bedrock_fluid.raw_oil_deposit": "Raw Oil Deposit", + "recipeviewer.gtceu.bedrock_fluid.salt_water_deposit": "Salt Water Deposit", + "recipeviewer.gtceu.category.bedrock_fluids": "Bedrock Fluids", + "recipeviewer.gtceu.category.bedrock_ores": "Bedrock Ores", + "recipeviewer.gtceu.category.multiblock_info": "Multiblock Info", + "recipeviewer.gtceu.category.ore_processing": "Ore Processing Diagram", + "recipeviewer.gtceu.category.ore_veins": "Ore Veins", + "recipeviewer.gtceu.category.programmed_circuit": "Programmed Circuit Page", + "recipeviewer.gtceu.fluid.dep_amount_hover": "The amount the vein will be depleted by", + "recipeviewer.gtceu.fluid.dep_chance_hover": "The percentage chance for the vein to be depleted upon harvest", + "recipeviewer.gtceu.fluid.dep_yield_hover": "The maximum yield of the vein when it is fully depleted", + "recipeviewer.gtceu.fluid.depleted_rate": "Depleted Yield: %d", + "recipeviewer.gtceu.fluid.depletion_amount": "Depletion Amount: %d", + "recipeviewer.gtceu.fluid.depletion_chance": "Depletion Chance: %d%%", + "recipeviewer.gtceu.fluid.dimension": "Dimensions:", + "recipeviewer.gtceu.fluid.max_hover": "The maximum yield that any fluid vein of this fluid can have", + "recipeviewer.gtceu.fluid.max_yield": "Maximum Yield: %d", + "recipeviewer.gtceu.fluid.min_hover": "The minimum yield that any fluid vein of this fluid can have", + "recipeviewer.gtceu.fluid.min_yield": "Minimum Yield: %d", + "recipeviewer.gtceu.fluid.vein_weight": "Vein Weight: %d", + "recipeviewer.gtceu.fluid.weight_hover": "The Weight of the vein. Hover over the fluid to see any possible biome modifications", + "recipeviewer.gtceu.materials.average_mass": "Average mass: %d", + "recipeviewer.gtceu.materials.average_neutrons": "Average neutrons: %d", + "recipeviewer.gtceu.materials.average_protons": "Average protons: %d", + "recipeviewer.gtceu.ore.between.0": "Between Ore", + "recipeviewer.gtceu.ore.between.1": "Spawns in the middle %d layers of the vein, with other ores", + "recipeviewer.gtceu.ore.biome_weighting": "§d%s Weight: §3%d", + "recipeviewer.gtceu.ore.biome_weighting_no_spawn": "§d%s Weight: §cCannot Spawn", + "recipeviewer.gtceu.ore.biome_weighting_title": "§dModified Biome Total Weights:", + "recipeviewer.gtceu.ore.ore_weight": "Weight in vein: %d%%", + "recipeviewer.gtceu.ore.primary.0": "Top Ore", + "recipeviewer.gtceu.ore.primary.1": "Spawns in the top %d layers of the vein", + "recipeviewer.gtceu.ore.secondary.0": "Bottom Ore", + "recipeviewer.gtceu.ore.secondary.1": "Spawns in the bottom %d layers of the vein", + "recipeviewer.gtceu.ore.sporadic.0": "Sporadic Ore", + "recipeviewer.gtceu.ore.sporadic.1": "Spawns anywhere in the vein", + "recipeviewer.gtceu.ore.surface_rock.0": "Surface Rocks with this material denote vein spawn locations.", + "recipeviewer.gtceu.ore.surface_rock.1": "They can be broken for 3 Tiny Piles of the dust, with Fortune giving a bonus.", + "recipeviewer.gtceu.ore_vein.apatite_vein": "Apatite Vein", + "recipeviewer.gtceu.ore_vein.banded_iron_vein": "Banded Iron Vein", + "recipeviewer.gtceu.ore_vein.bauxite_vein_end": "Bauxite Vein End", + "recipeviewer.gtceu.ore_vein.beryllium_vein": "Beryllium Vein", + "recipeviewer.gtceu.ore_vein.cassiterite_vein": "Cassiterite Vein", + "recipeviewer.gtceu.ore_vein.certus_quartz": "Certus Quartz", + "recipeviewer.gtceu.ore_vein.coal_vein": "Coal Vein", + "recipeviewer.gtceu.ore_vein.copper_tin_vein": "Copper Tin Vein", + "recipeviewer.gtceu.ore_vein.copper_vein": "Copper Vein", + "recipeviewer.gtceu.ore_vein.diamond_vein": "Diamond Vein", + "recipeviewer.gtceu.ore_vein.galena_vein": "Galena Vein", + "recipeviewer.gtceu.ore_vein.garnet_tin_vein": "Garnet Tin Vein", + "recipeviewer.gtceu.ore_vein.garnet_vein": "Garnet Vein", + "recipeviewer.gtceu.ore_vein.iron_vein": "Iron Vein", + "recipeviewer.gtceu.ore_vein.lapis_vein": "Lapis Vein", + "recipeviewer.gtceu.ore_vein.lubricant_vein": "Lubricant Vein", + "recipeviewer.gtceu.ore_vein.magnetite_vein_end": "Magnetite Vein End", + "recipeviewer.gtceu.ore_vein.magnetite_vein_ow": "Magnetite Vein Ow", + "recipeviewer.gtceu.ore_vein.manganese_vein": "Manganese Vein", + "recipeviewer.gtceu.ore_vein.manganese_vein_ow": "Manganese Vein Ow", + "recipeviewer.gtceu.ore_vein.mica_vein": "Mica Vein", + "recipeviewer.gtceu.ore_vein.mineral_sand_vein": "Mineral Sand Vein", + "recipeviewer.gtceu.ore_vein.molybdenum_vein": "Molybdenum Vein", + "recipeviewer.gtceu.ore_vein.monazite_vein": "Monazite Vein", + "recipeviewer.gtceu.ore_vein.naquadah_vein": "Naquadah Vein", + "recipeviewer.gtceu.ore_vein.nether_quartz_vein": "Nether Quartz Vein", + "recipeviewer.gtceu.ore_vein.nickel_vein": "Nickel Vein", + "recipeviewer.gtceu.ore_vein.oilsands_vein": "Oilsands Vein", + "recipeviewer.gtceu.ore_vein.olivine_vein": "Olivine Vein", + "recipeviewer.gtceu.ore_vein.pitchblende_vein_end": "Pitchblende Vein End", + "recipeviewer.gtceu.ore_vein.redstone_vein": "Redstone Vein", + "recipeviewer.gtceu.ore_vein.redstone_vein_ow": "Redstone Vein Ow", + "recipeviewer.gtceu.ore_vein.saltpeter_vein": "Saltpeter Vein", + "recipeviewer.gtceu.ore_vein.salts_vein": "Salts Vein", + "recipeviewer.gtceu.ore_vein.sapphire_vein": "Sapphire Vein", + "recipeviewer.gtceu.ore_vein.scheelite_vein": "Scheelite Vein", + "recipeviewer.gtceu.ore_vein.sheldonite_vein": "Sheldonite Vein", + "recipeviewer.gtceu.ore_vein.sulfur_vein": "Sulfur Vein", + "recipeviewer.gtceu.ore_vein.tetrahedrite_vein": "Tetrahedrite Vein", + "recipeviewer.gtceu.ore_vein.topaz_vein": "Topaz Vein", + "recipeviewer.gtceu.ore_vein_diagram.chance": "§eChance: %s§r", + "recipeviewer.gtceu.ore_vein_diagram.dimensions": "Dimensions:", + "recipeviewer.gtceu.ore_vein_diagram.spawn_range": "Spawn Range:", + "recipeviewer.gtceu.ore_vein_diagram.weight": "Weight: %s", "subtitles.gtceu.arc": "Arcs buzzing", "subtitles.gtceu.assembler": "Assembler constructing", "subtitles.gtceu.bath": "Bath fizzing", @@ -5859,7 +5876,7 @@ "tool.gtceu.tooltip.attack_damage": "%s §cAttack Damage", "tool.gtceu.tooltip.attack_speed": "%s §9Attack Speed", "tool.gtceu.tooltip.crafting_uses": "%s §aCrafting Uses", - "tool.gtceu.tooltip.general_uses": "%s/%s §bDurability", + "tool.gtceu.tooltip.general_uses": "%s / %s §bDurability", "tool.gtceu.tooltip.harvest_level": "§eHarvest Level %s", "tool.gtceu.tooltip.harvest_level_extra": "§eHarvest Level %s §f(%s§f)", "tool.gtceu.tooltip.harvest_level_name.0": "§8Wood", diff --git a/src/generated/resources/assets/gtceu/models/block/ctm_test.json b/src/generated/resources/assets/gtceu/models/block/ctm_test.json new file mode 100644 index 00000000000..47bfa0945dd --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/ctm_test.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "gtceu:block/ctm_test" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/machine/me_stocking_input_bus.json b/src/generated/resources/assets/gtceu/models/block/machine/me_stocking_input_bus.json index f53958681de..099433a0ec9 100644 --- a/src/generated/resources/assets/gtceu/models/block/machine/me_stocking_input_bus.json +++ b/src/generated/resources/assets/gtceu/models/block/machine/me_stocking_input_bus.json @@ -12,10 +12,10 @@ "model": { "parent": "gtceu:block/machine/template/part/hatch_machine", "textures": { - "bottom": "gtceu:block/casings/voltage/luv/bottom", + "bottom": "gtceu:block/casings/voltage/iv/bottom", "overlay": "gtceu:block/overlay/appeng/me_input_bus", - "side": "gtceu:block/casings/voltage/luv/side", - "top": "gtceu:block/casings/voltage/luv/top" + "side": "gtceu:block/casings/voltage/iv/side", + "top": "gtceu:block/casings/voltage/iv/top" } } }, @@ -23,10 +23,10 @@ "model": { "parent": "gtceu:block/machine/template/part/hatch_machine_color_ring", "textures": { - "bottom": "gtceu:block/casings/voltage/luv/bottom", + "bottom": "gtceu:block/casings/voltage/iv/bottom", "overlay": "gtceu:block/overlay/appeng/me_input_bus", - "side": "gtceu:block/casings/voltage/luv/side", - "top": "gtceu:block/casings/voltage/luv/top" + "side": "gtceu:block/casings/voltage/iv/side", + "top": "gtceu:block/casings/voltage/iv/top" } } } diff --git a/src/generated/resources/assets/gtceu/models/block/machine/me_stocking_input_hatch.json b/src/generated/resources/assets/gtceu/models/block/machine/me_stocking_input_hatch.json index 5262fb2a7c5..f73f8301b3e 100644 --- a/src/generated/resources/assets/gtceu/models/block/machine/me_stocking_input_hatch.json +++ b/src/generated/resources/assets/gtceu/models/block/machine/me_stocking_input_hatch.json @@ -12,10 +12,10 @@ "model": { "parent": "gtceu:block/machine/template/part/hatch_machine", "textures": { - "bottom": "gtceu:block/casings/voltage/luv/bottom", + "bottom": "gtceu:block/casings/voltage/iv/bottom", "overlay": "gtceu:block/overlay/appeng/me_input_hatch", - "side": "gtceu:block/casings/voltage/luv/side", - "top": "gtceu:block/casings/voltage/luv/top" + "side": "gtceu:block/casings/voltage/iv/side", + "top": "gtceu:block/casings/voltage/iv/top" } } }, @@ -23,10 +23,10 @@ "model": { "parent": "gtceu:block/machine/template/part/hatch_machine_color_ring", "textures": { - "bottom": "gtceu:block/casings/voltage/luv/bottom", + "bottom": "gtceu:block/casings/voltage/iv/bottom", "overlay": "gtceu:block/overlay/appeng/me_input_hatch", - "side": "gtceu:block/casings/voltage/luv/side", - "top": "gtceu:block/casings/voltage/luv/top" + "side": "gtceu:block/casings/voltage/iv/side", + "top": "gtceu:block/casings/voltage/iv/top" } } } diff --git a/src/generated/resources/assets/gtceu/models/block/machine/test_mui.json b/src/generated/resources/assets/gtceu/models/block/machine/test_mui.json new file mode 100644 index 00000000000..f86f60d96f9 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/machine/test_mui.json @@ -0,0 +1,18 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "gtceu:test_mui", + "replaceable_textures": [ + "all" + ], + "variants": { + "": { + "model": { + "parent": "gtceu:block/machine/part/computer_monitor", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/huge_duct_pipe/connection.json b/src/generated/resources/assets/gtceu/models/block/pipe/huge_duct_pipe/connection.json index e76d23f3a85..b2611d641ce 100644 --- a/src/generated/resources/assets/gtceu/models/block/pipe/huge_duct_pipe/connection.json +++ b/src/generated/resources/assets/gtceu/models/block/pipe/huge_duct_pipe/connection.json @@ -20,10 +20,6 @@ "texture": "#side", "tintindex": 0 }, - "up": { - "texture": "#end", - "tintindex": 1 - }, "west": { "texture": "#side", "tintindex": 0 diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/large_duct_pipe/connection.json b/src/generated/resources/assets/gtceu/models/block/pipe/large_duct_pipe/connection.json index 3cbd0c515e5..d66234c7375 100644 --- a/src/generated/resources/assets/gtceu/models/block/pipe/large_duct_pipe/connection.json +++ b/src/generated/resources/assets/gtceu/models/block/pipe/large_duct_pipe/connection.json @@ -20,10 +20,6 @@ "texture": "#side", "tintindex": 0 }, - "up": { - "texture": "#end", - "tintindex": 1 - }, "west": { "texture": "#side", "tintindex": 0 diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/normal_duct_pipe/connection.json b/src/generated/resources/assets/gtceu/models/block/pipe/normal_duct_pipe/connection.json index 8dd3319f1de..0a0595065de 100644 --- a/src/generated/resources/assets/gtceu/models/block/pipe/normal_duct_pipe/connection.json +++ b/src/generated/resources/assets/gtceu/models/block/pipe/normal_duct_pipe/connection.json @@ -20,10 +20,6 @@ "texture": "#side", "tintindex": 0 }, - "up": { - "texture": "#end", - "tintindex": 1 - }, "west": { "texture": "#side", "tintindex": 0 diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/normal_laser_pipe/connection.json b/src/generated/resources/assets/gtceu/models/block/pipe/normal_laser_pipe/connection.json index 9e2730a1c5b..a3c9678b3fe 100644 --- a/src/generated/resources/assets/gtceu/models/block/pipe/normal_laser_pipe/connection.json +++ b/src/generated/resources/assets/gtceu/models/block/pipe/normal_laser_pipe/connection.json @@ -20,10 +20,6 @@ "texture": "#side", "tintindex": 0 }, - "up": { - "texture": "#end", - "tintindex": 1 - }, "west": { "texture": "#side", "tintindex": 0 diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/normal_laser_pipe/connection_active.json b/src/generated/resources/assets/gtceu/models/block/pipe/normal_laser_pipe/connection_active.json index f45e0d010d3..0f31c0d7be8 100644 --- a/src/generated/resources/assets/gtceu/models/block/pipe/normal_laser_pipe/connection_active.json +++ b/src/generated/resources/assets/gtceu/models/block/pipe/normal_laser_pipe/connection_active.json @@ -20,10 +20,6 @@ "texture": "#side", "tintindex": 0 }, - "up": { - "texture": "#end", - "tintindex": 1 - }, "west": { "texture": "#side", "tintindex": 0 diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/normal_optical_pipe/connection.json b/src/generated/resources/assets/gtceu/models/block/pipe/normal_optical_pipe/connection.json index d01e5420817..d2beab0da7d 100644 --- a/src/generated/resources/assets/gtceu/models/block/pipe/normal_optical_pipe/connection.json +++ b/src/generated/resources/assets/gtceu/models/block/pipe/normal_optical_pipe/connection.json @@ -20,10 +20,6 @@ "texture": "#side", "tintindex": 0 }, - "up": { - "texture": "#end", - "tintindex": 1 - }, "west": { "texture": "#side", "tintindex": 0 diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/normal_optical_pipe/connection_active.json b/src/generated/resources/assets/gtceu/models/block/pipe/normal_optical_pipe/connection_active.json index 1f89bf4bc9c..ea71991775d 100644 --- a/src/generated/resources/assets/gtceu/models/block/pipe/normal_optical_pipe/connection_active.json +++ b/src/generated/resources/assets/gtceu/models/block/pipe/normal_optical_pipe/connection_active.json @@ -20,10 +20,6 @@ "texture": "#side", "tintindex": 0 }, - "up": { - "texture": "#end", - "tintindex": 1 - }, "west": { "texture": "#side", "tintindex": 0 diff --git a/src/generated/resources/assets/gtceu/models/block/pipe/small_duct_pipe/connection.json b/src/generated/resources/assets/gtceu/models/block/pipe/small_duct_pipe/connection.json index c7eb5ea67dc..7ed9aeb1da1 100644 --- a/src/generated/resources/assets/gtceu/models/block/pipe/small_duct_pipe/connection.json +++ b/src/generated/resources/assets/gtceu/models/block/pipe/small_duct_pipe/connection.json @@ -20,10 +20,6 @@ "texture": "#side", "tintindex": 0 }, - "up": { - "texture": "#end", - "tintindex": 1 - }, "west": { "texture": "#side", "tintindex": 0 diff --git a/src/generated/resources/assets/gtceu/models/item/ctm_test.json b/src/generated/resources/assets/gtceu/models/item/ctm_test.json new file mode 100644 index 00000000000..1dec31234c8 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/item/ctm_test.json @@ -0,0 +1,3 @@ +{ + "parent": "gtceu:block/ctm_test" +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/gui_module.json b/src/generated/resources/assets/gtceu/models/item/gui_module.json new file mode 100644 index 00000000000..5c1152837c4 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/item/gui_module.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "gtceu:item/gui_module" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/huge_duct_pipe.json b/src/generated/resources/assets/gtceu/models/item/huge_duct_pipe.json index 6446bb669a9..b10a3d02b3a 100644 --- a/src/generated/resources/assets/gtceu/models/item/huge_duct_pipe.json +++ b/src/generated/resources/assets/gtceu/models/item/huge_duct_pipe.json @@ -17,9 +17,8 @@ "tintindex": 1 }, "south": { - "cullface": "south", - "texture": "#end", - "tintindex": 1 + "texture": "#side", + "tintindex": 0 }, "up": { "texture": "#side", diff --git a/src/generated/resources/assets/gtceu/models/item/large_duct_pipe.json b/src/generated/resources/assets/gtceu/models/item/large_duct_pipe.json index 8ce685ee51f..19f35652649 100644 --- a/src/generated/resources/assets/gtceu/models/item/large_duct_pipe.json +++ b/src/generated/resources/assets/gtceu/models/item/large_duct_pipe.json @@ -17,9 +17,8 @@ "tintindex": 1 }, "south": { - "cullface": "south", - "texture": "#end", - "tintindex": 1 + "texture": "#side", + "tintindex": 0 }, "up": { "texture": "#side", diff --git a/src/generated/resources/assets/gtceu/models/item/normal_duct_pipe.json b/src/generated/resources/assets/gtceu/models/item/normal_duct_pipe.json index 3b362236c0f..0ec1b4556d3 100644 --- a/src/generated/resources/assets/gtceu/models/item/normal_duct_pipe.json +++ b/src/generated/resources/assets/gtceu/models/item/normal_duct_pipe.json @@ -17,9 +17,8 @@ "tintindex": 1 }, "south": { - "cullface": "south", - "texture": "#end", - "tintindex": 1 + "texture": "#side", + "tintindex": 0 }, "up": { "texture": "#side", diff --git a/src/generated/resources/assets/gtceu/models/item/normal_laser_pipe.json b/src/generated/resources/assets/gtceu/models/item/normal_laser_pipe.json index 112eb3bf581..6f8da9ae3bf 100644 --- a/src/generated/resources/assets/gtceu/models/item/normal_laser_pipe.json +++ b/src/generated/resources/assets/gtceu/models/item/normal_laser_pipe.json @@ -17,9 +17,8 @@ "tintindex": 1 }, "south": { - "cullface": "south", - "texture": "#end", - "tintindex": 1 + "texture": "#side", + "tintindex": 0 }, "up": { "texture": "#side", @@ -51,6 +50,10 @@ "texture": "#side_overlay", "tintindex": 2 }, + "south": { + "texture": "#side_overlay", + "tintindex": 2 + }, "up": { "texture": "#side_overlay", "tintindex": 2 diff --git a/src/generated/resources/assets/gtceu/models/item/normal_optical_pipe.json b/src/generated/resources/assets/gtceu/models/item/normal_optical_pipe.json index d57881dac07..387880f81ce 100644 --- a/src/generated/resources/assets/gtceu/models/item/normal_optical_pipe.json +++ b/src/generated/resources/assets/gtceu/models/item/normal_optical_pipe.json @@ -17,9 +17,8 @@ "tintindex": 1 }, "south": { - "cullface": "south", - "texture": "#end", - "tintindex": 1 + "texture": "#side", + "tintindex": 0 }, "up": { "texture": "#side", @@ -51,6 +50,10 @@ "texture": "#side_overlay", "tintindex": 2 }, + "south": { + "texture": "#side_overlay", + "tintindex": 2 + }, "up": { "texture": "#side_overlay", "tintindex": 2 diff --git a/src/generated/resources/assets/gtceu/models/item/small_duct_pipe.json b/src/generated/resources/assets/gtceu/models/item/small_duct_pipe.json index 52c2a00a7ee..923c0b7fa7a 100644 --- a/src/generated/resources/assets/gtceu/models/item/small_duct_pipe.json +++ b/src/generated/resources/assets/gtceu/models/item/small_duct_pipe.json @@ -17,9 +17,8 @@ "tintindex": 1 }, "south": { - "cullface": "south", - "texture": "#end", - "tintindex": 1 + "texture": "#side", + "tintindex": 0 }, "up": { "texture": "#side", diff --git a/src/generated/resources/assets/gtceu/models/item/test_mui.json b/src/generated/resources/assets/gtceu/models/item/test_mui.json new file mode 100644 index 00000000000..9ae958ad11c --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/item/test_mui.json @@ -0,0 +1,3 @@ +{ + "parent": "gtceu:block/machine/test_mui" +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/mineable/shears.json b/src/generated/resources/data/forge/tags/blocks/mineable/shears.json new file mode 100644 index 00000000000..43b80a3b738 --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/mineable/shears.json @@ -0,0 +1,22 @@ +{ + "values": [ + "#minecraft:leaves", + "#minecraft:wool", + "minecraft:cobweb", + "minecraft:dead_bush", + "minecraft:fern", + "minecraft:glow_lichen", + "minecraft:hanging_roots", + "minecraft:large_fern", + "minecraft:nether_sprouts", + "minecraft:seagrass", + "minecraft:grass", + "minecraft:small_dripleaf", + "minecraft:tall_grass", + "minecraft:tall_seagrass", + "minecraft:tripwire", + "minecraft:twisting_vines", + "minecraft:vine", + "minecraft:weeping_vines" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json index fa61f052e64..f6b483fc80d 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -8,6 +8,38 @@ "gtceu:cleanroom_glass", "gtceu:petrified_foam", "gtceu:reinforced_stone", + "gtceu:white_lamp", + "gtceu:orange_lamp", + "gtceu:magenta_lamp", + "gtceu:light_blue_lamp", + "gtceu:yellow_lamp", + "gtceu:lime_lamp", + "gtceu:pink_lamp", + "gtceu:gray_lamp", + "gtceu:light_gray_lamp", + "gtceu:cyan_lamp", + "gtceu:purple_lamp", + "gtceu:blue_lamp", + "gtceu:brown_lamp", + "gtceu:green_lamp", + "gtceu:red_lamp", + "gtceu:black_lamp", + "gtceu:white_borderless_lamp", + "gtceu:orange_borderless_lamp", + "gtceu:magenta_borderless_lamp", + "gtceu:light_blue_borderless_lamp", + "gtceu:yellow_borderless_lamp", + "gtceu:lime_borderless_lamp", + "gtceu:pink_borderless_lamp", + "gtceu:gray_borderless_lamp", + "gtceu:light_gray_borderless_lamp", + "gtceu:cyan_borderless_lamp", + "gtceu:purple_borderless_lamp", + "gtceu:blue_borderless_lamp", + "gtceu:brown_borderless_lamp", + "gtceu:green_borderless_lamp", + "gtceu:red_borderless_lamp", + "gtceu:black_borderless_lamp", "gtceu:white_studs", "gtceu:orange_studs", "gtceu:magenta_studs", diff --git a/src/generated/resources/data/minecraft/tags/items/music_discs.json b/src/generated/resources/data/minecraft/tags/items/music_discs.json new file mode 100644 index 00000000000..1ad655bc813 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/music_discs.json @@ -0,0 +1,5 @@ +{ + "values": [ + "gtceu:sus_record" + ] +} \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/GTCEu.java b/src/main/java/com/gregtechceu/gtceu/GTCEu.java index e7b1de43d39..b834dccf3b0 100644 --- a/src/main/java/com/gregtechceu/gtceu/GTCEu.java +++ b/src/main/java/com/gregtechceu/gtceu/GTCEu.java @@ -96,7 +96,7 @@ public static boolean isDataGen() { /** * A friendly reminder that the server instance is populated on the server side only, so null/side check it! - * + * * @return the current minecraft server instance */ public static MinecraftServer getMinecraftServer() { @@ -108,12 +108,14 @@ public static MinecraftServer getMinecraftServer() { * @return if the mod whose id is {@code modId} is loaded or not */ public static boolean isModLoaded(String modId) { - return ModList.get().isLoaded(modId); + ModList modList = ModList.get(); + if (modList != null) return modList.isLoaded(modId); + else return FMLLoader.getLoadingModList().getModFileById(modId) != null; } /** * For async stuff use this, otherwise use {@link GTCEu isClientSide} - * + * * @return if the current thread is the client thread */ public static boolean isClientThread() { @@ -132,7 +134,7 @@ public static boolean isClientSide() { /** * This check isn't the same for client and server! - * + * * @return if it's safe to access the current instance {@link net.minecraft.world.level.Level Level} on client or if * it's safe to access any level on server. */ @@ -175,9 +177,8 @@ public static boolean isIrisOculusLoaded() { return isModLoaded(GTValues.MODID_IRIS) || isModLoaded(GTValues.MODID_OCULUS); } - public static boolean isSodiumRubidiumEmbeddiumLoaded() { - return isModLoaded(GTValues.MODID_SODIUM) || isModLoaded(GTValues.MODID_RUBIDIUM) || - isModLoaded(GTValues.MODID_EMBEDDIUM); + public static boolean isSodiumEmbeddiumLoaded() { + return isModLoaded(GTValues.MODID_SODIUM) || isModLoaded(GTValues.MODID_EMBEDDIUM); } public static boolean isAE2Loaded() { @@ -188,10 +189,6 @@ public static boolean isCuriosLoaded() { return isModLoaded(GTValues.MODID_CURIOS); } - public static boolean isShimmerLoaded() { - return isModLoaded(GTValues.MODID_SHIMMER); - } - public static boolean isModernFixLoaded() { return isModLoaded(GTValues.MODID_MODERNFIX); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/GTCEuAPI.java b/src/main/java/com/gregtechceu/gtceu/api/GTCEuAPI.java index e9bdd6edacf..e203cd914d2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/GTCEuAPI.java +++ b/src/main/java/com/gregtechceu/gtceu/api/GTCEuAPI.java @@ -5,7 +5,6 @@ import com.gregtechceu.gtceu.api.addon.IGTAddon; import com.gregtechceu.gtceu.api.block.ICoilType; import com.gregtechceu.gtceu.api.block.IFilterType; -import com.gregtechceu.gtceu.api.data.chemical.material.IMaterialRegistryManager; import com.gregtechceu.gtceu.api.machine.multiblock.IBatteryData; import com.gregtechceu.gtceu.api.registry.GTRegistry; import com.gregtechceu.gtceu.common.block.BatteryBlock; @@ -28,8 +27,6 @@ public class GTCEuAPI { /** Will always be available */ public static GTCEu instance; - /** Will be available at the Construction stage */ - public static IMaterialRegistryManager materialManager; /** Will be available at the Pre-Initialization stage */ @Getter diff --git a/src/main/java/com/gregtechceu/gtceu/api/GTValues.java b/src/main/java/com/gregtechceu/gtceu/api/GTValues.java index 7f2da34899c..ee1b821f8af 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/GTValues.java +++ b/src/main/java/com/gregtechceu/gtceu/api/GTValues.java @@ -36,7 +36,7 @@ public class GTValues { public static final int L = 144; public static final RandomSource RNG = RandomSource.createThreadSafe(); - // shortcut for various lengths of time in ticks + // shortcut for various lengths of time in ticks (with the default tickrate of 20) public static final long SECONDS = 20; public static final long MINUTES = 60 * SECONDS; public static final long HOURS = 60 * MINUTES; @@ -45,12 +45,6 @@ public class GTValues { public static final long MONTHS = 30 * DAYS; public static final long YEARS = 365 * DAYS; - /** - * The Item WildCard Tag. Even shorter than the "-1" of the past - */ - - // public static final short W = OreDictionary.WILDCARD_VALUE; - /** Current time on the Client. Will always be zero on the server. */ public static long CLIENT_TIME = 0; @@ -121,12 +115,11 @@ public static int[] tiersBetween(int minInclusive, int maxInclusive) { MODID_IRIS = "iris", MODID_OCULUS = "oculus", MODID_SODIUM = "sodium", - MODID_RUBIDIUM = "rubidium", MODID_EMBEDDIUM = "embeddium", + MODID_OPTIFINE = "optifine", MODID_CREATE = "create", MODID_CURIOS = "curios", MODID_AE2WTLIB = "ae2wtlib", - MODID_SHIMMER = "shimmer", MODID_MODERNFIX = "modernfix", MODID_JOURNEYMAP = "journeymap", MODID_XAEROS_MINIMAP = "xaerominimap", @@ -272,6 +265,7 @@ public static int[] tiersBetween(int minInclusive, int maxInclusive) { 0x7EC3C4, 0x7EB07E, 0xBF74C0, 0x0B5CFE, 0x914E91, 0x488748, 0x8C0000, 0x2828F5 }; // Main colour for each tier + @SuppressWarnings("DataFlowIssue") public static final int[] VCM = new int[] { DARK_GRAY.getColor(), GRAY.getColor(), diff --git a/src/main/java/com/gregtechceu/gtceu/api/addon/IGTAddon.java b/src/main/java/com/gregtechceu/gtceu/api/addon/IGTAddon.java index 7aa4eb45714..71f1c2699bb 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/addon/IGTAddon.java +++ b/src/main/java/com/gregtechceu/gtceu/api/addon/IGTAddon.java @@ -34,41 +34,53 @@ public interface IGTAddon { /** * Call init on your custom TagPrefix class(es) here + * + * @deprecated Subscribe to the {@code GTCEuAPI.RegisterEvent} register event instead */ + @Deprecated(forRemoval = true, since = "8.0.0") default void registerTagPrefixes() {} /** * Call init on your custom Element class(es) here - */ - default void registerElements() {} - - /** - * Call init on your custom Material class(es) here * - * @deprecated use {@link com.gregtechceu.gtceu.api.data.chemical.material.event.MaterialRegistryEvent} and - * {@link com.gregtechceu.gtceu.api.data.chemical.material.event.MaterialEvent} instead. + * @deprecated Subscribe to the {@code GTCEuAPI.RegisterEvent} register event instead */ - @Deprecated(forRemoval = true, since = "1.0.21") - default void registerMaterials() {} + @Deprecated(forRemoval = true, since = "8.0.0") + default void registerElements() {} /** * Call init on your custom Sound class(es) here + * + * @deprecated Subscribe to the {@code GTCEuAPI.RegisterEvent} register event instead */ + @Deprecated(forRemoval = true, since = "8.0.0") default void registerSounds() {} /** * Call init on your custom Cover class(es) here + * + * @deprecated Subscribe to the {@code GTCEuAPI.RegisterEvent} register event + * instead */ + @Deprecated(forRemoval = true, since = "8.0.0") default void registerCovers() {} /** * Call init on your custom Recipe Capabilities here + * + * @deprecated Subscribe to the {@code GTCEuAPI.RegisterEvent} register event + * instead */ + @Deprecated(forRemoval = true, since = "8.0.0") default void registerRecipeCapabilities() {} /** * Call init on your custom IWorldGenLayer class(es) here + * + * @deprecated Subscribe to the {@code GTCEuAPI.RegisterEvent} register event + * instead */ + @Deprecated(forRemoval = true, since = "8.0.0") default void registerWorldgenLayers() {} /** @@ -103,9 +115,16 @@ default void registerBedrockOreVeins() {} /** * Register Material -> Casing block mappings here + * + * @deprecated Subscribe to the {@link MaterialCasingCollectionEvent} directly. */ + @Deprecated(forRemoval = true, since = "8.0.0") default void collectMaterialCasings(MaterialCasingCollectionEvent event) {} + /** + * @deprecated Subscribe to the {@link KJSRecipeKeyEvent} directly. + */ + @Deprecated(forRemoval = true, since = "8.0.0") default void registerRecipeKeys(KJSRecipeKeyEvent event) {} /** diff --git a/src/main/java/com/gregtechceu/gtceu/api/addon/events/KJSRecipeKeyEvent.java b/src/main/java/com/gregtechceu/gtceu/api/addon/events/KJSRecipeKeyEvent.java index 3ada60b9a6a..234dbd40865 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/addon/events/KJSRecipeKeyEvent.java +++ b/src/main/java/com/gregtechceu/gtceu/api/addon/events/KJSRecipeKeyEvent.java @@ -4,6 +4,9 @@ import com.gregtechceu.gtceu.integration.kjs.recipe.components.ContentJS; import com.gregtechceu.gtceu.integration.kjs.recipe.components.GTRecipeComponents; +import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.fml.event.IModBusEvent; + import com.mojang.datafixers.util.Pair; import lombok.Getter; @@ -11,7 +14,7 @@ import java.util.Map; @SuppressWarnings("unused") -public class KJSRecipeKeyEvent { +public class KJSRecipeKeyEvent extends Event implements IModBusEvent { @Getter private final Map, Pair, ContentJS>> registeredKeys = new HashMap<>(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/addon/events/MaterialCasingCollectionEvent.java b/src/main/java/com/gregtechceu/gtceu/api/addon/events/MaterialCasingCollectionEvent.java index d9c2cacd7f9..905188f9224 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/addon/events/MaterialCasingCollectionEvent.java +++ b/src/main/java/com/gregtechceu/gtceu/api/addon/events/MaterialCasingCollectionEvent.java @@ -3,11 +3,13 @@ import com.gregtechceu.gtceu.api.data.chemical.material.Material; import net.minecraft.world.level.block.Block; +import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.fml.event.IModBusEvent; import com.google.common.collect.ImmutableMap; import com.tterrag.registrate.util.entry.BlockEntry; -public class MaterialCasingCollectionEvent { +public class MaterialCasingCollectionEvent extends Event implements IModBusEvent { private final ImmutableMap.Builder> builder; diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/ActiveBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/ActiveBlock.java index d031d9988f3..8f8a173fe05 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/ActiveBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/ActiveBlock.java @@ -1,5 +1,7 @@ package com.gregtechceu.gtceu.api.block; +import com.gregtechceu.gtceu.api.multiblock.pattern.IStructureChangeIgnored; + import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -18,7 +20,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class ActiveBlock extends Block { +public class ActiveBlock extends Block implements IStructureChangeIgnored { public ActiveBlock(Properties properties) { super(properties); diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/ICoilType.java b/src/main/java/com/gregtechceu/gtceu/api/block/ICoilType.java index 47feaa5704e..5a2b45fd51d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/ICoilType.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/ICoilType.java @@ -6,6 +6,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraftforge.common.util.Lazy; +import com.mojang.serialization.Codec; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -14,6 +15,15 @@ public interface ICoilType { + Codec CODEC = Codec.STRING.xmap( + (name) -> GTCEuAPI.HEATING_COILS.keySet() + .stream() + .filter(type -> type.getName().equals(name)) + .findFirst() + .orElseThrow( + () -> new RuntimeException("ICoilType " + name + " not found in GTCEuAPI.HEATING_COILS")), + ICoilType::getName); + /** * @return The Unique Name of the Heating Coil */ diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java index ae0e35cd3be..28333d1d252 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -6,11 +6,11 @@ import com.gregtechceu.gtceu.api.item.MetaMachineItem; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.machine.feature.*; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.sync_system.managed.ManagedSyncEntityBlock; import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; -import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -34,12 +34,9 @@ import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.Rotation; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityTicker; -import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.storage.loot.LootParams; @@ -59,7 +56,7 @@ @SuppressWarnings("deprecation") @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public class MetaMachineBlock extends Block implements EntityBlock { +public class MetaMachineBlock extends Block implements ManagedSyncEntityBlock { @Getter public final MachineDefinition definition; @@ -72,7 +69,7 @@ public MetaMachineBlock(Properties properties, MachineDefinition definition) { BlockState defaultState = this.defaultBlockState().setValue(rotationState.property, rotationState.defaultDirection); if (definition.isAllowExtendedFacing()) { - defaultState = defaultState.setValue(GTBlockStateProperties.UPWARDS_FACING, Direction.NORTH); + defaultState = defaultState.setValue(GTBlockStateProperties.UPWARDS_FACING, Direction.UP); } registerDefaultState(defaultState); } @@ -123,12 +120,8 @@ public void setPlacedBy(Level pLevel, BlockPos pPos, BlockState pState, @Nullabl machine.setOwnerUUID(sPlayer.getUUID()); } - if (machine instanceof IDropSaveMachine dropSaveMachine) { - CompoundTag tag = pStack.getTag(); - if (tag != null) { - dropSaveMachine.loadFromItem(tag); - } - } + CompoundTag tag = pStack.getTag(); + if (tag != null) machine.loadFromItem(tag); } } } @@ -147,29 +140,40 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { var player = context.getPlayer(); var blockPos = context.getClickedPos(); var state = defaultBlockState(); + var machine = MetaMachine.getMachine(context.getLevel(), blockPos); if (player != null && rotationState != RotationState.NONE) { + Direction newFrontDir; + Direction newUpFacing; if (rotationState == RotationState.Y_AXIS) { - state = state.setValue(rotationState.property, Direction.UP); + newFrontDir = Direction.UP; } else { - state = state.setValue(rotationState.property, player.getDirection().getOpposite()); + newFrontDir = player.getDirection().getOpposite(); } + Vec3 pos = player.position(); if (Math.abs(pos.x - (double) ((float) blockPos.getX() + 0.5F)) < 2.0D && Math.abs(pos.z - (double) ((float) blockPos.getZ() + 0.5F)) < 2.0D) { double d0 = pos.y + (double) player.getEyeHeight(); if (d0 - (double) blockPos.getY() > 2.0D && rotationState.test(Direction.UP)) { - state = state.setValue(rotationState.property, Direction.UP); + newFrontDir = Direction.UP; } if ((double) blockPos.getY() - d0 > 0.0D && rotationState.test(Direction.DOWN)) { - state = state.setValue(rotationState.property, Direction.DOWN); + newFrontDir = Direction.DOWN; } } + + state = state.setValue(rotationState.property, newFrontDir); + if (machine != null) { + machine.setFrontFacing(newFrontDir); + } if (getDefinition().isAllowExtendedFacing()) { Direction frontFacing = state.getValue(rotationState.property); - if (frontFacing == Direction.UP) { + if (frontFacing.getAxis() == Direction.Axis.Y) { + newUpFacing = player.getDirection(); state = state.setValue(GTBlockStateProperties.UPWARDS_FACING, player.getDirection()); - } else if (frontFacing == Direction.DOWN) { - state = state.setValue(GTBlockStateProperties.UPWARDS_FACING, player.getDirection().getOpposite()); + if (machine instanceof MultiblockControllerMachine controller) { + controller.setUpwardsFacing(newUpFacing); + } } } } @@ -179,10 +183,8 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { @Override public ItemStack getCloneItemStack(BlockGetter level, BlockPos pos, BlockState state) { ItemStack itemStack = super.getCloneItemStack(level, pos, state); - if (MetaMachine.getMachine(level, pos) instanceof IDropSaveMachine dropSaveMachine && - dropSaveMachine.savePickClone()) { - dropSaveMachine.saveToItem(itemStack.getOrCreateTag()); - } + var machine = MetaMachine.getMachine(level, pos); + if (machine != null) machine.saveToItem(itemStack.getOrCreateTag(), true); return itemStack; } @@ -191,21 +193,6 @@ public void appendHoverText(ItemStack stack, @Nullable BlockGetter level, List getDrops(BlockState state, LootParams.Builder builder) { BlockEntity be = builder.getOptionalParameter(LootContextParams.BLOCK_ENTITY); if (be instanceof MetaMachine machine) { machine.modifyDrops(drops); - if (machine instanceof IDropSaveMachine dropSaveMachine && dropSaveMachine.saveBreak()) { - for (ItemStack drop : drops) { - if (drop.getItem() instanceof MetaMachineItem item && item.getBlock() == this) { - dropSaveMachine.saveToItem(drop.getOrCreateTag()); - // break here to not dupe contents if a machine drops multiple of itself for whatever reason. - break; + for (ItemStack drop : drops) { + if (drop.getItem() instanceof MetaMachineItem item && item.getBlock() == this) { + CompoundTag tag = drop.getOrCreateTag(); + machine.saveToItem(tag, false); + if (tag.isEmpty()) { + drop.setTag(null); } + // break here to not dupe contents if a machine drops multiple of itself for whatever reason. + break; } } } @@ -287,8 +276,9 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player InteractionResult machineInteractResult = InteractionResult.PASS; - if (!itemStack.isEmpty()) + if (!itemStack.isEmpty()) { machineInteractResult = machine.onUseWithItem(new ExtendedUseOnContext(player, hand, hit)); + } if (machineInteractResult != InteractionResult.PASS) return machineInteractResult; machineInteractResult = machine.onUse(new ExtendedUseOnContext(player, hand, hit)); if (machineInteractResult != InteractionResult.PASS) return machineInteractResult; @@ -297,9 +287,12 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player shouldOpenUi = gtToolItem.definition$shouldOpenUIAfterUse(new UseOnContext(player, hand, hit)); } - if (shouldOpenUi && machine instanceof IUIMachine uiMachine && - MachineOwner.canOpenOwnerMachine(player, machine)) { - return uiMachine.tryToOpenUI(player, hand, hit); + if (shouldOpenUi && MachineOwner.canOpenOwnerMachine(player, machine)) { + if (machine.getDefinition().getUI() != null) { + return machine.getDefinition().getUI().tryToOpenUI(player, hand, hit); + } else if (machine instanceof IMuiMachine muiMachine) { + return muiMachine.tryToOpenUI(player, hand, hit); + } } return shouldOpenUi ? InteractionResult.PASS : InteractionResult.CONSUME; } @@ -383,26 +376,4 @@ public static int colorTinted(BlockState blockState, @Nullable BlockAndTintGette public final BlockEntity newBlockEntity(BlockPos pos, BlockState state) { return getDefinition().getBlockEntityType().create(pos, state); } - - @Nullable - @Override - public BlockEntityTicker getTicker(Level level, BlockState state, - BlockEntityType blockEntityType) { - if (blockEntityType == getDefinition().getBlockEntityType()) { - if (!level.isClientSide) { - return (pLevel, pPos, pState, pTile) -> { - if (pTile instanceof MetaMachine metaMachine) { - metaMachine.serverTick(); - } - }; - } else { - return (pLevel, pPos, pState, pTile) -> { - if (pTile instanceof MetaMachine metaMachine) { - metaMachine.clientTick(); - } - }; - } - } - return null; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java index 9d51a646986..8e00946bc3b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java @@ -14,6 +14,7 @@ import com.gregtechceu.gtceu.api.pipenet.LevelPipeNet; import com.gregtechceu.gtceu.api.pipenet.PipeNet; import com.gregtechceu.gtceu.api.registry.registrate.provider.GTBlockstateProvider; +import com.gregtechceu.gtceu.api.sync_system.managed.ManagedSyncEntityBlock; import com.gregtechceu.gtceu.client.model.pipe.PipeModel; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.data.GTMaterialBlocks; @@ -43,7 +44,6 @@ import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityTicker; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; @@ -73,7 +73,7 @@ @MethodsReturnNonnullByDefault public abstract class PipeBlock & IPipeType, NodeDataType, WorldPipeNetType extends LevelPipeNet>> extends Block - implements EntityBlock, SimpleWaterloggedBlock { + implements ManagedSyncEntityBlock, SimpleWaterloggedBlock { public final PipeType pipeType; @@ -352,7 +352,7 @@ public InteractionResult use(BlockState state, Level level, BlockPos pos, Player } Set types = ToolHelper.getToolTypes(itemStack); - if ((!types.isEmpty() && ToolHelper.canUse(itemStack))) { + if ((!types.isEmpty() && ToolHelper.canUse(itemStack)) || (types.isEmpty() && player.isShiftKeyDown())) { var result = pipeBlockEntity.onToolClick(new ExtendedUseOnContext(player, hand, hit)); if (result.getSecond() == InteractionResult.CONSUME && player instanceof ServerPlayer serverPlayer) { ToolHelper.playToolSound(result.getFirst(), serverPlayer); @@ -436,22 +436,6 @@ public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, return getShapes(connections); } - @Nullable - @Override - public BlockEntityTicker getTicker(Level level, BlockState state, - BlockEntityType blockEntityType) { - if (blockEntityType == getBlockEntityType()) { - if (!level.isClientSide) { - return (pLevel, pPos, pState, pTile) -> { - if (pTile instanceof IPipeNode pipeNode) { - pipeNode.serverTick(); - } - }; - } - } - return null; - } - @Override public BlockState getAppearance(BlockState state, BlockAndTintGetter level, BlockPos pos, Direction side, @Nullable BlockState sourceState, @Nullable BlockPos sourcePos) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/RendererMaterialBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/RendererMaterialBlock.java deleted file mode 100644 index ddd25dd4e5c..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/block/RendererMaterialBlock.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.gregtechceu.gtceu.api.block; - -import com.gregtechceu.gtceu.api.data.chemical.material.Material; -import com.gregtechceu.gtceu.api.data.tag.TagPrefix; - -import com.lowdragmc.lowdraglib.client.renderer.IBlockRendererProvider; -import com.lowdragmc.lowdraglib.client.renderer.IRenderer; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -import org.jetbrains.annotations.Nullable; - -public class RendererMaterialBlock extends MaterialBlock implements IBlockRendererProvider { - - public final IRenderer renderer; - - public RendererMaterialBlock(Properties properties, TagPrefix tagPrefix, Material material, - @Nullable IRenderer renderer) { - super(properties, tagPrefix, material, false); - this.renderer = renderer; - } - - @Nullable - @Override - @OnlyIn(Dist.CLIENT) - public IRenderer getRenderer(BlockState state) { - return renderer; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/property/GTBlockStateProperties.java b/src/main/java/com/gregtechceu/gtceu/api/block/property/GTBlockStateProperties.java index 12c81cd9a26..0544288eba8 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/property/GTBlockStateProperties.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/property/GTBlockStateProperties.java @@ -6,8 +6,7 @@ public class GTBlockStateProperties { - public static final DirectionProperty UPWARDS_FACING = DirectionProperty.create("upwards_facing", - Direction.Plane.HORIZONTAL); + public static final DirectionProperty UPWARDS_FACING = DirectionProperty.create("upwards_facing"); public static final DirectionProperty NORTH_ONLY_FACING = DirectionProperty.create("facing", Direction.NORTH); public static final DirectionProperty VERTICAL_FACING = DirectionProperty.create("facing", Direction.Plane.VERTICAL); diff --git a/src/main/java/com/gregtechceu/gtceu/api/blockentity/ICopyable.java b/src/main/java/com/gregtechceu/gtceu/api/blockentity/ICopyable.java index 984e4f1892b..658e790cf40 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/blockentity/ICopyable.java +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/ICopyable.java @@ -10,9 +10,7 @@ public interface ICopyable { /// Saves the current config into a CompoundTag. - default CompoundTag copyConfig(CompoundTag tag) { - return tag; - } + default void copyConfig(CompoundTag tag) {} /// Loads a saved config from a CompoundTag and applies it to an existing object. default void pasteConfig(ServerPlayer player, CompoundTag tag) {} diff --git a/src/main/java/com/gregtechceu/gtceu/api/blockentity/IGregtechBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/blockentity/IGregtechBlockEntity.java index 821f057094f..2c62873c5e6 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/blockentity/IGregtechBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/IGregtechBlockEntity.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.api.blockentity; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; +import com.gregtechceu.gtceu.api.sync_system.managed.ISyncManaged; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java index 5742b0bee21..6b1e1c399e9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java @@ -5,22 +5,20 @@ import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.tag.TagPrefix; -import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.item.tool.IToolGridHighlight; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.pipenet.*; -import com.gregtechceu.gtceu.api.sync_system.ManagedSyncBlockEntity; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.managed.ManagedSyncBlockEntity; import com.gregtechceu.gtceu.common.data.GTMaterialBlocks; import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import com.gregtechceu.gtceu.utils.GTUtil; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; - import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -37,10 +35,12 @@ import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import brachy.modularui.drawable.UITexture; import com.mojang.datafixers.util.Pair; import lombok.Getter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.UnknownNullability; import java.util.ArrayList; import java.util.List; @@ -102,6 +102,11 @@ public long getOffsetTimer() { return level == null ? offset : (level.getServer().getTickCount() + offset); } + @Override + public @UnknownNullability Level getLevel() { + return super.getLevel(); + } + @Override public void setRemoved() { super.setRemoved(); @@ -255,8 +260,7 @@ public void setConnection(Direction side, boolean connected, boolean fromNeighbo if (cover != null && cover.canPipePassThrough()) return; } - connections = withSideConnection(connections, side, connected); - syncDataHolder.markClientSyncFieldDirty("connections"); + setConnections(withSideConnection(connections, side, connected)); updateNetworkConnection(side, connected); // notify neighbor of change so Auto Output updates its ticking status getLevel().neighborChanged(getBlockPos().relative(side), getPipeBlock(), getBlockPos()); @@ -323,13 +327,13 @@ public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, I return false; } - public ResourceTexture getPipeTexture(boolean isBlock) { - return isBlock ? GuiTextures.TOOL_PIPE_CONNECT : GuiTextures.TOOL_PIPE_BLOCK; + public UITexture getPipeTexture(boolean isBlock) { + return isBlock ? GTGuiTextures.TOOL_PIPE_CONNECT : GTGuiTextures.TOOL_PIPE_BLOCK; } @Override - public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { + public @Nullable UITexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, + ItemStack held, Direction side) { if (toolTypes.contains(getPipeTuneTool())) { if (player.isShiftKeyDown() && this.canHaveBlockedFaces()) { return getPipeTexture(isBlocked(side)); @@ -339,7 +343,7 @@ public ResourceTexture getPipeTexture(boolean isBlock) { } var cover = coverContainer.getCoverAtSide(side); if (cover != null) { - return cover.sideTips(player, pos, state, toolTypes, side); + return cover.sideTips(player, pos, state, toolTypes, held, side); } return null; } @@ -416,13 +420,35 @@ public static boolean isConnected(int connections, Direction side) { } @Override - public CompoundTag copyConfig(CompoundTag tag) { - return ICopyable.super.copyConfig(tag); + public void copyConfig(CompoundTag tag) { + tag.putInt("pipe_connections", getConnections()); + tag.putInt("pipe_blocked_connections", getBlockedConnections()); + + var coverTag = new CompoundTag(); + getCoverContainer().copyConfig(coverTag); + tag.put("cover", coverTag); } @Override public void pasteConfig(ServerPlayer player, CompoundTag tag) { - ICopyable.super.pasteConfig(player, tag); + if (tag.contains("pipe_connections")) { + var connections = tag.getInt("pipe_connections"); + + for (var dir : GTUtil.DIRECTIONS) { + if (isConnected(connections, dir)) setConnection(dir, true, false); + } + + } + if (tag.contains("pipe_blocked_connections")) { + var blockedConnections = tag.getInt("pipe_blocked_connections"); + + for (var dir : GTUtil.DIRECTIONS) { + if (isFaceBlocked(blockedConnections, dir)) setBlocked(dir, true); + } + + } + + getCoverContainer().pasteConfig(player, tag.getCompound("cover")); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapability.java b/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapability.java index fc3b3a420d2..f44b9961765 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapability.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapability.java @@ -1,6 +1,5 @@ package com.gregtechceu.gtceu.api.capability; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.common.capability.MedicalConditionTracker; import net.minecraftforge.common.capabilities.Capability; @@ -20,8 +19,6 @@ public class GTCapability { .get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_ELECTRIC_ITEM = CapabilityManager .get(new CapabilityToken<>() {}); - public static final Capability CAPABILITY_MAINTENANCE_MACHINE = CapabilityManager - .get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_LASER = CapabilityManager .get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_COMPUTATION_PROVIDER = CapabilityManager @@ -43,7 +40,6 @@ public static void register(RegisterCapabilitiesEvent event) { event.register(IWorkable.class); event.register(IControllable.class); event.register(IElectricItem.class); - event.register(IMaintenanceMachine.class); event.register(ILaserContainer.class); event.register(IOpticalComputationProvider.class); event.register(IDataAccessHatch.class); diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapabilityHelper.java b/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapabilityHelper.java index b8b78742232..55bf8be59de 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapabilityHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapabilityHelper.java @@ -1,6 +1,5 @@ package com.gregtechceu.gtceu.api.capability; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.common.capability.MedicalConditionTracker; import net.minecraft.core.BlockPos; @@ -75,11 +74,6 @@ public static IEnergyStorage getForgeEnergy(Level level, BlockPos pos, @Nullable return null; } - @Nullable - public static IMaintenanceMachine getMaintenanceMachine(Level level, BlockPos pos, @Nullable Direction side) { - return getBlockEntityCapability(GTCapability.CAPABILITY_MAINTENANCE_MACHINE, level, pos, side); - } - @Nullable public static ILaserContainer getLaser(Level level, BlockPos pos, @Nullable Direction side) { return getBlockEntityCapability(GTCapability.CAPABILITY_LASER, level, pos, side); diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java b/src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java index e775e766df1..c5d414781d0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java @@ -8,7 +8,7 @@ import com.gregtechceu.gtceu.api.cover.CoverDefinition; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.registry.GTRegistries; -import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; +import com.gregtechceu.gtceu.api.sync_system.managed.ISyncManaged; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.utils.GTUtil; @@ -305,7 +305,9 @@ private CompoundTag createCoverConfigTag(@Nullable CoverBehavior cover) { var tag = new CompoundTag(); tag.putString("id", GTRegistries.COVERS.getKey(cover.coverDefinition).toString()); tag.put("item", cover.getAttachItem().serializeNBT()); - tag.put("data", cover.copyConfig(new CompoundTag())); + var dataTag = new CompoundTag(); + cover.copyConfig(dataTag); + tag.put("data", dataTag); return tag; } @@ -323,12 +325,10 @@ private void applyCoverConfigTag(ServerPlayer player, Direction dir, CompoundTag } @Override - default CompoundTag copyConfig(CompoundTag tag) { + default void copyConfig(CompoundTag tag) { for (Direction dir : GTUtil.DIRECTIONS) { tag.put(dir.getName(), hasCover(dir) ? createCoverConfigTag(getCoverAtSide(dir)) : new CompoundTag()); } - - return tag; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/IMonitorComponent.java b/src/main/java/com/gregtechceu/gtceu/api/capability/IMonitorComponent.java index 002c650a187..b956dd6933f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/IMonitorComponent.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/IMonitorComponent.java @@ -1,10 +1,9 @@ package com.gregtechceu.gtceu.api.capability; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; - import net.minecraft.core.BlockPos; import net.minecraftforge.items.IItemHandler; +import brachy.modularui.api.drawable.IDrawable; import org.jetbrains.annotations.Nullable; public interface IMonitorComponent { @@ -13,7 +12,7 @@ default boolean isMonitor() { return false; } - IGuiTexture getComponentIcon(); + IDrawable getIcon(); BlockPos getBlockPos(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/IOpticalComputationReceiver.java b/src/main/java/com/gregtechceu/gtceu/api/capability/IOpticalComputationReceiver.java index 204a6c311ad..40259d0d91f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/IOpticalComputationReceiver.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/IOpticalComputationReceiver.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.api.capability; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableComputationContainer; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableComputationContainer; /** * Used in conjunction with {@link NotifiableComputationContainer}. diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/BlockStateRecipeCapability.java b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/BlockStateRecipeCapability.java index 5ff165fbddf..ab1370046e1 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/BlockStateRecipeCapability.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/BlockStateRecipeCapability.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.api.capability.recipe; +import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.recipe.content.SerializerBlockState; import net.minecraft.world.level.block.state.BlockState; @@ -9,7 +10,7 @@ public class BlockStateRecipeCapability extends RecipeCapability { public final static BlockStateRecipeCapability CAP = new BlockStateRecipeCapability(); protected BlockStateRecipeCapability() { - super("block_state", 0xFFABABAB, false, 5, SerializerBlockState.INSTANCE); + super(GTCEu.id("block_state"), 0xFFABABAB, false, 5, SerializerBlockState.INSTANCE); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/CWURecipeCapability.java b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/CWURecipeCapability.java index a5409ab7742..fb99a7d0188 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/CWURecipeCapability.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/CWURecipeCapability.java @@ -1,16 +1,10 @@ package com.gregtechceu.gtceu.api.capability.recipe; -import com.gregtechceu.gtceu.api.recipe.GTRecipe; -import com.gregtechceu.gtceu.api.recipe.content.Content; +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableComputationContainer; import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; import com.gregtechceu.gtceu.api.recipe.content.SerializerInteger; -import com.gregtechceu.gtceu.utils.FormattingUtil; - -import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.utils.LocalizationUtils; - -import org.apache.commons.lang3.mutable.MutableInt; import java.util.List; @@ -19,7 +13,7 @@ public class CWURecipeCapability extends RecipeCapability { public final static CWURecipeCapability CAP = new CWURecipeCapability(); protected CWURecipeCapability() { - super("cwu", 0xFFEEEE00, false, 3, SerializerInteger.INSTANCE); + super(GTCEu.id("cwu"), 0xFFEEEE00, false, 3, SerializerInteger.INSTANCE); } @Override @@ -33,17 +27,17 @@ public Integer copyWithModifier(Integer content, ContentModifier modifier) { } @Override - public void addXEIInfo(WidgetGroup group, int xOffset, GTRecipe recipe, List contents, boolean perTick, - boolean isInput, MutableInt yOffset) { - if (perTick) { - int cwu = contents.stream().map(Content::getContent).mapToInt(CWURecipeCapability.CAP::of).sum(); - group.addWidget(new LabelWidget(3 - xOffset, yOffset.addAndGet(10), - LocalizationUtils.format("gtceu.recipe.computation_per_tick", FormattingUtil.formatNumbers(cwu)))); - } - if (recipe.data.getBoolean("duration_is_total_cwu")) { - group.addWidget(new LabelWidget(3 - xOffset, yOffset.addAndGet(10), - LocalizationUtils.format("gtceu.recipe.total_computation", - FormattingUtil.formatNumbers(recipe.duration)))); - } + public boolean skipEmptyContentCheck() { + return true; + } + + public List getCapabilityHandlers(MetaMachine machine) { + return machine.getTraits(NotifiableComputationContainer.TYPE); + } + + @Override + public List getCapabilityHandlers(MetaMachine machine, IO io) { + return getCapabilityHandlers(machine).stream() + .filter(v -> v.getHandlerIO() == io).toList(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/EURecipeCapability.java b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/EURecipeCapability.java index c518228571c..4738c35b86e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/EURecipeCapability.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/EURecipeCapability.java @@ -1,7 +1,10 @@ package com.gregtechceu.gtceu.api.capability.recipe; +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IOverclockMachine; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableEnergyContainer; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.chance.logic.ChanceLogic; import com.gregtechceu.gtceu.api.recipe.content.Content; @@ -21,7 +24,7 @@ public class EURecipeCapability extends RecipeCapability { public final static EURecipeCapability CAP = new EURecipeCapability(); protected EURecipeCapability() { - super("eu", 0xFFFFFF00, false, 2, SerializerEnergyStack.INSTANCE); + super(GTCEu.id("eu"), 0xFFFFFF00, false, 2, SerializerEnergyStack.INSTANCE); } @Override @@ -61,7 +64,7 @@ public int limitMaxParallelByOutput(IRecipeCapabilityHolder holder, GTRecipe rec int maxMultiplier = multiplier; long totalEU = 0L; - for (var content : outputs) totalEU += of(content.content).getTotalEU(); + for (var content : outputs) totalEU += of(content.content()).getTotalEU(); if (totalEU != 0 && multiplier > Long.MAX_VALUE / totalEU) { maxMultiplier = multiplier = GTMath.saturatedCast(Long.MAX_VALUE / totalEU); } @@ -71,9 +74,9 @@ public int limitMaxParallelByOutput(IRecipeCapabilityHolder holder, GTRecipe rec for (var handler : handlers) { // noinspection unchecked eu = (List) handler.handleRecipe(IO.OUT, recipe, eu, true); - if (eu == null) break; + if (eu.isEmpty()) break; } - int[] bin = ParallelLogic.adjustMultiplier(eu == null, minMultiplier, multiplier, maxMultiplier); + int[] bin = ParallelLogic.adjustMultiplier(eu.isEmpty(), minMultiplier, multiplier, maxMultiplier); minMultiplier = bin[0]; multiplier = bin[1]; maxMultiplier = bin[2]; @@ -104,8 +107,8 @@ public int getMaxParallelByInput(IRecipeCapabilityHolder holder, GTRecipe recipe long nonConsumable = 0; long consumable = 0; for (Content content : inputs) { - EnergyStack s = of(content.content); - if (content.chance == 0) nonConsumable += s.getTotalEU(); + EnergyStack s = of(content.content()); + if (content.chance() == 0) nonConsumable += s.getTotalEU(); else consumable += s.getTotalEU(); } @@ -125,6 +128,17 @@ public int getMaxParallelByInput(IRecipeCapabilityHolder holder, GTRecipe recipe } } + @Override + public List getCapabilityHandlers(MetaMachine machine) { + return machine.getTraits(NotifiableEnergyContainer.TYPE); + } + + @Override + public List getCapabilityHandlers(MetaMachine machine, IO io) { + return getCapabilityHandlers(machine).stream() + .filter(v -> v.getHandlerIO() == io).toList(); + } + /** * Creates a {@code List} with the specified EU * @@ -133,7 +147,7 @@ public int getMaxParallelByInput(IRecipeCapabilityHolder holder, GTRecipe recipe */ public static List makeEUContent(EnergyStack eu) { return List.of( - new Content(eu, ChanceLogic.getMaxChancedValue(), ChanceLogic.getMaxChancedValue(), 0)); + new Content(eu, ChanceLogic.getMaxChancedValue(), ChanceLogic.getMaxChancedValue())); } /** diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/FluidRecipeCapability.java b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/FluidRecipeCapability.java index 8f2e15d80e7..84ff1b51b05 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/FluidRecipeCapability.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/FluidRecipeCapability.java @@ -1,49 +1,35 @@ package com.gregtechceu.gtceu.api.capability.recipe; -import com.gregtechceu.gtceu.api.gui.widget.TankWidget; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerGroup; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerGroupDistinctness; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerGroup; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerGroupDistinctness; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; import com.gregtechceu.gtceu.api.recipe.GTRecipe; -import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.recipe.content.Content; import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; import com.gregtechceu.gtceu.api.recipe.content.SerializerFluidIngredient; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; +import com.gregtechceu.gtceu.api.recipe.ingredient.IRangedIngredient; import com.gregtechceu.gtceu.api.recipe.ingredient.IntProviderFluidIngredient; import com.gregtechceu.gtceu.api.recipe.lookup.ingredient.AbstractMapIngredient; import com.gregtechceu.gtceu.api.recipe.lookup.ingredient.fluid.*; import com.gregtechceu.gtceu.api.recipe.modifier.ParallelLogic; -import com.gregtechceu.gtceu.api.recipe.ui.GTRecipeTypeUI; -import com.gregtechceu.gtceu.client.TooltipsHandler; import com.gregtechceu.gtceu.common.valueprovider.*; -import com.gregtechceu.gtceu.integration.xei.entry.fluid.FluidEntryList; -import com.gregtechceu.gtceu.integration.xei.entry.fluid.FluidStackList; -import com.gregtechceu.gtceu.integration.xei.entry.fluid.FluidTagList; -import com.gregtechceu.gtceu.integration.xei.handlers.fluid.CycleFluidEntryHandler; -import com.gregtechceu.gtceu.integration.xei.widgets.GTRecipeWidget; import com.gregtechceu.gtceu.utils.GTMath; -import com.lowdragmc.lowdraglib.gui.texture.ProgressTexture; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.jei.IngredientIO; - -import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.util.valueproviders.IntProvider; -import net.minecraft.world.item.TooltipFlag; import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.IFluidHandler; +import brachy.modularui.integration.recipeviewer.entry.fluid.FluidEntryList; +import brachy.modularui.integration.recipeviewer.entry.fluid.FluidStackList; +import brachy.modularui.integration.recipeviewer.entry.fluid.FluidTagList; import it.unimi.dsi.fastutil.objects.*; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.UnknownNullability; import org.jetbrains.annotations.Unmodifiable; import java.util.*; -import java.util.stream.Collectors; import static com.gregtechceu.gtceu.api.recipe.RecipeHelper.addToRecipeHandlerMap; @@ -52,7 +38,7 @@ public class FluidRecipeCapability extends RecipeCapability { public final static FluidRecipeCapability CAP = new FluidRecipeCapability(); protected FluidRecipeCapability() { - super("fluid", 0xFF3C70EE, true, 1, SerializerFluidIngredient.INSTANCE); + super(GTCEu.id("fluid"), 0xFF3C70EE, true, 1, SerializerFluidIngredient.INSTANCE); } @Override @@ -146,8 +132,11 @@ public int limitMaxParallelByOutput(IRecipeCapabilityHolder holder, GTRecipe rec int maxAmount = 0; List ingredients = new ArrayList<>(outputContents.size()); for (var content : outputContents) { - var ing = this.of(content.content); - maxAmount = Math.max(maxAmount, ing.getAmount()); + var ing = this.of(content.content()); + int amount; + if (ing instanceof IRangedIngredient provider) amount = provider.getMaxRoll(); + else amount = ing.getAmount(); + maxAmount = Math.max(maxAmount, amount); ingredients.add(ing); } if (maxAmount == 0) return multiplier; @@ -164,9 +153,9 @@ public int limitMaxParallelByOutput(IRecipeCapabilityHolder holder, GTRecipe rec for (var handler : handlers) { // noinspection unchecked copied = (List) handler.handleRecipe(IO.OUT, recipe, copied, true); - if (copied == null) break; + if (copied.isEmpty()) break; } - int[] bin = ParallelLogic.adjustMultiplier(copied == null, minMultiplier, multiplier, maxMultiplier); + int[] bin = ParallelLogic.adjustMultiplier(copied.isEmpty(), minMultiplier, multiplier, maxMultiplier); minMultiplier = bin[0]; multiplier = bin[1]; maxMultiplier = bin[2]; @@ -191,13 +180,13 @@ public int getMaxParallelByInput(IRecipeCapabilityHolder holder, GTRecipe recipe var nonConsumables = new Object2LongOpenHashMap(); var consumables = new Object2LongOpenHashMap(); for (Content content : inputs) { - FluidIngredient ing = of(content.content); + FluidIngredient ing = of(content.content()); int amount; - if (ing instanceof IntProviderFluidIngredient provider) amount = provider.getCountProvider().getMaxValue(); + if (ing instanceof IRangedIngredient provider) amount = provider.getMaxRoll(); else amount = ing.getAmount(); - if (content.chance == 0) { + if (content.chance() == 0) { nonConsumables.addTo(ing, amount); } else { boolean has = false; @@ -326,92 +315,11 @@ private static List> getInputContents(IRecipeCapabili return invs; } - @Override - public @NotNull List createXEIContainerContents(List contents, GTRecipe recipe, IO io) { - List entryLists = contents.stream() - .map(Content::getContent) - .map(this::of) - .map(FluidRecipeCapability::mapFluid) - .collect(Collectors.toList()); - - while (entryLists.size() < recipe.recipeType.getMaxOutputs(this)) entryLists.add(null); - return entryLists; - } - - public Object createXEIContainer(List contents) { - // cast is safe if you don't pass the wrong thing. - // noinspection unchecked - return new CycleFluidEntryHandler((List) contents); - } - - @NotNull - @Override - public Widget createWidget() { - TankWidget tank = new TankWidget(); - tank.initTemplate(); - tank.setFillDirection(ProgressTexture.FillDirection.ALWAYS_FULL); - return tank; - } - - @NotNull - @Override - public Class getWidgetClass() { - return TankWidget.class; - } - - @Override - public void applyWidgetInfo(@NotNull Widget widget, - int index, - boolean isXEI, - IO io, - GTRecipeTypeUI.@UnknownNullability("null when storage == null") RecipeHolder recipeHolder, - @NotNull GTRecipeType recipeType, - @UnknownNullability("null when content == null") GTRecipe recipe, - @Nullable Content content, - @Nullable Object storage, int recipeTier, int chanceTier) { - if (widget instanceof TankWidget tank) { - if (storage instanceof IFluidHandler fluidHandler) { - tank.setFluidTank(fluidHandler, index); - } - tank.setIngredientIO(io == IO.IN ? IngredientIO.INPUT : IngredientIO.OUTPUT); - tank.setAllowClickFilled(!isXEI); - tank.setAllowClickDrained(!isXEI && io.support(IO.IN)); - if (isXEI) tank.setShowAmount(false); - if (content != null) { - float chance = (float) recipeType.getChanceFunction() - .getBoostedChance(content, recipeTier, chanceTier) / content.maxChance; - tank.setXEIChance(chance); - tank.setOnAddedTooltips((w, tooltips) -> { - FluidIngredient ingredient = FluidRecipeCapability.CAP.of(content.content); - if (!isXEI && ingredient.getStacks().length > 0) { - FluidStack stack = ingredient.getStacks()[0]; - TooltipsHandler.appendFluidTooltips(stack, tooltips::add, TooltipFlag.NORMAL); - } - if (ingredient instanceof IntProviderFluidIngredient provider) { - IntProvider countProvider = provider.getCountProvider(); - tooltips.add(Component.translatable("gtceu.gui.content.fluid_range", - countProvider.getMinValue(), countProvider.getMaxValue()) - .withStyle(ChatFormatting.GOLD)); - } - GTRecipeWidget.setConsumedChance(content, - recipe.getChanceLogicForCapability(this, io, isTickSlot(index, io, recipe)), - tooltips, recipeTier, chanceTier, recipeType.getChanceFunction()); - if (isTickSlot(index, io, recipe)) { - tooltips.add(Component.translatable("gtceu.gui.content.per_tick")); - } - }); - if (io == IO.IN && (content.chance == 0)) { - tank.setIngredientIO(IngredientIO.CATALYST); - } - } - } - } - // Maps fluids to a FluidEntryList for XEI: either a FluidTagList or a FluidStackList - public static FluidEntryList mapFluid(FluidIngredient ingredient) { + public static FluidEntryList mapIngredientToEntryList(FluidIngredient ingredient) { int amount; - if (ingredient instanceof IntProviderFluidIngredient) { - amount = 1; + if (ingredient instanceof IRangedIngredient provider) { + amount = provider.getMaxRoll(); } else { amount = ingredient.getAmount(); } @@ -456,4 +364,15 @@ public interface ICustomParallel { public boolean shouldBypassDistinct() { return false; } + + @Override + public List getCapabilityHandlers(MetaMachine machine) { + return machine.getTraits(NotifiableFluidTank.TYPE); + } + + @SuppressWarnings("unchecked") + public List getCapabilityHandlers(MetaMachine machine, IO io) { + return getCapabilityHandlers(machine).stream() + .filter(v -> v.getHandlerIO() == io).toList(); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/IO.java b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/IO.java index 40a905e48e0..2bd2d1cf27d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/IO.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/IO.java @@ -1,30 +1,33 @@ package com.gregtechceu.gtceu.api.capability.recipe; -import com.gregtechceu.gtceu.api.gui.widget.EnumSelectorWidget; - -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; - +import brachy.modularui.drawable.UITexture; import lombok.Getter; /** * The capability can be input or output or both */ -public enum IO implements EnumSelectorWidget.SelectableEnum { +public enum IO { - IN("gtceu.io.import", "import"), - OUT("gtceu.io.export", "export"), - BOTH("gtceu.io.both", "both"), - NONE("gtceu.io.none", "none"); + IN("import"), + OUT("export"), + BOTH("both"), + NONE("none"); + public final String localeName; @Getter - public final String tooltip; - @Getter - public final IGuiTexture icon; + public final UITexture uiTexture; + + IO(String localeName) { + this.localeName = localeName; + this.uiTexture = UITexture.fullImage("gtceu:textures/gui/icon/io_mode/" + localeName + ".png"); + } + + public static String getTitle() { + return "gtceu.io.title"; + } - IO(String tooltip, String textureName) { - this.tooltip = tooltip; - this.icon = new ResourceTexture("gtceu:textures/gui/icon/io_mode/" + textureName + ".png"); + public String getTooltip() { + return "gtceu.io." + localeName; } public boolean support(IO io) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/IRecipeCapabilityHolder.java b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/IRecipeCapabilityHolder.java index 9b63ef2c806..dc456ce8069 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/IRecipeCapabilityHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/IRecipeCapabilityHolder.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.api.capability.recipe; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/IRecipeHandler.java b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/IRecipeHandler.java index 9787fa955ed..0d4cbdc1263 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/IRecipeHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/IRecipeHandler.java @@ -4,7 +4,6 @@ import it.unimi.dsi.fastutil.objects.ObjectArrayList; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.Comparator; import java.util.List; @@ -33,9 +32,10 @@ public interface IRecipeHandler extends IFilteredHandler { * @param simulate simulate. * @return left contents for continue handling by other proxies. *
- * null - nothing left. handling successful/finish. you should always return null as a handling-done mark. + * An empty list means nothing is left, i.e. handling finished successfully. Return the (now empty) input + * list as the handling-done mark. Returning {@code null} is not allowed. */ - @Nullable + @NotNull List handleRecipeInner(IO io, GTRecipe recipe, List left, boolean simulate); /** @@ -74,7 +74,7 @@ default K copyContent(Object content) { return getCapability().copyInner((K) content); } - default @Nullable List handleRecipe(IO io, GTRecipe recipe, List left, boolean simulate) { + default @NotNull List handleRecipe(IO io, GTRecipe recipe, List left, boolean simulate) { List contents = new ObjectArrayList<>(left.size()); for (Object leftObj : left) { contents.add(copyContent(leftObj)); diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/ItemRecipeCapability.java b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/ItemRecipeCapability.java index 239d8a9377b..3627dc87c22 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/ItemRecipeCapability.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/ItemRecipeCapability.java @@ -1,12 +1,12 @@ package com.gregtechceu.gtceu.api.capability.recipe; -import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerGroup; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerGroupDistinctness; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerGroup; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerGroupDistinctness; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; import com.gregtechceu.gtceu.api.recipe.GTRecipe; -import com.gregtechceu.gtceu.api.recipe.GTRecipeType; -import com.gregtechceu.gtceu.api.recipe.ResearchData; import com.gregtechceu.gtceu.api.recipe.content.Content; import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; import com.gregtechceu.gtceu.api.recipe.content.SerializerIngredient; @@ -16,39 +16,24 @@ import com.gregtechceu.gtceu.api.recipe.lookup.ingredient.AbstractMapIngredient; import com.gregtechceu.gtceu.api.recipe.lookup.ingredient.item.*; import com.gregtechceu.gtceu.api.recipe.modifier.ParallelLogic; -import com.gregtechceu.gtceu.api.recipe.ui.GTRecipeTypeUI; -import com.gregtechceu.gtceu.common.recipe.condition.ResearchCondition; import com.gregtechceu.gtceu.common.valueprovider.*; -import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.core.mixins.IngredientAccessor; import com.gregtechceu.gtceu.core.mixins.TagValueAccessor; import com.gregtechceu.gtceu.core.mixins.forge.IntersectionIngredientAccessor; -import com.gregtechceu.gtceu.integration.xei.entry.item.ItemEntryList; -import com.gregtechceu.gtceu.integration.xei.entry.item.ItemStackList; -import com.gregtechceu.gtceu.integration.xei.entry.item.ItemTagList; -import com.gregtechceu.gtceu.integration.xei.handlers.item.CycleItemEntryHandler; -import com.gregtechceu.gtceu.integration.xei.widgets.GTRecipeWidget; import com.gregtechceu.gtceu.utils.*; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.jei.IngredientIO; - -import net.minecraft.ChatFormatting; -import net.minecraft.network.chat.Component; -import net.minecraft.util.valueproviders.IntProvider; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; import net.minecraftforge.common.crafting.IntersectionIngredient; -import net.minecraftforge.items.IItemHandlerModifiable; +import brachy.modularui.integration.recipeviewer.entry.item.ItemEntryList; +import brachy.modularui.integration.recipeviewer.entry.item.ItemStackList; +import brachy.modularui.integration.recipeviewer.entry.item.ItemTagList; import it.unimi.dsi.fastutil.objects.*; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.UnknownNullability; import org.jetbrains.annotations.Unmodifiable; import java.util.*; -import java.util.stream.Collectors; import static com.gregtechceu.gtceu.api.recipe.RecipeHelper.addToRecipeHandlerMap; @@ -57,7 +42,7 @@ public class ItemRecipeCapability extends RecipeCapability { public final static ItemRecipeCapability CAP = new ItemRecipeCapability(); protected ItemRecipeCapability() { - super("item", 0xFFD96106, true, 0, SerializerIngredient.INSTANCE); + super(GTCEu.id("item"), 0xFFD96106, true, 0, SerializerIngredient.INSTANCE); } @Override @@ -163,7 +148,7 @@ public int limitMaxParallelByOutput(IRecipeCapabilityHolder holder, GTRecipe rec int maxCount = 0; List ingredients = new ArrayList<>(outputContents.size()); for (var content : outputContents) { - var ing = of(content.content); + var ing = of(content.content()); int count; if (ing instanceof SizedIngredient sized) count = sized.getAmount(); @@ -187,9 +172,9 @@ public int limitMaxParallelByOutput(IRecipeCapabilityHolder holder, GTRecipe rec for (var handler : handlers) { // noinspection unchecked copied = (List) handler.handleRecipe(IO.OUT, recipe, copied, true); - if (copied == null) break; + if (copied.isEmpty()) break; } - int[] bin = ParallelLogic.adjustMultiplier(copied == null, minMultiplier, multiplier, maxMultiplier); + int[] bin = ParallelLogic.adjustMultiplier(copied.isEmpty(), minMultiplier, multiplier, maxMultiplier); minMultiplier = bin[0]; multiplier = bin[1]; maxMultiplier = bin[2]; @@ -214,7 +199,7 @@ public int getMaxParallelByInput(IRecipeCapabilityHolder holder, GTRecipe recipe var nonConsumables = new Object2LongOpenHashMap(); var consumables = new Object2LongOpenHashMap(); for (Content content : inputs) { - Ingredient ing = of(content.content); + Ingredient ing = of(content.content()); if (ing instanceof IntCircuitIngredient) continue; int count; @@ -222,7 +207,7 @@ public int getMaxParallelByInput(IRecipeCapabilityHolder holder, GTRecipe recipe else if (ing instanceof IntProviderIngredient provider) count = provider.getCountProvider().getMaxValue(); else count = 1; - if (content.chance == 0) { + if (content.chance() == 0) { nonConsumables.addTo(ing, count); } else { boolean has = false; @@ -353,151 +338,8 @@ private static List> getInputContents(IRecipeCapabilit return invs; } - @Override - public @NotNull List createXEIContainerContents(List contents, GTRecipe recipe, IO io) { - List entryLists = contents.stream() - .map(Content::getContent) - .map(this::of) - .map(ItemRecipeCapability::mapItem) - .collect(Collectors.toList()); - - if (io == IO.OUT && recipe.recipeType.isScanner()) { - List scannerPossibilities = new ArrayList<>(); - // Scanner Output replacing, used for cycling research outputs - ResearchManager.ResearchItem researchData = null; - for (Content stack : recipe.getOutputContents(this)) { - ItemStack[] stacks = this.of(stack.content).getItems(); - if (stacks.length == 0 || stacks[0].isEmpty()) continue; - - researchData = ResearchManager.readResearchId(stacks[0]); - if (researchData != null) break; - } - if (researchData != null) { - Collection possibleRecipes = researchData.recipeType() - .getDataStickEntry(researchData.researchId()); - Set cache = new ObjectOpenCustomHashSet<>(ItemStackHashStrategy.comparingItem()); - if (possibleRecipes != null) { - for (GTRecipe r : possibleRecipes) { - var outputs = r.getOutputContents(this); - if (outputs.isEmpty()) continue; - - Content outputContent = outputs.get(0); - ItemStack[] stacks = this.of(outputContent.content).getItems(); - if (stacks.length == 0) continue; - - ItemStack researchStack = stacks[0]; - if (!researchStack.isEmpty() && !cache.contains(researchStack)) { - cache.add(researchStack); - scannerPossibilities.add(ItemStackList.of(researchStack.copyWithCount(1))); - } - } - } - scannerPossibilities.add(entryLists.get(0)); - entryLists = scannerPossibilities; - } - } - - while (entryLists.size() < recipe.recipeType.getMaxOutputs(this)) entryLists.add(null); - return entryLists; - } - - public Object createXEIContainer(List contents) { - // cast is safe if you don't pass the wrong thing. - // noinspection unchecked - return new CycleItemEntryHandler((List) contents); - } - - @NotNull - @Override - public Widget createWidget() { - SlotWidget slot = new SlotWidget(); - slot.initTemplate(); - return slot; - } - - @NotNull - @Override - public Class getWidgetClass() { - return SlotWidget.class; - } - - @Override - public void applyWidgetInfo(@NotNull Widget widget, - int index, - boolean isXEI, - IO io, - GTRecipeTypeUI.@UnknownNullability("null when storage == null") RecipeHolder recipeHolder, - @NotNull GTRecipeType recipeType, - @UnknownNullability("null when content == null") GTRecipe recipe, - @Nullable Content content, - @Nullable Object storage, int recipeTier, int chanceTier) { - if (widget instanceof SlotWidget slot) { - if (storage instanceof IItemHandlerModifiable items) { - if (index >= 0 && index < items.getSlots()) { - slot.setHandlerSlot(items, index); - slot.setIngredientIO(io == IO.IN ? IngredientIO.INPUT : IngredientIO.OUTPUT); - slot.setCanTakeItems(!isXEI); - slot.setCanPutItems(!isXEI && io.support(IO.IN)); - } - // 1 over container size. - // If in a recipe viewer and a research slot can be added, add it. - if (isXEI && recipeType.isHasResearchSlot() && index == items.getSlots()) { - if (ConfigHolder.INSTANCE.machines.enableResearch) { - ResearchCondition condition = recipeHolder.conditions().stream() - .filter(ResearchCondition.class::isInstance).findAny() - .map(ResearchCondition.class::cast).orElse(null); - if (condition != null) { - List dataItems = new ArrayList<>(); - for (ResearchData.ResearchEntry entry : condition.data) { - ItemStack dataStick = entry.getDataItem().copy(); - ResearchManager.writeResearchToNBT(dataStick.getOrCreateTag(), entry.getResearchId(), - recipeType); - dataItems.add(dataStick); - } - CycleItemEntryHandler handler = CycleItemEntryHandler.fromStacks(List.of(dataItems)); - slot.setHandlerSlot(handler, 0); - slot.setIngredientIO(IngredientIO.CATALYST); - slot.setCanTakeItems(false); - slot.setCanPutItems(false); - } - } - } - } - if (content != null) { - float chance = (float) recipeType.getChanceFunction() - .getBoostedChance(content, recipeTier, chanceTier) / content.maxChance; - slot.setXEIChance(chance); - slot.setOnAddedTooltips((w, tooltips) -> { - GTRecipeWidget.setConsumedChance(content, - recipe.getChanceLogicForCapability(this, io, isTickSlot(index, io, recipe)), - tooltips, recipeTier, chanceTier, recipeType.getChanceFunction()); - // spotless:off - if (this.of(content.content) instanceof IntProviderIngredient ingredient) { - IntProvider countProvider = ingredient.getCountProvider(); - tooltips.add(Component.translatable("gtceu.gui.content.count_range", - countProvider.getMinValue(), countProvider.getMaxValue()) - .withStyle(ChatFormatting.GOLD)); - } else if (this.of(content.content) instanceof SizedIngredient sizedIngredient && - sizedIngredient.getInner() instanceof IntProviderIngredient ingredient) { - IntProvider countProvider = ingredient.getCountProvider(); - tooltips.add(Component.translatable("gtceu.gui.content.count_range", - countProvider.getMinValue(), countProvider.getMaxValue()) - .withStyle(ChatFormatting.GOLD)); - } - // spotless:on - if (isTickSlot(index, io, recipe)) { - tooltips.add(Component.translatable("gtceu.gui.content.per_tick")); - } - }); - if (io == IO.IN && (content.chance == 0 || this.of(content.content) instanceof IntCircuitIngredient)) { - slot.setIngredientIO(IngredientIO.CATALYST); - } - } - } - } - // Maps ingredients to an ItemEntryList for XEI: either an ItemTagList or an ItemStackList - private static ItemEntryList mapItem(final Ingredient ingredient) { + public static ItemEntryList mapIngredientToEntryList(final Ingredient ingredient) { if (ingredient instanceof SizedIngredient sizedIngredient) { final int amount = sizedIngredient.getAmount(); var mapped = tryMapInner(sizedIngredient.getInner(), amount); @@ -544,7 +386,7 @@ private static ItemEntryList mapIntersection(final IntersectionIngredient inters List children = ((IntersectionIngredientAccessor) intersection).getChildren(); if (children.isEmpty()) return new ItemStackList(); - var childList = mapItem(children.get(0)); + var childList = mapIngredientToEntryList(children.get(0)); ItemStackList stackList = new ItemStackList(); for (var stack : childList.getStacks()) { if (children.stream().skip(1).allMatch(child -> child.test(stack))) { @@ -586,4 +428,14 @@ public interface ICustomParallel { public boolean shouldBypassDistinct() { return false; } + + @Override + public List getCapabilityHandlers(MetaMachine machine) { + return machine.getTraits(NotifiableItemStackHandler.TYPE); + } + + public List getCapabilityHandlers(MetaMachine machine, IO io) { + return getCapabilityHandlers(machine).stream() + .filter(v -> v.getHandlerIO() == io).toList(); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/RecipeCapability.java b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/RecipeCapability.java index 6d2a54badc1..4aa511e536c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/RecipeCapability.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/RecipeCapability.java @@ -1,29 +1,26 @@ package com.gregtechceu.gtceu.api.capability.recipe; +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableRecipeHandlerTrait; import com.gregtechceu.gtceu.api.recipe.GTRecipe; -import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.recipe.content.Content; import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; import com.gregtechceu.gtceu.api.recipe.content.IContentSerializer; import com.gregtechceu.gtceu.api.recipe.lookup.ingredient.AbstractMapIngredient; -import com.gregtechceu.gtceu.api.recipe.ui.GTRecipeTypeUI; import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.utils.codec.DispatchedMapCodec; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; - import net.minecraft.nbt.Tag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; +import net.minecraft.resources.ResourceLocation; import com.mojang.serialization.Codec; import io.netty.buffer.Unpooled; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; -import org.apache.commons.lang3.mutable.MutableInt; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Unmodifiable; @@ -40,21 +37,30 @@ public abstract class RecipeCapability { RecipeCapability::contentCodec); public static final Comparator> COMPARATOR = Comparator.comparingInt(o -> o.sortIndex); - public final String name; + public final ResourceLocation id; public final int color; public final boolean doRenderSlot; public final int sortIndex; public final IContentSerializer serializer; - protected RecipeCapability(String name, int color, boolean doRenderSlot, int sortIndex, + protected RecipeCapability(ResourceLocation id, int color, boolean doRenderSlot, int sortIndex, IContentSerializer serializer) { - this.name = name; + this.id = id; this.color = color; this.doRenderSlot = doRenderSlot; this.sortIndex = sortIndex; this.serializer = serializer; } + /** + * @deprecated Use {@link #RecipeCapability(ResourceLocation, int, boolean, int, IContentSerializer)} + */ + @Deprecated(forRemoval = true, since = "8.0.0") + protected RecipeCapability(String name, int color, boolean doRenderSlot, int sortIndex, + IContentSerializer serializer) { + this(GTCEu.id(name), color, doRenderSlot, sortIndex, serializer); + } + public static Codec> contentCodec(RecipeCapability capability) { return Content.codec(capability).listOf(); } @@ -97,15 +103,15 @@ public T of(Object o) { } public String slotName(IO io) { - return "%s_%s".formatted(name, io.name().toLowerCase(Locale.ROOT)); + return "%s_%s".formatted(id, io.name().toLowerCase(Locale.ROOT)); } public String slotName(IO io, int index) { - return "%s_%s_%s".formatted(name, io.name().toLowerCase(Locale.ROOT), index); + return "%s_%s_%s".formatted(id, io.name().toLowerCase(Locale.ROOT), index); } public MutableComponent getName() { - return Component.translatable("recipe.capability.%s.name".formatted(name)); + return Component.translatable("recipe.capability.%s.name".formatted(id.getPath())); } public MutableComponent getColoredName() { @@ -162,46 +168,6 @@ public int getMaxParallelByInput(IRecipeCapabilityHolder holder, GTRecipe recipe return Integer.MAX_VALUE; } - public boolean doAddGuiSlots() { - return isRecipeSearchFilter(); - } - - public void addXEIInfo(WidgetGroup group, int xOffset, GTRecipe recipe, List contents, boolean perTick, - boolean isInput, MutableInt yOffset) {} - - @NotNull - public List createXEIContainerContents(List contents, GTRecipe recipe, IO io) { - return new ArrayList<>(); - } - - @Nullable - public Object createXEIContainer(List contents) { - return null; - } - - @Nullable("null when getWidgetClass() == null") - public Widget createWidget() { - return null; - } - - /** - * Return the class of the supported widget that should be used to display this capability. - */ - @Nullable - public Class getWidgetClass() { - return null; - } - - public void applyWidgetInfo(@NotNull Widget widget, - int index, - boolean isXEI, - IO io, - @Nullable("null when storage == null") GTRecipeTypeUI.RecipeHolder recipeHolder, - @NotNull GTRecipeType recipeType, - @Nullable("null when content == null") GTRecipe recipe, - @Nullable Content content, - @Nullable Object storage, int recipeTier, int chanceTier) {} - /** * Create a cache map for chanced outputs * @@ -223,4 +189,35 @@ public boolean isTickSlot(int index, IO io, GTRecipe recipe) { public boolean shouldBypassDistinct() { return true; } + + /** + * Should handlers of this capability be tried even when {@link IRecipeHandler#getTotalContentAmount()} is zero? + * E.g. should this capability bypass the empty handler optimization for rate-based capabilities. + * for example: CWU, where stored amount is zero but the handler can still provide computation. + */ + public boolean skipEmptyContentCheck() { + return false; + } + + /** + * Gets all {@link NotifiableRecipeHandlerTrait} traits that can handle this capability. + * + * @param machine The machine to get traits from + * @return A list containing the traits + */ + public List> getCapabilityHandlers(MetaMachine machine) { + return List.of(); + } + + /** + * Gets all {@link NotifiableRecipeHandlerTrait} traits with a specific IO that can handle this capability. + * + * @param machine The machine to get traits from + * @param io The handler IO of the traits + * @return A list containing the traits + */ + public List> getCapabilityHandlers(MetaMachine machine, IO io) { + return getCapabilityHandlers(machine).stream() + .filter(v -> v.getHandlerIO() == io).toList(); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java b/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java index 0ffe41c6806..71ba21453d0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java @@ -2,23 +2,20 @@ import com.gregtechceu.gtceu.api.blockentity.ICopyable; import com.gregtechceu.gtceu.api.capability.ICoverable; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.factory.CoverUIFactory; -import com.gregtechceu.gtceu.api.gui.fancy.IFancyConfigurator; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.item.tool.IToolGridHighlight; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; +import com.gregtechceu.gtceu.api.mui.factory.CoverUIFactory; import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.managed.ISyncManaged; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.client.renderer.cover.ICoverRenderer; import com.gregtechceu.gtceu.client.renderer.cover.IDynamicCoverRenderer; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; - import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -30,6 +27,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.items.IItemHandlerModifiable; +import brachy.modularui.drawable.UITexture; import com.mojang.datafixers.util.Pair; import lombok.Getter; import org.jetbrains.annotations.MustBeInvokedByOverriders; @@ -98,6 +96,7 @@ public void onAttached(ItemStack itemStack, @Nullable ServerPlayer player) { attachItem = itemStack.copy(); attachItem.setCount(1); syncDataHolder.markClientSyncFieldDirty("attachItem"); + markAsChanged(); } public void onLoad() {} @@ -142,6 +141,9 @@ public boolean canConnectRedstone() { public final Pair<@Nullable GTToolType, InteractionResult> onToolClick(ExtendedUseOnContext context) { var toolType = context.getToolType(); + if (toolType.isEmpty() && context.getPlayer().isShiftKeyDown()) { + return Pair.of(null, onScrewdriverClick(context)); + } if (toolType.contains(GTToolType.SCREWDRIVER)) { return Pair.of(GTToolType.SCREWDRIVER, onScrewdriverClick(context)); } else if (toolType.contains(GTToolType.SOFT_MALLET)) { @@ -151,9 +153,9 @@ public boolean canConnectRedstone() { } public InteractionResult onScrewdriverClick(ExtendedUseOnContext context) { - if (this instanceof IUICover) { + if (this instanceof IMuiCover muiCover) { if (context.getPlayer() instanceof ServerPlayer serverPlayer) { - CoverUIFactory.INSTANCE.openUI(this, serverPlayer); + CoverUIFactory.INSTANCE.open(serverPlayer, muiCover); } return InteractionResult.sidedSuccess(coverHolder.isRemote()); } @@ -182,25 +184,21 @@ public boolean shouldRenderPlate() { return coverDefinition.getCoverRenderer(); } - public @Nullable IFancyConfigurator getConfigurator() { - return null; - } - @Override public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, ItemStack held, Set toolTypes) { return toolTypes.contains(GTToolType.CROWBAR) || - ((toolTypes.isEmpty() || toolTypes.contains(GTToolType.SCREWDRIVER)) && this instanceof IUICover); + ((toolTypes.isEmpty() || toolTypes.contains(GTToolType.SCREWDRIVER)) && this instanceof IMuiCover); } @Override - public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { + public @Nullable UITexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, + ItemStack held, Direction side) { if (toolTypes.contains(GTToolType.CROWBAR)) { - return GuiTextures.TOOL_REMOVE_COVER; + return GTGuiTextures.TOOL_REMOVE_COVER; } - if ((toolTypes.isEmpty() || toolTypes.contains(GTToolType.SCREWDRIVER)) && this instanceof IUICover) { - return GuiTextures.TOOL_COVER_SETTINGS; + if ((toolTypes.isEmpty() || toolTypes.contains(GTToolType.SCREWDRIVER)) && this instanceof IMuiCover) { + return GTGuiTextures.TOOL_COVER_SETTINGS; } return null; } @@ -213,7 +211,7 @@ public BlockState getAppearance(BlockState sourceState, BlockPos sourcePos) { return null; } - public Supplier getDynamicRenderer() { + public Supplier<@Nullable IDynamicCoverRenderer> getDynamicRenderer() { return () -> null; } diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/IMuiCover.java b/src/main/java/com/gregtechceu/gtceu/api/cover/IMuiCover.java new file mode 100644 index 00000000000..09e5eb3da35 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/IMuiCover.java @@ -0,0 +1,95 @@ +package com.gregtechceu.gtceu.api.cover; + +import com.gregtechceu.gtceu.api.mui.GTGuiScreen; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; +import com.gregtechceu.gtceu.common.mui.GTGuiTheme; +import com.gregtechceu.gtceu.common.mui.GTMuiWidgets; + +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import brachy.modularui.api.IUIHolder; +import brachy.modularui.factory.SidedPosGuiData; +import brachy.modularui.screen.ModularPanel; +import brachy.modularui.screen.ModularScreen; +import brachy.modularui.screen.UISettings; +import brachy.modularui.value.BoolValue; +import brachy.modularui.value.sync.EnumSyncValue; +import brachy.modularui.value.sync.PanelSyncManager; +import brachy.modularui.widgets.SlotGroupWidget; +import brachy.modularui.widgets.layout.Flow; + +public interface IMuiCover extends IUIHolder { + + default CoverBehavior self() { + return (CoverBehavior) this; + } + + default boolean isRemote() { + return self().coverHolder.isRemote(); + } + + default boolean isRemoved() { + return self().coverHolder.isRemoved() || self().coverHolder.getCoverAtSide(self().attachedSide) != self(); + } + + default GTGuiTheme getUITheme() { + return GTGuiTheme.COVER; + } + + @Override + @OnlyIn(Dist.CLIENT) + default ModularScreen createScreen(SidedPosGuiData data, ModularPanel mainPanel) { + return new GTGuiScreen(mainPanel); + } + + @Override + default ModularPanel buildUI(SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings) { + ModularPanel panel = ModularPanel.defaultPanel(this.self().coverDefinition.getId().getPath(), 176, 192 + 18); + ItemStack stack = this.self().coverHolder.getCoverAtSide(this.self().attachedSide).getAttachItem(); + panel.child(GTMuiWidgets.createTitleBar(() -> stack, 176, GTGuiTextures.BACKGROUND)); + + panel.coverChildrenHeight(); + + Flow column = Flow.column() + .margin(7) + .childPadding(2) + .widthRel(1.0f) + .coverChildrenHeight(); + + createCoverUIRows(column, data, syncManager, settings); + + column.child(SlotGroupWidget.playerInventory(0, false).marginTop(2)); + return panel.child(column); + } + + /** + * The default cover UI panel builds a single column with rows added by each cover. + */ + default void createCoverUIRows(Flow column, SidedPosGuiData data, PanelSyncManager syncManager, + UISettings settings) {} + + /* Helper methods for UI creation with covers that are commonly used */ + + /** + * The color used for Cover UI text. Available for reference, but is + * handled automatically by the {@link GTGuiTheme#COVER} theme. + */ + int UI_TEXT_COLOR = 0xFF555555; + + default Flow coverUIRow() { + return Flow.row() + .coverChildrenHeight() + .widthRel(1f) + .childPadding(2); + } + + /** + * Get a BoolValue for use with toggle buttons which are "linked together," + * meaning only one of them can be pressed at a time. + */ + default > BoolValue.Dynamic boolValueOf(EnumSyncValue syncValue, T value) { + return new BoolValue.Dynamic(() -> syncValue.getValue() == value, $ -> syncValue.setValue(value)); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/IUICover.java b/src/main/java/com/gregtechceu/gtceu/api/cover/IUICover.java deleted file mode 100644 index 93d85bd74f5..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/IUICover.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.gregtechceu.gtceu.api.cover; - -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.UITemplate; - -import com.lowdragmc.lowdraglib.gui.modular.IUIHolder; -import com.lowdragmc.lowdraglib.gui.modular.ModularUI; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.utils.Position; - -import net.minecraft.world.entity.player.Player; - -public interface IUICover extends IUIHolder { - - default CoverBehavior self() { - return (CoverBehavior) this; - } - - @Override - default boolean isInvalid() { - return self().coverHolder.isRemoved() || self().coverHolder.getCoverAtSide(self().attachedSide) != self(); - } - - @Override - default boolean isRemote() { - return self().coverHolder.isRemote(); - } - - @Override - default ModularUI createUI(Player entityPlayer) { - var widget = createUIWidget(); - var size = widget.getSize(); - widget.setSelfPosition(new Position((176 - size.width) / 2, 0)); - var modularUI = new ModularUI(176, size.height + 82, this, entityPlayer) - .background(GuiTextures.BACKGROUND) - .widget(widget) - .widget(UITemplate.bindPlayerInventory(entityPlayer.getInventory(), GuiTextures.SLOT, 7, size.height, - true)); - modularUI.registerCloseListener(this::onUIClosed); - return modularUI; - } - - default void onUIClosed() {} - - Widget createUIWidget(); - - @Override - default void markAsDirty() {} -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filter.java index 304aef62395..5d99eb8a533 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filter.java @@ -1,15 +1,43 @@ package com.gregtechceu.gtceu.api.cover.filter; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; +import com.gregtechceu.gtceu.common.mui.GTMuiWidgets; import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; + +import brachy.modularui.factory.GuiData; +import brachy.modularui.screen.ModularPanel; +import brachy.modularui.screen.UISettings; +import brachy.modularui.value.sync.PanelSyncManager; +import brachy.modularui.widgets.Dialog; +import brachy.modularui.widgets.SlotGroupWidget; +import brachy.modularui.widgets.layout.Flow; import java.util.function.Consumer; import java.util.function.Predicate; public interface Filter> extends Predicate { - WidgetGroup openConfigurator(int x, int y); + /** + * @return Filter panel when opened by itself (including the player inventory) + */ + default ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISettings settings, + boolean showPlayerInventory) { + return new Dialog<>(getFilterItem().getItem().toString()) + .disablePanelsBelow(false) + .draggable(true) + .coverChildrenHeight() + .child(GTMuiWidgets.createTitleBar(this::getFilterItem, 176, GTGuiTextures.BACKGROUND)) + .child(Flow.col().coverChildrenHeight() + .child(getFilterUI(data, syncManager, settings).marginTop(10).marginBottom(10)) + .childIf(showPlayerInventory, + () -> SlotGroupWidget.playerInventory(false).marginLeft(7).marginBottom(7))); + } + + ItemStack getFilterItem(); + + Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings); CompoundTag saveFilter(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java index 73b7f459616..df77f1961dc 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java @@ -2,20 +2,14 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.cover.CoverBehavior; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.machine.MachineCoverContainer; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.managed.ISyncManaged; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; -import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; - import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.item.ItemStack; @@ -43,40 +37,24 @@ public abstract class FilterHandler> implements ISyncM private @Nullable F filter; private @Nullable CustomItemStackHandler filterSlot; - private @Nullable WidgetGroup filterGroup; private @NotNull Consumer onFilterLoaded = (filter) -> {}; - private @NotNull Consumer onFilterRemoved = (filter) -> {}; + private @NotNull Runnable onFilterRemoved = () -> {}; private @NotNull Consumer onFilterUpdated = (filter) -> {}; public FilterHandler(ISyncManaged container) { this.container = container; } - protected abstract F loadFilter(ItemStack filterItem); + public abstract F loadFilter(ItemStack filterItem); protected abstract F getEmptyFilter(); - protected abstract boolean canInsertFilterItem(ItemStack itemStack); - ////////////////////////////////// // ***** PUBLIC API ******// ////////////////////////////////// - public Widget createFilterSlotUI(int xPos, int yPos) { - return new SlotWidget(getFilterSlot(), 0, xPos, yPos) - .setChangeListener(this::updateFilter) - .setBackgroundTexture(new GuiTextureGroup(GuiTextures.SLOT, GuiTextures.FILTER_SLOT_OVERLAY)); - } - - public Widget createFilterConfigUI(int xPos, int yPos, int width, int height) { - this.filterGroup = new WidgetGroup(xPos, yPos, width, height); - if (!this.filterItem.isEmpty()) { - this.filterGroup.addWidget(getFilter().openConfigurator(0, 0)); - } - - return this.filterGroup; - } + public abstract boolean canInsertFilterItem(ItemStack itemStack); public boolean isFilterPresent() { return filter != null || !filterItem.isEmpty(); @@ -103,7 +81,7 @@ public FilterHandler onFilterLoaded(Consumer onFilterLoaded) { return this; } - public FilterHandler onFilterRemoved(Consumer onFilterRemoved) { + public FilterHandler onFilterRemoved(Runnable onFilterRemoved) { this.onFilterRemoved = onFilterRemoved; return this; } @@ -117,7 +95,7 @@ public FilterHandler onFilterUpdated(Consumer onFilterUpdated) { // ***** FILTER HANDLING ******// /////////////////////////////////////// - private CustomItemStackHandler getFilterSlot() { + public CustomItemStackHandler getFilterSlot() { if (this.filterSlot == null) { this.filterSlot = new CustomItemStackHandler(this.filterItem) { @@ -128,6 +106,7 @@ public int getSlotLimit(int slot) { }; this.filterSlot.setFilter(this::canInsertFilterItem); + this.filterSlot.setOnContentsChanged(this::updateFilter); } return this.filterSlot; @@ -135,7 +114,6 @@ public int getSlotLimit(int slot) { public void setFilterItem(ItemStack item) { getFilterSlot().setStackInSlot(0, item); - updateFilter(); } private void updateFilter() { @@ -152,7 +130,7 @@ private void updateFilter() { if (this.filter != null) { this.filter = null; - this.onFilterRemoved.accept(this.filter); + this.onFilterRemoved.run(); } loadFilterFromItem(); @@ -172,18 +150,6 @@ private void loadFilterFromItem() { } this.onFilterLoaded.accept(this.filter); } - updateFilterGroupUI(); - } - - private void updateFilterGroupUI() { - if (this.filterGroup == null) - return; - - this.filterGroup.clearAllWidgets(); - - if (!this.filterItem.isEmpty() && this.filter != null) { - this.filterGroup.addWidget(this.filter.openConfigurator(0, 0)); - } } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandlers.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandlers.java index cb269e0aa23..0c776f14a7b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandlers.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandlers.java @@ -1,17 +1,22 @@ package com.gregtechceu.gtceu.api.cover.filter; -import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; +import com.gregtechceu.gtceu.api.sync_system.managed.ISyncManaged; +import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.item.ItemStack; import net.minecraftforge.fluids.FluidStack; +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault public interface FilterHandlers { static FilterHandler item(ISyncManaged container) { return new FilterHandler<>(container) { @Override - protected ItemFilter loadFilter(ItemStack filterItem) { + public ItemFilter loadFilter(ItemStack filterItem) { return ItemFilter.loadFilter(filterItem); } @@ -21,7 +26,7 @@ protected ItemFilter getEmptyFilter() { } @Override - protected boolean canInsertFilterItem(ItemStack itemStack) { + public boolean canInsertFilterItem(ItemStack itemStack) { return ItemFilter.FILTERS.containsKey(itemStack.getItem()); } }; @@ -31,7 +36,7 @@ static FilterHandler fluid(ISyncManaged container) { return new FilterHandler<>(container) { @Override - protected FluidFilter loadFilter(ItemStack filterItem) { + public FluidFilter loadFilter(ItemStack filterItem) { return FluidFilter.loadFilter(filterItem); } @@ -41,7 +46,7 @@ protected FluidFilter getEmptyFilter() { } @Override - protected boolean canInsertFilterItem(ItemStack itemStack) { + public boolean canInsertFilterItem(ItemStack itemStack) { return FluidFilter.FILTERS.containsKey(itemStack.getItem()); } }; diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FluidFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FluidFilter.java index 9a8a09fb68e..b2dbab9ea9b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FluidFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FluidFilter.java @@ -1,12 +1,14 @@ package com.gregtechceu.gtceu.api.cover.filter; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; - import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ItemLike; import net.minecraftforge.fluids.FluidStack; +import brachy.modularui.factory.GuiData; +import brachy.modularui.screen.UISettings; +import brachy.modularui.value.sync.PanelSyncManager; +import brachy.modularui.widgets.layout.Flow; import org.apache.commons.lang3.NotImplementedException; import java.util.HashMap; @@ -54,8 +56,13 @@ public int testFluidAmount(FluidStack fluidStack) { } @Override - public WidgetGroup openConfigurator(int x, int y) { - throw new NotImplementedException("Not available for empty fluid filter"); + public ItemStack getFilterItem() { + return null; + } + + @Override + public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { + return null; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/ItemFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/ItemFilter.java index 73e24344dc7..74ba62b0b29 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/ItemFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/ItemFilter.java @@ -1,11 +1,13 @@ package com.gregtechceu.gtceu.api.cover.filter; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; - import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ItemLike; +import brachy.modularui.factory.GuiData; +import brachy.modularui.screen.UISettings; +import brachy.modularui.value.sync.PanelSyncManager; +import brachy.modularui.widgets.layout.Flow; import org.apache.commons.lang3.NotImplementedException; import java.util.HashMap; @@ -53,8 +55,13 @@ public boolean test(ItemStack itemStack) { } @Override - public WidgetGroup openConfigurator(int x, int y) { - throw new NotImplementedException("Not available for empty item filter"); + public ItemStack getFilterItem() { + return null; + } + + @Override + public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { + return null; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleFluidFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleFluidFilter.java index d2c6610a644..4c24f5a93a4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleFluidFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleFluidFilter.java @@ -1,11 +1,8 @@ package com.gregtechceu.gtceu.api.cover.filter; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.widget.ScrollablePhantomFluidWidget; -import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; - -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +import com.gregtechceu.gtceu.common.data.GTItems; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.nbt.CompoundTag; @@ -14,6 +11,15 @@ import net.minecraft.world.item.ItemStack; import net.minecraftforge.fluids.FluidStack; +import brachy.modularui.factory.GuiData; +import brachy.modularui.screen.UISettings; +import brachy.modularui.value.sync.BooleanSyncValue; +import brachy.modularui.value.sync.FluidSlotSyncHandler; +import brachy.modularui.value.sync.PanelSyncManager; +import brachy.modularui.widgets.ToggleButton; +import brachy.modularui.widgets.layout.Flow; +import brachy.modularui.widgets.layout.Grid; +import brachy.modularui.widgets.slot.FluidSlot; import lombok.Getter; import java.util.Arrays; @@ -38,9 +44,17 @@ public class SimpleFluidFilter implements FluidFilter { @Getter protected int maxStackSize = 1; - private CustomFluidTank[] fluidStorageSlots = new CustomFluidTank[9]; + private final CustomFluidTank[] fluidStorageSlots = new CustomFluidTank[9]; protected SimpleFluidFilter() { + for (int i = 0; i < 9; i++) { + int finalI = i; + fluidStorageSlots[i] = new CustomFluidTank(64000); + fluidStorageSlots[i].setOnContentsChanged(() -> { + matches[finalI] = fluidStorageSlots[finalI].getFluid(); + onUpdated.accept(this); + }); + } Arrays.fill(matches, FluidStack.EMPTY); } @@ -56,6 +70,7 @@ private static SimpleFluidFilter loadFilter(CompoundTag tag, Consumer fluidStorageSlots[index].getFluid(), - (fluid) -> fluidStorageSlots[index].setFluid(fluid)) { - - @Override - public void updateScreen() { - super.updateScreen(); - setShowAmount(maxStackSize > 1L); - } - - @Override - public void detectAndSendChanges() { - super.detectAndSendChanges(); - setShowAmount(maxStackSize > 1L); - } - }; - - tank.setChangeListener(() -> { - matches[index] = fluidStorageSlots[index].getFluidInTank(0); - onUpdated.accept(this); - }).setBackground(GuiTextures.SLOT); - - group.addWidget(tank); - } + @Override + public ItemStack getFilterItem() { + return GTItems.FLUID_FILTER.asStack(); + } + + public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { + for (int i = 0; i < 9; i++) { + syncManager.syncValue("filter_slot_" + i, + new FluidSlotSyncHandler(fluidStorageSlots[i]).controlsAmount(true).phantom(true)); } - group.addWidget(new ToggleButtonWidget(18 * 3 + 5, 0, 20, 20, - GuiTextures.BUTTON_BLACKLIST, this::isBlackList, this::setBlackList)); - group.addWidget(new ToggleButtonWidget(18 * 3 + 5, 20, 20, 20, - GuiTextures.BUTTON_FILTER_NBT, this::isIgnoreNbt, this::setIgnoreNbt)); - return group; + + Grid filterGrid = new Grid() + .coverChildren() + .gridOfSizeWidth(9, 3, (x, y, i) -> new FluidSlot().syncHandler("filter_slot_" + i)); + + BooleanSyncValue blacklist = new BooleanSyncValue(this::isBlackList, this::setBlackList).allowC2S(); + syncManager.syncValue("blacklist", blacklist); + + BooleanSyncValue ignoreNBT = new BooleanSyncValue(this::isIgnoreNbt, this::setIgnoreNbt).allowC2S(); + syncManager.syncValue("ignoreNBT", ignoreNBT); + + Flow filterConfigButtons = Flow.col() + .coverChildren() + .child(new ToggleButton().stateBackground(GTGuiTextures.BUTTON_BLACKLIST).syncHandler("blacklist")) + .child(new ToggleButton().stateBackground(GTGuiTextures.BUTTON_IGNORE_NBT).syncHandler("ignoreNBT")); + return Flow.row() + .coverChildrenHeight() + .child(filterGrid.horizontalCenter()) + .child(filterConfigButtons.marginLeft(118)); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleItemFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleItemFilter.java index 408a6656687..7988824949e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleItemFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleItemFilter.java @@ -1,20 +1,28 @@ package com.gregtechceu.gtceu.api.cover.filter; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.widget.PhantomSlotWidget; -import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; +import com.gregtechceu.gtceu.common.data.GTItems; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.utils.GTUtil; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; - import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; import net.minecraft.world.item.ItemStack; +import brachy.modularui.factory.GuiData; +import brachy.modularui.screen.UISettings; +import brachy.modularui.value.sync.BooleanSyncValue; +import brachy.modularui.value.sync.PanelSyncManager; +import brachy.modularui.value.sync.PhantomItemSlotSyncHandler; +import brachy.modularui.widgets.ToggleButton; +import brachy.modularui.widgets.layout.Flow; +import brachy.modularui.widgets.layout.Grid; +import brachy.modularui.widgets.slot.ModularSlot; +import brachy.modularui.widgets.slot.PhantomItemSlot; import lombok.Getter; +import org.jetbrains.annotations.NotNull; import java.util.Arrays; import java.util.function.Consumer; @@ -97,42 +105,82 @@ public void setIgnoreNbt(boolean ingoreNbt) { onUpdated.accept(this); } - public WidgetGroup openConfigurator(int x, int y) { - WidgetGroup group = new WidgetGroup(x, y, 18 * 3 + 25, 18 * 3); // 80 55 - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 3; j++) { - final int index = i * 3 + j; + @Override + public ItemStack getFilterItem() { + return GTItems.ITEM_FILTER.asStack(); + } - var handler = new CustomItemStackHandler(matches[index]); + @Override + public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { + FilterItemStackHandler handler = new FilterItemStackHandler(matches, this); + + Grid filterGrid = new Grid() + .coverChildren() + .gridOfSizeWidth(9, 3, (x, y, i) -> new PhantomItemSlot() + .size(16) + .syncHandler(new PhantomItemSlotSyncHandler(new ModularSlot(handler, i) + .ignoreMaxStackSize(true).accessibility(true, false)))); + + BooleanSyncValue blacklist = new BooleanSyncValue(this::isBlackList, this::setBlackList).allowC2S(); + syncManager.syncValue("blacklist", blacklist); + + BooleanSyncValue ignoreNBT = new BooleanSyncValue(this::isIgnoreNbt, this::setIgnoreNbt).allowC2S(); + syncManager.syncValue("ignoreNBT", ignoreNBT); + + Flow filterConfigButtons = Flow.col() + .coverChildren() + .child(new ToggleButton().stateBackground(GTGuiTextures.BUTTON_BLACKLIST).syncHandler("blacklist")) + .child(new ToggleButton().stateBackground(GTGuiTextures.BUTTON_IGNORE_NBT).syncHandler("ignoreNBT")); + return Flow.row() + .coverChildrenHeight() + .child(filterGrid.horizontalCenter()) + .child(filterConfigButtons.marginLeft(118)); + } - var slot = new PhantomSlotWidget(handler, 0, i * 18, j * 18) { + public static class FilterItemStackHandler extends CustomItemStackHandler { - @Override - public void updateScreen() { - super.updateScreen(); - setMaxStackSize(maxStackSize); - } + private final ItemStack[] matches; + private final SimpleItemFilter filter; - @Override - public void detectAndSendChanges() { - super.detectAndSendChanges(); - setMaxStackSize(maxStackSize); - } - }; + public FilterItemStackHandler(SimpleItemFilter filter) { + this(filter.matches, filter); + } - slot.setChangeListener(() -> { - matches[index] = handler.getStackInSlot(0); - onUpdated.accept(this); - }).setBackground(GuiTextures.SLOT); + public FilterItemStackHandler(ItemStack[] matches, SimpleItemFilter simpleItemFilter) { + super(matches.length); + this.matches = matches; + this.filter = simpleItemFilter; + } - group.addWidget(slot); + @Override + public @NotNull ItemStack getStackInSlot(int slot) { + return matches[slot]; + } + + @Override + protected int getStackLimit(int slot, @NotNull ItemStack stack) { + return 1; + } + + @Override + public @NotNull ItemStack extractItem(int slot, int amount, boolean simulate) { + if (amount >= matches[slot].getCount()) { + matches[slot] = ItemStack.EMPTY; } + return matches[slot]; + } + + @Override + public @NotNull ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) { + return stack; + } + + @Override + public void setStackInSlot(int slot, @NotNull ItemStack stack) { + super.setStackInSlot(slot, stack); + matches[slot] = stack.copyWithCount(1); + filter.onUpdated.accept(filter); } - group.addWidget(new ToggleButtonWidget(18 * 3 + 5, 0, 20, 20, - GuiTextures.BUTTON_BLACKLIST, this::isBlackList, this::setBlackList)); - group.addWidget(new ToggleButtonWidget(18 * 3 + 5, 20, 20, 20, - GuiTextures.BUTTON_FILTER_NBT, this::isIgnoreNbt, this::setIgnoreNbt)); - return group; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java index c26624f1c2d..f1af35b8e81 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java @@ -1,22 +1,38 @@ package com.gregtechceu.gtceu.api.cover.filter; +import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; -import com.gregtechceu.gtceu.api.gui.widget.EnumSelectorWidget; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.recipe.content.Content; +import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; import com.gregtechceu.gtceu.utils.ItemStackHashStrategy; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; - import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; +import brachy.modularui.api.drawable.Text; +import brachy.modularui.api.value.IBoolValue; +import brachy.modularui.drawable.ColorType; +import brachy.modularui.drawable.DynamicDrawable; +import brachy.modularui.drawable.GuiTextures; +import brachy.modularui.drawable.UITexture; +import brachy.modularui.factory.GuiData; +import brachy.modularui.screen.UISettings; +import brachy.modularui.value.BoolValue; +import brachy.modularui.value.sync.EnumSyncValue; +import brachy.modularui.value.sync.PanelSyncManager; +import brachy.modularui.widgets.ListWidget; +import brachy.modularui.widgets.ToggleButton; +import brachy.modularui.widgets.layout.Flow; +import brachy.modularui.widgets.menu.ContextMenuButton; +import brachy.modularui.widgets.menu.Menu; import it.unimi.dsi.fastutil.objects.Object2IntOpenCustomHashMap; +import lombok.Getter; +import java.util.Arrays; import java.util.Collections; import java.util.function.Consumer; @@ -25,6 +41,7 @@ public class SmartItemFilter implements ItemFilter { protected Consumer itemWriter = filter -> {}; protected Consumer onUpdated = filter -> itemWriter.accept(filter); + @Getter private SmartFilteringMode filterMode = SmartFilteringMode.ELECTROLYZER; protected SmartItemFilter() {} @@ -40,6 +57,11 @@ private static SmartItemFilter loadFilter(CompoundTag tag, Consumer return handler; } + @Override + public ItemStack getFilterItem() { + return GTItems.SMART_ITEM_FILTER.asStack(); + } + @Override public void setOnUpdated(Consumer onUpdated) { this.onUpdated = filter -> { @@ -69,11 +91,39 @@ private void setFilterMode(SmartFilteringMode filterMode) { } @Override - public WidgetGroup openConfigurator(int x, int y) { - WidgetGroup group = new WidgetGroup(x, y, 18 * 3 + 25, 18 * 3); - group.addWidget(new EnumSelectorWidget<>(16, 8, 32, 32, - SmartFilteringMode.VALUES, filterMode, this::setFilterMode)); - return group; + public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { + EnumSyncValue mode = new EnumSyncValue<>(SmartFilteringMode.class, + this::getFilterMode, this::setFilterMode).allowC2S(); + + syncManager.syncValue("mode", mode); + + return Flow.row().coverChildrenHeight().width(162) + .child(new ContextMenuButton<>("smart_filter") + .size(18) + .requiresClick() + .tooltip(r -> r.add(Text.str("Set Machine Recipe Type"))) + .openRightDown() + .overlay(new DynamicDrawable(() -> SmartFilteringMode.getTextures()[mode.getIntValue()])) + .menu(new Menu<>() + .width(20) + .coverChildrenHeight() + .padding(2) + .child(new ListWidget<>() + .maxSize(SmartFilteringMode.VALUES.length * 20) + .widthRel(1.f) + .children(SmartFilteringMode.VALUES.length, w -> { + IBoolValue bsv = new BoolValue.Dynamic(() -> mode.getIntValue() == w, + bool -> mode.setIntValue(w)); + + return new ToggleButton() + .overlay(SmartFilteringMode.getTextures()[w]) + .background(GuiTextures.MC_BUTTON) + .background(true, GuiTextures.MC_BUTTON) + .value(bsv) + .tooltip(r -> r.add(Text.comp(Component + .translatable(SmartFilteringMode.VALUES[w].getTooltip())))); + })))) + .child(Text.str("Recipe Type").asWidget().verticalCenter().rightRel(0.f)); } @Override @@ -94,7 +144,7 @@ private int lookup(ItemStack itemStack) { return 0; } for (Content content : recipe.getInputContents(ItemRecipeCapability.CAP)) { - var stacks = ItemRecipeCapability.CAP.of(content.getContent()).getItems(); + var stacks = ItemRecipeCapability.CAP.of(content.content()).getItems(); for (var stack : stacks) { if (ItemStack.isSameItem(stack, itemStack)) return stack.getCount(); } @@ -112,7 +162,7 @@ public void setModeFromMachine(String machineName) { } @MethodsReturnNonnullByDefault - private enum SmartFilteringMode implements EnumSelectorWidget.SelectableEnum { + private enum SmartFilteringMode { ELECTROLYZER("electrolyzer", GTRecipeTypes.ELECTROLYZER_RECIPES), CENTRIFUGE("centrifuge", GTRecipeTypes.CENTRIFUGE_RECIPES), @@ -129,14 +179,15 @@ private enum SmartFilteringMode implements EnumSelectorWidget.SelectableEnum { this.recipeType = type; } - @Override public String getTooltip() { return "cover.item_smart_filter.filtering_mode." + localeName; } - @Override - public IGuiTexture getIcon() { - return new ResourceTexture("gtceu:textures/block/machines/" + localeName + "/overlay_front.png"); + public static UITexture[] getTextures() { + return Arrays.stream(VALUES) + .map(v -> UITexture.fullImage(GTCEu.MOD_ID, + "textures/block/machines/" + v.localeName + "/overlay_front.png", ColorType.DEFAULT)) + .toArray(UITexture[]::new); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java index ff3e47febbd..05fac76617a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java @@ -1,31 +1,25 @@ package com.gregtechceu.gtceu.api.cover.filter; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.data.lang.LangUtil; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.utils.TagExprFilter; -import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; -import com.lowdragmc.lowdraglib.gui.widget.TextFieldWidget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; - import net.minecraft.nbt.CompoundTag; +import brachy.modularui.factory.GuiData; +import brachy.modularui.screen.RichTooltip; +import brachy.modularui.screen.UISettings; +import brachy.modularui.value.sync.PanelSyncManager; +import brachy.modularui.value.sync.StringSyncValue; +import brachy.modularui.widgets.layout.Flow; +import brachy.modularui.widgets.textfield.TextFieldWidget; import lombok.Getter; import java.util.function.Consumer; -import java.util.regex.Pattern; public abstract class TagFilter> implements Filter { - private static final Pattern DOUBLE_WILDCARD = Pattern.compile("\\*{2,}"); - private static final Pattern DOUBLE_AND = Pattern.compile("&{2,}"); - private static final Pattern DOUBLE_OR = Pattern.compile("\\|{2,}"); - private static final Pattern DOUBLE_NOT = Pattern.compile("!{2,}"); - private static final Pattern DOUBLE_XOR = Pattern.compile("\\^{2,}"); - private static final Pattern DOUBLE_SPACE = Pattern.compile(" {2,}"); - @Getter - protected String oreDictFilterExpression = ""; + protected String filterString = ""; protected Consumer itemWriter = filter -> {}; protected Consumer onUpdated = filter -> itemWriter.accept(filter); @@ -36,7 +30,7 @@ protected TagFilter() {} @Override public boolean isBlank() { - return oreDictFilterExpression.isBlank(); + return filterString.isBlank(); } public CompoundTag saveFilter() { @@ -44,77 +38,25 @@ public CompoundTag saveFilter() { return null; } var tag = new CompoundTag(); - tag.putString("oreDict", oreDictFilterExpression); + tag.putString("oreDict", filterString); return tag; } - public void setOreDict(String oreDict) { - this.oreDictFilterExpression = oreDict; - matchExpr = TagExprFilter.parseExpression(oreDictFilterExpression); + public void setFilterString(String filterString) { + this.filterString = filterString; + matchExpr = TagExprFilter.parseExpression(filterString); onUpdated.accept((S) this); } - public WidgetGroup openConfigurator(int x, int y) { - WidgetGroup group = new WidgetGroup(x, y, 18 * 3 + 25, 18 * 3); // 80 55 - group.addWidget(new ImageWidget(0, 0, 20, 20, GuiTextures.INFO_ICON) - .setHoverTooltips(LangUtil.getMultiLang("cover.gtceu.tag_filter.info"))); - group.addWidget(new TextFieldWidget(0, 29, 18 * 3 + 25, 12, () -> oreDictFilterExpression, this::setOreDict) - .setMaxStringLength(64) - .setValidator(input -> { - // remove all operators that are double - input = DOUBLE_WILDCARD.matcher(input).replaceAll("*"); - input = DOUBLE_AND.matcher(input).replaceAll("&"); - input = DOUBLE_OR.matcher(input).replaceAll("|"); - input = DOUBLE_NOT.matcher(input).replaceAll("!"); - input = DOUBLE_XOR.matcher(input).replaceAll("^"); - input = DOUBLE_SPACE.matcher(input).replaceAll(" "); - // move ( and ) so it doesn't create invalid expressions f.e. xxx (& yyy) => xxx & (yyy) - // append or prepend ( and ) if the amount is not equal - StringBuilder builder = new StringBuilder(); - int unclosed = 0; - char last = ' '; - for (int i = 0; i < input.length(); i++) { - char c = input.charAt(i); - if (c == ' ') { - if (last != '(') - builder.append(" "); - continue; - } - if (c == '(') - unclosed++; - else if (c == ')') { - unclosed--; - if (last == '&' || last == '|' || last == '^') { - int l = builder.lastIndexOf(" " + last); - int l2 = builder.lastIndexOf(String.valueOf(last)); - builder.insert(l == l2 - 1 ? l : l2, ")"); - continue; - } - if (i > 0 && builder.charAt(builder.length() - 1) == ' ') { - builder.deleteCharAt(builder.length() - 1); - } - } else if ((c == '&' || c == '|' || c == '^') && last == '(') { - builder.deleteCharAt(builder.lastIndexOf("(")); - builder.append(c).append(" ("); - continue; - } - - builder.append(c); - last = c; - } - if (unclosed > 0) { - builder.append(")".repeat(unclosed)); - } else if (unclosed < 0) { - unclosed = -unclosed; - for (int i = 0; i < unclosed; i++) { - builder.insert(0, "("); - } - } - input = builder.toString(); - input = input.replaceAll(" {2,}", " "); - return input; - })); - return group; + @Override + public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { + StringSyncValue filterString = new StringSyncValue(this::getFilterString, this::setFilterString).allowC2S(); + RichTooltip infoTooltip = new RichTooltip().add("cover.gtceu.tag_filter.info"); + + return Flow.row() + .coverChildren() + .child(new TextFieldWidget().width(140).value(filterString)) + .child(GTGuiTextures.INFO.asWidget().tooltip(infoTooltip)); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFluidFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFluidFilter.java index ff54bd91eb0..ccf6c0a9189 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFluidFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFluidFilter.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.api.cover.filter; +import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.utils.TagExprFilter; import net.minecraft.nbt.CompoundTag; @@ -27,21 +28,26 @@ public static TagFluidFilter loadFilter(ItemStack itemStack) { private static TagFluidFilter loadFilter(CompoundTag tag, Consumer itemWriter) { var handler = new TagFluidFilter(); handler.itemWriter = itemWriter; - handler.oreDictFilterExpression = tag.getString("oreDict"); + handler.filterString = tag.getString("oreDict"); handler.matchExpr = null; handler.cache.clear(); - handler.matchExpr = TagExprFilter.parseExpression(handler.oreDictFilterExpression); + handler.matchExpr = TagExprFilter.parseExpression(handler.filterString); return handler; } - public void setOreDict(String oreDict) { + public void setFilterString(String oreDict) { cache.clear(); - super.setOreDict(oreDict); + super.setFilterString(oreDict); + } + + @Override + public ItemStack getFilterItem() { + return GTItems.TAG_FLUID_FILTER.asStack(); } @Override public boolean test(FluidStack fluidStack) { - if (oreDictFilterExpression.isEmpty()) return false; + if (filterString.isEmpty()) return false; if (cache.containsKey(fluidStack.getFluid())) return cache.getOrDefault(fluidStack.getFluid(), false); if (TagExprFilter.tagsMatch(matchExpr, fluidStack)) { cache.put(fluidStack.getFluid(), true); diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagItemFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagItemFilter.java index 5018590726a..2aa6fd28ee9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagItemFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagItemFilter.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.api.cover.filter; +import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.utils.TagExprFilter; import net.minecraft.nbt.CompoundTag; @@ -26,21 +27,26 @@ public static TagItemFilter loadFilter(ItemStack itemStack) { private static TagItemFilter loadFilter(CompoundTag tag, Consumer itemWriter) { var handler = new TagItemFilter(); handler.itemWriter = itemWriter; - handler.oreDictFilterExpression = tag.getString("oreDict"); + handler.filterString = tag.getString("oreDict"); handler.matchExpr = null; handler.cache.clear(); - handler.matchExpr = TagExprFilter.parseExpression(handler.oreDictFilterExpression); + handler.matchExpr = TagExprFilter.parseExpression(handler.filterString); return handler; } - public void setOreDict(String oreDict) { + public void setFilterString(String oreDict) { cache.clear(); - super.setOreDict(oreDict); + super.setFilterString(oreDict); + } + + @Override + public ItemStack getFilterItem() { + return GTItems.TAG_FILTER.asStack(); } @Override public boolean test(ItemStack itemStack) { - if (oreDictFilterExpression.isEmpty()) return false; + if (filterString.isEmpty()) return false; if (cache.containsKey(itemStack.getItem())) return cache.getOrDefault(itemStack.getItem(), false); if (TagExprFilter.tagsMatch(matchExpr, itemStack)) { cache.put(itemStack.getItem(), true); diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/ChemicalHelper.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/ChemicalHelper.java index 3cc568351df..1a347c1b08a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/ChemicalHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/ChemicalHelper.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.api.data.chemical; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.GTCEuAPI; import com.gregtechceu.gtceu.api.data.chemical.material.ItemMaterialData; import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.chemical.material.properties.FluidProperty; @@ -12,6 +11,7 @@ import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.data.tag.TagUtil; import com.gregtechceu.gtceu.api.fluids.store.FluidStorageKey; +import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.common.data.GTMaterials; import net.minecraft.MethodsReturnNonnullByDefault; @@ -97,7 +97,7 @@ public static MaterialStack getMaterialStack(ItemLike itemLike) { public static Material getMaterial(Fluid fluid) { if (FLUID_MATERIAL.isEmpty()) { Set> allFluidTags = BuiltInRegistries.FLUID.getTagNames().collect(Collectors.toSet()); - for (final Material material : GTCEuAPI.materialManager.getRegisteredMaterials()) { + for (final Material material : GTRegistries.MATERIALS) { if (material.hasProperty(PropertyKey.FLUID)) { FluidProperty property = material.getProperty(PropertyKey.FLUID); FluidStorageKey.allKeys().stream() @@ -209,7 +209,7 @@ public static MaterialEntry getMaterialEntry(TagKey tag) { // lookups. Set> allItemTags = BuiltInRegistries.ITEM.getTagNames().collect(Collectors.toSet()); for (TagPrefix prefix : TagPrefix.values()) { - for (Material material : GTCEuAPI.materialManager.getRegisteredMaterials()) { + for (Material material : GTRegistries.MATERIALS) { prefix.getItemTags(material).stream() .filter(allItemTags::contains) .forEach(tagKey -> { @@ -298,7 +298,7 @@ public static TagKey getBlockTag(TagPrefix orePrefix, @NotNull Material m } @Nullable - public static TagKey getTag(TagPrefix orePrefix, @NotNull Material material) { + public static TagKey getTag(TagPrefix orePrefix, Material material) { var tags = orePrefix.getItemTags(material); if (tags.isEmpty()) { return null; diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/IMaterialRegistryManager.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/IMaterialRegistryManager.java deleted file mode 100644 index b5a55466bac..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/IMaterialRegistryManager.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.gregtechceu.gtceu.api.data.chemical.material; - -import com.gregtechceu.gtceu.api.data.chemical.material.registry.MaterialRegistry; - -import net.minecraft.resources.ResourceLocation; - -import com.mojang.serialization.Codec; -import com.mojang.serialization.DataResult; -import org.jetbrains.annotations.NotNull; - -import java.util.Collection; -import java.util.Optional; - -public interface IMaterialRegistryManager { - - /** - * Create a registry for a modid. Accessible when in phase {@link Phase#PRE}. - * - * @param modid the mod id for the registry - * @return the registry for the mod - */ - @NotNull - MaterialRegistry createRegistry(@NotNull String modid); - - /** - * Get a mod's registry. Accessible during all phases. - * - * @param modid the modid of the mod - * @return the registry associated with the mod, or the GregTech registry if it does not have one - */ - @NotNull - MaterialRegistry getRegistry(@NotNull String modid); - - /** - * Get a mod's registry. Accessible during all phases. - * - * @param networkId the network ID of the registry - * @return the registry associated with the network ID, or the GregTech registry if it does not have one - */ - @NotNull - MaterialRegistry getRegistry(int networkId); - - /** - * Accessible when in phases: - *
    - *
  • {@link Phase#OPEN}
  • - *
  • {@link Phase#CLOSED}
  • - *
  • {@link Phase#FROZEN}
  • - *
- * - * @return all the Material Registries - */ - @NotNull - Collection getRegistries(); - - /** - * Accessible when in phases: - *
    - *
  • {@link Phase#CLOSED}
  • - *
  • {@link Phase#FROZEN}
  • - *
- * - * @return all registered materials. - */ - @NotNull - Collection getRegisteredMaterials(); - - /** - * Get a material from a String in formats: - *
    - *
  • {@code "modid:registry_name"}
  • - *
  • {@code "registry_name"} - where modid is inferred to be {@link com.gregtechceu.gtceu.GTCEu#MOD_ID}
  • - *
- * - * Intended for use in reading/writing materials from/to NBT tags. - * - * @param name the name of the material in the above format - * @return the material associated with the name - */ - Material getMaterial(String name); - - Material getMaterial(ResourceLocation resourceLocation); - - ResourceLocation getKey(Material material); - - /** - * @return the current phase in the material registration process - * @see Phase - */ - @NotNull - Phase getPhase(); - - default boolean canModifyMaterials() { - return this.getPhase() != Phase.FROZEN && this.getPhase() != Phase.PRE; - } - - default Codec codec() { - return ResourceLocation.CODEC - .flatXmap( - id -> Optional.ofNullable(this.getRegistry(id.getNamespace()).get(id.getPath())) - .map(DataResult::success) - .orElseGet(() -> DataResult - .error(() -> "Unknown registry key in material registry: " + id)), - obj -> DataResult.success(obj.getResourceLocation())); - } - - enum Phase { - /** Material Registration and Modification is not started */ - PRE, - /** Material Registration and Modification is available */ - OPEN, - /** Material Registration is unavailable and only Modification is available */ - CLOSED, - /** Material Registration and Modification is unavailable */ - FROZEN - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/Material.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/Material.java index 063d6addcb3..c7c16644185 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/Material.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/Material.java @@ -1,6 +1,5 @@ package com.gregtechceu.gtceu.api.data.chemical.material; -import com.gregtechceu.gtceu.api.GTCEuAPI; import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; import com.gregtechceu.gtceu.api.data.chemical.Element; import com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialFlag; @@ -16,6 +15,7 @@ import com.gregtechceu.gtceu.api.fluids.store.FluidStorageKey; import com.gregtechceu.gtceu.api.fluids.store.FluidStorageKeys; import com.gregtechceu.gtceu.api.item.tool.MaterialToolTier; +import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.api.registry.registrate.BuilderBase; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.common.data.GTMedicalConditions; @@ -150,7 +150,7 @@ protected Material(ResourceLocation resourceLocation) { } protected void registerMaterial() { - GTCEuAPI.materialManager.getRegistry(getModid()).register(this); + GTRegistries.MATERIALS.register(getResourceLocation(), this); } public String getName() { @@ -176,7 +176,7 @@ public boolean shouldGenerateRecipesFor(@NotNull TagPrefix prefix) { } public void addFlags(MaterialFlag... flags) { - if (!GTCEuAPI.materialManager.canModifyMaterials()) + if (!GTRegistries.MATERIALS.canModifyMaterials()) throw new IllegalStateException("Cannot add flag to material when registry is frozen!"); this.flags.addFlags(flags).verify(this); } @@ -263,7 +263,9 @@ public Fluid getFluid(@NotNull FluidStorageKey key) { * @see #getFluid(FluidStorageKey, int) */ public FluidStack getFluid(int amount) { - return new FluidStack(getFluid(), amount); + Fluid fluid = getFluid(); + if (fluid != null) return new FluidStack(fluid, amount); + else return FluidStack.EMPTY; } /** @@ -272,7 +274,9 @@ public FluidStack getFluid(int amount) { * @return a FluidStack with the fluid and amount */ public FluidStack getFluid(@NotNull FluidStorageKey key, int amount) { - return new FluidStack(getFluid(key), amount); + Fluid fluid = getFluid(key); + if (fluid != null) return new FluidStack(fluid, amount); + else return FluidStack.EMPTY; } /** @@ -333,14 +337,23 @@ public MaterialToolTier getToolTier() { return prop.getTier(this); } + /** + * @return the correct "molten" fluid for a material + */ public Fluid getHotFluid() { - AlloyBlastProperty prop = properties.getProperty(PropertyKey.ALLOY_BLAST); - return prop == null ? null : prop.getFluid(); + if (hasProperty(PropertyKey.ALLOY_BLAST)) { + return getFluid(FluidStorageKeys.MOLTEN); + } + if (!TagPrefix.ingotHot.doGenerateItem(this) && hasProperty(PropertyKey.FLUID)) { + return getFluid(FluidStorageKeys.LIQUID); + } + return null; } public FluidStack getHotFluid(int amount) { - AlloyBlastProperty prop = properties.getProperty(PropertyKey.ALLOY_BLAST); - return prop == null ? null : new FluidStack(prop.getFluid(), amount); + Fluid fluid = getHotFluid(); + if (fluid != null) return new FluidStack(fluid, amount); + else return FluidStack.EMPTY; } public Item getBucket() { @@ -533,7 +546,7 @@ public void removeProperty(PropertyKey key) { } public void setProperty(PropertyKey key, IMaterialProperty property) { - if (!GTCEuAPI.materialManager.canModifyMaterials()) { + if (!GTRegistries.MATERIALS.canModifyMaterials()) { throw new IllegalStateException("Cannot add properties to a Material when registry is frozen!"); } properties.setProperty(key, property); @@ -1875,7 +1888,7 @@ public Material buildAndRegister() { @Override @HideFromJS - public Material register() { + public @NotNull Material register() { return value = buildAndRegister(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/event/MaterialRegistryEvent.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/event/MaterialRegistryEvent.java deleted file mode 100644 index 4749df8e1a5..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/event/MaterialRegistryEvent.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.gregtechceu.gtceu.api.data.chemical.material.event; - -import com.gregtechceu.gtceu.api.data.chemical.material.IMaterialRegistryManager; - -import net.minecraftforge.eventbus.api.Event; -import net.minecraftforge.fml.event.IModBusEvent; - -/** - * Event to add a material registry in. - *
- * Material events are fired on the MOD bus as the forge bus isn't active until all mods have loaded. - * - * @see IMaterialRegistryManager#createRegistry(String) - */ -public class MaterialRegistryEvent extends Event implements IModBusEvent { - - public MaterialRegistryEvent() { - super(); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/info/MaterialIconSet.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/info/MaterialIconSet.java index a015487b905..ca3c107f098 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/info/MaterialIconSet.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/info/MaterialIconSet.java @@ -1,72 +1,79 @@ package com.gregtechceu.gtceu.api.data.chemical.material.info; import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.GTCEuAPI; +import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.integration.kjs.GTRegistryInfo; -import com.google.common.base.Preconditions; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.fml.ModLoader; + import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; - public class MaterialIconSet { - public static final Map ICON_SETS = new HashMap<>(); - public static final MaterialIconSet DULL = new MaterialIconSet("dull", null, true); - public static final MaterialIconSet METALLIC = new MaterialIconSet("metallic"); - public static final MaterialIconSet MAGNETIC = new MaterialIconSet("magnetic", METALLIC); - public static final MaterialIconSet SHINY = new MaterialIconSet("shiny", METALLIC); - public static final MaterialIconSet BRIGHT = new MaterialIconSet("bright", SHINY); - public static final MaterialIconSet DIAMOND = new MaterialIconSet("diamond", SHINY); - public static final MaterialIconSet EMERALD = new MaterialIconSet("emerald", DIAMOND); - public static final MaterialIconSet GEM_HORIZONTAL = new MaterialIconSet("gem_horizontal", EMERALD); - public static final MaterialIconSet GEM_VERTICAL = new MaterialIconSet("gem_vertical", EMERALD); - public static final MaterialIconSet RUBY = new MaterialIconSet("ruby", EMERALD); - public static final MaterialIconSet OPAL = new MaterialIconSet("opal", RUBY); - public static final MaterialIconSet GLASS = new MaterialIconSet("glass", RUBY); - public static final MaterialIconSet NETHERSTAR = new MaterialIconSet("netherstar", GLASS); - public static final MaterialIconSet FINE = new MaterialIconSet("fine"); - public static final MaterialIconSet SAND = new MaterialIconSet("sand", FINE); - public static final MaterialIconSet WOOD = new MaterialIconSet("wood", FINE); - public static final MaterialIconSet ROUGH = new MaterialIconSet("rough", FINE); - public static final MaterialIconSet FLINT = new MaterialIconSet("flint", ROUGH); - public static final MaterialIconSet LIGNITE = new MaterialIconSet("lignite", ROUGH); - public static final MaterialIconSet QUARTZ = new MaterialIconSet("quartz", ROUGH); - public static final MaterialIconSet CERTUS = new MaterialIconSet("certus", QUARTZ); - public static final MaterialIconSet LAPIS = new MaterialIconSet("lapis", QUARTZ); - public static final MaterialIconSet FLUID = new MaterialIconSet("fluid"); - public static final MaterialIconSet RADIOACTIVE = new MaterialIconSet("radioactive", METALLIC); + static { + GTRegistries.MATERIAL_ICON_SETS.unfreeze(); + } + + public static final MaterialIconSet DULL = new MaterialIconSet(GTCEu.id("dull"), null, true); + public static final MaterialIconSet METALLIC = new MaterialIconSet(GTCEu.id("metallic")); + public static final MaterialIconSet MAGNETIC = new MaterialIconSet(GTCEu.id("magnetic"), METALLIC); + public static final MaterialIconSet SHINY = new MaterialIconSet(GTCEu.id("shiny"), METALLIC); + public static final MaterialIconSet BRIGHT = new MaterialIconSet(GTCEu.id("bright"), SHINY); + public static final MaterialIconSet DIAMOND = new MaterialIconSet(GTCEu.id("diamond"), SHINY); + public static final MaterialIconSet EMERALD = new MaterialIconSet(GTCEu.id("emerald"), DIAMOND); + public static final MaterialIconSet GEM_HORIZONTAL = new MaterialIconSet(GTCEu.id("gem_horizontal"), EMERALD); + public static final MaterialIconSet GEM_VERTICAL = new MaterialIconSet(GTCEu.id("gem_vertical"), EMERALD); + public static final MaterialIconSet RUBY = new MaterialIconSet(GTCEu.id("ruby"), EMERALD); + public static final MaterialIconSet OPAL = new MaterialIconSet(GTCEu.id("opal"), RUBY); + public static final MaterialIconSet GLASS = new MaterialIconSet(GTCEu.id("glass"), RUBY); + public static final MaterialIconSet NETHERSTAR = new MaterialIconSet(GTCEu.id("netherstar"), GLASS); + public static final MaterialIconSet FINE = new MaterialIconSet(GTCEu.id("fine")); + public static final MaterialIconSet SAND = new MaterialIconSet(GTCEu.id("sand"), FINE); + public static final MaterialIconSet WOOD = new MaterialIconSet(GTCEu.id("wood"), FINE); + public static final MaterialIconSet ROUGH = new MaterialIconSet(GTCEu.id("rough"), FINE); + public static final MaterialIconSet FLINT = new MaterialIconSet(GTCEu.id("flint"), ROUGH); + public static final MaterialIconSet LIGNITE = new MaterialIconSet(GTCEu.id("lignite"), ROUGH); + public static final MaterialIconSet QUARTZ = new MaterialIconSet(GTCEu.id("quartz"), ROUGH); + public static final MaterialIconSet CERTUS = new MaterialIconSet(GTCEu.id("certus"), QUARTZ); + public static final MaterialIconSet LAPIS = new MaterialIconSet(GTCEu.id("lapis"), QUARTZ); + public static final MaterialIconSet FLUID = new MaterialIconSet(GTCEu.id("fluid")); + public static final MaterialIconSet RADIOACTIVE = new MaterialIconSet(GTCEu.id("radioactive"), METALLIC); // Implementation ----------------------------------------------------------------------------------------------- - private static int idCounter = 0; + public final ResourceLocation id; public final String name; - public final int id; public final boolean isRootIconset; /** * This can be null if {@link MaterialIconSet#isRootIconset} is true, * otherwise it will be Nonnull */ + @Nullable public final MaterialIconSet parentIconset; /** * Create a new MaterialIconSet whose parent is {@link MaterialIconSet#DULL} - * + * + * @deprecated Use {@link MaterialIconSet#MaterialIconSet(ResourceLocation)} instead * @param name the name of the iconset */ + @Deprecated(since = "8.0.0") public MaterialIconSet(@NotNull String name) { this(name, MaterialIconSet.DULL); } /** * Create a new MaterialIconSet whose parent is one of your choosing - * + * + * @deprecated Use {@link MaterialIconSet#MaterialIconSet(ResourceLocation, MaterialIconSet)} instead * @param name the name of the iconset * @param parentIconset the parent iconset */ + @Deprecated(since = "8.0.0") public MaterialIconSet(@NotNull String name, @NotNull MaterialIconSet parentIconset) { this(name, parentIconset, false); } @@ -74,32 +81,78 @@ public MaterialIconSet(@NotNull String name, @NotNull MaterialIconSet parentIcon /** * Create a new MaterialIconSet which is a root * + * @deprecated Use {@link MaterialIconSet#MaterialIconSet(ResourceLocation, MaterialIconSet, boolean)} instead * @param name the name of the iconset * @param parentIconset the parent iconset, should be null if this should be a root iconset * @param isRootIconset true if this should be a root iconset, otherwise false */ + @Deprecated(since = "8.0.0") public MaterialIconSet(@NotNull String name, @Nullable MaterialIconSet parentIconset, boolean isRootIconset) { - this.name = name.toLowerCase(Locale.ENGLISH); - Preconditions.checkArgument(!ICON_SETS.containsKey(this.name), - "MaterialIconSet " + this.name + " already registered!"); - this.id = idCounter++; + this(GTCEu.id(name), parentIconset, isRootIconset); + } + + /** + * Create a new MaterialIconSet whose parent is {@link MaterialIconSet#DULL} + * + * @param id the id of the iconset + */ + public MaterialIconSet(@NotNull ResourceLocation id) { + this(id, MaterialIconSet.DULL); + } + + /** + * Create a new MaterialIconSet whose parent is one of your choosing + * + * @param id the id of the iconset + * @param parentIconset the parent iconset + */ + public MaterialIconSet(@NotNull ResourceLocation id, @NotNull MaterialIconSet parentIconset) { + this(id, parentIconset, false); + } + + /** + * Create a new MaterialIconSet which is a root + * + * @param id the id of the iconset + * @param parentIconset the parent iconset, should be null if this should be a root iconset + * @param isRootIconset true if this should be a root iconset, otherwise false + */ + public MaterialIconSet(@NotNull ResourceLocation id, @Nullable MaterialIconSet parentIconset, + boolean isRootIconset) { + this.id = id; + + if (id.getPath().contains("/")) + throw new IllegalArgumentException("MaterialIconSet id cannot have '/' %s".formatted(id)); + + this.name = id.getPath(); this.isRootIconset = isRootIconset; this.parentIconset = parentIconset; - ICON_SETS.put(this.name, this); + + GTRegistries.MATERIAL_ICON_SETS.register(this.id, this); } + /** + * @deprecated Use {@code GTRegistries.MATERIAL_ICON_SETS.get()} + */ + @Deprecated(since = "8.0.0") public static MaterialIconSet getByName(@NotNull String name) { - return ICON_SETS.get(name.toLowerCase(Locale.ENGLISH)); + return GTRegistries.MATERIAL_ICON_SETS.get(GTCEu.id(name)); + } + + public String getName() { + return id.getPath(); } @Override public String toString() { - return name; + return id.toString(); } public static void init() { + ModLoader.get().postEvent(new GTCEuAPI.RegisterEvent<>(GTRegistries.MATERIAL_ICON_SETS, MaterialIconSet.class)); if (GTCEu.Mods.isKubeJSLoaded()) { - GTRegistryInfo.registerFor(GTRegistryInfo.MATERIAL_ICON_SET.registryKey); + GTRegistryInfo.registerFor(GTRegistries.MATERIAL_ICON_SETS.getRegistryName()); } + GTRegistries.MATERIAL_ICON_SETS.freeze(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/info/MaterialIconType.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/info/MaterialIconType.java index 52d57bac337..7fc97341078 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/info/MaterialIconType.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/info/MaterialIconType.java @@ -3,8 +3,7 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.common.data.models.GTModels; import com.gregtechceu.gtceu.integration.kjs.GTRegistryInfo; - -import com.lowdragmc.lowdraglib.utils.ResourceHelper; +import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; @@ -18,7 +17,9 @@ import java.util.HashMap; import java.util.Map; +import java.util.Objects; +@SuppressWarnings("unused") public record MaterialIconType(String name) { public static final Map ICON_TYPES = new HashMap<>(); @@ -161,22 +162,26 @@ public ResourceLocation getBlockTexturePath(@NotNull MaterialIconSet materialIco Minecraft.getInstance().getResourceManager() == null) return GTModels.BLANK_TEXTURE; // check minecraft for null for CI environments if (!iconSet.isRootIconset) { - while (!iconSet.isRootIconset) { - ResourceLocation location = GTCEu - .id(String.format("textures/block/material_sets/%s/%s%s.png", iconSet.name, this.name, suffix)); - if (ResourceHelper.isResourceExist(location) || ResourceHelper.isResourceExistRaw(location)) + while (iconSet != null && !iconSet.isRootIconset) { + ResourceLocation location = iconSet.id.withPath(String + .format("textures/block/material_sets/%s/%s%s.png", iconSet.getName(), this.name, suffix)); + if (GTUtil.resourceExists(location)) break; iconSet = iconSet.parentIconset; } } - ResourceLocation location = GTCEu - .id(String.format("textures/block/material_sets/%s/%s%s.png", iconSet.name, this.name, suffix)); - if (!suffix.isEmpty() && !ResourceHelper.isResourceExist(location) && - !ResourceHelper.isResourceExistRaw(location)) { + Objects.requireNonNull(iconSet); + + ResourceLocation location = iconSet.id.withPath( + String.format("textures/block/material_sets/%s/%s%s.png", iconSet.getName(), this.name, suffix)); + + if (!suffix.isEmpty() && !GTUtil.resourceExists(location)) { return GTModels.BLANK_TEXTURE; } - location = GTCEu.id(String.format("block/material_sets/%s/%s%s", iconSet.name, this.name, suffix)); + location = iconSet.id + .withPath(String.format("block/material_sets/%s/%s%s", iconSet.getName(), this.name, suffix)); + if (suffix.isEmpty()) { BLOCK_TEXTURE_CACHE.put(this, materialIconSet, location); } else { @@ -198,16 +203,19 @@ public ResourceLocation getBlockModelPath(@NotNull MaterialIconSet materialIconS // noinspection ConstantConditions if (!iconSet.isRootIconset && GTCEu.isClientSide() && Minecraft.getInstance() != null && Minecraft.getInstance().getResourceManager() != null) { // check minecraft for null for CI environments - while (!iconSet.isRootIconset) { - ResourceLocation location = GTCEu - .id(String.format("models/block/material_sets/%s/%s.json", iconSet.name, this.name)); - if (ResourceHelper.isResourceExist(location) || ResourceHelper.isResourceExistRaw(location)) + while (iconSet != null && !iconSet.isRootIconset) { + ResourceLocation location = iconSet.id + .withPath(String.format("models/block/material_sets/%s/%s.json", iconSet.getName(), this.name)); + if (GTUtil.resourceExists(location)) break; iconSet = iconSet.parentIconset; } } - ResourceLocation location = GTCEu.id(String.format("block/material_sets/%s/%s", iconSet.name, this.name)); + Objects.requireNonNull(iconSet); + + ResourceLocation location = iconSet.id + .withPath(String.format("block/material_sets/%s/%s", iconSet.getName(), this.name)); ITEM_MODEL_CACHE.put(this, materialIconSet, location); return location; @@ -225,16 +233,21 @@ public ResourceLocation getItemModelPath(@NotNull MaterialIconSet materialIconSe // noinspection ConstantConditions if (!iconSet.isRootIconset && GTCEu.isClientSide() && Minecraft.getInstance() != null && Minecraft.getInstance().getResourceManager() != null) { // check minecraft for null for CI environments - while (!iconSet.isRootIconset) { - ResourceLocation location = GTCEu - .id(String.format("models/item/material_sets/%s/%s.json", iconSet.name, this.name)); - if (ResourceHelper.isResourceExist(location) || ResourceHelper.isResourceExistRaw(location)) + while (iconSet != null && !iconSet.isRootIconset) { + ResourceLocation location = iconSet.id + .withPath(String.format("models/item/material_sets/%s/%s.json", iconSet.getName(), this.name)); + + if (GTUtil.resourceExists(location)) break; iconSet = iconSet.parentIconset; } } - ResourceLocation location = GTCEu.id(String.format("item/material_sets/%s/%s", iconSet.name, this.name)); + Objects.requireNonNull(iconSet); + + ResourceLocation location = iconSet.id + .withPath(String.format("item/material_sets/%s/%s", iconSet.getName(), this.name)); + ITEM_MODEL_CACHE.put(this, materialIconSet, location); return location; @@ -264,22 +277,26 @@ public ResourceLocation getItemTexturePath(@NotNull MaterialIconSet materialIcon // noinspection ConstantConditions if (!iconSet.isRootIconset && GTCEu.isClientSide() && Minecraft.getInstance() != null && Minecraft.getInstance().getResourceManager() != null) { // check minecraft for null for CI environments - while (!iconSet.isRootIconset) { - ResourceLocation location = GTCEu - .id(String.format("textures/item/material_sets/%s/%s%s.png", iconSet.name, this.name, suffix)); - if (ResourceHelper.isResourceExist(location) || ResourceHelper.isResourceExistRaw(location)) + while (iconSet != null && !iconSet.isRootIconset) { + ResourceLocation location = iconSet.id.withPath( + String.format("textures/item/material_sets/%s/%s%s.png", iconSet.getName(), this.name, suffix)); + + if (GTUtil.resourceExists(location)) break; iconSet = iconSet.parentIconset; } } - ResourceLocation location = GTCEu - .id(String.format("textures/item/material_sets/%s/%s%s.png", iconSet.name, this.name, suffix)); - if (!suffix.isEmpty() && !ResourceHelper.isResourceExist(location) && - !ResourceHelper.isResourceExistRaw(location)) { + Objects.requireNonNull(iconSet); + + ResourceLocation location = iconSet.id.withPath( + String.format("textures/item/material_sets/%s/%s%s.png", iconSet.getName(), this.name, suffix)); + + if (!suffix.isEmpty() && !GTUtil.resourceExists(location)) { return null; } - location = GTCEu.id(String.format("item/material_sets/%s/%s%s", iconSet.name, this.name, suffix)); + location = iconSet.id + .withPath(String.format("item/material_sets/%s/%s%s", iconSet.getName(), this.name, suffix)); if (suffix.isEmpty()) { ITEM_TEXTURE_CACHE.put(this, materialIconSet, location); } else { @@ -290,7 +307,7 @@ public ResourceLocation getItemTexturePath(@NotNull MaterialIconSet materialIcon } @Override - public String toString() { + public @NotNull String toString() { return this.name; } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/AlloyBlastProperty.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/AlloyBlastProperty.java index 0e9771607c9..f69099694cb 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/AlloyBlastProperty.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/AlloyBlastProperty.java @@ -2,57 +2,21 @@ import com.gregtechceu.gtceu.data.recipe.misc.alloyblast.AlloyBlastRecipeProducer; -import net.minecraft.world.level.material.Fluid; - -import com.google.common.base.Preconditions; import lombok.Getter; import lombok.Setter; import org.jetbrains.annotations.NotNull; -import java.util.function.Supplier; - public class AlloyBlastProperty implements IMaterialProperty { - /** - * Internal material fluid field - */ - private Supplier fluidSupplier; - private int temperature; - @Getter @Setter - @NotNull - private AlloyBlastRecipeProducer recipeProducer = AlloyBlastRecipeProducer.DEFAULT_PRODUCER; + private @NotNull AlloyBlastRecipeProducer recipeProducer = AlloyBlastRecipeProducer.DEFAULT_PRODUCER; - public AlloyBlastProperty(int temperature) { - this.temperature = temperature; - } + public AlloyBlastProperty() {} @Override public void verifyProperty(MaterialProperties materialProperties) { materialProperties.ensureSet(PropertyKey.BLAST); materialProperties.ensureSet(PropertyKey.FLUID); - this.temperature = materialProperties.getProperty(PropertyKey.BLAST).getBlastTemperature(); - } - - /** - * internal usage only - */ - public void setFluid(@NotNull Supplier materialFluid) { - Preconditions.checkNotNull(materialFluid); - this.fluidSupplier = materialFluid; - } - - public Fluid getFluid() { - return fluidSupplier.get(); - } - - public void setTemperature(int fluidTemperature) { - Preconditions.checkArgument(fluidTemperature > 0, "Invalid temperature"); - this.temperature = fluidTemperature; - } - - public int getTemperature() { - return temperature; } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/BlastProperty.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/BlastProperty.java index be413f84e55..250ce4acbe2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/BlastProperty.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/BlastProperty.java @@ -1,5 +1,7 @@ package com.gregtechceu.gtceu.api.data.chemical.material.properties; +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; import com.gregtechceu.gtceu.common.data.GTMaterials; @@ -141,6 +143,10 @@ public void setFluid(Supplier fluid) { public FluidIngredient getFluid() { return fluid.get().copy(); } + + public FluidIngredient getFluid(int outputAmount) { + return FluidRecipeCapability.CAP.copyWithModifier(fluid.get(), ContentModifier.multiplier(outputAmount)); + } } @SuppressWarnings("unused") // API, need to treat all of these as used diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/registry/MaterialRegistry.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/registry/MaterialRegistry.java index 25e4d6a59d8..75123443bcf 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/registry/MaterialRegistry.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/registry/MaterialRegistry.java @@ -1,58 +1,98 @@ package com.gregtechceu.gtceu.api.data.chemical.material.registry; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.addon.AddonFinder; -import com.gregtechceu.gtceu.api.addon.IGTAddon; import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.registry.GTRegistry; -import com.gregtechceu.gtceu.api.registry.registrate.GTRegistrate; -import com.gregtechceu.gtceu.common.registry.GTRegistration; +import com.gregtechceu.gtceu.common.data.GTMaterials; import net.minecraft.resources.ResourceLocation; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import lombok.Getter; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.UnmodifiableView; -import java.util.Collection; +import java.util.Set; -public abstract class MaterialRegistry extends GTRegistry.String { +public class MaterialRegistry extends GTRegistry.RL { @Getter - private final GTRegistrate registrate; + private final Set usedNamespaces = new ObjectOpenHashSet<>(); - public MaterialRegistry(java.lang.String modId) { - super(new ResourceLocation(modId, "material")); - IGTAddon addon = AddonFinder.getAddon(modId); - this.registrate = addon != null ? addon.getRegistrate() : - GTCEu.MOD_ID.equals(modId) ? GTRegistration.REGISTRATE : GTRegistrate.create(modId); - } + private Phase registrationPhase = Phase.PRE; - public abstract void register(Material material); + public MaterialRegistry() { + super(GTCEu.id("material")); + } - @NotNull - public abstract Collection getAllMaterials(); + public Material get(java.lang.String name) { + ResourceLocation location = ResourceLocation.tryParse(GTCEu.appendIdString(name)); + if (location != null) return get(location); + return GTMaterials.NULL; + } - /** - * Set the fallback material for this registry. - * This is only for manual fallback usage. - * - * @param material the fallback material - */ - public abstract void setFallbackMaterial(@NotNull Material material); + @Override + public T register(@NotNull ResourceLocation key, @NotNull T value) { + if (registrationPhase == Phase.CLOSED || registrationPhase == Phase.FROZEN) { + GTCEu.LOGGER.error( + "Materials cannot be registered in the PostMaterialEvent (or after)! Must be added in the MaterialEvent. Skipping material {}...", + key); + return null; + } + super.register(key, value); + usedNamespaces.add(key.getNamespace()); + return value; + } /** - * This is only for manual fallback usage. + * Accessible when in phases: + *
    + *
  • {@link Phase#CLOSED}
  • + *
  • {@link Phase#FROZEN}
  • + *
* - * @return the fallback material, used for when another material does not exist + * @return all registered materials. */ @NotNull - public abstract Material getFallbackMaterial(); + public @UnmodifiableView Set values() { + if (registrationPhase == Phase.PRE || registrationPhase == Phase.OPEN) + throw new IllegalStateException("Cannot retrieve all materials before registration"); + return super.values(); + } - /** - * @return the network ID for this registry - */ - public abstract int getNetworkId(); + public void closeRegistry() { + registrationPhase = Phase.CLOSED; + } + + @Override + public void freeze() { + super.freeze(); + registrationPhase = Phase.FROZEN; + } + + @Override + public void unfreeze() { + super.unfreeze(); + registrationPhase = Phase.OPEN; + } @NotNull - public abstract java.lang.String getModid(); + public Phase getPhase() { + return registrationPhase; + } + + public boolean canModifyMaterials() { + return getPhase() != Phase.FROZEN && getPhase() != Phase.PRE; + } + + public enum Phase { + /** Material Registration and Modification is not started */ + PRE, + /** Material Registration and Modification is available */ + OPEN, + /** Material Registration is unavailable and only Modification is available */ + CLOSED, + /** Material Registration and Modification is unavailable */ + FROZEN + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java b/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java index f61c4769ba3..cdf42fd524f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.api.data.tag; import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.GTCEuAPI; import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.addon.AddonFinder; import com.gregtechceu.gtceu.api.addon.IGTAddon; @@ -16,6 +17,7 @@ import com.gregtechceu.gtceu.api.item.MaterialBlockItem; import com.gregtechceu.gtceu.api.item.TagPrefixItem; import com.gregtechceu.gtceu.api.item.tool.GTToolType; +import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.common.data.GTBlocks; import com.gregtechceu.gtceu.common.data.GTMaterialBlocks; import com.gregtechceu.gtceu.common.data.GTMaterialItems; @@ -23,7 +25,7 @@ import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.recipe.CustomTags; import com.gregtechceu.gtceu.integration.kjs.GTRegistryInfo; -import com.gregtechceu.gtceu.integration.xei.widgets.GTOreByProduct; +import com.gregtechceu.gtceu.integration.recipeviewer.widgets.GTOreByProduct; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.memoization.GTMemoizer; @@ -45,11 +47,10 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.NoteBlockInstrument; import net.minecraft.world.level.material.MapColor; +import net.minecraftforge.fml.ModLoader; import com.google.common.base.Preconditions; import com.google.common.collect.Table; -import com.mojang.serialization.Codec; -import com.mojang.serialization.DataResult; import it.unimi.dsi.fastutil.objects.Object2FloatMap; import it.unimi.dsi.fastutil.objects.Object2FloatOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; @@ -69,53 +70,57 @@ @Accessors(chain = true, fluent = true) public class TagPrefix { - public final static Map PREFIXES = new HashMap<>(); - public static final Map ORES = new Object2ObjectLinkedOpenHashMap<>(); + static { + GTRegistries.TAG_PREFIXES.unfreeze(); + } - public static final Codec CODEC = Codec.STRING.flatXmap( - str -> Optional.ofNullable(get(str)).map(DataResult::success) - .orElseGet(() -> DataResult.error(() -> "invalid TagPrefix: " + str)), - prefix -> DataResult.success(prefix.name)); + public static final Map ORES = new Object2ObjectLinkedOpenHashMap<>(); public static void init() { AddonFinder.getAddons().forEach(IGTAddon::registerTagPrefixes); + ModLoader.get().postEvent(new GTCEuAPI.RegisterEvent<>(GTRegistries.TAG_PREFIXES, TagPrefix.class)); if (GTCEu.Mods.isKubeJSLoaded()) { - GTRegistryInfo.registerFor(GTRegistryInfo.TAG_PREFIX.registryKey); + GTRegistryInfo.registerFor(GTRegistries.TAG_PREFIXES.getRegistryName()); } + GTRegistries.TAG_PREFIXES.freeze(); } + /** + * @deprecated Use {@code GTRegistries.TAG_PREFIXES.get(name)} + */ + @Deprecated(since = "8.0.0") public static TagPrefix get(String name) { - return PREFIXES.get(name); + return GTRegistries.TAG_PREFIXES.get(GTCEu.id(name)); } public boolean isEmpty() { return this == NULL_PREFIX; } - public static final TagPrefix NULL_PREFIX = new TagPrefix("null"); + public static final TagPrefix NULL_PREFIX = new TagPrefix(GTCEu.id("null")); - public static final TagPrefix ore = oreTagPrefix("stone", BlockTags.MINEABLE_WITH_PICKAXE) + public static final TagPrefix ore = oreTagPrefix(GTCEu.id("stone"), BlockTags.MINEABLE_WITH_PICKAXE) .langValue("%s Ore") .registerOre( Blocks.STONE::defaultBlockState, () -> GTMaterials.Stone, BlockBehaviour.Properties.of() .mapColor(MapColor.STONE).requiresCorrectToolForDrops().strength(3.0F, 3.0F), new ResourceLocation("block/stone"), false, false, true); - public static final TagPrefix oreGranite = oreTagPrefix("granite", BlockTags.MINEABLE_WITH_PICKAXE) + public static final TagPrefix oreGranite = oreTagPrefix(GTCEu.id("granite"), BlockTags.MINEABLE_WITH_PICKAXE) .langValue("Granite %s Ore") .registerOre( Blocks.GRANITE::defaultBlockState, () -> GTMaterials.Granite, BlockBehaviour.Properties.of() .mapColor(MapColor.DIRT).requiresCorrectToolForDrops().strength(3.0F, 3.0F), new ResourceLocation("block/granite")); - public static final TagPrefix oreDiorite = oreTagPrefix("diorite", BlockTags.MINEABLE_WITH_PICKAXE) + public static final TagPrefix oreDiorite = oreTagPrefix(GTCEu.id("diorite"), BlockTags.MINEABLE_WITH_PICKAXE) .langValue("Diorite %s Ore") .registerOre( Blocks.DIORITE::defaultBlockState, () -> GTMaterials.Diorite, BlockBehaviour.Properties.of() .mapColor(MapColor.QUARTZ).requiresCorrectToolForDrops().strength(3.0F, 3.0F), new ResourceLocation("block/diorite")); - public static final TagPrefix oreAndesite = oreTagPrefix("andesite", BlockTags.MINEABLE_WITH_PICKAXE) + public static final TagPrefix oreAndesite = oreTagPrefix(GTCEu.id("andesite"), BlockTags.MINEABLE_WITH_PICKAXE) .langValue("Andesite %s Ore") .registerOre( Blocks.ANDESITE::defaultBlockState, () -> GTMaterials.Andesite, BlockBehaviour.Properties.of() @@ -129,14 +134,14 @@ public boolean isEmpty() { .strength(3.0F, 3.0F), GTCEu.id("block/red_granite")); - public static final TagPrefix oreMarble = oreTagPrefix("marble", BlockTags.MINEABLE_WITH_PICKAXE) + public static final TagPrefix oreMarble = oreTagPrefix(GTCEu.id("marble"), BlockTags.MINEABLE_WITH_PICKAXE) .langValue("Marble %s Ore") .registerOre( () -> GTBlocks.MARBLE.getDefaultState(), () -> GTMaterials.Marble, BlockBehaviour.Properties.of() .mapColor(MapColor.QUARTZ).requiresCorrectToolForDrops().strength(3.0F, 3.0F), GTCEu.id("block/marble")); - public static final TagPrefix oreDeepslate = oreTagPrefix("deepslate", BlockTags.MINEABLE_WITH_PICKAXE) + public static final TagPrefix oreDeepslate = oreTagPrefix(GTCEu.id("deepslate"), BlockTags.MINEABLE_WITH_PICKAXE) .langValue("Deepslate %s Ore") .registerOre( Blocks.DEEPSLATE::defaultBlockState, () -> GTMaterials.Deepslate, BlockBehaviour.Properties.of() @@ -144,7 +149,7 @@ public boolean isEmpty() { .sound(SoundType.DEEPSLATE), new ResourceLocation("block/deepslate"), false, false, true); - public static final TagPrefix oreTuff = oreTagPrefix("tuff", BlockTags.MINEABLE_WITH_PICKAXE) + public static final TagPrefix oreTuff = oreTagPrefix(GTCEu.id("tuff"), BlockTags.MINEABLE_WITH_PICKAXE) .langValue("Tuff %s Ore") .registerOre( Blocks.TUFF::defaultBlockState, () -> GTMaterials.Tuff, BlockBehaviour.Properties.of() @@ -152,28 +157,28 @@ public boolean isEmpty() { .sound(SoundType.TUFF), new ResourceLocation("block/tuff")); - public static final TagPrefix oreSand = oreTagPrefix("sand", BlockTags.MINEABLE_WITH_SHOVEL) + public static final TagPrefix oreSand = oreTagPrefix(GTCEu.id("sand"), BlockTags.MINEABLE_WITH_SHOVEL) .langValue("Sand %s Ore") .registerOre(Blocks.SAND::defaultBlockState, () -> GTMaterials.SiliconDioxide, BlockBehaviour.Properties.of().mapColor(MapColor.SAND).instrument(NoteBlockInstrument.SNARE) .strength(0.5F).sound(SoundType.SAND), new ResourceLocation("block/sand"), false, true, false); - public static final TagPrefix oreRedSand = oreTagPrefix("redSand", BlockTags.MINEABLE_WITH_SHOVEL) + public static final TagPrefix oreRedSand = oreTagPrefix(GTCEu.id("redSand"), BlockTags.MINEABLE_WITH_SHOVEL) .langValue("Red Sand %s Ore") .registerOre(Blocks.RED_SAND::defaultBlockState, () -> GTMaterials.SiliconDioxide, BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_ORANGE).instrument(NoteBlockInstrument.SNARE) .strength(0.5F).sound(SoundType.SAND), new ResourceLocation("block/red_sand"), false, true, false); - public static final TagPrefix oreGravel = oreTagPrefix("gravel", BlockTags.MINEABLE_WITH_SHOVEL) + public static final TagPrefix oreGravel = oreTagPrefix(GTCEu.id("gravel"), BlockTags.MINEABLE_WITH_SHOVEL) .langValue("Gravel %s Ore") .registerOre(Blocks.GRAVEL::defaultBlockState, () -> GTMaterials.Flint, BlockBehaviour.Properties.of().mapColor(MapColor.STONE).instrument(NoteBlockInstrument.SNARE) .strength(0.6F).sound(SoundType.GRAVEL), new ResourceLocation("block/gravel"), false, true, false); - public static final TagPrefix oreBasalt = oreTagPrefix("basalt", BlockTags.MINEABLE_WITH_PICKAXE) + public static final TagPrefix oreBasalt = oreTagPrefix(GTCEu.id("basalt"), BlockTags.MINEABLE_WITH_PICKAXE) .langValue("Basalt %s Ore") .registerOre(Blocks.BASALT::defaultBlockState, () -> GTMaterials.Basalt, BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_BLACK) @@ -181,14 +186,14 @@ public boolean isEmpty() { .sound(SoundType.BASALT), new ResourceLocation("block/basalt"), true); - public static final TagPrefix oreNetherrack = oreTagPrefix("netherrack", BlockTags.MINEABLE_WITH_PICKAXE) + public static final TagPrefix oreNetherrack = oreTagPrefix(GTCEu.id("netherrack"), BlockTags.MINEABLE_WITH_PICKAXE) .langValue("Nether %s Ore") .registerOre(Blocks.NETHERRACK::defaultBlockState, () -> GTMaterials.Netherrack, BlockBehaviour.Properties.of().mapColor(MapColor.NETHER).instrument(NoteBlockInstrument.BASEDRUM) .requiresCorrectToolForDrops().strength(3.0F, 3.0F).sound(SoundType.NETHER_ORE), new ResourceLocation("block/netherrack"), true, false, true); - public static final TagPrefix oreBlackstone = oreTagPrefix("blackstone", BlockTags.MINEABLE_WITH_PICKAXE) + public static final TagPrefix oreBlackstone = oreTagPrefix(GTCEu.id("blackstone"), BlockTags.MINEABLE_WITH_PICKAXE) .langValue("Blackstone %s Ore") .registerOre(Blocks.BLACKSTONE::defaultBlockState, () -> GTMaterials.Blackstone, BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_BLACK) @@ -196,14 +201,14 @@ public boolean isEmpty() { .strength(3.0F, 3.0F), new ResourceLocation("block/blackstone"), true, false, false); - public static final TagPrefix oreEndstone = oreTagPrefix("endstone", BlockTags.MINEABLE_WITH_PICKAXE) + public static final TagPrefix oreEndstone = oreTagPrefix(GTCEu.id("endstone"), BlockTags.MINEABLE_WITH_PICKAXE) .langValue("End %s Ore") .registerOre(Blocks.END_STONE::defaultBlockState, () -> GTMaterials.Endstone, BlockBehaviour.Properties.of().mapColor(MapColor.SAND).instrument(NoteBlockInstrument.BASEDRUM) .requiresCorrectToolForDrops().strength(4.5F, 9.0F), new ResourceLocation("block/end_stone"), true, false, true); - public static final TagPrefix rawOre = new TagPrefix("raw", true) + public static final TagPrefix rawOre = new TagPrefix(GTCEu.id("raw"), true) .idPattern("raw_%s") .defaultTagPath("raw_materials/%s") .unformattedTagPath("raw_materials") @@ -213,7 +218,7 @@ public boolean isEmpty() { .generateItem(true) .generationCondition(hasOreProperty); - public static final TagPrefix rawOreBlock = new TagPrefix("rawOreBlock") + public static final TagPrefix rawOreBlock = new TagPrefix(GTCEu.id("rawOreBlock")) .idPattern("raw_%s_block") .defaultTagPath("storage_blocks/raw_%s") .unformattedTagPath("storage_blocks") @@ -224,7 +229,7 @@ public boolean isEmpty() { .generateBlock(true) .generationCondition(hasOreProperty); - public static final TagPrefix crushedRefined = new TagPrefix("refinedOre") + public static final TagPrefix crushedRefined = new TagPrefix(GTCEu.id("refinedOre")) .idPattern("refined_%s_ore") .defaultTagPath("refined_ores/%s") .defaultTagPath("refined_ores") @@ -234,7 +239,7 @@ public boolean isEmpty() { .generateItem(true) .generationCondition(hasOreProperty); - public static final TagPrefix crushedPurified = new TagPrefix("purifiedOre") + public static final TagPrefix crushedPurified = new TagPrefix(GTCEu.id("purifiedOre")) .idPattern("purified_%s_ore") .defaultTagPath("purified_ores/%s") .defaultTagPath("purified_ores") @@ -245,7 +250,7 @@ public boolean isEmpty() { .generateItem(true) .generationCondition(hasOreProperty); - public static final TagPrefix crushed = new TagPrefix("crushedOre") + public static final TagPrefix crushed = new TagPrefix(GTCEu.id("crushedOre")) .idPattern("crushed_%s_ore") .defaultTagPath("crushed_ores/%s") .unformattedTagPath("crushed_ores") @@ -257,7 +262,7 @@ public boolean isEmpty() { .tooltip((mat, tooltips) -> tooltips.add(Component.translatable("tagprefix.crushed.tooltip.purify"))); // A hot Ingot, which has to be cooled down by a Vacuum Freezer. - public static final TagPrefix ingotHot = new TagPrefix("hotIngot") + public static final TagPrefix ingotHot = new TagPrefix(GTCEu.id("hotIngot")) .idPattern("hot_%s_ingot") .defaultTagPath("hot_ingots/%s") .unformattedTagPath("hot_ingots") @@ -270,7 +275,7 @@ public boolean isEmpty() { hasBlastProperty.and(mat -> mat.getProperty(PropertyKey.BLAST).getBlastTemperature() > 1750)); // A regular Ingot. - public static final TagPrefix ingot = new TagPrefix("ingot") + public static final TagPrefix ingot = new TagPrefix(GTCEu.id("ingot")) .defaultTagPath("ingots/%s") .unformattedTagPath("ingots") .materialAmount(GTValues.M) @@ -281,7 +286,7 @@ public boolean isEmpty() { .generationCondition(hasIngotProperty); // A regular Gem worth one Dust. - public static final TagPrefix gem = new TagPrefix("gem") + public static final TagPrefix gem = new TagPrefix(GTCEu.id("gem")) .defaultTagPath("gems/%s") .unformattedTagPath("gems") .langValue("%s") @@ -293,7 +298,7 @@ public boolean isEmpty() { .generationCondition(hasGemProperty); // A regular Gem worth one small Dust. - public static final TagPrefix gemChipped = new TagPrefix("chippedGem") + public static final TagPrefix gemChipped = new TagPrefix(GTCEu.id("chippedGem")) .idPattern("chipped_%s_gem") .defaultTagPath("chipped_gems/%s") .unformattedTagPath("chipped_gems") @@ -306,7 +311,7 @@ public boolean isEmpty() { .generationCondition(hasGemProperty.and(unused -> ConfigHolder.INSTANCE.recipes.generateLowQualityGems)); // A regular Gem worth two small Dusts. - public static final TagPrefix gemFlawed = new TagPrefix("flawedGem") + public static final TagPrefix gemFlawed = new TagPrefix(GTCEu.id("flawedGem")) .idPattern("flawed_%s_gem") .defaultTagPath("flawed_gems/%s") .unformattedTagPath("flawed_gems") @@ -319,7 +324,7 @@ public boolean isEmpty() { .generationCondition(hasGemProperty.and(unused -> ConfigHolder.INSTANCE.recipes.generateLowQualityGems)); // A regular Gem worth two Dusts. - public static final TagPrefix gemFlawless = new TagPrefix("flawlessGem") + public static final TagPrefix gemFlawless = new TagPrefix(GTCEu.id("flawlessGem")) .idPattern("flawless_%s_gem") .defaultTagPath("flawless_gems/%s") .unformattedTagPath("flawless_gems") @@ -333,7 +338,7 @@ public boolean isEmpty() { .generationCondition(hasGemProperty); // A regular Gem worth four Dusts. - public static final TagPrefix gemExquisite = new TagPrefix("exquisiteGem") + public static final TagPrefix gemExquisite = new TagPrefix(GTCEu.id("exquisiteGem")) .idPattern("exquisite_%s_gem") .defaultTagPath("exquisite_gems/%s") .unformattedTagPath("exquisite_gems") @@ -347,7 +352,7 @@ public boolean isEmpty() { .generationCondition(hasGemProperty); // 1/4th of a Dust. - public static final TagPrefix dustSmall = new TagPrefix("smallDust") + public static final TagPrefix dustSmall = new TagPrefix(GTCEu.id("smallDust")) .idPattern("small_%s_dust") .defaultTagPath("small_dusts/%s") .unformattedTagPath("small_dusts") @@ -359,7 +364,7 @@ public boolean isEmpty() { .generationCondition(hasDustProperty); // 1/9th of a Dust. - public static final TagPrefix dustTiny = new TagPrefix("tinyDust") + public static final TagPrefix dustTiny = new TagPrefix(GTCEu.id("tinyDust")) .idPattern("tiny_%s_dust") .defaultTagPath("tiny_dusts/%s") .unformattedTagPath("tiny_dusts") @@ -371,7 +376,7 @@ public boolean isEmpty() { .generationCondition(hasDustProperty); // Dust with impurities. 1 Unit of Main Material and 1/9 - 1/4 Unit of secondary Material - public static final TagPrefix dustImpure = new TagPrefix("impureDust") + public static final TagPrefix dustImpure = new TagPrefix(GTCEu.id("impureDust")) .idPattern("impure_%s_dust") .defaultTagPath("impure_dusts/%s") .unformattedTagPath("impure_dusts") @@ -384,7 +389,7 @@ public boolean isEmpty() { .tooltip((mat, tooltips) -> tooltips.add(Component.translatable("tagprefix.ore_dust.tooltip.purify"))); // Pure Dust worth of one Ingot or Gem. - public static final TagPrefix dustPure = new TagPrefix("pureDust") + public static final TagPrefix dustPure = new TagPrefix(GTCEu.id("pureDust")) .idPattern("pure_%s_dust") .defaultTagPath("pure_dusts/%s") .unformattedTagPath("pure_dusts") @@ -396,7 +401,7 @@ public boolean isEmpty() { .generationCondition(hasOreProperty) .tooltip((mat, tooltips) -> tooltips.add(Component.translatable("tagprefix.ore_dust.tooltip.purify"))); - public static final TagPrefix dust = new TagPrefix("dust") + public static final TagPrefix dust = new TagPrefix(GTCEu.id("dust")) .defaultTagPath("dusts/%s") .unformattedTagPath("dusts") .materialAmount(GTValues.M) @@ -407,7 +412,7 @@ public boolean isEmpty() { .generationCondition(hasDustProperty); // A Nugget. - public static final TagPrefix nugget = new TagPrefix("nugget") + public static final TagPrefix nugget = new TagPrefix(GTCEu.id("nugget")) .defaultTagPath("nuggets/%s") .unformattedTagPath("nuggets") .materialAmount(GTValues.M / 9) @@ -418,7 +423,7 @@ public boolean isEmpty() { .generationCondition(hasIngotProperty); // 9 Plates combined in one Item. - public static final TagPrefix plateDense = new TagPrefix("densePlate") + public static final TagPrefix plateDense = new TagPrefix(GTCEu.id("densePlate")) .idPattern("dense_%s_plate") .defaultTagPath("dense_plates/%s") .unformattedTagPath("dense_plates") @@ -432,7 +437,7 @@ public boolean isEmpty() { .generationCondition(mat -> mat.hasFlag(MaterialFlags.GENERATE_DENSE)); // 2 Plates combined in one Item - public static final TagPrefix plateDouble = new TagPrefix("doublePlate") + public static final TagPrefix plateDouble = new TagPrefix(GTCEu.id("doublePlate")) .idPattern("double_%s_plate") .defaultTagPath("double_plates/%s") .unformattedTagPath("double_plates") @@ -447,7 +452,7 @@ public boolean isEmpty() { .and(mat -> mat.hasFlag(MaterialFlags.GENERATE_PLATE) && !mat.hasFlag(MaterialFlags.NO_SMASHING))); // Regular Plate made of one Ingot/Dust. - public static final TagPrefix plate = new TagPrefix("plate") + public static final TagPrefix plate = new TagPrefix(GTCEu.id("plate")) .defaultTagPath("plates/%s") .unformattedTagPath("plates") .materialAmount(GTValues.M) @@ -458,7 +463,7 @@ public boolean isEmpty() { .generationCondition(mat -> mat.hasFlag(MaterialFlags.GENERATE_PLATE)); // Round made of 1 Nugget - public static final TagPrefix round = new TagPrefix("round") + public static final TagPrefix round = new TagPrefix(GTCEu.id("round")) .defaultTagPath("rounds/%s") .unformattedTagPath("rounds") .materialAmount(GTValues.M / 9) @@ -469,7 +474,7 @@ public boolean isEmpty() { .generationCondition(mat -> mat.hasFlag(MaterialFlags.GENERATE_ROUND)); // Foil made of 1/4 Ingot/Dust. - public static final TagPrefix foil = new TagPrefix("foil") + public static final TagPrefix foil = new TagPrefix(GTCEu.id("foil")) .defaultTagPath("foils/%s") .unformattedTagPath("foils") .materialAmount(GTValues.M / 4) @@ -480,7 +485,7 @@ public boolean isEmpty() { .generationCondition(mat -> mat.hasFlag(MaterialFlags.GENERATE_FOIL)); // Stick made of an Ingot. - public static final TagPrefix rodLong = new TagPrefix("longRod") + public static final TagPrefix rodLong = new TagPrefix(GTCEu.id("longRod")) .idPattern("long_%s_rod") .defaultTagPath("rods/long/%s") .unformattedTagPath("rods/long") @@ -493,7 +498,7 @@ public boolean isEmpty() { .generationCondition(mat -> mat.hasFlag(MaterialFlags.GENERATE_LONG_ROD)); // Stick made of half an Ingot. - public static final TagPrefix rod = new TagPrefix("rod") + public static final TagPrefix rod = new TagPrefix(GTCEu.id("rod")) .defaultTagPath("rods/%s") .unformattedTagPath("rods") .langValue("%s Rod") @@ -505,7 +510,7 @@ public boolean isEmpty() { .generationCondition(mat -> mat.hasFlag(MaterialFlags.GENERATE_ROD)); // consisting out of 1/8 Ingot or 1/4 Stick. - public static final TagPrefix bolt = new TagPrefix("bolt") + public static final TagPrefix bolt = new TagPrefix(GTCEu.id("bolt")) .defaultTagPath("bolts/%s") .unformattedTagPath("bolts") .materialAmount(GTValues.M / 8) @@ -516,7 +521,7 @@ public boolean isEmpty() { .generationCondition(mat -> mat.hasFlag(MaterialFlags.GENERATE_BOLT_SCREW)); // consisting out of 1/9 Ingot. - public static final TagPrefix screw = new TagPrefix("screw") + public static final TagPrefix screw = new TagPrefix(GTCEu.id("screw")) .defaultTagPath("screws/%s") .unformattedTagPath("screws") .materialAmount(GTValues.M / 9) @@ -527,7 +532,7 @@ public boolean isEmpty() { .generationCondition(mat -> mat.hasFlag(MaterialFlags.GENERATE_BOLT_SCREW)); // consisting out of 1/2 Stick. - public static final TagPrefix ring = new TagPrefix("ring") + public static final TagPrefix ring = new TagPrefix(GTCEu.id("ring")) .defaultTagPath("rings/%s") .unformattedTagPath("rings") .materialAmount(GTValues.M / 4) @@ -538,7 +543,7 @@ public boolean isEmpty() { .generationCondition(mat -> mat.hasFlag(MaterialFlags.GENERATE_RING)); // consisting out of 1 Fine Wire. - public static final TagPrefix springSmall = new TagPrefix("smallSpring") + public static final TagPrefix springSmall = new TagPrefix(GTCEu.id("smallSpring")) .idPattern("small_%s_spring") .defaultTagPath("small_springs/%s") .unformattedTagPath("small_springs") @@ -552,7 +557,7 @@ public boolean isEmpty() { mat -> mat.hasFlag(MaterialFlags.GENERATE_SPRING_SMALL) && !mat.hasFlag(MaterialFlags.NO_SMASHING)); // consisting out of 2 Sticks. - public static final TagPrefix spring = new TagPrefix("spring") + public static final TagPrefix spring = new TagPrefix(GTCEu.id("spring")) .defaultTagPath("springs/%s") .unformattedTagPath("springs") .materialAmount(GTValues.M) @@ -564,7 +569,7 @@ public boolean isEmpty() { mat -> mat.hasFlag(MaterialFlags.GENERATE_SPRING) && !mat.hasFlag(MaterialFlags.NO_SMASHING)); // consisting out of 1/8 Ingot or 1/4 Wire. - public static final TagPrefix wireFine = new TagPrefix("fineWire") + public static final TagPrefix wireFine = new TagPrefix(GTCEu.id("fineWire")) .idPattern("fine_%s_wire") .defaultTagPath("fine_wires/%s") .unformattedTagPath("fine_wires") @@ -577,7 +582,7 @@ public boolean isEmpty() { .generationCondition(mat -> mat.hasFlag(MaterialFlags.GENERATE_FINE_WIRE)); // consisting out of 4 Plates, 1 Ring and 1 Screw. - public static final TagPrefix rotor = new TagPrefix("rotor") + public static final TagPrefix rotor = new TagPrefix(GTCEu.id("rotor")) .defaultTagPath("rotors/%s") .unformattedTagPath("rotors") .materialAmount(GTValues.M * 4) @@ -589,7 +594,7 @@ public boolean isEmpty() { .generationCondition(mat -> mat.hasFlag(MaterialFlags.GENERATE_ROTOR)); // Consisting of 1 Plate. - public static final TagPrefix gearSmall = new TagPrefix("smallGear") + public static final TagPrefix gearSmall = new TagPrefix(GTCEu.id("smallGear")) .idPattern("small_%s_gear") .defaultTagPath("small_gears/%s") .unformattedTagPath("small_gears") @@ -602,7 +607,7 @@ public boolean isEmpty() { .generationCondition(mat -> mat.hasFlag(MaterialFlags.GENERATE_SMALL_GEAR)); // Consisting of 4 Plates. - public static final TagPrefix gear = new TagPrefix("gear") + public static final TagPrefix gear = new TagPrefix(GTCEu.id("gear")) .defaultTagPath("gears/%s") .unformattedTagPath("gears") .materialAmount(GTValues.M * 4) @@ -614,7 +619,7 @@ public boolean isEmpty() { .generationCondition(mat -> mat.hasFlag(MaterialFlags.GENERATE_GEAR)); // 3/4 of a Plate or Gem used to shape a Lens. Normally only used on Transparent Materials. - public static final TagPrefix lens = new TagPrefix("lens") + public static final TagPrefix lens = new TagPrefix(GTCEu.id("lens")) .defaultTagPath("lenses/%s") .unformattedTagPath("lenses") .materialAmount((GTValues.M * 3) / 4) @@ -624,13 +629,13 @@ public boolean isEmpty() { .generateItem(true) .generationCondition(mat -> mat.hasFlag(MaterialFlags.GENERATE_LENS)); - public static final TagPrefix dye = new TagPrefix("dye") + public static final TagPrefix dye = new TagPrefix(GTCEu.id("dye")) .defaultTagPath("dyes/%s") .unformattedTagPath("dyes") .materialAmount(-1); // made of 4 Ingots. - public static final TagPrefix toolHeadBuzzSaw = new TagPrefix("buzzSawBlade") + public static final TagPrefix toolHeadBuzzSaw = new TagPrefix(GTCEu.id("buzzSawBlade")) .itemTable(() -> GTMaterialItems.MATERIAL_ITEMS) .langValue("%s Buzzsaw Blade") .materialAmount(GTValues.M * 4) @@ -643,7 +648,7 @@ public boolean isEmpty() { .and(mat -> mat.getProperty(PropertyKey.TOOL).hasType(GTToolType.BUZZSAW))); // made of 1 Ingots. - public static final TagPrefix toolHeadScrewdriver = new TagPrefix("screwdriverTip") + public static final TagPrefix toolHeadScrewdriver = new TagPrefix(GTCEu.id("screwdriverTip")) .itemTable(() -> GTMaterialItems.MATERIAL_ITEMS) .langValue("%s Screwdriver Tip") .materialAmount(GTValues.M) @@ -656,7 +661,7 @@ public boolean isEmpty() { .and(mat -> mat.getProperty(PropertyKey.TOOL).hasType(GTToolType.SCREWDRIVER_LV))); // made of 4 Ingots. - public static final TagPrefix toolHeadDrill = new TagPrefix("drillHead") + public static final TagPrefix toolHeadDrill = new TagPrefix(GTCEu.id("drillHead")) .itemTable(() -> GTMaterialItems.MATERIAL_ITEMS) .langValue("%s Drill Head") .materialAmount(GTValues.M * 4) @@ -669,7 +674,7 @@ public boolean isEmpty() { .and(mat -> mat.getProperty(PropertyKey.TOOL).hasType(GTToolType.DRILL_LV))); // made of 2 Ingots. - public static final TagPrefix toolHeadChainsaw = new TagPrefix("chainsawHead") + public static final TagPrefix toolHeadChainsaw = new TagPrefix(GTCEu.id("chainsawHead")) .itemTable(() -> GTMaterialItems.MATERIAL_ITEMS) .langValue("%s Chainsaw Head") .materialAmount(GTValues.M * 2) @@ -682,7 +687,7 @@ public boolean isEmpty() { .and(mat -> mat.getProperty(PropertyKey.TOOL).hasType(GTToolType.CHAINSAW_LV))); // made of 4 Ingots. - public static final TagPrefix toolHeadWrench = new TagPrefix("wrenchTip") + public static final TagPrefix toolHeadWrench = new TagPrefix(GTCEu.id("wrenchTip")) .itemTable(() -> GTMaterialItems.MATERIAL_ITEMS) .langValue("%s Wrench Tip") .materialAmount(GTValues.M * 4) @@ -694,7 +699,7 @@ public boolean isEmpty() { .generationCondition(hasNoCraftingToolProperty.and(mat -> mat.hasFlag(MaterialFlags.GENERATE_PLATE)) .and(mat -> mat.getProperty(PropertyKey.TOOL).hasType(GTToolType.WRENCH_LV))); - public static final TagPrefix toolHeadWireCutter = new TagPrefix("wireCutterHead") + public static final TagPrefix toolHeadWireCutter = new TagPrefix(GTCEu.id("wireCutterHead")) .itemTable(() -> GTMaterialItems.MATERIAL_ITEMS) .langValue("%s Wire Cutter Head") .materialAmount(GTValues.M * 4) @@ -707,7 +712,7 @@ public boolean isEmpty() { .and(mat -> mat.getProperty(PropertyKey.TOOL).hasType(GTToolType.WIRE_CUTTER_LV))); // made of 5 Ingots. - public static final TagPrefix turbineBlade = new TagPrefix("turbineBlade") + public static final TagPrefix turbineBlade = new TagPrefix(GTCEu.id("turbineBlade")) .itemTable(() -> GTMaterialItems.MATERIAL_ITEMS) .langValue("%s Turbine Blade") .materialAmount(GTValues.M * 10) @@ -720,7 +725,7 @@ public boolean isEmpty() { !m.hasProperty(PropertyKey.GEM))); // Storage Block consisting out of 9 Ingots/Gems/Dusts. - public static final TagPrefix block = new TagPrefix("block") + public static final TagPrefix block = new TagPrefix(GTCEu.id("block")) .defaultTagPath("storage_blocks/%s") .unformattedTagPath("storage_blocks") .langValue("Block of %s") @@ -733,24 +738,24 @@ public boolean isEmpty() { .unificationEnabled(true) .enableRecycling(); - public static final TagPrefix log = new TagPrefix("log") + public static final TagPrefix log = new TagPrefix(GTCEu.id("log")) .unformattedTagPath("logs", true); - public static final TagPrefix planks = new TagPrefix("planks") + public static final TagPrefix planks = new TagPrefix(GTCEu.id("planks")) .unformattedTagPath("planks", true); - public static final TagPrefix slab = new TagPrefix("slab") + public static final TagPrefix slab = new TagPrefix(GTCEu.id("slab")) .unformattedTagPath("slabs", true); - public static final TagPrefix stairs = new TagPrefix("stairs") + public static final TagPrefix stairs = new TagPrefix(GTCEu.id("stairs")) .unformattedTagPath("stairs", true); - public static final TagPrefix fence = new TagPrefix("fence") + public static final TagPrefix fence = new TagPrefix(GTCEu.id("fence")) .unformattedTagPath("fences"); - public static final TagPrefix fenceGate = new TagPrefix("fenceGate") + public static final TagPrefix fenceGate = new TagPrefix(GTCEu.id("fenceGate")) .unformattedTagPath("fence_gates"); - public static final TagPrefix door = new TagPrefix("door") + public static final TagPrefix door = new TagPrefix(GTCEu.id("door")) .unformattedTagPath("doors", true); // Prefix to determine which kind of Rock this is. // Also has a base tag path of only the material, for things like obsidian etc. - public static final TagPrefix rock = new TagPrefix("rock") + public static final TagPrefix rock = new TagPrefix(GTCEu.id("rock")) .defaultTagPath("%s") .langValue("%s") .miningToolTag(BlockTags.MINEABLE_WITH_PICKAXE) @@ -758,7 +763,7 @@ public boolean isEmpty() { .generateBlock(true) // generate a block but not really, for TagPrefix#setIgnoredBlock .generationCondition((material) -> false); - public static final TagPrefix frameGt = new TagPrefix("frame") + public static final TagPrefix frameGt = new TagPrefix(GTCEu.id("frame")) .defaultTagPath("frames/%s") .unformattedTagPath("frames") .langValue("%s Frame") @@ -773,35 +778,35 @@ public boolean isEmpty() { material.hasFlag(MaterialFlags.GENERATE_FRAME)); // Pipes - public static final TagPrefix pipeTinyFluid = new TagPrefix("pipeTinyFluid") + public static final TagPrefix pipeTinyFluid = new TagPrefix(GTCEu.id("pipeTinyFluid")) .itemTable(() -> GTMaterialBlocks.FLUID_PIPE_BLOCKS) .langValue("Tiny %s Fluid Pipe") .miningToolTag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WRENCH) .materialAmount(GTValues.M / 2) .unificationEnabled(true) .enableRecycling(); - public static final TagPrefix pipeSmallFluid = new TagPrefix("pipeSmallFluid") + public static final TagPrefix pipeSmallFluid = new TagPrefix(GTCEu.id("pipeSmallFluid")) .itemTable(() -> GTMaterialBlocks.FLUID_PIPE_BLOCKS) .langValue("Small %s Fluid Pipe") .miningToolTag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WRENCH) .materialAmount(GTValues.M) .unificationEnabled(true) .enableRecycling(); - public static final TagPrefix pipeNormalFluid = new TagPrefix("pipeNormalFluid") + public static final TagPrefix pipeNormalFluid = new TagPrefix(GTCEu.id("pipeNormalFluid")) .itemTable(() -> GTMaterialBlocks.FLUID_PIPE_BLOCKS) .langValue("Normal %s Fluid Pipe") .miningToolTag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WRENCH) .materialAmount(GTValues.M * 3) .unificationEnabled(true) .enableRecycling(); - public static final TagPrefix pipeLargeFluid = new TagPrefix("pipeLargeFluid") + public static final TagPrefix pipeLargeFluid = new TagPrefix(GTCEu.id("pipeLargeFluid")) .itemTable(() -> GTMaterialBlocks.FLUID_PIPE_BLOCKS) .langValue("Large %s Fluid Pipe") .miningToolTag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WRENCH) .materialAmount(GTValues.M * 6) .unificationEnabled(true) .enableRecycling(); - public static final TagPrefix pipeHugeFluid = new TagPrefix("pipeHugeFluid") + public static final TagPrefix pipeHugeFluid = new TagPrefix(GTCEu.id("pipeHugeFluid")) .itemTable(() -> GTMaterialBlocks.FLUID_PIPE_BLOCKS) .langValue("Huge %s Fluid Pipe") .miningToolTag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WRENCH) @@ -809,14 +814,14 @@ public boolean isEmpty() { .unificationEnabled(true) .enableRecycling(); - public static final TagPrefix pipeQuadrupleFluid = new TagPrefix("pipeQuadrupleFluid") + public static final TagPrefix pipeQuadrupleFluid = new TagPrefix(GTCEu.id("pipeQuadrupleFluid")) .itemTable(() -> GTMaterialBlocks.FLUID_PIPE_BLOCKS) .langValue("Quadruple %s Fluid Pipe") .miningToolTag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WRENCH) .materialAmount(GTValues.M * 4) .unificationEnabled(true) .enableRecycling(); - public static final TagPrefix pipeNonupleFluid = new TagPrefix("pipeNonupleFluid") + public static final TagPrefix pipeNonupleFluid = new TagPrefix(GTCEu.id("pipeNonupleFluid")) .itemTable(() -> GTMaterialBlocks.FLUID_PIPE_BLOCKS) .langValue("Nonuple %s Fluid Pipe") .miningToolTag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WRENCH) @@ -824,28 +829,28 @@ public boolean isEmpty() { .unificationEnabled(true) .enableRecycling(); - public static final TagPrefix pipeSmallItem = new TagPrefix("pipeSmallItem") + public static final TagPrefix pipeSmallItem = new TagPrefix(GTCEu.id("pipeSmallItem")) .itemTable(() -> GTMaterialBlocks.ITEM_PIPE_BLOCKS) .langValue("Small %s Item Pipe") .miningToolTag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WRENCH) .materialAmount(GTValues.M) .unificationEnabled(true) .enableRecycling(); - public static final TagPrefix pipeNormalItem = new TagPrefix("pipeNormalItem") + public static final TagPrefix pipeNormalItem = new TagPrefix(GTCEu.id("pipeNormalItem")) .itemTable(() -> GTMaterialBlocks.ITEM_PIPE_BLOCKS) .langValue("Normal %s Item Pipe") .miningToolTag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WRENCH) .materialAmount(GTValues.M * 3) .unificationEnabled(true) .enableRecycling(); - public static final TagPrefix pipeLargeItem = new TagPrefix("pipeLargeItem") + public static final TagPrefix pipeLargeItem = new TagPrefix(GTCEu.id("pipeLargeItem")) .itemTable(() -> GTMaterialBlocks.ITEM_PIPE_BLOCKS) .langValue("Large %s Item Pipe") .miningToolTag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WRENCH) .materialAmount(GTValues.M * 6) .unificationEnabled(true) .enableRecycling(); - public static final TagPrefix pipeHugeItem = new TagPrefix("pipeHugeItem") + public static final TagPrefix pipeHugeItem = new TagPrefix(GTCEu.id("pipeHugeItem")) .itemTable(() -> GTMaterialBlocks.ITEM_PIPE_BLOCKS) .langValue("Huge %s Item Pipe") .miningToolTag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WRENCH) @@ -853,38 +858,39 @@ public boolean isEmpty() { .unificationEnabled(true) .enableRecycling(); - public static final TagPrefix pipeSmallRestrictive = new TagPrefix("pipeSmallRestrictive") + public static final TagPrefix pipeSmallRestrictive = new TagPrefix(GTCEu.id("pipeSmallRestrictive")) .itemTable(() -> GTMaterialBlocks.ITEM_PIPE_BLOCKS) .langValue("Small Restrictive %s Item Pipe") .miningToolTag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WRENCH) .materialAmount(GTValues.M) .unificationEnabled(true) .enableRecycling(); - public static final TagPrefix pipeNormalRestrictive = new TagPrefix("pipeNormalRestrictive") + public static final TagPrefix pipeNormalRestrictive = new TagPrefix(GTCEu.id("pipeNormalRestrictive")) .itemTable(() -> GTMaterialBlocks.ITEM_PIPE_BLOCKS).langValue("Normal Restrictive %s Item Pipe") .miningToolTag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WRENCH).materialAmount(GTValues.M * 3) .unificationEnabled(true) .enableRecycling(); - public static final TagPrefix pipeLargeRestrictive = new TagPrefix("pipeLargeRestrictive") + public static final TagPrefix pipeLargeRestrictive = new TagPrefix(GTCEu.id("pipeLargeRestrictive")) .itemTable(() -> GTMaterialBlocks.ITEM_PIPE_BLOCKS).langValue("Large Restrictive %s Item Pipe") .miningToolTag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WRENCH).materialAmount(GTValues.M * 6) .unificationEnabled(true) .enableRecycling(); - public static final TagPrefix pipeHugeRestrictive = new TagPrefix("pipeHugeRestrictive") + public static final TagPrefix pipeHugeRestrictive = new TagPrefix(GTCEu.id("pipeHugeRestrictive")) .itemTable(() -> GTMaterialBlocks.ITEM_PIPE_BLOCKS).langValue("Huge Restrictive %s Item Pipe") .miningToolTag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WRENCH).materialAmount(GTValues.M * 12) .unificationEnabled(true) .enableRecycling(); // Wires and cables - public static final TagPrefix wireGtHex = new TagPrefix("wireGtHex").itemTable(() -> GTMaterialBlocks.CABLE_BLOCKS) + public static final TagPrefix wireGtHex = new TagPrefix(GTCEu.id("wireGtHex")) + .itemTable(() -> GTMaterialBlocks.CABLE_BLOCKS) .langValue("16x %s Wire") .miningToolTag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WIRE_CUTTER) .materialAmount(GTValues.M * 8) .materialIconType(MaterialIconType.wire) .unificationEnabled(true) .enableRecycling(); - public static final TagPrefix wireGtOctal = new TagPrefix("wireGtOctal") + public static final TagPrefix wireGtOctal = new TagPrefix(GTCEu.id("wireGtOctal")) .itemTable(() -> GTMaterialBlocks.CABLE_BLOCKS) .langValue("8x %s Wire") .miningToolTag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WIRE_CUTTER) @@ -892,7 +898,7 @@ public boolean isEmpty() { .materialIconType(MaterialIconType.wire) .unificationEnabled(true) .enableRecycling(); - public static final TagPrefix wireGtQuadruple = new TagPrefix("wireGtQuadruple") + public static final TagPrefix wireGtQuadruple = new TagPrefix(GTCEu.id("wireGtQuadruple")) .itemTable(() -> GTMaterialBlocks.CABLE_BLOCKS) .langValue("4x %s Wire") .miningToolTag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WIRE_CUTTER) @@ -900,7 +906,7 @@ public boolean isEmpty() { .materialIconType(MaterialIconType.wire) .unificationEnabled(true) .enableRecycling(); - public static final TagPrefix wireGtDouble = new TagPrefix("wireGtDouble") + public static final TagPrefix wireGtDouble = new TagPrefix(GTCEu.id("wireGtDouble")) .itemTable(() -> GTMaterialBlocks.CABLE_BLOCKS) .langValue("2x %s Wire") .miningToolTag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WIRE_CUTTER) @@ -908,7 +914,7 @@ public boolean isEmpty() { .materialIconType(MaterialIconType.wire) .unificationEnabled(true) .enableRecycling(); - public static final TagPrefix wireGtSingle = new TagPrefix("wireGtSingle") + public static final TagPrefix wireGtSingle = new TagPrefix(GTCEu.id("wireGtSingle")) .itemTable(() -> GTMaterialBlocks.CABLE_BLOCKS) .langValue("1x %s Wire") .miningToolTag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WIRE_CUTTER) @@ -917,34 +923,34 @@ public boolean isEmpty() { .unificationEnabled(true) .enableRecycling(); - public static final TagPrefix cableGtHex = new TagPrefix("cableGtHex") + public static final TagPrefix cableGtHex = new TagPrefix(GTCEu.id("cableGtHex")) .itemTable(() -> GTMaterialBlocks.CABLE_BLOCKS) .langValue("16x %s Cable") .miningToolTag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WIRE_CUTTER) .materialAmount(GTValues.M * 8) .unificationEnabled(true) .enableRecycling(); - public static final TagPrefix cableGtOctal = new TagPrefix("cableGtOctal") + public static final TagPrefix cableGtOctal = new TagPrefix(GTCEu.id("cableGtOctal")) .itemTable(() -> GTMaterialBlocks.CABLE_BLOCKS) .langValue("8x %s Cable") .miningToolTag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WIRE_CUTTER) .materialAmount(GTValues.M * 4) .unificationEnabled(true) .enableRecycling(); - public static final TagPrefix cableGtQuadruple = new TagPrefix("cableGtQuadruple") + public static final TagPrefix cableGtQuadruple = new TagPrefix(GTCEu.id("cableGtQuadruple")) .itemTable(() -> GTMaterialBlocks.CABLE_BLOCKS).langValue("4x %s Cable") .miningToolTag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WIRE_CUTTER) .materialAmount(GTValues.M * 2) .unificationEnabled(true) .enableRecycling(); - public static final TagPrefix cableGtDouble = new TagPrefix("cableGtDouble") + public static final TagPrefix cableGtDouble = new TagPrefix(GTCEu.id("cableGtDouble")) .itemTable(() -> GTMaterialBlocks.CABLE_BLOCKS) .langValue("2x %s Cable") .miningToolTag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WIRE_CUTTER) .materialAmount(GTValues.M) .unificationEnabled(true) .enableRecycling(); - public static final TagPrefix cableGtSingle = new TagPrefix("cableGtSingle") + public static final TagPrefix cableGtSingle = new TagPrefix(GTCEu.id("cableGtSingle")) .itemTable(() -> GTMaterialBlocks.CABLE_BLOCKS) .langValue("1x %s Cable") .miningToolTag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WIRE_CUTTER) @@ -952,7 +958,7 @@ public boolean isEmpty() { .unificationEnabled(true) .enableRecycling(); - public static final TagPrefix surfaceRock = new TagPrefix("surfaceRock") + public static final TagPrefix surfaceRock = new TagPrefix(GTCEu.id("surfaceRock")) .langValue("%s Surface Rock") .defaultTagPath("surface_rocks/%s") .unformattedTagPath("surface_rocks") @@ -978,6 +984,9 @@ public record OreType(Supplier stoneType, Supplier materia public record BlockProperties(Supplier> renderType, UnaryOperator properties) {} + @Getter + public final ResourceLocation id; + @Getter public final String name; @Getter @@ -1049,20 +1058,41 @@ public record BlockProperties(Supplier> renderType, @Getter protected final Set> miningToolTag = new HashSet<>(); + /** + * @deprecated Use {@link TagPrefix#TagPrefix(ResourceLocation)} + */ + @Deprecated(since = "8.0.0") public TagPrefix(String name) { this(name, false); } + /** + * @deprecated Use {@link TagPrefix#TagPrefix(ResourceLocation, boolean)} + */ + @Deprecated(since = "8.0.0") public TagPrefix(String name, boolean invertedName) { - this.name = name; + this(GTCEu.id(name), invertedName); + } + + public TagPrefix(ResourceLocation id) { + this(id, false); + } + + public TagPrefix(ResourceLocation id, boolean invertedName) { + this.id = id; + this.name = id.getPath(); this.idPattern = "%s_" + getLowerCaseName(); this.invertedName = invertedName; this.langValue = "%s " + FormattingUtil.toEnglishName(getLowerCaseName()); - PREFIXES.put(name, this); + GTRegistries.TAG_PREFIXES.register(id, this); } public static TagPrefix oreTagPrefix(String name, TagKey miningToolTag) { - return new TagPrefix(name) + return oreTagPrefix(GTCEu.id(name), miningToolTag); + } + + public static TagPrefix oreTagPrefix(ResourceLocation id, TagKey miningToolTag) { + return new TagPrefix(id) .defaultTagPath("ores/%s") .prefixOnlyTagPath("ores_in_ground/%s") .unformattedTagPath("ores") @@ -1167,12 +1197,20 @@ public long getMaterialAmount(@NotNull Material material) { return (long) (GTValues.M * materialAmounts.getFloat(material)); } + /** + * @deprecated Use {@code GTRegistries.TAG_PREFIXES.get(name)} + */ + @Deprecated(since = "8.0.0") public static TagPrefix getPrefix(String prefixName) { return getPrefix(prefixName, null); } + /** + * @deprecated Use {@code GTRegistries.TAG_PREFIXES.getOrDefault(prefixName, replacement)} + */ + @Deprecated(since = "8.0.0") public static TagPrefix getPrefix(String prefixName, @Nullable TagPrefix replacement) { - return PREFIXES.getOrDefault(prefixName, replacement); + return GTRegistries.TAG_PREFIXES.getOrDefault(GTCEu.id(prefixName), replacement); } public @Unmodifiable List> getItemParentTags() { @@ -1356,8 +1394,12 @@ public int hashCode() { return name.hashCode(); } + /** + * @deprecated Use {@code GTRegistries.TAG_PREFIXES.values()} + */ + @Deprecated(since = "8.0.0") public static Collection values() { - return PREFIXES.values(); + return GTRegistries.TAG_PREFIXES.values(); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/GTLayerPattern.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/GTLayerPattern.java index 1e3f77f0b85..e2ce393ef5a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/GTLayerPattern.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/GTLayerPattern.java @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.api.data.worldgen; -import com.gregtechceu.gtceu.api.GTCEuAPI; import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.worldgen.generator.VeinGenerator; +import com.gregtechceu.gtceu.api.registry.GTRegistries; import net.minecraft.util.RandomSource; import net.minecraft.world.level.block.Block; @@ -84,7 +84,7 @@ public GTLayerPattern build() { public static class Layer { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - Codec.list(Codec.either(TargetBlockState.CODEC.listOf(), GTCEuAPI.materialManager.codec())) + Codec.list(Codec.either(TargetBlockState.CODEC.listOf(), GTRegistries.MATERIALS.codec())) .fieldOf("targets") .forGetter(layer -> layer.targets), Codec.intRange(0, Integer.MAX_VALUE) diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/GTOreDefinition.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/GTOreDefinition.java index d449ddcf3a7..a0b846e7473 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/GTOreDefinition.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/GTOreDefinition.java @@ -64,7 +64,7 @@ public class GTOreDefinition { IntProvider.NON_NEGATIVE_CODEC.fieldOf("cluster_size").forGetter(ft -> ft.clusterSize), Codec.floatRange(0.0F, 1.0F).fieldOf("density").forGetter(ft -> ft.density), Codec.INT.fieldOf("weight").forGetter(ft -> ft.weight), - IWorldGenLayer.CODEC.fieldOf("layer").forGetter(ft -> ft.layer), + GTRegistries.WORLD_GEN_LAYERS.codec().fieldOf("layer").forGetter(ft -> ft.layer), ResourceKey.codec(Registries.DIMENSION).listOf().fieldOf("dimension_filter") .forGetter(ft -> new ArrayList<>(ft.dimensionFilter)), HeightRangePlacement.CODEC.fieldOf("height_range").forGetter(ft -> ft.range), diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/IWorldGenLayer.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/IWorldGenLayer.java index 2d5e90ef064..8371676d425 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/IWorldGenLayer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/IWorldGenLayer.java @@ -1,20 +1,14 @@ package com.gregtechceu.gtceu.api.data.worldgen; import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.ExtraCodecs; import net.minecraft.util.StringRepresentable; import net.minecraft.world.level.levelgen.structure.templatesystem.AlwaysTrueTest; import net.minecraft.world.level.levelgen.structure.templatesystem.RuleTest; -import com.mojang.serialization.Codec; - import java.util.Set; public interface IWorldGenLayer extends StringRepresentable { - Codec CODEC = ExtraCodecs.stringResolverCodec(StringRepresentable::getSerializedName, - WorldGeneratorUtils.WORLD_GEN_LAYERS::get); - boolean isApplicableForLevel(ResourceLocation level); Set getLevels(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/SimpleWorldGenLayer.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/SimpleWorldGenLayer.java index e5f32fc9b52..231ea92246f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/SimpleWorldGenLayer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/SimpleWorldGenLayer.java @@ -1,30 +1,35 @@ package com.gregtechceu.gtceu.api.data.worldgen; +import com.gregtechceu.gtceu.api.registry.GTRegistries; + import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.levelgen.structure.templatesystem.RuleTest; import com.mojang.serialization.JsonOps; import lombok.Getter; +import org.jetbrains.annotations.NotNull; import java.util.Set; public class SimpleWorldGenLayer implements IWorldGenLayer { - private final String name; + private final ResourceLocation id; private final IWorldGenLayer.RuleTestSupplier target; @Getter private final Set levels; - public SimpleWorldGenLayer(String name, IWorldGenLayer.RuleTestSupplier target, Set levels) { - this.name = name; + public SimpleWorldGenLayer(ResourceLocation id, IWorldGenLayer.RuleTestSupplier target, + Set levels) { + this.id = id; this.target = target; this.levels = levels; - WorldGeneratorUtils.WORLD_GEN_LAYERS.put(name, this); + + GTRegistries.WORLD_GEN_LAYERS.register(id, this); } @Override - public String getSerializedName() { - return name; + public @NotNull String getSerializedName() { + return id.toString(); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/WorldGenLayers.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/WorldGenLayers.java index 796f84f9859..e9221af82c3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/WorldGenLayers.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/WorldGenLayers.java @@ -1,76 +1,46 @@ package com.gregtechceu.gtceu.api.data.worldgen; import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.GTCEuAPI; import com.gregtechceu.gtceu.api.addon.AddonFinder; import com.gregtechceu.gtceu.api.addon.IGTAddon; +import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.integration.kjs.GTRegistryInfo; -import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BlockTags; -import net.minecraft.util.StringRepresentable; import net.minecraft.world.level.Level; -import net.minecraft.world.level.levelgen.structure.templatesystem.RuleTest; import net.minecraft.world.level.levelgen.structure.templatesystem.TagMatchTest; - -import lombok.Getter; -import lombok.Setter; -import org.jetbrains.annotations.NotNull; +import net.minecraftforge.fml.ModLoader; import java.util.Set; -public enum WorldGenLayers implements IWorldGenLayer, StringRepresentable { - - STONE( - "stone", new TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES), - Set.of(Level.OVERWORLD.location())), - DEEPSLATE( - "deepslate", new TagMatchTest(BlockTags.DEEPSLATE_ORE_REPLACEABLES), - Set.of(Level.OVERWORLD.location())), - NETHERRACK( - "netherrack", new TagMatchTest(BlockTags.NETHER_CARVER_REPLACEABLES), - Set.of(Level.NETHER.location())), - ENDSTONE( - "endstone", WorldGeneratorUtils.END_ORE_REPLACEABLES, - Set.of(Level.END.location())); +public class WorldGenLayers { - private final String name; + static { + GTRegistries.WORLD_GEN_LAYERS.unfreeze(); + } - @SuppressWarnings("NonFinalFieldInEnum") - @Getter - @Setter - private Set levels; + public static final SimpleWorldGenLayer STONE = new SimpleWorldGenLayer( + GTCEu.id("stone"), () -> new TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES), + Set.of(Level.OVERWORLD.location())); - @SuppressWarnings("NonFinalFieldInEnum") - @Getter - @Setter - private RuleTest target; + public static final SimpleWorldGenLayer DEEPSLATE = new SimpleWorldGenLayer( + GTCEu.id("deepslate"), () -> new TagMatchTest(BlockTags.DEEPSLATE_ORE_REPLACEABLES), + Set.of(Level.OVERWORLD.location())); - WorldGenLayers(String name, RuleTest target, Set levels) { - this.name = name; - this.target = target; - this.levels = levels; - WorldGeneratorUtils.WORLD_GEN_LAYERS.put(name, this); - } + public static final SimpleWorldGenLayer NETHERRACK = new SimpleWorldGenLayer( + GTCEu.id("netherrack"), () -> new TagMatchTest(BlockTags.NETHER_CARVER_REPLACEABLES), + Set.of(Level.NETHER.location())); + public static final SimpleWorldGenLayer ENDSTONE = new SimpleWorldGenLayer( + GTCEu.id("endstone"), () -> WorldGeneratorUtils.END_ORE_REPLACEABLES, + Set.of(Level.END.location())); - public static void registerAll() { + public static void init() { AddonFinder.getAddons().forEach(IGTAddon::registerWorldgenLayers); + ModLoader.get().postEvent(new GTCEuAPI.RegisterEvent<>(GTRegistries.WORLD_GEN_LAYERS, IWorldGenLayer.class)); if (GTCEu.Mods.isKubeJSLoaded()) { - GTRegistryInfo.registerFor(GTRegistryInfo.WORLD_GEN_LAYER.registryKey); + GTRegistryInfo.registerFor(GTRegistries.WORLD_GEN_LAYERS.getRegistryName()); } - } - - public static IWorldGenLayer getByName(String name) { - return WorldGeneratorUtils.WORLD_GEN_LAYERS.get(name); - } - - @Override - @NotNull - public String getSerializedName() { - return name; - } - - @Override - public boolean isApplicableForLevel(ResourceLocation level) { - return levels.contains(level); + GTRegistries.WORLD_GEN_LAYERS.freeze(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/WorldGeneratorUtils.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/WorldGeneratorUtils.java index 9c1a65a46fc..5d3bca68002 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/WorldGeneratorUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/WorldGeneratorUtils.java @@ -21,7 +21,6 @@ import com.google.common.collect.HashBiMap; import com.mojang.serialization.Codec; -import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -38,8 +37,6 @@ public class WorldGeneratorUtils { private static final Map oreVeinCache = new WeakHashMap<>(); - public static final SortedMap WORLD_GEN_LAYERS = new Object2ObjectLinkedOpenHashMap<>(); - public static final HashBiMap> VEIN_GENERATORS = HashBiMap .create(); public static final HashBiMap> VEIN_GENERATOR_FUNCTIONS = HashBiMap @@ -82,13 +79,6 @@ public static List getCachedBiomeVeins(ServerLevel level, Holder getWorldGenLayerKey(IWorldGenLayer layer) { - return WORLD_GEN_LAYERS.entrySet().stream() - .filter(entry -> entry.getValue().equals(layer)) - .map(Entry::getKey) - .findFirst(); - } - public static boolean isSameDimension(ResourceKey first, ResourceKey second) { return first == second; } @@ -100,7 +90,7 @@ public static Map> groupByChunks(Map Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (a, b) -> a, Object2ObjectOpenHashMap::new))); } - public static Map> groupByChunks(Collection positions) { + public static Map> groupByChunks(Collection positions) { return positions.stream().collect(Collectors.groupingBy(ChunkPos::new)); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/bedrockore/OreVeinWorldEntry.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/bedrockore/OreVeinWorldEntry.java index 285cf3f4047..bbfea9203e8 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/bedrockore/OreVeinWorldEntry.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/bedrockore/OreVeinWorldEntry.java @@ -56,7 +56,7 @@ public static OreVeinWorldEntry readFromNBT(@NotNull CompoundTag tag) { if (tag.contains("vein")) { ResourceLocation id = new ResourceLocation(tag.getString("vein")); - if (GTRegistries.BEDROCK_ORE_DEFINITIONS.containKey(id)) { + if (GTRegistries.BEDROCK_ORE_DEFINITIONS.containsKey(id)) { info.definition = GTRegistries.BEDROCK_ORE_DEFINITIONS.get(id); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/bedrockore/WeightedMaterial.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/bedrockore/WeightedMaterial.java index d2406a5a58b..c6aa5690de6 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/bedrockore/WeightedMaterial.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/bedrockore/WeightedMaterial.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.api.data.worldgen.bedrockore; -import com.gregtechceu.gtceu.api.GTCEuAPI; import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.utils.WeightedEntry; import com.mojang.serialization.Codec; @@ -11,7 +11,7 @@ public record WeightedMaterial(Material material, int weight) implements Weighte public static final Codec CODEC = RecordCodecBuilder.create( instance -> instance.group( - GTCEuAPI.materialManager.codec().fieldOf("material").forGetter(WeightedMaterial::material), + GTRegistries.MATERIALS.codec().fieldOf("material").forGetter(WeightedMaterial::material), Codec.INT.fieldOf("weight").forGetter(WeightedMaterial::weight)) .apply(instance, WeightedMaterial::new)); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/generator/VeinGenerator.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/generator/VeinGenerator.java index f95bee12d0e..92a954d7a4a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/generator/VeinGenerator.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/generator/VeinGenerator.java @@ -59,7 +59,7 @@ public List getAllBlocks() { public List getAllMaterials() { return getAllEntries().stream() - .sorted(Comparator.comparingInt(VeinEntry::chance)) + .sorted((a, b) -> Integer.compare(b.chance, a.chance)) .map(VeinEntry::mapToMaterial) .filter(mat -> !mat.isNull()) .toList(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/generator/indicators/SurfaceIndicatorGenerator.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/generator/indicators/SurfaceIndicatorGenerator.java index 6ea881caa33..91fece04d83 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/generator/indicators/SurfaceIndicatorGenerator.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/generator/indicators/SurfaceIndicatorGenerator.java @@ -1,12 +1,12 @@ package com.gregtechceu.gtceu.api.data.worldgen.generator.indicators; -import com.gregtechceu.gtceu.api.GTCEuAPI; import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.worldgen.GTOreDefinition; import com.gregtechceu.gtceu.api.data.worldgen.WorldGeneratorUtils; import com.gregtechceu.gtceu.api.data.worldgen.generator.IndicatorGenerator; import com.gregtechceu.gtceu.api.data.worldgen.ores.GeneratedVeinMetadata; import com.gregtechceu.gtceu.api.data.worldgen.ores.OreIndicatorPlacer; +import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.common.data.GTMaterialBlocks; import net.minecraft.MethodsReturnNonnullByDefault; @@ -50,7 +50,7 @@ public class SurfaceIndicatorGenerator extends IndicatorGenerator { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - Codec.either(BlockState.CODEC, GTCEuAPI.materialManager.codec()).fieldOf("block") + Codec.either(BlockState.CODEC, GTRegistries.MATERIALS.codec()).fieldOf("block") .forGetter(ext -> ext.block), IntProvider.codec(1, 32).fieldOf("radius").forGetter(ext -> ext.radius), FloatProvider.codec(0.0f, 2.0f).fieldOf("density").forGetter(ext -> ext.density), @@ -141,12 +141,12 @@ public Map generate(WorldGenLevel level, RandomSou return WorldGeneratorUtils.groupByChunks(positions).entrySet().stream() .collect(Collectors.toMap(Map.Entry::getKey, - entry -> createPlacer(level, entry.getValue(), blockState))); + entry -> createPlacer(entry.getValue(), blockState))); } - private OreIndicatorPlacer createPlacer(WorldGenLevel level, List positionsWithoutY, + private OreIndicatorPlacer createPlacer(List positionsWithoutY, BlockState blockState) { - return (access) -> { + return (access, level) -> { var positions = positionsWithoutY.stream() .map(pos -> placement.resolver.apply(level, access, pos)) .filter(pos -> !level.isOutsideBuildHeight(pos)) diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/generator/veins/ClassicVeinGenerator.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/generator/veins/ClassicVeinGenerator.java index 37dd3c02296..9f5ed39de59 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/generator/veins/ClassicVeinGenerator.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/generator/veins/ClassicVeinGenerator.java @@ -1,12 +1,12 @@ package com.gregtechceu.gtceu.api.data.worldgen.generator.veins; -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.worldgen.GTOreDefinition; import com.gregtechceu.gtceu.api.data.worldgen.generator.VeinGenerator; import com.gregtechceu.gtceu.api.data.worldgen.ores.OreBlockPlacer; import com.gregtechceu.gtceu.api.data.worldgen.ores.OreVeinUtil; +import com.gregtechceu.gtceu.api.registry.GTRegistries; import net.minecraft.core.BlockPos; import net.minecraft.core.SectionPos; @@ -230,7 +230,7 @@ public ClassicVeinGenerator sporadic(Consumer builder) { public static class Layer { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - Codec.either(OreConfiguration.TargetBlockState.CODEC.listOf(), GTCEuAPI.materialManager.codec()) + Codec.either(OreConfiguration.TargetBlockState.CODEC.listOf(), GTRegistries.MATERIALS.codec()) .fieldOf("targets").forGetter(layer -> layer.target), ExtraCodecs.intRange(-1, Integer.MAX_VALUE).optionalFieldOf("layers", -1) .forGetter(layer -> layer.layers)) diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/generator/veins/DikeVeinGenerator.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/generator/veins/DikeVeinGenerator.java index 6d294d07826..46de33fa340 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/generator/veins/DikeVeinGenerator.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/generator/veins/DikeVeinGenerator.java @@ -1,12 +1,12 @@ package com.gregtechceu.gtceu.api.data.worldgen.generator.veins; -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.worldgen.GTOreDefinition; import com.gregtechceu.gtceu.api.data.worldgen.generator.VeinGenerator; import com.gregtechceu.gtceu.api.data.worldgen.ores.OreBlockPlacer; import com.gregtechceu.gtceu.api.data.worldgen.ores.OreVeinUtil; +import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.utils.GTUtil; import com.gregtechceu.gtceu.utils.WeightedEntry; @@ -180,7 +180,7 @@ public record DikeBlockDefinition(Either, Material> block implements WeightedEntry { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - Codec.either(TargetBlockState.CODEC.listOf(), GTCEuAPI.materialManager.codec()).fieldOf("block") + Codec.either(TargetBlockState.CODEC.listOf(), GTRegistries.MATERIALS.codec()).fieldOf("block") .forGetter(x -> x.block), Codec.INT.fieldOf("weight").forGetter(x -> x.weight), Codec.INT.fieldOf("min_y").orElse(320).forGetter(x -> x.minY), diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/generator/veins/GeodeVeinGenerator.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/generator/veins/GeodeVeinGenerator.java index b15a38b6f85..14a6dbdef33 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/generator/veins/GeodeVeinGenerator.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/generator/veins/GeodeVeinGenerator.java @@ -1,12 +1,12 @@ package com.gregtechceu.gtceu.api.data.worldgen.generator.veins; -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.tag.TagPrefix; import com.gregtechceu.gtceu.api.data.worldgen.GTOreDefinition; import com.gregtechceu.gtceu.api.data.worldgen.generator.VeinGenerator; import com.gregtechceu.gtceu.api.data.worldgen.ores.OreBlockPlacer; +import com.gregtechceu.gtceu.api.registry.GTRegistries; import net.minecraft.Util; import net.minecraft.core.BlockPos; @@ -324,16 +324,16 @@ public record GeodeBlockSettings(Either fillingPro TagKey invalidBlocks, @NotNull TagPrefix providerMaterialPrefix) { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - Codec.either(BlockStateProvider.CODEC, GTCEuAPI.materialManager.codec()).fieldOf("filling_provider") + Codec.either(BlockStateProvider.CODEC, GTRegistries.MATERIALS.codec()).fieldOf("filling_provider") .forGetter(config -> config.fillingProvider), - Codec.either(BlockStateProvider.CODEC, GTCEuAPI.materialManager.codec()).fieldOf("inner_layer_provider") + Codec.either(BlockStateProvider.CODEC, GTRegistries.MATERIALS.codec()).fieldOf("inner_layer_provider") .forGetter(config -> config.innerLayerProvider), - Codec.either(BlockStateProvider.CODEC, GTCEuAPI.materialManager.codec()) + Codec.either(BlockStateProvider.CODEC, GTRegistries.MATERIALS.codec()) .fieldOf("alternate_inner_layer_provider") .forGetter(config -> config.alternateInnerLayerProvider), - Codec.either(BlockStateProvider.CODEC, GTCEuAPI.materialManager.codec()) + Codec.either(BlockStateProvider.CODEC, GTRegistries.MATERIALS.codec()) .fieldOf("middle_layer_provider").forGetter(config -> config.middleLayerProvider), - Codec.either(BlockStateProvider.CODEC, GTCEuAPI.materialManager.codec()).fieldOf("outer_layer_provider") + Codec.either(BlockStateProvider.CODEC, GTRegistries.MATERIALS.codec()).fieldOf("outer_layer_provider") .forGetter(config -> config.outerLayerProvider), ExtraCodecs.nonEmptyList(BlockState.CODEC.listOf()).fieldOf("inner_placements") .forGetter(config -> config.innerPlacements), @@ -341,7 +341,7 @@ public record GeodeBlockSettings(Either fillingPro .forGetter(config -> config.cannotReplace), TagKey.hashedCodec(Registries.BLOCK).fieldOf("invalid_blocks") .forGetter(config -> config.invalidBlocks), - TagPrefix.CODEC.optionalFieldOf("provider_material_prefix", TagPrefix.block) + GTRegistries.TAG_PREFIXES.codec().optionalFieldOf("provider_material_prefix", TagPrefix.block) .forGetter(config -> config.providerMaterialPrefix)) .apply(instance, GeodeBlockSettings::new)); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/generator/veins/StandardVeinGenerator.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/generator/veins/StandardVeinGenerator.java index 4a5e7860366..a2f82482d63 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/generator/veins/StandardVeinGenerator.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/generator/veins/StandardVeinGenerator.java @@ -1,12 +1,12 @@ package com.gregtechceu.gtceu.api.data.worldgen.generator.veins; -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.worldgen.GTOreDefinition; import com.gregtechceu.gtceu.api.data.worldgen.generator.VeinGenerator; import com.gregtechceu.gtceu.api.data.worldgen.ores.OreBlockPlacer; import com.gregtechceu.gtceu.api.data.worldgen.ores.OreVeinUtil; +import com.gregtechceu.gtceu.api.registry.GTRegistries; import net.minecraft.core.BlockPos; import net.minecraft.core.SectionPos; @@ -47,7 +47,7 @@ public class StandardVeinGenerator extends VeinGenerator { .apply(instance, StandardVeinGenerator::new)); public static final Codec CODEC_LIST = RecordCodecBuilder.create(instance -> instance.group( - Codec.either(OreConfiguration.TargetBlockState.CODEC.listOf(), GTCEuAPI.materialManager.codec()) + Codec.either(OreConfiguration.TargetBlockState.CODEC.listOf(), GTRegistries.MATERIALS.codec()) .fieldOf("targets").forGetter(ext -> ext.blocks)) .apply(instance, StandardVeinGenerator::new)); diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/generator/veins/VeinedVeinGenerator.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/generator/veins/VeinedVeinGenerator.java index efcded6a955..502a12d15e4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/generator/veins/VeinedVeinGenerator.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/generator/veins/VeinedVeinGenerator.java @@ -1,12 +1,12 @@ package com.gregtechceu.gtceu.api.data.worldgen.generator.veins; -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.worldgen.GTOreDefinition; import com.gregtechceu.gtceu.api.data.worldgen.generator.VeinGenerator; import com.gregtechceu.gtceu.api.data.worldgen.ores.OreBlockPlacer; import com.gregtechceu.gtceu.api.data.worldgen.ores.OreVeinUtil; +import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.common.data.GTFeatures; import com.gregtechceu.gtceu.utils.GTUtil; import com.gregtechceu.gtceu.utils.WeightedEntry; @@ -54,7 +54,7 @@ public class VeinedVeinGenerator extends VeinGenerator { public static final Codec, Material>> BLOCK_ENTRY_CODEC = Codec - .either(TargetBlockState.CODEC.listOf(), GTCEuAPI.materialManager.codec()); + .either(TargetBlockState.CODEC.listOf(), GTRegistries.MATERIALS.codec()); public static final Codec CODEC = RecordCodecBuilder.create((instance) -> instance.group( VeinBlockDefinition.CODEC.listOf().fieldOf("ore_blocks").forGetter(it -> it.oreBlocks), diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OreGenerator.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OreGenerator.java index 9774686283a..808241cfa9c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OreGenerator.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OreGenerator.java @@ -132,7 +132,7 @@ private List createConfigs(WorldGenLevel level, ChunkGenerato } private Stream getEntries(WorldGenLevel level, BlockPos veinCenter, XoroshiroRandomSource random) { - return WorldGeneratorUtils.WORLD_GEN_LAYERS.values().stream() + return GTRegistries.WORLD_GEN_LAYERS.values().stream() .filter(layer -> layer.isApplicableForLevel(level.getLevel().dimension().location())) .map(layer -> getEntry(level, level.getBiome(veinCenter), random, layer)) .filter(Objects::nonNull); @@ -152,9 +152,8 @@ private GTOreDefinition getEntry(WorldGenLevel level, Holder biome, Rando private static Optional computeVeinOrigin(WorldGenLevel level, ChunkGenerator generator, ChunkPos pos, RandomSource random, BlockPos veinCenter, GTOreDefinition entry) { - int layerSeed = WorldGeneratorUtils.getWorldGenLayerKey(entry.layer()) - .map(String::hashCode) - .orElse(0); + int layerSeed = GTRegistries.WORLD_GEN_LAYERS.getKey(entry.layer()).hashCode(); + var layeredRandom = new XoroshiroRandomSource(random.nextLong() ^ ((long) layerSeed)); veinCenter = OreVeinUtil.getVeinCenter(pos, layeredRandom).orElse(veinCenter); diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OreIndicatorPlacer.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OreIndicatorPlacer.java index 7f663430aae..0fe22cb136f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OreIndicatorPlacer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OreIndicatorPlacer.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.api.data.worldgen.ores; import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.chunk.BulkSectionAccess; import javax.annotation.ParametersAreNonnullByDefault; @@ -10,5 +11,5 @@ @FunctionalInterface public interface OreIndicatorPlacer { - void placeIndicators(BulkSectionAccess access); + void placeIndicators(BulkSectionAccess access, WorldGenLevel level); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OrePlacer.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OrePlacer.java index cda2c0206d3..71c031494a5 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OrePlacer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OrePlacer.java @@ -54,7 +54,8 @@ public void placeOres(WorldGenLevel level, ChunkGenerator chunkGenerator, ChunkA try (BulkSectionAccess access = new BulkSectionAccess(level)) { generatedVeins.forEach(generatedVein -> placeVein(chunk.getPos(), random, access, generatedVein, null)); - generatedIndicators.forEach(generatedIndicator -> placeIndicators(chunk, access, generatedIndicator)); + generatedIndicators + .forEach(generatedIndicator -> placeIndicators(level, chunk, access, generatedIndicator)); } } @@ -87,10 +88,11 @@ private Map> resolvePlacerLists(ChunkP Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))); } - private void placeIndicators(ChunkAccess chunk, BulkSectionAccess access, GeneratedIndicators generatedVein) { + private void placeIndicators(WorldGenLevel level, ChunkAccess chunk, BulkSectionAccess access, + GeneratedIndicators generatedVein) { if (!ConfigHolder.INSTANCE.worldgen.oreVeins.oreIndicators) return; generatedVein.consumeIndicators(chunk.getPos()).forEach(placer -> { - placer.placeIndicators(access); + placer.placeIndicators(access, level); }); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/GuiTextures.java b/src/main/java/com/gregtechceu/gtceu/api/gui/GuiTextures.java deleted file mode 100644 index 2b1e3eecbd2..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/GuiTextures.java +++ /dev/null @@ -1,601 +0,0 @@ -package com.gregtechceu.gtceu.api.gui; - -import com.lowdragmc.lowdraglib.gui.texture.ResourceBorderTexture; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; - -@SuppressWarnings("unused") -public class GuiTextures { - - // GREGTECH - public static final ResourceTexture GREGTECH_LOGO = new ResourceTexture( - "gtceu:textures/gui/icon/gregtech_logo.png"); - public static final ResourceTexture GREGTECH_LOGO_XMAS = new ResourceTexture( - "gtceu:textures/gui/icon/gregtech_logo_xmas.png"); - - // HUD - public static final ResourceTexture TOOL_FRONT_FACING_ROTATION = new ResourceTexture( - "gtceu:textures/gui/overlay/tool_front_facing_rotation.png"); - public static final ResourceTexture TOOL_IO_FACING_ROTATION = new ResourceTexture( - "gtceu:textures/gui/overlay/tool_io_facing_rotation.png"); - public static final ResourceTexture TOOL_PAUSE = new ResourceTexture("gtceu:textures/gui/overlay/tool_pause.png"); - public static final ResourceTexture TOOL_START = new ResourceTexture("gtceu:textures/gui/overlay/tool_start.png"); - public static final ResourceTexture TOOL_COVER_SETTINGS = new ResourceTexture( - "gtceu:textures/gui/overlay/tool_cover_settings.png"); - public static final ResourceTexture TOOL_MUTE = new ResourceTexture("gtceu:textures/gui/overlay/tool_mute.png"); - public static final ResourceTexture TOOL_SOUND = new ResourceTexture("gtceu:textures/gui/overlay/tool_sound.png"); - public static final ResourceTexture TOOL_ALLOW_INPUT = new ResourceTexture( - "gtceu:textures/gui/overlay/tool_allow_input.png"); - public static final ResourceTexture TOOL_ATTACH_COVER = new ResourceTexture( - "gtceu:textures/gui/overlay/tool_attach_cover.png"); - public static final ResourceTexture TOOL_REMOVE_COVER = new ResourceTexture( - "gtceu:textures/gui/overlay/tool_remove_cover.png"); - public static final ResourceTexture TOOL_PIPE_BLOCK = new ResourceTexture( - "gtceu:textures/gui/overlay/tool_pipe_block.png"); - public static final ResourceTexture TOOL_PIPE_CONNECT = new ResourceTexture( - "gtceu:textures/gui/overlay/tool_pipe_connect.png"); - public static final ResourceTexture TOOL_WIRE_BLOCK = new ResourceTexture( - "gtceu:textures/gui/overlay/tool_wire_block.png"); - public static final ResourceTexture TOOL_WIRE_CONNECT = new ResourceTexture( - "gtceu:textures/gui/overlay/tool_wire_connect.png"); - public static final ResourceTexture TOOL_AUTO_OUTPUT = new ResourceTexture( - "gtceu:textures/gui/overlay/tool_auto_output.png"); - public static final ResourceTexture TOOL_DISABLE_AUTO_OUTPUT = new ResourceTexture( - "gtceu:textures/gui/overlay/tool_disable_auto_output.png"); - public static final ResourceTexture TOOL_SWITCH_CONVERTER_NATIVE = new ResourceTexture( - "gtceu:textures/gui/overlay/tool_wire_block.png"); // todo switch to tool_switch_converter_native once that - // gets made - public static final ResourceTexture TOOL_SWITCH_CONVERTER_EU = new ResourceTexture( - "gtceu:textures/gui/overlay/tool_wire_connect.png"); // todo switch to tool_switch_converter_eu once that - // gets made - - // BASE TEXTURES - public static final ResourceBorderTexture BACKGROUND = new ResourceBorderTexture( - "gtceu:textures/gui/base/background.png", 16, 16, 4, 4); - public static final ResourceBorderTexture BACKGROUND_INVERSE = new ResourceBorderTexture( - "gtceu:textures/gui/base/background_inverse.png", 16, 16, 4, 4); - public static final SteamTexture BACKGROUND_STEAM = SteamTexture - .fullImage("gtceu:textures/gui/base/background_%s.png"); - public static final ResourceTexture CLIPBOARD_BACKGROUND = new ResourceTexture( - "gtceu:textures/gui/base/clipboard_background.png"); - public static final ResourceTexture CLIPBOARD_PAPER_BACKGROUND = new ResourceTexture( - "gtceu:textures/gui/base/clipboard_paper_background.png"); - public static final ResourceBorderTexture TITLE_BAR_BACKGROUND = new ResourceBorderTexture( - "gtceu:textures/gui/base/title_bar_background.png", 16, 16, 4, 4); - - public static final ResourceTexture DISPLAY = new ResourceTexture("gtceu:textures/gui/base/display.png"); - public static final SteamTexture DISPLAY_STEAM = SteamTexture.fullImage("gtceu:textures/gui/base/display_%s.png"); - public static final ResourceTexture BLANK = new ResourceBorderTexture("gtceu:textures/gui/base/blank.png", 1, 1, 0, - 0); - public static final ResourceTexture BLANK_TRANSPARENT = new ResourceBorderTexture( - "gtceu:textures/gui/base/blank_transparent.png", 1, 1, 0, 0); - public static final ResourceBorderTexture FLUID_SLOT = new ResourceBorderTexture( - "gtceu:textures/gui/base/fluid_slot.png", 18, 18, 1, 1); - public static final ResourceTexture FLUID_TANK_BACKGROUND = new ResourceTexture( - "gtceu:textures/gui/base/fluid_tank_background.png"); - public static final ResourceTexture FLUID_TANK_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/base/fluid_tank_overlay.png"); - public static final ResourceBorderTexture SLOT = new ResourceBorderTexture("gtceu:textures/gui/base/slot.png", 18, - 18, 1, 1); - public static final ResourceBorderTexture SLOT_DARK = new ResourceBorderTexture( - "gtceu:textures/gui/base/slot_dark.png", 18, - 18, 1, 1); - - public static final ResourceTexture SLOT_DARKENED = new ResourceTexture( - "gtceu:textures/gui/base/darkened_slot.png"); - public static final SteamTexture SLOT_STEAM = SteamTexture.fullImage("gtceu:textures/gui/base/slot_%s.png"); - public static final ResourceTexture TOGGLE_BUTTON_BACK = new ResourceTexture( - "gtceu:textures/gui/widget/toggle_button_background.png"); - - public static final ResourceTexture CLOSE_ICON = new ResourceTexture("gtceu:textures/gui/icon/close.png"); - - // FLUID & ITEM OUTPUT BUTTONS - public static final ResourceTexture BLOCKS_INPUT = new ResourceTexture( - "gtceu:textures/gui/widget/button_blocks_input.png"); - public static final ResourceBorderTexture BUTTON = new ResourceBorderTexture("gtceu:textures/gui/widget/button.png", - 32, 32, 2, 2); - public static final ResourceTexture BUTTON_ALLOW_IMPORT_EXPORT = new ResourceTexture( - "gtceu:textures/gui/widget/button_allow_import_export.png"); - public static final ResourceTexture BUTTON_BLACKLIST = new ResourceTexture( - "gtceu:textures/gui/widget/button_blacklist.png"); - public static final ResourceTexture BUTTON_CHUNK_MODE = new ResourceTexture( - "gtceu:textures/gui/widget/button_chunk_mode.png"); - public static final ResourceTexture BUTTON_CLEAR_GRID = new ResourceTexture( - "gtceu:textures/gui/widget/button_clear_grid.png"); - public static final ResourceTexture BUTTON_FILTER_DAMAGE = new ResourceTexture( - "gtceu:textures/gui/widget/button_filter_damage.png"); - public static final ResourceTexture BUTTON_DISTINCT_BUSES = new ResourceTexture( - "gtceu:textures/gui/widget/button_distinct_buses.png"); - public static final ResourceTexture BUTTON_POWER = new ResourceTexture( - "gtceu:textures/gui/widget/button_power.png"); - public static final ResourceTexture BUTTON_BATCH = new ResourceTexture( - "gtceu:textures/gui/widget/button_batch.png"); - public static final ResourceTexture BUTTON_FILTER_NBT = new ResourceTexture( - "gtceu:textures/gui/widget/button_filter_nbt.png"); - public static final ResourceTexture BUTTON_FLUID_OUTPUT = new ResourceTexture( - "gtceu:textures/gui/widget/button_fluid_output_overlay.png"); - public static final ResourceTexture BUTTON_ITEM_OUTPUT = new ResourceTexture( - "gtceu:textures/gui/widget/button_item_output_overlay.png"); - public static final ResourceTexture BUTTON_LOCK = new ResourceTexture("gtceu:textures/gui/widget/button_lock.png"); - public static final ResourceTexture BUTTON_VOID = new ResourceTexture("gtceu:textures/gui/widget/button_void.png"); - public static final ResourceTexture BUTTON_VOID_PARTIAL = new ResourceTexture( - "gtceu:textures/gui/widget/button_void_partial.png"); - public static final ResourceTexture BUTTON_VOID_MULTIBLOCK = new ResourceTexture( - "gtceu:textures/gui/widget/button_void_multiblock.png"); - public static final ResourceTexture BUTTON_LEFT = new ResourceTexture("gtceu:textures/gui/widget/left.png"); - public static final ResourceTexture BUTTON_PUBLIC_PRIVATE = new ResourceTexture( - "gtceu:textures/gui/widget/button_public_private.png"); - public static final ResourceTexture BUTTON_CHECK = new ResourceTexture( - "gtceu:textures/gui/widget/button_check.png"); - public static final ResourceTexture BUTTON_LIST = new ResourceTexture( - "gtceu:textures/gui/widget/button_list.png"); - public static final ResourceTexture BUTTON_RIGHT = new ResourceTexture("gtceu:textures/gui/widget/right.png"); - public static final ResourceTexture BUTTON_SILK_TOUCH_MODE = new ResourceTexture( - "gtceu:textures/gui/widget/button_silk_touch_mode.png"); - public static final ResourceTexture BUTTON_SWITCH_VIEW = new ResourceTexture( - "gtceu:textures/gui/widget/button_switch_view.png"); - public static final ResourceTexture BUTTON_WORKING_ENABLE = new ResourceTexture( - "gtceu:textures/gui/widget/button_working_enable.png"); - public static final ResourceTexture BUTTON_INT_CIRCUIT_PLUS = new ResourceTexture( - "gtceu:textures/gui/widget/button_circuit_plus.png"); - public static final ResourceTexture BUTTON_INT_CIRCUIT_MINUS = new ResourceTexture( - "gtceu:textures/gui/widget/button_circuit_minus.png"); - public static final ResourceTexture CLIPBOARD_BUTTON = new ResourceTexture( - "gtceu:textures/gui/widget/clipboard_button.png"); - public static final ResourceBorderTexture CLIPBOARD_TEXT_BOX = new ResourceBorderTexture( - "gtceu:textures/gui/widget/clipboard_text_box.png", 9, 18, 1, 1); - public static final ResourceTexture DISTRIBUTION_MODE = new ResourceTexture( - "gtceu:textures/gui/widget/button_distribution_mode.png"); - public static final ResourceTexture BUTTON_AUTO_PULL = new ResourceTexture( - "gtceu:textures/gui/widget/button_me_auto_pull.png"); - public static final ResourceTexture LOCK = new ResourceTexture("gtceu:textures/gui/widget/lock.png"); - public static final ResourceTexture LOCK_WHITE = new ResourceTexture("gtceu:textures/gui/widget/lock_white.png"); - public static final ResourceTexture SWITCH = new ResourceTexture("gtceu:textures/gui/widget/switch.png"); - public static final ResourceTexture SWITCH_HORIZONTAL = new ResourceTexture( - "gtceu:textures/gui/widget/switch_horizontal.png"); - public static final ResourceTexture VANILLA_BUTTON = new ResourceBorderTexture( - "ldlib:textures/gui/button_common.png", 198, 18, 1, 1); - - public static final ResourceTexture ENERGY_DETECTOR_COVER_MODE_BUTTON = new ResourceTexture( - "gtceu:textures/gui/widget/button_detector_cover_energy_mode.png"); - public static final ResourceTexture INVERT_REDSTONE_BUTTON = new ResourceTexture( - "gtceu:textures/gui/widget/button_detector_cover_inverted.png"); - - public static final ResourceTexture IO_CONFIG_FLUID_MODES_BUTTON = new ResourceTexture( - "gtceu:textures/gui/icon/io_config/output_config_fluid_modes.png"); - public static final ResourceTexture IO_CONFIG_ITEM_MODES_BUTTON = new ResourceTexture( - "gtceu:textures/gui/icon/io_config/output_config_item_modes.png"); - public static final ResourceTexture IO_CONFIG_COVER_SLOT_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/icon/io_config/cover_slot_overlay.png"); - public static final ResourceTexture IO_CONFIG_COVER_SETTINGS = new ResourceTexture( - "gtceu:textures/gui/icon/io_config/cover_settings.png"); - - public static final ResourceTexture PATTERN_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/widget/pattern_overlay.png"); - public static final ResourceTexture REFUND_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/widget/refund_overlay.png"); - // INDICATORS & ICONS - public static final ResourceTexture INDICATOR_NO_ENERGY = new ResourceTexture( - "gtceu:textures/gui/base/indicator_no_energy.png"); - public static final SteamTexture INDICATOR_NO_STEAM = SteamTexture - .fullImage("gtceu:textures/gui/base/indicator_no_steam_%s.png"); - public static final ResourceTexture TANK_ICON = new ResourceTexture("gtceu:textures/gui/base/tank_icon.png"); - - // WIDGET UI RELATED - public static final ResourceTexture SLIDER_BACKGROUND = new ResourceTexture( - "gtceu:textures/gui/widget/slider_background.png"); - public static final ResourceTexture SLIDER_BACKGROUND_VERTICAL = new ResourceTexture( - "gtceu:textures/gui/widget/slider_background_vertical.png"); - public static final ResourceTexture SLIDER_ICON = new ResourceTexture("gtceu:textures/gui/widget/slider.png"); - public static final ResourceTexture MAINTENANCE_BUTTON = new ResourceTexture( - "gtceu:textures/gui/widget/button_maintenance.png"); - public static final ResourceTexture MAINTENANCE_ICON = new ResourceTexture( - "gtceu:textures/block/overlay/machine/overlay_maintenance.png"); - public static final ResourceTexture STORAGE_ICON = new ResourceTexture( - "gtceu:textures/item/storage_cover.png"); - public static final ResourceTexture BUTTON_MINER_MODES = new ResourceTexture( - "gtceu:textures/gui/widget/button_miner_modes.png"); - - // ORE PROCESSING - public static final ResourceTexture OREBY_BASE = new ResourceTexture("gtceu:textures/gui/arrows/oreby-base.png"); - public static final ResourceTexture OREBY_CHEM = new ResourceTexture("gtceu:textures/gui/arrows/oreby-chem.png"); - public static final ResourceTexture OREBY_SEP = new ResourceTexture("gtceu:textures/gui/arrows/oreby-sep.png"); - public static final ResourceTexture OREBY_SIFT = new ResourceTexture("gtceu:textures/gui/arrows/oreby-sift.png"); - public static final ResourceTexture OREBY_SMELT = new ResourceTexture("gtceu:textures/gui/arrows/oreby-smelt.png"); - - // PRIMITIVE - public static final ResourceBorderTexture PRIMITIVE_BACKGROUND = new ResourceBorderTexture( - "gtceu:textures/gui/primitive/primitive_background.png", 176, 166, 3, 3); - public static final ResourceBorderTexture PRIMITIVE_SLOT = new ResourceBorderTexture( - "gtceu:textures/gui/primitive/primitive_slot.png", 18, 18, 1, 1); - public static final ResourceTexture PRIMITIVE_FURNACE_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/primitive/overlay_primitive_furnace.png"); - public static final ResourceTexture PRIMITIVE_DUST_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/primitive/overlay_primitive_dust.png"); - public static final ResourceTexture PRIMITIVE_INGOT_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/primitive/overlay_primitive_ingot.png"); - public static final ResourceTexture PRIMITIVE_LARGE_FLUID_TANK = new ResourceTexture( - "gtceu:textures/gui/primitive/primitive_large_fluid_tank.png"); - public static final ResourceTexture PRIMITIVE_LARGE_FLUID_TANK_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/primitive/primitive_large_fluid_tank_overlay.png"); - public static final ResourceTexture PRIMITIVE_BLAST_FURNACE_PROGRESS_BAR = new ResourceTexture( - "gtceu:textures/gui/primitive/progress_bar_primitive_blast_furnace.png"); - - // SLOT OVERLAYS - public static final ResourceTexture ATOMIC_OVERLAY_1 = new ResourceTexture( - "gtceu:textures/gui/overlay/atomic_overlay_1.png"); - public static final ResourceTexture ATOMIC_OVERLAY_2 = new ResourceTexture( - "gtceu:textures/gui/overlay/atomic_overlay_2.png"); - public static final ResourceTexture ARROW_INPUT_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/arrow_input_overlay.png"); - public static final ResourceTexture ARROW_OUTPUT_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/arrow_output_overlay.png"); - public static final ResourceTexture BATTERY_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/battery_overlay.png"); - public static final ResourceTexture BEAKER_OVERLAY_1 = new ResourceTexture( - "gtceu:textures/gui/overlay/beaker_overlay_1.png"); - public static final ResourceTexture BEAKER_OVERLAY_2 = new ResourceTexture( - "gtceu:textures/gui/overlay/beaker_overlay_2.png"); - public static final ResourceTexture BEAKER_OVERLAY_3 = new ResourceTexture( - "gtceu:textures/gui/overlay/beaker_overlay_3.png"); - public static final ResourceTexture BEAKER_OVERLAY_4 = new ResourceTexture( - "gtceu:textures/gui/overlay/beaker_overlay_4.png"); - public static final ResourceTexture BENDER_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/bender_overlay.png"); - public static final ResourceTexture BOX_OVERLAY = new ResourceTexture("gtceu:textures/gui/overlay/box_overlay.png"); - public static final ResourceTexture BOXED_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/boxed_overlay.png"); - public static final ResourceTexture BREWER_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/brewer_overlay.png"); - public static final ResourceTexture CANNER_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/canner_overlay.png"); - public static final ResourceTexture CHARGER_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/charger_slot_overlay.png"); - public static final ResourceTexture CANISTER_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/canister_overlay.png"); - public static final SteamTexture CANISTER_OVERLAY_STEAM = SteamTexture - .fullImage("gtceu:textures/gui/overlay/canister_overlay_%s.png"); - public static final ResourceTexture CENTRIFUGE_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/centrifuge_overlay.png"); - public static final ResourceTexture CIRCUIT_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/circuit_overlay.png"); - public static final SteamTexture COAL_OVERLAY_STEAM = SteamTexture - .fullImage("gtceu:textures/gui/overlay/coal_overlay_%s.png"); - public static final ResourceTexture COMPRESSOR_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/compressor_overlay.png"); - public static final SteamTexture COMPRESSOR_OVERLAY_STEAM = SteamTexture - .fullImage("gtceu:textures/gui/overlay/compressor_overlay_%s.png"); - public static final ResourceTexture CRACKING_OVERLAY_1 = new ResourceTexture( - "gtceu:textures/gui/overlay/cracking_overlay_1.png"); - public static final ResourceTexture CRACKING_OVERLAY_2 = new ResourceTexture( - "gtceu:textures/gui/overlay/cracking_overlay_2.png"); - public static final ResourceTexture CRUSHED_ORE_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/crushed_ore_overlay.png"); - public static final SteamTexture CRUSHED_ORE_OVERLAY_STEAM = SteamTexture - .fullImage("gtceu:textures/gui/overlay/crushed_ore_overlay_%s.png"); - public static final ResourceTexture CRYSTAL_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/crystal_overlay.png"); - public static final ResourceTexture CUTTER_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/cutter_overlay.png"); - public static final ResourceTexture DARK_CANISTER_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/dark_canister_overlay.png"); - public static final ResourceTexture DUST_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/dust_overlay.png"); - public static final SteamTexture DUST_OVERLAY_STEAM = SteamTexture - .fullImage("gtceu:textures/gui/overlay/dust_overlay_%s.png"); - public static final ResourceTexture EXTRACTOR_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/extractor_overlay.png"); - public static final SteamTexture EXTRACTOR_OVERLAY_STEAM = SteamTexture - .fullImage("gtceu:textures/gui/overlay/extractor_overlay_%s.png"); - public static final ResourceTexture FILTER_SLOT_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/filter_slot_overlay.png"); - public static final ResourceTexture FURNACE_OVERLAY_1 = new ResourceTexture( - "gtceu:textures/gui/overlay/furnace_overlay_1.png"); - public static final ResourceTexture FURNACE_OVERLAY_2 = new ResourceTexture( - "gtceu:textures/gui/overlay/furnace_overlay_2.png"); - public static final SteamTexture FURNACE_OVERLAY_STEAM = SteamTexture - .fullImage("gtceu:textures/gui/overlay/furnace_overlay_%s.png"); - public static final ResourceTexture HAMMER_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/hammer_overlay.png"); - public static final SteamTexture HAMMER_OVERLAY_STEAM = SteamTexture - .fullImage("gtceu:textures/gui/overlay/hammer_overlay_%s.png"); - public static final ResourceTexture HEATING_OVERLAY_1 = new ResourceTexture( - "gtceu:textures/gui/overlay/heating_overlay_1.png"); - public static final ResourceTexture HEATING_OVERLAY_2 = new ResourceTexture( - "gtceu:textures/gui/overlay/heating_overlay_2.png"); - public static final ResourceTexture IMPLOSION_OVERLAY_1 = new ResourceTexture( - "gtceu:textures/gui/overlay/implosion_overlay_1.png"); - public static final ResourceTexture IMPLOSION_OVERLAY_2 = new ResourceTexture( - "gtceu:textures/gui/overlay/implosion_overlay_2.png"); - public static final ResourceTexture IN_SLOT_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/in_slot_overlay.png"); - public static final SteamTexture IN_SLOT_OVERLAY_STEAM = SteamTexture - .fullImage("gtceu:textures/gui/overlay/in_slot_overlay_%s.png"); - public static final ResourceTexture INGOT_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/ingot_overlay.png"); - public static final ResourceTexture INT_CIRCUIT_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/int_circuit_overlay.png"); - public static final ResourceTexture LENS_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/lens_overlay.png"); - public static final ResourceTexture LIGHTNING_OVERLAY_1 = new ResourceTexture( - "gtceu:textures/gui/overlay/lightning_overlay_1.png"); - public static final ResourceTexture LIGHTNING_OVERLAY_2 = new ResourceTexture( - "gtceu:textures/gui/overlay/lightning_overlay_2.png"); - public static final ResourceTexture MOLD_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/mold_overlay.png"); - public static final ResourceTexture MOLECULAR_OVERLAY_1 = new ResourceTexture( - "gtceu:textures/gui/overlay/molecular_overlay_1.png"); - public static final ResourceTexture MOLECULAR_OVERLAY_2 = new ResourceTexture( - "gtceu:textures/gui/overlay/molecular_overlay_2.png"); - public static final ResourceTexture MOLECULAR_OVERLAY_3 = new ResourceTexture( - "gtceu:textures/gui/overlay/molecular_overlay_3.png"); - public static final ResourceTexture MOLECULAR_OVERLAY_4 = new ResourceTexture( - "gtceu:textures/gui/overlay/molecular_overlay_4.png"); - public static final ResourceTexture OUT_SLOT_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/out_slot_overlay.png"); - public static final SteamTexture OUT_SLOT_OVERLAY_STEAM = SteamTexture - .fullImage("gtceu:textures/gui/overlay/out_slot_overlay_%s.png"); - public static final ResourceTexture PAPER_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/paper_overlay.png"); - public static final ResourceTexture PRINTED_PAPER_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/printed_paper_overlay.png"); - public static final ResourceTexture PIPE_OVERLAY_2 = new ResourceTexture( - "gtceu:textures/gui/overlay/pipe_overlay_2.png"); - public static final ResourceTexture PIPE_OVERLAY_1 = new ResourceTexture( - "gtceu:textures/gui/overlay/pipe_overlay_1.png"); - public static final ResourceTexture PRESS_OVERLAY_1 = new ResourceTexture( - "gtceu:textures/gui/overlay/press_overlay_1.png"); - public static final ResourceTexture PRESS_OVERLAY_2 = new ResourceTexture( - "gtceu:textures/gui/overlay/press_overlay_2.png"); - public static final ResourceTexture PRESS_OVERLAY_3 = new ResourceTexture( - "gtceu:textures/gui/overlay/press_overlay_3.png"); - public static final ResourceTexture PRESS_OVERLAY_4 = new ResourceTexture( - "gtceu:textures/gui/overlay/press_overlay_4.png"); - public static final ResourceTexture SAWBLADE_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/sawblade_overlay.png"); - public static final ResourceTexture SOLIDIFIER_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/solidifier_overlay.png"); - public static final ResourceTexture STRING_SLOT_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/string_slot_overlay.png"); - public static final ResourceTexture TOOL_SLOT_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/tool_slot_overlay.png"); - public static final ResourceTexture TURBINE_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/turbine_overlay.png"); - public static final ResourceTexture VIAL_OVERLAY_1 = new ResourceTexture( - "gtceu:textures/gui/overlay/vial_overlay_1.png"); - public static final ResourceTexture VIAL_OVERLAY_2 = new ResourceTexture( - "gtceu:textures/gui/overlay/vial_overlay_2.png"); - public static final ResourceTexture WIREMILL_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/wiremill_overlay.png"); - public static final ResourceTexture POSITIVE_MATTER_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/positive_matter_overlay.png"); - public static final ResourceTexture NEUTRAL_MATTER_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/neutral_matter_overlay.png"); - public static final ResourceTexture DATA_ORB_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/data_orb_overlay.png"); - public static final ResourceTexture SCANNER_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/scanner_overlay.png"); - public static final ResourceTexture DUCT_TAPE_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/duct_tape_overlay.png"); - public static final ResourceTexture RESEARCH_STATION_OVERLAY = new ResourceTexture( - "gtceu:textures/gui/overlay/research_station_overlay.png"); - - // PROGRESS BARS - public static final ResourceTexture PROGRESS_BAR_ARC_FURNACE = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_arc_furnace.png"); - public static final ResourceTexture PROGRESS_BAR_ARROW = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_arrow.png"); - public static final SteamTexture PROGRESS_BAR_ARROW_STEAM = SteamTexture - .fullImage("gtceu:textures/gui/progress_bar/progress_bar_arrow_%s.png"); - public static final ResourceTexture PROGRESS_BAR_ARROW_MULTIPLE = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_arrow_multiple.png"); - public static final ResourceTexture PROGRESS_BAR_ASSEMBLER = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_assembler.png"); - - public static final ResourceTexture PROGRESS_BAR_ASSEMBLY_LINE = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_assembly_line.png"); - public static final ResourceTexture PROGRESS_BAR_ASSEMBLY_LINE_ARROW = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_assembly_line_arrow.png"); - public static final ResourceTexture PROGRESS_BAR_BATH = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_bath.png"); - public static final ResourceTexture PROGRESS_BAR_BENDING = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_bending.png"); - public static final SteamTexture PROGRESS_BAR_BOILER_EMPTY = SteamTexture - .fullImage("gtceu:textures/gui/progress_bar/progress_bar_boiler_empty_%s.png"); - public static final SteamTexture PROGRESS_BAR_BOILER_FUEL = SteamTexture - .fullImage("gtceu:textures/gui/progress_bar/progress_bar_boiler_fuel_%s.png"); - public static final ResourceTexture PROGRESS_BAR_BOILER_HEAT = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_boiler_heat.png"); - public static final ResourceTexture PROGRESS_BAR_CANNER = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_canner.png"); - public static final ResourceTexture PROGRESS_BAR_CIRCUIT = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_circuit_assembler.png"); - public static final ResourceTexture PROGRESS_BAR_CIRCUIT_ASSEMBLER = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_circuit_assembler.png"); - public static final ResourceTexture PROGRESS_BAR_COKE_OVEN = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_coke_oven.png"); - public static final ResourceTexture PROGRESS_BAR_COMPRESS = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_compress.png"); - public static final SteamTexture PROGRESS_BAR_COMPRESS_STEAM = SteamTexture - .fullImage("gtceu:textures/gui/progress_bar/progress_bar_compress_%s.png"); - public static final ResourceTexture PROGRESS_BAR_CRACKING = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_cracking.png"); - public static final ResourceTexture PROGRESS_BAR_CRACKING_INPUT = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_cracking_2.png"); - public static final ResourceTexture PROGRESS_BAR_CRYSTALLIZATION = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_crystallization.png"); - public static final ResourceTexture PROGRESS_BAR_DISTILLATION_TOWER = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_distillation_tower.png"); - public static final ResourceTexture PROGRESS_BAR_EXTRACT = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_extract.png"); - public static final SteamTexture PROGRESS_BAR_EXTRACT_STEAM = SteamTexture - .fullImage("gtceu:textures/gui/progress_bar/progress_bar_extract_%s.png"); - public static final ResourceTexture PROGRESS_BAR_EXTRUDER = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_extruder.png"); - public static final ResourceTexture PROGRESS_BAR_FUSION = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_fusion.png"); - public static final ResourceTexture PROGRESS_BAR_GAS_COLLECTOR = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_gas_collector.png"); - public static final ResourceTexture PROGRESS_BAR_HAMMER = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_hammer.png"); - public static final SteamTexture PROGRESS_BAR_HAMMER_STEAM = SteamTexture - .fullImage("gtceu:textures/gui/progress_bar/progress_bar_hammer_%s.png"); - public static final ResourceTexture PROGRESS_BAR_HAMMER_BASE = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_hammer_base.png"); - public static final SteamTexture PROGRESS_BAR_HAMMER_BASE_STEAM = SteamTexture - .fullImage("gtceu:textures/gui/progress_bar/progress_bar_hammer_base_%s.png"); - public static final ResourceTexture PROGRESS_BAR_LATHE = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_lathe.png"); - public static final ResourceTexture PROGRESS_BAR_LATHE_BASE = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_lathe_base.png"); - public static final ResourceTexture PROGRESS_BAR_MACERATE = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_macerate.png"); - public static final SteamTexture PROGRESS_BAR_MACERATE_STEAM = SteamTexture - .fullImage("gtceu:textures/gui/progress_bar/progress_bar_macerate_%s.png"); - public static final ResourceTexture PROGRESS_BAR_MAGNET = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_magnet.png"); - public static final ResourceTexture PROGRESS_BAR_MASS_FAB = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_mass_fab.png"); - public static final ResourceTexture PROGRESS_BAR_MIXER = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_mixer.png"); - public static final ResourceTexture PROGRESS_BAR_PACKER = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_packer.png"); - public static final ResourceTexture PROGRESS_BAR_RECYCLER = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_recycler.png"); - public static final ResourceTexture PROGRESS_BAR_REPLICATOR = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_replicator.png"); - public static final ResourceTexture PROGRESS_BAR_SIFT = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_sift.png"); - public static final ResourceTexture PROGRESS_BAR_SLICE = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_slice.png"); - public static final SteamTexture PROGRESS_BAR_SOLAR_STEAM = SteamTexture - .fullImage("gtceu:textures/gui/progress_bar/progress_bar_solar_%s.png"); - public static final ResourceTexture PROGRESS_BAR_UNLOCK = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_unlock.png"); - public static final ResourceTexture PROGRESS_BAR_UNPACKER = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_unpacker.png"); - public static final ResourceTexture PROGRESS_BAR_WIREMILL = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_wiremill.png"); - public static final ResourceTexture PROGRESS_BAR_RESEARCH_STATION_1 = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_research_station_1.png"); - public static final ResourceTexture PROGRESS_BAR_RESEARCH_STATION_2 = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_research_station_2.png"); - public static final ResourceTexture PROGRESS_BAR_RESEARCH_STATION_BASE = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_research_station_base.png"); - - // JEI - public static final ResourceTexture INFO_ICON = new ResourceTexture("gtceu:textures/gui/widget/information.png"); - public static final ResourceTexture MULTIBLOCK_CATEGORY = new ResourceTexture( - "gtceu:textures/gui/icon/coke_oven.png"); - - public static final ResourceTexture ARC_FURNACE_RECYCLING_CATEGORY = new ResourceTexture( - "gtceu:textures/gui/icon/category/arc_furnace_recycling.png"); - public static final ResourceTexture MACERATOR_RECYCLING_CATEGORY = new ResourceTexture( - "gtceu:textures/gui/icon/category/macerator_recycling.png"); - public static final ResourceTexture EXTRACTOR_RECYCLING_CATEGORY = new ResourceTexture( - "gtceu:textures/gui/icon/category/extractor_recycling.png"); - - // Covers - public static final ResourceTexture COVER_MACHINE_CONTROLLER = new ResourceTexture( - "gtceu:textures/items/machine_controller_cover.png"); - - // Terminal - public static final ResourceTexture ICON_REMOVE = new ResourceTexture( - "gtceu:textures/gui/terminal/icon/remove_hover.png"); - public static final ResourceTexture ICON_UP = new ResourceTexture("gtceu:textures/gui/terminal/icon/up_hover.png"); - public static final ResourceTexture ICON_DOWN = new ResourceTexture( - "gtceu:textures/gui/terminal/icon/down_hover.png"); - public static final ResourceTexture ICON_RIGHT = new ResourceTexture( - "gtceu:textures/gui/terminal/icon/right_hover.png"); - public static final ResourceTexture ICON_LEFT = new ResourceTexture( - "gtceu:textures/gui/terminal/icon/left_hover.png"); - public static final ResourceTexture ICON_ADD = new ResourceTexture( - "gtceu:textures/gui/terminal/icon/add_hover.png"); - - public static final ResourceTexture ICON_NEW_PAGE = new ResourceTexture( - "gtceu:textures/gui/terminal/icon/system/memory_card_hover.png"); - public static final ResourceTexture ICON_LOAD = new ResourceTexture( - "gtceu:textures/gui/terminal/icon/folder_hover.png"); - public static final ResourceTexture ICON_SAVE = new ResourceTexture( - "gtceu:textures/gui/terminal/icon/system/save_hover.png"); - public static final ResourceTexture ICON_LOCATION = new ResourceTexture( - "gtceu:textures/gui/terminal/icon/guide_hover.png"); - public static final ResourceTexture ICON_VISIBLE = new ResourceTexture( - "gtceu:textures/gui/terminal/icon/appearance_hover.png"); - public static final ResourceTexture ICON_CALCULATOR = new ResourceTexture( - "gtceu:textures/gui/terminal/icon/calculator_hover.png"); - public static final ResourceTexture UI_FRAME_SIDE_UP = new ResourceTexture( - "gtceu:textures/gui/terminal/frame_side_up.png"); - public static final ResourceTexture UI_FRAME_SIDE_DOWN = new ResourceTexture( - "gtceu:textures/gui/terminal/frame_side_down.png"); - - // Texture Areas - public static final ResourceTexture BUTTON_FLUID = new ResourceTexture( - "gtceu:textures/block/cover/cover_interface_fluid_button.png"); - public static final ResourceTexture BUTTON_ITEM = new ResourceTexture( - "gtceu:textures/block/cover/cover_interface_item_button.png"); - public static final ResourceTexture BUTTON_ENERGY = new ResourceTexture( - "gtceu:textures/block/cover/cover_interface_energy_button.png"); - public static final ResourceTexture BUTTON_MACHINE = new ResourceTexture( - "gtceu:textures/block/cover/cover_interface_machine_button.png"); - public static final ResourceTexture BUTTON_INTERFACE = new ResourceTexture( - "gtceu:textures/block/cover/cover_interface_computer_button.png"); - public static final ResourceTexture COVER_INTERFACE_MACHINE_ON_PROXY = new ResourceTexture( - "gtceu:textures/block/cover/cover_interface_machine_on_proxy.png"); - public static final ResourceTexture COVER_INTERFACE_MACHINE_OFF_PROXY = new ResourceTexture( - "gtceu:textures/blocks/cover/cover_interface_machine_off_proxy.png"); - public static final ResourceTexture SCENE = new ResourceTexture("gtceu:textures/gui/widget/scene.png"); - public static final ResourceBorderTexture DISPLAY_FRAME = new ResourceBorderTexture( - "gtceu:textures/gui/base/display_frame.png", 16, 16, 4, 4); - public static final ResourceTexture INSUFFICIENT_INPUT = new ResourceTexture( - "gtceu:textures/gui/base/indicator_no_energy.png"); - public static final ResourceBorderTexture ENERGY_BAR_BACKGROUND = new ResourceBorderTexture( - "gtceu:textures/gui/progress_bar/progress_bar_boiler_empty_steel.png", 10, 54, 1, 1); - public static final ResourceBorderTexture ENERGY_BAR_BASE = new ResourceBorderTexture( - "gtceu:textures/gui/progress_bar/progress_bar_boiler_heat.png", 10, 54, 1, 1); - public static final ResourceTexture LIGHT_ON = new ResourceTexture("gtceu:textures/gui/widget/light_on.png"); - public static final ResourceTexture LIGHT_OFF = new ResourceTexture("gtceu:textures/gui/widget/light_off.png"); - public static final ResourceTexture UP = new ResourceTexture("gtceu:textures/gui/base/up.png"); - public static final ResourceTexture[] TIER = new ResourceTexture[9]; - static { - var offset = 1f / TIER.length; - for (int i = 0; i < TIER.length; i++) { - TIER[i] = new ResourceTexture("gtceu:textures/gui/overlay/tier.png").getSubTexture(0, i * offset, 1, - offset); - } - } - - // Lamp item overlay - public static final ResourceTexture LAMP_NO_BLOOM = new ResourceTexture( - "gtceu:textures/gui/item_overlay/lamp_no_bloom.png"); - public static final ResourceTexture LAMP_NO_LIGHT = new ResourceTexture( - "gtceu:textures/gui/item_overlay/lamp_no_light.png"); - - // ME hatch/bus - public static final ResourceTexture NUMBER_BACKGROUND = new ResourceTexture( - "gtceu:textures/gui/widget/number_background.png"); - public static final ResourceTexture CONFIG_ARROW = new ResourceTexture( - "gtceu:textures/gui/widget/config_arrow.png"); - public static final ResourceTexture CONFIG_ARROW_DARK = new ResourceTexture( - "gtceu:textures/gui/widget/config_arrow_dark.png"); - public static final ResourceTexture SELECT_BOX = new ResourceTexture("gtceu:textures/gui/widget/select_box.png"); - - // HPCA Component icons - public static final ResourceTexture HPCA_COMPONENT_OUTLINE = new ResourceTexture( - "gtceu:textures/gui/widget/hpca/component_outline.png"); - public static final ResourceTexture HPCA_ICON_EMPTY_COMPONENT = new ResourceTexture( - "gtceu:textures/gui/widget/hpca/empty_component.png"); - public static final ResourceTexture HPCA_ICON_ADVANCED_COMPUTATION_COMPONENT = new ResourceTexture( - "gtceu:textures/gui/widget/hpca/advanced_computation_component.png"); - public static final ResourceTexture HPCA_ICON_BRIDGE_COMPONENT = new ResourceTexture( - "gtceu:textures/gui/widget/hpca/bridge_component.png"); - public static final ResourceTexture HPCA_ICON_COMPUTATION_COMPONENT = new ResourceTexture( - "gtceu:textures/gui/widget/hpca/computation_component.png"); - public static final ResourceTexture HPCA_ICON_ACTIVE_COOLER_COMPONENT = new ResourceTexture( - "gtceu:textures/gui/widget/hpca/active_cooler_component.png"); - public static final ResourceTexture HPCA_ICON_HEAT_SINK_COMPONENT = new ResourceTexture( - "gtceu:textures/gui/widget/hpca/heat_sink_component.png"); - public static final ResourceTexture HPCA_ICON_DAMAGED_ADVANCED_COMPUTATION_COMPONENT = new ResourceTexture( - "gtceu:textures/gui/widget/hpca/damaged_advanced_computation_component.png"); - public static final ResourceTexture HPCA_ICON_DAMAGED_COMPUTATION_COMPONENT = new ResourceTexture( - "gtceu:textures/gui/widget/hpca/damaged_computation_component.png"); -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/SteamTexture.java b/src/main/java/com/gregtechceu/gtceu/api/gui/SteamTexture.java deleted file mode 100644 index fa3743bcf94..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/SteamTexture.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.gregtechceu.gtceu.api.gui; - -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; - -public class SteamTexture { - - private static final String BRONZE = "bronze"; - private static final String STEEL = "steel"; - - private final ResourceTexture bronzeTexture; - private final ResourceTexture steelTexture; - - private SteamTexture(ResourceTexture bronzeTexture, ResourceTexture steelTexture) { - this.bronzeTexture = bronzeTexture; - this.steelTexture = steelTexture; - } - - public static SteamTexture fullImage(String path) { - return new SteamTexture( - new ResourceTexture(String.format(path, BRONZE)), - new ResourceTexture(String.format(path, STEEL))); - } - - public ResourceTexture get(boolean isHighPressure) { - return isHighPressure ? steelTexture : bronzeTexture; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/UITemplate.java b/src/main/java/com/gregtechceu/gtceu/api/gui/UITemplate.java deleted file mode 100644 index 46bb179cbeb..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/UITemplate.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.gregtechceu.gtceu.api.gui; - -import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; - -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; - -import net.minecraft.world.entity.player.Inventory; - -public class UITemplate { - - public static WidgetGroup bindPlayerInventory(Inventory inventoryPlayer, IGuiTexture imageLocation, int x, int y, - boolean addHotbar) { - WidgetGroup group = new WidgetGroup(x, y, 162, 54 + (addHotbar ? 22 : 0)); - for (int row = 0; row < 3; row++) { - for (int col = 0; col < 9; col++) { - group.addWidget(new SlotWidget(inventoryPlayer, col + (row + 1) * 9, col * 18, row * 18) - .setBackgroundTexture(imageLocation) - .setLocationInfo(true, false)); - } - } - if (addHotbar) { - for (int slot = 0; slot < 9; slot++) { - group.addWidget(new SlotWidget(inventoryPlayer, slot, slot * 18, 58) - .setBackgroundTexture(imageLocation) - .setLocationInfo(true, true)); - } - } - return group; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/WidgetUtils.java b/src/main/java/com/gregtechceu/gtceu/api/gui/WidgetUtils.java deleted file mode 100644 index ed996599973..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/WidgetUtils.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.gregtechceu.gtceu.api.gui; - -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; - -import org.jetbrains.annotations.Nullable; - -import java.util.List; -import java.util.function.Consumer; -import java.util.regex.Pattern; - -public class WidgetUtils { - - public static List getWidgetsById(WidgetGroup group, String regex) { - return group.getWidgetsById(Pattern.compile(regex)); - } - - @Nullable - public static Widget getFirstWidgetById(WidgetGroup group, String regex) { - return group.getFirstWidgetById(Pattern.compile(regex)); - } - - public static void widgetByIdForEach(WidgetGroup group, String regex, Consumer consumer) { - getWidgetsById(group, regex).forEach(consumer); - } - - public static void widgetByIdForEach(WidgetGroup group, String regex, Class clazz, - Consumer consumer) { - for (Widget widget : getWidgetsById(group, regex)) { - if (clazz.isInstance(widget)) { - consumer.accept(clazz.cast(widget)); - } - } - } - - public static int widgetIdIndex(Widget widget) { - var id = widget.getId(); - if (id == null) return -1; - var split = id.split("_"); - if (split.length == 0) return -1; - var end = split[split.length - 1]; - try { - return Integer.parseInt(end); - } catch (Exception e) { - return -1; - } - } - - public static int getInventoryHeight(boolean includeHotbar) { - return 64 + (includeHotbar ? 22 : 0); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/editor/EditableMachineUI.java b/src/main/java/com/gregtechceu/gtceu/api/gui/editor/EditableMachineUI.java deleted file mode 100644 index 56798f4bace..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/editor/EditableMachineUI.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.editor; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.MetaMachine; - -import com.lowdragmc.lowdraglib.gui.editor.configurator.IConfigurableWidget; -import com.lowdragmc.lowdraglib.gui.editor.data.Resources; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.utils.Position; - -import net.minecraft.client.Minecraft; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtAccounter; -import net.minecraft.nbt.NbtIo; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.packs.resources.ResourceManager; - -import lombok.Getter; -import org.jetbrains.annotations.Nullable; - -import java.io.DataInputStream; -import java.io.InputStream; -import java.util.function.BiConsumer; -import java.util.function.Supplier; - -public class EditableMachineUI implements IEditableUI { - - @Getter - final String groupName; - @Getter - final ResourceLocation uiPath; - final Supplier widgetSupplier; - final BiConsumer binder; - @Nullable - private CompoundTag customUICache; - - public EditableMachineUI(String groupName, ResourceLocation uiPath, Supplier widgetSupplier, - BiConsumer binder) { - this.groupName = groupName; - this.uiPath = uiPath; - this.widgetSupplier = widgetSupplier; - this.binder = binder; - } - - public WidgetGroup createDefault() { - return widgetSupplier.get(); - } - - public void setupUI(WidgetGroup template, MetaMachine machine) { - binder.accept(template, machine); - } - - ////////////////////////////////////// - // ******** GUI *********// - ////////////////////////////////////// - - @Nullable - public WidgetGroup createCustomUI() { - if (hasCustomUI()) { - var nbt = getCustomUI(); - var group = new WidgetGroup(); - IConfigurableWidget.deserializeNBT(group, nbt.getCompound("root"), - Resources.fromNBT(nbt.getCompound("resources")), false); - group.setSelfPosition(new Position(0, 0)); - return group; - } - return null; - } - - public CompoundTag getCustomUI() { - if (this.customUICache == null) { - ResourceManager resourceManager = null; - if (GTCEu.isClientSide()) { - resourceManager = Minecraft.getInstance().getResourceManager(); - } else if (GTCEu.getMinecraftServer() != null) { - resourceManager = GTCEu.getMinecraftServer().getResourceManager(); - } - if (resourceManager == null) { - this.customUICache = new CompoundTag(); - } else { - try { - var resource = resourceManager.getResourceOrThrow(new ResourceLocation(uiPath.getNamespace(), - "ui/machine/%s.mui".formatted(uiPath.getPath()))); - try (InputStream inputStream = resource.open()) { - try (DataInputStream dataInputStream = new DataInputStream(inputStream);) { - this.customUICache = NbtIo.read(dataInputStream, NbtAccounter.UNLIMITED); - } - } - } catch (Exception e) { - this.customUICache = new CompoundTag(); - } - if (this.customUICache == null) { - this.customUICache = new CompoundTag(); - } - } - } - return this.customUICache; - } - - public boolean hasCustomUI() { - return !getCustomUI().isEmpty(); - } - - public void reloadCustomUI() { - this.customUICache = null; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/editor/EditableUI.java b/src/main/java/com/gregtechceu/gtceu/api/gui/editor/EditableUI.java deleted file mode 100644 index 3020d5f7676..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/editor/EditableUI.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.editor; - -import com.gregtechceu.gtceu.api.gui.WidgetUtils; - -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; - -import lombok.Getter; - -import java.util.function.BiConsumer; -import java.util.function.Supplier; - -public class EditableUI implements IEditableUI { - - @Getter - final String id; - final Class clazz; - @Getter - final Supplier widgetSupplier; - @Getter - final BiConsumer binder; - - public EditableUI(String id, Class clazz, Supplier widgetSupplier, BiConsumer binder) { - this.id = id; - this.clazz = clazz; - this.widgetSupplier = widgetSupplier; - this.binder = binder; - } - - public W createDefault() { - var widget = widgetSupplier.get(); - widget.setId(id); - return widget; - } - - public void setupUI(WidgetGroup template, T instance) { - WidgetUtils.widgetByIdForEach(template, "^" + id + "$", clazz, w -> binder.accept(w, instance)); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/editor/GTUIEditor.java b/src/main/java/com/gregtechceu/gtceu/api/gui/editor/GTUIEditor.java deleted file mode 100644 index 9f372444007..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/editor/GTUIEditor.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.editor; - -import com.lowdragmc.lowdraglib.LDLib; -import com.lowdragmc.lowdraglib.gui.editor.Icons; -import com.lowdragmc.lowdraglib.gui.editor.annotation.LDLRegister; -import com.lowdragmc.lowdraglib.gui.editor.ui.UIEditor; -import com.lowdragmc.lowdraglib.gui.editor.ui.tool.WidgetToolBox; - -import static com.lowdragmc.lowdraglib.gui.editor.ui.tool.WidgetToolBox.Default.registerTab; - -@LDLRegister(name = "editor.gtceu", group = "editor") -public class GTUIEditor extends UIEditor { - - public static final WidgetToolBox.Default GT_CONTAINER = registerTab("widget.gtm_container", - Icons.WIDGET_CONTAINER); - - public GTUIEditor() { - super(LDLib.location); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/editor/IEditableUI.java b/src/main/java/com/gregtechceu/gtceu/api/gui/editor/IEditableUI.java deleted file mode 100644 index 9af8c25799c..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/editor/IEditableUI.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.editor; - -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; - -import java.util.function.BiConsumer; -import java.util.function.Supplier; - -public interface IEditableUI { - - W createDefault(); - - void setupUI(WidgetGroup template, T instance); - - record Normal(Supplier supplier, BiConsumer binder) - implements IEditableUI { - - @Override - public A createDefault() { - return supplier.get(); - } - - @Override - public void setupUI(WidgetGroup template, B instance) { - binder.accept(template, instance); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/editor/MachineUIProject.java b/src/main/java/com/gregtechceu/gtceu/api/gui/editor/MachineUIProject.java deleted file mode 100644 index ef0cf9410a0..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/editor/MachineUIProject.java +++ /dev/null @@ -1,155 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.editor; - -import com.gregtechceu.gtceu.api.machine.MachineDefinition; -import com.gregtechceu.gtceu.api.registry.GTRegistries; - -import com.lowdragmc.lowdraglib.LDLib; -import com.lowdragmc.lowdraglib.gui.editor.ColorPattern; -import com.lowdragmc.lowdraglib.gui.editor.Icons; -import com.lowdragmc.lowdraglib.gui.editor.annotation.LDLRegister; -import com.lowdragmc.lowdraglib.gui.editor.data.Resources; -import com.lowdragmc.lowdraglib.gui.editor.data.UIProject; -import com.lowdragmc.lowdraglib.gui.editor.ui.Editor; -import com.lowdragmc.lowdraglib.gui.editor.ui.tool.WidgetToolBox; -import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; -import com.lowdragmc.lowdraglib.gui.texture.ItemStackTexture; -import com.lowdragmc.lowdraglib.gui.texture.TextTexture; -import com.lowdragmc.lowdraglib.gui.util.TreeBuilder; -import com.lowdragmc.lowdraglib.gui.widget.TabButton; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.utils.Position; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtIo; -import net.minecraft.resources.ResourceLocation; - -import lombok.Getter; -import org.jetbrains.annotations.Nullable; - -import java.io.File; -import java.io.IOException; -import java.util.*; - -@LDLRegister(name = "mui", group = "editor.gtceu") -public class MachineUIProject extends UIProject { - - @Nullable - @Getter - protected MachineDefinition machineDefinition; - - private MachineUIProject() { - this(null, null); - } - - public MachineUIProject(Resources resources, WidgetGroup root) { - super(resources, root); - } - - public MachineUIProject(CompoundTag tag) { - super(tag); - } - - public void setMachine(@Nullable MachineDefinition machineDefinition) { - this.machineDefinition = machineDefinition; - } - - public MachineUIProject newEmptyProject() { - return new MachineUIProject(Resources.defaultResource(), new WidgetGroup(30, 30, 200, 150)); - } - - @Override - public UIProject loadProject(File file) { - try { - var tag = NbtIo.read(file); - if (tag != null) { - return new MachineUIProject(tag); - } - } catch (IOException ignored) {} - return null; - } - - @Override - public CompoundTag serializeNBT() { - var tag = super.serializeNBT(); - if (machineDefinition != null) { - tag.putString("machine", machineDefinition.getId().toString()); - } - return tag; - } - - @Override - public void deserializeNBT(CompoundTag tag) { - super.deserializeNBT(tag); - if (tag.contains("machine")) { - machineDefinition = GTRegistries.MACHINES.get(new ResourceLocation(tag.getString("machine"))); - } - } - - @Override - public void onLoad(Editor editor) { - editor.getResourcePanel().loadResource(getResources(), false); - editor.getTabPages().addTab(new TabButton(50, 16, 60, 14).setTexture( - new GuiTextureGroup(ColorPattern.T_GREEN.rectTexture().setBottomRadius(10).transform(0, 0.4f), - new TextTexture("Main")), - new GuiTextureGroup(ColorPattern.T_RED.rectTexture().setBottomRadius(10).transform(0, 0.4f), - new TextTexture("Main"))), - new UIMainPanel(editor, root, machineDefinition == null ? null : machineDefinition.getDescriptionId())); - - for (WidgetToolBox.Default tab : WidgetToolBox.Default.TABS) { - if (tab == WidgetToolBox.Default.CONTAINER) { - continue; - } - editor.getToolPanel().addNewToolBox("ldlib.gui.editor.group." + tab.groupName, tab.icon, - tab.createToolBox()); - } - } - - @Override - public void attachMenu(Editor editor, String name, TreeBuilder.Menu menu) { - if (name.equals("file")) { - if (machineDefinition == null || machineDefinition.getEditableUI() == null) { - menu.remove("ldlib.gui.editor.menu.save"); - } else { - menu.remove("ldlib.gui.editor.menu.save"); - menu.leaf(Icons.SAVE, "ldlib.gui.editor.menu.save", () -> { - var editableUI = machineDefinition.getEditableUI(); - var path = new File(LDLib.location, - "assets/%s/ui/machine".formatted(editableUI.getUiPath().getNamespace())); - path.mkdirs(); - saveProject(new File(path, editableUI.getUiPath().getPath() + "." + this.getRegisterUI().name())); - editableUI.reloadCustomUI(); - }); - } - } else if (name.equals("template_tab")) { - Map> categories = new LinkedHashMap<>(); - for (var definition : GTRegistries.MACHINES) { - final var editableUI = definition.getEditableUI(); - if (editableUI != null) { - // has editable UI - categories.computeIfAbsent(editableUI.getGroupName(), group -> new ArrayList<>()).add(definition); - } - } - categories.forEach((groupName, definitions) -> menu.branch(groupName, m -> { - Set addedSet = new HashSet<>(); - for (var definition : definitions) { - var editableUI = definition.getEditableUI(); - if (editableUI != null && addedSet.add(editableUI)) { - m.leaf(new ItemStackTexture(definition.asStack()), definition.getDescriptionId(), () -> { - root.clearAllWidgets(); - if (editableUI.hasCustomUI()) { - deserializeNBT(editableUI.getCustomUI()); - } else { - var template = editableUI.createDefault(); - template.setSelfPosition( - new Position(root.getSelfPosition().x, root.getSelfPosition().y)); - this.root = template; - } - setMachine(definition); - editor.loadProject(this); - }); - } - } - })); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/editor/RecipeTypeUIProject.java b/src/main/java/com/gregtechceu/gtceu/api/gui/editor/RecipeTypeUIProject.java deleted file mode 100644 index 5927dedaea1..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/editor/RecipeTypeUIProject.java +++ /dev/null @@ -1,154 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.editor; - -import com.gregtechceu.gtceu.api.recipe.GTRecipeType; -import com.gregtechceu.gtceu.api.registry.GTRegistries; - -import com.lowdragmc.lowdraglib.LDLib; -import com.lowdragmc.lowdraglib.gui.editor.ColorPattern; -import com.lowdragmc.lowdraglib.gui.editor.Icons; -import com.lowdragmc.lowdraglib.gui.editor.annotation.LDLRegister; -import com.lowdragmc.lowdraglib.gui.editor.configurator.IConfigurableWidget; -import com.lowdragmc.lowdraglib.gui.editor.data.Resources; -import com.lowdragmc.lowdraglib.gui.editor.data.UIProject; -import com.lowdragmc.lowdraglib.gui.editor.ui.Editor; -import com.lowdragmc.lowdraglib.gui.editor.ui.tool.WidgetToolBox; -import com.lowdragmc.lowdraglib.gui.texture.*; -import com.lowdragmc.lowdraglib.gui.util.TreeBuilder; -import com.lowdragmc.lowdraglib.gui.widget.*; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtIo; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.Items; - -import lombok.Getter; -import lombok.Setter; -import org.jetbrains.annotations.Nullable; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -@LDLRegister(name = "rtui", group = "editor.gtceu") -public class RecipeTypeUIProject extends UIProject { - - @Nullable - @Getter - @Setter - protected GTRecipeType recipeType; - - private RecipeTypeUIProject() { - this(null, null); - } - - public RecipeTypeUIProject(Resources resources, WidgetGroup root) { - super(resources, root); - } - - public RecipeTypeUIProject(CompoundTag tag) { - super(tag); - } - - @Override - public RecipeTypeUIProject newEmptyProject() { - return new RecipeTypeUIProject(Resources.defaultResource(), new WidgetGroup(30, 30, 200, 200)); - } - - @Override - public UIProject loadProject(File file) { - try { - var tag = NbtIo.read(file); - if (tag != null) { - return new RecipeTypeUIProject(tag); - } - } catch (IOException ignored) {} - return null; - } - - @Override - public CompoundTag serializeNBT() { - var tag = super.serializeNBT(); - if (recipeType != null) { - tag.putString("recipe_type", recipeType.registryName.toString()); - } - return tag; - } - - @Override - public void deserializeNBT(CompoundTag tag) { - super.deserializeNBT(tag); - if (tag.contains("recipe_type")) { - recipeType = GTRegistries.RECIPE_TYPES.get(new ResourceLocation(tag.getString("recipe_type"))); - } - } - - @Override - public void onLoad(Editor editor) { - editor.getResourcePanel().loadResource(getResources(), false); - editor.getTabPages().addTab(new TabButton(50, 16, 60, 14).setTexture( - new GuiTextureGroup(ColorPattern.T_GREEN.rectTexture().setBottomRadius(10).transform(0, 0.4f), - new TextTexture("Main")), - new GuiTextureGroup(ColorPattern.T_RED.rectTexture().setBottomRadius(10).transform(0, 0.4f), - new TextTexture("Main"))), - new UIMainPanel(editor, root, recipeType == null ? null : recipeType.registryName.toLanguageKey())); - for (WidgetToolBox.Default tab : WidgetToolBox.Default.TABS) { - if (tab == WidgetToolBox.Default.CONTAINER) { - continue; - } - editor.getToolPanel().addNewToolBox("ldlib.gui.editor.group." + tab.groupName, tab.icon, - tab.createToolBox()); - } - } - - @Override - public void attachMenu(Editor editor, String name, TreeBuilder.Menu menu) { - if (name.equals("file")) { - if (recipeType == null) { - menu.remove("ldlib.gui.editor.menu.save"); - } else { - menu.remove("ldlib.gui.editor.menu.save"); - menu.leaf(Icons.SAVE, "ldlib.gui.editor.menu.save", () -> { - var path = new File(LDLib.getLDLibDir(), - "assets/%s/ui/recipe_type".formatted(recipeType.registryName.getNamespace())); - path.mkdirs(); - saveProject(new File(path, recipeType.registryName.getPath() + "." + this.getRegisterUI().name())); - recipeType.getRecipeUI().reloadCustomUI(); - }); - } - } else if (name.equals("template_tab")) { - Map> categories = new LinkedHashMap<>(); - for (GTRecipeType recipeType : GTRegistries.RECIPE_TYPES) { - categories.computeIfAbsent(recipeType.group, group -> new ArrayList<>()).add(recipeType); - } - categories.forEach((groupName, recipeTypes) -> menu.branch(groupName, m -> { - for (GTRecipeType recipeType : recipeTypes) { - IGuiTexture icon; - if (recipeType.getIconSupplier() != null) { - icon = new ItemStackTexture(recipeType.getIconSupplier().get()); - } else { - icon = new ItemStackTexture(Items.BARRIER); - } - m.leaf(icon, recipeType.registryName.toLanguageKey(), () -> { - root.clearAllWidgets(); - if (recipeType.getRecipeUI().hasCustomUI()) { - var nbt = recipeType.getRecipeUI().getCustomUI(); - IConfigurableWidget.deserializeNBT(root, nbt.getCompound("root"), - Resources.fromNBT(nbt.getCompound("resources")), false); - } else { - var widget = recipeType.getRecipeUI().createEditableUITemplate(false, false) - .createDefault(); - root.setSize(widget.getSize()); - for (Widget children : widget.widgets) { - root.addWidget(children); - } - } - setRecipeType(recipeType); - }); - } - })); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/editor/TemplateTab.java b/src/main/java/com/gregtechceu/gtceu/api/gui/editor/TemplateTab.java deleted file mode 100644 index 717d9e662b6..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/editor/TemplateTab.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.editor; - -import com.lowdragmc.lowdraglib.gui.editor.annotation.LDLRegister; -import com.lowdragmc.lowdraglib.gui.editor.ui.menu.MenuTab; -import com.lowdragmc.lowdraglib.gui.util.TreeBuilder; - -@LDLRegister(name = "template_tab", group = "editor.gtceu") -public class TemplateTab extends MenuTab { - - protected TreeBuilder.Menu createMenu() { - return TreeBuilder.Menu.start(); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/editor/UIMainPanel.java b/src/main/java/com/gregtechceu/gtceu/api/gui/editor/UIMainPanel.java deleted file mode 100644 index 430266b226a..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/editor/UIMainPanel.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.editor; - -import com.gregtechceu.gtceu.api.gui.GuiTextures; - -import com.lowdragmc.lowdraglib.gui.editor.ui.Editor; -import com.lowdragmc.lowdraglib.gui.editor.ui.MainPanel; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.texture.TextTexture; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; - -import net.minecraft.client.gui.GuiGraphics; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -public class UIMainPanel extends MainPanel { - - final String description; - - public UIMainPanel(Editor editor, WidgetGroup root, String description) { - super(editor, root); - this.setBackground(new IGuiTexture() { - - @Override - @OnlyIn(Dist.CLIENT) - public void draw(GuiGraphics graphics, int mouseX, int mouseY, float x, float y, int width, int height) { - if (description != null) { - new TextTexture(description).scale(2.0f).draw(graphics, mouseX, mouseY, x, y, - width - editor.getConfigPanel().getSize().getWidth(), height); - } - var border = 4; - var background = GuiTextures.BACKGROUND; - var position = root.getPosition(); - var size = root.getSize(); - var w = Math.max(size.width + border * 2, 172); - var h = Math.max(size.height + border * 2, 86); - background.draw(graphics, mouseX, mouseY, - position.x - (w - size.width) / 2f, - position.y - (h - size.height) / 2f, - w, h); - } - }); - this.description = description; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/factory/CoverUIFactory.java b/src/main/java/com/gregtechceu/gtceu/api/gui/factory/CoverUIFactory.java deleted file mode 100644 index 62bdd2601ad..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/factory/CoverUIFactory.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.factory; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; -import com.gregtechceu.gtceu.api.cover.CoverBehavior; -import com.gregtechceu.gtceu.api.cover.IUICover; - -import com.lowdragmc.lowdraglib.gui.factory.UIFactory; -import com.lowdragmc.lowdraglib.gui.modular.ModularUI; - -import net.minecraft.client.Minecraft; -import net.minecraft.core.Direction; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -public class CoverUIFactory extends UIFactory { - - public static final CoverUIFactory INSTANCE = new CoverUIFactory(); - - public CoverUIFactory() { - super(GTCEu.id("cover")); - } - - @Override - protected ModularUI createUITemplate(CoverBehavior holder, Player entityPlayer) { - if (holder instanceof IUICover cover) { - return cover.createUI(entityPlayer); - } - return null; - } - - @OnlyIn(Dist.CLIENT) - @Override - protected CoverBehavior readHolderFromSyncData(FriendlyByteBuf syncData) { - Level world = Minecraft.getInstance().level; - if (world == null) return null; - var pos = syncData.readBlockPos(); - var side = syncData.readEnum(Direction.class); - var coverable = GTCapabilityHelper.getCoverable(world, pos, side); - if (coverable != null) { - return coverable.getCoverAtSide(side); - } - return null; - } - - @Override - protected void writeHolderToSyncData(FriendlyByteBuf syncData, CoverBehavior holder) { - syncData.writeBlockPos(holder.coverHolder.getBlockPos()); - syncData.writeEnum(holder.attachedSide); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/factory/GTUIEditorFactory.java b/src/main/java/com/gregtechceu/gtceu/api/gui/factory/GTUIEditorFactory.java deleted file mode 100644 index 814491d6e60..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/factory/GTUIEditorFactory.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.factory; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.gui.editor.GTUIEditor; - -import com.lowdragmc.lowdraglib.LDLib; -import com.lowdragmc.lowdraglib.gui.factory.UIFactory; -import com.lowdragmc.lowdraglib.gui.modular.IUIHolder; -import com.lowdragmc.lowdraglib.gui.modular.ModularUI; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.entity.player.Player; - -public class GTUIEditorFactory extends UIFactory implements IUIHolder { - - public static final GTUIEditorFactory INSTANCE = new GTUIEditorFactory(); - - private GTUIEditorFactory() { - super(LDLib.location("gt_ui_editor")); - } - - @Override - protected ModularUI createUITemplate(GTUIEditorFactory holder, Player entityPlayer) { - return createUI(entityPlayer); - } - - @Override - protected GTUIEditorFactory readHolderFromSyncData(FriendlyByteBuf syncData) { - return this; - } - - @Override - protected void writeHolderToSyncData(FriendlyByteBuf syncData, GTUIEditorFactory holder) {} - - @Override - public ModularUI createUI(Player entityPlayer) { - return new ModularUI(this, entityPlayer).widget(new GTUIEditor()); - } - - @Override - public boolean isInvalid() { - return false; - } - - @Override - public boolean isRemote() { - return GTCEu.isClientThread(); - } - - @Override - public void markAsDirty() {} -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/factory/MachineUIFactory.java b/src/main/java/com/gregtechceu/gtceu/api/gui/factory/MachineUIFactory.java deleted file mode 100644 index 220c3a9c4d0..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/factory/MachineUIFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.factory; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; - -import com.lowdragmc.lowdraglib.gui.factory.UIFactory; -import com.lowdragmc.lowdraglib.gui.modular.ModularUI; - -import net.minecraft.client.Minecraft; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -public class MachineUIFactory extends UIFactory { - - public static final MachineUIFactory INSTANCE = new MachineUIFactory(); - - public MachineUIFactory() { - super(GTCEu.id("machine")); - } - - @Override - protected ModularUI createUITemplate(MetaMachine holder, Player entityPlayer) { - if (holder instanceof IUIMachine machine) { - return machine.createUI(entityPlayer); - } - return null; - } - - @OnlyIn(Dist.CLIENT) - @Override - protected MetaMachine readHolderFromSyncData(FriendlyByteBuf syncData) { - Level world = Minecraft.getInstance().level; - if (world == null) return null; - if (world.getBlockEntity(syncData.readBlockPos()) instanceof MetaMachine holder) { - return holder; - } - return null; - } - - @Override - protected void writeHolderToSyncData(FriendlyByteBuf syncData, MetaMachine holder) { - syncData.writeBlockPos(holder.getBlockPos()); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/ConfiguratorPanel.java b/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/ConfiguratorPanel.java deleted file mode 100644 index 6ab93be46bc..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/ConfiguratorPanel.java +++ /dev/null @@ -1,449 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.fancy; - -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.config.ConfigHolder; - -import com.lowdragmc.lowdraglib.gui.animation.Animation; -import com.lowdragmc.lowdraglib.gui.animation.Transform; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.texture.TextTexture; -import com.lowdragmc.lowdraglib.gui.util.ClickData; -import com.lowdragmc.lowdraglib.gui.widget.ButtonWidget; -import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.utils.Position; -import com.lowdragmc.lowdraglib.utils.Size; -import com.lowdragmc.lowdraglib.utils.interpolate.Eases; - -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -import com.mojang.blaze3d.systems.RenderSystem; -import lombok.Getter; -import lombok.Setter; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public class ConfiguratorPanel extends WidgetGroup { - - @Getter - protected List tabs = new ArrayList<>(); - @Getter - @Nullable - protected Tab expanded; - @Setter - protected int border = 4; - @Setter - protected IGuiTexture texture = GuiTextures.BACKGROUND; - - public ConfiguratorPanel(int x, int y) { - super(x, y, 24, 0); - } - - public void clear() { - clearAllWidgets(); - tabs.clear(); - expanded = null; - } - - public int getTabSize() { - return getSize().width; - } - - public void attachConfigurators(IFancyConfigurator... fancyConfigurators) { - for (IFancyConfigurator fancyConfigurator : fancyConfigurators) { - var tab = new Tab(fancyConfigurator); - tab.setBackground(texture); - tabs.add(tab); - addWidgetAnima(tab, new Transform() - .scale(0) - .duration(getAnimationTime()) - .ease(Eases.EaseQuadOut)); - } - setSize(new Size(getSize().width, Math.max(0, tabs.size() * (getTabSize() + 2) - 2))); - } - - public void expandTab(Tab tab) { - tab.expand(); - int i = 0; - for (Tab otherTab : tabs) { - if (otherTab != tab) { - otherTab.collapseTo(0, i++ * (getTabSize() + 2)); - } - } - expanded = tab; - } - - public void collapseTab() { - if (expanded != null) { - for (int i = 0; i < tabs.size(); i++) { - tabs.get(i).collapseTo(0, i * (getTabSize() + 2)); - } - if (expanded instanceof FloatingTab) { - expanded.collapseTo(0, 0); - } - } - expanded = null; - } - - @Override - @OnlyIn(Dist.CLIENT) - protected void drawWidgetsBackground(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - for (Widget widget : widgets) { - if (widget.isVisible() && widget != expanded) { - RenderSystem.setShaderColor(1, 1, 1, 1); - RenderSystem.enableBlend(); - if (widget.inAnimate()) { - widget.getAnimation().drawInBackground(graphics, mouseX, mouseY, partialTicks); - } else { - widget.drawInBackground(graphics, mouseX, mouseY, partialTicks); - } - } - } - if (expanded != null && expanded.isVisible()) { - graphics.pose().pushPose(); - graphics.pose().translate(0, 0, 300); - RenderSystem.setShaderColor(1, 1, 1, 1); - RenderSystem.enableBlend(); - if (expanded.inAnimate()) { - expanded.getAnimation().drawInBackground(graphics, mouseX, mouseY, partialTicks); - } else { - expanded.drawInBackground(graphics, mouseX, mouseY, partialTicks); - } - graphics.pose().popPose(); - } - } - - @Override - @OnlyIn(Dist.CLIENT) - - protected void drawWidgetsForeground(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - // remove previous tooltip - if (isMouseOverElement(mouseX, mouseY)) { - gui.getModularUIGui().setHoverTooltip(Collections.emptyList(), ItemStack.EMPTY, null, null); - } - for (Widget widget : widgets) { - if (widget.isVisible() && widget != expanded) { - RenderSystem.setShaderColor(1, 1, 1, 1); - RenderSystem.enableBlend(); - if (widget.inAnimate()) { - widget.getAnimation().drawInForeground(graphics, mouseX, mouseY, partialTicks); - } else { - widget.drawInForeground(graphics, mouseX, mouseY, partialTicks); - } - } - } - if (expanded != null && expanded.isVisible()) { - RenderSystem.setShaderColor(1, 1, 1, 1); - RenderSystem.enableBlend(); - if (expanded.inAnimate()) { - expanded.getAnimation().drawInForeground(graphics, mouseX, mouseY, partialTicks); - } else { - expanded.drawInForeground(graphics, mouseX, mouseY, partialTicks); - } - } - } - - @Override - @OnlyIn(Dist.CLIENT) - public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (expanded != null && expanded.isVisible() && expanded.isActive() && - expanded.mouseClicked(mouseX, mouseY, button)) { - return true; - } - return super.mouseClicked(mouseX, mouseY, button); - } - - public FloatingTab createFloatingTab(IFancyConfigurator configurator) { - return new FloatingTab(configurator); - } - - public class Tab extends WidgetGroup { - - protected final IFancyConfigurator configurator; - protected final ButtonWidget button; - @Nullable - protected final WidgetGroup view; - // dragging - protected double lastDeltaX, lastDeltaY; - protected int dragOffsetX, dragOffsetY; - protected boolean isDragging; - - public Tab(IFancyConfigurator configurator) { - super(0, tabs.size() * (getTabSize() + 2), getTabSize(), getTabSize()); - this.configurator = configurator; - this.button = new ButtonWidget(0, 0, getTabSize(), getTabSize(), null, this::onClick) { - - @Override - public boolean mouseWheelMove(double mouseX, double mouseY, double wheelDelta) { - if (!(configurator instanceof IFancyCustomMouseWheelAction hasActions)) return false; - if (isMouseOverElement(mouseX, mouseY)) - return hasActions.mouseWheelMove(this::writeClientAction, mouseX, mouseY, wheelDelta); - return false; - } - - @Override - public void handleClientAction(int id, FriendlyByteBuf buffer) { - if (configurator instanceof IFancyCustomClientActionHandler handler && id > 1) - handler.handleClientAction(id, buffer); - else - super.handleClientAction(id, buffer); - } - }; - if (configurator instanceof IFancyConfiguratorButton) { - this.view = null; - this.addWidget(button); - } else { - var widget = configurator.createConfigurator(); - widget.setSelfPosition(new Position(border, getTabSize())); - - this.view = new WidgetGroup(0, 0, 0, 0) { - - @Override - protected void onChildSizeUpdate(Widget child) { - super.onChildSizeUpdate(child); - if (widget == child) { - this.setSize(new Size(widget.getSize().width + border * 2, - widget.getSize().height + getTabSize() + border)); - } - } - }; - - this.view.setVisible(false); - this.view.setActive(false); - this.view.setSize(new Size(widget.getSize().width + border * 2, - widget.getSize().height + button.getSize().height + border)); - this.view.addWidget(widget); - this.view.addWidget(new ImageWidget(border + 5, border, widget.getSize().width - getTabSize() - 5, - getTabSize() - border, - new TextTexture(configurator.getTitle().getString()) - .setType(TextTexture.TextType.LEFT_HIDE) - .setWidth(widget.getSize().width - getTabSize()))); - this.addWidget(button); - this.addWidget(view); - } - } - - @Override - public void writeInitialData(FriendlyByteBuf buffer) { - super.writeInitialData(buffer); - configurator.writeInitialData(buffer); - } - - @Override - public void readInitialData(FriendlyByteBuf buffer) { - super.readInitialData(buffer); - configurator.readInitialData(buffer); - } - - @Override - public void detectAndSendChanges() { - super.detectAndSendChanges(); - configurator.detectAndSendChange((id, sender) -> writeUpdateInfo(0, buf -> { - buf.writeVarInt(id); - sender.accept(buf); - })); - } - - @Override - public void readUpdateInfo(int id, FriendlyByteBuf buffer) { - if (id == 0) { - configurator.readUpdateInfo(buffer.readVarInt(), buffer); - } else { - super.readUpdateInfo(id, buffer); - } - } - - @Override - protected void onChildSizeUpdate(Widget child) { - if (this.view != null && this.view == child) { - if (expanded == this) { - var size = view.getSize(); - animation(new Animation() - .duration(getAnimationTime()) - .position(new Position(dragOffsetX + (-size.width + (tabs.size() > 1 ? -2 : getTabSize())), - dragOffsetY)) - .size(size) - .ease(Eases.EaseQuadOut) - .onFinish(() -> { - view.setVisible(true); - view.setActive(true); - })); - } - } - } - - private void onClick(ClickData clickData) { - if (clickData.button == 2 && configurator instanceof IFancyCustomMiddleClickAction middleAction) { - middleAction.onMiddleClick(this::writeClientAction); - } else if (configurator instanceof IFancyConfiguratorButton fancyButton) { - fancyButton.onClick(clickData); - } else { - if (expanded == this) { - collapseTab(); - } else { - expandTab(this); - } - } - } - - @Override - public void setSize(Size size) { - super.setSize(size); - button.setSelfPosition(new Position(size.width - getTabSize(), 0)); - } - - private void expand() { - if (view == null) return; - var size = view.getSize(); - this.dragOffsetX = 0; - this.dragOffsetY = 0; - if (isRemote()) { - if (getParentPosition().x - size.width + (tabs.size() > 1 ? -2 : getTabSize()) < 0) { - this.dragOffsetX -= (view.getParentPosition().x - size.width + - (tabs.size() > 1 ? -2 : getTabSize())); - } - if (getParentPosition().y + size.height > gui.getScreenHeight()) { - this.dragOffsetY -= view.getParentPosition().y + size.height - gui.getScreenHeight(); - } - } - Position position = new Position(dragOffsetX - size.width + (tabs.size() > 1 ? -2 : getTabSize()), - dragOffsetY); - - animation(new Animation() - .duration(getAnimationTime()) - .position(position) - .size(size) - .ease(Eases.EaseQuadOut) - .onFinish(() -> { - view.setVisible(true); - view.setActive(true); - })); - } - - protected void collapseTo(int x, int y) { - if (view != null) { - view.setVisible(false); - view.setActive(false); - } - animation(new Animation() - .duration(getAnimationTime()) - .position(new Position(x, y)) - .size(new Size(getTabSize(), getTabSize())) - .ease(Eases.EaseQuadOut)); - } - - @Override - @OnlyIn(Dist.CLIENT) - public void drawInBackground(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - drawBackgroundTexture(graphics, mouseX, mouseY); - var position = getPosition(); - var size = getSize(); - if (inAnimate()) { - graphics.enableScissor(position.x + border - 1, position.y + border - 1, - position.x + border - 1 + size.width - (border - 1) * 2, - position.y + border - 1 + size.height - (border - 1) * 2); - drawWidgetsBackground(graphics, mouseX, mouseY, partialTicks); - graphics.disableScissor(); - } else { - drawWidgetsBackground(graphics, mouseX, mouseY, partialTicks); - } - configurator.getIcon().draw(graphics, mouseX, mouseY, position.x + size.width - 20, position.y + 4, 16, 16); - } - - @Override - @OnlyIn(Dist.CLIENT) - public void drawInForeground(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - super.drawInForeground(graphics, mouseX, mouseY, partialTicks); - if (isMouseOver(getPosition().x + getSize().width - 20, getPosition().y + 4, 16, 16, mouseX, mouseY) && - gui != null && gui.getModularUIGui() != null) { - gui.getModularUIGui().setHoverTooltip(configurator.getTooltips(), ItemStack.EMPTY, null, null); - } - } - - @Override - @OnlyIn(Dist.CLIENT) - public boolean mouseClicked(double mouseX, double mouseY, int button) { - this.lastDeltaX = 0; - this.lastDeltaY = 0; - this.isDragging = false; - if (expanded == this && isMouseOver(getPosition().x, getPosition().y, getSize().width - getTabSize(), - getTabSize(), mouseX, mouseY)) { - isDragging = true; - return true; - } - return super.mouseClicked(mouseX, mouseY, button) || isMouseOverElement(mouseX, mouseY); - } - - @Override - @OnlyIn(Dist.CLIENT) - public boolean mouseDragged(double mouseX, double mouseY, int button, double dragX, double dragY) { - double dx = dragX + lastDeltaX; - double dy = dragY + lastDeltaY; - dragX = (int) dx; - dragY = (int) dy; - lastDeltaX = dx - dragX; - lastDeltaY = dy - dragY; - if (isDragging) { - this.dragOffsetX += (int) dragX; - this.dragOffsetY += (int) dragY; - this.addSelfPosition((int) dragX, (int) dragY); - } - return super.mouseDragged(mouseX, mouseY, button, dragX, dragY) || isMouseOverElement(mouseX, mouseY); - } - - @Override - @OnlyIn(Dist.CLIENT) - public boolean mouseReleased(double mouseX, double mouseY, int button) { - this.lastDeltaX = 0; - this.lastDeltaY = 0; - this.isDragging = false; - return super.mouseReleased(mouseX, mouseY, button) || isMouseOverElement(mouseX, mouseY); - } - - @Override - @OnlyIn(Dist.CLIENT) - public boolean mouseWheelMove(double mouseX, double mouseY, double wheelDelta) { - return super.mouseWheelMove(mouseX, mouseY, wheelDelta) || isMouseOverElement(mouseX, mouseY); - } - - @Override - @OnlyIn(Dist.CLIENT) - public boolean mouseMoved(double mouseX, double mouseY) { - return super.mouseMoved(mouseX, mouseY) || isMouseOverElement(mouseX, mouseY); - } - } - - public class FloatingTab extends Tab { - - protected Runnable closeCallback = () -> {}; - - public FloatingTab(IFancyConfigurator configurator) { - super(configurator); - this.view.setBackground(GuiTextures.BACKGROUND); - } - - @Override - public void collapseTo(int x, int y) { - super.collapseTo(x, y); - ConfiguratorPanel.this.removeWidget(this); - closeCallback.run(); - } - - public void onClose(Runnable closeCallback) { - this.closeCallback = closeCallback; - } - } - - private static int getAnimationTime() { - return ConfigHolder.INSTANCE.client.animationTime; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/FancyMachineUIWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/FancyMachineUIWidget.java deleted file mode 100644 index 5e62d3bf958..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/FancyMachineUIWidget.java +++ /dev/null @@ -1,242 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.fancy; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.config.ConfigHolder; - -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.util.ClickData; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.gui.widget.custom.PlayerInventoryWidget; -import com.lowdragmc.lowdraglib.utils.Position; -import com.lowdragmc.lowdraglib.utils.Size; - -import lombok.Getter; -import lombok.Setter; -import org.jetbrains.annotations.Nullable; - -import java.util.ArrayDeque; -import java.util.Deque; -import java.util.List; -import java.util.stream.Stream; - -@Getter -public class FancyMachineUIWidget extends WidgetGroup { - - protected final TitleBarWidget titleBar; - protected final VerticalTabsWidget sideTabsWidget; - protected final WidgetGroup pageContainer; - protected final PageSwitcher pageSwitcher; - protected final ConfiguratorPanel configuratorPanel; - protected final TooltipsPanel tooltipsPanel; - - @Nullable - protected final PlayerInventoryWidget playerInventory; - @Setter - protected int border = 4; - - protected final IFancyUIProvider mainPage; - - /* - * Current Page: The page visible in the UI - * Current Home Page: The currently selected multiblock part's home page. - */ - protected IFancyUIProvider currentPage; - protected IFancyUIProvider currentHomePage; - - protected List allPages; - - protected Deque previousPages = new ArrayDeque<>(); - - protected record NavigationEntry(IFancyUIProvider page, IFancyUIProvider homePage, Runnable onNavigation) {} - - public FancyMachineUIWidget(IFancyUIProvider mainPage, int width, int height) { - super(0, 0, width, height); - this.mainPage = mainPage; - - addWidget(this.pageContainer = new WidgetGroup(0, 0, width, height)); - - if (mainPage.hasPlayerInventory()) { - addWidget(this.playerInventory = new PlayerInventoryWidget()); - this.playerInventory.setSelfPosition(new Position(2, height - 86)); - this.playerInventory.setBackground((IGuiTexture) null); - } else { - playerInventory = null; - } - - addWidget(this.titleBar = new TitleBarWidget(width, this::navigateBack, this::openPageSwitcher)); - addWidget(this.sideTabsWidget = new VerticalTabsWidget(this::navigate, -20, 0, 24, height)); - addWidget(this.tooltipsPanel = new TooltipsPanel()); - addWidget(this.configuratorPanel = new ConfiguratorPanel(-(24 + 2), height)); - this.pageSwitcher = new PageSwitcher(this::switchPage); - - setBackground(GuiTextures.BACKGROUND.copy() - .setColor(Long.decode(ConfigHolder.INSTANCE.client.defaultUIColor).intValue() | 0xFF000000)); - } - - @Override - public void initWidget() { - super.initWidget(); - - if (this.playerInventory != null) { - this.playerInventory.setPlayer(gui.entityPlayer); - } - - this.allPages = Stream.concat(Stream.of(this.mainPage), this.mainPage.getSubTabs().stream()).toList(); - - performNavigation(this.mainPage, this.mainPage); - } - - //////////////////////////////////////// - // ********* NAVIGATION *********// - //////////////////////////////////////// - - protected void navigate(IFancyUIProvider newPage) { - navigate(newPage, this.currentHomePage); - } - - protected void navigate(IFancyUIProvider nextPage, IFancyUIProvider nextHomePage) { - if (nextPage != mainPage) { - if (!this.previousPages.isEmpty() && this.previousPages.peek().page == nextPage) { - // In case the user manually navigates back one step, just remove it from the navigation stack - this.previousPages.pop(); - } else if (this.currentPage != null) { - this.previousPages.push(new NavigationEntry(this.currentPage, this.currentHomePage, () -> {})); - } - } else { - this.previousPages.clear(); - } - - performNavigation(nextPage, nextHomePage); - } - - protected void navigateBack(ClickData clickData) { - NavigationEntry navigationEntry = previousPages.pop(); - - performNavigation(navigationEntry.page, navigationEntry.homePage); - navigationEntry.onNavigation.run(); - } - - protected void performNavigation(IFancyUIProvider nextPage, IFancyUIProvider nextHomePage) { - if (currentHomePage != nextHomePage) - setupSideTabs(nextHomePage); - - this.currentPage = nextPage; - this.currentHomePage = nextHomePage; - - if (currentPage != currentHomePage) { - // Ensure the home page's basic layout is applied before navigating to another page: - setupFancyUI(currentHomePage); - } - - setupFancyUI(nextPage, nextPage.hasPlayerInventory()); - } - - /////////////////////////////////////////////// - // *********** PAGE SWITCHER ***********// - /////////////////////////////////////////////// - - protected void openPageSwitcher(ClickData clickData) { - pageSwitcher.setPageList(allPages, currentHomePage); - - // If we're in another tab of the current page, ensure nav to its main tab when closing the page switcher: - if (currentPage != currentHomePage && !previousPages.isEmpty()) { - previousPages.pop(); - } - - this.sideTabsWidget.setVisible(false); - this.sideTabsWidget.setActive(false); - - this.previousPages.push(new NavigationEntry(currentHomePage, currentHomePage, () -> { - sideTabsWidget.setVisible(true); - sideTabsWidget.setActive(true); - })); - - this.currentPage = this.pageSwitcher; - this.currentHomePage = this.pageSwitcher; - - setupFancyUI(this.pageSwitcher); - } - - protected void switchPage(IFancyUIProvider nextHomePage) { - // Ensure that the back button always leads back to the main page: - this.currentHomePage = mainPage; - this.currentPage = mainPage; - this.previousPages.clear(); - - sideTabsWidget.setVisible(true); - sideTabsWidget.setActive(true); - - setupSideTabs(this.currentHomePage); - navigate(nextHomePage, nextHomePage); - } - - ////////////////////////////////////////////// - // *********** UI RENDERING ***********// - ////////////////////////////////////////////// - - protected void setupFancyUI(IFancyUIProvider fancyUI) { - this.setupFancyUI(fancyUI, fancyUI.hasPlayerInventory()); - } - - protected void setupFancyUI(IFancyUIProvider fancyUI, boolean showInventory) { - clearUI(); - - sideTabsWidget.selectTab(fancyUI); - titleBar.updateState( - fancyUI, - !this.previousPages.isEmpty(), - this.allPages.size() > 1 && this.currentPage != this.pageSwitcher); - - var page = fancyUI.createMainPage(this); - - // layout - var size = new Size(Math.max(172, page.getSize().width + border * 2), - Math.max(86, page.getSize().height + border * 2)); - setSize(new Size(size.width, - size.height + (!showInventory || playerInventory == null ? 0 : playerInventory.getSize().height))); - if (GTCEu.isClientSide() && getGui() != null) { - getGui().setSize(getSize().width, getSize().height); - } - this.sideTabsWidget.setSize(new Size(24, size.height)); - this.pageContainer.setSize(size); - this.tooltipsPanel.setSelfPosition(new Position(size.width + 2, 2)); - - setupInventoryPosition(showInventory, size); - - // setup - this.pageContainer.addWidget(page); - page.setSelfPosition(new Position( - (pageContainer.getSize().width - page.getSize().width) / 2, - (pageContainer.getSize().height - page.getSize().height) / 2)); - fancyUI.attachConfigurators(configuratorPanel); - configuratorPanel - .setSelfPosition(new Position(-24 - 2, getGui().getHeight() - configuratorPanel.getSize().height - 4)); - fancyUI.attachTooltips(tooltipsPanel); - - titleBar.setSize(new Size(this.getSize().width, titleBar.getSize().height)); - } - - private void setupInventoryPosition(boolean showInventory, Size parentSize) { - if (this.playerInventory == null) - return; - - this.playerInventory.setSelfPosition(new Position( - (parentSize.width - playerInventory.getSize().width) / 2, - parentSize.height)); - - this.playerInventory.setActive(showInventory); - this.playerInventory.setVisible(showInventory); - } - - protected void clearUI() { - this.pageContainer.clearAllWidgets(); - this.configuratorPanel.clear(); - this.tooltipsPanel.clear(); - } - - protected void setupSideTabs(IFancyUIProvider currentHomePage) { - this.sideTabsWidget.clearSubTabs(); - currentHomePage.attachSideTabs(sideTabsWidget); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/IFancyConfigurator.java b/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/IFancyConfigurator.java deleted file mode 100644 index c60ff187844..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/IFancyConfigurator.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.fancy; - -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.widget.Widget; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; - -import java.util.List; -import java.util.function.BiConsumer; -import java.util.function.Consumer; - -public interface IFancyConfigurator { - - Component getTitle(); - - IGuiTexture getIcon(); - - Widget createConfigurator(); - - default List getTooltips() { - return List.of(getTitle()); - } - - default void detectAndSendChange(BiConsumer> sender) {} - - default void readUpdateInfo(int id, FriendlyByteBuf buf) {} - - default void writeInitialData(FriendlyByteBuf buffer) {} - - default void readInitialData(FriendlyByteBuf buffer) {} -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/IFancyConfiguratorButton.java b/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/IFancyConfiguratorButton.java deleted file mode 100644 index 0708b49eccc..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/IFancyConfiguratorButton.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.fancy; - -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.util.ClickData; -import com.lowdragmc.lowdraglib.gui.widget.Widget; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; - -import lombok.Setter; -import lombok.experimental.Accessors; -import org.apache.commons.lang3.NotImplementedException; - -import java.util.Collections; -import java.util.List; -import java.util.function.BiConsumer; -import java.util.function.BooleanSupplier; -import java.util.function.Consumer; -import java.util.function.Function; - -public interface IFancyConfiguratorButton extends IFancyConfigurator { - - void onClick(ClickData clickData); - - @Override - default Component getTitle() { - throw new NotImplementedException(); - } - - @Override - default Widget createConfigurator() { - throw new NotImplementedException(); - } - - @Accessors(chain = true) - class Toggle implements IFancyConfiguratorButton { - - IGuiTexture base; - IGuiTexture pressed; - BiConsumer onClick; - BooleanSupplier booleanSupplier; - boolean isPressed; - @Setter - Function> tooltipsSupplier = isPressed -> Collections.emptyList(); - - public Toggle(IGuiTexture base, IGuiTexture pressed, BooleanSupplier booleanSupplier, - BiConsumer onClick) { - this.base = base; - this.pressed = pressed; - this.booleanSupplier = booleanSupplier; - this.onClick = onClick; - } - - @Override - public List getTooltips() { - return tooltipsSupplier.apply(isPressed); - } - - @Override - public void detectAndSendChange(BiConsumer> sender) { - var newIsPressed = booleanSupplier.getAsBoolean(); - if (newIsPressed != isPressed) { - isPressed = newIsPressed; - sender.accept(0, buf -> buf.writeBoolean(isPressed)); - } - } - - @Override - public void readUpdateInfo(int id, FriendlyByteBuf buf) { - if (id == 0) { - isPressed = buf.readBoolean(); - } - } - - @Override - public void writeInitialData(FriendlyByteBuf buffer) { - this.isPressed = booleanSupplier.getAsBoolean(); - buffer.writeBoolean(this.isPressed); - } - - @Override - public void readInitialData(FriendlyByteBuf buffer) { - this.isPressed = buffer.readBoolean(); - } - - @Override - public IGuiTexture getIcon() { - return isPressed ? pressed : base; - } - - @Override - public void onClick(ClickData clickData) { - onClick.accept(clickData, !isPressed); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/IFancyCustomClientActionHandler.java b/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/IFancyCustomClientActionHandler.java deleted file mode 100644 index f9b354cf1f9..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/IFancyCustomClientActionHandler.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.fancy; - -import net.minecraft.network.FriendlyByteBuf; - -public interface IFancyCustomClientActionHandler { - - default void handleClientAction(int id, FriendlyByteBuf buffer) {} -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/IFancyCustomMiddleClickAction.java b/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/IFancyCustomMiddleClickAction.java deleted file mode 100644 index 489f6e091f8..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/IFancyCustomMiddleClickAction.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.fancy; - -import net.minecraft.network.FriendlyByteBuf; - -import java.util.function.BiConsumer; -import java.util.function.Consumer; - -public interface IFancyCustomMiddleClickAction extends IFancyCustomClientActionHandler { - - default void onMiddleClick(BiConsumer> writeClientAction) {} -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/IFancyCustomMouseWheelAction.java b/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/IFancyCustomMouseWheelAction.java deleted file mode 100644 index fb5213912a9..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/IFancyCustomMouseWheelAction.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.fancy; - -import net.minecraft.network.FriendlyByteBuf; - -import java.util.function.BiConsumer; -import java.util.function.Consumer; - -public interface IFancyCustomMouseWheelAction extends IFancyCustomClientActionHandler { - - default boolean mouseWheelMove(BiConsumer> writeClientAction, double mouseX, - double mouseY, double wheelDelta) { - return false; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/IFancyTooltip.java b/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/IFancyTooltip.java deleted file mode 100644 index a0af005a9cf..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/IFancyTooltip.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.fancy; - -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; - -import net.minecraft.network.chat.Component; -import net.minecraft.world.inventory.tooltip.TooltipComponent; - -import org.jetbrains.annotations.Nullable; - -import java.util.List; -import java.util.function.BooleanSupplier; -import java.util.function.Supplier; - -public interface IFancyTooltip { - - IGuiTexture getFancyTooltipIcon(); - - List getFancyTooltip(); - - default boolean showFancyTooltip() { - return true; - } - - @Nullable - default TooltipComponent getFancyComponent() { - return null; - } - - record Basic(Supplier icon, Supplier> content, BooleanSupplier predicate, - Supplier componentSupplier) - implements IFancyTooltip { - - @Override - public IGuiTexture getFancyTooltipIcon() { - return icon.get(); - } - - @Override - public List getFancyTooltip() { - return content.get(); - } - - @Override - public @Nullable TooltipComponent getFancyComponent() { - return componentSupplier.get(); - } - - @Override - public boolean showFancyTooltip() { - return predicate.getAsBoolean(); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/IFancyUIProvider.java b/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/IFancyUIProvider.java deleted file mode 100644 index b5d878fcdc5..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/IFancyUIProvider.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.fancy; - -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.widget.Widget; - -import net.minecraft.network.chat.Component; -import net.minecraft.world.inventory.tooltip.TooltipComponent; - -import org.jetbrains.annotations.Nullable; - -import java.util.Collections; -import java.util.List; - -public interface IFancyUIProvider { - - /** - * Create the main page ui. - */ - Widget createMainPage(FancyMachineUIWidget widget); - - /** - * Get the tab icon of this page. - */ - IGuiTexture getTabIcon(); - - /** - * Get the title of this page. - */ - Component getTitle(); - - /** - * Attach configurators to the left subtab list. - */ - default void attachSideTabs(TabsWidget configuratorPanel) {} - - /** - * Attach configurators to the left panel. - */ - default void attachConfigurators(ConfiguratorPanel configuratorPanel) {} - - /** - * Attach tooltips to the right panel - */ - default void attachTooltips(TooltipsPanel tooltipsPanel) {} - - default boolean hasPlayerInventory() { - return true; - } - - /** - * Get sub tabs, for example, multiblock will show all its parts tabs. - */ - default List getSubTabs() { - return Collections.emptyList(); - } - - /** - * Get tab's Tooltips - */ - default List getTabTooltips() { - return Collections.emptyList(); - } - - /** - * Get tab's Tooltips Component - */ - @Nullable - default TooltipComponent getTabTooltipComponent() { - return null; - } - - @Nullable - default PageGroupingData getPageGroupingData() { - return null; - } - - record PageGroupingData(@Nullable String groupKey, int groupPositionWeight) {} -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/PageSwitcher.java b/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/PageSwitcher.java deleted file mode 100644 index 20c76d3945d..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/PageSwitcher.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.fancy; - -import com.gregtechceu.gtceu.api.gui.GuiTextures; - -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.texture.TextTexture; -import com.lowdragmc.lowdraglib.gui.widget.*; - -import net.minecraft.ChatFormatting; -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.network.chat.Component; - -import org.apache.commons.lang3.mutable.MutableInt; - -import java.util.Comparator; -import java.util.List; -import java.util.Objects; -import java.util.function.Consumer; -import java.util.stream.Collectors; - -import javax.annotation.ParametersAreNonnullByDefault; - -@MethodsReturnNonnullByDefault -@ParametersAreNonnullByDefault -public class PageSwitcher implements IFancyUIProvider { - - private final Consumer onPageSwitched; - - private List pages = List.of(); - private IFancyUIProvider currentPage = null; - - public PageSwitcher(Consumer onPageSwitched) { - this.onPageSwitched = onPageSwitched; - } - - public void setPageList(List allPages, IFancyUIProvider currentPage) { - this.pages = allPages; - this.currentPage = currentPage; - } - - @Override - public Widget createMainPage(FancyMachineUIWidget widget) { - var container = new WidgetGroup(0, 0, 176, 166); - - var scrollableGroup = new DraggableScrollableWidgetGroup(10, 10, 156, 146); - scrollableGroup.setYScrollBarWidth(8); - scrollableGroup.setYBarStyle(GuiTextures.SLIDER_BACKGROUND_VERTICAL, GuiTextures.BUTTON); - container.addWidget(scrollableGroup); - - var groupedPages = pages.stream().collect(Collectors.groupingBy( - page -> Objects.requireNonNullElse(page.getPageGroupingData(), new PageGroupingData(null, -1)))); - - final MutableInt currentY = new MutableInt(0); - groupedPages.keySet().stream() - .sorted(Comparator.comparingInt(PageGroupingData::groupPositionWeight)) - .forEachOrdered(group -> { - if (group.groupKey() != null) { - scrollableGroup.addWidget( - new LabelWidget(0, currentY.getAndAdd(12), group.groupKey()).setDropShadow(false)); - } - - final var currentPage = new MutableInt(0); - currentY.subtract(30); // To account for adding it back on the first page inside this group - - groupedPages.get(group).forEach(page -> { - var index = currentPage.getAndIncrement(); - var y = currentY.addAndGet(index % 5 == 0 ? 30 : 0); // Jump to the next row every 5 parts - - var pageWidget = new WidgetGroup((index % 5) * 30, y, 25, 25); - pageWidget.addWidget(new ButtonWidget(0, 0, 25, 25, GuiTextures.BACKGROUND, - clickData -> onPageSwitched.accept(page))); - pageWidget.addWidget(new ImageWidget(4, 4, 17, 17, page.getTabIcon())); - // For some reason, this doesn't work in any other way: - pageWidget.widgets.get(0).setHoverTooltips(page.getTitle().getString()); - scrollableGroup.addWidget(pageWidget); - }); - - if (!groupedPages.get(group).isEmpty()) { - currentY.add(30); - } - }); - - return container; - } - - @Override - public IGuiTexture getTabIcon() { - return new TextTexture("+").setDropShadow(false).setColor(ChatFormatting.BLACK.getColor()); - } - - @Override - public Component getTitle() { - return Component.translatable("gtceu.gui.title_bar.page_switcher"); - } - - @Override - public boolean hasPlayerInventory() { - return false; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/TabsWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/TabsWidget.java deleted file mode 100644 index e30d94a8280..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/TabsWidget.java +++ /dev/null @@ -1,261 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.fancy; - -import com.gregtechceu.gtceu.api.gui.GuiTextures; - -import com.lowdragmc.lowdraglib.gui.editor.Icons; -import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; -import com.lowdragmc.lowdraglib.gui.widget.Widget; - -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.util.Mth; -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -import lombok.Getter; -import lombok.Setter; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.BiConsumer; -import java.util.function.Consumer; - -@Getter -public class TabsWidget extends Widget { - - protected final Consumer onTabClick; - protected IFancyUIProvider mainTab; - protected List subTabs; - @Nullable - protected IFancyUIProvider selectedTab; - @Setter - protected IGuiTexture leftButtonTexture = new GuiTextureGroup(GuiTextures.BUTTON, Icons.LEFT.copy().scale(0.7f)), - leftButtonHoverTexture = new GuiTextureGroup(GuiTextures.BUTTON, - Icons.LEFT.copy().setColor(0xffaaaaaa).scale(0.7f)); - @Setter - protected IGuiTexture rightButtonTexture = new GuiTextureGroup(GuiTextures.BUTTON, Icons.RIGHT.copy().scale(0.7f)), - rightButtonHoverTexture = new GuiTextureGroup(GuiTextures.BUTTON, - Icons.RIGHT.copy().setColor(0xffaaaaaa).scale(0.7f)); - @Setter - protected IGuiTexture tabTexture = new ResourceTexture("gtceu:textures/gui/tab/tabs_top.png").getSubTexture(1 / 3f, - 0, 1 / 3f, 0.5f); - @Setter - protected IGuiTexture tabHoverTexture = new ResourceTexture("gtceu:textures/gui/tab/tabs_top.png") - .getSubTexture(1 / 3f, 0.5f, 1 / 3f, 0.5f); - @Setter - protected IGuiTexture tabPressedTexture = tabHoverTexture; - @Getter - protected int offset; - /** - * (old tab, new tab) - */ - @Setter - @Nullable - protected BiConsumer onTabSwitch; - - public TabsWidget(Consumer onTabClick) { - this(onTabClick, 0, -20, 200, 24); - } - - public TabsWidget(Consumer onTabClick, int x, int y, int width, int height) { - super(x, y, width, height); - this.subTabs = new ArrayList<>(); - this.onTabClick = onTabClick; - } - - public void setMainTab(IFancyUIProvider mainTab) { - this.mainTab = mainTab; - if (this.selectedTab == null) { - this.selectedTab = this.mainTab; - } - } - - public void clearSubTabs() { - subTabs.clear(); - } - - public void attachSubTab(IFancyUIProvider subTab) { - subTabs.add(subTab); - } - - public boolean hasButton() { - return (subTabs.size() + 1) * 24 + 16 > getSize().width; - } - - @Override - public void handleClientAction(int id, FriendlyByteBuf buffer) { - super.handleClientAction(id, buffer); - if (id == 0) { - var index = buffer.readVarInt(); - var old = selectedTab; - if (index < 0) { - selectedTab = mainTab; - } else if (index < subTabs.size()) { - selectedTab = subTabs.get(index); - } else { - return; - } - if (onTabSwitch != null) { - onTabSwitch.accept(old, selectedTab); - } - onTabClick.accept(selectedTab); - } - } - - public int getSubTabsWidth() { - return getSize().width - 8 - 24 - 4 - 16 - 8 - 16; - } - - @Override - @OnlyIn(Dist.CLIENT) - public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (isMouseOverElement(mouseX, mouseY)) { - var hoveredTab = getHoveredTab(mouseX, mouseY); - // click tab - if (hoveredTab != null && hoveredTab != selectedTab) { - if (onTabSwitch != null) { - onTabSwitch.accept(selectedTab, hoveredTab); - } - selectedTab = hoveredTab; - writeClientAction(0, - buf -> buf.writeVarInt(selectedTab == mainTab ? -1 : subTabs.indexOf(selectedTab))); - onTabClick.accept(selectedTab); - playButtonClickSound(); - } - // click button - if (hasButton()) { - if (isHoverLeftButton(mouseX, mouseY)) { - offset = Mth.clamp(offset - 24, 0, subTabs.size() * 24 - getSubTabsWidth()); - playButtonClickSound(); - } else if (isHoverRightButton(mouseX, mouseY)) { - offset = Mth.clamp(offset + 24, 0, subTabs.size() * 24 - getSubTabsWidth()); - playButtonClickSound(); - } - } - } - return super.mouseClicked(mouseX, mouseY, button); - } - - @Override - @OnlyIn(Dist.CLIENT) - public boolean mouseWheelMove(double mouseX, double mouseY, double wheelDelta) { - var sx = getPosition().x + 8 + 24 + 4 + 16; - if (isMouseOver(sx, getPosition().y, getSubTabsWidth(), 24, mouseX, mouseY)) { - offset = Mth.clamp(offset + 5 * (wheelDelta > 0 ? -1 : 1), 0, subTabs.size() * 24 - getSubTabsWidth()); - } - return super.mouseWheelMove(mouseX, mouseY, wheelDelta); - } - - @Override - @OnlyIn(Dist.CLIENT) - public void drawInBackground(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - super.drawInBackground(graphics, mouseX, mouseY, partialTicks); - var position = getPosition(); - var size = getSize(); - var hoveredTab = getHoveredTab(mouseX, mouseY); - // main tab - drawTab(mainTab, graphics, mouseX, mouseY, position.x + 8, position.y, 24, 24, hoveredTab); - // render sub tabs - if (hasButton()) { // need a scrollable bar - // render buttons - if (isHoverLeftButton(mouseX, mouseY)) { - leftButtonHoverTexture.draw(graphics, mouseX, mouseY, position.x + 8 + 24 + 4, position.y, 16, 24); - } else { - leftButtonTexture.draw(graphics, mouseX, mouseY, position.x + 8 + 24 + 4, position.y, 16, 24); - } - if (isHoverRightButton(mouseX, mouseY)) { - rightButtonHoverTexture.draw(graphics, mouseX, mouseY, position.x + size.width - 8 - 16, position.y, 16, - 24); - } else { - rightButtonTexture.draw(graphics, mouseX, mouseY, position.x + size.width - 8 - 16, position.y, 16, 24); - } - // render sub tabs - var sx = position.x + 8 + 24 + 4 + 16; - graphics.enableScissor(sx, position.y - 1, sx + getSubTabsWidth(), position.y - 1 + 24 + 2); - for (int i = 0; i < subTabs.size(); i++) { - drawTab(subTabs.get(i), graphics, mouseX, mouseY, sx + i * 24 - offset, position.y, 24, 24, hoveredTab); - } - graphics.disableScissor(); - } else { - for (int i = subTabs.size() - 1; i >= 0; i--) { - drawTab(subTabs.get(i), graphics, mouseX, mouseY, - position.x + size.width - 8 - 24 * (subTabs.size() - i), position.y, 24, 24, hoveredTab); - } - } - } - - @Override - @OnlyIn(Dist.CLIENT) - public void drawInForeground(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - var hoveredTab = getHoveredTab(mouseX, mouseY); - if (hoveredTab != null && gui != null && gui.getModularUIGui() != null) { - gui.getModularUIGui().setHoverTooltip(hoveredTab.getTabTooltips(), ItemStack.EMPTY, null, - hoveredTab.getTabTooltipComponent()); - } - super.drawInForeground(graphics, mouseX, mouseY, partialTicks); - } - - @OnlyIn(Dist.CLIENT) - public boolean isHoverLeftButton(double mouseX, double mouseY) { - return isMouseOver(getPosition().x + 8 + 24 + 4, getPosition().y, 16, 24, mouseX, mouseY); - } - - @OnlyIn(Dist.CLIENT) - public boolean isHoverRightButton(double mouseX, double mouseY) { - return isMouseOver(getPosition().x + getSize().width - 8 - 16, getPosition().y, 16, 24, mouseX, mouseY); - } - - @OnlyIn(Dist.CLIENT) - @Nullable - public IFancyUIProvider getHoveredTab(double mouseX, double mouseY) { - if (isMouseOverElement(mouseX, mouseY)) { - var position = getPosition(); - var size = getSize(); - // main tab - if (isMouseOver(position.x + 8, position.y, 24, 24, mouseX, mouseY)) { - return mainTab; - } - // others - if (hasButton()) { // need a scrollable bar - var sx = position.x + 8 + 24 + 4 + 16; - if (isMouseOver(sx, position.y, getSubTabsWidth(), 24, mouseX, mouseY)) { - var i = ((int) mouseX - sx + getOffset()) / 24; - if (i < subTabs.size()) { - return subTabs.get(i); - } - } - } else { - int i = (position.x + size.width - 8 - (int) mouseX) / 24; - if (i < subTabs.size()) { - return subTabs.get(subTabs.size() - 1 - i); - } - } - } - return null; - } - - @OnlyIn(Dist.CLIENT) - public void drawTab(IFancyUIProvider tab, @NotNull GuiGraphics graphics, int mouseX, int mouseY, int x, int y, - int width, int height, IFancyUIProvider hoveredTab) { - // render background - if (tab == selectedTab) { - tabPressedTexture.draw(graphics, mouseX, mouseY, x, y, width, height); - } else if (tab == hoveredTab) { - tabHoverTexture.draw(graphics, mouseX, mouseY, x, y, width, height); - } else { - tabTexture.draw(graphics, mouseX, mouseY, x, y, width, height); - } - // render icon - tab.getTabIcon().draw(graphics, mouseX, mouseY, x + (width - 16) / 2f, y + (height - 16) / 2f, 16, 16); - } - - public void selectTab(IFancyUIProvider selectedTab) { - this.selectedTab = selectedTab; - this.detectAndSendChanges(); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/TitleBarWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/TitleBarWidget.java deleted file mode 100644 index b40d56fc467..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/TitleBarWidget.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.fancy; - -import com.gregtechceu.gtceu.api.gui.GuiTextures; - -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.texture.TextTexture; -import com.lowdragmc.lowdraglib.gui.util.ClickData; -import com.lowdragmc.lowdraglib.gui.widget.ButtonWidget; -import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.utils.Position; -import com.lowdragmc.lowdraglib.utils.Size; - -import net.minecraft.ChatFormatting; -import net.minecraft.MethodsReturnNonnullByDefault; - -import java.util.function.Consumer; - -import javax.annotation.ParametersAreNonnullByDefault; - -@MethodsReturnNonnullByDefault -@ParametersAreNonnullByDefault -public class TitleBarWidget extends WidgetGroup { - - private static final int BORDER_WIDTH = 3; - private static final int HORIZONTAL_MARGIN = 8; - private static final int HEIGHT = 16; - private static final int BTN_WIDTH = 18; - - private static final float ROLL_SPEED = 0.7f; - - private int width; - private boolean showBackButton = false; - private boolean showMenuButton = false; - private final int innerHeight; - - /** - * The button group is rendered behind the main section and contains the back and menu buttons. - *

- * For easier texture reuse, the background is applied to the group itself, instead of the individual buttons.
- * The button group therefore needs to be rendered behind the main section. - */ - private final WidgetGroup buttonGroup; - private final Widget backButton; - private final Widget menuButton; - - /** - * The main section contains the current tab's icon and title text - */ - private final WidgetGroup mainSection; - private final ImageWidget tabIcon; - private final ImageWidget tabTitle; - private TextTexture titleText; - - public TitleBarWidget(int parentWidth, Consumer onBackClicked, Consumer onMenuClicked) { - super(HORIZONTAL_MARGIN, -HEIGHT, parentWidth, HEIGHT); - this.innerHeight = HEIGHT - BORDER_WIDTH; - this.width = parentWidth - (2 * HORIZONTAL_MARGIN); - - addWidget(this.buttonGroup = new WidgetGroup(0, BORDER_WIDTH, width, innerHeight)); - buttonGroup.setBackground(GuiTextures.TITLE_BAR_BACKGROUND); - buttonGroup.addWidget(this.backButton = new ButtonWidget(0, BORDER_WIDTH, BTN_WIDTH, HEIGHT - BORDER_WIDTH, - new TextTexture(" <").setDropShadow(false).setColor(ChatFormatting.BLACK.getColor()), onBackClicked) - .setHoverTooltips("gtceu.gui.title_bar.back")); - buttonGroup.addWidget(this.menuButton = new ButtonWidget(width - BTN_WIDTH, BORDER_WIDTH, BTN_WIDTH, - HEIGHT - BORDER_WIDTH, - new TextTexture("+").setDropShadow(false).setColor(ChatFormatting.BLACK.getColor()), onMenuClicked) - .setHoverTooltips("gtceu.gui.title_bar.page_switcher")); - - addWidget(this.mainSection = new WidgetGroup(BTN_WIDTH, 0, width, HEIGHT)); - mainSection.setBackground(GuiTextures.TITLE_BAR_BACKGROUND); - mainSection.addWidget(this.tabIcon = new ImageWidget( - BORDER_WIDTH + 1, BORDER_WIDTH + 1, - innerHeight - 2, innerHeight - 2, - IGuiTexture.EMPTY)); - mainSection.addWidget(this.tabTitle = new ImageWidget( - BORDER_WIDTH + innerHeight, BORDER_WIDTH, 0, 0, IGuiTexture.EMPTY)); - } - - public void updateState(IFancyUIProvider currentPage, boolean showBackButton, boolean showMenuButton) { - this.showBackButton = showBackButton; - this.showMenuButton = showMenuButton; - - titleText = new TextTexture(ChatFormatting.BLACK.toString() + currentPage.getTitle().copy().getString()) - .setDropShadow(false) - .setType(TextTexture.TextType.ROLL); - titleText.setRollSpeed(ROLL_SPEED); - - tabIcon.setImage(currentPage.getTabIcon()); - tabTitle.setImage(titleText); - - backButton.setVisible(showBackButton); - backButton.setActive(showBackButton); - - menuButton.setVisible(showMenuButton); - menuButton.setActive(showMenuButton); - - onSizeUpdate(); - } - - @Override - protected void onSizeUpdate() { - this.width = getSize().getWidth() - (2 * HORIZONTAL_MARGIN); - - var hiddenButtons = 2; - if (showBackButton) hiddenButtons--; - if (showMenuButton) hiddenButtons--; - - int buttonGroupWidth = this.width - (BTN_WIDTH * hiddenButtons); - buttonGroup.setSize(new Size(buttonGroupWidth, innerHeight)); - buttonGroup.setSelfPosition(new Position(showBackButton ? 0 : BTN_WIDTH, BORDER_WIDTH)); - menuButton.setSelfPosition(new Position(buttonGroupWidth - BTN_WIDTH, BORDER_WIDTH)); - - int mainSectionWidth = this.width - (BTN_WIDTH * 2); - int titleWidth = mainSectionWidth - (2 * BORDER_WIDTH) - innerHeight; - mainSection.setSize(new Size(mainSectionWidth, HEIGHT)); - titleText.setWidth(titleWidth); - tabTitle.setSize(new Size(titleWidth, HEIGHT - BORDER_WIDTH)); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/TooltipsPanel.java b/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/TooltipsPanel.java deleted file mode 100644 index 5e5e01d7975..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/TooltipsPanel.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.fancy; - -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.utils.Size; - -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -import lombok.Getter; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class TooltipsPanel extends Widget { - - @Getter - protected List tooltips = new ArrayList<>(); - - public TooltipsPanel() { - super(202, 2, 20, 0); - } - - public void clear() { - tooltips.clear(); - } - - public void attachTooltips(IFancyTooltip... tooltips) { - this.tooltips.addAll(Arrays.asList(tooltips)); - } - - @Override - @OnlyIn(Dist.CLIENT) - public void drawInBackground(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - super.drawInBackground(graphics, mouseX, mouseY, partialTicks); - var position = getPosition(); - var size = getSize(); - int offsetY = 0; - for (IFancyTooltip tooltip : this.tooltips) { - if (tooltip.showFancyTooltip()) { - // draw icon - tooltip.getFancyTooltipIcon().draw(graphics, mouseX, mouseY, position.x, position.y + offsetY, - size.width, size.width); - offsetY += size.getWidth() + 2; - } - } - setSize(new Size(getSize().width, Math.max(0, offsetY))); - } - - @Override - @OnlyIn(Dist.CLIENT) - public void drawInForeground(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - if (getHoverElement(mouseX, mouseY) == this && gui != null && gui.getModularUIGui() != null) { - var position = getPosition(); - var size = getSize(); - int offsetY = 0; - for (IFancyTooltip tooltip : this.tooltips) { - if (tooltip.showFancyTooltip()) { - if (isMouseOver(position.x, position.y + offsetY, size.width, size.width, mouseX, mouseY)) { - gui.getModularUIGui().setHoverTooltip(tooltip.getFancyTooltip(), ItemStack.EMPTY, null, - tooltip.getFancyComponent()); - return; - } - offsetY += size.getWidth() + 2; - } - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/VerticalTabsWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/VerticalTabsWidget.java deleted file mode 100644 index 0fe2fc77f5f..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/fancy/VerticalTabsWidget.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.fancy; - -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; - -import net.minecraft.client.gui.GuiGraphics; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.function.Consumer; - -public class VerticalTabsWidget extends TabsWidget { - - public VerticalTabsWidget(Consumer onTabClick, int x, int y, int width, int height) { - super(onTabClick, x, y, width, height); - ResourceTexture tabsLeft = new ResourceTexture("gtceu:textures/gui/tab/tabs_left.png"); - setTabTexture(tabsLeft.getSubTexture(0, 1 / 3f, 0.5f, 1 / 3f)); - setTabHoverTexture(tabsLeft.getSubTexture(0.5f, 1 / 3f, 0.5f, 1 / 3f)); - setTabPressedTexture(tabsLeft.getSubTexture(0.5f, 1 / 3f, 0.5f, 1 / 3f)); - } - - @Override - public boolean hasButton() { - return false; - } - - @Override - @OnlyIn(Dist.CLIENT) - public void drawInBackground(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - drawBackgroundTexture(graphics, mouseX, mouseY); - var position = getPosition(); - var size = getSize(); - var hoveredTab = getHoveredTab(mouseX, mouseY); - // main tab - drawTab(mainTab, graphics, mouseX, mouseY, position.x, position.y + 8, 24, 24, hoveredTab); - for (int i = 0; i < subTabs.size(); ++i) { - drawTab(subTabs.get(i), graphics, mouseX, mouseY, position.x, position.y + 8 + 24 * (i + 1), 24, 24, - hoveredTab); - } - } - - @OnlyIn(Dist.CLIENT) - @Nullable - public IFancyUIProvider getHoveredTab(double mouseX, double mouseY) { - if (isMouseOverElement(mouseX, mouseY)) { - var position = getPosition(); - var size = getSize(); - // main tab - if (isMouseOver(position.x, position.y + 8, 24, 24, mouseX, mouseY)) { - return mainTab; - } - // others - int i = ((int) mouseY - position.y - 24 - 8) / 24; - if (i >= 0 && i < subTabs.size()) { - return subTabs.get(i); - } - } - return null; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/IGhostFluidTarget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/misc/IGhostFluidTarget.java deleted file mode 100644 index 3324b34e811..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/IGhostFluidTarget.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.misc; - -import com.gregtechceu.gtceu.GTCEu; - -import com.lowdragmc.lowdraglib.gui.ingredient.IGhostIngredientTarget; -import com.lowdragmc.lowdraglib.gui.ingredient.Target; - -import net.minecraft.client.renderer.Rect2i; -import net.minecraft.world.level.material.Fluid; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.fluids.FluidStack; - -import com.google.common.collect.Lists; -import dev.emi.emi.api.stack.EmiStack; -import org.jetbrains.annotations.NotNull; - -import java.util.Collections; -import java.util.List; - -import static com.gregtechceu.gtceu.api.gui.widget.PhantomFluidWidget.drainFrom; - -public interface IGhostFluidTarget extends IGhostIngredientTarget { - - @OnlyIn(Dist.CLIENT) - Rect2i getRectangleBox(); - - @OnlyIn(Dist.CLIENT) - void acceptFluid(FluidStack fluidStack); - - @OnlyIn(Dist.CLIENT) - @Override - default List getPhantomTargets(Object ingredient) { - ingredient = convertIngredient(ingredient); - if (!(ingredient instanceof FluidStack) && drainFrom(ingredient) == null) { - return Collections.emptyList(); - } else { - final Rect2i rectangle = getRectangleBox(); - return Lists.newArrayList(new Target[] { new Target() { - - @NotNull - public Rect2i getArea() { - return rectangle; - } - - public void accept(@NotNull Object ingredient) { - ingredient = convertIngredient(ingredient); - - FluidStack ingredientStack; - if (ingredient instanceof FluidStack fluidStack) { - ingredientStack = fluidStack; - } else { - ingredientStack = drainFrom(ingredient); - } - - if (ingredientStack != null) { - acceptFluid(ingredientStack); - } - } - } }); - } - } - - default Object convertIngredient(Object ingredient) { - if (GTCEu.Mods.isREILoaded() && ingredient instanceof dev.architectury.fluid.FluidStack fluidStack) { - ingredient = new FluidStack(fluidStack.getFluid(), (int) fluidStack.getAmount(), fluidStack.getTag()); - } - - if (GTCEu.Mods.isEMILoaded() && ingredient instanceof EmiStack fluidEmiStack) { - Fluid fluid = fluidEmiStack.getKeyOfType(Fluid.class); - ingredient = fluid == null ? FluidStack.EMPTY : - new FluidStack(fluid, (int) fluidEmiStack.getAmount(), fluidEmiStack.getNbt()); - } - - if (GTCEu.Mods.isJEILoaded() && ingredient instanceof net.minecraftforge.fluids.FluidStack fluidStack) { - ingredient = new FluidStack(fluidStack.getFluid(), fluidStack.getAmount(), fluidStack.getTag()); - } - return ingredient; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/IGhostItemTarget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/misc/IGhostItemTarget.java deleted file mode 100644 index e26f1e30520..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/IGhostItemTarget.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.misc; - -import com.gregtechceu.gtceu.GTCEu; - -import com.lowdragmc.lowdraglib.gui.ingredient.IGhostIngredientTarget; -import com.lowdragmc.lowdraglib.gui.ingredient.Target; - -import net.minecraft.client.renderer.Rect2i; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -import com.google.common.collect.Lists; -import dev.emi.emi.api.stack.EmiStack; -import mezz.jei.api.ingredients.ITypedIngredient; -import org.jetbrains.annotations.NotNull; - -import java.util.Collections; -import java.util.List; - -public interface IGhostItemTarget extends IGhostIngredientTarget { - - @OnlyIn(Dist.CLIENT) - Rect2i getRectangleBox(); - - @OnlyIn(Dist.CLIENT) - void acceptItem(ItemStack itemStack); - - @OnlyIn(Dist.CLIENT) - @Override - default List getPhantomTargets(Object ingredient) { - if (!(convertIngredient(ingredient) instanceof ItemStack)) { - return Collections.emptyList(); - } else { - final Rect2i rectangle = getRectangleBox(); - return Lists.newArrayList(new Target[] { new Target() { - - @NotNull - public Rect2i getArea() { - return rectangle; - } - - public void accept(@NotNull Object ingredient) { - ingredient = convertIngredient(ingredient); - - if (ingredient instanceof ItemStack stack) { - acceptItem(stack); - } - } - } }); - } - } - - default Object convertIngredient(Object ingredient) { - if (GTCEu.Mods.isEMILoaded() && ingredient instanceof EmiStack itemEmiStack) { - Item item = itemEmiStack.getKeyOfType(Item.class); - ItemStack itemStack = item == null ? ItemStack.EMPTY : new ItemStack(item, (int) itemEmiStack.getAmount()); - if (!itemStack.isEmpty()) { - itemStack.setTag(itemEmiStack.getNbt()); - } - ingredient = itemStack; - } - - if (GTCEu.Mods.isJEILoaded() && ingredient instanceof ITypedIngredient itemJeiStack) { - return itemJeiStack.getItemStack().orElse(ItemStack.EMPTY); - } - return ingredient; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/PacketProspecting.java b/src/main/java/com/gregtechceu/gtceu/api/gui/misc/PacketProspecting.java deleted file mode 100644 index 6aad5dff961..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/PacketProspecting.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.misc; - -import net.minecraft.network.FriendlyByteBuf; - -import java.lang.reflect.Array; - -public class PacketProspecting { - - public int chunkX; - public int chunkZ; - public ProspectorMode mode; - public Object[][][] data; - - public PacketProspecting(int chunkX, int chunkZ, ProspectorMode mode) { - this.chunkX = chunkX; - this.chunkZ = chunkZ; - this.mode = mode; - this.data = (Object[][][]) Array.newInstance(mode.getItemClass(), this.mode.cellSize, this.mode.cellSize, 0); - } - - public static PacketProspecting readPacketData(ProspectorMode mode, FriendlyByteBuf buffer) { - PacketProspecting packet = new PacketProspecting(buffer.readVarInt(), buffer.readVarInt(), mode); - for (int x = 0; x < mode.cellSize; x++) { - for (int z = 0; z < mode.cellSize; z++) { - packet.data[x][z] = (Object[]) Array.newInstance(mode.getItemClass(), buffer.readVarInt()); - for (int i = 0; i < packet.data[x][z].length; i++) { - packet.data[x][z][i] = mode.deserialize(buffer); - } - } - } - return packet; - } - - public void writePacketData(FriendlyByteBuf buffer) { - buffer.writeVarInt(chunkX); - buffer.writeVarInt(chunkZ); - for (int x = 0; x < mode.cellSize; x++) { - for (int z = 0; z < mode.cellSize; z++) { - buffer.writeVarInt(data[x][z].length); - for (var item : data[x][z]) { - mode.serialize(item, buffer); - } - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/texture/ProspectingTexture.java b/src/main/java/com/gregtechceu/gtceu/api/gui/texture/ProspectingTexture.java deleted file mode 100644 index f987592eee7..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/texture/ProspectingTexture.java +++ /dev/null @@ -1,209 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.texture; - -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.misc.PacketProspecting; -import com.gregtechceu.gtceu.api.gui.misc.ProspectorMode; - -import com.lowdragmc.lowdraglib.gui.editor.ColorPattern; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; -import com.lowdragmc.lowdraglib.gui.texture.TransformTexture; -import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; -import com.lowdragmc.lowdraglib.utils.ColorUtils; - -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.client.renderer.texture.AbstractTexture; -import net.minecraft.server.packs.resources.ResourceManager; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -import com.mojang.blaze3d.platform.NativeImage; -import com.mojang.blaze3d.platform.TextureUtil; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.Tesselator; -import com.mojang.blaze3d.vertex.VertexFormat; -import lombok.Getter; -import org.joml.Matrix4f; - -import java.io.IOException; -import java.lang.reflect.Array; - -import javax.annotation.ParametersAreNonnullByDefault; - -import static com.mojang.blaze3d.vertex.DefaultVertexFormat.POSITION_TEX_COLOR; - -@SuppressWarnings({ "rawtypes", "unchecked" }) -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -@OnlyIn(Dist.CLIENT) -public class ProspectingTexture extends AbstractTexture { - - public static final String SELECTED_ALL = "[all]"; - private static final ResourceTexture ARROW = GuiTextures.UP.copy().setColor(ColorPattern.RED.color); - - @Getter - private String selected = SELECTED_ALL; - private boolean darkMode; - @Getter - private final int imageWidth; - @Getter - private final int imageHeight; - public final Object[][][] data; - private final int playerXGui; - private final int playerYGui; - private final float direction; - private final int playerChunkX; - private final int playerChunkZ; - private final ProspectorMode mode; - private final int radius; - - public ProspectingTexture(int playerChunkX, int playerChunkZ, int posX, int posZ, float direction, - ProspectorMode mode, int radius, boolean darkMode) { - this.darkMode = darkMode; - this.radius = radius; - this.mode = mode; - this.data = (Object[][][]) Array.newInstance(mode.getItemClass(), (radius * 2 - 1) * mode.cellSize, - (radius * 2 - 1) * mode.cellSize, 0); - this.imageWidth = (radius * 2 - 1) * 16; - this.imageHeight = (radius * 2 - 1) * 16; - this.playerChunkX = playerChunkX; - this.playerChunkZ = playerChunkZ; - this.direction = (direction + 180) % 360; - this.playerXGui = posX - (playerChunkX - this.radius + 1) * 16 + (posX > 0 ? 1 : 0); - playerYGui = posZ - (playerChunkZ - this.radius + 1) * 16 + (posX > 0 ? 1 : 0); - } - - public void updateTexture(PacketProspecting packet) { - int ox; - if ((packet.chunkX > 0 && playerChunkX > 0) || (packet.chunkX < 0 && playerChunkX < 0)) { - ox = Math.abs(Math.abs(packet.chunkX) - Math.abs(playerChunkX)); - } else { - ox = Math.abs(playerChunkX) + Math.abs(packet.chunkX); - } - if (playerChunkX > packet.chunkX) { - ox = -ox; - } - - int oy; - if ((packet.chunkZ > 0 && playerChunkZ > 0) || (packet.chunkZ < 0 && playerChunkZ < 0)) { - oy = Math.abs(Math.abs(packet.chunkZ) - Math.abs(playerChunkZ)); - } else { - oy = Math.abs(playerChunkZ) + Math.abs(packet.chunkZ); - } - if (playerChunkZ > packet.chunkZ) { - oy = -oy; - } - - int currentColumn = (this.radius - 1) + ox; - int currentRow = (this.radius - 1) + oy; - if (currentRow < 0) { - return; - } - - for (int x = 0; x < mode.cellSize; x++) { - System.arraycopy(packet.data[x], 0, data[x + currentColumn * mode.cellSize], currentRow * mode.cellSize, - mode.cellSize); - } - load(); - } - - private NativeImage getImage() { - int wh = (this.radius * 2 - 1) * 16; - NativeImage image = new NativeImage(wh, wh, false); - for (int i = 0; i < wh; i++) { - for (int j = 0; j < wh; j++) { - Object[] items = this.data[i * mode.cellSize / 16][j * mode.cellSize / 16]; - // draw bg - image.setPixelRGBA(i, j, (darkMode ? ColorPattern.GRAY.color : ColorPattern.WHITE.color)); - // draw items - for (Object item : items) { - if (!selected.equals(SELECTED_ALL) && !selected.equals(mode.getUniqueID(item))) continue; - int color = mode.getItemColor(item); - image.setPixelRGBA(i, j, - combine(255, ColorUtils.blueI(color), ColorUtils.greenI(color), ColorUtils.redI(color))); - break; - } - // draw grid - if ((i) % 16 == 0 || (j) % 16 == 0) { - image.setPixelRGBA(i, j, ColorUtils.averageColor(image.getPixelRGBA(i, j), 0xff000000)); - } - } - } - return image; - } - - /** - * The resulting color of this operation is stored as least to most significant bits. - */ - public static int combine(int alpha, int blue, int green, int red) { - return (alpha & 0xFF) << 24 | (blue & 0xFF) << 16 | (green & 0xFF) << 8 | (red & 0xFF) << 0; - } - - public void load() { - doLoad(getImage()); - } - - private void doLoad(NativeImage image) { - TextureUtil.prepareImage(this.getId(), 0, image.getWidth(), image.getHeight()); - image.upload(0, 0, 0, 0, 0, image.getWidth(), image.getHeight(), false, false, false, true); - } - - public void draw(GuiGraphics graphics, int x, int y) { - if (this.getId() == -1) return; - Tesselator tesselator = Tesselator.getInstance(); - BufferBuilder bufferbuilder = tesselator.getBuilder(); - RenderSystem.setShader(GameRenderer::getPositionTexColorShader); - RenderSystem.setShaderTexture(0, this.getId()); - Matrix4f matrix4f = graphics.pose().last().pose(); - bufferbuilder.begin(VertexFormat.Mode.QUADS, POSITION_TEX_COLOR); - bufferbuilder.vertex(matrix4f, x, y + imageHeight, 0).uv(0, 1).color(-1).endVertex(); - bufferbuilder.vertex(matrix4f, x + imageWidth, y + imageHeight, 0).uv(1, 1).color(-1).endVertex(); - bufferbuilder.vertex(matrix4f, x + imageWidth, y, 0).uv(1, 0).color(-1).endVertex(); - bufferbuilder.vertex(matrix4f, x, y, 0).uv(0, 0).color(-1).endVertex(); - tesselator.end(); - - // draw special grid (e.g. fluid) - for (int cx = 0; cx < radius * 2 - 1; cx++) { - for (int cz = 0; cz < radius * 2 - 1; cz++) { - if (this.data[cx][cz] != null && this.data[cx][cz].length > 0) { - var items = this.data[cx][cz]; - mode.drawSpecialGrid(graphics, items, x + cx * 16 + 1, y + cz * 16 + 1, 16, 16); - } - } - } - TransformTexture arrow = ARROW.rotate(this.direction / 2); - arrow.draw(graphics, 0, 0, x + playerXGui - 20, y + playerYGui - 20, 40, 40); - - // draw red vertical line - if (playerXGui % 16 > 7 || playerXGui % 16 == 0) { - DrawerHelper.drawSolidRect(graphics, x + playerXGui - 1, y, 1, imageHeight, ColorPattern.RED.color); - } else { - DrawerHelper.drawSolidRect(graphics, x + playerXGui, y, 1, imageHeight, ColorPattern.RED.color); - } - // draw red horizontal line - if (playerYGui % 16 > 7 || playerYGui % 16 == 0) { - DrawerHelper.drawSolidRect(graphics, x, y + playerYGui - 1, imageWidth, 1, ColorPattern.RED.color); - } else { - DrawerHelper.drawSolidRect(graphics, x, y + playerYGui, imageWidth, 1, ColorPattern.RED.color); - } - } - - @Override - public void load(ResourceManager resourceManager) throws IOException {} - - public void setDarkMode(boolean darkMode) { - if (this.darkMode != darkMode) { - this.darkMode = darkMode; - load(); - } - } - - public void setSelected(String uniqueID) { - if (!this.selected.equals(uniqueID)) { - this.selected = uniqueID; - load(); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/util/TimedProgressSupplier.java b/src/main/java/com/gregtechceu/gtceu/api/gui/util/TimedProgressSupplier.java deleted file mode 100644 index e958d11e59d..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/util/TimedProgressSupplier.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.util; - -import java.util.function.DoubleSupplier; - -public class TimedProgressSupplier implements DoubleSupplier { - - private final int msPerCycle; - private final int maxValue; - private final boolean countDown; - private long startTime; - - public TimedProgressSupplier(int ticksPerCycle, int maxValue, boolean countDown) { - this.msPerCycle = ticksPerCycle * 50; - this.maxValue = maxValue; - this.countDown = countDown; - this.startTime = System.currentTimeMillis(); - } - - public void resetCountdown() { - startTime = System.currentTimeMillis(); - } - - @Override - public double getAsDouble() { - return calculateTime(); - } - - private double calculateTime() { - long currentTime = System.currentTimeMillis(); - long msPassed = (currentTime - startTime) % msPerCycle; - double currentValue = (1.0 * msPassed * maxValue) / msPerCycle; - if (countDown) { - return (maxValue - currentValue) / maxValue; - } - return currentValue / maxValue; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/BlockableSlotWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/BlockableSlotWidget.java deleted file mode 100644 index a4a2732243b..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/BlockableSlotWidget.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.widget; - -import com.lowdragmc.lowdraglib.utils.Position; -import com.lowdragmc.lowdraglib.utils.Size; - -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.world.Container; -import net.minecraftforge.items.IItemHandlerModifiable; - -import com.mojang.blaze3d.systems.RenderSystem; -import org.jetbrains.annotations.NotNull; - -import java.util.function.BooleanSupplier; - -/** Basically just your normal SlotWidget, but can render the slot as "grayed-out" with a Supplier value. */ -public class BlockableSlotWidget extends SlotWidget { - - private static final int OVERLAY_COLOR = 0x80404040; - - private BooleanSupplier isBlocked = () -> false; - - public BlockableSlotWidget(Container inventory, int slotIndex, int xPosition, int yPosition, boolean canTakeItems, - boolean canPutItems) { - super(inventory, slotIndex, xPosition, yPosition, canTakeItems, canPutItems); - } - - public BlockableSlotWidget(IItemHandlerModifiable itemHandler, int slotIndex, int xPosition, int yPosition, - boolean canTakeItems, boolean canPutItems) { - super(itemHandler, slotIndex, xPosition, yPosition, canTakeItems, - canPutItems); - } - - public BlockableSlotWidget(IItemHandlerModifiable itemHandler, int slotIndex, int xPosition, int yPosition) { - super(itemHandler, slotIndex, xPosition, yPosition); - } - - public BlockableSlotWidget(Container inventory, int slotIndex, int xPosition, int yPosition) { - super(inventory, slotIndex, xPosition, yPosition); - } - - public BlockableSlotWidget setIsBlocked(BooleanSupplier isBlocked) { - this.isBlocked = isBlocked; - return this; - } - - @Override - public void drawInBackground(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - super.drawInBackground(graphics, mouseX, mouseY, partialTicks); - if (isBlocked.getAsBoolean()) { - Position pos = getPosition(); - Size size = getSize(); - RenderSystem.disableDepthTest(); - RenderSystem.colorMask(true, true, true, false); - graphics.fill(pos.getX() + 1, pos.getY() + 1, pos.getX() + 1 + size.getWidth() - 2, - pos.getY() + 1 + size.getHeight() - 2, OVERLAY_COLOR); - RenderSystem.colorMask(true, true, true, true); - RenderSystem.enableDepthTest(); - RenderSystem.enableBlend(); - } - } - - @Override - public boolean isMouseOverElement(double mouseX, double mouseY) { - // prevent slot removal and hover highlighting when slot is blocked - return super.isMouseOverElement(mouseX, mouseY) && !isBlocked.getAsBoolean(); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ColorBlockWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ColorBlockWidget.java deleted file mode 100644 index 5e7bbf3e412..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ColorBlockWidget.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.widget; - -import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; -import com.lowdragmc.lowdraglib.gui.widget.Widget; - -import net.minecraft.client.gui.GuiGraphics; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; -import org.jetbrains.annotations.NotNull; - -import java.util.function.IntSupplier; - -@Setter -@Accessors(chain = true) -public class ColorBlockWidget extends Widget { - - private IntSupplier colorSupplier; - @Getter - private int currentColor; - private static boolean isShowAlpha = false; - - public ColorBlockWidget(int x, int y, int width, int height) { - super(x, y, width, height); - this.currentColor = 0xFFFFFFFF; - } - - @Override - public void updateScreen() { - super.updateScreen(); - if (isClientSideWidget && colorSupplier != null) { - currentColor = colorSupplier.getAsInt(); - } - } - - @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (isMouseOverElement(mouseX, mouseY)) { - playButtonClickSound(); - isShowAlpha = !isShowAlpha; - return true; - } - return super.mouseClicked(mouseX, mouseY, button); - } - - @OnlyIn(Dist.CLIENT) - @Override - public void drawInBackground(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - int x = getPosition().x + 1; - int y = getPosition().y + 1; - int width = getSize().width - 2; - int height = getSize().height - 2; - - if (colorSupplier != null) { - currentColor = colorSupplier.getAsInt(); - } - final int BORDER_COLOR = 0xFF000000; - int opaqueColor = isShowAlpha ? currentColor : currentColor | 0xFF000000; - graphics.fill(x, y, x + width, y + height, opaqueColor); - DrawerHelper.drawBorder(graphics, x, y, width, height, BORDER_COLOR, 1); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ConfirmTextInputWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ConfirmTextInputWidget.java deleted file mode 100644 index 9a77e5e26c1..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ConfirmTextInputWidget.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.widget; - -import com.gregtechceu.gtceu.api.gui.GuiTextures; - -import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; -import com.lowdragmc.lowdraglib.gui.widget.ButtonWidget; -import com.lowdragmc.lowdraglib.gui.widget.TextFieldWidget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; - -import lombok.AccessLevel; -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; -import org.jetbrains.annotations.Nullable; - -import java.util.function.Consumer; -import java.util.function.Function; - -@Accessors(chain = true) -public class ConfirmTextInputWidget extends WidgetGroup { - - private final Consumer textResponder; - @Nullable - private final Function returnValidator; - private Function validator = (s) -> s; - @Getter(AccessLevel.PRIVATE) - @Setter(AccessLevel.PRIVATE) - private String inputText = ""; - @Setter - private String tooltip = ""; - - public ConfirmTextInputWidget(int x, int y, int width, int height, String text, - Consumer textResponder, - @Nullable Function validator, - @Nullable Function returnValidator) { - super(x, y, width, height); - this.textResponder = textResponder; - this.returnValidator = returnValidator; - if (validator != null) { - this.validator = validator; - } - if (text != null) { - this.inputText = text; - } - } - - @Override - public void initWidget() { - super.initWidget(); - this.addWidget(new ButtonWidget( - getSizeWidth() - getSizeHeight(), - 0, - getSizeHeight(), - getSizeHeight(), - pressed -> { - if (returnValidator != null) { - inputText = returnValidator.apply(inputText); - } - textResponder.accept(inputText); - }) - .setButtonTexture( - new GuiTextureGroup(GuiTextures.VANILLA_BUTTON, GuiTextures.BUTTON_CHECK))); - this.addWidget(new TextFieldWidget( - 1, - 1, - getSizeWidth() - getSizeHeight() - 4, - getSizeHeight() - 2, - this::getInputText, - this::setInputText) - .setValidator(validator) - .setHoverTooltips(tooltip)); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/CoverConfigurator.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/CoverConfigurator.java deleted file mode 100644 index a7253922ede..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/CoverConfigurator.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.widget; - -import com.gregtechceu.gtceu.api.capability.ICoverable; -import com.gregtechceu.gtceu.api.cover.CoverBehavior; -import com.gregtechceu.gtceu.api.cover.IUICover; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.fancy.IFancyConfigurator; -import com.gregtechceu.gtceu.common.data.GTItems; - -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.texture.ItemStackTexture; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.utils.Position; -import com.lowdragmc.lowdraglib.utils.Size; - -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; - -import lombok.AllArgsConstructor; -import org.jetbrains.annotations.Nullable; - -@AllArgsConstructor -public class CoverConfigurator implements IFancyConfigurator { - - protected final ICoverable coverable; - // runtime - @Nullable - protected final Direction side; - @Nullable - protected final CoverBehavior coverBehavior; - - @Override - public Component getTitle() { - return Component.translatable("gtceu.gui.cover_setting.title"); - } - - @Override - public IGuiTexture getIcon() { - return new ItemStackTexture(GTItems.ITEM_FILTER.get()); - } - - @Override - public Widget createConfigurator() { - WidgetGroup group = new WidgetGroup(new Position(0, 0)); - if (side != null) { - if (coverable.getCoverAtSide(side) instanceof IUICover iuiCover) { - Widget coverConfigurator = iuiCover.createUIWidget(); - coverConfigurator.setBackground(GuiTextures.BACKGROUND); - coverConfigurator.setSelfPosition(new Position(4, -4)); - group.addWidget(coverConfigurator); - group.setSize(new Size(Math.max(120, coverConfigurator.getSize().width + 8), - Math.max(80, 80 + coverConfigurator.getSize().height))); - } - } - return group; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/DualProgressWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/DualProgressWidget.java deleted file mode 100644 index 668e61c1eb8..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/DualProgressWidget.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.widget; - -import com.lowdragmc.lowdraglib.gui.editor.annotation.Configurable; -import com.lowdragmc.lowdraglib.gui.editor.annotation.LDLRegister; -import com.lowdragmc.lowdraglib.gui.editor.annotation.NumberRange; -import com.lowdragmc.lowdraglib.gui.editor.configurator.Configurator; -import com.lowdragmc.lowdraglib.gui.editor.configurator.ConfiguratorGroup; -import com.lowdragmc.lowdraglib.gui.editor.configurator.WrapperConfigurator; -import com.lowdragmc.lowdraglib.gui.widget.ProgressWidget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; - -import lombok.Getter; -import lombok.experimental.Accessors; - -import java.util.function.DoubleSupplier; - -@LDLRegister(name = "dual_progress", group = "widget.group") -@Accessors(chain = true) -public class DualProgressWidget extends WidgetGroup { - - private DoubleSupplier progressSupplier; - @Configurable - @NumberRange(range = { 0.001, 1.0 }, wheel = 0.01) - private double splitPoint; - @Configurable(subConfigurable = true) - @Getter - private ProgressWidget texture1; - @Configurable(subConfigurable = true) - @Getter - private ProgressWidget texture2; - - public DualProgressWidget() { - this(ProgressWidget.JEIProgress, 0.5); - } - - public DualProgressWidget(DoubleSupplier progress, double splitPoint) { - this(new ProgressWidget(ProgressWidget.JEIProgress, 0, 0, 16, 16), - new ProgressWidget(ProgressWidget.JEIProgress, 16, 0, 16, 16), progress, splitPoint); - } - - public DualProgressWidget(ProgressWidget texture1, ProgressWidget texture2, DoubleSupplier progress, - double splitPoint) { - this.progressSupplier = progress; - this.splitPoint = splitPoint; - this.texture1 = texture1.setProgressSupplier( - () -> progress.getAsDouble() >= splitPoint ? 1.0 : (1.0 / splitPoint) * progress.getAsDouble()); - this.texture2 = texture2.setProgressSupplier(() -> progress.getAsDouble() >= splitPoint ? - (1.0 / (1 - splitPoint)) * (progress.getAsDouble() - splitPoint) : 0); - this.addWidget(this.texture1).addWidget(this.texture2); - } - - public DualProgressWidget setTexture1(ProgressWidget widget) { - this.removeWidget(texture1); - this.texture1 = widget.setProgressSupplier(() -> progressSupplier.getAsDouble() >= splitPoint ? 1.0 : - (1.0 / splitPoint) * progressSupplier.getAsDouble()); - this.addWidget(texture1); - return this; - } - - public DualProgressWidget setTexture2(ProgressWidget widget) { - this.removeWidget(texture2); - this.texture2 = widget.setProgressSupplier(() -> progressSupplier.getAsDouble() >= splitPoint ? - (1.0 / (1 - splitPoint)) * (progressSupplier.getAsDouble() - splitPoint) : 0); - this.addWidget(texture2); - return this; - } - - public DualProgressWidget setProgressSupplier(DoubleSupplier progressSupplier) { - this.progressSupplier = progressSupplier; - - this.widgets.clear(); - this.texture1.setProgressSupplier(() -> progressSupplier.getAsDouble() >= splitPoint ? 1.0 : - (1.0 / splitPoint) * progressSupplier.getAsDouble()); - this.addWidget(texture1); - this.texture2.setProgressSupplier(() -> progressSupplier.getAsDouble() >= splitPoint ? - (1.0 / (1 - splitPoint)) * (progressSupplier.getAsDouble() - splitPoint) : 0); - this.addWidget(texture2); - - return this; - } - - public DualProgressWidget setSplitPoint(double splitPoint) { - this.splitPoint = splitPoint; - - this.widgets.clear(); - this.texture1.setProgressSupplier(() -> progressSupplier.getAsDouble() >= splitPoint ? 1.0 : - (1.0 / splitPoint) * progressSupplier.getAsDouble()); - this.addWidget(texture1); - this.texture2.setProgressSupplier(() -> progressSupplier.getAsDouble() >= splitPoint ? - (1.0 / (1 - splitPoint)) * (progressSupplier.getAsDouble() - splitPoint) : 0); - this.addWidget(texture2); - - return this; - } - - @Override - public void buildConfigurator(ConfiguratorGroup father) { - super.buildConfigurator(father); - for (Configurator configurator : father.getConfigurators()) { - if (!setConfiguratorIfProgress(configurator) && configurator instanceof ConfiguratorGroup group) { - for (Configurator subConfigurator : group.getConfigurators()) { - setConfiguratorIfProgress(subConfigurator); - } - } - } - } - - private boolean setConfiguratorIfProgress(Configurator configurator) { - if (configurator instanceof WrapperConfigurator guiConfigurator && - guiConfigurator.inner instanceof ProgressWidget progressWidget) { - if (configurator.getName().equals("texture1")) { - this.setTexture1(progressWidget); - return true; - } else if (configurator.getName().equals("texture2")) { - this.setTexture2(progressWidget); - return true; - } - } - return false; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/EnumSelectorWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/EnumSelectorWidget.java deleted file mode 100644 index bb506f8f78a..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/EnumSelectorWidget.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.widget; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.data.lang.LangUtil; - -import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.widget.CycleButtonWidget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; - -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; - -import org.jetbrains.annotations.NotNull; - -import java.util.Arrays; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.function.BiFunction; -import java.util.function.Consumer; - -import javax.annotation.ParametersAreNonnullByDefault; - -/** - * A widget for selecting a value from an enum or a subset of its values. - */ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -public class EnumSelectorWidget & EnumSelectorWidget.SelectableEnum> extends WidgetGroup { - - public interface SelectableEnum { - - String getTooltip(); - - IGuiTexture getIcon(); - } - - public final CycleButtonWidget buttonWidget; - - public final List values; - public final Consumer onChanged; - - public int selected = 0; - - private BiFunction textureSupplier = (value, texture) -> new GuiTextureGroup( - GuiTextures.VANILLA_BUTTON, texture); - - private BiFunction> tooltipSupplier = (value, key) -> Arrays - .asList(LangUtil.getSingleOrMultiLang(key)); - - public EnumSelectorWidget(int xPosition, int yPosition, int width, int height, T[] values, T initialValue, - Consumer onChanged) { - this(xPosition, yPosition, width, height, Arrays.asList(values), initialValue, onChanged); - } - - public EnumSelectorWidget(int xPosition, int yPosition, int width, int height, List values, T initialValue, - Consumer onChanged) { - super(xPosition, yPosition, width, height); - - this.values = values; - this.onChanged = onChanged; - - this.buttonWidget = new CycleButtonWidget(0, 0, width, height, values.size(), this::getTexture, - this::onSelected); - this.addWidget(buttonWidget); - - setSelected(initialValue); - } - - @Override - public void writeInitialData(FriendlyByteBuf buffer) { - super.writeInitialData(buffer); - buffer.writeInt(selected); - } - - @Override - public void readInitialData(FriendlyByteBuf buffer) { - super.readInitialData(buffer); - onSelected(buffer.readInt()); - } - - public T getCurrentValue() { - return values.get(selected); - } - - public IGuiTexture getTexture(int selected) { - var selectedValue = values.get(selected); - return textureSupplier.apply(selectedValue, selectedValue.getIcon()); - } - - private void onSelected(int selected) { - T selectedValue = values.get(selected); - setSelected(selectedValue); - } - - public EnumSelectorWidget setTextureSupplier(BiFunction textureSupplier) { - this.textureSupplier = textureSupplier; - - T selectedValue = getCurrentValue(); - buttonWidget.setBackground(textureSupplier.apply(selectedValue, selectedValue.getIcon())); - - return this; - } - - public EnumSelectorWidget setTooltipSupplier(BiFunction> tooltipSupplier) { - this.tooltipSupplier = tooltipSupplier; - - return this; - } - - public void setSelected(@NotNull T value) { - var selectedIndex = values.indexOf(value); - - if (selectedIndex == -1) - throw new NoSuchElementException(value + " is not a possible value for this selector."); - - this.selected = selectedIndex; - this.buttonWidget.setIndex(selectedIndex); - - updateTooltip(); - - onChanged.accept(value); - } - - private void updateTooltip() { - if (!GTCEu.isClientThread()) - return; - - T selectedValue = getCurrentValue(); - buttonWidget.setHoverTooltips(tooltipSupplier.apply(selectedValue, selectedValue.getTooltip())); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ExtendedProgressWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ExtendedProgressWidget.java deleted file mode 100644 index 80bbda0ad43..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ExtendedProgressWidget.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.widget; - -import com.lowdragmc.lowdraglib.gui.texture.ProgressTexture; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; -import com.lowdragmc.lowdraglib.gui.widget.ProgressWidget; - -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; -import net.minecraft.world.item.ItemStack; - -import lombok.Setter; -import lombok.experimental.Accessors; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.Consumer; -import java.util.function.DoubleSupplier; - -@Accessors(chain = true) -public class ExtendedProgressWidget extends ProgressWidget { - - private List serverTooltips = new ArrayList<>(); - @Setter - private Consumer> serverTooltipSupplier; - - public ExtendedProgressWidget() { - super(JEIProgress, 0, 0, 40, 40, new ProgressTexture()); - } - - public ExtendedProgressWidget(DoubleSupplier progressSupplier, int x, int y, int width, int height, - ResourceTexture fullImage) { - super(progressSupplier, x, y, width, height, fullImage); - } - - public ExtendedProgressWidget(DoubleSupplier progressSupplier, int x, int y, int width, int height, - ProgressTexture progressBar) { - super(progressSupplier, x, y, width, height, progressBar); - } - - public ExtendedProgressWidget(DoubleSupplier progressSupplier, int x, int y, int width, int height) { - super(progressSupplier, x, y, width, height); - } - - @Override - public void detectAndSendChanges() { - super.detectAndSendChanges(); - - if (serverTooltipSupplier != null) { - List textBuffer = new ArrayList<>(); - serverTooltipSupplier.accept(textBuffer); - if (!serverTooltips.equals(textBuffer)) { - this.serverTooltips = textBuffer; - writeUpdateInfo(1, buffer -> { - buffer.writeVarInt(serverTooltips.size()); - for (Component component : serverTooltips) { - buffer.writeComponent(component); - } - }); - } - } - } - - @Override - public void readUpdateInfo(int id, FriendlyByteBuf buffer) { - if (id == 1) { - this.serverTooltips.clear(); - int count = buffer.readVarInt(); - for (int i = 0; i < count; i++) { - Component component = buffer.readComponent(); - this.serverTooltips.add(component); - } - } else { - super.readUpdateInfo(id, buffer); - } - } - - @Override - public void drawInForeground(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - if ((!tooltipTexts.isEmpty() || !serverTooltips.isEmpty()) && isMouseOverElement(mouseX, mouseY) && - getHoverElement(mouseX, mouseY) == this && gui != null && gui.getModularUIGui() != null) { - var tips = new ArrayList<>(tooltipTexts); - tips.addAll(serverTooltips); - gui.getModularUIGui().setHoverTooltip(tips, ItemStack.EMPTY, null, null); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/GhostCircuitSlotWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/GhostCircuitSlotWidget.java deleted file mode 100644 index 26a37530d1c..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/GhostCircuitSlotWidget.java +++ /dev/null @@ -1,203 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.widget; - -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.common.item.behavior.IntCircuitBehaviour; -import com.gregtechceu.gtceu.config.ConfigHolder; - -import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.texture.ItemStackTexture; -import com.lowdragmc.lowdraglib.gui.widget.ButtonWidget; -import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; - -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.items.IItemHandlerModifiable; - -import lombok.Getter; -import org.jetbrains.annotations.Nullable; - -/** - * Used for setting a "ghost" IC for a machine - */ -public class GhostCircuitSlotWidget extends SlotWidget { - - private static final int SET_TO_ZERO = 1; - private static final int SET_TO_EMPTY = 2; - private static final int SET_TO_N = 3; - - private static final int NO_CONFIG = -1; - - @Getter - private IItemHandlerModifiable circuitInventory; - @Nullable - private Widget configurator; - - public GhostCircuitSlotWidget() { - super(); - } - - public void setCircuitInventory(IItemHandlerModifiable circuitInventory) { - this.circuitInventory = circuitInventory; - setHandlerSlot(circuitInventory, 0); - } - - public boolean isConfiguratorOpen() { - return configurator != null; - } - - @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (isMouseOverElement(mouseX, mouseY) && gui != null) { - if (button == 0 && Screen.hasShiftDown()) { - // open popup on shift-left-click - if (!isConfiguratorOpen()) { - this.gui.widget(configurator = createConfigurator()); - } else { - this.gui.mainGroup.removeWidget(configurator); - configurator = null; - } - } else if (button == 0) { - // increment on left-click - int newValue = getNextValue(true); - setCircuitValue(newValue); - } else if (button == 1 && Screen.hasShiftDown()) { - // clear on shift-right-click - this.circuitInventory.setStackInSlot(0, ItemStack.EMPTY); - writeClientAction(SET_TO_EMPTY, buf -> {}); - } else if (button == 1) { - // decrement on right-click - int newValue = getNextValue(false); - setCircuitValue(newValue); - } - return true; - } - return false; - } - - private int getNextValue(boolean increment) { - int currentValue = IntCircuitBehaviour.getCircuitConfiguration(this.circuitInventory.getStackInSlot(0)); - if (increment) { - // if at max, loop around to no circuit - if (currentValue == IntCircuitBehaviour.CIRCUIT_MAX) { - return 0; - } - // if at no circuit, skip 0 and return 1 - if (this.circuitInventory.getStackInSlot(0).isEmpty()) { - return 1; - } - // normal case: increment by 1 - return currentValue + 1; - } else { - // if at no circuit, loop around to max - if (this.circuitInventory.getStackInSlot(0).isEmpty()) { - return IntCircuitBehaviour.CIRCUIT_MAX; - } - // if at 1, skip 0 and return no circuit - if (currentValue == 1) { - return NO_CONFIG; - } - // normal case: decrement by 1 - return currentValue - 1; - } - } - - @Override - public boolean mouseWheelMove(double mouseX, double mouseY, double wheelDelta) { - if (isConfiguratorOpen()) return true; - if (isMouseOverElement(mouseX, mouseY) && gui != null) { - int newValue = getNextValue(wheelDelta >= 0); - setCircuitValue(newValue); - return true; - } - return false; - } - - @Override - public boolean mouseDragged(double mouseX, double mouseY, int button, double dragX, double dragY) { - return false; - } - - @Override - public boolean canMergeSlot(ItemStack stack) { - return false; - } - - public void setCircuitValue(int newValue) { - if (newValue == NO_CONFIG) { - this.circuitInventory.setStackInSlot(0, ItemStack.EMPTY); - writeClientAction(SET_TO_EMPTY, buf -> {}); - } else { - this.circuitInventory.setStackInSlot(0, IntCircuitBehaviour.stack(newValue)); - writeClientAction(SET_TO_N, buf -> buf.writeVarInt(newValue)); - } - } - - @Override - public void handleClientAction(int id, FriendlyByteBuf buffer) { - switch (id) { - case SET_TO_ZERO -> this.circuitInventory.setStackInSlot(0, IntCircuitBehaviour.stack(0)); - case SET_TO_EMPTY -> this.circuitInventory.setStackInSlot(0, ItemStack.EMPTY); - case SET_TO_N -> this.circuitInventory.setStackInSlot(0, IntCircuitBehaviour.stack(buffer.readVarInt())); - } - } - - public Widget createConfigurator() { - var group = new WidgetGroup(0, 0, 174, 132); - group.addWidget(new LabelWidget(9, 8, "Programmed Circuit Configuration")); - group.addWidget(new SlotWidget(this.circuitInventory, 0, (group.getSize().width - 18) / 2, 20, - !ConfigHolder.INSTANCE.machines.ghostCircuit, !ConfigHolder.INSTANCE.machines.ghostCircuit) - .setBackground(new GuiTextureGroup(GuiTextures.SLOT, GuiTextures.INT_CIRCUIT_OVERLAY))); - if (ConfigHolder.INSTANCE.machines.ghostCircuit) { - group.addWidget(new ButtonWidget((group.getSize().width - 18) / 2, 20, 18, 18, IGuiTexture.EMPTY, - clickData -> { - if (!clickData.isRemote) { - circuitInventory.setStackInSlot(0, ItemStack.EMPTY); - } - })); - } - int idx = 0; - for (int x = 0; x <= 2; x++) { - for (int y = 0; y <= 8; y++) { - int finalIdx = idx; - group.addWidget(new ButtonWidget(5 + (18 * y), 48 + (18 * x), 18, 18, - new GuiTextureGroup(GuiTextures.SLOT, - new ItemStackTexture(IntCircuitBehaviour.stack(finalIdx)).scale(16f / 18)), - clickData -> { - if (!clickData.isRemote) { - ItemStack stack = circuitInventory.getStackInSlot(0).copy(); - if (IntCircuitBehaviour.isIntegratedCircuit(stack)) { - IntCircuitBehaviour.setCircuitConfiguration(stack, finalIdx); - circuitInventory.setStackInSlot(0, stack); - } else if (ConfigHolder.INSTANCE.machines.ghostCircuit) { - circuitInventory.setStackInSlot(0, IntCircuitBehaviour.stack(finalIdx)); - } - } - })); - idx++; - } - } - for (int x = 0; x <= 5; x++) { - int finalIdx = x + 27; - group.addWidget(new ButtonWidget(5 + (18 * x), 102, 18, 18, - new GuiTextureGroup(GuiTextures.SLOT, - new ItemStackTexture(IntCircuitBehaviour.stack(finalIdx)).scale(16f / 18)), - clickData -> { - if (!clickData.isRemote) { - ItemStack stack = circuitInventory.getStackInSlot(0).copy(); - if (IntCircuitBehaviour.isIntegratedCircuit(stack)) { - IntCircuitBehaviour.setCircuitConfiguration(stack, finalIdx); - circuitInventory.setStackInSlot(0, stack); - } else if (ConfigHolder.INSTANCE.machines.ghostCircuit) { - circuitInventory.setStackInSlot(0, IntCircuitBehaviour.stack(finalIdx)); - } - } - })); - } - group.setBackground(GuiTextures.BACKGROUND); - return group; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/IntInputWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/IntInputWidget.java deleted file mode 100644 index 887c9c9f6ae..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/IntInputWidget.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.widget; - -import com.lowdragmc.lowdraglib.gui.widget.TextFieldWidget; -import com.lowdragmc.lowdraglib.utils.Position; -import com.lowdragmc.lowdraglib.utils.Size; - -import net.minecraft.util.Mth; - -import java.util.function.Consumer; -import java.util.function.Supplier; - -/** - * A widget containing an integer input field, as well as adjacent buttons for increasing or decreasing the value. - * - *

- * The buttons' change amount can be altered with Ctrl, Shift, or both.
- * The input is limited by a minimum and maximum value. - *

- */ -public class IntInputWidget extends NumberInputWidget { - - public IntInputWidget(Supplier valueSupplier, Consumer onChanged) { - super(valueSupplier, onChanged); - } - - public IntInputWidget(Position position, Supplier valueSupplier, Consumer onChanged) { - super(position, valueSupplier, onChanged); - } - - public IntInputWidget(Position position, Size size, Supplier valueSupplier, Consumer onChanged) { - super(position, size, valueSupplier, onChanged); - } - - public IntInputWidget(int x, int y, int width, int height, Supplier valueSupplier, - Consumer onChanged) { - super(x, y, width, height, valueSupplier, onChanged); - } - - @Override - protected Integer defaultMin() { - return 0; - } - - @Override - protected Integer defaultMax() { - return Integer.MAX_VALUE; - } - - @Override - protected String toText(Integer value) { - return String.valueOf(value); - } - - @Override - protected Integer fromText(String value) { - return Integer.parseInt(value); - } - - @Override - protected NumberInputWidget.ChangeValues getChangeValues() { - return new NumberInputWidget.ChangeValues<>(1, 8, 64, 512); - } - - @Override - protected Integer getOne(boolean positive) { - return positive ? 1 : -1; - } - - @Override - protected Integer add(Integer a, Integer b) { - return a + b; - } - - @Override - protected Integer multiply(Integer a, Integer b) { - return a * b; - } - - @Override - protected Integer clamp(Integer value, Integer min, Integer max) { - return Mth.clamp(value, min, max); - } - - @Override - protected void setTextFieldRange(TextFieldWidget textField, Integer min, Integer max) { - textField.setNumbersOnly(min, max); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/LongInputWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/LongInputWidget.java deleted file mode 100644 index e7a761a2775..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/LongInputWidget.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.widget; - -import com.gregtechceu.gtceu.utils.GTMath; - -import com.lowdragmc.lowdraglib.gui.widget.TextFieldWidget; -import com.lowdragmc.lowdraglib.utils.Position; -import com.lowdragmc.lowdraglib.utils.Size; - -import java.util.function.Consumer; -import java.util.function.Supplier; - -/** - * A widget containing an integer input field, as well as adjacent buttons for increasing or decreasing the value. - * - *

- * The buttons' change amount can be altered with Ctrl, Shift, or both.
- * The input is limited by a minimum and maximum value. - *

- */ -public class LongInputWidget extends NumberInputWidget { - - public LongInputWidget(Supplier valueSupplier, Consumer onChanged) { - super(valueSupplier, onChanged); - } - - public LongInputWidget(Position position, Supplier valueSupplier, Consumer onChanged) { - super(position, valueSupplier, onChanged); - } - - public LongInputWidget(Position position, Size size, Supplier valueSupplier, Consumer onChanged) { - super(position, size, valueSupplier, onChanged); - } - - public LongInputWidget(int x, int y, int width, int height, Supplier valueSupplier, - Consumer onChanged) { - super(x, y, width, height, valueSupplier, onChanged); - } - - @Override - protected Long defaultMin() { - return 0L; - } - - @Override - protected Long defaultMax() { - return Long.MAX_VALUE; - } - - @Override - protected String toText(Long value) { - return String.valueOf(value); - } - - @Override - protected Long fromText(String value) { - return Long.parseLong(value); - } - - @Override - protected ChangeValues getChangeValues() { - return new ChangeValues<>(1L, 8L, 64L, 512L); - } - - @Override - protected Long add(Long a, Long b) { - return a + b; - } - - @Override - protected Long multiply(Long a, Long b) { - return a * b; - } - - @Override - protected Long clamp(Long value, Long min, Long max) { - return GTMath.clamp(value, min, max); - } - - @Override - protected void setTextFieldRange(TextFieldWidget textField, Long min, Long max) { - textField.setNumbersOnly(min, max); - } - - @Override - protected Long getOne(boolean positive) { - return positive ? 1L : -1L; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/NumberInputWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/NumberInputWidget.java deleted file mode 100644 index fdcd8bf9884..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/NumberInputWidget.java +++ /dev/null @@ -1,208 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.widget; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.utils.GTUtil; - -import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.texture.TextTexture; -import com.lowdragmc.lowdraglib.gui.util.ClickData; -import com.lowdragmc.lowdraglib.gui.widget.ButtonWidget; -import com.lowdragmc.lowdraglib.gui.widget.TextFieldWidget; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.utils.Position; -import com.lowdragmc.lowdraglib.utils.Size; - -import net.minecraft.client.Minecraft; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.util.Mth; - -import lombok.Getter; - -import java.util.function.Consumer; -import java.util.function.Supplier; - -/** - * A widget containing an integer input field, as well as adjacent buttons for increasing or decreasing the value. - * - *

- * The buttons' change amount can be altered with Ctrl, Shift, or both.
- * The input is limited by a minimum and maximum value. - *

- */ -public abstract class NumberInputWidget extends WidgetGroup { - - protected abstract T defaultMin(); - - protected abstract T defaultMax(); - - protected abstract String toText(T value); - - protected abstract T fromText(String value); - - protected record ChangeValues(T regular, T shift, T ctrl, T ctrlShift) {} - - protected abstract ChangeValues getChangeValues(); - - protected abstract T add(T a, T b); - - protected abstract T multiply(T a, T b); - - protected abstract T clamp(T value, T min, T max); - - protected abstract void setTextFieldRange(TextFieldWidget textField, T min, T max); - - protected abstract T getOne(boolean positive); - - ///////////////////////////////////////////////// - // *********** IMPLEMENTATION ***********// - ///////////////////////////////////////////////// - - private final ChangeValues CHANGE_VALUES = getChangeValues(); - private final T ONE_POSITIVE = getOne(true); - private final T ONE_NEGATIVE = getOne(false); - - @Getter - private Supplier valueSupplier; - @Getter - private T min = defaultMin(); - @Getter - private T max = defaultMax(); - - private final Consumer onChanged; - - private TextFieldWidget textField; - - public NumberInputWidget(Supplier valueSupplier, Consumer onChanged) { - this(0, 0, 100, 20, valueSupplier, onChanged); - } - - public NumberInputWidget(Position position, Supplier valueSupplier, Consumer onChanged) { - this(position, new Size(100, 20), valueSupplier, onChanged); - } - - public NumberInputWidget(Position position, Size size, Supplier valueSupplier, Consumer onChanged) { - this(position.x, position.y, size.width, size.height, valueSupplier, onChanged); - } - - public NumberInputWidget(int x, int y, int width, int height, Supplier valueSupplier, Consumer onChanged) { - super(x, y, width, height); - this.valueSupplier = valueSupplier; - this.onChanged = onChanged; - buildUI(); - } - - @Override - public void initWidget() { - super.initWidget(); - textField.setCurrentString(toText(valueSupplier.get())); - } - - @Override - public void writeInitialData(FriendlyByteBuf buffer) { - super.writeInitialData(buffer); - buffer.writeUtf(toText(valueSupplier.get())); - } - - @Override - public void readInitialData(FriendlyByteBuf buffer) { - super.readInitialData(buffer); - textField.setCurrentString(buffer.readUtf()); - } - - @Override - public Widget setHoverTooltips(String... tooltipText) { - textField.setHoverTooltips(tooltipText); - return super.setHoverTooltips(tooltipText); - } - - private void buildUI() { - int buttonWidth = Mth.clamp(this.getSize().width / 5, 15, 40); - int textFieldWidth = this.getSize().width - (2 * buttonWidth) - 4; - - this.addWidget(new ButtonWidget(0, 0, buttonWidth, 20, - new GuiTextureGroup(GuiTextures.VANILLA_BUTTON, getButtonTexture("-", buttonWidth)), - this::decrease).setHoverTooltips("gui.widget.incrementButton.default_tooltip")); - - this.textField = new TextFieldWidget(buttonWidth + 2, 0, textFieldWidth, 20, - () -> toText(valueSupplier.get()), - stringValue -> this.setValue(clamp(fromText(stringValue), min, max))); - this.updateTextFieldRange(); - this.addWidget(this.textField); - - this.addWidget(new ButtonWidget(buttonWidth + textFieldWidth + 4, 0, buttonWidth, 20, - new GuiTextureGroup(GuiTextures.VANILLA_BUTTON, getButtonTexture("+", buttonWidth)), - this::increase).setHoverTooltips("gui.widget.incrementButton.default_tooltip")); - } - - private IGuiTexture getButtonTexture(String prefix, int buttonWidth) { - var texture = new TextTexture(prefix + "1"); - - if (!GTCEu.isClientThread()) { - return texture; - } - - // Dynamic text is only necessary on the remote side: - - int maxTextWidth = buttonWidth - 4; - - texture.setSupplier(() -> { - T amount = GTUtil.isCtrlDown() ? - GTUtil.isShiftDown() ? CHANGE_VALUES.ctrlShift : CHANGE_VALUES.ctrl : - GTUtil.isShiftDown() ? CHANGE_VALUES.shift : CHANGE_VALUES.regular; - - String text = prefix + toText(amount); - - texture.scale(maxTextWidth / (float) Math.max(Minecraft.getInstance().font.width(text), maxTextWidth)); - - return text; - }); - - return texture; - } - - private void increase(ClickData cd) { - this.changeValue(cd, ONE_POSITIVE); - } - - private void decrease(ClickData cd) { - this.changeValue(cd, ONE_NEGATIVE); - } - - private void changeValue(ClickData cd, T multiplier) { - if (!cd.isRemote) { - T amount = cd.isCtrlClick ? - cd.isShiftClick ? CHANGE_VALUES.ctrlShift : CHANGE_VALUES.ctrl : - cd.isShiftClick ? CHANGE_VALUES.shift : CHANGE_VALUES.regular; - - this.setValue(clamp(add(valueSupplier.get(), multiply(amount, multiplier)), min, max)); - } - } - - public NumberInputWidget setMin(T min) { - this.min = min; - updateTextFieldRange(); - - return this; - } - - public NumberInputWidget setMax(T max) { - this.max = max; - updateTextFieldRange(); - - return this; - } - - public NumberInputWidget setValue(T value) { - onChanged.accept(value); - return this; - } - - protected void updateTextFieldRange() { - setTextFieldRange(textField, min, max); - - this.setValue(clamp(valueSupplier.get(), min, max)); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PatternPreviewSlotWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PatternPreviewSlotWidget.java deleted file mode 100644 index 432e8be1636..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PatternPreviewSlotWidget.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.widget; - -import com.lowdragmc.lowdraglib.gui.modular.ModularUIGuiContainer; -import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; -import com.lowdragmc.lowdraglib.utils.ColorUtils; -import com.lowdragmc.lowdraglib.utils.Position; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.items.IItemHandlerModifiable; - -import com.mojang.blaze3d.systems.RenderSystem; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.lwjgl.opengl.GL11; - -import javax.annotation.Nonnull; - -public class PatternPreviewSlotWidget extends SlotWidget { - - public PatternPreviewSlotWidget(IItemHandlerModifiable itemHandler, int slotIndex, int xPosition, int yPosition, - boolean canTakeItems, boolean canPutItems) { - super(itemHandler, slotIndex, xPosition, yPosition, canTakeItems, canPutItems); - } - - /** - * Override the draw method for regular slot widget since we do custom offsets when drawing the stack - */ - @Override - public void drawInBackground(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - super.drawBackgroundTexture(graphics, mouseX, mouseY); - Position pos = this.getPosition(); - if (this.slotReference != null) { - ItemStack itemStack = this.getRealStack(this.slotReference.getItem()); - ModularUIGuiContainer modularUIGui = this.gui == null ? null : this.gui.getModularUIGui(); - if (itemStack.isEmpty() && modularUIGui != null && modularUIGui.getQuickCrafting() && - modularUIGui.getQuickCraftSlots().contains(this.slotReference)) { - int splitSize = modularUIGui.getQuickCraftSlots().size(); - itemStack = this.gui.getModularUIContainer().getCarried(); - if (!itemStack.isEmpty() && splitSize > 1 && - AbstractContainerMenu.canItemQuickReplace(this.slotReference, itemStack, true)) { - itemStack = itemStack.copy(); - itemStack.grow(AbstractContainerMenu.getQuickCraftPlaceCount(modularUIGui.getQuickCraftSlots(), - modularUIGui.dragSplittingLimit, itemStack)); - int k = Math.min(itemStack.getMaxStackSize(), this.slotReference.getMaxStackSize(itemStack)); - if (itemStack.getCount() > k) { - itemStack.setCount(k); - } - } - } - - if (!itemStack.isEmpty()) { - drawItemStack(graphics, itemStack, pos.x + 1, pos.y + 1, -1, (String) null); - } - } - - this.drawOverlay(graphics, mouseX, mouseY, partialTicks); - if (this.drawHoverOverlay && this.isMouseOverElement((double) mouseX, (double) mouseY) && - this.getHoverElement((double) mouseX, (double) mouseY) == this) { - RenderSystem.colorMask(true, true, true, false); - DrawerHelper.drawSolidRect(graphics, this.getPosition().x + 1, this.getPosition().y + 1, 16, 16, - -2130706433); - RenderSystem.colorMask(true, true, true, true); - } - } - - public static void drawItemStack(@Nonnull GuiGraphics graphics, ItemStack itemStack, int x, int y, int color, - @Nullable String altTxt) { - var a = ColorUtils.alpha(color); - var r = ColorUtils.red(color); - var g = ColorUtils.green(color); - var b = ColorUtils.blue(color); - RenderSystem.setShaderColor(r, g, b, a); - - RenderSystem.enableDepthTest(); - RenderSystem.depthMask(true); - - Minecraft mc = Minecraft.getInstance(); - - graphics.pose().pushPose(); - graphics.pose().translate(0, 0, 100); - - graphics.renderItem(itemStack, x, y); - graphics.pose().translate(0, 0, 100); - - graphics.pose().pushPose(); - - // actual offset bit that's important :3 - int xOffset = 0; - if (itemStack.getCount() / 100_000 != 0) { - xOffset = 9; - } else if (itemStack.getCount() / 10_000 != 0) { - xOffset = 6; - } else if (itemStack.getCount() / 1000 != 0) { - xOffset = 3; - } - - graphics.renderItemDecorations(mc.font, itemStack, x + xOffset, y, altTxt); - graphics.pose().popPose(); - - graphics.pose().popPose(); - - // clear depth buffer,it may cause some rendering issues? - RenderSystem.clear(GL11.GL_DEPTH_BUFFER_BIT, Minecraft.ON_OSX); - RenderSystem.depthMask(false); - RenderSystem.setShaderColor(1F, 1F, 1F, 1F); - RenderSystem.enableBlend(); - RenderSystem.disableDepthTest(); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PatternPreviewWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PatternPreviewWidget.java deleted file mode 100644 index 182707f3530..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PatternPreviewWidget.java +++ /dev/null @@ -1,513 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.widget; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.block.MetaMachineBlock; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; -import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; -import com.gregtechceu.gtceu.api.pattern.BlockPattern; -import com.gregtechceu.gtceu.api.pattern.MultiblockShapeInfo; -import com.gregtechceu.gtceu.api.pattern.TraceabilityPredicate; -import com.gregtechceu.gtceu.api.pattern.predicates.SimplePredicate; -import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.integration.xei.handlers.item.CycleItemEntryHandler; - -import com.lowdragmc.lowdraglib.client.scene.WorldSceneRenderer; -import com.lowdragmc.lowdraglib.client.utils.RenderUtils; -import com.lowdragmc.lowdraglib.gui.editor.ColorPattern; -import com.lowdragmc.lowdraglib.gui.texture.ColorRectTexture; -import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; -import com.lowdragmc.lowdraglib.gui.texture.TextTexture; -import com.lowdragmc.lowdraglib.gui.widget.*; -import com.lowdragmc.lowdraglib.jei.IngredientIO; -import com.lowdragmc.lowdraglib.utils.BlockInfo; -import com.lowdragmc.lowdraglib.utils.BlockPosFace; -import com.lowdragmc.lowdraglib.utils.ItemStackKey; -import com.lowdragmc.lowdraglib.utils.TrackedDummyWorld; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.util.Mth; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Fluid; -import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.HitResult; -import net.minecraft.world.phys.Vec3; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import dev.emi.emi.screen.RecipeScreen; -import it.unimi.dsi.fastutil.longs.LongSet; -import it.unimi.dsi.fastutil.longs.LongSets; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import me.shedaniel.rei.impl.client.gui.screen.AbstractDisplayViewingScreen; -import org.jetbrains.annotations.NotNull; -import org.joml.Vector3f; - -import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -@OnlyIn(Dist.CLIENT) -public class PatternPreviewWidget extends WidgetGroup { - - private boolean isLoaded; - private static TrackedDummyWorld LEVEL; - private static final int REGION_SIZE = 512; - private static int LAST_OFFSET_INDEX = 0; - private static final Map CACHE = new HashMap<>(); - private final SceneWidget sceneWidget; - private final DraggableScrollableWidgetGroup scrollableWidgetGroup; - public final MultiblockMachineDefinition controllerDefinition; - public final MBPattern[] patterns; - private final List predicates; - private int index; - public int layer; - private SlotWidget[] slotWidgets; - private SlotWidget[] candidates; - - protected PatternPreviewWidget(MultiblockMachineDefinition controllerDefinition) { - super(0, 0, 160, 160); - setClientSideWidget(); - this.controllerDefinition = controllerDefinition; - predicates = new ArrayList<>(); - layer = -1; - - addWidget(sceneWidget = new SceneWidget(3, 3, 150, 150, LEVEL) { - - @Override - public void renderBlockOverLay(WorldSceneRenderer renderer) { - PoseStack poseStack = new PoseStack(); - hoverPosFace = null; - hoverItem = null; - if (isMouseOverElement(currentMouseX, currentMouseY)) { - BlockHitResult hit = renderer.getLastTraceResult(); - if (hit != null) { - if (core.contains(hit.getBlockPos())) { - hoverPosFace = new BlockPosFace(hit.getBlockPos(), hit.getDirection()); - } else if (!useOrtho) { - Vector3f hitPos = hit.getLocation().toVector3f(); - Level world = renderer.world; - Vec3 eyePos = new Vec3(renderer.getEyePos()); - hitPos.mul(2); // Double view range to ensure pos can be seen. - Vec3 endPos = new Vec3((hitPos.x - eyePos.x), (hitPos.y - eyePos.y), (hitPos.z - eyePos.z)); - double min = Float.MAX_VALUE; - for (BlockPos pos : core) { - BlockState blockState = world.getBlockState(pos); - if (blockState.getBlock() == Blocks.AIR) { - continue; - } - hit = world.clipWithInteractionOverride(eyePos, endPos, pos, - blockState.getShape(world, pos), blockState); - if (hit != null && hit.getType() != HitResult.Type.MISS) { - double dist = eyePos.distanceToSqr(hit.getLocation()); - if (dist < min) { - min = dist; - hoverPosFace = new BlockPosFace(hit.getBlockPos(), hit.getDirection()); - } - } - } - } - } - } - if (hoverPosFace != null) { - var state = getDummyWorld().getBlockState(hoverPosFace.pos); - hoverItem = state.getBlock().getCloneItemStack(getDummyWorld(), hoverPosFace.pos, state); - } - BlockPosFace tmp = dragging ? clickPosFace : hoverPosFace; - if (selectedPosFace != null || tmp != null) { - if (selectedPosFace != null && renderFacing) { - drawFacingBorder(poseStack, selectedPosFace, 0xff00ff00); - } - if (tmp != null && !tmp.equals(selectedPosFace) && renderFacing) { - drawFacingBorder(poseStack, tmp, 0xffffffff); - } - } - if (selectedPosFace != null && renderSelect) { - RenderUtils.renderBlockOverLay(poseStack, selectedPosFace.pos, 0.6f, 0, 0, 1.03f); - } - - if (this.afterWorldRender != null) { - this.afterWorldRender.accept(this); - } - } - } - .setOnSelected(this::onPosSelected) - .setRenderFacing(false) - .setRenderFacing(false)); - - scrollableWidgetGroup = new DraggableScrollableWidgetGroup(3, 132, 154, 22) - .setXScrollBarHeight(4) - .setXBarStyle(GuiTextures.SLIDER_BACKGROUND, GuiTextures.BUTTON) - .setScrollable(true) - .setDraggable(true); - scrollableWidgetGroup.setScrollWheelDirection(DraggableScrollableWidgetGroup.ScrollWheelDirection.HORIZONTAL); - scrollableWidgetGroup.setScrollYOffset(0); - addWidget(scrollableWidgetGroup); - - if (ConfigHolder.INSTANCE.client.useVBO) { - if (!RenderSystem.isOnRenderThread()) { - RenderSystem.recordRenderCall(sceneWidget::useCacheBuffer); - } else { - sceneWidget.useCacheBuffer(); - } - } - - addWidget(new ImageWidget(3, 3, 160, 10, - new TextTexture(controllerDefinition.getDescriptionId(), -1) - .setType(TextTexture.TextType.ROLL) - .setWidth(170) - .setDropShadow(true))); - - this.patterns = CACHE.computeIfAbsent(controllerDefinition, definition -> { - HashSet drops = new HashSet<>(); - drops.add(new ItemStackKey(this.controllerDefinition.asStack())); - return controllerDefinition.getMatchingShapes().stream() - .map(it -> initializePattern(it, drops)) - .filter(Objects::nonNull) - .toArray(MBPattern[]::new); - }); - - addWidget(new ButtonWidget(138, 30, 18, 18, new GuiTextureGroup( - ColorPattern.T_GRAY.rectTexture(), - new TextTexture("1").setSupplier(() -> "P:" + index)), - (x) -> setPage((index + 1 >= patterns.length) ? 0 : index + 1)) - .setHoverBorderTexture(1, -1)); - - addWidget(new ButtonWidget(138, 50, 18, 18, new GuiTextureGroup( - ColorPattern.T_GRAY.rectTexture(), - new TextTexture("1").setSupplier(() -> layer >= 0 ? "L:" + layer : "ALL")), - cd -> updateLayer()) - .setHoverBorderTexture(1, -1)); - - setPage(0); - } - - private void updateLayer() { - MBPattern pattern = patterns[index]; - if (layer + 1 >= -1 && layer + 1 <= pattern.maxY - pattern.minY) { - layer += 1; - if (pattern.controllerBase.isFormed()) { - onFormedSwitch(false); - } - } else { - layer = -1; - if (!pattern.controllerBase.isFormed()) { - onFormedSwitch(true); - } - } - setupScene(pattern); - } - - private void setupScene(MBPattern pattern) { - Stream stream = pattern.blockMap.keySet().stream() - .filter(pos -> layer == -1 || layer + pattern.minY == pos.getY()); - if (pattern.controllerBase.isFormed()) { - LongSet modelDisabled = pattern.controllerBase.getMultiblockState().getMatchContext().getOrDefault( - "renderMask", - LongSets.EMPTY_SET); - if (!modelDisabled.isEmpty()) { - stream = stream.filter(pos -> !modelDisabled.contains(pos.asLong())); - } - } - sceneWidget.setRenderedCore(stream.toList(), null); - } - - public static PatternPreviewWidget getPatternWidget(MultiblockMachineDefinition controllerDefinition) { - if (LEVEL == null) { - if (Minecraft.getInstance().level == null) { - GTCEu.LOGGER.error("Try to init pattern previews before level load"); - throw new IllegalStateException(); - } - LEVEL = new TrackedDummyWorld(); - } - return new PatternPreviewWidget(controllerDefinition); - } - - public void setPage(int index) { - if (index >= patterns.length || index < 0) return; - this.index = index; - this.layer = -1; - MBPattern pattern = patterns[index]; - setupScene(pattern); - if (slotWidgets != null) { - for (SlotWidget slotWidget : slotWidgets) { - scrollableWidgetGroup.removeWidget(slotWidget); - } - } - slotWidgets = new SlotWidget[Math.min(pattern.parts.size(), 18)]; - CycleItemEntryHandler itemHandler = CycleItemEntryHandler.fromStacks(pattern.parts); - int xOffset = 0; - for (int i = 0; i < slotWidgets.length; i++) { - int padding = 1; - if (itemHandler.getStackInSlot(i).getCount() / 100_000 >= 1) { - padding = 10; - } else if (itemHandler.getStackInSlot(i).getCount() / 10_000 >= 1) { - padding = 7; - } else if (itemHandler.getStackInSlot(i).getCount() / 1_000 >= 1) { - padding = 4; - } - - slotWidgets[i] = new PatternPreviewSlotWidget(itemHandler, i, (4 + xOffset + padding), 0, false, false) - .setBackgroundTexture(ColorPattern.T_GRAY.rectTexture()) - .setIngredientIO(IngredientIO.INPUT); - xOffset += 18 + (2 * padding); - scrollableWidgetGroup.addWidget(slotWidgets[i]); - } - } - - private void onFormedSwitch(boolean isFormed) { - MBPattern pattern = patterns[index]; - MultiblockControllerMachine controllerBase = pattern.controllerBase; - if (isFormed) { - this.layer = -1; - loadControllerFormed(pattern.blockMap.keySet(), controllerBase); - } else { - sceneWidget.setRenderedCore(pattern.blockMap.keySet(), null); - controllerBase.onStructureInvalid(); - } - } - - private void onPosSelected(BlockPos pos, Direction facing) { - if (index >= patterns.length || index < 0) return; - TraceabilityPredicate predicate = patterns[index].predicateMap.get(pos); - if (predicate != null) { - predicates.clear(); - predicates.addAll(predicate.common); - predicates.addAll(predicate.limited); - predicates.removeIf(p -> p == null || p.candidates == null); // why it happens? - if (candidates != null) { - for (SlotWidget candidate : candidates) { - removeWidget(candidate); - } - } - List> candidateStacks = new ArrayList<>(); - List> predicateTips = new ArrayList<>(); - for (SimplePredicate simplePredicate : predicates) { - List itemStacks = simplePredicate.getCandidates(); - if (!itemStacks.isEmpty()) { - candidateStacks.add(itemStacks); - predicateTips.add(simplePredicate.getToolTips(predicate)); - } - } - candidates = new SlotWidget[candidateStacks.size()]; - CycleItemEntryHandler itemHandler = CycleItemEntryHandler.fromStacks(candidateStacks); - int maxCol = (160 - (((slotWidgets.length - 1) / 9 + 1) * 18) - 35) % 18; - for (int i = 0; i < candidateStacks.size(); i++) { - int finalI = i; - candidates[i] = new SlotWidget(itemHandler, i, 3 + (i / maxCol) * 18, 3 + (i % maxCol) * 18, false, - false) - .setIngredientIO(IngredientIO.INPUT) - .setBackgroundTexture(new ColorRectTexture(0x4fffffff)) - .setOnAddedTooltips((slot, list) -> list.addAll(predicateTips.get(finalI))); - addWidget(candidates[i]); - } - } - } - - /** - * Finds the next section of the dummy preview level to place a multiblock at in a spiral pattern. - *

- * This results in positions that are considerably closer to the world origin than - * the one it replaces, which did {@code prevPos.offset(500, 0, 500)}, - * which results in absurdly high offsets for the later multiblocks. - *

- * The regions being closer to {@code (0,0)} means that Z-fighting should be less likely, - * since floating point inaccuracies won't be as large of a factor. - * - * @return the area to place the current multiblock at - */ - public static BlockPos locateNextRegion() { - int currentIndex = LAST_OFFSET_INDEX++; - - // Origin coordinates scaled back to the offset value, from global - int x = 0, z = 0; - if (currentIndex > 0) { - int v = (int) (Mth.sqrt(currentIndex + 0.25f) - 0.5f); - int nextV = v + 1; - int spiralBaseIndex = v * nextV; - // this is 1 or -1 depending on if v is odd or even - int flipFlop = (v & 1) * 2 - 1; - - int offset = flipFlop * nextV / 2; - x += offset; - z += offset; - - int cornerIndex = spiralBaseIndex + nextV; - if (currentIndex < cornerIndex) { - x -= flipFlop * (currentIndex - spiralBaseIndex + 1); - } else { - x -= flipFlop * nextV; - z -= flipFlop * (currentIndex - cornerIndex + 1); - } - } - return new BlockPos(x * REGION_SIZE, 50, z * REGION_SIZE); - } - - @Override - public void updateScreen() { - super.updateScreen(); - // I can only think of this way - if (!isLoaded && GTCEu.Mods.isEMILoaded() && Minecraft.getInstance().screen instanceof RecipeScreen) { - setPage(0); - isLoaded = true; - } else if (!isLoaded && GTCEu.Mods.isREILoaded() && - Minecraft.getInstance().screen instanceof AbstractDisplayViewingScreen) { - setPage(0); - isLoaded = true; - } - } - - @Override - public void drawInBackground(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - RenderSystem.enableBlend(); - super.drawInBackground(graphics, mouseX, mouseY, partialTicks); - } - - private MBPattern initializePattern(MultiblockShapeInfo shapeInfo, HashSet blockDrops) { - Map blockMap = new HashMap<>(); - MultiblockControllerMachine controllerBase = null; - BlockPos multiPos = locateNextRegion(); - - BlockInfo[][][] blocks = shapeInfo.getBlocks(); - for (int x = 0; x < blocks.length; x++) { - BlockInfo[][] aisle = blocks[x]; - for (int y = 0; y < aisle.length; y++) { - BlockInfo[] column = aisle[y]; - for (int z = 0; z < column.length; z++) { - BlockState blockState = column[z].getBlockState(); - BlockPos pos = multiPos.offset(x, y, z); - if (column[z].getBlockEntity(pos) instanceof MultiblockControllerMachine controller) { - controller.setLevel(LEVEL); - controllerBase = controller; - } - blockMap.put(pos, BlockInfo.fromBlockState(blockState)); - } - } - } - - LEVEL.addBlocks(blockMap); - if (controllerBase != null) { - LEVEL.setInnerBlockEntity(controllerBase); - } - - Map parts = gatherBlockDrops(blockMap); - blockDrops.addAll(parts.keySet()); - - Map predicateMap = new HashMap<>(); - if (controllerBase != null) { - loadControllerFormed(predicateMap.keySet(), controllerBase); - predicateMap = controllerBase.getMultiblockState().getMatchContext().get("predicates"); - } - return controllerBase == null ? null : new MBPattern(blockMap, parts.values().stream().sorted((one, two) -> { - if (one.isController) return -1; - if (two.isController) return +1; - if (one.isTile && !two.isTile) return -1; - if (two.isTile && !one.isTile) return +1; - if (one.blockId != two.blockId) return two.blockId - one.blockId; - return two.amount - one.amount; - }).map(PartInfo::getItemStack).filter(list -> !list.isEmpty()).collect(Collectors.toList()), predicateMap, - controllerBase); - } - - private void loadControllerFormed(Collection positions, MultiblockControllerMachine controllerBase) { - BlockPattern pattern = controllerBase.getPattern(); - if (pattern != null && pattern.checkPatternAt(controllerBase.getMultiblockState(), true)) { - controllerBase.onStructureFormed(); - } - if (controllerBase.isFormed()) { - LongSet modelDisabled = controllerBase.getMultiblockState().getMatchContext().getOrDefault("renderMask", - LongSets.EMPTY_SET); - if (!modelDisabled.isEmpty()) { - positions = new HashSet<>(positions); - positions.removeIf(pos -> modelDisabled.contains(pos.asLong())); - } - sceneWidget.setRenderedCore(positions, null); - } else { - GTCEu.LOGGER.warn("Pattern formed checking failed: {}", controllerBase.self().getDefinition()); - } - } - - private Map gatherBlockDrops(Map blocks) { - Map partsMap = new Object2ObjectOpenHashMap<>(); - for (Map.Entry entry : blocks.entrySet()) { - BlockPos pos = entry.getKey(); - BlockState blockState = PatternPreviewWidget.LEVEL.getBlockState(pos); - ItemStack itemStack = blockState.getBlock().getCloneItemStack(PatternPreviewWidget.LEVEL, pos, blockState); - - if (itemStack.isEmpty() && !blockState.getFluidState().isEmpty()) { - Fluid fluid = blockState.getFluidState().getType(); - itemStack = fluid.getBucket().getDefaultInstance(); - } - - ItemStackKey itemStackKey = new ItemStackKey(itemStack); - partsMap.computeIfAbsent(itemStackKey, key -> new PartInfo(key, entry.getValue())).amount++; - } - return partsMap; - } - - private static class PartInfo { - - final ItemStackKey itemStackKey; - boolean isController = false; - boolean isTile = false; - final int blockId; - int amount = 0; - - PartInfo(final ItemStackKey itemStackKey, final BlockInfo blockInfo) { - this.itemStackKey = itemStackKey; - this.blockId = Block.getId(blockInfo.getBlockState()); - this.isTile = blockInfo.hasBlockEntity(); - - if (blockInfo.getBlockState().getBlock() instanceof MetaMachineBlock block) { - if (block.definition instanceof MultiblockMachineDefinition) - this.isController = true; - } - } - - public List getItemStack() { - return Arrays.stream(itemStackKey.getItemStack()) - .map(stack -> stack.copyWithCount(amount)) - .filter(item -> !item.isEmpty()) - .toList(); - } - } - - public static class MBPattern { - - @NotNull - final List> parts; - @NotNull - final Map predicateMap; - @NotNull - final Map blockMap; - @NotNull - final MultiblockControllerMachine controllerBase; - final int maxY, minY; - - public MBPattern(@NotNull Map blockMap, @NotNull List> parts, - @NotNull Map predicateMap, - @NotNull MultiblockControllerMachine controllerBase) { - this.parts = parts; - this.blockMap = blockMap; - this.predicateMap = predicateMap; - this.controllerBase = controllerBase; - int min = Integer.MAX_VALUE, max = Integer.MIN_VALUE; - for (BlockPos pos : blockMap.keySet()) { - min = Math.min(min, pos.getY()); - max = Math.max(max, pos.getY()); - } - minY = min; - maxY = max; - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PhantomFluidWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PhantomFluidWidget.java deleted file mode 100644 index efed72f4039..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PhantomFluidWidget.java +++ /dev/null @@ -1,268 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.widget; - -import com.gregtechceu.gtceu.GTCEu; - -import com.lowdragmc.lowdraglib.gui.editor.annotation.ConfigSetter; -import com.lowdragmc.lowdraglib.gui.editor.annotation.LDLRegister; -import com.lowdragmc.lowdraglib.gui.editor.configurator.IConfigurableWidget; -import com.lowdragmc.lowdraglib.gui.ingredient.IGhostIngredientTarget; -import com.lowdragmc.lowdraglib.gui.ingredient.Target; -import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; -import com.lowdragmc.lowdraglib.gui.util.TextFormattingUtil; -import com.lowdragmc.lowdraglib.side.fluid.forge.FluidHelperImpl; -import com.lowdragmc.lowdraglib.utils.Position; -import com.lowdragmc.lowdraglib.utils.Size; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Font; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.renderer.Rect2i; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.level.material.Fluid; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidType; -import net.minecraftforge.fluids.FluidUtil; -import net.minecraftforge.fluids.capability.IFluidHandler; -import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; - -import com.google.common.collect.Lists; -import com.mojang.blaze3d.systems.RenderSystem; -import dev.emi.emi.api.stack.EmiStack; -import lombok.Getter; -import lombok.Setter; -import mezz.jei.api.ingredients.ITypedIngredient; -import org.jetbrains.annotations.NotNull; - -import java.util.Collections; -import java.util.List; -import java.util.function.Consumer; -import java.util.function.Supplier; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -@LDLRegister(name = "gtm_phantom_fluid_slot", group = "widget.gtm_container", priority = 50) -public class PhantomFluidWidget extends TankWidget implements IGhostIngredientTarget, IConfigurableWidget { - - @Setter - private Supplier phantomFluidGetter; - @Setter - private Consumer phantomFluidSetter; - - @Nullable - @Getter - protected FluidStack lastPhantomStack; - - public PhantomFluidWidget() { - super(); - } - - public PhantomFluidWidget(@Nullable IFluidHandler fluidTank, int tank, int x, int y, int width, int height, - Supplier phantomFluidGetter, Consumer phantomFluidSetter) { - super(fluidTank, tank, x, y, width, height, false, false); - this.phantomFluidGetter = phantomFluidGetter; - this.phantomFluidSetter = phantomFluidSetter; - } - - @ConfigSetter(field = "allowClickFilled") - public PhantomFluidWidget setAllowClickFilled(boolean v) { - // you cant modify it - return this; - } - - @ConfigSetter(field = "allowClickDrained") - public PhantomFluidWidget setAllowClickDrained(boolean v) { - // you cant modify it - return this; - } - - protected void setLastPhantomStack(FluidStack fluid) { - if (fluid != null) { - this.lastPhantomStack = fluid.copy(); - this.lastPhantomStack.setAmount(1); - } else { - this.lastPhantomStack = null; - } - } - - public static FluidStack drainFrom(Object ingredient) { - if (ingredient instanceof Ingredient ing) { - var items = ing.getItems(); - if (items.length > 0) { - ingredient = items[0]; - } - } - if (ingredient instanceof ItemStack itemStack) { - return FluidUtil.getFluidHandler(itemStack) - .map(h -> h.drain(Integer.MAX_VALUE, FluidAction.SIMULATE)) - .orElse(FluidStack.EMPTY); - } - return FluidStack.EMPTY; - } - - @Override - @OnlyIn(Dist.CLIENT) - public List getPhantomTargets(Object ingredient) { - if (GTCEu.Mods.isREILoaded() && ingredient instanceof dev.architectury.fluid.FluidStack fluidStack) { - ingredient = new FluidStack(fluidStack.getFluid(), (int) fluidStack.getAmount(), fluidStack.getTag()); - } else if (GTCEu.Mods.isEMILoaded() && ingredient instanceof EmiStack emiStack) { - var key = emiStack.getKey(); - if (key instanceof Fluid f) { - int amount = emiStack.getAmount() == 0 ? 1000 : (int) emiStack.getAmount(); - ingredient = new FluidStack(f, amount, emiStack.getNbt()); - } else if (key instanceof Item i) { - ingredient = new ItemStack(i, (int) emiStack.getAmount()); - ((ItemStack) ingredient).setTag(emiStack.getNbt()); - } else { - ingredient = null; - } - } else if (GTCEu.Mods.isJEILoaded() && ingredient instanceof ITypedIngredient jeiStack) { - ingredient = jeiStack.getIngredient(); - } - - if (!(ingredient instanceof FluidStack) && drainFrom(ingredient).isEmpty()) { - return Collections.emptyList(); - } - - Rect2i rectangle = toRectangleBox(); - return Lists.newArrayList(new Target() { - - @Nonnull - @Override - public Rect2i getArea() { - return rectangle; - } - - @Override - public void accept(@Nonnull Object ingredient) { - if (GTCEu.Mods.isREILoaded() && ingredient instanceof dev.architectury.fluid.FluidStack fluidStack) { - ingredient = new FluidStack(fluidStack.getFluid(), - (int) fluidStack.getAmount(), - fluidStack.getTag()); - } else if (GTCEu.Mods.isEMILoaded() && ingredient instanceof EmiStack emiStack) { - var key = emiStack.getKey(); - if (key instanceof Fluid f) { - int amount = emiStack.getAmount() == 0 ? 1000 : (int) emiStack.getAmount(); - ingredient = new FluidStack(f, amount, emiStack.getNbt()); - } else if (key instanceof Item i) { - ingredient = new ItemStack(i, (int) emiStack.getAmount()); - ((ItemStack) ingredient).setTag(emiStack.getNbt()); - } else { - ingredient = null; - } - } - - FluidStack ingredientStack; - if (ingredient instanceof FluidStack fluidStack) ingredientStack = fluidStack; - else ingredientStack = drainFrom(ingredient); - - if (!ingredientStack.isEmpty()) { - writeClientAction(2, ingredientStack::writeToPacket); - } - - if (isClientSideWidget) { - if (phantomFluidSetter != null) { - phantomFluidSetter.accept(ingredientStack); - } - } - } - }); - } - - @Override - public void handleClientAction(int id, FriendlyByteBuf buffer) { - if (id == 1) { - handlePhantomClick(); - } else if (id == 2) { - if (phantomFluidSetter != null) { - phantomFluidSetter.accept(FluidStack.readFromPacket(buffer)); - } - } else if (id == 4) { - phantomFluidSetter.accept(FluidStack.EMPTY); - } else if (id == 5) { - phantomFluidSetter.accept(FluidStack.readFromPacket(buffer)); - } - } - - @Override - public void detectAndSendChanges() { - super.detectAndSendChanges(); - FluidStack stack = phantomFluidGetter.get(); - if (stack == null || stack.isEmpty()) { - if (lastPhantomStack != null) { - setLastPhantomStack(null); - writeUpdateInfo(4, buf -> {}); - } - } else if (lastPhantomStack == null || !stack.isFluidEqual(lastPhantomStack)) { - setLastPhantomStack(stack); - writeUpdateInfo(5, stack::writeToPacket); - } - } - - @Override - @OnlyIn(Dist.CLIENT) - public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (isMouseOverElement(mouseX, mouseY)) { - if (isClientSideWidget) { - handlePhantomClick(); - } else { - writeClientAction(1, buffer -> {}); - } - return true; - } - return false; - } - - private void handlePhantomClick() { - ItemStack itemStack = gui.getModularUIContainer().getCarried(); - FluidStack fluid = FluidUtil.getFluidContained(itemStack) - .map(f -> new FluidStack(f, FluidType.BUCKET_VOLUME)) - .orElse(FluidStack.EMPTY); - if (phantomFluidSetter != null) phantomFluidSetter.accept(fluid); - } - - @Override - public void drawInBackground(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - if (this.lastFluidInTank != null) { - super.drawInBackground(graphics, mouseX, mouseY, partialTicks); - return; - } - Position pos = getPosition(); - Size size = getSize(); - FluidStack stack = phantomFluidGetter.get(); - if (stack != null && !stack.isEmpty()) { - RenderSystem.disableBlend(); - - double progress = stack.getAmount() * 1.0 / Math.max(Math.max(stack.getAmount(), lastTankCapacity), 1); - float drawnU = (float) fillDirection.getDrawnU(progress); - float drawnV = (float) fillDirection.getDrawnV(progress); - float drawnWidth = (float) fillDirection.getDrawnWidth(progress); - float drawnHeight = (float) fillDirection.getDrawnHeight(progress); - int width = size.width - 2; - int height = size.height - 2; - int x = pos.x + 1; - int y = pos.y + 1; - DrawerHelper.drawFluidForGui(graphics, FluidHelperImpl.toFluidStack(stack), stack.getAmount(), - (int) (x + drawnU * width), (int) (y + drawnV * height), ((int) (width * drawnWidth)), - ((int) (height * drawnHeight))); - if (showAmount) { - graphics.pose().pushPose(); - graphics.pose().scale(0.5F, 0.5F, 1); - String s = TextFormattingUtil.formatLongToCompactStringBuckets(stack.getAmount(), 3) + "B"; - Font fontRenderer = Minecraft.getInstance().font; - graphics.drawString(fontRenderer, s, - (int) ((pos.x + (size.width / 3f)) * 2 - fontRenderer.width(s) + 21), - (int) ((pos.y + (size.height / 3f) + 6) * 2), 0xFFFFFF, true); - graphics.pose().popPose(); - } - - RenderSystem.enableBlend(); - RenderSystem.setShaderColor(1, 1, 1, 1); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PhantomSlotWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PhantomSlotWidget.java deleted file mode 100644 index 190de3930ff..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PhantomSlotWidget.java +++ /dev/null @@ -1,258 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.widget; - -import com.gregtechceu.gtceu.GTCEu; - -import com.lowdragmc.lowdraglib.gui.editor.annotation.ConfigSetter; -import com.lowdragmc.lowdraglib.gui.editor.annotation.Configurable; -import com.lowdragmc.lowdraglib.gui.editor.annotation.LDLRegister; -import com.lowdragmc.lowdraglib.gui.editor.annotation.NumberRange; -import com.lowdragmc.lowdraglib.gui.editor.configurator.IConfigurableWidget; -import com.lowdragmc.lowdraglib.gui.ingredient.IGhostIngredientTarget; -import com.lowdragmc.lowdraglib.gui.ingredient.Target; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.Rect2i; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.ClickType; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.items.IItemHandlerModifiable; - -import com.google.common.collect.Lists; -import com.mojang.blaze3d.platform.InputConstants; -import dev.emi.emi.api.stack.EmiStack; -import mezz.jei.api.ingredients.ITypedIngredient; -import org.lwjgl.glfw.GLFW; - -import java.util.Collections; -import java.util.List; -import java.util.function.Predicate; - -import javax.annotation.Nonnull; - -@LDLRegister(name = "gtm_phantom_item_slot", group = "widget.gtm_container", priority = 50) -public class PhantomSlotWidget extends SlotWidget implements IGhostIngredientTarget, IConfigurableWidget { - - private boolean clearSlotOnRightClick; - - @Configurable - @NumberRange(range = { 0, 64 }) - private int maxStackSize = 64; - - private Predicate validator = stack -> true; - - public PhantomSlotWidget() { - super(); - } - - public PhantomSlotWidget(IItemHandlerModifiable itemHandler, int slotIndex, int xPosition, int yPosition) { - super(itemHandler, slotIndex, xPosition, yPosition, true, true); - } - - public PhantomSlotWidget(IItemHandlerModifiable itemHandler, int slotIndex, int xPosition, int yPosition, - Predicate validator) { - super(itemHandler, slotIndex, xPosition, yPosition, true, true); - this.validator = validator; - } - - public PhantomSlotWidget setClearSlotOnRightClick(boolean clearSlotOnRightClick) { - this.clearSlotOnRightClick = clearSlotOnRightClick; - return this; - } - - @ConfigSetter(field = "canTakeItems") - public PhantomSlotWidget setCanTakeItems(boolean v) { - // you cant modify it - return this; - } - - @ConfigSetter(field = "canPutItems") - public PhantomSlotWidget setCanPutItems(boolean v) { - // you cant modify it - return this; - } - - public PhantomSlotWidget setMaxStackSize(int stackSize) { - maxStackSize = stackSize; - return this; - } - - @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (slotReference != null && isMouseOverElement(mouseX, mouseY) && gui != null) { - if (isClientSideWidget && !gui.getModularUIContainer().getCarried().isEmpty()) { - slotReference.set(gui.getModularUIContainer().getCarried()); - } else if (button == 1 && clearSlotOnRightClick && !slotReference.getItem().isEmpty()) { - slotReference.set(ItemStack.EMPTY); - writeClientAction(2, buf -> {}); - } else { - HOVER_SLOT = slotReference; - gui.getModularUIGui().superMouseClicked(mouseX, mouseY, button); - HOVER_SLOT = null; - } - return true; - } - return false; - } - - @Override - public ItemStack slotClick(int dragType, ClickType clickTypeIn, Player player) { - if (slotReference != null && gui != null) { - ItemStack stackHeld = gui.getModularUIContainer().getCarried(); - return slotClickPhantom(slotReference, dragType, clickTypeIn, stackHeld); - } - return ItemStack.EMPTY; - } - - @Override - public boolean canMergeSlot(ItemStack stack) { - return false; - } - - @Override - public boolean canTakeStack(Player player) { - return false; - } - - @Override - public boolean canPutStack(ItemStack stack) { - return false; - } - - @Override - @OnlyIn(Dist.CLIENT) - public List getPhantomTargets(Object ingredient) { - if (GTCEu.Mods.isEMILoaded() && ingredient instanceof EmiStack emiStack) { - Item item = emiStack.getKeyOfType(Item.class); - if (item != null) { - ingredient = new ItemStack(item, (int) emiStack.getAmount()); - ((ItemStack) ingredient).setTag(emiStack.getNbt()); - } - } else if (GTCEu.Mods.isJEILoaded() && ingredient instanceof ITypedIngredient jeiStack) { - ingredient = jeiStack.getItemStack().orElse(null); - } - if (!(ingredient instanceof ItemStack)) { - return Collections.emptyList(); - } - - Rect2i rectangle = toRectangleBox(); - return Lists.newArrayList(new Target() { - - @Nonnull - @Override - public Rect2i getArea() { - return rectangle; - } - - @Override - public void accept(@Nonnull Object ingredient) { - if (GTCEu.Mods.isEMILoaded() && ingredient instanceof EmiStack emiStack) { - Item item = emiStack.getKeyOfType(Item.class); - if (item != null) { - ingredient = new ItemStack(item, (int) emiStack.getAmount()); - ((ItemStack) ingredient).setTag(emiStack.getNbt()); - } - } else if (GTCEu.Mods.isJEILoaded() && ingredient instanceof ITypedIngredient jeiStack) { - ingredient = jeiStack.getItemStack().orElse(null); - } - if (slotReference != null && ingredient instanceof ItemStack stack) { - long id = Minecraft.getInstance().getWindow().getWindow(); - boolean shiftDown = InputConstants.isKeyDown(id, GLFW.GLFW_KEY_LEFT_SHIFT); - ClickType clickType = shiftDown ? ClickType.QUICK_MOVE : ClickType.PICKUP; - slotClickPhantom(slotReference, 0, clickType, stack); - writeClientAction(1, buffer -> { - buffer.writeItem(stack); - buffer.writeVarInt(0); - buffer.writeBoolean(shiftDown); - }); - } - } - }); - } - - @Override - public void handleClientAction(int id, FriendlyByteBuf buffer) { - if (slotReference != null && id == 1) { - ItemStack stackHeld = buffer.readItem(); - int mouseButton = buffer.readVarInt(); - boolean shiftKeyDown = buffer.readBoolean(); - ClickType clickType = shiftKeyDown ? ClickType.QUICK_MOVE : ClickType.PICKUP; - slotClickPhantom(slotReference, mouseButton, clickType, stackHeld); - } else if (slotReference != null && id == 2) { - slotReference.set(ItemStack.EMPTY); - } - } - - public ItemStack slotClickPhantom(Slot slot, int mouseButton, ClickType clickTypeIn, ItemStack stackHeld) { - ItemStack stack = ItemStack.EMPTY; - - ItemStack stackSlot = slot.getItem(); - if (!stackSlot.isEmpty()) { - stack = stackSlot.copy(); - } - - if (mouseButton == 2) { - fillPhantomSlot(slot, ItemStack.EMPTY, mouseButton); - } else if (mouseButton == 0 || mouseButton == 1) { - - if (stackSlot.isEmpty()) { - if (!stackHeld.isEmpty()) { - fillPhantomSlot(slot, stackHeld, mouseButton); - } - } else if (stackHeld.isEmpty()) { - adjustPhantomSlot(slot, mouseButton, clickTypeIn); - } else { - if (!areItemsEqual(stackSlot, stackHeld)) { - adjustPhantomSlot(slot, mouseButton, clickTypeIn); - } - fillPhantomSlot(slot, stackHeld, mouseButton); - } - } else if (mouseButton == 5) { - if (!slot.hasItem()) { - fillPhantomSlot(slot, stackHeld, mouseButton); - } - } - return stack; - } - - private void adjustPhantomSlot(Slot slot, int mouseButton, ClickType clickTypeIn) { - ItemStack stackSlot = slot.getItem(); - int stackSize; - if (clickTypeIn == ClickType.QUICK_MOVE) { - stackSize = mouseButton == 0 ? (stackSlot.getCount() + 1) / 2 : stackSlot.getCount() * 2; - } else { - stackSize = mouseButton == 0 ? stackSlot.getCount() - 1 : stackSlot.getCount() + 1; - } - - if (stackSize > slot.getMaxStackSize()) { - stackSize = slot.getMaxStackSize(); - } - - stackSlot.setCount(Math.min(maxStackSize, stackSize)); - - slot.set(stackSlot); - } - - private void fillPhantomSlot(Slot slot, ItemStack stackHeld, int mouseButton) { - if (stackHeld.isEmpty()) { - slot.set(ItemStack.EMPTY); - return; - } - - int stackSize = mouseButton == 0 ? stackHeld.getCount() : 1; - if (stackSize > slot.getMaxStackSize()) { - stackSize = slot.getMaxStackSize(); - } - ItemStack phantomStack = stackHeld.copy(); - phantomStack.setCount(Math.min(maxStackSize, stackSize)); - if (validator.test(phantomStack)) slot.set(phantomStack); - } - - public boolean areItemsEqual(ItemStack itemStack1, ItemStack itemStack2) { - return ItemStack.matches(itemStack1, itemStack2); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PredicatedButtonWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PredicatedButtonWidget.java deleted file mode 100644 index 11b8e95e682..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PredicatedButtonWidget.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.widget; - -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.util.ClickData; -import com.lowdragmc.lowdraglib.gui.widget.ButtonWidget; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -import java.util.function.BooleanSupplier; -import java.util.function.Consumer; - -public class PredicatedButtonWidget extends ButtonWidget { - - private final BooleanSupplier predicate; - - public PredicatedButtonWidget(int xPosition, int yPosition, int width, int height, IGuiTexture buttonTexture, - Consumer onPressed, BooleanSupplier predicate, boolean defaultVisibility) { - super(xPosition, yPosition, width, height, buttonTexture, onPressed); - this.predicate = predicate; - setVisible(defaultVisibility); - } - - public PredicatedButtonWidget(int xPosition, int yPosition, int width, int height, IGuiTexture buttonTexture, - Consumer onPressed, BooleanSupplier predicate) { - this(xPosition, yPosition, width, height, buttonTexture, onPressed, predicate, false); - } - - public PredicatedButtonWidget(int xPosition, int yPosition, int width, int height, Consumer onPressed, - BooleanSupplier predicate) { - super(xPosition, yPosition, width, height, onPressed); - this.predicate = predicate; - } - - @Override - public void writeInitialData(FriendlyByteBuf buffer) { - super.writeInitialData(buffer); - var result = predicate == null || predicate.getAsBoolean(); - setVisible(result); - buffer.writeBoolean(result); - } - - @Override - public void readInitialData(FriendlyByteBuf buffer) { - super.readInitialData(buffer); - setVisible(buffer.readBoolean()); - } - - @Override - public void detectAndSendChanges() { - super.detectAndSendChanges(); - if (predicate != null) { - if (isVisible() != predicate.getAsBoolean()) { - setVisible(!isVisible()); - writeUpdateInfo(1, buf -> buf.writeBoolean(isVisible())); - } - } - } - - @Override - @OnlyIn(Dist.CLIENT) - public void readUpdateInfo(int id, FriendlyByteBuf buffer) { - if (id == 1) { - setVisible(buffer.readBoolean()); - } else { - super.readUpdateInfo(id, buffer); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PredicatedImageWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PredicatedImageWidget.java deleted file mode 100644 index be26db6e526..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PredicatedImageWidget.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.widget; - -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; - -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -import lombok.Setter; -import lombok.experimental.Accessors; -import org.jetbrains.annotations.NotNull; - -import java.util.function.BooleanSupplier; - -@Accessors(chain = true) -public class PredicatedImageWidget extends ImageWidget { - - @Setter - private BooleanSupplier predicate; - private boolean isVisible = true; - - public PredicatedImageWidget(int xPosition, int yPosition, int width, int height, IGuiTexture area) { - super(xPosition, yPosition, width, height, area); - } - - @Override - public void writeInitialData(FriendlyByteBuf buffer) { - super.writeInitialData(buffer); - isVisible = predicate == null || predicate.getAsBoolean(); - buffer.writeBoolean(isVisible); - } - - @Override - public void readInitialData(FriendlyByteBuf buffer) { - super.readInitialData(buffer); - isVisible = buffer.readBoolean(); - } - - @Override - public void detectAndSendChanges() { - super.detectAndSendChanges(); - if (predicate != null) { - if (isVisible != predicate.getAsBoolean()) { - isVisible = !isVisible; - writeUpdateInfo(1, buf -> buf.writeBoolean(isVisible)); - } - } - } - - @Override - @OnlyIn(Dist.CLIENT) - public void readUpdateInfo(int id, FriendlyByteBuf buffer) { - if (id == 1) { - isVisible = buffer.readBoolean(); - } else { - super.readUpdateInfo(id, buffer); - } - } - - @Override - @OnlyIn(Dist.CLIENT) - public void drawInBackground(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - if (isVisible) { - super.drawInBackground(graphics, mouseX, mouseY, partialTicks); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ProspectingMapWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ProspectingMapWidget.java deleted file mode 100644 index 56afaf9f62b..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ProspectingMapWidget.java +++ /dev/null @@ -1,371 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.widget; - -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.misc.PacketProspecting; -import com.gregtechceu.gtceu.api.gui.misc.ProspectorMode; -import com.gregtechceu.gtceu.api.gui.texture.ProspectingTexture; -import com.gregtechceu.gtceu.api.item.IComponentItem; -import com.gregtechceu.gtceu.common.item.behavior.ProspectorScannerBehavior; -import com.gregtechceu.gtceu.integration.map.WaypointManager; -import com.gregtechceu.gtceu.integration.map.cache.client.GTClientCache; -import com.gregtechceu.gtceu.integration.map.cache.server.ServerCache; -import com.gregtechceu.gtceu.integration.map.layer.builtin.OreRenderLayer; - -import com.lowdragmc.lowdraglib.gui.editor.ColorPattern; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.texture.TextTexture; -import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; -import com.lowdragmc.lowdraglib.gui.widget.*; -import com.lowdragmc.lowdraglib.utils.LocalizationUtils; - -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.core.BlockPos; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.level.levelgen.Heightmap; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -import lombok.Getter; -import org.jetbrains.annotations.NotNull; - -import java.util.*; -import java.util.List; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CopyOnWriteArraySet; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.function.Consumer; - -public class ProspectingMapWidget extends WidgetGroup implements SearchComponentWidget.IWidgetSearch { - - private final int chunkRadius; - private final ProspectorMode mode; - private final int scanTick; - @Getter - private boolean darkMode = false; - private final DraggableScrollableWidgetGroup itemList; - @OnlyIn(Dist.CLIENT) - private ProspectingTexture texture; - private int playerChunkX; - private int playerChunkZ; - // runtime - private int chunkIndex = 0; - private final Queue packetQueue = new LinkedBlockingQueue<>(); - private final Set items = new CopyOnWriteArraySet<>(); - private final Map selectedMap = new ConcurrentHashMap<>(); - - public ProspectingMapWidget(int xPosition, int yPosition, int width, int height, int chunkRadius, - @NotNull ProspectorMode mode, int scanTick) { - super(xPosition, yPosition, width, height); - this.chunkRadius = chunkRadius; - this.mode = mode; - this.scanTick = scanTick; - int imageWidth = (chunkRadius * 2 - 1) * 16; - int imageHeight = (chunkRadius * 2 - 1) * 16; - addWidget(new ImageWidget(0, (height - imageHeight) / 2 - 4, imageWidth + 8, imageHeight + 8, - GuiTextures.BACKGROUND_INVERSE)); - var group = (WidgetGroup) new WidgetGroup(imageWidth + 10, 0, width - (imageWidth + 10), height) - .setBackground(GuiTextures.BACKGROUND_INVERSE); - group.addWidget(itemList = new DraggableScrollableWidgetGroup(4, 28, group.getSize().width - 8, - group.getSize().height - 32) - .setYScrollBarWidth(2).setYBarStyle(null, ColorPattern.T_WHITE.rectTexture().setRadius(1))); - group.addWidget(new SearchComponentWidget<>(6, 6, group.getSize().width - 12, 18, this)); - addWidget(group); - addNewItem("[all]", "all resources", IGuiTexture.EMPTY, -1); - } - - @Override - public void writeInitialData(FriendlyByteBuf buffer) { - super.writeInitialData(buffer); - buffer.writeVarInt(playerChunkX = gui.entityPlayer.chunkPosition().x); - buffer.writeVarInt(playerChunkZ = gui.entityPlayer.chunkPosition().z); - buffer.writeVarInt(gui.entityPlayer.getBlockX()); - buffer.writeVarInt(gui.entityPlayer.getBlockZ()); - } - - @Override - @OnlyIn(Dist.CLIENT) - public void readInitialData(FriendlyByteBuf buffer) { - super.readInitialData(buffer); - texture = new ProspectingTexture( - buffer.readVarInt(), - buffer.readVarInt(), - buffer.readVarInt(), - buffer.readVarInt(), - gui.entityPlayer.getVisualRotationYInDegrees(), mode, chunkRadius, darkMode); - } - - public void setDarkMode(boolean mode) { - if (darkMode != mode) { - darkMode = mode; - if (isRemote()) { - texture.setDarkMode(darkMode); - } - } - } - - private void addOresToList(Object[][][] data) { - var newItems = new HashSet<>(); - for (int x = 0; x < mode.cellSize; x++) { - for (int z = 0; z < mode.cellSize; z++) { - for (var item : data[x][z]) { - newItems.add(item); - addNewItem(mode.getUniqueID(item), mode.getDescriptionId(item), mode.getItemIcon(item), - mode.getItemColor(item)); - } - } - } - items.addAll(newItems); - } - - private void addNewItem(String uniqueID, String renderingName, IGuiTexture icon, int color) { - if (!selectedMap.containsKey(uniqueID)) { - var index = itemList.widgets.size(); - var selectableWidgetGroup = new SelectableWidgetGroup(0, index * 15, itemList.getSize().width - 4, 15); - var size = selectableWidgetGroup.getSize(); - selectableWidgetGroup.addWidget(new ImageWidget(0, 0, 15, 15, icon)); - selectableWidgetGroup.addWidget(new ImageWidget(15, 0, size.width - 15, 15, - new TextTexture(renderingName).setWidth(size.width - 15).setType(TextTexture.TextType.LEFT_HIDE))); - selectableWidgetGroup.setOnSelected(s -> { - if (isRemote()) { - texture.setSelected(uniqueID); - } - }); - selectableWidgetGroup.setSelectedTexture(ColorPattern.WHITE.borderTexture(-1)); - itemList.addWidget(selectableWidgetGroup); - selectedMap.put(uniqueID, selectableWidgetGroup); - } - } - - @Override - public void detectAndSendChanges() { - var player = gui.entityPlayer; - var world = player.level(); - if (gui.getTickCount() % scanTick == 0 && chunkIndex < (chunkRadius * 2 - 1) * (chunkRadius * 2 - 1)) { - - int row = chunkIndex / (chunkRadius * 2 - 1); - int column = chunkIndex % (chunkRadius * 2 - 1); - - int ox = column - chunkRadius + 1; - int oz = row - chunkRadius + 1; - - var chunk = world.getChunk(playerChunkX + ox, playerChunkZ + oz); - if (mode == ProspectorMode.ORE) { - ServerCache.instance.prospectAllInChunk(world.dimension(), chunk.getPos(), (ServerPlayer) player); - } - PacketProspecting packet = new PacketProspecting(playerChunkX + ox, playerChunkZ + oz, this.mode); - mode.scan(packet.data, chunk); - writeUpdateInfo(-1, packet::writePacketData); - chunkIndex++; - } - var held = player.getItemInHand(InteractionHand.MAIN_HAND); - if (held.getItem() instanceof IComponentItem componentItem) { - for (var component : componentItem.getComponents()) { - if (component instanceof ProspectorScannerBehavior prospector) { - if (!player.isCreative() && !prospector.drainEnergy(held, false)) { - player.closeContainer(); - } - } - } - } - } - - @OnlyIn(Dist.CLIENT) - @Override - public void readUpdateInfo(int id, FriendlyByteBuf buffer) { - if (id == -1) { - addPacketToQueue(PacketProspecting.readPacketData(mode, buffer)); - } else { - super.readUpdateInfo(id, buffer); - } - } - - @Override - @OnlyIn(Dist.CLIENT) - public void updateScreen() { - super.updateScreen(); - if (packetQueue != null) { - int max = 10; - while (max-- > 0 && !packetQueue.isEmpty()) { - var packet = packetQueue.poll(); - texture.updateTexture(packet); - addOresToList(packet.data); - } - } - } - - @OnlyIn(Dist.CLIENT) - private void addPacketToQueue(PacketProspecting packet) { - packetQueue.add(packet); - if (mode == ProspectorMode.FLUID && packet.data[0][0].length > 0) { - GTClientCache.instance.addFluid(gui.entityPlayer.level().dimension(), packet.chunkX, packet.chunkZ, - (ProspectorMode.FluidInfo) packet.data[0][0][0]); - - } - } - - @Override - @OnlyIn(Dist.CLIENT) - public void drawInBackground(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - super.drawInBackground(graphics, mouseX, mouseY, partialTicks); - var position = getPosition(); - var size = getSize(); - // draw background - var x = position.x + 3; - var y = position.y + (size.getHeight() - texture.getImageHeight()) / 2 - 1; - texture.draw(graphics, x, y); - int cX = (mouseX - x) / 16; - int cZ = (mouseY - y) / 16; - if (cX >= 0 && cZ >= 0 && cX < chunkRadius * 2 - 1 && cZ < chunkRadius * 2 - 1) { - // draw hover layer - DrawerHelper.drawSolidRect(graphics, cX * 16 + x, cZ * 16 + y, 16, 16, 0x4B6C6C6C); - } - } - - @Override - @OnlyIn(Dist.CLIENT) - public void drawInForeground(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - super.drawInForeground(graphics, mouseX, mouseY, partialTicks); - // draw tooltips - var position = getPosition(); - var size = getSize(); - var x = position.x + 3; - var y = position.y + (size.getHeight() - texture.getImageHeight()) / 2 - 1; - int cX = (mouseX - x) / 16; - int cZ = (mouseY - y) / 16; - if (cX >= 0 && cZ >= 0 && cX < chunkRadius * 2 - 1 && cZ < chunkRadius * 2 - 1) { - // draw hover layer - List tooltips = new ArrayList<>(); - tooltips.add(Component.translatable(mode.unlocalizedName)); - List items = new ArrayList<>(); - for (int i = 0; i < mode.cellSize; i++) { - for (int j = 0; j < mode.cellSize; j++) { - assert texture != null; - if (texture.data[cX * mode.cellSize + i][cZ * mode.cellSize + j] != null) { - items.add(texture.data[cX * mode.cellSize + i][cZ * mode.cellSize + j]); - } - } - } - mode.appendTooltips(items, tooltips, texture.getSelected()); - gui.getModularUIGui().setHoverTooltip(tooltips, ItemStack.EMPTY, null, null); - } - } - - @Override - @OnlyIn(Dist.CLIENT) - public boolean mouseClicked(double mouseX, double mouseY, int button) { - var clickedItem = getClickedVein(mouseX, mouseY); - if (clickedItem == null) { - return super.mouseClicked(mouseX, mouseY, button); - } - if (!WaypointManager.isActive()) return true; - MutableComponent veinName = Component.literal(clickedItem.name()); - veinName.setStyle(veinName.getStyle().withColor(clickedItem.color)); - WaypointManager.setWaypoint(new ChunkPos(clickedItem.position).toString(), - clickedItem.name, - clickedItem.color, - gui.entityPlayer.level().dimension(), - clickedItem.position.getX(), clickedItem.position.getY(), clickedItem.position.getZ()); - gui.entityPlayer.displayClientMessage( - Component.translatable("behavior.prospector.added_waypoint", veinName), false); - playButtonClickSound(); - return true; - } - - private WaypointItem getClickedVein(double mouseX, double mouseY) { - var position = getPosition(); - var size = getSize(); - var x = position.x + 3; - var y = position.y + (size.getHeight() - texture.getImageHeight()) / 2 - 1; - - int cX = (int) (mouseX - x) / 16; - int cZ = (int) (mouseY - y) / 16; - int offsetX = Math.abs((int) (mouseX - x) % 16); - int offsetZ = Math.abs((int) (mouseY - y) % 16); - int xDiff = cX - (chunkRadius - 1); - int zDiff = cZ - (chunkRadius - 1); - - int xPos = ((gui.entityPlayer.chunkPosition().x + xDiff) << 4) + offsetX; - int zPos = ((gui.entityPlayer.chunkPosition().z + zDiff) << 4) + offsetZ; - - var blockPos = new BlockPos(xPos, gui.entityPlayer.level().getHeight(Heightmap.Types.WORLD_SURFACE, xPos, zPos), - zPos); - if (cX < 0 || cZ < 0 || cX >= chunkRadius * 2 - 1 || cZ >= chunkRadius * 2 - 1) { - return null; - } - - // If the ores are filtered use its name - if (!texture.getSelected().equals(ProspectingTexture.SELECTED_ALL)) { - for (var item : items) { - if (!texture.getSelected().equals(mode.getUniqueID(item))) continue; - var name = Component.translatable(mode.getDescriptionId(item)).getString(); - var color = mode.getItemColor(item); - return new WaypointItem(blockPos, name, color); - } - } - - // If the cursor is over an ore use its name - var hoveredItem = texture.data[cX * mode.cellSize + (offsetX * mode.cellSize / 16)][cZ * mode.cellSize + - (offsetZ * mode.cellSize / 16)]; - if (hoveredItem != null && hoveredItem.length != 0) { - var name = Component.translatable(mode.getDescriptionId(hoveredItem[0])).getString(); - var color = mode.getItemColor(hoveredItem[0]); - return new WaypointItem(blockPos, name, color); - } - - // If all else fails see if there's a nearby vein and use the vein's name - var vein = GTClientCache.instance.getNearbyVeins(gui.entityPlayer.level().dimension(), blockPos, 32); - if (!vein.isEmpty()) { - vein.sort((o1, o2) -> (int) (o1.center().distToCenterSqr(xPos, o1.center().getY(), zPos) - - o2.center().distToCenterSqr(xPos, o2.center().getY(), zPos))); - var name = OreRenderLayer.getName(vein.get(0)).getString(); - var materials = vein.get(0).definition().veinGenerator().getAllMaterials(); - var mostCommonItem = materials.get(materials.size() - 1); - var color = mostCommonItem.getMaterialRGB(); - return new WaypointItem(blockPos, name, color); - } - - return new WaypointItem(blockPos, "Depleted Vein", 0x990000); - } - - @Override - public String resultDisplay(Object value) { - return mode.getDescriptionId(value); - } - - @Override - public void selectResult(Object item) { - if (isRemote()) { - var uid = mode.getUniqueID(item); - texture.setSelected(uid); - var selected = selectedMap.get(uid); - if (selected != null) { - itemList.setSelected(selected); - } - } - } - - @Override - public void search(String s, Consumer consumer) { - var added = new HashSet(); - for (var item : this.items) { - if (Thread.currentThread().isInterrupted()) return; - var id = mode.getUniqueID(item); - if (!added.contains(id)) { - added.add(id); - var localized = LocalizationUtils.format(resultDisplay(item)); - if (item.toString().toLowerCase(Locale.ROOT).contains(s.toLowerCase(Locale.ROOT)) || - localized.toLowerCase(Locale.ROOT).contains(s.toLowerCase(Locale.ROOT))) { - consumer.accept(item); - } - } - } - } - - private record WaypointItem(BlockPos position, String name, int color) {} -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ScrollablePhantomFluidWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ScrollablePhantomFluidWidget.java deleted file mode 100644 index 93f621d2aaa..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ScrollablePhantomFluidWidget.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.widget; - -import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; -import com.gregtechceu.gtceu.utils.GTUtil; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.fluids.FluidStack; - -import org.jetbrains.annotations.Nullable; - -import java.util.function.Consumer; -import java.util.function.Supplier; - -public class ScrollablePhantomFluidWidget extends PhantomFluidWidget { - - private static final int SCROLL_ACTION_ID = 0x0001_0001; - - public ScrollablePhantomFluidWidget(@Nullable IFluidHandlerModifiable fluidTank, int tank, int x, int y, int width, - int height, Supplier phantomFluidGetter, - Consumer phantomFluidSetter) { - super(fluidTank, tank, x, y, width, height, phantomFluidGetter, phantomFluidSetter); - } - - @Override - @OnlyIn(Dist.CLIENT) - public boolean mouseWheelMove(double mouseX, double mouseY, double wheelDelta) { - if (!isMouseOverElement(mouseX, mouseY)) - return false; - - var delta = getModifiedChangeAmount((wheelDelta > 0) ? 1 : -1); - writeClientAction(SCROLL_ACTION_ID, buf -> buf.writeInt(delta)); - - return true; - } - - private int getModifiedChangeAmount(int amount) { - if (GTUtil.isShiftDown()) - amount *= 10; - - if (GTUtil.isCtrlDown()) - amount *= 100; - - if (!GTUtil.isAltDown()) - amount *= 1000; - - return amount; - } - - @Override - public void handleClientAction(int id, FriendlyByteBuf buffer) { - switch (id) { - case SCROLL_ACTION_ID -> handleScrollAction(buffer.readInt()); - default -> super.handleClientAction(id, buffer); - } - - detectAndSendChanges(); - } - - private void handleScrollAction(int delta) { - IFluidHandlerModifiable fluidTank = (IFluidHandlerModifiable) getFluidTank(); - if (fluidTank == null) - return; - - FluidStack fluid = fluidTank.getFluidInTank(tank); - if (fluid.isEmpty()) - return; - - if (fluid.isEmpty()) - return; - - fluid.setAmount(Math.min(Math.max(fluid.getAmount() + delta, 0), fluidTank.getTankCapacity(tank))); - if (fluid.getAmount() <= 0L) { - fluidTank.setFluidInTank(tank, FluidStack.EMPTY); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/SlotWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/SlotWidget.java deleted file mode 100644 index ef7f6b23990..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/SlotWidget.java +++ /dev/null @@ -1,429 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.widget; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.integration.xei.entry.item.ItemEntryList; -import com.gregtechceu.gtceu.integration.xei.entry.item.ItemStackList; -import com.gregtechceu.gtceu.integration.xei.entry.item.ItemTagList; -import com.gregtechceu.gtceu.integration.xei.handlers.item.CycleItemEntryHandler; - -import com.lowdragmc.lowdraglib.gui.editor.annotation.LDLRegister; -import com.lowdragmc.lowdraglib.gui.editor.configurator.ConfiguratorGroup; -import com.lowdragmc.lowdraglib.gui.editor.configurator.WrapperConfigurator; -import com.lowdragmc.lowdraglib.gui.editor.runtime.ConfiguratorParser; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.jei.IngredientIO; -import com.lowdragmc.lowdraglib.jei.JEIPlugin; -import com.lowdragmc.lowdraglib.side.item.IItemTransfer; -import com.lowdragmc.lowdraglib.utils.Position; -import com.lowdragmc.lowdraglib.utils.Size; - -import net.minecraft.network.chat.Component; -import net.minecraft.world.Container; -import net.minecraft.world.SimpleContainer; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.Blocks; -import net.minecraftforge.items.IItemHandlerModifiable; -import net.minecraftforge.items.ItemStackHandler; - -import dev.emi.emi.api.stack.EmiIngredient; -import dev.emi.emi.api.stack.EmiStack; -import lombok.Getter; -import me.shedaniel.rei.api.common.entry.EntryIngredient; -import me.shedaniel.rei.api.common.util.EntryStacks; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.function.BiConsumer; -import java.util.function.Function; -import java.util.function.UnaryOperator; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -@LDLRegister(name = "gtm_item_slot", group = "widget.gtm_container", priority = 50) -public class SlotWidget extends com.lowdragmc.lowdraglib.gui.widget.SlotWidget { - - public SlotWidget() { - super(); - } - - public SlotWidget(Container inventory, int slotIndex, int xPosition, int yPosition, boolean canTakeItems, - boolean canPutItems) { - super(inventory, slotIndex, xPosition, yPosition, canTakeItems, canPutItems); - } - - public SlotWidget(IItemHandlerModifiable itemHandler, int slotIndex, int xPosition, int yPosition, - boolean canTakeItems, boolean canPutItems) { - this.setSelfPosition(xPosition, yPosition); - this.setSize(18, 18); - this.recomputePosition(); - this.setVisible(true); - this.setActive(true); - this.drawHoverOverlay = true; - this.drawHoverTips = true; - this.ingredientIO = IngredientIO.RENDER_ONLY; - this.XEIChance = 1.0f; - this.setBackgroundTexture(ITEM_SLOT_TEXTURE); - this.canTakeItems = canTakeItems; - this.canPutItems = canPutItems; - this.setHandlerSlot(itemHandler, slotIndex); - } - - public SlotWidget(IItemHandlerModifiable itemHandler, int slotIndex, int xPosition, int yPosition) { - this(itemHandler, slotIndex, xPosition, yPosition, true, true); - } - - public SlotWidget(Container container, int slotIndex, int xPosition, int yPosition) { - this(container, slotIndex, xPosition, yPosition, true, true); - } - - protected Slot createSlot(IItemHandlerModifiable itemHandler, int index) { - return new WidgetSlotItemHandler(itemHandler, index, 0, 0); - } - - public SlotWidget setContainerSlot(Container inventory, int slotIndex) { - super.setContainerSlot(inventory, slotIndex); - return this; - } - - @Override - public void updateSlot(Slot slot) { - super.updateSlot(slot); - } - - @Override - public SlotWidget setHandlerSlot(IItemTransfer itemHandler, int slotIndex) { - super.setHandlerSlot(itemHandler, slotIndex); - return this; - } - - public SlotWidget setHandlerSlot(IItemHandlerModifiable itemHandler, int slotIndex) { - updateSlot(createSlot(itemHandler, slotIndex)); - return this; - } - - @Override - public SlotWidget setBackgroundTexture(IGuiTexture backgroundTexture) { - super.setBackgroundTexture(backgroundTexture); - return this; - } - - @Override - public SlotWidget setLocationInfo(boolean isPlayerContainer, boolean isPlayerHotBar) { - super.setLocationInfo(isPlayerContainer, isPlayerHotBar); - return this; - } - - @Override - public SlotWidget setCanTakeItems(boolean canTakeItems) { - super.setCanTakeItems(canTakeItems); - return this; - } - - @Override - public SlotWidget setCanPutItems(boolean canPutItems) { - super.setCanPutItems(canPutItems); - return this; - } - - @Override - public SlotWidget setDrawHoverOverlay(boolean drawHoverOverlay) { - super.setDrawHoverOverlay(drawHoverOverlay); - return this; - } - - @Override - public SlotWidget setDrawHoverTips(boolean drawHoverTips) { - super.setDrawHoverTips(drawHoverTips); - return this; - } - - @Override - public SlotWidget setIngredientIO(IngredientIO ingredientIO) { - super.setIngredientIO(ingredientIO); - return this; - } - - @Override - public SlotWidget setChangeListener(Runnable changeListener) { - super.setChangeListener(changeListener); - return this; - } - - @Override - public SlotWidget setXEIChance(float XEIChance) { - super.setXEIChance(XEIChance); - return this; - } - - @Override - public SlotWidget setItemHook(Function itemHook) { - super.setItemHook(itemHook); - return this; - } - - @Override - public SlotWidget setOnAddedTooltips(BiConsumer> onAddedTooltips) { - super.setOnAddedTooltips(onAddedTooltips); - return this; - } - - @Override - public void buildConfigurator(ConfiguratorGroup father) { - var handler = new ItemStackHandler(); - handler.setStackInSlot(0, Blocks.STONE.asItem().getDefaultInstance()); - father.addConfigurators(new WrapperConfigurator("ldlib.gui.editor.group.preview", new SlotWidget() { - - @Override - public void updateScreen() { - super.updateScreen(); - setHoverTooltips(SlotWidget.this.tooltipTexts); - this.backgroundTexture = SlotWidget.this.backgroundTexture; - this.hoverTexture = SlotWidget.this.hoverTexture; - this.drawHoverOverlay = SlotWidget.this.drawHoverOverlay; - this.drawHoverTips = SlotWidget.this.drawHoverTips; - this.overlay = SlotWidget.this.overlay; - } - }.setCanPutItems(false).setCanTakeItems(false).setHandlerSlot(handler, 0))); - - ConfiguratorParser.createConfigurators(father, new HashMap<>(), getClass(), this); - } - - @Nullable - @Override - public Object getXEIIngredientOverMouse(double mouseX, double mouseY) { - if (self().isMouseOverElement(mouseX, mouseY)) { - var handler = getHandler(); - if (handler == null) return null; - ItemStack realStack = getRealStack(handler.getItem()); - if (handler instanceof WidgetSlotItemHandler slotHandler) { - if (slotHandler.itemHandler instanceof CycleItemEntryHandler entryHandler) { - return getXEIIngredientsClickable(entryHandler, slotHandler.index); - } - } - - if (GTCEu.Mods.isJEILoaded() && !realStack.isEmpty()) { - return JEICallWrapper.getJEIStackClickable(realStack, getPosition(), getSize()); - } else if (GTCEu.Mods.isREILoaded()) { - return EntryStacks.of(realStack); - } else if (GTCEu.Mods.isEMILoaded()) { - return EmiStack.of(realStack).setChance(getXEIChance()); - } - return realStack; - } - return null; - } - - @Override - public List getXEIIngredients() { - if (slotReference == null || slotReference.getItem().isEmpty()) return Collections.emptyList(); - var handler = getHandler(); - if (handler == null) return Collections.emptyList(); - ItemStack realStack = getRealStack(handler.getItem()); - if (handler instanceof WidgetSlotItemHandler slotHandler) { - if (slotHandler.itemHandler instanceof CycleItemEntryHandler entryHandler) { - return getXEIIngredientsClickable(entryHandler, slotHandler.index); - } - } - - if (GTCEu.Mods.isJEILoaded() && !realStack.isEmpty()) { - return List.of(JEICallWrapper.getJEIStackClickable(realStack, getPosition(), getSize())); - } else if (GTCEu.Mods.isREILoaded()) { - return List.of(EntryStacks.of(realStack)); - } else if (GTCEu.Mods.isEMILoaded()) { - return List.of(EmiStack.of(realStack).setChance(getXEIChance())); - } - return List.of(realStack); - } - - private List getXEIIngredients(CycleItemEntryHandler handler, int index) { - ItemEntryList entryList = handler.getEntry(index); - if (GTCEu.Mods.isJEILoaded()) { - return JEICallWrapper.getJEIIngredients(entryList, this::getRealStack); - } else if (GTCEu.Mods.isREILoaded()) { - return REICallWrapper.getREIIngredients(entryList, this::getRealStack); - } else if (GTCEu.Mods.isEMILoaded()) { - return EMICallWrapper.getEMIIngredients(entryList, getXEIChance(), this::getRealStack); - } - return Collections.emptyList(); - } - - private List getXEIIngredientsClickable(CycleItemEntryHandler handler, int index) { - ItemEntryList entryList = handler.getEntry(index); - if (GTCEu.Mods.isJEILoaded()) { - return JEICallWrapper.getJEIIngredientsClickable(entryList, getPosition(), getSize(), this::getRealStack); - } else if (GTCEu.Mods.isREILoaded()) { - return REICallWrapper.getREIIngredients(entryList, this::getRealStack); - } else if (GTCEu.Mods.isEMILoaded()) { - return EMICallWrapper.getEMIIngredients(entryList, getXEIChance(), this::getRealStack); - } - return Collections.emptyList(); - } - - public class WidgetSlotItemHandler extends Slot { - - private static final Container emptyInventory = new SimpleContainer(0); - @Getter - private final IItemHandlerModifiable itemHandler; - private final int index; - - public WidgetSlotItemHandler(IItemHandlerModifiable itemHandler, int index, int xPosition, int yPosition) { - super(emptyInventory, index, xPosition, yPosition); - this.itemHandler = itemHandler; - this.index = index; - } - - @Override - public boolean mayPlace(@NotNull ItemStack stack) { - return SlotWidget.this.canPutStack(stack) && - (!stack.isEmpty() && this.itemHandler.isItemValid(this.index, stack)); - } - - @Override - public boolean mayPickup(@Nullable Player playerIn) { - return SlotWidget.this.canTakeStack(playerIn) && !this.itemHandler.extractItem(index, 1, true).isEmpty(); - } - - @Override - @NotNull - public ItemStack getItem() { - return this.itemHandler.getStackInSlot(index); - } - - @Override - public void setByPlayer(@NotNull ItemStack stack) { - this.itemHandler.setStackInSlot(index, stack); - } - - @Override - public void set(@NotNull ItemStack stack) { - this.itemHandler.setStackInSlot(index, stack); - this.setChanged(); - } - - @Override - public void onQuickCraft(@NotNull ItemStack oldStackIn, @NotNull ItemStack newStackIn) {} - - @Override - public int getMaxStackSize() { - return this.itemHandler.getSlotLimit(this.index); - } - - @Override - public int getMaxStackSize(@NotNull ItemStack stack) { - ItemStack maxAdd = stack.copy(); - int maxInput = stack.getMaxStackSize(); - maxAdd.setCount(maxInput); - ItemStack currentStack = this.itemHandler.getStackInSlot(index); - this.itemHandler.setStackInSlot(index, ItemStack.EMPTY); - ItemStack remainder = this.itemHandler.insertItem(index, maxAdd, true); - this.itemHandler.setStackInSlot(index, currentStack); - return maxInput - remainder.getCount(); - } - - @NotNull - @Override - public ItemStack remove(int amount) { - var result = this.itemHandler.extractItem(index, amount, false); - if (changeListener != null && !getItem().isEmpty()) { - changeListener.run(); - } - return result; - } - - @Override - public void setChanged() { - if (changeListener != null) { - changeListener.run(); - } - SlotWidget.this.onSlotChanged(); - } - - @Override - public boolean isActive() { - return SlotWidget.this.isEnabled() && (HOVER_SLOT == null || HOVER_SLOT == this); - } - } - - public static final class JEICallWrapper { - - public static Object getJEIStackClickable(ItemStack stack, Position pos, Size size) { - return JEIPlugin.getItemIngredient(stack, pos.x, pos.y, size.width, size.height); - } - - public static List getJEIIngredients(ItemEntryList list, UnaryOperator realStack) { - return list.getStacks() - .stream() - .filter(stack -> !stack.isEmpty()) - .map(realStack) - .collect(Collectors.toList()); - } - - public static List getJEIIngredientsClickable(ItemEntryList list, Position pos, Size size, - UnaryOperator realStack) { - return list.getStacks() - .stream() - .filter(stack -> !stack.isEmpty()) - .map(realStack) - .map(stack -> getJEIStackClickable(stack, pos, size)) - .collect(Collectors.toList()); - } - } - - public static final class REICallWrapper { - - private static EntryIngredient toREIIngredient(Stream stream, UnaryOperator realStack) { - return EntryIngredient.of(stream.map(realStack) - .map(EntryStacks::of) - .toList()); - } - - public static List getREIIngredients(ItemStackList list, UnaryOperator realStack) { - return List.of(toREIIngredient(list.stream(), realStack)); - } - - public static List getREIIngredients(ItemTagList list, UnaryOperator realStack) { - return list.getEntries().stream() - .map(ItemTagList.ItemTagEntry::stacks) - .map(stream -> toREIIngredient(stream, realStack)) - .collect(Collectors.toList()); - } - - public static List getREIIngredients(ItemEntryList list, UnaryOperator realStack) { - if (list instanceof ItemTagList tagList) return getREIIngredients(tagList, realStack); - if (list instanceof ItemStackList stackList) return getREIIngredients(stackList, realStack); - return Collections.emptyList(); - } - } - - public static final class EMICallWrapper { - - private static EmiIngredient toEMIIngredient(Stream stream, UnaryOperator realStack) { - return EmiIngredient.of(stream.map(realStack).map(EmiStack::of).toList()); - } - - public static List getEMIIngredients(ItemStackList list, float xeiChance, - UnaryOperator realStack) { - return List.of(toEMIIngredient(list.stream(), realStack).setChance(xeiChance)); - } - - public static List getEMIIngredients(ItemTagList list, float xeiChance, - UnaryOperator realStack) { - return list.getEntries().stream() - .map(ItemTagList.ItemTagEntry::stacks) - .map(stream -> toEMIIngredient(stream, realStack).setChance(xeiChance)) - .collect(Collectors.toList()); - } - - public static List getEMIIngredients(ItemEntryList list, float xeiChance, - UnaryOperator realStack) { - if (list instanceof ItemTagList tagList) return getEMIIngredients(tagList, xeiChance, realStack); - if (list instanceof ItemStackList stackList) return getEMIIngredients(stackList, xeiChance, realStack); - return Collections.emptyList(); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/TankWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/TankWidget.java deleted file mode 100644 index 5269926b1c5..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/TankWidget.java +++ /dev/null @@ -1,720 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.widget; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; -import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; -import com.gregtechceu.gtceu.client.TooltipsHandler; -import com.gregtechceu.gtceu.integration.xei.entry.fluid.FluidEntryList; -import com.gregtechceu.gtceu.integration.xei.entry.fluid.FluidStackList; -import com.gregtechceu.gtceu.integration.xei.entry.fluid.FluidTagList; -import com.gregtechceu.gtceu.integration.xei.handlers.fluid.CycleFluidEntryHandler; -import com.gregtechceu.gtceu.utils.FormattingUtil; -import com.gregtechceu.gtceu.utils.GTUtil; - -import com.lowdragmc.lowdraglib.gui.editor.annotation.Configurable; -import com.lowdragmc.lowdraglib.gui.editor.annotation.LDLRegister; -import com.lowdragmc.lowdraglib.gui.editor.configurator.ConfiguratorGroup; -import com.lowdragmc.lowdraglib.gui.editor.configurator.IConfigurableWidget; -import com.lowdragmc.lowdraglib.gui.editor.configurator.WrapperConfigurator; -import com.lowdragmc.lowdraglib.gui.ingredient.IRecipeIngredientSlot; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.texture.ProgressTexture; -import com.lowdragmc.lowdraglib.gui.texture.ResourceBorderTexture; -import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; -import com.lowdragmc.lowdraglib.gui.util.TextFormattingUtil; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.jei.ClickableIngredient; -import com.lowdragmc.lowdraglib.jei.IngredientIO; -import com.lowdragmc.lowdraglib.jei.JEIPlugin; -import com.lowdragmc.lowdraglib.side.fluid.forge.FluidHelperImpl; -import com.lowdragmc.lowdraglib.utils.Position; -import com.lowdragmc.lowdraglib.utils.Size; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Font; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.sounds.SoundSource; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.material.Fluids; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.common.SoundActions; -import net.minecraftforge.fluids.FluidActionResult; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidUtil; -import net.minecraftforge.fluids.capability.IFluidHandler; -import net.minecraftforge.fluids.capability.templates.FluidTank; - -import com.mojang.blaze3d.systems.RenderSystem; -import dev.emi.emi.api.forge.ForgeEmiStack; -import dev.emi.emi.api.stack.EmiIngredient; -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; -import me.shedaniel.rei.api.common.entry.EntryIngredient; -import me.shedaniel.rei.api.common.util.EntryStacks; -import mezz.jei.api.helpers.IPlatformFluidHelper; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.function.BiConsumer; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -@SuppressWarnings("unused") -@LDLRegister(name = "gtm_fluid_slot", group = "widget.gtm_container", priority = 50) -@Accessors(chain = true) -public class TankWidget extends Widget implements IRecipeIngredientSlot, IConfigurableWidget { - - public final static ResourceBorderTexture FLUID_SLOT_TEXTURE = new ResourceBorderTexture( - "ldlib:textures/gui/fluid_slot.png", 18, 18, 1, 1); - - @Nullable - @Getter - protected IFluidHandler fluidTank; - @Getter - protected int tank; - @Configurable(name = "ldlib.gui.editor.name.showAmount") - @Setter - protected boolean showAmount; - @Configurable(name = "ldlib.gui.editor.name.allowClickFilled") - @Setter - protected boolean allowClickFilled; - @Configurable(name = "ldlib.gui.editor.name.allowClickDrained") - @Setter - protected boolean allowClickDrained; - @Configurable(name = "ldlib.gui.editor.name.drawHoverOverlay") - @Setter - public boolean drawHoverOverlay = true; - @Configurable(name = "ldlib.gui.editor.name.drawHoverTips") - @Setter - protected boolean drawHoverTips; - @Configurable(name = "ldlib.gui.editor.name.fillDirection") - @Setter - protected ProgressTexture.FillDirection fillDirection = ProgressTexture.FillDirection.ALWAYS_FULL; - @Setter - protected BiConsumer> onAddedTooltips; - @Setter - @Getter - protected IngredientIO ingredientIO = IngredientIO.RENDER_ONLY; - @Setter - @Getter - protected float XEIChance = 1f; - protected FluidStack lastFluidInTank; - protected int lastTankCapacity; - @Setter - protected Runnable changeListener; - @Setter - protected boolean showAmountOverlay = true; - - public TankWidget() { - this(null, 0, 0, 18, 18, true, true); - } - - @Override - public void initTemplate() { - setBackground(FLUID_SLOT_TEXTURE); - setFillDirection(ProgressTexture.FillDirection.DOWN_TO_UP); - } - - public TankWidget(IFluidHandler fluidTank, int x, int y, boolean allowClickContainerFilling, - boolean allowClickContainerEmptying) { - this(fluidTank, x, y, 18, 18, allowClickContainerFilling, allowClickContainerEmptying); - } - - public TankWidget(@Nullable IFluidHandler fluidTank, int x, int y, int width, int height, - boolean allowClickContainerFilling, boolean allowClickContainerEmptying) { - super(new Position(x, y), new Size(width, height)); - setFluidTank(fluidTank, 0); - this.showAmount = true; - this.allowClickFilled = allowClickContainerFilling; - this.allowClickDrained = allowClickContainerEmptying; - this.drawHoverTips = true; - } - - public TankWidget(IFluidHandler fluidHandler, int tank, int x, int y, boolean allowClickContainerFilling, - boolean allowClickContainerEmptying) { - this(fluidHandler, tank, x, y, 18, 18, allowClickContainerFilling, allowClickContainerEmptying); - } - - public TankWidget(@Nullable IFluidHandler fluidHandler, int tank, int x, int y, int width, int height, - boolean allowClickContainerFilling, boolean allowClickContainerEmptying) { - super(new Position(x, y), new Size(width, height)); - setFluidTank(fluidHandler, tank); - this.showAmount = true; - this.allowClickFilled = allowClickContainerFilling; - this.allowClickDrained = allowClickContainerEmptying; - this.drawHoverTips = true; - } - - public TankWidget setFluidTank(IFluidHandler fluidTank) { - return setFluidTank(fluidTank, 0); - } - - public TankWidget setFluidTank(IFluidHandler fluidTank, int tank) { - if (fluidTank instanceof NotifiableFluidTank notifiable) { - this.fluidTank = notifiable.getStorages()[tank]; - this.tank = 0; - } else { - this.fluidTank = fluidTank; - this.tank = tank; - } - if (isClientSideWidget) { - setClientSideWidget(); - } - return this; - } - - // for kjs - public FluidStack getFluid() { - if (isClientSideWidget || isRemote()) { - return lastFluidInTank == null ? FluidStack.EMPTY : lastFluidInTank; - } - return fluidTank != null ? fluidTank.getFluidInTank(tank) : FluidStack.EMPTY; - } - - public TankWidget setFluid(FluidStack fluidStack) { - return setFluid(fluidStack, true); - } - - public TankWidget setFluid(FluidStack fluidStack, boolean notify) { - if (fluidTank instanceof IFluidHandlerModifiable modifiable) { - modifiable.setFluidInTank(tank, fluidStack); - if (notify) { - detectAndSendChanges(); - } - } - return this; - } - - @Override - public TankWidget setClientSideWidget() { - super.setClientSideWidget(); - if (fluidTank != null) { - this.lastFluidInTank = fluidTank.getFluidInTank(tank).copy(); - } else { - this.lastFluidInTank = null; - } - this.lastTankCapacity = fluidTank != null ? fluidTank.getTankCapacity(tank) : 0; - return this; - } - - public TankWidget setBackground(IGuiTexture background) { - super.setBackground(background); - return this; - } - - @Nullable - @Override - public Object getXEIIngredientOverMouse(double mouseX, double mouseY) { - if (self().isMouseOverElement(mouseX, mouseY)) { - if (lastFluidInTank == null || lastFluidInTank.isEmpty()) return null; - - if (fluidTank instanceof CycleFluidEntryHandler entryHandler) { - return getXEIIngredientsClickable(entryHandler, tank).get(0); - } - - if (GTCEu.Mods.isJEILoaded()) { - return JEICallWrapper.getJEIFluidClickable(lastFluidInTank, getPosition(), getSize()); - } else if (GTCEu.Mods.isREILoaded()) { - return EntryStacks.of(REICallWrapper.toREIStack(lastFluidInTank)); - } else if (GTCEu.Mods.isEMILoaded()) { - return ForgeEmiStack.of(lastFluidInTank).setChance(XEIChance); - } - } - return null; - } - - @Override - public List getXEIIngredients() { - if (lastFluidInTank == null || lastFluidInTank.isEmpty()) return Collections.emptyList(); - - if (fluidTank instanceof CycleFluidEntryHandler entryHandler) { - return getXEIIngredientsClickable(entryHandler, tank); - } - - if (GTCEu.Mods.isJEILoaded()) { - return List.of(JEICallWrapper.getJEIFluidClickable(lastFluidInTank, getPosition(), getSize())); - } else if (GTCEu.Mods.isREILoaded()) { - return List.of(EntryStacks.of(REICallWrapper.toREIStack(lastFluidInTank))); - } else if (GTCEu.Mods.isEMILoaded()) { - return List.of(ForgeEmiStack.of(lastFluidInTank).setChance(XEIChance)); - } - return List.of(lastFluidInTank); - } - - private List getXEIIngredients(CycleFluidEntryHandler handler, int index) { - FluidEntryList entryList = handler.getEntry(index); - if (GTCEu.Mods.isJEILoaded()) { - return JEICallWrapper.getJEIIngredients(entryList); - } else if (GTCEu.Mods.isREILoaded()) { - return REICallWrapper.getREIIngredients(entryList); - } else if (GTCEu.Mods.isEMILoaded()) { - return EMICallWrapper.getEMIIngredients(entryList, getXEIChance()); - } - return Collections.emptyList(); - } - - private List getXEIIngredientsClickable(CycleFluidEntryHandler handler, int index) { - FluidEntryList entryList = handler.getEntry(index); - if (GTCEu.Mods.isJEILoaded()) { - return JEICallWrapper.getJEIIngredientsClickable(entryList, getPosition(), getSize()); - } else if (GTCEu.Mods.isREILoaded()) { - return REICallWrapper.getREIIngredients(entryList); - } else if (GTCEu.Mods.isEMILoaded()) { - return EMICallWrapper.getEMIIngredients(entryList, getXEIChance()); - } - return Collections.emptyList(); - } - - @Override - public List getTooltipTexts() { - List tooltips = getAdditionalTooltips(new ArrayList<>()); - tooltips.addAll(tooltipTexts); - return tooltips; - } - - public List getAdditionalTooltips(List list) { - if (this.onAddedTooltips != null) { - this.onAddedTooltips.accept(this, list); - } - return list; - } - - @Override - public List getFullTooltipTexts() { - List tooltips = new ArrayList<>(); - boolean isPhantom = this instanceof PhantomFluidWidget; - var fluidStack = this.lastFluidInTank; - if (fluidStack != null && !fluidStack.isEmpty()) { - tooltips.add(fluidStack.getDisplayName()); - if (!isPhantom && showAmount) { - tooltips.add( - Component.translatable("fluid.gtceu.amount", - FormattingUtil.formatNumbers(fluidStack.getAmount()), - FormattingUtil.formatNumbers(lastTankCapacity))); - } - TooltipsHandler.appendFluidTooltips(fluidStack, tooltips::add, null); - } else { - tooltips.add(Component.translatable("fluid.gtceu.empty")); - if (!isPhantom && showAmount) { - tooltips.add(Component.translatable("fluid.gtceu.amount", 0, - FormattingUtil.formatNumbers(lastTankCapacity))); - } - } - tooltips.addAll(getTooltipTexts()); - return tooltips; - } - - @Override - public Object getXEICurrentIngredient() { - if (lastFluidInTank == null || lastFluidInTank.isEmpty()) return null; - if (GTCEu.Mods.isJEILoaded()) { - return JEICallWrapper.getJEIFluidClickable(lastFluidInTank, getPosition(), getSize()); - } - return null; - } - - @Override - @OnlyIn(Dist.CLIENT) - public void drawInBackground(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - super.drawInBackground(graphics, mouseX, mouseY, partialTicks); - if (isClientSideWidget && fluidTank != null) { - FluidStack fluidStack = fluidTank.getFluidInTank(tank); - int capacity = fluidTank.getTankCapacity(tank); - if (capacity != lastTankCapacity) { - this.lastTankCapacity = capacity; - } - if (!fluidStack.isFluidEqual(lastFluidInTank)) { - this.lastFluidInTank = fluidStack.copy(); - } else if (fluidStack.getAmount() != lastFluidInTank.getAmount()) { - this.lastFluidInTank.setAmount(fluidStack.getAmount()); - } - } - Position pos = getPosition(); - Size size = getSize(); - var renderedFluid = lastFluidInTank; - if (renderedFluid != null) { - RenderSystem.disableBlend(); - if (!renderedFluid.isEmpty()) { - double progress = renderedFluid.getAmount() * 1.0 / - Math.max(Math.max(renderedFluid.getAmount(), lastTankCapacity), 1); - float drawnU = (float) fillDirection.getDrawnU(progress); - float drawnV = (float) fillDirection.getDrawnV(progress); - float drawnWidth = (float) fillDirection.getDrawnWidth(progress); - float drawnHeight = (float) fillDirection.getDrawnHeight(progress); - int width = size.width - 2; - int height = size.height - 2; - int x = pos.x + 1; - int y = pos.y + 1; - DrawerHelper.drawFluidForGui(graphics, FluidHelperImpl.toFluidStack(renderedFluid), - renderedFluid.getAmount(), (int) (x + drawnU * width), (int) (y + drawnV * height), - ((int) (width * drawnWidth)), ((int) (height * drawnHeight))); - } - - if (showAmount && showAmountOverlay && !renderedFluid.isEmpty()) { - graphics.pose().pushPose(); - graphics.pose().scale(0.5F, 0.5F, 1); - String s = TextFormattingUtil.formatLongToCompactStringBuckets(renderedFluid.getAmount(), 3) + "B"; - Font fontRenderer = Minecraft.getInstance().font; - graphics.drawString(fontRenderer, s, - (int) ((pos.x + (size.width / 3f)) * 2 - fontRenderer.width(s) + 21), - (int) ((pos.y + (size.height / 3f) + 6) * 2), 0xFFFFFF, true); - graphics.pose().popPose(); - } - - RenderSystem.enableBlend(); - RenderSystem.setShaderColor(1, 1, 1, 1); - } - drawOverlay(graphics, mouseX, mouseY, partialTicks); - if (drawHoverOverlay && isMouseOverElement(mouseX, mouseY) && getHoverElement(mouseX, mouseY) == this) { - RenderSystem.colorMask(true, true, true, false); - DrawerHelper.drawSolidRect(graphics, getPosition().x + 1, getPosition().y + 1, getSize().width - 2, - getSize().height - 2, 0x80FFFFFF); - RenderSystem.colorMask(true, true, true, true); - } - } - - @Override - @OnlyIn(Dist.CLIENT) - public void drawInForeground(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - if (drawHoverTips && isMouseOverElement(mouseX, mouseY) && getHoverElement(mouseX, mouseY) == this) { - if (gui != null) { - gui.getModularUIGui().setHoverTooltip(getFullTooltipTexts(), ItemStack.EMPTY, null, null); - } - RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1f); - } else { - super.drawInForeground(graphics, mouseX, mouseY, partialTicks); - } - } - - @Override - public void detectAndSendChanges() { - if (fluidTank != null) { - FluidStack fluidStack = fluidTank.getFluidInTank(tank); - int capacity = fluidTank.getTankCapacity(tank); - if (capacity != lastTankCapacity) { - this.lastTankCapacity = capacity; - writeUpdateInfo(0, buffer -> buffer.writeVarInt(lastTankCapacity)); - } - if (!fluidStack.isFluidEqual(lastFluidInTank)) { - this.lastFluidInTank = fluidStack.copy(); - var tag = fluidStack.writeToNBT(new CompoundTag()); - writeUpdateInfo(2, buffer -> buffer.writeNbt(tag)); - } else if (fluidStack.getAmount() != lastFluidInTank.getAmount()) { - this.lastFluidInTank.setAmount(fluidStack.getAmount()); - writeUpdateInfo(3, buffer -> buffer.writeVarInt(lastFluidInTank.getAmount())); - } else { - super.detectAndSendChanges(); - return; - } - if (changeListener != null) { - changeListener.run(); - } - } - } - - @Override - public void writeInitialData(FriendlyByteBuf buffer) { - buffer.writeBoolean(fluidTank != null); - if (fluidTank != null) { - this.lastTankCapacity = fluidTank.getTankCapacity(tank); - buffer.writeVarInt(lastTankCapacity); - FluidStack fluidStack = fluidTank.getFluidInTank(tank); - this.lastFluidInTank = fluidStack.copy(); - var tag = fluidStack.writeToNBT(new CompoundTag()); - buffer.writeNbt(tag); - } - } - - @Override - public void readInitialData(FriendlyByteBuf buffer) { - if (buffer.readBoolean()) { - this.lastTankCapacity = buffer.readVarInt(); - readUpdateInfo(2, buffer); - } - } - - @Override - @OnlyIn(Dist.CLIENT) - public void readUpdateInfo(int id, FriendlyByteBuf buffer) { - if (id == 0) { - this.lastTankCapacity = buffer.readVarInt(); - } else if (id == 1) { - this.lastFluidInTank = null; - } else if (id == 2) { - this.lastFluidInTank = FluidStack.loadFluidStackFromNBT(buffer.readNbt()); - } else if (id == 3 && lastFluidInTank != null) { - this.lastFluidInTank.setAmount(buffer.readVarInt()); - } else if (id == 4) { - ItemStack currentStack = gui.getModularUIContainer().getCarried(); - int newStackSize = buffer.readVarInt(); - currentStack.setCount(newStackSize); - gui.getModularUIContainer().setCarried(currentStack); - } else { - super.readUpdateInfo(id, buffer); - return; - } - if (changeListener != null) { - changeListener.run(); - } - } - - @Override - public void handleClientAction(int id, FriendlyByteBuf buffer) { - super.handleClientAction(id, buffer); - if (id == 1) { - boolean isShiftKeyDown = buffer.readBoolean(); - int clickResult = tryClickContainer(isShiftKeyDown); - if (clickResult >= 0) { - writeUpdateInfo(4, buf -> buf.writeVarInt(clickResult)); - } - } - } - - private int tryClickContainer(boolean isShiftKeyDown) { - if (fluidTank == null) return -1; - Player player = gui.entityPlayer; - ItemStack currentStack = gui.getModularUIContainer().getCarried(); - var handler = FluidUtil.getFluidHandler(currentStack).resolve().orElse(null); - if (handler == null) return -1; - int maxAttempts = isShiftKeyDown ? currentStack.getCount() : 1; - FluidStack initialFluid = fluidTank.getFluidInTank(tank).copy(); - if (allowClickFilled && initialFluid.getAmount() > 0) { - boolean performedFill = false; - ItemStack filledResult = ItemStack.EMPTY; - for (int i = 0; i < maxAttempts; i++) { - FluidActionResult result = FluidUtil.tryFillContainer(currentStack, fluidTank, Integer.MAX_VALUE, null, - false); - if (!result.isSuccess()) break; - ItemStack remainingStack = FluidUtil - .tryFillContainer(currentStack, fluidTank, Integer.MAX_VALUE, null, true).getResult(); - performedFill = true; - - currentStack.shrink(1); - - if (filledResult.isEmpty()) { - filledResult = remainingStack.copy(); - } else if (GTUtil.isSameItemSameTags(filledResult, remainingStack)) { - if (filledResult.getCount() < filledResult.getMaxStackSize()) - filledResult.grow(1); - else - player.getInventory().placeItemBackInInventory(remainingStack); - } else { - player.getInventory().placeItemBackInInventory(filledResult); - filledResult = remainingStack.copy(); - } - } - if (performedFill) { - SoundEvent soundevent = initialFluid.getFluid().getFluidType().getSound(initialFluid, - SoundActions.BUCKET_FILL); - if (soundevent == null) - soundevent = SoundEvents.BUCKET_FILL; - player.level().playSound(null, player.position().x, player.position().y + 0.5, player.position().z, - soundevent, SoundSource.BLOCKS, 1.0F, 1.0F); - - if (currentStack.isEmpty()) { - gui.getModularUIContainer().setCarried(filledResult); - } else { - gui.getModularUIContainer().setCarried(currentStack); - player.getInventory().placeItemBackInInventory(filledResult); - } - return gui.getModularUIContainer().getCarried().getCount(); - } - } - - if (allowClickDrained) { - boolean performedEmptying = false; - ItemStack drainedResult = ItemStack.EMPTY; - for (int i = 0; i < maxAttempts; i++) { - int remainingCapacity = fluidTank.getTankCapacity(tank) - fluidTank.getFluidInTank(tank).getAmount(); - FluidActionResult result = FluidUtil.tryEmptyContainer(currentStack, fluidTank, remainingCapacity, null, - false); - if (!result.isSuccess()) break; - - ItemStack remainingStack = FluidUtil - .tryEmptyContainer(currentStack, fluidTank, remainingCapacity, null, true) - .getResult(); - performedEmptying = true; - - currentStack.shrink(1); - - if (drainedResult.isEmpty()) { - drainedResult = remainingStack.copy(); - } else if (GTUtil.isSameItemSameTags(drainedResult, remainingStack)) { - if (drainedResult.getCount() < drainedResult.getMaxStackSize()) - drainedResult.grow(1); - else - player.getInventory().placeItemBackInInventory(remainingStack); - } else { - player.getInventory().placeItemBackInInventory(drainedResult); - drainedResult = remainingStack.copy(); - } - } - var filledFluid = fluidTank.getFluidInTank(tank); - if (performedEmptying) { - SoundEvent soundevent = filledFluid.getFluid().getFluidType().getSound(filledFluid, - SoundActions.BUCKET_EMPTY); - if (soundevent == null) - soundevent = SoundEvents.BUCKET_EMPTY; - player.level().playSound(null, player.position().x, player.position().y + 0.5, player.position().z, - soundevent, SoundSource.BLOCKS, 1.0F, 1.0F); - - if (currentStack.isEmpty()) { - gui.getModularUIContainer().setCarried(drainedResult); - } else { - gui.getModularUIContainer().setCarried(currentStack); - player.getInventory().placeItemBackInInventory(drainedResult); - } - return gui.getModularUIContainer().getCarried().getCount(); - } - } - - return -1; - } - - @OnlyIn(Dist.CLIENT) - public boolean mouseClicked(double mouseX, double mouseY, int button) { - if ((allowClickDrained || allowClickFilled) && isMouseOverElement(mouseX, mouseY)) { - if (button == 0) { - if (FluidUtil.getFluidHandler(gui.getModularUIContainer().getCarried()).isPresent()) { - boolean isShiftKeyDown = isShiftDown(); - writeClientAction(1, writer -> writer.writeBoolean(isShiftKeyDown)); - playButtonClickSound(); - return true; - } - } - } - return false; - } - - @Override - public void buildConfigurator(ConfiguratorGroup father) { - var handler = new FluidTank(5000); - handler.fill(new FluidStack(Fluids.WATER, 3000), IFluidHandler.FluidAction.EXECUTE); - father.addConfigurators(new WrapperConfigurator("ldlib.gui.editor.group.preview", new TankWidget() { - - @Override - public void updateScreen() { - super.updateScreen(); - setHoverTooltips(TankWidget.this.tooltipTexts); - this.backgroundTexture = TankWidget.this.backgroundTexture; - this.hoverTexture = TankWidget.this.hoverTexture; - this.showAmount = TankWidget.this.showAmount; - this.drawHoverTips = TankWidget.this.drawHoverTips; - this.fillDirection = TankWidget.this.fillDirection; - this.overlay = TankWidget.this.overlay; - } - }.setAllowClickDrained(false).setAllowClickFilled(false).setFluidTank(handler))); - - IConfigurableWidget.super.buildConfigurator(father); - } - - /** - * Wrapper for methods that use JEI classes so that classloading doesn't brick itself. - */ - public static final class JEICallWrapper { - - public static List getJEIIngredients(FluidEntryList list) { - return list.getStacks() - .stream() - .filter(stack -> !stack.isEmpty()) - .map(JEICallWrapper::getJEIFluid) - .toList(); - } - - public static List getJEIIngredientsClickable(FluidEntryList list, Position pos, Size size) { - return list.getStacks() - .stream() - .filter(stack -> !stack.isEmpty()) - .map(stack -> getJEIFluidClickable(stack, pos, size)) - .toList(); - } - - public static Object getJEIFluid(FluidStack fluidStack) { - return _getJEIFluid(JEIPlugin.jeiHelpers.getPlatformFluidHelper(), fluidStack); - } - - private static Object _getJEIFluid(IPlatformFluidHelper helper, FluidStack fluidStack) { - return helper.create(fluidStack.getFluid(), fluidStack.getAmount(), fluidStack.getTag()); - } - - public static Object getJEIFluidClickable(FluidStack fluidStack, Position pos, Size size) { - return _getJEIFluidClickable(JEIPlugin.jeiHelpers.getPlatformFluidHelper(), fluidStack, pos, - size); - } - - private static Object _getJEIFluidClickable(IPlatformFluidHelper helper, - FluidStack fluidStack, Position pos, Size size) { - T ingredient = helper.create(fluidStack.getFluid(), fluidStack.getAmount(), fluidStack.getTag()); - return JEIPlugin.jeiHelpers.getIngredientManager().createTypedIngredient(ingredient) - .map(typedIngredient -> new ClickableIngredient<>(typedIngredient, pos.x, pos.y, size.width, - size.height)) - .orElse(null); - } - } - - public static final class REICallWrapper { - - public static dev.architectury.fluid.FluidStack toREIStack(FluidStack stack) { - return dev.architectury.fluid.FluidStack.create(stack.getFluid(), stack.getAmount(), stack.getTag()); - } - - private static EntryIngredient toREIIngredient(Stream stream) { - return EntryIngredient.of(stream - .map(REICallWrapper::toREIStack) - .map(EntryStacks::of) - .toList()); - } - - public static List getREIIngredients(FluidStackList list) { - return List.of(toREIIngredient(list.stream())); - } - - public static List getREIIngredients(FluidTagList list) { - return list.getEntries().stream() - .map(FluidTagList.FluidTagEntry::stacks) - .map(REICallWrapper::toREIIngredient) - .collect(Collectors.toList()); - } - - public static List getREIIngredients(FluidEntryList list) { - if (list instanceof FluidTagList tagList) return getREIIngredients(tagList); - if (list instanceof FluidStackList stackList) return getREIIngredients(stackList); - return Collections.emptyList(); - } - } - - public static final class EMICallWrapper { - - private static EmiIngredient toEMIIngredient(Stream stream) { - return EmiIngredient.of(stream.map(ForgeEmiStack::of).toList()); - } - - public static List getEMIIngredients(FluidStackList list, float xeiChance) { - return List.of(toEMIIngredient(list.stream()).setChance(xeiChance)); - } - - public static List getEMIIngredients(FluidTagList list, float xeiChance) { - return list.getEntries().stream() - .map(FluidTagList.FluidTagEntry::stacks) - .map(stream -> toEMIIngredient(stream).setChance(xeiChance)) - .collect(Collectors.toList()); - } - - public static List getEMIIngredients(FluidEntryList list, float xeiChance) { - if (list instanceof FluidTagList tagList) return getEMIIngredients(tagList, xeiChance); - if (list instanceof FluidStackList stackList) return getEMIIngredients(stackList, xeiChance); - return Collections.emptyList(); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ToggleButtonWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ToggleButtonWidget.java deleted file mode 100644 index 08a148b7c06..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ToggleButtonWidget.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.widget; - -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.data.lang.LangUtil; - -import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; -import com.lowdragmc.lowdraglib.gui.widget.SwitchWidget; - -import it.unimi.dsi.fastutil.booleans.BooleanConsumer; - -import java.util.function.BooleanSupplier; - -public class ToggleButtonWidget extends SwitchWidget { - - private final IGuiTexture texture; - private String tooltipText; - private boolean isMultiLang; - - public ToggleButtonWidget(int xPosition, int yPosition, int width, int height, BooleanSupplier isPressedCondition, - BooleanConsumer setPressedExecutor) { - this(xPosition, yPosition, width, height, GuiTextures.VANILLA_BUTTON, isPressedCondition, setPressedExecutor); - } - - public ToggleButtonWidget(int xPosition, int yPosition, int width, int height, IGuiTexture buttonTexture, - BooleanSupplier isPressedCondition, BooleanConsumer setPressedExecutor) { - super(xPosition, yPosition, width, height, null); - texture = buttonTexture; - if (buttonTexture instanceof ResourceTexture resourceTexture) { - setTexture(resourceTexture.getSubTexture(0, 0, 1, 0.5), resourceTexture.getSubTexture(0, 0.5, 1, 0.5)); - } else { - setTexture(buttonTexture, buttonTexture); - } - - setSupplier(isPressedCondition::getAsBoolean); - setOnPressCallback((cd, bool) -> { - setPressedExecutor.accept(bool.booleanValue()); - this.updateHoverTooltips(); - }); - } - - public ToggleButtonWidget setShouldUseBaseBackground() { - if (texture != null) { - setTexture( - new GuiTextureGroup(GuiTextures.TOGGLE_BUTTON_BACK.getSubTexture(0, 0, 1, 0.5), texture), - new GuiTextureGroup(GuiTextures.TOGGLE_BUTTON_BACK.getSubTexture(0, 0.5, 1, 0.5), texture)); - } - return this; - } - - public ToggleButtonWidget setTooltipText(String tooltipText) { - this.tooltipText = tooltipText; - updateHoverTooltips(); - return this; - } - - public ToggleButtonWidget isMultiLang() { - isMultiLang = true; - updateHoverTooltips(); - return this; - } - - protected void updateHoverTooltips() { - if (tooltipText != null) { - if (!isMultiLang) { - setHoverTooltips(tooltipText + (isPressed ? ".enabled" : ".disabled")); - } else { - setHoverTooltips(LangUtil.getMultiLang(tooltipText + (isPressed ? ".enabled" : ".disabled"))); - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/CombinedDirectionalConfigurator.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/CombinedDirectionalConfigurator.java deleted file mode 100644 index cf281d96a37..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/CombinedDirectionalConfigurator.java +++ /dev/null @@ -1,195 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.widget.directional; - -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.utils.GTUtil; - -import com.lowdragmc.lowdraglib.client.scene.ISceneBlockRenderHook; -import com.lowdragmc.lowdraglib.client.scene.WorldSceneRenderer; -import com.lowdragmc.lowdraglib.gui.editor.ColorPattern; -import com.lowdragmc.lowdraglib.gui.util.ClickData; -import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; -import com.lowdragmc.lowdraglib.gui.widget.SceneWidget; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.utils.BlockPosFace; -import com.lowdragmc.lowdraglib.utils.Position; -import com.lowdragmc.lowdraglib.utils.Size; - -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -import com.mojang.blaze3d.platform.GlStateManager; -import com.mojang.blaze3d.systems.RenderSystem; -import org.jetbrains.annotations.Nullable; - -import java.util.List; - -import javax.annotation.ParametersAreNonnullByDefault; - -@MethodsReturnNonnullByDefault -@ParametersAreNonnullByDefault -public class CombinedDirectionalConfigurator extends WidgetGroup { - - protected final static int MOUSE_CLICK_CLIENT_ACTION_ID = 0x0001_0001; - protected final static int UPDATE_UI_ID = 0x0001_0002; - - protected final IDirectionalConfigHandler[] configHandlers; - protected final int width, height; - private final FancyMachineUIWidget machineUI; - private final MetaMachine machine; - - protected SceneWidget sceneWidget; - protected ImageWidget imageWidget; - - protected @Nullable BlockPos selectedPos; - protected @Nullable Direction selectedSide; - - public CombinedDirectionalConfigurator(FancyMachineUIWidget machineUI, IDirectionalConfigHandler[] configHandlers, - MetaMachine machine, int width, int height) { - super(0, 0, width, height); - this.width = width; - this.height = height; - - this.machineUI = machineUI; - this.configHandlers = configHandlers; - this.machine = machine; - } - - @Override - public void initWidget() { - super.initWidget(); - - addWidget(imageWidget = new ImageWidget(0, 0, width, height, GuiTextures.BACKGROUND_INVERSE)); - addWidget(sceneWidget = createSceneWidget()); - - for (IDirectionalConfigHandler configHandler : configHandlers) { - configHandler.addAdditionalUIElements(this); - } - - addConfigWidgets(sceneWidget); - } - - private SceneWidget createSceneWidget() { - var pos = this.machine.getBlockPos(); - - SceneWidget sceneWidget = new SceneWidget(4, 4, width - 8, height - 8, this.machine.getLevel()) - .setRenderedCore(List.of(pos), null) - .setRenderSelect(false) - .setOnSelected(this::onSideSelected); - - if (isRemote()) { - sceneWidget.getRenderer().addRenderedBlocks( - List.of(pos.above(), pos.below(), pos.north(), pos.south(), pos.east(), pos.west()), - new ISceneBlockRenderHook() { - - @Override - @OnlyIn(Dist.CLIENT) - public void apply(boolean isTESR, RenderType layer) { - RenderSystem.enableBlend(); - RenderSystem.blendFunc(GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ONE); - } - }); - - sceneWidget.getRenderer().setAfterWorldRender(this::renderOverlays); - - var playerRotation = gui.entityPlayer.getRotationVector(); - sceneWidget.setCameraYawAndPitch(playerRotation.x, playerRotation.y - 90); - } - sceneWidget.setBackground(ColorPattern.BLACK.rectTexture()); - return sceneWidget; - } - - private void renderOverlays(WorldSceneRenderer renderer) { - sceneWidget.renderBlockOverLay(renderer); - - for (Direction face : GTUtil.DIRECTIONS) { - for (IDirectionalConfigHandler configHandler : configHandlers) { - configHandler.renderOverlay(sceneWidget, new BlockPosFace(machine.getBlockPos(), face)); - } - } - } - - private void addConfigWidgets(SceneWidget sceneWidget) { - int yOffsetLeft = 0, yOffsetRight = 0; - - for (IDirectionalConfigHandler configHandler : configHandlers) { - Widget widget = configHandler.getSideSelectorWidget(sceneWidget, machineUI); - - if (widget == null) - continue; - - final Size widgetSize = widget.getSize(); - switch (configHandler.getScreenSide()) { - case LEFT -> { - widget.setSelfPosition(new Position(6, height - 6 - widgetSize.height - yOffsetLeft)); - yOffsetLeft += widgetSize.height + 3; - } - case RIGHT -> { - widget.setSelfPosition( - new Position(width - widgetSize.width - 6, height - 6 - widgetSize.height - yOffsetRight)); - yOffsetRight += widgetSize.height + 3; - } - } - - this.addWidget(widget); - } - } - - protected void onSideSelected(BlockPos pos, Direction side) { - if (!pos.equals(machine.getBlockPos())) - return; - - if (this.selectedSide == side) - return; // No need to do anything if the same side is already selected - - this.selectedSide = side; - - for (IDirectionalConfigHandler configWidget : this.configHandlers) { - configWidget.onSideSelected(pos, side); - } - } - - @Override - @OnlyIn(Dist.CLIENT) - public boolean mouseClicked(double mouseX, double mouseY, int button) { - var lastSide = this.selectedSide; - - var result = super.mouseClicked(mouseX, mouseY, button); - - if (isMouseOverElement(mouseX, mouseY) && this.selectedSide == lastSide && this.selectedSide != null) { - var hover = sceneWidget.getHoverPosFace(); - - if (hover != null && hover.pos.equals(machine.getBlockPos()) && hover.facing == this.selectedSide) { - var cd = new ClickData(); - writeClientAction(MOUSE_CLICK_CLIENT_ACTION_ID, buf -> { - cd.writeToBuf(buf); - buf.writeByte(this.selectedSide.ordinal()); - }); - } - } - - return result; - } - - @Override - public void handleClientAction(int id, FriendlyByteBuf buf) { - if (id != MOUSE_CLICK_CLIENT_ACTION_ID) { - super.handleClientAction(id, buf); - return; - } - - var clickData = ClickData.readFromBuf(buf); - var side = GTUtil.DIRECTIONS[buf.readByte()]; - - for (IDirectionalConfigHandler configHandler : configHandlers) { - configHandler.handleClick(clickData, side); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/IDirectionalConfigHandler.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/IDirectionalConfigHandler.java deleted file mode 100644 index 024b4465873..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/IDirectionalConfigHandler.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.widget.directional; - -import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; - -import com.lowdragmc.lowdraglib.gui.util.ClickData; -import com.lowdragmc.lowdraglib.gui.widget.SceneWidget; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.utils.BlockPosFace; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -public interface IDirectionalConfigHandler { - - /** - * Returns the buttons to display inside the side selector - */ - Widget getSideSelectorWidget(SceneWidget scene, FancyMachineUIWidget machineUI); - - /** - * Called whenever a side is selected in the side selector GUI - */ - void onSideSelected(BlockPos pos, Direction side); - - /** - * Determines which side of the screen the UI element should be placed on. - */ - ScreenSide getScreenSide(); - - enum ScreenSide { - LEFT, - RIGHT, - } - - default void handleClick(ClickData cd, Direction direction) { - // Do nothing by default - } - - @OnlyIn(Dist.CLIENT) - default void renderOverlay(SceneWidget sceneWidget, BlockPosFace blockPosFace) { - // Do nothing by default - } - - default void addAdditionalUIElements(WidgetGroup parent) { - // Do nothing by default - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputFluidConfigHandler.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputFluidConfigHandler.java deleted file mode 100644 index 605950bf070..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputFluidConfigHandler.java +++ /dev/null @@ -1,154 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.widget.directional.handlers; - -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; -import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; -import com.gregtechceu.gtceu.api.gui.widget.directional.IDirectionalConfigHandler; -import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait; -import com.gregtechceu.gtceu.data.lang.LangHandler; - -import com.gregtechceu.gtceu.data.lang.LangUtil; -import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.util.ClickData; -import com.lowdragmc.lowdraglib.gui.widget.*; -import com.lowdragmc.lowdraglib.utils.BlockPosFace; -import com.lowdragmc.lowdraglib.utils.Position; - -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -import com.mojang.blaze3d.vertex.PoseStack; - -import javax.annotation.ParametersAreNonnullByDefault; - -@MethodsReturnNonnullByDefault -@ParametersAreNonnullByDefault -public class AutoOutputFluidConfigHandler implements IDirectionalConfigHandler { - - private static final IGuiTexture TEXTURE_OFF = new GuiTextureGroup( - GuiTextures.VANILLA_BUTTON, - GuiTextures.IO_CONFIG_FLUID_MODES_BUTTON.getSubTexture(0, 0, 1, 1 / 3f)); - private static final IGuiTexture TEXTURE_OUTPUT = new GuiTextureGroup( - GuiTextures.VANILLA_BUTTON, - GuiTextures.IO_CONFIG_FLUID_MODES_BUTTON.getSubTexture(0, 1 / 3f, 1, 1 / 3f)); - private static final IGuiTexture TEXTURE_AUTO = new GuiTextureGroup( - GuiTextures.VANILLA_BUTTON, - GuiTextures.IO_CONFIG_FLUID_MODES_BUTTON.getSubTexture(0, 2 / 3f, 1, 1 / 3f)); - - private final AutoOutputTrait trait; - private Direction side; - private ButtonWidget ioModeButton; - - public AutoOutputFluidConfigHandler(AutoOutputTrait trait) { - this.trait = trait; - } - - @Override - public Widget getSideSelectorWidget(SceneWidget scene, FancyMachineUIWidget machineUI) { - WidgetGroup group = new WidgetGroup(0, 0, (18 * 2) + 1, 18); - - group.addWidget(ioModeButton = new ButtonWidget(0, 0, 18, 18, this::onIOModePressed) { - - @Override - public void updateScreen() { - super.updateScreen(); - if (side == null) { - setButtonTexture(TEXTURE_OFF); - setHoverTooltips(LangUtil.getMultiLang("gtceu.gui.fluid_auto_output.unselected")); - } else if (trait.getFluidOutputDirection() == side) { - if (trait.isAutoOutputFluids()) { - setButtonTexture(TEXTURE_AUTO); - setHoverTooltips("gtceu.gui.fluid_auto_output.enabled"); - } else { - setButtonTexture(TEXTURE_OUTPUT); - setHoverTooltips("gtceu.gui.fluid_auto_output.disabled"); - } - } else { - setButtonTexture(TEXTURE_OFF); - setHoverTooltips(LangUtil.getMultiLang("gtceu.gui.fluid_auto_output.other_direction")); - } - } - }); - - group.addWidget(new ToggleButtonWidget( - 19, 0, 18, 18, GuiTextures.BUTTON_FLUID_OUTPUT, - trait::allowsFluidInputFromOutputSide, trait::setAllowFluidInputFromOutputSide) - .setShouldUseBaseBackground().setTooltipText("gtceu.gui.fluid_auto_output.allow_input")); - - return group; - } - - private void onIOModePressed(ClickData cd) { - if (this.side == null) - return; - - if (trait.getFluidOutputDirection() == this.side) { - trait.setAllowAutoOutputFluids(!trait.isAutoOutputFluids()); - } else { - trait.setAllowAutoOutputFluids(false); - trait.setFluidOutputDirection(this.side); - } - } - - @Override - public void onSideSelected(BlockPos pos, Direction side) { - this.side = side; - } - - @Override - public ScreenSide getScreenSide() { - return ScreenSide.LEFT; - } - - @Override - public void handleClick(ClickData cd, Direction direction) { - if (!canHandleClick(cd) || !trait.supportsAutoOutputFluids()) - return; - - if (trait.getFluidOutputDirection() != side) { - trait.setFluidOutputDirection(side); - trait.setAllowAutoOutputFluids(false); - } else { - trait.setAllowAutoOutputFluids(!trait.isAutoOutputFluids()); - } - } - - @SuppressWarnings("RedundantIfStatement") // Cleaner code this way - private boolean canHandleClick(ClickData cd) { - if (cd.button == 1) - return true; - - return false; - } - - @Override - @OnlyIn(Dist.CLIENT) - public void renderOverlay(SceneWidget sceneWidget, BlockPosFace blockPosFace) { - if (trait.getFluidOutputDirection() != blockPosFace.facing) - return; - - sceneWidget.drawFacingBorder(new PoseStack(), blockPosFace, - trait.isAutoOutputFluids() ? 0xff00b4ff : 0x8f00b4ff, 2); - } - - @Override - public void addAdditionalUIElements(WidgetGroup parent) { - LabelWidget text = new LabelWidget(4, 4, "gtceu.gui.auto_output.name") { - - @Override - public boolean isVisible() { - return trait.isAutoOutputFluids() && trait.getFluidOutputDirection() != null; - } - }; - - text.setSelfPosition(new Position(parent.getSize().width - 4 - text.getSize().width, 4)); - - text.setTextColor(0xff00b4ff).setDropShadow(false); - parent.addWidget(text); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputItemConfigHandler.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputItemConfigHandler.java deleted file mode 100644 index 9a33bb6d805..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputItemConfigHandler.java +++ /dev/null @@ -1,152 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.widget.directional.handlers; - -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; -import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; -import com.gregtechceu.gtceu.api.gui.widget.directional.IDirectionalConfigHandler; -import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait; -import com.gregtechceu.gtceu.data.lang.LangHandler; - -import com.gregtechceu.gtceu.data.lang.LangUtil; -import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.util.ClickData; -import com.lowdragmc.lowdraglib.gui.widget.*; -import com.lowdragmc.lowdraglib.utils.BlockPosFace; - -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -import com.mojang.blaze3d.vertex.PoseStack; - -import javax.annotation.ParametersAreNonnullByDefault; - -@MethodsReturnNonnullByDefault -@ParametersAreNonnullByDefault -public class AutoOutputItemConfigHandler implements IDirectionalConfigHandler { - - private static final IGuiTexture TEXTURE_OFF = new GuiTextureGroup( - GuiTextures.VANILLA_BUTTON, - GuiTextures.IO_CONFIG_ITEM_MODES_BUTTON.getSubTexture(0, 0, 1, 1 / 3f)); - private static final IGuiTexture TEXTURE_OUTPUT = new GuiTextureGroup( - GuiTextures.VANILLA_BUTTON, - GuiTextures.IO_CONFIG_ITEM_MODES_BUTTON.getSubTexture(0, 1 / 3f, 1, 1 / 3f)); - private static final IGuiTexture TEXTURE_AUTO = new GuiTextureGroup( - GuiTextures.VANILLA_BUTTON, - GuiTextures.IO_CONFIG_ITEM_MODES_BUTTON.getSubTexture(0, 2 / 3f, 1, 1 / 3f)); - - private final AutoOutputTrait trait; - private Direction side; - private ButtonWidget ioModeButton; - - public AutoOutputItemConfigHandler(AutoOutputTrait trait) { - this.trait = trait; - } - - @Override - public Widget getSideSelectorWidget(SceneWidget scene, FancyMachineUIWidget machineUI) { - WidgetGroup group = new WidgetGroup(0, 0, (18 * 2) + 1, 18); - - group.addWidget(ioModeButton = new ButtonWidget(0, 0, 18, 18, this::onIOModePressed) { - - @Override - public void updateScreen() { - super.updateScreen(); - - if (side == null) { - setButtonTexture(TEXTURE_OFF); - setHoverTooltips(LangUtil.getMultiLang("gtceu.gui.item_auto_output.unselected")); - } else if (trait.getItemOutputDirection() == side) { - if (trait.isAutoOutputItems()) { - setButtonTexture(TEXTURE_AUTO); - setHoverTooltips("gtceu.gui.item_auto_output.enabled"); - } else { - setButtonTexture(TEXTURE_OUTPUT); - setHoverTooltips("gtceu.gui.item_auto_output.disabled"); - } - } else { - setButtonTexture(TEXTURE_OFF); - setHoverTooltips(LangUtil.getMultiLang("gtceu.gui.item_auto_output.other_direction")); - } - } - }); - - group.addWidget(new ToggleButtonWidget( - 19, 0, 18, 18, GuiTextures.BUTTON_ITEM_OUTPUT, - trait::allowsItemInputFromOutputSide, trait::setAllowItemInputFromOutputSide) - .setShouldUseBaseBackground().setTooltipText("gtceu.gui.item_auto_output.allow_input")); - - return group; - } - - private void onIOModePressed(ClickData cd) { - if (this.side == null) - return; - - if (trait.getItemOutputDirection() == this.side) { - trait.setAllowAutoOutputItems(!trait.isAutoOutputItems()); - } else { - trait.setAllowAutoOutputItems(false); - trait.setItemOutputDirection(this.side); - } - } - - @Override - public void onSideSelected(BlockPos pos, Direction side) { - this.side = side; - } - - @Override - public ScreenSide getScreenSide() { - return ScreenSide.LEFT; - } - - @Override - public void handleClick(ClickData cd, Direction direction) { - if (!canHandleClick(cd) || !trait.supportsAutoOutputItems()) - return; - - if (trait.getItemOutputDirection() != side) { - trait.setItemOutputDirection(side); - trait.setAllowAutoOutputItems(false); - } else { - trait.setAllowAutoOutputItems(!trait.isAutoOutputItems()); - } - } - - @SuppressWarnings("RedundantIfStatement") // Cleaner code this way - private boolean canHandleClick(ClickData cd) { - if (cd.button == 0) - return true; - - return false; - } - - @Override - @OnlyIn(Dist.CLIENT) - public void renderOverlay(SceneWidget sceneWidget, BlockPosFace blockPosFace) { - if (trait.getItemOutputDirection() != blockPosFace.facing) - return; - - sceneWidget.drawFacingBorder(new PoseStack(), blockPosFace, - trait.isAutoOutputItems() ? 0xffff6e0f : 0x8fff6e0f, 1); - } - - @Override - public void addAdditionalUIElements(WidgetGroup parent) { - LabelWidget text = new LabelWidget(4, 4, "gtceu.gui.auto_output.name") { - - @Override - public boolean isVisible() { - return trait.isAutoOutputItems() && trait.getItemOutputDirection() != null; - } - }; - - text.setTextColor(0xffff6e0f).setDropShadow(false); - parent.addWidget(text); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/CoverableConfigHandler.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/CoverableConfigHandler.java deleted file mode 100644 index d20d95c0003..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/CoverableConfigHandler.java +++ /dev/null @@ -1,218 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.widget.directional.handlers; - -import com.gregtechceu.gtceu.api.capability.ICoverable; -import com.gregtechceu.gtceu.api.cover.CoverBehavior; -import com.gregtechceu.gtceu.api.cover.IUICover; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.fancy.ConfiguratorPanel; -import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; -import com.gregtechceu.gtceu.api.gui.widget.CoverConfigurator; -import com.gregtechceu.gtceu.api.gui.widget.PredicatedButtonWidget; -import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; -import com.gregtechceu.gtceu.api.gui.widget.directional.IDirectionalConfigHandler; -import com.gregtechceu.gtceu.api.item.IComponentItem; -import com.gregtechceu.gtceu.api.item.component.IItemComponent; -import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; -import com.gregtechceu.gtceu.common.item.behavior.CoverPlaceBehavior; - -import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.util.ClickData; -import com.lowdragmc.lowdraglib.gui.widget.SceneWidget; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.utils.Position; -import com.lowdragmc.lowdraglib.utils.Size; - -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.item.ItemStack; - -import javax.annotation.ParametersAreNonnullByDefault; - -@MethodsReturnNonnullByDefault -@ParametersAreNonnullByDefault -public class CoverableConfigHandler implements IDirectionalConfigHandler { - - private static final IGuiTexture CONFIG_BTN_TEXTURE = new GuiTextureGroup(GuiTextures.IO_CONFIG_COVER_SETTINGS); - - private final ICoverable machine; - private CustomItemStackHandler handler; - private Direction side; - - private ConfiguratorPanel panel; - private ConfiguratorPanel.FloatingTab coverConfigurator; - - private SlotWidget slotWidget; - private CoverBehavior coverBehavior; - - public CoverableConfigHandler(ICoverable machine) { - this.machine = machine; - this.handler = createItemStackHandler(); - } - - private CustomItemStackHandler createItemStackHandler() { - var handler = new CustomItemStackHandler(1) { - - @Override - public int getSlotLimit(int slot) { - return 1; - } - }; - - handler.setFilter(itemStack -> { - if (itemStack.isEmpty()) return true; - if (this.side == null) return false; - return CoverPlaceBehavior.isCoverBehaviorItem(itemStack, () -> false, - coverDef -> ICoverable.canPlaceCover(coverDef, this.machine)); - }); - - return handler; - } - - @Override - public Widget getSideSelectorWidget(SceneWidget scene, FancyMachineUIWidget machineUI) { - WidgetGroup group = new WidgetGroup(0, 0, (18 * 2) + 1, 18); - this.panel = machineUI.getConfiguratorPanel(); - - group.addWidget(slotWidget = new SlotWidget(handler, 0, 19, 0) { - - @Override - public boolean canPutStack(ItemStack stack) { - return super.canPutStack(stack) && CoverPlaceBehavior.isCoverBehaviorItem(stack, () -> false, - def -> def.createCoverBehavior(machine, side).canAttach()); - } - } - .setChangeListener(this::coverItemChanged) - .setBackgroundTexture(new GuiTextureGroup(GuiTextures.SLOT, GuiTextures.IO_CONFIG_COVER_SLOT_OVERLAY))); - group.addWidget(new PredicatedButtonWidget(0, 0, 18, 18, CONFIG_BTN_TEXTURE, this::toggleConfigTab, - () -> side != null && coverBehavior != null && machine.getCoverAtSide(side) instanceof IUICover)); - - checkCoverBehaviour(); - - return group; - } - - // FIXME: This gets called twice in a single tick, causing two covers to exist simultaneously - private void coverItemChanged() { - closeConfigTab(); - - if (!(panel.getGui().entityPlayer instanceof ServerPlayer serverPlayer) || side == null) - return; - - var item = handler.getStackInSlot(0); - if (machine.getCoverAtSide(side) != null) { - machine.removeCover(false, side, serverPlayer); - } - - if (!item.isEmpty() && machine.getCoverAtSide(side) == null) { - if (item.getItem() instanceof IComponentItem componentItem) { - for (IItemComponent component : componentItem.getComponents()) { - if (component instanceof CoverPlaceBehavior placeBehavior) { - machine.placeCoverOnSide(side, item, placeBehavior.coverDefinition(), serverPlayer); - break; - } - } - } - } - - checkCoverBehaviour(); - } - - @Override - public void onSideSelected(BlockPos pos, Direction side) { - this.side = side; - checkCoverBehaviour(); - closeConfigTab(); - } - - private void updateWidgetVisibility() { - var sideSelected = this.side != null; - slotWidget.setVisible(sideSelected); - slotWidget.setActive(sideSelected); - } - - public void checkCoverBehaviour() { - if (side == null) - return; - - var coverBehaviour = machine.getCoverAtSide(side); - if (coverBehaviour != this.coverBehavior) { - this.coverBehavior = coverBehaviour; - - var attachItem = coverBehaviour == null ? ItemStack.EMPTY : coverBehaviour.getAttachItem(); - handler.setStackInSlot(0, attachItem); - handler.onContentsChanged(0); - } - - updateWidgetVisibility(); - } - - private void toggleConfigTab(ClickData cd) { - if (this.coverConfigurator == null) - openConfigTab(); - else - closeConfigTab(); - } - - private void openConfigTab() { - CoverConfigurator configurator = new CoverConfigurator(this.machine, this.side, this.coverBehavior) { - - @Override - public Component getTitle() { - // Uses the widget's own title - return Component.empty(); - } - - @Override - public IGuiTexture getIcon() { - return GuiTextures.CLOSE_ICON; - } - - @Override - public Widget createConfigurator() { - WidgetGroup group = new WidgetGroup(new Position(0, 0)); - - if (side == null || !(coverable.getCoverAtSide(side) instanceof IUICover iuiCover)) - return group; - - Widget coverConfigurator = iuiCover.createUIWidget(); - coverConfigurator.addSelfPosition(-1, -20); - - group.addWidget(coverConfigurator); - group.setSize(new Size( - Math.max(120, coverConfigurator.getSize().width), - Math.max(80, coverConfigurator.getSize().height - 20))); - - return group; - } - }; - - this.coverConfigurator = this.panel.createFloatingTab(configurator); - this.coverConfigurator.setGui(this.panel.getGui()); - this.panel.addWidget(this.coverConfigurator); - this.panel.expandTab(this.coverConfigurator); - - coverConfigurator.onClose(() -> { - if (coverConfigurator != null) { - this.panel.removeWidget(this.coverConfigurator); - } - - this.coverConfigurator = null; - }); - } - - private void closeConfigTab() { - if (this.coverConfigurator != null) { - this.panel.collapseTab(); - } - } - - @Override - public ScreenSide getScreenSide() { - return ScreenSide.RIGHT; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/ComponentItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/ComponentItem.java index b45213e753e..c4814247d4b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/ComponentItem.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/ComponentItem.java @@ -1,14 +1,11 @@ package com.gregtechceu.gtceu.api.item; +import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.IElectricItem; import com.gregtechceu.gtceu.api.item.capability.ElectricItem; import com.gregtechceu.gtceu.api.item.component.*; - -import com.lowdragmc.lowdraglib.client.renderer.IItemRendererProvider; -import com.lowdragmc.lowdraglib.client.renderer.IRenderer; -import com.lowdragmc.lowdraglib.gui.factory.HeldItemUIFactory; -import com.lowdragmc.lowdraglib.gui.modular.ModularUI; +import com.gregtechceu.gtceu.api.mui.IItemUIHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -36,6 +33,10 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelReader; +import brachy.modularui.factory.PlayerInventoryGuiData; +import brachy.modularui.screen.ModularPanel; +import brachy.modularui.screen.UISettings; +import brachy.modularui.value.sync.PanelSyncManager; import com.google.common.collect.Multimap; import lombok.Getter; import org.jetbrains.annotations.Nullable; @@ -48,8 +49,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class ComponentItem extends Item - implements HeldItemUIFactory.IHeldItemUIHolder, IItemRendererProvider, IComponentItem { +public class ComponentItem extends Item implements IComponentItem, IItemUIHolder { protected int burnTime = -1; @@ -294,28 +294,6 @@ public String getDescriptionId(ItemStack stack) { return super.getDescriptionId(stack); } - @Override - @Nullable - public ModularUI createUI(Player entityPlayer, HeldItemUIFactory.HeldItemHolder holder) { - for (IItemComponent component : components) { - if (component instanceof IItemUIFactory uiFactory) { - return uiFactory.createUI(holder, entityPlayer); - } - } - return null; - } - - @Nullable - @Override - public IRenderer getRenderer(ItemStack stack) { - for (IItemComponent component : components) { - if (component instanceof ICustomRenderer customRenderer) { - return customRenderer.getRenderer(); - } - } - return null; - } - @Override public void inventoryTick(ItemStack stack, Level level, Entity entity, int slotId, boolean isSelected) { for (IItemComponent component : components) { @@ -443,4 +421,24 @@ public ItemStack getInfiniteChargedStack() { electricItem.setInfiniteCharge(true); return itemStack; } + + @Override + public @Nullable ModularPanel buildUI(PlayerInventoryGuiData data, PanelSyncManager syncManager, + UISettings settings) { + for (IItemComponent component : getComponents()) { + if (component instanceof IItemUIHolder uiHolder) { + return uiHolder.buildUI(data, syncManager, settings); + } + } + GTCEu.LOGGER.error("Tried to get UI of {} item when it does not have one!", data.getUsedItemStack()); + return null; + } + + @Override + public boolean shouldOpenUI() { + for (IItemComponent component : getComponents()) { + if (component instanceof IItemUIHolder holder) return holder.shouldOpenUI(); + } + return false; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java b/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java index 5cb663161af..8daf0efa52c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java @@ -19,15 +19,13 @@ import com.gregtechceu.gtceu.api.item.tool.aoe.AoESymmetrical; import com.gregtechceu.gtceu.api.item.tool.behavior.IToolBehavior; import com.gregtechceu.gtceu.api.item.tool.behavior.IToolUIBehavior; +import com.gregtechceu.gtceu.api.mui.GTGuiScreen; import com.gregtechceu.gtceu.api.sound.SoundEntry; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.recipe.VanillaRecipeHelper; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTUtil; -import com.lowdragmc.lowdraglib.gui.factory.HeldItemUIFactory; -import com.lowdragmc.lowdraglib.gui.modular.ModularUI; - import net.minecraft.Util; import net.minecraft.client.color.item.ItemColor; import net.minecraft.core.BlockPos; @@ -69,6 +67,12 @@ import net.minecraftforge.common.extensions.IForgeItem; import net.minecraftforge.common.util.LazyOptional; +import brachy.modularui.api.IUIHolder; +import brachy.modularui.factory.PlayerInventoryGuiData; +import brachy.modularui.screen.ModularPanel; +import brachy.modularui.screen.ModularScreen; +import brachy.modularui.screen.UISettings; +import brachy.modularui.value.sync.PanelSyncManager; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import it.unimi.dsi.fastutil.objects.Object2IntLinkedOpenHashMap; @@ -80,10 +84,11 @@ import java.util.stream.Collectors; import static com.gregtechceu.gtceu.api.item.tool.ToolHelper.*; +import static com.gregtechceu.gtceu.data.recipe.generated.ToolRecipeHandler.powerUnitItems; import static net.minecraft.world.item.Item.BASE_ATTACK_DAMAGE_UUID; import static net.minecraft.world.item.Item.BASE_ATTACK_SPEED_UUID; -public interface IGTTool extends HeldItemUIFactory.IHeldItemUIHolder, ItemLike, IForgeItem { +public interface IGTTool extends IUIHolder>, ItemLike, IForgeItem { GTToolType getToolType(); @@ -345,39 +350,29 @@ default int getTotalHarvestLevel(ItemStack stack) { if (!player.isShiftKeyDown()) { ServerPlayer serverPlayer = (ServerPlayer) player; - int result = -1; - if (isTool(stack, GTToolType.SHEARS)) { - result = shearBlockRoutine(serverPlayer, stack, pos); - } - if (result != 0) { - // prevent exploits with instantly breakable blocks - BlockState state = player.level().getBlockState(pos); - boolean effective = false; - for (GTToolType type : getToolClasses(stack)) { - if (type.harvestTags.stream().anyMatch(state::is)) { - effective = true; - break; - } + // prevent exploits with instantly breakable blocks + BlockState state = player.level().getBlockState(pos); + boolean effective = false; + for (GTToolType type : getToolClasses(stack)) { + if (type.harvestTags.stream().anyMatch(state::is)) { + effective = true; + break; } + } - effective |= isToolEffective(state, getToolClasses(stack), getTotalHarvestLevel(stack)); - - if (effective) { - if (areaOfEffectBlockBreakRoutine(stack, serverPlayer, pos)) { - if (playSoundOnBlockDestroy()) playSound(player); - } else { - if (result == -1) { - var tag = getBehaviorsTag(stack); - if (tag.getBoolean(TREE_FELLING_KEY) && - !tag.getBoolean(DISABLE_TREE_FELLING_KEY) && - state.is(BlockTags.LOGS)) { - TreeFellingHelper.fellTree(stack, player.level(), state, pos, player); - } - if (playSoundOnBlockDestroy()) playSound(player); - } else { - return true; - } + effective |= isToolEffective(state, getToolClasses(stack), getTotalHarvestLevel(stack)); + + if (effective) { + if (areaOfEffectBlockBreakRoutine(stack, serverPlayer, pos)) { + if (playSoundOnBlockDestroy()) playSound(player); + } else { + var tag = getBehaviorsTag(stack); + if (tag.getBoolean(TREE_FELLING_KEY) && + !tag.getBoolean(DISABLE_TREE_FELLING_KEY) && + state.is(BlockTags.LOGS)) { + TreeFellingHelper.fellTree(stack, player.level(), state, pos, player); } + if (playSoundOnBlockDestroy()) playSound(player); } } } @@ -390,7 +385,8 @@ default int getTotalHarvestLevel(ItemStack stack) { getToolStats().getBehaviors() .forEach(behavior -> behavior.onBlockDestroyed(stack, worldIn, state, pos, entityLiving)); - if ((double) state.getDestroySpeed(worldIn, pos) != 0.0D) { + if ((double) state.getDestroySpeed(worldIn, pos) != 0.0D || + getToolType().harvestTags.stream().anyMatch(state::is)) { ToolHelper.damageItem(stack, entityLiving, getToolStats().getToolDamagePerBlockBreak(stack)); } if (entityLiving instanceof Player && playSoundOnBlockDestroy()) { @@ -646,6 +642,18 @@ default Map getDefaultEnchantments(ItemStack stack) { return InteractionResultHolder.pass(heldItem); } + default InteractionResult definition$interactLivingEntity(ItemStack stack, Player player, + LivingEntity interactionTarget, + InteractionHand usedHand) { + for (IToolBehavior behavior : getToolStats().getBehaviors()) { + if (behavior.onInteractLivingEntity(stack, player, interactionTarget, usedHand) == + InteractionResult.SUCCESS) { + return InteractionResult.SUCCESS; + } + } + return InteractionResult.PASS; + } + default boolean definition$shouldOpenUIAfterUse(UseOnContext context) { for (IToolBehavior behavior : getToolStats().getBehaviors()) { if (!behavior.shouldOpenUIAfterUse(context)) { @@ -658,6 +666,18 @@ default Map getDefaultEnchantments(ItemStack stack) { default void definition$fillItemCategory(CreativeModeTab category, @NotNull NonNullList items) { if (isElectric()) { + int tier = getElectricTier(); + if (!powerUnitItems.containsKey(tier)) { + items.add(get(Integer.MAX_VALUE)); + return; + } + var components = ((ComponentItem) powerUnitItems.get(tier).asItem()).getComponents(); + for (var component : components) { + if (component instanceof ElectricStats electricStats) { + items.add(get(electricStats.maxCharge)); + return; + } + } items.add(get(Integer.MAX_VALUE)); } else { items.add(get()); @@ -877,14 +897,21 @@ default void playSound(Player player) { } @Override - default ModularUI createUI(Player player, HeldItemUIFactory.HeldItemHolder holder) { + @OnlyIn(Dist.CLIENT) + default ModularScreen createScreen(PlayerInventoryGuiData data, ModularPanel mainPanel) { + return new GTGuiScreen(mainPanel); + } + + @Override + default ModularPanel buildUI(PlayerInventoryGuiData data, PanelSyncManager syncManager, UISettings settings) { for (var behavior : getToolStats().getBehaviors()) { - if (!(behavior instanceof IToolUIBehavior uiBehavior) || !uiBehavior.openUI(player, holder.getHand())) { + if (!(behavior instanceof IToolUIBehavior uiBehavior) || + !uiBehavior.shouldOpenUI(data.getPlayer(), data.getPlayer().getUsedItemHand())) { continue; } - return uiBehavior.createUI(player, holder); + return uiBehavior.buildUI(data, syncManager, settings); } - return new ModularUI(holder, player); + return null; } default Set getToolClasses(ItemStack stack) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/MaterialBlockItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/MaterialBlockItem.java index 6c8addb7469..48f3e90e44c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/MaterialBlockItem.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/MaterialBlockItem.java @@ -7,10 +7,6 @@ import com.gregtechceu.gtceu.api.data.chemical.material.properties.PropertyKey; import com.gregtechceu.gtceu.api.data.tag.TagPrefix; -import com.lowdragmc.lowdraglib.client.renderer.IBlockRendererProvider; -import com.lowdragmc.lowdraglib.client.renderer.IItemRendererProvider; -import com.lowdragmc.lowdraglib.client.renderer.IRenderer; - import net.minecraft.client.color.item.ItemColor; import net.minecraft.network.chat.Component; import net.minecraft.world.item.BlockItem; @@ -23,7 +19,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class MaterialBlockItem extends BlockItem implements IItemRendererProvider { +public class MaterialBlockItem extends BlockItem { public final TagPrefix tagPrefix; public final Material material; @@ -50,18 +46,8 @@ public static ItemColor tintColor(Material material) { return (itemStack, index) -> material.getLayerARGB(index); } - @Nullable - @Override - @OnlyIn(Dist.CLIENT) - public IRenderer getRenderer(ItemStack stack) { - if (getBlock() instanceof IBlockRendererProvider provider) { - return provider.getRenderer(getBlock().defaultBlockState()); - } - return null; - } - @Override - public String getDescriptionId() { + public @NotNull String getDescriptionId() { return getBlock().getDescriptionId(); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/component/ICustomRenderer.java b/src/main/java/com/gregtechceu/gtceu/api/item/component/ICustomRenderer.java deleted file mode 100644 index 9a295f6e91f..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/item/component/ICustomRenderer.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.gregtechceu.gtceu.api.item.component; - -import com.lowdragmc.lowdraglib.client.renderer.IRenderer; - -import org.jetbrains.annotations.NotNull; - -public interface ICustomRenderer extends IItemComponent { - - @NotNull - IRenderer getRenderer(); -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/component/IItemUIFactory.java b/src/main/java/com/gregtechceu/gtceu/api/item/component/IItemUIFactory.java deleted file mode 100644 index 33da6b1e1f2..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/item/component/IItemUIFactory.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.gregtechceu.gtceu.api.item.component; - -import com.lowdragmc.lowdraglib.gui.factory.HeldItemUIFactory; -import com.lowdragmc.lowdraglib.gui.modular.ModularUI; - -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResultHolder; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; - -public interface IItemUIFactory extends IInteractionItem { - - ModularUI createUI(HeldItemUIFactory.HeldItemHolder holder, Player entityPlayer); - - @Override - default InteractionResultHolder use(Item item, Level level, Player player, InteractionHand usedHand) { - ItemStack heldItem = player.getItemInHand(usedHand); - if (player instanceof ServerPlayer serverPlayer) { - HeldItemUIFactory.INSTANCE.openUI(serverPlayer, usedHand); - } - return InteractionResultHolder.success(heldItem); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/component/IMonitorModuleItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/component/IMonitorModuleItem.java index 91a12e74343..2d78e03b506 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/component/IMonitorModuleItem.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/component/IMonitorModuleItem.java @@ -5,19 +5,21 @@ import com.gregtechceu.gtceu.common.machine.multiblock.electric.CentralMonitorMachine; import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; -import com.lowdragmc.lowdraglib.gui.widget.Widget; - import net.minecraft.world.item.ItemStack; +import brachy.modularui.api.IPanelHandler; +import brachy.modularui.value.sync.PanelSyncManager; + public interface IMonitorModuleItem extends IItemComponent { default void tick(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group) {} default void tickInPlaceholder(ItemStack stack, PlaceholderContext context) {} - IMonitorRenderer getRenderer(ItemStack stack); + IMonitorRenderer getRenderer(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group); - Widget createUIWidget(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group); + IPanelHandler createModularPanel(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group, + PanelSyncManager syncManager); default String getType() { return "unknown"; diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/component/prospector/ProspectingUpdatePacket.java b/src/main/java/com/gregtechceu/gtceu/api/item/component/prospector/ProspectingUpdatePacket.java new file mode 100644 index 00000000000..793328b392b --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/item/component/prospector/ProspectingUpdatePacket.java @@ -0,0 +1,56 @@ +package com.gregtechceu.gtceu.api.item.component.prospector; + +import net.minecraft.network.FriendlyByteBuf; + +import java.lang.reflect.Array; + +public class ProspectingUpdatePacket { + + public int chunkX; + public int chunkZ; + public ProspectorMode mode; + public T[][][] data; + + public ProspectingUpdatePacket(int chunkX, int chunkZ, ProspectorMode mode) { + this.chunkX = chunkX; + this.chunkZ = chunkZ; + this.mode = mode; + // noinspection unchecked + this.data = (T[][][]) Array.newInstance(mode.getItemClass(), this.mode.cellSize, this.mode.cellSize, 0); + } + + public static ProspectingUpdatePacket read(ProspectorMode mode, FriendlyByteBuf buffer) { + int chunkX = buffer.readVarInt(); + int chunkZ = buffer.readVarInt(); + + ProspectingUpdatePacket packet = new ProspectingUpdatePacket<>(chunkX, chunkZ, mode); + + for (int x = 0; x < mode.cellSize; x++) { + for (int z = 0; z < mode.cellSize; z++) { + int cellEntryCount = buffer.readVarInt(); + // noinspection unchecked + packet.data[x][z] = (T[]) Array.newInstance(mode.getItemClass(), cellEntryCount); + for (int i = 0; i < cellEntryCount; i++) { + packet.data[x][z][i] = mode.deserialize(buffer); + } + } + } + + return packet; + } + + public void writePacketData(FriendlyByteBuf buffer) { + buffer.writeVarInt(chunkX); + buffer.writeVarInt(chunkZ); + + for (int x = 0; x < mode.cellSize; x++) { + for (int z = 0; z < mode.cellSize; z++) { + buffer.writeVarInt(data[x][z].length); + + for (T item : data[x][z]) { + mode.serialize(item, buffer); + } + } + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/ProspectorMode.java b/src/main/java/com/gregtechceu/gtceu/api/item/component/prospector/ProspectorMode.java similarity index 52% rename from src/main/java/com/gregtechceu/gtceu/api/gui/misc/ProspectorMode.java rename to src/main/java/com/gregtechceu/gtceu/api/item/component/prospector/ProspectorMode.java index 21939ec118b..1f402ed091c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/ProspectorMode.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/component/prospector/ProspectorMode.java @@ -1,6 +1,5 @@ -package com.gregtechceu.gtceu.api.gui.misc; +package com.gregtechceu.gtceu.api.item.component.prospector; -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.stack.MaterialEntry; @@ -9,27 +8,25 @@ import com.gregtechceu.gtceu.api.data.worldgen.bedrockfluid.BedrockFluidVeinSavedData; import com.gregtechceu.gtceu.api.data.worldgen.bedrockfluid.FluidVeinWorldEntry; import com.gregtechceu.gtceu.api.data.worldgen.bedrockore.BedrockOreVeinSavedData; -import com.gregtechceu.gtceu.api.gui.texture.ProspectingTexture; -import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.api.registry.GTRegistries; +import com.gregtechceu.gtceu.common.mui.drawable.CycleDrawable; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.core.mixins.BlockStateAccessor; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTUtil; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.texture.ItemStackTexture; -import com.lowdragmc.lowdraglib.gui.texture.ProgressTexture; -import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; -import com.lowdragmc.lowdraglib.side.fluid.forge.FluidHelperImpl; - -import net.minecraft.client.gui.GuiGraphics; import net.minecraft.core.BlockPos; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.material.Fluid; @@ -38,6 +35,12 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fluids.FluidStack; +import brachy.modularui.api.drawable.IDrawable; +import brachy.modularui.drawable.FluidDrawable; +import brachy.modularui.drawable.GuiDraw; +import brachy.modularui.drawable.ItemDrawable; +import brachy.modularui.screen.viewport.GuiContext; +import com.mojang.datafixers.util.Either; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import lombok.AllArgsConstructor; import lombok.Getter; @@ -48,112 +51,134 @@ import java.util.*; +@SuppressWarnings("deprecation") public abstract class ProspectorMode { - public static ProspectorMode ORE = new ProspectorMode<>("item.prospector.mode.ores", 16) { + public static ProspectorMode> ORE = new ProspectorMode<>( + "item.prospector.mode.ores", 16) { + + private static final String MATERIAL_PREFIX = "material_"; - private final Map BLOCK_CACHE = new HashMap<>(); - private final Map ICON_CACHE = new HashMap<>(); + private final Map> BLOCK_CACHE = new HashMap<>(); + private final Map, IDrawable> ICON_CACHE = new HashMap<>(); @Override - public void scan(String[][][] storage, LevelChunk chunk) { + public void scan(Either[][][] storage, LevelChunk chunk) { BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos(); var oreTag = TagUtil.createBlockTag("ores"); for (int x = 0; x < 16; x++) { for (int z = 0; z < 16; z++) { for (int y = chunk.getMaxBuildHeight() - 1; y >= chunk.getMinBuildHeight(); y--) { pos.set(x, y, z); - var state = chunk.getBlockState(pos); - if (state.is(oreTag)) { - var itemName = BLOCK_CACHE.computeIfAbsent(state, blockState -> { - var name = BuiltInRegistries.BLOCK.getKey(blockState.getBlock()).toString(); - var entry = ChemicalHelper.getMaterialEntry(blockState.getBlock()); - if (!entry.isEmpty()) { - name = "material_" + entry.material(); - } - return name; - }); - storage[x][z] = ArrayUtils.add(storage[x][z], itemName); - } + BlockState state = chunk.getBlockState(pos); + if (!state.is(oreTag)) continue; + + Either item = BLOCK_CACHE.computeIfAbsent(state, blockState -> { + MaterialEntry entry = ChemicalHelper.getMaterialEntry(blockState.getBlock()); + if (!entry.isEmpty()) { + return Either.left(entry.material()); + } + return Either.right(blockState); + }); + storage[x][z] = ArrayUtils.add(storage[x][z], item); } } } } @Override - public int getItemColor(String item) { - if (item.startsWith("material_")) { - var mat = GTMaterials.get(item.substring(9)); - if (!mat.isNull()) { - return mat.getMaterialRGB(); - } - } - return BuiltInRegistries.BLOCK.get(new ResourceLocation(item)).defaultMapColor().col; + public int getItemColor(Either item) { + return item.map(Material::getMaterialARGB, + state -> ((BlockStateAccessor) state).gtceu$getDefaultMapColor().col | 0xFF000000); } @Override - public IGuiTexture getItemIcon(String item) { - return ICON_CACHE.computeIfAbsent(item, name -> { - if (name.startsWith("material_")) { - var mat = GTMaterials.get(name.substring(9)); - if (!mat.isNull()) { - var list = new ArrayList(); + public IDrawable getItemIcon(Either item) { + return ICON_CACHE.computeIfAbsent(item, either -> { + List items = either.map(material -> { + List oreItems = ChemicalHelper.getItems(new MaterialEntry(TagPrefix.rawOre, material)); + if (oreItems.isEmpty()) { + oreItems = new ArrayList<>(); for (TagPrefix oreTag : TagPrefix.ORES.keySet()) { - for (var block : ChemicalHelper.getBlocks(new MaterialEntry(oreTag, mat))) { - list.add(new ItemStack(block)); - } + oreItems.addAll(ChemicalHelper.getItems(new MaterialEntry(oreTag, material))); } - return new ItemStackTexture(list.toArray(ItemStack[]::new)).scale(0.8f); } - } - return new ItemStackTexture(new ItemStack(BuiltInRegistries.BLOCK.get(new ResourceLocation(name)))) - .scale(0.8f); + return oreItems; + }, state -> { + MaterialEntry entry = ChemicalHelper.getMaterialEntry(state.getBlock()); + List oreItems = ChemicalHelper.getItems(entry); + if (oreItems.isEmpty()) { + oreItems = List.of(state.getBlock().asItem()); + if (oreItems.get(0).asItem() == Items.AIR) { + oreItems = List.of(Items.BARRIER); + } + } + return oreItems; + }); + ItemDrawable[] drawables = items.stream() + .map(itemLike -> itemLike.asItem().getDefaultInstance()) + .map(ItemDrawable::new) + .toArray(ItemDrawable[]::new); + + return new CycleDrawable(drawables); }); } @Override - public String getDescriptionId(String item) { - if (item.startsWith("material_")) { - var mat = GTMaterials.get(item.substring(9)); - if (!mat.isNull()) { - return mat.getUnlocalizedName(); - } - } - return BuiltInRegistries.BLOCK.get(new ResourceLocation(item)).getDescriptionId(); + public Component getDescription(Either item) { + return item.map(Material::getLocalizedName, state -> state.getBlock().getName()); } @Override - public String getUniqueID(String item) { - return item; + public String getUniqueId(Either item) { + return item.map(material -> MATERIAL_PREFIX + material.getResourceLocation(), + state -> state.getBlockHolder().unwrapKey() + .map(ResourceKey::location) + .map(ResourceLocation::toString) + .orElse("Unknown entry ???")); } @Override - public void serialize(String item, FriendlyByteBuf buf) { - buf.writeUtf(item); + public void serialize(Either item, FriendlyByteBuf buf) { + item.ifLeft(material -> { + buf.writeBoolean(true); + buf.writeResourceLocation(material.getResourceLocation()); + }).ifRight(state -> { + buf.writeBoolean(false); + buf.writeNbt(NbtUtils.writeBlockState(state)); + }); } @Override - public String deserialize(FriendlyByteBuf buf) { - return buf.readUtf(); + public Either deserialize(FriendlyByteBuf buf) { + if (buf.readBoolean()) { + return Either.left(GTRegistries.MATERIALS.get(buf.readResourceLocation())); + } else { + CompoundTag tag = buf.readNbt(); + assert tag != null; + return Either.right(NbtUtils.readBlockState(BuiltInRegistries.BLOCK.asLookup(), tag)); + } } + @SuppressWarnings("unchecked") @Override - public Class getItemClass() { - return String.class; + public Class> getItemClass() { + return (Class>) (Class) Either.class; } @Override - public void appendTooltips(List items, List tooltips, String selected) { - Object2IntOpenHashMap counter = new Object2IntOpenHashMap<>(); - for (var array : items) { - for (String item : array) { - if (ProspectingTexture.SELECTED_ALL.equals(selected) || selected.equals(getUniqueID(item))) { + public void appendTooltips(List[]> items, List tooltips, + String selected) { + Object2IntOpenHashMap> counter = new Object2IntOpenHashMap<>(); + for (Either[] array : items) { + for (Either item : array) { + if (selected == null || selected.equals(this.getUniqueId(item))) { counter.addTo(item, 1); } } } counter.forEach((item, count) -> tooltips - .add(Component.translatable(getDescriptionId(item)).append(" --- " + count))); + .add(Component.empty().append(getDescription(item)).append(" --- %s".formatted(count)))); } }; @@ -169,6 +194,10 @@ public static final class FluidInfo { @Setter private int left; + public FluidStack asStack() { + return new FluidStack(this.fluid, this.yield); + } + public static FluidInfo fromNbt(CompoundTag tag) { Fluid fluid = BuiltInRegistries.FLUID.get(new ResourceLocation(tag.getString("fluid"))); int left = tag.getInt("left"); @@ -211,7 +240,7 @@ public void scan(FluidInfo[][][] storage, LevelChunk chunk) { @Override public int getItemColor(FluidInfo item) { - var fluidStack = new FluidStack(item.fluid, item.yield); + var fluidStack = item.asStack(); if (fluidStack.getFluid() == Fluids.LAVA) { return 0xFFFF7000; } @@ -219,17 +248,17 @@ public int getItemColor(FluidInfo item) { } @Override - public IGuiTexture getItemIcon(FluidInfo item) { - return new ItemStackTexture(item.fluid.getBucket()); + public IDrawable getItemIcon(FluidInfo item) { + return new FluidDrawable(item.asStack()); } @Override - public String getDescriptionId(FluidInfo item) { - return new FluidStack(item.fluid, item.yield).getDisplayName().getString(); + public Component getDescription(FluidInfo item) { + return item.asStack().getDisplayName(); } @Override - public String getUniqueID(FluidInfo item) { + public String getUniqueId(FluidInfo item) { return BuiltInRegistries.FLUID.getKey(item.fluid).toString(); } @@ -255,7 +284,7 @@ public Class getItemClass() { public void appendTooltips(List items, List tooltips, String selected) { for (var array : items) { for (FluidInfo item : array) { - tooltips.add(Component.translatable(getDescriptionId(item)) + tooltips.add(Component.empty().append(getDescription(item)) .append(" --- %s (%s%%)".formatted(item.yield, item.left))); } } @@ -263,31 +292,27 @@ public void appendTooltips(List items, List tooltips, St @Override @OnlyIn(Dist.CLIENT) - public void drawSpecialGrid(GuiGraphics graphics, FluidInfo[] items, int x, int y, int width, int height) { - if (items.length > 0) { - var item = items[0]; - double progress = item.left * 1.0 / Math.max(Math.min(item.left, 100), 1); - float drawnU = (float) ProgressTexture.FillDirection.DOWN_TO_UP.getDrawnU(progress); - float drawnV = (float) ProgressTexture.FillDirection.DOWN_TO_UP.getDrawnV(progress); - float drawnWidth = (float) ProgressTexture.FillDirection.DOWN_TO_UP.getDrawnWidth(progress); - float drawnHeight = (float) ProgressTexture.FillDirection.DOWN_TO_UP.getDrawnHeight(progress); - DrawerHelper.drawFluidForGui(graphics, - FluidHelperImpl.toFluidStack(new FluidStack(item.fluid(), item.left)), 100, - (int) (x + drawnU * width), (int) (y + drawnV * height), ((int) (width * drawnWidth)), - ((int) (height * drawnHeight))); + public void drawSpecialGrid(GuiContext context, FluidInfo[] items, int x, int y, int width, int height) { + if (items.length == 0) { + return; } + FluidInfo item = items[0]; + float filled = item.left / Math.max(Math.min(item.left, 100.0f), 1.0f); + + GuiDraw.drawFluidTexture(context.getGraphics(), item.asStack(), + x * width, y + (1.0f - filled) * height, width, height * filled, + context.getCurrentDrawingZ()); } }; - public record OreInfo(Material material, int weight, int left, int yield) { - - } + public record BedrockOreInfo(Material material, int weight, int left, int yield) {} - public static ProspectorMode BEDROCK_ORE = new ProspectorMode<>("item.prospector.mode.bedrock_ore", + public static ProspectorMode BEDROCK_ORE = new ProspectorMode<>( + "item.prospector.mode.bedrock_ore", 1) { @Override - public void scan(OreInfo[][][] storage, LevelChunk chunk) { + public void scan(BedrockOreInfo[][][] storage, LevelChunk chunk) { if (chunk.getLevel() instanceof ServerLevel serverLevel) { var oreVein = BedrockOreVeinSavedData.getOrCreate(serverLevel).getOreVeinWorldEntry(chunk.getPos().x, chunk.getPos().z); @@ -295,19 +320,19 @@ public void scan(OreInfo[][][] storage, LevelChunk chunk) { var left = 100 * oreVein.getOperationsRemaining() / BedrockOreVeinSavedData.MAXIMUM_VEIN_OPERATIONS; for (var entry : oreVein.getDefinition().materials()) { storage[0][0] = ArrayUtils.add(storage[0][0], - new OreInfo(entry.material(), entry.weight(), left, oreVein.getOreYield())); + new BedrockOreInfo(entry.material(), entry.weight(), left, oreVein.getOreYield())); } } } } @Override - public int getItemColor(OreInfo item) { - return item.material.getMaterialRGB(); + public int getItemColor(BedrockOreInfo item) { + return item.material.getMaterialARGB(); } @Override - public IGuiTexture getItemIcon(OreInfo item) { + public IDrawable getItemIcon(BedrockOreInfo item) { Material material = item.material; ItemStack stack = GTUtil.getFirstNonEmpty( ChemicalHelper.get(TagPrefix.get(ConfigHolder.INSTANCE.machines.bedrockOreDropTagPrefix), material), @@ -315,21 +340,21 @@ public IGuiTexture getItemIcon(OreInfo item) { ChemicalHelper.get(TagPrefix.gem, material), ChemicalHelper.get(TagPrefix.ore, material), ChemicalHelper.get(TagPrefix.dust, material)); - return new ItemStackTexture(stack).scale(0.8f); + return new ItemDrawable(stack); } @Override - public String getDescriptionId(OreInfo item) { - return item.material.getUnlocalizedName(); + public Component getDescription(BedrockOreInfo item) { + return item.material.getLocalizedName(); } @Override - public String getUniqueID(OreInfo item) { + public String getUniqueId(BedrockOreInfo item) { return item.material.getName(); } @Override - public void serialize(OreInfo item, FriendlyByteBuf buf) { + public void serialize(BedrockOreInfo item, FriendlyByteBuf buf) { buf.writeResourceLocation(item.material.getResourceLocation()); buf.writeVarInt(item.weight); buf.writeVarInt(item.left); @@ -337,25 +362,26 @@ public void serialize(OreInfo item, FriendlyByteBuf buf) { } @Override - public OreInfo deserialize(FriendlyByteBuf buf) { + public BedrockOreInfo deserialize(FriendlyByteBuf buf) { ResourceLocation materialId = buf.readResourceLocation(); - return new OreInfo( - GTCEuAPI.materialManager.getRegistry(materialId.getNamespace()).get(materialId.getPath()), + return new BedrockOreInfo( + GTRegistries.MATERIALS.get(materialId), buf.readVarInt(), buf.readVarInt(), buf.readVarInt()); } @Override - public Class getItemClass() { - return OreInfo.class; + public Class getItemClass() { + return BedrockOreInfo.class; } @Override - public void appendTooltips(List items, List tooltips, String selected) { + public void appendTooltips(List items, List tooltips, String selected) { for (var array : items) { - int totalWeight = Arrays.stream(array).mapToInt(OreInfo::weight).sum(); - for (OreInfo item : array) { + int totalWeight = Arrays.stream(array).mapToInt(BedrockOreInfo::weight).sum(); + for (BedrockOreInfo item : array) { float chance = (float) item.weight / totalWeight * 100; - tooltips.add(Component.translatable(getDescriptionId(item)).append(" (") + tooltips.add(Component.empty().append(getDescription(item)) + .append(" (") .append(Component.translatable("gtceu.gui.content.chance_base", FormattingUtil.formatNumber2Places(chance))) .append(") --- %s (%s%%)".formatted(item.yield, item.left))); @@ -376,11 +402,11 @@ public void appendTooltips(List items, List tooltips, Stri public abstract int getItemColor(T item); - public abstract IGuiTexture getItemIcon(T item); + public abstract IDrawable getItemIcon(T item); - public abstract String getDescriptionId(T item); + public abstract Component getDescription(T item); - public abstract String getUniqueID(T item); + public abstract String getUniqueId(T item); public abstract void serialize(T item, FriendlyByteBuf buf); @@ -391,5 +417,5 @@ public void appendTooltips(List items, List tooltips, Stri public abstract void appendTooltips(List items, List tooltips, String selected); @OnlyIn(Dist.CLIENT) - public void drawSpecialGrid(GuiGraphics graphics, T[] items, int x, int y, int width, int height) {} + public void drawSpecialGrid(GuiContext graphics, T[] items, int x, int y, int width, int height) {} } diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTAxeItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTAxeItem.java index a87fc7d8d5d..348027ec7b4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTAxeItem.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTAxeItem.java @@ -109,6 +109,12 @@ public InteractionResultHolder use(Level level, Player player, Intera return definition$use(level, player, usedHand); } + @Override + public InteractionResult interactLivingEntity(ItemStack stack, Player player, LivingEntity interactionTarget, + InteractionHand usedHand) { + return definition$interactLivingEntity(stack, player, interactionTarget, usedHand); + } + @Override public boolean isElectric() { return electricTier > -1; diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTHoeItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTHoeItem.java index efb07e3b815..ffa99acbd8f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTHoeItem.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTHoeItem.java @@ -109,6 +109,12 @@ public InteractionResultHolder use(Level level, Player player, Intera return definition$use(level, player, usedHand); } + @Override + public InteractionResult interactLivingEntity(ItemStack stack, Player player, LivingEntity interactionTarget, + InteractionHand usedHand) { + return definition$interactLivingEntity(stack, player, interactionTarget, usedHand); + } + @Override public boolean isElectric() { return electricTier > -1; diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTShovelItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTShovelItem.java index 9038454d142..dfe9bf84a2d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTShovelItem.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTShovelItem.java @@ -109,6 +109,12 @@ public InteractionResultHolder use(Level level, Player player, Intera return definition$use(level, player, usedHand); } + @Override + public InteractionResult interactLivingEntity(ItemStack stack, Player player, LivingEntity interactionTarget, + InteractionHand usedHand) { + return definition$interactLivingEntity(stack, player, interactionTarget, usedHand); + } + @Override public boolean isElectric() { return electricTier > -1; diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTSwordItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTSwordItem.java index 05b5862bc79..566a38ecaae 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTSwordItem.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTSwordItem.java @@ -109,6 +109,12 @@ public InteractionResultHolder use(Level level, Player player, Intera return definition$use(level, player, usedHand); } + @Override + public InteractionResult interactLivingEntity(ItemStack stack, Player player, LivingEntity interactionTarget, + InteractionHand usedHand) { + return definition$interactLivingEntity(stack, player, interactionTarget, usedHand); + } + @Override public boolean isElectric() { return electricTier > -1; diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolItem.java index 7c852723333..6b7381071f1 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolItem.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolItem.java @@ -116,6 +116,12 @@ public InteractionResultHolder use(Level level, Player player, Intera return definition$use(level, player, usedHand); } + @Override + public InteractionResult interactLivingEntity(ItemStack stack, Player player, LivingEntity interactionTarget, + InteractionHand usedHand) { + return definition$interactLivingEntity(stack, player, interactionTarget, usedHand); + } + @Override public boolean isElectric() { return electricTier > -1; diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolType.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolType.java index 19c2f4361a9..b6c2c8b76fa 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolType.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolType.java @@ -264,8 +264,9 @@ public class GTToolType { public static final GTToolType SHEARS = GTToolType.builder("shears") .toolTag(ToolItemTagType.MATCH, CustomTags.SHEARS) .harvestTag(CustomTags.MINEABLE_WITH_SHEARS) - .toolStats(b -> b) - .defaultActions(ToolActions.DEFAULT_SHEARS_ACTIONS) + .toolStats(b -> b.blockBreaking().attackDamage(1.0F).attackSpeed(-2.8F) + .behaviors(ShearBehavior.INSTANCE)) + .defaultActions(ToolActions.SHEARS_DIG) .build(); public static final GTToolType DRILL_LV = GTToolType.builder("lv_drill") .idFormat("lv_%s_drill") diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/IToolGridHighlight.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/IToolGridHighlight.java index 9621d355051..9066f456808 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/IToolGridHighlight.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/IToolGridHighlight.java @@ -1,13 +1,12 @@ package com.gregtechceu.gtceu.api.item.tool; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; +import brachy.modularui.drawable.UITexture; import org.jetbrains.annotations.Nullable; import java.util.Set; @@ -16,7 +15,7 @@ public interface IToolGridHighlight { /** * Called to determine if the grid overlay should be rendered on this machine. - * + * * @param player Player looking at this machine * @param pos Block pos * @param state Block state @@ -32,16 +31,17 @@ default boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, /** * Called when the machine grid overlay is being rendered to determine the icon to be rendered within the grid * segment on a specifc side. - * + * * @param player Player looking at this machine * @param pos Block pos * @param state Block state * @param toolTypes The GT tool types of the held item, if any + * @param held * @param side The machine side which this grid segment correspond to * @return The icon to be rendered, or null */ - default @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { + default @Nullable UITexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, + ItemStack held, Direction side) { return null; } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java index ab2cdcdcbc9..a6093fe5aa1 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java @@ -12,7 +12,7 @@ import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.item.IGTTool; import com.gregtechceu.gtceu.api.item.tool.aoe.AoESymmetrical; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.api.recipe.content.Content; @@ -304,6 +304,13 @@ public static boolean areaOfEffectBlockBreakRoutine(ItemStack stack, ServerPlaye var harvestableBlocks = getHarvestableBlocks(stack, player); if (!harvestableBlocks.isEmpty()) { for (BlockPos pos : harvestableBlocks) { + // Skip targeted block as already handled by the tool (fix AOE items using n+1 durability) + if (pos.equals(targeted)) { + Level world = player.level(); + BlockState state = world.getBlockState(pos); + world.levelEvent(LevelEvent.PARTICLES_DESTROY_BLOCK, pos, Block.getId(state)); + continue; + } if (!breakBlockRoutine(player, stack, pos, pos.equals(targeted))) { return true; } @@ -436,14 +443,14 @@ public static void applyHammerDropConversion(ServerLevel world, BlockPos pos, It if (prefix.isEmpty()) { for (Content output : hammerRecipe.getOutputContents(ItemRecipeCapability.CAP)) { if (dropChance >= 1.0F || random.nextFloat() <= dropChance) { - drops.add(SizedIngredient.copy(ItemRecipeCapability.CAP.of(output.content)) + drops.add(SizedIngredient.copy(ItemRecipeCapability.CAP.of(output.content())) .getItems()[0]); } } } else if (TagPrefix.ORES.containsKey(prefix)) { for (Content content : hammerRecipe.getOutputContents(ItemRecipeCapability.CAP)) { if (dropChance >= 1.0F || random.nextFloat() <= dropChance) { - ItemStack output = ItemRecipeCapability.CAP.of(content.content).getItems()[0]; + ItemStack output = ItemRecipeCapability.CAP.of(content.content()).getItems()[0]; // Only apply fortune on ore -> crushed forge hammer recipes if (ChemicalHelper.getPrefix(output.getItem()) == TagPrefix.crushed) { output = output.copy(); @@ -459,10 +466,6 @@ public static void applyHammerDropConversion(ServerLevel world, BlockPos pos, It } public static boolean breakBlockRoutine(ServerPlayer player, ItemStack tool, BlockPos pos, boolean playSound) { - // This is *not* a vanilla/forge convention, Forge never added "shears" to ItemShear's tool classes. - if (isTool(tool, GTToolType.SHEARS) && shearBlockRoutine(player, tool, pos) == 0) { - return false; - } Level world = player.level(); boolean canBreak = onBlockBreakEvent(world, player.gameMode.getGameModeForPlayer(), player, pos); @@ -705,9 +708,9 @@ public static float getDestroySpeed(BlockState state, Set toolClasse /** * Shearing a Block. * - * @return -1 if not shearable, otherwise return 0 or 1, 0 if tool is now broken. + * @return -1 if not shearable or if shearing gave nothing, otherwise return 0 or 1, 0 if tool is now broken. */ - public static int shearBlockRoutine(ServerPlayer player, ItemStack tool, BlockPos pos) { + public static int shearBlock(ServerPlayer player, ItemStack tool, BlockPos pos) { if (!player.isCreative()) { Level world = player.serverLevel(); BlockState state = world.getBlockState(pos); @@ -715,6 +718,9 @@ public static int shearBlockRoutine(ServerPlayer player, ItemStack tool, BlockPo if (shearable.isShearable(tool, world, pos)) { List shearedDrops = shearable.onSheared(player, tool, world, pos, tool.getEnchantmentLevel(Enchantments.BLOCK_FORTUNE)); + if (shearedDrops.isEmpty()) { + return -1; + } boolean relocateMinedBlocks = hasBehaviorsTag(tool) && getBehaviorsTag(tool).getBoolean(RELOCATE_MINED_BLOCKS_KEY); Iterator iter = shearedDrops.iterator(); @@ -734,8 +740,6 @@ public static int shearBlockRoutine(ServerPlayer player, ItemStack tool, BlockPo } } ToolHelper.damageItem(tool, player, 1); - player.awardStat(Stats.BLOCK_MINED.get((Block) shearable)); - world.setBlock(pos, Blocks.AIR.defaultBlockState(), 11); return tool.isEmpty() ? 0 : 1; } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/behavior/IToolBehavior.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/behavior/IToolBehavior.java index 1c8a6e83b72..4689205dc7b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/behavior/IToolBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/behavior/IToolBehavior.java @@ -128,6 +128,19 @@ default InteractionResultHolder onItemRightClick(@NotNull Level world return InteractionResultHolder.pass(player.getItemInHand(hand)); } + /** + * Called when the equipped item is right-clicked. + * + * @param stack the stack being used + * @param player the player clicking the entity + * @param interactionTarget the entity clicked + * @param hand the hand holding the item + */ + default InteractionResult onInteractLivingEntity(ItemStack stack, Player player, LivingEntity interactionTarget, + InteractionHand hand) { + return InteractionResult.PASS; + } + /** * Called when a block is right-clicked with this Item * diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/behavior/IToolUIBehavior.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/behavior/IToolUIBehavior.java index e00fd5f658e..c2df3dd28f7 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/behavior/IToolUIBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/behavior/IToolUIBehavior.java @@ -1,31 +1,39 @@ package com.gregtechceu.gtceu.api.item.tool.behavior; -import com.lowdragmc.lowdraglib.gui.factory.HeldItemUIFactory; -import com.lowdragmc.lowdraglib.gui.modular.ModularUI; +import com.gregtechceu.gtceu.api.mui.GTGuiScreen; -import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import brachy.modularui.api.IUIHolder; +import brachy.modularui.factory.PlayerInventoryGuiData; +import brachy.modularui.factory.PlayerInventoryUIFactory; +import brachy.modularui.screen.ModularPanel; +import brachy.modularui.screen.ModularScreen; import org.jetbrains.annotations.NotNull; -public interface IToolUIBehavior extends IToolBehavior { +public interface IToolUIBehavior extends IToolBehavior, IUIHolder> { @Override default @NotNull InteractionResultHolder onItemRightClick(@NotNull Level level, @NotNull Player player, @NotNull InteractionHand hand) { - var heldItem = player.getItemInHand(hand); - if (player instanceof ServerPlayer serverPlayer && openUI(serverPlayer, hand)) { - HeldItemUIFactory.INSTANCE.openUI(serverPlayer, hand); - return InteractionResultHolder.success(heldItem); + ItemStack heldItem = player.getItemInHand(hand); + if (level.isClientSide && shouldOpenUI(player, hand)) { + PlayerInventoryUIFactory.INSTANCE.openFromHandClient(hand); } return InteractionResultHolder.pass(heldItem); } - boolean openUI(@NotNull Player player, @NotNull InteractionHand hand); + @Override + @OnlyIn(Dist.CLIENT) + default ModularScreen createScreen(PlayerInventoryGuiData data, ModularPanel mainPanel) { + return new GTGuiScreen(mainPanel); + } - ModularUI createUI(Player player, HeldItemUIFactory.HeldItemHolder holder); + boolean shouldOpenUI(@NotNull Player player, @NotNull InteractionHand hand); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java index 270aad6f1fb..ba66115ecce 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java @@ -9,16 +9,14 @@ import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.api.machine.trait.feature.IFrontFacingTrait; import com.gregtechceu.gtceu.api.machine.trait.feature.IRenderingTrait; -import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.managed.ISyncManaged; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.utils.GTUtil; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.player.Player; @@ -28,6 +26,7 @@ import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.items.IItemHandlerModifiable; +import brachy.modularui.drawable.UITexture; import lombok.Getter; import org.jetbrains.annotations.Nullable; @@ -54,7 +53,7 @@ public MachineCoverContainer(MetaMachine machine) { } @Override - public MachineTraitType getTraitType() { + public MachineTraitType getTraitType() { return TYPE; } @@ -90,11 +89,11 @@ public boolean shouldRenderGridOverlay(Player player, BlockPos pos, BlockState s } @Override - public @Nullable ResourceTexture getGridOverlayIcon(Player player, BlockPos pos, BlockState state, - Set toolTypes, Direction side) { + public @Nullable UITexture getGridOverlayIcon(Player player, BlockPos pos, BlockState state, + Set toolTypes, ItemStack held, Direction side) { var cover = getCoverAtSide(side); if (cover != null) { - return cover.sideTips(player, pos, state, toolTypes, side); + return cover.sideTips(player, pos, state, toolTypes, held, side); } return null; } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineDefinition.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineDefinition.java index 01b6204239c..1bc4e3cea70 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineDefinition.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineDefinition.java @@ -3,15 +3,14 @@ import com.gregtechceu.gtceu.api.block.MetaMachineBlock; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; import com.gregtechceu.gtceu.api.data.RotationState; -import com.gregtechceu.gtceu.api.gui.editor.EditableMachineUI; import com.gregtechceu.gtceu.api.item.MetaMachineItem; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; +import com.gregtechceu.gtceu.api.mui.factory.PanelFactory; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; - -import com.lowdragmc.lowdraglib.utils.ShapeUtils; +import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.core.Direction; import net.minecraft.core.IdMapper; @@ -26,13 +25,13 @@ import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; +import brachy.modularui.theme.ThemeAPI; import it.unimi.dsi.fastutil.objects.Reference2IntMap; import it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.EnumMap; @@ -61,10 +60,10 @@ public class MachineDefinition implements Supplier { private Supplier> blockEntityTypeSupplier; @Getter @Setter - private @NotNull GTRecipeType @NotNull [] recipeTypes; + private GTRecipeType[] recipeTypes; @Getter @Setter - private int tier; + private int tier = -1; @Getter @Setter private int defaultPaintingColor; @@ -74,19 +73,15 @@ public class MachineDefinition implements Supplier { @Getter @Setter private boolean alwaysTryModifyRecipe; - @NotNull @Getter @Setter - private BiPredicate beforeWorking = (machine, recipe) -> true; - @NotNull + private BiPredicate beforeWorking = (machine, recipe) -> true; @Getter @Setter private Predicate onWorking = (machine) -> true; - @NotNull @Getter @Setter private Consumer onWaiting = (machine) -> {}; - @NotNull @Getter @Setter private Consumer afterWorking = (machine) -> {}; @@ -119,10 +114,13 @@ public class MachineDefinition implements Supplier { @Getter @Setter private boolean allowCoverOnFront; + @Getter + @Setter @Nullable + private PanelFactory UI; @Getter @Setter - private EditableMachineUI editableUI; + private String themeId = ThemeAPI.DEFAULT_ID; @Getter @Setter private Reference2IntMap> recipeOutputLimits = new Reference2IntOpenHashMap<>(); @@ -138,6 +136,10 @@ public MachineDefinition(ResourceLocation id) { this.id = id; } + public boolean isTiered() { + return tier != -1; + } + public final void registerDefaultState(MachineRenderState state) { this.defaultRenderState = state; } @@ -164,7 +166,7 @@ public ItemStack asStack(int count) { public VoxelShape getShape(Direction direction) { if (shape.isEmpty() || shape == Shapes.block() || direction == Direction.NORTH) return shape; - return this.cache.computeIfAbsent(direction, dir -> ShapeUtils.rotate(shape, dir)); + return this.cache.computeIfAbsent(direction, dir -> GTUtil.rotateVoxelShape(shape, dir)); } @Override @@ -217,4 +219,27 @@ public static void setBuilt(MachineDefinition state) { public static void clearBuilt() { STATE.remove(); } + + /** + * Gets the input size for a machine for the capability with the machine having the specified recipe types + */ + public int getInputSize(RecipeCapability cap, GTRecipeType... recipeTypes) { + int recipeTypeInputSize = 0; + for (var recipeType : recipeTypes) { + recipeTypeInputSize = Math.max(recipeType.getMaxInputs(cap), recipeTypeInputSize); + } + return recipeTypeInputSize; + } + + /** + * Gets the output size for a machine for the capability with the machine having the specified recipe types + */ + public int getOutputSize(RecipeCapability cap, GTRecipeType... recipeTypes) { + int recipeTypeOutputSize = 0; + for (var recipeType : recipeTypes) { + recipeTypeOutputSize = Math.max(recipeType.getMaxOutputs(cap), recipeTypeOutputSize); + } + int machineTypeOutputLimit = this.getRecipeOutputLimits().getOrDefault(cap, recipeTypeOutputSize); + return Math.min(recipeTypeOutputSize, machineTypeOutputLimit); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineInstanceFactory.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineInstanceFactory.java new file mode 100644 index 00000000000..7adb795bd99 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineInstanceFactory.java @@ -0,0 +1,39 @@ +package com.gregtechceu.gtceu.api.machine; + +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; + +import java.util.function.Consumer; + +@FunctionalInterface +public interface MachineInstanceFactory { + + T buildMachine(BlockEntityCreationInfo info); + + default MachineInstanceFactory andThen(Consumer modifier) { + return (info) -> { + T machine = this.buildMachine(info); + modifier.accept(machine); + return machine; + }; + } + + @FunctionalInterface + interface Tiered { + + T buildMachine(BlockEntityCreationInfo info, int tier); + + default Tiered andThen(Consumer modifier) { + return (info, tier) -> { + T machine = buildMachine(info, tier); + modifier.accept(machine); + return machine; + }; + } + } + + @FunctionalInterface + interface Steam { + + T buildMachine(BlockEntityCreationInfo info, boolean isHighPressure); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java index db53314c866..6c24a542b88 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -13,13 +13,10 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.data.RotationState; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.fancy.IFancyTooltip; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.item.tool.IToolGridHighlight; import com.gregtechceu.gtceu.api.item.tool.ToolHelper; import com.gregtechceu.gtceu.api.machine.feature.*; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitHolder; @@ -29,36 +26,34 @@ import com.gregtechceu.gtceu.api.machine.trait.feature.IRedstoneSignalTrait; import com.gregtechceu.gtceu.api.machine.trait.feature.IRenderingTrait; import com.gregtechceu.gtceu.api.misc.*; -import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; -import com.gregtechceu.gtceu.api.sync_system.ManagedSyncBlockEntity; +import com.gregtechceu.gtceu.api.multiblock.util.RelativeDirection; import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.managed.ManagedSyncBlockEntity; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.client.model.IBlockEntityRendererBakedModel; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; -import com.gregtechceu.gtceu.client.util.ModelUtils; +import com.gregtechceu.gtceu.client.util.RenderUtil; import com.gregtechceu.gtceu.common.cover.FluidFilterCover; import com.gregtechceu.gtceu.common.cover.ItemFilterCover; import com.gregtechceu.gtceu.common.cover.data.ManualIOMode; +import com.gregtechceu.gtceu.common.item.behavior.MachineConfigCopyBehaviour; import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; import com.gregtechceu.gtceu.common.machine.owner.PlayerOwner; import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait; +import com.gregtechceu.gtceu.common.machine.trait.ProgrammableCircuitSlotTrait; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; +import com.gregtechceu.gtceu.utils.GTStringUtils; +import com.gregtechceu.gtceu.utils.GTUtil; import com.gregtechceu.gtceu.utils.data.TagCompatibilityFixer; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; -import com.lowdragmc.lowdraglib.utils.DummyWorld; - import net.minecraft.ChatFormatting; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.block.BlockRenderDispatcher; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.locale.Language; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.server.TickTask; @@ -91,9 +86,11 @@ import appeng.api.networking.IInWorldGridNodeHost; import appeng.capabilities.Capabilities; +import brachy.modularui.drawable.UITexture; import com.mojang.datafixers.util.Pair; import lombok.AccessLevel; import lombok.Getter; +import lombok.Setter; import org.jetbrains.annotations.*; import java.util.*; @@ -104,7 +101,9 @@ * The base BlockEntity for all GT machines. */ public class MetaMachine extends ManagedSyncBlockEntity implements IGregtechBlockEntity, IToolGridHighlight, - IFancyTooltip, IPaintable, IMachineFeature, ICopyable { + IPaintable, IMachineFeature, ICopyable { + + private static final int MIN_OFFSET_BOUND = 20; @Getter protected final SyncDataHolder syncDataHolder = new SyncDataHolder(this); @@ -131,15 +130,22 @@ public class MetaMachine extends ManagedSyncBlockEntity implements IGregtechBloc @SyncToClient @RerenderOnChanged private MachineRenderState renderState; + @Getter(value = AccessLevel.PROTECTED) - private final long offset = GTValues.RNG.nextInt(20); + @Setter(value = AccessLevel.PROTECTED) + private long offset = GTValues.RNG.nextInt(MIN_OFFSET_BOUND); @Getter + @SaveField + @SyncToClient protected final MachineTraitHolder traitHolder; private final List serverTicks; private final List waitingToAdd; + // If this machine data needs to be migrated from 7.x to 8.x + private boolean isOldMachineData = false; + public MetaMachine(BlockEntityCreationInfo info) { super(info); this.renderState = getDefinition().defaultRenderState(); @@ -155,7 +161,9 @@ public MetaMachine(BlockEntityCreationInfo info) { @Override public void load(CompoundTag tag) { - TagCompatibilityFixer.fixMachineAutoOutputTag(tag); + isOldMachineData = !tag.contains("traitHolder"); + if (isOldMachineData) TagCompatibilityFixer.fixTraitTags(this, tag); + super.load(tag); } @@ -167,8 +175,24 @@ public void load(CompoundTag tag) { */ @MustBeInvokedByOverriders public void onLoad() { + getTraitHolder().machineLoaded(); getAllTraits().forEach(MachineTrait::onMachineLoad); + if (isOldMachineData) { + Direction upwardsGlobal = TagCompatibilityFixer.fixUpwardsFacing(this.getFrontFacing(), + this.getUpwardsFacing()); + if (upwardsGlobal != null && getBlockState().hasProperty(GTBlockStateProperties.UPWARDS_FACING)) { + // force the global upwards direction + var blockState = getBlockState(); + boolean changeGlobal = blockState.getValue(GTBlockStateProperties.UPWARDS_FACING) != upwardsGlobal; + if (blockState.getBlock() instanceof MetaMachineBlock && changeGlobal) { + getLevel().setBlock(getBlockPos(), + blockState.setValue(GTBlockStateProperties.UPWARDS_FACING, upwardsGlobal), + Block.UPDATE_IMMEDIATE); + } + } + } + // update the painted model property if the machine is painted MachineRenderState renderState = getRenderState(); if (renderState.hasProperty(GTMachineModelProperties.IS_PAINTED) && @@ -217,11 +241,24 @@ public void onMachineDestroyed() { /** * Called to modify the drops returned when this block is destroyed - * + * * @param drops A modifiable list of drops. */ public void modifyDrops(List drops) {} + /** + * Saves machine data to an item stack tag. + * + * @param tag The tag to save to. + * @param clone If this data is being save to an item stack created by cloning the block (pick block) + */ + public void saveToItem(CompoundTag tag, boolean clone) {} + + /** + * Loads machine data from an item stack tag. + */ + public void loadFromItem(CompoundTag tag) {} + ////////////////////////////////////// // ***** Tickable Manager ****// ////////////////////////////////////// @@ -236,10 +273,6 @@ public TickableSubscription subscribeServerTick(Runnable runnable) { var subscription = new TickableSubscription(runnable); waitingToAdd.add(subscription); return subscription; - } else if (getLevel() instanceof DummyWorld) { - var subscription = new TickableSubscription(runnable); - waitingToAdd.add(subscription); - return subscription; } return null; } @@ -256,21 +289,11 @@ public final void serverTick() { executeTick(); } - public boolean isFirstDummyWorldTick = true; - /** * Called every tick on the client side. */ @OnlyIn(Dist.CLIENT) - public void clientTick() { - if (getLevel() instanceof DummyWorld) { - if (isFirstDummyWorldTick) { - isFirstDummyWorldTick = false; - onLoad(); - } - executeTick(); - } - } + public void clientTick() {} private void executeTick() { if (!waitingToAdd.isEmpty()) { @@ -303,7 +326,7 @@ private void executeTick() { /** * Attaches a trait to this machine, with the default trait callback priority of 1. - * + * * @param trait The trait to attach * @return The attached trait */ @@ -313,7 +336,7 @@ public T attachTrait(T trait) { /** * Attaches a trait to this machine. - * + * * @param trait The trait to attach * @param callbackPriority The trait's callback priority. Traits with a higher priority will have their events fired * first, which may prevent traits with a lower priority from handling some events. @@ -326,47 +349,47 @@ public T attachTrait(T trait, int callbackPriority) { /** * Registers a trait with data to be saved or synced to the client. * Do not register a persistent trait and also store that trait as a syncable machine field, otherwise the trait - * data will be duplicated. Use only one sync method. + * data will be duplicated. Use only one sync method.
+ * Note: Persistent traits must be attached before data load, or they will not be loaded correctly. * * @param traitName Unique identifier for this trait. * @param trait The trait to register */ - public T attachPersistentTrait(String traitName, T trait) { - traitHolder.attachTrait(trait); - traitHolder.registerPersistentTrait(traitName, trait); - return trait; + public MetaMachine attachPersistentTrait(String traitName, MachineTrait trait) { + traitHolder.attachPersistentTrait(traitName, trait); + return this; } /** * Registers a trait with data to be saved or synced to the client. * Do not register a persistent trait and also store that trait as a syncable machine field, otherwise the trait - * data will be duplicated. Use only one sync method. + * data will be duplicated. Use only one sync method.
+ * Note: Persistent traits must be attached before data load, or they will not be loaded correctly. * * @param traitName Unique identifier for this trait. * @param callbackPriority The trait's callback priority. Traits with a higher priority will have their events fired * first, which may prevent traits with a lower priority from handling some events. * @param trait The trait to register */ - public T attachPersistentTrait(String traitName, T trait, int callbackPriority) { - traitHolder.attachTrait(trait, callbackPriority); - traitHolder.registerPersistentTrait(traitName, trait); - return trait; + public MetaMachine attachPersistentTrait(String traitName, MachineTrait trait, int callbackPriority) { + traitHolder.attachPersistentTrait(traitName, trait, callbackPriority); + return this; } /** - * Gets a trait registered by {@code registerPersistentTrait} - * - * @param traitName the unique identifier for the trait - * @return the trait, or null if not present + * Gets a trait registered by {@code registerPersistentTrait}. + * + * @param traitName The unique identifier for the trait. + * @return The trait, or null if not present. */ public @Nullable T getPersistentTrait(String traitName) { return traitHolder.getPersistentTrait(traitName); } /** - * Gets the first trait (trait with highest priority) of a specified type - * - * @param type The trait type to get + * Gets the first trait (trait with highest priority) of a specified type. + * + * @param type The trait type to get. * @return The trait, or null if no traits of the given type are present. */ public @Nullable T getTrait(MachineTraitType type) { @@ -375,7 +398,7 @@ public T attachPersistentTrait(String traitName, T trai /** * Gets the first trait (trait with highest priority) of a specified type - * + * * @param type The trait type to get * @return An optional result containing the trait if present. */ @@ -383,9 +406,23 @@ public Optional getTraitOptional(MachineTraitType return Optional.ofNullable(getTrait(type)); } + /** + * Gets the first trait (trait with the highest priority) of a specified type.
+ * Throws if no trait is present. + * + * @param type The trait type to get + * @return The trait + */ + public T getTraitOrThrow(MachineTraitType type) { + T trait = getTrait(type); + if (trait == null) throw new NoSuchElementException("No trait present"); + return trait; + } + /** * Get all traits with the specified type. - * + * + * @param type The trait type to get * @return An unmodifiable list containing all traits of the specified type. */ public @Unmodifiable List getTraits(MachineTraitType type) { @@ -398,7 +435,7 @@ public Optional getTraitOptional(MachineTraitType /** * Called when a player clicks this machine with a GT tool - * + * * @param context The context of this interaction. * @return A pair containing the type of the tool (if the interaction was successful), and the result of the * interaction. @@ -441,11 +478,9 @@ public Optional getTraitOptional(MachineTraitType if (result != null && result.getSecond() != InteractionResult.PASS) return result; - for (var trait : getAllTraits()) { - if (trait instanceof IInteractionTrait interactionTrait) { - var r = interactionTrait.onToolClick(context); - if (r.getSecond() != InteractionResult.PASS) return r; - } + for (var trait : getTraitHolder().getTraitsByInterface(IInteractionTrait.class)) { + var r = trait.onToolClick(context); + if (r.getSecond() != InteractionResult.PASS) return r; } return result != null ? result : Pair.of(null, InteractionResult.PASS); @@ -463,6 +498,7 @@ protected InteractionResult onHardHammerClick(ExtendedUseOnContext context) { return InteractionResult.PASS; } + @SuppressWarnings("unused") protected InteractionResult onCrowbarClick(ExtendedUseOnContext context) { return InteractionResult.PASS; } @@ -471,8 +507,8 @@ protected InteractionResult onWrenchClick(ExtendedUseOnContext context) { var player = context.getPlayer(); var gridSide = context.getGridSide(); if (gridSide == getFrontFacing() && allowExtendedFacing()) { - setUpwardsFacing(player.isShiftKeyDown() ? getUpwardsFacing().getCounterClockWise() : - getUpwardsFacing().getClockWise()); + Direction newUpwards = GTUtil.cross(getFrontFacing(), getUpwardsFacing()); + setUpwardsFacing(player.isShiftKeyDown() ? newUpwards : newUpwards.getOpposite()); return InteractionResult.sidedSuccess(isRemote()); } if (player.isShiftKeyDown()) { @@ -503,7 +539,7 @@ protected InteractionResult onScrewdriverClick(ExtendedUseOnContext context) { /** * Called when a machine is right clicked with an item. - * + * * @param context The context which this interaction is being performed from. * @return The result of this interaction callback. */ @@ -528,23 +564,24 @@ public InteractionResult onUseWithItem(ExtendedUseOnContext context) { /** * Called when a machine is right clicked without an item, or if this machine was clicked with an item but no * item-specific interaction was performed. - * + * * @param context The context which this interaction is being performed from. * @return The result of this interaction callback. */ public InteractionResult onUse(ExtendedUseOnContext context) { if (context.getPlayer().isShiftKeyDown()) { - var cover = coverContainer.getCoverAtSide(context.getClickedFace()); - if (cover != null) cover.onScrewdriverClick(context); - } - - for (var trait : getAllTraits()) { - if (trait instanceof IInteractionTrait interactionTrait) { - InteractionResult result = interactionTrait.onUse(context); + var cover = coverContainer.getCoverAtSide(context.getGridSide()); + if (cover != null) { + var result = cover.onScrewdriverClick(context); if (result != InteractionResult.PASS) return result; } } + for (var trait : getTraitHolder().getTraitsByInterface(IInteractionTrait.class)) { + InteractionResult result = trait.onUse(context); + if (result != InteractionResult.PASS) return result; + } + return InteractionResult.PASS; } @@ -557,10 +594,8 @@ public InteractionResult onUse(ExtendedUseOnContext context) { * @return true to cancel the click event, false to continue processing */ public boolean onLeftClick(Player player, InteractionHand hand, @Nullable Direction face) { - for (var trait : getAllTraits()) { - if (trait instanceof IInteractionTrait interactionTrait) { - if (interactionTrait.onLeftClick(player, hand, face)) return true; - } + for (var trait : getTraitHolder().getTraitsByInterface(IInteractionTrait.class)) { + if (trait.onLeftClick(player, hand, face)) return true; } return false; } @@ -621,45 +656,46 @@ public void setPaintingColor(int color) { public void onPaintingColorChanged(int color) {} + public void setOffsetBound(int offsetBound) { + var bound = Math.max(offsetBound, MIN_OFFSET_BOUND); + offset = GTValues.RNG.nextInt(bound); + } + @Override public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, ItemStack held, Set toolTypes) { if (toolTypes.contains(GTToolType.WRENCH)) return true; - for (var trait : getAllTraits()) { - if (trait instanceof IRenderingTrait renderingTrait) { - var result = renderingTrait.shouldRenderGridOverlay(player, pos, state, held, toolTypes); - if (result) return true; - } + for (var trait : getTraitHolder().getTraitsByInterface(IRenderingTrait.class)) { + var result = trait.shouldRenderGridOverlay(player, pos, state, held, toolTypes); + if (result) return true; } return false; } @Override - public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { + public @Nullable UITexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, + ItemStack held, Direction side) { if (toolTypes.contains(GTToolType.WRENCH)) { if (player.isShiftKeyDown()) { if (isFacingValid(side) || (allowExtendedFacing() && hasFrontFacing() && side == getFrontFacing())) { - return GuiTextures.TOOL_FRONT_FACING_ROTATION; + return GTGuiTextures.TOOL_FRONT_FACING_ROTATION; } } } else if (toolTypes.contains(GTToolType.SOFT_MALLET)) { if (this instanceof IControllable controllable) { - return controllable.isWorkingEnabled() ? GuiTextures.TOOL_START : GuiTextures.TOOL_PAUSE; + return controllable.isWorkingEnabled() ? GTGuiTextures.TOOL_START : GTGuiTextures.TOOL_PAUSE; } } else if (toolTypes.contains(GTToolType.HARD_HAMMER)) { if (this instanceof IMufflableMachine mufflableMachine) { - return mufflableMachine.isMuffled() ? GuiTextures.TOOL_SOUND : GuiTextures.TOOL_MUTE; + return mufflableMachine.isMuffled() ? GTGuiTextures.TOOL_SOUND : GTGuiTextures.TOOL_MUTE; } } - for (var trait : getAllTraits()) { - if (trait instanceof IRenderingTrait renderingTrait) { - var result = renderingTrait.getGridOverlayIcon(player, pos, state, toolTypes, side); - if (result != null) return result; - } + for (var trait : getTraitHolder().getTraitsByInterface(IRenderingTrait.class)) { + var result = trait.getGridOverlayIcon(player, pos, state, toolTypes, held, side); + if (result != null) return result; } return null; @@ -667,7 +703,7 @@ public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, I /** * Adds extra information to the F3 debug overlay when looking at this machine. - * + * * @param lines A string consumer which lines are added to. */ public void addDebugOverlayText(Consumer lines) { @@ -677,13 +713,13 @@ public void addDebugOverlayText(Consumer lines) { // add render state info MachineRenderState renderState = this.getRenderState(); for (var property : renderState.getValues().entrySet()) { - lines.accept(ModelUtils.getPropertyValueString(property)); + lines.accept(GTStringUtils.getPropertyValueString(property)); } } /** * The {@link MachineDefinition} of this machine. - * + * * @return The {@link MachineDefinition} */ public MachineDefinition getDefinition() { @@ -705,7 +741,7 @@ public void addCollisionBoundingBox(List collisionList) { /** * Gets the direction which this machine is facing. - * + * * @return The direction the machine is facing, or north if this machine does not have a front face. */ public Direction getFrontFacing() { @@ -715,7 +751,7 @@ public Direction getFrontFacing() { /** * Returns whether this machine has a front face. - * + * * @return If this machine has a front face. */ public final boolean hasFrontFacing() { @@ -724,17 +760,15 @@ public final boolean hasFrontFacing() { /** * Returns whether this machine can be rotated to face a specific direction - * + * * @param facing The direction to test * @return If it is possible to rotate this machine to face the given direction. */ public boolean isFacingValid(Direction facing) { if (hasFrontFacing() && facing == getFrontFacing()) return false; - for (var trait : getAllTraits()) { - if (trait instanceof IFrontFacingTrait modifyFacingTrait) { - if (!modifyFacingTrait.isValidFrontFace(facing)) return false; - } + for (var trait : getTraitHolder().getTraitsByInterface(IFrontFacingTrait.class)) { + if (!trait.isValidFrontFace(facing)) return false; } return getRotationState().test(facing); @@ -742,7 +776,7 @@ public boolean isFacingValid(Direction facing) { /** * Returns the {@link RotationState} properties which this machine type supports. - * + * * @return The {@link RotationState} */ public RotationState getRotationState() { @@ -751,14 +785,14 @@ public RotationState getRotationState() { /** * Rotates this machine to face a specific direction, if that direction is a valid facing direction. - * + * * @param facing The new facing direction. */ public void setFrontFacing(Direction facing) { var oldFacing = getFrontFacing(); if (oldFacing == facing) return; - if (allowExtendedFacing()) { + if (getUpwardsFacing().getAxis() == facing.getAxis()) { var newUpwardsFacing = RelativeDirection.simulateAxisRotation(facing, oldFacing, getUpwardsFacing()); setUpwardsFacing(newUpwardsFacing); } @@ -775,27 +809,24 @@ public void setFrontFacing(Direction facing) { /** * Gets the direction which is this machine's upwards face. - * + * * @return The upwards facing direction, or north if this machine does not allow extended facing. */ public Direction getUpwardsFacing() { return this.allowExtendedFacing() ? this.getBlockState().getValue(GTBlockStateProperties.UPWARDS_FACING) : - Direction.NORTH; + Direction.UP; } /** * Changes this machine's upwards facing direction, if this machine supports extended facing directions. - * + * * @param upwardsFacing The new upwards facing direction. */ public void setUpwardsFacing(Direction upwardsFacing) { if (!getDefinition().isAllowExtendedFacing()) { return; } - if (upwardsFacing.getAxis() == Direction.Axis.Y) { - GTCEu.LOGGER.error("Tried to set upwards facing to invalid facing {}! Skipping", upwardsFacing); - return; - } + var blockState = getBlockState(); if (blockState.getBlock() instanceof MetaMachineBlock && blockState.getValue(GTBlockStateProperties.UPWARDS_FACING) != upwardsFacing) { @@ -809,7 +840,7 @@ public void setUpwardsFacing(Direction upwardsFacing) { /** * Returns whether this machine supports extended facing directions. - * + * * @return If extended facing directions are supported. */ public boolean allowExtendedFacing() { @@ -818,7 +849,7 @@ public boolean allowExtendedFacing() { /** * Called when this machine is rotated - * + * * @param oldFacing The previous facing direction * @param newFacing The new facing direction */ @@ -826,7 +857,7 @@ public void onRotated(Direction oldFacing, Direction newFacing) {} /** * Called by the block colour handler to get tint colour for a specific layer index - * + * * @param index colour layer index * @return Integer colour, or -1 to not apply a colour tint. */ @@ -849,7 +880,7 @@ public ModelData getModelData() { /** * Called when a neighboring block is updated. - * + * * @param neighborBlock The neighbor block type. * @param neighborPos The neighbor position. * @param isMoving If the neighbor block is moving (e.g. moved by a piston) @@ -881,7 +912,7 @@ public BlockState getBlockAppearance(BlockState state, BlockAndTintGetter level, /** * Gets the current tick offset, which can be used to run code after a certain number of ticks. * For example, {@code getOffsetTimer() % 20 == 0} will be true every 20 ticks (1 second) - * + * * @return The current tick offset. */ public final long getOffsetTimer() { @@ -893,11 +924,6 @@ public final long getOffsetTimer() { return server.getTickCount() + getOffset(); } - @Override - public boolean isRemote() { - return IGregtechBlockEntity.super.isRemote(); - } - //////////////////////////////// // ***** Redstone Signals ****// //////////////////////////////// @@ -917,10 +943,9 @@ public int getOutputSignal(@Nullable Direction side) { if (cover != null) return cover.getRedstoneSignalOutput(); var signal = 0; - for (var trait : getAllTraits()) { - if (trait instanceof IRedstoneSignalTrait redstoneSignalTrait) { - signal = Math.max(signal, redstoneSignalTrait.getOutputSignal(side)); - } + + for (var trait : getTraitHolder().getTraitsByInterface(IRedstoneSignalTrait.class)) { + signal = Math.max(signal, trait.getOutputSignal(side)); } return signal; @@ -934,10 +959,8 @@ public int getOutputSignal(@Nullable Direction side) { */ public int getOutputDirectSignal(@Nullable Direction side) { var signal = 0; - for (var trait : getAllTraits()) { - if (trait instanceof IRedstoneSignalTrait redstoneSignalTrait) { - signal = Math.max(signal, redstoneSignalTrait.getOutputDirectSignal(side)); - } + for (var trait : getTraitHolder().getTraitsByInterface(IRedstoneSignalTrait.class)) { + signal = Math.max(signal, trait.getOutputDirectSignal(side)); } return signal; @@ -950,10 +973,8 @@ public int getOutputDirectSignal(@Nullable Direction side) { */ public int getAnalogOutputSignal() { var signal = 0; - for (var trait : getAllTraits()) { - if (trait instanceof IRedstoneSignalTrait redstoneSignalTrait) { - signal = Math.max(signal, redstoneSignalTrait.getAnalogOutputSignal()); - } + for (var trait : getTraitHolder().getTraitsByInterface(IRedstoneSignalTrait.class)) { + signal = Math.max(signal, trait.getAnalogOutputSignal()); } return signal; @@ -969,11 +990,10 @@ public boolean canConnectRedstone(Direction side) { CoverBehavior cover = getCoverContainer().getCoverAtSide(side); if (cover != null) return cover.canConnectRedstone(); - for (var trait : getAllTraits()) { - if (trait instanceof IRedstoneSignalTrait redstoneSignalTrait) { - if (redstoneSignalTrait.canConnectRedstone(side)) return true; - } + for (var trait : getTraitHolder().getTraitsByInterface(IRedstoneSignalTrait.class)) { + if (trait.canConnectRedstone(side)) return true; } + return false; } @@ -989,38 +1009,6 @@ public boolean canConnectRedstone(Direction side) { return MachineOwner.getPlayerOwner(ownerUUID); } - ////////////////////////////////////// - // ******** GUI *********// - ////////////////////////////////////// - @Override - public IGuiTexture getFancyTooltipIcon() { - return GuiTextures.INFO_ICON; - } - - @Override - public final List getFancyTooltip() { - var tooltips = new ArrayList(); - onAddFancyInformationTooltip(tooltips); - return tooltips; - } - - @Override - public boolean showFancyTooltip() { - return !getFancyTooltip().isEmpty(); - } - - public void onAddFancyInformationTooltip(List tooltips) { - getDefinition().getTooltipBuilder().accept(getDefinition().asStack(), tooltips); - /* - * String mainKey = String.format("%s.machine.%s.tooltip", getDefinition().getId().getNamespace(), - * getDefinition().getId().getPath()); - */ - String mainKey = getDefinition().getId().toLanguageKey("machine", "tooltip"); - if (Language.getInstance().has(mainKey)) { - tooltips.add(0, Component.translatable(mainKey)); - } - } - @Override public int getDefaultPaintingColor() { return getDefinition().getDefaultPaintingColor(); @@ -1030,8 +1018,7 @@ public int getDefaultPaintingColor() { @OnlyIn(Dist.CLIENT) @Override public AABB getRenderBoundingBox() { - BlockRenderDispatcher blockRenderDispatcher = Minecraft.getInstance().getBlockRenderer(); - BakedModel model = blockRenderDispatcher.getBlockModel(this.getBlockState()); + BakedModel model = RenderUtil.getModelForState(this.getBlockState()); if (model instanceof IBlockEntityRendererBakedModel modelWithBER) { if (modelWithBER.getBlockEntityType() == this.getType()) { @@ -1048,7 +1035,7 @@ public AABB getRenderBoundingBox() { /** * Gets the item filter for a specific side of this machine. - * + * * @param side Side * @param io The IO mode this filter should be applicable to. * @return A {@code Predicate} representing this filter @@ -1073,7 +1060,7 @@ public Predicate getItemCapFilter(@Nullable Direction side, IO io) { /** * Gets the fluid filter for a specific side of this machine. - * + * * @param side Side * @param io The IO mode this filter should be applicable to. * @return A {@code Predicate} representing this filter @@ -1098,7 +1085,7 @@ public Predicate getFluidCapFilter(@Nullable Direction side, IO io) /** * Gets the item handler capability for a specific side of this machine - * + * * @param side The side * @param useCoverCapability Whether to return an item handler provided by an attached cover, if present. * @return The {@link IItemHandlerModifiable} capability, or null. @@ -1130,7 +1117,7 @@ public IItemHandlerModifiable getItemHandlerCap(@Nullable Direction side, boolea /** * Gets the fluid handler capability for a specific side of this machine - * + * * @param side The side * @param useCoverCapability Whether to return a fluid handler provided by an attached cover, if present. * @return The {@link IFluidHandlerModifiable} capability, or null. @@ -1219,11 +1206,6 @@ public static LazyOptional getCapability(MetaMachine machine, Capability< return GTCapability.CAPABILITY_ENERGY_INFO_PROVIDER.orEmpty(cap, LazyOptional.of(() -> list.size() == 1 ? list.get(0) : new EnergyInfoProviderList(list))); } - } else if (cap == GTCapability.CAPABILITY_MAINTENANCE_MACHINE) { - if (machine instanceof IMaintenanceMachine maintenanceMachine) { - return GTCapability.CAPABILITY_MAINTENANCE_MACHINE.orEmpty(cap, - LazyOptional.of(() -> maintenanceMachine)); - } } else if (cap == ForgeCapabilities.ITEM_HANDLER) { var handler = machine.getItemHandlerCap(side, true); if (handler != null) { @@ -1308,14 +1290,89 @@ public static LazyOptional getGridNodeHostCapability(Capability cap, MetaM } } + // NBT keys for machine config values + private static final String COVER = "cover"; + private static final String FACING_DIR = "front_facing"; + + private static final String ITEM_OUTPUT_SIDE = "output_direction_item"; + private static final String ITEM_AUTO_OUTPUT = "item_auto_output"; + private static final String ALLOW_ITEM_IN_FROM_OUT = "allow_input_from_output_item"; + + private static final String FLUID_OUTPUT_SIDE = "output_direction_fluid"; + private static final String FLUID_AUTO_OUTPUT = "fluid_auto_output"; + private static final String ALLOW_FLUID_IN_FROM_OUT = "allow_input_from_output_fluid"; + + private static final String MUFFLED = "muffled"; + private static final String CIRCUIT = "circuit_config"; + @Override - public CompoundTag copyConfig(CompoundTag tag) { - return ICopyable.super.copyConfig(tag); + public void copyConfig(CompoundTag tag) { + tag.putString(FACING_DIR, MachineConfigCopyBehaviour.directionToString(getFrontFacing())); + + var outputTrait = getTrait(AutoOutputTrait.TYPE); + if (outputTrait != null && outputTrait.supportsAutoOutputItems() && + outputTrait.getItemOutputDirection() != null) { + tag.putString(ITEM_OUTPUT_SIDE, + MachineConfigCopyBehaviour.directionToString(outputTrait.getItemOutputDirection())); + tag.putBoolean(ITEM_AUTO_OUTPUT, outputTrait.isAutoOutputItems()); + tag.putBoolean(ALLOW_ITEM_IN_FROM_OUT, outputTrait.allowsItemInputFromOutputSide()); + } + + if (outputTrait != null && outputTrait.supportsAutoOutputFluids() && + outputTrait.getFluidOutputDirection() != null) { + tag.putString(FLUID_OUTPUT_SIDE, + MachineConfigCopyBehaviour.directionToString(outputTrait.getFluidOutputDirection())); + tag.putBoolean(FLUID_AUTO_OUTPUT, outputTrait.isAutoOutputFluids()); + tag.putBoolean(ALLOW_FLUID_IN_FROM_OUT, outputTrait.allowsFluidInputFromOutputSide()); + } + + if (this instanceof IMufflableMachine mufflableMachine) { + tag.putBoolean(MUFFLED, mufflableMachine.isMuffled()); + } + + var circuit = getTrait(ProgrammableCircuitSlotTrait.TYPE); + + if (circuit != null && circuit.isEnabled() && circuit.getCurrentCircuit() != 0) { + tag.putInt(CIRCUIT, circuit.getCurrentCircuit()); + } + + var coverTag = new CompoundTag(); + getCoverContainer().copyConfig(coverTag); + tag.put(COVER, coverTag); } @Override public void pasteConfig(ServerPlayer player, CompoundTag tag) { - ICopyable.super.pasteConfig(player, tag); + var outputTrait = getTrait(AutoOutputTrait.TYPE); + if (outputTrait != null) { + if (tag.contains(ITEM_OUTPUT_SIDE)) + outputTrait.setItemOutputDirection( + MachineConfigCopyBehaviour.stringToDirection(tag.getString(ITEM_OUTPUT_SIDE))); + if (tag.contains(ITEM_AUTO_OUTPUT)) outputTrait.setAllowAutoOutputItems(tag.getBoolean(ITEM_AUTO_OUTPUT)); + if (tag.contains(ALLOW_ITEM_IN_FROM_OUT)) + outputTrait.setAllowItemInputFromOutputSide(tag.getBoolean(ALLOW_ITEM_IN_FROM_OUT)); + if (tag.contains(FLUID_OUTPUT_SIDE)) + outputTrait.setFluidOutputDirection( + MachineConfigCopyBehaviour.stringToDirection(tag.getString(FLUID_OUTPUT_SIDE))); + if (tag.contains(FLUID_AUTO_OUTPUT)) + outputTrait.setAllowAutoOutputFluids(tag.getBoolean(FLUID_AUTO_OUTPUT)); + if (tag.contains(ALLOW_FLUID_IN_FROM_OUT)) + outputTrait.setAllowFluidInputFromOutputSide(tag.getBoolean(ALLOW_FLUID_IN_FROM_OUT)); + } + + Direction facingDir = Direction.byName(tag.getString(FACING_DIR)); + if (facingDir != null) setFrontFacing(facingDir); + + if (this instanceof IMufflableMachine mufflableMachine) { + if (tag.contains(MUFFLED)) mufflableMachine.setMuffled(tag.getBoolean(MUFFLED)); + } + + if (tag.contains(CIRCUIT)) { + getTraitOptional(ProgrammableCircuitSlotTrait.TYPE) + .ifPresent(t -> t.setCurrentCircuit(tag.getInt(CIRCUIT))); + } + + getCoverContainer().pasteConfig(player, tag.getCompound(COVER)); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MultiblockMachineDefinition.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MultiblockMachineDefinition.java index faebe83421d..ec29eb1926b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MultiblockMachineDefinition.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MultiblockMachineDefinition.java @@ -1,9 +1,8 @@ package com.gregtechceu.gtceu.api.machine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; -import com.gregtechceu.gtceu.api.pattern.BlockPattern; -import com.gregtechceu.gtceu.api.pattern.MultiblockShapeInfo; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; +import com.gregtechceu.gtceu.api.multiblock.pattern.IBlockPattern; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; @@ -11,7 +10,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; -import it.unimi.dsi.fastutil.ints.IntArrayList; import lombok.Getter; import lombok.NonNull; import lombok.Setter; @@ -28,14 +26,9 @@ public class MultiblockMachineDefinition extends MachineDefinition { @Getter @Setter private boolean generator; - @Setter @Getter @NonNull - private Supplier patternFactory; - @Setter - @Getter - private Supplier> shapes; - /** Set this to false only if your multiblock is set up such that it could have a wall-shared controller. */ + private Map> structurePatterns = new HashMap<>(); @Getter @Setter private boolean allowFlip; @@ -48,10 +41,10 @@ public class MultiblockMachineDefinition extends MachineDefinition { private Supplier recoveryItems; @Setter @Getter - private Function> partSorter; + private Function> partSorter; @Getter @Setter - private TriFunction partAppearance; + private TriFunction partAppearance; @Getter @Setter private BiConsumer> additionalDisplay; @@ -60,30 +53,7 @@ public MultiblockMachineDefinition(ResourceLocation id) { super(id); } - public List getMatchingShapes() { - var designs = shapes.get(); - if (!designs.isEmpty()) return designs; - var structurePattern = patternFactory.get(); - int[][] aisleRepetitions = structurePattern.aisleRepetitions; - return repetitionDFS(structurePattern, new ArrayList<>(), aisleRepetitions, new IntArrayList()); - } - - private List repetitionDFS(BlockPattern pattern, List pages, - int[][] aisleRepetitions, IntArrayList repetitionStack) { - if (repetitionStack.size() == aisleRepetitions.length) { - int[] repetition = new int[repetitionStack.size()]; - for (int i = 0; i < repetitionStack.size(); i++) { - repetition[i] = repetitionStack.getInt(i); - } - pages.add(new MultiblockShapeInfo(pattern.getPreview(repetition))); - } else { - for (int i = aisleRepetitions[repetitionStack.size()][0]; i <= - aisleRepetitions[repetitionStack.size()][1]; i++) { - repetitionStack.push(i); - repetitionDFS(pattern, pages, aisleRepetitions, repetitionStack); - repetitionStack.popInt(); - } - } - return pages; + public void setPattern(String structureName, Supplier pattern) { + structurePatterns.put(structureName, pattern); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java index 28afe1e2bfe..0e16587832d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java @@ -3,48 +3,30 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.*; -import com.gregtechceu.gtceu.api.gui.editor.EditableMachineUI; -import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.recipe.GTRecipe; -import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; import com.gregtechceu.gtceu.api.recipe.modifier.ParallelLogic; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; -import com.gregtechceu.gtceu.api.recipe.ui.GTRecipeTypeUI; import com.gregtechceu.gtceu.common.data.GTMedicalConditions; import com.gregtechceu.gtceu.common.machine.trait.hazard.EnvironmentalHazardEmitterTrait; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.utils.Position; -import com.lowdragmc.lowdraglib.utils.Size; - -import net.minecraft.Util; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; - -import com.google.common.collect.Tables; import it.unimi.dsi.fastutil.ints.Int2IntFunction; import lombok.Getter; -import java.util.Collections; -import java.util.EnumMap; -import java.util.LinkedHashMap; -import java.util.function.BiFunction; - /** * All singleblock generators are implemented here. */ -public class SimpleGeneratorMachine extends WorkableTieredMachine - implements IFancyUIMachine { +public class SimpleGeneratorMachine extends WorkableTieredMachine { @Getter private final EnvironmentalHazardEmitterTrait hazardEmitter; public SimpleGeneratorMachine(BlockEntityCreationInfo info, int tier, float hazardStrengthPerOperation, Int2IntFunction tankScalingFunction) { - super(info, tier, tankScalingFunction); + super(info, tier, true, tankScalingFunction); + recipeLogic.setRegressWhenWaiting(false); energyContainer.setSideOutputCondition(side -> !hasFrontFacing() || side == getFrontFacing()); this.hazardEmitter = attachTrait( new EnvironmentalHazardEmitterTrait(GTMedicalConditions.CARBON_MONOXIDE_POISONING, @@ -57,12 +39,6 @@ public SimpleGeneratorMachine(BlockEntityCreationInfo info, int tier, Int2IntFun ////////////////////////////////////// // ***** Initialization ******// - ////////////////////////////////////// - - @Override - protected boolean isEnergyEmitter() { - return true; - } @Override public int tintColor(int index) { @@ -104,60 +80,18 @@ public static ModifierFunction recipeModifier(MetaMachine machine, GTRecipe reci .build(); } - @Override - public boolean regressWhenWaiting() { - return false; - } - @Override public boolean canVoidRecipeOutputs(RecipeCapability capability) { return capability != EURecipeCapability.CAP; } - @Override - public void afterWorking() { - super.afterWorking(); - hazardEmitter.emitHazard(); - } - @Override public long getDisplayRecipeVoltage() { return GTValues.V[this.tier]; } - ////////////////////////////////////// - // *********** GUI ***********// - ////////////////////////////////////// - - @SuppressWarnings("UnstableApiUsage") - public static BiFunction EDITABLE_UI_CREATOR = Util - .memoize((path, recipeType) -> new EditableMachineUI("generator", path, () -> { - WidgetGroup template = recipeType.getRecipeUI().createEditableUITemplate(false, false).createDefault(); - WidgetGroup group = new WidgetGroup(0, 0, template.getSize().width + 4 + 8, - template.getSize().height + 8); - Size size = group.getSize(); - template.setSelfPosition(new Position( - (size.width - 4 - template.getSize().width) / 2 + 4, - (size.height - template.getSize().height) / 2)); - group.addWidget(template); - return group; - }, (template, machine) -> { - if (machine instanceof SimpleGeneratorMachine generatorMachine) { - var storages = Tables.newCustomTable(new EnumMap<>(IO.class), - LinkedHashMap, Object>::new); - storages.put(IO.IN, ItemRecipeCapability.CAP, generatorMachine.importItems.storage); - storages.put(IO.OUT, ItemRecipeCapability.CAP, generatorMachine.exportItems.storage); - storages.put(IO.IN, FluidRecipeCapability.CAP, generatorMachine.importFluids); - storages.put(IO.OUT, FluidRecipeCapability.CAP, generatorMachine.exportFluids); - - generatorMachine.getRecipeType().getRecipeUI().createEditableUITemplate(false, false).setupUI( - template, - new GTRecipeTypeUI.RecipeHolder(generatorMachine.recipeLogic::getProgressPercent, - storages, - new CompoundTag(), - Collections.emptyList(), - false, false)); - createEnergyBar().setupUI(template, generatorMachine); - } - })); + @Override + public long getDisplayGeneratorPower() { + return energyContainer.getOutputVoltage() * energyContainer.getOutputAmperage(); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java index 9aa3c3872d0..a27c2174595 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java @@ -2,282 +2,34 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; -import com.gregtechceu.gtceu.api.capability.recipe.*; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.editor.EditableMachineUI; -import com.gregtechceu.gtceu.api.gui.editor.EditableUI; -import com.gregtechceu.gtceu.api.gui.fancy.ConfiguratorPanel; -import com.gregtechceu.gtceu.api.gui.fancy.IFancyConfigurator; -import com.gregtechceu.gtceu.api.gui.fancy.IFancyConfiguratorButton; -import com.gregtechceu.gtceu.api.gui.widget.GhostCircuitSlotWidget; -import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; -import com.gregtechceu.gtceu.api.machine.fancyconfigurator.CircuitFancyConfigurator; -import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; -import com.gregtechceu.gtceu.api.recipe.GTRecipeType; -import com.gregtechceu.gtceu.api.recipe.ui.GTRecipeTypeUI; -import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; -import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; -import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; -import com.gregtechceu.gtceu.common.item.behavior.IntCircuitBehaviour; +import com.gregtechceu.gtceu.common.data.machines.GTMachineUtils; import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait; -import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.data.lang.LangUtil; -import com.gregtechceu.gtceu.utils.ISubscription; +import com.gregtechceu.gtceu.common.machine.trait.BatterySlotTrait; +import com.gregtechceu.gtceu.common.machine.trait.ProgrammableCircuitSlotTrait; -import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; -import com.lowdragmc.lowdraglib.gui.util.ClickData; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.utils.Position; - -import net.minecraft.Util; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; - -import com.google.common.collect.Tables; import it.unimi.dsi.fastutil.ints.Int2IntFunction; -import lombok.Getter; -import org.jetbrains.annotations.Nullable; import java.util.*; -import java.util.function.*; /** * All simple single machines are implemented here. */ -public class SimpleTieredMachine extends WorkableTieredMachine - implements IFancyUIMachine, IHasCircuitSlot { - - @Getter - @SaveField - protected final CustomItemStackHandler chargerInventory; - @Getter - @SaveField - protected final NotifiableItemStackHandler circuitInventory; - @Nullable - protected TickableSubscription batterySubs; - @Nullable - protected ISubscription energySubs; - @SaveField - @SyncToClient - public final AutoOutputTrait autoOutput; +public class SimpleTieredMachine extends WorkableTieredMachine { public SimpleTieredMachine(BlockEntityCreationInfo info, int tier, Int2IntFunction tankScalingFunction) { - super(info, tier, tankScalingFunction); - - this.autoOutput = attachTrait(new AutoOutputTrait(List.of(exportItems), List.of(exportFluids))); - - this.chargerInventory = new CustomItemStackHandler() { - - public int getSlotLimit(int slot) { - return 1; - } - }; - chargerInventory.setFilter(item -> GTCapabilityHelper.getElectricItem(item) != null || - (ConfigHolder.INSTANCE.compat.energy.nativeEUToFE && - GTCapabilityHelper.getForgeEnergyItem(item) != null)); - - this.circuitInventory = attachTrait(new NotifiableItemStackHandler(1, IO.IN, IO.NONE) - .shouldDropInventoryInWorld(!ConfigHolder.INSTANCE.machines.ghostCircuit) - .setFilter(IntCircuitBehaviour::isIntegratedCircuit)); - } - - ////////////////////////////////////// - // ***** Initialization ******// - ////////////////////////////////////// - - @Override - public void onLoad() { - super.onLoad(); - if (!isRemote()) { - updateBatterySubscription(); - energySubs = energyContainer.addChangedListener(this::updateBatterySubscription); - chargerInventory.setOnContentsChanged(this::updateBatterySubscription); - } - } - - @Override - public void onUnload() { - super.onUnload(); - if (energySubs != null) { - energySubs.unsubscribe(); - energySubs = null; - } - } + super(info, tier, false, tankScalingFunction); - protected void updateBatterySubscription() { - if (energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, true)) { - batterySubs = subscribeServerTick(batterySubs, this::chargeBattery); - } else if (batterySubs != null) { - batterySubs.unsubscribe(); - batterySubs = null; - } + attachPersistentTrait("autoOutput", new AutoOutputTrait(List.of(exportItems), List.of(exportFluids))); + attachPersistentTrait("circuit", new ProgrammableCircuitSlotTrait()); + attachPersistentTrait("batterySlot", new BatterySlotTrait(energyContainer)); } - protected void chargeBattery() { - if (!energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, false)) { - updateBatterySubscription(); - } + public SimpleTieredMachine(BlockEntityCreationInfo info, int tier) { + this(info, tier, GTMachineUtils.defaultTankSizeFunction); } - ////////////////////////////////////// - // ********** MISC ***********// - ////////////////////////////////////// - @Override - public void onMachineDestroyed() { - super.onMachineDestroyed(); - chargerInventory.dropInventoryInWorld(getLevel(), getBlockPos()); - } - - /// ////////////////////////////////// - // ****** RECIPE LOGIC *******// - /// ////////////////////////////////// - @Override public long getDisplayRecipeVoltage() { return GTValues.V[this.tier]; } - - ////////////////////////////////////// - // *********** GUI ***********// - ////////////////////////////////////// - - @Override - public void attachConfigurators(ConfiguratorPanel configuratorPanel) { - IFancyUIMachine.super.attachConfigurators(configuratorPanel); - - if (autoOutput.supportsAutoOutputFluids()) { - configuratorPanel.attachConfigurators(createAutoOutputFluidConfigurator()); - } - if (autoOutput.supportsAutoOutputItems()) { - configuratorPanel.attachConfigurators(createAutoOutputItemConfigurator()); - } - - if (isCircuitSlotEnabled()) { - configuratorPanel.attachConfigurators(new CircuitFancyConfigurator(circuitInventory.storage)); - } - } - - private IFancyConfigurator createAutoOutputFluidConfigurator() { - return createAutoOutputConfigurator( - GuiTextures.IO_CONFIG_FLUID_MODES_BUTTON, - "gtceu.gui.fluid_auto_output", - this.autoOutput::isAutoOutputFluids, - (cd, nextState) -> this.autoOutput.setAllowAutoOutputFluids(nextState)); - } - - private IFancyConfigurator createAutoOutputItemConfigurator() { - return createAutoOutputConfigurator( - GuiTextures.IO_CONFIG_ITEM_MODES_BUTTON, - "gtceu.gui.item_auto_output", - this.autoOutput::isAutoOutputItems, - (cd, nextState) -> this.autoOutput.setAllowAutoOutputItems(nextState)); - } - - private IFancyConfigurator createAutoOutputConfigurator(ResourceTexture modesButtonTexture, - String tooltipBaseLangKey, - BooleanSupplier stateSupplier, - BiConsumer onToggle) { - var toggle = new IFancyConfiguratorButton.Toggle( - new GuiTextureGroup( - GuiTextures.TOGGLE_BUTTON_BACK.getSubTexture(0, 0, 1, 0.5), - modesButtonTexture.getSubTexture(0, 1 / 3f, 1, 1 / 3f)), - new GuiTextureGroup( - GuiTextures.TOGGLE_BUTTON_BACK.getSubTexture(0, 0.5, 1, 0.5), - modesButtonTexture.getSubTexture(0, 2 / 3f, 1, 1 / 3f)), - stateSupplier, - onToggle); - - toggle.setTooltipsSupplier(enabled -> { - var key = tooltipBaseLangKey + '.' + (enabled ? "enabled" : "disabled"); - return List.of(Component.translatable(key)); - }); - - return toggle; - } - - @SuppressWarnings("UnstableApiUsage") - public static BiFunction EDITABLE_UI_CREATOR = Util - .memoize((path, recipeType) -> new EditableMachineUI("simple", path, () -> { - WidgetGroup template = recipeType.getRecipeUI().createEditableUITemplate(false, false).createDefault(); - SlotWidget batterySlot = createBatterySlot().createDefault(); - WidgetGroup group = new WidgetGroup(0, 0, template.getSize().width, - Math.max(template.getSize().height, 78)); - template.setSelfPosition(new Position(0, (group.getSize().height - template.getSize().height) / 2)); - batterySlot.setSelfPosition(new Position(group.getSize().width / 2 - 9, group.getSize().height - 18)); - group.addWidget(batterySlot); - group.addWidget(template); - - // TODO fix this. - // if (ConfigHolder.INSTANCE.machines.ghostCircuit) { - // SlotWidget circuitSlot = createCircuitConfigurator().createDefault(); - // circuitSlot.setSelfPosition(new Position(120, 62)); - // group.addWidget(circuitSlot); - // } - - return group; - }, (template, machine) -> { - if (machine instanceof SimpleTieredMachine tieredMachine) { - var storages = Tables.newCustomTable(new EnumMap<>(IO.class), - LinkedHashMap, Object>::new); - storages.put(IO.IN, ItemRecipeCapability.CAP, tieredMachine.importItems.storage); - storages.put(IO.OUT, ItemRecipeCapability.CAP, tieredMachine.exportItems.storage); - storages.put(IO.IN, FluidRecipeCapability.CAP, tieredMachine.importFluids); - storages.put(IO.OUT, FluidRecipeCapability.CAP, tieredMachine.exportFluids); - storages.put(IO.IN, CWURecipeCapability.CAP, tieredMachine.importComputation); - storages.put(IO.OUT, CWURecipeCapability.CAP, tieredMachine.exportComputation); - - tieredMachine.getRecipeType().getRecipeUI().createEditableUITemplate(false, false).setupUI(template, - new GTRecipeTypeUI.RecipeHolder(tieredMachine.recipeLogic::getProgressPercent, - storages, - new CompoundTag(), - Collections.emptyList(), - false, false)); - createBatterySlot().setupUI(template, tieredMachine); - // createCircuitConfigurator().setupUI(template, tieredMachine); - } - })); - - /** - * Create a battery slot widget. - */ - protected static EditableUI createBatterySlot() { - return new EditableUI<>("battery_slot", SlotWidget.class, () -> { - var slotWidget = new SlotWidget(); - slotWidget.setBackground(GuiTextures.SLOT, GuiTextures.CHARGER_OVERLAY); - return slotWidget; - }, (slotWidget, machine) -> { - slotWidget.setHandlerSlot(machine.chargerInventory, 0); - slotWidget.setCanPutItems(true); - slotWidget.setCanTakeItems(true); - slotWidget.setHoverTooltips(LangUtil.getMultiLang("gtceu.gui.charger_slot.tooltip", - GTValues.VNF[machine.getTier()], GTValues.VNF[machine.getTier()])); - }); - } - - /** - * Create a ghost circuit slot widget. - */ - protected static EditableUI createCircuitConfigurator() { - return new EditableUI<>("circuit_configurator", GhostCircuitSlotWidget.class, () -> { - var slotWidget = new GhostCircuitSlotWidget(); - slotWidget.setBackground(GuiTextures.SLOT, GuiTextures.INT_CIRCUIT_OVERLAY); - return slotWidget; - }, (slotWidget, machine) -> { - slotWidget.setCircuitInventory(machine.circuitInventory); - slotWidget.setCanPutItems(false); - slotWidget.setCanTakeItems(false); - slotWidget.setHoverTooltips(LangUtil.getMultiLang("gtceu.gui.configurator_slot.tooltip")); - }); - } - - // Method provided to override - protected IGuiTexture getCircuitSlotOverlay() { - return GuiTextures.INT_CIRCUIT_OVERLAY; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java index c6236776f7c..dd8fef8ced0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java @@ -2,23 +2,15 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.editor.EditableUI; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableEnergyContainer; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.machine.trait.EnvironmentalExplosionTrait; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.texture.ProgressTexture; -import com.lowdragmc.lowdraglib.gui.widget.ProgressWidget; - import net.minecraft.util.Mth; import lombok.Getter; -import java.util.function.Function; - /** * A singleblock tiered machine with an energy container. */ @@ -31,6 +23,15 @@ public class TieredEnergyMachine extends TieredMachine { @Getter protected final EnvironmentalExplosionTrait environmentalExplosionTrait; + /** + * Creates a {@link TieredEnergyMachine} using the given energy container.
+ * + * + * @param info {@link BlockEntityCreationInfo} + * @param tier Machine/voltage tier + * @param energyContainer The enegery container to attach + * @see NotifiableEnergyContainer + */ public TieredEnergyMachine(BlockEntityCreationInfo info, int tier, NotifiableEnergyContainer energyContainer) { super(info, tier); @@ -39,32 +40,24 @@ public TieredEnergyMachine(BlockEntityCreationInfo info, int tier, () -> energyContainer.getEnergyStored() > 0)); } - public TieredEnergyMachine(BlockEntityCreationInfo info, int tier, - Function energyContainer) { - super(info, tier); - this.energyContainer = attachTrait(energyContainer.apply(this)); - environmentalExplosionTrait = attachTrait(new EnvironmentalExplosionTrait(tier, tier * 10, - () -> this.energyContainer.getEnergyStored() > 0)); - } - - public TieredEnergyMachine(BlockEntityCreationInfo info, int tier) { - super(info, tier); - - long tierVoltage = GTValues.V[tier]; - if (isEnergyEmitter()) { - energyContainer = attachTrait(NotifiableEnergyContainer.emitterContainer(tierVoltage * 64L, tierVoltage, - getMaxInputOutputAmperage())); - } else { - energyContainer = attachTrait(NotifiableEnergyContainer.receiverContainer(tierVoltage * 64L, tierVoltage, - getMaxInputOutputAmperage())); - } - environmentalExplosionTrait = attachTrait(new EnvironmentalExplosionTrait(tier, tier * 10, - () -> energyContainer.getEnergyStored() > 0)); + /** + * Creates a {@link TieredEnergyMachine} with a default energy container.
+ * Defaults to a container with a capacity of 64A @ the given voltage tier, and a max input/output amperage of 1A @ + * the given voltage tier. + * + * @param info {@link BlockEntityCreationInfo} + * @param tier Machine/voltage tier + * @param emitsEnergy If the energy container should receive or emit energy. + * @see NotifiableEnergyContainer + */ + public TieredEnergyMachine(BlockEntityCreationInfo info, int tier, boolean emitsEnergy) { + this(info, tier, + emitsEnergy ? NotifiableEnergyContainer.emitterContainer(GTValues.V[tier] * 64L, GTValues.V[tier], + 1) : + NotifiableEnergyContainer.receiverContainer(GTValues.V[tier] * 64L, GTValues.V[tier], + 1)); } - ////////////////////////////////////// - // ********** MISC ***********// - ////////////////////////////////////// @Override public int getAnalogOutputSignal() { long energyStored = energyContainer.getEnergyStored(); @@ -72,38 +65,4 @@ public int getAnalogOutputSignal() { float f = energyCapacity == 0L ? 0.0f : energyStored / (energyCapacity * 1.0f); return Mth.floor(f * 14.0f) + (energyStored > 0 ? 1 : 0); } - - /** - * Determines max input or output amperage used by this machine - * if emitter, it determines size of energy packets it will emit at once - * if receiver, it determines max input energy per request - * - * @return max amperage received or emitted by this machine - */ - protected long getMaxInputOutputAmperage() { - return 1L; - } - - /** - * Determines if this machine is in energy receiver or emitter mode - * - * @return true if machine emits energy to network, false it it accepts energy from network - */ - protected boolean isEnergyEmitter() { - return false; - } - - /** - * Create an energy bar widget. - */ - protected static EditableUI createEnergyBar() { - return new EditableUI<>("energy_container", ProgressWidget.class, () -> { - var progressBar = new ProgressWidget(ProgressWidget.JEIProgress, 0, 0, 18, 60, - new ProgressTexture(IGuiTexture.EMPTY, GuiTextures.ENERGY_BAR_BASE)); - progressBar.setFillDirection(ProgressTexture.FillDirection.DOWN_TO_UP); - progressBar.setBackground(GuiTextures.ENERGY_BAR_BACKGROUND); - return progressBar; - }, (progressBar, machine) -> progressBar.setProgressSupplier( - () -> machine.energyContainer.getEnergyStored() * 1d / machine.energyContainer.getEnergyCapacity())); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java index f5b2553f098..b257a0d0e3a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java @@ -4,7 +4,12 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.*; import com.gregtechceu.gtceu.api.machine.feature.*; -import com.gregtechceu.gtceu.api.machine.trait.*; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableComputationContainer; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.recipe.IRecipeHandlerTrait; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; @@ -58,11 +63,25 @@ public abstract class WorkableTieredMachine extends TieredEnergyMachine implemen protected boolean isMuffled; protected boolean previouslyMuffled = true; + /** + * Creates a {@link WorkableTieredMachine}. + * + * @param info {@link BlockEntityCreationInfo} + * @param tier Machine tier. + * @param recipeLogic The recipe logic to use. + * @param importSlots The amount of item input slots this machine should have (can be 0). + * @param exportSlots The amount of item output slots this machine should have (can be 0). + * @param fluidImportSlots The amount of fluid input slots this machine should have (can be 0). + * @param fluidExportSlots The amount of fluid output slots this machine should have (can be 0). + * @param energyEmitter If this machine should input or output energy. + * @param tankScalingFunction The tank scaling function which determines the capaacity of fluid slots. + */ public WorkableTieredMachine(BlockEntityCreationInfo info, int tier, RecipeLogic recipeLogic, int importSlots, int exportSlots, - int fluidImportSlots, int fluidExportSlots, Int2IntFunction tankScalingFunction) { - super(info, tier); + int fluidImportSlots, int fluidExportSlots, boolean energyEmitter, + Int2IntFunction tankScalingFunction) { + super(info, tier, energyEmitter); this.overclockTier = getMaxOverclockTier(); this.recipeTypes = getDefinition().getRecipeTypes(); this.activeRecipeType = 0; @@ -71,6 +90,7 @@ public WorkableTieredMachine(BlockEntityCreationInfo info, int tier, this.traitSubscriptions = new ArrayList<>(); this.cleanroomReceiver = attachTrait(new CleanroomReceiverTrait()); this.recipeLogic = attachTrait(recipeLogic); + this.recipeLogic.setKeepSubscribing(false); this.importItems = attachTrait(new NotifiableItemStackHandler(importSlots, IO.IN, IO.BOTH)); this.exportItems = attachTrait(new NotifiableItemStackHandler(exportSlots, IO.OUT)); this.importFluids = attachTrait( @@ -83,8 +103,18 @@ public WorkableTieredMachine(BlockEntityCreationInfo info, int tier, this.exportComputation = attachTrait(new NotifiableComputationContainer(IO.OUT, false)); } - public WorkableTieredMachine(BlockEntityCreationInfo info, int tier, Int2IntFunction tankScalingFunction) { - super(info, tier); + /** + * Creates a {@link WorkableTieredMachine} with default settings.
+ * The amount of item and fluid input and output slots is determined by the machine's recipe type. + * + * @param info {@link BlockEntityCreationInfo} + * @param tier Machine tier. + * @param energyEmitter If this machine should input or output energy. + * @param tankScalingFunction The tank scaling function which determines the capaacity of fluid slots. + */ + public WorkableTieredMachine(BlockEntityCreationInfo info, int tier, boolean energyEmitter, + Int2IntFunction tankScalingFunction) { + super(info, tier, energyEmitter); this.overclockTier = getMaxOverclockTier(); this.recipeTypes = getDefinition().getRecipeTypes(); this.activeRecipeType = 0; @@ -93,16 +123,19 @@ public WorkableTieredMachine(BlockEntityCreationInfo info, int tier, Int2IntFunc this.traitSubscriptions = new ArrayList<>(); this.cleanroomReceiver = attachTrait(new CleanroomReceiverTrait()); this.recipeLogic = attachTrait(new RecipeLogic()); + this.recipeLogic.setKeepSubscribing(false); this.importItems = attachTrait( - new NotifiableItemStackHandler(getRecipeType().getMaxInputs(ItemRecipeCapability.CAP), - IO.IN)); + new NotifiableItemStackHandler(getDefinition().getInputSize(ItemRecipeCapability.CAP, getRecipeTypes()), + IO.IN, IO.BOTH)); this.exportItems = attachTrait( - new NotifiableItemStackHandler(getRecipeType().getMaxOutputs(ItemRecipeCapability.CAP), + new NotifiableItemStackHandler( + getDefinition().getOutputSize(ItemRecipeCapability.CAP, getRecipeTypes()), IO.OUT)); - this.importFluids = attachTrait(new NotifiableFluidTank(getRecipeType().getMaxInputs(FluidRecipeCapability.CAP), - tankScalingFunction.applyAsInt(getTier()), IO.IN)); + this.importFluids = attachTrait( + new NotifiableFluidTank(getDefinition().getInputSize(FluidRecipeCapability.CAP, getRecipeTypes()), + tankScalingFunction.applyAsInt(getTier()), IO.IN)); this.exportFluids = attachTrait( - new NotifiableFluidTank(getRecipeType().getMaxOutputs(FluidRecipeCapability.CAP), + new NotifiableFluidTank(getDefinition().getOutputSize(FluidRecipeCapability.CAP, getRecipeTypes()), tankScalingFunction.applyAsInt(getTier()), IO.OUT)); this.importComputation = attachTrait(new NotifiableComputationContainer(IO.IN, true)); this.exportComputation = attachTrait(new NotifiableComputationContainer(IO.OUT, false)); @@ -118,10 +151,8 @@ public void onLoad() { // attach self traits Map>> ioTraits = new EnumMap<>(IO.class); - for (MachineTrait trait : getAllTraits()) { - if (trait instanceof IRecipeHandlerTrait handlerTrait) { - ioTraits.computeIfAbsent(handlerTrait.getHandlerIO(), i -> new ArrayList<>()).add(handlerTrait); - } + for (var trait : getTraitHolder().getTraitsByInterface(IRecipeHandlerTrait.class)) { + ioTraits.computeIfAbsent(trait.getHandlerIO(), i -> new ArrayList<>()).add(trait); } for (var entry : ioTraits.entrySet()) { @@ -191,13 +222,9 @@ public void clientTick() { } } - @Override - public boolean keepSubscribing() { - return false; - } - public GTRecipeType getRecipeType() { - return recipeTypes[activeRecipeType]; + int index = activeRecipeType >= 0 && activeRecipeType < recipeTypes.length ? activeRecipeType : 0; + return recipeTypes[index]; } /** diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/AutoStockingFancyConfigurator.java b/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/AutoStockingFancyConfigurator.java deleted file mode 100644 index 94620e8736c..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/AutoStockingFancyConfigurator.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.fancyconfigurator; - -import com.gregtechceu.gtceu.api.gui.fancy.IFancyConfigurator; -import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; -import com.gregtechceu.gtceu.common.data.GTItems; -import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.integration.ae2.machine.MEStockingBusPartMachine; -import com.gregtechceu.gtceu.integration.ae2.machine.feature.multiblock.IMEStockingPart; - -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.texture.ItemStackTexture; -import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; - -import net.minecraft.network.chat.Component; - -public class AutoStockingFancyConfigurator implements IFancyConfigurator { - - private IMEStockingPart machine; - - public AutoStockingFancyConfigurator(IMEStockingPart machine) { - this.machine = machine; - } - - @Override - public Component getTitle() { - return Component.translatable("gtceu.gui.adv_stocking_config.title"); - } - - @Override - public IGuiTexture getIcon() { - return new ItemStackTexture(GTItems.TOOL_DATA_STICK.asStack()); - } - - @Override - public Widget createConfigurator() { - var group = new WidgetGroup(0, 0, 90, 70); - - String suffix = machine instanceof MEStockingBusPartMachine ? "min_item_count" : "min_fluid_count"; - - group.addWidget(new LabelWidget(4, 2, "gtceu.gui.title.adv_stocking_config." + suffix)); - group.addWidget(new IntInputWidget(4, 12, 81, 14, machine::getMinStackSize, - machine::setMinStackSize).setMin(1) - .appendHoverTooltips(Component.translatable("gtceu.gui.adv_stocking_config." + suffix))); - group.addWidget(new LabelWidget(4, 36, "gtceu.gui.title.adv_stocking_config.ticks_per_cycle")); - group.addWidget(new IntInputWidget(4, 46, 81, 14, machine::getTicksPerCycle, - machine::setTicksPerCycle).setMin(ConfigHolder.INSTANCE.compat.ae2.updateIntervals) - .setHoverTooltips(Component.translatable("gtceu.gui.adv_stocking_config.ticks_per_cycle"))); - - return group; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/ButtonConfigurator.java b/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/ButtonConfigurator.java deleted file mode 100644 index 839da741dc9..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/ButtonConfigurator.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.fancyconfigurator; - -import com.gregtechceu.gtceu.api.gui.fancy.IFancyConfiguratorButton; - -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.util.ClickData; - -import net.minecraft.network.chat.Component; - -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; - -import java.util.Collections; -import java.util.List; -import java.util.function.Consumer; - -@Accessors(chain = true) -public class ButtonConfigurator implements IFancyConfiguratorButton { - - @Getter - protected IGuiTexture icon; - - protected Consumer onClick; - - @Getter - @Setter - protected List tooltips = Collections.emptyList(); - - public ButtonConfigurator(IGuiTexture texture, Consumer onClick) { - this.icon = texture; - this.onClick = onClick; - } - - @Override - public void onClick(ClickData clickData) { - onClick.accept(clickData); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CircuitFancyConfigurator.java b/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CircuitFancyConfigurator.java deleted file mode 100644 index 7c7acb65037..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CircuitFancyConfigurator.java +++ /dev/null @@ -1,198 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.fancyconfigurator; - -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.fancy.IFancyConfigurator; -import com.gregtechceu.gtceu.api.gui.fancy.IFancyCustomMiddleClickAction; -import com.gregtechceu.gtceu.api.gui.fancy.IFancyCustomMouseWheelAction; -import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; -import com.gregtechceu.gtceu.common.item.behavior.IntCircuitBehaviour; -import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.data.lang.LangUtil; - -import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.texture.ItemStackTexture; -import com.lowdragmc.lowdraglib.gui.widget.ButtonWidget; -import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraftforge.items.ItemStackHandler; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.function.BiConsumer; -import java.util.function.Consumer; - -public class CircuitFancyConfigurator implements IFancyConfigurator, IFancyCustomMouseWheelAction, - IFancyCustomMiddleClickAction { - - private static final int SET_TO_ZERO = 2; - private static final int SET_TO_EMPTY = 3; - private static final int SET_TO_N = 4; - - private static final int NO_CONFIG = -1; - - final ItemStackHandler circuitSlot; - - public CircuitFancyConfigurator(ItemStackHandler circuitSlot) { - this.circuitSlot = circuitSlot; - } - - @Override - public Component getTitle() { - return Component.translatable("gtceu.gui.circuit.title"); - } - - @Override - public IGuiTexture getIcon() { - if (IntCircuitBehaviour.isIntegratedCircuit(circuitSlot.getStackInSlot(0))) { - return new ItemStackTexture(circuitSlot.getStackInSlot(0)); - } - return new GuiTextureGroup(new ItemStackTexture(IntCircuitBehaviour.stack(0)), - new ItemStackTexture(Items.BARRIER)); - } - - @Override - public boolean mouseWheelMove(BiConsumer> writeClientAction, double mouseX, - double mouseY, double wheelDelta) { - if (wheelDelta == 0) return false; - if (!ConfigHolder.INSTANCE.machines.ghostCircuit && circuitSlot.getStackInSlot(0).isEmpty()) return false; - int nextValue = getNextValue(wheelDelta > 0); - if (nextValue == NO_CONFIG) { - if (ConfigHolder.INSTANCE.machines.ghostCircuit) { - circuitSlot.setStackInSlot(0, ItemStack.EMPTY); - writeClientAction.accept(SET_TO_EMPTY, buf -> {}); - } - } else { - circuitSlot.setStackInSlot(0, IntCircuitBehaviour.stack(nextValue)); - writeClientAction.accept(SET_TO_N, buf -> buf.writeVarInt(nextValue)); - } - return true; - } - - @Override - public void handleClientAction(int id, FriendlyByteBuf buffer) { - switch (id) { - case SET_TO_ZERO -> { - if (ConfigHolder.INSTANCE.machines.ghostCircuit || !circuitSlot.getStackInSlot(0).isEmpty()) - circuitSlot.setStackInSlot(0, IntCircuitBehaviour.stack(0)); - } - case SET_TO_EMPTY -> { - if (ConfigHolder.INSTANCE.machines.ghostCircuit || circuitSlot.getStackInSlot(0).isEmpty()) - circuitSlot.setStackInSlot(0, ItemStack.EMPTY); - else - circuitSlot.setStackInSlot(0, IntCircuitBehaviour.stack(0)); - } - case SET_TO_N -> { - if (ConfigHolder.INSTANCE.machines.ghostCircuit || !circuitSlot.getStackInSlot(0).isEmpty()) - circuitSlot.setStackInSlot(0, IntCircuitBehaviour.stack(buffer.readVarInt())); - } - } - } - - @Override - public void onMiddleClick(BiConsumer> writeClientAction) { - if (!ConfigHolder.INSTANCE.machines.ghostCircuit && !circuitSlot.getStackInSlot(0).isEmpty()) - circuitSlot.setStackInSlot(0, IntCircuitBehaviour.stack(0)); - else - circuitSlot.setStackInSlot(0, ItemStack.EMPTY); - writeClientAction.accept(SET_TO_EMPTY, buf -> {}); - } - - @Override - public Widget createConfigurator() { - var group = new WidgetGroup(0, 0, 174, 132); - group.addWidget(new LabelWidget(9, 8, "Programmed Circuit Configuration")); - group.addWidget(new SlotWidget(circuitSlot, 0, (group.getSize().width - 18) / 2, 20, - !ConfigHolder.INSTANCE.machines.ghostCircuit, !ConfigHolder.INSTANCE.machines.ghostCircuit) - .setBackground(new GuiTextureGroup(GuiTextures.SLOT, GuiTextures.INT_CIRCUIT_OVERLAY))); - if (ConfigHolder.INSTANCE.machines.ghostCircuit) { - group.addWidget(new ButtonWidget((group.getSize().width - 18) / 2, 20, 18, 18, IGuiTexture.EMPTY, - clickData -> { - if (!clickData.isRemote) { - circuitSlot.setStackInSlot(0, ItemStack.EMPTY); - } - })); - } - int idx = 0; - for (int x = 0; x <= 2; x++) { - for (int y = 0; y <= 8; y++) { - int finalIdx = idx; - group.addWidget(new ButtonWidget(5 + (18 * y), 48 + (18 * x), 18, 18, - new GuiTextureGroup(GuiTextures.SLOT, - new ItemStackTexture(IntCircuitBehaviour.stack(finalIdx)).scale(16f / 18)), - clickData -> { - if (!clickData.isRemote) { - ItemStack stack = circuitSlot.getStackInSlot(0).copy(); - if (IntCircuitBehaviour.isIntegratedCircuit(stack)) { - IntCircuitBehaviour.setCircuitConfiguration(stack, finalIdx); - circuitSlot.setStackInSlot(0, stack); - } else if (ConfigHolder.INSTANCE.machines.ghostCircuit) { - circuitSlot.setStackInSlot(0, IntCircuitBehaviour.stack(finalIdx)); - } - } - })); - idx++; - } - } - for (int x = 0; x <= 5; x++) { - int finalIdx = x + 27; - group.addWidget(new ButtonWidget(5 + (18 * x), 102, 18, 18, - new GuiTextureGroup(GuiTextures.SLOT, - new ItemStackTexture(IntCircuitBehaviour.stack(finalIdx)).scale(16f / 18)), - clickData -> { - if (!clickData.isRemote) { - ItemStack stack = circuitSlot.getStackInSlot(0).copy(); - if (IntCircuitBehaviour.isIntegratedCircuit(stack)) { - IntCircuitBehaviour.setCircuitConfiguration(stack, finalIdx); - circuitSlot.setStackInSlot(0, stack); - } else if (ConfigHolder.INSTANCE.machines.ghostCircuit) { - circuitSlot.setStackInSlot(0, IntCircuitBehaviour.stack(finalIdx)); - } - } - })); - } - return group; - } - - @Override - public List getTooltips() { - var list = new ArrayList<>(IFancyConfigurator.super.getTooltips()); - list.addAll(Arrays.asList(LangUtil.getMultiLang("gtceu.gui.configurator_slot.tooltip"))); - return list; - } - - private int getNextValue(boolean increment) { - int currentValue = IntCircuitBehaviour.getCircuitConfiguration(circuitSlot.getStackInSlot(0)); - if (increment) { - // if at max, loop around to no circuit - if (currentValue == IntCircuitBehaviour.CIRCUIT_MAX) { - return 0; - } - // if at no circuit, skip 0 and return 1 - if (this.circuitSlot.getStackInSlot(0).isEmpty()) { - return 1; - } - // normal case: increment by 1 - return currentValue + 1; - } else { - // if at no circuit, loop around to max - if (this.circuitSlot.getStackInSlot(0).isEmpty() || - (currentValue == 0 && !ConfigHolder.INSTANCE.machines.ghostCircuit)) { - return IntCircuitBehaviour.CIRCUIT_MAX; - } - // if at 1, skip 0 and return no circuit - if (currentValue == 1 && ConfigHolder.INSTANCE.machines.ghostCircuit) { - return -1; - } - // normal case: decrement by 1 - return currentValue - 1; - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CombinedDirectionalFancyConfigurator.java b/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CombinedDirectionalFancyConfigurator.java deleted file mode 100644 index c46b0c93dad..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CombinedDirectionalFancyConfigurator.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.fancyconfigurator; - -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.WidgetUtils; -import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; -import com.gregtechceu.gtceu.api.gui.fancy.IFancyUIProvider; -import com.gregtechceu.gtceu.api.gui.widget.directional.CombinedDirectionalConfigurator; -import com.gregtechceu.gtceu.api.gui.widget.directional.IDirectionalConfigHandler; -import com.gregtechceu.gtceu.api.gui.widget.directional.handlers.AutoOutputFluidConfigHandler; -import com.gregtechceu.gtceu.api.gui.widget.directional.handlers.AutoOutputItemConfigHandler; -import com.gregtechceu.gtceu.api.gui.widget.directional.handlers.CoverableConfigHandler; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait; - -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.utils.Size; - -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.network.chat.Component; - -import org.jetbrains.annotations.Nullable; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.function.Function; -import java.util.function.Supplier; - -import javax.annotation.ParametersAreNonnullByDefault; - -@MethodsReturnNonnullByDefault -@ParametersAreNonnullByDefault -public class CombinedDirectionalFancyConfigurator implements IFancyUIProvider { - - private final List> configs; - private final MetaMachine machine; - - public CombinedDirectionalFancyConfigurator(List> configs, - MetaMachine machine) { - this.configs = configs; - this.machine = machine; - } - - @Override - public Widget createMainPage(FancyMachineUIWidget widget) { - Size parentSize = widget.getSize(); - return new CombinedDirectionalConfigurator( - widget, configs.stream().map(Supplier::get).toArray(IDirectionalConfigHandler[]::new), machine, - parentSize.width - 8, - parentSize.height - WidgetUtils.getInventoryHeight(true)); - } - - @Override - public IGuiTexture getTabIcon() { - return GuiTextures.TOOL_COVER_SETTINGS; - } - - @Override - public Component getTitle() { - return Component.translatable("gtceu.gui.directional_setting.title"); - } - - @Override - public List getTabTooltips() { - List tooltip = new ArrayList<>(); - tooltip.add(Component.translatable("gtceu.gui.directional_setting.tab_tooltip")); - return tooltip; - } - - // //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - private static final List>> CONFIG_HANDLERS = new ArrayList<>(); - - static { - // Left side: - CONFIG_HANDLERS.add( - machine -> { - var trait = machine.getTraitHolder().getTrait(AutoOutputTrait.TYPE); - return trait != null && trait.supportsAutoOutputItems() ? - () -> new AutoOutputItemConfigHandler(trait) : null; - }); - CONFIG_HANDLERS.add( - machine -> { - var trait = machine.getTraitHolder().getTrait(AutoOutputTrait.TYPE); - return trait != null && trait.supportsAutoOutputFluids() ? - () -> new AutoOutputFluidConfigHandler(trait) : null; - }); - - // Right side: - CONFIG_HANDLERS.add(machine -> () -> new CoverableConfigHandler(machine.getCoverContainer())); - } - - /** - * To be used by addons for registering their own directional configurations - */ - public static void registerConfigHandler(Function> factory) { - CONFIG_HANDLERS.add(factory); - } - - @Nullable - public static CombinedDirectionalFancyConfigurator of(MetaMachine container, MetaMachine machine) { - var configs = CONFIG_HANDLERS.stream() - .map(handler -> handler.apply(container)) - .filter(Objects::nonNull) - .toList(); - - return configs.isEmpty() ? null : new CombinedDirectionalFancyConfigurator(configs, machine); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/FancyInvConfigurator.java b/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/FancyInvConfigurator.java deleted file mode 100644 index 9d3efb6993b..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/FancyInvConfigurator.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.fancyconfigurator; - -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.fancy.IFancyConfigurator; -import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; -import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; - -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.jei.IngredientIO; - -import net.minecraft.network.chat.Component; - -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; - -import java.util.Collections; -import java.util.List; - -@Accessors(chain = true) -public class FancyInvConfigurator implements IFancyConfigurator { - - private final CustomItemStackHandler inventory; - - @Getter - private final Component title; - - @Getter - @Setter - private List tooltips = Collections.emptyList(); - - public FancyInvConfigurator(CustomItemStackHandler inventory, Component title) { - this.inventory = inventory; - this.title = title; - } - - @Override - public IGuiTexture getIcon() { - return GuiTextures.BUTTON_ITEM_OUTPUT; - } - - @Override - public Widget createConfigurator() { - int rowSize = (int) Math.sqrt(inventory.getSlots()); - int colSize = rowSize; - if (inventory.getSlots() == 8) { - rowSize = 4; - colSize = 2; - } - var group = new WidgetGroup(0, 0, 18 * rowSize + 16, 18 * colSize + 16); - var container = new WidgetGroup(4, 4, 18 * rowSize + 8, 18 * colSize + 8); - int index = 0; - for (int y = 0; y < colSize; y++) { - for (int x = 0; x < rowSize; x++) { - container.addWidget(new SlotWidget(inventory, index++, 4 + x * 18, 4 + y * 18, true, true) - .setBackgroundTexture(GuiTextures.SLOT) - .setIngredientIO(IngredientIO.INPUT)); - } - } - - container.setBackground(GuiTextures.BACKGROUND_INVERSE); - group.addWidget(container); - - return group; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/FancySelectorConfigurator.java b/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/FancySelectorConfigurator.java deleted file mode 100644 index 5b89d526cdc..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/FancySelectorConfigurator.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.fancyconfigurator; - -import com.gregtechceu.gtceu.api.gui.fancy.IFancyConfiguratorButton; -import com.gregtechceu.gtceu.api.gui.widget.EnumSelectorWidget; - -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.util.ClickData; - -import net.minecraft.network.chat.Component; - -import lombok.Setter; -import lombok.experimental.Accessors; - -import java.util.Collections; -import java.util.List; -import java.util.function.Consumer; -import java.util.function.Function; - -public class FancySelectorConfigurator & EnumSelectorWidget.SelectableEnum> - implements IFancyConfiguratorButton { - - private final EnumSelectorWidget widget; - - @Setter - @Accessors(chain = true) - private Function> tooltip = t -> Collections.singletonList(Component.empty()); - - public FancySelectorConfigurator(T[] values, T initialValue, Consumer onChanged) { - this.widget = new EnumSelectorWidget<>(0, 0, 20, 20, values, initialValue, onChanged); - } - - @Override - public IGuiTexture getIcon() { - return widget.getTexture(widget.selected); - } - - @Override - public List getTooltips() { - return this.tooltip.apply(widget.getCurrentValue()); - } - - @Override - public void onClick(ClickData clickData) { - ++widget.selected; - if (widget.selected >= widget.values.size()) { - widget.selected = 0; - } - - widget.buttonWidget.setIndex(widget.selected); - if (widget.onChanged != null) { - widget.onChanged.accept(widget.getCurrentValue()); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/FancyTankConfigurator.java b/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/FancyTankConfigurator.java deleted file mode 100644 index ffde47feb4c..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/FancyTankConfigurator.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.fancyconfigurator; - -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.fancy.IFancyConfigurator; -import com.gregtechceu.gtceu.api.gui.widget.TankWidget; -import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; - -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; - -import net.minecraft.network.chat.Component; - -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; - -import java.util.Collections; -import java.util.List; - -@Accessors(chain = true) -public class FancyTankConfigurator implements IFancyConfigurator { - - private final CustomFluidTank[] tanks; - - @Getter - private final Component title; - - @Getter - @Setter - private List tooltips = Collections.emptyList(); - - public FancyTankConfigurator(CustomFluidTank[] tanks, Component title) { - this.tanks = tanks; - this.title = title; - } - - @Override - public IGuiTexture getIcon() { - return GuiTextures.BUTTON_FLUID_OUTPUT; - } - - @Override - public Widget createConfigurator() { - int rowSize = (int) Math.sqrt(tanks.length); - int colSize = rowSize; - if (tanks.length == 8) { - rowSize = 4; - colSize = 2; - } - - var group = new WidgetGroup(0, 0, 18 * rowSize + 16, 18 * colSize + 16); - var container = new WidgetGroup(4, 4, 18 * rowSize + 8, 18 * colSize + 8); - - int index = 0; - for (int y = 0; y < colSize; y++) { - for (int x = 0; x < rowSize; x++) { - container.addWidget(new TankWidget(tanks[index++], 4 + x * 18, 4 + y * 18, true, true) - .setBackground(GuiTextures.FLUID_SLOT)); - } - } - - container.setBackground(GuiTextures.BACKGROUND_INVERSE); - group.addWidget(container); - - return group; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/MachineModeFancyConfigurator.java b/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/MachineModeFancyConfigurator.java deleted file mode 100644 index ae205e44c95..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/MachineModeFancyConfigurator.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.fancyconfigurator; - -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; -import com.gregtechceu.gtceu.api.gui.fancy.IFancyUIProvider; -import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; -import com.gregtechceu.gtceu.common.data.GTItems; - -import com.lowdragmc.lowdraglib.gui.editor.ColorPattern; -import com.lowdragmc.lowdraglib.gui.texture.*; -import com.lowdragmc.lowdraglib.gui.widget.ButtonWidget; -import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; - -import java.util.ArrayList; -import java.util.List; - -public class MachineModeFancyConfigurator implements IFancyUIProvider { - - protected IRecipeLogicMachine machine; - - public MachineModeFancyConfigurator(IRecipeLogicMachine machine) { - this.machine = machine; - } - - @Override - public Component getTitle() { - return Component.translatable("gtceu.gui.machinemode.title"); - } - - @Override - public IGuiTexture getTabIcon() { - return new ItemStackTexture(GTItems.ROBOT_ARM_LV.get()); - } - - @Override - public Widget createMainPage(FancyMachineUIWidget widget) { - var group = new MachineModeConfigurator(0, 0, 140, 20 * machine.getRecipeTypes().length + 4); - group.setBackground(GuiTextures.BACKGROUND_INVERSE); - for (int i = 0; i < machine.getRecipeTypes().length; i++) { - int finalI = i; - group.addWidget(new ButtonWidget(2, 2 + i * 20, 136, 20, IGuiTexture.EMPTY, - cd -> setActiveRecipeTypeAndUpdateTickSubs(finalI))); - group.addWidget(new ImageWidget(2, 2 + i * 20, 136, 20, - () -> new GuiTextureGroup( - ResourceBorderTexture.BUTTON_COMMON.copy() - .setColor(machine.getActiveRecipeType() == finalI ? ColorPattern.CYAN.color : -1), - new TextTexture(machine.getRecipeTypes()[finalI].registryName.toLanguageKey()).setWidth(136) - .setType(TextTexture.TextType.ROLL)))); - - } - return group; - } - - @Override - public List getTabTooltips() { - List tooltip = new ArrayList<>(); - tooltip.add(Component.translatable("gtceu.gui.machinemode.tab_tooltip")); - return tooltip; - } - - private void setActiveRecipeTypeAndUpdateTickSubs(int activeRecipeType) { - boolean needUpdateTickSubs = !machine.keepSubscribing() && activeRecipeType != machine.getActiveRecipeType(); - machine.setActiveRecipeType(activeRecipeType); - if (needUpdateTickSubs) { - machine.getRecipeLogic().updateTickSubscription(); - } - } - - public class MachineModeConfigurator extends WidgetGroup { - - public MachineModeConfigurator(int x, int y, int width, int height) { - super(x, y, width, height); - } - - @Override - public void writeInitialData(FriendlyByteBuf buffer) { - buffer.writeVarInt(machine.getActiveRecipeType()); - } - - @Override - public void readInitialData(FriendlyByteBuf buffer) { - machine.setActiveRecipeType(buffer.readVarInt()); - } - - @Override - public void detectAndSendChanges() { - this.writeUpdateInfo(0, buf -> buf.writeVarInt(machine.getActiveRecipeType())); - } - - @Override - public void readUpdateInfo(int id, FriendlyByteBuf buffer) { - if (id == 0) { - machine.setActiveRecipeType(buffer.readVarInt()); - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IDropSaveMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IDropSaveMachine.java deleted file mode 100644 index 1f55ee1dfcc..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IDropSaveMachine.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature; - -import net.minecraft.nbt.CompoundTag; - -import org.jetbrains.annotations.MustBeInvokedByOverriders; - -/** - * A machine that can save its contents when dropped. - */ -public interface IDropSaveMachine extends IMachineFeature { - - /** - * Whether save for breaking. - */ - default boolean saveBreak() { - return true; - } - - /** - * Whether save for cloning. - */ - default boolean savePickClone() { - return true; - } - - /** - * Saves the contents of the block entity to a compound tag. - * - * @param tag The tag to save to. - */ - @MustBeInvokedByOverriders - void saveToItem(CompoundTag tag); - - /** - * Loads the contents of the block entity from a compound tag. - */ - @MustBeInvokedByOverriders - void loadFromItem(CompoundTag tag); -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IFancyUIMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IFancyUIMachine.java deleted file mode 100644 index d7dc3b46867..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IFancyUIMachine.java +++ /dev/null @@ -1,152 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature; - -import com.gregtechceu.gtceu.api.capability.IControllable; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.fancy.*; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.fancyconfigurator.CombinedDirectionalFancyConfigurator; -import com.gregtechceu.gtceu.api.machine.fancyconfigurator.MachineModeFancyConfigurator; - -import com.lowdragmc.lowdraglib.gui.modular.ModularUI; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.texture.ItemStackTexture; -import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; -import com.lowdragmc.lowdraglib.gui.widget.SceneWidget; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.utils.BlockInfo; -import com.lowdragmc.lowdraglib.utils.TrackedDummyWorld; - -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.world.entity.player.Player; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.List; - -public interface IFancyUIMachine extends IUIMachine, IFancyUIProvider { - - @Override - default ModularUI createUI(Player entityPlayer) { - return new ModularUI(176, 166, this, entityPlayer).widget(new FancyMachineUIWidget(this, 176, 166)); - } - - /** - * We should not override this method in general, and use {@link IFancyUIMachine#createUIWidget()} instead, - */ - @Override - default Widget createMainPage(FancyMachineUIWidget widget) { - var editableUI = self().getDefinition().getEditableUI(); - if (editableUI != null) { - var template = editableUI.createCustomUI(); - if (template == null) { - template = editableUI.createDefault(); - } - editableUI.setupUI(template, self()); - return template; - } - return createUIWidget(); - } - - /** - * Create the core widget of this machine. - */ - default Widget createUIWidget() { - var group = new WidgetGroup(0, 0, 100, 100); - if (isRemote()) { - group.addWidget(new ImageWidget((100 - 48) / 2, 60, 48, 16, GuiTextures.SCENE)); - TrackedDummyWorld world = new TrackedDummyWorld(); - world.addBlock(BlockPos.ZERO, BlockInfo.fromBlockState(self().getBlockState())); - SceneWidget sceneWidget = new SceneWidget(0, 0, 100, 100, world) { - - @Override - @OnlyIn(Dist.CLIENT) - public void drawInBackground(@NotNull GuiGraphics graphics, int mouseX, int mouseY, - float partialTicks) { - // AUTO ROTATION - if (renderer != null) { - this.rotationPitch = (partialTicks + getGui().getTickCount()) * 2; - renderer.setCameraLookAt(this.center, 0.1f, Math.toRadians(this.rotationPitch), - Math.toRadians(this.rotationYaw)); - } - super.drawInBackground(graphics, mouseX, mouseY, partialTicks); - } - }; - sceneWidget.useOrtho(true) - .setOrthoRange(0.5f) - .setScalable(false) - .setDraggable(false) - .setRenderFacing(false) - .setRenderSelect(false); - sceneWidget.getRenderer().setFov(30); - group.addWidget(sceneWidget); - sceneWidget.setRenderedCore(List.of(BlockPos.ZERO), null); - } - return group; - } - - @Override - default IGuiTexture getTabIcon() { - return new ItemStackTexture(self().getDefinition().getItem()); - } - - @Override - default void attachSideTabs(TabsWidget sideTabs) { - sideTabs.setMainTab(this); - - if (this instanceof IRecipeLogicMachine rLMachine && rLMachine.getRecipeTypes().length > 1) { - sideTabs.attachSubTab(new MachineModeFancyConfigurator(rLMachine)); - } - var directionalConfigurator = CombinedDirectionalFancyConfigurator.of(self(), self()); - if (directionalConfigurator != null) - sideTabs.attachSubTab(directionalConfigurator); - } - - @Override - default void attachConfigurators(ConfiguratorPanel configuratorPanel) { - if (this instanceof IControllable controllable) { - configuratorPanel.attachConfigurators(new IFancyConfiguratorButton.Toggle( - GuiTextures.BUTTON_POWER.getSubTexture(0, 0, 1, 0.5), - GuiTextures.BUTTON_POWER.getSubTexture(0, 0.5, 1, 0.5), - controllable::isWorkingEnabled, (clickData, pressed) -> controllable.setWorkingEnabled(pressed)) - .setTooltipsSupplier(pressed -> List.of( - Component.translatable( - pressed ? "behaviour.soft_hammer.enabled" : "behaviour.soft_hammer.disabled")))); - } - if (this instanceof MetaMachine machine) { - for (var direction : Direction.values()) { - if (machine.getCoverContainer().hasCover(direction)) { - var configurator = machine.getCoverContainer().getCoverAtSide(direction).getConfigurator(); - if (configurator != null) - configuratorPanel.attachConfigurators(configurator); - } - } - } - } - - @Override - default void attachTooltips(TooltipsPanel tooltipsPanel) { - tooltipsPanel.attachTooltips(self()); - self().getTraitHolder().getAllTraits().stream().filter(IFancyTooltip.class::isInstance) - .map(IFancyTooltip.class::cast) - .forEach(tooltipsPanel::attachTooltips); - } - - @Override - default List getTabTooltips() { - var list = new ArrayList(); - list.add(Component.translatable(self().getDefinition().getDescriptionId())); - return list; - } - - @Override - default Component getTitle() { - return Component.translatable(self().getDefinition().getDescriptionId()); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IHasCircuitSlot.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IHasCircuitSlot.java deleted file mode 100644 index e77804a9a98..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IHasCircuitSlot.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature; - -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; - -public interface IHasCircuitSlot { - - default boolean isCircuitSlotEnabled() { - return true; - } - - NotifiableItemStackHandler getCircuitInventory(); -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMachineFeature.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMachineFeature.java index 518cd573cfb..9a0dd7078ae 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMachineFeature.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMachineFeature.java @@ -1,8 +1,9 @@ package com.gregtechceu.gtceu.api.machine.feature; +import com.gregtechceu.gtceu.api.blockentity.IGregtechBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; -public interface IMachineFeature { +public interface IMachineFeature extends IGregtechBlockEntity { default MetaMachine self() { return (MetaMachine) this; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMuiMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMuiMachine.java new file mode 100644 index 00000000000..5e59129390e --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMuiMachine.java @@ -0,0 +1,59 @@ +package com.gregtechceu.gtceu.api.machine.feature; + +import com.gregtechceu.gtceu.api.machine.mui.MachineUIPanelBuilder; +import com.gregtechceu.gtceu.api.mui.GTGuiScreen; +import com.gregtechceu.gtceu.api.mui.factory.MachineUIFactory; + +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import brachy.modularui.api.IUIHolder; +import brachy.modularui.factory.PosGuiData; +import brachy.modularui.screen.ModularPanel; +import brachy.modularui.screen.ModularScreen; +import brachy.modularui.screen.UISettings; +import brachy.modularui.value.sync.PanelSyncManager; +import brachy.modularui.widget.ParentWidget; + +public interface IMuiMachine extends IUIHolder, IMachineFeature { + + @Override + default ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { + var panelBuilder = getPanelBuilder(data, syncManager, settings); + panelBuilder.mainContents(parent -> buildMainUI(parent, data, syncManager, settings)); + return panelBuilder.build(syncManager, settings); + } + + default MachineUIPanelBuilder getPanelBuilder(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { + return MachineUIPanelBuilder.panelBuilder(self()); + } + + default void buildMainUI(ParentWidget mainWidget, PosGuiData guiData, PanelSyncManager syncManager, + UISettings settings) {} + + default boolean shouldOpenUI(Player player, InteractionHand hand, BlockHitResult hit) { + return true; + } + + @Override + @OnlyIn(Dist.CLIENT) + default ModularScreen createScreen(PosGuiData data, ModularPanel mainPanel) { + return new GTGuiScreen(mainPanel); + } + + default InteractionResult tryToOpenUI(Player player, InteractionHand hand, BlockHitResult hit) { + if (this.shouldOpenUI(player, hand, hit)) { + if (player instanceof ServerPlayer serverPlayer) { + MachineUIFactory.INSTANCE.open(serverPlayer, this); + } + return InteractionResult.sidedSuccess(player.level().isClientSide); + } else { + return InteractionResult.PASS; + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IRecipeLogicMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IRecipeLogicMachine.java index dc42605e28d..44bc994dbcd 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IRecipeLogicMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IRecipeLogicMachine.java @@ -2,7 +2,8 @@ import com.gregtechceu.gtceu.api.capability.IWorkable; import com.gregtechceu.gtceu.api.capability.recipe.IRecipeCapabilityHolder; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.feature.IRecipeLogicModifierTrait; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; @@ -30,11 +31,6 @@ public interface IRecipeLogicMachine extends IRecipeCapabilityHolder, IMachineFe void setActiveRecipeType(int type); - /** - * Called when recipe logic status changed - */ - default void notifyStatusChanged(RecipeLogic.Status oldStatus, RecipeLogic.Status newStatus) {} - /** * Recipe logic */ @@ -54,37 +50,65 @@ default GTRecipe fullModifyRecipe(GTRecipe recipe) { */ @Nullable default GTRecipe doModifyRecipe(GTRecipe recipe) { - return self().getDefinition().getRecipeModifier().applyModifier(self(), recipe); + recipe = self().getDefinition().getRecipeModifier().applyModifier(self(), recipe); + if (recipe == null) return null; + + for (var rlTrait : self().getTraitHolder().getTraitsByInterface(IRecipeLogicModifierTrait.class)) { + recipe = rlTrait.modifyRecipe(recipe); + if (recipe == null) return null; + } + return recipe; } /** - * Whether the recipe logic should keep subscribing tick logic when no recipe is available after one cycle. - * if false. you should call {@link RecipeLogic#updateTickSubscription()} manually later to active recipe logic - * again. + * Whether the recipe logic should work or waiting for next {@link RecipeLogic#updateTickSubscription()}. */ - default boolean keepSubscribing() { + default boolean isRecipeLogicAvailable() { return true; } /** - * Whether the recipe logic should work or waiting for next {@link RecipeLogic#updateTickSubscription()}. + * Called when the recipe logic status changes + * + * @param oldStatus Old recipe logic status + * @param newStatus New recipe logic status */ - default boolean isRecipeLogicAvailable() { - return true; + default void recipeLogicStatusChanged(RecipeLogic.Status oldStatus, RecipeLogic.Status newStatus) { + for (var rlTrait : self().getTraitHolder().getTraitsByInterface(IRecipeLogicModifierTrait.class)) { + rlTrait.recipeLogicStatusChanged(oldStatus, newStatus); + } } /** - * Called in {@link RecipeLogic#setupRecipe(GTRecipe)} ()} + * Called when a recipe is about to be run, just before inputs are consumed. + * + * @return false to cancel the recipe, true to continue + * + * @see RecipeLogic#setupRecipe(GTRecipe) */ default boolean beforeWorking(@Nullable GTRecipe recipe) { - return self().getDefinition().getBeforeWorking().test(this, recipe); + if (!self().getDefinition().getBeforeWorking().test(this, recipe)) return false; + + for (var rlTrait : self().getTraitHolder().getTraitsByInterface(IRecipeLogicModifierTrait.class)) { + if (!rlTrait.beforeWorking(recipe)) return false; + } + return true; } /** - * Called per tick in {@link RecipeLogic#handleRecipeWorking()} + * Called every tick while the recipe is working. + * + * @return false to interrupt and suspend the recipe, true to continue working + * + * @see RecipeLogic#handleRecipeWorking() */ default boolean onWorking() { - return self().getDefinition().getOnWorking().test(this); + if (!self().getDefinition().getOnWorking().test(this)) return false; + + for (var rlTrait : self().getTraitHolder().getTraitsByInterface(IRecipeLogicModifierTrait.class)) { + if (!rlTrait.onWorking()) return false; + } + return true; } /** @@ -95,29 +119,15 @@ default void onWaiting() { } /** - * Called in {@link RecipeLogic#onRecipeFinish()} before outputs are produced + * Called when the recipe finishes, before outputs are produced. + * + * @see RecipeLogic#onRecipeFinish() */ default void afterWorking() { self().getDefinition().getAfterWorking().accept(this); - } - - /** - * Whether progress decrease when machine is waiting for pertick ingredients. (e.g. lack of EU) - */ - default boolean regressWhenWaiting() { - return self().getDefinition().isRegressWhenWaiting(); - } - - /** - * Always try {@link IRecipeLogicMachine#fullModifyRecipe(GTRecipe)} before setting up recipe. - * - * @return true - will map {@link RecipeLogic#lastOriginRecipe} to the latest recipe for next round when finishing. - * false - keep using the {@link RecipeLogic#lastRecipe}, which is already modified. - */ - default boolean alwaysTryModifyRecipe() { - // make it *always* do overclock and parallel so that the machine doesn't get stuck running a lower-tier recipe - // in any possible scenario. - return true; + for (var rlTrait : self().getTraitHolder().getTraitsByInterface(IRecipeLogicModifierTrait.class)) { + rlTrait.afterWorking(); + } } default boolean shouldWorkingPlaySound() { @@ -133,6 +143,14 @@ default long getDisplayRecipeVoltage() { return -1; } + /** + * Max output EU/t of a generator + * is negative when it is not a generator + */ + default long getDisplayGeneratorPower() { + return -1; + } + ////////////////////////////////////// // ******* IWorkable ********// ////////////////////////////////////// diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IUIMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IUIMachine.java deleted file mode 100644 index 074723db931..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IUIMachine.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature; - -import com.gregtechceu.gtceu.api.gui.factory.MachineUIFactory; - -import com.lowdragmc.lowdraglib.gui.modular.IUIHolder; - -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.phys.BlockHitResult; - -/** - * A machine that has gui. can be opened via right click. - */ -public interface IUIMachine extends IUIHolder, IMachineFeature { - - default boolean shouldOpenUI(Player player, InteractionHand hand, BlockHitResult hit) { - return true; - } - - default InteractionResult tryToOpenUI(Player player, InteractionHand hand, BlockHitResult hit) { - if (this.shouldOpenUI(player, hand, hit)) { - if (player instanceof ServerPlayer serverPlayer) { - MachineUIFactory.INSTANCE.openUI(self(), serverPlayer); - } - } else { - return InteractionResult.PASS; - } - return InteractionResult.sidedSuccess(player.level().isClientSide); - } - - @Override - default boolean isInvalid() { - return self().isRemoved(); - } - - @Override - default boolean isRemote() { - return self().isRemote(); - } - - @Override - default void markAsDirty() {}; -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IVoidable.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IVoidable.java index 72e6f1941ef..2b77a95e04a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IVoidable.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IVoidable.java @@ -3,21 +3,13 @@ import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.fancy.ConfiguratorPanel; -import com.gregtechceu.gtceu.api.gui.widget.EnumSelectorWidget; -import com.gregtechceu.gtceu.api.machine.fancyconfigurator.FancySelectorConfigurator; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; - -import net.minecraft.network.chat.Component; import net.minecraft.util.StringRepresentable; import it.unimi.dsi.fastutil.objects.Reference2IntMap; import lombok.Getter; import org.jetbrains.annotations.NotNull; -import java.util.List; import java.util.function.Predicate; public interface IVoidable extends IMachineFeature { @@ -37,15 +29,7 @@ default VoidingMode getVoidingMode() { return VoidingMode.VOID_NONE; } - static void attachConfigurators(ConfiguratorPanel configuratorPanel, IVoidable controller) { - configuratorPanel - .attachConfigurators(new FancySelectorConfigurator<>(VoidingMode.VALUES, controller.getVoidingMode(), - controller::setVoidingMode) - .setTooltip(m -> List.of(Component.translatable("gtceu.gui.multiblock.voiding_mode"), - Component.translatable(m.localeName)))); - } - - enum VoidingMode implements StringRepresentable, EnumSelectorWidget.SelectableEnum { + enum VoidingMode implements StringRepresentable { VOID_NONE("gtceu.gui.no_voiding", cap -> false), VOID_ITEMS("gtceu.gui.item_voiding", cap -> cap == ItemRecipeCapability.CAP), @@ -55,30 +39,22 @@ enum VoidingMode implements StringRepresentable, EnumSelectorWidget.SelectableEn public static final VoidingMode[] VALUES = values(); - private final String localeName; @Getter - private final IGuiTexture icon; + private final String tooltip; private final Predicate> canVoid; VoidingMode(String name, Predicate> canVoid) { - this.localeName = name; + this.tooltip = name; this.canVoid = canVoid; - this.icon = GuiTextures.BUTTON_VOID_MULTIBLOCK.getSubTexture(0, ordinal() * 0.25, 1, 0.25); } public boolean canVoid(RecipeCapability capability) { return canVoid.test(capability); } - @NotNull - @Override - public String getSerializedName() { - return localeName; - } - @Override - public @NotNull String getTooltip() { - return localeName; + public @NotNull String getSerializedName() { + return tooltip; } } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IDisplayUIMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IDisplayUIMachine.java deleted file mode 100644 index d6bfdb6b5fa..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IDisplayUIMachine.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature.multiblock; - -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.UITemplate; -import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; -import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; - -import com.lowdragmc.lowdraglib.gui.modular.ModularUI; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.util.ClickData; -import com.lowdragmc.lowdraglib.gui.widget.ComponentPanelWidget; -import com.lowdragmc.lowdraglib.gui.widget.DraggableScrollableWidgetGroup; -import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; - -import net.minecraft.network.chat.Component; -import net.minecraft.world.entity.player.Player; - -import java.util.List; - -public interface IDisplayUIMachine extends IUIMachine { - - default void addDisplayText(List textList) { - for (var part : self().getParts()) { - part.addMultiText(textList); - } - } - - default void handleDisplayClick(String componentData, ClickData clickData) {} - - default IGuiTexture getScreenTexture() { - return GuiTextures.DISPLAY; - } - - @Override - default ModularUI createUI(Player entityPlayer) { - var screen = new DraggableScrollableWidgetGroup(7, 4, 162, 121).setBackground(getScreenTexture()); - screen.addWidget(new LabelWidget(4, 5, self().getBlockState().getBlock().getDescriptionId())); - screen.addWidget(new ComponentPanelWidget(4, 17, this::addDisplayText) - .textSupplier(this.self().getLevel().isClientSide ? null : this::addDisplayText) - .setMaxWidthLimit(150) - .clickHandler(this::handleDisplayClick)); - return new ModularUI(176, 216, this, entityPlayer) - .background(GuiTextures.BACKGROUND) - .widget(screen) - .widget(UITemplate.bindPlayerInventory(entityPlayer.getInventory(), GuiTextures.SLOT, 7, 134, true)); - } - - @Override - default MultiblockControllerMachine self() { - return (MultiblockControllerMachine) this; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IDistinctPart.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IDistinctPart.java index 1c1947d7ed3..1f581f47dd3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IDistinctPart.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IDistinctPart.java @@ -1,36 +1,10 @@ package com.gregtechceu.gtceu.api.machine.feature.multiblock; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.fancy.ConfiguratorPanel; -import com.gregtechceu.gtceu.api.gui.fancy.IFancyConfiguratorButton; - -import net.minecraft.ChatFormatting; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.Style; - -import java.util.List; - -public interface IDistinctPart extends IMultiPart { +public interface IDistinctPart { boolean isDistinct(); void setDistinct(boolean isDistinct); - @Override - default void attachConfigurators(ConfiguratorPanel configuratorPanel) { - superAttachConfigurators(configuratorPanel); - configuratorPanel.attachConfigurators(new IFancyConfiguratorButton.Toggle( - GuiTextures.BUTTON_DISTINCT_BUSES.getSubTexture(0, 0.5, 1, 0.5), - GuiTextures.BUTTON_DISTINCT_BUSES.getSubTexture(0, 0, 1, 0.5), - this::isDistinct, (clickData, pressed) -> setDistinct(pressed)) - .setTooltipsSupplier(pressed -> List.of( - Component.translatable("gtceu.multiblock.universal.distinct") - .setStyle(Style.EMPTY.withColor(ChatFormatting.YELLOW)) - .append(Component.translatable(pressed ? "gtceu.multiblock.universal.distinct.yes" : - "gtceu.multiblock.universal.distinct.no"))))); - } - - default void superAttachConfigurators(ConfiguratorPanel configuratorPanel) { - IMultiPart.super.attachConfigurators(configuratorPanel); - } + boolean supportsDistinct(); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMaintenanceMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMaintenanceMachine.java deleted file mode 100644 index 3216cc9850e..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMaintenanceMachine.java +++ /dev/null @@ -1,191 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature.multiblock; - -import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.fancy.IFancyTooltip; -import com.gregtechceu.gtceu.api.gui.fancy.TooltipsPanel; -import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; -import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; -import com.gregtechceu.gtceu.api.recipe.GTRecipe; -import com.gregtechceu.gtceu.config.ConfigHolder; - -import net.minecraft.ChatFormatting; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.Style; -import net.minecraft.world.level.block.state.properties.BooleanProperty; - -import java.util.ArrayList; - -public interface IMaintenanceMachine extends IMultiPart { - - BooleanProperty MAINTENANCE_TAPED_PROPERTY = GTMachineModelProperties.IS_TAPED; - byte ALL_PROBLEMS = 0; - byte NO_PROBLEMS = 0b111111; - - /** - * @return true if this is a Full-Auto Maintenance Hatch, false otherwise. - */ - boolean isFullAuto(); - - /** - * Sets this Maintenance Hatch as being duct taped - * - * @param isTaped is the state of the hatch being taped or not - */ - void setTaped(boolean isTaped); - - boolean isTaped(); - - /** - * Initial problems of the maintenance. - */ - byte startProblems(); - - /** - * This value stores whether each of the 5 maintenance problems have been fixed. - * A value of 0 means the problem is not fixed, else it is fixed - * Value positions correspond to the following from left to right: 0=Wrench, 1=Screwdriver, 2=Soft Mallet, 3=Hard - * Hammer, 4=Wire Cutter, 5=Crowbar - */ - byte getMaintenanceProblems(); - - void setMaintenanceProblems(byte problems); - - /** - * Time is how long it is active and is used to determine how often problems occur. - * See {@link IMaintenanceMachine#calculateTime(int)} for the trigger point. - */ - int getTimeActive(); - - void setTimeActive(int time); - - /** - * Duration modifier for recipe. {@link IMaintenanceMachine#modifyRecipe(GTRecipe)} - * It's configurable in the Configurable Maintenance Part. - */ - default float getDurationMultiplier() { - return 1; - } - - /** - * Higher {@link IMaintenanceMachine#getDurationMultiplier()} refers to a lower time multiplier. - * The lower time multiplier means more likely causing problems. - */ - default float getTimeMultiplier() { - return 1; - } - - @Override - default boolean canShared() { - return false; - } - - /** - * Used to calculate whether a maintenance problem should happen based on machine time active - * - * @param duration in ticks to add to the counter of active time - */ - default void calculateMaintenance(IMaintenanceMachine maintenanceMachine, int duration) { - if (!ConfigHolder.INSTANCE.machines.enableMaintenance || maintenanceMachine.isFullAuto()) { - return; - } - - setTimeActive(getTimeActive() + duration); - float rate = ConfigHolder.INSTANCE.machines.maintenanceCheckRate / maintenanceMachine.getTimeMultiplier(); - if (getTimeActive() >= rate) { - setTimeActive(0); - if (GTValues.RNG.nextInt(6000) == 0) { - causeRandomMaintenanceProblems(); - maintenanceMachine.setTaped(false); - } - } - } - - /** - * Used to calculate whether a maintenance problem should happen based on machine time active - */ - default void calculateMaintenance(IMaintenanceMachine maintenanceMachine) { - calculateMaintenance(maintenanceMachine, 1); - } - - default int getNumMaintenanceProblems() { - return ConfigHolder.INSTANCE.machines.enableMaintenance ? 6 - Integer.bitCount(getMaintenanceProblems()) : 0; - } - - default boolean hasMaintenanceProblems() { - return ConfigHolder.INSTANCE.machines.enableMaintenance && this.getMaintenanceProblems() < 63; - } - - default void setMaintenanceFixed(int index) { - setMaintenanceProblems((byte) (getMaintenanceProblems() | (byte) (1 << index))); - } - - default void causeRandomMaintenanceProblems() { - setMaintenanceProblems( - (byte) (getMaintenanceProblems() & (byte) ~(1 << GTValues.RNG.nextInt(6)))); - } - - @Override - default boolean onWorking(IWorkableMultiController controller) { - calculateMaintenance(this); - if (hasMaintenanceProblems()) { - controller.getRecipeLogic().markLastRecipeDirty(); - } - return true; - } - - @Override - default GTRecipe modifyRecipe(GTRecipe recipe) { - if (ConfigHolder.INSTANCE.machines.enableMaintenance) { - if (hasMaintenanceProblems()) { - return null; - } - var durationMultiplier = getDurationMultiplier(); - if (durationMultiplier != 1) { - recipe = recipe.copy(); - recipe.duration = (int) (recipe.duration * durationMultiplier); - } - } - return recipe; - } - - ////////////////////////////////////// - // ******* FANCY GUI ********// - ////////////////////////////////////// - - @Override - default void attachFancyTooltipsToController(MultiblockControllerMachine controller, TooltipsPanel tooltipsPanel) { - attachTooltips(tooltipsPanel); - } - - @Override - default void attachTooltips(TooltipsPanel tooltipsPanel) { - if (ConfigHolder.INSTANCE.machines.enableMaintenance) { - tooltipsPanel.attachTooltips(new IFancyTooltip.Basic(() -> GuiTextures.MAINTENANCE_ICON, () -> { - var tooltips = new ArrayList(); - tooltips.add(Component.translatable("gtceu.multiblock.universal.has_problems_header") - .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); - - if ((getMaintenanceProblems() & 1) == 0) - tooltips.add(Component.translatable("gtceu.multiblock.universal.problem.wrench")); - - if (((getMaintenanceProblems() >> 1) & 1) == 0) - tooltips.add(Component.translatable("gtceu.multiblock.universal.problem.screwdriver")); - - if (((getMaintenanceProblems() >> 2) & 1) == 0) - tooltips.add(Component.translatable("gtceu.multiblock.universal.problem.soft_mallet")); - - if (((getMaintenanceProblems() >> 3) & 1) == 0) - tooltips.add(Component.translatable("gtceu.multiblock.universal.problem.hard_hammer")); - - if (((getMaintenanceProblems() >> 4) & 1) == 0) - tooltips.add(Component.translatable("gtceu.multiblock.universal.problem.wire_cutter")); - - if (((getMaintenanceProblems() >> 5) & 1) == 0) - tooltips.add(Component.translatable("gtceu.multiblock.universal.problem.crowbar")); - - return tooltips; - }, this::hasMaintenanceProblems, () -> null)); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMultiPart.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMultiPart.java deleted file mode 100644 index ec75796b409..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMultiPart.java +++ /dev/null @@ -1,152 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature.multiblock; - -import com.gregtechceu.gtceu.api.gui.fancy.TooltipsPanel; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineFeature; -import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; -import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; -import com.gregtechceu.gtceu.api.recipe.GTRecipe; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.world.level.BlockAndTintGetter; -import net.minecraft.world.level.block.state.BlockState; - -import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.UnmodifiableView; - -import java.util.List; -import java.util.SortedSet; - -public interface IMultiPart extends IMachineFeature, IFancyUIMachine { - - /** - * @return If this multi part can be shared between multiple multiblocks. - */ - default boolean canShared() { - return true; - } - - /** - * If this multi part belongs to a controller at the given position - * - * @param controllerPos Controller position - * @return If this multi part belongs to a controller at the given position - */ - boolean hasController(BlockPos controllerPos); - - /** - * @return If this multi part belongs to a formed multiblock. - */ - boolean isFormed(); - - /** - * Gets all controllers this multi part belongs to - * - * @return An unmodifiable set containing the controllers. - */ - @UnmodifiableView - SortedSet getControllers(); - - /** - * Called when this part is removed from a multiblock. - * - * @param controller The controller which this part has been removed from. - */ - void removedFromController(MultiblockControllerMachine controller); - - /** - * Called when this part is added to a multiblock. - * - * @param controller The controller which this part has been added to - */ - void addedToController(MultiblockControllerMachine controller); - - /** - * Get all available traits for recipe logic. - */ - List getRecipeHandlers(); - - /** - * If this part's base model can be replaced by controller when it is formed. - */ - default boolean replacePartModelWhenFormed() { - return true; - } - - /** - * Called to get block appearance when this multi part is in a formed multiblock. - * - * @see MetaMachine#getBlockAppearance(BlockState, BlockAndTintGetter, BlockPos, Direction, BlockState, BlockPos) - */ - @Nullable - default BlockState getFormedAppearance(BlockState sourceState, BlockPos sourcePos, Direction side) { - for (MultiblockControllerMachine controller : getControllers()) { - var appearance = controller.getPartAppearance(this, side, sourceState, sourcePos); - if (appearance != null) return appearance; - } - return null; - } - - /** - * Called per tick in {@link RecipeLogic#handleRecipeWorking()} - */ - default boolean onWorking(IWorkableMultiController controller) { - return true; - } - - /** - * Called per tick in {@link RecipeLogic#handleRecipeWorking()} - */ - default boolean onWaiting(IWorkableMultiController controller) { - return true; - } - - /** - * Called in {@link WorkableMultiblockMachine#setWorkingEnabled(boolean)} - */ - default boolean onPaused(IWorkableMultiController controller) { - return true; - } - - /** - * Called in {@link RecipeLogic#onRecipeFinish()} before outputs are produced - */ - default boolean afterWorking(IWorkableMultiController controller) { - return true; - } - - /** - * Called in {@link RecipeLogic#setupRecipe(GTRecipe)} - */ - default boolean beforeWorking(IWorkableMultiController controller) { - return true; - } - - /** - * Override it to modify recipe on the fly e.g. applying overclock, change chance, etc - * - * @param recipe recipe from detected from GTRecipeType - * @return modified recipe. - * null -- this recipe is unavailable - */ - default GTRecipe modifyRecipe(GTRecipe recipe) { - return recipe; - } - - /** - * Add text to the multiblock's screen. - * - * @param textList the text list to add to. - */ - default void addMultiText(List textList) {} - - /** - * Attach part's tooltips to the controller. - */ - default void attachFancyTooltipsToController(MultiblockControllerMachine controller, TooltipsPanel tooltipsPanel) {} -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IWorkableMultiController.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IWorkableMultiController.java deleted file mode 100644 index d2fa20e8ba0..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IWorkableMultiController.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature.multiblock; - -import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; -import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; - -public interface IWorkableMultiController extends IRecipeLogicMachine { - - MultiblockControllerMachine self(); -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/mui/MachineUIPanel.java b/src/main/java/com/gregtechceu/gtceu/api/machine/mui/MachineUIPanel.java new file mode 100644 index 00000000000..bda1af3aa65 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/mui/MachineUIPanel.java @@ -0,0 +1,98 @@ +package com.gregtechceu.gtceu.api.machine.mui; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; +import com.gregtechceu.gtceu.common.mui.GTMuiWidgets; + +import brachy.modularui.api.drawable.IDrawable; +import brachy.modularui.drawable.UITexture; +import brachy.modularui.screen.ModularPanel; +import brachy.modularui.screen.UISettings; +import brachy.modularui.theme.ThemeAPI; +import brachy.modularui.utils.Alignment; +import brachy.modularui.widget.ParentWidget; +import brachy.modularui.widgets.SlotGroupWidget; +import brachy.modularui.widgets.layout.Flow; +import lombok.Getter; + +public class MachineUIPanel extends ModularPanel { + + public static final int DEFAULT_CONTENT_WIDTH = 169; + public static final int DEFAULT_CONTENT_HEIGHT = 77; + + @Getter + protected final Flow leftConfiguratorPanel, rightConfiguratorPanel; + @Getter + protected final ParentWidget mainContents; + + public MachineUIPanel(MetaMachine machine, UISettings settings, boolean attachPlayerInventory, + boolean addTitleBar, boolean drawGTLogo, UITexture gtLogoTexture) { + super(machine.getDefinition().getId().getPath()); + + UITexture themeBackground = null; + if (!machine.getDefinition().getThemeId().equals(ThemeAPI.DEFAULT_ID)) { + themeBackground = (UITexture) ThemeAPI.INSTANCE.getTheme(machine.getDefinition().getThemeId()) + .getPanelTheme() + .theme().getBackground(); + } + if (themeBackground == null) { + themeBackground = (UITexture) ThemeAPI.INSTANCE.getTheme(settings.getTheme()).getPanelTheme() + .theme().getBackground(); + } + + if (themeBackground == null) themeBackground = GTGuiTextures.BACKGROUND; + leftConfiguratorPanel = Flow.col() + .coverChildren() + .rightRel(1.0f) + .reverseLayout(true) + .padding(4, 2, 4, 4) + .bottom(16) + .crossAxisAlignment(Alignment.CrossAxis.CENTER) + .childPadding(2) + .excludeAreaInRecipeViewer() + .background(themeBackground.getSubArea(0f, 0f, 0.75f, 1.0f)) + .setEnabledIf(f -> !f.getChildren().isEmpty()) + .decoration(); + + rightConfiguratorPanel = Flow.col() + .coverChildren() + .leftRel(1.0f) + .reverseLayout(true) + .padding(2, 4, 4, 4) + .bottom(16) + .crossAxisAlignment(Alignment.CrossAxis.CENTER) + .childPadding(2) + .excludeAreaInRecipeViewer() + .background(themeBackground.getSubArea(0.25f, 0f, 1.0f, 1.0f)) + .setEnabledIf(f -> !f.getChildren().isEmpty()) + .decoration(); + + Flow panelContents = Flow.col().coverChildren(); + panelContents.margin(4); + mainContents = new ParentWidget<>().coverChildren(DEFAULT_CONTENT_WIDTH, DEFAULT_CONTENT_HEIGHT); + + panelContents.child(mainContents); + + if (attachPlayerInventory) { + panelContents.childPadding(2); + var inventory = SlotGroupWidget.playerInventory((index, slot) -> slot) + .marginTop(1) + .marginBottom(3); + panelContents.child(inventory); + } + + if (addTitleBar) { + child(GTMuiWidgets.createTitleBar(machine.getDefinition(), 172).decoration()); + } + + if (drawGTLogo) { + child(new IDrawable.DrawableWidget(gtLogoTexture) + .right(7).bottom(7 + (attachPlayerInventory ? 78 : 0)).decoration()); + } + + child(leftConfiguratorPanel); + child(rightConfiguratorPanel); + child(panelContents); + coverChildren(); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/mui/MachineUIPanelBuilder.java b/src/main/java/com/gregtechceu/gtceu/api/machine/mui/MachineUIPanelBuilder.java new file mode 100644 index 00000000000..bbfb36ddbd6 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/mui/MachineUIPanelBuilder.java @@ -0,0 +1,174 @@ +package com.gregtechceu.gtceu.api.machine.mui; + +import com.gregtechceu.gtceu.api.capability.IControllable; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.feature.IVoidable; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDistinctPart; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.steam.SimpleSteamMachine; +import com.gregtechceu.gtceu.api.machine.trait.feature.IAttachConfiguratorsTrait; +import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifierList; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; +import com.gregtechceu.gtceu.common.mui.GTMuiWidgets; +import com.gregtechceu.gtceu.common.mui.widgets.SteamDialWidget; +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import net.minecraft.network.chat.Component; + +import brachy.modularui.drawable.ItemDrawable; +import brachy.modularui.drawable.UITexture; +import brachy.modularui.screen.UISettings; +import brachy.modularui.utils.Color; +import brachy.modularui.value.sync.DoubleSyncValue; +import brachy.modularui.value.sync.IntSyncValue; +import brachy.modularui.value.sync.PanelSyncManager; +import brachy.modularui.widget.ParentWidget; +import brachy.modularui.widgets.ButtonWidget; +import brachy.modularui.widgets.layout.Flow; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.util.Arrays; +import java.util.function.Consumer; + +@Accessors(fluent = true) +@Setter +public class MachineUIPanelBuilder { + + /** + * Should the GregTech logo be drawn in the bottom right corner of the panel. + */ + private boolean drawGTLogo = false; + /** + * The texture to use for the GregTech logo. + */ + private UITexture gtLogoTexture = GTGuiTextures.GREGTECH_LOGO; + /** + * Should the player inventory be attached to the bottom of the panel. + */ + private boolean attachInventory = true; + /** + * Should a fancy title bar be created for this panel. + */ + private boolean addTitleBar = true; + /** + * If machine traits should be allowed to attach configurators to the sides of the panel. + */ + private boolean addTraitConfigurators = true; + /** + * If the default configurators (circuit slot, battery slot, power button) should be added to this machine, provided + * the machine supports them. + */ + private boolean addDefaultConfigurators = true; + private final MetaMachine machine; + + private Consumer leftConfigurators = (f) -> {}; + private Consumer rightConfigurators = (f) -> {}; + private Consumer> mainContents = (p) -> {}; + + protected MachineUIPanelBuilder(MetaMachine machine) { + this.machine = machine; + } + + public MachineUIPanel build(PanelSyncManager syncManager, UISettings settings) { + var panel = new MachineUIPanel(machine, settings, attachInventory, addTitleBar, drawGTLogo, gtLogoTexture); + + var attachLeft = panel.getLeftConfiguratorPanel(); + var attachRight = panel.getRightConfiguratorPanel(); + var attachMain = panel.getMainContents(); + + if (addDefaultConfigurators) { + if (machine instanceof IControllable controllable) { + attachRight.child(GTMuiWidgets.createPowerButton(controllable)); + } + if (machine instanceof IVoidable voidable && machine instanceof WorkableMultiblockMachine) { + attachRight.child(GTMuiWidgets.createVoidingButton(voidable)); + } + if (machine instanceof IDistinctPart distinctPart) { + attachRight.childIf(distinctPart.supportsDistinct(), + () -> GTMuiWidgets.createDistinctnessButton(distinctPart)); + } + if (machine.getDefinition().getRecipeModifier() instanceof RecipeModifierList rml && + Arrays.stream(rml.getModifiers()).anyMatch(m -> m == GTRecipeModifiers.BATCH_MODE) && + machine instanceof WorkableElectricMultiblockMachine workableElectric) { + attachRight.child(GTMuiWidgets.createBatchModeButton(workableElectric)); + } + + if (machine.getDefinition().getRecipeTypes().length > 1 && + machine instanceof WorkableElectricMultiblockMachine workableMachine) { + attachRight.child(GTMuiWidgets.createRecipeTypeButton(workableMachine, syncManager)); + } + + } + + leftConfigurators.accept(attachLeft); + rightConfigurators.accept(attachRight); + mainContents.accept(attachMain); + + if (addTraitConfigurators) { + for (var attachConfiguratorsTrait : machine.getTraitHolder() + .getTraitsByInterface(IAttachConfiguratorsTrait.class)) { + attachConfiguratorsTrait.attachLeftConfigurators(attachLeft, panel, syncManager); + attachConfiguratorsTrait.attachRightConfigurators(attachRight, panel, syncManager); + } + } + + if (machine instanceof SimpleSteamMachine steamMachine) { + IntSyncValue steamAmount = syncManager.getOrCreateSyncHandler("steamTank", IntSyncValue.class, + () -> new IntSyncValue(() -> steamMachine.steamTank.getFluidInTank(0).getAmount())); + IntSyncValue steamCapacity = syncManager.getOrCreateSyncHandler("steamCapacity", IntSyncValue.class, + () -> new IntSyncValue(() -> steamMachine.steamTank.getTankCapacity(0))); + + DoubleSyncValue steamProgress = syncManager.getOrCreateSyncHandler("steamTankRatio", DoubleSyncValue.class, + () -> new DoubleSyncValue(() -> steamMachine.steamTank.getFluidInTank(0).getAmount() / + (float) steamMachine.steamTank.getTankCapacity(0))); + final int dialWidth = 4; + final int dialHeight = 12; + UITexture background = steamMachine.isHighPressure() ? GTGuiTextures.STEAM_DIAL_STEEL : + GTGuiTextures.STEAM_DIAL_BRONZE; + attachMain.child(new ParentWidget<>() + .child(background.asWidget() + .size(32, 32) + .tooltipAutoUpdate(true) + .tooltipDynamic(r -> r.addLine(Component.translatable("gtceu.multiblock.steam.steam_stored", + FormattingUtil.formatNumbers(steamAmount.getIntValue()), + FormattingUtil.formatNumbers(steamCapacity.getIntValue()))))) + .child(new SteamDialWidget(steamProgress) + .setMinAngle((float) Math.PI) + .setMaxAngle((float) 0.0f) + .setColor(Color.BLACK.brighterSafe(4)) + .asWidget().decoration() + + .size(dialHeight, dialWidth) + .left(16) + .top(16) + .tooltipAutoUpdate(true) + .tooltipDynamic(r -> r.addLine(Component.translatable("gtceu.multiblock.steam.steam_stored", + FormattingUtil.formatNumbers(steamAmount.getIntValue()), + FormattingUtil.formatNumbers(steamCapacity.getIntValue()))))) + .leftRel(0.0f).left(-36).top(4) + .excludeAreaInRecipeViewer()); + } + + for (var cover : machine.getCoverContainer().getCovers()) { + attachLeft.child(new ButtonWidget<>() + .overlay(new ItemDrawable(cover.getAttachItem())) + .onMousePressed((context, button) -> { + return true; + })); + } + + return panel; + } + + public static MachineUIPanelBuilder panelBuilder(MetaMachine machine) { + return new MachineUIPanelBuilder(machine); + } + + public static MachineUIPanelBuilder defaultSteamMachinePanelBuilder(MetaMachine machine) { + return new MachineUIPanelBuilder(machine).addDefaultConfigurators(false) + .addTraitConfigurators(false); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/CleanroomType.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/CleanroomType.java index 07689442890..c0d7f92d085 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/CleanroomType.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/CleanroomType.java @@ -2,6 +2,7 @@ import com.mojang.serialization.Codec; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import lombok.Getter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -13,21 +14,25 @@ public class CleanroomType { private static final Map CLEANROOM_TYPES = new Object2ObjectOpenHashMap<>(); - public static final CleanroomType CLEANROOM = new CleanroomType("cleanroom", "gtceu.recipe.cleanroom.display_name"); - public static final CleanroomType STERILE_CLEANROOM = new CleanroomType("sterile_cleanroom", + public static final CleanroomType CLEANROOM = new CleanroomType("cleanroom", 0, + "gtceu.recipe.cleanroom.display_name"); + public static final CleanroomType STERILE_CLEANROOM = new CleanroomType("sterile_cleanroom", 1, "gtceu.recipe.cleanroom_sterile.display_name"); public static final Codec CODEC = Codec.STRING.xmap(CLEANROOM_TYPES::get, CleanroomType::getName); private final String name; + @Getter + private final int tier; private final String translationKey; - public CleanroomType(@NotNull String name, @NotNull String translationKey) { + public CleanroomType(@NotNull String name, int tier, @NotNull String translationKey) { if (CLEANROOM_TYPES.get(name) != null) throw new IllegalArgumentException( String.format("CleanroomType with name %s is already registered!", name)); this.name = name; + this.tier = tier; this.translationKey = translationKey; CLEANROOM_TYPES.put(name, this); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/CoilWorkableElectricMultiblockMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/CoilWorkableElectricMultiblockMachine.java index a4ea83d5a11..c986dd6bef9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/CoilWorkableElectricMultiblockMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/CoilWorkableElectricMultiblockMachine.java @@ -1,12 +1,24 @@ package com.gregtechceu.gtceu.api.machine.multiblock; +import com.gregtechceu.gtceu.api.GTCEuAPI; import com.gregtechceu.gtceu.api.block.ICoilType; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.multiblock.error.CoilMatchingError; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.block.CoilBlock; import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.core.BlockPos; +import brachy.modularui.api.drawable.IDrawable; +import brachy.modularui.drawable.*; +import brachy.modularui.factory.PosGuiData; +import brachy.modularui.screen.UISettings; +import brachy.modularui.value.sync.PanelSyncManager; +import brachy.modularui.widget.ParentWidget; +import brachy.modularui.widgets.layout.Flow; import lombok.Getter; +import org.jetbrains.annotations.NotNull; import javax.annotation.ParametersAreNonnullByDefault; @@ -16,24 +28,57 @@ public class CoilWorkableElectricMultiblockMachine extends WorkableElectricMulti @Getter private ICoilType coilType = CoilBlock.CoilType.CUPRONICKEL; + @SyncToClient + @Getter + private int coilTier = 1; public CoilWorkableElectricMultiblockMachine(BlockEntityCreationInfo info) { super(info); } - ////////////////////////////////////// - // *** Multiblock LifeCycle ***// - ////////////////////////////////////// @Override - public void onStructureFormed() { - super.onStructureFormed(); - var type = getMultiblockState().getMatchContext().get("CoilType"); - if (type instanceof ICoilType coil) { - this.coilType = coil; + public void formStructure(@NotNull String substructureName) { + super.formStructure(substructureName); + var cache = patternStates.get(substructureName).getCache(); + ICoilType coilType = null; + for (var entry : cache.long2ObjectEntrySet()) { + var state = entry.getValue().getBlockState(); + if (state.getBlock() instanceof CoilBlock coil) { + if (GTCEuAPI.HEATING_COILS.containsKey(coil.coilType)) { + if (coilType == null) coilType = coil.coilType; + else { + if (coilType != coil.coilType) { + patternStates.get(substructureName).setError( + new CoilMatchingError(BlockPos.of(entry.getLongKey()), coilType, coil.coilType)); + invalidateStructure(substructureName); + return; + } + } + } + } + } + if (coilType != null) { + this.coilType = coilType; + this.coilTier = coilType.getTier(); + getSyncDataHolder().markClientSyncFieldDirty("coilTier"); } } - public int getCoilTier() { - return coilType.getTier(); + // todo jurre custom coil error reporting + + @Override + public void buildMainUI(ParentWidget mainWidget, PosGuiData guiData, PanelSyncManager syncManager, + UISettings settings) { + IDrawable coilTexture = new UITexture.Builder() + .location(CoilBlock.CoilType.values()[coilTier].getTexture()) + .imageSize(16, 16) + .colorType(ColorType.DEFAULT) + .tiled().build(); + + mainWidget + .child(Flow.row().height(MULTI_UI_TEXT_PANEL_HEIGHT).coverChildrenWidth() + .child(new IDrawable.DrawableWidget(coilTexture).size(4, MULTI_UI_TEXT_PANEL_HEIGHT)) + .child(getMainTextPanel(syncManager)) + .child(new IDrawable.DrawableWidget(coilTexture).size(4, MULTI_UI_TEXT_PANEL_HEIGHT))); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java index 8e1ad857077..6a7fbd4d915 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java @@ -1,58 +1,69 @@ package com.gregtechceu.gtceu.api.machine.multiblock; -import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.block.MetaMachineBlock; import com.gregtechceu.gtceu.api.block.property.GTBlockStateProperties; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; +import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.api.machine.trait.multiblock.MultiblockMachineTrait; -import com.gregtechceu.gtceu.api.pattern.BlockPattern; -import com.gregtechceu.gtceu.api.pattern.MultiblockState; -import com.gregtechceu.gtceu.api.pattern.MultiblockWorldSavedData; +import com.gregtechceu.gtceu.api.multiblock.MultiblockWorldSavedData; +import com.gregtechceu.gtceu.api.multiblock.pattern.*; +import com.gregtechceu.gtceu.api.multiblock.util.AbstractStructureHelper; +import com.gregtechceu.gtceu.api.multiblock.util.BlockInfo; import com.gregtechceu.gtceu.api.sync_system.annotations.ClientFieldChangeListener; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; -import com.gregtechceu.gtceu.client.renderer.MultiblockInWorldPreviewRenderer; +import com.gregtechceu.gtceu.client.mui.schema.MutableSchema; +import com.gregtechceu.gtceu.client.renderer.PatternPreviewRenderer; import com.gregtechceu.gtceu.common.machine.multiblock.part.ParallelHatchPartMachine; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.server.TickTask; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionResult; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import brachy.modularui.api.widget.IWidget; +import brachy.modularui.value.sync.PanelSyncManager; +import com.google.common.collect.HashBasedTable; +import com.google.common.collect.Table; +import it.unimi.dsi.fastutil.Pair; +import it.unimi.dsi.fastutil.ints.*; +import it.unimi.dsi.fastutil.longs.Long2ReferenceMap; +import it.unimi.dsi.fastutil.longs.Long2ReferenceOpenHashMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; import lombok.Getter; import org.jetbrains.annotations.Nullable; import java.util.*; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; +import java.util.function.BiConsumer; +import java.util.function.Predicate; /** - * The base class for all multiblock controllers + * The base class for all multiblock controllers. */ +@SuppressWarnings({ "UnusedReturnValue" }) public class MultiblockControllerMachine extends MetaMachine { - private @Nullable MultiblockState multiblockState; - private final List parts = new ArrayList<>(); + public static final String DEFAULT_STRUCTURE = "main"; + + private final List parts = new ArrayList<>(); private @Nullable ParallelHatchPartMachine parallelHatch = null; @Getter @SyncToClient private BlockPos[] partPositions = new BlockPos[0]; - - /** - * If the multiblock is formed. - *
- * NOTE: Formed multiblocks may not be completely valid in some edge cases, e.g. when called on the same tick as a - * part becoming invalid - */ @Getter @SaveField @SyncToClient @@ -63,19 +74,21 @@ public class MultiblockControllerMachine extends MetaMachine { @SyncToClient protected boolean isFlipped; + protected static final Table structurePatterns = HashBasedTable + .create(); + protected final Object2ObjectMap patternStates = new Object2ObjectOpenHashMap<>(); + public MultiblockControllerMachine(BlockEntityCreationInfo info) { super(info); + createStructurePatterns(); } - ////////////////////////////////////// - // *** Multiblock Lifecycle ***// - ////////////////////////////////////// - @Override public void onLoad() { super.onLoad(); - if (getLevel() instanceof ServerLevel serverLevel) { - MultiblockWorldSavedData.getOrCreate(serverLevel).addAsyncLogic(this); + if (!isRemote()) { + // run a structure check on the first tick + ((ServerLevel) getLevel()).getServer().tell(new TickTask(2, this::checkAndFormStructure)); } } @@ -83,84 +96,133 @@ public void onLoad() { public void onUnload() { super.onUnload(); if (getLevel() instanceof ServerLevel serverLevel) { - MultiblockWorldSavedData.getOrCreate(serverLevel).removeAsyncLogic(this); + for (var pattern : patternStates.values()) { + MultiblockWorldSavedData.getOrCreate(serverLevel).removeMapping(pattern); + } } + invalidateAllStructures(); } - /** - * Called when multiblock structure becomes valid/formed. Called when blocks in structure change to form a valid - * multiblock, or when the controller is loaded. - */ - public void onStructureFormed() { - isFormed = true; - syncDataHolder.markClientSyncFieldDirty("isFormed"); - MachineRenderState renderState = getRenderState(); - if (renderState.hasProperty(GTMachineModelProperties.IS_FORMED)) { - setRenderState(renderState.setValue(GTMachineModelProperties.IS_FORMED, true)); - } + public Map getStructurePatterns() { + return structurePatterns.row(this.getDefinition()); + } - this.parts.clear(); - Set set = getMultiblockState().getMatchContext().getOrCreate("parts", Collections::emptySet); - for (IMultiPart part : set) { - if (shouldAddPartToController(part)) { - this.parts.add(part); - } - } - this.parts.sort(getPartSorter()); - updatePartPositions(); - for (var part : parts) { - if (part instanceof ParallelHatchPartMachine pHatch) { - parallelHatch = pHatch; + public void setFlipped(boolean flipped) { + isFlipped = flipped; + syncDataHolder.markClientSyncFieldDirty("isFlipped"); + } + + @SuppressWarnings("unused") + @ClientFieldChangeListener(fieldName = "partPositions") + protected void onPartsUpdated() { + parts.clear(); + for (var pos : partPositions) { + if (getMachine(getLevel(), pos) instanceof MultiblockPartMachine part) { + parts.add(part); } - part.addedToController(this); } - updatePartPositions(); + } - for (var trait : getAllTraits()) { - if (trait instanceof MultiblockMachineTrait multiblockMachineTrait) - multiblockMachineTrait.onStructureFormed(); + /** + * Gets the first trait (trait with highest priority) of a specified type from this multiblock's parts. + * + * @param type The trait type to get. + * @return The trait, or null if no traits of the given type are present. + */ + public @Nullable T getTraitFromParts(MachineTraitType type) { + T trait = null; + for (var part : getParts()) { + T partTrait = part.getTrait(type); + if (partTrait != null && (trait == null || partTrait.getTraitPriority() > trait.getTraitPriority())) + trait = partTrait; } + return trait; } /** - * Called when multiblock structure becomes invalid. Called when blocks in structure change, or when controller - * machine is about to be unloaded. + * Get all traits with the specified type. + * + * @param type The trait type to get + * @return An unmodifiable list containing all traits of the specified type. */ - public void onStructureInvalid() { - isFormed = false; - MachineRenderState renderState = getRenderState(); - if (renderState.hasProperty(GTMachineModelProperties.IS_FORMED)) { - setRenderState(renderState.setValue(GTMachineModelProperties.IS_FORMED, false)); + public List getTraitsFromParts(MachineTraitType type) { + List traits = new ObjectArrayList<>(); + for (var part : getParts()) { + traits.addAll(part.getTraits(type)); } + return Collections.unmodifiableList(traits); + } - for (IMultiPart part : parts) { - part.removedFromController(this); - } - parallelHatch = null; - parts.clear(); - updatePartPositions(); + protected void updatePartPositions() { + this.partPositions = this.parts.isEmpty() ? new BlockPos[0] : + this.parts.stream().map(BlockEntity::getBlockPos).toArray(BlockPos[]::new); + syncDataHolder.markClientSyncFieldDirty("partPositions"); + } - for (var trait : getAllTraits()) { - if (trait instanceof MultiblockMachineTrait multiblockMachineTrait) - multiblockMachineTrait.onStructureInvalid(); + public List getParts() { + // for the client side, when the chunk unloaded + if (this.parts.size() != this.partPositions.length) { + this.parts.clear(); + for (BlockPos pos : this.partPositions) { + if (getMachine(getLevel(), pos) instanceof MultiblockPartMachine part) { + this.parts.add(part); + } + } } + return this.parts; } /** - * Called when a multiblock part becomes invalid due to chunk unloading or block destruction. + * The instance of {@link ParallelHatchPartMachine} attached to this controller. + *

+ * Note that this will return a singular instance, and will not account for multiple attached IParallelHatches + * + * @return an {@link Optional} of the attached IParallelHatch, empty if one is not attached */ - public void onPartUnload() { - parts.removeIf(part -> part.self().isRemoved()); - getMultiblockState().setError(MultiblockState.UNLOAD_ERROR); - if (getLevel() instanceof ServerLevel serverLevel) { - MultiblockWorldSavedData.getOrCreate(serverLevel).addAsyncLogic(this); - } - updatePartPositions(); + public Optional getParallelHatch() { + return Optional.ofNullable(parallelHatch); } ////////////////////////////////////// - // ***** Getters ******// - /// /////////////////////////////////// + // *** Multiblock LifeCycle ***// + ////////////////////////////////////// + + public void checkAndFormStructure() { + if (!(getLevel() instanceof ServerLevel serverLevel)) return; + if (isRemoved()) return; + for (var entry : patternStates.entrySet()) { + String name = entry.getKey(); + PatternState patternState = getPatternState(name); + boolean formed = name.equals(DEFAULT_STRUCTURE) ? isFormed : patternState.isFormed(); + if (!formed || patternState.hasErrors() || + patternState.getState() == PatternState.CheckState.UNINITIALIZED) { + if (!patternState.getState().isValid()) { + checkStructurePattern(name); + } + if (patternState.getState().isValid()) { + formStructure(name); + } + MultiblockWorldSavedData.getOrCreate(serverLevel).addMapping(patternState); + + } + } + } + + /** + * Whether the specific part should be added to the part list + */ + public boolean shouldAddPartToController(MultiblockPartMachine part) { + return true; + } + + /** + * Returns a list of all substructures this multiblock has. + * + * @return set of substructures used by controller + */ + public Set getStructureNames() { + return structurePatterns.row(this.getDefinition()).keySet(); + } /** * The {@link MultiblockMachineDefinition} of this multiblock. @@ -173,103 +235,226 @@ public MultiblockMachineDefinition getDefinition() { } /** - * Gets {@link MultiblockState}, which holds all structure-related information. - * - * @return The {@link MultiblockState} + * Get structure pattern. + * You can override it to create dynamic patterns. */ - public MultiblockState getMultiblockState() { - if (multiblockState == null) { - multiblockState = new MultiblockState(getLevel(), getBlockPos()); - } - return multiblockState; + public IBlockPattern getDefaultStructurePattern() { + return getDefinition().getStructurePatterns().get(DEFAULT_STRUCTURE).get(); } - public @Nullable BlockState getPartAppearance(IMultiPart part, Direction side, BlockState sourceState, - BlockPos sourcePos) { - if (isFormed()) { - return getDefinition().getPartAppearance().apply(this, part, side); - } - return null; + /** + * Creates the default pattern and pattern state and populates the state maps + */ + public void createStructurePatterns() { + getDefinition().getStructurePatterns().forEach((name, pattern) -> { + patternStates.put(name, new PatternState()); + structurePatterns.put(this.getDefinition(), name, pattern.get()); + }); + getSyncDataHolder().markClientSyncFieldDirty("patternStates"); } - public Comparator getPartSorter() { - return getDefinition().getPartSorter().apply(this); + public PatternState getDefaultPatternState() { + return getPatternState(DEFAULT_STRUCTURE); } - /** - * @return A list of all multiblock parts - */ - public List getParts() { - // for the client side, when the chunk unloaded - if (parts.size() != this.partPositions.length) { - parts.clear(); - for (var pos : this.partPositions) { - if (getMachine(getLevel(), pos) instanceof IMultiPart part) { - parts.add(part); + public PatternState getPatternState(String name) { + return this.patternStates.get(name); + } + + public PatternState checkDefaultStructurePattern() { + return checkStructurePattern(DEFAULT_STRUCTURE); + } + + public PatternState checkStructurePattern(String structureName) { + IBlockPattern pattern = getSubstructurePattern(structureName); + PatternState state = getPatternState(structureName); + if (pattern == null || !state.shouldUpdate() || getLevel() == null) return state; + + state.setController(this, getBlockPos()); + pattern.checkPatternFastAt(getLevel(), state, getBlockPos(), getFrontFacing(), getUpwardsFacing(), + allowFlip()); + + return state; + } + + public void formStructure(String substructureName) { + var patternState = getPatternState(substructureName); + patternState.setFormed(true); + if (substructureName.equals(DEFAULT_STRUCTURE)) { + isFormed = true; + getSyncDataHolder().markClientSyncFieldDirty("isFormed"); + } + + if (!patternState.getState().isValid()) { + if (patternState.isFormed()) { + invalidateStructure(substructureName); + } + } + + if (patternState.isFormed()) { + if (patternState.getState() == PatternState.CheckState.VALID_UNCACHED) { + forEachMultiPart(substructureName, part -> { + if (parts.contains(part)) return true; + + if (part.hasController(getBlockPos()) && !part.canShared(this, substructureName)) { + invalidateStructure(substructureName); + return false; + } + + if (shouldAddPartToController(part)) { + this.parts.add(part); + } + return true; + }); + + this.parts.sort(getDefinition().getPartSorter().apply(this)); + for (var part : parts) { + if (part instanceof ParallelHatchPartMachine pHatch) { + this.parallelHatch = pHatch; + } + part.addedToController(this, substructureName); + } + updatePartPositions(); + + patternState.setFormed(true); + if (substructureName.equals(DEFAULT_STRUCTURE)) { + this.isFormed = true; + getSyncDataHolder().markClientSyncFieldDirty("isFormed"); + } + setFlipped(patternState.isFlipped(), patternState); + + for (var trait : getAllTraits()) { + if (trait instanceof MultiblockMachineTrait multiblockMachineTrait) + multiblockMachineTrait.onStructureFormed(substructureName); } } + return; } - return this.parts; + + boolean valid = forEachMultiPart(substructureName, + part -> !part.hasController(getBlockPos()) || part.canShared(this, substructureName)); + + if (!valid) return; + + patternState.setFormed(true); + if (substructureName.equals(DEFAULT_STRUCTURE)) { + isFormed = true; + getSyncDataHolder().markClientSyncFieldDirty("isFormed"); + MachineRenderState renderState = getRenderState(); + if (renderState.hasProperty(GTMachineModelProperties.IS_FORMED)) { + setRenderState(renderState.setValue(GTMachineModelProperties.IS_FORMED, true)); + } + } + setFlipped(patternState.isFlipped(), patternState); } - /** - * The instance of {@link ParallelHatchPartMachine} attached to this controller. - *

- * Note that this will return a singular instance, and will not account for multiple attached IParallelHatches - * - * @return an {@link Optional} of the attached IParallelHatch, empty if one is not attached - */ - public Optional getParallelHatch() { - return Optional.ofNullable(parallelHatch); + public void setFlipped(boolean flipped, PatternState state) { + boolean flip = state.isActualFlipped(); + if (flip != flipped) { + state.setActualFlipped(flipped); + this.isFlipped = flipped; + notifyBlockUpdate(); + } } - /** - * - * @return Whether batching is enabled on this multiblock - */ - public boolean isBatchEnabled() { - return false; + public void invalidateAllStructures() { + for (String name : patternStates.keySet()) { + parts.removeIf(part -> { + if (name.equals(part.getSubstructureName())) { + part.removedFromController(this); + return true; + } + return false; + }); + } } - public void setFlipped(boolean flipped) { - isFlipped = flipped; - syncDataHolder.markClientSyncFieldDirty("isFlipped"); + public void invalidateStructure() { + invalidateStructure(DEFAULT_STRUCTURE); + isFormed = false; + getSyncDataHolder().markClientSyncFieldDirty("isFormed"); } - @SuppressWarnings("unused") - @ClientFieldChangeListener(fieldName = "partPositions") - protected void onPartsUpdated() { - parts.clear(); - for (var pos : partPositions) { - if (getMachine(getLevel(), pos) instanceof IMultiPart part) { - parts.add(part); + public void invalidateStructure(String name) { + var pState = patternStates.get(name); + // if (!pState.isFormed()) return; + + MachineRenderState renderState = getRenderState(); + if (renderState.hasProperty(GTMachineModelProperties.IS_FORMED)) { + setRenderState(renderState.setValue(GTMachineModelProperties.IS_FORMED, false)); + } + parts.removeIf(part -> { + if (name.equals(part.getSubstructureName())) { + part.removedFromController(this); + return true; } + return false; + }); + pState.setFormed(false); + if (name.equals(DEFAULT_STRUCTURE)) { + isFormed = false; + parallelHatch = null; + getSyncDataHolder().markClientSyncFieldDirty("isFormed"); + } + updatePartPositions(); + + for (var trait : getAllTraits()) { + if (trait instanceof MultiblockMachineTrait multiblockMachineTrait) + multiblockMachineTrait.onStructureInvalid(name); } } - protected void updatePartPositions() { - this.partPositions = this.parts.isEmpty() ? new BlockPos[0] : - this.parts.stream().map(part -> part.self().getBlockPos()).toArray(BlockPos[]::new); - syncDataHolder.markClientSyncFieldDirty("partPositions"); + protected void invalidateStructureCaches() { + for (var pState : patternStates.values()) { + pState.getCache().clear(); + } } - public void setBatchEnabled(boolean batch) {} + @Nullable + public IBlockPattern getSubstructurePattern(String name) { + return structurePatterns.get(this.getDefinition(), name); + } + + protected final boolean forEachMultiPart(String name, Predicate action) { + var cache = patternStates.get(name).getCache(); + for (BlockInfo info : cache.values()) { + if (info.getBlockEntity() instanceof MultiblockPartMachine part) { + if (!action.test(part)) return false; + } + } + return true; + } + + protected void forEachFormed(String name, BiConsumer action) { + // var cache = getSubstructure(name).getCache(); + var cache = patternStates.get(name).getCache(); + var pos = new BlockPos.MutableBlockPos(); + for (var entry : cache.long2ObjectEntrySet()) { + action.accept(entry.getValue(), pos.set(entry.getLongKey())); + } + } /** - * should add part to the part list. + * mark multiblockState as unload error first. + * if it's actually cuz by block breaking. + * {@link #invalidateStructure()} will be called from + * {@link PatternState#onBlockStateChanged(BlockPos, BlockState, BlockState)} */ - public boolean shouldAddPartToController(IMultiPart part) { - return true; + public void onPartUnload() { + parts.removeIf(BlockEntity::isRemoved); + updatePartPositions(); } @Override public void onRotated(Direction oldFacing, Direction newFacing) { if (oldFacing != newFacing && getLevel() instanceof ServerLevel serverLevel) { // invalid structure - this.onStructureInvalid(); + invalidateStructureCaches(); var mwsd = MultiblockWorldSavedData.getOrCreate(serverLevel); - mwsd.removeMapping(getMultiblockState()); - mwsd.addAsyncLogic(this); + for (var patternState : patternStates.values()) { + mwsd.removeMapping(patternState); + } + checkAndFormStructure(); } } @@ -277,23 +462,28 @@ public boolean allowFlip() { return getDefinition().isAllowFlip(); } + public @Nullable BlockState getPartAppearance(MultiblockPartMachine part, Direction side, + @Nullable BlockState sourceState, + @Nullable BlockPos sourcePos) { + if (isFormed()) { + return getDefinition().getPartAppearance().apply(this, part, side); + } + return null; + } + @Override public void setUpwardsFacing(Direction upwardsFacing) { - if (!getDefinition().isAllowExtendedFacing()) { - return; - } - if (upwardsFacing.getAxis() == Direction.Axis.Y) { - GTCEu.LOGGER.error("Tried to set upwards facing to invalid facing {}! Skipping", upwardsFacing); - return; - } - var blockState = getBlockState(); + if (getLevel() == null) return; + if (!getDefinition().isAllowExtendedFacing()) return; + BlockState blockState = getBlockState(); if (blockState.getBlock() instanceof MetaMachineBlock && blockState.getValue(GTBlockStateProperties.UPWARDS_FACING) != upwardsFacing) { getLevel().setBlockAndUpdate(getBlockPos(), blockState.setValue(GTBlockStateProperties.UPWARDS_FACING, upwardsFacing)); if (getLevel() != null && !getLevel().isClientSide) { notifyBlockUpdate(); - checkPattern(); + invalidateStructureCaches(); + checkAndFormStructure(); } } } @@ -303,114 +493,74 @@ public void setFrontFacing(Direction facing) { super.setFrontFacing(facing); if (getLevel() != null && !getLevel().isClientSide) { - checkPattern(); + invalidateStructureCaches(); + checkAndFormStructure(); } } - /** - * Show the preview of structure. - */ @Override public InteractionResult onUse(ExtendedUseOnContext context) { - if (!isFormed() && context.getPlayer().isShiftKeyDown()) { + if (!isFormed() && context.getPlayer().isShiftKeyDown() && + context.getPlayer().getItemInHand(context.getHand()).isEmpty()) { if (isRemote()) { - MultiblockInWorldPreviewRenderer.showPreview(getBlockPos(), this, - ConfigHolder.INSTANCE.client.inWorldPreviewDuration * 20); + Map resultStructure = new HashMap<>(); + AbstractStructureHelper structureHelper = null; + IBlockPattern pattern = getStructurePatterns().get(DEFAULT_STRUCTURE); + if (pattern instanceof BlockPattern blockPattern) { + Int2IntMap slices = new Int2IntArrayMap(); + for (int i = 0; i < blockPattern.getSlices().length; i++) { + slices.put(i, blockPattern.getSlices()[i].getMinRepeats()); + } + structureHelper = AbstractStructureHelper.blockPattern(slices); + } else if (pattern instanceof ExpandablePattern expandablePattern) { + IntList dims = new IntArrayList(); + if (expandablePattern.getBoundsConstraints() != null) { + expandablePattern.getBoundsConstraints().apply().stream() + .mapToInt(Pair::left) + .forEach(dims::add); + } + structureHelper = AbstractStructureHelper.expandable(dims); + } + + if (structureHelper != null) { + structureHelper.populate(resultStructure, pattern, null, getFrontFacing(), getUpwardsFacing(), + isFlipped()); + Long2ReferenceMap blocks = new Long2ReferenceOpenHashMap<>(); + resultStructure.forEach((pos, state) -> blocks.put(pos.asLong(), state.getBlockState())); + MutableSchema schema = new MutableSchema(blocks); + BlockPos origin = this.getBlockPos().mutable().move(schema.getControllerPos().multiply(-1)); + PatternPreviewRenderer.INSTANCE.showPreviewCycleLevel(origin, schema, + ConfigHolder.INSTANCE.client.inWorldPreviewDuration * 20); + } } - return InteractionResult.SUCCESS; + return InteractionResult.sidedSuccess(isRemote()); } return super.onUse(context); } - public boolean allowCircuitSlots() { - return true; - } - - ////////////////////////////////////// - // *** Pattern checking ***// - ////////////////////////////////////// - - /** - * Get structure pattern. - * You can override it to create dynamic patterns. - */ - public BlockPattern getPattern() { - return getDefinition().getPatternFactory().get(); - } - - /** - * Get lock for pattern checking. - */ - @Getter - private final Lock patternLock = new ReentrantLock(); - /** - * Called in an async thread. It's unsafe, Don't modify anything of world but checking information. - * It will be called per 5 tick. * - * @param periodID period Tick + * @return Whether batching is enabled on this multiblock */ - public void asyncCheckPattern(long periodID) { - if ((getMultiblockState().hasError() || !isFormed) && (getOffset() + periodID) % 4 == 0 && - checkPatternWithTryLock()) { // per second - if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().execute(() -> { - patternLock.lock(); - if (checkPatternWithLock()) { // formed - setFlipped(getMultiblockState().isNeededFlip()); - onStructureFormed(); - var mwsd = MultiblockWorldSavedData.getOrCreate(serverLevel); - mwsd.addMapping(getMultiblockState()); - mwsd.removeAsyncLogic(this); - } - patternLock.unlock(); - }); - } - } + public boolean isBatchEnabled() { + return false; } - /** - * Check Multiblock Pattern. Just checking pattern without any other logic. - * You can override it but it's unsafe for calling. because it will also be called in an async thread. - *
- * you should always use {@link MultiblockControllerMachine#checkPatternWithLock()} )} and - * {@link MultiblockControllerMachine#checkPatternWithTryLock()} instead. - * - * @return whether it can be formed. - */ - public boolean checkPattern() { - BlockPattern pattern = getPattern(); - return pattern != null && pattern.checkPatternAt(getMultiblockState(), false); - } + // TODO move to recipe logic + public void setBatchEnabled(boolean batch) {} /** - * Check pattern with a lock. + * Can be overridden to just add widgets to the black box in the middle instead of overriding the whole UI. + * Don't forget to invoke {@code super.getWidgetsForDisplay} to add the default lines (progress, voltage, etc.). + * + * @param syncManager the sync manager + * @return list of widgets to be displayed inside the black box in the middle of a standard multiblock UI */ - public boolean checkPatternWithLock() { - var lock = getPatternLock(); - lock.lock(); - try { - return checkPattern(); - } finally { - lock.unlock(); - } + public List getWidgetsForDisplay(PanelSyncManager syncManager) { + return new ArrayList<>(); } - /** - * Check pattern with a try lock - * - * @return false - checking failed or cant get the lock. - */ - public boolean checkPatternWithTryLock() { - var lock = getPatternLock(); - if (lock.tryLock()) { - try { - return checkPattern(); - } finally { - lock.unlock(); - } - } else { - return false; - } + public boolean allowCircuitSlots() { + return true; } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockDisplayText.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockDisplayText.java index 1b9abeb2afa..56fccedae43 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockDisplayText.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockDisplayText.java @@ -4,7 +4,8 @@ import com.gregtechceu.gtceu.api.capability.IEnergyContainer; import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; +import com.gregtechceu.gtceu.api.multiblock.pattern.PatternState; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; @@ -33,13 +34,13 @@ public class MultiblockDisplayText { *
* Automatically adds the "Invalid Structure" line if the structure is not formed. */ - public static Builder builder(List textList, boolean isStructureFormed) { - return builder(textList, isStructureFormed, true); + public static Builder builder(List textList, PatternState state) { + return builder(textList, state, true); } - public static Builder builder(List textList, boolean isStructureFormed, + public static Builder builder(List textList, PatternState state, boolean showIncompleteStructureWarning) { - return new Builder(textList, isStructureFormed, showIncompleteStructureWarning); + return new Builder(textList, state, showIncompleteStructureWarning); } public static class Builder { @@ -54,10 +55,10 @@ public static class Builder { private String pausedKey = "gtceu.multiblock.work_paused"; private String runningKey = "gtceu.multiblock.running"; - private Builder(List textList, boolean isStructureFormed, + private Builder(List textList, PatternState state, boolean showIncompleteStructureWarning) { this.textList = textList; - this.isStructureFormed = isStructureFormed; + this.isStructureFormed = state.isFormed(); if (!isStructureFormed && showIncompleteStructureWarning) { MutableComponent base = Component.translatable("gtceu.multiblock.invalid_structure") @@ -67,6 +68,13 @@ private Builder(List textList, boolean isStructureFormed, textList.add(base .withStyle(style -> style.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, hover)))); } + + if (!isStructureFormed) { + if (state.hasErrors() && state.getErrors() != null) { + // state.getError().applyErrorInformation().apply(); + } + // textList.add(state.getError().getErrorInfo()); + } } /** @@ -424,7 +432,6 @@ public Builder addOutputLines(GTRecipe recipe) { if (recipe != null) { int recipeTier = RecipeHelper.getPreOCRecipeEuTier(recipe); int chanceTier = recipeTier + recipe.ocLevel; - var function = recipe.getType().getChanceFunction(); double maxDurationSec = (double) recipe.duration / 20.0; var itemOutputs = recipe.getOutputContents(ItemRecipeCapability.CAP); var fluidOutputs = recipe.getOutputContents(FluidRecipeCapability.CAP); @@ -439,27 +446,25 @@ public Builder addOutputLines(GTRecipe recipe) { double countD = 1; // number of items output which is actually displayed. Can be either a number, or a range. Component displaycount; - if (item.content instanceof IntProviderIngredient provider) { + if (item.content() instanceof IntProviderIngredient provider) { rounded = true; stack = provider.getMaxSizeStack(); displaycount = Component.translatable("gtceu.gui.content.range", provider.getCountProvider().getMinValue(), provider.getCountProvider().getMaxValue()); - if (item.chance < item.maxChance) { - countD = countD * runs * function.getBoostedChance(item, recipeTier, chanceTier) / - item.maxChance; + if (item.chance() < item.maxChance()) { + countD = countD * runs * item.chance() / item.maxChance(); } countD = countD * provider.getMidRoll(); } else { - var stacks = ItemRecipeCapability.CAP.of(item.content).getItems(); + var stacks = ItemRecipeCapability.CAP.of(item.content()).getItems(); if (stacks.length == 0) continue; stack = stacks[0]; count = stack.getCount(); countD *= count; - if (item.chance < item.maxChance) { + if (item.chance() < item.maxChance()) { rounded = true; - countD = countD * runs * function.getBoostedChance(item, recipeTier, chanceTier) / - item.maxChance; + countD = countD * runs * item.chance() / item.maxChance(); } count = Math.max(1, (int) Math.round(countD)); displaycount = Component.literal(String.valueOf(count)); @@ -483,27 +488,25 @@ public Builder addOutputLines(GTRecipe recipe) { double amountD = 1; // amount of fluid output which is actually displayed. Can be either a number, or a range. Component displaycount; - if (fluid.content instanceof IntProviderFluidIngredient provider) { + if (fluid.content() instanceof IntProviderFluidIngredient provider) { rounded = true; stack = provider.getMaxSizeStack(); displaycount = Component.translatable("gtceu.gui.content.range", provider.getCountProvider().getMinValue(), provider.getCountProvider().getMaxValue()); - if (fluid.chance < fluid.maxChance) { - amountD = amountD * runs * function.getBoostedChance(fluid, recipeTier, chanceTier) / - fluid.maxChance; + if (fluid.chance() < fluid.maxChance()) { + amountD = amountD * runs * fluid.chance() / fluid.maxChance(); } amountD = amountD * provider.getMidRoll(); } else { - var stacks = FluidRecipeCapability.CAP.of(fluid.content).getStacks(); + var stacks = FluidRecipeCapability.CAP.of(fluid.content()).getStacks(); if (stacks.length == 0) continue; stack = stacks[0]; amount = stack.getAmount(); amountD *= amount; - if (fluid.chance < fluid.maxChance) { + if (fluid.chance() < fluid.maxChance()) { rounded = true; - amountD = amountD * runs * function.getBoostedChance(fluid, recipeTier, chanceTier) / - fluid.maxChance; + amountD = amountD * runs * fluid.chance() / fluid.maxChance(); } amount = Math.max(1, (int) Math.round(amountD)); displaycount = Component.literal(String.valueOf(amount)); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/PartAbility.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/PartAbility.java index 7a5e705678b..290f743da81 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/PartAbility.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/PartAbility.java @@ -4,8 +4,8 @@ import net.minecraft.world.level.block.Block; +import it.unimi.dsi.fastutil.ints.Int2ObjectLinkedOpenHashMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import lombok.Getter; import org.apache.commons.lang3.ArrayUtils; @@ -14,6 +14,8 @@ public class PartAbility { + public static final Map VALUES = new HashMap<>(); + public static final PartAbility EXPORT_ITEMS = new PartAbility("export_items"); public static final PartAbility IMPORT_ITEMS = new PartAbility("import_items"); public static final PartAbility EXPORT_FLUIDS = new PartAbility("export_fluids"); @@ -56,7 +58,7 @@ public class PartAbility { /** * tier -> available blocks */ - private final Int2ObjectMap> registry = new Int2ObjectOpenHashMap<>(); + private final Int2ObjectMap> registry = new Int2ObjectLinkedOpenHashMap<>(); private final Supplier> allBlocks = GTMemoizer .memoize(() -> registry.values().stream().flatMap(Collection::stream).toList()); @@ -66,10 +68,11 @@ public class PartAbility { public PartAbility(String name) { this.name = name; + VALUES.put(name, this); } public void register(int tier, Block block) { - registry.computeIfAbsent(tier, T -> new HashSet<>()).add(block); + registry.computeIfAbsent(tier, T -> new LinkedHashSet<>()).add(block); } public Collection getAllBlocks() { @@ -87,9 +90,6 @@ public Collection getBlocks(int... tiers) { .toList(); } - /** - * [from, to] - */ public Collection getBlockRange(int from, int to) { return registry.int2ObjectEntrySet().stream() .filter(entry -> entry.getIntKey() <= to && entry.getIntKey() >= from) diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableElectricMultiblockMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableElectricMultiblockMachine.java index a96213a0e87..7b525e8b87b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableElectricMultiblockMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableElectricMultiblockMachine.java @@ -6,43 +6,41 @@ import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.fancy.*; -import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; +import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; import com.gregtechceu.gtceu.api.machine.feature.IOverclockMachine; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; import com.gregtechceu.gtceu.api.machine.feature.IVoidable; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; -import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifierList; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; -import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; -import com.gregtechceu.gtceu.common.machine.multiblock.part.ParallelHatchPartMachine; +import com.gregtechceu.gtceu.common.mui.GTMultiblockTextUtil; import com.gregtechceu.gtceu.utils.GTUtil; -import com.lowdragmc.lowdraglib.gui.modular.ModularUI; -import com.lowdragmc.lowdraglib.gui.widget.*; - import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.network.chat.Component; -import net.minecraft.world.entity.player.Player; +import brachy.modularui.api.widget.IWidget; +import brachy.modularui.drawable.GuiTextures; +import brachy.modularui.drawable.Icon; +import brachy.modularui.factory.PosGuiData; +import brachy.modularui.screen.UISettings; +import brachy.modularui.utils.Alignment; +import brachy.modularui.value.sync.PanelSyncManager; +import brachy.modularui.widget.ParentWidget; +import brachy.modularui.widget.Widget; +import brachy.modularui.widgets.ListWidget; import lombok.Getter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; -import java.util.Objects; -import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class WorkableElectricMultiblockMachine extends WorkableMultiblockMachine implements IFancyUIMachine, - IDisplayUIMachine, ITieredMachine, IOverclockMachine { +public class WorkableElectricMultiblockMachine extends WorkableMultiblockMachine + implements IMuiMachine, ITieredMachine, IOverclockMachine, IVoidable { // runtime protected @Nullable EnergyContainerList energyContainer; @@ -69,15 +67,15 @@ public WorkableElectricMultiblockMachine self() { // *** Multiblock Lifecycle ***// ////////////////////////////////////// @Override - public void onStructureInvalid() { - super.onStructureInvalid(); + public void invalidateStructure(String name) { + super.invalidateStructure(name); this.energyContainer = null; this.tier = 0; } @Override - public void onStructureFormed() { - super.onStructureFormed(); + public void formStructure(@NotNull String substructureName) { + super.formStructure(substructureName); this.energyContainer = getEnergyContainer(); this.tier = GTUtil.getFloorTierByVoltage(getMaxVoltage()); } @@ -98,91 +96,39 @@ public void setBatchEnabled(boolean batch) { // ********** GUI ***********// ////////////////////////////////////// - @Override - public void addDisplayText(List textList) { - int numParallels; - int subtickParallels; - int batchParallels; - int totalRuns; - boolean exact = false; - if (recipeLogic.isActive() && recipeLogic.getLastRecipe() != null) { - numParallels = recipeLogic.getLastRecipe().parallels; - subtickParallels = recipeLogic.getLastRecipe().subtickParallels; - batchParallels = recipeLogic.getLastRecipe().batchParallels; - totalRuns = recipeLogic.getLastRecipe().getTotalRuns(); - exact = true; - } else { - numParallels = getParallelHatch() - .map(ParallelHatchPartMachine::getCurrentParallel) - .orElse(0); - subtickParallels = 0; - batchParallels = 0; - totalRuns = 0; - } - - MultiblockDisplayText.builder(textList, isFormed()) - .setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) - .addEnergyUsageLine(energyContainer) - .addEnergyTierLine(tier) - .addMachineModeLine(getRecipeType(), getRecipeTypes().length > 1) - .addTotalRunsLine(totalRuns) - .addParallelsLine(numParallels, exact) - .addSubtickParallelsLine(subtickParallels) - .addBatchModeLine(isBatchEnabled(), batchParallels) - .addWorkingStatusLine() - .addProgressLine(recipeLogic) - .addRecipeFailReasonLine(recipeLogic) - .addOutputLines(recipeLogic.getLastRecipe()); - getDefinition().getAdditionalDisplay().accept(this, textList); - IDisplayUIMachine.super.addDisplayText(textList); - } - - @Override - public Widget createUIWidget() { - var group = new WidgetGroup(0, 0, 182 + 8, 117 + 8); - group.addWidget(new DraggableScrollableWidgetGroup(4, 4, 182, 117).setBackground(getScreenTexture()) - .addWidget(new LabelWidget(4, 5, self().getBlockState().getBlock().getDescriptionId())) - .addWidget(new ComponentPanelWidget(4, 17, this::addDisplayText) - .textSupplier(this.getLevel().isClientSide ? null : this::addDisplayText) - .setMaxWidthLimit(200) - .clickHandler(this::handleDisplayClick))); - group.setBackground(GuiTextures.BACKGROUND_INVERSE); - return group; + public static final int MULTI_UI_TEXT_PANEL_WIDTH = 172; + public static final int MULTI_UI_TEXT_PANEL_HEIGHT = 136; + + public Widget getMainTextPanel(PanelSyncManager syncManager) { + var parentWidget = new ParentWidget<>(); + var listWidget = new ListWidget<>() + .width(MULTI_UI_TEXT_PANEL_WIDTH - 6) + .height(MULTI_UI_TEXT_PANEL_HEIGHT - 6) + .childSeparator(Icon.EMPTY_2PX) + .crossAxisAlignment(Alignment.CrossAxis.START) + .collapseDisabledChildren() + .posRel(Alignment.CenterLeft); + parentWidget.size(MULTI_UI_TEXT_PANEL_WIDTH, MULTI_UI_TEXT_PANEL_HEIGHT).background(GuiTextures.DISPLAY); + + listWidget.children(getWidgetsForDisplay(syncManager)); + parentWidget.child(listWidget.left(3).top(3)); + return parentWidget; } @Override - public ModularUI createUI(Player entityPlayer) { - return new ModularUI(198, 208, this, entityPlayer).widget(new FancyMachineUIWidget(this, 198, 208)); + public void buildMainUI(ParentWidget mainWidget, PosGuiData guiData, PanelSyncManager syncManager, + UISettings settings) { + mainWidget.child(getMainTextPanel(syncManager).margin(4, 2)); } @Override - public List getSubTabs() { - return getParts().stream().filter(Objects::nonNull).map(IFancyUIProvider.class::cast).toList(); - } - - @Override - public void attachConfigurators(ConfiguratorPanel configuratorPanel) { - IVoidable.attachConfigurators(configuratorPanel, this); - if (getDefinition().getRecipeModifier() instanceof RecipeModifierList list && Arrays.stream(list.getModifiers()) - .anyMatch(modifier -> modifier == GTRecipeModifiers.BATCH_MODE)) { - configuratorPanel.attachConfigurators(new IFancyConfiguratorButton.Toggle( - GuiTextures.BUTTON_BATCH.getSubTexture(0, 0, 1, 0.5), - GuiTextures.BUTTON_BATCH.getSubTexture(0, 0.5, 1, 0.5), - this::isBatchEnabled, - (cd, p) -> setBatchEnabled(p)) - .setTooltipsSupplier( - p -> List.of( - Component.translatable("gtceu.machine.batch_" + (p ? "enabled" : "disabled"))))); - } - - IFancyUIMachine.super.attachConfigurators(configuratorPanel); - } - - @Override - public void attachTooltips(TooltipsPanel tooltipsPanel) { - for (IMultiPart part : getParts()) { - part.attachFancyTooltipsToController(this, tooltipsPanel); - } + public List getWidgetsForDisplay(PanelSyncManager syncManager) { + List widgets = new ArrayList<>(); + widgets.add(GTMultiblockTextUtil.addUnformedWarning(this, syncManager)); + widgets.add(GTMultiblockTextUtil.addEnergyTierLine(this, syncManager)); + widgets.add(GTMultiblockTextUtil.addEnergyUsageLine(this, syncManager)); + widgets.addAll(super.getWidgetsForDisplay(syncManager)); + return widgets; } ////////////////////////////////////// @@ -282,8 +228,30 @@ public long getMaxVoltage() { @Override public long getDisplayRecipeVoltage() { - return Math.max(this.getEnergyContainer().getHighestInputVoltage(), - this.getEnergyContainer().getOutputVoltage()); + long voltage = -1; + var handlers = getCapabilitiesFlat(IO.IN, EURecipeCapability.CAP); + if (handlers.isEmpty()) handlers = getCapabilitiesFlat(IO.OUT, EURecipeCapability.CAP); + for (IRecipeHandler handler : handlers) { + if (handler instanceof IEnergyContainer container) { + voltage = Math.max(voltage, Math.max(container.getInputVoltage(), container.getOutputVoltage())); + } + } + return voltage; + } + + @Override + public long getDisplayGeneratorPower() { + if (this.isGenerator()) { + long power = -1; + var handlers = getCapabilitiesFlat(IO.OUT, EURecipeCapability.CAP); + for (IRecipeHandler handler : handlers) { + if (handler instanceof IEnergyContainer container) { + power += container.getOutputVoltage() * container.getOutputAmperage(); + } + } + return power; + } + return -1; } /** diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableMultiblockMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableMultiblockMachine.java index 1026e857dba..1dbbc31ca46 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableMultiblockMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableMultiblockMachine.java @@ -1,40 +1,48 @@ package com.gregtechceu.gtceu.api.machine.multiblock; +import com.gregtechceu.gtceu.api.block.ActiveBlock; import com.gregtechceu.gtceu.api.block.property.GTBlockStateProperties; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; import com.gregtechceu.gtceu.api.machine.feature.IMufflableMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IWorkableMultiController; +import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; -import com.gregtechceu.gtceu.api.machine.trait.*; +import com.gregtechceu.gtceu.api.machine.trait.recipe.IRecipeHandlerTrait; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import com.gregtechceu.gtceu.common.machine.trait.CleanroomReceiverTrait; +import com.gregtechceu.gtceu.common.mui.GTMultiblockTextUtil; import com.gregtechceu.gtceu.utils.ISubscription; import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.Block; -import it.unimi.dsi.fastutil.longs.Long2ObjectMap; -import it.unimi.dsi.fastutil.longs.Long2ObjectMaps; +import brachy.modularui.api.widget.IWidget; +import brachy.modularui.value.sync.PanelSyncManager; +import it.unimi.dsi.fastutil.longs.LongOpenHashSet; import it.unimi.dsi.fastutil.longs.LongSet; -import it.unimi.dsi.fastutil.longs.LongSets; import lombok.Getter; import lombok.Setter; import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.MustBeInvokedByOverriders; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.VisibleForTesting; import java.util.*; +/** + * The base class for multiblocks with recipe logic. + */ public abstract class WorkableMultiblockMachine extends MultiblockControllerMachine - implements IWorkableMultiController, IMufflableMachine { + implements IRecipeLogicMachine, IMufflableMachine { @Getter protected final CleanroomReceiverTrait cleanroomReceiver; @@ -74,6 +82,7 @@ public WorkableMultiblockMachine(BlockEntityCreationInfo info, this.activeRecipeType = 0; this.cleanroomReceiver = attachTrait(new CleanroomReceiverTrait()); this.recipeLogic = attachTrait(recipeLogic); + this.recipeLogic.setKeepSubscribing(false); this.capabilitiesProxy = new EnumMap<>(IO.class); this.capabilitiesFlat = new EnumMap<>(IO.class); this.traitSubscriptions = new ArrayList<>(); @@ -108,23 +117,26 @@ public void onUnload() { // *** Multiblock LifeCycle ***// ////////////////////////////////////// @Override - public void onStructureFormed() { - super.onStructureFormed(); + @MustBeInvokedByOverriders + public void formStructure(String substructureName) { + super.formStructure(substructureName); // attach parts' traits - activeBlocks = getMultiblockState().getMatchContext().getOrDefault("vaBlocks", LongSets.emptySet()); + var cache = patternStates.get(substructureName).getCache(); + for (var entry : cache.long2ObjectEntrySet()) { + if (entry.getValue().getBlockState().getBlock() instanceof ActiveBlock) { + if (activeBlocks == null) activeBlocks = new LongOpenHashSet(); + activeBlocks.add(entry.getLongKey()); + } + } + capabilitiesProxy.clear(); capabilitiesFlat.clear(); traitSubscriptions.forEach(ISubscription::unsubscribe); traitSubscriptions.clear(); - Long2ObjectMap ioMap = getMultiblockState().getMatchContext().getOrCreate("ioMap", - Long2ObjectMaps::emptyMap); - for (IMultiPart part : getParts()) { - IO io = ioMap.getOrDefault(part.self().getBlockPos().asLong(), IO.BOTH); - if (io == IO.NONE) continue; + for (MultiblockPartMachine part : getParts()) { var handlerLists = part.getRecipeHandlers(); for (var handlerList : handlerLists) { - if (!handlerList.isValid(io)) continue; this.addHandlerList(handlerList); traitSubscriptions.add(handlerList.subscribe(recipeLogic::updateTickSubscription)); } @@ -132,10 +144,8 @@ public void onStructureFormed() { // attach self traits Map>> ioTraits = new EnumMap<>(IO.class); - for (MachineTrait trait : getAllTraits()) { - if (trait instanceof IRecipeHandlerTrait handlerTrait) { - ioTraits.computeIfAbsent(handlerTrait.getHandlerIO(), i -> new ArrayList<>()).add(handlerTrait); - } + for (var trait : getTraitHolder().getTraitsByInterface(IRecipeHandlerTrait.class)) { + ioTraits.computeIfAbsent(trait.getHandlerIO(), i -> new ArrayList<>()).add(trait); } for (var entry : ioTraits.entrySet()) { @@ -148,8 +158,9 @@ public void onStructureFormed() { } @Override - public void onStructureInvalid() { - super.onStructureInvalid(); + @MustBeInvokedByOverriders + public void invalidateStructure(String name) { + super.invalidateStructure(name); updateActiveBlocks(false); activeBlocks = null; capabilitiesProxy.clear(); @@ -192,7 +203,7 @@ public void clientTick() { @Nullable @Override public final GTRecipe doModifyRecipe(GTRecipe recipe) { - for (IMultiPart part : getParts()) { + for (MultiblockPartMachine part : getParts()) { recipe = part.modifyRecipe(recipe); if (recipe == null) return null; } @@ -201,7 +212,7 @@ public final GTRecipe doModifyRecipe(GTRecipe recipe) { @Nullable protected GTRecipe getRealRecipe(GTRecipe recipe) { - return self().getDefinition().getRecipeModifier().applyModifier(self(), recipe); + return getDefinition().getRecipeModifier().applyModifier(this, recipe); } public void updateActiveBlocks(boolean active) { @@ -220,77 +231,69 @@ public void updateActiveBlocks(boolean active) { } @Override - public boolean keepSubscribing() { - return false; - } - - @Override - public void notifyStatusChanged(RecipeLogic.Status oldStatus, RecipeLogic.Status newStatus) { - IWorkableMultiController.super.notifyStatusChanged(oldStatus, newStatus); - if (newStatus == RecipeLogic.Status.WORKING || oldStatus == RecipeLogic.Status.WORKING) { + public void recipeLogicStatusChanged(RecipeLogic.Status oldStatus, RecipeLogic.Status newStatus) { + IRecipeLogicMachine.super.recipeLogicStatusChanged(oldStatus, newStatus); + if (shouldUpdateActiveBlocks()) { updateActiveBlocks(newStatus == RecipeLogic.Status.WORKING); } - for (IMultiPart part : getParts()) { - MachineRenderState state = part.self().getRenderState(); + for (MultiblockPartMachine part : getParts()) { + part.recipeLogicStatusChanged(oldStatus, newStatus); + MachineRenderState state = part.getRenderState(); if (state.hasProperty(GTMachineModelProperties.RECIPE_LOGIC_STATUS)) { - part.self().setRenderState(state.setValue(GTMachineModelProperties.RECIPE_LOGIC_STATUS, newStatus)); + part.setRenderState(state.setValue(GTMachineModelProperties.RECIPE_LOGIC_STATUS, newStatus)); } } } + /** + * If the multiblock should update all active blocks in its structure + */ + public boolean shouldUpdateActiveBlocks() { + return true; + } + @Override public boolean isRecipeLogicAvailable() { - return isFormed && !getMultiblockState().hasError(); + return isFormed && !getDefaultPatternState().hasErrors(); } @Override public void afterWorking() { - for (IMultiPart part : getParts()) { + for (MultiblockPartMachine part : getParts()) { part.afterWorking(this); } - IWorkableMultiController.super.afterWorking(); + IRecipeLogicMachine.super.afterWorking(); } @Override public boolean beforeWorking(@Nullable GTRecipe recipe) { - for (IMultiPart part : getParts()) { + for (MultiblockPartMachine part : getParts()) { if (!part.beforeWorking(this)) { return false; } } - return IWorkableMultiController.super.beforeWorking(recipe); + return IRecipeLogicMachine.super.beforeWorking(recipe); } @Override public boolean onWorking() { - for (IMultiPart part : getParts()) { + for (MultiblockPartMachine part : getParts()) { if (!part.onWorking(this)) { return false; } } - return IWorkableMultiController.super.onWorking(); - } - - @Override - public void onWaiting() { - for (IMultiPart part : getParts()) { - part.onWaiting(this); - } - IWorkableMultiController.super.onWaiting(); + return IRecipeLogicMachine.super.onWorking(); } - @Override - public void setWorkingEnabled(boolean isWorkingAllowed) { - if (!isWorkingAllowed) { - for (IMultiPart part : getParts()) { - part.onPaused(this); - } - } - IWorkableMultiController.super.setWorkingEnabled(isWorkingAllowed); + public GTRecipeType getRecipeType() { + int index = activeRecipeType >= 0 && activeRecipeType < recipeTypes.length ? activeRecipeType : 0; + return recipeTypes[index]; } - public GTRecipeType getRecipeType() { - return recipeTypes[activeRecipeType]; + public void cycleActiveRecipeType() { + int newActiveRecipeType = (getActiveRecipeType() + 1) % recipeTypes.length; + setActiveRecipeType(newActiveRecipeType); + getRecipeLogic().updateTickSubscription(); } /** @@ -311,4 +314,18 @@ public void setVoidingMode(VoidingMode mode) { voidingMode = mode; getRecipeLogic().updateTickSubscription(); } + + @Override + public List getWidgetsForDisplay(PanelSyncManager syncManager) { + List widgets = super.getWidgetsForDisplay(syncManager); + widgets.add(GTMultiblockTextUtil.addProgressLine(this, syncManager)); + widgets.add(GTMultiblockTextUtil.addWorkingStatusLine(this, syncManager)); + widgets.add(GTMultiblockTextUtil.addRecipeTypeField(this, syncManager)); + widgets.add(GTMultiblockTextUtil.addParallelLine(this, syncManager)); + widgets.add(GTMultiblockTextUtil.addBatchModeLine(this, syncManager)); + widgets.add(GTMultiblockTextUtil.addSubtickParallelsLine(this, syncManager)); + widgets.add(GTMultiblockTextUtil.addTotalRunsLine(this, syncManager)); + widgets.add(GTMultiblockTextUtil.addOutputLines(this, syncManager)); + return widgets; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/MultiblockPartMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/MultiblockPartMachine.java index fd9279b8834..b58bb054443 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/MultiblockPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/MultiblockPartMachine.java @@ -4,11 +4,13 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; -import com.gregtechceu.gtceu.api.machine.trait.IRecipeHandlerTrait; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.recipe.IRecipeHandlerTrait; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.sync_system.annotations.ClientFieldChangeListener; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; @@ -30,11 +32,12 @@ /** * The base class for all multiblock parts */ -public class MultiblockPartMachine extends MetaMachine implements IMultiPart { +public class MultiblockPartMachine extends MetaMachine { @SyncToClient protected final Set controllerPositions = new ObjectOpenHashSet<>(8); protected final SortedSet controllers = new ReferenceLinkedOpenHashSet<>(8); + protected @Nullable String substructureName; private @Nullable RecipeHandlerList handlerList; @@ -46,37 +49,64 @@ public MultiblockPartMachine(BlockEntityCreationInfo info) { // ***** Initialization ******// ////////////////////////////////////// - @Override + /** + * Gets all controllers this multiblock part belongs to. + * + * @return An unmodifiable set containing the controllers. + */ + @UnmodifiableView + public SortedSet getControllers() { + synchronized (controllers) { + // Necessary to rebuild the set of controllers on client-side + if (controllers.size() != controllerPositions.size()) { + onControllersUpdated(); + } + return Collections.unmodifiableSortedSet(new ReferenceLinkedOpenHashSet<>(controllers)); + } + } + + /** + * If this multiblock part belongs to a controller at the given position + * + * @param controllerPos Controller position + * @return If this multiblock part belongs to a controller at the given position + */ public boolean hasController(BlockPos controllerPos) { return controllerPositions.contains(controllerPos); } - @Override + /** + * @return If this multiblock part belongs to a formed multiblock. + */ public boolean isFormed() { return !controllerPositions.isEmpty(); } + /** + * Gets the name of the main substructure this multiblock part is attached to. + * + * @return The substructure name, or null. + */ + public @Nullable String getSubstructureName() { + return substructureName; + } + // Not sure if necessary, but added to match the Controller class @ClientFieldChangeListener(fieldName = "controllerPositions") public void onControllersUpdated() { - controllers.clear(); - for (BlockPos blockPos : controllerPositions) { - if (MetaMachine.getMachine(getLevel(), blockPos) instanceof MultiblockControllerMachine controller) { - controllers.add(controller); + synchronized (controllers) { + controllers.clear(); + for (BlockPos blockPos : controllerPositions) { + if (MetaMachine.getMachine(getLevel(), blockPos) instanceof MultiblockControllerMachine controller) { + controllers.add(controller); + } } } } - @Override - @UnmodifiableView - public SortedSet getControllers() { - // Necessary to rebuild the set of controllers on client-side - if (controllers.size() != controllerPositions.size()) { - onControllersUpdated(); - } - return Collections.unmodifiableSortedSet(controllers); - } - + /** + * Get all available recipe handlers for recipe logic. + */ public List getRecipeHandlers() { return List.of(getHandlerList()); } @@ -85,11 +115,9 @@ protected RecipeHandlerList getHandlerList() { if (handlerList == null) { List> handlers = new ArrayList<>(); IO handlerIO = null; - for (var trait : getAllTraits()) { - if (trait instanceof IRecipeHandlerTrait rht) { - if (handlerIO == null) handlerIO = rht.getHandlerIO(); - handlers.add(rht); - } + for (var rht : getTraitHolder().getTraitsByInterface(IRecipeHandlerTrait.class)) { + if (handlerIO == null) handlerIO = rht.getHandlerIO(); + handlers.add(rht); } if (handlers.isEmpty()) { @@ -105,65 +133,156 @@ protected RecipeHandlerList getHandlerList() { public void onUnload() { super.onUnload(); if (getLevel() instanceof ServerLevel serverLevel) { - // Need to copy if > 1 so that we can call removedFromController safely without CME - Set toIter = controllers.size() > 1 ? new ObjectOpenHashSet<>(controllers) : - controllers; + // Copy so we can call removedFromController (which mutates controllers) safely without CME + Set toIter; + synchronized (controllers) { + toIter = new ObjectOpenHashSet<>(controllers); + } for (MultiblockControllerMachine controller : toIter) { - if (serverLevel.isLoaded(controller.self().getBlockPos())) { + if (serverLevel.isLoaded(controller.getBlockPos())) { removedFromController(controller); controller.onPartUnload(); } } } controllerPositions.clear(); - controllers.clear(); + synchronized (controllers) { + controllers.clear(); + } + substructureName = null; + } + + /** + * @return If this multiblock part can be shared between multiple multiblocks. + */ + public boolean canShared(MultiblockControllerMachine controller, String substructureName) { + return true; + } + + /** + * Called when the controller's recipe logic status changes + * + * @param oldStatus Old recipe logic status + * @param newStatus New recipe logic status + */ + public void recipeLogicStatusChanged(RecipeLogic.Status oldStatus, RecipeLogic.Status newStatus) {} + + /** + * Called when a recipe is about to be run by the controller, just before inputs are consumed. + * + * @return true to cancel the recipe, false to continue + * + * @see RecipeLogic#setupRecipe(GTRecipe) + */ + public boolean beforeWorking(WorkableMultiblockMachine controller) { + return true; + } + + /** + * Called every tick while the controller's recipe logic is working. + * + * @return true to interrupt and suspend the recipe, false to continue working + * + * @see RecipeLogic#handleRecipeWorking() + */ + public boolean onWorking(WorkableMultiblockMachine controller) { + return true; + } + + /** + * Called when the controller finishes a recipe, before outputs are produced. + * + * @see RecipeLogic#onRecipeFinish() + */ + public void afterWorking(WorkableMultiblockMachine controller) {} + + /** + * Override it to modify recipe on the fly e.g. applying overclock, change chance, etc + * + * @param recipe recipe from detected from GTRecipeType + * @return modified recipe. + * null -- this recipe is unavailable + */ + public @Nullable GTRecipe modifyRecipe(GTRecipe recipe) { + return recipe; } ////////////////////////////////////// // *** Multiblock LifeCycle ***// ////////////////////////////////////// + /** + * Called when this part is removed from a multiblock. + * + * @param controller The controller which this part has been removed from. + */ @MustBeInvokedByOverriders - @Override public void removedFromController(MultiblockControllerMachine controller) { - controllerPositions.remove(controller.self().getBlockPos()); - controllers.remove(controller); + controllerPositions.remove(controller.getBlockPos()); + boolean empty; + synchronized (controllers) { + controllers.remove(controller); + empty = controllers.isEmpty(); + } - if (controllers.isEmpty()) { + if (empty) { + this.substructureName = null; MachineRenderState renderState = getRenderState(); if (renderState.hasProperty(GTMachineModelProperties.IS_FORMED)) { setRenderState(renderState.setValue(GTMachineModelProperties.IS_FORMED, false)); } } + + getAllTraits().forEach(t -> t.removedFromController(controller)); + syncDataHolder.markClientSyncFieldDirty("controllerPositions"); } + /** + * Called when this part is added to a multiblock. + * + * @param controller The controller which this part has been added to + */ @MustBeInvokedByOverriders - @Override - public void addedToController(MultiblockControllerMachine controller) { - controllerPositions.add(controller.self().getBlockPos()); - controllers.add(controller); + public void addedToController(MultiblockControllerMachine controller, String substructureName) { + controllerPositions.add(controller.getBlockPos()); + synchronized (controllers) { + controllers.add(controller); + } + this.substructureName = substructureName; syncDataHolder.markClientSyncFieldDirty("controllerPositions"); MachineRenderState renderState = getRenderState(); if (renderState.hasProperty(GTMachineModelProperties.IS_FORMED)) { setRenderState(renderState.setValue(GTMachineModelProperties.IS_FORMED, true)); } + + getAllTraits().forEach(t -> t.addedToController(controller)); } - @Override + /** + * If this part's base model can be replaced by controller when it is formed. + */ public boolean replacePartModelWhenFormed() { var renderState = getRenderState(); return renderState.hasProperty(GTMachineModelProperties.IS_FORMED) && renderState.getValue(GTMachineModelProperties.IS_FORMED); } - @Override + /** + * Called to get block appearance when this multi part is in a formed multiblock. + * + * @see MetaMachine#getBlockAppearance(BlockState, BlockAndTintGetter, BlockPos, Direction, BlockState, BlockPos) + */ @Nullable public BlockState getFormedAppearance(@Nullable BlockState sourceState, @Nullable BlockPos sourcePos, Direction side) { if (!replacePartModelWhenFormed()) return null; - return IMultiPart.super.getFormedAppearance(sourceState, sourcePos, side); + for (MultiblockControllerMachine controller : getControllers()) { + var appearance = controller.getPartAppearance(this, side, sourceState, sourcePos); + if (appearance != null) return appearance; + } + return null; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/TieredIOPartMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/TieredIOPartMachine.java index 4656665301e..30932b3d56c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/TieredIOPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/TieredIOPartMachine.java @@ -10,7 +10,6 @@ import net.minecraft.MethodsReturnNonnullByDefault; import lombok.Getter; -import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -40,19 +39,4 @@ public void setWorkingEnabled(boolean workingEnabled) { this.workingEnabled = workingEnabled; syncDataHolder.markClientSyncFieldDirty("workingEnabled"); } - - ////////////////////////////////////// - // ***** Initialization ******// - ////////////////////////////////////// - - @Nullable - @Override - public PageGroupingData getPageGroupingData() { - return switch (this.io) { - case IN -> new PageGroupingData("gtceu.multiblock.page_switcher.io.import", 1); - case OUT -> new PageGroupingData("gtceu.multiblock.page_switcher.io.export", 2); - case BOTH -> new PageGroupingData("gtceu.multiblock.page_switcher.io.both", 3); - case NONE -> null; - }; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/property/GTMachineModelProperties.java b/src/main/java/com/gregtechceu/gtceu/api/machine/property/GTMachineModelProperties.java index 94dd98a8e78..870e4c5402e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/property/GTMachineModelProperties.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/property/GTMachineModelProperties.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.api.machine.property; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; -import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; +import com.gregtechceu.gtceu.api.multiblock.util.RelativeDirection; import com.gregtechceu.gtceu.common.machine.electric.BatteryBufferMachine; import com.gregtechceu.gtceu.common.machine.multiblock.part.DiodePartMachine; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java index e28634e50e4..9345f8e0728 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java @@ -4,16 +4,12 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; -import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.UITemplate; -import com.gregtechceu.gtceu.api.gui.widget.PredicatedImageWidget; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; -import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; +import com.gregtechceu.gtceu.api.multiblock.util.RelativeDirection; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; @@ -23,15 +19,8 @@ import com.gregtechceu.gtceu.common.machine.trait.ExhaustVentMachineTrait; import com.gregtechceu.gtceu.common.recipe.condition.VentCondition; -import com.lowdragmc.lowdraglib.gui.modular.ModularUI; -import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; -import com.lowdragmc.lowdraglib.utils.Position; - import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.entity.player.Player; -import com.google.common.collect.Tables; import lombok.Getter; import java.util.*; @@ -39,7 +28,7 @@ /** * A singleblock steam machine with recipe logic and item IO. */ -public class SimpleSteamMachine extends SteamWorkableMachine implements IUIMachine { +public class SimpleSteamMachine extends SteamWorkableMachine { @SaveField public final NotifiableItemStackHandler importItems; @@ -49,10 +38,31 @@ public class SimpleSteamMachine extends SteamWorkableMachine implements IUIMachi @Getter private final ExhaustVentMachineTrait exhaustVentTrait; + /** + * Creates a {@link SimpleSteamMachine}. + * + * @param info {@link BlockEntityCreationInfo} + * @param recipeLogic The recipe logic to use. + * @param importSlots The amount of item input slots this machine should have (can be 0). + * @param exportSlots The amount of item output slots this machine should have (can be 0). + */ + public SimpleSteamMachine(BlockEntityCreationInfo info, RecipeLogic recipeLogic, boolean isHighPressure, + int importSlots, int exportSlots) { + super(info, isHighPressure, recipeLogic); + this.importItems = attachTrait(new NotifiableItemStackHandler(importSlots, IO.IN, IO.BOTH)); + this.exportItems = attachTrait(new NotifiableItemStackHandler(exportSlots, IO.OUT)); + this.exhaustVentTrait = attachTrait(new ExhaustVentMachineTrait()); + } + public SimpleSteamMachine(BlockEntityCreationInfo info, boolean isHighPressure) { super(info, isHighPressure); - this.importItems = attachTrait(createImportItemHandler()); - this.exportItems = attachTrait(createExportItemHandler()); + this.importItems = attachTrait( + new NotifiableItemStackHandler(getDefinition().getInputSize(ItemRecipeCapability.CAP, getRecipeTypes()), + IO.IN, IO.BOTH)); + this.exportItems = attachTrait( + new NotifiableItemStackHandler( + getDefinition().getOutputSize(ItemRecipeCapability.CAP, getRecipeTypes()), + IO.OUT)); this.exhaustVentTrait = attachTrait(new ExhaustVentMachineTrait()); exhaustVentTrait.setVentingDamageAmount(isHighPressure() ? 12F : 6F); @@ -63,18 +73,6 @@ public SimpleSteamMachine(BlockEntityCreationInfo info, boolean isHighPressure) } } - ////////////////////////////////////// - // ***** Initialization *****// - ////////////////////////////////////// - - protected NotifiableItemStackHandler createImportItemHandler() { - return new NotifiableItemStackHandler(getRecipeType().getMaxInputs(ItemRecipeCapability.CAP), IO.IN); - } - - protected NotifiableItemStackHandler createExportItemHandler() { - return new NotifiableItemStackHandler(getRecipeType().getMaxOutputs(ItemRecipeCapability.CAP), IO.OUT); - } - @Override public void onLoad() { super.onLoad(); @@ -106,8 +104,8 @@ public void setOutputFacing(Direction outputFacing) { var oldFacing = getOutputFacing(); super.setOutputFacing(outputFacing); if (getOutputFacing() != oldFacing) { - updateModelVentDirection(); exhaustVentTrait.setVentingDirection(outputFacing); + updateModelVentDirection(); } } @@ -160,42 +158,4 @@ public static ModifierFunction recipeModifier(MetaMachine machine, GTRecipe reci if (!steamMachine.isHighPressure) builder.durationMultiplier(2); return builder.build(); } - - @Override - public void afterWorking() { - super.afterWorking(); - exhaustVentTrait.setNeedsVenting(true); - exhaustVentTrait.checkVenting(); - } - - ////////////////////////////////////// - // *********** GUI ***********// - ////////////////////////////////////// - - @Override - public ModularUI createUI(Player entityPlayer) { - var storages = Tables.newCustomTable(new EnumMap<>(IO.class), LinkedHashMap, Object>::new); - storages.put(IO.IN, ItemRecipeCapability.CAP, importItems.storage); - storages.put(IO.OUT, ItemRecipeCapability.CAP, exportItems.storage); - - var group = getRecipeType().getRecipeUI().createUITemplate(recipeLogic::getProgressPercent, - storages, - new CompoundTag(), - Collections.emptyList(), - true, - isHighPressure); - Position pos = new Position((Math.max(group.getSize().width + 4 + 8, 176) - 4 - group.getSize().width) / 2 + 4, - 32); - group.setSelfPosition(pos); - return new ModularUI(176, 166, this, entityPlayer) - .background(GuiTextures.BACKGROUND_STEAM.get(isHighPressure)) - .widget(group) - .widget(new LabelWidget(5, 5, getBlockState().getBlock().getDescriptionId())) - .widget(new PredicatedImageWidget(pos.x + group.getSize().width / 2 - 9, - pos.y + group.getSize().height / 2 - 9, 18, 18, - GuiTextures.INDICATOR_NO_STEAM.get(isHighPressure)) - .setPredicate(recipeLogic::isWaiting)) - .widget(UITemplate.bindPlayerInventory(entityPlayer.getInventory(), - GuiTextures.SLOT_STEAM.get(isHighPressure), 7, 84, true)); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java index 2f0a1dec41d..e66e293a5c2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java @@ -3,15 +3,12 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.UITemplate; -import com.gregtechceu.gtceu.api.gui.widget.TankWidget; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.TickableSubscription; -import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; -import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.feature.*; +import com.gregtechceu.gtceu.api.machine.mui.MachineUIPanelBuilder; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; @@ -19,16 +16,10 @@ import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.common.item.behavior.PortableScannerBehavior; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.*; -import com.lowdragmc.lowdraglib.gui.modular.ModularUI; -import com.lowdragmc.lowdraglib.gui.texture.ProgressTexture; -import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; -import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; -import com.lowdragmc.lowdraglib.gui.widget.ProgressWidget; - -import net.minecraft.client.resources.language.I18n; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleTypes; @@ -38,22 +29,35 @@ import net.minecraft.sounds.SoundSource; import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.Block; import net.minecraftforge.fluids.FluidType; import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; +import brachy.modularui.api.drawable.Text; +import brachy.modularui.drawable.UITexture; +import brachy.modularui.drawable.progress.ProgressDrawable; +import brachy.modularui.factory.PosGuiData; +import brachy.modularui.screen.UISettings; +import brachy.modularui.value.sync.DoubleSyncValue; +import brachy.modularui.value.sync.FluidSlotSyncHandler; +import brachy.modularui.value.sync.PanelSyncManager; +import brachy.modularui.widget.ParentWidget; +import brachy.modularui.widgets.ProgressWidget; +import brachy.modularui.widgets.layout.Flow; +import brachy.modularui.widgets.slot.FluidSlot; import lombok.Getter; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collections; import java.util.List; +/** + * The base class for steam boilers + */ public abstract class SteamBoilerMachine extends SteamWorkableMachine - implements IUIMachine, IDataInfoProvider { + implements IMuiMachine, IDataInfoProvider { @SaveField public final NotifiableFluidTank waterTank; @@ -167,7 +171,9 @@ protected void updateCurrentTemperature() { currentTemperature -= getCoolDownRate(); timeBeforeCoolingDown = getCooldownInterval(); } - } else--timeBeforeCoolingDown; + } else { + --timeBeforeCoolingDown; + } if (getOffsetTimer() % 10 == 0) { if (currentTemperature >= 100) { @@ -181,7 +187,9 @@ protected void updateCurrentTemperature() { } if (this.hasNoWater && hasDrainedWater) { GTUtil.doExplosion(getLevel(), getBlockPos(), 2.0f); - } else this.hasNoWater = !hasDrainedWater; + } else { + this.hasNoWater = !hasDrainedWater; + } if (filledSteam == 0 && hasDrainedWater && getLevel() instanceof ServerLevel serverLevel) { final float x = getBlockPos().getX() + 0.5F; final float y = getBlockPos().getY() + 0.5F; @@ -204,9 +212,12 @@ protected void updateCurrentTemperature() { // bypass capability check for special case behavior steamTank.drainInternal(FluidType.BUCKET_VOLUME * 4, FluidAction.EXECUTE); } - } else this.hasNoWater = false; + } else { + this.hasNoWater = false; + } } updateSteamSubscription(); + syncDataHolder.markClientSyncFieldDirty("currentTemperature"); } protected int getCooldownInterval() { @@ -276,7 +287,10 @@ public void afterWorking() { @Override protected InteractionResult onSoftMalletClick(ExtendedUseOnContext context) { - return InteractionResult.PASS; + if (!isRemote()) { + context.getPlayer().sendSystemMessage(Component.translatable("behaviour.soft_hammer.ignored")); + } + return InteractionResult.sidedSuccess(getLevel().isClientSide); } @Override @@ -294,27 +308,41 @@ public InteractionResult onUseWithItem(ExtendedUseOnContext context) { ////////////////////////////////////// @Override - public ModularUI createUI(Player entityPlayer) { - return new ModularUI(176, 166, this, entityPlayer) - .background(GuiTextures.BACKGROUND_STEAM.get(isHighPressure)) - .widget(new LabelWidget(6, 6, getBlockState().getBlock().getDescriptionId())) - .widget(new ProgressWidget(this::getTemperaturePercent, 96, 26, 10, 54) - .setProgressTexture(GuiTextures.PROGRESS_BAR_BOILER_EMPTY.get(isHighPressure), - GuiTextures.PROGRESS_BAR_BOILER_HEAT) - .setFillDirection(ProgressTexture.FillDirection.DOWN_TO_UP) - .setDynamicHoverTips(pct -> I18n.get("gtceu.multiblock.large_boiler.temperature", - currentTemperature + 274, getMaxTemperature() + 274))) - .widget(new TankWidget(waterTank.getStorages()[0], 83, 26, 10, 54, false, true) - .setShowAmount(false) - .setFillDirection(ProgressTexture.FillDirection.DOWN_TO_UP) - .setBackground(GuiTextures.PROGRESS_BAR_BOILER_EMPTY.get(isHighPressure))) - .widget(new TankWidget(steamTank.getStorages()[0], 70, 26, 10, 54, true, false) - .setShowAmount(false) - .setFillDirection(ProgressTexture.FillDirection.DOWN_TO_UP) - .setBackground(GuiTextures.PROGRESS_BAR_BOILER_EMPTY.get(isHighPressure))) - .widget(new ImageWidget(43, 44, 18, 18, GuiTextures.CANISTER_OVERLAY_STEAM.get(isHighPressure))) - .widget(UITemplate.bindPlayerInventory(entityPlayer.getInventory(), - GuiTextures.SLOT_STEAM.get(isHighPressure), 7, 84, true)); + public MachineUIPanelBuilder getPanelBuilder(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { + return MachineUIPanelBuilder.defaultSteamMachinePanelBuilder(this); + } + + @Override + public void buildMainUI(ParentWidget mainWidget, PosGuiData guiData, PanelSyncManager syncManager, + UISettings settings) { + UITexture progressTexture = isHighPressure() ? GTGuiTextures.PROGRESS_BAR_BOILER_EMPTY_STEEL : + GTGuiTextures.PROGRESS_BAR_BOILER_EMPTY_BRONZE; + + DoubleSyncValue tempPercentage = syncManager.getOrCreateSyncHandler("tempPercentage", DoubleSyncValue.class, + () -> new DoubleSyncValue(this::getTemperaturePercent)); + + mainWidget.child(Flow.row() + .top(12) + .left(50) + .coverChildren() + .childPadding(10) + .child(new FluidSlot() + .syncHandler(new FluidSlotSyncHandler(waterTank.getStorages()[0])) + .size(14, 54) + .alwaysShowFull(true)) + .child(new FluidSlot() + .syncHandler(new FluidSlotSyncHandler(steamTank.getStorages()[0]) + .canFillSlot(false).canDrainSlot(true)) + .alwaysShowFull(true) + .size(14, 54)) + .child(new ProgressWidget() + .texture(progressTexture, + GTGuiTextures.PROGRESS_BAR_BOILER_HEAT, ProgressDrawable.Direction.UP) + .size(14, 54) + .value(tempPercentage) + .tooltipAutoUpdate(true) + .tooltipBuilder((r) -> r.addLine(Text + .lang("gtceu.fluid.temperature", getCurrentTemperature()))))); } ////////////////////////////////////// @@ -350,7 +378,6 @@ protected void randomDisplayTick(RandomSource random, float x, float y, float z) getLevel().addParticle(ParticleTypes.FLAME, x, y, z, 0, 0, 0); } - @NotNull @Override public List getDataInfo(PortableScannerBehavior.DisplayMode mode) { if (mode == PortableScannerBehavior.DisplayMode.SHOW_ALL || diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamEnergyRecipeHandler.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamEnergyRecipeHandler.java index ab2e69cb39a..d3df9ced0b2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamEnergyRecipeHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamEnergyRecipeHandler.java @@ -4,7 +4,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.ingredient.EnergyStack; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; @@ -13,13 +13,14 @@ import net.minecraftforge.fluids.FluidStack; -import org.jetbrains.annotations.NotNull; +import lombok.Getter; import java.util.ArrayList; import java.util.List; public class SteamEnergyRecipeHandler implements IRecipeHandler { + @Getter private final NotifiableFluidTank steamTank; private final double conversionRate; // mB steam per EU @@ -29,7 +30,8 @@ public SteamEnergyRecipeHandler(NotifiableFluidTank steamTank, double conversion } @Override - public List handleRecipeInner(IO io, GTRecipe recipe, List left, boolean simulate) { + public List handleRecipeInner(IO io, GTRecipe recipe, List left, + boolean simulate) { for (var it = left.listIterator(); it.hasNext();) { EnergyStack stack = it.next(); if (stack.isEmpty()) { @@ -45,7 +47,7 @@ public List handleRecipeInner(IO io, GTRecipe recipe, List(); list.add(steam); var leftSteam = steamTank.handleRecipeInner(io, recipe, list, simulate); - if (leftSteam == null || leftSteam.isEmpty()) { + if (leftSteam.isEmpty()) { it.remove(); } else { totalEU = (long) (leftSteam.get(0).getAmount() / conversionRate); @@ -53,11 +55,11 @@ public List handleRecipeInner(IO io, GTRecipe recipe, List getContents() { + public List getContents() { List tankContents = new ArrayList<>(); for (int i = 0; i < steamTank.getTanks(); ++i) { FluidStack stack = steamTank.getFluidInTank(i); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamMachine.java index 5d7943b3bed..04bf3daef0f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamMachine.java @@ -4,12 +4,10 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; -import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.data.GTMaterials; -import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraftforge.fluids.FluidType; import lombok.Getter; @@ -19,8 +17,6 @@ */ public abstract class SteamMachine extends MetaMachine implements ITieredMachine { - public static final BooleanProperty STEEL_PROPERTY = GTMachineModelProperties.IS_STEEL_MACHINE; - @Getter public final boolean isHighPressure; @SaveField diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java index 68a90d4de2b..26453f09820 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java @@ -4,28 +4,31 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; -import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.feature.IMufflableMachine; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; -import com.gregtechceu.gtceu.api.machine.trait.*; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.recipe.IRecipeHandlerTrait; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.machine.trait.CleanroomReceiverTrait; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import com.gregtechceu.gtceu.utils.ISubscription; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.fluids.FluidType; +import brachy.modularui.drawable.UITexture; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import lombok.Getter; import lombok.Setter; @@ -74,6 +77,7 @@ public SteamWorkableMachine(BlockEntityCreationInfo info, boolean isHighPressure this.activeRecipeType = 0; this.cleanroomReceiver = attachTrait(new CleanroomReceiverTrait()); this.recipeLogic = attachTrait(recipeLogic); + this.recipeLogic.setKeepSubscribing(false); this.capabilitiesProxy = new EnumMap<>(IO.class); this.capabilitiesFlat = new EnumMap<>(IO.class); this.traitSubscriptions = new ArrayList<>(); @@ -100,10 +104,8 @@ public void onLoad() { // attach self traits Map>> ioTraits = new Object2ObjectOpenHashMap<>(); - for (MachineTrait trait : getAllTraits()) { - if (trait instanceof IRecipeHandlerTrait handlerTrait) { - ioTraits.computeIfAbsent(handlerTrait.getHandlerIO(), i -> new ArrayList<>()).add(handlerTrait); - } + for (var trait : getTraitHolder().getTraitsByInterface(IRecipeHandlerTrait.class)) { + ioTraits.computeIfAbsent(trait.getHandlerIO(), i -> new ArrayList<>()).add(trait); } for (var entry : ioTraits.entrySet()) { @@ -162,11 +164,6 @@ protected InteractionResult onWrenchClick(ExtendedUseOnContext context) { return super.onWrenchClick(context); } - @Override - public boolean keepSubscribing() { - return false; - } - @Override public GTRecipeType getRecipeType() { return recipeTypes[activeRecipeType]; @@ -186,15 +183,15 @@ public void clientTick() { // ******* Rendering ********// ////////////////////////////////////// @Override - public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { + public @Nullable UITexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, + ItemStack held, Direction side) { if (toolTypes.contains(GTToolType.WRENCH)) { if (!player.isShiftKeyDown()) { if (!hasFrontFacing() || side != getFrontFacing()) { - return GuiTextures.TOOL_IO_FACING_ROTATION; + return GTGuiTextures.TOOL_IO_FACING_ROTATION; } } } - return super.sideTips(player, pos, state, toolTypes, side); + return super.sideTips(player, pos, state, toolTypes, held, side); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java index 71413e83175..efa7a35371b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java @@ -2,8 +2,10 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.TickableSubscription; -import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; +import com.gregtechceu.gtceu.api.sync_system.managed.ISyncManaged; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.common.machine.trait.CleanroomProviderTrait; @@ -41,6 +43,9 @@ public abstract class MachineTrait implements ISyncManaged { @Setter protected Predicate<@Nullable Direction> capabilityValidator = $ -> true; + @Getter + @Setter(onMethod_ = @ApiStatus.Internal) + private @Nullable String traitName; /** * The trait's callback priority. Traits with a higher priority will have their events fired * first, which may prevent traits with a lower priority from handling some events. @@ -52,7 +57,8 @@ public abstract class MachineTrait implements ISyncManaged { public MachineTrait() {} public MetaMachine getMachine() { - if (machine == null) throw new IllegalStateException("Machine trait not attached to machine."); + if (machine == null) throw new IllegalStateException( + "Machine trait not attached to machine. Trait initialisation that depends on machine instance should run in onTraitAttached."); return machine; } @@ -82,7 +88,13 @@ public void setMachine(MetaMachine machine) { this.machine = machine; } - public abstract MachineTraitType getTraitType(); + /** + * Gets the trait type of this the machine. + * Overriders should return {@code MachineTraitType} instead of {@code MachineTrait}. + * + * @return The trait type. + */ + public abstract MachineTraitType getTraitType(); public @Nullable TickableSubscription subscribeServerTick(@Nullable TickableSubscription last, Runnable runnable) { return getMachine().subscribeServerTick(last, runnable); @@ -122,6 +134,11 @@ public void setRenderState(MachineRenderState state) { getMachine().setRenderState(state); } + /** + * Called when this trait is attached to a machine instance. + */ + public void onTraitAttached() {} + /** * Called when the machine is loaded. The entire world is not loaded when this method is called. * To schedule code to run on the first full world tick, do @@ -139,6 +156,22 @@ public void onMachineUnload() {} */ public void onMachineDestroyed() {} + /** + * Called when the machine is attached to a controller
+ * Only called if this trait is attached to a multiblock part machine. + * + * @param controller The multiblock controller + */ + public void addedToController(MultiblockControllerMachine controller) {} + + /** + * Called when the machine is removed from a controller
+ * Only called if this trait is attached to a multiblock part machine. + * + * @param controller The multiblock controller + */ + public void removedFromController(MultiblockControllerMachine controller) {} + /** * Called when a neighboring block is updated. * diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitHolder.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitHolder.java index decb4702f2e..2ab9145c04e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitHolder.java @@ -19,11 +19,18 @@ public final class MachineTraitHolder { private final MetaMachine machine; + + private boolean allowTraitAttachment = true; + private final List traits; private final Map, List> traitsByType; private final Map traitsToSave; + private @Nullable List allTraits = null; + + private final Map, List> traitsByClass = new Object2ObjectOpenHashMap<>(); + public MachineTraitHolder(MetaMachine machine) { this.machine = machine; this.traits = new ObjectArrayList<>(); @@ -35,7 +42,24 @@ public MachineTraitHolder(MetaMachine machine) { * @return An unmodifiable list of all traits attached to this machine. */ public @Unmodifiable List getAllTraits() { - return Collections.unmodifiableList(traits); + return allTraits != null ? allTraits : Collections.unmodifiableList(traits); + } + + /** + * Gets all traits implementing a specific interface/class + */ + @SuppressWarnings("unchecked") + public @Unmodifiable List getTraitsByInterface(Class clazz) { + if (traitsByClass.containsKey(clazz)) return (List) traitsByClass.get(clazz); + + List list = new ObjectArrayList<>(); + + for (var t : getAllTraits()) { + if (clazz.isAssignableFrom(t.getClass())) list.add(clazz.cast(t)); + } + + if (!allowTraitAttachment) traitsByClass.put(clazz, Collections.unmodifiableList(list)); + return list; } /** @@ -49,7 +73,7 @@ public T attachTrait(T trait) { } /** - * Attaches a trait to this machine. + * Attaches a trait to this machine. Traits must be attached before {@link MetaMachine#onLoad()}. * * @param trait The trait to attach * @param callbackPriority The trait's callback priority. Traits with a higher priority will have their events fired @@ -57,6 +81,9 @@ public T attachTrait(T trait) { * @return The attached trait */ public T attachTrait(T trait, int callbackPriority) { + if (!allowTraitAttachment) + throw new IllegalStateException("Cannot add traits to machine after machine has been loaded."); + trait.setTraitPriority(callbackPriority); var traitType = trait.getTraitType(); @@ -72,9 +99,40 @@ public T attachTrait(T trait, int callbackPriority) { traits.sort(Comparator.comparingInt(MachineTrait::getTraitPriority).reversed()); trait.setMachine(machine); + trait.onTraitAttached(); return trait; } + /** + * Registers a trait with data to be saved or synced to the client. + * Do not register a persistent trait and also store that trait as a syncable machine field, otherwise the trait + * data will be duplicated. Use only one sync method.
+ * Note: Persistent traits must be attached before data load, or they will not be loaded correctly. + * + * @param traitName Unique identifier for this trait. + * @param trait The trait to register + */ + public void attachPersistentTrait(String traitName, MachineTrait trait) { + attachTrait(trait); + registerPersistentTrait(traitName, trait); + } + + /** + * Registers a trait with data to be saved or synced to the client. + * Do not register a persistent trait and also store that trait as a syncable machine field, otherwise the trait + * data will be duplicated. Use only one sync method.
+ * Note: Persistent traits must be attached before data load, or they will not be loaded correctly. + * + * @param traitName Unique identifier for this trait. + * @param callbackPriority The trait's callback priority. Traits with a higher priority will have their events fired + * first, which may prevent traits with a lower priority from handling some events. + * @param trait The trait to register + */ + public void attachPersistentTrait(String traitName, MachineTrait trait, int callbackPriority) { + attachTrait(trait, callbackPriority); + registerPersistentTrait(traitName, trait); + } + /** * Registers a trait with data to be saved or synced to the client. * Do not register a persistent trait and also store that trait as a syncable machine field, otherwise the trait @@ -87,6 +145,7 @@ public MachineTraitHolder registerPersistentTrait(String traitName, MachineTrait if (trait.getMachine() != machine) throw new IllegalArgumentException("Trait does not belong to this machine."); if (traitsToSave.containsKey(traitName)) throw new IllegalArgumentException("Attempted to register duplicate trait save key \"" + traitName + "\""); + trait.setTraitName(traitName); traitsToSave.put(traitName, trait); return this; } @@ -137,6 +196,14 @@ public Optional getTraitOptional(MachineTraitType return Collections.unmodifiableList(traitList); } + public void machineLoaded() { + allowTraitAttachment = false; + + // Cache traits so that repeated unmodifiableList calls aren't required. + + allTraits = Collections.unmodifiableList(traits); + } + private static class MachineTraitHolderTransformer implements ValueTransformer { @Override @@ -164,7 +231,7 @@ public Tag serializeNBT(MachineTraitHolder value, TransformerContext> validMachineClasses() { - return List.of(IRecipeLogicMachine.class); - } - - @Override - public long getInputAmperage() { - var recipeLogic = getMachine().getTrait(RecipeLogic.TYPE); - if (recipeLogic == null) return 0; - var lastRecipe = recipeLogic.getLastRecipe(); - long amperage; - if (lastRecipe != null) { - amperage = lastRecipe.getInputEUt().amperage(); - } else { - amperage = super.getInputAmperage(); - } - if (getEnergyCapacity() / 2 > getEnergyStored() && recipeLogic.isActive()) { - return amperage + 1; - } else { - return amperage; - } - } - - @Override - public long getOutputAmperage() { - var recipeLogic = getMachine().getTrait(RecipeLogic.TYPE); - if (recipeLogic == null) return 0; - var lastRecipe = recipeLogic.getLastRecipe(); - if (lastRecipe != null) { - return lastRecipe.getOutputEUt().amperage(); - } else { - return super.getOutputAmperage(); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IAttachConfiguratorsTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IAttachConfiguratorsTrait.java new file mode 100644 index 00000000000..10897a81b09 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IAttachConfiguratorsTrait.java @@ -0,0 +1,12 @@ +package com.gregtechceu.gtceu.api.machine.trait.feature; + +import brachy.modularui.screen.ModularPanel; +import brachy.modularui.value.sync.PanelSyncManager; +import brachy.modularui.widgets.layout.Flow; + +public interface IAttachConfiguratorsTrait { + + default void attachLeftConfigurators(Flow flow, ModularPanel panel, PanelSyncManager syncManager) {} + + default void attachRightConfigurators(Flow flow, ModularPanel panel, PanelSyncManager syncManager) {} +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRecipeLogicModifierTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRecipeLogicModifierTrait.java new file mode 100644 index 00000000000..5c7e84a687f --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRecipeLogicModifierTrait.java @@ -0,0 +1,62 @@ +package com.gregtechceu.gtceu.api.machine.trait.feature; + +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; + +import org.jetbrains.annotations.Nullable; + +/** + * A machine trait that modifies the behaviour of the recipe logic instance attached to a machine + */ +@SuppressWarnings("unused") +public interface IRecipeLogicModifierTrait { + + /** + * Called when the recipe logic status changes + * + * @param oldStatus Old recipe logic status + * @param newStatus New recipe logic status + */ + default void recipeLogicStatusChanged(RecipeLogic.Status oldStatus, RecipeLogic.Status newStatus) {} + + /** + * Override to modify recipe on the fly e.g. applying overclock, change chance, etc + * + * @param recipe The current recipe + * @return modified recipe. + * null -- this recipe is unavailable + */ + @Nullable + default GTRecipe modifyRecipe(GTRecipe recipe) { + return recipe; + } + + /** + * Called when a recipe is about to be run, just before inputs are consumed. + * + * @return true to cancel the recipe, false to continue + * + * @see RecipeLogic#setupRecipe(GTRecipe) + */ + default boolean beforeWorking(@Nullable GTRecipe recipe) { + return true; + } + + /** + * Called every tick while the recipe is working. + * + * @return true to interrupt and suspend the recipe, false to continue working + * + * @see RecipeLogic#handleRecipeWorking() + */ + default boolean onWorking() { + return true; + } + + /** + * Called when the recipe finishes, before outputs are produced. + * + * @see RecipeLogic#onRecipeFinish() + */ + default void afterWorking() {} +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java index 6a2dc1a9296..946f21206c7 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java @@ -2,14 +2,13 @@ import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; +import brachy.modularui.drawable.UITexture; import org.jetbrains.annotations.Nullable; import java.util.Set; @@ -21,7 +20,7 @@ public interface IRenderingTrait { /** * Called to determine if the grid overlay should be rendered on this machine. - * + * * @param player Player looking at this machine * @param pos Block pos * @param state Block state @@ -37,17 +36,18 @@ default boolean shouldRenderGridOverlay(Player player, BlockPos pos, BlockState /** * Called when the machine grid overlay is being rendered to determine the icon to be rendered within the grid * segment on a specifc side. - * + * * @param player Player looking at this machine * @param pos Block pos * @param state Block state * @param toolTypes The GT tool types of the held item, if any + * @param held * @param side The machine side which this grid segment correspond to * @return The icon to be rendered, or null */ - default @Nullable ResourceTexture getGridOverlayIcon(Player player, BlockPos pos, BlockState state, - Set toolTypes, - Direction side) { + default @Nullable UITexture getGridOverlayIcon(Player player, BlockPos pos, BlockState state, + Set toolTypes, + ItemStack held, Direction side) { return null; } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/multiblock/MultiblockMachineTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/multiblock/MultiblockMachineTrait.java index ebf65460b7a..3377e15cc05 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/multiblock/MultiblockMachineTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/multiblock/MultiblockMachineTrait.java @@ -27,14 +27,18 @@ protected List> validMachineClasses() { /** * Called when the multiblock structure is formed * - * @see MultiblockControllerMachine#onStructureFormed() + * @param substructureName - the name of the substructure + * + * @see MultiblockControllerMachine#formStructure(String) */ - public void onStructureFormed() {} + public void onStructureFormed(String substructureName) {} /** * Called when the multiblock structure becomes invalid * - * @see MultiblockControllerMachine#onStructureInvalid() + * @param substructureName - the name of the substructure + * + * @see MultiblockControllerMachine#invalidateStructure(String) */ - public void onStructureInvalid() {} + public void onStructureInvalid(String substructureName) {} } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableComputationContainer.java similarity index 91% rename from src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java rename to src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableComputationContainer.java index 5c6d3309fdb..3632c2118d4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableComputationContainer.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.api.machine.trait; +package com.gregtechceu.gtceu.api.machine.trait.notifiable; import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.capability.GTCapability; @@ -7,8 +7,10 @@ import com.gregtechceu.gtceu.api.capability.IOpticalComputationReceiver; import com.gregtechceu.gtceu.api.capability.recipe.*; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; +import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.common.blockentity.OpticalPipeBlockEntity; import com.gregtechceu.gtceu.utils.GTUtil; @@ -66,7 +68,7 @@ public int requestCWUt(int cwut, boolean simulate, Collection seen) { // Ask the Multiblock controller, which *should* be an IOpticalComputationProvider if (machine instanceof IOpticalComputationProvider provider) { return provider.getMaxCWUt(seen); - } else if (machine instanceof IMultiPart part) { + } else if (machine instanceof MultiblockPartMachine part) { if (!part.isFormed()) { return 0; } @@ -119,7 +121,7 @@ public int getMaxCWUt(Collection seen) { if (controller instanceof IOpticalComputationProvider provider) { return provider.getMaxCWUt(seen); } - for (MachineTrait trait : controller.self().getAllTraits()) { + for (MachineTrait trait : controller.getAllTraits()) { if (trait instanceof IOpticalComputationProvider provider) { return provider.getMaxCWUt(seen); } @@ -152,7 +154,7 @@ public boolean canBridge(Collection seen) { // Ask the Multiblock controller, which *should* be an IOpticalComputationProvider if (machine instanceof IOpticalComputationProvider provider) { return provider.canBridge(seen); - } else if (machine instanceof IMultiPart part) { + } else if (machine instanceof MultiblockPartMachine part) { if (!part.isFormed()) { return false; } @@ -163,7 +165,7 @@ public boolean canBridge(Collection seen) { if (controller instanceof IOpticalComputationProvider provider) { return provider.canBridge(seen); } - for (MachineTrait trait : controller.self().getAllTraits()) { + for (MachineTrait trait : controller.getAllTraits()) { if (trait instanceof IOpticalComputationProvider provider) { return provider.canBridge(seen); } @@ -202,14 +204,12 @@ public List handleRecipeInner(IO io, GTRecipe recipe, List lef if (!simulate) { var machine = getMachine(); if (machine instanceof IRecipeLogicMachine rlm) { - // first, remove the progress the recipe logic adds. - rlm.getRecipeLogic().progress -= 1; - rlm.getRecipeLogic().progress += drawn; - } else if (machine instanceof IMultiPart multiPart) { + // remove the progress the recipe logic adds. + rlm.getRecipeLogic().setProgressDelta(drawn - 1); + } else if (machine instanceof MultiblockPartMachine multiPart) { for (MultiblockControllerMachine controller : multiPart.getControllers()) { if (controller instanceof IRecipeLogicMachine rlm) { - rlm.getRecipeLogic().progress -= 1; - rlm.getRecipeLogic().progress += drawn; + rlm.getRecipeLogic().setProgressDelta(drawn - 1); } } } @@ -226,7 +226,7 @@ public List handleRecipeInner(IO io, GTRecipe recipe, List lef } sum = sum - canInput; } - return sum <= 0 ? List.of() : Collections.singletonList(sum); + return sum <= 0 ? Collections.emptyList() : Collections.singletonList(sum); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableEnergyContainer.java similarity index 97% rename from src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java rename to src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableEnergyContainer.java index 6d740289fee..28ae4127e95 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableEnergyContainer.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.api.machine.trait; +package com.gregtechceu.gtceu.api.machine.trait.notifiable; import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; @@ -9,6 +9,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.ingredient.EnergyStack; @@ -41,7 +42,7 @@ public class NotifiableEnergyContainer extends NotifiableRecipeHandlerTrait getTraitType() { + public MachineTraitType getTraitType() { return TYPE; } @@ -310,8 +311,8 @@ public long changeEnergy(long energyToAdd) { } @Override - public @Nullable List handleRecipeInner(IO io, GTRecipe recipe, List left, - boolean simulate) { + public List handleRecipeInner(IO io, GTRecipe recipe, List left, + boolean simulate) { for (var it = left.listIterator(); it.hasNext();) { EnergyStack stack = it.next(); if (stack.isEmpty()) { @@ -336,7 +337,7 @@ public long changeEnergy(long energyToAdd) { } - return left.isEmpty() ? null : left; + return left; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableFluidTank.java similarity index 91% rename from src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java rename to src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableFluidTank.java index 52aaf68d894..e714e3ddf64 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableFluidTank.java @@ -1,8 +1,11 @@ -package com.gregtechceu.gtceu.api.machine.trait; +package com.gregtechceu.gtceu.api.machine.trait.notifiable; import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IFilteredHandler; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; +import com.gregtechceu.gtceu.api.machine.trait.ICapabilityTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; import com.gregtechceu.gtceu.api.recipe.ingredient.IntProviderFluidIngredient; @@ -60,6 +63,7 @@ public NotifiableFluidTank(int slots, int capacity, IO io, IO capabilityIO) { this.storages[i] = new CustomFluidTank(capacity); this.storages[i].setOnContentsChanged(this::onContentsChanged); } + this.lockedFluid.setOnContentsChanged(this::onLockedFluidChanged); } public NotifiableFluidTank(List storages, IO io, IO capabilityIO) { @@ -73,6 +77,7 @@ public NotifiableFluidTank(List storages, IO io, IO capabilityI if (io == IO.IN) { this.allowSameFluids = true; } + this.lockedFluid.setOnContentsChanged(this::onLockedFluidChanged); } public NotifiableFluidTank(int slots, int capacity, IO io) { @@ -89,11 +94,31 @@ public void onContentsChanged() { notifyListeners(); } + protected void onLockedFluidChanged() { + syncDataHolder.markClientSyncFieldDirty("lockedFluid"); + var newFluid = this.lockedFluid.getFluid(); + if (newFluid.isEmpty()) { + this.setFilter(stack -> true); + this.onContentsChanged(); + return; + } + for (int i = 0; i < this.getTanks(); i++) { + if (this.getFluidInTank(i).isEmpty()) continue; + if (!this.getFluidInTank(i).isFluidEqual(newFluid)) { + // Fluid in a tank that doesn't equal the new locked fluid + this.lockedFluid.setFluid(FluidStack.EMPTY); + return; + } + } + this.setFilter(stack -> stack.isFluidEqual(newFluid)); + this.onContentsChanged(); + } + @Override - public @Nullable List handleRecipeInner(IO io, GTRecipe recipe, List left, - boolean simulate) { + public List handleRecipeInner(IO io, GTRecipe recipe, List left, + boolean simulate) { if (io != handlerIO) return left; - if (io != IO.IN && io != IO.OUT) return left.isEmpty() ? null : left; + if (io != IO.IN && io != IO.OUT) return left; // Temporarily remove listeners so that we can broadcast the entire set of transactions once Runnable[] listeners = new Runnable[storages.length]; @@ -217,7 +242,7 @@ public void onContentsChanged() { if (changed && action.execute()) listeners[i].run(); } - return left.isEmpty() ? null : left; + return left; } @Override @@ -227,7 +252,8 @@ public boolean test(FluidIngredient ingredient) { @Override public int getPriority() { - return !isLocked() || lockedFluid.getFluid().isEmpty() ? super.getPriority() : HIGH - getTanks(); + return !isLocked() || lockedFluid.getFluid().isEmpty() ? super.getPriority() : + IFilteredHandler.HIGH - getTanks(); } public boolean isLocked() { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableItemStackHandler.java similarity index 94% rename from src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java rename to src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableItemStackHandler.java index 991ea6b4ed4..0800410eee5 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableItemStackHandler.java @@ -1,9 +1,11 @@ -package com.gregtechceu.gtceu.api.machine.trait; +package com.gregtechceu.gtceu.api.machine.trait.notifiable; import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; +import com.gregtechceu.gtceu.api.machine.trait.ICapabilityTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.api.recipe.DummyCraftingContainer; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.ingredient.IntProviderIngredient; @@ -87,18 +89,18 @@ public void onContentsChanged() { } @Override - public @Nullable List handleRecipeInner(IO io, GTRecipe recipe, List left, - boolean simulate) { + public List handleRecipeInner(IO io, GTRecipe recipe, List left, + boolean simulate) { return handleRecipe(io, recipe, left, simulate, handlerIO, storage); } // TODO: See if implementable in outside callers and unstatic; or move to different common class if not // Notable caller is ItemRecipeHandler, used for MinerLogic - public static @Nullable List handleRecipe(IO io, GTRecipe recipe, List left, - boolean simulate, - IO handlerIO, CustomItemStackHandler storage) { + public static List handleRecipe(IO io, GTRecipe recipe, List left, + boolean simulate, + IO handlerIO, CustomItemStackHandler storage) { if (io != handlerIO) return left; - if (io != IO.IN && io != IO.OUT) return left.isEmpty() ? null : left; + if (io != IO.IN && io != IO.OUT) return left; // Temporarily remove listener so that we can broadcast the entire set of transactions once Runnable listener = storage.getOnContentsChanged(); @@ -194,7 +196,7 @@ public void onContentsChanged() { storage.setOnContentsChanged(listener); if (changed && !simulate) listener.run(); - return left.isEmpty() ? null : left; + return left; } private static @Nullable ItemStack getActioned(CustomItemStackHandler storage, int index, List actions) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableLaserContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableLaserContainer.java similarity index 96% rename from src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableLaserContainer.java rename to src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableLaserContainer.java index 0e3d5c0299a..31e7a246a0e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableLaserContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableLaserContainer.java @@ -1,7 +1,8 @@ -package com.gregtechceu.gtceu.api.machine.trait; +package com.gregtechceu.gtceu.api.machine.trait.notifiable; import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.ILaserContainer; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.MethodsReturnNonnullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableRecipeHandlerTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableRecipeHandlerTrait.java similarity index 83% rename from src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableRecipeHandlerTrait.java rename to src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableRecipeHandlerTrait.java index 558a57ee379..b95e6d24314 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableRecipeHandlerTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableRecipeHandlerTrait.java @@ -1,5 +1,7 @@ -package com.gregtechceu.gtceu.api.machine.trait; +package com.gregtechceu.gtceu.api.machine.trait.notifiable; +import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.machine.trait.recipe.IRecipeHandlerTrait; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.ISubscription; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/package-info.java new file mode 100644 index 00000000000..a995d7fca0c --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.api.machine.trait.notifiable; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/IRecipeHandlerTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/IRecipeHandlerTrait.java similarity index 87% rename from src/main/java/com/gregtechceu/gtceu/api/machine/trait/IRecipeHandlerTrait.java rename to src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/IRecipeHandlerTrait.java index 9ca83d5bb52..cf13c28b4ae 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/IRecipeHandlerTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/IRecipeHandlerTrait.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.api.machine.trait; +package com.gregtechceu.gtceu.api.machine.trait.recipe; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerGroup.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeHandlerGroup.java similarity index 68% rename from src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerGroup.java rename to src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeHandlerGroup.java index 256246aa8ea..136a9851ef2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerGroup.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeHandlerGroup.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.api.machine.trait; +package com.gregtechceu.gtceu.api.machine.trait.recipe; public interface RecipeHandlerGroup { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerGroupColor.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeHandlerGroupColor.java similarity index 80% rename from src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerGroupColor.java rename to src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeHandlerGroupColor.java index 99314feb0c8..ebcc20bed38 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerGroupColor.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeHandlerGroupColor.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.api.machine.trait; +package com.gregtechceu.gtceu.api.machine.trait.recipe; public record RecipeHandlerGroupColor(int color) implements RecipeHandlerGroup { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerGroupDistinctness.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeHandlerGroupDistinctness.java similarity index 67% rename from src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerGroupDistinctness.java rename to src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeHandlerGroupDistinctness.java index d853244ba7b..529035b2ee7 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerGroupDistinctness.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeHandlerGroupDistinctness.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.api.machine.trait; +package com.gregtechceu.gtceu.api.machine.trait.recipe; public enum RecipeHandlerGroupDistinctness implements RecipeHandlerGroup { BUS_DISTINCT, diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerList.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeHandlerList.java similarity index 95% rename from src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerList.java rename to src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeHandlerList.java index d996db0b908..c127d74eb95 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerList.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeHandlerList.java @@ -1,8 +1,9 @@ -package com.gregtechceu.gtceu.api.machine.trait; +package com.gregtechceu.gtceu.api.machine.trait.recipe; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableRecipeHandlerTrait; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.utils.ISubscription; @@ -183,8 +184,12 @@ public Map, List> handleRecipe(IO io, GTRecipe recip var entry = it.next(); var handlerList = getCapability(entry.getKey()); for (var handler : handlerList) { + if (io == IO.IN && handler.getTotalContentAmount() == 0 && + !handler.getCapability().skipEmptyContentCheck()) { + continue; + } var left = handler.handleRecipe(io, recipe, entry.getValue(), simulate); - if (left == null) { + if (left.isEmpty()) { it.remove(); break; } else { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeLogic.java similarity index 90% rename from src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java rename to src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeLogic.java index 4b0d00c5ed9..bad225a5446 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeLogic.java @@ -1,17 +1,17 @@ -package com.gregtechceu.gtceu.api.machine.trait; +package com.gregtechceu.gtceu.api.machine.trait.recipe; import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.capability.IWorkable; import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.fancy.IFancyTooltip; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; +import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.api.recipe.ActionResult; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; @@ -27,8 +27,6 @@ import com.gregtechceu.gtceu.common.cover.MachineControllerCover; import com.gregtechceu.gtceu.utils.GTMath; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; - import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; @@ -47,7 +45,7 @@ import java.util.*; -public class RecipeLogic extends MachineTrait implements IWorkable, IFancyTooltip { +public class RecipeLogic extends MachineTrait implements IWorkable { public static final MachineTraitType TYPE = new MachineTraitType<>(RecipeLogic.class, false); @@ -143,6 +141,30 @@ public enum Status implements StringRepresentable { protected @Nullable TickableSubscription subscription; protected @Nullable Object workingSound; + /** + * If recipe progress should decrease when machine is waiting for pertick ingredients. (e.g. lack of EU) + */ + @Getter + @Setter + protected boolean regressWhenWaiting; + + /** + * Whether the recipe logic should keep subscribing tick logic when no recipe is available after one cycle. + * if false. you should call {@link RecipeLogic#updateTickSubscription()} manually later to active recipe logic + * again. + */ + @Getter + @Setter + protected boolean keepSubscribing = true; + + /** + * If recipe modifiers should always been applied before setting up a recipe.
+ * If true, recipe modifiers will always be applied, even if the previous recipe can be run again.
+ * If false, the previous recipe will be run again without reapplying modifiers.
+ * Defaults to true, so that recipes will always attempt to update OC, parallels, etc. + */ + protected boolean alwaysTryModifyRecipe = true; + public RecipeLogic() { super(); } @@ -184,6 +206,12 @@ public void resetRecipeLogic() { getSyncDataHolder().resyncAllFields(); } + @Override + public void onTraitAttached() { + super.onTraitAttached(); + regressWhenWaiting = getMachine().getDefinition().isRegressWhenWaiting(); + } + @Override public void onMachineLoad() { super.onMachineLoad(); @@ -206,6 +234,10 @@ public void setProgress(int progress) { syncDataHolder.markClientSyncFieldDirty("progress"); } + public void setProgressDelta(int delta) { + setProgress(getProgress() + delta); + } + public double getProgressPercent() { return duration == 0 ? 0.0 : progress / (duration * 1.0); } @@ -232,7 +264,7 @@ public void serverTick() { } } else if (lastRecipe != null) { findAndHandleRecipe(); - } else if (!getRLMachine().keepSubscribing() || getMachine().getOffsetTimer() % 5 == 0) { + } else if (!keepSubscribing || getMachine().getOffsetTimer() % 5 == 0) { findAndHandleRecipe(); if (lastFailedMatches != null) { for (GTRecipe match : lastFailedMatches) { @@ -245,7 +277,7 @@ public void serverTick() { if (isSuspend()) { // Machine is paused and can unsubscribe unsubscribe = true; - } else if (lastRecipe == null && isIdle() && !getRLMachine().keepSubscribing() && !recipeDirty && + } else if (lastRecipe == null && isIdle() && !keepSubscribing && !recipeDirty && lastFailedMatches == null) { // No recipes available and the machine wants to unsubscribe until notified unsubscribe = true; @@ -302,6 +334,7 @@ public void handleRecipeWorking() { } progress++; totalContinuousRunningTime++; + syncDataHolder.markClientSyncFieldDirty("progress"); } else { setWaiting(handleTick.reason()); @@ -340,8 +373,9 @@ public void handleRecipeWorking() { } protected void regressRecipe() { - if (progress > 0 && getRLMachine().regressWhenWaiting()) { + if (progress > 0 && regressWhenWaiting) { this.progress = 1; + syncDataHolder.markClientSyncFieldDirty("progress"); } } @@ -365,6 +399,7 @@ public void findAndHandleRecipe() { lastOriginRecipe = null; handleSearchingRecipes(searchRecipe()); } + syncDataHolder.markClientSyncFieldDirty("lastRecipe"); recipeDirty = false; } @@ -408,6 +443,7 @@ public void setupRecipe(GTRecipe recipe) { progress = 0; duration = 0; isActive = false; + syncDataHolder.resyncAllFields(); return; } var handledIO = handleRecipeIO(recipe, IO.IN); @@ -422,10 +458,12 @@ public void setupRecipe(GTRecipe recipe) { progress = 0; duration = recipe.duration; isActive = true; + syncDataHolder.resyncAllFields(); } } public void setStatus(Status status) { + if (isRemote()) return; if (this.status != status) { if (this.status == Status.WORKING) { this.totalContinuousRunningTime = 0; @@ -434,13 +472,14 @@ public void setStatus(Status status) { status = Status.SUSPEND; suspendAfterFinish = false; } - getRLMachine().notifyStatusChanged(this.status, status); + getRLMachine().recipeLogicStatusChanged(this.status, status); this.status = status; syncDataHolder.markClientSyncFieldDirty("status"); setRenderState(getRenderState().setValue(GTMachineModelProperties.RECIPE_LOGIC_STATUS, status)); updateTickSubscription(); if (this.status != Status.WAITING) { waitingReason = null; + syncDataHolder.markClientSyncFieldDirty("waitingReason"); } } } @@ -448,6 +487,7 @@ public void setStatus(Status status) { public void setWaiting(@Nullable Component reason) { setStatus(Status.WAITING); waitingReason = reason; + syncDataHolder.markClientSyncFieldDirty("waitingReason"); getRLMachine().onWaiting(); } @@ -481,6 +521,7 @@ public boolean isWorkingEnabled() { @Override public void setWorkingEnabled(boolean isWorkingAllowed) { + if (isRemote()) return; if (!isWorkingAllowed && getStatus() == Status.IDLE) { setStatus(Status.SUSPEND); } else { @@ -536,15 +577,17 @@ public void onRecipeFinish() { isActive = false; // Force a recipe recheck. lastRecipe = null; + syncDataHolder.resyncAllFields(); return; } - if (getRLMachine().alwaysTryModifyRecipe()) { + if (alwaysTryModifyRecipe) { if (lastOriginRecipe != null) { var modified = getRLMachine().fullModifyRecipe(lastOriginRecipe.copy()); if (modified == null) { markLastRecipeDirty(); } else { lastRecipe = modified; + syncDataHolder.markClientSyncFieldDirty("lastRecipe"); } } else { markLastRecipeDirty(); @@ -560,6 +603,7 @@ public void onRecipeFinish() { progress = 0; duration = 0; isActive = false; + syncDataHolder.resyncAllFields(); } } } @@ -581,6 +625,8 @@ public void interruptRecipe() { setStatus(Status.IDLE); progress = 0; duration = 0; + syncDataHolder.markClientSyncFieldDirty("progress"); + syncDataHolder.markClientSyncFieldDirty("duration"); } } @@ -612,16 +658,7 @@ public void updateSound() { } } - @Override - public IGuiTexture getFancyTooltipIcon() { - if (showFancyTooltip()) { - return GuiTextures.INSUFFICIENT_INPUT; - } - return IGuiTexture.EMPTY; - } - - @Override - public List getFancyTooltip() { + public List getWaitingReasons() { if (isWaiting() && waitingReason != null) { return List.of(waitingReason); } @@ -631,14 +668,9 @@ public List getFancyTooltip() { return Collections.emptyList(); } - @Override - public boolean showFancyTooltip() { - return waitingReason != null || !failureReasons.isEmpty(); - } - protected IdentityHashMap, Object2IntMap> makeChanceCaches() { IdentityHashMap, Object2IntMap> map = new IdentityHashMap<>(); - for (RecipeCapability cap : GTRegistries.RECIPE_CAPABILITIES.values()) { + for (RecipeCapability cap : GTRegistries.RECIPE_CAPABILITIES) { map.put(cap, cap.makeChanceCache()); } return map; @@ -664,7 +696,7 @@ public Tag serializeNBT(IdentityHashMap, Object2IntMap> v compoundTag.putInt("cached_chance", entry.getIntValue()); cacheTag.add(compoundTag); } - chanceCache.put(cap.name, cacheTag); + chanceCache.put(cap.id.toString(), cacheTag); }); return chanceCache; @@ -677,7 +709,7 @@ public Tag serializeNBT(IdentityHashMap, Object2IntMap> v context); if (context.currentValue() != null) { for (String key : chanceCache.getAllKeys()) { - RecipeCapability cap = GTRegistries.RECIPE_CAPABILITIES.get(key); + RecipeCapability cap = GTRegistries.RECIPE_CAPABILITIES.get(GTCEu.id(key)); // Necessary since a RecipeCapability was removed when removing Create support, // and for future // removals diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/package-info.java new file mode 100644 index 00000000000..45f65d332cd --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.api.machine.trait.recipe; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/misc/IgnoreEnergyRecipeHandler.java b/src/main/java/com/gregtechceu/gtceu/api/misc/IgnoreEnergyRecipeHandler.java index 37ec078d7ba..4746da2a019 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/misc/IgnoreEnergyRecipeHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/misc/IgnoreEnergyRecipeHandler.java @@ -9,13 +9,15 @@ import org.jetbrains.annotations.NotNull; +import java.util.Collections; import java.util.List; public class IgnoreEnergyRecipeHandler implements IRecipeHandler { @Override - public List handleRecipeInner(IO io, GTRecipe recipe, List left, boolean simulate) { - return null; + public @NotNull List handleRecipeInner(IO io, GTRecipe recipe, List left, + boolean simulate) { + return Collections.emptyList(); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/misc/ItemRecipeHandler.java b/src/main/java/com/gregtechceu/gtceu/api/misc/ItemRecipeHandler.java index 64bc1a0f32a..0f752a5605c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/misc/ItemRecipeHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/misc/ItemRecipeHandler.java @@ -4,7 +4,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; @@ -29,7 +29,8 @@ public ItemRecipeHandler(IO handlerIO, int slots) { } @Override - public List handleRecipeInner(IO io, GTRecipe recipe, List left, boolean simulate) { + public @NotNull List handleRecipeInner(IO io, GTRecipe recipe, List left, + boolean simulate) { return NotifiableItemStackHandler.handleRecipe(io, recipe, left, simulate, this.handlerIO, storage); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/misc/forge/FluidTankHandler.java b/src/main/java/com/gregtechceu/gtceu/api/misc/forge/FluidTankHandler.java new file mode 100644 index 00000000000..7c2e533a3ce --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/misc/forge/FluidTankHandler.java @@ -0,0 +1,62 @@ +package com.gregtechceu.gtceu.api.misc.forge; + +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidTank; +import net.minecraftforge.fluids.capability.IFluidHandler; + +import org.jetbrains.annotations.NotNull; + +public class FluidTankHandler implements IFluidHandler { + + public static IFluidHandler getTankFluidHandler(IFluidTank tank) { + if (tank instanceof IFluidHandler fluidHandler) { + return fluidHandler; + } + return new FluidTankHandler(tank); + } + + private final IFluidTank fluidTank; + + public FluidTankHandler(IFluidTank tank) { + this.fluidTank = tank; + } + + @Override + public int fill(FluidStack resource, FluidAction action) { + return this.fluidTank.fill(resource, action); + } + + @Override + public @NotNull FluidStack drain(FluidStack resource, FluidAction action) { + FluidStack currentFluid = this.fluidTank.getFluid(); + if (currentFluid.isEmpty() || !currentFluid.isFluidEqual(resource)) { + return FluidStack.EMPTY; + } + return this.fluidTank.drain(resource, action); + } + + @Override + public @NotNull FluidStack drain(int maxDrain, FluidAction action) { + return this.fluidTank.drain(maxDrain, action); + } + + @Override + public int getTanks() { + return 1; + } + + @Override + public @NotNull FluidStack getFluidInTank(int tank) { + return this.fluidTank.getFluid(); + } + + @Override + public int getTankCapacity(int tank) { + return this.fluidTank.getCapacity(); + } + + @Override + public boolean isFluidValid(int tank, @NotNull FluidStack stack) { + return this.fluidTank.isFluidValid(stack); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/EntryTypes.java b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/EntryTypes.java index a2b274cfc11..524effb6f65 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/EntryTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/EntryTypes.java @@ -31,14 +31,9 @@ private EntryTypes(ResourceLocation location, Supplier supplier) { this.factory = supplier; } - @Nullable - public static EntryTypes fromString(String name) { - return TYPES_MAP.getOrDefault(GTCEu.id(name), null); - } - @Nullable public static EntryTypes fromLocation(ResourceLocation location) { - return TYPES_MAP.getOrDefault(location, null); + return TYPES_MAP.get(location); } public static EntryTypes addEntryType(ResourceLocation location, Supplier supplier) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/VirtualEnderRegistry.java b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/VirtualEnderRegistry.java index d76b54600b8..00a9d6203ba 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/VirtualEnderRegistry.java +++ b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/VirtualEnderRegistry.java @@ -3,24 +3,20 @@ import com.gregtechceu.gtceu.GTCEu; import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.saveddata.SavedData; -import net.minecraftforge.server.ServerLifecycleHooks; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.function.Predicate; +import java.util.*; public class VirtualEnderRegistry extends SavedData { private static final String DATA_ID = GTCEu.MOD_ID + ".virtual_entry_data"; private static final String PUBLIC_KEY = "Public"; private static final String PRIVATE_KEY = "Private"; - private static volatile VirtualEnderRegistry data; + + private VirtualRegistryMap PUBLIC_REGISTRY = new VirtualRegistryMap(); private final Map VIRTUAL_REGISTRIES = new HashMap<>(); public VirtualEnderRegistry() {} @@ -29,43 +25,34 @@ public VirtualEnderRegistry(CompoundTag name) { readFromNBT(name); } - public static VirtualEnderRegistry getInstance() { - if (data == null) { - var server = ServerLifecycleHooks.getCurrentServer(); - if (server != null) { - data = server.overworld().getDataStorage() - .computeIfAbsent(VirtualEnderRegistry::new, VirtualEnderRegistry::new, DATA_ID); - } - } - - return data; + public static VirtualEnderRegistry get(ServerLevel sLvl) { + return sLvl.getServer().overworld().getDataStorage() + .computeIfAbsent(VirtualEnderRegistry::new, VirtualEnderRegistry::new, DATA_ID); } - /** - * To be called on server stopped event - */ - public static void release() { - if (data != null) { - data = null; - GTCEu.LOGGER.debug("VirtualEnderRegistry has been unloaded"); - } + public @Nullable T getEntry(@Nullable UUID owner, EntryTypes type, String name) { + if (owner == null) return PUBLIC_REGISTRY.getEntry(type, name); + return getRegistry(owner).getEntry(type, name); } - public T getEntry(@Nullable UUID owner, EntryTypes type, String name) { - return getRegistry(owner).getEntry(type, name); + public Map getEntries(@Nullable UUID owner, EntryTypes type) { + if (owner == null) return PUBLIC_REGISTRY.getEntries(type); + return VIRTUAL_REGISTRIES.get(owner).getEntries(type); } public void addEntry(@Nullable UUID owner, String name, VirtualEntry entry) { - getRegistry(owner).addEntry(name, entry); + if (owner == null) PUBLIC_REGISTRY.addEntry(name, entry); + else getRegistry(owner).addEntry(name, entry); } public boolean hasEntry(@Nullable UUID owner, EntryTypes type, String name) { + if (owner == null) return PUBLIC_REGISTRY.contains(type, name); return getRegistry(owner).contains(type, name); } - public @NotNull T getOrCreateEntry(@Nullable UUID owner, EntryTypes type, String name) { + public T getOrCreateEntry(@Nullable UUID owner, EntryTypes type, String name) { if (!hasEntry(owner, type, name)) addEntry(owner, name, type.createInstance()); - return getEntry(owner, type, name); + return Objects.requireNonNull(getEntry(owner, type, name)); } /** @@ -75,35 +62,33 @@ public boolean hasEntry(@Nullable UUID owner, EntryTypes type, String name) { * @param type Type of the registry to remove from * @param name The name of the entry */ - public void deleteEntry(@Nullable UUID owner, EntryTypes type, String name) { + public void forceDeleteEntry(@Nullable UUID owner, EntryTypes type, String name) { + if (owner == null) { + PUBLIC_REGISTRY.deleteEntry(type, name); + return; + } + var registry = getRegistry(owner); if (registry.contains(type, name)) { registry.deleteEntry(type, name); - return; } - GTCEu.LOGGER.warn("Attempted to delete {} entry {} of type {}, which does not exist", - owner == null ? "public" : String.format("private [%s]", owner), name, type); } - public void deleteEntryIf(@Nullable UUID owner, EntryTypes type, String name, - Predicate shouldDelete) { + public void tryDeleteEntry(@Nullable UUID owner, EntryTypes type, String name) { T entry = getEntry(owner, type, name); - if (entry != null && shouldDelete.test(entry)) deleteEntry(owner, type, name); - } - - public Set getEntryNames(UUID owner, EntryTypes type) { - return getRegistry(owner).getEntryNames(type); + if (entry == null) return; + if (entry.canRemove()) forceDeleteEntry(owner, type, name); } private VirtualRegistryMap getRegistry(UUID owner) { - if (data == null) getInstance(); - return data.VIRTUAL_REGISTRIES.computeIfAbsent(owner, key -> new VirtualRegistryMap()); + return VIRTUAL_REGISTRIES.computeIfAbsent(owner, key -> new VirtualRegistryMap()); } public final void readFromNBT(CompoundTag nbt) { if (nbt.contains(PUBLIC_KEY)) { - VIRTUAL_REGISTRIES.put(null, new VirtualRegistryMap(nbt.getCompound(PUBLIC_KEY))); + PUBLIC_REGISTRY = new VirtualRegistryMap(nbt.getCompound(PUBLIC_KEY)); } + if (nbt.contains(PRIVATE_KEY)) { CompoundTag privateEntries = nbt.getCompound(PRIVATE_KEY); for (String owner : privateEntries.getAllKeys()) { @@ -113,17 +98,14 @@ public final void readFromNBT(CompoundTag nbt) { } } - @NotNull @Override - public final CompoundTag save(@NotNull CompoundTag tag) { + public final CompoundTag save(CompoundTag tag) { var privateTag = new CompoundTag(); + tag.put(PUBLIC_KEY, PUBLIC_REGISTRY.serializeNBT()); for (var owner : VIRTUAL_REGISTRIES.keySet()) { + if (VIRTUAL_REGISTRIES.get(owner).isEmpty()) continue; var mapTag = VIRTUAL_REGISTRIES.get(owner).serializeNBT(); - if (owner != null) { - privateTag.put(owner.toString(), mapTag); - } else { - tag.put(PUBLIC_KEY, mapTag); - } + privateTag.put(owner.toString(), mapTag); } tag.put(PRIVATE_KEY, privateTag); return tag; diff --git a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/VirtualEntry.java b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/VirtualEntry.java index b4f8c322012..38851cc9fa1 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/VirtualEntry.java +++ b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/VirtualEntry.java @@ -6,7 +6,6 @@ import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; -import org.jetbrains.annotations.NotNull; import java.util.Locale; @@ -19,8 +18,8 @@ public abstract class VirtualEntry implements INBTSerializable { protected static final String DESC_KEY = "description"; @Setter - @NotNull private String description = ""; + @Getter private int color = 0xFFFFFFFF; private String colorStr = DEFAULT_COLOR; @@ -76,6 +75,6 @@ public void deserializeNBT(CompoundTag nbt) { } public boolean canRemove() { - return this.description.isEmpty(); + return this.description.isBlank(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/VirtualRegistryMap.java b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/VirtualRegistryMap.java index 3d48f8b0200..3601c71e247 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/VirtualRegistryMap.java +++ b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/VirtualRegistryMap.java @@ -1,21 +1,19 @@ package com.gregtechceu.gtceu.api.misc.virtualregistry; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.common.util.INBTSerializable; -import org.jetbrains.annotations.NotNull; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import org.jetbrains.annotations.Nullable; -import java.util.Collections; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; +import java.util.*; public class VirtualRegistryMap implements INBTSerializable { - private final Map, Map> registryMap = new ConcurrentHashMap<>(); + private final Map, Map> registryMap = new Object2ObjectOpenHashMap<>(); public VirtualRegistryMap() {} @@ -29,7 +27,11 @@ public VirtualRegistryMap(CompoundTag tag) { } public void addEntry(String name, VirtualEntry entry) { - registryMap.computeIfAbsent(entry.getType(), k -> new ConcurrentHashMap<>()).put(name, entry); + registryMap.computeIfAbsent(entry.getType(), k -> new Object2ObjectOpenHashMap<>()).put(name, entry); + } + + public Map getEntries(EntryTypes type) { + return registryMap.getOrDefault(type, new Object2ObjectOpenHashMap<>()); } public boolean contains(EntryTypes type, String name) { @@ -50,17 +52,18 @@ public void clear() { registryMap.clear(); } - public Set getEntryNames(EntryTypes type) { - return new HashSet<>(registryMap.getOrDefault(type, Collections.emptyMap()).keySet()); + public boolean isEmpty() { + return registryMap.isEmpty(); } @Override - public @NotNull CompoundTag serializeNBT() { + public CompoundTag serializeNBT() { CompoundTag tag = new CompoundTag(); for (Map.Entry, Map> entry : registryMap.entrySet()) { - CompoundTag entriesTag = new CompoundTag(); - for (Map.Entry subEntry : entry.getValue().entrySet()) { - entriesTag.put(subEntry.getKey(), subEntry.getValue().serializeNBT()); + ListTag entriesTag = new ListTag(); + for (VirtualEntry innerEntry : entry.getValue().values()) { + if (innerEntry.canRemove()) continue; + entriesTag.add(innerEntry.serializeNBT()); } tag.put(entry.getKey().toString(), entriesTag); } @@ -70,17 +73,30 @@ public Set getEntryNames(EntryTypes type) { @Override public void deserializeNBT(CompoundTag nbt) { for (String entryTypeString : nbt.getAllKeys()) { - EntryTypes type = entryTypeString.contains(":") ? - EntryTypes.fromLocation(ResourceLocation.tryParse(entryTypeString)) : - EntryTypes.fromString(entryTypeString); - + ResourceLocation entryTypeLoc = ResourceLocation.tryParse(entryTypeString); + if (entryTypeLoc == null) continue; + EntryTypes type = EntryTypes.fromLocation(entryTypeLoc); if (type == null) continue; - CompoundTag virtualEntries = nbt.getCompound(entryTypeString); - for (String name : virtualEntries.getAllKeys()) { - CompoundTag entryTag = virtualEntries.getCompound(name); - addEntry(name, type.createInstance(entryTag)); + Tag virtualEntries = nbt.get(entryTypeString); + + // backwards compat + if (virtualEntries instanceof CompoundTag compoundTag) { + for (String name : compoundTag.getAllKeys()) { + CompoundTag entryTag = compoundTag.getCompound(name); + VirtualEntry entry = type.createInstance(entryTag); + if (entry.canRemove()) continue; + addEntry(entry.getColorStr(), type.createInstance(entryTag)); + } + } else { + ListTag listTag = (ListTag) virtualEntries; + for (int i = 0; i < Objects.requireNonNull(listTag).size(); i++) { + var entry = type.createInstance(listTag.getCompound(i)); + if (entry.canRemove()) continue; + addEntry(entry.getColorStr(), entry); + } } + } } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/VirtualItemStorage.java b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/VirtualItemStorage.java index 755964107b0..80296879c10 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/VirtualItemStorage.java +++ b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/VirtualItemStorage.java @@ -8,7 +8,6 @@ import net.minecraft.nbt.CompoundTag; import lombok.Getter; -import org.jetbrains.annotations.NotNull; import javax.annotation.ParametersAreNonnullByDefault; @@ -18,7 +17,6 @@ public class VirtualItemStorage extends VirtualEntry { protected static final int DEFAULT_SLOT_AMOUNT = 1; - @NotNull @Getter private final CustomItemStackHandler handler; diff --git a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/VirtualRedstone.java b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/VirtualRedstone.java index 74a1cfc7987..ac6c1437540 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/VirtualRedstone.java +++ b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/VirtualRedstone.java @@ -2,21 +2,16 @@ import com.gregtechceu.gtceu.api.misc.virtualregistry.EntryTypes; import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEntry; - -import net.minecraft.nbt.CompoundTag; +import com.gregtechceu.gtceu.common.cover.ender.EnderRedstoneLinkCover; import it.unimi.dsi.fastutil.objects.Object2ShortMap; import it.unimi.dsi.fastutil.objects.Object2ShortOpenHashMap; import lombok.Getter; -import java.util.UUID; - public class VirtualRedstone extends VirtualEntry { - private static final String MEMBERS_KEY = "members"; - @Getter - private final Object2ShortMap members = new Object2ShortOpenHashMap<>(); + private final Object2ShortMap members = new Object2ShortOpenHashMap<>(); public VirtualRedstone() {} @@ -24,17 +19,17 @@ public int getSignal() { return members.values().intStream().max().orElse(0); } - public void addMember(UUID uuid) { - members.put(uuid, (short) 0); + public void addMember(EnderRedstoneLinkCover cover) { + members.put(cover, (short) 0); } - public void setSignal(UUID uuid, int signal) { - if (!members.containsKey(uuid)) return; - members.put(uuid, (short) signal); + public void setSignal(EnderRedstoneLinkCover cover, int signal) { + if (!members.containsKey(cover)) return; + members.put(cover, (short) signal); } - public void removeMember(UUID uuid) { - members.removeShort(uuid); + public void removeMember(EnderRedstoneLinkCover cover) { + members.removeShort(cover); } @Override @@ -42,25 +37,6 @@ public EntryTypes getType() { return EntryTypes.ENDER_REDSTONE; } - @Override - public CompoundTag serializeNBT() { - CompoundTag tag = super.serializeNBT(); - CompoundTag tag2 = new CompoundTag(); - for (var entry : members.object2ShortEntrySet()) - tag2.putShort(entry.getKey().toString(), entry.getShortValue()); - tag.put(MEMBERS_KEY, tag2); - return tag; - } - - @Override - public void deserializeNBT(CompoundTag nbt) { - super.deserializeNBT(nbt); - CompoundTag tag = nbt.getCompound(MEMBERS_KEY); - for (String uuid : tag.getAllKeys()) { - members.put(UUID.fromString(uuid), tag.getShort(uuid)); - } - } - @Override public boolean equals(Object o) { if (!(o instanceof VirtualRedstone other)) return false; diff --git a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/VirtualTank.java b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/VirtualTank.java index b142de09b9a..cc0c8d95ea4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/VirtualTank.java +++ b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/VirtualTank.java @@ -8,14 +8,12 @@ import net.minecraftforge.fluids.capability.templates.FluidTank; import lombok.Getter; -import org.jetbrains.annotations.NotNull; public class VirtualTank extends VirtualEntry { public static final int DEFAULT_CAPACITY = 160_000; // 160B for per second transfer protected static final String CAPACITY_KEY = "capacity"; protected static final String FLUID_KEY = "fluid"; - @NotNull @Getter private final FluidTank fluidTank; private int capacity; diff --git a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/package-info.java new file mode 100644 index 00000000000..d5df35c7c58 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/entries/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.api.misc.virtualregistry.entries; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/package-info.java new file mode 100644 index 00000000000..d99aeae2306 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/misc/virtualregistry/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.api.misc.virtualregistry; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/mui/GTGuiScreen.java b/src/main/java/com/gregtechceu/gtceu/api/mui/GTGuiScreen.java new file mode 100644 index 00000000000..e540344d402 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/mui/GTGuiScreen.java @@ -0,0 +1,33 @@ +package com.gregtechceu.gtceu.api.mui; + +import com.gregtechceu.gtceu.common.mui.GTGuiTheme; + +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import brachy.modularui.screen.ModularPanel; +import brachy.modularui.screen.ModularScreen; +import org.jetbrains.annotations.NotNull; + +import static com.gregtechceu.gtceu.GTCEu.MOD_ID; + +@OnlyIn(Dist.CLIENT) +public class GTGuiScreen extends ModularScreen { + + public GTGuiScreen(@NotNull ModularPanel mainPanel) { + this(mainPanel, GTGuiTheme.STANDARD); + } + + public GTGuiScreen(@NotNull ModularPanel mainPanel, GTGuiTheme theme) { + this(MOD_ID, mainPanel, theme); + } + + public GTGuiScreen(@NotNull String owner, @NotNull ModularPanel mainPanel, GTGuiTheme theme) { + this(owner, mainPanel, theme.getId()); + } + + public GTGuiScreen(String owner, ModularPanel mainPanel, String themeId) { + super(owner, mainPanel); + useTheme(themeId); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/mui/IItemUIHolder.java b/src/main/java/com/gregtechceu/gtceu/api/mui/IItemUIHolder.java new file mode 100644 index 00000000000..3a259070d63 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/mui/IItemUIHolder.java @@ -0,0 +1,53 @@ +package com.gregtechceu.gtceu.api.mui; + +import com.gregtechceu.gtceu.api.item.component.IInteractionItem; + +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import brachy.modularui.api.IUIHolder; +import brachy.modularui.factory.PlayerInventoryGuiData; +import brachy.modularui.factory.PlayerInventoryUIFactory; +import brachy.modularui.screen.ModularPanel; +import brachy.modularui.screen.ModularScreen; + +public interface IItemUIHolder extends IUIHolder>, IInteractionItem { + + default boolean shouldOpenUI() { + return true; + } + + @Override + default InteractionResultHolder use(Item item, Level level, Player player, InteractionHand usedHand) { + if (!shouldOpenUI()) return IInteractionItem.super.use(item, level, player, usedHand); + + if (!level.isClientSide) { + PlayerInventoryUIFactory.INSTANCE.openFromHand(player, usedHand); + } + return InteractionResultHolder.sidedSuccess(player.getItemInHand(usedHand), level.isClientSide); + } + + @Override + default InteractionResult useOn(UseOnContext context) { + if (!shouldOpenUI()) return IInteractionItem.super.useOn(context); + + if (!context.getLevel().isClientSide) { + PlayerInventoryUIFactory.INSTANCE.openFromHand(context.getPlayer(), context.getHand()); + } + return InteractionResult.sidedSuccess(context.getLevel().isClientSide); + } + + @Override + @OnlyIn(Dist.CLIENT) + default ModularScreen createScreen(PlayerInventoryGuiData data, ModularPanel mainPanel) { + return new GTGuiScreen(mainPanel); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/mui/MultiblockSchemaInfo.java b/src/main/java/com/gregtechceu/gtceu/api/mui/MultiblockSchemaInfo.java new file mode 100644 index 00000000000..a4b296144ef --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/mui/MultiblockSchemaInfo.java @@ -0,0 +1,126 @@ +package com.gregtechceu.gtceu.api.mui; + +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.multiblock.PatternPredicate; +import com.gregtechceu.gtceu.api.multiblock.pattern.BlockPattern; +import com.gregtechceu.gtceu.api.multiblock.pattern.ExpandablePattern; +import com.gregtechceu.gtceu.api.multiblock.pattern.IBlockPattern; +import com.gregtechceu.gtceu.api.multiblock.predicates.BasePredicate; +import com.gregtechceu.gtceu.api.multiblock.util.AbstractStructureHelper; +import com.gregtechceu.gtceu.api.multiblock.util.BlockInfo; +import com.gregtechceu.gtceu.client.mui.schema.MutableSchema; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; + +import brachy.modularui.drawable.SchemaRenderer; +import brachy.modularui.widgets.SchemaWidget; +import it.unimi.dsi.fastutil.Pair; +import it.unimi.dsi.fastutil.ints.*; +import it.unimi.dsi.fastutil.longs.Long2ObjectMap; +import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.longs.Long2ReferenceMap; +import it.unimi.dsi.fastutil.longs.Long2ReferenceOpenHashMap; +import it.unimi.dsi.fastutil.objects.Reference2IntMap; +import it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap; +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; + +import static com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine.DEFAULT_STRUCTURE; + +public class MultiblockSchemaInfo { + + @Getter + @Setter + private SchemaWidget multiSchema; + @Getter + @Setter + private MutableSchema mapSchema; + @Getter + @Setter + private SchemaRenderer renderer; + @Getter + private final Reference2IntMap blockCounts = new Reference2IntOpenHashMap<>(); + @Getter + private final Long2ObjectMap userGlobalBlockPreferences = new Long2ObjectOpenHashMap<>(); + + @Getter + private final Int2IntMap userSliceRepeats = new Int2IntArrayMap(); + @Getter + private final IntList userDimensions = new IntArrayList(); + @Getter + private final Map structureBlocks = new HashMap<>(); + + @Getter + private @Nullable AbstractStructureHelper structureHelper; + + @ApiStatus.Internal + public void refreshSchema(MultiblockMachineDefinition multiblockDefinition, Direction frontFacing, + Direction upFacing, boolean isFlipped, @Nullable Runnable onSchemaRefresh) { + Map resultStructure = new HashMap<>(); + IBlockPattern pattern = multiblockDefinition.getStructurePatterns().get(DEFAULT_STRUCTURE).get(); + + if (this.structureHelper == null) { + if (pattern instanceof BlockPattern blockPattern) { + if (this.userSliceRepeats.isEmpty()) { + for (int i = 0; i < blockPattern.getSlices().length; i++) { + this.userSliceRepeats.put(i, blockPattern.getSlices()[i].getMinRepeats()); + } + } + // reinterpret slider values as slice repeats? + this.structureHelper = AbstractStructureHelper.blockPattern(this.userSliceRepeats); + + } else if (pattern instanceof ExpandablePattern expandablePattern) { + if (this.userDimensions.isEmpty()) { + expandablePattern.getBoundsConstraints().apply().stream() + .mapToInt(Pair::left) + .forEach(this.userDimensions::add); + } + // reinterpret slider values as bounds? + this.structureHelper = AbstractStructureHelper.expandable(this.userDimensions); + + } else { + // throw? log? + return; + } + } + + this.structureHelper.populate(resultStructure, pattern, this.userGlobalBlockPreferences, + frontFacing, upFacing, isFlipped); + + Long2ReferenceMap schemaMap = new Long2ReferenceOpenHashMap<>(); + this.blockCounts.clear(); + for (var entry : resultStructure.entrySet()) { + BlockState state = entry.getValue().getBlockState(); + schemaMap.put(entry.getKey().asLong(), state); + this.blockCounts.merge(state.getBlock(), 1, Integer::sum); + } + if (this.mapSchema == null) { + this.mapSchema = new MutableSchema(schemaMap); + } else { + this.mapSchema.setBlocks(schemaMap); + } + this.structureBlocks.clear(); + this.structureBlocks.putAll(resultStructure); + + if (onSchemaRefresh != null) { + onSchemaRefresh.run(); + } + } + + public void clearUserPreferences() { + this.userSliceRepeats.clear(); + this.userDimensions.clear(); + } + + public void putPredicatePreference(PatternPredicate predicate, BasePredicate basePredicate, BlockInfo info) { + this.structureHelper.getBlockPreferences().put(predicate, basePredicate, info); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/mui/SteamTextureSet.java b/src/main/java/com/gregtechceu/gtceu/api/mui/SteamTextureSet.java new file mode 100644 index 00000000000..9e63b7ad94b --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/mui/SteamTextureSet.java @@ -0,0 +1,37 @@ +package com.gregtechceu.gtceu.api.mui; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.steam.SteamMachine; + +import brachy.modularui.drawable.UITexture; +import lombok.Getter; +import lombok.experimental.Accessors; +import org.jetbrains.annotations.Nullable; + +@Getter +@Accessors(fluent = true) +public class SteamTextureSet { + + private final UITexture main; + private final @Nullable UITexture bronze; + private final @Nullable UITexture steel; + + public SteamTextureSet(UITexture main, @Nullable UITexture bronze, @Nullable UITexture steel) { + this.main = main; + this.bronze = bronze; + this.steel = steel; + } + + public SteamTextureSet(UITexture main) { + this.main = main; + this.bronze = null; + this.steel = null; + } + + public UITexture get(@Nullable MetaMachine machine) { + if (!(machine instanceof SteamMachine steamMachine)) return main; + if (steamMachine.isHighPressure && steel != null) return steel; + if (!steamMachine.isHighPressure && bronze != null) return bronze; + return main; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/mui/factory/CoverUIFactory.java b/src/main/java/com/gregtechceu/gtceu/api/mui/factory/CoverUIFactory.java new file mode 100644 index 00000000000..b426f33934e --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/mui/factory/CoverUIFactory.java @@ -0,0 +1,84 @@ +package com.gregtechceu.gtceu.api.mui.factory; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.capability.GTCapability; +import com.gregtechceu.gtceu.api.capability.ICoverable; +import com.gregtechceu.gtceu.api.cover.CoverBehavior; +import com.gregtechceu.gtceu.api.cover.IMuiCover; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.entity.BlockEntity; + +import brachy.modularui.api.IUIHolder; +import brachy.modularui.factory.AbstractUIFactory; +import brachy.modularui.factory.GuiManager; +import brachy.modularui.factory.SidedPosGuiData; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +public class CoverUIFactory extends AbstractUIFactory { + + public static final CoverUIFactory INSTANCE = new CoverUIFactory(); + + private CoverUIFactory() { + super(GTCEu.id("cover")); + } + + public void open(ServerPlayer player, IMuiCover cover) { + Objects.requireNonNull(player); + Objects.requireNonNull(cover); + if (cover.isRemoved()) { + throw new IllegalArgumentException("Can't open Cover GUI on invalid cover holder!"); + } + if (player.level() != cover.self().coverHolder.getLevel()) { + throw new IllegalArgumentException("Cover must be in same dimension as the player!"); + } + BlockPos pos = cover.self().coverHolder.getBlockPos(); + Direction side = cover.self().attachedSide; + SidedPosGuiData data = new SidedPosGuiData(player, pos, side); + GuiManager.open(this, data, player); + } + + @Override + public @NotNull IUIHolder getGuiHolder(SidedPosGuiData data) { + BlockEntity be = data.getBlockEntity(); + if (be == null) { + throw new IllegalStateException("Could not get gui for null BlockEntity!"); + } + ICoverable coverHolder = be.getCapability(GTCapability.CAPABILITY_COVERABLE, data.getSide()) + .resolve().orElse(null); + if (coverHolder == null) { + throw new IllegalStateException("Could not get CoverHolder for found BlockEntity!"); + } + CoverBehavior cover = coverHolder.getCoverAtSide(data.getSide()); + if (cover == null) { + throw new IllegalStateException("Could not find cover at side " + data.getSide() + + " for found CoverHolder!"); + } + if (!(cover instanceof IMuiCover uiCover)) { + throw new IllegalStateException("Cover at side " + data.getSide() + " is not a gui holder!"); + } + return uiCover; + } + + @Override + public boolean canInteractWith(Player player, SidedPosGuiData guiData) { + return guiData.getSquaredDistance(player) <= 8 * 8; + } + + @Override + public void writeGuiData(SidedPosGuiData guiData, FriendlyByteBuf buffer) { + buffer.writeBlockPos(guiData.getBlockPos()); + buffer.writeByte(guiData.getSide().get3DDataValue()); + } + + @Override + public @NotNull SidedPosGuiData readGuiData(Player player, FriendlyByteBuf buffer) { + return new SidedPosGuiData(player, buffer.readBlockPos(), Direction.from3DDataValue(buffer.readByte())); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/mui/factory/MachineUIFactory.java b/src/main/java/com/gregtechceu/gtceu/api/mui/factory/MachineUIFactory.java new file mode 100644 index 00000000000..52a1ae56279 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/mui/factory/MachineUIFactory.java @@ -0,0 +1,94 @@ +package com.gregtechceu.gtceu.api.mui.factory; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; +import com.gregtechceu.gtceu.api.mui.GTGuiScreen; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import brachy.modularui.api.IUIHolder; +import brachy.modularui.factory.AbstractUIFactory; +import brachy.modularui.factory.GuiManager; +import brachy.modularui.factory.PosGuiData; +import brachy.modularui.screen.ModularPanel; +import brachy.modularui.screen.ModularScreen; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +import static com.gregtechceu.gtceu.GTCEu.MOD_ID; + +public class MachineUIFactory extends AbstractUIFactory { + + public static final MachineUIFactory INSTANCE = new MachineUIFactory(); + + private MachineUIFactory() { + super(GTCEu.id("machine")); + } + + public void open(ServerPlayer player, IMuiMachine machine) { + Objects.requireNonNull(player); + Objects.requireNonNull(machine); + if (machine.isRemoved()) { + throw new IllegalArgumentException("Can't open invalid MetaMachine GUI!"); + } + if (player.level() != machine.getLevel()) { + throw new IllegalArgumentException("MetaMachine must be in same dimension as the player!"); + } + BlockPos pos = machine.getBlockPos(); + PosGuiData data = new PosGuiData(player, pos); + GuiManager.open(this, data, player); + } + + public void open(Player player, BlockPos pos) { + Objects.requireNonNull(player); + Objects.requireNonNull(pos); + PosGuiData data = new PosGuiData(player, pos); + GuiManager.open(this, data, (ServerPlayer) player); + } + + @Override + public @NotNull IUIHolder getGuiHolder(PosGuiData data) { + MetaMachine machine = getMachine(data); + if (machine.getDefinition().getUI() != null) { + return machine.getDefinition().getUI(); + } + return Objects.requireNonNull(castUIHolder(machine), "Found MetaMachine is not a gui holder!"); + } + + @Override + public boolean canInteractWith(Player player, PosGuiData guiData) { + return player == guiData.getPlayer() && getMachine(guiData) != null && + guiData.getSquaredDistance(player) <= 8 * 8; + } + + @Override + public void writeGuiData(PosGuiData guiData, FriendlyByteBuf buffer) { + buffer.writeBlockPos(guiData.getBlockPos()); + } + + @Override + public @NotNull PosGuiData readGuiData(Player player, FriendlyByteBuf buffer) { + return new PosGuiData(player, buffer.readBlockPos()); + } + + public static MetaMachine getMachine(PosGuiData data) { + return MetaMachine.getMachine(data.getLevel(), data.getBlockPos()); + } + + @Override + @OnlyIn(Dist.CLIENT) + public ModularScreen createScreen(PosGuiData data, ModularPanel mainPanel) { + return new GTGuiScreen(MOD_ID, mainPanel, getThemeId(data)); + } + + public String getThemeId(PosGuiData data) { + return getMachine(data).getDefinition().getThemeId(); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/mui/factory/PanelEditor.java b/src/main/java/com/gregtechceu/gtceu/api/mui/factory/PanelEditor.java new file mode 100644 index 00000000000..a44f1c260a4 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/mui/factory/PanelEditor.java @@ -0,0 +1,15 @@ +package com.gregtechceu.gtceu.api.mui.factory; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; + +import brachy.modularui.factory.PosGuiData; +import brachy.modularui.screen.ModularPanel; +import brachy.modularui.screen.UISettings; +import brachy.modularui.value.sync.PanelSyncManager; + +@FunctionalInterface +public interface PanelEditor { + + void editUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings, + MetaMachine machine, ModularPanel panel); +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/mui/factory/PanelFactory.java b/src/main/java/com/gregtechceu/gtceu/api/mui/factory/PanelFactory.java new file mode 100644 index 00000000000..0b166d5b795 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/mui/factory/PanelFactory.java @@ -0,0 +1,63 @@ +package com.gregtechceu.gtceu.api.mui.factory; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.mui.GTGuiScreen; + +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import brachy.modularui.api.IUIHolder; +import brachy.modularui.factory.PosGuiData; +import brachy.modularui.screen.ModularPanel; +import brachy.modularui.screen.ModularScreen; +import brachy.modularui.screen.UISettings; +import brachy.modularui.value.sync.PanelSyncManager; + +@FunctionalInterface +public interface PanelFactory extends IUIHolder { + + @Override + default ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { + var machine = MachineUIFactory.getMachine(data); + return buildUIFunction(data, syncManager, settings, machine); + } + + @Override + @OnlyIn(Dist.CLIENT) + default ModularScreen createScreen(PosGuiData data, ModularPanel mainPanel) { + return new GTGuiScreen(mainPanel); + } + + ModularPanel buildUIFunction(PosGuiData data, PanelSyncManager syncManager, UISettings settings, + MetaMachine machine); + + default boolean shouldOpenUI(Player player, InteractionHand hand, BlockHitResult hit) { + return true; + } + + default InteractionResult tryToOpenUI(Player player, InteractionHand hand, BlockHitResult hit) { + if (this.shouldOpenUI(player, hand, hit)) { + if (player instanceof ServerPlayer serverPlayer) { + MachineUIFactory.INSTANCE.open(serverPlayer, hit.getBlockPos()); + } + return InteractionResult.sidedSuccess(player.level().isClientSide); + } else { + return InteractionResult.PASS; + } + } + + default PanelFactory andThen(PanelEditor... edits) { + return (data, syncManager, settings, machine) -> { + var panel = this.buildUIFunction(data, syncManager, settings, machine); + for (PanelEditor edit : edits) { + edit.editUI(data, syncManager, settings, machine, panel); + } + return panel; + }; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/MultiblockWorldSavedData.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/MultiblockWorldSavedData.java new file mode 100644 index 00000000000..9075b3c98cd --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/MultiblockWorldSavedData.java @@ -0,0 +1,66 @@ +package com.gregtechceu.gtceu.api.multiblock; + +import com.gregtechceu.gtceu.api.multiblock.pattern.PatternState; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.saveddata.SavedData; + +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; + +import java.util.*; +import java.util.concurrent.*; + +public class MultiblockWorldSavedData extends SavedData { + + public static MultiblockWorldSavedData getOrCreate(ServerLevel serverLevel) { + return serverLevel.getDataStorage() + .computeIfAbsent(MultiblockWorldSavedData::new, MultiblockWorldSavedData::new, "gtceu_multiblock"); + } + + /** + * Store all formed multiblocks' structure info + */ + public final Map> mapping; + /** + * Chunk pos mapping. + */ + public final Map> chunkPosMapping; + + private MultiblockWorldSavedData() { + this.mapping = new Object2ObjectOpenHashMap<>(); + this.chunkPosMapping = new HashMap<>(); + } + + private MultiblockWorldSavedData(CompoundTag tag) { + this(); + } + + public PatternState[] getPatternsInChunk(ChunkPos chunkPos) { + return chunkPosMapping.getOrDefault(chunkPos, Collections.emptySet()).toArray(PatternState[]::new); + } + + public void addMapping(PatternState patternState) { + this.mapping.computeIfAbsent(patternState.getControllerPos(), x -> new HashSet<>()).add(patternState); + for (long pos : patternState.getCache().keySet()) { + chunkPosMapping.computeIfAbsent(new ChunkPos(BlockPos.of(pos)), c -> new HashSet<>()).add(patternState); + } + } + + public void removeMapping(PatternState patternState) { + this.mapping.getOrDefault(patternState.getControllerPos(), new HashSet<>()).remove(patternState); + this.mapping.entrySet().removeIf(e -> e.getValue().isEmpty()); + + for (var patternSet : chunkPosMapping.values()) { + patternSet.remove(patternState); + } + chunkPosMapping.entrySet().removeIf(e -> e.getValue().isEmpty()); + } + + @Override + public CompoundTag save(CompoundTag compound) { + return compound; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/OriginOffset.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/OriginOffset.java new file mode 100644 index 00000000000..ac6280c0993 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/OriginOffset.java @@ -0,0 +1,87 @@ +package com.gregtechceu.gtceu.api.multiblock; + +import com.gregtechceu.gtceu.api.multiblock.util.RelativeDirection; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; + +public class OriginOffset { + + private int x, y, z; + + public static final OriginOffset ZERO = new OriginOffset(); + + public OriginOffset() { + this(0, 0, 0); + } + + public OriginOffset(int x, int y, int z) { + this.x = x; + this.y = y; + this.z = z; + } + + public static OriginOffset of(int xi, int yi, int zi) { + return new OriginOffset(xi, yi, zi); + } + + public static OriginOffset of(RelativeDirection direction, int amount) { + return new OriginOffset().move(direction, amount); + } + + public OriginOffset move(int xi, int yi, int zi) { + return move(RelativeDirection.LEFT, RelativeDirection.UP, RelativeDirection.FRONT, xi, yi, zi); + } + + public OriginOffset move(RelativeDirection x, RelativeDirection y, RelativeDirection z, int xi, int yi, int zi) { + RelativeDirection.validateFacingsArray(new RelativeDirection[] { x, y, z }); + return move(x, xi).move(y, yi).move(z, zi); + } + + public OriginOffset move(RelativeDirection dir, int amount) { + amount *= dir.ordinal() % 2 == 0 ? 1 : -1; + switch (dir.ordinal()) { + case 0, 1 -> y += amount; + case 2, 3 -> x += amount; + case 4, 5 -> z += amount; + default -> throw new IllegalStateException("Unexpected value: " + dir.ordinal()); + } + + return this; + } + + public OriginOffset move(RelativeDirection dir) { + return move(dir, 1); + } + + public int get(RelativeDirection dir) { + return switch (dir.ordinal()) { + case 0, 1 -> y * (dir.ordinal() == 0 ? 1 : -1); + case 2, 3 -> x * (dir.ordinal() == 2 ? 1 : -1); + case 4, 5 -> z * (dir.ordinal() == 4 ? 1 : -1); + default -> throw new IllegalStateException("Unexpected value: " + dir.ordinal()); + }; + } + + /** + * Applies this offset to {@code pos} based on the front, up and flip values + * + * @param pos BlockPos to modify + * @param front front facing direction + * @param up upwards facing direction + * @param flip whether to flip orientation + */ + public void apply(BlockPos.MutableBlockPos pos, Direction front, Direction up, boolean flip) { + pos.move(RelativeDirection.LEFT.getRelativeFacing(front, up, flip), x); + pos.move(RelativeDirection.UP.getRelativeFacing(front, up, flip), y); + pos.move(RelativeDirection.FRONT.getRelativeFacing(front, up, flip), z); + } + + /** + * + * @return BlockPos from values + */ + public BlockPos toBlockPos() { + return new BlockPos(x, y, z); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/PatternPredicate.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/PatternPredicate.java new file mode 100644 index 00000000000..e4bd6d3e9e1 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/PatternPredicate.java @@ -0,0 +1,219 @@ +package com.gregtechceu.gtceu.api.multiblock; + +import com.gregtechceu.gtceu.api.multiblock.error.PatternError; +import com.gregtechceu.gtceu.api.multiblock.error.SimplePatternError; +import com.gregtechceu.gtceu.api.multiblock.pattern.CurrentBlockInfo; +import com.gregtechceu.gtceu.api.multiblock.predicates.BasePredicate; +import com.gregtechceu.gtceu.api.multiblock.util.BlockInfo; + +import net.minecraft.network.chat.Component; + +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import lombok.Getter; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +public class PatternPredicate { + + public static PatternPredicate ANY = new PatternPredicate("Any", currentBlockInfo -> null, null); + public static PatternPredicate AIR = new PatternPredicate("Air", + currentBlockInfo -> currentBlockInfo.retrieveCurrentBlockState().isAir() ? null : + new SimplePatternError(currentBlockInfo.getBlockPos(), Collections.emptyList()), + Collections.singletonList(BlockInfo.EMPTY)); + private static final Comparator predicateComparator = Comparator.comparingInt(p -> p.priority); + public List subPredicates = new ArrayList<>(); + @Getter + protected boolean isController; + protected boolean hasAir = false; + @Getter + protected boolean isSingle = true; + + public PatternPredicate() {} + + public PatternPredicate(PatternPredicate predicate) { + subPredicates.addAll(predicate.subPredicates); + isController = predicate.isController; + hasAir = predicate.hasAir; + isSingle = predicate.isSingle; + } + + /** + * @param debugName the debug name + * @param predicate the testing function for if the current block information is valid + * @param candidates the valid list of BlockInfos that this traceability predicate allows + */ + public PatternPredicate(String debugName, Function predicate, + @Nullable List candidates) { + subPredicates.add(new BasePredicate(debugName, predicate, candidates)); + } + + /** + * + * @param predicate the testing function for if the current block information is valid + * @param candidates the valid list of BlockInfos that this traceability predicate allows + */ + public PatternPredicate(Function predicate, + @Nullable List candidates) { + this("Unknown", predicate, candidates); + } + + public PatternPredicate(Function predicate) { + this(predicate, null); + } + + public PatternPredicate(BasePredicate basePredicate) { + subPredicates.add(basePredicate); + } + + /** + * Mark it as the controller of this multi. Normally you won't call it yourself. Use plz. + */ + public PatternPredicate setController() { + isController = true; + return this; + } + + public boolean hasAir() { + return hasAir; + } + + /** + * Add tooltips for candidates. They are shown in JEI Pages. + */ + public PatternPredicate addTooltips(Component... tips) { + if (tips.length > 0) { + List tooltips = Arrays.stream(tips).toList(); + subPredicates.forEach(predicate -> { + if (predicate.tooltips == null) { + predicate.tooltips = new ArrayList<>(); + } + predicate.tooltips.addAll(tooltips); + }); + } + return this; + } + + public List> getCandidates() { + return subPredicates.stream() + .map(BasePredicate::getCandidates) + .collect(Collectors.toList()); + } + + /** + * Set the minimum number of candidate blocks. + */ + public PatternPredicate setMinGlobalLimited(int min) { + subPredicates.forEach(p -> p.minCount = min); + return this; + } + + public PatternPredicate setMinGlobalLimited(int min, int previewCount) { + return this.setMinGlobalLimited(min).setPreviewCount(previewCount); + } + + /** + * Set the maximum number of candidate blocks. + */ + public PatternPredicate setMaxGlobalLimited(int max) { + subPredicates.forEach(p -> p.maxCount = max); + return this; + } + + public PatternPredicate setMaxGlobalLimited(int max, int previewCount) { + return this.setMaxGlobalLimited(max).setPreviewCount(previewCount); + } + + /** + * Set the minimum number of candidate blocks for each slice layer. + */ + public PatternPredicate setMinLayerLimited(int min) { + subPredicates.forEach(p -> p.minSliceCount = min); + return this; + } + + public PatternPredicate setMinLayerLimited(int min, int previewCount) { + return this.setMinLayerLimited(min).setPreviewCount(previewCount); + } + + /** + * Set the maximum number of candidate blocks for each slice layer. + */ + public PatternPredicate setMaxLayerLimited(int max) { + subPredicates.forEach(p -> p.maxSliceCount = max); + return this; + } + + public PatternPredicate setMaxLayerLimited(int max, int previewCount) { + return this.setMaxLayerLimited(max).setPreviewCount(previewCount); + } + + /** + * Sets the Minimum and Maximum limit to the passed value + * + * @param limit The Maximum and Minimum limit + */ + public PatternPredicate setExactLimit(int limit) { + return this.setMinGlobalLimited(limit).setMaxGlobalLimited(limit); + } + + /** + * Set the number of it appears in JEI pages. It only affects JEI preview. (The specific number) + */ + public PatternPredicate setPreviewCount(int count) { + subPredicates.forEach(p -> p.previewCount = count); + return this; + } + + public PatternPredicate setPriority(int priority) { + subPredicates.forEach(p -> p.priority = priority); + return this; + } + + /** + * Set renderMask. + */ + public PatternPredicate disableRenderFormed() { + subPredicates.forEach(p -> p.disableRenderFormed = true); + return this; + } + + public PatternPredicate setNBTParser(String nbtParser) { + subPredicates.forEach(p -> p.nbtParser = nbtParser); + return this; + } + + public List test(CurrentBlockInfo currBlock, Object2IntMap globalCache, + @Nullable Object2IntMap layerCache) { + List lastErrors = new ArrayList<>(); + for (BasePredicate p : subPredicates) { + PatternError error = p.testLimited(currBlock, globalCache, layerCache); + if (error == null) return List.of(); + lastErrors.add(error); + } + return lastErrors; + } + + public PatternPredicate or(@Nullable PatternPredicate other) { + if (other != null) { + PatternPredicate newPredicate = new PatternPredicate(this); + newPredicate.hasAir = newPredicate.hasAir || this == AIR || other == AIR; + newPredicate.subPredicates.addAll(other.subPredicates); + newPredicate.subPredicates.sort(predicateComparator); + return newPredicate; + } + return this; + } + + @Override + public boolean equals(Object obj) { + if (obj == this) return true; + if (!(obj instanceof PatternPredicate pred)) return false; + + return this.hasAir == pred.hasAir && + this.isController == pred.isController && + this.subPredicates.equals(pred.subPredicates); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/Predicates.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/Predicates.java new file mode 100644 index 00000000000..0ff93cae4bb --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/Predicates.java @@ -0,0 +1,351 @@ +package com.gregtechceu.gtceu.api.multiblock; + +import com.gregtechceu.gtceu.api.GTCEuAPI; +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.block.ActiveBlock; +import com.gregtechceu.gtceu.api.block.MetaMachineBlock; +import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +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.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.multiblock.error.BlockMatchingError; +import com.gregtechceu.gtceu.api.multiblock.error.PatternError; +import com.gregtechceu.gtceu.api.multiblock.error.PlaceholderError; +import com.gregtechceu.gtceu.api.multiblock.pattern.CurrentBlockInfo; +import com.gregtechceu.gtceu.api.multiblock.predicates.*; +import com.gregtechceu.gtceu.api.multiblock.util.BlockInfo; +import com.gregtechceu.gtceu.api.pipenet.IPipeNode; +import com.gregtechceu.gtceu.api.recipe.GTRecipeType; +import com.gregtechceu.gtceu.common.data.GTMaterialBlocks; +import com.gregtechceu.gtceu.config.ConfigHolder; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Fluid; + +import com.tterrag.registrate.util.entry.RegistryEntry; +import dev.latvian.mods.rhino.util.HideFromJS; +import org.apache.commons.lang3.ArrayUtils; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Stream; + +public class Predicates { + + /** + * Return this for your pattern errors if you want them to be a default error with the pos of the BlockWorldState + * and candidates of the simple predicate's error. + */ + public static final PlaceholderError PLACEHOLDER = new PlaceholderError(BlockPos.ZERO, Collections.emptyList()); + + public static PatternPredicate controller(MultiblockMachineDefinition def) { + return controller(blocks(def.getBlock())); + } + + public static PatternPredicate controller(PatternPredicate predicate) { + return predicate.setController(); + } + + public static PatternPredicate states(BlockState... allowedStates) { + var candidates = new ArrayList(); + for (BlockState state : allowedStates) { + candidates.add(state); + if (state.getBlock() instanceof ActiveBlock block) { + candidates.add(block.changeActive(state, !block.isActive(state))); + } + } + return new PatternPredicate(new PredicateStates(candidates.toArray(BlockState[]::new))); + } + + @HideFromJS + public static PatternPredicate blocks(String debugName, Block... blocks) { + return new PatternPredicate(new PredicateBlocks(debugName, blocks)); + } + + public static PatternPredicate blocks(Block... blocks) { + return new PatternPredicate(new PredicateBlocks(blocks)); + } + + /* + * public static PatternPredicate blocks(IMachineBlock... blocks) { + * return new PatternPredicate( + * new PredicateBlocks(Arrays.stream(blocks).map(IMachineBlock::self).toArray(Block[]::new))); + * } + */ + + public static PatternPredicate machines(@Nullable MachineDefinition... definitions) { + return blocks(Arrays.stream(definitions).filter(Objects::nonNull).map(MachineDefinition::get) + .toArray(MetaMachineBlock[]::new)); + } + + public static PatternPredicate blockTag(TagKey tag) { + return new PatternPredicate(new PredicateBlockTag(tag)); + } + + public static PatternPredicate fluids(Fluid... fluids) { + return new PatternPredicate(new PredicateFluids(fluids)); + } + + public static PatternPredicate fluidTag(TagKey tag) { + return new PatternPredicate(new PredicateFluidTag(tag)); + } + + public static PatternPredicate custom(Function predicate, + @Nullable List candidates) { + return new PatternPredicate(predicate, candidates); + } + + public static PatternPredicate any() { + return PatternPredicate.ANY; + } + + public static PatternPredicate air() { + return PatternPredicate.AIR; + } + + public static PatternPredicate abilities(PartAbility... abilities) { + StringJoiner sb = new StringJoiner("-"); + for (PartAbility ability : abilities) { + sb.add(ability.getName()); + } + String debugName = sb.toString(); + + PatternPredicate predicate = new PatternPredicate(); + for (var ability : abilities) { + predicate.subPredicates.add(new PredicatePartAbility(debugName, ability)); + } + return predicate; + } + + public static PatternPredicate ability(PartAbility ability, int... tiers) { + StringJoiner sb = new StringJoiner("-"); + for (int tier : tiers) { + sb.add(GTValues.VN[tier]); + } + String debugName = ability.getName() + sb; + + return new PatternPredicate(new PredicatePartAbility(debugName, ability, tiers)); + } + + public static PatternPredicate autoAbilities(GTRecipeType... recipeType) { + return autoAbilities(recipeType, true, true, true, true, true, true); + } + + public static PatternPredicate autoAbilities(GTRecipeType[] recipeType, + boolean checkEnergyIn, boolean checkEnergyOut, + boolean checkItemIn, boolean checkItemOut, + boolean checkFluidIn, boolean checkFluidOut) { + PatternPredicate predicate = new PatternPredicate(); + + if (checkEnergyIn) { + for (var type : recipeType) { + if (type.getMaxInputs(EURecipeCapability.CAP) > 0) { + predicate = predicate.or(abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1) + .setMaxGlobalLimited(2).setPreviewCount(1) + .setPriority(1)); + break; + } + } + } + if (checkEnergyOut) { + for (var type : recipeType) { + if (type.getMaxOutputs(EURecipeCapability.CAP) > 0) { + predicate = predicate.or(abilities(PartAbility.OUTPUT_ENERGY).setMinGlobalLimited(1) + .setMaxGlobalLimited(2).setPreviewCount(1) + .setPriority(1)); + break; + } + } + } + if (checkItemIn) { + for (var type : recipeType) { + if (type.getMaxInputs(ItemRecipeCapability.CAP) > 0) { + predicate = predicate.or(abilities(PartAbility.IMPORT_ITEMS).setPreviewCount(1) + .setPriority(2)); + break; + } + } + } + if (checkItemOut) { + for (var type : recipeType) { + if (type.getMaxOutputs(ItemRecipeCapability.CAP) > 0) { + predicate = predicate.or(abilities(PartAbility.EXPORT_ITEMS).setPreviewCount(1) + .setPriority(2)); + break; + } + } + } + if (checkFluidIn) { + for (var type : recipeType) { + if (type.getMaxInputs(FluidRecipeCapability.CAP) > 0) { + predicate = predicate.or(abilities(PartAbility.IMPORT_FLUIDS).setPreviewCount(1) + .setPriority(3)); + break; + } + } + } + if (checkFluidOut) { + for (var type : recipeType) { + if (type.getMaxOutputs(FluidRecipeCapability.CAP) > 0) { + predicate = predicate.or(abilities(PartAbility.EXPORT_FLUIDS).setPreviewCount(1) + .setPriority(3)); + break; + } + } + } + return predicate; + } + + public static PatternPredicate autoAbilities(boolean checkMaintenance, boolean checkMuffler, + boolean checkParallel) { + PatternPredicate predicate = new PatternPredicate(); + if (checkMaintenance) { + predicate = predicate.or(abilities(PartAbility.MAINTENANCE) + .setMinGlobalLimited(ConfigHolder.INSTANCE.machines.enableMaintenance ? 1 : 0) + .setMaxGlobalLimited(1) + .setPriority(1)); + } + if (checkMuffler) { + predicate = predicate.or(abilities(PartAbility.MUFFLER) + .setExactLimit(1) + .setPriority(2)); + } + if (checkParallel) { + predicate = predicate.or(abilities(PartAbility.PARALLEL_HATCH) + .setMaxGlobalLimited(1) + .setPreviewCount(1) + .setPriority(3)); + } + return predicate; + } + + public static PatternPredicate heatingCoils() { + return new PatternPredicate("Heating Coils", worldState -> { + var blockState = worldState.getBlockState(); + for (var entry : GTCEuAPI.HEATING_COILS.entrySet()) { + if (blockState.is(entry.getValue().get())) { + return null; + } + } + return new BlockMatchingError(worldState.getBlockPos(), GTCEuAPI.HEATING_COILS.values().stream() + .map(coilBlockSupplier -> (Block) coilBlockSupplier.get()).toList()); + }, GTCEuAPI.HEATING_COILS.entrySet().stream() + // sort to make autogenerated jei previews not pick random coils each game load + .sorted(Comparator.comparingInt(e -> e.getKey().getTier())) + .map(e -> new BlockInfo(e.getValue().get())) + .toList()) + .addTooltips(Component.translatable("gtceu.multiblock.pattern.error.coils")) + .setPriority(0); + } + + public static PatternPredicate cleanroomFilters() { + return new PatternPredicate("Cleanroom Filters", worldState -> { + var blockState = worldState.getBlockState(); + for (var entry : GTCEuAPI.CLEANROOM_FILTERS.entrySet()) { + if (blockState.is(entry.getValue().get())) { + return null; + } + } + return new BlockMatchingError(worldState.getBlockPos(), + GTCEuAPI.CLEANROOM_FILTERS.entrySet().stream().map(e -> e.getValue().get()).toList()); + }, GTCEuAPI.CLEANROOM_FILTERS.entrySet().stream() + .sorted(Comparator.comparingInt(e -> e.getKey().getCleanroomType().getTier())) + .map(e -> new BlockInfo(e.getValue().get())) + .toList()) + .addTooltips(Component.translatable("gtceu.multiblock.pattern.error.filters")); + } + + public static PatternPredicate powerSubstationBatteries() { + return new PatternPredicate("PSS Batteries", worldState -> { + var state = worldState.getBlockState(); + for (var entry : GTCEuAPI.PSS_BATTERIES.entrySet()) { + if (state.is(entry.getValue().get())) { + return null; + } + } + return Predicates.PLACEHOLDER; + }, GTCEuAPI.PSS_BATTERIES.entrySet().stream() + .sorted(Comparator.comparingInt(e -> e.getKey().getTier())) + .map(e -> new BlockInfo(e.getValue().get().defaultBlockState())) + .toList()) + .addTooltips(Component.translatable("gtceu.multiblock.pattern.error.batteries")); + + /* + * return new TraceabilityPredicate(blockWorldState -> { + * BlockState state = blockWorldState.getBlockState(); + * for (Map.Entry> entry : GTCEuAPI.PSS_BATTERIES.entrySet()) { + * if (state.is(entry.getValue().get())) { + * IBatteryData battery = entry.getKey(); + * // Allow unfilled batteries in the structure, but do not add them to match context. + * // This lets you use empty batteries as "filler slots" for convenience if desired. + * if (battery.getTier() != -1 && battery.getCapacity() > 0) { + * String key = PMC_BATTERY_HEADER + battery.getBatteryName(); + * PowerSubstationMachine.BatteryMatchWrapper wrapper = blockWorldState.getMatchContext().get(key); + * if (wrapper == null) wrapper = new PowerSubstationMachine.BatteryMatchWrapper(battery); + * blockWorldState.getMatchContext().set(key, wrapper.increment()); + * } + * return true; + * } + * } + * return false; + * }, () -> GTCEuAPI.PSS_BATTERIES.entrySet().stream() + * .sorted(Comparator.comparingInt(entry -> entry.getKey().getTier())) + * .map(entry -> new BlockInfo(entry.getValue().get().defaultBlockState(), null)) + * .toArray(BlockInfo[]::new)) + * .addTooltips(Component.translatable("gtceu.multiblock.pattern.error.batteries")); + */ + } + + public static @Nullable PatternPredicate dataHatchPredicate() { + // if research is enabled, require the data hatch, otherwise use a grate instead + if (ConfigHolder.INSTANCE.machines.enableResearch) { + // TODO xor predicate matching :) + return new PatternPredicate(state -> { + Block block = state.retrieveCurrentBlockState().getBlock(); + if (PartAbility.DATA_ACCESS.isApplicable(block) || + PartAbility.OPTICAL_DATA_RECEPTION.isApplicable(block)) { + return null; + } + List blocks = new ArrayList<>( + List.of(PartAbility.DATA_ACCESS.getAllBlocks().toArray(new Block[0]))); + blocks.addAll(PartAbility.OPTICAL_DATA_RECEPTION.getAllBlocks()); + return new BlockMatchingError(state.getBlockPos(), blocks); + }, Stream + .concat(PartAbility.DATA_ACCESS.getAllBlocks().stream(), + PartAbility.OPTICAL_DATA_RECEPTION.getAllBlocks().stream()) + .map(BlockInfo::fromBlock).toList()).setExactLimit(1); + } + return null; + } + + /** + * Use this predicate for Frames in your Multiblock. Allows for Framed Pipes as well as normal Frame blocks. + */ + public static PatternPredicate frames(Material... frameMaterials) { + var frameBlocks = Arrays.stream(frameMaterials) + .map(m -> GTMaterialBlocks.MATERIAL_BLOCKS.get(TagPrefix.frameGt, m)) + .filter(Objects::nonNull) + .filter(RegistryEntry::isPresent) + .map(RegistryEntry::get) + .toArray(Block[]::new); + return blocks(frameBlocks) + .or(new PatternPredicate(blockWorldState -> { + BlockEntity tileEntity = blockWorldState.getBlockEntity(); + if (!(tileEntity instanceof IPipeNode pipeNode)) { + return Predicates.PLACEHOLDER; + } + return ArrayUtils.contains(frameMaterials, pipeNode.getFrameMaterial()) ? null : + Predicates.PLACEHOLDER; + }, Arrays.stream(frameBlocks).map(BlockInfo::fromBlock).toList())); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/BlockMatchingError.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/BlockMatchingError.java new file mode 100644 index 00000000000..4ae2b9b4880 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/BlockMatchingError.java @@ -0,0 +1,55 @@ +package com.gregtechceu.gtceu.api.multiblock.error; + +import com.gregtechceu.gtceu.GTCEu; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.chat.Component; +import net.minecraft.world.level.block.Block; + +import brachy.modularui.api.drawable.Text; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +public class BlockMatchingError extends PatternError { + + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + BlockPos.CODEC.fieldOf("pos").forGetter(PatternError::getPos), + Codec.list(BuiltInRegistries.BLOCK.byNameCodec()).fieldOf("blocks") + .forGetter(BlockMatchingError::getBlocks)) + .apply(instance, BlockMatchingError::new)); + + public static final PatternErrorType TYPE = new PatternErrorType(GTCEu.id("block_matching_error"), CODEC); + + @Getter + private final List blocks; + + public BlockMatchingError(BlockPos pos, List blocks) { + super(pos, Collections.emptyList()); + this.blocks = blocks; + } + + @Override + public PatternErrorUI getPatternErrorUIModifier() { + return (parent) -> { + List comps = new ArrayList<>(); + for (Block block : blocks) { + comps.add(block.getName()); + } + Objects.requireNonNull(pos); + comps.add(Component.translatable("gtceu.pattern_predicate.blocks", pos.getX(), pos.getY(), pos.getZ())); + comps.forEach(comp -> parent.child(Text.of(comp).asWidget())); + }; + } + + @Override + public PatternErrorType type() { + return TYPE; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/CoilMatchingError.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/CoilMatchingError.java new file mode 100644 index 00000000000..47e8c77c709 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/CoilMatchingError.java @@ -0,0 +1,51 @@ +package com.gregtechceu.gtceu.api.multiblock.error; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.block.ICoilType; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; + +import brachy.modularui.api.drawable.Text; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import lombok.Getter; + +import java.util.Collections; +import java.util.Objects; + +public class CoilMatchingError extends PatternError { + + public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + BlockPos.CODEC.fieldOf("pos").forGetter(PatternError::getPos), + ICoilType.CODEC.fieldOf("coilType1").forGetter(CoilMatchingError::getCoilType1), + ICoilType.CODEC.fieldOf("coilType2").forGetter(CoilMatchingError::getCoilType2)) + .apply(instance, CoilMatchingError::new)); + + public static final PatternErrorType TYPE = new PatternErrorType(GTCEu.id("coil_matching_error"), CODEC); + + @Getter + ICoilType coilType1, coilType2; + + public CoilMatchingError(BlockPos pos, ICoilType type1, ICoilType type2) { + super(pos, Collections.emptyList()); + coilType1 = type1; + coilType2 = type2; + } + + @Override + public PatternErrorUI getPatternErrorUIModifier() { + return (parent) -> { + Objects.requireNonNull(pos); + Component comp = Component.translatable("gtceu.pattern_error.mismatch_coils", + coilType1.getMaterial().getName(), coilType2.getMaterial().getName(), + pos.getX(), pos.getY(), pos.getZ()); + parent.child(Text.of(comp).asWidget()); + }; + } + + @Override + public PatternErrorType type() { + return TYPE; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/FilterMatchingError.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/FilterMatchingError.java new file mode 100644 index 00000000000..12b28133309 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/FilterMatchingError.java @@ -0,0 +1,51 @@ +package com.gregtechceu.gtceu.api.multiblock.error; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.machine.multiblock.CleanroomType; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; + +import brachy.modularui.api.drawable.Text; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import lombok.Getter; + +import java.util.Collections; +import java.util.Objects; + +public class FilterMatchingError extends PatternError { + + public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + BlockPos.CODEC.fieldOf("pos").forGetter(PatternError::getPos), + CleanroomType.CODEC.fieldOf("coilType1").forGetter(FilterMatchingError::getFilterType1), + CleanroomType.CODEC.fieldOf("coilType2").forGetter(FilterMatchingError::getFilterType2)) + .apply(instance, FilterMatchingError::new)); + + public static final PatternErrorType TYPE = new PatternErrorType(GTCEu.id("filter_matching_error"), CODEC); + + @Getter + CleanroomType filterType1, filterType2; + + public FilterMatchingError(BlockPos pos, CleanroomType type1, CleanroomType type2) { + super(pos, Collections.emptyList()); + this.filterType1 = type1; + this.filterType2 = type2; + } + + @Override + public PatternErrorUI getPatternErrorUIModifier() { + return (parent) -> { + Objects.requireNonNull(pos); + Component comp = Component.translatable("gtceu.pattern_error.mismatch_filters", + filterType1.getName(), filterType2.getName(), + pos.getX(), pos.getY(), pos.getZ()); + parent.child(Text.of(comp).asWidget()); + }; + } + + @Override + public PatternErrorType type() { + return TYPE; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/GTPatternErrors.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/GTPatternErrors.java new file mode 100644 index 00000000000..397462ee1c6 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/GTPatternErrors.java @@ -0,0 +1,30 @@ +package com.gregtechceu.gtceu.api.multiblock.error; + +import com.gregtechceu.gtceu.api.GTCEuAPI; + +import net.minecraftforge.fml.ModLoader; + +import static com.gregtechceu.gtceu.api.registry.GTRegistries.PATTERN_ERRORS; + +public class GTPatternErrors { + + public static void register(PatternError.PatternErrorType patternErrorType) { + PATTERN_ERRORS.register(patternErrorType.id(), patternErrorType); + } + + public static void init() { + PATTERN_ERRORS.unfreeze(); + register(PlaceholderError.TYPE); + register(BlockMatchingError.TYPE); + register(PartAbilityError.TYPE); + register(CoilMatchingError.TYPE); + register(FilterMatchingError.TYPE); + register(PatternStringError.TYPE); + register(SinglePredicateError.TYPE); + register(SimplePatternError.TYPE); + + ModLoader.get().postEvent(new GTCEuAPI.RegisterEvent<>(PATTERN_ERRORS, PatternError.PatternErrorType.class)); + + PATTERN_ERRORS.freeze(); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/PartAbilityError.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/PartAbilityError.java new file mode 100644 index 00000000000..6518ec925b2 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/PartAbilityError.java @@ -0,0 +1,63 @@ +package com.gregtechceu.gtceu.api.multiblock.error; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.Block; + +import brachy.modularui.api.drawable.Text; +import brachy.modularui.drawable.Icon; +import brachy.modularui.drawable.ItemDrawable; +import brachy.modularui.widgets.layout.Flow; +import brachy.modularui.widgets.menu.ContextMenuButton; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import lombok.Getter; + +import java.util.Collection; +import java.util.Collections; + +public class PartAbilityError extends PatternError { + + public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + BlockPos.CODEC.fieldOf("pos").forGetter(PatternError::getPos), + Codec.STRING.fieldOf("name").forGetter(PartAbilityError::getPartAbilityName)) + .apply(instance, (a, b) -> new PartAbilityError(a, PartAbility.VALUES.get(b)))); + + public static final PatternErrorType TYPE = new PatternErrorType(GTCEu.id("part_ability_error"), CODEC); + + @Getter + private final String partAbilityName; + + public PartAbilityError(BlockPos pos, PartAbility partAbility) { + super(pos, Collections.emptyList()); + partAbilityName = partAbility.getName(); + } + + @Override + public PatternErrorUI getPatternErrorUIModifier() { + return (parent) -> { + Collection blocks = PartAbility.VALUES.get(partAbilityName).getAllBlocks(); + Flow row = Flow.row() + .coverChildren(); + row.child(Text.str("Missing one " + partAbilityName + ": ").asWidget()); + row.child(new ContextMenuButton<>(partAbilityName) + .menuList(l -> l + .maxSize(40) + .coverChildrenWidth() + .collapseDisabledChildren() + .childSeparator(Icon.EMPTY_2PX) + .children(blocks, block -> { + return new ItemDrawable(block.asItem()).asWidget() + .tooltip(r -> r.add(block.asItem().getDescription())); + }))); + parent.child(row); + }; + } + + @Override + public PatternErrorType type() { + return TYPE; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/PatternError.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/PatternError.java new file mode 100644 index 00000000000..170beb040a6 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/PatternError.java @@ -0,0 +1,46 @@ +package com.gregtechceu.gtceu.api.multiblock.error; + +import com.gregtechceu.gtceu.api.multiblock.PatternPredicate; +import com.gregtechceu.gtceu.api.multiblock.predicates.BasePredicate; +import com.gregtechceu.gtceu.api.multiblock.util.BlockInfo; +import com.gregtechceu.gtceu.api.registry.GTRegistries; + +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; + +import com.mojang.serialization.Codec; +import lombok.Getter; +import org.jetbrains.annotations.Nullable; + +import java.util.Collections; +import java.util.List; + +public abstract class PatternError { + + public static final Codec CODEC = GTRegistries.PATTERN_ERRORS.codec() + .dispatch(PatternError::type, PatternErrorType::codec); + + @Getter + protected @Nullable BlockPos pos; + @Getter + protected List> candidates; + + public PatternError(@Nullable BlockPos pos, List> candidates) { + this.pos = pos; + this.candidates = candidates; + } + + public PatternError(@Nullable BlockPos pos, PatternPredicate predicate) { + this(pos, predicate.getCandidates()); + } + + public PatternError(@Nullable BlockPos pos, BasePredicate failingPredicate) { + this(pos, Collections.singletonList(failingPredicate.getCandidates())); + } + + public abstract PatternErrorType type(); + + public abstract PatternErrorUI getPatternErrorUIModifier(); + + public record PatternErrorType(ResourceLocation id, Codec codec) {} +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/PatternErrorUI.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/PatternErrorUI.java new file mode 100644 index 00000000000..a5870ed1e5d --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/PatternErrorUI.java @@ -0,0 +1,9 @@ +package com.gregtechceu.gtceu.api.multiblock.error; + +import brachy.modularui.widget.ParentWidget; + +@FunctionalInterface +public interface PatternErrorUI { + + void apply(ParentWidget parent); +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/PatternStringError.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/PatternStringError.java new file mode 100644 index 00000000000..67280cfdab2 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/PatternStringError.java @@ -0,0 +1,42 @@ +package com.gregtechceu.gtceu.api.multiblock.error; + +import com.gregtechceu.gtceu.GTCEu; + +import net.minecraft.network.chat.Component; +import net.minecraft.util.ExtraCodecs; + +import brachy.modularui.api.drawable.Text; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import lombok.Getter; + +import java.util.Collections; + +public class PatternStringError extends PatternError { + + public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + ExtraCodecs.COMPONENT.fieldOf("component").forGetter(PatternStringError::getComponent)) + .apply(instance, PatternStringError::new)); + + public static final PatternErrorType TYPE = new PatternErrorType(GTCEu.id("pattern_string_error"), CODEC); + + @Getter + public final Component component; + + public PatternStringError(Component component) { + super(null, Collections.emptyList()); + this.component = component; + } + + @Override + public PatternErrorUI getPatternErrorUIModifier() { + return (parent) -> { + parent.child(Text.of(component).asWidget()); + }; + } + + @Override + public PatternErrorType type() { + return TYPE; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/PlaceholderError.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/PlaceholderError.java new file mode 100644 index 00000000000..91247b93dc6 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/PlaceholderError.java @@ -0,0 +1,37 @@ +package com.gregtechceu.gtceu.api.multiblock.error; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.multiblock.util.BlockInfo; + +import net.minecraft.core.BlockPos; + +import brachy.modularui.api.drawable.Text; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class PlaceholderError extends PatternError { + + public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + BlockPos.CODEC.fieldOf("pos").forGetter(PatternError::getPos), + Codec.list(Codec.list(BlockInfo.CODEC)).fieldOf("candidates").forGetter(PatternError::getCandidates)) + .apply(instance, PlaceholderError::new)); + + public static final PatternErrorType TYPE = new PatternErrorType(GTCEu.id("placeholder_error"), CODEC); + + public PlaceholderError(@Nullable BlockPos pos, List> candidates) { + super(pos, candidates); + } + + @Override + public PatternErrorUI getPatternErrorUIModifier() { + return (parent) -> parent.child(Text.str("Placeholder error").asWidget()); + } + + @Override + public PatternErrorType type() { + return TYPE; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/SimplePatternError.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/SimplePatternError.java new file mode 100644 index 00000000000..64b12b71873 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/SimplePatternError.java @@ -0,0 +1,55 @@ +package com.gregtechceu.gtceu.api.multiblock.error; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.multiblock.util.BlockInfo; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; + +import brachy.modularui.api.drawable.Text; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + +import java.util.ArrayList; +import java.util.List; + +public class SimplePatternError extends PatternError { + + public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + BlockPos.CODEC.fieldOf("pos").forGetter(PatternError::getPos), + Codec.list(Codec.list(BlockInfo.CODEC)).fieldOf("candidates").forGetter(PatternError::getCandidates)) + .apply(instance, SimplePatternError::new)); + + public static final PatternErrorType TYPE = new PatternErrorType(GTCEu.id("simple_pattern_error"), CODEC); + + public SimplePatternError(BlockPos pos, List> candidates) { + super(pos, candidates); + } + + @Override + public PatternErrorUI getPatternErrorUIModifier() { + return (parent) -> { + List lines = new ArrayList<>(); + + if (pos != null) { + lines.add(Component.translatable("gtceu.multiblock.pattern.error.0")); + lines.add(Component.translatable("gtceu.multiblock.pattern.error.1", pos.getX(), pos.getY(), + pos.getZ())); + } + for (List candidate : candidates) { + if (!candidate.isEmpty()) { + Component c = candidate.get(0).getItemStackForm().getHoverName(); + lines.add(c); + // builder.append(c.toString()); + // builder.append(COMMA_SEPERATOR_LITERAL); + } + } + lines.forEach(comp -> parent.child(Text.of(comp).asWidget())); + }; + } + + @Override + public PatternErrorType type() { + return TYPE; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/SinglePredicateError.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/SinglePredicateError.java new file mode 100644 index 00000000000..29a21e20d43 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/SinglePredicateError.java @@ -0,0 +1,124 @@ +package com.gregtechceu.gtceu.api.multiblock.error; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.multiblock.predicates.BasePredicate; +import com.gregtechceu.gtceu.api.multiblock.util.BlockInfo; + +import net.minecraft.network.chat.Component; +import net.minecraft.util.StringRepresentable; + +import brachy.modularui.api.drawable.Text; +import brachy.modularui.drawable.ItemDrawable; +import brachy.modularui.widgets.menu.ContextMenuButton; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import lombok.Getter; + +import java.util.Collections; +import java.util.List; + +public class SinglePredicateError extends PatternError { + + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + SinglePredicateError.ErrorType.CODEC.fieldOf("error_type").forGetter(e -> e.type), + Codec.INT.fieldOf("actual_count").forGetter(e -> e.actualCount), + Codec.INT.fieldOf("pred_min_count").forGetter(e -> e.predMinCount), + Codec.INT.fieldOf("pred_max_count").forGetter(e -> e.predMaxCount), + Codec.INT.fieldOf("pred_min_layer_count").forGetter(e -> e.predMinLayerCount), + Codec.INT.fieldOf("pred_max_layer_count").forGetter(e -> e.predMaxLayerCount), + Codec.STRING.fieldOf("name").forGetter(e -> e.debugName), + Codec.list(BlockInfo.CODEC).fieldOf("candidates").forGetter(e -> e.candidates)) + .apply(instance, SinglePredicateError::new)); + + public static final PatternErrorType TYPE = new PatternErrorType(GTCEu.id("single_predicate_error"), CODEC); + + public final ErrorType type; + public final int actualCount; + // Fields from BasePredicate that we need + public final List candidates; + public final int predMinCount; + public final int predMaxCount; + public final int predMinLayerCount; + public final int predMaxLayerCount; + public final String debugName; + + public SinglePredicateError(BasePredicate failingPredicate, ErrorType type, int actualCount) { + this(type, actualCount, failingPredicate.minCount, failingPredicate.maxCount, failingPredicate.minSliceCount, + failingPredicate.maxSliceCount, failingPredicate.getPredicateName(), + failingPredicate.getCandidates()); + } + + public SinglePredicateError(ErrorType type, int actualCount, int minCount, int maxCount, int minLayerCount, + int maxLayerCount, String name, List candidates) { + super(null, Collections.singletonList(candidates)); + this.type = type; + this.actualCount = actualCount; + this.candidates = candidates; + this.predMinCount = minCount; + this.predMaxCount = maxCount; + this.predMinLayerCount = minLayerCount; + this.predMaxLayerCount = maxLayerCount; + this.debugName = name; + } + + @Override + public PatternErrorUI getPatternErrorUIModifier() { + return (parent) -> { + parent.child(Text.of(Component.translatable(debugName)).asWidget()); + switch (type) { + case MAX_COUNT -> { + parent.child(Text.of(Component.translatable("gtceu.multiblock.pattern.error.limited.max_count", + predMaxCount, actualCount)).asWidget()); + } + case MIN_COUNT -> { + parent.child(Text.of(Component.translatable("gtceu.multiblock.pattern.error.limited.min_count", + predMinCount, actualCount)).asWidget()); + } + case MAX_LAYER_COUNT -> { + parent.child( + Text.of(Component.translatable("gtceu.multiblock.pattern.error.limited.max_layer_count", + predMaxLayerCount, actualCount)).asWidget()); + } + case MIN_LAYER_COUNT -> { + parent.child( + Text.of(Component.translatable("gtceu.multiblock.pattern.error.limited.min_layer_count", + predMinLayerCount, actualCount)).asWidget()); + } + } + parent.child(new ContextMenuButton<>("predicate") + .menuList(l -> l + .maxSize(40) + .children(candidates, candidate -> { + return new ItemDrawable(candidate.getItemStackForm()).asWidget() + .tooltip(r -> r.add(candidate.getItemStackForm().getHoverName())); + }))); + }; + } + + @Getter + public enum ErrorType implements StringRepresentable { + + MAX_COUNT("max_count"), + MIN_COUNT("min_count"), + MAX_LAYER_COUNT("max_layer_count"), + MIN_LAYER_COUNT("min_layer_count"); + + final String name; + + ErrorType(String name) { + this.name = name; + } + + public static final Codec CODEC = StringRepresentable.fromEnum(ErrorType::values); + + @Override + public String getSerializedName() { + return getName(); + } + } + + @Override + public PatternErrorType type() { + return TYPE; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/package-info.java new file mode 100644 index 00000000000..488f8ca0983 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/error/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.api.multiblock.error; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/package-info.java new file mode 100644 index 00000000000..ffc30b6c407 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.api.multiblock; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/BasicSliceStrategy.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/BasicSliceStrategy.java new file mode 100644 index 00000000000..a4d2491c8f8 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/BasicSliceStrategy.java @@ -0,0 +1,137 @@ +package com.gregtechceu.gtceu.api.multiblock.pattern; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.multiblock.util.RelativeDirection; + +import com.google.common.base.Preconditions; + +import java.util.*; + +public class BasicSliceStrategy extends SliceStrategy { + + protected static class MultiblockSlice { + + public int minRepeats; + public int maxRepeats; + public int startInclusive; + public int endExclusive; + public int actualRepeats; + + public MultiblockSlice(int minRepeats, int maxRepeats, int startInclusive, int endExclusive, + int actualRepeats) { + this.minRepeats = minRepeats; + this.maxRepeats = maxRepeats; + this.startInclusive = startInclusive; + this.endExclusive = endExclusive; + this.actualRepeats = actualRepeats; + } + + @Override + public String toString() { + return String.format("[min %s, max %s, startInc %s, endExc %s, actual %s]", minRepeats, maxRepeats, + startInclusive, endExclusive, actualRepeats); + } + } + + protected final List multiblockSlices = new ArrayList<>(); + protected final List slices = new ArrayList<>(); + protected final int[] result = new int[2]; + + @Override + public boolean check(PatternState state, boolean flip) { + int offset = 0; + for (var multiSlice : multiblockSlices) { + int result = checkMultiSlice(state, multiSlice, offset, flip); + if (result == -1) return false; + offset += result; + } + return true; + } + + public int getMultiSliceRepeats(int index) { + return multiblockSlices.get(index).actualRepeats; + } + + protected int checkMultiSlice(PatternState state, MultiblockSlice multiblockSlice, int offset, boolean flip) { + int sliceOffset = 0; + int temp = 0; + for (int i = 1; i <= multiblockSlice.maxRepeats; i++) { + for (int j = multiblockSlice.startInclusive; j < multiblockSlice.endExclusive; j++) { + int res = checkRepeatSlice(state, j, offset + temp, flip); + if (res == -1) { + if (i <= multiblockSlice.minRepeats) return -1; + multiblockSlice.actualRepeats = i - 1; + return sliceOffset; + } + temp += res; + } + sliceOffset = temp; + } + + multiblockSlice.actualRepeats = multiblockSlice.maxRepeats; + return sliceOffset; + } + + protected int checkRepeatSlice(PatternState state, int index, int offset, boolean flip) { + PatternSlice slice = slices.get(index); + for (int i = 1; i <= slice.maxRepeats; i++) { + boolean res = checkSlice(state, index, offset + i - 1, flip); + if (!res) { + if (i <= slice.minRepeats) return -1; + + return slices.get(index).actualRepeats = i - 1; + } + } + return slices.get(index).actualRepeats = slice.maxRepeats; + } + + @Override + protected void finish(int[] dimensions, RelativeDirection[] directions, List slices) { + super.finish(dimensions, directions, slices); + + this.slices.addAll(slices); + + BitSet covered = new BitSet(slices.size()); + int sum = 0; + for (var arr : multiblockSlices) { + covered.set(arr.startInclusive, arr.endExclusive); + sum += arr.endExclusive - arr.startInclusive; + } + + if (sum != covered.cardinality()) { + GTCEu.LOGGER.error("Overlapping multiblock slices. " + + "Multiblock has {} slices total but only {} distinct slices.", sum, covered.cardinality()); + multiSliceError(); + } + if (sum > slices.size()) { + GTCEu.LOGGER.error("multiSlices out of bounds. {} slices total but {} slices in multiSlices", + slices.size(), sum); + multiSliceError(); + } + + int i = covered.nextClearBit(0); + while ((i = covered.nextClearBit(i)) < slices.size()) { + multiblockSlices.add(new MultiblockSlice(1, 1, i, i + 1, -1)); + covered.set(i); + } + + multiblockSlices.sort(Comparator.comparingInt(a -> a.startInclusive)); + } + + protected void multiSliceError() { + GTCEu.LOGGER.error( + "multiSlices in the pattern, formatted as [minRepeats, maxRepeats, startInclusive, endExclusive, actualRepeats]"); + for (var arr : multiblockSlices) { + GTCEu.LOGGER.error(arr.toString()); + } + throw new IllegalStateException("Illegal multiSlices, see log above."); + } + + public BasicSliceStrategy multiSlice(int min, int max, int from, int to) { + Preconditions.checkArgument(max >= min, "max: %s is less than min: %s", max, min); + Preconditions.checkArgument(from >= 0, "from argument is negative: %s", from); + Preconditions.checkArgument(to > 0, "to argument is not positive: %s", to); + multiblockSlices.add(new MultiblockSlice(min, max, from, to, -1)); + return this; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/BlockPattern.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/BlockPattern.java new file mode 100644 index 00000000000..0443a0349fc --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/BlockPattern.java @@ -0,0 +1,261 @@ +package com.gregtechceu.gtceu.api.multiblock.pattern; + +import com.gregtechceu.gtceu.api.multiblock.OriginOffset; +import com.gregtechceu.gtceu.api.multiblock.PatternPredicate; +import com.gregtechceu.gtceu.api.multiblock.error.PatternError; +import com.gregtechceu.gtceu.api.multiblock.error.SinglePredicateError; +import com.gregtechceu.gtceu.api.multiblock.predicates.BasePredicate; +import com.gregtechceu.gtceu.api.multiblock.util.BlockInfo; +import com.gregtechceu.gtceu.api.multiblock.util.RelativeDirection; + +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 net.minecraft.world.level.block.state.BlockState; + +import it.unimi.dsi.fastutil.chars.Char2ObjectMap; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import lombok.Getter; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Objects; + +public class BlockPattern implements IBlockPattern { + + @Getter + protected final RelativeDirection[] directions; + + // TODO: can this be removed? Multiblocks with repeatable isles can differ in sizes + @Getter + protected final int[] dimensions; + @Getter + protected final OriginOffset offset; + + protected final boolean hasStartOffset; + @Getter + protected final PatternSlice[] slices; + @Getter + protected final SliceStrategy sliceStrategy; + @Getter + protected final Char2ObjectMap predicates; + + public BlockPattern(PatternSlice[] slices, SliceStrategy sliceStrategy, + int[] dimensions, RelativeDirection[] directions, + @Nullable OriginOffset offset, @Nullable OriginOffset anchorOffset, + Char2ObjectMap predicates, + char centerChar) { + this.slices = slices; + this.sliceStrategy = sliceStrategy; + this.dimensions = dimensions; + this.directions = directions; + this.predicates = predicates; + hasStartOffset = offset != null; + + if (offset == null) { + this.offset = new OriginOffset(); + legacyStartOffset(centerChar); + } else { + this.offset = offset; + } + + if (anchorOffset != null) { // needs to be negative cause of double offsetting + this.offset.move(RelativeDirection.FRONT, -anchorOffset.get(RelativeDirection.FRONT)); + this.offset.move(RelativeDirection.UP, -anchorOffset.get(RelativeDirection.UP)); + this.offset.move(RelativeDirection.LEFT, -anchorOffset.get(RelativeDirection.LEFT)); + } + } + + private void legacyStartOffset(char center) { + if (center == 0) return; + for (int sliceI = 0; sliceI < dimensions[0]; sliceI++) { + int[] res = slices[sliceI].firstInstanceOf(center); + if (res != null) { + moveOffset(directions[0], -sliceI); + moveOffset(directions[1], -res[0]); + moveOffset(directions[2], -res[1]); + return; + } + } + throw new IllegalStateException("Failed to find center symbol: '" + center + "'"); + } + + @Override + public void checkPatternFastAt(Level level, PatternState patternState, BlockPos centerPos, Direction frontFacing, + Direction upwardsFacing, boolean allowsFlip) { + if (!patternState.cache.isEmpty()) { + boolean pass = true; + BlockPos.MutableBlockPos mBlockPos = new BlockPos.MutableBlockPos(); + for (var entry : patternState.cache.long2ObjectEntrySet()) { + BlockPos pos = mBlockPos.set(entry.getLongKey()).immutable(); + BlockState state = level.getBlockState(pos); + + if (state != entry.getValue().getBlockState()) { + pass = false; + break; + } + + BlockEntity cachedBlockEntity = entry.getValue().getBlockEntity(); + + if (cachedBlockEntity != null) { + BlockEntity be = level.getBlockEntity(pos); + if (be != cachedBlockEntity) { + pass = false; + break; + } + } + } + + if (pass) { + if (patternState.hasErrors()) { + patternState.setState(PatternState.CheckState.INVALID_CACHED); + } else { + patternState.setState(PatternState.CheckState.VALID_CACHED); + } + + return; + } + } + + boolean valid = checkPatternAt(level, patternState, centerPos, frontFacing, upwardsFacing, false); + if (valid) { + // reaching here means the cache failed or was empty + patternState.setState(PatternState.CheckState.VALID_UNCACHED); + patternState.setFlipped(false); + return; + } + + if (allowsFlip) { + valid = checkPatternAt(level, patternState, centerPos, frontFacing, upwardsFacing, true); + } + if (!valid) { + // maybe empty the block info part of the cache? + patternState.setState(PatternState.CheckState.INVALID_UNCACHED); + return; + } + + patternState.setState(PatternState.CheckState.VALID_UNCACHED); + patternState.setFlipped(true); + } + + @Override + public boolean checkPatternAt(Level level, PatternState patternState, BlockPos centerPos, Direction frontFacing, + Direction upwardsFacing, + boolean isFlipped) { + Objects.requireNonNull(patternState, "PatternState not set"); + + patternState.globalCount.clear(); + patternState.layerCount.clear(); + // Make sure every prerdicate with a minvalue is checked + for (PatternPredicate predicate : predicates.values()) { + for (BasePredicate basePredicate : predicate.subPredicates) { + if (basePredicate.minCount > 0) { + patternState.globalCount.putIfAbsent(basePredicate, 0); + } + } + } + // only try to clear the cache for structure checking mapping when checking the structure for unflipped + // maybe switch to a multiblock state value instead? + if (!isFlipped) { + patternState.cache.clear(); + } + + patternState.currentBlockInfo.setLevel(level); + + BlockPos.MutableBlockPos controllerPos = centerPos.mutable(); + + sliceStrategy.setPattern(this); + sliceStrategy.start(controllerPos, frontFacing, upwardsFacing); + if (!sliceStrategy.check(patternState, isFlipped)) return false; + + for (Object2IntMap.Entry entry : patternState.globalCount.object2IntEntrySet()) { + if (entry.getIntValue() < entry.getKey().minCount) { + patternState + .setError(new SinglePredicateError(entry.getKey(), SinglePredicateError.ErrorType.MIN_COUNT, + entry.getIntValue())); + return false; + } + } + + patternState.setError(null); + return true; + } + + /** + * Checks a specific slice for validity + * + * @param controllerPos The position of the controller + * @param frontFacing The front facing of the controller + * @param upwardsFacing The up facing of the controller + * @param sliceIndex The index of the slice, this is where the pattern is gotten from, treats repeatable slices + * as only 1 + * @param sliceOffset The offset of the slice, how much offset in sliceDir to check the blocks in world, for + * example, if the first slice is repeated 2 times, sliceIndex is 1 while this is 2 + * @param flip Whether to flip or not + * @return True if the check passed + */ + public boolean checkSlice(BlockPos.MutableBlockPos controllerPos, PatternState patternState, Direction frontFacing, + Direction upwardsFacing, + int sliceIndex, int sliceOffset, boolean flip) { + Direction absoluteSlice = directions[0].getRelativeFacing(frontFacing, upwardsFacing, flip); + Direction absoluteString = directions[1].getRelativeFacing(frontFacing, upwardsFacing, flip); + Direction absoluteChar = directions[2].getRelativeFacing(frontFacing, upwardsFacing, flip); + + BlockPos.MutableBlockPos sliceStart = startPos(controllerPos, frontFacing, upwardsFacing, flip) + .move(absoluteSlice, sliceOffset); + + BlockPos.MutableBlockPos stringStart = sliceStart.mutable(); + BlockPos.MutableBlockPos charPos = sliceStart.mutable(); + PatternSlice slice = slices[sliceIndex]; + + patternState.layerCount.clear(); + + for (int stringIdx = 0; stringIdx < dimensions[1]; stringIdx++) { + for (int charIdx = 0; charIdx < dimensions[2]; charIdx++) { + patternState.currentBlockInfo.setCurrentPos(charPos); + PatternPredicate pred = predicates.get(slice.charAt(stringIdx, charIdx)); + + if (!pred.equals(PatternPredicate.ANY)) { + BlockEntity blockEntity = patternState.currentBlockInfo.retrieveCurrentBlockEntity(); + BlockState state = patternState.currentBlockInfo.retrieveCurrentBlockState(); + patternState.cache.put(charPos.asLong(), new BlockInfo(state, blockEntity)); + } + + List errors = pred.test(patternState.currentBlockInfo, patternState.globalCount, + patternState.layerCount); + if (!errors.isEmpty()) { + patternState.setErrors(errors); + return false; + } + + charPos.move(absoluteChar); + } + + stringStart.move(absoluteString); + charPos.set(stringStart); + } + + for (Object2IntMap.Entry entry : patternState.layerCount.object2IntEntrySet()) { + if (entry.getIntValue() < entry.getKey().minSliceCount) { + patternState.setError( + new SinglePredicateError(entry.getKey(), SinglePredicateError.ErrorType.MIN_LAYER_COUNT, + entry.getIntValue())); + return false; + } + } + + return true; + } + + public int getRepetitionCount(int sliceIndex) { + return slices[sliceIndex].actualRepeats; + } + + private BlockPos.MutableBlockPos startPos(BlockPos.MutableBlockPos controllerPos, Direction frontFacing, + Direction upwardsFacing, boolean flip) { + BlockPos.MutableBlockPos start = controllerPos.mutable(); + offset.apply(start, frontFacing, upwardsFacing, flip); + return start; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/CurrentBlockInfo.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/CurrentBlockInfo.java new file mode 100644 index 00000000000..c849a4d38f4 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/CurrentBlockInfo.java @@ -0,0 +1,81 @@ +package com.gregtechceu.gtceu.api.multiblock.pattern; + +import com.gregtechceu.gtceu.GTCEu; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.Nullable; + +import java.util.Objects; + +public class CurrentBlockInfo { + + @Setter + @Getter + protected @Nullable Level level; + @Getter + private BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos(); + @Getter + private @Nullable BlockState blockState; + @Getter + private @Nullable BlockEntity blockEntity; + private boolean resolvedBlockEntity; + + public BlockState retrieveCurrentBlockState() { + if (this.blockState == null && level != null) { + this.blockState = level.getBlockState(pos); + } + Objects.requireNonNull(blockState, String.format("Failed to retrieve block state at %s", pos)); + return blockState; + } + + public @Nullable BlockEntity retrieveCurrentBlockEntity() { + BlockState state = retrieveCurrentBlockState(); + if (!state.hasBlockEntity()) { + return null; + } + if (blockEntity == null && !resolvedBlockEntity && level != null) { + blockEntity = level.getBlockEntity(pos); + resolvedBlockEntity = true; + } + return blockEntity; + } + + public void setCurrentPos(BlockPos pos) { + this.pos.set(pos); + updateStateAndEntity(); + } + + public void setCurrentPos(BlockPos.MutableBlockPos pos) { + this.pos.set(pos); + updateStateAndEntity(); + } + + public BlockPos getBlockPos() { + return pos; + } + + private void updateStateAndEntity() { + if (level == null) { + GTCEu.LOGGER.error("Level is null in CurrentBlockInfo"); + return; + } + blockState = level.getBlockState(pos); + blockEntity = level.getBlockEntity(pos); + resolvedBlockEntity = true; + } + + public CurrentBlockInfo shallowCopy() { + CurrentBlockInfo ret = new CurrentBlockInfo(); + ret.level = level; + ret.pos = pos; + ret.blockState = blockState; + ret.blockEntity = blockEntity; + return ret; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/ExpandableMultiblockPatternBuilder.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/ExpandableMultiblockPatternBuilder.java new file mode 100644 index 00000000000..9617bb8545b --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/ExpandableMultiblockPatternBuilder.java @@ -0,0 +1,54 @@ +package com.gregtechceu.gtceu.api.multiblock.pattern; + +import com.gregtechceu.gtceu.api.multiblock.PatternPredicate; +import com.gregtechceu.gtceu.api.multiblock.util.RelativeDirection; + +import net.minecraft.core.BlockPos; + +import lombok.Setter; +import lombok.experimental.Accessors; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Objects; +import java.util.function.BiFunction; + +@Accessors(fluent = true, chain = true) +public class ExpandableMultiblockPatternBuilder { + + @Setter + protected @Nullable ExpandablePattern.BoundsProvider boundsProvider; + @Setter + protected @Nullable ExpandablePattern.BoundsConstraintProvider constraintProvider; + @Setter + protected @Nullable BiFunction, PatternPredicate> predicateProvider; + protected final RelativeDirection[] directions = new RelativeDirection[3]; + + private ExpandableMultiblockPatternBuilder(RelativeDirection aisleDir, RelativeDirection stringDir, + RelativeDirection charDir) { + directions[0] = aisleDir; + directions[1] = stringDir; + directions[2] = charDir; + RelativeDirection.validateFacingsArray(directions); + } + + public static ExpandableMultiblockPatternBuilder start(RelativeDirection aisleDir, RelativeDirection stringDir, + RelativeDirection charDir) { + return new ExpandableMultiblockPatternBuilder(aisleDir, stringDir, charDir); + } + + public static ExpandableMultiblockPatternBuilder start() { + return new ExpandableMultiblockPatternBuilder(RelativeDirection.BACK, RelativeDirection.UP, + RelativeDirection.RIGHT); + } + + public ExpandablePattern build() { + Objects.requireNonNull(boundsProvider, "Bound function is null"); + Objects.requireNonNull(predicateProvider, "Predicate function is null"); + ExpandablePattern pattern = new ExpandablePattern(boundsProvider, predicateProvider, directions); + if (constraintProvider != null) { + pattern.setBoundsConstraints(constraintProvider); + } + return pattern; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/ExpandablePattern.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/ExpandablePattern.java new file mode 100644 index 00000000000..2953e9c2f46 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/ExpandablePattern.java @@ -0,0 +1,191 @@ +package com.gregtechceu.gtceu.api.multiblock.pattern; + +import com.gregtechceu.gtceu.api.multiblock.OriginOffset; +import com.gregtechceu.gtceu.api.multiblock.PatternPredicate; +import com.gregtechceu.gtceu.api.multiblock.error.PatternError; +import com.gregtechceu.gtceu.api.multiblock.error.SinglePredicateError; +import com.gregtechceu.gtceu.api.multiblock.util.BlockInfo; +import com.gregtechceu.gtceu.api.multiblock.util.RelativeDirection; + +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 net.minecraft.world.level.block.state.BlockState; + +import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntIntPair; +import it.unimi.dsi.fastutil.ints.IntList; +import it.unimi.dsi.fastutil.longs.*; +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.function.BiFunction; + +public class ExpandablePattern implements IBlockPattern { + + @FunctionalInterface + public interface BoundsProvider { + + @Nullable + IntList apply(Level level, BlockPos.MutableBlockPos pos, Direction front, Direction upwards); + + BoundsProvider EMPTY = (l, p, f, u) -> new IntArrayList(new int[] { 0, 0, 0, 0, 0, 0 }); + } + + @FunctionalInterface + public interface BoundsConstraintProvider { + + List apply(); + } + + protected final BoundsProvider boundsProvider; + @Getter + @Setter + protected @Nullable BoundsConstraintProvider boundsConstraints = null; + @Getter + protected final BiFunction, PatternPredicate> predicateProvider; + @Getter + protected final OriginOffset offset = new OriginOffset(); + + @Getter + protected final RelativeDirection[] directions; + + public ExpandablePattern(BoundsProvider boundsProvider, + BiFunction, PatternPredicate> predicateProvider, + RelativeDirection[] directions) { + this.boundsProvider = boundsProvider; + this.predicateProvider = predicateProvider; + this.directions = directions; + } + + @Override + public void checkPatternFastAt(Level level, PatternState patternState, BlockPos centerPos, Direction frontFacing, + Direction upwardsFacing, boolean allowsFlip) { + if (!patternState.cache.isEmpty()) { + boolean pass = true; + BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos(); + for (var entry : patternState.cache.long2ObjectEntrySet()) { + pos.set(entry.getLongKey()); + BlockState state = level.getBlockState(pos); + + if (state != entry.getValue().getBlockState()) { + pass = false; + break; + } + + BlockEntity cachedBE = entry.getValue().getBlockEntity(); + if (cachedBE != null) { + BlockEntity be = level.getBlockEntity(pos); + if (be != cachedBE) { + pass = false; + break; + } + } + } + if (pass) { + if (patternState.hasErrors()) { + patternState.setState(PatternState.CheckState.INVALID_CACHED); + } else { + patternState.setState(PatternState.CheckState.VALID_CACHED); + } + + return; + } + } + + patternState.setFlipped(false); + boolean valid = checkPatternAt(level, patternState, centerPos, frontFacing, upwardsFacing, false); + if (valid) { + patternState.setState(PatternState.CheckState.VALID_UNCACHED); + return; + } + + if (allowsFlip) { + valid = checkPatternAt(level, patternState, centerPos, frontFacing, upwardsFacing, true); + } + if (!valid) { + // maybe empty the block info part of the cache? + patternState.setState(PatternState.CheckState.INVALID_UNCACHED); + return; + } + + patternState.setState(PatternState.CheckState.VALID_UNCACHED); + patternState.setFlipped(true); + } + + @Override + public boolean checkPatternAt(Level level, PatternState patternState, BlockPos centerPos, Direction frontFacing, + Direction upwardsFacing, + boolean isFlipped) { + List bounds = boundsProvider.apply(level, centerPos.mutable(), frontFacing, upwardsFacing); + if (bounds.isEmpty()) return false; + + patternState.globalCount.clear(); + + BlockPos.MutableBlockPos negCorner = new BlockPos.MutableBlockPos(); + BlockPos.MutableBlockPos posCorner = new BlockPos.MutableBlockPos(); + + Direction[] absolutes = new Direction[3]; + + for (int i = 0; i < 3; i++) { + RelativeDirection selected = directions[i]; + + absolutes[i] = selected.getRelativeFacing(frontFacing, upwardsFacing, isFlipped); + + if (i == 0) { + negCorner.setX(-bounds.get(selected.oppositeOrdinal())); + posCorner.setX(bounds.get(selected.ordinal())); + } else if (i == 1) { + negCorner.setY(-bounds.get(selected.oppositeOrdinal())); + posCorner.setY(bounds.get(selected.ordinal())); + } else { + negCorner.setZ(-bounds.get(selected.oppositeOrdinal())); + posCorner.setZ(bounds.get(selected.ordinal())); + } + } + + patternState.currentBlockInfo.setLevel(level); + + BlockPos.MutableBlockPos translation = centerPos.mutable(); + + // SOUTH, UP, EAST means point is +z, line is +y, plane is +x. this basically means the x val of the iter is + // aisle count, y is str count, and z is char count. + for (var pos : BlockPos.betweenClosed(negCorner, posCorner)) { + BlockPos.MutableBlockPos mPos = pos.mutable(); + PatternPredicate pred = predicateProvider.apply(mPos, bounds); + + // this basically reshuffles the coordinates into absolute form from relative form + mPos.set(BlockPos.ZERO).move(absolutes[0], pos.getX()).move(absolutes[1], pos.getY()).move(absolutes[2], + pos.getZ()); + // translate from the origin to the center + mPos = mPos.offset(translation).mutable(); + patternState.currentBlockInfo.setCurrentPos(mPos); + + if (!pred.equals(PatternPredicate.ANY)) { + BlockState state = patternState.currentBlockInfo.retrieveCurrentBlockState(); + BlockEntity blockEntity = patternState.currentBlockInfo.retrieveCurrentBlockEntity(); + patternState.cache.put(mPos.asLong(), new BlockInfo(state, blockEntity)); + } + + List res = pred.test(patternState.currentBlockInfo, patternState.globalCount, null); + if (!res.isEmpty()) { + patternState.setErrors(res); + return false; + } + } + + for (var entry : patternState.globalCount.object2IntEntrySet()) { + if (entry.getIntValue() < entry.getKey().minCount) { + patternState.setError(new SinglePredicateError(entry.getKey(), + SinglePredicateError.ErrorType.MIN_COUNT, entry.getIntValue())); + return false; + } + } + + patternState.setError(null); + return true; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/IBlockPattern.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/IBlockPattern.java new file mode 100644 index 00000000000..9e117bbc4c7 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/IBlockPattern.java @@ -0,0 +1,55 @@ +package com.gregtechceu.gtceu.api.multiblock.pattern; + +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.multiblock.OriginOffset; +import com.gregtechceu.gtceu.api.multiblock.util.RelativeDirection; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; + +public interface IBlockPattern { + + /** + * Checks the pattern fast, this should always be preferred to checkPatternAt(...) for multiblock code. + * + * @param level The world the multiblock is in. + * @param centerPos The position of the controller. + * @param frontFacing The front facing of the controller, obtained via + * {@link MultiblockControllerMachine#getFrontFacing()} + * @param upwardsFacing The up facing of the controller, obtained via + * {@link MultiblockControllerMachine#getUpwardsFacing()} + * @param allowsFlip Whether the multiblock allows flipping. + * Will edit the internal state of the pattern. Check whether its valid first before using + * other fields. + */ + void checkPatternFastAt(Level level, PatternState state, BlockPos centerPos, Direction frontFacing, + Direction upwardsFacing, + boolean allowsFlip); + + /** + * Checks the whole pattern, you should probably use checkPatternFastAt(...) instead. + * + * @param level The world the multiblock is in. + * @param centerPos The position of the controller. + * @param frontFacing The front facing of the controller, obtained via + * {@link MultiblockControllerMachine#getFrontFacing()} + * @param upwardsFacing The up facing of the controller, obtained via + * {@link MultiblockControllerMachine#getUpwardsFacing()} + * @param isFlipped Is the multiblock flipped or not. + * @return True if the check passed, in which case the context is mutated for returning from checkPatternFastAt(...) + */ + boolean checkPatternAt(Level level, PatternState state, BlockPos centerPos, Direction frontFacing, + Direction upwardsFacing, + boolean isFlipped); + + OriginOffset getOffset(); + + default void moveOffset(RelativeDirection dir, int amount) { + getOffset().move(dir, amount); + } + + default void moveOffset(RelativeDirection dir) { + getOffset().move(dir); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/IStructureChangeIgnored.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/IStructureChangeIgnored.java new file mode 100644 index 00000000000..5397ee9087e --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/IStructureChangeIgnored.java @@ -0,0 +1,3 @@ +package com.gregtechceu.gtceu.api.multiblock.pattern; + +public interface IStructureChangeIgnored {} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/MultiblockPatternBuilder.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/MultiblockPatternBuilder.java new file mode 100644 index 00000000000..65bf2024cb1 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/MultiblockPatternBuilder.java @@ -0,0 +1,225 @@ +package com.gregtechceu.gtceu.api.multiblock.pattern; + +import com.gregtechceu.gtceu.api.multiblock.OriginOffset; +import com.gregtechceu.gtceu.api.multiblock.PatternPredicate; +import com.gregtechceu.gtceu.api.multiblock.util.RelativeDirection; + +import com.google.common.base.Joiner; +import it.unimi.dsi.fastutil.chars.Char2IntMap; +import it.unimi.dsi.fastutil.chars.Char2IntOpenHashMap; +import it.unimi.dsi.fastutil.chars.Char2ObjectMap; +import it.unimi.dsi.fastutil.chars.Char2ObjectOpenHashMap; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +/** + * A builder class for {@link BlockPattern}
+ * When the multiblock is placed, its facings are concrete. Then, the {@link RelativeDirection}s passed into + * {@link MultiblockPatternBuilder#start(RelativeDirection, RelativeDirection, RelativeDirection)} are ways in which the + * pattern progresses. It can be thought like this, where startPos() is either defined via + * {@link MultiblockPatternBuilder#startOffset(OriginOffset)}, or automatically detected(for legacy compat only, you + * should + * use {@link MultiblockPatternBuilder#startOffset(OriginOffset)} always for new code): + * + *
+ * {@code
+ * for(int sliceI in 0..slices):
+ *     for(int stringI in 0..strings):
+ *         for(int charI in 0..chars):
+ *             pos = startPos()
+ *             pos.move(sliceI in sliceDir)
+ *             pos.move(stringI in stringDir)
+ *             pos.move(charI in charDir)
+ *             predicate = slices[sliceI].stringAt(stringI).charAt(charI)
+ * }
+ * 
+ */ +public class MultiblockPatternBuilder { + + protected static final Joiner COMMA_JOINER = Joiner.on(","); + + private final int[] dimensions = { -1, -1, -1 }; + + private @Nullable OriginOffset offset; + private @Nullable OriginOffset anchorOffset; + private char centerChar; + private @Nullable SliceStrategy sliceStrategy; + + private final List slices = new ArrayList<>(); + + private final Char2ObjectMap<@Nullable PatternPredicate> symbolMap = new Char2ObjectOpenHashMap<>(); + + private final RelativeDirection[] directions = new RelativeDirection[3]; + + private MultiblockPatternBuilder(RelativeDirection sliceDir, RelativeDirection stringDir, + RelativeDirection charDir) { + directions[0] = sliceDir; + directions[1] = stringDir; + directions[2] = charDir; + RelativeDirection.validateFacingsArray(directions); + // todo is this wanted? + this.symbolMap.put(' ', PatternPredicate.ANY); + } + + public MultiblockPatternBuilder sliceRepeatable(int minRepeats, int maxRepeats, String... slice) { + validateSlice(slice); + for (String s : slice) { + for (char c : s.toCharArray()) { + if (!this.symbolMap.containsKey(c)) { + this.symbolMap.put(c, null); + } + } + } + + if (minRepeats > maxRepeats) { + throw new IllegalArgumentException("minRepeats must be smaller than maxRepeats"); + } + PatternSlice ps = new PatternSlice(slice); + ps.minRepeats = minRepeats; + ps.maxRepeats = maxRepeats; + slices.add(ps); + return this; + } + + public MultiblockPatternBuilder slice(String... slice) { + return sliceRepeatable(1, 1, slice); + } + + public MultiblockPatternBuilder startOffset(OriginOffset offset) { + this.offset = offset; + return this; + } + + public MultiblockPatternBuilder anchorOffset(OriginOffset anchorOffset) { + this.anchorOffset = anchorOffset; + return this; + } + + /** + * Start a new multiblock pattern builder, this is equivalent to + * {@link MultiblockPatternBuilder#start(RelativeDirection slice, RelativeDirection string, RelativeDirection char) + * FactoryBlockPattern.start(BACK, UP, RIGHT)} + * + */ + public static MultiblockPatternBuilder start() { + return new MultiblockPatternBuilder(RelativeDirection.BACK, RelativeDirection.UP, RelativeDirection.RIGHT); + } + + /** + * Starts the builder, each pair of {@link RelativeDirection} must be used at exactly once! + * + * @param sliceDir The direction slices progress in, each successive + * {@link MultiblockPatternBuilder#slice(String...)} + * progresses in this direction + * @param stringDir The direction strings progress in, each successive string in an slice progresses by this + * direction + * @param charDir The direction chars progress in, each successive char in a string progresses by this direction + */ + public static MultiblockPatternBuilder start(RelativeDirection sliceDir, RelativeDirection stringDir, + RelativeDirection charDir) { + return new MultiblockPatternBuilder(sliceDir, stringDir, charDir); + } + + public MultiblockPatternBuilder where(char symbol, PatternPredicate predicate) { + this.symbolMap.put(symbol, predicate); + if (predicate.isController()) centerChar = symbol; + return this; + } + + public MultiblockPatternBuilder sliceStrategy(SliceStrategy sliceStrategy) { + this.sliceStrategy = sliceStrategy; + return this; + } + + public IBlockPattern build() { + checkMissingPredicates(); + checkGlobalConstraints(); + this.dimensions[0] = slices.size(); + if (sliceStrategy == null) sliceStrategy = new BasicSliceStrategy(); + + sliceStrategy.finish(dimensions, directions, slices); + return new BlockPattern(slices.toArray(new PatternSlice[0]), sliceStrategy, dimensions, + directions, offset, anchorOffset, symbolMap, centerChar); + } + + private void checkMissingPredicates() { + List list = new ArrayList<>(); + + for (var entry : this.symbolMap.char2ObjectEntrySet()) { + if (entry.getValue() == null) { + list.add(entry.getCharKey()); + } + } + + if (!list.isEmpty()) { + throw new IllegalStateException("Predicates for character(s) " + COMMA_JOINER.join(list) + " are missing"); + } + } + + private void checkGlobalConstraints() { + Char2IntMap charCount = new Char2IntOpenHashMap(); + for (var slice : slices) { + for (var string : slice.getPattern()) { + for (char c : string) { + charCount.merge(c, 1, Integer::sum); + } + } + } + + for (var entry : symbolMap.char2ObjectEntrySet()) { + char symbol = entry.getCharKey(); + PatternPredicate predicate = entry.getValue(); + if (predicate == null) throw new IllegalArgumentException("Predicate for symbol " + symbol + " was null."); + + int maxCount = -1; + for (var basePredicate : predicate.subPredicates) { + if (basePredicate.maxCount == -1) { + maxCount = -1; + break; + } + if (basePredicate.minCount == basePredicate.maxCount) { + if (maxCount == -1) { + maxCount = basePredicate.minCount; + } else { + maxCount += basePredicate.minCount; + } + } + } + if (maxCount == -1) continue; + if (charCount.get(symbol) > maxCount) { + throw new IllegalArgumentException("Predicate has global max of " + maxCount + " but appears " + + charCount.get(symbol) + " times."); + } + } + } + + public void validateSlice(String[] slice) { + if (ArrayUtils.isEmpty(slice) || StringUtils.isEmpty(slice[0])) + throw new IllegalArgumentException("Empty pattern for slice"); + + if (dimensions[2] == -1) { + dimensions[2] = slice[0].length(); + } + + if (dimensions[1] == -1) { + dimensions[1] = slice.length; + } + + if (slice.length != dimensions[1]) { + throw new IllegalArgumentException("Expected slice with height of " + dimensions[1] + + ", but was given one with a height of " + slice.length); + } else { + for (String s : slice) { + if (s.length() != dimensions[2]) { + throw new IllegalArgumentException( + "Not all rows in the given slice are the correct width (expected " + dimensions[2] + + ", found one with " + s.length() + ")"); + } + } + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/PatternSlice.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/PatternSlice.java new file mode 100644 index 00000000000..10ededc9bc9 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/PatternSlice.java @@ -0,0 +1,79 @@ +package com.gregtechceu.gtceu.api.multiblock.pattern; + +import lombok.Getter; +import lombok.Setter; +import org.apache.commons.lang3.ArrayUtils; +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; + +public class PatternSlice { + + @Getter + protected int minRepeats, maxRepeats; + @Setter + @Getter + protected int actualRepeats; + @Getter + protected final char[][] pattern; + + private static char[][] toCharArray(String[] pattern) { + return Arrays.stream(pattern) + .map(String::toCharArray) + .toArray(char[][]::new); + } + + public PatternSlice(int minRepeats, int maxRepeats, char[][] pattern) { + this.pattern = pattern; + this.minRepeats = minRepeats; + this.maxRepeats = maxRepeats; + } + + public PatternSlice(int minRepeats, int maxRepeats, String[] pattern) { + this(minRepeats, maxRepeats, toCharArray(pattern)); + } + + public PatternSlice(int repeats, char[][] pattern) { + this(repeats, repeats, pattern); + } + + public PatternSlice(int repeats, String[] pattern) { + this(repeats, repeats, pattern); + } + + public PatternSlice(char[][] pattern) { + this(1, pattern); + } + + public PatternSlice(String[] pattern) { + this(1, pattern); + } + + public void setRepeats(int minRepeats, int maxRepeats) { + this.minRepeats = minRepeats; + this.maxRepeats = maxRepeats; + } + + public void setRepeats(int repeats) { + this.minRepeats = repeats; + this.maxRepeats = repeats; + } + + public int @Nullable [] firstInstanceOf(char c) { + for (int strI = 0; strI < pattern.length; strI++) { + int pos = ArrayUtils.indexOf(pattern[strI], c); + if (pos != -1) return new int[] { strI, pos }; + } + return null; + } + + public char charAt(int stringI, int charI) { + return pattern[stringI][charI]; + } + + public PatternSlice copy() { + PatternSlice c = new PatternSlice(minRepeats, maxRepeats, pattern.clone()); + c.actualRepeats = this.actualRepeats; + return c; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/PatternState.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/PatternState.java new file mode 100644 index 00000000000..9a231cd0a62 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/PatternState.java @@ -0,0 +1,150 @@ +package com.gregtechceu.gtceu.api.multiblock.pattern; + +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.multiblock.MultiblockWorldSavedData; +import com.gregtechceu.gtceu.api.multiblock.error.PatternError; +import com.gregtechceu.gtceu.api.multiblock.predicates.BasePredicate; +import com.gregtechceu.gtceu.api.multiblock.util.BlockInfo; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.state.BlockState; + +import it.unimi.dsi.fastutil.longs.Long2ObjectMap; +import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +/* + * Contains vital information to an instanced version of a structure pattern. + */ +public class PatternState { + + @Getter + protected @Nullable BlockPos controllerPos; + @Getter + protected @Nullable MultiblockControllerMachine controller; + @Getter + @Setter + protected boolean isFormed = false; + @Getter + protected volatile boolean isFlipped = false; + @Setter + @Getter + protected boolean actualFlipped = false; + @Setter + protected boolean shouldUpdate = true; + @Getter + protected @Nullable List errors; + @Setter + @Getter + protected CheckState state = CheckState.UNINITIALIZED; + @Getter + protected CurrentBlockInfo currentBlockInfo = new CurrentBlockInfo(); + protected final Object2IntMap globalCount = new Object2IntOpenHashMap<>(); + protected final Object2IntMap layerCount = new Object2IntOpenHashMap<>(); + @Getter + protected final Long2ObjectMap cache = new Long2ObjectOpenHashMap<>(); + + public void setController(MultiblockControllerMachine controller, BlockPos controllerPos) { + this.controller = controller; + this.controllerPos = controllerPos; + } + + @ApiStatus.Internal + public void setFlipped(boolean flipped) { + isFlipped = flipped; + } + + public boolean shouldUpdate() { + return shouldUpdate; + } + + public boolean hasErrors() { + return errors != null; + } + + public void setError(@Nullable PatternError error) { + this.errors = error != null ? List.of(error) : null; + } + + public void setErrors(@Nullable List error) { + this.errors = error; + } + + public void onBlockStateChanged(BlockPos pos, BlockState oldState, BlockState newState) { + if (!(currentBlockInfo.getLevel() instanceof ServerLevel serverLevel)) return; + if (pos.equals(controllerPos)) { + if (controller != null && !newState.is(controller.getBlockState().getBlock())) { + controller.invalidateStructure(MultiblockControllerMachine.DEFAULT_STRUCTURE); + MultiblockWorldSavedData.getOrCreate(serverLevel).removeMapping(this); + } + // block other than controller changed + } else if (controller != null) { + // if the blocks that changed where active blocks changing state, don't bother rechecking + if ((oldState.getBlock() == newState.getBlock()) && + newState.getBlock() instanceof IStructureChangeIgnored && + oldState.getBlock() instanceof IStructureChangeIgnored) { + return; + } + + for (var name : controller.getStructureNames()) { + PatternState patternState = controller.checkStructurePattern(name); + if (!patternState.hasErrors()) { + controller.formStructure(name); + } else { + controller.invalidateStructure(name); + if (name.equals(MultiblockControllerMachine.DEFAULT_STRUCTURE)) { + MultiblockWorldSavedData.getOrCreate(serverLevel).removeMapping(this); + controller.checkAndFormStructure(); + } + } + } + } + } + + @Getter + public enum CheckState { + + /** + * The cache doesn't match with the structure's data. The structure has been rechecked from scratch, is valid, + * and the cache is now populated. + */ + VALID_UNCACHED(true, false), + + /** + * The cache matches the structure's data. + */ + VALID_CACHED(true, true), + + /** + * The cache doesn't match with the structure's data. The structure has been rechecked from scratch, is invalid, + * and the cache is now empty. + */ + INVALID_CACHED(false, true), + + /** + * The cache is empty. The structure has been rechecked from scratch and is invalid, the cache remains empty. + */ + INVALID_UNCACHED(false, false), + + /** + * The Check State is not initialized, structure checking failed + */ + UNINITIALIZED(false, false); + + private final boolean valid; + private final boolean cached; + + CheckState(boolean valid, boolean cached) { + this.valid = valid; + this.cached = cached; + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/SliceStrategy.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/SliceStrategy.java new file mode 100644 index 00000000000..8e5004bbb4f --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/SliceStrategy.java @@ -0,0 +1,69 @@ +package com.gregtechceu.gtceu.api.multiblock.pattern; + +import com.gregtechceu.gtceu.api.multiblock.util.RelativeDirection; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; + +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public abstract class SliceStrategy { + + protected final int[] dimensions = new int[3]; + protected final RelativeDirection[] directions = new RelativeDirection[3]; + + @Getter + @Setter + private @Nullable BlockPattern pattern; + private @Nullable BlockPos.MutableBlockPos pos; + private @Nullable Direction front, up; + + public BlockPos.MutableBlockPos getPos() { + if (pos == null) throw new IllegalStateException("SliceStrategy.start() has not been called"); + return pos; + } + + public Direction getFront() { + if (front == null) throw new IllegalStateException("SliceStrategy.start() has not been called"); + return front; + } + + public Direction getUp() { + if (up == null) throw new IllegalStateException("SliceStrategy.start() has not been called"); + return up; + } + + /** + * Checks the slices + * + * @param flip Whether this is a flipped pattern check. + * @return Whether the pattern is formed after this. + */ + public abstract boolean check(PatternState state, boolean flip); + + /** + * Called at the start of a structure check. + */ + protected void start(BlockPos.MutableBlockPos pos, Direction front, Direction up) { + this.pos = pos; + this.front = front; + this.up = up; + } + + /** + * No more slices will be added. Check preconditions and throw exceptions here. + */ + protected void finish(int[] dimensions, RelativeDirection[] directions, List slices) { + System.arraycopy(dimensions, 0, this.dimensions, 0, 3); + System.arraycopy(directions, 0, this.directions, 0, 3); + } + + protected boolean checkSlice(PatternState state, int index, int offset, boolean flip) { + if (pattern == null) throw new IllegalStateException("BlockPattern not set."); + return pattern.checkSlice(getPos(), state, getFront(), getUp(), index, offset, flip); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/package-info.java new file mode 100644 index 00000000000..610ae751162 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/pattern/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.api.multiblock.pattern; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/BasePredicate.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/BasePredicate.java new file mode 100644 index 00000000000..de1ed8a2a06 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/BasePredicate.java @@ -0,0 +1,153 @@ +package com.gregtechceu.gtceu.api.multiblock.predicates; + +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.mui.MultiblockSchemaInfo; +import com.gregtechceu.gtceu.api.multiblock.PatternPredicate; +import com.gregtechceu.gtceu.api.multiblock.error.PatternError; +import com.gregtechceu.gtceu.api.multiblock.error.SinglePredicateError; +import com.gregtechceu.gtceu.api.multiblock.pattern.CurrentBlockInfo; +import com.gregtechceu.gtceu.api.multiblock.util.BlockInfo; +import com.gregtechceu.gtceu.client.renderer.PatternPreviewRenderer; +import com.gregtechceu.gtceu.common.item.behavior.TerminalBehavior; +import com.gregtechceu.gtceu.data.lang.LangHandler; +import com.gregtechceu.gtceu.data.lang.LangUtil; +import com.gregtechceu.gtceu.integration.recipeviewer.widgets.MultiblockPreviewWidget; + +import net.minecraft.client.Camera; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.event.RenderLevelStageEvent; + +import com.mojang.blaze3d.vertex.PoseStack; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import lombok.Getter; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.function.Function; + +public class BasePredicate { + + @Getter + public List candidates; + public Function errorPredicate; + public @Nullable List tooltips; + public int priority = 0; + public int minCount = -1; + public int maxCount = -1; + public int minSliceCount = -1; + public int maxSliceCount = -1; + public int previewCount = -1; + public boolean disableRenderFormed = false; + public @Nullable String nbtParser; + + protected String debugName; + + public BasePredicate() { + this.debugName = "Unknown"; + this.errorPredicate = $ -> null; + this.candidates = Collections.emptyList(); + } + + /** + * @param errorPredicate The predicate function for being a valid block state or tile entity in a pattern + * @param candidates The qualifying blocks or item stacks valid in this predicate based on information from + * either the + * {@link TerminalBehavior#use(Item, Level, Player, InteractionHand) + * Terminal Auto-Builder}, + * {@link PatternPreviewRenderer#draw(PoseStack, MultiBufferSource.BufferSource, Camera, RenderLevelStageEvent.Stage, float) + * In-world Preview} or + * {@link MultiblockPreviewWidget#MultiblockPreviewWidget(MultiblockMachineDefinition, MultiblockSchemaInfo, int, int) + * XEI Preview} + */ + public BasePredicate(Function errorPredicate, + @Nullable List candidates) { + this("Unknown", errorPredicate, candidates); + } + + public BasePredicate(String debugName, Function errorPredicate, + @Nullable List candidates) { + this.debugName = debugName; + this.errorPredicate = errorPredicate; + this.candidates = candidates != null ? candidates : Collections.emptyList(); + } + + @OnlyIn(Dist.CLIENT) + public List getTooltips(@Nullable PatternPredicate predicates) { + List result = new ArrayList<>(); + if (tooltips != null) { + result.addAll(tooltips); + } + if (minCount == maxCount && maxCount != -1) { + result.add(Component.translatable("gtceu.multiblock.pattern.error.limited_exact", minCount)); + } else if (minCount != maxCount && minCount != -1 && maxCount != -1) { + result.add(Component.translatable("gtceu.multiblock.pattern.error.limited_within", minCount, maxCount)); + } else { + if (minCount != -1) { + result.add(LangUtil.getFromMultiLang("gtceu.multiblock.pattern.error.limited", 1, minCount)); + } + if (maxCount != -1) { + result.add(LangUtil.getFromMultiLang("gtceu.multiblock.pattern.error.limited", 0, maxCount)); + } + } + if (predicates == null) return result; + if (predicates.isSingle()) { + result.add(Component.translatable("gtceu.multiblock.pattern.single")); + } + if (predicates.hasAir()) { + result.add(Component.translatable("gtceu.multiblock.pattern.replaceable_air")); + } + return result; + } + + public @Nullable PatternError testRaw(CurrentBlockInfo currBlock) { + return errorPredicate.apply(currBlock); + } + + public @Nullable PatternError testLimited(CurrentBlockInfo currBlock, + Object2IntMap globalCache, + @Nullable Object2IntMap layerCache) { + PatternError error = testGlobal(currBlock, globalCache, layerCache); + if (error != null) return error; + return testLayer(currBlock, layerCache); + } + + public @Nullable PatternError testGlobal(CurrentBlockInfo currentBlock, + Object2IntMap globalCache, + @Nullable Object2IntMap layerCache) { + PatternError error = errorPredicate.apply(currentBlock); + globalCache.mergeInt(this, (error == null ? 1 : 0), Integer::sum); + if ((minCount == -1 && maxCount == -1) || error != null || layerCache == null) return error; + + int count = globalCache.getInt(this); + if (maxCount == -1 || count <= maxCount) return null; + + return new SinglePredicateError(this, SinglePredicateError.ErrorType.MAX_COUNT, count); + } + + public @Nullable PatternError testLayer(CurrentBlockInfo currBlock, + @Nullable Object2IntMap layerCache) { + PatternError error = errorPredicate.apply(currBlock); + if (layerCache == null) return error; + + layerCache.mergeInt(this, (error == null ? 1 : 0), Integer::sum); + if ((minSliceCount == -1 && maxSliceCount == -1) || error != null) return error; + + if (maxSliceCount != -1 && layerCache.getInt(this) > maxSliceCount) { + return new SinglePredicateError(this, SinglePredicateError.ErrorType.MAX_LAYER_COUNT, + layerCache.getInt(this)); + } + + return null; + } + + public String getPredicateName() { + return debugName; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/PredicateBlockTag.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/PredicateBlockTag.java new file mode 100644 index 00000000000..26a448e2f39 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/PredicateBlockTag.java @@ -0,0 +1,42 @@ +package com.gregtechceu.gtceu.api.multiblock.predicates; + +import com.gregtechceu.gtceu.api.multiblock.Predicates; +import com.gregtechceu.gtceu.api.multiblock.util.BlockInfo; + +import net.minecraft.core.Holder; +import net.minecraft.core.HolderSet; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.block.Block; + +import org.jetbrains.annotations.Nullable; + +import java.util.Objects; + +public class PredicateBlockTag extends BasePredicate { + + public TagKey tag; + + public PredicateBlockTag(TagKey tag) { + this(null, tag); + } + + public PredicateBlockTag(@Nullable String debugName, TagKey tag) { + Objects.requireNonNull(tag, "PredicateBlockTag tag cannot be null"); + this.tag = tag; + + errorPredicate = state -> state.retrieveCurrentBlockState().is(tag) ? null : Predicates.PLACEHOLDER; + candidates = BuiltInRegistries.BLOCK.getTag(tag) + .stream() + .flatMap(HolderSet.Named::stream) + .map(Holder::value) + .map(BlockInfo::fromBlock) + .toList(); + + if (debugName == null) { + this.debugName = tag.registry().location() + "/" + tag.location(); + } else { + this.debugName = debugName; + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/PredicateBlocks.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/PredicateBlocks.java new file mode 100644 index 00000000000..3f22b008b80 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/PredicateBlocks.java @@ -0,0 +1,60 @@ +package com.gregtechceu.gtceu.api.multiblock.predicates; + +import com.gregtechceu.gtceu.api.multiblock.error.BlockMatchingError; +import com.gregtechceu.gtceu.api.multiblock.error.PatternError; +import com.gregtechceu.gtceu.api.multiblock.util.BlockInfo; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; + +import org.apache.commons.lang3.Validate; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Unmodifiable; + +import java.util.List; +import java.util.StringJoiner; + +public class PredicateBlocks extends BasePredicate { + + public final @Unmodifiable List blocks; + + public PredicateBlocks(Block... blocks) { + this(null, blocks); + } + + public PredicateBlocks(@Nullable String debugName, Block... blocks) { + this(null, List.of(blocks), null); + } + + public PredicateBlocks(@Nullable String debugName, List blocks, @Nullable PatternError error) { + if (blocks.isEmpty()) { + this.blocks = List.of(Blocks.BARRIER); + } else { + this.blocks = blocks; + } + Validate.noNullElements(this.blocks, "Blocks array has null element at index %s"); + + errorPredicate = state -> { + BlockPos pos = state.getPos(); + + return this.blocks.contains(state.retrieveCurrentBlockState().getBlock()) ? null : + (error == null ? new BlockMatchingError(pos, this.blocks) : error); + }; + + candidates = this.blocks.stream() + .map(BlockInfo::fromBlock) + .toList(); + + if (debugName == null) { + StringJoiner sb = new StringJoiner("-"); + for (Block b : blocks) { + sb.add(BuiltInRegistries.BLOCK.getKey(b).getPath()); + } + this.debugName = sb.toString(); + } else { + this.debugName = debugName; + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/PredicateFluidTag.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/PredicateFluidTag.java new file mode 100644 index 00000000000..a40d18ff814 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/PredicateFluidTag.java @@ -0,0 +1,40 @@ +package com.gregtechceu.gtceu.api.multiblock.predicates; + +import com.gregtechceu.gtceu.api.multiblock.Predicates; +import com.gregtechceu.gtceu.api.multiblock.util.BlockInfo; + +import net.minecraft.core.Holder; +import net.minecraft.core.HolderSet; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.material.Fluid; + +import org.jetbrains.annotations.Nullable; + +import java.util.Objects; + +public class PredicateFluidTag extends BasePredicate { + + public TagKey tag; + + public PredicateFluidTag(TagKey tag) { + this(null, tag); + } + + public PredicateFluidTag(@Nullable String debugName, TagKey tag) { + Objects.requireNonNull(tag, "PredicateFluidTag tag cannot be null"); + + this.tag = tag; + + errorPredicate = state -> state.retrieveCurrentBlockState().getFluidState().is(tag) ? null : + Predicates.PLACEHOLDER; + candidates = BuiltInRegistries.FLUID.getTag(tag) + .stream() + .flatMap(HolderSet.Named::stream) + .map(Holder::value) + .map(fluid -> BlockInfo.fromBlockState(fluid.defaultFluidState().createLegacyBlock())) + .toList(); + + this.debugName = Objects.requireNonNullElse(debugName, tag.registry().location() + "/" + tag.location()); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/PredicateFluids.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/PredicateFluids.java new file mode 100644 index 00000000000..adf1f2cd9f3 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/PredicateFluids.java @@ -0,0 +1,47 @@ +package com.gregtechceu.gtceu.api.multiblock.predicates; + +import com.gregtechceu.gtceu.api.multiblock.Predicates; +import com.gregtechceu.gtceu.api.multiblock.util.BlockInfo; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.Fluids; + +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.Validate; +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; +import java.util.StringJoiner; + +public class PredicateFluids extends BasePredicate { + + public final Fluid[] fluids; + + public PredicateFluids(Fluid... fluids) { + this(null, fluids); + } + + public PredicateFluids(@Nullable String debugName, Fluid... fluids) { + Validate.noNullElements(fluids, "Fluids array has null element at index %s"); + + if (fluids.length == 0) this.fluids = new Fluid[] { Fluids.WATER }; + else this.fluids = Arrays.stream(fluids).toArray(Fluid[]::new); + errorPredicate = state -> ArrayUtils.contains(this.fluids, + state.retrieveCurrentBlockState().getFluidState().getType()) ? + null : Predicates.PLACEHOLDER; + candidates = Arrays.stream(this.fluids) + .map(fluid -> BlockInfo.fromBlockState(fluid.defaultFluidState().createLegacyBlock())) + .toList(); + + if (debugName == null) { + StringJoiner sb = new StringJoiner("-"); + for (Fluid f : fluids) { + sb.add(BuiltInRegistries.FLUID.getKey(f).getPath()); + } + this.debugName = sb.toString(); + } else { + this.debugName = debugName; + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/PredicatePartAbility.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/PredicatePartAbility.java new file mode 100644 index 00000000000..fe5f941a6de --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/PredicatePartAbility.java @@ -0,0 +1,65 @@ +package com.gregtechceu.gtceu.api.multiblock.predicates; + +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.multiblock.error.PartAbilityError; +import com.gregtechceu.gtceu.api.multiblock.util.BlockInfo; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; + +import org.apache.commons.lang3.Validate; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Unmodifiable; + +import java.util.List; +import java.util.Objects; + +public class PredicatePartAbility extends BasePredicate { + + public final @Unmodifiable List blocks; + public final PartAbility partAbility; + + public PredicatePartAbility(@Nullable String debugName, PartAbility partAbility) { + this.debugName = Objects.requireNonNullElse(debugName, "Unknown Part Ability"); + this.partAbility = partAbility; + if (partAbility.getAllBlocks().isEmpty()) { + this.blocks = List.of(Blocks.BARRIER); + } else { + this.blocks = partAbility.getAllBlocks().stream().toList(); + } + Validate.noNullElements(this.blocks, "Blocks array has null element at index %s"); + + errorPredicate = state -> { + BlockPos pos = state.getPos(); + + return this.blocks.contains(state.retrieveCurrentBlockState().getBlock()) ? null : + new PartAbilityError(pos, partAbility); + }; + + candidates = this.blocks.stream() + .map(BlockInfo::fromBlock) + .toList(); + } + + public PredicatePartAbility(@Nullable String debugName, PartAbility partAbility, int... tiers) { + this.debugName = Objects.requireNonNullElse(debugName, "Unknown Part Ability"); + this.partAbility = partAbility; + if (partAbility.getAllBlocks().isEmpty()) { + this.blocks = List.of(Blocks.BARRIER); + } else { + this.blocks = partAbility.getBlocks(tiers).stream().toList(); + } + Validate.noNullElements(this.blocks, "Blocks array has null element at index %s"); + errorPredicate = state -> { + BlockPos pos = state.getPos(); + + return this.blocks.contains(state.getBlockState().getBlock()) ? null : + new PartAbilityError(pos, partAbility); + }; + + candidates = this.blocks.stream() + .map(BlockInfo::fromBlock) + .toList(); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/PredicateStates.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/PredicateStates.java new file mode 100644 index 00000000000..2ea66e92936 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/PredicateStates.java @@ -0,0 +1,50 @@ +package com.gregtechceu.gtceu.api.multiblock.predicates; + +import com.gregtechceu.gtceu.api.multiblock.error.BlockMatchingError; +import com.gregtechceu.gtceu.api.multiblock.util.BlockInfo; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; + +import org.apache.commons.lang3.Validate; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.StringJoiner; + +public class PredicateStates extends BasePredicate { + + public final List states; + + public PredicateStates(BlockState[] states) { + this(null, states); + } + + public PredicateStates(@Nullable String debugName, BlockState... states) { + Validate.noNullElements(states, "Blockstate array has null element at index %s"); + + if (states.length == 0) { + this.states = List.of(Blocks.BARRIER.defaultBlockState()); + } else { + this.states = List.of(states); + } + errorPredicate = state -> { + return this.states.contains(state.retrieveCurrentBlockState()) ? null : + new BlockMatchingError(state.getBlockPos(), this.states.stream() + .map(BlockBehaviour.BlockStateBase::getBlock).toList()); + }; + candidates = this.states.stream().map(BlockInfo::fromBlockState).toList(); + + if (debugName == null) { + StringJoiner sb = new StringJoiner("-"); + for (BlockState state : states) { + sb.add(BuiltInRegistries.BLOCK.getKey(state.getBlock()).getPath()); + } + this.debugName = sb.toString(); + } else { + this.debugName = debugName; + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/package-info.java new file mode 100644 index 00000000000..31fb5fc8865 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/predicates/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.api.multiblock.predicates; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/util/AbstractStructureHelper.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/util/AbstractStructureHelper.java new file mode 100644 index 00000000000..60b97856e3c --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/util/AbstractStructureHelper.java @@ -0,0 +1,144 @@ +package com.gregtechceu.gtceu.api.multiblock.util; + +import com.gregtechceu.gtceu.api.block.MetaMachineBlock; +import com.gregtechceu.gtceu.api.block.property.GTBlockStateProperties; +import com.gregtechceu.gtceu.api.multiblock.PatternPredicate; +import com.gregtechceu.gtceu.api.multiblock.pattern.IBlockPattern; +import com.gregtechceu.gtceu.api.multiblock.predicates.BasePredicate; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; + +import com.google.common.collect.HashBasedTable; +import com.google.common.collect.Table; +import it.unimi.dsi.fastutil.ints.Int2IntMap; +import it.unimi.dsi.fastutil.ints.IntIntPair; +import it.unimi.dsi.fastutil.ints.IntList; +import it.unimi.dsi.fastutil.longs.Long2ObjectMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import lombok.Getter; +import org.jetbrains.annotations.Nullable; + +import java.util.Map; + +public abstract class AbstractStructureHelper { + + public static final Direction[] DIRECTIONS_IN_ORDER = { Direction.NORTH, Direction.SOUTH, Direction.WEST, + Direction.EAST, Direction.UP, Direction.DOWN }; + + @Getter + protected final HashBasedTable blockPreferences = HashBasedTable + .create(); + protected final HashBasedTable minMaxPreferences = HashBasedTable + .create(); + protected @Nullable Block controllerBlock; + + public static AbstractStructureHelper blockPattern(Int2IntMap sliceRepeats) { + return new BlockPatternHelper(sliceRepeats); + } + + public static AbstractStructureHelper expandable(IntList sliceRepeats) { + return new ExpandablePatternHelper(sliceRepeats); + } + + public Table getMinMaxPreferences() { + return this.minMaxPreferences; + } + + public void populate(Map resultStructure, IBlockPattern pattern, + @Nullable Long2ObjectMap userBlockPreferences, + Direction frontFacing, Direction upFacing, boolean isFlipped) { + setup(pattern, frontFacing, upFacing, isFlipped); + if (userBlockPreferences != null && !userBlockPreferences.isEmpty()) { + populateWithUserBlockPreferences(resultStructure, pattern, userBlockPreferences, frontFacing, upFacing, + isFlipped); + } + populateFromPattern(resultStructure, pattern, frontFacing, upFacing, isFlipped); + fixRotationsAndFacing(resultStructure, frontFacing, upFacing, this.controllerBlock); + } + + protected void setup(IBlockPattern pattern, Direction frontFacing, Direction upFacing, boolean isFlipped) {} + + protected abstract void populateWithUserBlockPreferences(Map resultStructure, + IBlockPattern pattern, + Long2ObjectMap userBlockPreferences, + Direction frontFacing, Direction upFacing, + boolean isFlipped); + + protected abstract void populateFromPattern(Map resultStructure, IBlockPattern pattern, + Direction frontFacing, Direction upFacing, boolean isFlipped); + + public abstract PatternPredicate getPredicateFromPos(IBlockPattern pattern, BlockPos pos, + Direction frontFacing, Direction upFacing, boolean isFlipped); + + protected int getMinCount(PatternPredicate predicate, BasePredicate basePredicate) { + if (!minMaxPreferences.contains(predicate, basePredicate)) + return basePredicate.minCount; + return minMaxPreferences.get(predicate, basePredicate).leftInt(); + } + + protected int getMaxCount(PatternPredicate predicate, BasePredicate basePredicate) { + if (!minMaxPreferences.contains(predicate, basePredicate)) + return basePredicate.maxCount; + return minMaxPreferences.get(predicate, basePredicate).rightInt(); + } + + protected static int countPopulatedGlobal(Map resultStructure, BasePredicate basePredicate) { + return (int) resultStructure.values().stream() + .filter(blockInfo -> basePredicate.getCandidates().contains(blockInfo)) + .count(); + } + + protected static int countPopulatedInLayer(Map resultStructure, BasePredicate basePredicate, + Direction dir, int offset) { + return (int) resultStructure.entrySet().stream() + .filter(e -> getCoordFromDir(e.getKey(), dir) == offset) + .filter(e -> basePredicate.getCandidates().contains(e.getValue())) + .count(); + } + + protected static int getCoordFromDir(BlockPos pos, Direction dir) { + return dir.getAxis().choose(pos.getX(), pos.getY(), pos.getZ()); + } + + protected static void fixRotationsAndFacing(Map resultStructure, Direction frontFacing, + Direction upFacing, @Nullable Block controllerBlock) { + Map toUpdate = new Object2ObjectOpenHashMap<>(); + for (var entry : resultStructure.entrySet()) { + BlockPos pos = entry.getKey(); + BlockState currentState = entry.getValue().getBlockState(); + if (!(currentState.getBlock() instanceof MetaMachineBlock machine)) { + continue; + } + if (!currentState.hasProperty(machine.getRotationState().property)) continue; + + if (machine == controllerBlock) { + BlockState newState = currentState.setValue(machine.getRotationState().property, frontFacing); + if (newState.hasProperty(GTBlockStateProperties.UPWARDS_FACING)) { + newState = newState.setValue(GTBlockStateProperties.UPWARDS_FACING, upFacing); + } + toUpdate.put(pos, newState); + continue; + } + + Direction validFacing = null; + for (Direction dir : DIRECTIONS_IN_ORDER) { + // make sure the machine can face this way + if (!machine.getRotationState().test(dir)) continue; + // and that there won't be a block in front of it + if (!resultStructure.containsKey(pos.relative(dir))) { + validFacing = dir; + break; + } + } + if (validFacing != null) { + toUpdate.put(pos, currentState.setValue(machine.getRotationState().property, validFacing)); + } + } + for (var entry : toUpdate.entrySet()) { + resultStructure.put(entry.getKey(), BlockInfo.fromBlockState(entry.getValue())); + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/util/BlockInfo.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/util/BlockInfo.java new file mode 100644 index 00000000000..73eedc53704 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/util/BlockInfo.java @@ -0,0 +1,108 @@ +package com.gregtechceu.gtceu.api.multiblock.util; + +import com.gregtechceu.gtceu.client.util.FakeBlockTintGetter; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +import com.mojang.serialization.Codec; +import lombok.Getter; +import org.jetbrains.annotations.Nullable; + +import java.util.Objects; + +public class BlockInfo { + + public static final Codec CODEC = BlockState.CODEC.xmap(BlockInfo::fromBlockState, + BlockInfo::getBlockState); + + public static final FakeBlockTintGetter FAKE_LEVEL = new FakeBlockTintGetter(); + + public static final BlockInfo EMPTY = new BlockInfo(Blocks.AIR); + + @Getter + private final BlockState blockState; + private final @Nullable ItemStack itemStack; + @Getter + private final @Nullable BlockEntity blockEntity; + + public BlockInfo(Block block) { + this(block.defaultBlockState()); + } + + public BlockInfo(BlockState blockState) { + this(blockState, null, null); + } + + public BlockInfo(BlockState blockState, @Nullable BlockEntity blockEntity) { + this(blockState, null, blockEntity); + } + + public BlockInfo(BlockState blockState, @Nullable ItemStack itemStack, + @Nullable BlockEntity blockEntity) { + this.blockState = blockState; + this.itemStack = itemStack; + this.blockEntity = blockEntity; + + FAKE_LEVEL.setState(blockState); + } + + public static BlockInfo fromBlockState(BlockState state) { + return new BlockInfo(state); + } + + public static BlockInfo fromBlock(Block block) { + return fromBlockState(block.defaultBlockState()); + } + + public @Nullable BlockEntity getBlockEntity(Level level, BlockPos pos) { + BlockEntity entity = getBlockEntity(); + if (entity != null) { + entity.setLevel(level); + } + return entity; + } + + public ItemStack getItemStackForm() { + return itemStack == null ? new ItemStack(blockState.getBlock()) : itemStack; + } + + public ItemStack getItemStackForm(BlockAndTintGetter level, BlockPos pos) { + if (itemStack != null) return itemStack; + + BlockAndTintGetter oldParent = FAKE_LEVEL.parent; + try { + FAKE_LEVEL.setParent(level); + FAKE_LEVEL.setState(this.blockState); + FAKE_LEVEL.setPos(pos); + return blockState.getBlock().getCloneItemStack(FAKE_LEVEL, pos, this.blockState); + } finally { + FAKE_LEVEL.setParent(oldParent); + } + } + + public void apply(Level level, BlockPos pos) { + level.setBlockAndUpdate(pos, blockState); + if (blockEntity != null) { + level.setBlockEntity(blockEntity); + } + } + + @Override + public boolean equals(@Nullable Object o) { + if (o == null || getClass() != o.getClass()) return false; + BlockInfo blockInfo = (BlockInfo) o; + return Objects.equals(this.blockState, blockInfo.blockState); + } + + @Override + public int hashCode() { + return this.blockState.hashCode(); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/util/BlockPatternHelper.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/util/BlockPatternHelper.java new file mode 100644 index 00000000000..33599059c91 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/util/BlockPatternHelper.java @@ -0,0 +1,293 @@ +package com.gregtechceu.gtceu.api.multiblock.util; + +import com.gregtechceu.gtceu.api.multiblock.PatternPredicate; +import com.gregtechceu.gtceu.api.multiblock.pattern.BlockPattern; +import com.gregtechceu.gtceu.api.multiblock.pattern.IBlockPattern; +import com.gregtechceu.gtceu.api.multiblock.pattern.PatternSlice; +import com.gregtechceu.gtceu.api.multiblock.predicates.BasePredicate; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; + +import it.unimi.dsi.fastutil.ints.Int2IntMap; +import it.unimi.dsi.fastutil.longs.Long2ObjectMap; +import org.jetbrains.annotations.UnmodifiableView; + +import java.util.Map; + +public class BlockPatternHelper extends AbstractStructureHelper { + + private final Int2IntMap sliceRepeats; + private char[][][] flattenedBlockPattern = new char[0][][]; + + protected BlockPatternHelper(Int2IntMap sliceRepeats) { + this.sliceRepeats = sliceRepeats; + } + + public PatternPredicate getPredicateFromPos(IBlockPattern pattern, BlockPos pos, + Direction frontFacing, Direction upFacing, boolean isFlipped) { + BlockPattern blockPattern = (BlockPattern) pattern; + char[][][] flattenedBlockPattern = flattenBlockPattern(blockPattern); + char[][][] adjustedBlockPattern = rotateAndFlipPattern(flattenedBlockPattern, blockPattern.getDirections(), + frontFacing, upFacing, isFlipped); + Vec3i dimensions = getDimensions(adjustedBlockPattern); + if (pos.getX() < 0 || pos.getX() >= dimensions.getX() || + pos.getY() < 0 || pos.getY() >= dimensions.getY() || + pos.getZ() < 0 || pos.getZ() >= dimensions.getZ()) { + return PatternPredicate.AIR; + } + char c = adjustedBlockPattern[pos.getX()][pos.getY()][pos.getZ()]; + return blockPattern.getPredicates().get(c); + } + + protected void setup(IBlockPattern pattern, Direction frontFacing, Direction upFacing, boolean isFlipped) { + BlockPattern blockPattern = (BlockPattern) pattern; + this.flattenedBlockPattern = rotateAndFlipPattern(flattenBlockPattern(blockPattern), + blockPattern.getDirections(), + frontFacing, upFacing, isFlipped); + } + + protected void populateWithUserBlockPreferences(Map resultStructure, IBlockPattern pattern, + Long2ObjectMap userBlockPreferences, + Direction frontFacing, Direction upFacing, boolean isFlipped) { + BlockPattern blockPattern = (BlockPattern) pattern; + + Vec3i dimensions = getDimensions(this.flattenedBlockPattern); + Direction sliceDir = blockPattern.getDirections()[0].getRelativeFacing(frontFacing, upFacing, isFlipped); + + for (var blockPreference : userBlockPreferences.long2ObjectEntrySet()) { + BlockPos pos = BlockPos.of(blockPreference.getLongKey()); + BlockInfo blockInfo = blockPreference.getValue(); + if (pos.getX() >= dimensions.getX() || + pos.getY() >= dimensions.getY() || + pos.getZ() >= dimensions.getZ()) { + throw new IllegalStateException( + "BlockPos preference " + pos + "is outside of bounds for pattern of size " + + dimensions.getX() + "," + dimensions.getY() + "," + dimensions.getZ()); + } + char c = this.flattenedBlockPattern[pos.getX()][pos.getY()][pos.getZ()]; + PatternPredicate predicate = blockPattern.getPredicates().get(c); + if (!isValidCandidate(resultStructure, predicate, pos, blockInfo, sliceDir)) { + throw new IllegalStateException("Invalid preference " + blockInfo.getBlockState().getBlock().getName() + + " for position " + pos); + } + resultStructure.put(pos, blockInfo); + } + } + + protected void populateFromPattern(Map resultStructure, IBlockPattern pattern, + Direction frontFacing, Direction upFacing, boolean isFlipped) { + // spotless:off + // 4. Iterate slice by slice (a slice == one "layer"), then over the other two axes within the slice, + // get the char at that position, + // 4a. Go through every BasePredicate in order of priority, see if there's a minCount/minLayerCount that's + // not satisfied yet, then try those + // 4b. If all basePredicates with a mincount/minLayerCount are satisfied, place the first predicate that works + // 4c. If the BasePredicate is at its max (maxCount/maxLayerCount), remove it from the list to be considered + // 4d. error if none are valid candidates(?) + // spotless:on + + BlockPattern blockPattern = (BlockPattern) pattern; + Vec3i dimensions = getDimensions(this.flattenedBlockPattern); + Direction sliceDir = blockPattern.getDirections()[0].getRelativeFacing(frontFacing, upFacing, isFlipped); + Direction stringDir = blockPattern.getDirections()[1].getRelativeFacing(frontFacing, upFacing, isFlipped); + Direction charDir = blockPattern.getDirections()[2].getRelativeFacing(frontFacing, upFacing, isFlipped); + Direction.Axis sliceAxis = sliceDir.getAxis(); + Direction.Axis stringAxis = stringDir.getAxis(); + Direction.Axis charAxis = charDir.getAxis(); + + for (int sliceCoord = 0; sliceCoord < dimensions.get(sliceAxis); sliceCoord++) { + for (int stringCoord = 0; stringCoord < dimensions.get(stringAxis); stringCoord++) { + for (int charCoord = 0; charCoord < dimensions.get(charAxis); charCoord++) { + // convert from local pattern relative directions to global xyz ordering + BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos(); + setAxis(pos, sliceAxis, sliceCoord); + setAxis(pos, stringAxis, stringCoord); + setAxis(pos, charAxis, charCoord); + + if (resultStructure.containsKey(pos)) continue; + + char c = this.flattenedBlockPattern[pos.getX()][pos.getY()][pos.getZ()]; + PatternPredicate predicate = blockPattern.getPredicates().get(c); + + if (predicate == PatternPredicate.AIR || predicate == PatternPredicate.ANY) { + continue; + } + + // Attempts to first place the predicate if the minimum (layer) count isn't satisfied, then the + // maximum (layer) count + if (tryMinCount(resultStructure, predicate, pos, sliceDir, sliceCoord)) continue; + if (tryMaxCount(resultStructure, predicate, pos, sliceDir, sliceCoord)) continue; + // If we arrive here, there's nothing we can place that doesn't overflow a max count! + throw new IllegalStateException( + "Could not place a block without breaking maxCount requirements for character " + c); + } + } + } + } + + private boolean tryMinCount(Map resultStructure, PatternPredicate predicate, + BlockPos pos, Direction dir, int offset) { + for (BasePredicate basePredicate : predicate.subPredicates) { + int minCount = getMinCount(predicate, basePredicate); + if (minCount == 0) continue; + + int totalAlreadyPopulated = countPopulatedGlobal(resultStructure, basePredicate); + int layerAlreadyPopulated = countPopulatedInLayer(resultStructure, basePredicate, dir, offset); + boolean globalMinUnmet = minCount > 0 && totalAlreadyPopulated < minCount; + boolean layerMinUnmet = basePredicate.minSliceCount > 0 && + layerAlreadyPopulated < basePredicate.minSliceCount; + if (!globalMinUnmet && !layerMinUnmet) continue; + + BlockInfo toInsert = blockPreferences.get(predicate, basePredicate); + if (toInsert == null) { + toInsert = basePredicate.getCandidates().get(0); + } + // TODO: is this needed? doesn't this just do what we're already doing? + if (isValidCandidate(resultStructure, predicate, pos, toInsert, dir)) { + resultStructure.put(pos, toInsert); + if (this.controllerBlock == null && predicate.isController()) { + this.controllerBlock = toInsert.getBlockState().getBlock(); + } + return true; + } + } + return false; + } + + private boolean tryMaxCount(Map resultStructure, PatternPredicate predicate, + BlockPos pos, Direction dir, int offset) { + for (BasePredicate basePredicate : predicate.subPredicates) { + int maxCount = getMaxCount(predicate, basePredicate); + if (maxCount == 0) continue; + + int totalAlreadyPopulated = countPopulatedGlobal(resultStructure, basePredicate); + int layerAlreadyPopulated = countPopulatedInLayer(resultStructure, basePredicate, dir, offset); + if (maxCount != -1 && totalAlreadyPopulated >= maxCount) continue; + if (basePredicate.maxSliceCount != -1 && layerAlreadyPopulated >= basePredicate.maxSliceCount) { + continue; + } + + BlockInfo toInsert = blockPreferences.get(predicate, basePredicate); + if (toInsert == null) { + toInsert = basePredicate.getCandidates().get(0); + } + // TODO: is this needed? doesn't this just do what we're already doing? + if (isValidCandidate(resultStructure, predicate, pos, toInsert, dir)) { + resultStructure.put(pos, toInsert); + if (this.controllerBlock == null && predicate.isController()) { + this.controllerBlock = toInsert.getBlockState().getBlock(); + } + return true; + } + } + return false; + } + + private boolean isValidCandidate(Map resultStructure, PatternPredicate predicate, + BlockPos pos, BlockInfo newInfo, Direction sliceDir) { + // The slice (layer) this position belongs to. + int sliceCoord = getCoordFromDir(pos, sliceDir); + + // newInfo is valid if there's a basePredicate it qualifies for whose maxCount (global) and maxSliceCount + // (this slice) wouldn't be exceeded by placing it here. + for (BasePredicate basePredicate : predicate.subPredicates) { + if (!basePredicate.candidates.contains(newInfo)) continue; + + int maxCount = getMaxCount(predicate, basePredicate); + if (maxCount == 0) continue; + + int totalAlreadyPopulated = countPopulatedGlobal(resultStructure, basePredicate); + int layerAlreadyPopulated = countPopulatedInLayer(resultStructure, basePredicate, sliceDir, sliceCoord); + if (maxCount != -1 && totalAlreadyPopulated >= maxCount) continue; + + if (basePredicate.maxSliceCount == -1 || layerAlreadyPopulated < basePredicate.maxSliceCount) { + return true; + } + } + return false; + } + + private @UnmodifiableView char[][][] flattenBlockPattern(BlockPattern pattern) { + int totalSlices = sliceRepeats.values().intStream().sum(); + int[] dimensions = pattern.getDimensions(); + char[][][] flattenedPattern = new char[totalSlices][dimensions[1]][dimensions[2]]; + PatternSlice[] slices = pattern.getSlices(); + int totalSlicesIndex = 0; + + for (int sliceIndex = 0; sliceIndex < slices.length; sliceIndex++) { + PatternSlice slice = slices[sliceIndex]; + int repeats = sliceRepeats.getOrDefault(sliceIndex, 1); + for (int i = 0; i < repeats; i++) { + flattenedPattern[totalSlicesIndex] = slice.getPattern(); + totalSlicesIndex++; + } + } + assert totalSlicesIndex == totalSlices; + + return flattenedPattern; + } + + private static Vec3i getDimensions(char[][][] charPattern) { + int d0 = charPattern.length; + int d1 = d0 > 0 ? charPattern[0].length : 0; + int d2 = d1 > 0 ? charPattern[0][0].length : 0; + return new Vec3i(d0, d1, d2); + } + + private static char[][][] rotateAndFlipPattern(char[][][] localFlattenedPattern, + RelativeDirection[] patternDirections, + Direction frontFacing, Direction upFacing, boolean isFlipped) { + Direction absoluteX = patternDirections[0].getRelativeFacing(frontFacing, upFacing, isFlipped); + Direction absoluteY = patternDirections[1].getRelativeFacing(frontFacing, upFacing, isFlipped); + Direction absoluteZ = patternDirections[2].getRelativeFacing(frontFacing, upFacing, isFlipped); + + Vec3i dimensions = getDimensions(localFlattenedPattern); + if (dimensions.getX() == 0 || dimensions.getY() == 0 || dimensions.getZ() == 0) return new char[0][0][0]; + + int[][] steps = { + { absoluteX.getStepX(), absoluteX.getStepY(), absoluteX.getStepZ() }, + { absoluteY.getStepX(), absoluteY.getStepY(), absoluteY.getStepZ() }, + { absoluteZ.getStepX(), absoluteZ.getStepY(), absoluteZ.getStepZ() }, + }; + + // World-space bounding box. Each axis contributes monotonically, so the extremes are reached at index 0 or at + // (dimensions[axis] - 1) depending on the sign of the step. + BlockPos.MutableBlockPos min = new BlockPos.MutableBlockPos(); + BlockPos.MutableBlockPos max = new BlockPos.MutableBlockPos(); + for (Direction.Axis axis : Direction.Axis.VALUES) { + for (Direction.Axis world : Direction.Axis.VALUES) { + int contribution = steps[axis.ordinal()][world.ordinal()] * (dimensions.get(axis) - 1); + Direction worldDir = Direction.fromAxisAndDirection(world, Direction.AxisDirection.POSITIVE); + min.move(worldDir, Math.min(0, contribution)); + max.move(worldDir, Math.max(0, contribution)); + } + } + // this *should* be the same as dimensions. I think? + Vec3i size = max.move(-min.getX() + 1, -min.getY() + 1, -min.getZ() + 1); + char[][][] result = new char[size.getX()][size.getY()][size.getZ()]; + + for (int x = 0; x < dimensions.getX(); x++) { + for (int y = 0; y < dimensions.getY(); y++) { + for (int z = 0; z < dimensions.getZ(); z++) { + int worldX = absoluteX.getStepX() * x + absoluteY.getStepX() * y + absoluteZ.getStepX() * z; + int worldY = absoluteX.getStepY() * x + absoluteY.getStepY() * y + absoluteZ.getStepY() * z; + int worldZ = absoluteX.getStepZ() * x + absoluteY.getStepZ() * y + absoluteZ.getStepZ() * z; + result[worldX - min.getX()][worldY - min.getY()][worldZ - + min.getZ()] = localFlattenedPattern[x][y][z]; + } + } + } + + return result; + } + + private static BlockPos.MutableBlockPos setAxis(BlockPos.MutableBlockPos pos, Direction.Axis axis, int amount) { + return switch (axis) { + case X -> pos.setX(amount); + case Y -> pos.setY(amount); + case Z -> pos.setZ(amount); + }; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/util/ExpandablePatternHelper.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/util/ExpandablePatternHelper.java new file mode 100644 index 00000000000..d05aec2709c --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/util/ExpandablePatternHelper.java @@ -0,0 +1,197 @@ +package com.gregtechceu.gtceu.api.multiblock.util; + +import com.gregtechceu.gtceu.api.multiblock.PatternPredicate; +import com.gregtechceu.gtceu.api.multiblock.pattern.ExpandablePattern; +import com.gregtechceu.gtceu.api.multiblock.pattern.IBlockPattern; +import com.gregtechceu.gtceu.api.multiblock.predicates.BasePredicate; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.levelgen.structure.BoundingBox; + +import it.unimi.dsi.fastutil.ints.IntList; +import it.unimi.dsi.fastutil.longs.Long2ObjectMap; + +import java.util.Map; + +public class ExpandablePatternHelper extends AbstractStructureHelper { + + private final IntList userRepeats; + + protected ExpandablePatternHelper(IntList userRepeats) { + this.userRepeats = userRepeats; + } + + private static CornerData getCorners(IntList bounds, + ExpandablePattern pattern, + Direction frontFacing, Direction upFacing, + boolean isFlipped) { + BlockPos.MutableBlockPos negCorner = new BlockPos.MutableBlockPos(); + BlockPos.MutableBlockPos posCorner = new BlockPos.MutableBlockPos(); + + Direction[] absolutes = new Direction[3]; + + for (int i = 0; i < 3; i++) { + RelativeDirection selected = pattern.getDirections()[i]; + + absolutes[i] = selected.getRelativeFacing(frontFacing, upFacing, isFlipped); + + if (i == 0) { + negCorner.setX(-bounds.getInt(selected.oppositeOrdinal())); + posCorner.setX(bounds.getInt(selected.ordinal())); + } else if (i == 1) { + negCorner.setY(-bounds.getInt(selected.oppositeOrdinal())); + posCorner.setY(bounds.getInt(selected.ordinal())); + } else { + negCorner.setZ(-bounds.getInt(selected.oppositeOrdinal())); + posCorner.setZ(bounds.getInt(selected.ordinal())); + } + } + return CornerData.of(posCorner, negCorner, absolutes); + } + + @Override + protected void populateWithUserBlockPreferences(Map resultStructure, IBlockPattern pattern, + Long2ObjectMap userBlockPreferences, + Direction frontFacing, Direction upFacing, boolean isFlipped) { + ExpandablePattern expandablePattern = (ExpandablePattern) pattern; + + var cornerData = getCorners(userRepeats, expandablePattern, frontFacing, upFacing, isFlipped); + BoundingBox corners = cornerData.bounds(); + Direction[] absolutes = cornerData.absolutes(); + // contains is min<=x resultStructure, IBlockPattern pattern, + Direction frontFacing, + Direction upFacing, boolean isFlipped) { + ExpandablePattern expandablePattern = (ExpandablePattern) pattern; + var corners = getCorners(userRepeats, expandablePattern, frontFacing, upFacing, isFlipped); + Direction[] absolutes = corners.absolutes(); + + var predicateProvider = expandablePattern.getPredicateProvider(); + // SOUTH, UP, EAST means point is +z, line is +y, plane is +x. + // this basically means the x val of the iter is aisle count, y is str count, and z is char count. + for (BlockPos pos : betweenClosed(corners.bounds())) { + BlockPos.MutableBlockPos mutablePos = pos.mutable(); + PatternPredicate predicate = predicateProvider.apply(mutablePos, userRepeats); + + // this basically reshuffles the coordinates into absolute form from relative form + setFromDirection(mutablePos, absolutes[0], pos.getX()); + setFromDirection(mutablePos, absolutes[1], pos.getY()); + setFromDirection(mutablePos, absolutes[2], pos.getZ()); + // translate from the origin to the center + // mutablePos = mutablePos.move(translation); + if (resultStructure.containsKey(mutablePos)) continue; + + // Attempts to first place the predicate if the min (layer) count isn't satisfied, then the + // max (layer) count + if (tryMinCount(resultStructure, predicate, mutablePos)) continue; + if (tryMaxCount(resultStructure, predicate, mutablePos)) continue; + // If we arrive here, there's nothing we can place that doesn't overflow a max count! + throw new IllegalStateException("Could not place a block without breaking maxCount requirements"); + } + } + + private boolean tryMinCount(Map resultStructure, PatternPredicate predicate, + BlockPos pos) { + for (BasePredicate basePredicate : predicate.subPredicates) { + int minCount = getMinCount(predicate, basePredicate); + if (minCount == 0) continue; + + int totalAlreadyPopulated = countPopulatedGlobal(resultStructure, basePredicate); + if (minCount <= 0 || totalAlreadyPopulated >= minCount) continue; + + BlockInfo toInsert = null; + if (blockPreferences.contains(predicate, basePredicate)) { + toInsert = blockPreferences.get(predicate, basePredicate); + } else if (!basePredicate.getCandidates().isEmpty()) { + toInsert = basePredicate.getCandidates().get(0); + } + if (toInsert != null) resultStructure.put(pos, toInsert); + return true; + } + return false; + } + + private boolean tryMaxCount(Map resultStructure, PatternPredicate predicate, + BlockPos pos) { + for (BasePredicate basePredicate : predicate.subPredicates) { + int maxCount = getMaxCount(predicate, basePredicate); + if (maxCount == 0) continue; + + int totalAlreadyPopulated = countPopulatedGlobal(resultStructure, basePredicate); + if (maxCount != -1 && totalAlreadyPopulated >= maxCount) continue; + + BlockInfo toInsert = null; + if (blockPreferences.contains(predicate, basePredicate)) { + toInsert = blockPreferences.get(predicate, basePredicate); + } else if (!basePredicate.getCandidates().isEmpty()) { + toInsert = basePredicate.getCandidates().get(0); + } + if (toInsert != null) resultStructure.put(pos, toInsert); + return true; + } + return false; + } + + @Override + public PatternPredicate getPredicateFromPos(IBlockPattern pattern, BlockPos pos, + Direction frontFacing, Direction upFacing, boolean isFlipped) { + ExpandablePattern expandablePattern = (ExpandablePattern) pattern; + Direction[] absolutes = getCorners(userRepeats, expandablePattern, frontFacing, upFacing, isFlipped) + .absolutes(); + // Reverse the absolute->relative transform (transpose of orthogonal rotation matrix) + int relX = getOffsetFromDirection(absolutes[0], pos); + int relY = getOffsetFromDirection(absolutes[1], pos); + int relZ = getOffsetFromDirection(absolutes[2], pos); + return expandablePattern.getPredicateProvider().apply(new BlockPos(relX, relY, relZ).mutable(), userRepeats); + } + + private static int getOffsetFromDirection(Direction dir, BlockPos pos) { + return dir.getAxis().choose(pos.getX(), pos.getY(), pos.getZ()) * dir.getAxisDirection().getStep(); + } + + public static Iterable betweenClosed(BoundingBox box) { + return BlockPos.betweenClosed(Math.min(box.minX(), box.maxX()), + Math.min(box.minY(), box.maxY()), + Math.min(box.minZ(), box.maxZ()), + Math.max(box.minX(), box.maxX()), + Math.max(box.minY(), box.maxY()), + Math.max(box.minZ(), box.maxZ())); + } + + private static BlockPos.MutableBlockPos setFromDirection(BlockPos.MutableBlockPos pos, + Direction direction, int amount) { + return switch (direction) { + case DOWN -> pos.setY(-amount); + case UP -> pos.setY(amount); + case NORTH -> pos.setZ(-amount); + case SOUTH -> pos.setZ(amount); + case WEST -> pos.setX(-amount); + case EAST -> pos.setX(amount); + }; + } + + private record CornerData(BoundingBox bounds, Direction[] absolutes) { + + private static CornerData of(BlockPos posCorner, BlockPos negCorner, Direction[] directions) { + return new CornerData(BoundingBox.fromCorners(posCorner, negCorner), directions); + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/util/RelativeDirection.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/util/RelativeDirection.java new file mode 100644 index 00000000000..9e53bbbb672 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/util/RelativeDirection.java @@ -0,0 +1,238 @@ +package com.gregtechceu.gtceu.api.multiblock.util; + +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; +import com.gregtechceu.gtceu.utils.GTUtil; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.StringRepresentable; + +import org.jetbrains.annotations.NotNull; + +import java.util.Locale; +import java.util.function.BinaryOperator; +import java.util.function.ToIntFunction; + +/** + * Relative direction when facing horizontally and vertically + */ +public enum RelativeDirection implements StringRepresentable { + + UP((f, u) -> u), + DOWN((f, u) -> u.getOpposite()), + LEFT((f, u) -> GTUtil.cross(f, u).getOpposite()), + RIGHT(GTUtil::cross), + FRONT((f, u) -> f), + BACK((f, u) -> f.getOpposite()); + + private final BinaryOperator facingFunction; + + public static final EnumCodec CODEC = StringRepresentable + .fromEnum(RelativeDirection::values); + + public static final RelativeDirection[] VALUES = values(); + + RelativeDirection(BinaryOperator facingFunction) { + this.facingFunction = facingFunction; + } + + public RelativeDirection getOpposite() { + return VALUES[oppositeOrdinal()]; + } + + public int oppositeOrdinal() { + return switch (ordinal()) { + case 0 -> 1; + case 1 -> 0; + case 2 -> 3; + case 3 -> 2; + case 4 -> 5; + case 5 -> 4; + default -> throw new IllegalStateException("Unexpected value: " + ordinal()); + }; + } + + public Direction getRelativeFacing(Direction frontFacing, Direction upwardsFacing) { + if (frontFacing.getAxis() == upwardsFacing.getAxis()) { + return Direction.UP; + // throw new IllegalArgumentException("front facing and up facing must be on different axes"); + } + return facingFunction.apply(frontFacing, upwardsFacing); + } + + public Direction getRelativeFacing(Direction frontFacing, Direction upwardsFacing, boolean isFlipped) { + return (isFlipped && (this == LEFT || this == RIGHT)) ? + getRelativeFacing(frontFacing, upwardsFacing).getOpposite() : + getRelativeFacing(frontFacing, upwardsFacing); + } + + public ToIntFunction getPosSorter(Direction frontFacing, Direction upwardsFacing, boolean isFlipped) { + // get the direction to go in for the part sorter + Direction sorterDirection = getRelativeFacing(frontFacing, upwardsFacing, isFlipped); + + // Determined by Direction.Axis + Direction.AxisDirection + return switch (sorterDirection) { + case UP -> BlockPos::getY; + case DOWN -> pos -> -pos.getY(); + case EAST -> BlockPos::getX; + case WEST -> pos -> -pos.getX(); + case NORTH -> pos -> -pos.getZ(); + case SOUTH -> BlockPos::getZ; + }; + } + + public ToIntFunction getMultiSorter(Direction frontFacing, Direction upwardsFacing, + boolean isFlipped) { + // get the direction to go in for the part sorter + Direction sorterDirection = getRelativeFacing(frontFacing, upwardsFacing, isFlipped); + + // Determined by Direction.Axis + Direction.AxisDirection + return switch (sorterDirection) { + case UP -> p -> p.getBlockPos().getY(); + case DOWN -> p -> -p.getBlockPos().getY(); + case EAST -> p -> p.getBlockPos().getX(); + case WEST -> p -> -p.getBlockPos().getX(); + case NORTH -> p -> -p.getBlockPos().getZ(); + case SOUTH -> p -> p.getBlockPos().getZ(); + }; + } + + /** + * Simulates rotating the controller around an axis to get to a new front facing. + * + * @return Returns the new upwards facing. + */ + public static Direction simulateAxisRotation(Direction newFrontFacing, Direction oldFrontFacing, + Direction upwardsFacing) { + if (newFrontFacing.getAxis() == oldFrontFacing.getAxis()) return upwardsFacing; + + Direction cross = GTUtil.cross(newFrontFacing, oldFrontFacing); + + assert cross != null; + if (cross.getAxis() == upwardsFacing.getAxis()) return upwardsFacing; + + if (oldFrontFacing.getClockWise(cross.getAxis()) == newFrontFacing) + return oldFrontFacing.getOpposite(); + + return oldFrontFacing; + } + + /** + * Offset a BlockPos relatively in any direction by any amount. Pass negative values to offset down, right or + * backwards. + */ + public static BlockPos offsetPos(BlockPos pos, Direction frontFacing, Direction upwardsFacing, boolean isFlipped, + int upOffset, int leftOffset, int forwardOffset) { + BlockPos.MutableBlockPos mbp = pos.mutable(); + mbp.move(UP.getRelativeFacing(frontFacing, upwardsFacing, isFlipped), upOffset); + mbp.move(LEFT.getRelativeFacing(frontFacing, upwardsFacing, isFlipped), leftOffset); + mbp.move(FRONT.getRelativeFacing(frontFacing, upwardsFacing, isFlipped), forwardOffset); + return mbp.immutable(); + } + + public static > void validateFacingsArray(T[] facings) { + if (facings.length != 3) throw new IllegalArgumentException("Facings must be array of length 3!"); + + int c = 0; + for (int i = 0; i < 3; i++) { + c |= (1 << facings[i].ordinal() / 2); + } + + if (c != 7) throw new IllegalArgumentException("The 3 facings must use each axis exactly once!"); + } + + /** + * @param other The other direction to check + * @return Whether both directions are on the same axis + */ + public boolean isSameAxis(RelativeDirection other) { + return (other.ordinal() ^ this.ordinal() & 0x01) != 0; + } + + public static Direction getActualDirection(Direction original, Direction current, Direction direction) { + return findRelativeOf(original, current).applyDirection(direction); + } + + /** + * Finds the difference of {@code baseDir} and {@code relativeDir} as a relative direction. + *
+ * If {@code baseDir} is vertical (e.g. {@link Direction#UP UP} or {@link Direction#DOWN DOWN}), + * the rotation is calculated with {@link Direction#NORTH NORTH} as the upwards direction. + * + * @param baseDir the direction to offset + * @param relativeDir the direction to offset by + * @return The difference of {@code baseDir} and {@code relativeDir} as a relative direction + */ + public static RelativeDirection findRelativeOf(Direction baseDir, Direction relativeDir) { + return findRelativeOf(baseDir, relativeDir, Direction.UP); + } + + /** + * Finds the difference of {@code baseDir} and {@code relativeDir} as a relative direction. + *
+ * If {@code baseDir} is vertical, the rotation is calculated with {@code upwardsDir} as the "upwards" direction. + * + * @param baseDir the direction to offset + * @param relativeDir the direction to offset by + * @param upwardsDir the upwards direction + * @return The difference of {@code baseDir} and {@code relativeDir} as a relative direction + */ + public static RelativeDirection findRelativeOf(Direction baseDir, Direction relativeDir, Direction upwardsDir) { + // Check simple cases first + if (baseDir == relativeDir) return RelativeDirection.FRONT; + if (baseDir.getOpposite() == relativeDir) return RelativeDirection.BACK; + + if (baseDir.getAxis().isHorizontal()) { // baseDir is one of N,S,W,E + if (relativeDir == Direction.UP) return RelativeDirection.UP; + else if (relativeDir == Direction.DOWN) return RelativeDirection.DOWN; + else if (relativeDir == baseDir.getCounterClockWise()) return RelativeDirection.LEFT; + else return RelativeDirection.RIGHT; // getClockWise + } else { // baseDir is UP or DOWN + if (upwardsDir.getAxis() == Direction.Axis.Y) { + throw new IllegalStateException("upwardsDir must be a horizontal direction! is " + upwardsDir); + } + + if (relativeDir == upwardsDir.getCounterClockWise()) { + return RelativeDirection.LEFT; + } else if (relativeDir == upwardsDir.getClockWise()) { + return RelativeDirection.RIGHT; + } else { // relativeDir is NORTH or SOUTH (assuming upwardsDir is NORTH) + RelativeDirection dir; + if (relativeDir == upwardsDir.getOpposite()) dir = RelativeDirection.UP; + else dir = RelativeDirection.DOWN; // relativeDir == NORTH + + if (baseDir == Direction.DOWN) dir = dir.getOpposite(); + return dir; + } + } + } + + public Direction getDefaultFacing() { + return switch (this) { + case UP -> Direction.UP; + case DOWN -> Direction.DOWN; + case LEFT -> Direction.WEST; + case RIGHT -> Direction.EAST; + case FRONT -> Direction.NORTH; + case BACK -> Direction.SOUTH; + }; + } + + public Direction applyDirection(Direction dir) { + return switch (this) { + case UP -> dir.getAxis() == Direction.Axis.Y ? Direction.NORTH : Direction.UP; + case DOWN -> dir.getAxis() == Direction.Axis.Y ? Direction.SOUTH : Direction.DOWN; + case LEFT -> dir.getAxis().isHorizontal() ? dir.getCounterClockWise() : + dir.getAxisDirection().getStep() > 0 ? Direction.WEST : Direction.EAST; + case RIGHT -> dir.getAxis().isHorizontal() ? dir.getClockWise() : + dir.getAxisDirection().getStep() > 0 ? Direction.EAST : Direction.WEST; + case FRONT -> dir; + case BACK -> dir.getOpposite(); + }; + } + + @Override + public @NotNull String getSerializedName() { + return name().toLowerCase(Locale.ROOT); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/util/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/util/package-info.java new file mode 100644 index 00000000000..3c80591e6af --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/util/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.api.multiblock.util; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/BlockPattern.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/BlockPattern.java deleted file mode 100644 index 22664ab9ad8..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/BlockPattern.java +++ /dev/null @@ -1,657 +0,0 @@ -package com.gregtechceu.gtceu.api.pattern; - -import com.gregtechceu.gtceu.api.block.ActiveBlock; -import com.gregtechceu.gtceu.api.block.MetaMachineBlock; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; -import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; -import com.gregtechceu.gtceu.api.pattern.error.PatternError; -import com.gregtechceu.gtceu.api.pattern.error.PatternStringError; -import com.gregtechceu.gtceu.api.pattern.error.SinglePredicateError; -import com.gregtechceu.gtceu.api.pattern.predicates.SimplePredicate; -import com.gregtechceu.gtceu.api.pattern.util.PatternMatchContext; -import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; -import com.gregtechceu.gtceu.utils.GTUtil; - -import com.lowdragmc.lowdraglib.utils.BlockInfo; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.block.state.properties.Property; -import net.minecraft.world.phys.BlockHitResult; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.items.IItemHandler; - -import it.unimi.dsi.fastutil.ints.IntObjectPair; -import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; -import it.unimi.dsi.fastutil.longs.LongOpenHashSet; -import it.unimi.dsi.fastutil.objects.Object2IntMap; -import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; -import lombok.Getter; -import org.apache.commons.lang3.ArrayUtils; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.lang.reflect.Array; -import java.util.*; -import java.util.function.BiPredicate; -import java.util.function.Consumer; - -public class BlockPattern { - - static Direction[] FACINGS = { Direction.SOUTH, Direction.NORTH, Direction.WEST, Direction.EAST, Direction.UP, - Direction.DOWN }; - static Direction[] FACINGS_H = { Direction.SOUTH, Direction.NORTH, Direction.WEST, Direction.EAST }; - public final int[][] aisleRepetitions; - public final RelativeDirection[] structureDir; - protected final TraceabilityPredicate[][][] blockMatches; // [z][y][x] - protected final int fingerLength; // z size - protected final int thumbLength; // y size - protected final int palmLength; // x size - protected final int[] centerOffset; // x, y, z, minZ, maxZ - @Getter - protected int[] formedRepetitionCount; - - public BlockPattern(TraceabilityPredicate[][][] predicatesIn, RelativeDirection[] structureDir, - int[][] aisleRepetitions, int[] centerOffset) { - this.blockMatches = predicatesIn; - this.fingerLength = predicatesIn.length; - this.structureDir = structureDir; - this.aisleRepetitions = aisleRepetitions; - this.formedRepetitionCount = new int[aisleRepetitions.length]; - - if (this.fingerLength > 0) { - this.thumbLength = predicatesIn[0].length; - - if (this.thumbLength > 0) { - this.palmLength = predicatesIn[0][0].length; - } else { - this.palmLength = 0; - } - } else { - this.thumbLength = 0; - this.palmLength = 0; - } - - this.centerOffset = centerOffset; - } - - public boolean checkPatternAt(MultiblockState worldState, boolean savePredicate) { - MultiblockControllerMachine controller = worldState.getController(); - if (controller == null) { - worldState.setError(new PatternStringError("no controller found")); - return false; - } - BlockPos centerPos = controller.getBlockPos(); - Direction frontFacing = controller.getFrontFacing(); - Direction[] facings = controller.hasFrontFacing() ? new Direction[] { frontFacing } : - new Direction[] { Direction.SOUTH, Direction.NORTH, Direction.EAST, Direction.WEST }; - Direction upwardsFacing = controller.getUpwardsFacing(); - boolean allowsFlip = controller.allowFlip(); - for (Direction direction : facings) { - boolean result = checkPatternAt(worldState, centerPos, direction, upwardsFacing, false, savePredicate); - if (result) { - return true; - } else if (allowsFlip) { - return checkPatternAt(worldState, centerPos, direction, upwardsFacing, true, savePredicate); - } - } - return false; - } - - @Deprecated(forRemoval = true, since = "7.0") - public int[] getDimensions() { - return new int[] { fingerLength, thumbLength, palmLength }; - } - - public boolean checkPatternAt(MultiblockState worldState, BlockPos centerPos, Direction frontFacing, - Direction upwardsFacing, boolean isFlipped, boolean savePredicate) { - boolean findFirstAisle = false; - int minZ = -centerOffset[4]; - worldState.clean(); - PatternMatchContext matchContext = worldState.getMatchContext(); - Object2IntMap globalCount = worldState.getGlobalCount(); - Object2IntMap layerCount = worldState.getLayerCount(); - // Checking aisles - for (int c = 0, z = minZ++, r; c < this.fingerLength; c++) { - // Checking repeatable slices - int validRepetitions = 0; - loop: - for (r = 0; (findFirstAisle ? r < aisleRepetitions[c][1] : z <= -centerOffset[3]); r++) { - // Checking single slice - layerCount.clear(); - - for (int b = 0, y = -centerOffset[1]; b < this.thumbLength; b++, y++) { - for (int a = 0, x = -centerOffset[0]; a < this.palmLength; a++, x++) { - worldState.setError(null); - TraceabilityPredicate predicate = this.blockMatches[c][b][a]; - BlockPos pos = setActualRelativeOffset(x, y, z, frontFacing, upwardsFacing, isFlipped) - .offset(centerPos.getX(), centerPos.getY(), centerPos.getZ()); - if (!worldState.update(pos, predicate)) { - return false; - } - if (predicate.addCache()) { - worldState.addPosCache(pos); - if (savePredicate) { - matchContext.getOrCreate("predicates", HashMap::new).put(pos, predicate); - } - } - boolean canPartShared = true; - if (worldState.getBlockEntity() instanceof IMultiPart part) { // add detected parts - if (!predicate.isAny()) { - if (part.isFormed() && !part.canShared() && - !part.hasController(worldState.controllerPos)) { // check part can be shared - canPartShared = false; - worldState.setError(new PatternStringError("multiblocked.pattern.error.share")); - } else { - matchContext.getOrCreate("parts", HashSet::new).add(part); - } - } - } - if (worldState.getBlockState().getBlock() instanceof ActiveBlock) { - matchContext.getOrCreate("vaBlocks", LongOpenHashSet::new) - .add(worldState.getPos().asLong()); - } - if (!predicate.test(worldState) || !canPartShared) { // matching failed - if (findFirstAisle) { - if (r < aisleRepetitions[c][0]) {// retreat to see if the first aisle can start later - r = c = 0; - z = minZ++; - matchContext.reset(); - findFirstAisle = false; - } - } else { - z++;// continue searching for the first aisle - } - continue loop; - } - matchContext.getOrCreate("ioMap", Long2ObjectOpenHashMap::new).put(worldState.getPos().asLong(), - worldState.io); - } - } - findFirstAisle = true; - z++; - - // Check layer-local matcher predicate - for (var entry : layerCount.object2IntEntrySet()) { - if (entry.getIntValue() < entry.getKey().minLayerCount) { - worldState.setError(new SinglePredicateError(entry.getKey(), 3)); - return false; - } - } - validRepetitions++; - } - // Repetitions out of range - if (r < aisleRepetitions[c][0] || worldState.hasError() || !findFirstAisle) { - if (!worldState.hasError()) { - worldState.setError(new PatternError()); - } - return false; - } - - // finished checking the aisle, so store the repetitions - formedRepetitionCount[c] = validRepetitions; - } - - // Check count matches amount - for (var entry : globalCount.object2IntEntrySet()) { - if (entry.getIntValue() < entry.getKey().minCount) { - worldState.setError(new SinglePredicateError(entry.getKey(), 1)); - return false; - } - } - - worldState.setError(null); - worldState.setNeededFlip(isFlipped); - return true; - } - - public void autoBuild(Player player, MultiblockState worldState) { - Level world = player.level(); - int minZ = -centerOffset[4]; - worldState.clean(); - MultiblockControllerMachine controller = worldState.getController(); - BlockPos centerPos = controller.getBlockPos(); - Direction facing = controller.getFrontFacing(); - Direction upwardsFacing = controller.getUpwardsFacing(); - boolean isFlipped = controller.isFlipped(); - Object2IntOpenHashMap cacheGlobal = worldState.getGlobalCount(); - Object2IntOpenHashMap cacheLayer = worldState.getLayerCount(); - Map blocks = new HashMap<>(); - Set placeBlockPos = new HashSet<>(); - blocks.put(centerPos, controller); - for (int c = 0, z = minZ++, r; c < this.fingerLength; c++) { - for (r = 0; r < aisleRepetitions[c][0]; r++) { - cacheLayer.clear(); - for (int b = 0, y = -centerOffset[1]; b < this.thumbLength; b++, y++) { - for (int a = 0, x = -centerOffset[0]; a < this.palmLength; a++, x++) { - TraceabilityPredicate predicate = this.blockMatches[c][b][a]; - BlockPos pos = setActualRelativeOffset(x, y, z, facing, upwardsFacing, isFlipped) - .offset(centerPos.getX(), centerPos.getY(), centerPos.getZ()); - worldState.update(pos, predicate); - if (!world.isEmptyBlock(pos)) { - blocks.put(pos, world.getBlockState(pos)); - for (SimplePredicate limit : predicate.limited) { - limit.testLimited(worldState); - } - } else { - boolean find = false; - BlockInfo[] infos = new BlockInfo[0]; - for (SimplePredicate limit : predicate.limited) { - if (limit.minLayerCount > 0) { - int curr = cacheLayer.getInt(limit); - if (curr < limit.minLayerCount && - (limit.maxLayerCount == -1 || curr < limit.maxLayerCount)) { - cacheLayer.addTo(limit, 1); - } else { - continue; - } - } else { - continue; - } - infos = limit.candidates == null ? null : limit.candidates.get(); - find = true; - break; - } - if (!find) { - for (SimplePredicate limit : predicate.limited) { - if (limit.minCount > 0) { - int curr = cacheGlobal.getInt(limit); - if (curr < limit.minCount && (limit.maxCount == -1 || curr < limit.maxCount)) { - cacheGlobal.addTo(limit, 1); - } else { - continue; - } - } else { - continue; - } - infos = limit.candidates == null ? null : limit.candidates.get(); - find = true; - break; - } - } - if (!find) { // no limited - for (SimplePredicate limit : predicate.limited) { - if (limit.maxLayerCount != -1 && - cacheLayer.getOrDefault(limit, Integer.MAX_VALUE) == limit.maxLayerCount) { - continue; - } - if (limit.maxCount != -1 && - cacheGlobal.getOrDefault(limit, Integer.MAX_VALUE) == limit.maxCount) { - continue; - } - cacheLayer.addTo(limit, 1); - cacheGlobal.addTo(limit, 1); - infos = ArrayUtils.addAll(infos, - limit.candidates == null ? null : limit.candidates.get()); - } - for (SimplePredicate common : predicate.common) { - infos = ArrayUtils.addAll(infos, - common.candidates == null ? null : common.candidates.get()); - } - } - - List candidates = new ArrayList<>(); - if (infos != null) { - for (BlockInfo info : infos) { - if (info.getBlockState().getBlock() != Blocks.AIR) { - candidates.add(info.getItemStackForm()); - } - } - } - - // check inventory - ItemStack found = null; - int foundSlot = -1; - IItemHandler handler = null; - if (!player.isCreative()) { - var foundHandler = getMatchStackWithHandler(candidates, - player.getCapability(ForgeCapabilities.ITEM_HANDLER)); - if (foundHandler != null) { - foundSlot = foundHandler.firstInt(); - handler = foundHandler.second(); - found = handler.getStackInSlot(foundSlot).copy(); - } - } else { - for (ItemStack candidate : candidates) { - found = candidate.copy(); - if (!found.isEmpty() && found.getItem() instanceof BlockItem) { - break; - } - found = null; - } - } - if (found == null) continue; - BlockItem itemBlock = (BlockItem) found.getItem(); - BlockPlaceContext context = new BlockPlaceContext(world, player, InteractionHand.MAIN_HAND, - found, BlockHitResult.miss(player.getEyePosition(0), Direction.UP, pos)); - InteractionResult interactionResult = itemBlock.place(context); - if (interactionResult != InteractionResult.FAIL) { - placeBlockPos.add(pos); - if (handler != null) { - handler.extractItem(foundSlot, 1, false); - } - } - if (world.getBlockEntity(pos) instanceof MetaMachine metaMachine) { - blocks.put(pos, metaMachine); - } else { - blocks.put(pos, world.getBlockState(pos)); - } - } - } - } - z++; - } - } - Direction frontFacing = controller.getFrontFacing(); - blocks.forEach((pos, block) -> { // adjust facing - if (!(block instanceof MultiblockControllerMachine)) { - if (block instanceof BlockState && placeBlockPos.contains(pos)) { - resetFacing(pos, (BlockState) block, frontFacing, (p, f) -> { - Object object = blocks.get(p.relative(f)); - return object == null || - (object instanceof BlockState && ((BlockState) object).getBlock() == Blocks.AIR); - }, state -> world.setBlock(pos, state, 3)); - } else if (block instanceof MetaMachine machine) { - resetFacing(pos, machine.getBlockState(), frontFacing, (p, f) -> { - Object object = blocks.get(p.relative(f)); - if (object == null || (object instanceof BlockState blockState && blockState.isAir())) { - return machine.isFacingValid(f); - } - return false; - }, state -> world.setBlock(pos, state, 3)); - } - } - }); - } - - public BlockInfo[][][] getPreview(int[] repetition) { - Object2IntOpenHashMap cacheGlobal = new Object2IntOpenHashMap<>(); - Map blocks = new HashMap<>(); - int minX = Integer.MAX_VALUE; - int minY = Integer.MAX_VALUE; - int minZ = Integer.MAX_VALUE; - int maxX = Integer.MIN_VALUE; - int maxY = Integer.MIN_VALUE; - int maxZ = Integer.MIN_VALUE; - for (int l = 0, x = 0; l < this.fingerLength; l++) { - for (int r = 0; r < repetition[l]; r++) { - // Checking single slice - Object2IntOpenHashMap cacheLayer = new Object2IntOpenHashMap<>(); - for (int y = 0; y < this.thumbLength; y++) { - for (int z = 0; z < this.palmLength; z++) { - TraceabilityPredicate predicate = this.blockMatches[l][y][z]; - boolean find = false; - BlockInfo[] infos = null; - for (SimplePredicate limit : predicate.limited) { // check layer and previewCount - if (limit.minLayerCount > 0) { - if (cacheLayer.getInt(limit) < limit.minLayerCount) { - cacheLayer.addTo(limit, 1); - } else { - continue; - } - if (cacheGlobal.getInt(limit) < limit.previewCount) { - cacheGlobal.addTo(limit, 1); - } else { - continue; - } - } else { - continue; - } - infos = limit.candidates == null ? null : limit.candidates.get(); - find = true; - break; - } - if (!find) { // check global and previewCount - for (SimplePredicate limit : predicate.limited) { - if (limit.minCount == -1 && limit.previewCount == -1) continue; - if (cacheGlobal.getInt(limit) < limit.previewCount) { - cacheGlobal.addTo(limit, 1); - } else if (limit.minCount > 0) { - if (cacheGlobal.getInt(limit) < limit.minCount) { - cacheGlobal.addTo(limit, 1); - } else { - continue; - } - } else { - continue; - } - infos = limit.candidates == null ? null : limit.candidates.get(); - find = true; - break; - } - } - if (!find) { // check common with previewCount - for (SimplePredicate common : predicate.common) { - if (common.previewCount > 0) { - if (cacheGlobal.getInt(common) < common.previewCount) { - cacheGlobal.addTo(common, 1); - } else { - continue; - } - } else { - continue; - } - infos = common.candidates == null ? null : common.candidates.get(); - find = true; - break; - } - } - if (!find) { // check without previewCount - for (SimplePredicate common : predicate.common) { - if (common.previewCount == -1) { - infos = common.candidates == null ? null : common.candidates.get(); - find = true; - break; - } - } - } - if (!find) { // check max - for (SimplePredicate limit : predicate.limited) { - if (limit.previewCount != -1) continue; - if (limit.maxCount != -1 || limit.maxLayerCount != -1) { - if (cacheGlobal.getOrDefault(limit, 0) < limit.maxCount) { - cacheGlobal.addTo(limit, 1); - } else if (cacheLayer.getOrDefault(limit, 0) < limit.maxLayerCount) { - cacheLayer.addTo(limit, 1); - } else { - continue; - } - } - - infos = limit.candidates == null ? null : limit.candidates.get(); - break; - } - } - BlockInfo info = infos == null || infos.length == 0 ? BlockInfo.EMPTY : infos[0]; - BlockPos pos = setActualRelativeOffset(z, y, x, Direction.NORTH, Direction.UP, false); - - blocks.put(pos, info); - minX = Math.min(pos.getX(), minX); - minY = Math.min(pos.getY(), minY); - minZ = Math.min(pos.getZ(), minZ); - maxX = Math.max(pos.getX(), maxX); - maxY = Math.max(pos.getY(), maxY); - maxZ = Math.max(pos.getZ(), maxZ); - } - } - x++; - } - } - BlockInfo[][][] result = (BlockInfo[][][]) Array.newInstance(BlockInfo.class, maxX - minX + 1, maxY - minY + 1, - maxZ - minZ + 1); - int finalMinX = minX; - int finalMinY = minY; - int finalMinZ = minZ; - blocks.forEach((pos, info) -> { - resetFacing(pos, info.getBlockState(), null, (p, f) -> { - BlockInfo blockInfo = blocks.get(p.relative(f)); - if (blockInfo == null || blockInfo.getBlockState().getBlock() == Blocks.AIR) { - if (blocks.get(pos).getBlockState().getBlock() instanceof MetaMachineBlock machineBlock) { - if (machineBlock.newBlockEntity(BlockPos.ZERO, - machineBlock.defaultBlockState()) instanceof MetaMachine machine) { - if (machine instanceof MultiblockControllerMachine) { - return false; - } else { - return machine.isFacingValid(f); - } - } - } - return true; - } - return false; - }, info::setBlockState); - result[pos.getX() - finalMinX][pos.getY() - finalMinY][pos.getZ() - finalMinZ] = info; - }); - return result; - } - - private void resetFacing(BlockPos pos, BlockState blockState, Direction facing, - BiPredicate checker, Consumer consumer) { - if (blockState.hasProperty(BlockStateProperties.FACING)) { - tryFacings(blockState, pos, checker, consumer, BlockStateProperties.FACING, - facing == null ? FACINGS : ArrayUtils.addAll(new Direction[] { facing }, FACINGS)); - } else if (blockState.hasProperty(BlockStateProperties.HORIZONTAL_FACING)) { - tryFacings(blockState, pos, checker, consumer, BlockStateProperties.HORIZONTAL_FACING, - facing == null || facing.getAxis() == Direction.Axis.Y ? FACINGS_H : - ArrayUtils.addAll(new Direction[] { facing }, FACINGS_H)); - } - } - - private void tryFacings(BlockState blockState, BlockPos pos, BiPredicate checker, - Consumer consumer, Property property, Direction[] facings) { - Direction found = null; - for (Direction facing : facings) { - if (checker.test(pos, facing)) { - found = facing; - break; - } - } - if (found == null) { - found = Direction.NORTH; - } - consumer.accept(blockState.setValue(property, found)); - } - - private BlockPos setActualRelativeOffset(int x, int y, int z, Direction facing, Direction upwardsFacing, - boolean isFlipped) { - int[] c0 = new int[] { x, y, z }, c1 = new int[3]; - if (facing == Direction.UP || facing == Direction.DOWN) { - Direction of = facing == Direction.DOWN ? upwardsFacing : upwardsFacing.getOpposite(); - for (int i = 0; i < 3; i++) { - switch (structureDir[i].getActualDirection(of)) { - case UP -> c1[1] = c0[i]; - case DOWN -> c1[1] = -c0[i]; - case WEST -> c1[0] = -c0[i]; - case EAST -> c1[0] = c0[i]; - case NORTH -> c1[2] = -c0[i]; - case SOUTH -> c1[2] = c0[i]; - } - } - int xOffset = upwardsFacing.getStepX(); - int zOffset = upwardsFacing.getStepZ(); - int tmp; - if (xOffset == 0) { - tmp = c1[2]; - c1[2] = zOffset > 0 ? c1[1] : -c1[1]; - c1[1] = zOffset > 0 ? -tmp : tmp; - } else { - tmp = c1[0]; - c1[0] = xOffset > 0 ? c1[1] : -c1[1]; - c1[1] = xOffset > 0 ? -tmp : tmp; - } - if (isFlipped) { - if (upwardsFacing == Direction.NORTH || upwardsFacing == Direction.SOUTH) { - c1[0] = -c1[0]; // flip X-axis - } else { - c1[2] = -c1[2]; // flip Z-axis - } - } - } else { - for (int i = 0; i < 3; i++) { - switch (structureDir[i].getActualDirection(facing)) { - case UP -> c1[1] = c0[i]; - case DOWN -> c1[1] = -c0[i]; - case WEST -> c1[0] = -c0[i]; - case EAST -> c1[0] = c0[i]; - case NORTH -> c1[2] = -c0[i]; - case SOUTH -> c1[2] = c0[i]; - } - } - if (upwardsFacing == Direction.WEST || upwardsFacing == Direction.EAST) { - int xOffset = upwardsFacing == Direction.EAST ? facing.getClockWise().getStepX() : - facing.getClockWise().getOpposite().getStepX(); - int zOffset = upwardsFacing == Direction.EAST ? facing.getClockWise().getStepZ() : - facing.getClockWise().getOpposite().getStepZ(); - int tmp; - if (xOffset == 0) { - tmp = c1[2]; - c1[2] = zOffset > 0 ? -c1[1] : c1[1]; - c1[1] = zOffset > 0 ? tmp : -tmp; - } else { - tmp = c1[0]; - c1[0] = xOffset > 0 ? -c1[1] : c1[1]; - c1[1] = xOffset > 0 ? tmp : -tmp; - } - } else if (upwardsFacing == Direction.SOUTH) { - c1[1] = -c1[1]; - if (facing.getStepX() == 0) { - c1[0] = -c1[0]; - } else { - c1[2] = -c1[2]; - } - } - if (isFlipped) { - if (upwardsFacing == Direction.NORTH || upwardsFacing == Direction.SOUTH) { - if (facing == Direction.NORTH || facing == Direction.SOUTH) { - c1[0] = -c1[0]; // flip X-axis - } else { - c1[2] = -c1[2]; // flip Z-axis - } - } else { - c1[1] = -c1[1]; // flip Y-axis - } - } - } - return new BlockPos(c1[0], c1[1], c1[2]); - } - - @Nullable - private static IntObjectPair getMatchStackWithHandler( - List candidates, - LazyOptional cap) { - IItemHandler handler = cap.resolve().orElse(null); - if (handler == null) { - return null; - } - for (int i = 0; i < handler.getSlots(); i++) { - @NotNull - ItemStack stack = handler.getStackInSlot(i); - if (stack.isEmpty()) continue; - - @NotNull - LazyOptional stackCap = stack.getCapability(ForgeCapabilities.ITEM_HANDLER); - if (stackCap.isPresent()) { - var rt = getMatchStackWithHandler(candidates, stackCap); - if (rt != null) { - return rt; - } - } else if (candidates.stream().anyMatch(candidate -> GTUtil.isSameItemSameTags(candidate, stack)) && - !stack.isEmpty() && stack.getItem() instanceof BlockItem) { - return IntObjectPair.of(i, handler); - } - } - return null; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/FactoryBlockPattern.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/FactoryBlockPattern.java deleted file mode 100644 index 305d342caed..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/FactoryBlockPattern.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.gregtechceu.gtceu.api.pattern; - -import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; - -import com.google.common.base.Joiner; -import it.unimi.dsi.fastutil.chars.Char2ObjectArrayMap; -import it.unimi.dsi.fastutil.chars.Char2ObjectMap; -import it.unimi.dsi.fastutil.chars.CharArrayList; -import it.unimi.dsi.fastutil.chars.CharList; -import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.StringUtils; - -import java.lang.reflect.Array; -import java.util.ArrayList; -import java.util.List; - -public class FactoryBlockPattern { - - private static final Joiner COMMA_JOIN = Joiner.on(","); - private final List depth; - private final List aisleRepetitions; - private final Char2ObjectMap symbolMap; - private final RelativeDirection[] structureDir; - private int aisleHeight; - private int rowWidth; - - private FactoryBlockPattern(RelativeDirection charDir, RelativeDirection stringDir, RelativeDirection aisleDir) { - depth = new ArrayList<>(); - aisleRepetitions = new ArrayList<>(); - symbolMap = new Char2ObjectArrayMap<>(); - structureDir = new RelativeDirection[3]; - structureDir[0] = charDir; - structureDir[1] = stringDir; - structureDir[2] = aisleDir; - int flags = 0; - for (int i = 0; i < 3; i++) { - switch (structureDir[i]) { - case UP, DOWN -> flags |= 0x1; - case LEFT, RIGHT -> flags |= 0x2; - case FRONT, BACK -> flags |= 0x4; - } - } - if (flags != 0x7) throw new IllegalArgumentException("Must have 3 different axes!"); - this.symbolMap.put(' ', Predicates.any()); - } - - /** - * Adds a repeatable aisle to this pattern. - */ - public FactoryBlockPattern aisleRepeatable(int minRepeat, int maxRepeat, String... aisle) { - if (!ArrayUtils.isEmpty(aisle) && !StringUtils.isEmpty(aisle[0])) { - if (this.depth.isEmpty()) { - this.aisleHeight = aisle.length; - this.rowWidth = aisle[0].length(); - } - - if (aisle.length != this.aisleHeight) { - throw new IllegalArgumentException("Expected aisle with height of " + this.aisleHeight + - ", but was given one with a height of " + aisle.length + ")"); - } else { - for (String s : aisle) { - if (s.length() != this.rowWidth) { - throw new IllegalArgumentException( - "Not all rows in the given aisle are the correct width (expected " + this.rowWidth + - ", found one with " + s.length() + ")"); - } - - for (char c0 : s.toCharArray()) { - if (!this.symbolMap.containsKey(c0)) { - this.symbolMap.put(c0, null); - } - } - } - - this.depth.add(aisle); - if (minRepeat > maxRepeat) - throw new IllegalArgumentException("Lower bound of repeat counting must smaller than upper bound!"); - aisleRepetitions.add(new int[] { minRepeat, maxRepeat }); - return this; - } - } else { - throw new IllegalArgumentException("Empty pattern for aisle"); - } - } - - /** - * Adds a single aisle to this pattern. (so multiple calls to this will increase the aisleDir by 1) - */ - public FactoryBlockPattern aisle(String... aisle) { - return aisleRepeatable(1, 1, aisle); - } - - /** - * Set last aisle repeatable - */ - public FactoryBlockPattern setRepeatable(int minRepeat, int maxRepeat) { - if (minRepeat > maxRepeat) - throw new IllegalArgumentException("Lower bound of repeat counting must smaller than upper bound!"); - aisleRepetitions.set(aisleRepetitions.size() - 1, new int[] { minRepeat, maxRepeat }); - return this; - } - - /** - * Set last aisle repeatable - */ - public FactoryBlockPattern setRepeatable(int repeatCount) { - return setRepeatable(repeatCount, repeatCount); - } - - public static FactoryBlockPattern start() { - return new FactoryBlockPattern(RelativeDirection.LEFT, RelativeDirection.UP, RelativeDirection.FRONT); - } - - public static FactoryBlockPattern start(RelativeDirection charDir, RelativeDirection stringDir, - RelativeDirection aisleDir) { - return new FactoryBlockPattern(charDir, stringDir, aisleDir); - } - - public FactoryBlockPattern where(String symbol, TraceabilityPredicate blockMatcher) { - return this.where(symbol.charAt(0), blockMatcher); - } - - public FactoryBlockPattern where(char symbol, TraceabilityPredicate blockMatcher) { - if (blockMatcher.isAny() || blockMatcher.isAir()) { - this.symbolMap.put(symbol, blockMatcher); - } else { - this.symbolMap.put(symbol, new TraceabilityPredicate(blockMatcher).sort()); - } - return this; - } - - public BlockPattern build() { - this.checkMissingPredicates(); - int[] centerOffset = new int[5]; - int[][] aisleRepetitions = this.aisleRepetitions.toArray(new int[this.aisleRepetitions.size()][]); - TraceabilityPredicate[][][] predicate = (TraceabilityPredicate[][][]) Array - .newInstance(TraceabilityPredicate.class, this.depth.size(), this.aisleHeight, this.rowWidth); - - for (int i = 0, minZ = 0, maxZ = 0; i < - this.depth.size(); minZ += aisleRepetitions[i][0], maxZ += aisleRepetitions[i][1], i++) { - for (int j = 0; j < this.aisleHeight; j++) { - for (int k = 0; k < this.rowWidth; k++) { - predicate[i][j][k] = this.symbolMap.get(this.depth.get(i)[j].charAt(k)); - if (predicate[i][j][k].isController) { - centerOffset = new int[] { k, j, i, minZ, maxZ }; - } - } - } - } - - return new BlockPattern(predicate, structureDir, aisleRepetitions, centerOffset); - } - - private TraceabilityPredicate[][][] makePredicateArray() { - this.checkMissingPredicates(); - TraceabilityPredicate[][][] predicate = (TraceabilityPredicate[][][]) Array - .newInstance(TraceabilityPredicate.class, this.depth.size(), this.aisleHeight, this.rowWidth); - - for (int i = 0; i < this.depth.size(); ++i) { - for (int j = 0; j < this.aisleHeight; ++j) { - for (int k = 0; k < this.rowWidth; ++k) { - predicate[i][j][k] = this.symbolMap.get(this.depth.get(i)[j].charAt(k)); - } - } - } - - return predicate; - } - - private void checkMissingPredicates() { - CharList list = new CharArrayList(); - - for (var entry : this.symbolMap.char2ObjectEntrySet()) { - if (entry.getValue() == null) { - list.add(entry.getCharKey()); - } - } - - if (!list.isEmpty()) { - throw new IllegalStateException("Predicates for character(s) " + COMMA_JOIN.join(list) + " are missing"); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockShapeInfo.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockShapeInfo.java deleted file mode 100644 index cc1c36353af..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockShapeInfo.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.gregtechceu.gtceu.api.pattern; - -import com.gregtechceu.gtceu.api.block.MetaMachineBlock; -import com.gregtechceu.gtceu.api.data.RotationState; - -import com.lowdragmc.lowdraglib.utils.BlockInfo; -import com.lowdragmc.lowdraglib.utils.Builder; - -import net.minecraft.core.Direction; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; - -import java.util.function.Supplier; - -public class MultiblockShapeInfo { - - private final BlockInfo[][][] blocks; // [z][y][x] - - public MultiblockShapeInfo(BlockInfo[][][] blocks) { - this.blocks = blocks; - } - - public BlockInfo[][][] getBlocks() { - return blocks; - } - - public static ShapeInfoBuilder builder() { - return new ShapeInfoBuilder(); - } - - public static class ShapeInfoBuilder extends Builder { - - public ShapeInfoBuilder where(char symbol, BlockState blockState) { - return where(symbol, BlockInfo.fromBlockState(blockState)); - } - - public ShapeInfoBuilder where(char symbol, Supplier block) { - return where(symbol, block.get()); - } - - public ShapeInfoBuilder where(char symbol, Block block) { - return where(symbol, block.defaultBlockState()); - } - - public ShapeInfoBuilder where(char symbol, Supplier machine, Direction facing) { - return where(symbol, machine.get(), facing); - } - - public ShapeInfoBuilder where(char symbol, MetaMachineBlock machine, Direction facing) { - return where(symbol, machine.getRotationState() == RotationState.NONE ? - machine.defaultBlockState() : - machine.defaultBlockState().setValue(machine.getRotationState().property, facing)); - } - - private BlockInfo[][][] bake() { - return this.bakeArray(BlockInfo.class, BlockInfo.EMPTY); - } - - public MultiblockShapeInfo build() { - return new MultiblockShapeInfo(bake()); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockState.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockState.java deleted file mode 100644 index 126686748a1..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockState.java +++ /dev/null @@ -1,203 +0,0 @@ -package com.gregtechceu.gtceu.api.pattern; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.block.ActiveBlock; -import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; -import com.gregtechceu.gtceu.api.pattern.error.PatternError; -import com.gregtechceu.gtceu.api.pattern.error.PatternStringError; -import com.gregtechceu.gtceu.api.pattern.predicates.SimplePredicate; -import com.gregtechceu.gtceu.api.pattern.util.PatternMatchContext; - -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 net.minecraft.world.level.block.state.BlockState; - -import it.unimi.dsi.fastutil.longs.LongOpenHashSet; -import it.unimi.dsi.fastutil.longs.LongSet; -import it.unimi.dsi.fastutil.longs.LongSets; -import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; -import lombok.Getter; -import lombok.Setter; -import org.jetbrains.annotations.Nullable; - -import java.util.Collection; -import java.util.stream.Collectors; - -public class MultiblockState { - - public final static PatternError UNLOAD_ERROR = new PatternStringError("multiblocked.pattern.error.chunk"); - public final static PatternError UNINIT_ERROR = new PatternStringError("multiblocked.pattern.error.init"); - - private BlockPos pos; - private BlockState blockState; - private BlockEntity blockEntity; - private boolean blockEntityInitialized; - @Getter - private final PatternMatchContext matchContext; - @Getter - private Object2IntOpenHashMap globalCount; - @Getter - private Object2IntOpenHashMap layerCount; - public TraceabilityPredicate predicate; - public IO io; - public PatternError error; - @Getter - @Setter - private boolean neededFlip = false; - public final Level world; - public final BlockPos controllerPos; - public MultiblockControllerMachine lastController; - - // persist - public LongOpenHashSet cache; - - public MultiblockState(Level world, BlockPos controllerPos) { - this.world = world; - this.controllerPos = controllerPos; - this.error = UNINIT_ERROR; - this.matchContext = new PatternMatchContext(); - } - - public void clean() { - this.matchContext.reset(); - this.globalCount = new Object2IntOpenHashMap<>(); - this.layerCount = new Object2IntOpenHashMap<>(); - cache = new LongOpenHashSet(); - } - - public boolean update(BlockPos posIn, TraceabilityPredicate predicate) { - this.pos = posIn; - this.blockState = null; - this.blockEntity = null; - this.blockEntityInitialized = false; - this.predicate = predicate; - this.error = null; - if (!world.isLoaded(posIn)) { - error = UNLOAD_ERROR; - return false; - } - return true; - } - - public MultiblockControllerMachine getController() { - if (world.isLoaded(controllerPos)) { - if (world.getBlockEntity(controllerPos) instanceof MultiblockControllerMachine controller) { - return lastController = controller; - } - } else { - error = UNLOAD_ERROR; - } - return null; - } - - public boolean hasError() { - return error != null; - } - - public void setError(PatternError error) { - this.error = error; - if (error != null) { - error.setWorldState(this); - } - } - - public BlockState getBlockState() { - if (this.blockState == null) { - this.blockState = this.world.getBlockState(this.pos); - } - if (this.blockState == null) { - GTCEu.LOGGER.error("could not get BlockState at " + this.pos + " in MultiblockState"); - } - return this.blockState; - } - - @Nullable - public BlockEntity getBlockEntity() { - if (!getBlockState().hasBlockEntity()) { - return null; - } - if (this.blockEntity == null && !this.blockEntityInitialized) { - this.blockEntity = this.world.getBlockEntity(this.pos); - this.blockEntityInitialized = true; - } - - return this.blockEntity; - } - - public BlockPos getPos() { - return this.pos.immutable(); - } - - public BlockState getOffsetState(Direction face) { - if (pos instanceof BlockPos.MutableBlockPos) { - ((BlockPos.MutableBlockPos) pos).move(face); - BlockState blockState = world.getBlockState(pos); - ((BlockPos.MutableBlockPos) pos).move(face.getOpposite()); - return blockState; - } - return world.getBlockState(this.pos.relative(face)); - } - - public Level getWorld() { - return world; - } - - public void addPosCache(BlockPos pos) { - cache.add(pos.asLong()); - } - - public boolean isPosInCache(BlockPos pos) { - return cache.contains(pos.asLong()); - } - - public Collection getCache() { - return cache.longStream().mapToObj(BlockPos::of).collect(Collectors.toSet()); - } - - public void onBlockStateChanged(BlockPos pos, BlockState state) { - if (world instanceof ServerLevel serverLevel) { - if (pos.equals(controllerPos)) { - if (lastController != null) { - if (!state.is(lastController.self().getBlockState().getBlock())) { - lastController.onStructureInvalid(); - var mwsd = MultiblockWorldSavedData.getOrCreate(serverLevel); - mwsd.removeMapping(this); - } - } - } else { - MultiblockControllerMachine controller = getController(); - if (controller == null && error == UNLOAD_ERROR) { - if (!serverLevel.isLoaded(controllerPos)) { - GTCEu.LOGGER.info("Controller not loaded, pos {}", controllerPos); - } - } - if (controller != null) { - if (controller.isFormed() && state.getBlock() instanceof ActiveBlock) { - LongSet activeBlocks = getMatchContext().getOrDefault("vaBlocks", LongSets.emptySet()); - if (activeBlocks.contains(pos.asLong())) { - // fine! it's caused by active blocks. - // speed up here! - return; - } - } - if (controller.checkPatternWithLock()) { - // refresh structure - controller.setFlipped(this.neededFlip); - controller.onStructureFormed(); - } else { - // invalid structure - controller.setFlipped(false); - controller.onStructureInvalid(); - var mwsd = MultiblockWorldSavedData.getOrCreate(serverLevel); - mwsd.removeMapping(this); - mwsd.addAsyncLogic(controller); - } - } - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockWorldSavedData.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockWorldSavedData.java deleted file mode 100644 index 14a02fde761..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockWorldSavedData.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.gregtechceu.gtceu.api.pattern; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; - -import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.level.saveddata.SavedData; - -import com.google.common.util.concurrent.ThreadFactoryBuilder; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import org.jetbrains.annotations.NotNull; - -import java.util.*; -import java.util.concurrent.*; - -public class MultiblockWorldSavedData extends SavedData { - - public static MultiblockWorldSavedData getOrCreate(ServerLevel serverLevel) { - return serverLevel.getDataStorage() - .computeIfAbsent(MultiblockWorldSavedData::new, MultiblockWorldSavedData::new, "gtceu_multiblock"); - } - - /** - * Store all formed multiblocks' structure info - */ - public final Map mapping; - /** - * Chunk pos mapping. - */ - public final Map> chunkPosMapping; - - private MultiblockWorldSavedData() { - this.mapping = new Object2ObjectOpenHashMap<>(); - this.chunkPosMapping = new HashMap<>(); - } - - private MultiblockWorldSavedData(CompoundTag tag) { - this(); - } - - public Set getControllersInChunk(ChunkPos chunkPos) { - return chunkPosMapping.getOrDefault(chunkPos, Collections.emptySet()); - } - - public void addMapping(MultiblockState state) { - this.mapping.put(state.controllerPos, state); - for (BlockPos blockPos : state.getCache()) { - chunkPosMapping.computeIfAbsent(new ChunkPos(blockPos), c -> new HashSet<>()).add(state); - } - } - - public void removeMapping(MultiblockState state) { - this.mapping.remove(state.controllerPos); - for (Set set : chunkPosMapping.values()) { - set.remove(state); - } - } - - @NotNull - @Override - public CompoundTag save(@NotNull CompoundTag compound) { - return compound; - } - - // ********************************* thread for searching ********************************* // - private final CopyOnWriteArrayList controllers = new CopyOnWriteArrayList<>(); - private ScheduledExecutorService executorService; - private final static ThreadFactory THREAD_FACTORY = new ThreadFactoryBuilder() - .setNameFormat("GTCEu Multiblock Async Thread-%d") - .setDaemon(true) - .build(); - private static final ThreadLocal IN_SERVICE = ThreadLocal.withInitial(() -> false); - private long periodID = Long.MIN_VALUE; - - public void createExecutorService() { - if (executorService != null && !executorService.isShutdown()) return; - executorService = Executors.newSingleThreadScheduledExecutor(THREAD_FACTORY); - executorService.scheduleAtFixedRate(this::searchingTask, 0, 250, TimeUnit.MILLISECONDS); // per 5 tick - } - - /** - * add a async logic runnable - * - * @param controller controller - */ - public void addAsyncLogic(MultiblockControllerMachine controller) { - controllers.add(controller); - createExecutorService(); - } - - /** - * remove async controller - * - * @param controller controller - */ - public void removeAsyncLogic(MultiblockControllerMachine controller) { - if (controllers.contains(controller)) { - controllers.remove(controller); - if (controllers.isEmpty()) { - releaseExecutorService(); - } - } - } - - private void searchingTask() { - try { - if (!GTCEu.canGetServerLevel()) return; - IN_SERVICE.set(true); - for (var controller : controllers) { - try { - controller.asyncCheckPattern(periodID); - } catch (Throwable e) { - GTCEu.LOGGER.error("Error while assembling multiblock {}: {}", controller, e.getMessage()); - } - } - } catch (Throwable e) { - GTCEu.LOGGER.error("Error while assembling multiblocks: {}", e.getMessage()); - } finally { - IN_SERVICE.set(false); - } - periodID++; - } - - public static boolean isThreadService() { - return IN_SERVICE.get() && GTCEu.canGetServerLevel(); - } - - public void releaseExecutorService() { - if (executorService != null) { - executorService.shutdownNow(); - } - executorService = null; - } - - public long getPeriodID() { - return periodID; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/Predicates.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/Predicates.java deleted file mode 100644 index e81b9250100..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/Predicates.java +++ /dev/null @@ -1,327 +0,0 @@ -package com.gregtechceu.gtceu.api.pattern; - -import com.gregtechceu.gtceu.api.GTCEuAPI; -import com.gregtechceu.gtceu.api.block.ICoilType; -import com.gregtechceu.gtceu.api.block.MetaMachineBlock; -import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; -import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; -import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; -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.multiblock.IBatteryData; -import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; -import com.gregtechceu.gtceu.api.pattern.error.PatternStringError; -import com.gregtechceu.gtceu.api.pattern.predicates.*; -import com.gregtechceu.gtceu.api.pipenet.IPipeNode; -import com.gregtechceu.gtceu.api.recipe.GTRecipeType; -import com.gregtechceu.gtceu.common.block.BatteryBlock; -import com.gregtechceu.gtceu.common.block.CoilBlock; -import com.gregtechceu.gtceu.common.block.LampBlock; -import com.gregtechceu.gtceu.common.data.GTMaterialBlocks; -import com.gregtechceu.gtceu.common.machine.multiblock.electric.PowerSubstationMachine; -import com.gregtechceu.gtceu.config.ConfigHolder; - -import com.lowdragmc.lowdraglib.utils.BlockInfo; - -import net.minecraft.network.chat.Component; -import net.minecraft.tags.TagKey; -import net.minecraft.world.item.DyeColor; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Fluid; - -import com.tterrag.registrate.util.entry.BlockEntry; -import com.tterrag.registrate.util.entry.RegistryEntry; -import org.apache.commons.lang3.ArrayUtils; - -import java.util.*; -import java.util.function.Predicate; -import java.util.function.Supplier; - -import static com.gregtechceu.gtceu.api.block.property.GTBlockStateProperties.ACTIVE; -import static com.gregtechceu.gtceu.common.data.GTBlocks.BORDERLESS_LAMPS; -import static com.gregtechceu.gtceu.common.data.GTBlocks.LAMPS; -import static com.gregtechceu.gtceu.common.machine.multiblock.electric.PowerSubstationMachine.PMC_BATTERY_HEADER; - -public class Predicates { - - public static TraceabilityPredicate controller(TraceabilityPredicate predicate) { - return predicate.setController(); - } - - public static TraceabilityPredicate states(BlockState... allowedStates) { - var candidates = new ArrayList(); - for (BlockState state : allowedStates) { - candidates.add(state); - if (state.hasProperty(ACTIVE)) { - candidates.add(state.setValue(ACTIVE, !state.getValue(ACTIVE))); - } - } - return new TraceabilityPredicate(new PredicateStates(candidates.toArray(BlockState[]::new))); - } - - public static TraceabilityPredicate blocks(Block... blocks) { - return new TraceabilityPredicate(new PredicateBlocks(blocks)); - } - - public static TraceabilityPredicate blocks(MetaMachineBlock... blocks) { - return new TraceabilityPredicate( - new PredicateBlocks(Arrays.stream(blocks).toArray(Block[]::new))); - } - - public static TraceabilityPredicate machines(MachineDefinition... definitions) { - ArrayList machineBlocks = new ArrayList<>(definitions.length); - for (var definition : definitions) { - if (definition != null) { - machineBlocks.add(definition.get()); - } - } - return blocks(machineBlocks.toArray(MetaMachineBlock[]::new)); - } - - public static TraceabilityPredicate blockTag(TagKey tag) { - return new TraceabilityPredicate(new PredicateBlockTag(tag)); - } - - public static TraceabilityPredicate fluids(Fluid... fluids) { - return new TraceabilityPredicate(new PredicateFluids(fluids)); - } - - public static TraceabilityPredicate fluidTag(TagKey tag) { - return new TraceabilityPredicate(new PredicateFluidTag(tag)); - } - - public static TraceabilityPredicate custom(Predicate predicate, Supplier candidates) { - return new TraceabilityPredicate(predicate, candidates); - } - - public static TraceabilityPredicate any() { - return new TraceabilityPredicate(SimplePredicate.ANY); - } - - public static TraceabilityPredicate air() { - return new TraceabilityPredicate(SimplePredicate.AIR); - } - - @SafeVarargs - public static TraceabilityPredicate lamps(BlockEntry... lampEntries) { - return new TraceabilityPredicate(blockWorldState -> { - BlockState state = blockWorldState.getBlockState(); - for (BlockEntry entry : lampEntries) { - if (state.is(entry.get())) return true; - } - return false; - }, () -> Arrays.stream(lampEntries) - .map(entry -> new BlockInfo(entry.get().defaultBlockState(), null)) - .toArray(BlockInfo[]::new)); - } - - public static TraceabilityPredicate anyLamp() { - List> all = new ArrayList<>(); - all.addAll(LAMPS.values()); - all.addAll(BORDERLESS_LAMPS.values()); - return lamps(all.toArray(BlockEntry[]::new)); - } - - private static final Map LAMPS_BY_COLOR = new EnumMap<>(DyeColor.class); - - public static TraceabilityPredicate lampsByColor(DyeColor color) { - return LAMPS_BY_COLOR.computeIfAbsent(color, c -> lamps(LAMPS.get(c), BORDERLESS_LAMPS.get(c))); - } - - public static TraceabilityPredicate abilities(PartAbility... abilities) { - return blocks(Arrays.stream(abilities).map(PartAbility::getAllBlocks).flatMap(Collection::stream) - .toArray(Block[]::new)); - } - - public static TraceabilityPredicate ability(PartAbility ability, int... tiers) { - return blocks((tiers.length == 0 ? ability.getAllBlocks() : ability.getBlocks(tiers)).toArray(Block[]::new)); - } - - public static TraceabilityPredicate autoAbilities(GTRecipeType... recipeType) { - return autoAbilities(recipeType, true, true, true, true, true, true); - } - - public static TraceabilityPredicate autoAbilities(GTRecipeType[] recipeType, - boolean checkEnergyIn, - boolean checkEnergyOut, - boolean checkItemIn, - boolean checkItemOut, - boolean checkFluidIn, - boolean checkFluidOut) { - TraceabilityPredicate predicate = new TraceabilityPredicate(); - - if (checkEnergyIn) { - for (var type : recipeType) { - if (type.getMaxInputs(EURecipeCapability.CAP) > 0) { - predicate = predicate.or(abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1) - .setMaxGlobalLimited(2).setPreviewCount(1)); - break; - } - } - } - if (checkEnergyOut) { - for (var type : recipeType) { - if (type.getMaxOutputs(EURecipeCapability.CAP) > 0) { - predicate = predicate.or(abilities(PartAbility.OUTPUT_ENERGY).setMinGlobalLimited(1) - .setMaxGlobalLimited(2).setPreviewCount(1)); - break; - } - } - } - if (checkItemIn) { - for (var type : recipeType) { - if (type.getMaxInputs(ItemRecipeCapability.CAP) > 0) { - predicate = predicate.or(abilities(PartAbility.IMPORT_ITEMS).setPreviewCount(1)); - break; - } - } - } - if (checkItemOut) { - for (var type : recipeType) { - if (type.getMaxOutputs(ItemRecipeCapability.CAP) > 0) { - predicate = predicate.or(abilities(PartAbility.EXPORT_ITEMS).setPreviewCount(1)); - break; - } - } - } - if (checkFluidIn) { - for (var type : recipeType) { - if (type.getMaxInputs(FluidRecipeCapability.CAP) > 0) { - predicate = predicate.or(abilities(PartAbility.IMPORT_FLUIDS).setPreviewCount(1)); - break; - } - } - } - if (checkFluidOut) { - for (var type : recipeType) { - if (type.getMaxOutputs(FluidRecipeCapability.CAP) > 0) { - predicate = predicate.or(abilities(PartAbility.EXPORT_FLUIDS).setPreviewCount(1)); - break; - } - } - } - return predicate; - } - - public static TraceabilityPredicate autoAbilities(boolean checkMaintenance, boolean checkMuffler, - boolean checkParallel) { - TraceabilityPredicate predicate = new TraceabilityPredicate(); - if (checkMaintenance) { - predicate = predicate.or(abilities(PartAbility.MAINTENANCE) - .setMinGlobalLimited(ConfigHolder.INSTANCE.machines.enableMaintenance ? 1 : 0) - .setMaxGlobalLimited(1)); - } - if (checkMuffler) { - predicate = predicate.or(abilities(PartAbility.MUFFLER).setMinGlobalLimited(1).setMaxGlobalLimited(1)); - } - if (checkParallel) { - predicate = predicate.or(abilities(PartAbility.PARALLEL_HATCH).setMaxGlobalLimited(1).setPreviewCount(1)); - } - return predicate; - } - - public static TraceabilityPredicate heatingCoils() { - return new TraceabilityPredicate(blockWorldState -> { - var blockState = blockWorldState.getBlockState(); - for (Map.Entry> entry : GTCEuAPI.HEATING_COILS.entrySet()) { - if (blockState.is(entry.getValue().get())) { - var stats = entry.getKey(); - Object currentCoil = blockWorldState.getMatchContext().getOrPut("CoilType", stats); - if (!currentCoil.equals(stats)) { - blockWorldState.setError(new PatternStringError("gtceu.multiblock.pattern.error.coils")); - return false; - } - return true; - } - } - return false; - }, () -> GTCEuAPI.HEATING_COILS.entrySet().stream() - // sort to make autogenerated jei previews not pick random coils each game load - .sorted(Comparator.comparingInt(value -> value.getKey().getTier())) - .map(coil -> BlockInfo.fromBlockState(coil.getValue().get().defaultBlockState())) - .toArray(BlockInfo[]::new)) - .addTooltips(Component.translatable("gtceu.multiblock.pattern.error.coils")); - } - - public static TraceabilityPredicate cleanroomFilters() { - return new TraceabilityPredicate(blockWorldState -> { - var blockState = blockWorldState.getBlockState(); - for (var entry : GTCEuAPI.CLEANROOM_FILTERS.entrySet()) { - if (blockState.is(entry.getValue().get())) { - var stats = entry.getKey(); - Object currentCoil = blockWorldState.getMatchContext().getOrPut("FilterType", stats); - if (!currentCoil.equals(stats)) { - blockWorldState.setError(new PatternStringError("gtceu.multiblock.pattern.error.filters")); - return false; - } - return true; - } - } - return false; - }, () -> GTCEuAPI.CLEANROOM_FILTERS.values().stream() - .map(blockSupplier -> BlockInfo.fromBlockState(blockSupplier.get().defaultBlockState())) - .toArray(BlockInfo[]::new)) - .addTooltips(Component.translatable("gtceu.multiblock.pattern.error.filters")); - } - - public static TraceabilityPredicate powerSubstationBatteries() { - return new TraceabilityPredicate(blockWorldState -> { - BlockState state = blockWorldState.getBlockState(); - for (Map.Entry> entry : GTCEuAPI.PSS_BATTERIES.entrySet()) { - if (state.is(entry.getValue().get())) { - IBatteryData battery = entry.getKey(); - // Allow unfilled batteries in the structure, but do not add them to match context. - // This lets you use empty batteries as "filler slots" for convenience if desired. - if (battery.getTier() != -1 && battery.getCapacity() > 0) { - String key = PMC_BATTERY_HEADER + battery.getBatteryName(); - PowerSubstationMachine.BatteryMatchWrapper wrapper = blockWorldState.getMatchContext().get(key); - if (wrapper == null) wrapper = new PowerSubstationMachine.BatteryMatchWrapper(battery); - blockWorldState.getMatchContext().set(key, wrapper.increment()); - } - return true; - } - } - return false; - }, () -> GTCEuAPI.PSS_BATTERIES.entrySet().stream() - .sorted(Comparator.comparingInt(entry -> entry.getKey().getTier())) - .map(entry -> new BlockInfo(entry.getValue().get().defaultBlockState(), null)) - .toArray(BlockInfo[]::new)) - .addTooltips(Component.translatable("gtceu.multiblock.pattern.error.batteries")); - } - - public static TraceabilityPredicate dataHatchPredicate(TraceabilityPredicate def) { - // if research is enabled, require the data hatch, otherwise use a grate instead - if (ConfigHolder.INSTANCE.machines.enableResearch) { - return abilities(PartAbility.DATA_ACCESS, PartAbility.OPTICAL_DATA_RECEPTION) - .setExactLimit(1) - .or(def); - } - return def; - } - - /** - * Use this predicate for Frames in your Multiblock. Allows for Framed Pipes as well as normal Frame blocks. - */ - public static TraceabilityPredicate frames(Material... frameMaterials) { - var frameBlocks = Arrays.stream(frameMaterials) - .map(m -> GTMaterialBlocks.MATERIAL_BLOCKS.get(TagPrefix.frameGt, m)) - .filter(Objects::nonNull) - .filter(RegistryEntry::isPresent) - .map(RegistryEntry::get) - .toArray(Block[]::new); - return blocks(frameBlocks) - .or(new TraceabilityPredicate(blockWorldState -> { - BlockEntity blockEntity = blockWorldState.getBlockEntity(); - if (!(blockEntity instanceof IPipeNode pipeNode)) { - return false; - } - return ArrayUtils.contains(frameMaterials, pipeNode.getFrameMaterial()); - }, () -> Arrays.stream(frameMaterials) - .map(m -> GTMaterialBlocks.MATERIAL_BLOCKS.get(TagPrefix.frameGt, m)) - .filter(Objects::nonNull).filter(RegistryEntry::isPresent).map(RegistryEntry::get) - .map(BlockInfo::fromBlock).toArray(BlockInfo[]::new))); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/TraceabilityPredicate.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/TraceabilityPredicate.java deleted file mode 100644 index e0d7d1f3913..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/TraceabilityPredicate.java +++ /dev/null @@ -1,236 +0,0 @@ -package com.gregtechceu.gtceu.api.pattern; - -import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.pattern.predicates.SimplePredicate; - -import com.lowdragmc.lowdraglib.utils.BlockInfo; - -import net.minecraft.network.chat.Component; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.List; -import java.util.function.Predicate; -import java.util.function.Supplier; - -public class TraceabilityPredicate { - - public List common = new ArrayList<>(); - public List limited = new ArrayList<>(); - public boolean isController; - - public TraceabilityPredicate() {} - - public TraceabilityPredicate(TraceabilityPredicate predicate) { - common.addAll(predicate.common); - limited.addAll(predicate.limited); - isController = predicate.isController; - } - - public TraceabilityPredicate(Predicate predicate, Supplier candidates) { - common.add(new SimplePredicate(predicate, candidates)); - } - - public TraceabilityPredicate(SimplePredicate simplePredicate) { - if (simplePredicate.minCount != -1 || simplePredicate.maxCount != -1) { - limited.add(simplePredicate); - } else { - common.add(simplePredicate); - } - } - - /** - * Mark it as the controller of this multi. Normally you won't call it yourself. Use plz. - */ - public TraceabilityPredicate setController() { - isController = true; - return this; - } - - public TraceabilityPredicate sort() { - limited.sort(Comparator.comparingInt(a -> a.minCount)); - return this; - } - - /** - * Add tooltips for candidates. They are shown in JEI Pages. - */ - public TraceabilityPredicate addTooltips(Component... tips) { - if (tips.length > 0) { - List tooltips = Arrays.stream(tips).toList(); - common.forEach(predicate -> { - if (predicate.candidates == null) return; - if (predicate.toolTips == null) { - predicate.toolTips = new ArrayList<>(); - } - predicate.toolTips.addAll(tooltips); - }); - limited.forEach(predicate -> { - if (predicate.candidates == null) return; - if (predicate.toolTips == null) { - predicate.toolTips = new ArrayList<>(); - } - predicate.toolTips.addAll(tooltips); - }); - } - return this; - } - - /** - * Set the minimum number of candidate blocks. - */ - public TraceabilityPredicate setMinGlobalLimited(int min) { - limited.addAll(common); - common.clear(); - for (SimplePredicate predicate : limited) { - predicate.minCount = min; - } - return this; - } - - public TraceabilityPredicate setMinGlobalLimited(int min, int previewCount) { - return this.setMinGlobalLimited(min).setPreviewCount(previewCount); - } - - /** - * Set the maximum number of candidate blocks. - */ - public TraceabilityPredicate setMaxGlobalLimited(int max) { - limited.addAll(common); - common.clear(); - for (SimplePredicate predicate : limited) { - predicate.maxCount = max; - } - return this; - } - - public TraceabilityPredicate setMaxGlobalLimited(int max, int previewCount) { - return this.setMaxGlobalLimited(max).setPreviewCount(previewCount); - } - - /** - * Set the minimum number of candidate blocks for each aisle layer. - */ - public TraceabilityPredicate setMinLayerLimited(int min) { - limited.addAll(common); - common.clear(); - for (SimplePredicate predicate : limited) { - predicate.minLayerCount = min; - } - return this; - } - - public TraceabilityPredicate setMinLayerLimited(int min, int previewCount) { - return this.setMinLayerLimited(min).setPreviewCount(previewCount); - } - - /** - * Set the maximum number of candidate blocks for each aisle layer. - */ - public TraceabilityPredicate setMaxLayerLimited(int max) { - limited.addAll(common); - common.clear(); - for (SimplePredicate predicate : limited) { - predicate.maxLayerCount = max; - } - return this; - } - - public TraceabilityPredicate setMaxLayerLimited(int max, int previewCount) { - return this.setMaxLayerLimited(max).setPreviewCount(previewCount); - } - - /** - * Sets the Minimum and Maximum limit to the passed value - * - * @param limit The Maximum and Minimum limit - */ - public TraceabilityPredicate setExactLimit(int limit) { - return this.setMinGlobalLimited(limit).setMaxGlobalLimited(limit); - } - - /** - * Set the number of it appears in JEI pages. It only affects JEI preview. (The specific number) - */ - public TraceabilityPredicate setPreviewCount(int count) { - common.forEach(predicate -> predicate.previewCount = count); - limited.forEach(predicate -> predicate.previewCount = count); - return this; - } - - /** - * Set renderMask. - */ - public TraceabilityPredicate disableRenderFormed() { - common.forEach(predicate -> predicate.disableRenderFormed = true); - limited.forEach(predicate -> predicate.disableRenderFormed = true); - return this; - } - - /** - * Set io. - */ - public TraceabilityPredicate setIO(IO io) { - common.forEach(predicate -> predicate.io = io); - limited.forEach(predicate -> predicate.io = io); - return this; - } - - public TraceabilityPredicate setNBTParser(String nbtParser) { - common.forEach(predicate -> predicate.nbtParser = nbtParser); - limited.forEach(predicate -> predicate.nbtParser = nbtParser); - return this; - } - - public TraceabilityPredicate setSlotName(String slotName) { - common.forEach(predicate -> predicate.slotName = slotName); - limited.forEach(predicate -> predicate.slotName = slotName); - return this; - } - - public boolean test(MultiblockState blockWorldState) { - blockWorldState.io = IO.BOTH; - boolean flag = false; - for (SimplePredicate predicate : limited) { - if (predicate.testLimited(blockWorldState)) { - flag = true; - } - } - flag = flag || common.stream().anyMatch(predicate -> predicate.test(blockWorldState)); - if (flag) { - blockWorldState.setError(null); - } - return flag; - } - - public TraceabilityPredicate or(TraceabilityPredicate other) { - if (other != null) { - TraceabilityPredicate newPredicate = new TraceabilityPredicate(this); - newPredicate.common.addAll(other.common); - newPredicate.limited.addAll(other.limited); - return newPredicate; - } - return this; - } - - public boolean isAny() { - return this.common.size() == 1 && this.limited.isEmpty() && this.common.get(0) == SimplePredicate.ANY; - } - - public boolean addCache() { - return !isAny(); - } - - public boolean isAir() { - return this.common.size() == 1 && this.limited.isEmpty() && this.common.get(0) == SimplePredicate.AIR; - } - - public boolean isSingle() { - return !isAny() && !isAir() && this.common.size() + this.limited.size() == 1; - } - - public boolean hasAir() { - return this.common.contains(SimplePredicate.AIR); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/error/PatternError.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/error/PatternError.java deleted file mode 100644 index 9f777d1177b..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/error/PatternError.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.gregtechceu.gtceu.api.pattern.error; - -import com.gregtechceu.gtceu.api.pattern.MultiblockState; -import com.gregtechceu.gtceu.api.pattern.TraceabilityPredicate; -import com.gregtechceu.gtceu.api.pattern.predicates.SimplePredicate; - -import net.minecraft.core.BlockPos; -import net.minecraft.network.chat.Component; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; - -import java.util.ArrayList; -import java.util.List; - -public class PatternError { - - protected MultiblockState worldState; - - public void setWorldState(MultiblockState worldState) { - this.worldState = worldState; - } - - public Level getWorld() { - return worldState.getWorld(); - } - - public BlockPos getPos() { - return worldState.getPos(); - } - - public List> getCandidates() { - TraceabilityPredicate predicate = worldState.predicate; - List> candidates = new ArrayList<>(); - for (SimplePredicate common : predicate.common) { - candidates.add(common.getCandidates()); - } - for (SimplePredicate limited : predicate.limited) { - candidates.add(limited.getCandidates()); - } - return candidates; - } - - public Component getErrorInfo() { - List> candidates = getCandidates(); - StringBuilder builder = new StringBuilder(); - for (List candidate : candidates) { - if (!candidate.isEmpty()) { - builder.append(candidate.get(0).getDisplayName()); - builder.append(", "); - } - } - builder.append("..."); - return Component.translatable("gtceu.multiblock.pattern.error", builder.toString(), worldState.getPos()); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/error/PatternStringError.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/error/PatternStringError.java deleted file mode 100644 index 1f11a61905f..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/error/PatternStringError.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.gregtechceu.gtceu.api.pattern.error; - -import net.minecraft.network.chat.Component; - -public class PatternStringError extends PatternError { - - public final String translateKey; - - public PatternStringError(String translateKey) { - this.translateKey = translateKey; - } - - @Override - public Component getErrorInfo() { - return Component.translatable(translateKey); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/error/SinglePredicateError.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/error/SinglePredicateError.java deleted file mode 100644 index fea8334f348..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/error/SinglePredicateError.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.gregtechceu.gtceu.api.pattern.error; - -import com.gregtechceu.gtceu.api.pattern.predicates.SimplePredicate; - -import net.minecraft.network.chat.Component; -import net.minecraft.world.item.ItemStack; - -import java.util.Collections; -import java.util.List; - -public class SinglePredicateError extends PatternError { - - public final SimplePredicate predicate; - public final int type; - - public SinglePredicateError(SimplePredicate predicate, int type) { - this.predicate = predicate; - this.type = type; - } - - @Override - public List> getCandidates() { - return Collections.singletonList(predicate.getCandidates()); - } - - @Override - public Component getErrorInfo() { - int number = -1; - if (type == 0) { - number = predicate.maxCount; - } - if (type == 1) { - number = predicate.minCount; - } - if (type == 2) { - number = predicate.maxLayerCount; - } - if (type == 3) { - number = predicate.minLayerCount; - } - return Component.translatable("gtceu.multiblock.pattern.error.limited." + type, number); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/PredicateBlockTag.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/PredicateBlockTag.java deleted file mode 100644 index 7c2e954ba2c..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/PredicateBlockTag.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.gregtechceu.gtceu.api.pattern.predicates; - -import com.lowdragmc.lowdraglib.utils.BlockInfo; - -import net.minecraft.core.Holder; -import net.minecraft.core.HolderSet; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.tags.TagKey; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; - -public class PredicateBlockTag extends SimplePredicate { - - public TagKey tag = null; - - public PredicateBlockTag() { - super("tags"); - } - - public PredicateBlockTag(TagKey tag) { - this(); - this.tag = tag; - buildPredicate(); - } - - @Override - public SimplePredicate buildPredicate() { - if (tag == null) { - predicate = state -> false; - candidates = () -> new BlockInfo[] { BlockInfo.fromBlock(Blocks.BARRIER) }; - return this; - } - predicate = state -> state.getBlockState().is(tag); - candidates = () -> BuiltInRegistries.BLOCK.getTag(tag) - .stream() - .flatMap(HolderSet.Named::stream) - .map(Holder::value) - .map(BlockInfo::fromBlock) - .toArray(BlockInfo[]::new); - return this; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/PredicateBlocks.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/PredicateBlocks.java deleted file mode 100644 index 09fd7778292..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/PredicateBlocks.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.gregtechceu.gtceu.api.pattern.predicates; - -import com.lowdragmc.lowdraglib.utils.BlockInfo; - -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; - -import org.apache.commons.lang3.ArrayUtils; - -import java.util.Arrays; -import java.util.Objects; - -public class PredicateBlocks extends SimplePredicate { - - public Block[] blocks = new Block[0]; - - public PredicateBlocks() { - super("blocks"); - } - - public PredicateBlocks(Block... blocks) { - this(); - this.blocks = blocks; - buildPredicate(); - } - - @Override - public SimplePredicate buildPredicate() { - blocks = Arrays.stream(blocks).filter(Objects::nonNull).toArray(Block[]::new); - if (blocks.length == 0) blocks = new Block[] { Blocks.BARRIER }; - predicate = state -> ArrayUtils.contains(blocks, state.getBlockState().getBlock()); - candidates = () -> Arrays.stream(blocks).map(BlockInfo::fromBlock).toArray(BlockInfo[]::new); - return this; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/PredicateFluidTag.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/PredicateFluidTag.java deleted file mode 100644 index b25e333d8ed..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/PredicateFluidTag.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.gregtechceu.gtceu.api.pattern.predicates; - -import com.lowdragmc.lowdraglib.utils.BlockInfo; - -import net.minecraft.core.Holder; -import net.minecraft.core.HolderSet; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.tags.TagKey; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.Fluid; - -public class PredicateFluidTag extends SimplePredicate { - - public TagKey tag = null; - - public PredicateFluidTag() { - super("tags"); - } - - public PredicateFluidTag(TagKey tag) { - this(); - this.tag = tag; - buildPredicate(); - } - - @Override - public SimplePredicate buildPredicate() { - if (tag == null) { - predicate = state -> false; - candidates = () -> new BlockInfo[] { BlockInfo.fromBlock(Blocks.BARRIER) }; - return this; - } - predicate = state -> state.getBlockState().getFluidState().is(tag); - candidates = () -> BuiltInRegistries.FLUID.getTag(tag) - .stream() - .flatMap(HolderSet.Named::stream) - .map(Holder::value) - .map(fluid -> BlockInfo.fromBlockState(fluid.defaultFluidState().createLegacyBlock())) - .toArray(BlockInfo[]::new); - return this; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/PredicateFluids.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/PredicateFluids.java deleted file mode 100644 index 8d5265478d9..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/PredicateFluids.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.gregtechceu.gtceu.api.pattern.predicates; - -import com.lowdragmc.lowdraglib.utils.BlockInfo; - -import net.minecraft.world.level.material.Fluid; -import net.minecraft.world.level.material.Fluids; - -import org.apache.commons.lang3.ArrayUtils; - -import java.util.Arrays; -import java.util.Objects; - -public class PredicateFluids extends SimplePredicate { - - public Fluid[] fluids = new Fluid[0]; - - public PredicateFluids() { - super("fluids"); - } - - public PredicateFluids(Fluid... fluids) { - this(); - this.fluids = fluids; - buildPredicate(); - } - - @Override - public SimplePredicate buildPredicate() { - fluids = Arrays.stream(fluids).filter(Objects::nonNull).toArray(Fluid[]::new); - if (fluids.length == 0) fluids = new Fluid[] { Fluids.WATER }; - predicate = state -> ArrayUtils.contains(fluids, state.getBlockState().getFluidState().getType()); - candidates = () -> Arrays.stream(fluids) - .map(fluid -> BlockInfo.fromBlockState(fluid.defaultFluidState().createLegacyBlock())) - .toArray(BlockInfo[]::new); - return this; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/PredicateStates.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/PredicateStates.java deleted file mode 100644 index 349b90721a5..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/PredicateStates.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.gregtechceu.gtceu.api.pattern.predicates; - -import com.lowdragmc.lowdraglib.utils.BlockInfo; - -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.state.BlockState; - -import org.apache.commons.lang3.ArrayUtils; - -import java.util.Arrays; -import java.util.Objects; - -public class PredicateStates extends SimplePredicate { - - public BlockState[] states = new BlockState[0]; - - public PredicateStates() { - super("states"); - } - - public PredicateStates(BlockState... states) { - this(); - this.states = states; - buildPredicate(); - } - - @Override - public SimplePredicate buildPredicate() { - states = Arrays.stream(states).filter(Objects::nonNull).toArray(BlockState[]::new); - if (states.length == 0) states = new BlockState[] { Blocks.BARRIER.defaultBlockState() }; - predicate = state -> ArrayUtils.contains(states, state.getBlockState()); - candidates = () -> Arrays.stream(states).map(BlockInfo::fromBlockState).toArray(BlockInfo[]::new); - return this; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/SimplePredicate.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/SimplePredicate.java deleted file mode 100644 index 2184f37d463..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/SimplePredicate.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.gregtechceu.gtceu.api.pattern.predicates; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.pattern.MultiblockState; -import com.gregtechceu.gtceu.api.pattern.TraceabilityPredicate; -import com.gregtechceu.gtceu.api.pattern.error.PatternStringError; -import com.gregtechceu.gtceu.api.pattern.error.SinglePredicateError; -import com.gregtechceu.gtceu.data.lang.LangUtil; - -import com.lowdragmc.lowdraglib.utils.BlockInfo; - -import net.minecraft.client.Minecraft; -import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -import it.unimi.dsi.fastutil.longs.Long2ObjectArrayMap; -import it.unimi.dsi.fastutil.longs.Long2ObjectMap; -import it.unimi.dsi.fastutil.longs.LongOpenHashSet; -import org.jetbrains.annotations.Nullable; - -import java.util.*; -import java.util.function.Predicate; -import java.util.function.Supplier; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -public class SimplePredicate { - - public static SimplePredicate ANY = new SimplePredicate("any", x -> true, null); - public static SimplePredicate AIR = new SimplePredicate("air", - blockWorldState -> blockWorldState.getWorld().isEmptyBlock(blockWorldState.getPos()), null); - @Nullable - public Supplier candidates; - public Predicate predicate; - public List toolTips; - public int minCount = -1; - public int maxCount = -1; - public int minLayerCount = -1; - public int maxLayerCount = -1; - public int previewCount = -1; - public boolean disableRenderFormed = false; - public IO io = IO.BOTH; - public String slotName; - public String nbtParser; - - public final String type; - - public SimplePredicate() { - this("unknown"); - } - - public SimplePredicate(String type) { - this.type = type; - } - - public SimplePredicate(Predicate predicate, @Nullable Supplier candidates) { - this(); - this.predicate = predicate; - this.candidates = candidates; - } - - public SimplePredicate(String type, Predicate predicate, - @Nullable Supplier candidates) { - this(type); - this.predicate = predicate; - this.candidates = candidates; - } - - public SimplePredicate buildPredicate() { - return this; - } - - @OnlyIn(Dist.CLIENT) - public List getToolTips(TraceabilityPredicate predicates) { - List result = new ArrayList<>(); - if (toolTips != null) { - result.addAll(toolTips); - } - if (minCount == maxCount && maxCount != -1) { - result.add(Component.translatable("gtceu.multiblock.pattern.error.limited_exact", minCount)); - } else if (minCount != maxCount && minCount != -1 && maxCount != -1) { - result.add(Component.translatable("gtceu.multiblock.pattern.error.limited_within", minCount, maxCount)); - } else { - if (minCount != -1) { - result.add(LangUtil.getFromMultiLang("gtceu.multiblock.pattern.error.limited", 1, minCount)); - } - if (maxCount != -1) { - result.add(LangUtil.getFromMultiLang("gtceu.multiblock.pattern.error.limited", 0, maxCount)); - } - } - if (predicates == null) return result; - if (predicates.isSingle()) { - result.add(Component.translatable("gtceu.multiblock.pattern.single")); - } - if (predicates.hasAir()) { - result.add(Component.translatable("gtceu.multiblock.pattern.replaceable_air")); - } - return result; - } - - public boolean test(MultiblockState blockWorldState) { - if (predicate.test(blockWorldState)) { - return checkInnerConditions(blockWorldState); - } - return false; - } - - public boolean testLimited(MultiblockState blockWorldState) { - if (testGlobal(blockWorldState) && testLayer(blockWorldState)) { - return checkInnerConditions(blockWorldState); - } - return false; - } - - private boolean checkInnerConditions(MultiblockState blockWorldState) { - if (disableRenderFormed) { - blockWorldState.getMatchContext().getOrCreate("renderMask", LongOpenHashSet::new) - .add(blockWorldState.getPos().asLong()); - } - if (io != IO.BOTH) { - if (blockWorldState.io == IO.BOTH) { - blockWorldState.io = io; - } else if (blockWorldState.io != io) { - blockWorldState.io = null; - } - } - if (nbtParser != null && !blockWorldState.world.isClientSide) { - BlockEntity be = blockWorldState.getBlockEntity(); - if (be != null) { - CompoundTag nbt = be.saveWithFullMetadata(); - if (Pattern.compile(nbtParser).matcher(nbt.toString()).find()) { - return true; - } - } - blockWorldState.setError(new PatternStringError("The NBT fails to match")); - return false; - } - if (slotName != null) { - Long2ObjectMap> slots = blockWorldState.getMatchContext().getOrCreate("slots", - Long2ObjectArrayMap::new); - slots.computeIfAbsent(blockWorldState.getPos().asLong(), s -> new HashSet<>()).add(slotName); - return true; - } - return true; - } - - public boolean testGlobal(MultiblockState blockWorldState) { - if (minCount == -1 && maxCount == -1) return true; - boolean base = predicate.test(blockWorldState); - int count = blockWorldState.getGlobalCount().mergeInt(this, base ? 1 : 0, Integer::sum); - if (maxCount == -1 || count <= maxCount) return base; - blockWorldState.setError(new SinglePredicateError(this, 0)); - return false; - } - - public boolean testLayer(MultiblockState blockWorldState) { - if (minLayerCount == -1 && maxLayerCount == -1) return true; - boolean base = predicate.test(blockWorldState); - int count = blockWorldState.getLayerCount().mergeInt(this, base ? 1 : 0, Integer::sum); - if (maxLayerCount == -1 || count <= maxLayerCount) return base; - blockWorldState.setError(new SinglePredicateError(this, 2)); - return false; - } - - public List getCandidates() { - if (GTCEu.isClientSide()) { - return candidates == null ? Collections.emptyList() : - Arrays.stream(this.candidates.get()).filter(info -> info.getBlockState().getBlock() != Blocks.AIR) - .map(blockInfo -> blockInfo.getItemStackForm(Minecraft.getInstance().level, BlockPos.ZERO)) - .collect(Collectors.toList()); - } - return candidates == null ? Collections.emptyList() : - Arrays.stream(this.candidates.get()).filter(info -> info.getBlockState().getBlock() != Blocks.AIR) - .map(BlockInfo::getItemStackForm).collect(Collectors.toList()); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/util/PatternMatchContext.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/util/PatternMatchContext.java deleted file mode 100644 index b0a01a87f24..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/util/PatternMatchContext.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.gregtechceu.gtceu.api.pattern.util; - -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.function.Supplier; - -/** - * Contains an context used for storing temporary data - * related to current check and shared between all predicates doing it - */ -public class PatternMatchContext { - - private final Map data = new HashMap<>(); - - public void reset() { - this.data.clear(); - } - - public void set(String key, Object value) { - this.data.put(key, value); - } - - public int getInt(String key) { - return data.containsKey(key) ? (int) data.get(key) : 0; - } - - public void increment(String key, int value) { - set(key, getOrDefault(key, 0) + value); - } - - @SuppressWarnings("unchecked") - public T getOrDefault(String key, T defaultValue) { - return (T) data.getOrDefault(key, defaultValue); - } - - @SuppressWarnings("unchecked") - public T get(String key) { - return (T) data.get(key); - } - - public T getOrCreate(String key, Supplier creator) { - T result = get(key); - if (result == null) { - result = creator.get(); - set(key, result); - } - return result; - } - - public T getOrPut(String key, T initialValue) { - T result = get(key); - if (result == null) { - result = initialValue; - set(key, result); - } - return result; - } - - public boolean containsKey(String key) { - return data.containsKey(key); - } - - public Set> entrySet() { - return data.entrySet(); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/util/RelativeDirection.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/util/RelativeDirection.java deleted file mode 100644 index 9e23eee4f08..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/util/RelativeDirection.java +++ /dev/null @@ -1,315 +0,0 @@ -package com.gregtechceu.gtceu.api.pattern.util; - -import com.gregtechceu.gtceu.utils.GTUtil; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Vec3i; -import net.minecraft.util.StringRepresentable; - -import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; - -import java.util.Comparator; -import java.util.Locale; -import java.util.function.UnaryOperator; - -public enum RelativeDirection implements StringRepresentable { - - UP(dir -> dir.getAxis() == Direction.Axis.Y ? Direction.NORTH : Direction.UP, Direction.UP), - DOWN(dir -> dir.getAxis() == Direction.Axis.Y ? Direction.SOUTH : Direction.DOWN, Direction.DOWN), - LEFT(dir -> { - if (dir == Direction.UP) return Direction.EAST; - else if (dir == Direction.DOWN) return Direction.WEST; - else return dir.getCounterClockWise(); - }, Direction.WEST), - RIGHT(dir -> { - if (dir == Direction.UP) return Direction.WEST; - else if (dir == Direction.DOWN) return Direction.EAST; - else return dir.getClockWise(); - }, Direction.EAST), - FRONT(UnaryOperator.identity(), Direction.NORTH), - BACK(Direction::getOpposite, Direction.SOUTH); - - public static final StringRepresentable.EnumCodec CODEC = StringRepresentable - .fromEnum(RelativeDirection::values); - - public static final RelativeDirection[] VALUES = values(); - private static final RelativeDirection[] BY_GLOBAL_DIRECTION = new RelativeDirection[GTUtil.DIRECTIONS.length]; - - static { - for (var relative : VALUES) { - BY_GLOBAL_DIRECTION[relative.global.ordinal()] = relative; - } - } - - private final UnaryOperator actualDirection; - /** - * Equivalent global direction to this relative direction - * with {@link Direction#NORTH NORTH} as the "forward" direction. - */ - public final Direction global; - - RelativeDirection(UnaryOperator actualDirection, Direction global) { - this.actualDirection = actualDirection; - this.global = global; - } - - @Override - public @NotNull String getSerializedName() { - return name().toLowerCase(Locale.ROOT); - } - - public RelativeDirection getOpposite() { - return switch (this) { - case UP -> DOWN; - case DOWN -> UP; - case LEFT -> RIGHT; - case RIGHT -> LEFT; - case FRONT -> BACK; - case BACK -> FRONT; - }; - } - - public Direction getActualDirection(Direction direction) { - return actualDirection.apply(direction); - } - - /** - * @param other The other direction to check - * @return Whether both directions are on the same axis - */ - public boolean isSameAxis(RelativeDirection other) { - return this.global.getAxis() == other.global.getAxis(); - } - - public Vec3i applyVec3i(Direction facing) { - return getActualDirection(facing).getNormal(); - } - - /** - * @deprecated Renamed to {@link RelativeDirection#getRelative(Direction, Direction, boolean) getRelative}. - */ - @ApiStatus.ScheduledForRemoval(inVersion = "8.0.0") - @Deprecated(since = "7.0.0", forRemoval = true) - public Direction getRelativeFacing(Direction frontFacing, Direction upwardsFacing, boolean isFlipped) { - return getRelative(frontFacing, upwardsFacing, isFlipped); - } - - public Direction getRelative(Direction frontDir, Direction upwardsDir, boolean isFlipped) { - Direction.Axis frontAxis = frontDir.getAxis(); - return switch (this) { - case UP -> { - if (frontAxis == Direction.Axis.Y) { - // same direction as upwards facing - yield upwardsDir; - } else { - // transform the upwards facing into a real facing - yield switch (upwardsDir) { - case NORTH -> Direction.UP; - case SOUTH -> Direction.DOWN; - case EAST -> frontDir.getCounterClockWise(); - default -> frontDir.getClockWise(); // WEST - }; - } - } - case DOWN -> { - if (frontAxis == Direction.Axis.Y) { - // opposite direction as upwards facing - yield upwardsDir.getOpposite(); - } else { - // transform the upwards facing into a real facing - yield switch (upwardsDir) { - case NORTH -> Direction.DOWN; - case SOUTH -> Direction.UP; - case EAST -> frontDir.getClockWise(); - default -> frontDir.getCounterClockWise(); // WEST - }; - } - } - case LEFT -> { - Direction direction; - if (frontAxis == Direction.Axis.Y) { - direction = frontDir.getStepY() > 0 ? upwardsDir.getClockWise() : upwardsDir.getCounterClockWise(); - } else { - direction = switch (upwardsDir) { - case NORTH -> frontDir.getCounterClockWise(); - case SOUTH -> frontDir.getClockWise(); - case EAST -> Direction.DOWN; - default -> Direction.UP; // WEST - }; - } - yield isFlipped ? direction.getOpposite() : direction; - } - case RIGHT -> { - Direction direction; - if (frontAxis == Direction.Axis.Y) { - direction = frontDir.getStepY() > 0 ? upwardsDir.getCounterClockWise() : upwardsDir.getClockWise(); - } else { - direction = switch (upwardsDir) { - case NORTH -> frontDir.getClockWise(); - case SOUTH -> frontDir.getCounterClockWise(); - case EAST -> Direction.UP; - default -> Direction.DOWN; // WEST - }; - } - // invert if flipped - yield isFlipped ? direction.getOpposite() : direction; - } - // same direction as front facing, upwards facing doesn't matter - case FRONT -> frontDir; - // opposite direction as front facing, upwards facing doesn't matter - case BACK -> frontDir.getOpposite(); - }; - } - - public Comparator getSorter(Direction frontDir, Direction upwardsDir, boolean isFlipped) { - // get the direction to go in for the part sorter - Direction sorterDirection = getRelative(frontDir, upwardsDir, isFlipped); - - // Determined by Direction.Axis + Direction.AxisDirection - return switch (sorterDirection) { - case UP -> Comparator.comparingInt(BlockPos::getY); - case DOWN -> Comparator.comparingInt(pos -> -pos.getY()); - case NORTH -> Comparator.comparingInt(pos -> -pos.getZ()); - case EAST -> Comparator.comparingInt(BlockPos::getX); - case SOUTH -> Comparator.comparingInt(BlockPos::getZ); - case WEST -> Comparator.comparingInt(pos -> -pos.getX()); - }; - } - - /** - * Simulates rotating the controller around an axis to get to a new front facing. - * - * @return Returns the new upwards facing. - */ - public static Direction simulateAxisRotation(Direction newFrontDir, Direction oldFrontDir, Direction upwardsDir) { - if (newFrontDir == oldFrontDir) return upwardsDir; - - Direction.Axis newAxis = newFrontDir.getAxis(); - Direction.Axis oldAxis = oldFrontDir.getAxis(); - - if (newAxis != Direction.Axis.Y && oldAxis != Direction.Axis.Y) { - // no change needed - return upwardsDir; - } else if (newAxis == Direction.Axis.Y && oldAxis != Direction.Axis.Y) { - // going from horizontal to vertical axis - Direction newUpwardsDir = switch (upwardsDir) { - case NORTH -> oldFrontDir.getOpposite(); - case SOUTH -> oldFrontDir; - case EAST -> oldFrontDir.getCounterClockWise(); - default -> oldFrontDir.getClockWise(); // WEST - }; - return newFrontDir == Direction.DOWN && upwardsDir.getAxis() == Direction.Axis.Z ? - newUpwardsDir.getOpposite() : newUpwardsDir; - } else if (newAxis != Direction.Axis.Y) { - // going from vertical to horizontal axis - Direction newUpwardsDir; - if (upwardsDir == newFrontDir) { - newUpwardsDir = Direction.SOUTH; - } else if (upwardsDir == newFrontDir.getOpposite()) { - newUpwardsDir = Direction.NORTH; - } else if (upwardsDir == newFrontDir.getClockWise()) { - newUpwardsDir = Direction.WEST; - } else { // getCounterClockWise - newUpwardsDir = Direction.EAST; - } - return oldFrontDir == Direction.DOWN && newUpwardsDir.getAxis() == Direction.Axis.Z ? - newUpwardsDir.getOpposite() : newUpwardsDir; - } else { - // was on vertical axis and still is. Must have flipped from up to down or vice versa - return upwardsDir.getOpposite(); - } - } - - /** - * Offset a BlockPos relatively in any direction by any amount. Pass negative values to offset down, right or - * backwards. - */ - public static BlockPos offsetPos(BlockPos pos, Direction frontDir, Direction upwardsDir, boolean isFlipped, - int upOffset, int leftOffset, int forwardOffset) { - if (upOffset == 0 && leftOffset == 0 && forwardOffset == 0) { - return pos; - } - - int oX = 0, oY = 0, oZ = 0; - final Direction relUp = UP.getRelative(frontDir, upwardsDir, isFlipped); - oX += relUp.getStepX() * upOffset; - oY += relUp.getStepY() * upOffset; - oZ += relUp.getStepZ() * upOffset; - - final Direction relLeft = LEFT.getRelative(frontDir, upwardsDir, isFlipped); - oX += relLeft.getStepX() * leftOffset; - oY += relLeft.getStepY() * leftOffset; - oZ += relLeft.getStepZ() * leftOffset; - - final Direction relForward = FRONT.getRelative(frontDir, upwardsDir, isFlipped); - oX += relForward.getStepX() * forwardOffset; - oY += relForward.getStepY() * forwardOffset; - oZ += relForward.getStepZ() * forwardOffset; - - return pos.offset(oX, oY, oZ); - } - - public static RelativeDirection fromGlobalDirection(Direction direction) { - return BY_GLOBAL_DIRECTION[direction.ordinal()]; - } - - public static Direction getActualDirection(Direction original, Direction current, Direction direction) { - return findRelativeOf(original, current).getActualDirection(direction); - } - - /** - * Finds the difference of {@code baseDir} and {@code relativeDir} as a relative direction. - *
- * If {@code baseDir} is vertical (e.g. {@link Direction#UP UP} or {@link Direction#DOWN DOWN}), - * the rotation is calculated with {@link Direction#NORTH NORTH} as the upwards direction. - * - * @param baseDir the direction to offset - * @param relativeDir the direction to offset by - * @return The difference of {@code baseDir} and {@code relativeDir} as a relative direction - */ - public static RelativeDirection findRelativeOf(Direction baseDir, Direction relativeDir) { - return findRelativeOf(baseDir, relativeDir, Direction.NORTH); - } - - /** - * Finds the difference of {@code baseDir} and {@code relativeDir} as a relative direction. - *
- * If {@code baseDir} is vertical, the rotation is calculated with {@code upwardsDir} as the "upwards" direction. - * - * @param baseDir the direction to offset - * @param relativeDir the direction to offset by - * @param upwardsDir the upwards direction - * @return The difference of {@code baseDir} and {@code relativeDir} as a relative direction - */ - public static RelativeDirection findRelativeOf(Direction baseDir, Direction relativeDir, Direction upwardsDir) { - // Check simple cases first - if (baseDir == relativeDir) return RelativeDirection.FRONT; - if (baseDir.getOpposite() == relativeDir) return RelativeDirection.BACK; - - if (baseDir.getAxis().isHorizontal()) { // baseDir is one of N,S,W,E - if (relativeDir == Direction.UP) return RelativeDirection.UP; - else if (relativeDir == Direction.DOWN) return RelativeDirection.DOWN; - else if (relativeDir == baseDir.getCounterClockWise()) return RelativeDirection.LEFT; - else return RelativeDirection.RIGHT; // getClockWise - } else { // baseDir is UP or DOWN - if (upwardsDir.getAxis() == Direction.Axis.Y) { - throw new IllegalStateException("upwardsDir must be a horizontal direction! is " + upwardsDir); - } - - if (relativeDir == upwardsDir.getCounterClockWise()) { - return RelativeDirection.LEFT; - } else if (relativeDir == upwardsDir.getClockWise()) { - return RelativeDirection.RIGHT; - } else { // relativeDir is NORTH or SOUTH (assuming upwardsDir is NORTH) - RelativeDirection dir; - if (relativeDir == upwardsDir.getOpposite()) dir = RelativeDirection.UP; - else dir = RelativeDirection.DOWN; // relativeDir == NORTH - - if (baseDir == Direction.DOWN) dir = dir.getOpposite(); - return dir; - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeCoverContainer.java b/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeCoverContainer.java index 7b0f8337c4a..4fb9587c39f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeCoverContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeCoverContainer.java @@ -4,11 +4,11 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.CoverDefinition; -import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; +import com.gregtechceu.gtceu.api.sync_system.managed.ISyncManaged; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.common.blockentity.FluidPipeBlockEntity; import com.gregtechceu.gtceu.common.blockentity.ItemPipeBlockEntity; diff --git a/src/main/java/com/gregtechceu/gtceu/api/placeholder/MultiLineComponent.java b/src/main/java/com/gregtechceu/gtceu/api/placeholder/MultiLineComponent.java index ac19946fe1b..7dde6d83d6b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/placeholder/MultiLineComponent.java +++ b/src/main/java/com/gregtechceu/gtceu/api/placeholder/MultiLineComponent.java @@ -18,6 +18,7 @@ import java.util.Collection; import java.util.List; import java.util.Objects; +import java.util.function.UnaryOperator; @Accessors(chain = true) public class MultiLineComponent extends ArrayList { @@ -134,6 +135,17 @@ public MultiLineComponent withStyle(Style style) { return out; } + public MultiLineComponent withStyle(UnaryOperator