- fix issues with minepad cursor lock

- keyboard now enables mouse controls
- fix some issues with the keyboard camera
- helper methods on the screen block entity for dealing with hit results
- update non-english language files to json
This commit is contained in:
GiantLuigi4 2023-11-29 13:54:42 -05:00
parent 21ffc08fcf
commit a603bdc8df
11 changed files with 596 additions and 404 deletions

View File

@ -4,12 +4,20 @@
package net.montoyo.wd.client.gui;
import com.cinemamod.mcef.MCEFBrowser;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Axis;
import net.minecraft.client.Minecraft;
import net.minecraft.core.BlockPos;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.HitResult;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.client.event.ViewportEvent;
import net.minecraftforge.fml.ModList;
import net.minecraftforge.fml.loading.FMLPaths;
import net.montoyo.wd.WebDisplays;
@ -18,23 +26,29 @@ import net.montoyo.wd.client.gui.controls.Button;
import net.montoyo.wd.client.gui.controls.Control;
import net.montoyo.wd.client.gui.controls.Label;
import net.montoyo.wd.client.gui.loading.FillControl;
import net.montoyo.wd.controls.builtin.ClickControl;
import net.montoyo.wd.entity.ScreenBlockEntity;
import net.montoyo.wd.entity.ScreenData;
import net.montoyo.wd.net.WDNetworkRegistry;
import net.montoyo.wd.net.server_bound.C2SMessageScreenCtrl;
import net.montoyo.wd.utilities.data.BlockSide;
import net.montoyo.wd.utilities.Log;
import net.montoyo.wd.utilities.data.BlockSide;
import net.montoyo.wd.utilities.math.Vector2i;
import net.montoyo.wd.utilities.serialization.TypeData;
import net.montoyo.wd.utilities.serialization.Util;
import org.cef.browser.CefBrowser;
import org.cef.misc.CefCursorType;
import org.joml.Matrix4f;
import org.joml.Vector4f;
import org.lwjgl.glfw.GLFW;
import org.vivecraft.client_vr.gameplay.VRPlayer;
import org.vivecraft.client_vr.gameplay.screenhandlers.KeyboardHandler;
//import org.vivecraft.gameplay.VRPlayer;
//import org.vivecraft.gameplay.screenhandlers.KeyboardHandler;
import java.io.*;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Map;
import java.util.function.Consumer;
@OnlyIn(Dist.CLIENT)
public class GuiKeyboard extends WDScreen {
@ -43,6 +57,7 @@ public class GuiKeyboard extends WDScreen {
private ScreenBlockEntity tes;
private BlockSide side;
private ScreenData data;
private final ArrayList<TypeData> evStack = new ArrayList<>();
private BlockPos kbPos;
private boolean showWarning = true;
@ -144,22 +159,42 @@ public class GuiKeyboard extends WDScreen {
KeyboardHandler.setOverlayShowing(true);
KeyboardCamera.focus(tes, side);
data = tes.getScreen(side);
CefBrowser browser = data.browser;
((MCEFBrowser) browser).setCursor(CefCursorType.fromId(data.mouseType));
((MCEFBrowser) browser).setCursorChangeListener((id) -> {
data.mouseType = id;
((MCEFBrowser) browser).setCursor(CefCursorType.fromId(id));
});
}
@Override
public void removed() {
super.removed();
if (vivecraftPresent)
if (VRPlayer.get() != null)
KeyboardHandler.setOverlayShowing(false);
KeyboardCamera.focus(null, null);
CefBrowser browser = data.browser;
if (browser instanceof MCEFBrowser mcef) {
mcef.setCursor(CefCursorType.POINTER);
mcef.setCursorChangeListener((cursor) -> data.mouseType = cursor);
}
}
@Override
public void onClose() {
if (vivecraftPresent)
if (VRPlayer.get() != null)
KeyboardHandler.setOverlayShowing(false);
removed();
super.onClose();
KeyboardCamera.focus(null, null);
this.minecraft.popGuiLayer();
}
@Override
public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
if(quitOnEscape && keyCode == GLFW.GLFW_KEY_ESCAPE) {
Minecraft.getInstance().setScreen(null);
if (quitOnEscape && keyCode == GLFW.GLFW_KEY_ESCAPE) {
onClose();
return true;
}
addKey(new TypeData(TypeData.Action.PRESS, keyCode, modifiers, scanCode));
return super.keyPressed(keyCode, scanCode, modifiers);
@ -249,4 +284,89 @@ public class GuiKeyboard extends WDScreen {
return bp.equals(kbPos) || (bp.equals(tes.getBlockPos()) && side == this.side);
}
protected void mouse(double mouseX, double mouseY, Consumer<Vector2i> func) {
float pct = Minecraft.getInstance().getPartialTick();
ViewportEvent.ComputeFov fov = new ViewportEvent.ComputeFov(
Minecraft.getInstance().gameRenderer,
Minecraft.getInstance().getEntityRenderDispatcher().camera,
pct, Minecraft.getInstance().options.fov().get(),
true
);
mouseX /= width;
mouseY /= height;
mouseX -= 0.5;
mouseY -= 0.5;
mouseY = -mouseY;
Matrix4f proj = Minecraft.getInstance().gameRenderer.getProjectionMatrix(fov.getFOV());
Entity e = Minecraft.getInstance().getEntityRenderDispatcher().camera.getEntity();
PoseStack camera = new PoseStack();
float[] angle = KeyboardCamera.getAngle(e, pct);
camera.mulPose(Axis.XP.rotationDegrees(angle[0]));
camera.mulPose(Axis.YP.rotationDegrees(angle[1] + 180.0F));
Vector4f coord = new Vector4f(0, 0, 0, 0);
coord.add(proj.invert().transform(new Vector4f(2f * (float) mouseX, 2 * (float) mouseY, 0, 1f)));
coord = camera.last().pose().invert().transform(coord);
coord.w = 0;
coord.normalize();
Vec3 vec3 = e.getEyePosition(pct);
Vec3 vec31 = new Vec3(coord.x, coord.y, coord.z);
BlockHitResult result = tes.trace(side, vec3, vec31);
if (result.getType() != HitResult.Type.MISS) {
tes.interact(result, func);
}
}
@Override
public void mouseMoved(double mouseX, double mouseY) {
mouse(mouseX, mouseY, (hit) -> {
tes.handleMouseEvent(side, ClickControl.ControlType.MOVE, hit, -1);
WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.laserMove(tes, side, hit));
});
super.mouseMoved(mouseX, mouseY);
}
@Override
public boolean mouseClicked(double mouseX, double mouseY, int button) {
mouse(mouseX, mouseY, (hit) -> {
tes.handleMouseEvent(side, ClickControl.ControlType.MOVE, hit, -1);
tes.handleMouseEvent(side, ClickControl.ControlType.DOWN, hit, button);
WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.laserDown(tes, side, hit, button));
});
return super.mouseClicked(mouseX, mouseY, button);
}
@Override
public boolean mouseReleased(double mouseX, double mouseY, int button) {
mouse(mouseX, mouseY, (hit) -> {
tes.handleMouseEvent(side, ClickControl.ControlType.MOVE, hit, -1);
tes.handleMouseEvent(side, ClickControl.ControlType.UP, hit, button);
WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.laserUp(tes, side, button));
});
return super.mouseReleased(mouseX, mouseY, button);
}
@Override
public void tick() {
double mouseX = Minecraft.getInstance().mouseHandler.xpos() / Minecraft.getInstance().getWindow().getWidth();
double mouseY = Minecraft.getInstance().mouseHandler.ypos() / Minecraft.getInstance().getWindow().getHeight();
mouse(mouseX * width, mouseY * height, (hit) -> {
tes.handleMouseEvent(side, ClickControl.ControlType.MOVE, hit, -1);
WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.laserMove(tes, side, hit));
});
super.tick();
}
}

View File

