Fixed not being able to load mod with latest Create mod version: Updated Flyweel dependency to 0.6.9. Updated russian translation.
This commit is contained in:
@@ -3,7 +3,7 @@
|
|||||||
org.gradle.jvmargs=-Xmx3G
|
org.gradle.jvmargs=-Xmx3G
|
||||||
org.gradle.daemon=false
|
org.gradle.daemon=false
|
||||||
|
|
||||||
mod_version = 3.1
|
mod_version = 3.3
|
||||||
artifact_minecraft_version = 1.19.2
|
artifact_minecraft_version = 1.19.2
|
||||||
|
|
||||||
minecraft_version = 1.19.2
|
minecraft_version = 1.19.2
|
||||||
@@ -17,4 +17,4 @@ cursegradle_version = 1.4.0
|
|||||||
parchment_version = 2022.11.06
|
parchment_version = 2022.11.06
|
||||||
|
|
||||||
flywheel_minecraft_version = 1.19.2
|
flywheel_minecraft_version = 1.19.2
|
||||||
flywheel_version = 0.6.8.a-14
|
flywheel_version = 0.6.9-18
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package nl.requios.effortlessbuilding.create.foundation.render;
|
package nl.requios.effortlessbuilding.create.foundation.render;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.core.model.ModelUtil;
|
import com.jozufozu.flywheel.core.model.ModelUtil;
|
||||||
|
import com.jozufozu.flywheel.core.model.ShadeSeparatedBufferedData;
|
||||||
import com.jozufozu.flywheel.util.Pair;
|
import com.jozufozu.flywheel.util.Pair;
|
||||||
import com.mojang.blaze3d.vertex.BufferBuilder.RenderedBuffer;
|
import com.mojang.blaze3d.vertex.BufferBuilder.RenderedBuffer;
|
||||||
import com.mojang.blaze3d.vertex.PoseStack;
|
import com.mojang.blaze3d.vertex.PoseStack;
|
||||||
@@ -22,8 +23,10 @@ public class BakedModelRenderHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static SuperByteBuffer standardModelRender(BakedModel model, BlockState referenceState, PoseStack ms) {
|
public static SuperByteBuffer standardModelRender(BakedModel model, BlockState referenceState, PoseStack ms) {
|
||||||
Pair<RenderedBuffer, Integer> pair = ModelUtil.getBufferBuilder(model, referenceState, ms);
|
ShadeSeparatedBufferedData data = ModelUtil.getBufferedData(model, referenceState, ms);
|
||||||
return new SuperByteBuffer(pair.first(), pair.second());
|
SuperByteBuffer sbb = new SuperByteBuffer(data);
|
||||||
|
data.release();
|
||||||
|
return sbb;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,18 +1,27 @@
|
|||||||
package nl.requios.effortlessbuilding.create.foundation.render;
|
package nl.requios.effortlessbuilding.create.foundation.render;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.util.function.IntPredicate;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.vertex.ShadedVertexList;
|
import com.jozufozu.flywheel.api.vertex.ShadedVertexList;
|
||||||
|
import com.jozufozu.flywheel.api.vertex.VertexList;
|
||||||
import com.jozufozu.flywheel.backend.ShadersModHandler;
|
import com.jozufozu.flywheel.backend.ShadersModHandler;
|
||||||
|
import com.jozufozu.flywheel.core.model.ShadeSeparatedBufferedData;
|
||||||
import com.jozufozu.flywheel.core.vertex.BlockVertexList;
|
import com.jozufozu.flywheel.core.vertex.BlockVertexList;
|
||||||
import com.jozufozu.flywheel.util.DiffuseLightCalculator;
|
import com.jozufozu.flywheel.util.DiffuseLightCalculator;
|
||||||
import com.jozufozu.flywheel.util.transform.TStack;
|
import com.jozufozu.flywheel.util.transform.TStack;
|
||||||
import com.jozufozu.flywheel.util.transform.Transform;
|
import com.jozufozu.flywheel.util.transform.Transform;
|
||||||
import com.mojang.blaze3d.vertex.BufferBuilder.DrawState;
|
import com.mojang.blaze3d.vertex.BufferBuilder;
|
||||||
import com.mojang.blaze3d.vertex.BufferBuilder.RenderedBuffer;
|
|
||||||
import com.mojang.blaze3d.vertex.PoseStack;
|
import com.mojang.blaze3d.vertex.PoseStack;
|
||||||
import com.mojang.blaze3d.vertex.VertexConsumer;
|
import com.mojang.blaze3d.vertex.VertexConsumer;
|
||||||
import com.mojang.math.*;
|
import com.mojang.math.Matrix3f;
|
||||||
|
import com.mojang.math.Matrix4f;
|
||||||
|
import com.mojang.math.Quaternion;
|
||||||
|
import com.mojang.math.Vector3f;
|
||||||
|
import com.mojang.math.Vector4f;
|
||||||
import nl.requios.effortlessbuilding.create.foundation.block.render.SpriteShiftEntry;
|
import nl.requios.effortlessbuilding.create.foundation.block.render.SpriteShiftEntry;
|
||||||
import nl.requios.effortlessbuilding.create.foundation.utility.Color;
|
import nl.requios.effortlessbuilding.create.foundation.utility.Color;
|
||||||
|
|
||||||
import it.unimi.dsi.fastutil.longs.Long2IntMap;
|
import it.unimi.dsi.fastutil.longs.Long2IntMap;
|
||||||
import it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap;
|
import it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
@@ -26,10 +35,11 @@ import net.minecraft.world.level.Level;
|
|||||||
|
|
||||||
public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<SuperByteBuffer> {
|
public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<SuperByteBuffer> {
|
||||||
|
|
||||||
private final ShadedVertexList template;
|
private final VertexList template;
|
||||||
|
private final IntPredicate shadedPredicate;
|
||||||
|
|
||||||
// Vertex Position
|
// Vertex Position
|
||||||
private final PoseStack transforms;
|
private final PoseStack transforms = new PoseStack();
|
||||||
|
|
||||||
// Vertex Coloring
|
// Vertex Coloring
|
||||||
private boolean shouldColor;
|
private boolean shouldColor;
|
||||||
@@ -57,11 +67,28 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<Super
|
|||||||
// Temporary
|
// Temporary
|
||||||
private static final Long2IntMap WORLD_LIGHT_CACHE = new Long2IntOpenHashMap();
|
private static final Long2IntMap WORLD_LIGHT_CACHE = new Long2IntOpenHashMap();
|
||||||
|
|
||||||
public SuperByteBuffer(RenderedBuffer buf, int unshadedStartVertex) {
|
public SuperByteBuffer(ByteBuffer vertexBuffer, BufferBuilder.DrawState drawState, int unshadedStartVertex) {
|
||||||
DrawState drawState = buf.drawState();
|
int vertexCount = drawState.vertexCount();
|
||||||
template = new BlockVertexList.Shaded(buf.vertexBuffer(), drawState.vertexCount(), drawState.format().getVertexSize(), unshadedStartVertex);
|
int stride = drawState.format().getVertexSize();
|
||||||
|
|
||||||
|
ShadedVertexList template = new BlockVertexList.Shaded(vertexBuffer, vertexCount, stride, unshadedStartVertex);
|
||||||
|
shadedPredicate = template::isShaded;
|
||||||
|
this.template = template;
|
||||||
|
|
||||||
|
transforms.pushPose();
|
||||||
|
}
|
||||||
|
|
||||||
|
public SuperByteBuffer(ShadeSeparatedBufferedData data) {
|
||||||
|
this(data.vertexBuffer(), data.drawState(), data.unshadedStartVertex());
|
||||||
|
}
|
||||||
|
|
||||||
|
public SuperByteBuffer(ByteBuffer vertexBuffer, BufferBuilder.DrawState drawState) {
|
||||||
|
int vertexCount = drawState.vertexCount();
|
||||||
|
int stride = drawState.format().getVertexSize();
|
||||||
|
|
||||||
|
template = new BlockVertexList(vertexBuffer, vertexCount, stride);
|
||||||
|
shadedPredicate = index -> true;
|
||||||
|
|
||||||
transforms = new PoseStack();
|
|
||||||
transforms.pushPose();
|
transforms.pushPose();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,24 +97,24 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<Super
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
Matrix4f modelMat = input.last()
|
Matrix4f modelMat = input.last()
|
||||||
.pose()
|
.pose()
|
||||||
.copy();
|
.copy();
|
||||||
Matrix4f localTransforms = transforms.last()
|
Matrix4f localTransforms = transforms.last()
|
||||||
.pose();
|
.pose();
|
||||||
modelMat.multiply(localTransforms);
|
modelMat.multiply(localTransforms);
|
||||||
|
|
||||||
Matrix3f normalMat;
|
Matrix3f normalMat;
|
||||||
if (fullNormalTransform) {
|
if (fullNormalTransform) {
|
||||||
normalMat = input.last()
|
normalMat = input.last()
|
||||||
.normal()
|
.normal()
|
||||||
.copy();
|
.copy();
|
||||||
Matrix3f localNormalTransforms = transforms.last()
|
Matrix3f localNormalTransforms = transforms.last()
|
||||||
.normal();
|
.normal();
|
||||||
normalMat.mul(localNormalTransforms);
|
normalMat.mul(localNormalTransforms);
|
||||||
} else {
|
} else {
|
||||||
normalMat = transforms.last()
|
normalMat = transforms.last()
|
||||||
.normal()
|
.normal()
|
||||||
.copy();
|
.copy();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (useWorldLight) {
|
if (useWorldLight) {
|
||||||
@@ -100,7 +127,7 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<Super
|
|||||||
|
|
||||||
DiffuseLightCalculator diffuseCalculator = ForcedDiffuseState.getForcedCalculator();
|
DiffuseLightCalculator diffuseCalculator = ForcedDiffuseState.getForcedCalculator();
|
||||||
final boolean disableDiffuseMult =
|
final boolean disableDiffuseMult =
|
||||||
this.disableDiffuseMult || (ShadersModHandler.isShaderPackInUse() && diffuseCalculator == null);
|
this.disableDiffuseMult || (ShadersModHandler.isShaderPackInUse() && diffuseCalculator == null);
|
||||||
if (diffuseCalculator == null) {
|
if (diffuseCalculator == null) {
|
||||||
diffuseCalculator = this.diffuseCalculator;
|
diffuseCalculator = this.diffuseCalculator;
|
||||||
if (diffuseCalculator == null) {
|
if (diffuseCalculator == null) {
|
||||||
@@ -143,7 +170,7 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<Super
|
|||||||
if (disableDiffuseMult) {
|
if (disableDiffuseMult) {
|
||||||
builder.color(r, g, b, a);
|
builder.color(r, g, b, a);
|
||||||
} else {
|
} else {
|
||||||
float instanceDiffuse = diffuseCalculator.getDiffuse(nx, ny, nz, template.isShaded(i));
|
float instanceDiffuse = diffuseCalculator.getDiffuse(nx, ny, nz, shadedPredicate.test(i));
|
||||||
int colorR = transformColor(r, instanceDiffuse);
|
int colorR = transformColor(r, instanceDiffuse);
|
||||||
int colorG = transformColor(g, instanceDiffuse);
|
int colorG = transformColor(g, instanceDiffuse);
|
||||||
int colorB = transformColor(b, instanceDiffuse);
|
int colorB = transformColor(b, instanceDiffuse);
|
||||||
@@ -222,6 +249,10 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<Super
|
|||||||
return template.isEmpty();
|
return template.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void delete() {
|
||||||
|
template.delete();
|
||||||
|
}
|
||||||
|
|
||||||
public PoseStack getTransforms() {
|
public PoseStack getTransforms() {
|
||||||
return transforms;
|
return transforms;
|
||||||
}
|
}
|
||||||
@@ -259,40 +290,40 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<Super
|
|||||||
@Override
|
@Override
|
||||||
public SuperByteBuffer mulPose(Matrix4f pose) {
|
public SuperByteBuffer mulPose(Matrix4f pose) {
|
||||||
transforms.last()
|
transforms.last()
|
||||||
.pose()
|
.pose()
|
||||||
.multiply(pose);
|
.multiply(pose);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SuperByteBuffer mulNormal(Matrix3f normal) {
|
public SuperByteBuffer mulNormal(Matrix3f normal) {
|
||||||
transforms.last()
|
transforms.last()
|
||||||
.normal()
|
.normal()
|
||||||
.mul(normal);
|
.mul(normal);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SuperByteBuffer transform(PoseStack stack) {
|
public SuperByteBuffer transform(PoseStack stack) {
|
||||||
transforms.last()
|
transforms.last()
|
||||||
.pose()
|
.pose()
|
||||||
.multiply(stack.last()
|
.multiply(stack.last()
|
||||||
.pose());
|
.pose());
|
||||||
transforms.last()
|
transforms.last()
|
||||||
.normal()
|
.normal()
|
||||||
.mul(stack.last()
|
.mul(stack.last()
|
||||||
.normal());
|
.normal());
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SuperByteBuffer rotateCentered(Direction axis, float radians) {
|
public SuperByteBuffer rotateCentered(Direction axis, float radians) {
|
||||||
translate(.5f, .5f, .5f).rotate(axis, radians)
|
translate(.5f, .5f, .5f).rotate(axis, radians)
|
||||||
.translate(-.5f, -.5f, -.5f);
|
.translate(-.5f, -.5f, -.5f);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SuperByteBuffer rotateCentered(Quaternion q) {
|
public SuperByteBuffer rotateCentered(Quaternion q) {
|
||||||
translate(.5f, .5f, .5f).multiply(q)
|
translate(.5f, .5f, .5f).multiply(q)
|
||||||
.translate(-.5f, -.5f, -.5f);
|
.translate(-.5f, -.5f, -.5f);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -347,13 +378,13 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<Super
|
|||||||
public SuperByteBuffer shiftUVScrolling(SpriteShiftEntry entry, float scrollU, float scrollV) {
|
public SuperByteBuffer shiftUVScrolling(SpriteShiftEntry entry, float scrollU, float scrollV) {
|
||||||
this.spriteShiftFunc = (builder, u, v) -> {
|
this.spriteShiftFunc = (builder, u, v) -> {
|
||||||
float targetU = u - entry.getOriginal()
|
float targetU = u - entry.getOriginal()
|
||||||
.getU0() + entry.getTarget()
|
.getU0() + entry.getTarget()
|
||||||
.getU0()
|
.getU0()
|
||||||
+ scrollU;
|
+ scrollU;
|
||||||
float targetV = v - entry.getOriginal()
|
float targetV = v - entry.getOriginal()
|
||||||
.getV0() + entry.getTarget()
|
.getV0() + entry.getTarget()
|
||||||
.getV0()
|
.getV0()
|
||||||
+ scrollV;
|
+ scrollV;
|
||||||
builder.uv(targetU, targetV);
|
builder.uv(targetU, targetV);
|
||||||
};
|
};
|
||||||
return this;
|
return this;
|
||||||
@@ -362,9 +393,9 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<Super
|
|||||||
public SuperByteBuffer shiftUVtoSheet(SpriteShiftEntry entry, float uTarget, float vTarget, int sheetSize) {
|
public SuperByteBuffer shiftUVtoSheet(SpriteShiftEntry entry, float uTarget, float vTarget, int sheetSize) {
|
||||||
this.spriteShiftFunc = (builder, u, v) -> {
|
this.spriteShiftFunc = (builder, u, v) -> {
|
||||||
float targetU = entry.getTarget()
|
float targetU = entry.getTarget()
|
||||||
.getU((SpriteShiftEntry.getUnInterpolatedU(entry.getOriginal(), u) / sheetSize) + uTarget * 16);
|
.getU((SpriteShiftEntry.getUnInterpolatedU(entry.getOriginal(), u) / sheetSize) + uTarget * 16);
|
||||||
float targetV = entry.getTarget()
|
float targetV = entry.getTarget()
|
||||||
.getV((SpriteShiftEntry.getUnInterpolatedV(entry.getOriginal(), v) / sheetSize) + vTarget * 16);
|
.getV((SpriteShiftEntry.getUnInterpolatedV(entry.getOriginal(), v) / sheetSize) + vTarget * 16);
|
||||||
builder.uv(targetU, targetV);
|
builder.uv(targetU, targetV);
|
||||||
};
|
};
|
||||||
return this;
|
return this;
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
modLoader="javafml"
|
modLoader="javafml"
|
||||||
# Forge for 1.17.1 is version 37
|
loaderVersion="[40,)"
|
||||||
loaderVersion="[41,)"
|
|
||||||
license="GNU LESSER GENERAL PUBLIC LICENSE"
|
license="GNU LESSER GENERAL PUBLIC LICENSE"
|
||||||
issueTrackerURL="https://bitbucket.org/Requios/effortless-building/issues?status=new&status=open"
|
issueTrackerURL="https://bitbucket.org/Requios/effortless-building/issues?status=new&status=open"
|
||||||
showAsResourcePack=false
|
showAsResourcePack=false
|
||||||
@@ -20,20 +19,20 @@ Makes building easier by providing tools like mirrors, arrays, build modes and a
|
|||||||
[[dependencies.effortlessbuilding]]
|
[[dependencies.effortlessbuilding]]
|
||||||
modId="forge"
|
modId="forge"
|
||||||
mandatory=true
|
mandatory=true
|
||||||
versionRange="[43.0.0,)"
|
versionRange="[40.2.4,)"
|
||||||
ordering="NONE"
|
ordering="NONE"
|
||||||
side="BOTH"
|
side="BOTH"
|
||||||
|
|
||||||
[[dependencies.effortlessbuilding]]
|
[[dependencies.effortlessbuilding]]
|
||||||
modId="minecraft"
|
modId="minecraft"
|
||||||
mandatory=true
|
mandatory=true
|
||||||
versionRange="[1.19.1,1.20)"
|
versionRange="[1.19,1.20)"
|
||||||
ordering="NONE"
|
ordering="NONE"
|
||||||
side="BOTH"
|
side="BOTH"
|
||||||
|
|
||||||
[[dependencies.effortlessbuilding]]
|
[[dependencies.effortlessbuilding]]
|
||||||
modId="flywheel"
|
modId="flywheel"
|
||||||
mandatory=true
|
mandatory=true
|
||||||
versionRange="[0.6.8,0.6.9)"
|
versionRange="[0.6.9,0.6.10)"
|
||||||
ordering="AFTER"
|
ordering="AFTER"
|
||||||
side="CLIENT"
|
side="CLIENT"
|
||||||
@@ -1,79 +1,104 @@
|
|||||||
{
|
{
|
||||||
"effortlessbuilding.screen.modifier_settings": "Настройки модификатора",
|
"effortlessbuilding.screen.modifier_settings": "Настройки модификатора",
|
||||||
"effortlessbuilding.screen.radial_menu": "Режимы строительства",
|
"effortlessbuilding.screen.radial_menu": "Режимы строительства",
|
||||||
"effortlessbuilding.screen.player_settings": "Настройки игрока",
|
"effortlessbuilding.screen.player_settings": "Настройки игрока",
|
||||||
|
|
||||||
"key.effortlessbuilding.category": "Effortless Building",
|
"key.effortlessbuilding.category": "Effortless Building",
|
||||||
"key.effortlessbuilding.hud.desc": "Меню модификаторов",
|
"key.effortlessbuilding.hud.desc": "Меню модификаторов",
|
||||||
"key.effortlessbuilding.replace.desc": "Переключить замещение блоков",
|
"key.effortlessbuilding.replace.desc": "Переключить замещение блоков",
|
||||||
"key.effortlessbuilding.mode.desc": "Режимы строительства",
|
"key.effortlessbuilding.mode.desc": "Режимы строительства",
|
||||||
"key.effortlessbuilding.undo.desc": "Отмена",
|
"key.effortlessbuilding.undo.desc": "Отмена",
|
||||||
"key.effortlessbuilding.redo.desc": "Возврат",
|
"key.effortlessbuilding.redo.desc": "Возврат",
|
||||||
"key.effortlessbuilding.altplacement.desc": "Переключить режим размещения",
|
"key.effortlessbuilding.altplacement.desc": "Переключить режим размещения",
|
||||||
|
|
||||||
"item.effortlessbuilding.randomizer_bag": "Кожаный рандомизатор",
|
"item.effortlessbuilding.randomizer_bag": "Кожаный рандомизатор",
|
||||||
"item.effortlessbuilding.golden_randomizer_bag": "Золотой рандомизатор",
|
"item.effortlessbuilding.golden_randomizer_bag": "Золотой рандомизатор",
|
||||||
"item.effortlessbuilding.diamond_randomizer_bag": "Алмазный рандомизатор",
|
"item.effortlessbuilding.diamond_randomizer_bag": "Алмазный рандомизатор",
|
||||||
"item.effortlessbuilding.reach_upgrade1": "Знание 1: Верхний мир",
|
"item.effortlessbuilding.reach_upgrade1": "Знание 1: Верхний мир",
|
||||||
"item.effortlessbuilding.reach_upgrade2": "Знание 2: Нижний мир",
|
"item.effortlessbuilding.reach_upgrade2": "Знание 2: Нижний мир",
|
||||||
"item.effortlessbuilding.reach_upgrade3": "Знание 3: Край",
|
"item.effortlessbuilding.reach_upgrade3": "Знание 3: Край",
|
||||||
|
|
||||||
"effortlessbuilding.mode.normal": "По старинке",
|
"effortlessbuilding.mode.normal": "По старинке",
|
||||||
"effortlessbuilding.mode.normal_plus": "Один блок",
|
"effortlessbuilding.mode.normal_plus": "Один блок",
|
||||||
"effortlessbuilding.mode.line": "Линия",
|
"effortlessbuilding.mode.line": "Линия",
|
||||||
"effortlessbuilding.mode.wall": "Стена",
|
"effortlessbuilding.mode.wall": "Стена",
|
||||||
"effortlessbuilding.mode.floor": "Пол",
|
"effortlessbuilding.mode.floor": "Пол",
|
||||||
"effortlessbuilding.mode.diagonal_line": "Диагональная линия",
|
"effortlessbuilding.mode.diagonal_line": "Диагональная линия",
|
||||||
"effortlessbuilding.mode.diagonal_wall": "Диагональная стена",
|
"effortlessbuilding.mode.diagonal_wall": "Диагональная стена",
|
||||||
"effortlessbuilding.mode.slope_floor": "Лесенка",
|
"effortlessbuilding.mode.slope_floor": "Лесенка",
|
||||||
"effortlessbuilding.mode.cube": "Куб",
|
"effortlessbuilding.mode.cube": "Куб",
|
||||||
"effortlessbuilding.mode.circle": "Круг",
|
"effortlessbuilding.mode.circle": "Круг",
|
||||||
"effortlessbuilding.mode.cylinder": "Цилиндр",
|
"effortlessbuilding.mode.cylinder": "Цилиндр",
|
||||||
"effortlessbuilding.mode.sphere": "Шар",
|
"effortlessbuilding.mode.sphere": "Шар",
|
||||||
"effortlessbuilding.mode.pyramid": "Пирамида",
|
"effortlessbuilding.mode.pyramid": "Пирамида",
|
||||||
"effortlessbuilding.mode.cone": "Конус",
|
"effortlessbuilding.mode.cone": "Конус",
|
||||||
"effortlessbuilding.mode.dome": "Купол",
|
"effortlessbuilding.mode.dome": "Купол",
|
||||||
|
|
||||||
"effortlessbuilding.modedescription.normal": "Оригинальные правила размещения",
|
"effortlessbuilding.modedescription.normal": "Оригинальные правила размещения",
|
||||||
"effortlessbuilding.modedescription.normal_plus": "Увеличенная дальность и предпоказ размещения",
|
"effortlessbuilding.modedescription.normal_plus": "Увеличенная дальность и предпоказ размещения",
|
||||||
"effortlessbuilding.modedescription.line": "",
|
"effortlessbuilding.modedescription.line": "",
|
||||||
"effortlessbuilding.modedescription.wall": "",
|
"effortlessbuilding.modedescription.wall": "",
|
||||||
"effortlessbuilding.modedescription.floor": "",
|
"effortlessbuilding.modedescription.floor": "",
|
||||||
"effortlessbuilding.modedescription.diagonal_line": "",
|
"effortlessbuilding.modedescription.diagonal_line": "",
|
||||||
"effortlessbuilding.modedescription.diagonal_wall": "",
|
"effortlessbuilding.modedescription.diagonal_wall": "",
|
||||||
"effortlessbuilding.modedescription.slope_floor": "",
|
"effortlessbuilding.modedescription.slope_floor": "",
|
||||||
"effortlessbuilding.modedescription.cube": "",
|
"effortlessbuilding.modedescription.cube": "",
|
||||||
"effortlessbuilding.modedescription.circle": "",
|
"effortlessbuilding.modedescription.circle": "",
|
||||||
"effortlessbuilding.modedescription.cylinder": "",
|
"effortlessbuilding.modedescription.cylinder": "",
|
||||||
"effortlessbuilding.modedescription.sphere": "",
|
"effortlessbuilding.modedescription.sphere": "",
|
||||||
"effortlessbuilding.modedescription.pyramid": "",
|
"effortlessbuilding.modedescription.pyramid": "",
|
||||||
"effortlessbuilding.modedescription.cone": "",
|
"effortlessbuilding.modedescription.cone": "",
|
||||||
"effortlessbuilding.modedescription.dome": "",
|
"effortlessbuilding.modedescription.dome": "",
|
||||||
|
|
||||||
"effortlessbuilding.action.undo": "Отмена",
|
"effortlessbuilding.action.undo": "Отмена",
|
||||||
"effortlessbuilding.action.redo": "Возврат",
|
"effortlessbuilding.action.redo": "Возврат",
|
||||||
"effortlessbuilding.action.replace": "Замещение",
|
"effortlessbuilding.action.open_modifier_settings": "Модификаторы",
|
||||||
"effortlessbuilding.action.open_modifier_settings": "Модификаторы",
|
"effortlessbuilding.action.open_player_settings": "Открыть настройки",
|
||||||
"effortlessbuilding.action.open_player_settings": "Открыть настройки",
|
|
||||||
|
|
||||||
"effortlessbuilding.action.build_speed": "Размещение",
|
"effortlessbuilding.action.replace": "Замещение",
|
||||||
"effortlessbuilding.action.filling": "Режим заполнения",
|
|
||||||
"effortlessbuilding.action.raised_edge": "Кромка",
|
|
||||||
"effortlessbuilding.action.thickness": "Толщина линии",
|
|
||||||
"effortlessbuilding.action.circle_start": "Начальная точка",
|
|
||||||
|
|
||||||
"effortlessbuilding.action.normal_speed": "Медленно",
|
"effortlessbuilding.action.replace_only_air": "Замещать только воздух",
|
||||||
"effortlessbuilding.action.fast_speed": "Быстро",
|
"effortlessbuilding.action.replace_only_air.description": "Замещаются только блоки воздуха. Нетвёрдые блоки, например, трава, по-прежнему замещаются.",
|
||||||
"effortlessbuilding.action.full": "Объём",
|
"effortlessbuilding.action.replace_blocks_and_air": "Замещать всё",
|
||||||
"effortlessbuilding.action.hollow": "Поверхность",
|
"effortlessbuilding.action.replace_blocks_and_air.description": "Замещаются как блоки, так и воздух.",
|
||||||
"effortlessbuilding.action.skeleton": "Грани",
|
"effortlessbuilding.action.replace_only_blocks": "Замещать только блоки",
|
||||||
"effortlessbuilding.action.short_edge": "Узкая",
|
"effortlessbuilding.action.replace_only_blocks.description": "Замещаются только блоки, не воздух.",
|
||||||
"effortlessbuilding.action.long_edge": "Широкая",
|
"effortlessbuilding.action.replace_filtered_by_offhand": "Фильтр по второй руке",
|
||||||
"effortlessbuilding.action.thickness_1": "1 блок толщиной",
|
"effortlessbuilding.action.replace_filtered_by_offhand.description": "Замещаются только блоки, совпадающие с блоком во второй руке. Если она пуста, замещается только воздух. Если во второй руке рандомизатор, замещаются только блоки, совпадающие с таковыми в рандомизаторе.",
|
||||||
"effortlessbuilding.action.thickness_3": "3 блока толщиной",
|
"effortlessbuilding.action.toggle_protect_tile_entities": "Сохранять блоки-сущности",
|
||||||
"effortlessbuilding.action.thickness_5": "5 блоков толщиной",
|
"effortlessbuilding.action.toggle_protect_tile_entities.description": "Хранящие данные блоки, такие как сундуки, печи и воронки, не будут замещены.",
|
||||||
"effortlessbuilding.action.start_center": "Центр",
|
|
||||||
"effortlessbuilding.action.start_corner": "Угол",
|
|
||||||
|
|
||||||
"commands.reach.usage": "/reach <уровень>"
|
"effortlessbuilding.action.build_speed": "Размещение",
|
||||||
|
"effortlessbuilding.action.filling": "Режим заполнения",
|
||||||
|
"effortlessbuilding.action.raised_edge": "Кромка",
|
||||||
|
"effortlessbuilding.action.thickness": "Толщина линии",
|
||||||
|
"effortlessbuilding.action.circle_start": "Начальная точка",
|
||||||
|
|
||||||
|
"effortlessbuilding.action.normal_speed": "Медленно",
|
||||||
|
"effortlessbuilding.action.fast_speed": "Быстро",
|
||||||
|
"effortlessbuilding.action.full": "Объём",
|
||||||
|
"effortlessbuilding.action.hollow": "Поверхность",
|
||||||
|
"effortlessbuilding.action.skeleton": "Грани",
|
||||||
|
"effortlessbuilding.action.short_edge": "Узкая",
|
||||||
|
"effortlessbuilding.action.long_edge": "Широкая",
|
||||||
|
"effortlessbuilding.action.thickness_1": "1 блок толщиной",
|
||||||
|
"effortlessbuilding.action.thickness_3": "3 блока толщиной",
|
||||||
|
"effortlessbuilding.action.thickness_5": "5 блоков толщиной",
|
||||||
|
"effortlessbuilding.action.start_center": "Центр",
|
||||||
|
"effortlessbuilding.action.start_corner": "Угол",
|
||||||
|
|
||||||
|
"commands.reach.usage": "/reach <уровень>",
|
||||||
|
|
||||||
|
"effortlessbuilding.gui.scrollInput.defaultTitle": "Выберите опцию:",
|
||||||
|
"effortlessbuilding.gui.scrollInput.scrollToModify": "Прокрутить для изменения",
|
||||||
|
"effortlessbuilding.gui.scrollInput.scrollToAdjustAmount": "Прокрутить для подгонки количества",
|
||||||
|
"effortlessbuilding.gui.scrollInput.scrollToSelect": "Прокрутить для выбора",
|
||||||
|
"effortlessbuilding.gui.scrollInput.shiftScrollsFaster": "Shift ускоряет прокрутку",
|
||||||
|
"effortlessbuilding.gui.scrollInput.controlScrollsSlower": "Ctrl замедляет прокрутку",
|
||||||
|
|
||||||
|
"effortlessbuilding.tooltip.holdForDescription": "Зажмите [%1$s] для описания",
|
||||||
|
"effortlessbuilding.tooltip.holdForControls": "Зажмите [%1$s] для управления",
|
||||||
|
"effortlessbuilding.tooltip.keyShift": "Shift",
|
||||||
|
"effortlessbuilding.tooltip.keyCtrl": "Ctrl",
|
||||||
|
"effortlessbuilding.tooltip.keybind": "[%1$s]"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user