From 526a3548297f94aa85623c8c0b2fddabb93bbdf2 Mon Sep 17 00:00:00 2001 From: Sakura Ryoko Date: Thu, 5 Dec 2024 01:46:36 -0500 Subject: [PATCH] fix: InfoOverlay getting confused with the ClientWorld feat/fix: add switchable AO Processor config,`renderAOModernEnabled` in order to disable / enable the 'new' AO Processor code; or continue using the older code from 2018 without the "Shadows" that it creates in between block layers. --- gradle.properties | 2 +- .../fi/dy/masa/litematica/config/Configs.java | 4 + .../BlockModelRendererSchematic.java | 719 ++-------------- .../schematic/BufferAllocatorCache.java | 30 +- .../render/schematic/BufferBuilderCache.java | 14 +- .../render/schematic/BuiltBufferCache.java | 10 +- .../render/schematic/ChunkRenderLayers.java | 20 + .../schematic/WorldRendererSchematic.java | 13 +- .../render/schematic/ao/AOProcessor.java | 32 + .../schematic/ao/AOProcessorLegacy.java | 212 +++++ .../schematic/ao/AOProcessorModern.java | 408 ++++++++++ .../masa/litematica/util/InventoryUtils.java | 7 +- .../world/FakeLightingProvider.java | 1 + .../masa/litematica/world/WorldSchematic.java | 19 +- .../assets/litematica/lang/en_us.json | 3 + .../assets/litematica/lang/it_it.json | 3 + .../assets/litematica/lang/ja_jp.json | 3 + .../assets/litematica/lang/uk_ua.json | 769 +++++++++--------- .../assets/litematica/lang/zh_cn.json | 3 + .../assets/litematica/lang/zh_tw.json | 3 + 20 files changed, 1232 insertions(+), 1043 deletions(-) create mode 100644 src/main/java/fi/dy/masa/litematica/render/schematic/ao/AOProcessor.java create mode 100644 src/main/java/fi/dy/masa/litematica/render/schematic/ao/AOProcessorLegacy.java create mode 100644 src/main/java/fi/dy/masa/litematica/render/schematic/ao/AOProcessorModern.java diff --git a/gradle.properties b/gradle.properties index 77f5b74434..fd764a607c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,7 @@ author = masa mod_file_name = litematica-fabric # Current mod version -mod_version = 0.21.0-sakura.1 +mod_version = 0.21.0-sakura.2 # Required malilib version malilib_version = 1e13f4c8ce diff --git a/src/main/java/fi/dy/masa/litematica/config/Configs.java b/src/main/java/fi/dy/masa/litematica/config/Configs.java index e5f3aa4e7c..1cbd3ecff9 100644 --- a/src/main/java/fi/dy/masa/litematica/config/Configs.java +++ b/src/main/java/fi/dy/masa/litematica/config/Configs.java @@ -195,11 +195,13 @@ public static class Visuals public static final ConfigBoolean IGNORE_EXISTING_FLUIDS = new ConfigBoolean("ignoreExistingFluids", false).apply(VISUALS_KEY); public static final ConfigBoolean OVERLAY_REDUCED_INNER_SIDES = new ConfigBoolean("overlayReducedInnerSides", false).apply(VISUALS_KEY); public static final ConfigDouble PLACEMENT_BOX_SIDE_ALPHA = new ConfigDouble( "placementBoxSideAlpha", 0.2, 0, 1).apply(VISUALS_KEY); + public static final ConfigBoolean RENDER_AO_MODERN_ENABLE = new ConfigBoolean("renderAOModernEnable", false).apply(VISUALS_KEY); public static final ConfigBoolean RENDER_AREA_SELECTION_BOX_SIDES = new ConfigBoolean("renderAreaSelectionBoxSides", true).apply(VISUALS_KEY); public static final ConfigBoolean RENDER_BLOCKS_AS_TRANSLUCENT = new ConfigBoolean("renderBlocksAsTranslucent", false).apply(VISUALS_KEY); public static final ConfigBoolean RENDER_COLLIDING_SCHEMATIC_BLOCKS = new ConfigBoolean("renderCollidingSchematicBlocks", false).apply(VISUALS_KEY); public static final ConfigBoolean RENDER_ERROR_MARKER_CONNECTIONS = new ConfigBoolean("renderErrorMarkerConnections", false).apply(VISUALS_KEY); public static final ConfigBoolean RENDER_ERROR_MARKER_SIDES = new ConfigBoolean("renderErrorMarkerSides", true).apply(VISUALS_KEY); + //public static final ConfigInteger RENDER_FAKE_LIGHTING_LEVEL = new ConfigInteger("renderFakeLightingLevel", 15, 0, 15).apply(VISUALS_KEY); public static final ConfigBoolean RENDER_PLACEMENT_BOX_SIDES = new ConfigBoolean("renderPlacementBoxSides", false).apply(VISUALS_KEY); public static final ConfigBoolean RENDER_PLACEMENT_ENCLOSING_BOX = new ConfigBoolean("renderPlacementEnclosingBox", true).apply(VISUALS_KEY); public static final ConfigBoolean RENDER_PLACEMENT_ENCLOSING_BOX_SIDES= new ConfigBoolean("renderPlacementEnclosingBoxSides", false).apply(VISUALS_KEY); @@ -230,11 +232,13 @@ public static class Visuals ENABLE_SCHEMATIC_OVERLAY, IGNORE_EXISTING_FLUIDS, OVERLAY_REDUCED_INNER_SIDES, + RENDER_AO_MODERN_ENABLE, RENDER_AREA_SELECTION_BOX_SIDES, RENDER_BLOCKS_AS_TRANSLUCENT, RENDER_COLLIDING_SCHEMATIC_BLOCKS, RENDER_ERROR_MARKER_CONNECTIONS, RENDER_ERROR_MARKER_SIDES, + //RENDER_FAKE_LIGHTING_LEVEL, RENDER_PLACEMENT_BOX_SIDES, RENDER_PLACEMENT_ENCLOSING_BOX, RENDER_PLACEMENT_ENCLOSING_BOX_SIDES, diff --git a/src/main/java/fi/dy/masa/litematica/render/schematic/BlockModelRendererSchematic.java b/src/main/java/fi/dy/masa/litematica/render/schematic/BlockModelRendererSchematic.java index a1ddf49b78..ca918794a4 100644 --- a/src/main/java/fi/dy/masa/litematica/render/schematic/BlockModelRendererSchematic.java +++ b/src/main/java/fi/dy/masa/litematica/render/schematic/BlockModelRendererSchematic.java @@ -3,20 +3,21 @@ import java.util.BitSet; import java.util.List; import javax.annotation.Nullable; -import it.unimi.dsi.fastutil.longs.Long2FloatLinkedOpenHashMap; -import it.unimi.dsi.fastutil.longs.Long2IntLinkedOpenHashMap; +import org.jetbrains.annotations.ApiStatus; import net.minecraft.block.Block; +import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockState; import net.minecraft.client.MinecraftClient; import net.minecraft.client.color.block.BlockColors; -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.WorldRenderer; +import net.minecraft.client.render.*; +import net.minecraft.client.render.block.FluidRenderer; import net.minecraft.client.render.model.BakedModel; +import net.minecraft.client.render.model.BakedModelManager; import net.minecraft.client.render.model.BakedQuad; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.Util; +import net.minecraft.fluid.FluidState; +import net.minecraft.item.ModelTransformationMode; import net.minecraft.util.crash.CrashException; import net.minecraft.util.crash.CrashReport; import net.minecraft.util.crash.CrashReportSection; @@ -32,18 +33,42 @@ import fi.dy.masa.malilib.util.PositionUtils; import fi.dy.masa.litematica.config.Configs; import fi.dy.masa.litematica.data.DataManager; +import fi.dy.masa.litematica.render.schematic.ao.AOProcessor; +import fi.dy.masa.litematica.render.schematic.ao.AOProcessorModern; public class BlockModelRendererSchematic { - private static final Direction[] DIRECTIONS = Direction.values(); private final LocalRandom random = new LocalRandom(0); private final BlockColors colorMap; - static final ThreadLocal CACHE = ThreadLocal.withInitial(BC::new); - + private final FluidRenderer liquidRenderer; + private BakedModelManager bakedManager; + public static final ThreadLocal CACHE = ThreadLocal.withInitial(AOProcessorModern.BC::new); public BlockModelRendererSchematic(BlockColors blockColorsIn) { this.colorMap = blockColorsIn; + this.liquidRenderer = new FluidRenderer(); + } + + public void setBakedManager(BakedModelManager manager) + { + this.bakedManager = manager; + } + + public static void enableCache() + { + if (Configs.Visuals.RENDER_AO_MODERN_ENABLE.getBooleanValue()) + { + CACHE.get().enable(); + } + } + + public static void disableCache() + { + if (Configs.Visuals.RENDER_AO_MODERN_ENABLE.getBooleanValue()) + { + CACHE.get().disable(); + } } public boolean renderModel(BlockRenderView worldIn, BakedModel modelIn, BlockState stateIn, @@ -60,10 +85,12 @@ public boolean renderModel(BlockRenderView worldIn, BakedModel modelIn, BlockSta { if (ao) { + //System.out.printf("renderModelSmooth(): pos [%s] / state [%s]\n", posIn.toShortString(), stateIn); return this.renderModelSmooth(worldIn, modelIn, stateIn, posIn, matrixStack, vertexConsumer, this.random, rand, overlay); } else { + //System.out.printf("renderModelFlat(): pos [%s] / state [%s]\n", posIn.toShortString(), stateIn); return this.renderModelFlat(worldIn, modelIn, stateIn, posIn, matrixStack, vertexConsumer, this.random, rand, overlay); } } @@ -85,7 +112,7 @@ private boolean renderModelSmooth(BlockRenderView worldIn, BakedModel modelIn, B boolean renderedSomething = false; float[] quadBounds = new float[PositionUtils.ALL_DIRECTIONS.length * 2]; BitSet bitset = new BitSet(3); - AmbientOcclusionCalculator aoFace = new AmbientOcclusionCalculator(); + AOProcessor aoFace = AOProcessor.get(); BlockPos.Mutable mutablePos = posIn.mutableCopy(); for (Direction side : PositionUtils.ALL_DIRECTIONS) @@ -98,6 +125,7 @@ private boolean renderModelSmooth(BlockRenderView worldIn, BakedModel modelIn, B mutablePos.set(posIn, side); if (this.shouldRenderModelSide(worldIn, stateIn, posIn, side, mutablePos)) { + //System.out.printf("renderQuadsSmooth():1: pos [%s] / state [%s]\n", posIn.toShortString(), stateIn); this.renderQuadsSmooth(worldIn, stateIn, posIn, matrixStack, vertexConsumer, quads, quadBounds, bitset, aoFace, overlay); renderedSomething = true; } @@ -109,6 +137,7 @@ private boolean renderModelSmooth(BlockRenderView worldIn, BakedModel modelIn, B if (!quads.isEmpty()) { + //System.out.printf("renderQuadsSmooth():2: pos [%s] / state [%s]\n", posIn.toShortString(), stateIn); this.renderQuadsSmooth(worldIn, stateIn, posIn, matrixStack, vertexConsumer, quads, quadBounds, bitset, aoFace, overlay); renderedSomething = true; } @@ -164,24 +193,28 @@ private boolean shouldRenderModelSide(BlockRenderView worldIn, BlockState stateI } private void renderQuadsSmooth(BlockRenderView world, BlockState state, BlockPos pos, MatrixStack matrixStack, - VertexConsumer vertexConsumer, List list, float[] box, BitSet flags, AmbientOcclusionCalculator ambientOcclusionCalculator, int overlay) + VertexConsumer vertexConsumer, List list, float[] box, BitSet flags, AOProcessor ambientOcclusionCalculator, int overlay) { - //final int size = list.size(); + final int size = list.size(); + + //System.out.printf("renderQuad(): pos [%s] / state [%s] / quad size [%d]\n", pos.toShortString(), state, size); for (BakedQuad bakedQuad : list) { this.getQuadDimensions(world, state, pos, bakedQuad.getVertexData(), bakedQuad.getFace(), box, flags); ambientOcclusionCalculator.apply(world, state, pos, bakedQuad.getFace(), box, flags, bakedQuad.hasShade()); + //System.out.printf("renderQuad(): pos [%s] / state [%s] / quad face [%s]\n", pos.toShortString(), state, bakedQuad.getFace().getName()); + this.renderQuad(world, state, pos, vertexConsumer, matrixStack, bakedQuad, - ambientOcclusionCalculator.brightness[0], - ambientOcclusionCalculator.brightness[1], - ambientOcclusionCalculator.brightness[2], - ambientOcclusionCalculator.brightness[3], - ambientOcclusionCalculator.light[0], - ambientOcclusionCalculator.light[1], - ambientOcclusionCalculator.light[2], - ambientOcclusionCalculator.light[3], overlay); + ambientOcclusionCalculator.brightness[0], + ambientOcclusionCalculator.brightness[1], + ambientOcclusionCalculator.brightness[2], + ambientOcclusionCalculator.brightness[3], + ambientOcclusionCalculator.light[0], + ambientOcclusionCalculator.light[1], + ambientOcclusionCalculator.light[2], + ambientOcclusionCalculator.light[3], overlay); } } @@ -224,8 +257,10 @@ private void renderQuad(BlockRenderView world, BlockState state, BlockPos pos, V g = 1.0F; b = 1.0F; } + + //System.out.printf("quad(): pos [%s] / state [%s] --> SPRITE [%s]\n", pos.toShortString(), state, quad.getSprite().toString()); vertexConsumer.quad(matrixStack.peek(), quad, new float[]{brightness0, brightness1, brightness2, brightness3}, - r, g, b, 1.0f, new int[]{light0, light1, light2, light3}, overlay, true); + r, g, b, 1.0f, new int[]{light0, light1, light2, light3}, overlay, true); } private void getQuadDimensions(BlockRenderView world, BlockState state, BlockPos pos, int[] vertexData, Direction face, @Nullable float[] box, BitSet flags) @@ -368,11 +403,13 @@ private void fillQuadBounds(BlockRenderView world, BlockState stateIn, BlockPos } */ + @ApiStatus.Experimental public void renderEntity(VertexConsumer vertexConsumer, MatrixStack matrixStack, @Nullable BlockState stateIn, BakedModel modelIn, float red, float green, float blue, int light, int overlay) { Random rand = Random.create(); long life = 42L; + for (Direction side : PositionUtils.ALL_DIRECTIONS) { rand.setSeed(life); @@ -382,6 +419,7 @@ public void renderEntity(VertexConsumer vertexConsumer, MatrixStack matrixStack, this.renderQuads(vertexConsumer, matrixStack, red, green, blue, modelIn.getQuads(stateIn, null, rand), light, overlay); } + @ApiStatus.Experimental private void renderQuads(VertexConsumer vertexConsumer, MatrixStack matrixStack, float red, float green, float blue, List quads, int light, int overlay) { @@ -407,636 +445,47 @@ private void renderQuads(VertexConsumer vertexConsumer, MatrixStack matrixStack, } } - /* - public boolean renderBlockEntity(VertexConsumerProvider consumer, MatrixStack matrixStack, BlockState stateIn, int light, int overlay) - { - BlockRenderType blockRenderType = stateIn.getRenderType(); - if (blockRenderType == BlockRenderType.INVISIBLE) - { - return false; - } - switch (blockRenderType) - { - case MODEL: - { - BakedModel bakedModel = this.getModel(state); - int i = this.blockColors.getColor(state, null, null, 0); - float f = (float) (i >> 16 & 0xFF) / 255.0f; - float g = (float) (i >> 8 & 0xFF) / 255.0f; - float h = (float) (i & 0xFF) / 255.0f; - } - case ENTITYBLOCK_ANIMATED: { - this.builtinModelItemRenderer.render(new ItemStack(stateIn.getBlock()), ModelTransformationMode.NONE, matrixStack, consumer, light, overlay); - } - } - - return false; - } - */ - - public static void enableCache() - { - CACHE.get().enable(); - } - - public static void disableCache() - { - CACHE.get().disable(); - } - - static class AmbientOcclusionCalculator - { - private final float[] brightness = new float[4]; - private final int[] light = new int[4]; - - public void apply(BlockRenderView world, BlockState state, BlockPos pos, Direction direction, float[] box, BitSet shapeState, boolean hasShade) - { - // 2024 - /* - EnumNeighborInfo neighborInfo = EnumNeighborInfo.getNeighbourInfo(direction); - VertexTranslations vertexTranslations = VertexTranslations.getVertexTranslations(direction); - int i, j, k, l, i1, i3, j1, k1, l1; - i = j = k = l = i1 = i3 = j1 = k1 = l1 = ((15 << 20) | (15 << 4)); - float b1 = 1.0F; - float b2 = 1.0F; - float b3 = 1.0F; - float b4 = 1.0F; - - if (shapeState.get(1) && neighborInfo.doNonCubicWeight) - { - float f13 = box[neighborInfo.vert0Weights[0].shape] * box[neighborInfo.vert0Weights[1].shape]; - float f14 = box[neighborInfo.vert0Weights[2].shape] * box[neighborInfo.vert0Weights[3].shape]; - float f15 = box[neighborInfo.vert0Weights[4].shape] * box[neighborInfo.vert0Weights[5].shape]; - float f16 = box[neighborInfo.vert0Weights[6].shape] * box[neighborInfo.vert0Weights[7].shape]; - float f17 = box[neighborInfo.vert1Weights[0].shape] * box[neighborInfo.vert1Weights[1].shape]; - float f18 = box[neighborInfo.vert1Weights[2].shape] * box[neighborInfo.vert1Weights[3].shape]; - float f19 = box[neighborInfo.vert1Weights[4].shape] * box[neighborInfo.vert1Weights[5].shape]; - float f20 = box[neighborInfo.vert1Weights[6].shape] * box[neighborInfo.vert1Weights[7].shape]; - float f21 = box[neighborInfo.vert2Weights[0].shape] * box[neighborInfo.vert2Weights[1].shape]; - float f22 = box[neighborInfo.vert2Weights[2].shape] * box[neighborInfo.vert2Weights[3].shape]; - float f23 = box[neighborInfo.vert2Weights[4].shape] * box[neighborInfo.vert2Weights[5].shape]; - float f24 = box[neighborInfo.vert2Weights[6].shape] * box[neighborInfo.vert2Weights[7].shape]; - float f25 = box[neighborInfo.vert3Weights[0].shape] * box[neighborInfo.vert3Weights[1].shape]; - float f26 = box[neighborInfo.vert3Weights[2].shape] * box[neighborInfo.vert3Weights[3].shape]; - float f27 = box[neighborInfo.vert3Weights[4].shape] * box[neighborInfo.vert3Weights[5].shape]; - float f28 = box[neighborInfo.vert3Weights[6].shape] * box[neighborInfo.vert3Weights[7].shape]; - this.brightness[vertexTranslations.vert0] = b1 * f13 + b2 * f14 + b3 * f15 + b4 * f16; - this.brightness[vertexTranslations.vert1] = b1 * f17 + b2 * f18 + b3 * f19 + b4 * f20; - this.brightness[vertexTranslations.vert2] = b1 * f21 + b2 * f22 + b3 * f23 + b4 * f24; - this.brightness[vertexTranslations.vert3] = b1 * f25 + b2 * f26 + b3 * f27 + b4 * f28; - int i2 = this.getAoBrightness(l, i, j1, i3); - int j2 = this.getAoBrightness(k, i, i1, i3); - int k2 = this.getAoBrightness(k, j, k1, i3); - int l2 = this.getAoBrightness(l, j, l1, i3); - this.light[vertexTranslations.vert0] = this.getVertexBrightness(i2, j2, k2, l2, f13, f14, f15, f16); - this.light[vertexTranslations.vert1] = this.getVertexBrightness(i2, j2, k2, l2, f17, f18, f19, f20); - this.light[vertexTranslations.vert2] = this.getVertexBrightness(i2, j2, k2, l2, f21, f22, f23, f24); - this.light[vertexTranslations.vert3] = this.getVertexBrightness(i2, j2, k2, l2, f25, f26, f27, f28); - } - else - { - this.light[vertexTranslations.vert0] = this.getAoBrightness(l, i, j1, i3); - this.light[vertexTranslations.vert1] = this.getAoBrightness(k, i, i1, i3); - this.light[vertexTranslations.vert2] = this.getAoBrightness(k, j, k1, i3); - this.light[vertexTranslations.vert3] = this.getAoBrightness(l, j, l1, i3); - this.brightness[vertexTranslations.vert0] = b1; - this.brightness[vertexTranslations.vert1] = b2; - this.brightness[vertexTranslations.vert2] = b3; - this.brightness[vertexTranslations.vert3] = b4; - } - - float b = world.getBrightness(direction, hasShade); - - for (int index = 0; index < this.brightness.length; ++index) - { - this.brightness[index] *= b; - } - */ - - // 24w36a - BlockPos blockPos = shapeState.get(0) ? pos.offset(direction) : pos; - ND neighborData = ND.getData(direction); - BlockPos.Mutable mutable = new BlockPos.Mutable(); - BC brightnessCache = BlockModelRendererSchematic.CACHE.get(); - mutable.set(blockPos, neighborData.faces[0]); - BlockState blockState = world.getBlockState(mutable); - int i = brightnessCache.getInt(blockState, world, mutable); - float f = brightnessCache.getFloat(blockState, world, mutable); - mutable.set(blockPos, neighborData.faces[1]); - BlockState blockState2 = world.getBlockState(mutable); - int j = brightnessCache.getInt(blockState2, world, mutable); - float g = brightnessCache.getFloat(blockState2, world, mutable); - mutable.set(blockPos, neighborData.faces[2]); - BlockState blockState3 = world.getBlockState(mutable); - int k = brightnessCache.getInt(blockState3, world, mutable); - float h = brightnessCache.getFloat(blockState3, world, mutable); - mutable.set(blockPos, neighborData.faces[3]); - BlockState blockState4 = world.getBlockState(mutable); - int l = brightnessCache.getInt(blockState4, world, mutable); - float m = brightnessCache.getFloat(blockState4, world, mutable); - BlockState blockState5 = world.getBlockState(mutable.set(blockPos, neighborData.faces[0]).move(direction)); - boolean bl2 = !blockState5.shouldBlockVision(world, mutable) || blockState5.getOpacity() == 0; - BlockState blockState6 = world.getBlockState(mutable.set(blockPos, neighborData.faces[1]).move(direction)); - boolean bl3 = !blockState6.shouldBlockVision(world, mutable) || blockState6.getOpacity() == 0; - BlockState blockState7 = world.getBlockState(mutable.set(blockPos, neighborData.faces[2]).move(direction)); - boolean bl4 = !blockState7.shouldBlockVision(world, mutable) || blockState7.getOpacity() == 0; - BlockState blockState8 = world.getBlockState(mutable.set(blockPos, neighborData.faces[3]).move(direction)); - boolean bl5 = !blockState8.shouldBlockVision(world, mutable) || blockState8.getOpacity() == 0; - float n; - int o; - BlockState blockState9; - if (!bl4 && !bl2) - { - n = f; - o = i; - } - else - { - mutable.set(blockPos, neighborData.faces[0]).move(neighborData.faces[2]); - blockState9 = world.getBlockState(mutable); - n = brightnessCache.getFloat(blockState9, world, mutable); - o = brightnessCache.getInt(blockState9, world, mutable); - } - - float p; - int q; - if (!bl5 && !bl2) - { - p = f; - q = i; - } - else - { - mutable.set(blockPos, neighborData.faces[0]).move(neighborData.faces[3]); - blockState9 = world.getBlockState(mutable); - p = brightnessCache.getFloat(blockState9, world, mutable); - q = brightnessCache.getInt(blockState9, world, mutable); - } - - float r; - int s; - if (!bl4 && !bl3) - { - r = f; - s = i; - } - else - { - mutable.set(blockPos, neighborData.faces[1]).move(neighborData.faces[2]); - blockState9 = world.getBlockState(mutable); - r = brightnessCache.getFloat(blockState9, world, mutable); - s = brightnessCache.getInt(blockState9, world, mutable); - } - - float t; - int u; - if (!bl5 && !bl3) - { - t = f; - u = i; - } - else - { - mutable.set(blockPos, neighborData.faces[1]).move(neighborData.faces[3]); - blockState9 = world.getBlockState(mutable); - t = brightnessCache.getFloat(blockState9, world, mutable); - u = brightnessCache.getInt(blockState9, world, mutable); - } - - int v = brightnessCache.getInt(state, world, pos); - mutable.set(pos, direction); - BlockState blockState10 = world.getBlockState(mutable); - if (shapeState.get(0) || !blockState10.isOpaqueFullCube()) - { - v = brightnessCache.getInt(blockState10, world, mutable); - } - - float w = shapeState.get(0) ? brightnessCache.getFloat(world.getBlockState(blockPos), world, blockPos) : brightnessCache.getFloat(world.getBlockState(pos), world, pos); - Tl translation = Tl.getTranslations(direction); - float x; - float y; - float z; - float aa; - if (shapeState.get(1) && neighborData.nonCubicWeight) - { - x = (m + f + p + w) * 0.25F; - y = (h + f + n + w) * 0.25F; - z = (h + g + r + w) * 0.25F; - aa = (m + g + t + w) * 0.25F; - float ab = box[neighborData.field_4192[0].shape] * box[neighborData.field_4192[1].shape]; - float ac = box[neighborData.field_4192[2].shape] * box[neighborData.field_4192[3].shape]; - float ad = box[neighborData.field_4192[4].shape] * box[neighborData.field_4192[5].shape]; - float ae = box[neighborData.field_4192[6].shape] * box[neighborData.field_4192[7].shape]; - float af = box[neighborData.field_4185[0].shape] * box[neighborData.field_4185[1].shape]; - float ag = box[neighborData.field_4185[2].shape] * box[neighborData.field_4185[3].shape]; - float ah = box[neighborData.field_4185[4].shape] * box[neighborData.field_4185[5].shape]; - float ai = box[neighborData.field_4185[6].shape] * box[neighborData.field_4185[7].shape]; - float aj = box[neighborData.field_4180[0].shape] * box[neighborData.field_4180[1].shape]; - float ak = box[neighborData.field_4180[2].shape] * box[neighborData.field_4180[3].shape]; - float al = box[neighborData.field_4180[4].shape] * box[neighborData.field_4180[5].shape]; - float am = box[neighborData.field_4180[6].shape] * box[neighborData.field_4180[7].shape]; - float an = box[neighborData.field_4188[0].shape] * box[neighborData.field_4188[1].shape]; - float ao = box[neighborData.field_4188[2].shape] * box[neighborData.field_4188[3].shape]; - float ap = box[neighborData.field_4188[4].shape] * box[neighborData.field_4188[5].shape]; - float aq = box[neighborData.field_4188[6].shape] * box[neighborData.field_4188[7].shape]; - this.brightness[translation.firstCorner] = Math.clamp(x * ab + y * ac + z * ad + aa * ae, 0.0F, 1.0F); - this.brightness[translation.secondCorner] = Math.clamp(x * af + y * ag + z * ah + aa * ai, 0.0F, 1.0F); - this.brightness[translation.thirdCorner] = Math.clamp(x * aj + y * ak + z * al + aa * am, 0.0F, 1.0F); - this.brightness[translation.fourthCorner] = Math.clamp(x * an + y * ao + z * ap + aa * aq, 0.0F, 1.0F); - int ar = this.getAmbientOcclusionBrightness(l, i, q, v); - int as = this.getAmbientOcclusionBrightness(k, i, o, v); - int at = this.getAmbientOcclusionBrightness(k, j, s, v); - int au = this.getAmbientOcclusionBrightness(l, j, u, v); - this.light[translation.firstCorner] = this.getBrightness(ar, as, at, au, ab, ac, ad, ae); - this.light[translation.secondCorner] = this.getBrightness(ar, as, at, au, af, ag, ah, ai); - this.light[translation.thirdCorner] = this.getBrightness(ar, as, at, au, aj, ak, al, am); - this.light[translation.fourthCorner] = this.getBrightness(ar, as, at, au, an, ao, ap, aq); - } - else - { - x = (m + f + p + w) * 0.25F; - y = (h + f + n + w) * 0.25F; - z = (h + g + r + w) * 0.25F; - aa = (m + g + t + w) * 0.25F; - this.light[translation.firstCorner] = this.getAmbientOcclusionBrightness(l, i, q, v); - this.light[translation.secondCorner] = this.getAmbientOcclusionBrightness(k, i, o, v); - this.light[translation.thirdCorner] = this.getAmbientOcclusionBrightness(k, j, s, v); - this.light[translation.fourthCorner] = this.getAmbientOcclusionBrightness(l, j, u, v); - this.brightness[translation.firstCorner] = x; - this.brightness[translation.secondCorner] = y; - this.brightness[translation.thirdCorner] = z; - this.brightness[translation.fourthCorner] = aa; - } - - x = world.getBrightness(direction, hasShade); - - for (int av = 0; av < this.brightness.length; ++av) - { - this.brightness[av] *= x; - } - } - - private int getAmbientOcclusionBrightness(int i, int j, int k, int l) - { - if (i == 0) - { - i = l; - } - - if (j == 0) - { - j = l; - } - - if (k == 0) - { - k = l; - } - - return i + j + k + l >> 2 & 16711935; - } - - private int getBrightness(int i, int j, int k, int l, float f, float g, float h, float m) - { - int n = (int) ((float) (i >> 16 & 255) * f + (float) (j >> 16 & 255) * g + (float) (k >> 16 & 255) * h + (float) (l >> 16 & 255) * m) & 255; - int o = (int) ((float) (i & 255) * f + (float) (j & 255) * g + (float) (k & 255) * h + (float) (l & 255) * m) & 255; - return n << 16 | o; - } - } - - // 2018 - /* - private int getAoBrightness(int br1, int br2, int br3, int br4) - { - if (br1 == 0) - { - br1 = br4; - } - - if (br2 == 0) - { - br2 = br4; - } - - if (br3 == 0) - { - br3 = br4; - } - - return br1 + br2 + br3 + br4 >> 2 & 16711935; - } - - private int getVertexBrightness(int p_178203_1_, int p_178203_2_, int p_178203_3_, int p_178203_4_, float p_178203_5_, float p_178203_6_, float p_178203_7_, float p_178203_8_) - { - int i = (int)((float)(p_178203_1_ >> 16 & 255) * p_178203_5_ + (float)(p_178203_2_ >> 16 & 255) * p_178203_6_ + (float)(p_178203_3_ >> 16 & 255) * p_178203_7_ + (float)(p_178203_4_ >> 16 & 255) * p_178203_8_) & 255; - int j = (int)((float)(p_178203_1_ & 255) * p_178203_5_ + (float)(p_178203_2_ & 255) * p_178203_6_ + (float)(p_178203_3_ & 255) * p_178203_7_ + (float)(p_178203_4_ & 255) * p_178203_8_) & 255; - return i << 16 | j; - } - } - - public enum EnumNeighborInfo - { - DOWN(new Direction[]{Direction.WEST, Direction.EAST, Direction.NORTH, Direction.SOUTH}, 0.5F, true, new Orientation[]{Orientation.FLIP_WEST, Orientation.SOUTH, Orientation.FLIP_WEST, Orientation.FLIP_SOUTH, Orientation.WEST, Orientation.FLIP_SOUTH, Orientation.WEST, Orientation.SOUTH}, new Orientation[]{Orientation.FLIP_WEST, Orientation.NORTH, Orientation.FLIP_WEST, Orientation.FLIP_NORTH, Orientation.WEST, Orientation.FLIP_NORTH, Orientation.WEST, Orientation.NORTH}, new Orientation[]{Orientation.FLIP_EAST, Orientation.NORTH, Orientation.FLIP_EAST, Orientation.FLIP_NORTH, Orientation.EAST, Orientation.FLIP_NORTH, Orientation.EAST, Orientation.NORTH}, new Orientation[]{Orientation.FLIP_EAST, Orientation.SOUTH, Orientation.FLIP_EAST, Orientation.FLIP_SOUTH, Orientation.EAST, Orientation.FLIP_SOUTH, Orientation.EAST, Orientation.SOUTH}), - UP(new Direction[]{Direction.EAST, Direction.WEST, Direction.NORTH, Direction.SOUTH}, 1.0F, true, new Orientation[]{Orientation.EAST, Orientation.SOUTH, Orientation.EAST, Orientation.FLIP_SOUTH, Orientation.FLIP_EAST, Orientation.FLIP_SOUTH, Orientation.FLIP_EAST, Orientation.SOUTH}, new Orientation[]{Orientation.EAST, Orientation.NORTH, Orientation.EAST, Orientation.FLIP_NORTH, Orientation.FLIP_EAST, Orientation.FLIP_NORTH, Orientation.FLIP_EAST, Orientation.NORTH}, new Orientation[]{Orientation.WEST, Orientation.NORTH, Orientation.WEST, Orientation.FLIP_NORTH, Orientation.FLIP_WEST, Orientation.FLIP_NORTH, Orientation.FLIP_WEST, Orientation.NORTH}, new Orientation[]{Orientation.WEST, Orientation.SOUTH, Orientation.WEST, Orientation.FLIP_SOUTH, Orientation.FLIP_WEST, Orientation.FLIP_SOUTH, Orientation.FLIP_WEST, Orientation.SOUTH}), - NORTH(new Direction[]{Direction.UP, Direction.DOWN, Direction.EAST, Direction.WEST}, 0.8F, true, new Orientation[]{Orientation.UP, Orientation.FLIP_WEST, Orientation.UP, Orientation.WEST, Orientation.FLIP_UP, Orientation.WEST, Orientation.FLIP_UP, Orientation.FLIP_WEST}, new Orientation[]{Orientation.UP, Orientation.FLIP_EAST, Orientation.UP, Orientation.EAST, Orientation.FLIP_UP, Orientation.EAST, Orientation.FLIP_UP, Orientation.FLIP_EAST}, new Orientation[]{Orientation.DOWN, Orientation.FLIP_EAST, Orientation.DOWN, Orientation.EAST, Orientation.FLIP_DOWN, Orientation.EAST, Orientation.FLIP_DOWN, Orientation.FLIP_EAST}, new Orientation[]{Orientation.DOWN, Orientation.FLIP_WEST, Orientation.DOWN, Orientation.WEST, Orientation.FLIP_DOWN, Orientation.WEST, Orientation.FLIP_DOWN, Orientation.FLIP_WEST}), - SOUTH(new Direction[]{Direction.WEST, Direction.EAST, Direction.DOWN, Direction.UP}, 0.8F, true, new Orientation[]{Orientation.UP, Orientation.FLIP_WEST, Orientation.FLIP_UP, Orientation.FLIP_WEST, Orientation.FLIP_UP, Orientation.WEST, Orientation.UP, Orientation.WEST}, new Orientation[]{Orientation.DOWN, Orientation.FLIP_WEST, Orientation.FLIP_DOWN, Orientation.FLIP_WEST, Orientation.FLIP_DOWN, Orientation.WEST, Orientation.DOWN, Orientation.WEST}, new Orientation[]{Orientation.DOWN, Orientation.FLIP_EAST, Orientation.FLIP_DOWN, Orientation.FLIP_EAST, Orientation.FLIP_DOWN, Orientation.EAST, Orientation.DOWN, Orientation.EAST}, new Orientation[]{Orientation.UP, Orientation.FLIP_EAST, Orientation.FLIP_UP, Orientation.FLIP_EAST, Orientation.FLIP_UP, Orientation.EAST, Orientation.UP, Orientation.EAST}), - WEST(new Direction[]{Direction.UP, Direction.DOWN, Direction.NORTH, Direction.SOUTH}, 0.6F, true, new Orientation[]{Orientation.UP, Orientation.SOUTH, Orientation.UP, Orientation.FLIP_SOUTH, Orientation.FLIP_UP, Orientation.FLIP_SOUTH, Orientation.FLIP_UP, Orientation.SOUTH}, new Orientation[]{Orientation.UP, Orientation.NORTH, Orientation.UP, Orientation.FLIP_NORTH, Orientation.FLIP_UP, Orientation.FLIP_NORTH, Orientation.FLIP_UP, Orientation.NORTH}, new Orientation[]{Orientation.DOWN, Orientation.NORTH, Orientation.DOWN, Orientation.FLIP_NORTH, Orientation.FLIP_DOWN, Orientation.FLIP_NORTH, Orientation.FLIP_DOWN, Orientation.NORTH}, new Orientation[]{Orientation.DOWN, Orientation.SOUTH, Orientation.DOWN, Orientation.FLIP_SOUTH, Orientation.FLIP_DOWN, Orientation.FLIP_SOUTH, Orientation.FLIP_DOWN, Orientation.SOUTH}), - EAST(new Direction[]{Direction.DOWN, Direction.UP, Direction.NORTH, Direction.SOUTH}, 0.6F, true, new Orientation[]{Orientation.FLIP_DOWN, Orientation.SOUTH, Orientation.FLIP_DOWN, Orientation.FLIP_SOUTH, Orientation.DOWN, Orientation.FLIP_SOUTH, Orientation.DOWN, Orientation.SOUTH}, new Orientation[]{Orientation.FLIP_DOWN, Orientation.NORTH, Orientation.FLIP_DOWN, Orientation.FLIP_NORTH, Orientation.DOWN, Orientation.FLIP_NORTH, Orientation.DOWN, Orientation.NORTH}, new Orientation[]{Orientation.FLIP_UP, Orientation.NORTH, Orientation.FLIP_UP, Orientation.FLIP_NORTH, Orientation.UP, Orientation.FLIP_NORTH, Orientation.UP, Orientation.NORTH}, new Orientation[]{Orientation.FLIP_UP, Orientation.SOUTH, Orientation.FLIP_UP, Orientation.FLIP_SOUTH, Orientation.UP, Orientation.FLIP_SOUTH, Orientation.UP, Orientation.SOUTH}); - - //private final Direction[] corners; - //private final float shadeWeight; - private final boolean doNonCubicWeight; - private final Orientation[] vert0Weights; - private final Orientation[] vert1Weights; - private final Orientation[] vert2Weights; - private final Orientation[] vert3Weights; - private static final EnumNeighborInfo[] VALUES = new EnumNeighborInfo[6]; - - EnumNeighborInfo(Direction[] p_i46236_3_, float p_i46236_4_, boolean p_i46236_5_, Orientation[] p_i46236_6_, Orientation[] p_i46236_7_, Orientation[] p_i46236_8_, Orientation[] p_i46236_9_) - { - //this.corners = p_i46236_3_; - //this.shadeWeight = p_i46236_4_; - this.doNonCubicWeight = p_i46236_5_; - this.vert0Weights = p_i46236_6_; - this.vert1Weights = p_i46236_7_; - this.vert2Weights = p_i46236_8_; - this.vert3Weights = p_i46236_9_; - } - - public static EnumNeighborInfo getNeighbourInfo(Direction p_178273_0_) - { - return VALUES[p_178273_0_.getId()]; - } - - static - { - VALUES[Direction.DOWN.getId()] = DOWN; - VALUES[Direction.UP.getId()] = UP; - VALUES[Direction.NORTH.getId()] = NORTH; - VALUES[Direction.SOUTH.getId()] = SOUTH; - VALUES[Direction.WEST.getId()] = WEST; - VALUES[Direction.EAST.getId()] = EAST; - } - } - - public enum Orientation + @ApiStatus.Experimental + public void renderLiquid(VertexConsumer consumer, BlockRenderView world, BlockPos pos, BlockState stateIn, FluidState fluid) { - DOWN(Direction.DOWN, false), - UP(Direction.UP, false), - NORTH(Direction.NORTH, false), - SOUTH(Direction.SOUTH, false), - WEST(Direction.WEST, false), - EAST(Direction.EAST, false), - FLIP_DOWN(Direction.DOWN, true), - FLIP_UP(Direction.UP, true), - FLIP_NORTH(Direction.NORTH, true), - FLIP_SOUTH(Direction.SOUTH, true), - FLIP_WEST(Direction.WEST, true), - FLIP_EAST(Direction.EAST, true); - - private final int shape; - - Orientation(Direction p_i46233_3_, boolean p_i46233_4_) - { - this.shape = p_i46233_3_.getId() + (p_i46233_4_ ? Direction.values().length : 0); - } - } - - enum VertexTranslations - { - DOWN(0, 1, 2, 3), - UP(2, 3, 0, 1), - NORTH(3, 0, 1, 2), - SOUTH(0, 1, 2, 3), - WEST(3, 0, 1, 2), - EAST(1, 2, 3, 0); - - private final int vert0; - private final int vert1; - private final int vert2; - private final int vert3; - private static final VertexTranslations[] VALUES = new VertexTranslations[6]; - - VertexTranslations(int p_i46234_3_, int p_i46234_4_, int p_i46234_5_, int p_i46234_6_) - { - this.vert0 = p_i46234_3_; - this.vert1 = p_i46234_4_; - this.vert2 = p_i46234_5_; - this.vert3 = p_i46234_6_; - } - - public static VertexTranslations getVertexTranslations(Direction p_178184_0_) - { - return VALUES[p_178184_0_.getId()]; - } - - static - { - VALUES[Direction.DOWN.getId()] = DOWN; - VALUES[Direction.UP.getId()] = UP; - VALUES[Direction.NORTH.getId()] = NORTH; - VALUES[Direction.SOUTH.getId()] = SOUTH; - VALUES[Direction.WEST.getId()] = WEST; - VALUES[Direction.EAST.getId()] = EAST; - } - } - */ - - private static class BC - { - private boolean enabled; - private final Long2IntLinkedOpenHashMap intCache = Util.make(() -> - { - Long2IntLinkedOpenHashMap long2IntLinkedOpenHashMap = new Long2IntLinkedOpenHashMap(100, 0.25F) - { - protected void rehash(int newN) - { - } - }; - long2IntLinkedOpenHashMap.defaultReturnValue(Integer.MAX_VALUE); - return long2IntLinkedOpenHashMap; - }); - private final Long2FloatLinkedOpenHashMap floatCache = Util.make(() -> - { - Long2FloatLinkedOpenHashMap long2FloatLinkedOpenHashMap = new Long2FloatLinkedOpenHashMap(100, 0.25F) - { - protected void rehash(int newN) - { - } - }; - long2FloatLinkedOpenHashMap.defaultReturnValue(Float.NaN); - return long2FloatLinkedOpenHashMap; - }); - - private BC() - { - } - - public void enable() - { - this.enabled = true; - } - - public void disable() - { - this.enabled = false; - this.intCache.clear(); - this.floatCache.clear(); - } - - public int getInt(BlockState state, BlockRenderView world, BlockPos pos) + try { - long l = pos.asLong(); - int i; - if (this.enabled) - { - i = this.intCache.get(l); - if (i != Integer.MAX_VALUE) - { - return i; - } - } - - i = WorldRenderer.getLightmapCoordinates(world, state, pos); - if (this.enabled) - { - if (this.intCache.size() == 100) - { - this.intCache.removeFirstInt(); - } - - this.intCache.put(l, i); - } - - return i; + this.liquidRenderer.render(world, pos, consumer, stateIn, fluid); } - - public float getFloat(BlockState state, BlockRenderView blockView, BlockPos pos) + catch (Throwable var9) { - long l = pos.asLong(); - float f; - if (this.enabled) - { - f = this.floatCache.get(l); - if (!Float.isNaN(f)) - { - return f; - } - } - - f = state.getAmbientOcclusionLightLevel(blockView, pos); - if (this.enabled) - { - if (this.floatCache.size() == 100) - { - this.floatCache.removeFirstFloat(); - } - - this.floatCache.put(l, f); - } - - return f; + CrashReport crashReport = CrashReport.create(var9, "Tesselating liquid in world"); + CrashReportSection crashReportSection = crashReport.addElement("Block being tesselated"); + CrashReportSection.addBlockInfo(crashReportSection, world, pos, null); + throw new CrashException(crashReport); } } - protected enum ND + public BakedModel getBakedModel(BlockState stateIn) { - DOWN(new Direction[]{Direction.WEST, Direction.EAST, Direction.NORTH, Direction.SOUTH}, 0.5F, true, new NO[]{NO.FLIP_WEST, NO.SOUTH, NO.FLIP_WEST, NO.FLIP_SOUTH, NO.WEST, NO.FLIP_SOUTH, NO.WEST, NO.SOUTH}, new NO[]{NO.FLIP_WEST, NO.NORTH, NO.FLIP_WEST, NO.FLIP_NORTH, NO.WEST, NO.FLIP_NORTH, NO.WEST, NO.NORTH}, new NO[]{NO.FLIP_EAST, NO.NORTH, NO.FLIP_EAST, NO.FLIP_NORTH, NO.EAST, NO.FLIP_NORTH, NO.EAST, NO.NORTH}, new NO[]{NO.FLIP_EAST, NO.SOUTH, NO.FLIP_EAST, NO.FLIP_SOUTH, NO.EAST, NO.FLIP_SOUTH, NO.EAST, NO.SOUTH}), - UP(new Direction[]{Direction.EAST, Direction.WEST, Direction.NORTH, Direction.SOUTH}, 1.0F, true, new NO[]{NO.EAST, NO.SOUTH, NO.EAST, NO.FLIP_SOUTH, NO.FLIP_EAST, NO.FLIP_SOUTH, NO.FLIP_EAST, NO.SOUTH}, new NO[]{NO.EAST, NO.NORTH, NO.EAST, NO.FLIP_NORTH, NO.FLIP_EAST, NO.FLIP_NORTH, NO.FLIP_EAST, NO.NORTH}, new NO[]{NO.WEST, NO.NORTH, NO.WEST, NO.FLIP_NORTH, NO.FLIP_WEST, NO.FLIP_NORTH, NO.FLIP_WEST, NO.NORTH}, new NO[]{NO.WEST, NO.SOUTH, NO.WEST, NO.FLIP_SOUTH, NO.FLIP_WEST, NO.FLIP_SOUTH, NO.FLIP_WEST, NO.SOUTH}), - NORTH(new Direction[]{Direction.UP, Direction.DOWN, Direction.EAST, Direction.WEST}, 0.8F, true, new NO[]{NO.UP, NO.FLIP_WEST, NO.UP, NO.WEST, NO.FLIP_UP, NO.WEST, NO.FLIP_UP, NO.FLIP_WEST}, new NO[]{NO.UP, NO.FLIP_EAST, NO.UP, NO.EAST, NO.FLIP_UP, NO.EAST, NO.FLIP_UP, NO.FLIP_EAST}, new NO[]{NO.DOWN, NO.FLIP_EAST, NO.DOWN, NO.EAST, NO.FLIP_DOWN, NO.EAST, NO.FLIP_DOWN, NO.FLIP_EAST}, new NO[]{NO.DOWN, NO.FLIP_WEST, NO.DOWN, NO.WEST, NO.FLIP_DOWN, NO.WEST, NO.FLIP_DOWN, NO.FLIP_WEST}), - SOUTH(new Direction[]{Direction.WEST, Direction.EAST, Direction.DOWN, Direction.UP}, 0.8F, true, new NO[]{NO.UP, NO.FLIP_WEST, NO.FLIP_UP, NO.FLIP_WEST, NO.FLIP_UP, NO.WEST, NO.UP, NO.WEST}, new NO[]{NO.DOWN, NO.FLIP_WEST, NO.FLIP_DOWN, NO.FLIP_WEST, NO.FLIP_DOWN, NO.WEST, NO.DOWN, NO.WEST}, new NO[]{NO.DOWN, NO.FLIP_EAST, NO.FLIP_DOWN, NO.FLIP_EAST, NO.FLIP_DOWN, NO.EAST, NO.DOWN, NO.EAST}, new NO[]{NO.UP, NO.FLIP_EAST, NO.FLIP_UP, NO.FLIP_EAST, NO.FLIP_UP, NO.EAST, NO.UP, NO.EAST}), - WEST(new Direction[]{Direction.UP, Direction.DOWN, Direction.NORTH, Direction.SOUTH}, 0.6F, true, new NO[]{NO.UP, NO.SOUTH, NO.UP, NO.FLIP_SOUTH, NO.FLIP_UP, NO.FLIP_SOUTH, NO.FLIP_UP, NO.SOUTH}, new NO[]{NO.UP, NO.NORTH, NO.UP, NO.FLIP_NORTH, NO.FLIP_UP, NO.FLIP_NORTH, NO.FLIP_UP, NO.NORTH}, new NO[]{NO.DOWN, NO.NORTH, NO.DOWN, NO.FLIP_NORTH, NO.FLIP_DOWN, NO.FLIP_NORTH, NO.FLIP_DOWN, NO.NORTH}, new NO[]{NO.DOWN, NO.SOUTH, NO.DOWN, NO.FLIP_SOUTH, NO.FLIP_DOWN, NO.FLIP_SOUTH, NO.FLIP_DOWN, NO.SOUTH}), - EAST(new Direction[]{Direction.DOWN, Direction.UP, Direction.NORTH, Direction.SOUTH}, 0.6F, true, new NO[]{NO.FLIP_DOWN, NO.SOUTH, NO.FLIP_DOWN, NO.FLIP_SOUTH, NO.DOWN, NO.FLIP_SOUTH, NO.DOWN, NO.SOUTH}, new NO[]{NO.FLIP_DOWN, NO.NORTH, NO.FLIP_DOWN, NO.FLIP_NORTH, NO.DOWN, NO.FLIP_NORTH, NO.DOWN, NO.NORTH}, new NO[]{NO.FLIP_UP, NO.NORTH, NO.FLIP_UP, NO.FLIP_NORTH, NO.UP, NO.FLIP_NORTH, NO.UP, NO.NORTH}, new NO[]{NO.FLIP_UP, NO.SOUTH, NO.FLIP_UP, NO.FLIP_SOUTH, NO.UP, NO.FLIP_SOUTH, NO.UP, NO.SOUTH}); - - final Direction[] faces; - final boolean nonCubicWeight; - final NO[] field_4192; - final NO[] field_4185; - final NO[] field_4180; - final NO[] field_4188; - private static final ND[] VALUES = Util.make(new ND[6], (values) -> - { - values[Direction.DOWN.getId()] = DOWN; - values[Direction.UP.getId()] = UP; - values[Direction.NORTH.getId()] = NORTH; - values[Direction.SOUTH.getId()] = SOUTH; - values[Direction.WEST.getId()] = WEST; - values[Direction.EAST.getId()] = EAST; - }); - - ND(final Direction[] faces, final float f, final boolean nonCubicWeight, final NO[] neighborOrientations, final NO[] neighborOrientations2, final NO[] neighborOrientations3, final NO[] neighborOrientations4) - { - this.faces = faces; - this.nonCubicWeight = nonCubicWeight; - this.field_4192 = neighborOrientations; - this.field_4185 = neighborOrientations2; - this.field_4180 = neighborOrientations3; - this.field_4188 = neighborOrientations4; - } - - public static ND getData(Direction direction) - { - return VALUES[direction.getId()]; - } + return this.bakedManager.getBlockModels().getModel(stateIn); } - protected enum NO + @ApiStatus.Experimental + public boolean renderBlockEntity(VertexConsumerProvider consumer, MatrixStack matrixStack, BlockState stateIn, int light, int overlay) { - DOWN(Direction.DOWN, false), - UP(Direction.UP, false), - NORTH(Direction.NORTH, false), - SOUTH(Direction.SOUTH, false), - WEST(Direction.WEST, false), - EAST(Direction.EAST, false), - FLIP_DOWN(Direction.DOWN, true), - FLIP_UP(Direction.UP, true), - FLIP_NORTH(Direction.NORTH, true), - FLIP_SOUTH(Direction.SOUTH, true), - FLIP_WEST(Direction.WEST, true), - FLIP_EAST(Direction.EAST, true); - - final int shape; + BlockRenderType blockRenderType = stateIn.getRenderType(); - NO(final Direction direction, final boolean flip) + if (blockRenderType == BlockRenderType.INVISIBLE) { - this.shape = direction.getId() + (flip ? DIRECTIONS.length : 0); + return false; } - } - private enum Tl - { - DOWN(0, 1, 2, 3), - UP(2, 3, 0, 1), - NORTH(3, 0, 1, 2), - SOUTH(0, 1, 2, 3), - WEST(3, 0, 1, 2), - EAST(1, 2, 3, 0); + BakedModel bakedModel = this.getBakedModel(stateIn); + int i = this.colorMap.getColor(stateIn, null, null, 0); + float red = (float) (i >> 16 & 0xFF) / 255.0f; + float green = (float) (i >> 8 & 0xFF) / 255.0f; + float blue = (float) (i & 0xFF) / 255.0f; - final int firstCorner; - final int secondCorner; - final int thirdCorner; - final int fourthCorner; - private static final Tl[] VALUES = Util.make(new Tl[6], (values) -> - { - values[Direction.DOWN.getId()] = DOWN; - values[Direction.UP.getId()] = UP; - values[Direction.NORTH.getId()] = NORTH; - values[Direction.SOUTH.getId()] = SOUTH; - values[Direction.WEST.getId()] = WEST; - values[Direction.EAST.getId()] = EAST; - }); + renderEntity(consumer.getBuffer(RenderLayers.getEntityBlockLayer(stateIn)), matrixStack, stateIn, bakedModel, red, green, blue, light, overlay); + this.bakedManager.getBlockEntityModelsSupplier().get() + .render(stateIn.getBlock(), ModelTransformationMode.NONE, matrixStack, consumer, light, overlay); - Tl(final int firstCorner, final int secondCorner, final int thirdCorner, final int fourthCorner) - { - this.firstCorner = firstCorner; - this.secondCorner = secondCorner; - this.thirdCorner = thirdCorner; - this.fourthCorner = fourthCorner; - } - - public static Tl getTranslations(Direction direction) - { - return VALUES[direction.getId()]; - } + return true; } } diff --git a/src/main/java/fi/dy/masa/litematica/render/schematic/BufferAllocatorCache.java b/src/main/java/fi/dy/masa/litematica/render/schematic/BufferAllocatorCache.java index 4b32a02235..be22d04dd5 100644 --- a/src/main/java/fi/dy/masa/litematica/render/schematic/BufferAllocatorCache.java +++ b/src/main/java/fi/dy/masa/litematica/render/schematic/BufferAllocatorCache.java @@ -28,7 +28,10 @@ protected void allocateCache() this.layerCache.get(layer).close(); } - this.layerCache.put(layer, new BufferAllocator(layer.getExpectedBufferSize())); + synchronized (this.layerCache) + { + this.layerCache.put(layer, new BufferAllocator(layer.getExpectedBufferSize())); + } } for (OverlayRenderType type : TYPES) { @@ -37,7 +40,10 @@ protected void allocateCache() this.overlayCache.get(type).close(); } - this.overlayCache.put(type, new BufferAllocator(type.getExpectedBufferSize())); + synchronized (this.overlayCache) + { + this.overlayCache.put(type, new BufferAllocator(type.getExpectedBufferSize())); + } } } @@ -53,19 +59,28 @@ protected boolean hasBufferByOverlay(OverlayRenderType type) protected BufferAllocator getBufferByLayer(RenderLayer layer) { - return this.layerCache.computeIfAbsent(layer, l -> new BufferAllocator(l.getExpectedBufferSize())); + synchronized (this.layerCache) + { + return this.layerCache.computeIfAbsent(layer, l -> new BufferAllocator(l.getExpectedBufferSize())); + } } protected BufferAllocator getBufferByOverlay(OverlayRenderType type) { - return this.overlayCache.computeIfAbsent(type, t -> new BufferAllocator(t.getExpectedBufferSize())); + synchronized (this.overlayCache) + { + return this.overlayCache.computeIfAbsent(type, t -> new BufferAllocator(t.getExpectedBufferSize())); + } } protected void closeByLayer(RenderLayer layer) { try { - this.layerCache.remove(layer).close(); + synchronized (this.layerCache) + { + this.layerCache.remove(layer).close(); + } } catch (Exception ignored) { } } @@ -74,7 +89,10 @@ protected void closeByType(OverlayRenderType type) { try { - this.overlayCache.remove(type).close(); + synchronized (this.overlayCache) + { + this.overlayCache.remove(type).close(); + } } catch (Exception ignored) { } } diff --git a/src/main/java/fi/dy/masa/litematica/render/schematic/BufferBuilderCache.java b/src/main/java/fi/dy/masa/litematica/render/schematic/BufferBuilderCache.java index 397457851f..50d5a9c8d6 100644 --- a/src/main/java/fi/dy/masa/litematica/render/schematic/BufferBuilderCache.java +++ b/src/main/java/fi/dy/masa/litematica/render/schematic/BufferBuilderCache.java @@ -17,22 +17,28 @@ protected BufferBuilderCache() { } protected boolean hasBufferByLayer(RenderLayer layer) { - return blockBufferBuilders.containsKey(layer); + return this.blockBufferBuilders.containsKey(layer); } protected boolean hasBufferByOverlay(OverlayRenderType type) { - return overlayBufferBuilders.containsKey(type); + return this.overlayBufferBuilders.containsKey(type); } protected BufferBuilder getBufferByLayer(RenderLayer layer, @Nonnull BufferAllocatorCache allocators) { - return blockBufferBuilders.computeIfAbsent(layer, (key) -> new BufferBuilder(allocators.getBufferByLayer(key), key.getDrawMode(), key.getVertexFormat())); + synchronized (this.blockBufferBuilders) + { + return this.blockBufferBuilders.computeIfAbsent(layer, (key) -> new BufferBuilder(allocators.getBufferByLayer(key), key.getDrawMode(), key.getVertexFormat())); + } } protected BufferBuilder getBufferByOverlay(OverlayRenderType type, @Nonnull BufferAllocatorCache allocators) { - return overlayBufferBuilders.computeIfAbsent(type, (key) -> new BufferBuilder(allocators.getBufferByOverlay(key), key.getDrawMode(), key.getVertexFormat())); + synchronized (this.overlayBufferBuilders) + { + return this.overlayBufferBuilders.computeIfAbsent(type, (key) -> new BufferBuilder(allocators.getBufferByOverlay(key), key.getDrawMode(), key.getVertexFormat())); + } } protected void clearAll() diff --git a/src/main/java/fi/dy/masa/litematica/render/schematic/BuiltBufferCache.java b/src/main/java/fi/dy/masa/litematica/render/schematic/BuiltBufferCache.java index d8aeca516b..f95da4b597 100644 --- a/src/main/java/fi/dy/masa/litematica/render/schematic/BuiltBufferCache.java +++ b/src/main/java/fi/dy/masa/litematica/render/schematic/BuiltBufferCache.java @@ -30,7 +30,10 @@ protected void storeBuiltBufferByLayer(RenderLayer layer, @Nonnull BuiltBuffer n { this.layerBuffers.get(layer).close(); } - this.layerBuffers.put(layer, newBuffer); + synchronized (this.layerBuffers) + { + this.layerBuffers.put(layer, newBuffer); + } } protected void storeBuiltBufferByType(OverlayRenderType type, @Nonnull BuiltBuffer newBuffer) @@ -39,7 +42,10 @@ protected void storeBuiltBufferByType(OverlayRenderType type, @Nonnull BuiltBuff { this.overlayBuffers.get(type).close(); } - this.overlayBuffers.put(type, newBuffer); + synchronized (this.overlayBuffers) + { + this.overlayBuffers.put(type, newBuffer); + } } @Nullable diff --git a/src/main/java/fi/dy/masa/litematica/render/schematic/ChunkRenderLayers.java b/src/main/java/fi/dy/masa/litematica/render/schematic/ChunkRenderLayers.java index 09a43f94b6..8e3b89c50e 100644 --- a/src/main/java/fi/dy/masa/litematica/render/schematic/ChunkRenderLayers.java +++ b/src/main/java/fi/dy/masa/litematica/render/schematic/ChunkRenderLayers.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; + import net.minecraft.client.render.RenderLayer; public record ChunkRenderLayers() @@ -17,6 +18,25 @@ private static List getLayers() // Water Rendering list.add(RenderLayer.getWaterMask()); + // Experimental + /* + list.add(RenderLayer.getSecondaryBlockOutline()); + list.add(RenderLayer.getArmorEntityGlint()); + list.add(RenderLayer.getEntityGlint()); + list.add(TexturedRenderLayers.getArmorTrims(true)); + list.add(TexturedRenderLayers.getArmorTrims(false)); + list.add(TexturedRenderLayers.getBeds()); + list.add(TexturedRenderLayers.getBannerPatterns()); + list.add(TexturedRenderLayers.getChest()); + list.add(TexturedRenderLayers.getEntitySolid()); + list.add(TexturedRenderLayers.getEntityCutout()); + list.add(TexturedRenderLayers.getHangingSign()); + list.add(TexturedRenderLayers.getItemEntityTranslucentCull()); + list.add(TexturedRenderLayers.getShieldPatterns()); + list.add(TexturedRenderLayers.getShulkerBoxes()); + list.add(TexturedRenderLayers.getSign()); + */ + return list; } diff --git a/src/main/java/fi/dy/masa/litematica/render/schematic/WorldRendererSchematic.java b/src/main/java/fi/dy/masa/litematica/render/schematic/WorldRendererSchematic.java index 77c3bea3b4..5e2deee13c 100644 --- a/src/main/java/fi/dy/masa/litematica/render/schematic/WorldRendererSchematic.java +++ b/src/main/java/fi/dy/masa/litematica/render/schematic/WorldRendererSchematic.java @@ -3,6 +3,9 @@ import java.util.*; import javax.annotation.Nullable; +import net.minecraft.client.render.block.BlockModelRenderer; +import net.minecraft.client.render.model.BakedModelManager; +import net.minecraft.util.math.random.Random; import net.minecraft.util.profiler.Profilers; import org.joml.Matrix4f; import org.joml.Matrix4fStack; @@ -82,11 +85,10 @@ public WorldRendererSchematic(MinecraftClient mc) this.mc = mc; this.entityRenderDispatcher = mc.getEntityRenderDispatcher(); this.bufferBuilders = mc.getBufferBuilders(); - - this.renderChunkFactory = (world1, worldRenderer) -> new ChunkRendererSchematicVbo(world1, worldRenderer); - + this.renderChunkFactory = ChunkRendererSchematicVbo::new; this.blockRenderManager = MinecraftClient.getInstance().getBlockRenderManager(); this.blockModelRenderer = new BlockModelRendererSchematic(mc.getBlockColors()); + this.blockModelRenderer.setBakedManager(mc.getBakedModelManager()); } public void markNeedsUpdate() @@ -668,6 +670,8 @@ public boolean renderBlock(BlockRenderView world, BlockState state, BlockPos pos this.blockModelRenderer.renderModel(world, this.getModelForState(state), state, pos, matrixStack, bufferBuilderIn, state.getRenderingSeed(pos)); BlockModelRendererSchematic.disableCache(); + //System.out.printf("renderBlock(): result [%s]\n", result); + // TODO --> For testing the Vanilla Block Model Renderer /* BlockModelRenderer.enableBrightnessCache(); @@ -708,7 +712,8 @@ public BakedModel getModelForState(BlockState state) } */ - return this.blockRenderManager.getModel(state); + //return this.blockRenderManager.getModel(state); + return this.blockRenderManager.getModels().getModel(state); } public void renderEntities(Camera camera, Frustum frustum, Matrix4f posMatrix, float partialTicks, Profiler profiler) diff --git a/src/main/java/fi/dy/masa/litematica/render/schematic/ao/AOProcessor.java b/src/main/java/fi/dy/masa/litematica/render/schematic/ao/AOProcessor.java new file mode 100644 index 0000000000..159920d33a --- /dev/null +++ b/src/main/java/fi/dy/masa/litematica/render/schematic/ao/AOProcessor.java @@ -0,0 +1,32 @@ +package fi.dy.masa.litematica.render.schematic.ao; + +import java.util.BitSet; + +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.BlockRenderView; + +import fi.dy.masa.litematica.config.Configs; + +public abstract class AOProcessor +{ + public final float[] brightness = new float[4]; + public final int[] light = new int[4]; + + public static AOProcessor get() + { + if (Configs.Visuals.RENDER_AO_MODERN_ENABLE.getBooleanValue()) + { + return new AOProcessorModern(); + } + else + { + return new AOProcessorLegacy(); + } + } + + public void apply(BlockRenderView world, BlockState state, BlockPos pos, Direction direction, float[] box, BitSet shapeState, boolean hasShade) + { + } +} diff --git a/src/main/java/fi/dy/masa/litematica/render/schematic/ao/AOProcessorLegacy.java b/src/main/java/fi/dy/masa/litematica/render/schematic/ao/AOProcessorLegacy.java new file mode 100644 index 0000000000..dcf7285837 --- /dev/null +++ b/src/main/java/fi/dy/masa/litematica/render/schematic/ao/AOProcessorLegacy.java @@ -0,0 +1,212 @@ +package fi.dy.masa.litematica.render.schematic.ao; + +import java.util.BitSet; + +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.BlockRenderView; + +public class AOProcessorLegacy extends AOProcessor +{ + @Override + public void apply(BlockRenderView world, BlockState state, BlockPos pos, Direction direction, float[] box, BitSet shapeState, boolean hasShade) + { + // 2018 + EnumNeighborInfo neighborInfo = EnumNeighborInfo.getNeighbourInfo(direction); + VertexTranslations vertexTranslations = VertexTranslations.getVertexTranslations(direction); + int i, j, k, l, i1, i3, j1, k1, l1; + i = j = k = l = i1 = i3 = j1 = k1 = l1 = ((15 << 20) | (15 << 4)); + float b1 = 1.0F; + float b2 = 1.0F; + float b3 = 1.0F; + float b4 = 1.0F; + + if (shapeState.get(1) && neighborInfo.doNonCubicWeight) + { + float f13 = box[neighborInfo.vert0Weights[0].shape] * box[neighborInfo.vert0Weights[1].shape]; + float f14 = box[neighborInfo.vert0Weights[2].shape] * box[neighborInfo.vert0Weights[3].shape]; + float f15 = box[neighborInfo.vert0Weights[4].shape] * box[neighborInfo.vert0Weights[5].shape]; + float f16 = box[neighborInfo.vert0Weights[6].shape] * box[neighborInfo.vert0Weights[7].shape]; + float f17 = box[neighborInfo.vert1Weights[0].shape] * box[neighborInfo.vert1Weights[1].shape]; + float f18 = box[neighborInfo.vert1Weights[2].shape] * box[neighborInfo.vert1Weights[3].shape]; + float f19 = box[neighborInfo.vert1Weights[4].shape] * box[neighborInfo.vert1Weights[5].shape]; + float f20 = box[neighborInfo.vert1Weights[6].shape] * box[neighborInfo.vert1Weights[7].shape]; + float f21 = box[neighborInfo.vert2Weights[0].shape] * box[neighborInfo.vert2Weights[1].shape]; + float f22 = box[neighborInfo.vert2Weights[2].shape] * box[neighborInfo.vert2Weights[3].shape]; + float f23 = box[neighborInfo.vert2Weights[4].shape] * box[neighborInfo.vert2Weights[5].shape]; + float f24 = box[neighborInfo.vert2Weights[6].shape] * box[neighborInfo.vert2Weights[7].shape]; + float f25 = box[neighborInfo.vert3Weights[0].shape] * box[neighborInfo.vert3Weights[1].shape]; + float f26 = box[neighborInfo.vert3Weights[2].shape] * box[neighborInfo.vert3Weights[3].shape]; + float f27 = box[neighborInfo.vert3Weights[4].shape] * box[neighborInfo.vert3Weights[5].shape]; + float f28 = box[neighborInfo.vert3Weights[6].shape] * box[neighborInfo.vert3Weights[7].shape]; + this.brightness[vertexTranslations.vert0] = b1 * f13 + b2 * f14 + b3 * f15 + b4 * f16; + this.brightness[vertexTranslations.vert1] = b1 * f17 + b2 * f18 + b3 * f19 + b4 * f20; + this.brightness[vertexTranslations.vert2] = b1 * f21 + b2 * f22 + b3 * f23 + b4 * f24; + this.brightness[vertexTranslations.vert3] = b1 * f25 + b2 * f26 + b3 * f27 + b4 * f28; + int i2 = this.getAoBrightness(l, i, j1, i3); + int j2 = this.getAoBrightness(k, i, i1, i3); + int k2 = this.getAoBrightness(k, j, k1, i3); + int l2 = this.getAoBrightness(l, j, l1, i3); + this.light[vertexTranslations.vert0] = this.getVertexBrightness(i2, j2, k2, l2, f13, f14, f15, f16); + this.light[vertexTranslations.vert1] = this.getVertexBrightness(i2, j2, k2, l2, f17, f18, f19, f20); + this.light[vertexTranslations.vert2] = this.getVertexBrightness(i2, j2, k2, l2, f21, f22, f23, f24); + this.light[vertexTranslations.vert3] = this.getVertexBrightness(i2, j2, k2, l2, f25, f26, f27, f28); + } + else + { + this.light[vertexTranslations.vert0] = this.getAoBrightness(l, i, j1, i3); + this.light[vertexTranslations.vert1] = this.getAoBrightness(k, i, i1, i3); + this.light[vertexTranslations.vert2] = this.getAoBrightness(k, j, k1, i3); + this.light[vertexTranslations.vert3] = this.getAoBrightness(l, j, l1, i3); + this.brightness[vertexTranslations.vert0] = b1; + this.brightness[vertexTranslations.vert1] = b2; + this.brightness[vertexTranslations.vert2] = b3; + this.brightness[vertexTranslations.vert3] = b4; + } + + float b = world.getBrightness(direction, hasShade); + + for (int index = 0; index < this.brightness.length; ++index) + { + this.brightness[index] *= b; + } + } + + /** + * Get ambient occlusion brightness + */ + private int getAoBrightness(int br1, int br2, int br3, int br4) + { + if (br1 == 0) + { + br1 = br4; + } + + if (br2 == 0) + { + br2 = br4; + } + + if (br3 == 0) + { + br3 = br4; + } + + return br1 + br2 + br3 + br4 >> 2 & 16711935; + } + + private int getVertexBrightness(int p_178203_1_, int p_178203_2_, int p_178203_3_, int p_178203_4_, float p_178203_5_, float p_178203_6_, float p_178203_7_, float p_178203_8_) + { + int i = (int) ((float) (p_178203_1_ >> 16 & 255) * p_178203_5_ + (float) (p_178203_2_ >> 16 & 255) * p_178203_6_ + (float) (p_178203_3_ >> 16 & 255) * p_178203_7_ + (float) (p_178203_4_ >> 16 & 255) * p_178203_8_) & 255; + int j = (int) ((float) (p_178203_1_ & 255) * p_178203_5_ + (float) (p_178203_2_ & 255) * p_178203_6_ + (float) (p_178203_3_ & 255) * p_178203_7_ + (float) (p_178203_4_ & 255) * p_178203_8_) & 255; + return i << 16 | j; + } + + public enum EnumNeighborInfo + { + DOWN(new Direction[]{Direction.WEST, Direction.EAST, Direction.NORTH, Direction.SOUTH}, 0.5F, true, new Orientation[]{Orientation.FLIP_WEST, Orientation.SOUTH, Orientation.FLIP_WEST, Orientation.FLIP_SOUTH, Orientation.WEST, Orientation.FLIP_SOUTH, Orientation.WEST, Orientation.SOUTH}, new Orientation[]{Orientation.FLIP_WEST, Orientation.NORTH, Orientation.FLIP_WEST, Orientation.FLIP_NORTH, Orientation.WEST, Orientation.FLIP_NORTH, Orientation.WEST, Orientation.NORTH}, new Orientation[]{Orientation.FLIP_EAST, Orientation.NORTH, Orientation.FLIP_EAST, Orientation.FLIP_NORTH, Orientation.EAST, Orientation.FLIP_NORTH, Orientation.EAST, Orientation.NORTH}, new Orientation[]{Orientation.FLIP_EAST, Orientation.SOUTH, Orientation.FLIP_EAST, Orientation.FLIP_SOUTH, Orientation.EAST, Orientation.FLIP_SOUTH, Orientation.EAST, Orientation.SOUTH}), + UP(new Direction[]{Direction.EAST, Direction.WEST, Direction.NORTH, Direction.SOUTH}, 1.0F, true, new Orientation[]{Orientation.EAST, Orientation.SOUTH, Orientation.EAST, Orientation.FLIP_SOUTH, Orientation.FLIP_EAST, Orientation.FLIP_SOUTH, Orientation.FLIP_EAST, Orientation.SOUTH}, new Orientation[]{Orientation.EAST, Orientation.NORTH, Orientation.EAST, Orientation.FLIP_NORTH, Orientation.FLIP_EAST, Orientation.FLIP_NORTH, Orientation.FLIP_EAST, Orientation.NORTH}, new Orientation[]{Orientation.WEST, Orientation.NORTH, Orientation.WEST, Orientation.FLIP_NORTH, Orientation.FLIP_WEST, Orientation.FLIP_NORTH, Orientation.FLIP_WEST, Orientation.NORTH}, new Orientation[]{Orientation.WEST, Orientation.SOUTH, Orientation.WEST, Orientation.FLIP_SOUTH, Orientation.FLIP_WEST, Orientation.FLIP_SOUTH, Orientation.FLIP_WEST, Orientation.SOUTH}), + NORTH(new Direction[]{Direction.UP, Direction.DOWN, Direction.EAST, Direction.WEST}, 0.8F, true, new Orientation[]{Orientation.UP, Orientation.FLIP_WEST, Orientation.UP, Orientation.WEST, Orientation.FLIP_UP, Orientation.WEST, Orientation.FLIP_UP, Orientation.FLIP_WEST}, new Orientation[]{Orientation.UP, Orientation.FLIP_EAST, Orientation.UP, Orientation.EAST, Orientation.FLIP_UP, Orientation.EAST, Orientation.FLIP_UP, Orientation.FLIP_EAST}, new Orientation[]{Orientation.DOWN, Orientation.FLIP_EAST, Orientation.DOWN, Orientation.EAST, Orientation.FLIP_DOWN, Orientation.EAST, Orientation.FLIP_DOWN, Orientation.FLIP_EAST}, new Orientation[]{Orientation.DOWN, Orientation.FLIP_WEST, Orientation.DOWN, Orientation.WEST, Orientation.FLIP_DOWN, Orientation.WEST, Orientation.FLIP_DOWN, Orientation.FLIP_WEST}), + SOUTH(new Direction[]{Direction.WEST, Direction.EAST, Direction.DOWN, Direction.UP}, 0.8F, true, new Orientation[]{Orientation.UP, Orientation.FLIP_WEST, Orientation.FLIP_UP, Orientation.FLIP_WEST, Orientation.FLIP_UP, Orientation.WEST, Orientation.UP, Orientation.WEST}, new Orientation[]{Orientation.DOWN, Orientation.FLIP_WEST, Orientation.FLIP_DOWN, Orientation.FLIP_WEST, Orientation.FLIP_DOWN, Orientation.WEST, Orientation.DOWN, Orientation.WEST}, new Orientation[]{Orientation.DOWN, Orientation.FLIP_EAST, Orientation.FLIP_DOWN, Orientation.FLIP_EAST, Orientation.FLIP_DOWN, Orientation.EAST, Orientation.DOWN, Orientation.EAST}, new Orientation[]{Orientation.UP, Orientation.FLIP_EAST, Orientation.FLIP_UP, Orientation.FLIP_EAST, Orientation.FLIP_UP, Orientation.EAST, Orientation.UP, Orientation.EAST}), + WEST(new Direction[]{Direction.UP, Direction.DOWN, Direction.NORTH, Direction.SOUTH}, 0.6F, true, new Orientation[]{Orientation.UP, Orientation.SOUTH, Orientation.UP, Orientation.FLIP_SOUTH, Orientation.FLIP_UP, Orientation.FLIP_SOUTH, Orientation.FLIP_UP, Orientation.SOUTH}, new Orientation[]{Orientation.UP, Orientation.NORTH, Orientation.UP, Orientation.FLIP_NORTH, Orientation.FLIP_UP, Orientation.FLIP_NORTH, Orientation.FLIP_UP, Orientation.NORTH}, new Orientation[]{Orientation.DOWN, Orientation.NORTH, Orientation.DOWN, Orientation.FLIP_NORTH, Orientation.FLIP_DOWN, Orientation.FLIP_NORTH, Orientation.FLIP_DOWN, Orientation.NORTH}, new Orientation[]{Orientation.DOWN, Orientation.SOUTH, Orientation.DOWN, Orientation.FLIP_SOUTH, Orientation.FLIP_DOWN, Orientation.FLIP_SOUTH, Orientation.FLIP_DOWN, Orientation.SOUTH}), + EAST(new Direction[]{Direction.DOWN, Direction.UP, Direction.NORTH, Direction.SOUTH}, 0.6F, true, new Orientation[]{Orientation.FLIP_DOWN, Orientation.SOUTH, Orientation.FLIP_DOWN, Orientation.FLIP_SOUTH, Orientation.DOWN, Orientation.FLIP_SOUTH, Orientation.DOWN, Orientation.SOUTH}, new Orientation[]{Orientation.FLIP_DOWN, Orientation.NORTH, Orientation.FLIP_DOWN, Orientation.FLIP_NORTH, Orientation.DOWN, Orientation.FLIP_NORTH, Orientation.DOWN, Orientation.NORTH}, new Orientation[]{Orientation.FLIP_UP, Orientation.NORTH, Orientation.FLIP_UP, Orientation.FLIP_NORTH, Orientation.UP, Orientation.FLIP_NORTH, Orientation.UP, Orientation.NORTH}, new Orientation[]{Orientation.FLIP_UP, Orientation.SOUTH, Orientation.FLIP_UP, Orientation.FLIP_SOUTH, Orientation.UP, Orientation.FLIP_SOUTH, Orientation.UP, Orientation.SOUTH}); + + //private final Direction[] corners; + //private final float shadeWeight; + private final boolean doNonCubicWeight; + private final Orientation[] vert0Weights; + private final Orientation[] vert1Weights; + private final Orientation[] vert2Weights; + private final Orientation[] vert3Weights; + private static final EnumNeighborInfo[] VALUES = new EnumNeighborInfo[6]; + + EnumNeighborInfo(Direction[] p_i46236_3_, float p_i46236_4_, boolean p_i46236_5_, Orientation[] p_i46236_6_, Orientation[] p_i46236_7_, Orientation[] p_i46236_8_, Orientation[] p_i46236_9_) + { + //this.corners = p_i46236_3_; + //this.shadeWeight = p_i46236_4_; + this.doNonCubicWeight = p_i46236_5_; + this.vert0Weights = p_i46236_6_; + this.vert1Weights = p_i46236_7_; + this.vert2Weights = p_i46236_8_; + this.vert3Weights = p_i46236_9_; + } + + public static EnumNeighborInfo getNeighbourInfo(Direction p_178273_0_) + { + return VALUES[p_178273_0_.getId()]; + } + + static + { + VALUES[Direction.DOWN.getId()] = DOWN; + VALUES[Direction.UP.getId()] = UP; + VALUES[Direction.NORTH.getId()] = NORTH; + VALUES[Direction.SOUTH.getId()] = SOUTH; + VALUES[Direction.WEST.getId()] = WEST; + VALUES[Direction.EAST.getId()] = EAST; + } + } + + public enum Orientation + { + DOWN(Direction.DOWN, false), + UP(Direction.UP, false), + NORTH(Direction.NORTH, false), + SOUTH(Direction.SOUTH, false), + WEST(Direction.WEST, false), + EAST(Direction.EAST, false), + FLIP_DOWN(Direction.DOWN, true), + FLIP_UP(Direction.UP, true), + FLIP_NORTH(Direction.NORTH, true), + FLIP_SOUTH(Direction.SOUTH, true), + FLIP_WEST(Direction.WEST, true), + FLIP_EAST(Direction.EAST, true); + + private final int shape; + + Orientation(Direction p_i46233_3_, boolean p_i46233_4_) + { + this.shape = p_i46233_3_.getId() + (p_i46233_4_ ? Direction.values().length : 0); + } + } + + enum VertexTranslations + { + DOWN(0, 1, 2, 3), + UP(2, 3, 0, 1), + NORTH(3, 0, 1, 2), + SOUTH(0, 1, 2, 3), + WEST(3, 0, 1, 2), + EAST(1, 2, 3, 0); + + private final int vert0; + private final int vert1; + private final int vert2; + private final int vert3; + private static final VertexTranslations[] VALUES = new VertexTranslations[6]; + + VertexTranslations(int p_i46234_3_, int p_i46234_4_, int p_i46234_5_, int p_i46234_6_) + { + this.vert0 = p_i46234_3_; + this.vert1 = p_i46234_4_; + this.vert2 = p_i46234_5_; + this.vert3 = p_i46234_6_; + } + + public static VertexTranslations getVertexTranslations(Direction p_178184_0_) + { + return VALUES[p_178184_0_.getId()]; + } + + static + { + VALUES[Direction.DOWN.getId()] = DOWN; + VALUES[Direction.UP.getId()] = UP; + VALUES[Direction.NORTH.getId()] = NORTH; + VALUES[Direction.SOUTH.getId()] = SOUTH; + VALUES[Direction.WEST.getId()] = WEST; + VALUES[Direction.EAST.getId()] = EAST; + } + } +} \ No newline at end of file diff --git a/src/main/java/fi/dy/masa/litematica/render/schematic/ao/AOProcessorModern.java b/src/main/java/fi/dy/masa/litematica/render/schematic/ao/AOProcessorModern.java new file mode 100644 index 0000000000..105c74753d --- /dev/null +++ b/src/main/java/fi/dy/masa/litematica/render/schematic/ao/AOProcessorModern.java @@ -0,0 +1,408 @@ +package fi.dy.masa.litematica.render.schematic.ao; + +import java.util.BitSet; +import it.unimi.dsi.fastutil.longs.Long2FloatLinkedOpenHashMap; +import it.unimi.dsi.fastutil.longs.Long2IntLinkedOpenHashMap; + +import net.minecraft.block.BlockState; +import net.minecraft.client.render.WorldRenderer; +import net.minecraft.util.Util; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.BlockRenderView; + +import fi.dy.masa.litematica.render.schematic.BlockModelRendererSchematic; + +public class AOProcessorModern extends AOProcessor +{ + private static final Direction[] DIRECTIONS = Direction.values(); + + @Override + public void apply(BlockRenderView world, BlockState state, BlockPos pos, Direction direction, float[] box, BitSet shapeState, boolean hasShade) + { + // 24w36a + BlockPos blockPos = shapeState.get(0) ? pos.offset(direction) : pos; + ND neighborData = ND.getData(direction); + BlockPos.Mutable mutable = new BlockPos.Mutable(); + BC brightnessCache = BlockModelRendererSchematic.CACHE.get(); + mutable.set(blockPos, neighborData.faces[0]); + BlockState blockState = world.getBlockState(mutable); + int i = brightnessCache.getInt(blockState, world, mutable); + float f = brightnessCache.getFloat(blockState, world, mutable); + mutable.set(blockPos, neighborData.faces[1]); + BlockState blockState2 = world.getBlockState(mutable); + int j = brightnessCache.getInt(blockState2, world, mutable); + float g = brightnessCache.getFloat(blockState2, world, mutable); + mutable.set(blockPos, neighborData.faces[2]); + BlockState blockState3 = world.getBlockState(mutable); + int k = brightnessCache.getInt(blockState3, world, mutable); + float h = brightnessCache.getFloat(blockState3, world, mutable); + mutable.set(blockPos, neighborData.faces[3]); + BlockState blockState4 = world.getBlockState(mutable); + int l = brightnessCache.getInt(blockState4, world, mutable); + float m = brightnessCache.getFloat(blockState4, world, mutable); + BlockState blockState5 = world.getBlockState(mutable.set(blockPos, neighborData.faces[0]).move(direction)); + boolean bl2 = !blockState5.shouldBlockVision(world, mutable) || blockState5.getOpacity() == 0; + BlockState blockState6 = world.getBlockState(mutable.set(blockPos, neighborData.faces[1]).move(direction)); + boolean bl3 = !blockState6.shouldBlockVision(world, mutable) || blockState6.getOpacity() == 0; + BlockState blockState7 = world.getBlockState(mutable.set(blockPos, neighborData.faces[2]).move(direction)); + boolean bl4 = !blockState7.shouldBlockVision(world, mutable) || blockState7.getOpacity() == 0; + BlockState blockState8 = world.getBlockState(mutable.set(blockPos, neighborData.faces[3]).move(direction)); + boolean bl5 = !blockState8.shouldBlockVision(world, mutable) || blockState8.getOpacity() == 0; + float n; + int o; + BlockState blockState9; + if (!bl4 && !bl2) + { + n = f; + o = i; + } + else + { + mutable.set(blockPos, neighborData.faces[0]).move(neighborData.faces[2]); + blockState9 = world.getBlockState(mutable); + n = brightnessCache.getFloat(blockState9, world, mutable); + o = brightnessCache.getInt(blockState9, world, mutable); + } + + float p; + int q; + if (!bl5 && !bl2) + { + p = f; + q = i; + } + else + { + mutable.set(blockPos, neighborData.faces[0]).move(neighborData.faces[3]); + blockState9 = world.getBlockState(mutable); + p = brightnessCache.getFloat(blockState9, world, mutable); + q = brightnessCache.getInt(blockState9, world, mutable); + } + + float r; + int s; + if (!bl4 && !bl3) + { + r = f; + s = i; + } + else + { + mutable.set(blockPos, neighborData.faces[1]).move(neighborData.faces[2]); + blockState9 = world.getBlockState(mutable); + r = brightnessCache.getFloat(blockState9, world, mutable); + s = brightnessCache.getInt(blockState9, world, mutable); + } + + float t; + int u; + if (!bl5 && !bl3) + { + t = f; + u = i; + } + else + { + mutable.set(blockPos, neighborData.faces[1]).move(neighborData.faces[3]); + blockState9 = world.getBlockState(mutable); + t = brightnessCache.getFloat(blockState9, world, mutable); + u = brightnessCache.getInt(blockState9, world, mutable); + } + + int v = brightnessCache.getInt(state, world, pos); + mutable.set(pos, direction); + BlockState blockState10 = world.getBlockState(mutable); + if (shapeState.get(0) || !blockState10.isOpaqueFullCube()) + { + v = brightnessCache.getInt(blockState10, world, mutable); + } + + float w = shapeState.get(0) ? brightnessCache.getFloat(world.getBlockState(blockPos), world, blockPos) : brightnessCache.getFloat(world.getBlockState(pos), world, pos); + Tl translation = Tl.getTranslations(direction); + float x; + float y; + float z; + float aa; + if (shapeState.get(1) && neighborData.nonCubicWeight) + { + x = (m + f + p + w) * 0.25F; + y = (h + f + n + w) * 0.25F; + z = (h + g + r + w) * 0.25F; + aa = (m + g + t + w) * 0.25F; + float ab = box[neighborData.field_4192[0].shape] * box[neighborData.field_4192[1].shape]; + float ac = box[neighborData.field_4192[2].shape] * box[neighborData.field_4192[3].shape]; + float ad = box[neighborData.field_4192[4].shape] * box[neighborData.field_4192[5].shape]; + float ae = box[neighborData.field_4192[6].shape] * box[neighborData.field_4192[7].shape]; + float af = box[neighborData.field_4185[0].shape] * box[neighborData.field_4185[1].shape]; + float ag = box[neighborData.field_4185[2].shape] * box[neighborData.field_4185[3].shape]; + float ah = box[neighborData.field_4185[4].shape] * box[neighborData.field_4185[5].shape]; + float ai = box[neighborData.field_4185[6].shape] * box[neighborData.field_4185[7].shape]; + float aj = box[neighborData.field_4180[0].shape] * box[neighborData.field_4180[1].shape]; + float ak = box[neighborData.field_4180[2].shape] * box[neighborData.field_4180[3].shape]; + float al = box[neighborData.field_4180[4].shape] * box[neighborData.field_4180[5].shape]; + float am = box[neighborData.field_4180[6].shape] * box[neighborData.field_4180[7].shape]; + float an = box[neighborData.field_4188[0].shape] * box[neighborData.field_4188[1].shape]; + float ao = box[neighborData.field_4188[2].shape] * box[neighborData.field_4188[3].shape]; + float ap = box[neighborData.field_4188[4].shape] * box[neighborData.field_4188[5].shape]; + float aq = box[neighborData.field_4188[6].shape] * box[neighborData.field_4188[7].shape]; + this.brightness[translation.firstCorner] = Math.clamp(x * ab + y * ac + z * ad + aa * ae, 0.0F, 1.0F); + this.brightness[translation.secondCorner] = Math.clamp(x * af + y * ag + z * ah + aa * ai, 0.0F, 1.0F); + this.brightness[translation.thirdCorner] = Math.clamp(x * aj + y * ak + z * al + aa * am, 0.0F, 1.0F); + this.brightness[translation.fourthCorner] = Math.clamp(x * an + y * ao + z * ap + aa * aq, 0.0F, 1.0F); + int ar = this.getAmbientOcclusionBrightness(l, i, q, v); + int as = this.getAmbientOcclusionBrightness(k, i, o, v); + int at = this.getAmbientOcclusionBrightness(k, j, s, v); + int au = this.getAmbientOcclusionBrightness(l, j, u, v); + this.light[translation.firstCorner] = this.getBrightness(ar, as, at, au, ab, ac, ad, ae); + this.light[translation.secondCorner] = this.getBrightness(ar, as, at, au, af, ag, ah, ai); + this.light[translation.thirdCorner] = this.getBrightness(ar, as, at, au, aj, ak, al, am); + this.light[translation.fourthCorner] = this.getBrightness(ar, as, at, au, an, ao, ap, aq); + } + else + { + x = (m + f + p + w) * 0.25F; + y = (h + f + n + w) * 0.25F; + z = (h + g + r + w) * 0.25F; + aa = (m + g + t + w) * 0.25F; + this.light[translation.firstCorner] = this.getAmbientOcclusionBrightness(l, i, q, v); + this.light[translation.secondCorner] = this.getAmbientOcclusionBrightness(k, i, o, v); + this.light[translation.thirdCorner] = this.getAmbientOcclusionBrightness(k, j, s, v); + this.light[translation.fourthCorner] = this.getAmbientOcclusionBrightness(l, j, u, v); + this.brightness[translation.firstCorner] = x; + this.brightness[translation.secondCorner] = y; + this.brightness[translation.thirdCorner] = z; + this.brightness[translation.fourthCorner] = aa; + } + + x = world.getBrightness(direction, hasShade); + + for (int av = 0; av < this.brightness.length; ++av) + { + this.brightness[av] *= x; + } + } + + private int getAmbientOcclusionBrightness(int i, int j, int k, int l) + { + if (i == 0) + { + i = l; + } + + if (j == 0) + { + j = l; + } + + if (k == 0) + { + k = l; + } + + return i + j + k + l >> 2 & 16711935; + } + + private int getBrightness(int i, int j, int k, int l, float f, float g, float h, float m) + { + int n = (int) ((float) (i >> 16 & 255) * f + (float) (j >> 16 & 255) * g + (float) (k >> 16 & 255) * h + (float) (l >> 16 & 255) * m) & 255; + int o = (int) ((float) (i & 255) * f + (float) (j & 255) * g + (float) (k & 255) * h + (float) (l & 255) * m) & 255; + return n << 16 | o; + } + + public static class BC + { + private boolean enabled; + private final Long2IntLinkedOpenHashMap intCache = Util.make(() -> + { + Long2IntLinkedOpenHashMap long2IntLinkedOpenHashMap = new Long2IntLinkedOpenHashMap(100, 0.25F) + { + protected void rehash(int newN) + { + } + }; + long2IntLinkedOpenHashMap.defaultReturnValue(Integer.MAX_VALUE); + return long2IntLinkedOpenHashMap; + }); + private final Long2FloatLinkedOpenHashMap floatCache = Util.make(() -> + { + Long2FloatLinkedOpenHashMap long2FloatLinkedOpenHashMap = new Long2FloatLinkedOpenHashMap(100, 0.25F) + { + protected void rehash(int newN) + { + } + }; + long2FloatLinkedOpenHashMap.defaultReturnValue(Float.NaN); + return long2FloatLinkedOpenHashMap; + }); + + public BC() { } + + public void enable() + { + this.enabled = true; + } + + public void disable() + { + this.enabled = false; + this.intCache.clear(); + this.floatCache.clear(); + } + + public int getInt(BlockState state, BlockRenderView world, BlockPos pos) + { + long l = pos.asLong(); + int i; + if (this.enabled) + { + i = this.intCache.get(l); + if (i != Integer.MAX_VALUE) + { + return i; + } + } + + i = WorldRenderer.getLightmapCoordinates(world, state, pos); + if (this.enabled) + { + if (this.intCache.size() == 100) + { + this.intCache.removeFirstInt(); + } + + this.intCache.put(l, i); + } + + return i; + } + + public float getFloat(BlockState state, BlockRenderView blockView, BlockPos pos) + { + long l = pos.asLong(); + float f; + if (this.enabled) + { + f = this.floatCache.get(l); + if (!Float.isNaN(f)) + { + return f; + } + } + + f = state.getAmbientOcclusionLightLevel(blockView, pos); + if (this.enabled) + { + if (this.floatCache.size() == 100) + { + this.floatCache.removeFirstFloat(); + } + + this.floatCache.put(l, f); + } + + return f; + } + } + + protected enum ND + { + DOWN(new Direction[]{Direction.WEST, Direction.EAST, Direction.NORTH, Direction.SOUTH}, 0.5F, true, new NO[]{NO.FLIP_WEST, NO.SOUTH, NO.FLIP_WEST, NO.FLIP_SOUTH, NO.WEST, NO.FLIP_SOUTH, NO.WEST, NO.SOUTH}, new NO[]{NO.FLIP_WEST, NO.NORTH, NO.FLIP_WEST, NO.FLIP_NORTH, NO.WEST, NO.FLIP_NORTH, NO.WEST, NO.NORTH}, new NO[]{NO.FLIP_EAST, NO.NORTH, NO.FLIP_EAST, NO.FLIP_NORTH, NO.EAST, NO.FLIP_NORTH, NO.EAST, NO.NORTH}, new NO[]{NO.FLIP_EAST, NO.SOUTH, NO.FLIP_EAST, NO.FLIP_SOUTH, NO.EAST, NO.FLIP_SOUTH, NO.EAST, NO.SOUTH}), + UP(new Direction[]{Direction.EAST, Direction.WEST, Direction.NORTH, Direction.SOUTH}, 1.0F, true, new NO[]{NO.EAST, NO.SOUTH, NO.EAST, NO.FLIP_SOUTH, NO.FLIP_EAST, NO.FLIP_SOUTH, NO.FLIP_EAST, NO.SOUTH}, new NO[]{NO.EAST, NO.NORTH, NO.EAST, NO.FLIP_NORTH, NO.FLIP_EAST, NO.FLIP_NORTH, NO.FLIP_EAST, NO.NORTH}, new NO[]{NO.WEST, NO.NORTH, NO.WEST, NO.FLIP_NORTH, NO.FLIP_WEST, NO.FLIP_NORTH, NO.FLIP_WEST, NO.NORTH}, new NO[]{NO.WEST, NO.SOUTH, NO.WEST, NO.FLIP_SOUTH, NO.FLIP_WEST, NO.FLIP_SOUTH, NO.FLIP_WEST, NO.SOUTH}), + NORTH(new Direction[]{Direction.UP, Direction.DOWN, Direction.EAST, Direction.WEST}, 0.8F, true, new NO[]{NO.UP, NO.FLIP_WEST, NO.UP, NO.WEST, NO.FLIP_UP, NO.WEST, NO.FLIP_UP, NO.FLIP_WEST}, new NO[]{NO.UP, NO.FLIP_EAST, NO.UP, NO.EAST, NO.FLIP_UP, NO.EAST, NO.FLIP_UP, NO.FLIP_EAST}, new NO[]{NO.DOWN, NO.FLIP_EAST, NO.DOWN, NO.EAST, NO.FLIP_DOWN, NO.EAST, NO.FLIP_DOWN, NO.FLIP_EAST}, new NO[]{NO.DOWN, NO.FLIP_WEST, NO.DOWN, NO.WEST, NO.FLIP_DOWN, NO.WEST, NO.FLIP_DOWN, NO.FLIP_WEST}), + SOUTH(new Direction[]{Direction.WEST, Direction.EAST, Direction.DOWN, Direction.UP}, 0.8F, true, new NO[]{NO.UP, NO.FLIP_WEST, NO.FLIP_UP, NO.FLIP_WEST, NO.FLIP_UP, NO.WEST, NO.UP, NO.WEST}, new NO[]{NO.DOWN, NO.FLIP_WEST, NO.FLIP_DOWN, NO.FLIP_WEST, NO.FLIP_DOWN, NO.WEST, NO.DOWN, NO.WEST}, new NO[]{NO.DOWN, NO.FLIP_EAST, NO.FLIP_DOWN, NO.FLIP_EAST, NO.FLIP_DOWN, NO.EAST, NO.DOWN, NO.EAST}, new NO[]{NO.UP, NO.FLIP_EAST, NO.FLIP_UP, NO.FLIP_EAST, NO.FLIP_UP, NO.EAST, NO.UP, NO.EAST}), + WEST(new Direction[]{Direction.UP, Direction.DOWN, Direction.NORTH, Direction.SOUTH}, 0.6F, true, new NO[]{NO.UP, NO.SOUTH, NO.UP, NO.FLIP_SOUTH, NO.FLIP_UP, NO.FLIP_SOUTH, NO.FLIP_UP, NO.SOUTH}, new NO[]{NO.UP, NO.NORTH, NO.UP, NO.FLIP_NORTH, NO.FLIP_UP, NO.FLIP_NORTH, NO.FLIP_UP, NO.NORTH}, new NO[]{NO.DOWN, NO.NORTH, NO.DOWN, NO.FLIP_NORTH, NO.FLIP_DOWN, NO.FLIP_NORTH, NO.FLIP_DOWN, NO.NORTH}, new NO[]{NO.DOWN, NO.SOUTH, NO.DOWN, NO.FLIP_SOUTH, NO.FLIP_DOWN, NO.FLIP_SOUTH, NO.FLIP_DOWN, NO.SOUTH}), + EAST(new Direction[]{Direction.DOWN, Direction.UP, Direction.NORTH, Direction.SOUTH}, 0.6F, true, new NO[]{NO.FLIP_DOWN, NO.SOUTH, NO.FLIP_DOWN, NO.FLIP_SOUTH, NO.DOWN, NO.FLIP_SOUTH, NO.DOWN, NO.SOUTH}, new NO[]{NO.FLIP_DOWN, NO.NORTH, NO.FLIP_DOWN, NO.FLIP_NORTH, NO.DOWN, NO.FLIP_NORTH, NO.DOWN, NO.NORTH}, new NO[]{NO.FLIP_UP, NO.NORTH, NO.FLIP_UP, NO.FLIP_NORTH, NO.UP, NO.FLIP_NORTH, NO.UP, NO.NORTH}, new NO[]{NO.FLIP_UP, NO.SOUTH, NO.FLIP_UP, NO.FLIP_SOUTH, NO.UP, NO.FLIP_SOUTH, NO.UP, NO.SOUTH}); + + final Direction[] faces; + final boolean nonCubicWeight; + final NO[] field_4192; + final NO[] field_4185; + final NO[] field_4180; + final NO[] field_4188; + private static final ND[] VALUES = Util.make(new ND[6], (values) -> + { + values[Direction.DOWN.getId()] = DOWN; + values[Direction.UP.getId()] = UP; + values[Direction.NORTH.getId()] = NORTH; + values[Direction.SOUTH.getId()] = SOUTH; + values[Direction.WEST.getId()] = WEST; + values[Direction.EAST.getId()] = EAST; + }); + + ND(final Direction[] faces, final float f, final boolean nonCubicWeight, final NO[] neighborOrientations, final NO[] neighborOrientations2, final NO[] neighborOrientations3, final NO[] neighborOrientations4) + { + this.faces = faces; + this.nonCubicWeight = nonCubicWeight; + this.field_4192 = neighborOrientations; + this.field_4185 = neighborOrientations2; + this.field_4180 = neighborOrientations3; + this.field_4188 = neighborOrientations4; + } + + public static ND getData(Direction direction) + { + return VALUES[direction.getId()]; + } + } + + protected enum NO + { + DOWN(Direction.DOWN, false), + UP(Direction.UP, false), + NORTH(Direction.NORTH, false), + SOUTH(Direction.SOUTH, false), + WEST(Direction.WEST, false), + EAST(Direction.EAST, false), + FLIP_DOWN(Direction.DOWN, true), + FLIP_UP(Direction.UP, true), + FLIP_NORTH(Direction.NORTH, true), + FLIP_SOUTH(Direction.SOUTH, true), + FLIP_WEST(Direction.WEST, true), + FLIP_EAST(Direction.EAST, true); + + final int shape; + + NO(final Direction direction, final boolean flip) + { + this.shape = direction.getId() + (flip ? DIRECTIONS.length : 0); + } + } + + private enum Tl + { + DOWN(0, 1, 2, 3), + UP(2, 3, 0, 1), + NORTH(3, 0, 1, 2), + SOUTH(0, 1, 2, 3), + WEST(3, 0, 1, 2), + EAST(1, 2, 3, 0); + + final int firstCorner; + final int secondCorner; + final int thirdCorner; + final int fourthCorner; + private static final Tl[] VALUES = Util.make(new Tl[6], (values) -> + { + values[Direction.DOWN.getId()] = DOWN; + values[Direction.UP.getId()] = UP; + values[Direction.NORTH.getId()] = NORTH; + values[Direction.SOUTH.getId()] = SOUTH; + values[Direction.WEST.getId()] = WEST; + values[Direction.EAST.getId()] = EAST; + }); + + Tl(final int firstCorner, final int secondCorner, final int thirdCorner, final int fourthCorner) + { + this.firstCorner = firstCorner; + this.secondCorner = secondCorner; + this.thirdCorner = thirdCorner; + this.fourthCorner = fourthCorner; + } + + public static Tl getTranslations(Direction direction) + { + return VALUES[direction.getId()]; + } + } +} diff --git a/src/main/java/fi/dy/masa/litematica/util/InventoryUtils.java b/src/main/java/fi/dy/masa/litematica/util/InventoryUtils.java index 5c5cbc773a..ba023e32ea 100644 --- a/src/main/java/fi/dy/masa/litematica/util/InventoryUtils.java +++ b/src/main/java/fi/dy/masa/litematica/util/InventoryUtils.java @@ -342,6 +342,11 @@ public static int findSlotWithBoxWithItem(ScreenHandler container, ItemStack sta InventoryOverlay.Context ctx = getTargetInventoryFromBlock(world, pos, be, nbt); + if (world instanceof WorldSchematic) + { + return ctx; + } + if (lastBlockEntityContext != null && !lastBlockEntityContext.getLeft().equals(pos)) { lastBlockEntityContext = null; @@ -399,7 +404,7 @@ else if (lastBlockEntityContext != null && lastBlockEntityContext.getLeft().equa } } - //Litematica.logger.warn("getTarget():3: pos [{}], inv [{}], be [{}], nbt [{}]", pos.toShortString(), inv != null, be != null, nbt != null ? nbt.getString("id") : new NbtCompound()); + //Litematica.logger.warn("getTarget(): [SchematicWorld? {}] pos [{}], inv [{}], be [{}], nbt [{}]", world instanceof WorldSchematic ? "YES" : "NO", pos.toShortString(), inv != null, be != null, nbt != null ? nbt.getString("id") : new NbtCompound()); if (inv == null || nbt == null) { diff --git a/src/main/java/fi/dy/masa/litematica/world/FakeLightingProvider.java b/src/main/java/fi/dy/masa/litematica/world/FakeLightingProvider.java index 4f8b36c509..91dc3a9d82 100644 --- a/src/main/java/fi/dy/masa/litematica/world/FakeLightingProvider.java +++ b/src/main/java/fi/dy/masa/litematica/world/FakeLightingProvider.java @@ -34,6 +34,7 @@ public ChunkLightingView get(LightType type) public int getLight(BlockPos pos, int defaultValue) { return 15; + //return Configs.Visuals.RENDER_FAKE_LIGHTING_LEVEL != null ? Configs.Visuals.RENDER_FAKE_LIGHTING_LEVEL.getIntegerValue() : 15; } public static ChunkNibbleArray getChunkNibbleArray() { return chunkNibbleArray; } diff --git a/src/main/java/fi/dy/masa/litematica/world/WorldSchematic.java b/src/main/java/fi/dy/masa/litematica/world/WorldSchematic.java index cb72a6ffb8..f7313ded86 100644 --- a/src/main/java/fi/dy/masa/litematica/world/WorldSchematic.java +++ b/src/main/java/fi/dy/masa/litematica/world/WorldSchematic.java @@ -6,9 +6,6 @@ import java.util.function.Predicate; import javax.annotation.Nonnull; import com.google.common.collect.ImmutableList; - -import net.minecraft.entity.boss.dragon.EnderDragonPart; -import net.minecraft.recipe.RecipeManager; import org.jetbrains.annotations.Nullable; import net.minecraft.block.Block; @@ -17,6 +14,7 @@ import net.minecraft.client.render.DimensionEffects; import net.minecraft.component.type.MapIdComponent; import net.minecraft.entity.Entity; +import net.minecraft.entity.boss.dragon.EnderDragonPart; import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.fluid.Fluid; @@ -24,6 +22,7 @@ import net.minecraft.item.map.MapState; import net.minecraft.particle.ParticleEffect; import net.minecraft.recipe.BrewingRecipeRegistry; +import net.minecraft.recipe.RecipeManager; import net.minecraft.registry.DynamicRegistryManager; import net.minecraft.registry.RegistryEntryLookup; import net.minecraft.registry.RegistryKey; @@ -53,6 +52,7 @@ import net.minecraft.world.tick.QueryableTickScheduler; import net.minecraft.world.tick.TickManager; +import fi.dy.masa.malilib.util.WorldUtils; import fi.dy.masa.litematica.Reference; import fi.dy.masa.litematica.render.schematic.WorldRendererSchematic; @@ -75,7 +75,7 @@ public WorldSchematic(MutableWorldProperties properties, RegistryEntry dimension, @Nullable WorldRendererSchematic worldRenderer) { - super(properties, REGISTRY_KEY, !registryManager.equals(DynamicRegistryManager.EMPTY) ? registryManager : SchematicWorldHandler.INSTANCE.getRegistryManager(), dimension, false, false, 0L, 0); + super(properties, REGISTRY_KEY, !registryManager.equals(DynamicRegistryManager.EMPTY) ? registryManager : SchematicWorldHandler.INSTANCE.getRegistryManager(), dimension, true, false, 0L, 0); this.mc = MinecraftClient.getInstance(); if (this.mc == null || this.mc.world == null) @@ -104,15 +104,18 @@ private void setDimension(DynamicRegistryManager registryManager) if (this.dimensionType.equals(nether)) { - this.biome = this.getWastes(registryManager); + //this.biome = this.getWastes(registryManager); + this.biome = WorldUtils.getWastes(registryManager); } else if (this.dimensionType.equals(end)) { - this.biome = this.getTheEnd(registryManager); + //this.biome = this.getTheEnd(registryManager); + this.biome = WorldUtils.getTheEnd(registryManager); } else { - this.biome = this.getPlains(registryManager); + //this.biome = this.getPlains(registryManager); + this.biome = WorldUtils.getPlains(registryManager); } this.dimensionEffects = DimensionEffects.byDimensionType(this.dimensionType.value()); @@ -456,12 +459,14 @@ public float getBrightness(Direction direction, boolean shaded) @Override public int getLightLevel(LightType type, BlockPos pos) { + //return Configs.Visuals.RENDER_FAKE_LIGHTING_LEVEL != null ? Configs.Visuals.RENDER_FAKE_LIGHTING_LEVEL.getIntegerValue() : 15; return 15; } @Override public int getBaseLightLevel(BlockPos pos, int defaultValue) { + //return Configs.Visuals.RENDER_FAKE_LIGHTING_LEVEL != null ? Configs.Visuals.RENDER_FAKE_LIGHTING_LEVEL.getIntegerValue() : 15; return 15; } diff --git a/src/main/resources/assets/litematica/lang/en_us.json b/src/main/resources/assets/litematica/lang/en_us.json index cb40bd0223..4df802ae60 100644 --- a/src/main/resources/assets/litematica/lang/en_us.json +++ b/src/main/resources/assets/litematica/lang/en_us.json @@ -84,6 +84,7 @@ "litematica.config.visuals.name.ignoreExistingFluids": "ignoreExistingFluids", "litematica.config.visuals.name.overlayReducedInnerSides": "overlayReducedInnerSides", "litematica.config.visuals.name.placementBoxSideAlpha": "placementBoxSideAlpha", + "litematica.config.visuals.name.renderAOModernEnable": "renderAOModernEnable", "litematica.config.visuals.name.renderAreaSelectionBoxSides": "renderAreaSelectionBoxSides", "litematica.config.visuals.name.renderBlocksAsTranslucent": "renderBlocksAsTranslucent", "litematica.config.visuals.name.renderCollidingSchematicBlocks": "renderCollidingSchematicBlocks", @@ -306,6 +307,7 @@ "litematica.config.visuals.comment.ignoreExistingFluids": "If enabled, then any fluid blocks are ignored as \"extra blocks\"\nand as \"wrong blocks\", ie. where the schematic has air or other blocks.\nBasically this makes building stuff under water a whole lot less annoying.\nNote: You will most likely also want to enable the 'renderCollidingSchematicBlocks'\noption at the same time, to allow the blocks to get rendered inside fluids.", "litematica.config.visuals.comment.overlayReducedInnerSides": "If enabled, then the adjacent/touching inner sides\nfor the block overlays are removed/not rendered", "litematica.config.visuals.comment.placementBoxSideAlpha": "The alpha value of the sub-region boxes' side", + "litematica.config.visuals.comment.renderAOModernEnable": "Enables a new Ambient Occlusion Processor which should\nfix issues where shadows aren't being applied correctly,\nbut it can also cause Schematic Layers to have shadows\nfrom adjacent layers that can be distracting\nwhile your building.", "litematica.config.visuals.comment.renderAreaSelectionBoxSides": "If enabled, then the area selection boxes will\nhave their side quads rendered", "litematica.config.visuals.comment.renderBlocksAsTranslucent": "If enabled, then the schematics are rendered\nusing translucent \"ghost blocks\"", "litematica.config.visuals.comment.renderCollidingSchematicBlocks": "If enabled, then blocks in the schematics are rendered\nalso when there is already a (wrong) block in the client world.\nProbably mostly useful when trying to build\nsomething where there are snow layers or water in the way.", @@ -456,6 +458,7 @@ "litematica.config.visuals.prettyName.enableSchematicFluidRendering": "Schematic Fluid Rendering", "litematica.config.visuals.prettyName.enableSchematicOverlay": "Schematic Overlay Rendering", "litematica.config.visuals.prettyName.enableSchematicRendering": "Schematic Rendering", + "litematica.config.visuals.prettyName.renderAOModernEnable": "AO Modern Processor", "litematica.config.visuals.prettyName.renderBlocksAsTranslucent": "Translucent Schematic Block Rendering", "litematica.config.visuals.prettyName.schematicOverlayEnableOutlines": "Schematic Overlay Outlines", "litematica.config.visuals.prettyName.schematicOverlayEnableResorting": "Schematic Overlay Translucent Sorting", diff --git a/src/main/resources/assets/litematica/lang/it_it.json b/src/main/resources/assets/litematica/lang/it_it.json index 26b46d4de2..5f5a08bd82 100644 --- a/src/main/resources/assets/litematica/lang/it_it.json +++ b/src/main/resources/assets/litematica/lang/it_it.json @@ -83,6 +83,7 @@ "litematica.config.visuals.name.ignoreExistingFluids": "ignoraFluidiEsistenti", "litematica.config.visuals.name.overlayReducedInnerSides": "overlayLatiInterniRidotti", "litematica.config.visuals.name.placementBoxSideAlpha": "alphaLatiSceltePosizionamento", + "litematica.config.visuals.name.renderAOModernEnable": "renderAOModernEnable", "litematica.config.visuals.name.renderAreaSelectionBoxSides": "renderLatiScelteArea", "litematica.config.visuals.name.renderBlocksAsTranslucent": "renderBloccoComeTraslucido", "litematica.config.visuals.name.renderCollidingSchematicBlocks": "renderBlocchiSchematiciInCollisione", @@ -300,6 +301,7 @@ "litematica.config.visuals.comment.ignoreExistingFluids": "Se abilitato, tutti i blocchi di fluido vengono ignorati come \"blocchi extra\"\ne come \"blocchi sbagliati\", cioè dove lo schema ha aria o altri blocchi.\nFondamentalmente, questo rende la costruzione sotto acqua molto meno fastidiosa.\nNota: Probabilmente vorrai anche abilitare l'opzione 'renderCollidingSchematicBlocks'\nallo stesso tempo, per consentire ai blocchi di essere renderizzati all'interno dei fluidi.", "litematica.config.visuals.comment.overlayReducedInnerSides": "Se abilitato, i lati interni adiacenti/toccanti\nper le sovrapposizioni dei blocchi vengono rimossi/non renderizzati", "litematica.config.visuals.comment.placementBoxSideAlpha": "Il valore alpha dei lati delle scatole di sottoregione", + "litematica.config.visuals.comment.renderAOModernEnable": "Enables a new Ambient Occlusion Processor which should\nfix issues where shadows aren't being applied correctly,\nbut it can also cause Schematic Layers to have shadows\nfrom adjacent layers that can be distracting\nwhile your building.", "litematica.config.visuals.comment.renderAreaSelectionBoxSides": "Se abilitato, le scatole di selezione dell'area avranno\ni loro lati quadrati renderizzati", "litematica.config.visuals.comment.renderBlocksAsTranslucent": "Se abilitato, gli schemi vengono renderizzati\nutilizzando \"blocchi fantasma\" traslucidi", "litematica.config.visuals.comment.renderCollidingSchematicBlocks": "Se abilitato, i blocchi negli schemi vengono renderizzati\nanche quando c'è già un blocco (sbagliato) nel mondo del client.\nProbabilmente utile soprattutto quando si cerca di costruire\nqualcosa dove ci sono strati di neve o acqua nel mezzo.", @@ -445,6 +447,7 @@ "litematica.config.visuals.prettyName.enableSchematicFluidRendering": "Schematic Fluid Rendering", "litematica.config.visuals.prettyName.enableSchematicOverlay": "Rendering dell'Overlay dello Schema", "litematica.config.visuals.prettyName.enableSchematicRendering": "Rendering dello Schema", + "litematica.config.visuals.prettyName.renderAOModernEnable": "AO Modern Processor", "litematica.config.visuals.prettyName.renderBlocksAsTranslucent": "Rendering dei Blocchi dello Schema come Traslucidi", "litematica.config.visuals.prettyName.schematicOverlayEnableOutlines": "Contorni dell'Overlay dello Schema", "litematica.config.visuals.prettyName.schematicOverlayEnableResorting": "Ordinamento Traslucido dell'Overlay dello Schema", diff --git a/src/main/resources/assets/litematica/lang/ja_jp.json b/src/main/resources/assets/litematica/lang/ja_jp.json index d8f4a2cada..bcb71c880d 100644 --- a/src/main/resources/assets/litematica/lang/ja_jp.json +++ b/src/main/resources/assets/litematica/lang/ja_jp.json @@ -83,6 +83,7 @@ "litematica.config.visuals.name.ignoreExistingFluids": "ignoreExistingFluids", "litematica.config.visuals.name.overlayReducedInnerSides": "overlayReducedInnerSides", "litematica.config.visuals.name.placementBoxSideAlpha": "placementBoxSideAlpha", + "litematica.config.visuals.name.renderAOModernEnable": "renderAOModernEnable", "litematica.config.visuals.name.renderAreaSelectionBoxSides": "renderAreaSelectionBoxSides", "litematica.config.visuals.name.renderBlocksAsTranslucent": "renderBlocksAsTranslucent", "litematica.config.visuals.name.renderCollidingSchematicBlocks": "renderCollidingSchematicBlocks", @@ -300,6 +301,7 @@ "litematica.config.visuals.comment.ignoreExistingFluids": "If enabled, then any fluid blocks are ignored as \"extra blocks\"\nand as \"wrong blocks\", ie. where the schematic has air or other blocks.\nBasically this makes building stuff under water a whole lot less annoying.\nNote: You will most likely also want to enable the 'renderCollidingSchematicBlocks'\noption at the same time, to allow the blocks to get rendered inside fluids.", "litematica.config.visuals.comment.overlayReducedInnerSides": "If enabled, then the adjacent/touching inner sides\nfor the block overlays are removed/not rendered", "litematica.config.visuals.comment.placementBoxSideAlpha": "The alpha value of the sub-region boxes' side", + "litematica.config.visuals.comment.renderAOModernEnable": "Enables a new Ambient Occlusion Processor which should\nfix issues where shadows aren't being applied correctly,\nbut it can also cause Schematic Layers to have shadows\nfrom adjacent layers that can be distracting\nwhile your building.", "litematica.config.visuals.comment.renderAreaSelectionBoxSides": "If enabled, then the area selection boxes will\nhave their side quads rendered", "litematica.config.visuals.comment.renderBlocksAsTranslucent": "If enabled, then the schematics are rendered\nusing translucent \"ghost blocks\"", "litematica.config.visuals.comment.renderCollidingSchematicBlocks": "If enabled, then blocks in the schematics are rendered\nalso when there is already a (wrong) block in the client world.\nProbably mostly useful when trying to build\nsomething where there are snow layers or water in the way.", @@ -445,6 +447,7 @@ "litematica.config.visuals.prettyName.enableSchematicFluidRendering": "Schematic Fluid Rendering", "litematica.config.visuals.prettyName.enableSchematicOverlay": "Schematic Overlay Rendering", "litematica.config.visuals.prettyName.enableSchematicRendering": "Schematic Rendering", + "litematica.config.visuals.prettyName.renderAOModernEnable": "AO Modern Processor", "litematica.config.visuals.prettyName.renderBlocksAsTranslucent": "Translucent Schematic Block Rendering", "litematica.config.visuals.prettyName.schematicOverlayEnableOutlines": "Schematic Overlay Outlines", "litematica.config.visuals.prettyName.schematicOverlayEnableResorting": "Schematic Overlay Translucent Sorting", diff --git a/src/main/resources/assets/litematica/lang/uk_ua.json b/src/main/resources/assets/litematica/lang/uk_ua.json index d3719309aa..cee80710a7 100644 --- a/src/main/resources/assets/litematica/lang/uk_ua.json +++ b/src/main/resources/assets/litematica/lang/uk_ua.json @@ -1,96 +1,12 @@ { - "litematica.config.colors.comment.areaSelectionBoxSideColor": "Колір полів вибору області, коли вони не виділені", - "litematica.config.colors.comment.hightlightBlockInInventoryColor": "Колір підсвічування для блока, що переглядається", - "litematica.config.colors.comment.materialListHudItemCountsColor": "Колір тексту підрахунку предметів в інформаційному HUD списку матеріалів", - "litematica.config.colors.comment.schematicOverlayColorExtra": "Колір накладення блоків для додаткових блоків", - "litematica.config.colors.comment.schematicOverlayColorMissing": "Колір накладання блоків для відсутніх блоків", - "litematica.config.colors.comment.schematicOverlayColorWrongBlock": "Колір накладення блоків для неправильних блоків", - "litematica.config.colors.comment.schematicOverlayColorWrongState": "Колір накладання блоків для неправильних станів блоків", - "litematica.config.colors.comment.schematicRebuildBreakExceptPlaceOverlayColor": "Колір режиму перебудови схематики розбиває всі блоки, крім цільового накладання селектора", - "litematica.config.colors.comment.schematicRebuildBreakPlaceOverlayColor": "Колір накладення селектора розриву або розміщення блоків у режимі перебудови схематики", - "litematica.config.colors.comment.schematicRebuildReplaceOverlayColor": "Колір накладання селектора заміни в режимі перебудови схематики", - "litematica.config.colors.name.areaSelectionBoxSideColor": "areaSelectionBoxSideColor", - "litematica.config.colors.name.hightlightBlockInInventoryColor": "hightlightBlockInInventoryColor", - "litematica.config.colors.name.materialListHudItemCountsColor": "materialListHudItemCountsColor", - "litematica.config.colors.name.schematicOverlayColorExtra": "schematicOverlayColorExtra", - "litematica.config.colors.name.schematicOverlayColorMissing": "schematicOverlayColorMissing", - "litematica.config.colors.name.schematicOverlayColorWrongBlock": "schematicOverlayColorWrongBlock", - "litematica.config.colors.name.schematicOverlayColorWrongState": "schematicOverlayColorWrongState", - "litematica.config.colors.name.schematicRebuildBreakExceptPlaceOverlayColor": "schematicRebuildBreakExceptPlaceOverlayColor", - "litematica.config.colors.name.schematicRebuildBreakPlaceOverlayColor": "schematicRebuildBreakPlaceOverlayColor", - "litematica.config.colors.name.schematicRebuildReplaceOverlayColor": "schematicRebuildReplaceOverlayColor", - "litematica.config.generic.comment.areaSelectionsPerWorld": "Використовувати для вибору зони кореневі каталоги для кожного світу або сервера\n§6ПРИМІТКА: Не вимикайте це під час прямої трансляції, §6як тоді вибір області браузер відображатиме IP-адресу\nсервера §6у навігаційному віджеті, а також у поточній назві/шляху§6 доки ви знову не зміните поточний каталог і вибір", - "litematica.config.generic.comment.betterRenderOrder": "Якщо увімкнено, то відтворення схематики виконується шляхом введення іншого виклику відтворення в ванілльний код відтворення. Це має призвести до кращого прозорого відтворення/впорядкування блоків\nЯкщо промальовування не працює (наприклад, за допомогою Optifine), спробуйте вимкнути це", - "litematica.config.generic.comment.changeSelectedCornerOnMove": "Якщо «true», для вибраного кута виділеної області завжди встановлюється останній переміщений\nкут, якщо використовуються встановлені гарячі клавіші", - "litematica.config.generic.comment.cloneAtOriginalPosition": "Якщо увімкнено, використання гарячої клавіші «Вибрати клон» створить розташування\nу вихідній позиції вибору замість поточної позиції гравця", - "litematica.config.generic.comment.commandDisableFeedback": "Якщо увімкнено, зворотний зв’язок команд автоматично вимикається і потім знову вмикається для операцій\nвставки, заповнення та видалення (які використовують команди /setblock і /fill) за допомогою вимкнення,\nа потім повторне увімкнення правила гри sendCommandFeedback після завершення завдання", - "litematica.config.generic.comment.commandFillMaxVolume": "Максимальний розмір/об’єм кожного окремого куба, який можна заповнити за допомогою операцій/заповнити/видалити\nна основі команди. Більші області/об’єми буде розділено на декілька команд\nУсі області також спочатку розбиваються на блоки для блоків", - "litematica.config.generic.comment.commandFillNoChunkClamp": "Вимикає розподіл обсягів заповнення (у режимах заповнення, заміни та видалення) на блоки для блоків", - "litematica.config.generic.comment.commandLimitPerTick": "Максимальна кількість команд, надісланих за такт гри, під час використання функцій вставки, заповнення та видалення\nна сервері, де вони використовуватимуть команди setblock і fill\nЗверніть увагу, що функція вставки може перевищити це за допомогою кількох команд під час використання функції\nвідновлення NBT, яка потребує двох додаткових команд для кожного блоку", - "litematica.config.generic.comment.commandNameClone": "Назва команди clone, яка використовується під час функції творчого режиму на основі команд на серверах\nНаразі це використовується функцією «Вставити»,\nлише якщо встановлено поведінку відновлення NBT до «Розмістити та клонувати»", - "litematica.config.generic.comment.commandNameFill": "Назва команди fill для використання під час функції творчого режиму на основі команд на серверах", - "litematica.config.generic.comment.commandNameSetblock": "Назва команди setblock для використання під час використання функцій\nтворчого режиму на основі команд на серверах, а саме функції «Вставити схематику у світ»", - "litematica.config.generic.comment.commandNameSummon": "Назва команди виклику для використання під час використання функціональних можливостей\nтворчого режиму на основі команд на серверах, а саме функції «Вставити схематику у світ»", - "litematica.config.generic.comment.commandTaskInterval": "Інтервал у грі відмічає завдання вставки, заповнення та видалення. Параметр commandLimitPerTick встановлює\nмаксимальну кількість команд для надсилання на виконання,\nі це встановлює інтервал у тактах гри перед наступним виконанням", - "litematica.config.generic.comment.commandUseWorldEdit": "Якщо увімкнено, замість використання налаштованих команд setblock і fill використовуються команди World Edit //pos1,\n//pos2 і //set\nЗверніть увагу, що використання команд світу редагування приблизно в 3 рази повільніші, ніж використання\nванілльних команд, через обмеження команд на один такт,\nі МИ вимагаємо кілька команд на блок або область (//pos1 //pos2 //набір)\n§6ПОПЕРЕДЖЕННЯ: поведінка заміни вставлення НЕ ПРАЦЮВАТИМЕ, якщо використовується §6команди World Edit та\nзаповнення замість окремих команд setblock!\nТому рекомендується використовувати команди ванілли, якщо у вас є дозвіл на їх запуск\nЩе одна річ, яка може змусити вас віддати перевагу у деяких випадках МИ наказує,\nщо вони можуть запобігти блокуванню оновлень, якщо сервер не має моду Carpet і, отже,\nдоступне правило «/carpet fillUpdates fals»", - "litematica.config.generic.comment.customSchematicBaseDirectory": "Кореневий/базовий каталог схематики для використання, якщо «customSchematicBaseDirectoryEnabled» увімкнено", - "litematica.config.generic.comment.customSchematicBaseDirectoryEnabled": "Якщо увімкнено, то каталог, установлений у «customSchematicBaseDirectory» буде використано як кореневий/базовий\nкаталог схематики замість звичайного каталогу «.minecraft/schematics/»", - "litematica.config.generic.comment.datafixerDefaultSchema": "Значення за замовчуванням схематики для Vanilla Data Fixer\n\nВикористовується для налаштування найменшого можливого значення та значення, яке використовується,\nякщо завантажена схемптика не містить цієї інформації\n\n§6ПОПЕРЕДЖЕННЯ: це призначено для використання за вказівкою §6розробника Litematica, наприклад masa\n§6Якщо ви сумніваєтеся, збережіть усталене значення для Minecraft 1.12", - "litematica.config.generic.comment.datafixerMode": "Настроюваний рівень виправлення даних для застосування до завантажених схематик\nЦе може покращити продуктивність завантаження схематик шляхом обходу Vanilla Data Fixer, але це також може\nпризвести до серйозної втрати даних якщо він вимкнений", - "litematica.config.generic.comment.debugLogging": "Вмикає деякі повідомлення журналу налагодження в ігровій консолі для налагодження певних проблем або збоїв", - "litematica.config.generic.comment.easyPlaceClickAdjacent": "Використовувати код Clicks Adjacent з 1.12.2 або ні\nЛише якщо увімкнено §a«easyPlacePostRewrite»§r", - "litematica.config.generic.comment.easyPlaceFirst": "Це призводить до того, що режим «Легке розміщення» розміщує перший/найближчий блок, на який ви дивитесь,\nзамість найдальшого/найнижчого блоку\n«false» дозволяє вам розмістити кілька шарів «одночасно», оскільки найдальші блоки будуть розміщені до того,\nяк ближчіблокуватимуть лінію видимості", - "litematica.config.generic.comment.easyPlaceHoldEnabled": "Якщо увімкнено, ви можете утримувати клавішу використання і дивитися на різні блоки схематик, щоб розмістити їх,\nбез необхідності натискати кожен блок окремо", - "litematica.config.generic.comment.easyPlaceMode": "Якщо увімкнено, тоді проста спроба використати інструмент/розмістити блоки схематик розмістять цей блок у цій позиції", - "litematica.config.generic.comment.easyPlacePostRewrite": "Якщо увімкнено, режим легкого розміщення використовується\n\nКод «Перепис допису» з ornithe 1.12.2\n§6ПОПЕРЕДЖЕННЯ: ЦЕ ЕКСПЕРИМЕНТ", - "litematica.config.generic.comment.easyPlaceProtocolVersion": "Тип «протоколу точного розміщення», потрібно використовувати\n- Авто: використовується версія 3 в грі наодинці, за замовчуванням — плити лише у багатокористувацькій грі, якщо на\nсервері не встановлено мод Carpet, який надсилає «carpet:hello» пакет, у цьому випадку на цьому сервері\nвикористовується v2\n- Версія 3: підтримується лише самою Litematica (в грі наодинці) або з Servux\n- Версія 2: сумісна з серверами з модом Carpet (або QuickCarpet від skyrising і DeadlyMC, або CarpetExtra\nна додаток до FabricCarpet\n І в обох випадках правило Carpet «accurateBlockPlacement» має бути увімкнено на сервері)\n- Лише плити: виправляє лише плити у верхній позиції. Сумісний із серверами Paper\n- Нічого: не модмфікувати координати", - "litematica.config.generic.comment.easyPlaceSinglePlayerHandling": "Якщо увімкнено, то Litematica обробляє так званий «Carpet mod Accurate Block Placement Protocol» сама в грі наодинці\nРекомендується залишати його увімкненим, якщо ви, не збираєтеся використовувати «Легке розміщення» в грі наодинці", - "litematica.config.generic.comment.easyPlaceSwapInterval": "Інтервал у мілісекундах, протягом якого режим «Легке розміщення»\nочікує після заміни слотів інвентарю та розміщення блоку\nКорисно, щоб уникнути розміщення неправильних блоків під час високого пінґу", - "litematica.config.generic.comment.easyPlaceSwingHand": "Помахайте рукою гравця під час використання «Легке розміщення»", - "litematica.config.generic.comment.easyPlaceVanillaReach": "Якщо увімкнено, зменшує відстань охоплення з +1,0 до значення ванілли,\nщоб сервери не відхиляли розміщення дaлеких блоків", - "litematica.config.generic.comment.entityDataSync": "Використовуйте протокол Entity Data Sync від Servux для отримання даних сутности із сервера", - "litematica.config.generic.comment.entityDataSyncBackup": "Використовуйте метод Vanilla NBT Query, якщо Servux не недоступний. Для цього методу потрібні права оператора", - "litematica.config.generic.comment.entityDataSyncCacheTimeout": "Значення затримки кешу в секундах, для якого кеш сутностей зберігає записи. Нижче значення означає частіші\nоновлення, але ви можете розглянути вище значення, якщо Litematica не може зберегти всі дані NBT", - "litematica.config.generic.comment.entityDataSyncLoadNbt": "Завантажує синхронізовані дані NBT у світ клієнта\n§6ПОПЕРЕДЖЕННЯ: Ця функція призведе до несумісності §6з іншими модами, які покладаються на ці дані", - "litematica.config.generic.comment.executeRequireHoldingTool": "Потрібно утримувати увімкнений інструмент для роботи гарячої клавіші executeOperation", - "litematica.config.generic.comment.fixChestMirror": "Увімкнути виправлення зламаного коду дзеркала скрині у ваніллі", - "litematica.config.generic.comment.fixRailRotation": "Якщо «true», то буде застосовано виправлення для ванілльної помилки в рейках, де обертання на 180 градусів прямих\nрейок з півночі на південь і зі сходу на схід обертається на 90 градусів проти годинникової стрілки. >_>", - "litematica.config.generic.comment.generateLowercaseNames": "Якщо увімкнено, то за замовчуванням запропоновані назви схематик будуть написані\nмалими літерами та використовуватимуть підкреслення замість пробілів", - "litematica.config.generic.comment.highlightBlockInInventory": "Якщо увімкнено, підсвічується предмет (включаючи шалкерові коробки, які його містять) переглянутого блоку на схематиці", - "litematica.config.generic.comment.itemUsePacketCheckBypass": "Обійти нову перевірку відстані/координат, додану в 1.18.2\n\nЦя перевірка порушує «протокол точного розміщення» та спричиняє будь-які блоки, розміщені з запит на обертання\n(або іншу властивість), щоб просто стати фантомними блоками\n\nЗагалом немає потреби вимикати це\nПеревірки навіть не існувало до 1.18.2", - "litematica.config.generic.comment.layerModeFollowsPlayer": "Якщо «true», тоді промальовнй шар слідує за гравцем\nПримітка: наразі це, на жаль, згортає діапазони типів діапазону шарів", - "litematica.config.generic.comment.loadEntireSchematics": "Якщо «true», то вся схематика завжди завантажується одночасно\nЯкщо «false», то завантажується лише та частина, яка знаходиться в межах видимості клієнта", - "litematica.config.generic.comment.materialListIgnoreState": "Якщо увімкнено, точний стан блоку ігнорується, і має відповідати лише тип блоку", - "litematica.config.generic.comment.pasteAlwaysUseFill": "Це змушує використовувати команду fill (замість setblock) навіть для окремих блоків", - "litematica.config.generic.comment.pasteIgnoreBlockEntitiesEntirely": "Якщо увімкнено, блокові сутності взагалі не вставлятимуться за допомогою вставки на основі команд у мережевій грі\nЦе дає змогу легше вставляти за два проходи, якщо бажаєте використовувати опція NBT-відновлення для запасів тощо\nпід час другого проходу, що зазвичай вимагає набагато меншої швидкости вставлення/швидкости команд", - "litematica.config.generic.comment.pasteIgnoreBlockEntitiesFromFill": "Якщо увімкнено, усі блокові сутності ігноруються командами заповнення під час вставлення. Це дає змогу вставляти їх\nокремо, що потрібно, якщо використовується параметр відновлення NBT", - "litematica.config.generic.comment.pasteIgnoreCommandLimitWithNbtRestore": "Якщо увімкнено, обмеження команд ігнорується під час вставлення блоків\nіз сутністю блоку з увімкненою опцією відновлення NBT\nЗдається, це якимось чином вирішує проблему, коли відновлення NBT в іншому випадку\nвиникне збій для багатьох блоків із низькою швидкістю команд", - "litematica.config.generic.comment.pasteIgnoreEntities": "Якщо увімкнено, функція вставлення не вставлятиме жодних сутностей", - "litematica.config.generic.comment.pasteIgnoreInventories": "Не вставляти вміст інвентарю під час вставлення схематик", - "litematica.config.generic.comment.pasteNbtRestoreBehavior": "Незалежно від того, чи намагаються відновити дані NBT блоків, і який метод для цього використовується\n- «Розмістити і модифікувати дані» спробує розмістити «вибрані NBT» блоку біля гравця, і потім скористайтеся командою\nмодифікування даних, щоб перенести дані NBT до встановленого блоку\n- «Розмістити і клонувати» спробує розмістити «вибрані NBT» блоку біля гравця,\nа потім клонувати його до кінцевої точки\n- «Розмістити і телепортувати» спробує телепортувати гравця поблизу, а потім напряму розмістити «вибрані NBT»\nпредмета у правильному положенні\nЗверніть увагу, що метод телепортації та розміщення зараз не працює належним чином(або зовсім) \nРекомендовано — §e«Розмістити і модифікувати дані»§r, однак, щоб він працював вам, імовірно, потрібно буде зменшити\npasteCommandLimit до 1 за такт і збільшити pasteCommandInterval до 1-4 тактів або щось подібне\nТому вам слід використовувати лише це для вставлення важливих блоків, які потребують даних, наприклад,\nшляхом створення схематики лише з інвентарем, а потім замінити це на «Немає»", - "litematica.config.generic.comment.pasteReplaceBehavior": "Поведінка заміни існуючих блоків у режимі інструменту «Вставити схематику»", - "litematica.config.generic.comment.pasteToMcFunctionFiles": "Якщо увімкнено, замість фактичного вставлення схематик у світ, вони записуються як команди setblock у текстові файли", - "litematica.config.generic.comment.pasteUseFillCommand": "Якщо увімкнено, замість використання лише окремих команд /setblock операція вставлення на основі команд\n(яка використовується на серверах) також намагатиметься використовувати команду /fill для будь-яких безперервних областей одного блоку\nЦе не має ефекту в грі наодинці, оскільки мод встановлює блоки безпосередньо у світ\nінтегрованого сервера та взагалі не використовує команди", - "litematica.config.generic.comment.pasteUsingCommandsInSp": "Це тимчасовий обхідний шлях для використання вставки на основі команд також в грі наодинці,\nщо дозволяє використовувати обмежений шар промальовування вставлення в грі наодинці,\nщо наразі не працює з вставленням прямим доступом\n до світу, яке зазвичай використовує один гравець\n\nЗверніть увагу, що це матиме всі ті ж обмеження відновлення даних NBT, які зазвичай має вставлення для кількох гравців", - "litematica.config.generic.comment.pasteUsingServux": "Використовуйте Servux, щоб вставити схематику безпосередньо на сервер\nЦей метод набагато швидший, ніж традиційний метод на основі команд, і він підтримує відновлення даних NBT Entity", - "litematica.config.generic.comment.pickBlockAvoidDamageable": "Уникає заміни будь-яких пошкоджених предметів на гарячій панелі", - "litematica.config.generic.comment.pickBlockAvoidTools": "Уникає заміни будь-яких інструментів на гарячій панелі\n\nЦе означає будь-які предмети, які розширюють клас Vanilla ToolItem", - "litematica.config.generic.comment.pickBlockEnabled": "Вмикає гарячі клавіші вибору блоків схематики світу\nТакож існує гаряча клавіша для перемикання цього параметра, щоб перемикати ці гарячі клавіші... o.o", - "litematica.config.generic.comment.pickBlockIgnoreNbt": "Вмикає «pickBlockIgnoreNbt» для легкого рнонртсаного розміщення з ornithe 1.12.2", - "litematica.config.generic.comment.pickBlockShulkers": "Якщо увімкнено, тоді, якщо потрібний предмет для блоку вибору не знайдено безпосередньо в інвентарі гравця, але є\nшалкерова коробка, яка містить шалкерову коробку буде переведено на руку гравця", - "litematica.config.generic.comment.pickBlockableSlots": "Слоти гарячої панелі, які можна використовувати для вибору блоків схематики", - "litematica.config.generic.comment.placementReplaceBehavior": "Поведінка заміни блоків під час додавання блоків до схематики світу\n\nЦе дозволяє використовувати розміщення, що перекривається без\nподальшого обробленого розміщення, яке завжди перезаписує повітря\nЗ іншого боку, деякі блоки, такі як світло, вважатимуться повітрям,\nтож їм знадобиться поведінка заміни «Усі», щоб їх розмістити", - "litematica.config.generic.comment.placementRestriction": "Якщо увімкнено, клавішу використання можна використовувати лише якщо утримується\nправильний предмет для цільової позиції, цільова позиція має мати відсутній блок у схематиці", - "litematica.config.generic.comment.placementRestrictionWarn": "Вибирає, який тип попереджувального повідомлення відображати (за наявності),\nякщо режим легкого розміщення або обмеження розміщення не дозволяють розмістити блок", - "litematica.config.generic.comment.renderMaterialListInGuis": "Чи список матеріалів повинен промальовуватися всередині меню", - "litematica.config.generic.comment.renderThreadNoTimeout": "Усуває затримку робочих потоків промальовування\nЯкщо ви отримуєте дуже велику затримку промальовування під час руху або роботи з великими схематиками,\nспробуйте вимкнути це. Однак це зробить промальовування схематик у деяких випадках набагато повільніше", - "litematica.config.generic.comment.selectionCornersMode": "Режим кутів виділення області для використання (кути або розширення)", - "litematica.config.generic.comment.serverNbtRequestRate": "Обмежити частоту запитів для синхронізації даних сутності сервера", - "litematica.config.generic.comment.signTextPaste": "Автоматично встановлювати текст у меню табличок зі схематики", - "litematica.config.generic.comment.toolItem": "Предмет для використання як «інструмент» для вибору тощо", - "litematica.config.generic.comment.toolItemComponents": "Версія toolItem із підтримкою компонентів даних\nУстановіть значення «порожньо», щоб вимкнути\nПрийнятий синтаксис такий самий, як і команда «/give»", - "litematica.config.generic.comment.toolItemEnabled": "Якщо «true», то предмет «інструмент» можна використовувати для керування вибором тощо", - "litematica.config.generic.comment.unhideSchematicVCS": "Відображає кнопку меню VCS схематики (система контролю версій) і вмикає гарячу клавішу та функції VCS загалом\n(Раніше це називалося «Проєкт схематики»)\n\nЗагалом вам §6не варто§r користуватися цією функцією, якщо ви справді не знаєте, як вона працює та що робить\nЦе дещо змінює роботу виділення областей, розміщення та вставки,\nзокрема, є також операція видалення області під час вставлення\n\nВ основному ця функція призначена для §6повторювальної роботи над проєктуванням на місці§r, і вона дозволяє вам легше\nстворювати кілька версій/снепшотів однієї збірки, а також перемикатися між версії, спочатку видаливши те, що світ,\nа потім вставивши на його місце наступну версію", + "litematica.config.generic.name.easyPlaceProtocolVersion": "easyPlaceProtocolVersion", + "litematica.config.generic.name.pasteNbtRestoreBehavior": "pasteNbtRestoreBehavior", + "litematica.config.generic.name.pasteReplaceBehavior": "pasteReplaceBehavior", + "litematica.config.generic.name.placementReplaceBehavior": "placementReplaceBehavior", + "litematica.config.generic.name.placementRestrictionWarn": "placementRestrictionWarn", + "litematica.config.generic.name.selectionCornersMode": "selectionCornersMode", + "litematica.config.generic.name.customSchematicBaseDirectoryEnabled": "customSchematicBaseDirectoryEnabled", + "litematica.config.generic.name.customSchematicBaseDirectory": "customSchematicBaseDirectory", "litematica.config.generic.name.areaSelectionsPerWorld": "areaSelectionsPerWorld", "litematica.config.generic.name.betterRenderOrder": "betterRenderOrder", "litematica.config.generic.name.changeSelectedCornerOnMove": "changeSelectedCornerOnMove", @@ -105,17 +21,14 @@ "litematica.config.generic.name.commandNameSummon": "commandNameSummon", "litematica.config.generic.name.commandTaskInterval": "commandTaskInterval", "litematica.config.generic.name.commandUseWorldEdit": "commandUseWorldEdit", - "litematica.config.generic.name.customSchematicBaseDirectory": "customSchematicBaseDirectory", - "litematica.config.generic.name.customSchematicBaseDirectoryEnabled": "customSchematicBaseDirectoryEnabled", - "litematica.config.generic.name.datafixerDefaultSchema": "datafixerDefaultSchema", - "litematica.config.generic.name.datafixerMode": "datafixerMode", "litematica.config.generic.name.debugLogging": "debugLogging", + "litematica.config.generic.name.datafixerMode": "datafixerMode", + "litematica.config.generic.name.datafixerDefaultSchema": "datafixerDefaultSchema", "litematica.config.generic.name.easyPlaceClickAdjacent": "easyPlaceClickAdjacent", "litematica.config.generic.name.easyPlaceFirst": "easyPlaceFirst", "litematica.config.generic.name.easyPlaceHoldEnabled": "easyPlaceHoldEnabled", "litematica.config.generic.name.easyPlaceMode": "easyPlaceMode", "litematica.config.generic.name.easyPlacePostRewrite": "easyPlacePostRewrite", - "litematica.config.generic.name.easyPlaceProtocolVersion": "easyPlaceProtocolVersion", "litematica.config.generic.name.easyPlaceSinglePlayerHandling": "easyPlaceSinglePlayerHandling", "litematica.config.generic.name.easyPlaceSwapInterval": "easyPlaceSwapInterval", "litematica.config.generic.name.easyPlaceSwingHand": "easyPlaceSwingHand", @@ -139,8 +52,6 @@ "litematica.config.generic.name.pasteIgnoreCommandLimitWithNbtRestore": "pasteIgnoreCommandLimitWithNbtRestore", "litematica.config.generic.name.pasteIgnoreEntities": "pasteIgnoreEntities", "litematica.config.generic.name.pasteIgnoreInventories": "pasteIgnoreInventories", - "litematica.config.generic.name.pasteNbtRestoreBehavior": "pasteNbtRestoreBehavior", - "litematica.config.generic.name.pasteReplaceBehavior": "pasteReplaceBehavior", "litematica.config.generic.name.pasteToMcFunctionFiles": "pasteToMcFunctionFiles", "litematica.config.generic.name.pasteUseFillCommand": "pasteUseFillCommand", "litematica.config.generic.name.pasteUsingCommandsInSp": "pasteUsingCommandsInSp", @@ -151,103 +62,91 @@ "litematica.config.generic.name.pickBlockIgnoreNbt": "pickBlockIgnoreNbt", "litematica.config.generic.name.pickBlockShulkers": "pickBlockShulkers", "litematica.config.generic.name.pickBlockableSlots": "pickBlockableSlots", - "litematica.config.generic.name.placementReplaceBehavior": "placementReplaceBehavior", "litematica.config.generic.name.placementRestriction": "placementRestriction", - "litematica.config.generic.name.placementRestrictionWarn": "placementRestrictionWarn", "litematica.config.generic.name.renderMaterialListInGuis": "renderMaterialListInGuis", "litematica.config.generic.name.renderThreadNoTimeout": "renderThreadNoTimeout", - "litematica.config.generic.name.selectionCornersMode": "selectionCornersMode", "litematica.config.generic.name.serverNbtRequestRate": "serverNbtRequestRate", "litematica.config.generic.name.signTextPaste": "signTextPaste", "litematica.config.generic.name.toolItem": "toolItem", - "litematica.config.generic.name.toolItemComponents": "toolItemComponents", "litematica.config.generic.name.toolItemEnabled": "toolItemEnabled", + "litematica.config.generic.name.toolItemComponents": "toolItemComponents", "litematica.config.generic.name.unhideSchematicVCS": "unhideSchematicVCS", - "litematica.config.generic.prettyName.easyPlaceMode": "Режим легкого розміщення", - "litematica.config.generic.prettyName.pickBlockEnabled": "Вибір гарячих клавішей блока", - "litematica.config.generic.prettyName.placementRestriction": "Обмежене розміщення", - "litematica.config.generic.prettyName.signTextPaste": "Вставити текст табличок", - "litematica.config.generic.prettyName.toolItemEnabled": "Предмет-інструмент увімкнено", - "litematica.config.hotkeys.comment.addSelectionBox": "Додатинове поле вибору (позиція 1) тут", - "litematica.config.hotkeys.comment.cloneSelection": "Швидко клонувати поточну виділену область\nЦе просто створює схематику лише в пам'яті, а потім створює розміщення цієї схематики\nта вибирає її і також перемикає з режиму інструмента в режим «Вставити»", - "litematica.config.hotkeys.comment.deleteSelectionBox": "Видалити вибране поле", - "litematica.config.hotkeys.comment.easyPlaceToggle": "Дозволяє швидко вмикати/вимикати режим «Легке розміщення»", - "litematica.config.hotkeys.comment.easyPlaceUseKey": "Коли easyPlaceMode увімкнено, цей ключ використовується для розміщення блоків", - "litematica.config.hotkeys.comment.executeOperation": "Виконати поточну вибрану операцію інструменту з\nпоточним виділенням або розміщення у режимах заповнення, заміни, вставки схематики тощо", - "litematica.config.hotkeys.comment.invertGhostBlockRenderState": "Інвертує стан промальовування схематики/фантомного блоку доки це утримується", - "litematica.config.hotkeys.comment.invertOverlayRenderState": "Інвертує стан промальовування накладання, коли це утримується", - "litematica.config.hotkeys.comment.layerModeNext": "Перемкнути режим промальовування (усі, шари) вперед", - "litematica.config.hotkeys.comment.layerModePrevious": "Перемкнути режим відтворення (усі, шари) назад", - "litematica.config.hotkeys.comment.layerNext": "Перемістити вибраний шар вгору", - "litematica.config.hotkeys.comment.layerPrevious": "Перемістити вибраний шар вниз", - "litematica.config.hotkeys.comment.layerSetHere": "Установити шар промальовування на поточну позицію гравця", - "litematica.config.hotkeys.comment.moveEntireSelection": "Перемістити весь поточний вибір сюди", - "litematica.config.hotkeys.comment.nudgeSelectionNegative": "Зрушити поточне виділення в «негативному» напрямку\nЦе в основному те саме, що коліщатко миші вниз з натиснутим модифікатором «Зміщення»", - "litematica.config.hotkeys.comment.nudgeSelectionPositive": "Зрушити поточне виділення в «позитивному» напрямку\nЦе в основному те саме, що коліщатко миші вгору з натиснутим модифікатором «Переміщення»", - "litematica.config.hotkeys.comment.openGuiAreaSettings": "Відкрити меню налаштувань області для поточної вибраної області", - "litematica.config.hotkeys.comment.openGuiLoadedSchematics": "Відкрити меню із завантаженою схематикою", - "litematica.config.hotkeys.comment.openGuiMainMenu": "Відкрити головне меню Litematica", - "litematica.config.hotkeys.comment.openGuiMaterialList": "Відкрити меню списку матеріалів для поточного вибраного розміщення схематики", - "litematica.config.hotkeys.comment.openGuiPlacementSettings": "Відкрити меню налаштувань розміщення для поточного вибраного місця розташування або підрегіону", - "litematica.config.hotkeys.comment.openGuiSchematicPlacements": "Відкрити меню розміщення схематик", - "litematica.config.hotkeys.comment.openGuiSchematicProjects": "Відкрити меню проєктів", - "litematica.config.hotkeys.comment.openGuiSchematicVerifier": "Відкрити меню перевірки схематики для поточного вибраного розміщення схематики", - "litematica.config.hotkeys.comment.openGuiSelectionManager": "Відкрити меню менеджера вибору області", - "litematica.config.hotkeys.comment.openGuiSettings": "Відкрити меню налантувань", - "litematica.config.hotkeys.comment.operationModeChangeModifier": "Клавіша-модифікатор для швидкої зміни режиму роботи\nУтримуйте її та прокручуйте, утримуючи «предмет-інструмент», щоб швидко перемикати режим", - "litematica.config.hotkeys.comment.pickBlockFirst": "Клавіша для вибору блоку першого блоку променю схематики, до якого відстежується", - "litematica.config.hotkeys.comment.pickBlockLast": "Ключ для вибору блоку останнього блоку променю схематики, до якого відстежується, перед першим\n(можливим) променем клієнтського світу, до якого відстежується промінь блоку\nЗагалом це дасть вам блок, який ви можна розмістити проти існуючого блоку", - "litematica.config.hotkeys.comment.pickBlockToggle": "Гаряча клавіша для перемикання опції перемикання блоку вибору в «Загальні». Це надається як швидкий спосіб\nувімкнути або вимкнути клавіші вибору блоку, якщо вони чомусь заважають", - "litematica.config.hotkeys.comment.renderInfoOverlay": "Клавіша, яка вмикає перемальовування накладення інформації про блок\nВикористовуйте «Нічого», щоб не вимагати натискання клавіші\nВимкніть параметр із подібною назвою у «Візуал», щоб вимкнути накладення повністю", - "litematica.config.hotkeys.comment.renderOverlayThroughBlocks": "Гаряча клавіша, яка дозволяє накладенням промальовувати блоки\nЦе лише швидший спосіб тимчасово ввімкнути те саме,\nщо робить параметр «schematicOverlayRenderThroughBlocks» у «Візуал»", - "litematica.config.hotkeys.comment.rerenderSchematic": "Гаряча клавіша для оновлення/перемальовування лише схематики,\nзамість того, щоб оновлювати ванілльний рельєф також за допомогою F3 + A", - "litematica.config.hotkeys.comment.saveAreaAsInMemorySchematic": "Зберегти поточний вибір області як схематику в пам'яті", - "litematica.config.hotkeys.comment.saveAreaAsSchematicToFile": "Зберегти поточний вибір області як схематику у файл", - "litematica.config.hotkeys.comment.schematicEditBreakAllExcept": "Клавіша-модифікатор для активації режиму/функції «розірвати все, крім» у режимі інструмента редагування схематики\nЗагалом, коли ви утримуєте цю клавішу та натискаєте блок схематики,\nусі інші блоки, крім цей блок буде видалено зі схематики", - "litematica.config.hotkeys.comment.schematicEditBreakPlaceAll": "Клавіша-модифікатор для активації функції «розбити всі ідентичні блоки» в режимі інструмента редагування схематики", - "litematica.config.hotkeys.comment.schematicEditBreakPlaceDirection": "Клавіша-модифікатор для активації функції направленого/безперервного розриву або розміщення в режимі інструмента редагування схематики", - "litematica.config.hotkeys.comment.schematicEditReplaceAll": "Клавіша-модифікатор для активації режиму/функції заміни «замінити всі ідентичні»\nв режимі інструмента редагування схематики", - "litematica.config.hotkeys.comment.schematicEditReplaceBlock": "Клавіша-модифікатор для активації режиму/функції заміни «замінити тип блоку»\nв режимі інструмента редагування схематики", - "litematica.config.hotkeys.comment.schematicEditReplaceDirection": "Клавіша-модифікатор для активації режиму/функції спрямованої/безперервної\nзаміни в режимі інструмента редагування схематики", - "litematica.config.hotkeys.comment.schematicPlacementMirror": "Схематика дзеркально перевертається під час натискання", - "litematica.config.hotkeys.comment.schematicPlacementRotation": "При натисканні схематика повертається на 90 градусів за годинниковою стрілкою", - "litematica.config.hotkeys.comment.schematicVersionCycleModifier": "Клавіша-модифікатор, яку потрібно утримувати, щоб мати можливість використовувати\nколіщатко миші для циклічного переходу між версіями схематики в режимі інструмента керування версіями", - "litematica.config.hotkeys.comment.schematicVersionCycleNext": "Гаряча клавіша для переходу до наступної версії схематики в режимі інструмента керування версіями", - "litematica.config.hotkeys.comment.schematicVersionCyclePrevious": "Гаряча клавіша для переходу до наступної версії схематики в режимі інструмента керування версіями", - "litematica.config.hotkeys.comment.selectionGrabModifier": "Клавіша-модифікатор, яку потрібно утримувати, щоб «захопити» вибрану область або кут для переміщення курсором", - "litematica.config.hotkeys.comment.selectionGrow": "Гаряча клавіша для автоматичного збільшення поля вибору навколо будь-яких суміжних/діагонально з'єднаних блоків", - "litematica.config.hotkeys.comment.selectionGrowModifier": "Клавіша-модифікатор, яку потрібно утримувати, щоб збільшити або зменшити поле вибору під час прокручування", - "litematica.config.hotkeys.comment.selectionModeCycle": "Змінити режим між кутами та прямокутним у режимі виділення області", - "litematica.config.hotkeys.comment.selectionNudgeModifier": "Клавіша-модифікатор, яку потрібно утримувати під час прокручування для переміщення вибраної області чи кута", - "litematica.config.hotkeys.comment.selectionShrink": "Гаряча клавіша, щоб зменшити рамку виділення так, щоб не було порожнього місця (порожніх шарів) з будь-якого боку", - "litematica.config.hotkeys.comment.setAreaOrigin": "Установити/перемістити початкову точку вибору поточної області на позицію гравця", - "litematica.config.hotkeys.comment.setSelectionBoxPosition1": "Установити першу позицію вибраного полі на позицію гравця", - "litematica.config.hotkeys.comment.setSelectionBoxPosition2": "Установити другу позицію поточного вибраного поля на позицію гравця", - "litematica.config.hotkeys.comment.toggleAllRendering": "Увімкнути/вимкнути промальовування всього", - "litematica.config.hotkeys.comment.toggleAreaSelectionBoxesRendering": "Увімкнути/вимкнути промальовування полів вибораної області", - "litematica.config.hotkeys.comment.toggleInfoOverlayRendering": "Увімкнути промальовування накладання інформації (для інформації про блок, наведений курсором)", - "litematica.config.hotkeys.comment.toggleOverlayOutlineRendering": "Увімкнути/вимкнути промальовування контуру накладання блока", - "litematica.config.hotkeys.comment.toggleOverlayRendering": "Увімкнути/вимкнути промальовування накладання блока", - "litematica.config.hotkeys.comment.toggleOverlaySideRendering": "Увімкнути/вимкнути промальовування сторони накладання блока", - "litematica.config.hotkeys.comment.togglePlacementBoxesRendering": "Увімкнути/вимкнути промальовування блоків розміщення схематики", - "litematica.config.hotkeys.comment.togglePlacementRestriction": "Гаряча клавіша для перемикання режиму обмеження розміщення", - "litematica.config.hotkeys.comment.toggleSchematicBlockRendering": "Увімкнути/вимкнути промальовування блока схематики", - "litematica.config.hotkeys.comment.toggleSchematicRendering": "Увімкнути/вимкнути промальовування схематики (блоки та накладання)", - "litematica.config.hotkeys.comment.toggleSignTextPaste": "Перемикач значення параметра signTextPaste (у категорії «Загальні»)", - "litematica.config.hotkeys.comment.toggleTranslucentRendering": "Вимкнути прозоре та непрозоре промальовування фантомних блоків", - "litematica.config.hotkeys.comment.toggleVerifierOverlayRendering": "Увімкнути промальовування накладання «Перевірка схематики»", - "litematica.config.hotkeys.comment.toolEnabledToggle": "Сполучення клавіш для увімкнення/вимкнення функції «інструмент»", - "litematica.config.hotkeys.comment.toolPlaceCorner1": "Кнопка, яка використовується, утримуючи предмета «інструмент», щоб розмістити основний/перший кут", - "litematica.config.hotkeys.comment.toolPlaceCorner2": "Кнопка, яка використовується, утримуючи «інструмент» для розміщення другого кута", - "litematica.config.hotkeys.comment.toolSelectElements": "Кнопка, яка використовується для вибору кутів або рамок під час утримування предмета «інструмент»", - "litematica.config.hotkeys.comment.toolSelectModifierBlock1": "Клавіша-модифікатор, яку потрібно утримувати під час використання гарячої клавіші\n«toolSelectElements», щоб вибрати тип основного блоку для використання в деяких режимах інструмента", - "litematica.config.hotkeys.comment.toolSelectModifierBlock2": "Клавіша-модифікатор, яку потрібно утримувати під час використання гарячої клавіші\n«toolSelectElements», щоб вибрати тип додаткового блоку для використання в деяких режимах інструмента", - "litematica.config.hotkeys.comment.unloadCurrentSchematic": "Вивантажити схематику поточного вибраного розташування та,\nтаким чином, також видалити всі розміщення, створені з нього", + "litematica.config.visuals.name.enableAreaSelectionBoxesRendering": "enableAreaSelectionBoxesRendering", + "litematica.config.visuals.name.enablePlacementBoxesRendering": "enablePlacementBoxesRendering", + "litematica.config.visuals.name.enableRendering": "enableRendering", + "litematica.config.visuals.name.enableSchematicBlocksRendering": "enableSchematicBlocksRendering", + "litematica.config.visuals.name.enableSchematicFluidRendering": "enableSchematicFluidRendering", + "litematica.config.visuals.name.enableSchematicOverlay": "enableSchematicOverlay", + "litematica.config.visuals.name.enableSchematicRendering": "enableSchematicRendering", + "litematica.config.visuals.name.renderSchematicMaxThreads": "renderSchematicMaxThreads", + "litematica.config.visuals.name.ghostBlockAlpha": "ghostBlockAlpha", + "litematica.config.visuals.name.ignoreExistingFluids": "ignoreExistingFluids", + "litematica.config.visuals.name.overlayReducedInnerSides": "overlayReducedInnerSides", + "litematica.config.visuals.name.placementBoxSideAlpha": "placementBoxSideAlpha", + "litematica.config.visuals.name.renderAOModernEnable": "renderAOModernEnable", + "litematica.config.visuals.name.renderAreaSelectionBoxSides": "renderAreaSelectionBoxSides", + "litematica.config.visuals.name.renderBlocksAsTranslucent": "renderBlocksAsTranslucent", + "litematica.config.visuals.name.renderCollidingSchematicBlocks": "renderCollidingSchematicBlocks", + "litematica.config.visuals.name.renderErrorMarkerConnections": "renderErrorMarkerConnections", + "litematica.config.visuals.name.renderErrorMarkerSides": "renderErrorMarkerSides", + "litematica.config.visuals.name.renderPlacementBoxSides": "renderPlacementBoxSides", + "litematica.config.visuals.name.renderPlacementEnclosingBox": "renderPlacementEnclosingBox", + "litematica.config.visuals.name.renderPlacementEnclosingBoxSides": "renderPlacementEnclosingBoxSides", + "litematica.config.visuals.name.renderTranslucentBlockInnerSides": "renderTranslucentBlockInnerSides", + "litematica.config.visuals.name.schematicOverlayEnableOutlines": "schematicOverlayEnableOutlines", + "litematica.config.visuals.name.schematicOverlayEnableResorting": "schematicOverlayEnableResorting", + "litematica.config.visuals.name.schematicOverlayEnableSides": "schematicOverlayEnableSides", + "litematica.config.visuals.name.schematicOverlayModelOutline": "schematicOverlayModelOutline", + "litematica.config.visuals.name.schematicOverlayModelSides": "schematicOverlayModelSides", + "litematica.config.visuals.name.schematicOverlayOutlineWidth": "schematicOverlayOutlineWidth", + "litematica.config.visuals.name.schematicOverlayOutlineWidthThrough": "schematicOverlayOutlineWidthThrough", + "litematica.config.visuals.name.schematicOverlayRenderThroughBlocks": "schematicOverlayRenderThroughBlocks", + "litematica.config.visuals.name.schematicOverlayTypeExtra": "schematicOverlayTypeExtra", + "litematica.config.visuals.name.schematicOverlayTypeMissing": "schematicOverlayTypeMissing", + "litematica.config.visuals.name.schematicOverlayTypeWrongBlock": "schematicOverlayTypeWrongBlock", + "litematica.config.visuals.name.schematicOverlayTypeWrongState": "schematicOverlayTypeWrongState", + "litematica.config.visuals.name.schematicVerifierUseBlockModels": "schematicVerifierUseBlockModels", + "litematica.config.info_overlays.name.blockInfoLinesAlignment": "blockInfoLinesAlignment", + "litematica.config.info_overlays.name.blockInfoOverlayAlignment": "blockInfoOverlayAlignment", + "litematica.config.info_overlays.name.infoHudAlignment": "infoHudAlignment", + "litematica.config.info_overlays.name.toolHudAlignment": "toolHudAlignment", + "litematica.config.info_overlays.name.blockInfoLinesEnabled": "blockInfoLinesEnabled", + "litematica.config.info_overlays.name.blockInfoLinesFontScale": "blockInfoLinesFontScale", + "litematica.config.info_overlays.name.blockInfoLinesOffsetX": "blockInfoLinesOffsetX", + "litematica.config.info_overlays.name.blockInfoLinesOffsetY": "blockInfoLinesOffsetY", + "litematica.config.info_overlays.name.blockInfoOverlayOffsetY": "blockInfoOverlayOffsetY", + "litematica.config.info_overlays.name.blockInfoOverlayEnabled": "blockInfoOverlayEnabled", + "litematica.config.info_overlays.name.infoHudMaxLines": "infoHudMaxLines", + "litematica.config.info_overlays.name.infoHudOffsetX": "infoHudOffsetX", + "litematica.config.info_overlays.name.infoHudOffsetY": "infoHudOffsetY", + "litematica.config.info_overlays.name.infoHudScale": "infoHudScale", + "litematica.config.info_overlays.name.infoOverlaysTargetFluids": "infoOverlaysTargetFluids", + "litematica.config.info_overlays.name.materialListHudMaxLines": "materialListHudMaxLines", + "litematica.config.info_overlays.name.materialListHudScale": "materialListHudScale", + "litematica.config.info_overlays.name.statusInfoHud": "statusInfoHud", + "litematica.config.info_overlays.name.statusInfoHudAuto": "statusInfoHudAuto", + "litematica.config.info_overlays.name.toolHudOffsetX": "toolHudOffsetX", + "litematica.config.info_overlays.name.toolHudOffsetY": "toolHudOffsetY", + "litematica.config.info_overlays.name.toolHudScale": "toolHudScale", + "litematica.config.info_overlays.name.verifierErrorHilightAlpha": "verifierErrorHilightAlpha", + "litematica.config.info_overlays.name.verifierErrorHilightMaxPositions": "verifierErrorHilightMaxPositions", + "litematica.config.info_overlays.name.verifierOverlayEnabled": "verifierOverlayEnabled", + "litematica.config.info_overlays.name.warnDisabledRendering": "warnDisabledRendering", + "litematica.config.colors.name.areaSelectionBoxSideColor": "areaSelectionBoxSideColor", + "litematica.config.colors.name.hightlightBlockInInventoryColor": "hightlightBlockInInventoryColor", + "litematica.config.colors.name.materialListHudItemCountsColor": "materialListHudItemCountsColor", + "litematica.config.colors.name.schematicRebuildBreakPlaceOverlayColor": "schematicRebuildBreakPlaceOverlayColor", + "litematica.config.colors.name.schematicRebuildBreakExceptPlaceOverlayColor": "schematicRebuildBreakExceptPlaceOverlayColor", + "litematica.config.colors.name.schematicRebuildReplaceOverlayColor": "schematicRebuildReplaceOverlayColor", + "litematica.config.colors.name.schematicOverlayColorExtra": "schematicOverlayColorExtra", + "litematica.config.colors.name.schematicOverlayColorMissing": "schematicOverlayColorMissing", + "litematica.config.colors.name.schematicOverlayColorWrongBlock": "schematicOverlayColorWrongBlock", + "litematica.config.colors.name.schematicOverlayColorWrongState": "schematicOverlayColorWrongState", "litematica.config.hotkeys.name.addSelectionBox": "addSelectionBox", "litematica.config.hotkeys.name.cloneSelection": "cloneSelection", "litematica.config.hotkeys.name.deleteSelectionBox": "deleteSelectionBox", - "litematica.config.hotkeys.name.easyPlaceToggle": "easyPlaceToggle", "litematica.config.hotkeys.name.easyPlaceUseKey": "easyPlaceUseKey", + "litematica.config.hotkeys.name.easyPlaceToggle": "easyPlaceToggle", "litematica.config.hotkeys.name.executeOperation": "executeOperation", "litematica.config.hotkeys.name.invertGhostBlockRenderState": "invertGhostBlockRenderState", "litematica.config.hotkeys.name.invertOverlayRenderState": "invertOverlayRenderState", @@ -256,9 +155,9 @@ "litematica.config.hotkeys.name.layerNext": "layerNext", "litematica.config.hotkeys.name.layerPrevious": "layerPrevious", "litematica.config.hotkeys.name.layerSetHere": "layerSetHere", - "litematica.config.hotkeys.name.moveEntireSelection": "moveEntireSelection", "litematica.config.hotkeys.name.nudgeSelectionNegative": "nudgeSelectionNegative", "litematica.config.hotkeys.name.nudgeSelectionPositive": "nudgeSelectionPositive", + "litematica.config.hotkeys.name.moveEntireSelection": "moveEntireSelection", "litematica.config.hotkeys.name.openGuiAreaSettings": "openGuiAreaSettings", "litematica.config.hotkeys.name.openGuiLoadedSchematics": "openGuiLoadedSchematics", "litematica.config.hotkeys.name.openGuiMainMenu": "openGuiMainMenu", @@ -284,30 +183,30 @@ "litematica.config.hotkeys.name.schematicEditReplaceAll": "schematicEditReplaceAll", "litematica.config.hotkeys.name.schematicEditReplaceBlock": "schematicEditReplaceBlock", "litematica.config.hotkeys.name.schematicEditReplaceDirection": "schematicEditReplaceDirection", - "litematica.config.hotkeys.name.schematicPlacementMirror": "schematicPlacementMirror", "litematica.config.hotkeys.name.schematicPlacementRotation": "schematicPlacementRotation", + "litematica.config.hotkeys.name.schematicPlacementMirror": "schematicPlacementMirror", "litematica.config.hotkeys.name.schematicVersionCycleModifier": "schematicVersionCycleModifier", "litematica.config.hotkeys.name.schematicVersionCycleNext": "schematicVersionCycleNext", "litematica.config.hotkeys.name.schematicVersionCyclePrevious": "schematicVersionCyclePrevious", "litematica.config.hotkeys.name.selectionGrabModifier": "selectionGrabModifier", "litematica.config.hotkeys.name.selectionGrow": "selectionGrow", "litematica.config.hotkeys.name.selectionGrowModifier": "selectionGrowModifier", - "litematica.config.hotkeys.name.selectionModeCycle": "selectionModeCycle", "litematica.config.hotkeys.name.selectionNudgeModifier": "selectionNudgeModifier", + "litematica.config.hotkeys.name.selectionModeCycle": "selectionModeCycle", "litematica.config.hotkeys.name.selectionShrink": "selectionShrink", "litematica.config.hotkeys.name.setAreaOrigin": "setAreaOrigin", "litematica.config.hotkeys.name.setSelectionBoxPosition1": "setSelectionBoxPosition1", "litematica.config.hotkeys.name.setSelectionBoxPosition2": "setSelectionBoxPosition2", "litematica.config.hotkeys.name.toggleAllRendering": "toggleAllRendering", "litematica.config.hotkeys.name.toggleAreaSelectionBoxesRendering": "toggleAreaSelectionBoxesRendering", + "litematica.config.hotkeys.name.toggleSchematicRendering": "toggleSchematicRendering", "litematica.config.hotkeys.name.toggleInfoOverlayRendering": "toggleInfoOverlayRendering", - "litematica.config.hotkeys.name.toggleOverlayOutlineRendering": "toggleOverlayOutlineRendering", "litematica.config.hotkeys.name.toggleOverlayRendering": "toggleOverlayRendering", + "litematica.config.hotkeys.name.toggleOverlayOutlineRendering": "toggleOverlayOutlineRendering", "litematica.config.hotkeys.name.toggleOverlaySideRendering": "toggleOverlaySideRendering", "litematica.config.hotkeys.name.togglePlacementBoxesRendering": "togglePlacementBoxesRendering", "litematica.config.hotkeys.name.togglePlacementRestriction": "togglePlacementRestriction", "litematica.config.hotkeys.name.toggleSchematicBlockRendering": "toggleSchematicBlockRendering", - "litematica.config.hotkeys.name.toggleSchematicRendering": "toggleSchematicRendering", "litematica.config.hotkeys.name.toggleSignTextPaste": "toggleSignTextPaste", "litematica.config.hotkeys.name.toggleTranslucentRendering": "toggleTranslucentRendering", "litematica.config.hotkeys.name.toggleVerifierOverlayRendering": "toggleVerifierOverlayRendering", @@ -318,61 +217,78 @@ "litematica.config.hotkeys.name.toolSelectModifierBlock1": "toolSelectModifierBlock1", "litematica.config.hotkeys.name.toolSelectModifierBlock2": "toolSelectModifierBlock2", "litematica.config.hotkeys.name.unloadCurrentSchematic": "unloadCurrentSchematic", - "litematica.config.hotkeys.prettyName.toggleAllRendering": "Промальовування всього", - "litematica.config.info_overlays.comment.blockInfoLinesAlignment": "Вирівнювання накладання рядків інформації про блок", - "litematica.config.info_overlays.comment.blockInfoLinesEnabled": "Якщо увімкнено, накладення інформації про блок у стилі MiniHUD промальовуватиметься для блоку, який розглядається", - "litematica.config.info_overlays.comment.blockInfoLinesFontScale": "Масштаб шрифту для рядків інформації про блок", - "litematica.config.info_overlays.comment.blockInfoLinesOffsetX": "Зміщення x рядків інформації про блок від вибраного краю", - "litematica.config.info_overlays.comment.blockInfoLinesOffsetY": "Зміщення y рядків інформації про блок від вибраного краю", - "litematica.config.info_overlays.comment.blockInfoOverlayAlignment": "Вирівнювання накладення інформації про блок", - "litematica.config.info_overlays.comment.blockInfoOverlayEnabled": "Увімкнути промальовування «Накладання інформації блока», щоб показувати інформацію про перевірений блок або\nмаркер помилки перевірки, утримуючи клавішу «renderInfoOverlay»", - "litematica.config.info_overlays.comment.blockInfoOverlayOffsetY": "Зсув y накладення інформації про блок від вибраного краю", - "litematica.config.info_overlays.comment.infoHudAlignment": "Вирівнювання «HUD інформації», використовується для переліку матеріалів,\nпозицій невідповідності перевірки схематики тощо", - "litematica.config.info_overlays.comment.infoHudMaxLines": "Максимальна кількість інформаційних рядків, які одночасно відображаються на HUD", - "litematica.config.info_overlays.comment.infoHudOffsetX": "Зміщення X інформаційного HUD від краю екрана", - "litematica.config.info_overlays.comment.infoHudOffsetY": "Зміщення Y інформаційного HUD від краю екрана", - "litematica.config.info_overlays.comment.infoHudScale": "Коефіцієнт масштабування для загального інформаційного тексту HUD", - "litematica.config.info_overlays.comment.infoOverlaysTargetFluids": "Якщо увімкнено, накладення інформації про блоки та рядки інформації про\nблоки можуть проводити трасування променів до рідин, а не проходити через них", - "litematica.config.info_overlays.comment.materialListHudMaxLines": "Максимальна кількість предметів, які одночасно промальовуються на інформаційному панелі списку матеріалів", - "litematica.config.info_overlays.comment.materialListHudScale": "Коефіцієнт масштабу для HUD інформації списку матеріалів", - "litematica.config.info_overlays.comment.statusInfoHud": "Увімкнути засіб промальовування інформації про статус HUD, який відображає кілька бітів інформації про стан,\nнаприклад поточний режим шару та стан увімкнених засобів промальовування", - "litematica.config.info_overlays.comment.statusInfoHudAuto": "Дозволити автоматичне миттєве увімкнення HUD інформації про статус «за потреби», наприклад,\nпід час створення місця розташування та відтворення вимкнено", - "litematica.config.info_overlays.comment.toolHudAlignment": "Вирівнювання «інструмента» під час утримання налаштованого «інструмента»", - "litematica.config.info_overlays.comment.toolHudOffsetX": "Зміщення X інформаційного HUD від краю екрана", - "litematica.config.info_overlays.comment.toolHudOffsetY": "Зміщення Y інформаційного HUD від краю екрана", - "litematica.config.info_overlays.comment.toolHudScale": "Коефіцієнт масштабування для тексту інструменту HUD", - "litematica.config.info_overlays.comment.verifierErrorHilightAlpha": "Значення альфа сторінок поля маркера помилки", - "litematica.config.info_overlays.comment.verifierErrorHilightMaxPositions": "Максимальна кількість невідповідних позицій для одночасного промальовування в накладенні перевірки схематики", - "litematica.config.info_overlays.comment.verifierOverlayEnabled": "Увімкнути візуалізацію маркера перевірки схематики", - "litematica.config.info_overlays.comment.warnDisabledRendering": "Чи має відображатися попередження про те, що ви перебуваєте в режимі шару або вимкнено\nдеякі налаштування відтворення, під час завантаження нової схематики чи створення нового розташування", - "litematica.config.info_overlays.name.blockInfoLinesAlignment": "blockInfoLinesAlignment", - "litematica.config.info_overlays.name.blockInfoLinesEnabled": "blockInfoLinesEnabled", - "litematica.config.info_overlays.name.blockInfoLinesFontScale": "blockInfoLinesFontScale", - "litematica.config.info_overlays.name.blockInfoLinesOffsetX": "blockInfoLinesOffsetX", - "litematica.config.info_overlays.name.blockInfoLinesOffsetY": "blockInfoLinesOffsetY", - "litematica.config.info_overlays.name.blockInfoOverlayAlignment": "blockInfoOverlayAlignment", - "litematica.config.info_overlays.name.blockInfoOverlayEnabled": "blockInfoOverlayEnabled", - "litematica.config.info_overlays.name.blockInfoOverlayOffsetY": "blockInfoOverlayOffsetY", - "litematica.config.info_overlays.name.infoHudAlignment": "infoHudAlignment", - "litematica.config.info_overlays.name.infoHudMaxLines": "infoHudMaxLines", - "litematica.config.info_overlays.name.infoHudOffsetX": "infoHudOffsetX", - "litematica.config.info_overlays.name.infoHudOffsetY": "infoHudOffsetY", - "litematica.config.info_overlays.name.infoHudScale": "infoHudScale", - "litematica.config.info_overlays.name.infoOverlaysTargetFluids": "infoOverlaysTargetFluids", - "litematica.config.info_overlays.name.materialListHudMaxLines": "materialListHudMaxLines", - "litematica.config.info_overlays.name.materialListHudScale": "materialListHudScale", - "litematica.config.info_overlays.name.statusInfoHud": "statusInfoHud", - "litematica.config.info_overlays.name.statusInfoHudAuto": "statusInfoHudAuto", - "litematica.config.info_overlays.name.toolHudAlignment": "toolHudAlignment", - "litematica.config.info_overlays.name.toolHudOffsetX": "toolHudOffsetX", - "litematica.config.info_overlays.name.toolHudOffsetY": "toolHudOffsetY", - "litematica.config.info_overlays.name.toolHudScale": "toolHudScale", - "litematica.config.info_overlays.name.verifierErrorHilightAlpha": "verifierErrorHilightAlpha", - "litematica.config.info_overlays.name.verifierErrorHilightMaxPositions": "verifierErrorHilightMaxPositions", - "litematica.config.info_overlays.name.verifierOverlayEnabled": "verifierOverlayEnabled", - "litematica.config.info_overlays.name.warnDisabledRendering": "warnDisabledRendering", - "litematica.config.info_overlays.prettyName.blockInfoOverlayEnabled": "Накладання промальовування інформації блока", - "litematica.config.info_overlays.prettyName.verifierOverlayEnabled": "Перевірка накладання промальовування", + "litematica.config.generic.comment.easyPlaceProtocolVersion": "Тип «протоколу точного розміщення», потрібно використовувати\n- Авто: використовується версія 3 в грі наодинці, за замовчуванням — плити лише у багатокористувацькій грі, якщо на\nсервері не встановлено мод Carpet, який надсилає «carpet:hello» пакет, у цьому випадку на цьому сервері\nвикористовується v2\n- Версія 3: підтримується лише самою Litematica (в грі наодинці) або з Servux\n- Версія 2: сумісна з серверами з модом Carpet (або QuickCarpet від skyrising і DeadlyMC, або CarpetExtra\nна додаток до FabricCarpet\n І в обох випадках правило Carpet «accurateBlockPlacement» має бути увімкнено на сервері)\n- Лише плити: виправляє лише плити у верхній позиції. Сумісний із серверами Paper\n- Нічого: не модмфікувати координати", + "litematica.config.generic.comment.pasteNbtRestoreBehavior": "Незалежно від того, чи намагаються відновити дані NBT блоків, і який метод для цього використовується\n- «Розмістити і модифікувати дані» спробує розмістити «вибрані NBT» блоку біля гравця, і потім скористайтеся командою\nмодифікування даних, щоб перенести дані NBT до встановленого блоку\n- «Розмістити і клонувати» спробує розмістити «вибрані NBT» блоку біля гравця,\nа потім клонувати його до кінцевої точки\n- «Розмістити і телепортувати» спробує телепортувати гравця поблизу, а потім напряму розмістити «вибрані NBT»\nпредмета у правильному положенні\nЗверніть увагу, що метод телепортації та розміщення зараз не працює належним чином(або зовсім) \nРекомендовано — §e«Розмістити і модифікувати дані»§r, однак, щоб він працював вам, імовірно, потрібно буде зменшити\npasteCommandLimit до 1 за такт і збільшити pasteCommandInterval до 1-4 тактів або щось подібне\nТому вам слід використовувати лише це для вставлення важливих блоків, які потребують даних, наприклад,\nшляхом створення схематики лише з інвентарем, а потім замінити це на «Немає»", + "litematica.config.generic.comment.pasteReplaceBehavior": "Поведінка заміни існуючих блоків у режимі інструменту «Вставити схематику»", + "litematica.config.generic.comment.placementReplaceBehavior": "Поведінка заміни блоків під час додавання блоків до схематики світу\n\nЦе дозволяє використовувати розміщення, що перекривається без\nподальшого обробленого розміщення, яке завжди перезаписує повітря\nЗ іншого боку, деякі блоки, такі як світло, вважатимуться повітрям,\nтож їм знадобиться поведінка заміни «Усі», щоб їх розмістити", + "litematica.config.generic.comment.placementRestrictionWarn": "Вибирає, який тип попереджувального повідомлення відображати (за наявності),\nякщо режим легкого розміщення або обмеження розміщення не дозволяють розмістити блок", + "litematica.config.generic.comment.selectionCornersMode": "Режим кутів виділення області для використання (кути або розширення)", + "litematica.config.generic.comment.customSchematicBaseDirectoryEnabled": "Якщо увімкнено, то каталог, установлений у «customSchematicBaseDirectory» буде використано як кореневий/базовий\nкаталог схематики замість звичайного каталогу «.minecraft/schematics/»", + "litematica.config.generic.comment.customSchematicBaseDirectory": "Кореневий/базовий каталог схематики для використання, якщо «customSchematicBaseDirectoryEnabled» увімкнено", + "litematica.config.generic.comment.areaSelectionsPerWorld": "Використовувати для вибору зони кореневі каталоги для кожного світу або сервера\n§6ПРИМІТКА: Не вимикайте це під час прямої трансляції, §6як тоді вибір області браузер відображатиме IP-адресу\nсервера §6у навігаційному віджеті, а також у поточній назві/шляху§6 доки ви знову не зміните поточний каталог і вибір", + "litematica.config.generic.comment.betterRenderOrder": "Якщо увімкнено, то відтворення схематики виконується шляхом введення іншого виклику відтворення в ванілльний код відтворення. Це має призвести до кращого прозорого відтворення/впорядкування блоків\nЯкщо промальовування не працює (наприклад, за допомогою Optifine), спробуйте вимкнути це", + "litematica.config.generic.comment.changeSelectedCornerOnMove": "Якщо «true», для вибраного кута виділеної області завжди встановлюється останній переміщений\nкут, якщо використовуються встановлені гарячі клавіші", + "litematica.config.generic.comment.cloneAtOriginalPosition": "Якщо увімкнено, використання гарячої клавіші «Вибрати клон» створить розташування\nу вихідній позиції вибору замість поточної позиції гравця", + "litematica.config.generic.comment.commandDisableFeedback": "Якщо увімкнено, зворотний зв’язок команд автоматично вимикається і потім знову вмикається для операцій\nвставки, заповнення та видалення (які використовують команди /setblock і /fill) за допомогою вимкнення,\nа потім повторне увімкнення правила гри sendCommandFeedback після завершення завдання", + "litematica.config.generic.comment.commandFillMaxVolume": "Максимальний розмір/об’єм кожного окремого куба, який можна заповнити за допомогою операцій/заповнити/видалити\nна основі команди. Більші області/об’єми буде розділено на декілька команд\nУсі області також спочатку розбиваються на блоки для блоків", + "litematica.config.generic.comment.commandFillNoChunkClamp": "Вимикає розподіл обсягів заповнення (у режимах заповнення, заміни та видалення) на блоки для блоків", + "litematica.config.generic.comment.commandLimitPerTick": "Максимальна кількість команд, надісланих за такт гри, під час використання функцій вставки, заповнення та видалення\nна сервері, де вони використовуватимуть команди setblock і fill\nЗверніть увагу, що функція вставки може перевищити це за допомогою кількох команд під час використання функції\nвідновлення NBT, яка потребує двох додаткових команд для кожного блоку", + "litematica.config.generic.comment.commandNameClone": "Назва команди clone, яка використовується під час функції творчого режиму на основі команд на серверах\nНаразі це використовується функцією «Вставити»,\nлише якщо встановлено поведінку відновлення NBT до «Розмістити та клонувати»", + "litematica.config.generic.comment.commandNameFill": "Назва команди fill для використання під час функції творчого режиму на основі команд на серверах", + "litematica.config.generic.comment.commandNameSetblock": "Назва команди setblock для використання під час використання функцій\nтворчого режиму на основі команд на серверах, а саме функції «Вставити схематику у світ»", + "litematica.config.generic.comment.commandNameSummon": "Назва команди виклику для використання під час використання функціональних можливостей\nтворчого режиму на основі команд на серверах, а саме функції «Вставити схематику у світ»", + "litematica.config.generic.comment.commandTaskInterval": "Інтервал у грі відмічає завдання вставки, заповнення та видалення. Параметр commandLimitPerTick встановлює\nмаксимальну кількість команд для надсилання на виконання,\nі це встановлює інтервал у тактах гри перед наступним виконанням", + "litematica.config.generic.comment.commandUseWorldEdit": "Якщо увімкнено, замість використання налаштованих команд setblock і fill використовуються команди World Edit //pos1,\n//pos2 і //set\nЗверніть увагу, що використання команд світу редагування приблизно в 3 рази повільніші, ніж використання\nванілльних команд, через обмеження команд на один такт,\nі МИ вимагаємо кілька команд на блок або область (//pos1 //pos2 //набір)\n§6ПОПЕРЕДЖЕННЯ: поведінка заміни вставлення НЕ ПРАЦЮВАТИМЕ, якщо використовується §6команди World Edit та\nзаповнення замість окремих команд setblock!\nТому рекомендується використовувати команди ванілли, якщо у вас є дозвіл на їх запуск\nЩе одна річ, яка може змусити вас віддати перевагу у деяких випадках МИ наказує,\nщо вони можуть запобігти блокуванню оновлень, якщо сервер не має моду Carpet і, отже,\nдоступне правило «/carpet fillUpdates fals»", + "litematica.config.generic.comment.debugLogging": "Вмикає деякі повідомлення журналу налагодження в ігровій консолі для налагодження певних проблем або збоїв", + "litematica.config.generic.comment.datafixerMode": "Настроюваний рівень виправлення даних для застосування до завантажених схематик\nЦе може покращити продуктивність завантаження схематик шляхом обходу Vanilla Data Fixer, але це також може\nпризвести до серйозної втрати даних якщо він вимкнений", + "litematica.config.generic.comment.datafixerDefaultSchema": "Значення за замовчуванням схематики для Vanilla Data Fixer\n\nВикористовується для налаштування найменшого можливого значення та значення, яке використовується,\nякщо завантажена схемптика не містить цієї інформації\n\n§6ПОПЕРЕДЖЕННЯ: це призначено для використання за вказівкою §6розробника Litematica, наприклад masa\n§6Якщо ви сумніваєтеся, збережіть усталене значення для Minecraft 1.12", + "litematica.config.generic.comment.easyPlaceClickAdjacent": "Використовувати код Clicks Adjacent з 1.12.2 або ні\nЛише якщо увімкнено §a«easyPlacePostRewrite»§r", + "litematica.config.generic.comment.easyPlaceFirst": "Це призводить до того, що режим «Легке розміщення» розміщує перший/найближчий блок, на який ви дивитесь,\nзамість найдальшого/найнижчого блоку\n«false» дозволяє вам розмістити кілька шарів «одночасно», оскільки найдальші блоки будуть розміщені до того,\nяк ближчіблокуватимуть лінію видимості", + "litematica.config.generic.comment.easyPlaceHoldEnabled": "Якщо увімкнено, ви можете утримувати клавішу використання і дивитися на різні блоки схематик, щоб розмістити їх,\nбез необхідності натискати кожен блок окремо", + "litematica.config.generic.comment.easyPlaceMode": "Якщо увімкнено, тоді проста спроба використати інструмент/розмістити блоки схематик розмістять цей блок у цій позиції", + "litematica.config.generic.comment.easyPlacePostRewrite": "Якщо увімкнено, режим легкого розміщення використовується\n\nКод «Перепис допису» з ornithe 1.12.2\n§6ПОПЕРЕДЖЕННЯ: ЦЕ ЕКСПЕРИМЕНТ", + "litematica.config.generic.comment.easyPlaceSinglePlayerHandling": "Якщо увімкнено, то Litematica обробляє так званий «Carpet mod Accurate Block Placement Protocol» сама в грі наодинці\nРекомендується залишати його увімкненим, якщо ви, не збираєтеся використовувати «Легке розміщення» в грі наодинці", + "litematica.config.generic.comment.easyPlaceSwapInterval": "Інтервал у мілісекундах, протягом якого режим «Легке розміщення»\nочікує після заміни слотів інвентарю та розміщення блоку\nКорисно, щоб уникнути розміщення неправильних блоків під час високого пінґу", + "litematica.config.generic.comment.easyPlaceSwingHand": "Помахайте рукою гравця під час використання «Легке розміщення»", + "litematica.config.generic.comment.easyPlaceVanillaReach": "Якщо увімкнено, зменшує відстань охоплення з +1,0 до значення ванілли,\nщоб сервери не відхиляли розміщення дaлеких блоків", + "litematica.config.generic.comment.entityDataSync": "Використовуйте протокол Entity Data Sync від Servux для отримання даних сутности із сервера", + "litematica.config.generic.comment.entityDataSyncBackup": "Використовуйте метод Vanilla NBT Query, якщо Servux не недоступний. Для цього методу потрібні права оператора", + "litematica.config.generic.comment.entityDataSyncCacheTimeout": "Значення затримки кешу в секундах, для якого кеш сутностей зберігає записи. Нижче значення означає частіші\nоновлення, але ви можете розглянути вище значення, якщо Litematica не може зберегти всі дані NBT", + "litematica.config.generic.comment.entityDataSyncLoadNbt": "Завантажує синхронізовані дані NBT у світ клієнта\n§6ПОПЕРЕДЖЕННЯ: Ця функція призведе до несумісності §6з іншими модами, які покладаються на ці дані", + "litematica.config.generic.comment.executeRequireHoldingTool": "Потрібно утримувати увімкнений інструмент для роботи гарячої клавіші executeOperation", + "litematica.config.generic.comment.fixChestMirror": "Увімкнути виправлення зламаного коду дзеркала скрині у ваніллі", + "litematica.config.generic.comment.fixRailRotation": "Якщо «true», то буде застосовано виправлення для ванілльної помилки в рейках, де обертання на 180 градусів прямих\nрейок з півночі на південь і зі сходу на схід обертається на 90 градусів проти годинникової стрілки. >_>", + "litematica.config.generic.comment.generateLowercaseNames": "Якщо увімкнено, то за замовчуванням запропоновані назви схематик будуть написані\nмалими літерами та використовуватимуть підкреслення замість пробілів", + "litematica.config.generic.comment.highlightBlockInInventory": "Якщо увімкнено, підсвічується предмет (включаючи шалкерові коробки, які його містять) переглянутого блоку на схематиці", + "litematica.config.generic.comment.itemUsePacketCheckBypass": "Обійти нову перевірку відстані/координат, додану в 1.18.2\n\nЦя перевірка порушує «протокол точного розміщення» та спричиняє будь-які блоки, розміщені з запит на обертання\n(або іншу властивість), щоб просто стати фантомними блоками\n\nЗагалом немає потреби вимикати це\nПеревірки навіть не існувало до 1.18.2", + "litematica.config.generic.comment.layerModeFollowsPlayer": "Якщо «true», тоді промальовнй шар слідує за гравцем\nПримітка: наразі це, на жаль, згортає діапазони типів діапазону шарів", + "litematica.config.generic.comment.loadEntireSchematics": "Якщо «true», то вся схематика завжди завантажується одночасно\nЯкщо «false», то завантажується лише та частина, яка знаходиться в межах видимості клієнта", + "litematica.config.generic.comment.materialListIgnoreState": "Якщо увімкнено, точний стан блоку ігнорується, і має відповідати лише тип блоку", + "litematica.config.generic.comment.pasteAlwaysUseFill": "Це змушує використовувати команду fill (замість setblock) навіть для окремих блоків", + "litematica.config.generic.comment.pasteIgnoreBlockEntitiesEntirely": "Якщо увімкнено, блокові сутності взагалі не вставлятимуться за допомогою вставки на основі команд у мережевій грі\nЦе дає змогу легше вставляти за два проходи, якщо бажаєте використовувати опція NBT-відновлення для запасів тощо\nпід час другого проходу, що зазвичай вимагає набагато меншої швидкости вставлення/швидкости команд", + "litematica.config.generic.comment.pasteIgnoreBlockEntitiesFromFill": "Якщо увімкнено, усі блокові сутності ігноруються командами заповнення під час вставлення. Це дає змогу вставляти їх\nокремо, що потрібно, якщо використовується параметр відновлення NBT", + "litematica.config.generic.comment.pasteIgnoreCommandLimitWithNbtRestore": "Якщо увімкнено, обмеження команд ігнорується під час вставлення блоків\nіз сутністю блоку з увімкненою опцією відновлення NBT\nЗдається, це якимось чином вирішує проблему, коли відновлення NBT в іншому випадку\nвиникне збій для багатьох блоків із низькою швидкістю команд", + "litematica.config.generic.comment.pasteIgnoreEntities": "Якщо увімкнено, функція вставлення не вставлятиме жодних сутностей", + "litematica.config.generic.comment.pasteIgnoreInventories": "Не вставляти вміст інвентарю під час вставлення схематик", + "litematica.config.generic.comment.pasteToMcFunctionFiles": "Якщо увімкнено, замість фактичного вставлення схематик у світ, вони записуються як команди setblock у текстові файли", + "litematica.config.generic.comment.pasteUseFillCommand": "Якщо увімкнено, замість використання лише окремих команд /setblock операція вставлення на основі команд\n(яка використовується на серверах) також намагатиметься використовувати команду /fill для будь-яких безперервних областей одного блоку\nЦе не має ефекту в грі наодинці, оскільки мод встановлює блоки безпосередньо у світ\nінтегрованого сервера та взагалі не використовує команди", + "litematica.config.generic.comment.pasteUsingCommandsInSp": "Це тимчасовий обхідний шлях для використання вставки на основі команд також в грі наодинці,\nщо дозволяє використовувати обмежений шар промальовування вставлення в грі наодинці,\nщо наразі не працює з вставленням прямим доступом\n до світу, яке зазвичай використовує один гравець\n\nЗверніть увагу, що це матиме всі ті ж обмеження відновлення даних NBT, які зазвичай має вставлення для кількох гравців", + "litematica.config.generic.comment.pasteUsingServux": "Використовуйте Servux, щоб вставити схематику безпосередньо на сервер\nЦей метод набагато швидший, ніж традиційний метод на основі команд, і він підтримує відновлення даних NBT Entity", + "litematica.config.generic.comment.pickBlockAvoidDamageable": "Уникає заміни будь-яких пошкоджених предметів на гарячій панелі", + "litematica.config.generic.comment.pickBlockAvoidTools": "Уникає заміни будь-яких інструментів на гарячій панелі\n\nЦе означає будь-які предмети, які розширюють клас Vanilla ToolItem", + "litematica.config.generic.comment.pickBlockEnabled": "Вмикає гарячі клавіші вибору блоків схематики світу\nТакож існує гаряча клавіша для перемикання цього параметра, щоб перемикати ці гарячі клавіші... o.o", + "litematica.config.generic.comment.pickBlockIgnoreNbt": "Вмикає «pickBlockIgnoreNbt» для легкого рнонртсаного розміщення з ornithe 1.12.2", + "litematica.config.generic.comment.pickBlockShulkers": "Якщо увімкнено, тоді, якщо потрібний предмет для блоку вибору не знайдено безпосередньо в інвентарі гравця, але є\nшалкерова коробка, яка містить шалкерову коробку буде переведено на руку гравця", + "litematica.config.generic.comment.pickBlockableSlots": "Слоти гарячої панелі, які можна використовувати для вибору блоків схематики", + "litematica.config.generic.comment.placementRestriction": "Якщо увімкнено, клавішу використання можна використовувати лише якщо утримується\nправильний предмет для цільової позиції, цільова позиція має мати відсутній блок у схематиці", + "litematica.config.generic.comment.renderMaterialListInGuis": "Чи список матеріалів повинен промальовуватися всередині меню", + "litematica.config.generic.comment.renderThreadNoTimeout": "Усуває затримку робочих потоків промальовування\nЯкщо ви отримуєте дуже велику затримку промальовування під час руху або роботи з великими схематиками,\nспробуйте вимкнути це. Однак це зробить промальовування схематик у деяких випадках набагато повільніше", + "litematica.config.generic.comment.serverNbtRequestRate": "Обмежити частоту запитів для синхронізації даних сутності сервера", + "litematica.config.generic.comment.signTextPaste": "Автоматично встановлювати текст у меню табличок зі схематики", + "litematica.config.generic.comment.toolItem": "Предмет для використання як «інструмент» для вибору тощо", + "litematica.config.generic.comment.toolItemEnabled": "Якщо «true», то предмет «інструмент» можна використовувати для керування вибором тощо", + "litematica.config.generic.comment.toolItemComponents": "Версія toolItem із підтримкою компонентів даних\nУстановіть значення «порожньо», щоб вимкнути\nПрийнятий синтаксис такий самий, як і команда «/give»", + "litematica.config.generic.comment.unhideSchematicVCS": "Відображає кнопку меню VCS схематики (система контролю версій) і вмикає гарячу клавішу та функції VCS загалом\n(Раніше це називалося «Проєкт схематики»)\n\nЗагалом вам §6не варто§r користуватися цією функцією, якщо ви справді не знаєте, як вона працює та що робить\nЦе дещо змінює роботу виділення областей, розміщення та вставки,\nзокрема, є також операція видалення області під час вставлення\n\nВ основному ця функція призначена для §6повторювальної роботи над проєктуванням на місці§r, і вона дозволяє вам легше\nстворювати кілька версій/снепшотів однієї збірки, а також перемикатися між версії, спочатку видаливши те, що світ,\nа потім вставивши на його місце наступну версію", "litematica.config.visuals.comment.enableAreaSelectionBoxesRendering": "Увімкнути промальовування полів виділення області", "litematica.config.visuals.comment.enablePlacementBoxesRendering": "Увімкнути промальовування полів розміщення схематики", "litematica.config.visuals.comment.enableRendering": "Основний параметр перемикання промальовування. Вмикає/вимикає промальовування усіх модифікацій", @@ -380,10 +296,12 @@ "litematica.config.visuals.comment.enableSchematicFluidRendering": "Вмикає відтворення рідин в схематиках\nЯкщо вимкнути це, ви зможете легше бачити блоки та накладення\nЦе також видаляє накладення, де була рідина", "litematica.config.visuals.comment.enableSchematicOverlay": "Основна опція перемикання для промальовування накладення блоків схематики", "litematica.config.visuals.comment.enableSchematicRendering": "Увімкнути промальовування схематики та накладання", + "litematica.config.visuals.comment.renderSchematicMaxThreads": "Максимальний розмір потоку промальовування схематики\nЦе безпосередньо вплине на загальну багатопотокову продуктивність\n\n§6ВИКОРИСТУЙТЕ ОБЕРЕЖНО: Це почне діяти лише §6після того, як ви залишите гру та знову приєднайтеся", "litematica.config.visuals.comment.ghostBlockAlpha": "Значення альфа фантомних блоків, під час промальовування їх як напівпрозорих\n§6Примітка: §7Вам також потрібно увімкнути напівпрозоре\nпромальовування окремо, використовуючи «renderBlocksAsTranslucent»!", "litematica.config.visuals.comment.ignoreExistingFluids": "Якщо увімкнено, будь-які рідини ігноруються як «зайві блоки» і як «неправильні блоки»,\nтобто якщо схемтика містить повітря або інші блоки\nЗагалом це робить створення речей під водою набагато менш дратівливим\nПримітка: швидше за все, ви також захочете одночасно увімкнути опцію «renderCollidingSchematicBlocks»,\nщоб дозволити блокам промальовуватися у рідинах", "litematica.config.visuals.comment.overlayReducedInnerSides": "Якщо увімкнено, то суміжні/дотичні внутрішні сторони для накладень блоків видаляються для промальовування", "litematica.config.visuals.comment.placementBoxSideAlpha": "Значення альфа сторони полів підрегіону", + "litematica.config.visuals.comment.renderAOModernEnable": "Enables a new Ambient Occlusion Processor which should\nfix issues where shadows aren't being applied correctly,\nbut it can also cause Schematic Layers to have shadows\nfrom adjacent layers that can be distracting\nwhile your building.", "litematica.config.visuals.comment.renderAreaSelectionBoxSides": "Якщо увімкнути, то рамки вибору областей матимуть свої бокові квадрати", "litematica.config.visuals.comment.renderBlocksAsTranslucent": "Якщо увімкнено, схематики промальовуватимуться за допомогою напівпрозорих «фантомних блоків»", "litematica.config.visuals.comment.renderCollidingSchematicBlocks": "Якщо увімкнено, блоки у схематиках промальовуватимуться також, коли в клієнтському світі вже є (неправильний) блок \nМабуть, це корисно під час спроби створити щось, де є снігові шари або вода на шляху", @@ -392,7 +310,6 @@ "litematica.config.visuals.comment.renderPlacementBoxSides": "Якщо увімкнути, то блоки розміщення підрегіонів у схематиці матимуть їхні бічні квадрати", "litematica.config.visuals.comment.renderPlacementEnclosingBox": "Якщо увімкнуто, навколо всіх підрегіонів у схематиці (розміщення) промальовуватимуться рамка, що охоплює", "litematica.config.visuals.comment.renderPlacementEnclosingBoxSides": "Якщо увімкнути, то рамка, що охоплює розміщення схематики, матиме свої бічні квадрати", - "litematica.config.visuals.comment.renderSchematicMaxThreads": "Максимальний розмір потоку промальовування схематики\nЦе безпосередньо вплине на загальну багатопотокову продуктивність\n\n§6ВИКОРИСТУЙТЕ ОБЕРЕЖНО: Це почне діяти лише §6після того, як ви залишите гру та знову приєднайтеся", "litematica.config.visuals.comment.renderTranslucentBlockInnerSides": "Якщо увімкнено, сторони моделі також промальовуватимуться для внутрішніх сторін у напівпрозорому режимі", "litematica.config.visuals.comment.schematicOverlayEnableOutlines": "Вмикає промальовування контуру дротяної рамки для накладення блоків схематики", "litematica.config.visuals.comment.schematicOverlayEnableResorting": "Вмикає напівпрозоре сортування для накладення блоків схематики", @@ -407,40 +324,122 @@ "litematica.config.visuals.comment.schematicOverlayTypeWrongBlock": "Вмикає накладення схематики для неправильних блоків", "litematica.config.visuals.comment.schematicOverlayTypeWrongState": "Вмикає накладення схематики для неправильних станів", "litematica.config.visuals.comment.schematicVerifierUseBlockModels": "Примусово використовує моделі блоків для всього в списку результатів перевірки схематики. Зазвичай моделі предметів використовуються для всього, що має предмет,\nа блокові моделі використовуються лише для блоків, якщо у вас немає предмета, а також для квіткових горщиків, щоб побачити вміст", - "litematica.config.visuals.name.enableAreaSelectionBoxesRendering": "enableAreaSelectionBoxesRendering", - "litematica.config.visuals.name.enablePlacementBoxesRendering": "enablePlacementBoxesRendering", - "litematica.config.visuals.name.enableRendering": "enableRendering", - "litematica.config.visuals.name.enableSchematicBlocksRendering": "enableSchematicBlocksRendering", - "litematica.config.visuals.name.enableSchematicFluidRendering": "enableSchematicFluidRendering", - "litematica.config.visuals.name.enableSchematicOverlay": "enableSchematicOverlay", - "litematica.config.visuals.name.enableSchematicRendering": "enableSchematicRendering", - "litematica.config.visuals.name.ghostBlockAlpha": "ghostBlockAlpha", - "litematica.config.visuals.name.ignoreExistingFluids": "ignoreExistingFluids", - "litematica.config.visuals.name.overlayReducedInnerSides": "overlayReducedInnerSides", - "litematica.config.visuals.name.placementBoxSideAlpha": "placementBoxSideAlpha", - "litematica.config.visuals.name.renderAreaSelectionBoxSides": "renderAreaSelectionBoxSides", - "litematica.config.visuals.name.renderBlocksAsTranslucent": "renderBlocksAsTranslucent", - "litematica.config.visuals.name.renderCollidingSchematicBlocks": "renderCollidingSchematicBlocks", - "litematica.config.visuals.name.renderErrorMarkerConnections": "renderErrorMarkerConnections", - "litematica.config.visuals.name.renderErrorMarkerSides": "renderErrorMarkerSides", - "litematica.config.visuals.name.renderPlacementBoxSides": "renderPlacementBoxSides", - "litematica.config.visuals.name.renderPlacementEnclosingBox": "renderPlacementEnclosingBox", - "litematica.config.visuals.name.renderPlacementEnclosingBoxSides": "renderPlacementEnclosingBoxSides", - "litematica.config.visuals.name.renderSchematicMaxThreads": "renderSchematicMaxThreads", - "litematica.config.visuals.name.renderTranslucentBlockInnerSides": "renderTranslucentBlockInnerSides", - "litematica.config.visuals.name.schematicOverlayEnableOutlines": "schematicOverlayEnableOutlines", - "litematica.config.visuals.name.schematicOverlayEnableResorting": "schematicOverlayEnableResorting", - "litematica.config.visuals.name.schematicOverlayEnableSides": "schematicOverlayEnableSides", - "litematica.config.visuals.name.schematicOverlayModelOutline": "schematicOverlayModelOutline", - "litematica.config.visuals.name.schematicOverlayModelSides": "schematicOverlayModelSides", - "litematica.config.visuals.name.schematicOverlayOutlineWidth": "schematicOverlayOutlineWidth", - "litematica.config.visuals.name.schematicOverlayOutlineWidthThrough": "schematicOverlayOutlineWidthThrough", - "litematica.config.visuals.name.schematicOverlayRenderThroughBlocks": "schematicOverlayRenderThroughBlocks", - "litematica.config.visuals.name.schematicOverlayTypeExtra": "schematicOverlayTypeExtra", - "litematica.config.visuals.name.schematicOverlayTypeMissing": "schematicOverlayTypeMissing", - "litematica.config.visuals.name.schematicOverlayTypeWrongBlock": "schematicOverlayTypeWrongBlock", - "litematica.config.visuals.name.schematicOverlayTypeWrongState": "schematicOverlayTypeWrongState", - "litematica.config.visuals.name.schematicVerifierUseBlockModels": "schematicVerifierUseBlockModels", + "litematica.config.info_overlays.comment.blockInfoLinesAlignment": "Вирівнювання накладання рядків інформації про блок", + "litematica.config.info_overlays.comment.blockInfoOverlayAlignment": "Вирівнювання накладення інформації про блок", + "litematica.config.info_overlays.comment.infoHudAlignment": "Вирівнювання «HUD інформації», використовується для переліку матеріалів,\nпозицій невідповідності перевірки схематики тощо", + "litematica.config.info_overlays.comment.toolHudAlignment": "Вирівнювання «інструмента» під час утримання налаштованого «інструмента»", + "litematica.config.info_overlays.comment.blockInfoLinesEnabled": "Якщо увімкнено, накладення інформації про блок у стилі MiniHUD промальовуватиметься для блоку, який розглядається", + "litematica.config.info_overlays.comment.blockInfoLinesFontScale": "Масштаб шрифту для рядків інформації про блок", + "litematica.config.info_overlays.comment.blockInfoLinesOffsetX": "Зміщення x рядків інформації про блок від вибраного краю", + "litematica.config.info_overlays.comment.blockInfoLinesOffsetY": "Зміщення y рядків інформації про блок від вибраного краю", + "litematica.config.info_overlays.comment.blockInfoOverlayOffsetY": "Зсув y накладення інформації про блок від вибраного краю", + "litematica.config.info_overlays.comment.blockInfoOverlayEnabled": "Увімкнути промальовування «Накладання інформації блока», щоб показувати інформацію про перевірений блок або\nмаркер помилки перевірки, утримуючи клавішу «renderInfoOverlay»", + "litematica.config.info_overlays.comment.infoHudMaxLines": "Максимальна кількість інформаційних рядків, які одночасно відображаються на HUD", + "litematica.config.info_overlays.comment.infoHudOffsetX": "Зміщення X інформаційного HUD від краю екрана", + "litematica.config.info_overlays.comment.infoHudOffsetY": "Зміщення Y інформаційного HUD від краю екрана", + "litematica.config.info_overlays.comment.infoHudScale": "Коефіцієнт масштабування для загального інформаційного тексту HUD", + "litematica.config.info_overlays.comment.infoOverlaysTargetFluids": "Якщо увімкнено, накладення інформації про блоки та рядки інформації про\nблоки можуть проводити трасування променів до рідин, а не проходити через них", + "litematica.config.info_overlays.comment.materialListHudMaxLines": "Максимальна кількість предметів, які одночасно промальовуються на інформаційному панелі списку матеріалів", + "litematica.config.info_overlays.comment.materialListHudScale": "Коефіцієнт масштабу для HUD інформації списку матеріалів", + "litematica.config.info_overlays.comment.statusInfoHud": "Увімкнути засіб промальовування інформації про статус HUD, який відображає кілька бітів інформації про стан,\nнаприклад поточний режим шару та стан увімкнених засобів промальовування", + "litematica.config.info_overlays.comment.statusInfoHudAuto": "Дозволити автоматичне миттєве увімкнення HUD інформації про статус «за потреби», наприклад,\nпід час створення місця розташування та відтворення вимкнено", + "litematica.config.info_overlays.comment.toolHudOffsetX": "Зміщення X інформаційного HUD від краю екрана", + "litematica.config.info_overlays.comment.toolHudOffsetY": "Зміщення Y інформаційного HUD від краю екрана", + "litematica.config.info_overlays.comment.toolHudScale": "Коефіцієнт масштабування для тексту інструменту HUD", + "litematica.config.info_overlays.comment.verifierErrorHilightAlpha": "Значення альфа сторінок поля маркера помилки", + "litematica.config.info_overlays.comment.verifierErrorHilightMaxPositions": "Максимальна кількість невідповідних позицій для одночасного промальовування в накладенні перевірки схематики", + "litematica.config.info_overlays.comment.verifierOverlayEnabled": "Увімкнути візуалізацію маркера перевірки схематики", + "litematica.config.info_overlays.comment.warnDisabledRendering": "Чи має відображатися попередження про те, що ви перебуваєте в режимі шару або вимкнено\nдеякі налаштування відтворення, під час завантаження нової схематики чи створення нового розташування", + "litematica.config.colors.comment.areaSelectionBoxSideColor": "Колір полів вибору області, коли вони не виділені", + "litematica.config.colors.comment.hightlightBlockInInventoryColor": "Колір підсвічування для блока, що переглядається", + "litematica.config.colors.comment.materialListHudItemCountsColor": "Колір тексту підрахунку предметів в інформаційному HUD списку матеріалів", + "litematica.config.colors.comment.schematicRebuildBreakPlaceOverlayColor": "Колір накладення селектора розриву або розміщення блоків у режимі перебудови схематики", + "litematica.config.colors.comment.schematicRebuildBreakExceptPlaceOverlayColor": "Колір режиму перебудови схематики розбиває всі блоки, крім цільового накладання селектора", + "litematica.config.colors.comment.schematicRebuildReplaceOverlayColor": "Колір накладання селектора заміни в режимі перебудови схематики", + "litematica.config.colors.comment.schematicOverlayColorExtra": "Колір накладення блоків для додаткових блоків", + "litematica.config.colors.comment.schematicOverlayColorMissing": "Колір накладання блоків для відсутніх блоків", + "litematica.config.colors.comment.schematicOverlayColorWrongBlock": "Колір накладення блоків для неправильних блоків", + "litematica.config.colors.comment.schematicOverlayColorWrongState": "Колір накладання блоків для неправильних станів блоків", + "litematica.config.hotkeys.comment.addSelectionBox": "Додатинове поле вибору (позиція 1) тут", + "litematica.config.hotkeys.comment.cloneSelection": "Швидко клонувати поточну виділену область\nЦе просто створює схематику лише в пам'яті, а потім створює розміщення цієї схематики\nта вибирає її і також перемикає з режиму інструмента в режим «Вставити»", + "litematica.config.hotkeys.comment.deleteSelectionBox": "Видалити вибране поле", + "litematica.config.hotkeys.comment.easyPlaceUseKey": "Коли easyPlaceMode увімкнено, цей ключ використовується для розміщення блоків", + "litematica.config.hotkeys.comment.easyPlaceToggle": "Дозволяє швидко вмикати/вимикати режим «Легке розміщення»", + "litematica.config.hotkeys.comment.executeOperation": "Виконати поточну вибрану операцію інструменту з\nпоточним виділенням або розміщення у режимах заповнення, заміни, вставки схематики тощо", + "litematica.config.hotkeys.comment.invertGhostBlockRenderState": "Інвертує стан промальовування схематики/фантомного блоку доки це утримується", + "litematica.config.hotkeys.comment.invertOverlayRenderState": "Інвертує стан промальовування накладання, коли це утримується", + "litematica.config.hotkeys.comment.layerModeNext": "Перемкнути режим промальовування (усі, шари) вперед", + "litematica.config.hotkeys.comment.layerModePrevious": "Перемкнути режим відтворення (усі, шари) назад", + "litematica.config.hotkeys.comment.layerNext": "Перемістити вибраний шар вгору", + "litematica.config.hotkeys.comment.layerPrevious": "Перемістити вибраний шар вниз", + "litematica.config.hotkeys.comment.layerSetHere": "Установити шар промальовування на поточну позицію гравця", + "litematica.config.hotkeys.comment.nudgeSelectionNegative": "Зрушити поточне виділення в «негативному» напрямку\nЦе в основному те саме, що коліщатко миші вниз з натиснутим модифікатором «Зміщення»", + "litematica.config.hotkeys.comment.nudgeSelectionPositive": "Зрушити поточне виділення в «позитивному» напрямку\nЦе в основному те саме, що коліщатко миші вгору з натиснутим модифікатором «Переміщення»", + "litematica.config.hotkeys.comment.moveEntireSelection": "Перемістити весь поточний вибір сюди", + "litematica.config.hotkeys.comment.openGuiAreaSettings": "Відкрити меню налаштувань області для поточної вибраної області", + "litematica.config.hotkeys.comment.openGuiLoadedSchematics": "Відкрити меню із завантаженою схематикою", + "litematica.config.hotkeys.comment.openGuiMainMenu": "Відкрити головне меню Litematica", + "litematica.config.hotkeys.comment.openGuiMaterialList": "Відкрити меню списку матеріалів для поточного вибраного розміщення схематики", + "litematica.config.hotkeys.comment.openGuiPlacementSettings": "Відкрити меню налаштувань розміщення для поточного вибраного місця розташування або підрегіону", + "litematica.config.hotkeys.comment.openGuiSchematicPlacements": "Відкрити меню розміщення схематик", + "litematica.config.hotkeys.comment.openGuiSchematicProjects": "Відкрити меню проєктів", + "litematica.config.hotkeys.comment.openGuiSchematicVerifier": "Відкрити меню перевірки схематики для поточного вибраного розміщення схематики", + "litematica.config.hotkeys.comment.openGuiSelectionManager": "Відкрити меню менеджера вибору області", + "litematica.config.hotkeys.comment.openGuiSettings": "Відкрити меню налантувань", + "litematica.config.hotkeys.comment.operationModeChangeModifier": "Клавіша-модифікатор для швидкої зміни режиму роботи\nУтримуйте її та прокручуйте, утримуючи «предмет-інструмент», щоб швидко перемикати режим", + "litematica.config.hotkeys.comment.pickBlockFirst": "Клавіша для вибору блоку першого блоку променю схематики, до якого відстежується", + "litematica.config.hotkeys.comment.pickBlockLast": "Ключ для вибору блоку останнього блоку променю схематики, до якого відстежується, перед першим\n(можливим) променем клієнтського світу, до якого відстежується промінь блоку\nЗагалом це дасть вам блок, який ви можна розмістити проти існуючого блоку", + "litematica.config.hotkeys.comment.pickBlockToggle": "Гаряча клавіша для перемикання опції перемикання блоку вибору в «Загальні». Це надається як швидкий спосіб\nувімкнути або вимкнути клавіші вибору блоку, якщо вони чомусь заважають", + "litematica.config.hotkeys.comment.renderInfoOverlay": "Клавіша, яка вмикає перемальовування накладення інформації про блок\nВикористовуйте «Нічого», щоб не вимагати натискання клавіші\nВимкніть параметр із подібною назвою у «Візуал», щоб вимкнути накладення повністю", + "litematica.config.hotkeys.comment.renderOverlayThroughBlocks": "Гаряча клавіша, яка дозволяє накладенням промальовувати блоки\nЦе лише швидший спосіб тимчасово ввімкнути те саме,\nщо робить параметр «schematicOverlayRenderThroughBlocks» у «Візуал»", + "litematica.config.hotkeys.comment.rerenderSchematic": "Гаряча клавіша для оновлення/перемальовування лише схематики,\nзамість того, щоб оновлювати ванілльний рельєф також за допомогою F3 + A", + "litematica.config.hotkeys.comment.saveAreaAsInMemorySchematic": "Зберегти поточний вибір області як схематику в пам'яті", + "litematica.config.hotkeys.comment.saveAreaAsSchematicToFile": "Зберегти поточний вибір області як схематику у файл", + "litematica.config.hotkeys.comment.schematicEditBreakAllExcept": "Клавіша-модифікатор для активації режиму/функції «розірвати все, крім» у режимі інструмента редагування схематики\nЗагалом, коли ви утримуєте цю клавішу та натискаєте блок схематики,\nусі інші блоки, крім цей блок буде видалено зі схематики", + "litematica.config.hotkeys.comment.schematicEditBreakPlaceAll": "Клавіша-модифікатор для активації функції «розбити всі ідентичні блоки» в режимі інструмента редагування схематики", + "litematica.config.hotkeys.comment.schematicEditBreakPlaceDirection": "Клавіша-модифікатор для активації функції направленого/безперервного розриву або розміщення в режимі інструмента редагування схематики", + "litematica.config.hotkeys.comment.schematicEditReplaceAll": "Клавіша-модифікатор для активації режиму/функції заміни «замінити всі ідентичні»\nв режимі інструмента редагування схематики", + "litematica.config.hotkeys.comment.schematicEditReplaceBlock": "Клавіша-модифікатор для активації режиму/функції заміни «замінити тип блоку»\nв режимі інструмента редагування схематики", + "litematica.config.hotkeys.comment.schematicEditReplaceDirection": "Клавіша-модифікатор для активації режиму/функції спрямованої/безперервної\nзаміни в режимі інструмента редагування схематики", + "litematica.config.hotkeys.comment.schematicPlacementRotation": "При натисканні схематика повертається на 90 градусів за годинниковою стрілкою", + "litematica.config.hotkeys.comment.schematicPlacementMirror": "Схематика дзеркально перевертається під час натискання", + "litematica.config.hotkeys.comment.schematicVersionCycleModifier": "Клавіша-модифікатор, яку потрібно утримувати, щоб мати можливість використовувати\nколіщатко миші для циклічного переходу між версіями схематики в режимі інструмента керування версіями", + "litematica.config.hotkeys.comment.schematicVersionCycleNext": "Гаряча клавіша для переходу до наступної версії схематики в режимі інструмента керування версіями", + "litematica.config.hotkeys.comment.schematicVersionCyclePrevious": "Гаряча клавіша для переходу до наступної версії схематики в режимі інструмента керування версіями", + "litematica.config.hotkeys.comment.selectionGrabModifier": "Клавіша-модифікатор, яку потрібно утримувати, щоб «захопити» вибрану область або кут для переміщення курсором", + "litematica.config.hotkeys.comment.selectionGrow": "Гаряча клавіша для автоматичного збільшення поля вибору навколо будь-яких суміжних/діагонально з'єднаних блоків", + "litematica.config.hotkeys.comment.selectionGrowModifier": "Клавіша-модифікатор, яку потрібно утримувати, щоб збільшити або зменшити поле вибору під час прокручування", + "litematica.config.hotkeys.comment.selectionNudgeModifier": "Клавіша-модифікатор, яку потрібно утримувати під час прокручування для переміщення вибраної області чи кута", + "litematica.config.hotkeys.comment.selectionModeCycle": "Змінити режим між кутами та прямокутним у режимі виділення області", + "litematica.config.hotkeys.comment.selectionShrink": "Гаряча клавіша, щоб зменшити рамку виділення так, щоб не було порожнього місця (порожніх шарів) з будь-якого боку", + "litematica.config.hotkeys.comment.setAreaOrigin": "Установити/перемістити початкову точку вибору поточної області на позицію гравця", + "litematica.config.hotkeys.comment.setSelectionBoxPosition1": "Установити першу позицію вибраного полі на позицію гравця", + "litematica.config.hotkeys.comment.setSelectionBoxPosition2": "Установити другу позицію поточного вибраного поля на позицію гравця", + "litematica.config.hotkeys.comment.toggleAllRendering": "Увімкнути/вимкнути промальовування всього", + "litematica.config.hotkeys.comment.toggleAreaSelectionBoxesRendering": "Увімкнути/вимкнути промальовування полів вибораної області", + "litematica.config.hotkeys.comment.toggleSchematicRendering": "Увімкнути/вимкнути промальовування схематики (блоки та накладання)", + "litematica.config.hotkeys.comment.toggleInfoOverlayRendering": "Увімкнути промальовування накладання інформації (для інформації про блок, наведений курсором)", + "litematica.config.hotkeys.comment.toggleOverlayRendering": "Увімкнути/вимкнути промальовування накладання блока", + "litematica.config.hotkeys.comment.toggleOverlayOutlineRendering": "Увімкнути/вимкнути промальовування контуру накладання блока", + "litematica.config.hotkeys.comment.toggleOverlaySideRendering": "Увімкнути/вимкнути промальовування сторони накладання блока", + "litematica.config.hotkeys.comment.togglePlacementBoxesRendering": "Увімкнути/вимкнути промальовування блоків розміщення схематики", + "litematica.config.hotkeys.comment.togglePlacementRestriction": "Гаряча клавіша для перемикання режиму обмеження розміщення", + "litematica.config.hotkeys.comment.toggleSchematicBlockRendering": "Увімкнути/вимкнути промальовування блока схематики", + "litematica.config.hotkeys.comment.toggleSignTextPaste": "Перемикач значення параметра signTextPaste (у категорії «Загальні»)", + "litematica.config.hotkeys.comment.toggleTranslucentRendering": "Вимкнути прозоре та непрозоре промальовування фантомних блоків", + "litematica.config.hotkeys.comment.toggleVerifierOverlayRendering": "Увімкнути промальовування накладання «Перевірка схематики»", + "litematica.config.hotkeys.comment.toolEnabledToggle": "Сполучення клавіш для увімкнення/вимкнення функції «інструмент»", + "litematica.config.hotkeys.comment.toolPlaceCorner1": "Кнопка, яка використовується, утримуючи предмета «інструмент», щоб розмістити основний/перший кут", + "litematica.config.hotkeys.comment.toolPlaceCorner2": "Кнопка, яка використовується, утримуючи «інструмент» для розміщення другого кута", + "litematica.config.hotkeys.comment.toolSelectElements": "Кнопка, яка використовується для вибору кутів або рамок під час утримування предмета «інструмент»", + "litematica.config.hotkeys.comment.toolSelectModifierBlock1": "Клавіша-модифікатор, яку потрібно утримувати під час використання гарячої клавіші\n«toolSelectElements», щоб вибрати тип основного блоку для використання в деяких режимах інструмента", + "litematica.config.hotkeys.comment.toolSelectModifierBlock2": "Клавіша-модифікатор, яку потрібно утримувати під час використання гарячої клавіші\n«toolSelectElements», щоб вибрати тип додаткового блоку для використання в деяких режимах інструмента", + "litematica.config.hotkeys.comment.unloadCurrentSchematic": "Вивантажити схематику поточного вибраного розташування та,\nтаким чином, також видалити всі розміщення, створені з нього", + "litematica.config.generic.prettyName.pickBlockEnabled": "Вибір гарячих клавішей блока", + "litematica.config.generic.prettyName.easyPlaceMode": "Режим легкого розміщення", + "litematica.config.generic.prettyName.placementRestriction": "Обмежене розміщення", + "litematica.config.generic.prettyName.signTextPaste": "Вставити текст табличок", + "litematica.config.generic.prettyName.toolItemEnabled": "Предмет-інструмент увімкнено", "litematica.config.visuals.prettyName.enableAreaSelectionBoxesRendering": "Промальовування кубів виділеної області", "litematica.config.visuals.prettyName.enablePlacementBoxesRendering": "Промальовування кубів розміщення схематики", "litematica.config.visuals.prettyName.enableRendering": "Промальовування всього", @@ -448,15 +447,14 @@ "litematica.config.visuals.prettyName.enableSchematicFluidRendering": "Промальовування рідин схематики", "litematica.config.visuals.prettyName.enableSchematicOverlay": "Промальовування накладання схематики", "litematica.config.visuals.prettyName.enableSchematicRendering": "Промальовування схематики", + "litematica.config.visuals.prettyName.renderAOModernEnable": "AO Modern Processor", "litematica.config.visuals.prettyName.renderBlocksAsTranslucent": "Промальовування прозорих блоків схематики", "litematica.config.visuals.prettyName.schematicOverlayEnableOutlines": "Накладання контурів схематики", "litematica.config.visuals.prettyName.schematicOverlayEnableResorting": "Накладання прозорого сортування схематики", "litematica.config.visuals.prettyName.schematicOverlayEnableSides": "Накладання сторін схематики", - "litematica.error.area_editor.create_sub_region.exists": "Підрегіон з назвою «%s» уже існує", - "litematica.error.area_editor.no_selection": "«Вибір області» не активовано", - "litematica.error.area_editor.open_gui.no_selection": "Зараз у «Режим виділення: Нормальний», але наразі ніяка область не виділена", - "litematica.error.area_editor.rename_sub_region.exists": "Не вдалося перейменувати підрегіон:\n«%s» уже існує", - "litematica.error.area_editor.switch_mode.no_selection": "Неможливо перейти в «Режим виділення: Нормальний», оскільки наразі не виділено ніяка області\nВиберіть область або створіть новий вибір у браузері виділення області", + "litematica.config.info_overlays.prettyName.blockInfoOverlayEnabled": "Накладання промальовування інформації блока", + "litematica.config.info_overlays.prettyName.verifierOverlayEnabled": "Перевірка накладання промальовування", + "litematica.config.hotkeys.prettyName.toggleAllRendering": "Промальовування всього", "litematica.error.area_selection.copy_failed": "Не вдалося копіювати виділене", "litematica.error.area_selection.create_failed": "Не вдалося створити нове виділення з назвою «%s», файл уже існує", "litematica.error.area_selection.failed_to_load": "Не вдалося завантажити вибрану область", @@ -469,12 +467,17 @@ "litematica.error.generic.failed_to_delete_file": "Не вдалося видалити файл «%s»", "litematica.error.generic.failed_to_sort_list_of_ignored_states": "Не вдалося сортувати список ігнорованих станів", "litematica.error.generic.schematic_world_not_loaded": "Схематику не було завантажено в світ", - "litematica.error.schematic.create.no_selections": "Немає дійсних вибраних регіонів!", - "litematica.error.schematic_conversion.litematic_to_litematica.failed_to_downgrade_litematic": "Не вдалося понизити схематику Litematica", + "litematica.error.area_editor.create_sub_region.exists": "Підрегіон з назвою «%s» уже існує", + "litematica.error.area_editor.no_selection": "«Вибір області» не активовано", + "litematica.error.area_editor.open_gui.no_selection": "Зараз у «Режим виділення: Нормальний», але наразі ніяка область не виділена", + "litematica.error.area_editor.rename_sub_region.exists": "Не вдалося перейменувати підрегіон:\n«%s» уже існує", + "litematica.error.area_editor.switch_mode.no_selection": "Неможливо перейти в «Режим виділення: Нормальний», оскільки наразі не виділено ніяка області\nВиберіть область або створіть новий вибір у браузері виділення області", "litematica.error.schematic_conversion.litematic_to_litematica.failed_to_read_litematic": "Не вдалося завантажити схематику Litematica", + "litematica.error.schematic_conversion.litematic_to_litematica.failed_to_downgrade_litematic": "Не вдалося понизити схематику Litematica", "litematica.error.schematic_conversion.schematic_to_litematica.failed_to_create_schematic": "Не вдалося створити схематику Litematica", "litematica.error.schematic_conversion.schematic_to_litematica.failed_to_read_schematic": "Не вдалося завантажити схематику", "litematica.error.schematic_conversion.structure_to_litematica_failed": "Не вдалося перетворити структуру на схематику Litematica", + "litematica.error.schematic.create.no_selections": "Немає дійсних вибраних регіонів!", "litematica.error.schematic_load.cant_read_file": "Неможливо зчитати файл схематики «%s» (не існує або проблема з дозволом)", "litematica.error.schematic_load.no_schematic_selected": "Файл схематики не вибрано!", "litematica.error.schematic_load.no_schematic_version_information": "На схематиці немає інформації про версію, і її неможливо безпечно завантажити!", @@ -483,30 +486,35 @@ "litematica.error.schematic_manager.schematic_export.unsupported_type": "Лише схематики Litematica можна експортувати в інші формати!", "litematica.error.schematic_manager.schematic_import.unsupported_type": "Вибраний тип схематики не підтримується для імпорту!", "litematica.error.schematic_placements.remove_fail_locked": "Розміщення заблоковано!\n- Утримуйте Shift, щоб примусово видалити", + "litematica.error.schematic_save.directory_doesnt_exist": "Каталогу «%s» не існує", + "litematica.error.schematic_save.file_already_exists": "Файл «%s» вже існує", + "litematica.error.schematic_save.invalid_directory": "Недійсний каталог «%s»", + "litematica.error.schematic_save.invalid_schematic_name": "Недійсна назва схематики «%s»", + "litematica.error.schematic_save.schematic_creation_failed": "Не вдалося створити схематику!", + "litematica.error.schematic_read_from_file_failed.cant_read": "Не вдалося зчитати схематику з файлу «%s»", + "litematica.error.schematic_read_from_file_failed.exception": "Виняток під час спроби зчитати схематику з файлу «%s»", + "litematica.error.schematic_read_from_file_failed.no_file": "Не вдалося зчитати схематику з файлу: файл відсутній (схематика в пам’яті?)", "litematica.error.schematic_projects.empty_selection": "Вибрана область порожня (0 підрегіонів)", "litematica.error.schematic_projects.failed_to_load_project": "Не вдалося завантажити проєкт", "litematica.error.schematic_projects.failed_to_load_schematic": "Не вдалося завантажити схематику для поточної версії", "litematica.error.schematic_projects.failed_to_rename_project_file_exception": "Не вдалося перейменувати файл проєкту на «%s» (виняток)", "litematica.error.schematic_projects.failed_to_rename_project_file_exists": "Не можна перейменувати проєкт на «%s», файл уже існує", - "litematica.error.schematic_projects.in_projects_mode_but_no_project_open": "Зараз у режимі VCS схематики, але наразі немає відкритого проєкту", "litematica.error.schematic_projects.invalid_project_directory": "Недійсний або неіснуючий каталог проєкту", "litematica.error.schematic_projects.no_project_open": "Проєкт не відкрито", + "litematica.error.schematic_projects.in_projects_mode_but_no_project_open": "Зараз у режимі VCS схематики, але наразі немає відкритого проєкту", "litematica.error.schematic_projects.null_player": "Недійсний гравець", "litematica.error.schematic_projects.project_already_exists": "Проєкт «%s» вже існує", "litematica.error.schematic_projects.save_already_in_progress": "Збереження вже триває", - "litematica.error.schematic_read_from_file_failed.cant_read": "Не вдалося зчитати схематику з файлу «%s»", - "litematica.error.schematic_read_from_file_failed.exception": "Виняток під час спроби зчитати схематику з файлу «%s»", - "litematica.error.schematic_read_from_file_failed.no_file": "Не вдалося зчитати схематику з файлу: файл відсутній (схематика в пам’яті?)", - "litematica.error.schematic_save.directory_doesnt_exist": "Каталогу «%s» не існує", - "litematica.error.schematic_save.file_already_exists": "Файл «%s» вже існує", - "litematica.error.schematic_save.invalid_directory": "Недійсний каталог «%s»", - "litematica.error.schematic_save.invalid_schematic_name": "Недійсна назва схематики «%s»", - "litematica.error.schematic_save.schematic_creation_failed": "Не вдалося створити схематику!", "litematica.error.schematic_write_to_file_failed.directory_creation_failed": "Не вдалося створити каталог «%s»", "litematica.error.schematic_write_to_file_failed.exception": "Не вдалося записати схематику у файл «%s» (виняток)", "litematica.error.schematic_write_to_file_failed.exists": "Не вдалося записати схематику у файл «%s», файл уже існує", "litematica.error.structure_write_to_file_failed.exception": "Не вдалося записати структуру у файл «%s» (виняток)", "litematica.error.structure_write_to_file_failed.exists": "Не вдалося записати структуру у файл «%s», файл уже існує", + "litematica.hotkeys.category.generic_hotkeys": "Загальні гарячі клавіші", + "litematica.info.schematic_load.schematic_loaded": "Схематика «%s» успішно завантажена в пам'ять", + "litematica.info.schematic_manager.preview.right_click_to_cancel": "- Клацніть ПКМ, щоб скасувати незавершену операцію\n- Ctrl + Alt + Shift + клацніть, щоб установити мініатюру з існуючого зображення PNG під назвою «thumb.png» з того самого каталогу, де знаходиться файл схематики", + "litematica.info.schematic_manager.preview.set_preview_by_taking_a_screenshot": "Використовуйте звичайну клавішу знімка екрана, щоб установити зображення\nАбо клацніть ПКМ по «Установити попередній перегляд», щоб скасувати налаштування зображення", + "litematica.info.schematic_manager.preview.success": "Зображення успішно встановлено", "litematica.gui.button.area_editor.analyze_area": "Проаналізувати область", "litematica.gui.button.area_editor.change_corner_mode": "Режим кутів: %s", "litematica.gui.button.area_editor.change_selection_mode": "Режим вибору: %s", @@ -520,7 +528,6 @@ "litematica.gui.button.area_selections.create_new_selection": "Новий вибір", "litematica.gui.button.area_selections.create_selection_from_placement": "Від розміщення", "litematica.gui.button.area_selections.unselect": "Не вибрано", - "litematica.gui.button.cancel": "Скасувати", "litematica.gui.button.change_menu.area_editor": "Редактор областей", "litematica.gui.button.change_menu.configuration_menu": "Меню налаштувань", "litematica.gui.button.change_menu.load_schematics_to_memory": "Завантажити схематику", @@ -536,15 +543,8 @@ "litematica.gui.button.config_gui.hotkeys": "Гарячі клавіші", "litematica.gui.button.config_gui.info_overlays": "Інформація про шари", "litematica.gui.button.config_gui.render_layers": "Промалювати шари", - "litematica.gui.button.config_gui.test": "Тест", "litematica.gui.button.config_gui.visuals": "Візуал", - "litematica.gui.button.configure": "Налаштування", - "litematica.gui.button.copy": "Копіювати", - "litematica.gui.button.create_directory": "Створити новий каталог", - "litematica.gui.button.create_placement": "Створити розміщення", - "litematica.gui.button.delete": "Видалити", - "litematica.gui.button.disable": "Вимкнути", - "litematica.gui.button.enable": "Увімкнути", + "litematica.gui.button.config_gui.test": "Тест", "litematica.gui.button.hover.area_editor.shift_for_in_memory": "Утримуйте Shift, щоб створити схематику лише в пам'яті", "litematica.gui.button.hover.area_selections.unselect": "Скасовує виділення поточної області виділення", "litematica.gui.button.hover.material_list.clear_cache": "Очищає кеш матеріалів\nЗазвичай це не потрібно\nЦе можна використовувати замість видалення файлу «material_cache.nbt» у випадку, якщо кеш містить неправильні дані, як предмети, збережені для блоків, які їх не повинні мати, як головки поршня", @@ -559,8 +559,6 @@ "litematica.gui.button.hover.schematic_projects.move_origin_to_player": "Перемістіть початок проєкту до поточної позиції гравця\nЦе також перемістить вибір і розташування області", "litematica.gui.button.hover.schematic_projects.place_to_world_warning": "§6Попередження: це призведе до видалення/перезапису поточних блоків§6 у світі в межах області, яка була раніше §6розміщена з версії або збережена як версія §6 (загалом останній «вибір ефективної області»)", "litematica.gui.button.hover.schematic_projects.save_new_version": "Зберегти нову схематику/версію до поточного проєкту", - "litematica.gui.button.import": "Імпорт", - "litematica.gui.button.load_schematic_to_memory": "Завантажити схематику", "litematica.gui.button.material_list": "Список матеріалів", "litematica.gui.button.material_list.clear_cache": "Очистити кеш", "litematica.gui.button.material_list.clear_ignored": "Очистити ігноровані", @@ -570,30 +568,19 @@ "litematica.gui.button.material_list.refresh_list": "Оновити", "litematica.gui.button.material_list.toggle_info_hud": "HUD інфо: %s", "litematica.gui.button.material_list.write_to_file": "Вписати в файл", - "litematica.gui.button.mirror_value": "Відзеркалити: %s", - "litematica.gui.button.move_to_player": "Перемістити гравця", - "litematica.gui.button.ok": "Продовжити", "litematica.gui.button.placement_sub.placement_configuration": "Налаштування розміщення", "litematica.gui.button.placement_sub.reset_sub_region_placement": "Скинути підрегіони", "litematica.gui.button.placement_sub.slice_type": "Шар: %s", - "litematica.gui.button.reload": "Перезавантажити", - "litematica.gui.button.remove": "Видалити", - "litematica.gui.button.remove_placement": "Видалити розміщення", - "litematica.gui.button.rename": "Перейменувати", - "litematica.gui.button.rotation_value": "Оберт: %s", - "litematica.gui.button.save_new_schematic_version": "Зберегти версію", - "litematica.gui.button.save_schematic": "Зберегти схематику", - "litematica.gui.button.save_to_file": "Зберегти в файл", "litematica.gui.button.schematic_manager.export_as": "Експортувати як:", "litematica.gui.button.schematic_placement.abbr.rendering": "К", - "litematica.gui.button.schematic_placement.hover.enclosing_box": "Обмежене промальовування кубів: %s", - "litematica.gui.button.schematic_placement.hover.lock": "Блокування розміщення запобігає його переміщенню або іншим чином змінюванити(випадково)", - "litematica.gui.button.schematic_placement.hover.rendering": "Промальовування: %s\nЗауважте, що це працює трохи дивно і не перешкоджає промальовуванню об’єктів\nЗазвичай вам слід повністю вимкнути розміщення", "litematica.gui.button.schematic_placement.ignore_entities": "Ігнорувати сутности: %s", "litematica.gui.button.schematic_placement.region_enabled": "Регіон: %s", "litematica.gui.button.schematic_placement.reset_sub_region_placements": "Скинути усі пвдрегіони", "litematica.gui.button.schematic_placement.toggle_all_off": "Усе §cВИМК.§r", "litematica.gui.button.schematic_placement.toggle_all_on": "Усе §aУВІМК.§r", + "litematica.gui.button.schematic_placement.hover.enclosing_box": "Обмежене промальовування кубів: %s", + "litematica.gui.button.schematic_placement.hover.lock": "Блокування розміщення запобігає його переміщенню або іншим чином змінюванити(випадково)", + "litematica.gui.button.schematic_placement.hover.rendering": "Промальовування: %s\nЗауважте, що це працює трохи дивно і не перешкоджає промальовуванню об’єктів\nЗазвичай вам слід повністю вимкнути розміщення", "litematica.gui.button.schematic_placements.configure": "Налаштування", "litematica.gui.button.schematic_placements.disable": "Вимкнути", "litematica.gui.button.schematic_placements.locked": "Заблоковано: %s", @@ -611,7 +598,6 @@ "litematica.gui.button.schematic_projects.open_project_browser": "VCS браузер проєктів", "litematica.gui.button.schematic_projects.place_to_world": "Розмістити в світі", "litematica.gui.button.schematic_projects.save_version": "Зберегти версію", - "litematica.gui.button.schematic_verifier": "Перевірка схематики", "litematica.gui.button.schematic_verifier.ignore": "Ігнорувати", "litematica.gui.button.schematic_verifier.range_type": "Діапазон: %s", "litematica.gui.button.schematic_verifier.reset_ignored": "Скинути ігнори", @@ -620,84 +606,106 @@ "litematica.gui.button.schematic_verifier.start": "Почати перевірку", "litematica.gui.button.schematic_verifier.stop": "Зупинити перевірку", "litematica.gui.button.schematic_verifier.toggle_info_hud": "HUD інфо: %s", + "litematica.gui.button.cancel": "Скасувати", + "litematica.gui.button.configure": "Налаштування", + "litematica.gui.button.copy": "Копіювати", + "litematica.gui.button.create_directory": "Створити новий каталог", + "litematica.gui.button.create_placement": "Створити розміщення", + "litematica.gui.button.delete": "Видалити", + "litematica.gui.button.disable": "Вимкнути", + "litematica.gui.button.enable": "Увімкнути", + "litematica.gui.button.import": "Імпорт", + "litematica.gui.button.load_schematic_to_memory": "Завантажити схематику", + "litematica.gui.button.mirror_value": "Відзеркалити: %s", + "litematica.gui.button.move_to_player": "Перемістити гравця", + "litematica.gui.button.ok": "Продовжити", + "litematica.gui.button.reload": "Перезавантажити", + "litematica.gui.button.remove": "Видалити", + "litematica.gui.button.remove_placement": "Видалити розміщення", + "litematica.gui.button.rename": "Перейменувати", + "litematica.gui.button.rotation_value": "Оберт: %s", + "litematica.gui.button.save_new_schematic_version": "Зберегти версію", + "litematica.gui.button.save_schematic": "Зберегти схематику", + "litematica.gui.button.save_to_file": "Зберегти в файл", + "litematica.gui.button.schematic_verifier": "Перевірка схематики", "litematica.gui.button.set_preview": "Вибрати зображенн", "litematica.gui.button.tool_mode": "Режим обладнання: %s", "litematica.gui.button.unload": "Розвантажити", "litematica.gui.button.unlocked": "Розблоковано", "litematica.gui.label.area_editor.box_name": "Назва підрегіону", + "litematica.gui.label.area_editor.selection_name": "Вибрати назву", "litematica.gui.label.area_editor.corner_1": "Кут 1", "litematica.gui.label.area_editor.corner_2": "Кут 2", - "litematica.gui.label.area_editor.dimensions": "Виміри", "litematica.gui.label.area_editor.origin": "Початково", + "litematica.gui.label.area_editor.dimensions": "Виміри", "litematica.gui.label.area_editor.pos1": "Кут 1", "litematica.gui.label.area_editor.pos2": "Кут 2", - "litematica.gui.label.area_editor.selection_name": "Вибрати назву", "litematica.gui.label.area_editor.sub_regions": "Підрегіони (%s)", - "litematica.gui.label.area_selection.mode.normal": "Нормальний", - "litematica.gui.label.area_selection.mode.simple": "Простий", - "litematica.gui.label.area_selection_box_count": "Куби: %d", "litematica.gui.label.area_selection_manager.current_selection": "Вибрана область: %s", + "litematica.gui.label.area_selection_box_count": "Куби: %d", "litematica.gui.label.area_selection_origin": "Початково: %s", + "litematica.gui.label.area_selection.mode.normal": "Нормальний", + "litematica.gui.label.area_selection.mode.simple": "Простий", "litematica.gui.label.block_info.state_client": "Стан блоків у клієнтському світі", "litematica.gui.label.block_info.state_schematic": "Стан блоків світу схематики", "litematica.gui.label.block_info_list_type.all": "Усі", "litematica.gui.label.block_info_list_type.render_layers": "Промальовувати шари", - "litematica.gui.label.data_fixer_mode.always": "Завжди", - "litematica.gui.label.data_fixer_mode.below_112X": "Лише нижче 1.12.x", - "litematica.gui.label.data_fixer_mode.below_113X": "Лише нижче 1.13.x", - "litematica.gui.label.data_fixer_mode.below_116X": "Лише нижче 1.16.x", - "litematica.gui.label.data_fixer_mode.below_117X": "Лише нижче 1.17.x", - "litematica.gui.label.data_fixer_mode.below_119X": "Лише нижче 1.19.x", - "litematica.gui.label.data_fixer_mode.below_1205": "Лише нижче 1.20.5", - "litematica.gui.label.data_fixer_mode.below_120X": "Лише нижче 1.20.x", - "litematica.gui.label.data_fixer_mode.never": "Ніколи", "litematica.gui.label.easy_place_protocol.auto": "Авто", "litematica.gui.label.easy_place_protocol.none": "Нічого", "litematica.gui.label.easy_place_protocol.slabs_only": "Лише плити", "litematica.gui.label.easy_place_protocol.v2": "Версія 2", "litematica.gui.label.easy_place_protocol.v3": "Версія 3", + "litematica.gui.label.data_fixer_mode.always": "Завжди", + "litematica.gui.label.data_fixer_mode.below_1205": "Лише нижче 1.20.5", + "litematica.gui.label.data_fixer_mode.below_120X": "Лише нижче 1.20.x", + "litematica.gui.label.data_fixer_mode.below_119X": "Лише нижче 1.19.x", + "litematica.gui.label.data_fixer_mode.below_117X": "Лише нижче 1.17.x", + "litematica.gui.label.data_fixer_mode.below_116X": "Лише нижче 1.16.x", + "litematica.gui.label.data_fixer_mode.below_113X": "Лише нижче 1.13.x", + "litematica.gui.label.data_fixer_mode.below_112X": "Лише нижче 1.12.x", + "litematica.gui.label.data_fixer_mode.never": "Ніколи", "litematica.gui.label.loaded_schematic.modified_on": "§6Модифіковано на %s§r", "litematica.gui.label.material_list.abbr.shulker_box": "Шалкерові коробки", + "litematica.gui.label.material_list.title.available": "В наявності", + "litematica.gui.label.material_list.title.item": "Предмет", + "litematica.gui.label.material_list.title.missing": "Відсутньо", + "litematica.gui.label.material_list.title.total": "Всього", "litematica.gui.label.material_list.multiplier": "Множник:", "litematica.gui.label.material_list.name": "Назва", "litematica.gui.label.material_list.progress": "Прогрес: %s", "litematica.gui.label.material_list.progress.done": "Завершено %s", "litematica.gui.label.material_list.progress.mismatch": "Невідповідно %s", "litematica.gui.label.material_list.progress.missing": "Відсутньо %s", - "litematica.gui.label.material_list.title.available": "В наявності", - "litematica.gui.label.material_list.title.item": "Предмет", - "litematica.gui.label.material_list.title.missing": "Відсутньо", - "litematica.gui.label.material_list.title.total": "Всього", "litematica.gui.label.material_list.total": "Всього: %s предметів", "litematica.gui.label.origin.auto": "Авто", "litematica.gui.label.origin.manual": "Вручну", "litematica.gui.label.paste_nbt_behavior.none": "Нічого", - "litematica.gui.label.paste_nbt_behavior.place_clone": "Розмісти і клонувати", "litematica.gui.label.paste_nbt_behavior.place_data_modify": "Розмістити і модифікувати дані", - "litematica.gui.label.placement_settings.placement_origin": "Початкове розміщення", + "litematica.gui.label.paste_nbt_behavior.place_clone": "Розмісти і клонувати", "litematica.gui.label.placement_sub.region_name": "Початкова назва: %s", "litematica.gui.label.placement_sub.region_position": "Початкова позиція", "litematica.gui.label.placement_sub.region_size": "Початковий розмір: %s", + "litematica.gui.label.placement_settings.placement_origin": "Початкове розміщення", "litematica.gui.label.render_layers.hotkey": "Гарячі клавіші", "litematica.gui.label.render_layers.hover.hotkey": "Гарячі клавіші наступного/попереднього шару впливатимуть на цю межу\nЯкщо обидві не вибрані, гарячі клавіші впливатимуть на межу, яка є найближчою до гравця", "litematica.gui.label.replace_behavior.all": "Усе", "litematica.gui.label.replace_behavior.none": "Нічого", "litematica.gui.label.replace_behavior.with_non_air": "Без повітря", + "litematica.gui.label.schematic_info.schematic_author": "Схематика від §f%s§r", "litematica.gui.label.schematic_info.description": "Опис:", "litematica.gui.label.schematic_info.enclosing_size": "Обмежений розмір:", "litematica.gui.label.schematic_info.enclosing_size_value": "Обмежений розмір: §f%s§r", "litematica.gui.label.schematic_info.name": "Назва:", "litematica.gui.label.schematic_info.region_count": "Регіонів: §f%d§r", - "litematica.gui.label.schematic_info.schema": "Minecraft: §f%s§r [Схема §f%d§r]", - "litematica.gui.label.schematic_info.schematic_author": "Схематика від §f%s§r", - "litematica.gui.label.schematic_info.sponge_version": "Версія Sponge: §f%d§r", "litematica.gui.label.schematic_info.time_created": "Створено: §f%s§r", "litematica.gui.label.schematic_info.time_modified": "Модифіковано: §f%s§r", "litematica.gui.label.schematic_info.total_blocks": "Всього блоків: §f%d§r", "litematica.gui.label.schematic_info.total_blocks_and_volume": "Блоків/обсяг: §f%d§r/§f%d§r", "litematica.gui.label.schematic_info.total_volume": "Всього обсяг: §f%d§r блоків", - "litematica.gui.label.schematic_info.vanilla_version": "Ванілльна структура", "litematica.gui.label.schematic_info.version": "Версія Litematic: §f%d§r", + "litematica.gui.label.schematic_info.sponge_version": "Версія Sponge: §f%d§r", + "litematica.gui.label.schematic_info.vanilla_version": "Ванілльна структура", + "litematica.gui.label.schematic_info.schema": "Minecraft: §f%s§r [Схема §f%d§r]", "litematica.gui.label.schematic_load.checkbox.create_placement": "Створити розміщення", "litematica.gui.label.schematic_load.hoverinfo.create_placement": "Негайно створиити нове розміщення і виберіть його", "litematica.gui.label.schematic_placement.enclosing_size": "Обмежений розмір: %s", @@ -716,26 +724,26 @@ "litematica.gui.label.schematic_projects.version_entry": "Версія %d - %s", "litematica.gui.label.schematic_projects.version_name": "Назва версії:", "litematica.gui.label.schematic_save.checkbox.ignore_entities": "Ігнорувати сутности", - "litematica.gui.label.schematic_save.checkbox.save_from_schematic_world": "Врятувати світ від схематики", - "litematica.gui.label.schematic_save.checkbox.support_blocks": "Блоки підтримки", - "litematica.gui.label.schematic_save.checkbox.visible_blocks_only": "Лише видимі блоки [експериментальний швидкий хакс]", "litematica.gui.label.schematic_save.hover_info.hold_shift_to_overwrite": "Утримуйте Shift, щоб перезаписати наявний файл", + "litematica.gui.label.schematic_save.checkbox.save_from_schematic_world": "Врятувати світ від схематики", "litematica.gui.label.schematic_save.hover_info.save_from_schematic_world": "Якщо увімкнено, схематикв створюється шляхом збереження вмісту виділення зі світу схем замість звичайного світу\nЦе дозволяє об’єднувати чи обрізати схематики без необхідності вставляти їх у тимчасовий творчий світ", + "litematica.gui.label.schematic_save.checkbox.visible_blocks_only": "Лише видимі блоки [експериментальний швидкий хакс]", + "litematica.gui.label.schematic_save.checkbox.support_blocks": "Блоки підтримки", "litematica.gui.label.schematic_save.hover_info.support_blocks": "Включіть будь-які необхідні опорні блоки в режимі «Лише видимі блоки» для таких речей, як повторювачі, компаратори, килими або гравітаційні блоки, які будуть видимі", "litematica.gui.label.schematic_save.hoverinfo.hold_shift_to_overwrite": "Утримуйте Shift, щоб перезаписати наявний файл", "litematica.gui.label.schematic_verifier.count": "Кількість", "litematica.gui.label.schematic_verifier.expected": "Очікування", "litematica.gui.label.schematic_verifier.found": "Знайдено", - "litematica.gui.label.schematic_verifier.status.done_correct_total": "§aПоточно: %s§r, всього: %s", - "litematica.gui.label.schematic_verifier.status.done_errors": "Неправильно: §cблок: %s§r, §6стан: %s§r, §відсутні: %s§r, §dдодатково: %s§r", - "litematica.gui.label.schematic_verifier.status.verifying": "Невидимі чанки: %s / %s", - "litematica.gui.label.schematic_verifier.verifier": "Перевірити схематику", "litematica.gui.label.schematic_verifier_display_type.all": "Ісі (не проігноровані)", "litematica.gui.label.schematic_verifier_display_type.correct_state": "Поточний стан", "litematica.gui.label.schematic_verifier_display_type.extra": "Додаткові блоки", "litematica.gui.label.schematic_verifier_display_type.missing": "Відсутні блоки", "litematica.gui.label.schematic_verifier_display_type.wrong_blocks": "Неправильні блоки", "litematica.gui.label.schematic_verifier_display_type.wrong_state": "Неправльний стан", + "litematica.gui.label.schematic_verifier.status.done_errors": "Неправильно: §cблок: %s§r, §6стан: %s§r, §відсутні: %s§r, §dдодатково: %s§r", + "litematica.gui.label.schematic_verifier.status.done_correct_total": "§aПоточно: %s§r, всього: %s", + "litematica.gui.label.schematic_verifier.status.verifying": "Невидимі чанки: %s / %s", + "litematica.gui.label.schematic_verifier.verifier": "Перевірити схематику", "litematica.gui.label.task.title.remaining_chunks": "Залишилося %s чанків (%s)", "litematica.gui.label.task_name.area_analyzer": "Аналізувати область", "litematica.gui.label.task_name.delete": "Видалити завдання", @@ -747,22 +755,21 @@ "litematica.gui.message.confirm_file_deletion": "Ви справді хочете видалити файл «%s»?", "litematica.gui.message.schematic_projects.confirm_delete_area": "Ви бажаєте видалити «останню вражену» область?\nЦе видалить будь-які блоки та сутності в області, яку менеджер проєкту востаннє розміщував у світі або востаннє зберігав як версію. (Загалом це «востаннє помічене уражене місце», так що, якщо ви змінюєте версії, це не залишить блоків із попередньої версії)", "litematica.gui.message.schematic_projects.confirm_place_to_world": "Ви бажаєте розмістити цю версію?\nБуде видалено всі блоки в межах області, яку менеджер проєкту востаннє розміщував у світі або востаннє зберігав як версію. (По суті, це «останнє бачення ураженої області», так що, якщо ви будете циклічно змінювати версії, це не залишить блоків із попередньої версії)", - "litematica.gui.title.area_editor.sub_region_name": "Назва підрегіона", "litematica.gui.title.area_editor_normal": "Редактор областей (звичайний/мультикубовий ркжим)", "litematica.gui.title.area_editor_normal_schematic_projects": "Редактор областей (§6§lVCS область схематики§r)", "litematica.gui.title.area_editor_simple": "Редактор областей (простий режим)", "litematica.gui.title.area_editor_sub_region": "Редактор областей (підрегіон)", + "litematica.gui.title.area_editor.sub_region_name": "Назва підрегіона", "litematica.gui.title.area_selection_manager": "Менеджер вибраних областей", - "litematica.gui.title.configs": "Налаштування Litematica - %s", "litematica.gui.title.configure_schematic_placement": "Налаштування розміщення схематики", "litematica.gui.title.configure_schematic_sub_region": "Налаштування розміщення підрегіонів", + "litematica.gui.title.configs": "Налаштування Litematica - %s", "litematica.gui.title.confirm_file_deletion": "Підтвердити видалення файлу", "litematica.gui.title.copy_area_selection": "Копіювати вибрану область «%s»", "litematica.gui.title.create_area_selection": "Створити нову виділену область", "litematica.gui.title.create_area_selection_from_placement": "Створити нову виділену область зі розміщенням схематики", "litematica.gui.title.create_directory": "Створити новий каталог", "litematica.gui.title.create_in_memory_schematic": "Створити схематику в пам'яті", - "litematica.gui.title.create_schematic_from_selection": "Зберегти поточну вибрану область як схематику", "litematica.gui.title.create_schematic_project": "Створити новий проєкт схематики", "litematica.gui.title.litematica_main_menu": "Litematica %s", "litematica.gui.title.load_schematic": "Завантажити схематику", @@ -775,10 +782,11 @@ "litematica.gui.title.rename_area_selection": "Перейменувати виділену область", "litematica.gui.title.rename_area_sub_region": "Перейменувати підрегіон", "litematica.gui.title.rename_schematic": "Перейменувати схематику", + "litematica.gui.title.create_schematic_from_selection": "Зберегти поточну вибрану область як схематику", "litematica.gui.title.save_exported_schematic": "Експорт %s збережено до «%s»", "litematica.gui.title.save_imported_schematic": "Збережено імпортовано схематику", - "litematica.gui.title.save_schematic_filename": "Назва файлу схематики", "litematica.gui.title.save_schematic_from_memory": "Зберегти файл схематики в пам'ять", + "litematica.gui.title.save_schematic_filename": "Назва файлу схематики", "litematica.gui.title.schematic_browser": "Браузер схематики", "litematica.gui.title.schematic_manager": "Менеджер схематики", "litematica.gui.title.schematic_project_manager": "VCS менеджер проєкта", @@ -789,7 +797,6 @@ "litematica.gui.title.schematic_verifier": "Перевірка схематики для «%s»", "litematica.gui.title.schematic_verifier_errors": "Помилки перевірки схематики", "litematica.gui.title.task_manager": "Менеджер завдань", - "litematica.hotkeys.category.generic_hotkeys": "Загальні гарячі клавіші", "litematica.hud.area_selection.box_count": "Куби: %s", "litematica.hud.area_selection.dimensions_position": "Вимір: %s - p1: %s, p2: %s", "litematica.hud.area_selection.mode.corners": "Кути", @@ -809,8 +816,8 @@ "litematica.hud.misc.render_layer_mode_all": "Режим шару: %s", "litematica.hud.misc.renderer_status": "Промальовування: A: %s S: %s B: %s O: %s SEL: %s", "litematica.hud.misc.schematic_paste.data_restore_mode": "Режим відновлення даних: §b%", - "litematica.hud.misc.schematic_paste.ignore_inventory_contents": "Ignore inventory contents: %s", "litematica.hud.misc.schematic_paste.replace_mode": "Замінити блоки: %s", + "litematica.hud.misc.schematic_paste.ignore_inventory_contents": "Ignore inventory contents: %s", "litematica.hud.schematic_placement.hover_info.lock_coordinate": "Заблокувати цю координату\nЦе дозволяє змінювати інші координати, не впливаючи на заблоковані", "litematica.hud.schematic_placement.hover_info.placement_locked": "Це розміщення заблоковано, і його не можна змінити, не розблокувавши його", "litematica.hud.schematic_placement.hover_info.placement_modified": "Розміщення було модифіковано", @@ -821,46 +828,43 @@ "litematica.hud.schematic_placement.sub_region_modified": "Модифіковано", "litematica.hud.schematic_placement.sub_region_origin": "Регіон: %s", "litematica.hud.schematic_placement.sub_regions_modified": "Модифіковані регіони", - "litematica.hud.schematic_projects.current_version": "Версія: %s/%s - назва: %s", + "litematica.hud.selected_mode": "Режим", "litematica.hud.schematic_projects.current_version_date": "Дата: %s", + "litematica.hud.schematic_projects.current_version": "Версія: %s/%s - назва: %s", "litematica.hud.schematic_projects.no_project_open": "<Проєкт не відкрито>", "litematica.hud.schematic_projects.no_versions": "<Немає версії>", "litematica.hud.schematic_projects.origin": "Проєкт: %s", "litematica.hud.schematic_projects.project_name": "Проєкт: %s", "litematica.hud.schematic_projects_mode": "§6Режим VCS схематик§r", - "litematica.hud.selected_mode": "Режим", "litematica.info.material_list": "- Гаряча клавіша «Список матеріалів» відкриває останній переглянутий список матеріалів, якщо він збережений\n- Щоб перейти до іншого списку матеріалів, відкрийте його через кнопку в налаштуваннях розміщення або в браузері схематик\n- Збережений/останній переглянутий список також забувається, якщо вибране розміщення схематики змінено\n- Якщо останнього переглянутого списку матеріалів немає, використовується вибране розташування, якщо воно є", - "litematica.info.schematic_load.schematic_loaded": "Схематика «%s» успішно завантажена в пам'ять", - "litematica.info.schematic_manager.preview.right_click_to_cancel": "- Клацніть ПКМ, щоб скасувати незавершену операцію\n- Ctrl + Alt + Shift + клацніть, щоб установити мініатюру з існуючого зображення PNG під назвою «thumb.png» з того самого каталогу, де знаходиться файл схематики", - "litematica.info.schematic_manager.preview.set_preview_by_taking_a_screenshot": "Використовуйте звичайну клавішу знімка екрана, щоб установити зображення\nАбо клацніть ПКМ по «Установити попередній перегляд», щоб скасувати налаштування зображення", - "litematica.info.schematic_manager.preview.success": "Зображення успішно встановлено", "litematica.label.alignment.center": "Центр", "litematica.label.alignment.top_center": "Зверху поцетру", - "litematica.label.no": "Ні", "litematica.label.none_lower": "Нічого", + "litematica.label.no": "Ні", "litematica.label.yes": "Так", - "litematica.message.added_selection_box": "Додано нову вибрану область як %s", - "litematica.message.area_clear_fail": "§cНе вдалося очистити область§r", - "litematica.message.area_cleared": "Область очищено", - "litematica.message.area_fill_fail": "Не вдалося заповнити область", - "litematica.message.area_filled": "Область заповнено", - "litematica.message.area_selections.selection_created_from_placement": "Створено новий вибір із місця розташування «%s»", - "litematica.message.easy_place_fail": "§6Дії заважають режим «Легке розміщення»", "litematica.message.error.area_deletion_aborted": "Видалення області перервано або скасовано", "litematica.message.error.empty_area_selection": "Вибрана область порощня (без кубів)", "litematica.message.error.invalid_schematic_name": "Недійсна назва схематики «%s»", - "litematica.message.error.move.pending_tasks": "§cНеможливо розпочати переміщення, якщо є незавершені завдання§r", "litematica.message.error.no_area_selected": "§cЛюласть не вибрано§r", "litematica.message.error.no_placement_selected": "§cРозміщення не вибрано§r", "litematica.message.error.only_works_in_single_player": "§cЦя операція працює лише в грі наодинці§r", + "litematica.message.error.move.pending_tasks": "§cНеможливо розпочати переміщення, якщо є незавершені завдання§r", "litematica.message.error.placement_paste_outside_world": "Розміщення не можна вставити в поточну позицію, оскільки воно виходить за межі світу", "litematica.message.error.schematic_paste_failed": "§cНе вдалося вставити схематику§r", "litematica.message.error.schematic_save_failed": "Не вдалося зберегти схематику до файлу «%s»", "litematica.message.error.schematic_save_interrupted": "Збереження схематики перервано або зупинено", "litematica.message.error.schematic_save_no_area_selected": "§cНе владося зберегти схематику – область не вибрана§r", + "litematica.message.warn.pickblock.no_suitable_slot_found": "Не знайдено відповідного слота гарячої панелі для вибору блока!\nПеревірте §epickBlockableSlots§r в «Загальні»\nКрім того, залежно від значення §epickBlockAvoid*§6, функція блокування вибору може відмовитися замінити будь-які інструменти чи інші пошкоджені предмети в цих слотах", + "litematica.message.warn.pickblock.no_valid_slots_configured": "Немає слотів гарячої панелі для §epickBlockableSlots§r в «Загальні»!", + "litematica.message.added_selection_box": "Додано нову вибрану область як %s", + "litematica.message.area_clear_fail": "§cНе вдалося очистити область§r", + "litematica.message.area_cleared": "Область очищено", + "litematica.message.area_filled": "Область заповнено", + "litematica.message.area_fill_fail": "Не вдалося заповнити область", + "litematica.message.area_selections.selection_created_from_placement": "Створено новий вибір із місця розташування «%s»", + "litematica.message.easy_place_fail": "§6Дії заважають режим «Легке розміщення»", "litematica.message.grabbed_element_for_moving": "Взяв елемент для переміщення", "litematica.message.in_memory_schematic_created": "Створено схематику в пам’яті як «%s»", - "litematica.message.litematic_downgrade_exported_as": "Ескпорт схематики знижено як «%s»\n§6ПРИМІТКА: Це експериментальна функція; може статися втрата даних§r", "litematica.message.litematic_saved_as": "Успішно оновлено версію даних схематики Litematica\nСхематику збережено як «%s»", "litematica.message.material_list.material_cache_cleared": "Кеш матеріалів очищено", "litematica.message.material_list_written_to_file": "Список матеріалів записаний у файл «%s»", @@ -868,14 +872,15 @@ "litematica.message.moved_selection": "Переміщено поточний вибір із %s до %s", "litematica.message.paste_with_servux": "§6Місце розміщення завантажується в Servux для вставки", "litematica.message.placement.cant_modify_is_locked": "§cРозташування заблоковано і не може бути змінено§r", - "litematica.message.placement.mirror_set_to": "Розміщення відзеркалено до %s", "litematica.message.placement.moved_placement_origin": "Переміщено місце розташування з %s до %s", "litematica.message.placement.moved_subregion_to": "Переміщено підрегіон до %s", "litematica.message.placement.rotation_set_to": "Розміщення повернуто до %s", + "litematica.message.placement.mirror_set_to": "Розміщення відзеркалено до %s", "litematica.message.placement_restriction_fail": "§6Дії заборонено режимом обмеження розміщення", "litematica.message.removed_area_origin": "Видалено явну/ручну початкову точку області", "litematica.message.removed_selection_box": "Видалено вибрану область %s", "litematica.message.scheduled_task_added": "Додано заплановане завдання..", + "litematica.message.litematic_downgrade_exported_as": "Ескпорт схематики знижено як «%s»\n§6ПРИМІТКА: Це експериментальна функція; може статися втрата даних§r", "litematica.message.schematic_exported_as": "Схематику експортовано як «%s»", "litematica.message.schematic_pasted": "Схематику вставлено в світ", "litematica.message.schematic_pasted_using_fill_and_setblock": "Схематику вставлено за допомогою §b%s§r і заповнено §b%§r командою /setblock", @@ -883,23 +888,21 @@ "litematica.message.schematic_pasted_using_world_edit": "Схематику вставлено за допомогою §b%§r World Edit команди //set", "litematica.message.schematic_placement_created": "Розміщення створено як «%s»", "litematica.message.schematic_preview_cancelled": "Завдання переглядку схематики скасовано", - "litematica.message.schematic_projects.project_created": "Проєкт «%s» створено", - "litematica.message.schematic_projects.project_loaded": "Проєкт «%s» завантажено", - "litematica.message.schematic_projects.version_saved": "Нова версія (#%s) збережена як «%s»", "litematica.message.schematic_read_from_file_success": "Завантажено файл схематики «%s»", "litematica.message.schematic_rendering_refreshed": "Зображення схематики оновлено", - "litematica.message.schematic_save_task_created": "Створено завдання збереження схематики", "litematica.message.schematic_saved_as": "Схематику збережено як «%s»", + "litematica.message.schematic_save_task_created": "Створено завдання збереження схематики", "litematica.message.set_area_origin": "Встановлено початкову точку області на %s", "litematica.message.set_selection_box_point": "Встановлено/переміщено точку %d до %s", "litematica.message.toggled": "Перемикач %s %s", - "litematica.message.value.off": "ВИМК", "litematica.message.value.on": "УВІМК", + "litematica.message.value.off": "ВИМК", + "litematica.message.schematic_projects.project_created": "Проєкт «%s» створено", + "litematica.message.schematic_projects.project_loaded": "Проєкт «%s» завантажено", + "litematica.message.schematic_projects.version_saved": "Нова версія (#%s) збережена як «%s»", "litematica.message.warn.area_selection.browser_open_in_simple_mode": "Примітка: зараз ви перебуваєте в режимі простого «Вибір області»", "litematica.message.warn.layer_mode_currently_at": "Примітка: зараз ви перебуваєте в режимі показу шару «%s»", "litematica.message.warn.main_rendering_disabled": "Попередження: основне промальовування наразі вимкнено\nДив. Візуал -> %s або гарячі клавіші -> %s [«%s»]", - "litematica.message.warn.pickblock.no_suitable_slot_found": "Не знайдено відповідного слота гарячої панелі для вибору блока!\nПеревірте §epickBlockableSlots§r в «Загальні»\nКрім того, залежно від значення §epickBlockAvoid*§6, функція блокування вибору може відмовитися замінити будь-які інструменти чи інші пошкоджені предмети в цих слотах", - "litematica.message.warn.pickblock.no_valid_slots_configured": "Немає слотів гарячої панелі для §epickBlockableSlots§r в «Загальні»!", "litematica.message.warn.schematic_blocks_rendering_disabled": "Попередження: промальовування блоків схематики наразі вимкнено\nДив. Візуал -> %s або гарячі клавіші -> %s [«%s»]", "litematica.message.warn.schematic_load_non_litematica": "Попередження: коли ви безпосередньо завантажуєте схематику, відмінну від Litematica, створені розміщення не будуть постійними\nКрім того, якщо вам доведеться завантажувати схематику багато разів, затримки перетворення типу схематики (для великих схематик) відбуватиметься кожного разу, коли ви завантажуєте її\n\nТому рекомендується або імпортувати схематику та зберегти її у форматі Litematica за допомогою меню «Менеджер схематик», або ще краще вставити оригінальну схематику у тимчасовий світ за допомогою MCEdit або режиму вставки в Litematica, а потім створтити нову схематику Litematica з цього, бажано використовуючи кілька підрегіонів, щоб щільно охопити збірку, де це можливо", "litematica.message.warn.schematic_rebuild_placement_not_selected": "Цільове розташування наразі не вибрано. Гаряча клавіша «Замінити все» працює лише для поточних вибраних підрегіонів розміщення, яке ви натискаєте. Щоб замінити блоки лише в одному підрегіоні, виберіть цей підрегіон. Щоб замінити всю схематику (всі сонячні області), виберіть розміщення повністю, а не його підобласть. Блоки також замінюються лише в межах області, обмеженої поточним значень «Промальовування шарів»", @@ -907,6 +910,7 @@ "litematica.message.warn.schematic_verifier.overlay_disabled": "Попередження: промальовування накладання верифікатора наразі вимкнено! Див. інформацію про накладання -> %s (або гарячі клавіші -> %s [«%s»])", "litematica.message.warning.invalid_number": "Недійсне введення числа «%s»", "litematica.message.warning.schematic_projects_hidden": "Попередження: система контролю версій схематики наразі прихована. Загалом, ви НЕ повинні використовувати це, якщо ви дійсно не знаєте, як це працює та змінює деякі дії мода. Він призначений для повторення роботи з проєктування на місці, де потрібне перемикання між різними версіями збірки на місці (= видалення та заміна попередньої версії). Якщо ви хочете його використовувати, увімкніть «unhideSchematicVCS» у «Загальні»", + "litematica.warning.area_editor.area_rendering_disabled": "Примітка: промальовування полів вибору області наразі вимкнено\nДив. Візуал -> %s або гарячі клавіші -> %s [«%s»]", "litematica.tool_hud.block_1": "Блок: %s", "litematica.tool_hud.block_2": "Замінити: %s", "litematica.tool_hud.facing": "Напрямок: %s", @@ -919,6 +923,5 @@ "litematica.tool_mode.name.rebuild": "Редагувати схематику", "litematica.tool_mode.name.replace_block": "Замінити блок", "litematica.tool_mode.name.schematic_placement": "Розміщення схематики", - "litematica.warning.area_editor.area_rendering_disabled": "Примітка: промальовування полів вибору області наразі вимкнено\nДив. Візуал -> %s або гарячі клавіші -> %s [«%s»]", "modmenu.descriptionTranslation.litematica": "Сучасний мод схематик для LiteLoader, Rift, Fabric тощо" } \ No newline at end of file diff --git a/src/main/resources/assets/litematica/lang/zh_cn.json b/src/main/resources/assets/litematica/lang/zh_cn.json index 750bf70f03..ecd1b6e945 100644 --- a/src/main/resources/assets/litematica/lang/zh_cn.json +++ b/src/main/resources/assets/litematica/lang/zh_cn.json @@ -83,6 +83,7 @@ "litematica.config.visuals.name.ignoreExistingFluids": "忽略投影内液体", "litematica.config.visuals.name.overlayReducedInnerSides": "减少内侧面渲染", "litematica.config.visuals.name.placementBoxSideAlpha": "放置边框透明度", + "litematica.config.visuals.name.renderAOModernEnable": "renderAOModernEnable", "litematica.config.visuals.name.renderAreaSelectionBoxSides": "选择框边渲染", "litematica.config.visuals.name.renderBlocksAsTranslucent": "方块半透明化", "litematica.config.visuals.name.renderCollidingSchematicBlocks": "渲染重叠块", @@ -300,6 +301,7 @@ "litematica.config.visuals.comment.ignoreExistingFluids": "如果启用该选项,原理图中如果有空气或其他块,\n那么任何的「额外块」或「错误块」的液体将被忽略。\n基本上,这使得在水下建造东西少了很多麻烦。\n注意:你很可能还想同时启用「renderCollidingSchematicBlocks(渲染重叠块)」,以允许块在流体中渲染。", "litematica.config.visuals.comment.overlayReducedInnerSides": "如果启用,可以使得投影内方块接触的侧面不被显示\n有两个优点\n-1. 首先减少了投影的渲染工作量\n-2. 在投影内部时,内部的杂色会变淡\n(§6虽然默认是关闭但建议开启-ZMDF§r)", "litematica.config.visuals.comment.placementBoxSideAlpha": "子区域边框的透明度(§2没有找到实际的功能体现——ZMDF§r)", + "litematica.config.visuals.comment.renderAOModernEnable": "Enables a new Ambient Occlusion Processor which should\nfix issues where shadows aren't being applied correctly,\nbut it can also cause Schematic Layers to have shadows\nfrom adjacent layers that can be distracting\nwhile your building.", "litematica.config.visuals.comment.renderAreaSelectionBoxSides": "该选项可以选择是否开启选区边框显示(渲染)", "litematica.config.visuals.comment.renderBlocksAsTranslucent": "如果启用该选项,投影原理图内的方块展示将由\n不透明变为半透明状态", "litematica.config.visuals.comment.renderCollidingSchematicBlocks": "如果启用该选项,那么当客户端世界中存在错误的方块时\n投影原理图内的方块仍然会进行显示\n当你试图在一些有水或着雪层的地方建造时。\n(就是无视雪片与流动液体的意思,大概)", @@ -445,6 +447,7 @@ "litematica.config.visuals.prettyName.enableSchematicFluidRendering": "Schematic Fluid Rendering", "litematica.config.visuals.prettyName.enableSchematicOverlay": "渲染方块特征", "litematica.config.visuals.prettyName.enableSchematicRendering": "渲染投影", + "litematica.config.visuals.prettyName.renderAOModernEnable": "AO Modern Processor", "litematica.config.visuals.prettyName.renderBlocksAsTranslucent": "方块半透明化", "litematica.config.visuals.prettyName.schematicOverlayEnableOutlines": "渲染框线", "litematica.config.visuals.prettyName.schematicOverlayEnableResorting": "启用原理图覆盖重新排序", diff --git a/src/main/resources/assets/litematica/lang/zh_tw.json b/src/main/resources/assets/litematica/lang/zh_tw.json index 82a3c5e99d..6a94deab92 100644 --- a/src/main/resources/assets/litematica/lang/zh_tw.json +++ b/src/main/resources/assets/litematica/lang/zh_tw.json @@ -83,6 +83,7 @@ "litematica.config.visuals.name.ignoreExistingFluids": "忽略投影内液體", "litematica.config.visuals.name.overlayReducedInnerSides": "减少内側面渲染", "litematica.config.visuals.name.placementBoxSideAlpha": "放置邊框透明度", + "litematica.config.visuals.name.renderAOModernEnable": "renderAOModernEnable", "litematica.config.visuals.name.renderAreaSelectionBoxSides": "顯示選區框邊", "litematica.config.visuals.name.renderBlocksAsTranslucent": "投影方塊透明", "litematica.config.visuals.name.renderCollidingSchematicBlocks": "顯示重叠方塊", @@ -300,6 +301,7 @@ "litematica.config.visuals.comment.ignoreExistingFluids": "如果啟用該選項,原理圖中如果有空氣或其他塊,\n那麼任何的「额外塊」或「錯誤塊」的液體將被忽略。\n基本上,這使得在水下建造東西少了很多麻煩。\n注意:你很可能還想同時啟用「renderCollidingSchematicBlocks(渲染重叠塊)」,以允許塊在流體中渲染。", "litematica.config.visuals.comment.overlayReducedInnerSides": "如果啟用,可以使得投影内方塊接觸的側面不被顯示\n有兩個優點\n-1. 首先减少了投影的渲染工作量\n-2. 在投影内部時,内部的染色會變淡\n(§6雖然默認是關閉但建議開啟-ZMDF§r)", "litematica.config.visuals.comment.placementBoxSideAlpha": "子區域邊框的透明度(§2沒有找到實際的功能體現——ZMDF§r)", + "litematica.config.visuals.comment.renderAOModernEnable": "Enables a new Ambient Occlusion Processor which should\nfix issues where shadows aren't being applied correctly,\nbut it can also cause Schematic Layers to have shadows\nfrom adjacent layers that can be distracting\nwhile your building.", "litematica.config.visuals.comment.renderAreaSelectionBoxSides": "該選項可以選擇是否開啟選區邊框顯示(渲染)", "litematica.config.visuals.comment.renderBlocksAsTranslucent": "如果啟用該選項,投影原理圖内的方塊展示將由\n不透明變為半透明狀態", "litematica.config.visuals.comment.renderCollidingSchematicBlocks": "如果啟用該選項,那麼當客戶端世界中存在錯誤的方塊時\n投影原理圖内的方塊仍然會進行顯示\n當你試圖在一些有水或著雪層的地方建造時。\n(就是無視雪片與流動液體的意思,大概)", @@ -445,6 +447,7 @@ "litematica.config.visuals.prettyName.enableSchematicFluidRendering": "Schematic Fluid Rendering", "litematica.config.visuals.prettyName.enableSchematicOverlay": "渲染方塊特征", "litematica.config.visuals.prettyName.enableSchematicRendering": "渲染投影", + "litematica.config.visuals.prettyName.renderAOModernEnable": "AO Modern Processor", "litematica.config.visuals.prettyName.renderBlocksAsTranslucent": "方塊半透明化", "litematica.config.visuals.prettyName.schematicOverlayEnableOutlines": "渲染框線", "litematica.config.visuals.prettyName.schematicOverlayEnableResorting": "啟用原理圖覆蓋重排序",