@ -8,18 +8,21 @@ import com.cinemamod.mcef.MCEFBrowser;
import com.google.gson.JsonObject;
import com.mojang.blaze3d.platform.InputConstants;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.*;
import com.mojang.blaze3d.vertex.BufferBuilder;
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
import com.mojang.blaze3d.vertex.Tesselator;
import com.mojang.blaze3d.vertex.VertexFormat;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.core.BlockPos;
import net.minecraft.locale.Language;
import net.minecraft.network.chat.Component;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.montoyo.wd.WebDisplays;
import net.montoyo.wd.client.ClientProxy;
import net.montoyo.wd.utilities.browser.WDBrowser;
import net.montoyo.wd.utilities.browser.handlers.js.Scripts;
import net.montoyo.wd.utilities.browser.handlers.WDRouter;
import net.montoyo.wd.utilities.data.BlockSide;
import org.cef.misc.CefCursorType;
import org.lwjgl.glfw.GLFW;
@ -121,8 +124,9 @@ public class GuiMinePad extends WDScreen {
RenderSystem.enableCull();
graphics.drawString(
minecraft.font, "Press Shift and Escape to close",
(int) vx + 4, (int) vy - minecraft.font.lineHeight - 3, 16777215, true
minecraft.font, Language.getInstance().getOrDefault(
"webdisplays.gui.minepad.close"
), (int) vx + 4, (int) vy - minecraft.font.lineHeight - 3, 16777215, true
);
}
@ -150,7 +154,7 @@ public class GuiMinePad extends WDScreen {
public boolean keyChanged(int keyCode, int scanCode, int modifiers, boolean pressed) {
assert minecraft != null;
if ((modifiers & GLFW.GLFW_MOD_SHIFT) == GLFW.GLFW_MOD_SHIFT && keyCode == GLFW.GLFW_KEY_ESCAPE) {
minecraft.setScreen(null);
onClose();
return true;
}
@ -211,27 +215,27 @@ public class GuiMinePad extends WDScreen {
return super.mouseScrolled(mouseX, mouseY, amount);
}
public void capturedMouse(int scaledX, int scaledY, int sx, int sy) {
double centerX = 0.5 * (double)this.minecraft.getWindow().getGuiScaledWidth();
double centerY = 0.5 * (double)this.minecraft.getWindow().getGuiScaledHeight();
public void capturedMouse(double scaledX, double scaledY, int sx, int sy) {
double centerX = (int) (0.5 * (double) this.minecraft.getWindow().getGuiScaledWidth());
double centerY = (int) (0.5 * (double) this.minecraft.getWindow().getGuiScaledHeight());
if (sx == (int) centerX && sy == (int) centerY) return;
double mx = (centerX - vx) / vw;
double my = (centerY - vy) / vh;
int scaledCentX = (int) (mx * WebDisplays.INSTANCE.padResX);
int scaledCentY = (int) (my * WebDisplays.INSTANCE.padResY);
double scaledCentX = (mx * WebDisplays.INSTANCE.padResX);
double scaledCentY = (my * WebDisplays.INSTANCE.padResY);
int deltX = scaledX - scaledCentX;
int deltY = scaledY - scaledCentY;
double deltX = scaledX - scaledCentX;
double deltY = scaledY - scaledCentY;
String scr = Scripts.MOUSE_EVENT;
pad.view.executeJavaScript(
scr
.replace("%xCoord%", "" + (int) centerX)
.replace("%yCoord%", "" + (int) centerY)
.replace("%xDelta%", "" + deltX)
.replace("%yDelta%", "" + deltY),
.replace("%xDelta%", "" + (deltX))
.replace("%yDelta%", "" + (deltY)),
"WebDisplays", 0
);
@ -255,7 +259,7 @@ public class GuiMinePad extends WDScreen {
if (btn == -1) {
if (locked)
capturedMouse(scaledX, scaledY, sx, sy);
capturedMouse(mx * WebDisplays.INSTANCE.padResX, my * WebDisplays.INSTANCE.padResY, sx, sy);
else ((MCEFBrowser) pad.view).sendMouseMove(scaledX, scaledY);
} else if (pressed)
((MCEFBrowser) pad.view).sendMousePress(scaledX, scaledY, btn);
@ -294,6 +298,10 @@ public class GuiMinePad extends WDScreen {
@Override
public void removed() {
super.removed();
InputConstants.updateRawMouseInput(
minecraft.getWindow().getWindow(),
Minecraft.getInstance().options.rawMouseInput().get()
);
if (pad.view instanceof MCEFBrowser browser) {
browser.setCursor(CefCursorType.POINTER);
browser.setCursorChangeListener((cursor) -> {
@ -305,11 +313,8 @@ public class GuiMinePad extends WDScreen {
@Override
public void onClose() {
super.onClose();
InputConstants.updateRawMouseInput(
minecraft.getWindow().getWindow(),
Minecraft.getInstance().options.rawMouseInput().get()
);
removed();
this.minecraft.popGuiLayer();
}
boolean locked = false;

View File

@ -4,15 +4,17 @@ import net.minecraft.client.Minecraft;
import net.minecraft.commands.arguments.EntityAnchorArgument;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.phys.Vec2;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.client.event.ViewportEvent;
import net.minecraftforge.event.TickEvent;
import net.montoyo.wd.client.gui.GuiKeyboard;
import net.montoyo.wd.config.ClientConfig;
import net.montoyo.wd.utilities.browser.handlers.js.queries.ElementCenterQuery;
import net.montoyo.wd.entity.ScreenBlockEntity;
import net.montoyo.wd.entity.ScreenData;
import net.montoyo.wd.utilities.browser.WDBrowser;
import net.montoyo.wd.utilities.browser.handlers.js.queries.ElementCenterQuery;
import net.montoyo.wd.utilities.data.BlockSide;
public class KeyboardCamera {
@ -76,41 +78,39 @@ public class KeyboardCamera {
}
protected static void updateCrd(ElementCenterQuery lock) {
if (lock.hasFocused()) {
ScreenData scr = tes.getScreen(side);
if (scr != null) {
Vec2 c;
ScreenData scr = tes.getScreen(side);
if (scr != null) {
Vec2 c;
if (lock.hasFocused()) {
if (ClientConfig.Input.keyboardCamera) {
nextX = lock.getX();
nextY = lock.getY();
c = pxToHit(scr, new Vec2((float) nextX, (float) nextY));
} else c = new Vec2(scr.size.x / 2f, scr.size.y / 2f);
} else c = new Vec2(scr.size.x / 2f, scr.size.y / 2f);
nextX = c.x;
nextY = c.y;
nextX = c.x;
nextY = c.y;
if (nextX < 0) nextX = 0;
else if (nextX > scr.size.x) nextX = scr.size.x;
if (nextY < 0) nextY = 0;
else if (nextY > scr.size.y) nextY = scr.size.y;
if (nextX < 0) nextX = 0;
else if (nextX > scr.size.x) nextX = scr.size.x;
if (nextY < 0) nextY = 0;
else if (nextY > scr.size.y) nextY = scr.size.y;
float scl = Math.max(scr.size.x, scr.size.y);
float scl = Math.max(scr.size.x, scr.size.y);
double mx = Minecraft.getInstance().mouseHandler.xpos();
mx /= Minecraft.getInstance().getWindow().getWidth();
double mx = Minecraft.getInstance().mouseHandler.xpos();
mx /= Minecraft.getInstance().getWindow().getWidth();
double my = Minecraft.getInstance().mouseHandler.ypos();
my /= Minecraft.getInstance().getWindow().getHeight();
double my = Minecraft.getInstance().mouseHandler.ypos();
my /= Minecraft.getInstance().getWindow().getHeight();
Vec2 v2 = new Vec2((float) mx, (float) my).add(-0.5f);
Vec2 v2 = new Vec2((float) mx, (float) my).add(-0.5f);
nextX += v2.x * scl;
nextY -= v2.y * scl;
}
} else {
nextX = -1;
nextY = -1;
nextX += v2.x * scl;
nextY -= v2.y * scl;
}
}
@ -130,20 +130,14 @@ public class KeyboardCamera {
}
}
public static void updateCamera(ViewportEvent.ComputeCameraAngles event) {
if (tes == null) {
xCrd = -1;
yCrd = -1;
return; // nothing to do
}
public static float[] getAngle(Entity e, double pct) {
BlockEntity tes = KeyboardCamera.tes;
BlockSide side = KeyboardCamera.side;
if (tes == null) return new float[]{Float.NaN, 0};
if (side == null) return new float[]{Float.NaN, 0};
if (xCrd == -1) return;
if (yCrd == -1) return;
// TODO: implement
double coxCrd = Mth.lerp(0.5 * event.getPartialTick(), oxCrd, xCrd);
double coyCrd = Mth.lerp(0.5 * event.getPartialTick(), oyCrd, yCrd);
double coxCrd = Mth.lerp(0.5 * pct, oxCrd, xCrd);
double coyCrd = Mth.lerp(0.5 * pct, oyCrd, yCrd);
double focalX = tes.getBlockPos().getX() +
side.right.x * (coxCrd - 1) + side.up.x * coyCrd + Math.abs(side.forward.x) * 0.5;
@ -157,11 +151,27 @@ public class KeyboardCamera {
focalZ += side.forward.z * 0.5f;
float[] angle = lookAt(
event.getCamera().getEntity(),
EntityAnchorArgument.Anchor.EYES,
e, EntityAnchorArgument.Anchor.EYES,
new Vec3(focalX, focalY, focalZ)
);
return angle;
}
public static void updateCamera(ViewportEvent.ComputeCameraAngles event) {
if (tes == null) {
xCrd = -1;
yCrd = -1;
return; // nothing to do
}
if (xCrd == -1) return;
if (yCrd == -1) return;
float[] angle = getAngle(event.getCamera().getEntity(), event.getPartialTick());
if (Float.isNaN(angle[0])) return;
// float xRot = event.getYaw(); // left right
// float yRot = event.getPitch(); // up down
@ -201,6 +211,12 @@ public class KeyboardCamera {
return;
}
if (!(Minecraft.getInstance().screen instanceof GuiKeyboard)) {
tes = null;
side = null;
return;
}
pollElement();
double anxx = nextX;

View File

@ -13,8 +13,8 @@ import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderer;
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;
import net.montoyo.wd.WebDisplays;
import net.montoyo.wd.entity.ScreenData;
import net.montoyo.wd.entity.ScreenBlockEntity;
import net.montoyo.wd.entity.ScreenData;
import net.montoyo.wd.utilities.math.Vector3f;
import net.montoyo.wd.utilities.math.Vector3i;
import org.jetbrains.annotations.NotNull;

View File

@ -4,9 +4,8 @@
package net.montoyo.wd.entity;
import com.cinemamod.mcef.MCEF;
import com.cinemamod.mcef.MCEFBrowser;
import com.cinemamod.mcef.listeners.MCEFCursorChangeListener;
import net.minecraft.client.Minecraft;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
@ -19,10 +18,12 @@ import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.HitResult;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.network.PacketDistributor;
import net.montoyo.wd.WebDisplays;
import net.montoyo.wd.block.ScreenBlock;
@ -33,20 +34,23 @@ import net.montoyo.wd.core.DefaultUpgrade;
import net.montoyo.wd.core.IUpgrade;
import net.montoyo.wd.core.ScreenRights;
import net.montoyo.wd.data.ScreenConfigData;
import net.montoyo.wd.registry.BlockRegistry;
import net.montoyo.wd.registry.ItemRegistry;
import net.montoyo.wd.registry.TileRegistry;
import net.montoyo.wd.miniserv.SyncPlugin;
import net.montoyo.wd.net.WDNetworkRegistry;
import net.montoyo.wd.net.client_bound.S2CMessageAddScreen;
import net.montoyo.wd.net.client_bound.S2CMessageScreenUpdate;
import net.montoyo.wd.utilities.*;
import net.montoyo.wd.registry.BlockRegistry;
import net.montoyo.wd.registry.ItemRegistry;
import net.montoyo.wd.registry.TileRegistry;
import net.montoyo.wd.utilities.Log;
import net.montoyo.wd.utilities.Multiblock;
import net.montoyo.wd.utilities.ScreenIterator;
import net.montoyo.wd.utilities.VideoType;
import net.montoyo.wd.utilities.data.BlockSide;
import net.montoyo.wd.utilities.data.Rotation;
import net.montoyo.wd.utilities.math.MutableAABB;
import net.montoyo.wd.utilities.math.Vector2i;
import net.montoyo.wd.utilities.math.Vector3f;
import net.montoyo.wd.utilities.math.Vector3i;
import net.montoyo.wd.utilities.data.BlockSide;
import net.montoyo.wd.utilities.data.Rotation;
import net.montoyo.wd.utilities.serialization.NameUUIDPair;
import net.montoyo.wd.utilities.serialization.TypeData;
import org.cef.browser.CefBrowser;
@ -55,8 +59,8 @@ import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import java.util.function.Consumer;
import static net.montoyo.wd.block.PeripheralBlock.point;
@ -1089,6 +1093,57 @@ public class ScreenBlockEntity extends BlockEntity {
}
}
public void interact(BlockHitResult result, Consumer<Vector2i> func) {
BlockState state = getBlockState();
if (state.getBlock() instanceof ScreenBlock) {
Vector3i pos = new Vector3i(result.getBlockPos());
BlockSide side = BlockSide.values()[result.getDirection().ordinal()];
Multiblock.findOrigin(Minecraft.getInstance().level, pos, side, null);
//Since rights aren't synchronized, let the server check them for us...
ScreenData scr = this.getScreen(side);
if (scr.browser != null) {
float hitX = ((float) result.getLocation().x) - (float) pos.x;
float hitY = ((float) result.getLocation().y) - (float) pos.y;
float hitZ = ((float) result.getLocation().z) - (float) pos.z;
Vector2i tmp = new Vector2i();
if (ScreenBlock.hit2pixels(side, result.getBlockPos(), new Vector3i(result.getBlockPos()), scr, hitX, hitY, hitZ, tmp)) {
func.accept(tmp);
}
}
}
}
public BlockHitResult trace(BlockSide side, Vec3 start, Vec3 look) {
AABB box = getRenderBoundingBox();
double pHitDistance = box.distanceToSqr(start) + 2;
Vec3 vec32 = start.add(look.x * pHitDistance, look.y * pHitDistance, look.z * pHitDistance);
box = box.move(
-getBlockPos().getX(),
-getBlockPos().getY(),
-getBlockPos().getZ()
);
BlockHitResult bhr = AABB.clip(Arrays.asList(box), start, vec32, getBlockPos());
if (bhr == null || bhr.getType() != HitResult.Type.BLOCK || bhr.getDirection().ordinal() != side.ordinal()) {
bhr = AABB.clip(Arrays.asList(box), vec32, start, getBlockPos());
if (bhr == null || bhr.getType() != HitResult.Type.BLOCK || bhr.getDirection().ordinal() != side.ordinal()) {
return BlockHitResult.miss(
vec32,
bhr == null ? Direction.getNearest(look.x, look.y, look.z).getOpposite() : bhr.getDirection(),
getBlockPos()
);
}
}
return bhr;
}
// @Override
// public boolean shouldRefresh(Level world, BlockPos pos, @Nonnull BlockState oldState, @Nonnull BlockState newState) {
// if(oldState.getBlock() != WebDisplays.INSTANCE.blockScreen || newState.getBlock() != WebDisplays.INSTANCE.blockScreen)

View File

@ -16,13 +16,13 @@ import net.montoyo.wd.client.ClientProxy;
import net.montoyo.wd.config.ClientConfig;
import net.montoyo.wd.controls.builtin.ClickControl;
import net.montoyo.wd.core.DefaultUpgrade;
import net.montoyo.wd.entity.ScreenData;
import net.montoyo.wd.entity.ScreenBlockEntity;
import net.montoyo.wd.registry.BlockRegistry;
import net.montoyo.wd.entity.ScreenData;
import net.montoyo.wd.net.WDNetworkRegistry;
import net.montoyo.wd.net.server_bound.C2SMessageScreenCtrl;
import net.montoyo.wd.utilities.data.BlockSide;
import net.montoyo.wd.registry.BlockRegistry;
import net.montoyo.wd.utilities.Multiblock;
import net.montoyo.wd.utilities.data.BlockSide;
import net.montoyo.wd.utilities.math.Vector2i;
import net.montoyo.wd.utilities.math.Vector3i;
@ -120,11 +120,6 @@ public class ItemLaserPointer extends Item implements WDItem {
BlockSide side = BlockSide.values()[result.getDirection().ordinal()];
Multiblock.findOrigin(mc.level, pos, side, null);
float hitX = ((float) result.getLocation().x) - (float) pos.x;
float hitY = ((float) result.getLocation().y) - (float) pos.y;
float hitZ = ((float) result.getLocation().z) - (float) pos.z;
Vector2i tmp = new Vector2i();
BlockEntity be = mc.level.getBlockEntity(pos.toBlock());
if (!(be instanceof ScreenBlockEntity)) return;
@ -132,20 +127,16 @@ public class ItemLaserPointer extends Item implements WDItem {
ScreenBlockEntity te = (ScreenBlockEntity) be;
if (te.hasUpgrade(side, DefaultUpgrade.LASERMOUSE)) { //hasUpgrade returns false is there's no screen on side 'side'
//Since rights aren't synchronized, let the server check them for us...
ScreenData scr = te.getScreen(side);
if (scr.browser != null) {
if (ScreenBlock.hit2pixels(side, result.getBlockPos(), new Vector3i(result.getBlockPos()), scr, hitX, hitY, hitZ, tmp)) {
te.handleMouseEvent(side, ClickControl.ControlType.MOVE, tmp, -1);
te.handleMouseEvent(side, press ? ClickControl.ControlType.DOWN : ClickControl.ControlType.UP, tmp, button);
if (press)
WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.laserDown(te, side, tmp, button));
else
WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.laserUp(te, side, button));
}
}
int finalButton = button;
te.interact(result, (hit) -> {
te.handleMouseEvent(side, ClickControl.ControlType.MOVE, hit, -1);
te.handleMouseEvent(side, press ? ClickControl.ControlType.DOWN : ClickControl.ControlType.UP, hit, finalButton);
if (press)
WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.laserDown(te, side, hit, finalButton));
else
WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.laserUp(te, side, finalButton));
});
}
}

View File

@ -7,7 +7,6 @@
"block.webdisplays.ccinterface": "ComputerCraft Interface",
"block.webdisplays.cointerface": "OpenComputers Interface",
"block.webdisplays.redctrl": "Redstone Controller",
"block.webdisplays.redctrl": "Redstone Controller",
"block.webdisplays.server": "Server",
"item.webdisplays.screencfg": "Screen Configurator",
"item.webdisplays.ownerthief": "Ownership Thief [ADMIN]",
@ -154,5 +153,7 @@
"webdisplays.server.help.upload": "Opens the upload wizard",
"webdisplays.server.help.rm": "Deletes a file",
"webdisplays.server.help.reconnect": "Reconnect to miniserv [DEBUG]",
"webdisplays.server.press_for_more": "<Press DOWN to show more>"
"webdisplays.server.press_for_more": "<Press DOWN to show more>",
"webdisplays.key.toggle_mouse": "Toggle Laser Mouse (WebDisplays)",
"webdisplays.gui.minepad.close": "Press Shift and Escape to close."
}

View File

@ -0,0 +1,156 @@
{
"itemGroup.webdisplays": "§5Web Displays",
"block.webdisplays.screen": "Ecran",
"block.webdisplays.peripheral": "Périphérique",
"block.webdisplays.kb_left": "Clavier",
"block.webdisplays.rctrl": "Télécommande",
"block.webdisplays.ccinterface": "Interface ComputerCraft",
"block.webdisplays.cointerface": "Interface OpenComputers",
"block.webdisplays.redctrl": "Contrôleur",
"block.webdisplays.server": "Serveur",
"item.webdisplays.screencfg": "Gestionnaire d'écran",
"item.webdisplays.ownerthief": "Voleur d'écran [ADMIN]",
"item.webdisplays.linker": "Outil d'appairage",
"item.webdisplays.craftcomp": "Ingrédient de recette",
"item.webdisplays.craftcomp_stonekey": "Touche en pierre",
"item.webdisplays.craftcomp_upgrade": "Amélioration vide",
"item.webdisplays.craftcomp_peripheral": "Base de périphérique",
"item.webdisplays.craftcomp_batcell": "Cellule de batterie",
"item.webdisplays.craftcomp_batpack": "Batterie",
"item.webdisplays.craftcomp_laserdiode": "Diode laser 650nm",
"item.webdisplays.craftcomp_backlight": "Rétroéclairage",
"item.webdisplays.craftcomp_extcard": "Carte d'extension",
"item.webdisplays.craftcomp_badextcard": "Carte d'extension ratée",
"item.webdisplays.minepad": "minePad",
"item.webdisplays.minepad2": "minePad 2",
"item.webdisplays.upgrade": "Amélioration d'écran",
"item.webdisplays.upgrade_lasermouse": "Capteur de laser",
"item.webdisplays.upgrade_redinput": "Port d'entrée Redstone",
"item.webdisplays.upgrade_redoutput": "Port de sortie Redstone",
"item.webdisplays.upgrade_gps": "Module GALILEO",
"item.webdisplays.laserpointer": "Pointeur laser",
"item.webdisplays.advicon": "Icone de progrès",
"item.webdisplays.advicon.wd": "WebDisplays",
"item.webdisplays.advicon.brokenpad": "minePad cassé",
"item.webdisplays.advicon.pigeon": "Pigeon",
"item.webdisplays.wiki": "Appuyez sur \"F1\" pour ouvrir le Wiki",
"webdisplays.message.tooSmall": "Trop petit ! La taille minimale est de 2x2.",
"webdisplays.message.tooBig": "Trop grand ! La taille maximale est de %dx%d.",
"webdisplays.message.invalid": "La structure est invalide; regardez vers %s.",
"webdisplays.message.turnOn": "Vous devez d'abord allumer l'écran",
"webdisplays.message.screenSet": "Ecran sélectionné ! Donnez l'item à quelqu'un...",
"webdisplays.message.newOwner": "Vous êtes maintenant le propriétaire de cet écran",
"webdisplays.message.restrictions": "Vous n'avez pas le droit de faire cela :(",
"webdisplays.message.peripheral": "Ce n'est pas un périphérique!",
"webdisplays.message.linked": "Appairé !",
"webdisplays.message.linkError": "Erreur d'appairage... :( vérifiez les logs",
"webdisplays.message.notAScreen": "Vous devez d'abord sélectionner un écran",
"webdisplays.message.screenSet2": "Ecran sélectionné! Maintenant, sélectionnez un périphérique...",
"webdisplays.message.chunkUnloaded": "Le chunk dans lequel se trouve l'écran n'est pas chargé",
"webdisplays.message.notLinked": "Ce périphérique n'a pas encore été appairé",
"webdisplays.message.missingCC": "ComputerCraft non disponible.",
"webdisplays.message.missingOC": "OpenComputers non disponible.",
"webdisplays.message.upgradeError": "Erreur lors de l'amélioration, vérifiez les logs",
"webdisplays.message.upgradeOk": "Amélioration installée !",
"webdisplays.message.linkAbort": "Outil d'appairage remis à zéro.",
"webdisplays.message.noMiniserv": "Le bloc serveur est désactivé",
"webdisplays.message.otDisabled": "Le voleur d'écran est désactivé sur ce serveur",
"webdisplays.message.welcome1": "Merci d'avoir installé WebDisplays ! Pour obtenir",
"webdisplays.message.welcome2": "de l'aide sur un item, passez la souris dessus",
"webdisplays.message.welcome3": "et appuyez sur F1. Amusez-vous bien, - montoyo",
"webdisplays.gui.screencfg.owner": "Propriétaire :",
"webdisplays.gui.screencfg.friends": "Amis :",
"webdisplays.gui.screencfg.permissions": "Permissions :",
"webdisplays.gui.screencfg.seturl": "Changer l'URL",
"webdisplays.gui.screencfg.click": "Cliquer & écrire",
"webdisplays.gui.screencfg.friendlist": "Gérer les amis",
"webdisplays.gui.screencfg.otherrights": "Gérer les autres",
"webdisplays.gui.screencfg.mupgrades": "Améliorer & appairer",
"webdisplays.gui.screencfg.mres": "Changer la résolution",
"webdisplays.gui.screencfg.others": "Autres",
"webdisplays.gui.screencfg.upgrades": "Améliorations :",
"webdisplays.gui.screencfg.resolution": "Résolution :",
"webdisplays.gui.screencfg.setres": "Déf. Resolution",
"webdisplays.gui.screencfg.rotation": "Rotation",
"webdisplays.gui.screencfg.rot0": "0°",
"webdisplays.gui.screencfg.rot90": "90°",
"webdisplays.gui.screencfg.rot180": "180°",
"webdisplays.gui.screencfg.rot270": "270°",
"webdisplays.gui.screencfg.lockratio": "Verrouiller le ratio",
"webdisplays.gui.screencfg.autovol": "Volume Auto",
"webdisplays.gui.screencfg.avwarning": "§cAttention !\nLe volume auto ne fonctionne\nque sur les vidéos YouTube, et\nsi il a été activé dans la config !",
"webdisplays.linker.selectScreen": "Cliquez droit sur un écran",
"webdisplays.linker.selectPeripheral": "Cliquez droit sur un périphérique",
"webdisplays.linker.posInfo": "Pos. écran : %d %d %d",
"webdisplays.linker.sideInfo": "Côté : %s",
"webdisplays.gui.seturl.url": "URL:",
"webdisplays.gui.seturl.ok": "OK",
"webdisplays.gui.seturl.cancel": "Annuler",
"webdisplays.gui.seturl.shutdown": "Eteindre",
"webdisplays.minepad.turnon": "Pour allumer, s'accroupir et faire clique-droit",
"webdisplays.minepad2.info": "PAS DE REMBOURSEMENT !",
"webdisplays.extcard.cantcraft1": "Vous n'avez pas assez de connaissances",
"webdisplays.extcard.cantcraft2": "Vous ALLEZ RATER la fabrication de cet item",
"webdisplays.extcard.bad": "Quelqu'un a raté la fabrication de cette carte",
"webdisplays.gui.keyboard.hooked": "Clavier attaché. Appuyez sur Echap pour quitter.",
"webdisplays.gui.keyboard.warning1": "ATTENTION ! Le texte que vous tapez ici est envoyé EN CLAIR au serveur.",
"webdisplays.gui.keyboard.warning2": "Cela signifie que tout le monde peut voir ce que vous tapez.",
"webdisplays.gui.keyboard.warning3": "Ne JAMAIS taper de mot de passe avec ce clavier.",
"webdisplays.gui.keyboard.gotcha": "Je comprends",
"advancements.webdisplays.root.title": "WebDisplays",
"advancements.webdisplays.root.description": "Le mod WebDisplays",
"advancements.webdisplays.screen.title": "The internet is for...",
"advancements.webdisplays.screen.description": "Fabriquez votre premier écran",
"advancements.webdisplays.minepad.title": "C'est une révolution",
"advancements.webdisplays.minepad.description": "Essayez notre tout dernier bijoux technologique: le minePad !",
"advancements.webdisplays.padbreak.title": "Rétro-ingénierie",
"advancements.webdisplays.padbreak.description": "Ces trucs là sont fragiles ! Ne les jetez pas de haut pour débloquer les recettes des améliorations !",
"advancements.webdisplays.minepad2.title": "Pigeon",
"advancements.webdisplays.minepad2.description": "Fabriquez un minePad 2. Ecoutez, je sais que c'est très cher, mais ça veut dire que ce qu'il y'a de mieux non ?",
"advancements.webdisplays.linkperipheral.title": "Sans fils !",
"advancements.webdisplays.linkperipheral.description": "Appairez un périphérique à un écran",
"advancements.webdisplays.keyboardcat.title": "PU**IN DE CHATS",
"advancements.webdisplays.keyboardcat.description": "Faites en sorte qu'un ocelot marche sur votre clavier",
"advancements.webdisplays.upgrade.title": "Plus qu'un écran",
"advancements.webdisplays.upgrade.description": "Installez votre première amélioration",
"advancements.webdisplays.laser.title": "Ne pas viser les yeux",
"advancements.webdisplays.laser.description": "Fabriquez un pointeur laser",
"webdisplays.side.bottom": "Bas",
"webdisplays.side.top": "Haut",
"webdisplays.side.north": "Nord",
"webdisplays.side.south": "Sud",
"webdisplays.side.west": "Ouest",
"webdisplays.side.east": "Est",
"webdisplays.server.info": "Tapez \"help\" pour obtenir de l'aide",
"webdisplays.server.unknowncmd": "Commande inconnue.",
"webdisplays.server.error": "Erreur interne. Vérifiez les logs.",
"webdisplays.server.error2": "Erreur interne %d. Vérifiez les logs.",
"webdisplays.server.argerror": "Argument non reconnu",
"webdisplays.server.queryerr": "Erreur de requête, essayez \"reconnect\".",
"webdisplays.server.errowner": "Seul le propriétaire peut faire cela.",
"webdisplays.server.timeout": "Le délai est dépaissé. Vérifiez les logs.",
"webdisplays.server.ownername": "Nom du propriétaire : %s",
"webdisplays.server.owneruuid": "UUID du propriétaire :",
"webdisplays.server.quota": "%s/%s utilisés",
"webdisplays.server.fnamearg": "Nom de fichier manquant",
"webdisplays.server.nameerr": "Nom de fichier invalide",
"webdisplays.server.urlcopied": "URL copié dans le presse-papier.",
"webdisplays.server.notfound": "Fichier introuvable",
"webdisplays.server.upload.info": "Choisissez un fichier",
"webdisplays.server.upload.parent": "[Dossier parent]",
"webdisplays.server.upload.uploading": "Mise en ligne...",
"webdisplays.server.upload.done": "Terminé !",
"webdisplays.server.upload.exists": "Erreur : le fichier existe",
"webdisplays.server.upload.quota": "Erreur : taille max atteinte",
"webdisplays.server.help.help": "Affiche ce texte",
"webdisplays.server.help.clear": "Efface l'écran",
"webdisplays.server.help.exit": "Quitte la console",
"webdisplays.server.help.access": "§kPas d'aide disponible",
"webdisplays.server.help.owner": "Affiche le proprio. de ce serveur",
"webdisplays.server.help.quota": "Affiche le quota de stockage",
"webdisplays.server.help.ls": "Liste les fichiers de ce serveur",
"webdisplays.server.help.url": "Copie l'URL d'un fichier",
"webdisplays.server.help.upload": "Ouvre l'assitant de mise en ligne",
"webdisplays.server.help.rm": "Supprime un fichier",
"webdisplays.server.help.reconnect": "Se reco. à Miniserv [DEBUG]"
}

View File

@ -1,154 +0,0 @@
itemGroup.webdisplays=§5Web Displays
tile.webdisplays.screen.name=Ecran
tile.webdisplays.peripheral.name=Périphérique
tile.webdisplays.peripheral.keyboard.name=Clavier
tile.webdisplays.peripheral.remotectrl.name=Télécommande
tile.webdisplays.peripheral.ccinterface.name=Interface ComputerCraft
tile.webdisplays.peripheral.cointerface.name=Interface OpenComputers
tile.webdisplays.peripheral.redstonectrl.name=Contrôleur
tile.webdisplays.peripheral.server.name=Serveur
item.webdisplays.screencfg.name=Gestionnaire d'écran
item.webdisplays.ownerthief.name=Voleur d'écran [ADMIN]
item.webdisplays.linker.name=Outil d'appairage
item.webdisplays.craftcomp.name=Ingrédient de recette
item.webdisplays.craftcomp.stonekey.name=Touche en pierre
item.webdisplays.craftcomp.upgrade.name=Amélioration vide
item.webdisplays.craftcomp.peripheral.name=Base de périphérique
item.webdisplays.craftcomp.batcell.name=Cellule de batterie
item.webdisplays.craftcomp.batpack.name=Batterie
item.webdisplays.craftcomp.laserdiode.name=Diode laser 650nm
item.webdisplays.craftcomp.backlight.name=Rétroéclairage
item.webdisplays.craftcomp.extcard.name=Carte d'extension
item.webdisplays.craftcomp.badextcard.name=Carte d'extension ratée
item.webdisplays.minepad.name=minePad
item.webdisplays.minepad2.name=minePad 2
item.webdisplays.upgrade.name=Amélioration d'écran
item.webdisplays.upgrade.lasermouse.name=Capteur de laser
item.webdisplays.upgrade.redinput.name=Port d'entrée Redstone
item.webdisplays.upgrade.redoutput.name=Port de sortie Redstone
item.webdisplays.upgrade.gps.name=Module GALILEO
item.webdisplays.laserpointer.name=Pointeur laser
item.webdisplays.advicon.name=Icone de progrès
item.webdisplays.advicon.wd.name=WebDisplays
item.webdisplays.advicon.brokenpad.name=minePad cassé
item.webdisplays.advicon.pigeon.name=Pigeon
item.webdisplays.wiki=Appuyez sur "F1" pour ouvrir le Wiki
webdisplays.message.tooSmall=Trop petit ! La taille minimale est de 2x2.
webdisplays.message.tooBig=Trop grand ! La taille maximale est de %dx%d.
webdisplays.message.invalid=La structure est invalide; regardez vers %s.
webdisplays.message.turnOn=Vous devez d'abord allumer l'écran
webdisplays.message.screenSet=Ecran sélectionné ! Donnez l'item à quelqu'un...
webdisplays.message.newOwner=Vous êtes maintenant le propriétaire de cet écran
webdisplays.message.restrictions=Vous n'avez pas le droit de faire cela :(
webdisplays.message.peripheral=Ce n'est pas un périphérique!
webdisplays.message.linked=Appairé !
webdisplays.message.linkError=Erreur d'appairage... :( vérifiez les logs
webdisplays.message.notAScreen=Vous devez d'abord sélectionner un écran
webdisplays.message.screenSet2=Ecran sélectionné! Maintenant, sélectionnez un périphérique...
webdisplays.message.chunkUnloaded=Le chunk dans lequel se trouve l'écran n'est pas chargé
webdisplays.message.notLinked=Ce périphérique n'a pas encore été appairé
webdisplays.message.missingCC=ComputerCraft non disponible.
webdisplays.message.missingOC=OpenComputers non disponible.
webdisplays.message.upgradeError=Erreur lors de l'amélioration, vérifiez les logs
webdisplays.message.upgradeOk=Amélioration installée !
webdisplays.message.linkAbort=Outil d'appairage remis à zéro.
webdisplays.message.noMiniserv=Le bloc serveur est désactivé
webdisplays.message.otDisabled=Le voleur d'écran est désactivé sur ce serveur
webdisplays.message.welcome1=Merci d'avoir installé WebDisplays ! Pour obtenir
webdisplays.message.welcome2=de l'aide sur un item, passez la souris dessus
webdisplays.message.welcome3=et appuyez sur F1. Amusez-vous bien, - montoyo
webdisplays.gui.screencfg.owner=Propriétaire :
webdisplays.gui.screencfg.friends=Amis :
webdisplays.gui.screencfg.permissions=Permissions :
webdisplays.gui.screencfg.seturl=Changer l'URL
webdisplays.gui.screencfg.click=Cliquer & écrire
webdisplays.gui.screencfg.friendlist=Gérer les amis
webdisplays.gui.screencfg.otherrights=Gérer les autres
webdisplays.gui.screencfg.mupgrades=Améliorer & appairer
webdisplays.gui.screencfg.mres=Changer la résolution
webdisplays.gui.screencfg.others=Autres
webdisplays.gui.screencfg.upgrades=Améliorations :
webdisplays.gui.screencfg.resolution=Résolution :
webdisplays.gui.screencfg.setres=Déf. Resolution
webdisplays.gui.screencfg.rotation=Rotation
webdisplays.gui.screencfg.rot0=0°
webdisplays.gui.screencfg.rot90=90°
webdisplays.gui.screencfg.rot180=180°
webdisplays.gui.screencfg.rot270=270°
webdisplays.gui.screencfg.lockratio=Verrouiller le ratio
webdisplays.gui.screencfg.autovol=Volume Auto
webdisplays.gui.screencfg.avwarning=§cAttention !\nLe volume auto ne fonctionne\nque sur les vidéos YouTube, et\nsi il a été activé dans la config !
webdisplays.linker.selectScreen=Cliquez droit sur un écran
webdisplays.linker.selectPeripheral=Cliquez droit sur un périphérique
webdisplays.linker.posInfo=Pos. écran : %d %d %d
webdisplays.linker.sideInfo=Côté : %s
webdisplays.gui.seturl.url=URL:
webdisplays.gui.seturl.ok=OK
webdisplays.gui.seturl.cancel=Annuler
webdisplays.gui.seturl.shutdown=Eteindre
webdisplays.minepad.turnon=Pour allumer, s'accroupir et faire clique-droit
webdisplays.minepad2.info=PAS DE REMBOURSEMENT !
webdisplays.extcard.cantcraft1=Vous n'avez pas assez de connaissances
webdisplays.extcard.cantcraft2=Vous ALLEZ RATER la fabrication de cet item
webdisplays.extcard.bad=Quelqu'un a raté la fabrication de cette carte
webdisplays.gui.keyboard.hooked=Clavier attaché. Appuyez sur Echap pour quitter.
webdisplays.gui.keyboard.warning1=ATTENTION ! Le texte que vous tapez ici est envoyé EN CLAIR au serveur.
webdisplays.gui.keyboard.warning2=Cela signifie que tout le monde peut voir ce que vous tapez.
webdisplays.gui.keyboard.warning3=Ne JAMAIS taper de mot de passe avec ce clavier.
webdisplays.gui.keyboard.gotcha=Je comprends
advancements.webdisplays.root.title=WebDisplays
advancements.webdisplays.root.description=Le mod WebDisplays
advancements.webdisplays.screen.title=The internet is for...
advancements.webdisplays.screen.description=Fabriquez votre premier écran
advancements.webdisplays.minepad.title=C'est une révolution
advancements.webdisplays.minepad.description=Essayez notre tout dernier bijoux technologique: le minePad !
advancements.webdisplays.padbreak.title=Rétro-ingénierie
advancements.webdisplays.padbreak.description=Ces trucs là sont fragiles ! Ne les jetez pas de haut pour débloquer les recettes des améliorations !
advancements.webdisplays.minepad2.title=Pigeon
advancements.webdisplays.minepad2.description=Fabriquez un minePad 2. Ecoutez, je sais que c'est très cher, mais ça veut dire que ce qu'il y'a de mieux non ?
advancements.webdisplays.linkperipheral.title=Sans fils !
advancements.webdisplays.linkperipheral.description=Appairez un périphérique à un écran
advancements.webdisplays.keyboardcat.title=PU**IN DE CHATS
advancements.webdisplays.keyboardcat.description=Faites en sorte qu'un ocelot marche sur votre clavier
advancements.webdisplays.upgrade.title=Plus qu'un écran
advancements.webdisplays.upgrade.description=Installez votre première amélioration
advancements.webdisplays.laser.title=Ne pas viser les yeux
advancements.webdisplays.laser.description=Fabriquez un pointeur laser
webdisplays.side.bottom=Bas
webdisplays.side.top=Haut
webdisplays.side.north=Nord
webdisplays.side.south=Sud
webdisplays.side.west=Ouest
webdisplays.side.east=Est
webdisplays.server.info=Tapez "help" pour obtenir de l'aide
webdisplays.server.unknowncmd=Commande inconnue.
webdisplays.server.error=Erreur interne. Vérifiez les logs.
webdisplays.server.error2=Erreur interne %d. Vérifiez les logs.
webdisplays.server.argerror=Argument non reconnu
webdisplays.server.queryerr=Erreur de requête, essayez "reconnect".
webdisplays.server.errowner=Seul le propriétaire peut faire cela.
webdisplays.server.timeout=Le délai est dépaissé. Vérifiez les logs.
webdisplays.server.ownername=Nom du propriétaire : %s
webdisplays.server.owneruuid=UUID du propriétaire :
webdisplays.server.quota=%s/%s utilisés
webdisplays.server.fnamearg=Nom de fichier manquant
webdisplays.server.nameerr=Nom de fichier invalide
webdisplays.server.urlcopied=URL copié dans le presse-papier.
webdisplays.server.notfound=Fichier introuvable
webdisplays.server.upload.info=Choisissez un fichier
webdisplays.server.upload.parent=[Dossier parent]
webdisplays.server.upload.uploading=Mise en ligne...
webdisplays.server.upload.done=Terminé !
webdisplays.server.upload.exists=Erreur : le fichier existe
webdisplays.server.upload.quota=Erreur : taille max atteinte
webdisplays.server.help.help=Affiche ce texte
webdisplays.server.help.clear=Efface l'écran
webdisplays.server.help.exit=Quitte la console
webdisplays.server.help.access=§kPas d'aide disponible
webdisplays.server.help.owner=Affiche le proprio. de ce serveur
webdisplays.server.help.quota=Affiche le quota de stockage
webdisplays.server.help.ls=Liste les fichiers de ce serveur
webdisplays.server.help.url=Copie l'URL d'un fichier
webdisplays.server.help.upload=Ouvre l'assitant de mise en ligne
webdisplays.server.help.rm=Supprime un fichier
webdisplays.server.help.reconnect=Se reco. à Miniserv [DEBUG]

View File

@ -0,0 +1,151 @@
{
"itemGroup.webdisplays": "§5内置网页浏览器",
"block.webdisplays.screen": "网页屏幕方块",
"block.webdisplays.peripheral": "外部设备",
"block.webdisplays.kb_left": "键盘",
"block.webdisplays.rctrl": "网页输入器",
"block.webdisplays.ccinterface": "ComputerCraft接口",
"block.webdisplays.cointerface": "OpenComputers接口",
"block.webdisplays.redctrl": "红石控制器",
"block.webdisplays.server": "服务器方块",
"item.webdisplays.screencfg": "屏幕配置器",
"item.webdisplays.ownerthief": "屏幕所有权给予器[管理员物品]",
"item.webdisplays.linker": "连接工具",
"item.webdisplays.craftcomp": "制作材料",
"item.webdisplays.craftcomp_stonekey": "石头按钮",
"item.webdisplays.craftcomp_upgrade": "空白升级组件",
"item.webdisplays.craftcomp_peripheral": "外部设备材料",
"item.webdisplays.craftcomp_batcell": "电池",
"item.webdisplays.craftcomp_batpack": "电池组",
"item.webdisplays.craftcomp_laserdiode": "650纳米激光二极管",
"item.webdisplays.craftcomp_backlight": "屏幕背景",
"item.webdisplays.craftcomp_extcard": "扩充卡片",
"item.webdisplays.craftcomp_badextcard": "损坏的扩充卡片",
"item.webdisplays.minepad": "掌上电脑",
"item.webdisplays.minepad2": "第二代掌上电脑",
"item.webdisplays.upgrade": "屏幕升级组件",
"item.webdisplays.upgrade_lasermouse": "激光笔模块",
"item.webdisplays.upgrade_redinput": "红石输入模块",
"item.webdisplays.upgrade_redoutput": "红石输出模块",
"item.webdisplays.upgrade_gps": "GPS模块",
"item.webdisplays.laserpointer": "激光笔",
"item.webdisplays.advicon": "进度图标",
"item.webdisplays.advicon.wd": "内置网页浏览器",
"item.webdisplays.advicon.brokenpad": "损坏的掌上电脑",
"item.webdisplays.advicon.pigeon": "鸽子",
"item.webdisplays.wiki": "点击\"F1\"来打开维基百科",
"webdisplays.message.tooSmall": "这个屏幕太小了!最小尺寸是2x2.",
"webdisplays.message.tooBig": "这个屏幕太大了!最大尺寸是%dx%d.",
"webdisplays.message.invalid": "这个结构无效;你在看着坐标%s.",
"webdisplays.message.turnOn": "你需要先打开这个屏幕!",
"webdisplays.message.screenSet": "屏幕已设置!现在应将这个物品给新的拥有者...",
"webdisplays.message.newOwner": "你现在是这个屏幕的拥有者!",
"webdisplays.message.restrictions": "你不能做这件事 :(",
"webdisplays.message.peripheral": "这不是一个外部设备!",
"webdisplays.message.linked": "已连接!",
"webdisplays.message.linkError": "连接失败 :( 请检查日志...",
"webdisplays.message.notAScreen": "请先右击屏幕...",
"webdisplays.message.screenSet2": "屏幕已设置!现在右击一个外部设备...",
"webdisplays.message.chunkUnloaded": "放置在这个区块的屏幕未开启!",
"webdisplays.message.notLinked": "这个外部设备还未连接.",
"webdisplays.message.missingCC": "ComputerCraft不可用.",
"webdisplays.message.missingOC": "OpenComputers不可用.",
"webdisplays.message.upgradeError": "升级组件安装失败 :( 请检查日志...",
"webdisplays.message.upgradeOk": "升级组件已安装!",
"webdisplays.message.linkAbort": "连接器复位",
"webdisplays.message.noMiniserv": "服务器方块在这个服务器不可用",
"webdisplays.message.otDisabled": "屏幕所有权给予者在这个服务器不可用",
"webdisplays.gui.screencfg.owner": "屏幕拥有者:",
"webdisplays.gui.screencfg.friends": "朋友:",
"webdisplays.gui.screencfg.permissions": "权限:",
"webdisplays.gui.screencfg.seturl": "修改网址",
"webdisplays.gui.screencfg.click": "点击和输入",
"webdisplays.gui.screencfg.friendlist": "管理朋友",
"webdisplays.gui.screencfg.otherrights": "管理其他人",
"webdisplays.gui.screencfg.mupgrades": "安装升级组件和连接",
"webdisplays.gui.screencfg.mres": "改变分辨率",
"webdisplays.gui.screencfg.others": "其他人",
"webdisplays.gui.screencfg.upgrades": "升级组件:",
"webdisplays.gui.screencfg.resolution": "当前分辨率:",
"webdisplays.gui.screencfg.setres": "设置分辨率",
"webdisplays.gui.screencfg.rotation": "角度",
"webdisplays.gui.screencfg.rot0": "0°",
"webdisplays.gui.screencfg.rot90": "90°",
"webdisplays.gui.screencfg.rot180": "180°",
"webdisplays.gui.screencfg.rot270": "270°",
"webdisplays.gui.screencfg.lockratio": "锁定分辨率比例",
"webdisplays.linker.selectScreen": "右击一个屏幕",
"webdisplays.linker.selectPeripheral": "右击一个外部设备",
"webdisplays.linker.posInfo": "屏幕位置:%d %d %d",
"webdisplays.linker.sideInfo": "地址:%s",
"webdisplays.gui.seturl.url": "网址:",
"webdisplays.gui.seturl.ok": "确定",
"webdisplays.gui.seturl.cancel": "取消",
"webdisplays.gui.seturl.shutdown": "停止",
"webdisplays.minepad.turnon": "潜行并右击来打开",
"webdisplays.minepad2.info": "不退款!",
"webdisplays.extcard.cantcraft1": "你知道的还不够多.",
"webdisplays.extcard.cantcraft2": "你不能制作这个物品.",
"webdisplays.extcard.bad": "有人制作扩展卡片失败了",
"webdisplays.gui.keyboard.hooked": "已连接至你的键盘.请按ESC离开界面.",
"webdisplays.gui.keyboard.warning1": "警告!你输入的数据都将以纯文本形式发送到服务器.",
"webdisplays.gui.keyboard.warning2": "这意味着任何人都可以知道你在输入什么.",
"webdisplays.gui.keyboard.warning3": "永远都不要用这个键盘输入你的密码.",
"webdisplays.gui.keyboard.gotcha": "被我耍到啦",
"advancements.webdisplays.root.title": "内置网页浏览器",
"advancements.webdisplays.root.description": "内置网页浏览器Mod",
"advancements.webdisplays.screen.title": "互联网是...",
"advancements.webdisplays.screen.description": "制作你第一个屏幕方块",
"advancements.webdisplays.minepad.title": "这可是个革命",
"advancements.webdisplays.minepad.description": "你得到了最新的科技:掌上电脑",
"advancements.webdisplays.padbreak.title": "逆向工程",
"advancements.webdisplays.padbreak.description": "这些东西易碎!不要为了得到升级组件材料而让掌上电脑从高空坠落",
"advancements.webdisplays.minepad2.title": "鸽子",
"advancements.webdisplays.minepad2.description": "制作第二代掌上电脑.看,我知道它有多贵,但这意味着它比任何东西都好,对吧?...对吧?",
"advancements.webdisplays.linkperipheral.title": "这是无线的!",
"advancements.webdisplays.linkperipheral.description": "连接外部设备到屏幕",
"advancements.webdisplays.keyboardcat.title": "可恶的猫",
"advancements.webdisplays.keyboardcat.description": "让一只猫踩过你的键盘",
"advancements.webdisplays.upgrade.title": "不仅只是一个屏幕",
"advancements.webdisplays.upgrade.description": "安装了你的第一个升级组件",
"advancements.webdisplays.laser.title": "不要对着眼睛",
"advancements.webdisplays.laser.description": "制作激光笔!",
"webdisplays.side.bottom": "底部",
"webdisplays.side.top": "顶部",
"webdisplays.side.north": "北方",
"webdisplays.side.south": "南方",
"webdisplays.side.west": "西方",
"webdisplays.side.east": "东方",
"webdisplays.server.info": "如果你需要帮助请输入\"help\".",
"webdisplays.server.unknowncmd": "未知指令.",
"webdisplays.server.error": "内部错误.请检查日志.",
"webdisplays.server.error2": "内部错误%d.请检查日志.",
"webdisplays.server.argerror": "未识别的参数.",
"webdisplays.server.queryerr": "查询错误,尝试输入\"reconnect\".",
"webdisplays.server.errowner": "只有拥有者才可以访问.",
"webdisplays.server.timeout": "查询超时.请检查日志.",
"webdisplays.server.ownername": "拥有者名称:%s",
"webdisplays.server.owneruuid": "拥有者UUID:",
"webdisplays.server.quota": "%s/%s已使用",
"webdisplays.server.fnamearg": "丢失文件名参数",
"webdisplays.server.nameerr": "无效的文件名",
"webdisplays.server.urlcopied": "复制网址到你的剪切板.",
"webdisplays.server.notfound": "文件未找到",
"webdisplays.server.upload.info": "选择一个文件来上传",
"webdisplays.server.upload.parent": "[父目录]",
"webdisplays.server.upload.uploading": "上传中...",
"webdisplays.server.upload.done": "完成",
"webdisplays.server.upload.exists": "错误:文件不存在",
"webdisplays.server.upload.quota": "错误:文件过大",
"webdisplays.server.help.help": "显示这段文本",
"webdisplays.server.help.clear": "清空这个屏幕",
"webdisplays.server.help.exit": "离开这个控制台",
"webdisplays.server.help.access": "§k无帮助文件",
"webdisplays.server.help.owner": "显示服务器的拥有者",
"webdisplays.server.help.quota": "显示存储空间",
"webdisplays.server.help.ls": "显示这个服务器的文件",
"webdisplays.server.help.url": "复制一个文件网址到你的剪切板",
"webdisplays.server.help.upload": "打开上传向导",
"webdisplays.server.help.rm": "删除一个文件",
"webdisplays.server.help.reconnect": "重新连接到服务器[调试中]"
}

View File

@ -1,149 +0,0 @@
itemGroup.webdisplays=§5内置网页浏览器
tile.webdisplays.screen.name=网页屏幕方块
tile.webdisplays.peripheral.name=外部设备
tile.webdisplays.peripheral.keyboard.name=键盘
tile.webdisplays.peripheral.remotectrl.name=网页输入器
tile.webdisplays.peripheral.ccinterface.name=ComputerCraft接口
tile.webdisplays.peripheral.cointerface.name=OpenComputers接口
tile.webdisplays.peripheral.redstonectrl.name=红石控制器
tile.webdisplays.peripheral.server.name=服务器方块
item.webdisplays.screencfg.name=屏幕配置器
item.webdisplays.ownerthief.name=屏幕所有权给予器[管理员物品]
item.webdisplays.linker.name=连接工具
item.webdisplays.craftcomp.name=制作材料
item.webdisplays.craftcomp.stonekey.name=石头按钮
item.webdisplays.craftcomp.upgrade.name=空白升级组件
item.webdisplays.craftcomp.peripheral.name=外部设备材料
item.webdisplays.craftcomp.batcell.name=电池
item.webdisplays.craftcomp.batpack.name=电池组
item.webdisplays.craftcomp.laserdiode.name=650纳米激光二极管
item.webdisplays.craftcomp.backlight.name=屏幕背景
item.webdisplays.craftcomp.extcard.name=扩充卡片
item.webdisplays.craftcomp.badextcard.name=损坏的扩充卡片
item.webdisplays.minepad.name=掌上电脑
item.webdisplays.minepad2.name=第二代掌上电脑
item.webdisplays.upgrade.name=屏幕升级组件
item.webdisplays.upgrade.lasermouse.name=激光笔模块
item.webdisplays.upgrade.redinput.name=红石输入模块
item.webdisplays.upgrade.redoutput.name=红石输出模块
item.webdisplays.upgrade.gps.name=GPS模块
item.webdisplays.laserpointer.name=激光笔
item.webdisplays.advicon.name=进度图标
item.webdisplays.advicon.wd.name=内置网页浏览器
item.webdisplays.advicon.brokenpad.name=损坏的掌上电脑
item.webdisplays.advicon.pigeon.name=鸽子
item.webdisplays.wiki=点击"F1"来打开维基百科
webdisplays.message.tooSmall=这个屏幕太小了!最小尺寸是2x2.
webdisplays.message.tooBig=这个屏幕太大了!最大尺寸是%dx%d.
webdisplays.message.invalid=这个结构无效;你在看着坐标%s.
webdisplays.message.turnOn=你需要先打开这个屏幕!
webdisplays.message.screenSet=屏幕已设置!现在应将这个物品给新的拥有者...
webdisplays.message.newOwner=你现在是这个屏幕的拥有者!
webdisplays.message.restrictions=你不能做这件事 :(
webdisplays.message.peripheral=这不是一个外部设备!
webdisplays.message.linked=已连接!
webdisplays.message.linkError=连接失败 :( 请检查日志...
webdisplays.message.notAScreen=请先右击屏幕...
webdisplays.message.screenSet2=屏幕已设置!现在右击一个外部设备...
webdisplays.message.chunkUnloaded=放置在这个区块的屏幕未开启!
webdisplays.message.notLinked=这个外部设备还未连接.
webdisplays.message.missingCC=ComputerCraft不可用.
webdisplays.message.missingOC=OpenComputers不可用.
webdisplays.message.upgradeError=升级组件安装失败 :( 请检查日志...
webdisplays.message.upgradeOk=升级组件已安装!
webdisplays.message.linkAbort=连接器复位
webdisplays.message.noMiniserv=服务器方块在这个服务器不可用
webdisplays.message.otDisabled=屏幕所有权给予者在这个服务器不可用
webdisplays.gui.screencfg.owner=屏幕拥有者:
webdisplays.gui.screencfg.friends=朋友:
webdisplays.gui.screencfg.permissions=权限:
webdisplays.gui.screencfg.seturl=修改网址
webdisplays.gui.screencfg.click=点击和输入
webdisplays.gui.screencfg.friendlist=管理朋友
webdisplays.gui.screencfg.otherrights=管理其他人
webdisplays.gui.screencfg.mupgrades=安装升级组件和连接
webdisplays.gui.screencfg.mres=改变分辨率
webdisplays.gui.screencfg.others=其他人
webdisplays.gui.screencfg.upgrades=升级组件:
webdisplays.gui.screencfg.resolution=当前分辨率:
webdisplays.gui.screencfg.setres=设置分辨率
webdisplays.gui.screencfg.rotation=角度
webdisplays.gui.screencfg.rot0=0°
webdisplays.gui.screencfg.rot90=90°
webdisplays.gui.screencfg.rot180=180°
webdisplays.gui.screencfg.rot270=270°
webdisplays.gui.screencfg.lockratio=锁定分辨率比例
webdisplays.linker.selectScreen=右击一个屏幕
webdisplays.linker.selectPeripheral=右击一个外部设备
webdisplays.linker.posInfo=屏幕位置:%d %d %d
webdisplays.linker.sideInfo=地址:%s
webdisplays.gui.seturl.url=网址:
webdisplays.gui.seturl.ok=确定
webdisplays.gui.seturl.cancel=取消
webdisplays.gui.seturl.shutdown=停止
webdisplays.minepad.turnon=潜行并右击来打开
webdisplays.minepad2.info=不退款!
webdisplays.extcard.cantcraft1=你知道的还不够多.
webdisplays.extcard.cantcraft2=你不能制作这个物品.
webdisplays.extcard.bad=有人制作扩展卡片失败了
webdisplays.gui.keyboard.hooked=已连接至你的键盘.请按ESC离开界面.
webdisplays.gui.keyboard.warning1=警告!你输入的数据都将以纯文本形式发送到服务器.
webdisplays.gui.keyboard.warning2=这意味着任何人都可以知道你在输入什么.
webdisplays.gui.keyboard.warning3=永远都不要用这个键盘输入你的密码.
webdisplays.gui.keyboard.gotcha=被我耍到啦
advancements.webdisplays.root.title=内置网页浏览器
advancements.webdisplays.root.description=内置网页浏览器Mod
advancements.webdisplays.screen.title=互联网是...
advancements.webdisplays.screen.description=制作你第一个屏幕方块
advancements.webdisplays.minepad.title=这可是个革命
advancements.webdisplays.minepad.description=你得到了最新的科技:掌上电脑
advancements.webdisplays.padbreak.title=逆向工程
advancements.webdisplays.padbreak.description=这些东西易碎!不要为了得到升级组件材料而让掌上电脑从高空坠落
advancements.webdisplays.minepad2.title=鸽子
advancements.webdisplays.minepad2.description=制作第二代掌上电脑.看,我知道它有多贵,但这意味着它比任何东西都好,对吧?...对吧?
advancements.webdisplays.linkperipheral.title=这是无线的!
advancements.webdisplays.linkperipheral.description=连接外部设备到屏幕
advancements.webdisplays.keyboardcat.title=可恶的猫
advancements.webdisplays.keyboardcat.description=让一只猫踩过你的键盘
advancements.webdisplays.upgrade.title=不仅只是一个屏幕
advancements.webdisplays.upgrade.description=安装了你的第一个升级组件
advancements.webdisplays.laser.title=不要对着眼睛
advancements.webdisplays.laser.description=制作激光笔!
webdisplays.side.bottom=底部
webdisplays.side.top=顶部
webdisplays.side.north=北方
webdisplays.side.south=南方
webdisplays.side.west=西方
webdisplays.side.east=东方
webdisplays.server.info=如果你需要帮助请输入"help".
webdisplays.server.unknowncmd=未知指令.
webdisplays.server.error=内部错误.请检查日志.
webdisplays.server.error2=内部错误%d.请检查日志.
webdisplays.server.argerror=未识别的参数.
webdisplays.server.queryerr=查询错误,尝试输入"reconnect".
webdisplays.server.errowner=只有拥有者才可以访问.
webdisplays.server.timeout=查询超时.请检查日志.
webdisplays.server.ownername=拥有者名称:%s
webdisplays.server.owneruuid=拥有者UUID:
webdisplays.server.quota=%s/%s已使用
webdisplays.server.fnamearg=丢失文件名参数
webdisplays.server.nameerr=无效的文件名
webdisplays.server.urlcopied=复制网址到你的剪切板.
webdisplays.server.notfound=文件未找到
webdisplays.server.upload.info=选择一个文件来上传
webdisplays.server.upload.parent=[父目录]
webdisplays.server.upload.uploading=上传中...
webdisplays.server.upload.done=完成
webdisplays.server.upload.exists=错误:文件不存在
webdisplays.server.upload.quota=错误:文件过大
webdisplays.server.help.help=显示这段文本
webdisplays.server.help.clear=清空这个屏幕
webdisplays.server.help.exit=离开这个控制台
webdisplays.server.help.access=§k无帮助文件
webdisplays.server.help.owner=显示服务器的拥有者
webdisplays.server.help.quota=显示存储空间
webdisplays.server.help.ls=显示这个服务器的文件
webdisplays.server.help.url=复制一个文件网址到你的剪切板
webdisplays.server.help.upload=打开上传向导
webdisplays.server.help.rm=删除一个文件
webdisplays.server.help.reconnect=重新连接到服务器[调试中]