From 29a43ddb9e1d272d63469a708e387265eb6456ab Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 6 Jan 2026 11:16:05 +0100 Subject: [PATCH 01/28] RELEASE for 1.20.1 [no-snapshot] (#4426) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Jurre Groenendijk --- CHANGELOG.md | 52 +++++++++++++++++++++++++++++++++++++++++++++++ gradle.properties | 2 +- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61e448905f1..4421b140e5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,57 @@ # ChangeLog +## Version [v7.4.1](https://github.com/GregTechCEu/GregTech-Modern/compare/v7.4.0-1.20.1...v7.4.1-1.20.1) +### Added + +- Improvements to Sodalite and Lazurite by @htmlcsjs in [#4297](https://github.com/GregTechCEu/GregTech-Modern/pull/4297) +- Allow accessing block nbt from placeholders by @TarLaboratories in [#4161](https://github.com/GregTechCEu/GregTech-Modern/pull/4161) +- Fix blackstone and tuff ores not dropping dusts by @JuiceyBeans in [#4376](https://github.com/GregTechCEu/GregTech-Modern/pull/4376) +- Make netherite tools and items fire resistant by @JuiceyBeans in [#4378](https://github.com/GregTechCEu/GregTech-Modern/pull/4378) +- Jade support for Long Distance Pipeline Endpoints by @JuiceyBeans in [#4420](https://github.com/GregTechCEu/GregTech-Modern/pull/4420) + +### Fixed + +- Fix vanilla fuel not working in boilers by @jurrejelle in [#4249](https://github.com/GregTechCEu/GregTech-Modern/pull/4249) +- Fix manual mode for item/fluid filter covers and conveyors/pumps by @programmer3481 in [#4245](https://github.com/GregTechCEu/GregTech-Modern/pull/4245) +- no more z fighting by @Spicierspace153 in [#4240](https://github.com/GregTechCEu/GregTech-Modern/pull/4240) +- Fix #4154 Charcoal Pile Igniter by @zetrock1 in [#4246](https://github.com/GregTechCEu/GregTech-Modern/pull/4246) +- Add tooltips for link covers by @zetrock1 in [#4265](https://github.com/GregTechCEu/GregTech-Modern/pull/4265) +- Large Boiler throttle modifies burn time of current fuel by @DilithiumThoride in [#4258](https://github.com/GregTechCEu/GregTech-Modern/pull/4258) +- Fix scythe not breaking items in an AOE by @Ujhik in [#4207](https://github.com/GregTechCEu/GregTech-Modern/pull/4207) +- Fix GT Capes not rendering in multiplayer by @DilithiumThoride in [#4271](https://github.com/GregTechCEu/GregTech-Modern/pull/4271) +- Fix dupes of Carbon dust and Coal dust by @zetrock1 in [#4301](https://github.com/GregTechCEu/GregTech-Modern/pull/4301) +- rework the check for decomposition amounts by @jonasGajdosikas in [#4298](https://github.com/GregTechCEu/GregTech-Modern/pull/4298) +- Fix ghost circuit in item detector by @zetrock1 in [#4293](https://github.com/GregTechCEu/GregTech-Modern/pull/4293) +- Fixes shiny material set double plates. by @Flare32 in [#4213](https://github.com/GregTechCEu/GregTech-Modern/pull/4213) +- Add directional setting UI and fix Machine UI TitleBar by @remakefactory in [#4238](https://github.com/GregTechCEu/GregTech-Modern/pull/4238) +- KubeJS Duration Check by @YoungOnionMC in [#4327](https://github.com/GregTechCEu/GregTech-Modern/pull/4327) +- Fixes some cases where handleRecipe() succeeds when it should fail by @DilithiumThoride in [#4300](https://github.com/GregTechCEu/GregTech-Modern/pull/4300) +- Allow tags in shaped recipes to get recycle info by @jurrejelle in [#4292](https://github.com/GregTechCEu/GregTech-Modern/pull/4292) +- Prevent clientside state mutations in QuarkTechSuite helmet by @Mqrius in [#4322](https://github.com/GregTechCEu/GregTech-Modern/pull/4322) +- (Docs) Fix GTValues.VA being used as a function in material property modification, add reference to coil temps in Material Properties by @carbonatek in [#4338](https://github.com/GregTechCEu/GregTech-Modern/pull/4338) +- Update spotless to 8.1.0 by @Reabstraction in [#4323](https://github.com/GregTechCEu/GregTech-Modern/pull/4323) +- PumpBiomeModifier - change priority of tags by @zetrock1 in [#4369](https://github.com/GregTechCEu/GregTech-Modern/pull/4369) +- Make fuel jetpacks work on servers by @Mqrius in [#4341](https://github.com/GregTechCEu/GregTech-Modern/pull/4341) +- Fix facade cover json by @jurrejelle in [#4418](https://github.com/GregTechCEu/GregTech-Modern/pull/4418) +- Correct Data Stick interaction handling by @remakefactory in [#4409](https://github.com/GregTechCEu/GregTech-Modern/pull/4409) +- Fixes to overlay textures on some machines. by @Conity723 in [#4403](https://github.com/GregTechCEu/GregTech-Modern/pull/4403) +- Fix {fromAscii} placeholder by @TarLaboratories in [#4392](https://github.com/GregTechCEu/GregTech-Modern/pull/4392) +- Fix rotor holder Z-fighting by @zetrock1 in [#4335](https://github.com/GregTechCEu/GregTech-Modern/pull/4335) +- Refactor naquadah reactor overlays to a workableMultiblockMachineCasing compatible format by @jonasGajdosikas in [#4353](https://github.com/GregTechCEu/GregTech-Modern/pull/4353) +- Fix ranged output items voiding if there wasn't enough output space by @DilithiumThoride in [#4290](https://github.com/GregTechCEu/GregTech-Modern/pull/4290) +- Add recipe for Copper Ingot disassembling by @esmenard in [#4399](https://github.com/GregTechCEu/GregTech-Modern/pull/4399) +- Fix multiblock controller rotation overlay logic by @jkieberking in [#4199](https://github.com/GregTechCEu/GregTech-Modern/pull/4199) +- Add missing rock types to initializeCobbleReplacements() by @Pyritie in [#4329](https://github.com/GregTechCEu/GregTech-Modern/pull/4329) + +### Changed + +- Large Boiler throttle modifies burn time of current fuel by @DilithiumThoride in [#4258](https://github.com/GregTechCEu/GregTech-Modern/pull/4258) +- ja_jp fix by @code-onigiri in [#4319](https://github.com/GregTechCEu/GregTech-Modern/pull/4319) +- Change out LDLib client side check to GTCEu one by @jurrejelle in [#4365](https://github.com/GregTechCEu/GregTech-Modern/pull/4365) +- Update uk_ua.json by @StarmanMine142 in [#4411](https://github.com/GregTechCEu/GregTech-Modern/pull/4411) +- Port existing keybinds to new system by @TechLord22 in [#4069](https://github.com/GregTechCEu/GregTech-Modern/pull/4069) + + ## Version [v7.4.0](https://github.com/GregTechCEu/GregTech-Modern/compare/v7.3.0-1.20.1...v7.4.0-1.20.1) ### Added diff --git a/gradle.properties b/gradle.properties index b9a1286baf9..9b9873e5704 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ org.gradle.caching = true # Mod Info mod_id = gtceu mod_name = GregTech -mod_version = 7.4.1 +mod_version = 7.5.0 mod_description = GregTech CE Unofficial, ported from 1.12.2 mod_license = LGPL-3.0 license mod_url = https://github.com/GregTechCEu/GregTech-Modern/ From e3ce9029d3bc233b2376034265a1288e1fb262b7 Mon Sep 17 00:00:00 2001 From: Haze Date: Wed, 7 Jan 2026 04:41:42 -0500 Subject: [PATCH 02/28] 7.4.x Haze small fusion ctm tweaks bc it was bothering me (#4432) --- .../casings/fusion/fusion_casing_mk3_ctm.png | Bin 1391 -> 1372 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/gtceu/textures/block/casings/fusion/fusion_casing_mk3_ctm.png b/src/main/resources/assets/gtceu/textures/block/casings/fusion/fusion_casing_mk3_ctm.png index b8aa4b422976cdb86197c0215b55924d68bc9bb5..6e4660eedbca20046079a09138509faa6f8f18d4 100644 GIT binary patch delta 1340 zcmV-C1;hI93fu~iF@F|GL_t(og{_x8Xd7o3$A31$VD5C#>yV_<;K`SYG)3|SN=H8-gQ0{%gK0y-WHBBBO3m5p| zr=OX!rT`f923)#w8PhcR=a0X*dHWWg=ixXG0AU#Nc>N(WGc&Z?ZG7M7#qP_@dZ|>R z6&_JA41u<>cgqG)+0!-=k8gP%fA8eV_B^&-2~~@3XYD1i;D33A?Xfadlx4 z0Nb`n;y$WamVZUN-KNv&;JPj^c3+Ywg&+vHvwW9sw|nM&k^s=__2_gu)a!M6y`EH@ zrYQimIhWsG{w6On%pw4B90Sm7HUX$qDj9`_VE|y7CWcvLQd|sBDwX6$-}k9hD%iG7 zr_+)Dt9x__!%#XBMUgx&j0qY(2m5=OXiWm7X-bkL1b;z5(D3>Ci)CEb#kOtQ?KV*q zv9_{`=XnG{AfqHOp*kQ8)XyhzpW2)&(`Fb3N!+K9#C;C-_oPKaxd4#JA;8+oDjUzA z$-RT#KpK(6eOlp>T+72i7>1)5c>3rGmSxdwHi@EWM7ao~@Z|CO!_5B8?JaEE24L2? z2tc>n9e=?<68EL|s>746>q?N->vde$%~dV{IWsep*{`NRfGdgnxfnnJxirA{eW`4A zb{6$rRW8=`cU4T&l+QW_@{~&h%H=Y)ZL_npgZi#VLR|;g+1WvWSQi}wx(H(mo7-C% zl2}_=#j-384-aJyZQJJX@KEM_b9)Pv+7}Wue1G|z#{=p*Ll74Ry#aTYmt-C{o@vNL1{>XX5EaEs0aU5r=Wl}t(X^L&zIF7@{^JgPD z6v}Pemb_t@MGUjZ^z<|g(Jj2p!+;sKU6l0k8^*_412RGg;iS(y#PELcx~Q1HBA7HKw{62O*ajTkGWV45aZ7Zy3# z-^(!Dn>TN$R;&2F&++lG46!&o>s*vIFH(SlZXE+cR41pbDJDLw)=u?s3M0maS}N08 zFvBhxG<=>udXkw3Hn+Frnkt2xw{J-*MSsDAZQJr$t#jdRnx;%oPqX{_m8=W^&+{VEnDM>*D&%VqAZf0wyO+%@5O-l;wh zyo-0CT<<0N{@i&$eb@WH{yy%!-qOdN|KIb#|2;pkv9WRbuEPGdv5q0V>-#4@{rt1j zyxLbm_cnm)YvQi;dk;Y2fiLfWGk*eJR32bBFbKM=)oN!K4ogq0iO(t_rfCv}A@lR| zpfFq>59o~PIL;^!h#Dtnh7&zpRUR~a=I7_-JR#2H@c=`LPt#N~WqOGzd9(iBdYLO}S`#RZAnX8aep*m`}SSJFy!xl{{i5| zv**kdW&jxWhg`UH5z{nz@$5O*Zd}K8U2NM1AP54sHZ}>vkk_wY1JHQY8rv@xi*$lR za)x2hY}C2Aev9MdW0EAH*{D-4mnoG>0L;zJ5d;BiYij@;A0M;-bdTkgRRAo@B8~>= zQZAR}dv0!y#(%38S(5X8pPTEq==FN1ua9E@`u#rLZkJlEM!(+|!%30=P+fHR{mE}~ zkzwWmh@uF9cDqffRH9rii#~v17yy{2iDBlMRu=;li$yu;c^>6*8OyThcDwR_{Y+Yd zAdrWIVMw7+7}NJ#9?eF5ELzh5Ns-Z5Y=0fcaj-0lqoX6jFl1|E6W4X| zeP5!aFrhy{IhfXuqXE@LN77~(25~eX7e@n{jkx7)>W900a9HraV_ zPtFeeLvbRG26Tc$*(($ZWBQNwpAZDWBnE!^?gt8m0_}F2FbpS*t2C&We82te*!la9 zA7WV+0DlYic>sF79_@A;G%&`|Kwhsuc-nCs0ZFY^!*QHU;|h@T^Ydfp^%N*@#nFH; z3`Ji#g9dVO!1FvYwy>~(zSfPa{q$NF(=_Efje#uV;y|fX!m=!OcX!d(=}74N0K2=p zC=jP5je)c%XL9!+KjhK=6WQ3>*rZS>aBy%SIe)Y)i-Us$$@%@q4?(MaC4S43?=%L| z`;0)G8}^6XTwjws?mW0BG+L|GCX8Rca#dcfg9%`HW%ab2Ti%4eVdk-In<$FLs%2Vz zBuRp0S=hGC&VzdsIaJ0i%M#u&%shsfXLfcLM(9?r%))>oD#OeRV~#PQ-jL49p?*de z!+*?=5lxo9BC0Vaym09v`%m|X<9H0k?RHxLr>HbZlG8F9g;}wl0-@r0!^~&u>&`04 znWo9|$|}u9eT>=m{%Ugd!(}|rla}0U)J1v0J})(|Qh_q9~%*>#<;;r`PKVz*NqHAfQ^U(rnbJE;<4@oePS^BAreLM)N>cFDMp^GJi9m z^FWs9fYH5H#^X4qy6E7#uFMlkvUng#5}7AdYo7XG^`n!lkc!b!O4PodB9*eN)cx|~ z&ob7PN+oV@e=~NEx@*dH-IMe@@GjQMc)FLQ&u7j9`a0eJ)9bVJ(=Gih{kNV6-d2BV zXJ_Z+U4{KkV;v)UPoJOq_|s2LvVUq{2i=xQ>Y93Hw*YBHP!n2yuus@vmUsl^zI9YjrkxHc^E%~f={2x^zDq5GP RA5j1R002ovPDHLkV1k0Rs%HQI From 8c0f8c86fcea0d63efc37d06e16afa1f4cdaa274 Mon Sep 17 00:00:00 2001 From: TechLord22 <37029404+TechLord22@users.noreply.github.com> Date: Thu, 8 Jan 2026 14:24:42 -0500 Subject: [PATCH 03/28] Two-Phase Recipe Addition System (#3981) Co-authored-by: jurrejelle --- .../recipe/FluidRecipeCapability.java | 3 +- .../recipe/ItemRecipeCapability.java | 3 +- .../capability/recipe/RecipeCapability.java | 3 +- .../api/cover/filter/SmartItemFilter.java | 17 +- .../gtceu/api/recipe/GTRecipeType.java | 17 +- .../gtceu/api/recipe/lookup/Branch.java | 37 +- .../api/recipe/lookup/GTRecipeLookup.java | 609 ------------------ .../api/recipe/lookup/MapIngredientPool.java | 50 ++ .../recipe/lookup/RecipeAdditionHandler.java | 59 ++ .../gtceu/api/recipe/lookup/RecipeDB.java | 395 ++++++++++++ .../api/recipe/lookup/RecipeIterator.java | 57 -- .../recipe/lookup/RecipeManagerHandler.java | 12 +- .../api/recipe/lookup/StagingRecipeDB.java | 135 ++++ .../ingredient/AbstractMapIngredient.java | 4 - .../gtceu/core/mixins/RecipeManagerMixin.java | 5 +- .../integration/kjs/GregTechKubeJSPlugin.java | 5 +- .../api/machine/trait/RecipeLogicTest.java | 10 +- .../gtceu/api/recipe/InputSeparationTest.java | 4 +- .../api/recipe/MultipleEnergyHatchTest.java | 8 +- .../gtceu/api/recipe/OverclockLogicTest.java | 14 +- .../IntProviderFluidIngredientTest.java | 23 +- .../ingredient/IntProviderIngredientTest.java | 24 +- .../recipe/ingredient/NBTPredicateTest.java | 12 +- .../api/recipe/lookup/GTRecipeLookupTest.java | 52 +- .../NBTItemStackMapIngredientLookupTest.java | 135 ++-- .../electric/AssemblyLineTests.java | 6 +- .../condition/AdjacentFluidConditionTest.java | 6 +- .../gtceu/gametest/util/TestUtils.java | 3 +- .../ae2/machine/PatternBufferTest.java | 3 +- 29 files changed, 858 insertions(+), 853 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/GTRecipeLookup.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/MapIngredientPool.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/RecipeAdditionHandler.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/RecipeDB.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/RecipeIterator.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/StagingRecipeDB.java 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 cd9b5189fc5..8f2e15d80e7 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 @@ -40,6 +40,7 @@ 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; @@ -72,7 +73,7 @@ public FluidIngredient copyWithModifier(FluidIngredient content, ContentModifier } @Override - public List compressIngredients(Collection ingredients) { + public List compressIngredients(@Unmodifiable Collection ingredients) { List list = new ObjectArrayList<>(ingredients.size()); for (Object item : ingredients) { if (item instanceof FluidIngredient fluid) { 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 c8494570625..fb37334542b 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 @@ -46,6 +46,7 @@ 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; @@ -78,7 +79,7 @@ public Ingredient copyWithModifier(Ingredient content, ContentModifier modifier) } @Override - public List compressIngredients(Collection ingredients) { + public List compressIngredients(@Unmodifiable Collection ingredients) { List list = new ObjectArrayList<>(ingredients.size()); for (Object item : ingredients) { if (item instanceof Ingredient ingredient) { 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 5c737562916..28df149687e 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 @@ -25,6 +25,7 @@ import org.apache.commons.lang3.mutable.MutableInt; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Unmodifiable; import java.util.*; @@ -115,7 +116,7 @@ public boolean isRecipeSearchFilter() { return false; } - public List compressIngredients(Collection ingredients) { + public List compressIngredients(@Unmodifiable Collection ingredients) { return new ArrayList<>(ingredients); } 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 b6485f0ab7d..c26624f1c2d 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 @@ -4,8 +4,6 @@ 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.api.recipe.lookup.GTRecipeLookup; -import com.gregtechceu.gtceu.api.recipe.lookup.ingredient.MapIngredientTypeManager; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; import com.gregtechceu.gtceu.utils.ItemStackHashStrategy; @@ -19,7 +17,7 @@ import it.unimi.dsi.fastutil.objects.Object2IntOpenCustomHashMap; -import java.util.List; +import java.util.Collections; import java.util.function.Consumer; public class SmartItemFilter implements ItemFilter { @@ -90,10 +88,11 @@ public int testItemCount(ItemStack itemStack) { private int lookup(ItemStack itemStack) { ItemStack copy = itemStack.copyWithCount(Integer.MAX_VALUE); - var ingredients = MapIngredientTypeManager.getFrom(copy, ItemRecipeCapability.CAP); - var recipe = filterMode.lookup.recurseIngredientTreeFindRecipe(List.of(ingredients), - filterMode.lookup.getLookup(), r -> true); - if (recipe == null) return 0; + var recipe = filterMode.recipeType.db() + .find(Collections.singletonMap(ItemRecipeCapability.CAP, Collections.singletonList(copy)), r -> true); + if (recipe == null) { + return 0; + } for (Content content : recipe.getInputContents(ItemRecipeCapability.CAP)) { var stacks = ItemRecipeCapability.CAP.of(content.getContent()).getItems(); for (var stack : stacks) { @@ -121,13 +120,13 @@ private enum SmartFilteringMode implements EnumSelectorWidget.SelectableEnum { private static final SmartFilteringMode[] VALUES = values(); private final String localeName; - private final GTRecipeLookup lookup; + private final GTRecipeType recipeType; private final Object2IntOpenCustomHashMap cache = new Object2IntOpenCustomHashMap<>( ItemStackHashStrategy.comparingAllButCount()); SmartFilteringMode(String localeName, GTRecipeType type) { this.localeName = localeName; - this.lookup = type.getLookup(); + this.recipeType = type; } @Override 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 8ed88d3e3a2..f07bfe7fa34 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeType.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeType.java @@ -5,7 +5,8 @@ import com.gregtechceu.gtceu.api.gui.SteamTexture; import com.gregtechceu.gtceu.api.recipe.category.GTRecipeCategory; import com.gregtechceu.gtceu.api.recipe.chance.boost.ChanceBoostFunction; -import com.gregtechceu.gtceu.api.recipe.lookup.GTRecipeLookup; +import com.gregtechceu.gtceu.api.recipe.lookup.RecipeAdditionHandler; +import com.gregtechceu.gtceu.api.recipe.lookup.RecipeDB; import com.gregtechceu.gtceu.api.recipe.ui.GTRecipeTypeUI; import com.gregtechceu.gtceu.api.sound.SoundEntry; import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder; @@ -30,6 +31,7 @@ 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; @@ -79,8 +81,10 @@ public class GTRecipeType implements RecipeType { private final GTRecipeCategory category; @Getter private final Map> categoryMap = new Object2ObjectOpenHashMap<>(); + private final RecipeDB db = new RecipeDB(); + @ApiStatus.Internal @Getter - private final GTRecipeLookup lookup = new GTRecipeLookup(this); + private final RecipeAdditionHandler additionHandler = new RecipeAdditionHandler(db); @Setter @Getter private boolean offsetVoltageText = false; @@ -195,7 +199,10 @@ public String toString() { public @NotNull Iterator searchRecipe(IRecipeCapabilityHolder holder, Predicate canHandle) { if (!holder.hasCapabilityProxies()) return Collections.emptyIterator(); - var iterator = getLookup().getRecipeIterator(holder, canHandle); + var iterator = db.iterator(holder, canHandle); + if (iterator == null) { + return Collections.emptyIterator(); + } boolean any = false; while (iterator.hasNext()) { GTRecipe recipe = iterator.next(); @@ -321,6 +328,10 @@ public Set getRecipesInCategory(GTRecipeCategory category) { return Collections.unmodifiableSet(categoryMap.getOrDefault(category, Set.of())); } + public @NotNull RecipeDB db() { + return db; + } + public interface ICustomRecipeLogic { /** diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/Branch.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/Branch.java index e3dfa9df558..2280ea25554 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/Branch.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/Branch.java @@ -5,42 +5,19 @@ import com.mojang.datafixers.util.Either; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import java.util.Map; -import java.util.stream.Stream; -public class Branch { +@ApiStatus.Internal +final class Branch { // Keys on this have *(should)* have unique hashcodes. private Map> nodes; // Keys on this have collisions, and must be differentiated by equality. private Map> specialNodes; - public Stream getRecipes(boolean filterHidden) { - Stream stream = null; - if (nodes != null) { - stream = nodes.values().stream() - .flatMap(either -> either.map(Stream::of, right -> right.getRecipes(filterHidden))); - } - if (specialNodes != null) { - if (stream == null) { - stream = specialNodes.values().stream() - .flatMap(either -> either.map(Stream::of, right -> right.getRecipes(filterHidden))); - } else { - stream = Stream.concat(stream, specialNodes.values().stream() - .flatMap(either -> either.map(Stream::of, right -> right.getRecipes(filterHidden)))); - } - } - if (stream == null) { - return Stream.empty(); - } - if (filterHidden) { - // stream = stream.filter(t -> !t.isHidden()); - } - return stream; - } - public boolean isEmptyBranch() { return (nodes == null || nodes.isEmpty()) && (specialNodes == null || specialNodes.isEmpty()); } @@ -60,4 +37,12 @@ public Map> getSpecialNodes() { } return specialNodes; } + + /** + * Removes all nodes in the branch + */ + public void clear() { + this.specialNodes = null; + this.nodes = null; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/GTRecipeLookup.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/GTRecipeLookup.java deleted file mode 100644 index 01be07758b7..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/GTRecipeLookup.java +++ /dev/null @@ -1,609 +0,0 @@ -package com.gregtechceu.gtceu.api.recipe.lookup; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.capability.recipe.*; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; -import com.gregtechceu.gtceu.api.recipe.GTRecipe; -import com.gregtechceu.gtceu.api.recipe.GTRecipeType; -import com.gregtechceu.gtceu.api.recipe.RecipeHelper; -import com.gregtechceu.gtceu.api.recipe.content.Content; -import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; -import com.gregtechceu.gtceu.api.recipe.lookup.ingredient.AbstractMapIngredient; -import com.gregtechceu.gtceu.api.recipe.lookup.ingredient.MapIngredientTypeManager; -import com.gregtechceu.gtceu.common.data.GTRecipeTypes; -import com.gregtechceu.gtceu.common.item.armor.PowerlessJetpack; -import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.utils.GTUtil; - -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.world.item.ItemStack; - -import com.mojang.datafixers.util.Either; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; -import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.lang.ref.WeakReference; -import java.util.*; -import java.util.function.BiConsumer; -import java.util.function.Predicate; - -@RequiredArgsConstructor -public class GTRecipeLookup { - - private final GTRecipeType recipeType; - - @Getter - private final Branch lookup = new Branch(); - - private static final WeakHashMap> ingredientRoot = new WeakHashMap<>(); - - /** - * Finds a GTRecipe matching the Fluid and/or ItemStack Inputs in the holder. - * - * @return the GTRecipe it has found or null for no matching GTRecipe - */ - @Nullable - public GTRecipe findRecipe(final IRecipeCapabilityHolder holder) { - return find(holder, recipe -> RecipeHelper.matchRecipe(holder, recipe).isSuccess()); - } - - /** - * Prepares Items and Fluids for use in recipe search - * - * @param holder the recipe holder (usually machine) to prepare - * @return a List of Lists of AbstractMapIngredients used for finding recipes - */ - @Nullable - protected List> prepareRecipeFind(@NotNull IRecipeCapabilityHolder holder) { - // First, check if items and fluids are valid. - int totalSize = 0; - List handlers = holder.getCapabilitiesForIO(IO.IN); - - for (var handler : handlers) { - for (var entries : handler.getHandlerMap().entrySet()) { - int size = 0; - if (!entries.getKey().isRecipeSearchFilter()) { - continue; - } - for (IRecipeHandler entry : entries.getValue()) { - if (entry.getSize() != -1) { - size += entry.getSize(); - } - } - if (size == Integer.MAX_VALUE) { - return null; - } - totalSize += size; - } - } - - if (totalSize == 0) { - return null; - } - - // Build input. - List> list = new ObjectArrayList<>(totalSize); - list.addAll(fromHolder(holder)); - - // nothing was added, so return nothing - if (list.isEmpty()) return null; - return list; - } - - /** - * Finds a recipe using Items and Fluids. - * - * @param holder the holder to find recipes for. - * @param canHandle a predicate for determining if a recipe is valid - * @return the recipe found - */ - @Nullable - public GTRecipe find(@NotNull IRecipeCapabilityHolder holder, @NotNull Predicate canHandle) { - List> list = prepareRecipeFind(holder); - // couldn't build any inputs to use for search, so no recipe could be found - if (list == null) return null; - return recurseIngredientTreeFindRecipe(list, lookup, canHandle); - } - - /** - * Creates an Iterator of Recipes using Items and Fluids. - * - * @param holder the holder to find recipes for. - * @param canHandle a predicate for determining if a recipe is valid - * @return the Recipe Iterator - */ - @NotNull - public RecipeIterator getRecipeIterator(@NotNull IRecipeCapabilityHolder holder, - @NotNull Predicate canHandle) { - List> list = prepareRecipeFind(holder); - return new RecipeIterator(this.recipeType, list, canHandle); - } - - /** - * Builds a list of unique ItemStacks from the given Collection of ItemStacks. - * Used to reduce the number inputs, if for example there is more than one of the same input, - * pack them into one. - * This uses a strict comparison, so it will not pack the same item with different NBT tags, - * to allow the presence of, for example, more than one configured circuit in the input. - * - * @param inputs The Collection of GTRecipeInputs. - * @return an array of unique itemstacks. - */ - @NotNull - public static ItemStack[] uniqueItems(@NotNull Collection inputs) { - int index = 0; - ItemStack[] uniqueItems = new ItemStack[inputs.size()]; - main: - for (ItemStack input : inputs) { - if (input.isEmpty()) { - continue; - } - if (index > 0) { - for (ItemStack unique : uniqueItems) { - if (unique == null) break; - else if (GTUtil.isSameItemSameTags(input, unique)) { - continue main; - } - } - } - uniqueItems[index++] = input; - } - if (index == uniqueItems.length) { - return uniqueItems; - } - ItemStack[] retUniqueItems = new ItemStack[index]; - System.arraycopy(uniqueItems, 0, retUniqueItems, 0, index); - return retUniqueItems; - } - - /** - * Recursively finds a recipe, top level. - * - * @param ingredients the ingredients part - * @param branchRoot the root branch to search from. - * @param canHandle if the found recipe is valid - * @return a recipe - */ - @Nullable - public GTRecipe recurseIngredientTreeFindRecipe(@NotNull List> ingredients, - @NotNull Branch branchRoot, - @NotNull Predicate canHandle) { - // Try each ingredient as a starting point, adding it to the skip-list. - // The skip-list is a packed long, where each 1 bit represents an index to skip - for (int i = 0; i < ingredients.size(); i++) { - BitSet skipSet = new BitSet(); - skipSet.set(i); - GTRecipe r = recurseIngredientTreeFindRecipe(ingredients, branchRoot, canHandle, i, 0, skipSet); - if (r != null) { - return r; - } - } - return null; - } - - /** - * Recursively finds a recipe - * - * @param ingredients the ingredients part - * @param branchMap the current branch of the tree - * @param canHandle predicate to test found recipe. - * @param index the index of the wrapper to get - * @param count how deep we are in recursion, < ingredients.length - * @param skip bitmap of ingredients to skip, i.e. which ingredients are already used in the recursion. - * @return a recipe - */ - @Nullable - public GTRecipe recurseIngredientTreeFindRecipe(@NotNull List> ingredients, - @NotNull Branch branchMap, @NotNull Predicate canHandle, - int index, int count, BitSet skip) { - // exhausted all the ingredients, and didn't find anything - if (count == ingredients.size()) return null; - - // Iterate over current level of nodes. - for (AbstractMapIngredient obj : ingredients.get(index)) { - // determine the root nodes - Map> targetMap = determineRootNodes(obj, branchMap); - - Either result = targetMap.get(obj); - if (result != null) { - // if there is a recipe (left mapping), return it immediately as found, if it can be handled - // Otherwise, recurse and go to the next branch. - GTRecipe r = result.map(potentialRecipe -> canHandle.test(potentialRecipe) ? potentialRecipe : null, - potentialBranch -> diveIngredientTreeFindRecipe(ingredients, potentialBranch, canHandle, index, - count, skip)); - if (r != null) { - return r; - } - } - } - return null; - } - - /** - * Recursively finds a recipe - * - * @param ingredients the ingredients part - * @param map the current branch of the tree - * @param canHandle predicate to test found recipe. - * @param currentIndex the index of the wrapper to get - * @param count how deep we are in recursion, < ingredients.length - * @param skip bitmap of ingredients to skip, i.e. which ingredients are already used in the recursion. - * @return a recipe - */ - @Nullable - private GTRecipe diveIngredientTreeFindRecipe(@NotNull List> ingredients, - @NotNull Branch map, - @NotNull Predicate canHandle, int currentIndex, int count, - BitSet skip) { - // We loop around ingredients.size() if we reach the end. - // only end when all ingredients are exhausted, or a recipe is found - int i = (currentIndex + 1) % ingredients.size(); - while (i != currentIndex) { - // Have we already used this ingredient? If so, skip this one. - if (!(skip.get(i))) { - // Recursive call - // Increase the count, so the recursion can terminate if needed (ingredients is exhausted) - // Append the current index to the skip list - BitSet copy = (BitSet) skip.clone(); - copy.set(i); - GTRecipe found = recurseIngredientTreeFindRecipe(ingredients, map, canHandle, i, count + 1, - copy); - if (found != null) { - return found; - } - } - // increment the index if the current index is skipped, or the recipe is not found - i = (i + 1) % ingredients.size(); - } - return null; - } - - /** - * Exhaustively gathers all recipes that can be crafted with the given ingredients, into a Set. - * - * @return a Set of recipes that can be crafted with the given ingredients - */ - @Nullable - public Set findRecipeCollisions(IRecipeCapabilityHolder holder) { - List> list = prepareRecipeFind(holder); - if (list == null) return null; - Set collidingRecipes = new ObjectOpenHashSet<>(); - recurseIngredientTreeFindRecipeCollisions(list, lookup, collidingRecipes); - return collidingRecipes; - } - - /** - * @param ingredients the ingredients to search with - * @param branchRoot the root branch to start searching from - * @param collidingRecipes the list to store recipe collisions - */ - private void recurseIngredientTreeFindRecipeCollisions(@NotNull List> ingredients, - @NotNull Branch branchRoot, - @NotNull Set collidingRecipes) { - // Try each ingredient as a starting point, adding it to the skip-list. - // The skip-list is a packed long, where each 1 bit represents an index to skip - for (int i = 0; i < ingredients.size(); i++) { - recurseIngredientTreeFindRecipeCollisions(ingredients, branchRoot, i, 0, (1L << i), collidingRecipes); - } - } - - /** - * Recursively finds all colliding recipes - * - * @param ingredients the ingredients part - * @param branchMap the current branch of the tree - * @param index the index of the wrapper to get - * @param count how deep we are in recursion, < ingredients.length - * @param skip bitmap of ingredients to skip, i.e. which ingredients are already used in the recursion. - * @param collidingRecipes the set to store the recipes in - */ - @Nullable - private GTRecipe recurseIngredientTreeFindRecipeCollisions(@NotNull List> ingredients, - @NotNull Branch branchMap, int index, int count, - long skip, - @NotNull Set collidingRecipes) { - // exhausted all the ingredients, and didn't find anything - if (count == ingredients.size()) return null; - - List wr = ingredients.get(index); - // Iterate over current level of nodes. - for (AbstractMapIngredient obj : wr) { - // determine the root nodes - Map> targetMap = determineRootNodes(obj, branchMap); - - Either result = targetMap.get(obj); - if (result != null) { - // if there is a recipe (left mapping), return it immediately as found - // Otherwise, recurse and go to the next branch. - GTRecipe r = result.map(recipe -> recipe, - right -> diveIngredientTreeFindRecipeCollisions(ingredients, right, index, count, skip, - collidingRecipes)); - if (r != null) { - collidingRecipes.add(r); - } - } - } - return null; - } - - /** - * Recursively finds a recipe - * - * @param ingredients the ingredients part - * @param map the current branch of the tree - * @param currentIndex the index of the wrapper to get - * @param count how deep we are in recursion, < ingredients.length - * @param skip bitmap of ingredients to skip, i.e. which ingredients are already used in the recursion. - * @param collidingRecipes the set to store the recipes in - * @return a recipe - */ - @Nullable - private GTRecipe diveIngredientTreeFindRecipeCollisions(@NotNull List> ingredients, - @NotNull Branch map, int currentIndex, int count, long skip, - @NotNull Set collidingRecipes) { - // We loop around ingredients.size() if we reach the end. - // only end when all ingredients are exhausted, or a recipe is found - int i = (currentIndex + 1) % ingredients.size(); - while (i != currentIndex) { - // Have we already used this ingredient? If so, skip this one. - if (((skip & (1L << i)) == 0)) { - // Recursive call - // Increase the count, so the recursion can terminate if needed (ingredients is exhausted) - // Append the current index to the skip list - GTRecipe r = recurseIngredientTreeFindRecipeCollisions(ingredients, map, i, count + 1, skip | (1L << i), - collidingRecipes); - if (r != null) { - return r; - } - } - // increment the index if the current index is skipped, or the recipe is not found - i = (i + 1) % ingredients.size(); - } - return null; - } - - /** - * Retrieves a cached ingredient, or inserts a default one - * - * @param list the list to append to - * @param ingredients the ingredient to use as a default value, if not cached - * @param cache the ingredient root to retrieve from - */ - protected static void retrieveCachedIngredient(@NotNull List> list, - @NotNull List ingredients, - @NotNull WeakHashMap> cache) { - for (int i = 0; i < ingredients.size(); i++) { - AbstractMapIngredient mappedIngredient = ingredients.get(i); - // attempt to use the cached value if possible, otherwise cache for the next time - WeakReference cached = cache.get(mappedIngredient); - if (cached != null && cached.get() != null) { - ingredients.set(i, cached.get()); - } else { - cache.put(mappedIngredient, new WeakReference<>(mappedIngredient)); - } - } - list.add(ingredients); - } - - /** - * Converts a GTRecipe's {@link RecipeCapability RecipeCapabilities} into - * a list of {@link AbstractMapIngredient AbstractMapIngredients} - * - * @param recipe the recipe to use - * @return a list of all the AbstractMapIngredients comprising the recipe - */ - @NotNull - protected List> fromRecipe(@NotNull GTRecipe recipe) { - int initialCapacity = (recipe.inputs.size() + recipe.tickInputs.size()) * 2; - List> list = new ObjectArrayList<>(initialCapacity); - recipe.inputs.forEach(processCapabilityIngredients(list)); - recipe.tickInputs.forEach(processCapabilityIngredients(list)); - return list; - } - - // spotless:off - protected BiConsumer, List> processCapabilityIngredients(List> list) { - return (cap, contents) -> { - if (cap.isRecipeSearchFilter() && !contents.isEmpty()) { - List ingredients = new ArrayList<>(); - for (Content content : contents) { - ingredients.add(content.getContent()); - } - ingredients = cap.compressIngredients(ingredients); - for (Object ingredient : ingredients) { - // use the cached ingredient, if possible - retrieveCachedIngredient(list, MapIngredientTypeManager.getFrom(ingredient, cap), ingredientRoot); - } - } - }; - } - // spotless:on - - /** - * Converts a Recipe Capability holder's handlers into - * a list of {@link AbstractMapIngredient AbstractMapIngredients} - * - * @param holder the capability holder to query handlers from - * @return a list of all the AbstractMapIngredients in the handlers - */ - @NotNull - protected List> fromHolder(@NotNull IRecipeCapabilityHolder holder) { - var handlerMap = holder.getCapabilitiesFlat().getOrDefault(IO.IN, Collections.emptyMap()); - // the initial capacity is a "feel-good" value because it's faster to just grow the list - // than to calculate an accurate value. - List> list = new ObjectArrayList<>(handlerMap.size() * 8); - for (var entry : handlerMap.entrySet()) { - var cap = entry.getKey(); - var handlers = entry.getValue(); - if (!cap.isRecipeSearchFilter()) continue; - for (var handler : handlers) { - var compressed = cap.compressIngredients(handler.getContents()); - for (var ingredient : compressed) { - list.add(MapIngredientTypeManager.getFrom(ingredient, cap)); - } - } - } - return list; - } - - /** - * Removes all recipes. - */ - @ApiStatus.Internal - public void removeAllRecipes() { - this.lookup.getNodes().clear(); - this.lookup.getSpecialNodes().clear(); - this.recipeType.getCategoryMap().clear(); - } - - /** - * Compiles a recipe and adds it to the ingredient tree - * - * @param recipe the recipe to compile - * @return if the recipe was successfully compiled - */ - public boolean addRecipe(GTRecipe recipe) { - if (recipe == null) { - return false; - } - - // Add combustion fuels to the Powerless Jetpack - if (recipe.getType() == GTRecipeTypes.COMBUSTION_GENERATOR_FUELS) { - Content content = recipe.getInputContents(FluidRecipeCapability.CAP).get(0); - FluidIngredient fluid = FluidRecipeCapability.CAP.of(content.content); - PowerlessJetpack.FUELS.putIfAbsent(fluid, recipe.duration); - } - List> items = fromRecipe(recipe); - if (recurseIngredientTreeAdd(recipe, items, lookup, 0, 0)) { - recipe.recipeCategory.addRecipe(recipe); - return true; - } - return false; - } - - /** - * Adds a recipe to the map. (recursive part) - * - * @param recipe the recipe to add. - * @param ingredients list of input ingredients representing the recipe. - * @param branchMap the current branch in the recursion. - * @param index where in the ingredients list we are. - * @param count how many branches were added already. - */ - private boolean recurseIngredientTreeAdd(@NotNull GTRecipe recipe, - @NotNull List> ingredients, - @NotNull Branch branchMap, int index, int count) { - if (count >= ingredients.size()) return true; - if (index >= ingredients.size()) { - throw new RuntimeException("Index out of bounds for recurseItemTreeAdd, should not happen"); - } - // Loop through NUMBER_OF_INGREDIENTS times. - - // the current contents to be added to a node in the branch - final List current = ingredients.get(index); - final Branch branchRight = new Branch(); - Either r; - - // for every ingredient, add it to a node - for (AbstractMapIngredient obj : current) { - // determine the root nodes - Map> targetMap = determineRootNodes(obj, branchMap); - - // Either add the recipe or create a branch. - r = targetMap.compute(obj, (k, v) -> { - if (count == ingredients.size() - 1) { - // handle very last ingredient - if (v != null) { - // handle the existing branch - if (v.left().isEmpty() || v.left().get() != recipe) { - // the recipe already there was not the one being added, so there is a conflict - if (ConfigHolder.INSTANCE.dev.debug || GTCEu.isDev()) { - GTCEu.LOGGER.warn( - "Recipe duplicate or conflict found in GTRecipeType {} and was not added. See next lines for details", - BuiltInRegistries.RECIPE_TYPE.getKey(this.recipeType)); - - GTCEu.LOGGER.warn("Attempted to add GTRecipe: {}", recipe.getId()); - - if (v.left().isPresent()) { - GTCEu.LOGGER.warn("Which conflicts with: {}", v.left().get().getId()); - } else { - GTCEu.LOGGER.warn("Could not find exact duplicate/conflict."); - } - } - } - // Return the existing recipe, even on conflicts. - // If there was no conflict but a recipe was still present, it was added on an earlier recurse, - // and this will carry the result further back in the call stack - return v; - } else { - // nothing exists for this path, so end with the recipe - return Either.left(recipe); - } - } else if (v == null) { - // no existing ingredient is present, so use the new one - return Either.right(branchRight); - } - // there is an existing ingredient here already, so use it - return v; - }); - - // left branches are always either empty or contain recipes. - // If there's a recipe present, the addition is finished for this ingredient - if (r.left().isPresent()) { - if (r.left().get() == recipe) { - // Cannot return here, since each ingredient to add is a separate path to the recipe - continue; - } else { - // exit if a different recipe is already present for this path - return false; - } - } - - // recursive part: apply the addition for the next ingredient in the list, for the right branch. - // the right branch only contains ingredients, or is empty when the left branch is present - boolean addedNextBranch = r.right() - .filter(m -> recurseIngredientTreeAdd(recipe, ingredients, m, (index + 1) % ingredients.size(), - count + 1)) - .isPresent(); - - if (!addedNextBranch) { - // failed to add the next branch, so undo any made changes - if (count == ingredients.size() - 1) { - // was the final ingredient, so the mapping of it to a recipe needs to be removed - targetMap.remove(obj); - } else { - // was a regular ingredient - if (targetMap.get(obj).right().isPresent()) { - // if something was put into the map - if (targetMap.get(obj).right().get().isEmptyBranch()) { - // if what was put was empty (invalid), remove it - targetMap.remove(obj); - } - } - } - // because a branch addition failure happened, fail the recipe addition for this step - return false; - } - } - // recipe addition was successful - return true; - } - - /** - * Determine the correct root nodes for an ingredient - * - * @param ingredient the ingredient to check - * @param branchMap the branch containing the nodes - * @return the correct nodes for the ingredient - */ - @NotNull - protected static Map> determineRootNodes(@NotNull AbstractMapIngredient ingredient, - @NotNull Branch branchMap) { - return ingredient.isSpecialIngredient() ? branchMap.getSpecialNodes() : branchMap.getNodes(); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/MapIngredientPool.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/MapIngredientPool.java new file mode 100644 index 00000000000..dd4ce3bf12e --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/MapIngredientPool.java @@ -0,0 +1,50 @@ +package com.gregtechceu.gtceu.api.recipe.lookup; + +import com.gregtechceu.gtceu.api.recipe.lookup.ingredient.AbstractMapIngredient; + +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + +import java.lang.ref.WeakReference; +import java.util.List; +import java.util.Map; +import java.util.WeakHashMap; + +/** + * Pool for {@link AbstractMapIngredient} to save memory + */ +@ApiStatus.Internal +public final class MapIngredientPool { + + private static final Map> pool = new WeakHashMap<>(); + + /** + * Replaces values in a list of ingredients with pooled versions, + * and pools the existing ingredients if not already pooled. + * + * @param list the list + */ + static void applyPooling(@NotNull List list) { + for (int i = 0; i < list.size(); i++) { + AbstractMapIngredient ingredient = list.get(i); + var pooledReference = pool.get(ingredient); + if (pooledReference == null) { + pool.put(ingredient, new WeakReference<>(ingredient)); + continue; + } + var pooled = pooledReference.get(); + if (pooled == null) { + pool.put(ingredient, new WeakReference<>(ingredient)); + } else { + list.set(i, pooled); + } + } + } + + /** + * Clear the ingredient pool + */ + public static void clear() { + pool.clear(); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/RecipeAdditionHandler.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/RecipeAdditionHandler.java new file mode 100644 index 00000000000..1e608bc6e16 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/RecipeAdditionHandler.java @@ -0,0 +1,59 @@ +package com.gregtechceu.gtceu.api.recipe.lookup; + +import com.gregtechceu.gtceu.api.recipe.GTRecipe; + +import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + +/** + * Manages the recipe addition lifecycle as recipes are added to an {@link StagingRecipeDB} + * and later baked into a {@link RecipeDB} + */ +@ApiStatus.Internal +@RequiredArgsConstructor +public final class RecipeAdditionHandler { + + private final @NotNull StagingRecipeDB stagingDB = new StagingRecipeDB(); + private final @NotNull RecipeDB db; + + private boolean isStaging; + + /** + * Begin the staging process + */ + @ApiStatus.Internal + public void beginStaging() { + if (isStaging) { + throw new IllegalStateException("cannot begin staging while already in staging state"); + } + this.isStaging = true; + } + + /** + * Add a recipe to the staging DB + * + * @param recipe the recipe + */ + @ApiStatus.Internal + public void addStaging(@NotNull GTRecipe recipe) { + if (!isStaging) { + throw new IllegalStateException("cannot add a staging recipe while not in staging state"); + } + stagingDB.add(recipe); + } + + /** + * Complete the staging DB and bake it into an optimized storage + */ + @ApiStatus.Internal + public void completeStaging() { + if (!isStaging) { + throw new IllegalStateException("cannot complete staging while not in staging state"); + } + db.clear(); + stagingDB.populateDB(db); + stagingDB.clear(); + this.isStaging = false; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/RecipeDB.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/RecipeDB.java new file mode 100644 index 00000000000..1d9850a7236 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/RecipeDB.java @@ -0,0 +1,395 @@ +package com.gregtechceu.gtceu.api.recipe.lookup; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.IRecipeCapabilityHolder; +import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.RecipeHelper; +import com.gregtechceu.gtceu.api.recipe.content.Content; +import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; +import com.gregtechceu.gtceu.api.recipe.lookup.ingredient.AbstractMapIngredient; +import com.gregtechceu.gtceu.api.recipe.lookup.ingredient.MapIngredientTypeManager; +import com.gregtechceu.gtceu.common.data.GTRecipeTypes; +import com.gregtechceu.gtceu.common.item.armor.PowerlessJetpack; +import com.gregtechceu.gtceu.config.ConfigHolder; + +import net.minecraftforge.registries.ForgeRegistries; + +import com.mojang.datafixers.util.Either; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.*; + +import java.util.*; +import java.util.function.Predicate; + +/** + * Data structure storing recipes by their input ingredients + */ +public final class RecipeDB { + + private final @NotNull Branch rootBranch = new Branch(); + + /** + * Clear the DB + */ + @ApiStatus.Internal + public void clear() { + rootBranch.clear(); + } + + /** + * Find a GT Recipe + * + * @param holder the holder to search + * @return the recipe + */ + public @Nullable GTRecipe find(@NotNull IRecipeCapabilityHolder holder) { + return find(holder, r -> RecipeHelper.matchRecipe(holder, r).isSuccess()); + } + + /** + * Find a GT Recipe + * + * @param holder the holder to search + * @param predicate the predicate to determine recipe validity + * @return the recipe + */ + public @Nullable GTRecipe find(@NotNull IRecipeCapabilityHolder holder, @NotNull Predicate predicate) { + List> list = fromHolder(holder); + if (list == null) { + return null; + } + return findRecursive(list, predicate); + } + + /** + * Find a GT Recipe + * + * @param list the ingredients to search + * @param predicate the predicate to determine recipe validity + * @return the recipe + */ + @ApiStatus.Internal + @VisibleForTesting + public @Nullable GTRecipe find(@NotNull List> list, + @NotNull Predicate predicate) { + return findRecursive(list, predicate); + } + + /** + * Find a GT Recipe + * + * @param inputs the input capabilities and their associated contents to search with + * @param predicate the predicate to determine recipe validity + * @return the recipe + */ + public @Nullable GTRecipe find(@NotNull Map, List> inputs, + @NotNull Predicate predicate) { + List> list = new ArrayList<>(); + inputs.forEach((cap, content) -> { + if (!cap.isRecipeSearchFilter()) { + return; + } + var compressed = cap.compressIngredients(content); + for (var ingredient : compressed) { + list.add(MapIngredientTypeManager.getFrom(ingredient, cap)); + } + }); + return findRecursive(list, predicate); + } + + /** + * Create an iterator for a search space + * + * @param holder the holder to search + * @param predicate the predicate to determine recipe validity + * @return an iterator + */ + public @Nullable RecipeDB.RecipeIterator iterator(@NotNull IRecipeCapabilityHolder holder, + @NotNull Predicate predicate) { + List> list = fromHolder(holder); + if (list == null) { + return null; + } + return new RecipeIterator(this, list, predicate); + } + + /** + * Recursively finds a recipe. + * + * @param ingredients the ingredients to search with + * @param predicate if the found recipe is valid + * @return the recipe + */ + private @Nullable GTRecipe findRecursive(@NotNull List> ingredients, + @NotNull Predicate predicate) { + // Try each ingredient as a starting point, adding it to the skip-list. + // The skip-list is a packed long, where each 1 bit represents an index to skip + for (int i = 0; i < ingredients.size(); i++) { + BitSet skipSet = new BitSet(ingredients.size()); + skipSet.set(i); + GTRecipe r = findRecursive(ingredients, rootBranch, predicate, i, 0, skipSet); + if (r != null) { + return r; + } + } + return null; + } + + /** + * Recursively finds a recipe by checking the current branch's nodes. + * + * @param ingredients the ingredients to search with + * @param branch the branch to search + * @param predicate if the found recipe is valid + * @param index the index of the ingredient list to check + * @param count how deep we are in recursion, < ingredients.length + * @param skip bitmask of ingredients already checked + * @return the recipe + */ + private @Nullable GTRecipe findRecursive(@NotNull List> ingredients, + @NotNull Branch branch, @NotNull Predicate predicate, + int index, int count, @NotNull BitSet skip) { + // exhausted all the ingredients, and didn't find anything + if (count == ingredients.size()) { + return null; + } + + // Iterate over current level of nodes. + for (AbstractMapIngredient obj : ingredients.get(index)) { + // determine the root nodes + var nodes = nodesForIngredient(obj, branch); + var result = nodes.get(obj); + if (result == null) { + continue; + } + // if there is a recipe (left mapping), return it immediately as found, if it can be handled + // Otherwise, recurse and go to the next branch. + GTRecipe recipe = result.map(r -> predicate.test(r) ? r : null, + b -> findRecursiveDive(ingredients, b, predicate, index, count, skip)); + if (recipe != null) { + return recipe; + } + } + return null; + } + + /** + * Recursively finds a recipe by diving deeper down a path. + * + * @param ingredients the ingredients to search with + * @param branch the branch to search + * @param predicate if the found recipe is valid + * @param index the index of the ingredient list to check + * @param count how deep we are in recursion, must be < ingredients.length + * @param skip bitmask of ingredients already checked + * @return the recipe + */ + private @Nullable GTRecipe findRecursiveDive(@NotNull List> ingredients, + @NotNull Branch branch, @NotNull Predicate predicate, + int index, int count, @NotNull BitSet skip) { + // loop through all ingredients, wrapping around the end until all are tried. + for (int i = (index + 1) % ingredients.size(); i != index; i = (i + 1) % ingredients.size()) { + if (skip.get(i)) { + continue; + } + // Recursive call + // Append the current index to the skip list + skip.set(i); + // Increase the count, so the recursion can terminate if needed (ingredients is exhausted) + GTRecipe r = findRecursive(ingredients, branch, predicate, i, count + 1, skip); + if (r != null) { + return r; + } + skip.clear(i); + } + return null; + } + + /** + * Converts a Recipe Capability holder's handlers into a list of {@link AbstractMapIngredient} + * + * @param holder the capability holder to query handlers from + * @return a list of all the AbstractMapIngredients in the handlers + */ + private @Nullable List> fromHolder(@NotNull IRecipeCapabilityHolder holder) { + var handlerMap = holder.getCapabilitiesFlat().getOrDefault(IO.IN, Collections.emptyMap()); + if (handlerMap.isEmpty()) { + return null; + } + + // the initial capacity is a "feel-good" value because it's faster to just grow the list + // than to calculate an accurate value. + List> list = new ObjectArrayList<>(handlerMap.size() * 8); + handlerMap.forEach((cap, handlers) -> { + if (!cap.isRecipeSearchFilter()) { + return; + } + for (var handler : handlers) { + var compressed = cap.compressIngredients(handler.getContents()); + for (var ingredient : compressed) { + list.add(MapIngredientTypeManager.getFrom(ingredient, cap)); + } + } + }); + if (list.isEmpty()) { + return null; + } + return list; + } + + /** + * Determine the correct root nodes for an ingredient. + * + * @param ingredient the ingredient to check + * @param branch the branch containing the nodes + * @return the nodes to search for the ingredient + */ + private static @NotNull Map> nodesForIngredient(@NotNull AbstractMapIngredient ingredient, + @NotNull Branch branch) { + if (ingredient.isSpecialIngredient()) { + return branch.getSpecialNodes(); + } + return branch.getNodes(); + } + + /** + * Add a recipe. + * + * @param recipe the recipe to add + * @param ingredients the ingredients in optimal order, comprising the recipe + * @return if successful + */ + boolean add(@NotNull GTRecipe recipe, @NotNull List<@Unmodifiable List> ingredients) { + // Add combustion fuels to the Powerless Jetpack + if (recipe.getType() == GTRecipeTypes.COMBUSTION_GENERATOR_FUELS) { + Content content = recipe.getInputContents(FluidRecipeCapability.CAP).get(0); + FluidIngredient fluid = FluidRecipeCapability.CAP.of(content.content); + PowerlessJetpack.FUELS.putIfAbsent(fluid, recipe.duration); + } + if (addRecursive(recipe, ingredients, rootBranch, 0)) { + recipe.recipeCategory.addRecipe(recipe); + return true; + } + return false; + } + + /** + * Recursively adds a recipe. + * + * @param recipe the recipe to add + * @param ingredients the ingredients to find the recipe with + * @param branch the branch to add ingredients to + * @param index the index of the ingredient list to check + * @return if successful + */ + private boolean addRecursive(@NotNull GTRecipe recipe, + @NotNull List<@Unmodifiable List> ingredients, + @NotNull Branch branch, int index) { + if (index >= ingredients.size()) { + return true; + } + boolean lastIngredient = index == ingredients.size() - 1; + var current = ingredients.get(index); + for (AbstractMapIngredient ingredient : current) { + var nodes = nodesForIngredient(ingredient, branch); + var either = nodes.compute(ingredient, (k, v) -> { + if (lastIngredient) { + // last ingredient + if (v == null) { + // no existing leaf, add the recipe + return Either.left(recipe); + } + if (v.left().isEmpty() || !v.left().get().equals(recipe)) { + // empty recipe or different recipe exists already, conflict + if (ConfigHolder.INSTANCE.dev.debug || GTCEu.isDev()) { + GTCEu.LOGGER.warn( + "Recipe duplicate or conflict found in GTRecipeType {} and was not added. See next lines for details", + ForgeRegistries.RECIPE_TYPES.getKey(recipe.getType())); + if (v.left().isPresent()) { + GTCEu.LOGGER.warn("Attempted to add GTRecipe: {}, which conflicts with {}", + recipe.getId(), v.left().get().getId()); + } else { + GTCEu.LOGGER.warn("Attempted to add GTRecipe: {}, without exact duplicate/conflict", + recipe.getId()); + } + } + } + // maintain existing recipe, even on conflicts + // if there was no conflict but a recipe was still present, it was added on an earlier recurse, + // and this will carry the result further back in the call stack + return v; + } + // if there is an existing ingredient, use it, otherwise create a new branch for the ingredient + return Objects.requireNonNullElseGet(v, () -> Either.right(new Branch())); + }); + if (either.left().isPresent()) { + if (either.left().get() == recipe) { + // recipe was successfully added, continue to add the other paths + continue; + } + // there was already a recipe here, fail on the conflict + return false; + } + boolean added = either.right() + .filter(b -> addRecursive(recipe, ingredients, b, index + 1)) + .isPresent(); + if (!added) { + if (lastIngredient) { + // remove the recipe + nodes.remove(ingredient); + } else { + var child = nodes.get(ingredient); + if (child != null && child.right().isPresent()) { + var childBranch = child.right().get(); + if (childBranch.isEmptyBranch()) { + // remove the branch if it was the only thing in it + nodes.remove(ingredient); + } + } + } + return false; + } + } + return true; + } + + @RequiredArgsConstructor(access = AccessLevel.PRIVATE) + public static class RecipeIterator implements Iterator { + + private final @NotNull RecipeDB db; + private final @NotNull List> ingredients; + private final @NotNull Predicate predicate; + private int index; + + @Override + public boolean hasNext() { + return index < ingredients.size(); + } + + @Override + public @Nullable GTRecipe next() { + while (index < ingredients.size()) { + BitSet skipSet = new BitSet(ingredients.size()); + skipSet.set(index); + GTRecipe r = db.findRecursive(ingredients, db.rootBranch, predicate, index, 0, skipSet); + index++; + if (r != null) { + return r; + } + } + return null; + } + + /** + * Reset the iterator + */ + public void reset() { + this.index = 0; + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/RecipeIterator.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/RecipeIterator.java deleted file mode 100644 index 55515d85f4d..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/RecipeIterator.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.gregtechceu.gtceu.api.recipe.lookup; - -import com.gregtechceu.gtceu.api.recipe.GTRecipe; -import com.gregtechceu.gtceu.api.recipe.GTRecipeType; -import com.gregtechceu.gtceu.api.recipe.lookup.ingredient.AbstractMapIngredient; - -import org.jetbrains.annotations.NotNull; - -import java.util.BitSet; -import java.util.Iterator; -import java.util.List; -import java.util.function.Predicate; - -public class RecipeIterator implements Iterator { - - int index; - List> ingredients; - @NotNull - GTRecipeType recipeMap; - @NotNull - Predicate canHandle; - - RecipeIterator(@NotNull GTRecipeType recipeMap, List> ingredients, - @NotNull Predicate canHandle) { - this.ingredients = ingredients; - this.recipeMap = recipeMap; - this.canHandle = canHandle; - } - - // does not guarantee a next recipe, just the possibility of one - @Override - public boolean hasNext() { - return ingredients != null && this.index < this.ingredients.size(); - } - - @Override - public GTRecipe next() { - // couldn't build any inputs to use for search, so no recipe could be found - if (ingredients == null) return null; - // Try each ingredient as a starting point, save current index - GTRecipe r = null; - while (index < ingredients.size()) { - BitSet skipSet = new BitSet(); - skipSet.set(index); - r = recipeMap.getLookup().recurseIngredientTreeFindRecipe(ingredients, - recipeMap.getLookup().getLookup(), canHandle, - index, 0, skipSet); - ++index; - if (r != null) break; - } - return r; - } - - public void reset() { - index = 0; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/RecipeManagerHandler.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/RecipeManagerHandler.java index b8e83add7c8..dc0391efadf 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/RecipeManagerHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/RecipeManagerHandler.java @@ -23,7 +23,7 @@ public final class RecipeManagerHandler { /** - * Adds proxy recipes to an {@link GTRecipeType}'s {@link GTRecipeLookup} and adds them to a list. + * Adds proxy recipes to an {@link GTRecipeType}'s {@link RecipeAdditionHandler} and adds them to a list. * * @param recipesByID the recipes stored by their ID * @param gtRecipeType the recipe type to add the recipes to, which owns the proxy recipes @@ -32,7 +32,7 @@ public final class RecipeManagerHandler { public static void addProxyRecipesToLookup(@NotNull Map> recipesByID, @NotNull GTRecipeType gtRecipeType, @NotNull RecipeType proxyType, @NotNull List proxyRecipes) { - var lookup = gtRecipeType.getLookup(); + var lookup = gtRecipeType.getAdditionHandler(); proxyRecipes.clear(); recipesByID.forEach((id, recipe) -> { if (recipe.getType() != proxyType) { @@ -41,26 +41,26 @@ public static void addProxyRecipesToLookup(@NotNull Map> recipesByID, @NotNull GTRecipeType gtRecipeType) { - var lookup = gtRecipeType.getLookup(); + var lookup = gtRecipeType.getAdditionHandler(); for (var r : recipesByID.values()) { if (r.getType() != gtRecipeType) { // do not add recipes of incompatible type continue; } if (r instanceof GTRecipe recipe) { - lookup.addRecipe(recipe); + lookup.addStaging(recipe); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/StagingRecipeDB.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/StagingRecipeDB.java new file mode 100644 index 00000000000..131a26e5b55 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/StagingRecipeDB.java @@ -0,0 +1,135 @@ +package com.gregtechceu.gtceu.api.recipe.lookup; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.content.Content; +import com.gregtechceu.gtceu.api.recipe.lookup.ingredient.AbstractMapIngredient; +import com.gregtechceu.gtceu.api.recipe.lookup.ingredient.MapIngredientTypeManager; + +import it.unimi.dsi.fastutil.Pair; +import it.unimi.dsi.fastutil.objects.*; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + +import java.util.*; + +@ApiStatus.Internal +public final class StagingRecipeDB { + + private final @NotNull ObjectOpenHashSet recipes = new ObjectOpenHashSet<>(); + + /** + * Add a recipe to the DB + * + * @param recipe the recipe + * @return if successful + */ + public boolean add(@NotNull GTRecipe recipe) { + return recipes.add(recipe); + } + + /** + * Clear the DB + */ + public void clear() { + recipes.clear(); + recipes.trim(); + } + + /** + * Populate a DB with the contents of the staging DB + * + * @param db the db to populate + */ + public void populateDB(@NotNull RecipeDB db) { + var frequencies = inputFrequencies(); + for (GTRecipe recipe : recipes) { + List, Object>> flattedContent = flattenedContent(recipe); + flattedContent.sort(Comparator.comparingInt(entry -> frequencies.getInt(entry.right()))); + List> inputs = new ArrayList<>(flattedContent.size()); + for (var entry : flattedContent) { + var ingredients = MapIngredientTypeManager.getFrom(entry.right(), entry.left()); + MapIngredientPool.applyPooling(ingredients); + inputs.add(ingredients); + } + boolean result = db.add(recipe, inputs); + if (!result) { + GTCEu.LOGGER.warn("failed to add recipe from staging into lookup DB: {}", recipe.getId()); + } + } + } + + /** + * @return a map of the amount of times every input is used + */ + private @NotNull Object2IntMap inputFrequencies() { + var map = new Object2IntOpenHashMap<>(); + for (GTRecipe recipe : recipes) { + recipe.inputs.forEach((cap, list) -> { + for (var input : compressedContent(list, cap)) { + map.mergeInt(input, 1, Integer::sum); + } + }); + recipe.tickInputs.forEach((cap, list) -> { + for (var input : compressedContent(list, cap)) { + map.mergeInt(input, 1, Integer::sum); + } + }); + } + return map; + } + + /** + * @param list the list of content + * @param cap the RecipeCapability for the content + * @return the compressed ingredient form of the content + */ + private static @NotNull List compressedContent(@NotNull List list, + @NotNull RecipeCapability cap) { + var contentList = list.stream() + .map(Content::getContent) + .toList(); + return cap.compressIngredients(contentList); + } + + /** + * Returns the flattened content of a recipe + * + * @param recipe the recipe + * @return the flattened content + */ + private static @NotNull List, Object>> flattenedContent(@NotNull GTRecipe recipe) { + var map = new Object2ObjectOpenHashMap, List>(); + recipe.inputs.forEach((cap, list) -> buildInputsByCap(map, cap, list)); + recipe.tickInputs.forEach((cap, list) -> buildInputsByCap(map, cap, list)); + List, Object>> list = new ArrayList<>(); + map.forEach((k, v) -> { + for (var content : v) { + list.add(Pair.of(k, content.getContent())); + } + }); + return list; + } + + /** + * Builds a map of inputs by RecipeCapability + * + * @param map the map to populate + * @param cap the recipe capability for the list + * @param list the list of inputs + */ + private static void buildInputsByCap(@NotNull Map, List> map, + @NotNull RecipeCapability cap, @NotNull List list) { + if (!cap.isRecipeSearchFilter()) { + return; + } + map.compute(cap, (k, v) -> { + if (v == null) { + return new ArrayList<>(list); + } + v.addAll(list); + return v; + }); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/ingredient/AbstractMapIngredient.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/ingredient/AbstractMapIngredient.java index 235b806595c..84e13c95527 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/ingredient/AbstractMapIngredient.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/ingredient/AbstractMapIngredient.java @@ -22,10 +22,6 @@ public final int hashCode() { return hash; } - protected final void invalidate() { - this.hashed = false; - } - @Override public boolean equals(Object obj) { if (this == obj) return true; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/RecipeManagerMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/RecipeManagerMixin.java index 7b87452a7ec..ca3c5615e00 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/RecipeManagerMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/RecipeManagerMixin.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.core.mixins; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; +import com.gregtechceu.gtceu.api.recipe.lookup.MapIngredientPool; import com.gregtechceu.gtceu.api.recipe.lookup.RecipeManagerHandler; import com.gregtechceu.gtceu.common.item.armor.PowerlessJetpack; @@ -39,7 +40,7 @@ public abstract class RecipeManagerMixin { if (!(recipeType instanceof GTRecipeType gtRecipeType)) { continue; } - gtRecipeType.getLookup().removeAllRecipes(); + gtRecipeType.getAdditionHandler().beginStaging(); gtRecipeType.getProxyRecipes().forEach((type, list) -> { var recipesByID = recipes.get(type); if (recipesByID == null) { @@ -52,6 +53,8 @@ public abstract class RecipeManagerMixin { continue; } RecipeManagerHandler.addRecipesToLookup(recipesByID, gtRecipeType); + gtRecipeType.getAdditionHandler().completeStaging(); } + MapIngredientPool.clear(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/GregTechKubeJSPlugin.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/GregTechKubeJSPlugin.java index 8e50ae7d7bb..f3e4248f772 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/GregTechKubeJSPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/GregTechKubeJSPlugin.java @@ -54,6 +54,7 @@ import com.gregtechceu.gtceu.api.recipe.chance.logic.ChanceLogic; import com.gregtechceu.gtceu.api.recipe.ingredient.EnergyStack; import com.gregtechceu.gtceu.api.recipe.ingredient.nbtpredicate.NBTPredicates; +import com.gregtechceu.gtceu.api.recipe.lookup.MapIngredientPool; import com.gregtechceu.gtceu.api.recipe.lookup.RecipeManagerHandler; import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; import com.gregtechceu.gtceu.api.registry.GTRegistries; @@ -527,12 +528,14 @@ public void injectRuntimeRecipes(RecipesEventJS event, RecipeManager manager, if (!(recipeType instanceof GTRecipeType gtRecipeType)) { continue; } - gtRecipeType.getLookup().removeAllRecipes(); + gtRecipeType.getAdditionHandler().beginStaging(); gtRecipeType.getProxyRecipes().forEach((type, list) -> { RecipeManagerHandler.addProxyRecipesToLookup(recipesByName, gtRecipeType, type, list); }); RecipeManagerHandler.addRecipesToLookup(recipesByName, gtRecipeType); + gtRecipeType.getAdditionHandler().completeStaging(); } + MapIngredientPool.clear(); } private static void handleGTRecipe(Map> recipesByName, diff --git a/src/test/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogicTest.java b/src/test/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogicTest.java index 6bcf3299606..140eab4cc95 100644 --- a/src/test/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogicTest.java +++ b/src/test/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogicTest.java @@ -34,25 +34,29 @@ public static void prepare(ServerLevel level) { LCR_RECIPE_TYPE = TestUtils.createRecipeType("recipe_logic_test_lcr", GTRecipeTypes.LARGE_CHEMICAL_RECIPES); CR_RECIPE_TYPE = TestUtils.createRecipeType("recipe_logic_test_cr", GTRecipeTypes.CHEMICAL_RECIPES); - LCR_RECIPE_TYPE.getLookup().addRecipe(LCR_RECIPE_TYPE + LCR_RECIPE_TYPE.getAdditionHandler().beginStaging(); + LCR_RECIPE_TYPE.getAdditionHandler().addStaging(LCR_RECIPE_TYPE .recipeBuilder(GTCEu.id("test_multiblock_recipelogic")) .inputItems(new ItemStack(Blocks.COBBLESTONE)) .outputItems(new ItemStack(Blocks.STONE)) .EUt(GTValues.VA[GTValues.HV]).duration(1) .buildRawRecipe()); - LCR_RECIPE_TYPE.getLookup().addRecipe(LCR_RECIPE_TYPE + LCR_RECIPE_TYPE.getAdditionHandler().addStaging(LCR_RECIPE_TYPE .recipeBuilder(GTCEu.id("test_multiblock_recipelogic_16_items")) .inputItems(new ItemStack(Blocks.STONE, 16)) .outputItems(new ItemStack(Blocks.STONE)) .EUt(GTValues.VA[GTValues.HV]).duration(1) .buildRawRecipe()); + LCR_RECIPE_TYPE.getAdditionHandler().completeStaging(); - CR_RECIPE_TYPE.getLookup().addRecipe(CR_RECIPE_TYPE + CR_RECIPE_TYPE.getAdditionHandler().beginStaging(); + CR_RECIPE_TYPE.getAdditionHandler().addStaging(CR_RECIPE_TYPE .recipeBuilder(GTCEu.id("test_singleblock_recipelogic")) .inputItems(new ItemStack(Blocks.COBBLESTONE)) .outputItems(new ItemStack(Blocks.STONE)) .EUt(GTValues.VA[GTValues.HV]).duration(1) .buildRawRecipe()); + CR_RECIPE_TYPE.getAdditionHandler().completeStaging(); } private record BusHolder(ItemBusPartMachine inputBus1, ItemBusPartMachine inputBus2, ItemBusPartMachine outputBus1, diff --git a/src/test/java/com/gregtechceu/gtceu/api/recipe/InputSeparationTest.java b/src/test/java/com/gregtechceu/gtceu/api/recipe/InputSeparationTest.java index a9e10bb1b75..b9a1ac76edf 100644 --- a/src/test/java/com/gregtechceu/gtceu/api/recipe/InputSeparationTest.java +++ b/src/test/java/com/gregtechceu/gtceu/api/recipe/InputSeparationTest.java @@ -30,13 +30,15 @@ public class InputSeparationTest { public static void prepare(ServerLevel level) { LCR_RECIPE_TYPE = TestUtils.createRecipeType("input_separation_tests", 3, 3, 3, 3); // Force insert the recipe into the manager. - LCR_RECIPE_TYPE.getLookup().addRecipe(LCR_RECIPE_TYPE + LCR_RECIPE_TYPE.getAdditionHandler().beginStaging(); + LCR_RECIPE_TYPE.getAdditionHandler().addStaging(LCR_RECIPE_TYPE .recipeBuilder(GTCEu.id("test_multiblock_input_separation")) .inputItems(new ItemStack(Blocks.COBBLESTONE), new ItemStack(Blocks.ACACIA_WOOD)) .outputItems(new ItemStack(Blocks.STONE)) .EUt(GTValues.VA[GTValues.HV]).duration(1) // NBT has a schematic in it with an HV energy input hatch .buildRawRecipe()); + LCR_RECIPE_TYPE.getAdditionHandler().completeStaging(); } private record BusHolder(ItemBusPartMachine inputBus1, ItemBusPartMachine inputBus2, ItemBusPartMachine outputBus1, diff --git a/src/test/java/com/gregtechceu/gtceu/api/recipe/MultipleEnergyHatchTest.java b/src/test/java/com/gregtechceu/gtceu/api/recipe/MultipleEnergyHatchTest.java index de4f0b46524..665ffb634d1 100644 --- a/src/test/java/com/gregtechceu/gtceu/api/recipe/MultipleEnergyHatchTest.java +++ b/src/test/java/com/gregtechceu/gtceu/api/recipe/MultipleEnergyHatchTest.java @@ -46,7 +46,8 @@ public static void prepare(ServerLevel level) { LCR_RECIPE_TYPE = TestUtils.createRecipeType("multiple_energy_hatch_lcr_tests", GTRecipeTypes.LARGE_CHEMICAL_RECIPES); - LCR_RECIPE_TYPE.getLookup().addRecipe(LCR_RECIPE_TYPE + LCR_RECIPE_TYPE.getAdditionHandler().beginStaging(); + LCR_RECIPE_TYPE.getAdditionHandler().addStaging(LCR_RECIPE_TYPE .recipeBuilder(GTCEu.id("test_multiple_energy_hatch_ev")) .inputItems(new ItemStack(Items.CYAN_BED)) .outputItems(new ItemStack(Items.CYAN_BED)) @@ -54,7 +55,7 @@ public static void prepare(ServerLevel level) { .duration(16) .buildRawRecipe()); - LCR_RECIPE_TYPE.getLookup().addRecipe(LCR_RECIPE_TYPE + LCR_RECIPE_TYPE.getAdditionHandler().addStaging(LCR_RECIPE_TYPE .recipeBuilder(GTCEu.id("test_multiple_energy_hatch_iv")) .inputItems(new ItemStack(Items.BROWN_BED)) .outputItems(new ItemStack(Items.BROWN_BED)) @@ -62,13 +63,14 @@ public static void prepare(ServerLevel level) { .duration(16) .buildRawRecipe()); - LCR_RECIPE_TYPE.getLookup().addRecipe(LCR_RECIPE_TYPE + LCR_RECIPE_TYPE.getAdditionHandler().addStaging(LCR_RECIPE_TYPE .recipeBuilder(GTCEu.id("test_multiple_energy_hatch_iv")) .inputItems(new ItemStack(Items.GREEN_BED)) .outputItems(new ItemStack(Items.GREEN_BED)) .EUt(GTValues.V[GTValues.LuV]) .duration(16) .buildRawRecipe()); + LCR_RECIPE_TYPE.getAdditionHandler().completeStaging(); } private record BusHolder(ItemBusPartMachine inputBus, ItemBusPartMachine outputBus, diff --git a/src/test/java/com/gregtechceu/gtceu/api/recipe/OverclockLogicTest.java b/src/test/java/com/gregtechceu/gtceu/api/recipe/OverclockLogicTest.java index 432b88e9763..5d9322e0e2e 100644 --- a/src/test/java/com/gregtechceu/gtceu/api/recipe/OverclockLogicTest.java +++ b/src/test/java/com/gregtechceu/gtceu/api/recipe/OverclockLogicTest.java @@ -41,7 +41,9 @@ public static void prepare(ServerLevel level) { LCR_RECIPE_TYPE = TestUtils.createRecipeType("overclock_logic_lcr_tests", GTRecipeTypes.LARGE_CHEMICAL_RECIPES); CR_RECIPE_TYPE = TestUtils.createRecipeType("overclock_logic_cr_tests", GTRecipeTypes.CHEMICAL_RECIPES); - LCR_RECIPE_TYPE.getLookup().addRecipe(LCR_RECIPE_TYPE + LCR_RECIPE_TYPE.getAdditionHandler().beginStaging(); + CR_RECIPE_TYPE.getAdditionHandler().beginStaging(); + LCR_RECIPE_TYPE.getAdditionHandler().addStaging(LCR_RECIPE_TYPE .recipeBuilder(GTCEu.id("test_overclock_logic")) .inputItems(new ItemStack(Items.RED_BED)) .outputItems(new ItemStack(Blocks.STONE)) @@ -49,7 +51,7 @@ public static void prepare(ServerLevel level) { .duration(20) // NBT has a schematic in it with an HV energy input hatch .buildRawRecipe()); - LCR_RECIPE_TYPE.getLookup().addRecipe(LCR_RECIPE_TYPE + LCR_RECIPE_TYPE.getAdditionHandler().addStaging(LCR_RECIPE_TYPE .recipeBuilder(GTCEu.id("test_overclock_logic_2")) .inputItems(new ItemStack(Items.STICK)) .outputItems(new ItemStack(Blocks.STONE)) @@ -57,7 +59,7 @@ public static void prepare(ServerLevel level) { .duration(1) // NBT has a schematic in it with an HV energy input hatch .buildRawRecipe()); - LCR_RECIPE_TYPE.getLookup().addRecipe(LCR_RECIPE_TYPE + LCR_RECIPE_TYPE.getAdditionHandler().addStaging(LCR_RECIPE_TYPE .recipeBuilder(GTCEu.id("test_overclock_logic_3")) .inputItems(new ItemStack(Items.BROWN_BED)) .outputItems(new ItemStack(Blocks.STONE)) @@ -65,7 +67,7 @@ public static void prepare(ServerLevel level) { .duration(1) // NBT has a schematic in it with an HV energy input hatch .buildRawRecipe()); - CR_RECIPE_TYPE.getLookup().addRecipe(CR_RECIPE_TYPE + CR_RECIPE_TYPE.getAdditionHandler().addStaging(CR_RECIPE_TYPE .recipeBuilder(GTCEu.id("test_overclock_logic_4")) .inputItems(new ItemStack(Items.RED_BED)) .outputItems(new ItemStack(Blocks.STONE)) @@ -73,7 +75,7 @@ public static void prepare(ServerLevel level) { .duration(16) // NBT has a schematic in it with an HV charged singleblock CR in it .buildRawRecipe()); - CR_RECIPE_TYPE.getLookup().addRecipe(CR_RECIPE_TYPE + CR_RECIPE_TYPE.getAdditionHandler().addStaging(CR_RECIPE_TYPE .recipeBuilder(GTCEu.id("test_overclock_logic_5")) .inputItems(new ItemStack(Items.BROWN_BED)) .outputItems(new ItemStack(Blocks.STONE)) @@ -81,6 +83,8 @@ public static void prepare(ServerLevel level) { .duration(16) // NBT has a schematic in it with an HV charged singleblock CR in it .buildRawRecipe()); + LCR_RECIPE_TYPE.getAdditionHandler().completeStaging(); + CR_RECIPE_TYPE.getAdditionHandler().completeStaging(); } private record BusHolder(ItemBusPartMachine inputBus1, ItemBusPartMachine inputBus2, ItemBusPartMachine outputBus1, diff --git a/src/test/java/com/gregtechceu/gtceu/api/recipe/ingredient/IntProviderFluidIngredientTest.java b/src/test/java/com/gregtechceu/gtceu/api/recipe/ingredient/IntProviderFluidIngredientTest.java index b9ea29bc8ce..36a06165618 100644 --- a/src/test/java/com/gregtechceu/gtceu/api/recipe/ingredient/IntProviderFluidIngredientTest.java +++ b/src/test/java/com/gregtechceu/gtceu/api/recipe/ingredient/IntProviderFluidIngredientTest.java @@ -78,7 +78,14 @@ public static void prepare(ServerLevel level) { CENTRIFUGE_RECIPE_TYPE = TestUtils.createRecipeType("ranged_fluid_ingredient_centrifuge_tests", GTRecipeTypes.CENTRIFUGE_RECIPES); - CR_RECIPE_TYPE.getLookup().addRecipe(CR_RECIPE_TYPE + var CRHandler = CR_RECIPE_TYPE.getAdditionHandler(); + CRHandler.beginStaging(); + var LCRHandler = LCR_RECIPE_TYPE.getAdditionHandler(); + LCRHandler.beginStaging(); + var centHandler = CENTRIFUGE_RECIPE_TYPE.getAdditionHandler(); + centHandler.beginStaging(); + + CRHandler.addStaging(CR_RECIPE_TYPE .recipeBuilder(GTCEu.id("test_ranged_input_fluid_cr")) .inputFluidsRanged(CR_IN, UniformInt.of(0, 9)) .inputItems(COBBLE) @@ -87,7 +94,7 @@ public static void prepare(ServerLevel level) { .duration(2) .buildRawRecipe()); - CR_RECIPE_TYPE.getLookup().addRecipe(CR_RECIPE_TYPE + CRHandler.addStaging(CR_RECIPE_TYPE .recipeBuilder(GTCEu.id("test_ranged_output_fluid_cr")) .inputFluids(CR_OUT) .outputFluidsRanged(REDSTONE, UniformInt.of(0, 9)) @@ -95,7 +102,7 @@ public static void prepare(ServerLevel level) { .duration(2) .buildRawRecipe()); - LCR_RECIPE_TYPE.getLookup().addRecipe(LCR_RECIPE_TYPE + LCRHandler.addStaging(LCR_RECIPE_TYPE .recipeBuilder(GTCEu.id("test_ranged_input_fluid_lcr")) .inputFluidsRanged(LCR_IN, UniformInt.of(0, 9)) .inputFluids(RUBBER) @@ -104,7 +111,7 @@ public static void prepare(ServerLevel level) { .duration(2) .buildRawRecipe()); - LCR_RECIPE_TYPE.getLookup().addRecipe(LCR_RECIPE_TYPE + LCRHandler.addStaging(LCR_RECIPE_TYPE .recipeBuilder(GTCEu.id("test_ranged_output_fluid_lcr")) .inputFluids(LCR_OUT) .outputFluidsRanged(REDSTONE, UniformInt.of(0, 9)) @@ -112,7 +119,7 @@ public static void prepare(ServerLevel level) { .duration(2) .buildRawRecipe()); - CENTRIFUGE_RECIPE_TYPE.getLookup().addRecipe(CENTRIFUGE_RECIPE_TYPE + centHandler.addStaging(CENTRIFUGE_RECIPE_TYPE .recipeBuilder(GTCEu.id("test_ranged_input_fluid_cent")) .inputFluidsRanged(LCENT_IN, UniformInt.of(0, 40)) .inputItems(COBBLE) @@ -121,13 +128,17 @@ public static void prepare(ServerLevel level) { .duration(4) .buildRawRecipe()); - CENTRIFUGE_RECIPE_TYPE.getLookup().addRecipe(CENTRIFUGE_RECIPE_TYPE + centHandler.addStaging(CENTRIFUGE_RECIPE_TYPE .recipeBuilder(GTCEu.id("test_ranged_output_fluid_cent")) .inputFluids(LCENT_OUT) .outputFluidsRanged(REDSTONE, UniformInt.of(0, 40)) .EUt(GTValues.V[GTValues.IV]) .duration(4) .buildRawRecipe()); + + CRHandler.completeStaging(); + LCRHandler.completeStaging(); + centHandler.completeStaging(); } private static MetaMachine getMetaMachine(BlockEntity entity) { diff --git a/src/test/java/com/gregtechceu/gtceu/api/recipe/ingredient/IntProviderIngredientTest.java b/src/test/java/com/gregtechceu/gtceu/api/recipe/ingredient/IntProviderIngredientTest.java index c2264960355..51120392ffb 100644 --- a/src/test/java/com/gregtechceu/gtceu/api/recipe/ingredient/IntProviderIngredientTest.java +++ b/src/test/java/com/gregtechceu/gtceu/api/recipe/ingredient/IntProviderIngredientTest.java @@ -72,7 +72,15 @@ public static void prepare(ServerLevel level) { GTRecipeTypes.LARGE_CHEMICAL_RECIPES); CENTRIFUGE_RECIPE_TYPE = TestUtils.createRecipeType("ranged_ingredient_centrifuge_tests", GTRecipeTypes.CENTRIFUGE_RECIPES); - CR_RECIPE_TYPE.getLookup().addRecipe(CR_RECIPE_TYPE + + var CRHandler = CR_RECIPE_TYPE.getAdditionHandler(); + CRHandler.beginStaging(); + var LCRHandler = LCR_RECIPE_TYPE.getAdditionHandler(); + LCRHandler.beginStaging(); + var centHandler = CENTRIFUGE_RECIPE_TYPE.getAdditionHandler(); + centHandler.beginStaging(); + + CRHandler.addStaging(CR_RECIPE_TYPE .recipeBuilder(GTCEu.id("test_ranged_input_item_cr")) .inputItemsRanged(CR_IN, UniformInt.of(0, 9)) .inputItems(COBBLE) @@ -81,7 +89,7 @@ public static void prepare(ServerLevel level) { .duration(2) .buildRawRecipe()); - CR_RECIPE_TYPE.getLookup().addRecipe(CR_RECIPE_TYPE + CRHandler.addStaging(CR_RECIPE_TYPE .recipeBuilder(GTCEu.id("test_ranged_output_item_cr")) .inputItems(CR_OUT) .outputItemsRanged(STONE, UniformInt.of(0, 9)) @@ -89,7 +97,7 @@ public static void prepare(ServerLevel level) { .duration(2) .buildRawRecipe()); - LCR_RECIPE_TYPE.getLookup().addRecipe(LCR_RECIPE_TYPE + LCRHandler.addStaging(LCR_RECIPE_TYPE .recipeBuilder(GTCEu.id("test_ranged_input_item_lcr")) .inputItemsRanged(LCR_IN, UniformInt.of(0, 9)) .inputItems(COBBLE) @@ -98,7 +106,7 @@ public static void prepare(ServerLevel level) { .duration(2) .buildRawRecipe()); - LCR_RECIPE_TYPE.getLookup().addRecipe(LCR_RECIPE_TYPE + LCRHandler.addStaging(LCR_RECIPE_TYPE .recipeBuilder(GTCEu.id("test_ranged_output_item_lcr")) .inputItems(LCR_OUT) .outputItemsRanged(STONE, UniformInt.of(0, 9)) @@ -106,7 +114,7 @@ public static void prepare(ServerLevel level) { .duration(2) .buildRawRecipe()); - CENTRIFUGE_RECIPE_TYPE.getLookup().addRecipe(CENTRIFUGE_RECIPE_TYPE + centHandler.addStaging(CENTRIFUGE_RECIPE_TYPE .recipeBuilder(GTCEu.id("test_ranged_input_item_cent")) .inputItemsRanged(LCENT_IN, UniformInt.of(0, 4)) .inputItems(COBBLE) @@ -115,13 +123,17 @@ public static void prepare(ServerLevel level) { .duration(4) .buildRawRecipe()); - CENTRIFUGE_RECIPE_TYPE.getLookup().addRecipe(CENTRIFUGE_RECIPE_TYPE + centHandler.addStaging(CENTRIFUGE_RECIPE_TYPE .recipeBuilder(GTCEu.id("test_ranged_output_item_cent")) .inputItems(LCENT_OUT) .outputItemsRanged(STONE, UniformInt.of(0, 4)) .EUt(GTValues.V[GTValues.IV]) .duration(4) .buildRawRecipe()); + + CRHandler.completeStaging(); + LCRHandler.completeStaging(); + centHandler.completeStaging(); } private static MetaMachine getMetaMachine(BlockEntity entity) { diff --git a/src/test/java/com/gregtechceu/gtceu/api/recipe/ingredient/NBTPredicateTest.java b/src/test/java/com/gregtechceu/gtceu/api/recipe/ingredient/NBTPredicateTest.java index 5356f73c001..3946b66fe8c 100644 --- a/src/test/java/com/gregtechceu/gtceu/api/recipe/ingredient/NBTPredicateTest.java +++ b/src/test/java/com/gregtechceu/gtceu/api/recipe/ingredient/NBTPredicateTest.java @@ -35,7 +35,10 @@ public class NBTPredicateTest { @BeforeBatch(batch = "NBTPredicateTest") public static void prepare(ServerLevel level) { CR_RECIPE_TYPE = TestUtils.createRecipeType("nbt_predicate_ingredient_cr_tests", CHEMICAL_RECIPES); - CR_RECIPE_TYPE.getLookup().addRecipe( + var CRHandler = CR_RECIPE_TYPE.getAdditionHandler(); + CRHandler.beginStaging(); + + CRHandler.addStaging( CR_RECIPE_TYPE.recipeBuilder("nbt_predicate_test") .inputItemNbtPredicate(new ItemStack(Items.FEATHER), eq("foo", "bar")) .outputItems(new ItemStack(Items.COAL)) @@ -43,7 +46,7 @@ public static void prepare(ServerLevel level) { .duration(5) .buildRawRecipe()); - CR_RECIPE_TYPE.getLookup().addRecipe( + CRHandler.addStaging( CR_RECIPE_TYPE.recipeBuilder("nbt_predicate_test_chanced") .chance(4000) .inputItemNbtPredicate(new ItemStack(Items.FEATHER), eq("bin", "bar")) @@ -53,7 +56,7 @@ public static void prepare(ServerLevel level) { .duration(4) .buildRawRecipe()); - CR_RECIPE_TYPE.getLookup().addRecipe( + CRHandler.addStaging( CR_RECIPE_TYPE.recipeBuilder("nbt_predicate_test_ranged") .inputItemRanged(new IntProviderIngredient(new NBTPredicateIngredient( new ItemStack(Items.FEATHER), eq("bash", "bar")), UniformInt.of(0, 4))) @@ -62,7 +65,7 @@ public static void prepare(ServerLevel level) { .duration(4) .buildRawRecipe()); - CR_RECIPE_TYPE.getLookup().addRecipe( + CRHandler.addStaging( CR_RECIPE_TYPE.recipeBuilder("nbt_predicate_test_chanced_ranged") .chance(4000) .inputItemRanged(new IntProviderIngredient(new NBTPredicateIngredient( @@ -72,6 +75,7 @@ public static void prepare(ServerLevel level) { .EUt(GTValues.V[GTValues.HV]) .duration(4) .buildRawRecipe()); + CRHandler.completeStaging(); } @GameTest(template = "empty", batch = "NBTPredicateTest") diff --git a/src/test/java/com/gregtechceu/gtceu/api/recipe/lookup/GTRecipeLookupTest.java b/src/test/java/com/gregtechceu/gtceu/api/recipe/lookup/GTRecipeLookupTest.java index 6c471a3d931..0cde5b0ac50 100644 --- a/src/test/java/com/gregtechceu/gtceu/api/recipe/lookup/GTRecipeLookupTest.java +++ b/src/test/java/com/gregtechceu/gtceu/api/recipe/lookup/GTRecipeLookupTest.java @@ -31,48 +31,49 @@ @GameTestHolder(GTCEu.MOD_ID) public class GTRecipeLookupTest { - private static GTRecipeLookup LOOKUP; + private static RecipeDB DB; private static final Predicate ALWAYS_TRUE = gtRecipe -> true; private static final Predicate ALWAYS_FALSE = gtRecipe -> false; - private static GTRecipeType RECIPE_TYPE; private static GTRecipe SMELT_STONE, SMELT_ACACIA_WOOD, SMELT_BIRCH_WOOD, SMELT_CHERRY_WOOD; private static GTRecipe RANGED_INPUT_ITEM, RANGED_INPUT_FLUID, RANGED_INPUT_BOTH; @BeforeBatch(batch = "GTRecipeLookup") public static void prepare(ServerLevel level) { - RECIPE_TYPE = TestUtils.createRecipeType("recipe_lookup"); - LOOKUP = RECIPE_TYPE.getLookup(); + GTRecipeType recipeType = TestUtils.createRecipeType("recipe_lookup"); + RecipeAdditionHandler handler = recipeType.getAdditionHandler(); + DB = recipeType.db(); - SMELT_STONE = RECIPE_TYPE.recipeBuilder("smelt_stone") + SMELT_STONE = recipeType.recipeBuilder("smelt_stone") .inputItems(Items.COBBLESTONE, 1) .outputItems(Items.STONE, 1) .buildRawRecipe(); - SMELT_ACACIA_WOOD = RECIPE_TYPE.recipeBuilder("smelt_acacia_wood") + GTRecipe SMELT_ACACIA_WOOD = recipeType.recipeBuilder("smelt_acacia_wood") .inputItems(Items.ACACIA_WOOD, 1) .outputItems(Items.CHARCOAL, 1) .buildRawRecipe(); - SMELT_BIRCH_WOOD = RECIPE_TYPE.recipeBuilder("smelt_birch_wood") + SMELT_BIRCH_WOOD = recipeType.recipeBuilder("smelt_birch_wood") .inputItems(Items.BIRCH_WOOD, 1) .outputItems(Items.CHARCOAL, 1) .buildRawRecipe(); - SMELT_CHERRY_WOOD = RECIPE_TYPE.recipeBuilder("smelt_cherry_wood") + SMELT_CHERRY_WOOD = recipeType.recipeBuilder("smelt_cherry_wood") .inputItems(Items.CHERRY_WOOD, 16) .outputItems(Items.CHARCOAL, 1) .buildRawRecipe(); - RANGED_INPUT_ITEM = RECIPE_TYPE.recipeBuilder("ranged_input_item") + RANGED_INPUT_ITEM = recipeType.recipeBuilder("ranged_input_item") .inputItemsRanged(Items.RED_WOOL, UniformInt.of(0, 4)) .outputItems(Items.CHARCOAL, 1) .buildRawRecipe(); - RANGED_INPUT_FLUID = RECIPE_TYPE.recipeBuilder("ranged_input_fluid") + RANGED_INPUT_FLUID = recipeType.recipeBuilder("ranged_input_fluid") .inputFluidsRanged(GTMaterials.Helium.getFluid(1), UniformInt.of(0, 4)) .outputItems(Items.CHARCOAL, 1) .buildRawRecipe(); - RANGED_INPUT_BOTH = RECIPE_TYPE.recipeBuilder("ranged_input_both") + RANGED_INPUT_BOTH = recipeType.recipeBuilder("ranged_input_both") .inputItemsRanged(Items.BLUE_WOOL, UniformInt.of(0, 4)) .inputFluidsRanged(GTMaterials.Iron.getFluid(1), UniformInt.of(0, 4)) .outputItems(Items.CHARCOAL, 1) .buildRawRecipe(); + handler.beginStaging(); for (GTRecipe recipe : List.of(SMELT_STONE, SMELT_ACACIA_WOOD, SMELT_BIRCH_WOOD, @@ -80,8 +81,9 @@ public static void prepare(ServerLevel level) { RANGED_INPUT_ITEM, RANGED_INPUT_FLUID, RANGED_INPUT_BOTH)) { - LOOKUP.addRecipe(recipe); + handler.addStaging(recipe); } + handler.completeStaging(); } private static List> createIngredients(ItemStack... stacks) { @@ -106,7 +108,7 @@ private static List> createIngredients(List recipe.inputs .getOrDefault(ItemRecipeCapability.CAP, List.of()) .stream() @@ -177,7 +178,7 @@ public static void recipeLookupCustomCountCanHandleTest(GameTestHelper helper) { // Do a recipe check with a condition that requires at least 32 ingredients in the inputs // The recipe has 8, so this should fail - resultRecipe = LOOKUP.recurseIngredientTreeFindRecipe(ingredients, LOOKUP.getLookup(), recipe -> recipe.inputs + resultRecipe = DB.find(ingredients, recipe -> recipe.inputs .getOrDefault(ItemRecipeCapability.CAP, List.of()) .stream() .allMatch(content -> ((SizedIngredient) content.getContent()).getAmount() > 32)); @@ -192,8 +193,7 @@ public static void recipeLookupCustomCountCanHandleTest(GameTestHelper helper) { public static void recipeLookupSimpleRangedItemSuccessTest(GameTestHelper helper) { var ingredients = createIngredients(new ItemStack(Items.RED_WOOL, 4)); for (int i = 0; i < 100; i++) { - GTRecipe resultRecipe = LOOKUP.recurseIngredientTreeFindRecipe(ingredients, LOOKUP.getLookup(), - ALWAYS_TRUE); + GTRecipe resultRecipe = DB.find(ingredients, ALWAYS_TRUE); helper.assertTrue(RANGED_INPUT_ITEM.equals(resultRecipe), "GT Recipe should be ranged_input_item, instead was " + resultRecipe + ". Failed on check " + i); } @@ -206,8 +206,7 @@ public static void recipeLookupSimpleRangedItemSuccessTest(GameTestHelper helper public static void recipeLookupSimpleRangedFluidSuccessTest(GameTestHelper helper) { var ingredients = createIngredients(GTMaterials.Helium.getFluid(4)); for (int i = 0; i < 100; i++) { - GTRecipe resultRecipe = LOOKUP.recurseIngredientTreeFindRecipe(ingredients, LOOKUP.getLookup(), - ALWAYS_TRUE); + GTRecipe resultRecipe = DB.find(ingredients, ALWAYS_TRUE); helper.assertTrue(RANGED_INPUT_FLUID.equals(resultRecipe), "GT Recipe should be ranged_input_fluid, instead was " + resultRecipe + ". Failed on check " + i); } @@ -222,8 +221,7 @@ public static void recipeLookupSimpleRangedItemFluidSuccessTest(GameTestHelper h createIngredients(new ItemStack(Items.BLUE_WOOL, 4)), createIngredients(GTMaterials.Iron.getFluid(4))); for (int i = 0; i < 100; i++) { - GTRecipe resultRecipe = LOOKUP.recurseIngredientTreeFindRecipe(ingredients, LOOKUP.getLookup(), - ALWAYS_TRUE); + GTRecipe resultRecipe = DB.find(ingredients, ALWAYS_TRUE); helper.assertTrue(RANGED_INPUT_BOTH.equals(resultRecipe), "GT Recipe should be raged_input_both, instead was " + resultRecipe + ". Failed on check " + i); } diff --git a/src/test/java/com/gregtechceu/gtceu/api/recipe/lookup/ingredient/item/NBTItemStackMapIngredientLookupTest.java b/src/test/java/com/gregtechceu/gtceu/api/recipe/lookup/ingredient/item/NBTItemStackMapIngredientLookupTest.java index fbcf29d8d45..7230e45b58b 100644 --- a/src/test/java/com/gregtechceu/gtceu/api/recipe/lookup/ingredient/item/NBTItemStackMapIngredientLookupTest.java +++ b/src/test/java/com/gregtechceu/gtceu/api/recipe/lookup/ingredient/item/NBTItemStackMapIngredientLookupTest.java @@ -3,7 +3,8 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; -import com.gregtechceu.gtceu.api.recipe.lookup.GTRecipeLookup; +import com.gregtechceu.gtceu.api.recipe.lookup.RecipeAdditionHandler; +import com.gregtechceu.gtceu.api.recipe.lookup.RecipeDB; import com.gregtechceu.gtceu.gametest.util.TestUtils; import net.minecraft.gametest.framework.BeforeBatch; @@ -27,18 +28,18 @@ @GameTestHolder(GTCEu.MOD_ID) public class NBTItemStackMapIngredientLookupTest { - private static GTRecipeLookup LOOKUP; + private static RecipeDB DB; private static final Predicate ALWAYS_TRUE = gtRecipe -> true; private static final Predicate ALWAYS_FALSE = gtRecipe -> false; - private static GTRecipeType RECIPE_TYPE; private static GTRecipe PARTIAL_TAG_1, PARTIAL_TAG_2, STRICT_TAG_1, STRICT_TAG_2; private static CompoundTag tag1, tag2; @BeforeBatch(batch = "NBTItemStackMapIngredientLookup") public static void prepare(ServerLevel level) { - RECIPE_TYPE = TestUtils.createRecipeType("NBT_item_stack_map_ingredient_lookup"); - LOOKUP = RECIPE_TYPE.getLookup(); + GTRecipeType recipeType = TestUtils.createRecipeType("NBT_item_stack_map_ingredient_lookup"); + RecipeAdditionHandler handler = recipeType.getAdditionHandler(); + DB = recipeType.db(); tag1 = new CompoundTag(); tag1.putString("tag1", "tag1"); @@ -64,32 +65,34 @@ public static void prepare(ServerLevel level) { AbstractIngredient STRICT_TAG_1_INGREDIENT = createStrictTaggedIngredient(Items.GREEN_BED, tag1); AbstractIngredient STRICT_TAG_2_INGREDIENT = createStrictTaggedIngredient(Items.BLUE_BED, tag2); - PARTIAL_TAG_1 = RECIPE_TYPE.recipeBuilder("partial_match_NBT_1") + PARTIAL_TAG_1 = recipeType.recipeBuilder("partial_match_NBT_1") .inputItems(PARTIAL_TAG_1_INGREDIENT) .outputItems(Items.RED_BED, 1) .buildRawRecipe(); - PARTIAL_TAG_2 = RECIPE_TYPE.recipeBuilder("partial_match_NBT_2") + PARTIAL_TAG_2 = recipeType.recipeBuilder("partial_match_NBT_2") .inputItems(PARTIAL_TAG_2_INGREDIENT) .outputItems(Items.BROWN_BED, 1) .buildRawRecipe(); - STRICT_TAG_1 = RECIPE_TYPE.recipeBuilder("strict_match_NBT_1") + STRICT_TAG_1 = recipeType.recipeBuilder("strict_match_NBT_1") .inputItems(STRICT_TAG_1_INGREDIENT) .outputItems(Items.GREEN_BED, 1) .buildRawRecipe(); - STRICT_TAG_2 = RECIPE_TYPE.recipeBuilder("strict_match_NBT_2") + STRICT_TAG_2 = recipeType.recipeBuilder("strict_match_NBT_2") .inputItems(STRICT_TAG_2_INGREDIENT) .outputItems(Items.BLUE_BED, 1) .buildRawRecipe(); + handler.beginStaging(); for (GTRecipe recipe : List.of(PARTIAL_TAG_1, PARTIAL_TAG_2, STRICT_TAG_1, STRICT_TAG_2)) { - LOOKUP.addRecipe(recipe); + handler.addStaging(recipe); } + handler.completeStaging(); } private static StrictNBTIngredient createStrictTaggedIngredient(Item item, CompoundTag tag) { @@ -103,32 +106,28 @@ private static StrictNBTIngredient createStrictTaggedIngredient(Item item, Compo @GameTest(template = "empty", batch = "NBTItemStackMapIngredientLookup") public static void NBTItemStackMapIngredientMatchingPartialTag1Test(GameTestHelper helper) { // Partial tag 1 fits in Partial tag 1 - GTRecipe resultRecipe = LOOKUP.recurseIngredientTreeFindRecipe( - List.of( - PartialNBTItemStackMapIngredient.from(PartialNBTIngredient.of(Items.RED_BED, tag1))), - LOOKUP.getLookup(), ALWAYS_TRUE); + GTRecipe resultRecipe = DB.find( + List.of(PartialNBTItemStackMapIngredient.from(PartialNBTIngredient.of(Items.RED_BED, tag1))), + ALWAYS_TRUE); helper.assertTrue(resultRecipe == PARTIAL_TAG_1, "GT Recipe should be PARTIAL_TAG_1, instead was " + resultRecipe); // Partial tag 2 fits in Partial tag 1 - resultRecipe = LOOKUP.recurseIngredientTreeFindRecipe( - List.of( - PartialNBTItemStackMapIngredient.from(PartialNBTIngredient.of(Items.RED_BED, tag2))), - LOOKUP.getLookup(), ALWAYS_TRUE); + resultRecipe = DB.find( + List.of(PartialNBTItemStackMapIngredient.from(PartialNBTIngredient.of(Items.RED_BED, tag2))), + ALWAYS_TRUE); helper.assertTrue(resultRecipe == PARTIAL_TAG_1, "GT Recipe should be PARTIAL_TAG_1, instead was " + resultRecipe); // Strict tag 1 and 2 should never fit in partial tag 1 - resultRecipe = LOOKUP.recurseIngredientTreeFindRecipe( - List.of( - StrictNBTItemStackMapIngredient.from(createStrictTaggedIngredient(Items.RED_BED, tag1))), - LOOKUP.getLookup(), ALWAYS_TRUE); + resultRecipe = DB.find( + List.of(StrictNBTItemStackMapIngredient.from(createStrictTaggedIngredient(Items.RED_BED, tag1))), + ALWAYS_TRUE); helper.assertTrue(resultRecipe == null, "GT Recipe should be null, instead was " + resultRecipe); - resultRecipe = LOOKUP.recurseIngredientTreeFindRecipe( - List.of( - StrictNBTItemStackMapIngredient.from(createStrictTaggedIngredient(Items.RED_BED, tag2))), - LOOKUP.getLookup(), ALWAYS_TRUE); + resultRecipe = DB.find( + List.of(StrictNBTItemStackMapIngredient.from(createStrictTaggedIngredient(Items.RED_BED, tag2))), + ALWAYS_TRUE); helper.assertTrue(resultRecipe == null, "GT Recipe should be null, instead was " + resultRecipe); helper.succeed(); } @@ -136,31 +135,27 @@ public static void NBTItemStackMapIngredientMatchingPartialTag1Test(GameTestHelp @GameTest(template = "empty", batch = "NBTItemStackMapIngredientLookup") public static void NBTItemStackMapIngredientMatchingPartialTag2Test(GameTestHelper helper) { // Partial tag 1 should not fit in partial tag 2 - GTRecipe resultRecipe = LOOKUP.recurseIngredientTreeFindRecipe( - List.of( - PartialNBTItemStackMapIngredient.from(PartialNBTIngredient.of(Items.BROWN_BED, tag1))), - LOOKUP.getLookup(), ALWAYS_TRUE); + GTRecipe resultRecipe = DB.find( + List.of(PartialNBTItemStackMapIngredient.from(PartialNBTIngredient.of(Items.BROWN_BED, tag1))), + ALWAYS_TRUE); helper.assertTrue(resultRecipe == null, "GT Recipe should be null, instead was " + resultRecipe); // Partial tag 2 fits in Partial tag 2 - resultRecipe = LOOKUP.recurseIngredientTreeFindRecipe( - List.of( - PartialNBTItemStackMapIngredient.from(PartialNBTIngredient.of(Items.BROWN_BED, tag2))), - LOOKUP.getLookup(), ALWAYS_TRUE); + resultRecipe = DB.find( + List.of(PartialNBTItemStackMapIngredient.from(PartialNBTIngredient.of(Items.BROWN_BED, tag2))), + ALWAYS_TRUE); helper.assertTrue(resultRecipe == PARTIAL_TAG_2, "GT Recipe should be PARTIAL_TAG_2, instead was " + resultRecipe); // Strict tag 1 and 2 should never fit in partial tag 2 - resultRecipe = LOOKUP.recurseIngredientTreeFindRecipe( - List.of( - StrictNBTItemStackMapIngredient.from(createStrictTaggedIngredient(Items.BROWN_BED, tag1))), - LOOKUP.getLookup(), ALWAYS_TRUE); + resultRecipe = DB.find( + List.of(StrictNBTItemStackMapIngredient.from(createStrictTaggedIngredient(Items.BROWN_BED, tag1))), + ALWAYS_TRUE); helper.assertTrue(resultRecipe == null, "GT Recipe should be null, instead was " + resultRecipe); - resultRecipe = LOOKUP.recurseIngredientTreeFindRecipe( - List.of( - StrictNBTItemStackMapIngredient.from(createStrictTaggedIngredient(Items.BROWN_BED, tag2))), - LOOKUP.getLookup(), ALWAYS_TRUE); + resultRecipe = DB.find( + List.of(StrictNBTItemStackMapIngredient.from(createStrictTaggedIngredient(Items.BROWN_BED, tag2))), + ALWAYS_TRUE); helper.assertTrue(resultRecipe == null, "GT Recipe should be null, instead was " + resultRecipe); helper.succeed(); } @@ -168,31 +163,27 @@ public static void NBTItemStackMapIngredientMatchingPartialTag2Test(GameTestHelp @GameTest(template = "empty", batch = "NBTItemStackMapIngredientLookup") public static void NBTItemStackMapIngredientMatchingStrictTag1Test(GameTestHelper helper) { // Partial tag 1 and 2 should not fit in strict tag 1 - GTRecipe resultRecipe = LOOKUP.recurseIngredientTreeFindRecipe( - List.of( - PartialNBTItemStackMapIngredient.from(PartialNBTIngredient.of(Items.GREEN_BED, tag1))), - LOOKUP.getLookup(), ALWAYS_TRUE); + GTRecipe resultRecipe = DB.find( + List.of(PartialNBTItemStackMapIngredient.from(PartialNBTIngredient.of(Items.GREEN_BED, tag1))), + ALWAYS_TRUE); helper.assertTrue(resultRecipe == null, "GT Recipe should be null, instead was " + resultRecipe); - resultRecipe = LOOKUP.recurseIngredientTreeFindRecipe( - List.of( - PartialNBTItemStackMapIngredient.from(PartialNBTIngredient.of(Items.GREEN_BED, tag2))), - LOOKUP.getLookup(), ALWAYS_TRUE); + resultRecipe = DB.find( + List.of(PartialNBTItemStackMapIngredient.from(PartialNBTIngredient.of(Items.GREEN_BED, tag2))), + ALWAYS_TRUE); helper.assertTrue(resultRecipe == null, "GT Recipe should be null, instead was " + resultRecipe); // Strict tag 1 should fit in strict tag 1 - resultRecipe = LOOKUP.recurseIngredientTreeFindRecipe( - List.of( - StrictNBTItemStackMapIngredient.from(createStrictTaggedIngredient(Items.GREEN_BED, tag1))), - LOOKUP.getLookup(), ALWAYS_TRUE); + resultRecipe = DB.find( + List.of(StrictNBTItemStackMapIngredient.from(createStrictTaggedIngredient(Items.GREEN_BED, tag1))), + ALWAYS_TRUE); helper.assertTrue(resultRecipe == STRICT_TAG_1, "GT Recipe should be STRICT_TAG_1, instead was " + resultRecipe); // Strict tag 2 should not fit in strict tag 1 - resultRecipe = LOOKUP.recurseIngredientTreeFindRecipe( - List.of( - StrictNBTItemStackMapIngredient.from(createStrictTaggedIngredient(Items.GREEN_BED, tag2))), - LOOKUP.getLookup(), ALWAYS_TRUE); + resultRecipe = DB.find( + List.of(StrictNBTItemStackMapIngredient.from(createStrictTaggedIngredient(Items.GREEN_BED, tag2))), + ALWAYS_TRUE); helper.assertTrue(resultRecipe == null, "GT Recipe should be null, instead was " + resultRecipe); helper.succeed(); } @@ -200,30 +191,26 @@ public static void NBTItemStackMapIngredientMatchingStrictTag1Test(GameTestHelpe @GameTest(template = "empty", batch = "NBTItemStackMapIngredientLookup") public static void NBTItemStackMapIngredientMatchingStrictTag2Test(GameTestHelper helper) { // Partial tag 1 and 2 should not fit in strict tag 2 - GTRecipe resultRecipe = LOOKUP.recurseIngredientTreeFindRecipe( - List.of( - PartialNBTItemStackMapIngredient.from(PartialNBTIngredient.of(Items.BLUE_BED, tag1))), - LOOKUP.getLookup(), ALWAYS_TRUE); + GTRecipe resultRecipe = DB.find( + List.of(PartialNBTItemStackMapIngredient.from(PartialNBTIngredient.of(Items.BLUE_BED, tag1))), + ALWAYS_TRUE); helper.assertTrue(resultRecipe == null, "GT Recipe should be null, instead was " + resultRecipe); - resultRecipe = LOOKUP.recurseIngredientTreeFindRecipe( - List.of( - PartialNBTItemStackMapIngredient.from(PartialNBTIngredient.of(Items.BLUE_BED, tag2))), - LOOKUP.getLookup(), ALWAYS_TRUE); + resultRecipe = DB.find( + List.of(PartialNBTItemStackMapIngredient.from(PartialNBTIngredient.of(Items.BLUE_BED, tag2))), + ALWAYS_TRUE); helper.assertTrue(resultRecipe == null, "GT Recipe should be null, instead was " + resultRecipe); // Strict tag 1 should not fit in strict tag 2 - resultRecipe = LOOKUP.recurseIngredientTreeFindRecipe( - List.of( - StrictNBTItemStackMapIngredient.from(createStrictTaggedIngredient(Items.BLUE_BED, tag1))), - LOOKUP.getLookup(), ALWAYS_TRUE); + resultRecipe = DB.find( + List.of(StrictNBTItemStackMapIngredient.from(createStrictTaggedIngredient(Items.BLUE_BED, tag1))), + ALWAYS_TRUE); helper.assertTrue(resultRecipe == null, "GT Recipe should be null, instead was " + resultRecipe); // Strict tag 2 should fit in strict tag 2 - resultRecipe = LOOKUP.recurseIngredientTreeFindRecipe( - List.of( - StrictNBTItemStackMapIngredient.from(createStrictTaggedIngredient(Items.BLUE_BED, tag2))), - LOOKUP.getLookup(), ALWAYS_TRUE); + resultRecipe = DB.find( + List.of(StrictNBTItemStackMapIngredient.from(createStrictTaggedIngredient(Items.BLUE_BED, tag2))), + ALWAYS_TRUE); helper.assertTrue(resultRecipe == STRICT_TAG_2, "GT Recipe should be STRICT_TAG_2, instead was " + resultRecipe); helper.succeed(); diff --git a/src/test/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/AssemblyLineTests.java b/src/test/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/AssemblyLineTests.java index 11a0b54e1e9..e8df6da7862 100644 --- a/src/test/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/AssemblyLineTests.java +++ b/src/test/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/AssemblyLineTests.java @@ -33,7 +33,10 @@ public class AssemblyLineTests { @BeforeBatch(batch = "Assline") public static void prepare(ServerLevel level) { ASSLINE_RECIPE_TYPE = TestUtils.createRecipeType("assline_tests", ASSEMBLY_LINE_RECIPES); - ASSLINE_RECIPE_TYPE.getLookup().addRecipe(ASSLINE_RECIPE_TYPE + var assLineHandler = ASSLINE_RECIPE_TYPE.getAdditionHandler(); + assLineHandler.beginStaging(); + + assLineHandler.addStaging(ASSLINE_RECIPE_TYPE .recipeBuilder(GTCEu.id("test_assline")) .inputItems(new ItemStack(Blocks.COBBLESTONE), new ItemStack(Blocks.ACACIA_WOOD)) .inputFluids(new FluidStack(Fluids.WATER, 1), new FluidStack(Fluids.LAVA, 1)) @@ -41,6 +44,7 @@ public static void prepare(ServerLevel level) { .EUt(GTValues.VA[GTValues.HV]).duration(1) // NBT has a schematic in it with an EV energy input hatch .buildRawRecipe()); + assLineHandler.completeStaging(); } private record BusHolder(ItemBusPartMachine inputBus1, ItemBusPartMachine inputBus2, diff --git a/src/test/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentFluidConditionTest.java b/src/test/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentFluidConditionTest.java index f72991eaae5..3a1adb5ac59 100644 --- a/src/test/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentFluidConditionTest.java +++ b/src/test/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentFluidConditionTest.java @@ -34,7 +34,8 @@ public class AdjacentFluidConditionTest { public static void prepare(ServerLevel level) { ROCK_BREAKER_RECIPE_TYPE = TestUtils.createRecipeType("adjacent_fluid_conditions_tests", GTRecipeTypes.ROCK_BREAKER_RECIPES); - ROCK_BREAKER_RECIPE_TYPE.getLookup().addRecipe(ROCK_BREAKER_RECIPE_TYPE + ROCK_BREAKER_RECIPE_TYPE.getAdditionHandler().beginStaging(); + ROCK_BREAKER_RECIPE_TYPE.getAdditionHandler().addStaging(ROCK_BREAKER_RECIPE_TYPE .recipeBuilder(GTCEu.id("test_adjacent_fluid_conditions")) .inputItems(new ItemStack(Blocks.COBBLESTONE)) .outputItems(new ItemStack(Blocks.STONE)) @@ -43,7 +44,7 @@ public static void prepare(ServerLevel level) { .duration(8) .buildRawRecipe()); - ROCK_BREAKER_RECIPE_TYPE.getLookup().addRecipe(ROCK_BREAKER_RECIPE_TYPE + ROCK_BREAKER_RECIPE_TYPE.getAdditionHandler().addStaging(ROCK_BREAKER_RECIPE_TYPE .recipeBuilder(GTCEu.id("test_adjacent_fluid_conditions_multiple_fluids")) .inputItems(new ItemStack(Blocks.OAK_WOOD)) .outputItems(new ItemStack(Items.CHARCOAL)) @@ -51,6 +52,7 @@ public static void prepare(ServerLevel level) { .EUt(GTValues.VA[GTValues.HV]) .duration(8) .buildRawRecipe()); + ROCK_BREAKER_RECIPE_TYPE.getAdditionHandler().completeStaging(); } // Test for checking if the rock breaker works when the condition is fulfilled diff --git a/src/test/java/com/gregtechceu/gtceu/gametest/util/TestUtils.java b/src/test/java/com/gregtechceu/gtceu/gametest/util/TestUtils.java index 58273e6a5ff..6cfee1c6fc8 100644 --- a/src/test/java/com/gregtechceu/gtceu/gametest/util/TestUtils.java +++ b/src/test/java/com/gregtechceu/gtceu/gametest/util/TestUtils.java @@ -163,7 +163,8 @@ public static void formMultiblock(MultiblockControllerMachine controller) { */ public static GTRecipeType createRecipeTypeAndInsertRecipe(String name, GTRecipeType original) { GTRecipeType type = createRecipeType(name, original); - type.getLookup().addRecipe(type + type.getAdditionHandler().beginStaging(); + type.getAdditionHandler().addStaging(type .recipeBuilder(GTCEu.id("test_recipe")) .inputItems(new ItemStack(Items.COBBLESTONE)) .outputItems(new ItemStack(Blocks.STONE)) diff --git a/src/test/java/com/gregtechceu/gtceu/integration/ae2/machine/PatternBufferTest.java b/src/test/java/com/gregtechceu/gtceu/integration/ae2/machine/PatternBufferTest.java index d1e7ca4a4f5..ce1ed6b1248 100644 --- a/src/test/java/com/gregtechceu/gtceu/integration/ae2/machine/PatternBufferTest.java +++ b/src/test/java/com/gregtechceu/gtceu/integration/ae2/machine/PatternBufferTest.java @@ -47,13 +47,14 @@ public static void prepare(ServerLevel level) { LCR_RECIPE_TYPE = TestUtils.createRecipeTypeAndInsertRecipe("pattern_buffer_tests", GTRecipeTypes.LARGE_CHEMICAL_RECIPES); - LCR_RECIPE_TYPE.getLookup().addRecipe(LCR_RECIPE_TYPE + LCR_RECIPE_TYPE.getAdditionHandler().addStaging(LCR_RECIPE_TYPE .recipeBuilder(GTCEu.id("test_recipe_pattern_buffer")) .id(GTCEu.id("test_recipe_pattern_buffer")) .inputItems(new ItemStack(Items.RED_BED)) .outputItems(new ItemStack(Blocks.BROWN_BED)) .EUt(GTValues.V[GTValues.EV]) .duration(1).buildRawRecipe()); + LCR_RECIPE_TYPE.getAdditionHandler().completeStaging(); } private record BusHolder(ItemBusPartMachine inputBus1, ItemBusPartMachine inputBus2, ItemBusPartMachine outputBus1, From 241534f7ef566a8562501b5b979ae7c22d1e5a41 Mon Sep 17 00:00:00 2001 From: zetrock1 <144679746+zetrock1@users.noreply.github.com> Date: Fri, 9 Jan 2026 06:54:44 +0000 Subject: [PATCH 04/28] Fix overwriting FOV when on concrete (#4446) --- .../forge/ForgeClientEventListener.java | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java b/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java index f0646525cc2..3d05e87f718 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java @@ -15,12 +15,14 @@ import com.gregtechceu.gtceu.common.commands.GTClientCommands; import com.gregtechceu.gtceu.core.mixins.client.AbstractClientPlayerAccessor; import com.gregtechceu.gtceu.core.mixins.client.PlayerInfoAccessor; +import com.gregtechceu.gtceu.data.recipe.CustomTags; import com.gregtechceu.gtceu.integration.map.ClientCacheManager; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.ai.attributes.AttributeInstance; import net.minecraft.world.entity.ai.attributes.AttributeModifier; @@ -92,21 +94,14 @@ public static void updateFOV(ComputeFovModifierEvent event) { AttributeInstance moveSpeed = player.getAttribute(Attributes.MOVEMENT_SPEED); if (moveSpeed == null || moveSpeed.getModifier(BlockAttributes.BLOCK_SPEED_BOOST) == null) return; - boolean flying = player.getAbilities().flying; - float originalFov = flying ? 1.1F : 1.0F; - float walkSpeed = player.getAbilities().getWalkingSpeed(); - originalFov *= ((float) moveSpeed.getBaseValue() / walkSpeed + 1.0F) / 2.0F; - if (walkSpeed == 0.0F || Float.isNaN(originalFov) || - Float.isInfinite(originalFov)) { - return; - } + float multi = 1; + var state = player.level().getBlockState(player.getOnPos()); - float newFov = flying ? 1.1F : 1.0F; - newFov *= ((float) getValueWithoutWalkingBoost(moveSpeed) / walkSpeed + 1.0F) / - 2.0F; + if (state.is(CustomTags.VERY_FAST_WALKABLE_BLOCKS)) multi /= 1.2F; - event.setNewFovModifier(newFov / originalFov); + multi = (float) Mth.lerp(Minecraft.getInstance().options.fovEffectScale().get(), 1.0F, multi); + event.setNewFovModifier(event.getNewFovModifier() * multi); } private static double getValueWithoutWalkingBoost(AttributeInstance attrib) { From 22990cb2a8b2f98a2b71fb5da4dd7140e6bcd2dc Mon Sep 17 00:00:00 2001 From: Tar Laboratories <159147059+TarLaboratories@users.noreply.github.com> Date: Fri, 9 Jan 2026 19:55:36 +0800 Subject: [PATCH 05/28] Add option to display temperatures in Celsius (#3839) --- src/generated/resources/assets/gtceu/lang/en_ud.json | 7 ++++--- src/generated/resources/assets/gtceu/lang/en_us.json | 7 ++++--- .../gtceu/api/capability/IPropertyFluidFilter.java | 2 +- .../gtceu/api/item/component/ThermalFluidStats.java | 2 +- .../com/gregtechceu/gtceu/client/TooltipsHandler.java | 4 +++- .../gregtechceu/gtceu/common/block/FluidPipeBlock.java | 4 +++- .../gregtechceu/gtceu/common/data/GCYMRecipeTypes.java | 2 +- .../com/gregtechceu/gtceu/common/data/GTRecipeTypes.java | 3 ++- .../gtceu/common/data/machines/GTMachineUtils.java | 2 +- .../java/com/gregtechceu/gtceu/config/ConfigHolder.java | 3 +++ .../java/com/gregtechceu/gtceu/data/lang/LangHandler.java | 6 +++--- .../java/com/gregtechceu/gtceu/utils/FormattingUtil.java | 8 ++++++++ src/main/resources/assets/gtceu/lang/ja_jp.json | 6 +++--- src/main/resources/assets/gtceu/lang/ru_ru.json | 6 +++--- src/main/resources/assets/gtceu/lang/zh_cn.json | 6 +++--- src/main/resources/assets/gtceu/lang/zh_tw.json | 6 +++--- 16 files changed, 46 insertions(+), 28 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 6b3d465b059..367176eab91 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -1879,6 +1879,7 @@ "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.temperaturesInKelvin": "uıʌןǝʞ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ʇ", @@ -2314,7 +2315,7 @@ "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": "%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ןℲ", @@ -2323,7 +2324,7 @@ "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.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ןℲ", @@ -3725,7 +3726,7 @@ "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.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⟘", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index a35429f8983..42c76727ea0 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -1879,6 +1879,7 @@ "config.gtceu.option.steelSteamMultiblocks": "steelSteamMultiblocks", "config.gtceu.option.surfaceRockProspectRange": "surfaceRockProspectRange", "config.gtceu.option.tankItemFluidPreview": "tankItemFluidPreview", + "config.gtceu.option.temperaturesInKelvin": "temperaturesInKelvin", "config.gtceu.option.titaniumBoilerHeatSpeed": "titaniumBoilerHeatSpeed", "config.gtceu.option.titaniumBoilerMaxTemperature": "titaniumBoilerMaxTemperature", "config.gtceu.option.toggle": "toggle", @@ -2314,7 +2315,7 @@ "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": "§cTemperature: %s", "gtceu.fluid.temperature.cryogenic": "§bCryogenic! Handle with care!", "gtceu.fluid.type_acid.tooltip": "§6Acidic! Handle with care!", "gtceu.fluid_heater": "Fluid Heater", @@ -2323,7 +2324,7 @@ "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.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", @@ -3725,7 +3726,7 @@ "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.temperature": "Temp: %s", "gtceu.recipe.total": "Total: %s EU", "gtceu.recipe.total_computation": "Computation: %s CWU", "gtceu.recipe.total_eu": "Total Usage: %s EU/t", 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..c04a88e29ca 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/IPropertyFluidFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/IPropertyFluidFilter.java @@ -87,7 +87,7 @@ default void appendTooltips(@NotNull List tooltip, boolean showToolsI if (GTUtil.isShiftDown()) { if (showTemperatureInfo) tooltip.add(Component.translatable("gtceu.fluid_pipe.max_temperature", - FormattingUtil.formatNumbers(getMaxFluidTemperature()))); + FormattingUtil.formatTemperature(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")); 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..80acd0401c4 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 @@ -86,7 +86,7 @@ public void appendHoverText(ItemStack stack, @Nullable Level level, List 1) { tooltip.add(Component.translatable("gtceu.fluid_pipe.channels", properties.getChannels())); 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 7bb52773371..34a3c1c3257 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GCYMRecipeTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GCYMRecipeTypes.java @@ -38,7 +38,7 @@ 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 LocalizationUtils.format("gtceu.recipe.temperature", FormattingUtil.formatTemperature(temp)); }) .addDataInfo(data -> { int temp = data.getInt("ebf_temp"); 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 ceaffc3632b..ff9a74be382 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java @@ -24,6 +24,7 @@ import com.gregtechceu.gtceu.integration.xei.entry.fluid.FluidHolderSetList; import com.gregtechceu.gtceu.integration.xei.handlers.fluid.CycleFluidEntryHandler; import com.gregtechceu.gtceu.integration.xei.handlers.item.CycleItemStackHandler; +import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTMath; import com.gregtechceu.gtceu.utils.ResearchManager; @@ -506,7 +507,7 @@ 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 LocalizationUtils.format("gtceu.recipe.temperature", FormattingUtil.formatTemperature(temp)); }) .addDataInfo(data -> { int temp = data.getInt("ebf_temp"); 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 66c58065d87..013aac3040b 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 @@ -615,7 +615,7 @@ public static MultiblockMachineDefinition registerMultiblockTank(GTRegistrate re Component.translatable("gtceu.machine.multiblock.tank.tooltip"), Component.translatable("gtceu.universal.tooltip.fluid_storage_capacity", capacity), (filter != null) ? Component.translatable("gtceu.fluid_pipe.max_temperature", - filter.getMaxFluidTemperature()) : null) + FormattingUtil.formatTemperature(filter.getMaxFluidTemperature())) : null) .rotationState(RotationState.ALL) .recipeType(DUMMY_RECIPES) .pattern(definition -> FactoryBlockPattern.start() diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index 0d613b8167a..484250dd946 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -743,6 +743,9 @@ public static class GameplayConfigs { public static class ClientConfigs { + @Configurable + @Configurable.Comment({ "Whether or not to display all temperatures in Celsius instead of Kelvin" }) + public boolean temperaturesInCelsius = false; @Configurable @Configurable.Comment({ "Whether or not to enable Emissive Textures for GregTech Machines.", "Default: true" }) public boolean machinesEmissiveTextures = true; 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 8a903d631d7..e319eb4f605 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -927,7 +927,7 @@ public static void init(RegistrateLangProvider provider) { 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"); - provider.add("gtceu.recipe.temperature", "Temp: %sK"); + provider.add("gtceu.recipe.temperature", "Temp: %s"); 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"); @@ -975,7 +975,7 @@ public static void init(RegistrateLangProvider provider) { 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", "§cTemperature: %s"); 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"); @@ -1072,7 +1072,7 @@ public static void init(RegistrateLangProvider provider) { 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.max_temperature", "§cTemperature Limit: §f%s"); 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"); diff --git a/src/main/java/com/gregtechceu/gtceu/utils/FormattingUtil.java b/src/main/java/com/gregtechceu/gtceu/utils/FormattingUtil.java index 09edf06c3f3..493f7798fb9 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/FormattingUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/FormattingUtil.java @@ -1,5 +1,7 @@ package com.gregtechceu.gtceu.utils; +import com.gregtechceu.gtceu.config.ConfigHolder; + import net.minecraft.network.chat.Component; import net.minecraft.network.chat.ComponentContents; import net.minecraft.network.chat.MutableComponent; @@ -277,4 +279,10 @@ public static void combineComponents(MutableComponent c1, Component c2) { private static boolean isEmptyComponent(Component component) { return component.getContents() == ComponentContents.EMPTY && component.getSiblings().isEmpty(); } + + public static String formatTemperature(int temperature) { + if (ConfigHolder.INSTANCE.client.temperaturesInCelsius) + return formatNumbers(temperature - 273) + " °C"; + else return formatNumbers(temperature) + " K"; + } } diff --git a/src/main/resources/assets/gtceu/lang/ja_jp.json b/src/main/resources/assets/gtceu/lang/ja_jp.json index 2704dc4ad25..e734b1e3c55 100644 --- a/src/main/resources/assets/gtceu/lang/ja_jp.json +++ b/src/main/resources/assets/gtceu/lang/ja_jp.json @@ -2311,7 +2311,7 @@ "gtceu.fluid.state_gas": "§a状態: 気体", "gtceu.fluid.state_liquid": "§a状態: 液体", "gtceu.fluid.state_plasma": "§a状態: プラズマ", - "gtceu.fluid.temperature": "§c温度: %d K", + "gtceu.fluid.temperature": "§c温度: %d", "gtceu.fluid.temperature.cryogenic": "§b低温!取り扱い注意!", "gtceu.fluid.type_acid.tooltip": "§6酸性!取り扱い注意!", "gtceu.fluid_heater": "液体加熱機", @@ -2320,7 +2320,7 @@ "gtceu.fluid_pipe.channels": "§eチャンネル: §f%d", "gtceu.fluid_pipe.cryo_proof": "§6超低温物質を扱える", "gtceu.fluid_pipe.gas_proof": "§6ガスを扱える", - "gtceu.fluid_pipe.max_temperature": "§c温度限界: §f%d K", + "gtceu.fluid_pipe.max_temperature": "§c温度限界: §f%s", "gtceu.fluid_pipe.not_gas_proof": "§4ガスが漏れる可能性がある!", "gtceu.fluid_pipe.plasma_proof": "§6すべてのプラズマに対応", "gtceu.fluid_solidifier": "液体成型機", @@ -3701,7 +3701,7 @@ "gtceu.recipe.not_consumed": "このレシピでは消費されない", "gtceu.recipe.research": "研究が必要", "gtceu.recipe.scan_for_research": "アセンブリラインのためのスキャン", - "gtceu.recipe.temperature": "温度: %sK", + "gtceu.recipe.temperature": "温度: %s", "gtceu.recipe.total": "合計: %s EU", "gtceu.recipe.total_computation": "総計算力: %s CWU", "gtceu.recipe.total_eu": "総使用量: %s EU/t", diff --git a/src/main/resources/assets/gtceu/lang/ru_ru.json b/src/main/resources/assets/gtceu/lang/ru_ru.json index e3b4ac9656f..49a097fe4c1 100644 --- a/src/main/resources/assets/gtceu/lang/ru_ru.json +++ b/src/main/resources/assets/gtceu/lang/ru_ru.json @@ -1558,7 +1558,7 @@ "gtceu.fluid.state_gas": "§7Состояние: Газообразный", "gtceu.fluid.state_liquid": "§7Состояние: Жидкость", "gtceu.fluid.state_plasma": "§7Состояние: Плазма", - "gtceu.fluid.temperature": "§cТемпература: %d K", + "gtceu.fluid.temperature": "§cТемпература: %d", "gtceu.fluid.temperature.cryogenic": "§bКриогенный! Соблюдайте осторожность!", "gtceu.fluid.type_acid.tooltip": "§6Кислота! Соблюдайте осторожность!", "gtceu.fluid_heater": "Жидкостный нагреватель", @@ -1567,7 +1567,7 @@ "gtceu.fluid_pipe.channels": "§eКаналов: §f%d", "gtceu.fluid_pipe.cryo_proof": "§6Может хранить криогенику", "gtceu.fluid_pipe.gas_proof": "§6Может хранить газы", - "gtceu.fluid_pipe.max_temperature": "§cМаксимальная температура: §f%d K", + "gtceu.fluid_pipe.max_temperature": "§cМаксимальная температура: §f%s", "gtceu.fluid_pipe.not_gas_proof": "§4Возможна утечка газов!", "gtceu.fluid_pipe.plasma_proof": "§6Может хранить все виды Плазмы", "gtceu.fluid_solidifier": "Жидкостный отвердитель", @@ -2128,7 +2128,7 @@ "gtceu.recipe.eu_to_start": "EU для запуска: %sEU%s", "gtceu.recipe.explosive": "Взрывчатка: %s", "gtceu.recipe.not_consumed": "Не расходуется", - "gtceu.recipe.temperature": "Температура: %sK", + "gtceu.recipe.temperature": "Температура: %s", "gtceu.recipe.total": "Всего: %s EU", "gtceu.recipe_logic.condition_fails": "Условие не выполнено", "gtceu.recipe_logic.insufficient_fuel": "Недостаточно топлива", diff --git a/src/main/resources/assets/gtceu/lang/zh_cn.json b/src/main/resources/assets/gtceu/lang/zh_cn.json index 9c257b9fcac..ca9c93f6ff7 100644 --- a/src/main/resources/assets/gtceu/lang/zh_cn.json +++ b/src/main/resources/assets/gtceu/lang/zh_cn.json @@ -2312,7 +2312,7 @@ "gtceu.fluid.state_gas": "§a状态:气态", "gtceu.fluid.state_liquid": "§a状态:液态", "gtceu.fluid.state_plasma": "§a状态:等离子态", - "gtceu.fluid.temperature": "§c温度:%d K", + "gtceu.fluid.temperature": "§c温度:%d", "gtceu.fluid.temperature.cryogenic": "§b低温流体!轻拿轻放!", "gtceu.fluid.type_acid.tooltip": "§6酸性流体!轻拿轻放!", "gtceu.fluid_heater": "流体加热器", @@ -2321,7 +2321,7 @@ "gtceu.fluid_pipe.channels": "§e并行管道:§f%d", "gtceu.fluid_pipe.cryo_proof": "§6可传输低温物质", "gtceu.fluid_pipe.gas_proof": "§6可以传输气体", - "gtceu.fluid_pipe.max_temperature": "§c温度上限:§f%d K", + "gtceu.fluid_pipe.max_temperature": "§c温度上限:§f%s", "gtceu.fluid_pipe.not_gas_proof": "§4气体可能泄漏!", "gtceu.fluid_pipe.plasma_proof": "§6可传输所有等离子体", "gtceu.fluid_solidifier": "流体固化器", @@ -3717,7 +3717,7 @@ "gtceu.recipe.not_consumed": "不在加工中消耗", "gtceu.recipe.research": "需要研究", "gtceu.recipe.scan_for_research": "装配线配方扫描", - "gtceu.recipe.temperature": "温度:%sK", + "gtceu.recipe.temperature": "温度:%s", "gtceu.recipe.total": "总计:%s EU", "gtceu.recipe.total_computation": "算力:%s CWU", "gtceu.recipe.total_eu": "总功率:%s EU/t", diff --git a/src/main/resources/assets/gtceu/lang/zh_tw.json b/src/main/resources/assets/gtceu/lang/zh_tw.json index 283f8ff384b..d295c7330e8 100644 --- a/src/main/resources/assets/gtceu/lang/zh_tw.json +++ b/src/main/resources/assets/gtceu/lang/zh_tw.json @@ -2265,7 +2265,7 @@ "gtceu.fluid.state_gas": "§a狀態:氣態", "gtceu.fluid.state_liquid": "§a狀態:液態", "gtceu.fluid.state_plasma": "§a狀態:電漿態", - "gtceu.fluid.temperature": "§c溫度:%d K", + "gtceu.fluid.temperature": "§c溫度:%d", "gtceu.fluid.temperature.cryogenic": "§b低溫流體!輕拿輕放!", "gtceu.fluid.type_acid.tooltip": "§6酸性流體!輕拿輕放!", "gtceu.fluid_heater": "流體加熱器", @@ -2274,7 +2274,7 @@ "gtceu.fluid_pipe.channels": "§e平行管道:§f%d", "gtceu.fluid_pipe.cryo_proof": "§6可傳輸低溫物質", "gtceu.fluid_pipe.gas_proof": "§6可以傳輸氣體", - "gtceu.fluid_pipe.max_temperature": "§c溫度上限:§f%d K", + "gtceu.fluid_pipe.max_temperature": "§c溫度上限:§f%s", "gtceu.fluid_pipe.not_gas_proof": "§4氣體可能洩漏!", "gtceu.fluid_pipe.plasma_proof": "§6可傳輸所有電漿", "gtceu.fluid_solidifier": "流體固化器", @@ -3428,7 +3428,7 @@ "gtceu.recipe.not_consumed": "不在加工中消耗", "gtceu.recipe.research": "需要研究", "gtceu.recipe.scan_for_research": "裝配線配方掃描", - "gtceu.recipe.temperature": "溫度:%sK", + "gtceu.recipe.temperature": "溫度:%s", "gtceu.recipe.total": "總計:%s EU", "gtceu.recipe.total_computation": "總計算力:%s CWU", "gtceu.recipe_logic.condition_fails": "條件不足", From f66abea98890d3fdc6ccf5bc4457760ff0217b85 Mon Sep 17 00:00:00 2001 From: MetenBouldry <94766011+MetenBouldry@users.noreply.github.com> Date: Fri, 9 Jan 2026 16:22:04 +0200 Subject: [PATCH 06/28] Correction and update of the new uk_ua (#4452) Co-authored-by: Tenwoc <155655841+tenwoc@users.noreply.github.com> Co-authored-by: Vladyslav <158621664+Roll54@users.noreply.github.com> --- .../resources/assets/gtceu/lang/uk_ua.json | 8752 +++++++++-------- 1 file changed, 4422 insertions(+), 4330 deletions(-) diff --git a/src/main/resources/assets/gtceu/lang/uk_ua.json b/src/main/resources/assets/gtceu/lang/uk_ua.json index 4926382468a..cc680221e39 100644 --- a/src/main/resources/assets/gtceu/lang/uk_ua.json +++ b/src/main/resources/assets/gtceu/lang/uk_ua.json @@ -1,1734 +1,1735 @@ { - "behavior.data_item.data": "— §a%s", - "behavior.data_item.title": "§nДані про будівництво конвеєра:", - "behavior.item_magnet.disabled": "§cМагнітне поле: ВИМК.", - "behavior.item_magnet.enabled": "§aМагнітне поле: УВІМК.", - "behavior.portable_scanner.amp_per_sec": "Середній (остання секунда): %s А", - "behavior.portable_scanner.bedrock_fluid.amount": "Рідини в покладах: %s %s — %s%%", - "behavior.portable_scanner.bedrock_fluid.amount_unknown": "Рідини в покладах: %s%%", - "behavior.portable_scanner.bedrock_fluid.nothing": "Рідини в покладах: §6Порожньо§r", - "behavior.portable_scanner.block_hardness": "Твердість: %s Вибухостійкість: %s", - "behavior.portable_scanner.block_name": "Назва: %s Мета дані: %s", - "behavior.portable_scanner.debug_cpu_load": "Середнє навантаження на ЦП ~%sнс протягом %s тактів із найгіршим часом %sнс.", + "translators": "discord: tenwoc, roll_54, metenbouldry1749. for minestar.com.ua", + "behavior.data_item.data": "-§a %s", + "behavior.data_item.title": "§nДані про конструкцію «%s»:", + "behavior.item_magnet.disabled": "§cМагнітне поле вимкнено", + "behavior.item_magnet.enabled": "§aМагнітне поле увімкнено", + "behavior.portable_scanner.amp_per_sec": "В середньому (за останню секунду): %s A", + "behavior.portable_scanner.bedrock_fluid.amount": "Розміщена рідина: %s %s - %s%%", + "behavior.portable_scanner.bedrock_fluid.amount_unknown": "Розміщена рідина: %s%%", + "behavior.portable_scanner.bedrock_fluid.nothing": "Розміщена рідина:§6 Нічого§r", + "behavior.portable_scanner.block_hardness": "Твердість: %s захист від вибухів: %s", + "behavior.portable_scanner.block_name": "Назва: %s Метадані: %s", + "behavior.portable_scanner.debug_cpu_load": "Середнє завантаження процесора ~%sнс протягом %s тактів з найгіршим часом %sнс.", "behavior.portable_scanner.debug_cpu_load_seconds": "Це %s секунд.", - "behavior.portable_scanner.debug_lag_count": "Викликано %s попереджень про стрибки затримки (все, що триває довше ніж %sмс) на сервері.", + "behavior.portable_scanner.debug_lag_count": "Попередження про затримку %s (все, що триває довше, ніж %sмс) на сервері.", "behavior.portable_scanner.debug_machine": "Мета-ID: %s", "behavior.portable_scanner.debug_machine_invalid": " недійсний!", - "behavior.portable_scanner.debug_machine_invalid_null=invalid! MetaTileEntity =": " нульовий!", + "behavior.portable_scanner.debug_machine_invalid_null=invalid! MetaTileEntity =": " null!", "behavior.portable_scanner.debug_machine_valid": " дійсний", "behavior.portable_scanner.divider": "=========================", - "behavior.portable_scanner.energy_container_in": "Макс. вхід: %s (%s) EU при %s А", - "behavior.portable_scanner.energy_container_out": "Макс. вихід: %s (%s) EU при %s А", + "behavior.portable_scanner.energy_container_in": "Макс. Вхід: %s (%s) EU з %s A", + "behavior.portable_scanner.energy_container_out": "Макс. Вихід: %s (%s) EU з %s A", "behavior.portable_scanner.energy_container_storage": "Енергія: %s EU / %s EU", - "behavior.portable_scanner.environmental_hazard": "Небезпека для середовища у чанках: %s§r — %s ppm", - "behavior.portable_scanner.environmental_hazard.nothing": "Небезпека для середовища у чанках: §6Немає§r", - "behavior.portable_scanner.eu_per_sec": "Середній (остання секунда): %s EU/т", - "behavior.portable_scanner.guild_name": "§2Назва гільдії: %s§r", - "behavior.portable_scanner.local_hazard": "Місцева небезпека в зоні: %s§r — %s ppm", - "behavior.portable_scanner.local_hazard.nothing": "Місцева небезпека в зоні: §6Немає§r", + "behavior.portable_scanner.environmental_hazard": "Екологічна небезпека у чанку: %s§r - %s ppm", + "behavior.portable_scanner.environmental_hazard.nothing": "Екологічна небезпека у чанку:§6 відсутня§r", + "behavior.portable_scanner.eu_per_sec": "В середньому (за останню секунду): %s EU/т", + "behavior.portable_scanner.guild_name": "§2Ім'я гільдії: %s§r", + "behavior.portable_scanner.local_hazard": "Місцева небезпека в регіоні: %s§r - %s ppm", + "behavior.portable_scanner.local_hazard.nothing": "Місцева небезпека в регіоні:§6 відсутня§r", "behavior.portable_scanner.machine_disabled": "Вимкнено.", - "behavior.portable_scanner.machine_front_facing": "Передня сторона: %s", + "behavior.portable_scanner.machine_front_facing": "Лицьовий бік: %s", "behavior.portable_scanner.machine_ownership": "§2Тип власника машини: %s§r", - "behavior.portable_scanner.machine_power_loss": "Вимкнути без живлення.", - "behavior.portable_scanner.machine_progress": "Прогрес/завантаження: %s / %s", - "behavior.portable_scanner.machine_upwards_facing": "Верхня сторона: %s", - "behavior.portable_scanner.mode.caption": "Режим показу: %s", - "behavior.portable_scanner.mode.show_all_info": "Вся інформація", - "behavior.portable_scanner.mode.show_block_info": "Заблокована інформація", - "behavior.portable_scanner.mode.show_electrical_info": "Електрична інформація", - "behavior.portable_scanner.mode.show_environmental_info": "Навколишня інформація", - "behavior.portable_scanner.mode.show_machine_info": "Інформація про машину", - "behavior.portable_scanner.mode.show_recipe_info": "Інформація рецепту", + "behavior.portable_scanner.machine_power_loss": "Вимкнено через втрату живлення.", + "behavior.portable_scanner.machine_progress": "Обробка/завантаження: %s / %s", + "behavior.portable_scanner.machine_upwards_facing": "Верхній бік: %s", + "behavior.portable_scanner.mode.caption": "Режим відображення: %s", + "behavior.portable_scanner.mode.show_all_info": "Показувати всю інформацію", + "behavior.portable_scanner.mode.show_block_info": "Показувати інформацію про блок", + "behavior.portable_scanner.mode.show_electrical_info": "Показувати інженерну інформацію", + "behavior.portable_scanner.mode.show_environmental_info": "Показувати інформацію про довкілля", + "behavior.portable_scanner.mode.show_machine_info": "Показувати інформацію про машину", + "behavior.portable_scanner.mode.show_recipe_info": "Показувати інформацію про рецепт", "behavior.portable_scanner.muffled": "Заглушено.", - "behavior.portable_scanner.multiblock_energy_input": "Макс. вхід енергії: %s EU/т рівень: %s", - "behavior.portable_scanner.multiblock_energy_output": "Макс. вихід енергії: %s EU/т рівень: %s", + "behavior.portable_scanner.multiblock_energy_input": "Макс. подача енергії: %s EU/т рівень: %s", + "behavior.portable_scanner.multiblock_energy_output": "Макс. Вихід енергії: %s EU/т рівень: %s", "behavior.portable_scanner.multiblock_maintenance": "Проблеми: %s", - "behavior.portable_scanner.multiblock_parallel": "Багатообробка: %s", - "behavior.portable_scanner.player_name": "§2Ім'я гравця: %s§r, §7Гравець в мережі: %s§r", - "behavior.portable_scanner.position": "----- X: %s Y: %s Z: %s D: %s -----", + "behavior.portable_scanner.multiblock_parallel": "Паралельна обробка: %s", + "behavior.portable_scanner.player_name": "§2Ім'я гравця: %s§r,§7 гравець у мережі: %s§r", + "behavior.portable_scanner.position": "----- X: %s Y: %s Z: %s в: %s -----", "behavior.portable_scanner.state": "%s: %s", - "behavior.portable_scanner.tank": "Бак %s: %s мВ / %s мВ %s", - "behavior.portable_scanner.tanks_empty": "Усі баки порожні", + "behavior.portable_scanner.tank": "Резервуар %s: %s мВ / %s мВ %s", + "behavior.portable_scanner.tanks_empty": "Усі резервуари порожні", "behavior.portable_scanner.team_name": "§2Назва команди: %s§r", - "behavior.portable_scanner.workable_consumption": "Імовірно, використовує: %s EU/т при %s А", - "behavior.portable_scanner.workable_production": "Імовірно, виробляє: %s EU/т при %s А", - "behavior.portable_scanner.workable_progress": "Прогрес: %s с / %s с", + "behavior.portable_scanner.workable_consumption": "Ймовірно споживає: %s EU/т з %s A", + "behavior.portable_scanner.workable_production": "Ймовірно виробляє: %s EU/т з %s A", + "behavior.portable_scanner.workable_progress": "Прогрес: %s s / %s s", "behavior.portable_scanner.workable_stored_energy": "Збережена енергія: %s EU / %s EU", - "behavior.prospector.added_waypoint": "Створену маршрутну точку названо %s!", + "behavior.prospector.added_waypoint": "Створено маршрутну точку з іменем %s!", "behavior.prospector.not_enough_energy": "Недостатньо енергії!", - "behavior.toggle_energy_consumer.tooltip": "Використовувати режим перемикання", - "behaviour.boor.by": "від %s", - "behaviour.hammer": "Умикає та вимикає приглушення для машин (вдаряючи по них)", - "behaviour.hoe": "Може обробляти ґрунт", - "behaviour.lighter.fluid.tooltip": "Може підпалити речі бутаном або пропаном", - "behaviour.lighter.tooltip.description": "Може підпалити речі", + "behavior.toggle_energy_consumer.tooltip": "Використовуйте крадькома для перемикання режиму", + "behaviour.boor.by": " %s", + "behaviour.hammer": "Перемикає заглушення машин (тицянням по ним)", + "behaviour.hoe": "Може орати ґрунт", + "behaviour.lighter.fluid.tooltip": "Може підпалювати речі за допомогою бутану або пропану", + "behaviour.lighter.tooltip.description": "Може підпалювати речі", "behaviour.lighter.tooltip.usage": "Shift+ПКМ, щоб відкрити/закрити", - "behaviour.lighter.uses": "Решта використання: %d", - "behaviour.meta.machine.config.copy.tooltip": "§7Shift+ПКМ, щоб копіювати налаштування машини", - "behaviour.meta.machine.config.paste.tooltip": "§7ПКМ, щоб вставити налаштування машини", - "behaviour.paintspray.black.tooltip": "Може фарбувати штуки у чорний", - "behaviour.paintspray.blue.tooltip": "Може фарбувати штуки у синій", - "behaviour.paintspray.brown.tooltip": "Може фарбувати штуки у коричневий", - "behaviour.paintspray.cyan.tooltip": "Може фарбувати штуки у бірюзовий", - "behaviour.paintspray.gray.tooltip": "Може фарбувати штуки у сірий", - "behaviour.paintspray.green.tooltip": "Може фарбувати штуки у зелений", - "behaviour.paintspray.light_blue.tooltip": "Може фарбувати штуки у блакитний", - "behaviour.paintspray.light_gray.tooltip": "Може фарбувати штуки у світло-сірий", - "behaviour.paintspray.lime.tooltip": "Може фарбувати штуки у лаймовий", - "behaviour.paintspray.magenta.tooltip": "Може фарбувати штуки у пурпуровий", - "behaviour.paintspray.orange.tooltip": "Може фарбувати штуки у помаранчевий", - "behaviour.paintspray.pink.tooltip": "Може фарбувати штуки у рожевий", - "behaviour.paintspray.purple.tooltip": "Може фарбувати штуки у фіолетовий", - "behaviour.paintspray.red.tooltip": "Може фарбувати штуки у червоний", - "behaviour.paintspray.solvent.tooltip": "Може очищувати штуки від кольору", - "behaviour.paintspray.uses": "Залишилося використань: %d", - "behaviour.paintspray.white.tooltip": "Може фарбувати штуки у білий", - "behaviour.paintspray.yellow.tooltip": "Може фарбувати штуки у жовтий", - "behaviour.prospecting": "Використовується для пошуку", - "behaviour.setting.allow.input.from.output.tooltip": "%s вхід з боку виходу %s", - "behaviour.setting.item_auto_output.tooltip": "%s автоматично виводить %s", - "behaviour.setting.muffled.tooltip": "Заглушено %s", - "behaviour.setting.output.direction.tooltip": "%s вихідний напрямок: %s", - "behaviour.soft_hammer": "Умикає і вимикає машини", - "behaviour.soft_hammer.disabled": "ВИМК.", - "behaviour.soft_hammer.enabled": "УВІМК.", - "behaviour.soft_hammer.idle_after_cycle": "Призупинити машину після поточного циклу", - "behaviour.wrench": "Оберт блоків при ПКМ", - "block.filter_casing.tooltip": "Створює середовище §aбез частинок§7", - "block.gtceu.acid_hazard_sign_block": "Табличка кислотної небезпеки", - "block.gtceu.active_transformer": "Активний трансформер", - "block.gtceu.advanced_computer_casing": "Покращена комп'ютерна обшивка", - "block.gtceu.advanced_data_access_hatch": "Покращений роз'єм доступу до даних", - "block.gtceu.advanced_monitor": "Покращенйи монітор", - "block.gtceu.alloy_blast_smelter": "Доменний топильник сплавів", + "behaviour.lighter.uses": "Використань: %d", + "behaviour.meta.machine.config.copy.tooltip": "§7ПКМ, щоб скопіювати конфігурацію машини", + "behaviour.meta.machine.config.paste.tooltip": "§7ПКМ, щоб вставити конфігурацію машини", + "behaviour.paintspray.black.tooltip": "Фарбує речі в чорний", + "behaviour.paintspray.blue.tooltip": "Фарбує речі в синій", + "behaviour.paintspray.brown.tooltip": "Фарбує речі в коричневий", + "behaviour.paintspray.cyan.tooltip": "Фарбує речі в бірюзовий", + "behaviour.paintspray.gray.tooltip": "Фарбує речі в сірий", + "behaviour.paintspray.green.tooltip": "Фарбує речі в зелений", + "behaviour.paintspray.light_blue.tooltip": "Фарбує речі в блакитний", + "behaviour.paintspray.light_gray.tooltip": "Фарбує речі в світло-сірий", + "behaviour.paintspray.lime.tooltip": "Фарбує речі в лаймовий", + "behaviour.paintspray.magenta.tooltip": "Фарбує речі в пурпурний", + "behaviour.paintspray.orange.tooltip": "Фарбує речі в помаранчевий", + "behaviour.paintspray.pink.tooltip": "Фарбує речі в рожевий", + "behaviour.paintspray.purple.tooltip": "Фарбує речі в фіолетовий", + "behaviour.paintspray.red.tooltip": "Фарбує речі в червоний", + "behaviour.paintspray.solvent.tooltip": "Вибілює речі", + "behaviour.paintspray.uses": "Використань: %d", + "behaviour.paintspray.white.tooltip": "Фарбує речі в білий", + "behaviour.paintspray.yellow.tooltip": "Фарбує речі в жовтий", + "behaviour.prospecting": "Використовується для геологорозвідки", + "behaviour.setting.allow.input.from.output.tooltip": "%s вхід з вихідної сторони %s", + "behaviour.setting.item_auto_output.tooltip": "%s автовиведення is %s", + "behaviour.setting.muffled.tooltip": "Глушить %s", + "behaviour.setting.output.direction.tooltip": "%s напрям виведення: %s", + "behaviour.soft_hammer": "Запускає та зупиняє машини", + "behaviour.soft_hammer.disabled": "Робота зупинена", + "behaviour.soft_hammer.disabled_cycle": "Робота зупиниться по завершенню поточного циклу", + "behaviour.soft_hammer.enabled": "Робота відновлена", + "behaviour.wrench": "Повертає блоки клацанням ПКМ", + "block.filter_casing.tooltip": "Створює§a вільне від частинок§7 середовище", + "block.gtceu.acid_hazard_sign_block": "Блок зі знаком кислотної небезпеки", + "block.gtceu.active_transformer": "Активний трансформатор", + "block.gtceu.advanced_computer_casing": "Вдосконалений комп'ютерний корпус", + "block.gtceu.advanced_data_access_hatch": "Вдосконалений люк доступу до даних", + "block.gtceu.advanced_monitor": "Вдосконалений монітор", + "block.gtceu.alloy_blast_smelter": "Доменна плавильня сплавів", "block.gtceu.aluminium_crate": "Алюмінієвий ящик", - "block.gtceu.aluminium_drum": "Алюмінієвий барабан", - "block.gtceu.antimatter_hazard_sign_block": "Табличка антиматеріальної небезпеки", - "block.gtceu.assembly_line": "Конвеєр", - "block.gtceu.assembly_line_casing": "Корпус конвеєра", - "block.gtceu.assembly_line_grating": "Решітка конвеєра", - "block.gtceu.assembly_line_unit": "Обшивка контролю збору", - "block.gtceu.atomic_casing": "Атомна обшивка", - "block.gtceu.auto_maintenance_hatch": "Автотехнічний шлюз", - "block.gtceu.basic_data_access_hatch": "Люк доступу до даних", - "block.gtceu.bio_hazard_sign_block": "Табличка біологічної небезпеки", - "block.gtceu.black_borderless_lamp": "Чорна лампа без меж", + "block.gtceu.aluminium_drum": "Алюмінієва бочка", + "block.gtceu.antimatter_hazard_sign_block": "Блок зі знаком антиматеріальної небезпеки", + "block.gtceu.assembly_line": "Конвеєрна лінія", + "block.gtceu.assembly_line_casing": "Корпус конвеєрної лінії", + "block.gtceu.assembly_line_grating": "Решітка конвеєрної лінії", + "block.gtceu.assembly_line_unit": "Конвеєрний контролювальний корпус", + "block.gtceu.atomic_casing": "Атомний корпус", + "block.gtceu.auto_maintenance_hatch": "Автоматичний люк техобслуговування", + "block.gtceu.basic_data_access_hatch": "Базовий люк доступу до даних", + "block.gtceu.bio_hazard_sign_block": "Блок зі знаком біонебезпеки", + "block.gtceu.black_borderless_lamp": "Чорна необлямована лампа", "block.gtceu.black_lamp": "Чорна лампа", - "block.gtceu.black_large_metal_sheet": "Чорний великий металевий лист", - "block.gtceu.black_metal_sheet": "Чорний металевий лист", - "block.gtceu.black_studs": "Чорні запонки", - "block.gtceu.blue_borderless_lamp": "Синя лампа без меж", + "block.gtceu.black_large_metal_sheet": "Чорне велике металеве покриття", + "block.gtceu.black_metal_sheet": "Чорне металеве покриття", + "block.gtceu.black_studs": "Чорні кубики", + "block.gtceu.blue_borderless_lamp": "Синя необлямована лампа", "block.gtceu.blue_lamp": "Синя лампа", - "block.gtceu.blue_large_metal_sheet": "Синій великий металевий лист", - "block.gtceu.blue_metal_sheet": "Синій металевий лист", - "block.gtceu.blue_studs": "Сині запонки", - "block.gtceu.boss_hazard_sign_block": "Табличка босової небезпеки", + "block.gtceu.blue_large_metal_sheet": "Синє велике металеве покриття", + "block.gtceu.blue_metal_sheet": "Синє металеве покриття", + "block.gtceu.blue_studs": "Сині кубики", + "block.gtceu.boss_hazard_sign_block": "Блок зі знаком босової небезпеки", "block.gtceu.brittle_charcoal": "Крихке деревне вугілля", - "block.gtceu.bronze_brick_casing": "Цегляна обшивка з олов'яної бронзової", - "block.gtceu.bronze_crate": "Ящик з олов'яної бронзової", - "block.gtceu.bronze_drum": "Барабан з олов'яної бронзової", - "block.gtceu.bronze_firebox_casing": "Обшивка топки з олов'яної бронзової", - "block.gtceu.bronze_gearbox": "Обшивка коробки передач з олов'яної бронзової", - "block.gtceu.bronze_large_boiler": "Великий котел з олов'яної бронзової", - "block.gtceu.bronze_machine_casingО: "Машинна обшивка з олов'яної бронзової", - "block.gtceu.bronze_multiblock_tank": "Багатоблоковий бак з олов'яної бронзової", - "block.gtceu.bronze_pipe_casing": "Обшивка труб з олов'яної бронзової", - "block.gtceu.bronze_tank_valve": "Вентиль бака з олов'яної бронзової", - "block.gtceu.brown_borderless_lamp": "Коричнева лампа без меж", + "block.gtceu.bronze_brick_casing": "Мурований бронзовий корпус", + "block.gtceu.bronze_crate": "Бронзовий ящик", + "block.gtceu.bronze_drum": "Бронзова бочка", + "block.gtceu.bronze_firebox_casing": "Бронзова топка", + "block.gtceu.bronze_gearbox": "Бронзовий редукторний корпус", + "block.gtceu.bronze_large_boiler": "Великий бронзовий котел", + "block.gtceu.bronze_machine_casing": "Бронзовий корпус машини", + "block.gtceu.bronze_multiblock_tank": "Бронзовий багатоблочний резервуар", + "block.gtceu.bronze_pipe_casing": "Бронзовий трубний корпус", + "block.gtceu.bronze_tank_valve": "Бронзовий рідинний вентиль", + "block.gtceu.brown_borderless_lamp": "Коричнева необлямована лампа", "block.gtceu.brown_lamp": "Коричнева лампа", - "block.gtceu.brown_large_metal_sheet": "Коричневий великий металевий лист", - "block.gtceu.brown_metal_sheet": "Коричневий металевий лист", - "block.gtceu.brown_studs": "Коричневі запонки", + "block.gtceu.brown_large_metal_sheet": "Коричневе велике металеве покриття", + "block.gtceu.brown_metal_sheet": "Коричневе металеве покриття", + "block.gtceu.brown_studs": "Коричневі кубики", "block.gtceu.casing_coke_bricks": "Цегла коксової печі", - "block.gtceu.casing_grate": "Решіткова машинна обшивка", - "block.gtceu.causality_hazard_sign_block": "Табличка причинно-наслідкової небезпеки", + "block.gtceu.casing_grate": "Заґратований корпус машини", + "block.gtceu.causality_hazard_sign_block": "Блок зі знаком причинно-наслідкової небезпеки", "block.gtceu.central_monitor": "Центральний монітор", - "block.gtceu.charcoal_pile_igniter": "Запальник деревного вугілля", + "block.gtceu.charcoal_pile_igniter": "Запалювач вугільної купи", "block.gtceu.chiseled_dark_concrete": "Різьблений темний бетон", "block.gtceu.chiseled_light_concrete": "Різьблений світлий бетон", "block.gtceu.chiseled_marble": "Різьблений мармур", "block.gtceu.chiseled_red_granite": "Різьблений червоний граніт", - "block.gtceu.clean_machine_casing": "Чиста машинна обшивка з нержавійної сталі", - "block.gtceu.cleaning_maintenance_hatch": "Очищення технічного шлюзу", + "block.gtceu.clean_machine_casing": "Чистий нержавійний сталевий корпус", + "block.gtceu.cleaning_maintenance_hatch": "Очищальний люк техобслуговування", "block.gtceu.cleanroom": "Чиста кімната", - "block.gtceu.cleanroom_glass": "Скло чистої кімкати", + "block.gtceu.cleanroom_glass": "Скло чистої кімнати", "block.gtceu.coke_oven": "Коксова піч", "block.gtceu.coke_oven_bricks": "Цегла коксової печі", - "block.gtceu.coke_oven_hatch": "Шлюз коксової печі", - "block.gtceu.computation_receiver_hatch": "Роз'єм прийому обчислювальних даних", - "block.gtceu.computation_transmitter_hatch": "Роз'єм передачі обчислювальних даних", - "block.gtceu.computer_casing": "Комп'ютерна обшивка", - "block.gtceu.computer_heat_vent": "Вентиляційний отвір комп'ютера", - "block.gtceu.configurable_maintenance_hatch": "Налаштовуваний технічний шлюз", - "block.gtceu.corrosion_proof_casing": "Корозійностійкий корпус", + "block.gtceu.coke_oven_hatch": "Люк коксової печі", + "block.gtceu.computation_receiver_hatch": "Оптичний люк приймання обчислень", + "block.gtceu.computation_transmitter_hatch": "Оптичний люк трансмісії обчислень", + "block.gtceu.computer_casing": "Комп'ютерний корпус", + "block.gtceu.computer_heat_vent": "Комп'ютерний тепловідвід", + "block.gtceu.configurable_maintenance_hatch": "Налаштовний люк техобслуговування", + "block.gtceu.corrosion_proof_casing": "Антикорозійний корпус", "block.gtceu.cracked_dark_concrete_bricks": "Тріснута темна бетонна цегла", "block.gtceu.cracked_light_concrete_bricks": "Тріснута світла бетонна цегла", "block.gtceu.cracked_marble_bricks": "Тріснута мармурова цегла", - "block.gtceu.cracked_red_granite_bricks": "Тріснута цегла з червоного граніту", - "block.gtceu.cracker": "Машина крекінгу", - "block.gtceu.creative_chest": "Скриня творчости", - "block.gtceu.creative_computation_provider": "Обчислювальний постачальник творчости", - "block.gtceu.creative_data_access_hatch": "Роз'єм доступу до даних творчости", - "block.gtceu.creative_energy": "Енергії творчости", - "block.gtceu.creative_tank": "Бак творчости", + "block.gtceu.cracked_red_granite_bricks": "Тріснута червоногранітна цегла", + "block.gtceu.cracker": "Крекер", + "block.gtceu.creative_chest": "Творча скриня", + "block.gtceu.creative_computation_provider": "Творчий постачальник обчислень", + "block.gtceu.creative_data_access_hatch": "Творчий люк доступу до даних", + "block.gtceu.creative_energy": "Творче джерело енергії", + "block.gtceu.creative_tank": "Творчий резервуар", "block.gtceu.creosote": "Креозот", - "block.gtceu.crushing_wheels": "Дробильні колеса", - "block.gtceu.cupronickel_coil_block": "Мідно-нікелева котушка", - "block.gtceu.cyan_borderless_lamp": "Бірюзова лампа безмеж", + "block.gtceu.crushing_wheels": "Подрібнювальні колеса", + "block.gtceu.cupronickel_coil_block": "Блок мельхіорової котушки", + "block.gtceu.cyan_borderless_lamp": "Бірюзова необлямована лампа", "block.gtceu.cyan_lamp": "Бірюзова лампа", - "block.gtceu.cyan_large_metal_sheet": "Бірюзовий великий металевий лист", - "block.gtceu.cyan_metal_sheet": "Бірюзовий металевий лист", - "block.gtceu.cyan_studs": "Бірюзові запонки", + "block.gtceu.cyan_large_metal_sheet": "Бірюзове велике металеве покриття", + "block.gtceu.cyan_metal_sheet": "Бірюзове металеве покриття", + "block.gtceu.cyan_studs": "Бірюзові кубики", "block.gtceu.dark_concrete": "Темний бетон", "block.gtceu.dark_concrete_bricks": "Темна бетонна цегла", - "block.gtceu.dark_concrete_cobblestone": "Кругляк темного бетону", - "block.gtceu.dark_concrete_small_tile": "Малі темні бетонні кахлі", + "block.gtceu.dark_concrete_cobblestone": "Темний бетонний кругляк", + "block.gtceu.dark_concrete_small_tile": "Темні бетонні дрібні кахлі", "block.gtceu.dark_concrete_tile": "Темні бетонні кахлі", - "block.gtceu.dark_concrete_windmill_a": "Млин А з темного бетону", - "block.gtceu.dark_concrete_windmill_b": "Млин Б з темного бетону", - "block.gtceu.data_access_hatch": "Роз'єм доступу до даних", - "block.gtceu.data_bank": "Накопичувач даних", - "block.gtceu.data_receiver_hatch": "Роз'єм оптичного прийому даних", - "block.gtceu.data_transmitter_hatch": "Роз'єм оптичної передачі даних", + "block.gtceu.dark_concrete_windmill_a": "Темний бетонний вітряк A", + "block.gtceu.dark_concrete_windmill_b": "Темний бетонний вітряк B", + "block.gtceu.data_access_hatch": "Люк доступу до даних", + "block.gtceu.data_bank": "База даних", + "block.gtceu.data_receiver_hatch": "Оптичний люк приймання даних", + "block.gtceu.data_transmitter_hatch": "Оптичний люк трансмісії даних", "block.gtceu.distillation_tower": "Дистиляційна вежа", "block.gtceu.electric_blast_furnace": "Електрична доменна піч", "block.gtceu.electrolytic_cell": "Електролітична комірка", - "block.gtceu.empty_tier_i_battery": "Порожній конденсатор рівня I", - "block.gtceu.empty_tier_ii_battery": "Порожній конденсатор рівня II", - "block.gtceu.empty_tier_iii_battery": "Порожній конденсатор рівня III", - "block.gtceu.engine_intake_casing": "Упускна обшивка двигуна", - "block.gtceu.ev_16a_energy_converter": "Конвертор енергії §5ЕН§r 16§eA§r", - "block.gtceu.ev_1a_energy_converter": "Конвертор енергії §5ЕН§r 1§eA§r", - "block.gtceu.ev_4a_energy_converter": "Конвертор енергії §5ЕН§r 4§eA§r", - "block.gtceu.ev_8a_energy_converter": "Конвертор енергії §5ЕН§r 8§eA§r", - "block.gtceu.ev_air_scrubber": "§5Покращений очисник повітря III§r", - "block.gtceu.ev_alloy_smelter": "§5Покращений топильник сплавів III§r", - "block.gtceu.ev_arc_furnace": "§5Покращена дугова піч III§r", - "block.gtceu.ev_assembler": "§5Покращений збирач III§r", - "block.gtceu.ev_autoclave": "§5Покращений автоклав III§r", - "block.gtceu.ev_battery_buffer_16x": "16x буфер батареї §5екстремальної напруги§r", - "block.gtceu.ev_battery_buffer_4x": "4x буфер батареї §5екстремальної напруги§r", - "block.gtceu.ev_battery_buffer_8x": "8x буфер батареї §5екстремальної напруги§r", - "block.gtceu.ev_bedrock_ore_miner": "§5Покращений добувник руд корінної породи III§r", - "block.gtceu.ev_bender": "§5Покращений листозгинач III§r", - "block.gtceu.ev_block_breaker": "§5Покращений ламач блоків III§r", - "block.gtceu.ev_brewery": "§5Покращена варильня III§r", - "block.gtceu.ev_canner": "§5Покращений консерватор III§r", - "block.gtceu.ev_centrifuge": "§5Покращена центрифуга III§r", - "block.gtceu.ev_charger_4x": "4x турбозарядка §5екстремальної напруги§r", - "block.gtceu.ev_chemical_bath": "§5Покращена хімічна ванна III§r", - "block.gtceu.ev_chemical_reactor": "§5Покращений хімічний реактор III§r", - "block.gtceu.ev_circuit_assembler": "§5Покращений збирач схем III§r", - "block.gtceu.ev_compressor": "§5Покращений компресор III§r", - "block.gtceu.ev_cutter": "§5Покращена різальна машина III§r", - "block.gtceu.ev_diode": "§5Діод ЕН", - "block.gtceu.ev_distillery": "§5Покращений дистилятор III§r", - "block.gtceu.ev_electric_furnace": "§5Покращена електрична піч III§r", - "block.gtceu.ev_electrolyzer": "§5Покращений електролізер III§r", - "block.gtceu.ev_electromagnetic_separator": "§5Покращений електоромагнітний розділювач III§r", - "block.gtceu.ev_energy_input_hatch": "§5Вхідний роз'єм енергії ЕН", - "block.gtceu.ev_energy_input_hatch_16a": "§5Вхідний роз'єм енергії 16A ЕН", - "block.gtceu.ev_energy_input_hatch_4a": "§5Вхідний роз'єм енергії 4A ЕН", - "block.gtceu.ev_energy_output_hatch": "§5Вихідний роз'єм енергії ЕН", - "block.gtceu.ev_energy_output_hatch_16a": "§5Вихідний роз'єм енергії 16A ЕН", - "block.gtceu.ev_energy_output_hatch_4a": "§5Вихідний роз'єм енергії 4A ЕН", - "block.gtceu.ev_extractor": "§5Покращений екстрактор III§r", - "block.gtceu.ev_extruder": "§5Покращений екструдор III§r", - "block.gtceu.ev_fermenter": "§5Покращений ферментатор III§r", - "block.gtceu.ev_fisher": "§5Покращений рибак III§r", - "block.gtceu.ev_fluid_drilling_rig": "§5Покращена рідинна бурова установка III§r", - "block.gtceu.ev_fluid_heater": "§5Покращений рідинний обігрівач III§r", - "block.gtceu.ev_fluid_passthrough_hatch": "§5Прохідний рідинний шлюз ЕН", - "block.gtceu.ev_fluid_solidifier": "§5Покращений рідинний затверджувач III§r", - "block.gtceu.ev_forge_hammer": "§5Покращений ковальський молот III§r", - "block.gtceu.ev_forming_press": "§5Покращений формувальний прес III§r", - "block.gtceu.ev_gas_collector": "§5Покращений повітрозабірник III§r", - "block.gtceu.ev_hermetic_casing": "Герметична обшивка IV", - "block.gtceu.ev_input_bus": "§5Вхідна предметна шина ЕН", - "block.gtceu.ev_input_hatch": "§5Вхідний рідинний шлюз ЕН", - "block.gtceu.ev_input_hatch_4x": "§5Четверний вхідний рідинний шлюз ЕН", - "block.gtceu.ev_input_hatch_9x": "§5Непарний вхідний рідинний шлюз ЕН", - "block.gtceu.ev_item_collector": "§5Покращений збирач предметів III§r", - "block.gtceu.ev_item_passthrough_hatch": "§5Прохідний предметний шлюз ЕН", - "block.gtceu.ev_lapotronic_battery": "Лапотронний конденсатор ЕН", - "block.gtceu.ev_large_miner": "§5Покращений великий добувник III§r", - "block.gtceu.ev_laser_engraver": "§5Покращений лазерний гравер III§r", - "block.gtceu.ev_lathe": "§5Покращений токарний верстат III§r", - "block.gtceu.ev_macerator": "§5Покращений подрібнювач III§r", - "block.gtceu.ev_machine_casing": "Машинна обшивка ЕН", - "block.gtceu.ev_machine_hull": "Машинний корпус §5ЕН§f", - "block.gtceu.ev_mixer": "§5Покращений змішувач III§r", - "block.gtceu.ev_muffler_hatch": "Заглушений шлюз §5ЕН", - "block.gtceu.ev_ore_washer": "§5Покращений очищувач руд III§r", - "block.gtceu.ev_output_bus": "§5Вихідна предметна шина ЕН", - "block.gtceu.ev_output_hatch": "§5Вихідний рідинний шлюз ЕН", - "block.gtceu.ev_output_hatch_4x": "§5Четверний вихідний рідинний шлюз ЕН", - "block.gtceu.ev_output_hatch_9x": "§5Непарний вихідний рідинний шлюз ЕН", - "block.gtceu.ev_packer": "§5Покращений пакувальник III§r", - "block.gtceu.ev_polarizer": "§5Покращений намагнічувач III§r", - "block.gtceu.ev_pump": "§5Покращена помпа III§r", - "block.gtceu.ev_rock_crusher": "§5Покращений подрібнювач породи III§r", - "block.gtceu.ev_rotor_holder": "§5Тримач ротора ЕН", - "block.gtceu.ev_scanner": "§5Покращений сканер III§r", - "block.gtceu.ev_sifter": "§5Покращений просіювач III§r", - "block.gtceu.ev_substation_input_hatch_64a": "§5Вхідна підстанція роз'єму енергії ЕН 64A", - "block.gtceu.ev_substation_output_hatch_64a": "§5Вихідна підстанція роз'єму енергії ЕН 64A", - "block.gtceu.ev_super_chest": "Надскриня IV", - "block.gtceu.ev_super_tank": "Надбак IV", - "block.gtceu.ev_thermal_centrifuge": "§5Покращена термоцентрифуга III§r", - "block.gtceu.ev_transformer_16a": "Сильний трансформатор §5екстремальної напруги§r", - "block.gtceu.ev_transformer_1a": "Трансформатор §5екстремальної напруги§r", - "block.gtceu.ev_transformer_2a": "2x трансформатор §5екстремальної напруги§r", - "block.gtceu.ev_transformer_4a": "4x трансформатор §5екстремальної напруги§r", - "block.gtceu.ev_wiremill": "§5Покращений прокатний станок III§r", - "block.gtceu.ev_world_accelerator": "§5Покращений світовий прискорювач III§r", - "block.gtceu.explosion_hazard_sign_block": "Табличка вибухової небезпеки", - "block.gtceu.explosive.breaking_tooltip": "Під час видобутку активує вибух, добувайте крадькома, щоб забрати.", - "block.gtceu.explosive.lighting_tooltip": "Не можна запалити редстоуном.", - "block.gtceu.extreme_combustion_engine": "Двигун екстремального внутрішнього згоряння", - "block.gtceu.extreme_engine_intake_casing": "Надзвичайна впускна обшивка двигуна", - "block.gtceu.filter_casing": "Фільтраційна обшивка", - "block.gtceu.fire_hazard_sign_block": "Табличка вогняної небезпеки", - "block.gtceu.firebricks": "Вогнетривка цегла", + "block.gtceu.empty_tier_i_battery": "Порожній акумулятор I рівня", + "block.gtceu.empty_tier_ii_battery": "Порожній акумулятор II рівня", + "block.gtceu.empty_tier_iii_battery": "Порожній акумулятор III рівня", + "block.gtceu.engine_intake_casing": "Впускний корпус двигуна", + "block.gtceu.ev_16a_energy_converter": "§5EV§r 16§eA§r енергетичний конвертер", + "block.gtceu.ev_1a_energy_converter": "§5EV§r 1§eA§r енергетичний конвертер", + "block.gtceu.ev_4a_energy_converter": "§5EV§r 4§eA§r енергетичний конвертер", + "block.gtceu.ev_8a_energy_converter": "§5EV§r 8§eA§r енергетичний конвертер", + "block.gtceu.ev_air_scrubber": "§5Вдосконалений очисник повітря III§r", + "block.gtceu.ev_alloy_smelter": "§5Вдосконалена плавильня сплавів III§r", + "block.gtceu.ev_arc_furnace": "§5Вдосконалена дугова піч III§r", + "block.gtceu.ev_assembler": "§5Вдосконалений збирач III§r", + "block.gtceu.ev_autoclave": "§5Вдосконалений автоклав III§r", + "block.gtceu.ev_battery_buffer_16x": "§5Екстремальна напруга§r 16x акумуляторний буфер", + "block.gtceu.ev_battery_buffer_4x": "§5Екстремальна напруга§r 4x акумуляторний буфер", + "block.gtceu.ev_battery_buffer_8x": "§5Екстремальна напруга§r 8x акумуляторний буфер", + "block.gtceu.ev_bedrock_ore_miner": "§5Вдосконалений глибокореневий бур III§r", + "block.gtceu.ev_bender": "§5Вдосконалений згинач III§r", + "block.gtceu.ev_block_breaker": "§5Вдосконалений руйнівник блоків III§r", + "block.gtceu.ev_brewery": "§5Вдосконалений варильник III§r", + "block.gtceu.ev_canner": "§5Вдосконалений пакувальник III§r", + "block.gtceu.ev_centrifuge": "§5Вдосконалена центрифуга III§r", + "block.gtceu.ev_charger_4x": "§5Екстремальна напруга§r 4x турбозарядник", + "block.gtceu.ev_chemical_bath": "§5Вдосконалена хімічна ванна III§r", + "block.gtceu.ev_chemical_reactor": "§5Вдосконалений хімічний реактор III§r", + "block.gtceu.ev_circuit_assembler": "§5Вдосконалений схемотехнічний збирач III§r", + "block.gtceu.ev_compressor": "§5Вдосконалений компресор III§r", + "block.gtceu.ev_cutter": "§5Вдосконалений різак III§r", + "block.gtceu.ev_diode": "§5EV діод", + "block.gtceu.ev_distillery": "§5Вдосконалений дистилятор III§r", + "block.gtceu.ev_electric_furnace": "§5Вдосконалена електрична піч III§r", + "block.gtceu.ev_electrolyzer": "§5Вдосконалений електролізер III§r", + "block.gtceu.ev_electromagnetic_separator": "§5Вдосконалений електромагнітний сепаратор III§r", + "block.gtceu.ev_energy_input_hatch": "§5EV енергетичний люк", + "block.gtceu.ev_energy_input_hatch_16a": "§5EV 16A енергетичний люк", + "block.gtceu.ev_energy_input_hatch_4a": "§5EV 4A енергетичний люк", + "block.gtceu.ev_energy_output_hatch": "§5EV динамо-люк", + "block.gtceu.ev_energy_output_hatch_16a": "§5EV 16A динамо-люк", + "block.gtceu.ev_energy_output_hatch_4a": "§5EV 4A динамо-люк", + "block.gtceu.ev_extractor": "§5Вдосконалений екстрактор III§r", + "block.gtceu.ev_extruder": "§5Вдосконалений екструдер III§r", + "block.gtceu.ev_fermenter": "§5Вдосконалений ферментатор III§r", + "block.gtceu.ev_fisher": "§5Вдосконалений рибалка III§r", + "block.gtceu.ev_fluid_drilling_rig": "§5Вдосконалена рідинна бурова устава III§r", + "block.gtceu.ev_fluid_heater": "§5Вдосконалений рідинний нагрівач III§r", + "block.gtceu.ev_fluid_passthrough_hatch": "§5EV прохідний рідинний люк", + "block.gtceu.ev_fluid_solidifier": "§5Вдосконалений рідинний затверджувач III§r", + "block.gtceu.ev_forge_hammer": "§5Вдосконалений ковальський молот III§r", + "block.gtceu.ev_forming_press": "§5Вдосконалений формовий прес III§r", + "block.gtceu.ev_gas_collector": "§5Вдосконалений газозбірник III§r", + "block.gtceu.ev_hermetic_casing": "Герметичний корпус IV", + "block.gtceu.ev_input_bus": "§5EV вхідна шина", + "block.gtceu.ev_input_hatch": "§5EV ввідний люк", + "block.gtceu.ev_input_hatch_4x": "§5EV чотирикамерний ввідний люк", + "block.gtceu.ev_input_hatch_9x": "§5EV дев'ятикамерний ввідний люк", + "block.gtceu.ev_item_collector": "§5Вдосконалений предметний збирач III§r", + "block.gtceu.ev_item_passthrough_hatch": "§5EV прохідний предметний люк", + "block.gtceu.ev_lapotronic_battery": "EV лапотронний акумулятор", + "block.gtceu.ev_large_miner": "§5Вдосконалений великий бур III§r", + "block.gtceu.ev_laser_engraver": "§5Вдосконалений літограф III§r", + "block.gtceu.ev_lathe": "§5Вдосконалений токар III§r", + "block.gtceu.ev_macerator": "§5Вдосконалений подрібнювач III§r", + "block.gtceu.ev_machine_casing": "EV корпус машини", + "block.gtceu.ev_machine_hull": "§5EV§f машинна основа", + "block.gtceu.ev_mixer": "§5Вдосконалений змішувач III§r", + "block.gtceu.ev_muffler_hatch": "Люк вихлопу§5 EV", + "block.gtceu.ev_ore_washer": "§5Вдосконалений рудопромивач III§r", + "block.gtceu.ev_output_bus": "§5EV вихідна шина", + "block.gtceu.ev_output_hatch": "§5EV вивідний люк", + "block.gtceu.ev_output_hatch_4x": "§5EV чотирикамерний вивідний люк", + "block.gtceu.ev_output_hatch_9x": "§5EV дев'ятикамерний вивідний люк", + "block.gtceu.ev_packer": "§5Вдосконалений пакувальник III§r", + "block.gtceu.ev_polarizer": "§5Вдосконалений намагнічувач III§r", + "block.gtceu.ev_pump": "§5Вдосконалена помпа III§r", + "block.gtceu.ev_rock_crusher": "§5Вдосконалена кам'яна дробарка III§r", + "block.gtceu.ev_rotor_holder": "§5EV тримач ротора", + "block.gtceu.ev_scanner": "§5Вдосконалений сканер III§r", + "block.gtceu.ev_sifter": "§5Вдосконалений просіювач III§r", + "block.gtceu.ev_substation_input_hatch_64a": "§5EV 64A енергетичний люк підстанції", + "block.gtceu.ev_substation_output_hatch_64a": "§5EV 64A динамо-люк підстанції", + "block.gtceu.ev_super_chest": "Суперскриня IV", + "block.gtceu.ev_super_tank": "Суперрезервуар IV", + "block.gtceu.ev_thermal_centrifuge": "§5Вдосконалена термічна центрифуга III§r", + "block.gtceu.ev_transformer_16a": "§5Екстремальна напруга§r Силовий трансформатор", + "block.gtceu.ev_transformer_1a": "§5Екстремальна напруга§r Трансформатор", + "block.gtceu.ev_transformer_2a": "§5Екстремальна напруга§r Трансформатор високого струму (2x)", + "block.gtceu.ev_transformer_4a": "§5Екстремальна напруга§r Трансформатор високого струму (4x)", + "block.gtceu.ev_wiremill": "§5Вдосконалений волок III§r", + "block.gtceu.ev_world_accelerator": "§5Вдосконалений світовий прискорювач III§r", + "block.gtceu.explosion_hazard_sign_block": "Блок зі знаком вибухової небезпеки", + "block.gtceu.explosive.breaking_tooltip": "Вибухає від зламу, ламайте крадькома, щоб добути", + "block.gtceu.explosive.lighting_tooltip": "Не можна запалити редстоуном", + "block.gtceu.extreme_combustion_engine": "Екстремальний двигун внутрішнього згоряння", + "block.gtceu.extreme_engine_intake_casing": "Екстремальний впускний корпус двигуна", + "block.gtceu.filter_casing": "Фільтрувальний корпус", + "block.gtceu.fire_hazard_sign_block": "Блок зі знаком вогневої небезпеки", + "block.gtceu.firebricks": "Шамотна цегла", "block.gtceu.foam": "Піна", - "block.gtceu.frost_hazard_sign_block": "Табличка морозної небезпеки", - "block.gtceu.frostproof_machine_casing": "Морозостійка алюмінієва машинна обшивка", - "block.gtceu.fusion_casing": "Термоядерна машинна обшивка", - "block.gtceu.fusion_casing_mk2": "Термоядерна машинна обшивка MK II", - "block.gtceu.fusion_casing_mk3": "Термоядерна машинна обшивка MK III", - "block.gtceu.fusion_coil": "Термоядерна котушка", - "block.gtceu.fusion_glass": "Термоядерне скло", + "block.gtceu.frost_hazard_sign_block": "Блок зі знаком морозної небезпеки", + "block.gtceu.frostproof_machine_casing": "Морозостійкий алюмінієвий корпус машини", + "block.gtceu.fusion_casing": "Реакторний корпус машини", + "block.gtceu.fusion_casing_mk2": "Реакторний корпус машини MK II", + "block.gtceu.fusion_casing_mk3": "Реакторний корпус машини MK III", + "block.gtceu.fusion_coil": "Блок термоядерної котушки", + "block.gtceu.fusion_glass": "Скло реактора", "block.gtceu.gas_large_turbine": "Велика газова турбіна", - "block.gtceu.generic_hazard_sign_block": "Табличка загальної небезпеки", - "block.gtceu.gold_drum": "Золотий барабан", - "block.gtceu.gray_borderless_lamp": "Сіра лампа без меж", + "block.gtceu.generic_hazard_sign_block": "Блок зі знаком попередження", + "block.gtceu.gold_drum": "Золота бочка", + "block.gtceu.gray_borderless_lamp": "Сіра необлямована лампа", "block.gtceu.gray_lamp": "Сіра лампа", - "block.gtceu.gray_large_metal_sheet": "Сірий великий металевий лист", - "block.gtceu.gray_metal_sheet": "Сірий металевий лист", - "block.gtceu.gray_studs": "Сірі запонки", - "block.gtceu.green_borderless_lamp": "Зелена лампа без меж", + "block.gtceu.gray_large_metal_sheet": "Сіре велике металеве покриття", + "block.gtceu.gray_metal_sheet": "Сіре металеве покриття", + "block.gtceu.gray_studs": "Сірі кубики", + "block.gtceu.green_borderless_lamp": "Зелена необлямована лампа", "block.gtceu.green_lamp": "Зелена лампа", - "block.gtceu.green_large_metal_sheet": "Зелений великий металевий лист", - "block.gtceu.green_metal_sheet": "Зелений металевий лист", - "block.gtceu.green_studs": "Зелені запонки", - "block.gtceu.gregification_hazard_sign_block": "Табличка ґреґіфікаційної небезпеки", - "block.gtceu.heat_vent": "Теплова вентиляція", - "block.gtceu.heatproof_machine_casing": "Термостійка інварна машинна обшивка", - "block.gtceu.high_performance_computation_array": "Масив високопродуктивних обчислень (МВО)", - "block.gtceu.high_power_casing": "Корпус високої потужности", - "block.gtceu.high_pressure_hazard_sign_block": "Табличка високотискної небезпеки", - "block.gtceu.high_temperature_hazard_sign_block": "Табличка високотемпературної небезпеки", - "block.gtceu.high_temperature_smelting_casing": "Табличка температурно-топильної небезпеки", - "block.gtceu.high_voltage_hazard_sign_block": "Табличка високовольтної небезпеки", - "block.gtceu.hp_steam_alloy_smelter": "Паровий високотискний топильник сплавів", - "block.gtceu.hp_steam_compressor": "Паровий високотискний компресор", - "block.gtceu.hp_steam_extractor": "Паровий високотискний екстрактор", - "block.gtceu.hp_steam_forge_hammer": "Паровий високотискний ковальський молот", - "block.gtceu.hp_steam_furnace": "Парова високотискна піч", - "block.gtceu.hp_steam_liquid_boiler": "Паровий високотискний рідинний котел", - "block.gtceu.hp_steam_macerator": "Паровий високотискний подрібнювач", - "block.gtceu.hp_steam_miner": "Паровий високотискний добувник", - "block.gtceu.hp_steam_rock_crusher": "Паровий високотискний подрібнювач породи", - "block.gtceu.hp_steam_solar_boiler": "Паровий високотискний сонячний котел", - "block.gtceu.hp_steam_solid_boiler": "Паровий високотискний суцільний котел", - "block.gtceu.hpca_active_cooler_component": "Активний компонент охолодження МВО", - "block.gtceu.hpca_advanced_computation_component": "Покращений обчислювальний компонент МВО", - "block.gtceu.hpca_bridge_component": "Мостовий компонент МВО", - "block.gtceu.hpca_computation_component": "Обчислювальний компонент МВО", - "block.gtceu.hpca_empty_component": "Порожній компонент МВО", - "block.gtceu.hpca_heat_sink_component": "Тепловідвідний компонент МВО", - "block.gtceu.hssg_coil_block": "Котушка з HSS-G сталі", - "block.gtceu.huge_duct_pipe": "Величезний повітропровід", - "block.gtceu.hv_16a_energy_converter": "Конвертор енергії §6ВН§r 16§eA§r", - "block.gtceu.hv_1a_energy_converter": "Конвертор енергії §6ВН§r 1§eA§r", - "block.gtceu.hv_4a_energy_converter": "Конвертор енергії §6ВН§r 4§eA§r", - "block.gtceu.hv_8a_energy_converter": "Конвертор енергії §6ВН§r 8§eA§r", - "block.gtceu.hv_air_scrubber": "§6Покращений очисник повітря II§r", - "block.gtceu.hv_alloy_smelter": "§6Покращений топильник сплавів II§r", - "block.gtceu.hv_arc_furnace": "§6Покращена дугова піч II§r", - "block.gtceu.hv_assembler": "§6Покращений збирач II§r", - "block.gtceu.hv_autoclave": "§6Покращений автоклав II§r", - "block.gtceu.hv_battery_buffer_16x": "16x буфер батареї §6високої напруги§r", - "block.gtceu.hv_battery_buffer_4x": "4x буфер батареї §6високої напруги§r", - "block.gtceu.hv_battery_buffer_8x": "8x буфер батареї §6високої напруги§r", - "block.gtceu.hv_bedrock_ore_miner": "§6Покращений добувник руд корінної породи II§r", - "block.gtceu.hv_bender": "§6Покращений листозгинач II§r", - "block.gtceu.hv_block_breaker": "§6Покращений ламач блоків II§r", - "block.gtceu.hv_brewery": "§6Покращена варильня II§r", - "block.gtceu.hv_buffer": "§6Покращений буфер II§r", - "block.gtceu.hv_canner": "§6Покращений консерватор II§r", - "block.gtceu.hv_centrifuge": "§6Покращена центрифуга II§r", - "block.gtceu.hv_charger_4x": "4x турбозарядка §6високої напруги§r", - "block.gtceu.hv_chemical_bath": "§6Покращена хімічна ванна II§r", - "block.gtceu.hv_chemical_reactor": "§6Покращений хімічний реактор II§r", - "block.gtceu.hv_circuit_assembler": "§6Покращений збирач схем II§r", - "block.gtceu.hv_combustion": "§6Покращений двигун внутрішнього згоряння II§r", - "block.gtceu.hv_compressor": "§6Покращений компресор II§r", - "block.gtceu.hv_cutter": "§6Покращена різальна машина II§r", - "block.gtceu.hv_diode": "§6Діод ВН", - "block.gtceu.hv_distillery": "§6Покращений дистилятор II§r", - "block.gtceu.hv_electric_furnace": "§6Покращена електрична піч II§r", - "block.gtceu.hv_electrolyzer": "§6Покращений електролізер II§r", - "block.gtceu.hv_electromagnetic_separator": "§6Покращений електоромагнітний розділювач II§r", - "block.gtceu.hv_energy_input_hatch": "§6Вхідний роз'єм енергії ВН", - "block.gtceu.hv_energy_output_hatch": "§6Вихідний роз'єм енергії ВН", - "block.gtceu.hv_extractor": "§6Покращений екстрактор II§r", - "block.gtceu.hv_extruder": "§6Покращений екструдор II§r", - "block.gtceu.hv_fermenter": "§6Покращений ферментатор II§r", - "block.gtceu.hv_fisher": "§6Покращений рибак II§r", - "block.gtceu.hv_fluid_drilling_rig": "§6Покращена рідинна бурова установка II§r", - "block.gtceu.hv_fluid_heater": "§6Покращений рідинний обігрівач II§r", - "block.gtceu.hv_fluid_passthrough_hatch": "§6Прохідний рідинний шлюз ВН", - "block.gtceu.hv_fluid_solidifier": "§6Покращений рідинний затверджувач II§r", - "block.gtceu.hv_forge_hammer": "§6Покращений ковальський молот II§r", - "block.gtceu.hv_forming_press": "§6Покращений формувальний прес II§r", - "block.gtceu.hv_gas_collector": "§6Покращений повітрозабірник II§r", - "block.gtceu.hv_gas_turbine": "§6Покращений газовий турбінний генератор II§r", - "block.gtceu.hv_hermetic_casing": "Герметична обшивка III", - "block.gtceu.hv_input_bus": "§6Вхідна предметна шина ВН", - "block.gtceu.hv_input_hatch": "§6Вхідний рідинний шлюз ВН", - "block.gtceu.hv_item_collector": "§6Покращений збирач предметів II§r", - "block.gtceu.hv_item_passthrough_hatch": "§6Прохідний предметний шлюз ВН", - "block.gtceu.hv_laser_engraver": "§6Покращений лазерний гравер II§r", - "block.gtceu.hv_lathe": "§6Покращений токарний верстат II§r", - "block.gtceu.hv_macerator": "§6Покращений подрібнювач II§r", - "block.gtceu.hv_machine_casing": "Машинна обшивка ВН", - "block.gtceu.hv_machine_hull": "Машинний корпус §6ВН§f", - "block.gtceu.hv_miner": "§6Покращений добувник II§r", - "block.gtceu.hv_mixer": "§6Покращений змішувач II§r", - "block.gtceu.hv_muffler_hatch": "Заглушений шлюз §6ВН", - "block.gtceu.hv_ore_washer": "§6Покращений очищувач руд II§r", - "block.gtceu.hv_output_bus": "§6Вихідна предметна шина ВН", - "block.gtceu.hv_output_hatch": "§6Вихідний рідинний шлюз ВН", - "block.gtceu.hv_packer": "§6Покращений пакувальник II§r", - "block.gtceu.hv_polarizer": "§6Покращений намагнічувач II§r", - "block.gtceu.hv_pump": "§6Покращена помпа II§r", - "block.gtceu.hv_rock_crusher": "§6Покращений подрібнювач породи II§r", - "block.gtceu.hv_rotor_holder": "§6Тримач ротора ВН", - "block.gtceu.hv_scanner": "§6Покращений сканер II§r", - "block.gtceu.hv_sifter": "§6Покращений просіювач II§r", - "block.gtceu.hv_steam_turbine": "§6Покращений паровий турбінний генераторII§r", - "block.gtceu.hv_super_chest": "Надскриня III", - "block.gtceu.hv_super_tank": "Надбак III", - "block.gtceu.hv_thermal_centrifuge": "§6Покращена термоцентрифуга II§r", - "block.gtceu.hv_transformer_16a": "Сильний трансформатор §6високої напруги§r", - "block.gtceu.hv_transformer_1a": "Трансформатор §6високої напруги§r", - "block.gtceu.hv_transformer_2a": "2x трансформатор §6високої напруги§r", - "block.gtceu.hv_transformer_4a": "4x трансформатор §6високої напруги§r", - "block.gtceu.hv_wiremill": "§6Покращений прокатний станок II§r", - "block.gtceu.hv_world_accelerator": "§6Покращений світовий прискорювач II§r", - "block.gtceu.implosion_compressor": "Вибуховий копресор", - "block.gtceu.industrial_steam_casing": "Промислова парова обшивка", + "block.gtceu.green_large_metal_sheet": "Зелене велике металеве покриття", + "block.gtceu.green_metal_sheet": "Зелене металеве покриття", + "block.gtceu.green_studs": "Зелені кубики", + "block.gtceu.gregification_hazard_sign_block": "Блок зі знаком грегіфікаційної небезпеки", + "block.gtceu.heat_vent": "Тепловідвід", + "block.gtceu.heatproof_machine_casing": "Термостійкий інваровий корпус машини", + "block.gtceu.high_performance_computation_array": "Високопродуктивний обчислювальний масив (ВОМ)", + "block.gtceu.high_power_casing": "Високопотужний корпус", + "block.gtceu.high_pressure_hazard_sign_block": "Блок зі знаком небезпеки високого тиску", + "block.gtceu.high_temperature_hazard_sign_block": "Блок зі знаком небезпеки високої температури", + "block.gtceu.high_temperature_smelting_casing": "Корпус для високотемпературного плавлення", + "block.gtceu.high_voltage_hazard_sign_block": "Блок зі знаком небезпеки високої напруги", + "block.gtceu.hp_steam_alloy_smelter": "Парова плавильня сплавів під високим тиском", + "block.gtceu.hp_steam_compressor": "Паровий компресор під високим тиском", + "block.gtceu.hp_steam_extractor": "Паровий екстрактор під високим тиском", + "block.gtceu.hp_steam_forge_hammer": "Паровий ковальський молот під високим тиском", + "block.gtceu.hp_steam_furnace": "Парова піч під високим тиском", + "block.gtceu.hp_steam_liquid_boiler": "Паровий рідинний котел під високим тиском", + "block.gtceu.hp_steam_macerator": "Паровий подрібнювач під високим тиском", + "block.gtceu.hp_steam_miner": "Паровий бур під високим тиском", + "block.gtceu.hp_steam_rock_crusher": "Парова кам'яна дробарка під високим тиском", + "block.gtceu.hp_steam_solar_boiler": "Паровий сонячний котел під високим тиском", + "block.gtceu.hp_steam_solid_boiler": "Паровий твердопаливний котел під високим тиском", + "block.gtceu.hpca_active_cooler_component": "ВОМ-активний охолоджувальний компонент", + "block.gtceu.hpca_advanced_computation_component": "ВОМ-вдосконалений обчислювальний компонент", + "block.gtceu.hpca_bridge_component": "ВОМ-мостовий компонент", + "block.gtceu.hpca_computation_component": "ВОМ-обчислювальний компонент", + "block.gtceu.hpca_empty_component": "Порожній ВОМ-компонент", + "block.gtceu.hpca_heat_sink_component": "ВОМ-радіаторний компонент", + "block.gtceu.hssg_coil_block": "Блок HSS-G котушки", + "block.gtceu.huge_duct_pipe": "Величезна вентиляційна труба", + "block.gtceu.hv_16a_energy_converter": "§6HV§r 16§eA§r енергетичний конвертер", + "block.gtceu.hv_1a_energy_converter": "§6HV§r 1§eA§r енергетичний конвертер", + "block.gtceu.hv_4a_energy_converter": "§6HV§r 4§eA§r енергетичний конвертер", + "block.gtceu.hv_8a_energy_converter": "§6HV§r 8§eA§r енергетичний конвертер", + "block.gtceu.hv_air_scrubber": "§6Вдосконалений очисник повітря II§r", + "block.gtceu.hv_alloy_smelter": "§6Вдосконалена плавильня сплавів II§r", + "block.gtceu.hv_arc_furnace": "§6Вдосконалена дугова піч II§r", + "block.gtceu.hv_assembler": "§6Вдосконалений збирач II§r", + "block.gtceu.hv_autoclave": "§6Вдосконалений автоклав II§r", + "block.gtceu.hv_battery_buffer_16x": "§6Висока напруга§r 16x акумуляторний буфер", + "block.gtceu.hv_battery_buffer_4x": "§6Висока напруга§r 4x акумуляторний буфер", + "block.gtceu.hv_battery_buffer_8x": "§6Висока напруга§r 8x акумуляторний буфер", + "block.gtceu.hv_bedrock_ore_miner": "§6Вдосконалений глибокореневий бур II§r", + "block.gtceu.hv_bender": "§6Вдосконалений згинач II§r", + "block.gtceu.hv_block_breaker": "§6Вдосконалений руйнівник блоків II§r", + "block.gtceu.hv_brewery": "§6Вдосконалений варильник II§r", + "block.gtceu.hv_buffer": "§6Вдосконалений буфер II§r", + "block.gtceu.hv_canner": "§6Вдосконалений пакувальник II§r", + "block.gtceu.hv_centrifuge": "§6Вдосконалена центрифуга II§r", + "block.gtceu.hv_charger_4x": "§6Висока напруга§r 4x турбозарядник", + "block.gtceu.hv_chemical_bath": "§6Вдосконалена хімічна ванна II§r", + "block.gtceu.hv_chemical_reactor": "§6Вдосконалений хімічний реактор II§r", + "block.gtceu.hv_circuit_assembler": "§6Вдосконалений схемотехнічний збирач II§r", + "block.gtceu.hv_combustion": "§6Вдосконалений генератор внутрішнього згоряння II§r", + "block.gtceu.hv_compressor": "§6Вдосконалений компресор II§r", + "block.gtceu.hv_cutter": "§6Вдосконалений різак II§r", + "block.gtceu.hv_diode": "§6HV діод", + "block.gtceu.hv_distillery": "§6Вдосконалений дистилятор II§r", + "block.gtceu.hv_electric_furnace": "§6Вдосконалена електрична піч II§r", + "block.gtceu.hv_electrolyzer": "§6Вдосконалений електролізер II§r", + "block.gtceu.hv_electromagnetic_separator": "§6Вдосконалений електромагнітний сепаратор II§r", + "block.gtceu.hv_energy_input_hatch": "§6HV енергетичний люк", + "block.gtceu.hv_energy_output_hatch": "§6HV динамо-люк", + "block.gtceu.hv_extractor": "§6Вдосконалений екстрактор II§r", + "block.gtceu.hv_extruder": "§6Вдосконалений екструдер II§r", + "block.gtceu.hv_fermenter": "§6Вдосконалений ферментатор II§r", + "block.gtceu.hv_fisher": "§6Вдосконалений рибалка II§r", + "block.gtceu.hv_fluid_drilling_rig": "§6Вдосконалена рідинна бурова устава II§r", + "block.gtceu.hv_fluid_heater": "§6Вдосконалений рідинний нагрівач II§r", + "block.gtceu.hv_fluid_passthrough_hatch": "§6HV прохідний рідинний люк", + "block.gtceu.hv_fluid_solidifier": "§6Вдосконалений рідинний затверджувач II§r", + "block.gtceu.hv_forge_hammer": "§6Вдосконалений ковальський молот II§r", + "block.gtceu.hv_forming_press": "§6Вдосконалений формовий прес II§r", + "block.gtceu.hv_gas_collector": "§6Вдосконалений газозбірник II§r", + "block.gtceu.hv_gas_turbine": "§6Вдосконалений газотурбінний генератор II§r", + "block.gtceu.hv_hermetic_casing": "Герметичний корпус III", + "block.gtceu.hv_input_bus": "§6HV вхідна шина", + "block.gtceu.hv_input_hatch": "§6HV ввідний люк", + "block.gtceu.hv_item_collector": "§6Вдосконалений предметний збирач II§r", + "block.gtceu.hv_item_passthrough_hatch": "§6HV прохідний предметний люк", + "block.gtceu.hv_laser_engraver": "§6Вдосконалений літограф II§r", + "block.gtceu.hv_lathe": "§6Вдосконалений токар II§r", + "block.gtceu.hv_macerator": "§6Вдосконалений подрібнювач II§r", + "block.gtceu.hv_machine_casing": "HV корпус машини", + "block.gtceu.hv_machine_hull": "§6HV§f машинна основа", + "block.gtceu.hv_miner": "§6Вдосконалений бур II§r", + "block.gtceu.hv_mixer": "§6Вдосконалений змішувач II§r", + "block.gtceu.hv_muffler_hatch": "Люк вихлопу§6 HV", + "block.gtceu.hv_ore_washer": "§6Вдосконалений рудопромивач II§r", + "block.gtceu.hv_output_bus": "§6HV вихідна шина", + "block.gtceu.hv_output_hatch": "§6HV вивідний люк", + "block.gtceu.hv_packer": "§6Вдосконалений пакувальник II§r", + "block.gtceu.hv_polarizer": "§6Вдосконалений намагнічувач II§r", + "block.gtceu.hv_pump": "§6Вдосконалена помпа II§r", + "block.gtceu.hv_rock_crusher": "§6Вдосконалена кам'яна дробарка II§r", + "block.gtceu.hv_rotor_holder": "§6HV тримач ротора", + "block.gtceu.hv_scanner": "§6Вдосконалений сканер II§r", + "block.gtceu.hv_sifter": "§6Вдосконалений просіювач II§r", + "block.gtceu.hv_steam_turbine": "§6Вдосконалений паротурбінний генератор II§r", + "block.gtceu.hv_super_chest": "Суперскриня III", + "block.gtceu.hv_super_tank": "Суперрезервуар III", + "block.gtceu.hv_thermal_centrifuge": "§6Вдосконалена термічна центрифуга II§r", + "block.gtceu.hv_transformer_16a": "§6Висока напруга§r Силовий трансформатор", + "block.gtceu.hv_transformer_1a": "§6Висока напруга§r Трансформатор", + "block.gtceu.hv_transformer_2a": "§6Висока напруга§r Трансформатор високого струму (2x)", + "block.gtceu.hv_transformer_4a": "§6Висока напруга§r Трансформатор високого струму (4x)", + "block.gtceu.hv_wiremill": "§6Вдосконалений волок II§r", + "block.gtceu.hv_world_accelerator": "§6Вдосконалений світовий прискорювач II§r", + "block.gtceu.implosion_compressor": "Компресор надмірного тиску", + "block.gtceu.industrial_steam_casing": "Промисловий паровий корпус", "block.gtceu.industrial_tnt": "Промисловий динаміт", - "block.gtceu.inert_machine_casing": "Хімічно-інертниа ПТФЕ машинна обшивка", - "block.gtceu.itnt.drops_tooltip": "Набагато більший, ніж звичайний динаміт та викидає всі знищені блоки як предмети", - "block.gtceu.iv_1024a_laser_source_hatch": "Лазерно-джерельний роз'єм §9БН§r 1,024§eA§r", - "block.gtceu.iv_1024a_laser_target_hatch": "Лазерно-цільовий роз'єм §9БН§r 1,024§eA§r", - "block.gtceu.iv_16a_energy_converter": "Конвертор енергії §9БН§r 16§eA§r", - "block.gtceu.iv_1a_energy_converter": "Конвертор енергії §9БН§r 1§eA§r", - "block.gtceu.iv_256a_laser_source_hatch": "Лазерно-джерельний роз'єм §9БН§r 256§eA§r", - "block.gtceu.iv_256a_laser_target_hatch": "Лазерно-цільовий роз'єм §9БН§r 256§eA§r", - "block.gtceu.iv_4096a_laser_source_hatch": "Лазерно-джерельний роз'єм §9БН§r 4,096§eA§r ", - "block.gtceu.iv_4096a_laser_target_hatch": "Лазерно-цільовий роз'єм §9БН§r 4,096§eA§r", - "block.gtceu.iv_4a_energy_converter": "Конвертор енергії §9БН§r 4§eA§r", - "block.gtceu.iv_8a_energy_converter": "Конвертор енергії §9БН§r 8§eA§r", - "block.gtceu.iv_alloy_smelter": "§9Елітний топильник сплавів§r", - "block.gtceu.iv_arc_furnace": "§9Елітна дугова піч§r", - "block.gtceu.iv_assembler": "§9Елітний збирач§r", - "block.gtceu.iv_autoclave": "§9Елітний автоклав§r", - "block.gtceu.iv_battery_buffer_16x": "16x буфер батареї §9божевільної напруги§r", - "block.gtceu.iv_battery_buffer_4x": "4x буфер батареї §9божевільної напруги§r", - "block.gtceu.iv_battery_buffer_8x": "8x буфер батареї §9божевільної напруги§r'", - "block.gtceu.iv_bender": "§9Елітний листозгинач§r", - "block.gtceu.iv_brewery": "§9Елітна варильня§r", - "block.gtceu.iv_canner": "§9Елітний консерватор§r", - "block.gtceu.iv_centrifuge": "§9Елітна центрифуга§r", - "block.gtceu.iv_charger_4x": "4x турбозарядка §9божевільної напруги§r", - "block.gtceu.iv_chemical_bath": "§9Елітна хімічна ванна§r", - "block.gtceu.iv_chemical_reactor": "§9Елітний хімічний реактор§r", - "block.gtceu.iv_circuit_assembler": "§9Eлітний збирач схем§r", - "block.gtceu.iv_compressor": "§9Елітний компресор§r", - "block.gtceu.iv_cutter": "§9Елітна різальна машина§r", - "block.gtceu.iv_diode": "§9Діод БН", - "block.gtceu.iv_distillery": "§9Елітний дистилятор§r", - "block.gtceu.iv_electric_furnace": "§9Елітна електрична піч§r", - "block.gtceu.iv_electrolyzer": "§9Електричний електролізер§r", - "block.gtceu.iv_electromagnetic_separator": "§9Елітний електоромагнітний розділювач§r", - "block.gtceu.iv_energy_input_hatch": "§9Вхідний роз'єм енергії БН", - "block.gtceu.iv_energy_input_hatch_16a": "§9Вхідний роз'єм енергії БН 16A", - "block.gtceu.iv_energy_input_hatch_4a": "§9Вхідний роз'єм енергії БН 4A", - "block.gtceu.iv_energy_output_hatch": "§9Вихідний роз'єм енергії БН", - "block.gtceu.iv_energy_output_hatch_16a": "§9Вихідний роз'єм енергії БН 16A", - "block.gtceu.iv_energy_output_hatch_4a": "§9Вихідний роз'єм енергії БН 4A", - "block.gtceu.iv_extractor": "§9Елітний екстрактор §r", - "block.gtceu.iv_extruder": "§9Елітний екструдор§r", - "block.gtceu.iv_fermenter": "§9Елітний ферментатор§r", - "block.gtceu.iv_fisher": "§9Елітний рибак§r", - "block.gtceu.iv_fluid_heater": "§9Елітний рідинний обігрівач§r", - "block.gtceu.iv_fluid_passthrough_hatch": "§9Прохідний рідинний шлюз БН", - "block.gtceu.iv_fluid_solidifier": "§9Елітний рідинний затверджувач§r", - "block.gtceu.iv_forge_hammer": "§9Елітний ковальський молот§r", - "block.gtceu.iv_forming_press": "§9Елітний формувальний прес§r", - "block.gtceu.iv_gas_collector": "§9Елітний повітрозабірник§r", - "block.gtceu.iv_hermetic_casing": "Герметична обшивка V", - "block.gtceu.iv_input_bus": "§9Вхідна предметна шина БН", - "block.gtceu.iv_input_hatch": "§9Вхідний рідинний шлюз БН", - "block.gtceu.iv_input_hatch_4x": "§9Четверний вхідний рідинний шлюз БН", - "block.gtceu.iv_input_hatch_9x": "§9Непарний вхідний рідинний шлюз БН", - "block.gtceu.iv_item_passthrough_hatch": "§9Прохідний предметний шлюз БН", - "block.gtceu.iv_lapotronic_battery": "Лапотронний конденсатор БН", - "block.gtceu.iv_large_miner": "§9Елітний велики добувник§r", - "block.gtceu.iv_laser_engraver": "§9Елітний лазерний гравер§r", - "block.gtceu.iv_lathe": "§9Елітний токарний верстат§r", - "block.gtceu.iv_macerator": "§9Елітний подрібнювач§r", - "block.gtceu.iv_machine_casing": "Машинна обшивка БН", - "block.gtceu.iv_machine_hull": "Машинний корпус §9БН§f", - "block.gtceu.iv_mixer": "§9Елітний змішувач§r", - "block.gtceu.iv_muffler_hatch": "Заглушений шлюз §9БН", - "block.gtceu.iv_ore_washer": "§9Елітний очищувач руд§r", - "block.gtceu.iv_output_bus": "§9Вихідна предметна шина БН", - "block.gtceu.iv_output_hatch": "§9Вихідний рідинний шлюз БН", - "block.gtceu.iv_output_hatch_4x": "§9Четвернийвихідний рідинний шлюз БН", - "block.gtceu.iv_output_hatch_9x": "§9Непарний вихідний рідинний шлюз БН", - "block.gtceu.iv_packer": "§9Елітний пакувальник§r", - "block.gtceu.iv_parallel_hatch": "Елітний шлюз паралельного контролю", - "block.gtceu.iv_polarizer": "§9Елітний намагнічувач§r", + "block.gtceu.inert_machine_casing": "Хімічно інертний ПТФЕ корпус машини", + "block.gtceu.itnt.drops_tooltip": "Добуває усі знищені блоки так само, як динаміт, але з набагато більшим радіусом", + "block.gtceu.iv_1024a_laser_source_hatch": "§9IV§r 1,024§eA§r люк джерела лазера", + "block.gtceu.iv_1024a_laser_target_hatch": "§9IV§r 1,024§eA§r люк цілі лазера", + "block.gtceu.iv_16a_energy_converter": "§9IV§r 16§eA§r енергетичний конвертер", + "block.gtceu.iv_1a_energy_converter": "§9IV§r 1§eA§r енергетичний конвертер", + "block.gtceu.iv_256a_laser_source_hatch": "§9IV§r 256§eA§r люк джерела лазера", + "block.gtceu.iv_256a_laser_target_hatch": "§9IV§r 256§eA§r люк цілі лазера", + "block.gtceu.iv_4096a_laser_source_hatch": "§9IV§r 4,096§eA§r люк джерела лазера", + "block.gtceu.iv_4096a_laser_target_hatch": "§9IV§r 4,096§eA§r люк цілі лазера", + "block.gtceu.iv_4a_energy_converter": "§9IV§r 4§eA§r енергетичний конвертер", + "block.gtceu.iv_8a_energy_converter": "§9IV§r 8§eA§r енергетичний конвертер", + "block.gtceu.iv_alloy_smelter": "§9Елітна плавильня сплавів §r ", + "block.gtceu.iv_arc_furnace": "§9Елітна дугова піч§r ", + "block.gtceu.iv_assembler": "§9Елітний збирач§r ", + "block.gtceu.iv_autoclave": "§9Елітний автоклав§r ", + "block.gtceu.iv_battery_buffer_16x": "§9Божевільна напруга§r 16x акумуляторний буфер", + "block.gtceu.iv_battery_buffer_4x": "§9Божевільна напруга§r 4x акумуляторний буфер", + "block.gtceu.iv_battery_buffer_8x": "§9Божевільна напруга§r 8x акумуляторний буфер", + "block.gtceu.iv_bender": "§9Елітний згинач§r ", + "block.gtceu.iv_brewery": "§9Елітний варильник§r ", + "block.gtceu.iv_canner": "§9Елітний пакувальник§r ", + "block.gtceu.iv_centrifuge": "§9Елітна центрифуга§r ", + "block.gtceu.iv_charger_4x": "§9Божевільна напруга§r 4x турбозарядник", + "block.gtceu.iv_chemical_bath": "§9Елітна хімічна ванна§r ", + "block.gtceu.iv_chemical_reactor": "§9Елітний хімічний реактор§r ", + "block.gtceu.iv_circuit_assembler": "§9Елітний схемотехнічний збирач§r ", + "block.gtceu.iv_compressor": "§9Елітний компресор§r ", + "block.gtceu.iv_cutter": "§9Елітний різак§r ", + "block.gtceu.iv_diode": "§9IV діод", + "block.gtceu.iv_distillery": "§9Елітний дистилятор§r ", + "block.gtceu.iv_electric_furnace": "§9Елітна електрична піч§r ", + "block.gtceu.iv_electrolyzer": "§9Елітний електролізер§r ", + "block.gtceu.iv_electromagnetic_separator": "§9Елітний електромагнітний сепаратор§r ", + "block.gtceu.iv_energy_input_hatch": "§9IV енергетичний люк", + "block.gtceu.iv_energy_input_hatch_16a": "§9IV 16A енергетичний люк", + "block.gtceu.iv_energy_input_hatch_4a": "§9IV 4A енергетичний люк", + "block.gtceu.iv_energy_output_hatch": "§9IV динамо-люк", + "block.gtceu.iv_energy_output_hatch_16a": "§9IV 16A динамо-люк", + "block.gtceu.iv_energy_output_hatch_4a": "§9IV 4A динамо-люк", + "block.gtceu.iv_extractor": "§9Елітний екстрактор§r ", + "block.gtceu.iv_extruder": "§9Елітний екструдер§r ", + "block.gtceu.iv_fermenter": "§9Елітний ферментатор§r ", + "block.gtceu.iv_fisher": "§9Елітний рибалка§r ", + "block.gtceu.iv_fluid_heater": "§9Елітний рідинний нагрівач§r ", + "block.gtceu.iv_fluid_passthrough_hatch": "§9IV прохідний рідинний люк", + "block.gtceu.iv_fluid_solidifier": "§9Елітний рідинний затверджувач§r ", + "block.gtceu.iv_forge_hammer": "§9Елітний ковальський молот§r ", + "block.gtceu.iv_forming_press": "§9Елітний формовий прес§r ", + "block.gtceu.iv_gas_collector": "§9Елітний газозбірник§r ", + "block.gtceu.iv_hermetic_casing": "Герметичний корпус V", + "block.gtceu.iv_input_bus": "§9IV вхідна шина", + "block.gtceu.iv_input_hatch": "§9IV ввідний люк", + "block.gtceu.iv_input_hatch_4x": "§9IV чотирикамерний ввідний люк", + "block.gtceu.iv_input_hatch_9x": "§9IV дев'ятикамерний ввідний люк", + "block.gtceu.iv_item_passthrough_hatch": "§9IV прохідний предметний люк", + "block.gtceu.iv_lapotronic_battery": "IV лапотронний акумулятор", + "block.gtceu.iv_large_miner": "§9Елітний великий бур §r ", + "block.gtceu.iv_laser_engraver": "§9Елітний літограф§r ", + "block.gtceu.iv_lathe": "§9Елітний токар§r ", + "block.gtceu.iv_macerator": "§9Елітний подрібнювач§r ", + "block.gtceu.iv_machine_casing": "IV корпус машини", + "block.gtceu.iv_machine_hull": "§9IV§f машинна основа", + "block.gtceu.iv_mixer": "§9Елітний змішувач§r ", + "block.gtceu.iv_muffler_hatch": "Люк вихлопу§9 IV", + "block.gtceu.iv_ore_washer": "§9Елітний рудопромивач§r ", + "block.gtceu.iv_output_bus": "§9IV вихідна шина", + "block.gtceu.iv_output_hatch": "§9IV вивідний люк", + "block.gtceu.iv_output_hatch_4x": "§9IV чотирикамерний вивідний люк", + "block.gtceu.iv_output_hatch_9x": "§9IV дев'ятикамерний вивідний люк", + "block.gtceu.iv_packer": "§9Елітний пакувальник§r ", + "block.gtceu.iv_parallel_hatch": "Елітний люк паралельного контролю", + "block.gtceu.iv_polarizer": "§9Елітний намагнічувач§r ", "block.gtceu.iv_quantum_chest": "Квантова скриня V", - "block.gtceu.iv_quantum_tank": "Квантовий бак V", - "block.gtceu.iv_rock_crusher": "§9Елітний подрібнювач породи§r", - "block.gtceu.iv_rotor_holder": "§9Тримач ротора БН", - "block.gtceu.iv_scanner": "§9Елітний сканер§r", - "block.gtceu.iv_sifter": "§9Елітний просіювач§r", - "block.gtceu.iv_substation_input_hatch_64a": "§9Вхідна підстанція роз'єму енергії БН 64A", - "block.gtceu.iv_substation_output_hatch_64a": "§9Вихідна підстанція роз'єму енергії БН 64A", - "block.gtceu.iv_thermal_centrifuge": "§9Елітна термоцентрифуга§r", - "block.gtceu.iv_transformer_16a": "Сильний трансформатор §9божевільної напруги§r", - "block.gtceu.iv_transformer_1a": "Трансформатор §9божевільної напруги§r", - "block.gtceu.iv_transformer_2a": "2x трансформатор §9божевільної напруги§r", - "block.gtceu.iv_transformer_4a": "4x трансформатор §9божевільної напруги§r", - "block.gtceu.iv_wiremill": "§9Елітний прокатний станок§r", - "block.gtceu.iv_world_accelerator": "§9Елітний світовий прискорювач§r", - "block.gtceu.kanthal_coil_block": "Канталева котушка", - "block.gtceu.laminated_glass": "Ламіноване скло", - "block.gtceu.lamp.tooltip.inverted": "Інвертовано", - "block.gtceu.lamp.tooltip.no_bloom": "Не пропускає світло", - "block.gtceu.lamp.tooltip.no_light": "Темно", - "block.gtceu.large_arc_smelter": "Великий дуговий топильник", - "block.gtceu.large_assembler": "Великий збиральний завод", - "block.gtceu.large_autoclave": "Велика камера кристалізації", - "block.gtceu.large_brewer": "Велика варильня діжка", - "block.gtceu.large_centrifuge": "Одиниця великої центрифуги", + "block.gtceu.iv_quantum_tank": "Квантовий резервуар V", + "block.gtceu.iv_rock_crusher": "§9Елітна кам'яна дробарка§r ", + "block.gtceu.iv_rotor_holder": "§9IV тримач ротора", + "block.gtceu.iv_scanner": "§9Елітний сканер§r ", + "block.gtceu.iv_sifter": "§9Елітний просіювач§r ", + "block.gtceu.iv_substation_input_hatch_64a": "§9IV 64A енергетичний люк підстанції", + "block.gtceu.iv_substation_output_hatch_64a": "§9IV 64A динамо-люк підстанції", + "block.gtceu.iv_thermal_centrifuge": "§9Елітна термічна центрифуга§r ", + "block.gtceu.iv_transformer_16a": "§9Божевільна напруга§r Силовий трансформатор", + "block.gtceu.iv_transformer_1a": "§9Божевільна напруга§r Трансформатор", + "block.gtceu.iv_transformer_2a": "§9Божевільна напруга§r Трансформатор високого струму (2x)", + "block.gtceu.iv_transformer_4a": "§9Божевільна напруга§r Трансформатор високого струму (4x)", + "block.gtceu.iv_wiremill": "§9Елітний волок§r ", + "block.gtceu.iv_world_accelerator": "§9Елітний світовий прискорювач§r ", + "block.gtceu.kanthal_coil_block": "Блок канталової котушки", + "block.gtceu.laminated_glass": "Багатошарове скло", + "block.gtceu.lamp.tooltip.inverted": "Інвертована", + "block.gtceu.lamp.tooltip.no_bloom": "Не мерехтить", + "block.gtceu.lamp.tooltip.no_light": "Не світить", + "block.gtceu.large_arc_smelter": "Велика дугова плавильна піч", + "block.gtceu.large_assembler": "Велика складальна фабрика", + "block.gtceu.large_autoclave": "Велика кристалізаційна камера", + "block.gtceu.large_brewer": "Великий варильний чан", + "block.gtceu.large_centrifuge": "Велика відцентрова устава", "block.gtceu.large_chemical_bath": "Велика хімічна ванна", "block.gtceu.large_chemical_reactor": "Великий хімічний реактор", - "block.gtceu.large_circuit_assembler": "Великий збиральний завод схем", + "block.gtceu.large_circuit_assembler": "Великий схемотехнічний складальний комплекс", "block.gtceu.large_combustion_engine": "Великий двигун внутрішнього згоряння", - "block.gtceu.large_cutter": "Велика пила", + "block.gtceu.large_cutter": "Велика відрізна пила", "block.gtceu.large_distillery": "Великий фракційний дистилятор", - "block.gtceu.large_duct_pipe": "Великий повітропровід", - "block.gtceu.large_electrolyzer": "Велика камера електролізації", + "block.gtceu.large_duct_pipe": "Велика вентиляційна труба", + "block.gtceu.large_electrolyzer": "Велика електролізна камера", "block.gtceu.large_electromagnet": "Великий електромагніт", - "block.gtceu.large_engraving_laser": "Великий лазерний гравер", - "block.gtceu.large_extractor": "Великий екстрактор", - "block.gtceu.large_extruder": "Великий екструдор", + "block.gtceu.large_engraving_laser": "Великий літограф", + "block.gtceu.large_extractor": "Велика екстракційна машина", + "block.gtceu.large_extruder": "Велика екструзійна машина", "block.gtceu.large_maceration_tower": "Велика подрібнювальна вежа", - "block.gtceu.large_material_press": "Великий прес матеріалів", - "block.gtceu.large_mixer": "Великий змішувач", - "block.gtceu.large_packer": "Великий пакувальник", - "block.gtceu.large_scale_assembler_casing": "Великий корпус збирача", - "block.gtceu.large_sifting_funnel": "Великий просіювач", - "block.gtceu.large_solidifier": "Великий затверджувач", - "block.gtceu.large_wiremill": "Великий завод дротів", - "block.gtceu.laser_hazard_sign_block": "Табличка лазерної небезпеум", - "block.gtceu.laser_safe_engraving_casing": "Лазеростійка граверна обшивка", - "block.gtceu.light_blue_borderless_lamp": "Блакитна лампа без меж", + "block.gtceu.large_material_press": "Великий матеріальний прес", + "block.gtceu.large_mixer": "Великий змішувальний бак", + "block.gtceu.large_packer": "Велика пакувальна машина", + "block.gtceu.large_scale_assembler_casing": "Корпус для великомасштабного збирання", + "block.gtceu.large_sifting_funnel": "Велика просіювальна лійка", + "block.gtceu.large_solidifier": "Великий масив затвердіння", + "block.gtceu.large_wiremill": "Велика дротова фабрика", + "block.gtceu.laser_hazard_sign_block": "Блок зі знаком лазерної небезпеки", + "block.gtceu.laser_safe_engraving_casing": "Захисний корпус для лазерного гравіювання", + "block.gtceu.light_blue_borderless_lamp": "Блакитна необлямована лампа", "block.gtceu.light_blue_lamp": "Блакитна лампа", - "block.gtceu.light_blue_large_metal_sheet": "Блакитний великий металевий лист", - "block.gtceu.light_blue_metal_sheet": "Блакитний металевий лист", - "block.gtceu.light_blue_studs": "Блакитні запонки", + "block.gtceu.light_blue_large_metal_sheet": "Блакитне велике металеве покриття", + "block.gtceu.light_blue_metal_sheet": "Блакитне металеве покриття", + "block.gtceu.light_blue_studs": "Блакитні кубики", "block.gtceu.light_concrete": "Світлий бетон", "block.gtceu.light_concrete_bricks": "Світла бетонна цегла", - "block.gtceu.light_concrete_cobblestone": "Кругляк світлого бетону", - "block.gtceu.light_concrete_small_tile": "Малі світлі бетонні кахлі", + "block.gtceu.light_concrete_cobblestone": "Світлий бетонний кругляк", + "block.gtceu.light_concrete_small_tile": "Світлі бетонні дрібні кахлі", "block.gtceu.light_concrete_tile": "Світлі бетонні кахлі", - "block.gtceu.light_concrete_windmill_a": "Млин А зі світлого бетону", - "block.gtceu.light_concrete_windmill_b": "Млин Б зі світлого бетону", - "block.gtceu.light_gray_borderless_lamp": "Світло-сіра лампа без меж", + "block.gtceu.light_concrete_windmill_a": "Світлий бетонний вітряк A", + "block.gtceu.light_concrete_windmill_b": "Світлий бетонний вітряк B", + "block.gtceu.light_gray_borderless_lamp": "Світло-сіра необлямована лампа", "block.gtceu.light_gray_lamp": "Світло-сіра лампа", - "block.gtceu.light_gray_large_metal_sheet": "Світло-сірий великий металевий лист", - "block.gtceu.light_gray_metal_sheet": "Світло-сірий металевий лист", - "block.gtceu.light_gray_studs": "Світло-сірізапонки", - "block.gtceu.lime_borderless_lamp": "Лаймова лампа без меж", + "block.gtceu.light_gray_large_metal_sheet": "Світло-сіре велике металеве покриття", + "block.gtceu.light_gray_metal_sheet": "Світло-сіре металеве покриття", + "block.gtceu.light_gray_studs": "Світло-сірі кубики", + "block.gtceu.lime_borderless_lamp": "Лаймова необлямована лампа", "block.gtceu.lime_lamp": "Лаймова лампа", - "block.gtceu.lime_large_metal_sheet": "Лаймовий великий металевий лист", - "block.gtceu.lime_metal_sheet": "Лаймовий металевий лист", - "block.gtceu.lime_studs": "Лаймові запонки", - "block.gtceu.long_distance_fluid_pipeline": "Рідинна труба великої відстані", - "block.gtceu.long_distance_fluid_pipeline_endpoint": "Кінець рідинної труби великої відстані", - "block.gtceu.long_distance_item_pipeline": "Предметна труба великої відстані", - "block.gtceu.long_distance_item_pipeline_endpoint": "Кінець предметної труби великої відстані", - "block.gtceu.long_distance_item_pipeline_input_endpoint": "Вхідний кінець", - "block.gtceu.long_distance_item_pipeline_input_pos": " — Вхід: %s", + "block.gtceu.lime_large_metal_sheet": "Лаймове велике металеве покриття", + "block.gtceu.lime_metal_sheet": "Лаймове металеве покриття", + "block.gtceu.lime_studs": "Лаймові кубики", + "block.gtceu.long_distance_fluid_pipeline": "Великодистанційний рідинний трубопровід", + "block.gtceu.long_distance_fluid_pipeline_endpoint": "Пункт призначення великодистанційного рідинного трубопроводу", + "block.gtceu.long_distance_item_pipeline": "Великодистанційний предметний трубопровід", + "block.gtceu.long_distance_item_pipeline_endpoint": "Пункт призначення великодистанційного предметного трубопроводу", + "block.gtceu.long_distance_item_pipeline_input_endpoint": "Вхід кінцевої точки", + "block.gtceu.long_distance_item_pipeline_input_pos": " - вхід: %s", "block.gtceu.long_distance_item_pipeline_network_header": "Мережа:", "block.gtceu.long_distance_item_pipeline_no_network": "Мережу не знайдено", - "block.gtceu.long_distance_item_pipeline_output_endpoint": "Вхідний кінець", - "block.gtceu.long_distance_item_pipeline_output_pos": " — Вихід: %s", - "block.gtceu.long_distance_item_pipeline_pipe_count": " — Труб: %s", - "block.gtceu.lp_steam_alloy_smelter": "Паровий низькотискний топильник сплавів", - "block.gtceu.lp_steam_compressor": "Паровий низькотискний компресор", - "block.gtceu.lp_steam_extractor": "Паровий низькотискний екстрактор", - "block.gtceu.lp_steam_forge_hammer": "Паровий низькотискний ковальський молот", - "block.gtceu.lp_steam_furnace": "Парова низькотискна піч", - "block.gtceu.lp_steam_liquid_boiler": "Паровий низькотискний рідинний котел", - "block.gtceu.lp_steam_macerator": "Паровий низькотискний подрібнювач", - "block.gtceu.lp_steam_miner": "Паровий низькотискний добувник", - "block.gtceu.lp_steam_rock_crusher": "Паровий низькотискний подрібнювач породи", - "block.gtceu.lp_steam_solar_boiler": "Паровий низькотискний сонячний котел", - "block.gtceu.lp_steam_solid_boiler": "Паровий низькотискний суцільний котел", - "block.gtceu.luv_1024a_laser_source_hatch": "Лазерно-джерельний роз'єм §dАН§r 1,024§eA§r", - "block.gtceu.luv_1024a_laser_target_hatch": "Лазерно-цільовий роз'єм §dАН§r 1,024§eA§r", - "block.gtceu.luv_16a_energy_converter": "Конвертор енергії §dАН§r 16§eA§r", - "block.gtceu.luv_1a_energy_converter": "Конвертор енергії §dАН§r 1§eA§r", - "block.gtceu.luv_256a_laser_source_hatch": "Лазерно-джерельний роз'єм §dАН§r 256§eA§r", - "block.gtceu.luv_256a_laser_target_hatch": "Лазерно-цільовий роз'єм §dАН§r 256§eA§r", - "block.gtceu.luv_4096a_laser_source_hatch": "Лазерно-джерельний роз'єм §dАН§r 4,096§eA§r", - "block.gtceu.luv_4096a_laser_target_hatch": "Лазерно-цільовий роз'єм §dАН§r 4,096§eA§r", - "block.gtceu.luv_4a_energy_converter": "Конвертор енергії §dАН§r 4§eA§r", - "block.gtceu.luv_8a_energy_converter": "Конвертор енергії §dАН§r 8§eA§r", - "block.gtceu.luv_alloy_smelter": "§dЕлітний топильник сплавів II§r", + "block.gtceu.long_distance_item_pipeline_output_endpoint": "Вихід кінцевої точки", + "block.gtceu.long_distance_item_pipeline_output_pos": " - вихід: %s", + "block.gtceu.long_distance_item_pipeline_pipe_count": " - труби: %s", + "block.gtceu.lp_steam_alloy_smelter": "Парова плавильня сплавів під низьким тиском", + "block.gtceu.lp_steam_compressor": "Паровий компресор під низьким тиском", + "block.gtceu.lp_steam_extractor": "Паровий екстрактор під низьким тиском", + "block.gtceu.lp_steam_forge_hammer": "Паровий ковальський молот під низьким тиском", + "block.gtceu.lp_steam_furnace": "Парова піч під низьким тиском", + "block.gtceu.lp_steam_liquid_boiler": "Паровий рідинний котел під низьким тиском", + "block.gtceu.lp_steam_macerator": "Паровий подрібнювач під низьким тиском", + "block.gtceu.lp_steam_miner": "Паровий бур під низьким тиском", + "block.gtceu.lp_steam_rock_crusher": "Парова кам'яна дробарка під низьким тиском", + "block.gtceu.lp_steam_solar_boiler": "Паровий сонячний котел під низьким тиском", + "block.gtceu.lp_steam_solid_boiler": "Паровий твердопаливний котел під низьким тиском", + "block.gtceu.luv_1024a_laser_source_hatch": "§dLuV§r 1,024§eA§r люк джерела лазера", + "block.gtceu.luv_1024a_laser_target_hatch": "§dLuV§r 1,024§eA§r люк цілі лазера", + "block.gtceu.luv_16a_energy_converter": "§dLuV§r 16§eA§r енергетичний конвертер", + "block.gtceu.luv_1a_energy_converter": "§dLuV§r 1§eA§r енергетичний конвертер", + "block.gtceu.luv_256a_laser_source_hatch": "§dLuV§r 256§eA§r люк джерела лазера", + "block.gtceu.luv_256a_laser_target_hatch": "§dLuV§r 256§eA§r люк цілі лазера", + "block.gtceu.luv_4096a_laser_source_hatch": "§dLuV§r 4,096§eA§r люк джерела лазера", + "block.gtceu.luv_4096a_laser_target_hatch": "§dLuV§r 4,096§eA§r люк цілі лазера", + "block.gtceu.luv_4a_energy_converter": "§dLuV§r 4§eA§r енергетичний конвертер", + "block.gtceu.luv_8a_energy_converter": "§dLuV§r 8§eA§r енергетичний конвертер", + "block.gtceu.luv_alloy_smelter": "§dЕлітна плавильня сплавів II§r", "block.gtceu.luv_arc_furnace": "§dЕлітна дугова піч II§r", "block.gtceu.luv_assembler": "§dЕлітний збирач II§r", "block.gtceu.luv_autoclave": "§dЕлітний автоклав II§r", - "block.gtceu.luv_battery_buffer_16x": "16x буфер батареї §dабсурдної напруги§r", - "block.gtceu.luv_battery_buffer_4x": "4x буфер батареї §dабсурдної напруги§r", - "block.gtceu.luv_battery_buffer_8x": "8x буфер батареї §dабсурдної напруги§r", - "block.gtceu.luv_bender": "§dЕлітний листозгинач II§r", - "block.gtceu.luv_brewery": "§dЕлітна варильня II§r", - "block.gtceu.luv_canner": "§dЕлітний консерватор II§r", + "block.gtceu.luv_battery_buffer_16x": "§dАбсурдна напруга§r 16x акумуляторний буфер", + "block.gtceu.luv_battery_buffer_4x": "§dАбсурдна напруга§r 4x акумуляторний буфер", + "block.gtceu.luv_battery_buffer_8x": "§dАбсурдна напруга§r 8x акумуляторний буфер", + "block.gtceu.luv_bender": "§dЕлітний згинач II§r", + "block.gtceu.luv_brewery": "§dЕлітний варильник II§r", + "block.gtceu.luv_canner": "§dЕлітний пакувальник II§r", "block.gtceu.luv_centrifuge": "§dЕлітна центрифуга II§r", - "block.gtceu.luv_charger_4x": "4x турбозарядка §dабсурдної напруги§r", + "block.gtceu.luv_charger_4x": "§dАбсурдна напруга§r 4x турбозарядник", "block.gtceu.luv_chemical_bath": "§dЕлітна хімічна ванна II§r", "block.gtceu.luv_chemical_reactor": "§dЕлітний хімічний реактор II§r", - "block.gtceu.luv_circuit_assembler": "§dЕлітний збирач схем II§r", + "block.gtceu.luv_circuit_assembler": "§dЕлітний схемотехнічний збирач II§r", "block.gtceu.luv_compressor": "§dЕлітний компресор II§r", - "block.gtceu.luv_cutter": "§dЕлітна різальна машина II§r", - "block.gtceu.luv_diode": "§dДіод АН", + "block.gtceu.luv_cutter": "§dЕлітний різак II§r", + "block.gtceu.luv_diode": "§dLuV діод", "block.gtceu.luv_distillery": "§dЕлітний дистилятор II§r", - "block.gtceu.luv_dual_input_hatch": "§dПодвійний вхідний предметний шлюз АН", - "block.gtceu.luv_dual_output_hatch": "§dПодвійний вихідний предметний шлюз АН", + "block.gtceu.luv_dual_input_hatch": "§dLuV подвійний ввідний люк", + "block.gtceu.luv_dual_output_hatch": "§dLuV подвійний вивідний люк", "block.gtceu.luv_electric_furnace": "§dЕлітна електрична піч II§r", "block.gtceu.luv_electrolyzer": "§dЕлітний електролізер II§r", - "block.gtceu.luv_electromagnetic_separator": "§dЕлітний електоромагнітний розділювач II§r", - "block.gtceu.luv_energy_input_hatch": "§dВхідний роз'єм енергії АН", - "block.gtceu.luv_energy_input_hatch_16a": "§dВхідний роз'єм енергії АН 16A", - "block.gtceu.luv_energy_input_hatch_4a": "§dВхідний роз'єм енергії АН 4A", - "block.gtceu.luv_energy_output_hatch": "§dВихідний роз'єм енергії АН", - "block.gtceu.luv_energy_output_hatch_16a": "§dВихідний роз'єм енергії АН 16A", - "block.gtceu.luv_energy_output_hatch_4a": "§dВихідний роз'єм енергії АН 4A", + "block.gtceu.luv_electromagnetic_separator": "§dЕлітний електромагнітний сепаратор II§r", + "block.gtceu.luv_energy_input_hatch": "§dLuV енергетичний люк", + "block.gtceu.luv_energy_input_hatch_16a": "§dLuV 16A енергетичний люк", + "block.gtceu.luv_energy_input_hatch_4a": "§dLuV 4A енергетичний люк", + "block.gtceu.luv_energy_output_hatch": "§dLuV динамо-люк", + "block.gtceu.luv_energy_output_hatch_16a": "§dLuV 16A динамо-люк", + "block.gtceu.luv_energy_output_hatch_4a": "§dLuV 4A динамо-люк", "block.gtceu.luv_extractor": "§dЕлітний екстрактор II§r", - "block.gtceu.luv_extruder": "§dЕлітний екструдор II§r", + "block.gtceu.luv_extruder": "§dЕлітний екструдер II§r", "block.gtceu.luv_fermenter": "§dЕлітний ферментатор II§r", - "block.gtceu.luv_fisher": "§dЕлітний рибак II§r", - "block.gtceu.luv_fluid_heater": "§dЕлітний рідинний обігрівач II§r", - "block.gtceu.luv_fluid_passthrough_hatch": "§dВхідний рідинний шлюз АН", + "block.gtceu.luv_fisher": "§dЕлітний рибалка II§r", + "block.gtceu.luv_fluid_heater": "§dЕлітний рідинний нагрівач II§r", + "block.gtceu.luv_fluid_passthrough_hatch": "§dLuV прохідний рідинний люк", "block.gtceu.luv_fluid_solidifier": "§dЕлітний рідинний затверджувач II§r", "block.gtceu.luv_forge_hammer": "§dЕлітний ковальський молот II§r", - "block.gtceu.luv_forming_press": "§dЕлітний формувальний прес II§r", + "block.gtceu.luv_forming_press": "§dЕлітний формовий прес II§r", "block.gtceu.luv_fusion_reactor": "Комп'ютер термоядерного реактора MK I", - "block.gtceu.luv_gas_collector": "§dЕлітний повітрозабірник II§r", - "block.gtceu.luv_hermetic_casing": "Герметична обшивка VI", - "block.gtceu.luv_input_bus": "§dВхідна предметна шина АН", - "block.gtceu.luv_input_hatch": "§dВхідний рідинний шлюз АН", - "block.gtceu.luv_input_hatch_4x": "§dЧетверний вхідний рідинний шлюз АН", - "block.gtceu.luv_input_hatch_9x": "§dНепарний вхідний рідинний шлюз АН", - "block.gtceu.luv_item_passthrough_hatch": "§dПрохідний предметний шлюз АН", - "block.gtceu.luv_lapotronic_battery": "Лапотронний конденсатор АН", - "block.gtceu.luv_large_miner": "§dЕлітний великий добувник II§r", - "block.gtceu.luv_laser_engraver": "§dЕлітний лазерний гравер II§r", - "block.gtceu.luv_lathe": "§dЕлітний токарний верстат II§r", + "block.gtceu.luv_gas_collector": "§dЕлітний газозбірник II§r", + "block.gtceu.luv_hermetic_casing": "Герметичний корпус VI", + "block.gtceu.luv_input_bus": "§dLuV вхідна шина", + "block.gtceu.luv_input_hatch": "§dLuV ввідний люк", + "block.gtceu.luv_input_hatch_4x": "§dLuV чотирикамерний ввідний люк", + "block.gtceu.luv_input_hatch_9x": "§dLuV дев'ятикамерний ввідний люк", + "block.gtceu.luv_item_passthrough_hatch": "§dLuV прохідний предметний люк", + "block.gtceu.luv_lapotronic_battery": "LuV лапотронний акумулятор", + "block.gtceu.luv_large_miner": "§dЕлітний великий бур II§r", + "block.gtceu.luv_laser_engraver": "§dЕлітний літограф II§r", + "block.gtceu.luv_lathe": "§dЕлітний токар II§r", "block.gtceu.luv_macerator": "§dЕлітний подрібнювач II§r", - "block.gtceu.luv_machine_casing": "Машинна обшивка АН", - "block.gtceu.luv_machine_hull": "Машинний корпус §dАН§f", + "block.gtceu.luv_machine_casing": "LuV корпус машини", + "block.gtceu.luv_machine_hull": "§dLuV§f машинна основа", "block.gtceu.luv_mixer": "§dЕлітний змішувач II§r", - "block.gtceu.luv_muffler_hatch": "Заглушений шлюз §dАН", - "block.gtceu.luv_ore_washer": "§dЕлітний очищувач руд II§r", - "block.gtceu.luv_output_bus": "§dВихідна предметна шина АН", - "block.gtceu.luv_output_hatch": "§dВихідний рідинний шлюз АН", - "block.gtceu.luv_output_hatch_4x": "§dЧетверний вихідний рідинний шлюз АН", - "block.gtceu.luv_output_hatch_9x": "§dНепарний вихідний рідинний шлюз АН", + "block.gtceu.luv_muffler_hatch": "Люк вихлопу§d LuV", + "block.gtceu.luv_ore_washer": "§dЕлітний рудопромивач II§r", + "block.gtceu.luv_output_bus": "§dLuV вихідна шина", + "block.gtceu.luv_output_hatch": "§dLuV вивідний люк", + "block.gtceu.luv_output_hatch_4x": "§dLuV чотирикамерний вивідний люк", + "block.gtceu.luv_output_hatch_9x": "§dLuV дев'ятикамерний вивідний люк", "block.gtceu.luv_packer": "§dЕлітний пакувальник II§r", - "block.gtceu.luv_parallel_hatch": "Головний шлюз паралельного керування", + "block.gtceu.luv_parallel_hatch": "Майстерський люк паралельного контролю", "block.gtceu.luv_polarizer": "§dЕлітний намагнічувач II§r", "block.gtceu.luv_quantum_chest": "Квантова скриня VI", - "block.gtceu.luv_quantum_tank": "Квантовий бак VI", - "block.gtceu.luv_rock_crusher": "§dЕлітний подрібнювач породи II§r", - "block.gtceu.luv_rotor_holder": "§dТримач ротора АН", + "block.gtceu.luv_quantum_tank": "Квантовий резервуар VI", + "block.gtceu.luv_rock_crusher": "§dЕлітна кам'яна дробарка II§r", + "block.gtceu.luv_rotor_holder": "§dLuV тримач ротора", "block.gtceu.luv_scanner": "§dЕлітний сканер II§r", "block.gtceu.luv_sifter": "§dЕлітний просіювач II§r", - "block.gtceu.luv_substation_input_hatch_64a": "§dВхідна підстанція роз'єму енергії АН 64A", - "block.gtceu.luv_substation_output_hatch_64a": "§dВихідна підстанція роз'єму енергії АН 64A", - "block.gtceu.luv_thermal_centrifuge": "§dЕлітна термоцентрифуга II§r", - "block.gtceu.luv_transformer_16a": "Сильний трансформатор §dабсурдної напруги§r", - "block.gtceu.luv_transformer_1a": "Трансформатор §dабсурдної напруги§r", - "block.gtceu.luv_transformer_2a": "2x трансформатор §dабсурдної напруги§r", - "block.gtceu.luv_transformer_4a": "4x трансформатор §dабсурдної напруги§r", - "block.gtceu.luv_wiremill": "§dЕлітний прокатний станок II§r", + "block.gtceu.luv_substation_input_hatch_64a": "§dLuV 64A енергетичний люк підстанції", + "block.gtceu.luv_substation_output_hatch_64a": "§dLuV 64A динамо-люк підстанції", + "block.gtceu.luv_thermal_centrifuge": "§dЕлітна термічна центрифуга II§r", + "block.gtceu.luv_transformer_16a": "§dАбсурдна напруга§r Силовий трансформатор", + "block.gtceu.luv_transformer_1a": "§dАбсурдна напруга§r Трансформатор", + "block.gtceu.luv_transformer_2a": "§dАбсурдна напруга§r Трансформатор високого струму (2x)", + "block.gtceu.luv_transformer_4a": "§dАбсурдна напруга§r Трансформатор високого струму (4x)", + "block.gtceu.luv_wiremill": "§dЕлітний волок II§r", "block.gtceu.luv_world_accelerator": "§dЕлітний світовий прискорювач II§r", - "block.gtceu.lv_16a_energy_converter": "Конвертор енергії §7НН§r 16§eA§r", - "block.gtceu.lv_1a_energy_converter": "Конвертор енергії §7НН§r 1§eA§r", - "block.gtceu.lv_4a_energy_converter": "Конвертор енергії §7НН§r 4§eA§r", - "block.gtceu.lv_8a_energy_converter": "Конвертор енергії §7НН§r 8§eA§r", - "block.gtceu.lv_air_scrubber": "Очисник повітря§r", - "block.gtceu.lv_alloy_smelter": "Топильник сплавів§r", - "block.gtceu.lv_arc_furnace": "Дугова піч§r", - "block.gtceu.lv_assembler": "Збирач§r", - "block.gtceu.lv_autoclave": "Автоклав§r", - "block.gtceu.lv_battery_buffer_16x": "16x буфер батареї §7низької напруги§r", - "block.gtceu.lv_battery_buffer_4x": "4x буфер батареї §7низької напруги§r", - "block.gtceu.lv_battery_buffer_8x": "8x буфер батареї §7низької напруги§r", - "block.gtceu.lv_bender": "Листозгинач§r", - "block.gtceu.lv_block_breaker": "Ламач блоків§r", - "block.gtceu.lv_brewery": "Варильня§r", - "block.gtceu.lv_buffer": "Буфер§r", - "block.gtceu.lv_canner": "Консерватор§r", - "block.gtceu.lv_centrifuge": "Центрифуга§r", - "block.gtceu.lv_charger_4x": "4x турбозарядка §7низької напруги§r", - "block.gtceu.lv_chemical_bath": "Хімічна ванна§r", - "block.gtceu.lv_chemical_reactor": "Хімічний реактор§r", - "block.gtceu.lv_circuit_assembler": "Збирач схем§r", - "block.gtceu.lv_combustion": "Двигун внутрішнього згоряння§r", - "block.gtceu.lv_compressor": "Компресор§r", - "block.gtceu.lv_cutter": "Різальна машина§r", - "block.gtceu.lv_diode": "§7Діод НН", - "block.gtceu.lv_distillery": "Дистилятор§r", - "block.gtceu.lv_electric_furnace": "Електрична піч§r", - "block.gtceu.lv_electrolyzer": "Електролізер§r", - "block.gtceu.lv_electromagnetic_separator": "Електромагнітний розділювач§r", - "block.gtceu.lv_energy_input_hatch": "§7Вхідний роз'єм енергії НН", - "block.gtceu.lv_energy_output_hatch": "§7Вихідний роз'єм енергії НН", - "block.gtceu.lv_extractor": "Екстрактор§r", - "block.gtceu.lv_extruder": "Екструдор§r", - "block.gtceu.lv_fermenter": "Ферментатор§r", - "block.gtceu.lv_fisher": "Рибак§r", - "block.gtceu.lv_fluid_heater": "Рідинний обігрівач§r", - "block.gtceu.lv_fluid_passthrough_hatch": "§7Прохідний рідинний шлюз НН", - "block.gtceu.lv_fluid_solidifier": "Рідинний затверджувач§r", - "block.gtceu.lv_forge_hammer": "Ковальський молот§r", - "block.gtceu.lv_forming_press": "Формувальний прес§r", - "block.gtceu.lv_gas_collector": "Повітрозабірник§r", - "block.gtceu.lv_gas_turbine": "Газовий турбінний генератор§r", - "block.gtceu.lv_hermetic_casing": "Герметична обшивка I", - "block.gtceu.lv_input_bus": "§7Вхідна предметна шина НН", - "block.gtceu.lv_input_hatch": "§7Вхідний рідинний шлюз НН", - "block.gtceu.lv_item_collector": "Збирач предметів§r", - "block.gtceu.lv_item_passthrough_hatch": "§7Прохідний предметний шлюз НН", - "block.gtceu.lv_laser_engraver": "Лазерний гравер§r", - "block.gtceu.lv_lathe": "Токарний станок§r", - "block.gtceu.lv_macerator": "Подрібнювач§r", - "block.gtceu.lv_machine_casing": "Машинна обшивка НН", - "block.gtceu.lv_machine_hull": "Машинний корпус §7НН§f", - "block.gtceu.lv_miner": "Добувник§r", - "block.gtceu.lv_mixer": "Змішувач§r", - "block.gtceu.lv_muffler_hatch": "Заглушений шлюз §7НН", - "block.gtceu.lv_ore_washer": "Очищувач руд§r", - "block.gtceu.lv_output_bus": "§7Вихідна предметна шина НН", - "block.gtceu.lv_output_hatch": "§7Вихідний рідинний шлюз НН", - "block.gtceu.lv_packer": "Пакувальник§r", - "block.gtceu.lv_polarizer": "Намагнічувач§r", - "block.gtceu.lv_pump": "Помпа§r", - "block.gtceu.lv_rock_crusher": "Подрібнювач породи§r", - "block.gtceu.lv_scanner": "Сканер§r", - "block.gtceu.lv_sifter": "Просіювач§r", - "block.gtceu.lv_steam_turbine": "Паровий турбінний генератор§r", - "block.gtceu.lv_super_chest": "Надскриня I", - "block.gtceu.lv_super_tank": "Надскриня I", - "block.gtceu.lv_thermal_centrifuge": "Термоцентрифуга§r", - "block.gtceu.lv_transformer_16a": "Сильний трансформатор §7низької напруги§r", - "block.gtceu.lv_transformer_1a": "Трансформатор §7низької напруги§r", - "block.gtceu.lv_transformer_2a": "2x трансформатор §7низької напруги§r", - "block.gtceu.lv_transformer_4a": "4x трансформатор §7низької напруги§r", - "block.gtceu.lv_wiremill": "Прокатний станок§r", - "block.gtceu.lv_world_accelerator": "Світовий прискорювач§r", - "block.gtceu.magenta_borderless_lamp": "Пурпурова лампа без меж", + "block.gtceu.lv_16a_energy_converter": "§7LV§r 16§eA§r енергетичний конвертер", + "block.gtceu.lv_1a_energy_converter": "§7LV§r 1§eA§r енергетичний конвертер", + "block.gtceu.lv_4a_energy_converter": "§7LV§r 4§eA§r енергетичний конвертер", + "block.gtceu.lv_8a_energy_converter": "§7LV§r 8§eA§r енергетичний конвертер", + "block.gtceu.lv_air_scrubber": "Базовий очисник повітря§r ", + "block.gtceu.lv_alloy_smelter": "Базова плавильня сплавів §r ", + "block.gtceu.lv_arc_furnace": "Базова дугова піч§r ", + "block.gtceu.lv_assembler": "Базовий збирач§r ", + "block.gtceu.lv_autoclave": "Базовий автоклав§r ", + "block.gtceu.lv_battery_buffer_16x": "§7Низька напруга§r 16x акумуляторний буфер", + "block.gtceu.lv_battery_buffer_4x": "§7Низька напруга§r 4x акумуляторний буфер", + "block.gtceu.lv_battery_buffer_8x": "§7Низька напруга§r 8x акумуляторний буфер", + "block.gtceu.lv_bender": "Базовий згинач§r ", + "block.gtceu.lv_block_breaker": "Базовий руйнівник блоків§r ", + "block.gtceu.lv_brewery": "Базовий варильник§r ", + "block.gtceu.lv_buffer": "Базовий буфер§r ", + "block.gtceu.lv_canner": "Базовий пакувальник§r ", + "block.gtceu.lv_centrifuge": "Базова центрифуга§r ", + "block.gtceu.lv_charger_4x": "§7Низька напруга§r 4x турбозарядник", + "block.gtceu.lv_chemical_bath": "Базова хімічна ванна§r ", + "block.gtceu.lv_chemical_reactor": "Базовий хімічний реактор§r ", + "block.gtceu.lv_circuit_assembler": "Базовий схемотехнічний збирач§r ", + "block.gtceu.lv_combustion": "Базовий генератор внутрішнього згоряння§r ", + "block.gtceu.lv_compressor": "Базовий компресор§r ", + "block.gtceu.lv_cutter": "Базовий різак§r ", + "block.gtceu.lv_diode": "§7LV діод", + "block.gtceu.lv_distillery": "Базовий дистилятор§r ", + "block.gtceu.lv_electric_furnace": "Базова електрична піч§r ", + "block.gtceu.lv_electrolyzer": "Базовий електролізер§r ", + "block.gtceu.lv_electromagnetic_separator": "Базовий електромагнітний сепаратор§r ", + "block.gtceu.lv_energy_input_hatch": "§7LV енергетичний люк", + "block.gtceu.lv_energy_output_hatch": "§7LV динамо-люк", + "block.gtceu.lv_extractor": "Базовий екстрактор§r ", + "block.gtceu.lv_extruder": "Базовий екструдер§r ", + "block.gtceu.lv_fermenter": "Базовий ферментатор§r ", + "block.gtceu.lv_fisher": "Базовий рибалка§r ", + "block.gtceu.lv_fluid_heater": "Базовий рідинний нагрівач§r ", + "block.gtceu.lv_fluid_passthrough_hatch": "§7LV прохідний рідинний люк", + "block.gtceu.lv_fluid_solidifier": "Базовий рідинний затверджувач§r ", + "block.gtceu.lv_forge_hammer": "Базовий ковальський молот§r ", + "block.gtceu.lv_forming_press": "Базовий формовий прес§r ", + "block.gtceu.lv_gas_collector": "Базовий газозбірник§r ", + "block.gtceu.lv_gas_turbine": "Базовий газотурбінний генератор§r ", + "block.gtceu.lv_hermetic_casing": "Герметичний корпус I", + "block.gtceu.lv_input_bus": "§7LV вхідна шина", + "block.gtceu.lv_input_hatch": "§7LV ввідний люк", + "block.gtceu.lv_item_collector": "Базовий предметний збирач§r ", + "block.gtceu.lv_item_passthrough_hatch": "§7LV прохідний предметний люк", + "block.gtceu.lv_laser_engraver": "Базовий літограф§r ", + "block.gtceu.lv_lathe": "Базовий токар§r ", + "block.gtceu.lv_macerator": "Базовий подрібнювач§r ", + "block.gtceu.lv_machine_casing": "LV корпус машини", + "block.gtceu.lv_machine_hull": "§7LV§f машинна основа", + "block.gtceu.lv_miner": "Базовий бур §r ", + "block.gtceu.lv_mixer": "Базовий змішувач§r ", + "block.gtceu.lv_muffler_hatch": "Люк вихлопу§7 LV", + "block.gtceu.lv_ore_washer": "Базовий рудопромивач§r ", + "block.gtceu.lv_output_bus": "§7LV вихідна шина", + "block.gtceu.lv_output_hatch": "§7LV вивідний люк", + "block.gtceu.lv_packer": "Базовий пакувальник§r ", + "block.gtceu.lv_polarizer": "Базовий намагнічувач§r ", + "block.gtceu.lv_pump": "Базова помпа§r ", + "block.gtceu.lv_rock_crusher": "Базова кам'яна дробарка§r ", + "block.gtceu.lv_scanner": "Базовий сканер§r ", + "block.gtceu.lv_sifter": "Базовий просіювач§r ", + "block.gtceu.lv_steam_turbine": "Базовий паротурбінний генератор§r ", + "block.gtceu.lv_super_chest": "Суперскриня I", + "block.gtceu.lv_super_tank": "Суперрезервуар I", + "block.gtceu.lv_thermal_centrifuge": "Базова термічна центрифуга§r ", + "block.gtceu.lv_transformer_16a": "§7Низька напруга§r Силовий трансформатор", + "block.gtceu.lv_transformer_1a": "§7Низька напруга§r Трансформатор", + "block.gtceu.lv_transformer_2a": "§7Низька напруга§r Трансформатор високого струму (2x)", + "block.gtceu.lv_transformer_4a": "§7Низька напруга§r Трансформатор високого струму (4x)", + "block.gtceu.lv_wiremill": "Базовий волок§r ", + "block.gtceu.lv_world_accelerator": "Базовий світовий прискорювач§r ", + "block.gtceu.magenta_borderless_lamp": "Пурпурова необлямована лампа", "block.gtceu.magenta_lamp": "Пурпурова лампа", - "block.gtceu.magenta_large_metal_sheet": "Пурпуровий великий металевий лист", - "block.gtceu.magenta_metal_sheet": "Пурпуровий металевий лист", - "block.gtceu.magenta_studs": "Пурпурові запонки", - "block.gtceu.magic_hazard_sign_block": "Табличка магічної небезпеки", - "block.gtceu.magnetic_hazard_sign_block": "Табличка магнітної небезпеки", - "block.gtceu.maintenance_hatch": "Технічний шлюз", + "block.gtceu.magenta_large_metal_sheet": "Пурпурове велике металеве покриття", + "block.gtceu.magenta_metal_sheet": "Пурпурове металеве покриття", + "block.gtceu.magenta_studs": "Пурпурові кубики", + "block.gtceu.magic_hazard_sign_block": "Блок зі знаком містичної небезпеки", + "block.gtceu.magnetic_hazard_sign_block": "Блок зі знаком магнітної небезпеки", + "block.gtceu.maintenance_hatch": "Люк техобслуговування", "block.gtceu.marble": "Мармур", "block.gtceu.marble_bricks": "Мармурова цегла", "block.gtceu.marble_cobblestone": "Мармуровий кругляк", - "block.gtceu.marble_small_tile": "Малі мармурові кахлі", + "block.gtceu.marble_small_tile": "Мармурові дрібні кахлі", "block.gtceu.marble_tile": "Мармурові кахлі", - "block.gtceu.marble_windmill_a": "Мармуровий млин А", - "block.gtceu.marble_windmill_b": "Мармуровий млин Б", - "block.gtceu.max_16a_energy_converter": "Конвертор енергії §c§lМН.§r 16§eA§r", - "block.gtceu.max_1a_energy_converter": "Конвертор енергії §c§lМН.§r 1§eA§r", - "block.gtceu.max_4a_energy_converter": "Конвертор енергії §c§lМН.§r 4§eA§r", - "block.gtceu.max_8a_energy_converter": "Конвертор енергії §c§lМН§r 8§eA§r", - "block.gtceu.max_battery_buffer_16x": "16x буфер батареї §c§lмаксимальної напруги§r", - "block.gtceu.max_battery_buffer_4x": "4x буфер батареї §c§lмаксимальної напруги§r", - "block.gtceu.max_battery_buffer_8x": "8x буфер батареї §c§lмаксимальної напруги§r", - "block.gtceu.max_charger_4x": "4x турбозарядка §c§lмаксимальної напруги§r", - "block.gtceu.max_dual_input_hatch": "§c§lПодвійний вхідний рідинний шлюз МН", - "block.gtceu.max_dual_output_hatch": "§c§lПодвійний вихідний рідинний шлюз МН", - "block.gtceu.max_energy_input_hatch": "§c§lВхідний роз'єм енергії МН", - "block.gtceu.max_energy_input_hatch_16a": "§c§lВхідний роз'єм енергії МН 16A", - "block.gtceu.max_energy_input_hatch_4a": "§c§lВхідний роз'єм енергії МН 4A", - "block.gtceu.max_energy_output_hatch": "§c§lВихідний роз'єм енергії МН", - "block.gtceu.max_energy_output_hatch_16a": "§c§lВихідний роз'єм енергії МН 16A", - "block.gtceu.max_energy_output_hatch_4a": "§c§lВихідний роз'єм енергії МН 4A", - "block.gtceu.max_input_bus": "§c§lВхідна предметна шина МН", - "block.gtceu.max_input_hatch": "§c§lВхідний рідинний шлюз МН", - "block.gtceu.max_input_hatch_4x": "§c§lЧетверний вхідний рідинний шлюз МН", - "block.gtceu.max_input_hatch_9x": "§c§lНепарний вхідний рідинний шлюз МН", - "block.gtceu.max_machine_casing": "Машинна обшивна МН", - "block.gtceu.max_machine_hull": "Машинний корпус §c§lМН§f", - "block.gtceu.max_output_bus": "§c§lВихідна предметна шина МН", - "block.gtceu.max_output_hatch": "§c§lВихідний рідинний шлюз МН", - "block.gtceu.max_output_hatch_4x": "§c§llЧетверний вихідний рідинний шлюз МН", - "block.gtceu.max_output_hatch_9x": "§c§lНепарний вихідний рідинний шлюз МН", - "block.gtceu.max_substation_input_hatch_64a": "§c§lВхідна підстанція роз'єму енергії МН 64A", - "block.gtceu.max_substation_output_hatch_64a": "§c§lВихідна підстанція роз'єму енергії МН 64A", - "block.gtceu.me_input_bus": "mE вхідна предметна шина", - "block.gtceu.me_input_hatch": "mE вхідний рідинний шлюз", - "block.gtceu.me_output_bus": "mE вихідна предметна шина", - "block.gtceu.me_output_hatch": "mE вихідний рідинний шлюз", - "block.gtceu.me_pattern_buffer": "mE буфер шаблона", - "block.gtceu.me_pattern_buffer_proxy": "mE проксі буферу шаблона", - "block.gtceu.me_stocking_input_bus": "mE накопичувальна вхідна предметна шина", - "block.gtceu.me_stocking_input_hatch": "mE накопичувальний вхідний рідинний шлюз", - "block.gtceu.mega_blast_furnace": "Піч з обертовим сердечником", - "block.gtceu.mega_vacuum_freezer": "Об'ємний вауумний охолоджувач", - "block.gtceu.miner_pipe": "Добувач труб", - "block.gtceu.mob_infestation_hazard_sign_block": "Табличка зараженно-мобової небезпеки", - "block.gtceu.mob_spawner_hazard_sign_block": "Табличка спавнеро-мобової небезпеки", - "block.gtceu.molybdenum_disilicide_coil_block": "Молібдено-дисилицидова котушка", + "block.gtceu.marble_windmill_a": "Мармуровий вітряк A", + "block.gtceu.marble_windmill_b": "Мармуровий вітряк B", + "block.gtceu.max_16a_energy_converter": "§c§lMAX§r 16§eA§r енергетичний конвертер", + "block.gtceu.max_1a_energy_converter": "§c§lMAX§r 1§eA§r енергетичний конвертер", + "block.gtceu.max_4a_energy_converter": "§c§lMAX§r 4§eA§r енергетичний конвертер", + "block.gtceu.max_8a_energy_converter": "§c§lMAX§r 8§eA§r енергетичний конвертер", + "block.gtceu.max_battery_buffer_16x": "§c§lМаксимально напружений§r 16x акумуляторний буфер", + "block.gtceu.max_battery_buffer_4x": "§c§lМаксимально напружений§r 4x акумуляторний буфер", + "block.gtceu.max_battery_buffer_8x": "§c§lМаксимально напружений§r 8x акумуляторний буфер", + "block.gtceu.max_charger_4x": "§c§lМаксимально напружений§r 4x турбозарядник", + "block.gtceu.max_dual_input_hatch": "§c§lMAX подвійний ввідний люк", + "block.gtceu.max_dual_output_hatch": "§c§lMAX подвійний вивідний люк", + "block.gtceu.max_energy_input_hatch": "§c§lMAX енергетичний люк", + "block.gtceu.max_energy_input_hatch_16a": "§c§lMAX 16A енергетичний люк", + "block.gtceu.max_energy_input_hatch_4a": "§c§lMAX 4A енергетичний люк", + "block.gtceu.max_energy_output_hatch": "§c§lMAX динамо-люк", + "block.gtceu.max_energy_output_hatch_16a": "§c§lMAX 16A динамо-люк", + "block.gtceu.max_energy_output_hatch_4a": "§c§lMAX 4A динамо-люк", + "block.gtceu.max_input_bus": "§c§lMAX вхідна шина", + "block.gtceu.max_input_hatch": "§c§lMAX ввідний люк", + "block.gtceu.max_input_hatch_4x": "§c§lMAX чотирикамерний ввідний люк", + "block.gtceu.max_input_hatch_9x": "§c§lMAX дев'ятикамерний ввідний люк", + "block.gtceu.max_machine_casing": "MAX корпус машини", + "block.gtceu.max_machine_hull": "§c§lMAX§f машинна основа", + "block.gtceu.max_output_bus": "§c§lMAX вихідна шина", + "block.gtceu.max_output_hatch": "§c§lMAX вивідний люк", + "block.gtceu.max_output_hatch_4x": "§c§lMAX чотирикамерний вивідний люк", + "block.gtceu.max_output_hatch_9x": "§c§lMAX дев'ятикамерний вивідний люк", + "block.gtceu.max_substation_input_hatch_64a": "§c§lMAX 64A енергетичний люк підстанції", + "block.gtceu.max_substation_output_hatch_64a": "§c§lMAX 64A динамо-люк підстанції", + "block.gtceu.me_input_bus": "ME-вхідна шина", + "block.gtceu.me_input_hatch": "ME-ввідний люк", + "block.gtceu.me_output_bus": "ME-вихідна шина", + "block.gtceu.me_output_hatch": "ME вивідний люк", + "block.gtceu.me_pattern_buffer": "ME-шаблонний буфер", + "block.gtceu.me_pattern_buffer_proxy": "Проксі ME-шаблонного буфера", + "block.gtceu.me_stocking_input_bus": "ME-складальний вхідна шина", + "block.gtceu.me_stocking_input_hatch": "ME-складальний ввідний люк", + "block.gtceu.mega_blast_furnace": "Ротаційна мартенівська піч", + "block.gtceu.mega_vacuum_freezer": "Масовий шоковий охолоджувач", + "block.gtceu.miner_pipe": "Бурова труба", + "block.gtceu.mob_infestation_hazard_sign_block": "Блок зі знаком небезпеки зараження мобів", + "block.gtceu.mob_spawner_hazard_sign_block": "Блок зі знаком породжувачової небезпеки", + "block.gtceu.molybdenum_disilicide_coil_block": "Блок дисиліцид молібденової котушки", "block.gtceu.monitor": "Монітор", "block.gtceu.mossy_dark_concrete_bricks": "Моховита темна бетонна цегла", - "block.gtceu.mossy_dark_concrete_cobblestone": "Моховитий кругляк темного бетону", + "block.gtceu.mossy_dark_concrete_cobblestone": "Моховитий темний бетонний кругляк", "block.gtceu.mossy_light_concrete_bricks": "Моховита світла бетонна цегла", - "block.gtceu.mossy_light_concrete_cobblestone": "Моховитий кругляк світлого бетону", + "block.gtceu.mossy_light_concrete_cobblestone": "Моховитий світлий бетонний кругляк", "block.gtceu.mossy_marble_bricks": "Моховита мармурова цегла", "block.gtceu.mossy_marble_cobblestone": "Моховитий мармуровий кругляк", - "block.gtceu.mossy_red_granite_bricks": "Моховита цегла з червоного граніту", - "block.gtceu.mossy_red_granite_cobblestone": "Моховитий кругляк червоного граніту", - "block.gtceu.multi_smelter": "Багатотопильник", - "block.gtceu.mv_16a_energy_converter": "Конвертор енергії §bСН§r 16§eA§r", - "block.gtceu.mv_1a_energy_converter": "Конвертор енергії §bСН§r 1§eA§r", - "block.gtceu.mv_4a_energy_converter": "Конвертор енергії §bСН§r 4§eA§r", - "block.gtceu.mv_8a_energy_converter": "Конвертор енергії §bСН§r 8§eA§r", - "block.gtceu.mv_air_scrubber": "§bПокращений очисник повітря§r", - "block.gtceu.mv_alloy_smelter": "§bПлкращений топильник сплавів§r", - "block.gtceu.mv_arc_furnace": "§bПокращена дугова піч§r", - "block.gtceu.mv_assembler": "§bПокращений збирач§r", - "block.gtceu.mv_autoclave": "§bПокращений автоклав§r", - "block.gtceu.mv_battery_buffer_16x": "16x буфер батареї §bсередньої напруги§r", - "block.gtceu.mv_battery_buffer_4x": "4x буфер батареї §bсередньої напруги§r", - "block.gtceu.mv_battery_buffer_8x": "8x буфер батареї §bсередньої напруги§r", - "block.gtceu.mv_bedrock_ore_miner": "§bПокращений добувник руд корінної породи§r", - "block.gtceu.mv_bender": "§bПокращений листозгинач§r", - "block.gtceu.mv_block_breaker": "§bПокращений ламач блоків§r", - "block.gtceu.mv_brewery": "§bПокращена варильня§r", - "block.gtceu.mv_buffer": "§bПокращений буфер§r", - "block.gtceu.mv_canner": "§bПокращений консерватор§r", - "block.gtceu.mv_centrifuge": "§bПокращена центрифуга§r", - "block.gtceu.mv_charger_4x": "4x турбозарядка §bсередньої напруги§r", - "block.gtceu.mv_chemical_bath": "§bПокращена хімічна ванна§r", - "block.gtceu.mv_chemical_reactor": "§bПокращений хімічий реактор§r", - "block.gtceu.mv_circuit_assembler": "§bПокращений збирач схем§r", - "block.gtceu.mv_combustion": "§bПокращений двигун внутрішнього згоряння§r", - "block.gtceu.mv_compressor": "§bПокращений двигун§r", - "block.gtceu.mv_cutter": "§bПокращена різальна машина§r", - "block.gtceu.mv_diode": "§bДіод СН", - "block.gtceu.mv_distillery": "§bПокращений дистилятор§r", - "block.gtceu.mv_electric_furnace": "§bПокращена електрична піч§r", - "block.gtceu.mv_electrolyzer": "§bПокращений електролізер§r", - "block.gtceu.mv_electromagnetic_separator": "§bПокращений електромагнітний розділювач§r", - "block.gtceu.mv_energy_input_hatch": "§bВхідний роз'єм енергії СН", - "block.gtceu.mv_energy_output_hatch": "§bВихідний роз'єм енергії СН", - "block.gtceu.mv_extractor": "§bВхідний екстрактор§r", - "block.gtceu.mv_extruder": "§bПокращений екструдор§r", - "block.gtceu.mv_fermenter": "§bПокращений ферментатор§r", - "block.gtceu.mv_fisher": "§bПокращений рибак§r", - "block.gtceu.mv_fluid_drilling_rig": "§bПокращена рідинна бурова установка§r", - "block.gtceu.mv_fluid_heater": "§bПокращений рідинний обігрівач§r", - "block.gtceu.mv_fluid_passthrough_hatch": "§bПрохідний рідинний шлюз СН", - "block.gtceu.mv_fluid_solidifier": "§bПокращений рідинний затверджувач§r", - "block.gtceu.mv_forge_hammer": "§bПокращений ковальський процес§r", - "block.gtceu.mv_forming_press": "§bПокращений формувальний прес§r", - "block.gtceu.mv_gas_collector": "§bПокращений повітрозабірник§r", - "block.gtceu.mv_gas_turbine": "§bПокращений газовий турбінний генератор§r", - "block.gtceu.mv_hermetic_casing": "Герметична обшивка II", - "block.gtceu.mv_input_bus": "§bВхідна предметна шина СН", - "block.gtceu.mv_input_hatch": "§bВхідний рідинний шлюз СН", - "block.gtceu.mv_item_collector": "§bПокращений збирач предметів§r", - "block.gtceu.mv_item_passthrough_hatch": "§bПрохідний предметний шлюз СН", - "block.gtceu.mv_laser_engraver": "§bПокращений лазерний гравер§r", - "block.gtceu.mv_lathe": "§bПокращений токарний станок§r", - "block.gtceu.mv_macerator": "§bПокращений подрібнювач§r", - "block.gtceu.mv_machine_casing": "Машинна обшивка СН", - "block.gtceu.mv_machine_hull": "Машинний корпус §bСН§f", - "block.gtceu.mv_miner": "§bПокращений добувник§r", - "block.gtceu.mv_mixer": "§bПокращений змішувач§r", - "block.gtceu.mv_muffler_hatch": "Заглушений шлюз §bСН", - "block.gtceu.mv_ore_washer": "§bПокращений очищувач руд§r", - "block.gtceu.mv_output_bus": "§bВихідна предметна шина СН", - "block.gtceu.mv_output_hatch": "§bВихідний рідинний шлюз СН", - "block.gtceu.mv_packer": "§bПокращений пакувальник§r", - "block.gtceu.mv_polarizer": "§bПокращений намагнічувач§r", - "block.gtceu.mv_pump": "§bПокращена помпа§r", - "block.gtceu.mv_rock_crusher": "§bПокращений подрібнювач руди§r", - "block.gtceu.mv_scanner": "§bПокращений сканер§r", - "block.gtceu.mv_sifter": "§bПокращений просіювач§r", - "block.gtceu.mv_steam_turbine": "§bПокращений паровий турбінний генератор§r", - "block.gtceu.mv_super_chest": "Надскриня II", - "block.gtceu.mv_super_tank": "Надбак II", - "block.gtceu.mv_thermal_centrifuge": "§bПокращена термоцентрифуга§r", - "block.gtceu.mv_transformer_16a": "Сильний трансформатор §bсередньої напруги§r", - "block.gtceu.mv_transformer_1a": "Трансформатор §bсередньої напруги§r", - "block.gtceu.mv_transformer_2a": "2x трансформатор §bсередньої напруги§r", - "block.gtceu.mv_transformer_4a": "4x трансформатор §bсередньої напруги§r", - "block.gtceu.mv_wiremill": "§bПокращений прокатний станок§r", - "block.gtceu.mv_world_accelerator": "§bПокращений світовий прискорювач§r", - "block.gtceu.naquadah_coil_block": "Наквадова котушка", - "block.gtceu.network_switch": "Перемикач мережі", - "block.gtceu.nichrome_coil_block": "Хромо-нікелева котушка", - "block.gtceu.noise_hazard_sign_block": "Табличка шумової небезпеки", - "block.gtceu.nonconducting_casing": "Непровідна обшивка", - "block.gtceu.normal_duct_pipe": "Повітропровід", + "block.gtceu.mossy_red_granite_bricks": "Моховита червоногранітна цегла", + "block.gtceu.mossy_red_granite_cobblestone": "Моховитий червоногранітний кругляк", + "block.gtceu.multi_smelter": "Мультиплавильня", + "block.gtceu.mv_16a_energy_converter": "§bMV§r 16§eA§r енергетичний конвертер", + "block.gtceu.mv_1a_energy_converter": "§bMV§r 1§eA§r енергетичний конвертер", + "block.gtceu.mv_4a_energy_converter": "§bMV§r 4§eA§r енергетичний конвертер", + "block.gtceu.mv_8a_energy_converter": "§bMV§r 8§eA§r енергетичний конвертер", + "block.gtceu.mv_air_scrubber": "§bВдосконалений очисник повітря§r ", + "block.gtceu.mv_alloy_smelter": "§bВдосконалена плавильня сплавів §r ", + "block.gtceu.mv_arc_furnace": "§bВдосконалена дугова піч§r ", + "block.gtceu.mv_assembler": "§bВдосконалений збирач§r ", + "block.gtceu.mv_autoclave": "§bВдосконалений автоклав§r ", + "block.gtceu.mv_battery_buffer_16x": "§bСередня напруга§r 16x акумуляторний буфер", + "block.gtceu.mv_battery_buffer_4x": "§bСередня напруга§r 4x акумуляторний буфер", + "block.gtceu.mv_battery_buffer_8x": "§bСередня напруга§r 8x акумуляторний буфер", + "block.gtceu.mv_bedrock_ore_miner": "§bВдосконалений глибокореневий бур §r ", + "block.gtceu.mv_bender": "§bВдосконалений згинач§r ", + "block.gtceu.mv_block_breaker": "§bВдосконалений руйнівник блоків§r ", + "block.gtceu.mv_brewery": "§bВдосконалений варильник§r ", + "block.gtceu.mv_buffer": "§bВдосконалений буфер§r ", + "block.gtceu.mv_canner": "§bВдосконалений пакувальник§r ", + "block.gtceu.mv_centrifuge": "§bВдосконалена центрифуга§r ", + "block.gtceu.mv_charger_4x": "§bСередня напруга§r 4x турбозарядник", + "block.gtceu.mv_chemical_bath": "§bВдосконалена хімічна ванна§r ", + "block.gtceu.mv_chemical_reactor": "§bВдосконалений хімічний реактор§r ", + "block.gtceu.mv_circuit_assembler": "§bВдосконалений схемотехнічний збирач§r ", + "block.gtceu.mv_combustion": "§bВдосконалений генератор внутрішнього згоряння§r ", + "block.gtceu.mv_compressor": "§bВдосконалений компресор§r ", + "block.gtceu.mv_cutter": "§bВдосконалений різак§r ", + "block.gtceu.mv_diode": "§bMV діод", + "block.gtceu.mv_distillery": "§bВдосконалений дистилятор§r ", + "block.gtceu.mv_electric_furnace": "§bВдосконалена електрична піч§r ", + "block.gtceu.mv_electrolyzer": "§bВдосконалений електролізер§r ", + "block.gtceu.mv_electromagnetic_separator": "§bВдосконалений електромагнітний сепаратор§r ", + "block.gtceu.mv_energy_input_hatch": "§bMV енергетичний люк", + "block.gtceu.mv_energy_output_hatch": "§bMV динамо-люк", + "block.gtceu.mv_extractor": "§bВдосконалений екстрактор§r ", + "block.gtceu.mv_extruder": "§bВдосконалений екструдер§r ", + "block.gtceu.mv_fermenter": "§bВдосконалений ферментатор§r ", + "block.gtceu.mv_fisher": "§bВдосконалений рибалка§r ", + "block.gtceu.mv_fluid_drilling_rig": "§bВдосконалена рідинна бурова устава§r ", + "block.gtceu.mv_fluid_heater": "§bВдосконалений рідинний нагрівач§r ", + "block.gtceu.mv_fluid_passthrough_hatch": "§bMV прохідний рідинний люк", + "block.gtceu.mv_fluid_solidifier": "§bВдосконалений рідинний затверджувач§r ", + "block.gtceu.mv_forge_hammer": "§bВдосконалений ковальський молот§r ", + "block.gtceu.mv_forming_press": "§bВдосконалений формовий прес§r ", + "block.gtceu.mv_gas_collector": "§bВдосконалений газозбірник§r ", + "block.gtceu.mv_gas_turbine": "§bВдосконалений газотурбінний генератор§r ", + "block.gtceu.mv_hermetic_casing": "Герметичний корпус II", + "block.gtceu.mv_input_bus": "§bMV вхідна шина", + "block.gtceu.mv_input_hatch": "§bMV ввідний люк", + "block.gtceu.mv_item_collector": "§bВдосконалений предметний збирач§r ", + "block.gtceu.mv_item_passthrough_hatch": "§bMV прохідний предметний люк", + "block.gtceu.mv_laser_engraver": "§bВдосконалений літограф§r ", + "block.gtceu.mv_lathe": "§bВдосконалений токар§r ", + "block.gtceu.mv_macerator": "§bВдосконалений подрібнювач§r ", + "block.gtceu.mv_machine_casing": "MV корпус машини", + "block.gtceu.mv_machine_hull": "§bMV§f машинна основа", + "block.gtceu.mv_miner": "§bВдосконалений бур §r ", + "block.gtceu.mv_mixer": "§bВдосконалений змішувач§r ", + "block.gtceu.mv_muffler_hatch": "Люк вихлопу§b MV", + "block.gtceu.mv_ore_washer": "§bВдосконалений рудопромивач§r ", + "block.gtceu.mv_output_bus": "§bMV вихідна шина", + "block.gtceu.mv_output_hatch": "§bMV вивідний люк", + "block.gtceu.mv_packer": "§bВдосконалений пакувальник§r ", + "block.gtceu.mv_polarizer": "§bВдосконалений намагнічувач§r ", + "block.gtceu.mv_pump": "§bВдосконалена помпа§r ", + "block.gtceu.mv_rock_crusher": "§bВдосконалена кам'яна дробарка§r ", + "block.gtceu.mv_scanner": "§bВдосконалений сканер§r ", + "block.gtceu.mv_sifter": "§bВдосконалений просіювач§r ", + "block.gtceu.mv_steam_turbine": "§bВдосконалений паротурбінний генератор§r ", + "block.gtceu.mv_super_chest": "Суперскриня II", + "block.gtceu.mv_super_tank": "Суперрезервуар II", + "block.gtceu.mv_thermal_centrifuge": "§bВдосконалена термічна центрифуга§r ", + "block.gtceu.mv_transformer_16a": "§bСередня напруга§r Силовий трансформатор", + "block.gtceu.mv_transformer_1a": "§bСередня напруга§r Трансформатор", + "block.gtceu.mv_transformer_2a": "§bСередня напруга§r Трансформатор високого струму (2x)", + "block.gtceu.mv_transformer_4a": "§bСередня напруга§r Трансформатор високого струму (4x)", + "block.gtceu.mv_wiremill": "§bВдосконалений волок§r ", + "block.gtceu.mv_world_accelerator": "§bВдосконалений світовий прискорювач§r ", + "block.gtceu.naquadah_coil_block": "Блок наквадової котушки", + "block.gtceu.network_switch": "Мережевий комутатор", + "block.gtceu.nichrome_coil_block": "Блок ніхромової котушки", + "block.gtceu.noise_hazard_sign_block": "Блок зі знаком шумової небезпеки", + "block.gtceu.nonconducting_casing": "Непровідний корпус", + "block.gtceu.normal_duct_pipe": "Вентиляційна труба", "block.gtceu.normal_laser_pipe": "Лазерна труба", - "block.gtceu.normal_laser_pipe.tooltip": "§7Передача потужности §fбез втрат§7 на прямих лініях", - "block.gtceu.normal_optical_pipe": "Волоконно-оптичний кабель", - "block.gtceu.normal_optical_pipe.tooltip": "§7Передача §fобчислювальних§7 або §fпошукових§7 даних", - "block.gtceu.object_holder": "Тримач об'єкта", + "block.gtceu.normal_laser_pipe.tooltip": "§7Транспортує енергію§f без витрат§7 на прямих лініях", + "block.gtceu.normal_optical_pipe": "Оптоволоконний кабель", + "block.gtceu.normal_optical_pipe.tooltip": "§7Транспортує§f обчислення§7 або§f дослідницькі дані§7", + "block.gtceu.object_holder": "Тримач об'єктів", "block.gtceu.oil": "Нафта", "block.gtceu.oil_heavy": "Важка нафта", "block.gtceu.oil_light": "Легка нафта", "block.gtceu.oil_medium": "Сира нафта", - "block.gtceu.opv_1024a_laser_source_hatch": "Лазерно-джерельний роз'єм §9§lНпН§r 1,024§eA§r", - "block.gtceu.opv_1024a_laser_target_hatch": "Лазерно-цільовий роз'єм §9§lНпН§r 1,024§eA§r", - "block.gtceu.opv_16a_energy_converter": "Конвертор енергії §9§lНпН§r 16§eA§r", - "block.gtceu.opv_1a_energy_converter": "Конвертор енергії §9§lНпН§r 1§eA§r", - "block.gtceu.opv_256a_laser_source_hatch": "Лазерно-джерельний роз'єм §9§lНпН§r 256§eA§r", - "block.gtceu.opv_256a_laser_target_hatch": "Лазерно-цільовий роз'єм §9§lНпН§r 256§eA§r Laser", - "block.gtceu.opv_4096a_laser_source_hatch": "Лазерно-джерельний роз'єм §9§lНпН§r 4,096§eA§r", - "block.gtceu.opv_4096a_laser_target_hatch": "Лазерно-цільовий роз'єм §9§lНпН§r 4,096§eA§r", - "block.gtceu.opv_4a_energy_converter": "Конвертор енергії §9§lНпН§r 4§eA§r", - "block.gtceu.opv_8a_energy_converter": "Конвертор енергії §9§lНпН§r 8§eA§r", - "block.gtceu.opv_alloy_smelter": "§9§lЛегендарний топильник сплавів§r", - "block.gtceu.opv_arc_furnace": "§9§lЛегендарна дугова піч§r", - "block.gtceu.opv_assembler": "§9§lЛегендарний збирач§r", - "block.gtceu.opv_autoclave": "§9§lЛегендарний автоклав§r", - "block.gtceu.opv_battery_buffer_16x": "16x буфер батареї §9§lнадпотужної напруги§r", - "block.gtceu.opv_battery_buffer_4x": "4x буфер батареї §9§lнадпотужної напруги§r", - "block.gtceu.opv_battery_buffer_8x": "8x буфер батареї §9§lнадпотужної напруги§r", - "block.gtceu.opv_bender": "§9§lЛегендарний листозгинач§r", - "block.gtceu.opv_brewery": "§9§lЛегендарна варильня§r", - "block.gtceu.opv_canner": "§9§lЛегендарний консерватор§r", - "block.gtceu.opv_centrifuge": "§9§lЛегендарна центрифуга§r", - "block.gtceu.opv_charger_4x": "4x турбозарядка §9§lнадпотужної напруги§r", - "block.gtceu.opv_chemical_bath": "§9§lЛегендарна хімічна ванна§r", - "block.gtceu.opv_chemical_reactor": "§9§lЛегендарний хімічний реактор§r", - "block.gtceu.opv_circuit_assembler": "§9§lЛегендарний збирач схем§r", - "block.gtceu.opv_compressor": "§9§lЛегендарний компресор§r", - "block.gtceu.opv_cutter": "§9§lЛегендарна разільна машина§r", - "block.gtceu.opv_diode": "§9§lДіод НпН", - "block.gtceu.opv_distillery": "§9§lЛегендарний дистилятор§r", - "block.gtceu.opv_dual_input_hatch": "§9§lПодвійний вхідний рідинний шлюз НпН", - "block.gtceu.opv_dual_output_hatch": "§9§lПодвійний вихідний рідинний шлюз НпН", - "block.gtceu.opv_electric_furnace": "§9§lЛегендарна електрична піч§r", - "block.gtceu.opv_electrolyzer": "§9§lЛегендарний електролізер§r", - "block.gtceu.opv_electromagnetic_separator": "§9§lЛегендарний електромагнітний розділювач§r", - "block.gtceu.opv_energy_input_hatch": "§9§lВхідний роз'єм енергії НпН", - "block.gtceu.opv_energy_input_hatch_16a": "§9§lВхідний роз'єм енергії НпН 16A", - "block.gtceu.opv_energy_input_hatch_4a": "§9§lВхідний роз'єм енергії НпН 4A", - "block.gtceu.opv_energy_output_hatch": "§9§lВихідний роз'єм енергії НпН", - "block.gtceu.opv_energy_output_hatch_16a": "§9§lВихідний роз'єм енергії НпН 16A", - "block.gtceu.opv_energy_output_hatch_4a": "§9§lВихідний роз'єм енергії НпН 4A", - "block.gtceu.opv_extractor": "§9§lЛегендарний естрактор§r", - "block.gtceu.opv_extruder": "§9§lЛегендарний екструдор§r", - "block.gtceu.opv_fermenter": "§9§lЛегендарний ферментатор§r", - "block.gtceu.opv_fluid_heater": "§9§lЛегендарний рідинний обігрівач§r", - "block.gtceu.opv_fluid_passthrough_hatch": "§9§lПрохідний рідинний шлюз НпН", - "block.gtceu.opv_fluid_solidifier": "§9§lЛегендарний рідинний затверджувач§r", - "block.gtceu.opv_forge_hammer": "§9§lЛегендарний ковальський молот§r", - "block.gtceu.opv_forming_press": "§9§lЛегендарний формувальний прес§r", - "block.gtceu.opv_gas_collector": "§9§lЛегендарний повітрозабірник§r", - "block.gtceu.opv_input_bus": "§9§lВхідна предметна шина НпН", - "block.gtceu.opv_input_hatch": "§9§lВхідний рідинний шлюз НпН", - "block.gtceu.opv_input_hatch_4x": "§9§lЧетверний вхідний рідинний шлюз НпН", - "block.gtceu.opv_input_hatch_9x": "§9§lНепарний вхідний рідинний шлюз НпН", - "block.gtceu.opv_item_passthrough_hatch": "§9§lПрохідний предметний шлюз НпН", - "block.gtceu.opv_laser_engraver": "§9§lЛегендарний лазерний гравер§r", - "block.gtceu.opv_lathe": "§9§lЛегендарний токарний станок§r", - "block.gtceu.opv_macerator": "§9§lЛегендарний процес§r", - "block.gtceu.opv_machine_casing": "Машинна обшивка НпН", - "block.gtceu.opv_machine_hull": "Машинний корпус §9§lНпН§f", - "block.gtceu.opv_mixer": "§9§lЛегендартний змішувач§r", - "block.gtceu.opv_muffler_hatch": "Заглушений шлюз §9§lНпН", - "block.gtceu.opv_ore_washer": "§9§lЛегендарний очищувач руд§r", - "block.gtceu.opv_output_bus": "§9§lВихідна предметна шина НпН", - "block.gtceu.opv_output_hatch": "§9§lВихідний рідинний шлюз НпН", - "block.gtceu.opv_output_hatch_4x": "§9§lЧетверний вихідний рідинний шлюз НпН", - "block.gtceu.opv_output_hatch_9x": "§9§lНепарний вихідний рідинний шлюз НпН", - "block.gtceu.opv_packer": "§9§lЛегендарний пакувальник§r", - "block.gtceu.opv_polarizer": "§9§lЛегендарний намагнічувач§r", + "block.gtceu.opv_1024a_laser_source_hatch": "§9§lOpV§r 1,024§eA§r люк джерела лазера", + "block.gtceu.opv_1024a_laser_target_hatch": "§9§lOpV§r 1,024§eA§r люк цілі лазера", + "block.gtceu.opv_16a_energy_converter": "§9§lOpV§r 16§eA§r енергетичний конвертер", + "block.gtceu.opv_1a_energy_converter": "§9§lOpV§r 1§eA§r енергетичний конвертер", + "block.gtceu.opv_256a_laser_source_hatch": "§9§lOpV§r 256§eA§r люк джерела лазера", + "block.gtceu.opv_256a_laser_target_hatch": "§9§lOpV§r 256§eA§r люк цілі лазера", + "block.gtceu.opv_4096a_laser_source_hatch": "§9§lOpV§r 4,096§eA§r люк джерела лазера", + "block.gtceu.opv_4096a_laser_target_hatch": "§9§lOpV§r 4,096§eA§r люк цілі лазера", + "block.gtceu.opv_4a_energy_converter": "§9§lOpV§r 4§eA§r енергетичний конвертер", + "block.gtceu.opv_8a_energy_converter": "§9§lOpV§r 8§eA§r енергетичний конвертер", + "block.gtceu.opv_alloy_smelter": "§9§lЛегендарна плавильня сплавів §r ", + "block.gtceu.opv_arc_furnace": "§9§lЛегендарна дугова піч§r ", + "block.gtceu.opv_assembler": "§9§lЛегендарний збирач§r ", + "block.gtceu.opv_autoclave": "§9§lЛегендарний автоклав§r ", + "block.gtceu.opv_battery_buffer_16x": "§9§lБезмірна напруга§r 16x акумуляторний буфер", + "block.gtceu.opv_battery_buffer_4x": "§9§lБезмірна напруга§r 4x акумуляторний буфер", + "block.gtceu.opv_battery_buffer_8x": "§9§lБезмірна напруга§r 8x акумуляторний буфер", + "block.gtceu.opv_bender": "§9§lЛегендарний згинач§r ", + "block.gtceu.opv_brewery": "§9§lЛегендарний варильник§r ", + "block.gtceu.opv_canner": "§9§lЛегендарний пакувальник§r ", + "block.gtceu.opv_centrifuge": "§9§lЛегендарна центрифуга§r ", + "block.gtceu.opv_charger_4x": "§9§lБезмірна напруга§r 4x турбозарядник", + "block.gtceu.opv_chemical_bath": "§9§lЛегендарна хімічна ванна§r ", + "block.gtceu.opv_chemical_reactor": "§9§lЛегендарний хімічний реактор§r ", + "block.gtceu.opv_circuit_assembler": "§9§lЛегендарний схемотехнічний збирач§r ", + "block.gtceu.opv_compressor": "§9§lЛегендарний компресор§r ", + "block.gtceu.opv_cutter": "§9§lЛегендарний різак§r ", + "block.gtceu.opv_diode": "§9§lOpV діод", + "block.gtceu.opv_distillery": "§9§lЛегендарний дистилятор§r ", + "block.gtceu.opv_dual_input_hatch": "§9§lOpV подвійний ввідний люк", + "block.gtceu.opv_dual_output_hatch": "§9§lOpV подвійний вивідний люк", + "block.gtceu.opv_electric_furnace": "§9§lЛегендарна електрична піч§r ", + "block.gtceu.opv_electrolyzer": "§9§lЛегендарний електролізер§r ", + "block.gtceu.opv_electromagnetic_separator": "§9§lЛегендарний електромагнітний сепаратор§r ", + "block.gtceu.opv_energy_input_hatch": "§9§lOpV енергетичний люк", + "block.gtceu.opv_energy_input_hatch_16a": "§9§lOpV 16A енергетичний люк", + "block.gtceu.opv_energy_input_hatch_4a": "§9§lOpV 4A енергетичний люк", + "block.gtceu.opv_energy_output_hatch": "§9§lOpV динамо-люк", + "block.gtceu.opv_energy_output_hatch_16a": "§9§lOpV 16A динамо-люк", + "block.gtceu.opv_energy_output_hatch_4a": "§9§lOpV 4A динамо-люк", + "block.gtceu.opv_extractor": "§9§lЛегендарний екстрактор§r ", + "block.gtceu.opv_extruder": "§9§lЛегендарний екструдер§r ", + "block.gtceu.opv_fermenter": "§9§lЛегендарний ферментатор§r ", + "block.gtceu.opv_fluid_heater": "§9§lЛегендарний рідинний нагрівач§r ", + "block.gtceu.opv_fluid_passthrough_hatch": "§9§lOpV прохідний рідинний люк", + "block.gtceu.opv_fluid_solidifier": "§9§lЛегендарний рідинний затверджувач§r ", + "block.gtceu.opv_forge_hammer": "§9§lЛегендарний ковальський молот§r ", + "block.gtceu.opv_forming_press": "§9§lЛегендарний формовий прес§r ", + "block.gtceu.opv_gas_collector": "§9§lЛегендарний газозбірник§r ", + "block.gtceu.opv_input_bus": "§9§lOpV вхідна шина", + "block.gtceu.opv_input_hatch": "§9§lOpV ввідний люк", + "block.gtceu.opv_input_hatch_4x": "§9§lOpV чотирикамерний ввідний люк", + "block.gtceu.opv_input_hatch_9x": "§9§lOpV дев'ятикамерний ввідний люк", + "block.gtceu.opv_item_passthrough_hatch": "§9§lOpV прохідний предметний люк", + "block.gtceu.opv_laser_engraver": "§9§lЛегендарний літограф§r ", + "block.gtceu.opv_lathe": "§9§lЛегендарний токар§r ", + "block.gtceu.opv_macerator": "§9§lЛегендарний подрібнювач§r ", + "block.gtceu.opv_machine_casing": "OpV корпус машини", + "block.gtceu.opv_machine_hull": "§9§lOpV§f машинна основа", + "block.gtceu.opv_mixer": "§9§lЛегендарний змішувач§r ", + "block.gtceu.opv_muffler_hatch": "Люк вихлопу§9§l OpV", + "block.gtceu.opv_ore_washer": "§9§lЛегендарний рудопромивач§r ", + "block.gtceu.opv_output_bus": "§9§lOpV вихідна шина", + "block.gtceu.opv_output_hatch": "§9§lOpV вивідний люк", + "block.gtceu.opv_output_hatch_4x": "§9§lOpV чотирикамерний вивідний люк", + "block.gtceu.opv_output_hatch_9x": "§9§lOpV дев'ятикамерний вивідний люк", + "block.gtceu.opv_packer": "§9§lЛегендарний пакувальник§r ", + "block.gtceu.opv_polarizer": "§9§lЛегендарний намагнічувач§r ", "block.gtceu.opv_quantum_chest": "Квантова скриня XIII", - "block.gtceu.opv_quantum_tank": "Квантовий бак XIII", - "block.gtceu.opv_rock_crusher": "§9§lЛегендарний подрібнювач породи§r", - "block.gtceu.opv_rotor_holder": "§9§lТримач ротора НпН", - "block.gtceu.opv_scanner": "§9§lЛегендарний сканер§r", - "block.gtceu.opv_sifter": "§9§lЛегендарний просіювач§r", - "block.gtceu.opv_substation_input_hatch_64a": "§9§lВхідна підстанція роз'єму енергії НпН 64A", - "block.gtceu.opv_substation_output_hatch_64a": "§9§lВихідна підстанція роз'єму енергії НпН 64A", - "block.gtceu.opv_thermal_centrifuge": "§9§lЛегендарна термоцентрифуга§r", - "block.gtceu.opv_transformer_16a": "Сильний трансформатор §9§lнадпотужної напруги§r", - "block.gtceu.opv_transformer_1a": "Трансформатор §9§lнадпотужної напруги§r", - "block.gtceu.opv_transformer_2a": "2x трансформатор §9§lнадпотужної напруги§r", - "block.gtceu.opv_transformer_4a": "4x трансформатор §9§lнадпотужної напруги§r", - "block.gtceu.opv_wiremill": "§9§lЛегендарний прокатний станок§r", - "block.gtceu.orange_borderless_lamp": "Помаранчева лампа без меж", + "block.gtceu.opv_quantum_tank": "Квантовий резервуар XIII", + "block.gtceu.opv_rock_crusher": "§9§lЛегендарна кам'яна дробарка§r ", + "block.gtceu.opv_rotor_holder": "§9§lOpV тримач ротора", + "block.gtceu.opv_scanner": "§9§lЛегендарний сканер§r ", + "block.gtceu.opv_sifter": "§9§lЛегендарний просіювач§r ", + "block.gtceu.opv_substation_input_hatch_64a": "§9§lOpV 64A енергетичний люк підстанції", + "block.gtceu.opv_substation_output_hatch_64a": "§9§lOpV 64A динамо-люк підстанції", + "block.gtceu.opv_thermal_centrifuge": "§9§lЛегендарна термічна центрифуга§r ", + "block.gtceu.opv_transformer_16a": "§9§lБезмірна напруга§r Силовий трансформатор", + "block.gtceu.opv_transformer_1a": "§9§lБезмірна напруга§r Трансформатор", + "block.gtceu.opv_transformer_2a": "§9§lБезмірна напруга§r Трансформатор високого струму (2x)", + "block.gtceu.opv_transformer_4a": "§9§lБезмірна напруга§r Трансформатор високого струму (4x)", + "block.gtceu.opv_wiremill": "§9§lЛегендарний волок§r ", + "block.gtceu.orange_borderless_lamp": "Помаранчева необлямована лампа", "block.gtceu.orange_lamp": "Помаранчева лампа", - "block.gtceu.orange_large_metal_sheet": "Помаранчевий великий металевий лист", - "block.gtceu.orange_metal_sheet": "Помаранчевий металевий лист", - "block.gtceu.orange_studs": "Помаранчеві запонки", + "block.gtceu.orange_large_metal_sheet": "Помаранчеве велике металеве покриття", + "block.gtceu.orange_metal_sheet": "Помаранчеве металеве покриття", + "block.gtceu.orange_studs": "Помаранчеві кубики", "block.gtceu.overworld_marker": "Верхній світ", - "block.gtceu.palladium_substation": "Паладіє підстанція", - "block.gtceu.pattern_buffer.desc.0": "§fДозволяє пряме зберігання шаблонів §6AE2 для багатоблоків GregTech.", - "block.gtceu.pattern_buffer.desc.1": "Шаблони §fAE2 можуть використовувати все, що зберігається в §6загальному інвентарі §fвіджету.", - "block.gtceu.pattern_buffer.desc.2": "§fLink §6Проксі буфера шаблонів §fз §bкфлешки§f для зв'язку машин!", - "block.gtceu.pattern_buffer_proxy.desc.0": "§fДозволяє приєднатися багато машин до одного §6ME буфера шаблонів§f.", - "block.gtceu.pattern_buffer_proxy.desc.1": "§fУсі приєднані проксі використовуватимуть шаблони, які зберігаються в §6оригінальному буфері§f.", - "block.gtceu.pattern_buffer_proxy.desc.2": "§fДозвольте заводу розвиватися!", + "block.gtceu.palladium_substation": "Паладієвий корпус підстанції", + "block.gtceu.pattern_buffer.desc.0": "§fДозволяє безпосередньо§6 зберігати шаблони AE2§f для конструкцій GregTech.", + "block.gtceu.pattern_buffer.desc.1": "§fШаблони AE2 можуть використовувати все, що зберігається у віджеті§6 спільного містила§f.", + "block.gtceu.pattern_buffer.desc.2": "§fЗ'єднайте§6 проксі шаблонних буферів§f з§b карткою даних§f, щоб зв'язати машини між собою!", + "block.gtceu.pattern_buffer_proxy.desc.0": "§fДозволяє зв'язати багато машин з єдиним§6 ME-шаблонним буфером§f.", + "block.gtceu.pattern_buffer_proxy.desc.1": "§fВсі підключені проксі будуть використовувати шаблони, що містяться в§6 оригінальному буфері§f.", + "block.gtceu.pattern_buffer_proxy.desc.2": "§fНехай фабрика росте!", "block.gtceu.petrified_foam": "Скам'яніла піна", - "block.gtceu.pink_borderless_lamp": "Рожева лампа без меж", + "block.gtceu.pink_borderless_lamp": "Рожева необлямована лампа", "block.gtceu.pink_lamp": "Рожева лампа", - "block.gtceu.pink_large_metal_sheet": "Рожевий великий металевий лист", - "block.gtceu.pink_metal_sheet": "Рожевий металевий лист", - "block.gtceu.pink_studs": "Рожеві запонки", - "block.gtceu.plascrete": "Пласкрит", + "block.gtceu.pink_large_metal_sheet": "Рожеве велике металеве покриття", + "block.gtceu.pink_metal_sheet": "Рожеве металеве покриття", + "block.gtceu.pink_studs": "Рожеві кубики", + "block.gtceu.plascrete": "Гіпсобетон", "block.gtceu.plasma_large_turbine": "Велика плазмова турбіна", - "block.gtceu.polished_dark_concrete": "Полірований темний бутон", - "block.gtceu.polished_light_concrete": "Полірований темний бутон", + "block.gtceu.polished_dark_concrete": "Полірований темний бетон", + "block.gtceu.polished_light_concrete": "Полірований світлий бетон", "block.gtceu.polished_marble": "Полірований мармур", - "block.gtceu.polished_red_granite": "Полірований червоний мармур", - "block.gtceu.powderbarrel": "Порохівниця", - "block.gtceu.powderbarrel.drops_tooltip": "Трохи більший за динаміт, викидає всі знищені блоки як предмети", + "block.gtceu.polished_red_granite": "Полірований червоний граніт", + "block.gtceu.powderbarrel": "Порохова бочка", + "block.gtceu.powderbarrel.drops_tooltip": "Добуває усі знищені блоки так само, як динаміт, але з трохи більшим радіусом", "block.gtceu.power_substation": "Електропідстанція", - "block.gtceu.primitive_blast_furnace": "Примітивна доменна піч", - "block.gtceu.primitive_pump": "Примітивний помпа", - "block.gtceu.ptfe_pipe_casing": "Обшивка труб ПТФЕ", - "block.gtceu.pump_deck": "Основа помпи", - "block.gtceu.pump_hatch": "Шлюз помпи", - "block.gtceu.purple_borderless_lamp": "Фіолетова лампа без меж", + "block.gtceu.primitive_blast_furnace": "Примітивна сталеливарня", + "block.gtceu.primitive_pump": "Примітивна помпа", + "block.gtceu.ptfe_pipe_casing": "ПТФЕ трубний корпус", + "block.gtceu.pump_deck": "Палуба помпи", + "block.gtceu.pump_hatch": "Люк помпи", + "block.gtceu.purple_borderless_lamp": "Фіолетова необлямована лампа", "block.gtceu.purple_lamp": "Фіолетова лампа", - "block.gtceu.purple_large_metal_sheet": "Фіолетовий великий металевий лист", - "block.gtceu.purple_metal_sheet": "Фіолетовий металевий лист", - "block.gtceu.purple_studs": "Фіолетові запонки", + "block.gtceu.purple_large_metal_sheet": "Фіолетове велике металеве покриття", + "block.gtceu.purple_metal_sheet": "Фіолетове металеве покриття", + "block.gtceu.purple_studs": "Фіолетові кубики", "block.gtceu.pyrolyse_oven": "Піролізна піч", - "block.gtceu.radioactive_hazard_sign_block": "Табличка радіоактивної небезпеки", - "block.gtceu.reaction_safe_mixing_casing": "Табличка реакційної небезпеки", - "block.gtceu.red_borderless_lamp": "Червона лампа без меж", + "block.gtceu.radioactive_hazard_sign_block": "Блок зі знаком радіоактивної небезпеки", + "block.gtceu.reaction_safe_mixing_casing": "Реактивно-захисний змішувальний корпус", + "block.gtceu.red_borderless_lamp": "Червона необлямована лампа", "block.gtceu.red_granite": "Червоний граніт", - "block.gtceu.red_granite_bricks": "Цегла з червоного граніту", - "block.gtceu.red_granite_cobblestone": "Кругляк червоного граніту", - "block.gtceu.red_granite_small_tile": "Малі кахлі з червоного граніту", - "block.gtceu.red_granite_tile": "Кахлі з червоного граніту", - "block.gtceu.red_granite_windmill_a": "Млин А з червоного граніту", - "block.gtceu.red_granite_windmill_b": "Млин Б з червоного граніту", + "block.gtceu.red_granite_bricks": "Червоногранітна цегла", + "block.gtceu.red_granite_cobblestone": "Червоногранітний кругляк", + "block.gtceu.red_granite_small_tile": "Червоногранітні дрібні кахлі", + "block.gtceu.red_granite_tile": "Червоногранітні кахлі", + "block.gtceu.red_granite_windmill_a": "Червоногранітний вітряк A", + "block.gtceu.red_granite_windmill_b": "Червоногранітний вітряк B", "block.gtceu.red_lamp": "Червона лампа", - "block.gtceu.red_large_metal_sheet": "Червоний великий металевий лист", - "block.gtceu.red_metal_sheet": "Червоний металевий лист", - "block.gtceu.red_studs": "Червоні запонки", + "block.gtceu.red_large_metal_sheet": "Червоне велике металеве покриття", + "block.gtceu.red_metal_sheet": "Червоне металеве покриття", + "block.gtceu.red_studs": "Червоні кубики", "block.gtceu.reinforced_foam": "Посилена піна", - "block.gtceu.reinforced_stone": "Посилений камінь", - "block.gtceu.research_station": "Дослідна станція", - "block.gtceu.reservoir_hatch": "Шлюз баку", - "block.gtceu.robust_machine_casing": "Міцна вольфрамова машинна обшивка", - "block.gtceu.rtm_alloy_coil_block": "Котушка з РВМ сплаву", - "block.gtceu.rubber_button": "Гевеєва кнопка", - "block.gtceu.rubber_door": "Гевеєві двері", - "block.gtceu.rubber_fence": "Гевеєвий паркан", - "block.gtceu.rubber_fence_gate": "Гевеєва хвіртка", - "block.gtceu.rubber_hanging_sign": "Гевеєва вивіска", - "block.gtceu.rubber_leaves": "Гевеєве листя", - "block.gtceu.rubber_log": "Гевеєва колода", - "block.gtceu.rubber_planks": "Гевеєві дошка", - "block.gtceu.rubber_pressure_plate": "Гівеєва натискна плита", - "block.gtceu.rubber_sapling": "Паросток гевеї", - "block.gtceu.rubber_sign": "Гевеєва табличка", - "block.gtceu.rubber_slab": "Гевеєва плита", - "block.gtceu.rubber_stairs": "Гевеєві сходи", - "block.gtceu.rubber_trapdoor": "Гевеєвий люк", - "block.gtceu.rubber_wood": "Гевеєва деревина", - "block.gtceu.secure_maceration_casing": "Безпечна обшивка подрібнювача", - "block.gtceu.shock_proof_cutting_casing": "Амортизаційна обшивка різальної машини", - "block.gtceu.slicing_blades": "Леза для нарізки", - "block.gtceu.small_dark_concrete_bricks": "Мала темна бетонна цегла", - "block.gtceu.small_duct_pipe": "Малий повітропровід", - "block.gtceu.small_light_concrete_bricks": "Мала цегла бетонна цегла", - "block.gtceu.small_marble_bricks": "Мала мармурова цегла", - "block.gtceu.small_red_granite_bricks": "Мала цегла з червоного граніту", - "block.gtceu.solid_machine_casing": "Суцільна машинна обшивка", - "block.gtceu.spatial_storage_hazard_sign_block": "Табличка просторово-зберігальної небезпеки", + "block.gtceu.reinforced_stone": "Зміцнений камінь", + "block.gtceu.research_station": "Дослідницька станція", + "block.gtceu.reservoir_hatch": "Люк резервуара", + "block.gtceu.robust_machine_casing": "Надійний вольфрамовий сталевий корпус машини", + "block.gtceu.rtm_alloy_coil_block": "Блок котушки з RTM-сплаву", + "block.gtceu.rubber_button": "Каучукова кнопка", + "block.gtceu.rubber_door": "Каучукові двері", + "block.gtceu.rubber_fence": "Каучуковий паркан", + "block.gtceu.rubber_fence_gate": "Каучукова хвіртка", + "block.gtceu.rubber_hanging_sign": "Каучукова вивіска", + "block.gtceu.rubber_leaves": "Каучукове листя", + "block.gtceu.rubber_log": "Каучукова колода", + "block.gtceu.rubber_planks": "Каучукові дошки", + "block.gtceu.rubber_pressure_plate": "Каучукова натискна плита", + "block.gtceu.rubber_sapling": "Каучуковий паросток", + "block.gtceu.rubber_sign": "Каучукова табличка", + "block.gtceu.rubber_slab": "Каучукова плита", + "block.gtceu.rubber_stairs": "Каучукові сходи", + "block.gtceu.rubber_trapdoor": "Каучуковий люк", + "block.gtceu.rubber_wood": "Каучукова деревина", + "block.gtceu.secure_maceration_casing": "Захисний подрібнювальний корпус", + "block.gtceu.shock_proof_cutting_casing": "Ударостійкий різальний корпус", + "block.gtceu.slicing_blades": "Різальні леза", + "block.gtceu.small_dark_concrete_bricks": "Дрібна темна бетонна цегла", + "block.gtceu.small_duct_pipe": "Мала вентиляційна труба", + "block.gtceu.small_light_concrete_bricks": "Дрібна світла бетонна цегла", + "block.gtceu.small_marble_bricks": "Дрібна мармурова цегла", + "block.gtceu.small_red_granite_bricks": "Дрібна червоногранітна цегла", + "block.gtceu.solid_machine_casing": "Міцний корпус машини", + "block.gtceu.spatial_storage_hazard_sign_block": "Блок зі знаком небезпеки просторового сховища", "block.gtceu.square_dark_concrete_bricks": "Квадратна темна бетонна цегла", "block.gtceu.square_light_concrete_bricks": "Квадратна світла бетонна цегла", - "block.gtceu.square_marble_bricks": "Квадратка мармурова цегла", - "block.gtceu.square_red_granite_bricks": "Квадратка цегла з червоного граніту", - "block.gtceu.stable_machine_casing": "Стабільна титанова машинна обшивка", - "block.gtceu.stainless_steel_crate": "Ящик з нержавійної сталі", - "block.gtceu.stainless_steel_drum": "Барабан з нержавійної сталі", - "block.gtceu.stainless_steel_gearbox": "Обшивка коробки передач з нержавійної сталі", - "block.gtceu.stainless_steel_turbine_casing": "Турбінна обшивка з нержавійної сталі", - "block.gtceu.steam_casing_bricked_bronze": "Цегляний корпус з олов'яної бронзи", - "block.gtceu.steam_casing_bricked_bronze.tooltip": "§7Для перших парових машина", - "block.gtceu.steam_casing_bricked_steel": "Цегляний корпус з кованого заліза", - "block.gtceu.steam_casing_bricked_steel.tooltip": "§7Для вдосконалення парових машин", - "block.gtceu.steam_casing_bronze": "Корпус з олов'яної бронзи", - "block.gtceu.steam_casing_bronze.tooltip": "§7Для перших парових машина", + "block.gtceu.square_marble_bricks": "Квадратна мармурова цегла", + "block.gtceu.square_red_granite_bricks": "Квадратна червоногранітна цегла", + "block.gtceu.stable_machine_casing": "Стійкий титановий корпус машини", + "block.gtceu.stainless_steel_crate": "Нержавійний сталевий ящик", + "block.gtceu.stainless_steel_drum": "Нержавійна сталева бочка", + "block.gtceu.stainless_steel_gearbox": "Нержавійний сталевий редукторний корпус", + "block.gtceu.stainless_steel_turbine_casing": "Нержавійний турбінний корпус", + "block.gtceu.steam_casing_bricked_bronze": "Мурований бронзовий корпус", + "block.gtceu.steam_casing_bricked_bronze.tooltip": "§7Для ваших перших парових машин", + "block.gtceu.steam_casing_bricked_steel": "Мурований кованозалізний корпус", + "block.gtceu.steam_casing_bricked_steel.tooltip": "§7Для покращених парових машин", + "block.gtceu.steam_casing_bronze": "Бронзовий корпус", + "block.gtceu.steam_casing_bronze.tooltip": "§7Для ваших перших парових машин", "block.gtceu.steam_casing_steel": "Сталевий корпус", - "block.gtceu.steam_casing_steel.tooltip": "§7Для вдосконалення парових машин", - "block.gtceu.steam_grinder": "Паровий точильник", - "block.gtceu.steam_input_bus": "Парова вхідна предметна шина", - "block.gtceu.steam_input_hatch": "Паровий вхідний рідинний шлюз", + "block.gtceu.steam_casing_steel.tooltip": "§7Для покращених парових машин", + "block.gtceu.steam_grinder": "Парова дробарка", + "block.gtceu.steam_input_bus": "Парова вхідна шина", + "block.gtceu.steam_input_hatch": "Паровий ввідний люк", "block.gtceu.steam_large_turbine": "Велика парова турбіна", "block.gtceu.steam_liquid_boiler.bronze": "Малий паровий рідинний котел", - "block.gtceu.steam_machine_casing": "Парова машинна обшивка", - "block.gtceu.steam_output_bus": "Парова вихідна предметна шина", + "block.gtceu.steam_machine_casing": "Паровий корпус машини", + "block.gtceu.steam_output_bus": "Парова вихідна шина", "block.gtceu.steam_oven": "Парова піч", - "block.gtceu.steam_solid_boiler.bronze": "Малий паровий суцільний котел", - "block.gtceu.steel_brick_casing": "Кованозалізно-цегляна обшивка", + "block.gtceu.steam_solid_boiler.bronze": "Малий паровий твердопаливний котел", + "block.gtceu.steel_brick_casing": "Мурований кованозалізний корпус", "block.gtceu.steel_crate": "Сталевий ящик", - "block.gtceu.steel_drum": "Сталевий барабан", - "block.gtceu.steel_firebox_casing": "Сталева обшивка топки", - "block.gtceu.steel_gearbox": "Сталева обшивка коробки передач", + "block.gtceu.steel_drum": "Сталева бочка", + "block.gtceu.steel_firebox_casing": "Сталева топка", + "block.gtceu.steel_gearbox": "Сталевий редукторний корпус", "block.gtceu.steel_large_boiler": "Великий сталевий котел", - "block.gtceu.steel_machine_casing": "Суцільна сталева машинна обштивка", - "block.gtceu.steel_multiblock_tank": "Сталевий бак багатоблока", - "block.gtceu.steel_pipe_casing": "Сталева обшивка для труб", - "block.gtceu.steel_tank_valve": "Клапан сталевого баку", - "block.gtceu.steel_turbine_casing": "Сталева турбінна обшивка", - "block.gtceu.sterilizing_filter_casing": "Стерилізована фільтраційна обшивка", - "block.gtceu.stress_proof_casing": "Тискостійка обшивка", - "block.gtceu.stripped_rubber_log": "Обтесана гевеєва колода", - "block.gtceu.stripped_rubber_wood": "Обтесана гевеєва деревина", - "block.gtceu.sturdy_machine_casing": "Міцна HSS-E сталева машинна обшивка", - "block.gtceu.substation_capacitor.tooltip_empty": "§7Для заповнення місця на вашій електропідстанції", - "block.gtceu.substation_capacitor.tooltip_filled": "§cМісткість енергії: §f%d EU", - "block.gtceu.superconducting_coil": "Надпровідникова котушка", + "block.gtceu.steel_machine_casing": "Міцний сталевий корпус машини", + "block.gtceu.steel_multiblock_tank": "Сталевий багатоблочний резервуар", + "block.gtceu.steel_pipe_casing": "Сталевий трубний корпус", + "block.gtceu.steel_tank_valve": "Сталевий вентиль резервуара", + "block.gtceu.steel_turbine_casing": "Сталевий турбінний корпус", + "block.gtceu.sterilizing_filter_casing": "Стерилізуючий фільтрувальний корпус", + "block.gtceu.stress_proof_casing": "Стресостійкий корпус", + "block.gtceu.stripped_rubber_log": "Обтесана каучукова колода", + "block.gtceu.stripped_rubber_wood": "Обтесана каучукова деревина", + "block.gtceu.sturdy_machine_casing": "Витривалий HSS-E корпус машини", + "block.gtceu.substation_capacitor.tooltip_empty": "§7Для заповнення простору на вашій електропідстанції", + "block.gtceu.substation_capacitor.tooltip_filled": "§cМісткість енергії:§f %d EU", + "block.gtceu.superconducting_coil": "Блок надпровідної котушки", "block.gtceu.tempered_glass": "Загартоване скло", "block.gtceu.the_end_marker": "Енд", "block.gtceu.the_nether_marker": "Незер", "block.gtceu.titanium_crate": "Титановий ящик", - "block.gtceu.titanium_drum": "Титановий барабан", - "block.gtceu.titanium_firebox_casing": "Титанова обшивка топки", - "block.gtceu.titanium_gearbox": "Титанова обшивка коробки передач", + "block.gtceu.titanium_drum": "Титанова бочка", + "block.gtceu.titanium_firebox_casing": "Титанова топка", + "block.gtceu.titanium_gearbox": "Титановий редукторний корпус", "block.gtceu.titanium_large_boiler": "Великий титановий котел", - "block.gtceu.titanium_pipe_casing": "Титанова обшивка для турб", - "block.gtceu.titanium_turbine_casing": "Титанова турбінна обшивка", - "block.gtceu.treated_wood_button": "Оброблена кнопка", - "block.gtceu.treated_wood_door": "Оброблені двері", - "block.gtceu.treated_wood_fence": "Оброблений паркан", - "block.gtceu.treated_wood_fence_gate": "Оброблена хвіртка", - "block.gtceu.treated_wood_hanging_sign": "Оброблена вивіска", - "block.gtceu.treated_wood_planks": "Оброблені дошки", - "block.gtceu.treated_wood_pressure_plate": "Оброблена натискна плита", - "block.gtceu.treated_wood_sign": "Оброблена табличка", - "block.gtceu.treated_wood_slab": "Оброблена плита", - "block.gtceu.treated_wood_stairs": "Оброблені сходи", - "block.gtceu.treated_wood_trapdoor": "Оброблений люк", - "block.gtceu.trinium_coil_block": "Тринієва котушка", - "block.gtceu.tritanium_coil_block": "Тританієва котушка", - "block.gtceu.tungsten_steel_crate": "Вольфрамо-сталевий ящик", - "block.gtceu.tungsten_steel_drum": "Вольфрамо-сталевий барабан", - "block.gtceu.tungstensteel_firebox_casing": "Вольфрамо-сталева обшивка топки", - "block.gtceu.tungstensteel_gearbox": "Вольфрамо-сталева обшивка коробки передач", - "block.gtceu.tungstensteel_large_boiler": "Великий вольфрамо-сталевий котел", - "block.gtceu.tungstensteel_pipe_casing": "Вольфрамо-сталева ошибка для труб", - "block.gtceu.tungstensteel_turbine_casing": "Вольфрамо-сталева турбінна обшивка", - "block.gtceu.turret_hazard_sign_block": "Табличка турельної небезпеки", - "block.gtceu.uev_1024a_laser_source_hatch": "Лазерно-джерельний роз'єм §aУнН§r 1,024§eA§r", - "block.gtceu.uev_1024a_laser_target_hatch": "Лазерно-цільовий роз'єм §aУнН§r 1,024§eA§r", - "block.gtceu.uev_16a_energy_converter": "Конвертор енергії §aУнН§r 16§eA§r", - "block.gtceu.uev_1a_energy_converter": "Конвертор енергії §aУнН§r 1§eA§r", - "block.gtceu.uev_256a_laser_source_hatch": "Лазерно-джерельний роз'єм §aУнН§r 256§eA§r", - "block.gtceu.uev_256a_laser_target_hatch": "Лазерно-цільовий роз'єм §aУнН§r 256§eA§r", - "block.gtceu.uev_4096a_laser_source_hatch": "Лазерно-джерельний роз'єм §aУнН§r 4,096§eA§r", - "block.gtceu.uev_4096a_laser_target_hatch": "Лазерно-цільовий роз'єм §aУнН§r 4,096§eA§r", - "block.gtceu.uev_4a_energy_converter": "Конвертор енергії §aУнН§r 4§eA§r", - "block.gtceu.uev_8a_energy_converter": "Конвертор енергії §aУнН§r 8§eA§r", - "block.gtceu.uev_alloy_smelter": "§aЕпічний топильник сплавів I§r", + "block.gtceu.titanium_pipe_casing": "Титановий трубний корпус", + "block.gtceu.titanium_turbine_casing": "Титановий турбінний корпус", + "block.gtceu.treated_wood_button": "Оброблена дерев'яна кнопка", + "block.gtceu.treated_wood_door": "Оброблені дерев'яні двері", + "block.gtceu.treated_wood_fence": "Оброблений дерев'яний паркан", + "block.gtceu.treated_wood_fence_gate": "Оброблена дерев'яна хвіртка", + "block.gtceu.treated_wood_hanging_sign": "Оброблена дерев'яна вивіска", + "block.gtceu.treated_wood_planks": "Оброблені дерев'яні дошки", + "block.gtceu.treated_wood_pressure_plate": "Оброблена дерев'яна натискна плита", + "block.gtceu.treated_wood_sign": "Оброблена дерев'яна табличка", + "block.gtceu.treated_wood_slab": "Оброблена дерев'яна плита", + "block.gtceu.treated_wood_stairs": "Оброблені дерев'яні сходи", + "block.gtceu.treated_wood_trapdoor": "Оброблений дерев'яний люк", + "block.gtceu.trinium_coil_block": "Блок тринієвої котушки", + "block.gtceu.tritanium_coil_block": "Блок тританієвої котушки", + "block.gtceu.tungsten_steel_crate": "Вольфрамовий ящик", + "block.gtceu.tungsten_steel_drum": "Вольфрамова бочка", + "block.gtceu.tungstensteel_firebox_casing": "Вольфрамова сталева топка", + "block.gtceu.tungstensteel_gearbox": "Вольфрамовий сталевий редукторний корпус", + "block.gtceu.tungstensteel_large_boiler": "Великий вольфрамовий котел", + "block.gtceu.tungstensteel_pipe_casing": "Вольфрамовий сталевий трубний корпус", + "block.gtceu.tungstensteel_turbine_casing": "Вольфрамовий сталевий турбінний корпус", + "block.gtceu.turret_hazard_sign_block": "Блок зі знаком турельної небезпеки", + "block.gtceu.uev_1024a_laser_source_hatch": "§aUEV§r 1,024§eA§r люк джерела лазера", + "block.gtceu.uev_1024a_laser_target_hatch": "§aUEV§r 1,024§eA§r люк цілі лазера", + "block.gtceu.uev_16a_energy_converter": "§aUEV§r 16§eA§r енергетичний конвертер", + "block.gtceu.uev_1a_energy_converter": "§aUEV§r 1§eA§r енергетичний конвертер", + "block.gtceu.uev_256a_laser_source_hatch": "§aUEV§r 256§eA§r люк джерела лазера", + "block.gtceu.uev_256a_laser_target_hatch": "§aUEV§r 256§eA§r люк цілі лазера", + "block.gtceu.uev_4096a_laser_source_hatch": "§aUEV§r 4,096§eA§r люк джерела лазера", + "block.gtceu.uev_4096a_laser_target_hatch": "§aUEV§r 4,096§eA§r люк цілі лазера", + "block.gtceu.uev_4a_energy_converter": "§aUEV§r 4§eA§r енергетичний конвертер", + "block.gtceu.uev_8a_energy_converter": "§aUEV§r 8§eA§r енергетичний конвертер", + "block.gtceu.uev_alloy_smelter": "§aЕпічна плавильня сплавів II§r", "block.gtceu.uev_arc_furnace": "§aЕпічна дугова піч II§r", "block.gtceu.uev_assembler": "§aЕпічний збирач II§r", "block.gtceu.uev_autoclave": "§aЕпічний автоклав II§r", - "block.gtceu.uev_battery_buffer_16x": "16x буфер батареї §aультранадмірної напруги§r", - "block.gtceu.uev_battery_buffer_4x": "4x буфер батареї §aультранадмірної напруги§r", - "block.gtceu.uev_battery_buffer_8x": "8x буфер батареї §aультранадмірної напруги§r", - "block.gtceu.uev_bender": "§aЕпічний листозгиначII§r", - "block.gtceu.uev_brewery": "§aЕпічна варильня II§r", - "block.gtceu.uev_canner": "§aЕпічний консерватор II§r", + "block.gtceu.uev_battery_buffer_16x": "§aНадмірно екстремальна напруга§r 16x акумуляторний буфер", + "block.gtceu.uev_battery_buffer_4x": "§aНадмірно екстремальна напруга§r 4x акумуляторний буфер", + "block.gtceu.uev_battery_buffer_8x": "§aНадмірно екстремальна напруга§r 8x акумуляторний буфер", + "block.gtceu.uev_bender": "§aЕпічний згинач II§r", + "block.gtceu.uev_brewery": "§aЕпічний варильник II§r", + "block.gtceu.uev_canner": "§aЕпічний пакувальник II§r", "block.gtceu.uev_centrifuge": "§aЕпічна центрифуга II§r", - "block.gtceu.uev_charger_4x": "4x турбозарядка §aзавеликої напруги§r", + "block.gtceu.uev_charger_4x": "§aНадмірно екстремальна напруга§r 4x турбозарядник", "block.gtceu.uev_chemical_bath": "§aЕпічна хімічна ванна II§r", "block.gtceu.uev_chemical_reactor": "§aЕпічний хімічний реактор II§r", - "block.gtceu.uev_circuit_assembler": "§aЕпічний збирач схем II§r", + "block.gtceu.uev_circuit_assembler": "§aЕпічний схемотехнічний збирач II§r", "block.gtceu.uev_compressor": "§aЕпічний компресор II§r", - "block.gtceu.uev_cutter": "§aЕпічна різальна машина II§r", - "block.gtceu.uev_diode": "§aДіод УнН", + "block.gtceu.uev_cutter": "§aЕпічний різак II§r", + "block.gtceu.uev_diode": "§aUEV діод", "block.gtceu.uev_distillery": "§aЕпічний дистилятор II§r", - "block.gtceu.uev_dual_input_hatch": "§aПодвійний вхідний рідинний шлюз УнН", - "block.gtceu.uev_dual_output_hatch": "§aПодвійний вихідний рідинний шлюз УнН", + "block.gtceu.uev_dual_input_hatch": "§aUEV подвійний ввідний люк", + "block.gtceu.uev_dual_output_hatch": "§aUEV подвійний вивідний люк", "block.gtceu.uev_electric_furnace": "§aЕпічна електрична піч II§r", "block.gtceu.uev_electrolyzer": "§aЕпічний електролізер II§r", - "block.gtceu.uev_electromagnetic_separator": "§aЕпічний електромагнітний розділювач II§r", - "block.gtceu.uev_energy_input_hatch": "§aВхідний роз'єм енергії УнН", - "block.gtceu.uev_energy_input_hatch_16a": "§aВхідний роз'єм енергії УнН 16A", - "block.gtceu.uev_energy_input_hatch_4a": "§aВхідний роз'єм енергії УнН 4A", - "block.gtceu.uev_energy_output_hatch": "§aВихідний роз'єм енергії УнН", - "block.gtceu.uev_energy_output_hatch_16a": "§aВихідний роз'єм енергії УнН 16A", - "block.gtceu.uev_energy_output_hatch_4a": "§aВихідний роз'єм енергії УнН 4A", + "block.gtceu.uev_electromagnetic_separator": "§aЕпічний електромагнітний сепаратор II§r", + "block.gtceu.uev_energy_input_hatch": "§aUEV енергетичний люк", + "block.gtceu.uev_energy_input_hatch_16a": "§aUEV 16A енергетичний люк", + "block.gtceu.uev_energy_input_hatch_4a": "§aUEV 4A енергетичний люк", + "block.gtceu.uev_energy_output_hatch": "§aUEV динамо-люк", + "block.gtceu.uev_energy_output_hatch_16a": "§aUEV 16A динамо-люк", + "block.gtceu.uev_energy_output_hatch_4a": "§aUEV 4A динамо-люк", "block.gtceu.uev_extractor": "§aЕпічний екстрактор II§r", - "block.gtceu.uev_extruder": "§aЕпічний екструдор II§r", + "block.gtceu.uev_extruder": "§aЕпічний екструдер II§r", "block.gtceu.uev_fermenter": "§aЕпічний ферментатор II§r", - "block.gtceu.uev_fluid_heater": "§aЕпічний рідинний обігрівач II§r", - "block.gtceu.uev_fluid_passthrough_hatch": "§aПрохідний рідинний шлюз УнН", + "block.gtceu.uev_fluid_heater": "§aЕпічний рідинний нагрівач II§r", + "block.gtceu.uev_fluid_passthrough_hatch": "§aUEV прохідний рідинний люк", "block.gtceu.uev_fluid_solidifier": "§aЕпічний рідинний затверджувач II§r", "block.gtceu.uev_forge_hammer": "§aЕпічний ковальський молот II§r", - "block.gtceu.uev_forming_press": "§aЕпічний формувальний прес II§r", - "block.gtceu.uev_gas_collector": "§aЕпінчий повітрозабірник II§r", - "block.gtceu.uev_input_bus": "§aВхідна предметна шина УнН", - "block.gtceu.uev_input_hatch": "§aВхідний рідинний шлюз УнН", - "block.gtceu.uev_input_hatch_4x": "§aЧетверний вхідний рідинний шлюз УнН", - "block.gtceu.uev_input_hatch_9x": "§aНепарний вхідний рідинний шлюз УнН", - "block.gtceu.uev_item_passthrough_hatch": "§aПрохідний предметний шлюз УнН", - "block.gtceu.uev_laser_engraver": "§aЕпічний лазерний граверII§r", - "block.gtceu.uev_lathe": "§aЕпічний токарний станок II§r", + "block.gtceu.uev_forming_press": "§aЕпічний формовий прес II§r", + "block.gtceu.uev_gas_collector": "§aЕпічний газозбірник II§r", + "block.gtceu.uev_input_bus": "§aUEV вхідна шина", + "block.gtceu.uev_input_hatch": "§aUEV ввідний люк", + "block.gtceu.uev_input_hatch_4x": "§aUEV чотирикамерний ввідний люк", + "block.gtceu.uev_input_hatch_9x": "§aUEV дев'ятикамерний ввідний люк", + "block.gtceu.uev_item_passthrough_hatch": "§aUEV прохідний предметний люк", + "block.gtceu.uev_laser_engraver": "§aЕпічний літограф II§r", + "block.gtceu.uev_lathe": "§aЕпічний токар II§r", "block.gtceu.uev_macerator": "§aЕпічний подрібнювач II§r", - "block.gtceu.uev_machine_casing": "Машинна обшивка УнН", - "block.gtceu.uev_machine_hull": "Машинний корпус §aУнН§f", + "block.gtceu.uev_machine_casing": "UEV корпус машини", + "block.gtceu.uev_machine_hull": "§aUEV§f машинна основа", "block.gtceu.uev_mixer": "§aЕпічний змішувач II§r", - "block.gtceu.uev_muffler_hatch": "Заглушений шлюз §aУнН", - "block.gtceu.uev_ore_washer": "§aЕпічний очищувач руд II§r", - "block.gtceu.uev_output_bus": "§aВихідна предметна шина УнН", - "block.gtceu.uev_output_hatch": "§aВихідний рідинний шлюз УнН", - "block.gtceu.uev_output_hatch_4x": "§aЧетверний вихідний рідинний шлюз УнН", - "block.gtceu.uev_output_hatch_9x": "§aНепарний вихідний рідинний шлюз УнН", + "block.gtceu.uev_muffler_hatch": "Люк вихлопу§a UEV", + "block.gtceu.uev_ore_washer": "§aЕпічний рудопромивач II§r", + "block.gtceu.uev_output_bus": "§aUEV вихідна шина", + "block.gtceu.uev_output_hatch": "§aUEV вивідний люк", + "block.gtceu.uev_output_hatch_4x": "§aUEV чотирикамерний вивідний люк", + "block.gtceu.uev_output_hatch_9x": "§aUEV дев'ятикамерний вивідний люк", "block.gtceu.uev_packer": "§aЕпічний пакувальник II§r", "block.gtceu.uev_polarizer": "§aЕпічний намагнічувач II§r", "block.gtceu.uev_quantum_chest": "Квантова скриня X", - "block.gtceu.uev_quantum_tank": "Квантовий бак X", - "block.gtceu.uev_rock_crusher": "§aЕпічний подрібнювач породи II§r", - "block.gtceu.uev_rotor_holder": "§aТримач ротора УнН", + "block.gtceu.uev_quantum_tank": "Квантовий резервуар X", + "block.gtceu.uev_rock_crusher": "§aЕпічна кам'яна дробарка II§r", + "block.gtceu.uev_rotor_holder": "§aUEV тримач ротора", "block.gtceu.uev_scanner": "§aЕпічний сканер II§r", - "block.gtceu.uev_sifter": "§aпічний просіювач II§r", - "block.gtceu.uev_substation_input_hatch_64a": "§aВхідна підстанція роз'єму енергії 64A УнН", - "block.gtceu.uev_substation_output_hatch_64a": "§aВихідна підстанція роз'єму енергії 64A УнН", - "block.gtceu.uev_thermal_centrifuge": "§aЕпічна термоцентрифуга II§r", - "block.gtceu.uev_transformer_16a": "Сильний трансформатор §aультранадмірної напруги§r", - "block.gtceu.uev_transformer_1a": "Трансформатор §aультранадмірної напруги§r", - "block.gtceu.uev_transformer_2a": "2x трансформатор §aультранадмірної напруги§r", - "block.gtceu.uev_transformer_4a": "4x трансформатор §aультранадмірної напруги§r", - "block.gtceu.uev_wiremill": "§aЕлітний прокатний станок II§r", - "block.gtceu.uhv_1024a_laser_source_hatch": "Лазерно-джерельний роз'єм §4УвН§r 1,024§eA§r", - "block.gtceu.uhv_1024a_laser_target_hatch": "Лазерно-цільовий роз'єм §4УвН§r 1,024§eA§r", - "block.gtceu.uhv_16a_energy_converter": "Лазерно-джерельний роз'єм §4УвН§r 16§eA§r", - "block.gtceu.uhv_1a_energy_converter": "Лазерно-цільовий роз'єм §4УвН§r 1§eA§r", - "block.gtceu.uhv_256a_laser_source_hatch": "Лазерно-джерельний роз'єм §4УвН§r 256§eA§r", - "block.gtceu.uhv_256a_laser_target_hatch": "Лазерно-цільовий роз'єм §4УвН§r 256§eA§r", - "block.gtceu.uhv_4096a_laser_source_hatch": "Лазерно-джерельний роз'єм §4УвН 4,096§eA§r", - "block.gtceu.uhv_4096a_laser_target_hatch": "Лазерно-цільовий роз'єм §4УвН§r 4,096§eA§r", - "block.gtceu.uhv_4a_energy_converter": "Конвертор енергії §4УвН§r 4§eA§r", - "block.gtceu.uhv_8a_energy_converter": "Конвертор енергії §4УвН§r 8§eA§r", - "block.gtceu.uhv_alloy_smelter": "§4Епічний топильник сплавів§r", - "block.gtceu.uhv_arc_furnace": "§4Епічна дугова піч§r", - "block.gtceu.uhv_assembler": "§4Епічний збирач§r", - "block.gtceu.uhv_autoclave": "§4Епічний автоклав§r", - "block.gtceu.uhv_battery_buffer_16x": "16x буфер батареї §4ультравискокої напруги§r", - "block.gtceu.uhv_battery_buffer_4x": "4x буфер батареї §4ультравискокої напруги§r", - "block.gtceu.uhv_battery_buffer_8x": "8x буфер батареї §4ультравискокої напруги§r", - "block.gtceu.uhv_bender": "§4Епічний листозгинач§r", - "block.gtceu.uhv_brewery": "§4Епічна варильня§r", - "block.gtceu.uhv_canner": "§4Епічний консерватор§r", - "block.gtceu.uhv_centrifuge": "§4Епічна центрифуга§r", - "block.gtceu.uhv_charger_4x": "4x турбозарядка §4ультравискокої напруги§r", - "block.gtceu.uhv_chemical_bath": "§4Епічна хімічна ванна§r", - "block.gtceu.uhv_chemical_reactor": "§4Епічний хімічний реактор§r", - "block.gtceu.uhv_circuit_assembler": "§4Епічний збирач схем§r", - "block.gtceu.uhv_compressor": "§4Епічний компресор§r", - "block.gtceu.uhv_cutter": "§4Епічна різальна машина§r", - "block.gtceu.uhv_diode": "§4Діод УвН", - "block.gtceu.uhv_distillery": "§4Епічний дистилятор§r", - "block.gtceu.uhv_dual_input_hatch": "§4Подвійний вхідний рідинний шлюз УвН", - "block.gtceu.uhv_dual_output_hatch": "§4Подвійний вихідний рідинний шлюз УвН", - "block.gtceu.uhv_electric_furnace": "§4Епічна електрична піч§r", - "block.gtceu.uhv_electrolyzer": "§4Епічний електролізер§r", - "block.gtceu.uhv_electromagnetic_separator": "§4Епічний електромагнітний розділювач§r", - "block.gtceu.uhv_energy_input_hatch": "§4Вхідний роз'єм енергії УвН", - "block.gtceu.uhv_energy_input_hatch_16a": "§4Вхідний роз'єм енергії УвН 16A", - "block.gtceu.uhv_energy_input_hatch_4a": "§4Вхідний роз'єм енергії УвН 4A", - "block.gtceu.uhv_energy_output_hatch": "§4Вихідний роз'єм енергії УвН", - "block.gtceu.uhv_energy_output_hatch_16a": "§4Вихідний роз'єм енергії УвН 16A", - "block.gtceu.uhv_energy_output_hatch_4a": "§4Вихідний роз'єм енергії УвН 4A", - "block.gtceu.uhv_extractor": "§4Епічний кестрактор§r", - "block.gtceu.uhv_extruder": "§4Епічний еструдор§r", - "block.gtceu.uhv_fermenter": "§4Епічний ферментатор§r", - "block.gtceu.uhv_fluid_heater": "§4Епічний рідинний обігрівач§r", - "block.gtceu.uhv_fluid_passthrough_hatch": "§4Прохідний рідинний шлюз УвН", - "block.gtceu.uhv_fluid_solidifier": "§4Епічнй рідинний затверджувач§r", - "block.gtceu.uhv_forge_hammer": "§4Епічний ковальський молот§r", - "block.gtceu.uhv_forming_press": "§4Епічний формувальний прес§r", - "block.gtceu.uhv_gas_collector": "§4Епічний повітрозабірник§r", - "block.gtceu.uhv_hermetic_casing": "Герметична обшивка IX", - "block.gtceu.uhv_input_bus": "§4Вхідна предметна шина УвН", - "block.gtceu.uhv_input_hatch": "§4Вхідний рідинний шлюз УвН", - "block.gtceu.uhv_input_hatch_4x": "§4Четверний вхідний рідинний шлюз УвН", - "block.gtceu.uhv_input_hatch_9x": "§4Непарний вхідний рідинний шлюз УвН", - "block.gtceu.uhv_item_passthrough_hatch": "§4Прохідний предметний шлюз УвН", - "block.gtceu.uhv_laser_engraver": "§4Епічний лазерний гравер§r", - "block.gtceu.uhv_lathe": "§4Епічний токарний станок§r", - "block.gtceu.uhv_macerator": "§4Епічний подрібнювач§r", - "block.gtceu.uhv_machine_casing": "Машинна обшивка УвН", - "block.gtceu.uhv_machine_hull": "Машинний корпус §4УвН§f", - "block.gtceu.uhv_mixer": "§4Епічний змішувач§r", - "block.gtceu.uhv_muffler_hatch": "Заглушений шлюз §4УвН", - "block.gtceu.uhv_ore_washer": "§4Епічний очищувач руд§r", - "block.gtceu.uhv_output_bus": "§4Вихідна предметна шина УвН", - "block.gtceu.uhv_output_hatch": "§4Вихідний рідинний шлюз УвН", - "block.gtceu.uhv_output_hatch_4x": "§4Четверний вихідний рідинний шлюз УвН", - "block.gtceu.uhv_output_hatch_9x": "§4Непарний вихідний рідинний шлюз УвН", - "block.gtceu.uhv_packer": "§4Епічний пакувальник§r", - "block.gtceu.uhv_polarizer": "§4Епічний намагнічувач§r", + "block.gtceu.uev_sifter": "§aЕпічний просіювач II§r", + "block.gtceu.uev_substation_input_hatch_64a": "§aUEV 64A енергетичний люк підстанції", + "block.gtceu.uev_substation_output_hatch_64a": "§aUEV 64A динамо-люк підстанції", + "block.gtceu.uev_thermal_centrifuge": "§aЕпічна термічна центрифуга II§r", + "block.gtceu.uev_transformer_16a": "§aНадмірно екстремальна напруга§r Силовий трансформатор", + "block.gtceu.uev_transformer_1a": "§aНадмірно екстремальна напруга§r Трансформатор", + "block.gtceu.uev_transformer_2a": "§aНадмірно екстремальна напруга§r Трансформатор високого струму (2x)", + "block.gtceu.uev_transformer_4a": "§aНадмірно екстремальна напруга§r Трансформатор високого струму (4x)", + "block.gtceu.uev_wiremill": "§aЕпічний волок II§r", + "block.gtceu.uhv_1024a_laser_source_hatch": "§4UHV§r 1,024§eA§r люк джерела лазера", + "block.gtceu.uhv_1024a_laser_target_hatch": "§4UHV§r 1,024§eA§r люк цілі лазера", + "block.gtceu.uhv_16a_energy_converter": "§4UHV§r 16§eA§r енергетичний конвертер", + "block.gtceu.uhv_1a_energy_converter": "§4UHV§r 1§eA§r енергетичний конвертер", + "block.gtceu.uhv_256a_laser_source_hatch": "§4UHV§r 256§eA§r люк джерела лазера", + "block.gtceu.uhv_256a_laser_target_hatch": "§4UHV§r 256§eA§r люк цілі лазера", + "block.gtceu.uhv_4096a_laser_source_hatch": "§4UHV§r 4,096§eA§r люк джерела лазера", + "block.gtceu.uhv_4096a_laser_target_hatch": "§4UHV§r 4,096§eA§r люк цілі лазера", + "block.gtceu.uhv_4a_energy_converter": "§4UHV§r 4§eA§r енергетичний конвертер", + "block.gtceu.uhv_8a_energy_converter": "§4UHV§r 8§eA§r енергетичний конвертер", + "block.gtceu.uhv_alloy_smelter": "§4Епічна плавильня сплавів §r ", + "block.gtceu.uhv_arc_furnace": "§4Епічна дугова піч§r ", + "block.gtceu.uhv_assembler": "§4Епічний збирач§r ", + "block.gtceu.uhv_autoclave": "§4Епічний автоклав§r ", + "block.gtceu.uhv_battery_buffer_16x": "§4Надмірно висока напруга§r 16x акумуляторний буфер", + "block.gtceu.uhv_battery_buffer_4x": "§4Надмірно висока напруга§r 4x акумуляторний буфер", + "block.gtceu.uhv_battery_buffer_8x": "§4Надмірно висока напруга§r 8x акумуляторний буфер", + "block.gtceu.uhv_bender": "§4Епічний згинач§r ", + "block.gtceu.uhv_brewery": "§4Епічний варильник§r ", + "block.gtceu.uhv_canner": "§4Епічний пакувальник§r ", + "block.gtceu.uhv_centrifuge": "§4Епічна центрифуга§r ", + "block.gtceu.uhv_charger_4x": "§4Надмірно висока напруга§r 4x турбозарядник", + "block.gtceu.uhv_chemical_bath": "§4Епічна хімічна ванна§r ", + "block.gtceu.uhv_chemical_reactor": "§4Епічний хімічний реактор§r ", + "block.gtceu.uhv_circuit_assembler": "§4Епічний схемотехнічний збирач§r ", + "block.gtceu.uhv_compressor": "§4Епічний компресор§r ", + "block.gtceu.uhv_cutter": "§4Епічний різак§r ", + "block.gtceu.uhv_diode": "§4UHV діод", + "block.gtceu.uhv_distillery": "§4Епічний дистилятор§r ", + "block.gtceu.uhv_dual_input_hatch": "§4UHV подвійний ввідний люк", + "block.gtceu.uhv_dual_output_hatch": "§4UHV подвійний вивідний люк", + "block.gtceu.uhv_electric_furnace": "§4Епічна електрична піч§r ", + "block.gtceu.uhv_electrolyzer": "§4Епічний електролізер§r ", + "block.gtceu.uhv_electromagnetic_separator": "§4Епічний електромагнітний сепаратор§r ", + "block.gtceu.uhv_energy_input_hatch": "§4UHV енергетичний люк", + "block.gtceu.uhv_energy_input_hatch_16a": "§4UHV 16A енергетичний люк", + "block.gtceu.uhv_energy_input_hatch_4a": "§4UHV 4A енергетичний люк", + "block.gtceu.uhv_energy_output_hatch": "§4UHV динамо-люк", + "block.gtceu.uhv_energy_output_hatch_16a": "§4UHV 16A динамо-люк", + "block.gtceu.uhv_energy_output_hatch_4a": "§4UHV 4A динамо-люк", + "block.gtceu.uhv_extractor": "§4Епічний екстрактор§r ", + "block.gtceu.uhv_extruder": "§4Епічний екструдер§r ", + "block.gtceu.uhv_fermenter": "§4Епічний ферментатор§r ", + "block.gtceu.uhv_fluid_heater": "§4Епічний рідинний нагрівач§r ", + "block.gtceu.uhv_fluid_passthrough_hatch": "§4UHV прохідний рідинний люк", + "block.gtceu.uhv_fluid_solidifier": "§4Епічний рідинний затверджувач§r ", + "block.gtceu.uhv_forge_hammer": "§4Епічний ковальський молот§r ", + "block.gtceu.uhv_forming_press": "§4Епічний формовий прес§r ", + "block.gtceu.uhv_gas_collector": "§4Епічний газозбірник§r ", + "block.gtceu.uhv_hermetic_casing": "Герметичний корпус IX", + "block.gtceu.uhv_input_bus": "§4UHV вхідна шина", + "block.gtceu.uhv_input_hatch": "§4UHV ввідний люк", + "block.gtceu.uhv_input_hatch_4x": "§4UHV чотирикамерний ввідний люк", + "block.gtceu.uhv_input_hatch_9x": "§4UHV дев'ятикамерний ввідний люк", + "block.gtceu.uhv_item_passthrough_hatch": "§4UHV прохідний предметний люк", + "block.gtceu.uhv_laser_engraver": "§4Епічний літограф§r ", + "block.gtceu.uhv_lathe": "§4Епічний токар§r ", + "block.gtceu.uhv_macerator": "§4Епічний подрібнювач§r ", + "block.gtceu.uhv_machine_casing": "UHV корпус машини", + "block.gtceu.uhv_machine_hull": "§4UHV§f машинна основа", + "block.gtceu.uhv_mixer": "§4Епічний змішувач§r ", + "block.gtceu.uhv_muffler_hatch": "Люк вихлопу§4 UHV", + "block.gtceu.uhv_ore_washer": "§4Епічний рудопромивач§r ", + "block.gtceu.uhv_output_bus": "§4UHV вихідна шина", + "block.gtceu.uhv_output_hatch": "§4UHV вивідний люк", + "block.gtceu.uhv_output_hatch_4x": "§4UHV чотирикамерний вивідний люк", + "block.gtceu.uhv_output_hatch_9x": "§4UHV дев'ятикамерний вивідний люк", + "block.gtceu.uhv_packer": "§4Епічний пакувальник§r ", + "block.gtceu.uhv_polarizer": "§4Епічний намагнічувач§r ", "block.gtceu.uhv_quantum_chest": "Квантова скриня IX", - "block.gtceu.uhv_quantum_tank": "Квантовий бак IX", - "block.gtceu.uhv_rock_crusher": "§4Епічний подрібнювач породи§r", - "block.gtceu.uhv_rotor_holder": "§4Тримач ротора УвН", - "block.gtceu.uhv_scanner": "§4Епічний сканер§r", - "block.gtceu.uhv_sifter": "§4Епічний просіювач§r", - "block.gtceu.uhv_substation_input_hatch_64a": "§4Вхідна підстанція роз'єму енергії УвН 64A", - "block.gtceu.uhv_substation_output_hatch_64a": "§4Вихідна підстанція роз'єму енергії УвН 64A", - "block.gtceu.uhv_thermal_centrifuge": "§4Епічна термоцентрифуга§r", - "block.gtceu.uhv_transformer_16a": "Сильний трансформатор §4ультрависокої напруги§r", - "block.gtceu.uhv_transformer_1a": "Трансформатор §4ультрависокої напруги§r", - "block.gtceu.uhv_transformer_2a": "2x трансформатор §4ультрависокої напруги§r", - "block.gtceu.uhv_transformer_4a": "4x трансформатор §4ультрависокої напруги§r", - "block.gtceu.uhv_ultimate_battery": "Безмежний конденсатор УвН", - "block.gtceu.uhv_wiremill": "§4Епічний прокатний станок§r", - "block.gtceu.uiv_1024a_laser_source_hatch": "Лазерно-джерельний роз'єм §2НвН§r 1,024§eA§r", - "block.gtceu.uiv_1024a_laser_target_hatch": "Лазерно-цільовий роз'єм §2НвН§r 1,024§eA§r", - "block.gtceu.uiv_16a_energy_converter": "Конвертор енергії §2НвН§r 16§eA§r", - "block.gtceu.uiv_1a_energy_converter": "Конвертор енергії §2НвН§r 1§eA§r", - "block.gtceu.uiv_256a_laser_source_hatch": "Лазерно-джерельний роз'єм §2НвН§r 256§eA§r", - "block.gtceu.uiv_256a_laser_target_hatch": "Лазерно-цільовий роз'єм §2НвН§r 256§eA§r", - "block.gtceu.uiv_4096a_laser_source_hatch": "Лазерно-джерельний роз'єм §2НвН§r 4,096§eA§r", - "block.gtceu.uiv_4096a_laser_target_hatch": "Лазерно-цільовий роз'єм §2НвН§r 4,096§eA§r", - "block.gtceu.uiv_4a_energy_converter": "Конвертор енергії §2НвН§r 4§eA§r", - "block.gtceu.uiv_8a_energy_converter": "Конвертор енергії §2НвН§r 8§eA§r", - "block.gtceu.uiv_alloy_smelter": "§2Епічний топильник сплавів III§r", + "block.gtceu.uhv_quantum_tank": "Квантовий резервуар IX", + "block.gtceu.uhv_rock_crusher": "§4Епічна кам'яна дробарка§r ", + "block.gtceu.uhv_rotor_holder": "§4UHV тримач ротора", + "block.gtceu.uhv_scanner": "§4Епічний сканер§r ", + "block.gtceu.uhv_sifter": "§4Епічний просіювач§r ", + "block.gtceu.uhv_substation_input_hatch_64a": "§4UHV 64A енергетичний люк підстанції", + "block.gtceu.uhv_substation_output_hatch_64a": "§4UHV 64A динамо-люк підстанції", + "block.gtceu.uhv_thermal_centrifuge": "§4Епічна термічна центрифуга§r ", + "block.gtceu.uhv_transformer_16a": "§4Надмірно висока напруга§r Силовий трансформатор", + "block.gtceu.uhv_transformer_1a": "§4Надмірно висока напруга§r Трансформатор", + "block.gtceu.uhv_transformer_2a": "§4Надмірно висока напруга§r Трансформатор високого струму (2x)", + "block.gtceu.uhv_transformer_4a": "§4Надмірно висока напруга§r Трансформатор високого струму (4x)", + "block.gtceu.uhv_ultimate_battery": "UHV ультимативний акумулятор", + "block.gtceu.uhv_wiremill": "§4Епічний волок§r ", + "block.gtceu.uiv_1024a_laser_source_hatch": "§2UIV§r 1,024§eA§r люк джерела лазера", + "block.gtceu.uiv_1024a_laser_target_hatch": "§2UIV§r 1,024§eA§r люк цілі лазера", + "block.gtceu.uiv_16a_energy_converter": "§2UIV§r 16§eA§r енергетичний конвертер", + "block.gtceu.uiv_1a_energy_converter": "§2UIV§r 1§eA§r енергетичний конвертер", + "block.gtceu.uiv_256a_laser_source_hatch": "§2UIV§r 256§eA§r люк джерела лазера", + "block.gtceu.uiv_256a_laser_target_hatch": "§2UIV§r 256§eA§r люк цілі лазера", + "block.gtceu.uiv_4096a_laser_source_hatch": "§2UIV§r 4,096§eA§r люк джерела лазера", + "block.gtceu.uiv_4096a_laser_target_hatch": "§2UIV§r 4,096§eA§r люк цілі лазера", + "block.gtceu.uiv_4a_energy_converter": "§2UIV§r 4§eA§r енергетичний конвертер", + "block.gtceu.uiv_8a_energy_converter": "§2UIV§r 8§eA§r енергетичний конвертер", + "block.gtceu.uiv_alloy_smelter": "§2Епічна плавильня сплавів III§r", "block.gtceu.uiv_arc_furnace": "§2Епічна дугова піч III§r", "block.gtceu.uiv_assembler": "§2Епічний збирач III§r", "block.gtceu.uiv_autoclave": "§2Епічний автоклав III§r", - "block.gtceu.uiv_battery_buffer_16x": "16x буфер батареї §2надвисокої напруги§r", - "block.gtceu.uiv_battery_buffer_4x": "4x буфер батареї §2надвисокої напруги§r", - "block.gtceu.uiv_battery_buffer_8x": "8x буфер батареї §2надвисокої напруги§r", - "block.gtceu.uiv_bender": "§2Епічний листозгинач III§r", - "block.gtceu.uiv_brewery": "§2Епічна варильня III§r", - "block.gtceu.uiv_canner": "§2Епічний консерватор III§r", + "block.gtceu.uiv_battery_buffer_16x": "§2Надмірно неосяжна напруга§r 16x акумуляторний буфер", + "block.gtceu.uiv_battery_buffer_4x": "§2Надмірно неосяжна напруга§r 4x акумуляторний буфер", + "block.gtceu.uiv_battery_buffer_8x": "§2Надмірно неосяжна напруга§r 8x акумуляторний буфер", + "block.gtceu.uiv_bender": "§2Епічний згинач III§r", + "block.gtceu.uiv_brewery": "§2Епічний варильник III§r", + "block.gtceu.uiv_canner": "§2Епічний пакувальник III§r", "block.gtceu.uiv_centrifuge": "§2Епічна центрифуга III§r", - "block.gtceu.uiv_charger_4x": "4x турбозарядка §2надвисокої напруги§r", + "block.gtceu.uiv_charger_4x": "§2Надмірно неосяжна напруга§r 4x турбозарядник", "block.gtceu.uiv_chemical_bath": "§2Епічна хімічна ванна III§r", "block.gtceu.uiv_chemical_reactor": "§2Епічний хімічний реактор III§r", - "block.gtceu.uiv_circuit_assembler": "§2Епічний збирач схем III§r", + "block.gtceu.uiv_circuit_assembler": "§2Епічний схемотехнічний збирач III§r", "block.gtceu.uiv_compressor": "§2Епічний компресор III§r", - "block.gtceu.uiv_cutter": "§2Епічна різальна машинна III§r", - "block.gtceu.uiv_diode": "§2Діон НвН", + "block.gtceu.uiv_cutter": "§2Епічний різак III§r", + "block.gtceu.uiv_diode": "§2UIV діод", "block.gtceu.uiv_distillery": "§2Епічний дистилятор III§r", - "block.gtceu.uiv_dual_input_hatch": "§2Подвійний вхідний рідинний шлюз НвН", - "block.gtceu.uiv_dual_output_hatch": "§2Подвійний вихідний рідинний шлюз НвН", + "block.gtceu.uiv_dual_input_hatch": "§2UIV подвійний ввідний люк", + "block.gtceu.uiv_dual_output_hatch": "§2UIV подвійний вивідний люк", "block.gtceu.uiv_electric_furnace": "§2Епічна електрична піч III§r", "block.gtceu.uiv_electrolyzer": "§2Епічний електролізер III§r", - "block.gtceu.uiv_electromagnetic_separator": "§2Епічний електричний розділювач III§r", - "block.gtceu.uiv_energy_input_hatch": "§2Вхідний роз'єм енергії НвН", - "block.gtceu.uiv_energy_input_hatch_16a": "§2Вхідний роз'єм енергії НвН 16A", - "block.gtceu.uiv_energy_input_hatch_4a": "§2Вхідний роз'єм енергії НвН 4A", - "block.gtceu.uiv_energy_output_hatch": "§2Вихідний роз'єм енергії НвН", - "block.gtceu.uiv_energy_output_hatch_16a": "§2Вихідний роз'єм енергії НвН 16A", - "block.gtceu.uiv_energy_output_hatch_4a": "§2Вихідний роз'єм енергії НвН 4A", + "block.gtceu.uiv_electromagnetic_separator": "§2Епічний електромагнітний сепаратор III§r", + "block.gtceu.uiv_energy_input_hatch": "§2UIV енергетичний люк", + "block.gtceu.uiv_energy_input_hatch_16a": "§2UIV 16A енергетичний люк", + "block.gtceu.uiv_energy_input_hatch_4a": "§2UIV 4A енергетичний люк", + "block.gtceu.uiv_energy_output_hatch": "§2UIV динамо-люк", + "block.gtceu.uiv_energy_output_hatch_16a": "§2UIV 16A динамо-люк", + "block.gtceu.uiv_energy_output_hatch_4a": "§2UIV 4A динамо-люк", "block.gtceu.uiv_extractor": "§2Епічний екстрактор III§r", - "block.gtceu.uiv_extruder": "§2Епічний екструдор III§r", + "block.gtceu.uiv_extruder": "§2Епічний екструдер III§r", "block.gtceu.uiv_fermenter": "§2Епічний ферментатор III§r", - "block.gtceu.uiv_fluid_heater": "§2Епічний рідинний обігрівач III§r", - "block.gtceu.uiv_fluid_passthrough_hatch": "§2Прохідний рідинний шлюз НвН", + "block.gtceu.uiv_fluid_heater": "§2Епічний рідинний нагрівач III§r", + "block.gtceu.uiv_fluid_passthrough_hatch": "§2UIV прохідний рідинний люк", "block.gtceu.uiv_fluid_solidifier": "§2Епічний рідинний затверджувач III§r", "block.gtceu.uiv_forge_hammer": "§2Епічний ковальський молот III§r", - "block.gtceu.uiv_forming_press": "§2Епічний формувальний прес III§r", - "block.gtceu.uiv_gas_collector": "§2Епічний повітрозабірник III§r", - "block.gtceu.uiv_input_bus": "§2Вхідна предметна шина НвН", - "block.gtceu.uiv_input_hatch": "§2Вхідний рідинний шлюз НвН", - "block.gtceu.uiv_input_hatch_4x": "§2Четверний вхідний рідинний шлюз НвН", - "block.gtceu.uiv_input_hatch_9x": "§2Непарний вхідний рідинний шлюз НвН", - "block.gtceu.uiv_item_passthrough_hatch": "§2Прохідний предметний шлюз НвН", - "block.gtceu.uiv_laser_engraver": "§2Епічний лазерний гравер III§r", - "block.gtceu.uiv_lathe": "§2Епічний токарний станок III§r", + "block.gtceu.uiv_forming_press": "§2Епічний формовий прес III§r", + "block.gtceu.uiv_gas_collector": "§2Епічний газозбірник III§r", + "block.gtceu.uiv_input_bus": "§2UIV вхідна шина", + "block.gtceu.uiv_input_hatch": "§2UIV ввідний люк", + "block.gtceu.uiv_input_hatch_4x": "§2UIV чотирикамерний ввідний люк", + "block.gtceu.uiv_input_hatch_9x": "§2UIV дев'ятикамерний ввідний люк", + "block.gtceu.uiv_item_passthrough_hatch": "§2UIV прохідний предметний люк", + "block.gtceu.uiv_laser_engraver": "§2Епічний літограф III§r", + "block.gtceu.uiv_lathe": "§2Епічний токар III§r", "block.gtceu.uiv_macerator": "§2Епічний подрібнювач III§r", - "block.gtceu.uiv_machine_casing": "Машинна обшивка Нвн", - "block.gtceu.uiv_machine_hull": "Машинний корпус§2НвН§f", + "block.gtceu.uiv_machine_casing": "UIV корпус машини", + "block.gtceu.uiv_machine_hull": "§2UIV§f машинна основа", "block.gtceu.uiv_mixer": "§2Епічний змішувач III§r", - "block.gtceu.uiv_muffler_hatch": "Заглушений шлюз §2UIV", - "block.gtceu.uiv_ore_washer": "§2Епічний очищувач руд III§r", - "block.gtceu.uiv_output_bus": "§2Вихідна предметна шина НвН", - "block.gtceu.uiv_output_hatch": "§2Вихідний рідинний шлюз НвН", - "block.gtceu.uiv_output_hatch_4x": "§2Четверний вихідний рідинний шлюз НвН", - "block.gtceu.uiv_output_hatch_9x": "§2Непарний вихідний рідинний шлюз НвН", + "block.gtceu.uiv_muffler_hatch": "Люк вихлопу§2 UIV", + "block.gtceu.uiv_ore_washer": "§2Епічний рудопромивач III§r", + "block.gtceu.uiv_output_bus": "§2UIV вихідна шина", + "block.gtceu.uiv_output_hatch": "§2UIV вивідний люк", + "block.gtceu.uiv_output_hatch_4x": "§2UIV чотирикамерний вивідний люк", + "block.gtceu.uiv_output_hatch_9x": "§2UIV дев'ятикамерний вивідний люк", "block.gtceu.uiv_packer": "§2Епічний пакувальник III§r", "block.gtceu.uiv_polarizer": "§2Епічний намагнічувач III§r", "block.gtceu.uiv_quantum_chest": "Квантова скриня XI", - "block.gtceu.uiv_quantum_tank": "Квантовий бак XI", - "block.gtceu.uiv_rock_crusher": "§2Епічний подрібнювач III§r", - "block.gtceu.uiv_rotor_holder": "§2Тримач ротора НвН", + "block.gtceu.uiv_quantum_tank": "Квантовий резервуар XI", + "block.gtceu.uiv_rock_crusher": "§2Епічна кам'яна дробарка III§r", + "block.gtceu.uiv_rotor_holder": "§2UIV тримач ротора", "block.gtceu.uiv_scanner": "§2Епічний сканер III§r", "block.gtceu.uiv_sifter": "§2Епічний просіювач III§r", - "block.gtceu.uiv_substation_input_hatch_64a": "§2Вхідна підстанція роз'єму енергії УвН 64A", - "block.gtceu.uiv_substation_output_hatch_64a": "§2Вихідна підстанція роз'єму енергії УвН 64A", - "block.gtceu.uiv_thermal_centrifuge": "§2Епічна термоцентрифуга III§r", - "block.gtceu.uiv_transformer_16a": "Сильний трансформатор §2надвисокої напруги§r", - "block.gtceu.uiv_transformer_1a": "Трансформатор §2надвисокої напруги§r", - "block.gtceu.uiv_transformer_2a": "2x трансформатор §2надвисокої напруги§r", - "block.gtceu.uiv_transformer_4a": "4x трансформатор §2надвисокої напруги§r", - "block.gtceu.uiv_wiremill": "§2Епічний прокатний станок III§r", - "block.gtceu.ulv_16a_energy_converter": "Конвертор енергії §8НнН§r 16§eA§r", - "block.gtceu.ulv_1a_energy_converter": "Конвертор енергії §8НнН§r 1§eA§r", - "block.gtceu.ulv_4a_energy_converter": "Конвертор енергії §8НнН§r 4§eA§r", - "block.gtceu.ulv_8a_energy_converter": "Конвертор енергії §8НнН§r 8§eA§r", - "block.gtceu.ulv_battery_buffer_16x": "16x буфер батареї §8наднизької напруги§r", - "block.gtceu.ulv_battery_buffer_4x": "4x буфер батареї §8наднизької напруги§r", - "block.gtceu.ulv_battery_buffer_8x": "8x буфер батареї §8наднизької напруги§r", - "block.gtceu.ulv_charger_4x": "4x турбозарядка §8наднизької напруги§r", - "block.gtceu.ulv_energy_input_hatch": "§8Вхідний роз'єм енергії НнН", - "block.gtceu.ulv_energy_output_hatch": "§8Вихідний роз'єм енергії НнН", - "block.gtceu.ulv_input_bus": "§8Вхідна предметна шина НнН", - "block.gtceu.ulv_input_hatch": "§8Вхідний рідинний шлюз НнН", - "block.gtceu.ulv_machine_casing": "Машина обшивка НнН", - "block.gtceu.ulv_machine_hull": "Машинний корпус §8НнН§f", - "block.gtceu.ulv_output_bus": "§8Вихідна предметна шина НнН", - "block.gtceu.ulv_output_hatch": "§8Вихідний рідинний шлюз НнН", - "block.gtceu.ulv_transformer_16a": "Сильний трансформатор §8наднизької напруги§r", - "block.gtceu.ulv_transformer_1a": "Трансформатор §8наднизької напруги§r", - "block.gtceu.ulv_transformer_2a": "2x трансформатор §8наднизької напруги§r", - "block.gtceu.ulv_transformer_4a": "4x трансформатор §8наднизької напруги§r", - "block.gtceu.uv_1024a_laser_source_hatch": "Лазерно-джерельний роз'єм §3ІН§r 1,024§eA§r", - "block.gtceu.uv_1024a_laser_target_hatch": "Лазерно-цільовий роз'єм §3ІН§r 1,024§eA§r", - "block.gtceu.uv_16a_energy_converter": "Конвертор енергії §3ІН§r 16§eA§r", - "block.gtceu.uv_1a_energy_converter": "Конвертор енергії §3ІН§r 1§eA§r", - "block.gtceu.uv_256a_laser_source_hatch": "Лазерно-джерельний роз'єм §3ІН§r 256§eA§r", - "block.gtceu.uv_256a_laser_target_hatch": "Лазерно-цільовий роз'єм §3ІН§r 256§eA§r", - "block.gtceu.uv_4096a_laser_source_hatch": "Лазерно-джерельний роз'єм §3ІН§r 4,096§eA§r", - "block.gtceu.uv_4096a_laser_target_hatch": "Лазерно-цільовий роз'єм §3ІН§r 4,096§eA§r", - "block.gtceu.uv_4a_energy_converter": "Конвертор енергії §3ІН§r 4§eA§r", - "block.gtceu.uv_8a_energy_converter": "Конвертор енергії §3ІН§r 8§eA§r", - "block.gtceu.uv_alloy_smelter": "§3Ідельний топильник сплавів§r", - "block.gtceu.uv_arc_furnace": "§3Ідеальна дугова піч§r", - "block.gtceu.uv_assembler": "§3Ідеальний збирач§r", - "block.gtceu.uv_autoclave": "§3Ідеальний автоклав§r", - "block.gtceu.uv_battery_buffer_16x": "16x буфер батареї §3ідеальної напруги§r", - "block.gtceu.uv_battery_buffer_4x": "4x буфер батареї §3ідеальної напруги§r", - "block.gtceu.uv_battery_buffer_8x": "8x буфер батареї §3ідеальної напруги§r", - "block.gtceu.uv_bender": "Ідеальний листозгинач§r", - "block.gtceu.uv_brewery": "§3Ідеальна варильня§r", - "block.gtceu.uv_canner": "§3Ідеальний консерватор§r", - "block.gtceu.uv_centrifuge": "§3Ідеальна центрифуга§r", - "block.gtceu.uv_charger_4x": "4x турбозарядка §3ідеальної напруги§r", - "block.gtceu.uv_chemical_bath": "§3Ідеальна хімічна ванна§r", - "block.gtceu.uv_chemical_reactor": "§3Ідеальний хімічний реактор§r", - "block.gtceu.uv_circuit_assembler": "§3Ідеальний збирач схем§r", - "block.gtceu.uv_compressor": "§3Ідеальний компресор§r", - "block.gtceu.uv_cutter": "§3Ідеальна різальна машина§r", - "block.gtceu.uv_diode": "§3Діод ІН", - "block.gtceu.uv_distillery": "§3Ідеальний дистилятор§r", - "block.gtceu.uv_dual_input_hatch": "§3Подвійний вхідний рідинний шлюз ІН", - "block.gtceu.uv_dual_output_hatch": "§3Подвійний вихідний рідинний шлюз ІН", - "block.gtceu.uv_electric_furnace": "§3Ідеальна елетрична піч§r", - "block.gtceu.uv_electrolyzer": "§3Ідеальний електролізер§r", - "block.gtceu.uv_electromagnetic_separator": "§3Ідеальний електромагнітний розділювач§r", - "block.gtceu.uv_energy_input_hatch": "§3Вхідний роз'єм енергії ІН", - "block.gtceu.uv_energy_input_hatch_16a": "§3Вхідний роз'єм енергії ІН 16A", - "block.gtceu.uv_energy_input_hatch_4a": "§3Вхідний роз'єм енергії ІН 4A", - "block.gtceu.uv_energy_output_hatch": "§3Вихідний роз'єм енергії ІН", - "block.gtceu.uv_energy_output_hatch_16a": "§3Вихідний роз'єм енергії ІН 16A", - "block.gtceu.uv_energy_output_hatch_4a": "§3Вихідний роз'єм енергії ІН 4A", - "block.gtceu.uv_extractor": "§3Ідеальний екстрактор§r", - "block.gtceu.uv_extruder": "§3Ідеальний екструдор§r", - "block.gtceu.uv_fermenter": "§3Ідеальний ферментатор§r", - "block.gtceu.uv_fluid_heater": "§3Ідеальний рідинний обігрівач§r", - "block.gtceu.uv_fluid_passthrough_hatch": "§3Прохідний рідинний шлюз ІН", - "block.gtceu.uv_fluid_solidifier": "§3Ідеальний рідинний затверджувач§r", - "block.gtceu.uv_forge_hammer": "§3Ідеальний ковальський молот§r", - "block.gtceu.uv_forming_press": "§3Ідеальний формувальний прес§r", - "block.gtceu.uv_fusion_reactor": "Комп'ютер термоядерного реактору MK III", - "block.gtceu.uv_gas_collector": "§3Ідеальний повітрозабірник§r", - "block.gtceu.uv_hermetic_casing": "Герметична обшивка VIII", - "block.gtceu.uv_input_bus": "§3Вхідна предметна шина ІН", - "block.gtceu.uv_input_hatch": "§3Вхідний рідинний шлюз ІН", - "block.gtceu.uv_input_hatch_4x": "§3Четвериний вхідний рідинний шлюз ІН", - "block.gtceu.uv_input_hatch_9x": "§3Непарний вхідний рідинний шлюз ІН", - "block.gtceu.uv_item_passthrough_hatch": "§3Прохідний предметний шлюз ІН", - "block.gtceu.uv_lapotronic_battery": "Лапотронний конденсатор ІН", - "block.gtceu.uv_laser_engraver": "§3Ідеальний лазерний гравер§r", - "block.gtceu.uv_lathe": "§3Ідеальний токарний станок§r", - "block.gtceu.uv_macerator": "§3Ідеальний подрібнювач§r", - "block.gtceu.uv_machine_casing": "Машинна обшивка ІН", - "block.gtceu.uv_machine_hull": "Машинний корпус §3ІН§f", - "block.gtceu.uv_mixer": "§3Ідеальний змішувач§r", - "block.gtceu.uv_muffler_hatch": "Заглушений шлюз §3ІН", - "block.gtceu.uv_ore_washer": "§3Ідеальний очищувач руд§r", - "block.gtceu.uv_output_bus": "§3Вихідна предметна шина ІН", - "block.gtceu.uv_output_hatch": "§3Вихідний рідинний шлюз ІН", - "block.gtceu.uv_output_hatch_4x": "§3Четверний вихідний рідинний шлюз ІН", - "block.gtceu.uv_output_hatch_9x": "§3Непарний вихідний рідинний шлюз ІН", - "block.gtceu.uv_packer": "§3Ідеальний пакувальник§r", - "block.gtceu.uv_parallel_hatch": "Надшлюз паралельного контролю", - "block.gtceu.uv_polarizer": "§3Ідеальний намагнічувач§r", + "block.gtceu.uiv_substation_input_hatch_64a": "§2UIV 64A енергетичний люк підстанції", + "block.gtceu.uiv_substation_output_hatch_64a": "§2UIV 64A динамо-люк підстанції", + "block.gtceu.uiv_thermal_centrifuge": "§2Епічна термічна центрифуга III§r", + "block.gtceu.uiv_transformer_16a": "§2Надмірно неосяжна напруга§r Силовий трансформатор", + "block.gtceu.uiv_transformer_1a": "§2Надмірно неосяжна напруга§r Трансформатор", + "block.gtceu.uiv_transformer_2a": "§2Надмірно неосяжна напруга§r Трансформатор високого струму (2x)", + "block.gtceu.uiv_transformer_4a": "§2Надмірно неосяжна напруга§r Трансформатор високого струму (4x)", + "block.gtceu.uiv_wiremill": "§2Епічний волок III§r", + "block.gtceu.ulv_16a_energy_converter": "§8ULV§r 16§eA§r енергетичний конвертер", + "block.gtceu.ulv_1a_energy_converter": "§8ULV§r 1§eA§r енергетичний конвертер", + "block.gtceu.ulv_4a_energy_converter": "§8ULV§r 4§eA§r енергетичний конвертер", + "block.gtceu.ulv_8a_energy_converter": "§8ULV§r 8§eA§r енергетичний конвертер", + "block.gtceu.ulv_battery_buffer_16x": "§8Надмірно низька напруга§r 16x акумуляторний буфер", + "block.gtceu.ulv_battery_buffer_4x": "§8Надмірно низька напруга§r 4x акумуляторний буфер", + "block.gtceu.ulv_battery_buffer_8x": "§8Надмірно низька напруга§r 8x акумуляторний буфер", + "block.gtceu.ulv_charger_4x": "§8Надмірно низька напруга§r 4x турбозарядник", + "block.gtceu.ulv_energy_input_hatch": "§8ULV енергетичний люк", + "block.gtceu.ulv_energy_output_hatch": "§8ULV динамо-люк", + "block.gtceu.ulv_input_bus": "§8ULV вхідна шина", + "block.gtceu.ulv_input_hatch": "§8ULV ввідний люк", + "block.gtceu.ulv_machine_casing": "ULV корпус машини", + "block.gtceu.ulv_machine_hull": "§8ULV§f машинна основа", + "block.gtceu.ulv_output_bus": "§8ULV вихідна шина", + "block.gtceu.ulv_output_hatch": "§8ULV вивідний люк", + "block.gtceu.ulv_transformer_16a": "§8Надмірно низька напруга§r Силовий трансформатор", + "block.gtceu.ulv_transformer_1a": "§8Надмірно низька напруга§r Трансформатор", + "block.gtceu.ulv_transformer_2a": "§8Надмірно низька напруга§r Трансформатор високого струму (2x)", + "block.gtceu.ulv_transformer_4a": "§8Надмірно низька напруга§r Трансформатор високого струму (4x)", + "block.gtceu.uv_1024a_laser_source_hatch": "§3UV§r 1,024§eA§r люк джерела лазера", + "block.gtceu.uv_1024a_laser_target_hatch": "§3UV§r 1,024§eA§r люк цілі лазера", + "block.gtceu.uv_16a_energy_converter": "§3UV§r 16§eA§r енергетичний конвертер", + "block.gtceu.uv_1a_energy_converter": "§3UV§r 1§eA§r енергетичний конвертер", + "block.gtceu.uv_256a_laser_source_hatch": "§3UV§r 256§eA§r люк джерела лазера", + "block.gtceu.uv_256a_laser_target_hatch": "§3UV§r 256§eA§r люк цілі лазера", + "block.gtceu.uv_4096a_laser_source_hatch": "§3UV§r 4,096§eA§r люк джерела лазера", + "block.gtceu.uv_4096a_laser_target_hatch": "§3UV§r 4,096§eA§r люк цілі лазера", + "block.gtceu.uv_4a_energy_converter": "§3UV§r 4§eA§r енергетичний конвертер", + "block.gtceu.uv_8a_energy_converter": "§3UV§r 8§eA§r енергетичний конвертер", + "block.gtceu.uv_alloy_smelter": "§3Ультимативна плавильня сплавів §r ", + "block.gtceu.uv_arc_furnace": "§3Ультимативна дугова піч§r ", + "block.gtceu.uv_assembler": "§3Ультимативний збирач§r ", + "block.gtceu.uv_autoclave": "§3Ультимативний автоклав§r ", + "block.gtceu.uv_battery_buffer_16x": "§3Ультимативна напруга§r 16x акумуляторний буфер", + "block.gtceu.uv_battery_buffer_4x": "§3Ультимативна напруга§r 4x акумуляторний буфер", + "block.gtceu.uv_battery_buffer_8x": "§3Ультимативна напруга§r 8x акумуляторний буфер", + "block.gtceu.uv_bender": "§3Ультимативний згинач§r ", + "block.gtceu.uv_brewery": "§3Ультимативний варильник§r ", + "block.gtceu.uv_canner": "§3Ультимативний пакувальник§r ", + "block.gtceu.uv_centrifuge": "§3Ультимативна центрифуга§r ", + "block.gtceu.uv_charger_4x": "§3Ультимативна напруга§r 4x турбозарядник", + "block.gtceu.uv_chemical_bath": "§3Ультимативна хімічна ванна§r ", + "block.gtceu.uv_chemical_reactor": "§3Ультимативний хімічний реактор§r ", + "block.gtceu.uv_circuit_assembler": "§3Ультимативний схемотехнічний збирач§r ", + "block.gtceu.uv_compressor": "§3Ультимативний компресор§r ", + "block.gtceu.uv_cutter": "§3Ультимативний різак§r ", + "block.gtceu.uv_diode": "§3UV діод", + "block.gtceu.uv_distillery": "§3Ультимативний дистилятор§r ", + "block.gtceu.uv_dual_input_hatch": "§3UV подвійний ввідний люк", + "block.gtceu.uv_dual_output_hatch": "§3UV подвійний вивідний люк", + "block.gtceu.uv_electric_furnace": "§3Ультимативна електрична піч§r ", + "block.gtceu.uv_electrolyzer": "§3Ультимативний електролізер§r ", + "block.gtceu.uv_electromagnetic_separator": "§3Ультимативний електромагнітний сепаратор§r ", + "block.gtceu.uv_energy_input_hatch": "§3UV енергетичний люк", + "block.gtceu.uv_energy_input_hatch_16a": "§3UV 16A енергетичний люк", + "block.gtceu.uv_energy_input_hatch_4a": "§3UV 4A енергетичний люк", + "block.gtceu.uv_energy_output_hatch": "§3UV динамо-люк", + "block.gtceu.uv_energy_output_hatch_16a": "§3UV 16A динамо-люк", + "block.gtceu.uv_energy_output_hatch_4a": "§3UV 4A динамо-люк", + "block.gtceu.uv_extractor": "§3Ультимативний екстрактор§r ", + "block.gtceu.uv_extruder": "§3Ультимативний екструдер§r ", + "block.gtceu.uv_fermenter": "§3Ультимативний ферментатор§r ", + "block.gtceu.uv_fluid_heater": "§3Ультимативний рідинний нагрівач§r ", + "block.gtceu.uv_fluid_passthrough_hatch": "§3UV прохідний рідинний люк", + "block.gtceu.uv_fluid_solidifier": "§3Ультимативний рідинний затверджувач§r ", + "block.gtceu.uv_forge_hammer": "§3Ультимативний ковальський молот§r ", + "block.gtceu.uv_forming_press": "§3Ультимативний формовий прес§r ", + "block.gtceu.uv_fusion_reactor": "Комп'ютер термоядерного реактора MK III", + "block.gtceu.uv_gas_collector": "§3Ультимативний газозбірник§r ", + "block.gtceu.uv_hermetic_casing": "Герметичний корпус VIII", + "block.gtceu.uv_input_bus": "§3UV вхідна шина", + "block.gtceu.uv_input_hatch": "§3UV ввідний люк", + "block.gtceu.uv_input_hatch_4x": "§3UV чотирикамерний ввідний люк", + "block.gtceu.uv_input_hatch_9x": "§3UV дев'ятикамерний ввідний люк", + "block.gtceu.uv_item_passthrough_hatch": "§3UV прохідний предметний люк", + "block.gtceu.uv_lapotronic_battery": "UV лапотронний акумулятор", + "block.gtceu.uv_laser_engraver": "§3Ультимативний літограф§r ", + "block.gtceu.uv_lathe": "§3Ультимативний токар§r ", + "block.gtceu.uv_macerator": "§3Ультимативний подрібнювач§r ", + "block.gtceu.uv_machine_casing": "UV корпус машини", + "block.gtceu.uv_machine_hull": "§3UV§f машинна основа", + "block.gtceu.uv_mixer": "§3Ультимативний змішувач§r ", + "block.gtceu.uv_muffler_hatch": "Люк вихлопу§3 UV", + "block.gtceu.uv_ore_washer": "§3Ультимативний рудопромивач§r ", + "block.gtceu.uv_output_bus": "§3UV вихідна шина", + "block.gtceu.uv_output_hatch": "§3UV вивідний люк", + "block.gtceu.uv_output_hatch_4x": "§3UV чотирикамерний вивідний люк", + "block.gtceu.uv_output_hatch_9x": "§3UV дев'ятикамерний вивідний люк", + "block.gtceu.uv_packer": "§3Ультимативний пакувальник§r ", + "block.gtceu.uv_parallel_hatch": "Супер люк паралельного контролю", + "block.gtceu.uv_polarizer": "§3Ультимативний намагнічувач§r ", "block.gtceu.uv_quantum_chest": "Квантова скриня VIII", - "block.gtceu.uv_quantum_tank": "Квантовий бак VIII", - "block.gtceu.uv_rock_crusher": "§3Елітний подрібнювач породи§r", - "block.gtceu.uv_rotor_holder": "§3Тримар ротора ІН", - "block.gtceu.uv_scanner": "§3Ідеальний сканер§r", - "block.gtceu.uv_sifter": "§3Ідеальний просіювач§r", - "block.gtceu.uv_substation_input_hatch_64a": "Вхідна підстанція роз'єму енергії §3ІН 64A", - "block.gtceu.uv_substation_output_hatch_64a": "Вихідна підстанція роз'єму енергії §3ІН 64A", - "block.gtceu.uv_thermal_centrifuge": "§3Ідеальна термоцентрифуга§r", - "block.gtceu.uv_transformer_16a": "Сильний трансформатор §3ідеальної напруги§r", - "block.gtceu.uv_transformer_1a": "Трансформатор §3ідеальної напруги§r", - "block.gtceu.uv_transformer_2a": "2x трансформатор §3ідеальної напруги§r", - "block.gtceu.uv_transformer_4a": "4x трансформатор §3ідеальної напруги§r", - "block.gtceu.uv_wiremill": "§3Ідеальний прокатний станок§r", - "block.gtceu.uv_world_accelerator": "§3Ідеальний світовий прискорювач§r", - "block.gtceu.uxv_1024a_laser_source_hatch": "Лазерно-джерельний роз'єм §eНеН§r 1,024§eA§r", - "block.gtceu.uxv_1024a_laser_target_hatch": "Лазерно-цільовий роз'єм §eНеН§r 1,024§eA§r", - "block.gtceu.uxv_16a_energy_converter": "Конвертор енергії §eНеН§r 16§eA§r", - "block.gtceu.uxv_1a_energy_converter": "Конвертор енергії §eНеН§r 1§eA§r", - "block.gtceu.uxv_256a_laser_source_hatch": "Лазерно-джерельний роз'єм §eНеН§r 256§eA§r", - "block.gtceu.uxv_256a_laser_target_hatch": "Лазерно-цільовий роз'єм §eНеН§r 256§eA§r", - "block.gtceu.uxv_4096a_laser_source_hatch": "Лазерно-джерельний роз'єм §eНеН§r 4,096§eA§r", - "block.gtceu.uxv_4096a_laser_target_hatch": "Лазерно-цільовий роз'єм §eНеН§r 4,096§eA§r", - "block.gtceu.uxv_4a_energy_converter": "Конвертор енергії §eНеН§r 4§eA§r", - "block.gtceu.uxv_8a_energy_converter": "Конвертор енергії §eНеН§r 8§eA§r", - "block.gtceu.uxv_alloy_smelter": "§eЕпічний топильник сплавів IV§r", + "block.gtceu.uv_quantum_tank": "Квантовий резервуар VIII", + "block.gtceu.uv_rock_crusher": "§3Ультимативна кам'яна дробарка§r ", + "block.gtceu.uv_rotor_holder": "§3UV тримач ротора", + "block.gtceu.uv_scanner": "§3Ультимативний сканер§r ", + "block.gtceu.uv_sifter": "§3Ультимативний просіювач§r ", + "block.gtceu.uv_substation_input_hatch_64a": "§3UV 64A енергетичний люк підстанції", + "block.gtceu.uv_substation_output_hatch_64a": "§3UV 64A динамо-люк підстанції", + "block.gtceu.uv_thermal_centrifuge": "§3Ультимативна термічна центрифуга§r ", + "block.gtceu.uv_transformer_16a": "§3Ультимативна напруга§r Силовий трансформатор", + "block.gtceu.uv_transformer_1a": "§3Ультимативна напруга§r Трансформатор", + "block.gtceu.uv_transformer_2a": "§3Ультимативна напруга§r Трансформатор високого струму (2x)", + "block.gtceu.uv_transformer_4a": "§3Ультимативна напруга§r Трансформатор високого струму (4x)", + "block.gtceu.uv_wiremill": "§3Ультимативний волок§r ", + "block.gtceu.uv_world_accelerator": "§3Ультимативний світовий прискорювач§r ", + "block.gtceu.uxv_1024a_laser_source_hatch": "§eUXV§r 1,024§eA§r люк джерела лазера", + "block.gtceu.uxv_1024a_laser_target_hatch": "§eUXV§r 1,024§eA§r люк цілі лазера", + "block.gtceu.uxv_16a_energy_converter": "§eUXV§r 16§eA§r енергетичний конвертер", + "block.gtceu.uxv_1a_energy_converter": "§eUXV§r 1§eA§r енергетичний конвертер", + "block.gtceu.uxv_256a_laser_source_hatch": "§eUXV§r 256§eA§r люк джерела лазера", + "block.gtceu.uxv_256a_laser_target_hatch": "§eUXV§r 256§eA§r люк цілі лазера", + "block.gtceu.uxv_4096a_laser_source_hatch": "§eUXV§r 4,096§eA§r люк джерела лазера", + "block.gtceu.uxv_4096a_laser_target_hatch": "§eUXV§r 4,096§eA§r люк цілі лазера", + "block.gtceu.uxv_4a_energy_converter": "§eUXV§r 4§eA§r енергетичний конвертер", + "block.gtceu.uxv_8a_energy_converter": "§eUXV§r 8§eA§r енергетичний конвертер", + "block.gtceu.uxv_alloy_smelter": "§eЕпічна плавильня сплавів IV§r", "block.gtceu.uxv_arc_furnace": "§eЕпічна дугова піч IV§r", "block.gtceu.uxv_assembler": "§eЕпічний збирач IV§r", "block.gtceu.uxv_autoclave": "§eЕпічний автоклав IV§r", - "block.gtceu.uxv_battery_buffer_16x": "16x буфер батареї §eнадекстримальної напруги§r", - "block.gtceu.uxv_battery_buffer_4x": "4x буфер батареї §eнадекстримальної напруги§r", - "block.gtceu.uxv_battery_buffer_8x": "8x буфер батареї §eнадекстримальної напруги§r", - "block.gtceu.uxv_bender": "§eЕпінчий листозгинач IV§r", - "block.gtceu.uxv_brewery": "§eЕпічна варильня IV§r", - "block.gtceu.uxv_canner": "§eЕпічний консерватор IV§r", + "block.gtceu.uxv_battery_buffer_16x": "§eНадмірно екстремальна напруга§r 16x акумуляторний буфер", + "block.gtceu.uxv_battery_buffer_4x": "§eНадмірно екстремальна напруга§r 4x акумуляторний буфер", + "block.gtceu.uxv_battery_buffer_8x": "§eНадмірно екстремальна напруга§r 8x акумуляторний буфер", + "block.gtceu.uxv_bender": "§eЕпічний згинач IV§r", + "block.gtceu.uxv_brewery": "§eЕпічний варильник IV§r", + "block.gtceu.uxv_canner": "§eЕпічний пакувальник IV§r", "block.gtceu.uxv_centrifuge": "§eЕпічна центрифуга IV§r", - "block.gtceu.uxv_charger_4x": "4x турбозарядка §eнадекстримальної напруги§r", + "block.gtceu.uxv_charger_4x": "§eНадмірно екстремальна напруга§r 4x турбозарядник", "block.gtceu.uxv_chemical_bath": "§eЕпічна хімічна ванна IV§r", "block.gtceu.uxv_chemical_reactor": "§eЕпічний хімічний реактор IV§r", - "block.gtceu.uxv_circuit_assembler": "§eЕпічний збирач схем IV§r", - "block.gtceu.uxv_compressor": "§eЕпінчий компресор IV§r", - "block.gtceu.uxv_cutter": "§eЕпічна різальна машина IV§r", - "block.gtceu.uxv_diode": "§eДіод НеН", + "block.gtceu.uxv_circuit_assembler": "§eЕпічний схемотехнічний збирач IV§r", + "block.gtceu.uxv_compressor": "§eЕпічний компресор IV§r", + "block.gtceu.uxv_cutter": "§eЕпічний різак IV§r", + "block.gtceu.uxv_diode": "§eUXV діод", "block.gtceu.uxv_distillery": "§eЕпічний дистилятор IV§r", - "block.gtceu.uxv_dual_input_hatch": "§eПодвійний вхідний рідинний шлюз НеН", - "block.gtceu.uxv_dual_output_hatch": "§eПодвійний вихідний рідинний шлюз НеН", - "block.gtceu.uxv_electric_furnace": "§eЕпічний IV§r", + "block.gtceu.uxv_dual_input_hatch": "§eUXV подвійний ввідний люк", + "block.gtceu.uxv_dual_output_hatch": "§eUXV подвійний вивідний люк", + "block.gtceu.uxv_electric_furnace": "§eЕпічна електрична піч IV§r", "block.gtceu.uxv_electrolyzer": "§eЕпічний електролізер IV§r", - "block.gtceu.uxv_electromagnetic_separator": "§eЕпічний електромагнітний розділювач IV§r", - "block.gtceu.uxv_energy_input_hatch": "§eВхідний роз'єм енергії НеН", - "block.gtceu.uxv_energy_input_hatch_16a": "§eВхідний роз'єм енергії НеН 16A", - "block.gtceu.uxv_energy_input_hatch_4a": "§eВхідний роз'єм енергії НеН 4A", - "block.gtceu.uxv_energy_output_hatch": "§eВхідний роз'єм енергії НеН", - "block.gtceu.uxv_energy_output_hatch_16a": "§eВхідний роз'єм енергії НеН 16A", - "block.gtceu.uxv_energy_output_hatch_4a": "§eВхідний роз'єм енергії НеН 4A", + "block.gtceu.uxv_electromagnetic_separator": "§eЕпічний електромагнітний сепаратор IV§r", + "block.gtceu.uxv_energy_input_hatch": "§eUXV енергетичний люк", + "block.gtceu.uxv_energy_input_hatch_16a": "§eUXV 16A енергетичний люк", + "block.gtceu.uxv_energy_input_hatch_4a": "§eUXV 4A енергетичний люк", + "block.gtceu.uxv_energy_output_hatch": "§eUXV динамо-люк", + "block.gtceu.uxv_energy_output_hatch_16a": "§eUXV 16A динамо-люк", + "block.gtceu.uxv_energy_output_hatch_4a": "§eUXV 4A динамо-люк", "block.gtceu.uxv_extractor": "§eЕпічний екстрактор IV§r", - "block.gtceu.uxv_extruder": "§eЕпічний ектрудор IV§r", + "block.gtceu.uxv_extruder": "§eЕпічний екструдер IV§r", "block.gtceu.uxv_fermenter": "§eЕпічний ферментатор IV§r", - "block.gtceu.uxv_fluid_heater": "§eЕпічний рідинний обігрівач IV§r", - "block.gtceu.uxv_fluid_passthrough_hatch": "§eПрохідний рідинний шлюз Нен", - "block.gtceu.uxv_fluid_solidifier": "§eЕрічний рідинний затверджувач IV§r", + "block.gtceu.uxv_fluid_heater": "§eЕпічний рідинний нагрівач IV§r", + "block.gtceu.uxv_fluid_passthrough_hatch": "§eUXV прохідний рідинний люк", + "block.gtceu.uxv_fluid_solidifier": "§eЕпічний рідинний затверджувач IV§r", "block.gtceu.uxv_forge_hammer": "§eЕпічний ковальський молот IV§r", - "block.gtceu.uxv_forming_press": "§eЕпічний формквальний прес IV§r", - "block.gtceu.uxv_gas_collector": "§eЕпічний збирач газу IV§r", - "block.gtceu.uxv_input_bus": "§eВхідна предметна шина Нен", - "block.gtceu.uxv_input_hatch": "§eВхідний рідинний шлюз НеН", - "block.gtceu.uxv_input_hatch_4x": "§eЧетверний вхідний рідинний шлюз НеН", - "block.gtceu.uxv_input_hatch_9x": "§eНепарний вхідний рідинний шлюз НеН", - "block.gtceu.uxv_item_passthrough_hatch": "§eПрохідний предметний шлюз НеН", - "block.gtceu.uxv_laser_engraver": "§eЕпічний лазерний гравер IV§r", - "block.gtceu.uxv_lathe": "§eЕпічний токарний станок IV§r", + "block.gtceu.uxv_forming_press": "§eЕпічний формовий прес IV§r", + "block.gtceu.uxv_gas_collector": "§eЕпічний газозбірник IV§r", + "block.gtceu.uxv_input_bus": "§eUXV вхідна шина", + "block.gtceu.uxv_input_hatch": "§eUXV ввідний люк", + "block.gtceu.uxv_input_hatch_4x": "§eUXV чотирикамерний ввідний люк", + "block.gtceu.uxv_input_hatch_9x": "§eUXV дев'ятикамерний ввідний люк", + "block.gtceu.uxv_item_passthrough_hatch": "§eUXV прохідний предметний люк", + "block.gtceu.uxv_laser_engraver": "§eЕпічний літограф IV§r", + "block.gtceu.uxv_lathe": "§eЕпічний токар IV§r", "block.gtceu.uxv_macerator": "§eЕпічний подрібнювач IV§r", - "block.gtceu.uxv_machine_casing": "Машинна обшивка НеН", - "block.gtceu.uxv_machine_hull": "Машинний корпус §eНеН§f", + "block.gtceu.uxv_machine_casing": "UXV корпус машини", + "block.gtceu.uxv_machine_hull": "§eUXV§f машинна основа", "block.gtceu.uxv_mixer": "§eЕпічний змішувач IV§r", - "block.gtceu.uxv_muffler_hatch": "Заглушений шлюз §eНеН", - "block.gtceu.uxv_ore_washer": "§eЕпічний очищувач руд IV§r", - "block.gtceu.uxv_output_bus": "§eВихідна предметна шина НеН", - "block.gtceu.uxv_output_hatch": "§eВихідний рідинний шлюз НеН", - "block.gtceu.uxv_output_hatch_4x": "§eЧетверний вихідний рідинний шлюз НеН", - "block.gtceu.uxv_output_hatch_9x": "§eНепарний вихідний рідинний шлюз НеН", + "block.gtceu.uxv_muffler_hatch": "Люк вихлопу§e UXV", + "block.gtceu.uxv_ore_washer": "§eЕпічний рудопромивач IV§r", + "block.gtceu.uxv_output_bus": "§eUXV вихідна шина", + "block.gtceu.uxv_output_hatch": "§eUXV вивідний люк", + "block.gtceu.uxv_output_hatch_4x": "§eUXV чотирикамерний вивідний люк", + "block.gtceu.uxv_output_hatch_9x": "§eUXV дев'ятикамерний вивідний люк", "block.gtceu.uxv_packer": "§eЕпічний пакувальник IV§r", "block.gtceu.uxv_polarizer": "§eЕпічний намагнічувач IV§r", "block.gtceu.uxv_quantum_chest": "Квантова скриня XII", - "block.gtceu.uxv_quantum_tank": "Квантовий бак XII", - "block.gtceu.uxv_rock_crusher": "§eЕпічний подрібнювач породи IV§r", - "block.gtceu.uxv_rotor_holder": "§eТримач ротора НеН", + "block.gtceu.uxv_quantum_tank": "Квантовий резервуар XII", + "block.gtceu.uxv_rock_crusher": "§eЕпічна кам'яна дробарка IV§r", + "block.gtceu.uxv_rotor_holder": "§eUXV тримач ротора", "block.gtceu.uxv_scanner": "§eЕпічний сканер IV§r", "block.gtceu.uxv_sifter": "§eЕпічний просіювач IV§r", - "block.gtceu.uxv_substation_input_hatch_64a": "Вхідна підстанція роз'єму енергії §eНеН 64A", - "block.gtceu.uxv_substation_output_hatch_64a": "Вихідна підстанція роз'єму енергії §eНеН 64A", - "block.gtceu.uxv_thermal_centrifuge": "§eЕпічна термоцентрифуга IV§r", - "block.gtceu.uxv_transformer_16a": "Сильний трансформатор §eнадекстримальної напруги§r", - "block.gtceu.uxv_transformer_1a": "Трансформатор §eнадекстримальної напруги§r", - "block.gtceu.uxv_transformer_2a": "2x трансформатор §eнадекстримальної напруги§r", - "block.gtceu.uxv_transformer_4a": "4x трансформатор §eнадекстримальної напруги§r", - "block.gtceu.uxv_wiremill": "§eЕпічний прокатний станок IV§r", + "block.gtceu.uxv_substation_input_hatch_64a": "§eUXV 64A енергетичний люк підстанції", + "block.gtceu.uxv_substation_output_hatch_64a": "§eUXV 64A динамо-люк підстанції", + "block.gtceu.uxv_thermal_centrifuge": "§eЕпічна термічна центрифуга IV§r", + "block.gtceu.uxv_transformer_16a": "§eНадмірно екстремальна напруга§r Силовий трансформатор", + "block.gtceu.uxv_transformer_1a": "§eНадмірно екстремальна напруга§r Трансформатор", + "block.gtceu.uxv_transformer_2a": "§eНадмірно екстремальна напруга§r Трансформатор високого струму (2x)", + "block.gtceu.uxv_transformer_4a": "§eНадмірно екстремальна напруга§r Трансформатор високого струму (4x)", + "block.gtceu.uxv_wiremill": "§eЕпічний волок IV§r", "block.gtceu.vacuum_freezer": "Вакуумна морозильна камера", - "block.gtceu.vibration_safe_casing": "Вібростійка обшивка", - "block.gtceu.void_hazard_sign_block": "Табличка порожнинної небезпеки", - "block.gtceu.watertight_casing": "Водонепроникна обшивка", - "block.gtceu.white_borderless_lamp": "Біла лампа без меж", + "block.gtceu.vibration_safe_casing": "Вібростійкий корпус", + "block.gtceu.void_hazard_sign_block": "Блок зі знаком небезпеки порожнечі", + "block.gtceu.watertight_casing": "Водонепроникний корпус", + "block.gtceu.white_borderless_lamp": "Біла необлямована лампа", "block.gtceu.white_lamp": "Біла лампа", - "block.gtceu.white_large_metal_sheet": "Білий великий металевий лист", - "block.gtceu.white_metal_sheet": "Білий металевий лист", - "block.gtceu.white_studs": "Білі запонки", - "block.gtceu.wire_coil.tooltip_cracking": "§8Крекінг:", - "block.gtceu.wire_coil.tooltip_energy_cracking": " §aЗнищення енергії: §f%s%%", - "block.gtceu.wire_coil.tooltip_energy_smelter": " §aЗнищення енергії: §f%s EU/т §8на рецепт", - "block.gtceu.wire_coil.tooltip_extended_info": "§7Утримуйте Shift для деталей котушки", - "block.gtceu.wire_coil.tooltip_heat": "§cБазова теплоємність: §f%d K", - "block.gtceu.wire_coil.tooltip_parallel_smelter": " §5Макс. паралель: §f%s", + "block.gtceu.white_large_metal_sheet": "Біле велике металеве покриття", + "block.gtceu.white_metal_sheet": "Біле металеве покриття", + "block.gtceu.white_studs": "Білі кубики", + "block.gtceu.wire_coil.tooltip_cracking": "§8Крекінг-устава:", + "block.gtceu.wire_coil.tooltip_energy_cracking": " §aВикористання енергії:§f %s%%", + "block.gtceu.wire_coil.tooltip_energy_smelter": "§a використання енергії:§f %s EU/т", + "block.gtceu.wire_coil.tooltip_extended_info": "§7Утримуйте Shift, щоб показати інформацію з бонусу котушки", + "block.gtceu.wire_coil.tooltip_heat": "§cБазова тепломісткість:§f %d K", + "block.gtceu.wire_coil.tooltip_parallel_smelter": "§5 Макс. паралелей:§f %s", "block.gtceu.wire_coil.tooltip_pyro": "§8Піролізна піч:", - "block.gtceu.wire_coil.tooltip_smelter": "§8Багатотопильник:", - "block.gtceu.wire_coil.tooltip_speed_pyro": " §bШвидкість обробки: §f%s%%", + "block.gtceu.wire_coil.tooltip_smelter": "§8Мультиплавильня:", + "block.gtceu.wire_coil.tooltip_speed_pyro": "§b Швидкість обробки:§f %s%%", "block.gtceu.wood_crate": "Дерев'яний ящик", - "block.gtceu.wood_drum": "Дерев'яна діжка", + "block.gtceu.wood_drum": "Дерев'яна бочка", "block.gtceu.wood_wall": "Дерев'яна стіна", - "block.gtceu.wooden_multiblock_tank": "Дерев'яний бак багатоблока", - "block.gtceu.wooden_tank_valve": "Дерев'яний вентиль багатоблока", - "block.gtceu.yellow_borderless_lamp": "Жовта лампа без меж", + "block.gtceu.wooden_multiblock_tank": "Дерев'яний багатоблочний резервуар", + "block.gtceu.wooden_tank_valve": "Дерев'яний вентиль резервуара", + "block.gtceu.yellow_borderless_lamp": "Жовта необлямована лампа", "block.gtceu.yellow_lamp": "Жовта лампа", - "block.gtceu.yellow_large_metal_sheet": "Жовтий великий металевий лист", - "block.gtceu.yellow_metal_sheet": "Жовтий металевий лист", - "block.gtceu.yellow_stripes_block.a": "Жовтий смуговий блок", - "block.gtceu.yellow_stripes_block.b": "Жовтий смуговий блок", - "block.gtceu.yellow_stripes_block.c": "Жовтий смуговий блок", - "block.gtceu.yellow_stripes_block.d": "Жовтий смуговий блок", - "block.gtceu.yellow_stripes_block_a": "Жовтий смуговий блок А", - "block.gtceu.yellow_stripes_block_b": "Жовтий смуговий блок Б", - "block.gtceu.yellow_studs": "Жовті запонки", - "block.gtceu.zpm_1024a_laser_source_hatch": "Лазерно-джерельний роз'єм §cНТМ§r 1,024§eA§r", - "block.gtceu.zpm_1024a_laser_target_hatch": "Лазерно-цільовий роз'єм §cНТМ§r 1,024§eA§r", - "block.gtceu.zpm_16a_energy_converter": "Конвертор енергії §cНТМ§r 16§eA§r", - "block.gtceu.zpm_1a_energy_converter": "Конвертор енергії §cНТМ§r 1§eA§r", - "block.gtceu.zpm_256a_laser_source_hatch": "Лазерно-джерельний роз'єм §cНТМ§r 256§eA§r", - "block.gtceu.zpm_256a_laser_target_hatch": "Лазерно-цільовий роз'єм §cНТМ§r 256§eA§r", - "block.gtceu.zpm_4096a_laser_source_hatch": "Лазерно-джерельний роз'єм §cНТМ§r 4,096§eA§r", - "block.gtceu.zpm_4096a_laser_target_hatch": "Лазерно-цільовий роз'єм §cНТМ§r 4,096§eA§r", - "block.gtceu.zpm_4a_energy_converter": "Конвертор енергії §cНТМ§r 4§eA§r", - "block.gtceu.zpm_8a_energy_converter": "Конвертор енергії §cНТМ§r 8§eA§r", - "block.gtceu.zpm_alloy_smelter": "§cЕлітний топильник сплавів III§r", + "block.gtceu.yellow_large_metal_sheet": "Жовте велике металеве покриття", + "block.gtceu.yellow_metal_sheet": "Жовте металеве покриття", + "block.gtceu.yellow_stripes_block.a": "Блок жовтих стрічок", + "block.gtceu.yellow_stripes_block.b": "Блок жовтих стрічок", + "block.gtceu.yellow_stripes_block.c": "Блок жовтих стрічок", + "block.gtceu.yellow_stripes_block.d": "Блок жовтих стрічок", + "block.gtceu.yellow_stripes_block_a": "Блок жовтих стрічок A", + "block.gtceu.yellow_stripes_block_b": "Блок жовтих стрічок B", + "block.gtceu.yellow_studs": "Жовті кубики", + "block.gtceu.zpm_1024a_laser_source_hatch": "§cZPM§r 1,024§eA§r люк джерела лазера", + "block.gtceu.zpm_1024a_laser_target_hatch": "§cZPM§r 1,024§eA§r люк цілі лазера", + "block.gtceu.zpm_16a_energy_converter": "§cZPM§r 16§eA§r енергетичний конвертер", + "block.gtceu.zpm_1a_energy_converter": "§cZPM§r 1§eA§r енергетичний конвертер", + "block.gtceu.zpm_256a_laser_source_hatch": "§cZPM§r 256§eA§r люк джерела лазера", + "block.gtceu.zpm_256a_laser_target_hatch": "§cZPM§r 256§eA§r люк цілі лазера", + "block.gtceu.zpm_4096a_laser_source_hatch": "§cZPM§r 4,096§eA§r люк джерела лазера", + "block.gtceu.zpm_4096a_laser_target_hatch": "§cZPM§r 4,096§eA§r люк цілі лазера", + "block.gtceu.zpm_4a_energy_converter": "§cZPM§r 4§eA§r енергетичний конвертер", + "block.gtceu.zpm_8a_energy_converter": "§cZPM§r 8§eA§r енергетичний конвертер", + "block.gtceu.zpm_alloy_smelter": "§cЕлітна плавильня сплавів III§r", "block.gtceu.zpm_arc_furnace": "§cЕлітна дугова піч III§r", "block.gtceu.zpm_assembler": "§cЕлітний збирач III§r", "block.gtceu.zpm_autoclave": "§cЕлітний автоклав III§r", - "block.gtceu.zpm_battery_buffer_16x": "16x буфер батареї §cНТМ напруги§r", - "block.gtceu.zpm_battery_buffer_4x": "4x буфер батареї §cНТМ напруги§r", - "block.gtceu.zpm_battery_buffer_8x": "8x буфер батареї §cНТМ напруги§r", - "block.gtceu.zpm_bender": "§cЕлітний листозгинач III§r", - "block.gtceu.zpm_brewery": "§cЕлітна варильня III§r", - "block.gtceu.zpm_canner": "§cЕлітний консерватор III§r", + "block.gtceu.zpm_battery_buffer_16x": "§cZPM-напруга§r 16x акумуляторний буфер", + "block.gtceu.zpm_battery_buffer_4x": "§cZPM-напруга§r 4x акумуляторний буфер", + "block.gtceu.zpm_battery_buffer_8x": "§cZPM-напруга§r 8x акумуляторний буфер", + "block.gtceu.zpm_bender": "§cЕлітний згинач III§r", + "block.gtceu.zpm_brewery": "§cЕлітний варильник III§r", + "block.gtceu.zpm_canner": "§cЕлітний пакувальник III§r", "block.gtceu.zpm_centrifuge": "§cЕлітна центрифуга III§r", - "block.gtceu.zpm_charger_4x": "4x турбозарядка §cНТМ напруги§r", + "block.gtceu.zpm_charger_4x": "§cZPM-напруга§r 4x турбозарядник", "block.gtceu.zpm_chemical_bath": "§cЕлітна хімічна ванна III§r", - "block.gtceu.zpm_chemical_reactor": "§cЕлітний хімічний ректор III§r", - "block.gtceu.zpm_circuit_assembler": "§cЕлітний збирач схем III§r", + "block.gtceu.zpm_chemical_reactor": "§cЕлітний хімічний реактор III§r", + "block.gtceu.zpm_circuit_assembler": "§cЕлітний схемотехнічний збирач III§r", "block.gtceu.zpm_compressor": "§cЕлітний компресор III§r", - "block.gtceu.zpm_cutter": "§cЕлітна різальна машина III§r", - "block.gtceu.zpm_diode": "§cДіот НТМ", + "block.gtceu.zpm_cutter": "§cЕлітний різак III§r", + "block.gtceu.zpm_diode": "§cZPM діод", "block.gtceu.zpm_distillery": "§cЕлітний дистилятор III§r", - "block.gtceu.zpm_dual_input_hatch": "§cПодвійний вхідний рідинний шлюз НТМ", - "block.gtceu.zpm_dual_output_hatch": "§cПодвійний вихідний рідинний шлюз НТМ", + "block.gtceu.zpm_dual_input_hatch": "§cZPM подвійний ввідний люк", + "block.gtceu.zpm_dual_output_hatch": "§cZPM подвійний вивідний люк", "block.gtceu.zpm_electric_furnace": "§cЕлітна електрична піч III§r", "block.gtceu.zpm_electrolyzer": "§cЕлітний електролізер III§r", - "block.gtceu.zpm_electromagnetic_separator": "§cЕлітний електроманітний розділювач III§r", - "block.gtceu.zpm_energy_input_hatch": "§cВхідний роз'єм енергії НТМ", - "block.gtceu.zpm_energy_input_hatch_16a": "§cВхідний роз'єм енергії НТМ 16A", - "block.gtceu.zpm_energy_input_hatch_4a": "§cВхідний роз'єм енергії НТМ 4A", - "block.gtceu.zpm_energy_output_hatch": "§cВихідний роз'єм енергії НТМ", - "block.gtceu.zpm_energy_output_hatch_16a": "§cВихідний роз'єм енергії НТМ 16A", - "block.gtceu.zpm_energy_output_hatch_4a": "§cВихідний роз'єм енергії НТМ 4A", - "block.gtceu.zpm_extractor": "§cЕлітний екстарктор III§r", - "block.gtceu.zpm_extruder": "§cЕлітний екструдор III§r", + "block.gtceu.zpm_electromagnetic_separator": "§cЕлітний електромагнітний сепаратор III§r", + "block.gtceu.zpm_energy_input_hatch": "§cZPM енергетичний люк", + "block.gtceu.zpm_energy_input_hatch_16a": "§cZPM 16A енергетичний люк", + "block.gtceu.zpm_energy_input_hatch_4a": "§cZPM 4A енергетичний люк", + "block.gtceu.zpm_energy_output_hatch": "§cZPM динамо-люк", + "block.gtceu.zpm_energy_output_hatch_16a": "§cZPM 16A динамо-люк", + "block.gtceu.zpm_energy_output_hatch_4a": "§cZPM 4A динамо-люк", + "block.gtceu.zpm_extractor": "§cЕлітний екстрактор III§r", + "block.gtceu.zpm_extruder": "§cЕлітний екструдер III§r", "block.gtceu.zpm_fermenter": "§cЕлітний ферментатор III§r", - "block.gtceu.zpm_fluid_heater": "§cЕлітний рідинний обігрівач III§r", - "block.gtceu.zpm_fluid_passthrough_hatch": "§cПрохідний рідинний шлюз НТМ", + "block.gtceu.zpm_fluid_heater": "§cЕлітний рідинний нагрівач III§r", + "block.gtceu.zpm_fluid_passthrough_hatch": "§cZPM прохідний рідинний люк", "block.gtceu.zpm_fluid_solidifier": "§cЕлітний рідинний затверджувач III§r", "block.gtceu.zpm_forge_hammer": "§cЕлітний ковальський молот III§r", - "block.gtceu.zpm_forming_press": "§cЕлітний формувальний прес III§r", - "block.gtceu.zpm_fusion_reactor": "Комп'ютер термоядерного реактору MK II", - "block.gtceu.zpm_gas_collector": "§cЕлітний повітрозабірник III§r", - "block.gtceu.zpm_hermetic_casing": "Герметична обшивка VII", - "block.gtceu.zpm_input_bus": "§cВхідна предметна шина НТМ", - "block.gtceu.zpm_input_hatch": "§cВхідний рідинний шлюз НТМ", - "block.gtceu.zpm_input_hatch_4x": "§cЧетверний вхідний рідинний шлюз НТМ", - "block.gtceu.zpm_input_hatch_9x": "§cНепарний вхідний рідинний шлюз НТМ", - "block.gtceu.zpm_item_passthrough_hatch": "§cПрохідний предметний шлюз НТМ", - "block.gtceu.zpm_lapotronic_battery": "Лапотронний конденсатор НТМ", - "block.gtceu.zpm_laser_engraver": "§cЕлітний лазерний гравер III§r", - "block.gtceu.zpm_lathe": "§cЕлітний токарний станок III§r", + "block.gtceu.zpm_forming_press": "§cЕлітний формовий прес III§r", + "block.gtceu.zpm_fusion_reactor": "Комп'ютер термоядерного реактора MK II", + "block.gtceu.zpm_gas_collector": "§cЕлітний газозбірник III§r", + "block.gtceu.zpm_hermetic_casing": "Герметичний корпус VII", + "block.gtceu.zpm_input_bus": "§cZPM вхідна шина", + "block.gtceu.zpm_input_hatch": "§cZPM ввідний люк", + "block.gtceu.zpm_input_hatch_4x": "§cZPM чотирикамерний ввідний люк", + "block.gtceu.zpm_input_hatch_9x": "§cZPM дев'ятикамерний ввідний люк", + "block.gtceu.zpm_item_passthrough_hatch": "§cZPM прохідний предметний люк", + "block.gtceu.zpm_lapotronic_battery": "ZPM лапотронний акумулятор", + "block.gtceu.zpm_laser_engraver": "§cЕлітний літограф III§r", + "block.gtceu.zpm_lathe": "§cЕлітний токар III§r", "block.gtceu.zpm_macerator": "§cЕлітний подрібнювач III§r", - "block.gtceu.zpm_machine_casing": "Машинна обшивка НТМ", - "block.gtceu.zpm_machine_hull": "Машинний корпус §cНТМ§f", + "block.gtceu.zpm_machine_casing": "ZPM корпус машини", + "block.gtceu.zpm_machine_hull": "§cZPM§f машинна основа", "block.gtceu.zpm_mixer": "§cЕлітний змішувач III§r", - "block.gtceu.zpm_muffler_hatch": "Заглушений шлюз §cНТМ", - "block.gtceu.zpm_ore_washer": "§cЕлітний очищувач руд III§r", - "block.gtceu.zpm_output_bus": "§cВихідна предметна шина НТМ", - "block.gtceu.zpm_output_hatch": "§cВихідний рідинний шлюз НТМ", - "block.gtceu.zpm_output_hatch_4x": "§cЧетверний вихідний рідинний шлюз НТМ", - "block.gtceu.zpm_output_hatch_9x": "§cНепарний вихідний рідинний шлюз НТМ", + "block.gtceu.zpm_muffler_hatch": "Люк вихлопу§c ZPM", + "block.gtceu.zpm_ore_washer": "§cЕлітний рудопромивач III§r", + "block.gtceu.zpm_output_bus": "§cZPM вихідна шина", + "block.gtceu.zpm_output_hatch": "§cZPM вивідний люк", + "block.gtceu.zpm_output_hatch_4x": "§cZPM чотирикамерний вивідний люк", + "block.gtceu.zpm_output_hatch_9x": "§cZPM дев'ятикамерний вивідний люк", "block.gtceu.zpm_packer": "§cЕлітний пакувальник III§r", - "block.gtceu.zpm_parallel_hatch": "Ідеальний шлюз паралельного контролю", + "block.gtceu.zpm_parallel_hatch": "Ультимативний люк паралельного контролю", "block.gtceu.zpm_polarizer": "§cЕлітний намагнічувач III§r", "block.gtceu.zpm_quantum_chest": "Квантова скриня VII", - "block.gtceu.zpm_quantum_tank": "Квантовий бак VII", - "block.gtceu.zpm_rock_crusher": "§cЕлітний подрібнювач породи III§r", - "block.gtceu.zpm_rotor_holder": "§cТримар ротора НТМ", + "block.gtceu.zpm_quantum_tank": "Квантовий резервуар VII", + "block.gtceu.zpm_rock_crusher": "§cЕлітна кам'яна дробарка III§r", + "block.gtceu.zpm_rotor_holder": "§cZPM тримач ротора", "block.gtceu.zpm_scanner": "§cЕлітний сканер III§r", "block.gtceu.zpm_sifter": "§cЕлітний просіювач III§r", - "block.gtceu.zpm_substation_input_hatch_64a": "Вхідна підстанція роз'єму енергії §cНТМ 64A", - "block.gtceu.zpm_substation_output_hatch_64a": "Вхідна підстанція роз'єму енергії §cНТМ 64A", - "block.gtceu.zpm_thermal_centrifuge": "§cЕлітна термоцентрифуга III§r", - "block.gtceu.zpm_transformer_16a": "Сильний трансформатор §cНТМ напруги§r", - "block.gtceu.zpm_transformer_1a": "Трансформатор §cНТМ напруги§r", - "block.gtceu.zpm_transformer_2a": "2x трансформатор §cНТМ напруги§r", - "block.gtceu.zpm_transformer_4a": "4x трансформатор §cНТМ напруги§r", - "block.gtceu.zpm_wiremill": "§cЕлітний прокатний станок III§r", + "block.gtceu.zpm_substation_input_hatch_64a": "§cZPM 64A енергетичний люк підстанції", + "block.gtceu.zpm_substation_output_hatch_64a": "§cZPM 64A динамо-люк підстанції", + "block.gtceu.zpm_thermal_centrifuge": "§cЕлітна термічна центрифуга III§r", + "block.gtceu.zpm_transformer_16a": "§cZPM-напруга§r Силовий трансформатор", + "block.gtceu.zpm_transformer_1a": "§cZPM-напруга§r Трансформатор", + "block.gtceu.zpm_transformer_2a": "§cZPM-напруга§r Трансформатор високого струму (2x)", + "block.gtceu.zpm_transformer_4a": "§cZPM-напруга§r Трансформатор високого струму (4x)", + "block.gtceu.zpm_wiremill": "§cЕлітний волок III§r", "block.gtceu.zpm_world_accelerator": "§cЕлітний світовий прискорювач III§r", - "block.sterilizing_filter_casing.tooltip": "Створює §aстерильне§7 середовище", - "block.surface_rock": "Поверхневий мінерал (%s)", - "button.gtceu.mark_as_depleted.name": "Маркер видалено", - "button.gtceu.toggle_waypoint.name": "Перемикач маршрутної точки", - "command.gtceu.cape.failure.does_not_exist": "Плащ %s не існує", - "command.gtceu.cape.give.failed": "Нових плащів не розблоковано", - "command.gtceu.cape.give.success.multiple": "Розблоковано %s плащів для %s гравців", - "command.gtceu.cape.give.success.single": "Розблоковано %s плащів для %s", - "command.gtceu.cape.take.failed": "Не вдалося видалити плащі", - "command.gtceu.cape.take.success.multiple": "Отримано %s плащів від %s гравців", - "command.gtceu.cape.take.success.single": "Отримано %s плащів від %s", - "command.gtceu.cape.use.failed": "%s не може використовувати плащ %s, тому що у нього його немає (або не існує)!", - "command.gtceu.cape.use.success": "%s зараз використовує плащ %s", - "command.gtceu.cape.use.success.none": "%s більше не використовує плащ", - "command.gtceu.dump_data.success": "Ресурси %s скинуто з реєстру %s до %s", - "command.gtceu.medical_condition.get": "Гравець %s має такі захворювання:", - "command.gtceu.medical_condition.get.element": "Стан %s§r: %s хвилин %s секунд", - "command.gtceu.medical_condition.get.element.permanent": "Стан %s§r: %s хвилин %s секунд (постійно)", - "command.gtceu.medical_condition.get.empty": "У гравця %s немає захворювань.", - "command.gtceu.place_vein.failure": "Не вдалося розмістити вену %s у позиції %s", - "command.gtceu.place_vein.success": "Жила %s розміщена в позиції %s", - "command.gtceu.share_prospection_data.notification": "%s ділиться з вами даними пошуку!", + "block.sterilizing_filter_casing.tooltip": "Створює§a стерильне§7 середовище", + "block.surface_rock": "%s (поверхневий поклад)", + "button.gtceu.mark_as_depleted.name": "Позначити як виснажений", + "button.gtceu.toggle_waypoint.name": "Перемикнути маршрутну точку", + "command.gtceu.cape.failure.does_not_exist": "Плаща «%s» не існує", + "command.gtceu.cape.give.failed": "Нових плащів не відкрито", + "command.gtceu.cape.give.success.multiple": "Відкрито %s плащів для %s гравців", + "command.gtceu.cape.give.success.single": "Відкрито %s плащів для %s", + "command.gtceu.cape.take.failed": "Нічого забирати", + "command.gtceu.cape.take.success.multiple": "Забрано %s плащів у %s гравців", + "command.gtceu.cape.take.success.single": "Забрано %s плащів у %s", + "command.gtceu.cape.use.failed": "%s не може користуватися плащем %s, тому що не має його (або його не існує)!", + "command.gtceu.cape.use.success": "%s тепер користується плащем %s", + "command.gtceu.cape.use.success.none": "%s більше не користується плащем", + "command.gtceu.dump_data.success": "Перекинуто %s ресурсів з реєстру %s до %s", + "command.gtceu.medical_condition.get": "Гравець %s має такі медичні показання:", + "command.gtceu.medical_condition.get.element": "Ураження - %s§r: %s хвилин %s секунд", + "command.gtceu.medical_condition.get.element.permanent": "Ураження - %s§r: %s хвилин %s секунд (постійне)", + "command.gtceu.medical_condition.get.empty": "Гравець %s не має медичних показань.", + "command.gtceu.place_vein.failure": "Не вдалося розмістити жилу %s на позиції %s", + "command.gtceu.place_vein.success": "Розміщено жилу %s на позиції %s", + "command.gtceu.share_prospection_data.notification": "%s ділиться з вами розвідницькими даними!", "config.gtceu.option.addLoot": "addLoot", "config.gtceu.option.ae2": "ae2", "config.gtceu.option.allowDrumsInputFluidsFromOutputSide": "allowDrumsInputFluidsFromOutputSide", @@ -1879,6 +1880,7 @@ "config.gtceu.option.steelSteamMultiblocks": "steelSteamMultiblocks", "config.gtceu.option.surfaceRockProspectRange": "surfaceRockProspectRange", "config.gtceu.option.tankItemFluidPreview": "tankItemFluidPreview", + "config.gtceu.option.temperaturesInKelvin": "temperaturesInKelvin", "config.gtceu.option.titaniumBoilerHeatSpeed": "titaniumBoilerHeatSpeed", "config.gtceu.option.titaniumBoilerMaxTemperature": "titaniumBoilerMaxTemperature", "config.gtceu.option.toggle": "toggle", @@ -1904,319 +1906,320 @@ "config.gtceu.option.xaerosMapIntegration": "xaerosMapIntegration", "config.gtceu.option.yOffset": "yOffset", "config.gtceu.option.zombieSpawnWithSabers": "zombieSpawnWithSabers", - "config.jade.plugin_gtceu.auto_output_info": "[GTCEu] інфо автовиводу", - "config.jade.plugin_gtceu.cable_info": "[GTCEu] інфо кабелю", - "config.jade.plugin_gtceu.controllable_provider": "[GTCEu] контрольованість", - "config.jade.plugin_gtceu.data_bank": "[GTCEu] інфо накопичувача даних", - "config.jade.plugin_gtceu.electric_container_provider": "[GTCEu] електричне вмістище", - "config.jade.plugin_gtceu.energy_converter_provider": "[GTCEu] режим конвертора енергії", - "config.jade.plugin_gtceu.exhaust_vent_info": "[GTCEu] інфо залишкового вентиля", - "config.jade.plugin_gtceu.hazard_cleaner_provider": "[GTCEu] очищена небезпека", - "config.jade.plugin_gtceu.machine_mode": "[GTCEu] режим машини", - "config.jade.plugin_gtceu.maintenance_info": "[GTCEu] технічне інфо", - "config.jade.plugin_gtceu.me_pattern_buffer": "[GTCEu] інфо буферу шаблону", - "config.jade.plugin_gtceu.me_pattern_buffer_proxy": "[GTCEu] інфо проксі буферу шаблону", - "config.jade.plugin_gtceu.multiblock_structure": "[GTCEu] багатоблокові структури", - "config.jade.plugin_gtceu.parallel_info": "[GTCEu] інфо паралелей", - "config.jade.plugin_gtceu.primitive_pump": "[GTCEu] інфо примітивної помпи", - "config.jade.plugin_gtceu.recipe_logic_provider": "[GTCEu] логіка рецепта", - "config.jade.plugin_gtceu.recipe_output_info": "[GTCEu] інфо виводу рецепту", - "config.jade.plugin_gtceu.stained_color": "[GTCEu] інфо фарбованих кольорів", - "config.jade.plugin_gtceu.steam_boiler_info": "[GTCEu] інфо парового котла", - "config.jade.plugin_gtceu.transformer": "[GTCEu] інфо трансформатору", - "config.jade.plugin_gtceu.workable_provider": "[GTCEu] робочість", - "cover.advanced_detector.latch.disabled.0": "Поведінка: безперервна", + "config.jade.plugin_gtceu.auto_output_info": "[GTCEu] Інфо автовиведення", + "config.jade.plugin_gtceu.cable_info": "[GTCEu] Інфо кабелів", + "config.jade.plugin_gtceu.controllable_provider": "[GTCEu] Контролювання", + "config.jade.plugin_gtceu.data_bank": "[GTCEu] Інфо зберігача даних", + "config.jade.plugin_gtceu.electric_container_provider": "[GTCEu] Електричний контейнер", + "config.jade.plugin_gtceu.energy_converter_provider": "[GTCEu] Режим енергетичного конвертера", + "config.jade.plugin_gtceu.exhaust_vent_info": "[GTCEu] Інфо витяжної вентиляції", + "config.jade.plugin_gtceu.hazard_cleaner_provider": "[GTCEu] Очисник загроз", + "config.jade.plugin_gtceu.ldp_endpoint": "[GTCEu] Інфо точки призначення довгих трубопроводів", + "config.jade.plugin_gtceu.machine_mode": "[GTCEu] Режим машини", + "config.jade.plugin_gtceu.maintenance_info": "[GTCEu] Інфо з обслуговування", + "config.jade.plugin_gtceu.me_pattern_buffer": "[GTCEu] Інфо буфера шаблонів", + "config.jade.plugin_gtceu.me_pattern_buffer_proxy": "[GTCEu] Інфо проксі буфера шаблонів", + "config.jade.plugin_gtceu.multiblock_structure": "[GTCEu] Багатоблочна конструкція", + "config.jade.plugin_gtceu.parallel_info": "[GTCEu] Інфо паралелізації", + "config.jade.plugin_gtceu.primitive_pump": "[GTCEu] Інфо примітивної помпи", + "config.jade.plugin_gtceu.recipe_logic_provider": "[GTCEu] Логіка рецептів", + "config.jade.plugin_gtceu.recipe_output_info": "[GTCEu] Інфо виводу рецептів", + "config.jade.plugin_gtceu.stained_color": "[GTCEu] Інфо заплямованого блоку", + "config.jade.plugin_gtceu.steam_boiler_info": "[GTCEu] Інфо парового котла", + "config.jade.plugin_gtceu.transformer": "[GTCEu] Інфо трансформатора", + "config.jade.plugin_gtceu.workable_provider": "[GTCEu] Обробка", + "cover.advanced_detector.latch.disabled.0": "Поведінка: Безперервна", "cover.advanced_detector.latch.disabled.1": "", - "cover.advanced_detector.latch.disabled.2": "Змінює поведінку редстоуну цього модифікатора.", - "cover.advanced_detector.latch.disabled.3": "§eБезперервний§7 — усталено; значення менше ніж мінімальний вихід 0; значення вищі за максимальний вихід 15; значення між мінімальним і максимальним виходом між 0 і 15", - "cover.advanced_detector.latch.disabled.4": "§eЗасув§7 — виводити 15, поки не буде вище максимуму, потім виводити 0, поки не буде нижче мінімуму", - "cover.advanced_detector.latch.enabled.0": "Поведінка: заблоковано", + "cover.advanced_detector.latch.disabled.2": "Змінити поведінку цієї кришки при редстоуновому заживленні.", + "cover.advanced_detector.latch.disabled.3": "§eБезперервна§7 - Усталено; значення менше мінімального виходу 0; значення більше максимального виходу 15; значення між мінімальним і максимальним виходом від 0 до 15", + "cover.advanced_detector.latch.disabled.4": "§eЗамкнена§7 - виводити 15, поки не перевищить максимум, потім виводити 0, поки не стане менше мінімуму", + "cover.advanced_detector.latch.enabled.0": "Поведінка: Замкнена", "cover.advanced_detector.latch.enabled.1": "", - "cover.advanced_detector.latch.enabled.2": "Змінює поведінку редстоуну цього модифікатора.", - "cover.advanced_detector.latch.enabled.3": "§eБезперервний§7 — усталено; значення, менші за мінімальний вихід 0; значення, вищі за максимальний вихід 15; значення між мінімальним і максимальним виходом між 0 і 15", - "cover.advanced_detector.latch.enabled.4": "§eЗасув§7 — виводити 15, поки не буде вище максимуму, потім виводити 0, поки не буде нижче мінімуму", - "cover.advanced_energy_detector.invert.disabled.0": "Вихід: нормальний", + "cover.advanced_detector.latch.enabled.2": "Змінити поведінку цієї кришки при редстоуновому заживленні.", + "cover.advanced_detector.latch.enabled.3": "§eБезперервна§7 - Усталено; значення менше мінімального виходу 0; значення більше максимального виходу 15; значення між мінімальним і максимальним виходом від 0 до 15", + "cover.advanced_detector.latch.enabled.4": "§eЗамкнена§7 - виводити 15, поки не перевищить максимум, потім виводити 0, поки не стане менше мінімуму", + "cover.advanced_energy_detector.invert.disabled.0": "Вихід: Нормальний", "cover.advanced_energy_detector.invert.disabled.1": "", - "cover.advanced_energy_detector.invert.disabled.2": "Перемкніть, щоб інвертувати логіку червоного каменю", - "cover.advanced_energy_detector.invert.disabled.3": "Усталено сигнал редстоуну випромінюється, коли менше, ніж мінімальний EU, і припиняє випромінювати, коли перевищує максимальний EU", - "cover.advanced_energy_detector.invert.enabled.0": "Вихід: інвертований", + "cover.advanced_energy_detector.invert.disabled.2": "Перемкніть, щоб інвертувати логіку редстоуна", + "cover.advanced_energy_detector.invert.disabled.3": "Усталено, редстоун випромінюється, коли мінімальне значення EU менше, і припиняє випромінювання, коли максимальне значення EU перевищує мінімальне.", + "cover.advanced_energy_detector.invert.enabled.0": "Вихід: Інвертований", "cover.advanced_energy_detector.invert.enabled.1": "", - "cover.advanced_energy_detector.invert.enabled.2": "Перемкніть, щоб інвертувати логіку редстоуну", - "cover.advanced_energy_detector.invert.enabled.3": "Усталено сигнал редстоуну випромінюється, коли менше, ніж мінімальний EU, і припиняє випромінювати, коли перевищує максимальний EU", - "cover.advanced_energy_detector.label": "Покращений датчик енергії", - "cover.advanced_energy_detector.max": "Макс", - "cover.advanced_energy_detector.min": "Мін", - "cover.advanced_energy_detector.use_percent.disabled.0": "Режим: дискретний EU", + "cover.advanced_energy_detector.invert.enabled.2": "Перемкніть, щоб інвертувати логіку редстоуна", + "cover.advanced_energy_detector.invert.enabled.3": "Усталено, редстоун випромінюється, коли мінімальне значення EU менше, і припиняє випромінювання, коли максимальне значення EU перевищує мінімальне.", + "cover.advanced_energy_detector.label": "Вдосконалений детектор енергії", + "cover.advanced_energy_detector.max": "Максимум", + "cover.advanced_energy_detector.min": "Мінімум", + "cover.advanced_energy_detector.use_percent.disabled.0": "Режим: Дискретна EU", "cover.advanced_energy_detector.use_percent.disabled.1": "", - "cover.advanced_energy_detector.use_percent.disabled.2": "Зміна між використанням дискретних значень EU або відсотків для порівняння мінімального/максимального значення з приєднаним накопичувачем енергії.", - "cover.advanced_energy_detector.use_percent.enabled.0": "Режим: відсоток", + "cover.advanced_energy_detector.use_percent.disabled.2": "Перемикайтеся між використанням дискретних значень або відсотків EU для порівняння мінімуму/максимуму з підключеним накопичувачем енергії.", + "cover.advanced_energy_detector.use_percent.enabled.0": "Режим: Процентна", "cover.advanced_energy_detector.use_percent.enabled.1": "", - "cover.advanced_energy_detector.use_percent.enabled.2": "Перехід між використанням дискретних значень EU або відсотків для порівняння мінімального/максимального значення з приєднаним накопичувачем енергії.", - "cover.advanced_fluid_detector.invert.disabled.0": "Вихід: нормальний", + "cover.advanced_energy_detector.use_percent.enabled.2": "Перемикайтеся між використанням дискретних значень або відсотків EU для порівняння мінімуму/максимуму з підключеним накопичувачем енергії.", + "cover.advanced_fluid_detector.invert.disabled.0": "Вихід: Нормальний", "cover.advanced_fluid_detector.invert.disabled.1": "", - "cover.advanced_fluid_detector.invert.disabled.2": "Перемкніть, щоб інвертувати логіку редстоуну", - "cover.advanced_fluid_detector.invert.disabled.3": "Усталено сигнал редстоуну припиняє випромінюватися, коли менше ніж мінімальні мілівідра рідини, і починає випромінювати, коли перевищує мін. Мілівідра рідини до встановленого максимуму", - "cover.advanced_fluid_detector.invert.enabled.0": "Вихід: інвертований", + "cover.advanced_fluid_detector.invert.disabled.2": "Перемкніть, щоб інвертувати логіку редстоуна", + "cover.advanced_fluid_detector.invert.disabled.3": "Усталено редстоун припиняє випромінювання, коли рівень рідини менший за мінімальний мВ, і починає випромінювати, коли рівень рідини більший за мінімальний мВ до встановленого максимуму.", + "cover.advanced_fluid_detector.invert.enabled.0": "Вихід: Інвертований", "cover.advanced_fluid_detector.invert.enabled.1": "", - "cover.advanced_fluid_detector.invert.enabled.2": "Перемкніть, щоб інвертувати логіку редстоуну", - "cover.advanced_fluid_detector.invert.enabled.3": "Усталено сигнал редстоуну припиняє випромінюватися, коли менше ніж мінімальний мВ рідини, і починає випромінювати, коли перевищує мін. мВ рідини до встановленого максимуму", - "cover.advanced_fluid_detector.label": "Розширений датчик рідини", - "cover.advanced_fluid_detector.max": "Макс. рідина (мВ)", - "cover.advanced_fluid_detector.min": "Мін. рідина (мВ)", - "cover.advanced_item_detector.invert.disabled.0": "Вихід: нормальний", + "cover.advanced_fluid_detector.invert.enabled.2": "Перемкніть, щоб інвертувати логіку редстоуна", + "cover.advanced_fluid_detector.invert.enabled.3": "Усталено редстоун припиняє випромінювання, коли рівень рідини менший за мінімальний мВ, і починає випромінювати, коли рівень рідини більший за мінімальний мВ до встановленого максимуму.", + "cover.advanced_fluid_detector.label": "Вдосконалений детектор рідин", + "cover.advanced_fluid_detector.max": "Максимум рідини (мВ)", + "cover.advanced_fluid_detector.min": "Мінімум рідина (мВ)", + "cover.advanced_item_detector.invert.disabled.0": "Вихід: Нормальний", "cover.advanced_item_detector.invert.disabled.1": "", - "cover.advanced_item_detector.invert.disabled.2": "Перемкніть, щоб інвертувати логіку редстоуну", - "cover.advanced_item_detector.invert.disabled.3": "Усталено сигнал редстоуну припиняє випромінюватися, коли кількість предметів менше мінімальної, і починає випромінювати, коли кількість предметів перевищує мінімальну до встановленого максимуму", - "cover.advanced_item_detector.invert.enabled.0": "Вихід: інвертований", + "cover.advanced_item_detector.invert.disabled.2": "Перемкніть, щоб інвертувати логіку редстоуна", + "cover.advanced_item_detector.invert.disabled.3": "Усталено, редстоун припиняє випромінювання, коли кількість предметів менша за мінімальну, і починає випромінювати, коли кількість предметів більша за мінімальну, але не перевищує встановленого максимуму", + "cover.advanced_item_detector.invert.enabled.0": "Вихід: Інвертований", "cover.advanced_item_detector.invert.enabled.1": "", - "cover.advanced_item_detector.invert.enabled.2": "Перемкніть щоб інвертувати логіку редстоуну", - "cover.advanced_item_detector.invert.enabled.3": "Усталено сигнал редстоуну припиняє випромінюватися, коли кількість предметів менше мінімальної, і починає випромінювати, коли кількість предметів перевищує мінімальну до встановленого максимуму", - "cover.advanced_item_detector.label": "Розширений детектор предметів", - "cover.advanced_item_detector.max": "Максимальна кількість предметів", - "cover.advanced_item_detector.min": "Мінімальна кількість предметів", - "cover.bucket.mode.bucket": "В", + "cover.advanced_item_detector.invert.enabled.2": "Перемкніть, щоб інвертувати логіку редстоуна", + "cover.advanced_item_detector.invert.enabled.3": "Усталено, редстоун припиняє випромінювання, коли кількість предметів менша за мінімальну, і починає випромінювати, коли кількість предметів більша за мінімальну, але не перевищує встановленого максимуму", + "cover.advanced_item_detector.label": "Вдосконалений детектор предметів", + "cover.advanced_item_detector.max": "Максимум предметів", + "cover.advanced_item_detector.min": "Мінімум предметів", + "cover.bucket.mode.bucket": "B", "cover.bucket.mode.milli_bucket": "мВ", - "cover.conveyor.blocks_input.disabled.0": "Якщо ввімкнено, предмети не постачатися, коли модифікатор налаштовано на забирання предметів із інвентарю в трубу.", - "cover.conveyor.blocks_input.disabled.1": "§cВИМК.", - "cover.conveyor.blocks_input.enabled.0": "Якщо ввімкнено, предмети не постачатися, коли модифікатор встановлено, щоб забирати предмети з інвентарю в трубу.", - "cover.conveyor.blocks_input.enabled.1": "§aУВІМК.", - "cover.conveyor.distribution.insert_first.0": "Режим розподілення: §bПріоритет", - "cover.conveyor.distribution.insert_first.1": "§7Буде постачатися в перший інвентар із найвищим пріоритетом, який зможе знайти.", - "cover.conveyor.distribution.insert_first.2": "§7Обмежувальні канали предметів знижують пріоритет шляху.", - "cover.conveyor.distribution.round_robin_global.0": "Режим розподілення: §bКругова система", - "cover.conveyor.distribution.round_robin_global.1": "§7Розподіляє предмети порівну між приєднаними інвентарями", - "cover.conveyor.distribution.round_robin_prio.0": "Режим розподілення: §bКругова система з пріоритетом", - "cover.conveyor.distribution.round_robin_prio.1": "§7Спроба розділити предмети між приєднаними інвентарями та спочатку розглядає вищі пріоритети.", - "cover.conveyor.distribution.round_robin_prio.2": "§7Обмежувальні канали предметів знижують пріоритет шляху.", + "cover.conveyor.blocks_input.disabled.0": "Якщо увімкнено, предмети не вставлятимуться, коли кришку встановлено так, щоб втягувати предмети з містила в трубу.", + "cover.conveyor.blocks_input.disabled.1": "§cВимкнено", + "cover.conveyor.blocks_input.enabled.0": "Якщо увімкнено, предмети не вставлятимуться, коли кришку встановлено так, щоб втягувати предмети з містила в трубу.", + "cover.conveyor.blocks_input.enabled.1": "§aУвімкнено", + "cover.conveyor.distribution.insert_first.0": "Режим розповсюдження: §bПріоритетний", + "cover.conveyor.distribution.insert_first.1": "§7Вставить до першого знайденого містила з найвищим пріоритетом.", + "cover.conveyor.distribution.insert_first.2": "§7Обмежувальні предметні труби знижують пріоритет шляху.", + "cover.conveyor.distribution.round_robin_global.0": "Режим розповсюдження: §bЦиклічний", + "cover.conveyor.distribution.round_robin_global.1": "§7Рівномірно розподіляє предмети між під'єднаними містилами", + "cover.conveyor.distribution.round_robin_prio.0": "Режим розповсюдження: §bЦиклічний із пріоритетом", + "cover.conveyor.distribution.round_robin_prio.1": "§7Намагається рівномірно розподілити предмети між пов'язаними містилами.", + "cover.conveyor.distribution.round_robin_prio.2": "§7Не передаватиме предмети через обмежені предметні труби, поки наявні інші шляхи.", "cover.conveyor.item_filter.title": "Фільтр предметів", "cover.conveyor.mode": "Режим: %s", - "cover.conveyor.mode.export": "Режим: постачання", - "cover.conveyor.mode.import": "Режим: забирання", - "cover.conveyor.tag.title.0": "Назва теґу", - "cover.conveyor.tag.title.1": "(використовуйте * з символом підстановки)", - "cover.conveyor.title": "Налаштування модифікатора конвеєра (%s)", - "cover.conveyor.transfer_rate": "§7предм./с", - "cover.detector_base.message_inverted_state": "Статус нагляду: інвертований", - "cover.detector_base.message_normal_state": "Статус нагляду: нормальний", - "cover.ender_fluid_link.incomplete_hex.0": "Введений колір неповний!", - "cover.ender_fluid_link.incomplete_hex.1": "Буде застосовано після завершення (усі 8 шістнадцяткових цифр)", - "cover.ender_fluid_link.incomplete_hex.2": "Закриття інтерфейсу призведе до втрати редагувань!", - "cover.ender_fluid_link.iomode.disabled": "Постачання/забирання вимкнено", - "cover.ender_fluid_link.iomode.enabled": "Постачання/забирання увімкнено", - "cover.ender_fluid_link.private.tooltip.disabled.0": "Перейти в режим приватного баку", - "cover.ender_fluid_link.private.tooltip.disabled.1": "Приватний режим використовує гравця, який спочатку розмістив модифікатор", - "cover.ender_fluid_link.private.tooltip.enabled": "Перейти в режим публічного баку", - "cover.ender_fluid_link.title": "Посилання рідин Енду", - "cover.ender_fluid_link.tooltip.channel_description": "Установити опис каналу з введеним текстом", - "cover.ender_fluid_link.tooltip.channel_name": "Установити назву каналу з уведеним текстом", + "cover.conveyor.mode.export": "Режим: Експорт", + "cover.conveyor.mode.import": "Режим: Імпорт", + "cover.conveyor.tag.title.0": "Тегове ім'я", + "cover.conveyor.tag.title.1": "(використовуйте * для підстановочного символу)", + "cover.conveyor.title": "Налаштування кришки конвеєра (%s)", + "cover.conveyor.transfer_rate": "§7предметів/с", + "cover.detector_base.message_inverted_state": "Статус моніторингу: Перевернутий", + "cover.detector_base.message_normal_state": "Статус моніторингу: Нормальний", + "cover.ender_fluid_link.incomplete_hex.0": "Введено неповний колір!", + "cover.ender_fluid_link.incomplete_hex.1": "Буде застосовано після завершення (всі 8 шістнадцяткових чисел)", + "cover.ender_fluid_link.incomplete_hex.2": "Закриття інтерфейсу скасує усі зміни!", + "cover.ender_fluid_link.iomode.disabled": "Ввід/вивід вимкнено", + "cover.ender_fluid_link.iomode.enabled": "Ввід/вивід увімкнено", + "cover.ender_fluid_link.private.tooltip.disabled.0": "Перехід у приватний режим резервуара", + "cover.ender_fluid_link.private.tooltip.disabled.1": "Приватний режим використовує гравець, який першим встановив кришку", + "cover.ender_fluid_link.private.tooltip.enabled": "Перехід у публічний режим резервуара", + "cover.ender_fluid_link.title": "Рідинний зв'язок Енду", + "cover.ender_fluid_link.tooltip.channel_description": "Встановити опис каналу за допомогою введеного тексту", + "cover.ender_fluid_link.tooltip.channel_name": "Встановити назву каналу за допомогою введеного тексту", "cover.ender_fluid_link.tooltip.clear_button": "Очистити опис каналу", "cover.ender_fluid_link.tooltip.list_button": "Показати список каналів", - "cover.ender_item_link.title": "Посилання предмета Енду", - "cover.ender_redstone_link.title": "Посилання редстоуну Енду", + "cover.ender_item_link.title": "Предметний зв'язок Енду", + "cover.ender_redstone_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.fluid.voiding.advanced.title": "Розширені налаштування знищення рідини", - "cover.fluid.voiding.title": "Налаштування знищення рідини", - "cover.fluid_filter.config_amount.0": "Прокрутка колеса вгору збільшує кількість, вниз зменшує", + "cover.filter.mode.filter_both": "Вставка/витягання фільтра", + "cover.filter.mode.filter_extract": "Витягнути фільтр", + "cover.filter.mode.filter_insert": "Вставка фільтра", + "cover.fluid.voiding.advanced.title": "Вдосконалене налаштування видалення рідини", + "cover.fluid.voiding.title": "Налаштування видалення рідини", + "cover.fluid_filter.config_amount.0": "Коліщатко вгору збільшує кількість, вниз - зменшує.", "cover.fluid_filter.config_amount.1": "Shift[§6x10§r],Ctrl[§ex100§r],Shift+Ctrl[§ax1000§r]", - "cover.fluid_filter.config_amount.2": "ПКМ збільшить кількість, ЛКМ зменшить", - "cover.fluid_filter.config_amount.3": "Утримуйте Shift для подвоєння/вдвічі", - "cover.fluid_filter.config_amount.4": "СКМ, щоб очистити", - "cover.fluid_filter.mode.filter_both": "Фільтр заповнення та зливу", - "cover.fluid_filter.mode.filter_drain": "Фільтр зливу", + "cover.fluid_filter.config_amount.2": "ПКМ збільшує кількість, ЛКМ - зменшує.", + "cover.fluid_filter.config_amount.3": "Утримуйте Shift, щоб подвоїти/розділити.", + "cover.fluid_filter.config_amount.4": "Клацніть СКМ, щоб очистити", + "cover.fluid_filter.mode.filter_both": "Фільтр заповнення та спорожнення", + "cover.fluid_filter.mode.filter_drain": "Фільтр спорожнення", "cover.fluid_filter.mode.filter_fill": "Фільтр заповнення", - "cover.fluid_filter.title": "Рідинний фільтр", - "cover.fluid_regulator.keep_exact": "Точне збереження: %s", - "cover.fluid_regulator.supply_exact": "Точне постачання: %s", - "cover.fluid_regulator.title": "Налаштування регулятора рідини (%s)", - "cover.fluid_regulator.transfer_mode.description.0": "§eБудь-яке постачання§r — у цьому режимі модифікатор передаватиме якомога більше рідин, які відповідають її фільтру.", - "cover.fluid_regulator.transfer_mode.description.1": "§eТочне постачання§r — у цьому режимі модифікатор подаватиме рідини порціями, зазначеними у вікні під цією кнопкою. Якщо кількість рідини менша за розмір порції, рідини не переміщатимуться.", - "cover.fluid_regulator.transfer_mode.description.2": "§eТочне збереження§r — у цьому режимі модифікатор зберігатиме вказану кількість рідини в інвентарі призначення, надаючи додаткову кількість рідини, якщо потрібно.", - "cover.fluid_regulator.transfer_mode.description.3": "§7Порада: Shift помножить кількість збільшення/зменшення на 10, ctrl на 100.", - "cover.item.voiding.advanced.title": "Розширені налаштування знищення предметів", + "cover.fluid_filter.title": "Фільтр рідин", + "cover.fluid_regulator.keep_exact": "Зберігати точно: %s", + "cover.fluid_regulator.supply_exact": "Подавати точно: %s", + "cover.fluid_regulator.title": "Налаштування регулятора подачі рідини (%s)", + "cover.fluid_regulator.transfer_mode.description.0": "§eПодавати будь-як§r - у цьому режимі кришка подаватиме якомога більше рідин, що відповідають її фільтру.", + "cover.fluid_regulator.transfer_mode.description.1": "§eПодавати точно§r - у цьому режимі кришка подаватиме рідини порціями, вказаними у вікні під цією кнопкою. Блокує подачу меншої кількості рідини, ніж зазначено порцією.", + "cover.fluid_regulator.transfer_mode.description.2": "§eУтримувати точно§r - у цьому режимі кришка буде зберігати вказану кількість рідин в призначеному інвентарі, доливаючи рідину, якщо це необхідно.", + "cover.fluid_regulator.transfer_mode.description.3": "§7Порада: Клацання із затиснутим Shift помножить крок зміни на 10, а клацання із Ctrl помножить крок на 100.", + "cover.item.voiding.advanced.title": "Вдосконалені налаштування знищення предметів", "cover.item.voiding.title": "Налаштування знищення предметів", - "cover.item_filter.ignore_damage.disabled": "Поважати шкоду", + "cover.item_filter.ignore_damage.disabled": "Враховувати шкоду", "cover.item_filter.ignore_damage.enabled": "Ігнорувати шкоду", - "cover.item_filter.ignore_nbt.disabled": "Поважати NBT", + "cover.item_filter.ignore_nbt.disabled": "Враховувати NBT", "cover.item_filter.ignore_nbt.enabled": "Ігнорувати NBT", "cover.item_filter.title": "Фільтр предметів", "cover.item_smart_filter.filtering_mode.centrifuge": "Центрифуга", - "cover.item_smart_filter.filtering_mode.description.0": "Виберіть машину, яку цей розумний фільтр використовуватиме для фільтрації.", - "cover.item_smart_filter.filtering_mode.description.1": "Він автоматично вибере потрібні частини предметів для роботизованої руки.", + "cover.item_smart_filter.filtering_mode.description.0": "Виберіть машину, яку буде використовувати розумний фільтр для фільтрації.", + "cover.item_smart_filter.filtering_mode.description.1": "Він автоматично вибере потрібні обсяги предметів для маніпулятора.", "cover.item_smart_filter.filtering_mode.electrolyzer": "Електролізер", "cover.item_smart_filter.filtering_mode.sifter": "Просіювач", "cover.item_smart_filter.title": "Розумний фільтр предметів", - "cover.machine_controller.invert.disabled.0": "§eНормальний§r — у цьому режимі модифікатор потрібує сигналу, слабший за встановлений рівень редстоуну", - "cover.machine_controller.invert.enabled.0": "§eІнвертований§r — у цьому режимі модифікатор потребує сигналу, сильніший за встановлений рівень редстоуну", - "cover.machine_controller.inverted": "Інвертовано", - "cover.machine_controller.mode.cover_down": "Модифікатор керування (низ)", - "cover.machine_controller.mode.cover_east": "Модифікатор керування (схід)", - "cover.machine_controller.mode.cover_north": "Модифікатор керування (північ)", - "cover.machine_controller.mode.cover_south": "Модифікатор керування (південь)", - "cover.machine_controller.mode.cover_up": "Модифікатор керування (верх)", - "cover.machine_controller.mode.cover_west": "Модифікатор керування (захід)", - "cover.machine_controller.mode.machine": "Керувати машиною", - "cover.machine_controller.mode.null": "Нічим не керувати", - "cover.machine_controller.normal": "Звичайний", - "cover.machine_controller.redstone": "Мін. сила редстоуну: %d", - "cover.machine_controller.suspend_powerfail": "Запобігання зниканню живлення:", + "cover.machine_controller.invert.disabled.0": "§eНормальна§r - у цьому режимі для запуску кришка потребує слабшого сигналу редстоуна, ніж встановлений рівень", + "cover.machine_controller.invert.enabled.0": "§eІнвертована§r - у цьому режимі для запуску кришки потребує сильнішого сигналу редстоуна, ніж встановлений рівень", + "cover.machine_controller.inverted": "Інвертована", + "cover.machine_controller.mode.cover_down": "Контроль кришки (низ)", + "cover.machine_controller.mode.cover_east": "Контроль кришки (схід)", + "cover.machine_controller.mode.cover_north": "Контроль кришки (північ)", + "cover.machine_controller.mode.cover_south": "Контроль кришки (південь)", + "cover.machine_controller.mode.cover_up": "Контроль кришки (верх)", + "cover.machine_controller.mode.cover_west": "Контроль кришки (захід)", + "cover.machine_controller.mode.machine": "Контроль машини", + "cover.machine_controller.mode.null": "Контроль нічого", + "cover.machine_controller.normal": "Нормальниа", + "cover.machine_controller.redstone": "Мін. рівень редстоунового живлення: %d", + "cover.machine_controller.suspend_powerfail": "Запобігання збою живлення:", "cover.machine_controller.title": "Налаштування контролера машини", - "cover.pump.fluid_filter.title": "Фільтр рідини", - "cover.pump.mode.export": "Режим: забирання", - "cover.pump.mode.import": "Режим: постачання", - "cover.pump.title": "Налаштування модифікатора помпи (%s)", + "cover.pump.fluid_filter.title": "Фільтр рідин", + "cover.pump.mode.export": "Режим: експорт", + "cover.pump.mode.import": "Режим: імпорт", + "cover.pump.title": "Налаштування кришки помпи (%s)", "cover.pump.transfer_rate": "%s", - "cover.robotic_arm.title": "Налаштування робо-руки (%s)", - "cover.robotic_arm.transfer_mode.description.0": "§eБудь-яке постачання§r — модифікатор постачатиме дуже багато предметів, які відповідають його фільтру.", - "cover.robotic_arm.transfer_mode.description.1": "§eТочне постачання§r — модифікатор постачатиме предмети порціями, указаними в слотах фільтра предметів (або змінними під цією кнопкою для фільтра теґів). Якщо кількість предметів менша за розмір порції, предмети не будуть переміщені.", - "cover.robotic_arm.transfer_mode.description.2": "§eТочне збереження§r — модифікатор зберігатиме вказану кількість предметів в інвентарі призначення, надаючи додаткову кількість предметів, якщо потрібно.", - "cover.robotic_arm.transfer_mode.description.3": "§7Порада: ПКМ/ЛКМ на слотах фільтра, щоб змінити кількість предмета; Shift, щоб змінити кількість швидше.", - "cover.robotic_arm.transfer_mode.keep_exact": "Точне збереження", - "cover.robotic_arm.transfer_mode.transfer_any": "Будь-яке постачання", - "cover.robotic_arm.transfer_mode.transfer_exact": "Точне постачання", - "cover.shutter.message.disabled": "Відкритий засув", - "cover.shutter.message.enabled": "Закрити засув", - "cover.storage.title": "Модифікатор зберігання", + "cover.robotic_arm.title": "Налаштування маніпулятора (%s)", + "cover.robotic_arm.transfer_mode.description.0": "§eПодавати будь-як§r - у цьому режимі кришка буде переносити якомога більше предметів, що відповідають її фільтру.", + "cover.robotic_arm.transfer_mode.description.1": "§eПодавати точно§r - у цьому режимі кришка постачатиме предмети порціями, зазначеними у слотах фільтра предметів (або змінною під цією кнопкою для фільтра міток). Блокує подачу меншої кількості предметів, ніж зазначено порцією.", + "cover.robotic_arm.transfer_mode.description.2": "§eУтримувати точно§r - у цьому режимі кришка буде зберігати вказану кількість предметів в інвентарі призначення, постачаючи додаткову кількість предметів, якщо це необхідно.", + "cover.robotic_arm.transfer_mode.description.3": "§7Порада: клацайте ЛКМ/ПКМ на слотах фільтра, щоб змінити кількість предметів, клацайте крадькома, щоб змінювати кількість швидше.", + "cover.robotic_arm.transfer_mode.keep_exact": "Утримувати точно", + "cover.robotic_arm.transfer_mode.transfer_any": "Подавати будь-як", + "cover.robotic_arm.transfer_mode.transfer_exact": "Подавати точно", + "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": "Це відповідає всім золотим пилам або всім схемам, крім НН", + "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.tag_filter.matches": "Предмет відповідає", - "cover.tag_filter.matches_not": "Предмет не відповідає", - "cover.tag_filter.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 — Предмети/рідини можна видобувати та вставляти незалежно від режиму модифікатора, за умови, що його фільтр відповідає (якщо є).", - "cover.universal.manual_import_export.mode.description.2": "§eДозволити безфільтрування§r — Предмети/рідини можна переміщувати незалежно від режиму модифікатора. Фільтр застосовується предметів, вставлених або вилучених цим модифікатором.", - "cover.universal.manual_import_export.mode.disabled": "Ручний вхід/вихід: §bВИМК.\n§7Предмети/рідини рухатимуться лише відповідно до модифікатора та його фільтра.", - "cover.universal.manual_import_export.mode.filtered": "Ручний вхід/вихід: §bФільтрування\n§7Предмети/рідини можна видобувати та вставляти незалежно від режиму модифікатора, за умови, що його фільтр відповідає (якщо є).", - "cover.universal.manual_import_export.mode.unfiltered": "Ручний вхід/вивід: §bБезфільтрування\n§7Предмети/рідини можна переміщувати незалежно від режиму модифікатора. Фільтр застосовується лише до того, що вставляється чи вилучається самими модифікатором.", - "cover.voiding.label.disabled": "ВИМК.", - "cover.voiding.label.enabled": "УВІМК.", - "cover.voiding.message.disabled": "Модифікатор знищення вимкнено", - "cover.voiding.message.enabled": "Модифікатор знищення увімкнено", - "cover.voiding.tooltip": "§cУВАГА!§7 Увімкнення означає, що рідини або предмети БУДУТЬ спожиті.", - "cover.voiding.voiding_mode.description.0": "§eВідповідне знищення§r знищує все, що відповідає фільтру. ", - "cover.voiding.voiding_mode.description.1": "§eПереповнення знищення§r знищує все, що відповідає фільтру, до вказаної кількости.", - "cover.voiding.voiding_mode.void_any": "Відповідне знищення", - "cover.voiding.voiding_mode.void_overflow": "Переповнення знищення", - "curios.identifier.gtceu_magnet": "Магніт GTCEu", - "death.attack.gtceu.axe": "%s порубаний %s", - "death.attack.gtceu.butchery_knife": "%s порізаний %s", - "death.attack.gtceu.buzzsaw": "%s отримав гудок від %s", - "death.attack.gtceu.chainsaw_lv": "%s розпиляний %s", - "death.attack.gtceu.chemical": "У %s сталася хімічна аварія", - "death.attack.gtceu.crowbar": "%s втратив половину життя %s", - "death.attack.gtceu.drill_ev": "%s просвердлено 2048V %s", - "death.attack.gtceu.drill_hv": "%s просвердлено 512V %s", - "death.attack.gtceu.drill_iv": "%s просвердлено 8192V %s", - "death.attack.gtceu.drill_lv": "%s просвердлено 32V %s", - "death.attack.gtceu.drill_mv": "%s просвердлено 128V%s", - "death.attack.gtceu.electric": "%s зазнав високої напруги", + "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.tag_filter.matches": "Предмет збігається", + "cover.tag_filter.matches_not": "Предмет не збігається", + "cover.tag_filter.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 - поки відповідає фільтру кришки, предмети/рідини можна витягувати та вставляти незалежно від її режиму (якщо такий є). ", + "cover.universal.manual_import_export.mode.description.2": "§eДозволити нефільтрований§r - предмети/рідини можна переміщувати незалежно від режиму кришки. Фільтр застосовується до предметів, вставлених або витягнутих за допомогою цієї кришки", + "cover.universal.manual_import_export.mode.disabled": "Ручний ввід/вивід:§b Вимкнено\n§7Предмети/рідини переміщуватимуться лише так, як визначено кришкою та її фільтром.", + "cover.universal.manual_import_export.mode.filtered": "Ручний ввід/вивід:§b Фільтрований\n§7поки відповідає фільтру кришки, предмети/рідини можна витягувати та вставляти незалежно від її режиму (якщо такий є)", + "cover.universal.manual_import_export.mode.unfiltered": "Ручний ввід/вивід:§b Нефільтрований\n§7Предмети/рідини можна переміщувати незалежно від режиму кришки. Фільтр застосовується лише до того, що вставляється або витягується самою кришкою.", + "cover.voiding.label.disabled": "Вимкнено", + "cover.voiding.label.enabled": "Увімкнено", + "cover.voiding.message.disabled": "Кришку знищення вимкнено", + "cover.voiding.message.enabled": "Кришку знищення увімкнено", + "cover.voiding.tooltip": "§cУВАГА!§7 Встановлення цього параметра на «Увімкнено» означає, що рідини або предмети БУДУТЬ знищені.", + "cover.voiding.voiding_mode.description.0": "§eЗнищувати відповідне§r знищує все, що відповідає фільтру. ", + "cover.voiding.voiding_mode.description.1": "§eЗнищувати до межі§r знищує все, що відповідає фільтру, до вказаної кількості.", + "cover.voiding.voiding_mode.void_any": "Знищувати відповідне", + "cover.voiding.voiding_mode.void_overflow": "Знищувати до межі", + "curios.identifier.gtceu_magnet": "GTCEu магніт", + "death.attack.gtceu.axe": "%s був зарубаний %s", + "death.attack.gtceu.butchery_knife": "%s був нашинкований %s", + "death.attack.gtceu.buzzsaw": "%s був розпилений %s", + "death.attack.gtceu.chainsaw_lv": "%s був замордований %s", + "death.attack.gtceu.chemical": "%s став учасником хімічної аварії", + "death.attack.gtceu.crowbar": "%s напіврозпався через %s", + "death.attack.gtceu.drill_ev": "%s забурився від 2048V %s", + "death.attack.gtceu.drill_hv": "%s забурився від 512V %s", + "death.attack.gtceu.drill_iv": "%s забурився від 8192V %s", + "death.attack.gtceu.drill_lv": "%s забурився від 32V %s", + "death.attack.gtceu.drill_mv": "%s забурився від 128V %s", + "death.attack.gtceu.electric": "%s вбило струмом", "death.attack.gtceu.explosion": "%s вибухнув", "death.attack.gtceu.explosion.player": "%s вибухнув за допомогою %s", - "death.attack.gtceu.file": "%s отримав заявку V за «Мертвий» від %s", - "death.attack.gtceu.frost": "%s занадто зацікавився кріогенними засоби", - "death.attack.gtceu.hammer": "%s роздавлено %s", - "death.attack.gtceu.heat": "%s зварено живцем", - "death.attack.gtceu.heat.player": "%s зварено живцем %s", - "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.file": "На тілі %s була викарбувана 'Смерть' за допомогою %s", + "death.attack.gtceu.frost": "%s пізнав кріогеніку", + "death.attack.gtceu.hammer": "%s був розчавлений %s", + "death.attack.gtceu.heat": "%s зварився живцем", + "death.attack.gtceu.heat.player": "%s був зварений живцем через %s", + "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§lДУЖЕ§r серйозний висип", - "death.attack.gtceu.medical_condition/methanol_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", - "death.attack.gtceu.radiation": "%s зараз випромінює радістю", - "death.attack.gtceu.screwdriver": "%s викрутив гвинти з %s востаннє!", - "death.attack.gtceu.screwdriver_lv": "%s викрутив гвинти %s", - "death.attack.gtceu.scythe": "%s забрав душу %s", - "death.attack.gtceu.shovel": "%s викопано %s", - "death.attack.gtceu.spade": "%s розкопаний %s", - "death.attack.gtceu.turbine": "%s засунув голову в робочу турбіну", - "death.attack.gtceu.wire_cutter": "%s перерізав кабель апарату підтримки життя %s", - "death.attack.gtceu.wrench": "%s вдарив %s гайковим ключем!", - "death.attack.gtceu.wrench_hv": "%s послабив труби %s", - "death.attack.gtceu.wrench_iv": "%s долучив мавпиний ключ до планів %s", - "death.attack.gtceu.wrench_lv": "Труби %s були ослаблені %s", - "effect.gtceu.weak_poison": "Слабка отрута", - "enchantment.damage.disjunction": "Диз'юнкція", - "enchantment.disjunction": "Диз'юнкція", - "enchantment.gtceu.disjunction.description": "Застосовує слабкість і повільність до мобів Енду.", - "enchantment.gtceu.hard_hammer.description": "Розбиває блоки так, ніби вони були видобуті молотком GregTech.", - "enchantment.hard_hammer": "Молотування", + "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", + "death.attack.gtceu.radiation": "%s засвітився від РАДості", + "death.attack.gtceu.screwdriver": "%s був викручений %s востаннє!", + "death.attack.gtceu.screwdriver_lv": "Гвинти %s були відкручені %s", + "death.attack.gtceu.scythe": "%s віддав свою душу %s", + "death.attack.gtceu.shovel": "%s був відритий %s", + "death.attack.gtceu.spade": "%s був розкопаний %s", + "death.attack.gtceu.turbine": "%s занурив голову в турбіну", + "death.attack.gtceu.wire_cutter": "%s перерізав кабель до апарату життєзабезпечення %s", + "death.attack.gtceu.wrench": "%s забив %s гайковим ключем!", + "death.attack.gtceu.wrench_hv": "Труби %s розхиталися через %s", + "death.attack.gtceu.wrench_iv": "%s зловив розвідного ключа від %s", + "death.attack.gtceu.wrench_lv": "Труби %s розхиталися через %s", + "effect.gtceu.weak_poison": "Слабке отруєння", + "enchantment.damage.disjunction": "Розщеплення", + "enchantment.disjunction": "Розщеплення", + "enchantment.gtceu.disjunction.description": "Застосовує Слабкість і Повільність до пов'язаних з Ендом мобів.", + "enchantment.gtceu.hard_hammer.description": "Розбиває блоки так, ніби вони були видобуті за допомогою молота GregTech.", + "enchantment.hard_hammer": "Забивання", "entity.gtceu.boat": "Човен", "entity.gtceu.chest_boat": "Човен зі скринею", - "entity.gtceu.dynamite": "Підпалена динамітна шашка", - "entity.gtceu.industrial_tnt": "Підпалений промисловий динаміт", - "entity.gtceu.powderbarrel": "Порохівниця", + "entity.gtceu.dynamite": "Динамітна шашка", + "entity.gtceu.industrial_tnt": "Промисловий динаміт", + "entity.gtceu.powderbarrel": "Порохова бочка", "fluid.empty": "Порожньо", "fluid.gtceu.potion": "Зілля", - "fluid.spawnlocation.name": "Інформація про жили рідинні", + "fluid.spawnlocation.name": "Інфо про рідинну жилу", "fluid.tile.lava": "Лава", "fluid.tile.water": "Вода", "fluid_cell.empty": "Порожньо", "gtceu.air_scrubber": "Очисник повітря", - "gtceu.alloy_blast_smelter": "Доменний топильник сплавів", - "gtceu.alloy_smelter": "Топильник сплавів", + "gtceu.alloy_blast_smelter": "Доменна плавильня сплавів", + "gtceu.alloy_smelter": "Плавильня сплавів", "gtceu.arc_furnace": "Дугова піч", "gtceu.assembler": "Збирач", - "gtceu.assembly_line": "Конвеєр", + "gtceu.assembly_line": "Конвеєрна лінія", "gtceu.auto_decomp.rotor": "Ротор турбіни", "gtceu.auto_decomp.tool": "Неелектричний інструмент", "gtceu.autoclave": "Автоклав", "gtceu.battery_buffer.average_input": "Середній вхід: %s EU/т", "gtceu.battery_buffer.average_output": "Середній вихід: %s EU/т", - "gtceu.bender": "Листозгинач", + "gtceu.bender": "Згинач", "gtceu.brewery": "Варильник", - "gtceu.bus.collapse.error": "Спершу до багатоблока потрібно приєднати шину", - "gtceu.bus.collapse_false": "Шина не знищить предмети", - "gtceu.bus.collapse_true": "Шина знищить предмети", - "gtceu.button.bedrock_fluids": "Показати жили рідини корінної породи", + "gtceu.bus.collapse.error": "Спочатку шина повинна бути приєднана до конструкції", + "gtceu.bus.collapse_false": "Шина не руйнуватиме предмети", + "gtceu.bus.collapse_true": "Шина руйнуватиме предмети", + "gtceu.button.bedrock_fluids": "Показати рідинні глибокорінні жили", "gtceu.button.hide_depleted": "Приховати виснажені жили", "gtceu.button.ore_veins": "Показати рудні жили GT", "gtceu.button.show_depleted": "Показати виснажені жили", - "gtceu.cable.amperage": "§eМакс. сила струму:§r §e%d", - "gtceu.cable.loss_per_block": "§cВтрати/метр/ампер:§r §c%d§7 EU-вольт", - "gtceu.cable.superconductor": "%s §dнадпровідник", - "gtceu.cable.voltage": "§aМакс. напруга:§r §a%d §a(%s§a)", - "gtceu.canner": "Консерватор", + "gtceu.cable.amperage": "Макс. сила струму:§e %d", + "gtceu.cable.loss_per_block": "Втрати/Метр/Ампер:§c %d§7 EU-Вольт", + "gtceu.cable.superconductor": "§d%s Надпровідник", + "gtceu.cable.voltage": "Макс. напруга:§a %d§a (%s§a)", + "gtceu.canner": "Пакувальник", "gtceu.central_monitor.gui.create_group": "Створити групу", - "gtceu.central_monitor.gui.currently_editing": "Поточне редагування: %s", + "gtceu.central_monitor.gui.currently_editing": "Наразі редагується: %s", "gtceu.central_monitor.gui.remove_from_group": "Видалити з групи", - "gtceu.central_monitor.gui.set_target": "Установити ціль", - "gtceu.central_monitor.info_tooltip.0": "Щоб використовувати монітори, ви повинні спочатку розділити їх на групи. Група може містити лише 1 модуль.", - "gtceu.central_monitor.info_tooltip.1": "Виберіть їх, натиснувши ЛКМ, а потім натисніть «Створити групу».", - "gtceu.central_monitor.info_tooltip.2": "Тоді на сторінці налаштувань для групи ви можете вставити модуль, ви можете налаштувати його на тій же сторінці.", + "gtceu.central_monitor.gui.set_target": "Встановити ціль", + "gtceu.central_monitor.info_tooltip.0": "Щоб використовувати монітори, спочатку потрібно розділити їх на групи. У групі може бути тільки 1 модуль.", + "gtceu.central_monitor.info_tooltip.1": "Виберіть їх, клацнувши ЛКМ, а потім натисніть «Створити групу».", + "gtceu.central_monitor.info_tooltip.2": "Потім на сторінці налаштувань групи ви можете вставити модуль і налаштувати його на тій самій сторінці.", "gtceu.central_monitor.info_tooltip.3": "Щоб видалити групу, виберіть усі її компоненти та натисніть «Видалити з групи».", - "gtceu.central_monitor.info_tooltip.4": "Ви можете швидко вибрати всі компоненти групи, натиснувши по назві. Натисніть ще раз, щоб скасувати вибір.", - "gtceu.central_monitor.info_tooltip.5": "Деякі модулі можуть показувати речі залежно від блока, на який вони націлені. Щоб установити ціль для групи, виберіть будь-який компонент цієї групи та натисніть ПКМ цільовий компонент.", - "gtceu.central_monitor.info_tooltip.6": "Ви можете вибрати ціль, яка не в мультиблоці, для цього потрібно використовувати модифікатор бездротового передавача.", - "gtceu.central_monitor.info_tooltip.7": "Помістіть модифікатор на цільовий блок, натисніть ПКМ і за допомогою картки даних і вставте цю картку даних у люк доступу до даних у багатобло2і.", - "gtceu.central_monitor.info_tooltip.8": "Тоді виберіть роз'єм доступу до даних як ціль і встановіть індекс слота вашої картки даних у полі номера, що з’явилося.", + "gtceu.central_monitor.info_tooltip.4": "Ви можете швидко вибрати всі компоненти групи, натиснувши на її назву. Натисніть ще раз, щоб скасувати вибір.", + "gtceu.central_monitor.info_tooltip.5": "Деякі модулі можуть відображати інформацію залежно від блоку, на який вони націлені. Щоб встановити ціль для групи, виберіть будь-який компонент цієї групи та клацніть ПКМ на компоненті-цілі.", + "gtceu.central_monitor.info_tooltip.6": "Ви можете вибрати ціль, яка не знаходиться в конструкції, для цього вам потрібно використовувати кришку бездротового передавача.", + "gtceu.central_monitor.info_tooltip.7": "Помістіть кришку на цільовий блок, клацніть на ній ПКМ з флешкою і вставте цю флешку в люк доступу до даних в конструкції.", + "gtceu.central_monitor.info_tooltip.8": "Потім виберіть люк доступу до даних як ціль і встановіть індекс слота вашої флешки в полі для введення цифр, яке з'явилося.", "gtceu.central_monitor.size": "Розмір: (%d+1+%d)x(%d+1+%d)", "gtceu.centrifuge": "Центрифуга", "gtceu.chance_logic.and": "AND", @@ -2224,65 +2227,65 @@ "gtceu.chance_logic.none": "NONE", "gtceu.chance_logic.or": "OR", "gtceu.chance_logic.xor": "XOR", - "gtceu.chat.cape": "§5Вітаємо: ви щойно розблокували новий плащ! Перегляньте термінальну програму вибирача плаща (Cape Selector), щоб скористатися ним.§r", + "gtceu.chat.cape": "§5Вітаємо: ви щойно розблокували новий плащ! Дивіться в термінальному додатку обирач плащів, щоб скористатися ним.§r", "gtceu.chemical_bath": "Хімічна ванна", "gtceu.chemical_reactor": "Хімічний реактор", - "gtceu.circuit_assembler": "Circuit Assembler", + "gtceu.circuit_assembler": "Схемотехнічний збирач", "gtceu.coke_oven": "Коксова піч", - "gtceu.combustion_generator": "Генератор горіння", + "gtceu.combustion_generator": "Генератор внутрішнього згоряння", "gtceu.compressor": "Компресор", "gtceu.computer_monitor_cover.error.bf_invalid": "Недійсний символ у %d", - "gtceu.computer_monitor_cover.error.bf_invalid_num": "Недійсний номер в індексі %d під час обробки символу номер %d", - "gtceu.computer_monitor_cover.error.exception": "Сталася неочікувана виняткова ситуація: %s", + "gtceu.computer_monitor_cover.error.bf_invalid_num": "Недійсне число в індексі %d під час обробки символу № %d", + "gtceu.computer_monitor_cover.error.exception": "Сталася несподівана виняткова ситуація: %s", "gtceu.computer_monitor_cover.error.invalid_args": "Недійсні аргументи!", - "gtceu.computer_monitor_cover.error.invalid_number": "Недійсний номер «%s»!", - "gtceu.computer_monitor_cover.error.missing_item": "Відсутній %s у слоті %d!", - "gtceu.computer_monitor_cover.error.no_ae": "Власник модифікатора не має мережі AE2!", - "gtceu.computer_monitor_cover.error.no_cover": "Немає покриття!", - "gtceu.computer_monitor_cover.error.no_placeholder": "Немає такого заповнювача: '%s'!", - "gtceu.computer_monitor_cover.error.not_enough_args": "Очікувалося принаймні %d аргументів, отримано %d!", - "gtceu.computer_monitor_cover.error.not_in_range": "Очікується, що %s буде між %d і %d (включно), отримано %d", - "gtceu.computer_monitor_cover.error.not_supported": "Ця функція не підтримується цим блоком/модифікатором!", + "gtceu.computer_monitor_cover.error.invalid_number": "Недійсне число «%s»!", + "gtceu.computer_monitor_cover.error.missing_item": "Відсутньо %s у слоті %d!", + "gtceu.computer_monitor_cover.error.no_ae": "Тримач кришки не має мережі AE2!", + "gtceu.computer_monitor_cover.error.no_cover": "Немає кришки!", + "gtceu.computer_monitor_cover.error.no_placeholder": "Немає такого заповнювача: «%s»!", + "gtceu.computer_monitor_cover.error.not_enough_args": "Очікувалося щонайменше %d аргументів, отримано %d!", + "gtceu.computer_monitor_cover.error.not_in_range": "Очікувалося, що %s буде між %d і %d (включно), отримано %d", + "gtceu.computer_monitor_cover.error.not_supported": "Ця функція не підтримується цим блоком/кришкою!", "gtceu.computer_monitor_cover.error.unclosed_bracket": "Незакрита дужка!", - "gtceu.computer_monitor_cover.error.unexpected_bracket": "Неочікувана закриваюча дужка!", + "gtceu.computer_monitor_cover.error.unexpected_bracket": "Несподівана закриваюча дужка!", "gtceu.computer_monitor_cover.error.wrong_number_of_args": "Очікувалося %d аргументів, отримано %d!", - "gtceu.cover.activity_detector.message_activity_inverted": "Нагляд інвертованого статусу активности", - "gtceu.cover.activity_detector.message_activity_normal": "Нагляд нормального статусу активности", - "gtceu.cover.activity_detector_advanced.message_activity_inverted": "Нагляд інвертованого статусу прогресу", - "gtceu.cover.activity_detector_advanced.message_activity_normal": "Нагляд нормального статусу прогресу", - "gtceu.cover.energy_detector.message_electricity_storage_inverted": "Нагляд інвертованого зберігання енергії", - "gtceu.cover.energy_detector.message_electricity_storage_normal": "Нагляд нормального зберігання енергії", - "gtceu.cover.fluid_detector.message_fluid_storage_inverted": "Нагляд інвертованого зберігання рідини", - "gtceu.cover.fluid_detector.message_fluid_storage_normal": "Нагляд нормального зберігання рідини", - "gtceu.cover.item_detector.message_item_storage_inverted": "Нагляд інвертованого зберігання предметів", - "gtceu.cover.item_detector.message_item_storage_normal": "Нагляд нормального зберігання предметів", - "gtceu.cracker": "Машина крекінгу", + "gtceu.cover.activity_detector.message_activity_inverted": "Моніторинг інвертованого стану активності", + "gtceu.cover.activity_detector.message_activity_normal": "Моніторинг нормального стану активності", + "gtceu.cover.activity_detector_advanced.message_activity_inverted": "Моніторинг інвертованого стану обробки", + "gtceu.cover.activity_detector_advanced.message_activity_normal": "Моніторинг нормального стану обробки", + "gtceu.cover.energy_detector.message_electricity_storage_inverted": "Моніторинг інвертованого зберігання електроенергії", + "gtceu.cover.energy_detector.message_electricity_storage_normal": "Моніторинг нормального зберігання електроенергії", + "gtceu.cover.fluid_detector.message_fluid_storage_inverted": "Моніторинг інвертованого зберігання рідини", + "gtceu.cover.fluid_detector.message_fluid_storage_normal": "Моніторинг нормального зберігання рідин", + "gtceu.cover.item_detector.message_item_storage_inverted": "Моніторинг інвертованого зберігання предметів", + "gtceu.cover.item_detector.message_item_storage_normal": "Моніторинг нормального зберігання предметів", + "gtceu.cracker": "Крекер", "gtceu.creative.activity.off": "Неактивний", "gtceu.creative.activity.on": "Активний", - "gtceu.creative.chest.ipc": "Предметів на цикл", + "gtceu.creative.chest.ipc": "Предмети за цикл", "gtceu.creative.chest.item": "Предмет", - "gtceu.creative.chest.tpc": "Тактів на цикл", - "gtceu.creative.computation.average": "Середня ОРО/т запитану", + "gtceu.creative.chest.tpc": "Такти за цикл", + "gtceu.creative.computation.average": "Середні запитувані ОРОт", "gtceu.creative.energy.amperage": "Сила струму", - "gtceu.creative.energy.sink": "Відвід", + "gtceu.creative.energy.sink": "Поглинання", "gtceu.creative.energy.source": "Джерело", - "gtceu.creative.energy.voltage": "Вольт", + "gtceu.creative.energy.voltage": "Напруга", "gtceu.creative.tank.fluid": "Рідина", - "gtceu.creative.tank.mbpc": "мВ на цикл", - "gtceu.creative.tank.tpc": "Тактів на цикл", + "gtceu.creative.tank.mbpc": "мВ за цикл", + "gtceu.creative.tank.tpc": "Такти за цикл", "gtceu.creative_tooltip.1": "§7Вам потрібен", - "gtceu.creative_tooltip.2": "режим творчости", - "gtceu.creative_tooltip.3": "§7для використання", - "gtceu.cutter": "Різальна машина", - "gtceu.debug.f3_h.enabled": "GregTech змінив інформацію про налагодження! Для розробників: увімкніть misc:debug у файлі налаштувань, щоб побачити більше", - "gtceu.direction.tooltip.back": "Позаду", - "gtceu.direction.tooltip.down": "Знизу", - "gtceu.direction.tooltip.front": "Спереду", - "gtceu.direction.tooltip.left": "Зліва", - "gtceu.direction.tooltip.right": "Справа", - "gtceu.direction.tooltip.up": "Згори", - "gtceu.display_source.computer_monitor_cover": "Модифікатор монітора комп'ютера", - "gtceu.display_target.computer_monitor_cover": "Модифікатор монітора комп'ютера", + "gtceu.creative_tooltip.2": " творчий режим", + "gtceu.creative_tooltip.3": "§7, щоб використовувати це", + "gtceu.cutter": "Різак", + "gtceu.debug.f3_h.enabled": "GregTech змінив інформацію про налагодження! Для розробників: увімкніть опцію misc:debug config у конфігураційному файлі GregTech, щоб побачити більше", + "gtceu.direction.tooltip.back": "Тил", + "gtceu.direction.tooltip.down": "Низ", + "gtceu.direction.tooltip.front": "Перед", + "gtceu.direction.tooltip.left": "Лівий бік", + "gtceu.direction.tooltip.right": "Правий бік", + "gtceu.direction.tooltip.up": "Верх", + "gtceu.display_source.computer_monitor_cover": "Кришка монітора комп'ютера", + "gtceu.display_target.computer_monitor_cover": "Кришка монітора комп'ютера", "gtceu.distillation_tower": "Дистиляційна вежа", "gtceu.distillery": "Дистилятор", "gtceu.duct_pipe.transfer_rate": "§bШвидкість передачі повітря: %s", @@ -2290,166 +2293,166 @@ "gtceu.electric_blast_furnace": "Електрична доменна піч", "gtceu.electric_furnace": "Електрична піч", "gtceu.electrolyzer": "Електролізер", - "gtceu.electromagnetic_separator": "Електромагнітний розділювач", - "gtceu.ender_item_link_cover.title": "Посилання предмета Енду", - "gtceu.ender_item_link_cover.tooltip": "§7Транспортує §fпредмети§7 за допомогою §fбездротового з'єднання §dЕнду§f§7 як §fмодифікатор§7.", - "gtceu.ender_redstone_link_cover.label": "Сила редстоуну: %d", - "gtceu.ender_redstone_link_cover.title": "Посилання редстоуну Енду", - "gtceu.ender_redstone_link_cover.tooltip": "§7Передає §fсигнал редстоуну§7 за допомогою §fбездротового з'єднання §dЕнду§f§7 як §fмодифікатор§7.", - "gtceu.extractor": "Екстарктор", - "gtceu.extruder": "Ектрудор", - "gtceu.fermenter": "Ферметнтатор", - "gtceu.fluid.amount": "§9Кількість: %d/%d мВ", - "gtceu.fluid.click_combined": "§7Натисніть ємністю рідиною, щоб §bочистити§7/§bнаповнити§7 бак (Shift+ЛКМ для повного стосу).", - "gtceu.fluid.click_to_empty": "§7Натисніть ємністю рідини, щоб §bочистити§7 бак (Shift+ЛКМ для повного стосу).", - "gtceu.fluid.click_to_fill": "§7Натисніть ємністю рідини, щоб §bнаповнити§7 бак (Shift+ЛКМ для повного стосу).", - "gtceu.fluid.empty": "Порожній", + "gtceu.electromagnetic_separator": "Електромагнітний сепаратор", + "gtceu.ender_item_link_cover.title": "Предметний зв'язок Енду", + "gtceu.ender_item_link_cover.tooltip": "§7Переміщує §fпредмети§7 за допомогою§f бездротового з'єднання §dЕнду§7 як§f кришка§7.", + "gtceu.ender_redstone_link_cover.label": "Редстоунове живлення: %d", + "gtceu.ender_redstone_link_cover.title": "Редстоуновий зв'язок Енду", + "gtceu.ender_redstone_link_cover.tooltip": "§7Переміщує §fредстоунові сигнали§7 за допомогою§f бездротового з'єднання §dЕнду§7 як§f кришка§7.", + "gtceu.extractor": "Екстрактор", + "gtceu.extruder": "Екструдер", + "gtceu.fermenter": "Ферментатор", + "gtceu.fluid.amount": "§9Місткість: %d/%d мВ", + "gtceu.fluid.click_combined": "§7Клацніть контейнером з рідиною, щоб§b спустошити§7 або§b заповнити§7 бак (Shift-клік для повного стосу).", + "gtceu.fluid.click_to_empty": "§7Клацніть контейнером з рідиною, щоб§b спустошити§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.gas_vapor": "%s (пара)", "gtceu.fluid.generic": "%s", "gtceu.fluid.liquid_generic": "%s (рідина)", - "gtceu.fluid.molten": "%s (розтоплено)", + "gtceu.fluid.molten": "%s (розплавлений)", "gtceu.fluid.plasma": "%s (плазма)", - "gtceu.fluid.state_gas": "§aСтан: газ", - "gtceu.fluid.state_liquid": "§aСтан: рідина", + "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Кислотний! Поводьтеся обережно!", - "gtceu.fluid_heater": "Рідинний нагрувач", + "gtceu.fluid.temperature": "§cТемпература: %s", + "gtceu.fluid.temperature.cryogenic": "§bКріогенна небезпека! тримайте обережно!", + "gtceu.fluid.type_acid.tooltip": "§6Кислотна небезпека! тримайте обережно!", + "gtceu.fluid_heater": "Рідинний нагрівач", "gtceu.fluid_pipe.acid_proof": "§6Може працювати з кислотами", - "gtceu.fluid_pipe.capacity": "§9Місткість: §f%d мБ", - "gtceu.fluid_pipe.channels": "§eКанали: §f%d", - "gtceu.fluid_pipe.cryo_proof": "§6Може працювати з кріогенікою", + "gtceu.fluid_pipe.capacity": "§9Місткість:§f %d мВ", + "gtceu.fluid_pipe.channels": "§eКанали:§f %d", + "gtceu.fluid_pipe.cryo_proof": "§6Може працювати з кріогенними речовинами", "gtceu.fluid_pipe.gas_proof": "§6Може працювати з газами", - "gtceu.fluid_pipe.max_temperature": "§cЛіміт температури: §f%d K", + "gtceu.fluid_pipe.max_temperature": "§cМежа температури:§f %s", "gtceu.fluid_pipe.not_gas_proof": "§4Можливий витік газів!", - "gtceu.fluid_pipe.plasma_proof": "§6Може працювати з плазмами", - "gtceu.fluid_solidifier": "Затверджувач рідини", + "gtceu.fluid_pipe.plasma_proof": "§6Може працювати з усіма видами плазми", + "gtceu.fluid_solidifier": "Рідинний затверджувач", "gtceu.forge_hammer": "Ковальський молот", - "gtceu.forming_press": "Формувальеа форма", - "gtceu.forming_press.naming.named": "§oНазваний предмет", - "gtceu.forming_press.naming.press": "§oНазваний прес", - "gtceu.forming_press.naming.to_name": "§oПредмет у назву", + "gtceu.forming_press": "Формовий прес", + "gtceu.forming_press.naming.named": "§oПерейменований предмет", + "gtceu.forming_press.naming.press": "§oІменувальний прес", + "gtceu.forming_press.naming.to_name": "§oПредмет до перейменування", "gtceu.fusion_reactor": "Термоядерний реактор", - "gtceu.gas_collector": "Газовий збирач", + "gtceu.gas_collector": "Газозбірник", "gtceu.gas_turbine": "Газова турбіна", - "gtceu.gui.adv_stocking_config.min_fluid_count": "Мінімальний розмір стопки рідини для автоматичного витягування", - "gtceu.gui.adv_stocking_config.min_item_count": "Мінімальний розмір стопки предметів для автоматичного витягування", + "gtceu.gui.adv_stocking_config.min_fluid_count": "Мінімальний розмір стосу рідини для автоматичного витягування", + "gtceu.gui.adv_stocking_config.min_item_count": "Мінімальний розмір стосу предметів для автоматичного витягування", "gtceu.gui.adv_stocking_config.ticks_per_cycle": "Затримка між оновленнями списку предметів", - "gtceu.gui.adv_stocking_config.title": "Налаштувати автоматичне зберігання", - "gtceu.gui.all_voiding": "§7Знищує §cвсе", + "gtceu.gui.adv_stocking_config.title": "Налаштування автоматичного поповнення запасів", + "gtceu.gui.all_voiding": "§7Видалення §cусього", "gtceu.gui.auto_output.name": "авто", "gtceu.gui.central_monitor.group": "Група: %s", "gtceu.gui.central_monitor.group_default_name": "Група #%d", - "gtceu.gui.central_monitor.none": "жодна", - "gtceu.gui.central_monitor.text_scale": "Розмір тексту", - "gtceu.gui.charger_slot.tooltip.0": "§fСлот зарядки§r", - "gtceu.gui.charger_slot.tooltip.1": "§7Живиться від %s батарей§r", - "gtceu.gui.charger_slot.tooltip.2": "§7Заряджає %s інструментів і акумуляторів", - "gtceu.gui.chunkmode.disabled.0": "Режим чанків вимкнено: натисніть, щоб увімкнути.", - "gtceu.gui.chunkmode.disabled.1": "§7Для перемикання потрібна неактивна машина.", - "gtceu.gui.chunkmode.enabled.0": "Режим чанків увімкнено: натисніть, щоб вимкнути.", - "gtceu.gui.chunkmode.enabled.1": "§7Для перемикання потрібна неактивна машина.", + "gtceu.gui.central_monitor.none": "нічого", + "gtceu.gui.central_monitor.text_scale": "Масштаб тексту", + "gtceu.gui.charger_slot.tooltip.0": "§fГніздо для зарядного пристрою§r", + "gtceu.gui.charger_slot.tooltip.1": "§7Живиться від %s акумуляторів§r", + "gtceu.gui.charger_slot.tooltip.2": "§7Заряджає %s інструменти та акумулятори", + "gtceu.gui.chunkmode.disabled.0": "Режим чанків вимкнено: клацніть, щоб увімкнути.", + "gtceu.gui.chunkmode.disabled.1": "§7Перемикання вимагає зупинки машини.", + "gtceu.gui.chunkmode.enabled.0": "Режим чанків увімкнено: клацніть, щоб вимкнути.", + "gtceu.gui.chunkmode.enabled.1": "§7Перемикання вимагає зупинки машини.", "gtceu.gui.circuit.title": "Налаштування схеми", "gtceu.gui.computer_monitor_cover.edit_blank_placeholders": "Редагувати порожні заповнювачі", - "gtceu.gui.computer_monitor_cover.edit_displayed_text": "Редагувати текст", - "gtceu.gui.computer_monitor_cover.main_textbox_tooltip.0": "Рядок уведення для показу тут у рядку %d.", - "gtceu.gui.computer_monitor_cover.main_textbox_tooltip.1": "Він може мати заповнювачі, наприклад: «Енергія: {energy}/{energyCapacity} EU»", + "gtceu.gui.computer_monitor_cover.edit_displayed_text": "Редагувати відображуваний текст", + "gtceu.gui.computer_monitor_cover.main_textbox_tooltip.0": "Введіть рядок, який буде відображатися в рядку %d тут.", + "gtceu.gui.computer_monitor_cover.main_textbox_tooltip.1": "Він може містити заповнювачі, наприклад: «Енергія: {energy}/{energyCapacity} EU»", "gtceu.gui.computer_monitor_cover.main_textbox_tooltip.2": "Заповнювачі також можуть бути всередині інших заповнювачів.", "gtceu.gui.computer_monitor_cover.placeholder_reference.0": "Усі заповнювачі:", - "gtceu.gui.computer_monitor_cover.placeholder_reference.1": "(наведіть курсор для подробиць)", - "gtceu.gui.computer_monitor_cover.second_page_textbox_tooltip.0": "Введіть покажчик місця заповнення для використання тут замість %s '{}'.", - "gtceu.gui.computer_monitor_cover.second_page_textbox_tooltip.1": "Наприклад, ви можете мати рядок «Енергія: {}/{} EU» і «energy» і «energyCapacity» у цих текстових полях.", - "gtceu.gui.computer_monitor_cover.slot_tooltip.0": "Слот для елементів, на які можуть посилатися деякі заповнювачі", + "gtceu.gui.computer_monitor_cover.placeholder_reference.1": "(наведіть курсор для деталей)", + "gtceu.gui.computer_monitor_cover.second_page_textbox_tooltip.0": "Введіть заповнювач, який буде використовуватися замість %s «{}» тут.", + "gtceu.gui.computer_monitor_cover.second_page_textbox_tooltip.1": "Наприклад, ви можете мати рядок «Енергія: {}/{} EU» та «energy» та «energyCapacity» у цих текстових полях.", + "gtceu.gui.computer_monitor_cover.slot_tooltip.0": "Слот для предметів, на які можуть посилатися деякі заповнювачі", "gtceu.gui.computer_monitor_cover.slot_tooltip.1": "Номер слота: %d", "gtceu.gui.computer_monitor_cover.update_interval": "Інтервал оновлення (у тактах)", - "gtceu.gui.config_slot": "§fСлот налаштування§r", - "gtceu.gui.config_slot.auto_pull_managed": "§4ВИМК.:§7 керується за допомогою автоматичного витягування", - "gtceu.gui.config_slot.remove": "§7ПКМ, щоб §4очистити§7 слот налаштування.§r", - "gtceu.gui.config_slot.scroll": "§7Колесо прокрутки, щоб §aзмінити§7 кількість налашувань.§r", - "gtceu.gui.config_slot.set": "§7Натисніть, щоб §bустановити§7/§bвибрати§7 слот налашування.§r", - "gtceu.gui.config_slot.set_only": "§7Натисніть, щоб §bустановити§7 слот налашування.§r", - "gtceu.gui.configurator_slot.tooltip.0": "§fСлот налаштовувача§r", - "gtceu.gui.configurator_slot.tooltip.1": "§7Помістіть §6програмовану схему§7 в цей слот, щоб", - "gtceu.gui.configurator_slot.tooltip.2": "§7змінити налаштоване значення.", - "gtceu.gui.configurator_slot.tooltip.3": "§7Утримуйте §6Shift§7 під час натискання, щоб змінити на §65.", - "gtceu.gui.configurator_slot.tooltip.4": "§aПрограмована схема в цьому слоті також дійсна для введення рецептів.§r", + "gtceu.gui.config_slot": "§fКонфігураційний слот§r", + "gtceu.gui.config_slot.auto_pull_managed": "§4Вимкнено:§7 керується автоматичним витягуванням", + "gtceu.gui.config_slot.remove": "§7Клацніть ПКМ, щоб§4 очистити§7 конфігураційний слот.§r", + "gtceu.gui.config_slot.scroll": "§7Прокрутіть коліщатко, щоб§a змінити§7 число конфігурації.§r", + "gtceu.gui.config_slot.set": "§7Натисніть, щоб§b встановити/обрати§7 конфігураційний слот.§r", + "gtceu.gui.config_slot.set_only": "§7Натисніть, щоб§bвстановити§7 конфігураційний слот.§r", + "gtceu.gui.configurator_slot.tooltip.0": "§fСлот конфігуратора§r", + "gtceu.gui.configurator_slot.tooltip.1": "§7Помістіть§6 програмну плату§7 у це гніздо, щоб", + "gtceu.gui.configurator_slot.tooltip.2": "§7змінити його конфігурацію.", + "gtceu.gui.configurator_slot.tooltip.3": "§7Утримуйте§6 Shift§7 при натисканні кнопок, щоб змінювати на§6 5.", + "gtceu.gui.configurator_slot.tooltip.4": "§aПрограмна плата у цьому гнізді також дійсна для входів рецептів.§r", "gtceu.gui.content.chance_base": "Базовий шанс: %s%%", "gtceu.gui.content.chance_base_logic": "Базовий шанс: %s%% (%s)", - "gtceu.gui.content.chance_boosted": "Шанс на рівень: %s%%", - "gtceu.gui.content.chance_boosted_logic": "Шанс на рівень: %s%% (%s)", - "gtceu.gui.content.chance_nc": "§cНе споживається§r", - "gtceu.gui.content.chance_nc_short": "§cНС§r", - "gtceu.gui.content.chance_no_boost": "Шанс: %s%%", - "gtceu.gui.content.chance_no_boost_logic": "Шанс: %s%% (%s)", - "gtceu.gui.content.chance_tier_boost_minus": "Бонусний шанс: -%s%%/рівень", - "gtceu.gui.content.chance_tier_boost_plus": "Бонусний шанс: +%s%%/рівень", + "gtceu.gui.content.chance_boosted": "Шанс на рівні: %s%%", + "gtceu.gui.content.chance_boosted_logic": "Шанс на рівні: %s%% (%s)", + "gtceu.gui.content.chance_nc": "§cНе витрачається§r", + "gtceu.gui.content.chance_nc_short": "§cНВ§r", + "gtceu.gui.content.chance_no_boost": "Ймовірність: %s%%", + "gtceu.gui.content.chance_no_boost_logic": "Ймовірність: %s%% (%s)", + "gtceu.gui.content.chance_tier_boost_minus": "Додатковий шанс: -%s%%/рівень", + "gtceu.gui.content.chance_tier_boost_plus": "Додатковий шанс: +%s%%/рівень", "gtceu.gui.content.count_range": "%s-%sx", "gtceu.gui.content.fluid_range": "%s-%sмВ", - "gtceu.gui.content.per_tick": "§aСпоживається/виробляється на такт§r", + "gtceu.gui.content.per_tick": "§aСпожито/Вироблено за такт§r", "gtceu.gui.content.range": "%s-%s", "gtceu.gui.content.times_item": "x %s", - "gtceu.gui.content.tips.per_second_short": "§a/секунд§r", + "gtceu.gui.content.tips.per_second_short": "§a/секунда§r", "gtceu.gui.content.tips.per_tick_short": "§a/такт§r", "gtceu.gui.content.units.per_second": "/с", "gtceu.gui.content.units.per_tick": "/т", - "gtceu.gui.cover_setting.title": "Налаштування модифікатора", + "gtceu.gui.cover_setting.title": "Налаштування кришки", "gtceu.gui.directional_setting.tab_tooltip": "Змінити налаштування напрямку", "gtceu.gui.directional_setting.title": "Налаштування напрямку", - "gtceu.gui.editor.group.recipe_type": "капелюх", + "gtceu.gui.editor.group.recipe_type": "межа", "gtceu.gui.editor.tips.citation": "Кількість цитувань", - "gtceu.gui.fisher_mode.tooltip.0": "Перемикати непотрібні предмети", - "gtceu.gui.fisher_mode.tooltip.1": "Вимкнення коштує 2 рядки за операцію", + "gtceu.gui.fisher_mode.tooltip.0": "Вимкнути видалення предметів", + "gtceu.gui.fisher_mode.tooltip.1": "Вимкнення коштує 2 нитки за операцію", "gtceu.gui.fluid_amount": "Кількість рідини:", - "gtceu.gui.fluid_auto_input.tooltip.disabled": "Автовхід рідини вимкнено", - "gtceu.gui.fluid_auto_input.tooltip.enabled": "Автовхід рідини ввімкнено", - "gtceu.gui.fluid_auto_output.allow_input.disabled": "вимкнути вхід рідини з боку виходу", - "gtceu.gui.fluid_auto_output.allow_input.enabled": "увімкнути вхід рідини з боку виходу", - "gtceu.gui.fluid_auto_output.disabled": "Автовихід рідини вимкнено", - "gtceu.gui.fluid_auto_output.enabled": "Автовихід рідини ввімкнено", - "gtceu.gui.fluid_auto_output.other_direction.0": "Автовихід рідини: §6Інший напрямок", - "gtceu.gui.fluid_auto_output.other_direction.1": "§7Вихід рідини машини встановлено в іншому напрямку.", - "gtceu.gui.fluid_auto_output.other_direction.2": "§7Натисніть, щоб перемістити вивід на поточну вибраний бік.", - "gtceu.gui.fluid_auto_output.tooltip.disabled": "Автовихід рідини вимкнено", - "gtceu.gui.fluid_auto_output.tooltip.enabled": "Автовихід рідин увімкнено", - "gtceu.gui.fluid_auto_output.unselected.0": "Автовихід рідини", - "gtceu.gui.fluid_auto_output.unselected.1": "§7 Виберіть сторону машини, щоб налаштувати її вихід.", - "gtceu.gui.fluid_lock.tooltip.disabled": "Блокування рідини вимкнено", - "gtceu.gui.fluid_lock.tooltip.enabled": "Блокування рідини ввімкнено", - "gtceu.gui.fluid_voiding": "§7Знищує §9рідини", - "gtceu.gui.fluid_voiding_partial.tooltip.disabled": "Знищення рідини вимкнено", - "gtceu.gui.fluid_voiding_partial.tooltip.enabled": "Знищення рідини ввімкнено", - "gtceu.gui.fuel_amount": "Кількість палива:", - "gtceu.gui.item_auto_input.tooltip.disabled": "Автовхід предметів вимкнено", - "gtceu.gui.item_auto_input.tooltip.enabled": "Автовхід предметів увімкнено", - "gtceu.gui.item_auto_output.allow_input.disabled": "вимкнути вхід предметів з боку виходу", - "gtceu.gui.item_auto_output.allow_input.enabled": "увімкнути вхід предметів з боку виходу", - "gtceu.gui.item_auto_output.disabled": "Автовихід предметів вимкнено", - "gtceu.gui.item_auto_output.enabled": "Автовихід предметів увімкнено", - "gtceu.gui.item_auto_output.other_direction.0": "Автоматичний вихід предметів: §6Інший напрямок", - "gtceu.gui.item_auto_output.other_direction.1": "§7Машина виводить предмети в іншому напрямку.", - "gtceu.gui.item_auto_output.other_direction.2": "§7Натисніть, щоб перемістити вивід на поточну вибраний бік.", - "gtceu.gui.item_auto_output.tooltip.disabled": "Автовихід предметів вимкнено", - "gtceu.gui.item_auto_output.tooltip.enabled": "Автовихід предметів увімкнено", - "gtceu.gui.item_auto_output.unselected.0": "Автовихід предметів", - "gtceu.gui.item_auto_output.unselected.1": "§7Виберіть сторону машини, щоб налаштувати її вихід.", + "gtceu.gui.fluid_auto_input.tooltip.disabled": "Автовведення рідин вимкнено", + "gtceu.gui.fluid_auto_input.tooltip.enabled": "Автовведення рідин увімкнено", + "gtceu.gui.fluid_auto_output.allow_input.disabled": "вимкнути подачу рідин з боку виходу", + "gtceu.gui.fluid_auto_output.allow_input.enabled": "дозволити подачу рідин з боку виходу", + "gtceu.gui.fluid_auto_output.disabled": "Автовиведення рідин: §cВимкнено", + "gtceu.gui.fluid_auto_output.enabled": "Автовиведення рідин: §aУвімкнено", + "gtceu.gui.fluid_auto_output.other_direction.0": "Автовиведення рідин: §6Інший напрямок", + "gtceu.gui.fluid_auto_output.other_direction.1": "§7Рідинний вихід машини встановлена за іншим напрямком.", + "gtceu.gui.fluid_auto_output.other_direction.2": "§7Клацніть, щоб перемістити вихід на обраний бік.", + "gtceu.gui.fluid_auto_output.tooltip.disabled": "Автовиведення рідин вимкнено", + "gtceu.gui.fluid_auto_output.tooltip.enabled": "Автовиведення рідин увімкнено", + "gtceu.gui.fluid_auto_output.unselected.0": "Автовиведення рідин", + "gtceu.gui.fluid_auto_output.unselected.1": "§7Оберіть бік машини, щоб налаштувати її вихід.", + "gtceu.gui.fluid_lock.tooltip.disabled": "Блокування рідин вимкнено", + "gtceu.gui.fluid_lock.tooltip.enabled": "Блокування рідин увімкнено", + "gtceu.gui.fluid_voiding": "§7Видалення§9 рідин", + "gtceu.gui.fluid_voiding_partial.tooltip.disabled": "Видалення рідин вимкнено", + "gtceu.gui.fluid_voiding_partial.tooltip.enabled": "Видалення рідин увімкнено", + "gtceu.gui.fuel_amount": "Кількість пального:", + "gtceu.gui.item_auto_input.tooltip.disabled": "Автовведення предметів вимкнено", + "gtceu.gui.item_auto_input.tooltip.enabled": "Автовведення предметів увімкнено", + "gtceu.gui.item_auto_output.allow_input.disabled": "заборонити введення предметів з боку виходу", + "gtceu.gui.item_auto_output.allow_input.enabled": "дозволити введення предметів з боку виходу", + "gtceu.gui.item_auto_output.disabled": "Автовиведення предметів: §cВимкнено", + "gtceu.gui.item_auto_output.enabled": "Автовиведення предметів: §aУвімкнено", + "gtceu.gui.item_auto_output.other_direction.0": "Автовиведення предметів: §6Інший напрямок", + "gtceu.gui.item_auto_output.other_direction.1": "§7Предметний вихід машини встановлена за іншим напрямком.", + "gtceu.gui.item_auto_output.other_direction.2": "§7Клацніть, щоб перемістити вихід на обраний бік.", + "gtceu.gui.item_auto_output.tooltip.disabled": "Автовиведення предметів вимкнено", + "gtceu.gui.item_auto_output.tooltip.enabled": "Автовиведення предметів увімкнено", + "gtceu.gui.item_auto_output.unselected.0": "Автовиведення предметів", + "gtceu.gui.item_auto_output.unselected.1": "§7Оберіть бік машини, щоб налаштувати її вихід.", "gtceu.gui.item_lock.tooltip.disabled": "Блокування предметів вимкнено", "gtceu.gui.item_lock.tooltip.enabled": "Блокування предметів увімкнено", - "gtceu.gui.item_voiding": "§7Знищує §6предмети", - "gtceu.gui.item_voiding_partial.tooltip.disabled": "Знищення предметів вимкнено", - "gtceu.gui.item_voiding_partial.tooltip.enabled": "Знищення предметів увімкнено", + "gtceu.gui.item_voiding": "§7Видалення§6 предметів", + "gtceu.gui.item_voiding_partial.tooltip.disabled": "Видалення вимкнено", + "gtceu.gui.item_voiding_partial.tooltip.enabled": "Видалення увімкнено", "gtceu.gui.machinemode": "Активний режим машини: %s", "gtceu.gui.machinemode.tab_tooltip": "Змінити активний режим машини", "gtceu.gui.machinemode.title": "Активний режим машини", - "gtceu.gui.me_bus.auto_pull_button": "Натисніть, щоб увімкнути автовихід предметів із ME", - "gtceu.gui.me_network.offline": "Статус мережі: §4Немає§r", - "gtceu.gui.me_network.online": "Статус мережі: §2Є§r", - "gtceu.gui.multiblock.voiding_mode": "Режим знищення:", - "gtceu.gui.no_voiding": "§7Нічого не знизує", - "gtceu.gui.output_setting.title": "Налаштування виходу", - "gtceu.gui.output_setting.tooltips.0": "ПКМ, щоб налаштувати автовихід предметів", - "gtceu.gui.output_setting.tooltips.1": "ПКМ, щоб налаштувати автовихід рідини.", + "gtceu.gui.me_bus.auto_pull_button": "Натисніть, щоб увімкнути автоматичне витягування предметів з ME", + "gtceu.gui.me_network.offline": "Стан мережі:§4 Офлайн§r", + "gtceu.gui.me_network.online": "Стан мережі:§2 Онлайн§r", + "gtceu.gui.multiblock.voiding_mode": "Режим видалення:", + "gtceu.gui.no_voiding": "§7Видалення нічого", + "gtceu.gui.output_setting.title": "Налаштування виводу", + "gtceu.gui.output_setting.tooltips.0": "ЛКМ, щоб налаштувати автоматичне виведення предметів", + "gtceu.gui.output_setting.tooltips.1": "ПКМ, щоб налаштувати автоматичне виведення рідин.", "gtceu.gui.overclock.description.0": "Кнопка розгону", "gtceu.gui.overclock.description.1": "§7Рецепти можуть розганятися до встановленого рівня", "gtceu.gui.overclock.disabled.0": "Розгін вимкнено.", @@ -2459,1348 +2462,1348 @@ "gtceu.gui.overclock.off": "X", "gtceu.gui.overclock.range": "Доступні рівні [%s, %s]", "gtceu.gui.overclock.title": "Рівень розгону", - "gtceu.gui.silktouch.disabled.0": "Шовковий дотик вимкнено: натисніть, щоб увімкнути.", - "gtceu.gui.silktouch.disabled.1": "§7Для перемикання потрібна неактивна машина.", - "gtceu.gui.silktouch.enabled.0": "Шовковий дотик увімкнено: натисніть, щоб вимкнути.", - "gtceu.gui.silktouch.enabled.1": "§7Для перемикання потрібна неактивна машина.", + "gtceu.gui.silktouch.disabled.0": "Шовковий дотик вимкнено: Натисніть, щоб увімкнути.", + "gtceu.gui.silktouch.disabled.1": "§7Перемикання вимагає зупинки машини.", + "gtceu.gui.silktouch.enabled.0": "Шовковий дотик увімкнено: Натисніть, щоб вимкнути.", + "gtceu.gui.silktouch.enabled.1": "§7Перемикання вимагає зупинки машини.", "gtceu.gui.sort": "Сортувати", "gtceu.gui.title.adv_stocking_config.min_fluid_count": "Мін. кількість рідини", "gtceu.gui.title.adv_stocking_config.min_item_count": "Мін. кількість предметів", - "gtceu.gui.title.adv_stocking_config.ticks_per_cycle": "Тактів на цикл", + "gtceu.gui.title.adv_stocking_config.ticks_per_cycle": "Тактів за цикл", "gtceu.gui.title_bar.back": "Назад", "gtceu.gui.title_bar.page_switcher": "Сторінки", - "gtceu.gui.toggle_view.disabled": "Перемкнути перегляд (рідини)", - "gtceu.gui.toggle_view.enabled": "Перемкнути перегляд (предмети)", - "gtceu.gui.waiting_list": "Черга надсилання:", - "gtceu.hazard_trigger.any": "Будь-який контакт", - "gtceu.hazard_trigger.description": "Викликано:", - "gtceu.hazard_trigger.inhalation": "Удихання", - "gtceu.hazard_trigger.none": "Нічого", - "gtceu.hazard_trigger.protection.description": "Захищає від:", - "gtceu.hazard_trigger.skin_contact": "Контакт зі шкірою", - "gtceu.implosion_compressor": "Вибуховий компресор", + "gtceu.gui.toggle_view.disabled": "Перемкнути вид (Рідини)", + "gtceu.gui.toggle_view.enabled": "Перемкнути вид (Предмети)", + "gtceu.gui.waiting_list": "Черга на відправлення:", + "gtceu.hazard_trigger.any": "При будь-якому контакті", + "gtceu.hazard_trigger.description": "Спричиняється:", + "gtceu.hazard_trigger.inhalation": "При вдиханні", + "gtceu.hazard_trigger.none": "Ніяк", + "gtceu.hazard_trigger.protection.description": "Захищає:", + "gtceu.hazard_trigger.skin_contact": "При контакті зі шкірою", + "gtceu.implosion_compressor": "Компресор надмірного тиску", "gtceu.io.both": "Обидва", - "gtceu.io.export": "Забирання", - "gtceu.io.import": "Постачання", - "gtceu.io.none": "Нічого", + "gtceu.io.export": "Експорт", + "gtceu.io.import": "Імпорт", + "gtceu.io.none": "Ніяк", "gtceu.item_filter.empty_item": "Порожньо (немає предметів)", - "gtceu.item_filter.footer": "§eНатисніть предметом для перевизначення", - "gtceu.item_list.item_stored": "§7Збережено: %d", - "gtceu.item_pipe.priority": "§9Пріоритет: §f%d", + "gtceu.item_filter.footer": "§eКлацніть з предметом, щоб замінити", + "gtceu.item_list.item_stored": "§7Вміст: %d", + "gtceu.item_pipe.priority": "§9Пріоритет:§f %d", "gtceu.jade.amperage_use": "%s A", "gtceu.jade.at": " @ ", - "gtceu.jade.cleaned_this_second": "Знищення небезпеки: %s/c", + "gtceu.jade.cleaned_this_second": "Очищена небезпека: %s/s", "gtceu.jade.energy_stored": "%d / %d EU", "gtceu.jade.fluid_use": "%s мВ/т", "gtceu.jade.progress_computation": "%s / %s ОРО", "gtceu.jade.progress_sec": "%s / %s с", "gtceu.jade.progress_tick": "%s / %s т", - "gtceu.jei.bedrock_fluid.gtceu.heavy_oil_deposit": "Поклади важкої нафти", - "gtceu.jei.bedrock_fluid.gtceu.lava_deposit": "Поклади лави", - "gtceu.jei.bedrock_fluid.gtceu.light_oil_deposit": "Поклади легкої нафти", - "gtceu.jei.bedrock_fluid.gtceu.natural_gas_deposit": "Поклади природного газу", - "gtceu.jei.bedrock_fluid.gtceu.nether_natural_gas_deposit": "Поклади природного газу Незеру", - "gtceu.jei.bedrock_fluid.gtceu.oil_deposit": "Поклади нафти", - "gtceu.jei.bedrock_fluid.gtceu.raw_oil_deposit": "Поклади необробленої нафти", - "gtceu.jei.bedrock_fluid.gtceu.salt_water_deposit": "Поклади солоної води", - "gtceu.jei.bedrock_fluid_diagram": "Діаграма рідини корінної породи", - "gtceu.jei.bedrock_ore_diagram": "Діаграма руди корінної породи", - "gtceu.jei.fluid.dep_amount_hover": "Кількість, на яку жила буде виснажена", - "gtceu.jei.fluid.dep_chance_hover": "Відсоткова ймовірність того, що жила буде виснажена після збору", - "gtceu.jei.fluid.dep_yield_hover": "Максимальна продуктивність жили, коли вона повністю виснажена", - "gtceu.jei.fluid.depleted_rate": "Вичерпаний вихід: %d", - "gtceu.jei.fluid.depletion_amount": "Обсяг виснаження: %d", - "gtceu.jei.fluid.depletion_chance": "Імовірність виснаження: %d%%", + "gtceu.jei.bedrock_fluid.heavy_oil_deposit": "Поклад важкої нафти", + "gtceu.jei.bedrock_fluid.lava_deposit": "Поклад лави", + "gtceu.jei.bedrock_fluid.light_oil_deposit": "Поклад легкої нафти", + "gtceu.jei.bedrock_fluid.natural_gas_deposit": "Поклад природього газу", + "gtceu.jei.bedrock_fluid.nether_natural_gas_deposit": "Незерський поклад природього газу", + "gtceu.jei.bedrock_fluid.oil_deposit": "Поклад нафти", + "gtceu.jei.bedrock_fluid.raw_oil_deposit": "Поклад сирої нафти", + "gtceu.jei.bedrock_fluid.salt_water_deposit": "Поклад солоної води", + "gtceu.jei.bedrock_fluid_diagram": "Діаграма глибокореневих рідин", + "gtceu.jei.bedrock_ore_diagram": "Діаграма глибокореневих руд", + "gtceu.jei.fluid.dep_amount_hover": "На який обсяг буде виснажено поклад", + "gtceu.jei.fluid.dep_chance_hover": "Відсоткова ймовірність того, що поклад буде виснажено під час збору", + "gtceu.jei.fluid.dep_yield_hover": "Максимальний видобуток з поклади при її повному виснаженні", + "gtceu.jei.fluid.depleted_rate": "Максимальний видобуток: %d", + "gtceu.jei.fluid.depletion_amount": "Обсяг покладу: %d", + "gtceu.jei.fluid.depletion_chance": "Шанс видобутку: %d%%", "gtceu.jei.fluid.dimension": "Виміри:", - "gtceu.jei.fluid.max_hover": "Максимальний вихід, який може мати будь-яка рідинна жила цієї рідини", - "gtceu.jei.fluid.max_yield": "Максимальний вихід: %d", - "gtceu.jei.fluid.min_hover": "Мінімальний вихід, який може мати будь-яка рідинна жила цієї рідини", - "gtceu.jei.fluid.min_yield": "Мінімальний вихід: %d", + "gtceu.jei.fluid.max_hover": "Максимальний видобуток, який може мати будь-який поклад цієї рідини", + "gtceu.jei.fluid.max_yield": "Максимальний видобуток: %d", + "gtceu.jei.fluid.min_hover": "Мінімальний видобуток, який може мати будь-який поклад цієї рідини", + "gtceu.jei.fluid.min_yield": "Мінімальний видобуток: %d", "gtceu.jei.fluid.vein_weight": "Вага жили: %d", - "gtceu.jei.fluid.weight_hover": "Вага жила. Наведіть курсор на рідину, щоб побачити можливі зміни біома", + "gtceu.jei.fluid.weight_hover": "Вага жили. Наведіться на рідину, щоб побачити всі можливі модифікації біома", "gtceu.jei.materials.average_mass": "Середня маса: %d", - "gtceu.jei.materials.average_neutrons": "Середня кількість нейтронів: %d", - "gtceu.jei.materials.average_protons": "Середня кількість протонів: %d", - "gtceu.jei.multiblock_info": "Інфо багатоблока", - "gtceu.jei.ore.between.0": "Між рудою", - "gtceu.jei.ore.between.1": "З'являється в середніх %d шарах жили з іншими рудами", - "gtceu.jei.ore.biome_weighting": "§dВага %s: §3%d", - "gtceu.jei.ore.biome_weighting_no_spawn": "Вага §d%s: §cНеможливо з'явитися", - "gtceu.jei.ore.biome_weighting_title": "§dЗагальна вага модифікованого біому:", - "gtceu.jei.ore.ore_weight": "Вага в жилі: %d%%", - "gtceu.jei.ore.primary.0": "Найвища руда", - "gtceu.jei.ore.primary.1": "З'являється у верхніх %d шарах жили", + "gtceu.jei.materials.average_neutrons": "В серед. нейтронів: %d", + "gtceu.jei.materials.average_protons": "В серед. протонів: %d", + "gtceu.jei.multiblock_info": "Інфо про конструкцію", + "gtceu.jei.ore.between.0": "Внутрішня руда", + "gtceu.jei.ore.between.1": "Генерується у середині %d шарів поклади разом з іншими рудами", + "gtceu.jei.ore.biome_weighting": "Вага§d %s:§3 %d", + "gtceu.jei.ore.biome_weighting_no_spawn": "Вага§d %s:§c Не може згенеруватися", + "gtceu.jei.ore.biome_weighting_title": "§dЗагальна вага модифікованого біома:", + "gtceu.jei.ore.ore_weight": "Вага у жилі: %d%%", + "gtceu.jei.ore.primary.0": "Верхня руда", + "gtceu.jei.ore.primary.1": "Генерується зверху %d шарів жили", "gtceu.jei.ore.secondary.0": "Нижня руда", - "gtceu.jei.ore.secondary.1": "З'являється в нижніх %d шарах жили", + "gtceu.jei.ore.secondary.1": "Генерується знизу %d шарів жили", "gtceu.jei.ore.sporadic.0": "Спорадична руда", - "gtceu.jei.ore.sporadic.1": "Виникає будь-де у жилі", - "gtceu.jei.ore.surface_rock.0": "Поверхневі мінерали з цим матеріалом позначають місця появи жил.", - "gtceu.jei.ore.surface_rock.1": "Їх можна розбити за 3 крихітні купки пилу, удача дає бонус.", - "gtceu.jei.ore_processing_diagram": "Діаграма обробки руди", + "gtceu.jei.ore.sporadic.1": "Генерується по всій жилі", + "gtceu.jei.ore.surface_rock.0": "Поверхневі утворення з цим матеріалом позначають місця генерації жил.", + "gtceu.jei.ore.surface_rock.1": "Їх можна розбити, щоб отримати 3-5 крихт пилу, та ще більше із удачею.", + "gtceu.jei.ore_processing_diagram": "Послідовна рудообробка", "gtceu.jei.ore_vein.apatite_vein": "Апатитова жила", "gtceu.jei.ore_vein.banded_iron_vein": "Стрічкова залізна жила", - "gtceu.jei.ore_vein.bauxite_vein_end": "Покситова жила", - "gtceu.jei.ore_vein.beryllium_vein": "Верилієва жила", + "gtceu.jei.ore_vein.bauxite_vein_end": "Бокситова жила Енду", + "gtceu.jei.ore_vein.beryllium_vein": "Берилієва жила", "gtceu.jei.ore_vein.cassiterite_vein": "Каситеритова жила", - "gtceu.jei.ore_vein.certus_quartz": "Жила істинного жилу", + "gtceu.jei.ore_vein.certus_quartz": "Істинний кварц", "gtceu.jei.ore_vein.coal_vein": "Вугільна жила", "gtceu.jei.ore_vein.copper_tin_vein": "Мідно-олов'яна жила", "gtceu.jei.ore_vein.copper_vein": "Мідна жила", "gtceu.jei.ore_vein.diamond_vein": "Діамантова жила", - "gtceu.jei.ore_vein.galena_vein": "Галенітова жила", + "gtceu.jei.ore_vein.galena_vein": "Галенова жила", "gtceu.jei.ore_vein.garnet_tin_vein": "Гранатово-олов'яна жила", "gtceu.jei.ore_vein.garnet_vein": "Гранатова жила", "gtceu.jei.ore_vein.iron_vein": "Залізна жила", "gtceu.jei.ore_vein.lapis_vein": "Лазуритова жила", "gtceu.jei.ore_vein.lubricant_vein": "Мастильна жила", "gtceu.jei.ore_vein.magnetite_vein_end": "Магнетитова жила Енду", - "gtceu.jei.ore_vein.magnetite_vein_ow": "Магнетитова жила", - "gtceu.jei.ore_vein.manganese_vein": "Манґанова жила", - "gtceu.jei.ore_vein.manganese_vein_ow": "Манґанова жила", - "gtceu.jei.ore_vein.mica_vein": "Мікова жила", + "gtceu.jei.ore_vein.magnetite_vein_ow": "Магнетитова жила вС", + "gtceu.jei.ore_vein.manganese_vein": "Марганцева жила", + "gtceu.jei.ore_vein.manganese_vein_ow": "Марганцева жила вС", + "gtceu.jei.ore_vein.mica_vein": "Слюдяна жила", "gtceu.jei.ore_vein.mineral_sand_vein": "Жила мінерального піску", "gtceu.jei.ore_vein.molybdenum_vein": "Молібденова жила", "gtceu.jei.ore_vein.monazite_vein": "Монацитова жила", "gtceu.jei.ore_vein.naquadah_vein": "Наквадова жила", - "gtceu.jei.ore_vein.nether_quartz_vein": "Жила незерського кварцу", + "gtceu.jei.ore_vein.nether_quartz_vein": "Нижня кварцова жила", "gtceu.jei.ore_vein.nickel_vein": "Нікелева жила", - "gtceu.jei.ore_vein.oilsands_vein": "Жила нафтових пісків", + "gtceu.jei.ore_vein.oilsands_vein": "Жила нафтоносних пісків", "gtceu.jei.ore_vein.olivine_vein": "Олівінова жила", - "gtceu.jei.ore_vein.pitchblende_vein_end": "Уранінітова жила Енду", + "gtceu.jei.ore_vein.pitchblende_vein_end": "Настуранова жила Енду", "gtceu.jei.ore_vein.redstone_vein": "Редстоунова жила", - "gtceu.jei.ore_vein.redstone_vein_ow": "Редстоунова жила", + "gtceu.jei.ore_vein.redstone_vein_ow": "Редстоунова жила вС", "gtceu.jei.ore_vein.saltpeter_vein": "Селітрова жила", "gtceu.jei.ore_vein.salts_vein": "Соляна жила", - "gtceu.jei.ore_vein.sapphire_vein": "Сапірова жила", + "gtceu.jei.ore_vein.sapphire_vein": "Сапфірова жила", "gtceu.jei.ore_vein.scheelite_vein": "Шеєлітова жила", "gtceu.jei.ore_vein.sheldonite_vein": "Шелдонітова жила", "gtceu.jei.ore_vein.sulfur_vein": "Сірчана жила", "gtceu.jei.ore_vein.tetrahedrite_vein": "Тетраедритова жила", "gtceu.jei.ore_vein.topaz_vein": "Топазова жила", - "gtceu.jei.ore_vein_diagram": "Діаграма рудної жили", + "gtceu.jei.ore_vein_diagram": "Залягання руди", "gtceu.jei.ore_vein_diagram.chance": "§eШанс: %s§r", "gtceu.jei.ore_vein_diagram.dimensions": "Виміри:", - "gtceu.jei.ore_vein_diagram.spawn_range": "Діапазон появи:", + "gtceu.jei.ore_vein_diagram.spawn_range": "Висота залягання:", "gtceu.jei.ore_vein_diagram.weight": "Вага: %s", - "gtceu.jei.programmed_circuit": "Запрограмована сторінка схеми", - "gtceu.journeymap.options.layers": "Шари розвідки", - "gtceu.journeymap.options.layers.bedrock_fluids": "Показати жили рідини кореневої породи", + "gtceu.jei.programmed_circuit": "Сторінка програмної плати", + "gtceu.journeymap.options.layers": "Шари до розвідування", + "gtceu.journeymap.options.layers.bedrock_fluids": "Показати рідинні глибокорінні жили", "gtceu.journeymap.options.layers.hide_depleted": "Приховати виснажені жили", "gtceu.journeymap.options.layers.ore_veins": "Показати рудні жили", - "gtceu.key.armor_charging": "Перемикач зарядки обладунків до інвентарю", - "gtceu.key.armor_hover": "Перемикач наведення обладунків", - "gtceu.key.armor_mode_switch": "Перемикач режимів обладунків", - "gtceu.key.enable_boots": "Увімкнути прискорений стрибок", - "gtceu.key.enable_jetpack": "Увімкнути ранець", - "gtceu.key.tool_aoe_change": "Перемикач режиму інструмента AoE", + "gtceu.key.armor_charging": "Перемикач заряджання інвентарю від броні", + "gtceu.key.armor_hover": "Перемикач наведення броні", + "gtceu.key.armor_mode_switch": "Перемикач режиму броні", + "gtceu.key.enable_boots": "Увімкнути посилений стрибок", + "gtceu.key.enable_jetpack": "Реактивний ранець", + "gtceu.key.tool_aoe_change": "Перемикач роботи по області інструменту", "gtceu.large_boiler": "Великий котел", "gtceu.large_chemical_reactor": "Великий хімічний реактор", - "gtceu.laser_engraver": "Лахерний гравер", - "gtceu.lathe": "Токарний верстат", + "gtceu.laser_engraver": "Літограф", + "gtceu.lathe": "Токар", "gtceu.macerator": "Подрібнювач", - "gtceu.machine.active_transformer.tooltip.0": "§7Трансформатори: Лазери під маскуванням", - "gtceu.machine.active_transformer.tooltip.1": "§7Можливість поєднувати будь-яку кількість §fвходів§7 енергії в будь-яку кількість §fвиходів§7 енергії.", - "gtceu.machine.active_transformer.tooltip.2": "§7Може передавати потужність на неймовірну відстань за допомогою", + "gtceu.machine.active_transformer.tooltip.0": "§7Трансформатори: замасковані лазери", + "gtceu.machine.active_transformer.tooltip.1": "§7Може об'єднати будь-яку кількість енергетичних§f входів§7 у будь-яку кількість енергетичних§f виходів§7.", + "gtceu.machine.active_transformer.tooltip.2": "§7Може передавати енергію на неймовірні відстані за допомогою", "gtceu.machine.active_transformer.tooltip.3": " лазерів§7.", "gtceu.machine.advanced_processing_array.tooltip": "Паралелізуйте світ", - "gtceu.machine.assembly_line.tooltip": "Не багатоблоковий конвеєр!", + "gtceu.machine.assembly_line.tooltip": "Не багатоблочна складальна машина!", "gtceu.machine.available_recipe_map_1.tooltip": "Доступні типи рецептів: %s", "gtceu.machine.available_recipe_map_2.tooltip": "Доступні типи рецептів: %s, %s", "gtceu.machine.available_recipe_map_3.tooltip": "Доступні типи рецептів: %s, %s, %s", "gtceu.machine.available_recipe_map_4.tooltip": "Доступні типи рецептів: %s, %s, %s, %s", - "gtceu.machine.basic.input_from_output_side.allow": "Дозволити вхід з боку виходу: ", - "gtceu.machine.basic.input_from_output_side.disallow": "Заборонити вхід з боку виходу: ", - "gtceu.machine.batch_disabled": "Дозування: ВИМК.", - "gtceu.machine.batch_enabled": "Дозування: УВІМК.", - "gtceu.machine.bedrock_ore_miner.depletion": "§bШвидкість виснаження: §f%s%%", - "gtceu.machine.bedrock_ore_miner.description": "§7Бурить руду з жил під корінною породою.", - "gtceu.machine.bedrock_ore_miner.production": "§eПродукційний множник: §f%dx, %fx розігнано", - "gtceu.machine.block_breaker.speed_bonus": "§eДодаткова швидкість: §f%d%%", - "gtceu.machine.block_breaker.tooltip": "§7Добувники блокують на передній грані та збирають її краплі", - "gtceu.machine.boiler.info.cooling.down": "§9Охолодження§r%s", - "gtceu.machine.boiler.info.heating.up": "§cНагрівання§r%s", - "gtceu.machine.boiler.info.producing.steam": " §a(кипляча вода)", + "gtceu.machine.basic.input_from_output_side.allow": "Дозволити введення з боку виходу: ", + "gtceu.machine.basic.input_from_output_side.disallow": "Заборонити введення з боку виходу: ", + "gtceu.machine.batch_disabled": "Групування вимкнено", + "gtceu.machine.batch_enabled": "Групування увімкнено", + "gtceu.machine.bedrock_ore_miner.depletion": "§bШвидкість виснаження:§f %s%%", + "gtceu.machine.bedrock_ore_miner.description": "§7Видобуває руди з поклад під бедроком.", + "gtceu.machine.bedrock_ore_miner.production": "§eМножник виробництва:§f %dx, %fx розгін", + "gtceu.machine.block_breaker.speed_bonus": "§eДодаткова швидкість:§f %d%%", + "gtceu.machine.block_breaker.tooltip": "§7Добуває блок на лицьовій стороні та збирає його дроп", + "gtceu.machine.boiler.info.cooling.down": "§9Оходження§r", + "gtceu.machine.boiler.info.heating.up": "§cНагрівання§r", + "gtceu.machine.boiler.info.production.data": "§aВироблення %s§a мВ/т", "gtceu.machine.buffer.tooltip": "Невеликий буфер для зберігання предметів і рідин", - "gtceu.machine.canner.jei_description": "Ви можете наповнювати та спорожняти будь-які рідинні вмістища за допомогою консерватора рідини (наприклад, відра або рідинні камери)", - "gtceu.machine.central_monitor.tooltip": "Але чи може він запускати Doom?", - "gtceu.machine.charcoal_pile.tooltip": "Підземний паливний котлован", - "gtceu.machine.charcoal_pile.tooltip.0": "Перетворює колоди на §aдеревне вугілля§7, коли §cзапалюється§7.", - "gtceu.machine.charcoal_pile.tooltip.1": "Щоб почати, натисніть ПКМ з предметами, що викликають вогонь", - "gtceu.machine.charcoal_pile.tooltip.2": "Піроліз відбувається у просторі розміром до §b9x4x9§7 внизу.", - "gtceu.machine.charcoal_pile.tooltip.3": "Колоди не повинні піддаватися впливу §eповітря§7!", - "gtceu.machine.cleanroom.tooltip": "Запобігання набридливим частинкам", - "gtceu.machine.cleanroom.tooltip.0": "Розмістіть машини всередині, щоб запустити рецепти чистих приміщень.", - "gtceu.machine.cleanroom.tooltip.1": "Використовує §f30 EU/т§7, коли брудно, §f4 EU/т§7, коли чисто.", - "gtceu.machine.cleanroom.tooltip.2": "Розгін збільшує кількість очищення за цикл.", - "gtceu.machine.cleanroom.tooltip.3": "§bРозмір: §f5x5x5 до 15x15x15", - "gtceu.machine.cleanroom.tooltip.4": "Потрібні §fфільтраційна обшивка§7 у стелі, за винятком країв.", - "gtceu.machine.cleanroom.tooltip.5": "Приймає до §f4 дверей§7! Залишається чистим, коли двері відкриті.", - "gtceu.machine.cleanroom.tooltip.6": "Генератори, глушники, дрилі та примітивні машини занадто брудні для чистих приміщень!", - "gtceu.machine.cleanroom.tooltip.7": "Надсилайте живлення через §fкорпуси§7 або §fдіоди§7 у стінах.", - "gtceu.machine.cleanroom.tooltip.ae2.channels": "Надіслати до §f8 AE2 канали§7 через §fкорпус§7 у стінах.", - "gtceu.machine.cleanroom.tooltip.ae2.no_channels": "Надіслати §aAE2 мережа§7 через §fкорпус§7 у стінах.", - "gtceu.machine.cleanroom.tooltip.hold_ctrl": "Утримуйте CTRL для деталей структури", - "gtceu.machine.coke_oven.tooltip": "Створення кращого палива для сталі та енергії", - "gtceu.machine.coke_oven_hatch.tooltip": "§7Дозволяє автоматизований доступ до коксової печі.", - "gtceu.machine.combustion_generator.tooltip": "§7Потрібні легкозаймисті рідини", - "gtceu.machine.computation_receiver_hatch.tooltip": "Вихід даних обчислення для багатоблоків", - "gtceu.machine.computation_transmitter_hatch.tooltip": "Вихід обчислювальних даних для багатоблоків", + "gtceu.machine.canner.jei_description": "За допомогою пакувальника можна наповнювати та спорожняти будь-які ємності для рідини (наприклад, відра або рідинні комірки)", + "gtceu.machine.central_monitor.tooltip": "На ньому можна запустити Doom?", + "gtceu.machine.charcoal_pile.tooltip": "Підземна паливна піч", + "gtceu.machine.charcoal_pile.tooltip.0": "Перетворює колоди на§a деревне вугілля§7 при§c запалюванні§7.", + "gtceu.machine.charcoal_pile.tooltip.1": "ПКМ із запалювальним предметом, щоб запустити.", + "gtceu.machine.charcoal_pile.tooltip.2": "Піроліз відбувається під машиною в просторі до§b 9x4x9§7.", + "gtceu.machine.charcoal_pile.tooltip.3": "Колоди не повинні контактувати з§e повітрям§7!", + "gtceu.machine.cleanroom.tooltip": "Закривайте двері, мухи летять!", + "gtceu.machine.cleanroom.tooltip.0": "Розмістіть машини всередині, щоб виконувати рецепти чистої кімнати.", + "gtceu.machine.cleanroom.tooltip.1": "Використовує§f 30 EU/т§7 коли брудно,§f 4 EU/т§7 коли чисто.", + "gtceu.machine.cleanroom.tooltip.2": "Розгін збільшує обсяг очищення за цикл.", + "gtceu.machine.cleanroom.tooltip.3": "§bРозмір:§f від 5x5x5 до 15x15x15", + "gtceu.machine.cleanroom.tooltip.4": "Потребує§f фільтрувальні кришки§7 на стелі, за винятком країв.", + "gtceu.machine.cleanroom.tooltip.5": "Дозволяє встановити до§f 4 дверей§7! залишається чистим, коли двері відчинені.", + "gtceu.machine.cleanroom.tooltip.6": "Генератори, вихлопи, бури, гірники, та примітивні машини занадто брудні для чистої кімнати!", + "gtceu.machine.cleanroom.tooltip.7": "Передавайте енергію через§f корпуси§7 або§f діоди§7 у стінах.", + "gtceu.machine.cleanroom.tooltip.ae2.channels": "Проводьте до§f 8 AE2 каналів§7 через§f корпуси§7 у стінах.", + "gtceu.machine.cleanroom.tooltip.ae2.no_channels": "Проводьте§a мережу AE2§7 через§f корпуси§7 у стінах.", + "gtceu.machine.cleanroom.tooltip.hold_ctrl": "Утримуйте CTRL, щоб показати додаткову інформацію конструкції", + "gtceu.machine.coke_oven.tooltip": "Створює кращі палива для металургії та енергетики", + "gtceu.machine.coke_oven_hatch.tooltip": "§7Дозволяє автоматизувати доступ до коксової печі.", + "gtceu.machine.combustion_generator.tooltip": "§7Потребує легкозаймистих рідин", + "gtceu.machine.computation_receiver_hatch.tooltip": "Вхід для обчислювальних даних конструкцій", + "gtceu.machine.computation_transmitter_hatch.tooltip": "Вихід для обчислювальних даних конструкцій", "gtceu.machine.cracker.tooltip": "Робить нафту корисною", - "gtceu.machine.cracker.tooltip.1": "Кожна котушка після §6мідно-нікелевої§7 зменшує споживання енергії на §f10%%§7.", - "gtceu.machine.data_access_hatch.tooltip.0": "Доступ до даних для багатоблоків", - "gtceu.machine.data_access_hatch.tooltip.1": "Додає §a%s§7 слотів для даних предметів", - "gtceu.machine.data_bank.tooltip.0": "Ваш персональний NAS", - "gtceu.machine.data_bank.tooltip.1": "Масове зберігання даних. Передача за допомогою оптичних кабелів.", - "gtceu.machine.data_bank.tooltip.2": "Накопичувачі даних можна об'єднати разом.", - "gtceu.machine.data_bank.tooltip.3": "Звичайно використовує §f%s EU/т§7 для даних/оптичних шлюзів.", - "gtceu.machine.data_bank.tooltip.4": "Використовує §f%s EU/т§7 для даних/оптичних шлюзів, коли з’єднано.", - "gtceu.machine.data_receiver_hatch.tooltip": "Дослідження входу даних для багатоблоків", - "gtceu.machine.data_transmitter_hatch.tooltip": "Дослідження виходу даних для багатоблоків", - "gtceu.machine.diode.message": "Максимальна потужність струму: %s", - "gtceu.machine.diode.tooltip_general": "Дозволяє потоку енергії в одному напрямку та обмежує силу струму", - "gtceu.machine.diode.tooltip_starts_at": "Починається як §f1A§7, використовуйте м'який молоток для зміни", - "gtceu.machine.diode.tooltip_tool_usage": "Вдарте м'яким молотком, щоб змінити силу струму.", - "gtceu.machine.distillation_tower.tooltip": "Нафтопереробний завод", - "gtceu.machine.drum.disable_output": "Рідина не зливатиметься", - "gtceu.machine.drum.enable_output": "Буде зливати рідину до розташованих внизу суміжних баків", - "gtceu.machine.dual_hatch.export.tooltip": "Вихід предметів і рідин для багатоблоків", - "gtceu.machine.dual_hatch.import.tooltip": "Вхід предметів і рідин для багатоблоків", - "gtceu.machine.electric_blast_furnace.tooltip": "Де електрична коптильня?", - "gtceu.machine.electric_blast_furnace.tooltip.0": "Для кожного §f900K§7 температури, що перевищує температуру рецепта, множник енергії §f95%%§7 застосовується до розгону.", - "gtceu.machine.electric_blast_furnace.tooltip.1": "На кожні §f1800K§7 вище заданої температури один розгін стає §f100%% ефективним§7 (ідеальний розгін).", - "gtceu.machine.electric_blast_furnace.tooltip.2": "Для кожного рівня напруги вище §bсередьої§7 температура збільшується на §f100K§7.", - "gtceu.machine.endpoint.tooltip.0": "З'єднайте блоки §fтруб далекої дальности§7, щоб створити конвеєр.", - "gtceu.machine.endpoint.tooltip.1": "Конвеєри повинні мати саме кінцеві точки §f1 входу§7 і §f1 виходу§7.", - "gtceu.machine.endpoint.tooltip.2": "Тільки для кінцеваих точок конвеєра потрібно §fзавантажувати чанк§7.", - "gtceu.machine.endpoint.tooltip.min_length": "§bМінімальна відстань до кінцевої точки: §f%d блоків", + "gtceu.machine.cracker.tooltip.1": "§7Кожна котушка після§6 мельхіорової§7 зменшує споживання енергії на§f 10%%§7.", + "gtceu.machine.data_access_hatch.tooltip.0": "Доступ до даних для конструкцій", + "gtceu.machine.data_access_hatch.tooltip.1": "Додає§a %s§7 слотів для предметів даних", + "gtceu.machine.data_bank.tooltip.0": "Ваша персональна NAS", + "gtceu.machine.data_bank.tooltip.1": "Масове сховище даних. передає через оптичні кабелі.", + "gtceu.machine.data_bank.tooltip.2": "Бази даних можуть бути об'єднані в ланцюжок.", + "gtceu.machine.data_bank.tooltip.3": "Споживає§f %s EU/т§7 за звичайний люк даних/оптичний люк.", + "gtceu.machine.data_bank.tooltip.4": "Uses§f %s EU/т§7 за люк даних/оптичний люк у ланцюжку.", + "gtceu.machine.data_receiver_hatch.tooltip": "Вхід дослідницьких даних для конструкцій", + "gtceu.machine.data_transmitter_hatch.tooltip": "Вихід дослідницьких даних для конструкцій", + "gtceu.machine.diode.message": "Максимальний пропускний струм: %s", + "gtceu.machine.diode.tooltip_general": "Дозволяє потік енергії в одному напрямку та обмежує силу струму", + "gtceu.machine.diode.tooltip_starts_at": "Починає з§f 1A§7, використовуйте киянку для зміни", + "gtceu.machine.diode.tooltip_tool_usage": "Вдаряйте киянкою, щоб змінити силу струму.", + "gtceu.machine.distillation_tower.tooltip": "Рідинопереробний завод", + "gtceu.machine.drum.disable_output": "Не витягує рідину", + "gtceu.machine.drum.enable_output": "Витягує рідину у розміщений нижче резервуар", + "gtceu.machine.dual_hatch.export.tooltip": "Рідинний і предметний вихід для конструкцій", + "gtceu.machine.dual_hatch.import.tooltip": "Рідинний і предметний вхід для конструкцій", + "gtceu.machine.electric_blast_furnace.tooltip": "А електрична коптильня?", + "gtceu.machine.electric_blast_furnace.tooltip.0": "§7За кожні§f 900K§7 над необхідною температурою рецепта застосовується мультиплікативний§f 95%%§7 мультиплікатор енергії.", + "gtceu.machine.electric_blast_furnace.tooltip.1": "§7За кожні§f 1800K§7 над необхідною температурою рецепта один розгін стає на§f 100%% ефективним§7 (ідеальний розгін).", + "gtceu.machine.electric_blast_furnace.tooltip.2": "§7За кожний рівень напруги вище§b MV§7 температура збільшується на§f 100K§7.", + "gtceu.machine.endpoint.tooltip.0": "§7З'єднайте з блоком§f великодистанційного трубопроводу§7, щоб створити трубопровід.", + "gtceu.machine.endpoint.tooltip.1": "§7Тробопроводи повинні мати точно§f 1 вхід§7 та§f 1 вихід§7 як пункт призначення.", + "gtceu.machine.endpoint.tooltip.2": "§7Тільки пункти призначення трубопроводу потребують бути у§f завантаженому чанку§7.", + "gtceu.machine.endpoint.tooltip.min_length": "§bМінімальна дистанція до пункту призначення:§f %d блоків", "gtceu.machine.energy_converter.description": "Конвертує енергію між EU та FE", - "gtceu.machine.energy_converter.message_conversion_eu": "Перетворення EU, вхід: %dA %d EU, вихід: %d нативний", - "gtceu.machine.energy_converter.message_conversion_native": "Перетворення власної енергії, вхід: %d FE, вихід: %dA %d EU", - "gtceu.machine.energy_converter.tooltip_conversion_eu": "§aEU конвертація: §f%dA %d EU (%s§f) —> %d нативний", - "gtceu.machine.energy_converter.tooltip_conversion_native": "§cНативне перетворення: §f%d FE —> %dA %d EU (%s§f)", - "gtceu.machine.energy_converter.tooltip_tool_usage": "Запускається як §fконвертор FE§7, використовуйте м'який молоток для зміни", - "gtceu.machine.energy_hatch.input.tooltip": "Вхідна енергія для багатоблоків", - "gtceu.machine.energy_hatch.input_hi_amp.tooltip": "Вхідна енергія кількох ампер для багатоблоків", - "gtceu.machine.energy_hatch.output.tooltip": "Вихідна енергія для багатоблоків", - "gtceu.machine.energy_hatch.output_hi_amp.tooltip": "Вихідна енергія кількох ампер для багатоблоків", - "gtceu.machine.ev_alloy_smelter.tooltip": "§7Комбінований високотехнологічний топильник", - "gtceu.machine.ev_arc_furnace.tooltip": "§7Кому потрібна доменна піч?", - "gtceu.machine.ev_assembler.tooltip": "§7Збирання-майстрування!", - "gtceu.machine.ev_autoclave.tooltip": "§7Кристалізація вашого пилу", - "gtceu.machine.ev_bender.tooltip": "§7Бу, він поганий! Ми хочемо БЕНДЕРА!!!", - "gtceu.machine.ev_brewery.tooltip": "§7Компактне та ефективне приготування зілля", - "gtceu.machine.ev_canner.tooltip": "§7Розміщує речі в умістищах і виймає їх з них", - "gtceu.machine.ev_centrifuge.tooltip": "§7Молекулярний розділювач", - "gtceu.machine.ev_chemical_bath.tooltip": "§7Відділення руд у хімікатах", - "gtceu.machine.ev_chemical_reactor.tooltip": "§7Дозволяє хімічним речовинам реагувати одна з одною", - "gtceu.machine.ev_circuit_assembler.tooltip": "§7Збирає схеми", - "gtceu.machine.ev_compressor.tooltip": "§7Стискає речі", - "gtceu.machine.ev_cutter.tooltip": "§7Розріже блоки та предмети", - "gtceu.machine.ev_distillery.tooltip": "§7Вилучає найдоречніші частини рідин", - "gtceu.machine.ev_electric_furnace.tooltip": "§7Не схоже на використання Commodore 64", - "gtceu.machine.ev_electrolyzer.tooltip": "§7Електролізує молекули", - "gtceu.machine.ev_electromagnetic_separator.tooltip": "§7Відділяє магнітні руди від решти", - "gtceu.machine.ev_extractor.tooltip": "§7Очищувач соку — Пристрій приречености — D123", - "gtceu.machine.ev_extruder.tooltip": "§7Універсальний верстат для обробки металу", + "gtceu.machine.energy_converter.message_conversion_eu": "Конвертація EU, вхід: %dA %d EU, вихід: %d первинної енергії", + "gtceu.machine.energy_converter.message_conversion_native": "Конвертація первинної енергії, вхід: %d FE, вихід: %dA %d EU", + "gtceu.machine.energy_converter.tooltip_conversion_eu": "§aEU-конвертація:§f %dA %d EU (%s§f) -> %d первинної енергії", + "gtceu.machine.energy_converter.tooltip_conversion_native": "§cПервинна конвертація:§f %d FE -> %dA %d EU (%s§f)", + "gtceu.machine.energy_converter.tooltip_tool_usage": "Починає як§f FE-конвертер§7, використовуйте киянку для зміни", + "gtceu.machine.energy_hatch.input.tooltip": "Енергетичний вхід для конструкцій", + "gtceu.machine.energy_hatch.input_hi_amp.tooltip": "Багатоамперний енергетичний вхід для конструкцій", + "gtceu.machine.energy_hatch.output.tooltip": "Енергетичний вхід для конструкцій", + "gtceu.machine.energy_hatch.output_hi_amp.tooltip": "Багатоамперний енергетичний вхід для конструкцій", + "gtceu.machine.ev_alloy_smelter.tooltip": "§7Високотехнологічна комбінувальна плавильня сплавів", + "gtceu.machine.ev_arc_furnace.tooltip": "§7Кому взагалі потрібна плавильна піч?", + "gtceu.machine.ev_assembler.tooltip": "§7Месники, збираємось!", + "gtceu.machine.ev_autoclave.tooltip": "§7Кристалізує пил", + "gtceu.machine.ev_bender.tooltip": "§7Фууу, він поганий! Нам потрібен БЕНДЕР!!!", + "gtceu.machine.ev_brewery.tooltip": "§7Компактне та ефективне зіллєваріння", + "gtceu.machine.ev_canner.tooltip": "§7Поміщає речі в контейнери та виймає їх з них", + "gtceu.machine.ev_centrifuge.tooltip": "§7Молекулярний сепаратор", + "gtceu.machine.ev_chemical_bath.tooltip": "§7Розщеплює руди шляхом їх вимочування у хімікатах", + "gtceu.machine.ev_chemical_reactor.tooltip": "§7Дає хімічним речовинам вступати в реакцію між собою", + "gtceu.machine.ev_circuit_assembler.tooltip": "§7Всюдисущий віьзми-поклади", + "gtceu.machine.ev_compressor.tooltip": "§7Компресорно-механічна система C77", + "gtceu.machine.ev_cutter.tooltip": "§7Ріж-крій", + "gtceu.machine.ev_distillery.tooltip": "§7Вилучає найбільш важливі частини рідин", + "gtceu.machine.ev_electric_furnace.tooltip": "§7Не схоже на користування Commodore 64", + "gtceu.machine.ev_electrolyzer.tooltip": "§7Молекулярний електроліз", + "gtceu.machine.ev_electromagnetic_separator.tooltip": "§7Відокремлює магнітні руди від решти", + "gtceu.machine.ev_extractor.tooltip": "§7Соковичавлюючий пристрій приречення - D123", + "gtceu.machine.ev_extruder.tooltip": "§7Універсальна металообробна машина", "gtceu.machine.ev_fermenter.tooltip": "§7Ферментує рідини", - "gtceu.machine.ev_fluid_drilling_rig.tooltip": "Бурить", - "gtceu.machine.ev_fluid_heater.tooltip": "§7Нагріває ваші рідини", - "gtceu.machine.ev_fluid_solidifier.tooltip": "§7Охолоджує рідини до твердих речовин", - "gtceu.machine.ev_forge_hammer.tooltip": "§7Стоп, зараз час молотування!", - "gtceu.machine.ev_forming_press.tooltip": "§7Впечатування зображень у речі", - "gtceu.machine.ev_gas_collector.tooltip": "§7Збирає газ із повітря залежно від розміру", + "gtceu.machine.ev_fluid_drilling_rig.tooltip": "Свердловинний дренажер", + "gtceu.machine.ev_fluid_heater.tooltip": "§7Нагріває рідини", + "gtceu.machine.ev_fluid_solidifier.tooltip": "§7Охолоджує рідини до твердого стану", + "gtceu.machine.ev_forge_hammer.tooltip": "§7Стоп, час молота!", + "gtceu.machine.ev_forming_press.tooltip": "§7Витискає речам нову форму", + "gtceu.machine.ev_gas_collector.tooltip": "§7Збирає газ з повітря залежно від виміру", "gtceu.machine.ev_laser_engraver.tooltip": "§7Не дивіться прямо на лазер", - "gtceu.machine.ev_lathe.tooltip": "§7Ефективніше виготовляє стрижнів", - "gtceu.machine.ev_macerator.tooltip": "§7Подрібнення руди за допомогою побічних продуктів", - "gtceu.machine.ev_mass_fabricator.tooltip": "§7UUM Матерія * виробництво в квадраті", - "gtceu.machine.ev_mixer.tooltip": "§7Чи буде змішуватися?", - "gtceu.machine.ev_ore_washer.tooltip": "§7Отримання більшої кількости побічних продуктів із ваших руд", - "gtceu.machine.ev_packer.tooltip": "§7Розміщує речі в коробках і дістає їх із них", - "gtceu.machine.ev_polarizer.tooltip": "§7Біполяризація ваших магнітів", - "gtceu.machine.ev_replicator.tooltip": "§7Створення найчистіших предметів", - "gtceu.machine.ev_rock_crusher.tooltip": "§7Розмістіть воду та лаву горизонтально поруч", + "gtceu.machine.ev_lathe.tooltip": "§7Ефективніше виробляє стрижні", + "gtceu.machine.ev_macerator.tooltip": "§7Подрібнює руди з побічними продуктами", + "gtceu.machine.ev_mass_fabricator.tooltip": "§7UUM матерія * виробництво в квадраті", + "gtceu.machine.ev_mixer.tooltip": "§7Чи змішається?", + "gtceu.machine.ev_ore_washer.tooltip": "§7Отримує більше побічних продуктів з руд", + "gtceu.machine.ev_packer.tooltip": "§7Запаковує та розпаковує речі", + "gtceu.machine.ev_polarizer.tooltip": "§7Біполяризовує магніти", + "gtceu.machine.ev_replicator.tooltip": "§7Виробляє найчистіші елементи", + "gtceu.machine.ev_rock_crusher.tooltip": "§7Розмістіть поруч горизонтально воду і лаву", "gtceu.machine.ev_scanner.tooltip": "§7Сканує матеріали та інші речі", - "gtceu.machine.ev_sifter.tooltip": "§7Зберігайте спокій і продовжуйте просіювання", - "gtceu.machine.ev_thermal_centrifuge.tooltip": "§7Точніше розділення руд", - "gtceu.machine.ev_wiremill.tooltip": "§7Ефективніше виготовляє дроти", - "gtceu.machine.extreme_combustion_engine.tooltip": "Екстремальний хімічний викид енергії", - "gtceu.machine.fisher.requirement": "Потрібно %dx%d центрований квадрат води безпосередньо внизу.", - "gtceu.machine.fisher.speed": "Ловить щось кожні %d тактів", - "gtceu.machine.fisher.tooltip": "Витрачає рядок на риболовлю. Споживає один рядок щоразу.", - "gtceu.machine.fluid_drilling_rig.depletion": "§bШвидкість виснаження: §f%s%%", - "gtceu.machine.fluid_drilling_rig.description": "§7Бурить рідини з жил під корінною породою.", - "gtceu.machine.fluid_drilling_rig.production": "§eПродукційний множник: §f%dx, %fx розігнано", - "gtceu.machine.fluid_hatch.export.tooltip": "Рідинний вихід для багатоблоків", - "gtceu.machine.fluid_hatch.import.tooltip": "Рідинний вхід для багатоблоків", - "gtceu.machine.fluid_tank.fluid": "Містить %sЛ %s", - "gtceu.machine.fluid_tank.max_multiblock": "Максимальний розмір багато: %dx%dx%d", - "gtceu.machine.fusion_reactor.capacity": "§7Максимальне зберігання енергії: §e%s EU", - "gtceu.machine.fusion_reactor.luv.tooltip": "Витоплення атомних сплавів", - "gtceu.machine.fusion_reactor.overclocking": "Розгін подвоює енергію та вдвічі зменшує тривалість.", - "gtceu.machine.fusion_reactor.uv.tooltip": "БІЛИЙ КАРЛИК НА ВАШІЙ БАЗІ", - "gtceu.machine.fusion_reactor.zpm.tooltip": "ЯДРО СОНЦЯ НА ЗЕМЛІ", - "gtceu.machine.gas_turbine.tooltip": "§7Потрібні легкозаймисті гази", - "gtceu.machine.high_performance_computation_array.tooltip.0": "Звичайний суперкомп'ютер", - "gtceu.machine.high_performance_computation_array.tooltip.1": "Використовується для генерації §fобчислень§7 (і тепла).", - "gtceu.machine.high_performance_computation_array.tooltip.2": "Потрібні компоненти МВО для створення §fОРО/т§7 (обчислювальних робочих одиниць).", - "gtceu.machine.hp_steam_alloy_smelter.tooltip": "§7Комбінована топильня", - "gtceu.machine.hp_steam_compressor.tooltip": "§7Стиснення предметів", - "gtceu.machine.hp_steam_extractor.tooltip": "§7Видобуток вашого першого каучуку", + "gtceu.machine.ev_sifter.tooltip": "§7Зберігайте спокій і продовжуйте просіювати", + "gtceu.machine.ev_thermal_centrifuge.tooltip": "§7Точніше розділяє руди", + "gtceu.machine.ev_wiremill.tooltip": "§7Ефективніше виробляє дроти", + "gtceu.machine.extreme_combustion_engine.tooltip": "Екстремальний хімічний вивільнювач енергії", + "gtceu.machine.fisher.requirement": "Потребує %dx%d квадрат води прямо під собою.", + "gtceu.machine.fisher.speed": "Виловлює щось кожні %d тактів", + "gtceu.machine.fisher.tooltip": "Витрачає нитку на кожу ловлю.", + "gtceu.machine.fluid_drilling_rig.depletion": "§bШвидкість виснаження:§f %s%%", + "gtceu.machine.fluid_drilling_rig.description": "§7Видобуває рідини з покладів під бедроком.", + "gtceu.machine.fluid_drilling_rig.production": "§eМножник виробництва:§f %dx, %fx розгін", + "gtceu.machine.fluid_hatch.export.tooltip": "Рідинний вихід для конструкцій", + "gtceu.machine.fluid_hatch.import.tooltip": "Рідинний вхід для конструкцій", + "gtceu.machine.fluid_tank.fluid": "Містить %s л %s", + "gtceu.machine.fluid_tank.max_multiblock": "Макс. розмір конструкції: %dx%dx%d", + "gtceu.machine.fusion_reactor.capacity": "§7Максимальний запас енергії:§e %sM EU", + "gtceu.machine.fusion_reactor.luv.tooltip": "Атомний стоплювач", + "gtceu.machine.fusion_reactor.overclocking": "Розгін подвоює енергію та вдвічі скорочує тривалість.", + "gtceu.machine.fusion_reactor.uv.tooltip": "БІЛИЙ КАРЛИК ЗІЙШОВ НА ТВОЮ БАЗУ", + "gtceu.machine.fusion_reactor.zpm.tooltip": "СОНЦЕ ЗІЙШЛО НА ЗЕМЛЮ", + "gtceu.machine.gas_turbine.tooltip": "§7Потребує горючих газів", + "gtceu.machine.high_performance_computation_array.tooltip.0": "Просто звичайний суперкомп'ютер", + "gtceu.machine.high_performance_computation_array.tooltip.1": "Використовується для генерації§f обчислень§7 (та тепла).", + "gtceu.machine.high_performance_computation_array.tooltip.2": "Потребує компоненти ВОМ для генерації§f ОРО/т§7 (обчислювальних робочих одиниць).", + "gtceu.machine.hp_steam_alloy_smelter.tooltip": "§7Комбінувальна плавильня сплавів", + "gtceu.machine.hp_steam_compressor.tooltip": "§7Стискає предмети", + "gtceu.machine.hp_steam_extractor.tooltip": "§7Добувач першої глини", "gtceu.machine.hp_steam_forge_hammer.tooltip": "§7Ковальський молот", - "gtceu.machine.hp_steam_furnace.tooltip": "§7Топлення речей за допомогою стиснутої пари", - "gtceu.machine.hp_steam_liquid_boiler.tooltip": "§7Швидше, ніж малий паровий рідинний котел", - "gtceu.machine.hp_steam_macerator.tooltip": "§7Подрібнення ваших руд", - "gtceu.machine.hp_steam_rock_crusher.tooltip": "§7Розмістіть воду та лаву горизонтально поруч", - "gtceu.machine.hp_steam_solar_boiler.tooltip": "§7Парова сила від сонця", - "gtceu.machine.hp_steam_solid_boiler.tooltip": "§7Швидше, ніж маленький паровий твердопаливний котел", - "gtceu.machine.hpca.active_cooler_component.tooltip": "Менше вільного, ефективніше охолодження", - "gtceu.machine.hpca.advanced_computation_component.damaged.name": "Пошкоджений розширений обчислювальний компонент МВО", - "gtceu.machine.hpca.advanced_computation_component.damaged.tooltip": "Це коштувало лише руки й ноги", + "gtceu.machine.hp_steam_furnace.tooltip": "§7Плавить речі за допомогою стисненої пари", + "gtceu.machine.hp_steam_liquid_boiler.tooltip": "§7Швидше ніж малий паровий рідинний котел", + "gtceu.machine.hp_steam_macerator.tooltip": "§7Подрібнює руди без побічних продуктів", + "gtceu.machine.hp_steam_rock_crusher.tooltip": "§7Розмістіть поруч горизонтально воду і лаву", + "gtceu.machine.hp_steam_solar_boiler.tooltip": "§7Парова енергія від сонця", + "gtceu.machine.hp_steam_solid_boiler.tooltip": "§7Швидше ніж малий паровий твердопаливний котел", + "gtceu.machine.hpca.active_cooler_component.tooltip": "Менше витрат, ефективніше охолодження", + "gtceu.machine.hpca.advanced_computation_component.damaged.name": "Пошкоджений ВОМ-удосконалений обчислювальний компонент", + "gtceu.machine.hpca.advanced_computation_component.damaged.tooltip": "Це коштувало лише руки та ноги", "gtceu.machine.hpca.advanced_computation_component.tooltip": "Вища ліга обчислень", - "gtceu.machine.hpca.bridge_component.tooltip": "Отже, звідки походить «масив» у МВО", - "gtceu.machine.hpca.component_general.max_eut": "§6Макс. енергія: §f%d EU/т", - "gtceu.machine.hpca.component_general.upkeep_eut": "§eЕнергія підтримки: §f%d EU/т", - "gtceu.machine.hpca.component_type.bridge": "Дозволяє §fМВО§7 приєднуватися до §fмережевих перемичів§7", - "gtceu.machine.hpca.component_type.computation_cooling": "§cПотрібно до: §f%d охолодження", - "gtceu.machine.hpca.component_type.computation_cwut": "§9Обчислення: §f%d ОРО/т", - "gtceu.machine.hpca.component_type.cooler_active": "§bТип оходжувача: §fактивний", - "gtceu.machine.hpca.component_type.cooler_active_coolant": "§cПотрібно до: §f%d мВ/т %s", - "gtceu.machine.hpca.component_type.cooler_cooling": "§aЗабезпечує: §f%d охолодження", - "gtceu.machine.hpca.component_type.cooler_passive": "§bТип охолоджувача: §fпасивний", - "gtceu.machine.hpca.component_type.damaged": "Може бути пошкоджено через перегрів МВО!", - "gtceu.machine.hpca.computation_component.damaged.name": "Пошкоджений обчислювальний компонент МВО", - "gtceu.machine.hpca.computation_component.damaged.tooltip": "Безкоштовні матеріали, які можна переробити", - "gtceu.machine.hpca.computation_component.tooltip": "Перше обчислення дитини", - "gtceu.machine.hpca.empty_component.tooltip": "Лише для заповнення місця", - "gtceu.machine.hpca.heat_sink_component.tooltip": "Вільне охолодження! Є щось безкоштовно?", - "gtceu.machine.hull.tooltip": "§7Вам потрібна лише §5ф§dа§4н§cт§eа§aз§bі§3я§7, щоб використовувати це", - "gtceu.machine.hv_alloy_smelter.tooltip": "§7Високотехнологічна комбінована топильна установка", - "gtceu.machine.hv_arc_furnace.tooltip": "§7Кому потрібна доменна піч?", - "gtceu.machine.hv_assembler.tooltip": "§7Збирання-майстрування!", - "gtceu.machine.hv_autoclave.tooltip": "§7Кристалізація вашого пилу", - "gtceu.machine.hv_bender.tooltip": "§7Бу, він поганий! Ми хочемо БЕНДЕРА!!!", - "gtceu.machine.hv_brewery.tooltip": "§7Компактне та ефективне приготування зілля", - "gtceu.machine.hv_canner.tooltip": "§7Розміщує речі в умістищах і виймає їх з них", - "gtceu.machine.hv_centrifuge.tooltip": "§7Розділення молекул", - "gtceu.machine.hv_chemical_bath.tooltip": "§7Відділення руд у хімікатах", - "gtceu.machine.hv_chemical_reactor.tooltip": "§7Дозволяє хімічним речовинам реагувати одна з одною", - "gtceu.machine.hv_circuit_assembler.tooltip": "§7Збирає схеми", - "gtceu.machine.hv_compressor.tooltip": "§7Стиснення предметів", - "gtceu.machine.hv_cutter.tooltip": "§7Розріже блоки та предмети", - "gtceu.machine.hv_distillery.tooltip": "§7Вилучає найдоречніші частини рідин", - "gtceu.machine.hv_electric_furnace.tooltip": "§7Не схоже на використання Commodore 64", - "gtceu.machine.hv_electrolyzer.tooltip": "§7Електроліз молекул", - "gtceu.machine.hv_electromagnetic_separator.tooltip": "§7Відділення магнітних руд від решти", - "gtceu.machine.hv_extractor.tooltip": "§7Очищувач соку — Пристрій судження — D123", - "gtceu.machine.hv_extruder.tooltip": "§7Універсальний верстат для обробки металу", + "gtceu.machine.hpca.bridge_component.tooltip": "Так ось звідки з'явився «масив» У ВОМ", + "gtceu.machine.hpca.component_general.max_eut": "§6Макс. енергії:§f %d EU/т", + "gtceu.machine.hpca.component_general.upkeep_eut": "§eУтримання енергії:§f %d EU/т", + "gtceu.machine.hpca.component_type.bridge": "Дає§f ВОМ§7 можливість під'єднюватися до§f мережевих комутаторів§7", + "gtceu.machine.hpca.component_type.computation_cooling": "§cВимагає до:§f %d охолодження", + "gtceu.machine.hpca.component_type.computation_cwut": "§9Обчислення:§f %d ОРО/т", + "gtceu.machine.hpca.component_type.cooler_active": "§bТип охолоджувача:§f активний", + "gtceu.machine.hpca.component_type.cooler_active_coolant": "§cВимагає до:§f %d мВ/т %s", + "gtceu.machine.hpca.component_type.cooler_cooling": "§aЗабезпечує:§f %d охолодження", + "gtceu.machine.hpca.component_type.cooler_passive": "§bТип охолоджувача:§f пасивний", + "gtceu.machine.hpca.component_type.damaged": "Може бути пошкоджений через перегрівання ВОМ!", + "gtceu.machine.hpca.computation_component.damaged.name": "Пошкоджений ВОМ-обчислювальний компонент", + "gtceu.machine.hpca.computation_component.damaged.tooltip": "Безкоштовні переробні матеріали", + "gtceu.machine.hpca.computation_component.tooltip": "Перші обчислення малюка", + "gtceu.machine.hpca.empty_component.tooltip": "Просто для заповнення простору", + "gtceu.machine.hpca.heat_sink_component.tooltip": "Безкоштовне охолодження! хіба щось буває безкоштовним?", + "gtceu.machine.hull.tooltip": "§7Просто проявіть §cу§eя§aв§9у§7, щоб використовувати це", + "gtceu.machine.hv_alloy_smelter.tooltip": "§7Високотехнологічна комбінувальна плавильня сплавів", + "gtceu.machine.hv_arc_furnace.tooltip": "§7Кому взагалі потрібна плавильна піч?", + "gtceu.machine.hv_assembler.tooltip": "§7Месники, збираємось!", + "gtceu.machine.hv_autoclave.tooltip": "§7Кристалізує пил", + "gtceu.machine.hv_bender.tooltip": "§7Фууу, він поганий! Нам потрібен БЕНДЕР!!!", + "gtceu.machine.hv_brewery.tooltip": "§7Компактне та ефективне зіллєваріння", + "gtceu.machine.hv_canner.tooltip": "§7Поміщає речі в контейнери та виймає їх з них", + "gtceu.machine.hv_centrifuge.tooltip": "§7Розподіл молекул", + "gtceu.machine.hv_chemical_bath.tooltip": "§7Розщеплює руди шляхом їх вимочування у хімікатах", + "gtceu.machine.hv_chemical_reactor.tooltip": "§7Дає хімічним речовинам вступати в реакцію між собою", + "gtceu.machine.hv_circuit_assembler.tooltip": "§7Всюдисущий віьзми-поклади", + "gtceu.machine.hv_compressor.tooltip": "§7Компресорно-механічна система C77", + "gtceu.machine.hv_cutter.tooltip": "§7Ріж-крій", + "gtceu.machine.hv_distillery.tooltip": "§7Вилучає найбільш важливі частини рідин", + "gtceu.machine.hv_electric_furnace.tooltip": "§7Не схоже на користування Commodore 64", + "gtceu.machine.hv_electrolyzer.tooltip": "§7Молекулярний електроліз", + "gtceu.machine.hv_electromagnetic_separator.tooltip": "§7Відокремлює магнітні руди від решти", + "gtceu.machine.hv_extractor.tooltip": "§7Соковичавлюючий пристрій приречення - D123", + "gtceu.machine.hv_extruder.tooltip": "§7Універсальна металообробна машина", "gtceu.machine.hv_fermenter.tooltip": "§7Ферментує рідини", - "gtceu.machine.hv_fluid_drilling_rig.tooltip": "Не виконує фрекінг", - "gtceu.machine.hv_fluid_heater.tooltip": "§7Нагріває ваших рідин", - "gtceu.machine.hv_fluid_solidifier.tooltip": "§7Охолоджує рідини до твердих речовин", - "gtceu.machine.hv_forge_hammer.tooltip": "§7Стоп, час молотування!", - "gtceu.machine.hv_forming_press.tooltip": "§7Впечатування зображень у речі", - "gtceu.machine.hv_gas_collector.tooltip": "§7Збирає газ із повітря залежно від розміру", + "gtceu.machine.hv_fluid_drilling_rig.tooltip": "Не проводить гідророзрив пласта", + "gtceu.machine.hv_fluid_heater.tooltip": "§7Нагріває рідини", + "gtceu.machine.hv_fluid_solidifier.tooltip": "§7Охолоджує рідини до твердого стану", + "gtceu.machine.hv_forge_hammer.tooltip": "§7Стоп, час молота!", + "gtceu.machine.hv_forming_press.tooltip": "§7Витискає речам нову форму", + "gtceu.machine.hv_gas_collector.tooltip": "§7Збирає газ з повітря залежно від виміру", "gtceu.machine.hv_laser_engraver.tooltip": "§7Не дивіться прямо на лазер", - "gtceu.machine.hv_lathe.tooltip": "§7Ефективніше виготовляє стрижні", - "gtceu.machine.hv_macerator.tooltip": "§7Подрібнення руди за допомогою побічних продуктів", - "gtceu.machine.hv_mass_fabricator.tooltip": "§7UUM Матерія * виробництво в квадраті", - "gtceu.machine.hv_mixer.tooltip": "§7Чи буде змішуватися?", - "gtceu.machine.hv_ore_washer.tooltip": "§7Отримання більшої кількости побічних продуктів із ваших руд", - "gtceu.machine.hv_packer.tooltip": "§7Розміщує речі в коробках і дістає їх із них", - "gtceu.machine.hv_polarizer.tooltip": "§7Біполяризація ваших магнітів", - "gtceu.machine.hv_replicator.tooltip": "§7Створення найчистіших предметів", - "gtceu.machine.hv_rock_crusher.tooltip": "§7Розмістіть воду та лаву горизонтально поруч", + "gtceu.machine.hv_lathe.tooltip": "§7Ефективніше виробляє стрижні", + "gtceu.machine.hv_macerator.tooltip": "§7Подрібнює руди з побічними продуктами", + "gtceu.machine.hv_mass_fabricator.tooltip": "§7UUM матерія * виробництво в квадраті", + "gtceu.machine.hv_mixer.tooltip": "§7Чи змішається?", + "gtceu.machine.hv_ore_washer.tooltip": "§7Отримує більше побічних продуктів з руд", + "gtceu.machine.hv_packer.tooltip": "§7Запаковує та розпаковує речі", + "gtceu.machine.hv_polarizer.tooltip": "§7Біполяризовує магніти", + "gtceu.machine.hv_replicator.tooltip": "§7Виробляє найчистіші елементи", + "gtceu.machine.hv_rock_crusher.tooltip": "§7Розмістіть поруч горизонтально воду і лаву", "gtceu.machine.hv_scanner.tooltip": "§7Сканує матеріали та інші речі", - "gtceu.machine.hv_sifter.tooltip": "§7Зберігайте спокій і продовжуйте просіювання", - "gtceu.machine.hv_thermal_centrifuge.tooltip": "§7Точніше розділення руд", - "gtceu.machine.hv_wiremill.tooltip": "§7Ефективніше виготовляє дроти", - "gtceu.machine.implosion_compressor.tooltip": "Єдина машина, яку ви бажаєте стискати", - "gtceu.machine.item_bus.export.tooltip": "Предметний вихід для багатоблоків", - "gtceu.machine.item_bus.import.tooltip": "Предметний вхід для багатоблоків", - "gtceu.machine.item_collector.gui.collect_range": "Збирайте в межах %sx%s блоків", + "gtceu.machine.hv_sifter.tooltip": "§7Зберігайте спокій і продовжуйте просіювати", + "gtceu.machine.hv_thermal_centrifuge.tooltip": "§7Точніше розділяє руди", + "gtceu.machine.hv_wiremill.tooltip": "§7Ефективніше виробляє дроти", + "gtceu.machine.implosion_compressor.tooltip": "Єдина машина, з якою хочеться робити бум!", + "gtceu.machine.item_bus.export.tooltip": "Предметний вихід для конструкцій", + "gtceu.machine.item_bus.import.tooltip": "Предметний вхід для конструкцій", + "gtceu.machine.item_collector.gui.collect_range": "Підбір в області %sx%s блоків", "gtceu.machine.item_collector.tooltip": "Збирає предмети навколо себе", - "gtceu.machine.iv_alloy_smelter.tooltip": "§7Топить сплави", - "gtceu.machine.iv_arc_furnace.tooltip": "§7Вихідний нагрівач", + "gtceu.machine.iv_alloy_smelter.tooltip": "§7Інтегратор сплавів", + "gtceu.machine.iv_arc_furnace.tooltip": "§7Розрядний нагрівач", "gtceu.machine.iv_assembler.tooltip": "§7НЕ верстак", "gtceu.machine.iv_autoclave.tooltip": "§7Скороварка", - "gtceu.machine.iv_bender.tooltip": "§7Спотворення форми", - "gtceu.machine.iv_brewery.tooltip": "§7Приготування напоїв", - "gtceu.machine.iv_canner.tooltip": "§7Консервує?", + "gtceu.machine.iv_bender.tooltip": "§7Викривлювач", + "gtceu.machine.iv_brewery.tooltip": "§7Більше ніж варильня", + "gtceu.machine.iv_canner.tooltip": "§7Консервний оператор", "gtceu.machine.iv_centrifuge.tooltip": "§7Молекулярний циклон", - "gtceu.machine.iv_chemical_bath.tooltip": "§7Хімічний розчин", - "gtceu.machine.iv_chemical_reactor.tooltip": "§7Хімічний виконавець", + "gtceu.machine.iv_chemical_bath.tooltip": "§7Хімічний розчинник", + "gtceu.machine.iv_chemical_reactor.tooltip": "§7Хімічний перетворювач", "gtceu.machine.iv_circuit_assembler.tooltip": "§7Виробник електроніки", - "gtceu.machine.iv_compressor.tooltip": "§7Конденсатор сингулярности", - "gtceu.machine.iv_cutter.tooltip": "§7Ріже матерію", - "gtceu.machine.iv_distillery.tooltip": "§7Розділювач конденсації", - "gtceu.machine.iv_electric_furnace.tooltip": "§7Процесор електронного збудження", + "gtceu.machine.iv_compressor.tooltip": "§7Конденсатор сингулярності", + "gtceu.machine.iv_cutter.tooltip": "§7Розсікач предметів", + "gtceu.machine.iv_distillery.tooltip": "§7Сепаратор конденсату", + "gtceu.machine.iv_electric_furnace.tooltip": "§7Механізм електронного збудження", "gtceu.machine.iv_electrolyzer.tooltip": "§7Молекулярний дезінтегратор E-4906", - "gtceu.machine.iv_electromagnetic_separator.tooltip": "§7ЕМ-категоризатор", + "gtceu.machine.iv_electromagnetic_separator.tooltip": "§7Електромагнітний категоризатор", "gtceu.machine.iv_extractor.tooltip": "§7Вакуумний екстрактор", - "gtceu.machine.iv_extruder.tooltip": "§7Витіснювач матеріалу", + "gtceu.machine.iv_extruder.tooltip": "§7Витіснювач матеріалів", "gtceu.machine.iv_fermenter.tooltip": "§7Прискорювач ферментації", - "gtceu.machine.iv_fluid_heater.tooltip": "§7Нагрівач рідини", + "gtceu.machine.iv_fluid_heater.tooltip": "§7Тепловий інфузор", "gtceu.machine.iv_fluid_solidifier.tooltip": "§7Не льодогенератор", - "gtceu.machine.iv_forge_hammer.tooltip": "§7Коваль пластин", - "gtceu.machine.iv_forming_press.tooltip": "§7Об'єктний шар", - "gtceu.machine.iv_gas_collector.tooltip": "§7Збирає газ з атмосфери залежно від розміру", - "gtceu.machine.iv_laser_engraver.tooltip": "§7Потужністю 2,04 МВт", - "gtceu.machine.iv_lathe.tooltip": "§7Ефективніше виготовляє стрижні", - "gtceu.machine.iv_macerator.tooltip": "§7Подрібнення ваших руд", + "gtceu.machine.iv_forge_hammer.tooltip": "§7Плитопідроблювач", + "gtceu.machine.iv_forming_press.tooltip": "§7Предметний нашаровувач", + "gtceu.machine.iv_gas_collector.tooltip": "§7Збирає газ з атмосфери залежно від виміру", + "gtceu.machine.iv_laser_engraver.tooltip": "§7Із силою 2.04 MW", + "gtceu.machine.iv_lathe.tooltip": "§7Поворотно-відкидна машина L-5906", + "gtceu.machine.iv_macerator.tooltip": "§7Блендоматор 9001", "gtceu.machine.iv_mass_fabricator.tooltip": "§7Фабрика буття", - "gtceu.machine.iv_mixer.tooltip": "§7Організатор матеріалів", - "gtceu.machine.iv_ore_washer.tooltip": "§7Перероблена пральна машина I-360", - "gtceu.machine.iv_packer.tooltip": "§7Коробкувальник", - "gtceu.machine.iv_polarizer.tooltip": "§7Індуктор магнетизму", - "gtceu.machine.iv_replicator.tooltip": "§7Скопіювати-вставити", - "gtceu.machine.iv_rock_crusher.tooltip": "§7Отверджувач кріогенної магми R-8200", + "gtceu.machine.iv_mixer.tooltip": "§7Органайзер матерії", + "gtceu.machine.iv_ore_washer.tooltip": "§7Переобладнана пральна машина I-360", + "gtceu.machine.iv_packer.tooltip": "§7Коробкар", + "gtceu.machine.iv_polarizer.tooltip": "§7Індуктор магнітного поля", + "gtceu.machine.iv_replicator.tooltip": "§7Матеріальний Ctrl+V", + "gtceu.machine.iv_rock_crusher.tooltip": "§7Кріогенний затверджувач магми R-8200", "gtceu.machine.iv_scanner.tooltip": "§7Детектор аномалій", - "gtceu.machine.iv_sifter.tooltip": "§7Спонсовано TFC", - "gtceu.machine.iv_thermal_centrifuge.tooltip": "§7Обертальна піч T-6350", - "gtceu.machine.iv_wiremill.tooltip": "§7Розкатує злитки", - "gtceu.machine.big_boiler.bronze.tooltip": "Нам потрібно більше пари!", - "gtceu.machine.large_boiler.steel.tooltip": "Вуглезбагачувач", + "gtceu.machine.iv_sifter.tooltip": "§7За підтримки TFC", + "gtceu.machine.iv_thermal_centrifuge.tooltip": "§7Потогонник пломенів T-6350", + "gtceu.machine.iv_wiremill.tooltip": "§7Подовжувач злитків", + "gtceu.machine.large_boiler.bronze.tooltip": "Нам потрібно більше пари!", + "gtceu.machine.large_boiler.steel.tooltip": "Вуглезбагачувальна піч", "gtceu.machine.large_boiler.titanium.tooltip": "Де чарівне суперпаливо?", - "gtceu.machine.large_boiler.tungstensteel.tooltip": "Як ви взагалі заправляєте цю річ?", - "gtceu.machine.large_chemical_reactor.tooltip": "Реактор чорної скриньки", + "gtceu.machine.large_boiler.tungstensteel.tooltip": "Як ви взагалі заправляєте цю штуку?", + "gtceu.machine.large_chemical_reactor.tooltip": "Реактор «Чорний ящик»", "gtceu.machine.large_combustion_engine.tooltip": "Камера запалювання палива", - "gtceu.machine.large_combustion_engine.tooltip.boost_extreme": "Подача §f80 мВ/с§7 рідкого кисню для виробництва до §f%s EU/т§7 при споживанні палива §f2x§7.", - "gtceu.machine.large_combustion_engine.tooltip.boost_regular": "Подача §f20 мВ/с§7 кисню для виробництва до §f%s EU/т§7 при споживанні палива §f2x§7.", + "gtceu.machine.large_combustion_engine.tooltip.boost_extreme": "§7Подавайте§f 80 мВ/с§7 рідкого кисню для виробництва до§f %s EU/т§7 при витраті§f 2x§7 палива.", + "gtceu.machine.large_combustion_engine.tooltip.boost_regular": "§7Подавайте§f 20 мВ/с§7 кисню для виробництва до§f %s EU/т§7 при витраті§f 2x§7 палива.", "gtceu.machine.large_miner.ev.tooltip": "Копає руду замість вас", "gtceu.machine.large_miner.iv.tooltip": "Біомний екскаватор", "gtceu.machine.large_miner.luv.tooltip": "Земний комбайн", "gtceu.machine.large_turbine.gas.tooltip": "Не реактивний двигун", "gtceu.machine.large_turbine.plasma.tooltip": "Сифон плазмової енергії", - "gtceu.machine.large_turbine.steam.tooltip": "Не засовуйте туди голову", - "gtceu.machine.laser_hatch.both.tooltip": "§cЛазерні кабелі мають бути на прямій лінії!§7", - "gtceu.machine.laser_hatch.source.tooltip": "§7Передача потужности на відстань", - "gtceu.machine.laser_hatch.target.tooltip": "§7Отримання енергії на відстані", - "gtceu.machine.laser_source_hatch.tooltip.0": "Потужність передачі на відстань", - "gtceu.machine.laser_source_hatch.tooltip.1": "§cЛазерні кабелі мають бути на прямій лінії!§7", - "gtceu.machine.laser_target_hatch.tooltip.0": "Отримання енергії на відстані", - "gtceu.machine.laser_target_hatch.tooltip.1": "§cЛазерні кабелі мають бути на прямій лінії!§7", + "gtceu.machine.large_turbine.steam.tooltip": "Не пхайте туди голову", + "gtceu.machine.laser_hatch.both.tooltip": "§cЛазерні кабелі повинні бути розміщені по прямій лінії!§7", + "gtceu.machine.laser_hatch.source.tooltip": "§7Передає енергію на відстані", + "gtceu.machine.laser_hatch.target.tooltip": "§7Отримує енергію на відстані", + "gtceu.machine.laser_source_hatch.tooltip.0": "Передача живлення на відстані", + "gtceu.machine.laser_source_hatch.tooltip.1": "§cЛазерні кабелі повинні бути розміщені по прямій лінії!§7", + "gtceu.machine.laser_target_hatch.tooltip.0": "Отримання живлення на відстані", + "gtceu.machine.laser_target_hatch.tooltip.1": "§cЛазерні кабелі повинні бути розміщені по прямій лінії!§7", "gtceu.machine.locked_safe.malfunctioning": "§cНесправність!", - "gtceu.machine.locked_safe.requirements": "§7Потрібні заміни:", - "gtceu.machine.lp_steam_alloy_smelter.tooltip": "§7Комбінована топильна установка", + "gtceu.machine.locked_safe.requirements": "§7Необхідні замінники:", + "gtceu.machine.lp_steam_alloy_smelter.tooltip": "§7Комбінувальна плавильня сплавів", "gtceu.machine.lp_steam_compressor.tooltip": "§7Стискає предмети", - "gtceu.machine.lp_steam_extractor.tooltip": "§7Видобуток вашого першого каучуку", - "gtceu.machine.lp_steam_forge_hammer.tooltip": "§7Молот каваля", - "gtceu.machine.lp_steam_furnace.tooltip": "§7Топлення речей стисненим паром", - "gtceu.machine.lp_steam_liquid_boiler.tooltip": "§7З котла витікає рідина", - "gtceu.machine.lp_steam_macerator.tooltip": "§7Подрібнення ваших руд", - "gtceu.machine.lp_steam_rock_crusher.tooltip": "§7Розмістіть воду та лаву горизонтально поруч", - "gtceu.machine.lp_steam_solar_boiler.tooltip": "§7Парова сила від сонця", - "gtceu.machine.lp_steam_solid_boiler.tooltip": "§7Перший спосіб отримати парову тягу", + "gtceu.machine.lp_steam_extractor.tooltip": "§7Добувач першої глини", + "gtceu.machine.lp_steam_forge_hammer.tooltip": "§7Ковальський молот", + "gtceu.machine.lp_steam_furnace.tooltip": "§7Плавить речі за допомогою стисненої пари", + "gtceu.machine.lp_steam_liquid_boiler.tooltip": "§7Котел, що працює на рідині", + "gtceu.machine.lp_steam_macerator.tooltip": "§7Подрібнює руди без побічних продуктів", + "gtceu.machine.lp_steam_rock_crusher.tooltip": "§7Розмістіть поруч горизонтально воду і лаву", + "gtceu.machine.lp_steam_solar_boiler.tooltip": "§7Парова енергія від сонця", + "gtceu.machine.lp_steam_solid_boiler.tooltip": "§7Ранній спосіб отримати парову енергію", "gtceu.machine.luv_alloy_smelter.tooltip": "§7Інтегратор сплавів", - "gtceu.machine.luv_arc_furnace.tooltip": "§7Вихідний нагрівач", + "gtceu.machine.luv_arc_furnace.tooltip": "§7Розрядний нагрівач", "gtceu.machine.luv_assembler.tooltip": "§7НЕ верстак", "gtceu.machine.luv_autoclave.tooltip": "§7Скороварка", - "gtceu.machine.luv_bender.tooltip": "§7Спотворення форми", - "gtceu.machine.luv_brewery.tooltip": "§7Приготування напоїв", - "gtceu.machine.luv_canner.tooltip": "§7Оператор консервування", + "gtceu.machine.luv_bender.tooltip": "§7Викривлювач", + "gtceu.machine.luv_brewery.tooltip": "§7Більше ніж варильня", + "gtceu.machine.luv_canner.tooltip": "§7Консервний оператор", "gtceu.machine.luv_centrifuge.tooltip": "§7Молекулярний циклон", - "gtceu.machine.luv_chemical_bath.tooltip": "§7Хімічний розчин", - "gtceu.machine.luv_chemical_reactor.tooltip": "§7Хімічний виконавець", + "gtceu.machine.luv_chemical_bath.tooltip": "§7Хімічний розчинник", + "gtceu.machine.luv_chemical_reactor.tooltip": "§7Хімічний перетворювач", "gtceu.machine.luv_circuit_assembler.tooltip": "§7Виробник електроніки", - "gtceu.machine.luv_compressor.tooltip": "§7Конденсатор сингулярности", - "gtceu.machine.luv_cutter.tooltip": "§7Косувач матерії", - "gtceu.machine.luv_distillery.tooltip": "§7Сепаратор конденсації", - "gtceu.machine.luv_electric_furnace.tooltip": "§7Електронний процесор збудження", + "gtceu.machine.luv_compressor.tooltip": "§7Конденсатор сингулярності", + "gtceu.machine.luv_cutter.tooltip": "§7Розсікач предметів", + "gtceu.machine.luv_distillery.tooltip": "§7Сепаратор конденсату", + "gtceu.machine.luv_electric_furnace.tooltip": "§7Механізм електронного збудження", "gtceu.machine.luv_electrolyzer.tooltip": "§7Молекулярний дезінтегратор E-4907", "gtceu.machine.luv_electromagnetic_separator.tooltip": "§7Електромагнітний категоризатор", "gtceu.machine.luv_extractor.tooltip": "§7Вакуумний екстрактор", - "gtceu.machine.luv_extruder.tooltip": "§7Витіснювач матеріалу", - "gtceu.machine.luv_fermenter.tooltip": "§7Прискорювач бродіння", - "gtceu.machine.luv_fluid_heater.tooltip": "§7Нагрівач", + "gtceu.machine.luv_extruder.tooltip": "§7Витіснювач матеріалів", + "gtceu.machine.luv_fermenter.tooltip": "§7Прискорювач ферментації", + "gtceu.machine.luv_fluid_heater.tooltip": "§7Тепловий інфузор", "gtceu.machine.luv_fluid_solidifier.tooltip": "§7Не льодогенератор", - "gtceu.machine.luv_forge_hammer.tooltip": "§7Кувальник пластин", - "gtceu.machine.luv_forming_press.tooltip": "§7Об'єктний шар", - "gtceu.machine.luv_gas_collector.tooltip": "§7Збирає газ з атмосфери залежно від розміру", - "gtceu.machine.luv_laser_engraver.tooltip": "§7З потужністю 8,16 МВт", - "gtceu.machine.luv_lathe.tooltip": "§7Ефективніше виготовляє стрижні", - "gtceu.machine.luv_macerator.tooltip": "§7Подрібнення ваших руд2", + "gtceu.machine.luv_forge_hammer.tooltip": "§7Плитопідроблювач", + "gtceu.machine.luv_forming_press.tooltip": "§7Предметний нашаровувач", + "gtceu.machine.luv_gas_collector.tooltip": "§7Збирає газ з атмосфери залежно від виміру", + "gtceu.machine.luv_laser_engraver.tooltip": "§7Із силою 8.16 MW", + "gtceu.machine.luv_lathe.tooltip": "§7Поворотно-відкидна машина L-5907", + "gtceu.machine.luv_macerator.tooltip": "§7Блендоматор 9002", "gtceu.machine.luv_mass_fabricator.tooltip": "§7Фабрика буття", - "gtceu.machine.luv_mixer.tooltip": "§7Організатор матеріалів", - "gtceu.machine.luv_ore_washer.tooltip": "§7Перероблена пральна машина I-361", - "gtceu.machine.luv_packer.tooltip": "§7Коробкувальник", - "gtceu.machine.luv_polarizer.tooltip": "§7Індуктор магнетизму", - "gtceu.machine.luv_replicator.tooltip": "§7Скопіювати-вставити", - "gtceu.machine.luv_rock_crusher.tooltip": "§7Отверджувач кріогенної магми R-9200", + "gtceu.machine.luv_mixer.tooltip": "§7Органайзер матерії", + "gtceu.machine.luv_ore_washer.tooltip": "§7Переобладнана пральна машина I-361", + "gtceu.machine.luv_packer.tooltip": "§7Коробкар", + "gtceu.machine.luv_polarizer.tooltip": "§7Індуктор магнітного поля", + "gtceu.machine.luv_replicator.tooltip": "§7Матеріальний Ctrl+V", + "gtceu.machine.luv_rock_crusher.tooltip": "§7Кріогенний затверджувач магми R-9200", "gtceu.machine.luv_scanner.tooltip": "§7Детектор аномалій", - "gtceu.machine.luv_sifter.tooltip": "§7Спонсовано TFC", - "gtceu.machine.luv_thermal_centrifuge.tooltip": "§7Обертальний пломенева піч T-6351", - "gtceu.machine.luv_wiremill.tooltip": "§7Розкатує злитки", - "gtceu.machine.lv_alloy_smelter.tooltip": "§7Високотехнологічний комбінований топильник", - "gtceu.machine.lv_arc_furnace.tooltip": "§7Кому потрібна доменна піч?", - "gtceu.machine.lv_assembler.tooltip": "§7Збирання-майстрування!", - "gtceu.machine.lv_autoclave.tooltip": "§7Кристалізація вашого пилу", - "gtceu.machine.lv_bender.tooltip": "§7Бу, він поганий! Ми хочемо БЕНДЕРА!!!", - "gtceu.machine.lv_brewery.tooltip": "§7Компактне та ефективне приготування зілля", - "gtceu.machine.lv_canner.tooltip": "§7Розміщує речі в умістищах і виймає їх з них", - "gtceu.machine.lv_centrifuge.tooltip": "§7Розділення молекул", - "gtceu.machine.lv_chemical_bath.tooltip": "§7Розмивання руд у хімікатах для їх розділення", - "gtceu.machine.lv_chemical_reactor.tooltip": "§7Дозволити хімічним речовинам реагувати одна з одною", - "gtceu.machine.lv_circuit_assembler.tooltip": "§7Збирає схеми", - "gtceu.machine.lv_compressor.tooltip": "§7Стискає предмети", - "gtceu.machine.lv_cutter.tooltip": "§7Розрізає та подрібнює", - "gtceu.machine.lv_distillery.tooltip": "§7Вилучає найдоречніші частини рідин", - "gtceu.machine.lv_electric_furnace.tooltip": "§7Не схоже на використання Commodore 64", - "gtceu.machine.lv_electrolyzer.tooltip": "§7Електроліз молекул", - "gtceu.machine.lv_electromagnetic_separator.tooltip": "§7Відділяємагнітних руд від решти", - "gtceu.machine.lv_extractor.tooltip": "§7Очищувач соку — Пристрій приречености — D123", - "gtceu.machine.lv_extruder.tooltip": "§7Універсальна машина для обробки металу", + "gtceu.machine.luv_sifter.tooltip": "§7За підтримки TFC", + "gtceu.machine.luv_thermal_centrifuge.tooltip": "§7Потогонник пломенів T-6351", + "gtceu.machine.luv_wiremill.tooltip": "§7Подовжувач злитків", + "gtceu.machine.lv_alloy_smelter.tooltip": "§7Високотехнологічна комбінувальна плавильня сплавів", + "gtceu.machine.lv_arc_furnace.tooltip": "§7Кому взагалі потрібна плавильна піч?", + "gtceu.machine.lv_assembler.tooltip": "§7Месники, збираємось!", + "gtceu.machine.lv_autoclave.tooltip": "§7Кристалізує пил", + "gtceu.machine.lv_bender.tooltip": "§7Фууу, він поганий! Нам потрібен БЕНДЕР!!!", + "gtceu.machine.lv_brewery.tooltip": "§7Компактне та ефективне зіллєваріння", + "gtceu.machine.lv_canner.tooltip": "§7Поміщає речі в контейнери та виймає їх з них", + "gtceu.machine.lv_centrifuge.tooltip": "§7Розподіл молекул", + "gtceu.machine.lv_chemical_bath.tooltip": "§7Розщеплює руди шляхом їх вимочування у хімікатах", + "gtceu.machine.lv_chemical_reactor.tooltip": "§7Дає хімічним речовинам вступати в реакцію між собою", + "gtceu.machine.lv_circuit_assembler.tooltip": "§7Всюдисущий віьзми-поклади", + "gtceu.machine.lv_compressor.tooltip": "§7Компресорно-механічна система C77", + "gtceu.machine.lv_cutter.tooltip": "§7Криворіж", + "gtceu.machine.lv_distillery.tooltip": "§7Вилучає найбільш важливі частини рідин", + "gtceu.machine.lv_electric_furnace.tooltip": "§7Не схоже на користування Commodore 64", + "gtceu.machine.lv_electrolyzer.tooltip": "§7Молекулярний електроліз", + "gtceu.machine.lv_electromagnetic_separator.tooltip": "§7Відокремлює магнітні руди від решти", + "gtceu.machine.lv_extractor.tooltip": "§7Соковичавлюючий пристрій приречення - D123", + "gtceu.machine.lv_extruder.tooltip": "§7Універсальна металообробна машина", "gtceu.machine.lv_fermenter.tooltip": "§7Ферментує рідини", - "gtceu.machine.lv_fluid_heater.tooltip": "§7Нагріває ваші рідини", - "gtceu.machine.lv_fluid_solidifier.tooltip": "§7Охолоджує рідини до твердих речовин", - "gtceu.machine.lv_forge_hammer.tooltip": "§7Стоп, час молотування!", - "gtceu.machine.lv_forming_press.tooltip": "§7Надрукує зображень на речах", - "gtceu.machine.lv_gas_collector.tooltip": "§7Збирає газ із повітря залежно від розміру", + "gtceu.machine.lv_fluid_heater.tooltip": "§7Нагріває рідини", + "gtceu.machine.lv_fluid_solidifier.tooltip": "§7Охолоджує рідини до твердого стану", + "gtceu.machine.lv_forge_hammer.tooltip": "§7Стоп, час молота!", + "gtceu.machine.lv_forming_press.tooltip": "§7Витискає речам нову форму", + "gtceu.machine.lv_gas_collector.tooltip": "§7Збирає газ з повітря залежно від виміру", "gtceu.machine.lv_laser_engraver.tooltip": "§7Не дивіться прямо на лазер", - "gtceu.machine.lv_lathe.tooltip": "§7Ефективніше виготовляє стрижні", - "gtceu.machine.lv_macerator.tooltip": "§7Подрібнення руд без побічних продуктів", - "gtceu.machine.lv_mass_fabricator.tooltip": "§7UUM Матерія * виробництво в квадраті", - "gtceu.machine.lv_mixer.tooltip": "§7Змішує?", - "gtceu.machine.lv_ore_washer.tooltip": "§7Отримання більше побічних продуктів із ваших руд", - "gtceu.machine.lv_packer.tooltip": "§7Розміщує речі в коробках і дістає їх із них", - "gtceu.machine.lv_polarizer.tooltip": "§7Біполяризація ваших магнітів", - "gtceu.machine.lv_replicator.tooltip": "§7Створення найчистіших предметів", - "gtceu.machine.lv_rock_crusher.tooltip": "§7Розмістіть воду та лаву горизонтально поруч", + "gtceu.machine.lv_lathe.tooltip": "§7Ефективніше виробляє стрижні", + "gtceu.machine.lv_macerator.tooltip": "§7Подрібнює руди без побічних продуктів", + "gtceu.machine.lv_mass_fabricator.tooltip": "§7UUM матерія * виробництво в квадраті", + "gtceu.machine.lv_mixer.tooltip": "§7Чи змішається?", + "gtceu.machine.lv_ore_washer.tooltip": "§7Отримує більше побічних продуктів з руд", + "gtceu.machine.lv_packer.tooltip": "§7Запаковує та розпаковує речі", + "gtceu.machine.lv_polarizer.tooltip": "§7Біполяризовує магніти", + "gtceu.machine.lv_replicator.tooltip": "§7Виробляє найчистіші елементи", + "gtceu.machine.lv_rock_crusher.tooltip": "§7Розмістіть поруч горизонтально воду і лаву", "gtceu.machine.lv_scanner.tooltip": "§7Сканує матеріали та інші речі", - "gtceu.machine.lv_sifter.tooltip": "§7Зберігайте спокій і продовжуйте просіювання", - "gtceu.machine.lv_thermal_centrifuge.tooltip": "§7 Точніше розділення руд", - "gtceu.machine.lv_wiremill.tooltip": "§7Ефективніше виготовляє дроти", + "gtceu.machine.lv_sifter.tooltip": "§7Зберігайте спокій і продовжуйте просіювати", + "gtceu.machine.lv_thermal_centrifuge.tooltip": "§7Точніше розділяє руди", + "gtceu.machine.lv_wiremill.tooltip": "§7Ефективніше виробляє дроти", "gtceu.machine.machine_hatch.locked": "Інтерфейс машини заблоковано", - "gtceu.machine.machine_hatch.processing_array": "§eМасив§7 містить лише машини, які працюють у §eмасиві", - "gtceu.machine.machine_hatch.tooltip": "Спеціалізована шина доступу, яка містить лише дійсні предмети", - "gtceu.machine.maintenance_hatch.tooltip": "Для підтримки багатоблоків", - "gtceu.machine.maintenance_hatch_cleanroom_auto.tooltip.0": "Для автоматичного обслуговування багатоблоків із очищенням!", + "gtceu.machine.machine_hatch.processing_array": "Коли в§e конвеєрній лінії§7, утримує тільки машини, які працюють в§e обробчій лінії", + "gtceu.machine.machine_hatch.tooltip": "Спеціалізована шина доступу, яка утримує тільки дійсні предмети", + "gtceu.machine.maintenance_hatch.tooltip": "Для обслуговування конструкцій", + "gtceu.machine.maintenance_hatch_cleanroom_auto.tooltip.0": "Для автоматичного догляду за конструкціями з очищенням!", "gtceu.machine.maintenance_hatch_cleanroom_auto.tooltip.1": "Очищає як:", - "gtceu.machine.maintenance_hatch_configurable.tooltip.0": "Для кращого контролю над багатоблоками", - "gtceu.machine.maintenance_hatch_configurable.tooltip.1": "Запускається без проблем з обслуговуванням!", - "gtceu.machine.maintenance_hatch_full_auto.tooltip": "Для автоматичної підтримки багатоблоків", - "gtceu.machine.maintenance_hatch_tape_slot.tooltip": "Вставте ізоляційну стрічку, щоб уникнути проблем", - "gtceu.machine.maintenance_hatch_tool_slot.tooltip": "Натисніть слот порожньою рукою, коли необхідні інструменти є в інвентарі для вирішення проблем", - "gtceu.machine.me.copy_paste.tooltip": "ПКМ флешкою, щоб скопіювати налаштування, ПКМ, щоб застосувати", - "gtceu.machine.me.export.tooltip": "Має необмежену місткість перед приєднаним до мережі ME.", - "gtceu.machine.me.fluid_export.tooltip": "Зберігає рідини безпосередньо в мережі ME.", - "gtceu.machine.me.fluid_import.data_stick.name": "§oME вхідний роз'єм даних налаштувань", - "gtceu.machine.me.fluid_import.tooltip": "Автоматично отримує рідини з мережі ME.", - "gtceu.machine.me.import_copy_settings": "Збережені налаштування на флешку", - "gtceu.machine.me.import_paste_settings": "Застосовані налаштування з флешки", - "gtceu.machine.me.item_export.tooltip": "Зберігає предмети безпосередньо в мережі ME.", - "gtceu.machine.me.item_import.data_stick.name": "§oME вхідна шина даних налаштувань", - "gtceu.machine.me.item_import.tooltip": "Автоматично отримує предмети з мережі ME.", - "gtceu.machine.me.stocking_auto_pull_disabled": "Автовитягування вимкнено", - "gtceu.machine.me.stocking_auto_pull_enabled": "Автовитягування увімкнено", - "gtceu.machine.me.stocking_fluid.tooltip.0": "Отримує рідини безпосередньо з мережі ME", - "gtceu.machine.me.stocking_fluid.tooltip.1": "Режим автовитягування з ME автоматично заповнює перші 16 рідин у системі ME, оновлюючись кожні 5 секунд.", - "gtceu.machine.me.stocking_item.tooltip.0": "Отримує предмети безпосередньо з мережі ME", - "gtceu.machine.me.stocking_item.tooltip.1": "Режим автовитягування з ME автоматично завантажить перші 16 предметів у систему ME, оновлюючись кожні 5 секунд.", - "gtceu.machine.me_import_fluid_hatch.configs.tooltip": "Зберігає 16 типів рідин на складі", - "gtceu.machine.me_import_item_hatch.configs.tooltip": "Зберігає 16 типів предметів на складі", - "gtceu.machine.miner.chunkradius": "Радіус блока: %d", - "gtceu.machine.miner.fluid_usage": "Використовує §f%d мВ/т §7 з §f%s§7, подвоюється за розгін.", + "gtceu.machine.maintenance_hatch_configurable.tooltip.0": "Для кращого контролю над конструкціями", + "gtceu.machine.maintenance_hatch_configurable.tooltip.1": "Починає роботу без проблем з обслуговуванням!", + "gtceu.machine.maintenance_hatch_full_auto.tooltip": "Для автоматичного догляду за конструкціями", + "gtceu.machine.maintenance_hatch_tape_slot.tooltip": "Вставте клейку стрічку, щоб запобігти проблемам", + "gtceu.machine.maintenance_hatch_tool_slot.tooltip": "Клацніть гніздо порожньою рукою, коли потрібні інструменти є в інвентарі, щоб вирішити проблему", + "gtceu.machine.me.copy_paste.tooltip": "ЛКМ із карткою даних, щоб скопіювати налаштування, ПКМ, щоб застосувати", + "gtceu.machine.me.export.tooltip": "Має необмежену місткість до підключення до МЕ-мережі.", + "gtceu.machine.me.fluid_export.tooltip": "Зберігає рідини безпосередньо в МЕ-мережу.", + "gtceu.machine.me.fluid_import.data_stick.name": "§oКонфігураційні дані ME-вхідного люка", + "gtceu.machine.me.fluid_import.tooltip": "Автоматично забирає рідини з МЕ-мережі.", + "gtceu.machine.me.import_copy_settings": "Налаштування збережені у картці даних", + "gtceu.machine.me.import_paste_settings": "Застосовані налаштування з картки даних", + "gtceu.machine.me.item_export.tooltip": "Зберігає предмети безпосередньо в МЕ-мережу.", + "gtceu.machine.me.item_import.data_stick.name": "§oКонфігураційні дані ME-вхідної шини", + "gtceu.machine.me.item_import.tooltip": "Автоматично забирає предмети з МЕ-мережі.", + "gtceu.machine.me.stocking_auto_pull_disabled": "Автовитягання вимкнено", + "gtceu.machine.me.stocking_auto_pull_enabled": "Автовитягання увімкнено", + "gtceu.machine.me.stocking_fluid.tooltip.0": "Отримує рідини безпосередньо з МЕ-мережі", + "gtceu.machine.me.stocking_fluid.tooltip.1": "Режим автовитягання з МЕ автоматично заповнить перші 16 рідин у ME-системі, оновлюючись кожні 5 секунд.", + "gtceu.machine.me.stocking_item.tooltip.0": "Отримує предмети безпосередньо з МЕ-мережі", + "gtceu.machine.me.stocking_item.tooltip.1": "Режим автовитягання з МЕ автоматично заповнить перші 16 предметів у ME-системі, оновлюючись кожні 5 секунд.", + "gtceu.machine.me_import_fluid_hatch.configs.tooltip": "Зберігає в наявності 16 типів рідин", + "gtceu.machine.me_import_item_hatch.configs.tooltip": "Зберігає в наявності 16 типів предметів", + "gtceu.machine.miner.chunkradius": "Радіус чанків: %d", + "gtceu.machine.miner.fluid_usage": "Використовує§f %d мВ/т§7 §f %s§7, подвоюється при розгоні.", "gtceu.machine.miner.minex": "mX: %d", "gtceu.machine.miner.miney": "mY: %d", "gtceu.machine.miner.minez": "mZ: %d", - "gtceu.machine.miner.multi.description": "Багатоблочна гірнича машина, яка охоплює велику територію та виробляє величезну кількість руди.", - "gtceu.machine.miner.multi.modes": "Має режими шовкового дотику і вирівнювання чанку.", - "gtceu.machine.miner.multi.production": "Виробляє §f3x§7 більше подрібненої руди, ніж §fподрібнювач§7.", - "gtceu.machine.miner.per_block": "§7займає §f%dс§7 на блок", + "gtceu.machine.miner.multi.description": "Багатоблочний видобувний комбайн, який охоплює велику площу і видобуває величезну кількість руди.", + "gtceu.machine.miner.multi.modes": "Має режими вирівнювання по чанку та шовкового дотику.", + "gtceu.machine.miner.multi.production": "Виробляє в§f 3§7 рази більше руди, ніж§f дробарка§7.", + "gtceu.machine.miner.per_block": "§7забирає§f %ds§7 за блок", "gtceu.machine.miner.progress": "Прогрес: %d/%d", "gtceu.machine.miner.radius": "Радіус: %d", "gtceu.machine.miner.startx": "sX: %d", "gtceu.machine.miner.starty": "sY: %d", "gtceu.machine.miner.startz": "sZ: %d", - "gtceu.machine.miner.tooltip": "§7Видобуває руди нижче добувника! Починається як зона §f%sx%s§7", - "gtceu.machine.muffle.off": "Звук машини: увімкнено", - "gtceu.machine.muffle.on": "Звук машини: вимкнено", - "gtceu.machine.muffler_hatch.tooltip.0": "Відновлює відходи машин", - "gtceu.machine.muffler_hatch.tooltip.1": "НЕ БЛОКУЙТЕ ВИХІД!", - "gtceu.machine.multi_furnace.tooltip": "Як духовка вдома", - "gtceu.machine.multiblock.tank.tooltip": "Наповніть і злийте через контролер або клапани бака", - "gtceu.machine.mv_alloy_smelter.tooltip": "§7Високотехнологічний комбінований топильник", - "gtceu.machine.mv_arc_furnace.tooltip": "§7Кому потрібна доменна піч?", - "gtceu.machine.mv_assembler.tooltip": "§7Збирання-майстрування!", - "gtceu.machine.mv_autoclave.tooltip": "§7Кристалізація вашого пилу", - "gtceu.machine.mv_bender.tooltip": "§7Бу, він поганий! Ми хочемо БЕНДЕРА!!!", - "gtceu.machine.mv_brewery.tooltip": "§7Компактне та ефективне приготування зілля", - "gtceu.machine.mv_canner.tooltip": "§7Розміщує речі в та з умістищ", - "gtceu.machine.mv_centrifuge.tooltip": "§7Розділення молекул", - "gtceu.machine.mv_chemical_bath.tooltip": "§7Розмивання руд у хімікатах", - "gtceu.machine.mv_chemical_reactor.tooltip": "§7Дозволяє хімікатам реагувати один з одним", - "gtceu.machine.mv_circuit_assembler.tooltip": "§7Збирає схеми", - "gtceu.machine.mv_compressor.tooltip": "§7Cтискає предмети", - "gtceu.machine.mv_cutter.tooltip": "§7Ріже на пиляє", - "gtceu.machine.mv_distillery.tooltip": "§7Вилучає найдоречніші частини ріди", - "gtceu.machine.mv_electric_furnace.tooltip": "§7Не схоже на використання Commodore 64", - "gtceu.machine.mv_electrolyzer.tooltip": "§7Електроліз молекул", - "gtceu.machine.mv_electromagnetic_separator.tooltip": "§7Відокремлення магнітних руд від решти", - "gtceu.machine.mv_extractor.tooltip": "§7Очищувач соку — Пристрій приречености — D123", - "gtceu.machine.mv_extruder.tooltip": "§7Універсальна машина для обробки металу", + "gtceu.machine.miner.tooltip": "§7Добуває руди під шахтами! починає з зони§f %sx%s§7 ", + "gtceu.machine.muffle.off": "Приглушення звуку: вимкнено", + "gtceu.machine.muffle.on": "Приглушення звуку: Увімкнено", + "gtceu.machine.muffler_hatch.tooltip.0": "Утилізує відходи з машин", + "gtceu.machine.muffler_hatch.tooltip.1": "НЕ ПЕРЕКРИВАЙТЕ ВИХІД!", + "gtceu.machine.multi_furnace.tooltip": "Як у домашній духовці", + "gtceu.machine.multiblock.tank.tooltip": "Заправляйте та зливайте через контролер або клапани бака.", + "gtceu.machine.mv_alloy_smelter.tooltip": "§7Високотехнологічна комбінувальна плавильня сплавів", + "gtceu.machine.mv_arc_furnace.tooltip": "§7Кому взагалі потрібна плавильна піч?", + "gtceu.machine.mv_assembler.tooltip": "§7Месники, збираємось!", + "gtceu.machine.mv_autoclave.tooltip": "§7Кристалізує пил", + "gtceu.machine.mv_bender.tooltip": "§7Фууу, він поганий! Нам потрібен БЕНДЕР!!!", + "gtceu.machine.mv_brewery.tooltip": "§7Компактне та ефективне зіллєваріння", + "gtceu.machine.mv_canner.tooltip": "§7Поміщає речі в контейнери та виймає їх з них", + "gtceu.machine.mv_centrifuge.tooltip": "§7Розподіл молекул", + "gtceu.machine.mv_chemical_bath.tooltip": "§7Розщеплює руди шляхом їх вимочування у хімікатах", + "gtceu.machine.mv_chemical_reactor.tooltip": "§7Дає хімічним речовинам вступати в реакцію між собою", + "gtceu.machine.mv_circuit_assembler.tooltip": "§7Всюдисущий віьзми-поклади", + "gtceu.machine.mv_compressor.tooltip": "§7Компресорно-механічна система C77", + "gtceu.machine.mv_cutter.tooltip": "§7Ріж-крій", + "gtceu.machine.mv_distillery.tooltip": "§7Вилучає найбільш важливі частини рідин", + "gtceu.machine.mv_electric_furnace.tooltip": "§7Не схоже на користування Commodore 64", + "gtceu.machine.mv_electrolyzer.tooltip": "§7Молекулярний електроліз", + "gtceu.machine.mv_electromagnetic_separator.tooltip": "§7Відокремлює магнітні руди від решти", + "gtceu.machine.mv_extractor.tooltip": "§7Соковичавлюючий пристрій приречення - D123", + "gtceu.machine.mv_extruder.tooltip": "§7Універсальна металообробна машина", "gtceu.machine.mv_fermenter.tooltip": "§7Ферментує рідини", - "gtceu.machine.mv_fluid_drilling_rig.tooltip": "Нафтовидобувна помпа", - "gtceu.machine.mv_fluid_heater.tooltip": "§7Нагріває ваші рідини", - "gtceu.machine.mv_fluid_solidifier.tooltip": "§7Охолоджує рідини до твердих речовин", - "gtceu.machine.mv_forge_hammer.tooltip": "§7Стоп, час молотування!", - "gtceu.machine.mv_forming_press.tooltip": "§7Впечатування зображень у речі", - "gtceu.machine.mv_gas_collector.tooltip": "§7Збирає газ із повітря залежно від розміру", + "gtceu.machine.mv_fluid_drilling_rig.tooltip": "Нафтоперекачувальна помпа", + "gtceu.machine.mv_fluid_heater.tooltip": "§7Нагріває рідини", + "gtceu.machine.mv_fluid_solidifier.tooltip": "§7Охолоджує рідини до твердого стану", + "gtceu.machine.mv_forge_hammer.tooltip": "§7Стоп, час молота!", + "gtceu.machine.mv_forming_press.tooltip": "§7Витискає речам нову форму", + "gtceu.machine.mv_gas_collector.tooltip": "§7Збирає газ з повітря залежно від виміру", "gtceu.machine.mv_laser_engraver.tooltip": "§7Не дивіться прямо на лазер", - "gtceu.machine.mv_lathe.tooltip": "§7Ефективніше виготовляє стрижні", - "gtceu.machine.mv_macerator.tooltip": "§7Подрібнення руд без побічних продуктів", - "gtceu.machine.mv_mass_fabricator.tooltip": "§7UUM Матерія * виробництво в квадраті", - "gtceu.machine.mv_mixer.tooltip": "§7Змішує?", - "gtceu.machine.mv_ore_washer.tooltip": "§7Отримання більше побічних продуктів із ваших руд", - "gtceu.machine.mv_packer.tooltip": "§7Розміщує речі в коробках і дістає їх із них", - "gtceu.machine.mv_polarizer.tooltip": "§7Біполяризація ваших магнітів", - "gtceu.machine.mv_replicator.tooltip": "§7Створення найчистіших предметів", - "gtceu.machine.mv_rock_crusher.tooltip": "§7Розмістіть воду та лаву горизонтально поруч", + "gtceu.machine.mv_lathe.tooltip": "§7Ефективніше виробляє стрижні", + "gtceu.machine.mv_macerator.tooltip": "§7Подрібнює руди без побічних продуктів", + "gtceu.machine.mv_mass_fabricator.tooltip": "§7UUM матерія * виробництво в квадраті", + "gtceu.machine.mv_mixer.tooltip": "§7Чи змішається?", + "gtceu.machine.mv_ore_washer.tooltip": "§7Отримує більше побічних продуктів з руд", + "gtceu.machine.mv_packer.tooltip": "§7Запаковує та розпаковує речі", + "gtceu.machine.mv_polarizer.tooltip": "§7Біполяризовує магніти", + "gtceu.machine.mv_replicator.tooltip": "§7Виробляє найчистіші елементи", + "gtceu.machine.mv_rock_crusher.tooltip": "§7Розмістіть поруч горизонтально воду і лаву", "gtceu.machine.mv_scanner.tooltip": "§7Сканує матеріали та інші речі", - "gtceu.machine.mv_sifter.tooltip": "§7Зберігайте спокій і продовжуйте просіювання", - "gtceu.machine.mv_thermal_centrifuge.tooltip": "§7Точніше розділення руд", - "gtceu.machine.mv_wiremill.tooltip": "§7Ефективніше виготовляє дроти", - "gtceu.machine.network_switch.tooltip.0": "Габ етерної мережі", - "gtceu.machine.network_switch.tooltip.1": "Використовується для маршрутизації та розповсюдження §fобчислення§7.", - "gtceu.machine.network_switch.tooltip.2": "Можна об'єднати будь-яку кількість обчислювальних §fприймачів§7 у будь-яку кількість обчислювальних §fпередавачів§7.", - "gtceu.machine.network_switch.tooltip.3": "Використовує §f%s EU/т§7 на шлюз обчислення даних.", - "gtceu.machine.object_holder.tooltip": "Розширений механізм утримання для дослідницької станції", - "gtceu.machine.opv_gas_collector.tooltip": "§7Збирає газ із Всесвіту залежно від розміру", - "gtceu.machine.opv_rock_crusher.tooltip": "§7Камера вулканічного утворення", - "gtceu.machine.parallel_hatch.display": "Відрегулюйте максимальну паралель багатоблока", + "gtceu.machine.mv_sifter.tooltip": "§7Зберігайте спокій і продовжуйте просіювати", + "gtceu.machine.mv_thermal_centrifuge.tooltip": "§7Точніше розділяє руди", + "gtceu.machine.mv_wiremill.tooltip": "§7Ефективніше виробляє дроти", + "gtceu.machine.network_switch.tooltip.0": "Ethernet-концентратор", + "gtceu.machine.network_switch.tooltip.1": "Використовується для маршрутизації та розподілу§f обчислень§7.", + "gtceu.machine.network_switch.tooltip.2": "Може об'єднати будь-яку кількість обчислювальних§f приймачів§7 у будь-яку кількість обчислювальних§f передавачів§7.", + "gtceu.machine.network_switch.tooltip.3": "Використовує§f %s EU/т§7 для кожного люка обчислювальних даних.", + "gtceu.machine.object_holder.tooltip": "Вдосконалений механізм утримання для дослідницької станції", + "gtceu.machine.opv_gas_collector.tooltip": "§7Збирає газ із всесвіту залежно від виміру", + "gtceu.machine.opv_rock_crusher.tooltip": "§7Камера вулканічних утворень", + "gtceu.machine.parallel_hatch.display": "Регулюйте максимум паралелей конструкції", "gtceu.machine.parallel_hatch_mk5.tooltip": "Дозволяє запускати до 4 рецептів паралельно.", "gtceu.machine.parallel_hatch_mk6.tooltip": "Дозволяє запускати до 16 рецептів паралельно.", "gtceu.machine.parallel_hatch_mk7.tooltip": "Дозволяє запускати до 64 рецептів паралельно.", "gtceu.machine.parallel_hatch_mk8.tooltip": "Дозволяє запускати до 256 рецептів паралельно.", - "gtceu.machine.parallel_limit": "Можна запускати до §b%d§r§7 рецептів одночасно.", - "gtceu.machine.passthrough_hatch_fluid.tooltip": "Надсилає рідини з одного боку на інший", - "gtceu.machine.passthrough_hatch_item.tooltip": "Надсилає предмети з одного боку на інший", - "gtceu.machine.perfect_oc": "Не втрачає енергоефективность під час розгону.", - "gtceu.machine.power_substation.tooltip.0": "Серце централізованої електромережі", - "gtceu.machine.power_substation.tooltip.1": "§fКонденсатори§7 не обов'язково мають бути одного рівня.", - "gtceu.machine.power_substation.tooltip.2": "Дозволяє до §f%d конденсаторних шарів§7.", - "gtceu.machine.power_substation.tooltip.3": "Втрачає енергію, що дорівнює §f1%%§7 від загальної потужности кожні §f24 години§7.", - "gtceu.machine.power_substation.tooltip.4": "Обмеження §f%d kEU/т§7 пасивних втрат на блок конденсаторів.", - "gtceu.machine.power_substation.tooltip.5": "Можна використовувати", - "gtceu.machine.power_substation.tooltip.6": " Лазерні роз'єми§7.", - "gtceu.machine.primitive_blast_furnace.bronze.tooltip": "Виготовлення вашої першої сталі", - "gtceu.machine.primitive_water_pump.tooltip": "Ендервойр вдома", - "gtceu.machine.processing_array.tooltip": "Коли кілька машин просто не справляються", - "gtceu.machine.pump.tooltip": "§7Найкращий спосіб спустошити океани!", - "gtceu.machine.pump.tooltip_buckets": "§f%d§7 тактів на відро", - "gtceu.machine.pump_hatch.tooltip": "Примітивний вихід рідини для помпи", - "gtceu.machine.pyrolyse_oven.tooltip": "Електрична коксова піч", - "gtceu.machine.pyrolyse_oven.tooltip.1": "§6Медіорієві котушки§7 працюють на §f25%%§7 повільніше. Кожна котушка після §bканталевої§7 збільшує швидкість на §f50%%§7.", - "gtceu.machine.quantum_chest.items_stored": "Кількість предметів:", - "gtceu.machine.quantum_chest.tooltip": "§7Краще, ніж ящики для зберігання", - "gtceu.machine.quantum_tank.tooltip": "§7Компактне місце для зберігання всіх ваших рідин", + "gtceu.machine.parallel_limit": "Дозволяє виконувати до§b %d§r§7 рецептів одночасно.", + "gtceu.machine.passthrough_hatch_fluid.tooltip": "Перекачує рідини з однієї сторони на іншу", + "gtceu.machine.passthrough_hatch_item.tooltip": "Переміщує предмети з однієї сторони на іншу", + "gtceu.machine.perfect_oc": "Не втрачає енергоефективність при розгоні.", + "gtceu.machine.power_substation.tooltip.0": "Серце централізованої енергосистеми", + "gtceu.machine.power_substation.tooltip.1": "§fАкумулятори§7 не обов'язково повинні бути одного рівня.", + "gtceu.machine.power_substation.tooltip.2": "Допускає до§f %d шарів акумуляторів§7.", + "gtceu.machine.power_substation.tooltip.3": "Втрачає енергію, що дорівнює§f 1%%§7 від загальної ємності кожні§f 24 години§7.", + "gtceu.machine.power_substation.tooltip.4": "Обмежено на рівні§f %d kEU/т§7 пасивних втрат на блок акумулятора.", + "gtceu.machine.power_substation.tooltip.5": "Може використовувати", + "gtceu.machine.power_substation.tooltip.6": " лазерні люки§7.", + "gtceu.machine.primitive_blast_furnace.bronze.tooltip": "Створення першої сталі", + "gtceu.machine.primitive_water_pump.tooltip": "Ендервуар в домашніх умовах", + "gtceu.machine.processing_array.tooltip": "Коли кількох машин недостатньо", + "gtceu.machine.pump.tooltip": "§7Найкращий спосіб спустошувати океани!", + "gtceu.machine.pump.tooltip_buckets": "§f%d§7 тактів за відро", + "gtceu.machine.pump_hatch.tooltip": "Примітивний вихід рідини для водяної помпи", + "gtceu.machine.pyrolyse_oven.tooltip": "Електрична коксувальна піч", + "gtceu.machine.pyrolyse_oven.tooltip.1": "§6Мельхіорові§7 котушки на§f 25%%§7 повільніші. кожна котушка після§b канталової§7 збільшує швидкість на§f 50%%§7.", + "gtceu.machine.quantum_chest.items_stored": "Кількість:", + "gtceu.machine.quantum_chest.tooltip": "§7Краще ніж Storage Drawers", + "gtceu.machine.quantum_tank.tooltip": "§7Компактне місце для зберігання всіх рідин", "gtceu.machine.research_station.researching": "Дослідження.", - "gtceu.machine.research_station.tooltip.0": "Більше, ніж просто багатоблоковий сканер", - "gtceu.machine.research_station.tooltip.1": "Використовується для сканування §fсфера даних§7 і §fмодулі даних§7.", - "gtceu.machine.research_station.tooltip.2": "Для роботи потрібне §fобчислення§7.", - "gtceu.machine.research_station.tooltip.3": "Надання більшої кількости обчислень дозволяє рецепту працювати швидше.", - "gtceu.machine.rotor_holder.tooltip.0": "Тримач ротора для багатоблоків", + "gtceu.machine.research_station.tooltip.0": "Більше, ніж просто багатоблочний сканер", + "gtceu.machine.research_station.tooltip.1": "Використовується для сканування на§f сферах даних§7 та§f модулях даних§7.", + "gtceu.machine.research_station.tooltip.2": "Для роботи потрібні§f обчислення§7.", + "gtceu.machine.research_station.tooltip.3": "Забезпечення більшої кількості обчислень дозволяє рецепту працювати швидше.", + "gtceu.machine.rotor_holder.tooltip.0": "Тримач ротора для конструкцій", "gtceu.machine.rotor_holder.tooltip.1": "Утримує ротор на місці, щоб він не відлетів", - "gtceu.machine.steam.steam_hatch.tooltip": "§eДопустима рідина: §fпар", - "gtceu.machine.steam_boiler.heat_amount": "Теплова потужність: %s %%", - "gtceu.machine.steam_bus.tooltip": "Не працює з багатоблоками, відмінними від пару", - "gtceu.machine.steam_grinder.tooltip": "Багатоблоковий подрібнювач без побічних продуктів", - "gtceu.machine.steam_miner.tooltip": "§7Видобуває руду нижче добувника!", - "gtceu.machine.steam_oven.tooltip": "Не плутати з багатотопильником", - "gtceu.machine.steam_turbine.tooltip": "§7Перетворює пар на EU", - "gtceu.machine.substation_hatch.input.tooltip": "Вхід енергії для підстанції", - "gtceu.machine.substation_hatch.output.tooltip": "Вихід енергії для підстанції", - "gtceu.machine.tank_valve.tooltip": "Використовуйте для наповнення та зливання багатоблокових баків. Автовихід, коли дивиться вниз.", - "gtceu.machine.transformer.description": "§7Перетворює енергію між рівнями напруги", - "gtceu.machine.transformer.message_transform_down": "Перетворення вниз, вхід: %s EU %dA, вихід: %s EU %dA", - "gtceu.machine.transformer.message_transform_up": "Перетворення вгору, вхід: %s EU %dA, вихід: %s EU %dA", - "gtceu.machine.transformer.tooltip_tool_usage": "Починається як §fперетворення вниз§7, використовуйте викрутку для зміни", - "gtceu.machine.transformer.tooltip_transform_down": "§aПеретворити вниз: §f%dA %s EU (%s§f) —> %dA %s EU (%s§f)", - "gtceu.machine.transformer.tooltip_transform_up": "§cПеретворити вгору: §f%dA %s EU (%s§f) —> %dA %s EU (%s§f)", - "gtceu.machine.uev_gas_collector.tooltip": "§7Збирає газ із сонячної системи в залежности від розміру", - "gtceu.machine.uev_rock_crusher.tooltip": "§7Камера вулканічного утворення", - "gtceu.machine.uhv_gas_collector.tooltip": "§7Збирає газ із сонячної системи залежно від розміру", - "gtceu.machine.uhv_rock_crusher.tooltip": "§7Камера вулканічного утворення", - "gtceu.machine.uiv_gas_collector.tooltip": "§7Збирає газ із сонячної системи залежно від розміру", - "gtceu.machine.uiv_rock_crusher.tooltip": "§7Камера вулканічного утворення", - "gtceu.machine.uv_alloy_smelter.tooltip": "§7Змішувач металу", + "gtceu.machine.steam.steam_hatch.tooltip": "§eПриймає рідину:§f пара", + "gtceu.machine.steam_boiler.heat_amount": "Тепломісткість: %s %%", + "gtceu.machine.steam_bus.tooltip": "Не працює з непаровими конструкціями", + "gtceu.machine.steam_grinder.tooltip": "Багатоблочний подрібнювач без побічних продуктів", + "gtceu.machine.steam_miner.tooltip": "§7Добуває руди під шахтами!", + "gtceu.machine.steam_oven.tooltip": "Не плутати з мультиплавильнею", + "gtceu.machine.steam_turbine.tooltip": "§7Перетворює пару на EU", + "gtceu.machine.substation_hatch.input.tooltip": "Вхід енергії для електропідстанції", + "gtceu.machine.substation_hatch.output.tooltip": "Вихід енергії для електропідстанції", + "gtceu.machine.tank_valve.tooltip": "Використовується для наповнення та спорожнення резервуарів конструкцій. Виводить автоматично, якщо розміщений лицьовою стороною донизу.", + "gtceu.machine.transformer.description": "§7Трансформує енергію між рівнями напруги", + "gtceu.machine.transformer.message_transform_down": "Трансформація вниз, вхід: %s EU %dA, вихід: %s EU %dA", + "gtceu.machine.transformer.message_transform_up": "Трансформація вгору, вхід: %s EU %dA, вихід: %s EU %dA", + "gtceu.machine.transformer.tooltip_tool_usage": "Починає з§f трансформації вниз§7, використовуйте викрутку для зміни", + "gtceu.machine.transformer.tooltip_transform_down": "§aТрансформування вниз:§f %dA %s EU (%s§f) -> %dA %s EU (%s§f)", + "gtceu.machine.transformer.tooltip_transform_up": "§cТрансформування вгору:§f %dA %s EU (%s§f) -> %dA %s EU (%s§f)", + "gtceu.machine.uev_gas_collector.tooltip": "§7Збирає газ з сонячної системи залежно від виміру", + "gtceu.machine.uev_rock_crusher.tooltip": "§7Камера вулканічних утворень", + "gtceu.machine.uhv_gas_collector.tooltip": "§7Збирає газ з сонячної системи залежно від виміру", + "gtceu.machine.uhv_rock_crusher.tooltip": "§7Камера вулканічних утворень", + "gtceu.machine.uiv_gas_collector.tooltip": "§7Збирає газ з сонячної системи залежно від виміру", + "gtceu.machine.uiv_rock_crusher.tooltip": "§7Камера вулканічних утворень", + "gtceu.machine.uv_alloy_smelter.tooltip": "§7Амальгаматор металу", "gtceu.machine.uv_arc_furnace.tooltip": "§7Нагрівач короткого замикання", - "gtceu.machine.uv_assembler.tooltip": "§7Конструктор збірки", - "gtceu.machine.uv_autoclave.tooltip": "§7Одиниця обтяження", + "gtceu.machine.uv_assembler.tooltip": "§7Збиральний конструктор", + "gtceu.machine.uv_autoclave.tooltip": "§7Блок обтяження", "gtceu.machine.uv_bender.tooltip": "§7Деформатор матерії", - "gtceu.machine.uv_brewery.tooltip": "§7Швидко варить", - "gtceu.machine.uv_canner.tooltip": "§7Привід банки", - "gtceu.machine.uv_centrifuge.tooltip": "§7Молекулярний торнадо", - "gtceu.machine.uv_chemical_bath.tooltip": "§7Хімічний окевн", - "gtceu.machine.uv_chemical_reactor.tooltip": "§7Каталізатор реакції", + "gtceu.machine.uv_brewery.tooltip": "§7Перша броварня", + "gtceu.machine.uv_canner.tooltip": "§7Консервний актуатор", + "gtceu.machine.uv_centrifuge.tooltip": "§7Молекулярне торнадо", + "gtceu.machine.uv_chemical_bath.tooltip": "§7Хімічний занурятор 2222", + "gtceu.machine.uv_chemical_reactor.tooltip": "§7Каталізатор реакцій", "gtceu.machine.uv_circuit_assembler.tooltip": "§7Фабрика обчислень", - "gtceu.machine.uv_compressor.tooltip": "§7Звужувач матерії", - "gtceu.machine.uv_cutter.tooltip": "§7Роздільник предметів", - "gtceu.machine.uv_distillery.tooltip": "§7Роздільник фракцій", + "gtceu.machine.uv_compressor.tooltip": "§7Стискач матерії", + "gtceu.machine.uv_cutter.tooltip": "§7Розділювач матерії", + "gtceu.machine.uv_distillery.tooltip": "§7Дільник фракцій", "gtceu.machine.uv_electric_furnace.tooltip": "§7Атомний стимулятор", "gtceu.machine.uv_electrolyzer.tooltip": "§7Атомний іонізатор", - "gtceu.machine.uv_electromagnetic_separator.tooltip": "§7Ідельне розсіювання", - "gtceu.machine.uv_extractor.tooltip": "§7Розріджувальний насос", - "gtceu.machine.uv_extruder.tooltip": "§7Драйвер форми", - "gtceu.machine.uv_fermenter.tooltip": "§7Контролер ферментації", - "gtceu.machine.uv_fluid_heater.tooltip": "§7Термальний бак", - "gtceu.machine.uv_fluid_solidifier.tooltip": "§7Затверджує рідину", + "gtceu.machine.uv_electromagnetic_separator.tooltip": "§7Ровіювач електромагнітної сили", + "gtceu.machine.uv_extractor.tooltip": "§7Відсмоктувач зрідження", + "gtceu.machine.uv_extruder.tooltip": "§7Формоутворювач", + "gtceu.machine.uv_fermenter.tooltip": "§7Дихальний контролер", + "gtceu.machine.uv_fluid_heater.tooltip": "§7Тепловий просякач", + "gtceu.machine.uv_fluid_solidifier.tooltip": "§7Рідинний окаменювач", "gtceu.machine.uv_forge_hammer.tooltip": "§7Модулятор удару", - "gtceu.machine.uv_forming_press.tooltip": "§7Формує", - "gtceu.machine.uv_gas_collector.tooltip": "§7Збирає газ із сонячної системи залежно від розміру", + "gtceu.machine.uv_forming_press.tooltip": "§7Змінювач поверхней", + "gtceu.machine.uv_gas_collector.tooltip": "§7Збирає газ з сонячної системи залежно від виміру", "gtceu.machine.uv_laser_engraver.tooltip": "§7Точна фотонна гармата", - "gtceu.machine.uv_lathe.tooltip": "§7Обертовий точильник", - "gtceu.machine.uv_macerator.tooltip": "§7Усувач форми", + "gtceu.machine.uv_lathe.tooltip": "§7Ротаційна шліфувальна машина", + "gtceu.machine.uv_macerator.tooltip": "§7Деформувальник", "gtceu.machine.uv_mass_fabricator.tooltip": "§7Ініціатор існування", "gtceu.machine.uv_mixer.tooltip": "§7Гомогенізатор матеріалу", - "gtceu.machine.uv_ore_washer.tooltip": "§7Мініатюрна мийка", - "gtceu.machine.uv_packer.tooltip": "§7Склад Amazon", + "gtceu.machine.uv_ore_washer.tooltip": "§7Мініатюрна автомийка", + "gtceu.machine.uv_packer.tooltip": "§7Склад Нової пошти", "gtceu.machine.uv_polarizer.tooltip": "§7Реорганізатор магнітного поля", - "gtceu.machine.uv_replicator.tooltip": "§7Скопіювати-вставити", - "gtceu.machine.uv_rock_crusher.tooltip": "§7Камера вулканічного утворення", + "gtceu.machine.uv_replicator.tooltip": "§7Елементарний композитор", + "gtceu.machine.uv_rock_crusher.tooltip": "§7Камера вулканічних утворень", "gtceu.machine.uv_scanner.tooltip": "§7Електронний мікроскоп", "gtceu.machine.uv_sifter.tooltip": "§7Пульсаційний фільтр", - "gtceu.machine.uv_thermal_centrifuge.tooltip": "§7Пожежний циклон", - "gtceu.machine.uv_wiremill.tooltip": "§7Трансфігуратор дроту", - "gtceu.machine.uxv_gas_collector.tooltip": "§7Збирає газ із сонячної системи залежно від розміру", - "gtceu.machine.uxv_rock_crusher.tooltip": "§7Камера вулканічного утворення", - "gtceu.machine.vacuum_freezer.tooltip": "Алюмінієвий льодяна камера", - "gtceu.machine.workbench.storage_note.0": "(Доступні предмети з приєднаних", - "gtceu.machine.workbench.storage_note.1": "запасів, які можна використовувати для майстрування)", - "gtceu.machine.workbench.tab.container": "Умістище", + "gtceu.machine.uv_thermal_centrifuge.tooltip": "§7Вогняний циклон", + "gtceu.machine.uv_wiremill.tooltip": "§7Трансформатор дротів", + "gtceu.machine.uxv_gas_collector.tooltip": "§7Збирає газ з сонячної системи залежно від виміру", + "gtceu.machine.uxv_rock_crusher.tooltip": "§7Камера вулканічних утворень", + "gtceu.machine.vacuum_freezer.tooltip": "Алюмінієвий контейнер для льоду", + "gtceu.machine.workbench.storage_note.0": "(Доступні предмети з під'єднаних", + "gtceu.machine.workbench.storage_note.1": "контейнерів доступні для майстрування)", + "gtceu.machine.workbench.tab.container": "Контейнер", "gtceu.machine.workbench.tab.crafting": "Майстрування", - "gtceu.machine.workbench.tab.item_list": "Зберігання", + "gtceu.machine.workbench.tab.item_list": "Сховище", "gtceu.machine.workbench.tab.workbench": "Майстрування", - "gtceu.machine.workbench.tooltip.0": "Краще, ніж Forestry", - "gtceu.machine.workbench.tooltip.1": "Має сховище предметів, сховище інструментів, отримує з суміжних запасів і зберігає рецепти.", - "gtceu.machine.world_accelerator.description": "Такт прискорює блоки поблизу в одному з 2 режимів: §fблоки-сутності§7 або §fвипадковий такт§7. Використовуйте викрутку, щоб змінити режим.", - "gtceu.machine.world_accelerator.mode_entity": "Випадковий такт", - "gtceu.machine.world_accelerator.mode_tile": "Блоки-сутності", - "gtceu.machine.world_accelerator.working_area": "§bЗона роботи:", - "gtceu.machine.world_accelerator.working_area_random": " Випадковий такт: §f%dx%d", - "gtceu.machine.world_accelerator.working_area_tile": " Блоки-сутності: §fСусідні блоки", - "gtceu.machine.zpm_alloy_smelter.tooltip": "§7Інтегратор спалів", - "gtceu.machine.zpm_arc_furnace.tooltip": "§7Нагрівач нагнітання", + "gtceu.machine.workbench.tooltip.0": "Краще Forestry", + "gtceu.machine.workbench.tooltip.1": "Має сховище предметів, сховище інструментів, витягує з сусідніх контейнерів і зберігає рецепти.", + "gtceu.machine.world_accelerator.description": "Тактово прискорює сусідні блоки в одному з 2 режимів:§f Блок-сутність§7 або§f випадковий такт§7. Використовуйте викрутку, щоб змінити режим.", + "gtceu.machine.world_accelerator.mode_entity": "Режим випадкового такту", + "gtceu.machine.world_accelerator.mode_tile": "Режим блока-сутності", + "gtceu.machine.world_accelerator.working_area": "§bРобоча зона:", + "gtceu.machine.world_accelerator.working_area_random": " режим випадкового такту:§f %dx%d", + "gtceu.machine.world_accelerator.working_area_tile": " режим блокової сутності:§f суміжних блоків", + "gtceu.machine.zpm_alloy_smelter.tooltip": "§7Інтегратор сплавів", + "gtceu.machine.zpm_arc_furnace.tooltip": "§7Розрядний нагрівач", "gtceu.machine.zpm_assembler.tooltip": "§7НЕ верстак", "gtceu.machine.zpm_autoclave.tooltip": "§7Скороварка", - "gtceu.machine.zpm_bender.tooltip": "§7Згинає", - "gtceu.machine.zpm_brewery.tooltip": "§7Приготування напоїв", - "gtceu.machine.zpm_canner.tooltip": "§7Оператор консервування", + "gtceu.machine.zpm_bender.tooltip": "§7Викривлювач", + "gtceu.machine.zpm_brewery.tooltip": "§7Більше ніж варильня", + "gtceu.machine.zpm_canner.tooltip": "§7Консервний оператор", "gtceu.machine.zpm_centrifuge.tooltip": "§7Молекулярний циклон", - "gtceu.machine.zpm_chemical_bath.tooltip": "§7Хімічне розчинення", - "gtceu.machine.zpm_chemical_reactor.tooltip": "§7Хімічний виконавець", + "gtceu.machine.zpm_chemical_bath.tooltip": "§7Хімічний розчинник", + "gtceu.machine.zpm_chemical_reactor.tooltip": "§7Хімічний перетворювач", "gtceu.machine.zpm_circuit_assembler.tooltip": "§7Виробник електроніки", - "gtceu.machine.zpm_compressor.tooltip": "§7Конденсатор сингулярности", - "gtceu.machine.zpm_cutter.tooltip": "§7Ріже матерію", - "gtceu.machine.zpm_distillery.tooltip": "§7Розділювач конденсації", - "gtceu.machine.zpm_electric_furnace.tooltip": "§7Електронний процесор збудження", + "gtceu.machine.zpm_compressor.tooltip": "§7Конденсатор сингулярності", + "gtceu.machine.zpm_cutter.tooltip": "§7Розсікач предметів", + "gtceu.machine.zpm_distillery.tooltip": "§7Сепаратор конденсату", + "gtceu.machine.zpm_electric_furnace.tooltip": "§7Механізм електронного збудження", "gtceu.machine.zpm_electrolyzer.tooltip": "§7Молекулярний дезінтегратор E-4908", "gtceu.machine.zpm_electromagnetic_separator.tooltip": "§7Електромагнітний категоризатор", "gtceu.machine.zpm_extractor.tooltip": "§7Вакуумний екстрактор", - "gtceu.machine.zpm_extruder.tooltip": "§7Витіснювач матеріалу", - "gtceu.machine.zpm_fermenter.tooltip": "§7Прискорювач фермантації", - "gtceu.machine.zpm_fluid_heater.tooltip": "§7Нагрівач", + "gtceu.machine.zpm_extruder.tooltip": "§7Витіснювач матеріалів", + "gtceu.machine.zpm_fermenter.tooltip": "§7Прискорювач ферментації", + "gtceu.machine.zpm_fluid_heater.tooltip": "§7Тепловий інфузор", "gtceu.machine.zpm_fluid_solidifier.tooltip": "§7Не льодогенератор", - "gtceu.machine.zpm_forge_hammer.tooltip": "§7Ковальщик тарілок", - "gtceu.machine.zpm_forming_press.tooltip": "§7Об'єктний шар", - "gtceu.machine.zpm_gas_collector.tooltip": "§7Збирає газ з атмосфери залежно від розміру", - "gtceu.machine.zpm_laser_engraver.tooltip": "§7З потужністю 32,64 МВт", - "gtceu.machine.zpm_lathe.tooltip": "§7Ефективніше виготовляє стрижні", - "gtceu.machine.zpm_macerator.tooltip": "§7Подрібнювач 9003", + "gtceu.machine.zpm_forge_hammer.tooltip": "§7Плитопідроблювач", + "gtceu.machine.zpm_forming_press.tooltip": "§7Предметний нашаровувач", + "gtceu.machine.zpm_gas_collector.tooltip": "§7Збирає газ з атмосфери залежно від виміру", + "gtceu.machine.zpm_laser_engraver.tooltip": "§7Із силою 32.64 MW", + "gtceu.machine.zpm_lathe.tooltip": "§7Поворотно-відкидна машина L-5908", + "gtceu.machine.zpm_macerator.tooltip": "§7Блендоматор 9003", "gtceu.machine.zpm_mass_fabricator.tooltip": "§7Фабрика буття", - "gtceu.machine.zpm_mixer.tooltip": "§7Організатор матеріалів", - "gtceu.machine.zpm_ore_washer.tooltip": "§7Перероблена пральна машина I-362", - "gtceu.machine.zpm_packer.tooltip": "§7Коробкувальник", - "gtceu.machine.zpm_polarizer.tooltip": "§7Індуктор магнетизму", - "gtceu.machine.zpm_replicator.tooltip": "§7Майстер вставки", - "gtceu.machine.zpm_rock_crusher.tooltip": "§7Затверджувач кріогенної магми R-10200", + "gtceu.machine.zpm_mixer.tooltip": "§7Органайзер матерії", + "gtceu.machine.zpm_ore_washer.tooltip": "§7Переобладнана пральна машина I-362", + "gtceu.machine.zpm_packer.tooltip": "§7Коробкар", + "gtceu.machine.zpm_polarizer.tooltip": "§7Індуктор магнітного поля", + "gtceu.machine.zpm_replicator.tooltip": "§7Матеріальний Ctrl+V", + "gtceu.machine.zpm_rock_crusher.tooltip": "§7Кріогенний затверджувач магми R-10200", "gtceu.machine.zpm_scanner.tooltip": "§7Детектор аномалій", - "gtceu.machine.zpm_sifter.tooltip": "§7Спонсовано TFC", - "gtceu.machine.zpm_thermal_centrifuge.tooltip": "§7Пломенева топильня T-6352", - "gtceu.machine.zpm_wiremill.tooltip": "§7Розкатує злиток", + "gtceu.machine.zpm_sifter.tooltip": "§7За підтримки TFC", + "gtceu.machine.zpm_thermal_centrifuge.tooltip": "§7Потогонник пломенів T-6352", + "gtceu.machine.zpm_wiremill.tooltip": "§7Подовжувач злитків", "gtceu.maintenance.configurable_duration": "Тривалість: %fx", - "gtceu.maintenance.configurable_duration.changed_description": "Рецепти виконуватимуться з тривалістю %fx, застосованою до розгону.", - "gtceu.maintenance.configurable_duration.modify": "Тривалість зміни:", - "gtceu.maintenance.configurable_duration.unchanged_description": "Рецепти працюватимуть із нормальною швидкістю. Змініть налаштування, щоб оновити.", + "gtceu.maintenance.configurable_duration.changed_description": "Рецепти запускатимуться з тривалістю %fx, застосованою перед розгоном.", + "gtceu.maintenance.configurable_duration.modify": "Змінити тривалість:", + "gtceu.maintenance.configurable_duration.unchanged_description": "Рецепти виконуватимуться зі звичайною швидкістю. Змініть конфігурацію для оновлення.", "gtceu.maintenance.configurable_time": "Час: %fx", - "gtceu.maintenance.configurable_time.changed_description": "Проблеми з обслуговуванням виникатимуть із %fx нормальної швидкости.", - "gtceu.maintenance.configurable_time.unchanged_description": "Проблеми з обслуговуванням виникатимуть із звичайною частотою. Змініть налаштування, щоб оновити.", - "gtceu.medical_condition.antidote.description": "§aПротиотрута §7утримуйте Shift, щоб показати деталі", - "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.maintenance.configurable_time.changed_description": "Проблеми з обслуговуванням виникатимуть у %f разів частіше.", + "gtceu.maintenance.configurable_time.unchanged_description": "Проблеми з обслуговуванням виникатимуть зі звичайною швидкістю. Змініть конфігурацію для оновлення.", + "gtceu.medical_condition.antidote.description": "§aПротиотрута§7 Утримуйте Shift для подробиць", + "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.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.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.none": "§2(Не²)Безпечно", + "gtceu.medical_condition.poison": "§2Отрута", "gtceu.medical_condition.silicosis": "§1Силікоз", "gtceu.medical_condition.weak_poison": "§aСлабка отрута", - "gtceu.minimap.ore_vein.depleted": "Виснажена", + "gtceu.minimap.ore_vein.depleted": "Виснажено", "gtceu.mixer": "Змішувач", - "gtceu.mode.both": "§dРідина і предмети§r", - "gtceu.mode.fluid": "§9Рідина§r", + "gtceu.mode.both": "§dСпільний (Рідини та предмети)§r", + "gtceu.mode.fluid": "§9Рідини§r", "gtceu.mode.item": "§6Предмети§r", - "gtceu.muffler.recovery_tooltip": "§bШанс відновлення: §f%d%%", - "gtceu.multiblock.active_transformer.average_in": "§bСер. вхід: §f%s EU/т", - "gtceu.multiblock.active_transformer.average_out": "§bСер. вихід: §f%s EU/т", - "gtceu.multiblock.active_transformer.danger_enabled": "§c§bНЕБЕЗПЕКА: вибуховий", - "gtceu.multiblock.active_transformer.max_input": "§aМакс. вхід: §f%s EU/т", - "gtceu.multiblock.active_transformer.max_output": "§cМакс. вихід: §f%s EU/т", - "gtceu.multiblock.assembly_line.description": "Конвеєр — це велика багатоблокова структура, що складається з 5-16 «зрізів». Теоретично це велика збиральна машина, яка використовується для створення передових компонентів майстрування.", - "gtceu.multiblock.batch_enabled": "— %dx з дозування", - "gtceu.multiblock.blast_furnace.max_temperature": "Теплова потужність: %s", - "gtceu.multiblock.central_monitor.height": "Висота екрана:", + "gtceu.muffler.recovery_tooltip": "§bШанс відновлення:§f %d%%", + "gtceu.multiblock.active_transformer.average_in": "§bСеред. Вхід:§f %s EU/т", + "gtceu.multiblock.active_transformer.average_out": "§bСеред. Вихід:§f %s EU/т", + "gtceu.multiblock.active_transformer.danger_enabled": "§c§bНЕБЕЗПЕКА: вибухонебезпечно", + "gtceu.multiblock.active_transformer.max_input": "§aМакс. Вхід:§f %s EU/т", + "gtceu.multiblock.active_transformer.max_output": "§cМакс. Вихід:§f %s EU/т", + "gtceu.multiblock.assembly_line.description": "Конвеєрна лінія - це велика багатоблочна конструкція, що складається з 5 до 16 \"скибок\". теоретично, це великий збиральний апарат, який використовується для створення вдосконалених крафтових компонентів.", + "gtceu.multiblock.batch_enabled": "- %dx від групування", + "gtceu.multiblock.blast_furnace.max_temperature": "Тепломісткість: %s", + "gtceu.multiblock.central_monitor.height": "Висота екрану:", "gtceu.multiblock.central_monitor.height_modify": "Зміна висоти: %d", "gtceu.multiblock.central_monitor.low_power": "Низька потужність", - "gtceu.multiblock.central_monitor.tooltip.0": "Це машина, яка відстежує машини, проксі-сервери цифрового інтерфейсу. Ви можете легко контролювати рідини, предмети, енергію та стани машин, проксі-серверів в енергетичній мережі.", - "gtceu.multiblock.central_monitor.tooltip.1": "Ви можете створити екран центрального монітора від 3х2 до %dх%d (ширина х висота).", - "gtceu.multiblock.central_monitor.tooltip.2": "Усталена висота становить 3. Ви можете налаштувати висоту екрана в інтерфейсі до формування структури.", - "gtceu.multiblock.central_monitor.tooltip.3": "Споживання енергії: %d EU/с для кожного екрана.", - "gtceu.multiblock.central_monitor.width": "Ширина екрана: %d", - "gtceu.multiblock.charcoal_pile.description.0": "Перетворює колоди на крихке деревне вугілля в області 9x4x9 під ним.", + "gtceu.multiblock.central_monitor.tooltip.0": "Це машина, яка контролює машини, проксі яких знаходяться під кришкою цифрового інтерфейсу. Ви можете легко контролювати рідини, предмети, енергію та стани машин, проксі яких підключено до енергетичної мережі.", + "gtceu.multiblock.central_monitor.tooltip.1": "Ви можете побудувати екран центрального контролера від 3x2 до %dx%d (ширина x висота).", + "gtceu.multiblock.central_monitor.tooltip.2": "Усталена висота - 3. Ви можете налаштувати висоту екрану в графічному інтерфейсі до того, як структура буде сформована.", + "gtceu.multiblock.central_monitor.tooltip.3": "Споживання енергії: %d EU/c за кожний екран.", + "gtceu.multiblock.central_monitor.width": "Ширина екрану: %d", + "gtceu.multiblock.charcoal_pile.description.0": "Перетворює колоди на крихке деревне вугілля в зоні 9х4х9 під собою.", "gtceu.multiblock.charcoal_pile.description.1": "", - "gtceu.multiblock.charcoal_pile.description.2": "Підлогу котловану необхідно викласти з цегли, а для стін і даху можна використовувати будь-який ґрунтовий блок. Всередині ями не може бути повітря.", + "gtceu.multiblock.charcoal_pile.description.2": "Підлога ями повинна бути викладена з цегли, а для стін і даху можна використовувати будь-який грунтовий блок. Усередині ями не повинно бути повітря.", "gtceu.multiblock.charcoal_pile.description.3": "", - "gtceu.multiblock.charcoal_pile.description.4": "Великі ями потребують більше часу для обробки колод, але вони ефективніші.", - "gtceu.multiblock.cleanroom.clean_amount": "Чистота: §a%s%%", - "gtceu.multiblock.cleanroom.clean_state": "Статус: §aЧИСТО", - "gtceu.multiblock.cleanroom.dirty_state": "Статус: §4ЗАБРУДНЕНО", - "gtceu.multiblock.coke_oven.description": "Коксова піч — це багатоблокова структура, яка використовується для отримання коксу та креозоту на початку гри. Він не вимагає палива і має внутрішній бак на 32 відра для креозоту. Його інвентар можна отримати через шлюз коксової печі.", + "gtceu.multiblock.charcoal_pile.description.4": "Більші ями займають більше часу для обробки колод, але є більш ефективними.", + "gtceu.multiblock.cleanroom.clean_amount": "Чистота:§a %s%%", + "gtceu.multiblock.cleanroom.clean_state": "Стан:§a ЧИСТО", + "gtceu.multiblock.cleanroom.dirty_state": "Стан:§4 ЗАБРУДНЕНО", + "gtceu.multiblock.coke_oven.description": "Коксова піч - це багатоблочна конструкція, яка використовується для отримання коксу та креозоту на початку гри. Вона не потребує палива і має внутрішній резервуар на 32 відра для креозоту. Доступ до її інвентарю можна отримати через люк коксової печі.", "gtceu.multiblock.computation.max": "Макс. ОРО/т: %s", - "gtceu.multiblock.computation.non_bridging": "З'єднання без мосту знайдено", - "gtceu.multiblock.computation.non_bridging.detailed": "Приймальний роз'єм пов'язано з комп'ютером, який не може створити міст", - "gtceu.multiblock.computation.not_enough_computation": "Машині потрібно більше обчислень!", - "gtceu.multiblock.computation.usage": "Використання: %s", - "gtceu.multiblock.cracker.description": "Машина крекінгу — це багатоблокова структура, яка використовується для перетворення легкого та важкого палива на їх крекінг-варіанти.", - "gtceu.multiblock.cracking_unit.energy": "Використання енергії: %s%%", - "gtceu.multiblock.data_bank.description": "Накопичувач даних — це багатоблокова структура, яка використовується для обміну даними конвеєрного дослідження між декількома конвеєрними лініями. Крім того, він дозволяє конвеєрним лініям зчитувати складніші дослідницькі дані щодо модулів даних.", - "gtceu.multiblock.data_bank.providing": "Постачання даних.", - "gtceu.multiblock.dimension": "§eВиміри: §r%sx%sx%s", - "gtceu.multiblock.dimensions.0": "Виміри: ", + "gtceu.multiblock.computation.non_bridging": "Знайдено немостове з'єднання", + "gtceu.multiblock.computation.non_bridging.detailed": "Приймальний люк пов'язаний з машиною без мостування", + "gtceu.multiblock.computation.not_enough_computation": "Машина вимагає більше обчислень!", + "gtceu.multiblock.computation.usage": "Використовується: %s", + "gtceu.multiblock.cracker.description": "Нафтова крекінгова устава - це багатоблочна конструкція, яка використовується для перетворення легкого та важкого палива на їх крекінгові варіанти.", + "gtceu.multiblock.cracking_unit.energy": "Вик. енергії: %s%%", + "gtceu.multiblock.data_bank.description": "База даних - це багатоблочна конструкція, яка використовується для спільного використання дослідницьких даних конвеєрної лінії між кількома конвеєрними лініями. крім того, це дозволяє конвеєрним лініям зчитувати складніші дослідницькі дані з модулів даних.", + "gtceu.multiblock.data_bank.providing": "Надання даних.", + "gtceu.multiblock.dimension": "§eРозміри: §r%sx%sx%s", + "gtceu.multiblock.dimensions.0": "Розміри: ", "gtceu.multiblock.dimensions.1": " §c§lШирина§r: %s, §a§lВисота§r: %s, §9§lГлибина§r: %s ", - "gtceu.multiblock.distillation_tower.description": "Дистиляційна вежа — це багатоблокова структура, яка використовується для дистиляції різних типів нафти та деяких їхніх побічних продуктів. Кожен шар повинен мати рівно один вихідний шлюз, починаючи з другого. Нижній шар може виводити предмети та вставляти рідини в будь-якій позиції.", + "gtceu.multiblock.distillation_tower.description": "Дистиляційна вежа - це багатоблочна конструкція, яка використовується для перегонки різних типів нафти та деяких побічних продуктів. кожен шар повинен мати рівно один вивідний люк, починаючи з другого. Нижній шар може виводити предмети і вводити рідини в будь-якому положенні.", "gtceu.multiblock.distillation_tower.distilling_fluid": "Дистиляція %s", - "gtceu.multiblock.electric_blast_furnace.description": "Електрична доменна піч (ЕПД) — це багатоблокова структура, яка використовується для топлення сплавів, варіння металів і очищення руд. Вона потрібна для отримання високорівневих сплавів і металів, таких як алюміній, нержавійна сталь, титан і сплав наквада.", - "gtceu.multiblock.energy_consumption": "Використання енергії: %s EU/т (%s)", - "gtceu.multiblock.exact_hatch_1.tooltip": "§fПриймає рівно §6один§f роз'єм енергії.", - "gtceu.multiblock.extreme_combustion_engine.description": "Двигун екстремального внутрішнього згоряння — це багатоблокова структура, яка діє як генератор згоряння для БН.", + "gtceu.multiblock.electric_blast_furnace.description": "Електрична доменна піч (ЕДП) - це багатоблочна конструкція, яка використовується для витоплення сплавів, варіння металів і збагачення руд. Вона необхідна для отримання високоякісних сплавів і металів, таких як алюміній, нержавійна сталь, титан і сплав наквади.", + "gtceu.multiblock.energy_consumption": "Вик. енергії: %s EU/т (%s)", + "gtceu.multiblock.exact_hatch_1.tooltip": "§fПриймає рівно§6 один§f енергетичний люк.", + "gtceu.multiblock.extreme_combustion_engine.description": "Екстремальний двигун внутрішнього згоряння - це багатоблочна конструкція, яка діє як генератор згоряння для IV живлення.", "gtceu.multiblock.fluid_rig.drilled_fluid": "Рідина: %s", - "gtceu.multiblock.fluid_rig.fluid_amount": "Швидкість накачування: %s", - "gtceu.multiblock.fluid_rig.no_fluid_in_area": "Немає в зоні.", - "gtceu.multiblock.fluid_rig.vein_depleted": "Жила виснажена.", - "gtceu.multiblock.fluid_rig.vein_depletion": "Розмір жили: %s", + "gtceu.multiblock.fluid_rig.fluid_amount": "Швидкість перекачування: %s", + "gtceu.multiblock.fluid_rig.no_fluid_in_area": "Немає поблизу.", + "gtceu.multiblock.fluid_rig.vein_depleted": "Поклада виснажена.", + "gtceu.multiblock.fluid_rig.vein_depletion": "Розмір поклади: %s", "gtceu.multiblock.fusion_reactor.energy": "EU: %d / %d", - "gtceu.multiblock.fusion_reactor.heat": "Нагрівання: %d", - "gtceu.multiblock.generation_eu": "Відвід: §a%s EU/т", - "gtceu.multiblock.hpca.computation": "Постачання: %s", - "gtceu.multiblock.hpca.description": "Масив високопродуктивних обчислень (МВО) — це багатоблокова структура, яка використовується для створення обчислювальних робочих одиниць (ОРО/т) для більш складних даних дослідження конвеєра. Структура має гнучку область 3x3, яку можна будь-яким чином заповнити компонентами МВО. Різні компоненти можуть забезпечувати різну кількість обчислень, охолодження, а також вартість енергії, вартість теплоносія та виробництво тепла. При використанні з мостовим компонентом МВО може приєднатися до мережевих перемикачів для об’єднання та маршрутизації обчислень із кількох джерел до одного або кількох пунктів призначення.", - "gtceu.multiblock.hpca.energy": "Використання: %s / %s EU/т (%s)", - "gtceu.multiblock.hpca.error_damaged": "Пошкоджений компонент в конструкції!", - "gtceu.multiblock.hpca.error_temperature": "Температура вище 100ºC, компоненти можуть бути пошкоджені!", - "gtceu.multiblock.hpca.hover_for_info": "Наведіть курсор, щоб отримати деталі", - "gtceu.multiblock.hpca.info_bridging_disabled": "Міст вимкнено", - "gtceu.multiblock.hpca.info_bridging_enabled": "Міст увімкнено", - "gtceu.multiblock.hpca.info_coolant_name": "Охолоджувальна рідина ПХД", + "gtceu.multiblock.fusion_reactor.heat": "Тепло: %d", + "gtceu.multiblock.generation_eu": "Виведення:§a %s EU/т", + "gtceu.multiblock.hpca.computation": "Надання: %s", + "gtceu.multiblock.hpca.description": "Високопродуктивний обчислювальний масив (ВОМ) - це багатоблочна конструкція, яка використовується для створення Обчислювальних робочих одиниць (ОРО/т) для складніших дослідницьких даних конвеєра. структура має гнучку область 3x3, яку можна заповнити компонентами ВОМ у будь-який спосіб. різні компоненти можуть забезпечувати різні обсяги обчислень, охолодження, а також витрати енергії, охолоджувальної рідини та виробництва тепла. при використанні з мостовим компонентом ВОМ може підключатися до мережевих комутаторів для об'єднання і маршрутизації обчислень від декількох джерел до одного або декількох пунктів призначення.", + "gtceu.multiblock.hpca.energy": "Живлення: %s / %s EU/т (%s)", + "gtceu.multiblock.hpca.error_damaged": "Пошкоджений компонент в структурі!", + "gtceu.multiblock.hpca.error_temperature": "Температура вище 100C, компоненти можуть бути пошкоджені!", + "gtceu.multiblock.hpca.hover_for_info": "Наведіть для подробиць", + "gtceu.multiblock.hpca.info_bridging_disabled": "Мостування вимкнено", + "gtceu.multiblock.hpca.info_bridging_enabled": "Мостування увімкнено", + "gtceu.multiblock.hpca.info_coolant_name": "ДП-охолоджуюча рідина", "gtceu.multiblock.hpca.info_max_computation": "Макс. ОРО/т: %s", - "gtceu.multiblock.hpca.info_max_coolant_required": "Потрібна охолоджувальна рідина: %s", - "gtceu.multiblock.hpca.info_max_cooling_available": "Доступне охолодження: %s", + "gtceu.multiblock.hpca.info_max_coolant_required": "Необхідна охолоджуюча рідина: %s", + "gtceu.multiblock.hpca.info_max_cooling_available": "Наявне охолодження: %s", "gtceu.multiblock.hpca.info_max_cooling_demand": "Потреба в охолодженні: %s", "gtceu.multiblock.hpca.temperature": "Температура: %s", - "gtceu.multiblock.hpca.warning_low_cooling": "— Недостатнє охолодження", - "gtceu.multiblock.hpca.warning_multiple_bridges": "— Кілька мостів у структурі (не дає додаткових переваг)", - "gtceu.multiblock.hpca.warning_no_computation": "— Немає постачальників обчислень", - "gtceu.multiblock.hpca.warning_structure_header": "Попередження щодо структури:", - "gtceu.multiblock.hpca.warning_temperature": "Температура вище 50ºC, компоненти можуть бути пошкоджені при 100ºC!", - "gtceu.multiblock.hpca.warning_temperature_active_cool": "Повністю використовуючи активні охолоджувачі", - "gtceu.multiblock.idling": "§6Простою.", - "gtceu.multiblock.implosion_compressor.description": "Вибуховий компресор — це багатоблокова структура, яка використовує вибухові речовини для перетворення пилу дорогоцінних каменів на відповідні дорогоцінні камені.", - "gtceu.multiblock.invalid_structure": "Недійсна структура.", - "gtceu.multiblock.invalid_structure.tooltip": "Цей блок є контролером багатоблокової структури. Щоб отримати допомогу зі створення, перегляньте шаблон структури в JEI.", - "gtceu.multiblock.large_boiler.description": "Великі котли є багатоблоковими, які генерують пар з джерела енергії та води. Джерелом енергії є будь-яке тверде паливо з часом горіння або дизельне/напіврідке паливо. Можна зменшити з кроком 5%%, щоб зменшити вихід пари та споживання палива.", + "gtceu.multiblock.hpca.warning_low_cooling": "- Недостатньо охолодження", + "gtceu.multiblock.hpca.warning_multiple_bridges": "- Багато мостів у структурі (не надає додаткових переваг)", + "gtceu.multiblock.hpca.warning_no_computation": "- Немає постачальників обчислень", + "gtceu.multiblock.hpca.warning_structure_header": "Попередження структури:", + "gtceu.multiblock.hpca.warning_temperature": "Температура вище 50C, компоненти можуть бути пошкоджені при 100C!", + "gtceu.multiblock.hpca.warning_temperature_active_cool": "Повне використання активних охолоджувачів", + "gtceu.multiblock.idling": "§6Очікування.", + "gtceu.multiblock.implosion_compressor.description": "Імплозійний компресор - це багатоблочна конструкція, яка використовує вибухівку для перетворення кристалічного пилу на відповідні кристали.", + "gtceu.multiblock.invalid_structure": "Неприпустима структура.", + "gtceu.multiblock.invalid_structure.tooltip": "Цей блок є контролером багатоблочної конструкції. Для отримання допомоги у створенні дивіться шаблон структури в JEI.", + "gtceu.multiblock.large_boiler.description": "Великі котли - це конструкції, які виробляють пару з джерела енергії та води. зазначеним джерелом енергії є будь-яке тверде паливо з певним часом горіння або дизельне/напіврідке паливо. Можна регулювати з кроком 5%% для зменшення виходу пари та споживання палива.", "gtceu.multiblock.large_boiler.efficiency": "Ефективність: %s", - "gtceu.multiblock.large_boiler.explosion_tooltip": "Вибухне, якщо надати паливо без води", - "gtceu.multiblock.large_boiler.heat_time_tooltip": "§7Для закипання потрібно §f%d секунд §7", - "gtceu.multiblock.large_boiler.max_temperature": "Максимальна температура: %dK, Виробництво пари: %dмВ/т", - "gtceu.multiblock.large_boiler.rate_tooltip": "§7Виробляє §f%dЛ §7пару§f з 1 вугілля", - "gtceu.multiblock.large_boiler.steam_output": "Потужність пари: %s мВ/т", + "gtceu.multiblock.large_boiler.explosion_tooltip": "Вибухне, якщо подати паливо без води", + "gtceu.multiblock.large_boiler.heat_time_tooltip": "§7Закипає за§f %d секунд", + "gtceu.multiblock.large_boiler.max_temperature": "Макс. температура: %dK, виробництво пари: %dмВ/т", + "gtceu.multiblock.large_boiler.rate_tooltip": "§7Виробляє§f %d л§7 пари за§f 1 вугілля", + "gtceu.multiblock.large_boiler.steam_output": "Вихід пари: %s мВ/т", "gtceu.multiblock.large_boiler.temperature": "Температура: %sK / %sK", "gtceu.multiblock.large_boiler.throttle": "Дросель: %d", - "gtceu.multiblock.large_boiler.throttle.tooltip": "Котел може видавати менше пари та споживати менше палива (ефективність не втрачається, не впливає на час розігріву)", - "gtceu.multiblock.large_boiler.throttle_modify": "Змінити дросель:", - "gtceu.multiblock.large_chemical_reactor.description": "Великий хімічний реактор проводить хімічні реакції зі 100% енергоефективністю. Розгін помножує швидкість і енергію на 4. Багатоблок потребує рівно 1 мідно-нікелеву котушку, який має бути розміщений поруч із корпусом ПТФЕ труби, розташованим у центрі.", - "gtceu.multiblock.large_combustion_engine.boost_disallowed": "§bОновіть вихідний шлюз, щоб увімкнути посилення кисню.", - "gtceu.multiblock.large_combustion_engine.description": "Великий двигун внутрішнього згоряння — це багатоблокова структура, яка діє як генератор згоряння для енергії ЕН.", - "gtceu.multiblock.large_combustion_engine.liquid_oxygen_amount": "Кількість рідкого кисню: %sЛ", - "gtceu.multiblock.large_combustion_engine.liquid_oxygen_boosted": "§bПосилений рідкий кисень.", - "gtceu.multiblock.large_combustion_engine.lubricant_amount": "Кількість мастила: %sЛ", - "gtceu.multiblock.large_combustion_engine.obstructed": "Впускні отвори двигуна перекрито.", - "gtceu.multiblock.large_combustion_engine.oxygen_amount": "Кількість кисню: %sЛ", - "gtceu.multiblock.large_combustion_engine.oxygen_boosted": "§bПосилений киснем.", - "gtceu.multiblock.large_combustion_engine.supply_liquid_oxygen_to_boost": "Подача рідкого кисню для прискорення.", - "gtceu.multiblock.large_combustion_engine.supply_oxygen_to_boost": "Подача кисню для прискорення.", - "gtceu.multiblock.large_miner.done": "Готово!", + "gtceu.multiblock.large_boiler.throttle.tooltip": "Котел може виробляти менше пари й споживати менше палива (ефективність не втрачається, не впливає на час нагрівання)", + "gtceu.multiblock.large_boiler.throttle_modify": "Зміна дроселю:", + "gtceu.multiblock.large_chemical_reactor.description": "Великий хімічний реактор виконує хімічні реакції зі 100% енергоефективністю. розгін збільшує швидкість і енергію в 4 рази. конструкція вимагає рівно 1 блок мельхіорової котушки, який повинен бути розміщений поруч з корпусом ПТФЕ-труби, розташованим в центрі.", + "gtceu.multiblock.large_combustion_engine.boost_disallowed": "§bОновіть динамо-люк, щоб увімкнути кисневе пришвидшення.", + "gtceu.multiblock.large_combustion_engine.description": "Великий двигун внутрішнього згоряння - це багатоблочна конструкція, яка працює як генератор внутрішнього згоряння для EV живлення.", + "gtceu.multiblock.large_combustion_engine.liquid_oxygen_amount": "Кількість рідкого кисню: %sL", + "gtceu.multiblock.large_combustion_engine.liquid_oxygen_boosted": "§bПришвидшено рідким киснем.", + "gtceu.multiblock.large_combustion_engine.lubricant_amount": "Кількість мастила: %sL", + "gtceu.multiblock.large_combustion_engine.obstructed": "Повітрозабірники двигуна заблоковані.", + "gtceu.multiblock.large_combustion_engine.oxygen_amount": "Кількість кисню: %sL", + "gtceu.multiblock.large_combustion_engine.oxygen_boosted": "§bПришвидшено киснем.", + "gtceu.multiblock.large_combustion_engine.supply_liquid_oxygen_to_boost": "Подайте рідкий кисень для пришвидшення.", + "gtceu.multiblock.large_combustion_engine.supply_oxygen_to_boost": "Подайте кисень для пришвидшення.", + "gtceu.multiblock.large_miner.done": "Завершено!", "gtceu.multiblock.large_miner.errorradius": "§cНеможливо змінити радіус під час роботи!", - "gtceu.multiblock.large_miner.invfull": "Інвентар повний!", - "gtceu.multiblock.large_miner.needsfluid": "Потрібна бурова рідина", - "gtceu.multiblock.large_miner.needspower": "Потрібна потужність!", - "gtceu.multiblock.large_miner.radius": "Радіус: §a%d§r блоків", - "gtceu.multiblock.large_miner.steam": "Потрібен пар!", - "gtceu.multiblock.large_miner.vent": "Вентиль заблоковано!", - "gtceu.multiblock.large_miner.working": "Працює…", - "gtceu.multiblock.large_turbine.description": "Великі турбіни — це багатоблоки, які виробляють енергію з пари, газів і плазми, обертаючи ротор турбіни. Виробництво енергії залежить від ефективности ротора та поточної швидкости турбіни. Корпуси коробки передач використовуються в центрі конструкції.", - "gtceu.multiblock.luv_fusion_reactor.description": "Термоядерний рекстор MK 1 — це велика багатоблокова структура, яка використовується для злиття елементів у більш важкі. Він може використовувати лише роз'єми лише АН, НТМ та ІН. Для кожного роз'єму, який він має, його буфер збільшується на 10М EU і має максимум 160М.", - "gtceu.multiblock.max_energy_per_tick": "Макс EU/т: §a%s (%s§r)", + "gtceu.multiblock.large_miner.invfull": "Вмістилище заповнено!", + "gtceu.multiblock.large_miner.needsfluid": "Потрібна бурильна рідина", + "gtceu.multiblock.large_miner.needspower": "Потрібне живлення!", + "gtceu.multiblock.large_miner.radius": "Радіус:§a %d§r блоків", + "gtceu.multiblock.large_miner.steam": "Потрібна пара!", + "gtceu.multiblock.large_miner.vent": "Вентиляція заблокована!", + "gtceu.multiblock.large_miner.working": "Опрацювання...", + "gtceu.multiblock.large_turbine.description": "Великі турбіни - це конструкції, які генерують енергію з пари, газів і плазми шляхом обертання ротора турбіни. Вихід енергії залежить від ефективності ротора та поточної швидкости турбіни. У центрі конструкції використовуються корпуси редукторів.", + "gtceu.multiblock.luv_fusion_reactor.description": "Термоядерний реактор MK 1 - це велика багатоблочна конструкція, яка використовується для злиття елементів у більш важкі. Він може використовувати лише LuV, ZPM та UV енергетичні люки. з кожним встановленим люком його буфер збільшується на 10 млн EU і може досягати 160 млн.", + "gtceu.multiblock.max_energy_per_tick": "Макс. EU/т:§a %s (%s§r)", "gtceu.multiblock.max_energy_per_tick_amps": "Макс. EU/т: %s (%sA %s)", - "gtceu.multiblock.max_energy_per_tick_hover": "Макс. EU/т, доступний для виконання рецептів або розгону", - "gtceu.multiblock.max_recipe_tier": "Макс. рівень рецепту: %s", - "gtceu.multiblock.max_recipe_tier_hover": "Макс.рівень рецептів, які можна запустити", - "gtceu.multiblock.monitor_screen.tooltip.0": "Графічний інтерфейс можна відкрити, натиснувши ПКМ викруткою.", - "gtceu.multiblock.monitor_screen.tooltip.1": "Проксі-режим цифрового інтерфейсу модифікатора може делегувати можливости машин і інтерфейс. (Так, ви можете приєднати канали безпосередньо на екрані.)", - "gtceu.multiblock.monitor_screen.tooltip.2": "Екран також підтримує плаґіни.", - "gtceu.multiblock.multi_furnace.description": "Багатотопильня — це багатоблокова структура, яка використовується для топлення величезної кількости предметів одночасно. Різні яруси котушок забезпечують прискорення швидкости та підвищення енергоефективности. 32 — це базове значення кількости предметів, що витопляться за операцію, і його можна помножити за допомогою котушок вищого рівня.", - "gtceu.multiblock.multi_furnace.heating_coil_discount": "Прискорення EU нагрівальної котушки: %sx", + "gtceu.multiblock.max_energy_per_tick_hover": "Максимальна кількість EU/т, доступна для запуску обробки або розгону", + "gtceu.multiblock.max_recipe_tier": "Макс. рівень обробки: %s", + "gtceu.multiblock.max_recipe_tier_hover": "Максимальний рівень обробки, який можна запускати", + "gtceu.multiblock.monitor_screen.tooltip.0": "Графічний інтерфейс можна відкрити клацанням ПКМ із викруткою.", + "gtceu.multiblock.monitor_screen.tooltip.1": "Проксі-режим цифрового інтерфейсу кришок може розподіляти можливості машини та графічного інтерфейсу. (Так, ви можете з'єднувати труби безпосередньо на екрані.)", + "gtceu.multiblock.monitor_screen.tooltip.2": "Екран також підтримує плагіни.", + "gtceu.multiblock.multi_furnace.description": "Мультиплавильна піч - це багатоблочна конструкція, яка використовується для витоплення великої кількості предметів одночасно. різні рівні котушок забезпечують підвищення швидкости та енергоефективності. 32 - це базове значення кількості предметів, що перетоплюються за одну операцію, і може бути збільшене шляхом використання котушок вищого рівня.", + "gtceu.multiblock.multi_furnace.heating_coil_discount": "Прискорення EU нагрівальною котушкою: %sx", "gtceu.multiblock.multi_furnace.heating_coil_level": "Рівень нагрівальної котушки: %s", "gtceu.multiblock.multiple_recipemaps.header": "Режим машини:", - "gtceu.multiblock.multiple_recipemaps.switch_message": "Машина має бути вимкнена, щоб перемикати режими!", - "gtceu.multiblock.multiple_recipemaps.tooltip": "Використайте викрутку на контролері, щоб змінити режим роботи машини", - "gtceu.multiblock.multiple_recipemaps_recipes.tooltip": "Режими машини: §e%s§r", - "gtceu.multiblock.network_switch.description": "Мережевий перемикач — це багатоблокова структура, яка використовується для розподілу обчислень із багатьох джерел до багатьох пунктів призначення. Він може приймати будь-яку кількість роз'ємів прийому або передачі даних обчислення. Це необхідно для дослідницьких даних, які потребують значно більших обчислень, оскільки дослідницька станція може прийняти лише один шлюз прийому обчислювальних даних. МВО повинні мати компонент моста для мережевого комутатора, щоб мати доступ до їхніх обчислень.", + "gtceu.multiblock.multiple_recipemaps.switch_message": "Для перемикання режимів машина повинна бути вимкнена!", + "gtceu.multiblock.multiple_recipemaps.tooltip": "Використовуйте викрутку на контролері, щоб змінити режим роботи машини.", + "gtceu.multiblock.multiple_recipemaps_recipes.tooltip": "Режими машини:§e %s§r", + "gtceu.multiblock.network_switch.description": "Мережевий комутатор - це багатоблочна конструкція, яка використовується для розподілу обчислень від багатьох джерел до багатьох пунктів призначення. Він може приймати будь-яку кількість люків приймання або передачі обчислювальних даних. Це необхідно для дослідницьких даних, які вимагають набагато більшого обсягу обчислень, оскільки дослідницька станція може прийняти лише один люк приймання обчислювальних даних. ВОМ повинні мати мостовий компонент, щоб мережевий комутатор міг отримати доступ до їхніх обчислень.", "gtceu.multiblock.not_enough_energy": "ПОПЕРЕДЖЕННЯ: Машині потрібно більше енергії.", - "gtceu.multiblock.not_enough_energy_output": "УВАГА: Занизький рівень виходу енергії!", - "gtceu.multiblock.ore_rig.drilled_ore_entry": " — %s", + "gtceu.multiblock.not_enough_energy_output": "ПОПЕРЕДЖЕННЯ: рівень енергетичного динамо занадто низький!", + "gtceu.multiblock.ore_rig.drilled_ore_entry": " - %s", "gtceu.multiblock.ore_rig.drilled_ores_list": "Руди:", "gtceu.multiblock.ore_rig.ore_amount": "Швидкість буріння: %s", - "gtceu.multiblock.output_line.0": "%s x §e%s§r (%ss/ea)", - "gtceu.multiblock.output_line.1": "%s x §e%s§r (%s/c)", - "gtceu.multiblock.output_line.2": "%s ≈ §e%s§r (%ss/ea)", - "gtceu.multiblock.output_line.3": "%s ≈ §e%s§r (%s/c)", - "gtceu.multiblock.page_switcher.io.both": "§5Комбіновані входи + виходи", + "gtceu.multiblock.output_line.0": "%s x§e %s§r (%sс/од)", + "gtceu.multiblock.output_line.1": "%s x§e %s§r (%s/с)", + "gtceu.multiblock.output_line.2": "%s ≈§e %s§r (%sс/од)", + "gtceu.multiblock.output_line.3": "%s ≈§e %s§r (%s/с)", + "gtceu.multiblock.page_switcher.io.both": "§5Комбіновані входи/виходи", "gtceu.multiblock.page_switcher.io.export": "§4Виходи", "gtceu.multiblock.page_switcher.io.import": "§2Входи", "gtceu.multiblock.parallel": "Паралельне виконання до %d рецептів", - "gtceu.multiblock.parallel.exact": "Виконання %d рецептів паралельно", - "gtceu.multiblock.parallelizable.tooltip": "Можна розпаралелювати за допомогою штрихів паралельного керування.", - "gtceu.multiblock.pattern.clear_amount_1": "§6Повинен мати вільний простір 1x1x1 спереду§r", - "gtceu.multiblock.pattern.clear_amount_3": "§6 Попереду має бути вільний простір 3x3x1§r", - "gtceu.multiblock.pattern.error": "Очікувані компоненти (%s) на (%s).", - "gtceu.multiblock.pattern.error.batteries": "§cУсі батареї мають бути однаковими§r", - "gtceu.multiblock.pattern.error.coils": "§cУсі нагрівальні котушки мають бути однаковими§r", - "gtceu.multiblock.pattern.error.filters": "§cУсі фільтри мають бути однаковими§r", + "gtceu.multiblock.parallel.exact": "- %dx від паралелей", + "gtceu.multiblock.parallelizable.tooltip": "Може працювати паралельно за допомогою паралельних керуючих люків.", + "gtceu.multiblock.pattern.clear_amount_1": "§6Спереду має бути вільний простір 1х1х1§r", + "gtceu.multiblock.pattern.clear_amount_3": "§6Спереду має бути вільний простір 3x3x1§r", + "gtceu.multiblock.pattern.error": "Очікувалися компоненти (%s) у (%s).", + "gtceu.multiblock.pattern.error.batteries": "§cВсі батареї повинні бути однаковими§r", + "gtceu.multiblock.pattern.error.coils": "§cВсі нагрівальні котушки повинні бути однаковими§r", + "gtceu.multiblock.pattern.error.filters": "§cВсі фільтри повинні бути однаковими§r", "gtceu.multiblock.pattern.error.limited.0": "§cМаксимум: %d§r", - "gtceu.multiblock.pattern.error.limited.1": "§cМінімум: %d§r", - "gtceu.multiblock.pattern.error.limited.2": "§cМаксимум: %d на шар§r", - "gtceu.multiblock.pattern.error.limited.3": "§cМінімум: %d на шар§r", - "gtceu.multiblock.pattern.error.limited_exact": "§cТочно: %d§r", - "gtceu.multiblock.pattern.error.limited_within": "§cМіж %d і %d§r", - "gtceu.multiblock.pattern.location_end": "§cСамий кінець", - "gtceu.multiblock.pattern.replaceable_air": "Можна замінити на повітрі", - "gtceu.multiblock.pattern.single": "§6Можна використовувати лише цей блок§r", - "gtceu.multiblock.power_substation.average_in": "§7Середнє введення: %s §7EU/т", - "gtceu.multiblock.power_substation.average_in_hover": "Середнє вставлене EU у внутрішній енергонакопичувач підстанції", - "gtceu.multiblock.power_substation.average_out": "§7Середній вихід: %s §7EU/т", - "gtceu.multiblock.power_substation.average_out_hover": "Середній витяг EU із внутрішнього енергонакопичувача підстанції", - "gtceu.multiblock.power_substation.capacity": "§7Місткість: %s §7EU", - "gtceu.multiblock.power_substation.passive_drain": "§7Пасивний злив: %s ​​§7EU/т", - "gtceu.multiblock.power_substation.stored": "§7Збережено: %s §7EU", + "gtceu.multiblock.pattern.error.limited.1": "§cМаксимум: %d§r", + "gtceu.multiblock.pattern.error.limited.2": "§cМаксимум: %d за шар§r", + "gtceu.multiblock.pattern.error.limited.3": "§cМаксимум: %d за шар§r", + "gtceu.multiblock.pattern.error.limited_exact": "§cРівно: %d§r", + "gtceu.multiblock.pattern.error.limited_within": "§cМіж %d та %d§r", + "gtceu.multiblock.pattern.location_end": "§cТочно енд§r", + "gtceu.multiblock.pattern.replaceable_air": "Замінюється повітрям", + "gtceu.multiblock.pattern.single": "§6Можна використовувати тільки цей блок§r", + "gtceu.multiblock.power_substation.average_in": "§7Серед. Вхід: %s§7 EU/т", + "gtceu.multiblock.power_substation.average_in_hover": "Середній обсяг EU, вкладеної у внутрішній резерв енергії електропідстанції", + "gtceu.multiblock.power_substation.average_out": "§7Серед. Вихід: %s§7 EU/т", + "gtceu.multiblock.power_substation.average_out_hover": "Середній обсяг EU, виведеної з внутрішнього резерву енергії електропідстанції", + "gtceu.multiblock.power_substation.capacity": "§7Місткість: %s§7 EU", + "gtceu.multiblock.power_substation.passive_drain": "§7Пасивне розряджання: %s§7 EU/т", + "gtceu.multiblock.power_substation.stored": "§7Збережено: %s§7 EU", "gtceu.multiblock.power_substation.time_days": "%s днів", - "gtceu.multiblock.power_substation.time_forever": "Назавжди", + "gtceu.multiblock.power_substation.time_forever": "Вічно", "gtceu.multiblock.power_substation.time_hours": "%s годин", "gtceu.multiblock.power_substation.time_minutes": "%s хвилин", "gtceu.multiblock.power_substation.time_seconds": "%s секунд", - "gtceu.multiblock.power_substation.time_to_drain": "§7Час до зливу: %s", - "gtceu.multiblock.power_substation.time_to_fill": "§7Час до заповнення: %s", + "gtceu.multiblock.power_substation.time_to_drain": "§7Часу до розрядження: %s", + "gtceu.multiblock.power_substation.time_to_fill": "§7Часу до заповнення: %s", "gtceu.multiblock.power_substation.time_years": "%s років", "gtceu.multiblock.power_substation.under_one_hour_left": "Менше 1 години до повного розрядження!", - "gtceu.multiblock.preview.rotate": "Натисніть і перетягніть, щоб повернути", - "gtceu.multiblock.preview.select": "ПКМ, щоб перевірити кандидатів", - "gtceu.multiblock.preview.zoom": "Використовуйте коліщатко миші або клацніть правою кнопкою миші + перетягніть для збільшення", - "gtceu.multiblock.primitive_blast_furnace.bronze.description": "Примітивна доменна піч (PBF) — це багатоблокова структура, яка використовувалася для варіння сталі на ранніх етапах гри. Хоча вона не дуже швидка, вона забезпечить вас сталлю для перших установок.", - "gtceu.multiblock.primitive_water_pump.description": "Примітивний водяний насос — це багатоблокова структура до Парової ери, який збирає воду один раз на секунду, залежно від біома, у якому він знаходиться. Він може використовувати помпу, НнН або Нн вихідний шлюз, збільшуючи кількість води на рівень. За формулою: Коефіцієнт біому * Множник шлюза.", - "gtceu.multiblock.primitive_water_pump.extra1.0": "Коефіцієнт біому:", - "gtceu.multiblock.primitive_water_pump.extra1.1": " Океан, річка: 1000 мВ/с", - "gtceu.multiblock.primitive_water_pump.extra1.2": " Болото: 800 мВ/с", - "gtceu.multiblock.primitive_water_pump.extra1.3": " Джунглі: 350 мВ/с", - "gtceu.multiblock.primitive_water_pump.extra1.4": " Снігові: 300 мВ/с", - "gtceu.multiblock.primitive_water_pump.extra1.5": " Рівнини, ліс: 250 мВ/с", - "gtceu.multiblock.primitive_water_pump.extra1.6": " Тайга: 175 мВ/с", - "gtceu.multiblock.primitive_water_pump.extra1.7": " Пляж: 170 мВ/с", - "gtceu.multiblock.primitive_water_pump.extra1.8": " Інші: 100 мВ/с", - "gtceu.multiblock.primitive_water_pump.extra2.0": "Множники шлюза:", - "gtceu.multiblock.primitive_water_pump.extra2.1": " Шлюз помпи: 1x", - "gtceu.multiblock.primitive_water_pump.extra2.2": " НнН вихідний шлюз: 2x", - "gtceu.multiblock.primitive_water_pump.extra2.3": " НН вихідний шлюз: 4x", + "gtceu.multiblock.preview.rotate": "Клацніть та перемістіть для обертання", + "gtceu.multiblock.preview.select": "Клацніть ПКМ, щоб перевірити кандидатів", + "gtceu.multiblock.preview.zoom": "Обертайте коліщатко або переміщуйте із затиснутою ПКМ, щоб масштабувати", + "gtceu.multiblock.primitive_blast_furnace.bronze.description": "Примітивна сталеливарня (ПС) - це багатоблочна конструкція, яка використовується для витоплення сталі на початку гри. Хоч і не дуже швидко, але вона забезпечить вас сталлю для перших установок.", + "gtceu.multiblock.primitive_water_pump.description": "Примітивна водяна помпа - це конструкція до-парової епохи, яка збирає воду раз на секунду, залежно від біома, в якому вона знаходиться. Вона може використовувати вивідний люк помпи, ULV або LV, збільшуючи кількість води за рівень. розраховується за формулою: коефіцієнт біома * Множник люка.", + "gtceu.multiblock.primitive_water_pump.extra1.0": "Коефіцієнт біома:", + "gtceu.multiblock.primitive_water_pump.extra1.1": " океан, річка: 1000 мВ/с", + "gtceu.multiblock.primitive_water_pump.extra1.2": " болото: 800 мВ/с", + "gtceu.multiblock.primitive_water_pump.extra1.3": " джунглі: 350 мВ/с", + "gtceu.multiblock.primitive_water_pump.extra1.4": " сніга: 300 мВ/с", + "gtceu.multiblock.primitive_water_pump.extra1.5": " рівнини, ліс: 250 мВ/с", + "gtceu.multiblock.primitive_water_pump.extra1.6": " тайга: 175 мВ/с", + "gtceu.multiblock.primitive_water_pump.extra1.7": " пляж: 170 мВ/с", + "gtceu.multiblock.primitive_water_pump.extra1.8": " інші: 100 мВ/с", + "gtceu.multiblock.primitive_water_pump.extra2.0": "Множники люків:", + "gtceu.multiblock.primitive_water_pump.extra2.1": " Люк помпи: 1x", + "gtceu.multiblock.primitive_water_pump.extra2.2": " ULV вивідний люк: 2x", + "gtceu.multiblock.primitive_water_pump.extra2.3": " LV вивідний люк: 4x", "gtceu.multiblock.primitive_water_pump.extra2.4": "", - "gtceu.multiblock.primitive_water_pump.extra2.5": "Під час дощу в біомі помпи загальне виробництво води буде збільшено на 50%%.", - "gtceu.multiblock.progress": "Прогрес: %sс / %sс (%s%%)", + "gtceu.multiblock.primitive_water_pump.extra2.5": "Під час дощу в біомі викачування загальне виробництво води збільшиться на 50%%.", + "gtceu.multiblock.progress": "Прогрес: %ss / %ss (%s%%)", "gtceu.multiblock.progress_percent": "Прогрес: %s%%", - "gtceu.multiblock.pyrolyse_oven.description": "Піролізна піч — це багатоблокова структура, яка використовується для перетворення колод на деревне вугілля та креозотове масло, або золу та важке масло.", + "gtceu.multiblock.pyrolyse_oven.description": "Піролізна піч - це багатоблочна конструкція, яка використовується для перетворення колод на деревне вугілля та креозотову олію, або попіл та важку нафту.", "gtceu.multiblock.pyrolyse_oven.speed": "Швидкість обробки: %s%%", - "gtceu.multiblock.require_steam_parts": "Потрібні парові шлюзи та шини!", - "gtceu.multiblock.research_station.description": "Дослідницька станція — це багатоблокова структура, яка використовується для дослідження набагато складніших дослідницьких даних конвеєра. Будь-яке дослідження, для якого потрібна сфера даних або модуль даних, має бути скановано на дослідницькій станції. Для дослідження рецептів потрібні обчислювальні робочі одиниці (ОРО/т), які надаються високопродуктивними обчислювальними масивами (МВО).", + "gtceu.multiblock.require_steam_parts": "Потрібні парові люки та шини!", + "gtceu.multiblock.research_station.description": "Дослідницька станція - це багатоблочна конструкція, яка використовується для дослідження набагато складніших дослідницьких даних конвеєрної лінії. Будь-яке дослідження, що вимагає сфери даних або модуля даних, має бути відскановане в дослідницькій станції. Для дослідження рецептів потрібні обчислювальні робочі одиниці (ОРО/т), які надаються високопродуктивними обчислювальними масивами (ВОМ).", "gtceu.multiblock.research_station.researching": "§6Дослідження.", - "gtceu.multiblock.running": "Працює ідеально.", - "gtceu.multiblock.steam.duration_modifier": "Для обробки потрібна базова тривалість §f1.5x §7, не залежить від кількости предметів.", - "gtceu.multiblock.steam.low_steam": "Недостатньо пару для запуску!", - "gtceu.multiblock.steam.steam_stored": "Пар: %s / %s мб", - "gtceu.multiblock.steam_grinder.description": "Багатоблоковий подрібнювач в епоху пару. Для формування потрібно щонайменше 14 обшивок з олов'яної бронзи. Не можна використовувати звичайні шини входу/виходу, а також рідинні шлюзи, окрім парового шлюзу.", - "gtceu.multiblock.steam_oven.description": "Багатотопильне виробництво в епоху пару. Для формування потрібно щонайменше 6 шлюзів з олов'яної бронзи. Не можна використовувати звичайні шини входу/виходу, а також рідинні шлюзи, окрім парового шлюза. Паровий шлюз має бути на нижньому шарі, не більше одного.", - "gtceu.multiblock.subtick_parallels": "— %dx від розгону", - "gtceu.multiblock.title": "Шаблон багатоблока", + "gtceu.multiblock.running": "Працює бездоганно.", + "gtceu.multiblock.steam.duration_modifier": "Забирає§f 1.5x§7 базової тривалости обробки, не залежить від кількості предметів.", + "gtceu.multiblock.steam.low_steam": "Недостатньо пари для роботи!", + "gtceu.multiblock.steam.steam_stored": "Пара: %s / %s mb", + "gtceu.multiblock.steam_grinder.description": "Багатоблочний подрібнювач парової епохи. Для формування потребує щонайменше 14 бронзових корпусів. Не може використовувати звичайні вхідні/вихідні шини, а також рідинні люки, окрім парового.", + "gtceu.multiblock.steam_oven.description": "Мультиплавильна піч парової епохи. Для формування потрібно щонайменше 6 бронзових корпусів. Не можна використовувати звичайні вхідні/вихідні шини, а також рідинні люки, окрім парового. паровий люк повинен бути на нижньому шарі, не більше одного.", + "gtceu.multiblock.subtick_parallels": "- %dx від розгону", + "gtceu.multiblock.title": "Шаблон конструкції", "gtceu.multiblock.total_runs": "Виконання %d рецептів одночасно", - "gtceu.multiblock.turbine.efficiency": "ККД турбіни: %s%%", - "gtceu.multiblock.turbine.efficiency_tooltip": "Кожен тримач ротора вище %s §7додає §f10%% ефективности та множить EU/т на 2§7.", + "gtceu.multiblock.turbine.efficiency": "Ефективність турбіни: %s%%", + "gtceu.multiblock.turbine.efficiency_tooltip": "Кожен тримач ротора вище %s§7 додає§f 10%% ефективності і множить EU/т на 2§7.", "gtceu.multiblock.turbine.energy_per_tick": "Вихід енергії: %s/%s EU/т", "gtceu.multiblock.turbine.energy_per_tick_maxed": "Вихід енергії: %s EU/т", - "gtceu.multiblock.turbine.fuel_amount": "Кількість палива: %sЛ (%s)", + "gtceu.multiblock.turbine.fuel_amount": "Кількість палива: %sL (%s)", "gtceu.multiblock.turbine.fuel_needed": "Споживає %s за %s тактів", - "gtceu.multiblock.turbine.obstructed": "Ротор турбіни перекритий", - "gtceu.multiblock.turbine.rotor_durability": "Стійкість ротора: %s%%", - "gtceu.multiblock.turbine.rotor_speed": "Швидкість ротора: %s/%s об./хв.", - "gtceu.multiblock.universal.distinct": "Окремі шини:", - "gtceu.multiblock.universal.distinct.info": "Якщо ввімкнено, кожна вхідна предметна шина розглядатиметься як повністю відмінна одна від одної для пошуку рецептів. Корисно для таких речей, як запрограмовані схеми, форми екструдора тощо.", + "gtceu.multiblock.turbine.obstructed": "Перешкода на шляху турбіни", + "gtceu.multiblock.turbine.rotor_durability": "Міцність ротора: %s%%", + "gtceu.multiblock.turbine.rotor_speed": "Швидкість ротора: %s/%s RPM", + "gtceu.multiblock.universal.distinct": "Відокремленні шини:", + "gtceu.multiblock.universal.distinct.info": "Якщо увімкнено, кожна вхідна предметна шина буде розглядатися як повністю відмінна одна від одної для пошуку рецептів. корисно для таких речей, як програмні плати, формові відтиски тощо.", "gtceu.multiblock.universal.distinct.no": "Ні", "gtceu.multiblock.universal.distinct.yes": "Так", - "gtceu.multiblock.universal.has_problems": "Має проблеми з обслуговуванням!", - "gtceu.multiblock.universal.has_problems_header": "Виправте наступні проблеми в шлюзі обслуговування:", - "gtceu.multiblock.universal.muffler_obstructed": "Заглушений шлюз заблоковано!", - "gtceu.multiblock.universal.muffler_obstructed.tooltip": "Заглушений шлюз повинен мати блок повітряного простору перед ним.", - "gtceu.multiblock.universal.no_problems": "Немає проблем з обслуговуванням!", - "gtceu.multiblock.universal.problem.crowbar": "§7Цьому тут не місце. (§aЛом§7)", - "gtceu.multiblock.universal.problem.hard_hammer": "§7Покриття має вм'ятини. (§aЖорсткий молот§7)", - "gtceu.multiblock.universal.problem.screwdriver": "§7Гвинти ослаблені. (§aВикрутка§7)", - "gtceu.multiblock.universal.problem.soft_mallet": "§7Щось застрягло. (§aМ'який молоток§7)", - "gtceu.multiblock.universal.problem.wire_cutter": "§7Дроти перегоріли. (§aКусачки для дротів§7)", - "gtceu.multiblock.universal.problem.wrench": "§7Труба ослаблена. (§aГайковий ключ§7)", + "gtceu.multiblock.universal.has_problems": "Наявні проблеми з технічним обслуговуванням!", + "gtceu.multiblock.universal.has_problems_header": "Виправте наведені нижче проблеми в люку технічного обслуговування:", + "gtceu.multiblock.universal.muffler_obstructed": "Люк вихлопу перекрито!", + "gtceu.multiblock.universal.muffler_obstructed.tooltip": "Люк вихлопу повинен мати блок повітряного простору перед собою.", + "gtceu.multiblock.universal.no_problems": "Немає проблем з технічним обслуговуванням!", + "gtceu.multiblock.universal.problem.crowbar": "%s§7Цьому тут не місце. (§aЛом§7)", + "gtceu.multiblock.universal.problem.hard_hammer": "%s§7Покриття має вм'ятини. (§aМолот§7)", + "gtceu.multiblock.universal.problem.screwdriver": "%s§7Гвинти розхитані. (§aВикрутка§7)", + "gtceu.multiblock.universal.problem.soft_mallet": "%s§7Щось заклинило. (§aКиянка§7)", + "gtceu.multiblock.universal.problem.wire_cutter": "%s§7Дроти перегоріли. (§aКусачки§7)", + "gtceu.multiblock.universal.problem.wrench": "%s§7Труба відійшла. (§aКлюч§7)", "gtceu.multiblock.universal.rotor_obstructed": "Ротор заблоковано!", - "gtceu.multiblock.uv_fusion_reactor.description": "Термоядерний реактор MK 3 — це велика багатоблокова структура, яка використовується для злиття елементів у важчі. Він може використовувати лише роз'єми енергії ІН. Для кожного шлюза, який він має, його буфер збільшується на 40М EU і має максимум 640М.", - "gtceu.multiblock.vacuum_freezer.description": "Вакуумна морозильна камера — це багатоблокова структура, яка в основному використовується для заморожування гарячих злитків у звичайні злитки. Однак він також може заморожувати інші речовини, наприклад воду.", - "gtceu.multiblock.validation_failed": "Недійсна кількість входів/виходів.", + "gtceu.multiblock.uv_fusion_reactor.description": "Термоядерний реактор MK 3 - це велика багатоблочна конструкція, яка використовується для злиття елементів у більш важкі. Він може використовувати лише UV енергетичні люки. з кожним встановленим люком його буфер збільшується на 40 млн EU і може досягати 640 млн.", + "gtceu.multiblock.vacuum_freezer.description": "Вакуумна морозильна камера - це багатоблочна конструкція, яка в основному використовується для охолодження розпечених злитків у звичайні. Однак вона також може заморожувати інші речовини, такі як вода.", + "gtceu.multiblock.validation_failed": "Неправильна кількість входів/виходів.", "gtceu.multiblock.waiting": "ПОПЕРЕДЖЕННЯ: Машина очікує.", - "gtceu.multiblock.work_paused": "Роботу призупинено.", - "gtceu.multiblock.zpm_fusion_reactor.description": "Термоядерний реактор MK 2 — це велика багатоблокова структура, яка використовується для злиття елементів у більш важкі. Він може використовувати лише роз'єми енергії НТМ та ІН. Для кожного шлюза, який він має, його буфер збільшується на 20М EU і має максимум 320М.", - "gtceu.oc.tooltip.0": "Мін.: %s", - "gtceu.oc.tooltip.1": "ЛКМ, щоб збільшити ОС", - "gtceu.oc.tooltip.2": "ПКМ, щоб зменшити ОС", - "gtceu.oc.tooltip.3": "СКМ, щоб скинути ОС", - "gtceu.oc.tooltip.4": "Утримуйте Shift, щоб змінити на ідеальний ОС", - "gtceu.ore_washer": "Очисник руд", - "gtceu.ownership.name.argonauts": "Гільдія Арґонавтів", - "gtceu.ownership.name.ftb": "Команди FTB", + "gtceu.multiblock.work_paused": "Робота зупинена.", + "gtceu.multiblock.zpm_fusion_reactor.description": "Термоядерний реактор MK 2 - це велика багатоблочна конструкція, яка використовується для злиття елементів у більш важкі. Він може використовувати лише ZPM та UV енергетичні люки. з кожним встановленим люком його буфер збільшується на 20 млн EU і може досягати 320 млн.", + "gtceu.oc.tooltip.0": "Мінімум: %s", + "gtceu.oc.tooltip.1": "ЛКМ, щоб збільшити розгін", + "gtceu.oc.tooltip.2": "ПКМ, щоб зменшити розгін", + "gtceu.oc.tooltip.3": "СКМ, щоб скинути розгін", + "gtceu.oc.tooltip.4": "Утримуйте Shift, щоб змінювати ідеальний розгін", + "gtceu.ore_washer": "Рудопромивач", + "gtceu.ownership.name.argonauts": "Гільдія Аргонавтів", + "gtceu.ownership.name.ftb": "FTB Teams", "gtceu.ownership.name.player": "Гравець", "gtceu.packer": "Пакувальник", - "gtceu.part_sharing.disabled": "Поширення багатоблока: §4ВИМК.", - "gtceu.part_sharing.enabled": "Поширення багатоблока: §aУВІМК.", - "gtceu.placeholder_info.active.0": "Повертає 1, якщо блок, до якого прикріплено модифікатор, зараз виконує рецепт, 0 в іншому випадку.", + "gtceu.part_sharing.disabled": "Спільний доступ конструкції§4 вимкнено", + "gtceu.part_sharing.enabled": "Спільний доступ конструкції§a увімкнено", + "gtceu.placeholder_info.active.0": "Повертає 1, якщо блок, до якого прикріплена кришка, в даний момент виконує рецепт, інакше повертає 0.", "gtceu.placeholder_info.active.1": "Використання:", - "gtceu.placeholder_info.active.2": " {active} -> чи є поточний запущений рецепт", - "gtceu.placeholder_info.ae2crafting.0": "Повертає інформацію про автомайстрування в мережі ME блока, на якому знаходиться цей модифікатор.", + "gtceu.placeholder_info.active.2": " {active} -> чи є рецепт, який зараз виконується", + "gtceu.placeholder_info.ae2crafting.0": "Повертає інформацію про автоматичне вироблення в мережі ME блоку, на якому знаходиться ця кришка.", "gtceu.placeholder_info.ae2crafting.1": "Використання:", - "gtceu.placeholder_info.ae2crafting.10": " {ae2crafting get time} -> кількість часу, що минув від початку майстрування (у наносекундах), або 0, якщо ЦП неактивний", - "gtceu.placeholder_info.ae2crafting.2": " {ae2crafting get amount} -> кількість крафтових процесорів у мережі ME", - "gtceu.placeholder_info.ae2crafting.3": " {ae2crafting get storage} -> обсяг пам'яті для майстрування, який має вказаний ЦП", - "gtceu.placeholder_info.ae2crafting.4": " {ae2crafting get threads} -> кількість співпроцесорів, які має вказаний ЦП", - "gtceu.placeholder_info.ae2crafting.5": " {ae2crafting get name} -> ім'я вказаного ЦП майстрування", - "gtceu.placeholder_info.ae2crafting.6": " {ae2crafting get selectionMode} -> режим вибору вказаного ЦП майстрування (використовується для ручного, автоматичного або обох запитів)", - "gtceu.placeholder_info.ae2crafting.7": " {ae2crafting get amount} -> кількість запитаного предмета або 0, якщо ЦП неактивний", - "gtceu.placeholder_info.ae2crafting.8": " {ae2crafting get item} -> відображуване ім'я запитаного елемента або 0, якщо ЦП неактивний", - "gtceu.placeholder_info.ae2crafting.9": " {ae2crafting get progress} -> прогрес крафтового завдання або 0, якщо ЦП неактивний", - "gtceu.placeholder_info.ae2energy.0": "Повертає енергію, яка зараз зберігається в мережі ME блока, на якому знаходиться цей модифікатор.", + "gtceu.placeholder_info.ae2crafting.10": " {ae2crafting get time} -> кількість часу, що минула з моменту запуску програми (в наносекундах), або 0, якщо процесор не працює", + "gtceu.placeholder_info.ae2crafting.2": " {ae2crafting get amount} -> кількість процесорів вироблення у мережі ME", + "gtceu.placeholder_info.ae2crafting.3": " {ae2crafting get storage} -> обсяг пам'яті вироблення, що має вказаний процесор", + "gtceu.placeholder_info.ae2crafting.4": " {ae2crafting get threads} -> співпроцесорів, що має вказаний процесор", + "gtceu.placeholder_info.ae2crafting.5": " {ae2crafting get name} -> назва вказаного процесора вироблення", + "gtceu.placeholder_info.ae2crafting.6": " {ae2crafting get selectionMode} -> режим вибору зазначеного процесора для вироблення (використовується для ручних, автоматичних або обох типів запитів)", + "gtceu.placeholder_info.ae2crafting.7": " {ae2crafting get amount} -> кількість запитуваного предмета або 0, якщо процесор не виконує задач", + "gtceu.placeholder_info.ae2crafting.8": " {ae2crafting get item} -> відображуване ім'я запитуваного предмета або 0, якщо процесор не виконує задач", + "gtceu.placeholder_info.ae2crafting.9": " {ae2crafting get progress} -> прогрес виконання вироблення або 0, якщо процесор не виконує задач", + "gtceu.placeholder_info.ae2energy.0": "Повертає енергію, яка наразі зберігається в мережі ME блоку, на якому знаходиться ця кришка.", "gtceu.placeholder_info.ae2energy.1": "Використання:", "gtceu.placeholder_info.ae2energy.2": " {ae2energy} -> енергія в мережі ME (в одиницях AE)", - "gtceu.placeholder_info.ae2fluidCount.0": "Те саме, що fluidCount, але підраховує предмети в мережі ME блока, до якого прикріплено цей модифікатор.", + "gtceu.placeholder_info.ae2fluidCount.0": "Те саме, що fluidCount, але підраховує предмети в мережі ME блоку, до якого приєднано цю кришку.", "gtceu.placeholder_info.ae2fluidCount.1": "Зверніть увагу, що підрахунок усіх рідин може спричинити затримку!", "gtceu.placeholder_info.ae2fluidCount.2": "Використання:", - "gtceu.placeholder_info.ae2fluidCount.3": " {fluidCount [fluidId]} -> кількість усіх рідин або рідини з fluidId, якщо вказано", - "gtceu.placeholder_info.ae2itemCount.0": "Те саме, що itemCount, але підраховує предмети в мережі ME блока, до якого прикріплено цей модифікатор.", - "gtceu.placeholder_info.ae2itemCount.1": "Зверніть увагу, що підрахунок за фільтром або за всіма предметами може спричинити затримку!", + "gtceu.placeholder_info.ae2fluidCount.3": " {fluidCount [fluidId]} -> кількість усіх рідин або рідини з fluidId, якщо зазначено", + "gtceu.placeholder_info.ae2itemCount.0": "Те саме, що itemCount, але підраховує предмети в мережі ME блоку, до якого приєднано цю кришку.", + "gtceu.placeholder_info.ae2itemCount.1": "Зауважте, що підрахунок за фільтром або всіма предметами може спричинити затримку!", "gtceu.placeholder_info.ae2itemCount.2": "Використання:", - "gtceu.placeholder_info.ae2itemCount.3": " {itemCount} -> загальна кількість предметів", - "gtceu.placeholder_info.ae2itemCount.4": " {itemCount } -> кількість предметів з ID, що дорівнюють item_id", - "gtceu.placeholder_info.ae2itemCount.5": " {itemCount filter } -> кількість предметів, які відповідають фільтру у вказаному слоті цього модифікатора", - "gtceu.placeholder_info.ae2maxPower.0": "Повертає енергоємність мережі ME блока, на якому знаходиться цей модифікатор.", + "gtceu.placeholder_info.ae2itemCount.3": " {itemCount} -> загальна кількість предметів", + "gtceu.placeholder_info.ae2itemCount.4": " {itemCount } -> кількість предметів з ідентифікаторами, що дорівнюють item_id", + "gtceu.placeholder_info.ae2itemCount.5": " {itemCount filter } -> кількість предметів, що відповідають фільтру, у вказаному слоті цієї кришки", + "gtceu.placeholder_info.ae2maxPower.0": "Повертає енергетичну місткість мережі МЕ блоку, на якому ця кришка включена.", "gtceu.placeholder_info.ae2maxPower.1": "Використання:", - "gtceu.placeholder_info.ae2maxPower.2": " {ae2maxPower} -> енергетична потужність мережі ME", - "gtceu.placeholder_info.ae2powerUsage.0": "Повертає споживання енергії мережею ME блоку, на якому знаходиться цей модифікатор.", + "gtceu.placeholder_info.ae2maxPower.2": " {ae2maxPower} -> енергетична потужність мережі МЕ", + "gtceu.placeholder_info.ae2powerUsage.0": "Повертає енергоспоживання мережі МЕ блоку, на якому ця кришка включена.", "gtceu.placeholder_info.ae2powerUsage.1": "Використання:", - "gtceu.placeholder_info.ae2powerUsage.2": " {ae2powerUsage} -> енергоспоживання мережі ME", - "gtceu.placeholder_info.ae2spatial.0": "Повертає інформацію про просторовий ввід/вивід у мережі ME блока, на якому знаходиться цей модифікатор.", + "gtceu.placeholder_info.ae2powerUsage.2": " {ae2powerUsage} -> енергоспоживання мережі МЕ", + "gtceu.placeholder_info.ae2spatial.0": "Повертає інформацію про просторовий ввід/вивід у мережі МЕ блоку, до якого приєднано цю кришку.", "gtceu.placeholder_info.ae2spatial.1": "Використання:", - "gtceu.placeholder_info.ae2spatial.2": " {ae2spatial power} -> потужність, необхідна для ініціювання просторового введення-виведення", - "gtceu.placeholder_info.ae2spatial.3": " {ae2spatial ефективність} -> ефективність просторової утримуючої структури (SPS)", - "gtceu.placeholder_info.ae2spatial.4": " {ae2spatial size} -> розмір SPS уздовж вказаної осі (приклад: «Розмір: {sizeX}x{sizeY}x{sizeZ}»)", - "gtceu.placeholder_info.amperage.0": "Повертає силу струму в дроті/кабелі, на якому встановлено модифікатор.", + "gtceu.placeholder_info.ae2spatial.2": " {ae2spatial power} -> обсяг потужності, необхідний для ініціювання просторового вводу/виводу", + "gtceu.placeholder_info.ae2spatial.3": " {ae2spatial efficiency} -> ефективність структури просторового утримання (SPS)", + "gtceu.placeholder_info.ae2spatial.4": " {ae2spatial size} -> розмір СПС по вказаній осі (приклад: 'Розмір: {sizeX}x{sizeY}x{sizeZ}')", + "gtceu.placeholder_info.amperage.0": "Повертає силу струму в дроті/кабелі, на якому ввімкнена кришка.", "gtceu.placeholder_info.amperage.1": "Використання:", - "gtceu.placeholder_info.amperage.2": " {amperage} -> сила струму в дроті/кабелі", + "gtceu.placeholder_info.amperage.2": " {amperage} -> ампераж у дроті/кабелі", "gtceu.placeholder_info.bf.0": "Використання:", - "gtceu.placeholder_info.bf.1": " {bf } -> порожній рядок", - "gtceu.placeholder_info.block.0": "Повертає символ блока (█).", + "gtceu.placeholder_info.bf.1": " {bf } -> порожній рядок", + "gtceu.placeholder_info.block.0": "Повертає символ блоку (█).", "gtceu.placeholder_info.block.1": "Використання:", - "gtceu.placeholder_info.block.2": " {block} -> «█»", - "gtceu.placeholder_info.blockNbt.0": "Повертає NBT блока-сутности.", + "gtceu.placeholder_info.block.2": " {block} -> '█'", + "gtceu.placeholder_info.blockNbt.0": "Повертає NBT блокової сутності", "gtceu.placeholder_info.blockNbt.1": "Використання:", - "gtceu.placeholder_info.blockNbt.2": " {blockNbt} -> повний nbt блока-сутности", - "gtceu.placeholder_info.blockNbt.3": " {blockNbt [key1] [key2] ...} -> частина nbt", - "gtceu.placeholder_info.bufferText.0": "Повертає текст із буфера, доступного ComputerCraft", + "gtceu.placeholder_info.blockNbt.2": " {blockNbt} -> повне nbt блокової сутности", + "gtceu.placeholder_info.blockNbt.3": " {blockNbt [key1] [key2] ...} -> частина nbt", + "gtceu.placeholder_info.bufferText.0": "Повертає текст з буфера, доступного ComputerCraft", "gtceu.placeholder_info.bufferText.1": "Використання:", - "gtceu.placeholder_info.bufferText.2": " {bufferText } -> текст із буфера у вказаному рядку (рядок 1-100)", - "gtceu.placeholder_info.calc.0": "Повертає результат математичної функції чи операції.", + "gtceu.placeholder_info.bufferText.2": " {bufferText } -> текст з буфера на вказаному рядку (рядок 1-100)", + "gtceu.placeholder_info.calc.0": "Повертає результат математичної функції або операції.", "gtceu.placeholder_info.calc.1": "Використання:", - "gtceu.placeholder_info.calc.2": " {calc } -> any_string", - "gtceu.placeholder_info.calc.3": " {calc } -> результат вказаної операції", - "gtceu.placeholder_info.calc.4": " {calc <+|-|*|/|//|>>|<<|%> } -> результат зазначеної операції", - "gtceu.placeholder_info.click.0": "Повертає, чи було натиснуто цільовий розширений монітор до поточної позначки.", + "gtceu.placeholder_info.calc.2": " {calc } -> any_string", + "gtceu.placeholder_info.calc.3": " {calc } -> результат зазначеної операції", + "gtceu.placeholder_info.calc.4": " {calc <+|-|*|/|//|>>|<<|%> } -> результат зазначеної операції", + "gtceu.placeholder_info.click.0": "Повертає значення, коли вибраний вдосконалений монітор було клацнуто перед поточним тактом", "gtceu.placeholder_info.click.1": "Використання:", - "gtceu.placeholder_info.click.2": " {click} -> «1», якщо натиснуто цільовий розширений монітор, «0» інакше", - "gtceu.placeholder_info.click.3": " {click x} -> позиція x останнього клацання (між 0 і 1)", - "gtceu.placeholder_info.click.4": " {click y} -> позиція y останнього клацання (між 0 і 1)", - "gtceu.placeholder_info.cmd.0": "Виконує команди Minecraft і повертає їх результат.", - "gtceu.placeholder_info.cmd.1": "Потрібен предмет даних, прив'язаний до гравця, прив'яжіть будь-який предмет даних до себе, натиснувши ПКМ.", + "gtceu.placeholder_info.click.2": " {click} -> \"1\" якщо вибраний вдосконалений монітор клацнуто, в іншому випадку \"0\"", + "gtceu.placeholder_info.click.3": " {click x} -> позиція x останнього клацання (між 0 та 1)", + "gtceu.placeholder_info.click.4": " {click y} -> позиція y останнього клацання (між 0 та 1)", + "gtceu.placeholder_info.cmd.0": "Виконує команди Minecraft і повертає їх резульатат.", + "gtceu.placeholder_info.cmd.1": "Потрібен предмет даних, прив'язаний до гравця, прив'яжіть будь-який предмет даних до себе, клацнувши ним ПКМ.", "gtceu.placeholder_info.cmd.2": "Використання:", - "gtceu.placeholder_info.cmd.3": " {cmd } -> вихід команди", - "gtceu.placeholder_info.cmp.0": "Повертає 1 або 0 на основі виразу в аргументах", + "gtceu.placeholder_info.cmd.3": " {cmd } -> командний вивід", + "gtceu.placeholder_info.cmp.0": "Повертає 1 або 0 на основі виразу в його аргументах", "gtceu.placeholder_info.cmp.1": "Використання:", - "gtceu.placeholder_info.cmp.2": " {cmp } -> 1 або 0, оператор є одним із >, <, >=, <=, ==, !=", - "gtceu.placeholder_info.color.0": "Повертає текст з другого аргументу, забарвлений кольором з першого аргументу. Можна використовувати всі стандартні кольори чату Minecraft.", + "gtceu.placeholder_info.cmp.2": " {cmp } -> 1 або 0, оператор є одним із >, <, >=, <=, ==, !=", + "gtceu.placeholder_info.color.0": "Повертає текст з другого аргументу, розфарбований кольором з першого аргументу. Можна використовувати всі типові кольори чату minecraft.", "gtceu.placeholder_info.color.1": "Використання:", - "gtceu.placeholder_info.color.2": " {color } -> кольоровий текст", - "gtceu.placeholder_info.combine.0": "Об'єднує всі свої аргументи в один рядок (екрануючи всі пробіли між аргументами)", - "gtceu.placeholder_info.combine.1": "Приклад: {combine abc def ghi jkl mno} -> «abc\\ def\\ ghi\\ jkl\\ mno»", + "gtceu.placeholder_info.color.2": " {color } -> кольоровий текст", + "gtceu.placeholder_info.combine.0": "Об'єднує всі свої аргументи в один рядок (шляхом екранування всіх пробілів між аргументами)", + "gtceu.placeholder_info.combine.1": "Приклад: {combine abc def ghi jkl mno} -> \"abc\\ def\\ ghi\\ jkl\\ mno\"", "gtceu.placeholder_info.combine.2": "Використання:", - "gtceu.placeholder_info.combine.3": " {combine [arg1] [arg2] [arg3] ...} -> рядок, який розглядатиметься як один аргумент у подальших заповнювачах", - "gtceu.placeholder_info.count.0": "Повертає, скільки наданих аргументів дорівнює першому (порівняно як рядки, тому «0» != «0.0»)", + "gtceu.placeholder_info.combine.3": " {combine [arg1] [arg2] [arg3] ...} -> рядок, який розглядатиметься як єдиний аргумент у додаткових заповнювачах", + "gtceu.placeholder_info.count.0": "Повертає, скільки з наданих аргументів дорівнюють першому (порівняно як рядки, отже \"0\" != \"0, 0\")", "gtceu.placeholder_info.count.1": "Використання:", - "gtceu.placeholder_info.count.2": " {count [arg2] [arg3] [arg4] ...} -> кількість аргументів, які дорівнюють першому", - "gtceu.placeholder_info.data.0": "Зберігає або отримує деякі дані з елемента даних (пам’ять даних/сфера/модуль) в одному зі слотів.", - "gtceu.placeholder_info.data.1": "Якщо ви залишите аргумент порожнім, його буде замінено значенням p (p є цілим числом від 0 до (місткість — 1), яке зберігається в даних nbt предмета).", + "gtceu.placeholder_info.count.2": " {count [arg2] [arg3] [arg4] ...} -> кількість аргументів, які дорівнюють першим", + "gtceu.placeholder_info.data.0": "Зберігає або отримує деякі дані з предмета даних (паличка даних/орб/модуль) в одному з слотів.", + "gtceu.placeholder_info.data.1": "Якщо залишити аргумент порожнім, його буде замінено значенням p (p - ціле число від 0 до (місткість - 1), яке зберігається в предметі даних nbt).", "gtceu.placeholder_info.data.2": "Використання:", - "gtceu.placeholder_info.data.3": " {data get } -> дані, що зберігаються в елементі у вказаному слоті", - "gtceu.placeholder_info.data.4": " {data set } -> встановлює дані, що зберігаються в елементі у вказаному слоті, повертає порожній рядок", - "gtceu.placeholder_info.data.5": " {data getp <слот>} -> p", - "gtceu.placeholder_info.data.6": " {data setp } -> встановлює p, повертає порожній рядок", - "gtceu.placeholder_info.data.7": " {data inc } -> збільшує p на 1, якщо p стає більшим або дорівнює ємності, встановлює значення p до 0", - "gtceu.placeholder_info.data.8": " {data dec } -> зменшує p на 1, якщо p стає меншим за 0, встановлює для p значення (місткість — 1)", - "gtceu.placeholder_info.displayTarget.0": "Повертає вказаний рядок, який було передано на цей модифікатор за допомогою показуваного посилання.", + "gtceu.placeholder_info.data.3": " {data get } -> дані, що зберігаються в предметі у вказаному слоті", + "gtceu.placeholder_info.data.4": " {data set } -> встановлює дані, що зберігаються в предметі у вказаному слоті, повертає порожній рядок", + "gtceu.placeholder_info.data.5": " {data getп } -> p", + "gtceu.placeholder_info.data.6": " {data setp } -> встановлює p, повертає порожній рядок", + "gtceu.placeholder_info.data.7": " {data inc } -> збільшує p на 1, якщо p стає більше або дорівнює ємності, встановлює p на 0", + "gtceu.placeholder_info.data.8": " {data dec } -> декрементує p на 1, якщо p стає менше 0, встановлює p на (місткість - 1)", + "gtceu.placeholder_info.displayTarget.0": "Повертає вказаний рядок, який було передано на цю кришку за допомогою посилання відображення.", "gtceu.placeholder_info.displayTarget.1": "Використання:", - "gtceu.placeholder_info.displayTarget.2": " {displayTarget } -> текст у вказаному рядку (номер рядка 1-100)", - "gtceu.placeholder_info.ender.0": "Взаємодіє з модифікатором посилання Енду.", - "gtceu.placeholder_info.ender.1": "Може взаємодіяти з приватними каналами, якщо надається дані предмета, прив'язаний до гравця", - "gtceu.placeholder_info.ender.10": "Аргумент player_data_item_slot можна залишити порожнім (не 0, порожній рядок)", + "gtceu.placeholder_info.displayTarget.2": " {displayTarget } -> текст на вказаному рядку (номер рядка 1-100)", + "gtceu.placeholder_info.ender.0": "Взаємодіє з кришками зв'язку Енду", + "gtceu.placeholder_info.ender.1": "Може взаємодіяти з приватними каналами, якщо йому надано предмет даних, прив'язаний до гравця", + "gtceu.placeholder_info.ender.10": "Аргумент player_data_item_slot може залишатися порожнім (не 0, а порожній рядок)", "gtceu.placeholder_info.ender.2": "Використання:", - "gtceu.placeholder_info.ender.3": " {ender item [player_data_item_slot]} -> кількість предметів", - "gtceu.placeholder_info.ender.4": " {ender itemPull [player_data_item_slot]} -> отримаує 1 предмет із буфера посилання Енду", - "gtceu.placeholder_info.ender.5": " {ender itemPush [player_data_item_slot]} -> відправляє 1 предмет у буфер посилання Енду", - "gtceu.placeholder_info.ender.6": " {ender itemId [player_data_item_slot]} -> id предмета в буфері посилання Енду (наприклад, «26 minecraft:dirt»)", - "gtceu.placeholder_info.ender.7": " {ender fluid [player_data_item_slot]} -> кількість рідин", - "gtceu.placeholder_info.ender.8": " {ender redstone <канал> [player_data_item_slot] -> рівень сигналу редстоуну", - "gtceu.placeholder_info.ender.9": " {ender redstone -> встановлює сигнал редстоуну, що виводиться на посилання редстоуну Енду, повертає порожній рядок", - "gtceu.placeholder_info.energy.0": "Повертає кількість збереженої енергії.", + "gtceu.placeholder_info.ender.3": " {ender item [player_data_item_slot]} -> кількість предметів", + "gtceu.placeholder_info.ender.4": " {ender itemPull [player_data_item_slot]} -> витягнути 1 предмет з буфера зв'язку Енду", + "gtceu.placeholder_info.ender.5": " {ender itemPush [player_data_item_slot]} -> надіслати 1 предмет до буфера зв'язку Енду", + "gtceu.placeholder_info.ender.6": " {ender itemId [player_data_item_slot]} -> ID предмета у буфері зв'язку Ендузв'язку Енду (у вигляді \"26 minecraft:dirt\")", + "gtceu.placeholder_info.ender.7": " {ender fluid [player_data_item_slot]} -> обсяг рідини", + "gtceu.placeholder_info.ender.8": " {ender redstone [player_data_item_slot] -> рівень редстоунового сигналу", + "gtceu.placeholder_info.ender.9": " {ender redstone -> надсилає визначений рівень редстоунового сигналу до редстоунового зв'язку Енду, повертає порожній рядок", + "gtceu.placeholder_info.energy.0": "Повертає кількість накопиченої енергії.", "gtceu.placeholder_info.energy.1": "Використання:", - "gtceu.placeholder_info.energy.2": " {energy} -> кількість накопиченої енергії", - "gtceu.placeholder_info.energyCapacity.0": "Повертає максимальну кількість енергії, яку можна зберегти.", + "gtceu.placeholder_info.energy.2": " {energy} -> кількість енергії, що зберігається", + "gtceu.placeholder_info.energyCapacity.0": "Повертає максимальну кількість енергії, яку можна зберегти", "gtceu.placeholder_info.energyCapacity.1": "Використання:", - "gtceu.placeholder_info.energyCapacity.2": "{energyCapacity} -> енергетична потужність", - "gtceu.placeholder_info.eval.0": "Повертає результат оцінки наданого рядка, який може заповнювати.", + "gtceu.placeholder_info.energyCapacity.2": "{energyCapacity} -> енергетична місткість", + "gtceu.placeholder_info.eval.0": "Повертає результат оцінки наданого рядка, який може містити заповнювачі", "gtceu.placeholder_info.eval.1": "Використання:", - "gtceu.placeholder_info.eval.2": " {eval abcdefg} -> abcdefg", - "gtceu.placeholder_info.eval.3": " {eval \"повторення a: {повторення 5 \\\"a \\\"}\" -> повторення a: a a a a a ", - "gtceu.placeholder_info.eval.4": " {eval \\\"\"{довільний текст}\"\\\" -> {довільний текст}", - "gtceu.placeholder_info.eval.5": " {eval \"текст \"\\\"\"{щось із пробілами}\"\\\"\" більше тексту\" -> текст {щось із пробілами} більше тексту", - "gtceu.placeholder_info.fluidCount.0": "Повертає кількість рідини (можна фільтрувати).", + "gtceu.placeholder_info.eval.2": " {eval abcdefg} -> abcdefg", + "gtceu.placeholder_info.eval.3": " {eval \"повторювання a: {repeat 5 \\\"a \\\"}\" -> повторювання a: a a a a a ", + "gtceu.placeholder_info.eval.4": " {eval \\\"\"{вставте текст}\"\\\" -> {вставте текст}", + "gtceu.placeholder_info.eval.5": " {eval \"текст \"\\\"\"{щось із пробілами}\"\\\"\" додатковий текст\" -> текст {щось із пробілами} додатковий текст", + "gtceu.placeholder_info.fluidCount.0": "Повертає кількість рідин (можна відфільтрувати).", "gtceu.placeholder_info.fluidCount.1": "Використання:", - "gtceu.placeholder_info.fluidCount.2": " {fluidCount [fluidId]} -> кількість усіх рідин або рідини з fluidId, якщо вказано", + "gtceu.placeholder_info.fluidCount.2": " {fluidCount [fluidId]} -> кількість усіх рідин або рідини з fluidId, якщо зазначено", "gtceu.placeholder_info.formatInt.0": "Повертає рядкове представлення наданого цілого числа", - "gtceu.placeholder_info.formatInt.1": "Приклад: {formatInt 1236457} -> 1,24 МБ", + "gtceu.placeholder_info.formatInt.1": "Приклад: {formatInt 1236457} -> 1, 24 М", "gtceu.placeholder_info.formatInt.2": "Використання:", - "gtceu.placeholder_info.formatInt.3": " {formatInt } -> рядкове представлення int", + "gtceu.placeholder_info.formatInt.3": " {formatInt } -> рядкове представлення int", "gtceu.placeholder_info.fromAscii.0": "Повертає символ, представлений наданим кодом ASCII", "gtceu.placeholder_info.fromAscii.1": "Використання:", - "gtceu.placeholder_info.fromAscii.2": " {fromAscii } -> символ", - "gtceu.placeholder_info.if.0": "Повертає один із аргументів залежно від умови. Умова буде true, якщо вона не є порожнім рядком і не дорівнює 0.", + "gtceu.placeholder_info.fromAscii.2": " {fromAscii } -> символ", + "gtceu.placeholder_info.if.0": "Повертає один з аргументів залежно від умови. Умова вважається істинною, якщо вона не є порожнім рядком і не дорівнює 0.", "gtceu.placeholder_info.if.1": "Використання:", - "gtceu.placeholder_info.if.2": " {якщо <умова> <повернено_якщо_істина> [повернуто_якщо_хибно]}", - "gtceu.placeholder_info.itemCount.0": "Повертає кількість елементів (можна відфільтрувати).", + "gtceu.placeholder_info.if.2": " {if [returned_if_false]}", + "gtceu.placeholder_info.itemCount.0": "Повертає кількість предметів (можна фільтрувати).", "gtceu.placeholder_info.itemCount.1": "Використання:", - "gtceu.placeholder_info.itemCount.2": " {itemCount} -> загальна кількість предметів", - "gtceu.placeholder_info.itemCount.3": " {itemCount } -> кількість предметів з ідентифікаторами, що дорівнюють item_id", - "gtceu.placeholder_info.itemCount.4": " {itemCount filter } -> кількість предметів, які відповідають фільтру у вказаному слоті цього модифікатора", - "gtceu.placeholder_info.maintenance.0": "Повертає 1, якщо в блоці, до якого прикріплено модифікатор, є проблеми з обслуговуванням, інакше — 0.", - "gtceu.placeholder_info.maintenance.1": "Приклад: «Статус технічного обслуговування: {if {maintenance} FIXING\\ REQUIRED OK}»", + "gtceu.placeholder_info.itemCount.2": " {itemCount} -> загальна кількість предметів", + "gtceu.placeholder_info.itemCount.3": " {itemCount } -> кількість предметів з ідентифікаторами, що дорівнюють item_id", + "gtceu.placeholder_info.itemCount.4": " {itemCount filter } -> кількість предметів, що відповідають фільтру, у вказаному слоті цієї кришки", + "gtceu.placeholder_info.maintenance.0": "Повертає a 1, якщо є проблеми з обслуговуванням у блоці, до якого прикріплена кришка, 0 в іншому випадку.", + "gtceu.placeholder_info.maintenance.1": "Приклад: 'Стан обслуговування: {if {maintenance} FIXING\\ REQUIRED OK}'", "gtceu.placeholder_info.maintenance.2": "Використання:", - "gtceu.placeholder_info.maintenance.3": " {maintenance} -> чи є проблеми з обслуговуванням", - "gtceu.placeholder_info.maxProgress.0": "Повертає максимальний прогрес поточного запущеного рецепта блока, до якого прикріплено цей модифікатор.", - "gtceu.placeholder_info.maxProgress.1": "Приклад: «Прогрес: {calc {calc {progress} / {maxProgress}} * 100}%»", + "gtceu.placeholder_info.maintenance.3": " {maintenance} -> чи є проблеми з обслуговуванням", + "gtceu.placeholder_info.maxProgress.0": "Повертає максимальний прогрес поточного поточного рецепта блоку, до якого додається ця кришка.", + "gtceu.placeholder_info.maxProgress.1": "Приклад: 'Прогрес: {calc {calc {progress} / {maxProgress}} * 100}%'", "gtceu.placeholder_info.maxProgress.2": "Використання:", - "gtceu.placeholder_info.maxProgress.3": " {maxProgress} -> максимальний прогрес поточного запущеного рецепта", - "gtceu.placeholder_info.nbt.0": "Повертає дані nbt елемента у вказаному слоті", + "gtceu.placeholder_info.maxProgress.3": " {maxProgress} -> максимальний прогрес поточного рецепта", + "gtceu.placeholder_info.nbt.0": "Повертає дані nbt предмета у вказаному слоті", "gtceu.placeholder_info.nbt.1": "Використання:", - "gtceu.placeholder_info.nbt.2": " {nbt [key1] [key2] [key3] ...} -> item_nbt[key1][key2][key3][...]", + "gtceu.placeholder_info.nbt.2": " {nbt [key1] [key2] [key3] ...} -> item_nbt[key1][key2][key3][...]", "gtceu.placeholder_info.obf.0": "Повертає текст з першого аргументу, заплутаний.", "gtceu.placeholder_info.obf.1": "Використання:", - "gtceu.placeholder_info.obf.2": " {obf <текст>} -> заплутаний текст", - "gtceu.placeholder_info.previousText.0": "Повертає текст, який раніше було показано цим модифікатором у вказаному рядку (до перенесення рядків).", + "gtceu.placeholder_info.obf.2": " {obf } -> заплутаний текст", + "gtceu.placeholder_info.previousText.0": "Повертає текст, який раніше відображався цією кришкою у вказаному рядку (перед обгортанням рядка).", "gtceu.placeholder_info.previousText.1": "Використання:", - "gtceu.placeholder_info.previousText.2": " {previousText } -> текст, який раніше було показано у вказаному рядку (індекс починається з 1)", - "gtceu.placeholder_info.progress.0": "Повертає хід поточного запущеного рецепта блока, до якого прикріплено цей модифікатор.", - "gtceu.placeholder_info.progress.1": "Зверніть увагу, що прогрес є цілим числом від 0 до {maxProgress}", + "gtceu.placeholder_info.previousText.2": " {previousText } -> текст, який раніше відображався у вказаному рядку (індекс починається з 1)", + "gtceu.placeholder_info.progress.0": "Повертає хід поточного поточного рецепту блоку, до якого додається ця кришка.", + "gtceu.placeholder_info.progress.1": "Зверніть увагу, що прогрес є цілим числом між 0 і {maxProgress}", "gtceu.placeholder_info.progress.2": "Використання:", - "gtceu.placeholder_info.progress.3": " {progress} -> хід виконання поточного рецепта", - "gtceu.placeholder_info.random.0": "Повертає випадкове число в указаному інтервалі (включно).", + "gtceu.placeholder_info.progress.3": " {progress} -> хід поточного рецепту", + "gtceu.placeholder_info.random.0": "Повертає випадкове число у вказаному інтервалі (включно).", "gtceu.placeholder_info.random.1": "Використання:", - "gtceu.placeholder_info.random.2": " {випадкове } -> випадкове число від min до max (включно)", - "gtceu.placeholder_info.redstone.0": "Повертає потужність сигналу редстоуну або встановлює вихідну силу редстоуну.", + "gtceu.placeholder_info.random.2": " {random } -> випадкове число між min і max (включно)", + "gtceu.placeholder_info.redstone.0": "Повертає потужність сигналу червоного каменю або встановлює вихідну потужність червоного каменю", "gtceu.placeholder_info.redstone.1": "Використання:", - "gtceu.placeholder_info.redstone.2": " {redstone get } -> сила сигналу редстоуну (0-15) на вказаній стороні", - "gtceu.placeholder_info.redstone.3": " {redstone get link } -> потужність сигналу редстоуну для частоти посилання редстоуну Create, указаної зв’язаним контролером у слоті #slot_index. freq_slot_index — це індекс частоти всередині контролера (зліва направо, 0-6)", - "gtceu.placeholder_info.redstone.4": " {redstone set } -> порожній рядок, встановлює вихідну потужність redstone з боку цього модифікатора", - "gtceu.placeholder_info.redstone.5": " {redstone set link } -> порожній рядок, транслює вказану потужність redstone на вказаній частоті посилання редстоуну Create", - "gtceu.placeholder_info.repeat.0": "Повертає текст із других аргументів, повторений кількість разів, указану в першому аргументі.", + "gtceu.placeholder_info.redstone.2": " {redstone get } -> потужність сигналу Redstone (0-15) на вказаній стороні", + "gtceu.placeholder_info.redstone.3": " {redstone get link } -> потужність сигналу Redstone частоти зв'язку Create redstone, заданої зв'язаним контролером у слоті #slot_index. freq_slot_index, є індексом частоти всередині контролера (зліва направо, 0-6)", + "gtceu.placeholder_info.redstone.4": " {redstone set } -> порожній рядок встановлює вихідну силу червоного каменю з боку цієї кришки", + "gtceu.placeholder_info.redstone.5": " {redstone set link } -> порожній рядок, транслює вказану потужність redstone на вказаній частоті посилання Create redstone", + "gtceu.placeholder_info.repeat.0": "Повертає текст з других аргументів, повторює кількість разів, вказаних у першому аргументі.", "gtceu.placeholder_info.repeat.1": "Використання:", - "gtceu.placeholder_info.repeat.2": " {repeat } -> текст повторюється вказану кількість разів", - "gtceu.placeholder_info.select.0": "Повертає аргумент за вказаним індексом (починаючи з 0).", + "gtceu.placeholder_info.repeat.2": " {repeat } -> текст повторював вказану кількість разів", + "gtceu.placeholder_info.select.0": "Повертає аргумент за вказаним індексом (починаючи з 0)", "gtceu.placeholder_info.select.1": "Використання:", - "gtceu.placeholder_info.select.2": " {select [arg1] [arg2] [arg3] ... -> аргумент за вказаним індексом", - "gtceu.placeholder_info.strike.0": "Повертає текст з першого тексту, відображаючи його так, ніби він був закреслений.", + "gtceu.placeholder_info.select.2": " {select [arg1] [arg2] [arg3] ... -> аргумент при вказаному індексі", + "gtceu.placeholder_info.strike.0": "Повертає текст з першого тексту, відображаючи його так, ніби він був закреслений", "gtceu.placeholder_info.strike.1": "Використання:", - "gtceu.placeholder_info.strike.2": " {strike } -> закреслений текст", - "gtceu.placeholder_info.subList.0": "Повертає аргументи з з індексами від l (включно) до r (виключно) (починаючи з 0).", + "gtceu.placeholder_info.strike.2": " {strike } -> перекреслений текст", + "gtceu.placeholder_info.subList.0": "Повертає аргументи з з індексами від l (включно) до r (виключно) (починаючи з 0)", "gtceu.placeholder_info.subList.1": "Використання:", - "gtceu.placeholder_info.subList.2": " {subList [arg0] [arg1] ...} -> усі аргументи з індексами від l до r, розділених пробілами", - "gtceu.placeholder_info.tick.0": "Повертає кількість тактів, пройдених з моменту розміщення цього модифікатора.", + "gtceu.placeholder_info.subList.2": " {subList [arg0] [arg1] ...} -> всі аргументи з індексами від l до r, розділеними пробілами", + "gtceu.placeholder_info.tick.0": "Повертає кількість кліщів, що пройшли з моменту розміщення цієї кришки.", "gtceu.placeholder_info.tick.1": "Використання:", - "gtceu.placeholder_info.tick.2": " {tick} -> кількість тактів", + "gtceu.placeholder_info.tick.2": " {tick} -> кількість кліщів", "gtceu.placeholder_info.tm.0": "Повертає символ ™", "gtceu.placeholder_info.tm.1": "Використання:", - "gtceu.placeholder_info.tm.2": " {tm} -> символ ™", + "gtceu.placeholder_info.tm.2": " {tm} -> символ ™", "gtceu.placeholder_info.toAscii.0": "Повертає код ASCII наданого символу", "gtceu.placeholder_info.toAscii.1": "Використання:", - "gtceu.placeholder_info.toAscii.2": " {toAscii } -> код ASCII символу", - "gtceu.placeholder_info.toChars.0": "Повертає символи наданого рядка з пробілами між ними.", - "gtceu.placeholder_info.toChars.1": "Приклад: {toChars example} -> «e x a m p l e»", + "gtceu.placeholder_info.toAscii.2": " {toAscii } -> ASCII код символу", + "gtceu.placeholder_info.toChars.0": "Повертає символи наданого рядка з пробілами між ними", + "gtceu.placeholder_info.toChars.1": "Приклад: {toChars example} -> 'e x a m p l e'", "gtceu.placeholder_info.toChars.2": "Використання:", - "gtceu.placeholder_info.toChars.3": " {toChars } -> символи", - "gtceu.placeholder_info.underline.0": "Повертає текст з першого аргументу, підкреслений.", + "gtceu.placeholder_info.toChars.3": " {toChars } -> персонажі", + "gtceu.placeholder_info.underline.0": "Повертає текст з першого аргументу, підкреслений", "gtceu.placeholder_info.underline.1": "Використання:", - "gtceu.placeholder_info.underline.2": " {underline } -> підкреслений текст", - "gtceu.placeholder_info.voltage.0": "Повертає напругу в проводі/кабелі, на якому встановлено модифікатор.", + "gtceu.placeholder_info.underline.2": " {underline } -> підкреслений текст", + "gtceu.placeholder_info.voltage.0": "Повертає напругу в дроті/кабелі, на якому ввімкнена кришка.", "gtceu.placeholder_info.voltage.1": "Використання:", - "gtceu.placeholder_info.voltage.2": " {voltage} -> напруга в дроті/кабелі", + "gtceu.placeholder_info.voltage.2": " {voltage} -> напруга в дроті/кабелі", "gtceu.plasma_generator": "Плазмовий генератор", - "gtceu.polarizer": "Поляризатор", - "gtceu.primitive_blast_furnace": "Примітивна доменна піч", + "gtceu.polarizer": "Намагнічувач", + "gtceu.primitive_blast_furnace": "Примітивна сталеливарня", "gtceu.pyrolyse_oven": "Піролізна піч", - "gtceu.recipe.byproduct_tier": "Побічні продукти від %s§r+", - "gtceu.recipe.category.arc_furnace_recycling": "Знищення дуги", - "gtceu.recipe.category.chem_dyes": "Хімічне фарбування", - "gtceu.recipe.category.extractor_recycling": "Переплавлення брухту", - "gtceu.recipe.category.ingot_molding": "Лиття металу", - "gtceu.recipe.category.macerator_recycling": "Подрібнення деталей", - "gtceu.recipe.category.ore_bathing": "Обробдення руди", - "gtceu.recipe.category.ore_crushing": "Подрібнення руди", - "gtceu.recipe.category.ore_forging": "Подрібнення руди", + "gtceu.recipe.byproduct_tier": "Побічні продукти з %s§r+", + "gtceu.recipe.category.arc_furnace_recycling": "Дугова переробка", + "gtceu.recipe.category.chem_dyes": "Хімічне розфарбовування", + "gtceu.recipe.category.extractor_recycling": "Переливання металолому", + "gtceu.recipe.category.ingot_molding": "Лиття металів", + "gtceu.recipe.category.macerator_recycling": "Переробка", + "gtceu.recipe.category.ore_bathing": "Рудообробка", + "gtceu.recipe.category.ore_crushing": "Подрібнення руд", + "gtceu.recipe.category.ore_forging": "Дроблення руд", "gtceu.recipe.chance": "Шанс: %s +%s/рівень", - "gtceu.recipe.cleanroom": "Потрібно %s", + "gtceu.recipe.cleanroom": "Потребує %s", "gtceu.recipe.cleanroom.display_name": "Чиста кімната", "gtceu.recipe.cleanroom_sterile.display_name": "Стерильна чиста кімната", "gtceu.recipe.coil.tier": "Котушка: %s", - "gtceu.recipe.computation_per_tick": "Мін. обчислення: %s ОРО/т", + "gtceu.recipe.computation_per_tick": "Мін. обчислень: %s ОРО/т", "gtceu.recipe.dimensions": "Виміри: %s", - "gtceu.recipe.duration": "Тривалість: %sс", - "gtceu.recipe.environmental_hazard": "§cЗона повинна мати %s", - "gtceu.recipe.environmental_hazard.reverse": "§cОбласть має бути вільною від %s", - "gtceu.recipe.eu": "Використання: %s A @ %s", + "gtceu.recipe.duration": "Тривалість: %s секунд", + "gtceu.recipe.environmental_hazard": "§cВ області повинно бути: %s", + "gtceu.recipe.environmental_hazard.reverse": "§cОбласть повинна бути захищена від: %s", + "gtceu.recipe.eu": "Споживання: %s A @ %s", "gtceu.recipe.eu.total": "%s EU/т", - "gtceu.recipe.eu_inverted": "Генерація: %s EU/т", - "gtceu.recipe.eu_to_start": "EU для початку: %sEU (%s)", - "gtceu.recipe.explosive": "Вибуховий: %s", + "gtceu.recipe.eu_inverted": "Генерування: %s EU/т", + "gtceu.recipe.eu_to_start": "Стартове EU: %sEU%s", + "gtceu.recipe.explosive": "Вибухова речовина: %s", "gtceu.recipe.max_eu": "Макс. EU: %s EU", - "gtceu.recipe.not_consumed": "Не витрачається в процесі", - "gtceu.recipe.research": "Потрібне дослідження", - "gtceu.recipe.scan_for_research": "Сканувати конвеєр", - "gtceu.recipe.temperature": "Температура: %sK", - "gtceu.recipe.total": "Усього: %s EU", + "gtceu.recipe.not_consumed": "Не витрачається в процесі роботи", + "gtceu.recipe.research": "Потребує дослідження", + "gtceu.recipe.scan_for_research": "Сканування для конвеєрної лінії", + "gtceu.recipe.temperature": "Температура: %s", + "gtceu.recipe.total": "Загалом: %s EU", "gtceu.recipe.total_computation": "Обчислення: %s ОРО", - "gtceu.recipe.total_eu": "Загальне використання: %s EU/т", - "gtceu.recipe.voltage": "Використання: %s A @ %s", - "gtceu.recipe_logic.condition_fails": "Умова не виконується", + "gtceu.recipe.total_eu": "Загальне споживання: %s EU/т", + "gtceu.recipe.voltage": "Споживання: %s A @ %s", + "gtceu.recipe_logic.condition_fails": "Умова не виконана", "gtceu.recipe_logic.insufficient_fuel": "Недостатньо палива", - "gtceu.recipe_logic.insufficient_in": "Недостатньо вхідних даних", - "gtceu.recipe_logic.insufficient_out": "Недостатньо результатів", - "gtceu.recipe_logic.no_capabilities": "Машина не має можливостей", - "gtceu.recipe_logic.no_contents": "Рецепт не має вмісту", - "gtceu.recipe_memory_widget.tooltip.0": "§7ЛКМ, ввести цей рецепт у сітку майстрування", - "gtceu.recipe_memory_widget.tooltip.1": "§7Натисніть, щоб заблокувати/розблокувати цей рецепт", + "gtceu.recipe_logic.insufficient_in": "Недостатньо входів", + "gtceu.recipe_logic.insufficient_out": "Недостатньо виходів", + "gtceu.recipe_logic.no_capabilities": "Машина не має відповідних можливостей", + "gtceu.recipe_logic.no_contents": "Рецепт не має змісту", + "gtceu.recipe_memory_widget.tooltip.0": "§7Клацніть ЛКМ, щоб автоматично внести цей рецепт до сітки виготовлення", + "gtceu.recipe_memory_widget.tooltip.1": "§7Клацайте із затиснутим Shift, щоб заблокувати/розблокувати цей рецепт", "gtceu.recipe_type.show_recipes": "Показати рецепти", - "gtceu.rei.group.potion_fluids": "Рідини зілля", - "gtceu.research_station": "Станція дослідження", - "gtceu.rock_breaker": "Ламач породи", + "gtceu.rei.group.potion_fluids": "Рідини зіллів", + "gtceu.research_station": "Дослідницька станція", + "gtceu.rock_breaker": "Кам'яна дробарка", "gtceu.scanner": "Сканер", - "gtceu.scanner.copy_stick_empty": "§oПорожня палиця", - "gtceu.scanner.copy_stick_from": "§oПалиця копіювання із", - "gtceu.scanner.copy_stick_to": "§oПалиця копіювання до", + "gtceu.scanner.copy_stick_empty": "§oПорожня картка", + "gtceu.scanner.copy_stick_from": "§oКопіювання до картки", + "gtceu.scanner.copy_stick_to": "§oВставка з картки", "gtceu.sifter": "Просіювач", - "gtceu.steam_boiler": "Steam Boiler", - "gtceu.steam_turbine": "Steam Turbine", - "gtceu.subtitle.arc": "Дуги гудять", - "gtceu.subtitle.assembler": "Збирач збирає", + "gtceu.steam_boiler": "Паровий котел", + "gtceu.steam_turbine": "Парова турбіна", + "gtceu.subtitle.arc": "Дуги дзижчать", + "gtceu.subtitle.assembler": "Збирач конструює", "gtceu.subtitle.bath": "Ванна шипить", - "gtceu.subtitle.boiler": "Котел нагрівається", + "gtceu.subtitle.boiler": "Котел гріється", "gtceu.subtitle.centrifuge": "Центрифуга обертається", - "gtceu.subtitle.chainsaw": "Пила працює", + "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.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": "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.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.portal_closing": "Портал закривається", + "gtceu.subtitle.portal_opening": "Портал відкривається", "gtceu.subtitle.replicator": "Реплікатор копіює", "gtceu.subtitle.saw": "Пиляння", "gtceu.subtitle.science": "н а у к а", - "gtceu.subtitle.screwdriver": "Відкручення", - "gtceu.subtitle.soft_hammer": "М'який стук", + "gtceu.subtitle.screwdriver": "Закручування", + "gtceu.subtitle.soft_hammer": "М'який тик", "gtceu.subtitle.spray_can": "Обприскування", - "gtceu.subtitle.sus": "Підозріло…", - "gtceu.subtitle.turbine": "Турбіна свистить", - "gtceu.subtitle.wirecutter": "Дріт відрізано", - "gtceu.subtitle.wrench": "Гайковий ключ деренчить", - "gtceu.thermal_centrifuge": "Термоцентрифуга", + "gtceu.subtitle.sus": "Підозріло...", + "gtceu.subtitle.turbine": "Свист турбіни", + "gtceu.subtitle.wirecutter": "Дріт рветься", + "gtceu.subtitle.wrench": "Ключ брязкає", + "gtceu.thermal_centrifuge": "Термічна центрифуга", "gtceu.tool.class.axe": "Сокира", - "gtceu.tool.class.butchery_knife": "М'ясницький ніж", + "gtceu.tool.class.butchery_knife": "М'ясний ніж", "gtceu.tool.class.crowbar": "Лом", "gtceu.tool.class.drill": "Бур", - "gtceu.tool.class.file": "Напильник", + "gtceu.tool.class.file": "Напилок", "gtceu.tool.class.hammer": "Молот", "gtceu.tool.class.hoe": "Мотика", "gtceu.tool.class.knife": "Ніж", - "gtceu.tool.class.mallet": "М'який молоток", + "gtceu.tool.class.mallet": "Киянка", "gtceu.tool.class.mining_hammer": "Шахтарський молот", "gtceu.tool.class.mortar": "Ступка", "gtceu.tool.class.pickaxe": "Кайло", - "gtceu.tool.class.plunger": "Поринач", + "gtceu.tool.class.plunger": "Вантуз", "gtceu.tool.class.rolling_pin": "Качалка", "gtceu.tool.class.saw": "Пила", "gtceu.tool.class.screwdriver": "Викрутка", @@ -3809,1202 +3812,1206 @@ "gtceu.tool.class.shovel": "Лопата", "gtceu.tool.class.spade": "Заступ", "gtceu.tool.class.sword": "Меч", - "gtceu.tool.class.wire_cutter": "Кусачки для дротів", + "gtceu.tool.class.wire_cutter": "Кусачки", "gtceu.tool.class.wrench": "Гайковий ключ", - "gtceu.tool_action.crowbar": "§8Використовуйте лом, щоб видалити модифікатор", - "gtceu.tool_action.hammer": "§8Використовуйте жорсткий молот для приглушення звуків", - "gtceu.tool_action.screwdriver.access_covers": "§8Використовуйте викрутку для доступу до модифікаторів", - "gtceu.tool_action.screwdriver.auto_collapse": "§8Використовуйте викрутку, щоб увімкнути згортання предмета", - "gtceu.tool_action.screwdriver.auto_output": "§8Використовуйте викрутку для перемикання автовиходу", - "gtceu.tool_action.screwdriver.auto_output_covers": "§8Використовуйте викрутку, щоб дозволити вхід з боку виходу або відкрити модифікатор", + "gtceu.tool_action.crowbar": "§8Використовуйте лом, щоб зняти кришки", + "gtceu.tool_action.hammer": "§8Використовуйте молот, щоб приглушити звуки", + "gtceu.tool_action.screwdriver.access_covers": "§8Використовуйте викрутку для доступу до кришок", + "gtceu.tool_action.screwdriver.auto_collapse": "§8Використовуйте викрутку, щоб увімкнути руйнування предметів", + "gtceu.tool_action.screwdriver.auto_output": "§8Використовуйте викрутку, щоб увімкнути автоматичний вихід", + "gtceu.tool_action.screwdriver.auto_output_covers": "§8Використовуйте викрутку, щоб увімкнути вхід з боку виходу або для доступу до кришок", "gtceu.tool_action.screwdriver.toggle_mode": "§8Використовуйте викрутку для перемикання режимів", - "gtceu.tool_action.screwdriver.toggle_mode_covers": "§8Використовуйте викрутку для перемикання режимів або доступу до модифікаторів", - "gtceu.tool_action.show_tooltips": "Утримуйте Shift для подробиць інструмента", - "gtceu.tool_action.soft_mallet.reset": "§8Використовуйте м'який молоток, щоб перемкнути роботу", - "gtceu.tool_action.soft_mallet.toggle_mode": "§8Використовуйте м'який молоток для перемикання режимів", - "gtceu.tool_action.tape": "§8Використовуйте ізоляційну стрічку для вирішення проблем з обслуговуванням", - "gtceu.tool_action.wire_cutter.connect": "§8Використовуйте кусачки для дроту для налаштування з'єднань", - "gtceu.tool_action.wrench.connect": "§8Використовуйте гайковий ключ, щоб налаштувати приєднання, Shift, щоб заблокувати", - "gtceu.tool_action.wrench.set_facing": "§8Використовуйте гайковий ключ, щоб налаштувати повертання", - "gtceu.tooltip.computer_monitor_config": "Зберігання даних налаштувань модифікатора монітора комп'ютера", - "gtceu.tooltip.computer_monitor_data": "Уміщені дані: %s", - "gtceu.tooltip.fluid_pipe_hold_shift": "§7Утримуйте Shift для подробиць умісту рідини", - "gtceu.tooltip.hold_ctrl": "§7Утримуйте CTRL для подробиць", - "gtceu.tooltip.hold_shift": "§7Утримуйте Shift для подробиць", - "gtceu.tooltip.player_bind": "Прив’язаний до гравця: %s", - "gtceu.tooltip.potion.each": "%s %s §7для§r %s §7позначає з §r %s%% §7імовірністю статися§r", + "gtceu.tool_action.screwdriver.toggle_mode_covers": "§8Використовуйте викрутку для перемикання режимів або доступу до кришок", + "gtceu.tool_action.show_tooltips": "Утримуйте Shift, щоб показати інформацію інструмента", + "gtceu.tool_action.soft_mallet.reset": "§8Використовуйте киянку для перемикання робочого стану", + "gtceu.tool_action.soft_mallet.toggle_mode": "§8Використовуйте киянку для перемикання режимів", + "gtceu.tool_action.tape": "§8Використовуйте стрічку для усунення проблем з технічним обслуговуванням", + "gtceu.tool_action.wire_cutter.connect": "§8Використовуйте кусачки (дріт) або гайковий ключ (труба) для встановлення з'єднань", + "gtceu.tool_action.wrench.connect": "§8Використовуйте гайковий ключ для встановлення з'єднань, крадькома, щоб заблокувати з'єднання", + "gtceu.tool_action.wrench.set_facing": "§8Використовуйте ключ, щоб встановити напрямок", + "gtceu.tooltip.computer_monitor_config": "Конфігураційні дані кришки монітора збережень комп'ютера", + "gtceu.tooltip.computer_monitor_data": "Збережено даних: %s", + "gtceu.tooltip.fluid_pipe_hold_shift": "§7Утримуйте Shift, щоб показати інформацію про наявну рідину", + "gtceu.tooltip.hold_ctrl": "§7Утримуйте Ctrl для більшої інформації", + "gtceu.tooltip.hold_shift": "§7Утримуйте Shift для більшої інформації", + "gtceu.tooltip.player_bind": "Прив'язано до гравця: %s", + "gtceu.tooltip.potion.each": "%s %s§7 на§r %s§7 тактів, який застосується із§r %s%%§7 ймовірністю§r", "gtceu.tooltip.potion.header": "§6Містить ефекти:", - "gtceu.tooltip.proxy_bind": "§fПрив'язка до буфера шаблону в %s %s %s", - "gtceu.tooltip.status.trinary.false": "Ні", - "gtceu.tooltip.status.trinary.true": "Так", + "gtceu.tooltip.proxy_bind": "§fПрив'язати до буфера шаблонів у %s %s %s", + "gtceu.tooltip.status.trinary.false": "Брехня", + "gtceu.tooltip.status.trinary.true": "Істина", "gtceu.tooltip.status.trinary.unknown": "Невідомо", - "gtceu.tooltip.tool_fluid_hold_shift": "§7Утримуйте Shift для подробиць умісту рідини та інструмента", - "gtceu.tooltip.tool_fluid_hold_shift": "§7Утримуйте Shift для деталей утриманої рідини та інструменту", - "gtceu.top.allow_output_input": "Дозволити вхід", - "gtceu.top.auto_output": "Автовихід", - "gtceu.top.buffer_bound_pos": "Прив'язаний до — X: %s, Y: %s, Z: %s", - "gtceu.top.buffer_not_bound": "Буфер наразі не прив'зано", + "gtceu.tooltip.tool_fluid_hold_shift": "§7Утримуйте Shift, щоб показати інформацію інструмента та про наявну рідину", + "gtceu.tooltip.wireless_transmitter_bind": "Прив'язка до кришки передавача на %s %s %s, зверненій до %s у %s", + "gtceu.top.allow_output_input": "Відкритий вхід", + "gtceu.top.auto_output": "Автовиведення", + "gtceu.top.buffer_bound_pos": "Прив'язано до - X: %s, Y: %s, Z: %s", + "gtceu.top.buffer_not_bound": "Буфер наразі не прив'язаний", "gtceu.top.cable_amperage": "Сила струму: ", "gtceu.top.cable_voltage": "Напруга: ", - "gtceu.top.convert_eu": "Перетворення §eEU§r —> §cFE§r", - "gtceu.top.convert_fe": "Перетворення §cFE§r —> §eEU§r", + "gtceu.top.convert_eu": "Конвертація§e EU§r ->§c FE§r", + "gtceu.top.convert_fe": "Конвертація§c FE§r ->§e EU§r", "gtceu.top.energy_consumption": "Використання", - "gtceu.top.energy_production": "Виробництво", + "gtceu.top.energy_production": "Вироблення", "gtceu.top.energy_stored": " / %d EU", "gtceu.top.exhaust_vent_blocked": "Заблоковано", - "gtceu.top.exhaust_vent_direction": "Залишковий отвір: %s", + "gtceu.top.exhaust_vent_direction": "Витяжна вентиляція: %s", "gtceu.top.filter.label": "Фільтр:", - "gtceu.top.fluid_auto_output": "Рідинний вихід: %s", - "gtceu.top.fuel_min_consume": "Потреби", - "gtceu.top.fuel_none": "Немає палива", - "gtceu.top.invalid_structure": "Недійсна структура", + "gtceu.top.fluid_auto_output": "Вихід рідини: %s", + "gtceu.top.fuel_min_consume": "Потребує", + "gtceu.top.fuel_none": "Нема палива", + "gtceu.top.invalid_structure": "Конструкція незавершена", "gtceu.top.item_auto_output": "Вихід предметів: %s", + "gtceu.top.ldp_endpoint.io_type": "Тип логістики: %s", + "gtceu.top.ldp_endpoint.is_formed": "§aТрубопровід сформований§r", + "gtceu.top.ldp_endpoint.not_formed": "§cТрубопровід незавершений§r", + "gtceu.top.ldp_endpoint.output_direction": "Напрямок виводу: %s", "gtceu.top.link_cover.color": "Колір:", "gtceu.top.machine_mode": "Режим машини: ", "gtceu.top.maintenance.crowbar": "Цьому тут не місце", "gtceu.top.maintenance.hard_hammer": "Покриття має вм'ятини", - "gtceu.top.maintenance.screwdriver": "Гвинти ослаблені", - "gtceu.top.maintenance.soft_mallet": "Щось застрягло", - "gtceu.top.maintenance.wire_cutter": "Згоріли дроти", - "gtceu.top.maintenance.wrench": "Труба ослаблена", - "gtceu.top.maintenance_broken": "Потрібне технічне обслуговування", - "gtceu.top.maintenance_fixed": "Технічне обслуговування добре", - "gtceu.top.mode.export": "Забирання", - "gtceu.top.mode.import": "Постачання", - "gtceu.top.obstructed_structure": "Структура заблокована", - "gtceu.top.primitive_pump_production": "Виробництво: %s мВ/с", + "gtceu.top.maintenance.screwdriver": "Гвинти розхитані", + "gtceu.top.maintenance.soft_mallet": "Щось заклинило", + "gtceu.top.maintenance.wire_cutter": "Дроти перегоріли", + "gtceu.top.maintenance.wrench": "Труба відійшла", + "gtceu.top.maintenance_broken": "Потребує технічного обслуговування", + "gtceu.top.maintenance_fixed": "Обслуговування завершено", + "gtceu.top.mode.export": "Експортування", + "gtceu.top.mode.import": "Імпортування", + "gtceu.top.obstructed_structure": "Щось заважає формуванню конструкції", + "gtceu.top.primitive_pump_production": "Вироблення: %s мВ/с", "gtceu.top.progress_computation": " / %s ОРО", - "gtceu.top.progress_sec": " / %sс", - "gtceu.top.progress_tick": " / %sт", - "gtceu.top.proxies_bound": "Прив’язка буферних проксі: %s", - "gtceu.top.recipe_output": "Вихідні дані рецепта:", - "gtceu.top.stained": "Кольоровий: %s", + "gtceu.top.progress_sec": " / %s с", + "gtceu.top.progress_tick": " / %s т", + "gtceu.top.proxies_bound": "Прив'язані буферні проксі: %s", + "gtceu.top.recipe_output": "Виходи рецептів:", + "gtceu.top.stained": "Фарбування: %s", "gtceu.top.transform_down": "§aКрок вниз§r %s", "gtceu.top.transform_input": "§6Вхід:§r %s", "gtceu.top.transform_output": "§9Вихід:§r %s", - "gtceu.top.transform_up": "§cКрок вперед§r %s", + "gtceu.top.transform_up": "§cКрок вгору§r %s", "gtceu.top.unit.fluid_buckets": "кЛ", "gtceu.top.unit.fluid_milibuckets": "Л", "gtceu.top.unit.items": "Предмети", - "gtceu.top.valid_structure": "Дійсна структура", - "gtceu.top.working_disabled": "Робота вимкнена", + "gtceu.top.valid_structure": "Конструкцію сформовано", + "gtceu.top.working_disabled": "Робота зупинена", "gtceu.universal.clear_nbt_recipe.tooltip": "§cЦе знищить увесь вміст!", - "gtceu.universal.kiloliters": "%s В", + "gtceu.universal.kiloliters": "%s B", "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": "§eСила струму входу: §f%dA", - "gtceu.universal.tooltip.amperage_in_out": "§eСила струму входу/виходу: §f%dA", - "gtceu.universal.tooltip.amperage_in_out_till": "§eСила струму входу/виходу до: §f%dA", - "gtceu.universal.tooltip.amperage_in_till": "§eСила струму входу до: §f%dA", - "gtceu.universal.tooltip.amperage_out": "§eСила струму виходу: §f%dA", - "gtceu.universal.tooltip.amperage_out_till": "§eСила струму виходу до: §f%dA", - "gtceu.universal.tooltip.base_production_eut": "§eБазове виробництво: §f%d EU/т", - "gtceu.universal.tooltip.base_production_fluid": "§eБазове виробництво: §f%d мВ/т", - "gtceu.universal.tooltip.chunk_mode": "Режим блока: ", - "gtceu.universal.tooltip.deprecated": "§4§lПОПЕРЕДЖЕННЯ:§r§4 ЗАСТАРІЛО. БУДЕ ВИДАЛЕНО В МАЙБУТНІЙ ВЕРСІЇ.§r", - "gtceu.universal.tooltip.energy_storage_capacity": "§cЗбережно енергії: §r%d EU", - "gtceu.universal.tooltip.energy_tier_range": "§aДозволені рівні напруги: §f%s §f— %s", - "gtceu.universal.tooltip.fluid_storage_capacity": "§9Місткість рідини: §f%d мВ", - "gtceu.universal.tooltip.fluid_storage_capacity_mult": "§9Місткість рідини: §f%d §7баків, §f%d мВ §7кожен", - "gtceu.universal.tooltip.fluid_stored": "§2Збережено рідини: §f%s, %d мВ", - "gtceu.universal.tooltip.fluid_transfer_rate": "§bШвидкість передачі: §f%d мВ/т", - "gtceu.universal.tooltip.item_storage_capacity": "§6Слоти для предметів: §f%d", - "gtceu.universal.tooltip.item_storage_total": "§6Місткість предметів: §f%d пред.", - "gtceu.universal.tooltip.item_stored": "§dЗбережо предметів: §f%s, %d пред.", - "gtceu.universal.tooltip.item_transfer_rate": "§bШвидкість передачі: §f%d пред./с", - "gtceu.universal.tooltip.item_transfer_rate_stacks": "§bШвидкість передавання: §f%d стосів/с", - "gtceu.universal.tooltip.max_voltage_in": "§aМакс. напруга входу: §f%d (%s§f)", - "gtceu.universal.tooltip.max_voltage_in_out": "§aМакс. напруга входу/виходу: §f%d EU/т (%s§f)", - "gtceu.universal.tooltip.max_voltage_out": "§aМакс. вихідна напруга: §f%d (%s§f)", - "gtceu.universal.tooltip.parallel": "§dМакс. паралель: §f%d", - "gtceu.universal.tooltip.produces_fluid": "§eВиробляє: §f%d мВ/т", - "gtceu.universal.tooltip.requires_redstone": "§4Потрібен сигнал редстоуну", + "gtceu.universal.tooltip.amperage_in": "§eСила струму на вході:§f %dA", + "gtceu.universal.tooltip.amperage_in_out": "§eСила струму на вході/виході:§f %dA", + "gtceu.universal.tooltip.amperage_in_out_till": "§eСила струму на вході/виході до:§f %dA", + "gtceu.universal.tooltip.amperage_in_till": "§eСила струму на вході до:§f %dA", + "gtceu.universal.tooltip.amperage_out": "§eСила струму на виході:§f %dA", + "gtceu.universal.tooltip.amperage_out_till": "§eСила струму на виході до: §f%dA", + "gtceu.universal.tooltip.base_production_eut": "§eБазове виробництво:§f %d EU/т", + "gtceu.universal.tooltip.base_production_fluid": "§eБазове виробництво:§f %d мВ/т", + "gtceu.universal.tooltip.chunk_mode": "Режим чанків: ", + "gtceu.universal.tooltip.deprecated": "§4§l ПОПЕРЕДЖЕННЯ:§r§4 ЗАСТАРІЛО. БУДЕ ВИДАЛЕНО В МАЙБУТНІХ ВЕРСІЯХ.§r", + "gtceu.universal.tooltip.energy_storage_capacity": "§cЕнергетична місткість:§r %d EU", + "gtceu.universal.tooltip.energy_tier_range": "§aДопустимі рівні напруги:§f %s§f - %s", + "gtceu.universal.tooltip.fluid_storage_capacity": "§9Рідинна місткість:§f %d мВ", + "gtceu.universal.tooltip.fluid_storage_capacity_mult": "§9Рідинна місткість:§f %d§7 резервуарів,§f %d мВ§7 кожний", + "gtceu.universal.tooltip.fluid_stored": "§2Збережена рідина:§f %s, %d мВ", + "gtceu.universal.tooltip.fluid_transfer_rate": "§bШвидкість передачі:§f %d мВ/т", + "gtceu.universal.tooltip.item_storage_capacity": "§6Предметних слотів:§f %d", + "gtceu.universal.tooltip.item_storage_total": "§6Предметна місткість:§f %d предметів", + "gtceu.universal.tooltip.item_stored": "§dПредметний вміст:§f %s, %d предметів", + "gtceu.universal.tooltip.item_transfer_rate": "§bШвидкість передачі:§f %d предметів/с", + "gtceu.universal.tooltip.item_transfer_rate_stacks": "§bШвидкість передачі:§f %d стосів/с", + "gtceu.universal.tooltip.max_voltage_in": "§aМакс. напруга на вході:§f %d (%s§f)", + "gtceu.universal.tooltip.max_voltage_in_out": "§aМакс. напруга на вході/виході:§f %d EU/т (%s§f)", + "gtceu.universal.tooltip.max_voltage_out": "§aМакс. напруга на виході:§f %d (%s§f)", + "gtceu.universal.tooltip.parallel": "§dМакс. паралелей:§f %d", + "gtceu.universal.tooltip.produces_fluid": "§eВиробляє:§f %d мВ/т", + "gtceu.universal.tooltip.requires_redstone": "§4Потребує заживлення редстоуном", "gtceu.universal.tooltip.silk_touch": "Шовковий дотик: ", - "gtceu.universal.tooltip.terrain_resist": "Ця машина не вибухне під впливом стихій", - "gtceu.universal.tooltip.uses_per_hour_lubricant": "Використовує §f%d мВ/год §6мастила§7 під час роботи", - "gtceu.universal.tooltip.uses_per_op": "Використовує §f%d EU/операцію", - "gtceu.universal.tooltip.uses_per_second": "Використовує §f%d EU/с§7 під час роботи", - "gtceu.universal.tooltip.uses_per_tick": "Використовує §f%d EU/т§7 під час роботи", - "gtceu.universal.tooltip.uses_per_tick_steam": "Використовує §f%d мВ/т §fпару§7 під час роботи", - "gtceu.universal.tooltip.voltage_in": "§aНапруга входу: §f%d EU/т (%s§f)", - "gtceu.universal.tooltip.voltage_in_out": "§aНапруга входу/виходу: §f%d EU/т (%s§f)", - "gtceu.universal.tooltip.voltage_out": "§aНапруга виходу: §f%d EU/т (%s§f)", - "gtceu.universal.tooltip.working_area": "§bРобоча зона: §f%dx%d", - "gtceu.universal.tooltip.working_area_chunks": "§bРобоча зона: §f%dx%d чанків", - "gtceu.universal.tooltip.working_area_chunks_max": "§bМакс. робоча зона: §f%dx%d чанків", - "gtceu.universal.tooltip.working_area_max": "§bМакс. робоча зона: §f%dx%d", + "gtceu.universal.tooltip.terrain_resist": "Ця машина не вибухне під час контакту з хім. елементами", + "gtceu.universal.tooltip.uses_per_hour_lubricant": "Використовує§f %d мВ/год§7§6 мастила§7 під час роботи", + "gtceu.universal.tooltip.uses_per_op": "Використовує§f %d EU на операцію", + "gtceu.universal.tooltip.uses_per_second": "Використовує§f %d EU/c§7 під час роботи", + "gtceu.universal.tooltip.uses_per_tick": "Використовує§f %d EU/т§7 під час роботи", + "gtceu.universal.tooltip.uses_per_tick_steam": "Використовує§f %d мВ/т§7§f пари§7 під час роботи", + "gtceu.universal.tooltip.voltage_in": "§aНапруга на вході:§f %d EU/т (%s§f)", + "gtceu.universal.tooltip.voltage_in_out": "§aНапруга на вході/виході:§f %d EU/т (%s§f)", + "gtceu.universal.tooltip.voltage_out": "§aНапруга на виході:§f %d EU/т (%s§f)", + "gtceu.universal.tooltip.working_area": "§bРобоча зона:§f %dx%d", + "gtceu.universal.tooltip.working_area_chunks": "§bРобоча зона:§f %dx%d чанків", + "gtceu.universal.tooltip.working_area_chunks_max": "§bМакс. робоча зона:§f %dx%d чанків", + "gtceu.universal.tooltip.working_area_max": "§bМакс. робоча зона:§f %dx%d", "gtceu.vacuum_freezer": "Вакуумна морозильна камера", - "gtceu.wiremill": "Млин", + "gtceu.wiremill": "Волок", "gui.gtceu.refund_all.desc": "Повернути збережений вміст до AE2", - "gui.gtceu.rename.desc": "Перейменувати буфер шаблонів", - "gui.gtceu.share_inventory.desc.0": "Спільно використовує вставлені предмети з усіма шаблонами в буфері!", - "gui.gtceu.share_inventory.desc.1": "Дозволяє потужну автоматизацію шляхом зберігання каталізаторів", - "gui.gtceu.share_inventory.title": "Спільний інвентар", - "gui.gtceu.share_tank.desc.0": "Спільно використовує введені рідини/гази/тощо з усіма шаблонами в буфері!", - "gui.gtceu.share_tank.title": "Спільний інвентар танка", - "gui.widget.incrementButton.default_tooltip": "Утримуйте Shift, Ctrl або обидва, щоб змінити кількість", + "gui.gtceu.rename.desc": "Перейменувати буфер деталей", + "gui.gtceu.share_inventory.desc.0": "Ділиться вставленими предметами з усіма шаблонами в буфері!", + "gui.gtceu.share_inventory.desc.1": "Дозволяє значно автоматизувати роботу, зберігаючи каталізатори", + "gui.gtceu.share_inventory.title": "Інвентар спільних предметів", + "gui.gtceu.share_tank.desc.0": "Ділиться вставленими рідинами/газами/тощо з усіма шаблонами в буфері!", + "gui.gtceu.share_tank.title": "Інвентар спільного резервуара", + "gui.widget.incrementButton.default_tooltip": "Утримуйте Shift, Ctrl чи обидва, щоб змінити кількість", "gui.widget.recipeProgressWidget.default_tooltip": "Показати рецепти", - "item.glass_lens": "Біла скляна лінза", - "item.gtceu.activity_detector_cover": "Датчик активности", - "item.gtceu.activity_detector_cover.tooltip": "§7Видає §fстатус активности§7 сигналом редстоуну як §fмодифікатор§7.", - "item.gtceu.advanced_activity_detector_cover": "Покращений датчик активности", - "item.gtceu.advanced_activity_detector_cover.tooltip": "§7Видає §fпрогрес машини§7 сигналом редстоуну як §fмодифікатор§7.", - "item.gtceu.advanced_electric_jetpack": "Покращений електричний ранець", - "item.gtceu.advanced_energy_detector_cover": "Покращений датчик енергії", - "item.gtceu.advanced_energy_detector_cover.tooltip": "§7Видає §fRS-засув§7 контрольований §fстатусом енергії§7 сигналу редстоуну як §fмодифікатор§7.", - "item.gtceu.advanced_fluid_detector_cover": "Покращений датчик рідини", - "item.gtceu.advanced_fluid_detector_cover.tooltip": "§7Видає §fRS-засув§7 контрольований §fстатусом збереження рідини§7 сигналу редстоуну як §fмодифікатор§7.", - "item.gtceu.advanced_fluid_voiding_cover": "Покращений модифікатор знищення рідини", - "item.gtceu.advanced_fluid_voiding_cover.tooltip.0": "§7Знищує §fрідини§7 з керуванням кількісти як §fмодифікатор§7.", - "item.gtceu.advanced_fluid_voiding_cover.tooltip.1": "Активуйте за допомогою §fм'якого молотка§7 після розміщення.", - "item.gtceu.advanced_integrated_circuit": "Покращена інтегральна схема", - "item.gtceu.advanced_integrated_circuit.tooltip.0": "§7Мала та потужна", - "item.gtceu.advanced_integrated_circuit.tooltip.1": "§6Схема ВН", - "item.gtceu.advanced_item_detector_cover": "Розширений детектор предметів", - "item.gtceu.advanced_item_detector_cover.tooltip": "§7Надає §fRS-засув§7 контрольований §fстатус зберігання предметів§7 сигналом редстоуну як §fмодифікатор§7.", - "item.gtceu.advanced_item_voiding_cover": "Покращений модифікатор знищення предметів", - "item.gtceu.advanced_item_voiding_cover.tooltip.0": "§7Знищує §fпредмети§7 з керуванням кількісти як §fмодифікатор§7.", - "item.gtceu.advanced_item_voiding_cover.tooltip.1": "Активуйте за допомогою §fм'якого молотка§7 після розміщення.", - "item.gtceu.advanced_nanomuscle_chestplate": "Покращений нанонагрудник", - "item.gtceu.advanced_power_thruster": "Покращений рушій", - "item.gtceu.advanced_quarktech_chestplate": "Покращений технокварковий нагрудник", - "item.gtceu.advanced_smd_capacitor": "Покращений SMD конденсатор", - "item.gtceu.advanced_smd_capacitor.tooltip": "§7Розширений електричний компонент", - "item.gtceu.advanced_smd_diode": "Покращений SMD діод", - "item.gtceu.advanced_smd_diode.tooltip": "§7Розширений електричний компонент", - "item.gtceu.advanced_smd_inductor": "Покращений SMD індуктор", - "item.gtceu.advanced_smd_inductor.tooltip": "§7Розширений електричний компонент", - "item.gtceu.advanced_smd_resistor": "Покращений SMD резистор", - "item.gtceu.advanced_smd_resistor.tooltip": "§7Розширений електричний компонент", - "item.gtceu.advanced_smd_transistor": "Покращений SMD транзистор", - "item.gtceu.advanced_smd_transistor.tooltip": "§7Розширений електричний компонент", - "item.gtceu.advanced_soc": "ПСнЧ", - "item.gtceu.advanced_soc.tooltip": "§7Покращена система на чипі", - "item.gtceu.advanced_soc_wafer": "Напівпровідникова пластина ПСнЧ", - "item.gtceu.advanced_soc_wafer.tooltip": "§7Сира покращена схема", - "item.gtceu.aluminium_fluid_cell": "Алюмінієва капсула (%s)", - "item.gtceu.anvil_casting_mold": "Ливарна форма ковадла", - "item.gtceu.anvil_casting_mold.tooltip": "§7Форма для виготовлення ковадла", + "item.glass_lens": "Скляна лінза (Біла)", + "item.gtceu.activity_detector_cover": "Детектор активності", + "item.gtceu.activity_detector_cover.tooltip": "§7Видає§f статус активності§7 як редстоун та§f кришка§7.", + "item.gtceu.advanced_activity_detector_cover": "Вдосконалений детектор активності", + "item.gtceu.advanced_activity_detector_cover.tooltip": "§7Видає§f прогрес машини§7 як редстоун та§f кришка§7.", + "item.gtceu.advanced_electric_jetpack": "Вдосконалений електричний реактивний ранець", + "item.gtceu.advanced_energy_detector_cover": "Вдосконалений детектор енергії", + "item.gtceu.advanced_energy_detector_cover.tooltip": "§7Видає§f RS-засув§7 контрольований§f статус енергії§7 як редстоун та§f кришка§7.", + "item.gtceu.advanced_fluid_detector_cover": "Вдосконалений детектор рідин", + "item.gtceu.advanced_fluid_detector_cover.tooltip": "§7Видає§f RS-засув§7 контрольований§f статус наявної рідини§7 як редстоун та§f кришка§7.", + "item.gtceu.advanced_fluid_voiding_cover": "Вдосконалена кришка видалення рідини", + "item.gtceu.advanced_fluid_voiding_cover.tooltip.0": "§7Видаляє§f рідини§7 з контролем кількості, як§f кришка§7.", + "item.gtceu.advanced_fluid_voiding_cover.tooltip.1": "Активуйте§f киянкою§7 після розміщення.", + "item.gtceu.advanced_integrated_circuit": "Вдосконалена інтегральна схема", + "item.gtceu.advanced_integrated_circuit.tooltip.0": "§7Менша та потужніша", + "item.gtceu.advanced_integrated_circuit.tooltip.1": "§6Схема HV рівня", + "item.gtceu.advanced_item_detector_cover": "Вдосконалений детектор предметів", + "item.gtceu.advanced_item_detector_cover.tooltip": "§7Видає§f RS-засув§7 контрольований§f статус наявних предметів§7 як редстоун та§f кришка§7.", + "item.gtceu.advanced_item_voiding_cover": "Вдосконалена кришка видалення предметів", + "item.gtceu.advanced_item_voiding_cover.tooltip.0": "§7Видаляє§f предмети§7 з контролем кількості, як§f кришка§7.", + "item.gtceu.advanced_item_voiding_cover.tooltip.1": "Активуйте§f киянкою§7 після розміщення.", + "item.gtceu.advanced_nanomuscle_chestplate": "Нагрудник вдосконаленого костюма NanoMuscle™", + "item.gtceu.advanced_power_thruster": "Вдосконалений силовий рушій", + "item.gtceu.advanced_quarktech_chestplate": "Нагрудник вдосконаленого костюма QuarkTech™", + "item.gtceu.advanced_smd_capacitor": "Вдосконалений SMD конденсатор", + "item.gtceu.advanced_smd_capacitor.tooltip": "§7Вдосконалений електронний компонент", + "item.gtceu.advanced_smd_diode": "Вдосконалений SMD діод", + "item.gtceu.advanced_smd_diode.tooltip": "§7Вдосконалений електронний компонент", + "item.gtceu.advanced_smd_inductor": "Вдосконалений SMD індуктор", + "item.gtceu.advanced_smd_inductor.tooltip": "§7Вдосконалений електронний компонент", + "item.gtceu.advanced_smd_resistor": "Вдосконалений SMD резистор", + "item.gtceu.advanced_smd_resistor.tooltip": "§7Вдосконалений електронний компонент", + "item.gtceu.advanced_smd_transistor": "Вдосконалений SMD транзистор", + "item.gtceu.advanced_smd_transistor.tooltip": "§7Вдосконалений електронний компонент", + "item.gtceu.advanced_soc": "ASoC", + "item.gtceu.advanced_soc.tooltip": "§7Вдосконалена система на чіпі", + "item.gtceu.advanced_soc_wafer": "Підкладка ASoC", + "item.gtceu.advanced_soc_wafer.tooltip": "§7Заготовка вдосконаленої схеми", + "item.gtceu.aluminium_fluid_cell": "Алюмінієва комірка (%s)", + "item.gtceu.anvil_casting_mold": "Відливна форма (ковадло)", + "item.gtceu.anvil_casting_mold.tooltip": "§7Форма для формування ковадл", "item.gtceu.armor.boots": "Чоботи (%s)", "item.gtceu.armor.chestplate": "Нагрудник (%s)", "item.gtceu.armor.helmet": "Шолом (%s)", "item.gtceu.armor.leggings": "Наголінники (%s)", "item.gtceu.ash_dust": "Попіл", - "item.gtceu.axe_extruder_mold.tooltip": "§7Форма екструдора для виготовлення сокир", - "item.gtceu.ball_casting_mold": "Ливарна форма кулі", + "item.gtceu.axe_extruder_mold.tooltip": "§7Формовий відтиск для виготовлення сокир", + "item.gtceu.ball_casting_mold": "Відливна форма (куля)", "item.gtceu.ball_casting_mold.tooltip": "§7Форма для виготовлення куль", "item.gtceu.basaltic_mineral_sand_dust": "Базальтовий мінеральний пісок", - "item.gtceu.basic_electronic_circuit": "Електрична схема", + "item.gtceu.basic_electronic_circuit": "Базова електросхема", "item.gtceu.basic_electronic_circuit.tooltip.0": "§7Ваша перша схема", - "item.gtceu.basic_electronic_circuit.tooltip.1": "§cСхема НН", - "item.gtceu.basic_integrated_circuit": "Інтегральна схема", - "item.gtceu.basic_integrated_circuit.tooltip.0": "§7Мала та потужна", - "item.gtceu.basic_integrated_circuit.tooltip.1": "§6Схема НН", - "item.gtceu.basic_tape": "Ізоляційна стрічка", - "item.gtceu.basic_tape.tooltip": "§7Недостатньо міцна для механічних проблем\nМожна використовувати для підняття ящиків, не викидаючи їх предмети", - "item.gtceu.battery.charge_detailed": "%s/%s EU§7 — рівень %s §7(%s/%s %s залишилося§7)", - "item.gtceu.battery.charge_time": "§aМає %s %s енергії (%s)", + "item.gtceu.basic_electronic_circuit.tooltip.1": "§cСхема LV рівня", + "item.gtceu.basic_integrated_circuit": "Базова інтегральна схема", + "item.gtceu.basic_integrated_circuit.tooltip.0": "§7Менша та потужніша", + "item.gtceu.basic_integrated_circuit.tooltip.1": "§6Схема LV рівня", + "item.gtceu.basic_tape": "Клейка стрічка", + "item.gtceu.basic_tape.tooltip": "§7Недостатньо міцна для механічних проблем\nМожна використовувати для підняття ящиків, не скидаючи предмети з них", + "item.gtceu.battery.charge_detailed": "%s/%s EU§7 - рівень %s §7(§aзалишилось %s/%s %s§7)", + "item.gtceu.battery.charge_time": "§aМістить %s %s заряду (%s)", "item.gtceu.battery.charge_unit.hour": "годин", "item.gtceu.battery.charge_unit.minute": "хвилин", "item.gtceu.battery.charge_unit.second": "секунд", "item.gtceu.bentonite_dust": "Бентоніт", - "item.gtceu.bio_chaff": "Біологічні відходи", - "item.gtceu.black_dye_spray_can": "Балончик чорної фарби", - "item.gtceu.black_glass_lens": "Чорна скляна лінза", + "item.gtceu.bio_chaff": "Біо полова", + "item.gtceu.black_dye_spray_can": "Аерозольний балончик (чорний)", + "item.gtceu.black_glass_lens": "Скляна лінза (Чорна)", "item.gtceu.blacklight": "Чорне світло", - "item.gtceu.blacklight.tooltip": "Довгохвильове §dультрафіолетове§7 джерело світла", - "item.gtceu.block_casting_mold": "Ливарна форма блока", + "item.gtceu.blacklight.tooltip": "Довгохвильове§d ультрафіолетове§7 джерело світла", + "item.gtceu.block_casting_mold": "Відливна форма (блок)", "item.gtceu.block_casting_mold.tooltip": "§7Форма для виготовлення блоків", - "item.gtceu.block_extruder_mold": "Форма екструдора блока", - "item.gtceu.block_extruder_mold.tooltip": "§7Форма екструдора для виготовлення блоків", - "item.gtceu.blue_dye_spray_can": "Балончик синьої фарби", - "item.gtceu.blue_glass_lens": "Синя скляна лінза", - "item.gtceu.bolt_extruder_mold": "Форма екструдора болта", - "item.gtceu.bolt_extruder_mold.tooltip": "§7Форма екструдора для виготовлення болтів", + "item.gtceu.block_extruder_mold": "Відтискна форма (блок)", + "item.gtceu.block_extruder_mold.tooltip": "§7Формовий відтиск для виготовлення блоків", + "item.gtceu.blue_dye_spray_can": "Аерозольний балончик (синій)", + "item.gtceu.blue_glass_lens": "Скляна лінза (Синя)", + "item.gtceu.bolt_extruder_mold": "Відтискна форма (болт)", + "item.gtceu.bolt_extruder_mold.tooltip": "§7Формовий відтиск для виготовлення болтів", "item.gtceu.bone_dust": "Кісткове борошно", - "item.gtceu.borosilicate_glass_ingot": "Боросилікатна скляна лінза", - "item.gtceu.bottle.purple.drink.tooltip": "§7Як щодо лимонаду. Або трохи холодного чаю? Я отримав фіолетовий напій!", - "item.gtceu.bottle_casting_mold": "Ливарна форма пляшки", + "item.gtceu.borosilicate_glass_ingot": "Злиток боросилікатного скла", + "item.gtceu.bottle.purple.drink.tooltip": "§7Як щодо лимонаду? або чаю з льодом? У мене є фіолетовий напій!", + "item.gtceu.bottle_casting_mold": "Відливна форма (пляшка)", "item.gtceu.bottle_casting_mold.tooltip": "§7Форма для виготовлення пляшок", - "item.gtceu.bottle_extruder_mold": "Форма екструдора пляшки", - "item.gtceu.bottle_extruder_mold.tooltip": "§7Форма екструдора для виготовлення пляшок", + "item.gtceu.bottle_extruder_mold": "Відтискна форма (пляшка)", + "item.gtceu.bottle_extruder_mold.tooltip": "§7Формовий відтиск для виготовлення пляшок", "item.gtceu.brick_wooden_form": "Дерев'яна форма цеглини", - "item.gtceu.brown_dye_spray_can": "Балончик коричневої фарби", - "item.gtceu.brown_glass_lens": "Коричнева скляна лінза", - "item.gtceu.bucket": "Відро (%s)", + "item.gtceu.brown_dye_spray_can": "Аерозольний балончик (коричневий)", + "item.gtceu.brown_glass_lens": "Скляна лінза (Коричнева)", + "item.gtceu.bucket": "%s (у відрі)", "item.gtceu.capacitor": "Конденсатор", - "item.gtceu.capacitor.tooltip": "§7Електричний компонент", + "item.gtceu.capacitor.tooltip": "§7Базовий електронний компонент", "item.gtceu.carbon_fiber_mesh": "Сітка з вуглецевого волокна", "item.gtceu.carbon_fiber_plate": "Плита з вуглецевого волокна", - "item.gtceu.carbon_fibers": "Сирі вуглецеві волокна", - "item.gtceu.casing_casting_mold.tooltip": "§7Форма для виготовлення обшивки предметів", - "item.gtceu.casing_extruder_mold.tooltip": "§7Форма екструдора для виготовлення обшивки предметів", + "item.gtceu.carbon_fibers": "Сире вуглецеве волокно", + "item.gtceu.casing_casting_mold.tooltip": "§7Форма для виготовлення предметних каркасів", + "item.gtceu.casing_extruder_mold.tooltip": "§7Формовий відтиск для виготовлення предметних корпусів", "item.gtceu.cassiterite_sand_dust": "Каситеритовий пісок", - "item.gtceu.cell_extruder_mold": "Форма екструдора капсули", - "item.gtceu.cell_extruder_mold.tooltip": "§7Форма екструдора для виготовлення капсул", - "item.gtceu.chemical_black_dye": "Чорний хімічний барвник", - "item.gtceu.chemical_blue_dye": "Синій хімічний барвник", - "item.gtceu.chemical_brown_dye": "Коричневий хімічний барвник", - "item.gtceu.chemical_cyan_dye": "Бірюзовий хімічний барвник", - "item.gtceu.chemical_gray_dye": "Сірий хімічний барвник", - "item.gtceu.chemical_green_dye": "Зелений хімічний барвник", - "item.gtceu.chemical_light_blue_dye": "Блакитний хімічний барвник", - "item.gtceu.chemical_light_gray_dye": "Світло-сірий хімічний барвник", - "item.gtceu.chemical_lime_dye": "Лаймовий хімічний барвник", - "item.gtceu.chemical_magenta_dye": "Пурпуровий хімічний барвник", - "item.gtceu.chemical_orange_dye": "Помаранчевий хімічний барвник", - "item.gtceu.chemical_pink_dye": "Рожевий хімічний барвник", - "item.gtceu.chemical_purple_dye": "Фіолетовий хімічний барвник", - "item.gtceu.chemical_red_dye": "Червоний хімічний барвник", - "item.gtceu.chemical_white_dye": "Білий хімічний барвник", - "item.gtceu.chemical_yellow_dye": "Жовтий хімічний барвник", - "item.gtceu.chipped_glass_gem": "Уламки скляного кристалу", - "item.gtceu.chipped_sugar_gem": "Малі кубики цукру", - "item.gtceu.circuit.integrated.gui": "§7Запрограмовані налаштовуванні схеми", + "item.gtceu.cell_extruder_mold": "Відтискна форма (комірка)", + "item.gtceu.cell_extruder_mold.tooltip": "§7Формовий відтиск для виготовлення комірок", + "item.gtceu.chemical_black_dye": "Хімічний чорний барвник", + "item.gtceu.chemical_blue_dye": "Хімічний синій барвник", + "item.gtceu.chemical_brown_dye": "Хімічний коричневий барвник", + "item.gtceu.chemical_cyan_dye": "Хімічний бірюзовий барвник", + "item.gtceu.chemical_gray_dye": "Хімічний сірий барвник", + "item.gtceu.chemical_green_dye": "Хімічний зелений барвник", + "item.gtceu.chemical_light_blue_dye": "Хімічний блакитний барвник", + "item.gtceu.chemical_light_gray_dye": "Хімічний світло-сірий барвник", + "item.gtceu.chemical_lime_dye": "Хімічний лаймовий барвник", + "item.gtceu.chemical_magenta_dye": "Хімічний пурпурний барвник", + "item.gtceu.chemical_orange_dye": "Хімічний помаранчевий барвник", + "item.gtceu.chemical_pink_dye": "Хімічний рожевий барвник", + "item.gtceu.chemical_purple_dye": "Хімічний фіолетовий барвник", + "item.gtceu.chemical_red_dye": "Хімічний червоний барвник", + "item.gtceu.chemical_white_dye": "Хімічний білий барвник", + "item.gtceu.chemical_yellow_dye": "Хімічний жовтий барвник", + "item.gtceu.chipped_glass_gem": "Надщерблений скляний кристал", + "item.gtceu.chipped_sugar_gem": "Маленький кубик цукру", + "item.gtceu.circuit.integrated.gui": "§7Конфігурація програмної плати", "item.gtceu.coke_oven_brick": "Цеглина коксової печі", - "item.gtceu.compressed_clay": "Спресована глина", - "item.gtceu.compressed_coke_clay": "Спресована коксова глина", - "item.gtceu.compressed_fireclay": "Спресований шамот", - "item.gtceu.computer_monitor_cover": "Монітор комп'ютера", - "item.gtceu.computer_monitor_cover.tooltip": "§7Показує §fдані§7 як §fмодифікатор§7.", - "item.gtceu.conveyor.module.tooltip": "§7Передає §fпредмети§7 за певними ставками як §fмодифікатор§7.", - "item.gtceu.cpu_chip": "Чип ЦП", - "item.gtceu.cpu_chip.tooltip": "§7Центральний процесор", - "item.gtceu.cpu_wafer": "Напівпровідникова пластина ЦП", - "item.gtceu.cpu_wafer.tooltip": "§7Сирий центральний процессор", - "item.gtceu.crushed_bentonite_ore": "Шматок бентоніту", - "item.gtceu.crushed_cassiterite_sand_ore": "Шматок каситеритового піску", - "item.gtceu.crushed_pitchblende_ore": "Шматок уранініту", - "item.gtceu.crushed_talc_ore_ore": "Шматок тальку", - "item.gtceu.crystal_cpu": "Кристал ЦП", - "item.gtceu.crystal_cpu.tooltip": "§7Кристал центрального процесора", - "item.gtceu.crystal_processor": "Кристал процесора", - "item.gtceu.crystal_processor.tooltip.0": "§7Скористайтеся перевагами гравіювання кристалу", - "item.gtceu.crystal_processor.tooltip.1": "§9Схема БН", - "item.gtceu.crystal_processor_assembly": "Збірка кристалу процесора", - "item.gtceu.crystal_processor_assembly.tooltip.0": "§7Скористайтеся перевагами гравіювання кристалу", - "item.gtceu.crystal_processor_assembly.tooltip.1": "§9Схема АН", - "item.gtceu.crystal_processor_computer": "Кристал процесора надкомп'ютера", - "item.gtceu.crystal_processor_computer.tooltip.0": "§7Скористайтеся перевагами гравіювання кристалу", - "item.gtceu.crystal_processor_computer.tooltip.1": "§9Схема НТМ", - "item.gtceu.crystal_processor_mainframe": "Кристал процесора мейнфрейма", - "item.gtceu.crystal_processor_mainframe.tooltip.0": "§7Скористайтеся перевагами гравіювання кристалу", - "item.gtceu.crystal_processor_mainframe.tooltip.1": "§9Схема ІН", - "item.gtceu.crystal_soc": "Кристал СнЧ", - "item.gtceu.crystal_soc.tooltip": "§7Кристал системи на чипі", - "item.gtceu.cyan_dye_spray_can": "Балончик бірюзової фарби", - "item.gtceu.cyan_glass_lens": "Бірюзова скляна лінза", - "item.gtceu.cylinder_casting_mold": "Ливарна форма циліндру", - "item.gtceu.cylinder_casting_mold.tooltip": "§7Форма для виготовлення циліндрів", + "item.gtceu.compressed_clay": "Пресована глина", + "item.gtceu.compressed_coke_clay": "Пресована коксова глина", + "item.gtceu.compressed_fireclay": "Пресована шамотна глина", + "item.gtceu.computer_monitor_cover": "Комп'ютерний монітор", + "item.gtceu.computer_monitor_cover.tooltip": "§7Відображає§f дані§7 як§f кришка§7.", + "item.gtceu.conveyor.module.tooltip": "§7Переміщує§f предмети§7 із певною кількістю як§f кришка§7.", + "item.gtceu.cpu_chip": "Чіп CPU", + "item.gtceu.cpu_chip.tooltip": "§7Центральний процесорний блок", + "item.gtceu.cpu_wafer": "Підкладка CPU", + "item.gtceu.cpu_wafer.tooltip": "§7Заготовка процесорного блоку", + "item.gtceu.crushed_bentonite_ore": "Дроблений бентоніт", + "item.gtceu.crushed_cassiterite_sand_ore": "Дроблений каситеритовий пісок", + "item.gtceu.crushed_pitchblende_ore": "Дроблений настуран", + "item.gtceu.crushed_talc_ore_ore": "Дроблений тальк", + "item.gtceu.crystal_cpu": "Кришталевий CPU", + "item.gtceu.crystal_cpu.tooltip": "§7Кришталевий процесорний блок", + "item.gtceu.crystal_processor": "Кришталевий процесор", + "item.gtceu.crystal_processor.tooltip.0": "§7Використання переваг кришталевого гравіювання", + "item.gtceu.crystal_processor.tooltip.1": "§9Схема IV рівня", + "item.gtceu.crystal_processor_assembly": "Кришталевий процесорний вузол", + "item.gtceu.crystal_processor_assembly.tooltip.0": "§7Використання переваг кришталевого гравіювання", + "item.gtceu.crystal_processor_assembly.tooltip.1": "§9Схема LuV рівня", + "item.gtceu.crystal_processor_computer": "Кришталевий процесорний суперкомп'ютер", + "item.gtceu.crystal_processor_computer.tooltip.0": "§7Використання переваг кришталевого гравіювання", + "item.gtceu.crystal_processor_computer.tooltip.1": "§9Схема ZPM рівня", + "item.gtceu.crystal_processor_mainframe": "Кришталевий процесорний мейнфрейм", + "item.gtceu.crystal_processor_mainframe.tooltip.0": "§7Використання переваг кришталевого гравіювання", + "item.gtceu.crystal_processor_mainframe.tooltip.1": "§9Схема UV рівня", + "item.gtceu.crystal_soc": "Кришталева SoC", + "item.gtceu.crystal_soc.tooltip": "§7Кришталева система на чіпі", + "item.gtceu.cyan_dye_spray_can": "Аерозольний балончик (бірюзовий)", + "item.gtceu.cyan_glass_lens": "Скляна лінза (Бірюзова)", + "item.gtceu.cylinder_casting_mold": "Відливна форма (циліндр)", + "item.gtceu.cylinder_casting_mold.tooltip": "§7Форма для формування циліндрів", "item.gtceu.dark_ash_dust": "Темний попіл", "item.gtceu.data_module": "Модуль даних", "item.gtceu.data_orb": "Сфера даних", - "item.gtceu.data_orb.tooltip": "§7Сховище даних великої місткости", - "item.gtceu.data_stick": "Флешка", - "item.gtceu.data_stick.tooltip": "§7Сховище даних малої місткости", - "item.gtceu.diamond_grinding_head": "Діамантовий шліфувальний наконечник", + "item.gtceu.data_orb.tooltip": "§7Сховище даних великої місткості", + "item.gtceu.data_stick": "Картка даних", + "item.gtceu.data_stick.tooltip": "§7Сховище даних малої місткості", + "item.gtceu.diamond_grinding_head": "Діамантова шліфувальна головка", "item.gtceu.diode": "Діод", - "item.gtceu.diode.tooltip": "§7Звичайний електричний компонент", + "item.gtceu.diode.tooltip": "§7Базовий електронний компонент", "item.gtceu.dough": "Тісто", - "item.gtceu.duct_tape": "Посилена клейка ізоляційна стрічка", - "item.gtceu.duct_tape.tooltip": "§7Якщо ви не можете це виправити, використовуйте більше!", + "item.gtceu.duct_tape": "BrainTech аерокосмічна вдосконалена армована клейка стрічка FAL-84", + "item.gtceu.duct_tape.tooltip": "§7Якщо ви не можете виправити це за допомогою цього, використовуйте більше!", "item.gtceu.dynamite": "Динамітна шашка", - "item.gtceu.electric.pump.tooltip": "§7Передає §fрідини§7 за певними ставками як §fмодифікатор§7.", - "item.gtceu.electric_jetpack": "Електричний ранець", + "item.gtceu.electric.pump.tooltip": "§7Переміщує§f рідини§7 із певною кількістю як§f кришка§7.", + "item.gtceu.electric_jetpack": "Електричний реактивний ранець", "item.gtceu.empty_mold": "Порожня форма", - "item.gtceu.empty_mold.tooltip": "§7Сира пластина для виготовлення форм", - "item.gtceu.empty_spray_can": "Порожній балончик", - "item.gtceu.empty_spray_can.tooltip": "§7Можна наповнювати різними кольорами", + "item.gtceu.empty_mold.tooltip": "§7Сира плита для виготовлення прес-форм та формових відтисків", + "item.gtceu.empty_spray_can": "Аерозольний балончик (порожній)", + "item.gtceu.empty_spray_can.tooltip": "§7Можна наповнити аерозолем різних кольорів", "item.gtceu.empty_wooden_form": "Порожня дерев'яна форма", - "item.gtceu.ender_fluid_link_cover": "Посилання рідин Енду", - "item.gtceu.ender_fluid_link_cover.tooltip": "§7Транспортує §fрідини§7 за допомогою §fбездротового приєднання §dЕнду§7 як §fмодифікатор§7.", - "item.gtceu.ender_item_link_cover": "Посилання предмета Енду", - "item.gtceu.ender_redstone_link_cover": "Посилання редстоуну Енду", + "item.gtceu.ender_fluid_link_cover": "Рідинний зв'язок Енду", + "item.gtceu.ender_fluid_link_cover.tooltip": "§7Переміщує §fрідини§7 за допомогою§f бездротового з'єднання §dЕнду§7 як§f кришка§7.", + "item.gtceu.ender_item_link_cover": "Предметний зв'язок Енду", + "item.gtceu.ender_redstone_link_cover": "Редстоуновий зв'язок Енду", "item.gtceu.energium_dust": "Енергієвий пил", - "item.gtceu.energy_cluster": "Кластер енергії", + "item.gtceu.energy_cluster": "Енергетичний кластер", "item.gtceu.energy_cluster.tooltip": "§7Багаторазова батарея", "item.gtceu.energy_crystal": "Енергієвий кристал", "item.gtceu.energy_crystal.tooltip": "§7Багаторазова батарея", - "item.gtceu.energy_detector_cover": "Датчик енергії", - "item.gtceu.energy_detector_cover.tooltip": "§7Видає §fкількість енергії§7 сигналом редстоуну як §fмодифікатор§7.", - "item.gtceu.energy_module": "Модуль енергії", + "item.gtceu.energy_detector_cover": "Енергетичний детектор", + "item.gtceu.energy_detector_cover.tooltip": "§7Видає§f кількість енергії§7 як редстоун та§f кришка§7.", + "item.gtceu.energy_module": "Енергетичний модуль", "item.gtceu.energy_module.tooltip": "§7Багаторазова батарея", - "item.gtceu.engraved_crystal_chip": "Гравійований кристал чипу", - "item.gtceu.engraved_crystal_chip.tooltip": "§7Потрібен для схем", - "item.gtceu.engraved_lapotron_crystal_chip": "Гравійований лапотронний кристал чипуp", + "item.gtceu.engraved_crystal_chip": "Гравірований кришталевий чіп", + "item.gtceu.engraved_crystal_chip.tooltip": "§7Потрібно для схем", + "item.gtceu.engraved_lapotron_crystal_chip": "Гравірований лапотронний кришталевий чіп", "item.gtceu.epoxy_circuit_board": "Епоксидна плата", - "item.gtceu.epoxy_circuit_board.tooltip": "§7Покращена плата", + "item.gtceu.epoxy_circuit_board.tooltip": "§7Вдосконалена плата", "item.gtceu.epoxy_printed_circuit_board": "Епоксидна друкована плата", - "item.gtceu.epoxy_printed_circuit_board.tooltip": "§7Покращена плата", - "item.gtceu.ev_battery_hull": "Малий ванадієвий корпус батареї", - "item.gtceu.ev_battery_hull.tooltip": "§7Порожній корпус батареї §5ЕН", - "item.gtceu.ev_conveyor_module": "Конвеєрний модуль ЕН", - "item.gtceu.ev_electric_motor": "Електродвигун ЕН", - "item.gtceu.ev_electric_piston": "Електропоршень ЕН", - "item.gtceu.ev_electric_pump": "Електропомпа ЕН", - "item.gtceu.ev_emitter": "Випромінювач ЕН", - "item.gtceu.ev_field_generator": "Генератор полі ЕН", - "item.gtceu.ev_fluid_regulator": "Регулятор рідини ЕН", - "item.gtceu.ev_power_unit": "Блок живлення ЕН", - "item.gtceu.ev_robot_arm": "Робо-рука ЕН", - "item.gtceu.ev_sensor": "Сенсор ЕН", + "item.gtceu.epoxy_printed_circuit_board.tooltip": "§7Вдосконалена плата", + "item.gtceu.ev_battery_hull": "Малий корпус ванадієвої батареї", + "item.gtceu.ev_battery_hull.tooltip": "§7Порожній корпус§5 EV§7 батареї", + "item.gtceu.ev_conveyor_module": "EV конвеєрний модуль", + "item.gtceu.ev_electric_motor": "EV електричний мотор", + "item.gtceu.ev_electric_piston": "EV електричний поршень", + "item.gtceu.ev_electric_pump": "EV електрична помпа", + "item.gtceu.ev_emitter": "EV випромінювач", + "item.gtceu.ev_field_generator": "EV генератор поля", + "item.gtceu.ev_fluid_regulator": "EV регулятор рідини", + "item.gtceu.ev_power_unit": "EV блок живлення", + "item.gtceu.ev_robot_arm": "EV маніпулятор", + "item.gtceu.ev_sensor": "EV сенсор", "item.gtceu.ev_solar_panel": "Сонячна панель екстремальної напруги", "item.gtceu.ev_vanadium_battery": "Мала ванадієва батарея", "item.gtceu.ev_vanadium_battery.tooltip": "§7Багаторазова батарея", - "item.gtceu.ev_voltage_coil": "Мала котушка екстремальної напруги", - "item.gtceu.ev_voltage_coil.tooltip": "Мала та екстремальна котушка", - "item.gtceu.exquisite_glass_gem": "Вишуканий скляний кристал", - "item.gtceu.facade_cover": "Фасад модифікатора — %s", - "item.gtceu.facade_cover.tooltip.0": "§7Декорація §fмодифікатора§7.", - "item.gtceu.facade_cover.tooltip.1": "§7Майструється використанням 3 залізних пластин і блока", - "item.gtceu.face_mask": "Маска для обличчя", + "item.gtceu.ev_voltage_coil": "Котушка екстремальної напруги", + "item.gtceu.ev_voltage_coil.tooltip": "Екстремальна котушка", + "item.gtceu.exquisite_glass_gem": "Бездоганний скляний кристал", + "item.gtceu.facade_cover": "Накладний фасад (%s)", + "item.gtceu.facade_cover.tooltip.0": "§7Декоративне§f покриття§7.", + "item.gtceu.facade_cover.tooltip.1": "§7Створюється із залізного листа та будь-якого блоку", + "item.gtceu.face_mask": "Лицьова маска", "item.gtceu.fertilizer": "Добриво", - "item.gtceu.fiber_reinforced_circuit_board": "Посилена волокном плата", + "item.gtceu.fiber_reinforced_circuit_board": "Армована волокном плата", "item.gtceu.fiber_reinforced_circuit_board.tooltip": "§7Екстремальна плата", - "item.gtceu.fiber_reinforced_printed_circuit_board": "Посилена волокном друкована плата", - "item.gtceu.fiber_reinforced_printed_circuit_board.tooltip": "§7Більш вдосконалена друкована плата", - "item.gtceu.file_extruder_mold.tooltip": "§7Форма екструдора для виготовлення напильників", - "item.gtceu.fine_borosilicate_glass_wire": "Боросилікатне скляне волокно", - "item.gtceu.firebrick": "Вогнетривка цеглина", - "item.gtceu.firebrick.tooltip": "§7Стійка до нагріву", - "item.gtceu.flawed_glass_gem": "Тріснутий скляний кристал", + "item.gtceu.fiber_reinforced_printed_circuit_board": "Армована волокном друкована плата", + "item.gtceu.fiber_reinforced_printed_circuit_board.tooltip": "§7Вдосконаленіша плата", + "item.gtceu.file_extruder_mold.tooltip": "§7Формовий відтиск для виготовлення напилків", + "item.gtceu.fine_borosilicate_glass_wire": "Боросилікатне скловолокно", + "item.gtceu.firebrick": "Шамотна цеглина", + "item.gtceu.firebrick.tooltip": "§7Термостійка", + "item.gtceu.flawed_glass_gem": "Огранований скляний кристал", "item.gtceu.flawed_sugar_gem": "Крихітний кубик цукру", - "item.gtceu.flawless_glass_gem": "Бездоганний скляний кристал", - "item.gtceu.fluid.regulator.tooltip": "§7Обмежує §fрідину§7 певною кількістю як §fмодифікатор§7.", - "item.gtceu.fluid_cell": "Рідинна капусла (%s)", - "item.gtceu.fluid_detector_cover": "Датчик рідини", - "item.gtceu.fluid_detector_cover.tooltip": "§7Видає §fкількість рідини§7 сигналом редстоуну як §fмодифікатор§7.", - "item.gtceu.fluid_filter": "Рідинний фільтр", - "item.gtceu.fluid_filter.tooltip.0": "§7Фільтрує вхід/вихід §fрідини§7 як §fмодифікатор§7.", - "item.gtceu.fluid_filter.tooltip.1": "Можна використовувати як оновлення §fелектричної помпи§7 і §fрегулятор рідини§7.", - "item.gtceu.fluid_tag_filter": "Фільтр топильних теґів", - "item.gtceu.fluid_tag_filter.tooltip.0": "§7Фільтрує вхід/вихід §fрідини§7 за допомогою §fтеґів§7 як §fмодифікатор§7.", - "item.gtceu.fluid_tag_filter.tooltip.1": "Можна використовувати як оновлення §fелектричної помпи§7 і §fрегулятор рідини§7.", - "item.gtceu.fluid_voiding_cover": "Модифікатор знищення рідини", - "item.gtceu.fluid_voiding_cover.tooltip.0": "§7Знищує §fрідини§7 як §fмодифікатор§7.", - "item.gtceu.fluid_voiding_cover.tooltip.1": "Активується за допомогою §fм'якого молотка§7 після розміщення.", - "item.gtceu.foam_sprayer.tooltip.0": "§7Розпилює будівельну піну", - "item.gtceu.foam_sprayer.tooltip.1": "Використовуйте на рамі для з'єднування рам", + "item.gtceu.flawless_glass_gem": "Вишуканий скляний кристал", + "item.gtceu.fluid.regulator.tooltip": "§7Обмежує§f рідини§7 до певної кількості як§f кришка§7.", + "item.gtceu.fluid_cell": "Рідинна комірка (%s)", + "item.gtceu.fluid_detector_cover": "Детектор рідин", + "item.gtceu.fluid_detector_cover.tooltip": "§7Видає§f кількість рідини§7 як редстоун та§f кришка§7.", + "item.gtceu.fluid_filter": "Фільтр рідин", + "item.gtceu.fluid_filter.tooltip.0": "§7Фільтрує§f рідинний§7 вхід/вихід як§f кришка§7.", + "item.gtceu.fluid_filter.tooltip.1": "Може використовуватися як§f електрична помпа§7 та покращення§f рідинного регулятора§7.", + "item.gtceu.fluid_tag_filter": "Рідинний теговий фільтр", + "item.gtceu.fluid_tag_filter.tooltip.0": "§7Фільтрує§f рідинний§7 вхід/вихід із§f рідинними тегами§7 як§f кришка§7.", + "item.gtceu.fluid_tag_filter.tooltip.1": "Може використовуватися як§f електрична помпа§7 та покращення§f рідинного регулятора§7.", + "item.gtceu.fluid_voiding_cover": "Кришка видалення рідини", + "item.gtceu.fluid_voiding_cover.tooltip.0": "§7Видаляє§f рідини§7 як§f кришка§7.", + "item.gtceu.fluid_voiding_cover.tooltip.1": "Активуйте§f киянкою§7 після розміщення.", + "item.gtceu.foam_sprayer.tooltip.0": "§7Розпилює будівельну піні", + "item.gtceu.foam_sprayer.tooltip.1": "Використовуйте на боці, щоб вкрити піною прилеглі сторони", "item.gtceu.foam_sprayer.tooltip.2": "Піну можна пофарбувати", - "item.gtceu.foil_extruder_mold": "Форма екструдора фольги", - "item.gtceu.foil_extruder_mold.tooltip": "§7Форма екструдора для виготовлення з неметалів", - "item.gtceu.fullers_earth_dust": "Пил відбілювальні глини", - "item.gtceu.garnet_sand_dust": "Пил гранатового піску", - "item.gtceu.gear_casting_mold": "Ливарна форма шестерні", + "item.gtceu.foil_extruder_mold": "Відтискна форма (тонка пластина)", + "item.gtceu.foil_extruder_mold.tooltip": "§7Формовий відтиск для виготовлення тонких пластин", + "item.gtceu.fullers_earth_dust": "Відбілювальні глини", + "item.gtceu.garnet_sand_dust": "Гранатовий пісок", + "item.gtceu.gear_casting_mold": "Відливна форма (шестерня)", "item.gtceu.gear_casting_mold.small.tooltip": "§7Форма для виготовлення малих шестерень", "item.gtceu.gear_casting_mold.tooltip": "§7Форма для виготовлення шестерень", - "item.gtceu.gear_extruder_mold": "Форма екструдора шестерні", - "item.gtceu.gear_extruder_mold.tooltip": "§7Форма екструдора для виготовлення шестерень", - "item.gtceu.gear_small_extruder_mold.tooltip": "§7Форма екструдора для виготовлення малих шестерень", - "item.gtceu.gelled_toluene": "Гелеподібний толуол", + "item.gtceu.gear_extruder_mold": "Відтискна форма (шестерня)", + "item.gtceu.gear_extruder_mold.tooltip": "§7Формовий відтиск для виготовлення шестерень", + "item.gtceu.gear_small_extruder_mold.tooltip": "§7Формовий відтиск для виготовлення малих шестерень", + "item.gtceu.gelled_toluene": "Гелевий толуол", "item.gtceu.gelled_toluene.tooltip": "§7Сира вибухівка", "item.gtceu.glass_gem": "Скляний кристал", - "item.gtceu.glass_plate": "Скляна плита", + "item.gtceu.glass_plate": "Шибка", "item.gtceu.glass_tube": "Скляна трубка", "item.gtceu.glass_vial": "Скляна пробірка (%s)", - "item.gtceu.glauconite_sand_dust": "Пил глауконітового піску", - "item.gtceu.good_electronic_circuit": "Хороша електрична схема", + "item.gtceu.glauconite_sand_dust": "Глауконітове скло", + "item.gtceu.good_electronic_circuit": "Хороша електросхема", "item.gtceu.good_electronic_circuit.tooltip.0": "§7Ваша друга схема", - "item.gtceu.good_electronic_circuit.tooltip.1": "§cСхема СН", + "item.gtceu.good_electronic_circuit.tooltip.1": "§cСхема MV рівня", "item.gtceu.good_integrated_circuit": "Хороша інтегральна схема", - "item.gtceu.good_integrated_circuit.tooltip.0": "§7Мала та потужна", - "item.gtceu.good_integrated_circuit.tooltip.1": "§6Схема СН", - "item.gtceu.granitic_mineral_sand_dust": "Пил гранітного мінерального піску", - "item.gtceu.gravi_star": "Гравізірка", - "item.gtceu.gravi_star.tooltip": "§7Ідеадьна зірка Незеру", - "item.gtceu.gravitation_engine_unit": "Гравідвигун", - "item.gtceu.gray_dye_spray_can": "Балончик сірої фарби", - "item.gtceu.gray_glass_lens": "Сіра скляна лінза", - "item.gtceu.green_dye_spray_can": "Балончик зеленої фарби", - "item.gtceu.green_glass_lens": "Зелена скляна лінза", - "item.gtceu.hammer_extruder_mold.tooltip": "§7Форма екструдора для виготовлення молотів", - "item.gtceu.hazmat_boots": "Чоботи хімзахисту", - "item.gtceu.hazmat_chestpiece": "Нагрудник хімзахисту", - "item.gtceu.hazmat_headpiece": "Шолом хімзахисту", - "item.gtceu.hazmat_leggings": "Штани хімзахисту", - "item.gtceu.highly_advanced_soc": "ВпСнЧ", - "item.gtceu.highly_advanced_soc.tooltip": "§7Високопокращена система на чипі", - "item.gtceu.highly_advanced_soc_wafer": "Напівпровідникова пластина ВпСнЧ", - "item.gtceu.highly_advanced_soc_wafer.tooltip": "§7Сира високопокращена схема", - "item.gtceu.hoe_extruder_mold.tooltip": "§7Форма екструдора для виготовлення мотик", - "item.gtceu.hpic_chip": "Чип ВнІС", - "item.gtceu.hpic_chip.tooltip": "§7Високонапружна інтегральна схема", - "item.gtceu.hpic_wafer": "Напівпровідникова пластина ВнІС", - "item.gtceu.hpic_wafer.tooltip": "§7Сира високонапружна схема", - "item.gtceu.huge_pipe_casting_mold": "Ливарна форма величезної труби", - "item.gtceu.huge_pipe_extruder_mold": "Форма екструдора величезної труби", + "item.gtceu.good_integrated_circuit.tooltip.0": "§7Менша та потужніша", + "item.gtceu.good_integrated_circuit.tooltip.1": "§6Схема MV рівня", + "item.gtceu.granitic_mineral_sand_dust": "Гранітний мінеральний пісок", + "item.gtceu.gravi_star": "Граві-зірка", + "item.gtceu.gravi_star.tooltip": "§7Ультимативна зірка Незеру", + "item.gtceu.gravitation_engine_unit": "Блок гравітаційного двигуна", + "item.gtceu.gray_dye_spray_can": "Аерозольний балончик (сірий)", + "item.gtceu.gray_glass_lens": "Скляна лінза (Сіра)", + "item.gtceu.green_dye_spray_can": "Аерозольний балончик (зелений)", + "item.gtceu.green_glass_lens": "Скляна лінза (Зелена)", + "item.gtceu.hammer_extruder_mold.tooltip": "§7Формовий відтиск для виготовлення малотків", + "item.gtceu.hazmat_boots": "Чоботи костюма для роботи з небезпечними матеріалами", + "item.gtceu.hazmat_chestpiece": "Куртка костюма для роботи з небезпечними матеріалами", + "item.gtceu.hazmat_headpiece": "Головний убір костюма для роботи з небезпечними матеріалами", + "item.gtceu.hazmat_leggings": "Штани костюма для роботи з небезпечними матеріалами", + "item.gtceu.highly_advanced_soc": "HASoC", + "item.gtceu.highly_advanced_soc.tooltip": "§7Високорозвинена система на чіпі", + "item.gtceu.highly_advanced_soc_wafer": "Підкладка HASoC", + "item.gtceu.highly_advanced_soc_wafer.tooltip": "§7Заготовка високорозвиненої схеми", + "item.gtceu.hoe_extruder_mold.tooltip": "§7Формовий відтиск для виготовлення мотик", + "item.gtceu.hpic_chip": "Чіп HPIC", + "item.gtceu.hpic_chip.tooltip": "§7IC високої напруги", + "item.gtceu.hpic_wafer": "Підкладка HPIC", + "item.gtceu.hpic_wafer.tooltip": "§7Заготовка високопотужної схеми", + "item.gtceu.huge_pipe_casting_mold": "Відливна форма (величезна труба)", + "item.gtceu.huge_pipe_extruder_mold": "Відтискна форма (величезна труба)", "item.gtceu.hv_battery_hull": "Великий корпус батареї", - "item.gtceu.hv_battery_hull.tooltip": "§7Порожній корпус батареї §6ВН", + "item.gtceu.hv_battery_hull.tooltip": "§7Порожній корпус§6 HV§7 батареї", "item.gtceu.hv_cadmium_battery": "Велика кадмієва батарея", "item.gtceu.hv_cadmium_battery.tooltip": "§7Багаторазова батарея", - "item.gtceu.hv_conveyor_module": "Модуль конвеєра ВН", - "item.gtceu.hv_electric_motor": "Електродвигун ВН", - "item.gtceu.hv_electric_piston": "Електропоршень ВН", - "item.gtceu.hv_electric_pump": "Електропомпа ВН", - "item.gtceu.hv_emitter": "Випромінювач ВН", - "item.gtceu.hv_field_generator": "Генератор полів ВН", - "item.gtceu.hv_fluid_regulator": "Регулятор рідини ВН", - "item.gtceu.hv_item_magnet": "Магніт ВН", + "item.gtceu.hv_conveyor_module": "HV конвеєрний модуль", + "item.gtceu.hv_electric_motor": "HV електричний мотор", + "item.gtceu.hv_electric_piston": "HV електричний поршень", + "item.gtceu.hv_electric_pump": "HV електрична помпа", + "item.gtceu.hv_emitter": "HV випромінювач", + "item.gtceu.hv_field_generator": "HV генератор поля", + "item.gtceu.hv_fluid_regulator": "HV регулятор рідини", + "item.gtceu.hv_item_magnet": "HV предметний магніт", "item.gtceu.hv_lithium_battery": "Велика літієва батарея", "item.gtceu.hv_lithium_battery.tooltip": "§7Багаторазова батарея", - "item.gtceu.hv_power_unit": "Блок живлення ВН", - "item.gtceu.hv_robot_arm": "Робо-рука ВН", - "item.gtceu.hv_sensor": "Сенсор ВН", + "item.gtceu.hv_power_unit": "HV блок живлення", + "item.gtceu.hv_robot_arm": "HV маніпулятор", + "item.gtceu.hv_sensor": "HV сенсор", "item.gtceu.hv_sodium_battery": "Велика натрієва батарея", "item.gtceu.hv_sodium_battery.tooltip": "§7Багаторазова батарея", "item.gtceu.hv_solar_panel": "Сонячна панель високої напруги", - "item.gtceu.hv_voltage_coil": "Мала котушка високої напруги", - "item.gtceu.hv_voltage_coil.tooltip": "Мала та покращена котушка", - "item.gtceu.ice_dust": "Льодяний пил", - "item.gtceu.ilc_chip": "Чип ІЛС", + "item.gtceu.hv_voltage_coil": "Котушка високої напруги", + "item.gtceu.hv_voltage_coil.tooltip": "Вдосконалена котушка", + "item.gtceu.ice_dust": "Подрібнений лід", + "item.gtceu.ilc_chip": "Чіп IC", "item.gtceu.ilc_chip.tooltip": "§7Інтегральна логічна схема", - "item.gtceu.ilc_wafer": "Напівпровідникова пластина ІЛС", - "item.gtceu.ilc_wafer.tooltip": "§7Сира інтегральна схема", + "item.gtceu.ilc_wafer": "Підкладка ILC", + "item.gtceu.ilc_wafer.tooltip": "§7Заготовка інтегральної схеми", "item.gtceu.image_module": "Модуль зображення", - "item.gtceu.impure_bentonite_dust": "Купка бентоніту з домішками", - "item.gtceu.impure_cassiterite_sand_dust": "Купка каситеритового піску з домішками", - "item.gtceu.impure_pitchblende_dust": "Купка уранініту з домішками", - "item.gtceu.impure_rock_salt_dust": "Купка кам'яної солі з домішками", - "item.gtceu.impure_salt_dust": "Купка солі з домішками", - "item.gtceu.impure_talc_dust": "Купка тальку з домішками", + "item.gtceu.impure_bentonite_dust": "Забруднений пил бентоніту", + "item.gtceu.impure_cassiterite_sand_dust": "Забруднений пил каситеритового піску", + "item.gtceu.impure_pitchblende_dust": "Забруднений пил настурану", + "item.gtceu.impure_rock_salt_dust": "Забруднений пил кам'яної солі", + "item.gtceu.impure_salt_dust": "Забруднена сіль", + "item.gtceu.impure_talc_dust": "Забруднений пил тальку", "item.gtceu.inductor": "Індуктор", - "item.gtceu.inductor.tooltip": "§7Маленька котушка", + "item.gtceu.inductor.tooltip": "§7Мала котушка", "item.gtceu.inert_metal_mixture_dust": "Інертна металева суміш", - "item.gtceu.infinite_water_cover": "Модифікатор нескінченної води", - "item.gtceu.infinite_water_cover.tooltip": "§7Наповнює прикріплені умістища §9водою§7 як §fмодифікатор§7.", - "item.gtceu.ingot_casting_mold": "Ливарна форма злитка", + "item.gtceu.infinite_water_cover": "Кришка джерела води", + "item.gtceu.infinite_water_cover.tooltip": "§7Заповнює приєднані контейнери§9 водою§7 як§f кришка§7.", + "item.gtceu.ingot_casting_mold": "Відливна форма (злиток)", "item.gtceu.ingot_casting_mold.tooltip": "§7Форма для виготовлення злитків", - "item.gtceu.ingot_extruder_mold": "Форма екструдора злитка", - "item.gtceu.ingot_extruder_mold.tooltip": "§7Форма екструдора, зачекайте, чи не можемо ми просто використати піч?", + "item.gtceu.ingot_extruder_mold": "Відтискна форма (злиток)", + "item.gtceu.ingot_extruder_mold.tooltip": "§7Формовий відтиск для... зачекайте, чи не можна просто використати піч?", "item.gtceu.invar_lighter": "Інварова запальничка", - "item.gtceu.iridium_metal_residue_dust": "Іридієвий металевий осад", + "item.gtceu.iridium_metal_residue_dust": "Металевий залишок іридію", "item.gtceu.iron_minecart_wheels": "Залізні колеса вагонетки", - "item.gtceu.item_detector_cover": "Датчик предметів", - "item.gtceu.item_detector_cover.tooltip": "§7Видає §fкількість предметів§7 сигналом редстоуну як §fмодифікатор§7.", + "item.gtceu.item_detector_cover": "Детектор предметів", + "item.gtceu.item_detector_cover.tooltip": "§7Видає§f кількість предметів§7 як редстоун та§f кришка§7.", "item.gtceu.item_filter": "Фільтр предметів", - "item.gtceu.item_filter.tooltip.0": "§7Фільтрує §fпредмети§7 входу/виходу як §fмодифікатор§7.", - "item.gtceu.item_filter.tooltip.1": "Можна використовувати як оновлення §fмодулю конвеєра§7 і §fробо-руки§7.", + "item.gtceu.item_filter.tooltip.0": "§7Фільтрує§f предметний§7 вхід/вихід як§f кришка§7.", + "item.gtceu.item_filter.tooltip.1": "Може використовуватися як§f конвеєрний модуль§7 та покращення§f маніпулятора§7.", "item.gtceu.item_smart_filter": "Розумний фільтр предметів", - "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.", - "item.gtceu.item_tag_filter": "Фільтр теґів предметів", - "item.gtceu.item_tag_filter.tooltip.0": "§7Фільтри входу/виходу §fпредмети§7 за допомогою §fтеґів предмета§7 як §fмодифікатор§7.", - "item.gtceu.item_tag_filter.tooltip.1": "Можна використовувати як оновлення §fмодулю конвеєра§7 і §fробо-руки§7.", - "item.gtceu.item_voiding_cover": "Модифікатор знищення предметів", - "item.gtceu.item_voiding_cover.tooltip.0": "§7ЗНищцє §fпредмети§7 як §fмодифікатор§7.", - "item.gtceu.item_voiding_cover.tooltip.1": "Активується за допомогою §fм'якого молотка§7 після розміщення.", - "item.gtceu.iv_battery_hull": "Середній ванадієвий копус батареї", - "item.gtceu.iv_battery_hull.tooltip": "§7Порожні корпус батареї §1БН", - "item.gtceu.iv_conveyor_module": "Модуль конвеєра БН", - "item.gtceu.iv_electric_motor": "Електродвигун БН", - "item.gtceu.iv_electric_piston": "Електропоршень БН", - "item.gtceu.iv_electric_pump": "Електропомпа БН", - "item.gtceu.iv_emitter": "Випромінювач БН", - "item.gtceu.iv_field_generator": "Генератор полів БН", - "item.gtceu.iv_fluid_regulator": "Регулятор рідини БН", - "item.gtceu.iv_power_unit": "Блок живлення БН", - "item.gtceu.iv_robot_arm": "Робо-рука БН", - "item.gtceu.iv_sensor": "Сенсор БН", - "item.gtceu.iv_solar_panel": "Сонячна панель божевільної напруги", + "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.", + "item.gtceu.item_tag_filter": "Предметний теговий фільтр", + "item.gtceu.item_tag_filter.tooltip.0": "§7Фільтрує§f предметний§7 вхід/вихід із§f предметними тегами§7 як§f кришка§7.", + "item.gtceu.item_tag_filter.tooltip.1": "Може використовуватися як§f конвеєрний модуль§7 та покращення§f маніпулятора§7.", + "item.gtceu.item_voiding_cover": "Кришка видалення предметів", + "item.gtceu.item_voiding_cover.tooltip.0": "§7Видаляє§f предмети§7 як§f кришка§7.", + "item.gtceu.item_voiding_cover.tooltip.1": "Активуйте§f киянкою§7 після розміщення.", + "item.gtceu.iv_battery_hull": "Середній корпус ванадієвої батареї", + "item.gtceu.iv_battery_hull.tooltip": "§7Порожній корпус§1 IV§7 батареї", + "item.gtceu.iv_conveyor_module": "IV конвеєрний модуль", + "item.gtceu.iv_electric_motor": "IV електричний мотор", + "item.gtceu.iv_electric_piston": "IV електричний поршень", + "item.gtceu.iv_electric_pump": "IV електрична помпа", + "item.gtceu.iv_emitter": "IV випромінювач", + "item.gtceu.iv_field_generator": "IV генератор поля", + "item.gtceu.iv_fluid_regulator": "IV регулятор рідини", + "item.gtceu.iv_power_unit": "IV блок живлення", + "item.gtceu.iv_robot_arm": "IV маніпулятор", + "item.gtceu.iv_sensor": "IV сенсор", + "item.gtceu.iv_solar_panel": "Сонячна панель неможливої напруги", "item.gtceu.iv_vanadium_battery": "Середня ванадієва батарея", "item.gtceu.iv_vanadium_battery.tooltip": "§7Багаторазова батарея", - "item.gtceu.iv_voltage_coil": "Мала котушка божевільної напруги", + "item.gtceu.iv_voltage_coil": "Котушка божевільної напруги", "item.gtceu.iv_voltage_coil.tooltip": "Елітна котушка", - "item.gtceu.lapotron_crystal": "Лопотронний кристал", + "item.gtceu.lapotron_crystal": "Лапотронний кристал", "item.gtceu.lapotron_crystal.tooltip": "§7Багаторазова батарея", - "item.gtceu.lapotronic_energy_orb": "Лапотронна сфера енергії", - "item.gtceu.lapotronic_energy_orb.tooltip": "§7Багаторазова батаре", - "item.gtceu.lapotronic_energy_orb_cluster": "Лапотронний кластер сфер енергії", + "item.gtceu.lapotronic_energy_orb": "Лапотронна енергетична сфера", + "item.gtceu.lapotronic_energy_orb.tooltip": "§7Багаторазова батарея", + "item.gtceu.lapotronic_energy_orb_cluster": "Кластер лапотронної енергетичної сфери", "item.gtceu.lapotronic_energy_orb_cluster.tooltip": "§7Багаторазова батарея", - "item.gtceu.large_pipe_casting_mold": "Ливарна форма великої труби", - "item.gtceu.large_pipe_extruder_mold": "Форма екструдора великої труби", - "item.gtceu.light_blue_dye_spray_can": "Балончик блакитної фарби", - "item.gtceu.light_blue_glass_lens": "Блакитна скляна лінза", - "item.gtceu.light_gray_dye_spray_can": "Балончик світло-сірої фарби", - "item.gtceu.light_gray_glass_lens": "Світло-сіра скляна лінза", - "item.gtceu.lime_dye_spray_can": "Балончик лаймової фарби", - "item.gtceu.lime_glass_lens": "Лаймова скляна лінза", - "item.gtceu.liquid_fuel_jetpack": "Рідинно-паливний ранець", - "item.gtceu.long_treated_wood_rod": "Довга оброблена палиця", + "item.gtceu.large_pipe_casting_mold": "Відливна форма (велика труба)", + "item.gtceu.large_pipe_extruder_mold": "Відтискна форма (велика труба)", + "item.gtceu.light_blue_dye_spray_can": "Аерозольний балончик (блакитний)", + "item.gtceu.light_blue_glass_lens": "Скляна лінза (Блакитна)", + "item.gtceu.light_gray_dye_spray_can": "Аерозольний балончик (світло-сірий)", + "item.gtceu.light_gray_glass_lens": "Скляна лінза (Світло-сіра)", + "item.gtceu.lime_dye_spray_can": "Аерозольний балончик (лаймовий)", + "item.gtceu.lime_glass_lens": "Скляна лінза (Лаймова)", + "item.gtceu.liquid_fuel_jetpack": "Рідкопаливний реактивний ранець", + "item.gtceu.long_treated_wood_rod": "Довга оброблена дерев'яна палиця", "item.gtceu.long_wood_rod": "Довга палиця", - "item.gtceu.lpic_chip": "Чип НнІС", - "item.gtceu.lpic_chip.tooltip": "§7Низьконапружна інтегральна схема", - "item.gtceu.lpic_wafer": "Напівпровідникова пластина НнІС", - "item.gtceu.lpic_wafer.tooltip": "§7Сира низьконапружна схема", + "item.gtceu.lpic_chip": "Чіп LPIC", + "item.gtceu.lpic_chip.tooltip": "§7IC низької напруги", + "item.gtceu.lpic_wafer": "Підкладка LPIC", + "item.gtceu.lpic_wafer.tooltip": "§7Заготовка низькопотужної схеми", "item.gtceu.luv_battery_hull": "Великий корпус ванадієвої батареї", - "item.gtceu.luv_battery_hull.tooltip": "§7Порожній корпус батареї §dАН", - "item.gtceu.luv_conveyor_module": "Модуль конвеєра АН", - "item.gtceu.luv_electric_motor": "Електродвигун АН", - "item.gtceu.luv_electric_piston": "Електропоршень АН", - "item.gtceu.luv_electric_pump": "Електропоршень АН", - "item.gtceu.luv_emitter": "Випромінювач АН", - "item.gtceu.luv_field_generator": "Генератор полів АН", - "item.gtceu.luv_fluid_regulator": "Регулятор рідини АН", - "item.gtceu.luv_robot_arm": "Робо-рука АН", - "item.gtceu.luv_sensor": "Сенсор АН", + "item.gtceu.luv_battery_hull.tooltip": "§7Порожній корпус§d LuV§7 батареї", + "item.gtceu.luv_conveyor_module": "LuV конвеєрний модуль", + "item.gtceu.luv_electric_motor": "LuV електричний мотор", + "item.gtceu.luv_electric_piston": "LuV електричний поршень", + "item.gtceu.luv_electric_pump": "LuV електрична помпа", + "item.gtceu.luv_emitter": "LuV випромінювач", + "item.gtceu.luv_field_generator": "LuV генератор поля", + "item.gtceu.luv_fluid_regulator": "LuV регулятор рідини", + "item.gtceu.luv_robot_arm": "LuV маніпулятор", + "item.gtceu.luv_sensor": "LuV сенсор", "item.gtceu.luv_solar_panel": "Сонячна панель абсурдної напруги", "item.gtceu.luv_vanadium_battery": "Велика ванадієва батарея", "item.gtceu.luv_vanadium_battery.tooltip": "§7Багаторазова батарея", - "item.gtceu.luv_voltage_coil": "Мала котушка абсурдної напруги", - "item.gtceu.luv_voltage_coil.tooltip": "Майстерна котушка", + "item.gtceu.luv_voltage_coil": "Котушка абсурдної напруги", + "item.gtceu.luv_voltage_coil.tooltip": "Майстерська котушка", "item.gtceu.lv_battery_hull": "Малий корпус батареї", - "item.gtceu.lv_battery_hull.tooltip": "§7Порожній корпус батареї НН", + "item.gtceu.lv_battery_hull.tooltip": "§7Порожній корпус LV батареї", "item.gtceu.lv_cadmium_battery": "Мала кадмієва батарея", "item.gtceu.lv_cadmium_battery.tooltip": "§7Багаторазова батарея", - "item.gtceu.lv_conveyor_module": "Модуль конвеєра НН", - "item.gtceu.lv_electric_motor": "Елетродвигун НН", - "item.gtceu.lv_electric_piston": "Електропоршень НН", - "item.gtceu.lv_electric_pump": "Електропомпа НН", - "item.gtceu.lv_emitter": "Випромінювач НН", - "item.gtceu.lv_field_generator": "Генератор полів НН", - "item.gtceu.lv_fluid_regulator": "Регулятор рідини НН", - "item.gtceu.lv_item_magnet": "Магніт НН", + "item.gtceu.lv_conveyor_module": "LV конвеєрний модуль", + "item.gtceu.lv_electric_motor": "LV електричний мотор", + "item.gtceu.lv_electric_piston": "LV електричний поршень", + "item.gtceu.lv_electric_pump": "LV електрична помпа", + "item.gtceu.lv_emitter": "LV випромінювач", + "item.gtceu.lv_field_generator": "LV генератор поля", + "item.gtceu.lv_fluid_regulator": "LV регулятор рідини", + "item.gtceu.lv_item_magnet": "LV предметний магніт", "item.gtceu.lv_lithium_battery": "Мала літієва батарея", "item.gtceu.lv_lithium_battery.tooltip": "§7Багаторазова батарея", - "item.gtceu.lv_power_unit": "Блок живлення", - "item.gtceu.lv_robot_arm": "Робо-рука НН", - "item.gtceu.lv_sensor": "Сенсор НН", + "item.gtceu.lv_power_unit": "LV блок живлення", + "item.gtceu.lv_robot_arm": "LV маніпулятор", + "item.gtceu.lv_sensor": "LV сенсор", "item.gtceu.lv_sodium_battery": "Мала натрієва батарея", "item.gtceu.lv_sodium_battery.tooltip": "§7Багаторазова батарея", - "item.gtceu.lv_solar_panel": "Сонячна батарея низької напруги", - "item.gtceu.lv_voltage_coil": "Мала котушка низької напруги", - "item.gtceu.lv_voltage_coil.tooltip": "Звичайна та мала котушка", - "item.gtceu.machine_controller.tooltip": "§7Вмикає машини §fУВІМК./ВИМК.§7 як §fмодифікатор§7.", + "item.gtceu.lv_solar_panel": "Сонячна панель низької напруги", + "item.gtceu.lv_voltage_coil": "Котушка низької напруги", + "item.gtceu.lv_voltage_coil.tooltip": "Базова котушка", + "item.gtceu.machine_controller.tooltip": "§7Перемикає стан§f машини§7 як§f кришка§7.", "item.gtceu.machine_controller_cover": "Контролер машини", "item.gtceu.machine_memory_card": "Карта пам'яті машини", - "item.gtceu.magenta_dye_spray_can": "Балончик пурпурової фарби", - "item.gtceu.magenta_glass_lens": "Пурпурова скляна лінза", - "item.gtceu.maintenance_detector_cover": "Датчик техобслуговування", - "item.gtceu.mask_filter": "Фільтр протигаза", - "item.gtceu.matchbox": "Сірникова коробка", - "item.gtceu.matches": "Сірники", - "item.gtceu.max_battery": "Ідеальна батарея", - "item.gtceu.max_battery.tooltip": "§7Заповніть це, щоб перемогти гру", - "item.gtceu.max_voltage_coil.tooltip": "Мала максимальна котушка", - "item.gtceu.meat_dust": "М'ясний фарш", - "item.gtceu.micro_processor": "Мікропроцесор", - "item.gtceu.micro_processor.tooltip.0": "§7Дивовижна швидкість обчислень!", - "item.gtceu.micro_processor.tooltip.1": "§eСхема СН", - "item.gtceu.micro_processor_assembly": "Збірка мікропроцесора", - "item.gtceu.micro_processor_assembly.tooltip.0": "§7Дивовижна швидкість обчислень!", - "item.gtceu.micro_processor_assembly.tooltip.1": "§eСхема ВН", - "item.gtceu.micro_processor_computer": "Мікропроцесор надкомп'ютера", - "item.gtceu.micro_processor_computer.tooltip.0": "§7Дивовижна швидкість обчислень!", - "item.gtceu.micro_processor_computer.tooltip.1": "§eСхема ЕН", - "item.gtceu.micro_processor_mainframe": "Мікропроцесор мейнфрейма", - "item.gtceu.micro_processor_mainframe.tooltip.0": "§7Дивовижна швидкість обчислень!", - "item.gtceu.micro_processor_mainframe.tooltip.1": "§eСхема БН", - "item.gtceu.microchip_processor": "Мікрочип процесора", - "item.gtceu.microchip_processor.tooltip.0": "§7Покращена звичайна схема", - "item.gtceu.microchip_processor.tooltip.1": "§eСхема НН", - "item.gtceu.mpic_chip": "Чип НнІС", - "item.gtceu.mpic_chip.tooltip": "§7Середньонапружна інтегральна схема", - "item.gtceu.mpic_wafer": "Напівпровідникова пластина СнІС", - "item.gtceu.mpic_wafer.tooltip": "§7Сира середньонапружна схема", - "item.gtceu.multilayer_fiber_reinforced_circuit_board": "Посилена волокном багатошарова плата", + "item.gtceu.magenta_dye_spray_can": "Аерозольний балончик (пурпурний)", + "item.gtceu.magenta_glass_lens": "Скляна лінза (Пурпурова)", + "item.gtceu.maintenance_detector_cover": "Детектор технічного обслуговування", + "item.gtceu.mask_filter": "Фільтр газової маски", + "item.gtceu.matchbox": "Упаковка сірників", + "item.gtceu.matches": "Сірник", + "item.gtceu.max_battery": "Ультимативна батарея", + "item.gtceu.max_battery.tooltip": "§7Зарядіть це щоб перемогти Minecraft", + "item.gtceu.max_voltage_coil.tooltip": "Максимальна котушка", + "item.gtceu.meat_dust": "Фарш", + "item.gtceu.micro_processor": "Мікропроцессор", + "item.gtceu.micro_processor.tooltip.0": "§7Вражаюча швидкість обчислень!", + "item.gtceu.micro_processor.tooltip.1": "§eСхема MV рівня", + "item.gtceu.micro_processor_assembly": "Мікропроцесорний вузол", + "item.gtceu.micro_processor_assembly.tooltip.0": "§7Вражаюча швидкість обчислень!", + "item.gtceu.micro_processor_assembly.tooltip.1": "§eСхема HV рівня", + "item.gtceu.micro_processor_computer": "Мікропроцесорний суперкомп'ютер", + "item.gtceu.micro_processor_computer.tooltip.0": "§7Вражаюча швидкість обчислень!", + "item.gtceu.micro_processor_computer.tooltip.1": "§eСхема EV рівня", + "item.gtceu.micro_processor_mainframe": "Мікропроцесорний мейнфрейм", + "item.gtceu.micro_processor_mainframe.tooltip.0": "§7Вражаюча швидкість обчислень!", + "item.gtceu.micro_processor_mainframe.tooltip.1": "§eСхема IV рівня", + "item.gtceu.microchip_processor": "Мікрочіповий процесор", + "item.gtceu.microchip_processor.tooltip.0": "§7Відмінна базова схема", + "item.gtceu.microchip_processor.tooltip.1": "§eСхема LV рівня", + "item.gtceu.mpic_chip": "Чіп MPIC", + "item.gtceu.mpic_chip.tooltip": "§7IC напруги", + "item.gtceu.mpic_wafer": "Підкладка MPIC", + "item.gtceu.mpic_wafer.tooltip": "§7Заготовка потужної схеми", + "item.gtceu.multilayer_fiber_reinforced_circuit_board": "Багатошарова армована волокном плата", "item.gtceu.multilayer_fiber_reinforced_circuit_board.tooltip": "§7Елітна плата", - "item.gtceu.multilayer_fiber_reinforced_printed_circuit_board": "Посилена волокном багатошарова друкована плата", + "item.gtceu.multilayer_fiber_reinforced_printed_circuit_board": "Багатошарова армована волокном друкована плата", "item.gtceu.multilayer_fiber_reinforced_printed_circuit_board.tooltip": "§7Елітна плата", "item.gtceu.mv_battery_hull": "Середній корпус батареї", - "item.gtceu.mv_battery_hull.tooltip": "§7Порожній корпус батареї §bСН§7", + "item.gtceu.mv_battery_hull.tooltip": "§7Порожній корпус§b MV§7 батареї", "item.gtceu.mv_cadmium_battery": "Середня кадмієва батарея", "item.gtceu.mv_cadmium_battery.tooltip": "§7Багаторазова батарея", - "item.gtceu.mv_conveyor_module": "Модуль конвеєра СН", - "item.gtceu.mv_electric_motor": "Електродвигун СН", - "item.gtceu.mv_electric_piston": "Електропоршень СН", - "item.gtceu.mv_electric_pump": "Електропомпа СН", - "item.gtceu.mv_emitter": "Випромінювач СН", - "item.gtceu.mv_field_generator": "Генератор полів СН", - "item.gtceu.mv_fluid_regulator": "Регулятор рідини СН", + "item.gtceu.mv_conveyor_module": "MV конвеєрний модуль", + "item.gtceu.mv_electric_motor": "MV електричний мотор", + "item.gtceu.mv_electric_piston": "MV електричний поршень", + "item.gtceu.mv_electric_pump": "MV електрична помпа", + "item.gtceu.mv_emitter": "MV випромінювач", + "item.gtceu.mv_field_generator": "MV генератор поля", + "item.gtceu.mv_fluid_regulator": "MV регулятор рідини", "item.gtceu.mv_lithium_battery": "Середня літієва батарея", "item.gtceu.mv_lithium_battery.tooltip": "§7Багаторазова батарея", - "item.gtceu.mv_power_unit": "Блок живлення СН", - "item.gtceu.mv_robot_arm": "Робо-рука СН", - "item.gtceu.mv_sensor": "Сенсор СН", + "item.gtceu.mv_power_unit": "MV блок живлення", + "item.gtceu.mv_robot_arm": "MV маніпулятор", + "item.gtceu.mv_sensor": "MV сенсор", "item.gtceu.mv_sodium_battery": "Середня натрієва батарея", "item.gtceu.mv_sodium_battery.tooltip": "§7Багаторазова батарея", "item.gtceu.mv_solar_panel": "Сонячна панель середньої напруги", - "item.gtceu.mv_voltage_coil": "Мала котушка середньої напруги", + "item.gtceu.mv_voltage_coil": "Котушка середньої напруги", "item.gtceu.mv_voltage_coil.tooltip": "Хороша котушка", - "item.gtceu.name_casting_mold": "Ливарна форма назви", - "item.gtceu.name_casting_mold.tooltip": "§7Форма для назви предметів у формувальному пресі (перейменуйте форму на ковадлі)", - "item.gtceu.nan_certificate": "Сертифікат того, що більше не є нубом", + "item.gtceu.name_casting_mold": "Відливна форма (Ім'я)", + "item.gtceu.name_casting_mold.tooltip": "§7Форма для іменування предметів у формовому пресі (перейменуйте форму у ковадлі)", + "item.gtceu.nan_certificate": "Сертифікат шо ти вже не нубік", "item.gtceu.nan_certificate.tooltip": "Виклик прийнято!", - "item.gtceu.nand_chip": "Чип NAND", - "item.gtceu.nand_chip.tooltip.0": "§7Чудова проста схема", - "item.gtceu.nand_chip.tooltip.1": "§6Схема НнН", - "item.gtceu.nand_memory_chip": "Чип пам'яті NAND", + "item.gtceu.nand_chip": "Чіп NAND", + "item.gtceu.nand_chip.tooltip.0": "§7Надзвичайно простий електронний компонент", + "item.gtceu.nand_chip.tooltip.1": "§6Електросхема ULV-рівня", + "item.gtceu.nand_memory_chip": "Чіп пам'яті NAND", "item.gtceu.nand_memory_chip.tooltip": "§7Логічний вентиль NAND", - "item.gtceu.nand_memory_wafer": "Напівпровідникова пластина пам'яті NAND", - "item.gtceu.nand_memory_wafer.tooltip": "§7Сирий логічний вентиль", - "item.gtceu.nano_cpu_chip": "Наночип ЦП", - "item.gtceu.nano_cpu_chip.tooltip": "§7Нано центральний процесор", - "item.gtceu.nano_cpu_wafer": "Нано напівпровідникова пластина ЦП", - "item.gtceu.nano_cpu_wafer.tooltip": "§7Сира наносхема", + "item.gtceu.nand_memory_wafer": "Підкладка пам'яті NAND", + "item.gtceu.nand_memory_wafer.tooltip": "§7Заготовка логічного вентиля", + "item.gtceu.nano_cpu_chip": "Чіп нано CPU", + "item.gtceu.nano_cpu_chip.tooltip": "§7Нано центральний процесорний блок", + "item.gtceu.nano_cpu_wafer": "Підкладка нано CPU", + "item.gtceu.nano_cpu_wafer.tooltip": "§7Заготовка нанотехнічної схеми", "item.gtceu.nano_processor": "Нанопроцесор", "item.gtceu.nano_processor.tooltip.0": "§7Менше, ніж будь-коли", - "item.gtceu.nano_processor.tooltip.1": "§bСхема ВН", - "item.gtceu.nano_processor_assembly": "Збірка нанопроцесора", + "item.gtceu.nano_processor.tooltip.1": "§bСхема HV рівня", + "item.gtceu.nano_processor_assembly": "Нанопроцесорний вузол", "item.gtceu.nano_processor_assembly.tooltip.0": "§7Менше, ніж будь-коли", - "item.gtceu.nano_processor_assembly.tooltip.1": "§bСхема ЕН", - "item.gtceu.nano_processor_computer": "Нанопроцесор надкомп'ютера", + "item.gtceu.nano_processor_assembly.tooltip.1": "§bСхема EV рівня", + "item.gtceu.nano_processor_computer": "Нанопроцесорний суперкомп'ютер", "item.gtceu.nano_processor_computer.tooltip.0": "§7Менше, ніж будь-коли", - "item.gtceu.nano_processor_computer.tooltip.1": "§bСхема БН", - "item.gtceu.nano_processor_mainframe": "Нанопроцесор мейнфрейма", + "item.gtceu.nano_processor_computer.tooltip.1": "§bСхема IV рівня", + "item.gtceu.nano_processor_mainframe": "Нанопроцесорний мейнфрейм", "item.gtceu.nano_processor_mainframe.tooltip.0": "§7Менше, ніж будь-коли", - "item.gtceu.nano_processor_mainframe.tooltip.1": "§bСхема АН", - "item.gtceu.nano_saber": "Наношабля", - "item.gtceu.nano_saber.tooltip": "§7Нанопірат", - "item.gtceu.nanomuscle_boots": "Наночоботи", - "item.gtceu.nanomuscle_chestplate": "Нанонагрудник", - "item.gtceu.nanomuscle_helmet": "Наношолом", - "item.gtceu.nanomuscle_leggings": "Нанонаголінники", - "item.gtceu.naquadah_boule": "Легований наквадом монокристалічний кремнієвий", - "item.gtceu.naquadah_boule.tooltip": "§7Сира схема", - "item.gtceu.naquadah_wafer": "Легована наквадом напівпровідникова пластина", - "item.gtceu.naquadah_wafer.tooltip": "§7Сира схема", - "item.gtceu.neuro_processing_unit": "Нейропроцесор", - "item.gtceu.neuro_processing_unit.tooltip": "§7Нейро ЦП", + "item.gtceu.nano_processor_mainframe.tooltip.1": "§bСхема LuV рівня", + "item.gtceu.nano_saber": "Нано-шабля", + "item.gtceu.nano_saber.tooltip": "§7Скуштуй меча бога-дракона!", + "item.gtceu.nanomuscle_boots": "Чоботи костюма NanoMuscle™", + "item.gtceu.nanomuscle_chestplate": "Нагрудник костюма NanoMuscle™", + "item.gtceu.nanomuscle_helmet": "Шолом костюма NanoMuscle™", + "item.gtceu.nanomuscle_leggings": "Наголінники костюма NanoMuscle™", + "item.gtceu.naquadah_boule": "Легована наквадою монокристалічна силіконова маса", + "item.gtceu.naquadah_boule.tooltip": "§7Заготовка схеми", + "item.gtceu.naquadah_wafer": "Легована наквадою підкладка", + "item.gtceu.naquadah_wafer.tooltip": "§7Заготовка схеми", + "item.gtceu.neuro_processing_unit": "Нейропроцесорний блок", + "item.gtceu.neuro_processing_unit.tooltip": "§7Нейро CPU", "item.gtceu.neutron_reflector": "Іридієвий відбивач нейтронів", "item.gtceu.neutron_reflector.tooltip": "§7Незнищенний", - "item.gtceu.neutronium_boule": "Легований нейтронієм монокристалічний кремнієвий", - "item.gtceu.neutronium_boule.tooltip": "§7Сира схема", - "item.gtceu.neutronium_wafer": "Легована нейтронієм напівпровідникова пластина", - "item.gtceu.neutronium_wafer.tooltip": "§7Сира схема", + "item.gtceu.neutronium_boule": "Легована нейтронієм монокристалічна силіконова маса", + "item.gtceu.neutronium_boule.tooltip": "§7Заготовка схеми", + "item.gtceu.neutronium_wafer": "Легована нейтронієм підкладка", + "item.gtceu.neutronium_wafer.tooltip": "§7Заготовка схеми", "item.gtceu.nightvision_goggles": "Окуляри нічного бачення", - "item.gtceu.nor_memory_chip": "Чип пам'яті NOR", + "item.gtceu.nor_memory_chip": "Чіп пам'яті NOR", "item.gtceu.nor_memory_chip.tooltip": "§7Логічний вентиль NOR", - "item.gtceu.nor_memory_wafer": "Напівпровідникова пластина пам'яті NOR", - "item.gtceu.nor_memory_wafer.tooltip": "§7Сирий логічний вентиль", - "item.gtceu.normal_pipe_casting_mold": "Ливарна форма труби", - "item.gtceu.normal_pipe_extruder_mold": "Форма екструдора труби", - "item.gtceu.nugget_casting_mold": "Ливарна форма самородка", + "item.gtceu.nor_memory_wafer": "Підкладка пам'яті NOR", + "item.gtceu.nor_memory_wafer.tooltip": "§7Заготовка логічного вентиля", + "item.gtceu.normal_pipe_casting_mold": "Відливна форма (труба)", + "item.gtceu.normal_pipe_extruder_mold": "Відтискна форма (труба)", + "item.gtceu.nugget_casting_mold": "Відливна форма (самородок)", "item.gtceu.nugget_casting_mold.tooltip": "§7Форма для виготовлення самородків", - "item.gtceu.opv_conveyor_module": "Модуль конвеєра НпН", - "item.gtceu.opv_electric_motor": "Електродвигун НпН", - "item.gtceu.opv_electric_piston": "Елетропоршень НпН", - "item.gtceu.opv_electric_pump": "Електропоршень НпН", - "item.gtceu.opv_emitter": "Випромінювач НпН", - "item.gtceu.opv_field_generator": "Генератор полів НпН", - "item.gtceu.opv_fluid_regulator": "Регулятор рідини НпН", - "item.gtceu.opv_robot_arm": "Робо-рука НпН", - "item.gtceu.opv_sensor": "Сенсор НпН", - "item.gtceu.opv_voltage_coil.tooltip": "Легендарна мала котушка", - "item.gtceu.orange_dye_spray_can": "Балончик помаранчевої фарби", - "item.gtceu.orange_glass_lens": "Помаранчева скляна лінза", - "item.gtceu.palladium_raw_dust": "Необроблений платиновий пил", - "item.gtceu.paper_dust": "Паперовий пил", - "item.gtceu.paracetamol_pill": "Таблетка парацетамолу", - "item.gtceu.petri_dish": "Чашка Петрі", + "item.gtceu.opv_conveyor_module": "OpV конвеєрний модуль", + "item.gtceu.opv_electric_motor": "OpV електричний мотор", + "item.gtceu.opv_electric_piston": "OpV електричний поршень", + "item.gtceu.opv_electric_pump": "OpV електрична помпа", + "item.gtceu.opv_emitter": "OpV випромінювач", + "item.gtceu.opv_field_generator": "OpV генератор поля", + "item.gtceu.opv_fluid_regulator": "OpV регулятор рідини", + "item.gtceu.opv_robot_arm": "OpV маніпулятор", + "item.gtceu.opv_sensor": "OpV сенсор", + "item.gtceu.opv_voltage_coil.tooltip": "Легендарна котушка", + "item.gtceu.orange_dye_spray_can": "Аерозольний балончик (помаранчевий)", + "item.gtceu.orange_glass_lens": "Скляна лінза (Помаранчева)", + "item.gtceu.palladium_raw_dust": "Необроблений паладієвий пил", + "item.gtceu.paper_dust": "Паперова стружка", + "item.gtceu.paracetamol_pill": "Пігулка парацетамолу", + "item.gtceu.petri_dish": "Чашка петри", "item.gtceu.petri_dish.tooltip": "§7Для вирощування клітин", "item.gtceu.phenolic_circuit_board": "Фенольна плата", "item.gtceu.phenolic_circuit_board.tooltip": "§7Хороша плата", "item.gtceu.phenolic_printed_circuit_board": "Фенольна друкована плата", "item.gtceu.phenolic_printed_circuit_board.tooltip": "§7Хороша плата", - "item.gtceu.phosphorus_boule": "Легований фосфором монокристалічний кремнієвий", - "item.gtceu.phosphorus_boule.tooltip": "§7Сира схема", - "item.gtceu.phosphorus_wafer": "Легована фосфором напівпровідникова пластина", - "item.gtceu.phosphorus_wafer.tooltip": "§7Сира схема", - "item.gtceu.pickaxe_extruder_mold.tooltip": "§7Форма екструдора для виготовлення кайл", - "item.gtceu.pill_casting_mold": "Ливарна форма таблетки", - "item.gtceu.pink_dye_spray_can": "Балончик рожевої фарби", - "item.gtceu.pink_glass_lens": "Рожева скляна лінза", - "item.gtceu.pipe.huge_casting_mold.tooltip": "§7Форма для виготовлення величезної труби", - "item.gtceu.pipe.huge_extruder_mold.tooltip": "§7Форма екструдора для виготовлення величезної труби", - "item.gtceu.pipe.large_casting_mold.tooltip": "§7Форма для виготовлення великої труби", - "item.gtceu.pipe.large_extruder_mold.tooltip": "§7Форма екструдора для виготовлення великої труби", - "item.gtceu.pipe.normal_casting_mold.tooltip": "§7Форма для виготовлення труби", - "item.gtceu.pipe.normal_extruder_mold.tooltip": "§7Форма екструдора для виготовлення труби", - "item.gtceu.pipe.small_casting_mold.tooltip": "§7Форма для виготовлення малої труби", - "item.gtceu.pipe.small_extruder_mold.tooltip": "§7Форма екструдора для виготовлення малої труби", - "item.gtceu.pipe.tiny_casting_mold.tooltip": "§7Форма для виготовлення крихітної труби", - "item.gtceu.pipe.tiny_extruder_mold.tooltip": "§7Форма екструдора для виготовлення крихітної труби", - "item.gtceu.pitchblende_dust": "Уранінітовий пил", - "item.gtceu.plant_ball": "Рослинна куля", + "item.gtceu.phosphorus_boule": "Легована фосфором монокристалічна силіконова маса", + "item.gtceu.phosphorus_boule.tooltip": "§7Заготовка схеми", + "item.gtceu.phosphorus_wafer": "Легована фосфором підкладка", + "item.gtceu.phosphorus_wafer.tooltip": "§7Заготовка схеми", + "item.gtceu.pickaxe_extruder_mold.tooltip": "§7Формовий відтиск для виготовлення кайл", + "item.gtceu.pill_casting_mold": "Відливна форма (пігулка)", + "item.gtceu.pink_dye_spray_can": "Аерозольний балончик (рожевий)", + "item.gtceu.pink_glass_lens": "Скляна лінза (Рожева)", + "item.gtceu.pipe.huge_casting_mold.tooltip": "§7Форма для відливання повноблочних труб", + "item.gtceu.pipe.huge_extruder_mold.tooltip": "§7Формовий відтиск для виготовлення повноблочних труб", + "item.gtceu.pipe.large_casting_mold.tooltip": "§7Форма для відливання великих труб", + "item.gtceu.pipe.large_extruder_mold.tooltip": "§7Формовий відтиск для виготовлення великих труб", + "item.gtceu.pipe.normal_casting_mold.tooltip": "§7Форма для відливання труб", + "item.gtceu.pipe.normal_extruder_mold.tooltip": "§7Формовий відтиск для виготовлення труб", + "item.gtceu.pipe.small_casting_mold.tooltip": "§7Форма для відливання малих трубPipes", + "item.gtceu.pipe.small_extruder_mold.tooltip": "§7Формовий відтиск для виготовлення малих труб", + "item.gtceu.pipe.tiny_casting_mold.tooltip": "§7Форма для відливання крихітних труб", + "item.gtceu.pipe.tiny_extruder_mold.tooltip": "§7Формовий відтиск для виготовлення крихітних труб", + "item.gtceu.pitchblende_dust": "Настуран", + "item.gtceu.plant_ball": "Рослинна кулька", "item.gtceu.plastic_circuit_board": "Пластикова плата", "item.gtceu.plastic_circuit_board.tooltip": "§7Хороша плата", "item.gtceu.plastic_printed_circuit_board": "Пластикова друкована плата", "item.gtceu.plastic_printed_circuit_board.tooltip": "§7Хороша плата", - "item.gtceu.plate_casting_mold": "Ливарна форма пластини", - "item.gtceu.plate_casting_mold.tooltip": "§7Форма для виготовлення пластин", - "item.gtceu.plate_extruder_mold": "Форма екструдора пластини", - "item.gtceu.plate_extruder_mold.tooltip": "§7Форма екструдора для виготовлення пластин", - "item.gtceu.platinum_group_sludge_dust": "Шламові групи платини", + "item.gtceu.plate_casting_mold": "Відливна форма (лист)", + "item.gtceu.plate_casting_mold.tooltip": "§7Форма для виготовлення листів", + "item.gtceu.plate_extruder_mold": "Відтискна форма (лист)", + "item.gtceu.plate_extruder_mold.tooltip": "§7Формовий відтиск для виготовлення листів", + "item.gtceu.platinum_group_sludge_dust": "Шлам платинової групи", "item.gtceu.platinum_lighter": "Платинова запальничка", - "item.gtceu.platinum_raw_dust": "Сирий пил платини", - "item.gtceu.platinum_sludge_residue_dust": "Шламовий осад платини", - "item.gtceu.portable_debug_scanner": "Портативний сканер налагодження", + "item.gtceu.platinum_raw_dust": "Пил необробленої платини", + "item.gtceu.platinum_sludge_residue_dust": "Залишок платинового шламу", + "item.gtceu.portable_debug_scanner": "Портативний налагоджувальний сканер", "item.gtceu.portable_scanner": "Портативний сканер", "item.gtceu.power_thruster": "Силовий рушій", - "item.gtceu.programmed_circuit": "Програмована схема", - "item.gtceu.programmed_circuit.tooltip.0": "Використовуйте, щоб відкрити налаштування", - "item.gtceu.programmed_circuit.tooltip.1": "Shift+ПКМ на машині", - "item.gtceu.programmed_circuit.tooltip.2": "зі слотом схеми для налаштування", - "item.gtceu.programmed_circuit.tooltip.3": "значення цієї схеми.", - "item.gtceu.prospector.hv": "Покращений розвідник (ВН)", - "item.gtceu.prospector.luv": "Надрозвідник (АН)", - "item.gtceu.prospector.lv": "Розвідник руд (НН)", - "item.gtceu.pure_bentonite_dust": "Очищена купка бентоніту", - "item.gtceu.pure_cassiterite_sand_dust": "Очищена купка каситеритового піску", - "item.gtceu.pure_pitchblende_dust": "Очищена купка уранініту", - "item.gtceu.pure_rock_salt_dust": "Очищена купка кам'яної солі", - "item.gtceu.pure_salt_dust": "Очищена купка солі", - "item.gtceu.pure_talc_dust": "Очищена купка тальку", + "item.gtceu.programmed_circuit": "Програмна плата", + "item.gtceu.programmed_circuit.tooltip.0": "Використайте, щоб відкрити інтерфейс конфігурації", + "item.gtceu.programmed_circuit.tooltip.1": "Shift+ПКМ по машині з гніздом", + "item.gtceu.programmed_circuit.tooltip.2": "плати, щоб встановити її", + "item.gtceu.programmed_circuit.tooltip.3": "на значення цієї плати.", + "item.gtceu.prospector.hv": "Вдосконалений розвідник (HV)", + "item.gtceu.prospector.luv": "Супер розвідник (LuV)", + "item.gtceu.prospector.lv": "Рудошукач (LV)", + "item.gtceu.pure_bentonite_dust": "Очищений пил бентоніту", + "item.gtceu.pure_cassiterite_sand_dust": "Очищений пил каситеритового піску", + "item.gtceu.pure_pitchblende_dust": "Очищений пил настурану", + "item.gtceu.pure_rock_salt_dust": "Очищений пил кам'яної солі", + "item.gtceu.pure_salt_dust": "Очищена сіль", + "item.gtceu.pure_talc_dust": "Очищений пил тальку", "item.gtceu.purified_bentonite_ore": "Очищений бентоніт", "item.gtceu.purified_cassiterite_sand_ore": "Очищений каситеритовий пісок", - "item.gtceu.purified_pitchblende_ore": "Очищений уранініт", + "item.gtceu.purified_pitchblende_ore": "Очищений настуран", "item.gtceu.purified_talc_ore": "Очищений тальк", "item.gtceu.purple_drink": "Фіолетовий напій", - "item.gtceu.purple_dye_spray_can": "Балончик фіолетової фарби", - "item.gtceu.purple_glass_lens": "Фіолетова скляна лінза", - "item.gtceu.qbit_cpu_chip": "Кубітовий чип ЦП", - "item.gtceu.qbit_cpu_chip.tooltip": "§7Кубіт центрального процесора", - "item.gtceu.qbit_cpu_wafer": "Напівпровідникова пластина кубіта процесора", - "item.gtceu.qbit_cpu_wafer.tooltip": "§7Сира кубітова схема", + "item.gtceu.purple_dye_spray_can": "Аерозольний балончик (фіолетовий)", + "item.gtceu.purple_glass_lens": "Скляна лінза (Фіолетова)", + "item.gtceu.qbit_cpu_chip": "Чіп кубітного CPU", + "item.gtceu.qbit_cpu_chip.tooltip": "§7Кубітний центральний процесорний блок", + "item.gtceu.qbit_cpu_wafer": "Підкладка кубітного CPU", + "item.gtceu.qbit_cpu_wafer.tooltip": "§7Заготовка кубітної схеми", "item.gtceu.quantum_eye": "Квантове око", - "item.gtceu.quantum_eye.tooltip": "§7Покращене квантове око", + "item.gtceu.quantum_eye.tooltip": "§7Поліпшене око Енду", "item.gtceu.quantum_processor": "Квантовий процесор", - "item.gtceu.quantum_processor.tooltip.0": "§7Квантове обчислення гри в життя!", - "item.gtceu.quantum_processor.tooltip.1": "§aСхема ЕН", - "item.gtceu.quantum_processor_assembly": "Збірка квантового процесора", - "item.gtceu.quantum_processor_assembly.tooltip.0": "§7Квантове обчислення гри в життя!", - "item.gtceu.quantum_processor_assembly.tooltip.1": "§aСхема БН", - "item.gtceu.quantum_processor_computer": "Квантовий процесор надкомп'ютера", - "item.gtceu.quantum_processor_computer.tooltip.0": "§7Квантове обчислення гри в життя!", - "item.gtceu.quantum_processor_computer.tooltip.1": "§aСхема АН", - "item.gtceu.quantum_processor_mainframe": "Квантовий процесор мейнфрейму", - "item.gtceu.quantum_processor_mainframe.tooltip.0": "§7Квантове обчислення гри в життя!", - "item.gtceu.quantum_processor_mainframe.tooltip.1": "§aСхема НТМ", + "item.gtceu.quantum_processor.tooltip.0": "§7Квантові обчислення оживають!", + "item.gtceu.quantum_processor.tooltip.1": "§aСхема EV рівня", + "item.gtceu.quantum_processor_assembly": "Квантовий процесорний вузол", + "item.gtceu.quantum_processor_assembly.tooltip.0": "§7Квантові обчислення оживають!", + "item.gtceu.quantum_processor_assembly.tooltip.1": "§aСхема IV рівня", + "item.gtceu.quantum_processor_computer": "Квантовий процесорний суперкомп'ютер", + "item.gtceu.quantum_processor_computer.tooltip.0": "§7Квантові обчислення оживають!", + "item.gtceu.quantum_processor_computer.tooltip.1": "§aСхема LuV рівня", + "item.gtceu.quantum_processor_mainframe": "Квантовий процесорний мейнфрейм", + "item.gtceu.quantum_processor_mainframe.tooltip.0": "§7Квантові обчислення оживають!", + "item.gtceu.quantum_processor_mainframe.tooltip.1": "§aСхема ZPM рівня", "item.gtceu.quantum_star": "Квантова зірка", - "item.gtceu.quantum_star.tooltip": "§7Покращена зірка Незеру", - "item.gtceu.quarktech_boots": "Технокваркові чоботи", - "item.gtceu.quarktech_chestplate": "Технокварковий нагрудник", - "item.gtceu.quarktech_helmet": "Технокварковий шолом", - "item.gtceu.quarktech_leggings": "Технокваркові наголіннику", - "item.gtceu.quartz_sand_dust": "Пил кварцового піску", - "item.gtceu.rad_away_pill": "Таблетка Радавей™", - "item.gtceu.ram_chip": "Чип ПДД", - "item.gtceu.ram_chip.tooltip": "§7Пам'ять з довільним доступом", - "item.gtceu.ram_wafer": "Напівпровідникова пластина ПДД", - "item.gtceu.ram_wafer.tooltip": "§7Сира пам'ять", - "item.gtceu.rare_earth_dust": "Пил рідко-земельних металів", - "item.gtceu.rarest_metal_mixture_dust": "Пил рідко-металевої суміші", - "item.gtceu.raw_crystal_chip": "Сирий кришталевий чип", - "item.gtceu.raw_crystal_chip.tooltip": "§7Сирий кристал процесора", - "item.gtceu.raw_crystal_chip_parts": "Сирі кришталеві частини чипа", - "item.gtceu.raw_crystal_chip_parts.tooltip": "§7Сирі кришталеві частини процесора", - "item.gtceu.red_dye_spray_can": "Балончик червоної фарби", - "item.gtceu.red_glass_lens": "Червона скляна лінза", - "item.gtceu.refined_bentonite_ore": "Вишуканий бентоніт", - "item.gtceu.refined_cassiterite_sand_ore": "Вишуканий каситеритовий пісок", - "item.gtceu.refined_pitchblende_ore": "Вишуканий уранініт", - "item.gtceu.refined_talc_ore": "Вишуканий тальк", - "item.gtceu.resin_circuit_board": "Гумова плата", - "item.gtceu.resin_circuit_board.tooltip": "§7Плата з покриттям", - "item.gtceu.resin_printed_circuit_board": "Гумова друкована плата", - "item.gtceu.resin_printed_circuit_board.tooltip": "§7Плата схеми", + "item.gtceu.quantum_star.tooltip": "§7Поліпшена зірка Незеру", + "item.gtceu.quarktech_boots": "Чоботи косюма QuarkTech™", + "item.gtceu.quarktech_chestplate": "Нагрудник косюма QuarkTech™", + "item.gtceu.quarktech_helmet": "Шолом косюма QuarkTech™", + "item.gtceu.quarktech_leggings": "Наголінники косюма QuarkTech™", + "item.gtceu.quartz_sand_dust": "Кварцовий пісок", + "item.gtceu.rad_away_pill": "Пігулка антирадину™", + "item.gtceu.ram_chip": "Чіп RAM", + "item.gtceu.ram_chip.tooltip": "§7Оперативна пам'ять", + "item.gtceu.ram_wafer": "Підкладка RAM", + "item.gtceu.ram_wafer.tooltip": "§7Заготовка пам'яті", + "item.gtceu.rare_earth_dust": "Рідкісноземельний пил", + "item.gtceu.rarest_metal_mixture_dust": "Суміш найрідкісніших металів", + "item.gtceu.raw_crystal_chip": "Заготовка кришталевого чіпу", + "item.gtceu.raw_crystal_chip.tooltip": "§7Заготовка кришталевого чіпу", + "item.gtceu.raw_crystal_chip_parts": "Частинки заготовки кристалічного чіпу", + "item.gtceu.raw_crystal_chip_parts.tooltip": "§7Частинки заготовки кристалічного процесора", + "item.gtceu.red_dye_spray_can": "Аерозольний балончик (червоний)", + "item.gtceu.red_glass_lens": "Скляна лінза (Червона)", + "item.gtceu.refined_bentonite_ore": "Рафінований бентоніт", + "item.gtceu.refined_cassiterite_sand_ore": "Рафінований каситеритовий пісок", + "item.gtceu.refined_pitchblende_ore": "Рафінований настуран", + "item.gtceu.refined_talc_ore": "Рафінований тальк", + "item.gtceu.resin_circuit_board": "Резинова плата", + "item.gtceu.resin_circuit_board.tooltip": "§7Покрита плата", + "item.gtceu.resin_printed_circuit_board": "Резинова друкована плата", + "item.gtceu.resin_printed_circuit_board.tooltip": "§7Базова плата", "item.gtceu.resistor": "Резистор", - "item.gtceu.resistor.tooltip": "§7Звичайний електричний компонент", - "item.gtceu.ring_extruder_mold": "Форма екструдора кільця", - "item.gtceu.ring_extruder_mold.tooltip": "§7Форма екструдора для виготовлення кілець", - "item.gtceu.robot.arm.tooltip": "§7Обмежує §fпредмети§7 певною кількістю як §fмодифікатор§7.", - "item.gtceu.rock_salt_dust": "Пил кам'яної солі", - "item.gtceu.rod_extruder_mold": "Форма екструдора стрижня", - "item.gtceu.rod_extruder_mold.tooltip": "§7Форма екструдора для виготовлення стрижнів", - "item.gtceu.rod_long_extruder_mold.tooltip": "§7Форма екструдора для виготовлення довгих стрижнів", - "item.gtceu.rotor_casting_mold": "Ливарна форма ротора", - "item.gtceu.rotor_casting_mold.tooltip": "§7Форма екструдора для виготовлення роторів", - "item.gtceu.rotor_extruder_mold": "Форма екструдора ротора", - "item.gtceu.rotor_extruder_mold.tooltip": "§7Форма екструдора для виготовлення роторів", - "item.gtceu.rubber_boat": "Гевеєвий човен", - "item.gtceu.rubber_chest_boat": "Гевеєвий човен зі скринею", + "item.gtceu.resistor.tooltip": "§7Базовий електронний компонент", + "item.gtceu.ring_extruder_mold": "Відтискна форма (кільце)", + "item.gtceu.ring_extruder_mold.tooltip": "§7Формовий відтиск для виготовлення кілець", + "item.gtceu.robot.arm.tooltip": "§7Обмежує§f предмети§7 до певної кількості як§f кришка§7.", + "item.gtceu.rock_salt_dust": "Кам'яна сіль", + "item.gtceu.rod_extruder_mold": "Відтискна форма (стрижень)", + "item.gtceu.rod_extruder_mold.tooltip": "§7Формовий відтиск для виготовлення стрижнів", + "item.gtceu.rod_long_extruder_mold.tooltip": "§7Формовий відтиск для виготовлення довгих стрижнів", + "item.gtceu.rotor_casting_mold": "Відливна форма (ротор)", + "item.gtceu.rotor_casting_mold.tooltip": "§7Форма для виготовлення роторів", + "item.gtceu.rotor_extruder_mold": "Відтискна форма (ротор)", + "item.gtceu.rotor_extruder_mold.tooltip": "§7Формовий відтиск для виготовлення роторів", + "item.gtceu.rubber_boat": "Каучуковий човен", + "item.gtceu.rubber_chest_boat": "Каучуковий човен зі скринею", "item.gtceu.rubber_gloves": "Гумові рукавиці", - "item.gtceu.salt_dust": "Соляний пил", - "item.gtceu.saw_extruder_mold.tooltip": "§7Форма екструдера для виготовлення пил", - "item.gtceu.shovel_extruder_mold.tooltip": "§7Форма екструдера для виготовлення лопат", - "item.gtceu.shutter_module_cover": "Модуль засуву", - "item.gtceu.shutter_module_cover.tooltip": "§fПередача блоків§7 через приєднану сторону як §fмодифікатор§7.", - "item.gtceu.silicon_boule": "Монокристалічний кремній", - "item.gtceu.silicon_boule.tooltip": "§7Сира схема", - "item.gtceu.silicon_wafer": "Кремнієва напівпровідникова пластина", - "item.gtceu.silicon_wafer.tooltip": "§7Сира схема", - "item.gtceu.simple_soc": "СнЧ", - "item.gtceu.simple_soc.tooltip": "§7Звичайна система на чипі", - "item.gtceu.simple_soc_wafer": "Напівпровідникова пластина СнЧ", - "item.gtceu.simple_soc_wafer.tooltip": "§7Сира звичайна схема", - "item.gtceu.small_ash_dust": "Мала купка попелу", - "item.gtceu.small_basaltic_mineral_sand_dust": "Мала купка базальтового мінерального піску", - "item.gtceu.small_bentonite_dust": "Мала купка бентоніту", - "item.gtceu.small_blaze_dust": "Мала купка пороху пломеня", - "item.gtceu.small_bone_dust": "Мала купка кісткового борошна", - "item.gtceu.small_cassiterite_sand_dust": "Мала купка каситеритового піску", - "item.gtceu.small_dark_ash_dust": "Мала купка темного попелу", - "item.gtceu.small_fullers_earth_dust": "Мала купка відбілювальної глини", - "item.gtceu.small_garnet_sand_dust": "Мала купка гранатового піску", - "item.gtceu.small_gear_casting_mold": "Ливарна форма малої шестерні", - "item.gtceu.small_gear_extruder_mold": "Форма екструдора малої шестерні", - "item.gtceu.small_glauconite_sand_dust": "Мала купка глауконітового", - "item.gtceu.small_granitic_mineral_sand_dust": "Мала купка гранітного мінерального піску", - "item.gtceu.small_gunpowder_dust": "Мала купка пороху", - "item.gtceu.small_ice_dust": "Мала купка льоду", - "item.gtceu.small_inert_metal_mixture_dust": "Мала купка інертної металевої суміші", - "item.gtceu.small_iridium_metal_residue_dust": "Мала купка іридієвого металевого осаду", - "item.gtceu.small_meat_dust": "Мала купка м'ясного фаршу", - "item.gtceu.small_palladium_raw_dust": "Мала купка паладієвого пилу", - "item.gtceu.small_paper_dust": "Мала купка паперового пилу", - "item.gtceu.small_pipe_casting_mold": "Ливарна форма малої труби", - "item.gtceu.small_pipe_extruder_mold": "Форма екструдора малої труби", - "item.gtceu.small_pitchblende_dust": "Мала купка уранініту", - "item.gtceu.small_platinum_group_sludge_dust": "Малий згусток шламові групи платини", - "item.gtceu.small_platinum_raw_dust": "Мала купка сирої платини", - "item.gtceu.small_platinum_sludge_residue_dust": "Мала купка шламового осаду платини", - "item.gtceu.small_quartz_sand_dust": "Мала купка кварцового піску", - "item.gtceu.small_rare_earth_dust": "Мала купка рідко-земельних металів", - "item.gtceu.small_rarest_metal_mixture_dust": "Мала купка рідко-металевої суміші", - "item.gtceu.small_rock_salt_dust": "Мала купка кам'яної солі", - "item.gtceu.small_salt_dust": "Мала купка солі", - "item.gtceu.small_sugar_dust": "Мала купка цукру", - "item.gtceu.small_talc_dust": "Мала купка тальку", - "item.gtceu.small_treated_wood_dust": "Мала купка обробленої целюлози", - "item.gtceu.small_wheat_dust": "Мала купка борошна", - "item.gtceu.small_wood_dust": "Мала купка деревної целюлози", - "item.gtceu.smd_capacitor": "Конденсатор SMD", - "item.gtceu.smd_capacitor.tooltip": "§7Електричний компонент", - "item.gtceu.smd_diode": "Діод SMD", - "item.gtceu.smd_diode.tooltip": "§7Електричний компонент", - "item.gtceu.smd_inductor": "Індуктор SMD", - "item.gtceu.smd_inductor.tooltip": "§7Електричний компонент", - "item.gtceu.smd_resistor": "Резистор SMD", - "item.gtceu.smd_resistor.tooltip": "§7Електричний компонент", - "item.gtceu.smd_transistor": "Транзистор SMD", - "item.gtceu.smd_transistor.tooltip": "§7Електричний компонент", - "item.gtceu.soc": "СнЧ", - "item.gtceu.soc.tooltip": "§7Система на чипі", - "item.gtceu.soc_wafer": "Напівпровідникова пластина СнЧ", - "item.gtceu.soc_wafer.tooltip": "§7Сира звичайна схема", + "item.gtceu.salt_dust": "Сіль", + "item.gtceu.saw_extruder_mold.tooltip": "§7Формовий відтиск для виготовлення пил", + "item.gtceu.shovel_extruder_mold.tooltip": "§7Формовий відтиск для виготовлення лоавт", + "item.gtceu.shutter_module_cover": "Модуль затвору", + "item.gtceu.shutter_module_cover.tooltip": "§fПереміщує блоки§7 через приєднаний бік як§f кришка§7.", + "item.gtceu.silicon_boule": "Монокристалічна силіконова маса", + "item.gtceu.silicon_boule.tooltip": "§7Заготовка схеми", + "item.gtceu.silicon_wafer": "Силіконова підкладка", + "item.gtceu.silicon_wafer.tooltip": "§7Заготовка схеми", + "item.gtceu.simple_soc": "Базова SoC", + "item.gtceu.simple_soc.tooltip": "§7Базова система на чіпі", + "item.gtceu.simple_soc_wafer": "Підкладка базової SoC", + "item.gtceu.simple_soc_wafer.tooltip": "§7Заготовка простої схеми", + "item.gtceu.small_ash_dust": "Дрібний пил попелу", + "item.gtceu.small_basaltic_mineral_sand_dust": "Дрібний пил базальтового мінерального піску", + "item.gtceu.small_bentonite_dust": "Дрібний пил бентоніту", + "item.gtceu.small_blaze_dust": "Дрібний порох пломеня", + "item.gtceu.small_bone_dust": "Дрібне кісткове борошно", + "item.gtceu.small_cassiterite_sand_dust": "Дрібний пил каситеритового піску", + "item.gtceu.small_dark_ash_dust": "Дрібний темний попіл", + "item.gtceu.small_fullers_earth_dust": "Дрібний пил відбілювальних глин", + "item.gtceu.small_garnet_sand_dust": "Дрібний пил гранатового піску", + "item.gtceu.small_gear_casting_mold": "Відливна форма (мала шестерня)", + "item.gtceu.small_gear_extruder_mold": "Відтискна форма (мала шестерня)", + "item.gtceu.small_glauconite_sand_dust": "Дрібний пил глауконітового піску", + "item.gtceu.small_granitic_mineral_sand_dust": "Дрібний пил гранітового мінерального піску", + "item.gtceu.small_gunpowder_dust": "Дрібний порох", + "item.gtceu.small_ice_dust": "Колотий лід", + "item.gtceu.small_inert_metal_mixture_dust": "Дрібний пил суміші інертних металів", + "item.gtceu.small_iridium_metal_residue_dust": "Дрібний пил металевого залишку іридію", + "item.gtceu.small_meat_dust": "Дрібний фарш", + "item.gtceu.small_palladium_raw_dust": "Дрібний необроблений паладієвий пил", + "item.gtceu.small_paper_dust": "Дрібна паперова стружка", + "item.gtceu.small_pipe_casting_mold": "Відливна форма (мала труба)", + "item.gtceu.small_pipe_extruder_mold": "Відтискна форма (мала труба)", + "item.gtceu.small_pitchblende_dust": "Дрібний пил настурану", + "item.gtceu.small_platinum_group_sludge_dust": "Дрібний пил шламу платинової групи", + "item.gtceu.small_platinum_raw_dust": "Дрібний необроблений платиновий пил", + "item.gtceu.small_platinum_sludge_residue_dust": "Дрібний пил залишку платинового шламу", + "item.gtceu.small_quartz_sand_dust": "Дрібний пил кварцового піску", + "item.gtceu.small_rare_earth_dust": "Дрібний рідкісноземельний пил", + "item.gtceu.small_rarest_metal_mixture_dust": "Дрібний пил суміші найрідкісніших металів", + "item.gtceu.small_rock_salt_dust": "Дрібний пил кам'яної солі", + "item.gtceu.small_salt_dust": "Дрібна сіль", + "item.gtceu.small_sugar_dust": "Дрібний цукор", + "item.gtceu.small_talc_dust": "Дрібний пил тальку", + "item.gtceu.small_treated_wood_dust": "Дрібна оброблена деревна целюлоза", + "item.gtceu.small_wheat_dust": "Дрібне борошно", + "item.gtceu.small_wood_dust": "Дрібна деревна целюлоза", + "item.gtceu.smd_capacitor": "SMD конденсатор", + "item.gtceu.smd_capacitor.tooltip": "§7Електронний компонент", + "item.gtceu.smd_diode": "SMD діод", + "item.gtceu.smd_diode.tooltip": "§7Електронний компонент", + "item.gtceu.smd_inductor": "SMD індуктор", + "item.gtceu.smd_inductor.tooltip": "§7Електронний компонент", + "item.gtceu.smd_resistor": "SMD резистор", + "item.gtceu.smd_resistor.tooltip": "§7Електронний компонент", + "item.gtceu.smd_transistor": "SMD транзистор", + "item.gtceu.smd_transistor.tooltip": "§7Електронний компонент", + "item.gtceu.soc": "SoC", + "item.gtceu.soc.tooltip": "§7Система на чіпі", + "item.gtceu.soc_wafer": "Підкладка SoC", + "item.gtceu.soc_wafer.tooltip": "§7Заготовка базової схеми", "item.gtceu.solar_panel": "Сонячна панель", - "item.gtceu.solar_panel.tooltip.0": "§7Хай сонце буде з вами.", - "item.gtceu.solar_panel.tooltip.1": "Виробляє §fенергію§7 з §eсонця§7 як §fмодифікатор§7.", - "item.gtceu.solvent_spray_can": "Балончик (розчинник)", - "item.gtceu.stainless_steel_fluid_cell": "Капсул з нержавійної сталі (%s)", - "item.gtceu.steel_fluid_cell": "Сталева капсула (%s)", + "item.gtceu.solar_panel.tooltip.0": "§7Нехай сонце буде з вами.", + "item.gtceu.solar_panel.tooltip.1": "Виробляє§f енергію§7 з§e сонця§7 як§f кришка§7.", + "item.gtceu.solvent_spray_can": "Аерозольний балончик (Розчинник)", + "item.gtceu.stainless_steel_fluid_cell": "Нержавійна сталева комірка (%s)", + "item.gtceu.steel_fluid_cell": "Сталева комірка (%s)", "item.gtceu.steel_minecart_wheels": "Сталеві колеса вагонетки", "item.gtceu.stem_cells": "Стовбурові клітини", - "item.gtceu.stem_cells.tooltip": "§7Необроблений інтелект", - "item.gtceu.sticky_resin": "Каучук", - "item.gtceu.storage_cover": "Модифікатор збереження", + "item.gtceu.stem_cells.tooltip": "§7Сирий розум", + "item.gtceu.sticky_resin": "Липка смола", + "item.gtceu.storage_cover": "Кришка сховища", "item.gtceu.sugar_gem": "Кубик цукру", "item.gtceu.sus_record": "Платівка", "item.gtceu.sus_record.desc": "§7підозріло!", - "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": "Можна використовувати як оновлення §fмодулю конвеєра§7 і §fробо-руки§7.", - "item.gtceu.talc_dust": "Тальковий пил", + "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": "Може використовуватися як§f конвеєрний модуль§7 та покращення§f маніпулятора§7.", + "item.gtceu.talc_dust": "Тальк", "item.gtceu.tantalum_capacitor": "Танталовий конденсатор", "item.gtceu.terminal": "Термінал", - "item.gtceu.terminal.tooltip": "Shift+ПКМ на контролері, щоб автоматично створити багатоблок", - "item.gtceu.text_module": "Текстовий модуль", - "item.gtceu.tiny_ash_dust": "Крихітна купка попелу", - "item.gtceu.tiny_basaltic_mineral_sand_dust": "Крихітна купка базальтового мінерального піску", - "item.gtceu.tiny_bentonite_dust": "Крихітна купка бентоніту", - "item.gtceu.tiny_blaze_dust": "Крихітна купка пороху пломеня", - "item.gtceu.tiny_bone_dust": "Крихітна купка кісткового борошна", - "item.gtceu.tiny_cassiterite_sand_dust": "Крихітна купка каситеритового піску", - "item.gtceu.tiny_dark_ash_dust": "Крихітна купка темного попелу", - "item.gtceu.tiny_fullers_earth_dust": "Крихітна купка відбілювальних глин", - "item.gtceu.tiny_garnet_sand_dust": "Крихітна купка гранатового піску", - "item.gtceu.tiny_glauconite_sand_dust": "Крихітна купка глауконітового піску", - "item.gtceu.tiny_granitic_mineral_sand_dust": "Крихітна купка гранатного мінерального піску", - "item.gtceu.tiny_gunpowder_dust": "Крихітна купка пороху", - "item.gtceu.tiny_ice_dust": "Крихітна купка льоду", - "item.gtceu.tiny_inert_metal_mixture_dust": "Крихітна купка інертної мінеральної суміші", - "item.gtceu.tiny_iridium_metal_residue_dust": "Крихітна купка іридієвого металевого осаду", - "item.gtceu.tiny_meat_dust": "Крихітна купка м'ясного фаршу", - "item.gtceu.tiny_palladium_raw_dust": "Крихітна купка сирої платини", - "item.gtceu.tiny_paper_dust": "Мала купка паперового пилу", - "item.gtceu.tiny_pipe_casting_mold": "Ливарна форма крихітної труби", - "item.gtceu.tiny_pipe_extruder_mold": "Форма екструдора крихітної труби", - "item.gtceu.tiny_pitchblende_dust": "Крихітна купка уранініту", - "item.gtceu.tiny_platinum_group_sludge_dust": "Крихітний згусток шламові групи платини", - "item.gtceu.tiny_platinum_raw_dust": "Крихітна купка сирої платини", - "item.gtceu.tiny_platinum_sludge_residue_dust": "Крихітна купка шламового осаду платини", - "item.gtceu.tiny_quartz_sand_dust": "Крихітна купка кварцового піску", - "item.gtceu.tiny_rare_earth_dust": "Крихітна купка рідко-земельних металів", - "item.gtceu.tiny_rarest_metal_mixture_dust": "Крихітна купка рідко-металевої суміші", - "item.gtceu.tiny_rock_salt_dust": "Крихітна купка кам'яної солі", - "item.gtceu.tiny_salt_dust": "Крихітна купка солі", - "item.gtceu.tiny_sugar_dust": "Крихітна купка цукру", - "item.gtceu.tiny_talc_dust": "Крихітна купка тальку", - "item.gtceu.tiny_treated_wood_dust": "Крихітна купка обробленої целюлози", - "item.gtceu.tiny_wheat_dust": "Крихітна купка борошна", - "item.gtceu.tiny_wood_dust": "Крихітна купка деревної целюлози", - "item.gtceu.titanium_fluid_cell": "Титанова капсула (%s)", - "item.gtceu.tool.aoe.columns": "Стовп", - "item.gtceu.tool.aoe.layers": "Шари", + "item.gtceu.terminal.tooltip": "Shift+ПКМ по контролеру для автоматичної побудови конструкції", + "item.gtceu.text_module": "Модуль тексту", + "item.gtceu.tiny_ash_dust": "Крихта пилу попелу", + "item.gtceu.tiny_basaltic_mineral_sand_dust": "Крихта пилу базальтового мінерального піску", + "item.gtceu.tiny_bentonite_dust": "Крихта пилу бентоніту", + "item.gtceu.tiny_blaze_dust": "Крихта пороху пломеня", + "item.gtceu.tiny_bone_dust": "Крихта кісткового борошна", + "item.gtceu.tiny_cassiterite_sand_dust": "Крихта пилу каситеритового піску", + "item.gtceu.tiny_dark_ash_dust": "Крихта темного попелу", + "item.gtceu.tiny_fullers_earth_dust": "Крихта пилу відбілювальних глин", + "item.gtceu.tiny_garnet_sand_dust": "Крихта пилу гранатового піску", + "item.gtceu.tiny_glauconite_sand_dust": "Крихта пилу глауконітового піску", + "item.gtceu.tiny_granitic_mineral_sand_dust": "Крихта пилу гранітового мінерального піску", + "item.gtceu.tiny_gunpowder_dust": "Крихта пороху", + "item.gtceu.tiny_ice_dust": "Крихта подрібненого льоду", + "item.gtceu.tiny_inert_metal_mixture_dust": "Крихта пилу суміші інертних металів", + "item.gtceu.tiny_iridium_metal_residue_dust": "Крихта пилу металевого залишку іридію", + "item.gtceu.tiny_meat_dust": "Крихта фаршу", + "item.gtceu.tiny_palladium_raw_dust": "Крихта необробленого паладієвого пилу", + "item.gtceu.tiny_paper_dust": "Крихітна паперова стружка", + "item.gtceu.tiny_pipe_casting_mold": "Відливна форма (крихітна труба)", + "item.gtceu.tiny_pipe_extruder_mold": "Відтискна форма (крихітна труба)", + "item.gtceu.tiny_pitchblende_dust": "Крихта пилу настурану", + "item.gtceu.tiny_platinum_group_sludge_dust": "Крихта пилу шламу платинової групи", + "item.gtceu.tiny_platinum_raw_dust": "Крихта необробленого платинового пилу", + "item.gtceu.tiny_platinum_sludge_residue_dust": "Крихта пилу залишку платинового шламу", + "item.gtceu.tiny_quartz_sand_dust": "Крихта пилу кварцового піску", + "item.gtceu.tiny_rare_earth_dust": "Крихта рідкісноземельного пилу", + "item.gtceu.tiny_rarest_metal_mixture_dust": "Крихта пилу суміші найрідкісніших металів", + "item.gtceu.tiny_rock_salt_dust": "Крихта пилу кам'яної солі", + "item.gtceu.tiny_salt_dust": "Крихта солі", + "item.gtceu.tiny_sugar_dust": "Крихта цукру", + "item.gtceu.tiny_talc_dust": "Крихта пилу тальку", + "item.gtceu.tiny_treated_wood_dust": "Крихта обробленої деревної целюлози", + "item.gtceu.tiny_wheat_dust": "Крихта борошна", + "item.gtceu.tiny_wood_dust": "Крихта деревної целюлози", + "item.gtceu.titanium_fluid_cell": "Титанова комірка (%s)", + "item.gtceu.tool.aoe.columns": "Колони", + "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.dowse_campfire": "§eПожежник: §fДоузу багаття", - "item.gtceu.tool.behavior.ground_tilling": "§eФермер: §fОрання землі", - "item.gtceu.tool.behavior.plunger": "§9Сантехнік: §fЗливає рідини", + "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.dowse_campfire": "§1Вогнеборець: §fгасить багаття", + "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.prospecting.air": "Знайдено повітряну кишеню", - "item.gtceu.tool.behavior.prospecting.changing": "Виявлена ​​матеріальна зміна", + "item.gtceu.tool.behavior.prospecting.changing": "Виявлено зміну матеріала", "item.gtceu.tool.behavior.prospecting.lava": "Знайдено лаву", "item.gtceu.tool.behavior.prospecting.ore": "Знайдено руду: %s", "item.gtceu.tool.behavior.prospecting.water": "Знайдено воду", - "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": "§cBrute: §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Зрубування дерев", - "item.gtceu.tool.butchery_knife": "М'ясницький ніж (%s)", + "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 повалює дерева", + "item.gtceu.tool.butchery_knife": "М'ясний ніж (%s)", "item.gtceu.tool.butchery_knife.tooltip": "§8Має низьку швидкість атаки", - "item.gtceu.tool.buzzsaw": "Циркулярна пила (%s) (НН)", - "item.gtceu.tool.buzzsaw.tooltip": "§8Не підходить для збирання блоків", + "item.gtceu.tool.buzzsaw": "LV електропила (%s)", + "item.gtceu.tool.buzzsaw.tooltip": "§8Не підходить для збору блоків", "item.gtceu.tool.crowbar": "Лом (%s)", - "item.gtceu.tool.crowbar.tooltip": "§8Знімає модифікатори", - "item.gtceu.tool.ev_drill": "Бур (%s) (ЕН)", - "item.gtceu.tool.file": "Напильник (%s)", + "item.gtceu.tool.crowbar.tooltip": "§8Знімає кришки", + "item.gtceu.tool.ev_drill": "EV Бур (%s)", + "item.gtceu.tool.file": "Напилок (%s)", "item.gtceu.tool.hammer": "Молот (%s)", - "item.gtceu.tool.hammer.tooltip": "§8Подрібнює блоки під час їх збирання", + "item.gtceu.tool.hammer.tooltip": "§8Подрібнює блоки при добуванні", "item.gtceu.tool.harvest_level.0": "§8Дерево", "item.gtceu.tool.harvest_level.1": "§7Камінь", "item.gtceu.tool.harvest_level.2": "§aЗалізо", "item.gtceu.tool.harvest_level.3": "§bДіамант", "item.gtceu.tool.harvest_level.4": "§dНезерит", - "item.gtceu.tool.harvest_level.5": "§9Дюраній", + "item.gtceu.tool.harvest_level.5": "§9Дюран", "item.gtceu.tool.harvest_level.6": "§cНейтроній", "item.gtceu.tool.hoe": "Мотика (%s)", - "item.gtceu.tool.hv_chainsaw": "Ланцюгова пила (%s) (ВН)", - "item.gtceu.tool.hv_drill": "Бур (%s) (ВН)", - "item.gtceu.tool.hv_wirecutter": "Кусачки для дротів (%s) (ВН)", - "item.gtceu.tool.hv_wrench": "Гайковий ключ (%s) (ВН)", - "item.gtceu.tool.hv_wrench.tooltip": "§8Утримуйте ЛКМ, щоб розібрати машини", - "item.gtceu.tool.iv_drill": "Бур (%s) (БН)", - "item.gtceu.tool.iv_wirecutter": "Кусачки для дротів (%s) (БН)", - "item.gtceu.tool.iv_wrench": "Гайковий ключ (%s) (БН)", - "item.gtceu.tool.iv_wrench.tooltip": "§8Утримуйте ЛКМ щоб розібрати машини", + "item.gtceu.tool.hv_chainsaw": "HV ланцюгова пила (%s)", + "item.gtceu.tool.hv_drill": "HV Бур (%s)", + "item.gtceu.tool.hv_wirecutter": "HV кусачки (%s)", + "item.gtceu.tool.hv_wrench": "HV гайковерт (%s)", + "item.gtceu.tool.hv_wrench.tooltip": "§8Утримуйте ЛКМ, щоб демонтовувати машини", + "item.gtceu.tool.iv_drill": "IV Бур (%s)", + "item.gtceu.tool.iv_wirecutter": "IV кусачки (%s)", + "item.gtceu.tool.iv_wrench": "IV гайковерт (%s)", + "item.gtceu.tool.iv_wrench.tooltip": "§8Утримуйте ЛКМ, щоб демонтовувати машини", "item.gtceu.tool.knife": "Ніж (%s)", - "item.gtceu.tool.lighter.platinum.tooltip": "§7На ньому вигравіруваний відомий майстер розіграшів", - "item.gtceu.tool.lv_chainsaw": "Ланцюгова пила (%s) (НН)", - "item.gtceu.tool.lv_drill": "Бур (%s) (НН)", - "item.gtceu.tool.lv_screwdriver": "Викрутка (%s) (НН)", - "item.gtceu.tool.lv_screwdriver.tooltip": "§8Регулює модифікатори та машини", - "item.gtceu.tool.lv_wirecutter": "Кусачки для дротів (%s) (НН)", - "item.gtceu.tool.lv_wrench": "Гайковий ключ (%s)", - "item.gtceu.tool.lv_wrench.tooltip": "§8Утримуйте ЛКМ, щоб розібрати машини", - "item.gtceu.tool.mallet": "М'який молоток (%s)", - "item.gtceu.tool.mallet.tooltip.0": "§8Призупиняє машину після поточного рецепту.", + "item.gtceu.tool.lighter.platinum.tooltip": "§7На ній викарбуваний відомий майстер пранків", + "item.gtceu.tool.lv_chainsaw": "LV ланцюгова пила (%s)", + "item.gtceu.tool.lv_drill": "LV Бур (%s)", + "item.gtceu.tool.lv_screwdriver": "LV викрутка (%s)", + "item.gtceu.tool.lv_screwdriver.tooltip": "§8Налаштовує кришки та машини", + "item.gtceu.tool.lv_wirecutter": "LV кусачки (%s)", + "item.gtceu.tool.lv_wrench": "LV гайковерт (%s)", + "item.gtceu.tool.lv_wrench.tooltip": "§8Утримуйте ЛКМ, щоб демонтовувати машини", + "item.gtceu.tool.mallet": "Киянка (%s)", + "item.gtceu.tool.mallet.tooltip.0": "§8Клацніть по машині крадькома, щоб зупинити її по завершенню поточної операції.", "item.gtceu.tool.mallet.tooltip.1": "§8Зупиняє/запускає машини", - "item.gtceu.tool.matchbox.tooltip": "§7Не грайтеся з сірниками", + "item.gtceu.tool.matchbox.tooltip": "§7Це не авто", "item.gtceu.tool.mining_hammer": "Шахтарський молот (%s)", - "item.gtceu.tool.mining_hammer.tooltip": "§8Добуває велику територію одночасно (якщо ви не прокрадаєтеся)", + "item.gtceu.tool.mining_hammer.tooltip": "§8Добуває більшою площею (поки ви не крадетесь)", "item.gtceu.tool.mortar": "Ступка (%s)", - "item.gtceu.tool.mv_chainsaw": "Ланцюгова пила (%s) (СН)", - "item.gtceu.tool.mv_drill": "Бур (%s) (СН)", + "item.gtceu.tool.mv_chainsaw": "MV ланцюгова пила (%s)", + "item.gtceu.tool.mv_drill": "MV Бур (%s)", "item.gtceu.tool.pickaxe": "Кайло (%s)", - "item.gtceu.tool.plunger": "Поринач (%s)", + "item.gtceu.tool.plunger": "Вантуз (%s)", "item.gtceu.tool.plunger.tooltip": "§8Видаляє рідини з машин", - "item.gtceu.tool.replace_tool_head": "Майстрування з новим наконечником, щоб замінити її", + "item.gtceu.tool.replace_tool_head": "Об'єднайте з іншою головкою інструмента, щоб замінити її", "item.gtceu.tool.rolling_pin": "Качалка (%s)", "item.gtceu.tool.saw": "Пила (%s)", "item.gtceu.tool.screwdriver": "Викрутка (%s)", - "item.gtceu.tool.screwdriver.tooltip": "§8Регулює модифікатори та машини", + "item.gtceu.tool.screwdriver.tooltip": "§8Налаштовує кришки та машини", "item.gtceu.tool.scythe": "Коса (%s)", - "item.gtceu.tool.scythe.tooltip": "§8Тому що серп не має сенсу", + "item.gtceu.tool.scythe.tooltip": "§8Тому що коса не має сенсу", "item.gtceu.tool.shears": "Ножиці (%s)", "item.gtceu.tool.shovel": "Лопата (%s)", "item.gtceu.tool.spade": "Заступ (%s)", - "item.gtceu.tool.spade.tooltip": "§8Добуває велику територію одночасно (якщо ви не крадетесь)", + "item.gtceu.tool.spade.tooltip": "§8Добуває більшою площею (поки ви не крадетесь)", "item.gtceu.tool.sword": "Меч (%s)", - "item.gtceu.tool.tooltip.attack_damage": "%s §cшкоди при атаці", - "item.gtceu.tool.tooltip.attack_speed": "%s §9швидкости атаки", - "item.gtceu.tool.tooltip.crafting_uses": "%s §aвикористань в майструванні", - "item.gtceu.tool.tooltip.default_enchantments": "§5Усталені зачарування:", - "item.gtceu.tool.tooltip.general_uses": "§bМіцність: §f%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Всього міцности: §f%s", - "item.gtceu.tool.tooltip.mining_speed": "%s §dшвидкости добування", - "item.gtceu.tool.tooltip.repair_info": "§8Утримуйте Shift для деталей лагодження", - "item.gtceu.tool.tooltip.repair_material": "§8Лагодження з: §f§a%s", - "item.gtceu.tool.usable_as": "§8Використовується як: §f%s", - "item.gtceu.tool.wire_cutter": "Кусачки для дротів (%s)", + "item.gtceu.tool.tooltip.attack_damage": "%s§c шкоди при атаці", + "item.gtceu.tool.tooltip.attack_speed": "%s§9 швидкости атаки", + "item.gtceu.tool.tooltip.crafting_uses": "%s§a використань у майструванні", + "item.gtceu.tool.tooltip.default_enchantments": "§5Усталені чари:", + "item.gtceu.tool.tooltip.general_uses": "%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": "%s§d швидкости добування", + "item.gtceu.tool.tooltip.repair_info": "§8Утримуйте Shift, щоб показати інформацію з ремонтування", + "item.gtceu.tool.tooltip.repair_material": "§8Придатне для ремонту:§f§a %s", + "item.gtceu.tool.usable_as": "§8Використовується як:§f %s", + "item.gtceu.tool.wire_cutter": "Кусачки (%s)", "item.gtceu.tool.wrench": "Гайковий ключ (%s)", - "item.gtceu.tool.wrench.tooltip": "§8Утримуйте ЛКМ, щоб розібрати машини", + "item.gtceu.tool.wrench.tooltip": "§8Утримуйте ЛКМ, щоб демонтовувати машини", "item.gtceu.transistor": "Транзистор", - "item.gtceu.transistor.tooltip": "§7Звичайний електричний компонент", - "item.gtceu.treated_wood_boat": "Оброблений човен", - "item.gtceu.treated_wood_bolt": "Оброблена паличка", - "item.gtceu.treated_wood_chest_boat": "Оброблений човен зі скринею", - "item.gtceu.treated_wood_dust": "Оброблена целюлоза", - "item.gtceu.treated_wood_plate": "Оброблена дошка", - "item.gtceu.treated_wood_rod": "Оброблена палиця", - "item.gtceu.tungsten_grinding_head": "Вольфрамовий шліфувальний наконечник", - "item.gtceu.tungsten_steel_fluid_cell": "Вольфрамо-сталева капсула (%s)", + "item.gtceu.transistor.tooltip": "§7Базовий електронний компонент", + "item.gtceu.treated_wood_boat": "Оброблений дерев'яний човен", + "item.gtceu.treated_wood_bolt": "Коротка оброблена дерев'яна палиця", + "item.gtceu.treated_wood_chest_boat": "Оброблений дерев'яний човен зі скринею", + "item.gtceu.treated_wood_dust": "Оброблена дерев'яна стружка", + "item.gtceu.treated_wood_plate": "Оброблена дерев'яна дошка", + "item.gtceu.treated_wood_rod": "Оброблена дерев'яна палиця", + "item.gtceu.tungsten_grinding_head": "Вольфрамова шліфувальна головка", + "item.gtceu.tungsten_steel_fluid_cell": "Вольфрамова сталева комірка (%s)", "item.gtceu.turbine_rotor": "Ротор турбіни (%s)", - "item.gtceu.turbine_rotor.tooltip": "Ротори турбін для вашої енергетичної станції", - "item.gtceu.uev_conveyor_module": "Модуль конвеєра УнН", - "item.gtceu.uev_electric_motor": "Електромотор УнН", - "item.gtceu.uev_electric_piston": "Електропоршень УнН", - "item.gtceu.uev_electric_pump": "Електропомпа УнН", - "item.gtceu.uev_emitter": "Випромінювач УнН", - "item.gtceu.uev_field_generator": "Генератор полів УнН", - "item.gtceu.uev_fluid_regulator": "Регулятор рідини УнН", - "item.gtceu.uev_robot_arm": "Робо-рука УнН", - "item.gtceu.uev_sensor": "Сенсор УнН", - "item.gtceu.uev_voltage_coil.tooltip": "Мала та неймовірна котушка", - "item.gtceu.uhpic_chip": "Чип НвнІС", - "item.gtceu.uhpic_chip.tooltip": "§7Надвисоконапружна інтегральна схема", - "item.gtceu.uhpic_wafer": "Напівпровідникова пластина НвнІС", - "item.gtceu.uhpic_wafer.tooltip": "§7Сира надвисоконапружна схема", - "item.gtceu.uhv_conveyor_module": "Модуль конвеєра УвН", - "item.gtceu.uhv_electric_motor": "Електродвигун УвН", - "item.gtceu.uhv_electric_piston": "Електропоршень УвН", - "item.gtceu.uhv_electric_pump": "Електропомпа УвН", - "item.gtceu.uhv_emitter": "Випромінювач УвН", - "item.gtceu.uhv_field_generator": "Генератор полв УвН", - "item.gtceu.uhv_fluid_regulator": "Регулятор рідини УвН", - "item.gtceu.uhv_robot_arm": "Робо-рука УвН", - "item.gtceu.uhv_sensor": "Сенсор УвН", - "item.gtceu.uhv_voltage_coil.tooltip": "Мала та потужна котушка", - "item.gtceu.uiv_conveyor_module": "Модуль конвеєра НвН", - "item.gtceu.uiv_electric_motor": "Електродвигун НвН", - "item.gtceu.uiv_electric_piston": "Електропоршень НвН", - "item.gtceu.uiv_electric_pump": "Електропомпа НвН", - "item.gtceu.uiv_emitter": "Випромінювач НвН", - "item.gtceu.uiv_field_generator": "Генератор полів НвН", - "item.gtceu.uiv_fluid_regulator": "Регулятор рідини НвН", - "item.gtceu.uiv_robot_arm": "Робо-рука НвН", - "item.gtceu.uiv_sensor": "Сенсор НвН", - "item.gtceu.uiv_voltage_coil.tooltip": "Мала та божевільна котушка", - "item.gtceu.ulpic_chip": "Чип НннІС", - "item.gtceu.ulpic_chip.tooltip": "§7Наднизьканапружна інтегральна схема", - "item.gtceu.ulpic_wafer": "Напівпровідникова пластина НннІС", - "item.gtceu.ulpic_wafer.tooltip": "§7Сира наднизьконапружна схема", - "item.gtceu.ulv_solar_panel": "Сонячна панель наднизької напруги", + "item.gtceu.turbine_rotor.tooltip": "Ротор турбін для вашої електростанції", + "item.gtceu.uev_conveyor_module": "UEV конвеєрний модуль", + "item.gtceu.uev_electric_motor": "UEV електричний мотор", + "item.gtceu.uev_electric_piston": "UEV електричний поршень", + "item.gtceu.uev_electric_pump": "UEV електрична помпа", + "item.gtceu.uev_emitter": "UEV випромінювач", + "item.gtceu.uev_field_generator": "UEV генератор поля", + "item.gtceu.uev_fluid_regulator": "UEV регулятор рідини", + "item.gtceu.uev_robot_arm": "UEV маніпулятор", + "item.gtceu.uev_sensor": "UEV сенсор", + "item.gtceu.uev_voltage_coil.tooltip": "Нереальна котушка", + "item.gtceu.uhpic_chip": "Чіп UHPIC", + "item.gtceu.uhpic_chip.tooltip": "§7IC надмірно високої напруги", + "item.gtceu.uhpic_wafer": "Підкладка UHPIC", + "item.gtceu.uhpic_wafer.tooltip": "§7Заготовка надвисокопотужної схеми", + "item.gtceu.uhv_conveyor_module": "UHV конвеєрний модуль", + "item.gtceu.uhv_electric_motor": "UHV електричний мотор", + "item.gtceu.uhv_electric_piston": "UHV електричний поршень", + "item.gtceu.uhv_electric_pump": "UHV електрична помпа", + "item.gtceu.uhv_emitter": "UHV випромінювач", + "item.gtceu.uhv_field_generator": "UHV генератор поля", + "item.gtceu.uhv_fluid_regulator": "UHV регулятор рідини", + "item.gtceu.uhv_robot_arm": "UHV маніпулятор", + "item.gtceu.uhv_sensor": "UHV сенсор", + "item.gtceu.uhv_voltage_coil.tooltip": "Ультракотушка", + "item.gtceu.uiv_conveyor_module": "UIV конвеєрний модуль", + "item.gtceu.uiv_electric_motor": "UIV електричний мотор", + "item.gtceu.uiv_electric_piston": "UIV електричний поршень", + "item.gtceu.uiv_electric_pump": "UIV електрична помпа", + "item.gtceu.uiv_emitter": "UIV випромінювач", + "item.gtceu.uiv_field_generator": "UIV генератор поля", + "item.gtceu.uiv_fluid_regulator": "UIV регулятор рідини", + "item.gtceu.uiv_robot_arm": "UIV маніпулятор", + "item.gtceu.uiv_sensor": "UIV сенсор", + "item.gtceu.uiv_voltage_coil.tooltip": "Божевільна котушка", + "item.gtceu.ulpic_chip": "Чіп ULPIC", + "item.gtceu.ulpic_chip.tooltip": "§7IC надмірно низької напруги", + "item.gtceu.ulpic_wafer": "Підкладка ULPIC", + "item.gtceu.ulpic_wafer.tooltip": "§7Заготовка наднизькопотужної схеми", + "item.gtceu.ulv_solar_panel": "Сонячна панель ультранизької напруги", "item.gtceu.ulv_tantalum_battery.tooltip": "§7Багаторазова батарея", - "item.gtceu.ulv_voltage_coil": "Котушка наднизької напруги", - "item.gtceu.ulv_voltage_coil.tooltip": "Примітивна котушки", - "item.gtceu.universal_fluid_cell": "Універсальна капсула (%s)", + "item.gtceu.ulv_voltage_coil": "Котушка надмірно низької напруги", + "item.gtceu.ulv_voltage_coil.tooltip": "Примітивна котушка", + "item.gtceu.universal_fluid_cell": "Універсальна комірка (%s)", "item.gtceu.uv_battery_hull": "Великий корпус наквадрієвої батареї", - "item.gtceu.uv_battery_hull.tooltip": "§7Порожній корпус батареї §3ІН§7", - "item.gtceu.uv_conveyor_module": "Модуль конвеєра ІН", - "item.gtceu.uv_electric_motor": "Електродвигун ІН", - "item.gtceu.uv_electric_piston": "Електропоршень ІН", - "item.gtceu.uv_electric_pump": "Електропомпа ІН", - "item.gtceu.uv_emitter": "Випромінювач ІН", - "item.gtceu.uv_field_generator": "Генератор полів ІН", - "item.gtceu.uv_fluid_regulator": "Регулятор рідини ІН", + "item.gtceu.uv_battery_hull.tooltip": "§7Порожній корпус§3 UV§7 батареї", + "item.gtceu.uv_conveyor_module": "UV конвеєрний модуль", + "item.gtceu.uv_electric_motor": "UV електричний мотор", + "item.gtceu.uv_electric_piston": "UV електричний поршень", + "item.gtceu.uv_electric_pump": "UV електрична помпа", + "item.gtceu.uv_emitter": "UV випромінювач", + "item.gtceu.uv_field_generator": "UV генератор поля", + "item.gtceu.uv_fluid_regulator": "UV регулятор рідини", "item.gtceu.uv_naquadria_battery": "Велика наквадрієва батарея", "item.gtceu.uv_naquadria_battery.tooltip": "§7Багаторазова батарея", - "item.gtceu.uv_robot_arm": "Робо-рука ІН", - "item.gtceu.uv_sensor": "Сенсор ІН", - "item.gtceu.uv_solar_panel": "Сонячна панель ідеальної напруги", - "item.gtceu.uv_voltage_coil": "Мала котушка ідеальної напруги", - "item.gtceu.uv_voltage_coil.tooltip": "Мала та ідеальна котушка", - "item.gtceu.uxv_conveyor_module": "Модуль конвеєра НеН", - "item.gtceu.uxv_electric_motor": "Електродвигун НеН", - "item.gtceu.uxv_electric_piston": "Електропоршень НеН", - "item.gtceu.uxv_electric_pump": "Електропомпа НеН", - "item.gtceu.uxv_emitter": "Випромінювач НеН", - "item.gtceu.uxv_field_generator": "Генератор полів НеН", - "item.gtceu.uxv_fluid_regulator": "регулятор рідини НеН", - "item.gtceu.uxv_robot_arm": "Робо-рука НеН", - "item.gtceu.uxv_sensor": "Сенсор НеН", - "item.gtceu.uxv_voltage_coil.tooltip": "Мала та епічна котушка НеН", + "item.gtceu.uv_robot_arm": "UV маніпулятор", + "item.gtceu.uv_sensor": "UV сенсор", + "item.gtceu.uv_solar_panel": "Сонячна панель ультимативної напруги", + "item.gtceu.uv_voltage_coil": "Котушка ультимативної напруги", + "item.gtceu.uv_voltage_coil.tooltip": "Ультимативна котушка", + "item.gtceu.uxv_conveyor_module": "UXV конвеєрний модуль", + "item.gtceu.uxv_electric_motor": "UXV електричний мотор", + "item.gtceu.uxv_electric_piston": "UXV електричний поршень", + "item.gtceu.uxv_electric_pump": "UXV електрична помпа", + "item.gtceu.uxv_emitter": "UXV випромінювач", + "item.gtceu.uxv_field_generator": "UXV генератор поля", + "item.gtceu.uxv_fluid_regulator": "UXV регулятор рідини", + "item.gtceu.uxv_robot_arm": "UXV маніпулятор", + "item.gtceu.uxv_sensor": "UXV сенсор", + "item.gtceu.uxv_voltage_coil.tooltip": "Епічна котушка", "item.gtceu.vacuum_tube": "Вакуумна трубка", "item.gtceu.vacuum_tube.tooltip.0": "§7Технічно це діод", - "item.gtceu.vacuum_tube.tooltip.1": "§cНнН", - "item.gtceu.wetware_circuit_board": "Органічна плата", - "item.gtceu.wetware_circuit_board.tooltip": "§7Плата, що зберігає життя", - "item.gtceu.wetware_printed_circuit_board": "Органічна друкована плата", - "item.gtceu.wetware_printed_circuit_board.tooltip": "§7Плата, що зберігає життя", - "item.gtceu.wetware_processor": "Органічний процесор", - "item.gtceu.wetware_processor.tooltip.0": "§7Але чи запустить він Doom?", - "item.gtceu.wetware_processor.tooltip.1": "§4Схема АБ", - "item.gtceu.wetware_processor_assembly": "Збірка органічного процесора", + "item.gtceu.vacuum_tube.tooltip.1": "§cULV-рівень", + "item.gtceu.wetware_circuit_board": "Животехічна плата", + "item.gtceu.wetware_circuit_board.tooltip": "§7Плата, що містить життя", + "item.gtceu.wetware_printed_circuit_board": "Животехічна друкована плата", + "item.gtceu.wetware_printed_circuit_board.tooltip": "§7Плата, що містить життя", + "item.gtceu.wetware_processor": "Животехнічний процесор", + "item.gtceu.wetware_processor.tooltip.0": "§7Він ніби спостерігає за вами", + "item.gtceu.wetware_processor.tooltip.1": "§4Схема LuV рівня", + "item.gtceu.wetware_processor_assembly": "Животехнічний процесорний вузол", "item.gtceu.wetware_processor_assembly.tooltip.0": "§7Може запустити Minecraft", - "item.gtceu.wetware_processor_assembly.tooltip.1": "§4Схема НТМ", - "item.gtceu.wetware_processor_computer": "Органічний процесор надкомп'ютера", - "item.gtceu.wetware_processor_computer.tooltip.0": "§7Неперевершене злиття плоті та машини", - "item.gtceu.wetware_processor_computer.tooltip.1": "§4Схема ІН", - "item.gtceu.wetware_processor_mainframe": "Органічний процесор мейнфрейму", - "item.gtceu.wetware_processor_mainframe.tooltip.0": "§7Найкраща, яка коли-небудь бачила", - "item.gtceu.wetware_processor_mainframe.tooltip.1": "§4Схема УвН", + "item.gtceu.wetware_processor_assembly.tooltip.1": "§4Схема ZPM рівня", + "item.gtceu.wetware_processor_computer": "Животехнічний процесорний суперкомп'ютер", + "item.gtceu.wetware_processor_computer.tooltip.0": "§7Остаточне злиття плоті та машини", + "item.gtceu.wetware_processor_computer.tooltip.1": "§4Схема UV рівня", + "item.gtceu.wetware_processor_mainframe": "Животехнічний процесорний мейнфрейм", + "item.gtceu.wetware_processor_mainframe.tooltip.0": "§7Краще, що коли-небудь хтось бачив", + "item.gtceu.wetware_processor_mainframe.tooltip.1": "§4Схема UHV рівня", "item.gtceu.wheat_dust": "Борошно", - "item.gtceu.white_dye_spray_can": "Балончик білої фарби", - "item.gtceu.wire_extruder_mold": "Форма екструдора дроту", - "item.gtceu.wire_extruder_mold.tooltip": "§7Форма екструдора для виготовлення дротів", + "item.gtceu.white_dye_spray_can": "Аерозольний балончик (білий)", + "item.gtceu.wire_extruder_mold": "Відтискна форма (дріт)", + "item.gtceu.wire_extruder_mold.tooltip": "§7Формовий відтиск для виготовлення дротів", "item.gtceu.wireless_transmitter_cover": "Бездротовий передавач", - "item.gtceu.wood_bolt": "Паличка", - "item.gtceu.wood_dust": "Деревна целюлоза", + "item.gtceu.wood_bolt": "Коротка палиця", + "item.gtceu.wood_dust": "Дерев'яна стружка", "item.gtceu.wood_plate": "Дерев'яна дошка", - "item.gtceu.yellow_dye_spray_can": "Балончик жовтої фарби", - "item.gtceu.yellow_glass_lens": "Жовта скляна лінза", - "item.gtceu.zero_point_module": "Нуль-точковий модуль", + "item.gtceu.yellow_dye_spray_can": "Аерозольний балончик (жовтий)", + "item.gtceu.yellow_glass_lens": "Скляна лінза (Жовта)", + "item.gtceu.zero_point_module": "Модуль нульової точки", "item.gtceu.zpm_battery_hull": "Середній корпус наквадрієвої батареї", - "item.gtceu.zpm_battery_hull.tooltip": "§7Порожній корпус батареї §fНТМ", - "item.gtceu.zpm_conveyor_module": "Модуль конвеєр НТМ", - "item.gtceu.zpm_electric_motor": "Електродвигун НТМ", - "item.gtceu.zpm_electric_piston": "Електропоршень НТМ", - "item.gtceu.zpm_electric_pump": "Електропомпа НТМ", - "item.gtceu.zpm_emitter": "Випромінювач НТМ", - "item.gtceu.zpm_field_generator": "Генератор полів НТМ", - "item.gtceu.zpm_fluid_regulator": "Регулятор рідини НТМ", + "item.gtceu.zpm_battery_hull.tooltip": "§7Порожній корпус§f ZPM§7 батареї", + "item.gtceu.zpm_conveyor_module": "ZPM конвеєрний модуль", + "item.gtceu.zpm_electric_motor": "ZPM електричний мотор", + "item.gtceu.zpm_electric_piston": "ZPM електричний поршень", + "item.gtceu.zpm_electric_pump": "ZPM електрична помпа", + "item.gtceu.zpm_emitter": "ZPM випромінювач", + "item.gtceu.zpm_field_generator": "ZPM генератор поля", + "item.gtceu.zpm_fluid_regulator": "ZPM регулятор рідини", "item.gtceu.zpm_naquadria_battery": "Середня наквадрієва батарея", "item.gtceu.zpm_naquadria_battery.tooltip": "§7Багаторазова батарея", - "item.gtceu.zpm_robot_arm": "Робо-рука НТМ", - "item.gtceu.zpm_sensor": "Сенсор НТМ", - "item.gtceu.zpm_solar_panel": "Сонячна панель нуль-точкового модуля", - "item.gtceu.zpm_voltage_coil": "Мала котушка напруги нуль-точкового модулю", - "item.gtceu.zpm_voltage_coil.tooltip": "Нуль-котушка", - "item.invalid.name": "Недійсний предмет", + "item.gtceu.zpm_robot_arm": "ZPM маніпулятор", + "item.gtceu.zpm_sensor": "ZPM сенсор", + "item.gtceu.zpm_solar_panel": "Сонячна панель модуля нульової точки", + "item.gtceu.zpm_voltage_coil": "Котушки напруги модуля нульової точки", + "item.gtceu.zpm_voltage_coil.tooltip": "Суперкотушка", + "item.invalid.name": "Неприпустимий предмет", "item.netherrack_nether_quartz": "Незерська кварцова руда", - "item.toggle.advanced.info.tooltip": "§8", + "item.toggle.advanced.info.tooltip": "§8<Крадіться, щоб відобразити конфігурацію зберігання>", "itemGroup.gtceu.decoration": "GregTechCEu: Декоративні блоки", "itemGroup.gtceu.item": "GregTechCEu: Предмети", - "itemGroup.gtceu.machine": "GregTechCEu: Машини", - "itemGroup.gtceu.material_block": "GregTechCEu: Матеріали блоків", - "itemGroup.gtceu.material_fluid": "GregTechCEu: Матеріали вмістищ рідин", - "itemGroup.gtceu.material_item": "GregTechCEu: Матеріали предметів", - "itemGroup.gtceu.material_pipe": "GregTechCEu: Матеріали труб", + "itemGroup.gtceu.machine": "GregTechCEU: Машини", + "itemGroup.gtceu.material_block": "GregTechCEu: Блоки матеріалів", + "itemGroup.gtceu.material_fluid": "GregTechCEu: Рідинні містила матеріалів", + "itemGroup.gtceu.material_item": "GregTechCEu: Предмети матеріалів", + "itemGroup.gtceu.material_pipe": "GregTechCEu: Труби", "itemGroup.gtceu.tool": "GregTechCEu: Інструменти", - "ldlib.gui.editor.group.widget.gtm_container": "Віджети вмістища GTM", - "ldlib.gui.editor.register.editor.gtceu.mui": "Проєкт UI машини", - "ldlib.gui.editor.register.editor.gtceu.rtui": "Проєкт UI типу рецепта", + "ldlib.gui.editor.group.widget.gtm_container": "GTM: Віджети контейнерів", + "ldlib.gui.editor.register.editor.gtceu.mui": "Проєкт машинного інтерфейсу", + "ldlib.gui.editor.register.editor.gtceu.rtui": "Проєкт інтерфейсу типу рецепта", "ldlib.gui.editor.register.editor.gtceu.template_tab": "шаблони", - "ldlib.gui.editor.register.widget.container.gtm_fluid_slot": "Рідинний слот GTM", - "ldlib.gui.editor.register.widget.container.gtm_item_slot": "Предметний слот GTM", - "ldlib.gui.editor.register.widget.container.gtm_phantom_fluid_slot": "Фантомний рідинний слот GTM", - "ldlib.gui.editor.register.widget.container.gtm_phantom_item_slot": "Фантомний предметний слот GTM", - "mataarmor.hud.supply_mode": "Режим постачання: %s", + "ldlib.gui.editor.register.widget.container.gtm_fluid_slot": "GTM: Рідинний слот", + "ldlib.gui.editor.register.widget.container.gtm_item_slot": "GTM: Предметний слот", + "ldlib.gui.editor.register.widget.container.gtm_phantom_fluid_slot": "GTM: Фантомний рідинний слот", + "ldlib.gui.editor.register.widget.container.gtm_phantom_item_slot": "GTM: Фантомний предметний слот", + "mataarmor.hud.supply_mode": "Режим живлення: %s", "material.gtceu.acetic_acid": "Оцтова кислота", - "material.gtceu.acetic_anhydride": "Ангідрит оцтової кислоти", + "material.gtceu.acetic_anhydride": "Оцтовий ангідрид", "material.gtceu.acetone": "Ацетон", - "material.gtceu.acidic_enriched_naquadah_solution": "Кислотний збагачений наквадовий розчин", - "material.gtceu.acidic_naquadria_solution": "Кислотний наквадовий розчин", - "material.gtceu.acidic_osmium_solution": "Кислотний осмієвий розчин", + "material.gtceu.acidic_enriched_naquadah_solution": "Кислотний збагачений розчин наквади", + "material.gtceu.acidic_naquadria_solution": "Кислотний розчин наквадрії", + "material.gtceu.acidic_osmium_solution": "Розчин осмієвої кислоти", "material.gtceu.actinium": "Актиній", - "material.gtceu.activated_carbon": "Активований вуглець", + "material.gtceu.activated_carbon": "Активоване вугілля", "material.gtceu.agar": "Агар", "material.gtceu.air": "Повітря", - "material.gtceu.allyl_chloride": "Аллілхлорид", + "material.gtceu.allyl_chloride": "Алілхлорид", "material.gtceu.almandine": "Альмандин", "material.gtceu.aluminium": "Алюміній", "material.gtceu.aluminium_sulfite": "Сульфіт алюмінію", - "material.gtceu.alunite": "Алюніт", + "material.gtceu.alunite": "Алуніт", "material.gtceu.americium": "Америцій", "material.gtceu.amethyst": "Аметист", "material.gtceu.aminophenol": "Амінофенол", @@ -5014,26 +5021,26 @@ "material.gtceu.andesite": "Андезит", "material.gtceu.andradite": "Андрадит", "material.gtceu.annealed_copper": "Відпалена мідь", - "material.gtceu.antimony": "Сурма", - "material.gtceu.antimony_trifluoride": "Трифторид сурми", - "material.gtceu.antimony_trioxide": "Триоксид сурми", + "material.gtceu.antimony": "Стибій", + "material.gtceu.antimony_trifluoride": "Фторид стибію", + "material.gtceu.antimony_trioxide": "Оксид стибію", "material.gtceu.apatite": "Апатит", - "material.gtceu.aqua_regia": "Царська горілка", + "material.gtceu.aqua_regia": "Гетьманська горілка", "material.gtceu.argon": "Аргон", "material.gtceu.arsenic": "Арсен", - "material.gtceu.arsenic_trioxide": "Триоксид арсену", + "material.gtceu.arsenic_trioxide": "Оксид арсену", "material.gtceu.asbestos": "Азбест", "material.gtceu.ash": "Попіл", "material.gtceu.astatine": "Астат", - "material.gtceu.bacteria": "Бактерія", - "material.gtceu.bacterial_sludge": "Бактеріальний осад", + "material.gtceu.bacteria": "Бактерії", + "material.gtceu.bacterial_sludge": "Бактерієвий шлам", "material.gtceu.barite": "Барит", "material.gtceu.barium": "Барій", "material.gtceu.barium_sulfide": "Сульфід барію", "material.gtceu.basalt": "Базальт", "material.gtceu.basaltic_mineral_sand": "Базальтовий мінеральний пісок", - "material.gtceu.bastnasite": "Бастнасіт", - "material.gtceu.battery_alloy": "Припій", + "material.gtceu.bastnasite": "Бастнезит", + "material.gtceu.battery_alloy": "Батарейний злиток", "material.gtceu.bauxite": "Боксит", "material.gtceu.bauxite_slag": "Бокситовий шлак", "material.gtceu.bauxite_sludge": "Бокситовий шлам", @@ -5045,10 +5052,10 @@ "material.gtceu.bio_diesel": "Біодизель", "material.gtceu.biomass": "Біомаса", "material.gtceu.biotite": "Біотит", - "material.gtceu.biphenyl": "Біфеніл", + "material.gtceu.biphenyl": "Діфеніл", "material.gtceu.bismuth": "Бісмут", "material.gtceu.bismuth_bronze": "Бісмутова бронза", - "material.gtceu.bisphenol_a": "Бісфенол А", + "material.gtceu.bisphenol_a": "Бісфенол A", "material.gtceu.black_bronze": "Чорна бронза", "material.gtceu.black_dye": "Чорний барвник", "material.gtceu.black_steel": "Чорна сталь", @@ -5063,11 +5070,11 @@ "material.gtceu.borax": "Бура", "material.gtceu.bornite": "Борніт", "material.gtceu.boron": "Бор", - "material.gtceu.borosilicate_glass": "Боросилікатне скло", + "material.gtceu.borosilicate_glass": "Боросілікатне скло", "material.gtceu.brass": "Латунь", - "material.gtceu.brick": "Цегла", + "material.gtceu.brick": "Цеглина", "material.gtceu.bromine": "Бром", - "material.gtceu.bronze": "Олов'яна бронза", + "material.gtceu.bronze": "Бронза", "material.gtceu.brown_dye": "Коричневий барвник", "material.gtceu.butadiene": "Бутадієн", "material.gtceu.butane": "Бутан", @@ -5079,85 +5086,85 @@ "material.gtceu.calcium": "Кальцій", "material.gtceu.calcium_carbonate": "Карбонат кальцію", "material.gtceu.calcium_chloride": "Хлорид кальцію", - "material.gtceu.calcium_ferrocyanide": "Фероціанід кальцію", + "material.gtceu.calcium_ferrocyanide": "Фероцианід кальцію", "material.gtceu.calcium_hydroxide": "Гідроксид кальцію", "material.gtceu.calcium_phosphide": "Фосфід кальцію", "material.gtceu.californium": "Каліфорній", "material.gtceu.caprolactam": "Капролактам", "material.gtceu.carbon": "Вуглець", - "material.gtceu.carbon_dioxide": "Вуглекислий газ", - "material.gtceu.carbon_monoxide": "Оксид вуглецю", + "material.gtceu.carbon_dioxide": "Діоксид вуглецю", + "material.gtceu.carbon_monoxide": "Монооксид вуглецю", "material.gtceu.cassiterite": "Каситерит", "material.gtceu.cassiterite_sand": "Каситеритовий пісок", "material.gtceu.cerium": "Церій", "material.gtceu.certus_quartz": "Істинний кварц", - "material.gtceu.cetane_boosted_diesel": "Дизель з вищим цетановим числом", - "material.gtceu.chalcocite": "Халькоцит", + "material.gtceu.cetane_boosted_diesel": "Високоцитанове дизельне паливо", + "material.gtceu.chalcocite": "Халькозин", "material.gtceu.chalcopyrite": "Халькопірит", "material.gtceu.charcoal": "Деревне вугілля", - "material.gtceu.charcoal_byproducts": "Залишки деревного вугілля", + "material.gtceu.charcoal_byproducts": "Побічні продукти з деревного вугілля", "material.gtceu.chlorine": "Хлор", - "material.gtceu.chlorobenzene": "Хлоробензен", + "material.gtceu.chlorobenzene": "Хлорбензен", "material.gtceu.chloroform": "Хлороформ", - "material.gtceu.chloromethane": "Хлорлметан", + "material.gtceu.chloromethane": "Хлорометан", "material.gtceu.chromite": "Хроміт", "material.gtceu.chromium": "Хром", - "material.gtceu.chromium_trioxide": "Триоксид хрому", - "material.gtceu.cinnabar": "Цинобра", + "material.gtceu.chromium_trioxide": "Оксид хрому", + "material.gtceu.cinnabar": "Кіновар", "material.gtceu.clay": "Глина", "material.gtceu.coal": "Вугілля", "material.gtceu.coal_gas": "Вугільний газ", - "material.gtceu.coal_tar": "Вугільний дьоготь", + "material.gtceu.coal_tar": "Вугільна смола", "material.gtceu.cobalt": "Кобальт", "material.gtceu.cobalt_brass": "Кобальтова латунь", - "material.gtceu.cobalt_oxide": "Оксид кобальту", + "material.gtceu.cobalt_oxide": "Оксид кобальта", "material.gtceu.cobaltite": "Кобальтит", "material.gtceu.cocoa": "Какао", "material.gtceu.coke": "Кокс", "material.gtceu.collagen": "Колаген", "material.gtceu.concrete": "Бетон", "material.gtceu.construction_foam": "Будівельна піна", - "material.gtceu.cooperite": "Куперит", + "material.gtceu.cooperite": "Шелдоніт", "material.gtceu.copernicium": "Коперницій", "material.gtceu.copper": "Мідь", - "material.gtceu.cracked_bauxite_slurry": "Крекінгована бокситова суспензія", + "material.gtceu.cracked_bauxite_slurry": "Крекінгова бокситова суспензія", "material.gtceu.creosote": "Креозот", "material.gtceu.cumene": "Кумен", "material.gtceu.cupric_oxide": "Оксид міді", - "material.gtceu.cupronickel": "Мідно-нікель", + "material.gtceu.cupronickel": "Мельхіор", "material.gtceu.curium": "Кюрій", "material.gtceu.cyan_dye": "Бірюзовий барвник", "material.gtceu.cyclohexane": "Циклогексан", - "material.gtceu.cyclohexanone_oxime": "Оксим циклогексанону", - "material.gtceu.damascus_steel": "Дамаська сталь", + "material.gtceu.cyclohexanone_oxime": "Циклогексанон оксім", + "material.gtceu.damascus_steel": "Дамаск", "material.gtceu.dark_ash": "Темний попіл", "material.gtceu.darmstadtium": "Дармштадтій", - "material.gtceu.debrominated_brine": "Дебромінований розсіл", + "material.gtceu.decalcified_bauxite_sludge": "Декальцинований бокситовий шлам", "material.gtceu.deepslate": "Глибосланець", - "material.gtceu.depleted_uranium_hexafluoride": "Гексафторид збідненого урану", + "material.gtceu.depleted_uranium_hexafluoride": "Збіднений гексафторид урану", "material.gtceu.deuterium": "Дейтерій", "material.gtceu.diaminobenzidine": "Діамінобензидин", "material.gtceu.diamond": "Діамант", "material.gtceu.diatomite": "Діатоміт", - "material.gtceu.dichlorobenzene": "Дихлоробензен", - "material.gtceu.dichlorobenzidine": "Дихлорбензидин", - "material.gtceu.dichloroethane": "Дихлоретан", + "material.gtceu.dichlorobenzene": "Діхлорбензен", + "material.gtceu.dichlorobenzidine": "Діхлорбензідін", + "material.gtceu.dichloroethane": "Діхлоретан", "material.gtceu.diesel": "Дизель", - "material.gtceu.diethylenetriamine": "Діетилентріамін", - "material.gtceu.diethylenetriamine_pentaacetonitrile": "Діетилентріамін пентаацетонітрил", - "material.gtceu.diethylenetriaminepentaacetic_acid": "Діетилентріамінпентаоцтова кислота", - "material.gtceu.diluted_hydrochloric_acid": "Розведена соляна кислота", - "material.gtceu.diluted_sulfuric_acid": "Розведена сірчана кислота", + "material.gtceu.diethylenetriamine": "Діетілентріамін", + "material.gtceu.diethylenetriamine_pentaacetonitrile": "Діетілентріамін пентаоцтонітріл", + "material.gtceu.diethylenetriaminepentaacetic_acid": "Діетілентріамінопентаоцтова кислота", + "material.gtceu.diluted_hydrochloric_acid": "Розбавлена соляна кислота", + "material.gtceu.diluted_sulfuric_acid": "Розбавлена cульфатна кислота", "material.gtceu.dimethylamine": "Диметиламін", "material.gtceu.dimethylbenzene": "Диметилбензен", "material.gtceu.dimethyldichlorosilane": "Диметилдихлорсилан", "material.gtceu.dimethylhydrazine": "Диметилгідразин", - "material.gtceu.dinitrogen_tetroxide": "Чотириоксид азоту", + "material.gtceu.dinitrogen_tetroxide": "Азотний тетраоксид", "material.gtceu.diorite": "Діорит", - "material.gtceu.diphenyl_isophthalate": "Дифеніл ізофталат", + "material.gtceu.diphenyl_isophthalate": "Діфеніл ізофталат", "material.gtceu.dissolved_calcium_acetate": "Розчинений ацетат кальцію", "material.gtceu.distilled_water": "Дистильована вода", - "material.gtceu.drilling_fluid": "Буровий розчин", + "material.gtceu.drilling_fluid": "Бурильна рідина", "material.gtceu.dubnium": "Дубній", "material.gtceu.duranium": "Дюраній", "material.gtceu.dysprosium": "Диспрозій", @@ -5170,22 +5177,22 @@ "material.gtceu.ender_eye": "Око Енду", "material.gtceu.ender_pearl": "Перлина Енду", "material.gtceu.endstone": "Камінь Енду", - "material.gtceu.enriched_bacterial_sludge": "Збагачений бактеріальний осад", - "material.gtceu.enriched_naquadah": "Збагачений наквад", - "material.gtceu.enriched_naquadah_solution": "Збагачений розчин накваду", - "material.gtceu.enriched_naquadah_sulfate": "Збагачений наквадовий сульфат ", - "material.gtceu.enriched_naquadah_trinium_europium_duranide": "Збагачений наквадій-тринітій-європій-дюраніт", - "material.gtceu.enriched_naquadah_waste": "Збагачені відходи накваду", + "material.gtceu.enriched_bacterial_sludge": "Збагачений бактерієвий шлам", + "material.gtceu.enriched_naquadah": "Збагачена наквада", + "material.gtceu.enriched_naquadah_solution": "Збагачений розчин наквади", + "material.gtceu.enriched_naquadah_sulfate": "Сульфат збагаченої наквади", + "material.gtceu.enriched_naquadah_trinium_europium_duranide": "Збагачений наквада триній європій дуранід", + "material.gtceu.enriched_naquadah_waste": "Відпрацьована збагачена наквада", "material.gtceu.enriched_uranium_hexafluoride": "Збагачений гексафторид урану", "material.gtceu.epichlorohydrin": "Епіхлоргідрин", - "material.gtceu.epoxy": "Епоксидна смола", + "material.gtceu.epoxy": "Епоксидна суміш", "material.gtceu.erbium": "Ербій", "material.gtceu.ethane": "Етан", "material.gtceu.ethanol": "Етанол", "material.gtceu.ethenone": "Етенон", - "material.gtceu.ethyl_tertbutyl_ether": "Етилтретрибутиловий етер", + "material.gtceu.ethyl_tertbutyl_ether": "Метилтретинний бутиловий етер", "material.gtceu.ethylbenzene": "Етилбензен", - "material.gtceu.ethylene": "Етен", + "material.gtceu.ethylene": "Етилен", "material.gtceu.europium": "Європій", "material.gtceu.fermented_biomass": "Ферментована біомаса", "material.gtceu.fermium": "Фермій", @@ -5208,19 +5215,19 @@ "material.gtceu.gallium_arsenide": "Арсенід галію", "material.gtceu.gallium_sulfide": "Сульфід галію", "material.gtceu.garnet_sand": "Гранатовий пісок", - "material.gtceu.garnierite": "Гарнієрит", + "material.gtceu.garnierite": "Гранетит", "material.gtceu.gasoline": "Бензин", "material.gtceu.gelatin": "Желатин", "material.gtceu.gelatin_mixture": "Желатинова суміш", "material.gtceu.germanium": "Германій", "material.gtceu.glass": "Скло", - "material.gtceu.glauconite_sand": "Глауконітовий пісок", + "material.gtceu.glauconite_sand": "Глауконітове скло", "material.gtceu.glowstone": "Світлокамінь", "material.gtceu.glue": "Клей", - "material.gtceu.glycerol": "Гліцерин", - "material.gtceu.glyceryl_trinitrate": "Гліцерилтринітрат", - "material.gtceu.glycolonitrile": "Гліколонітрил", - "material.gtceu.goethite": "Гетит", + "material.gtceu.glycerol": "Гліцерол", + "material.gtceu.glyceryl_trinitrate": "Гліцерил тринітрат", + "material.gtceu.glycolonitrile": "Гліконітрил", + "material.gtceu.goethite": "Ґетит", "material.gtceu.gold": "Золото", "material.gtceu.granite": "Граніт", "material.gtceu.granite_red": "Червоний граніт", @@ -5230,82 +5237,82 @@ "material.gtceu.gray_dye": "Сірий барвник", "material.gtceu.green_dye": "Зелений барвник", "material.gtceu.green_sapphire": "Зелений сапфір", - "material.gtceu.green_sapphire_slurry": "Суспензія зеленого сапфіра", - "material.gtceu.grossular": "Гросуляр", + "material.gtceu.green_sapphire_slurry": "Зелено-сапфірова суспензія", + "material.gtceu.grossular": "Гроссуляр", "material.gtceu.gunpowder": "Порох", "material.gtceu.gypsum": "Гіпс", "material.gtceu.hafnium": "Гафній", "material.gtceu.hassium": "Гасій", - "material.gtceu.hastelloy_c_276": "Гастелой C-276", - "material.gtceu.hastelloy_x": "Гастелой X", + "material.gtceu.hastelloy_c_276": "Хастелой C-276", + "material.gtceu.hastelloy_x": "Хастелой X", "material.gtceu.heavy_fuel": "Важке паливо", "material.gtceu.helium": "Гелій", - "material.gtceu.helium_3": "Гелій-3", + "material.gtceu.helium_3": "Гелій 3", "material.gtceu.hematite": "Гематит", - "material.gtceu.high_octane_gasoline": "Висококтановий бензин", - "material.gtceu.holmium": "Гольмій", - "material.gtceu.hsla_steel": "HSLA сталь", + "material.gtceu.high_octane_gasoline": "Високооктановий безин", + "material.gtceu.holmium": "Голмій", + "material.gtceu.hsla_steel": "HSLA-сталь", "material.gtceu.hsse": "HSS-E", "material.gtceu.hssg": "HSS-G", "material.gtceu.hsss": "HSS-S", - "material.gtceu.hydro_cracked_butadiene": "Бутадієн водневого крекінгу", - "material.gtceu.hydro_cracked_butane": "Бутан водневого крекінгу", - "material.gtceu.hydro_cracked_butene": "Бутен водневого крекінгу", - "material.gtceu.hydro_cracked_ethane": "Етан водневого крекінгу", - "material.gtceu.hydro_cracked_ethylene": "Етиловий спирт водневого крекінгу", - "material.gtceu.hydro_cracked_propane": "Пропан водневого крекінгу", - "material.gtceu.hydro_cracked_propene": "Пропен водневого крекінгу", + "material.gtceu.hydro_cracked_butadiene": "Водневокрекінговий бутадієн", + "material.gtceu.hydro_cracked_butane": "Водневокрекінговий бутан", + "material.gtceu.hydro_cracked_butene": "Водневокрекінговий бутен", + "material.gtceu.hydro_cracked_ethane": "Водневокрекінговий етан", + "material.gtceu.hydro_cracked_ethylene": "Водневокрекінговий етилен", + "material.gtceu.hydro_cracked_propane": "Водневокрекінговий пропан", + "material.gtceu.hydro_cracked_propene": "Водневокрекінговий пропен", "material.gtceu.hydrochloric_acid": "Соляна кислота", - "material.gtceu.hydrofluoric_acid": "Фтористоводнева кислота", + "material.gtceu.hydrofluoric_acid": "Флуоридна кислота", "material.gtceu.hydrogen": "Водень", - "material.gtceu.hydrogen_cyanide": "Ціаністий водень", - "material.gtceu.hydrogen_peroxide": "Пероксил водню", + "material.gtceu.hydrogen_cyanide": "Синильна кислота", + "material.gtceu.hydrogen_peroxide": "Пероксид водню", "material.gtceu.hydrogen_sulfide": "Сірководень", - "material.gtceu.hypochlorous_acid": "Хлоровиста кислота", + "material.gtceu.hypochlorous_acid": "Гіпохлоритна кислота", "material.gtceu.ice": "Лід", "material.gtceu.ilmenite": "Ільменіт", - "material.gtceu.ilmenite_slag": "Ільменітовий шлак", - "material.gtceu.impure_enriched_naquadah_solution": "Нечистий збагачений розчин накваду", - "material.gtceu.impure_naquadria_solution": "Нечистий розчин накваду", - "material.gtceu.incoloy_ma_956": "Інколой MA-956", + "material.gtceu.ilmenite_slag": "Ільменітовий шлам", + "material.gtceu.impure_enriched_naquadah_solution": "Нечистий збагачений розчин наквади", + "material.gtceu.impure_naquadria_solution": "Нечистий розчин наквадрії", + "material.gtceu.incoloy_ma_956": "Incoloy MA-956", "material.gtceu.indium": "Індій", "material.gtceu.indium_concentrate": "Концентрат індію", - "material.gtceu.indium_gallium_phosphide": "Фосфід індій-галію", + "material.gtceu.indium_gallium_phosphide": "Фосфід індію-галію", "material.gtceu.indium_phosphide": "Фосфід індію", - "material.gtceu.indium_tin_barium_titanium_cuprate": "Індій-олово-барій-титан-купрат", + "material.gtceu.indium_tin_barium_titanium_cuprate": "Індій олово барій титановий купорос", "material.gtceu.inert_metal_mixture": "Інертна металева суміш", "material.gtceu.invar": "Інвар", "material.gtceu.iodine": "Йод", "material.gtceu.iridium": "Іридій", "material.gtceu.iridium_chloride": "Хлорид іридію", - "material.gtceu.iridium_metal_residue": "Іридієвий металевий осад", + "material.gtceu.iridium_metal_residue": "Металевий залишок іридію", "material.gtceu.iron": "Залізо", - "material.gtceu.iron_ii_chloride": "Хлорид заліза II", - "material.gtceu.iron_iii_chloride": "Хлорид заліза III", + "material.gtceu.iron_ii_chloride": "Хлорид заліза (II)", + "material.gtceu.iron_iii_chloride": "Хлорид заліза (III)", "material.gtceu.isoprene": "Ізопрен", "material.gtceu.kanthal": "Кантал", "material.gtceu.krypton": "Криптон", "material.gtceu.kyanite": "Кіаніт", "material.gtceu.lanthanum": "Лантан", - "material.gtceu.lapis": "Лазурит", + "material.gtceu.lapis": "Лапіс", "material.gtceu.lapotron": "Лапотрон", "material.gtceu.lava": "Лава", - "material.gtceu.lawrencium": "Лавренціум", - "material.gtceu.lazurite": "Ляпис", + "material.gtceu.lawrencium": "Лоуренсій", + "material.gtceu.lazurite": "Лазурит", "material.gtceu.lead": "Свинець", - "material.gtceu.lead_zinc_solution": "Свинцево-цинковий розчин", + "material.gtceu.lead_zinc_solution": "Свинцево-цинкова суміш", "material.gtceu.lepidolite": "Лепідоліт", - "material.gtceu.light_blue_dye": "Світло-блакитна фарба", + "material.gtceu.light_blue_dye": "Блакитний барвник", "material.gtceu.light_fuel": "Легке паливо", "material.gtceu.light_gray_dye": "Світло-сірий барвник", - "material.gtceu.lightly_hydro_cracked_gas": "Газ легкого водневого крекінгу", - "material.gtceu.lightly_hydro_cracked_heavy_fuel": "Важке паливо легкого водневого крекінгу", - "material.gtceu.lightly_hydro_cracked_light_fuel": "Легке паливо легкого водневого крекінгу", - "material.gtceu.lightly_hydro_cracked_naphtha": "Нафта легкого водневого крекінгу", - "material.gtceu.lightly_steam_cracked_gas": "Газ легкого парового крекінгу", - "material.gtceu.lightly_steam_cracked_heavy_fuel": "Важке паливо легкого парового крекінгу", - "material.gtceu.lightly_steam_cracked_light_fuel": "Легке паливо легкого парового крекінгу", - "material.gtceu.lightly_steam_cracked_naphtha": "Нафта легкого парового крекінгу", + "material.gtceu.lightly_hydro_cracked_gas": "Легко-водневокрекінговий газ", + "material.gtceu.lightly_hydro_cracked_heavy_fuel": "Легко-водневокрекінгове важке паливо", + "material.gtceu.lightly_hydro_cracked_light_fuel": "Легко-водневокрекінгове легке паливо", + "material.gtceu.lightly_hydro_cracked_naphtha": "Легко-водневокрекінговий лігроїн", + "material.gtceu.lightly_steam_cracked_gas": "Легко-парокрекінговий газ", + "material.gtceu.lightly_steam_cracked_heavy_fuel": "Легко-парокрекінгове важке паливо", + "material.gtceu.lightly_steam_cracked_light_fuel": "Легко-парокрекінгове легке паливо", + "material.gtceu.lightly_steam_cracked_naphtha": "Легко-парокрекінговий лігроїн", "material.gtceu.lime_dye": "Лаймовий барвник", "material.gtceu.liquid_air": "Рідке повітря", "material.gtceu.liquid_ender_air": "Рідке повітря Енду", @@ -5313,16 +5320,16 @@ "material.gtceu.lithium": "Літій", "material.gtceu.lithium_chloride": "Хлорид літію", "material.gtceu.livermorium": "Ліверморій", - "material.gtceu.lpg": "Зріджений нафтовий газ", + "material.gtceu.lpg": "ЗНГ", "material.gtceu.lubricant": "Мастило", "material.gtceu.lutetium": "Лютецій", "material.gtceu.magenta_dye": "Пурпуровий барвник", "material.gtceu.magnalium": "Магналій", - "material.gtceu.magnesia": "Магнезія", + "material.gtceu.magnesia": "Периклаз", "material.gtceu.magnesite": "Магнезит", - "material.gtceu.magnesium": "Магній", - "material.gtceu.magnesium_chloride": "Хлорид магнію", - "material.gtceu.magnesium_diboride": "Діборид магнію", + "material.gtceu.magnesium": "Магнезій", + "material.gtceu.magnesium_chloride": "Хлорид магнезію", + "material.gtceu.magnesium_diboride": "Диборид магнію", "material.gtceu.magnetic_iron": "Магнітне залізо", "material.gtceu.magnetic_neodymium": "Магнітний неодим", "material.gtceu.magnetic_samarium": "Магнітний самарій", @@ -5331,16 +5338,16 @@ "material.gtceu.malachite": "Малахіт", "material.gtceu.manganese": "Манган", "material.gtceu.manganese_phosphide": "Фосфід мангану", - "material.gtceu.maraging_steel_300": "Мартенситностарійна сталь 300", + "material.gtceu.maraging_steel_300": "Марагенова сталь 300", "material.gtceu.marble": "Мармур", "material.gtceu.massicot": "Масикот", - "material.gtceu.mc_guffium_239": "Мак Ґрафій 239", + "material.gtceu.mc_guffium_239": "МакГаффін 239", "material.gtceu.meat": "М'ясо", - "material.gtceu.meitnerium": "Мейтнерій", + "material.gtceu.meitnerium": "Майтнерій", "material.gtceu.mendelevium": "Менделевій", "material.gtceu.mercury": "Ртуть", - "material.gtceu.mercury_barium_calcium_cuprate": "Купрат ртуті-барію-кальцію", - "material.gtceu.metal_mixture": "Металева суміш", + "material.gtceu.mercury_barium_calcium_cuprate": "Ртуть барій кальцієвий купорос", + "material.gtceu.metal_mixture": "Суміш металів", "material.gtceu.methane": "Метан", "material.gtceu.methanol": "Метанол", "material.gtceu.methyl_acetate": "Метилацетат", @@ -5351,231 +5358,231 @@ "material.gtceu.molybdenum": "Молібден", "material.gtceu.molybdenum_disilicide": "Дисиліцид молібдену", "material.gtceu.monazite": "Монацит", - "material.gtceu.monochloramine": "Монохлорамін", - "material.gtceu.moscovium": "Московія", + "material.gtceu.monochloramine": "Хлорамін", + "material.gtceu.moscovium": "Московій", "material.gtceu.mutagen": "Мутаген", - "material.gtceu.naphtha": "Нафта", - "material.gtceu.naphthalene": "Нафталін", + "material.gtceu.naphtha": "Лігроїн", + "material.gtceu.naphthalene": "Нафтален", "material.gtceu.naquadah": "Наквада", - "material.gtceu.naquadah_alloy": "Сплав накваду", + "material.gtceu.naquadah_alloy": "Наквадовий сплав", "material.gtceu.naquadria": "Наквадрія", - "material.gtceu.naquadria_solution": "Розчин наквадрію", - "material.gtceu.naquadria_sulfate": "Сульфат наквадрію", - "material.gtceu.naquadria_waste": "Відходи наквадрію", + "material.gtceu.naquadria_solution": "Розчин наквадрії", + "material.gtceu.naquadria_sulfate": "Сульфат наквадрії", + "material.gtceu.naquadria_waste": "Відпрацьована наквадрія", "material.gtceu.natural_gas": "Природний газ", "material.gtceu.neodymium": "Неодим", "material.gtceu.neon": "Неон", "material.gtceu.neptunium": "Нептуній", - "material.gtceu.nether_air": "Повітря Незеру", + "material.gtceu.nether_air": "Незерське повітря", "material.gtceu.nether_quartz": "Незерський кварц", "material.gtceu.nether_star": "Зірка Незеру", "material.gtceu.netherite": "Незерит", "material.gtceu.netherrack": "Незерак", "material.gtceu.neutronium": "Нейтроній", - "material.gtceu.nichrome": "Хромо-нікель", + "material.gtceu.nichrome": "Ніхром", "material.gtceu.nickel": "Нікель", - "material.gtceu.nickel_zinc_ferrite": "Нікель-цинк-феррит", - "material.gtceu.nihonium": "Нігоній", + "material.gtceu.nickel_zinc_ferrite": "Ферит нікелю-цинку", + "material.gtceu.nihonium": "Ніхоній", "material.gtceu.niobium": "Ніобій", - "material.gtceu.niobium_nitride": "Нітрид ніобію", - "material.gtceu.niobium_titanium": "Ніобієвий титан", - "material.gtceu.nitration_mixture": "Суміш нітрування", - "material.gtceu.nitric_acid": "Азотна кислота", - "material.gtceu.nitric_oxide": "Оксид азоту", + "material.gtceu.niobium_nitride": "Нітрит ніобію", + "material.gtceu.niobium_titanium": "Ніобій-титан", + "material.gtceu.nitration_mixture": "Нітратна суміш", + "material.gtceu.nitric_acid": "Нітратна кислота", + "material.gtceu.nitric_oxide": "Монооксид азоту", "material.gtceu.nitrobenzene": "Нітробензен", - "material.gtceu.nitrochlorobenzene": "Нітрохлорбензен", + "material.gtceu.nitrochlorobenzene": "Нітрохлоробензен", "material.gtceu.nitrogen": "Азот", "material.gtceu.nitrogen_dioxide": "Діоксид азоту", - "material.gtceu.nitrosyl_chloride": "Нітрозилхлорид", - "material.gtceu.nitrous_oxide": "Оксид азоту", + "material.gtceu.nitrosyl_chloride": "Хлорид нітрозила", + "material.gtceu.nitrous_oxide": "Оксид азоту (I)", "material.gtceu.nobelium": "Нобелій", "material.gtceu.obsidian": "Обсидіан", "material.gtceu.octane": "Октан", - "material.gtceu.oganesson": "Оганесон", + "material.gtceu.oganesson": "Оґанесон", "material.gtceu.oil": "Нафта", "material.gtceu.oil_heavy": "Важка нафта", "material.gtceu.oil_light": "Легка нафта", "material.gtceu.oil_medium": "Сира нафта", - "material.gtceu.oilsands": "Нафтові піски", + "material.gtceu.oilsands": "Нафтоносні піски", "material.gtceu.olivine": "Олівін", "material.gtceu.opal": "Опал", "material.gtceu.orange_dye": "Помаранчевий барвник", - "material.gtceu.osmiridium": "Осміридій", + "material.gtceu.osmiridium": "Осмиридій", "material.gtceu.osmium": "Осмій", - "material.gtceu.osmium_tetroxide": "Чотириоксид осмію", + "material.gtceu.osmium_tetroxide": "Оксид осмію", "material.gtceu.oxygen": "Кисень", "material.gtceu.palladium": "Паладій", "material.gtceu.palladium_raw": "Необроблений паладій", "material.gtceu.paper": "Папір", "material.gtceu.paracetamol": "Парацетамол", - "material.gtceu.pcb_coolant": "Охолоджувальна рідина друкованої плати", + "material.gtceu.pcb_coolant": "ДП-охолоджуюча рідина", "material.gtceu.pentlandite": "Пентландит", "material.gtceu.perlite": "Перліт", "material.gtceu.phenol": "Фенол", "material.gtceu.phosphate": "Фосфат", - "material.gtceu.phosphoric_acid": "Фосфорна кислота", + "material.gtceu.phosphoric_acid": "Ортофосфатна кислота", "material.gtceu.phosphorus": "Фосфор", - "material.gtceu.phosphorus_pentoxide": "П'ятиоксид фосфору", + "material.gtceu.phosphorus_pentoxide": "Оксид фосфору (V)", "material.gtceu.phthalic_acid": "Фталева кислота", "material.gtceu.pink_dye": "Рожевий барвник", - "material.gtceu.pitchblende": "Уранініт", + "material.gtceu.pitchblende": "Настуран", "material.gtceu.platinum": "Платина", "material.gtceu.platinum_group_sludge": "Шлам платинової групи", - "material.gtceu.platinum_raw": "Платиновий необроблений", - "material.gtceu.platinum_sludge_residue": "Шламовий осад платини", + "material.gtceu.platinum_raw": "Необроблена платина", + "material.gtceu.platinum_sludge_residue": "Залишок платинового шламу", "material.gtceu.plutonium": "Плутоній", "material.gtceu.plutonium_241": "Плутоній 241", - "material.gtceu.pollucite": "Полуцит", + "material.gtceu.pollucite": "Поллуцит", "material.gtceu.polonium": "Полоній", - "material.gtceu.polybenzimidazole": "Полібензімідазол", + "material.gtceu.polybenzimidazole": "Полібензимідазол", "material.gtceu.polycaprolactam": "Полікапролактам", - "material.gtceu.polychlorinated_biphenyl": "Поліхлорований біфеніл", + "material.gtceu.polychlorinated_biphenyl": "Поліхлорований дифеніл", "material.gtceu.polydimethylsiloxane": "Полідиметилсилоксан", "material.gtceu.polyethylene": "Поліетилен", - "material.gtceu.polyphenylene_sulfide": "Поліфеніленсульфід", + "material.gtceu.polyphenylene_sulfide": "Сульфід поліфенілену", "material.gtceu.polytetrafluoroethylene": "Політетрафторетилен", "material.gtceu.polyvinyl_acetate": "Полівінілацетат", - "material.gtceu.polyvinyl_butyral": "Полівінілбутираль", + "material.gtceu.polyvinyl_butyral": "Полівінілбутирал", "material.gtceu.polyvinyl_chloride": "Полівінілхлорид", - "material.gtceu.potash": "Поташ", + "material.gtceu.potash": "Карбонат калію", "material.gtceu.potassium": "Калій", "material.gtceu.potassium_carbonate": "Карбонат калію", "material.gtceu.potassium_cyanide": "Ціанід калію", - "material.gtceu.potassium_dichromate": "Біхромат калію", - "material.gtceu.potassium_feldspar": "Калієвий польовий шпат", - "material.gtceu.potassium_ferrocyanide": "Фероціанід калію", + "material.gtceu.potassium_dichromate": "Дихромат калію", + "material.gtceu.potassium_feldspar": "Пертит", + "material.gtceu.potassium_ferrocyanide": "Гексаціаноферат(II) калію", "material.gtceu.potassium_hydroxide": "Гідроксид калію", "material.gtceu.potassium_iodide": "Йодид калію", "material.gtceu.potassium_sulfate": "Сульфат калію", "material.gtceu.potin": "Потін", - "material.gtceu.powellite": "Поверліт", + "material.gtceu.powellite": "Повеліт", "material.gtceu.praseodymium": "Празеодим", "material.gtceu.promethium": "Прометій", "material.gtceu.propane": "Пропан", "material.gtceu.propene": "Пропен", "material.gtceu.protactinium": "Протактиній", - "material.gtceu.prussian_blue": "Берлі́нська лазур", + "material.gtceu.prussian_blue": "Берлінська лазур", "material.gtceu.purple_dye": "Фіолетовий барвник", "material.gtceu.pyrite": "Пірит", - "material.gtceu.pyrochlore": "Пірохлор", + "material.gtceu.pyrochlore": "Пірохлорид", "material.gtceu.pyrolusite": "Піролюзит", "material.gtceu.pyrope": "Піроп", "material.gtceu.quartz_sand": "Кварцовий пісок", "material.gtceu.quartzite": "Кварцит", - "material.gtceu.quicklime": "Негашене вапно", - "material.gtceu.rad_away": "Rad Away", + "material.gtceu.quicklime": "Оксид кальцію", + "material.gtceu.rad_away": "Антирадин", "material.gtceu.radium": "Радій", "material.gtceu.radon": "Радон", - "material.gtceu.rare_earth": "Рідкоземельні метали", - "material.gtceu.rarest_metal_mixture": "Найрідкісніша металева суміш", + "material.gtceu.rare_earth": "Рідкісноземельний пил", + "material.gtceu.rarest_metal_mixture": "Суміш найрідкісніших металів", "material.gtceu.raw_gasoline": "Сирий бензин", - "material.gtceu.raw_growth_medium": "Сире середовище росту", - "material.gtceu.raw_rubber": "Необроблена гума", - "material.gtceu.raw_styrene_butadiene_rubber": "Необроблений стирол-бутадієн-каучук", + "material.gtceu.raw_growth_medium": "Сире живильне середовище", + "material.gtceu.raw_rubber": "Сира гума", + "material.gtceu.raw_styrene_butadiene_rubber": "Сира бутаден-стирольна гума", "material.gtceu.realgar": "Реальгар", "material.gtceu.red_alloy": "Червоний сплав", - "material.gtceu.red_dye": "Червона фарба", + "material.gtceu.red_dye": "Червоний барвник", "material.gtceu.red_garnet": "Червоний гранат", "material.gtceu.red_steel": "Червона сталь", "material.gtceu.redrock": "Червоний камінь", "material.gtceu.redstone": "Редстоун", - "material.gtceu.refinery_gas": "Газ нафтопереробного заводу", + "material.gtceu.refinery_gas": "Нафтопереробний газ", "material.gtceu.reinforced_epoxy_resin": "Посилена епоксидна смола", "material.gtceu.rhenium": "Реній", "material.gtceu.rhodium": "Родій", - "material.gtceu.rhodium_plated_palladium": "Облицьований родієм паладій", + "material.gtceu.rhodium_plated_palladium": "Паладій з родієвим покриттям", "material.gtceu.rhodium_sulfate": "Сульфат родію", "material.gtceu.rock_salt": "Кам'яна сіль", "material.gtceu.rocket_fuel": "Ракетне паливо", "material.gtceu.roentgenium": "Рентгеній", "material.gtceu.rose_gold": "Рожеве золото", - "material.gtceu.rtm_alloy": "РВМ сплав", + "material.gtceu.rtm_alloy": "RTM-сплав", "material.gtceu.rubber": "Гума", "material.gtceu.rubidium": "Рубідій", "material.gtceu.ruby": "Рубін", "material.gtceu.ruby_slurry": "Рубінова суспензія", - "material.gtceu.ruridit": "Руридит", + "material.gtceu.ruridit": "Рурідіт", "material.gtceu.ruthenium": "Рутеній", - "material.gtceu.ruthenium_tetroxide": "Чотириоксид рутенію", + "material.gtceu.ruthenium_tetroxide": "Оксид рутенію(VIII)", "material.gtceu.ruthenium_trinium_americium_neutronate": "Рутеній триній америцій нейтронат", "material.gtceu.rutherfordium": "Резерфордій", "material.gtceu.rutile": "Рутил", "material.gtceu.salt": "Сіль", - "material.gtceu.salt_water": "Солена вода", + "material.gtceu.salt_water": "Солона вода", "material.gtceu.saltpeter": "Селітра", "material.gtceu.samarium": "Самарій", - "material.gtceu.samarium_iron_arsenic_oxide": "Оксид миш'яку заліза самарію", + "material.gtceu.samarium_iron_arsenic_oxide": "Самарій залізо арсеновий оксід", "material.gtceu.sapphire": "Сапфір", "material.gtceu.sapphire_slurry": "Сапфірова суспензія", "material.gtceu.scandium": "Скандій", - "material.gtceu.scheelite": "Шеліт", + "material.gtceu.scheelite": "Шеєліт", "material.gtceu.sculk": "Скалк", - "material.gtceu.seaborgium": "Сіборгіум", - "material.gtceu.seed_oil": "Олія насіння", + "material.gtceu.seaborgium": "Мореродень", + "material.gtceu.seed_oil": "Рослинна олія", "material.gtceu.selenium": "Селен", - "material.gtceu.severely_hydro_cracked_gas": "Газ сильного водневого крекінгу", - "material.gtceu.severely_hydro_cracked_heavy_fuel": "Важке паливо сильного водневого крекінгу", - "material.gtceu.severely_hydro_cracked_light_fuel": "Легке паливо сильного водневого крекінгу", - "material.gtceu.severely_hydro_cracked_naphtha": "Нафта сильного водневого крекінгу", - "material.gtceu.severely_steam_cracked_gas": "Газ сильного парового крекінгу", - "material.gtceu.severely_steam_cracked_heavy_fuel": "Важке паливо сильного парового крекінгу", - "material.gtceu.severely_steam_cracked_light_fuel": "Легке паливо сильного парового крекінгу", - "material.gtceu.severely_steam_cracked_naphtha": "Нафта сильного парового крекінгу", + "material.gtceu.severely_hydro_cracked_gas": "Сильно-водневокрекінговий газ", + "material.gtceu.severely_hydro_cracked_heavy_fuel": "Сильно-водневокрекінгове важке паливо", + "material.gtceu.severely_hydro_cracked_light_fuel": "Сильно-водневокрекінгове легке паливо", + "material.gtceu.severely_hydro_cracked_naphtha": "Сильно-водневокрекінговий лігроїн", + "material.gtceu.severely_steam_cracked_gas": "Сильно-парокрекінговий газ", + "material.gtceu.severely_steam_cracked_heavy_fuel": "Сильно-парокрекінгове важке паливо", + "material.gtceu.severely_steam_cracked_light_fuel": "Сильно-парокрекінгове легке паливо", + "material.gtceu.severely_steam_cracked_naphtha": "Сильно-парокрекінговий лігроїн", "material.gtceu.silicon": "Кремній", "material.gtceu.silicon_dioxide": "Діоксид кремнію", "material.gtceu.silicone_rubber": "Силіконова гума", "material.gtceu.silver": "Срібло", - "material.gtceu.soapstone": "Мильний камінь", + "material.gtceu.soapstone": "Стеатит", "material.gtceu.soda_ash": "Кальцинована сода", "material.gtceu.sodalite": "Содаліт", "material.gtceu.sodium": "Натрій", - "material.gtceu.sodium_bicarbonate": "Бікарбонат натрію", - "material.gtceu.sodium_bisulfate": "Бісульфат натрію", + "material.gtceu.sodium_bicarbonate": "Гідрокарбонат натрію", + "material.gtceu.sodium_bisulfate": "Гідросульфат натрію", "material.gtceu.sodium_hydroxide": "Гідроксид натрію", "material.gtceu.sodium_nitrite": "Нітрит натрію", - "material.gtceu.sodium_persulfate": "Персульфат натрію", - "material.gtceu.sodium_potassium": "Натрій калій", + "material.gtceu.sodium_persulfate": "Пероксодисульфат натрію", + "material.gtceu.sodium_potassium": "Натрій-калій", "material.gtceu.sodium_sulfide": "Сульфід натрію", - "material.gtceu.soldering_alloy": "Паяльний сплав", - "material.gtceu.spessartine": "Спессартин", + "material.gtceu.soldering_alloy": "Припій", + "material.gtceu.spessartine": "Спесартин", "material.gtceu.sphalerite": "Сфалерит", "material.gtceu.spodumene": "Сподумен", "material.gtceu.stainless_steel": "Нержавійна сталь", - "material.gtceu.steam": "Пар", - "material.gtceu.steam_cracked_butadiene": "Бутадієн парового крекінгу", - "material.gtceu.steam_cracked_butane": "Бутан парового крекінгу", - "material.gtceu.steam_cracked_butene": "Бутен парового крекінгу", - "material.gtceu.steam_cracked_ethane": "Етан парового крекінгу", - "material.gtceu.steam_cracked_ethylene": "Етиловий спирт парового крекінгу", - "material.gtceu.steam_cracked_propane": "Пропан парового крекінгу", - "material.gtceu.steam_cracked_propene": "Пропен парового крекінгу", + "material.gtceu.steam": "Пара", + "material.gtceu.steam_cracked_butadiene": "Парокрекінговий бутадієн", + "material.gtceu.steam_cracked_butane": "Парокрекінговий бутан", + "material.gtceu.steam_cracked_butene": "Парокрекінговий бутен", + "material.gtceu.steam_cracked_ethane": "Парокрекінговий етан", + "material.gtceu.steam_cracked_ethylene": "Парокрекінговий етилен", + "material.gtceu.steam_cracked_propane": "Парокрекінговий пропан", + "material.gtceu.steam_cracked_propene": "Парокрекінговий пропен", "material.gtceu.steel": "Сталь", - "material.gtceu.stellite_100": "Стеліт-100", - "material.gtceu.sterilized_growth_medium": "Стерилізоване середовище росту", - "material.gtceu.sterling_silver": "Стерлінґове срібло", - "material.gtceu.stibnite": "Стибніт", + "material.gtceu.stellite_100": "Стелліт-100", + "material.gtceu.sterilized_growth_medium": "Стерилізоване живильне середовище", + "material.gtceu.sterling_silver": "Стерлінгове срібло", + "material.gtceu.stibnite": "Антимоніт", "material.gtceu.stone": "Камінь", "material.gtceu.strontium": "Стронцій", - "material.gtceu.styrene": "Стирен", - "material.gtceu.styrene_butadiene_rubber": "Стирен-бутадієнова гума", + "material.gtceu.styrene": "Стирол", + "material.gtceu.styrene_butadiene_rubber": "Бутаден-стирольна гума", "material.gtceu.sugar": "Цукор", "material.gtceu.sulfur": "Сірка", "material.gtceu.sulfur_dioxide": "Діоксид сірки", "material.gtceu.sulfur_trioxide": "Триоксид сірки", - "material.gtceu.sulfuric_acid": "Сірчана кислота", - "material.gtceu.sulfuric_copper_solution": "Розчин сірчаної міді", + "material.gtceu.sulfuric_acid": "Сульфатна кислота", + "material.gtceu.sulfuric_copper_solution": "Сульфатний розчин міді", "material.gtceu.sulfuric_gas": "Сірчаний газ", - "material.gtceu.sulfuric_heavy_fuel": "Важке сірчане паливо", - "material.gtceu.sulfuric_light_fuel": "Легке сірчане паливо", - "material.gtceu.sulfuric_naphtha": "Сірчана нафта", - "material.gtceu.sulfuric_nickel_solution": "Розчин сірчаного нікелю", + "material.gtceu.sulfuric_heavy_fuel": "Сірчане важке паливо", + "material.gtceu.sulfuric_light_fuel": "Сірчане легке паливо", + "material.gtceu.sulfuric_naphtha": "Сірчаний лігроїн", + "material.gtceu.sulfuric_nickel_solution": "Сульфатний розчин нікелю", "material.gtceu.talc": "Тальк", "material.gtceu.tantalite": "Танталіт", "material.gtceu.tantalum": "Тантал", "material.gtceu.tantalum_carbide": "Карбід танталу", "material.gtceu.technetium": "Технецій", "material.gtceu.tellurium": "Телур", - "material.gtceu.tennessine": "Тенесин", + "material.gtceu.tennessine": "Теннессин", "material.gtceu.terbium": "Тербій", "material.gtceu.tetrafluoroethylene": "Тетрафторетилен", "material.gtceu.tetrahedrite": "Тетраедрит", @@ -5584,38 +5591,39 @@ "material.gtceu.thorium": "Торій", "material.gtceu.thulium": "Тулій", "material.gtceu.tin": "Олово", - "material.gtceu.tin_alloy": "Сплав олова", + "material.gtceu.tin_alloy": "Олов'яний сплав", "material.gtceu.titanium": "Титан", "material.gtceu.titanium_carbide": "Карбід титану", - "material.gtceu.titanium_tetrachloride": "Четирихлористий титан", - "material.gtceu.titanium_trifluoride": "Трифторид титану", - "material.gtceu.titanium_tungsten_carbide": "Карбід титану вольфраму", - "material.gtceu.toluene": "Толуол", + "material.gtceu.titanium_tetrachloride": "Хлорид титану(IV)", + "material.gtceu.titanium_trifluoride": "Фторид титану(III)", + "material.gtceu.titanium_tungsten_carbide": "Карбід вольфрам-титану", + "material.gtceu.toluene": "Толуен", "material.gtceu.topaz": "Топаз", "material.gtceu.treated_wood": "Оброблена деревина", - "material.gtceu.tricalcium_phosphate": "Трикальційфосфат", - "material.gtceu.trinium": "Тріній", + "material.gtceu.tricalcium_phosphate": "Ортофосфат кальцію", + "material.gtceu.trinium": "Триній", "material.gtceu.trinium_sulfide": "Сульфід тринію", - "material.gtceu.tritanium": "Тритан", + "material.gtceu.tritanium": "Тританій", "material.gtceu.tritium": "Тритій", "material.gtceu.trona": "Трона", + "material.gtceu.tuff": "Туф", "material.gtceu.tungstate": "Вольфрамат", "material.gtceu.tungsten": "Вольфрам", "material.gtceu.tungsten_carbide": "Карбід вольфраму", "material.gtceu.tungsten_steel": "Вольфрамова сталь", "material.gtceu.tungstic_acid": "Вольфрамова кислота", "material.gtceu.ultimet": "Ультимет", - "material.gtceu.uraninite": "Уранініт", + "material.gtceu.uraninite": "Настуран", "material.gtceu.uranium": "Уран", - "material.gtceu.uranium_235": "Уран-235", - "material.gtceu.uranium_hexafluoride": "гексафторид урану", - "material.gtceu.uranium_rhodium_dinaquadide": "динаквадід родію урану", - "material.gtceu.uranium_triplatinum": "Триплатиновий уран", + "material.gtceu.uranium_235": "Уран 235", + "material.gtceu.uranium_hexafluoride": "Гексафторид урану", + "material.gtceu.uranium_rhodium_dinaquadide": "Уран родій динаквадид", + "material.gtceu.uranium_triplatinum": "Уран триплатинум", "material.gtceu.uu_matter": "UU-матерія", - "material.gtceu.uvarovite": "Уваровит", + "material.gtceu.uvarovite": "Уваровіт", "material.gtceu.vanadium": "Ванадій", - "material.gtceu.vanadium_gallium": "Ванадій галій", - "material.gtceu.vanadium_magnetite": "Магнетит ванадію", + "material.gtceu.vanadium_gallium": "Галід ванадію", + "material.gtceu.vanadium_magnetite": "Ванадієвий магнетит", "material.gtceu.vanadium_steel": "Ванадієва сталь", "material.gtceu.vinyl_acetate": "Вінілацетат", "material.gtceu.vinyl_chloride": "Вінілхлорид", @@ -5623,7 +5631,7 @@ "material.gtceu.watertight_steel": "Водонепроникна сталь", "material.gtceu.wax": "Віск", "material.gtceu.wheat": "Пшениця", - "material.gtceu.white_dye": "Біла фарба", + "material.gtceu.white_dye": "Білий барвник", "material.gtceu.wood": "Деревина", "material.gtceu.wood_gas": "Деревний газ", "material.gtceu.wood_tar": "Деревна смола", @@ -5631,246 +5639,330 @@ "material.gtceu.wrought_iron": "Коване залізо", "material.gtceu.wulfenite": "Вульфеніт", "material.gtceu.xenon": "Ксенон", - "material.gtceu.yellow_dye": "Жовта фарба", + "material.gtceu.yellow_dye": "Жовтий барвник", "material.gtceu.yellow_garnet": "Жовтий гранат", - "material.gtceu.yellow_limonite": "Жовтий лимоніт", + "material.gtceu.yellow_limonite": "Лимоніт", "material.gtceu.ytterbium": "Ітербій", "material.gtceu.yttrium": "Ітрій", - "material.gtceu.yttrium_barium_cuprate": "Ітрій-барієвий купрат", + "material.gtceu.yttrium_barium_cuprate": "Ітрій-барієвий купорос", "material.gtceu.zeolite": "Цеоліт", - "material.gtceu.zeron_100": "Зерон-100", + "material.gtceu.zeron_100": "Zeron-100", "material.gtceu.zinc": "Цинк", "material.gtceu.zinc_sulfide": "Сульфід цинку", - "material.gtceu.zincite": "Цинкит", + "material.gtceu.zincite": "Цинкіт", "material.gtceu.zirconium": "Цирконій", - "message.gtceu.new_veins.amount": "Розвідано %d нових жил!", - "message.gtceu.new_veins.name": "Розвідано %d нових жил!", - "metaarmor.energy_share.disable": "Енергопостачання: заряджання ґаджетів УВІМК.", - "metaarmor.energy_share.enable": "Енергопостачання: заряджання ґаджетів ВИМК.", - "metaarmor.energy_share.error": "Енергопостачання: §cНедостатньо потужности для заряджання ґаджетів!", - "metaarmor.energy_share.tooltip": "Режим постачання: %s", - "metaarmor.energy_share.tooltip.guide": "ПКМ тримаючи предмет, щоб змінити режим", + "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.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.potions": "Знешкоджує шкідливі ефекти", "metaarmor.tooltip.speed": "Збільшує швидкість бігу", - "metaarmor.tooltip.stepassist": "Надає допоміжний крок", + "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.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.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.electric_item.tooltip": "%d/%d EU - рівень %s", "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", - "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.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": "§7Леонз — 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.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": "Трикодер", "monitor.gui.title.argb": "ARGB:", "monitor.gui.title.back": "Назад", - "monitor.gui.title.config": "Налаштування", - "monitor.gui.title.plugin": "Плаґін:", + "monitor.gui.title.config": "Конфігурація", + "monitor.gui.title.plugin": "Плагін:", "monitor.gui.title.scale": "Масштаб:", "monitor.gui.title.slot": "Слот:", - "ore.spawnlocation.name": "Інформація про породження руди", - "recipe.capability.eu.name": "Енергія GTCEu", + "ore.spawnlocation.name": "Інформація про генерацію руд", + "recipe.capability.eu.name": "GTCEu Енергія", "recipe.capability.fluid.name": "Рідина", "recipe.capability.item.name": "Предмет", "recipe.condition.adjacent_block.tooltip": "Блоки навколо", - "recipe.condition.adjacent_fluid.tooltip": "Рідкі блоки навколо", + "recipe.condition.adjacent_fluid.tooltip": "Блоки рідин навколо", "recipe.condition.biome.tooltip": "Біом: %s", - "recipe.condition.daytime.day.tooltip": "Для роботи потрібен денний час", + "recipe.condition.daytime.day.tooltip": "Потрібен денний час для роботи", "recipe.condition.daytime.night.tooltip": "Потрібен нічний час для роботи", "recipe.condition.dimension.tooltip": "Вимір: %s", "recipe.condition.dimension_marker.tooltip": "Вимір:", - "recipe.condition.eu_to_start.tooltip": "Початок EU: %d%s", - "recipe.condition.gamestage.locked_stage": "Заблоковано на етапі: %s", - "recipe.condition.gamestage.unlocked_stage": "Розблоковано на етапі: %s", + "recipe.condition.eu_to_start.tooltip": "EU до запуску: %d%s", + "recipe.condition.gamestage.locked_stage": "Заборонено на етапі: %s", + "recipe.condition.gamestage.unlocked_stage": "Дозволено на етапі: %s", "recipe.condition.pos_y.tooltip": "Рівень Y: %d <= Y <= %d", - "recipe.condition.quest.completed.tooltip": "Вимоги %s виконати", - "recipe.condition.quest.not_completed.tooltip": "Вимоги %s не виконано", + "recipe.condition.quest.completed.tooltip": "Потребує виконання «%s»", + "recipe.condition.quest.not_completed.tooltip": "Потребує невиконання «%s»", "recipe.condition.rain.tooltip": "Рівень дощу: %d", - "recipe.condition.steam_vent.tooltip": "Очищує паровий вентиль", + "recipe.condition.steam_vent.tooltip": "Чистий вентиляційний отвір", "recipe.condition.thunder.tooltip": "Рівень грози: %d", - "tagprefix.andesite": "Андезитова руда (%s)", - "tagprefix.basalt": "Базальтова руда (%s)", - "tagprefix.blackstone": "Чорнокам'яна руда (%s)", - "tagprefix.block": "Блок (%s)", + "tagprefix.andesite": "%s (андезитова руда)", + "tagprefix.basalt": "%s (базальтова руда)", + "tagprefix.blackstone": "%s (чорнокам'яна руда)", + "tagprefix.block": "%s (блок)", "tagprefix.bolt": "Болт (%s)", - "tagprefix.buzz_saw_blade": "Лезо пили (%s)", + "tagprefix.buzz_saw_blade": "Лезо електропили (%s)", "tagprefix.cable_gt_double": "2x кабель (%s)", "tagprefix.cable_gt_hex": "16x кабель (%s)", "tagprefix.cable_gt_octal": "8x кабель (%s)", "tagprefix.cable_gt_quadruple": "4x кабель (%s)", "tagprefix.cable_gt_single": "1x кабель (%s)", - "tagprefix.chainsaw_head": "Наконечник ланцюгової пили (%s)", - "tagprefix.chipped_gem": "Щерблений (%s)", - "tagprefix.crushed_ore": "Подрібнена руда (%s)", - "tagprefix.deepslate": "Глибосланцева руда (%s)", - "tagprefix.dense_plate": "Щільна пластина (%s)", - "tagprefix.diorite": "Діоритова руда (%s)", + "tagprefix.chainsaw_head": "Голівка ланцюгової пили (%s)", + "tagprefix.chipped_gem": "Надщерблений кристал (%s)", + "tagprefix.crushed_ore": "%s (подрібнена руда)", + "tagprefix.deepslate": "%s (глибосланцева руда)", + "tagprefix.dense_plate": "%s (міцний лист)", + "tagprefix.diorite": "%s (діоритова руда)", "tagprefix.door": "Двері (%s)", - "tagprefix.double_plate": "Подвійна пластина (%s)", - "tagprefix.drill_head": "Наконечник бура (%s)", - "tagprefix.dust": "Пил (%s)", - "tagprefix.dye": "Барвник (%s)", - "tagprefix.endstone": "Руда Енду (%s)", - "tagprefix.exquisite_gem": "%s вишуканий", + "tagprefix.double_plate": "%s (подвійний лист)", + "tagprefix.drill_head": "Голівка бура (%s)", + "tagprefix.dust": "%s (пил)", + "tagprefix.dye": "Бравник (%s)", + "tagprefix.endstone": "%s (руда Енду)", + "tagprefix.exquisite_gem": "Бездоганний кристал (%s)", "tagprefix.fence": "Паркан (%s)", "tagprefix.fence_gate": "Хвіртка (%s)", - "tagprefix.fine_wire": "Тонкий дріт (%s)", - "tagprefix.flawed_gem": "%s тріснутий", - "tagprefix.flawless_gem": "%s бездоганний", + "tagprefix.fine_wire": "Дрот (%s)", + "tagprefix.flawed_gem": "Огранований кристал (%s)", + "tagprefix.flawless_gem": "Вишуканий кристал (%s)", "tagprefix.foil": "Фольга (%s)", - "tagprefix.frame": "Рама (%s)", + "tagprefix.frame": "Каркас (%s)", "tagprefix.gear": "Шестерня (%s)", "tagprefix.gem": "%s", - "tagprefix.granite": "Гранітна руда (%s)", - "tagprefix.gravel": "Гравійний руда (%s)", - "tagprefix.hot_ingot": "Розпечений злиток (%s)", - "tagprefix.impure_dust": "Забруднена купка (%s)", - "tagprefix.ingot": "Злиток (%s)", + "tagprefix.granite": "%s (гранітова руда)", + "tagprefix.gravel": "%s (гравієва руда)", + "tagprefix.hot_ingot": "%s (розпечений злиток)", + "tagprefix.impure_dust": "%s (неочищений пил)", + "tagprefix.ingot": "%s (злиток)", "tagprefix.lens": "Лінза (%s)", "tagprefix.log": "Колода (%s)", "tagprefix.long_rod": "Довгий стрижень (%s)", - "tagprefix.marble": "Мармурова руда (%s)", - "tagprefix.netherrack": "Незерська руда (%s)", - "tagprefix.nugget": "Самородок (%s)", - "tagprefix.null": "Невідомо (%s)", + "tagprefix.marble": "%s (мармурова руда)", + "tagprefix.netherrack": "%s (незерська руда)", + "tagprefix.nugget": "%s (самородок)", + "tagprefix.null": "%s (невідома форма)", "tagprefix.pipe_huge_fluid": "Величезна рідинна труба (%s)", "tagprefix.pipe_huge_item": "Величезна предметна труба (%s)", "tagprefix.pipe_huge_restrictive": "Величезна обмежувальна предметна труба (%s)", "tagprefix.pipe_large_fluid": "Велика рідинна труба (%s)", "tagprefix.pipe_large_item": "Велика предметна труба (%s)", "tagprefix.pipe_large_restrictive": "Велика обмежувальна предметна труба (%s)", - "tagprefix.pipe_nonuple_fluid": "Непарна рідинна труба (%s)", + "tagprefix.pipe_nonuple_fluid": "Дев'ятикамерна рідинна труба (%s)", "tagprefix.pipe_normal_fluid": "Рідинна труба (%s)", "tagprefix.pipe_normal_item": "Предметна труба (%s)", "tagprefix.pipe_normal_restrictive": "Обмежувальна предметна труба (%s)", - "tagprefix.pipe_quadruple_fluid": "Четверна рідинна труба (%s)", + "tagprefix.pipe_quadruple_fluid": "Чотирикамерна рідинна труба (%s)", "tagprefix.pipe_small_fluid": "Мала рідинна труба (%s)", "tagprefix.pipe_small_item": "Мала предметна труба (%s)", "tagprefix.pipe_small_restrictive": "Мала обмежувальна предметна труба (%s)", "tagprefix.pipe_tiny_fluid": "Крихітна рідинна труба (%s)", "tagprefix.planks": "Дошки (%s)", - "tagprefix.plate": "Пластина (%s)", - "tagprefix.polymer.dense_plate": "Щільний лист (%s)", - "tagprefix.polymer.double_plate": "Подвійний лист (%s)", - "tagprefix.polymer.dust": "Целюлоза (%s)", - "tagprefix.polymer.foil": "Тонкий лист (%s)", - "tagprefix.polymer.ingot": "Злиток (%s)", - "tagprefix.polymer.nugget": "Самородок (%s)", - "tagprefix.polymer.plate": "Лист (%s)", - "tagprefix.polymer.small_dust": "Мала купка целюлози (%s)", - "tagprefix.polymer.tiny_dust": "Крихітна купка целюлози (%s)", - "tagprefix.pure_dust": "Очищений пил (%s)", - "tagprefix.purified_ore": "Очищена руда (%s)", - "tagprefix.raw": "Необроблена руда (%s)", - "tagprefix.raw_ore_block": "Блок необробленої руди (%s)", - "tagprefix.red_granite": "Червона гранітна руда (%s)", - "tagprefix.red_sand": "Червона піщана руда (%s)", - "tagprefix.refined_ore": "Вишукана руда (%s)", + "tagprefix.plate": "%s (лист)", + "tagprefix.polymer.dense_plate": "%s (міцна пластина)", + "tagprefix.polymer.double_plate": "%s (подвійна пластина)", + "tagprefix.polymer.dust": "%s (целюлоза)", + "tagprefix.polymer.foil": "Тонка пластина (%s)", + "tagprefix.polymer.ingot": "%s (злиток)", + "tagprefix.polymer.nugget": "%s (шматок)", + "tagprefix.polymer.plate": "%s (пластина)", + "tagprefix.polymer.small_dust": "%s (дрібна целюлоза)", + "tagprefix.polymer.tiny_dust": "%s (крихта целюлози)", + "tagprefix.pure_dust": "%s (очищений пил)", + "tagprefix.purified_ore": "%s (очищена руда)", + "tagprefix.raw": "%s (необроблена копалина)", + "tagprefix.raw_ore_block": "%s (блок необробленої руди)", + "tagprefix.red_granite": "%s (червоногранітна руда)", + "tagprefix.red_sand": "%s (червонопіщана руда)", + "tagprefix.refined_ore": "%s (рафінована руда)", "tagprefix.ring": "Кільце (%s)", "tagprefix.rock": "%s", "tagprefix.rod": "Стрижень (%s)", "tagprefix.rotor": "Ротор (%s)", "tagprefix.round": "Кулька (%s)", - "tagprefix.sand": "Піщана руда (%s)", + "tagprefix.sand": "%s (піщана руда)", "tagprefix.screw": "Гвинт (%s)", "tagprefix.screwdriver_tip": "Наконечник викрутки (%s)", "tagprefix.slab": "Плита (%s)", - "tagprefix.small_dust": "Мала купка (%s)", + "tagprefix.small_dust": "%s (дрібний пил)", "tagprefix.small_gear": "Мала шестерня (%s)", "tagprefix.small_spring": "Мала пружина (%s)", "tagprefix.spring": "Пружина (%s)", "tagprefix.stairs": "Сходи (%s)", - "tagprefix.stone": "Руда (%s)", - "tagprefix.surface_rock": "Поверхнева порода (%s)", - "tagprefix.tiny_dust": "Крихітна купка (%s)", - "tagprefix.tuff": "Туфова руда (%s)", + "tagprefix.stone": "%s (руда)", + "tagprefix.surface_rock": "%s (поверхневий камінь)", + "tagprefix.tiny_dust": "%s (крихта пилу)", + "tagprefix.tuff": "%s (туфова руда)", "tagprefix.turbine_blade": "Лезо турбіни (%s)", - "tagprefix.wire_cutter_head": "Наконечник кусачок для дротів", + "tagprefix.wire_cutter_head": "Голівка кусачок (%s)", "tagprefix.wire_gt_double": "2x дріт (%s)", "tagprefix.wire_gt_hex": "16x дріт (%s)", "tagprefix.wire_gt_octal": "8x дріт (%s)", "tagprefix.wire_gt_quadruple": "4x дріт (%s)", "tagprefix.wire_gt_single": "1x дріт (%s)", - "tagprefix.wrench_tip": "Наконечник гайкового ключа (%s)", + "tagprefix.wrench_tip": "Голівка гайкового ключа (%s)", "tile.gtceu.brittle_charcoal.name": "Крихке деревне вугілля", - "tile.gtceu.brittle_charcoal.tooltip.0": "Вироблено запалювачем деревного вугілля.", - "tile.gtceu.brittle_charcoal.tooltip.1": "Добувайте це, щоб отримати деревне вугілля.", + "tile.gtceu.brittle_charcoal.tooltip.0": "Виробляється запалювачем вугільної купи.", + "tile.gtceu.brittle_charcoal.tooltip.1": "Зламайте його, щоб отримати деревне вугілля.", "tile.gtceu.foam.name": "Піна", "tile.gtceu.petrified_foam.name": "Скам'яніла піна", "tile.gtceu.reinforced_foam.name": "Посилена піна", - "tile.gtceu.reinforced_stone.name": "Посилений камінь", - "tile.gtceu.seal.name": "Запечатаний блок" + "tile.gtceu.reinforced_stone.name": "Зміцнений камінь", + "tile.gtceu.seal.name": "Герметичний блок", + + "comment": "застарілі рядки", + "behaviour.soft_hammer.idle_after_cycle": "Зупинити машину після завершення циклу роботи", + "block.gtceu.evaporation_plant": "Випарна вежа", + "block.gtceu.stainless_evaporation_casing": "Нержавійний випарний корпус", + "config.gtceu.option.maintenanceTime": "maintenanceTime", + "config.gtceu.option.recipeProgressLowEnergy": "recipeProgressLowEnergy", + "config.gtceu.option.rightToolbar": "rightToolbar", + "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 мВ; Можна заповнити: %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": "Не вдалося перезавантажити генерацію світу. Перевірте консоль на наявність помилок.", + "gtceu.command.worldgen.reload.success": "Генерацію світу успішно перезавантажено з конфігурації.", + "gtceu.command.worldgen.reload.usage": "Використання: /gtceu worldgen reload", + "gtceu.command.worldgen.usage": "Використання: /gtceu worldgen ", + "gtceu.evaporation": "Випаровування", + "gtceu.machine.boiler.info.producing.steam": "§aВироблення %s§a мВ/т", + "gtceu.recipe.amperage": "Сила струму: %s", + "gtceu.universal.disabled": "Спільний доступ конструкції§4 вимкнено", + "gtceu.universal.enabled": "Спільний доступ конструкції§a увімкнено", + "item.gtceu.ancient_gold_coin": "Стародавня золота монета", + "item.gtceu.ancient_gold_coin.tooltip": "§7Можна знайти в стародавніх руїнах", + "item.gtceu.avanced_nanomuscle_chestplate": "Нагрудник вдосконаленого костюма NanoMuscle™", + "item.gtceu.battery.charge_detailed.0": "§a%s/%s EU§7 - рівень %s§7 (§aзалишилось %s/%s %s§7)", + "item.gtceu.battery.charge_detailed.1": "§e%s/%s EU§7 - рівень %s§7 (§aзалишилось %s/%s %s§7)", + "item.gtceu.battery.charge_detailed.2": "§c%s/%s EU§7 - рівень %s§7 (§aзалишилось %s/%s %s§7)", + "item.gtceu.chocolate_coin": "Шоколадна монета", + "item.gtceu.chocolate_coin.tooltip": "§7Загорнута у золото", + "item.gtceu.copper_credit": "Мідна монета", + "item.gtceu.copper_credit.tooltip": "§70.125 монети", + "item.gtceu.credit_casting_mold": "Монетний карб", + "item.gtceu.credit_casting_mold.tooltip": "§7Безпечна форма для карбування монет (Не загубіть її!)", + "item.gtceu.cupronickel_credit": "Мельхіорова монета", + "item.gtceu.cupronickel_credit.tooltip": "§71 монета", + "item.gtceu.doge_coin": "Доге коін", + "item.gtceu.doge_coin.tooltip": "§7тиба кіко монет які багаті гроші такі крипто буласька мені дуже коштовні ого", + "item.gtceu.gold_credit": "Золота монета", + "item.gtceu.gold_credit.tooltip": "§764 монети", + "item.gtceu.long_rod_extruder_mold": "Відтискна форма (довгий стрижень)", + "item.gtceu.naquadah_credit": "Наквадова монета", + "item.gtceu.naquadah_credit.tooltip": "§732768 монет", + "item.gtceu.neutronium_credit": "Нейтронієва монета", + "item.gtceu.neutronium_credit.tooltip": "§7262144 монети", + "item.gtceu.osmium_credit": "Осмієва монета", + "item.gtceu.osmium_credit.tooltip": "§74096 монет", + "item.gtceu.platinum_credit": "Платинова монета", + "item.gtceu.platinum_credit.tooltip": "§7512 монети", + "item.gtceu.silver_credit": "Срібна монета", + "item.gtceu.silver_credit.tooltip": "§78 монет", + "item.gtceu.tungstensteel_fluid_cell": "Вольфрамова сталева комірка (%s)", + "recipe.condition.rock_breaker.tooltip": "Прилеглі розміщені рідини", + "material.gtceu.acidic_bromine_exhaust": "Залишок броматної кислоти", + "material.gtceu.acidic_bromine_solution": "Розчин броматної кислоти", + "material.gtceu.brominated_chlorine_vapor": "Пара бромованого хлору", + "material.gtceu.concentrated_bromine_solution": "Концентрований розчин брому", + "material.gtceu.debrominated_brine": "Дебромована ропа", + "material.gtceu.hot_alkaline_debrominated_brine": "Гаряча лужна дебромована ропа", + "material.gtceu.hot_brine": "Гаряча ропа", + "material.gtceu.hot_chlorinated_brominated_brine": "Гаряча хлорована бромована ропа", + "material.gtceu.hot_debrominated_brine": "Гаряча дебромована ропа", + "material.gtceu.hydrogen_iodide": "Йодоводень", + "material.gtceu.raw_brine": "Неочищена ропа", + "message.gtceu.new_veins": "Виявлено %d нових жил!", + "gtceu.gui.multiblock_item_fluid_voiding.0": "Режим видалення", + "gtceu.gui.multiblock_item_fluid_voiding.1": "§7Видалення§6 предметів§7 та§9 рідин" } From a91ad87f476931682b781ef5856b09dd930825de Mon Sep 17 00:00:00 2001 From: Jurre Groenendijk Date: Fri, 9 Jan 2026 17:10:16 +0100 Subject: [PATCH 07/28] Use Generic Builder pattern for MachineBuilder (#4422) --- docs/content/Modpacks/Changes/v7.5.0.md | 8 + .../api/registry/registrate/GTRegistrate.java | 34 +- .../registry/registrate/MachineBuilder.java | 359 +++++++++----- .../registrate/MultiblockMachineBuilder.java | 436 ++---------------- .../common/data/machines/GTMachineUtils.java | 18 +- .../data/machines/GTResearchMachines.java | 12 +- .../integration/kjs/GregTechKubeJSPlugin.java | 7 +- .../machine/KJSSteamMachineBuilder.java | 4 +- .../machine/KJSTieredMachineBuilder.java | 10 +- .../machine/KJSTieredMultiblockBuilder.java | 2 +- .../machine/KJSWrappingMultiblockBuilder.java | 10 +- 11 files changed, 337 insertions(+), 563 deletions(-) create mode 100644 docs/content/Modpacks/Changes/v7.5.0.md diff --git a/docs/content/Modpacks/Changes/v7.5.0.md b/docs/content/Modpacks/Changes/v7.5.0.md new file mode 100644 index 00000000000..82a929e0018 --- /dev/null +++ b/docs/content/Modpacks/Changes/v7.5.0.md @@ -0,0 +1,8 @@ +--- +title: "Version 7.5.0" +--- + + +# Updating from `7.4.1` to `7.5.0` +## MachineBuilder Generics +We have added a second Generic argument to our (Multiblock)MachineBuilder. This effectively means that anywhere where you used to store a partially finished `MachineBuilder`, you now need to store a `MachineBuilder`. The same holds for `MultiblockMachineBuilder`. 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 63c5578809e..206a0ffaea6 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 @@ -126,34 +126,34 @@ public IGTFluidBuilder createFluid(String name, String langKey, Material materia return fluid(this, material, name, langKey, stillTexture, flowingTexture); } - public MachineBuilder machine(String name, - Function definitionFactory, - Function metaMachine, - BiFunction blockFactory, - BiFunction itemFactory, - TriFunction, BlockPos, BlockState, IMachineBlockEntity> blockEntityFactory) { + public MachineBuilder machine(String name, + Function definitionFactory, + Function metaMachine, + BiFunction blockFactory, + BiFunction itemFactory, + TriFunction, BlockPos, BlockState, IMachineBlockEntity> blockEntityFactory) { return new MachineBuilder<>(this, name, definitionFactory, metaMachine, blockFactory, itemFactory, blockEntityFactory); } - public MachineBuilder machine(String name, - Function metaMachine) { + public MachineBuilder machine(String name, + Function metaMachine) { return new MachineBuilder<>(this, name, MachineDefinition::new, metaMachine, MetaMachineBlock::new, MetaMachineItem::new, MetaMachineBlockEntity::new); } - public MultiblockMachineBuilder multiblock(String name, - Function metaMachine, - BiFunction blockFactory, - BiFunction itemFactory, - TriFunction, BlockPos, BlockState, IMachineBlockEntity> blockEntityFactory) { - return new MultiblockMachineBuilder(this, name, metaMachine, + public MultiblockMachineBuilder multiblock(String name, + Function metaMachine, + BiFunction blockFactory, + BiFunction itemFactory, + TriFunction, BlockPos, BlockState, IMachineBlockEntity> blockEntityFactory) { + return new MultiblockMachineBuilder<>(this, name, metaMachine, blockFactory, itemFactory, blockEntityFactory); } - public MultiblockMachineBuilder multiblock(String name, - Function metaMachine) { - return new MultiblockMachineBuilder(this, name, metaMachine, + public MultiblockMachineBuilder multiblock(String name, + Function metaMachine) { + return new MultiblockMachineBuilder<>(this, name, metaMachine, MetaMachineBlock::new, MetaMachineItem::new, MetaMachineBlockEntity::new); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java index 264938c11bc..b676b92f0cb 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java @@ -63,7 +63,6 @@ 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 lombok.experimental.Tolerate; import org.apache.commons.lang3.ArrayUtils; @@ -84,7 +83,8 @@ @MethodsReturnNonnullByDefault @RemapPrefixForJS("kjs$") @Accessors(chain = true, fluent = true) -public class MachineBuilder extends BuilderBase { +public class MachineBuilder> + extends BuilderBase { protected final GTRegistrate registrate; protected final String name; @@ -93,95 +93,65 @@ public class MachineBuilder extends Builde protected final TriFunction, BlockPos, BlockState, IMachineBlockEntity> blockEntityFactory; protected final Function definition; - @Setter protected Function machine; @Nullable @Getter - @Setter private MachineBuilder.ModelInitializer model = null; @Nullable @Getter - @Setter private NonNullBiConsumer, GTBlockstateProvider> blockModel = null; @Getter protected final Map, @Nullable Comparable> modelProperties = new IdentityHashMap<>(); - @Setter private VoxelShape shape = Shapes.block(); - @Setter private RotationState rotationState = RotationState.NON_Y_AXIS; /** * Whether this machine can be rotated or face upwards. */ - @Setter private boolean allowExtendedFacing = false; - @Setter private boolean hasBER = ConfigHolder.INSTANCE.client.machinesHaveBERsByDefault; - @Setter private boolean renderMultiblockWorldPreview = true; - @Setter private boolean renderMultiblockXEIPreview = true; - @Setter private NonNullUnaryOperator blockProp = p -> p; - @Setter private NonNullUnaryOperator itemProp = p -> p; @Nullable - @Setter private Consumer> blockBuilder; @Nullable - @Setter private Consumer> itemBuilder; - @Setter private NonNullConsumer> onBlockEntityRegister = NonNullConsumer.noop(); @Getter // getter for KJS private @NotNull GTRecipeType @NotNull [] recipeTypes = new GTRecipeType[0]; - @Getter - @Setter // getter for KJS + @Getter // getter for KJS private int tier; - @Setter private Reference2IntMap> recipeOutputLimits = new Reference2IntOpenHashMap<>(); - @Setter private int paintingColor = ConfigHolder.INSTANCE.client.getDefaultPaintingColor(); - @Setter private BiFunction itemColor = ((itemStack, tintIndex) -> tintIndex == 2 ? GTValues.VC[tier] : tintIndex == 1 ? paintingColor : -1); private PartAbility[] abilities = new PartAbility[0]; private final List tooltips = new ArrayList<>(); @Nullable - @Setter private BiConsumer> tooltipBuilder; private RecipeModifier recipeModifier = new RecipeModifierList(GTRecipeModifiers.OC_NON_PERFECT); - @Setter private boolean alwaysTryModifyRecipe; @NotNull @Getter - @Setter private BiPredicate beforeWorking = (machine, recipe) -> true; @NotNull @Getter - @Setter private Predicate onWorking = (machine) -> true; @NotNull @Getter - @Setter private Consumer onWaiting = (machine) -> {}; @NotNull @Getter - @Setter private Consumer afterWorking = (machine) -> {}; @Getter - @Setter private boolean regressWhenWaiting = true; - - @Setter private boolean allowCoverOnFront = false; - @Setter private Supplier appearance; @Getter // getter for KJS - @Setter @Nullable private EditableMachineUI editableUI; @Getter // getter for KJS - @Setter @Nullable private String langValue = null; @@ -201,21 +171,166 @@ public MachineBuilder(GTRegistrate registrate, String name, this.definition = definition; } - public MachineBuilder recipeType(GTRecipeType type) { + @SuppressWarnings("unchecked") + public TYPE getThis() { + return (TYPE) this; + } + + public TYPE machine(Function machine) { + this.machine = machine; + return getThis(); + } + + public TYPE blockModel(NonNullBiConsumer, GTBlockstateProvider> blockModel) { + this.blockModel = blockModel; + return getThis(); + } + + public TYPE shape(VoxelShape shape) { + this.shape = shape; + return getThis(); + } + + public TYPE rotationState(RotationState rotationState) { + this.rotationState = rotationState; + return getThis(); + } + + public TYPE allowExtendedFacing(boolean allowExtendedFacing) { + this.allowExtendedFacing = allowExtendedFacing; + return getThis(); + } + + public TYPE hasBER(boolean hasBER) { + this.hasBER = hasBER; + return getThis(); + } + + public TYPE renderMultiblockWorldPreview(boolean renderMultiblockWorldPreview) { + this.renderMultiblockWorldPreview = renderMultiblockWorldPreview; + return getThis(); + } + + public TYPE renderMultiblockXEIPreview(boolean renderMultiblockXEIPreview) { + this.renderMultiblockXEIPreview = renderMultiblockXEIPreview; + return getThis(); + } + + public TYPE blockProp(NonNullUnaryOperator blockProp) { + this.blockProp = blockProp; + return getThis(); + } + + public TYPE itemProp(NonNullUnaryOperator itemProp) { + this.itemProp = itemProp; + return getThis(); + } + + public TYPE blockBuilder(Consumer> blockBuilder) { + this.blockBuilder = blockBuilder; + return getThis(); + } + + public TYPE itemBuilder(Consumer> itemBuilder) { + this.itemBuilder = itemBuilder; + return getThis(); + } + + public TYPE onBlockEntityRegister(NonNullConsumer> onBlockEntityRegister) { + this.onBlockEntityRegister = onBlockEntityRegister; + return getThis(); + } + + public TYPE tier(int tier) { + this.tier = tier; + return getThis(); + } + + public TYPE recipeOutputLimits(Reference2IntMap> recipeOutputLimits) { + this.recipeOutputLimits = recipeOutputLimits; + return getThis(); + } + + public TYPE paintingColor(int paintingColor) { + this.paintingColor = paintingColor; + return getThis(); + } + + public TYPE itemColor(BiFunction itemColor) { + this.itemColor = itemColor; + return getThis(); + } + + public TYPE tooltipBuilder(BiConsumer> tooltipBuilder) { + this.tooltipBuilder = tooltipBuilder; + return getThis(); + } + + public TYPE alwaysTryModifyRecipe(boolean alwaysTryModifyRecipe) { + this.alwaysTryModifyRecipe = alwaysTryModifyRecipe; + return getThis(); + } + + public TYPE beforeWorking(BiPredicate beforeWorking) { + this.beforeWorking = beforeWorking; + return getThis(); + } + + public TYPE onWorking(Predicate onWorking) { + this.onWorking = onWorking; + return getThis(); + } + + public TYPE onWaiting(Consumer onWaiting) { + this.onWaiting = onWaiting; + return getThis(); + } + + public TYPE afterWorking(Consumer afterWorking) { + this.afterWorking = afterWorking; + return getThis(); + } + + public TYPE regressWhenWaiting(boolean regressWhenWaiting) { + this.regressWhenWaiting = regressWhenWaiting; + return getThis(); + } + + public TYPE allowCoverOnFront(boolean allowCoverOnFront) { + this.allowCoverOnFront = allowCoverOnFront; + return getThis(); + } + + public TYPE appearance(Supplier appearance) { + this.appearance = appearance; + return getThis(); + } + + public TYPE editableUI(EditableMachineUI editableUI) { + this.editableUI = editableUI; + return getThis(); + } + + public TYPE langValue(String langValue) { + this.langValue = langValue; + return getThis(); + } + + public TYPE recipeType(GTRecipeType type) { // noinspection ConstantValue if (type == null) { GTCEu.LOGGER.error( "Tried to set null recipe type on machine {}. Did you create the recipe type before this machine?", this.id); - return this; + return getThis(); } this.recipeTypes = ArrayUtils.add(this.recipeTypes, type); initRecipeMachineModelProperties(type); - return this; + return getThis(); } @Tolerate - public MachineBuilder recipeTypes(GTRecipeType... types) { + public TYPE recipeTypes(GTRecipeType... types) { List typeList = new ArrayList<>(); Collections.addAll(typeList, this.recipeTypes); @@ -231,7 +346,7 @@ public MachineBuilder recipeTypes(GTRecipeType... types) { } } this.recipeTypes = typeList.toArray(GTRecipeType[]::new); - return this; + return getThis(); } protected void initRecipeMachineModelProperties(GTRecipeType type) { @@ -243,34 +358,39 @@ protected void initRecipeMachineModelProperties(GTRecipeType type) { } } - public MachineBuilder simpleModel(ResourceLocation modelName) { + public TYPE model(MachineBuilder.ModelInitializer model) { + this.model = model; + return getThis(); + } + + public TYPE simpleModel(ResourceLocation modelName) { return model(createBasicMachineModel(modelName)); } - public MachineBuilder defaultModel() { + public TYPE defaultModel() { return simpleModel(new ResourceLocation(registrate.getModid(), "block/machine/template/" + name)); } - public MachineBuilder tieredHullModel(ResourceLocation model) { + public TYPE tieredHullModel(ResourceLocation model) { return model(createTieredHullMachineModel(model)); } - public MachineBuilder overlayTieredHullModel(String name) { + public TYPE overlayTieredHullModel(String name) { modelProperty(GTMachineModelProperties.IS_FORMED, false); return overlayTieredHullModel(new ResourceLocation(registrate.getModid(), "block/machine/part/" + name)); } - public MachineBuilder overlayTieredHullModel(ResourceLocation overlayModel) { + public TYPE overlayTieredHullModel(ResourceLocation overlayModel) { return model(createOverlayTieredHullMachineModel(overlayModel)); } - public MachineBuilder colorOverlayTieredHullModel(String overlay) { + public TYPE colorOverlayTieredHullModel(String overlay) { return colorOverlayTieredHullModel(overlay, null, null); } - public MachineBuilder colorOverlayTieredHullModel(String overlay, - @Nullable String pipeOverlay, - @Nullable String emissiveOverlay) { + public TYPE colorOverlayTieredHullModel(String overlay, + @Nullable String pipeOverlay, + @Nullable String emissiveOverlay) { modelProperty(GTMachineModelProperties.IS_FORMED, false); ResourceLocation overlayTex = new ResourceLocation(registrate.getModid(), "block/overlay/machine/" + overlay); ResourceLocation pipeOverlayTex = pipeOverlay == null ? null : @@ -280,35 +400,35 @@ public MachineBuilder colorOverlayTieredHullModel(String overlay, return colorOverlayTieredHullModel(overlayTex, pipeOverlayTex, emissiveOverlayTex); } - public MachineBuilder colorOverlayTieredHullModel(ResourceLocation overlay) { + public TYPE colorOverlayTieredHullModel(ResourceLocation overlay) { modelProperty(GTMachineModelProperties.IS_FORMED, false); return colorOverlayTieredHullModel(overlay, null, null); } - public MachineBuilder colorOverlayTieredHullModel(ResourceLocation overlay, - @Nullable ResourceLocation pipeOverlay, - @Nullable ResourceLocation emissiveOverlay) { + public TYPE colorOverlayTieredHullModel(ResourceLocation overlay, + @Nullable ResourceLocation pipeOverlay, + @Nullable ResourceLocation emissiveOverlay) { modelProperty(GTMachineModelProperties.IS_PAINTED, false); return model(createColorOverlayTieredHullMachineModel(overlay, pipeOverlay, emissiveOverlay)); } - public MachineBuilder overlaySteamHullModel(String name) { + public TYPE overlaySteamHullModel(String name) { modelProperty(GTMachineModelProperties.IS_FORMED, false); return overlaySteamHullModel(new ResourceLocation(registrate.getModid(), "block/machine/part/" + name)); } - public MachineBuilder overlaySteamHullModel(ResourceLocation overlayModel) { + public TYPE overlaySteamHullModel(ResourceLocation overlayModel) { modelProperty(GTMachineModelProperties.IS_STEEL_MACHINE, ConfigHolder.INSTANCE.machines.steelSteamMultiblocks); return model(createOverlaySteamHullMachineModel(overlayModel)); } - public MachineBuilder colorOverlaySteamHullModel(String overlay) { + public TYPE colorOverlaySteamHullModel(String overlay) { return colorOverlaySteamHullModel(overlay, (String) null, null); } - public MachineBuilder colorOverlaySteamHullModel(String overlay, - @Nullable String pipeOverlay, - @Nullable String emissiveOverlay) { + public TYPE colorOverlaySteamHullModel(String overlay, + @Nullable String pipeOverlay, + @Nullable String emissiveOverlay) { modelProperty(GTMachineModelProperties.IS_FORMED, false); ResourceLocation overlayTex = new ResourceLocation(registrate.getModid(), "block/overlay/machine/" + overlay); ResourceLocation pipeOverlayTex = pipeOverlay == null ? null : @@ -318,9 +438,9 @@ public MachineBuilder colorOverlaySteamHullModel(String overlay, return colorOverlaySteamHullModel(overlayTex, pipeOverlayTex, emissiveOverlayTex); } - public MachineBuilder colorOverlaySteamHullModel(String overlay, - @Nullable ResourceLocation pipeOverlay, - @Nullable String emissiveOverlay) { + public TYPE colorOverlaySteamHullModel(String overlay, + @Nullable ResourceLocation pipeOverlay, + @Nullable String emissiveOverlay) { modelProperty(GTMachineModelProperties.IS_FORMED, false); ResourceLocation overlayTex = new ResourceLocation(registrate.getModid(), "block/overlay/machine/" + overlay); ResourceLocation pipeOverlayTex = pipeOverlay == null ? null : @@ -330,169 +450,169 @@ public MachineBuilder colorOverlaySteamHullModel(String overlay, return colorOverlaySteamHullModel(overlayTex, pipeOverlayTex, emissiveOverlayTex); } - public MachineBuilder colorOverlaySteamHullModel(ResourceLocation overlay) { + public TYPE colorOverlaySteamHullModel(ResourceLocation overlay) { return colorOverlaySteamHullModel(overlay, null, null); } - public MachineBuilder colorOverlaySteamHullModel(ResourceLocation overlay, - @Nullable ResourceLocation pipeOverlay, - @Nullable ResourceLocation emissiveOverlay) { + public TYPE colorOverlaySteamHullModel(ResourceLocation overlay, + @Nullable ResourceLocation pipeOverlay, + @Nullable ResourceLocation emissiveOverlay) { modelProperty(GTMachineModelProperties.IS_PAINTED, false); return model(createColorOverlaySteamHullMachineModel(overlay, pipeOverlay, emissiveOverlay)); } - public MachineBuilder workableTieredHullModel(ResourceLocation workableModel) { + public TYPE workableTieredHullModel(ResourceLocation workableModel) { modelProperty(GTMachineModelProperties.RECIPE_LOGIC_STATUS, RecipeLogic.Status.IDLE); return model(createWorkableTieredHullMachineModel(workableModel)); } - public MachineBuilder simpleGeneratorModel(ResourceLocation workableModel) { + public TYPE simpleGeneratorModel(ResourceLocation workableModel) { modelProperty(GTMachineModelProperties.RECIPE_LOGIC_STATUS, RecipeLogic.Status.IDLE); return model(createSimpleGeneratorModel(workableModel)); } - public MachineBuilder workableSteamHullModel(boolean isHighPressure, ResourceLocation workableModel) { + public TYPE workableSteamHullModel(boolean isHighPressure, ResourceLocation workableModel) { modelProperty(GTMachineModelProperties.RECIPE_LOGIC_STATUS, RecipeLogic.Status.IDLE); return model(createWorkableSteamHullMachineModel(isHighPressure, workableModel)); } - public MachineBuilder workableCasingModel(ResourceLocation baseCasing, ResourceLocation workableModel) { + public TYPE workableCasingModel(ResourceLocation baseCasing, ResourceLocation workableModel) { modelProperty(GTMachineModelProperties.RECIPE_LOGIC_STATUS, RecipeLogic.Status.IDLE); return model(createWorkableCasingMachineModel(baseCasing, workableModel)); } - public MachineBuilder sidedOverlayCasingModel(ResourceLocation baseCasing, - ResourceLocation workableModel) { + public TYPE sidedOverlayCasingModel(ResourceLocation baseCasing, + ResourceLocation workableModel) { return model(createSidedOverlayCasingMachineModel(baseCasing, workableModel)); } - public MachineBuilder sidedWorkableCasingModel(ResourceLocation baseCasing, - ResourceLocation workableModel) { + public TYPE sidedWorkableCasingModel(ResourceLocation baseCasing, + ResourceLocation workableModel) { modelProperty(GTMachineModelProperties.RECIPE_LOGIC_STATUS, RecipeLogic.Status.IDLE); return model(createSidedWorkableCasingMachineModel(baseCasing, workableModel)); } - public MachineBuilder appearanceBlock(Supplier block) { + public TYPE appearanceBlock(Supplier block) { appearance = () -> block.get().defaultBlockState(); - return this; + return getThis(); } - public MachineBuilder tooltips(@Nullable Component... components) { + public TYPE tooltips(@Nullable Component... components) { return tooltips(Arrays.asList(components)); } - public MachineBuilder tooltips(List components) { + public TYPE tooltips(List components) { tooltips.addAll(components.stream().filter(Objects::nonNull).toList()); - return this; + return getThis(); } - public MachineBuilder conditionalTooltip(Component component, BooleanSupplier condition) { + public TYPE conditionalTooltip(Component component, BooleanSupplier condition) { return conditionalTooltip(component, condition.getAsBoolean()); } - public MachineBuilder conditionalTooltip(Component component, boolean condition) { + public TYPE conditionalTooltip(Component component, boolean condition) { if (condition) tooltips.add(component); - return this; + return getThis(); } - public MachineBuilder abilities(PartAbility... abilities) { + public TYPE abilities(PartAbility... abilities) { this.abilities = abilities; - return this; + return getThis(); } - public MachineBuilder modelProperty(Property property) { + public TYPE modelProperty(Property property) { return modelProperty(property, null); } - public > MachineBuilder modelProperty(Property property, - @Nullable T defaultValue) { + public > TYPE modelProperty(Property property, + @Nullable T defaultValue) { this.modelProperties.put(property, defaultValue); - return this; + return getThis(); } // KJS helpers for model property defaults // These don't need to be copied to the multiblock builder because KJS doesn't care about the return type downgrade - public MachineBuilder kjs$modelPropertyBool(Property property, boolean defaultValue) { + public TYPE kjs$modelPropertyBool(Property property, boolean defaultValue) { return modelProperty(property, defaultValue); } - public MachineBuilder kjs$modelPropertyInt(Property property, int defaultValue) { + public TYPE kjs$modelPropertyInt(Property property, int defaultValue) { return modelProperty(property, defaultValue); } - public & Comparable> MachineBuilder kjs$modelPropertyEnum(Property property, - T defaultValue) { + public & Comparable> TYPE kjs$modelPropertyEnum(Property property, + T defaultValue) { return modelProperty(property, defaultValue); } @Tolerate - public MachineBuilder modelProperties(Property... properties) { + public TYPE modelProperties(Property... properties) { return this.modelProperties(List.of(properties)); } @Tolerate - public MachineBuilder modelProperties(Collection> properties) { + public TYPE modelProperties(Collection> properties) { for (Property prop : properties) { this.modelProperties.put(prop, null); } - return this; + return getThis(); } @Tolerate - public MachineBuilder modelProperties(Map, ? extends Comparable> properties) { + public TYPE modelProperties(Map, ? extends Comparable> properties) { this.modelProperties.putAll(properties); - return this; + return getThis(); } - public MachineBuilder removeModelProperty(Property property) { + public TYPE removeModelProperty(Property property) { this.modelProperties.remove(property); - return this; + return getThis(); } - public MachineBuilder clearModelProperties() { + public TYPE clearModelProperties() { this.modelProperties.clear(); - return this; + return getThis(); } - public MachineBuilder recipeModifier(RecipeModifier recipeModifier) { + public TYPE recipeModifier(RecipeModifier recipeModifier) { this.recipeModifier = recipeModifier instanceof RecipeModifierList list ? list : new RecipeModifierList(recipeModifier); - return this; + return getThis(); } - public MachineBuilder recipeModifier(RecipeModifier recipeModifier, boolean alwaysTryModifyRecipe) { + public TYPE recipeModifier(RecipeModifier recipeModifier, boolean alwaysTryModifyRecipe) { this.alwaysTryModifyRecipe = alwaysTryModifyRecipe; return this.recipeModifier(recipeModifier); } - public MachineBuilder recipeModifiers(RecipeModifier... recipeModifiers) { + public TYPE recipeModifiers(RecipeModifier... recipeModifiers) { this.recipeModifier = new RecipeModifierList(recipeModifiers); - return this; + return getThis(); } - public MachineBuilder recipeModifiers(boolean alwaysTryModifyRecipe, - RecipeModifier... recipeModifiers) { + public TYPE recipeModifiers(boolean alwaysTryModifyRecipe, + RecipeModifier... recipeModifiers) { return this.recipeModifier(new RecipeModifierList(recipeModifiers), alwaysTryModifyRecipe); } - public MachineBuilder noRecipeModifier() { + public TYPE noRecipeModifier() { this.recipeModifier = new RecipeModifierList(RecipeModifier.NO_MODIFIER); this.alwaysTryModifyRecipe = false; - return this; + return getThis(); } - public MachineBuilder addOutputLimit(RecipeCapability capability, int limit) { + public TYPE addOutputLimit(RecipeCapability capability, int limit) { this.recipeOutputLimits.put(capability, limit); - return this; + return getThis(); } - public MachineBuilder multiblockPreviewRenderer(boolean multiBlockWorldPreview, - boolean multiBlockXEIPreview) { + public TYPE multiblockPreviewRenderer(boolean multiBlockWorldPreview, + boolean multiBlockXEIPreview) { this.renderMultiblockWorldPreview = multiBlockWorldPreview; this.renderMultiblockXEIPreview = multiBlockXEIPreview; - return this; + return getThis(); } protected DEFINITION createDefinition() { @@ -539,7 +659,7 @@ public DEFINITION register() { if (model == null && blockModel == null) { simpleModel(new ResourceLocation(registrate.getModid(), "block/machine/template/" + name)); } - var blockBuilder = BlockBuilderWrapper.makeBlockBuilder(this, definition); + var blockBuilder = BlockBuilderWrapper.makeBlockBuilder(getThis(), definition); if (this.langValue != null) { blockBuilder.lang(langValue); definition.setLangValue(langValue); @@ -549,7 +669,7 @@ public DEFINITION register() { } var block = blockBuilder.register(); - var itemBuilder = ItemBuilderWrapper.makeItemBuilder(this, block); + var itemBuilder = ItemBuilderWrapper.makeItemBuilder(getThis(), block); if (this.itemBuilder != null) { this.itemBuilder.accept(itemBuilder); } @@ -646,7 +766,7 @@ default ModelInitializer compose(UnaryOperator BlockBuilder> makeBlockBuilder(MachineBuilder builder, + public static BlockBuilder> makeBlockBuilder(MachineBuilder builder, DEFINITION definition) { return builder.registrate.block(properties -> makeBlock(builder, definition, properties)) .color(() -> () -> IMachineBlock::colorTinted) @@ -658,7 +778,7 @@ protected static class BlockBuilderWrapper { .onRegister(b -> Arrays.stream(builder.abilities).forEach(a -> a.register(builder.tier, b))); } - private static Block makeBlock(MachineBuilder builder, DEFINITION definition, + private static Block makeBlock(MachineBuilder builder, DEFINITION definition, BlockBehaviour.Properties properties) { MachineDefinition.setBuilt(definition); var b = builder.blockFactory.apply(properties, definition); @@ -669,7 +789,7 @@ private static Block makeBlock(MachineBui protected static class ItemBuilderWrapper { - public static ItemBuilder> makeItemBuilder(MachineBuilder builder, + public static ItemBuilder> makeItemBuilder(MachineBuilder builder, BlockEntry block) { return builder.registrate .item(properties -> builder.itemFactory.apply((IMachineBlock) block.get(), properties)) @@ -688,7 +808,8 @@ protected static class ItemBuilderWrapper { protected static final class KJSCallWrapper { public static void generateAssetJsons(@Nullable AssetJsonGenerator generator, - MachineBuilder builder, D definition) { + MachineBuilder builder, + D definition) { if (builder.model() == null && builder.blockModel() == null) return; final ResourceLocation id = definition.getId(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MultiblockMachineBuilder.java b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MultiblockMachineBuilder.java index e7ff7419d08..f7fd023ef5d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MultiblockMachineBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MultiblockMachineBuilder.java @@ -1,57 +1,33 @@ package com.gregtechceu.gtceu.api.registry.registrate; import com.gregtechceu.gtceu.api.block.IMachineBlock; -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.IMachineBlockEntity; -import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; -import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; -import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.pattern.BlockPattern; import com.gregtechceu.gtceu.api.pattern.MultiblockShapeInfo; -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.api.registry.registrate.provider.GTBlockstateProvider; import com.gregtechceu.gtceu.utils.memoization.GTMemoizer; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ItemLike; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.properties.Property; -import net.minecraft.world.phys.shapes.VoxelShape; -import com.tterrag.registrate.builders.BlockBuilder; -import com.tterrag.registrate.builders.ItemBuilder; -import com.tterrag.registrate.providers.DataGenContext; -import com.tterrag.registrate.util.nullness.NonNullBiConsumer; -import com.tterrag.registrate.util.nullness.NonNullConsumer; -import com.tterrag.registrate.util.nullness.NonNullUnaryOperator; import dev.latvian.mods.rhino.util.HideFromJS; -import it.unimi.dsi.fastutil.objects.Reference2IntMap; import lombok.Getter; -import lombok.Setter; import lombok.experimental.Accessors; import lombok.experimental.Tolerate; import org.apache.commons.lang3.function.TriFunction; -import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.function.*; @@ -61,33 +37,29 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault @Accessors(chain = true, fluent = true) -public class MultiblockMachineBuilder extends MachineBuilder { +public class MultiblockMachineBuilder> extends MachineBuilder { - @Setter private boolean generator; - @Setter private Function pattern; private final List>> shapeInfos = new ArrayList<>(); /** * Set this to false only if your multiblock is set up such that it could have a wall-shared controller. */ - @Setter private boolean allowFlip = true; private final List> recoveryItems = new ArrayList<>(); - @Setter private Function> partSorter = (c) -> (a, b) -> 0; - @Setter private TriFunction partAppearance; @Getter - @Setter private BiConsumer> additionalDisplay = (m, l) -> {}; public MultiblockMachineBuilder(GTRegistrate registrate, String name, Function metaMachine, - BiFunction blockFactory, + BiFunction blockFactory, BiFunction itemFactory, TriFunction, BlockPos, BlockState, IMachineBlockEntity> blockEntityFactory) { - super(registrate, name, MultiblockMachineDefinition::new, metaMachine::apply, blockFactory, + super(registrate, name, (loc -> (DEFINITION) new MultiblockMachineDefinition(loc)), metaMachine::apply, + blockFactory, itemFactory, blockEntityFactory); allowExtendedFacing(true); allowCoverOnFront(true); @@ -95,396 +67,66 @@ public MultiblockMachineBuilder(GTRegistrate registrate, String name, modelProperty(GTMachineModelProperties.IS_FORMED, false); } - public MultiblockMachineBuilder shapeInfo(Function shape) { - this.shapeInfos.add(d -> List.of(shape.apply(d))); - return this; - } - - public MultiblockMachineBuilder shapeInfos(Function> shapes) { - this.shapeInfos.add(shapes); - return this; - } - - public MultiblockMachineBuilder recoveryItems(Supplier items) { - this.recoveryItems.add(() -> Arrays.stream(items.get()).map(ItemLike::asItem).map(Item::getDefaultInstance) - .toArray(ItemStack[]::new)); - return this; - } - - public MultiblockMachineBuilder recoveryStacks(Supplier stacks) { - this.recoveryItems.add(stacks); - return this; - } - - @Override - public MultiblockMachineBuilder machine(Function metaMachine) { - return (MultiblockMachineBuilder) super.machine(metaMachine); - } - - @Override - public MultiblockMachineBuilder model(@Nullable MachineBuilder.ModelInitializer model) { - return (MultiblockMachineBuilder) super.model(model); - } - - @Override - public MultiblockMachineBuilder blockModel(@Nullable NonNullBiConsumer, GTBlockstateProvider> blockModel) { - return (MultiblockMachineBuilder) super.blockModel(blockModel); - } - - @Override - public MultiblockMachineBuilder shape(VoxelShape shape) { - return (MultiblockMachineBuilder) super.shape(shape); - } - - @Override - public MultiblockMachineBuilder multiblockPreviewRenderer(boolean multiBlockWorldPreview, - boolean multiBlockXEIPreview) { - return (MultiblockMachineBuilder) super.multiblockPreviewRenderer(multiBlockWorldPreview, multiBlockXEIPreview); - } - - @Override - public MultiblockMachineBuilder rotationState(RotationState rotationState) { - return (MultiblockMachineBuilder) super.rotationState(rotationState); - } - - @Override - public MultiblockMachineBuilder hasBER(boolean hasBER) { - return (MultiblockMachineBuilder) super.hasBER(hasBER); - } - - @Override - public MultiblockMachineBuilder blockProp(NonNullUnaryOperator blockProp) { - return (MultiblockMachineBuilder) super.blockProp(blockProp); - } - - @Override - public MultiblockMachineBuilder itemProp(NonNullUnaryOperator itemProp) { - return (MultiblockMachineBuilder) super.itemProp(itemProp); - } - - @Override - public MultiblockMachineBuilder blockBuilder(Consumer> blockBuilder) { - return (MultiblockMachineBuilder) super.blockBuilder(blockBuilder); - } - - @Override - public MultiblockMachineBuilder itemBuilder(Consumer> itemBuilder) { - return (MultiblockMachineBuilder) super.itemBuilder(itemBuilder); - } - - @Override - public MultiblockMachineBuilder recipeTypes(GTRecipeType... recipeTypes) { - return (MultiblockMachineBuilder) super.recipeTypes(recipeTypes); - } - - @Override - public MultiblockMachineBuilder recipeType(GTRecipeType recipeTypes) { - return (MultiblockMachineBuilder) super.recipeType(recipeTypes); - } - - @Override - public MultiblockMachineBuilder tier(int tier) { - return (MultiblockMachineBuilder) super.tier(tier); - } - - public MultiblockMachineBuilder recipeOutputLimits(Reference2IntMap> map) { - return (MultiblockMachineBuilder) super.recipeOutputLimits(map); - } - - @Override - public MultiblockMachineBuilder addOutputLimit(RecipeCapability capability, int limit) { - return (MultiblockMachineBuilder) super.addOutputLimit(capability, limit); - } - - @Override - public MultiblockMachineBuilder itemColor(BiFunction itemColor) { - return (MultiblockMachineBuilder) super.itemColor(itemColor); - } - - @Override - public MultiblockMachineBuilder simpleModel(ResourceLocation model) { - return (MultiblockMachineBuilder) super.simpleModel(model); - } - - @Override - public MultiblockMachineBuilder defaultModel() { - return (MultiblockMachineBuilder) super.defaultModel(); - } - - @Override - public MultiblockMachineBuilder tieredHullModel(ResourceLocation model) { - return (MultiblockMachineBuilder) super.tieredHullModel(model); - } - - @Override - public MultiblockMachineBuilder overlayTieredHullModel(String name) { - return (MultiblockMachineBuilder) super.overlayTieredHullModel(name); - } - - @Override - public MultiblockMachineBuilder overlayTieredHullModel(ResourceLocation overlayModel) { - return (MultiblockMachineBuilder) super.overlayTieredHullModel(overlayModel); - } - - @Override - public MultiblockMachineBuilder colorOverlayTieredHullModel(String overlay) { - return (MultiblockMachineBuilder) super.colorOverlayTieredHullModel(overlay); - } - - @Override - public MultiblockMachineBuilder colorOverlayTieredHullModel(String overlay, - @Nullable String pipeOverlay, - @Nullable String emissiveOverlay) { - return (MultiblockMachineBuilder) super.colorOverlayTieredHullModel(overlay, pipeOverlay, emissiveOverlay); - } - - @Override - public MultiblockMachineBuilder colorOverlayTieredHullModel(ResourceLocation overlay) { - return (MultiblockMachineBuilder) super.colorOverlayTieredHullModel(overlay); - } - - @Override - public MultiblockMachineBuilder colorOverlayTieredHullModel(ResourceLocation overlay, - @Nullable ResourceLocation pipeOverlay, - @Nullable ResourceLocation emissiveOverlay) { - return (MultiblockMachineBuilder) super.colorOverlayTieredHullModel(overlay, pipeOverlay, emissiveOverlay); - } - - @Override - public MultiblockMachineBuilder workableTieredHullModel(ResourceLocation workableModel) { - return (MultiblockMachineBuilder) super.workableTieredHullModel(workableModel); - } - - @Override - public MultiblockMachineBuilder simpleGeneratorModel(ResourceLocation workableModel) { - return (MultiblockMachineBuilder) super.simpleGeneratorModel(workableModel); - } - - @Override - public MultiblockMachineBuilder workableCasingModel(ResourceLocation baseCasing, ResourceLocation overlayModel) { - return (MultiblockMachineBuilder) super.workableCasingModel(baseCasing, overlayModel); - } - - @Override - public MultiblockMachineBuilder sidedOverlayCasingModel(ResourceLocation baseCasing, - ResourceLocation workableModel) { - return (MultiblockMachineBuilder) super.sidedOverlayCasingModel(baseCasing, workableModel); - } - - @Override - public MultiblockMachineBuilder sidedWorkableCasingModel(ResourceLocation baseCasing, - ResourceLocation workableModel) { - return (MultiblockMachineBuilder) super.sidedWorkableCasingModel(baseCasing, workableModel); + public TYPE generator(boolean generator) { + this.generator = generator; + return getThis(); } - @Override - public MultiblockMachineBuilder tooltipBuilder(@Nullable BiConsumer> tooltipBuilder) { - return (MultiblockMachineBuilder) super.tooltipBuilder(tooltipBuilder); - } - - @Override - public MultiblockMachineBuilder appearance(Supplier state) { - return (MultiblockMachineBuilder) super.appearance(state); - } - - @Override - public MultiblockMachineBuilder appearanceBlock(Supplier block) { - return (MultiblockMachineBuilder) super.appearanceBlock(block); - } - - @Override - public MultiblockMachineBuilder langValue(@Nullable String langValue) { - return (MultiblockMachineBuilder) super.langValue(langValue); - } - - @Override - public MultiblockMachineBuilder overlaySteamHullModel(String name) { - return (MultiblockMachineBuilder) super.overlaySteamHullModel(name); + public TYPE pattern(Function pattern) { + this.pattern = pattern; + return getThis(); } - @Override - public MultiblockMachineBuilder overlaySteamHullModel(ResourceLocation overlayModel) { - return (MultiblockMachineBuilder) super.overlaySteamHullModel(overlayModel); + public TYPE allowFlip(boolean allowFlip) { + this.allowFlip = allowFlip; + return getThis(); } - @Override - public MultiblockMachineBuilder colorOverlaySteamHullModel(String overlay) { - return (MultiblockMachineBuilder) super.colorOverlaySteamHullModel(overlay); + public TYPE partSorter(Function> partSorter) { + this.partSorter = partSorter; + return getThis(); } - @Override - public MultiblockMachineBuilder colorOverlaySteamHullModel(String overlay, - @Nullable ResourceLocation pipeOverlay, - @Nullable String emissiveOverlay) { - return (MultiblockMachineBuilder) super.colorOverlaySteamHullModel(overlay, pipeOverlay, emissiveOverlay); + public TYPE partAppearance(TriFunction partAppearance) { + this.partAppearance = partAppearance; + return getThis(); } - @Override - public MultiblockMachineBuilder colorOverlaySteamHullModel(ResourceLocation overlay, - @Nullable ResourceLocation pipeOverlay, - @Nullable ResourceLocation emissiveOverlay) { - return (MultiblockMachineBuilder) super.colorOverlaySteamHullModel(overlay, pipeOverlay, emissiveOverlay); - } - - @Override - public MultiblockMachineBuilder colorOverlaySteamHullModel(ResourceLocation overlay) { - return (MultiblockMachineBuilder) super.colorOverlaySteamHullModel(overlay); + public TYPE additionalDisplay(BiConsumer> additionalDisplay) { + this.additionalDisplay = additionalDisplay; + return getThis(); } - @Override - public MultiblockMachineBuilder workableSteamHullModel(boolean isHighPressure, ResourceLocation workableModel) { - return (MultiblockMachineBuilder) super.workableSteamHullModel(isHighPressure, workableModel); - } - - @Override - public MultiblockMachineBuilder tooltips(@Nullable Component... components) { - return (MultiblockMachineBuilder) super.tooltips(components); + public TYPE shapeInfo(Function shape) { + this.shapeInfos.add(d -> List.of(shape.apply(d))); + return getThis(); } - @Override - public MultiblockMachineBuilder tooltips(List components) { - return (MultiblockMachineBuilder) super.tooltips(components); + public TYPE shapeInfos(Function> shapes) { + this.shapeInfos.add(shapes); + return getThis(); } - @Override - public MultiblockMachineBuilder conditionalTooltip(Component component, BooleanSupplier condition) { - return (MultiblockMachineBuilder) super.conditionalTooltip(component, condition); + public TYPE recoveryItems(Supplier items) { + this.recoveryItems.add(() -> Arrays.stream(items.get()).map(ItemLike::asItem).map(Item::getDefaultInstance) + .toArray(ItemStack[]::new)); + return getThis(); } - @Override - public MultiblockMachineBuilder conditionalTooltip(Component component, boolean condition) { - return (MultiblockMachineBuilder) super.conditionalTooltip(component, condition); + public TYPE recoveryStacks(Supplier stacks) { + this.recoveryItems.add(stacks); + return getThis(); } @Tolerate - public MultiblockMachineBuilder partSorter(Comparator sorter) { + public TYPE partSorter(Comparator sorter) { this.partSorter = $ -> sorter; - return this; - } - - @Override - public MultiblockMachineBuilder abilities(PartAbility... abilities) { - return (MultiblockMachineBuilder) super.abilities(abilities); - } - - @Override - public MultiblockMachineBuilder modelProperty(Property property) { - return (MultiblockMachineBuilder) super.modelProperty(property); - } - - @Override - public > MultiblockMachineBuilder modelProperty(Property property, - @Nullable T defaultValue) { - return (MultiblockMachineBuilder) super.modelProperty(property, defaultValue); - } - - @Override - public MultiblockMachineBuilder modelProperties(Property... properties) { - return (MultiblockMachineBuilder) super.modelProperties(properties); - } - - @Override - public MultiblockMachineBuilder modelProperties(Collection> properties) { - return (MultiblockMachineBuilder) super.modelProperties(properties); - } - - @Override - public MultiblockMachineBuilder modelProperties(Map, ? extends Comparable> properties) { - return (MultiblockMachineBuilder) super.modelProperties(properties); - } - - @Override - public MultiblockMachineBuilder removeModelProperty(Property property) { - return (MultiblockMachineBuilder) super.removeModelProperty(property); - } - - @Override - public MultiblockMachineBuilder clearModelProperties() { - return (MultiblockMachineBuilder) super.clearModelProperties(); - } - - @Override - public MultiblockMachineBuilder paintingColor(int paintingColor) { - return (MultiblockMachineBuilder) super.paintingColor(paintingColor); - } - - @Override - public MultiblockMachineBuilder recipeModifier(RecipeModifier recipeModifier) { - return (MultiblockMachineBuilder) super.recipeModifier(recipeModifier); - } - - @Override - public MultiblockMachineBuilder recipeModifier(RecipeModifier recipeModifier, boolean alwaysTryModifyRecipe) { - return (MultiblockMachineBuilder) super.recipeModifier(recipeModifier, alwaysTryModifyRecipe); - } - - @Override - public MultiblockMachineBuilder recipeModifiers(RecipeModifier... recipeModifiers) { - return (MultiblockMachineBuilder) super.recipeModifiers(recipeModifiers); - } - - @Override - public MultiblockMachineBuilder recipeModifiers(boolean alwaysTryModifyRecipe, RecipeModifier... recipeModifiers) { - return (MultiblockMachineBuilder) super.recipeModifiers(alwaysTryModifyRecipe, recipeModifiers); - } - - public MultiblockMachineBuilder noRecipeModifier() { - return (MultiblockMachineBuilder) super.noRecipeModifier(); - } - - @Override - public MultiblockMachineBuilder alwaysTryModifyRecipe(boolean alwaysTryModifyRecipe) { - return (MultiblockMachineBuilder) super.alwaysTryModifyRecipe(alwaysTryModifyRecipe); - } - - @Override - public MultiblockMachineBuilder beforeWorking(BiPredicate beforeWorking) { - return (MultiblockMachineBuilder) super.beforeWorking(beforeWorking); - } - - @Override - public MultiblockMachineBuilder onWorking(Predicate onWorking) { - return (MultiblockMachineBuilder) super.onWorking(onWorking); - } - - @Override - public MultiblockMachineBuilder onWaiting(Consumer onWaiting) { - return (MultiblockMachineBuilder) super.onWaiting(onWaiting); - } - - @Override - public MultiblockMachineBuilder afterWorking(Consumer afterWorking) { - return (MultiblockMachineBuilder) super.afterWorking(afterWorking); - } - - @Override - public MultiblockMachineBuilder regressWhenWaiting(boolean regressWhenWaiting) { - return (MultiblockMachineBuilder) super.regressWhenWaiting(regressWhenWaiting); - } - - @Override - public MultiblockMachineBuilder editableUI(@Nullable EditableMachineUI editableUI) { - return (MultiblockMachineBuilder) super.editableUI(editableUI); - } - - @Override - public MultiblockMachineBuilder onBlockEntityRegister(NonNullConsumer> onBlockEntityRegister) { - return (MultiblockMachineBuilder) super.onBlockEntityRegister(onBlockEntityRegister); - } - - @Override - public MultiblockMachineBuilder allowExtendedFacing(boolean allowExtendedFacing) { - return (MultiblockMachineBuilder) super.allowExtendedFacing(allowExtendedFacing); - } - - @Override - public MultiblockMachineBuilder allowCoverOnFront(boolean allowCoverOnFront) { - return (MultiblockMachineBuilder) super.allowCoverOnFront(allowCoverOnFront); + return getThis(); } @Override @HideFromJS - public MultiblockMachineDefinition register() { + public DEFINITION register() { var definition = super.register(); definition.setGenerator(generator); if (pattern == null) { 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 013aac3040b..332e678fe34 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 @@ -191,7 +191,7 @@ public static MachineDefinition[] registerSimpleMachines(GTRegistrate registrate public static MachineDefinition[] registerTieredMachines(String name, BiFunction factory, - BiFunction, MachineDefinition> builder, + BiFunction, MachineDefinition> builder, int... tiers) { return registerTieredMachines(REGISTRATE, name, factory, builder, tiers); } @@ -199,7 +199,7 @@ public static MachineDefinition[] registerTieredMachines(String name, public static MachineDefinition[] registerTieredMachines(GTRegistrate registrate, String name, BiFunction factory, - BiFunction, MachineDefinition> builder, + BiFunction, MachineDefinition> builder, int... tiers) { MachineDefinition[] definitions = new MachineDefinition[GTValues.TIER_COUNT]; for (int tier : tiers) { @@ -214,13 +214,13 @@ public static MachineDefinition[] registerTieredMachines(GTRegistrate registrate public static Pair registerSteamMachines(String name, BiFunction factory, - BiFunction, MachineDefinition> builder) { + BiFunction, MachineDefinition> builder) { return registerSteamMachines(REGISTRATE, name, factory, builder); } public static Pair registerSteamMachines(GTRegistrate registrate, String name, BiFunction factory, - BiFunction, MachineDefinition> builder) { + BiFunction, MachineDefinition> builder) { MachineDefinition lowTier = builder.apply(false, registrate.machine("lp_%s".formatted(name), holder -> factory.apply(holder, false)) .langValue("Low Pressure " + FormattingUtil.toEnglishName(name)) @@ -633,14 +633,14 @@ public static MultiblockMachineDefinition registerMultiblockTank(GTRegistrate re } public static MachineDefinition registerTankValve(String name, String displayName, boolean isMetal, - BiConsumer, ResourceLocation> rendererSetup) { + BiConsumer, ResourceLocation> rendererSetup) { return registerTankValve(REGISTRATE, name, displayName, isMetal, rendererSetup); } public static MachineDefinition registerTankValve(GTRegistrate registrate, String name, String displayName, boolean isMetal, - BiConsumer, ResourceLocation> rendererSetup) { - MachineBuilder builder = registrate + BiConsumer, ResourceLocation> rendererSetup) { + MachineBuilder builder = registrate .machine(name, holder -> new TankValvePartMachine(holder, isMetal)) .langValue(displayName) .tooltips(Component.translatable("gtceu.machine.tank_valve.tooltip"), @@ -652,14 +652,14 @@ public static MachineDefinition registerTankValve(GTRegistrate registrate, Strin public static MultiblockMachineDefinition[] registerTieredMultis(String name, BiFunction factory, - BiFunction builder, + BiFunction, MultiblockMachineDefinition> builder, int... tiers) { return registerTieredMultis(REGISTRATE, name, factory, builder, tiers); } public static MultiblockMachineDefinition[] registerTieredMultis(GTRegistrate registrate, String name, BiFunction factory, - BiFunction builder, + BiFunction, MultiblockMachineDefinition> builder, int... tiers) { MultiblockMachineDefinition[] definitions = new MultiblockMachineDefinition[GTValues.TIER_COUNT]; for (int tier : tiers) { 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 2baae3aa047..6c213387d72 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 @@ -438,9 +438,9 @@ public class GTResearchMachines { .register(); @NotNull - private static MachineBuilder registerDataHatch(String name, String displayName, int tier, - Function constructor, - String model, PartAbility... abilities) { + private static MachineBuilder registerDataHatch(String name, String displayName, int tier, + Function constructor, + String model, PartAbility... abilities) { return REGISTRATE.machine(name, constructor) .langValue(displayName) .tier(tier) @@ -449,9 +449,9 @@ private static MachineBuilder registerDataHatch(String name, .overlayTieredHullModel(model); } - private static MachineBuilder registerHPCAPart(String name, String displayName, - Function constructor, - String texture, boolean isAdvanced) { + private static MachineBuilder registerHPCAPart(String name, String displayName, + Function constructor, + String texture, boolean isAdvanced) { return REGISTRATE.machine(name, constructor) .langValue(displayName) .rotationState(RotationState.ALL) diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/GregTechKubeJSPlugin.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/GregTechKubeJSPlugin.java index f3e4248f772..6300ac47d81 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/GregTechKubeJSPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/GregTechKubeJSPlugin.java @@ -58,6 +58,7 @@ import com.gregtechceu.gtceu.api.recipe.lookup.RecipeManagerHandler; import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; import com.gregtechceu.gtceu.api.registry.GTRegistries; +import com.gregtechceu.gtceu.api.registry.registrate.BuilderBase; import com.gregtechceu.gtceu.api.registry.registrate.MultiblockMachineBuilder; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderHelper; import com.gregtechceu.gtceu.common.cosmetics.GTCapes; @@ -177,11 +178,13 @@ public void init() { new KJSTieredMachineBuilder(id, SimpleGeneratorMachine::new, SimpleGeneratorMachine.EDITABLE_UI_CREATOR, true)), false); - GTRegistryInfo.MACHINE.addType("multiblock", MultiblockMachineBuilder.class, + GTRegistryInfo.MACHINE.addType("multiblock", + (Class>) (Class) MultiblockMachineBuilder.class, KJSWrappingMultiblockBuilder::createKJSMulti, false); GTRegistryInfo.MACHINE.addType("tiered_multiblock", KJSWrappingMultiblockBuilder.class, (id) -> new KJSWrappingMultiblockBuilder(id, new KJSTieredMultiblockBuilder(id)), false); - GTRegistryInfo.MACHINE.addType("primitive", MultiblockMachineBuilder.class, + GTRegistryInfo.MACHINE.addType("primitive", + (Class>) (Class) MultiblockMachineBuilder.class, (id) -> KJSWrappingMultiblockBuilder.createKJSMulti(id, PrimitiveFancyUIWorkableMachine::new), false); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSSteamMachineBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSSteamMachineBuilder.java index 9ae91e279bc..56a4e0827ca 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSSteamMachineBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSSteamMachineBuilder.java @@ -30,7 +30,7 @@ public class KJSSteamMachineBuilder extends BuilderBase { @Setter public volatile SteamDefinitionFunction definition = (isHP, def) -> def.tier(isHP ? 1 : 0); - private volatile MachineBuilder lowPressureBuilder = null, highPressureBuilder = null; + private volatile MachineBuilder lowPressureBuilder = null, highPressureBuilder = null; private volatile MachineDefinition hpValue = null; public KJSSteamMachineBuilder(ResourceLocation id) { @@ -104,6 +104,6 @@ public interface SteamCreationFunction { @FunctionalInterface public interface SteamDefinitionFunction { - void apply(boolean isHighPressure, MachineBuilder builder); + void apply(boolean isHighPressure, MachineBuilder builder); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMachineBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMachineBuilder.java index 148aa32b922..c797cd98e47 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMachineBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMachineBuilder.java @@ -31,7 +31,7 @@ @Accessors(fluent = true, chain = true) public class KJSTieredMachineBuilder extends BuilderBase { - private final MachineBuilder[] builders = new MachineBuilder[TIER_COUNT]; + private final MachineBuilder[] builders = new MachineBuilder[TIER_COUNT]; @Setter public volatile int[] tiers = GTMachineUtils.ELECTRIC_TIERS; @@ -69,7 +69,7 @@ public KJSTieredMachineBuilder(ResourceLocation id, TieredCreationFunction machi public void generateAssetJsons(@Nullable AssetJsonGenerator generator) { super.generateAssetJsons(generator); for (int tier : this.tiers) { - MachineBuilder builder = this.builders[tier]; + MachineBuilder builder = this.builders[tier]; if (builder != null) { builder.generateAssetJsons(generator); } @@ -80,7 +80,7 @@ public void generateAssetJsons(@Nullable AssetJsonGenerator generator) { public void generateLang(@NotNull LangEventJS lang) { super.generateLang(lang); for (int tier : this.tiers) { - MachineBuilder builder = this.builders[tier]; + MachineBuilder builder = this.builders[tier]; if (builder != null) { builder.generateLang(lang); } @@ -98,7 +98,7 @@ public void generateLang(@NotNull LangEventJS lang) { MachineDefinition[] definitions = new MachineDefinition[TIER_COUNT]; for (final int tier : tiers) { String tierName = VN[tier].toLowerCase(Locale.ROOT); - MachineBuilder builder = GTRegistration.REGISTRATE.machine( + MachineBuilder builder = GTRegistration.REGISTRATE.machine( String.format("%s_%s", tierName, this.id.getPath()), holder -> machine.create(holder, tier, tankScalingFunction)); @@ -142,6 +142,6 @@ public interface CreationFunction { @FunctionalInterface public interface DefinitionFunction { - void apply(int tier, MachineBuilder builder); + void apply(int tier, MachineBuilder builder); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMultiblockBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMultiblockBuilder.java index f2b4dc7aa65..dfb0f582c9a 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMultiblockBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMultiblockBuilder.java @@ -99,6 +99,6 @@ public interface TieredCreationFunction { @FunctionalInterface public interface DefinitionFunction { - void apply(int tier, MachineBuilder builder); + void apply(int tier, MachineBuilder builder); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSWrappingMultiblockBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSWrappingMultiblockBuilder.java index 113b517de61..39d0fce705a 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSWrappingMultiblockBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSWrappingMultiblockBuilder.java @@ -75,17 +75,17 @@ public MultiblockMachineDefinition register() { " With id " + tieredBuilder.id); } - public static MultiblockMachineBuilder createKJSMulti(ResourceLocation id) { - return new MultiblockMachineBuilder(GTRegistration.REGISTRATE, id.getPath(), + public static MultiblockMachineBuilder createKJSMulti(ResourceLocation id) { + return new MultiblockMachineBuilder<>(GTRegistration.REGISTRATE, id.getPath(), WorkableElectricMultiblockMachine::new, MetaMachineBlock::new, MetaMachineItem::new, MetaMachineBlockEntity::new); } - public static MultiblockMachineBuilder createKJSMulti(ResourceLocation id, - KJSTieredMachineBuilder.CreationFunction machine) { - return new MultiblockMachineBuilder(GTRegistration.REGISTRATE, id.getPath(), + public static MultiblockMachineBuilder createKJSMulti(ResourceLocation id, + KJSTieredMachineBuilder.CreationFunction machine) { + return new MultiblockMachineBuilder<>(GTRegistration.REGISTRATE, id.getPath(), machine::create, MetaMachineBlock::new, MetaMachineItem::new, From 0830c46e7341b9f7d599983e89d646d6a7d0c6f4 Mon Sep 17 00:00:00 2001 From: Jurre Groenendijk Date: Fri, 9 Jan 2026 17:29:57 +0100 Subject: [PATCH 08/28] Fix crash when rejoining world in latest (#4453) --- .../com/gregtechceu/gtceu/core/mixins/RecipeManagerMixin.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/RecipeManagerMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/RecipeManagerMixin.java index ca3c5615e00..4e7f22021a1 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/RecipeManagerMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/RecipeManagerMixin.java @@ -50,6 +50,7 @@ public abstract class RecipeManagerMixin { }); var recipesByID = recipes.get(gtRecipeType); if (recipesByID == null) { + gtRecipeType.getAdditionHandler().completeStaging(); continue; } RecipeManagerHandler.addRecipesToLookup(recipesByID, gtRecipeType); From 5564a8510d39526fffed83932adf27baa27e6ae2 Mon Sep 17 00:00:00 2001 From: Tar Laboratories <159147059+TarLaboratories@users.noreply.github.com> Date: Sat, 10 Jan 2026 14:55:16 +0800 Subject: [PATCH 09/28] Stop placeholder execution when an exception is encountered (#4455) --- .../api/placeholder/PlaceholderHandler.java | 62 +++++++++---------- 1 file changed, 31 insertions(+), 31 deletions(-) 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 c496615442a..86edbd0bd77 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/placeholder/PlaceholderHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/placeholder/PlaceholderHandler.java @@ -84,31 +84,31 @@ public static MultiLineComponent processPlaceholders(String s, PlaceholderContex int symbol = 1; Stack> stack = new Stack<>(); stack.push(GTUtil.list(MultiLineComponent.empty())); - for (char c : s.toCharArray()) { - if (escape || (literalEscape && c != LITERAL_ESCAPE)) { - if (c == ESCAPED_NEWLINE && !literalEscape) { - GTUtil.getLast(stack.peek()).appendNewline(); - line++; - symbol = 0; - } else if (c == NEWLINE) continue; - else GTUtil.getLast(stack.peek()).append(c); - } else { - switch (c) { - case ESCAPE -> escapeNext = true; - case LITERAL_ESCAPE -> literalEscape = !literalEscape; - case NEWLINE -> { + try { + for (char c : s.toCharArray()) { + if (escape || (literalEscape && c != LITERAL_ESCAPE)) { + if (c == ESCAPED_NEWLINE && !literalEscape) { GTUtil.getLast(stack.peek()).appendNewline(); line++; symbol = 0; - } - case ARG_SEPARATOR -> { - if (stack.size() == 1) GTUtil.getLast(stack.peek()).append(c); - else stack.peek().add(MultiLineComponent.empty()); - } - case PLACEHOLDER_BEGIN -> stack.push(GTUtil.list(MultiLineComponent.empty())); - case PLACEHOLDER_END -> { - List placeholder = stack.pop(); - try { + } else if (c == NEWLINE) continue; + else GTUtil.getLast(stack.peek()).append(c); + } else { + switch (c) { + case ESCAPE -> escapeNext = true; + case LITERAL_ESCAPE -> literalEscape = !literalEscape; + case NEWLINE -> { + GTUtil.getLast(stack.peek()).appendNewline(); + line++; + symbol = 0; + } + case ARG_SEPARATOR -> { + if (stack.size() == 1) GTUtil.getLast(stack.peek()).append(c); + else stack.peek().add(MultiLineComponent.empty()); + } + case PLACEHOLDER_BEGIN -> stack.push(GTUtil.list(MultiLineComponent.empty())); + case PLACEHOLDER_END -> { + List placeholder = stack.pop(); if (stack.isEmpty()) throw new UnexpectedBracketException(); MultiLineComponent result = processPlaceholder(placeholder, ctx); if (result.isIgnoreSpaces() || stack.size() == 1) { @@ -134,19 +134,19 @@ public static MultiLineComponent processPlaceholders(String s, PlaceholderContex if (i != result.size() - 1) GTUtil.getLast(stack.peek()).appendNewline(); } } - } catch (PlaceholderException e) { - e.setLineInfo(line, symbol); - exceptions.add(e); - } catch (RuntimeException e) { - exceptions.add(e); } + default -> GTUtil.getLast(stack.peek()).append(c); } - default -> GTUtil.getLast(stack.peek()).append(c); } + escape = escapeNext; + escapeNext = false; + symbol++; } - escape = escapeNext; - escapeNext = false; - symbol++; + } catch (PlaceholderException e) { + e.setLineInfo(line, symbol); + exceptions.add(e); + } catch (RuntimeException e) { + exceptions.add(e); } if (stack.size() > 1) { PlaceholderException exception = new UnclosedBracketException(); From 59d17a0e1f93310c94c02caafd22e6e9cb3fdb81 Mon Sep 17 00:00:00 2001 From: zetrock1 <144679746+zetrock1@users.noreply.github.com> Date: Sat, 10 Jan 2026 11:20:07 +0000 Subject: [PATCH 10/28] Fix tank valve info (#4454) --- .../gtceu/common/data/machines/GTMachineUtils.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) 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 332e678fe34..51b301fe054 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 @@ -3,6 +3,7 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTCEuAPI; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.block.IMachineBlock; import com.gregtechceu.gtceu.api.block.MetaMachineBlock; import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.capability.compat.FeCompat; @@ -26,6 +27,7 @@ import com.gregtechceu.gtceu.api.machine.steam.SimpleSteamMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.MultiblockShapeInfo; import com.gregtechceu.gtceu.api.pattern.Predicates; import com.gregtechceu.gtceu.api.pattern.TraceabilityPredicate; import com.gregtechceu.gtceu.api.pattern.predicates.SimplePredicate; @@ -60,11 +62,13 @@ import com.lowdragmc.lowdraglib.utils.BlockInfo; import net.minecraft.ChatFormatting; +import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidType; @@ -627,6 +631,15 @@ public static MultiblockMachineDefinition registerMultiblockTank(GTRegistrate re .or(blocks(valve.get()).setMaxGlobalLimited(2, 0))) .where('#', air()) .build()) + .shapeInfo(definition -> MultiblockShapeInfo.builder() + .aisle("CCC", "CSC", "CCC") + .aisle("CCC", "C#C", "CVC") + .aisle("CCC", "CCC", "CCC") + .where('S', definition.get(), Direction.NORTH) + .where('C', casing.get().defaultBlockState()) + .where('V', (IMachineBlock) valve.get(), Direction.UP) + .where('#', Blocks.AIR.defaultBlockState()) + .build()) .appearanceBlock(casing); rendererSetup.accept(builder, GTCEu.id("block/multiblock/multiblock_tank")); return builder.register(); From 3d1c341cf658d548cf8f0ec0ec849c73c026b799 Mon Sep 17 00:00:00 2001 From: zetrock1 <144679746+zetrock1@users.noreply.github.com> Date: Sat, 10 Jan 2026 11:21:34 +0000 Subject: [PATCH 11/28] Spray cans with AE2 IColorableBlockEntity support (#4264) --- .../gtceu/common/item/ColorSprayBehaviour.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/ColorSprayBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/ColorSprayBehaviour.java index a65523e1a8b..053567de8c7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/ColorSprayBehaviour.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/ColorSprayBehaviour.java @@ -40,6 +40,7 @@ import net.minecraftforge.common.Tags; import net.minecraftforge.common.util.TriPredicate; +import appeng.api.implementations.blockentities.IColorableBlockEntity; import appeng.api.util.AEColor; import appeng.blockentity.networking.CableBusBlockEntity; import com.google.common.collect.ImmutableMap; @@ -204,8 +205,13 @@ private boolean handleSpecialBlockEntities(BlockEntity first, int limit, UseOnCo if (player == null) { return false; } - if (GTCEu.Mods.isAE2Loaded() && AE2CallWrapper.isAE2Cable(first)) { - var collected = AE2CallWrapper.collect(first, limit); + if (GTCEu.Mods.isAE2Loaded() && AE2CallWrapper.isColorable(first)) { + Set collected; + if (first instanceof CableBusBlockEntity) { + collected = AE2CallWrapper.collect(first, limit); + } else { + collected = Set.of((IColorableBlockEntity) first); + } var ae2Color = color == null ? AEColor.TRANSPARENT : AEColor.values()[color.ordinal()]; for (var c : collected) { if (c.getColor() == ae2Color) { @@ -479,8 +485,8 @@ static Set collect(BlockEntity first, int limit) { limit, limit * 6); } - static boolean isAE2Cable(BlockEntity be) { - return be instanceof CableBusBlockEntity; + static boolean isColorable(BlockEntity be) { + return be instanceof IColorableBlockEntity; } static boolean ae2CablePredicate(CableBusBlockEntity parent, CableBusBlockEntity child, Direction direction) { From ba3bec08aa185254c1147c5312ecf0040703130c Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Tue, 13 Jan 2026 10:16:45 +0200 Subject: [PATCH 12/28] add a mixin to make test method names be displayed in snake_case (#4463) --- .../gtceu/core/mixins/GTMixinPlugin.java | 6 ++++++ .../dev/test/GameTestRegistryMixin.java | 19 +++++++++++++++++++ src/main/resources/gtceu.mixins.json | 1 + 3 files changed, 26 insertions(+) create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/dev/test/GameTestRegistryMixin.java diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java index 430c4aaaf2c..4399a4cc34f 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.core.mixins; import net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.loading.FMLLoader; import net.minecraftforge.fml.loading.LoadingModList; import org.objectweb.asm.tree.ClassNode; @@ -25,6 +26,8 @@ public String getRefMapperConfig() { private static final String MIXIN_PACKAGE = "com.gregtechceu.gtceu.core.mixins."; private static final Map MOD_COMPAT_MIXINS = new HashMap<>(); + private static final String DEV_PACKAGE = MIXIN_PACKAGE + "dev."; + static { MOD_COMPAT_MIXINS.put("roughlyenoughitems", MIXIN_PACKAGE + "rei"); addModCompatMixin("emi"); @@ -37,6 +40,9 @@ public String getRefMapperConfig() { @Override public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { + if (mixinClassName.startsWith(DEV_PACKAGE)) { + return !FMLLoader.isProduction(); + } for (var compatMod : MOD_COMPAT_MIXINS.entrySet()) { if (mixinClassName.startsWith(compatMod.getValue())) { return isModLoaded(compatMod.getKey()); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/dev/test/GameTestRegistryMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/dev/test/GameTestRegistryMixin.java new file mode 100644 index 00000000000..79324c06a07 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/dev/test/GameTestRegistryMixin.java @@ -0,0 +1,19 @@ +package com.gregtechceu.gtceu.core.mixins.dev.test; + +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import net.minecraft.gametest.framework.GameTestRegistry; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(GameTestRegistry.class) +public class GameTestRegistryMixin { + + @ModifyExpressionValue(method = "turnMethodIntoTestFunction", + at = @At(value = "INVOKE", target = "Ljava/lang/reflect/Method;getName()Ljava/lang/String;")) + private static String gtceu$makeTestMethodNameSnakeCase(String original) { + return FormattingUtil.toLowerCaseUnderscore(original); + } +} diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 7bcc8159b12..3ade6f7cca3 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -61,6 +61,7 @@ "TagManagerMixin", "TagValueAccessor", "client.ItemEntityMixin", + "dev.test.GameTestRegistryMixin", "emi.EmiRecipeFillerMixin", "emi.FillRecipePacketMixin", "emi.FluidEmiStackMixin", From e399fd769e32d50b47192ac4aa398a201e83fcfb Mon Sep 17 00:00:00 2001 From: illuciaz23 <104995560+illuciaz23@users.noreply.github.com> Date: Wed, 14 Jan 2026 01:08:41 +0800 Subject: [PATCH 13/28] Fix voltage display (#4462) --- .../multiblock/WorkableElectricMultiblockMachine.java | 2 +- .../integration/jade/provider/RecipeLogicProvider.java | 9 ++------- 2 files changed, 3 insertions(+), 8 deletions(-) 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 3ad662bb8cf..75b981890c6 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 @@ -259,7 +259,7 @@ public long getMaxVoltage() { // The voltage for recipe search is always on tier, so take the closest lower tier. // List check is done because single hatches will always be a "clean voltage," no need // for any additional checks. - return GTValues.V[GTUtil.getFloorTierByVoltage(voltage)]; + return GTValues.VEX[GTUtil.getFloorTierByVoltage(voltage)]; } else { return voltage; } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeLogicProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeLogicProvider.java index 31f2324e24b..da6dc336a46 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeLogicProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeLogicProvider.java @@ -11,7 +11,6 @@ import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.client.util.TooltipHelper; -import com.gregtechceu.gtceu.common.machine.multiblock.part.EnergyHatchPartMachine; import com.gregtechceu.gtceu.common.machine.multiblock.steam.SteamParallelMultiblockMachine; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTUtil; @@ -69,12 +68,8 @@ public static long getVoltage(RecipeLogic capability) { } else if (capability.machine instanceof SimpleGeneratorMachine machine) { voltage = GTValues.V[machine.getTier()]; } else if (capability.machine instanceof WorkableElectricMultiblockMachine machine) { - voltage = machine.getParts().stream() - .filter(EnergyHatchPartMachine.class::isInstance) - .map(EnergyHatchPartMachine.class::cast) - .mapToLong(dynamo -> GTValues.V[dynamo.getTier()]) - .max() - .orElse(-1); + voltage = Math.max(machine.getEnergyContainer().getHighestInputVoltage(), + machine.getEnergyContainer().getOutputVoltage()); } // default display as LV, this shouldn't happen because a machine is either electric or steam if (voltage == -1) voltage = 32; From 24574c92bbfa0b2da18971096ccd296ac4ed71df Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Wed, 14 Jan 2026 20:00:19 +1100 Subject: [PATCH 14/28] Rework machine copy/paste card to support copying pipes, covers, cover settings, and more machine settings (#4272) --- docs/content/Modpacks/Changes/v7.5.0.md | 2 + .../Cover-Machine-Copy-Paste-Support.md | 15 + .../resources/assets/gtceu/lang/en_ud.json | 26 +- .../resources/assets/gtceu/lang/en_us.json | 26 +- .../gtceu/api/blockentity/ICopyable.java | 24 ++ .../api/blockentity/PipeBlockEntity.java | 19 +- .../gtceu/api/capability/ICoverable.java | 91 ++++- .../gtceu/api/cover/CoverBehavior.java | 3 +- .../gtceu/api/cover/filter/FilterHandler.java | 5 + .../gtceu/api/machine/MetaMachine.java | 19 +- .../gtceu/common/cover/ConveyorCover.java | 22 ++ .../gtceu/common/cover/FluidFilterCover.java | 19 + .../common/cover/FluidRegulatorCover.java | 18 + .../gtceu/common/cover/ItemFilterCover.java | 17 + .../common/cover/MachineControllerCover.java | 17 + .../gtceu/common/cover/PumpCover.java | 22 ++ .../gtceu/common/cover/RobotArmCover.java | 16 + .../detector/AdvancedEnergyDetectorCover.java | 18 + .../detector/AdvancedFluidDetectorCover.java | 20 ++ .../detector/AdvancedItemDetectorCover.java | 20 ++ .../common/cover/detector/DetectorCover.java | 14 + .../voiding/AdvancedFluidVoidingCover.java | 18 + .../voiding/AdvancedItemVoidingCover.java | 16 + .../gtceu/common/data/GTItems.java | 4 +- .../behavior/MachineConfigCopyBehaviour.java | 338 ++++++++++++++++++ .../MetaMachineConfigCopyBehaviour.java | 216 ----------- .../gtceu/data/lang/LangHandler.java | 31 +- .../gtceu/utils/GTTransferUtils.java | 15 + 28 files changed, 815 insertions(+), 256 deletions(-) create mode 100644 docs/content/Modpacks/Other-Topics/Cover-Machine-Copy-Paste-Support.md create mode 100644 src/main/java/com/gregtechceu/gtceu/api/blockentity/ICopyable.java create mode 100644 src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/MachineConfigCopyBehaviour.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/MetaMachineConfigCopyBehaviour.java diff --git a/docs/content/Modpacks/Changes/v7.5.0.md b/docs/content/Modpacks/Changes/v7.5.0.md index 82a929e0018..f81b0ece042 100644 --- a/docs/content/Modpacks/Changes/v7.5.0.md +++ b/docs/content/Modpacks/Changes/v7.5.0.md @@ -6,3 +6,5 @@ title: "Version 7.5.0" # Updating from `7.4.1` to `7.5.0` ## MachineBuilder Generics We have added a second Generic argument to our (Multiblock)MachineBuilder. This effectively means that anywhere where you used to store a partially finished `MachineBuilder`, you now need to store a `MachineBuilder`. The same holds for `MultiblockMachineBuilder`. +## Machine & Cover Copy/Paste System +A new system for copying machines using the Machine Memory Card has been added, see [this page](../Other-Topics/Cover-Machine-Copy-Paste-Support.md) if you want to add extra copy/paste behaviour to your own machines and covers. diff --git a/docs/content/Modpacks/Other-Topics/Cover-Machine-Copy-Paste-Support.md b/docs/content/Modpacks/Other-Topics/Cover-Machine-Copy-Paste-Support.md new file mode 100644 index 00000000000..9f5f722d539 --- /dev/null +++ b/docs/content/Modpacks/Other-Topics/Cover-Machine-Copy-Paste-Support.md @@ -0,0 +1,15 @@ +--- +title: Adding Copy & Paste support to covers and machines +--- + +The Machine Memory Card item allows for machine settings and covers to be copied to other machines. + +To add extra fields to copy, override the following methods on a machine or cover: +```java +/// Copies the current machine/cover config to a CompoundTag. +public CompoundTag copyConfig(CompoundTag tag); +/// Loads a machine/cover config from a CompoundTag. +public void pasteConfig(ServerPlayer player, CompoundTag tag); +/// Returns a list of items (covers, filters, etc) which are needed to copy and paste this machine. +public List getItemsRequiredToPaste(); +``` \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 367176eab91..e7209058988 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -64,8 +64,16 @@ "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.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.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ɐƆ", @@ -85,10 +93,15 @@ "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.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", @@ -4978,7 +4991,6 @@ "item.gtceu.zpm_voltage_coil.tooltip": "ןıoƆ ɹǝdnS", "item.invalid.name": "ɯǝʇı pıןɐʌuI", "item.netherrack_nether_quartz": "ǝɹO zʇɹɐnὉ ɹǝɥʇǝN", - "item.toggle.advanced.info.tooltip": ">uoıʇɐɹnbıɟuoɔ pǝɹoʇs ʍǝıʌ oʇ ʞɐǝuS<8§", "itemGroup.gtceu.decoration": "sʞɔoןᗺ uoıʇɐɹoɔǝᗡ nƎƆɥɔǝ⟘bǝɹ⅁", "itemGroup.gtceu.item": "sɯǝʇI nƎƆɥɔǝ⟘bǝɹ⅁", "itemGroup.gtceu.machine": "sǝuıɥɔɐW nƎƆɥɔǝ⟘bǝɹ⅁", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 42c76727ea0..17fc2bf2fc4 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -64,8 +64,16 @@ "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.memory_card.client_msg.cleared": "Stored configuration cleared", + "behaviour.memory_card.client_msg.copied": "Copied machine configuration", + "behaviour.memory_card.client_msg.pasted": "Applied machine configuration", + "behaviour.memory_card.copy_target": "Copying: %s", + "behaviour.memory_card.disabled": "§cDisabled§r", + "behaviour.memory_card.enabled": "§aEnabled§r", + "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.", + "behaviour.memory_card.tooltip.items_to_paste": "The following items are needed to paste this configuration:", + "behaviour.memory_card.tooltip.paste": "§7R-Click to paste machine configuration", + "behaviour.memory_card.tooltip.view_stored": "§8", "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", @@ -85,10 +93,15 @@ "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.setting.tooltip.allow_input": "§2Allow Input§r", + "behaviour.setting.tooltip.auto_output": "§2Auto Output§r", + "behaviour.setting.tooltip.auto_output_allow_input": "§2Auto Output/Allow Input§r", + "behaviour.setting.tooltip.circuit_config": "Programmed Circuit: ", + "behaviour.setting.tooltip.fluid_io": "Fluid Output: %s (%s)", + "behaviour.setting.tooltip.item_io": "Item Output: %s (%s)", + "behaviour.setting.tooltip.muffled": "Muffling %s", + "behaviour.setting.tooltip.pipe_blocked_connections": "Pipe shuttered sides: %s", + "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", @@ -4978,7 +4991,6 @@ "item.gtceu.zpm_voltage_coil.tooltip": "Super Coil", "item.invalid.name": "Invalid item", "item.netherrack_nether_quartz": "Nether Quartz Ore", - "item.toggle.advanced.info.tooltip": "§8", "itemGroup.gtceu.decoration": "GregTechCEu Decoration Blocks", "itemGroup.gtceu.item": "GregTechCEu Items", "itemGroup.gtceu.machine": "GregTechCEu Machines", diff --git a/src/main/java/com/gregtechceu/gtceu/api/blockentity/ICopyable.java b/src/main/java/com/gregtechceu/gtceu/api/blockentity/ICopyable.java new file mode 100644 index 00000000000..984e4f1892b --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/ICopyable.java @@ -0,0 +1,24 @@ +package com.gregtechceu.gtceu.api.blockentity; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; + +import java.util.List; + +/// An interface for machines and machine traits which have settings that can be copied using the machine memory card. +public interface ICopyable { + + /// Saves the current config into a CompoundTag. + default CompoundTag copyConfig(CompoundTag tag) { + return tag; + } + + /// Loads a saved config from a CompoundTag and applies it to an existing object. + default void pasteConfig(ServerPlayer player, CompoundTag tag) {} + + /// Returns a `List` of items required to paste the saved config. + default List getItemsRequiredToPaste() { + return List.of(); + } +} 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 23f88ee3fd6..bc5757ac7b8 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java @@ -34,6 +34,7 @@ import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -61,7 +62,8 @@ @MethodsReturnNonnullByDefault public abstract class PipeBlockEntity & IPipeType, NodeDataType> extends BlockEntity implements IPipeNode, IEnhancedManaged, - IAsyncAutoSyncBlockEntity, IAutoPersistBlockEntity, IToolGridHighlight, IToolable { + IAsyncAutoSyncBlockEntity, IAutoPersistBlockEntity, IToolGridHighlight, IToolable, + ICopyable { public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(PipeBlockEntity.class); @Getter @@ -453,4 +455,19 @@ public void load(CompoundTag tag) { TagFixer.fixFluidTags(tag); super.load(tag); } + + @Override + public CompoundTag copyConfig(CompoundTag tag) { + return ICopyable.super.copyConfig(tag); + } + + @Override + public void pasteConfig(ServerPlayer player, CompoundTag tag) { + ICopyable.super.pasteConfig(player, tag); + } + + @Override + public List getItemsRequiredToPaste() { + return coverContainer.getItemsRequiredToPaste(); + } } 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 882f145bd53..a3ef301204a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java @@ -1,16 +1,21 @@ package com.gregtechceu.gtceu.api.capability; import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.blockentity.ICopyable; import com.gregtechceu.gtceu.api.blockentity.ITickSubscription; import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.CoverDefinition; +import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.Level; @@ -25,13 +30,10 @@ import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; -public interface ICoverable extends ITickSubscription { +public interface ICoverable extends ITickSubscription, ICopyable { Level getLevel(); @@ -219,15 +221,6 @@ default boolean hasDynamicCovers() { return false; } - class PrimaryBoxData { - - public final boolean usePlacementGrid; - - public PrimaryBoxData(boolean usePlacementGrid) { - this.usePlacementGrid = usePlacementGrid; - } - } - @Nullable static Direction traceCoverSide(@Nullable BlockHitResult result) { return determineGridSideHit(result); @@ -273,4 +266,74 @@ default BlockState getBlockAppearance(BlockState state, BlockAndTintGetter level } return null; } + + private CompoundTag createCoverConfigTag(@Nullable CoverBehavior cover) { + if (cover == null) return new CompoundTag(); + 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())); + return tag; + } + + private void applyCoverConfigTag(ServerPlayer player, Direction dir, CompoundTag tag) { + if (tag.isEmpty()) return; + var def = GTRegistries.COVERS.get(new ResourceLocation(tag.getString("id"))); + ItemStack stack = ItemStack.of(tag.getCompound("item")); + if (def == null) return; + + placeCoverOnSide(dir, stack, def, player); + + CoverBehavior placedCover = getCoverAtSide(dir); + if (placedCover != null && tag.contains("data") && !tag.getCompound("data").isEmpty()) + placedCover.pasteConfig(player, tag.getCompound("data")); + } + + @Override + default CompoundTag copyConfig(CompoundTag tag) { + for (Direction dir : GTUtil.DIRECTIONS) { + tag.put(dir.getName(), hasCover(dir) ? createCoverConfigTag(getCoverAtSide(dir)) : new CompoundTag()); + } + + return tag; + } + + @Override + default void pasteConfig(ServerPlayer player, CompoundTag tag) { + for (Direction side : GTUtil.DIRECTIONS) { + removeCover(side, player); + } + + for (Direction dir : GTUtil.DIRECTIONS) { + applyCoverConfigTag(player, dir, tag.getCompound(dir.getName())); + } + } + + @Override + default List getItemsRequiredToPaste() { + Map allDrops = new HashMap<>(); + List rawDrops = new ArrayList<>(); + + for (Direction side : GTUtil.DIRECTIONS) { + var cover = getCoverAtSide(side); + if (cover != null) rawDrops.add(cover.getAttachItem()); + } + + for (Direction side : GTUtil.DIRECTIONS) { + var cover = getCoverAtSide(side); + if (cover != null) rawDrops.addAll(cover.getAdditionalDrops()); + } + + for (var drop : rawDrops) { + if (allDrops.containsKey(drop.getItem())) { + allDrops.put(drop.getItem(), allDrops.get(drop.getItem()) + drop.getCount()); + } else { + allDrops.put(drop.getItem(), drop.getCount()); + } + } + + List mergedStacks = new ArrayList<>(); + allDrops.forEach((k, v) -> mergedStacks.add(new ItemStack(k, v))); + return mergedStacks; + } } 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 9d125bdb394..8be3ad670aa 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.api.cover; +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; @@ -48,7 +49,7 @@ */ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public abstract class CoverBehavior implements IEnhancedManaged, IToolGridHighlight { +public abstract class CoverBehavior implements IEnhancedManaged, IToolGridHighlight, ICopyable { public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(CoverBehavior.class); 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 5855d4c1be6..e46b233e1cb 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 @@ -131,6 +131,11 @@ public int getSlotLimit(int slot) { return this.filterSlot; } + public void setFilterItem(ItemStack item) { + getFilterSlot().setStackInSlot(0, item); + updateFilter(); + } + private void updateFilter() { var filterContainer = getFilterSlot(); 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 2db77492aa1..7357c7637ec 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -3,6 +3,7 @@ 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.ICopyable; import com.gregtechceu.gtceu.api.blockentity.IPaintable; import com.gregtechceu.gtceu.api.blockentity.ITickSubscription; import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; @@ -50,6 +51,7 @@ import net.minecraft.locale.Language; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; @@ -95,7 +97,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class MetaMachine implements IEnhancedManaged, IToolable, ITickSubscription, IToolGridHighlight, - IFancyTooltip, IPaintable, IRedstoneSignalMachine { + IFancyTooltip, IPaintable, IRedstoneSignalMachine, ICopyable { protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(MetaMachine.class); @Getter @@ -860,4 +862,19 @@ public void onAddFancyInformationTooltip(List tooltips) { public int getDefaultPaintingColor() { return getDefinition().getDefaultPaintingColor(); } + + @Override + public CompoundTag copyConfig(CompoundTag tag) { + return ICopyable.super.copyConfig(tag); + } + + @Override + public void pasteConfig(ServerPlayer player, CompoundTag tag) { + ICopyable.super.pasteConfig(player, tag); + } + + @Override + public List getItemsRequiredToPaste() { + return coverContainer.getItemsRequiredToPaste(); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java index 6a59c3ec4ec..618016bab5c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java @@ -37,7 +37,9 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraftforge.items.IItemHandler; @@ -544,4 +546,24 @@ public ItemStack extractItem(int slot, int amount, boolean simulate) { return simulate ? result : super.extractItem(slot, amount, false); } } + + @Override + public CompoundTag copyConfig(CompoundTag tag) { + tag.putInt("transferRate", getTransferRate()); + tag.putInt("io", getIo().ordinal()); + tag.putInt("distributionMode", getDistributionMode().ordinal()); + tag.putInt("manualIO", getManualIOMode().ordinal()); + tag.put("filter", filterHandler.getFilterItem().serializeNBT()); + return super.copyConfig(tag); + } + + @Override + public void pasteConfig(ServerPlayer player, CompoundTag tag) { + setTransferRate(tag.getInt("transferRate")); + setIo(IO.values()[tag.getInt("io")]); + setDistributionMode(DistributionMode.values()[tag.getInt("distributionMode")]); + setManualIOMode(ManualIOMode.values()[tag.getInt("manualIO")]); + filterHandler.setFilterItem(ItemStack.of(tag.getCompound("filter"))); + super.pasteConfig(player, tag); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java index 23ee3d9925e..b2365d8e23f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java @@ -20,6 +20,9 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; import net.minecraftforge.fluids.FluidStack; import lombok.Getter; @@ -133,4 +136,20 @@ public FluidStack drain(FluidStack resource, FluidAction action) { return super.drain(resource, action); } } + + @Override + public CompoundTag copyConfig(CompoundTag tag) { + tag.putInt("manualIO", getAllowFlow().ordinal()); + tag.putInt("filterMode", getFilterMode().ordinal()); + tag.put("filter", attachItem.serializeNBT()); + return super.copyConfig(tag); + } + + @Override + public void pasteConfig(ServerPlayer player, CompoundTag tag) { + setAllowFlow(ManualIOMode.values()[tag.getInt("manualIO")]); + setFilterMode(FilterMode.values()[tag.getInt("filterMode")]); + fluidFilter = FluidFilter.loadFilter(ItemStack.of(tag.getCompound("filter"))); + super.pasteConfig(player, tag); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java index 95e2058b9d5..7ceb44db136 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java @@ -18,6 +18,8 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerPlayer; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; @@ -255,4 +257,20 @@ private boolean shouldShowTransferSize() { return !this.filterHandler.getFilter().supportsAmounts(); } + + @Override + public CompoundTag copyConfig(CompoundTag tag) { + tag.putInt("transferMode", transferMode.ordinal()); + tag.putInt("transferLimit", globalTransferLimit); + tag.putInt("transferBucket", transferBucketMode.ordinal()); + return super.copyConfig(tag); + } + + @Override + public void pasteConfig(ServerPlayer player, CompoundTag tag) { + setTransferMode(TransferMode.values()[tag.getInt("transferMode")]); + globalTransferLimit = (tag.getInt("transferLimit")); + setTransferBucketMode(BucketMode.values()[tag.getInt("transferBucket")]); + super.pasteConfig(player, tag); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java index 9b22f097324..107de2a3ea8 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java @@ -22,6 +22,7 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; import net.minecraftforge.items.IItemHandlerModifiable; @@ -147,4 +148,20 @@ public FilteredItemHandlerWrapper(IItemHandlerModifiable delegate) { return simulate ? result : super.extractItem(slot, amount, false); } } + + @Override + public CompoundTag copyConfig(CompoundTag tag) { + tag.putInt("manualIO", getAllowFlow().ordinal()); + tag.putInt("filterMode", getFilterMode().ordinal()); + tag.put("filter", attachItem.serializeNBT()); + return super.copyConfig(tag); + } + + @Override + public void pasteConfig(ServerPlayer player, CompoundTag tag) { + setAllowFlow(ManualIOMode.values()[tag.getInt("manualIO")]); + setFilterMode(FilterMode.values()[tag.getInt("filterMode")]); + itemFilter = ItemFilter.loadFilter(ItemStack.of(tag.getCompound("filter"))); + super.pasteConfig(player, tag); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/MachineControllerCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/MachineControllerCover.java index 0dfee9a20ab..4e9299bfda2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/MachineControllerCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/MachineControllerCover.java @@ -27,6 +27,7 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.inventory.ClickType; import net.minecraft.world.inventory.Slot; @@ -297,4 +298,20 @@ private void updateCoverSlot() { sideCoverSlot.onContentsChanged(0); } } + + @Override + public CompoundTag copyConfig(CompoundTag tag) { + tag.putBoolean("inverted", isInverted); + tag.putInt("redstoneLvl", minRedstoneStrength); + tag.putBoolean("preventPowerfail", preventPowerFail); + return super.copyConfig(tag); + } + + @Override + public void pasteConfig(ServerPlayer player, CompoundTag tag) { + setInverted(tag.getBoolean("inverted")); + setMinRedstoneStrength(tag.getInt("redstoneLvl")); + preventPowerFail = tag.getBoolean("preventPowerfail"); + super.pasteConfig(player, tag); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java index 668fbbcef3f..00cc21e2c36 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java @@ -33,7 +33,9 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraftforge.fluids.FluidStack; @@ -399,4 +401,24 @@ public FluidStack drain(FluidStack resource, FluidAction action) { return super.drain(resource, action); } } + + @Override + public CompoundTag copyConfig(CompoundTag tag) { + tag.putInt("transferRate", getTransferRate()); + tag.putInt("io", getIo().ordinal()); + tag.putInt("manualIO", getManualIOMode().ordinal()); + tag.put("filter", filterHandler.getFilterItem().serializeNBT()); + tag.putInt("bucketMode", getBucketMode().ordinal()); + return super.copyConfig(tag); + } + + @Override + public void pasteConfig(ServerPlayer player, CompoundTag tag) { + setTransferRate(tag.getInt("transferRate")); + setIo(IO.values()[tag.getInt("io")]); + setManualIOMode(ManualIOMode.values()[tag.getInt("manualIO")]); + filterHandler.setFilterItem(ItemStack.of(tag.getCompound("filter"))); + setBucketMode(BucketMode.values()[tag.getInt("bucketMode")]); + super.pasteConfig(player, tag); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java index 3eaf9114e5f..76cd60fc8cb 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java @@ -17,6 +17,8 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; import net.minecraftforge.items.IItemHandler; @@ -221,4 +223,18 @@ private boolean shouldShowStackSize() { return !this.filterHandler.getFilter().supportsAmounts(); } + + @Override + public CompoundTag copyConfig(CompoundTag tag) { + tag.putInt("transferMode", transferMode.ordinal()); + tag.putInt("transferLimit", globalTransferLimit); + return super.copyConfig(tag); + } + + @Override + public void pasteConfig(ServerPlayer player, CompoundTag tag) { + setTransferMode(TransferMode.values()[tag.getInt("transferMode")]); + setGlobalTransferLimit(tag.getInt("transferLimit")); + super.pasteConfig(player, tag); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedEnergyDetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedEnergyDetectorCover.java index 49af8cf313a..25f753d1c09 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedEnergyDetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedEnergyDetectorCover.java @@ -20,6 +20,8 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerPlayer; import lombok.Getter; import lombok.Setter; @@ -189,4 +191,20 @@ private void initializeMinMaxInputs(boolean wasPercent) { } } } + + @Override + public CompoundTag copyConfig(CompoundTag tag) { + tag.putLong("min", minValue); + tag.putLong("max", maxValue); + tag.putBoolean("percent", usePercent); + return super.copyConfig(tag); + } + + @Override + public void pasteConfig(ServerPlayer player, CompoundTag tag) { + setMinValue(tag.getLong("min")); + setMaxValue(tag.getLong("max")); + setUsePercent(tag.getBoolean("percent")); + super.pasteConfig(player, tag); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java index 8c7a39cb50d..910d2fdc478 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java @@ -21,6 +21,8 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; import net.minecraftforge.fluids.FluidStack; @@ -153,4 +155,22 @@ public Widget createUIWidget() { return group; } + + @Override + public CompoundTag copyConfig(CompoundTag tag) { + tag.putInt("min", minValue); + tag.putInt("max", maxValue); + tag.putBoolean("latched", isLatched); + tag.put("filter", filterHandler.getFilterItem().serializeNBT()); + return super.copyConfig(tag); + } + + @Override + public void pasteConfig(ServerPlayer player, CompoundTag tag) { + setMinValue(tag.getInt("min")); + setMaxValue(tag.getInt("max")); + setLatched(tag.getBoolean("latched")); + filterHandler.setFilterItem(ItemStack.of(tag.getCompound("filter"))); + super.pasteConfig(player, tag); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java index ac1b1a4c3f7..252cbe915a7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java @@ -22,6 +22,8 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; import net.minecraftforge.items.IItemHandler; @@ -150,4 +152,22 @@ public Widget createUIWidget() { return group; } + + @Override + public CompoundTag copyConfig(CompoundTag tag) { + tag.putInt("min", minValue); + tag.putInt("max", maxValue); + tag.putBoolean("latched", isLatched); + tag.put("filter", filterHandler.getFilterItem().serializeNBT()); + return super.copyConfig(tag); + } + + @Override + public void pasteConfig(ServerPlayer player, CompoundTag tag) { + setMinValue(tag.getInt("min")); + setMaxValue(tag.getInt("max")); + setLatched(tag.getBoolean("latched")); + filterHandler.setFilterItem(ItemStack.of(tag.getCompound("filter"))); + super.pasteConfig(player, tag); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/DetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/DetectorCover.java index f141fee3b49..b03a02829fe 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/DetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/DetectorCover.java @@ -12,7 +12,9 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; @@ -103,4 +105,16 @@ public boolean canConnectRedstone() { public boolean canPipePassThrough() { return false; } + + @Override + public CompoundTag copyConfig(CompoundTag tag) { + tag.putBoolean("inverted", isInverted); + return super.copyConfig(tag); + } + + @Override + public void pasteConfig(ServerPlayer player, CompoundTag tag) { + setInverted(tag.getBoolean("inverted")); + super.pasteConfig(player, tag); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedFluidVoidingCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedFluidVoidingCover.java index a9da558c8f7..ea2c8bc8466 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedFluidVoidingCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedFluidVoidingCover.java @@ -19,6 +19,8 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerPlayer; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; @@ -186,4 +188,20 @@ private boolean shouldShowStackSize() { public ManagedFieldHolder getFieldHolder() { return MANAGED_FIELD_HOLDER; } + + @Override + public CompoundTag copyConfig(CompoundTag tag) { + tag.putInt("voidingMode", getVoidingMode().ordinal()); + tag.putInt("voidSize", getGlobalTransferSizeMillibuckets()); + tag.putInt("voidBucketMode", getTransferBucketMode().ordinal()); + return super.copyConfig(tag); + } + + @Override + public void pasteConfig(ServerPlayer player, CompoundTag tag) { + setVoidingMode(VoidingMode.values()[tag.getInt("voidingMode")]); + setTransferBucketMode(BucketMode.values()[tag.getInt("voidBucketMode")]); + setCurrentBucketModeTransferSize(tag.getInt("voidSize")); + super.pasteConfig(player, tag); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedItemVoidingCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedItemVoidingCover.java index 80d17cff6e5..b00bd9c5a41 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedItemVoidingCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedItemVoidingCover.java @@ -16,6 +16,8 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; import net.minecraftforge.items.IItemHandler; @@ -166,4 +168,18 @@ private boolean shouldShowStackSize() { public ManagedFieldHolder getFieldHolder() { return MANAGED_FIELD_HOLDER; } + + @Override + public CompoundTag copyConfig(CompoundTag tag) { + tag.putInt("voidingMode", getVoidingMode().ordinal()); + tag.putInt("voidSize", getGlobalVoidingLimit()); + return super.copyConfig(tag); + } + + @Override + public void pasteConfig(ServerPlayer player, CompoundTag tag) { + setVoidingMode(VoidingMode.values()[tag.getInt("voidingMode")]); + globalVoidingLimit = tag.getInt("voidSize"); + super.pasteConfig(player, tag); + } } 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 424ac52beee..64cac05549e 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.modules.ImageModuleBehaviour; import com.gregtechceu.gtceu.common.item.modules.TextModuleBehaviour; import com.gregtechceu.gtceu.common.item.tool.behavior.LighterBehavior; -import com.gregtechceu.gtceu.common.item.tool.behavior.MetaMachineConfigCopyBehaviour; +import com.gregtechceu.gtceu.common.item.tool.behavior.MachineConfigCopyBehaviour; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; import com.gregtechceu.gtceu.data.recipe.CustomTags; @@ -2180,7 +2180,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit .item("machine_memory_card", ComponentItem::create) .lang("Machine Memory Card") .properties(p -> p.stacksTo(1)) - .onRegister(attach(new MetaMachineConfigCopyBehaviour())) + .onRegister(attach(new MachineConfigCopyBehaviour())) .register(); public static final ItemEntry[] DYE_ONLY_ITEMS = new ItemEntry[DyeColor.values().length]; diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/MachineConfigCopyBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/MachineConfigCopyBehaviour.java new file mode 100644 index 00000000000..819d93e8102 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/MachineConfigCopyBehaviour.java @@ -0,0 +1,338 @@ +package com.gregtechceu.gtceu.common.item.tool.behavior; + +import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity; +import com.gregtechceu.gtceu.api.item.component.IAddInformation; +import com.gregtechceu.gtceu.api.item.component.IInteractionItem; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.feature.*; +import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; +import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; +import com.gregtechceu.gtceu.utils.GTTransferUtils; +import com.gregtechceu.gtceu.utils.GTUtil; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.network.chat.CommonComponents; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; + +import joptsimple.internal.Strings; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public class MachineConfigCopyBehaviour implements IInteractionItem, IAddInformation { + + private static final String NONE_DIRECTION = "null"; + private static final String CONFIG_DATA = "config_data"; + private static final String COPY_SOURCE = "copy_source"; + private static final String ITEMS_TO_PASTE = "items_to_paste"; + + private static final Component ENABLED = Component.translatable("behaviour.memory_card.enabled"); + private static final Component DISABLED = Component.translatable("behaviour.memory_card.disabled"); + private static final String[] DIRECTION_STRINGS = { "§eDown§r", "§eUp§r", "§eNorth§r", "§eSouth§r", "§eWest§r", + "§eEast§r" }; + + private static String directionToString(@Nullable Direction direction) { + if (direction == null) return NONE_DIRECTION; + return direction.getName(); + } + + private static @Nullable Direction stringToDirection(@Nullable String str) { + if (Strings.isNullOrEmpty(str) || NONE_DIRECTION.equalsIgnoreCase(str)) return null; + return Direction.byName(str); + } + + private static Component directionListComponent(int directions) { + List dirStrings = new ArrayList<>(); + if ((directions & (1)) > 0) dirStrings.add(DIRECTION_STRINGS[0]); + if ((directions & (1 << 1)) > 0) dirStrings.add(DIRECTION_STRINGS[1]); + if ((directions & (1 << 2)) > 0) dirStrings.add(DIRECTION_STRINGS[2]); + if ((directions & (1 << 3)) > 0) dirStrings.add(DIRECTION_STRINGS[3]); + if ((directions & (1 << 4)) > 0) dirStrings.add(DIRECTION_STRINGS[4]); + if ((directions & (1 << 5)) > 0) dirStrings.add(DIRECTION_STRINGS[5]); + return Component.literal(String.join(", ", dirStrings)); + } + + @Override + public InteractionResult onItemUseFirst(ItemStack stack, UseOnContext context) { + var blockEntity = context.getLevel().getBlockEntity(context.getClickedPos()); + var player = context.getPlayer(); + + if (player == null || player instanceof LocalPlayer) return InteractionResult.PASS; + if (blockEntity instanceof IMachineBlockEntity machineBlockEntity && + !MachineOwner.canOpenOwnerMachine(context.getPlayer(), machineBlockEntity.getMetaMachine())) + return InteractionResult.FAIL; + + if (context.isSecondaryUseActive()) { + + var configTag = stack.getOrCreateTagElement(CONFIG_DATA); + + if (blockEntity instanceof IMachineBlockEntity machineBlockEntity) { + configTag.putString(COPY_SOURCE, + (new ItemStack(blockEntity.getBlockState().getBlock().asItem())).getDisplayName().getString()); + configTag.merge(gatherMachineConfig(machineBlockEntity.getMetaMachine())); + + ListTag itemsTag = new ListTag(); + machineBlockEntity.getMetaMachine().getItemsRequiredToPaste() + .forEach(v -> itemsTag.add(v.serializeNBT())); + configTag.put(ITEMS_TO_PASTE, itemsTag); + } else if (blockEntity instanceof PipeBlockEntity pipeBE) { + configTag.putString(COPY_SOURCE, + (new ItemStack(blockEntity.getBlockState().getBlock().asItem())).getDisplayName().getString()); + configTag.merge(gatherPipeConfig(pipeBE)); + + ListTag itemsTag = new ListTag(); + pipeBE.getItemsRequiredToPaste().forEach(v -> itemsTag.add(v.serializeNBT())); + configTag.put(ITEMS_TO_PASTE, itemsTag); + } else { + stack.removeTagKey(CONFIG_DATA); + player.displayClientMessage(Component.translatable("behaviour.memory_card.client_msg.cleared"), true); + return InteractionResult.SUCCESS; + } + + player.displayClientMessage(Component.translatable("behaviour.memory_card.client_msg.copied"), true); + + } else { + var tag = stack.getTagElement(CONFIG_DATA); + if (tag == null) return InteractionResult.FAIL; + + List items = new ArrayList<>(); + tag.getList("itemsToPaste", CompoundTag.TAG_COMPOUND).forEach(t -> { + if (t instanceof CompoundTag c) items.add(ItemStack.of(c)); + }); + + if (!player.isCreative() && !GTTransferUtils.extractItemsFromPlayerInv(player, items, true)) { + player.displayClientMessage(Component.translatable("behaviour.memory_card.client_msg.missing_items"), + true); + return InteractionResult.FAIL; + } ; + if (!player.isCreative()) GTTransferUtils.extractItemsFromPlayerInv(player, items, false); + + if (blockEntity instanceof IMachineBlockEntity machineBlockEntity) + pasteMachineConfig((ServerPlayer) player, machineBlockEntity.getMetaMachine(), tag); + if (blockEntity instanceof PipeBlockEntity pipeBE) + pastePipeConfig((ServerPlayer) player, pipeBE, tag); + + player.displayClientMessage(Component.translatable("behaviour.memory_card.client_msg.pasted"), true); + + } + + return InteractionResult.SUCCESS; + } + + //// Logic for actual config options + + // NBT keys for machine config values + private static final String PIPE_CONNECTIONS = "pipe_connections"; + private static final String PIPE_BLOCKED_CONNECTIONS = "pipe_blocked_connections"; + + 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"; + + private static CompoundTag gatherPipeConfig(PipeBlockEntity pipe) { + var tag = new CompoundTag(); + + tag.putInt(PIPE_CONNECTIONS, pipe.getConnections()); + tag.putInt(PIPE_BLOCKED_CONNECTIONS, pipe.getBlockedConnections()); + + return tag; + } + + private static void pastePipeConfig(ServerPlayer player, PipeBlockEntity pipe, CompoundTag tag) { + if (tag.contains(PIPE_CONNECTIONS)) { + var connections = tag.getInt(PIPE_CONNECTIONS); + + for (var dir : GTUtil.DIRECTIONS) { + if (PipeBlockEntity.isConnected(connections, dir)) pipe.setConnection(dir, true, false); + } + + } + if (tag.contains(PIPE_BLOCKED_CONNECTIONS)) { + var blockedConnections = tag.getInt(PIPE_BLOCKED_CONNECTIONS); + + for (var dir : GTUtil.DIRECTIONS) { + if (PipeBlockEntity.isFaceBlocked(blockedConnections, dir)) pipe.setBlocked(dir, true); + } + + } + + pipe.getCoverContainer().pasteConfig(player, tag.getCompound(COVER)); + } + + private static CompoundTag gatherMachineConfig(MetaMachine machine) { + var tag = new CompoundTag(); + + tag.putString(FACING_DIR, directionToString(machine.getFrontFacing())); + + if (machine instanceof IAutoOutputItem autoOutputItem && autoOutputItem.getOutputFacingItems() != null) { + tag.putString(ITEM_OUTPUT_SIDE, directionToString(autoOutputItem.getOutputFacingItems())); + tag.putBoolean(ITEM_AUTO_OUTPUT, autoOutputItem.isAutoOutputItems()); + tag.putBoolean(ALLOW_ITEM_IN_FROM_OUT, autoOutputItem.isAllowInputFromOutputSideItems()); + } + + if (machine instanceof IAutoOutputFluid autoOutputFluid && autoOutputFluid.getOutputFacingFluids() != null) { + tag.putString(FLUID_OUTPUT_SIDE, directionToString(autoOutputFluid.getOutputFacingFluids())); + tag.putBoolean(FLUID_AUTO_OUTPUT, autoOutputFluid.isAutoOutputFluids()); + tag.putBoolean(ALLOW_FLUID_IN_FROM_OUT, autoOutputFluid.isAllowInputFromOutputSideFluids()); + } + + if (machine instanceof IMufflableMachine mufflableMachine) { + tag.putBoolean(MUFFLED, mufflableMachine.isMuffled()); + } + + if (machine instanceof IHasCircuitSlot circuitMachine) { + var circuit = IntCircuitBehaviour + .getCircuitConfiguration(circuitMachine.getCircuitInventory().getStackInSlot(0)); + if (circuitMachine.isCircuitSlotEnabled() && circuit != 0) { + tag.putInt(CIRCUIT, circuit); + } + } + + tag.put(COVER, machine.getCoverContainer().copyConfig(new CompoundTag())); + + tag = machine.copyConfig(tag); + + return tag; + } + + private static void pasteMachineConfig(ServerPlayer player, MetaMachine machine, CompoundTag tag) { + if (machine instanceof IAutoOutputItem autoOutputItem) { + if (tag.contains(ITEM_OUTPUT_SIDE)) + autoOutputItem.setOutputFacingItems(stringToDirection(tag.getString(ITEM_OUTPUT_SIDE))); + if (tag.contains(ITEM_AUTO_OUTPUT)) autoOutputItem.setAutoOutputItems(tag.getBoolean(ITEM_AUTO_OUTPUT)); + if (tag.contains(ALLOW_ITEM_IN_FROM_OUT)) + autoOutputItem.setAllowInputFromOutputSideItems(tag.getBoolean(ALLOW_ITEM_IN_FROM_OUT)); + } + + if (machine instanceof IAutoOutputFluid autoOutputFluid) { + if (tag.contains(FLUID_OUTPUT_SIDE)) + autoOutputFluid.setOutputFacingFluids(stringToDirection(tag.getString(FLUID_OUTPUT_SIDE))); + if (tag.contains(FLUID_AUTO_OUTPUT)) autoOutputFluid.setAutoOutputFluids(tag.getBoolean(FLUID_AUTO_OUTPUT)); + if (tag.contains(ALLOW_FLUID_IN_FROM_OUT)) + autoOutputFluid.setAllowInputFromOutputSideFluids(tag.getBoolean(ALLOW_FLUID_IN_FROM_OUT)); + } + + Direction facingDir = Direction.byName(tag.getString(FACING_DIR)); + if (facingDir != null) machine.setFrontFacing(facingDir); + + if (machine instanceof IMufflableMachine mufflableMachine) { + if (tag.contains(MUFFLED)) mufflableMachine.setMuffled(tag.getBoolean(MUFFLED)); + } + + if (machine instanceof IHasCircuitSlot circuitMachine) { + if (tag.contains(CIRCUIT)) + circuitMachine.getCircuitInventory().setStackInSlot(0, IntCircuitBehaviour.stack(tag.getInt(CIRCUIT))); + } + + machine.getCoverContainer().pasteConfig(player, tag.getCompound(COVER)); + + machine.pasteConfig(player, tag); + } + + private static void addConfigTooltips(List tooltip, CompoundTag tag) { + tooltip.add(Component.translatable("behaviour.memory_card.copy_target", tag.getString(COPY_SOURCE))); + tooltip.add(Component.empty()); + + if (tag.contains(PIPE_CONNECTIONS) && tag.getInt(PIPE_CONNECTIONS) != 0) + tooltip.add(Component.translatable("behaviour.setting.tooltip.pipe_connections", + directionListComponent(tag.getInt(PIPE_CONNECTIONS)))); + if (tag.contains(PIPE_BLOCKED_CONNECTIONS) && tag.getInt(PIPE_BLOCKED_CONNECTIONS) != 0) + tooltip.add(Component.translatable("behaviour.setting.tooltip.pipe_blocked_connections", + directionListComponent(tag.getInt(PIPE_BLOCKED_CONNECTIONS)))); + + if (tag.contains(ITEM_OUTPUT_SIDE) && tag.contains(ITEM_AUTO_OUTPUT) && tag.contains(ALLOW_ITEM_IN_FROM_OUT)) { + Component outputMode; + if (tag.getBoolean(ITEM_AUTO_OUTPUT) && tag.getBoolean(ALLOW_ITEM_IN_FROM_OUT)) + outputMode = Component.translatable("behaviour.setting.tooltip.auto_output_allow_input"); + else if (tag.getBoolean(ITEM_AUTO_OUTPUT)) + outputMode = Component.translatable("behaviour.setting.tooltip.auto_output"); + else if (tag.getBoolean(ALLOW_ITEM_IN_FROM_OUT)) + outputMode = Component.translatable("behaviour.setting.tooltip.allow_input"); + else outputMode = Component.empty(); + + Direction dir = stringToDirection(tag.getString(ITEM_OUTPUT_SIDE)); + if (dir == null) return; + + tooltip.add(Component.translatable("behaviour.setting.tooltip.item_io", + Component.literal(DIRECTION_STRINGS[dir.ordinal()]), outputMode)); + } + + if (tag.contains(FLUID_OUTPUT_SIDE) && tag.contains(FLUID_AUTO_OUTPUT) && + tag.contains(ALLOW_FLUID_IN_FROM_OUT)) { + Component outputMode; + if (tag.getBoolean(FLUID_AUTO_OUTPUT) && tag.getBoolean(ALLOW_FLUID_IN_FROM_OUT)) + outputMode = Component.translatable("behaviour.setting.tooltip.auto_output_allow_input"); + else if (tag.getBoolean(FLUID_AUTO_OUTPUT)) + outputMode = Component.translatable("behaviour.setting.tooltip.auto_output"); + else if (tag.getBoolean(ALLOW_FLUID_IN_FROM_OUT)) + outputMode = Component.translatable("behaviour.setting.tooltip.allow_input"); + else outputMode = Component.empty(); + + Direction dir = stringToDirection(tag.getString(FLUID_OUTPUT_SIDE)); + if (dir == null) return; + + tooltip.add(Component.translatable("behaviour.setting.tooltip.fluid_io", + Component.literal(DIRECTION_STRINGS[dir.ordinal()]), outputMode)); + } + + if (tag.contains(MUFFLED)) tooltip.add(Component.translatable("behaviour.setting.tooltip.muffled", + tag.getBoolean(MUFFLED) ? ENABLED : DISABLED)); + if (tag.contains(CIRCUIT)) tooltip.add(Component.translatable("behaviour.setting.tooltip.circuit_config") + .append(Component.literal(Integer.toString(tag.getInt(CIRCUIT))).withStyle(ChatFormatting.YELLOW))); + + if (tag.contains("itemsToPaste")) { + List items = new ArrayList<>(); + tag.getList("itemsToPaste", CompoundTag.TAG_COMPOUND).forEach(t -> { + if (t instanceof CompoundTag c) items.add(ItemStack.of(c)); + }); + + if (items.isEmpty()) return; + + tooltip.add(Component.empty()); + tooltip.add(Component.translatable("behaviour.memory_card.tooltip.items_to_paste")); + + for (var item : items) { + tooltip.add(Component.literal("- " + item.getCount() + "x ").append(item.getDisplayName()) + .withStyle(ChatFormatting.DARK_GREEN)); + } + } + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltipComponents, + TooltipFlag isAdvanced) { + tooltipComponents.add(Component.translatable("behaviour.memory_card.tooltip.copy")); + tooltipComponents.add(Component.translatable("behaviour.memory_card.tooltip.paste")); + CompoundTag data = stack.getTagElement(CONFIG_DATA); + if (data == null) return; + if (Screen.hasShiftDown()) { + tooltipComponents.add(CommonComponents.EMPTY); + addConfigTooltips(tooltipComponents, data); + } else { + tooltipComponents.add(Component.translatable("behaviour.memory_card.tooltip.view_stored")); + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/MetaMachineConfigCopyBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/MetaMachineConfigCopyBehaviour.java deleted file mode 100644 index 2d52bb34cec..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/MetaMachineConfigCopyBehaviour.java +++ /dev/null @@ -1,216 +0,0 @@ -package com.gregtechceu.gtceu.common.item.tool.behavior; - -import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; -import com.gregtechceu.gtceu.api.item.component.IAddInformation; -import com.gregtechceu.gtceu.api.item.component.IInteractionItem; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; -import com.gregtechceu.gtceu.api.machine.feature.IMufflableMachine; -import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; -import com.gregtechceu.gtceu.api.registry.GTRegistries; -import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; - -import net.minecraft.ChatFormatting; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NumericTag; -import net.minecraft.nbt.StringTag; -import net.minecraft.nbt.Tag; -import net.minecraft.network.chat.CommonComponents; -import net.minecraft.network.chat.Component; -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.TooltipFlag; -import net.minecraft.world.item.context.UseOnContext; -import net.minecraft.world.level.Level; - -import it.unimi.dsi.fastutil.booleans.BooleanConsumer; -import joptsimple.internal.Strings; -import org.jetbrains.annotations.Nullable; - -import java.util.List; -import java.util.function.Consumer; - -public class MetaMachineConfigCopyBehaviour implements IInteractionItem, IAddInformation { - - public static final String NONE_DIRECTION = "null"; - - public static final String CONFIG_DATA = "config_data"; - public static final String ORIGINAL_FRONT = "front"; - public static final String ITEM_CONFIG = "item"; - public static final String FLUID_CONFIG = "fluid"; - public static final String DIRECTION = "direction"; - public static final String AUTO = "auto"; - public static final String INPUT_FROM_OUTPUT_SIDE = "in_from_out"; - public static final String MUFFLED = "muffled"; - - public static final Component ENABLED = Component.translatable("cover.voiding.label.enabled") - .withStyle(ChatFormatting.GREEN); - public static final Component DISABLED = Component.translatable("cover.voiding.label.disabled") - .withStyle(ChatFormatting.RED); - - public static final Component[] DIRECTION_TOOLTIPS = { - Component.translatable("gtceu.direction.tooltip.up").withStyle(ChatFormatting.YELLOW), - Component.translatable("gtceu.direction.tooltip.down").withStyle(ChatFormatting.YELLOW), - Component.translatable("gtceu.direction.tooltip.left").withStyle(ChatFormatting.YELLOW), - Component.translatable("gtceu.direction.tooltip.right").withStyle(ChatFormatting.YELLOW), - Component.translatable("gtceu.direction.tooltip.front").withStyle(ChatFormatting.YELLOW), - Component.translatable("gtceu.direction.tooltip.back").withStyle(ChatFormatting.YELLOW), - }; - - public static String directionToString(@Nullable Direction direction) { - if (direction == null) return NONE_DIRECTION; - return direction.getSerializedName(); - } - - public static @Nullable Direction tagToDirection(@Nullable Tag tag) { - if (tag instanceof StringTag string) { - String name = string.getAsString(); - if (Strings.isNullOrEmpty(name) || NONE_DIRECTION.equalsIgnoreCase(name)) return null; - return Direction.byName(name); - } else if (tag instanceof NumericTag number) { - // backwards compatibility - int ordinal = number.getAsInt(); - return ordinal <= 0 || ordinal > Direction.values().length ? null : Direction.values()[ordinal - 1]; - } - return null; - } - - public static Component relativeDirectionComponent(Direction origFront, Direction origDirection) { - RelativeDirection relative = RelativeDirection.findRelativeOf(origFront, origDirection); - return DIRECTION_TOOLTIPS[relative.ordinal()]; - } - - @Override - public InteractionResultHolder use(Item item, Level level, Player player, InteractionHand usedHand) { - var stack = player.getItemInHand(usedHand); - if (player.isShiftKeyDown()) { - stack.removeTagKey(CONFIG_DATA); - return InteractionResultHolder.success(stack); - } - return IInteractionItem.super.use(item, level, player, usedHand); - } - - @Override - public InteractionResult onItemUseFirst(ItemStack stack, UseOnContext context) { - // spotless:off - if (context.getLevel().getBlockEntity(context.getClickedPos()) instanceof IMachineBlockEntity blockEntity) { - var machine = blockEntity.getMetaMachine(); - if (!MachineOwner.canOpenOwnerMachine(context.getPlayer(), machine)) { - return InteractionResult.FAIL; - } - if (context.isSecondaryUseActive()) { - return handleCopy(stack, machine); - } else if (stack.getTagElement(CONFIG_DATA) != null) { - return handlePaste(stack, machine); - } - } else if (context.isSecondaryUseActive() && context.getLevel().getBlockState(context.getClickedPos()).isAir()) { - stack.removeTagKey(CONFIG_DATA); - return InteractionResult.SUCCESS; - } - // spotless:on - return InteractionResult.SUCCESS; - } - - public static InteractionResult handleCopy(ItemStack stack, MetaMachine machine) { - CompoundTag configData = new CompoundTag(); - configData.putString(ORIGINAL_FRONT, directionToString(machine.getFrontFacing())); - if (machine instanceof IAutoOutputItem autoOutputItem && autoOutputItem.getOutputFacingItems() != null) { - configData.put(ITEM_CONFIG, copyOutputConfig(autoOutputItem.getOutputFacingItems(), - autoOutputItem.isAutoOutputItems(), autoOutputItem.isAllowInputFromOutputSideItems())); - } - if (machine instanceof IAutoOutputFluid autoOutputFluid && autoOutputFluid.getOutputFacingFluids() != null) { - configData.put(FLUID_CONFIG, copyOutputConfig(autoOutputFluid.getOutputFacingFluids(), - autoOutputFluid.isAutoOutputFluids(), autoOutputFluid.isAllowInputFromOutputSideFluids())); - } - if (machine instanceof IMufflableMachine mufflableMachine) { - configData.putBoolean(MUFFLED, mufflableMachine.isMuffled()); - } - if (!configData.isEmpty()) { - stack.getOrCreateTag().put(CONFIG_DATA, configData); - } - return InteractionResult.SUCCESS; - } - - public static InteractionResult handlePaste(ItemStack stack, MetaMachine machine) { - CompoundTag configData = stack.getTagElement(CONFIG_DATA); - if (configData == null) return InteractionResult.PASS; - Direction originalFront = tagToDirection(configData.get(ORIGINAL_FRONT)); - if (configData.contains(ITEM_CONFIG) && machine instanceof IAutoOutputItem autoOutputItem) { - pasteOutputConfig(originalFront, machine.getFrontFacing(), configData.getCompound(ITEM_CONFIG), - autoOutputItem::setOutputFacingItems, autoOutputItem::setAutoOutputItems, - autoOutputItem::setAllowInputFromOutputSideItems); - } - if (configData.contains(FLUID_CONFIG) && machine instanceof IAutoOutputFluid autoOutputFluid) { - pasteOutputConfig(originalFront, machine.getFrontFacing(), configData.getCompound(FLUID_CONFIG), - autoOutputFluid::setOutputFacingFluids, autoOutputFluid::setAutoOutputFluids, - autoOutputFluid::setAllowInputFromOutputSideFluids); - } - if (configData.contains(MUFFLED) && machine instanceof IMufflableMachine mufflableMachine) { - mufflableMachine.setMuffled(configData.getBoolean(MUFFLED)); - } - return InteractionResult.SUCCESS; - } - - @Override - public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltipComponents, - TooltipFlag isAdvanced) { - tooltipComponents.add(Component.translatable("behaviour.meta.machine.config.copy.tooltip")); - tooltipComponents.add(Component.translatable("behaviour.meta.machine.config.paste.tooltip")); - CompoundTag data = stack.getTagElement(CONFIG_DATA); - if (data == null) return; - if (Screen.hasShiftDown()) { - tooltipComponents.add(CommonComponents.EMPTY); - if (data.contains(ORIGINAL_FRONT)) { - var origFront = tagToDirection(data.get(ORIGINAL_FRONT)); - for (RecipeCapability cap : GTRegistries.RECIPE_CAPABILITIES) { - if (!data.contains(cap.name)) continue; - var configData = data.getCompound(cap.name); - var component = cap.getColoredName(); - addConfigTypeTooltips(tooltipComponents, component, configData, origFront); - } - } - if (data.contains(MUFFLED)) { - tooltipComponents.add(Component.translatable("behaviour.setting.muffled.tooltip", - data.getBoolean(MUFFLED) ? ENABLED : DISABLED)); - } - } else { - tooltipComponents.add(Component.translatable("item.toggle.advanced.info.tooltip")); - } - } - - private static void addConfigTypeTooltips(List tooltip, Component baseComponent, - CompoundTag data, Direction origFront) { - tooltip.add(Component.translatable("behaviour.setting.output.direction.tooltip", - baseComponent, relativeDirectionComponent(origFront, tagToDirection(data.get(DIRECTION))))); - tooltip.add(Component.translatable("behaviour.setting.item_auto_output.tooltip", baseComponent, - data.getBoolean(AUTO) ? ENABLED : DISABLED)); - tooltip.add(Component.translatable("behaviour.setting.allow.input.from.output.tooltip", baseComponent, - data.getBoolean(INPUT_FROM_OUTPUT_SIDE) ? ENABLED : DISABLED)); - } - - private static CompoundTag copyOutputConfig(Direction outputSide, boolean autoOutput, - boolean allowInputFromOutputSide) { - CompoundTag tag = new CompoundTag(); - tag.putString(DIRECTION, directionToString(outputSide)); - tag.putBoolean(AUTO, autoOutput); - tag.putBoolean(INPUT_FROM_OUTPUT_SIDE, allowInputFromOutputSide); - return tag; - } - - private static void pasteOutputConfig(Direction originalFront, Direction currentFront, CompoundTag data, - Consumer outputSide, BooleanConsumer autoOutput, - BooleanConsumer allowInputFromOutputSide) { - outputSide.accept(RelativeDirection.getActualDirection(originalFront, currentFront, - tagToDirection(data.get(DIRECTION)))); - autoOutput.accept(data.getBoolean(AUTO)); - allowInputFromOutputSide.accept(data.getBoolean(INPUT_FROM_OUTPUT_SIDE)); - } -} 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 e319eb4f605..499cc8a63e5 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -723,13 +723,30 @@ public static void init(RegistrateLangProvider provider) { 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("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: "); 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/java/com/gregtechceu/gtceu/utils/GTTransferUtils.java b/src/main/java/com/gregtechceu/gtceu/utils/GTTransferUtils.java index fe92a2311c6..9df9137d39e 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/GTTransferUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/GTTransferUtils.java @@ -5,6 +5,8 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.world.ContainerHelper; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; @@ -306,4 +308,17 @@ public static ItemStack insertToEmpty(IItemHandler handler, ItemStack stack, boo } return stack; } + + public static boolean extractItemsFromPlayerInv(Player player, List items, boolean simulate) { + var inventory = player.getInventory(); + + for (var stack : items) { + var found = ContainerHelper.clearOrCountMatchingItems(inventory, (s) -> s.is(stack.getItem()), + stack.getCount(), simulate); + if (found != stack.getCount()) return false; + } + + if (!simulate) player.inventoryMenu.broadcastChanges(); + return true; + } } From a2a7a6f343133a133ea0de87abaab6d8e0015478 Mon Sep 17 00:00:00 2001 From: Conity Date: Thu, 15 Jan 2026 01:32:56 +0900 Subject: [PATCH 15/28] Fixed Multi Smelter texture again. (#4469) --- .../multi_furnace/overlay_front_paused.png | Bin 504 -> 541 bytes .../overlay_front_paused_emissive.png | Bin 184 -> 245 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/multi_furnace/overlay_front_paused.png b/src/main/resources/assets/gtceu/textures/block/multiblock/multi_furnace/overlay_front_paused.png index 9e2e8ef079bb73d7098002d0c6d9bcf6ff26cfb6..46fd9063861a260a3eb8758503df7da3d6cdd0a1 100644 GIT binary patch delta 515 zcmV+e0{s2>1DynrB!ALLL_t(|oTO6AD@0Kk|J^}~xnqV=Lt)H9%wiN%@-8W{QXUH> zk77ZxkcEGMtUVTNNLE%-EGXrJlWd$D`nF21cDIa;r>p!ou(rXOG8& z+}yn11rjVW_kWEo{y#BhBH!(dvQl zL^F(@&}iQN(jE%StD+T<2b10FxL~i~dIjg~XW;4_aD2Wnj<9(gaQp_eB0@DA8wR5n7iaO1l`&y-hnn8_vCJO-04k(1vi;vv>VfgHC7 z1;v#jsX0tfrNw_i!awl^00960@`}@P00006NklS delta 478 zcmV<40U`dK1o#7xB!8_*L_t(|oTO1ZOM+1tew3#2Gm8clDsu>RFfbw1EQla#3c763 z1)3rnqM<)fG*?S4MKn1@P(wjbnv0VJIazs0BJlR9ZC&0Y=esD?-~-?HyyrdddC&7c zrwI+BiGI^-lV6ph2(gfd&}v{@3uT^StHXi4ja`kF66|oS0DqyR2hyL6`G<@KeIBor zr#01@JFT(;)>ROYe7V8lwtVaICSYiHBXn{NT}umYPa}BG0%J>dsYY8X)!HS0gi^VT z@s$}C)8Tlcn%5Z&Y6Tp;KnY!I8{?@}H*2Vbq(Br!M9+Zr9Sa5=Ri-r|uyw%L>2$(o zv)4Ch)(gyo!GC!Rg2&G)Civz?8Q+J)h{YbOqviAR2<#Pp6lk>_7+UN=<)aMOtbCJR z-vf8HLK@*MmO?NXVo7qE zWT%n|CY?Lanf6o-dL2%M`#UR`ILd*CYQK5 zSbexba)XO|a;AaI5YxjXl{ch{MVd1Wit=M~upA>B{RRI5u~K$Vuw6svth&><3X3cB z=Q(o_MG#tOYB}6PLvsg>>pEKY2DQpVUH;$^?*IS*|Nj-n#Q*>R00v1!K~w_(B`Z0m TB&QYx00000NkvXXu0mjfCYN1L delta 156 zcmey$xPx(mN`0=Ui(^Q|oHvtp^EMdpxSS74Td-t75(C$>gn(xWEUQGec&sVtU`kYF zOlfUWTJQPf{AOMuVIYGIWHGZS!$c-o`9pOP8bBciPgg&e IbxsLQ07#QO<^TWy From 6c6c2fdc4de56e3dd8d6a67ab1c2af0a322d386a Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Wed, 14 Jan 2026 18:40:14 +0200 Subject: [PATCH 16/28] Add "type: tests" to the set of required labels that pass the check (#4466) --- .github/workflows/manage-pr-labels.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/manage-pr-labels.yml b/.github/workflows/manage-pr-labels.yml index d958382cf45..80c2e0c3f0f 100644 --- a/.github/workflows/manage-pr-labels.yml +++ b/.github/workflows/manage-pr-labels.yml @@ -30,7 +30,7 @@ jobs: with: mode: minimum count: 1 - labels: 'type: feature, type: bugfix, type: refactor, type: translation, ignore changelog' + labels: 'type: feature, type: bugfix, type: refactor, type: translation, type: tests, ignore changelog' exit_type: failure - name: Check for Required Release Label # require exactly one of these labels From 7ac9e802be3fa9ce67fc1df74fdef82c324da099 Mon Sep 17 00:00:00 2001 From: toapuro <164835903+toapuro@users.noreply.github.com> Date: Thu, 15 Jan 2026 01:42:48 +0900 Subject: [PATCH 17/28] Distribute display voltage logic to machine implementations (#4459) --- .../api/machine/SimpleGeneratorMachine.java | 5 +++++ .../gtceu/api/machine/SimpleTieredMachine.java | 9 +++++++++ .../machine/feature/IRecipeLogicMachine.java | 9 +++++++++ .../WorkableElectricMultiblockMachine.java | 6 ++++++ .../jade/provider/RecipeLogicProvider.java | 17 +++-------------- 5 files changed, 32 insertions(+), 14 deletions(-) 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 d61cafe6651..cd5e78ea95c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java @@ -126,6 +126,11 @@ public void afterWorking() { spreadEnvironmentalHazard(); } + @Override + public long getDisplayRecipeVoltage() { + return GTValues.V[this.tier]; + } + ////////////////////////////////////// // *********** GUI ***********// ////////////////////////////////////// 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 23a5ae17609..f7b9f2e3c68 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java @@ -310,6 +310,15 @@ public void onMachineRemoved() { } } + /// ////////////////////////////////// + // ****** RECIPE LOGIC *******// + /// ////////////////////////////////// + + @Override + public long getDisplayRecipeVoltage() { + return GTValues.V[this.tier]; + } + ////////////////////////////////////// // *********** GUI ***********// ////////////////////////////////////// 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 6a9f7078a3a..ef5d3cc0b4d 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 @@ -8,6 +8,7 @@ import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.integration.jade.provider.RecipeLogicProvider; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -126,6 +127,14 @@ default boolean shouldWorkingPlaySound() { (!(self() instanceof IMufflableMachine mufflableMachine) || !mufflableMachine.isMuffled()); } + /** + * Display recipe voltage used by {@link RecipeLogicProvider} + */ + + default long getDisplayRecipeVoltage() { + return -1; + } + ////////////////////////////////////// // ******* IWorkable ********// ////////////////////////////////////// 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 75b981890c6..f05177efe83 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 @@ -276,6 +276,12 @@ public long getMaxVoltage() { } } + @Override + public long getDisplayRecipeVoltage() { + return Math.max(this.getEnergyContainer().getHighestInputVoltage(), + this.getEnergyContainer().getOutputVoltage()); + } + /** * Is this multiblock a generator? * Used for max voltage calculations. diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeLogicProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeLogicProvider.java index da6dc336a46..f3541c0813a 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeLogicProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeLogicProvider.java @@ -4,9 +4,6 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; -import com.gregtechceu.gtceu.api.machine.SimpleGeneratorMachine; -import com.gregtechceu.gtceu.api.machine.SimpleTieredMachine; -import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.machine.steam.SimpleSteamMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; @@ -62,18 +59,10 @@ protected void write(CompoundTag data, RecipeLogic capability) { } public static long getVoltage(RecipeLogic capability) { - long voltage = -1; - if (capability.machine instanceof SimpleTieredMachine machine) { - voltage = GTValues.V[machine.getTier()]; - } else if (capability.machine instanceof SimpleGeneratorMachine machine) { - voltage = GTValues.V[machine.getTier()]; - } else if (capability.machine instanceof WorkableElectricMultiblockMachine machine) { - voltage = Math.max(machine.getEnergyContainer().getHighestInputVoltage(), - machine.getEnergyContainer().getOutputVoltage()); - } + long voltage = capability.machine.getDisplayRecipeVoltage(); + // default display as LV, this shouldn't happen because a machine is either electric or steam - if (voltage == -1) voltage = 32; - return voltage; + return voltage == -1 ? GTValues.V[GTValues.LV] : voltage; } @Override From 4d3bb049b34a78fd169f1fb81891c80760f675f6 Mon Sep 17 00:00:00 2001 From: Haze Date: Wed, 14 Jan 2026 11:43:19 -0500 Subject: [PATCH 18/28] Terminal tooltip change to ensure consistent terminology (#4458) --- src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 65059797241..9b47bcbb63f 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java @@ -350,7 +350,7 @@ private static void initItemTooltips(RegistrateLangProvider provider) { 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.terminal.tooltip", - "Shift + R-Click on a controller to automatically build the multi-block"); + "Shift + R-Click on a controller to automatically build a multiblock with items from your inventory"); provider.add("item.gtceu.sus_record.desc", "§7sussy!"); } From 27f5082aa98ac88b56e6b441f0f424cb7ab72624 Mon Sep 17 00:00:00 2001 From: zetrock1 <144679746+zetrock1@users.noreply.github.com> Date: Wed, 14 Jan 2026 20:02:26 +0300 Subject: [PATCH 19/28] Add Hotkey for StepAssist (#4291) --- .../resources/assets/gtceu/lang/en_us.json | 17 ++++--- .../common/item/armor/NanoMuscleSuite.java | 45 +++++++++++++------ .../common/item/armor/QuarkTechSuite.java | 31 ++++++++----- .../gtceu/data/lang/LangHandler.java | 9 +++- .../gtceu/forge/ForgeCommonEventListener.java | 4 +- .../gtceu/utils/input/SyncedKeyMappings.java | 3 ++ 6 files changed, 77 insertions(+), 32 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 17fc2bf2fc4..ea5b1919eef 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -2608,6 +2608,7 @@ "gtceu.key.enable_boots": "Enable Boosted Jump", "gtceu.key.enable_jetpack": "Enable Jetpack", "gtceu.key.tool_aoe_change": "Tool AoE Mode Switch", + "gtceu.key.enable_step_assist": "Enable StepAssist", "gtceu.large_boiler": "Large Boiler", "gtceu.large_chemical_reactor": "Large Chemical Reactor", "gtceu.laser_engraver": "Laser Engraver", @@ -5684,20 +5685,26 @@ "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.message.step_assist.disabled": "StepAssist: §cOff", + "metaarmor.message.step_assist.enabled": "StepAssist: §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.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.nms.step_assist.disabled": "NanoMuscle™ Suite: StepAssist Disabled", + "metaarmor.nms.step_assist.enabled": "NanoMuscle™ Suite: StepAssist Enabled", + "metaarmor.qts.step_assist.disabled": "QuarkTech™ Suite: StepAssist Disabled", + "metaarmor.qts.step_assist.enabled": "QuarkTech™ Suite: StepAssist Enabled", + "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.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.boosted_jump.disabled": "QuarkTech™ Suite: Jump Boost Disabled", + "metaarmor.qts.boosted_jump.enabled": "QuarkTech™ Suite: Jump Boost Enabled", "metaarmor.tooltip.autoeat": "Replenishes Food Bar by Using Food from Inventory", "metaarmor.tooltip.breath": "Replenishes Underwater Breath Bar", "metaarmor.tooltip.burning": "Nullifies Burning", 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 b3c62d5c22c..546c6a24ccb 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 @@ -51,19 +51,36 @@ public void onArmorTick(Level world, Player player, ItemStack itemStack) { return; } CompoundTag data = itemStack.getOrCreateTag(); - byte toggleTimer = data.contains("toggleTimer") ? data.getByte("toggleTimer") : 0; - int nightVisionTimer = data.contains("nightVisionTimer") ? data.getInt("nightVisionTimer") : - ArmorUtils.NIGHTVISION_DURATION; + + byte toggleStepTimer = data.getByte("toggleStepTimer"); + if (type == ArmorItem.Type.BOOTS) { + boolean stepAssist = data.contains("stepAssist") && data.getBoolean("stepAssist"); + if (toggleStepTimer == 0 && SyncedKeyMappings.STEP_ASSIST_ENABLE.isKeyDown(player)) { + stepAssist = !stepAssist; + toggleStepTimer = 5; + if (world.isClientSide()) player.displayClientMessage(Component + .translatable("metaarmor.nms.step_assist." + (stepAssist ? "enabled" : "disabled")), true); + data.putBoolean("stepAssist", stepAssist); + } + + if (toggleStepTimer > 0) toggleStepTimer--; + data.putInt("toggleStepTimer", toggleStepTimer); + } + if (type == ArmorItem.Type.HELMET) { + byte toggleTimer = data.contains("toggleTimer") ? data.getByte("toggleTimer") : 0; + int nightVisionTimer = data.contains("nightVisionTimer") ? data.getInt("nightVisionTimer") : + ArmorUtils.NIGHTVISION_DURATION; boolean nightVision = data.contains("nightVision") && data.getBoolean("nightVision"); if (toggleTimer == 0 && SyncedKeyMappings.ARMOR_MODE_SWITCH.isKeyDown(player)) { nightVision = !nightVision; toggleTimer = 5; if (item.getCharge() < ArmorUtils.MIN_NIGHTVISION_CHARGE) { nightVision = false; - player.displayClientMessage(Component.translatable("metaarmor.nms.nightvision.error"), true); + if (world.isClientSide()) + player.displayClientMessage(Component.translatable("metaarmor.nms.nightvision.error"), true); } else { - player.displayClientMessage(Component + if (world.isClientSide()) player.displayClientMessage(Component .translatable("metaarmor.nms.nightvision." + (nightVision ? "enabled" : "disabled")), true); } } @@ -81,14 +98,11 @@ public void onArmorTick(Level world, Player player, ItemStack itemStack) { player.removeEffect(MobEffects.NIGHT_VISION); } data.putBoolean("nightVision", nightVision); - + if (nightVisionTimer > 0) nightVisionTimer--; + if (toggleTimer > 0) toggleTimer--; + data.putInt("nightVisionTimer", nightVisionTimer); + data.putByte("toggleTimer", toggleTimer); } - - if (nightVisionTimer > 0) nightVisionTimer--; - if (toggleTimer > 0) toggleTimer--; - - data.putInt("nightVisionTimer", nightVisionTimer); - data.putByte("toggleTimer", toggleTimer); } public static void disableNightVision(@NotNull Level world, Player player, boolean sendMsg) { @@ -163,8 +177,9 @@ public void drawHUD(ItemStack item, GuiGraphics guiGraphics) { @Override public void addInfo(ItemStack itemStack, List lines) { super.addInfo(itemStack, lines); + CompoundTag nbtData = itemStack.getOrCreateTag(); if (type == ArmorItem.Type.HELMET) { - CompoundTag nbtData = itemStack.getOrCreateTag(); + boolean nv = nbtData.getBoolean("nightVision"); if (nv) { lines.add(Component.translatable("metaarmor.message.nightvision.enabled")); @@ -172,7 +187,9 @@ public void addInfo(ItemStack itemStack, List lines) { lines.add(Component.translatable("metaarmor.message.nightvision.disabled")); } } else if (type == ArmorItem.Type.BOOTS) { - lines.add(Component.translatable("metaarmor.tooltip.stepassist")); + if (nbtData.getBoolean("stepAssist")) + lines.add(Component.translatable("metaarmor.message.step_assist.enabled")); + else lines.add(Component.translatable("metaarmor.message.step_assist.disabled")); lines.add(Component.translatable("metaarmor.tooltip.falldamage")); } } 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 c0faac5aed3..4c245423a1c 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 @@ -77,7 +77,7 @@ public void onArmorTick(Level world, Player player, ItemStack itemStack) { int nightVisionTimer = data.contains("nightVisionTimer") ? data.getInt("nightVisionTimer") : ArmorUtils.NIGHTVISION_DURATION; byte runningTimer = data.contains("runningTimer") ? data.getByte("runningTimer") : RUNNING_TIMER; - byte boostedJumpTimer = data.contains("boostedJumpTimer") ? data.getByte("boostedJumpTimer") : JUMPING_TIMER; + byte toggleBootsTimer = data.contains("toggleBootsTimer") ? data.getByte("toggleBootsTimer") : JUMPING_TIMER; if (!player.getItemBySlot(EquipmentSlot.CHEST).is(GTItems.QUANTUM_CHESTPLATE.get()) && !player.getItemBySlot(EquipmentSlot.CHEST).is(GTItems.QUANTUM_CHESTPLATE_ADVANCED.get())) { @@ -98,10 +98,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("metaarmor.qts.nightvision.error"), true); } else { player.displayClientMessage(Component - .translatable("metaarmor.nms.nightvision." + (nightVision ? "enabled" : "disabled")), true); + .translatable("metaarmor.qts.nightvision." + (nightVision ? "enabled" : "disabled")), true); } } @@ -162,11 +162,11 @@ public void onArmorTick(Level world, Player player, ItemStack itemStack) { boolean canUseEnergy = item.canUse(energyPerUse / 100); boolean jumping = SyncedKeyMappings.VANILLA_JUMP.isKeyDown(player); boolean boostedJump = data.contains("boostedJump") && data.getBoolean("boostedJump"); - if (boostedJumpTimer == 0 && SyncedKeyMappings.BOOTS_ENABLE.isKeyDown(player)) { + if (toggleBootsTimer == 0 && SyncedKeyMappings.BOOTS_ENABLE.isKeyDown(player)) { boostedJump = !boostedJump; - boostedJumpTimer = JUMPING_TIMER; + toggleBootsTimer = JUMPING_TIMER; player.displayClientMessage(Component - .translatable("metaarmor.nms.boosted_jump." + (boostedJump ? "enabled" : "disabled")), true); + .translatable("metaarmor.qts.boosted_jump." + (boostedJump ? "enabled" : "disabled")), true); } if (boostedJump) { if (!world.isClientSide) { @@ -199,11 +199,19 @@ public void onArmorTick(Level world, Player player, ItemStack itemStack) { } } } - data.putBoolean("boostedJump", boostedJump); - if (boostedJumpTimer > 0) boostedJumpTimer--; + boolean stepAssist = data.contains("stepAssist") && data.getBoolean("stepAssist"); + if (toggleBootsTimer == 0 && SyncedKeyMappings.STEP_ASSIST_ENABLE.isKeyDown(player)) { + stepAssist = !stepAssist; + toggleBootsTimer = 5; + if (world.isClientSide()) player.displayClientMessage(Component + .translatable("metaarmor.qts.step_assist." + (stepAssist ? "enabled" : "disabled")), true); + data.putBoolean("stepAssist", stepAssist); + } - data.putInt("boostedJumpTimer", boostedJumpTimer); + data.putBoolean("boostedJump", boostedJump); + if (toggleBootsTimer > 0) toggleBootsTimer--; + data.putInt("toggleBootsTimer", toggleBootsTimer); } if (ret) { @@ -357,7 +365,10 @@ public void addInfo(ItemStack itemStack, List lines) { } else if (type == ArmorItem.Type.LEGGINGS) { lines.add(Component.translatable("metaarmor.tooltip.speed")); } else if (type == ArmorItem.Type.BOOTS) { - lines.add(Component.translatable("metaarmor.tooltip.stepassist")); + CompoundTag nbtData = itemStack.getOrCreateTag(); + if (nbtData.getBoolean("stepAssist")) + lines.add(Component.translatable("metaarmor.message.step_assist.enabled")); + else lines.add(Component.translatable("metaarmor.message.step_assist.disabled")); lines.add(Component.translatable("metaarmor.tooltip.falldamage")); lines.add(Component.translatable("metaarmor.tooltip.jump")); } 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 499cc8a63e5..ede5b917da0 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -305,12 +305,16 @@ public static void init(RegistrateLangProvider provider) { 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.nms.step_assist.disabled", "NanoMuscle™ Suite: StepAssist Disabled"); + provider.add("metaarmor.nms.step_assist.enabled", "NanoMuscle™ Suite: StepAssist Enabled"); + provider.add("metaarmor.qts.step_assist.disabled", "QuarkTech™ Suite: StepAssist Disabled"); + provider.add("metaarmor.qts.step_assist.enabled", "QuarkTech™ Suite: StepAssist Enabled"); + provider.add("metaarmor.qts.boosted_jump.enabled", "QuarkTech™ Suite: Jump Boost Enabled"); + provider.add("metaarmor.qts.boosted_jump.disabled", "QuarkTech™ Suite: Jump Boost Disabled"); 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"); @@ -1221,6 +1225,7 @@ public static void init(RegistrateLangProvider 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"); provider.add("config.jade.plugin_gtceu.controllable_provider", "[GTCEu] Controllable"); diff --git a/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java b/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java index beeb8ad9a40..46edb2fac7b 100644 --- a/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java @@ -415,7 +415,9 @@ public static void playerTickEvent(TickEvent.PlayerTickEvent event) { public static void stepAssistHandler(LivingEvent.LivingTickEvent event) { float MAGIC_STEP_HEIGHT = 1.0023f; if (event.getEntity() == null || !(event.getEntity() instanceof Player player)) return; - if (!player.isCrouching() && player.getItemBySlot(EquipmentSlot.FEET).is(CustomTags.STEP_BOOTS)) { + CompoundTag tag = player.getItemBySlot(EquipmentSlot.FEET).getOrCreateTag(); + if (!player.isCrouching() && player.getItemBySlot(EquipmentSlot.FEET).is(CustomTags.STEP_BOOTS) && + (!tag.contains("stepAssist") || tag.getBoolean("stepAssist"))) { if (player.getStepHeight() < MAGIC_STEP_HEIGHT) { player.setMaxUpStep(MAGIC_STEP_HEIGHT); } 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 c609389d887..f59598a7104 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/input/SyncedKeyMappings.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/input/SyncedKeyMappings.java @@ -38,6 +38,9 @@ public final class SyncedKeyMappings { "gtceu.key.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); + public static final SyncedKeyMapping STEP_ASSIST_ENABLE = SyncedKeyMapping.createConfigurable( + "gtceu.key.enable_step_assist", KeyConflictContext.IN_GAME, + InputConstants.KEY_APOSTROPHE); public static void init() { if (GTCEu.isClientSide()) { From 781b6e75aa28366c2db175c975e871b9e111a9c9 Mon Sep 17 00:00:00 2001 From: zetrock1 <144679746+zetrock1@users.noreply.github.com> Date: Thu, 15 Jan 2026 10:53:42 +0300 Subject: [PATCH 20/28] Add HV, IV screwdriver and chainsaw (#4310) --- .../resources/assets/gtceu/lang/en_ud.json | 7 +- .../resources/assets/gtceu/lang/en_us.json | 5 ++ .../material/properties/ToolProperty.java | 4 ++ .../gtceu/api/item/tool/GTToolType.java | 64 +++++++++++++++++++ .../gtceu/data/lang/LangHandler.java | 5 ++ .../recipe/generated/ToolRecipeHandler.java | 7 +- .../data/recipe/misc/CustomToolRecipes.java | 4 ++ .../gtceu/models/item/tools/hv_chainsaw.json | 9 +++ .../models/item/tools/hv_screwdriver.json | 8 +++ .../gtceu/models/item/tools/iv_chainsaw.json | 9 +++ .../models/item/tools/iv_screwdriver.json | 8 +++ 11 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/assets/gtceu/models/item/tools/hv_chainsaw.json create mode 100644 src/main/resources/assets/gtceu/models/item/tools/hv_screwdriver.json create mode 100644 src/main/resources/assets/gtceu/models/item/tools/iv_chainsaw.json create mode 100644 src/main/resources/assets/gtceu/models/item/tools/iv_screwdriver.json diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index e7209058988..e89aadd73ac 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -4807,10 +4807,15 @@ "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§", @@ -4822,7 +4827,7 @@ "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.lv_wrench.tooltip": "sǝuıɥɔɐW ǝןʇuɐɯsıp oʇs ʞɔıןɔ ʇɟǝן 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§", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index ea5b1919eef..6874fa34070 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -4808,10 +4808,15 @@ "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_screwdriver": "%s Screwdriver (HV)", + "item.gtceu.tool.hv_screwdriver.tooltip": "§8Adjusts Covers and Machines", "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_chainsaw": "%s Chainsaw (IV)", "item.gtceu.tool.iv_drill": "%s Drill (IV)", + "item.gtceu.tool.iv_screwdriver": "%s Screwdriver (IV)", + "item.gtceu.tool.iv_screwdriver.tooltip": "§8Adjusts Covers and Machines", "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", diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/ToolProperty.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/ToolProperty.java index db1fff3651b..b6b7a3851d7 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/ToolProperty.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/properties/ToolProperty.java @@ -217,11 +217,15 @@ public static Builder of(float harvestSpeed, float attackDamage, int durability, DRILL_EV, DRILL_IV, CHAINSAW_LV, + CHAINSAW_HV, + CHAINSAW_IV, WRENCH_LV, WRENCH_HV, WRENCH_IV, BUZZSAW, SCREWDRIVER_LV, + SCREWDRIVER_HV, + SCREWDRIVER_IV, WIRE_CUTTER_LV, WIRE_CUTTER_HV, WIRE_CUTTER_IV, 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 38a84ee4fb3..19c2f4361a9 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 @@ -381,6 +381,44 @@ public class GTToolType { .defaultActions(ToolActions.AXE_DIG, ToolActions.SWORD_DIG, ToolActions.HOE_DIG, GTToolActions.SAW_DIG) .build(); + public static final GTToolType CHAINSAW_HV = GTToolType.builder("hv_chainsaw") + .idFormat("hv_%s_chainsaw") + .toolTag(ToolItemTagType.MATCH, ItemTags.AXES) + .toolTag(ToolItemTagType.MATCH, CustomTags.CHAINSAWS) + .harvestTag(BlockTags.MINEABLE_WITH_AXE) + .harvestTag(BlockTags.SWORD_EFFICIENT) + .harvestTag(BlockTags.MINEABLE_WITH_HOE) + .toolStats(b -> b.blockBreaking() + .efficiencyMultiplier(3.0F) + .attackDamage(5.0F).attackSpeed(-3.2F) + .brokenStack(ToolHelper.SUPPLY_POWER_UNIT_HV) + .behaviors(HarvestIceBehavior.INSTANCE, DisableShieldBehavior.INSTANCE, + TreeFellingBehavior.INSTANCE)) + .sound(GTSoundEntries.CHAINSAW_TOOL, true) + .electric(GTValues.HV) + .toolClasses(GTToolType.AXE) + .defaultActions(ToolActions.AXE_DIG, ToolActions.SWORD_DIG, ToolActions.HOE_DIG, + GTToolActions.SAW_DIG) + .build(); + public static final GTToolType CHAINSAW_IV = GTToolType.builder("iv_chainsaw") + .idFormat("iv_%s_chainsaw") + .toolTag(ToolItemTagType.MATCH, ItemTags.AXES) + .toolTag(ToolItemTagType.MATCH, CustomTags.CHAINSAWS) + .harvestTag(BlockTags.MINEABLE_WITH_AXE) + .harvestTag(BlockTags.SWORD_EFFICIENT) + .harvestTag(BlockTags.MINEABLE_WITH_HOE) + .toolStats(b -> b.blockBreaking() + .efficiencyMultiplier(4.0F) + .attackDamage(5.0F).attackSpeed(-3.2F) + .brokenStack(ToolHelper.SUPPLY_POWER_UNIT_IV) + .behaviors(HarvestIceBehavior.INSTANCE, DisableShieldBehavior.INSTANCE, + TreeFellingBehavior.INSTANCE)) + .sound(GTSoundEntries.CHAINSAW_TOOL, true) + .electric(GTValues.IV) + .toolClasses(GTToolType.AXE) + .defaultActions(ToolActions.AXE_DIG, ToolActions.SWORD_DIG, ToolActions.HOE_DIG, + GTToolActions.SAW_DIG) + .build(); public static final GTToolType WRENCH_LV = GTToolType.builder("lv_wrench") .idFormat("lv_%s_wrench") .toolTag(ToolItemTagType.CRAFTING, CustomTags.CRAFTING_WRENCHES) @@ -497,6 +535,32 @@ public class GTToolType { .toolClasses(GTToolType.SCREWDRIVER) .defaultActions(GTToolActions.DEFAULT_SCREWDRIVER_ACTIONS) .build(); + public static final GTToolType SCREWDRIVER_HV = GTToolType.builder("hv_screwdriver") + .idFormat("hv_%s_screwdriver") + .toolTag(ToolItemTagType.CRAFTING, CustomTags.CRAFTING_SCREWDRIVERS) + .toolTag(ToolItemTagType.MATCH, CustomTags.SCREWDRIVERS) + .toolStats(b -> b.crafting().sneakBypassUse() + .attackDamage(-1.0F).attackSpeed(3.0F) + .behaviors(new EntityDamageBehavior(3.0F, Spider.class)) + .brokenStack(ToolHelper.SUPPLY_POWER_UNIT_HV)) + .sound(GTSoundEntries.SCREWDRIVER_TOOL) + .electric(GTValues.HV) + .toolClasses(GTToolType.SCREWDRIVER) + .defaultActions(GTToolActions.DEFAULT_SCREWDRIVER_ACTIONS) + .build(); + public static final GTToolType SCREWDRIVER_IV = GTToolType.builder("iv_screwdriver") + .idFormat("iv_%s_screwdriver") + .toolTag(ToolItemTagType.CRAFTING, CustomTags.CRAFTING_SCREWDRIVERS) + .toolTag(ToolItemTagType.MATCH, CustomTags.SCREWDRIVERS) + .toolStats(b -> b.crafting().sneakBypassUse() + .attackDamage(-1.0F).attackSpeed(3.0F) + .behaviors(new EntityDamageBehavior(3.0F, Spider.class)) + .brokenStack(ToolHelper.SUPPLY_POWER_UNIT_IV)) + .sound(GTSoundEntries.SCREWDRIVER_TOOL) + .electric(GTValues.IV) + .toolClasses(GTToolType.SCREWDRIVER) + .defaultActions(GTToolActions.DEFAULT_SCREWDRIVER_ACTIONS) + .build(); public final String name; public final String idFormat; 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 ede5b917da0..62d422b1c0f 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -241,6 +241,7 @@ public static void init(RegistrateLangProvider provider) { 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.iv_chainsaw", "%s Chainsaw (IV)"); 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)"); @@ -251,6 +252,10 @@ public static void init(RegistrateLangProvider provider) { 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.hv_screwdriver", "%s Screwdriver (HV)"); + provider.add("item.gtceu.tool.hv_screwdriver.tooltip", "§8Adjusts Covers and Machines"); + replace(provider, "item.gtceu.tool.iv_screwdriver", "%s Screwdriver (IV)"); + provider.add("item.gtceu.tool.iv_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"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/generated/ToolRecipeHandler.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/generated/ToolRecipeHandler.java index d67aa688dd7..2139209ef0b 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/generated/ToolRecipeHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/generated/ToolRecipeHandler.java @@ -235,7 +235,9 @@ private static void processElectricTool(@NotNull Consumer provid 'S', steelPlate, 'R', steelRing); - addElectricToolRecipe(provider, toolPrefix, new GTToolType[] { GTToolType.CHAINSAW_LV }, material); + addElectricToolRecipe(provider, toolPrefix, + new GTToolType[] { GTToolType.CHAINSAW_LV, GTToolType.CHAINSAW_HV, GTToolType.CHAINSAW_IV }, + material); } // wrench @@ -300,7 +302,8 @@ private static void processElectricTool(@NotNull Consumer provid if (property.hasType(GTToolType.SCREWDRIVER_LV)) { if (material.hasFlag(GENERATE_LONG_ROD)) { toolPrefix = TagPrefix.toolHeadScrewdriver; - addElectricToolRecipe(provider, toolPrefix, new GTToolType[] { GTToolType.SCREWDRIVER_LV }, material); + addElectricToolRecipe(provider, toolPrefix, new GTToolType[] { GTToolType.SCREWDRIVER_LV, + GTToolType.SCREWDRIVER_HV, GTToolType.SCREWDRIVER_IV }, material); VanillaRecipeHelper.addShapedRecipe(provider, String.format("screwdriver_tip_%s", material.getName()), ChemicalHelper.get(toolPrefix, material), diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CustomToolRecipes.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CustomToolRecipes.java index 636dde61977..2d94a1c84ca 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CustomToolRecipes.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CustomToolRecipes.java @@ -88,11 +88,15 @@ private static void initializeGTItems() { ToolHeadReplaceRecipe.setToolHeadForTool(toolHeadDrill, GTToolType.DRILL_EV); ToolHeadReplaceRecipe.setToolHeadForTool(toolHeadDrill, GTToolType.DRILL_IV); ToolHeadReplaceRecipe.setToolHeadForTool(toolHeadChainsaw, GTToolType.CHAINSAW_LV); + ToolHeadReplaceRecipe.setToolHeadForTool(toolHeadChainsaw, GTToolType.CHAINSAW_HV); + ToolHeadReplaceRecipe.setToolHeadForTool(toolHeadChainsaw, GTToolType.CHAINSAW_IV); ToolHeadReplaceRecipe.setToolHeadForTool(toolHeadWrench, GTToolType.WRENCH_LV); ToolHeadReplaceRecipe.setToolHeadForTool(toolHeadWrench, GTToolType.WRENCH_HV); ToolHeadReplaceRecipe.setToolHeadForTool(toolHeadWrench, GTToolType.WRENCH_IV); ToolHeadReplaceRecipe.setToolHeadForTool(toolHeadBuzzSaw, GTToolType.BUZZSAW); ToolHeadReplaceRecipe.setToolHeadForTool(toolHeadScrewdriver, GTToolType.SCREWDRIVER_LV); + ToolHeadReplaceRecipe.setToolHeadForTool(toolHeadScrewdriver, GTToolType.SCREWDRIVER_HV); + ToolHeadReplaceRecipe.setToolHeadForTool(toolHeadScrewdriver, GTToolType.SCREWDRIVER_IV); ToolHeadReplaceRecipe.setToolHeadForTool(toolHeadWireCutter, GTToolType.WIRE_CUTTER_LV); ToolHeadReplaceRecipe.setToolHeadForTool(toolHeadWireCutter, GTToolType.WIRE_CUTTER_HV); ToolHeadReplaceRecipe.setToolHeadForTool(toolHeadWireCutter, GTToolType.WIRE_CUTTER_IV); diff --git a/src/main/resources/assets/gtceu/models/item/tools/hv_chainsaw.json b/src/main/resources/assets/gtceu/models/item/tools/hv_chainsaw.json new file mode 100644 index 00000000000..ebfd3e33362 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/tools/hv_chainsaw.json @@ -0,0 +1,9 @@ +{ + "parent": "item/handheld", + "textures": { + "layer0": "gtceu:item/tools/power_unit_hv", + "layer1": "gtceu:item/tools/chainsaw", + "layer2": "gtceu:item/void", + "layer3": "gtceu:item/tools/chainsaw_body" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/tools/hv_screwdriver.json b/src/main/resources/assets/gtceu/models/item/tools/hv_screwdriver.json new file mode 100644 index 00000000000..e45c0a35fc1 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/tools/hv_screwdriver.json @@ -0,0 +1,8 @@ +{ + "parent": "item/handheld", + "textures": { + "layer0": "gtceu:item/tools/handle_electric_screwdriver", + "layer1": "gtceu:item/tools/screwdriver_short", + "layer2": "gtceu:item/tools/screwdriver_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/tools/iv_chainsaw.json b/src/main/resources/assets/gtceu/models/item/tools/iv_chainsaw.json new file mode 100644 index 00000000000..6d10ea06bc1 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/tools/iv_chainsaw.json @@ -0,0 +1,9 @@ +{ + "parent": "item/handheld", + "textures": { + "layer0": "gtceu:item/tools/power_unit_iv", + "layer1": "gtceu:item/tools/chainsaw", + "layer2": "gtceu:item/void", + "layer3": "gtceu:item/tools/chainsaw_body" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/tools/iv_screwdriver.json b/src/main/resources/assets/gtceu/models/item/tools/iv_screwdriver.json new file mode 100644 index 00000000000..e45c0a35fc1 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/tools/iv_screwdriver.json @@ -0,0 +1,8 @@ +{ + "parent": "item/handheld", + "textures": { + "layer0": "gtceu:item/tools/handle_electric_screwdriver", + "layer1": "gtceu:item/tools/screwdriver_short", + "layer2": "gtceu:item/tools/screwdriver_overlay" + } +} From dc67cd72afad137398e8d667d423945f84e32ad1 Mon Sep 17 00:00:00 2001 From: Jurre Groenendijk Date: Thu, 15 Jan 2026 09:21:20 +0100 Subject: [PATCH 21/28] DFS stack-based recipe lookup implementation (#3986) Co-authored-by: Tech22 <37029404+techlord22@users.noreply.github.com> --- .../gtceu/api/machine/trait/RecipeLogic.java | 2 +- .../gtceu/api/recipe/lookup/RecipeDB.java | 181 +++++++----------- .../api/recipe/lookup/GTRecipeLookupTest.java | 2 +- .../stresstest/RecipeIteratorStressTest.java | 128 +++++++++++++ 4 files changed, 201 insertions(+), 112 deletions(-) create mode 100644 src/test/java/com/gregtechceu/gtceu/gametest/stresstest/RecipeIteratorStressTest.java diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java index 772eef9c6c0..2b97ff75302 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java @@ -316,7 +316,7 @@ protected void regressRecipe() { } public @NotNull Iterator searchRecipe() { - return machine.getRecipeType().searchRecipe(machine, r -> matchRecipe(r).isSuccess()); + return machine.getRecipeType().searchRecipe(machine, r -> true); } public void findAndHandleRecipe() { diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/RecipeDB.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/RecipeDB.java index 1d9850a7236..a7862af48d3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/RecipeDB.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/RecipeDB.java @@ -19,8 +19,6 @@ import com.mojang.datafixers.util.Either; import it.unimi.dsi.fastutil.objects.ObjectArrayList; -import lombok.AccessLevel; -import lombok.RequiredArgsConstructor; import org.jetbrains.annotations.*; import java.util.*; @@ -63,7 +61,7 @@ public void clear() { if (list == null) { return null; } - return findRecursive(list, predicate); + return find(list, predicate); } /** @@ -77,7 +75,7 @@ public void clear() { @VisibleForTesting public @Nullable GTRecipe find(@NotNull List> list, @NotNull Predicate predicate) { - return findRecursive(list, predicate); + return (new RecipeIterator(this, list, predicate)).next(); } /** @@ -99,7 +97,7 @@ public void clear() { list.add(MapIngredientTypeManager.getFrom(ingredient, cap)); } }); - return findRecursive(list, predicate); + return find(list, predicate); } /** @@ -118,98 +116,6 @@ public void clear() { return new RecipeIterator(this, list, predicate); } - /** - * Recursively finds a recipe. - * - * @param ingredients the ingredients to search with - * @param predicate if the found recipe is valid - * @return the recipe - */ - private @Nullable GTRecipe findRecursive(@NotNull List> ingredients, - @NotNull Predicate predicate) { - // Try each ingredient as a starting point, adding it to the skip-list. - // The skip-list is a packed long, where each 1 bit represents an index to skip - for (int i = 0; i < ingredients.size(); i++) { - BitSet skipSet = new BitSet(ingredients.size()); - skipSet.set(i); - GTRecipe r = findRecursive(ingredients, rootBranch, predicate, i, 0, skipSet); - if (r != null) { - return r; - } - } - return null; - } - - /** - * Recursively finds a recipe by checking the current branch's nodes. - * - * @param ingredients the ingredients to search with - * @param branch the branch to search - * @param predicate if the found recipe is valid - * @param index the index of the ingredient list to check - * @param count how deep we are in recursion, < ingredients.length - * @param skip bitmask of ingredients already checked - * @return the recipe - */ - private @Nullable GTRecipe findRecursive(@NotNull List> ingredients, - @NotNull Branch branch, @NotNull Predicate predicate, - int index, int count, @NotNull BitSet skip) { - // exhausted all the ingredients, and didn't find anything - if (count == ingredients.size()) { - return null; - } - - // Iterate over current level of nodes. - for (AbstractMapIngredient obj : ingredients.get(index)) { - // determine the root nodes - var nodes = nodesForIngredient(obj, branch); - var result = nodes.get(obj); - if (result == null) { - continue; - } - // if there is a recipe (left mapping), return it immediately as found, if it can be handled - // Otherwise, recurse and go to the next branch. - GTRecipe recipe = result.map(r -> predicate.test(r) ? r : null, - b -> findRecursiveDive(ingredients, b, predicate, index, count, skip)); - if (recipe != null) { - return recipe; - } - } - return null; - } - - /** - * Recursively finds a recipe by diving deeper down a path. - * - * @param ingredients the ingredients to search with - * @param branch the branch to search - * @param predicate if the found recipe is valid - * @param index the index of the ingredient list to check - * @param count how deep we are in recursion, must be < ingredients.length - * @param skip bitmask of ingredients already checked - * @return the recipe - */ - private @Nullable GTRecipe findRecursiveDive(@NotNull List> ingredients, - @NotNull Branch branch, @NotNull Predicate predicate, - int index, int count, @NotNull BitSet skip) { - // loop through all ingredients, wrapping around the end until all are tried. - for (int i = (index + 1) % ingredients.size(); i != index; i = (i + 1) % ingredients.size()) { - if (skip.get(i)) { - continue; - } - // Recursive call - // Append the current index to the skip list - skip.set(i); - // Increase the count, so the recursion can terminate if needed (ingredients is exhausted) - GTRecipe r = findRecursive(ingredients, branch, predicate, i, count + 1, skip); - if (r != null) { - return r; - } - skip.clear(i); - } - return null; - } - /** * Converts a Recipe Capability holder's handlers into a list of {@link AbstractMapIngredient} * @@ -358,38 +264,93 @@ private boolean addRecursive(@NotNull GTRecipe recipe, return true; } - @RequiredArgsConstructor(access = AccessLevel.PRIVATE) + private static class SearchFrame { + + int index; // ingredient slot we’re exploring + int ingredientIndex; // position within ingredients[index] + Branch branch; // branch in the recipe DB + + public SearchFrame(int index, Branch branch) { + this.index = index; + this.ingredientIndex = 0; + this.branch = branch; + } + } + public static class RecipeIterator implements Iterator { private final @NotNull RecipeDB db; private final @NotNull List> ingredients; private final @NotNull Predicate predicate; - private int index; + + private final Deque stack = new ArrayDeque<>(); + + @VisibleForTesting + public RecipeIterator(@NotNull RecipeDB db, + @NotNull List> ingredients, + @NotNull Predicate predicate) { + this.db = db; + this.ingredients = ingredients; + this.predicate = predicate; + + for (int i = ingredients.size() - 1; i >= 0; i--) { + stack.push(new SearchFrame(i, db.rootBranch)); + } + } @Override public boolean hasNext() { - return index < ingredients.size(); + return !stack.isEmpty(); } @Override - public @Nullable GTRecipe next() { - while (index < ingredients.size()) { - BitSet skipSet = new BitSet(ingredients.size()); - skipSet.set(index); - GTRecipe r = db.findRecursive(ingredients, db.rootBranch, predicate, index, 0, skipSet); - index++; - if (r != null) { - return r; + public GTRecipe next() { + while (!stack.isEmpty()) { + // We stay on one frame until all ingredients have been checked + SearchFrame frame = stack.peek(); + + if (frame.ingredientIndex >= ingredients.get(frame.index).size()) { + stack.pop(); + continue; } + + List ingredientList = ingredients.get(frame.index); + AbstractMapIngredient ingredient = ingredientList.get(frame.ingredientIndex); + // Increment candidate pos for next iteration + frame.ingredientIndex++; + var nodes = nodesForIngredient(ingredient, frame.branch); + var result = nodes.get(ingredient); + if (result == null) { + continue; + } + + // Option 1: It's a recipe + if (result.left().isPresent()) { + var recipe = result.left().get(); + if (predicate.test(recipe)) { + return recipe; + } + } + + // Option 2: It's a branch, dive deeper + result.ifRight(b -> { + for (int j = ingredients.size() - 1; j >= 0; j--) { + stack.push(new SearchFrame(j, b)); + } + }); } - return null; + + return null; // no more recipes } /** * Reset the iterator */ public void reset() { - this.index = 0; + stack.clear(); + for (int i = ingredients.size() - 1; i >= 0; i--) { + stack.push(new SearchFrame(i, db.rootBranch)); + } } } } diff --git a/src/test/java/com/gregtechceu/gtceu/api/recipe/lookup/GTRecipeLookupTest.java b/src/test/java/com/gregtechceu/gtceu/api/recipe/lookup/GTRecipeLookupTest.java index 0cde5b0ac50..dcd992640e5 100644 --- a/src/test/java/com/gregtechceu/gtceu/api/recipe/lookup/GTRecipeLookupTest.java +++ b/src/test/java/com/gregtechceu/gtceu/api/recipe/lookup/GTRecipeLookupTest.java @@ -47,7 +47,7 @@ public static void prepare(ServerLevel level) { .inputItems(Items.COBBLESTONE, 1) .outputItems(Items.STONE, 1) .buildRawRecipe(); - GTRecipe SMELT_ACACIA_WOOD = recipeType.recipeBuilder("smelt_acacia_wood") + SMELT_ACACIA_WOOD = recipeType.recipeBuilder("smelt_acacia_wood") .inputItems(Items.ACACIA_WOOD, 1) .outputItems(Items.CHARCOAL, 1) .buildRawRecipe(); diff --git a/src/test/java/com/gregtechceu/gtceu/gametest/stresstest/RecipeIteratorStressTest.java b/src/test/java/com/gregtechceu/gtceu/gametest/stresstest/RecipeIteratorStressTest.java new file mode 100644 index 00000000000..943fc583cf5 --- /dev/null +++ b/src/test/java/com/gregtechceu/gtceu/gametest/stresstest/RecipeIteratorStressTest.java @@ -0,0 +1,128 @@ +package com.gregtechceu.gtceu.gametest.stresstest; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; +import com.gregtechceu.gtceu.api.recipe.GTRecipeType; +import com.gregtechceu.gtceu.api.recipe.lookup.RecipeDB; +import com.gregtechceu.gtceu.api.recipe.lookup.ingredient.AbstractMapIngredient; +import com.gregtechceu.gtceu.api.recipe.lookup.ingredient.MapIngredientTypeManager; +import com.gregtechceu.gtceu.common.data.GTRecipeTypes; +import com.gregtechceu.gtceu.common.machine.multiblock.part.FluidHatchPartMachine; +import com.gregtechceu.gtceu.common.machine.multiblock.part.ItemBusPartMachine; +import com.gregtechceu.gtceu.gametest.util.TestUtils; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.gametest.framework.BeforeBatch; +import net.minecraft.gametest.framework.GameTest; +import net.minecraft.gametest.framework.GameTestHelper; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.block.Blocks; +import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.PrefixGameTestTemplate; + +import java.util.ArrayList; +import java.util.List; + +import static com.gregtechceu.gtceu.gametest.util.TestUtils.getMetaMachine; + +@PrefixGameTestTemplate(false) +@GameTestHolder(GTCEu.MOD_ID) +public class RecipeIteratorStressTest { + + private static final boolean DO_RUN_RECIPE_ITERATOR_STRESSTEST = false; + + private static GTRecipeType LCR_RECIPE_TYPE; + + @BeforeBatch(batch = "StressTests") + public static void prepare(ServerLevel level) { + LCR_RECIPE_TYPE = TestUtils.createRecipeType("stress_tests", 3, 3, 3, 3); + // Force insert the recipe into the manager. + LCR_RECIPE_TYPE.getAdditionHandler().beginStaging(); + LCR_RECIPE_TYPE.getAdditionHandler().addStaging(LCR_RECIPE_TYPE + .recipeBuilder(GTCEu.id("test_multiblock_stress_tests")) + .inputItems(new ItemStack(Blocks.COBBLESTONE), new ItemStack(Blocks.ACACIA_WOOD)) + .outputItems(new ItemStack(Blocks.STONE)) + .EUt(GTValues.VA[GTValues.HV]).duration(1) + // NBT has a schematic in it with an HV energy input hatch + .buildRawRecipe()); + LCR_RECIPE_TYPE.getAdditionHandler().completeStaging(); + } + + private static BusHolder getBussesAndForm(GameTestHelper helper) { + WorkableMultiblockMachine controller = (WorkableMultiblockMachine) getMetaMachine( + helper.getBlockEntity(new BlockPos(1, 2, 0))); + TestUtils.formMultiblock(controller); + controller.setRecipeType(LCR_RECIPE_TYPE); + ItemBusPartMachine inputBus1 = (ItemBusPartMachine) getMetaMachine( + helper.getBlockEntity(new BlockPos(2, 1, 0))); + ItemBusPartMachine inputBus2 = (ItemBusPartMachine) getMetaMachine( + helper.getBlockEntity(new BlockPos(2, 2, 0))); + ItemBusPartMachine outputBus1 = (ItemBusPartMachine) getMetaMachine( + helper.getBlockEntity(new BlockPos(0, 1, 0))); + FluidHatchPartMachine outputHatch1 = (FluidHatchPartMachine) getMetaMachine( + helper.getBlockEntity(new BlockPos(0, 2, 0))); + return new BusHolder(inputBus1, inputBus2, outputBus1, outputHatch1, controller); + } + + private record BusHolder(ItemBusPartMachine inputBus1, ItemBusPartMachine inputBus2, ItemBusPartMachine outputBus1, + FluidHatchPartMachine outputHatch1, WorkableMultiblockMachine controller) {} + + @GameTest(template = "empty", batch = "StressTests") + public static void iteratorStressTest(GameTestHelper helper) { + if (!DO_RUN_RECIPE_ITERATOR_STRESSTEST) { + helper.succeed(); + return; + } + List> list = new ArrayList(); + for (var item : BuiltInRegistries.ITEM) { + list.add(MapIngredientTypeManager.getFrom(Ingredient.of(item), ItemRecipeCapability.CAP)); + } + for (var block : BuiltInRegistries.BLOCK) { + list.add(MapIngredientTypeManager.getFrom(Ingredient.of(block), ItemRecipeCapability.CAP)); + } + + long start = System.nanoTime(); + + long currentIterator = 0; + for (int i = 0; i < 20; i++) { + RecipeDB.RecipeIterator iterator = new RecipeDB.RecipeIterator(GTRecipeTypes.ASSEMBLER_RECIPES.db(), list, + (ignored) -> true); + while (iterator.hasNext()) { + var recipe = iterator.next(); + currentIterator++; + } + } + long end = System.nanoTime(); + GTCEu.LOGGER.info("current iterator recipes: " + currentIterator / 100); + GTCEu.LOGGER.info("Lookup in big tree Took " + (end - start) / 1_000_000.0 + " ms"); + helper.succeed(); + } + + @GameTest(template = "lcr_input_separation", batch = "StressTests") + public static void iteratorOnMachineStressTest(GameTestHelper helper) { + if (!DO_RUN_RECIPE_ITERATOR_STRESSTEST) { + helper.succeed(); + return; + } + + BusHolder busHolder = getBussesAndForm(helper); + busHolder.inputBus1.getInventory().setStackInSlot(0, new ItemStack(Items.COBBLESTONE)); + busHolder.inputBus1.getInventory().setStackInSlot(1, new ItemStack(Blocks.ACACIA_WOOD)); + busHolder.controller.recipeLogic.searchRecipe(); + long start = System.nanoTime(); + + for (int i = 0; i < 1000; i++) { + busHolder.controller.recipeLogic.findAndHandleRecipe(); + busHolder.controller.recipeLogic.markLastRecipeDirty(); + } + long end = System.nanoTime(); + GTCEu.LOGGER.info("On machine took " + (end - start) / 1_000_000.0 + " ms"); + helper.succeed(); + } +} From 58457f2522f077b7d08592bb8fc75431dd5309ab Mon Sep 17 00:00:00 2001 From: zetrock1 <144679746+zetrock1@users.noreply.github.com> Date: Thu, 15 Jan 2026 11:22:04 +0300 Subject: [PATCH 22/28] Jade battery provider (#4317) --- .../resources/assets/gtceu/lang/en_ud.json | 9 ++ .../resources/assets/gtceu/lang/en_us.json | 9 ++ .../gtceu/data/lang/IntegrationLang.java | 8 ++ .../gtceu/data/lang/LangHandler.java | 1 + .../gtceu/integration/jade/GTJadePlugin.java | 2 + .../provider/BatteryStorageInfoProvider.java | 102 ++++++++++++++++++ .../com/gregtechceu/gtceu/utils/GTUtil.java | 35 ++++++ 7 files changed, 166 insertions(+) create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/jade/provider/BatteryStorageInfoProvider.java diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index e89aadd73ac..a0a937ed0cb 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -1919,6 +1919,7 @@ "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ƎƆ⟘⅁[", @@ -2504,12 +2505,20 @@ "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ıꞀ", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 6874fa34070..b738160a97f 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -1919,6 +1919,7 @@ "config.gtceu.option.yOffset": "yOffset", "config.gtceu.option.zombieSpawnWithSabers": "zombieSpawnWithSabers", "config.jade.plugin_gtceu.auto_output_info": "[GTCEu] Auto Output Info", + "config.jade.plugin_gtceu.battery_info": "[GTCEu] Battery info", "config.jade.plugin_gtceu.cable_info": "[GTCEu] Cable Info", "config.jade.plugin_gtceu.controllable_provider": "[GTCEu] Controllable", "config.jade.plugin_gtceu.data_bank": "[GTCEu] Data Bank Info", @@ -2504,12 +2505,20 @@ "gtceu.item_pipe.priority": "§9Priority: §f%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", 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 ec15a7bd5b4..633cae3618a 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java @@ -100,6 +100,14 @@ private static void initWailaLikeLang(RegistrateLangProvider provider) { provider.add("gtceu.jade.fluid_use", "%s mB/t"); provider.add("gtceu.jade.amperage_use", "%s A"); provider.add("gtceu.jade.at", " @ "); + provider.add("gtceu.jade.remaining_charge_time", "Until charged: %s"); + provider.add("gtceu.jade.remaining_discharge_time", "Until empty: %s"); + provider.add("gtceu.jade.changes_eu_sec", "%s EU/s"); + provider.add("gtceu.jade.seconds", "%s seconds"); + provider.add("gtceu.jade.minutes", "%s minutes"); + provider.add("gtceu.jade.hours", "%s hours"); + provider.add("gtceu.jade.days", "%s days"); + provider.add("gtceu.jade.years", "%s years"); 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/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java index 62d422b1c0f..610acc56226 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -1235,6 +1235,7 @@ public static void init(RegistrateLangProvider provider) { "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.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"); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/GTJadePlugin.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/GTJadePlugin.java index 9228bc795a6..d2810562b20 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/GTJadePlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/GTJadePlugin.java @@ -44,6 +44,7 @@ public void register(IWailaCommonRegistration registration) { registration.registerBlockDataProvider(new PrimitivePumpBlockProvider(), BlockEntity.class); registration.registerBlockDataProvider(new DataBankBlockProvider(), BlockEntity.class); registration.registerBlockDataProvider(new EnergyConverterModeProvider(), BlockEntity.class); + registration.registerBlockDataProvider(new BatteryStorageInfoProvider(), BlockEntity.class); registration.registerBlockDataProvider(new LDPEndpointProvider(), BlockEntity.class); if (GTCEu.Mods.isAE2Loaded()) { registration.registerBlockDataProvider(new MEPatternBufferProvider(), BlockEntity.class); @@ -77,6 +78,7 @@ public void registerClient(IWailaClientRegistration registration) { registration.registerBlockComponent(new DataBankBlockProvider(), Block.class); registration.registerBlockComponent(new LDPEndpointProvider(), Block.class); registration.registerBlockComponent(new EnergyConverterModeProvider(), Block.class); + registration.registerBlockComponent(new BatteryStorageInfoProvider(), Block.class); if (GTCEu.Mods.isAE2Loaded()) { registration.registerBlockComponent(new MEPatternBufferProvider(), Block.class); registration.registerBlockComponent(new MEPatternBufferProxyProvider(), Block.class); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/BatteryStorageInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/BatteryStorageInfoProvider.java new file mode 100644 index 00000000000..13390960137 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/BatteryStorageInfoProvider.java @@ -0,0 +1,102 @@ +package com.gregtechceu.gtceu.integration.jade.provider; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; +import com.gregtechceu.gtceu.api.capability.IElectricItem; +import com.gregtechceu.gtceu.api.capability.IEnergyContainer; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; +import com.gregtechceu.gtceu.common.machine.electric.BatteryBufferMachine; +import com.gregtechceu.gtceu.common.machine.electric.ChargerMachine; + +import net.minecraft.client.Minecraft; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; + +import snownee.jade.api.BlockAccessor; +import snownee.jade.api.IBlockComponentProvider; +import snownee.jade.api.IServerDataProvider; +import snownee.jade.api.ITooltip; +import snownee.jade.api.config.IPluginConfig; +import snownee.jade.api.ui.IElementHelper; + +import static com.gregtechceu.gtceu.utils.GTUtil.formatLongNumber; +import static com.gregtechceu.gtceu.utils.GTUtil.getStringRemainTime; + +public class BatteryStorageInfoProvider implements IBlockComponentProvider, IServerDataProvider { + + @Override + public void appendTooltip(ITooltip iTooltip, BlockAccessor blockAccessor, IPluginConfig iPluginConfig) { + if (blockAccessor.getBlockEntity() instanceof IMachineBlockEntity blockEntity) { + if (blockEntity.getMetaMachine() instanceof ChargerMachine || + blockEntity.getMetaMachine() instanceof BatteryBufferMachine) { + CompoundTag serverData = blockAccessor.getServerData(); + if (serverData.contains("batteries")) { + CompoundTag tag = serverData.getCompound("batteries"); + CompoundTag container = tag.getCompound("energy"); + long changed = container.getLong("changed"), stored = container.getLong("stored"), + capacity = container.getLong("capacity"); + iTooltip.add(Component.translatable("gtceu.jade.changes_eu_sec", formatLongNumber(changed))); + if (changed > 0L) { + iTooltip.add(Component + .translatable("gtceu.jade.remaining_charge_time", + getStringRemainTime((capacity - stored) / changed))); + } else if (changed < 0L) { + iTooltip.add(Component.translatable("gtceu.jade.remaining_discharge_time", + getStringRemainTime((stored) / -changed))); + } + if (Minecraft.getInstance().player.isShiftKeyDown()) { + CustomItemStackHandler handler = new CustomItemStackHandler(); + handler.deserializeNBT(tag.getCompound("storage")); + IElementHelper helper = iTooltip.getElementHelper(); + for (int i = 0; i < handler.getSlots(); i++) { + if (handler.getStackInSlot(i).getCount() != 0) { + ItemStack stack = handler.getStackInSlot(i); + iTooltip.add(helper.smallItem(stack)); + IElectricItem item = GTCapabilityHelper.getElectricItem(stack); + if (item == null) continue; + iTooltip.append(Component.literal( + GTValues.VNF[item.getTier()] + "§r " + formatLongNumber(item.getCharge()) + + " / " + formatLongNumber(item.getMaxCharge()) + " EU")); + } + } + } + } + } + } + } + + private CompoundTag getEnergyData(IEnergyContainer container) { + CompoundTag tag = new CompoundTag(); + tag.putLong("changed", container.getInputPerSec() - container.getOutputPerSec()); + tag.putLong("capacity", container.getEnergyCapacity()); + tag.putLong("stored", container.getEnergyStored()); + return tag; + } + + @Override + public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { + if (blockAccessor.getBlockEntity() instanceof IMachineBlockEntity blockEntity) { + if (blockEntity.getMetaMachine() instanceof ChargerMachine machine) { + CompoundTag tag = new CompoundTag(); + tag.put("energy", getEnergyData(machine.energyContainer)); + tag.put("storage", machine.getChargerInventory().serializeNBT()); + compoundTag.put("batteries", tag); + } else if (blockEntity.getMetaMachine() instanceof BatteryBufferMachine machine) { + CompoundTag tag = new CompoundTag(); + IEnergyContainer container = machine.energyContainer; + tag.put("energy", getEnergyData(machine.energyContainer)); + tag.put("storage", machine.getBatteryInventory().serializeNBT()); + compoundTag.put("batteries", tag); + } + } + } + + @Override + public ResourceLocation getUid() { + return GTCEu.id("battery_info"); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java b/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java index 61dbac13b40..3b42d4f2b80 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java @@ -62,6 +62,7 @@ import java.util.function.Function; import static com.gregtechceu.gtceu.api.data.chemical.material.properties.PropertyKey.HAZARD; +import static com.gregtechceu.gtceu.utils.FormattingUtil.DECIMAL_FORMAT_SIC_2F; public class GTUtil { @@ -360,6 +361,40 @@ public static boolean isAltDown() { return false; } + public static String formatLongNumber(long number, long threshold) { + return (number > threshold) ? DECIMAL_FORMAT_SIC_2F.format(number) : String.valueOf(number); + } + + public static String formatLongNumber(long number) { + return formatLongNumber(number, 10000); + } + + public static String getStringRemainTime(long time, long threshold) { + String s = Component.translatable("gtceu.jade.seconds", time % 60).getString(); + time /= 60; + if (time > 0) { + s = Component.translatable("gtceu.jade.minutes", time % 60).getString() + " " + s; + time /= 60; + if (time > 0) { + s = Component.translatable("gtceu.jade.hours", time % 60).getString() + " " + s; + time /= 60; + if (time > 0) { + s = Component.translatable("gtceu.jade.days", time % 24).getString() + " " + s; + time /= 24; + if (time > 0) { + s = Component.translatable("gtceu.jade.years", formatLongNumber(time, threshold)).getString() + + " " + s; + } + } + } + } + return s; + } + + public static String getStringRemainTime(long time) { + return getStringRemainTime(time, 10000); + } + public static boolean isFluidStackAmountDivisible(FluidStack fluidStack, int divisor) { return fluidStack.getAmount() % divisor == 0 && fluidStack.getAmount() % divisor != fluidStack.getAmount() && fluidStack.getAmount() / divisor != 0; From ce6459537be31410de26b8185b086cc3f345118d Mon Sep 17 00:00:00 2001 From: blockninja124 <64211894+blockninja124@users.noreply.github.com> Date: Thu, 15 Jan 2026 11:52:20 -0500 Subject: [PATCH 23/28] Add CC: Tweaked peripheral for ghost programmed circuit (#4468) --- dependencies.gradle | 2 +- gradle/forge.versions.toml | 2 +- .../blockentity/MetaMachineBlockEntity.java | 10 +++++ .../api/capability/GTCapabilityHelper.java | 6 +++ .../api/capability/forge/GTCapability.java | 4 ++ .../cctweaked/CCTweakedPlugin.java | 2 + .../peripherals/CircuitSlotPeripheral.java | 43 +++++++++++++++++++ 7 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/CircuitSlotPeripheral.java diff --git a/dependencies.gradle b/dependencies.gradle index 4334e330e3c..fcfdee1e87d 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -93,8 +93,8 @@ dependencies { modExtraLocalRuntime(forge.javd) modExtraLocalRuntime(forge.trenzalore) modExtraLocalRuntime(forge.curios) + modExtraLocalRuntime(forge.cc.tweaked.forge.impl) // modExtraLocalRuntime(forge.worldstripper) -// modExtraLocalRuntime(forge.cc.tweaked.forge.impl) for some reason this breaks create modExtraLocalRuntime(forge.bundles.kjs) diff --git a/gradle/forge.versions.toml b/gradle/forge.versions.toml index eac33484595..e98ba18e3bf 100644 --- a/gradle/forge.versions.toml +++ b/gradle/forge.versions.toml @@ -21,7 +21,7 @@ ftblibrary = "2001.2.4" ftbteams = "2001.3.0" ftbquests = "2001.4.11" ftbchunks = "2001.3.4" -ccTweaked = "1.114.3" +ccTweaked = "1.115.1" create = "6.0.6-150" ponder = "1.0.80" flywheel = "1.0.4" diff --git a/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java index db0589bd9c4..a36235f28d9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java @@ -7,6 +7,7 @@ import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; @@ -179,6 +180,15 @@ public static LazyOptional getCapability(MetaMachine machine, @NotNull Ca return GTCapability.CAPABILITY_CONTROLLABLE.orEmpty(cap, LazyOptional.of(() -> controllable)); } } + } else if (cap == GTCapability.CAPABILITY_CIRCUIT_SLOT) { + if (machine instanceof IHasCircuitSlot hasCircuitSlot) { + return GTCapability.CAPABILITY_CIRCUIT_SLOT.orEmpty(cap, LazyOptional.of(() -> hasCircuitSlot)); + } + for (MachineTrait trait : machine.getTraits()) { + if (trait instanceof IHasCircuitSlot hasCircuitSlot) { + return GTCapability.CAPABILITY_CIRCUIT_SLOT.orEmpty(cap, LazyOptional.of(() -> hasCircuitSlot)); + } + } } else if (cap == GTCapability.CAPABILITY_RECIPE_LOGIC) { for (MachineTrait trait : machine.getTraits()) { if (trait instanceof RecipeLogic recipeLogic) { 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 49ba637ac4d..babd82db0fb 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,7 @@ package com.gregtechceu.gtceu.api.capability; import com.gregtechceu.gtceu.api.capability.forge.GTCapability; +import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; @@ -70,6 +71,11 @@ public static IControllable getControllable(Level level, BlockPos pos, @Nullable return getBlockEntityCapability(GTCapability.CAPABILITY_CONTROLLABLE, level, pos, side); } + @Nullable + public static IHasCircuitSlot getCircuitSlot(Level level, BlockPos pos, @Nullable Direction side) { + return getBlockEntityCapability(GTCapability.CAPABILITY_CIRCUIT_SLOT, level, pos, side); + } + @Nullable public static RecipeLogic getRecipeLogic(Level level, BlockPos pos, @Nullable Direction side) { return getBlockEntityCapability(GTCapability.CAPABILITY_RECIPE_LOGIC, level, pos, side); diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/forge/GTCapability.java b/src/main/java/com/gregtechceu/gtceu/api/capability/forge/GTCapability.java index 18e989bda1e..da01c5e0a22 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/forge/GTCapability.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/forge/GTCapability.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.api.capability.forge; import com.gregtechceu.gtceu.api.capability.*; +import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; @@ -20,6 +21,8 @@ public class GTCapability { public static final Capability CAPABILITY_WORKABLE = CapabilityManager.get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_CONTROLLABLE = CapabilityManager .get(new CapabilityToken<>() {}); + public static final Capability CAPABILITY_CIRCUIT_SLOT = CapabilityManager + .get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_RECIPE_LOGIC = CapabilityManager .get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_ELECTRIC_ITEM = CapabilityManager @@ -53,6 +56,7 @@ public static void register(RegisterCapabilitiesEvent event) { event.register(IToolable.class); event.register(IWorkable.class); event.register(IControllable.class); + event.register(IHasCircuitSlot.class); event.register(RecipeLogic.class); event.register(IElectricItem.class); event.register(ICleanroomReceiver.class); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/CCTweakedPlugin.java b/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/CCTweakedPlugin.java index 5df5704c76a..a87218ec587 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/CCTweakedPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/CCTweakedPlugin.java @@ -20,10 +20,12 @@ public static void init() { ComputerCraftAPI.registerGenericSource(new WorkablePeripheral()); ComputerCraftAPI.registerGenericSource(new CoverHolderPeripheral()); ComputerCraftAPI.registerGenericSource(new CentralMonitorPeripheral()); + ComputerCraftAPI.registerGenericSource(new CircuitSlotPeripheral()); ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_CONTROLLABLE); ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_ENERGY_INFO_PROVIDER); ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_TURBINE_MACHINE); ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_WORKABLE); + ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_CIRCUIT_SLOT); ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_COVERABLE); ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_CENTRAL_MONITOR); PlaceholderHandler.addPlaceholder(new Placeholder("bufferText") { diff --git a/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/CircuitSlotPeripheral.java b/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/CircuitSlotPeripheral.java new file mode 100644 index 00000000000..fbeb396689e --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/CircuitSlotPeripheral.java @@ -0,0 +1,43 @@ +package com.gregtechceu.gtceu.integration.cctweaked.peripherals; + +import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; +import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; + +import net.minecraft.world.item.ItemStack; + +import dan200.computercraft.api.lua.LuaException; +import dan200.computercraft.api.lua.LuaFunction; +import dan200.computercraft.api.peripheral.GenericPeripheral; + +import java.util.Optional; + +import javax.annotation.Nullable; + +public class CircuitSlotPeripheral implements GenericPeripheral { + + public String id() { + return "gtceu:circuit_slot"; + } + + @LuaFunction + public static @Nullable Integer getProgrammedCircuit(IHasCircuitSlot hasCircuitSlot) { + ItemStack circuitStack = hasCircuitSlot.getCircuitInventory().getStackInSlot(0); + if (circuitStack == ItemStack.EMPTY) return null; + return IntCircuitBehaviour.getCircuitConfiguration(circuitStack); + } + + // Note: using '@Nullable Integer newValue' as a param causes the function to not be picked up by CC. + // It needs the Optional, despite Java complaining about it. + @LuaFunction + public static void setProgrammedCircuit(IHasCircuitSlot hasCircuitSlot, + Optional newValue) throws LuaException { + if (newValue.isEmpty()) { + hasCircuitSlot.getCircuitInventory().setStackInSlot(0, ItemStack.EMPTY); + } else { + if ((newValue.get() < 0) || (newValue.get() > 32)) { + throw new LuaException("newValue " + newValue.get() + " is not within range 0..32 or nil"); + } + hasCircuitSlot.getCircuitInventory().setStackInSlot(0, IntCircuitBehaviour.stack(newValue.get())); + } + } +} From fcbe8d75198b2bfec6c7282d75935b62d67b6c33 Mon Sep 17 00:00:00 2001 From: Ghostipedia / Caitlynn <46772882+Ghostipedia@users.noreply.github.com> Date: Thu, 15 Jan 2026 12:25:49 -0500 Subject: [PATCH 24/28] Revert "Add CC: Tweaked peripheral for ghost programmed circuit" (#4478) --- dependencies.gradle | 2 +- gradle/forge.versions.toml | 2 +- .../blockentity/MetaMachineBlockEntity.java | 10 ----- .../api/capability/GTCapabilityHelper.java | 6 --- .../api/capability/forge/GTCapability.java | 4 -- .../cctweaked/CCTweakedPlugin.java | 2 - .../peripherals/CircuitSlotPeripheral.java | 43 ------------------- 7 files changed, 2 insertions(+), 67 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/CircuitSlotPeripheral.java diff --git a/dependencies.gradle b/dependencies.gradle index fcfdee1e87d..4334e330e3c 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -93,8 +93,8 @@ dependencies { modExtraLocalRuntime(forge.javd) modExtraLocalRuntime(forge.trenzalore) modExtraLocalRuntime(forge.curios) - modExtraLocalRuntime(forge.cc.tweaked.forge.impl) // modExtraLocalRuntime(forge.worldstripper) +// modExtraLocalRuntime(forge.cc.tweaked.forge.impl) for some reason this breaks create modExtraLocalRuntime(forge.bundles.kjs) diff --git a/gradle/forge.versions.toml b/gradle/forge.versions.toml index e98ba18e3bf..eac33484595 100644 --- a/gradle/forge.versions.toml +++ b/gradle/forge.versions.toml @@ -21,7 +21,7 @@ ftblibrary = "2001.2.4" ftbteams = "2001.3.0" ftbquests = "2001.4.11" ftbchunks = "2001.3.4" -ccTweaked = "1.115.1" +ccTweaked = "1.114.3" create = "6.0.6-150" ponder = "1.0.80" flywheel = "1.0.4" diff --git a/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java index a36235f28d9..db0589bd9c4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java @@ -7,7 +7,6 @@ import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; @@ -180,15 +179,6 @@ public static LazyOptional getCapability(MetaMachine machine, @NotNull Ca return GTCapability.CAPABILITY_CONTROLLABLE.orEmpty(cap, LazyOptional.of(() -> controllable)); } } - } else if (cap == GTCapability.CAPABILITY_CIRCUIT_SLOT) { - if (machine instanceof IHasCircuitSlot hasCircuitSlot) { - return GTCapability.CAPABILITY_CIRCUIT_SLOT.orEmpty(cap, LazyOptional.of(() -> hasCircuitSlot)); - } - for (MachineTrait trait : machine.getTraits()) { - if (trait instanceof IHasCircuitSlot hasCircuitSlot) { - return GTCapability.CAPABILITY_CIRCUIT_SLOT.orEmpty(cap, LazyOptional.of(() -> hasCircuitSlot)); - } - } } else if (cap == GTCapability.CAPABILITY_RECIPE_LOGIC) { for (MachineTrait trait : machine.getTraits()) { if (trait instanceof RecipeLogic recipeLogic) { 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 babd82db0fb..49ba637ac4d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapabilityHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapabilityHelper.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.api.capability; import com.gregtechceu.gtceu.api.capability.forge.GTCapability; -import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; @@ -71,11 +70,6 @@ public static IControllable getControllable(Level level, BlockPos pos, @Nullable return getBlockEntityCapability(GTCapability.CAPABILITY_CONTROLLABLE, level, pos, side); } - @Nullable - public static IHasCircuitSlot getCircuitSlot(Level level, BlockPos pos, @Nullable Direction side) { - return getBlockEntityCapability(GTCapability.CAPABILITY_CIRCUIT_SLOT, level, pos, side); - } - @Nullable public static RecipeLogic getRecipeLogic(Level level, BlockPos pos, @Nullable Direction side) { return getBlockEntityCapability(GTCapability.CAPABILITY_RECIPE_LOGIC, level, pos, side); diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/forge/GTCapability.java b/src/main/java/com/gregtechceu/gtceu/api/capability/forge/GTCapability.java index da01c5e0a22..18e989bda1e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/forge/GTCapability.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/forge/GTCapability.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.api.capability.forge; import com.gregtechceu.gtceu.api.capability.*; -import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; @@ -21,8 +20,6 @@ public class GTCapability { public static final Capability CAPABILITY_WORKABLE = CapabilityManager.get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_CONTROLLABLE = CapabilityManager .get(new CapabilityToken<>() {}); - public static final Capability CAPABILITY_CIRCUIT_SLOT = CapabilityManager - .get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_RECIPE_LOGIC = CapabilityManager .get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_ELECTRIC_ITEM = CapabilityManager @@ -56,7 +53,6 @@ public static void register(RegisterCapabilitiesEvent event) { event.register(IToolable.class); event.register(IWorkable.class); event.register(IControllable.class); - event.register(IHasCircuitSlot.class); event.register(RecipeLogic.class); event.register(IElectricItem.class); event.register(ICleanroomReceiver.class); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/CCTweakedPlugin.java b/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/CCTweakedPlugin.java index a87218ec587..5df5704c76a 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/CCTweakedPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/CCTweakedPlugin.java @@ -20,12 +20,10 @@ public static void init() { ComputerCraftAPI.registerGenericSource(new WorkablePeripheral()); ComputerCraftAPI.registerGenericSource(new CoverHolderPeripheral()); ComputerCraftAPI.registerGenericSource(new CentralMonitorPeripheral()); - ComputerCraftAPI.registerGenericSource(new CircuitSlotPeripheral()); ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_CONTROLLABLE); ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_ENERGY_INFO_PROVIDER); ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_TURBINE_MACHINE); ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_WORKABLE); - ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_CIRCUIT_SLOT); ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_COVERABLE); ForgeComputerCraftAPI.registerGenericCapability(GTCapability.CAPABILITY_CENTRAL_MONITOR); PlaceholderHandler.addPlaceholder(new Placeholder("bufferText") { diff --git a/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/CircuitSlotPeripheral.java b/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/CircuitSlotPeripheral.java deleted file mode 100644 index fbeb396689e..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/cctweaked/peripherals/CircuitSlotPeripheral.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.gregtechceu.gtceu.integration.cctweaked.peripherals; - -import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; -import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; - -import net.minecraft.world.item.ItemStack; - -import dan200.computercraft.api.lua.LuaException; -import dan200.computercraft.api.lua.LuaFunction; -import dan200.computercraft.api.peripheral.GenericPeripheral; - -import java.util.Optional; - -import javax.annotation.Nullable; - -public class CircuitSlotPeripheral implements GenericPeripheral { - - public String id() { - return "gtceu:circuit_slot"; - } - - @LuaFunction - public static @Nullable Integer getProgrammedCircuit(IHasCircuitSlot hasCircuitSlot) { - ItemStack circuitStack = hasCircuitSlot.getCircuitInventory().getStackInSlot(0); - if (circuitStack == ItemStack.EMPTY) return null; - return IntCircuitBehaviour.getCircuitConfiguration(circuitStack); - } - - // Note: using '@Nullable Integer newValue' as a param causes the function to not be picked up by CC. - // It needs the Optional, despite Java complaining about it. - @LuaFunction - public static void setProgrammedCircuit(IHasCircuitSlot hasCircuitSlot, - Optional newValue) throws LuaException { - if (newValue.isEmpty()) { - hasCircuitSlot.getCircuitInventory().setStackInSlot(0, ItemStack.EMPTY); - } else { - if ((newValue.get() < 0) || (newValue.get() > 32)) { - throw new LuaException("newValue " + newValue.get() + " is not within range 0..32 or nil"); - } - hasCircuitSlot.getCircuitInventory().setStackInSlot(0, IntCircuitBehaviour.stack(newValue.get())); - } - } -} From 3dca9effbaf8515e01c87c9d8ac0359b0c82c5ea Mon Sep 17 00:00:00 2001 From: Tar Laboratories <159147059+TarLaboratories@users.noreply.github.com> Date: Fri, 16 Jan 2026 02:21:32 +0800 Subject: [PATCH 25/28] Only allow http and https (#4457) --- .../gtceu/api/misc/ImageCache.java | 50 ++++++++++++++----- .../electric/monitor/MonitorGroup.java | 21 +++++++- .../SCPacketMonitorGroupNBTChange.java | 8 ++- .../gtceu/config/ConfigHolder.java | 4 ++ 4 files changed, 68 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/misc/ImageCache.java b/src/main/java/com/gregtechceu/gtceu/api/misc/ImageCache.java index de9b8410f25..4f8353144ee 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/misc/ImageCache.java +++ b/src/main/java/com/gregtechceu/gtceu/api/misc/ImageCache.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.api.misc; import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.config.ConfigHolder; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; @@ -8,6 +9,7 @@ import java.io.IOException; import java.io.InputStream; +import java.net.MalformedURLException; import java.net.URL; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; @@ -18,6 +20,7 @@ public class ImageCache { public static final long REFRESH_SECS = 120; public static final long EXPIRE_SECS = 300; private static final byte[] NULL_MARKER = new byte[0]; + private static final String[] ALLOWED_PROTOCOLS = new String[] { "http", "https" }; private static boolean downloading = false; @@ -25,19 +28,42 @@ public class ImageCache { .refreshAfterWrite(REFRESH_SECS, TimeUnit.SECONDS) .expireAfterAccess(EXPIRE_SECS, TimeUnit.SECONDS) .concurrencyLevel(3) - .build(CacheLoader.from(url -> { - if (downloading) return NULL_MARKER; - downloading = true; - - try (InputStream stream = new URL(url).openStream()) { - return stream.readAllBytes(); - } catch (IOException e) { - GTCEu.LOGGER.error("Could not load image {}", url, e); - downloading = false; + .build(CacheLoader.from(urlString -> { + try { + URL url = new URL(urlString); + boolean singleplayer = GTCEu.getMinecraftServer().isSingleplayer() && + !GTCEu.getMinecraftServer().isPublished(); + boolean allowedProtocol = singleplayer; + for (String protocol : ALLOWED_PROTOCOLS) { + if (url.getProtocol().equalsIgnoreCase(protocol)) { + allowedProtocol = true; + break; + } + } + if (!allowedProtocol) return NULL_MARKER; + boolean allowedDomain = singleplayer; + for (String domain : ConfigHolder.INSTANCE.gameplay.allowedImageDomains) { + if (url.getHost().equalsIgnoreCase(domain)) { + allowedDomain = true; + break; + } + } + if (!allowedDomain) return NULL_MARKER; + if (downloading) return NULL_MARKER; + downloading = true; + + try (InputStream stream = url.openStream()) { + byte[] image = stream.readAllBytes(); + GTCEu.LOGGER.debug("Downloaded image {}! Executing callback", url); + return image; + } catch (IOException e) { + GTCEu.LOGGER.error("Could not load image {}", url, e); + return NULL_MARKER; + } finally { + downloading = false; + } + } catch (MalformedURLException e) { return NULL_MARKER; - } finally { - GTCEu.LOGGER.debug("Downloaded image {}! Executing callback", url); - downloading = false; } })); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/monitor/MonitorGroup.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/monitor/MonitorGroup.java index 4cc4001222e..c2e0c35dafe 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/monitor/MonitorGroup.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/monitor/MonitorGroup.java @@ -4,6 +4,9 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.capability.IMonitorComponent; import com.gregtechceu.gtceu.api.cover.CoverBehavior; +import com.gregtechceu.gtceu.api.item.IComponentItem; +import com.gregtechceu.gtceu.api.item.component.IItemComponent; +import com.gregtechceu.gtceu.api.item.component.IMonitorModuleItem; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import net.minecraft.core.BlockPos; @@ -43,13 +46,29 @@ public class MonitorGroup { @Getter private int dataSlot = 0; + public static boolean isModule(ItemStack stack) { + if (stack.getItem() instanceof IComponentItem componentItem) { + for (IItemComponent itemComponent : componentItem.getComponents()) { + if (itemComponent instanceof IMonitorModuleItem) return true; + } + } + return false; + } + + public static CustomItemStackHandler createModuleHandler() { + CustomItemStackHandler customItemStackHandler = new CustomItemStackHandler(1); + customItemStackHandler.setFilter(MonitorGroup::isModule); + return customItemStackHandler; + } + public MonitorGroup(String name) { - this(name, new CustomItemStackHandler(1), new CustomItemStackHandler(8)); + this(name, createModuleHandler(), new CustomItemStackHandler(8)); } public MonitorGroup(String name, CustomItemStackHandler handler, CustomItemStackHandler placeholderSlotsHandler) { this.name = name; this.itemStackHandler = handler; + this.itemStackHandler.setFilter(MonitorGroup::isModule); this.placeholderSlotsHandler = placeholderSlotsHandler; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/network/packets/SCPacketMonitorGroupNBTChange.java b/src/main/java/com/gregtechceu/gtceu/common/network/packets/SCPacketMonitorGroupNBTChange.java index 9b7aa42c088..7e39518a393 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/network/packets/SCPacketMonitorGroupNBTChange.java +++ b/src/main/java/com/gregtechceu/gtceu/common/network/packets/SCPacketMonitorGroupNBTChange.java @@ -12,6 +12,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraftforge.common.util.LogicalSidedProvider; +import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.network.NetworkEvent; import java.util.Optional; @@ -50,8 +51,11 @@ public void execute(NetworkEvent.Context context) { MetaMachine machine = MetaMachine.getMachine(level, pos); if (machine instanceof CentralMonitorMachine centralMonitor) { - centralMonitor.getMonitorGroups().get(monitorGroupId) - .getItemStackHandler().setStackInSlot(0, stack); + IItemHandlerModifiable itemHandler = centralMonitor.getMonitorGroups().get(monitorGroupId) + .getItemStackHandler(); + if (ItemStack.isSameItem(itemHandler.getStackInSlot(0), stack)) { + itemHandler.setStackInSlot(0, stack); + } } } diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index 484250dd946..0956ffa83be 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -739,6 +739,10 @@ public static class GameplayConfigs { @Configurable.Comment({ "How much environmental hazards decay per chunk, per tick.", "Default: 0.001" }) public float environmentalHazardDecayRate = 0.001f; + @Configurable + @Configurable.Comment({ "List of domains that are allowed in the image module" }) + public String[] allowedImageDomains = new String[] { "imgur.com", "discord.com", "github.com", + "raw.githubusercontent.com" }; } public static class ClientConfigs { From 348455164c829b4722a8dea1235297a7717e1069 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Tue, 20 Jan 2026 13:25:11 +0200 Subject: [PATCH 26/28] Clean up adjacency condition serialization (#4260) Co-authored-by: Jurre Groenendijk --- docs/content/Modpacks/Changes/v7.5.0.md | 15 ++ .../Examples/Custom-Recipe-Condition.md | 78 +++++---- .../Modpacks/Recipes/Recipe-Conditions.md | 72 +++++---- .../gtceu/api/codec/GTCodecUtils.java | 33 +++- .../gtceu/api/recipe/GTRecipe.java | 6 +- .../gtceu/api/recipe/GTRecipeSerializer.java | 9 +- .../gtceu/api/recipe/RecipeCondition.java | 50 +++--- .../condition/ConditionSerializeUtils.java | 150 ------------------ .../recipe/condition/RecipeConditionType.java | 4 +- .../api/recipe/modifier/ModifierFunction.java | 4 +- .../gtceu/api/recipe/ui/GTRecipeTypeUI.java | 6 +- .../gtceu/common/data/GTRecipeConditions.java | 6 +- .../condition/AdjacentBlockCondition.java | 87 +++++----- .../condition/AdjacentFluidCondition.java | 89 ++++++----- .../recipe/condition/BiomeCondition.java | 16 +- .../recipe/condition/CleanroomCondition.java | 16 +- .../recipe/condition/DaytimeCondition.java | 13 +- .../recipe/condition/DimensionCondition.java | 33 ++-- .../recipe/condition/EUToStartCondition.java | 16 +- .../EnvironmentalHazardCondition.java | 16 +- .../recipe/condition/FTBQuestCondition.java | 17 +- .../recipe/condition/GameStageCondition.java | 20 +-- .../condition/HeraclesQuestCondition.java | 17 +- .../recipe/condition/PositionYCondition.java | 19 ++- .../recipe/condition/RainingCondition.java | 16 +- .../recipe/condition/ResearchCondition.java | 17 +- .../recipe/condition/ThunderCondition.java | 22 ++- .../recipe/condition/VentCondition.java | 11 +- .../data/recipe/builder/GTRecipeBuilder.java | 13 +- .../kjs/recipe/GTRecipeSchema.java | 5 +- .../recipe/components/GTRecipeComponents.java | 14 +- .../api/recipe/GTRecipeSerializerTest.java | 103 +++++++----- 32 files changed, 477 insertions(+), 516 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/recipe/condition/ConditionSerializeUtils.java diff --git a/docs/content/Modpacks/Changes/v7.5.0.md b/docs/content/Modpacks/Changes/v7.5.0.md index f81b0ece042..898852884bc 100644 --- a/docs/content/Modpacks/Changes/v7.5.0.md +++ b/docs/content/Modpacks/Changes/v7.5.0.md @@ -4,7 +4,22 @@ title: "Version 7.5.0" # Updating from `7.4.1` to `7.5.0` + ## MachineBuilder Generics We have added a second Generic argument to our (Multiblock)MachineBuilder. This effectively means that anywhere where you used to store a partially finished `MachineBuilder`, you now need to store a `MachineBuilder`. The same holds for `MultiblockMachineBuilder`. + +## RecipeCondition Generics +We have added a Generic argument to `RecipeCondition` describing the condition. +This means that your custom recipe conditions now need to extend `RecipeCondition` (whereas before they just extended `RecipeCondition`). +For example, if you have a custom recipe condition class like so: `public class ExampleCondition extends RecipeCondition`, it should now be `public class ExampleCondition extends RecipeCondition`. +You also need to adjust the generics of `getType()` and `createTemplate()` to match this change, like so: +```patch +- public RecipeConditionType getType() { ++ public RecipeConditionType getType() { + +- public RecipeCondition createTemplate() { ++ public ExampleCondition createTemplate() { +``` + ## Machine & Cover Copy/Paste System A new system for copying machines using the Machine Memory Card has been added, see [this page](../Other-Topics/Cover-Machine-Copy-Paste-Support.md) if you want to add extra copy/paste behaviour to your own machines and covers. diff --git a/docs/content/Modpacks/Examples/Custom-Recipe-Condition.md b/docs/content/Modpacks/Examples/Custom-Recipe-Condition.md index a457621f8f8..accfae4e6c9 100644 --- a/docs/content/Modpacks/Examples/Custom-Recipe-Condition.md +++ b/docs/content/Modpacks/Examples/Custom-Recipe-Condition.md @@ -15,35 +15,50 @@ They are registered using @Mod(ExampleMod.MOD_ID) public class ExampleMod { - public ExampleMod(FMLJavaModLoadingContext context) { - var bus = context.getModEventBus(); - bus.addGenericListener(RecipeConditionType.class, this::registerConditions); - } - + // in 1.20.1 public static RecipeConditionType EXAMPLE_CONDITION; + + public ExampleMod() { + IEventBus modBus = FMLJavaModLoadingContext.get().getModEventBus(); + modBus.addGenericListener(RecipeConditionType.class, this::registerConditions); + } + + public void registerConditions(GTCEuAPI.RegisterEvent> event) { + EXAMPLE_CONDITION = GTRegistries.RECIPE_CONDITIONS.register("example_condition", // (1) + new RecipeConditionType<>(ExampleCondition::new, ExampleCondition.CODEC)); + } + // end 1.20.1 + + // in 1.21.1 + public static final RecipeConditionType EXAMPLE_CONDITION = GTRegistries.register(GTRegistries.RECIPE_CONDITIONS, + ResourceLocation.fromNamespaceAndPath(ExampleMod.MOD_ID, "example_condition"), // (2) + new RecipeConditionType<>(ExampleCondition::new, ExampleCondition.CODEC)); + + public ExampleMod(IEventBus modBus, FMLModContainer container) { + modBus.addListener(CommonInit::onRegister); + bus.addListener(RecipeConditionType.class, this::registerConditions); + } public void registerConditions(GTCEuAPI.RegisterEvent> event) { EXAMPLE_CONDITION = GTRegistries.RECIPE_CONDITIONS.register("example_condition", - new RecipeConditionType<>( - ExampleCondition::new, - ExampleCondition.CODEC - ) - ); + new RecipeConditionType<>(ExampleCondition::new, ExampleCondition.CODEC)); } + // end 1.21.1 } ``` +1. The 1.20.1 version doesn't require a namespace, so make sure you don't use the same ID as someone else! +2. You may use a helper method akin to `GTCEu.id` for creating the ResourceLocation, but you **must** use your own namespace for it. + We will set up a condition that requires that the power buffer of the machine is above a certain Y level. ```java -public class ExampleCondition extends RecipeCondition { +public class ExampleCondition extends RecipeCondition { - public int height; - - public static final Codec CODEC = RecordCodecBuilder - .create(instance -> RecipeCondition.isReverse(instance) - .and(Codec.INT.fieldOf("height").forGetter(val -> val.height)) - .apply(instance, ExampleCondition::new)); + public static final Codec CODEC = RecordCodecBuilder.create(instance -> RecipeCondition.isReverse(instance) + .and(Codec.INT.fieldOf("height").forGetter(val -> val.height) + ).apply(instance, ExampleCondition::new)); + public int height; public ExampleCondition(boolean isReverse, int height) { this.isReverse = isReverse; @@ -52,14 +67,14 @@ public class ExampleCondition extends RecipeCondition { public ExampleCondition(int height) { this(false, height); - } + } public ExampleCondition() { this(false, 0); } @Override - public RecipeConditionType getType() { + public RecipeConditionType getType() { return ExampleMod.EXAMPLE_CONDITION; } @@ -74,7 +89,7 @@ public class ExampleCondition extends RecipeCondition { } @Override - public RecipeCondition createTemplate() { + public ExampleCondition createTemplate() { return new ExampleCondition(0); } } @@ -85,7 +100,7 @@ Lets step through this example. This will not be in order as it is in the file, Starting with: ```java @Override - public RecipeConditionType getType() { + public RecipeConditionType getType() { return ExampleMod.EXAMPLE_CONDITION; } @@ -105,16 +120,12 @@ This part is quite simple, and just returns the type and tooltip for the conditi public ExampleCondition(int height) { this(false, height); } - - public ExampleCondition() { - this(false, 0); - } ``` -These are the constructors. We need the `isReverse`, as it is part of the overarching `RecipeCondition` type. `isReverse` means that if the condition is met, your recipe won't be run. Furthermore, a no-arg constructor is required for (de)serialization. +These are the constructors. We need the `isReverse`, as it is part of the overarching `RecipeCondition` type. `isReverse` means that if the condition is met, your recipe won't be run. Furthermore, a constructor with all arguments is required for (de)serialization. ```java @Override - public RecipeCondition createTemplate() { + public ExampleCondition createTemplate() { return new ExampleCondition(0); } ``` @@ -131,12 +142,11 @@ This creates the basic "template" that might be used for serialization. This sho This is the actual condition. ```java + public static final Codec CODEC = RecordCodecBuilder.create(instance -> RecipeCondition.isReverse(instance).and( + Codec.INT.fieldOf("height").forGetter(val -> val.height) + ).apply(instance, ExampleCondition::new)); + public int height; - - public static final Codec CODEC = RecordCodecBuilder - .create(instance -> RecipeCondition.isReverse(instance) - .and(Codec.INT.fieldOf("height").forGetter(val -> val.height)) - .apply(instance, ExampleCondition::new)); ``` The CODEC is how java knows how to serialize/deserialize your condition. This is needed for syncing between client/server, and storing it to json to load when the world loads. @@ -144,8 +154,8 @@ It consists of a few parts: - `RecordCodecBuilder.create(instance -> ` means we will start a RecordCodecBuilder, or a builder that only consists of simple types. - `RecipeCondition.isReverse(instance)` is a helper codec that serializes the isReverse boolean of your codec. -- `.and(` means this is the next field in the record. -- `Codec.INT.fieldOf("height").forGetter(val -> val.height)` means we want to serialize an INT, we want to call it "height" in the json, and to get the value you call `.height`. +- `.and(` allows adding additional fields to the codec. +- `Codec.INT.fieldOf("height").forGetter(val -> val.height)` means we want to serialize an integer, we want to call it "height" in the JSON, and to get the value to serialize you use `ExampleCondition#height`. - `.apply(instance, ExampleCondition::new)` means when deserializing back to an object, you apply these steps to get the values (in this case `bool isReverse, int height`) and call the constructor with those arguments. In this case, this would call our `new ExampleCondition(isReverse, height)` constructor we have defined earlier. diff --git a/docs/content/Modpacks/Recipes/Recipe-Conditions.md b/docs/content/Modpacks/Recipes/Recipe-Conditions.md index 47fdaaa0ef8..5bd1a33e75b 100644 --- a/docs/content/Modpacks/Recipes/Recipe-Conditions.md +++ b/docs/content/Modpacks/Recipes/Recipe-Conditions.md @@ -4,7 +4,7 @@ title: Recipe Conditions Recipe Conditions are recipe properties that can prevent a recipe from starting based on certain criteria, like for example Biome, Weather, Quest Completions, or self-made custom Conditions. -These conditions can be used in both java and kubejs recipes. However, custom conditons can only be done in java. If you want to see how to make these, check out the [Custom Recipe Condition](../Examples/Custom-Recipe-Condition.md) example page. +These conditions can be used in both Java and KubeJS recipes. However, custom conditions can only be done in Java addons. If you want to see how to make these, check out the [Custom Recipe Condition](../Examples/Custom-Recipe-Condition.md) example page. !!! Note The condition is run after recipe matching and before recipe execution. If the recipe condition doesn't match, the machine will be suspended and won't be updated again until something in the inputs/outputs changes. @@ -12,38 +12,54 @@ These conditions can be used in both java and kubejs recipes. However, custom co ### Base Conditons - Biome: `.biome("namespace:biome_id")` - - Locks a recipe behind being inside a certain biome, works with any biome a pack has loaded. For example, you could use `minecraft:plains`. + - Locks a recipe behind being inside a certain biome, works with any biome a pack has loaded. + For example, you could do `.biome("minecraft:plains")`. - Dimension: `.dimension("namespace:dimension_id")` - - Locks a recipe being behind a certain dimension, the gas collector is a good example of this. For example, you could use `minecraft:the_end` -- Position_Y: `.posY(int min, int max)` - - Locks a recipe behind a certain y level in-world. For example, you could use `.posY(120, 130)` to have a recipe require a machine to be in between y 120 and y 130. + - Locks a recipe being behind a certain dimension, the gas collector is a good example of this. + - For example, you could do `.dimension("minecraft:the_end")` +- Y Position: `.posY(int min, int max)` + - Locks a recipe behind a certain y level in-world. + - For example, you could use `.posY(120, 130)` to have a recipe require a machine to be in between y 120 and y 130. - Rain: `.rain(float level)` - - Locks a recipe behind a certain level of rain. For example, you could use `.rain(1.0)` to make a recipe need full rain. -- Adjacent_Fluids: `adjacentFluids("minecraft:water","minecraft:lava")` - - You can pass through any amount of fluids into the array. Moreover, any fluid passed into the array will make the recipe require a full source block touching the machine. We also have `adjacentFluidTag("forge:water", "forge:lava")`. -- Adjacent_Blocks: `adjacentBlocks("minecraft:stone", "minecraft:iron_block")` - - Much like the fluid condition, you can pass blocks into the array that lock the recipe behind needing the machine to touch these blocks. We also have `adjacentBlockTag("forge:stone", "forge:storage_blocks/iron")`. + - Locks a recipe behind a certain level of rain. + - For example, you could use `.rain(1.0)` to make a recipe need full rain. +- Adjacent Fluids: `.adjacentFluids("namespace:fluid_id", ...)` + - You can pass any amount of fluids into the array. Moreover, any fluid passed into the array will make the recipe require a full source block touching the machine. + - For example, you could use `.adjacentFluids("minecraft:water", "minecraft:lava")` to make a recipe require BOTH a water source and a lava source next to the machine. + - We also have `.adjacentFluidTag("forge:water", "forge:lava")`, which does the same, but allows fluid _tags_ to be used. +- Adjacent Blocks: `.adjacentBlocks("namespace:block_id", ...)` + - Much like the fluid condition, you can pass blocks into the array that lock the recipe behind needing the machine to touch these blocks. + - For example, you could use `.adjacentBlocks("minecraft:stone", "minecraft:iron_block")` to make a recipe require a Stone block and a Block of Iron. + - We also have `.adjacentBlockTag("forge:stone", "forge:storage_blocks/iron")`, which does the same, but allows block _tags_ to be used. - Thunder: `.thunder(float level)` - - Locks a recipe behind a certain level of rain. For example, you could use `.thunder(1.0)` to make a recipe need a strong thunderstorm. -- Vent: This condition is auto added to any steam single block, it blocks recipes from running if the vent is obstructed. + - Locks a recipe behind a certain level of rain. + - For example, you could use `.thunder(1.0)` to make a recipe need a strong thunderstorm. +- Vent: This condition is automatically added to any recipes ran in a single block steam machine. It blocks recipes from running if the machine's vent is obstructed. - Cleanroom: `.cleanroom(CleanroomType.CLEANROOM)` - - Locks a recipe to being inside a cleanroom. You can also use STERILE_CLEANROOM as well as your own custom cleanroom type. -- Fusion_Start_EU: `.fusionStartEU(long eu)` - - Locks a recipe behind the amount of stored power in a fusion machine. To use this, the machine must use the FusionReactorMachine class. For example, you could use `.fusionStartEU(600000)` -- Station_Research: `.stationResearch(b => b.researchStack("namespace:item_id").EUt(long eu).CWUt(int minCWUPerTick, int TotalCWU))` - - Locks a recipe behind having a certain research stack. For this condition to be properly seen, you will either need a base machine recipe type with the research ui component, or make your own. For example, you could do `.stationResearch(b => b.researchStack("gtceu:lv_motor").EUt(131000).CWUt(24, 12000))` which would lock a recipe behind needing a data orb with the lv motor research. It will also generate you a research station recipe. -- Scanner_Research: `.scannerResearch(b => b.researchStack("namespace:item_id").EUt(long eu))` - - Much like station research, this condition locks a recipe behind needing a research stack. However, in this case it will default to a data stick. For example, you could do `.scannerResearch(b => b.researchStack("gtceu:lv_motor").EUt(8192))`, which would make the recipe need a data stick with the lv motor research, and generates a scanner recipe. -- Enviromental_Hazard: `.environmentalHazard(GTMedicalConditions.CARBON_MONOXIDE_POISONING)` - - Locks a recipe into needing a certain environmental hazard to run. For now, carbon monoxide is the only one. An example of a machine using this condition is the air scrubber. -- Daytime: `.daytime(boolean notNight)` - - Locks recipe behind whether it is day or night. For example, you could do `.daytime(true)`, to make the recipe need it to be daytime. + - Locks a recipe to being inside a cleanroom. You can also use `STERILE_CLEANROOM` as well as your own custom cleanroom type(s). +- Fusion Start EU: `.fusionStartEU(long eu)` + - Locks a recipe behind the amount of stored power in a fusion machine. To use this, the machine must use the FusionReactorMachine class. + - For example, you could use `.fusionStartEU(600000)` +- Station Research: `.stationResearch(b => b.researchStack("namespace:item_id").EUt(long eu).CWUt(int minCWUPerTick, int TotalCWU))` + - Locks a recipe behind having a certain research stack. For this condition to be properly seen, you will either need a base machine recipe type with the research ui component, or make your own. + - For example, you could do `.stationResearch(b => b.researchStack("gtceu:lv_motor").EUt(131000).CWUt(24, 12000))` which would lock a recipe behind needing a data orb with the lv motor research. It will also generate you a research station recipe. +- Scanner Research: `.scannerResearch(b => b.researchStack("namespace:item_id").EUt(long eu))` + - Much like station research, this condition locks a recipe behind needing a research stack. However, in this case it will default to a data stick. + - For example, you could do `.scannerResearch(b => b.researchStack("gtceu:lv_motor").EUt(8192))`, which would make the recipe need a data stick with the lv motor research, and generates a scanner recipe. +- Environmental Hazard: `.environmentalHazard("medical_condition_name")` + - Locks a recipe into needing a certain environmental hazard to run. For now, `"carbon_monoxide_poisoning"` is the only one that's added to the world (by default). An example of a machine using this condition is the air scrubber. + - For example, you could do `.environmentalHazard("carcinogen")` (if you have something that creates radiation, as if you don't, the recipe would never run.) +- Daytime: `.daytime(boolean isNight)` + - Locks recipe behind whether it is day or night. + - For example, you could do `.daytime(true)` to make the recipe require nighttime to run. ### Mod Dependent Conditions -- Ftb_Quests: `.ftbQuest(quest_id)` - - Locks a recipe behind the owner of a machine completing a ftb quest. An example can't be easily given since every quest book is different. -- Gamestage: `.gameStage(gameStage_id)` +- FTB Quests: `.ftbQuest("quest_id")` + - Locks a recipe behind the owner of a machine completing a quest with FTB Quests. + - An example can't be easily given since every quest book is different. +- Game Stages: `.gameStage("gamestage_id")` - Locks a recipe behind a certain game stage. -- Heracles_Quests: `.heraclesQuest(quest_id)` - - Locks a recipe behind the owner of a machine completing a heracles quest. An example can't be easily given since every quest book is different. +- Odyssey Quests (Heracles): `.heraclesQuest("quest_id")` + - Locks a recipe behind the owner of a machine completing a quest with Heracles. + - An example can't be easily given since every quest book is different. diff --git a/src/main/java/com/gregtechceu/gtceu/api/codec/GTCodecUtils.java b/src/main/java/com/gregtechceu/gtceu/api/codec/GTCodecUtils.java index a3ae378ca3b..36577fdd3bc 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/codec/GTCodecUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/api/codec/GTCodecUtils.java @@ -1,14 +1,21 @@ package com.gregtechceu.gtceu.api.codec; +import com.gregtechceu.gtceu.utils.memoization.GTMemoizer; + import net.minecraft.util.ExtraCodecs; import com.mojang.datafixers.util.Either; +import com.mojang.datafixers.util.Pair; import com.mojang.serialization.Codec; import com.mojang.serialization.DataResult; +import com.mojang.serialization.DynamicOps; import java.util.function.Function; +import java.util.function.Supplier; + +public final class GTCodecUtils { -public class GTCodecUtils { + private GTCodecUtils() {} public static final Codec NON_NEGATIVE_LONG = longRangeWithMessage(0, Long.MAX_VALUE, (val) -> "Value must be non-negative: " + val); @@ -32,4 +39,28 @@ public static Codec longRange(long min, long max) { public static T unboxEither(Either either) { return either.map(Function.identity(), Function.identity()); } + + public static Codec> lazyParsingCodec(Codec delegate) { + return new LazyParsingCodec<>(delegate); + } + + private record LazyParsingCodec(Codec codec) implements Codec> { + + @Override + public DataResult, T>> decode(DynamicOps ops, T input) { + return DataResult.success(Pair.of(GTMemoizer.memoize(() -> deferredDecode(ops, input)), input)); + } + + @Override + public DataResult encode(Supplier input, DynamicOps ops, T prefix) { + return input.get() == null ? DataResult.success(prefix) : this.codec.encode(input.get(), ops, prefix); + } + + private A deferredDecode(DynamicOps ops, T input) { + return this.codec.decode(ops, input).get() + .map(Pair::getFirst, partial -> { + throw new IllegalStateException("Unable to parse deferred value: " + partial.message()); + }); + } + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipe.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipe.java index e065d5d7010..f66e4f1e55f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipe.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipe.java @@ -43,7 +43,7 @@ public class GTRecipe implements net.minecraft.world.item.crafting.Recipe, ChanceLogic> tickInputChanceLogics; public final Map, ChanceLogic> tickOutputChanceLogics; - public final List conditions; + public final List> conditions; // for KubeJS. actual type is List. // Must be List to not cause crashes without KubeJS. public final List ingredientActions; @@ -70,7 +70,7 @@ public GTRecipe(GTRecipeType recipeType, Map, ChanceLogic> outputChanceLogics, Map, ChanceLogic> tickInputChanceLogics, Map, ChanceLogic> tickOutputChanceLogics, - List conditions, + List> conditions, List ingredientActions, @NotNull CompoundTag data, int duration, @@ -90,7 +90,7 @@ public GTRecipe(GTRecipeType recipeType, Map, ChanceLogic> outputChanceLogics, Map, ChanceLogic> tickInputChanceLogics, Map, ChanceLogic> tickOutputChanceLogics, - List conditions, + List> conditions, List ingredientActions, @NotNull CompoundTag data, int duration, diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeSerializer.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeSerializer.java index 457bfd0c435..9730dd12684 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeSerializer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeSerializer.java @@ -80,14 +80,11 @@ public static void entryWriter(FriendlyByteBuf buf, Map.Entry conditionReader(FriendlyByteBuf buf) { return RecipeCondition.fromNetwork(buf); } - public static void conditionWriter(FriendlyByteBuf buf, RecipeCondition condition) { - buf.writeUtf(GTRegistries.RECIPE_CONDITIONS.getKey(condition.getType())); + public static void conditionWriter(FriendlyByteBuf buf, RecipeCondition condition) { condition.toNetwork(buf); } @@ -124,7 +121,7 @@ public GTRecipe fromNetwork(@NotNull ResourceLocation id, @NotNull FriendlyByteB buf1 -> GTRegistries.RECIPE_CAPABILITIES.get(buf1.readUtf()), buf1 -> GTRegistries.CHANCE_LOGICS.get(buf1.readUtf())); - List conditions = buf.readCollection(c -> new ArrayList<>(), + List> conditions = buf.readCollection(c -> new ArrayList<>(), GTRecipeSerializer::conditionReader); List ingredientActions = new ArrayList<>(); if (GTCEu.Mods.isKubeJSLoaded()) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeCondition.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeCondition.java index 7c8fae5e121..715e7b6e124 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeCondition.java @@ -8,37 +8,38 @@ import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; -import net.minecraft.Util; +import net.minecraft.nbt.NbtOps; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.resources.RegistryOps; -import net.minecraft.util.GsonHelper; -import com.google.gson.Gson; -import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.mojang.datafixers.Products; import com.mojang.serialization.Codec; -import com.mojang.serialization.DataResult; import com.mojang.serialization.JsonOps; import com.mojang.serialization.codecs.RecordCodecBuilder; -import io.netty.handler.codec.DecoderException; -import io.netty.handler.codec.EncoderException; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; import org.jetbrains.annotations.NotNull; +import java.util.function.Function; + @Accessors(chain = true) -public abstract class RecipeCondition { +public abstract class RecipeCondition> { - public static final Codec CODEC = GTRegistries.RECIPE_CONDITIONS.codec() + public static final Codec> CODEC = GTRegistries.RECIPE_CONDITIONS.codec() .dispatch(RecipeCondition::getType, RecipeConditionType::getCodec); - public static < - RC extends RecipeCondition> Products.P1, Boolean> isReverse(RecordCodecBuilder.Instance instance) { + // spotless:off + public static > Products.P1, Boolean> isReverse(RecordCodecBuilder.Instance instance) { return instance.group(Codec.BOOL.optionalFieldOf("reverse", false).forGetter(val -> val.isReverse)); } + // spotless:on + + public static > Codec simpleCodec(Function function) { + return RecordCodecBuilder.create(instance -> isReverse(instance).apply(instance, function)); + } @Getter @Setter @@ -52,7 +53,7 @@ public RecipeCondition(boolean isReverse) { this.isReverse = isReverse; } - public abstract RecipeConditionType getType(); + public abstract RecipeConditionType getType(); public String getTranslationKey() { return "gtceu.recipe.condition." + getType(); @@ -80,7 +81,7 @@ public boolean check(@NotNull GTRecipe recipe, @NotNull RecipeLogic recipeLogic) protected abstract boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic recipeLogic); - public abstract RecipeCondition createTemplate(); + public abstract T createTemplate(); @NotNull public final JsonObject serialize() { @@ -88,25 +89,20 @@ public final JsonObject serialize() { return CODEC.encodeStart(ops, this).getOrThrow(false, GTCEu.LOGGER::error).getAsJsonObject(); } - public static RecipeCondition deserialize(@NotNull JsonObject config) { + public static RecipeCondition deserialize(@NotNull JsonObject config) { var ops = RegistryOps.create(JsonOps.INSTANCE, GTRegistries.builtinRegistry()); - return CODEC.decode(ops, config).getOrThrow(false, GTCEu.LOGGER::error).getFirst(); + return CODEC.parse(ops, config).getOrThrow(false, GTCEu.LOGGER::error); } + @SuppressWarnings("deprecation") public final void toNetwork(FriendlyByteBuf buf) { - var ops = RegistryOps.create(JsonOps.INSTANCE, GTRegistries.builtinRegistry()); - // Code below was taken from buf.writeJsonWithCodec to include our RegistryOps - DataResult dataresult = CODEC.encodeStart(ops, this); - buf.writeUtf(new Gson().toJson((JsonElement) Util.getOrThrow(dataresult, - (p_261421_) -> new EncoderException("Failed to encode: " + p_261421_ + " " + String.valueOf(this))))); + var ops = RegistryOps.create(NbtOps.INSTANCE, GTRegistries.builtinRegistry()); + buf.writeWithCodec(ops, CODEC, this); } - public static RecipeCondition fromNetwork(FriendlyByteBuf buf) { - var ops = RegistryOps.create(JsonOps.INSTANCE, GTRegistries.builtinRegistry()); - // Code below was taken from buf.readJsonWithCodec to include our RegistryOps - JsonElement jsonelement = (JsonElement) GsonHelper.fromJson(new Gson(), buf.readUtf(), JsonElement.class); - DataResult dataresult = CODEC.parse(ops, jsonelement); - return (RecipeCondition) Util.getOrThrow(dataresult, - (p_272382_) -> new DecoderException("Failed to decode json: " + p_272382_)); + @SuppressWarnings("deprecation") + public static RecipeCondition fromNetwork(FriendlyByteBuf buf) { + var ops = RegistryOps.create(NbtOps.INSTANCE, GTRegistries.builtinRegistry()); + return buf.readWithCodec(ops, CODEC); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/condition/ConditionSerializeUtils.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/condition/ConditionSerializeUtils.java deleted file mode 100644 index 05b96391fd2..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/condition/ConditionSerializeUtils.java +++ /dev/null @@ -1,150 +0,0 @@ -package com.gregtechceu.gtceu.api.recipe.condition; - -import com.gregtechceu.gtceu.api.registry.GTRegistries; - -import net.minecraft.core.Holder; -import net.minecraft.core.HolderSet; -import net.minecraft.core.Registry; -import net.minecraft.core.registries.Registries; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.TagKey; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.Fluids; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -public class ConditionSerializeUtils { - - /** - * Encode a List> to a string encoding. - * HolderSets are separated by '|', and elements of a direct HolderSet are separated by ','. - * - * @param items The list of HolderSet to be encoded. - * @return A string encoding. - */ - public static String encodeHolderSets(List> items) { - StringBuilder sb = new StringBuilder(); - boolean first = true; - - for (HolderSet holderSet : items) { - if (!first) { - sb.append("|"); - } - sb.append(encodeHolderSet(holderSet)); - first = false; - } - - return sb.toString(); - } - - /** - * Encode a single HolderSet to a string. - * If it's a tag, it's encoded as #+location. - * If it's a direct list, elements are separated by ','. - * - * @param holderSet The HolderSet to be encoded. - * @return The encoded string. - */ - public static String encodeHolderSet(HolderSet holderSet) { - return holderSet.unwrap().map( - // Case 1: Tag - tagKey -> "#" + tagKey.location(), - // Case 2: Direct list of holders - holders -> holders.stream() - .map(holder -> getStringFromHolder(holder)) - .collect(Collectors.joining(","))); - } - - /** - * Encode a Holder into a String. - * - * @param holder The Holder to be encoded. - * @return A string encoding (location or #+tag_location). - * @throws RuntimeException if the holder cannot be serialized. - */ - public static String getStringFromHolder(Holder holder) { - Optional> keyOpt = holder.unwrapKey(); - if (keyOpt.isPresent()) { - return keyOpt.get().location().toString(); - } - - Optional> tagOpt = holder.tags().findFirst(); - if (tagOpt.isPresent()) { - return "#" + tagOpt.get().location(); - } - throw new RuntimeException("Could not serialize holder: " + holder); - } - - /** - * Decode a string into a List>. - * - * @param encodedString The string encoding. - * @param registryKey The ResourceKey of the registry. - * @return The decoded list of HolderSet. - */ - public static List> decodeHolderSets(String encodedString, - ResourceKey> registryKey) { - List> result = new ArrayList<>(); - for (String token : encodedString.split("\\|")) { - if (!token.isBlank()) { - result.add(decodeSingleHolderSet(token, registryKey)); - } - } - return result; - } - - /** - * Decode a string into a HolderSet. - * - * @param encodedSet The encoded set string. - * @param registryKey The ResourceKey of the registry. - * @return The decoded HolderSet. - * @throws RuntimeException if an unknown ID is encountered. - */ - public static HolderSet decodeSingleHolderSet(String encodedSet, - ResourceKey> registryKey) { - encodedSet = encodedSet.trim(); - if (encodedSet.isEmpty()) { - return HolderSet.direct(List.of()); - } - - Registry registry = GTRegistries.builtinRegistry().registry(registryKey).get(); // Use the helper - - // Case 1: Tag-based holder set - if (encodedSet.startsWith("#")) { - ResourceLocation tagId = new ResourceLocation(encodedSet.substring(1)); - TagKey tagKey = TagKey.create(registryKey, tagId); - return registry.getOrCreateTag(tagKey); - } - - // Case 2: Direct list of items - String[] parts = encodedSet.split(","); - List> holders = new ArrayList<>(); - for (String part : parts) { - ResourceLocation rl = new ResourceLocation(part.trim()); - T item = registry.get(rl); - if (item != null && item != getDefaultEmptyValue(registryKey)) { // Use a generic default empty check - holders.add(registry.wrapAsHolder(item)); - } else { - throw new RuntimeException("Unknown ID for registry " + registryKey.location() + ": " + rl); - } - } - return HolderSet.direct(holders); - } - - // Helper to get the default "empty" value for a registry type - private static T getDefaultEmptyValue(ResourceKey> registryKey) { - // Compare ResourceLocation directly instead of ResourceKey objects - if (registryKey.location().equals(Registries.FLUID.location())) { - return (T) Fluids.EMPTY; - } else if (registryKey.location().equals(Registries.BLOCK.location())) { - return (T) Blocks.AIR; - } - throw new IllegalArgumentException( - "Unsupported registry type for default value lookup: " + registryKey.location()); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/condition/RecipeConditionType.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/condition/RecipeConditionType.java index b73f764b78e..c78031b0704 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/condition/RecipeConditionType.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/condition/RecipeConditionType.java @@ -7,14 +7,14 @@ import lombok.Getter; @AllArgsConstructor -public class RecipeConditionType { +public class RecipeConditionType> { public final ConditionFactory factory; @Getter public final Codec codec; @FunctionalInterface - public interface ConditionFactory { + public interface ConditionFactory> { T createDefault(); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/modifier/ModifierFunction.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/modifier/ModifierFunction.java index a5c670f6500..67f6139a049 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/modifier/ModifierFunction.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/modifier/ModifierFunction.java @@ -108,11 +108,11 @@ final class FunctionBuilder { private ContentModifier outputModifier = ContentModifier.IDENTITY; private ContentModifier tickInputModifier = ContentModifier.IDENTITY; private ContentModifier tickOutputModifier = ContentModifier.IDENTITY; - private final List addedConditions = new ArrayList<>(); + private final List> addedConditions = new ArrayList<>(); public FunctionBuilder() {} - public FunctionBuilder conditions(RecipeCondition... conditions) { + public FunctionBuilder conditions(RecipeCondition... conditions) { addedConditions.addAll(Arrays.asList(conditions)); return this; } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/ui/GTRecipeTypeUI.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/ui/GTRecipeTypeUI.java index 5ba8a0417b2..65d9bdcacaa 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/ui/GTRecipeTypeUI.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/ui/GTRecipeTypeUI.java @@ -152,7 +152,7 @@ public Size getJEISize() { public record RecipeHolder(DoubleSupplier progressSupplier, Table, Object> storages, CompoundTag data, - List conditions, + List> conditions, boolean isSteam, boolean isHighPressure) {} @@ -164,7 +164,7 @@ public record RecipeHolder(DoubleSupplier progressSupplier, public WidgetGroup createUITemplate(DoubleSupplier progressSupplier, Table, Object> storages, CompoundTag data, - List conditions, + List> conditions, boolean isSteam, boolean isHighPressure) { var template = createEditableUITemplate(isSteam, isHighPressure); @@ -177,7 +177,7 @@ public WidgetGroup createUITemplate(DoubleSupplier progressSupplier, public WidgetGroup createUITemplate(DoubleSupplier progressSupplier, Table, Object> storages, CompoundTag data, - List conditions) { + List> conditions) { return createUITemplate(progressSupplier, storages, data, conditions, false, false); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeConditions.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeConditions.java index b9152721c47..c0576da5752 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeConditions.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeConditions.java @@ -57,9 +57,9 @@ public static void init() { GTRegistries.RECIPE_CONDITIONS.freeze(); } - private static RecipeConditionType register(String name, - RecipeConditionType.ConditionFactory factory, - Codec codec) { + private static > RecipeConditionType register(String name, + RecipeConditionType.ConditionFactory factory, + Codec codec) { return GTRegistries.RECIPE_CONDITIONS.register(name, new RecipeConditionType<>(factory, codec)); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentBlockCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentBlockCondition.java index 338314cf933..c114c379fe0 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentBlockCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentBlockCondition.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.common.recipe.condition; +import com.gregtechceu.gtceu.api.codec.GTCodecUtils; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; @@ -9,6 +10,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.HolderSet; +import net.minecraft.core.RegistryCodecs; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; @@ -20,55 +22,43 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import lombok.Getter; import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; - -import static com.gregtechceu.gtceu.api.recipe.condition.ConditionSerializeUtils.decodeHolderSets; -import static com.gregtechceu.gtceu.api.recipe.condition.ConditionSerializeUtils.encodeHolderSets; +import java.util.function.Supplier; @NoArgsConstructor -public class AdjacentBlockCondition extends RecipeCondition { +public class AdjacentBlockCondition extends RecipeCondition { // spotless:off - public static final Codec CODEC = - RecordCodecBuilder.create(instance -> RecipeCondition.isReverse(instance).and( - Codec.STRING.fieldOf("blockString").forGetter(AdjacentBlockCondition::getBlockString) - ).apply(instance, AdjacentBlockCondition::new)); + public static final Codec CODEC = RecordCodecBuilder.create(instance -> RecipeCondition.isReverse(instance).and( + GTCodecUtils.lazyParsingCodec(RegistryCodecs.homogeneousList(Registries.BLOCK)).listOf() + .fieldOf("blocks").forGetter(AdjacentBlockCondition::getBlockSuppliers) + ).apply(instance, AdjacentBlockCondition::new)); // spotless:on - @Getter - private @NotNull String blockString = ""; - - private @Nullable List> blocks = null; + private final List>> blocks = new ArrayList<>(); - public void setBlocks(@NotNull List> blocks) { - this.blocks = blocks; - this.blockString = encodeHolderSets(blocks); - } + private final List> resolvedBlocks = new ArrayList<>(); - public List> getBlocks() { - if (blocks == null) { - blocks = decodeHolderSets(getBlockString(), Registries.BLOCK); - } - return blocks; + private AdjacentBlockCondition(@NotNull List>> blocks) { + this(false, blocks); } - public AdjacentBlockCondition(@NotNull List> blocks) { - setBlocks(blocks); + private AdjacentBlockCondition(boolean isReverse, @NotNull List>> blocks) { + super(isReverse); + this.blocks.addAll(blocks); } - public AdjacentBlockCondition(boolean isReverse, @NotNull List> blocks) { - super(isReverse); - setBlocks(blocks); + public AdjacentBlockCondition(@NotNull Collection> blocks) { + this(false, blocks); } - public AdjacentBlockCondition(boolean isReverse, String blockString) { + public AdjacentBlockCondition(boolean isReverse, @NotNull Collection> blocks) { super(isReverse); - this.blockString = blockString; + this.resolvedBlocks.addAll(blocks); } public static AdjacentBlockCondition fromBlocks(Collection blocks) { @@ -94,7 +84,7 @@ public static AdjacentBlockCondition fromTags(TagKey... tags) { } @Override - public RecipeConditionType getType() { + public RecipeConditionType getType() { return GTRecipeConditions.ADJACENT_BLOCK; } @@ -128,25 +118,46 @@ public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic reci return false; } - public @NotNull List> getOrInitBlocks(@NotNull GTRecipe recipe) { - if (getBlocks().isEmpty() || (recipe.data.contains("blockA") && recipe.data.contains("blockB"))) { - List> blocks = new ArrayList<>(); + public @NotNull List> getOrInitBlocks(@Nullable GTRecipe recipe) { + if (resolvedBlocks.isEmpty() && !blocks.isEmpty()) { + for (var holderSetSupplier : this.blocks) { + this.resolvedBlocks.add(holderSetSupplier.get()); + } + } + if (!resolvedBlocks.isEmpty()) { + return resolvedBlocks; + } + + if (recipe != null && recipe.data.contains("blockA") && recipe.data.contains("blockB")) { + this.resolvedBlocks.clear(); Block blockA = BuiltInRegistries.BLOCK.get(new ResourceLocation(recipe.data.getString("blockA"))); if (!blockA.defaultBlockState().isAir()) { - blocks.add(HolderSet.direct(blockA.builtInRegistryHolder())); + this.resolvedBlocks.add(HolderSet.direct(blockA.builtInRegistryHolder())); } Block blockB = BuiltInRegistries.BLOCK.get(new ResourceLocation(recipe.data.getString("blockB"))); if (!blockB.defaultBlockState().isAir()) { - blocks.add(HolderSet.direct(blockB.builtInRegistryHolder())); + this.resolvedBlocks.add(HolderSet.direct(blockB.builtInRegistryHolder())); } - setBlocks(blocks); + // init the block supplier list, just to be safe + getBlockSuppliers(); + } + return this.resolvedBlocks; + } + + private @NotNull List>> getBlockSuppliers() { + if (!this.blocks.isEmpty() || this.resolvedBlocks.isEmpty()) { + return this.blocks; + } + + for (var holderSet : this.resolvedBlocks) { + this.blocks.add(() -> holderSet); } - return getBlocks(); + return this.blocks; } @Override - public RecipeCondition createTemplate() { + public AdjacentBlockCondition createTemplate() { return new AdjacentBlockCondition(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentFluidCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentFluidCondition.java index 447481e1be2..01bd029cca2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentFluidCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentFluidCondition.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.common.recipe.condition; +import com.gregtechceu.gtceu.api.codec.GTCodecUtils; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; @@ -9,6 +10,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.HolderSet; +import net.minecraft.core.RegistryCodecs; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; @@ -20,55 +22,46 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import lombok.Getter; import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; - -import static com.gregtechceu.gtceu.api.recipe.condition.ConditionSerializeUtils.decodeHolderSets; -import static com.gregtechceu.gtceu.api.recipe.condition.ConditionSerializeUtils.encodeHolderSets; +import java.util.function.Supplier; @NoArgsConstructor -public class AdjacentFluidCondition extends RecipeCondition { +public class AdjacentFluidCondition extends RecipeCondition { // spotless:off - public static final Codec CODEC = - RecordCodecBuilder.create(instance -> RecipeCondition.isReverse(instance).and( - Codec.STRING.fieldOf("fluidString").forGetter(AdjacentFluidCondition::getFluidString) - ).apply(instance, AdjacentFluidCondition::new)); + public static final Codec CODEC = RecordCodecBuilder.create(instance -> RecipeCondition.isReverse(instance).and( + GTCodecUtils.lazyParsingCodec(RegistryCodecs.homogeneousList(Registries.FLUID)).listOf() + .fieldOf("fluids").forGetter(AdjacentFluidCondition::getFluidSuppliers) + ).apply(instance, AdjacentFluidCondition::new)); // spotless:on - @Getter - private @NotNull String fluidString = ""; - - private @Nullable List> fluids = null; + private final List>> fluids = new ArrayList<>(); - public void setFluids(@NotNull List> fluids) { - this.fluids = fluids; - this.fluidString = encodeHolderSets(fluids); - } + private final List> resolvedFluids = new ArrayList<>(); - public List> getFluids() { - if (fluids == null) { - fluids = decodeHolderSets(getFluidString(), Registries.FLUID); - } - return fluids; + private AdjacentFluidCondition(@NotNull List>> fluids) { + this(false, fluids); } - public AdjacentFluidCondition(@NotNull List> fluids) { - this.setFluids(fluids); + private AdjacentFluidCondition(boolean isReverse, @NotNull List>> fluids) { + super(isReverse); + this.fluids.addAll(fluids); } - public AdjacentFluidCondition(boolean isReverse, String fluidString) { - super(isReverse); - this.fluidString = fluidString; + public AdjacentFluidCondition(@NotNull Collection> fluids) { + this(false, fluids); } - public AdjacentFluidCondition(boolean isReverse, @NotNull List> fluids) { + public AdjacentFluidCondition(boolean isReverse, @NotNull Collection> fluids) { super(isReverse); - this.setFluids(fluids); + this.resolvedFluids.addAll(fluids); + fluids.stream() + .>>map(holderSet -> () -> holderSet) + .forEachOrdered(this.fluids::add); } public static AdjacentFluidCondition fromFluids(Collection fluids) { @@ -94,7 +87,7 @@ public static AdjacentFluidCondition fromTags(TagKey... tags) { } @Override - public RecipeConditionType getType() { + public RecipeConditionType getType() { return GTRecipeConditions.ADJACENT_FLUID; } @@ -129,26 +122,46 @@ public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic reci return false; } - public @NotNull List> getOrInitFluids(@NotNull GTRecipe recipe) { - if (this.getFluids().isEmpty() || (recipe.data.contains("fluidA") && recipe.data.contains("fluidB"))) { - List> fluids = new ArrayList<>(); + public @NotNull List> getOrInitFluids(@Nullable GTRecipe recipe) { + if (resolvedFluids.isEmpty() && !fluids.isEmpty()) { + for (var holderSetSupplier : this.fluids) { + this.resolvedFluids.add(holderSetSupplier.get()); + } + } + if (!resolvedFluids.isEmpty()) { + return resolvedFluids; + } + + if (recipe != null && recipe.data.contains("fluidA") && recipe.data.contains("fluidB")) { + this.resolvedFluids.clear(); Fluid fluidA = BuiltInRegistries.FLUID.get(new ResourceLocation(recipe.data.getString("fluidA"))); if (!fluidA.defaultFluidState().isEmpty()) { - fluids.add(HolderSet.direct(fluidA.builtInRegistryHolder())); + this.resolvedFluids.add(HolderSet.direct(fluidA.builtInRegistryHolder())); } Fluid fluidB = BuiltInRegistries.FLUID.get(new ResourceLocation(recipe.data.getString("fluidB"))); if (!fluidB.defaultFluidState().isEmpty()) { - fluids.add(HolderSet.direct(fluidB.builtInRegistryHolder())); + this.resolvedFluids.add(HolderSet.direct(fluidB.builtInRegistryHolder())); } + // init the fluid supplier list, just to be safe + getFluidSuppliers(); + } + return this.resolvedFluids; + } + + private @NotNull List>> getFluidSuppliers() { + if (!this.fluids.isEmpty() || this.resolvedFluids.isEmpty()) { + return this.fluids; + } - this.setFluids(fluids); + for (var holderSet : this.resolvedFluids) { + this.fluids.add(() -> holderSet); } - return this.getFluids(); + return this.fluids; } @Override - public RecipeCondition createTemplate() { + public AdjacentFluidCondition createTemplate() { return new AdjacentFluidCondition(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/BiomeCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/BiomeCondition.java index 829421c9286..6190795b47b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/BiomeCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/BiomeCondition.java @@ -21,14 +21,14 @@ import org.jetbrains.annotations.NotNull; @NoArgsConstructor -public class BiomeCondition extends RecipeCondition { +public class BiomeCondition extends RecipeCondition { - public static final Codec CODEC = RecordCodecBuilder - .create(instance -> RecipeCondition.isReverse(instance) - .and(ResourceKey.codec(Registries.BIOME).fieldOf("biome").forGetter(val -> val.biome)) - .apply(instance, BiomeCondition::new)); + // spotless:off + public static final Codec CODEC = RecordCodecBuilder.create(instance -> RecipeCondition.isReverse(instance).and( + ResourceKey.codec(Registries.BIOME).fieldOf("biome").forGetter(val -> val.biome) + ).apply(instance, BiomeCondition::new)); + // spotless:on - public final static BiomeCondition INSTANCE = new BiomeCondition(); @Getter private ResourceKey biome = ResourceKey.create(Registries.BIOME, new ResourceLocation("dummy")); @@ -42,7 +42,7 @@ public BiomeCondition(ResourceKey biome) { } @Override - public RecipeConditionType getType() { + public RecipeConditionType getType() { return GTRecipeConditions.BIOME; } @@ -67,7 +67,7 @@ public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic reci } @Override - public RecipeCondition createTemplate() { + public BiomeCondition createTemplate() { return new BiomeCondition(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/CleanroomCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/CleanroomCondition.java index c27fc494ded..f38b713d5b3 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/CleanroomCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/CleanroomCondition.java @@ -23,13 +23,13 @@ @AllArgsConstructor @NoArgsConstructor -public class CleanroomCondition extends RecipeCondition { +public class CleanroomCondition extends RecipeCondition { - public static final Codec CODEC = RecordCodecBuilder - .create(instance -> RecipeCondition.isReverse(instance) - .and(CleanroomType.CODEC.fieldOf("cleanroom").forGetter(val -> val.cleanroom)) - .apply(instance, CleanroomCondition::new)); - public final static CleanroomCondition INSTANCE = new CleanroomCondition(); + // spotless:off + public static final Codec CODEC = RecordCodecBuilder.create(instance -> RecipeCondition.isReverse(instance).and( + CleanroomType.CODEC.fieldOf("cleanroom").forGetter(val -> val.cleanroom) + ).apply(instance, CleanroomCondition::new)); + // spotless:on @Getter private CleanroomType cleanroom = CleanroomType.CLEANROOM; @@ -40,7 +40,7 @@ public CleanroomCondition(boolean isReverse, CleanroomType cleanroom) { } @Override - public RecipeConditionType getType() { + public RecipeConditionType getType() { return GTRecipeConditions.CLEANROOM; } @@ -66,7 +66,7 @@ public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic reci } @Override - public RecipeCondition createTemplate() { + public CleanroomCondition createTemplate() { return new CleanroomCondition(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DaytimeCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DaytimeCondition.java index c6c1a0457d4..662d1f2607a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DaytimeCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DaytimeCondition.java @@ -10,25 +10,24 @@ import net.minecraft.world.level.Level; import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.Getter; import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; @Getter @NoArgsConstructor -public class DaytimeCondition extends RecipeCondition { +public class DaytimeCondition extends RecipeCondition { - public static final Codec CODEC = RecordCodecBuilder - .create(instance -> RecipeCondition.isReverse(instance) - .apply(instance, DaytimeCondition::new)); + // spotless:off + public static final Codec CODEC = RecipeCondition.simpleCodec(DaytimeCondition::new); + // spotless:off public DaytimeCondition(boolean isReverse) { super(isReverse); } @Override - public RecipeConditionType getType() { + public RecipeConditionType getType() { return GTRecipeConditions.DAYTIME; } @@ -48,7 +47,7 @@ public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic reci } @Override - public RecipeCondition createTemplate() { + public DaytimeCondition createTemplate() { return new DaytimeCondition(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DimensionCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DimensionCondition.java index f9b1fa91692..84b2f9d86c8 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DimensionCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DimensionCondition.java @@ -14,39 +14,42 @@ import com.lowdragmc.lowdraglib.gui.texture.TextTexture; import com.lowdragmc.lowdraglib.jei.IngredientIO; +import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.ResourceKey; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import lombok.Getter; import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; @NoArgsConstructor -public class DimensionCondition extends RecipeCondition { +public class DimensionCondition extends RecipeCondition { - public static final Codec CODEC = RecordCodecBuilder - .create(instance -> RecipeCondition.isReverse(instance) - .and(ResourceLocation.CODEC.fieldOf("dimension").forGetter(val -> val.dimension)) - .apply(instance, DimensionCondition::new)); + // spotless:off + public static final Codec CODEC = RecordCodecBuilder.create(instance -> RecipeCondition.isReverse(instance).and( + ResourceKey.codec(Registries.DIMENSION).fieldOf("dimension").forGetter(DimensionCondition::getDimension) + ).apply(instance, DimensionCondition::new)); + // spotless:on - public final static DimensionCondition INSTANCE = new DimensionCondition(); - private ResourceLocation dimension = new ResourceLocation("dummy"); + @Getter + private ResourceKey dimension; - public DimensionCondition(ResourceLocation dimension) { + public DimensionCondition(ResourceKey dimension) { this.dimension = dimension; } - public DimensionCondition(boolean isReverse, ResourceLocation dimension) { + public DimensionCondition(boolean isReverse, ResourceKey dimension) { super(isReverse); this.dimension = dimension; } @Override - public RecipeConditionType getType() { + public RecipeConditionType getType() { return GTRecipeConditions.DIMENSION; } @@ -61,7 +64,7 @@ public Component getTooltips() { } public SlotWidget setupDimensionMarkers(int xOffset, int yOffset) { - DimensionMarker dimMarker = GTRegistries.DIMENSION_MARKERS.getOrDefault(this.dimension, + DimensionMarker dimMarker = GTRegistries.DIMENSION_MARKERS.getOrDefault(this.dimension.location(), new DimensionMarker(DimensionMarker.MAX_TIER, () -> Blocks.BARRIER, this.dimension.toString())); ItemStack icon = dimMarker.getIcon(); CustomItemStackHandler handler = new CustomItemStackHandler(1); @@ -76,10 +79,6 @@ public SlotWidget setupDimensionMarkers(int xOffset, int yOffset) { return dimSlot; } - public ResourceLocation getDimension() { - return dimension; - } - @Override public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic recipeLogic) { Level level = recipeLogic.machine.self().getLevel(); @@ -87,7 +86,7 @@ public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic reci } @Override - public RecipeCondition createTemplate() { + public DimensionCondition createTemplate() { return new DimensionCondition(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EUToStartCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EUToStartCondition.java index 27d05a53645..354bc16eade 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EUToStartCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EUToStartCondition.java @@ -15,13 +15,13 @@ import org.jetbrains.annotations.NotNull; @NoArgsConstructor -public class EUToStartCondition extends RecipeCondition { +public class EUToStartCondition extends RecipeCondition { - public static final Codec CODEC = RecordCodecBuilder - .create(instance -> RecipeCondition.isReverse(instance) - .and(Codec.LONG.fieldOf("eu_to_start").forGetter(val -> val.euToStart)) - .apply(instance, EUToStartCondition::new)); - public static final EUToStartCondition INSTANCE = new EUToStartCondition(); + // spotless:off + public static final Codec CODEC = RecordCodecBuilder.create(instance -> RecipeCondition.isReverse(instance).and( + Codec.LONG.fieldOf("eu_to_start").forGetter(val -> val.euToStart) + ).apply(instance, EUToStartCondition::new)); + // spotless:on private long euToStart; @@ -35,7 +35,7 @@ public EUToStartCondition(boolean isReverse, long euToStart) { } @Override - public RecipeConditionType getType() { + public RecipeConditionType getType() { return GTRecipeConditions.EU_TO_START; } @@ -51,7 +51,7 @@ public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic reci } @Override - public RecipeCondition createTemplate() { + public EUToStartCondition createTemplate() { return new EUToStartCondition(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EnvironmentalHazardCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EnvironmentalHazardCondition.java index 3692627d98a..23b07775fc9 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EnvironmentalHazardCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EnvironmentalHazardCondition.java @@ -22,13 +22,13 @@ @NoArgsConstructor @AllArgsConstructor -public class EnvironmentalHazardCondition extends RecipeCondition { +public class EnvironmentalHazardCondition extends RecipeCondition { - public static final Codec CODEC = RecordCodecBuilder - .create(instance -> RecipeCondition.isReverse(instance) - .and( - MedicalCondition.CODEC.fieldOf("condition").forGetter(val -> val.condition)) - .apply(instance, EnvironmentalHazardCondition::new)); + // spotless:off + public static final Codec CODEC = RecordCodecBuilder.create(instance -> RecipeCondition.isReverse(instance).and( + MedicalCondition.CODEC.fieldOf("condition").forGetter(EnvironmentalHazardCondition::getCondition) + ).apply(instance, EnvironmentalHazardCondition::new)); + // spotless:on @Getter private MedicalCondition condition = GTMedicalConditions.CARBON_MONOXIDE_POISONING; @@ -39,7 +39,7 @@ public EnvironmentalHazardCondition(boolean isReverse, MedicalCondition conditio } @Override - public RecipeConditionType getType() { + public RecipeConditionType getType() { return GTRecipeConditions.ENVIRONMENTAL_HAZARD; } @@ -64,7 +64,7 @@ public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic reci } @Override - public RecipeCondition createTemplate() { + public EnvironmentalHazardCondition createTemplate() { return new EnvironmentalHazardCondition(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/FTBQuestCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/FTBQuestCondition.java index b49b13d583e..8629138a842 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/FTBQuestCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/FTBQuestCondition.java @@ -21,15 +21,14 @@ import org.jetbrains.annotations.NotNull; @NoArgsConstructor -public class FTBQuestCondition extends RecipeCondition { +public class FTBQuestCondition extends RecipeCondition { private static final Long2ObjectMap QUEST_CACHE = new Long2ObjectOpenHashMap<>(); - public static final Codec CODEC = RecordCodecBuilder - .create(instance -> RecipeCondition.isReverse(instance) - .and(Codec.LONG.fieldOf("questId").forGetter(val -> val.parsedQuestId)) - .apply(instance, FTBQuestCondition::new)); - - public final static FTBQuestCondition INSTANCE = new FTBQuestCondition(); + // spotless:off + public static final Codec CODEC = RecordCodecBuilder.create(instance -> RecipeCondition.isReverse(instance).and( + Codec.LONG.fieldOf("questId").forGetter(val -> val.parsedQuestId) + ).apply(instance, FTBQuestCondition::new)); + // spotless:on private long parsedQuestId; @@ -47,7 +46,7 @@ private QuestObject getQuest() { } @Override - public RecipeConditionType getType() { + public RecipeConditionType getType() { return GTRecipeConditions.FTB_QUEST; } @@ -73,7 +72,7 @@ public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic reci } @Override - public RecipeCondition createTemplate() { + public FTBQuestCondition createTemplate() { return new FTBQuestCondition(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/GameStageCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/GameStageCondition.java index 19c5c5944c5..b99f6490b59 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/GameStageCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/GameStageCondition.java @@ -12,21 +12,23 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import lombok.AccessLevel; +import lombok.Getter; import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; @NoArgsConstructor -public class GameStageCondition extends RecipeCondition { +public class GameStageCondition extends RecipeCondition { - public static final Codec CODEC = RecordCodecBuilder - .create(instance -> RecipeCondition.isReverse(instance) - .and(Codec.STRING.fieldOf("stageName").forGetter(val -> val.stageName)) - .apply(instance, GameStageCondition::new)); + // spotless:off + public static final Codec CODEC = RecordCodecBuilder.create(instance -> RecipeCondition.isReverse(instance).and( + Codec.STRING.fieldOf("stageName").forGetter(GameStageCondition::getStageName) + ).apply(instance, GameStageCondition::new)); + // spotless:on + @Getter(AccessLevel.PRIVATE) private String stageName; - public final static GameStageCondition INSTANCE = new GameStageCondition(); - public GameStageCondition(String stageName) { this(false, stageName); } @@ -37,7 +39,7 @@ public GameStageCondition(boolean isReverse, String stageName) { } @Override - public RecipeConditionType getType() { + public RecipeConditionType getType() { return GTRecipeConditions.GAMESTAGE; } @@ -61,7 +63,7 @@ public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic reci } @Override - public RecipeCondition createTemplate() { + public GameStageCondition createTemplate() { return new GameStageCondition(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/HeraclesQuestCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/HeraclesQuestCondition.java index 0ed55d300a4..7e105c7bebe 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/HeraclesQuestCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/HeraclesQuestCondition.java @@ -19,14 +19,13 @@ import org.jetbrains.annotations.NotNull; @NoArgsConstructor -public class HeraclesQuestCondition extends RecipeCondition { +public class HeraclesQuestCondition extends RecipeCondition { - public static final Codec CODEC = RecordCodecBuilder - .create(instance -> RecipeCondition.isReverse(instance) - .and(Codec.STRING.fieldOf("questId").forGetter(val -> val.questId)) - .apply(instance, HeraclesQuestCondition::new)); - - public final static HeraclesQuestCondition INSTANCE = new HeraclesQuestCondition(); + // spotless:off + public static final Codec CODEC = RecordCodecBuilder.create(instance -> RecipeCondition.isReverse(instance).and( + Codec.STRING.fieldOf("questId").forGetter(val -> val.questId) + ).apply(instance, HeraclesQuestCondition::new)); + // spotless:on private String questId; @@ -40,7 +39,7 @@ public HeraclesQuestCondition(boolean isReverse, String questId) { } @Override - public RecipeConditionType getType() { + public RecipeConditionType getType() { return GTRecipeConditions.HERACLES_QUEST; } @@ -71,7 +70,7 @@ public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic reci } @Override - public RecipeCondition createTemplate() { + public HeraclesQuestCondition createTemplate() { return new HeraclesQuestCondition(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/PositionYCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/PositionYCondition.java index 0f9cd15fcb9..0290b1c7583 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/PositionYCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/PositionYCondition.java @@ -14,16 +14,15 @@ import org.jetbrains.annotations.NotNull; @NoArgsConstructor -public class PositionYCondition extends RecipeCondition { +public class PositionYCondition extends RecipeCondition { - public static final Codec CODEC = RecordCodecBuilder.create(instance -> RecipeCondition - .isReverse(instance) - .and(instance.group( - Codec.INT.fieldOf("min").forGetter(val -> val.min), - Codec.INT.fieldOf("max").forGetter(val -> val.max))) - .apply(instance, PositionYCondition::new)); + // spotless:off + public static final Codec CODEC = RecordCodecBuilder.create(instance -> RecipeCondition.isReverse(instance).and(instance.group( + Codec.INT.fieldOf("min").forGetter(val -> val.min), + Codec.INT.fieldOf("max").forGetter(val -> val.max) + )).apply(instance, PositionYCondition::new)); + // spotless:on - public final static PositionYCondition INSTANCE = new PositionYCondition(); private int min; private int max; @@ -39,7 +38,7 @@ public PositionYCondition(boolean isReverse, int min, int max) { } @Override - public RecipeConditionType getType() { + public RecipeConditionType getType() { return GTRecipeConditions.POSITION_Y; } @@ -63,7 +62,7 @@ public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic reci } @Override - public RecipeCondition createTemplate() { + public PositionYCondition createTemplate() { return new PositionYCondition(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/RainingCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/RainingCondition.java index e2847944bfe..06eb404a6ac 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/RainingCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/RainingCondition.java @@ -15,14 +15,14 @@ import org.jetbrains.annotations.NotNull; @NoArgsConstructor -public class RainingCondition extends RecipeCondition { +public class RainingCondition extends RecipeCondition { - public static final Codec CODEC = RecordCodecBuilder - .create(instance -> RecipeCondition.isReverse(instance) - .and(Codec.FLOAT.fieldOf("level").forGetter(val -> val.level)) - .apply(instance, RainingCondition::new)); + // spotless:off + public static final Codec CODEC = RecordCodecBuilder.create(instance -> RecipeCondition.isReverse(instance).and( + Codec.FLOAT.fieldOf("level").forGetter(val -> val.level) + ).apply(instance, RainingCondition::new)); + // spotless:on - public final static RainingCondition INSTANCE = new RainingCondition(); private float level; public RainingCondition(boolean isReverse, float level) { @@ -35,7 +35,7 @@ public RainingCondition(float level) { } @Override - public RecipeConditionType getType() { + public RecipeConditionType getType() { return GTRecipeConditions.RAINING; } @@ -55,7 +55,7 @@ public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic reci } @Override - public RecipeCondition createTemplate() { + public RainingCondition createTemplate() { return new RainingCondition(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/ResearchCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/ResearchCondition.java index 5c330c2676c..74749fd8f21 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/ResearchCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/ResearchCondition.java @@ -12,16 +12,19 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.AllArgsConstructor; +import lombok.Getter; import org.jetbrains.annotations.NotNull; @AllArgsConstructor -public class ResearchCondition extends RecipeCondition { +public class ResearchCondition extends RecipeCondition { - public static final Codec CODEC = RecordCodecBuilder - .create(instance -> RecipeCondition.isReverse(instance) - .and(ResearchData.CODEC.fieldOf("research").forGetter(val -> val.data)) - .apply(instance, ResearchCondition::new)); - public static final ResearchCondition INSTANCE = new ResearchCondition(); + // spotless:off + public static final Codec CODEC = RecordCodecBuilder.create(instance -> RecipeCondition.isReverse(instance).and( + ResearchData.CODEC.fieldOf("research").forGetter(ResearchCondition::getData) + ).apply(instance, ResearchCondition::new)); + // spotless:on + + @Getter public ResearchData data; public ResearchCondition() { @@ -49,7 +52,7 @@ public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic reci } @Override - public RecipeCondition createTemplate() { + public ResearchCondition createTemplate() { return new ResearchCondition(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/ThunderCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/ThunderCondition.java index d59c2d01dfc..2ff91e4fca8 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/ThunderCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/ThunderCondition.java @@ -11,18 +11,20 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import lombok.Getter; import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; @NoArgsConstructor -public class ThunderCondition extends RecipeCondition { +public class ThunderCondition extends RecipeCondition { - public static final Codec CODEC = RecordCodecBuilder - .create(instance -> RecipeCondition.isReverse(instance) - .and(Codec.FLOAT.fieldOf("level").forGetter(val -> val.level)) - .apply(instance, ThunderCondition::new)); + // spotless:off + public static final Codec CODEC = RecordCodecBuilder.create(instance -> RecipeCondition.isReverse(instance).and( + Codec.FLOAT.fieldOf("level").forGetter(ThunderCondition::getLevel) + ).apply(instance, ThunderCondition::new)); + // spotless:on - public final static ThunderCondition INSTANCE = new ThunderCondition(); + @Getter private float level; public ThunderCondition(boolean isReverse, float level) { @@ -35,7 +37,7 @@ public ThunderCondition(float level) { } @Override - public RecipeConditionType getType() { + public RecipeConditionType getType() { return GTRecipeConditions.THUNDER; } @@ -44,10 +46,6 @@ public Component getTooltips() { return Component.translatable("recipe.condition.thunder.tooltip", level); } - public float getLevel() { - return level; - } - @Override public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic recipeLogic) { Level level = recipeLogic.machine.self().getLevel(); @@ -55,7 +53,7 @@ public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic reci } @Override - public RecipeCondition createTemplate() { + public ThunderCondition createTemplate() { return new ThunderCondition(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/VentCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/VentCondition.java index 4b65c364ca0..b0b1aed1b27 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/VentCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/VentCondition.java @@ -10,16 +10,13 @@ import net.minecraft.network.chat.Component; import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; @NoArgsConstructor -public class VentCondition extends RecipeCondition { +public class VentCondition extends RecipeCondition { - public static final Codec CODEC = RecordCodecBuilder - .create(instance -> RecipeCondition.isReverse(instance) - .apply(instance, VentCondition::new)); + public static final Codec CODEC = RecipeCondition.simpleCodec(VentCondition::new); public final static VentCondition INSTANCE = new VentCondition(); public VentCondition(boolean isReverse) { @@ -27,7 +24,7 @@ public VentCondition(boolean isReverse) { } @Override - public RecipeConditionType getType() { + public RecipeConditionType getType() { return GTRecipeConditions.VENT; } @@ -45,7 +42,7 @@ public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic reci } @Override - public RecipeCondition createTemplate() { + public VentCondition createTemplate() { return new VentCondition(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/GTRecipeBuilder.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/GTRecipeBuilder.java index 08a634c4ecc..e5f5368ba2d 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/GTRecipeBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/GTRecipeBuilder.java @@ -47,6 +47,7 @@ import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.Level; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; @@ -85,7 +86,7 @@ public class GTRecipeBuilder { public final Map, ChanceLogic> tickInputChanceLogic = new IdentityHashMap<>(); public final Map, ChanceLogic> tickOutputChanceLogic = new IdentityHashMap<>(); - public final List conditions = new ArrayList<>(); + public final List> conditions = new ArrayList<>(); @NotNull public CompoundTag data = new CompoundTag(); @@ -1117,13 +1118,21 @@ public GTRecipeBuilder cleanroom(CleanroomType cleanroomType) { } public GTRecipeBuilder dimension(ResourceLocation dimension, boolean reverse) { - return addCondition(new DimensionCondition(dimension).setReverse(reverse)); + return dimension(ResourceKey.create(Registries.DIMENSION, dimension), reverse); } public GTRecipeBuilder dimension(ResourceLocation dimension) { return dimension(dimension, false); } + public GTRecipeBuilder dimension(ResourceKey dimension, boolean reverse) { + return addCondition(new DimensionCondition(dimension).setReverse(reverse)); + } + + public GTRecipeBuilder dimension(ResourceKey dimension) { + return dimension(dimension, false); + } + public GTRecipeBuilder biome(ResourceLocation biome, boolean reverse) { return biome(ResourceKey.create(Registries.BIOME, biome), reverse); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/GTRecipeSchema.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/GTRecipeSchema.java index a2b2b61d415..61ab2a31211 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/GTRecipeSchema.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/GTRecipeSchema.java @@ -950,7 +950,8 @@ public GTRecipeJS cleanroom(CleanroomType cleanroomType) { } public GTRecipeJS dimension(ResourceLocation dimension, boolean reverse) { - return addCondition(new DimensionCondition(dimension).setReverse(reverse)); + return addCondition( + new DimensionCondition(ResourceKey.create(Registries.DIMENSION, dimension)).setReverse(reverse)); } public GTRecipeJS dimension(ResourceLocation dimension) { @@ -1363,7 +1364,7 @@ public JsonElement writeOutputFluid(OutputFluid value) { RecipeKey ID = GTRecipeComponents.RESOURCE_LOCATION.key("id"); RecipeKey DURATION = TimeComponent.TICKS.key("duration").optional(100L); RecipeKey DATA = GTRecipeComponents.TAG.key("data").optional((CompoundTag) null); - RecipeKey CONDITIONS = GTRecipeComponents.RECIPE_CONDITION.asArray().key("recipeConditions") + RecipeKey[]> CONDITIONS = GTRecipeComponents.RECIPE_CONDITION.asArray().key("recipeConditions") .optional(new RecipeCondition[0]); RecipeKey CATEGORY = GTRecipeComponents.RESOURCE_LOCATION.key("category").defaultOptional(); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/components/GTRecipeComponents.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/components/GTRecipeComponents.java index c4a9237d867..d801e3ceaf5 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/components/GTRecipeComponents.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/components/GTRecipeComponents.java @@ -175,7 +175,7 @@ public String toString() { } }; - public static final RecipeComponent RECIPE_CONDITION = new RecipeComponent<>() { + public static final RecipeComponent> RECIPE_CONDITION = new RecipeComponent<>() { @Override public String componentType() { @@ -188,15 +188,15 @@ public Class componentClass() { } @Override - public JsonElement write(RecipeJS recipe, RecipeCondition value) { - JsonObject object = new JsonObject(); - object.addProperty("type", GTRegistries.RECIPE_CONDITIONS.getKey(value.getType())); - object.add("data", value.serialize()); - return object; + public JsonElement write(RecipeJS recipe, RecipeCondition condition) { + var ops = RegistryOps.create(JsonOps.INSTANCE, GTRegistries.builtinRegistry()); + return RecipeCondition.CODEC.encodeStart(ops, condition).getOrThrow(false, error -> { + throw new RecipeExceptionJS("Failed to encode: " + error + " " + condition); + }); } @Override - public RecipeCondition read(RecipeJS recipe, Object from) { + public RecipeCondition read(RecipeJS recipe, Object from) { if (from instanceof CharSequence) { var conditionKey = from.toString(); var type = GTRegistries.RECIPE_CONDITIONS.get(conditionKey); diff --git a/src/test/java/com/gregtechceu/gtceu/api/recipe/GTRecipeSerializerTest.java b/src/test/java/com/gregtechceu/gtceu/api/recipe/GTRecipeSerializerTest.java index 1808f23ae40..2d883d09513 100644 --- a/src/test/java/com/gregtechceu/gtceu/api/recipe/GTRecipeSerializerTest.java +++ b/src/test/java/com/gregtechceu/gtceu/api/recipe/GTRecipeSerializerTest.java @@ -11,12 +11,13 @@ import net.minecraft.core.registries.Registries; import net.minecraft.gametest.framework.GameTest; import net.minecraft.gametest.framework.GameTestHelper; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.FluidTags; import net.minecraft.tags.TagKey; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.Fluid; import net.minecraft.world.level.material.Fluids; +import net.minecraftforge.common.Tags; import net.minecraftforge.gametest.GameTestHolder; import net.minecraftforge.gametest.PrefixGameTestTemplate; @@ -24,54 +25,71 @@ import java.util.HashSet; import java.util.List; -import java.util.Objects; import java.util.Set; +import java.util.stream.Collectors; @PrefixGameTestTemplate(false) @GameTestHolder(GTCEu.MOD_ID) public class GTRecipeSerializerTest { - @GameTest(template = "empty_5x5") - public static void serializeTest(GameTestHelper helper) { + @GameTest(template = "empty") + public static void testSerializeAdjacentFluid(GameTestHelper helper) { // Create Fluid Condition based on fluidSetIn - TagKey lavaTag = TagKey.create(Registries.FLUID, new ResourceLocation("forge", "lava")); + @SuppressWarnings("deprecation") HolderSet waterSet = HolderSet.direct(Fluids.WATER.builtInRegistryHolder(), Fluids.FLOWING_WATER.builtInRegistryHolder()); HolderSet lavaSet = GTRegistries.builtinRegistry() .registryOrThrow(Registries.FLUID) - .getOrCreateTag(lavaTag); + .getOrCreateTag(FluidTags.LAVA); List> fluidSetIn = List.of(waterSet, lavaSet); AdjacentFluidCondition fluidCondition = new AdjacentFluidCondition(fluidSetIn); + // Serialize and immediately deserialize + JsonObject json = new JsonObject(); + GTRecipeBuilder.ofRaw().addCondition(fluidCondition).toJson(json); + GTRecipe recipe = GTRecipeSerializer.SERIALIZER.fromJson(GTCEu.id("test"), json); + + // Validate + boolean foundFluid = false; + for (var condition : recipe.conditions) { + if (condition instanceof AdjacentFluidCondition recipeFluidCondition) { + foundFluid = true; + helper.assertTrue(equalHolderSetLists(recipeFluidCondition.getOrInitFluids(null), fluidSetIn), + "AdjacentFluidCondition did not deserialize properly"); + } else { + helper.fail("Found condition that should not be present: " + condition); + } + } + if (!foundFluid) { + helper.fail("AdjacentFluidCondition did not deserialize properly"); + } + helper.succeed(); + } + + @GameTest(template = "empty") + public static void testSerializeAdjacentBlock(GameTestHelper helper) { // Create Block Condition based on blockSetIn - TagKey oreTag = TagKey.create(Registries.BLOCK, new ResourceLocation("forge", "ores")); + @SuppressWarnings("deprecation") HolderSet blockSet = HolderSet.direct(Blocks.DIAMOND_BLOCK.builtInRegistryHolder(), Blocks.GOLD_BLOCK.builtInRegistryHolder()); HolderSet oreSet = GTRegistries.builtinRegistry() .registryOrThrow(Registries.BLOCK) - .getOrCreateTag(oreTag); + .getOrCreateTag(Tags.Blocks.ORES); List> blockSetIn = List.of(blockSet, oreSet); AdjacentBlockCondition blockCondition = new AdjacentBlockCondition(blockSetIn); // Serialize and back - JsonObject AFConditionJSON = new JsonObject(); - - GTRecipeBuilder.ofRaw().addCondition(fluidCondition).addCondition(blockCondition).toJson(AFConditionJSON); - - GTRecipe recipe = GTRecipeSerializer.SERIALIZER.fromJson(GTCEu.id("test"), AFConditionJSON); + JsonObject json = new JsonObject(); + GTRecipeBuilder.ofRaw().addCondition(blockCondition).toJson(json); + GTRecipe recipe = GTRecipeSerializer.SERIALIZER.fromJson(GTCEu.id("test"), json); // Validate - boolean foundFluid = false, foundBlock = false; + boolean foundBlock = false; for (var condition : recipe.conditions) { if (condition instanceof AdjacentBlockCondition recipeBlockCondition) { foundBlock = true; - helper.assertTrue(equalHolderSetLists(recipeBlockCondition.getBlocks(), blockSetIn), + helper.assertTrue(equalHolderSetLists(recipeBlockCondition.getOrInitBlocks(null), blockSetIn), "AdjacentBlockCondition did not deserialize properly"); - } else if (condition instanceof AdjacentFluidCondition recipeFluidCondition) { - foundFluid = true; - helper.assertTrue(equalHolderSetLists(recipeFluidCondition.getFluids(), fluidSetIn), - "AdjacentFluidCondition did not deserialize properly"); - } else { helper.fail("Found condition that should not be present: " + condition); } @@ -79,53 +97,52 @@ public static void serializeTest(GameTestHelper helper) { if (!foundBlock) { helper.fail("AdjacentBlockCondition did not deserialize properly"); } - if (!foundFluid) { - helper.fail("AdjacentFluidCondition did not deserialize properly"); - } helper.succeed(); } - @GameTest(template = "empty_5x5") + @GameTest(template = "empty") public static void testSerializingFluidCondition(GameTestHelper helper) { - TagKey lavaTag = TagKey.create(Registries.FLUID, new ResourceLocation("forge", "lava")); + @SuppressWarnings("deprecation") HolderSet waterSet = HolderSet.direct(Fluids.WATER.builtInRegistryHolder(), Fluids.FLOWING_WATER.builtInRegistryHolder()); + TagKey lavaTag = FluidTags.LAVA; HolderSet lavaSet = GTRegistries.builtinRegistry() .registryOrThrow(Registries.FLUID) - .getOrCreateTag(lavaTag); + .getOrCreateTag(FluidTags.LAVA); + List> fluidSetIn = List.of(waterSet, lavaSet); AdjacentFluidCondition condition = new AdjacentFluidCondition(fluidSetIn); - helper.assertTrue(equalHolderSetLists(condition.getFluids(), fluidSetIn), - "AdjacentFluidCondition did not deserialize properly"); + helper.assertTrue(equalHolderSetLists(condition.getOrInitFluids(null), fluidSetIn), + "AdjacentFluidCondition did not store its data properly"); JsonObject jsonConfig = condition.serialize(); AdjacentFluidCondition newCondition = (AdjacentFluidCondition) AdjacentFluidCondition.deserialize(jsonConfig); - helper.assertTrue(equalHolderSetLists(newCondition.getFluids(), fluidSetIn), + helper.assertTrue(equalHolderSetLists(newCondition.getOrInitFluids(null), fluidSetIn), "AdjacentFluidCondition did not deserialize properly"); helper.succeed(); } - @GameTest(template = "empty_5x5") + @GameTest(template = "empty") public static void testSerializingBlockCondition(GameTestHelper helper) { - TagKey oreTag = TagKey.create(Registries.BLOCK, new ResourceLocation("forge", "ores")); + @SuppressWarnings("deprecation") HolderSet blockSet = HolderSet.direct(Blocks.DIAMOND_BLOCK.builtInRegistryHolder(), Blocks.GOLD_BLOCK.builtInRegistryHolder()); HolderSet oreSet = GTRegistries.builtinRegistry() .registryOrThrow(Registries.BLOCK) - .getOrCreateTag(oreTag); + .getOrCreateTag(Tags.Blocks.ORES); List> blockSetIn = List.of(blockSet, oreSet); AdjacentBlockCondition condition = new AdjacentBlockCondition(blockSetIn); - helper.assertTrue(equalHolderSetLists(condition.getBlocks(), blockSetIn), - "AdjacentBlockCondition did not deserialize properly"); + helper.assertTrue(equalHolderSetLists(condition.getOrInitBlocks(null), blockSetIn), + "AdjacentBlockCondition did not store its data properly"); JsonObject jsonConfig = condition.serialize(); AdjacentBlockCondition newCondition = (AdjacentBlockCondition) AdjacentBlockCondition.deserialize(jsonConfig); - helper.assertTrue(equalHolderSetLists(newCondition.getBlocks(), blockSetIn), + helper.assertTrue(equalHolderSetLists(newCondition.getOrInitBlocks(null), blockSetIn), "AdjacentBlockCondition did not deserialize properly"); helper.succeed(); @@ -156,19 +173,19 @@ public static boolean equalHolderSetLists(List> a, List boolean holderSetEquals(HolderSet a, HolderSet b) { // Case 1: both are Named (tags) if (a.unwrapKey().isPresent() && b.unwrapKey().isPresent()) { - TagKey tagA = a.unwrapKey().get(); - TagKey tagB = b.unwrapKey().get(); - return Objects.equals(tagA, tagB); + // tag keys are interned so they can be compared by reference + return a.unwrapKey().get() == b.unwrapKey().get(); } // Case 2: both are Direct - if (!a.unwrapKey().isPresent() && !b.unwrapKey().isPresent()) { - Set> setA = new HashSet<>(a.stream().toList()); - Set> setB = new HashSet<>(b.stream().toList()); - return setA.equals(setB); + if (a.unwrapKey().isEmpty() && b.unwrapKey().isEmpty()) { + Set> setA = a.stream().collect(Collectors.toSet()); + Set> setB = b.stream().collect(Collectors.toSet()); + return setA.containsAll(setB) && setB.containsAll(setA); } - // One is Named, the other is Direct → not equal + // One is Named, the other is Direct -> not equal + // (or they don't have the same elements) return false; } } From 195bed9d68077d0ae9cc5b6284027725ff7b4f2e Mon Sep 17 00:00:00 2001 From: Jurre Groenendijk Date: Wed, 21 Jan 2026 10:34:03 +0100 Subject: [PATCH 27/28] Add check to not cache invalid recipes (#4486) --- .../com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java index 2b97ff75302..1483937c722 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java @@ -344,6 +344,10 @@ protected void handleSearchingRecipes(@NotNull Iterator matches) { if (checkMatchedRecipeAvailable(match)) return; + if (!matchRecipe(match).isSuccess()) { + continue; + } + // cache matching recipes. if (lastFailedMatches == null) { lastFailedMatches = new ArrayList<>(); From 02bfeb48bfc73640c274b6582529ca7236402d91 Mon Sep 17 00:00:00 2001 From: lilpaladin1 Date: Sat, 24 Jan 2026 08:23:15 -0600 Subject: [PATCH 28/28] Remove BlockEntity Check in MinerLogic (#4488) --- .../gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java index d9a4e62ea21..688d4a5df17 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java @@ -551,7 +551,6 @@ private LinkedList getBlocksToMine() { BlockPos blockPos = new BlockPos(x, y, z); BlockState state = level.getBlockState(blockPos); if (state.getDestroySpeed(level, blockPos) >= 0 && - level.getBlockEntity(blockPos) == null && state.is(Tags.Blocks.ORES)) { blocks.addLast(blockPos); }