diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiKeyboard.java b/src/main/java/net/montoyo/wd/client/gui/GuiKeyboard.java index fb71a2e..bb3e796 100644 --- a/src/main/java/net/montoyo/wd/client/gui/GuiKeyboard.java +++ b/src/main/java/net/montoyo/wd/client/gui/GuiKeyboard.java @@ -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 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 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(); + } } diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiMinePad.java b/src/main/java/net/montoyo/wd/client/gui/GuiMinePad.java index 392b41b..1bde418 100644 --- a/src/main/java/net/montoyo/wd/client/gui/GuiMinePad.java +++ b/src/main/java/net/montoyo/wd/client/gui/GuiMinePad.java @@ -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; diff --git a/src/main/java/net/montoyo/wd/client/gui/camera/KeyboardCamera.java b/src/main/java/net/montoyo/wd/client/gui/camera/KeyboardCamera.java index f6a756c..769e31d 100644 --- a/src/main/java/net/montoyo/wd/client/gui/camera/KeyboardCamera.java +++ b/src/main/java/net/montoyo/wd/client/gui/camera/KeyboardCamera.java @@ -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; diff --git a/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java b/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java index 631ffa8..4fd4318 100644 --- a/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java +++ b/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java @@ -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; diff --git a/src/main/java/net/montoyo/wd/entity/ScreenBlockEntity.java b/src/main/java/net/montoyo/wd/entity/ScreenBlockEntity.java index bf51f6e..d7fca06 100644 --- a/src/main/java/net/montoyo/wd/entity/ScreenBlockEntity.java +++ b/src/main/java/net/montoyo/wd/entity/ScreenBlockEntity.java @@ -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 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) diff --git a/src/main/java/net/montoyo/wd/item/ItemLaserPointer.java b/src/main/java/net/montoyo/wd/item/ItemLaserPointer.java index 54a546f..bfa486f 100644 --- a/src/main/java/net/montoyo/wd/item/ItemLaserPointer.java +++ b/src/main/java/net/montoyo/wd/item/ItemLaserPointer.java @@ -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)); + }); } } diff --git a/src/main/resources/assets/webdisplays/lang/en_us.json b/src/main/resources/assets/webdisplays/lang/en_us.json index 8461bf7..45a3270 100644 --- a/src/main/resources/assets/webdisplays/lang/en_us.json +++ b/src/main/resources/assets/webdisplays/lang/en_us.json @@ -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": "" + "webdisplays.server.press_for_more": "", + "webdisplays.key.toggle_mouse": "Toggle Laser Mouse (WebDisplays)", + "webdisplays.gui.minepad.close": "Press Shift and Escape to close." } diff --git a/src/main/resources/assets/webdisplays/lang/fr_fr.json b/src/main/resources/assets/webdisplays/lang/fr_fr.json new file mode 100644 index 0000000..bfd5795 --- /dev/null +++ b/src/main/resources/assets/webdisplays/lang/fr_fr.json @@ -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]" +} \ No newline at end of file diff --git a/src/main/resources/assets/webdisplays/lang/fr_fr.lang b/src/main/resources/assets/webdisplays/lang/fr_fr.lang deleted file mode 100644 index 03dc747..0000000 --- a/src/main/resources/assets/webdisplays/lang/fr_fr.lang +++ /dev/null @@ -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] diff --git a/src/main/resources/assets/webdisplays/lang/zh_cn.json b/src/main/resources/assets/webdisplays/lang/zh_cn.json new file mode 100644 index 0000000..4e6f4b3 --- /dev/null +++ b/src/main/resources/assets/webdisplays/lang/zh_cn.json @@ -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": "重新连接到服务器[调试中]" +} diff --git a/src/main/resources/assets/webdisplays/lang/zh_cn.lang b/src/main/resources/assets/webdisplays/lang/zh_cn.lang deleted file mode 100644 index 911e287..0000000 --- a/src/main/resources/assets/webdisplays/lang/zh_cn.lang +++ /dev/null @@ -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=重新连接到服务器[调试中]