1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2024-06-25 22:53:22 +00:00

Merge branch 'mc-1.19.x' into mc-1.20.x

This commit is contained in:
Jonathan Coates 2023-08-05 10:36:37 +01:00
commit e6bc1e4e27
No known key found for this signature in database
GPG Key ID: B9E431FF07C98D06
102 changed files with 2272 additions and 1195 deletions

View File

@ -48,6 +48,7 @@ License: MPL-2.0
Files:
doc/logo.png
doc/logo-darkmode.png
projects/common/src/main/resources/assets/computercraft/models/*
projects/common/src/main/resources/assets/computercraft/textures/*
projects/common/src/main/resources/pack.mcmeta

View File

@ -4,7 +4,12 @@
SPDX-License-Identifier: MPL-2.0
-->
# ![CC: Tweaked](doc/logo.png)
<picture>
<source media="(prefers-color-scheme: dark)" srcset="./doc/logo-darkmode.png">
<source media="(prefers-color-scheme: light)" srcset="./doc/logo.png">
<img alt="CC: Tweaked" src="./doc/logo.png">
</picture>
[![Current build status](https://github.com/cc-tweaked/CC-Tweaked/workflows/Build/badge.svg)](https://github.com/cc-tweaked/CC-Tweaked/actions "Current build status")
[![Download CC: Tweaked on CurseForge](https://img.shields.io/static/v1?label=Download&message=CC:%20Tweaked&color=E04E14&logoColor=E04E14&logo=CurseForge)][CurseForge]
[![Download CC: Tweaked on Modrinth](https://img.shields.io/static/v1?label=Download&color=00AF5C&logoColor=00AF5C&logo=Modrinth&message=CC:%20Tweaked)][Modrinth]
@ -44,7 +49,7 @@ ## Using
dependencies {
// Vanilla (i.e. for multi-loader systems)
compileOnly("cc.tweaked:cc-tweaked-$mcVersion-common-api")
compileOnly("cc.tweaked:cc-tweaked-$mcVersion-common-api:$cctVersion")
// Forge Gradle
compileOnly("cc.tweaked:cc-tweaked-$mcVersion-core-api:$cctVersion")
@ -57,6 +62,19 @@ ## Using
}
```
When using ForgeGradle, you may also need to add the following:
```groovy
minecraft {
runs {
configureEach {
property 'mixin.env.remapRefMap', 'true'
property 'mixin.env.refMapRemappingFile', "${buildDir}/createSrgToMcp/output.srg"
}
}
}
```
You should also be careful to only use classes within the `dan200.computercraft.api` package. Non-API classes are
subject to change at any point. If you depend on functionality outside the API, file an issue, and we can look into
exposing more features.

View File

@ -4,6 +4,7 @@
package cc.tweaked.gradle
import net.minecraftforge.gradle.common.util.RunConfig
import org.gradle.api.GradleException
import org.gradle.api.file.FileSystemOperations
import org.gradle.api.invocation.Gradle
@ -53,6 +54,25 @@ val useFramebuffer get() = !clientDebug && !project.hasProperty("clientNoFramebu
@get:OutputFile
val testResults = project.layout.buildDirectory.file("test-results/$name.xml")
private fun setTestProperties() {
if (!clientDebug) systemProperty("cctest.client", "")
if (renderdoc) environment("LD_PRELOAD", "/usr/lib/librenderdoc.so")
systemProperty("cctest.gametest-report", testResults.get().asFile.absoluteFile)
workingDir(project.buildDir.resolve("gametest").resolve(name))
}
init {
setTestProperties()
}
/**
* Set this task to run a given [RunConfig].
*/
fun setRunConfig(config: RunConfig) {
(this as JavaExec).setRunConfig(config)
setTestProperties() // setRunConfig may clobber some properties, ensure everything is set.
}
/**
* Copy configuration from a task with the given name.
*/
@ -64,11 +84,7 @@ fun copyFrom(path: String) = copyFrom(project.tasks.getByName(path, JavaExec::cl
fun copyFrom(task: JavaExec) {
for (dep in task.dependsOn) dependsOn(dep)
task.copyToFull(this)
if (!clientDebug) systemProperty("cctest.client", "")
if (renderdoc) environment("LD_PRELOAD", "/usr/lib/librenderdoc.so")
systemProperty("cctest.gametest-report", testResults.get().asFile.absoluteFile)
workingDir(project.buildDir.resolve("gametest").resolve(name))
setTestProperties() // copyToFull may clobber some properties, ensure everything is set.
}
/**

BIN
doc/logo-darkmode.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -7,13 +7,13 @@
# Minecraft
# MC version is specified in gradle.properties, as we need that in settings.gradle.
# Remember to update corresponding versions in fabric.mod.json/mods.toml
fabric-api = "0.83.1+1.20.1"
fabric-api = "0.86.1+1.20.1"
fabric-loader = "0.14.21"
forge = "47.1.0"
forgeSpi = "6.0.0"
mixin = "0.8.5"
parchment = "2023.03.12"
parchmentMc = "1.19.3"
parchment = "2023.06.26"
parchmentMc = "1.19.4"
# Normal dependencies
asm = "9.3"

View File

@ -11,10 +11,13 @@
import dan200.computercraft.api.turtle.TurtleSide;
import dan200.computercraft.api.turtle.TurtleUpgradeSerialiser;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.client.resources.model.UnbakedModel;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.resources.ResourceLocation;
import javax.annotation.Nullable;
import java.util.Collection;
import java.util.List;
/**
* Provides models for a {@link ITurtleUpgrade}.
@ -50,9 +53,24 @@ default TransformedModel getModel(T upgrade, CompoundTag data, TurtleSide side)
return getModel(upgrade, (ITurtleAccess) null, side);
}
/**
* A basic {@link TurtleUpgradeModeller} which renders using the upgrade's {@linkplain ITurtleUpgrade#getCraftingItem()
* crafting item}.
* Get a list of models that this turtle modeller depends on.
* <p>
* Models included in this list will be loaded and baked alongside item and block models, and so may be referenced
* by {@link TransformedModel#of(ResourceLocation)}. You do not need to override this method if you will load models
* by other means.
*
* @return A list of models that this modeller depends on.
* @see UnbakedModel#getDependencies()
*/
default Collection<ResourceLocation> getDependencies() {
return List.of();
}
/**
* A basic {@link TurtleUpgradeModeller} which renders using the upgrade's {@linkplain ITurtleUpgrade#getUpgradeItem(CompoundTag)}
* upgrade item}.
* <p>
* This uses appropriate transformations for "flat" items, namely those extending the {@literal minecraft:item/generated}
* model type. It will not appear correct for 3D models with additional depth, such as blocks.
@ -62,7 +80,7 @@ default TransformedModel getModel(T upgrade, CompoundTag data, TurtleSide side)
*/
@SuppressWarnings("unchecked")
static <T extends ITurtleUpgrade> TurtleUpgradeModeller<T> flatItem() {
return (TurtleUpgradeModeller<T>) TurtleUpgradeModellers.FLAT_ITEM;
return (TurtleUpgradeModeller<T>) TurtleUpgradeModellers.UPGRADE_ITEM;
}
/**
@ -74,7 +92,8 @@ static <T extends ITurtleUpgrade> TurtleUpgradeModeller<T> flatItem() {
* @return The constructed modeller.
*/
static <T extends ITurtleUpgrade> TurtleUpgradeModeller<T> sided(ModelResourceLocation left, ModelResourceLocation right) {
return (upgrade, turtle, side) -> TransformedModel.of(side == TurtleSide.LEFT ? left : right);
// TODO(1.21.0): Remove this.
return sided((ResourceLocation) left, right);
}
/**
@ -86,6 +105,16 @@ static <T extends ITurtleUpgrade> TurtleUpgradeModeller<T> sided(ModelResourceLo
* @return The constructed modeller.
*/
static <T extends ITurtleUpgrade> TurtleUpgradeModeller<T> sided(ResourceLocation left, ResourceLocation right) {
return (upgrade, turtle, side) -> TransformedModel.of(side == TurtleSide.LEFT ? left : right);
return new TurtleUpgradeModeller<>() {
@Override
public TransformedModel getModel(T upgrade, @Nullable ITurtleAccess turtle, TurtleSide side) {
return TransformedModel.of(side == TurtleSide.LEFT ? left : right);
}
@Override
public Collection<ResourceLocation> getDependencies() {
return List.of(left, right);
}
};
}
}

View File

@ -6,13 +6,20 @@
import com.mojang.math.Transformation;
import dan200.computercraft.api.client.TransformedModel;
import dan200.computercraft.api.turtle.ITurtleAccess;
import dan200.computercraft.api.turtle.ITurtleUpgrade;
import dan200.computercraft.api.turtle.TurtleSide;
import dan200.computercraft.impl.client.ClientPlatformHelper;
import net.minecraft.client.Minecraft;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.item.ItemStack;
import org.joml.Matrix4f;
import javax.annotation.Nullable;
class TurtleUpgradeModellers {
private static final Transformation leftTransform = getMatrixFor(-0.40625f);
private static final Transformation rightTransform = getMatrixFor(0.40625f);
private static final Transformation leftTransform = getMatrixFor(-0.4065f);
private static final Transformation rightTransform = getMatrixFor(0.4065f);
private static Transformation getMatrixFor(float offset) {
var matrix = new Matrix4f();
@ -26,6 +33,23 @@ private static Transformation getMatrixFor(float offset) {
return new Transformation(matrix);
}
static final TurtleUpgradeModeller<ITurtleUpgrade> FLAT_ITEM = (upgrade, turtle, side) ->
TransformedModel.of(upgrade.getCraftingItem(), side == TurtleSide.LEFT ? leftTransform : rightTransform);
static final TurtleUpgradeModeller<ITurtleUpgrade> UPGRADE_ITEM = new UpgradeItemModeller();
private static class UpgradeItemModeller implements TurtleUpgradeModeller<ITurtleUpgrade> {
@Override
public TransformedModel getModel(ITurtleUpgrade upgrade, @Nullable ITurtleAccess turtle, TurtleSide side) {
return getModel(turtle == null ? upgrade.getCraftingItem() : upgrade.getUpgradeItem(turtle.getUpgradeNBTData(side)), side);
}
@Override
public TransformedModel getModel(ITurtleUpgrade upgrade, CompoundTag data, TurtleSide side) {
return getModel(upgrade.getUpgradeItem(data), side);
}
private TransformedModel getModel(ItemStack stack, TurtleSide side) {
var model = Minecraft.getInstance().getItemRenderer().getItemModelShaper().getItemModel(stack);
if (stack.hasFoil()) model = ClientPlatformHelper.get().createdFoiledModel(model);
return new TransformedModel(model, side == TurtleSide.LEFT ? leftTransform : rightTransform);
}
}
}

View File

@ -5,6 +5,7 @@
package dan200.computercraft.impl.client;
import dan200.computercraft.impl.Services;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.client.resources.model.ModelManager;
import net.minecraft.client.resources.model.ModelResourceLocation;
@ -24,6 +25,15 @@ public interface ClientPlatformHelper {
*/
BakedModel getModel(ModelManager manager, ResourceLocation location);
/**
* Wrap this model in a version which renders a foil/enchantment glint.
*
* @param model The model to wrap.
* @return The wrapped model.
* @see RenderType#glint()
*/
BakedModel createdFoiledModel(BakedModel model);
static ClientPlatformHelper get() {
var instance = Instance.INSTANCE;
return instance == null ? Services.raise(ClientPlatformHelper.class, Instance.ERROR) : instance;

View File

@ -35,6 +35,7 @@ public enum TurtleToolDurability implements StringRepresentable {
/**
* The codec which may be used for serialising/deserialising {@link TurtleToolDurability}s.
*/
@SuppressWarnings("deprecation")
public static final StringRepresentable.EnumCodec<TurtleToolDurability> CODEC = StringRepresentable.fromEnum(TurtleToolDurability::values);
TurtleToolDurability(String serialisedName) {

View File

@ -13,6 +13,7 @@
import dan200.computercraft.client.render.TurtleBlockEntityRenderer;
import dan200.computercraft.client.render.monitor.MonitorBlockEntityRenderer;
import dan200.computercraft.client.turtle.TurtleModemModeller;
import dan200.computercraft.client.turtle.TurtleUpgradeModellers;
import dan200.computercraft.core.util.Colour;
import dan200.computercraft.shared.ModRegistry;
import dan200.computercraft.shared.common.IColouredItem;
@ -107,24 +108,6 @@ private static void registerItemProperty(String name, ClampedItemPropertyFunctio
}
private static final String[] EXTRA_MODELS = new String[]{
// Turtle upgrades
"block/turtle_modem_normal_off_left",
"block/turtle_modem_normal_on_left",
"block/turtle_modem_normal_off_right",
"block/turtle_modem_normal_on_right",
"block/turtle_modem_advanced_off_left",
"block/turtle_modem_advanced_on_left",
"block/turtle_modem_advanced_off_right",
"block/turtle_modem_advanced_on_right",
"block/turtle_crafting_table_left",
"block/turtle_crafting_table_right",
"block/turtle_speaker_left",
"block/turtle_speaker_right",
// Turtle block renderer
"block/turtle_colour",
"block/turtle_elf_overlay",
"block/turtle_rainbow_overlay",
@ -133,6 +116,7 @@ private static void registerItemProperty(String name, ClampedItemPropertyFunctio
public static void registerExtraModels(Consumer<ResourceLocation> register) {
for (var model : EXTRA_MODELS) register.accept(new ResourceLocation(ComputerCraftAPI.MOD_ID, model));
TurtleUpgradeModellers.getDependencies().forEach(register);
}
public static void registerItemColours(BiConsumer<ItemColor, ItemLike> register) {

View File

@ -67,14 +67,11 @@ public void renderWidget(GuiGraphics graphics, int mouseX, int mouseY, float par
graphics.blit(texture, getX(), getY(), xTexStart.getAsInt(), yTex, width, height, textureWidth, textureHeight);
}
@Override
public Component getMessage() {
return message.get().message;
}
@Override
public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) {
setTooltip(message.get().tooltip());
var message = this.message.get();
setMessage(message.message());
setTooltip(message.tooltip());
super.render(graphics, mouseX, mouseY, partialTicks);
}

View File

@ -12,7 +12,6 @@
import dev.emi.emi.api.EmiPlugin;
import dev.emi.emi.api.EmiRegistry;
import dev.emi.emi.api.stack.Comparison;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import java.util.function.BiPredicate;
@ -36,7 +35,7 @@ public void register(EmiRegistry registry) {
private static final Comparison pocketComparison = compareStacks((left, right) ->
left.getItem() instanceof PocketComputerItem && PocketComputerItem.getUpgrade(left) == PocketComputerItem.getUpgrade(right));
private static <T extends Item> Comparison compareStacks(BiPredicate<ItemStack, ItemStack> test) {
private static Comparison compareStacks(BiPredicate<ItemStack, ItemStack> test) {
return Comparison.of((left, right) -> {
ItemStack leftStack = left.getItemStack(), rightStack = right.getItemStack();
return leftStack.getItem() == rightStack.getItem() && test.test(leftStack, rightStack);

View File

@ -26,13 +26,14 @@
* <p>
* This is typically used with a {@link BakedModel} subclass - see the loader-specific projects.
*/
public final class ModelTransformer {
public static final int[] ORDER = new int[]{ 3, 2, 1, 0 };
public static final int STRIDE = DefaultVertexFormat.BLOCK.getIntegerSize();
public class ModelTransformer {
private static final int[] INVERSE_ORDER = new int[]{ 3, 2, 1, 0 };
private static final int STRIDE = DefaultVertexFormat.BLOCK.getIntegerSize();
private static final int POS_OFFSET = findOffset(DefaultVertexFormat.BLOCK, DefaultVertexFormat.ELEMENT_POSITION);
private final Matrix4f transformation;
private final boolean invert;
protected final Matrix4f transformation;
protected final boolean invert;
private @Nullable TransformedQuads cache;
public ModelTransformer(Transformation transformation) {
@ -60,7 +61,7 @@ private BakedQuad transformQuad(BakedQuad quad) {
for (var i = 0; i < 4; i++) {
var inStart = STRIDE * i;
// Reverse the order of the quads if we're inverting
var outStart = STRIDE * (invert ? ORDER[i] : i);
var outStart = getVertexOffset(i, invert);
System.arraycopy(inputData, inStart, outputData, outStart, STRIDE);
// Apply the matrix to our position
@ -84,6 +85,10 @@ private BakedQuad transformQuad(BakedQuad quad) {
return new BakedQuad(outputData, quad.getTintIndex(), direction, quad.getSprite(), quad.isShade());
}
public static int getVertexOffset(int vertex, boolean invert) {
return (invert ? ModelTransformer.INVERSE_ORDER[vertex] : vertex) * ModelTransformer.STRIDE;
}
private record TransformedQuads(List<BakedQuad> original, List<BakedQuad> transformed) {
}

View File

@ -4,8 +4,13 @@
package dan200.computercraft.client.platform;
import com.mojang.blaze3d.vertex.PoseStack;
import dan200.computercraft.shared.network.NetworkMessage;
import dan200.computercraft.shared.network.server.ServerNetworkContext;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.resources.model.BakedModel;
import javax.annotation.Nullable;
public interface ClientPlatformHelper extends dan200.computercraft.impl.client.ClientPlatformHelper {
static ClientPlatformHelper get() {
@ -18,4 +23,16 @@ static ClientPlatformHelper get() {
* @param message The message to send.
*/
void sendToServer(NetworkMessage<ServerNetworkContext> message);
/**
* Render a {@link BakedModel}, using any loader-specific hooks.
*
* @param transform The current matrix transformation to apply.
* @param buffers The current pool of render buffers.
* @param model The model to draw.
* @param lightmapCoord The current packed lightmap coordinate.
* @param overlayLight The current overlay light.
* @param tints Block colour tints to apply to the model.
*/
void renderBakedModel(PoseStack transform, MultiBufferSource buffers, BakedModel model, int lightmapCoord, int overlayLight, @Nullable int[] tints);
}

View File

@ -0,0 +1,103 @@
// SPDX-FileCopyrightText: 2023 The CC: Tweaked Developers
//
// SPDX-License-Identifier: MPL-2.0
package dan200.computercraft.client.render;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import dan200.computercraft.client.model.turtle.ModelTransformer;
import dan200.computercraft.client.platform.ClientPlatformHelper;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.renderer.entity.ItemRenderer;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.world.item.ItemStack;
import org.joml.Vector4f;
import javax.annotation.Nullable;
import java.util.List;
/**
* Utilities for rendering {@link BakedModel}s and {@link BakedQuad}s.
*/
public final class ModelRenderer {
private ModelRenderer() {
}
/**
* Render a list of {@linkplain BakedQuad quads} to a buffer.
* <p>
* This is not intended to be used directly, but instead by {@link ClientPlatformHelper#renderBakedModel(PoseStack, MultiBufferSource, BakedModel, int, int, int[])}. The
* implementation here is pretty similar to {@link ItemRenderer#renderQuadList(PoseStack, VertexConsumer, List, ItemStack, int, int)},
* but supports inverted quads (i.e. those with a negative scale).
*
* @param transform The current matrix transformation to apply.
* @param buffer The buffer to draw to.
* @param quads The quads to draw.
* @param lightmapCoord The current packed lightmap coordinate.
* @param overlayLight The current overlay light.
* @param tints Block colour tints to apply to the model.
*/
public static void renderQuads(PoseStack transform, VertexConsumer buffer, List<BakedQuad> quads, int lightmapCoord, int overlayLight, @Nullable int[] tints) {
var matrix = transform.last();
var inverted = matrix.pose().determinant() < 0;
for (var bakedquad : quads) {
var tint = -1;
if (tints != null && bakedquad.isTinted()) {
var idx = bakedquad.getTintIndex();
if (idx >= 0 && idx < tints.length) tint = tints[bakedquad.getTintIndex()];
}
var r = (float) (tint >> 16 & 255) / 255.0F;
var g = (float) (tint >> 8 & 255) / 255.0F;
var b = (float) (tint & 255) / 255.0F;
putBulkQuad(buffer, matrix, bakedquad, r, g, b, lightmapCoord, overlayLight, inverted);
}
}
/**
* A version of {@link VertexConsumer#putBulkData(PoseStack.Pose, BakedQuad, float, float, float, int, int)} which
* will reverse vertex order when the matrix is inverted.
*
* @param buffer The buffer to draw to.
* @param pose The current matrix stack.
* @param quad The quad to draw.
* @param red The red tint of this quad.
* @param green The green tint of this quad.
* @param blue The blue tint of this quad.
* @param lightmapCoord The lightmap coordinate
* @param overlayLight The overlay light.
* @param invert Whether to reverse the order of this quad.
*/
private static void putBulkQuad(VertexConsumer buffer, PoseStack.Pose pose, BakedQuad quad, float red, float green, float blue, int lightmapCoord, int overlayLight, boolean invert) {
var matrix = pose.pose();
// It's a little dubious to transform using this matrix rather than the normal matrix. This mirrors the logic in
// Direction.rotate (so not out of nowhere!), but is a little suspicious.
var dirNormal = quad.getDirection().getNormal();
var vector = new Vector4f();
matrix.transform(dirNormal.getX(), dirNormal.getY(), dirNormal.getZ(), 0.0f, vector).normalize();
float normalX = vector.x(), normalY = vector.y(), normalZ = vector.z();
var vertices = quad.getVertices();
for (var vertex = 0; vertex < 4; vertex++) {
var i = ModelTransformer.getVertexOffset(vertex, invert);
var x = Float.intBitsToFloat(vertices[i]);
var y = Float.intBitsToFloat(vertices[i + 1]);
var z = Float.intBitsToFloat(vertices[i + 2]);
matrix.transform(x, y, z, 1, vector);
var u = Float.intBitsToFloat(vertices[i + 4]);
var v = Float.intBitsToFloat(vertices[i + 5]);
buffer.vertex(
vector.x(), vector.y(), vector.z(),
red, green, blue, 1.0F, u, v, overlayLight, lightmapCoord,
normalX, normalY, normalZ
);
}
}
}

View File

@ -5,36 +5,28 @@
package dan200.computercraft.client.render;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import com.mojang.math.Axis;
import com.mojang.math.Transformation;
import dan200.computercraft.api.ComputerCraftAPI;
import dan200.computercraft.api.turtle.TurtleSide;
import dan200.computercraft.client.model.turtle.ModelTransformer;
import dan200.computercraft.client.platform.ClientPlatformHelper;
import dan200.computercraft.client.turtle.TurtleUpgradeModellers;
import dan200.computercraft.shared.computer.core.ComputerFamily;
import dan200.computercraft.shared.turtle.blocks.TurtleBlockEntity;
import dan200.computercraft.shared.util.DirectionUtil;
import dan200.computercraft.shared.util.Holiday;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.Sheets;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderer;
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.RandomSource;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.HitResult;
import org.joml.Vector4f;
import javax.annotation.Nullable;
import java.util.List;
public class TurtleBlockEntityRenderer implements BlockEntityRenderer<TurtleBlockEntity> {
private static final ModelResourceLocation NORMAL_TURTLE_MODEL = new ModelResourceLocation(ComputerCraftAPI.MOD_ID, "turtle_normal", "inventory");
@ -42,8 +34,6 @@ public class TurtleBlockEntityRenderer implements BlockEntityRenderer<TurtleBloc
private static final ResourceLocation COLOUR_TURTLE_MODEL = new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_colour");
private static final ResourceLocation ELF_OVERLAY_MODEL = new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_elf_overlay");
private final RandomSource random = RandomSource.create(0);
private final BlockEntityRenderDispatcher renderer;
private final Font font;
@ -109,23 +99,22 @@ public void render(TurtleBlockEntity turtle, float partialTicks, PoseStack trans
var family = turtle.getFamily();
var overlay = turtle.getOverlay();
var buffer = buffers.getBuffer(Sheets.translucentCullBlockSheet());
renderModel(transform, buffer, lightmapCoord, overlayLight, getTurtleModel(family, colour != -1), colour == -1 ? null : new int[]{ colour });
renderModel(transform, buffers, lightmapCoord, overlayLight, getTurtleModel(family, colour != -1), colour == -1 ? null : new int[]{ colour });
// Render the overlay
var overlayModel = getTurtleOverlayModel(overlay, Holiday.getCurrent() == Holiday.CHRISTMAS);
if (overlayModel != null) {
renderModel(transform, buffer, lightmapCoord, overlayLight, overlayModel, null);
renderModel(transform, buffers, lightmapCoord, overlayLight, overlayModel, null);
}
// Render the upgrades
renderUpgrade(transform, buffer, lightmapCoord, overlayLight, turtle, TurtleSide.LEFT, partialTicks);
renderUpgrade(transform, buffer, lightmapCoord, overlayLight, turtle, TurtleSide.RIGHT, partialTicks);
renderUpgrade(transform, buffers, lightmapCoord, overlayLight, turtle, TurtleSide.LEFT, partialTicks);
renderUpgrade(transform, buffers, lightmapCoord, overlayLight, turtle, TurtleSide.RIGHT, partialTicks);
transform.popPose();
}
private void renderUpgrade(PoseStack transform, VertexConsumer renderer, int lightmapCoord, int overlayLight, TurtleBlockEntity turtle, TurtleSide side, float f) {
private void renderUpgrade(PoseStack transform, MultiBufferSource buffers, int lightmapCoord, int overlayLight, TurtleBlockEntity turtle, TurtleSide side, float f) {
var upgrade = turtle.getUpgrade(side);
if (upgrade == null) return;
transform.pushPose();
@ -136,16 +125,15 @@ private void renderUpgrade(PoseStack transform, VertexConsumer renderer, int lig
transform.translate(0.0f, -0.5f, -0.5f);
var model = TurtleUpgradeModellers.getModel(upgrade, turtle.getAccess(), side);
pushPoseFromTransformation(transform, model.getMatrix());
renderModel(transform, renderer, lightmapCoord, overlayLight, model.getModel(), null);
transform.popPose();
applyTransformation(transform, model.getMatrix());
renderModel(transform, buffers, lightmapCoord, overlayLight, model.getModel(), null);
transform.popPose();
}
private void renderModel(PoseStack transform, VertexConsumer renderer, int lightmapCoord, int overlayLight, ResourceLocation modelLocation, @Nullable int[] tints) {
private void renderModel(PoseStack transform, MultiBufferSource buffers, int lightmapCoord, int overlayLight, ResourceLocation modelLocation, @Nullable int[] tints) {
var modelManager = Minecraft.getInstance().getItemRenderer().getItemModelShaper().getModelManager();
renderModel(transform, renderer, lightmapCoord, overlayLight, ClientPlatformHelper.get().getModel(modelManager, modelLocation), tints);
renderModel(transform, buffers, lightmapCoord, overlayLight, ClientPlatformHelper.get().getModel(modelManager, modelLocation), tints);
}
/**
@ -159,80 +147,11 @@ private void renderModel(PoseStack transform, VertexConsumer renderer, int light
* @param tints Tints for the quads, as an array of RGB values.
* @see net.minecraft.client.renderer.block.ModelBlockRenderer#renderModel
*/
private void renderModel(PoseStack transform, VertexConsumer renderer, int lightmapCoord, int overlayLight, BakedModel model, @Nullable int[] tints) {
for (var facing : DirectionUtil.FACINGS) {
random.setSeed(42);
renderQuads(transform, renderer, lightmapCoord, overlayLight, model.getQuads(null, facing, random), tints);
}
random.setSeed(42);
renderQuads(transform, renderer, lightmapCoord, overlayLight, model.getQuads(null, null, random), tints);
private void renderModel(PoseStack transform, MultiBufferSource renderer, int lightmapCoord, int overlayLight, BakedModel model, @Nullable int[] tints) {
ClientPlatformHelper.get().renderBakedModel(transform, renderer, model, lightmapCoord, overlayLight, tints);
}
private static void renderQuads(PoseStack transform, VertexConsumer buffer, int lightmapCoord, int overlayLight, List<BakedQuad> quads, @Nullable int[] tints) {
var matrix = transform.last();
var inverted = matrix.pose().determinant() < 0;
for (var bakedquad : quads) {
var tint = -1;
if (tints != null && bakedquad.isTinted()) {
var idx = bakedquad.getTintIndex();
if (idx >= 0 && idx < tints.length) tint = tints[bakedquad.getTintIndex()];
}
var r = (float) (tint >> 16 & 255) / 255.0F;
var g = (float) (tint >> 8 & 255) / 255.0F;
var b = (float) (tint & 255) / 255.0F;
if (inverted) {
putBulkQuadInvert(buffer, matrix, bakedquad, r, g, b, lightmapCoord, overlayLight);
} else {
buffer.putBulkData(matrix, bakedquad, r, g, b, lightmapCoord, overlayLight);
}
}
}
/**
* A version of {@link VertexConsumer#putBulkData(PoseStack.Pose, BakedQuad, float, float, float, int, int)} for
* when the matrix is inverted.
*
* @param buffer The buffer to draw to.
* @param pose The current matrix stack.
* @param quad The quad to draw.
* @param red The red tint of this quad.
* @param green The green tint of this quad.
* @param blue The blue tint of this quad.
* @param lightmapCoord The lightmap coordinate
* @param overlayLight The overlay light.
*/
private static void putBulkQuadInvert(VertexConsumer buffer, PoseStack.Pose pose, BakedQuad quad, float red, float green, float blue, int lightmapCoord, int overlayLight) {
var matrix = pose.pose();
// It's a little dubious to transform using this matrix rather than the normal matrix. This mirrors the logic in
// Direction.rotate (so not out of nowhere!), but is a little suspicious.
var dirNormal = quad.getDirection().getNormal();
var normal = matrix.transform(new Vector4f(dirNormal.getX(), dirNormal.getY(), dirNormal.getZ(), 0.0f)).normalize();
var vertices = quad.getVertices();
for (var vertex : ModelTransformer.ORDER) {
var i = vertex * ModelTransformer.STRIDE;
var x = Float.intBitsToFloat(vertices[i]);
var y = Float.intBitsToFloat(vertices[i + 1]);
var z = Float.intBitsToFloat(vertices[i + 2]);
var transformed = matrix.transform(new Vector4f(x, y, z, 1));
var u = Float.intBitsToFloat(vertices[i + 4]);
var v = Float.intBitsToFloat(vertices[i + 5]);
buffer.vertex(
transformed.x(), transformed.y(), transformed.z(),
red, green, blue, 1.0F, u, v, overlayLight, lightmapCoord,
normal.x(), normal.y(), normal.z()
);
}
}
private static void pushPoseFromTransformation(PoseStack stack, Transformation transformation) {
stack.pushPose();
private static void applyTransformation(PoseStack stack, Transformation transformation) {
var trans = transformation.getTranslation();
stack.translate(trans.x(), trans.y(), trans.z());

View File

@ -13,6 +13,9 @@
import net.minecraft.resources.ResourceLocation;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
import java.util.List;
/**
* A {@link TurtleUpgradeModeller} for modems, providing different models depending on if the modem is on/off.
*/
@ -48,4 +51,9 @@ public TransformedModel getModel(TurtleModem upgrade, @Nullable ITurtleAccess tu
? TransformedModel.of(active ? leftOnModel : leftOffModel)
: TransformedModel.of(active ? rightOnModel : rightOffModel);
}
@Override
public Collection<ResourceLocation> getDependencies() {
return List.of(leftOffModel, rightOffModel, leftOnModel, rightOnModel);
}
}

View File

@ -15,10 +15,12 @@
import dan200.computercraft.impl.UpgradeManager;
import net.minecraft.client.Minecraft;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.resources.ResourceLocation;
import java.util.Map;
import java.util.WeakHashMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Stream;
/**
* A registry of {@link TurtleUpgradeModeller}s.
@ -71,4 +73,8 @@ private static TurtleUpgradeModeller<?> getModeller(ITurtleUpgrade upgradeA) {
var modeller = turtleModels.get(wrapper.serialiser());
return modeller == null ? NULL_TURTLE_MODELLER : modeller;
}
public static Stream<ResourceLocation> getDependencies() {
return turtleModels.values().stream().flatMap(x -> x.getDependencies().stream());
}
}

View File

@ -158,9 +158,6 @@ private void addTranslations() {
add("commands.computercraft.track.dump.desc", "Dump the latest results of computer tracking.");
add("commands.computercraft.track.dump.no_timings", "No timings available");
add("commands.computercraft.track.dump.computer", "Computer");
add("commands.computercraft.reload.synopsis", "Reload the ComputerCraft config file");
add("commands.computercraft.reload.desc", "Reload the ComputerCraft config file");
add("commands.computercraft.reload.done", "Reloaded config");
add("commands.computercraft.queue.synopsis", "Send a computer_command event to a command computer");
add("commands.computercraft.queue.desc", "Send a computer_command event to a command computer, passing through the additional arguments. This is mostly designed for map makers, acting as a more computer-friendly version of /trigger. Any player can run the command, which would most likely be done through a text component's click event.");
@ -286,8 +283,8 @@ private Stream<String> getExpectedKeys() {
turtleUpgrades.getGeneratedUpgrades().stream().map(UpgradeBase::getUnlocalisedAdjective),
pocketUpgrades.getGeneratedUpgrades().stream().map(UpgradeBase::getUnlocalisedAdjective),
Metric.metrics().values().stream().map(x -> AggregatedMetric.TRANSLATION_PREFIX + x.name() + ".name"),
getConfigEntries(ConfigSpec.serverSpec).map(ConfigFile.Entry::translationKey),
getConfigEntries(ConfigSpec.clientSpec).map(ConfigFile.Entry::translationKey)
ConfigSpec.serverSpec.entries().map(ConfigFile.Entry::translationKey),
ConfigSpec.clientSpec.entries().map(ConfigFile.Entry::translationKey)
).flatMap(x -> x);
}
@ -321,16 +318,4 @@ private void addConfigEntry(ConfigFile.Entry value, String text) {
add(value.translationKey(), text);
add(value.translationKey() + ".tooltip", value.comment());
}
private static Stream<ConfigFile.Entry> getConfigEntries(ConfigFile spec) {
return spec.entries().flatMap(LanguageProvider::getConfigEntries);
}
private static Stream<ConfigFile.Entry> getConfigEntries(ConfigFile.Entry entry) {
if (entry instanceof ConfigFile.Value<?>) return Stream.of(entry);
if (entry instanceof ConfigFile.Group group) {
return Stream.concat(Stream.of(entry), group.children().flatMap(LanguageProvider::getConfigEntries));
}
throw new IllegalStateException("Invalid config entry " + entry);
}
}

View File

@ -44,12 +44,12 @@ public static <A extends ArgumentType<?>> void serializeToNetwork(FriendlyByteBu
@SuppressWarnings("unchecked")
private static <A extends ArgumentType<?>, T extends ArgumentTypeInfo.Template<A>> void serializeToNetwork(FriendlyByteBuf buffer, ArgumentTypeInfo<A, T> type, ArgumentTypeInfo.Template<A> template) {
RegistryWrappers.writeId(buffer, RegistryWrappers.COMMAND_ARGUMENT_TYPES, type);
buffer.writeId(RegistryWrappers.COMMAND_ARGUMENT_TYPES, type);
type.serializeToNetwork((T) template, buffer);
}
public static ArgumentTypeInfo.Template<?> deserialize(FriendlyByteBuf buffer) {
var type = RegistryWrappers.readId(buffer, RegistryWrappers.COMMAND_ARGUMENT_TYPES);
var type = buffer.readById(RegistryWrappers.COMMAND_ARGUMENT_TYPES);
Objects.requireNonNull(type, "Unknown argument type");
return type.deserializeFromNetwork(buffer);
}

View File

@ -199,6 +199,11 @@ protected ComputerSide remapLocalSide(ComputerSide localSide) {
return localSide;
}
private void updateRedstoneInputs(ServerComputer computer) {
var pos = getBlockPos();
for (var dir : DirectionUtil.FACINGS) updateRedstoneInput(computer, dir, pos.relative(dir));
}
private void updateRedstoneInput(ServerComputer computer, Direction dir, BlockPos targetPos) {
var offsetSide = dir.getOpposite();
var localDir = remapToLocalSide(dir);
@ -254,8 +259,7 @@ private void updateInputAt(BlockPos neighbour) {
// If the position is not any adjacent one, update all inputs. This is pretty terrible, but some redstone mods
// handle this incorrectly.
var pos = getBlockPos();
for (var dir : DirectionUtil.FACINGS) updateRedstoneInput(computer, dir, pos.relative(dir));
updateRedstoneInputs(computer);
invalidSides = (1 << 6) - 1; // Mark all peripherals as dirty.
}
@ -264,9 +268,10 @@ private void updateInputAt(BlockPos neighbour) {
*/
public void updateOutput() {
BlockEntityHelpers.updateBlock(this);
for (var dir : DirectionUtil.FACINGS) {
RedstoneUtil.propagateRedstoneOutput(getLevel(), getBlockPos(), dir);
}
for (var dir : DirectionUtil.FACINGS) RedstoneUtil.propagateRedstoneOutput(getLevel(), getBlockPos(), dir);
var computer = getServerComputer();
if (computer != null) updateRedstoneInputs(computer);
}
protected abstract ServerComputer createComputer(int id);

View File

@ -54,12 +54,6 @@ non-sealed interface Value<T> extends Entry, Supplier<T> {
* A group of config entries.
*/
non-sealed interface Group extends Entry {
/**
* Get all entries in this group.
*
* @return All child entries.
*/
Stream<Entry> children();
}
/**

View File

@ -5,6 +5,7 @@
package dan200.computercraft.shared.platform;
import net.minecraft.commands.synchronization.ArgumentTypeInfo;
import net.minecraft.core.IdMap;
import net.minecraft.core.Registry;
import net.minecraft.core.registries.Registries;
import net.minecraft.network.FriendlyByteBuf;
@ -36,9 +37,7 @@ public final class RegistryWrappers {
public static final RegistryWrapper<RecipeSerializer<?>> RECIPE_SERIALIZERS = PlatformHelper.get().wrap(Registries.RECIPE_SERIALIZER);
public static final RegistryWrapper<MenuType<?>> MENU = PlatformHelper.get().wrap(Registries.MENU);
public interface RegistryWrapper<T> extends Iterable<T> {
int getId(T object);
public interface RegistryWrapper<T> extends IdMap<T> {
ResourceLocation getKey(T object);
T get(ResourceLocation location);
@ -46,8 +45,6 @@ public interface RegistryWrapper<T> extends Iterable<T> {
@Nullable
T tryGet(ResourceLocation location);
T get(int id);
default Stream<T> stream() {
return StreamSupport.stream(spliterator(), false);
}
@ -56,15 +53,6 @@ default Stream<T> stream() {
private RegistryWrappers() {
}
public static <K> void writeId(FriendlyByteBuf buf, RegistryWrapper<K> registry, K object) {
buf.writeVarInt(registry.getId(object));
}
public static <K> K readId(FriendlyByteBuf buf, RegistryWrapper<K> registry) {
var id = buf.readVarInt();
return registry.get(id);
}
public static <K> void writeKey(FriendlyByteBuf buf, RegistryWrapper<K> registry, K object) {
buf.writeResourceLocation(registry.getKey(object));
}

View File

@ -75,7 +75,7 @@ public TurtleCommandResult execute(ITurtleAccess turtle) {
}
}
public static boolean deploy(
private static boolean deploy(
ItemStack stack, ITurtleAccess turtle, TurtlePlayer turtlePlayer, Direction direction,
@Nullable Object[] extraArguments, @Nullable ErrorMessage outErrorMessage
) {
@ -141,6 +141,22 @@ private static boolean canDeployOnBlock(
return true;
}
/**
* Calculate where a turtle would interact with a block.
*
* @param position The position of the block.
* @param side The side the turtle is clicking on.
* @return The hit result.
*/
public static BlockHitResult getHitResult(BlockPos position, Direction side) {
var hitX = 0.5 + side.getStepX() * 0.5;
var hitY = 0.5 + side.getStepY() * 0.5;
var hitZ = 0.5 + side.getStepZ() * 0.5;
if (Math.abs(hitY - 0.5) < 0.01) hitY = 0.45;
return new BlockHitResult(new Vec3(position.getX() + hitX, position.getY() + hitY, position.getZ() + hitZ), side, position, false);
}
private static boolean deployOnBlock(
ItemStack stack, ITurtleAccess turtle, TurtlePlayer turtlePlayer, BlockPos position, Direction side,
@Nullable Object[] extraArguments, boolean adjacent, @Nullable ErrorMessage outErrorMessage
@ -150,14 +166,8 @@ private static boolean deployOnBlock(
var playerPosition = position.relative(side);
turtlePlayer.setPosition(turtle, playerPosition, playerDir);
// Calculate where the turtle would hit the block
var hitX = 0.5f + side.getStepX() * 0.5f;
var hitY = 0.5f + side.getStepY() * 0.5f;
var hitZ = 0.5f + side.getStepZ() * 0.5f;
if (Math.abs(hitY - 0.5f) < 0.01f) hitY = 0.45f;
// Check if there's something suitable to place onto
var hit = new BlockHitResult(new Vec3(position.getX() + hitX, position.getY() + hitY, position.getZ() + hitZ), side, position, false);
var hit = getHitResult(position, side);
var context = new UseOnContext(turtlePlayer.player(), InteractionHand.MAIN_HAND, hit);
if (!canDeployOnBlock(new BlockPlaceContext(context), turtle, turtlePlayer, position, side, adjacent, outErrorMessage)) {
return false;

View File

@ -100,12 +100,12 @@ public CompoundTag getUpgradeData(ItemStack stack) {
public ItemStack getUpgradeItem(CompoundTag upgradeData) {
// Copy upgrade data back to the item.
var item = super.getUpgradeItem(upgradeData).copy();
item.setTag(upgradeData.contains(TAG_ITEM_TAG, TAG_COMPOUND) ? upgradeData.getCompound(TAG_ITEM_TAG).copy() : null);
item.setTag(upgradeData.contains(TAG_ITEM_TAG, TAG_COMPOUND) ? upgradeData.getCompound(TAG_ITEM_TAG) : null);
return item;
}
private ItemStack getToolStack(ITurtleAccess turtle, TurtleSide side) {
return getUpgradeItem(turtle.getUpgradeNBTData(side));
return getUpgradeItem(turtle.getUpgradeNBTData(side)).copy();
}
private void setToolStack(ITurtleAccess turtle, TurtleSide side, ItemStack stack) {
@ -294,19 +294,20 @@ private boolean attack(ServerPlayer player, Direction direction, Entity entity)
private TurtleCommandResult dig(ITurtleAccess turtle, TurtleSide side, Direction direction) {
var level = (ServerLevel) turtle.getLevel();
var blockPosition = turtle.getPosition().relative(direction);
if (level.isEmptyBlock(blockPosition) || WorldUtil.isLiquidBlock(level, blockPosition)) {
return TurtleCommandResult.failure("Nothing to dig here");
}
return withEquippedItem(turtle, side, direction, turtlePlayer -> {
var stack = turtlePlayer.player().getItemInHand(InteractionHand.MAIN_HAND);
// Right-click the block when using a shovel/hoe.
if (PlatformHelper.get().hasToolUsage(item) && TurtlePlaceCommand.deploy(stack, turtle, turtlePlayer, direction, null, null)) {
// Right-click the block when using a shovel/hoe. Important that we do this before checking the block is
// present, as we allow doing these actions from slightly further away.
if (PlatformHelper.get().hasToolUsage(stack) && useTool(level, turtle, turtlePlayer, stack, direction)) {
return TurtleCommandResult.success();
}
var blockPosition = turtle.getPosition().relative(direction);
if (level.isEmptyBlock(blockPosition) || WorldUtil.isLiquidBlock(level, blockPosition)) {
return TurtleCommandResult.failure("Nothing to dig here");
}
// Check if we can break the block
var breakable = checkBlockBreakable(level, blockPosition, turtlePlayer);
if (!breakable.isSuccess()) return breakable;
@ -320,6 +321,32 @@ private TurtleCommandResult dig(ITurtleAccess turtle, TurtleSide side, Direction
});
}
/**
* Attempt to use a tool against a block instead.
*
* @param level The current level.
* @param turtle The current turtle.
* @param turtlePlayer The turtle player, already positioned and with a stack equipped.
* @param stack The current tool's stack.
* @param direction The direction this action occurs in.
* @return Whether the tool was successfully used.
* @see PlatformHelper#hasToolUsage(ItemStack)
*/
private boolean useTool(ServerLevel level, ITurtleAccess turtle, TurtlePlayer turtlePlayer, ItemStack stack, Direction direction) {
var position = turtle.getPosition().relative(direction);
// Allow digging one extra block below the turtle, as you can't till dirt/flatten grass if there's a block
// above.
if (direction == Direction.DOWN && level.isEmptyBlock(position)) position = position.relative(direction);
if (!level.isInWorldBounds(position) || level.isEmptyBlock(position) || turtlePlayer.isBlockProtected(level, position)) {
return false;
}
var hit = TurtlePlaceCommand.getHitResult(position, direction.getOpposite());
var result = PlatformHelper.get().useOn(turtlePlayer.player(), stack, hit, x -> false);
return result.consumesAction();
}
private static boolean isTriviallyBreakable(BlockGetter reader, BlockPos pos, BlockState state) {
return state.is(ComputerCraftTags.Blocks.TURTLE_ALWAYS_BREAKABLE)
// Allow breaking any "instabreak" block.

View File

@ -17,6 +17,8 @@
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.Block;
import java.util.Objects;
public final class TurtleToolSerialiser implements TurtleUpgradeSerialiser<TurtleTool> {
public static final TurtleToolSerialiser INSTANCE = new TurtleToolSerialiser();
@ -44,7 +46,8 @@ public TurtleTool fromJson(ResourceLocation id, JsonObject object) {
@Override
public TurtleTool fromNetwork(ResourceLocation id, FriendlyByteBuf buffer) {
var adjective = buffer.readUtf();
var craftingItem = RegistryWrappers.readId(buffer, RegistryWrappers.ITEMS);
var craftingItem = buffer.readById(RegistryWrappers.ITEMS);
Objects.requireNonNull(craftingItem, "Unknown crafting item");
var toolItem = buffer.readItem();
// damageMultiplier and breakable aren't used by the client, but we need to construct the upgrade exactly
// as otherwise syncing on an SP world will overwrite the (shared) upgrade registry with an invalid upgrade!
@ -59,7 +62,7 @@ public TurtleTool fromNetwork(ResourceLocation id, FriendlyByteBuf buffer) {
@Override
public void toNetwork(FriendlyByteBuf buffer, TurtleTool upgrade) {
buffer.writeUtf(upgrade.getUnlocalisedAdjective());
RegistryWrappers.writeId(buffer, RegistryWrappers.ITEMS, upgrade.getCraftingItem().getItem());
buffer.writeId(RegistryWrappers.ITEMS, upgrade.getCraftingItem().getItem());
buffer.writeItem(upgrade.item);
buffer.writeFloat(upgrade.damageMulitiplier);
buffer.writeBoolean(upgrade.allowEnchantments);

View File

@ -0,0 +1,56 @@
// SPDX-FileCopyrightText: 2023 The CC: Tweaked Developers
//
// SPDX-License-Identifier: MPL-2.0
package dan200.computercraft.shared.util;
import org.jetbrains.annotations.Nullable;
import java.util.AbstractList;
import java.util.Iterator;
import java.util.List;
/**
* A list which prepends a single value to another list.
*
* @param <T> The type of item in the list.
*/
public final class ConsList<T> extends AbstractList<T> {
private final T head;
private final List<T> tail;
public ConsList(T head, List<T> tail) {
this.head = head;
this.tail = tail;
}
@Override
public T get(int index) {
return index == 0 ? head : tail.get(index - 1);
}
@Override
public int size() {
return 1 + tail.size();
}
@Override
public Iterator<T> iterator() {
return new Iterator<>() {
private @Nullable Iterator<T> tailIterator;
@Override
public boolean hasNext() {
return tailIterator == null || tailIterator.hasNext();
}
@Override
public T next() {
if (tailIterator != null) return tailIterator.next();
tailIterator = tail.iterator();
return head;
}
};
}
}

View File

@ -50,6 +50,8 @@ public static void propagateRedstoneOutput(Level world, BlockPos pos, Direction
var neighbourPos = pos.relative(side);
world.neighborChanged(neighbourPos, block.getBlock(), pos);
world.updateNeighborsAtExceptFromFacing(neighbourPos, block.getBlock(), side.getOpposite());
// We intentionally use updateNeighborsAt here instead of updateNeighborsAtExceptFromFacing, as computers can
// both send and receive redstone, and so also need to be updated.
world.updateNeighborsAt(neighbourPos, block.getBlock());
}
}

View File

@ -7,7 +7,6 @@
import javax.annotation.Nullable;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Stream;
/**
@ -38,12 +37,6 @@ public void setValue(Iterable<K> key, V value) {
getChild(key).current = value;
}
public Stream<V> children() {
return children == null
? Stream.empty()
: children.values().stream().map(x -> x.current).filter(Objects::nonNull);
}
public Stream<V> stream() {
return Stream.concat(
current == null ? Stream.empty() : Stream.of(current),

View File

@ -1,6 +1,8 @@
{
"argument.computercraft.argument_expected": "Očekáván argument",
"argument.computercraft.computer.many_matching": "Pro '%s' se shoduje více počítačů (instance %s)",
"argument.computercraft.computer.no_matching": "Pro '%s' se neshodují žádné počítače",
"argument.computercraft.tracking_field.no_field": "Neznámé pole '%s'",
"block.computercraft.cable": "Síťový kabel",
"block.computercraft.computer_advanced": "Pokročilý počítač",
"block.computercraft.computer_command": "Příkazový počítač",
@ -12,6 +14,7 @@
"block.computercraft.speaker": "Reproduktor",
"block.computercraft.turtle_advanced": "Pokročilý robot",
"block.computercraft.turtle_advanced.upgraded": "Pokročilý %s robot",
"block.computercraft.turtle_advanced.upgraded_twice": "Pokročilý %s %s robot",
"block.computercraft.turtle_normal": "Robot",
"block.computercraft.turtle_normal.upgraded": "%s robot",
"block.computercraft.turtle_normal.upgraded_twice": "%s %s robot",
@ -21,117 +24,103 @@
"block.computercraft.wireless_modem_normal": "Bezdrátový modem",
"chat.computercraft.wired_modem.peripheral_connected": "Periferie \"%s\" připojena k sítí",
"chat.computercraft.wired_modem.peripheral_disconnected": "Periferie \"%s\" odpojena od sítě",
"commands.computercraft.desc": "Příkaz /computercraft dává různé ladící a správcovské nástroje pro ovládání a interakci s počítači.",
"commands.computercraft.dump.action": "Ukázat více informací o tomto počítači",
"commands.computercraft.dump.desc": "Ukáže stav všech počítačů nebo specifické informace o jednom počítači. Můžeš specifikovat ID počítačové instance (tř. 123), ID počítače (tř #123) nebo štítek (tř. \"@Můj počítač\").",
"commands.computercraft.dump.open_path": "Ukázat soubory tohoto počítače",
"commands.computercraft.dump.synopsis": "Ukázat stav počítačů.",
"commands.computercraft.generic.additional_rows": "%d řádků navíc…",
"commands.computercraft.generic.exception": "Neočekávaná chyba (%s)",
"commands.computercraft.generic.no": "N",
"commands.computercraft.generic.no_position": "<žádná pozice>",
"commands.computercraft.generic.position": "%s, %s, %s",
"commands.computercraft.generic.yes": "A",
"commands.computercraft.help.desc": "Ukáže tuto pomocnou zprávu",
"commands.computercraft.help.no_children": "%s nemá žádné podpříkazy",
"commands.computercraft.help.no_command": "Neznámý příkaz '%s'",
"commands.computercraft.help.synopsis": "Zaslat pomoc pro specifický příkaz",
"commands.computercraft.queue.desc": "Poslat událost computer_command příkazovému počítači, procházející přes ostatní argumenty. Toto je většinou určeno pro tvůrce map, chovající se jako pro počítač více přátelská verze příkazu /trigger. Jakýkoliv hráč může spustit příkaz, což by ale bylo většinou uděláno přes událost kliknutím na textový komponent.",
"commands.computercraft.queue.synopsis": "Poslat událost computer_command příkazovému počítači",
"commands.computercraft.reload.desc": "Znovu načíst konfigurační soubor ComputerCraftu",
"commands.computercraft.reload.done": "Konfigurace znovu načtena",
"commands.computercraft.reload.synopsis": "Znovu načíst konfigurační soubor ComputerCraftu",
"commands.computercraft.shutdown.desc": "Vypnout zapsané počítače nebo všechny pokud nejsou specifikovány. Můžeš specifikovat ID počítačové instance (tř. 123) ID počítače (tř. #123) nebo štítek (tř. \"@Můj počítač\").",
"commands.computercraft.shutdown.done": "Vypnuto %s/%s počítačů",
"commands.computercraft.shutdown.synopsis": "Vypne počítače na dálku.",
"commands.computercraft.tp.not_player": "Nelze otevřít terminál pro nehráče",
"commands.computercraft.tp.not_there": "Nelze najít počítač ve světě",
"commands.computercraft.track.dump.no_timings": "Nejsou k dispozici žádná časování",
"commands.computercraft.track.dump.synopsis": "Stáhnout nejnovější výsledky sledování",
"commands.computercraft.track.start.synopsis": "Začít sledovat všechny počítače",
"commands.computercraft.track.stop.action": "Klikni pro přestání sledování",
"commands.computercraft.track.synopsis": "Sledovat časy spuštení počítačů.",
"commands.computercraft.turn_on.done": "Zapnuto %s/%s počítačů",
"commands.computercraft.view.action": "Ukázat tento počítač",
"commands.computercraft.view.not_player": "Nelze otevřít terminál pro nehráče",
"commands.computercraft.view.synopsis": "Ukázat terminál počítače.",
"gui.computercraft.config.command_require_creative": "Příkazové počítače vyžadují tvořivý režim",
"upgrade.computercraft.wireless_modem_advanced.adjective": "Endový",
"upgrade.computercraft.wireless_modem_normal.adjective": "Bezdrátový",
"upgrade.minecraft.crafting_table.adjective": "Tvořivý",
"upgrade.minecraft.diamond_axe.adjective": "Kácející",
"upgrade.minecraft.diamond_hoe.adjective": "Farmářský",
"upgrade.minecraft.diamond_pickaxe.adjective": "Těžební",
"tracking_field.computercraft.avg": "%s (průměr)",
"tracking_field.computercraft.computer_tasks.name": "Úlohy",
"tracking_field.computercraft.coroutines_dead.name": "Vyhozené koprogramy",
"tracking_field.computercraft.count": "%s (počet)",
"tracking_field.computercraft.fs.name": "Operace souborového systému",
"tracking_field.computercraft.http_download.name": "Stahování HTTP",
"tracking_field.computercraft.http_requests.name": "Požadavky HTTP",
"tracking_field.computercraft.http_upload.name": "Nahrávání HTTP",
"tracking_field.computercraft.max": "%s (max)",
"tracking_field.computercraft.peripheral.name": "Periferní volání",
"tracking_field.computercraft.server_tasks.name": "Serverové úlohy",
"tracking_field.computercraft.turtle_ops.name": "Operace robotů",
"tracking_field.computercraft.websocket_outgoing.name": "Odchozí websocket",
"upgrade.minecraft.diamond_shovel.adjective": "Kopací",
"upgrade.minecraft.diamond_sword.adjective": "Bojový",
"argument.computercraft.argument_expected": "Očekáván argument",
"argument.computercraft.tracking_field.no_field": "Neznámé pole '%s'",
"block.computercraft.turtle_advanced.upgraded_twice": "Pokročilý %s %s robot",
"commands.computercraft.desc": "Příkaz /computercraft dává různé ladící a správcovské nástroje pro ovládání a interakci s počítači.",
"commands.computercraft.dump.desc": "Ukáže stav všech počítačů nebo specifické informace o jednom počítači. Můžeš specifikovat ID počítačové instance (tř. 123), ID počítače (tř #123) nebo štítek (tř. \"@Můj počítač\").",
"commands.computercraft.generic.no_position": "<žádná pozice>",
"commands.computercraft.help.no_children": "%s nemá žádné podpříkazy",
"commands.computercraft.queue.desc": "Poslat událost computer_command příkazovému počítači, procházející přes ostatní argumenty. Toto je většinou určeno pro tvůrce map, chovající se jako pro počítač více přátelská verze příkazu /trigger. Jakýkoliv hráč může spustit příkaz, což by ale bylo většinou uděláno přes událost kliknutím na textový komponent.",
"commands.computercraft.synopsis": "Různé příkazy pro ovládání počítačů.",
"commands.computercraft.tp.action": "Teleportovat se k počítači",
"commands.computercraft.tp.desc": "Teleportovat se na místo počítače. Můžeš specifikovat ID počítačové instance (tř. 123) nebo ID počítače (tř. #123).",
"commands.computercraft.tp.not_player": "Nelze otevřít terminál pro nehráče",
"commands.computercraft.tp.not_there": "Nelze najít počítač ve světě",
"commands.computercraft.tp.synopsis": "Teleportovat se ke specifickému počítači.",
"commands.computercraft.track.desc": "Sledovat jak dlouho se počítače spustí, a také kolik událostí zpracují. Toto uvádí informace v podobné cestě jako /forge track a může být dobré pro diagnostiku lagu.",
"commands.computercraft.track.dump.computer": "Počítač",
"commands.computercraft.track.dump.desc": "Stáhnout nejnovější výsledky sledování počítačů.",
"upgrade.computercraft.speaker.adjective": "Hlučný",
"tracking_field.computercraft.coroutines_created.name": "Vytvořené koprogramy",
"tracking_field.computercraft.websocket_incoming.name": "Přichozí websocket",
"commands.computercraft.track.dump.no_timings": "Nejsou k dispozici žádná časování",
"commands.computercraft.track.dump.synopsis": "Stáhnout nejnovější výsledky sledování",
"commands.computercraft.track.start.desc": "Začne sledovat spouštěcí časy všech počítačů a počty událostí. Toto vyhodí výsledky předchozích spuštení.",
"commands.computercraft.track.start.stop": "Spusť %s pro zastavení sledování a ukázání výsledků",
"commands.computercraft.track.start.synopsis": "Začít sledovat všechny počítače",
"commands.computercraft.track.stop.action": "Klikni pro přestání sledování",
"commands.computercraft.track.stop.desc": "Přestane sledovat všechny události a časy spuštení počítačů",
"commands.computercraft.track.stop.not_enabled": "Nyní se nesledují žádné počítače",
"commands.computercraft.track.stop.synopsis": "Přestat sledovat všechny počítače",
"commands.computercraft.track.synopsis": "Sledovat časy spuštení počítačů.",
"commands.computercraft.turn_on.desc": "Zapne počítače na seznamu. Můžeš specifikovat ID počítačové instance (tř. 123), ID počítače (tř. 123) nebo štítek (tř. \"@Můj počítač\").",
"commands.computercraft.turn_on.done": "Zapnuto %s/%s počítačů",
"commands.computercraft.turn_on.synopsis": "Zapnout počítače na dálku.",
"commands.computercraft.view.action": "Ukázat tento počítač",
"commands.computercraft.view.desc": "Otevře terminál počítače, umožnující dálkové ovládání počítače. Toto nedává přístup k inventářům robotů. Můžeš specifikovat ID počítačové instance (tř. 123) nebo ID počítače (tř. #123).",
"commands.computercraft.view.not_player": "Nelze otevřít terminál pro nehráče",
"commands.computercraft.view.synopsis": "Ukázat terminál počítače.",
"gui.computercraft.config.command_require_creative": "Příkazové počítače vyžadují tvořivý režim",
"gui.computercraft.config.command_require_creative.tooltip": "Vyžadovat, aby hráči byli v tvořivém režimu a měli operátorská prává pro interakci\ns příkazovýmí počítači. Toto je základní chování pro vanilla Příkazové bloky.",
"gui.computercraft.config.computer_space_limit": "Limit počítačového místa (v bytech)",
"gui.computercraft.config.disable_lua51_features": "Vypnout Lua 5.1 funkce",
"gui.computercraft.config.execution": "Spuštení",
"gui.computercraft.config.execution.computer_threads": "Počítačová vlákna",
"gui.computercraft.config.execution.max_main_computer_time": "Serverový časový limit počítačových ticků",
"gui.computercraft.config.http": "HTTP",
"gui.computercraft.config.http.bandwidth.global_download": "Globální limit stahování",
"gui.computercraft.config.http.bandwidth.global_upload": "Globální nahrávací limit",
"gui.computercraft.config.computer_space_limit.tooltip": "Limit diskového místa pro počítače a roboty, v bytech.",
"gui.computercraft.config.default_computer_settings": "Vychozí nastavení počítače",
"gui.computercraft.config.default_computer_settings.tooltip": "Čárkami oddělený seznam základních systémových nastavení pro nastavení na nových počítačích.\nPříklad: \"shell.autocomplete=false,lua.autocomplete=false,edit.autocomplete=false\"\nvypne všechno automatické vyplňování.",
"gui.computercraft.config.disable_lua51_features": "Vypnout Lua 5.1 funkce",
"gui.computercraft.config.disable_lua51_features.tooltip": "Nastav toto na pravdivou hodnotu pro vypnutí Lua 5.1 funkcí které budou odstraněny v budoucí\naktualizaci. Dobré pro ověření kompatibilty tvých programů nyní a předem.",
"gui.computercraft.config.disabled_generic_methods": "Vypnuté obecné metody",
"gui.computercraft.config.execution": "Spuštení",
"gui.computercraft.config.execution.computer_threads": "Počítačová vlákna",
"gui.computercraft.config.execution.computer_threads.tooltip": "Nastavit číslo vláken, na kterých můžou běžet počítače. Vyšší číslo znamená že\nvíce počítačů může běžet najednou, ale to může způsobit lag. Prosím měj na paměti že nejaké módy nemusí\nfungovat s počtem vláken vyšší než 1. Používej opatrně.\nHodnota: > 1",
"gui.computercraft.config.execution.max_main_computer_time": "Serverový časový limit počítačových ticků",
"gui.computercraft.config.execution.max_main_computer_time.tooltip": "Ideální maximální v kterém počítač se může spustit na tick, v milisekundách.\nPoznámka, možná přejdeme přes tento limit protože tu nelze rozhodnout jak\ndlouho to bude trvat - toto se zaměřuje jako vrchní hranice průměrného času.\nRozsah: > 1",
"gui.computercraft.config.execution.max_main_global_time": "Globální časový limit serverových ticků",
"gui.computercraft.config.http.bandwidth": "Šířka pásma",
"gui.computercraft.config.http.bandwidth.global_download.tooltip": "Počet bytů které můžou být staženy za sekundu. Toto je sdíleno mezi všemi počítači. (byty/s)\nHodnota: > 1",
"gui.computercraft.config.http.enabled": "Zapnout HTTP API",
"gui.computercraft.config.execution.max_main_global_time.tooltip": "Maximální čas který může být využit pro spouštení úloh v jednom ticku,\nv milisekundách.\nPoznámka, možná přejdeme přes tento limit protože nelze rozhodnout jak\ndlouho to bude trvat - toto se zaměřuje jako horní hranice průměrného času.\nRozsah: > 1",
"gui.computercraft.config.execution.tooltip": "Ovládá chování počítačového spuštení. Toto je většně určeno pro\nfine-tuning serverů, a obecně by nemělo být dotčeno.",
"gui.computercraft.config.floppy_space_limit": "Limit místa disket (v bajtech)",
"gui.computercraft.config.floppy_space_limit.tooltip": "Limit místa pro diskety, v bajtech.",
"gui.computercraft.config.http": "HTTP",
"gui.computercraft.config.http.bandwidth": "Šířka pásma",
"gui.computercraft.config.http.bandwidth.global_download": "Globální limit stahování",
"gui.computercraft.config.http.bandwidth.global_download.tooltip": "Počet bytů které můžou být staženy za sekundu. Toto je sdíleno mezi všemi počítači. (byty/s)\nHodnota: > 1",
"gui.computercraft.config.http.bandwidth.global_upload": "Globální nahrávací limit",
"gui.computercraft.config.http.bandwidth.global_upload.tooltip": "Počet bytů které můžou být nahrány za sekundu. Toto je sdíleno mezi všemi počítači (bajty/s).\nRozsah: > 1",
"gui.computercraft.config.http.bandwidth.tooltip": "Omezuje šířku pásma použitou počítači.",
"gui.computercraft.config.http.enabled": "Zapnout HTTP API",
"gui.computercraft.config.http.enabled.tooltip": "Zapnout \"http\" API na počítačích. Vypnutí tohoto také vypne programy \"pastebin\" a \"wget\"\nna kterých záleží hodně uživatelům. Je doporučeno nechat toto zapnuté a použít\nmožnost konfigurace \"rules\" pro určení více jemné kontroly.",
"gui.computercraft.config.http.max_requests": "Maximální souběžné požadavky",
"gui.computercraft.config.http.max_requests.tooltip": "Počet HTTP požadavků které počítač může udělat v jedné chvíli. Požadavky navíc\nbudou zaslány do fronty, a poslány když běžící požadavky byly dokončeny. Nastav\nna 0 pro neomezeno.\nRozsah: > 0",
"gui.computercraft.config.http.max_websockets": "Maximální souběžné websockety",
"gui.computercraft.config.http.max_websockets.tooltip": "Počet websocketů které může mít počítač otevřené najednou: Nastav na 0 pro neomezeno.\nRozsah: > 1",
"gui.computercraft.config.http.proxy.host": "Název hostitele",
"gui.computercraft.config.http.proxy.host.tooltip": "Název hostitele nebo IP adresa proxy serveru.",
"gui.computercraft.config.http.proxy.port": "Port",
"gui.computercraft.config.http.proxy.port.tooltip": "Port proxy serveru.\nRozsah: 1 ~ 65536",
"gui.computercraft.config.http.proxy.type": "Typ proxy",
"gui.computercraft.config.http.proxy.type.tooltip": "Typ proxy k použití.\nPovolené hodnoty: HTTP, HTTPS, SOCKS4, SOCKS5",
"gui.computercraft.config.http.rules": "Pravidla povolení/zakázání",
"gui.computercraft.config.http.rules.tooltip": "Seznam pravidel které ovládají chování \"http\" API pro specifické domény nebo\nIP adresy. Každé pravidlo je položka s 'hostem' pro shodování, a také série\nvlastností. Pravidla jsou hodnocena v řádech, což znamená že dřívejší pravidla přepíšou\npozdější.\nHost může být jméno domény (\"pastebin.com\") shoda (\"*.pastebin.com\") nebo\nnotace CIDR (\"127.0.0.0/8\").\nPokud nejsou pravidla, doména je blokována.",
"gui.computercraft.config.http.tooltip": "Ovládá HTTP API",
"gui.computercraft.config.http.websocket_enabled": "Zapnout websockety",
"gui.computercraft.config.http.websocket_enabled.tooltip": "Zapnout použití HTTP websocketů. Toto vyžaduje možnost \"http_enable\" aby byla zapnuta.",
"gui.computercraft.config.log_computer_errors": "Zapisovat počítačové chyby",
"gui.computercraft.config.log_computer_errors.tooltip": "Zapisovat chyby hozené periferiemi a ostatními Lua objekty. Toto usnadňuje\nautorům módů ladění problémů, ale může způsobit spam zápisů když hráči\npoužívají problematické metody.",
"gui.computercraft.config.maximum_open_files": "Maximální počet souborů otevřených na počítačích",
"gui.computercraft.config.maximum_open_files.tooltip": "Nastavit kolik soborů může mít jeden počítač otevřených najednou. Nastav na 0 pro neomezeno.\nRozsah: > 0",
"gui.computercraft.config.monitor_distance": "Dálka monitoru",
"gui.computercraft.config.monitor_distance.tooltip": "Maximální dálka kde se budou monitory načítač. Toto je vychozí na standartní limit\ntile entit, ale může být prodloužen pokud chceš stavět větší monitory.\nRozsah: 16 ~ 1024",
"gui.computercraft.config.monitor_renderer": "Monitorový renderer",
"gui.computercraft.config.monitor_renderer.tooltip": "Renderer, který bude použit pro monitory. Obecně by toto mělo být nastaveno na \"nejlepší\" - pokud\nmonitory mají problémy s výkonem, možná budeš chtít experimentovat s alternativními\nrenderery.\nPovolené hodnoty: BEST, TBO, VBO",
"gui.computercraft.config.peripheral": "Periferie",
"gui.computercraft.config.peripheral.command_block_enabled": "Zapnout periferii příkazových bloků",
"gui.computercraft.config.peripheral.command_block_enabled.tooltip": "Zapnout podporu periferie příkazových bloků",
@ -142,80 +131,94 @@
"gui.computercraft.config.peripheral.modem_high_altitude_range_during_storm": "Dosah modemu (vysoká výška, špatné počasí)",
"gui.computercraft.config.peripheral.modem_high_altitude_range_during_storm.tooltip": "Dosah bezdrátových modemů v maximální výšce v bouřlivém počasí, v metrech.\nRozsah: 0 ~ 100000",
"gui.computercraft.config.peripheral.modem_range": "Dosah modemu (vychozí)",
"gui.computercraft.config.peripheral.modem_range.tooltip": "Dosah bezdrátových modemů v nízké výšce v jasném počasí, v metrech.\nRozsah: 0 ~ 100000",
"gui.computercraft.config.peripheral.modem_range_during_storm": "Dosah modemu (špatné počasí)",
"gui.computercraft.config.peripheral.modem_range_during_storm.tooltip": "Dosah bezdrátových modemů v nízké výšce v špatném počasí, v metrech.\nRozsah: 0 ~ 100000",
"gui.computercraft.config.peripheral.monitor_bandwidth": "šířka pásma monitorů",
"gui.computercraft.config.peripheral.monitor_bandwidth.tooltip": "Limit kolik monitorových dat může být posláno *za tick*. Poznámka:\n - Šířka pásma je měřena před kompresí, takže data zaslaná klientovi jsou\nmenší.\n - Toto ignoruje počet hráčů kterým je poslán packet. Aktualizování monitoru pro\njednoho hráče spotřebuje stejný limit šířky pásma jako posíláním 20.\n - Plně velký monitor posílá ~25 kb dat. Takže vychozí hodnota (1MB) dovoluje ~40\nmonitorům aby byly aktualizovány v jednom ticku.\nNastav na 0 pro vypnutí.\nRozsah: > 0",
"gui.computercraft.config.peripheral.tooltip": "Různé možnosti o periferiích.",
"gui.computercraft.config.term_sizes": "Velikosti terminálu",
"gui.computercraft.config.term_sizes.computer": "Počítač",
"gui.computercraft.config.term_sizes.computer.height": "Výška terminálu",
"gui.computercraft.config.term_sizes.computer.height.tooltip": "Rozsash: 1 ~ 255",
"gui.computercraft.config.term_sizes.computer.tooltip": "Velikost počítačového terminálu.",
"gui.computercraft.config.term_sizes.computer.width": "Šířka terminálu",
"gui.computercraft.config.term_sizes.computer.width.tooltip": "Rozsah: 1 ~ 255",
"gui.computercraft.config.term_sizes.monitor": "Monitor",
"gui.computercraft.config.term_sizes.monitor.height": "Maximální výška monitoru",
"gui.computercraft.config.term_sizes.monitor.height.tooltip": "Rozsah: 1 ~ 32",
"gui.computercraft.config.term_sizes.monitor.tooltip": "Maximální velikost monitorů (v blocích).",
"gui.computercraft.config.term_sizes.monitor.width": "Maximální šířka monitoru",
"gui.computercraft.config.term_sizes.monitor.width.tooltip": "Rozsah: 1 ~ 32",
"gui.computercraft.config.term_sizes.pocket_computer": "Kapesní počítač",
"gui.computercraft.config.term_sizes.pocket_computer.height": "Výška terminálu",
"gui.computercraft.config.term_sizes.pocket_computer.height.tooltip": "Rozsah: 1 ~ 255",
"gui.computercraft.config.term_sizes.pocket_computer.tooltip": "Velikost terminálu kapesního počítače.",
"gui.computercraft.config.term_sizes.pocket_computer.width": "Šířka terminálu",
"gui.computercraft.config.term_sizes.pocket_computer.width.tooltip": "Rozsah: 1 ~ 255",
"gui.computercraft.config.term_sizes.tooltip": "Nastav velikost terminálu různých počítačů.\nVětší terminály vyžadují větší šířku pásma, takže používej opatrně.",
"gui.computercraft.config.turtle": "Roboti",
"gui.computercraft.config.turtle.advanced_fuel_limit": "Limit paliva pokročilého robota",
"gui.computercraft.config.turtle.advanced_fuel_limit.tooltip": "Limit paliva pro pokročilé roboty.\nRozsah: > 0",
"gui.computercraft.config.turtle.can_push": "Roboti můžou strkat stvoření",
"gui.computercraft.config.turtle.can_push.tooltip": "Jestli nastaveno na pravdivou hodnotu, Roboti budou odstrkávat stvoření z cesty místo zastavení pokud\nje tu místo.",
"gui.computercraft.config.turtle.need_fuel": "Zapnout palivo",
"gui.computercraft.config.turtle.need_fuel.tooltip": "Nastaví jestli roboti potřebují palivo pro pohyb.",
"gui.computercraft.config.turtle.normal_fuel_limit": "Limit paliva robotů",
"gui.computercraft.config.turtle.normal_fuel_limit.tooltip": "Limit paliva pro roboty.\nRozsah: > 0",
"gui.computercraft.config.turtle.tooltip": "Různé možnosti o robotech.",
"gui.computercraft.config.upload_max_size": "Limit velikosti nahrávaného souboru (v bajtech)",
"gui.computercraft.config.upload_nag_delay": "Nahrání zpoždění nag",
"gui.computercraft.config.upload_nag_delay.tooltip": "Zpoždění v sekundách po kterém oznámíme o nezpracovaných importech. Nastav na 0 pro vypnutí.\nRozsah: 0 ~ 60",
"gui.computercraft.pocket_computer_overlay": "Kapesní počítač otevřen. Zmáčkni ESC pro uzavření.",
"gui.computercraft.terminal": "Počítačový terminál",
"gui.computercraft.tooltip.computer_id": "ID počítače: %s",
"gui.computercraft.tooltip.copy": "Kopírovat do schránky",
"gui.computercraft.tooltip.disk_id": "ID disku: %s",
"gui.computercraft.tooltip.terminate": "Zastavit nyní běžící kód",
"gui.computercraft.tooltip.terminate.key": "Podrž Ctrl+T",
"gui.computercraft.tooltip.turn_off": "Vypnout tento počítač",
"gui.computercraft.tooltip.turn_off.key": "Zmáčkni Ctrl+S",
"gui.computercraft.tooltip.turn_on": "Zapnout teno počítač",
"gui.computercraft.upload.failed": "Nahrávání se nezdařilo",
"gui.computercraft.upload.failed.computer_off": "Před nahráním souborů musíš vypnout počítač.",
"gui.computercraft.upload.failed.corrupted": "Soubory byly porušeny při nahrávání. Prosím zkus to znovu.",
"gui.computercraft.upload.failed.generic": "Nahrávání souborů se nezdařilo (%s)",
"gui.computercraft.upload.failed.name_too_long": "Jména souborů pro nahrání jsou příliš dlouhá.",
"gui.computercraft.upload.failed.too_many_files": "Nelze nahrát tolik souborů.",
"gui.computercraft.upload.failed.too_much": "Tvoje soubory jsou příliš velké pro nahrání.",
"gui.computercraft.upload.no_response": "Přenos souborů",
"gui.computercraft.upload.no_response.msg": "Tvůj počítač nepoužil tvé přenesené soubory. Budeš muset spustit program %s a zkusit to znovu.",
"item.computercraft.disk": "Disketa",
"item.computercraft.pocket_computer_advanced": "Pokročilý kapesní počítač",
"item.computercraft.pocket_computer_advanced.upgraded": "Pokročilý %s kapesní počítač",
"item.computercraft.pocket_computer_normal": "Kapesní počítač",
"item.computercraft.pocket_computer_normal.upgraded": "%s kapesní počítač",
"item.computercraft.printed_pages": "Tisknuté stránky",
"item.computercraft.treasure_disk": "Disketa",
"gui.computercraft.config.log_computer_errors.tooltip": "Zapisovat chyby hozené periferiemi a ostatními Lua objekty. Toto usnadňuje\nautorům módů ladění problémů, ale může způsobit spam zápisů když hráči\npoužívají problematické metody.",
"gui.computercraft.config.monitor_distance": "Dálka monitoru",
"gui.computercraft.config.monitor_distance.tooltip": "Maximální dálka kde se budou monitory načítač. Toto je vychozí na standartní limit\ntile entit, ale může být prodloužen pokud chceš stavět větší monitory.\nRozsah: 16 ~ 1024",
"gui.computercraft.config.http.rules.tooltip": "Seznam pravidel které ovládají chování \"http\" API pro specifické domény nebo\nIP adresy. Každé pravidlo je položka s 'hostem' pro shodování, a také série\nvlastností. Pravidla jsou hodnocena v řádech, což znamená že dřívejší pravidla přepíšou\npozdější.\nHost může být jméno domény (\"pastebin.com\") shoda (\"*.pastebin.com\") nebo\nnotace CIDR (\"127.0.0.0/8\").\nPokud nejsou pravidla, doména je blokována.",
"gui.computercraft.config.monitor_renderer.tooltip": "Renderer, který bude použit pro monitory. Obecně by toto mělo být nastaveno na \"nejlepší\" - pokud\nmonitory mají problémy s výkonem, možná budeš chtít experimentovat s alternativními\nrenderery.\nPovolené hodnoty: BEST, TBO, VBO",
"gui.computercraft.config.term_sizes": "Velikosti terminálu",
"gui.computercraft.config.term_sizes.computer.width": "Šířka terminálu",
"gui.computercraft.config.term_sizes.monitor.tooltip": "Maximální velikost monitorů (v blocích).",
"gui.computercraft.config.term_sizes.pocket_computer.height.tooltip": "Rozsah: 1 ~ 255",
"gui.computercraft.config.term_sizes.tooltip": "Nastav velikost terminálu různých počítačů.\nVětší terminály vyžadují větší šířku pásma, takže používej opatrně.",
"gui.computercraft.config.turtle.can_push": "Roboti můžou strkat stvoření",
"gui.computercraft.config.turtle.can_push.tooltip": "Jestli nastaveno na pravdivou hodnotu, Roboti budou odstrkávat stvoření z cesty místo zastavení pokud\nje tu místo.",
"gui.computercraft.config.peripheral.modem_range.tooltip": "Dosah bezdrátových modemů v nízké výšce v jasném počasí, v metrech.\nRozsah: 0 ~ 100000",
"gui.computercraft.config.peripheral.monitor_bandwidth.tooltip": "Limit kolik monitorových dat může být posláno *za tick*. Poznámka:\n - Šířka pásma je měřena před kompresí, takže data zaslaná klientovi jsou\nmenší.\n - Toto ignoruje počet hráčů kterým je poslán packet. Aktualizování monitoru pro\njednoho hráče spotřebuje stejný limit šířky pásma jako posíláním 20.\n - Plně velký monitor posílá ~25 kb dat. Takže vychozí hodnota (1MB) dovoluje ~40\nmonitorům aby byly aktualizovány v jednom ticku.\nNastav na 0 pro vypnutí.\nRozsah: > 0",
"gui.computercraft.config.upload_nag_delay.tooltip": "Zpoždění v sekundách po kterém oznámíme o nezpracovaných importech. Nastav na 0 pro vypnutí.\nRozsah: 0 ~ 60",
"gui.computercraft.terminal": "Počítačový terminál",
"gui.computercraft.tooltip.turn_off": "Vypnout tento počítač",
"gui.computercraft.upload.failed.computer_off": "Před nahráním souborů musíš vypnout počítač.",
"gui.computercraft.upload.failed.too_much": "Tvoje soubory jsou příliš velké pro nahrání.",
"item.computercraft.pocket_computer_advanced.upgraded": "Pokročilý %s kapesní počítač",
"item.computercraft.printed_book": "Tisknutá kniha",
"item.computercraft.printed_page": "Tisknutá stránka",
"item.computercraft.printed_pages": "Tisknuté stránky",
"item.computercraft.treasure_disk": "Disketa",
"itemGroup.computercraft": "ComputerCraft",
"gui.computercraft.config.execution.max_main_computer_time.tooltip": "Ideální maximální v kterém počítač se může spustit na tick, v milisekundách.\nPoznámka, možná přejdeme přes tento limit protože tu nelze rozhodnout jak\ndlouho to bude trvat - toto se zaměřuje jako vrchní hranice průměrného času.\nRozsah: > 1",
"gui.computercraft.config.http.bandwidth.global_upload.tooltip": "Počet bytů které můžou být nahrány za sekundu. Toto je sdíleno mezi všemi počítači (bajty/s).\nRozsah: > 1",
"gui.computercraft.config.http.enabled.tooltip": "Zapnout \"http\" API na počítačích. Toto také vypne programy \"pastebin\" a \"wget\"\nna kterých záleží hodně uživatelům. Je doporučeno nechat toto zapnuté a použít\nmožnost konfigurace \"rules\" pro určení více jemné kontroly.",
"gui.computercraft.config.http.websocket_enabled.tooltip": "Zapnout použití HTTP websocketů. Toto vyžaduje možnost \"http_enable\" aby byla zapnuta."
"tracking_field.computercraft.avg": "%s (průměr)",
"tracking_field.computercraft.computer_tasks.name": "Úlohy",
"tracking_field.computercraft.count": "%s (počet)",
"tracking_field.computercraft.fs.name": "Operace souborového systému",
"tracking_field.computercraft.http_download.name": "Stahování HTTP",
"tracking_field.computercraft.http_requests.name": "Požadavky HTTP",
"tracking_field.computercraft.http_upload.name": "Nahrávání HTTP",
"tracking_field.computercraft.max": "%s (max)",
"tracking_field.computercraft.peripheral.name": "Periferní volání",
"tracking_field.computercraft.server_tasks.name": "Serverové úlohy",
"tracking_field.computercraft.turtle_ops.name": "Operace robotů",
"tracking_field.computercraft.websocket_incoming.name": "Přichozí websocket",
"tracking_field.computercraft.websocket_outgoing.name": "Odchozí websocket",
"upgrade.computercraft.speaker.adjective": "Hlučný",
"upgrade.computercraft.wireless_modem_advanced.adjective": "Endový",
"upgrade.computercraft.wireless_modem_normal.adjective": "Bezdrátový",
"upgrade.minecraft.crafting_table.adjective": "Tvořivý",
"upgrade.minecraft.diamond_axe.adjective": "Kácející",
"upgrade.minecraft.diamond_hoe.adjective": "Farmářský",
"upgrade.minecraft.diamond_pickaxe.adjective": "Těžební",
"upgrade.minecraft.diamond_shovel.adjective": "Kopací",
"upgrade.minecraft.diamond_sword.adjective": "Bojový"
}

View File

@ -40,9 +40,6 @@
"commands.computercraft.help.synopsis": "Zeigt die Hilfe für den angegebenen Befehl",
"commands.computercraft.queue.desc": "Sendet ein computer_command Event zusammen mit optionalen Argumenten an einen Befehlscomputer. Dieser Befehl wurde als eine Computerfreundliche Version von /trigger für Mapdesigner designed. Jeder Spieler kann diesen Befehl ausführen, weshalb er sich perfekt für ein Klickevent von z.B. Schildern oder Büchern eignet.",
"commands.computercraft.queue.synopsis": "Sendet ein computer_command Event an einen Befehlscomputer",
"commands.computercraft.reload.desc": "Liest die Konfigurationsdatei von ComputerCraft neu ein",
"commands.computercraft.reload.done": "Die Konfigurationsdatei wurde erfolgreich neu eingelesen",
"commands.computercraft.reload.synopsis": "Liest die Konfigurationsdatei von ComputerCraft neu ein",
"commands.computercraft.shutdown.desc": "Fährt die angegebenen Computer herunter. Falls keine Computer angegeben sind, werden alle heruntergefahren. Der Computer kann entweder über seine Instanz ID (z.B. 123), seine Computer ID (z.B. #123) oder seinen Namen (z.B. \"@Mein Computer\") angegeben werden.",
"commands.computercraft.shutdown.done": "Fährt die Computer %s/%s herunter",
"commands.computercraft.shutdown.synopsis": "Fährt den Computer aus der Ferne herunter.",
@ -72,12 +69,20 @@
"commands.computercraft.view.desc": "Zeigt das Terminal eines Computers. Dies ermöglicht, den Computer aus der Ferne zu steuern. Ein Zugriff auf das Inventar eines Turtles ist dadurch allerdings nicht möglich. Der Computer kann entweder über seine Instanz ID (z.B. 123), seine Computer ID (z.B. #123) oder seinen Namen (z.B. \"@Mein Computer\") angegeben werden.",
"commands.computercraft.view.not_player": "Konnte Terminal für Nicht-Spieler nicht öffnen",
"commands.computercraft.view.synopsis": "Zeigt das Terminal eines Computers.",
"gui.computercraft.config.command_require_creative": "Kommando-Computer benötigen den Kreativ-Modus",
"gui.computercraft.config.computer_space_limit": "Speicherplatz von Computern (Bytes)",
"gui.computercraft.config.computer_space_limit.tooltip": "Das Speicherplatzlimit für Computer und Turtles in Bytes.",
"gui.computercraft.config.default_computer_settings": "Computer-Standardeinstellungen",
"gui.computercraft.config.default_computer_settings.tooltip": "eine mit Komma separierte Liste an standardmäßige Systemeinstellungen für neuen Computern.\nBeispiel: \"shell.autocomplete=false,lua.autocomplete=false,edit.autocomplete=false\"\nwürde jegliche Autovervollständigung deaktivieren.",
"gui.computercraft.config.disable_lua51_features": "Lua 5.1-Funktionen deaktivieren",
"gui.computercraft.config.disable_lua51_features.tooltip": "Beim aktivieren werden die Lua 5.1 Funktionieren deaktiviert, die in zukünftigen\nUpdates sowieso entfernt werden. Auf dieser Weise kann vorwärts Kompatibilität für Programme sichergestellt werden.",
"gui.computercraft.config.disabled_generic_methods": "Generische Methoden deaktiviert.",
"gui.computercraft.config.disabled_generic_methods.tooltip": "Eine Liste an generischen Methoden oder Methodenquellen zum deaktivieren.\nGenerische Methoden sind Methoden die zu einem block/block entity hinzugefügt werden, insofern kein expliziter Peripheral Provider\ngefunden wurde. Mitbetroffen sind Inventarmethoden (d.h. inventory.getItemDetail,\ninventory.pushItems) und, wenn in Forge gespielt wird, die fluid_storage und energy_storage\nMethoden.\nMethoden in dieser Liste können entweder Gruppen von Methoden (wie computercraft:inventory)\noder einzelne Methoden (wie computercraft:inventory#pushItems) sein.\n",
"gui.computercraft.config.execution": "Ausführung",
"gui.computercraft.config.execution.computer_threads": "Computer Threads",
"gui.computercraft.config.execution.computer_threads.tooltip": "Setzt die Anzahl an Hintergrundprozessen fest, auf denen Computer laufen können. Eine hohe Nummer heißt,\ndass mehrere Computer zur selben Zeit laufen können, jedoch aber auch ggf. mehr Verzögerungen verursachen. Bitte beachte, dass manche mods\nnicht mit einer Anzahl an Hintergrundprozessen laufen, die höher als 1 ist. Benutze also mit bedacht.\nBereich: > 1",
"gui.computercraft.config.execution.max_main_computer_time": "Computer Servertick Zeitlimit",
"gui.computercraft.config.execution.max_main_computer_time.tooltip": "Die ideale maximale Zeit, in der ein Computer laufen kann im innerhalb von einem tick in Millisekunden.\nBeachte, dass wir wahrscheinlich über diesen Limit gehen werden, da es unmöglich ist zu bestimmen,\nwie lange ein Computer brauchen wird. Dies wird also die höhere Grenze der durchschnittlichen Zeit darstellen.\nBereich: > 1",
"gui.computercraft.config.execution.max_main_global_time": "Globales Servertick Zeitlimit",
"gui.computercraft.config.floppy_space_limit": "Speicherplatz von Disketten (Bytes)",
"gui.computercraft.config.http": "HTTP",
@ -112,8 +117,6 @@
"item.computercraft.printed_pages": "Gedruckte Seiten",
"item.computercraft.treasure_disk": "Diskette",
"itemGroup.computercraft": "ComputerCraft",
"tracking_field.computercraft.coroutines_created.name": "Koroutinen erstellt",
"tracking_field.computercraft.coroutines_dead.name": "Koroutinen gelöscht",
"tracking_field.computercraft.fs.name": "Dateisystem Operationen",
"tracking_field.computercraft.http_download.name": "HTTP Download",
"tracking_field.computercraft.http_upload.name": "HTTP Upload",

View File

@ -1,4 +1,6 @@
{
"argument.computercraft.argument_expected": "Argumento esperado",
"argument.computercraft.computer.many_matching": "Varias computadoras que coinciden con ' %s' (instancias %s)",
"block.computercraft.cable": "Cable de red",
"block.computercraft.computer_advanced": "Ordenador avanzado",
"block.computercraft.computer_command": "Ordenador de Comandos",
@ -15,10 +17,20 @@
"block.computercraft.turtle_normal.upgraded": "Tortuga %s",
"block.computercraft.turtle_normal.upgraded_twice": "Tortuga %s %s",
"block.computercraft.wired_modem": "Módem cableado",
"block.computercraft.wired_modem_full": "Módem con cable",
"block.computercraft.wireless_modem_advanced": "Módem de Ender",
"block.computercraft.wireless_modem_normal": "Módem sin cables",
"chat.computercraft.wired_modem.peripheral_connected": "El periférico \"%s\" se conectó a la red",
"chat.computercraft.wired_modem.peripheral_disconnected": "El periférico \"%s\" se desconectó de la red",
"commands.computercraft.generic.additional_rows": "%d filas adicionales…",
"commands.computercraft.generic.no": "N",
"commands.computercraft.generic.no_position": "<sin pos>",
"commands.computercraft.generic.position": "%s, %s, %s",
"commands.computercraft.generic.yes": "Y",
"commands.computercraft.help.desc": "Muestra este mensaje de ayuda",
"commands.computercraft.help.no_command": "Sin comando '%s'",
"commands.computercraft.shutdown.done": "Apague %s/%s computadoras",
"commands.computercraft.shutdown.synopsis": "Apague las computadoras de forma remota.",
"gui.computercraft.config.computer_space_limit": "Límite de memoria de ordenadores (en bytes)",
"gui.computercraft.config.default_computer_settings": "Configuración de Ordenador por defecto",
"gui.computercraft.config.disable_lua51_features": "Deshabilitar funciones de Lua 5.1",

View File

@ -41,9 +41,6 @@
"commands.computercraft.help.synopsis": "Fournit de l'aide pour une commande spécifique",
"commands.computercraft.queue.desc": "Envoie un événement computer_command à un ordinateur de commande, en passant les éventuels arguments additionnels. Ceci est principalement conçu pour les map makers, imitant la commande /trigger, pour une utilisation avec les ordinateurs. N'importe quel joueur peut exécuter cette commande, qui sera exécutée le plus souvent avec un événement de clic sur du texte.",
"commands.computercraft.queue.synopsis": "Envoyer un événement computer_command à un ordinateur de commande",
"commands.computercraft.reload.desc": "Actualise le fichier de configuration de ComputerCraft",
"commands.computercraft.reload.done": "Configuration actualisée",
"commands.computercraft.reload.synopsis": "Actualiser le fichier de configuration de ComputerCraft",
"commands.computercraft.shutdown.desc": "Éteint les ordinateurs dans la liste ou tous, si aucun n'est spécifié dans cette liste. Vous pouvez spécifier l'identifiant d'instance (ex. 123), l'identifiant d'ordinateur (ex. #123) ou son nom (ex. \"@Mon Ordinateur\").",
"commands.computercraft.shutdown.done": "%s/%s ordinateurs arrêté",
"commands.computercraft.shutdown.synopsis": "Éteindre des ordinateurs à distance.",
@ -73,23 +70,111 @@
"commands.computercraft.view.desc": "Ouvre le terminal d'un ordinateur, autorisant le contrôle à distance. Ceci ne permet pas d'accéder à l'inventaire des tortues. Vous pouvez spécifier l'identifiant d'instance (ex. 123) ou l'identifiant d'ordinateur (ex. #123).",
"commands.computercraft.view.not_player": "Impossible d'ouvrir un terminal pour un non-joueur",
"commands.computercraft.view.synopsis": "Visualiser le terminal de cet ordinateur.",
"gui.computercraft.config.command_require_creative": "Les ordinateurs de commande requiert d'être en mode créatif",
"gui.computercraft.config.command_require_creative.tooltip": "Exiger que les joueurs soient en mode créatif et soient opés pour interagir avec des\nordinateurs de commande. C'est le comportement par défaut des blocs de commande vanilla.",
"gui.computercraft.config.computer_space_limit": "Espace disque d'un Ordinateur (octets)",
"gui.computercraft.config.computer_space_limit.tooltip": "La limite d'espace du disque pour les ordinateurs et les tortues, en octets.",
"gui.computercraft.config.default_computer_settings": "Configuration d'Ordinateur par défaut",
"gui.computercraft.config.default_computer_settings.tooltip": "Une liste séparée par des virgules des paramètres système par défaut à définir sur les nouveaux ordinateurs.\nExemple : \"shell.autocomplete=false,lua.autocomplete=false,edit.autocomplete=false\"\ndésactivera toute saisie semi-automatique.",
"gui.computercraft.config.disable_lua51_features": "Désactiver les particularités de Lua 5.1",
"gui.computercraft.config.disable_lua51_features.tooltip": "Définir sur true pour désactiver les fonctions Lua 5.1 qui seront supprimées dans une future mise à jour.\nUtile pour assurer la compatibilité ascendante de vos programmes actuels.",
"gui.computercraft.config.disabled_generic_methods": "Méthodes génériques désactivées",
"gui.computercraft.config.execution": "Exécution",
"gui.computercraft.config.execution.computer_threads": "Threads d'ordinateur",
"gui.computercraft.config.execution.computer_threads.tooltip": "Définissez le nombre de threads sur lesquels les ordinateurs peuvent s'exécuter. Un nombre plus élevé signifie\nque plus d'ordinateurs peuvent fonctionner à la fois, mais peut induire un décalage. Veuillez noter que\ncertains mods peuvent ne pas fonctionner avec un nombre de threads supérieur à 1. À utiliser avec prudence.\nPlage : > 1",
"gui.computercraft.config.execution.max_main_computer_time": "Tick serveur, limite de temps d'ordinateur",
"gui.computercraft.config.execution.max_main_computer_time.tooltip": "La durée maximale idéale pendant laquelle un ordinateur peut s'exécuter en un tick, en millisecondes.\nNotez que nous dépasserons très probablement cette limite, car il n'y a aucun moyen de savoir \ncombien de temps cela prendra - cela vise à être la limite supérieure du temps moyen.\nPlage : > 1",
"gui.computercraft.config.execution.max_main_global_time": "Tick serveur, limite de temps globale",
"gui.computercraft.config.execution.max_main_global_time.tooltip": "Le temps maximum pouvant être consacré à l'exécution de tâches en un seul tick, en\nmillisecondes.\nNotez que nous dépasserons très probablement cette limite, car il n'y a aucun moyen de savoir\ncombien de temps cela prendra - cela vise à être la limite supérieure du temps moyen.\nPlage : > 1",
"gui.computercraft.config.execution.tooltip": "Contrôle le comportement d'exécution des ordinateurs. Ceci est en grande partie\ndestiné à peaufiner les serveurs et ne devrait généralement pas avoir besoin d'être touché.",
"gui.computercraft.config.floppy_space_limit": "Espace disque d'une Disquette (octets)",
"gui.computercraft.config.floppy_space_limit.tooltip": "La limite d'espace disque pour les disquettes, en octets.",
"gui.computercraft.config.http": "HTTP",
"gui.computercraft.config.http.bandwidth": "Bande passante",
"gui.computercraft.config.http.bandwidth.global_download": "Limite de téléchargement globale",
"gui.computercraft.config.http.bandwidth.global_download.tooltip": "Le nombre d'octets qui peuvent être téléchargés en une seconde. Ceci est partagé sur tous les ordinateurs. (octets/s).\nPlage : > 1",
"gui.computercraft.config.http.bandwidth.global_upload": "Limite de téléversement globale",
"gui.computercraft.config.http.bandwidth.global_upload.tooltip": "Le nombre d'octets qui peuvent être téléversé en une seconde. Ceci est partagé sur tous les ordinateurs. (octets/s).\nPlage : > 1",
"gui.computercraft.config.http.bandwidth.tooltip": "Limite la bande passante utilisée par les ordinateurs.",
"gui.computercraft.config.http.enabled": "Permettre l'API HTTP",
"gui.computercraft.config.http.enabled.tooltip": "Active l'API \"http\" sur les ordinateurs. Cela désactive également les programmes \"pastebin\" et \"wget\",\nsur lesquels de nombreux utilisateurs comptent. Il est recommandé de laisser cette option activée et\nd'utiliser l'option de configuration \"rules\" pour imposer un contrôle plus précis.",
"gui.computercraft.config.http.max_requests": "Maximum de requêtes simultanées",
"gui.computercraft.config.http.max_requests.tooltip": "Le nombre de requêtes http qu'un ordinateur peut effectuer en même temps.\nLes demandes supplémentaires seront mises en file d'attente et envoyées lorsque\nles demandes en cours seront terminées. Mettre à 0 pour illimité.\nPlage : > 0",
"gui.computercraft.config.http.max_websockets": "Maximum de websockets en simultané",
"gui.computercraft.config.http.max_websockets.tooltip": "Le nombre de websockets qu'un ordinateur peut avoir d'ouverts en même temps. Mettre à 0 pour illimité.\nPlage : > 1",
"gui.computercraft.config.http.proxy": "Proxy",
"gui.computercraft.config.http.proxy.host": "Nom d'hôte",
"gui.computercraft.config.http.proxy.host.tooltip": "Le nom d'hôte ou l'adresse IP du serveur proxy.",
"gui.computercraft.config.http.proxy.port": "Port",
"gui.computercraft.config.http.proxy.port.tooltip": "Le port du serveur proxy.\nPlage : 1 ~ 65536",
"gui.computercraft.config.http.proxy.tooltip": "Tunnelise les requêtes HTTP et websocket via un serveur proxy. Affecte uniquement\nles règles HTTP avec \"use_proxy\" défini sur true (désactivé par défaut).\nSi l'authentification est requise pour le proxy, créez un fichier \"computercraft-proxy.pw\"\ndans le même dossier que \"computercraft-server.toml\", contenant le\nnom d'utilisateur et mot de passe séparés par deux-points, par ex. \"monutilisateur:monmotdepasse\". Pour\nProxy SOCKS4, seul le nom d'utilisateur est requis.",
"gui.computercraft.config.http.proxy.type": "Type de proxy",
"gui.computercraft.config.http.proxy.type.tooltip": "Le type de proxy à utiliser.\nValeurs autorisées : HTTP, HTTPS, SOCKS4, SOCKS5",
"gui.computercraft.config.http.rules": "Règles d'autorisation/refus",
"gui.computercraft.config.http.rules.tooltip": "Une liste de règles qui contrôlent le comportement de l'API \"http\" pour des domaines\nou des IP spécifiques. Chaque règle est un élément avec un 'hôte' à comparer et une série\nde propriétés. Les règles sont évaluées dans l'ordre, ce qui signifie que les règles antérieures\nremplacent les suivantes.\nL'hôte peut être un nom de domaine (\"pastebin.com\"), un astérisque (\"*.pastebin.com\") ou\nune notation CIDR (\"127.0.0.0/8\").\nS'il n'y a pas de règles, le domaine est bloqué.",
"gui.computercraft.config.http.tooltip": "Contrôle l'API HTTP",
"gui.computercraft.config.http.websocket_enabled": "Active les websockets",
"gui.computercraft.config.http.websocket_enabled.tooltip": "Active l'utilisation des websockets http. Cela nécessite que l'option \"http_enable\" soit également activée.",
"gui.computercraft.config.log_computer_errors": "Journal d'erreur périphériques",
"gui.computercraft.config.log_computer_errors.tooltip": "Enregistre les exceptions levées par les périphériques et autres objets Lua. Cela permet\naux créateurs de mods de débugger plus facilement les problèmes, mais peut entraîner\nun spam de logs si les joueurs utilisent des fonctions buggées.",
"gui.computercraft.config.maximum_open_files": "Maximum de fichier ouvert par Ordinateur",
"gui.computercraft.config.maximum_open_files.tooltip": "Défini le nombre de fichiers qu'un ordinateur peut ouvrir en même temps. Mettre à 0 pour illimité.\nPlage : > 0",
"gui.computercraft.config.monitor_distance": "Distance du moniteur",
"gui.computercraft.config.monitor_distance.tooltip": "La distance maximale à laquelle les écrans de moniteurs seront rendus. On utilise par défaut la\n'tile entity limit' de base, mais elle peut être augmentée si vous souhaitez créer des moniteurs plus grands.\nPlage : 16 ~ 1024",
"gui.computercraft.config.monitor_renderer": "Moteur de rendu du Moniteur",
"gui.computercraft.config.monitor_renderer.tooltip": "Le moteur de rendu à utiliser pour les moniteurs. Généralement, cela devrait être maintenu au \"meilleur\" - si\nles moniteurs ont des problèmes de performances, vous souhaiterez peut-être expérimenter avec des\nmoteurs de rendu alternatifs.\nValeurs autorisées : BEST, TBO, VBO",
"gui.computercraft.config.peripheral": "Périphériques",
"gui.computercraft.config.peripheral.command_block_enabled": "Permettre l'accès d'un Bloc de Commande par périphérique",
"gui.computercraft.config.peripheral.command_block_enabled.tooltip": "Active la prise en charge des périphériques pour le bloc de commande",
"gui.computercraft.config.peripheral.max_notes_per_tick": "Maximum de notes simultanées jouées par Ordinateur",
"gui.computercraft.config.peripheral.max_notes_per_tick.tooltip": "Nombre maximum de notes qu'un haut-parleur peut jouer à la fois.\nPlage : > 1",
"gui.computercraft.config.peripheral.modem_high_altitude_range": "Portée d'un Modem (en haute altitude)",
"gui.computercraft.config.peripheral.modem_high_altitude_range.tooltip": "La portée des modems sans fil à l'altitude maximale par temps dégagé, en mètres.\nPlage : 0 ~ 100000",
"gui.computercraft.config.peripheral.modem_high_altitude_range_during_storm": "Portée d'un Modem (en haute altitude, par mauvais temps)",
"gui.computercraft.config.peripheral.modem_high_altitude_range_during_storm.tooltip": "La portée des modems sans fil à l'altitude maximale par temps orageux, en mètres.\nPlage : 0 ~ 100000",
"gui.computercraft.config.peripheral.modem_range": "Portée d'un Modem (par défaut)",
"gui.computercraft.config.peripheral.modem_range.tooltip": "La portée des modems sans fil à basse altitude par temps dégagé, en mètres.\nPlage : 0 ~ 100000",
"gui.computercraft.config.peripheral.modem_range_during_storm": "Portée d'un Modem (par mauvais temps)",
"gui.computercraft.config.peripheral.modem_range_during_storm.tooltip": "La portée des modems sans fil à basse altitude par temps orageux, en mètres.\nPlage : 0 ~ 100000",
"gui.computercraft.config.peripheral.monitor_bandwidth": "Bande-passante du moniteur",
"gui.computercraft.config.peripheral.monitor_bandwidth.tooltip": "La limite de la quantité de données du moniteur pouvant être envoyées *par tick*. Note:\n - La bande passante est mesurée avant la compression, donc les données envoyées\n au client sont plus petites.\n - Cela ignore le nombre de joueurs auxquels un paquet est envoyé. La mise à jour d'un\n moniteur pour un joueur consomme la même limite de bande passante que l'envoi à 20.\n - Un moniteur de taille normale envoie ~25ko de données. Ainsi, la valeur par défaut (1Mo) permet \n à environ 40 moniteurs d'être mis à jour en un seul tick.\nMettre à 0 pour désactiver.\nPlage: > 0",
"gui.computercraft.config.peripheral.tooltip": "Diverses options relatives aux périphériques.",
"gui.computercraft.config.term_sizes": "Tailles de terminal",
"gui.computercraft.config.term_sizes.computer": "Ordinateur",
"gui.computercraft.config.term_sizes.computer.height": "Hauteur du terminal",
"gui.computercraft.config.term_sizes.computer.height.tooltip": "Plage : 1 ~ 255",
"gui.computercraft.config.term_sizes.computer.tooltip": "Taille du terminal des ordinateurs.",
"gui.computercraft.config.term_sizes.computer.width": "Largeur du terminal",
"gui.computercraft.config.term_sizes.computer.width.tooltip": "Plage : 1 ~ 255",
"gui.computercraft.config.term_sizes.monitor": "Moniteur",
"gui.computercraft.config.term_sizes.monitor.height": "Hauteur maximale du moniteur",
"gui.computercraft.config.term_sizes.monitor.height.tooltip": "Plage : 1 ~ 32",
"gui.computercraft.config.term_sizes.monitor.tooltip": "Taille maximale des moniteurs (en blocs).",
"gui.computercraft.config.term_sizes.monitor.width": "Largeur maximale du moniteur",
"gui.computercraft.config.term_sizes.monitor.width.tooltip": "Plage : 1 ~ 32",
"gui.computercraft.config.term_sizes.pocket_computer": "Ordinateur de poche",
"gui.computercraft.config.term_sizes.pocket_computer.height": "Hauteur du terminal",
"gui.computercraft.config.term_sizes.pocket_computer.height.tooltip": "Plage : 1 ~ 255",
"gui.computercraft.config.term_sizes.pocket_computer.tooltip": "Taille du terminal des ordinateurs de poche.",
"gui.computercraft.config.term_sizes.pocket_computer.width": "Largeur du terminal",
"gui.computercraft.config.term_sizes.pocket_computer.width.tooltip": "Plage : 1 ~ 255",
"gui.computercraft.config.term_sizes.tooltip": "Configure la taille des différents terminaux de l'ordinateur.\nLes terminaux plus grands nécessitent plus de bande passante, réglez donc avec précaution.",
"gui.computercraft.config.turtle": "Tortues",
"gui.computercraft.config.turtle.advanced_fuel_limit": "Limite de carburant par Tortue Avancée",
"gui.computercraft.config.turtle.advanced_fuel_limit.tooltip": "La limite de carburant pour les Tortues Avancées.\nPlage : > 0",
"gui.computercraft.config.turtle.can_push": "Les Tortues peuvent pousser les entitées",
"gui.computercraft.config.turtle.can_push.tooltip": "Si défini sur true, au lieu de s'arrêter, les tortues pousseront les entités hors du chemin si\nil y a de la place pour le faire.",
"gui.computercraft.config.turtle.need_fuel": "Activer la nécessité de carburant au mouvement des Tortues",
"gui.computercraft.config.turtle.need_fuel.tooltip": "Défini si les tortues ont besoin de carburant pour se déplacer.",
"gui.computercraft.config.turtle.normal_fuel_limit": "Limite de carburant par Tortue",
"gui.computercraft.config.turtle.normal_fuel_limit.tooltip": "La limite de carburant pour les Tortues.\nPlage : > 0",
"gui.computercraft.config.turtle.tooltip": "Diverses options relatives aux tortues.",
"gui.computercraft.config.upload_max_size": "Taille limite de téléversement de fichiers (octets)",
"gui.computercraft.config.upload_max_size.tooltip": "La taille limite de téléversement de fichier, en octets. Doit être compris entre 1 Kio et 16 Mio.\nGardez à l'esprit que les téléversements sont traités en un seul clic - les fichiers volumineux ou\nde mauvaises performances réseau peuvent bloquer le thread du réseau. Et attention à l'espace disque !\nPlage : 1024 ~ 16777216",
"gui.computercraft.config.upload_nag_delay": "Délai de téléversement",
"gui.computercraft.config.upload_nag_delay.tooltip": "Le délai en secondes après lequel les importations non traitées seront notifiées. Mettre à 0 pour désactiver.\nPlage : 0 ~ 60",
"gui.computercraft.pocket_computer_overlay": "Ordinateur de poche ouvert. Appuyez sur ESC pour le fermer.",
"gui.computercraft.terminal": "Terminal d'ordinateur",
"gui.computercraft.tooltip.computer_id": "ID d'ordinateur : %s",
"gui.computercraft.tooltip.copy": "Copier dans le Presse-Papiers",
"gui.computercraft.tooltip.disk_id": "ID de disque : %s",
@ -100,8 +185,13 @@
"gui.computercraft.tooltip.turn_on": "Allumer cet ordinateur",
"gui.computercraft.upload.failed": "Echec de l'envoie",
"gui.computercraft.upload.failed.computer_off": "Vous devez allumer cet ordinateur avant d'envoyer ce fichier.",
"gui.computercraft.upload.failed.corrupted": "Fichiers corrompus lors du téléversement. Veuillez réessayer.",
"gui.computercraft.upload.failed.generic": "Echec de l'envoie des fichiers (%s)",
"gui.computercraft.upload.failed.name_too_long": "Les noms de fichiers sont trop longs pour être téléversé.",
"gui.computercraft.upload.failed.too_many_files": "Impossible de téléverser autant de fichiers.",
"gui.computercraft.upload.failed.too_much": "Votre fichier est trop lourd pour être envoyé.",
"gui.computercraft.upload.no_response": "Transfert de fichiers",
"gui.computercraft.upload.no_response.msg": "Votre ordinateur n'a pas utilisé les fichiers transférés. Vous devrez peut-être exécuter le programme %s et réessayer.",
"item.computercraft.disk": "Disquette",
"item.computercraft.pocket_computer_advanced": "Ordinateur de Poche Avancé",
"item.computercraft.pocket_computer_advanced.upgraded": "Ordinateur de Poche Avancé %s",
@ -112,12 +202,17 @@
"item.computercraft.printed_pages": "Pages imprimées",
"item.computercraft.treasure_disk": "Disquette",
"itemGroup.computercraft": "ComputerCraft",
"tracking_field.computercraft.coroutines_created.name": "Coroutines créées",
"tracking_field.computercraft.coroutines_dead.name": "Coroutines mortes",
"tracking_field.computercraft.avg": "%s (moyenne)",
"tracking_field.computercraft.computer_tasks.name": "Tâches",
"tracking_field.computercraft.count": "%s (compte)",
"tracking_field.computercraft.fs.name": "Opérations sur le système de fichiers",
"tracking_field.computercraft.http_download.name": "Téléchargement HTTP",
"tracking_field.computercraft.http_requests.name": "Requêtes HTTP",
"tracking_field.computercraft.http_upload.name": "Publication HTTP",
"tracking_field.computercraft.max": "%s (max)",
"tracking_field.computercraft.peripheral.name": "Appels aux périphériques",
"tracking_field.computercraft.server_tasks.name": "Tâches du serveur",
"tracking_field.computercraft.turtle_ops.name": "Opérations des tortues",
"tracking_field.computercraft.websocket_incoming.name": "Websocket entrant",
"tracking_field.computercraft.websocket_outgoing.name": "Websocket sortant",
"upgrade.computercraft.speaker.adjective": "Bruyante",
@ -128,104 +223,5 @@
"upgrade.minecraft.diamond_hoe.adjective": "Fermière",
"upgrade.minecraft.diamond_pickaxe.adjective": "Mineuse",
"upgrade.minecraft.diamond_shovel.adjective": "Excavatrice",
"upgrade.minecraft.diamond_sword.adjective": "De Combat",
"gui.computercraft.terminal": "Terminal d'ordinateur",
"tracking_field.computercraft.count": "%s (compte)",
"tracking_field.computercraft.max": "%s (max)",
"tracking_field.computercraft.server_tasks.name": "Tâches du serveur",
"tracking_field.computercraft.turtle_ops.name": "Opérations des tortues",
"tracking_field.computercraft.avg": "%s (moyenne)",
"tracking_field.computercraft.computer_tasks.name": "Tâches",
"gui.computercraft.upload.no_response": "Transfert de fichiers",
"gui.computercraft.upload.failed.name_too_long": "Les noms de fichiers sont trop longs pour être téléversé.",
"gui.computercraft.upload.failed.too_many_files": "Impossible de téléverser autant de fichiers.",
"gui.computercraft.pocket_computer_overlay": "Ordinateur de poche ouvert. Appuyez sur ESC pour le fermer.",
"gui.computercraft.config.command_require_creative": "Les ordinateurs de commande requiert d'être en mode créatif",
"gui.computercraft.config.command_require_creative.tooltip": "Exiger que les joueurs soient en mode créatif et soient opés pour interagir avec des\nordinateurs de commande. C'est le comportement par défaut des blocs de commande vanilla.",
"gui.computercraft.config.computer_space_limit.tooltip": "La limite d'espace du disque pour les ordinateurs et les tortues, en octets.",
"gui.computercraft.config.default_computer_settings.tooltip": "Une liste séparée par des virgules des paramètres système par défaut à définir sur les nouveaux ordinateurs.\nExemple : \"shell.autocomplete=false,lua.autocomplete=false,edit.autocomplete=false\"\ndésactivera toute saisie semi-automatique.",
"gui.computercraft.config.disable_lua51_features.tooltip": "Définir sur true pour désactiver les fonctions Lua 5.1 qui seront supprimées dans une future mise à jour.\nUtile pour assurer la compatibilité ascendante de vos programmes actuels.",
"gui.computercraft.config.execution": "Exécution",
"gui.computercraft.config.execution.computer_threads": "Threads d'ordinateur",
"gui.computercraft.config.execution.max_main_global_time": "Tick serveur, limite de temps globale",
"gui.computercraft.config.execution.tooltip": "Contrôle le comportement d'exécution des ordinateurs. Ceci est en grande partie\ndestiné à peaufiner les serveurs et ne devrait généralement pas avoir besoin d'être touché.",
"gui.computercraft.config.floppy_space_limit.tooltip": "La limite d'espace disque pour les disquettes, en octets.",
"gui.computercraft.config.http": "HTTP",
"gui.computercraft.config.http.bandwidth": "Bande passante",
"gui.computercraft.config.http.bandwidth.global_download": "Limite de téléchargement globale",
"gui.computercraft.config.execution.max_main_computer_time": "Tick serveur, limite de temps d'ordinateur",
"gui.computercraft.config.http.bandwidth.global_download.tooltip": "Le nombre d'octets qui peuvent être téléchargés en une seconde. Ceci est partagé sur tous les ordinateurs. (octets/s).\nPlage : > 1",
"gui.computercraft.config.http.bandwidth.global_upload": "Limite de téléversement globale",
"gui.computercraft.config.http.bandwidth.global_upload.tooltip": "Le nombre d'octets qui peuvent être téléversé en une seconde. Ceci est partagé sur tous les ordinateurs. (octets/s).\nPlage : > 1",
"gui.computercraft.config.http.bandwidth.tooltip": "Limite la bande passante utilisée par les ordinateurs.",
"gui.computercraft.config.http.max_requests": "Maximum de requêtes simultanées",
"gui.computercraft.config.http.max_requests.tooltip": "Le nombre de requêtes http qu'un ordinateur peut effectuer en même temps.\nLes demandes supplémentaires seront mises en file d'attente et envoyées lorsque\nles demandes en cours seront terminées. Mettre à 0 pour illimité.\nPlage : > 0",
"gui.computercraft.config.http.max_websockets": "Maximum de websockets en simultané",
"gui.computercraft.config.http.max_websockets.tooltip": "Le nombre de websockets qu'un ordinateur peut avoir d'ouverts en même temps. Mettre à 0 pour illimité.\nPlage : > 1",
"gui.computercraft.config.http.rules": "Règles d'autorisation/refus",
"gui.computercraft.config.http.tooltip": "Contrôle l'API HTTP",
"gui.computercraft.config.http.websocket_enabled": "Active les websockets",
"gui.computercraft.config.http.websocket_enabled.tooltip": "Active l'utilisation des websockets http. Cela nécessite que l'option \"http_enable\" soit également activée.",
"gui.computercraft.config.log_computer_errors.tooltip": "Enregistre les exceptions levées par les périphériques et autres objets Lua. Cela permet\naux créateurs de mods de débugger plus facilement les problèmes, mais peut entraîner\nun spam de logs si les joueurs utilisent des fonctions buggées.",
"gui.computercraft.config.maximum_open_files.tooltip": "Défini le nombre de fichiers qu'un ordinateur peut ouvrir en même temps. Mettre à 0 pour illimité.\nPlage : > 0",
"gui.computercraft.config.monitor_distance": "Distance du moniteur",
"gui.computercraft.config.peripheral.modem_high_altitude_range_during_storm.tooltip": "La portée des modems sans fil à l'altitude maximale par temps orageux, en mètres.\nPlage : 0 ~ 100000",
"gui.computercraft.config.peripheral.modem_range_during_storm.tooltip": "La portée des modems sans fil à basse altitude par temps orageux, en mètres.\nPlage : 0 ~ 100000",
"gui.computercraft.config.term_sizes.computer.height.tooltip": "Plage : 1 ~ 255",
"gui.computercraft.config.term_sizes.computer.width.tooltip": "Plage : 1 ~ 255",
"gui.computercraft.config.term_sizes.monitor.height.tooltip": "Plage : 1 ~ 32",
"gui.computercraft.config.monitor_distance.tooltip": "La distance maximale à laquelle les écrans de moniteurs seront rendus. On utilise par défaut la\n'tile entity limit' de base, mais elle peut être augmentée si vous souhaitez créer des moniteurs plus grands.\nPlage : 16 ~ 1024",
"gui.computercraft.config.monitor_renderer": "Moteur de rendu du Moniteur",
"gui.computercraft.config.monitor_renderer.tooltip": "Le moteur de rendu à utiliser pour les moniteurs. Généralement, cela devrait être maintenu au \"meilleur\" - si\nles moniteurs ont des problèmes de performances, vous souhaiterez peut-être expérimenter avec des\nmoteurs de rendu alternatifs.\nValeurs autorisées : BEST, TBO, VBO",
"gui.computercraft.config.peripheral": "Périphériques",
"gui.computercraft.config.peripheral.command_block_enabled.tooltip": "Active la prise en charge des périphériques pour le bloc de commande",
"gui.computercraft.config.peripheral.max_notes_per_tick.tooltip": "Nombre maximum de notes qu'un haut-parleur peut jouer à la fois.\nPlage : > 1",
"gui.computercraft.config.peripheral.monitor_bandwidth": "Bande-passante du moniteur",
"gui.computercraft.config.peripheral.tooltip": "Diverses options relatives aux périphériques.",
"gui.computercraft.config.term_sizes": "Tailles de terminal",
"gui.computercraft.config.term_sizes.computer": "Ordinateur",
"gui.computercraft.config.term_sizes.computer.height": "Hauteur du terminal",
"gui.computercraft.config.term_sizes.computer.tooltip": "Taille du terminal des ordinateurs.",
"gui.computercraft.config.term_sizes.computer.width": "Largeur du terminal",
"gui.computercraft.config.term_sizes.monitor": "Moniteur",
"gui.computercraft.config.term_sizes.monitor.height": "Hauteur maximale du moniteur",
"gui.computercraft.config.term_sizes.monitor.tooltip": "Taille maximale des moniteurs (en blocs).",
"gui.computercraft.config.term_sizes.monitor.width": "Largeur maximale du moniteur",
"gui.computercraft.config.term_sizes.monitor.width.tooltip": "Plage : 1 ~ 32",
"gui.computercraft.config.term_sizes.pocket_computer.height.tooltip": "Plage : 1 ~ 255",
"gui.computercraft.config.term_sizes.pocket_computer.width.tooltip": "Plage : 1 ~ 255",
"gui.computercraft.config.turtle.advanced_fuel_limit.tooltip": "La limite de carburant pour les Tortues Avancées.\nPlage : > 0",
"gui.computercraft.config.turtle.normal_fuel_limit.tooltip": "La limite de carburant pour les Tortues.\nPlage : > 0",
"gui.computercraft.config.upload_nag_delay.tooltip": "Le délai en secondes après lequel les importations non traitées seront notifiées. Mettre à 0 pour désactiver.\nPlage : 0 ~ 60",
"gui.computercraft.config.term_sizes.pocket_computer": "Ordinateur de poche",
"gui.computercraft.config.term_sizes.pocket_computer.height": "Hauteur du terminal",
"gui.computercraft.config.term_sizes.pocket_computer.tooltip": "Taille du terminal des ordinateurs de poche.",
"gui.computercraft.config.term_sizes.pocket_computer.width": "Largeur du terminal",
"gui.computercraft.config.term_sizes.tooltip": "Configure la taille des différents terminaux de l'ordinateur.\nLes terminaux plus grands nécessitent plus de bande passante, réglez donc avec précaution.",
"gui.computercraft.config.turtle": "Tortues",
"gui.computercraft.config.turtle.can_push.tooltip": "Si défini sur true, au lieu de s'arrêter, les tortues pousseront les entités hors du chemin si\nil y a de la place pour le faire.",
"gui.computercraft.config.turtle.need_fuel.tooltip": "Défini si les tortues ont besoin de carburant pour se déplacer.",
"gui.computercraft.config.turtle.tooltip": "Diverses options relatives aux tortues.",
"gui.computercraft.config.upload_nag_delay": "Délai de téléversement",
"gui.computercraft.config.peripheral.modem_high_altitude_range.tooltip": "La portée des modems sans fil à l'altitude maximale par temps dégagé, en mètres.\nPlage : 0 ~ 100000",
"gui.computercraft.upload.failed.corrupted": "Fichiers corrompus lors du téléversement. Veuillez réessayer.",
"gui.computercraft.upload.no_response.msg": "Votre ordinateur n'a pas utilisé les fichiers transférés. Vous devrez peut-être exécuter le programme %s et réessayer.",
"tracking_field.computercraft.http_requests.name": "Requêtes HTTP",
"gui.computercraft.config.execution.max_main_computer_time.tooltip": "La durée maximale idéale pendant laquelle un ordinateur peut s'exécuter en un tick, en millisecondes.\nNotez que nous dépasserons très probablement cette limite, car il n'y a aucun moyen de savoir \ncombien de temps cela prendra - cela vise à être la limite supérieure du temps moyen.\nPlage : > 1",
"gui.computercraft.config.execution.max_main_global_time.tooltip": "Le temps maximum pouvant être consacré à l'exécution de tâches en un seul tick, en\nmillisecondes.\nNotez que nous dépasserons très probablement cette limite, car il n'y a aucun moyen de savoir\ncombien de temps cela prendra - cela vise à être la limite supérieure du temps moyen.\nPlage : > 1",
"gui.computercraft.config.execution.computer_threads.tooltip": "Définissez le nombre de threads sur lesquels les ordinateurs peuvent s'exécuter. Un nombre plus élevé signifie\nque plus d'ordinateurs peuvent fonctionner à la fois, mais peut induire un décalage. Veuillez noter que\ncertains mods peuvent ne pas fonctionner avec un nombre de threads supérieur à 1. À utiliser avec prudence.\nPlage : > 1",
"gui.computercraft.config.http.enabled.tooltip": "Active l'API \"http\" sur les ordinateurs. Cela désactive également les programmes \"pastebin\" et \"wget\",\nsur lesquels de nombreux utilisateurs comptent. Il est recommandé de laisser cette option activée et\nd'utiliser l'option de configuration \"rules\" pour imposer un contrôle plus précis.",
"gui.computercraft.config.peripheral.modem_range.tooltip": "La portée des modems sans fil à basse altitude par temps dégagé, en mètres.\nPlage : 0 ~ 100000",
"gui.computercraft.config.peripheral.monitor_bandwidth.tooltip": "La limite de la quantité de données du moniteur pouvant être envoyées *par tick*. Note:\n - La bande passante est mesurée avant la compression, donc les données envoyées\n au client sont plus petites.\n - Cela ignore le nombre de joueurs auxquels un paquet est envoyé. La mise à jour d'un\n moniteur pour un joueur consomme la même limite de bande passante que l'envoi à 20.\n - Un moniteur de taille normale envoie ~25ko de données. Ainsi, la valeur par défaut (1Mo) permet \n à environ 40 moniteurs d'être mis à jour en un seul tick.\nMettre à 0 pour désactiver.\nPlage: > 0",
"gui.computercraft.config.http.rules.tooltip": "Une liste de règles qui contrôlent le comportement de l'API \"http\" pour des domaines\nou des IP spécifiques. Chaque règle est un élément avec un 'hôte' à comparer et une série\nde propriétés. Les règles sont évaluées dans l'ordre, ce qui signifie que les règles antérieures\nremplacent les suivantes.\nL'hôte peut être un nom de domaine (\"pastebin.com\"), un astérisque (\"*.pastebin.com\") ou\nune notation CIDR (\"127.0.0.0/8\").\nS'il n'y a pas de règles, le domaine est bloqué.",
"gui.computercraft.config.http.proxy.host.tooltip": "Le nom d'hôte ou l'adresse IP du serveur proxy.",
"gui.computercraft.config.http.proxy.tooltip": "Tunnelise les requêtes HTTP et websocket via un serveur proxy. Affecte uniquement\nles règles HTTP avec \"use_proxy\" défini sur true (désactivé par défaut).\nSi l'authentification est requise pour le proxy, créez un fichier \"computercraft-proxy.pw\"\ndans le même dossier que \"computercraft-server.toml\", contenant le\nnom d'utilisateur et mot de passe séparés par deux-points, par ex. \"monutilisateur:monmotdepasse\". Pour\nProxy SOCKS4, seul le nom d'utilisateur est requis.",
"gui.computercraft.config.upload_max_size.tooltip": "La taille limite de téléversement de fichier, en octets. Doit être compris entre 1 Kio et 16 Mio.\nGardez à l'esprit que les téléversements sont traités en un seul clic - les fichiers volumineux ou\nde mauvaises performances réseau peuvent bloquer le thread du réseau. Et attention à l'espace disque !\nPlage : 1024 ~ 16777216",
"gui.computercraft.config.http.proxy": "Proxy",
"gui.computercraft.config.http.proxy.host": "Nom d'hôte",
"gui.computercraft.config.http.proxy.port": "Port",
"gui.computercraft.config.http.proxy.port.tooltip": "Le port du serveur proxy.\nPlage : 1 ~ 65536",
"gui.computercraft.config.http.proxy.type": "Type de proxy",
"gui.computercraft.config.http.proxy.type.tooltip": "Le type de proxy à utiliser.\nValeurs autorisées : HTTP, HTTPS, SOCKS4, SOCKS5",
"gui.computercraft.config.upload_max_size": "Taille limite de téléversement de fichiers (octets)"
"upgrade.minecraft.diamond_sword.adjective": "De Combat"
}

View File

@ -41,9 +41,6 @@
"commands.computercraft.help.synopsis": "Dà aiuto su un determinato comando",
"commands.computercraft.queue.desc": "Invia un evento computer_command ad un computer comando, passando gli argomenti aggiuntivi. Questo comando è pensato per i map makers, è un versione più amichevole verso i computer di /trigger. Qualsiasi giocatore può eseguire il comando, è più probabile che venga fatto attraverso un evento click di un componente di testo.",
"commands.computercraft.queue.synopsis": "Invia un evento computer_command ad un computer comando",
"commands.computercraft.reload.desc": "Ricarica il file di configurazione della ComputerCraft",
"commands.computercraft.reload.done": "File di configurazione ricaricato",
"commands.computercraft.reload.synopsis": "Ricarica il file di configurazione della ComputerCraft",
"commands.computercraft.shutdown.desc": "Spegne i computer specificati o tutti se non specificati. Puoi specificare l'instance id del computer (e.g. 123), l'id del computer (e.g. #123) o l'etichetta (e.g. \"@Il mio Computer\").",
"commands.computercraft.shutdown.done": "Spenti %s/%s computer",
"commands.computercraft.shutdown.synopsis": "Spegne i computer da remoto.",
@ -73,31 +70,110 @@
"commands.computercraft.view.desc": "Apre il terminale di un computer, in modo da poterlo controllare da remoto. Non permette l'accesso all'inventario di una tartaruga. Puoi specificare l'instance id del computer (e.g. 123) o l'id (e.g. #123).",
"commands.computercraft.view.not_player": "Non è possibile aprire un terminale per un non giocatore",
"commands.computercraft.view.synopsis": "Mostra il terminale di un computer.",
"gui.computercraft.config.command_require_creative": "Il computer Comando richiede la modalità creativa",
"gui.computercraft.config.command_require_creative.tooltip": "Richiede che i giocatori siano in modalità creativa e che siano operatori in ordine per interagire con\ni computer di commando. Questo è il comportamento predefinito dei blocchi di comando.",
"gui.computercraft.config.computer_space_limit": "Limite spazio Computer (bytes)",
"gui.computercraft.config.computer_space_limit.tooltip": "Limite di spazio di archiviazione per i computer e le tartarughe, in byte.",
"gui.computercraft.config.default_computer_settings": "Impostazioni Computer predefinite",
"gui.computercraft.config.default_computer_settings.tooltip": "Una lista di impostazioni predefinite per i nuovi computer, separate da virgola.\nEsempio: \"shell.autocomplete=false,lua.autocomplete=false,edit.autocomplete=false\"\ndisattiverà tutti gli autocompletamenti.",
"gui.computercraft.config.disable_lua51_features": "Disattiva features Lua 5.1",
"gui.computercraft.config.disable_lua51_features.tooltip": "Imposta a \"true\" per disattivare le funzionalità di Lua 5.1 che saranno rimosse in un\naggiornamento futuro. Utile per assicurare futura compatibilità con i tuoi programmi.",
"gui.computercraft.config.execution": "Esecuzione",
"gui.computercraft.config.execution.computer_threads": "Threads computer",
"gui.computercraft.config.execution.computer_threads.tooltip": "Imposta la quantità di thread che possono eseguire i computer. Un numero più alto significa\nche più computer possono essere eseguiti alla volta, ma può indurre a lag. Alcune mod potrebbero\nnon funzionare con numeri di thread maggiore a 1. Usare con cautela.\nRange: > 1",
"gui.computercraft.config.execution.max_main_computer_time": "Limite di tempo del computer nel server",
"gui.computercraft.config.execution.max_main_computer_time.tooltip": "Il tempo massimo ideale che un computer può eseguire in un tick, in millisecondi.\nNota, potremmo andare ben sopra questo limite, perché non c'è modo di sapere\nquanto impiega, questa configurazione mira ad essere il limite maggiore del tempo medio.\nRange: > 1",
"gui.computercraft.config.execution.max_main_global_time": "Limite tempo globale dei tick del server",
"gui.computercraft.config.execution.max_main_global_time.tooltip": "Il limite massimo di tempo che può essere usato per eseguire task in un singolo tick,\nin millisecondi.\nNota, potremmo andare ben sopra questo limite, perché non c'è modo di sapere\nquanto impiega, questa configurazione mira ad essere il limite maggiore del tempo medio.\nRange: > 1",
"gui.computercraft.config.execution.tooltip": "Controlla comportamento esecuzione dei computer. Questo è largamente utilizzato\nper ritoccare la performance dei server, e generale non dovrebbe essere toccato.",
"gui.computercraft.config.floppy_space_limit": "Limite spazio Disco Floppy (bytes)",
"gui.computercraft.config.floppy_space_limit.tooltip": "Limite di spazio di archiviazione per i dischi floppy, in byte.",
"gui.computercraft.config.http": "HTTP",
"gui.computercraft.config.http.bandwidth": "Banda larga",
"gui.computercraft.config.http.bandwidth.global_download": "Limite download globale",
"gui.computercraft.config.http.bandwidth.global_download.tooltip": "Numero di byte che possono essere scaricati in un secondo. Questo è condiviso tra tutti i computer. (bytes/s).\nRange: > 1",
"gui.computercraft.config.http.bandwidth.global_upload": "Limite upload globale",
"gui.computercraft.config.http.bandwidth.global_upload.tooltip": "Numero di byte che possono essere caricati in un secondo. Questo è condiviso tra tutti i computer. (bytes/s).\nRange: > 1",
"gui.computercraft.config.http.bandwidth.tooltip": "Limita la banda larga usato dai computer.",
"gui.computercraft.config.http.enabled": "Attiva l'API HTTP",
"gui.computercraft.config.http.enabled.tooltip": "Attiva l'API \"http\" sui computer. Disattivandolo, vengono disattivati anche i programmi \"pastebin\" e \"wget\", \ndi cui molti utenti dipendono. È raccomandato lasciarlo attivo ed utilizzare l'opzione \n\"rules\" per imporre controlli più adeguati.",
"gui.computercraft.config.http.max_requests": "Richieste correnti massime",
"gui.computercraft.config.http.max_requests.tooltip": "Il numero di richieste http che un computer può fare alla volta. Ulteriori richieste\nverranno messe in coda, ed inviate quando le richieste correnti sono terminate.\nImposta a 0 per illimitato.\nRange: > 0",
"gui.computercraft.config.http.max_websockets": "Connessioni websocket massime",
"gui.computercraft.config.http.max_websockets.tooltip": "Il numero di websocket che un computer può avere aperte allo stesso momento.\nImposta a 0 per illimitato.\nRange: > 1",
"gui.computercraft.config.http.proxy": "Proxy",
"gui.computercraft.config.http.proxy.host": "Nome host",
"gui.computercraft.config.http.proxy.host.tooltip": "Il nome dell'host o l'indirizzo IP del server proxy.",
"gui.computercraft.config.http.proxy.port": "Porta",
"gui.computercraft.config.http.proxy.port.tooltip": "La porta del server proxy.\nRange: 1 ~ 65536",
"gui.computercraft.config.http.proxy.tooltip": "Transmetti richieste HTTP e websocket attraverso un server proxy. Ha effetto solo\nsu regole HTTP con \"use_proxy\" attivo (disattivato di default).\nSe l'autenticazione è richiesta per il proxy, creare un file \"computercraft-proxy.pw\"\nnella stessa cartella di \"computercraft-server.toml\", contenendo il nome utente e\npassword separati dal carattere due punti, per esempio: \"myuser:mypassword\".\nI proxy SOCKS4 necessitano solo il nome utente.",
"gui.computercraft.config.http.proxy.type": "Tipo proxy",
"gui.computercraft.config.http.proxy.type.tooltip": "Il tipo di proxy da usare.\nValori consentiti: HTTP, HTTPS, SOCKS4, SOCKS5",
"gui.computercraft.config.http.rules": "Concedi/nega regole",
"gui.computercraft.config.http.rules.tooltip": "Una lista di regole che controllano il comportamento dell'API \"http\" per specifici domini\no indirizzi IP. Ogni regola corrisponde ad un nome host ed una porta opzionale, e poi imposta varie\nproprietà per la richiesta. Le regole sono valutate in ordine, cioè le prime regole sovvrascrivono le successive.\n\nProprietà valide:\n - \"host\" (richiesto): Il dominio o l'indirizzo IP della regola. Può essere un nome di dominio\n (\"pastebin.com\"), jolly (\"*.pastebin.com\") o notazione CIDR (\"127.0.0.0/8\").\n - \"port\" (opzionale): Corrisponde solo a richieste con una specifica porta, come 80 o 443.\n\n - \"action\" (opzionale): Se consentire o negare la richiesta.\n - \"max_download\" (opzionale): Quantità massima (in byte) che un computer può scaricare in\n questa richiesta.\n - \"max_upload\" (opzionale): Quantità massima (in byte) che un computer può caricare in\n questa richiesta.\n - \"max_websocket_message\" (opzionale): Quantità massima (in byte) che un computer può inviare o\n ricevere in un pacchetto websocket.\n - \"use_proxy\" (opzionale): Attiva l'uso di un proxy HTTP/SOCKS se configurato.",
"gui.computercraft.config.http.tooltip": "Controlla l'API HTTP",
"gui.computercraft.config.http.websocket_enabled": "Attiva websocket",
"gui.computercraft.config.http.websocket_enabled.tooltip": "Attiva l'uso di websocket http. Questo richiede che l'opzione \"http_enable\" sia attiva.",
"gui.computercraft.config.log_computer_errors": "Salva errori computer",
"gui.computercraft.config.log_computer_errors.tooltip": "Registra le eccezioni lanciate dalle periferiche e altri oggetti di Lua. Questo rende più facile\nper gli autori di mod per il debug di problemi, ma potrebbe risultare in spam di log durante\nl'uso di metodi buggati.",
"gui.computercraft.config.maximum_open_files": "Massimo file aperti per computer",
"gui.computercraft.config.maximum_open_files.tooltip": "Imposta quanti file possono essere aperti allo stesso momento su un computer. Imposta a 0 per illimitato.\nRange: > 0",
"gui.computercraft.config.monitor_distance": "Distanza monitor",
"gui.computercraft.config.monitor_distance.tooltip": "Distanza massima che i monitor vengono renderizzati. Questo è predefinito al limite\nstandard dei tile entity, ma può essere esteso se desideri construire monitor più grandi.\nRange: 16 ~ 1024",
"gui.computercraft.config.monitor_renderer": "Renderizzatore monitor",
"gui.computercraft.config.monitor_renderer.tooltip": "Il renderizzatore da usare per i monitor. Generalmente si dovrebbe lasciare su \"best\", se\ni monitor hanno problemi di performance, puoi sperimentare con renderizzatori alternativi.\nValori concessi: BEST, TBO, VBO",
"gui.computercraft.config.peripheral": "Periferiche",
"gui.computercraft.config.peripheral.command_block_enabled": "Attiva periferica blocco comandi",
"gui.computercraft.config.peripheral.command_block_enabled.tooltip": "Attiva il supporto ai blocchi di comando come periferiche",
"gui.computercraft.config.peripheral.max_notes_per_tick": "Note massime alla volta",
"gui.computercraft.config.peripheral.max_notes_per_tick.tooltip": "Quantità massima di note che un altoparlante può riprodurre allo stesso momento.\nRange: > 1",
"gui.computercraft.config.peripheral.modem_high_altitude_range": "Raggio Modem (alta quota)",
"gui.computercraft.config.peripheral.modem_high_altitude_range.tooltip": "La distanza massima dei modem wireless all'altitudine massima durante il meteo soleggiato. in metri.\nRange: 0 ~ 100000",
"gui.computercraft.config.peripheral.modem_high_altitude_range_during_storm": "Raggio Modem (alta quota, brutto tempo)",
"gui.computercraft.config.peripheral.modem_high_altitude_range_during_storm.tooltip": "La distanza massima dei modem wireless all'altitudine massima durante una tempesta. in metri.\nRange: 0 ~ 100000",
"gui.computercraft.config.peripheral.modem_range": "Raggio Modem (default)",
"gui.computercraft.config.peripheral.modem_range.tooltip": "La distanza massima dei modem wireless ad altitudini basse durante il meteo soleggiato. in metri.\nRange: 0 ~ 100000",
"gui.computercraft.config.peripheral.modem_range_during_storm": "Raggio Modem (brutto tempo)",
"gui.computercraft.config.peripheral.modem_range_during_storm.tooltip": "La distanza massima dei modem wireless ad altitudini basse durante una tempesta. in metri.\nRange: 0 ~ 100000",
"gui.computercraft.config.peripheral.monitor_bandwidth": "Banda larga monitor",
"gui.computercraft.config.peripheral.monitor_bandwidth.tooltip": "Il limite di quanti dati dei monitor possono essere inviati *al tick*. Nota:\n - La banda larga è misurata prima della compressione, così che il dato inviato al client è\n più piccolo.\n - Questo ignora il numero di giocatori a cui viene inviato il pacchetto. Aggiornare un monitor\n per un giocatore consuma lo stesso limite di banda larga dell'invio a 20 giocatori.\n - Un monitor alla massima grandezza invia ~25kb di dati. Quindi il valore predefinito (1MB) concede\n ~40 monitor di essere aggiornati in un singolo tick.\nImposta a 0 per disattivare.\nRange: > 0",
"gui.computercraft.config.peripheral.tooltip": "Opzioni varie riguardo le periferiche.",
"gui.computercraft.config.term_sizes": "Dimensioni terminale",
"gui.computercraft.config.term_sizes.computer": "Computer",
"gui.computercraft.config.term_sizes.computer.height": "Altezza terminale",
"gui.computercraft.config.term_sizes.computer.height.tooltip": "Range: 1 ~ 255",
"gui.computercraft.config.term_sizes.computer.tooltip": "Dimensioni del terminale dei computer.",
"gui.computercraft.config.term_sizes.computer.width": "Larghezza terminale",
"gui.computercraft.config.term_sizes.computer.width.tooltip": "Intervallo: 1 ~ 255",
"gui.computercraft.config.term_sizes.monitor": "Monitor",
"gui.computercraft.config.term_sizes.monitor.height": "Massima altezza del monitor",
"gui.computercraft.config.term_sizes.monitor.height.tooltip": "Range: 1 ~ 32",
"gui.computercraft.config.term_sizes.monitor.tooltip": "Massima grandezza dei monitor (in blocchi).",
"gui.computercraft.config.term_sizes.monitor.width": "Larghezza massima del monitor",
"gui.computercraft.config.term_sizes.monitor.width.tooltip": "Range: 1 ~ 32",
"gui.computercraft.config.term_sizes.pocket_computer": "Computer Tascabile",
"gui.computercraft.config.term_sizes.pocket_computer.height": "Altezza terminale",
"gui.computercraft.config.term_sizes.pocket_computer.height.tooltip": "Range: 1 ~ 255",
"gui.computercraft.config.term_sizes.pocket_computer.tooltip": "Dimensioni del terminale dei computer tascabili.",
"gui.computercraft.config.term_sizes.pocket_computer.width": "Larghezza terminale",
"gui.computercraft.config.term_sizes.pocket_computer.width.tooltip": "Range: 1 ~ 255",
"gui.computercraft.config.term_sizes.tooltip": "Configura le dimensioni dei terminali di vari computer.\nTerminali più grandi richiedono più banda larga, usa con cautela.",
"gui.computercraft.config.turtle": "Tartarughe",
"gui.computercraft.config.turtle.advanced_fuel_limit": "Limite carburante tartarughe avanzate",
"gui.computercraft.config.turtle.advanced_fuel_limit.tooltip": "Limite carburante delle Tartarughe Avanzate.\nRange: > 0",
"gui.computercraft.config.turtle.can_push": "Le tartarughe possono spingere le entità",
"gui.computercraft.config.turtle.can_push.tooltip": "Se impostato a true, le Tartarughe spingeranno le entità fuori dai piedi invece\ndi fermarsi se c'è spazio.",
"gui.computercraft.config.turtle.need_fuel": "Attiva carburante",
"gui.computercraft.config.turtle.need_fuel.tooltip": "Imposta se la Tartaruga richiede del carburante per muoversi.",
"gui.computercraft.config.turtle.normal_fuel_limit": "Limite carburante tartarughe",
"gui.computercraft.config.turtle.normal_fuel_limit.tooltip": "Limite carburante delle Tartarughe.\nRange: > 0",
"gui.computercraft.config.turtle.tooltip": "Opzioni varie riguardo le tartarughe.",
"gui.computercraft.config.upload_max_size": "Limite delle dimensioni dei file da caricare (byte)",
"gui.computercraft.config.upload_max_size.tooltip": "Il limite delle dimensioni dei file da caricare, in byte. Deve essere in range di 1KiB e 16 MiB.\nRicorda che i caricamenti sono processati in un singolo tick - i file grandi o\nuna rete di bassa qualità può bloccare il thread di rete. E ricorda anche lo spazio di archiviazione dei dischi!\nRange: 1024 ~ 16777216",
"gui.computercraft.config.upload_nag_delay": "Ritardo nel caricamento",
"gui.computercraft.config.upload_nag_delay.tooltip": "Ritardo in secondi dopo il quale verranno notificate le importazioni non gestite. Imposta a 0 per disattivare.\nRange: 0 ~ 60",
"gui.computercraft.pocket_computer_overlay": "Computer tascabile aperto. Premi ESC per chiudere.",
"gui.computercraft.terminal": "Terminale computer",
"gui.computercraft.tooltip.computer_id": "ID Computer: %s",
"gui.computercraft.tooltip.copy": "Copia negli appunti",
"gui.computercraft.tooltip.disk_id": "ID Disco: %s",
@ -113,6 +189,8 @@
"gui.computercraft.upload.failed.name_too_long": "I nomi dei file sono troppo lunghi per essere caricati.",
"gui.computercraft.upload.failed.too_many_files": "Non puoi caricare troppi file.",
"gui.computercraft.upload.failed.too_much": "I tuoi file sono troppo grandi per essere caricati.",
"gui.computercraft.upload.no_response": "Trasferimento File",
"gui.computercraft.upload.no_response.msg": "Il tuo computer non ha usato i tuoi file trasferiti. Potresti aver bisogno di eseguire il programma %s e riprovare di nuovo.",
"item.computercraft.disk": "Disco Floppy",
"item.computercraft.pocket_computer_advanced": "Computer Tascabile Avanzato",
"item.computercraft.pocket_computer_advanced.upgraded": "Computer Tascabile %s Avanzato",
@ -123,12 +201,17 @@
"item.computercraft.printed_pages": "Pagine Stampate",
"item.computercraft.treasure_disk": "Disco Floppy",
"itemGroup.computercraft": "ComputerCraft",
"tracking_field.computercraft.coroutines_created.name": "Coroutine create",
"tracking_field.computercraft.coroutines_dead.name": "Coroutine cancellate",
"tracking_field.computercraft.avg": "%s (media)",
"tracking_field.computercraft.computer_tasks.name": "Attività",
"tracking_field.computercraft.count": "%s (conta)",
"tracking_field.computercraft.fs.name": "Operazioni filesystem",
"tracking_field.computercraft.http_download.name": "Download HTTP",
"tracking_field.computercraft.http_requests.name": "Richieste HTTP",
"tracking_field.computercraft.http_upload.name": "Upload HTTP",
"tracking_field.computercraft.max": "%s (massimo)",
"tracking_field.computercraft.peripheral.name": "Chiamate alle periferiche",
"tracking_field.computercraft.server_tasks.name": "Attività server",
"tracking_field.computercraft.turtle_ops.name": "Operazioni tartarughe",
"tracking_field.computercraft.websocket_incoming.name": "Websocket in arrivo",
"tracking_field.computercraft.websocket_outgoing.name": "Websocket in uscita",
"upgrade.computercraft.speaker.adjective": "Rumoroso",
@ -139,93 +222,5 @@
"upgrade.minecraft.diamond_hoe.adjective": "Contadina",
"upgrade.minecraft.diamond_pickaxe.adjective": "Minatrice",
"upgrade.minecraft.diamond_shovel.adjective": "Scavatrice",
"upgrade.minecraft.diamond_sword.adjective": "Da Combattimento",
"gui.computercraft.config.term_sizes.computer.width.tooltip": "Intervallo: 1 ~ 255",
"gui.computercraft.config.turtle.need_fuel.tooltip": "Imposta se la Tartaruga richiede del carburante per muoversi.",
"gui.computercraft.config.command_require_creative": "Il computer Comando richiede la modalità creativa",
"tracking_field.computercraft.http_requests.name": "Richieste HTTP",
"gui.computercraft.config.command_require_creative.tooltip": "Richiede che i giocatori siano in modalità creativa e che siano operatori in ordine per interagire con\ni computer di commando. Questo è il comportamento predefinito dei blocchi di comando.",
"gui.computercraft.config.disable_lua51_features.tooltip": "Imposta a \"true\" per disattivare le funzionalità di Lua 5.1 che saranno rimosse in un\naggiornamento futuro. Utile per assicurare futura compatibilità con i tuoi programmi.",
"gui.computercraft.config.execution": "Esecuzione",
"gui.computercraft.config.execution.max_main_computer_time": "Limite di tempo del computer nel server",
"gui.computercraft.config.execution.max_main_computer_time.tooltip": "Il tempo massimo ideale che un computer può eseguire in un tick, in millisecondi.\nNota, potremmo andare ben sopra questo limite, perché non c'è modo di sapere\nquanto impiega, questa configurazione mira ad essere il limite maggiore del tempo medio.\nRange: > 1",
"gui.computercraft.config.execution.max_main_global_time": "Limite tempo globale dei tick del server",
"gui.computercraft.config.execution.tooltip": "Controlla comportamento esecuzione dei computer. Questo è largamente utilizzato\nper ritoccare la performance dei server, e generale non dovrebbe essere toccato.",
"gui.computercraft.config.floppy_space_limit.tooltip": "Limite di spazio di archiviazione per i dischi floppy, in byte.",
"gui.computercraft.config.http.bandwidth": "Banda larga",
"gui.computercraft.config.http.bandwidth.global_download": "Limite download globale",
"gui.computercraft.config.http.bandwidth.global_download.tooltip": "Numero di byte che possono essere scaricati in un secondo. Questo è condiviso tra tutti i computer. (bytes/s).\nRange: > 1",
"gui.computercraft.config.http.bandwidth.global_upload": "Limite upload globale",
"gui.computercraft.config.http.bandwidth.global_upload.tooltip": "Numero di byte che possono essere caricati in un secondo. Questo è condiviso tra tutti i computer. (bytes/s).\nRange: > 1",
"gui.computercraft.config.http.bandwidth.tooltip": "Limita la banda larga usato dai computer.",
"gui.computercraft.config.http.max_requests.tooltip": "Il numero di richieste http che un computer può fare alla volta. Ulteriori richieste\nverranno messe in coda, ed inviate quando le richieste correnti sono terminate.\nImposta a 0 per illimitato.\nRange: > 0",
"gui.computercraft.config.http.max_websockets.tooltip": "Il numero di websocket che un computer può avere aperte allo stesso momento.\nImposta a 0 per illimitato.\nRange: > 1",
"gui.computercraft.config.http.rules": "Concedi/nega regole",
"gui.computercraft.config.maximum_open_files.tooltip": "Imposta quanti file possono essere aperti allo stesso momento su un computer. Imposta a 0 per illimitato.\nRange: > 0",
"gui.computercraft.config.monitor_distance": "Distanza monitor",
"gui.computercraft.config.monitor_distance.tooltip": "Distanza massima che i monitor vengono renderizzati. Questo è predefinito al limite\nstandard dei tile entity, ma può essere esteso se desideri construire monitor più grandi.\nRange: 16 ~ 1024",
"gui.computercraft.config.monitor_renderer": "Renderizzatore monitor",
"gui.computercraft.config.peripheral.command_block_enabled.tooltip": "Attiva il supporto ai blocchi di comando come periferiche",
"gui.computercraft.config.peripheral.max_notes_per_tick.tooltip": "Quantità massima di note che un altoparlante può riprodurre allo stesso momento.\nRange: > 1",
"gui.computercraft.config.peripheral.modem_high_altitude_range.tooltip": "La distanza massima dei modem wireless all'altitudine massima durante il meteo soleggiato. in metri.\nRange: 0 ~ 100000",
"gui.computercraft.config.peripheral.modem_high_altitude_range_during_storm.tooltip": "La distanza massima dei modem wireless all'altitudine massima durante una tempesta. in metri.\nRange: 0 ~ 100000",
"gui.computercraft.config.peripheral.modem_range.tooltip": "La distanza massima dei modem wireless ad altitudini basse durante il meteo soleggiato. in metri.\nRange: 0 ~ 100000",
"gui.computercraft.config.peripheral.modem_range_during_storm.tooltip": "La distanza massima dei modem wireless ad altitudini basse durante una tempesta. in metri.\nRange: 0 ~ 100000",
"gui.computercraft.config.peripheral.monitor_bandwidth": "Banda larga monitor",
"gui.computercraft.config.computer_space_limit.tooltip": "Limite di spazio di archiviazione per i computer e le tartarughe, in byte.",
"gui.computercraft.config.default_computer_settings.tooltip": "Una lista di impostazioni predefinite per i nuovi computer, separate da virgola.\nEsempio: \"shell.autocomplete=false,lua.autocomplete=false,edit.autocomplete=false\"\ndisattiverà tutti gli autocompletamenti.",
"gui.computercraft.config.execution.computer_threads.tooltip": "Imposta la quantità di thread che possono eseguire i computer. Un numero più alto significa\nche più computer possono essere eseguiti alla volta, ma può indurre a lag. Alcune mod potrebbero\nnon funzionare con numeri di thread maggiore a 1. Usare con cautela.\nRange: > 1",
"gui.computercraft.config.execution.max_main_global_time.tooltip": "Il limite massimo di tempo che può essere usato per eseguire task in un singolo tick,\nin millisecondi.\nNota, potremmo andare ben sopra questo limite, perché non c'è modo di sapere\nquanto impiega, questa configurazione mira ad essere il limite maggiore del tempo medio.\nRange: > 1",
"gui.computercraft.config.http.enabled.tooltip": "Attiva l'API \"http\" sui computer. Disattivandolo, vengono disattivati anche i programmi \"pastebin\" e \"wget\", \ndi cui molti utenti dipendono. È raccomandato lasciarlo attivo ed utilizzare l'opzione \n\"rules\" per imporre controlli più adeguati.",
"gui.computercraft.config.http.rules.tooltip": "Una lista di regole che controllano il comportamento dell'API \"http\" per specifici domini\no indirizzi IP. Ogni regola corrisponde ad un nome host ed una porta opzionale, e poi imposta varie\nproprietà per la richiesta. Le regole sono valutate in ordine, cioè le prime regole sovvrascrivono le successive.\n\nProprietà valide:\n - \"host\" (richiesto): Il dominio o l'indirizzo IP della regola. Può essere un nome di dominio\n (\"pastebin.com\"), jolly (\"*.pastebin.com\") o notazione CIDR (\"127.0.0.0/8\").\n - \"port\" (opzionale): Corrisponde solo a richieste con una specifica porta, come 80 o 443.\n\n - \"action\" (opzionale): Se consentire o negare la richiesta.\n - \"max_download\" (opzionale): Quantità massima (in byte) che un computer può scaricare in\n questa richiesta.\n - \"max_upload\" (opzionale): Quantità massima (in byte) che un computer può caricare in\n questa richiesta.\n - \"max_websocket_message\" (opzionale): Quantità massima (in byte) che un computer può inviare o\n ricevere in un pacchetto websocket.\n - \"use_proxy\" (opzionale): Attiva l'uso di un proxy HTTP/SOCKS se configurato.",
"gui.computercraft.config.http.tooltip": "Controlla l'API HTTP",
"gui.computercraft.config.http.websocket_enabled.tooltip": "Attiva l'uso di websocket http. Questo richiede che l'opzione \"http_enable\" sia attiva.",
"gui.computercraft.config.log_computer_errors.tooltip": "Registra le eccezioni lanciate dalle periferiche e altri oggetti di Lua. Questo rende più facile\nper gli autori di mod per il debug di problemi, ma potrebbe risultare in spam di log durante\nl'uso di metodi buggati.",
"gui.computercraft.config.monitor_renderer.tooltip": "Il renderizzatore da usare per i monitor. Generalmente si dovrebbe lasciare su \"best\", se\ni monitor hanno problemi di performance, puoi sperimentare con renderizzatori alternativi.\nValori concessi: BEST, TBO, VBO",
"gui.computercraft.config.peripheral.monitor_bandwidth.tooltip": "Il limite di quanti dati dei monitor possono essere inviati *al tick*. Nota:\n - La banda larga è misurata prima della compressione, così che il dato inviato al client è\n più piccolo.\n - Questo ignora il numero di giocatori a cui viene inviato il pacchetto. Aggiornare un monitor\n per un giocatore consuma lo stesso limite di banda larga dell'invio a 20 giocatori.\n - Un monitor alla massima grandezza invia ~25kb di dati. Quindi il valore predefinito (1MB) concede\n ~40 monitor di essere aggiornati in un singolo tick.\nImposta a 0 per disattivare.\nRange: > 0",
"gui.computercraft.terminal": "Terminale computer",
"tracking_field.computercraft.turtle_ops.name": "Operazioni tartarughe",
"tracking_field.computercraft.avg": "%s (media)",
"tracking_field.computercraft.computer_tasks.name": "Attività",
"tracking_field.computercraft.count": "%s (conta)",
"tracking_field.computercraft.max": "%s (massimo)",
"tracking_field.computercraft.server_tasks.name": "Attività server",
"gui.computercraft.upload.no_response": "Trasferimento File",
"gui.computercraft.config.peripheral.tooltip": "Opzioni varie riguardo le periferiche.",
"gui.computercraft.config.term_sizes.computer": "Computer",
"gui.computercraft.config.term_sizes.computer.height": "Altezza terminale",
"gui.computercraft.config.term_sizes.computer.height.tooltip": "Range: 1 ~ 255",
"gui.computercraft.config.term_sizes": "Dimensioni terminale",
"gui.computercraft.config.term_sizes.computer.tooltip": "Dimensioni del terminale dei computer.",
"gui.computercraft.config.term_sizes.computer.width": "Larghezza terminale",
"gui.computercraft.config.term_sizes.monitor": "Monitor",
"gui.computercraft.config.term_sizes.monitor.height": "Massima altezza del monitor",
"gui.computercraft.config.term_sizes.monitor.height.tooltip": "Range: 1 ~ 32",
"gui.computercraft.config.term_sizes.monitor.tooltip": "Massima grandezza dei monitor (in blocchi).",
"gui.computercraft.config.term_sizes.monitor.width": "Larghezza massima del monitor",
"gui.computercraft.config.term_sizes.monitor.width.tooltip": "Range: 1 ~ 32",
"gui.computercraft.config.term_sizes.pocket_computer": "Computer Tascabile",
"gui.computercraft.config.term_sizes.pocket_computer.height": "Altezza terminale",
"gui.computercraft.config.term_sizes.pocket_computer.height.tooltip": "Range: 1 ~ 255",
"gui.computercraft.config.term_sizes.pocket_computer.tooltip": "Dimensioni del terminale dei computer tascabili.",
"gui.computercraft.config.term_sizes.pocket_computer.width": "Larghezza terminale",
"gui.computercraft.config.term_sizes.pocket_computer.width.tooltip": "Range: 1 ~ 255",
"gui.computercraft.config.turtle.advanced_fuel_limit.tooltip": "Limite carburante delle Tartarughe Avanzate.\nRange: > 0",
"gui.computercraft.config.turtle.can_push.tooltip": "Se impostato a true, le Tartarughe spingeranno le entità fuori dai piedi invece\ndi fermarsi se c'è spazio.",
"gui.computercraft.config.turtle.normal_fuel_limit.tooltip": "Limite carburante delle Tartarughe.\nRange: > 0",
"gui.computercraft.config.turtle.tooltip": "Opzioni varie riguardo le tartarughe.",
"gui.computercraft.config.upload_nag_delay": "Ritardo nel caricamento",
"gui.computercraft.config.term_sizes.tooltip": "Configura le dimensioni dei terminali di vari computer.\nTerminali più grandi richiedono più banda larga, usa con cautela.",
"gui.computercraft.config.upload_nag_delay.tooltip": "Ritardo in secondi dopo il quale verranno notificate le importazioni non gestite. Imposta a 0 per disattivare.\nRange: 0 ~ 60",
"gui.computercraft.upload.no_response.msg": "Il tuo computer non ha usato i tuoi file trasferiti. Potresti aver bisogno di eseguire il programma %s e riprovare di nuovo.",
"gui.computercraft.config.upload_max_size.tooltip": "Il limite delle dimensioni dei file da caricare, in byte. Deve essere in range di 1KiB e 16 MiB.\nRicorda che i caricamenti sono processati in un singolo tick - i file grandi o\nuna rete di bassa qualità può bloccare il thread di rete. E ricorda anche lo spazio di archiviazione dei dischi!\nRange: 1024 ~ 16777216",
"gui.computercraft.config.http.proxy": "Proxy",
"gui.computercraft.config.http.proxy.host": "Nome host",
"gui.computercraft.config.http.proxy.host.tooltip": "Il nome dell'host o l'indirizzo IP del server proxy.",
"gui.computercraft.config.http.proxy.port": "Porta",
"gui.computercraft.config.http.proxy.port.tooltip": "La porta del server proxy.\nRange: 1 ~ 65536",
"gui.computercraft.config.http.proxy.tooltip": "Transmetti richieste HTTP e websocket attraverso un server proxy. Ha effetto solo\nsu regole HTTP con \"use_proxy\" attivo (disattivato di default).\nSe l'autenticazione è richiesta per il proxy, creare un file \"computercraft-proxy.pw\"\nnella stessa cartella di \"computercraft-server.toml\", contenendo il nome utente e\npassword separati dal carattere due punti, per esempio: \"myuser:mypassword\".\nI proxy SOCKS4 necessitano solo il nome utente.",
"gui.computercraft.config.http.proxy.type": "Tipo proxy",
"gui.computercraft.config.http.proxy.type.tooltip": "Il tipo di proxy da usare.\nValori consentiti: HTTP, HTTPS, SOCKS4, SOCKS5",
"gui.computercraft.config.upload_max_size": "Limite delle dimensioni dei file da caricare (byte)"
"upgrade.minecraft.diamond_sword.adjective": "Da Combattimento"
}

View File

@ -41,9 +41,6 @@
"commands.computercraft.help.synopsis": "特定のコマンドのヘルプを提供します",
"commands.computercraft.queue.desc": "追加の引数を通過する computer_command インベントをコマンドコンピューターに送信します。これは主にマップメーカーのために設計されており、よりコンピュータフレンドリーバージョンの /trigger として機能します。 どのプレイヤーでもコマンドを実行できます。これは、テキストコンポーネントのクリックイベントを介して行われる可能性があります。",
"commands.computercraft.queue.synopsis": "computer_command インベントをコマンドコンピューターに送信します",
"commands.computercraft.reload.desc": "コンピュータークラフトのコンフィグファイルを再読み込みします",
"commands.computercraft.reload.done": "コンフィグを再読み込みしました",
"commands.computercraft.reload.synopsis": "コンピュータークラフトのコンフィグファイルを再読み込みします",
"commands.computercraft.shutdown.desc": "指定されたコンピュータ、指定されていない場合はすべてのコンピュータをシャットダウンします。 コンピュータのインスタンスID (例えば 123), コンピュータID (例えば #123) またはラベル (例えば \\\"@My Computer\\\") を指定することができます。",
"commands.computercraft.shutdown.done": "%s/%s コンピューターをシャットダウンしました",
"commands.computercraft.shutdown.synopsis": "コンピュータをリモートでシャットダウンする。",
@ -99,8 +96,6 @@
"item.computercraft.printed_pages": "印刷された紙束",
"item.computercraft.treasure_disk": "フロッピーディスク",
"itemGroup.computercraft": "ComputerCraft",
"tracking_field.computercraft.coroutines_created.name": "コルーチン作成",
"tracking_field.computercraft.coroutines_dead.name": "コルーチン削除",
"tracking_field.computercraft.fs.name": "ファイルシステム演算",
"tracking_field.computercraft.http_download.name": "HTTPダウンロード",
"tracking_field.computercraft.http_upload.name": "HTTPアップロード",

View File

@ -41,9 +41,6 @@
"commands.computercraft.help.synopsis": "특정 명령어에 대한 도움말을 제공하기",
"commands.computercraft.queue.desc": "computer_command 이벤트를 명령 컴퓨터로 전송하여 추가 인수를 전달합니다. 이는 대부분 지도 제작자를 위해 설계되었으며, 보다 컴퓨터 친화적인 버전의 /trigger 역할을 합니다. 어떤 플레이어든 명령을 실행할 수 있으며, 이는 텍스트 구성 요소의 클릭 이벤트를 통해 수행될 가능성이 가장 높습니다.",
"commands.computercraft.queue.synopsis": "computer_command 이벤트를 명령 컴퓨터에 보내기",
"commands.computercraft.reload.desc": "컴퓨터크래프트 구성파일을 리로드합니다.",
"commands.computercraft.reload.done": "리로드된 구성",
"commands.computercraft.reload.synopsis": "컴퓨터크래프트 구성파일을 리로드하기",
"commands.computercraft.shutdown.desc": "나열된 시스템 또는 지정된 시스템이 없는 경우 모두 종료합니다. 컴퓨터의 인스턴스 ID(예: 123)나 컴퓨터 ID(예: #123) 또는 라벨(예: \"@My Computer\")을 지정할 수 있습니다.",
"commands.computercraft.shutdown.done": "%s/%s 컴퓨터 시스템 종료",
"commands.computercraft.shutdown.synopsis": "시스템을 원격으로 종료하기",
@ -126,8 +123,6 @@
"item.computercraft.printed_pages": "인쇄된 페이지 모음",
"item.computercraft.treasure_disk": "플로피 디스크",
"itemGroup.computercraft": "컴퓨터크래프트",
"tracking_field.computercraft.coroutines_created.name": "코루틴 생성됨",
"tracking_field.computercraft.coroutines_dead.name": "코루틴 처리됨",
"tracking_field.computercraft.fs.name": "파일시스템 작업",
"tracking_field.computercraft.http_download.name": "HTTP 다운로드",
"tracking_field.computercraft.http_upload.name": "HTTP 업로드",

View File

@ -41,9 +41,6 @@
"commands.computercraft.help.synopsis": "Gi hjelp til en spesifikk kommando",
"commands.computercraft.queue.desc": "Send en computer_command hendelse til en kommando datamaskin, sender også tilleggs-argumentene Dette er hovedsakelig designet for kartskapere, og fungerer som en mer datamaskin vennlig versjon av /trigger. Enhver spiller kan kjøre kommandoen, som mest sannsynlig vil bli gjort gjennom en tekst komponent sin klikk hendelse.",
"commands.computercraft.queue.synopsis": "Send en computer_command hendelse til en kommando datamaskin",
"commands.computercraft.reload.desc": "Last inn ComputerCraft sin konfigurasjonsfil på nytt",
"commands.computercraft.reload.done": "Lastet konfigurasjon på nytt",
"commands.computercraft.reload.synopsis": "Last inn ComputerCraft sin konfigurasjonsfil på nytt",
"commands.computercraft.shutdown.desc": "Slå av de oppførte datamaskinene eller alle hvis ingen er spesifisert. Du kan spesifisere datamaskinens forekomst (f. eks 123), datamaskinens id (f. eks #123) eller merkelapp (f.eks \"@Min datamaskin\").",
"commands.computercraft.shutdown.done": "Skrudde av %s/%s datamaskiner",
"commands.computercraft.shutdown.synopsis": "Slå av datamaskiner eksternt.",
@ -73,7 +70,24 @@
"commands.computercraft.view.desc": "Åpner terminalen til en datamaskin, lar deg fjernstyre den. Dette gir deg ikke tilgang til skilpadders inventar. Du kan enten spesifisere datamaskinens forekomst id (f. eks 123) eller datamaskinens id (f. eks #123).",
"commands.computercraft.view.not_player": "Kan kun åpne terminal for spillere",
"commands.computercraft.view.synopsis": "Vis terminal til en datamaskin.",
"gui.computercraft.config.command_require_creative": "Kommando datamaskiner trenger kreativ",
"gui.computercraft.config.http": "HTTP",
"gui.computercraft.config.http.enabled": "Slå på HTTP APIen",
"gui.computercraft.config.http.rules": "Godta/Avslå regler",
"gui.computercraft.config.monitor_distance": "Skjerm distanse",
"gui.computercraft.config.term_sizes": "Terminal størrelser",
"gui.computercraft.config.term_sizes.computer": "Datamaskin",
"gui.computercraft.config.term_sizes.computer.height": "Terminal høyde",
"gui.computercraft.config.term_sizes.computer.width": "Terminal bredde",
"gui.computercraft.config.term_sizes.monitor": "Skjerm",
"gui.computercraft.config.term_sizes.monitor.height": "Maksimum skjerm høyde",
"gui.computercraft.config.term_sizes.monitor.width": "Maksimum skjerm bredde",
"gui.computercraft.config.term_sizes.pocket_computer.height": "Terminal høyde",
"gui.computercraft.config.term_sizes.pocket_computer.width": "Terminal bredde",
"gui.computercraft.config.turtle": "Skilpadde",
"gui.computercraft.config.turtle.need_fuel": "Aktiver drivstoff",
"gui.computercraft.pocket_computer_overlay": "Lommedatamaskin åpen. Trykk ESC for å lukke.",
"gui.computercraft.terminal": "Datamaskin terminal",
"gui.computercraft.tooltip.computer_id": "Datamaskin ID: %s",
"gui.computercraft.tooltip.copy": "Kopier til utklippstavle",
"gui.computercraft.tooltip.disk_id": "Disk ID: %s",
@ -89,6 +103,7 @@
"gui.computercraft.upload.failed.name_too_long": "Fil navnene er for lange til å bli lastet opp.",
"gui.computercraft.upload.failed.too_many_files": "Kan ikke laste opp så mange filer.",
"gui.computercraft.upload.failed.too_much": "Filene dine er for store for å kunne bli lastet opp.",
"gui.computercraft.upload.no_response": "Overfører Filer",
"item.computercraft.disk": "Floppy Disk",
"item.computercraft.pocket_computer_advanced": "Avansert Lomme Datamaskin",
"item.computercraft.pocket_computer_advanced.upgraded": "Avansert %s Lomme Datamaskin",
@ -99,12 +114,14 @@
"item.computercraft.printed_pages": "Printet Sider",
"item.computercraft.treasure_disk": "Floppy Disk",
"itemGroup.computercraft": "ComputerCraft",
"tracking_field.computercraft.coroutines_created.name": "Skapte coroutines",
"tracking_field.computercraft.coroutines_dead.name": "Kastede coroutiner",
"tracking_field.computercraft.computer_tasks.name": "Oppgaver",
"tracking_field.computercraft.count": "%s (antall)",
"tracking_field.computercraft.fs.name": "Filsystem operasjoner",
"tracking_field.computercraft.http_download.name": "HTTP-nedlasting",
"tracking_field.computercraft.http_upload.name": "HTTP-opplasting",
"tracking_field.computercraft.max": "%s (maks)",
"tracking_field.computercraft.peripheral.name": "Perifere kjøringer",
"tracking_field.computercraft.server_tasks.name": "Server oppgaver",
"tracking_field.computercraft.websocket_incoming.name": "Innkommende Websocket",
"tracking_field.computercraft.websocket_outgoing.name": "Utgående Websocket",
"upgrade.computercraft.speaker.adjective": "Høylydt",
@ -115,27 +132,5 @@
"upgrade.minecraft.diamond_hoe.adjective": "Dyrkende",
"upgrade.minecraft.diamond_pickaxe.adjective": "Brytende",
"upgrade.minecraft.diamond_shovel.adjective": "Gravende",
"upgrade.minecraft.diamond_sword.adjective": "Kjempende",
"gui.computercraft.terminal": "Datamaskin terminal",
"gui.computercraft.upload.no_response": "Overfører Filer",
"tracking_field.computercraft.max": "%s (maks)",
"tracking_field.computercraft.count": "%s (antall)",
"tracking_field.computercraft.computer_tasks.name": "Oppgaver",
"tracking_field.computercraft.server_tasks.name": "Server oppgaver",
"gui.computercraft.config.command_require_creative": "Kommando datamaskiner trenger kreativ",
"gui.computercraft.config.http.enabled": "Slå på HTTP APIen",
"gui.computercraft.config.monitor_distance": "Skjerm distanse",
"gui.computercraft.config.term_sizes.computer": "Datamaskin",
"gui.computercraft.config.term_sizes.computer.height": "Terminal høyde",
"gui.computercraft.config.term_sizes.monitor": "Skjerm",
"gui.computercraft.config.term_sizes.monitor.width": "Maksimum skjerm bredde",
"gui.computercraft.config.term_sizes.pocket_computer.height": "Terminal høyde",
"gui.computercraft.config.term_sizes.pocket_computer.width": "Terminal bredde",
"gui.computercraft.config.turtle": "Skilpadde",
"gui.computercraft.config.term_sizes.computer.width": "Terminal bredde",
"gui.computercraft.config.turtle.need_fuel": "Aktiver drivstoff",
"gui.computercraft.config.http": "HTTP",
"gui.computercraft.config.http.rules": "Godta/Avslå regler",
"gui.computercraft.config.term_sizes": "Terminal størrelser",
"gui.computercraft.config.term_sizes.monitor.height": "Maksimum skjerm høyde"
"upgrade.minecraft.diamond_sword.adjective": "Kjempende"
}

View File

@ -41,9 +41,6 @@
"commands.computercraft.help.synopsis": "Biedt hulp voor een specifiek commando",
"commands.computercraft.queue.desc": "Verzend een computer_commando event naar een commandocomputer. Additionele argumenten worden doorgegeven. Dit is vooral bedoeld voor mapmakers. Het doet dienst als een computer-vriendelijke versie van /trigger. Elke speler kan het commando uitvoeren, wat meestal gedaan zal worden door een text-component klik-event.",
"commands.computercraft.queue.synopsis": "Verzend een computer_command event naar een commandocomputer",
"commands.computercraft.reload.desc": "Herlaad het ComputerCraft configuratiebestand",
"commands.computercraft.reload.done": "Configuratie herladen",
"commands.computercraft.reload.synopsis": "Herlaad het ComputerCraft configuratiebestand",
"commands.computercraft.shutdown.desc": "Sluit alle genoemde computers af, of geen enkele wanneer niet gespecificeerd. Je kunt een instance-id (bijv. 123), computer-id (bijv. #123) of computer-label (bijv. \\\"@Mijn Computer\\\") opgeven.",
"commands.computercraft.shutdown.done": "%s/%s computers afgesloten",
"commands.computercraft.shutdown.synopsis": "Sluit computers af op afstand.",
@ -97,8 +94,6 @@
"item.computercraft.printed_pages": "Geprinte Pagina's",
"item.computercraft.treasure_disk": "Diskette",
"itemGroup.computercraft": "ComputerCraft",
"tracking_field.computercraft.coroutines_created.name": "Coroutines gecreëerd",
"tracking_field.computercraft.coroutines_dead.name": "Coroutines verwijderd",
"tracking_field.computercraft.fs.name": "Restandssysteem operaties",
"tracking_field.computercraft.http_download.name": "HTTP download",
"tracking_field.computercraft.http_upload.name": "HTTP upload",

View File

@ -1,4 +1,5 @@
{
"argument.computercraft.argument_expected": "Argument oczekiwany",
"block.computercraft.cable": "Kabel Sieciowy",
"block.computercraft.computer_advanced": "Zaawansowany Komputer",
"block.computercraft.computer_command": "Komputer Komendowy",
@ -16,7 +17,11 @@
"commands.computercraft.desc": "Komenda /computercraft dostarcza wiele narzędzi do zarządzania, kontrolowania i administrowania komputerami.",
"commands.computercraft.dump.action": "Wyświetl więcej informacji o tym komputerze",
"commands.computercraft.dump.desc": "Wyświetla status wszystkich komputerów lub informacje o jednym komputerze. Możesz wybrać numer sesji komputera (np. 123), ID komputera (np. #123) lub jego etykietę (np. \"@Mój Komputer\").",
"commands.computercraft.dump.open_path": "Przeglądaj pliki tego komputera",
"commands.computercraft.dump.synopsis": "Wyświetl stan komputerów.",
"commands.computercraft.generic.no_position": "<brak pozycji>",
"commands.computercraft.generic.position": "%s, %s, %s",
"commands.computercraft.generic.yes": "T",
"commands.computercraft.help.no_children": "%s nie ma pod-komend",
"commands.computercraft.help.no_command": "Nie odnaleziono komendy '%s'",
"commands.computercraft.help.synopsis": "Uzyskaj pomoc do konkretnej komendy",
@ -26,7 +31,9 @@
"commands.computercraft.synopsis": "Różne komendy do kontrolowania komputerami.",
"commands.computercraft.tp.action": "Przeteleportuj się do podanego komputera",
"commands.computercraft.tp.desc": "Przeteleportuj się do lokalizacji komputera. Możesz wybrać numer sesji komputera (np. 123) lub ID komputera (np. #123).",
"commands.computercraft.tp.not_there": "Nie można zlokalizować komputera w świecie",
"commands.computercraft.tp.synopsis": "Przeteleportuj się do podanego komputera.",
"commands.computercraft.track.dump.computer": "Komputer",
"commands.computercraft.turn_on.desc": "Włącz podane komputery. Możesz wybrać numer sesji komputera (np. 123), ID komputera (np. #123) lub jego etykietę (np. \"@Mój Komputer\").",
"commands.computercraft.turn_on.done": "Włączono %s z %s komputerów",
"commands.computercraft.turn_on.synopsis": "Zdalnie włącz komputery.",

View File

@ -41,9 +41,6 @@
"commands.computercraft.help.synopsis": "Предоставляет помощь для конкретных команд",
"commands.computercraft.queue.desc": "Отправить событие computer_command к Командному компьютеру, проходящий через дополнительные аргументы. В основном это предназначено для Картоделов, действует как более удобная для пользователя компьютерная версия /trigger. Любой игрок сможет запустить команду, которая, по всей вероятности, будет сделана через события щелчка текстового компонента.",
"commands.computercraft.queue.synopsis": "Отправить событие computer_command к Командному компьютеру",
"commands.computercraft.reload.desc": "Перезагружает файл конфигурации ComputerCraft'a",
"commands.computercraft.reload.done": "Конфигурация перезагружена",
"commands.computercraft.reload.synopsis": "Перезагрузить файл конфигурации ComputerCraft'a",
"commands.computercraft.shutdown.desc": "Завершить работу перечисленных компьютеров или все, если ни один не указан. Ты можешь указать идентификатор экземпляра компьютера (например 123), идентификатор компьютера (например #123) или метку (например \"@Мой компьютер\").",
"commands.computercraft.shutdown.done": "У %s/%s компьютеров завершена работа",
"commands.computercraft.shutdown.synopsis": "Удалённо завершить работу компьютеров.",
@ -73,6 +70,78 @@
"commands.computercraft.view.desc": "Открыть терминал компьютера, позволяющий удалённо управлять компьютером. Это не предоставляет доступ к инвентарям черепашек. Ты можешь указать либо идентификатор экземпляра компьютера (например 123) либо идентификатор компьютера (например #123).",
"commands.computercraft.view.not_player": "Нельзя открыть терминал для не-игрока",
"commands.computercraft.view.synopsis": "Просмотреть терминал компьютера.",
"gui.computercraft.config.command_require_creative": "Для использования командных компьютеров нужен творческий режим",
"gui.computercraft.config.command_require_creative.tooltip": "Требовать творческий режим и права оператора для взаимодействия с\nкомандными компьютерами. Это поведение по умолчанию для Командных блоков ванильной игры.",
"gui.computercraft.config.computer_space_limit": "Лимит места на компьютерах (в байтах)",
"gui.computercraft.config.computer_space_limit.tooltip": "Лимит места на дисках компьютеров и черепашек, в байтах.",
"gui.computercraft.config.default_computer_settings": "Настройки Компьютера по умолчанию",
"gui.computercraft.config.default_computer_settings.tooltip": "Разделенный запятыми список системных настроек по умолчанию на новых компьютерах.\nНапример: \"shell.autocomplete=false,lua.autocomplete=false,edit.autocomplete=false\"\nотключит всё автодополнение.",
"gui.computercraft.config.disable_lua51_features": "Отключить функции Lua 5.1",
"gui.computercraft.config.disable_lua51_features.tooltip": "Поставьте, чтобы отключить функции из Lua 5.1, которые будут убраны в будущих\nобновлениях. Полезно для того, чтобы улучшить совместимость вперед ваших программ.",
"gui.computercraft.config.execution": "Выполнение",
"gui.computercraft.config.execution.computer_threads": "Потоки компьютера",
"gui.computercraft.config.execution.computer_threads.tooltip": "Устанавливает количество потоков, на которых работают компьютеры. Большее число\nозначает, что больше компьютеров сможет работать одновременно, но может привести к лагу.\nОбратите внимание, что некоторые моды могут не работать с более чем одним потоком. Используйте с осторожностью.\nОграничение: > 1",
"gui.computercraft.config.execution.max_main_computer_time.tooltip": "Идеальный максимум времени, которое отведено компьютеру на выполнение задач, в миллисекундах.\nМы вполне возможно выйдем за этот лимит, так как невозможно предсказать сколько\nвремени будет затрачено на выполнение задач, это лишь верхний лимит среднего значения времени.\nОграничение: > 1",
"gui.computercraft.config.execution.max_main_global_time": "Глобальный лимит времени на тик сервера",
"gui.computercraft.config.execution.max_main_global_time.tooltip": "Максимум времени, которое может быть потрачено на выполнение задач за один тик, в \nмиллисекундах. \nМы вполне возможно выйдем за этот лимит, так как невозможно предсказать сколько\nвремени будет затрачено на выполнение задач, это лишь верхний лимит среднего значения времени.\nОграничение: > 1",
"gui.computercraft.config.execution.tooltip": "Контролирует поведение выполнения задач компьютеров. Эта настройка преднезначается для \nтонкой настройки серверов, и в основном не должна быть изменена.",
"gui.computercraft.config.floppy_space_limit": "Лимит места на дискетах (байты)",
"gui.computercraft.config.floppy_space_limit.tooltip": "Лимит места для хранения информации на дискетах, в байтах.",
"gui.computercraft.config.http": "HTTP",
"gui.computercraft.config.http.bandwidth": "Пропускная способность",
"gui.computercraft.config.http.bandwidth.global_download": "Глобальный лимит на скачивание",
"gui.computercraft.config.http.bandwidth.global_download.tooltip": "Количество байтов, которое можно скачать за секунду. Все компьютеры делят эту пропускную способность. (байты в секунду)\nОграничение: > 1",
"gui.computercraft.config.http.bandwidth.global_upload": "Глобальный лимит загрузки",
"gui.computercraft.config.http.bandwidth.global_upload.tooltip": "Количество байтов, которое можно загрузить за секунду. Все компьютеры делят эту пропускную способность. (байты в секунду)\nОграничение: > 1",
"gui.computercraft.config.http.bandwidth.tooltip": "Ограничивает пропускную способность, используемую компьютерами.",
"gui.computercraft.config.http.enabled": "Включить HTTP API",
"gui.computercraft.config.http.enabled.tooltip": "Включить API \"http\" на Компьютерах. Это также отключает программы \"pastebin\" и \"wget\", \nкоторые нужны многим пользователям. Рекомендуется оставить это включенным и использовать \nконфиг \"rules\" для более тонкой настройки.",
"gui.computercraft.config.http.max_requests": "Максимум одновременных запросов",
"gui.computercraft.config.http.max_requests.tooltip": "Количество http-запросов, которые компьютер может сделать одновременно. Дополнительные запросы \nбудут поставлены в очередь, и отправлены когда существующие запросы будут выполнены. Установите на 0 для \nнеограниченных запросов.\nОграничение: > 0",
"gui.computercraft.config.http.max_websockets": "Максимум одновременных веб-сокетов",
"gui.computercraft.config.http.max_websockets.tooltip": "Количество одновременно открытых веб-сокетов, которые может иметь компьютер. Установите на 0 для неограниченных веб-сокетов.\nОграничение: > 1",
"gui.computercraft.config.http.proxy": "Proxy",
"gui.computercraft.config.http.proxy.host": "Имя хоста",
"gui.computercraft.config.http.proxy.host.tooltip": "Имя хоста или IP-адрес прокси-сервера.",
"gui.computercraft.config.http.proxy.port": "Порт",
"gui.computercraft.config.http.proxy.port.tooltip": "Порт прокси-сервера.\nДиапазон: 1 ~ 65536",
"gui.computercraft.config.http.proxy.tooltip": "Туннелирует HTTP-запросы и запросы websocket через прокси-сервер. Влияет только на HTTP\nправила с параметром \"use_proxy\" в значении true (отключено по умолчанию).\nЕсли для прокси-сервера требуется аутентификация, создайте \"computercraft-proxy.pw\"\nфайл в том же каталоге, что и \"computercraft-server.toml\", содержащий имя\nпользователя и пароль, разделенные двоеточием, например \"myuser:mypassword\". Для\nпрокси-серверов SOCKS4 требуется только имя пользователя.",
"gui.computercraft.config.http.proxy.type": "Тип прокси-сервера",
"gui.computercraft.config.http.proxy.type.tooltip": "Тип используемого прокси-сервера.\nДопустимые значения: HTTP, HTTPS, SOCKS4, SOCKS5",
"gui.computercraft.config.http.rules": "Разрешающие/запрещающие правила",
"gui.computercraft.config.http.rules.tooltip": "Список правил, которые контролируют поведение «http» API для определенных доменов или\nIP-адресов. Каждое правило представляет собой элемент с «узлом» для сопоставления и набором\nсвойств. Правила оцениваются по порядку, то есть более ранние правила перевешивают\nболее поздние.\nХост может быть доменным именем (\"pastebin.com\"), wildcard-сертификатом (\"*.pastebin.com\") или\nнотацией CIDR (\"127.0.0.0/8\").\nЕсли правил нет, домен блокируется.",
"gui.computercraft.config.http.websocket_enabled": "Включить веб-сокеты",
"gui.computercraft.config.http.websocket_enabled.tooltip": "Включить использование http веб-сокетов. Для этого необходимо, чтобы параметр «http_enable» был true.",
"gui.computercraft.config.log_computer_errors": "Регистрировать ошибки компьютера",
"gui.computercraft.config.log_computer_errors.tooltip": "Регистрировать исключения, вызванные периферийными устройствами и другими объектами Lua. Это облегчает\nдля авторам модов устранение проблем, но может привести к спаму в логах, если люди будут использовать\nглючные методы.",
"gui.computercraft.config.maximum_open_files": "Максимальное количество файлов, открытых на одном компьютере",
"gui.computercraft.config.term_sizes": "Размер терминала",
"gui.computercraft.config.term_sizes.computer": "Компьютер",
"gui.computercraft.config.term_sizes.computer.height": "Высота терминала",
"gui.computercraft.config.term_sizes.computer.height.tooltip": "Ограничение: 1 ~ 255",
"gui.computercraft.config.term_sizes.computer.tooltip": "Размер терминала на компьютерах.",
"gui.computercraft.config.term_sizes.computer.width": "Ширина терминала",
"gui.computercraft.config.term_sizes.computer.width.tooltip": "Ограничение: 1 ~ 255",
"gui.computercraft.config.term_sizes.monitor": "Монитор",
"gui.computercraft.config.term_sizes.monitor.height": "Максимальная высота монитора",
"gui.computercraft.config.term_sizes.monitor.height.tooltip": "Ограничение: 1 ~ 32",
"gui.computercraft.config.term_sizes.monitor.tooltip": "Максимальный размер мониторов (в блоках).",
"gui.computercraft.config.term_sizes.monitor.width": "Максимальная ширина мониторов",
"gui.computercraft.config.term_sizes.monitor.width.tooltip": "Ограничение: 1 ~ 32",
"gui.computercraft.config.term_sizes.pocket_computer.height": "Высота терминала",
"gui.computercraft.config.term_sizes.pocket_computer.height.tooltip": "Ограничение: 1 ~ 255",
"gui.computercraft.config.term_sizes.pocket_computer.width": "Ширина терминала",
"gui.computercraft.config.term_sizes.pocket_computer.width.tooltip": "Ограничение: 1 ~ 255",
"gui.computercraft.config.turtle": "Черепашки",
"gui.computercraft.config.turtle.advanced_fuel_limit": "Лимит топлива Продвинутых Черепашек",
"gui.computercraft.config.turtle.advanced_fuel_limit.tooltip": "Лимит топлива для Продвинутых Черепашек.\nОграничение: > 0",
"gui.computercraft.config.turtle.need_fuel": "Включить механику топлива",
"gui.computercraft.config.turtle.need_fuel.tooltip": "Устанавливает, нуждаются ли Черепашки в топливе для передвижения.",
"gui.computercraft.config.turtle.normal_fuel_limit": "Лимит топлива Черепашек",
"gui.computercraft.config.turtle.normal_fuel_limit.tooltip": "Лимит топлива для Черепашек.\nОграничение: > 0",
"gui.computercraft.config.turtle.tooltip": "Разные настройки, связанные с черепашками.",
"gui.computercraft.pocket_computer_overlay": "Карманный компьютер открыт. Чтобы закрыть, нажми ESC.",
"gui.computercraft.terminal": "Компьютерный терминал",
"gui.computercraft.tooltip.computer_id": "Идентификатор компьютера: %s",
"gui.computercraft.tooltip.copy": "Скопировано в Буфер обмена",
"gui.computercraft.tooltip.disk_id": "Идентификатор диска: %s",
@ -88,6 +157,8 @@
"gui.computercraft.upload.failed.name_too_long": "Названия файлов слишком длинны для загрузки.",
"gui.computercraft.upload.failed.too_many_files": "Нельзя загрузить столько файлов.",
"gui.computercraft.upload.failed.too_much": "Твои файлы слишком большие для загрузки.",
"gui.computercraft.upload.no_response": "Перенос файлов",
"gui.computercraft.upload.no_response.msg": "Ваш компьютер не использовал переданные вами файлы. Возможно, вам потребуется запустить программу %s и повторить попытку.",
"item.computercraft.disk": "Дискета",
"item.computercraft.pocket_computer_advanced": "Продвинутый карманный компьютер",
"item.computercraft.pocket_computer_advanced.upgraded": "Продвинутый %s карманный компьютер",
@ -98,12 +169,17 @@
"item.computercraft.printed_pages": "Напечатанные страницы",
"item.computercraft.treasure_disk": "Дискета",
"itemGroup.computercraft": "ComputerCraft",
"tracking_field.computercraft.coroutines_created.name": "Сопрограмма создана",
"tracking_field.computercraft.coroutines_dead.name": "Сопрограмма удалена",
"tracking_field.computercraft.avg": "%s (среднее)",
"tracking_field.computercraft.computer_tasks.name": "Задачи",
"tracking_field.computercraft.count": "%s (количество)",
"tracking_field.computercraft.fs.name": "Операции с файловой системой",
"tracking_field.computercraft.http_download.name": "HTTP скачивания",
"tracking_field.computercraft.http_requests.name": "HTTP запросы",
"tracking_field.computercraft.http_upload.name": "HTTP загрузки",
"tracking_field.computercraft.max": "%s (максимальное)",
"tracking_field.computercraft.peripheral.name": "Вызовы периферийных устройств",
"tracking_field.computercraft.server_tasks.name": "Серверные задачи",
"tracking_field.computercraft.turtle_ops.name": "Операции Черепашек",
"tracking_field.computercraft.websocket_incoming.name": "Входящий Websocket",
"tracking_field.computercraft.websocket_outgoing.name": "Исходящий Websocket",
"upgrade.computercraft.speaker.adjective": "Шумящий",
@ -114,86 +190,5 @@
"upgrade.minecraft.diamond_hoe.adjective": "Возделывающая",
"upgrade.minecraft.diamond_pickaxe.adjective": "Добывающая",
"upgrade.minecraft.diamond_shovel.adjective": "Копающая",
"upgrade.minecraft.diamond_sword.adjective": "Боевая",
"gui.computercraft.pocket_computer_overlay": "Карманный компьютер открыт. Чтобы закрыть, нажми ESC.",
"gui.computercraft.config.command_require_creative.tooltip": "Требовать творческий режим и права оператора для взаимодействия с\nкомандными компьютерами. Это поведение по умолчанию для Командных блоков ванильной игры.",
"gui.computercraft.config.default_computer_settings.tooltip": "Разделенный запятыми список системных настроек по умолчанию на новых компьютерах.\nНапример: \"shell.autocomplete=false,lua.autocomplete=false,edit.autocomplete=false\"\nотключит всё автодополнение.",
"gui.computercraft.config.execution.computer_threads.tooltip": "Устанавливает количество потоков, на которых работают компьютеры. Большее число\nозначает, что больше компьютеров сможет работать одновременно, но может привести к лагу.\nОбратите внимание, что некоторые моды могут не работать с более чем одним потоком. Используйте с осторожностью.\nОграничение: > 1",
"gui.computercraft.config.execution.max_main_computer_time.tooltip": "Идеальный максимум времени, которое отведено компьютеру на выполнение задач, в миллисекундах.\nМы вполне возможно выйдем за этот лимит, так как невозможно предсказать сколько\nвремени будет затрачено на выполнение задач, это лишь верхний лимит среднего значения времени.\nОграничение: > 1",
"gui.computercraft.config.execution.max_main_global_time.tooltip": "Максимум времени, которое может быть потрачено на выполнение задач за один тик, в \nмиллисекундах. \nМы вполне возможно выйдем за этот лимит, так как невозможно предсказать сколько\nвремени будет затрачено на выполнение задач, это лишь верхний лимит среднего значения времени.\nОграничение: > 1",
"gui.computercraft.config.http.bandwidth.global_download": "Глобальный лимит на скачивание",
"gui.computercraft.config.http.bandwidth.global_download.tooltip": "Количество байтов, которое можно скачать за секунду. Все компьютеры делят эту пропускную способность. (байты в секунду)\nОграничение: > 1",
"gui.computercraft.config.http.bandwidth.global_upload.tooltip": "Количество байтов, которое можно загрузить за секунду. Все компьютеры делят эту пропускную способность. (байты в секунду)\nОграничение: > 1",
"tracking_field.computercraft.http_requests.name": "HTTP запросы",
"tracking_field.computercraft.turtle_ops.name": "Операции Черепашек",
"gui.computercraft.config.http.enabled.tooltip": "Включить API \"http\" на Компьютерах. Это также отключает программы \"pastebin\" и \"wget\", \nкоторые нужны многим пользователям. Рекомендуется оставить это включенным и использовать \nконфиг \"rules\" для более тонкой настройки.",
"gui.computercraft.config.http.max_websockets.tooltip": "Количество одновременно открытых веб-сокетов, которые может иметь компьютер. Установите на 0 для неограниченных веб-сокетов.\nОграничение: > 1",
"gui.computercraft.config.term_sizes": "Размер терминала",
"gui.computercraft.config.term_sizes.computer.height": "Высота терминала",
"gui.computercraft.config.term_sizes.monitor.height": "Максимальная высота монитора",
"gui.computercraft.config.term_sizes.monitor.width.tooltip": "Ограничение: 1 ~ 32",
"gui.computercraft.config.turtle.advanced_fuel_limit": "Лимит топлива Продвинутых Черепашек",
"gui.computercraft.config.turtle.need_fuel.tooltip": "Устанавливает, нуждаются ли Черепашки в топливе для передвижения.",
"gui.computercraft.terminal": "Компьютерный терминал",
"tracking_field.computercraft.computer_tasks.name": "Задачи",
"tracking_field.computercraft.server_tasks.name": "Серверные задачи",
"gui.computercraft.upload.no_response": "Перенос файлов",
"tracking_field.computercraft.avg": "%s (среднее)",
"gui.computercraft.config.command_require_creative": "Для использования командных компьютеров нужен творческий режим",
"gui.computercraft.config.computer_space_limit": "Лимит места на компьютерах (в байтах)",
"gui.computercraft.config.computer_space_limit.tooltip": "Лимит места на дисках компьютеров и черепашек, в байтах.",
"gui.computercraft.config.default_computer_settings": "Настройки Компьютера по умолчанию",
"gui.computercraft.config.disable_lua51_features": "Отключить функции Lua 5.1",
"gui.computercraft.config.disable_lua51_features.tooltip": "Поставьте, чтобы отключить функции из Lua 5.1, которые будут убраны в будущих\nобновлениях. Полезно для того, чтобы улучшить совместимость вперед ваших программ.",
"gui.computercraft.config.execution": "Выполнение",
"gui.computercraft.config.execution.computer_threads": "Потоки компьютера",
"gui.computercraft.config.execution.max_main_global_time": "Глобальный лимит времени на тик сервера",
"gui.computercraft.config.execution.tooltip": "Контролирует поведение выполнения задач компьютеров. Эта настройка преднезначается для \nтонкой настройки серверов, и в основном не должна быть изменена.",
"gui.computercraft.config.floppy_space_limit": "Лимит места на дискетах (байты)",
"gui.computercraft.config.floppy_space_limit.tooltip": "Лимит места для хранения информации на дискетах, в байтах.",
"gui.computercraft.config.http": "HTTP",
"gui.computercraft.config.http.bandwidth": "Пропускная способность",
"gui.computercraft.config.http.bandwidth.global_upload": "Глобальный лимит загрузки",
"gui.computercraft.config.http.bandwidth.tooltip": "Ограничивает пропускную способность, используемую компьютерами.",
"gui.computercraft.config.http.enabled": "Включить HTTP API",
"gui.computercraft.config.http.max_requests": "Максимум одновременных запросов",
"gui.computercraft.config.http.max_requests.tooltip": "Количество http-запросов, которые компьютер может сделать одновременно. Дополнительные запросы \nбудут поставлены в очередь, и отправлены когда существующие запросы будут выполнены. Установите на 0 для \nнеограниченных запросов.\nОграничение: > 0",
"gui.computercraft.config.http.max_websockets": "Максимум одновременных веб-сокетов",
"gui.computercraft.config.term_sizes.computer": "Компьютер",
"gui.computercraft.config.term_sizes.computer.height.tooltip": "Ограничение: 1 ~ 255",
"gui.computercraft.config.term_sizes.computer.tooltip": "Размер терминала на компьютерах.",
"gui.computercraft.config.term_sizes.computer.width": "Ширина терминала",
"gui.computercraft.config.term_sizes.computer.width.tooltip": "Ограничение: 1 ~ 255",
"gui.computercraft.config.term_sizes.monitor": "Монитор",
"gui.computercraft.config.term_sizes.monitor.height.tooltip": "Ограничение: 1 ~ 32",
"gui.computercraft.config.term_sizes.monitor.tooltip": "Максимальный размер мониторов (в блоках).",
"gui.computercraft.config.term_sizes.monitor.width": "Максимальная ширина мониторов",
"gui.computercraft.config.term_sizes.pocket_computer.height": "Высота терминала",
"gui.computercraft.config.term_sizes.pocket_computer.height.tooltip": "Ограничение: 1 ~ 255",
"gui.computercraft.config.term_sizes.pocket_computer.width": "Ширина терминала",
"gui.computercraft.config.term_sizes.pocket_computer.width.tooltip": "Ограничение: 1 ~ 255",
"gui.computercraft.config.turtle": "Черепашки",
"gui.computercraft.config.turtle.advanced_fuel_limit.tooltip": "Лимит топлива для Продвинутых Черепашек.\nОграничение: > 0",
"gui.computercraft.config.turtle.need_fuel": "Включить механику топлива",
"gui.computercraft.config.turtle.normal_fuel_limit": "Лимит топлива Черепашек",
"gui.computercraft.config.turtle.normal_fuel_limit.tooltip": "Лимит топлива для Черепашек.\nОграничение: > 0",
"gui.computercraft.config.turtle.tooltip": "Разные настройки, связанные с черепашками.",
"gui.computercraft.config.http.proxy.port": "Порт",
"gui.computercraft.config.http.proxy.port.tooltip": "Порт прокси-сервера.\nДиапазон: 1 ~ 65536",
"gui.computercraft.config.http.proxy.host": "Имя хоста",
"gui.computercraft.config.http.proxy": "Proxy",
"gui.computercraft.config.http.proxy.host.tooltip": "Имя хоста или IP-адрес прокси-сервера.",
"gui.computercraft.config.http.proxy.tooltip": "Туннелирует HTTP-запросы и запросы websocket через прокси-сервер. Влияет только на HTTP\nправила с параметром \"use_proxy\" в значении true (отключено по умолчанию).\nЕсли для прокси-сервера требуется аутентификация, создайте \"computercraft-proxy.pw\"\nфайл в том же каталоге, что и \"computercraft-server.toml\", содержащий имя\nпользователя и пароль, разделенные двоеточием, например \"myuser:mypassword\". Для\nпрокси-серверов SOCKS4 требуется только имя пользователя.",
"gui.computercraft.config.http.proxy.type": "Тип прокси-сервера",
"gui.computercraft.config.http.proxy.type.tooltip": "Тип используемого прокси-сервера.\nДопустимые значения: HTTP, HTTPS, SOCKS4, SOCKS5",
"gui.computercraft.upload.no_response.msg": "Ваш компьютер не использовал переданные вами файлы. Возможно, вам потребуется запустить программу %s и повторить попытку.",
"tracking_field.computercraft.max": "%s (максимальное)",
"tracking_field.computercraft.count": "%s (количество)",
"gui.computercraft.config.http.rules": "Разрешающие/запрещающие правила",
"gui.computercraft.config.http.websocket_enabled": "Включить веб-сокеты",
"gui.computercraft.config.http.websocket_enabled.tooltip": "Включить использование http веб-сокетов. Для этого необходимо, чтобы параметр «http_enable» был true.",
"gui.computercraft.config.log_computer_errors": "Регистрировать ошибки компьютера",
"gui.computercraft.config.log_computer_errors.tooltip": "Регистрировать исключения, вызванные периферийными устройствами и другими объектами Lua. Это облегчает\nдля авторам модов устранение проблем, но может привести к спаму в логах, если люди будут использовать\nглючные методы.",
"gui.computercraft.config.maximum_open_files": "Максимальное количество файлов, открытых на одном компьютере",
"gui.computercraft.config.http.rules.tooltip": "Список правил, которые контролируют поведение «http» API для определенных доменов или\nIP-адресов. Каждое правило представляет собой элемент с «узлом» для сопоставления и набором\nсвойств. Правила оцениваются по порядку, то есть более ранние правила перевешивают\nболее поздние.\nХост может быть доменным именем (\"pastebin.com\"), wildcard-сертификатом (\"*.pastebin.com\") или\nнотацией CIDR (\"127.0.0.0/8\").\nЕсли правил нет, домен блокируется."
"upgrade.minecraft.diamond_sword.adjective": "Боевая"
}

View File

@ -27,6 +27,7 @@
"commands.computercraft.desc": "/computercraft kommandot tillhandahåller olika felsöknings- och administrationsverktyg för att kontrollera och interagera med datorer.",
"commands.computercraft.dump.action": "Visa mer information om den här datorn",
"commands.computercraft.dump.desc": "Visa status för alla datorer eller specifik information för en dator. Du kan ange en dators instans-id (t.ex. 123), dator-id (t.ex. #123) eller etikett (t.ex. \"@Min dator\").",
"commands.computercraft.dump.open_path": "Visa den här datorns filer",
"commands.computercraft.dump.synopsis": "Visa status för datorer.",
"commands.computercraft.generic.additional_rows": "%d ytterligare rader…",
"commands.computercraft.generic.exception": "Ohanterat felfall (%s)",
@ -40,9 +41,6 @@
"commands.computercraft.help.synopsis": "Tillhandahåll hjälp för ett specifikt kommando",
"commands.computercraft.queue.desc": "Skicka ett computer_command event till en kommandodator, skicka vidare ytterligare argument. Detta är mestadels utformat för kartmarkörer som fungerar som en mer datorvänlig version av /trigger. Alla spelare kan köra kommandot, vilket sannolikt skulle göras genom en textkomponents klick-event.",
"commands.computercraft.queue.synopsis": "Skicka ett computer_command event till en kommandodator",
"commands.computercraft.reload.desc": "Ladda om ComputerCrafts konfigurationsfil",
"commands.computercraft.reload.done": "Konfiguration omladdad",
"commands.computercraft.reload.synopsis": "Ladda om ComputerCrafts konfigurationsfil",
"commands.computercraft.shutdown.desc": "Stäng av de listade datorerna eller alla om ingen anges. Du kan ange en dators instans-id (t.ex. 123), dator-id (t.ex. #123) eller etikett (t.ex. \"@Min dator\").",
"commands.computercraft.shutdown.done": "Stängde av %s/%s datorer",
"commands.computercraft.shutdown.synopsis": "Stäng av datorer på distans.",
@ -96,9 +94,22 @@
"gui.computercraft.config.turtle.can_push": "Turtles kan putta entiteter",
"gui.computercraft.config.turtle.need_fuel": "Aktivera bränsle",
"gui.computercraft.config.turtle.normal_fuel_limit": "Turtle bränslegräns",
"gui.computercraft.pocket_computer_overlay": "Fickdator öppen. Tryck ESC för att stänga.",
"gui.computercraft.tooltip.computer_id": "Dator-ID: %s",
"gui.computercraft.tooltip.copy": "Kopiera till urklipp",
"gui.computercraft.tooltip.disk_id": "Diskett-ID: %s",
"gui.computercraft.tooltip.terminate": "Stoppa aktuellt körande kod",
"gui.computercraft.tooltip.terminate.key": "Håll ned Ctrl+T",
"gui.computercraft.tooltip.turn_off": "Stäng av den här datorn",
"gui.computercraft.tooltip.turn_off.key": "Håll ned Ctrl+S",
"gui.computercraft.tooltip.turn_on": "Slå på den här datorn",
"gui.computercraft.upload.failed": "Uppladdning misslyckad",
"gui.computercraft.upload.failed.computer_off": "Du måste slå på datorn innan du kan ladda upp filer.",
"gui.computercraft.upload.failed.corrupted": "Några filer skadades vid uppladdningen. Vänligen försök igen.",
"gui.computercraft.upload.failed.generic": "Filuppladdningen misslyckades (%s)",
"gui.computercraft.upload.failed.name_too_long": "Filnamnen är för långa för att laddas upp.",
"gui.computercraft.upload.failed.too_many_files": "Det går inte ladda upp så här många filer.",
"gui.computercraft.upload.failed.too_much": "Dina filer är för stora för att laddas upp.",
"item.computercraft.disk": "Diskett",
"item.computercraft.pocket_computer_advanced": "Avancerad Fickdator",
"item.computercraft.pocket_computer_advanced.upgraded": "Avancerad %s Fickdator",
@ -109,8 +120,6 @@
"item.computercraft.printed_pages": "Utskrivna Sidor",
"item.computercraft.treasure_disk": "Diskett",
"itemGroup.computercraft": "ComputerCraft",
"tracking_field.computercraft.coroutines_created.name": "Coroutines skapade",
"tracking_field.computercraft.coroutines_dead.name": "Coroutines borttagna",
"tracking_field.computercraft.fs.name": "Filsystemoperationer",
"tracking_field.computercraft.http_download.name": "HTTP-nedladdning",
"tracking_field.computercraft.http_upload.name": "HTTP-uppladdning",
@ -125,19 +134,5 @@
"upgrade.minecraft.diamond_hoe.adjective": "Odlande",
"upgrade.minecraft.diamond_pickaxe.adjective": "Brytande",
"upgrade.minecraft.diamond_shovel.adjective": "Grävande",
"upgrade.minecraft.diamond_sword.adjective": "Närstridande",
"gui.computercraft.tooltip.turn_on": "Slå på den här datorn",
"commands.computercraft.dump.open_path": "Visa den här datorns filer",
"gui.computercraft.tooltip.terminate": "Stoppa aktuellt körande kod",
"gui.computercraft.tooltip.terminate.key": "Håll ned Ctrl+T",
"gui.computercraft.tooltip.turn_off": "Stäng av den här datorn",
"gui.computercraft.tooltip.turn_off.key": "Håll ned Ctrl+S",
"gui.computercraft.upload.failed": "Uppladdning misslyckad",
"gui.computercraft.upload.failed.computer_off": "Du måste slå på datorn innan du kan ladda upp filer.",
"gui.computercraft.upload.failed.too_much": "Dina filer är för stora för att laddas upp.",
"gui.computercraft.upload.failed.corrupted": "Några filer skadades vid uppladdningen. Vänligen försök igen.",
"gui.computercraft.upload.failed.generic": "Filuppladdningen misslyckades (%s)",
"gui.computercraft.upload.failed.name_too_long": "Filnamnen är för långa för att laddas upp.",
"gui.computercraft.upload.failed.too_many_files": "Det går inte ladda upp så här många filer.",
"gui.computercraft.pocket_computer_overlay": "Fickdator öppen. Tryck ESC för att stänga."
"upgrade.minecraft.diamond_sword.adjective": "Närstridande"
}

View File

@ -1,128 +1,123 @@
{
"block.computercraft.disk_drive": "tomo pi lipu sona",
"block.computercraft.printer": "ilo sitelen",
"block.computercraft.monitor_normal": "ilo lukin",
"block.computercraft.monitor_advanced": "ilo lukin wawa",
"block.computercraft.speaker": "ilo kalama",
"commands.computercraft.generic.exception": "pakala awen ala (%s)",
"block.computercraft.computer_command": "ilo sona pi toki wawa",
"block.computercraft.turtle_advanced": "ilo sona pali wawa",
"block.computercraft.turtle_normal": "ilo sona pali",
"block.computercraft.computer_advanced": "ilo sona wawa",
"block.computercraft.computer_normal": "ilo sona",
"argument.computercraft.argument_expected": "mi wile e ijo",
"argument.computercraft.computer.many_matching": "mi alasa e ilo sona mute pi nimi '%s' (ijo %s)",
"argument.computercraft.computer.no_matching": "mi ken ala alasa e ilo sona pi nimi '%s'",
"argument.computercraft.tracking_field.no_field": "mi sona ala e nimi '%s'",
"block.computercraft.cable": "linja toki",
"block.computercraft.computer_advanced": "ilo sona wawa",
"block.computercraft.computer_command": "ilo sona pi toki wawa",
"block.computercraft.computer_normal": "ilo sona",
"block.computercraft.disk_drive": "tomo pi lipu sona",
"block.computercraft.monitor_advanced": "ilo lukin wawa",
"block.computercraft.monitor_normal": "ilo lukin",
"block.computercraft.printer": "ilo sitelen",
"block.computercraft.speaker": "ilo kalama",
"block.computercraft.turtle_advanced": "ilo sona pali wawa",
"block.computercraft.turtle_advanced.upgraded": "ilo sona pali wawa (%s)",
"block.computercraft.turtle_advanced.upgraded_twice": "ilo sona pali wawa (%s, %s)",
"block.computercraft.turtle_normal": "ilo sona pali",
"block.computercraft.turtle_normal.upgraded": "ilo sona pali (%s)",
"commands.computercraft.dump.action": "o lukin e sona mute pi ilo sona ni",
"commands.computercraft.generic.no_position": "<lon ala>",
"chat.computercraft.wired_modem.peripheral_connected": "ijo sona \"%s\" li linja tawa kulupu",
"chat.computercraft.wired_modem.peripheral_disconnected": "ijo sona \"%s\" li linja ala tawa kulupu",
"block.computercraft.turtle_normal.upgraded_twice": "ilo sona pali (%s, %s)",
"block.computercraft.wired_modem": "ilo toki linja",
"block.computercraft.wired_modem_full": "ilo toki linja",
"block.computercraft.wireless_modem_advanced": "ilo toki pi ma End",
"block.computercraft.wireless_modem_normal": "ilo toki linja ala",
"commands.computercraft.generic.additional_rows": "mute %d…",
"argument.computercraft.computer.no_matching": "mi ken ala alasa e ilo sona pi nimi '%s'",
"chat.computercraft.wired_modem.peripheral_connected": "ijo sona \"%s\" li linja tawa kulupu",
"chat.computercraft.wired_modem.peripheral_disconnected": "ijo sona \"%s\" li linja ala tawa kulupu",
"commands.computercraft.desc": "ilo sona la, toki wawa /computercraft li lawa li luka li pakala ala.",
"commands.computercraft.dump.action": "o lukin e sona mute pi ilo sona ni",
"commands.computercraft.dump.desc": "sona pi ilo sona la, mi pana e ale anu wan. ilo sona la, sina ken pana e nanpa pi ijo (sama 123) anu nanpa (sama #123) anu nimi (sama \"@ilo sona mi\").",
"commands.computercraft.dump.open_path": "o lukin e lipu pi ilo sona ni",
"commands.computercraft.dump.synopsis": "mi pana e sona pi ilo sona.",
"block.computercraft.cable": "linja toki",
"block.computercraft.wireless_modem_advanced": "ilo toki pi ma End",
"commands.computercraft.generic.additional_rows": "mute %d…",
"commands.computercraft.generic.exception": "pakala awen ala (%s)",
"commands.computercraft.generic.no_position": "<lon ala>",
"commands.computercraft.generic.position": "%s, %s, %s",
"commands.computercraft.help.desc": "mi pana e toki ni",
"commands.computercraft.help.no_children": "toki wawa '%s' li jo ala e toki wawa insa",
"commands.computercraft.help.no_command": "toki wawa '%s' li lon ala",
"commands.computercraft.help.desc": "mi pana e toki ni",
"commands.computercraft.help.synopsis": "mi pana e sona pi toki wawa ale",
"commands.computercraft.reload.done": "mi kama open sin e ante nasin",
"commands.computercraft.queue.synopsis": "mi pana e toki computer_command tawa ilo sona pi toki wawa",
"commands.computercraft.shutdown.desc": "mi pini e ilo sona pi pana sina anu ale. ilo sona la, sina ken pana e nanpa pi ijo (sama 123) anu nanpa (sama #123) anu nimi (sama \"@ilo sona mi\").",
"commands.computercraft.shutdown.done": "mi kama pini e ilo sona %s/%s",
"commands.computercraft.shutdown.synopsis": "mi pini weka e ilo sona.",
"commands.computercraft.queue.synopsis": "mi pana e toki computer_command tawa ilo sona pi toki wawa",
"commands.computercraft.tp.desc": "o tawa ilo sona. ilo sona la, sina ken pana e nanpa pi ijo (sama 123) anu nanpa (sama #123).",
"commands.computercraft.synopsis": "mi jo e toki wawa ante tawa ni: sina lawa e ilo sona.",
"commands.computercraft.tp.action": "o tawa pi ilo sona",
"commands.computercraft.tp.desc": "o tawa ilo sona. ilo sona la, sina ken pana e nanpa pi ijo (sama 123) anu nanpa (sama #123).",
"commands.computercraft.tp.not_player": "jan ala la, mi ken ala open e sitelen pi ilo sona",
"commands.computercraft.track.dump.computer": "ilo sona",
"commands.computercraft.tp.synopsis": "mi tawa pi ilo sona e sina.",
"commands.computercraft.tp.not_there": "mi ken ala alasa e ilo sona pi lon ma",
"commands.computercraft.tp.synopsis": "mi tawa pi ilo sona e sina.",
"commands.computercraft.track.desc": "ilo sona la, mi sitelen e tenpo pali e mute toki. toki wawa /forge track la, mi pana pi nasin sama e sona. mi pona tawa alasa pi tenpo ike.",
"commands.computercraft.track.dump.computer": "ilo sona",
"commands.computercraft.track.dump.desc": "mi pana e sona tan sitelen sona pi sin mute.",
"commands.computercraft.track.dump.no_timings": "mi ken ala alasa e tenpo",
"commands.computercraft.track.stop.synopsis": "mi pini e sitelen sona ale",
"commands.computercraft.track.dump.synopsis": "mi pana e sona tan sitelen sona pi sin mute",
"commands.computercraft.track.start.desc": "ilo sona la, mi open sitelen sona e tenpo pali e mute toki. mi weka e sitelen sona pini.",
"commands.computercraft.track.start.stop": "o toki wawa %s tawa ni: sina pini sitelen sona. sina lukin e sona ni",
"commands.computercraft.track.start.synopsis": "mi open sitelen sona e ilo sona ale",
"commands.computercraft.track.stop.action": "o luka tawa ni: mi pini sitelen sona",
"commands.computercraft.track.stop.not_enabled": "tenpo ni la, mi sitelen ala sona e ilo sona",
"commands.computercraft.track.dump.synopsis": "mi pana e sona tan sitelen sona pi sin mute",
"commands.computercraft.track.stop.desc": "ilo sona la, mi pini sitelen sona e tenpo pali e mute toki",
"commands.computercraft.track.stop.not_enabled": "tenpo ni la, mi sitelen ala sona e ilo sona",
"commands.computercraft.track.stop.synopsis": "mi pini e sitelen sona ale",
"commands.computercraft.track.synopsis": "mi sitelen tenpo pali e ilo sona.",
"commands.computercraft.track.dump.desc": "mi pana e sona tan sitelen sona pi sin mute.",
"commands.computercraft.view.action": "o lukin e ilo sona ni",
"commands.computercraft.view.synopsis": "o lukin e sitelen pi ilo sona.",
"commands.computercraft.turn_on.desc": "mi open e ilo sona pi pana sina. ilo sona la, sina ken pana e nanpa pi ijo (sama 123) anu nanpa (sama #123) anu nimi (sama \"@ilo sona mi\").",
"commands.computercraft.turn_on.done": "mi kama open e ilo sona %s/%s",
"commands.computercraft.turn_on.synopsis": "mi open weka e ilo sona.",
"commands.computercraft.view.action": "o lukin e ilo sona ni",
"commands.computercraft.view.desc": "mi open e sitelen pi ilo sona tawa ni: sina lawa weka e ilo sona. taso, sina ken ala open e jo pi ilo sona pali. ilo sona la, sina ken pana e nanpa pi ijo (sama 123) anu nanpa (sama #123).",
"commands.computercraft.view.not_player": "jan ala la, mi ken ala open e sitelen pi ilo sona",
"commands.computercraft.view.synopsis": "o lukin e sitelen pi ilo sona.",
"gui.computercraft.config.command_require_creative": "ilo sona pi toki wawa li wile e jan sewi",
"gui.computercraft.config.execution.computer_threads": "linja pi ilo sona",
"gui.computercraft.config.http.bandwidth": "mute sona",
"gui.computercraft.config.http": "ijo HTTP",
"gui.computercraft.config.disable_lua51_features": "ijo pona pi ilo Lua 5.1 li weka",
"gui.computercraft.config.execution": "pali",
"gui.computercraft.config.execution.computer_threads": "linja pi ilo sona",
"gui.computercraft.config.http": "ijo HTTP",
"gui.computercraft.config.http.bandwidth": "mute sona",
"gui.computercraft.config.monitor_renderer": "nasin sitelen pi ilo lukin",
"gui.computercraft.config.term_sizes.pocket_computer.width": "suli poka pi ilo sitelen",
"gui.computercraft.config.peripheral": "ijo sona",
"gui.computercraft.config.peripheral.modem_high_altitude_range": "suli ken ilo pi ilo toki (sewi mute)",
"gui.computercraft.config.peripheral.modem_high_altitude_range_during_storm": "suli ken ilo pi ilo toki (sewi mute, sewi ike)",
"gui.computercraft.config.peripheral.modem_range": "suli ken ilo pi ilo toki (pona)",
"gui.computercraft.config.peripheral.modem_range_during_storm": "suli ken ilo pi ilo toki (sewi ike)",
"gui.computercraft.config.peripheral.monitor_bandwidth": "mute sona pi ilo lukin",
"gui.computercraft.config.term_sizes": "suli pi ilo sitelen",
"gui.computercraft.config.term_sizes.computer": "ilo sona",
"gui.computercraft.config.term_sizes.computer.height": "suli sewi pi ilo sitelen",
"gui.computercraft.config.term_sizes.computer.tooltip": "suli pi ilo sitelen pi ilo sona.",
"gui.computercraft.config.term_sizes.computer.width": "suli poka pi ito sitelen",
"gui.computercraft.config.term_sizes.monitor": "ilo lukin",
"gui.computercraft.config.term_sizes.pocket_computer": "ilo sona lili",
"gui.computercraft.config.term_sizes.pocket_computer.height": "suli sewi pi ilo sitelen",
"gui.computercraft.config.term_sizes.computer.height": "suli sewi pi ilo sitelen",
"gui.computercraft.config.term_sizes.computer.width": "suli poka pi ito sitelen",
"gui.computercraft.config.term_sizes.computer.tooltip": "suli pi ilo sitelen pi ilo sona.",
"gui.computercraft.config.peripheral.monitor_bandwidth": "mute sona pi ilo lukin",
"gui.computercraft.config.peripheral.modem_range": "suli ken ilo pi ilo toki (pona)",
"gui.computercraft.config.peripheral.modem_high_altitude_range": "suli ken ilo pi ilo toki (sewi mute)",
"item.computercraft.printed_page": "lipu pi ilo sitelen",
"item.computercraft.printed_pages": "lipu mute pi ilo sitelen",
"item.computercraft.treasure_disk": "lipu sona",
"gui.computercraft.tooltip.turn_on": "o open e ilo sona ni",
"gui.computercraft.config.term_sizes.pocket_computer.tooltip": "suli pi ilo sitelen pi ilo sona lili.",
"gui.computercraft.config.term_sizes.pocket_computer.width": "suli poka pi ilo sitelen",
"gui.computercraft.config.turtle": "ilo sona pali",
"gui.computercraft.pocket_computer_overlay": "sina open e ilo sona lili. o luka e nena ESC tawa pini.",
"gui.computercraft.terminal": "ilo sitelen pi ilo sona",
"gui.computercraft.tooltip.computer_id": "nanpa pi ilo sona: %s",
"gui.computercraft.tooltip.disk_id": "nanpa pi lipu sona: %s",
"gui.computercraft.tooltip.turn_off": "o pini e ilo sona ni",
"gui.computercraft.tooltip.turn_on": "o open e ilo sona ni",
"item.computercraft.disk": "lipu sona",
"item.computercraft.pocket_computer_advanced": "ilo sona lili wawa",
"item.computercraft.pocket_computer_advanced.upgraded": "ilo sona lili wawa (%s)",
"item.computercraft.pocket_computer_normal": "ilo sona lili",
"item.computercraft.pocket_computer_normal.upgraded": "ilo sona lili (%s)",
"gui.computercraft.terminal": "ilo sitelen pi ilo sona",
"item.computercraft.printed_book": "lipu suli pi ilo sitelen",
"item.computercraft.printed_page": "lipu pi ilo sitelen",
"item.computercraft.printed_pages": "lipu mute pi ilo sitelen",
"item.computercraft.treasure_disk": "lipu sona",
"itemGroup.computercraft": "ComputerCraft",
"tracking_field.computercraft.computer_tasks.name": "pali",
"tracking_field.computercraft.count": "%s (mute)",
"tracking_field.computercraft.max": "%s (sewi)",
"tracking_field.computercraft.turtle_ops.name": "pali pi ilo sona pali",
"upgrade.computercraft.speaker.adjective": "kalama",
"tracking_field.computercraft.count": "%s (mute)",
"tracking_field.computercraft.coroutines_created.name": "open linja",
"tracking_field.computercraft.coroutines_dead.name": "pini linja",
"tracking_field.computercraft.max": "%s (sewi)",
"upgrade.computercraft.wireless_modem_advanced.adjective": "toki pi ma End",
"upgrade.computercraft.wireless_modem_normal.adjective": "toki linja ala",
"upgrade.minecraft.crafting_table.adjective": "pali",
"upgrade.minecraft.diamond_axe.adjective": "ilo kipisi",
"upgrade.minecraft.diamond_hoe.adjective": "ilo kasi",
"upgrade.computercraft.wireless_modem_normal.adjective": "toki linja ala",
"upgrade.minecraft.diamond_pickaxe.adjective": "ilo pakala",
"upgrade.minecraft.diamond_shovel.adjective": "ilo ma",
"upgrade.minecraft.diamond_sword.adjective": "utala",
"block.computercraft.turtle_advanced.upgraded_twice": "ilo sona pali wawa (%s, %s)",
"block.computercraft.turtle_normal.upgraded_twice": "ilo sona pali (%s, %s)",
"gui.computercraft.config.turtle": "ilo sona pali",
"item.computercraft.disk": "lipu sona",
"item.computercraft.printed_book": "lipu suli pi ilo sitelen",
"upgrade.computercraft.wireless_modem_advanced.adjective": "toki pi ma End",
"gui.computercraft.tooltip.disk_id": "nanpa pi lipu sona: %s",
"gui.computercraft.config.peripheral": "ijo sona",
"gui.computercraft.config.peripheral.modem_range_during_storm": "suli ken ilo pi ilo toki (sewi ike)",
"argument.computercraft.tracking_field.no_field": "mi sona ala e nimi '%s'",
"argument.computercraft.computer.many_matching": "mi alasa e ilo sona mute pi nimi '%s' (ijo %s)",
"commands.computercraft.desc": "ilo sona la, toki wawa /computercraft li lawa li luka li pakala ala.",
"commands.computercraft.reload.desc": "mi open sin e ante nasin",
"commands.computercraft.reload.synopsis": "mi open sin e ante nasin",
"commands.computercraft.shutdown.desc": "mi pini e ilo sona pi pana sina anu ale. ilo sona la, sina ken pana e nanpa pi ijo (sama 123) anu nanpa (sama #123) anu nimi (sama \"@ilo sona mi\").",
"gui.computercraft.config.term_sizes.pocket_computer.tooltip": "suli pi ilo sitelen pi ilo sona lili.",
"gui.computercraft.config.peripheral.modem_high_altitude_range_during_storm": "suli ken ilo pi ilo toki (sewi mute, sewi ike)",
"gui.computercraft.pocket_computer_overlay": "sina open e ilo sona lili. o luka e nena ESC tawa pini.",
"commands.computercraft.dump.desc": "sona pi ilo sona la, mi pana e ale anu wan. ilo sona la, sina ken pana e nanpa pi ijo (sama 123) anu nanpa (sama #123) anu nimi (sama \"@ilo sona mi\").",
"commands.computercraft.turn_on.desc": "mi open e ilo sona pi pana sina. ilo sona la, sina ken pana e nanpa pi ijo (sama 123) anu nanpa (sama #123) anu nimi (sama \"@ilo sona mi\").",
"commands.computercraft.track.start.stop": "o toki wawa %s tawa ni: sina pini sitelen sona. sina lukin e sona ni",
"commands.computercraft.track.start.desc": "ilo sona la, mi open sitelen sona e tenpo pali e mute toki. mi weka e sitelen sona pini.",
"commands.computercraft.view.desc": "mi open e sitelen pi ilo sona tawa ni: sina lawa weka e ilo sona. taso, sina ken ala open e jo pi ilo sona pali. ilo sona la, sina ken pana e nanpa pi ijo (sama 123) anu nanpa (sama #123).",
"gui.computercraft.config.disable_lua51_features": "ijo pona pi ilo Lua 5.1 li weka"
"upgrade.minecraft.diamond_sword.adjective": "utala"
}

View File

@ -41,9 +41,6 @@
"commands.computercraft.help.synopsis": "Надає допомогу для конкретних команд",
"commands.computercraft.queue.desc": "Надіслати подію computer_command до Командного комп'ютера через додаткові аргументи. В основному це призначено для Картоделів, діє як зручніша для користувача комп'ютерна версія /trigger. Будь-який гравець зможе запустити команду, яка, ймовірно, буде зроблена через події клацання текстового компонента.",
"commands.computercraft.queue.synopsis": "Надіслати подію computer_command до Командного комп'ютера",
"commands.computercraft.reload.desc": "Перезавантажує файл конфігурації ComputerCraft'a",
"commands.computercraft.reload.done": "Конфігурація перезавантажена",
"commands.computercraft.reload.synopsis": "Перезавантажити файл конфігурації ComputerCraft'a",
"commands.computercraft.shutdown.desc": "Завершити роботу перерахованих комп'ютерів або всі, якщо жодного не вказано. Ви можете вказати ідентифікатор екземпляра комп'ютера (наприклад 123), ідентифікатор комп'ютера (наприклад #123) або позначку (наприклад, \"@My Computer\").",
"commands.computercraft.shutdown.done": "У %s/%s комп'ютерів завершено роботу",
"commands.computercraft.shutdown.synopsis": "Віддалено завершити роботу комп'ютерів.",
@ -73,6 +70,28 @@
"commands.computercraft.view.desc": "Відкрити термінал комп'ютера, який дозволяє віддалено керувати комп'ютером. Це не надає доступу до інвентарів черепашок. Ви можете вказати або ідентифікатор екземпляра комп'ютера (наприклад, 123) або ідентифікатор комп'ютера (наприклад, #123).",
"commands.computercraft.view.not_player": "Не можна відкрити термінал для не-гравця",
"commands.computercraft.view.synopsis": "Переглянути термінал комп'ютера.",
"gui.computercraft.config.command_require_creative": "Командний комп'ютер вимагає режиму творчості",
"gui.computercraft.config.command_require_creative.tooltip": "Для взаємодії з командним комп'ютером, гравець має бути в режимі\nтворчості. Це поведінка скопійована з поведінки за замовчуванням для командних блоків.",
"gui.computercraft.config.computer_space_limit": "Обмеження комп'ютерного простору (в байтах)",
"gui.computercraft.config.computer_space_limit.tooltip": "Обмеження на займаєме місце на диску комп'ютерами та черепахами, в байтах.",
"gui.computercraft.config.default_computer_settings": "Налаштування комп'ютера за замовчуванням",
"gui.computercraft.config.default_computer_settings.tooltip": "Список лашатувань за замовчуванням, розділених комою, що будуть нашалтовані на нових комп'ютерах\nНаприклад: \"shell.autocomplete=false,lua.autocomplete=false,edit.autocomplete=false\"\nвідключить усі автодоповнення.",
"gui.computercraft.config.disable_lua51_features": "Відключити підтримку Lua 5.1",
"gui.computercraft.config.disable_lua51_features.tooltip": "Включить це налаштування, якщо хочете відключити функціональність, пов'язану з Lua 5.1, яка буде вилучен в наступних оновленнях.\nТаким чином ви можете впевнитись, що ваші програми не зламаються від подальших оновлень.",
"gui.computercraft.config.execution": "Виконання",
"gui.computercraft.config.execution.computer_threads": "Потоки для комп'ютерів",
"gui.computercraft.config.execution.computer_threads.tooltip": "Встановлює кількість потоків, на яких запускаються комп'ютери. Більше число\nозначає більшу кількість комп'ютерів, які працюють паралельно, але може призвести до проблем із продуктивністю.\nЗауважте, що деякі модифікації можуть не працювати із кількістю потоків більше за 1. Використовуйте з обережністю.\nОбмеження: > 1",
"gui.computercraft.config.execution.max_main_computer_time": "Обмеження на час, який займає комп'ютер на сервері за один цикл",
"gui.computercraft.config.execution.max_main_computer_time.tooltip": "Бажаний максимальний час, який комп'ютер може працювати за один цикл, в мілісекундах\nЗауважте, що досить ймовірно, що цей ліміт буде порушено, бо немає ніякої можливості\nсправді визначити, скільки комп'ютер займе часу - це значення буде ціллю для верхньої межі середнього часу виконання.\nОбмеження: > 1",
"gui.computercraft.config.execution.max_main_global_time": "Обмеження на час виконання у один серверний цикл",
"gui.computercraft.config.execution.max_main_global_time.tooltip": "Бажаний максимальний час, який витрачається на виконання задач, в мілісекундах\nЗауважте, що досить ймовірно, що цей ліміт буде порушено, бо немає ніякої можливості\nсправді визначити, скільки комп'ютер займе часу - це значення буде ціллю для верхньої межі середнього часу виконання.\nОбмеження: > 1",
"gui.computercraft.config.execution.tooltip": "Контролює те, як працюють комп'ютери. Цей розділ призначений\nдля детального налаштування серверів, і у більшості випадків його не потрібно чіпати.",
"gui.computercraft.config.floppy_space_limit": "Обмеження розміру для дискети (в байтах)",
"gui.computercraft.config.floppy_space_limit.tooltip": "Обмеження на розмір, що займається на диску дискетою, в байтах.",
"gui.computercraft.config.http": "HTTP",
"gui.computercraft.config.http.bandwidth": "Трафік",
"gui.computercraft.config.http.bandwidth.global_download": "Глобальне обмеження на завантаження",
"gui.computercraft.config.http.bandwidth.global_download.tooltip": "Число байтів, які можуть бути завантажені в хвилину. Це обмеження на всі комп'ютери відразу (байти в секунду)\nОбмеження: > 1",
"gui.computercraft.pocket_computer_overlay": "Кишеньковий комп'ютер відкритий. Натисніть ESC, щоб закрити.",
"gui.computercraft.tooltip.computer_id": "Ідентифікатор комп'ютера: %s",
"gui.computercraft.tooltip.copy": "Скопійовано в Буфер обміну",
@ -99,8 +118,6 @@
"item.computercraft.printed_pages": "Надруковані сторінки",
"item.computercraft.treasure_disk": "Дискета",
"itemGroup.computercraft": "ComputerCraft",
"tracking_field.computercraft.coroutines_created.name": "Співпрограма створена",
"tracking_field.computercraft.coroutines_dead.name": "Співпрограма видалена",
"tracking_field.computercraft.fs.name": "Операції з файловою системою",
"tracking_field.computercraft.http_download.name": "HTTP завантаження",
"tracking_field.computercraft.http_upload.name": "HTTP завантаження",
@ -115,27 +132,5 @@
"upgrade.minecraft.diamond_hoe.adjective": "Обробна",
"upgrade.minecraft.diamond_pickaxe.adjective": "Добувна",
"upgrade.minecraft.diamond_shovel.adjective": "Копаюча",
"upgrade.minecraft.diamond_sword.adjective": "Бойова",
"gui.computercraft.config.computer_space_limit": "Обмеження комп'ютерного простору (в байтах)",
"gui.computercraft.config.default_computer_settings": "Налаштування комп'ютера за замовчуванням",
"gui.computercraft.config.disable_lua51_features": "Відключити підтримку Lua 5.1",
"gui.computercraft.config.execution": "Виконання",
"gui.computercraft.config.execution.computer_threads": "Потоки для комп'ютерів",
"gui.computercraft.config.execution.max_main_computer_time": "Обмеження на час, який займає комп'ютер на сервері за один цикл",
"gui.computercraft.config.execution.max_main_computer_time.tooltip": "Бажаний максимальний час, який комп'ютер може працювати за один цикл, в мілісекундах\nЗауважте, що досить ймовірно, що цей ліміт буде порушено, бо немає ніякої можливості\nсправді визначити, скільки комп'ютер займе часу - це значення буде ціллю для верхньої межі середнього часу виконання.\nОбмеження: > 1",
"gui.computercraft.config.execution.max_main_global_time": "Обмеження на час виконання у один серверний цикл",
"gui.computercraft.config.execution.tooltip": "Контролює те, як працюють комп'ютери. Цей розділ призначений\nдля детального налаштування серверів, і у більшості випадків його не потрібно чіпати.",
"gui.computercraft.config.floppy_space_limit": "Обмеження розміру для дискети (в байтах)",
"gui.computercraft.config.floppy_space_limit.tooltip": "Обмеження на розмір, що займається на диску дискетою, в байтах.",
"gui.computercraft.config.http": "HTTP",
"gui.computercraft.config.http.bandwidth": "Трафік",
"gui.computercraft.config.http.bandwidth.global_download": "Глобальне обмеження на завантаження",
"gui.computercraft.config.command_require_creative": "Командний комп'ютер вимагає режиму творчості",
"gui.computercraft.config.command_require_creative.tooltip": "Для взаємодії з командним комп'ютером, гравець має бути в режимі\nтворчості. Це поведінка скопійована з поведінки за замовчуванням для командних блоків.",
"gui.computercraft.config.computer_space_limit.tooltip": "Обмеження на займаєме місце на диску комп'ютерами та черепахами, в байтах.",
"gui.computercraft.config.default_computer_settings.tooltip": "Список лашатувань за замовчуванням, розділених комою, що будуть нашалтовані на нових комп'ютерах\nНаприклад: \"shell.autocomplete=false,lua.autocomplete=false,edit.autocomplete=false\"\nвідключить усі автодоповнення.",
"gui.computercraft.config.disable_lua51_features.tooltip": "Включить це налаштування, якщо хочете відключити функціональність, пов'язану з Lua 5.1, яка буде вилучен в наступних оновленнях.\nТаким чином ви можете впевнитись, що ваші програми не зламаються від подальших оновлень.",
"gui.computercraft.config.execution.computer_threads.tooltip": "Встановлює кількість потоків, на яких запускаються комп'ютери. Більше число\nозначає більшу кількість комп'ютерів, які працюють паралельно, але може призвести до проблем із продуктивністю.\nЗауважте, що деякі модифікації можуть не працювати із кількістю потоків більше за 1. Використовуйте з обережністю.\nОбмеження: > 1",
"gui.computercraft.config.execution.max_main_global_time.tooltip": "Бажаний максимальний час, який витрачається на виконання задач, в мілісекундах\nЗауважте, що досить ймовірно, що цей ліміт буде порушено, бо немає ніякої можливості\nсправді визначити, скільки комп'ютер займе часу - це значення буде ціллю для верхньої межі середнього часу виконання.\nОбмеження: > 1",
"gui.computercraft.config.http.bandwidth.global_download.tooltip": "Число байтів, які можуть бути завантажені в хвилину. Це обмеження на всі комп'ютери відразу (байти в секунду)\nОбмеження: > 1"
"upgrade.minecraft.diamond_sword.adjective": "Бойова"
}

View File

@ -30,8 +30,6 @@
"item.computercraft.printed_page": "Trang in",
"item.computercraft.treasure_disk": "Đĩa mềm",
"itemGroup.computercraft": "ComputerCraft",
"tracking_field.computercraft.coroutines_created.name": "Coroutine đã tạo",
"tracking_field.computercraft.coroutines_dead.name": "Coroutine bỏ đi",
"tracking_field.computercraft.http_download.name": "HTTP tải xuống",
"tracking_field.computercraft.http_upload.name": "HTTP tải lên",
"tracking_field.computercraft.websocket_incoming.name": "Websocket đến",

View File

@ -39,9 +39,6 @@
"commands.computercraft.help.synopsis": "为特定的命令提供帮助",
"commands.computercraft.queue.desc": "发送computer_command事件到命令计算机,并传递其他参数. 这主要是为地图制作者设计的, 作为/trigger更加计算机友好的版本. 任何玩家都可以运行命令, 这很可能是通过文本组件的点击事件完成的.",
"commands.computercraft.queue.synopsis": "将computer_command事件发送到命令计算机",
"commands.computercraft.reload.desc": "重新加载ComputerCraft配置文件",
"commands.computercraft.reload.done": "重新加载配置",
"commands.computercraft.reload.synopsis": "重新加载ComputerCraft配置文件",
"commands.computercraft.shutdown.desc": "关闭列出的计算机或全部计算机(如果未指定). 你可以指定计算机的实例id (例如. 123), 计算机id (例如. #123)或标签(例如. \"@My Computer\").",
"commands.computercraft.shutdown.done": "关闭%s/%s计算机",
"commands.computercraft.shutdown.synopsis": "远程关闭计算机.",
@ -111,8 +108,6 @@
"item.computercraft.printed_pages": "打印纸",
"item.computercraft.treasure_disk": "软盘",
"itemGroup.computercraft": "ComputerCraft",
"tracking_field.computercraft.coroutines_created.name": "协同创建",
"tracking_field.computercraft.coroutines_dead.name": "协同处理",
"tracking_field.computercraft.fs.name": "文件系统操作",
"tracking_field.computercraft.http_download.name": "HTTP下载",
"tracking_field.computercraft.http_upload.name": "HTTP上传",

View File

@ -1,16 +1,7 @@
{
"parent": "minecraft:block/block",
"parent": "minecraft:block/orientable",
"render_type": "cutout",
"textures": {
"particle": "#front"
},
"display": {
"firstperson_righthand": {
"rotation": [ 0, 135, 0 ],
"translation": [ 0, 0, 0 ],
"scale": [ 0.40, 0.40, 0.40 ]
}
},
"computercraft:emissive_texture": "cursor",
"elements": [
{
"from": [ 0, 0, 0 ],

View File

@ -0,0 +1,37 @@
// SPDX-FileCopyrightText: 2023 The CC: Tweaked Developers
//
// SPDX-License-Identifier: MPL-2.0
package dan200.computercraft.shared.util;
import org.junit.jupiter.api.Test;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
/**
* A couple of trivial tests for {@link ConsList}, mostly as a quick safety check.
*/
public class ConsListTest {
@Test
public void testGet() {
var list = new ConsList<>(1, List.of(2, 3, 4));
assertEquals(1, list.get(0));
assertEquals(2, list.get(1));
assertEquals(4, list.get(3));
}
@Test
public void testSize() {
var list = new ConsList<>(1, List.of(2, 3, 4));
assertEquals(4, list.size());
}
@Test
public void testIterator() {
var list = new ConsList<>(1, List.of(2, 3, 4));
assertArrayEquals(new Integer[]{ 1, 2, 3, 4 }, list.toArray(Integer[]::new));
}
}

View File

@ -22,6 +22,7 @@
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertTrue
import org.lwjgl.glfw.GLFW
import kotlin.time.Duration.Companion.milliseconds
class Computer_Test {
/**
@ -71,6 +72,24 @@ fun Set_and_destroy(context: GameTestHelper) = context.sequence {
thenExecute { context.assertBlockHas(lamp, RedstoneLampBlock.LIT, false, "Lamp should not be lit") }
}
/**
* Check computers pick up propagated redstone to surrounding blocks.
*
* @see [#1520](https://github.com/cc-tweaked/CC-Tweaked/issues/1520)
*/
@GameTest
fun Self_output_update(context: GameTestHelper) = context.sequence {
thenOnComputer {
getApi<RedstoneAPI>().setOutput(ComputerSide.BACK, true)
sleep(100.milliseconds)
assertEquals(true, getApi<RedstoneAPI>().getInput(ComputerSide.BACK), "Input should be on")
getApi<RedstoneAPI>().setOutput(ComputerSide.BACK, false)
sleep(100.milliseconds)
assertEquals(false, getApi<RedstoneAPI>().getInput(ComputerSide.BACK), "Input should be off")
}
}
/**
* Check computers and turtles expose peripherals.
*/

View File

@ -145,11 +145,31 @@ fun Gather_lava(helper: GameTestHelper) = helper.sequence {
*/
@GameTest
fun Hoe_dirt(helper: GameTestHelper) = helper.sequence {
thenOnComputer { turtle.dig(Optional.empty()).await().assertArrayEquals(true, message = "Dug with hoe") }
thenExecute { helper.assertBlockPresent(Blocks.FARMLAND, BlockPos(1, 2, 1)) }
}
/**
* Checks turtles can hoe dirt with a block gap below them.
*
* @see [#1527](https://github.com/cc-tweaked/CC-Tweaked/issues/1527)
*/
@GameTest
fun Hoe_dirt_below(helper: GameTestHelper) = helper.sequence {
thenOnComputer { turtle.digDown(Optional.empty()).await().assertArrayEquals(true, message = "Dug with hoe") }
thenExecute { helper.assertBlockPresent(Blocks.FARMLAND, BlockPos(1, 1, 1)) }
}
/**
* Checks turtles cannot hoe dirt with a block gap in front of them.
*/
@GameTest
fun Hoe_dirt_distant(helper: GameTestHelper) = helper.sequence {
thenOnComputer {
turtle.dig(Optional.empty()).await()
.assertArrayEquals(true, message = "Dug with hoe")
.assertArrayEquals(false, "Nothing to dig here", message = "Dug with hoe")
}
thenExecute { helper.assertBlockPresent(Blocks.FARMLAND, BlockPos(1, 2, 1)) }
thenExecute { helper.assertBlockPresent(Blocks.DIRT, BlockPos(1, 2, 2)) }
}
/**
@ -603,6 +623,24 @@ fun Peripheral_change(helper: GameTestHelper) = helper.sequence {
}
// TODO: Turtle sucking from items
/**
* Render turtles as an item.
*/
@ClientGameTest
fun Render_turtle_items(helper: GameTestHelper) = helper.sequence {
thenExecute { helper.positionAtArmorStand() }
thenScreenshot()
}
/**
* Render turtles as a block entity.
*/
@ClientGameTest
fun Render_turtle_blocks(helper: GameTestHelper) = helper.sequence {
thenExecute { helper.positionAtArmorStand() }
thenScreenshot()
}
}
private val LuaTaskContext.turtle get() = getApi<TurtleAPI>()

View File

@ -0,0 +1,137 @@
{
DataVersion: 3120,
size: [5, 5, 5],
data: [
{pos: [0, 0, 0], state: "minecraft:polished_andesite"},
{pos: [0, 0, 1], state: "minecraft:polished_andesite"},
{pos: [0, 0, 2], state: "minecraft:polished_andesite"},
{pos: [0, 0, 3], state: "minecraft:polished_andesite"},
{pos: [0, 0, 4], state: "minecraft:polished_andesite"},
{pos: [1, 0, 0], state: "minecraft:polished_andesite"},
{pos: [1, 0, 1], state: "minecraft:polished_andesite"},
{pos: [1, 0, 2], state: "minecraft:polished_andesite"},
{pos: [1, 0, 3], state: "minecraft:polished_andesite"},
{pos: [1, 0, 4], state: "minecraft:polished_andesite"},
{pos: [2, 0, 0], state: "minecraft:polished_andesite"},
{pos: [2, 0, 1], state: "minecraft:polished_andesite"},
{pos: [2, 0, 2], state: "minecraft:polished_andesite"},
{pos: [2, 0, 3], state: "minecraft:polished_andesite"},
{pos: [2, 0, 4], state: "minecraft:polished_andesite"},
{pos: [3, 0, 0], state: "minecraft:polished_andesite"},
{pos: [3, 0, 1], state: "minecraft:polished_andesite"},
{pos: [3, 0, 2], state: "minecraft:polished_andesite"},
{pos: [3, 0, 3], state: "minecraft:polished_andesite"},
{pos: [3, 0, 4], state: "minecraft:polished_andesite"},
{pos: [4, 0, 0], state: "minecraft:polished_andesite"},
{pos: [4, 0, 1], state: "minecraft:polished_andesite"},
{pos: [4, 0, 2], state: "minecraft:polished_andesite"},
{pos: [4, 0, 3], state: "minecraft:polished_andesite"},
{pos: [4, 0, 4], state: "minecraft:polished_andesite"},
{pos: [0, 1, 0], state: "minecraft:air"},
{pos: [0, 1, 1], state: "minecraft:air"},
{pos: [0, 1, 2], state: "minecraft:air"},
{pos: [0, 1, 3], state: "minecraft:air"},
{pos: [0, 1, 4], state: "minecraft:air"},
{pos: [1, 1, 0], state: "minecraft:air"},
{pos: [1, 1, 1], state: "minecraft:air"},
{pos: [1, 1, 2], state: "minecraft:air"},
{pos: [1, 1, 3], state: "minecraft:air"},
{pos: [1, 1, 4], state: "minecraft:air"},
{pos: [2, 1, 0], state: "minecraft:air"},
{pos: [2, 1, 1], state: "minecraft:air"},
{pos: [2, 1, 2], state: "computercraft:computer_advanced{facing:north,state:on}", nbt: {ComputerId: 1, Label: "computer_test.self_output_update", On: 1b, id: "computercraft:computer_advanced"}},
{pos: [2, 1, 3], state: "minecraft:polished_andesite"},
{pos: [2, 1, 4], state: "minecraft:air"},
{pos: [3, 1, 0], state: "minecraft:air"},
{pos: [3, 1, 1], state: "minecraft:air"},
{pos: [3, 1, 2], state: "minecraft:air"},
{pos: [3, 1, 3], state: "minecraft:air"},
{pos: [3, 1, 4], state: "minecraft:air"},
{pos: [4, 1, 0], state: "minecraft:air"},
{pos: [4, 1, 1], state: "minecraft:air"},
{pos: [4, 1, 2], state: "minecraft:air"},
{pos: [4, 1, 3], state: "minecraft:air"},
{pos: [4, 1, 4], state: "minecraft:air"},
{pos: [0, 2, 0], state: "minecraft:air"},
{pos: [0, 2, 1], state: "minecraft:air"},
{pos: [0, 2, 2], state: "minecraft:air"},
{pos: [0, 2, 3], state: "minecraft:air"},
{pos: [0, 2, 4], state: "minecraft:air"},
{pos: [1, 2, 0], state: "minecraft:air"},
{pos: [1, 2, 1], state: "minecraft:air"},
{pos: [1, 2, 2], state: "minecraft:air"},
{pos: [1, 2, 3], state: "minecraft:air"},
{pos: [1, 2, 4], state: "minecraft:air"},
{pos: [2, 2, 0], state: "minecraft:air"},
{pos: [2, 2, 1], state: "minecraft:air"},
{pos: [2, 2, 2], state: "minecraft:air"},
{pos: [2, 2, 3], state: "minecraft:air"},
{pos: [2, 2, 4], state: "minecraft:air"},
{pos: [3, 2, 0], state: "minecraft:air"},
{pos: [3, 2, 1], state: "minecraft:air"},
{pos: [3, 2, 2], state: "minecraft:air"},
{pos: [3, 2, 3], state: "minecraft:air"},
{pos: [3, 2, 4], state: "minecraft:air"},
{pos: [4, 2, 0], state: "minecraft:air"},
{pos: [4, 2, 1], state: "minecraft:air"},
{pos: [4, 2, 2], state: "minecraft:air"},
{pos: [4, 2, 3], state: "minecraft:air"},
{pos: [4, 2, 4], state: "minecraft:air"},
{pos: [0, 3, 0], state: "minecraft:air"},
{pos: [0, 3, 1], state: "minecraft:air"},
{pos: [0, 3, 2], state: "minecraft:air"},
{pos: [0, 3, 3], state: "minecraft:air"},
{pos: [0, 3, 4], state: "minecraft:air"},
{pos: [1, 3, 0], state: "minecraft:air"},
{pos: [1, 3, 1], state: "minecraft:air"},
{pos: [1, 3, 2], state: "minecraft:air"},
{pos: [1, 3, 3], state: "minecraft:air"},
{pos: [1, 3, 4], state: "minecraft:air"},
{pos: [2, 3, 0], state: "minecraft:air"},
{pos: [2, 3, 1], state: "minecraft:air"},
{pos: [2, 3, 2], state: "minecraft:air"},
{pos: [2, 3, 3], state: "minecraft:air"},
{pos: [2, 3, 4], state: "minecraft:air"},
{pos: [3, 3, 0], state: "minecraft:air"},
{pos: [3, 3, 1], state: "minecraft:air"},
{pos: [3, 3, 2], state: "minecraft:air"},
{pos: [3, 3, 3], state: "minecraft:air"},
{pos: [3, 3, 4], state: "minecraft:air"},
{pos: [4, 3, 0], state: "minecraft:air"},
{pos: [4, 3, 1], state: "minecraft:air"},
{pos: [4, 3, 2], state: "minecraft:air"},
{pos: [4, 3, 3], state: "minecraft:air"},
{pos: [4, 3, 4], state: "minecraft:air"},
{pos: [0, 4, 0], state: "minecraft:air"},
{pos: [0, 4, 1], state: "minecraft:air"},
{pos: [0, 4, 2], state: "minecraft:air"},
{pos: [0, 4, 3], state: "minecraft:air"},
{pos: [0, 4, 4], state: "minecraft:air"},
{pos: [1, 4, 0], state: "minecraft:air"},
{pos: [1, 4, 1], state: "minecraft:air"},
{pos: [1, 4, 2], state: "minecraft:air"},
{pos: [1, 4, 3], state: "minecraft:air"},
{pos: [1, 4, 4], state: "minecraft:air"},
{pos: [2, 4, 0], state: "minecraft:air"},
{pos: [2, 4, 1], state: "minecraft:air"},
{pos: [2, 4, 2], state: "minecraft:air"},
{pos: [2, 4, 3], state: "minecraft:air"},
{pos: [2, 4, 4], state: "minecraft:air"},
{pos: [3, 4, 0], state: "minecraft:air"},
{pos: [3, 4, 1], state: "minecraft:air"},
{pos: [3, 4, 2], state: "minecraft:air"},
{pos: [3, 4, 3], state: "minecraft:air"},
{pos: [3, 4, 4], state: "minecraft:air"},
{pos: [4, 4, 0], state: "minecraft:air"},
{pos: [4, 4, 1], state: "minecraft:air"},
{pos: [4, 4, 2], state: "minecraft:air"},
{pos: [4, 4, 3], state: "minecraft:air"},
{pos: [4, 4, 4], state: "minecraft:air"}
],
entities: [],
palette: [
"minecraft:polished_andesite",
"minecraft:air",
"computercraft:computer_advanced{facing:north,state:on}"
]
}

View File

@ -0,0 +1,40 @@
{
DataVersion: 2730,
size: [3, 3, 3],
data: [
{pos: [0, 0, 0], state: "minecraft:polished_andesite"},
{pos: [0, 0, 1], state: "minecraft:polished_andesite"},
{pos: [0, 0, 2], state: "minecraft:polished_andesite"},
{pos: [1, 0, 0], state: "minecraft:polished_andesite"},
{pos: [1, 0, 1], state: "minecraft:dirt"},
{pos: [1, 0, 2], state: "minecraft:polished_andesite"},
{pos: [2, 0, 0], state: "minecraft:polished_andesite"},
{pos: [2, 0, 1], state: "minecraft:polished_andesite"},
{pos: [2, 0, 2], state: "minecraft:polished_andesite"},
{pos: [0, 1, 0], state: "minecraft:air"},
{pos: [0, 1, 1], state: "minecraft:air"},
{pos: [0, 1, 2], state: "minecraft:air"},
{pos: [1, 1, 0], state: "minecraft:air"},
{pos: [1, 1, 1], state: "minecraft:air"},
{pos: [1, 1, 2], state: "minecraft:air"},
{pos: [2, 1, 0], state: "minecraft:air"},
{pos: [2, 1, 1], state: "minecraft:air"},
{pos: [2, 1, 2], state: "minecraft:air"},
{pos: [0, 2, 0], state: "minecraft:air"},
{pos: [0, 2, 1], state: "minecraft:air"},
{pos: [0, 2, 2], state: "minecraft:air"},
{pos: [1, 2, 0], state: "minecraft:air"},
{pos: [1, 2, 1], state: "computercraft:turtle_normal{facing:south,waterlogged:false}", nbt: {ComputerId: 1, Fuel: 0, Items: [], Label: "turtle_test.hoe_dirt_below", LeftUpgrade: "minecraft:diamond_hoe", On: 1b, Owner: {LowerId: -6876936588741668278L, Name: "Dev", UpperId: 4039158846114182220L}, Slot: 0, id: "computercraft:turtle_normal"}},
{pos: [1, 2, 2], state: "minecraft:air"},
{pos: [2, 2, 0], state: "minecraft:air"},
{pos: [2, 2, 1], state: "minecraft:air"},
{pos: [2, 2, 2], state: "minecraft:air"}
],
entities: [],
palette: [
"minecraft:polished_andesite",
"minecraft:dirt",
"computercraft:turtle_normal{facing:south,waterlogged:false}",
"minecraft:air"
]
}

View File

@ -0,0 +1,40 @@
{
DataVersion: 2730,
size: [3, 3, 3],
data: [
{pos: [0, 0, 0], state: "minecraft:polished_andesite"},
{pos: [0, 0, 1], state: "minecraft:polished_andesite"},
{pos: [0, 0, 2], state: "minecraft:polished_andesite"},
{pos: [1, 0, 0], state: "minecraft:polished_andesite"},
{pos: [1, 0, 1], state: "minecraft:polished_andesite"},
{pos: [1, 0, 2], state: "minecraft:polished_andesite"},
{pos: [2, 0, 0], state: "minecraft:polished_andesite"},
{pos: [2, 0, 1], state: "minecraft:polished_andesite"},
{pos: [2, 0, 2], state: "minecraft:polished_andesite"},
{pos: [0, 1, 0], state: "minecraft:air"},
{pos: [0, 1, 1], state: "minecraft:air"},
{pos: [0, 1, 2], state: "minecraft:air"},
{pos: [1, 1, 0], state: "computercraft:turtle_normal{facing:south,waterlogged:false}", nbt: {ComputerId: 1, Fuel: 0, Items: [], Label: "turtle_test.hoe_dirt_distant", LeftUpgrade: "minecraft:diamond_hoe", On: 1b, Owner: {LowerId: -6876936588741668278L, Name: "Dev", UpperId: 4039158846114182220L}, Slot: 0, id: "computercraft:turtle_normal"}},
{pos: [1, 1, 1], state: "minecraft:air"},
{pos: [1, 1, 2], state: "minecraft:dirt"},
{pos: [2, 1, 0], state: "minecraft:air"},
{pos: [2, 1, 1], state: "minecraft:air"},
{pos: [2, 1, 2], state: "minecraft:air"},
{pos: [0, 2, 0], state: "minecraft:air"},
{pos: [0, 2, 1], state: "minecraft:air"},
{pos: [0, 2, 2], state: "minecraft:air"},
{pos: [1, 2, 0], state: "minecraft:air"},
{pos: [1, 2, 1], state: "minecraft:air"},
{pos: [1, 2, 2], state: "minecraft:air"},
{pos: [2, 2, 0], state: "minecraft:air"},
{pos: [2, 2, 1], state: "minecraft:air"},
{pos: [2, 2, 2], state: "minecraft:air"}
],
entities: [],
palette: [
"minecraft:polished_andesite",
"minecraft:dirt",
"computercraft:turtle_normal{facing:south,waterlogged:false}",
"minecraft:air"
]
}

View File

@ -0,0 +1,140 @@
{
DataVersion: 3337,
size: [5, 5, 5],
data: [
{pos: [0, 0, 0], state: "minecraft:polished_andesite"},
{pos: [0, 0, 1], state: "minecraft:polished_andesite"},
{pos: [0, 0, 2], state: "minecraft:polished_andesite"},
{pos: [0, 0, 3], state: "minecraft:polished_andesite"},
{pos: [0, 0, 4], state: "minecraft:polished_andesite"},
{pos: [1, 0, 0], state: "minecraft:polished_andesite"},
{pos: [1, 0, 1], state: "minecraft:polished_andesite"},
{pos: [1, 0, 2], state: "minecraft:polished_andesite"},
{pos: [1, 0, 3], state: "minecraft:polished_andesite"},
{pos: [1, 0, 4], state: "minecraft:polished_andesite"},
{pos: [2, 0, 0], state: "minecraft:polished_andesite"},
{pos: [2, 0, 1], state: "minecraft:polished_andesite"},
{pos: [2, 0, 2], state: "minecraft:polished_andesite"},
{pos: [2, 0, 3], state: "minecraft:polished_andesite"},
{pos: [2, 0, 4], state: "minecraft:polished_andesite"},
{pos: [3, 0, 0], state: "minecraft:polished_andesite"},
{pos: [3, 0, 1], state: "minecraft:polished_andesite"},
{pos: [3, 0, 2], state: "minecraft:polished_andesite"},
{pos: [3, 0, 3], state: "minecraft:polished_andesite"},
{pos: [3, 0, 4], state: "minecraft:polished_andesite"},
{pos: [4, 0, 0], state: "minecraft:polished_andesite"},
{pos: [4, 0, 1], state: "minecraft:polished_andesite"},
{pos: [4, 0, 2], state: "minecraft:polished_andesite"},
{pos: [4, 0, 3], state: "minecraft:polished_andesite"},
{pos: [4, 0, 4], state: "minecraft:polished_andesite"},
{pos: [0, 1, 0], state: "minecraft:air"},
{pos: [0, 1, 1], state: "minecraft:air"},
{pos: [0, 1, 2], state: "minecraft:air"},
{pos: [0, 1, 3], state: "minecraft:air"},
{pos: [0, 1, 4], state: "minecraft:air"},
{pos: [1, 1, 0], state: "minecraft:air"},
{pos: [1, 1, 1], state: "minecraft:air"},
{pos: [1, 1, 2], state: "minecraft:air"},
{pos: [1, 1, 3], state: "computercraft:turtle_normal{facing:east,waterlogged:false}", nbt: {ComputerId: 8, Fuel: 0, Items: [], LeftUpgrade: "cctest:netherite_pickaxe", LeftUpgradeNbt: {Tag: {Damage: 0, Enchantments: [{id: "minecraft:efficiency", lvl: 5s}], RepairCost: 1}}, On: 1b, Owner: {LowerId: -7931330074873442406L, Name: "Player848", UpperId: 7430876841693101418L}, Slot: 0, id: "computercraft:turtle_normal"}},
{pos: [1, 1, 4], state: "minecraft:air"},
{pos: [2, 1, 0], state: "minecraft:air"},
{pos: [2, 1, 1], state: "minecraft:air"},
{pos: [2, 1, 2], state: "minecraft:air"},
{pos: [2, 1, 3], state: "minecraft:air"},
{pos: [2, 1, 4], state: "minecraft:air"},
{pos: [3, 1, 0], state: "minecraft:air"},
{pos: [3, 1, 1], state: "minecraft:air"},
{pos: [3, 1, 2], state: "minecraft:air"},
{pos: [3, 1, 3], state: "computercraft:turtle_normal{facing:west,waterlogged:false}", nbt: {ComputerId: 8, Fuel: 0, Items: [], Label: "Dinnerbone", On: 1b, Owner: {LowerId: -7931330074873442406L, Name: "Player848", UpperId: 7430876841693101418L}, RightUpgrade: "minecraft:diamond_pickaxe", RightUpgradeNbt: {Tag: {Damage: 0}}, Slot: 0, id: "computercraft:turtle_normal"}},
{pos: [3, 1, 4], state: "minecraft:air"},
{pos: [4, 1, 0], state: "minecraft:air"},
{pos: [4, 1, 1], state: "minecraft:air"},
{pos: [4, 1, 2], state: "minecraft:air"},
{pos: [4, 1, 3], state: "minecraft:air"},
{pos: [4, 1, 4], state: "minecraft:air"},
{pos: [0, 2, 0], state: "minecraft:air"},
{pos: [0, 2, 1], state: "minecraft:air"},
{pos: [0, 2, 2], state: "minecraft:air"},
{pos: [0, 2, 3], state: "minecraft:air"},
{pos: [0, 2, 4], state: "minecraft:air"},
{pos: [1, 2, 0], state: "minecraft:air"},
{pos: [1, 2, 1], state: "minecraft:air"},
{pos: [1, 2, 2], state: "minecraft:air"},
{pos: [1, 2, 3], state: "minecraft:air"},
{pos: [1, 2, 4], state: "minecraft:air"},
{pos: [2, 2, 0], state: "minecraft:air"},
{pos: [2, 2, 1], state: "minecraft:air"},
{pos: [2, 2, 2], state: "minecraft:air"},
{pos: [2, 2, 3], state: "minecraft:air"},
{pos: [2, 2, 4], state: "minecraft:air"},
{pos: [3, 2, 0], state: "minecraft:air"},
{pos: [3, 2, 1], state: "minecraft:air"},
{pos: [3, 2, 2], state: "minecraft:air"},
{pos: [3, 2, 3], state: "minecraft:air"},
{pos: [3, 2, 4], state: "minecraft:air"},
{pos: [4, 2, 0], state: "minecraft:air"},
{pos: [4, 2, 1], state: "minecraft:air"},
{pos: [4, 2, 2], state: "minecraft:air"},
{pos: [4, 2, 3], state: "minecraft:air"},
{pos: [4, 2, 4], state: "minecraft:air"},
{pos: [0, 3, 0], state: "minecraft:air"},
{pos: [0, 3, 1], state: "minecraft:air"},
{pos: [0, 3, 2], state: "minecraft:air"},
{pos: [0, 3, 3], state: "minecraft:air"},
{pos: [0, 3, 4], state: "minecraft:air"},
{pos: [1, 3, 0], state: "minecraft:air"},
{pos: [1, 3, 1], state: "minecraft:air"},
{pos: [1, 3, 2], state: "minecraft:air"},
{pos: [1, 3, 3], state: "computercraft:turtle_normal{facing:east,waterlogged:false}", nbt: {ComputerId: 8, Fuel: 0, Items: [], Label: "Dinnerbone", LeftUpgrade: "cctest:netherite_pickaxe", LeftUpgradeNbt: {Tag: {Damage: 0, Enchantments: [{id: "minecraft:efficiency", lvl: 5s}], RepairCost: 1}}, On: 1b, Owner: {LowerId: -7931330074873442406L, Name: "Player848", UpperId: 7430876841693101418L}, Slot: 0, id: "computercraft:turtle_normal"}},
{pos: [1, 3, 4], state: "minecraft:air"},
{pos: [2, 3, 0], state: "minecraft:air"},
{pos: [2, 3, 1], state: "minecraft:air"},
{pos: [2, 3, 2], state: "minecraft:air"},
{pos: [2, 3, 3], state: "minecraft:air"},
{pos: [2, 3, 4], state: "minecraft:air"},
{pos: [3, 3, 0], state: "minecraft:air"},
{pos: [3, 3, 1], state: "minecraft:air"},
{pos: [3, 3, 2], state: "minecraft:air"},
{pos: [3, 3, 3], state: "computercraft:turtle_normal{facing:west,waterlogged:false}", nbt: {ComputerId: 8, Fuel: 0, Items: [], On: 1b, Owner: {LowerId: -7931330074873442406L, Name: "Player848", UpperId: 7430876841693101418L}, RightUpgrade: "minecraft:diamond_pickaxe", RightUpgradeNbt: {Tag: {Damage: 0}}, Slot: 0, id: "computercraft:turtle_normal"}},
{pos: [3, 3, 4], state: "minecraft:air"},
{pos: [4, 3, 0], state: "minecraft:air"},
{pos: [4, 3, 1], state: "minecraft:air"},
{pos: [4, 3, 2], state: "minecraft:air"},
{pos: [4, 3, 3], state: "minecraft:air"},
{pos: [4, 3, 4], state: "minecraft:air"},
{pos: [0, 4, 0], state: "minecraft:air"},
{pos: [0, 4, 1], state: "minecraft:air"},
{pos: [0, 4, 2], state: "minecraft:air"},
{pos: [0, 4, 3], state: "minecraft:air"},
{pos: [0, 4, 4], state: "minecraft:air"},
{pos: [1, 4, 0], state: "minecraft:air"},
{pos: [1, 4, 1], state: "minecraft:air"},
{pos: [1, 4, 2], state: "minecraft:air"},
{pos: [1, 4, 3], state: "minecraft:air"},
{pos: [1, 4, 4], state: "minecraft:air"},
{pos: [2, 4, 0], state: "minecraft:air"},
{pos: [2, 4, 1], state: "minecraft:air"},
{pos: [2, 4, 2], state: "minecraft:air"},
{pos: [2, 4, 3], state: "minecraft:air"},
{pos: [2, 4, 4], state: "minecraft:air"},
{pos: [3, 4, 0], state: "minecraft:air"},
{pos: [3, 4, 1], state: "minecraft:air"},
{pos: [3, 4, 2], state: "minecraft:air"},
{pos: [3, 4, 3], state: "minecraft:air"},
{pos: [3, 4, 4], state: "minecraft:air"},
{pos: [4, 4, 0], state: "minecraft:air"},
{pos: [4, 4, 1], state: "minecraft:air"},
{pos: [4, 4, 2], state: "minecraft:air"},
{pos: [4, 4, 3], state: "minecraft:air"},
{pos: [4, 4, 4], state: "minecraft:air"}
],
entities: [
{blockPos: [2, 1, 0], pos: [2.52408694606693d, 1.0d, 0.6487863808268131d], nbt: {AbsorptionAmount: 0.0f, Air: 300s, ArmorItems: [{}, {}, {}, {}], Attributes: [{Base: 0.699999988079071d, Name: "minecraft:generic.movement_speed"}], Brain: {memories: {}}, CustomName: '{"text":"turtle_test.render_turtle_blocks"}', DeathTime: 0s, DisabledSlots: 0, FallDistance: 0.0f, FallFlying: 0b, Fire: -1s, HandItems: [{}, {}], Health: 20.0f, HurtByTimestamp: 0, HurtTime: 0s, Invisible: 1b, Invulnerable: 0b, Marker: 1b, Motion: [0.0d, 0.0d, 0.0d], NoBasePlate: 0b, OnGround: 0b, PortalCooldown: 0, Pos: [124.52408694606693d, -58.0d, 50.64878638082681d], Pose: {}, Rotation: [0.14965993f, 4.066999f], ShowArms: 0b, Small: 0b, UUID: [I; 755114464, 1289439453, -2088751844, 985194758], id: "minecraft:armor_stand"}}
],
palette: [
"minecraft:polished_andesite",
"minecraft:air",
"computercraft:turtle_normal{facing:east,waterlogged:false}",
"computercraft:turtle_normal{facing:west,waterlogged:false}"
]
}

View File

@ -0,0 +1,142 @@
{
DataVersion: 3337,
size: [5, 5, 5],
data: [
{pos: [0, 0, 0], state: "minecraft:polished_andesite"},
{pos: [0, 0, 1], state: "minecraft:polished_andesite"},
{pos: [0, 0, 2], state: "minecraft:polished_andesite"},
{pos: [0, 0, 3], state: "minecraft:polished_andesite"},
{pos: [0, 0, 4], state: "minecraft:polished_andesite"},
{pos: [1, 0, 0], state: "minecraft:polished_andesite"},
{pos: [1, 0, 1], state: "minecraft:polished_andesite"},
{pos: [1, 0, 2], state: "minecraft:polished_andesite"},
{pos: [1, 0, 3], state: "minecraft:polished_andesite"},
{pos: [1, 0, 4], state: "minecraft:polished_andesite"},
{pos: [2, 0, 0], state: "minecraft:polished_andesite"},
{pos: [2, 0, 1], state: "minecraft:polished_andesite"},
{pos: [2, 0, 2], state: "minecraft:polished_andesite"},
{pos: [2, 0, 3], state: "minecraft:polished_andesite"},
{pos: [2, 0, 4], state: "minecraft:polished_andesite"},
{pos: [3, 0, 0], state: "minecraft:polished_andesite"},
{pos: [3, 0, 1], state: "minecraft:polished_andesite"},
{pos: [3, 0, 2], state: "minecraft:polished_andesite"},
{pos: [3, 0, 3], state: "minecraft:polished_andesite"},
{pos: [3, 0, 4], state: "minecraft:polished_andesite"},
{pos: [4, 0, 0], state: "minecraft:polished_andesite"},
{pos: [4, 0, 1], state: "minecraft:polished_andesite"},
{pos: [4, 0, 2], state: "minecraft:polished_andesite"},
{pos: [4, 0, 3], state: "minecraft:polished_andesite"},
{pos: [4, 0, 4], state: "minecraft:polished_andesite"},
{pos: [0, 1, 0], state: "minecraft:air"},
{pos: [0, 1, 1], state: "minecraft:air"},
{pos: [0, 1, 2], state: "minecraft:air"},
{pos: [0, 1, 3], state: "minecraft:air"},
{pos: [0, 1, 4], state: "minecraft:air"},
{pos: [1, 1, 0], state: "minecraft:air"},
{pos: [1, 1, 1], state: "minecraft:air"},
{pos: [1, 1, 2], state: "minecraft:air"},
{pos: [1, 1, 3], state: "minecraft:air"},
{pos: [1, 1, 4], state: "minecraft:air"},
{pos: [2, 1, 0], state: "minecraft:air"},
{pos: [2, 1, 1], state: "minecraft:air"},
{pos: [2, 1, 2], state: "minecraft:air"},
{pos: [2, 1, 3], state: "minecraft:air"},
{pos: [2, 1, 4], state: "minecraft:air"},
{pos: [3, 1, 0], state: "minecraft:air"},
{pos: [3, 1, 1], state: "minecraft:air"},
{pos: [3, 1, 2], state: "minecraft:air"},
{pos: [3, 1, 3], state: "minecraft:air"},
{pos: [3, 1, 4], state: "minecraft:air"},
{pos: [4, 1, 0], state: "minecraft:air"},
{pos: [4, 1, 1], state: "minecraft:air"},
{pos: [4, 1, 2], state: "minecraft:air"},
{pos: [4, 1, 3], state: "minecraft:air"},
{pos: [4, 1, 4], state: "minecraft:air"},
{pos: [0, 2, 0], state: "minecraft:air"},
{pos: [0, 2, 1], state: "minecraft:air"},
{pos: [0, 2, 2], state: "minecraft:air"},
{pos: [0, 2, 3], state: "minecraft:air"},
{pos: [0, 2, 4], state: "minecraft:air"},
{pos: [1, 2, 0], state: "minecraft:air"},
{pos: [1, 2, 1], state: "minecraft:air"},
{pos: [1, 2, 2], state: "minecraft:air"},
{pos: [1, 2, 3], state: "minecraft:air"},
{pos: [1, 2, 4], state: "minecraft:air"},
{pos: [2, 2, 0], state: "minecraft:air"},
{pos: [2, 2, 1], state: "minecraft:air"},
{pos: [2, 2, 2], state: "minecraft:air"},
{pos: [2, 2, 3], state: "minecraft:air"},
{pos: [2, 2, 4], state: "minecraft:air"},
{pos: [3, 2, 0], state: "minecraft:air"},
{pos: [3, 2, 1], state: "minecraft:air"},
{pos: [3, 2, 2], state: "minecraft:air"},
{pos: [3, 2, 3], state: "minecraft:air"},
{pos: [3, 2, 4], state: "minecraft:air"},
{pos: [4, 2, 0], state: "minecraft:air"},
{pos: [4, 2, 1], state: "minecraft:air"},
{pos: [4, 2, 2], state: "minecraft:air"},
{pos: [4, 2, 3], state: "minecraft:air"},
{pos: [4, 2, 4], state: "minecraft:air"},
{pos: [0, 3, 0], state: "minecraft:air"},
{pos: [0, 3, 1], state: "minecraft:air"},
{pos: [0, 3, 2], state: "minecraft:air"},
{pos: [0, 3, 3], state: "minecraft:air"},
{pos: [0, 3, 4], state: "minecraft:air"},
{pos: [1, 3, 0], state: "minecraft:air"},
{pos: [1, 3, 1], state: "minecraft:air"},
{pos: [1, 3, 2], state: "minecraft:air"},
{pos: [1, 3, 3], state: "minecraft:air"},
{pos: [1, 3, 4], state: "minecraft:air"},
{pos: [2, 3, 0], state: "minecraft:air"},
{pos: [2, 3, 1], state: "minecraft:air"},
{pos: [2, 3, 2], state: "minecraft:air"},
{pos: [2, 3, 3], state: "minecraft:air"},
{pos: [2, 3, 4], state: "minecraft:air"},
{pos: [3, 3, 0], state: "minecraft:air"},
{pos: [3, 3, 1], state: "minecraft:air"},
{pos: [3, 3, 2], state: "minecraft:air"},
{pos: [3, 3, 3], state: "minecraft:air"},
{pos: [3, 3, 4], state: "minecraft:air"},
{pos: [4, 3, 0], state: "minecraft:air"},
{pos: [4, 3, 1], state: "minecraft:air"},
{pos: [4, 3, 2], state: "minecraft:air"},
{pos: [4, 3, 3], state: "minecraft:air"},
{pos: [4, 3, 4], state: "minecraft:air"},
{pos: [0, 4, 0], state: "minecraft:air"},
{pos: [0, 4, 1], state: "minecraft:air"},
{pos: [0, 4, 2], state: "minecraft:air"},
{pos: [0, 4, 3], state: "minecraft:air"},
{pos: [0, 4, 4], state: "minecraft:air"},
{pos: [1, 4, 0], state: "minecraft:air"},
{pos: [1, 4, 1], state: "minecraft:air"},
{pos: [1, 4, 2], state: "minecraft:air"},
{pos: [1, 4, 3], state: "minecraft:air"},
{pos: [1, 4, 4], state: "minecraft:air"},
{pos: [2, 4, 0], state: "minecraft:air"},
{pos: [2, 4, 1], state: "minecraft:air"},
{pos: [2, 4, 2], state: "minecraft:air"},
{pos: [2, 4, 3], state: "minecraft:air"},
{pos: [2, 4, 4], state: "minecraft:air"},
{pos: [3, 4, 0], state: "minecraft:air"},
{pos: [3, 4, 1], state: "minecraft:air"},
{pos: [3, 4, 2], state: "minecraft:air"},
{pos: [3, 4, 3], state: "minecraft:air"},
{pos: [3, 4, 4], state: "minecraft:air"},
{pos: [4, 4, 0], state: "minecraft:air"},
{pos: [4, 4, 1], state: "minecraft:air"},
{pos: [4, 4, 2], state: "minecraft:air"},
{pos: [4, 4, 3], state: "minecraft:air"},
{pos: [4, 4, 4], state: "minecraft:air"}
],
entities: [
{blockPos: [2, 1, 0], pos: [2.5d, 1.0d, 0.5d], nbt: {AbsorptionAmount: 0.0f, Air: 300s, ArmorItems: [{}, {}, {}, {}], Attributes: [{Base: 0.699999988079071d, Name: "minecraft:generic.movement_speed"}], Brain: {memories: {}}, CustomName: '{"text":"turtle_test.render_turtle_items"}', DeathTime: 0s, DisabledSlots: 0, FallDistance: 0.0f, FallFlying: 0b, Fire: -1s, HandItems: [{}, {}], Health: 20.0f, HurtByTimestamp: 0, HurtTime: 0s, Invisible: 1b, Invulnerable: 0b, Marker: 1b, Motion: [0.0d, 0.0d, 0.0d], NoBasePlate: 0b, OnGround: 0b, PortalCooldown: 0, Pos: [125.5d, -58.0d, 53.6501934495752d], Pose: {}, Rotation: [0.14965993f, 4.066999f], ShowArms: 0b, Small: 0b, UUID: [I; -1678989666, 1780632657, -1267321893, 665166246], id: "minecraft:armor_stand"}},
{blockPos: [3, 1, 3], pos: [3.5d, 1.5d, 3.5d], nbt: {Air: 300s, FallDistance: 0.0f, Fire: 0s, Invulnerable: 0b, Motion: [0.0d, 0.0d, 0.0d], OnGround: 0b, PortalCooldown: 0, Pos: [126.5d, -57.5d, 56.5d], Rotation: [-90.0f, 0.0f], UUID: [I; 671334450, -268547745, -1360971514, -649716242], billboard: "fixed", glow_color_override: -1, height: 0.0f, id: "minecraft:item_display", interpolation_duration: 0, item: {Count: 1b, id: "computercraft:turtle_normal", tag: {ComputerId: 8, Fuel: 0, Items: [], display: {Name: '{"text":"Dinnerbone"}'}, On: 1b, RightUpgrade: "minecraft:diamond_pickaxe", RightUpgradeNbt: {Tag: {Damage: 0}}}}, item_display: "none", shadow_radius: 0.0f, shadow_strength: 1.0f, transformation: {left_rotation: [0.0f, 0.0f, 0.0f, 1.0f], right_rotation: [0.0f, 0.0f, 0.0f, 1.0f], scale: [1.0f, 1.0f, 1.0f], translation: [0.0f, 0.0f, 0.0f]}, view_range: 1.0f, width: 0.0f}},
{blockPos: [3, 3, 3], pos: [3.5d, 3.5d, 3.5d], nbt: {Air: 300s, FallDistance: 0.0f, Fire: 0s, Invulnerable: 0b, Motion: [0.0d, 0.0d, 0.0d], OnGround: 0b, PortalCooldown: 0, Pos: [126.5d, -57.5d, 56.5d], Rotation: [-90.0f, 0.0f], UUID: [I; 671334422, -268542345, -1362491514, -649716242], billboard: "fixed", glow_color_override: -1, height: 0.0f, id: "minecraft:item_display", interpolation_duration: 0, item: {Count: 1b, id: "computercraft:turtle_normal", tag: {ComputerId: 8, Fuel: 0, Items: [], On: 1b, RightUpgrade: "minecraft:diamond_pickaxe", RightUpgradeNbt: {Tag: {Damage: 0}}}}, item_display: "none", shadow_radius: 0.0f, shadow_strength: 1.0f, transformation: {left_rotation: [0.0f, 0.0f, 0.0f, 1.0f], right_rotation: [0.0f, 0.0f, 0.0f, 1.0f], scale: [1.0f, 1.0f, 1.0f], translation: [0.0f, 0.0f, 0.0f]}, view_range: 1.0f, width: 0.0f}},
{blockPos: [1, 1, 3], pos: [1.5d, 1.5d, 3.5d], nbt: {Air: 300s, FallDistance: 0.0f, Fire: 0s, Invulnerable: 0b, Motion: [0.0d, 0.0d, 0.0d], OnGround: 0b, PortalCooldown: 0, Pos: [126.5d, -57.5d, 56.5d], Rotation: [90.0f, 0.0f], UUID: [I; 625334450, -268647745, -1360971514, -649724242], billboard: "fixed", glow_color_override: -1, height: 0.0f, id: "minecraft:item_display", interpolation_duration: 0, item: {Count: 1b, id: "computercraft:turtle_normal", tag: {ComputerId: 8, Fuel: 0, Items: [], On: 1b, LeftUpgrade: "cctest:netherite_pickaxe", LeftUpgradeNbt: {Tag: {Damage: 0, Enchantments: [{id: "minecraft:efficiency", lvl: 5s}], RepairCost: 1}}}}, item_display: "none", shadow_radius: 0.0f, shadow_strength: 1.0f, transformation: {left_rotation: [0.0f, 0.0f, 0.0f, 1.0f], right_rotation: [0.0f, 0.0f, 0.0f, 1.0f], scale: [1.0f, 1.0f, 1.0f], translation: [0.0f, 0.0f, 0.0f]}, view_range: 1.0f, width: 0.0f}},
{blockPos: [1, 3, 3], pos: [1.5d, 3.5d, 3.5d], nbt: {Air: 300s, FallDistance: 0.0f, Fire: 0s, Invulnerable: 0b, Motion: [0.0d, 0.0d, 0.0d], OnGround: 0b, PortalCooldown: 0, Pos: [126.5d, -57.5d, 56.5d], Rotation: [90.0f, 0.0f], UUID: [I; 675334422, -268542245, -1362491514, -649755242], billboard: "fixed", glow_color_override: -1, height: 0.0f, id: "minecraft:item_display", interpolation_duration: 0, item: {Count: 1b, id: "computercraft:turtle_normal", tag: {ComputerId: 8, Fuel: 0, Items: [], display: {Name: '{"text":"Dinnerbone"}'}, On: 1b, LeftUpgrade: "cctest:netherite_pickaxe", LeftUpgradeNbt: {Tag: {Damage: 0, Enchantments: [{id: "minecraft:efficiency", lvl: 5s}], RepairCost: 1}}}}, item_display: "none", shadow_radius: 0.0f, shadow_strength: 1.0f, transformation: {left_rotation: [0.0f, 0.0f, 0.0f, 1.0f], right_rotation: [0.0f, 0.0f, 0.0f, 1.0f], scale: [1.0f, 1.0f, 1.0f], translation: [0.0f, 0.0f, 0.0f]}, view_range: 1.0f, width: 0.0f}}
],
palette: [
"minecraft:polished_andesite",
"minecraft:air"
]
}

View File

@ -6,40 +6,34 @@
import dan200.computercraft.api.lua.ILuaAPI;
/**
* A wrapper for {@link ILuaAPI}s which cleans up after a {@link ComputerSystem} when the computer is shutdown.
*/
final class ApiWrapper implements ILuaAPI {
private final ILuaAPI delegate;
private final ComputerSystem system;
import javax.annotation.Nullable;
ApiWrapper(ILuaAPI delegate, ComputerSystem system) {
this.delegate = delegate;
/**
* A wrapper for {@link ILuaAPI}s which optionally manages the lifecycle of a {@link ComputerSystem}.
*/
final class ApiWrapper {
private final ILuaAPI api;
private final @Nullable ComputerSystem system;
ApiWrapper(ILuaAPI api, @Nullable ComputerSystem system) {
this.api = api;
this.system = system;
}
@Override
public String[] getNames() {
return delegate.getNames();
}
@Override
public void startup() {
delegate.startup();
api.startup();
}
@Override
public void update() {
delegate.update();
api.update();
}
@Override
public void shutdown() {
delegate.shutdown();
system.unmountAll();
api.shutdown();
if (system != null) system.unmountAll();
}
public ILuaAPI getDelegate() {
return delegate;
public ILuaAPI api() {
return api;
}
}

View File

@ -61,7 +61,7 @@ final class ComputerExecutor {
private final Computer computer;
private final ComputerEnvironment computerEnvironment;
private final MetricsObserver metrics;
private final List<ILuaAPI> apis = new ArrayList<>();
private final List<ApiWrapper> apis = new ArrayList<>();
private final ComputerThread scheduler;
private final MethodSupplier<LuaMethod> luaMethods;
final TimeoutState timeout;
@ -177,12 +177,12 @@ final class ComputerExecutor {
var environment = computer.getEnvironment();
// Add all default APIs to the loaded list.
apis.add(new TermAPI(environment));
apis.add(new RedstoneAPI(environment));
apis.add(new FSAPI(environment));
apis.add(new PeripheralAPI(environment, context.peripheralMethods()));
apis.add(new OSAPI(environment));
if (CoreConfig.httpEnabled) apis.add(new HTTPAPI(environment));
addApi(new TermAPI(environment));
addApi(new RedstoneAPI(environment));
addApi(new FSAPI(environment));
addApi(new PeripheralAPI(environment, context.peripheralMethods()));
addApi(new OSAPI(environment));
if (CoreConfig.httpEnabled) addApi(new HTTPAPI(environment));
// Load in the externally registered APIs.
for (var factory : context.apiFactories()) {
@ -207,7 +207,7 @@ Computer getComputer() {
}
void addApi(ILuaAPI api) {
apis.add(api);
apis.add(new ApiWrapper(api, null));
}
/**
@ -385,7 +385,7 @@ private ILuaMachine createLuaMachine() {
try (var bios = biosStream) {
return luaFactory.create(new MachineEnvironment(
new LuaContext(computer), metrics, timeout,
() -> apis.stream().map(api -> api instanceof ApiWrapper wrapper ? wrapper.getDelegate() : api).iterator(),
() -> apis.stream().map(ApiWrapper::api).iterator(),
luaMethods,
computer.getGlobalEnvironment().getHostString()
), bios);

View File

@ -26,7 +26,7 @@ which program to run:
uses the @{shell.path|program path}. This is a colon separated list of
directories, each of which is checked to see if it contains the program.
`list` or `list.lua` doesn't exist in `.` (the current directory), so she
`list` or `list.lua` doesn't exist in `.` (the current directory), so the
shell now looks in `/rom/programs`, where `list.lua` can be found!
3. Finally, the shell reads the file and checks if the file starts with a

View File

@ -4,6 +4,7 @@
package dan200.computercraft.core;
import com.google.common.base.Splitter;
import dan200.computercraft.api.filesystem.WritableMount;
import dan200.computercraft.api.lua.ILuaAPI;
import dan200.computercraft.api.lua.LuaException;
@ -346,10 +347,10 @@ public final void start(Map<?, ?> tests) throws LuaException {
var details = (Map<?, ?>) entry.getValue();
var def = (String) details.get("definition");
var parts = name.split("\0");
var parts = Splitter.on('\0').splitToList(name);
var builder = root;
for (var i = 0; i < parts.length - 1; i++) builder = builder.get(parts[i]);
builder.runs(parts[parts.length - 1], def, () -> {
for (var i = 0; i < parts.size() - 1; i++) builder = builder.get(parts.get(i));
builder.runs(parts.get(parts.size() - 1), def, () -> {
// Run it
lock.lockInterruptibly();
try {

View File

@ -5,8 +5,7 @@
package dan200.computercraft.client;
import dan200.computercraft.api.ComputerCraftAPI;
import dan200.computercraft.client.model.EmissiveComputerModel;
import dan200.computercraft.client.model.turtle.TurtleModelLoader;
import dan200.computercraft.client.model.CustomModelLoader;
import dan200.computercraft.shared.ModRegistry;
import dan200.computercraft.shared.config.ConfigSpec;
import dan200.computercraft.shared.network.client.ClientNetworkContext;
@ -15,7 +14,7 @@
import dan200.computercraft.shared.platform.NetworkHandler;
import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.client.model.ModelLoadingRegistry;
import net.fabricmc.fabric.api.client.model.loading.v1.PreparableModelLoadingPlugin;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry;
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
@ -40,9 +39,12 @@ public static void init() {
ClientRegistry.registerItemColours(ColorProviderRegistry.ITEM::register);
ClientRegistry.registerMainThread();
ModelLoadingRegistry.INSTANCE.registerModelProvider((manager, out) -> ClientRegistry.registerExtraModels(out));
ModelLoadingRegistry.INSTANCE.registerResourceProvider(loader -> (path, ctx) -> TurtleModelLoader.load(loader, path));
ModelLoadingRegistry.INSTANCE.registerResourceProvider(loader -> (path, ctx) -> EmissiveComputerModel.load(loader, path));
PreparableModelLoadingPlugin.register(CustomModelLoader::prepare, (state, context) -> {
ClientRegistry.registerExtraModels(context::addModels);
context.resolveModel().register(ctx -> state.loadModel(ctx.id()));
context.modifyModelAfterBake().register((model, ctx) -> model == null ? null : state.wrapModel(ctx, model));
});
BlockRenderLayerMap.INSTANCE.putBlock(ModRegistry.Blocks.COMPUTER_NORMAL.get(), RenderType.cutout());
BlockRenderLayerMap.INSTANCE.putBlock(ModRegistry.Blocks.COMPUTER_COMMAND.get(), RenderType.cutout());
BlockRenderLayerMap.INSTANCE.putBlock(ModRegistry.Blocks.COMPUTER_ADVANCED.get(), RenderType.cutout());

View File

@ -4,24 +4,33 @@
package dan200.computercraft.client.model;
import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel;
import net.fabricmc.fabric.api.renderer.v1.model.ForwardingBakedModel;
import net.fabricmc.fabric.api.renderer.v1.render.RenderContext;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.util.RandomSource;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.block.state.BlockState;
import javax.annotation.Nullable;
import java.util.*;
import java.util.function.Supplier;
import java.util.stream.Stream;
/**
* A {@link BakedModel} formed from two or more other models stitched together.
*/
public class CompositeBakedModel extends CustomBakedModel {
public class CompositeBakedModel extends ForwardingBakedModel {
private final boolean isVanillaAdapter;
private final List<BakedModel> models;
public CompositeBakedModel(List<BakedModel> models) {
super(models.get(0));
wrapped = models.get(0);
isVanillaAdapter = models.stream().allMatch(FabricBakedModel::isVanillaAdapter);
this.models = models;
}
@ -29,6 +38,11 @@ public static BakedModel of(List<BakedModel> models) {
return models.size() == 1 ? models.get(0) : new CompositeBakedModel(models);
}
@Override
public boolean isVanillaAdapter() {
return isVanillaAdapter;
}
@Override
public List<BakedQuad> getQuads(@Nullable BlockState blockState, @Nullable Direction face, RandomSource rand) {
@SuppressWarnings({ "unchecked", "rawtypes" })
@ -39,6 +53,16 @@ public List<BakedQuad> getQuads(@Nullable BlockState blockState, @Nullable Direc
return new ConcatListView(quads);
}
@Override
public void emitBlockQuads(BlockAndTintGetter blockView, BlockState state, BlockPos pos, Supplier<RandomSource> randomSupplier, RenderContext context) {
for (var model : models) model.emitBlockQuads(blockView, state, pos, randomSupplier, context);
}
@Override
public void emitItemQuads(ItemStack stack, Supplier<RandomSource> randomSupplier, RenderContext context) {
for (var model : models) model.emitItemQuads(stack, randomSupplier, context);
}
private static final class ConcatListView extends AbstractList<BakedQuad> {
private final List<BakedQuad>[] quads;

View File

@ -1,42 +0,0 @@
// SPDX-FileCopyrightText: 2022 The CC: Tweaked Developers
//
// SPDX-License-Identifier: MPL-2.0
package dan200.computercraft.client.model;
import net.fabricmc.fabric.api.renderer.v1.model.ForwardingBakedModel;
import net.fabricmc.fabric.api.renderer.v1.render.RenderContext;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.util.RandomSource;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.block.state.BlockState;
import javax.annotation.Nullable;
import java.util.List;
import java.util.function.Supplier;
/**
* A subclass of {@link ForwardingBakedModel} which doesn't forward rendering.
*/
public abstract class CustomBakedModel extends ForwardingBakedModel {
public CustomBakedModel(BakedModel wrapped) {
this.wrapped = wrapped;
}
@Override
public abstract List<BakedQuad> getQuads(@Nullable BlockState blockState, @Nullable Direction face, RandomSource rand);
@Override
public final void emitBlockQuads(BlockAndTintGetter blockView, BlockState state, BlockPos pos, Supplier<RandomSource> randomSupplier, RenderContext context) {
context.bakedModelConsumer().accept(this);
}
@Override
public final void emitItemQuads(ItemStack stack, Supplier<RandomSource> randomSupplier, RenderContext context) {
context.bakedModelConsumer().accept(this);
}
}

View File

@ -0,0 +1,127 @@
// SPDX-FileCopyrightText: 2023 The CC: Tweaked Developers
//
// SPDX-License-Identifier: MPL-2.0
package dan200.computercraft.client.model;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import dan200.computercraft.api.ComputerCraftAPI;
import dan200.computercraft.client.model.turtle.UnbakedTurtleModel;
import dan200.computercraft.mixin.client.BlockModelAccessor;
import net.fabricmc.fabric.api.client.model.loading.v1.ModelModifier;
import net.fabricmc.fabric.api.client.model.loading.v1.PreparableModelLoadingPlugin;
import net.minecraft.client.renderer.block.model.BlockModel;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.client.resources.model.UnbakedModel;
import net.minecraft.resources.FileToIdConverter;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.packs.resources.Resource;
import net.minecraft.server.packs.resources.ResourceManager;
import net.minecraft.util.GsonHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.Nullable;
import java.io.IOException;
import java.io.Reader;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
/**
* Provides custom model loading for various CC models.
* <p>
* This is used from a {@link PreparableModelLoadingPlugin}, which {@linkplain #prepare(ResourceManager, Executor) loads
* data from disk} in parallel with other loader plugins, and then hooks into the model loading pipeline
* ({@link #loadModel(ResourceLocation)}, {@link #wrapModel(ModelModifier.AfterBake.Context, BakedModel)}).
*
* @see EmissiveBakedModel
* @see UnbakedTurtleModel
*/
public final class CustomModelLoader {
private static final Logger LOG = LoggerFactory.getLogger(CustomModelLoader.class);
private static final FileToIdConverter converter = FileToIdConverter.json("models");
private final Map<ResourceLocation, UnbakedModel> models = new HashMap<>();
private final Map<ResourceLocation, String> emissiveModels = new HashMap<>();
private CustomModelLoader() {
}
public static CompletableFuture<CustomModelLoader> prepare(ResourceManager resources, Executor executor) {
return CompletableFuture.supplyAsync(() -> {
var loader = new CustomModelLoader();
for (var resource : resources.listResources("models", x -> x.getNamespace().equals(ComputerCraftAPI.MOD_ID) && x.getPath().endsWith(".json")).entrySet()) {
loader.loadModel(resource.getKey(), resource.getValue());
}
return loader;
}, executor);
}
private void loadModel(ResourceLocation path, Resource resource) {
var id = converter.fileToId(path);
try {
JsonObject model;
try (Reader reader = resource.openAsReader()) {
model = GsonHelper.parse(reader).getAsJsonObject();
}
var loader = GsonHelper.getAsString(model, "loader", null);
if (loader != null) {
var unbaked = switch (loader) {
case ComputerCraftAPI.MOD_ID + ":turtle" -> UnbakedTurtleModel.parse(model);
default -> throw new JsonParseException("Unknown model loader " + loader);
};
models.put(id, unbaked);
}
var emissive = GsonHelper.getAsString(model, "computercraft:emissive_texture", null);
if (emissive != null) emissiveModels.put(id, emissive);
} catch (IllegalArgumentException | IOException | JsonParseException e) {
LOG.error("Couldn't parse model file {} from {}", id, path, e);
}
}
/**
* Load a custom model. This searches for CC models with a custom {@code loader} field.
*
* @param path The path of the model to load.
* @return The unbaked model that has been loaded, or {@code null} if the model should be loaded as a vanilla model.
*/
public @Nullable UnbakedModel loadModel(ResourceLocation path) {
return path.getNamespace().equals(ComputerCraftAPI.MOD_ID) ? models.get(path) : null;
}
/**
* Wrap a baked model.
* <p>
* This just finds models which specify an emissive texture ({@code computercraft:emissive_texture} in the JSON) and
* wraps them in a {@link EmissiveBakedModel}.
*
* @param ctx The current model loading context.
* @param baked The baked model to wrap.
* @return The wrapped model.
*/
public BakedModel wrapModel(ModelModifier.AfterBake.Context ctx, BakedModel baked) {
if (!ctx.id().getNamespace().equals(ComputerCraftAPI.MOD_ID)) return baked;
if (!(ctx.sourceModel() instanceof BlockModel model)) return baked;
var emissive = getEmissive(ctx.id(), model);
return emissive == null ? baked : EmissiveBakedModel.wrap(baked, ctx.textureGetter().apply(model.getMaterial(emissive)));
}
private @Nullable String getEmissive(ResourceLocation id, BlockModel model) {
while (true) {
var emissive = emissiveModels.get(id);
if (emissive != null) return emissive;
id = ((BlockModelAccessor) model).computercraft$getParentLocation();
model = ((BlockModelAccessor) model).computercraft$getParent();
if (id == null || model == null) return null;
}
}
}

View File

@ -0,0 +1,84 @@
// SPDX-FileCopyrightText: 2023 The CC: Tweaked Developers
//
// SPDX-License-Identifier: MPL-2.0
package dan200.computercraft.client.model;
import net.fabricmc.fabric.api.renderer.v1.RendererAccess;
import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial;
import net.fabricmc.fabric.api.renderer.v1.model.ForwardingBakedModel;
import net.fabricmc.fabric.api.renderer.v1.model.ModelHelper;
import net.fabricmc.fabric.api.renderer.v1.render.RenderContext;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.core.BlockPos;
import net.minecraft.util.RandomSource;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.block.state.BlockState;
import javax.annotation.Nullable;
import java.util.function.Supplier;
/**
* Wraps an arbitrary {@link BakedModel} to render a single texture as emissive.
* <p>
* While Fabric has a quite advanced rendering extension API (including support for custom materials), but unlike Forge
* it doesn't expose this in the model JSON (though externals mods like <a href="https://github.com/vram-guild/json-model-extensions/">JMX</a>
* do handle this).
* <p>
* Instead, we support emissive quads by injecting a {@linkplain CustomModelLoader custom model loader} which wraps the
* baked model in a {@link EmissiveBakedModel}, which renders specific quads as emissive.
*/
public final class EmissiveBakedModel extends ForwardingBakedModel {
private final TextureAtlasSprite emissiveTexture;
private final RenderMaterial defaultMaterial;
private final RenderMaterial emissiveMaterial;
private EmissiveBakedModel(BakedModel wrapped, TextureAtlasSprite emissiveTexture, RenderMaterial defaultMaterial, RenderMaterial emissiveMaterial) {
this.wrapped = wrapped;
this.emissiveTexture = emissiveTexture;
this.defaultMaterial = defaultMaterial;
this.emissiveMaterial = emissiveMaterial;
}
public static BakedModel wrap(BakedModel model, TextureAtlasSprite emissiveTexture) {
var renderer = RendererAccess.INSTANCE.getRenderer();
return renderer == null ? model : new EmissiveBakedModel(
model,
emissiveTexture,
renderer.materialFinder().find(),
renderer.materialFinder().emissive(true).find()
);
}
@Override
public boolean isVanillaAdapter() {
return false;
}
@Override
public void emitBlockQuads(BlockAndTintGetter blockView, BlockState state, BlockPos pos, Supplier<RandomSource> randomSupplier, RenderContext context) {
emitQuads(context, state, randomSupplier.get());
}
@Override
public void emitItemQuads(ItemStack stack, Supplier<RandomSource> randomSupplier, RenderContext context) {
emitQuads(context, null, randomSupplier.get());
}
private void emitQuads(RenderContext context, @Nullable BlockState state, RandomSource random) {
var emitter = context.getEmitter();
for (var faceIdx = 0; faceIdx <= ModelHelper.NULL_FACE_ID; faceIdx++) {
var cullFace = ModelHelper.faceFromIndex(faceIdx);
var quads = wrapped.getQuads(state, cullFace, random);
var count = quads.size();
for (var i = 0; i < count; i++) {
final var q = quads.get(i);
emitter.fromVanilla(q, q.getSprite() == emissiveTexture ? emissiveMaterial : defaultMaterial, cullFace);
emitter.emit();
}
}
}
}

View File

@ -1,172 +0,0 @@
// SPDX-FileCopyrightText: 2023 The CC: Tweaked Developers
//
// SPDX-License-Identifier: MPL-2.0
package dan200.computercraft.client.model;
import com.google.gson.JsonObject;
import com.mojang.datafixers.util.Either;
import dan200.computercraft.api.ComputerCraftAPI;
import net.fabricmc.fabric.api.client.model.ModelProviderException;
import net.fabricmc.fabric.api.client.model.ModelResourceProvider;
import net.fabricmc.fabric.api.renderer.v1.RendererAccess;
import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial;
import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel;
import net.fabricmc.fabric.api.renderer.v1.model.ForwardingBakedModel;
import net.fabricmc.fabric.api.renderer.v1.model.ModelHelper;
import net.fabricmc.fabric.api.renderer.v1.render.RenderContext;
import net.minecraft.client.renderer.block.model.BlockModel;
import net.minecraft.client.renderer.block.model.ItemTransforms;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.resources.model.*;
import net.minecraft.core.BlockPos;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.packs.resources.ResourceManager;
import net.minecraft.util.GsonHelper;
import net.minecraft.util.RandomSource;
import net.minecraft.world.inventory.InventoryMenu;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.block.state.BlockState;
import javax.annotation.Nullable;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.function.Supplier;
/**
* Wraps a computer's {@link BlockModel}/{@link BakedModel} to render the computer's cursor as an emissive quad.
* <p>
* While Fabric has a quite advanced rendering extension API (including support for custom materials), but unlike Forge
* it doesn't expose this in the model JSON (though externals mods like <a href="https://github.com/vram-guild/json-model-extensions/">JMX</a>
* do handle this).
* <p>
* Instead, we support emissive quads by injecting a custom {@linkplain ModelResourceProvider model loader/provider}
* which targets a hard-coded list of computer models, and wraps the returned model in a custom
* {@linkplain FabricBakedModel} implementation which renders specific quads as emissive.
* <p>
* See also the <code>assets/computercraft/models/block/computer_on.json</code> model, which is the base for all
* emissive computer models.
*/
public final class EmissiveComputerModel {
private static final Set<String> MODELS = Set.of(
"item/computer_advanced",
"block/computer_advanced_on",
"block/computer_advanced_blinking",
"item/computer_command",
"block/computer_command_on",
"block/computer_command_blinking",
"item/computer_normal",
"block/computer_normal_on",
"block/computer_normal_blinking"
);
private EmissiveComputerModel() {
}
public static @Nullable UnbakedModel load(ResourceManager resources, ResourceLocation path) throws ModelProviderException {
if (!path.getNamespace().equals(ComputerCraftAPI.MOD_ID) || !MODELS.contains(path.getPath())) return null;
JsonObject json;
try (var reader = resources.openAsReader(new ResourceLocation(path.getNamespace(), "models/" + path.getPath() + ".json"))) {
json = GsonHelper.parse(reader).getAsJsonObject();
} catch (IOException e) {
throw new ModelProviderException("Failed loading model " + path, e);
}
// Parse a subset of the model JSON
var parent = new ResourceLocation(GsonHelper.getAsString(json, "parent"));
Map<String, Either<Material, String>> textures = new HashMap<>();
if (json.has("textures")) {
var jsonObject = GsonHelper.getAsJsonObject(json, "textures");
for (var entry : jsonObject.entrySet()) {
var texture = entry.getValue().getAsString();
textures.put(entry.getKey(), texture.startsWith("#")
? Either.right(texture.substring(1))
: Either.left(new Material(InventoryMenu.BLOCK_ATLAS, new ResourceLocation(texture)))
);
}
}
return new Unbaked(parent, textures);
}
/**
* An {@link UnbakedModel} which wraps the returned model using {@link Baked}.
* <p>
* This subclasses {@link BlockModel} to allow using these models as a parent of other models.
*/
private static final class Unbaked extends BlockModel {
Unbaked(ResourceLocation parent, Map<String, Either<Material, String>> materials) {
super(parent, List.of(), materials, null, null, ItemTransforms.NO_TRANSFORMS, List.of());
}
@Override
public BakedModel bake(ModelBaker baker, Function<Material, TextureAtlasSprite> spriteGetter, ModelState state, ResourceLocation location) {
var baked = super.bake(baker, spriteGetter, state, location);
if (!hasTexture("cursor")) return baked;
var render = RendererAccess.INSTANCE.getRenderer();
if (render == null) return baked;
return new Baked(
baked,
spriteGetter.apply(getMaterial("cursor")),
render.materialFinder().find(),
render.materialFinder().emissive(0, true).find()
);
}
}
/**
* A {@link FabricBakedModel} which renders quads using the {@code "cursor"} texture as emissive.
*/
private static final class Baked extends ForwardingBakedModel {
private final TextureAtlasSprite cursor;
private final RenderMaterial defaultMaterial;
private final RenderMaterial emissiveMaterial;
Baked(BakedModel wrapped, TextureAtlasSprite cursor, RenderMaterial defaultMaterial, RenderMaterial emissiveMaterial) {
this.wrapped = wrapped;
this.cursor = cursor;
this.defaultMaterial = defaultMaterial;
this.emissiveMaterial = emissiveMaterial;
}
@Override
public boolean isVanillaAdapter() {
return false;
}
@Override
public void emitBlockQuads(BlockAndTintGetter blockView, BlockState state, BlockPos pos, Supplier<RandomSource> randomSupplier, RenderContext context) {
emitQuads(context, state, randomSupplier.get());
}
@Override
public void emitItemQuads(ItemStack stack, Supplier<RandomSource> randomSupplier, RenderContext context) {
emitQuads(context, null, randomSupplier.get());
}
private void emitQuads(RenderContext context, @Nullable BlockState state, RandomSource random) {
var emitter = context.getEmitter();
for (var faceIdx = 0; faceIdx <= ModelHelper.NULL_FACE_ID; faceIdx++) {
var cullFace = ModelHelper.faceFromIndex(faceIdx);
var quads = wrapped.getQuads(state, cullFace, random);
var count = quads.size();
for (var i = 0; i < count; i++) {
final var q = quads.get(i);
emitter.fromVanilla(q, q.getSprite() == cursor ? emissiveMaterial : defaultMaterial, cullFace);
emitter.emit();
}
}
}
}
}

View File

@ -0,0 +1,49 @@
// SPDX-FileCopyrightText: 2023 The CC: Tweaked Developers
//
// SPDX-License-Identifier: MPL-2.0
package dan200.computercraft.client.model;
import com.mojang.math.Transformation;
import dan200.computercraft.client.model.turtle.ModelTransformer;
import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView;
import net.fabricmc.fabric.api.renderer.v1.render.RenderContext;
import net.minecraft.core.Direction;
import org.joml.Vector3f;
/**
* Extends {@link ModelTransformer} to also work as a {@link RenderContext.QuadTransform}.
*/
public class FabricModelTransformer extends ModelTransformer implements RenderContext.QuadTransform {
public FabricModelTransformer(Transformation transformation) {
super(transformation);
}
@Override
public boolean transform(MutableQuadView quad) {
var vec3 = new Vector3f();
for (var i = 0; i < 4; i++) {
quad.copyPos(i, vec3);
transformation.transformPosition(vec3);
quad.pos(i, vec3);
}
if (invert) {
swapQuads(quad, 0, 3);
swapQuads(quad, 1, 2);
}
var face = quad.nominalFace();
if (face != null) quad.nominalFace(Direction.rotate(transformation, face));
return true;
}
private static void swapQuads(MutableQuadView quad, int a, int b) {
float aX = quad.x(a), aY = quad.y(a), aZ = quad.z(a), aU = quad.u(a), aV = quad.v(a);
float bX = quad.x(b), bY = quad.y(b), bZ = quad.z(b), bU = quad.u(b), bV = quad.v(b);
quad.pos(b, aX, aY, aZ).uv(b, aU, aV);
quad.pos(a, bX, bY, bZ).uv(a, bU, bV);
}
}

View File

@ -0,0 +1,79 @@
// SPDX-FileCopyrightText: 2023 The CC: Tweaked Developers
//
// SPDX-License-Identifier: MPL-2.0
package dan200.computercraft.client.model;
import dan200.computercraft.core.util.Nullability;
import net.fabricmc.fabric.api.renderer.v1.Renderer;
import net.fabricmc.fabric.api.renderer.v1.RendererAccess;
import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial;
import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView;
import net.fabricmc.fabric.api.renderer.v1.model.ForwardingBakedModel;
import net.fabricmc.fabric.api.renderer.v1.render.RenderContext;
import net.fabricmc.fabric.api.util.TriState;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.core.BlockPos;
import net.minecraft.util.RandomSource;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.block.state.BlockState;
import javax.annotation.Nullable;
import java.util.function.Supplier;
/**
* A model wrapper which applies a {@link RenderMaterial#glint() glint}/foil to the original model.
*/
public final class FoiledModel extends ForwardingBakedModel implements RenderContext.QuadTransform {
private final @Nullable Renderer renderer = RendererAccess.INSTANCE.getRenderer();
private @Nullable RenderMaterial lastMaterial, lastFoiledMaterial;
public FoiledModel(BakedModel model) {
wrapped = model;
}
@Override
public boolean isVanillaAdapter() {
return false;
}
@Override
public void emitBlockQuads(BlockAndTintGetter blockView, BlockState state, BlockPos pos, Supplier<RandomSource> randomSupplier, RenderContext context) {
context.pushTransform(this);
super.emitBlockQuads(blockView, state, pos, randomSupplier, context);
context.popTransform();
}
@Override
public void emitItemQuads(ItemStack stack, Supplier<RandomSource> randomSupplier, RenderContext context) {
context.pushTransform(this);
super.emitItemQuads(stack, randomSupplier, context);
context.popTransform();
}
@Override
public boolean equals(Object obj) {
return this == obj || (obj instanceof FoiledModel other && wrapped.equals(other.wrapped));
}
@Override
public int hashCode() {
return wrapped.hashCode() ^ 1;
}
@Override
public boolean transform(MutableQuadView quad) {
if (renderer == null) return true;
var material = quad.material();
if (material == lastMaterial) {
quad.material(Nullability.assertNonNull(lastFoiledMaterial));
} else {
lastMaterial = material;
quad.material(lastFoiledMaterial = renderer.materialFinder().copyFrom(material).glint(TriState.TRUE).find());
}
return true;
}
}

View File

@ -6,30 +6,49 @@
import com.mojang.math.Transformation;
import dan200.computercraft.client.model.turtle.ModelTransformer;
import net.fabricmc.fabric.api.renderer.v1.model.ForwardingBakedModel;
import net.fabricmc.fabric.api.renderer.v1.render.RenderContext;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.util.RandomSource;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.block.state.BlockState;
import javax.annotation.Nullable;
import java.util.List;
import java.util.function.Supplier;
/**
* A {@link BakedModel} which applies a transformation matrix to its underlying quads.
*
* @see ModelTransformer
*/
public class TransformedBakedModel extends CustomBakedModel {
private final ModelTransformer transformation;
public class TransformedBakedModel extends ForwardingBakedModel {
private final FabricModelTransformer transformation;
public TransformedBakedModel(BakedModel model, Transformation transformation) {
super(model);
this.transformation = new ModelTransformer(transformation);
wrapped = model;
this.transformation = new FabricModelTransformer(transformation);
}
@Override
public List<BakedQuad> getQuads(@Nullable BlockState blockState, @Nullable Direction face, RandomSource rand) {
return transformation.transform(wrapped.getQuads(blockState, face, rand));
}
@Override
public final void emitBlockQuads(BlockAndTintGetter blockView, BlockState state, BlockPos pos, Supplier<RandomSource> randomSupplier, RenderContext context) {
super.emitBlockQuads(blockView, state, pos, randomSupplier, context);
context.popTransform();
}
@Override
public final void emitItemQuads(ItemStack stack, Supplier<RandomSource> randomSupplier, RenderContext context) {
context.pushTransform(transformation);
super.emitItemQuads(stack, randomSupplier, context);
context.popTransform();
}
}

View File

@ -1,82 +0,0 @@
// SPDX-FileCopyrightText: 2022 The CC: Tweaked Developers
//
// SPDX-License-Identifier: MPL-2.0
package dan200.computercraft.client.model.turtle;
import dan200.computercraft.api.ComputerCraftAPI;
import net.fabricmc.fabric.api.client.model.ModelProviderException;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.resources.model.*;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.packs.resources.ResourceManager;
import net.minecraft.util.GsonHelper;
import javax.annotation.Nullable;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.function.Function;
/**
* A model "loader" (the concept doesn't quite exist in the same way as it does on Forge) for turtle item models.
* <p>
* This reads in the associated model file (typically {@code computercraft:block/turtle_xxx}) and wraps it in a
* {@link TurtleModel}.
*/
public final class TurtleModelLoader {
private static final ResourceLocation COLOUR_TURTLE_MODEL = new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_colour");
private TurtleModelLoader() {
}
public static @Nullable UnbakedModel load(ResourceManager resources, ResourceLocation path) throws ModelProviderException {
if (!path.getNamespace().equals(ComputerCraftAPI.MOD_ID)) return null;
if (!path.getPath().equals("item/turtle_normal") && !path.getPath().equals("item/turtle_advanced")) {
return null;
}
try (var reader = resources.openAsReader(new ResourceLocation(path.getNamespace(), "models/" + path.getPath() + ".json"))) {
var modelContents = GsonHelper.parse(reader).getAsJsonObject();
var loader = GsonHelper.getAsString(modelContents, "loader", null);
if (!Objects.equals(loader, ComputerCraftAPI.MOD_ID + ":turtle")) return null;
var model = new ResourceLocation(GsonHelper.getAsString(modelContents, "model"));
return new Unbaked(model);
} catch (IOException e) {
throw new ModelProviderException("Failed loading model " + path, e);
}
}
public static final class Unbaked implements UnbakedModel {
private final ResourceLocation model;
private Unbaked(ResourceLocation model) {
this.model = model;
}
@Override
public Collection<ResourceLocation> getDependencies() {
return List.of(model, COLOUR_TURTLE_MODEL);
}
@Override
public void resolveParents(Function<ResourceLocation, UnbakedModel> function) {
function.apply(model).resolveParents(function);
function.apply(COLOUR_TURTLE_MODEL).resolveParents(function);
}
@Override
public BakedModel bake(ModelBaker bakery, Function<Material, TextureAtlasSprite> spriteGetter, ModelState transform, ResourceLocation location) {
var mainModel = bakery.bake(model, transform);
if (mainModel == null) throw new NullPointerException(model + " failed to bake");
var colourModel = bakery.bake(COLOUR_TURTLE_MODEL, transform);
if (colourModel == null) throw new NullPointerException(COLOUR_TURTLE_MODEL + " failed to bake");
return new TurtleModel(mainModel, colourModel);
}
}
}

View File

@ -0,0 +1,59 @@
// SPDX-FileCopyrightText: 2022 The CC: Tweaked Developers
//
// SPDX-License-Identifier: MPL-2.0
package dan200.computercraft.client.model.turtle;
import com.google.gson.JsonObject;
import dan200.computercraft.api.ComputerCraftAPI;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.resources.model.*;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.GsonHelper;
import java.util.Collection;
import java.util.List;
import java.util.function.Function;
/**
* A {@link UnbakedModel} for {@link TurtleModel}s.
* <p>
* This reads in the associated model file (typically {@code computercraft:block/turtle_xxx}) and wraps it in a
* {@link TurtleModel}.
*/
public final class UnbakedTurtleModel implements UnbakedModel {
private static final ResourceLocation COLOUR_TURTLE_MODEL = new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_colour");
private final ResourceLocation model;
private UnbakedTurtleModel(ResourceLocation model) {
this.model = model;
}
public static UnbakedModel parse(JsonObject json) {
var model = new ResourceLocation(GsonHelper.getAsString(json, "model"));
return new UnbakedTurtleModel(model);
}
@Override
public Collection<ResourceLocation> getDependencies() {
return List.of(model, COLOUR_TURTLE_MODEL);
}
@Override
public void resolveParents(Function<ResourceLocation, UnbakedModel> function) {
function.apply(model).resolveParents(function);
function.apply(COLOUR_TURTLE_MODEL).resolveParents(function);
}
@Override
public BakedModel bake(ModelBaker bakery, Function<Material, TextureAtlasSprite> spriteGetter, ModelState transform, ResourceLocation location) {
var mainModel = bakery.bake(model, transform);
if (mainModel == null) throw new NullPointerException(model + " failed to bake");
var colourModel = bakery.bake(COLOUR_TURTLE_MODEL, transform);
if (colourModel == null) throw new NullPointerException(COLOUR_TURTLE_MODEL + " failed to bake");
return new TurtleModel(mainModel, colourModel);
}
}

View File

@ -5,17 +5,28 @@
package dan200.computercraft.client.platform;
import com.google.auto.service.AutoService;
import com.mojang.blaze3d.vertex.PoseStack;
import dan200.computercraft.client.model.FoiledModel;
import dan200.computercraft.client.render.ModelRenderer;
import dan200.computercraft.shared.network.NetworkMessage;
import dan200.computercraft.shared.network.server.ServerNetworkContext;
import dan200.computercraft.shared.platform.NetworkHandler;
import net.fabricmc.fabric.api.client.model.BakedModelManagerHelper;
import net.fabricmc.fabric.api.renderer.v1.model.ModelHelper;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.Sheets;
import net.minecraft.client.renderer.entity.ItemRenderer;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.client.resources.model.ModelManager;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.RandomSource;
import javax.annotation.Nullable;
@AutoService(dan200.computercraft.impl.client.ClientPlatformHelper.class)
public class ClientPlatformHelperImpl implements ClientPlatformHelper {
private static final RandomSource random = RandomSource.create(0);
@Override
public void sendToServer(NetworkMessage<ServerNetworkContext> message) {
Minecraft.getInstance().player.connection.send(NetworkHandler.encodeServer(message));
@ -23,7 +34,25 @@ public void sendToServer(NetworkMessage<ServerNetworkContext> message) {
@Override
public BakedModel getModel(ModelManager manager, ResourceLocation location) {
var model = BakedModelManagerHelper.getModel(manager, location);
var model = manager.getModel(location);
return model == null ? manager.getMissingModel() : model;
}
@Override
public BakedModel createdFoiledModel(BakedModel model) {
return new FoiledModel(model);
}
@Override
public void renderBakedModel(PoseStack transform, MultiBufferSource buffers, BakedModel model, int lightmapCoord, int overlayLight, @Nullable int[] tints) {
// Unfortunately we can't call Fabric's emitItemQuads here, as there's no way to obtain a RenderContext via the
// API. Instead, we special case our FoiledModel, and just render everything else normally.
var buffer = ItemRenderer.getFoilBuffer(buffers, Sheets.translucentCullBlockSheet(), true, model instanceof FoiledModel);
for (var faceIdx = 0; faceIdx <= ModelHelper.NULL_FACE_ID; faceIdx++) {
var face = ModelHelper.faceFromIndex(faceIdx);
random.setSeed(42);
ModelRenderer.renderQuads(transform, buffer, model.getQuads(null, face, random), lightmapCoord, overlayLight, tints);
}
}
}

View File

@ -0,0 +1,23 @@
// SPDX-FileCopyrightText: 2023 The CC: Tweaked Developers
//
// SPDX-License-Identifier: MPL-2.0
package dan200.computercraft.mixin.client;
import net.minecraft.client.renderer.block.model.BlockModel;
import net.minecraft.resources.ResourceLocation;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import javax.annotation.Nullable;
@Mixin(BlockModel.class)
public interface BlockModelAccessor {
@Accessor("parentLocation")
@Nullable
ResourceLocation computercraft$getParentLocation();
@Accessor("parent")
@Nullable
BlockModel computercraft$getParent();
}

View File

@ -7,6 +7,7 @@
"defaultRequire": 1
},
"client": [
"BlockModelAccessor",
"BlockRenderDispatcherMixin",
"DebugScreenOverlayMixin",
"GameRendererMixin",

View File

@ -41,9 +41,6 @@
"commands.computercraft.help.synopsis": "Provide help for a specific command",
"commands.computercraft.queue.desc": "Send a computer_command event to a command computer, passing through the additional arguments. This is mostly designed for map makers, acting as a more computer-friendly version of /trigger. Any player can run the command, which would most likely be done through a text component's click event.",
"commands.computercraft.queue.synopsis": "Send a computer_command event to a command computer",
"commands.computercraft.reload.desc": "Reload the ComputerCraft config file",
"commands.computercraft.reload.done": "Reloaded config",
"commands.computercraft.reload.synopsis": "Reload the ComputerCraft config file",
"commands.computercraft.shutdown.desc": "Shutdown the listed computers or all if none are specified. You can specify the computer's instance id (e.g. 123), computer id (e.g #123) or label (e.g. \"@My Computer\").",
"commands.computercraft.shutdown.done": "Shutdown %s/%s computers",
"commands.computercraft.shutdown.synopsis": "Shutdown computers remotely.",

View File

@ -4,6 +4,9 @@
"group": "computercraft:turtle_advanced",
"key": {"#": {"item": "minecraft:diamond_axe"}, "T": {"item": "computercraft:turtle_advanced"}},
"pattern": ["#T"],
"result": {"item": "computercraft:turtle_advanced", "nbt": "{RightUpgrade:\"minecraft:diamond_axe\"}"},
"result": {
"item": "computercraft:turtle_advanced",
"nbt": "{RightUpgrade:\"minecraft:diamond_axe\",RightUpgradeNbt:{Tag:{Damage:0}}}"
},
"show_notification": true
}

View File

@ -4,6 +4,9 @@
"group": "computercraft:turtle_advanced",
"key": {"#": {"item": "minecraft:diamond_hoe"}, "T": {"item": "computercraft:turtle_advanced"}},
"pattern": ["#T"],
"result": {"item": "computercraft:turtle_advanced", "nbt": "{RightUpgrade:\"minecraft:diamond_hoe\"}"},
"result": {
"item": "computercraft:turtle_advanced",
"nbt": "{RightUpgrade:\"minecraft:diamond_hoe\",RightUpgradeNbt:{Tag:{Damage:0}}}"
},
"show_notification": true
}

View File

@ -4,6 +4,9 @@
"group": "computercraft:turtle_advanced",
"key": {"#": {"item": "minecraft:diamond_pickaxe"}, "T": {"item": "computercraft:turtle_advanced"}},
"pattern": ["#T"],
"result": {"item": "computercraft:turtle_advanced", "nbt": "{RightUpgrade:\"minecraft:diamond_pickaxe\"}"},
"result": {
"item": "computercraft:turtle_advanced",
"nbt": "{RightUpgrade:\"minecraft:diamond_pickaxe\",RightUpgradeNbt:{Tag:{Damage:0}}}"
},
"show_notification": true
}

View File

@ -4,6 +4,9 @@
"group": "computercraft:turtle_advanced",
"key": {"#": {"item": "minecraft:diamond_shovel"}, "T": {"item": "computercraft:turtle_advanced"}},
"pattern": ["#T"],
"result": {"item": "computercraft:turtle_advanced", "nbt": "{RightUpgrade:\"minecraft:diamond_shovel\"}"},
"result": {
"item": "computercraft:turtle_advanced",
"nbt": "{RightUpgrade:\"minecraft:diamond_shovel\",RightUpgradeNbt:{Tag:{Damage:0}}}"
},
"show_notification": true
}

View File

@ -4,6 +4,9 @@
"group": "computercraft:turtle_advanced",
"key": {"#": {"item": "minecraft:diamond_sword"}, "T": {"item": "computercraft:turtle_advanced"}},
"pattern": ["#T"],
"result": {"item": "computercraft:turtle_advanced", "nbt": "{RightUpgrade:\"minecraft:diamond_sword\"}"},
"result": {
"item": "computercraft:turtle_advanced",
"nbt": "{RightUpgrade:\"minecraft:diamond_sword\",RightUpgradeNbt:{Tag:{Damage:0}}}"
},
"show_notification": true
}

View File

@ -4,6 +4,9 @@
"group": "computercraft:turtle_normal",
"key": {"#": {"item": "minecraft:diamond_axe"}, "T": {"item": "computercraft:turtle_normal"}},
"pattern": ["#T"],
"result": {"item": "computercraft:turtle_normal", "nbt": "{RightUpgrade:\"minecraft:diamond_axe\"}"},
"result": {
"item": "computercraft:turtle_normal",
"nbt": "{RightUpgrade:\"minecraft:diamond_axe\",RightUpgradeNbt:{Tag:{Damage:0}}}"
},
"show_notification": true
}

View File

@ -4,6 +4,9 @@
"group": "computercraft:turtle_normal",
"key": {"#": {"item": "minecraft:diamond_hoe"}, "T": {"item": "computercraft:turtle_normal"}},
"pattern": ["#T"],
"result": {"item": "computercraft:turtle_normal", "nbt": "{RightUpgrade:\"minecraft:diamond_hoe\"}"},
"result": {
"item": "computercraft:turtle_normal",
"nbt": "{RightUpgrade:\"minecraft:diamond_hoe\",RightUpgradeNbt:{Tag:{Damage:0}}}"
},
"show_notification": true
}

View File

@ -4,6 +4,9 @@
"group": "computercraft:turtle_normal",
"key": {"#": {"item": "minecraft:diamond_pickaxe"}, "T": {"item": "computercraft:turtle_normal"}},
"pattern": ["#T"],
"result": {"item": "computercraft:turtle_normal", "nbt": "{RightUpgrade:\"minecraft:diamond_pickaxe\"}"},
"result": {
"item": "computercraft:turtle_normal",
"nbt": "{RightUpgrade:\"minecraft:diamond_pickaxe\",RightUpgradeNbt:{Tag:{Damage:0}}}"
},
"show_notification": true
}

View File

@ -4,6 +4,9 @@
"group": "computercraft:turtle_normal",
"key": {"#": {"item": "minecraft:diamond_shovel"}, "T": {"item": "computercraft:turtle_normal"}},
"pattern": ["#T"],
"result": {"item": "computercraft:turtle_normal", "nbt": "{RightUpgrade:\"minecraft:diamond_shovel\"}"},
"result": {
"item": "computercraft:turtle_normal",
"nbt": "{RightUpgrade:\"minecraft:diamond_shovel\",RightUpgradeNbt:{Tag:{Damage:0}}}"
},
"show_notification": true
}

View File

@ -4,6 +4,9 @@
"group": "computercraft:turtle_normal",
"key": {"#": {"item": "minecraft:diamond_sword"}, "T": {"item": "computercraft:turtle_normal"}},
"pattern": ["#T"],
"result": {"item": "computercraft:turtle_normal", "nbt": "{RightUpgrade:\"minecraft:diamond_sword\"}"},
"result": {
"item": "computercraft:turtle_normal",
"nbt": "{RightUpgrade:\"minecraft:diamond_sword\",RightUpgradeNbt:{Tag:{Damage:0}}}"
},
"show_notification": true
}

View File

@ -62,12 +62,15 @@ public synchronized void load(Path path) {
if (loadConfig()) config.save();
}
@SuppressWarnings("unchecked")
private Stream<ValueImpl<?>> values() {
return (Stream<ValueImpl<?>>) (Stream<?>) entries.stream().filter(ValueImpl.class::isInstance);
}
public synchronized void unload() {
closeConfig();
entries.stream().forEach(x -> {
if (x instanceof ValueImpl<?> value) value.unload();
});
values().forEach(ValueImpl::unload);
}
@GuardedBy("this")
@ -87,14 +90,15 @@ private synchronized boolean loadConfig() {
config.load();
entries.stream().forEach(x -> {
config.setComment(x.path, x.comment);
if (x instanceof ValueImpl<?> value) value.load(config);
});
var corrected = spec.correct(config, (action, entryPath, oldValue, newValue) -> {
// Ensure the config file matches the spec
var isNewFile = config.isEmpty();
entries.stream().forEach(x -> config.setComment(x.path, x.comment));
var corrected = isNewFile ? spec.correct(config) : spec.correct(config, (action, entryPath, oldValue, newValue) -> {
LOG.warn("Incorrect key {} was corrected from {} to {}", String.join(".", entryPath), oldValue, newValue);
});
// And then load the underlying entries.
values().forEach(x -> x.load(config));
onChange.onConfigChanged(config.getNioPath());
return corrected > 0;
@ -102,7 +106,7 @@ private synchronized boolean loadConfig() {
@Override
public Stream<ConfigFile.Entry> entries() {
return entries.children().map(x -> (ConfigFile.Entry) x);
return entries.stream().map(x -> (ConfigFile.Entry) x);
}
@Nullable
@ -148,7 +152,7 @@ private String takeComment(String suffix) {
public void push(String name) {
var path = getFullPath(name);
var splitPath = SPLITTER.split(path);
entries.setValue(splitPath, new GroupImpl(path, takeComment(), entries.getChild(splitPath)));
entries.setValue(splitPath, new GroupImpl(path, takeComment()));
super.push(name);
}
@ -230,16 +234,8 @@ public final String comment() {
}
private static final class GroupImpl extends Entry implements Group {
private final Trie<String, Entry> children;
private GroupImpl(String path, String comment, Trie<String, Entry> children) {
private GroupImpl(String path, String comment) {
super(path, comment);
this.children = children;
}
@Override
public Stream<ConfigFile.Entry> children() {
return children.children().map(x -> (ConfigFile.Entry) x);
}
}

View File

@ -309,7 +309,7 @@ public ServerPlayer createFakePlayer(ServerLevel world, GameProfile name) {
public boolean hasToolUsage(ItemStack stack) {
var item = stack.getItem();
return item instanceof ShovelItem || stack.is(ItemTags.SHOVELS) ||
item instanceof HoeItem || stack.is(ItemTags.HOES);
item instanceof HoeItem || stack.is(ItemTags.HOES);
}
@Override
@ -343,9 +343,7 @@ private record RegistryWrapperImpl<T>(
) implements RegistryWrappers.RegistryWrapper<T> {
@Override
public int getId(T object) {
var id = registry.getId(object);
if (id == -1) throw new IllegalArgumentException(object + " was not registered in " + name);
return id;
return registry.getId(object);
}
@Override
@ -369,10 +367,13 @@ public T tryGet(ResourceLocation location) {
}
@Override
public T get(int id) {
var object = registry.byId(id);
if (object == null) throw new IllegalArgumentException(id + " was not registered in " + name);
return object;
public @Nullable T byId(int id) {
return registry.byId(id);
}
@Override
public int size() {
return registry.size();
}
@Override

View File

@ -50,7 +50,7 @@
],
"depends": {
"fabricloader": ">=0.14.21",
"fabric-api": ">=0.83.0",
"fabric-api": ">=0.86.1",
"minecraft": ">=1.20.1 <1.21"
},
"accessWidener": "computercraft.accesswidener"

View File

@ -0,0 +1,51 @@
// SPDX-FileCopyrightText: 2023 The CC: Tweaked Developers
//
// SPDX-License-Identifier: MPL-2.0
package dan200.computercraft.client.model;
import dan200.computercraft.shared.util.ConsList;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.core.Direction;
import net.minecraft.util.RandomSource;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.client.model.BakedModelWrapper;
import net.minecraftforge.client.model.data.ModelData;
import org.jetbrains.annotations.Nullable;
import java.util.List;
/**
* A model wrapper which applies a glint/foil to the original model.
*/
public final class FoiledModel extends BakedModelWrapper<BakedModel> {
public FoiledModel(BakedModel model) {
super(model);
}
@Override
public List<BakedQuad> getQuads(@Nullable BlockState state, @Nullable Direction side, RandomSource rand, ModelData extraData, @Nullable RenderType renderType) {
return renderType == RenderType.glint()
? super.getQuads(state, side, rand, extraData, null)
: super.getQuads(state, side, rand, extraData, renderType);
}
@Override
public List<RenderType> getRenderTypes(ItemStack itemStack, boolean fabulous) {
return new ConsList<>(fabulous ? RenderType.glintDirect() : RenderType.glint(), super.getRenderTypes(itemStack, fabulous));
}
@Override
public boolean equals(Object obj) {
return this == obj || (obj instanceof FoiledModel other && originalModel.equals(other.originalModel));
}
@Override
public int hashCode() {
return originalModel.hashCode() ^ 1;
}
}

View File

@ -5,22 +5,53 @@
package dan200.computercraft.client.platform;
import com.google.auto.service.AutoService;
import com.mojang.blaze3d.vertex.PoseStack;
import dan200.computercraft.client.model.FoiledModel;
import dan200.computercraft.client.render.ModelRenderer;
import dan200.computercraft.shared.network.NetworkMessage;
import dan200.computercraft.shared.network.server.ServerNetworkContext;
import dan200.computercraft.shared.platform.NetworkHandler;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.client.resources.model.ModelManager;
import net.minecraft.core.Direction;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.RandomSource;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.client.model.data.ModelData;
import javax.annotation.Nullable;
import java.util.Arrays;
@AutoService(dan200.computercraft.impl.client.ClientPlatformHelper.class)
public class ClientPlatformHelperImpl implements ClientPlatformHelper {
private static final RandomSource random = RandomSource.create(0);
private static final Direction[] directions = Arrays.copyOf(Direction.values(), 7);
@Override
public BakedModel getModel(ModelManager manager, ResourceLocation location) {
return manager.getModel(location);
}
@Override
public BakedModel createdFoiledModel(BakedModel model) {
return new FoiledModel(model);
}
@Override
public void sendToServer(NetworkMessage<ServerNetworkContext> message) {
NetworkHandler.sendToServer(message);
}
@Override
public void renderBakedModel(PoseStack transform, MultiBufferSource buffers, BakedModel model, int lightmapCoord, int overlayLight, @Nullable int[] tints) {
for (var renderType : model.getRenderTypes(ItemStack.EMPTY, true)) {
var buffer = buffers.getBuffer(renderType);
for (var face : directions) {
random.setSeed(42);
var quads = model.getQuads(null, face, random, ModelData.EMPTY, renderType);
ModelRenderer.renderQuads(transform, buffer, quads, lightmapCoord, overlayLight, tints);
}
}
}
}

View File

@ -41,9 +41,6 @@
"commands.computercraft.help.synopsis": "Provide help for a specific command",
"commands.computercraft.queue.desc": "Send a computer_command event to a command computer, passing through the additional arguments. This is mostly designed for map makers, acting as a more computer-friendly version of /trigger. Any player can run the command, which would most likely be done through a text component's click event.",
"commands.computercraft.queue.synopsis": "Send a computer_command event to a command computer",
"commands.computercraft.reload.desc": "Reload the ComputerCraft config file",
"commands.computercraft.reload.done": "Reloaded config",
"commands.computercraft.reload.synopsis": "Reload the ComputerCraft config file",
"commands.computercraft.shutdown.desc": "Shutdown the listed computers or all if none are specified. You can specify the computer's instance id (e.g. 123), computer id (e.g #123) or label (e.g. \"@My Computer\").",
"commands.computercraft.shutdown.done": "Shutdown %s/%s computers",
"commands.computercraft.shutdown.synopsis": "Shutdown computers remotely.",

View File

@ -4,6 +4,9 @@
"group": "computercraft:turtle_advanced",
"key": {"#": {"item": "minecraft:diamond_axe"}, "T": {"item": "computercraft:turtle_advanced"}},
"pattern": ["#T"],
"result": {"item": "computercraft:turtle_advanced", "nbt": "{RightUpgrade:\"minecraft:diamond_axe\"}"},
"result": {
"item": "computercraft:turtle_advanced",
"nbt": "{RightUpgrade:\"minecraft:diamond_axe\",RightUpgradeNbt:{Tag:{Damage:0}}}"
},
"show_notification": true
}

View File

@ -4,6 +4,9 @@
"group": "computercraft:turtle_advanced",
"key": {"#": {"item": "minecraft:diamond_hoe"}, "T": {"item": "computercraft:turtle_advanced"}},
"pattern": ["#T"],
"result": {"item": "computercraft:turtle_advanced", "nbt": "{RightUpgrade:\"minecraft:diamond_hoe\"}"},
"result": {
"item": "computercraft:turtle_advanced",
"nbt": "{RightUpgrade:\"minecraft:diamond_hoe\",RightUpgradeNbt:{Tag:{Damage:0}}}"
},
"show_notification": true
}

View File

@ -4,6 +4,9 @@
"group": "computercraft:turtle_advanced",
"key": {"#": {"item": "minecraft:diamond_pickaxe"}, "T": {"item": "computercraft:turtle_advanced"}},
"pattern": ["#T"],
"result": {"item": "computercraft:turtle_advanced", "nbt": "{RightUpgrade:\"minecraft:diamond_pickaxe\"}"},
"result": {
"item": "computercraft:turtle_advanced",
"nbt": "{RightUpgrade:\"minecraft:diamond_pickaxe\",RightUpgradeNbt:{Tag:{Damage:0}}}"
},
"show_notification": true
}

View File

@ -4,6 +4,9 @@
"group": "computercraft:turtle_advanced",
"key": {"#": {"item": "minecraft:diamond_shovel"}, "T": {"item": "computercraft:turtle_advanced"}},
"pattern": ["#T"],
"result": {"item": "computercraft:turtle_advanced", "nbt": "{RightUpgrade:\"minecraft:diamond_shovel\"}"},
"result": {
"item": "computercraft:turtle_advanced",
"nbt": "{RightUpgrade:\"minecraft:diamond_shovel\",RightUpgradeNbt:{Tag:{Damage:0}}}"
},
"show_notification": true
}

View File

@ -4,6 +4,9 @@
"group": "computercraft:turtle_advanced",
"key": {"#": {"item": "minecraft:diamond_sword"}, "T": {"item": "computercraft:turtle_advanced"}},
"pattern": ["#T"],
"result": {"item": "computercraft:turtle_advanced", "nbt": "{RightUpgrade:\"minecraft:diamond_sword\"}"},
"result": {
"item": "computercraft:turtle_advanced",
"nbt": "{RightUpgrade:\"minecraft:diamond_sword\",RightUpgradeNbt:{Tag:{Damage:0}}}"
},
"show_notification": true
}

View File

@ -4,6 +4,9 @@
"group": "computercraft:turtle_normal",
"key": {"#": {"item": "minecraft:diamond_axe"}, "T": {"item": "computercraft:turtle_normal"}},
"pattern": ["#T"],
"result": {"item": "computercraft:turtle_normal", "nbt": "{RightUpgrade:\"minecraft:diamond_axe\"}"},
"result": {
"item": "computercraft:turtle_normal",
"nbt": "{RightUpgrade:\"minecraft:diamond_axe\",RightUpgradeNbt:{Tag:{Damage:0}}}"
},
"show_notification": true
}

View File

@ -4,6 +4,9 @@
"group": "computercraft:turtle_normal",
"key": {"#": {"item": "minecraft:diamond_hoe"}, "T": {"item": "computercraft:turtle_normal"}},
"pattern": ["#T"],
"result": {"item": "computercraft:turtle_normal", "nbt": "{RightUpgrade:\"minecraft:diamond_hoe\"}"},
"result": {
"item": "computercraft:turtle_normal",
"nbt": "{RightUpgrade:\"minecraft:diamond_hoe\",RightUpgradeNbt:{Tag:{Damage:0}}}"
},
"show_notification": true
}

View File

@ -4,6 +4,9 @@
"group": "computercraft:turtle_normal",
"key": {"#": {"item": "minecraft:diamond_pickaxe"}, "T": {"item": "computercraft:turtle_normal"}},
"pattern": ["#T"],
"result": {"item": "computercraft:turtle_normal", "nbt": "{RightUpgrade:\"minecraft:diamond_pickaxe\"}"},
"result": {
"item": "computercraft:turtle_normal",
"nbt": "{RightUpgrade:\"minecraft:diamond_pickaxe\",RightUpgradeNbt:{Tag:{Damage:0}}}"
},
"show_notification": true
}

View File

@ -4,6 +4,9 @@
"group": "computercraft:turtle_normal",
"key": {"#": {"item": "minecraft:diamond_shovel"}, "T": {"item": "computercraft:turtle_normal"}},
"pattern": ["#T"],
"result": {"item": "computercraft:turtle_normal", "nbt": "{RightUpgrade:\"minecraft:diamond_shovel\"}"},
"result": {
"item": "computercraft:turtle_normal",
"nbt": "{RightUpgrade:\"minecraft:diamond_shovel\",RightUpgradeNbt:{Tag:{Damage:0}}}"
},
"show_notification": true
}

View File

@ -4,6 +4,9 @@
"group": "computercraft:turtle_normal",
"key": {"#": {"item": "minecraft:diamond_sword"}, "T": {"item": "computercraft:turtle_normal"}},
"pattern": ["#T"],
"result": {"item": "computercraft:turtle_normal", "nbt": "{RightUpgrade:\"minecraft:diamond_sword\"}"},
"result": {
"item": "computercraft:turtle_normal",
"nbt": "{RightUpgrade:\"minecraft:diamond_sword\",RightUpgradeNbt:{Tag:{Damage:0}}}"
},
"show_notification": true
}

View File

@ -32,7 +32,7 @@ public ForgeConfigSpec spec() {
@Override
public Stream<Entry> entries() {
return entries.children();
return entries.stream();
}
@Nullable
@ -68,7 +68,7 @@ public void push(String name) {
@Override
public void pop() {
var path = new ArrayList<>(groupStack);
entries.setValue(path, new GroupImpl(path, entries.getChild(path)));
entries.setValue(path, new GroupImpl(path));
builder.pop();
super.pop();
@ -129,12 +129,10 @@ public ConfigFile build(ConfigListener onChange) {
private static final class GroupImpl implements ConfigFile.Group {
private final List<String> path;
private final Trie<String, ConfigFile.Entry> entries;
private @Nullable ForgeConfigSpec owner;
private GroupImpl(List<String> path, Trie<String, ConfigFile.Entry> entries) {
private GroupImpl(List<String> path) {
this.path = path;
this.entries = entries;
}
@Override
@ -148,11 +146,6 @@ public String comment() {
if (owner == null) throw new IllegalStateException("Config has not been built yet");
return owner.getLevelComment(path);
}
@Override
public Stream<Entry> children() {
return entries.children();
}
}
private static final class ValueImpl<T> implements ConfigFile.Value<T> {

Some files were not shown because too many files have changed in this diff Show More