diff --git a/installer/1.16.2.json b/installer/1.16.2.json index e55c4fe..077a57d 100644 --- a/installer/1.16.2.json +++ b/installer/1.16.2.json @@ -1529,7 +1529,7 @@ ] }, { - "name": "cpw.mods:modlauncher:6.1.1", + "name": "cpw.mods:modlauncher:7.0.1", "url": "https://files.minecraftforge.net/maven/" }, { diff --git a/installer/Installer.java b/installer/Installer.java index 55ae4b3..28ab50d 100644 --- a/installer/Installer.java +++ b/installer/Installer.java @@ -50,7 +50,7 @@ public class Installer extends JPanel implements PropertyChangeListener private static final String OF_FILE_NAME = "1.16.2_HD_U_G3"; private static final String OF_MD5 = "0ecd18144e547a40dfae70fa58edc842"; private static final String OF_VERSION_EXT = ".jar"; - private static String FORGE_VERSION = "33.0.22"; + private static String FORGE_VERSION = "33.0.61"; private static final String HOMEPAGE_LINK = "http://www.vivecraft.org"; private static final String DONATION_LINK = "https://www.patreon.com/jrbudda"; private static final String PROJECT_NAME = "Vivecraft"; diff --git a/installer/vivecraft-forge.json b/installer/vivecraft-forge.json index aca1f06..8c7e739 100644 --- a/installer/vivecraft-forge.json +++ b/installer/vivecraft-forge.json @@ -98,13 +98,13 @@ } }, { - "name": "cpw.mods:modlauncher:6.1.1", + "name": "cpw.mods:modlauncher:7.0.1", "downloads": { "artifact": { - "path": "cpw/mods/modlauncher/6.1.1/modlauncher-6.1.1.jar", - "url": "https://files.minecraftforge.net/maven/cpw/mods/modlauncher/6.1.1/modlauncher-6.1.1.jar", - "sha1": "aa2b9b88c70e6857009de2143ddf2a6d27a39bdd", - "size": 117621 + "path": "cpw/mods/modlauncher/7.0.1/modlauncher-7.0.1.jar", + "url": "https://files.minecraftforge.net/maven/cpw/mods/modlauncher/7.0.1/modlauncher-7.0.1.jar", + "sha1": "e66e347c2a4c61781198f86be5cc43f19c1dfb92", + "size": 122080 } } }, diff --git a/minecriftversion.py b/minecriftversion.py index ed53c98..826a54c 100644 --- a/minecriftversion.py +++ b/minecriftversion.py @@ -5,12 +5,12 @@ of_file_md5 = "0ecd18144e547a40dfae70fa58edc842" of_build_md5 = "022b6ec80273f681a9a8d827b0c55548" minecrift_version_num = "1.16.2" -minecrift_build = "jrbudda-4-r2" +minecrift_build = "jrbudda-4-r3" of_file_extension = ".jar" mcp_version = "mcp940" mcp_uses_generics = True mcp_download_url = "http://www.modcoderpack.com/files/mcp940.zip" -forge_version = "33.0.22" +forge_version = "33.0.61" allow_forge = True forge_default = False allow_katvr = True diff --git a/patches/net/minecraft/client/Minecraft.java.patch b/patches/net/minecraft/client/Minecraft.java.patch index 8789c48..e04cb7a 100644 --- a/patches/net/minecraft/client/Minecraft.java.patch +++ b/patches/net/minecraft/client/Minecraft.java.patch @@ -124,7 +124,7 @@ import net.minecraft.util.registry.Bootstrap; import net.minecraft.util.registry.DynamicRegistries; import net.minecraft.util.registry.Registry; -@@ -229,12 +291,83 @@ +@@ -229,12 +291,84 @@ import net.minecraft.world.storage.IServerConfiguration; import net.minecraft.world.storage.SaveFormat; import net.minecraft.world.storage.ServerWorldInfo; @@ -154,6 +154,7 @@ + public PhysicalGuiManager physicalGuiManager = new PhysicalGuiManager(this); + public InteractTracker interactTracker = new InteractTracker(this); + public CrawlTracker crawlTracker = new CrawlTracker(this); ++ public CameraTracker cameraTracker = new CameraTracker(this); + + public ThreadGroup backgroundThreadGroup = new ThreadGroup("background"); + // VIVE END - teleport movement @@ -202,13 +203,13 @@ + * The minecriftVerString will be automatically updated by the build scripts, do + * not modify here. Modify minecriftversion.py in root minecrift dir. + */ -+ public final String minecriftVerString = "Vivecraft 1.16.2 jrbudda-4-r2"; ++ public final String minecriftVerString = "Vivecraft 1.16.2 jrbudda-4-r3"; + /* end version */ + /** END MINECRIFT */ private static final Logger LOGGER = LogManager.getLogger(); public static final boolean IS_RUNNING_ON_MAC = Util.getOSType() == Util.OS.OSX; public static final ResourceLocation DEFAULT_FONT_RENDERER_NAME = new ResourceLocation("default"); -@@ -262,7 +395,7 @@ +@@ -262,7 +396,7 @@ public final DebugRenderer debugRenderer; private final AtomicReference refChunkStatusListener = new AtomicReference<>(); public final IngameGui ingameGUI; @@ -217,7 +218,7 @@ private final CreativeSettings creativeSettings; public final MouseHelper mouseHelper; public final KeyboardListener keyboardListener; -@@ -282,7 +415,7 @@ +@@ -282,7 +416,7 @@ private final LanguageManager languageManager; private final BlockColors blockColors; private final ItemColors itemColors; @@ -226,7 +227,7 @@ private final SoundHandler soundHandler; private final MusicTicker musicTicker; private final FontResourceManager fontResourceMananger; -@@ -355,9 +488,12 @@ +@@ -355,9 +489,12 @@ public Minecraft(GameConfiguration gameConfig) { @@ -242,7 +243,7 @@ File file1 = gameConfig.folderInfo.assetsDir; this.fileResourcepacks = gameConfig.folderInfo.resourcePacksDir; this.launchedVersion = gameConfig.gameInfo.version; -@@ -368,8 +504,9 @@ +@@ -368,8 +505,9 @@ this.proxy = gameConfig.userInfo.proxy; this.sessionService = (new YggdrasilAuthenticationService(this.proxy, UUID.randomUUID().toString())).createMinecraftSessionService(); this.session = gameConfig.userInfo.session; @@ -254,7 +255,7 @@ this.isDemo = gameConfig.gameInfo.isDemo; this.enableMultiplayer = !gameConfig.gameInfo.disableMultiplayer; this.enableChat = !gameConfig.gameInfo.disableChat; -@@ -393,6 +530,14 @@ +@@ -393,6 +531,14 @@ this.dataFixer = DataFixesManager.getDataFixer(); this.toastGui = new ToastGui(this); this.tutorial = new Tutorial(this); @@ -269,7 +270,7 @@ this.thread = Thread.currentThread(); this.gameSettings = new GameSettings(this, this.gameDir); this.creativeSettings = new CreativeSettings(this.gameDir, this.dataFixer); -@@ -426,14 +571,23 @@ +@@ -426,14 +572,23 @@ this.mainWindow.setFramerateLimit(this.gameSettings.framerateLimit); this.mouseHelper = new MouseHelper(this); @@ -295,7 +296,7 @@ this.gameSettings.fillResourcePackList(this.resourcePackRepository); this.languageManager = new LanguageManager(this.gameSettings.language); this.resourceManager.addReloadListener(this.languageManager); -@@ -450,10 +604,17 @@ +@@ -450,10 +605,17 @@ this.fontRenderer = this.fontResourceMananger.func_238548_a_(); this.resourceManager.addReloadListener(this.fontResourceMananger.getReloadListener()); this.func_238209_b_(this.getForceUnicodeFont()); @@ -314,7 +315,7 @@ this.mainWindow.setRenderPhase("Post startup"); this.blockColors = BlockColors.init(); this.itemColors = ItemColors.init(this.blockColors); -@@ -473,6 +634,9 @@ +@@ -473,6 +635,9 @@ this.populateSearchTreeManager(); this.resourceManager.addReloadListener(this.searchTreeManager); this.particles = new ParticleManager(this.world, this.textureManager); @@ -324,7 +325,7 @@ this.resourceManager.addReloadListener(this.particles); this.paintingSprites = new PaintingSpriteUploader(this.textureManager); this.resourceManager.addReloadListener(this.paintingSprites); -@@ -480,7 +644,16 @@ +@@ -480,7 +645,16 @@ this.resourceManager.addReloadListener(this.potionSprites); this.field_241557_ar_ = new GPUWarning(); this.resourceManager.addReloadListener(this.field_241557_ar_); @@ -342,7 +343,7 @@ this.debugRenderer = new DebugRenderer(this); RenderSystem.setErrorCallback(this::disableVSyncAfterGlError); -@@ -495,42 +668,72 @@ +@@ -495,42 +669,72 @@ this.mainWindow.setLogOnGlError(); this.updateWindowSize(); @@ -430,7 +431,7 @@ stringbuilder.append(" "); stringbuilder.append(SharedConstants.getVersion().getName()); ClientPlayNetHandler clientplaynethandler = this.getConnection(); -@@ -560,6 +763,7 @@ +@@ -560,6 +764,7 @@ return stringbuilder.toString(); } @@ -438,7 +439,7 @@ public boolean func_230151_c_() { return !"vanilla".equals(ClientBrandRetriever.getClientModName()) || Minecraft.class.getSigners() == null; -@@ -679,7 +883,12 @@ +@@ -679,7 +884,12 @@ }); SearchTreeReloadable searchtreereloadable = new SearchTreeReloadable<>((p_213235_0_) -> { @@ -451,7 +452,7 @@ }); NonNullList nonnulllist = NonNullList.create(); -@@ -765,16 +974,25 @@ +@@ -765,16 +975,25 @@ if (report.getFile() != null) { Bootstrap.printToSYSOUT("#@!@# Game crashed! Crash report saved to: #@!@# " + report.getFile()); @@ -477,7 +478,7 @@ System.exit(-2); } } -@@ -805,6 +1023,17 @@ +@@ -805,6 +1024,17 @@ List list = this.resourcePackRepository.func_232623_f_(); this.setLoadingGui(new ResourceLoadProgressGui(this, this.resourceManager.reloadResources(Util.getServerExecutor(), this, RESOURCE_RELOAD_INIT_TASK, list), (p_238200_2_) -> { @@ -495,7 +496,7 @@ Util.acceptOrElse(p_238200_2_, this::restoreResourcePacks, () -> { this.worldRenderer.loadRenderers(); completablefuture.complete((Void)null); -@@ -903,10 +1132,11 @@ +@@ -903,10 +1133,11 @@ public void displayGuiScreen(@Nullable Screen guiScreenIn) { @@ -511,7 +512,7 @@ if (guiScreenIn == null && this.world == null) { -@@ -923,13 +1153,26 @@ +@@ -923,13 +1154,26 @@ this.player.respawnPlayer(); } } @@ -539,7 +540,7 @@ this.currentScreen = guiScreenIn; if (guiScreenIn != null) -@@ -991,6 +1234,12 @@ +@@ -991,6 +1235,12 @@ finally { Util.nanoTimeSupplier = System::nanoTime; @@ -552,7 +553,7 @@ if (this.crashReporter == null) { -@@ -1030,135 +1279,318 @@ +@@ -1030,135 +1280,321 @@ private void runGameLoop(boolean renderWorldIn) { @@ -806,6 +807,9 @@ + case SCOPER: + this.framebuffer = stereoProvider.telescopeFramebufferR; + break; ++ case CAMERA: ++ this.framebuffer = stereoProvider.cameraRenderFramebuffer; ++ break; + } + + this.profiler.startSection("Eye:" + currentPass.ordinal()); @@ -818,22 +822,22 @@ + + if (grabScreenShot) { + boolean inPass; -+ if (passes.contains(RenderPass.CENTER)) { ++ if (passes.contains(RenderPass.CAMERA)) { ++ inPass = (pass == RenderPass.CAMERA); ++ } else if (passes.contains(RenderPass.CENTER)) { + inPass = (pass == RenderPass.CENTER); + } else { + inPass = vrSettings.displayMirrorLeftEye ? (pass == RenderPass.LEFT) : (pass == RenderPass.RIGHT); + } + + if (inPass) { -+ this.framebuffer.unbindFramebuffer(); -+ // GLX.fbo = false; // huh? -+ ScreenShotHelper.saveScreenshot(this.gameDir, this.framebuffer.framebufferWidth, -+ this.framebuffer.framebufferHeight, this.framebuffer, (text) -> { -+ // this.addScheduledTask(() -> { -+ // this.ingameGUI.getChatGUI().printChatMessage(text); -+ // }); -+ }); -+ // GLX.fbo = true; // what is this? ++ Framebuffer ssfb = this.framebuffer; ++ if (pass == RenderPass.CAMERA) ++ ssfb = stereoProvider.cameraFramebuffer; ++ ++ this.framebuffer.unbindFramebuffer(); ++ Utils.takeScreenshot(ssfb); ++ + grabScreenShot = false; + } + } @@ -992,7 +996,7 @@ } private boolean func_238202_aF_() -@@ -1210,14 +1642,14 @@ +@@ -1210,14 +1646,14 @@ int i = this.mainWindow.calcGuiScale(this.gameSettings.guiScale, this.getForceUnicodeFont()); this.mainWindow.setGuiScale((double)i); @@ -1010,7 +1014,7 @@ this.mouseHelper.setIgnoreFirstMove(); } -@@ -1299,8 +1731,17 @@ +@@ -1299,8 +1735,17 @@ } } } @@ -1029,7 +1033,7 @@ { List list = p_238183_2_.getDataPoints(this.debugProfilerName); DataPoint datapoint = list.remove(0); -@@ -1316,14 +1757,15 @@ +@@ -1316,14 +1761,15 @@ Tessellator tessellator = Tessellator.getInstance(); BufferBuilder bufferbuilder = tessellator.getBuffer(); int i = 160; @@ -1048,7 +1052,7 @@ tessellator.draw(); RenderSystem.disableBlend(); double d0 = 0.0D; -@@ -1387,9 +1829,9 @@ +@@ -1387,9 +1833,9 @@ } int k2 = 16777215; @@ -1060,7 +1064,7 @@ for (int j2 = 0; j2 < list.size(); ++j2) { -@@ -1444,34 +1886,54 @@ +@@ -1444,34 +1890,54 @@ private void sendClickBlockToController(boolean leftClick) { @@ -1143,7 +1147,7 @@ } private void clickMouse() -@@ -1489,6 +1951,12 @@ +@@ -1489,6 +1955,12 @@ } else if (!this.player.isRowingBoat()) { @@ -1156,7 +1160,7 @@ switch (this.objectMouseOver.getType()) { case ENTITY: -@@ -1499,7 +1967,7 @@ +@@ -1499,7 +1971,7 @@ BlockRayTraceResult blockraytraceresult = (BlockRayTraceResult)this.objectMouseOver; BlockPos blockpos = blockraytraceresult.getPos(); @@ -1165,7 +1169,7 @@ { this.playerController.clickBlock(blockpos, blockraytraceresult.getFace()); break; -@@ -1510,103 +1978,139 @@ +@@ -1510,103 +1982,139 @@ { this.leftClickCounter = 10; } @@ -1401,7 +1405,7 @@ } public MusicTicker getMusicTicker() -@@ -1616,187 +2120,230 @@ +@@ -1616,187 +2124,230 @@ public void runTick() { @@ -1807,7 +1811,7 @@ } while (this.gameSettings.keyBindSmoothCamera.isPressed()) -@@ -1856,7 +2403,9 @@ +@@ -1856,7 +2407,9 @@ { if (!this.player.isSpectator() && this.player.drop(Screen.hasControlDown())) { @@ -1818,7 +1822,7 @@ } } -@@ -1864,7 +2413,7 @@ +@@ -1864,7 +2417,7 @@ if (flag2) { @@ -1827,7 +1831,7 @@ { this.func_238207_b_(""); } -@@ -1875,11 +2424,13 @@ +@@ -1875,11 +2428,13 @@ } } @@ -1846,7 +1850,7 @@ } while (this.gameSettings.keyBindAttack.isPressed()) -@@ -1896,10 +2447,18 @@ +@@ -1896,10 +2451,18 @@ } else { @@ -1869,7 +1873,7 @@ while (this.gameSettings.keyBindUseItem.isPressed()) { -@@ -1917,7 +2476,7 @@ +@@ -1917,7 +2480,7 @@ this.rightClickMouse(); } @@ -1878,7 +1882,7 @@ } public static DatapackCodec func_238180_a_(SaveFormat.LevelSave p_238180_0_) -@@ -2065,7 +2624,7 @@ +@@ -2065,7 +2628,7 @@ while (!this.integratedServer.serverIsInRunLoop()) { @@ -1887,7 +1891,7 @@ this.runGameLoop(false); try -@@ -2090,6 +2649,13 @@ +@@ -2090,6 +2653,13 @@ { })); networkmanager.sendPacket(new CHandshakePacket(socketaddress.toString(), 0, ProtocolType.LOGIN)); @@ -1901,7 +1905,7 @@ networkmanager.sendPacket(new CLoginStartPacket(this.getSession().getProfile())); this.networkManager = networkmanager; } -@@ -2188,6 +2754,13 @@ +@@ -2188,6 +2758,13 @@ public void loadWorld(ClientWorld worldClientIn) { @@ -1915,7 +1919,7 @@ WorkingScreen workingscreen = new WorkingScreen(); workingscreen.displaySavingString(new TranslationTextComponent("connect.joining")); this.updateScreenTick(workingscreen); -@@ -2224,12 +2797,18 @@ +@@ -2224,12 +2801,18 @@ IntegratedServer integratedserver = this.integratedServer; this.integratedServer = null; this.gameRenderer.resetData(); @@ -1934,7 +1938,7 @@ if (integratedserver != null) { this.profiler.startSection("waitForServer"); -@@ -2246,6 +2825,9 @@ +@@ -2246,6 +2829,9 @@ this.ingameGUI.resetPlayersOverlayFooterHeader(); this.currentServerData = null; this.integratedServerIsRunning = false; @@ -1944,7 +1948,7 @@ this.game.leaveGameSession(); } -@@ -2279,6 +2861,9 @@ +@@ -2279,6 +2865,9 @@ this.particles.clearEffects(worldIn); TileEntityRendererDispatcher.instance.setWorld(worldIn); this.func_230150_b_(); @@ -1954,7 +1958,7 @@ } public boolean func_238216_r_() -@@ -2338,6 +2923,16 @@ +@@ -2338,6 +2927,16 @@ { if (this.objectMouseOver != null && this.objectMouseOver.getType() != RayTraceResult.Type.MISS) { @@ -1971,7 +1975,7 @@ boolean flag = this.player.abilities.isCreativeMode; TileEntity tileentity = null; RayTraceResult.Type raytraceresult$type = this.objectMouseOver.getType(); -@@ -2499,6 +3094,8 @@ +@@ -2499,6 +3098,8 @@ } } } @@ -1980,7 +1984,7 @@ } private ItemStack storeTEInStack(ItemStack stack, TileEntity te) -@@ -3007,8 +3604,12 @@ +@@ -3007,8 +3608,12 @@ { supplier = wrapV4(supplier); } @@ -1995,7 +1999,7 @@ } private static Supplier wrapV3(Supplier p_228021_0_) -@@ -3073,4 +3674,512 @@ +@@ -3073,4 +3678,522 @@ CREATE, BACKUP; } @@ -2221,6 +2225,7 @@ + vrPlayer.registerTracker(vehicleTracker); + vrPlayer.registerTracker(physicalGuiManager); + vrPlayer.registerTracker(crawlTracker); ++ vrPlayer.registerTracker(cameraTracker); + } + + private static void sleepNanos(long nanoDelay) { @@ -2427,6 +2432,15 @@ + // this.mcProfiler.endSection(); + + } ++ ++ if (currentPass == RenderPass.CAMERA) { ++ this.profiler.startSection("cameracopy"); ++ stereoProvider.cameraFramebuffer.bindFramebuffer(true); ++ GlStateManager.clearColor(0, 0, 0, 1f); ++ GlStateManager.clear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); ++ stereoProvider.cameraRenderFramebuffer.framebufferRenderExt(0, stereoProvider.cameraFramebuffer.framebufferWidth, stereoProvider.cameraFramebuffer.framebufferHeight, 0, true, 0, 0, false); ++ this.profiler.endSection(); ++ } + } + + private float frameDelta, prevFrameTime; diff --git a/patches/net/minecraft/client/renderer/FirstPersonRenderer.java.patch b/patches/net/minecraft/client/renderer/FirstPersonRenderer.java.patch index aa711ec..49834b3 100644 --- a/patches/net/minecraft/client/renderer/FirstPersonRenderer.java.patch +++ b/patches/net/minecraft/client/renderer/FirstPersonRenderer.java.patch @@ -271,7 +271,7 @@ public void renderItemInFirstPerson(float partialTicks, MatrixStack matrixStackIn, IRenderTypeBuffer.Impl bufferIn, ClientPlayerEntity playerEntityIn, int combinedLightIn) { float f = playerEntityIn.getSwingProgress(partialTicks); -@@ -310,186 +433,421 @@ +@@ -310,186 +433,424 @@ bufferIn.finish(); } @@ -468,6 +468,9 @@ + if(mc.currentPass == RenderPass.THIRD && mc.vrSettings.mixedRealityRenderHands == false) + shouldrenderhand = false; + ++ if (mc.currentPass == RenderPass.CAMERA) ++ shouldrenderhand = false; ++ + if(BowTracker.isBow(stack) && mc.bowTracker.isActive((ClientPlayerEntity) player)) + shouldrenderhand = false; + @@ -872,7 +875,7 @@ } public void tick() -@@ -571,4 +929,41 @@ +@@ -571,4 +932,41 @@ this.equippedProgressOffHand = 0.0F; } } diff --git a/patches/net/minecraft/client/renderer/GameRenderer.java.patch b/patches/net/minecraft/client/renderer/GameRenderer.java.patch index d4d6c4a..0dccce1 100644 --- a/patches/net/minecraft/client/renderer/GameRenderer.java.patch +++ b/patches/net/minecraft/client/renderer/GameRenderer.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/renderer/GameRenderer.java +++ b/net/minecraft/client/renderer/GameRenderer.java -@@ -4,27 +4,43 @@ +@@ -4,27 +4,44 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.platform.GLX; import com.mojang.blaze3d.platform.GlStateManager; @@ -15,6 +15,7 @@ import java.util.Date; import java.util.Locale; import java.util.Random; ++import java.util.function.Function; import javax.annotation.Nullable; + import net.minecraft.block.BlockState; @@ -44,7 +45,7 @@ import net.minecraft.client.shader.ShaderGroup; import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReportCategory; -@@ -38,13 +54,19 @@ +@@ -38,13 +55,19 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.projectile.ProjectileHelper; import net.minecraft.fluid.FluidState; @@ -64,7 +65,7 @@ import net.minecraft.util.ResourceLocation; import net.minecraft.util.ScreenShotHelper; import net.minecraft.util.Util; -@@ -54,9 +76,11 @@ +@@ -54,9 +77,11 @@ import net.minecraft.util.math.EntityRayTraceResult; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.RayTraceResult; @@ -76,7 +77,7 @@ import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.Style; import net.minecraft.util.text.event.ClickEvent; -@@ -68,15 +92,43 @@ +@@ -68,15 +93,45 @@ import net.optifine.GlErrors; import net.optifine.Lagometer; import net.optifine.RandomEntities; @@ -109,18 +110,20 @@ +import org.vivecraft.gameplay.screenhandlers.KeyboardHandler; +import org.vivecraft.gameplay.screenhandlers.RadialHandler; +import org.vivecraft.gameplay.trackers.BowTracker; ++import org.vivecraft.gameplay.trackers.CameraTracker; +import org.vivecraft.gameplay.trackers.TelescopeTracker; +import org.vivecraft.provider.MCOpenVR; +import org.vivecraft.reflection.MCReflection; +import org.vivecraft.render.RenderPass; +import org.vivecraft.render.VRActiveRenderInfo; ++import org.vivecraft.render.VRWidgetHelper; +import org.vivecraft.settings.VRHotkeys; +import org.vivecraft.settings.VRSettings; +import org.vivecraft.utils.Utils; public class GameRenderer implements IResourceManagerReloadListener, AutoCloseable { -@@ -115,10 +167,12 @@ +@@ -115,10 +170,12 @@ public static final int SHADER_COUNT = SHADERS_TEXTURES.length; private int shaderIndex = SHADER_COUNT; private boolean useShader; @@ -135,7 +138,7 @@ private long lastServerTime = 0L; private int lastServerTicks = 0; private int serverWaitTime = 0; -@@ -127,6 +181,43 @@ +@@ -127,6 +184,43 @@ private float avgServerTickDiff = 0.0F; private ShaderGroup[] fxaaShaders = new ShaderGroup[10]; private boolean guiLoadingVisible = false; @@ -179,7 +182,7 @@ public GameRenderer(Minecraft mcIn, IResourceManager resourceManagerIn, RenderTypeBuffers renderTypeBuffersIn) { -@@ -137,6 +228,12 @@ +@@ -137,6 +231,12 @@ this.lightmapTexture = new LightTexture(this, mcIn); this.renderTypeBuffers = renderTypeBuffersIn; this.shaderGroup = null; @@ -192,7 +195,7 @@ } public void close() -@@ -200,7 +297,7 @@ +@@ -200,7 +300,7 @@ } try @@ -201,7 +204,7 @@ this.shaderGroup = new ShaderGroup(this.mc.getTextureManager(), this.resourceManager, this.mc.getFramebuffer(), resourceLocationIn); this.shaderGroup.createBindFramebuffers(this.mc.getMainWindow().getFramebufferWidth(), this.mc.getMainWindow().getFramebufferHeight()); this.useShader = true; -@@ -300,13 +397,18 @@ +@@ -300,13 +400,18 @@ { Entity entity = this.mc.getRenderViewEntity(); @@ -223,7 +226,7 @@ boolean flag = false; int i = 3; double d1 = d0; -@@ -332,8 +434,9 @@ +@@ -332,14 +437,16 @@ { d1 = this.mc.objectMouseOver.getHitVec().squareDistanceTo(vector3d); } @@ -235,7 +238,16 @@ Vector3d vector3d2 = vector3d.add(vector3d1.x * d0, vector3d1.y * d0, vector3d1.z * d0); float f = 1.0F; AxisAlignedBB axisalignedbb = entity.getBoundingBox().expand(vector3d1.scale(d0)).grow(1.0D, 1.0D, 1.0D); -@@ -393,6 +496,10 @@ +- EntityRayTraceResult entityraytraceresult = ProjectileHelper.rayTraceEntities(entity, vector3d, vector3d2, axisalignedbb, (p_lambda$getMouseOver$0_0_) -> ++ EntityRayTraceResult entityraytraceresult = ProjectileHelper.rayTraceEntities(entity, vector3d, vector3d2, axisalignedbb, (e) -> + { +- return !p_lambda$getMouseOver$0_0_.isSpectator() && p_lambda$getMouseOver$0_0_.canBeCollidedWith(); ++ //Vivecraft add riding check in case your hand is somewhere inappropriate. ++ return !e.isSpectator() && e.canBeCollidedWith() && !(e == mc.getRenderViewEntity().getRidingEntity()); + }, d1); + + if (entityraytraceresult != null) +@@ -393,6 +500,10 @@ private double getFOVModifier(ActiveRenderInfo activeRenderInfoIn, float partialTicks, boolean useFOVSetting) { @@ -246,7 +258,7 @@ if (this.debugView) { return 90.0D; -@@ -497,7 +604,9 @@ +@@ -497,7 +608,9 @@ matrixStackIn.rotate(Vector3f.XP.rotationDegrees(Math.abs(MathHelper.cos(f1 * (float)Math.PI - 0.2F) * f2) * 5.0F)); } } @@ -256,7 +268,7 @@ private void renderHand(MatrixStack matrixStackIn, ActiveRenderInfo activeRenderInfoIn, float partialTicks) { this.renderHand(matrixStackIn, activeRenderInfoIn, partialTicks, true, true, false); -@@ -592,13 +701,32 @@ +@@ -592,13 +705,34 @@ this.clipDistance = 173.0F; } @@ -283,7 +295,9 @@ + + this.thirdPassProjectionMatrix = new Matrix4f(matrixstack.getLast().getMatrix()); + } else if(mc.currentPass ==RenderPass.SCOPEL || mc.currentPass == RenderPass.SCOPER) { -+ matrixstack.getLast().getMatrix().mul(Matrix4f.perspective(70f/8f, 1, 0.05F, this.clipDistance * 4)); ++ matrixstack.getLast().getMatrix().mul(Matrix4f.perspective(70f/8f, 1, 0.05F, this.clipDistance * 4)); ++ } else if (mc.currentPass == RenderPass.CAMERA) { ++ matrixstack.getLast().getMatrix().mul(Matrix4f.perspective(mc.vrSettings.handCameraFov, (float)mc.stereoProvider.cameraFramebuffer.framebufferWidth / (float)mc.stereoProvider.cameraFramebuffer.framebufferHeight, minClipDistance, this.clipDistance * 4)); + }else { + //Vanilla + if (this.cameraZoom != 1.0F) @@ -296,7 +310,7 @@ return matrixstack.getLast().getMatrix(); } -@@ -610,10 +738,12 @@ +@@ -610,10 +744,12 @@ public void updateCameraAndRender(float partialTicks, long nanoTime, boolean renderWorldIn) { @@ -311,7 +325,7 @@ if (Util.milliTime() - this.prevFrameTime > 500L) { this.mc.displayInGameMenu(false); -@@ -623,16 +753,23 @@ +@@ -623,16 +759,23 @@ { this.prevFrameTime = Util.milliTime(); } @@ -332,12 +346,12 @@ this.mc.getProfiler().startSection("level"); - this.renderWorld(partialTicks, nanoTime, new MatrixStack()); + this.renderWorld(partialTicks, nanoTime, matrixstack); -+ if(mc.currentPass != RenderPass.THIRD) ++ if(mc.currentPass != RenderPass.THIRD && mc.currentPass != RenderPass.CAMERA) + renderFaceOverlay(partialTicks); if (this.mc.isSingleplayer() && this.timeWorldIcon < Util.milliTime() - 1000L) { -@@ -644,9 +781,10 @@ +@@ -644,9 +787,10 @@ } } @@ -349,7 +363,7 @@ { RenderSystem.disableBlend(); RenderSystem.disableDepthTest(); -@@ -662,140 +800,35 @@ +@@ -662,140 +806,35 @@ this.mc.getFramebuffer().bindFramebuffer(true); } @@ -385,6 +399,18 @@ - if (f > 0.0F && this.mc.player.isPotionActive(Effects.NAUSEA) && this.mc.gameSettings.field_243226_aM < 1.0F) - { - this.func_243497_c(f * (1.0F - this.mc.gameSettings.field_243226_aM)); +- } +- } +- +- if (!this.mc.gameSettings.hideGUI || this.mc.currentScreen != null) +- { +- RenderSystem.defaultAlphaFunc(); +- this.renderItemActivation(this.mc.getMainWindow().getScaledWidth(), this.mc.getMainWindow().getScaledHeight(), partialTicks); +- this.mc.ingameGUI.renderIngameGui(matrixstack, partialTicks); +- +- if (this.mc.gameSettings.ofShowFps && !this.mc.gameSettings.showDebugInfo) +- { +- Config.drawFps(matrixstack); + else { + this.mc.getProfiler().startSection("MainMenu"); + GL11.glDisable(GL11.GL_STENCIL_TEST); @@ -404,23 +430,11 @@ + else + render2D(partialTicks, KeyboardHandler.Framebuffer, KeyboardHandler.Pos_room, KeyboardHandler.Rotation_room, false); } -- } -- -- if (!this.mc.gameSettings.hideGUI || this.mc.currentScreen != null) -- { -- RenderSystem.defaultAlphaFunc(); -- this.renderItemActivation(this.mc.getMainWindow().getScaledWidth(), this.mc.getMainWindow().getScaledHeight(), partialTicks); -- this.mc.ingameGUI.renderIngameGui(matrixstack, partialTicks); -- if (this.mc.gameSettings.ofShowFps && !this.mc.gameSettings.showDebugInfo) -- { -- Config.drawFps(matrixstack); -- } -- - if (this.mc.gameSettings.showDebugInfo) - { - Lagometer.showLagometer(matrixstack, (int)this.mc.getMainWindow().getGuiScaleFactor()); -+ if(mc.currentPass != RenderPass.THIRD || mc.vrSettings.mixedRealityRenderHands){ ++ if((mc.currentPass != RenderPass.THIRD || mc.vrSettings.mixedRealityRenderHands) && mc.currentPass != RenderPass.CAMERA){ + renderVRHands(partialTicks, true, true, true, true); } @@ -436,14 +450,14 @@ - if (this.mc.loadingGui != null) - { - ResourceLoadProgressGui.loadLogoTexture(this.mc); -- + - if (this.mc.loadingGui instanceof ResourceLoadProgressGui) - { - ResourceLoadProgressGui resourceloadprogressgui = (ResourceLoadProgressGui)this.mc.loadingGui; - resourceloadprogressgui.update(); - } - } - +- - this.guiLoadingVisible = this.mc.loadingGui != null; - } - @@ -511,7 +525,7 @@ } } -@@ -839,7 +872,10 @@ +@@ -839,7 +878,10 @@ private boolean isDrawBlockOutline() { @@ -523,7 +537,7 @@ { return false; } -@@ -874,17 +910,36 @@ +@@ -874,17 +916,36 @@ } } @@ -565,7 +579,7 @@ if (Config.isShaders()) { Shaders.beginRender(this.mc, this.activeRender, partialTicks, finishTimeNano); -@@ -897,108 +952,71 @@ +@@ -897,108 +958,71 @@ { Shaders.beginRenderPass(partialTicks, finishTimeNano); } @@ -701,7 +715,7 @@ this.mc.getProfiler().endSection(); } -@@ -1110,8 +1128,6 @@ +@@ -1110,8 +1134,6 @@ if (!this.initialized) { @@ -710,7 +724,7 @@ if (Config.getBitsOs() == 64 && Config.getBitsJre() == 32) { Config.setNotify64BitJava(true); -@@ -1280,25 +1296,30 @@ +@@ -1280,25 +1302,30 @@ float f6 = this.itemActivationOffY * (float)(heightScaled / 4); RenderSystem.enableAlphaTest(); RenderSystem.pushMatrix(); @@ -757,7 +771,7 @@ } } -@@ -1359,4 +1380,2259 @@ +@@ -1359,4 +1386,2196 @@ { return this.overlayTexture; } @@ -1791,6 +1805,8 @@ + return false; + if (mc.currentPass == RenderPass.SCOPEL || mc.currentPass == RenderPass.SCOPER) //it doesn't look very good. + return false; ++ if (mc.currentPass == RenderPass.CAMERA) //it doesn't look very good. ++ return false; + if(KeyboardHandler.Showing) + return false; + @@ -1802,7 +1818,7 @@ + + if(MCOpenVR.getInputAction(MCOpenVR.keyVRInteract).isEnabledRaw(ControllerType.RIGHT) || + MCOpenVR.keyVRInteract.isKeyDown(ControllerType.RIGHT)) -+ return false; ++ return false; + + if(MCOpenVR.getInputAction(MCOpenVR.keyClimbeyGrab).isEnabledRaw(ControllerType.RIGHT) || + MCOpenVR.keyClimbeyGrab.isKeyDown(ControllerType.RIGHT)) @@ -2023,13 +2039,13 @@ + + public void applystereo(RenderPass currentPass, MatrixStack matrix) + { -+ if(currentPass == RenderPass.THIRD || currentPass == RenderPass.CENTER) return; ++ if(currentPass != RenderPass.LEFT && currentPass != RenderPass.RIGHT) return; + Vector3d eye = mc.vrPlayer.vrdata_world_render.getEye(currentPass).getPosition().subtract(mc.vrPlayer.vrdata_world_render.getEye(RenderPass.CENTER).getPosition()); + matrix.translate((float)-eye.x, (float)-eye.y, (float)-eye.z); + } + public void removeStereo(RenderPass currentPass, MatrixStack matrix) + { -+ if(currentPass == RenderPass.THIRD || currentPass == RenderPass.CENTER) return; ++ if(currentPass != RenderPass.LEFT && currentPass != RenderPass.RIGHT) return; + Vector3d eye = mc.vrPlayer.vrdata_world_render.getEye(currentPass).getPosition().subtract(mc.vrPlayer.vrdata_world_render.getEye(RenderPass.CENTER).getPosition()); + matrix.translate((float)eye.x, (float)eye.y, (float)eye.z); + } @@ -2037,7 +2053,7 @@ + // + + //old and busted -+ private void applyVRModelViewLegacy(RenderPass currentPass) ++ public void applyVRModelViewLegacy(RenderPass currentPass) + { +// if(mc == null) System.out.println("mc is null"); +// if(mc.vrPlayer == null) System.out.println("mc.vrPlayer is null"); @@ -2051,14 +2067,14 @@ + + private void applystereoLegacy(RenderPass currentPass) + { -+ if(currentPass == RenderPass.THIRD || currentPass == RenderPass.CENTER) return; ++ if(currentPass != RenderPass.LEFT && currentPass != RenderPass.RIGHT) return; + Vector3d eye = mc.vrPlayer.vrdata_world_render.getEye(currentPass).getPosition().subtract(mc.vrPlayer.vrdata_world_render.getEye(RenderPass.CENTER).getPosition()); + GL11.glTranslatef((float)eye.x, (float)eye.y, (float)eye.z); + } + + private void removeStereoLegacy(RenderPass currentPass) + { -+ if(currentPass == RenderPass.THIRD || currentPass == RenderPass.CENTER) return; ++ if(currentPass != RenderPass.LEFT && currentPass != RenderPass.RIGHT) return; + Vector3d eye = mc.vrPlayer.vrdata_world_render.getEye(currentPass).getPosition().subtract(mc.vrPlayer.vrdata_world_render.getEye(RenderPass.CENTER).getPosition()); + GL11.glTranslatef((float)-eye.x, (float)-eye.y, (float)-eye.z); + } @@ -2182,12 +2198,12 @@ + else + inBlock = 0; + inwater = this.mc.player.areEyesInFluid(FluidTags.WATER) && !Reflector.callBoolean(Reflector.ForgeEventFactory_renderWaterOverlay, this.mc.player, new MatrixStack()); -+ onfire = mc.currentPass != RenderPass.THIRD && this.mc.player.isBurning() && !Reflector.callBoolean(Reflector.ForgeEventFactory_renderFireOverlay, this.mc.player, new MatrixStack()); ++ onfire = mc.currentPass != RenderPass.THIRD && mc.currentPass != RenderPass.CAMERA && this.mc.player.isBurning() && !Reflector.callBoolean(Reflector.ForgeEventFactory_renderFireOverlay, this.mc.player, new MatrixStack()); + } + } + + private void renderVRSelfEffects(float par1) { -+ if (onfire && mc.currentPass != RenderPass.THIRD) ++ if (onfire && mc.currentPass != RenderPass.THIRD && mc.currentPass != RenderPass.CAMERA) + { + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); @@ -2197,13 +2213,14 @@ + } + + private void renderVrShadow(float par1, boolean depthAlways){ -+ if(mc.currentPass == RenderPass.THIRD) ++ if(mc.currentPass == RenderPass.THIRD || mc.currentPass == RenderPass.CAMERA) + return; + if(!mc.player.isAlive()) + return; + if(mc.player.getRoomYOffsetFromPose() < 0) //covers flying and swim-sprint. + return; -+ ++ if(mc.player.getRidingEntity()!=null) ++ return; + AxisAlignedBB bb = mc.player.getBoundingBox(); + if(this.mc.vrSettings.vrShowBlueCircleBuddy && bb != null){ //RIP blue circle buddy + RenderSystem.matrixMode(GL11.GL_MODELVIEW); @@ -2257,6 +2274,7 @@ + RenderSystem.enableAlphaTest(); + RenderSystem.disableTexture(); + RenderSystem.enableBlend(); ++ RenderSystem.alphaFunc(GL11.GL_GREATER, 0); + if(i==0) + mc.stereoProvider.telescopeFramebufferR.bindFramebufferTexture(); + else @@ -2268,7 +2286,7 @@ + RenderSystem.enableTexture(); + RenderSystem.disableBlend(); + // fb -+ drawSizedQuad(720, 720, 0.075f * mc.vrPlayer.vrdata_world_render.worldScale, new Color(1, 1, 1, 1)); ++ drawSizedQuadWithLightmap(720, 720, 0.075f * mc.vrPlayer.vrdata_world_render.worldScale, LightTexture.packLight(15, 15)); + + RenderSystem.enableBlend(); + RenderSystem.disableTexture(); @@ -2277,90 +2295,19 @@ + drawSizedQuad(720, 720, 0.075f * mc.vrPlayer.vrdata_world_render.worldScale, new Color(0,0,0, 1 - alpha)); + + RenderSystem.colorMask(true, true, true, true); ++ RenderSystem.defaultAlphaFunc(); + lightmapTexture.enableLightmap(); + RenderSystem.popMatrix(); + } -+ -+ private void renderVRThirdPersonCamWidget() { -+ if(mc.currentPass == RenderPass.LEFT || mc.currentPass == RenderPass.RIGHT){ -+ if(mc.vrSettings.displayMirrorMode == mc.vrSettings.MIRROR_MIXED_REALITY || mc.vrSettings.displayMirrorMode == VRSettings.MIRROR_THIRD_PERSON) { -+ -+ //render the camera -+ RenderSystem.pushMatrix(); -+ -+ applyVRModelViewLegacy(mc.currentPass); -+ -+ Vector3d cam = mc.vrPlayer.vrdata_world_render.getEye(RenderPass.THIRD).getPosition(); -+ Vector3d o = mc.vrPlayer.vrdata_world_render.getEye(mc.currentPass).getPosition(); -+ Vector3d pos = cam.subtract(o); -+ -+ RenderSystem.enableDepthTest(); -+ //RenderSystem.depthFunc(GL11.GL_ALWAYS); -+ -+ RenderSystem.translated(pos.x, pos.y, pos.z); -+ RenderSystem.multMatrix(mc.vrPlayer.vrdata_world_render.getEye(RenderPass.THIRD).getMatrix().toMCMatrix()); -+ -+ float scale = 0.35f * mc.vrPlayer.vrdata_world_render.worldScale; -+ if (mc.interactTracker.isInCamera() && !VRHotkeys.isMovingThirdPersonCam()) -+ scale *= 1.03f; -+ RenderSystem.scalef(scale, scale, scale); -+ -+ // Position testing -+ //RenderSystem.rotatef(180, 0, 1, 0); -+ //renderDebugAxes(0, 0, 0, 0.08f); -+ //RenderSystem.rotatef(180, 0, 1, 0); -+ -+ // Magic transform -+ RenderSystem.translatef(-0.748f, -0.438f, -0.06f); -+ -+ mc.getTextureManager().bindTexture(PlayerContainer.LOCATION_BLOCKS_TEXTURE); -+ BlockPos lightPos = new BlockPos(mc.vrPlayer.vrdata_world_render.getEye(RenderPass.THIRD).getPosition()); -+ int combinedLight = Utils.getCombinedLightWithMin(mc.world, lightPos, 0); -+ -+ Tessellator tess = Tessellator.getInstance(); -+ BufferBuilder buffer = tess.getBuffer(); -+ buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK); -+ mc.getBlockRendererDispatcher().getBlockModelRenderer().renderModelBrightnessColor(new MatrixStack().getLast(), buffer, null, mc.getModelManager().getModel(thirdPersonCameraModel), 1.0F, 1.0F, 1.0F, combinedLight, OverlayTexture.NO_OVERLAY); -+ tess.draw(); -+ -+ RenderSystem.disableBlend(); -+ RenderSystem.alphaFunc(GL11.GL_ALWAYS, 0); -+ mc.stereoProvider.framebufferMR.bindFramebufferTexture(); -+ -+ BufferBuilder b = tess.getBuffer(); -+ b.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX_LMAP_COLOR_NORMAL); -+ -+ // This is very silly but it works -+ for (BakedQuad quad : mc.getModelManager().getModel(thirdPersonCameraDisplayModel).getQuads(null, null, random)) { -+ if ((quad.getFace() == Direction.NORTH || quad.getFace() == Direction.SOUTH) && quad.getSprite().getName().equals(new ResourceLocation("vivecraft:transparent"))) { -+ QuadBounds bounds = quad.getQuadBounds(); -+ boolean mirror = quad.getFace() == Direction.NORTH; -+ int light = LightTexture.packLight(15, 15); -+ -+ b.pos(mirror ? bounds.getMaxX() : bounds.getMinX(), bounds.getMinY(), bounds.getMinZ()).tex(mirror ? 1.0f : 0.0f, 0.0f).lightmap(light).color(1.0f, 1.0f, 1.0f, 1.0f).normal(0, 0, mirror ? -1 : 1).endVertex(); -+ b.pos(mirror ? bounds.getMinX() : bounds.getMaxX(), bounds.getMinY(), bounds.getMinZ()).tex(mirror ? 0.0f : 1.0f, 0.0f).lightmap(light).color(1.0f, 1.0f, 1.0f, 1.0f).normal(0, 0, mirror ? -1 : 1).endVertex(); -+ b.pos(mirror ? bounds.getMinX() : bounds.getMaxX(), bounds.getMaxY(), bounds.getMinZ()).tex(mirror ? 0.0f : 1.0f, 1.0f).lightmap(light).color(1.0f, 1.0f, 1.0f, 1.0f).normal(0, 0, mirror ? -1 : 1).endVertex(); -+ b.pos(mirror ? bounds.getMaxX() : bounds.getMinX(), bounds.getMaxY(), bounds.getMinZ()).tex(mirror ? 1.0f : 0.0f, 1.0f).lightmap(light).color(1.0f, 1.0f, 1.0f, 1.0f).normal(0, 0, mirror ? -1 : 1).endVertex(); -+ } -+ } -+ -+ tess.draw(); -+ -+ //RenderSystem.depthFunc(GL11.GL_LEQUAL); -+ RenderSystem.enableBlend(); -+ RenderSystem.defaultAlphaFunc(); -+ RenderSystem.popMatrix(); -+ } -+ } -+ } + + void drawEyeStencil(boolean shaders) { + if(mc.currentPass == RenderPass.SCOPEL || mc.currentPass ==RenderPass.SCOPER) { -+ mc.stereoProvider.doCircleStencil(mc.framebuffer); ++ if (!Config.isShaders()) // stencil looks stupid with shaders so screw it ++ mc.stereoProvider.doCircleStencil(mc.framebuffer); + return; + } + -+ if(mc.currentPass != RenderPass.THIRD && mc.currentPass != RenderPass.CENTER && mc.vrSettings.vrUseStencil && MCOpenVR.isHMDTracking()){ ++ if((mc.currentPass == RenderPass.LEFT || mc.currentPass == RenderPass.RIGHT) && mc.vrSettings.vrUseStencil && MCOpenVR.isHMDTracking()){ + Program lastProgram = Shaders.activeProgram; + if(shaders){ + GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, Shaders.dfb); @@ -2385,7 +2332,7 @@ + + public boolean shouldOccludeGui() { + Vector3d pos = mc.vrPlayer.vrdata_world_render.getEye(mc.currentPass).getPosition(); -+ if(mc.currentPass == RenderPass.THIRD) return true; ++ if(mc.currentPass == RenderPass.THIRD || mc.currentPass == RenderPass.CAMERA) return true; + if (isInMenuRoom() || + mc.currentScreen != null || + KeyboardHandler.Showing || @@ -2402,6 +2349,8 @@ + if(Main.viewonly) return false; + if(mc.currentPass == RenderPass.THIRD) return + (mc.vrSettings.displayMirrorMode == VRSettings.MIRROR_MIXED_REALITY); ++ if (mc.currentPass == RenderPass.CAMERA) ++ return false; + return true; + } + @@ -2877,7 +2826,7 @@ + applystereo(mc.currentPass, matrixStackIn); + BufferBuilder bufferbuilder = Tessellator.getInstance().getBuffer(); + RenderSystem.depthFunc(GL11.GL_ALWAYS); -+ if(mc.currentPass == RenderPass.THIRD) ++ if(mc.currentPass == RenderPass.THIRD || mc.currentPass == RenderPass.CAMERA) + GlStateManager.depthFunc(GL11.GL_LEQUAL); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); @@ -2970,7 +2919,8 @@ + + + renderVRSelfEffects(partialTicks); -+ renderVRThirdPersonCamWidget(); ++ VRWidgetHelper.renderVRThirdPersonCamWidget(); ++ VRWidgetHelper.renderVRHandheldCameraWidget(); + + boolean should = shouldRenderHands(); + @@ -2997,7 +2947,8 @@ + + if(secondpass) renderVrShadow(partialTicks, !shouldOccludeGui()); + if(!secondpass) renderCrosshairAtDepth(!mc.vrSettings.useCrosshairOcclusion); -+ if(!secondpass) renderVRThirdPersonCamWidget(); ++ if(!secondpass) VRWidgetHelper.renderVRThirdPersonCamWidget(); ++ if(!secondpass) VRWidgetHelper.renderVRHandheldCameraWidget(); + + if(secondpass)renderGuiLayer(partialTicks, !shouldOccludeGui()); + if(secondpass && KeyboardHandler.Showing) { diff --git a/patches/net/minecraft/client/renderer/WorldRenderer.java.patch b/patches/net/minecraft/client/renderer/WorldRenderer.java.patch index 10283bd..845988a 100644 --- a/patches/net/minecraft/client/renderer/WorldRenderer.java.patch +++ b/patches/net/minecraft/client/renderer/WorldRenderer.java.patch @@ -56,8 +56,8 @@ + + //Vivecraft - fix which block column doesnt get rain. + Vector3d me = mc.vrPlayer.vrdata_world_render.getEye(RenderPass.CENTER).getPosition(); -+ if(mc.currentPass == RenderPass.THIRD) -+ me = mc.vrPlayer.vrdata_world_render.getEye(RenderPass.THIRD).getPosition(); ++ if(mc.currentPass == RenderPass.THIRD || mc.currentPass == RenderPass.CAMERA) ++ me = mc.vrPlayer.vrdata_world_render.getEye(mc.currentPass).getPosition(); + int i = MathHelper.floor(me.x); + int j = MathHelper.floor(me.y); + int k = MathHelper.floor(me.z); @@ -244,7 +244,7 @@ } + //Vivecraft -+ boolean selfRender = mc.currentPass == RenderPass.THIRD && mc.vrSettings.displayMirrorMode == VRSettings.MIRROR_THIRD_PERSON; ++ boolean selfRender = (mc.currentPass == RenderPass.THIRD && mc.vrSettings.displayMirrorMode == VRSettings.MIRROR_THIRD_PERSON) || mc.currentPass == RenderPass.CAMERA; + selfRender |= mc.vrSettings.shouldRenderSelf || mc.vrSettings.tmpRenderSelf; + // + @@ -334,7 +334,7 @@ irendertypebuffer$impl.finish(Atlases.getTranslucentCullBlockType()); irendertypebuffer$impl.finish(Atlases.getBannerType()); irendertypebuffer$impl.finish(Atlases.getShieldType()); -@@ -1836,13 +1920,21 @@ +@@ -1836,13 +1920,16 @@ if (flag1) { irendertypebuffer$impl.finish(); @@ -344,22 +344,17 @@ + //ShadersRender.renderHand0(gameRendererIn, matrixStackIn, activeRenderInfoIn, partialTicks); Shaders.preWater(); } - -+ //Temporary hack til I can figure out whats wrong with this -+ if(mc.currentPass ==RenderPass.SCOPEL || mc.currentPass == RenderPass.SCOPER ) -+ this.field_239227_K_ = null; -+ // + + boolean menuHandleft = gameRendererIn.isInMenuRoom() || mc.currentScreen != null || KeyboardHandler.Showing; + boolean menuhandright = menuHandleft || (mc.interactTracker.hotbar >= 0 && mc.vrSettings.vrTouchHotbar); -+ + if (this.field_239227_K_ != null) - { + { //fabulous! irendertypebuffer$impl.finish(RenderType.getLines()); irendertypebuffer$impl.finish(); this.field_239222_F_.framebufferClear(Minecraft.IS_RUNNING_ON_MAC); -@@ -1856,10 +1948,17 @@ +@@ -1856,10 +1943,17 @@ RenderState.field_239237_T_.setupRenderState(); iprofiler.endStartSection("particles"); this.mc.particles.renderParticles(matrixStackIn, irendertypebuffer$impl, lightmapIn, activeRenderInfoIn, partialTicks); @@ -379,7 +374,7 @@ iprofiler.endStartSection("translucent"); if (flag1) -@@ -1886,7 +1985,11 @@ +@@ -1886,7 +1980,11 @@ } this.mc.particles.renderParticles(matrixStackIn, irendertypebuffer$impl, lightmapIn, activeRenderInfoIn, partialTicks); @@ -392,7 +387,7 @@ if (flag1) { Shaders.endParticles(); -@@ -3192,10 +3295,11 @@ +@@ -3192,10 +3290,11 @@ { bufferIn.pos(xIn - camX, (double)yIn - camY, zIn - camZ).tex(texU, texV).endVertex(); } @@ -406,7 +401,7 @@ } public static void drawVoxelShapeParts(MatrixStack matrixStackIn, IVertexBuilder bufferIn, VoxelShape shapeIn, double xIn, double yIn, double zIn, float red, float green, float blue, float alpha) -@@ -3663,6 +3767,8 @@ +@@ -3663,6 +3762,8 @@ { Random random = this.world.rand; @@ -415,7 +410,7 @@ switch (type) { case 1000: -@@ -3725,18 +3831,26 @@ +@@ -3725,18 +3826,26 @@ break; case 1011: @@ -442,7 +437,7 @@ this.world.playSound(blockPosIn, SoundEvents.BLOCK_FENCE_GATE_CLOSE, SoundCategory.BLOCKS, 1.0F, random.nextFloat() * 0.1F + 0.9F, false); break; -@@ -3757,14 +3871,26 @@ +@@ -3757,14 +3866,26 @@ break; case 1019: @@ -469,7 +464,7 @@ this.world.playSound(blockPosIn, SoundEvents.ENTITY_ZOMBIE_BREAK_WOODEN_DOOR, SoundCategory.HOSTILE, 2.0F, (random.nextFloat() - random.nextFloat()) * 0.2F + 1.0F, false); break; -@@ -3793,10 +3919,17 @@ +@@ -3793,10 +3914,17 @@ break; case 1030: @@ -487,7 +482,7 @@ this.world.playSound(blockPosIn, SoundEvents.BLOCK_ANVIL_LAND, SoundCategory.BLOCKS, 0.3F, this.world.rand.nextFloat() * 0.1F + 0.9F, false); break; -@@ -3817,6 +3950,9 @@ +@@ -3817,6 +3945,9 @@ break; case 1036: @@ -497,7 +492,7 @@ this.world.playSound(blockPosIn, SoundEvents.BLOCK_IRON_TRAPDOOR_CLOSE, SoundCategory.BLOCKS, 1.0F, random.nextFloat() * 0.1F + 0.9F, false); break; -@@ -4409,4 +4545,40 @@ +@@ -4409,4 +4540,40 @@ super(p_i232463_1_, p_i232463_2_); } } diff --git a/patches/net/minecraft/client/renderer/entity/EntityRendererManager.java.patch b/patches/net/minecraft/client/renderer/entity/EntityRendererManager.java.patch index 767d562..ddd1300 100644 --- a/patches/net/minecraft/client/renderer/entity/EntityRendererManager.java.patch +++ b/patches/net/minecraft/client/renderer/entity/EntityRendererManager.java.patch @@ -97,8 +97,8 @@ + if(renderedEntity == null) return info.getRotation(); //how did u get here, boo? + + Vector3d src = Minecraft.getInstance().vrPlayer.getVRDataWorld().getEye(RenderPass.CENTER).getPosition(); -+ if(Minecraft.getInstance().currentPass == RenderPass.THIRD) -+ src = Minecraft.getInstance().vrPlayer.getVRDataWorld().getEye(RenderPass.THIRD).getPosition(); ++ if(Minecraft.getInstance().currentPass == RenderPass.THIRD || Minecraft.getInstance().currentPass == RenderPass.CAMERA) ++ src = Minecraft.getInstance().vrPlayer.getVRDataWorld().getEye(Minecraft.getInstance().currentPass).getPosition(); + + //To not have sprite appear differently in 3rd person, let's have them always point at the player. + Vector3d dir = renderedEntity.getPositionVec().add(0,renderedEntity.getHeight()/2,0).subtract(src).normalize(); @@ -119,8 +119,8 @@ + Entity renderedEntity = Minecraft.getInstance().worldRenderer.renderedEntity; + if(renderedEntity == null) return info.getRotation(); //how did u get here, boo? + Vector3d src = Minecraft.getInstance().vrPlayer.getVRDataWorld().getEye(RenderPass.CENTER).getPosition(); -+ if(Minecraft.getInstance().currentPass == RenderPass.THIRD) -+ src = Minecraft.getInstance().vrPlayer.getVRDataWorld().getEye(RenderPass.THIRD).getPosition(); ++ if(Minecraft.getInstance().currentPass == RenderPass.THIRD || Minecraft.getInstance().currentPass == RenderPass.CAMERA) ++ src = Minecraft.getInstance().vrPlayer.getVRDataWorld().getEye(Minecraft.getInstance().currentPass).getPosition(); + Vector3d dir = renderedEntity.getPositionVec().add(0,renderedEntity.getHeight() + offset ,0).subtract(src).normalize(); + this.cameraOrientation.set(0.0F, 0.0F, 0.0F, 1.0F); + this.cameraOrientation.multiply(Vector3f.YP.rotationDegrees((float)-Math.toDegrees(Math.atan2(-dir.x, dir.z)))); diff --git a/patches/net/minecraft/client/renderer/model/ModelBakery.java.patch b/patches/net/minecraft/client/renderer/model/ModelBakery.java.patch index 87eccea..74e28fc 100644 --- a/patches/net/minecraft/client/renderer/model/ModelBakery.java.patch +++ b/patches/net/minecraft/client/renderer/model/ModelBakery.java.patch @@ -11,15 +11,17 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.color.BlockColors; import net.minecraft.client.renderer.model.multipart.Multipart; -@@ -71,6 +73,7 @@ - import org.apache.commons.lang3.tuple.Triple; +@@ -72,6 +74,9 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -+import org.vivecraft.gameplay.trackers.TelescopeTracker; ++import org.vivecraft.gameplay.trackers.CameraTracker; ++import org.vivecraft.gameplay.trackers.TelescopeTracker; ++ public class ModelBakery { -@@ -203,7 +206,13 @@ + public static final RenderMaterial LOCATION_FIRE_0 = new RenderMaterial(AtlasTexture.LOCATION_BLOCKS_TEXTURE, new ResourceLocation("block/fire_0")); +@@ -203,7 +208,15 @@ this.loadTopModel(BlockModelShapes.getModelLocation(p_lambda$processLoading$8_1_)); }); } @@ -29,6 +31,8 @@ + this.loadTopModel(TelescopeTracker.scopeModel); + this.loadTopModel(GameRenderer.thirdPersonCameraModel); + this.loadTopModel(GameRenderer.thirdPersonCameraDisplayModel); ++ this.loadTopModel(CameraTracker.cameraModel); ++ this.loadTopModel(CameraTracker.cameraDisplayModel); + // + p_processLoading_1_.endStartSection("items"); diff --git a/patches/net/minecraft/entity/projectile/FishingBobberEntity.java.patch b/patches/net/minecraft/entity/projectile/FishingBobberEntity.java.patch index 56ca6b5..c3d15bb 100644 --- a/patches/net/minecraft/entity/projectile/FishingBobberEntity.java.patch +++ b/patches/net/minecraft/entity/projectile/FishingBobberEntity.java.patch @@ -65,7 +65,7 @@ this.recenterBoundingBox(); } + -+ if(playerentity.isUser()) { ++ if(playerentity != null && playerentity.isUser()) { + //Vivecraft nibblehaptics + ServerVivePlayer vp = NetworkHelper.vivePlayers.get(playerentity.getUniqueID()); + if (vp !=null && vp.isVR()) { diff --git a/patches/net/optifine/reflect/Reflector.java.patch b/patches/net/optifine/reflect/Reflector.java.patch index 9b33dfc..132c77c 100644 --- a/patches/net/optifine/reflect/Reflector.java.patch +++ b/patches/net/optifine/reflect/Reflector.java.patch @@ -139,6 +139,15 @@ public static ReflectorClass Loader = new ReflectorClass("net.minecraftforge.fml.common.Loader"); public static ReflectorMethod Loader_getActiveModList = new ReflectorMethod(Loader, "getActiveModList"); public static ReflectorMethod Loader_instance = new ReflectorMethod(Loader, "instance"); +@@ -364,7 +397,7 @@ + public static ReflectorClass RenderLivingEvent_Post = new ReflectorClass("net.minecraftforge.client.event.RenderLivingEvent$Post"); + public static ReflectorConstructor RenderLivingEvent_Post_Constructor = new ReflectorConstructor(RenderLivingEvent_Post, new Class[] {LivingEntity.class, LivingRenderer.class, Float.TYPE, MatrixStack.class, IRenderTypeBuffer.class, Integer.TYPE}); + public static ReflectorClass RenderNameplateEvent = new ReflectorClass("net.minecraftforge.client.event.RenderNameplateEvent"); +- public static ReflectorConstructor RenderNameplateEvent_Constructor = new ReflectorConstructor(RenderNameplateEvent, new Class[] {Entity.class, ITextComponent.class, EntityRenderer.class, MatrixStack.class, IRenderTypeBuffer.class, Integer.TYPE}); ++ public static ReflectorConstructor RenderNameplateEvent_Constructor = new ReflectorConstructor(RenderNameplateEvent, new Class[] {Entity.class, ITextComponent.class, EntityRenderer.class, MatrixStack.class, IRenderTypeBuffer.class, Integer.TYPE, Float.TYPE}); + public static ReflectorMethod RenderNameplateEvent_getContent = new ReflectorMethod(RenderNameplateEvent, "getContent"); + public static ReflectorClass ScreenshotEvent = new ReflectorClass("net.minecraftforge.client.event.ScreenshotEvent"); + public static ReflectorMethod ScreenshotEvent_getCancelMessage = new ReflectorMethod(ScreenshotEvent, "getCancelMessage"); @@ -382,6 +415,8 @@ public static ReflectorField EnderDragonRenderer_model = new ReflectorField(EnderDragonRenderer, EnderDragonRenderer.EnderDragonModel.class); public static ReflectorClass GuiMainMenu = new ReflectorClass(MainMenuScreen.class); diff --git a/patches/net/optifine/shaders/Shaders.java.patch b/patches/net/optifine/shaders/Shaders.java.patch index a91df6a..28deb91 100644 --- a/patches/net/optifine/shaders/Shaders.java.patch +++ b/patches/net/optifine/shaders/Shaders.java.patch @@ -269,7 +269,7 @@ checkGLError("beginRender"); - ShadersRender.renderShadowMap(entityRenderer, activeRenderInfo, 0, partialTicks, finishTimeNano); + // VIVECRAFT: Render shadow map once per frame instead of every damn pass -+ if (mc.currentPass == RenderPass.LEFT || mc.currentPass == RenderPass.THIRD) ++ if (mc.currentPass == RenderPass.LEFT || mc.currentPass == RenderPass.THIRD || mc.currentPass == RenderPass.CAMERA) + ShadersRender.renderShadowMap(gameRenderer, gameRenderer.getActiveRenderInfo(), 0, partialTicks, finishTimeNano); mc.getProfiler().endSection(); EXTFramebufferObject.glBindFramebufferEXT(36160, dfb); diff --git a/resources/assets/vivecraft/blockstates/camera.json b/resources/assets/vivecraft/blockstates/camera.json new file mode 100644 index 0000000..d30103e --- /dev/null +++ b/resources/assets/vivecraft/blockstates/camera.json @@ -0,0 +1,5 @@ +{ + "variants": { + "": { "model": "vivecraft:camera" } + } +} \ No newline at end of file diff --git a/resources/assets/vivecraft/blockstates/camera_display.json b/resources/assets/vivecraft/blockstates/camera_display.json new file mode 100644 index 0000000..ccdf109 --- /dev/null +++ b/resources/assets/vivecraft/blockstates/camera_display.json @@ -0,0 +1,5 @@ +{ + "variants": { + "": { "model": "vivecraft:camera_display" } + } +} \ No newline at end of file diff --git a/resources/assets/vivecraft/lang/de_de.lang b/resources/assets/vivecraft/lang/de_de.lang new file mode 100644 index 0000000..84e01a4 --- /dev/null +++ b/resources/assets/vivecraft/lang/de_de.lang @@ -0,0 +1,449 @@ +# Contributors: 3tes, Kerberus, McRobin, Philuu, SamyPro, Unluckymichell, acul009 + +# Key bindings +vivecraft.key.hotbarNext=Hotbar weiter +vivecraft.key.hotbarPrev=Hotbar zurück +vivecraft.key.hotbarScroll=Hotbar Scrollen +vivecraft.key.hotbarSwipeX=Hotbar Wischen (Links/Rechts) +vivecraft.key.hotbarSwipeY=Hotbar Wischen (Hoch/Runter) +vivecraft.key.rotateLeft=Nach Links Drehen +vivecraft.key.rotateRight=Nach Rechts Drehen +vivecraft.key.rotateAxis=Nur Drehen +vivecraft.key.rotateFree=Frei Frehen +vivecraft.key.walkabout=Rundgang +vivecraft.key.teleport=Teleportation +vivecraft.key.teleportFallback=Forwärts gehen, wenn die Teleportation deaktiviert ist +vivecraft.key.freeMoveRotate=Bewegen/Drehen +vivecraft.key.freeMoveStrafe=Nur Bewegen +vivecraft.key.toggleMovement=Bewegungsart umschalten +vivecraft.key.quickTorch=Fackel Auswählen +vivecraft.key.ingameMenuButton=Spielmenü +vivecraft.key.exportWorld=Menü-Welt Exportieren +vivecraft.key.radialMenu=Kreismenü öffnen +vivecraft.key.swapMirrorView=Zuschaueransicht Wechseln +vivecraft.key.toggleKeyboard=Tastatur Zeigen/Verstecken +vivecraft.key.moveThirdPersonCam=Außenansicht Bewegen +vivecraft.key.togglePlayerList=Spielerliste Anzeigen +vivecraft.key.toggleHandheldCam=Kamera Umschalten +vivecraft.key.trackpadTouch=Trackpad Berühren +vivecraft.key.vrInteract=Kontextbasierte Interaktion +vivecraft.key.guiLeftClick=Links Klick +vivecraft.key.guiRightClick=Rechts Klick +vivecraft.key.guiMiddleClick=Mausrad Klick +vivecraft.key.guiShift=Umschalt +vivecraft.key.guiCtrl=Strg +vivecraft.key.guiAlt=Alt +vivecraft.key.guiScrollUp=nach oben scrollen +vivecraft.key.guiScrollDown=nach unten scrollen +vivecraft.key.guiScrollAxis=Scrollen +vivecraft.key.keyboardClick=Klick +vivecraft.key.keyboardShift=Umschalt +vivecraft.key.climbeyGrab=Kletterausrüstung +vivecraft.key.climbeyJump=Sprung-Schuhe + +# Key binding categories +vivecraft.key.category.gui=Benutzeroberfläche +vivecraft.key.category.climbey=Kletter Bewegung +vivecraft.key.category.keyboard=Tastatur + +# Action set names +vivecraft.actionset.ingame=Im-Spiel +vivecraft.actionset.gui=Benutzeroberfläche +vivecraft.actionset.global=Global +vivecraft.actionset.mod=modifiziert +vivecraft.actionset.contextual=Kontextbasiert +vivecraft.actionset.keyboard=Tastatur +vivecraft.actionset.mixedReality=Gemischte Realität +vivecraft.actionset.technical=Technisch + +# Option screens +vivecraft.options.screen.main=VR Einstellungen +vivecraft.options.screen.freemove=freie Verschiebungseinstellungen +vivecraft.options.screen.gui=Benutzeroberflächen Einstellungen +vivecraft.options.screen.menuworld=Menü-Welt Einstellungen +vivecraft.options.screen.guiother=Chat/Fadenkreuz Einstellungen +vivecraft.options.screen.quickcommands=Schnelle Befehle +vivecraft.options.screen.radialmenu=Kreismenu Konfiguration +vivecraft.options.screen.stereorendering=Stereo Renderer Einstellungen +vivecraft.options.screen.roomscale=Raumskala Interaktion Einstellungen +vivecraft.options.screen.seated=Sitzeinstellungen +vivecraft.options.screen.standing=Stehende Fortbewegungseinstellungen +vivecraft.options.screen.teleport=Teleportationseinstellungen +vivecraft.options.screen.controls=Controller-Einstellungen + +# Buttons that lead to the screen +vivecraft.options.screen.main.button=VR Einstellungen... +vivecraft.options.screen.gui.button=Benutzeroberflächen Einstellungen... +vivecraft.options.screen.stereorendering.button=Stereo Rendering... +vivecraft.options.screen.quickcommands.button=Schnelle Befehle... +vivecraft.options.screen.guiother.button=Chat/Fadenkreuz Einstellungen... +vivecraft.options.screen.standing.button=Fortbewegungs-Einstellungen... +vivecraft.options.screen.roomscale.button=Interaktionseinstellungen... +vivecraft.options.screen.controls.button=Controller-Einstellungen +vivecraft.options.screen.radialmenu.button=Kreismenü... +vivecraft.options.screen.seated.button=Sitzeinstellungen +vivecraft.options.screen.menuworld.button=Menü-Welt Einstellungen... +vivecraft.options.screen.teleport.button=Teleporteinstellungen ... +vivecraft.options.screen.freemove.button=Raumfüllende Einstellungen + +# Option names +vivecraft.options.HUD_SCALE=Kopf-HUD Größe +vivecraft.options.HUD_DISTANCE=Kopf-HUD Entfernung +vivecraft.options.HUD_LOCK_TO=HUD Orientierungssperre +vivecraft.options.HUD_OPACITY=HUD Deckkraft +vivecraft.options.HUD_HIDE=HUD verstecken (F1) +vivecraft.options.RENDER_MENU_BACKGROUND=HUD/GUI Hintergrund +vivecraft.options.HUD_OCCLUSION=HUD-Okklusion +vivecraft.options.MENU_ALWAYS_FOLLOW_FACE=Hauptmenü Folgen +vivecraft.options.CROSSHAIR_OCCLUSION=Fadenkreuz-Okklusion +vivecraft.options.CROSSHAIR_SCALE=Fadenkreuzgröße +vivecraft.options.MENU_CROSSHAIR_SCALE=Menü Fadenkreuzgröße +vivecraft.options.RENDER_CROSSHAIR_MODE=Fadenkreuz anzeigen +vivecraft.options.CHAT_NOTIFICATIONS=Chat Benachrichtigungen +vivecraft.options.CHAT_NOTIFICATION_SOUND=Benachrichtigungston +vivecraft.options.CROSSHAIR_SCALES_WITH_DISTANCE=Fadenkreuzskalierung +vivecraft.options.RENDER_BLOCK_OUTLINE_MODE=Blockumriss anzeigen +vivecraft.options.AUTO_OPEN_KEYBOARD=Tastatur immer öffnen +vivecraft.options.RADIAL_MODE_HOLD=Kreismenü Modus +vivecraft.options.PHYSICAL_KEYBOARD=Tastaturtyp +vivecraft.options.PHYSICAL_KEYBOARD_SCALE=Tastaturgröße +vivecraft.options.GUI_APPEAR_OVER_BLOCK=Über Block erscheinen +vivecraft.options.FSAA=Lanczos-Skalierer  +vivecraft.options.MIRROR_DISPLAY=Desktop-Spiegel +vivecraft.options.MIRROR_EYE=Zuschaueransicht Wechseln +vivecraft.options.MIXED_REALITY_KEY_COLOR=Knopf Farbe +vivecraft.options.MIXED_REALITY_RENDER_HANDS=Hände anzeigen +vivecraft.options.MIXED_REALITY_UNITY_LIKE=Layout +vivecraft.options.MIXED_REALITY_UNDISTORTED=Unverzerrter Durchgang  +vivecraft.options.MIXED_REALITY_ALPHA_MASK=Alpha Maske +vivecraft.options.MIXED_REALITY_FOV=Außenansicht FOV +vivecraft.options.WALK_UP_BLOCKS=Blöcke Hochlaufen +vivecraft.options.MOVEMENT_MULTIPLIER=Geh-Geschwindigkeits Multiplikator +vivecraft.options.INERTIA_FACTOR=Spieler-.Trägheit +vivecraft.options.SIMULATE_FALLING=Fallsimulierung +vivecraft.options.WEAPON_COLLISION=Waffenkollision +vivecraft.options.ALLOW_CRAWLING=Raumskala Krabbeln +vivecraft.options.LIMIT_TELEPORT=Limitiere im Überlebensmodus +vivecraft.options.REVERSE_HANDS=Hände vertauschen +vivecraft.options.STENCIL_ON=Augenschablone nutzen +vivecraft.options.BCB_ON=Körperposition Anzeigen +vivecraft.options.WORLD_SCALE=Welt Skala +vivecraft.options.WORLD_ROTATION=Welt Rotation +vivecraft.options.WORLD_ROTATION_INCREMENT=Rotations-Inkrement +vivecraft.options.TOUCH_HOTBAR=Touch Hotbar Aktiviert +vivecraft.options.PLAY_MODE_SEATED=Spielmodus +vivecraft.options.RENDER_SCALEFACTOR=Auflösung +vivecraft.options.MONO_FOV=Unverzerrtes FOV +vivecraft.options.REALISTIC_JUMP=Raumskala Springen +vivecraft.options.REALISTIC_SNEAK=Raumskala Schleichen +vivecraft.options.PHYSICAL_GUI=Physikalisches GUIs +vivecraft.options.REALISTIC_CLIMB=Raumskala Klettern +vivecraft.options.REALISTIC_SWIM=Raumskala Schwimmen +vivecraft.options.REALISTIC_ROW=Raumskala Rudern +vivecraft.options.WALK_MULTIPLIER=Lauf Multiplikator +vivecraft.options.FREEMOVE_MODE=Frei Bewegen +vivecraft.options.VEHICLE_ROTATION=Vehikel Rotation +vivecraft.options.RESET_ORIGIN=Ursprung Zurücksetzen +vivecraft.options.X_SENSITIVITY=Rotations Geschwindigkeit +vivecraft.options.Y_SENSITIVITY=Y-Sensitivität +vivecraft.options.KEYHOLE=Schlüsselloch +vivecraft.options.FOV_REDUCTION=FOV Komfort Reduzierung +vivecraft.options.FOV_REDUCTION_MIN=FOV Reduzierungs Größe +vivecraft.options.FOV_REDUCTION_OFFSET=FOV Reduzierungs Ausgleich +vivecraft.options.SEATED_HMD=Vorwärts Richtung +vivecraft.options.SEATED_HUD_XHAIR=HUD folgt +vivecraft.options.BACKPACK_SWITCH=Rucksack Wechsel +vivecraft.options.ANALOG_MOVEMENT=Analoge Bewegung +vivecraft.options.AUTO_SPRINT=Auto-Sprint +vivecraft.options.AUTO_SPRINT_THRESHOLD=Auto-Sprint Schwellenwert +vivecraft.options.BOW_MODE=Raumskala Bogen Modus +vivecraft.options.TELEPORT_DOWN_LIMIT=Untergrenze +vivecraft.options.TELEPORT_UP_LIMIT=Obergrenze +vivecraft.options.TELEPORT_HORIZ_LIMIT=Distanz Begrenzung +vivecraft.options.ALLOW_STANDING_ORIGIN_OFFSET=Erlaube Ursprungs Ausgleich +vivecraft.options.SEATED_FREE_MOVE=Bewegungs Art +vivecraft.options.FORCE_STANDING_FREE_MOVE=Erzwinge Freies Bewegen +vivecraft.options.ALLOW_ADVANCED_BINDINGS=Zeige Erweiterte Tastenbelegung +vivecraft.options.MENU_WORLD_SELECTION=Welten +vivecraft.options.HRTF_SELECTION=HRTF +vivecraft.options.RELOAD_EXTERNAL_CAMERA=Externe Kamera neu laden +vivecraft.options.RIGHT_CLICK_DELAY=Rechts Klick Wiederholung +vivecraft.options.ANIMAL_TOUCHING=Tier Berührungen +vivecraft.options.HANDHELD_CAMERA_FOV=Kamera FOV +vivecraft.options.HANDHELD_CAMERA_RENDER_SCALE=Kamera Auflösung + +# Option tooltips +vivecraft.options.HUD_SCALE.tooltip=Die Relative Größe vom HUD im Sichtfeld.\nDie Einheiten sind relativ, nicht in Grad oder einem Bruchteil von FOV. + +vivecraft.options.HUD_DISTANCE.tooltip=Abstand, den das schwebende HUD vom Körper weg angezeigt wird.\nDie relative Größe des HUDs bleibt dadurch unverändert.\nDer Abstand wird in Metern angegeben (wird aber nicht durch Blöcke versperrt). + +vivecraft.options.HUD_LOCK_TO.tooltip=Gibt an, in welcher Ausrichtung das HUD gesperrt ist.\n Hand: Das HUD erscheint direkt über der nicht Dominanten Hand.\n Kopf: Das HUD wird immer geradeaus im Sichtfeld erscheinen.\n Handgelenk: Das HUD erscheint an der Innenseite des Handgelenks. Es erscheint, wenn man es betrachtet. + +vivecraft.options.HUD_OPACITY.tooltip=Wie transparent das HUD und die UI im Spiel gezeichnet wird. + +vivecraft.options.RENDER_MENU_BACKGROUND.tooltip=Gibt an, ob die GUI-Menüs im Spiel einen halbtransparenten Hintergrund haben oder nicht.\n An: Halbtransparenter Hintergrund bei In-Game-Menüs.\n Aus: Kein Hintergrund bei In-Game-Menüs. + +vivecraft.options.HUD_OCCLUSION.tooltip=Gibt an, ob das HUD durch nähere Objekte verdeckt wird.\n An: Das HUD wird von näher liegenden Objekten verdeckt. Kann in beengten Umgebungen vollständig verborgen werden!\n Aus: Das HUD ist immer sichtbar. Probleme mit der Stereotiefe können bemerkbar sein. + +vivecraft.options.MENU_ALWAYS_FOLLOW_FACE.tooltip=Gibt an, wann das Hauptmenü Ihrer Blickrichtung folgt.\n Sitzt: Das Hauptmenü folgt nur im sitzenden Modus.\n Immer: Das Hauptmenü wird immer folgen. + +vivecraft.options.CROSSHAIR_SCALE.tooltip=Legt die Größe des Fadenkreuzes im Spiel fest. + +vivecraft.options.MENU_CROSSHAIR_SCALE.tooltip=Legt die Größe des Fadenkreuzes im Menü fest. + +vivecraft.options.RENDER_CROSSHAIR_MODE.tooltip=Stellen Sie den Anzeigemodus des Fadenkreuzes im Spiel ein.\n Immer: Das Fadenkreuz wird immer angezeigt, auch wenn das HUD deaktiviert ist.\n Mit HUD: Das Fadenkreuz wird nur angezeigt, wenn das HUD aktiviert ist.\n Nie: Das Fadenkreuz wird nie eingeblendet. + +vivecraft.options.CHAT_NOTIFICATIONS.tooltip=Legt fest, was passiert, wenn Sie eine Chat-Nachricht erhalten.\n Keiner: Gar nichts!\n Haptisch: Puls am linken Regler.\n Ton: Spielt den Chat-Benachrichtigungston ab.\n Beides: Sowohl haptisch als auch akustisch. + +vivecraft.options.CHAT_NOTIFICATION_SOUND.tooltip=Legt den Chat-Benachrichtigungston fest. + +vivecraft.options.CROSSHAIR_SCALES_WITH_DISTANCE.tooltip=Bestimmt, wie sich das Fadenkreuz mit der Entfernung verändert.\n An: Das Fadenkreuz wird in der Entfernung größer, um aus Ihrer Sicht gleich groß zu bleiben.\n Aus: Das Fadenkreuz wird in der Welt immer gleich groß sein und mit der Entfernung schrumpfen. + +vivecraft.options.RENDER_BLOCK_OUTLINE_MODE.tooltip=Legt den Anzeigemodus der Blockumrisse im Spiel fest.\n Immer: Der Blockumriss wird immer angezeigt, auch wenn das HUD deaktiviert ist.\n Mit HUD: Der Blockumriss wird nur angezeigt, wenn das HUD aktiviert ist.\n Nie: Der Blockumriss wird nie angezeigt. + +vivecraft.options.AUTO_OPEN_KEYBOARD.tooltip=Wenn deaktiviert, wird die Tastatur nur geöffnet, wenn Sie auf ein Textfeld klicken oder wenn ein Textfeld den Fokus nicht verlieren kann.\n\nWenn aktiviert, öffnet sich die Tastatur automatisch, sobald ein Textfeld den Fokus erhält. Wenn sie aktiviert ist, wird sie in unerwünschten Situationen mit Mods geöffnet. + +vivecraft.options.RADIAL_MODE_HOLD.tooltip=Verhalten des Kreismenüs beim Drücken der Taste.\n Halten: Kreismenü-Taste halten, über Auswahl schweben und loslassen.\n Drücken: Kreismenü-Taste drücken, Knöpfe anklicken, Kreismenü-Taste erneut drücken um zu schließen. + +vivecraft.options.PHYSICAL_KEYBOARD.tooltip=Welche Art von VR-Tastatur zum Tippen verwendet werden soll.\n Physikalisch: Eine Tastatur, auf der Sie wie auf einer echten Tastatur tippen können.\n Zeiger: Eine Tastatur, die Sie verwenden können, indem Sie mit dem Fadenkreuz des Controllers von einen der beiden Controller zeigen und drücken. + +vivecraft.options.PHYSICAL_KEYBOARD_SCALE.tooltip=Wie groß die physische Tastatur im Verhältnis zu ihrer Basisgröße sein sollte. + +vivecraft.options.GUI_APPEAR_OVER_BLOCK.tooltip=Wenn aktiviert, wird die GUI für Blöcke (wie Truhen und Öfen) über dem Block platziert. Andernfalls befindet sie sich an der üblichen Position. + +vivecraft.options.FSAA.tooltip=Verwendet eine ausgeklügeltere Methode zur Neuabtastung des Spiels, bevor es an das HMD geschickt wird. Funktioniert am besten bei hohen Render-Skalierungen. + +vivecraft.options.MIRROR_DISPLAY.tooltip=Spiegelt das Bild auf dem HMD in ein separates Desktop-Fenster.\nKann auf Aus, Einzel- oder Dual-HMD-Ansicht, unverzerrte 1. Person-, unverzerrte 3. Person- und Mixed Reality eingestellt werden. Die unverzerrten und gemischten Realitätsansichten haben einen Leistungspreis. + +vivecraft.options.MIRROR_EYE.tooltip=Welches Auge in den Modi Ausgeschnitten und Single verwendet werden soll. + +vivecraft.options.MIXED_REALITY_KEY_COLOR.tooltip=Die Farbe, die auf die "transparenten" Bereiche der Ansicht der Mixed Reality gezeichnet wird. Andere Farben im Spiel werden daran gehindert, dies abzugleichen, damit es keine Verwirrung verursacht. + +vivecraft.options.MIXED_REALITY_RENDER_HANDS.tooltip=Geben Sie die Mixed Reality ansicht wieder. Schaltet nur das Rendern der tatsächlichen Handmodelle um, Items werden weiterhin gerendert. + +vivecraft.options.MIXED_REALITY_UNITY_LIKE.tooltip=Wähle zwischen einem 4-Fenster-Layout im Unity-Stil oder einem 2-Fenster-Layout nebeneinander. + +vivecraft.options.MIXED_REALITY_UNDISTORTED.tooltip=Einfügen einer unverzerrten Ansicht im 4-Fenster-Layout Erfordert einen zusätzlichen Render-Pass. Andernfalls wird die HMD-Ansicht verwendet. + +vivecraft.options.MIXED_REALITY_ALPHA_MASK.tooltip=Im Unity-Layout, wenn ja, wird eine Graustufen-Alpha-Maske in den oberen rechten Quadranten gezeichnet (wie Unity), die zur Maskierung der Vordergrundebene verwendet wird. Andernfalls wird der Vordergrund mit der Schlüsselfarbe gezeichnet, damit er mit dem Farbschlüssel-Effekt verwendet werden kann. + +vivecraft.options.MIXED_REALITY_FOV.tooltip=Das für den Mixed-Reality-Spiegelmodus verwendete FOV. + +vivecraft.options.WALK_UP_BLOCKS.tooltip=Ermöglicht es Ihnen, die Fähigkeit einzustellen, Blöcke hochzugehen, ohne springen zu müssen. Tastenkombination: Strg+B\n§cWARNUNG: Kann Anti-Cheat-Warnungen auslösen, wenn auf einem Multiplayer-Server!\n Aus: (Standard) Sie müssen Blöcke hochspringen.\n An: Sie können einzelne Blöcke hochspringen. Kann bei einigen die durch die Fortbewegung verursachte Simulatorkrankheit verringern. + +vivecraft.options.MOVEMENT_MULTIPLIER.tooltip=Legt einen Bewegungsmultiplikator fest, der eine langsamere Bewegung als die Standardeinstellung ermöglicht. Dies kann dazu beitragen, die durch die Fortbewegung induzierte Simulatorkrankheit zu reduzieren.
§cWARNUNG: Kann Anti-Cheat-Warnungen auslösen, wenn auf einem Mehrspieler-Server!
Standardeinstellung für die Standardgeschwindigkeit der Minecraft-Bewegung (1.0). + +vivecraft.options.INERTIA_FACTOR.tooltip=Legt die Bewegungsträgheit des Spielers im Einzelspielermodus fest. Geringere Trägheit bedeutet schnellere Beschleunigung, höhere Trägheit langsamere Beschleunigung. Hohe Trägheit kann bei manchen die Reisekrankheit verringern, aber Vorsicht vor Klippenrändern!\n Normal: (Standard) Standard-Minecraft-Spielerbewegung.\n Automan < Normal < Viel < Noch mehr. Beeinflusst derzeit keine Lava-, Wasser- oder Sprungbewegungen. + +vivecraft.options.SIMULATE_FALLING.tooltip=Wenn aktiviert, fällt der Spieler im Teleportmodus auf den Boden, wenn er über einem leeren Raum steht. Erlaubt auch Springen. + +vivecraft.options.WEAPON_COLLISION.tooltip=Ermöglicht das Treffen von Blöcken und Entities im Raumskala.\nIst Automatisch bei Survival eingeschaltet und bei Creative ausgeschaltet. + +vivecraft.options.ALLOW_CRAWLING.tooltip=Wenn diese Option aktiviert ist, kann sich der Spieler unter dem Block ducken. + +vivecraft.options.LIMIT_TELEPORT.tooltip=Wenn aktiviert, hat der Bogen-Teleporter im Überlebensmodus Einschränkungen. Er wird nicht in der Lage sein, seitlich an Blöcken hochzuspringen, er wird Hunger verbrauchen, und er wird einen Energieriegel haben, der sich mit der Zeit wieder auffüllt. + +vivecraft.options.REVERSE_HANDS.tooltip=Tauschen Sie die linke/rechte Hand als dominant.\n An: Links dominant\n Aus: Rechts-dominant\n\nUm die Schaltflächen zu vertauschen, starten Sie das Spiel neu und stellen Sie sicher, dass die Standardbindungen in SteamVR ausgewählt sind. + +vivecraft.options.STENCIL_ON.tooltip=Bereiche des Bildschirms außerhalb des FOV ausblenden.\nVerbessert die Leistung. + +vivecraft.options.BCB_ON.tooltip=Zeigt Ihre Körperposition als quadratischen Schatten auf dem Boden an.\nDies ist Ihr quadratischer Schatten Kumpel™.\nVerlieren Sie Ihren quadratischen Schatten Kumpel nicht. + +vivecraft.options.WORLD_SCALE.tooltip=Skaliert den Spieler in der Welt.\nÜber eins macht Sie größer\nUnd darunter macht es sie kleiner\nUnd die, die Ihnen Ihre Mutter gibt\nmachen überhaupt nichts. + +vivecraft.options.WORLD_ROTATION.tooltip=Fügt Ihrem HMD eine zusätzliche Rotation hinzu.\nNützlicher an einer Taste gebunden oder mit den Pfeiltasten verändert. + +vivecraft.options.WORLD_ROTATION_INCREMENT.tooltip=Wie viele Grad bei der Drehung der Welt gedreht werden müssen. + +vivecraft.options.TOUCH_HOTBAR.tooltip=Wenn aktiviert, können Sie die Hotbar mit der Haupthand berühren, um ein Item auszuwählen. + +vivecraft.options.PLAY_MODE_SEATED.tooltip=Stehender oder sitzender Spielmodus.\nStehen ist bei weitem überlegen. + +vivecraft.options.RENDER_SCALEFACTOR.tooltip=Die interne Rendering-Skala des Spiels, relativ zum nativen HMD-Display. Höhere Werte verbessern die visuelle Qualität auf Kosten der Leistung. + +vivecraft.options.MONO_FOV.tooltip=Das für den unverzerrten Spiegelmodus verwendete FOV. + +vivecraft.options.REALISTIC_JUMP.tooltip=Wenn eingeschaltet, springt Ihr Spieler sobald Sie im wirklichen Leben springen. Aktiviert auch Jump Boots. + +vivecraft.options.REALISTIC_SNEAK.tooltip=Wenn eingeschaltet , wird sich Ihr Spieler sobald Sie sich im wirklichen Leben ducken, auch schleichen. + +vivecraft.options.PHYSICAL_GUI.tooltip=Wenn sie eingeschaltet ist, werden GUIs durch interaktionsfähige 3D-Modelle ersetzt.\nWenn die Rucksackverfolgung aktiviert ist, bringt ein Griff auf den Rücken den Inventarbeutel zum Vorschein. + +vivecraft.options.REALISTIC_CLIMB.tooltip=Wenn eingeschaltet, erlauben Sie das Besteigen von Leitern und Ranken, indem Sie diese berühren. Ermöglicht auch das Besteigen von Krallen. + +vivecraft.options.REALISTIC_SWIM.tooltip=Falls eingeschaltet, erlauben Sie das Schwimmen durch Brustschwimm-Bewegung mit den Controllern. + +vivecraft.options.REALISTIC_ROW.tooltip=Ruder, Ruder, Ruder dein Boot... wie verrückt mit den Armen . + +vivecraft.options.WALK_MULTIPLIER.tooltip=Multipliziert Ihre Position im Raum mit einem Faktor.\nErlaubt Ihnen, mehr herumzulaufen, kann aber Bewegungsübelkeit verursachen. + +vivecraft.options.FREEMOVE_MODE.tooltip=Die Quelle für die Freemove-Richtung.\n\n Die Steuerung: Freihand-Steuergerät, das die Richtung angibt.\n HMD: Blickrichtung des Headsets.\n Run-In-Place: Die Neigung basiert auf dem Schwingen der Regler. Pitch ist Ihr Headset.\n Raum: Die Neigung ist relativ zu Ihrem VR-Raum nach vorne. Neigung: Die Neigung ist basiert auf Ihr Headset. Dieser Modus ist am besten nur für 180 Setups geeignet. + +vivecraft.options.VEHICLE_ROTATION.tooltip=Wenn man in einem Vehikel fährt, dreht sich die Welt, während sich das Vehikel dreht. Kann verwirrend sein. + +vivecraft.options.RESET_ORIGIN.tooltip=Stellen Sie die Füße des Spielers in der Welt auf 1,62 m unter die aktuelle HMD-Position zurück. Für nicht-absolute Trackingsysteme oder sitzendes Spiel. + +vivecraft.options.X_SENSITIVITY.tooltip=Geschwindigkeit, mit der sich die Ansicht dreht, wenn sie auf den Rand des Schlüssellochs gedrückt wird. + +vivecraft.options.Y_SENSITIVITY.tooltip=Vertikale Geschwindigkeit des Fadenkreuzes bezogen auf die Maus. + +vivecraft.options.KEYHOLE.tooltip=Die Anzahl der Grad links und rechts von der Mitte, um die sich die Ansicht zu drehen beginnt. + +vivecraft.options.FOV_REDUCTION.tooltip=Verkleinert das Sichtfeld während der Bewegung. Kann bei Bewegungsübelkeit helfen. + +vivecraft.options.FOV_REDUCTION_MIN.tooltip=Die endgültige Größe der FOV-Reduktion. + +vivecraft.options.FOV_REDUCTION_OFFSET.tooltip=Horizontaler Versatz des Zentrums der FOV-Reduktion für Nicht-Standard HMDs. + +vivecraft.options.SEATED_HMD.tooltip=Die Richtung, in die die Vorwärts-Taste (W) geht.\nHMD-Blickrichtung oder die Richtung des Fadenkreuzes. + +vivecraft.options.SEATED_HUD_XHAIR.tooltip=Die Richtung, in die der HUD platziert werden soll.\nHMD-Blickrichtung oder die Richtung des Fadenkreuzes. + +vivecraft.options.BACKPACK_SWITCH.tooltip=Wenn eingeschaltet, können Sie mit dem rechten Controller hinter den Kopf greifen und zum ersten Hotbar-Slot oder zurück zum vorherigen Slot wechseln. Wenn Sie dasselbe mit dem linken Controller tun, vertauschen Sie die Items zwischen linke und rechte Hand. + +vivecraft.options.ANALOG_MOVEMENT.tooltip=Die Laufgeschwindigkeit wird durch die Achse des Controller-Buttons bestimmt, wenn der gebundene Button eine variable Achse hat.\n\nFür eine vollständige analoge Steuerung ist es besser, "Nur Bewegen" oder "Bewegen/Drehen" zu verwenden. + +vivecraft.options.AUTO_SPRINT.tooltip=Bei Verwendung von Freemove wird Sprint automatisch aktiviert, wenn die Achse den konfigurierten Schwellenwert erreicht. + +vivecraft.options.AUTO_SPRINT_THRESHOLD.tooltip=Der Achsenschwellenwert, bei dem automatisch Sprinten aktiviert wird. + +vivecraft.options.BOW_MODE.tooltip=Legt fest, wann Bogenschießen im Raumskala verwendet werden soll\n Aus: Niemals.\n Vanilla: Nur für den Vanilla-Bogen, keine Mod-Items.\n An: Immer für jeden Gegenstand, der die Aktion "Bogen" verwendet. + +vivecraft.options.TELEPORT_DOWN_LIMIT.tooltip=Begrenzt die die Anzahl der Blöcke, die Sie unter sich teleportieren können. + +vivecraft.options.TELEPORT_UP_LIMIT.tooltip=Begrenzt Sie die Anzahl der Blöcke, die Sie über sich teleportieren können. + +vivecraft.options.TELEPORT_HORIZ_LIMIT.tooltip=Begrenzt Sie die Anzahl der Blöcke, die Sie seitwärts teleportieren können. + +vivecraft.options.ALLOW_STANDING_ORIGIN_OFFSET.tooltip=Ermöglicht die Verwendung der Schaltfläche "Standard Zurücksetzen" im Stehen für diejenigen, die physisch sitzend spielen möchten, während sie Bewegungsverfolgte Controller verwenden. + +vivecraft.options.SEATED_FREE_MOVE.tooltip=Welche Fortbewegungsart im Sitzen verwendet werden soll.\n\n Teleportieren: Zum Aktivieren eine beliebige Richtung drücken.\n Freie Bewegung: WASD-Bewegung wie Vanilla Minecraft. + +vivecraft.options.FORCE_STANDING_FREE_MOVE.tooltip=Erzwingt die Verwendung des Fallback Forwärts Bewegung-Bindungs (standardmäßig linker Auslöser). Für weitere Bewegungsoptionen bearbeiten Sie die SteamVR-Controller-Bindungen.\n\nBeachten Sie, dass dadurch die Teleportbindung deaktiviert wird. + +vivecraft.options.ALLOW_ADVANCED_BINDINGS.tooltip=Blendet zusätzliche SteamVR-Bindungen für Climbey, Tastatur und Mixed Reality ein.\n\nErfordert einen Neustart, um effekt zu nehmen + +vivecraft.options.MENU_WORLD_SELECTION.tooltip=Welche Menüwelten beim Start geladen werden sollen.\n\nWenn keine benutzerdefinierten Welten gefunden werden, werden trotzdem offizielle Welten verwendet. + +vivecraft.options.HRTF_SELECTION.tooltip=HRTF-Profil zur Verwendung für positionelles 3D-Audio. Die Qualität kann je nach Gerät und Treiber variieren.\n\n Aus: HRTF explizit deaktivieren.\n Voreinstellung: Verwenden Sie das Standard-HRTF-Profil.\n Andere: Verwenden Sie ein spezifisches HRTF-Profil. + +vivecraft.options.RELOAD_EXTERNAL_CAMERA.tooltip=Lädt die Kamerakonfiguration aus ExternalCamera.cfg neu + +vivecraft.options.RIGHT_CLICK_DELAY.tooltip=Die Anzahl der Spielticks zwischen "Rechtsklicks", während Sie die Taste gedrückt halten. + +vivecraft.options.ANIMAL_TOUCHING.tooltip=Wenn aktiviert, wird beim Berühren eines passiven Mobs (Tiere) ohne Waffe ein Rechtsklick (Interaktion) ausgeführt, anstatt anzugreifen.\nAusschalten für Schweineschellen, Josh. + +vivecraft.options.HANDHELD_CAMERA_FOV.tooltip=FOV der handgeführten Screenshot-Kamera. + +vivecraft.options.HANDHELD_CAMERA_RENDER_SCALE.tooltip=Auflösung der Handheld-Screenshot-Kamera, für die Aufnahme von Screenshots, die viel größer als die normale Render-Auflösung sind.\nKann nicht verwendet werden, wenn Shader aktiviert sind.\n§cWARNUNG: Wenn Sie diesen Wert sehr hoch einstellen, kann der Computer schmelzen! + +# Option values +vivecraft.options.gamma.cantseeshitcaptain=Ich kann nichts sehen +vivecraft.options.yes=Ja +vivecraft.options.no=Nein +vivecraft.options.auto=Automatisch +vivecraft.options.default=Standard +vivecraft.options.opaque=Undurchsichtig +vivecraft.options.mirror.off=OFF (Schnell) +vivecraft.options.mirror.dual=Dual (Schnell) +vivecraft.options.mirror.single=Einzeln (Schnell) +vivecraft.options.mirror.firstperson=1. Person (Langsam) +vivecraft.options.mirror.thirdperson=3. Person (Langsam) +vivecraft.options.mirror.mixedreality=Mixed Reality (Langsam) +vivecraft.options.mirror.cropped=Ausgeschnitten (Schnell) +vivecraft.options.left=Links +vivecraft.options.right=Rechts +vivecraft.options.color.black=Schwarz +vivecraft.options.color.red=Rot +vivecraft.options.color.yellow=Gelb +vivecraft.options.color.green=Grün +vivecraft.options.color.cyan=Türkis +vivecraft.options.color.blue=Blau +vivecraft.options.color.magenta=Magenta +vivecraft.options.unity=Unity +vivecraft.options.sidebyside=Seite-an-Seite +vivecraft.options.hand=Hand +vivecraft.options.head=Kopf +vivecraft.options.wrist=Handgelenk +vivecraft.options.body=Körper +vivecraft.options.withhud=Mit HUD +vivecraft.options.always=Immer +vivecraft.options.never=Nie +vivecraft.options.chatnotification.none=Keine +vivecraft.options.chatnotification.haptic=Haptisch +vivecraft.options.chatnotification.sound=Sound +vivecraft.options.chatnotification.both=Beide +vivecraft.options.seated=Sitzend +vivecraft.options.standing=Stehend +vivecraft.options.inertia.none=Automan +vivecraft.options.inertia.normal=Normal +vivecraft.options.inertia.large=Viel +vivecraft.options.inertia.massive=Noch mehr +vivecraft.options.smooth=Glatt +vivecraft.options.hmd=HMD +vivecraft.options.crosshair=Fadenkreuz +vivecraft.options.controller=Controller +vivecraft.options.runinplace=Run-In-Place +vivecraft.options.room=Raum +vivecraft.options.hold=Halten +vivecraft.options.press=Drücken +vivecraft.options.keyboard.physical=Physisch +vivecraft.options.keyboard.pointer=Zeiger +vivecraft.options.vanilla=Vanilla +vivecraft.options.teleportlimit=%d Blöcke +vivecraft.options.teleport=Teleportation +vivecraft.options.freemove=Frei bewegen +vivecraft.options.menuworld.both=Benutzerdefiniert oder offizielle +vivecraft.options.menuworld.custom=Nur benutzerdefiniert +vivecraft.options.menuworld.official=Nur offiziell +vivecraft.options.menuworld.none=Keine +vivecraft.options.rightclickdelay.slow=Langsam +vivecraft.options.rightclickdelay.slower=Langsamer +vivecraft.options.rightclickdelay.slowest=Am langsamsten + +# Button text +vivecraft.gui.ok=OK +vivecraft.gui.clear=Löschen +vivecraft.gui.loaddefaults=Standard Laden +vivecraft.gui.menuworld.refresh=Menü Welt Neu Laden +vivecraft.gui.menuworld.loadnew=Lade Neue Menü Welt +vivecraft.gui.radialmenu.mainset=Haupt-Set +vivecraft.gui.radialmenu.alternateset=Alternativ-Set +vivecraft.gui.chat=Chat +vivecraft.gui.commands=Befehle +vivecraft.gui.overlay=Overlay +vivecraft.gui.profiler=Profiler +vivecraft.gui.screenshot=Bildschirmfoto +vivecraft.gui.calibrateheight=Höhe Kalibrieren +vivecraft.gui.alignkatwalk=KAT WALK Ausrichten +vivecraft.gui.movethirdpersoncam=Außenansicht Bewegen + +# Items +vivecraft.item.jumpboots=Sprung-Schuhe +vivecraft.item.climbclaws=Kletterkrallen +vivecraft.item.telescope=Auge des Weitsehers + +# Messages +vivecraft.messages.seatedmode=Das Umschalten in den Sitzmodus deaktiviert die Controller-Eingabe. Fortfahren? +vivecraft.messages.radialmenubind.1=Stelle sicher das Kreismenü ist gebunden. +vivecraft.messages.radialmenubind.2=Halten Sie (Tastatur Shift) bei geöffnetem Kreismenü gedrückt, um zu diesem Set zu wechseln. +vivecraft.messages.controls.1=Belegungen werden von SteamVR Input verwaltet. +vivecraft.messages.controls.2=Gehen Sie im Dashboard zu Einstellungen> Controller> Controller-Belegung verwalten. +vivecraft.messages.controls.3=§6Steam muss ausgeführt werden, §obevor§r§6 SteamVR gestartet wird. Andernfalls werden Tasten Belegungen nicht gespeichert. +vivecraft.messages.serverplugin=Vivecraft Server Mod erkannt: %s +vivecraft.messages.noserverplugin=Vivecraft Server Mod nicht erkannt. Dieser Server unterstützt möglicherweise kein Teleportieren. Der eingeschränkte Bewegungsmodus (Fallback auf freie Bewegung) wurde aktiviert. +vivecraft.messages.calibrateheight=Bitte kalibrieren Sie Ihre Körpergröße im Pause Menü. +vivecraft.messages.rendersetupfailed=Render Setup fehlgeschlagen: %s +vivecraft.messages.intelgraphics=Intel Integrated Graphics werden nicht unterstützt. Wenn es sich um einen Laptop handelt, erzwingen Sie bitte die Hochleistungs-GPU. Erkannte GPU: %s +vivecraft.messages.menuworldexportcomplete.1=Weltexport abgeschlossen... Flächengröße: %d +vivecraft.messages.menuworldexportcomplete.2=Gespeichert unter %s +vivecraft.messages.menuworldexportclientwarning=WARNUNG: Speichern der Menüwelt mithilfe einer Clientwelt. Daten können unvollständig sein. Es wird empfohlen, Menüwelten im Einzelspielermodus zu speichern. +vivecraft.messages.teleportdisabled=Bewegungseinschränkung aktiviert (Teleportation nicht erlaubt) +vivecraft.messages.teleportenabled=Bewegungseinschränkung deaktiviert (Teleportation erlaubt) +vivecraft.messages.walkupblocks=Blöcke hochlaufen (RCTRL+B): %s +vivecraft.messages.showaim=Ziel zeigen (RCTRL+RSHIFT): aktiviert +vivecraft.messages.playerinertia=Spieler Bewegungsträgheit (LCTRL+I): %s +vivecraft.messages.movementmodeswitch=Bewegungsmodus gewechselt zu: %s +vivecraft.messages.coords=X: %.2f Y: %.2f Z: %.2f +vivecraft.messages.angles=Längsachse: %.1f Querachse: %.1f Vertikalachse: %.1f +vivecraft.messages.heightset=Körpergröße gesetzt auf %d%% diff --git a/resources/assets/vivecraft/lang/en_us.lang b/resources/assets/vivecraft/lang/en_us.lang index 6f5fa3d..b176d23 100644 --- a/resources/assets/vivecraft/lang/en_us.lang +++ b/resources/assets/vivecraft/lang/en_us.lang @@ -22,6 +22,7 @@ vivecraft.key.swapMirrorView=Swap Mirror View vivecraft.key.toggleKeyboard=Show/Hide Keyboard vivecraft.key.moveThirdPersonCam=Move Third Person Camera vivecraft.key.togglePlayerList=Toggle Player List +vivecraft.key.toggleHandheldCam=Toggle Camera vivecraft.key.trackpadTouch=Trackpad Touch vivecraft.key.vrInteract=Contextual Interact vivecraft.key.guiLeftClick=Left Click @@ -113,7 +114,7 @@ vivecraft.options.MIXED_REALITY_RENDER_HANDS=Show Hands vivecraft.options.MIXED_REALITY_UNITY_LIKE=Layout vivecraft.options.MIXED_REALITY_UNDISTORTED=Undistorted Pass vivecraft.options.MIXED_REALITY_ALPHA_MASK=Alpha Mask -vivecraft.options.MIXED_REALITY_FOV=Camera FOV +vivecraft.options.MIXED_REALITY_FOV=Third Person FOV vivecraft.options.WALK_UP_BLOCKS=Walk Up Blocks vivecraft.options.MOVEMENT_MULTIPLIER=Move. Speed Multiplier vivecraft.options.INERTIA_FACTOR=Player Inertia @@ -166,6 +167,8 @@ vivecraft.options.HRTF_SELECTION=HRTF vivecraft.options.RELOAD_EXTERNAL_CAMERA=Reload External Camera vivecraft.options.RIGHT_CLICK_DELAY=Right Click Repeat vivecraft.options.ANIMAL_TOUCHING=Animal Touching +vivecraft.options.HANDHELD_CAMERA_FOV=Camera FOV +vivecraft.options.HANDHELD_CAMERA_RENDER_SCALE=Camera Resolution # Option tooltips vivecraft.options.HUD_SCALE.tooltip=Relative size HUD takes up in field-of-view.\n\ @@ -464,6 +467,12 @@ vivecraft.options.ANIMAL_TOUCHING.tooltip=If enabled, touching a passive mob (an weapon will right-click (interact) instead of attacking.\n\ Turn off for Piggy Slapping, Josh. +vivecraft.options.HANDHELD_CAMERA_FOV.tooltip=FOV of the handheld screenshot camera. + +vivecraft.options.HANDHELD_CAMERA_RENDER_SCALE.tooltip=Resolution of the handheld screenshot camera, for taking screenshots much larger than normal render resolution.\n\ +Cannot be used when shaders are enabled.\n\ +§cWARNING: Setting this very high may melt your computer! + # Option values vivecraft.options.gamma.cantseeshitcaptain=I Can't See vivecraft.options.yes=YES diff --git a/resources/assets/vivecraft/lang/es_es.lang b/resources/assets/vivecraft/lang/es_es.lang index ec3776a..8dc5ce2 100644 --- a/resources/assets/vivecraft/lang/es_es.lang +++ b/resources/assets/vivecraft/lang/es_es.lang @@ -24,6 +24,7 @@ vivecraft.key.swapMirrorView=Cambiar Vista Duplicada vivecraft.key.toggleKeyboard=Mostrar/Ocultar Teclado vivecraft.key.moveThirdPersonCam=Mover cámara en tercera persona vivecraft.key.togglePlayerList=Alternar Lista de Jugadores +vivecraft.key.toggleHandheldCam=Cambiar Cámara vivecraft.key.trackpadTouch=Tocar Panel Táctil vivecraft.key.vrInteract=Interacción Contextual vivecraft.key.guiLeftClick=Clic izdo. @@ -115,7 +116,7 @@ vivecraft.options.MIXED_REALITY_RENDER_HANDS=Mostrar Manos vivecraft.options.MIXED_REALITY_UNITY_LIKE=Distribución vivecraft.options.MIXED_REALITY_UNDISTORTED=Sin distorsiones vivecraft.options.MIXED_REALITY_ALPHA_MASK=Máscara Transparencia -vivecraft.options.MIXED_REALITY_FOV=Campo de Visión Cámara +vivecraft.options.MIXED_REALITY_FOV=CdV 3ª Pers. vivecraft.options.WALK_UP_BLOCKS=Auto-subir bloques vivecraft.options.MOVEMENT_MULTIPLIER=Multiplicador Vel. Mov. vivecraft.options.INERTIA_FACTOR=Inercia del Jugador @@ -168,6 +169,8 @@ vivecraft.options.HRTF_SELECTION=HRTF vivecraft.options.RELOAD_EXTERNAL_CAMERA=Recargar Cámara Externa vivecraft.options.RIGHT_CLICK_DELAY=Repet. Clic dcho. vivecraft.options.ANIMAL_TOUCHING=Tocar Animales +vivecraft.options.HANDHELD_CAMERA_FOV=Campo de Visión Cámara +vivecraft.options.HANDHELD_CAMERA_RENDER_SCALE=Resolución Cámara # Option tooltips vivecraft.options.HUD_SCALE.tooltip=Tamaño relativo que ocupa la Barra en el campo-de-visión.\nLas unidades son relativas, ni en grados o fracciones de campo-de-visión ni nada. @@ -330,6 +333,10 @@ vivecraft.options.RIGHT_CLICK_DELAY.tooltip=El número de tics del juego entre " vivecraft.options.ANIMAL_TOUCHING.tooltip=Si está habilitado, tocar un animal (mob) pasivo sin un arma interactuará (clic dcho.) en vez de atacarlo.\nDeshabilitar para abofetear cerditos. +vivecraft.options.HANDHELD_CAMERA_FOV.tooltip=CdV de la cámara de fotos. + +vivecraft.options.HANDHELD_CAMERA_RENDER_SCALE.tooltip=Resolución de la cámara de fotos, para tomar capturas de pantalla a mayor resolución de lo normal.\nNo puede ser usado con sombreados activados.\n§cATENCIÓN: ¡Valores muy altos pueden derretir tu ordenador! + # Option values vivecraft.options.gamma.cantseeshitcaptain=No Puedo Ver vivecraft.options.yes=SÍ diff --git a/resources/assets/vivecraft/lang/pl_pl.lang b/resources/assets/vivecraft/lang/pl_pl.lang index 18a4378..6e918f5 100644 --- a/resources/assets/vivecraft/lang/pl_pl.lang +++ b/resources/assets/vivecraft/lang/pl_pl.lang @@ -24,6 +24,7 @@ vivecraft.key.swapMirrorView=Przełącz widok w oknie vivecraft.key.toggleKeyboard=Pokaż/Ukryj klawiaturę vivecraft.key.moveThirdPersonCam=Porusz kamerę trzecioosobową vivecraft.key.togglePlayerList=Pokaż/Ukryj listę graczy +vivecraft.key.toggleHandheldCam=Przełącz kamerę vivecraft.key.trackpadTouch=Dotyk trackpada vivecraft.key.vrInteract=Interakcja vivecraft.key.guiLeftClick=Lewe kliknięcie @@ -115,7 +116,7 @@ vivecraft.options.MIXED_REALITY_RENDER_HANDS=Pokaż dłonie vivecraft.options.MIXED_REALITY_UNITY_LIKE=Ułożenie vivecraft.options.MIXED_REALITY_UNDISTORTED=Niezdeformowane pole vivecraft.options.MIXED_REALITY_ALPHA_MASK=Maska alpha -vivecraft.options.MIXED_REALITY_FOV=FOV kamery +vivecraft.options.MIXED_REALITY_FOV=Trzecioosobowy FOV vivecraft.options.WALK_UP_BLOCKS=Wchodzenie na bloki vivecraft.options.MOVEMENT_MULTIPLIER=Ruch. Mnożnik szybkości vivecraft.options.INERTIA_FACTOR=Bezwładność gracza @@ -168,6 +169,8 @@ vivecraft.options.HRTF_SELECTION=HRTF vivecraft.options.RELOAD_EXTERNAL_CAMERA=Przeładuj zewnętrzną kamerę vivecraft.options.RIGHT_CLICK_DELAY=Powtórzenie prawego kliknięcia vivecraft.options.ANIMAL_TOUCHING=Dotykanie zwierząt +vivecraft.options.HANDHELD_CAMERA_FOV=FOV kamery +vivecraft.options.HANDHELD_CAMERA_RENDER_SCALE=Rozdzielczość kamery # Option tooltips vivecraft.options.HUD_SCALE.tooltip=Względna wielkość HUD. \nWartość jest względna, nie w stopniach, części FOV lub czegokolwiek. @@ -330,6 +333,10 @@ vivecraft.options.RIGHT_CLICK_DELAY.tooltip=Ilość ticków pomiędzy kliknięci vivecraft.options.ANIMAL_TOUCHING.tooltip=Jeśli włączone, dotykanie pasywnego moba (rzwierzęcia), nie trzymając broni w ręku, zadziała jak PPM (interakcja) zamiast ataku. \nWyłącz dla Klepania Świnek, Josh. +vivecraft.options.HANDHELD_CAMERA_FOV.tooltip=FOV podręcznej kamery do zrzutów ekranu. + +vivecraft.options.HANDHELD_CAMERA_RENDER_SCALE.tooltip=Rozdzielczość podręcznej kamery do zrzutów ekranu, aby móc robić większe zrzuty od normalnej rozdzielczości gry. \nNie może być używana z shaderami. \n§cUWAGA: Ustawienie tego bardzo wysoko może stopić twój komputer! + # Option values vivecraft.options.gamma.cantseeshitcaptain=Nie widzę vivecraft.options.yes=TAK diff --git a/resources/assets/vivecraft/lang/ru_ru.lang b/resources/assets/vivecraft/lang/ru_ru.lang new file mode 100644 index 0000000..853f8c9 --- /dev/null +++ b/resources/assets/vivecraft/lang/ru_ru.lang @@ -0,0 +1,442 @@ +# Contributors: Hu4uTa, Krays, Shinomasu, link1107 + +# Key bindings +vivecraft.key.hotbarNext=Следующий Слот +vivecraft.key.hotbarPrev=Предыдущий Слот +vivecraft.key.hotbarScroll=Прокрутка Слотов +vivecraft.key.hotbarSwipeX=Свайп (Влево/Вправо) +vivecraft.key.hotbarSwipeY=Свайп (Вверх/Вниз) +vivecraft.key.rotateLeft=Повернуться Налево +vivecraft.key.rotateRight=Повернуться Направо +vivecraft.key.rotateAxis=Только Вращение +vivecraft.key.rotateFree=Свободно Поворачиваться +vivecraft.key.walkabout=Прогулка +vivecraft.key.teleport=Телепортироваться +vivecraft.key.teleportFallback=Идти вперед когда телепортирование выключено +vivecraft.key.freeMoveRotate=Двигаться/Поворачиваться +vivecraft.key.freeMoveStrafe=Двигаться/Стрейфить +vivecraft.key.toggleMovement=Переключить режим перемещения +vivecraft.key.quickTorch=Быстрый Факел +vivecraft.key.ingameMenuButton=Игровое Меню +vivecraft.key.exportWorld=Экспорт Мира Меню +vivecraft.key.radialMenu=Открыть Радиальное Меню +vivecraft.key.swapMirrorView=Выбрать зеркальный вид +vivecraft.key.toggleKeyboard=Показать/Скрыть Клавиатуру +vivecraft.key.moveThirdPersonCam=Передвинуть Камеру Третьего Лица +vivecraft.key.togglePlayerList=Переключить Список Игроков +vivecraft.key.trackpadTouch=Прикосновения к сенсорной панели +vivecraft.key.vrInteract=Контекстное Взаимодействие +vivecraft.key.guiLeftClick=Левый Клик +vivecraft.key.guiRightClick=Правый Клик +vivecraft.key.guiMiddleClick=Средний Клик +vivecraft.key.guiShift=Shift +vivecraft.key.guiCtrl=Ctrl +vivecraft.key.guiAlt=Alt +vivecraft.key.guiScrollUp=Scroll Up +vivecraft.key.guiScrollDown=Scroll Down +vivecraft.key.guiScrollAxis=Scroll +vivecraft.key.keyboardClick=Click +vivecraft.key.keyboardShift=Shift +vivecraft.key.climbeyGrab=Когти Альпиниста +vivecraft.key.climbeyJump=Прыжковые Ботинки + +# Key binding categories +vivecraft.key.category.gui=GUI +vivecraft.key.category.climbey=Движение на подъем +vivecraft.key.category.keyboard=Клавиатура + +# Action set names +vivecraft.actionset.ingame=В игре +vivecraft.actionset.gui=GUI +vivecraft.actionset.global=Глобальный +vivecraft.actionset.mod=Модифицированный +vivecraft.actionset.contextual=Контекстный +vivecraft.actionset.keyboard=Клавиатура +vivecraft.actionset.mixedReality=Смешанная Реальность +vivecraft.actionset.technical=Технический + +# Option screens +vivecraft.options.screen.main=Настройки VR +vivecraft.options.screen.freemove=Параметры Свободного Перемещения +vivecraft.options.screen.gui=Настройки Графического и Игрового Интерфейса +vivecraft.options.screen.menuworld=Меню в игре +vivecraft.options.screen.guiother=Чат/Прицел +vivecraft.options.screen.quickcommands=Быстрые команды +vivecraft.options.screen.radialmenu=Радиальное меню +vivecraft.options.screen.stereorendering=Настройки Стерео Рендера +vivecraft.options.screen.roomscale=Взаимодействие с комнатой +vivecraft.options.screen.seated=Параметры Сидячего Режима +vivecraft.options.screen.standing=Передвижение стоя +vivecraft.options.screen.teleport=Параметры Телепортации +vivecraft.options.screen.controls=Настройки Управления + +# Buttons that lead to the screen +vivecraft.options.screen.main.button=Настройки VR... +vivecraft.options.screen.gui.button=HUD и GUI... +vivecraft.options.screen.stereorendering.button=Стерео рендер... +vivecraft.options.screen.quickcommands.button=Быстрые команды... +vivecraft.options.screen.guiother.button=Настройки чата и прицела... +vivecraft.options.screen.standing.button=Настройки перемещения... +vivecraft.options.screen.roomscale.button=Настройки взаимодействий... +vivecraft.options.screen.controls.button=Настройки контроллера... +vivecraft.options.screen.radialmenu.button=Радиальное меню... +vivecraft.options.screen.seated.button=Настройки сидя... +vivecraft.options.screen.menuworld.button=Меню в игре... +vivecraft.options.screen.teleport.button=Настройки телепортации.. +vivecraft.options.screen.freemove.button=Свободное перемещение... + +# Option names +vivecraft.options.HUD_SCALE=Размер HUD +vivecraft.options.HUD_DISTANCE=Дистанция от HUD +vivecraft.options.HUD_LOCK_TO=Фиксация HUD +vivecraft.options.HUD_OPACITY=Прозрачность HUD +vivecraft.options.HUD_HIDE=Спрятать Игровой Интерфейс (F1) +vivecraft.options.RENDER_MENU_BACKGROUND=Фон HUD/GUI +vivecraft.options.HUD_OCCLUSION=Непрозрачность HUD +vivecraft.options.MENU_ALWAYS_FOLLOW_FACE=Преследование меню +vivecraft.options.CROSSHAIR_OCCLUSION=Непрозрачность прицела +vivecraft.options.CROSSHAIR_SCALE=Размер Прицела +vivecraft.options.MENU_CROSSHAIR_SCALE=Размер Прицела в Меню +vivecraft.options.RENDER_CROSSHAIR_MODE=Показать Прицел +vivecraft.options.CHAT_NOTIFICATIONS=Оповещения в чате +vivecraft.options.CHAT_NOTIFICATION_SOUND=Звук оповещения +vivecraft.options.CROSSHAIR_SCALES_WITH_DISTANCE=Маштаб прицела +vivecraft.options.RENDER_BLOCK_OUTLINE_MODE=Обводка блоков +vivecraft.options.AUTO_OPEN_KEYBOARD=Статичная клавиатура +vivecraft.options.RADIAL_MODE_HOLD=Режим радиального меню +vivecraft.options.PHYSICAL_KEYBOARD=Тип Клавиатуры +vivecraft.options.PHYSICAL_KEYBOARD_SCALE=Размер Клавиатуры +vivecraft.options.GUI_APPEAR_OVER_BLOCK=Положение над блоком +vivecraft.options.FSAA=Фильтр Ланцоша +vivecraft.options.MIRROR_DISPLAY=Отражение РС +vivecraft.options.MIRROR_EYE=Отражение глаз +vivecraft.options.MIXED_REALITY_KEY_COLOR=Свет Кнопок +vivecraft.options.MIXED_REALITY_RENDER_HANDS=Показывать Руки +vivecraft.options.MIXED_REALITY_UNITY_LIKE=Слой +vivecraft.options.MIXED_REALITY_UNDISTORTED=Прямая передача +vivecraft.options.MIXED_REALITY_ALPHA_MASK=Альфа-маска +vivecraft.options.MIXED_REALITY_FOV=Поле Зрения Камеры +vivecraft.options.WALK_UP_BLOCKS=Хождение по блокам +vivecraft.options.MOVEMENT_MULTIPLIER=Движение. Множитель скорости +vivecraft.options.INERTIA_FACTOR=Инерция Игрока +vivecraft.options.SIMULATE_FALLING=Симуляция падения +vivecraft.options.WEAPON_COLLISION=Коллизия Оружия +vivecraft.options.ALLOW_CRAWLING=Ползанье +vivecraft.options.LIMIT_TELEPORT=Лимит в Выживании +vivecraft.options.REVERSE_HANDS=Реверс рук +vivecraft.options.STENCIL_ON=Использовать Трафарет Глаз +vivecraft.options.BCB_ON=Показывать тело +vivecraft.options.WORLD_SCALE=Маштаб мира +vivecraft.options.WORLD_ROTATION=Ротация мира +vivecraft.options.WORLD_ROTATION_INCREMENT=Прирост ротации +vivecraft.options.TOUCH_HOTBAR=Прикосновения к хотбару +vivecraft.options.PLAY_MODE_SEATED=Режим Игры +vivecraft.options.RENDER_SCALEFACTOR=Разрешение +vivecraft.options.MONO_FOV=Неискажённый FOV +vivecraft.options.REALISTIC_JUMP=Прыжки +vivecraft.options.REALISTIC_SNEAK=Приседания +vivecraft.options.PHYSICAL_GUI=Физические GUI +vivecraft.options.REALISTIC_CLIMB=Взбирание +vivecraft.options.REALISTIC_SWIM=Плавание +vivecraft.options.REALISTIC_ROW=Гребля +vivecraft.options.WALK_MULTIPLIER=Ускорение хода +vivecraft.options.FREEMOVE_MODE=Тип Свободного Перемещения +vivecraft.options.VEHICLE_ROTATION=Ротация транспорта +vivecraft.options.RESET_ORIGIN=Перезагрузка источника +vivecraft.options.X_SENSITIVITY=Скорость Поворота +vivecraft.options.Y_SENSITIVITY=Чувствительность по оси Y +vivecraft.options.KEYHOLE=Замочная скважина +vivecraft.options.FOV_REDUCTION=Снижение комфорта FOV +vivecraft.options.FOV_REDUCTION_MIN=Уменьшение размера FOV +vivecraft.options.FOV_REDUCTION_OFFSET=Уменьшение смещения FOV +vivecraft.options.SEATED_HMD=Прямое направление +vivecraft.options.SEATED_HUD_XHAIR=Следование HUD +vivecraft.options.BACKPACK_SWITCH=Выбор рюкзака +vivecraft.options.ANALOG_MOVEMENT=Аналог движений +vivecraft.options.AUTO_SPRINT=Автоматический Бег +vivecraft.options.AUTO_SPRINT_THRESHOLD=Предел Автоматического Бега +vivecraft.options.BOW_MODE=Режим лука +vivecraft.options.TELEPORT_DOWN_LIMIT=Лимит низа +vivecraft.options.TELEPORT_UP_LIMIT=Лимит верха +vivecraft.options.TELEPORT_HORIZ_LIMIT=Лимит дистанции +vivecraft.options.ALLOW_STANDING_ORIGIN_OFFSET=Смещение координат +vivecraft.options.SEATED_FREE_MOVE=Тип перемещания +vivecraft.options.FORCE_STANDING_FREE_MOVE=Свободное движение +vivecraft.options.ALLOW_ADVANCED_BINDINGS=Глобальные бинды +vivecraft.options.MENU_WORLD_SELECTION=Миры +vivecraft.options.HRTF_SELECTION=HRTF +vivecraft.options.RELOAD_EXTERNAL_CAMERA=Перезагрузка камеры +vivecraft.options.RIGHT_CLICK_DELAY=Повтор ПКМ +vivecraft.options.ANIMAL_TOUCHING=Прикосновения к животным + +# Option tooltips +vivecraft.options.HUD_SCALE.tooltip=Относительный размер HUD в поле зрения.\nЕдиницы измерения относительны, и не имеют привязки к градусам и т.д. + +vivecraft.options.HUD_DISTANCE.tooltip=Расстояние до HUD находящегося перед вами.\nРазмер HUD от этого не изменится.\nДистанция в метрах (независимо от блоков). + +vivecraft.options.HUD_LOCK_TO.tooltip=Указывает установленную ориентацию HUD.\n Рука: HUD появится чуть выше вашей руки.\n Голова: HUD появляется прямо перед вами.\n Запястье: HUD будет со стороны основной руки. Оно появится при наведении. + +vivecraft.options.HUD_OPACITY.tooltip=Прозрачность HUD и UI. + +vivecraft.options.RENDER_MENU_BACKGROUND.tooltip=Показывает, имеет ли GUI прозрачность или нет.\n Вкл: Полупрозрачный фон внутриигрового меню.\n Выкл: Фон отсутствует. + +vivecraft.options.HUD_OCCLUSION.tooltip=Определяет отключение HUD приближёнными объектами.\n Вкл: HUD будет скрыт при взаимодействии. Может быть полностью скрыт в замкнутом пространстве!\n Выкл: HUD всегда виден. Возможны проблемы с глубиной. + +vivecraft.options.MENU_ALWAYS_FOLLOW_FACE.tooltip=Определяет, когда главное меню следует вашему направлению взгляда.\n Сидя: Только в сидячем режиме.\n Всегда: Следует всегда. + +vivecraft.options.CROSSHAIR_SCALE.tooltip=Устанавливает размер игрового прицела. + +vivecraft.options.MENU_CROSSHAIR_SCALE.tooltip=Устанавливает размер прицела в меню. + +vivecraft.options.RENDER_CROSSHAIR_MODE.tooltip=Режим отображения прицела.\n Всегда: Виден всегда, если выключен HUD.\n с HUD: Виден только вместе с HUD.\n Никогда: Прицел никогда не показывается. + +vivecraft.options.CHAT_NOTIFICATIONS.tooltip=Действия происходящие при получении сообщения.\n Нет: Ничего\n Тактильно: Вибрация.\n Звук: Звуковое уведомление.\n Оба: Вибрация и звук. + +vivecraft.options.CHAT_NOTIFICATION_SOUND.tooltip=Установка уведомления в чате. + +vivecraft.options.CROSSHAIR_SCALES_WITH_DISTANCE.tooltip=Изменение прицела с расстоянием.\n Вкл: Увеличивается с приближением к поверхности.\n Выкл: Прицел всегда одного размера. + +vivecraft.options.RENDER_BLOCK_OUTLINE_MODE.tooltip=Режим отображения контура блоков.\n Всегда: Контур всегда виден, если HUD выключен.\n с HUD: Контур виден только с HUD.\n Никогда: Контур не виден никогда. + +vivecraft.options.AUTO_OPEN_KEYBOARD.tooltip=Если выключено, клавиатура открывается только по нажатию на чат или на текстовое поле.\n\nЕсли включено, то клавиатура открывается при любом фокусе на текстовые поля. Может иметь проблемы с другими модами. + +vivecraft.options.RADIAL_MODE_HOLD.tooltip=Поведение радиального меню при нажатии на кнопку.\n Удерживать: Зажмите кнопку наведитесь на выделение и отпустите.\n Нажать: Обычный нажатия, нажмите дважды на кнопку чтобы закрыть. + +vivecraft.options.PHYSICAL_KEYBOARD.tooltip=Какой тип клавиатуры использовать.\n Физическая: Клавиатура подобная настоящей.\n Указатель: Выбор каждой буквы прицелом при помощи контроллера. + +vivecraft.options.PHYSICAL_KEYBOARD_SCALE.tooltip=Насколько большой должна быть физическая клавиатура, относительно базового размера. + +vivecraft.options.GUI_APPEAR_OVER_BLOCK.tooltip=Если включено, GUI для блоков (сундуки и печки) будут располагаться над блоком. В противном случае - в обычном положении. + +vivecraft.options.FSAA.tooltip=Использует более оптимизированный ресемплинг игры перед отправлением HMD. Лучше всего работает при большом объеме рендера. + +vivecraft.options.MIRROR_DISPLAY.tooltip=Отражает изображения для HMD для разделения окон.\nМожет быть установлено на Выкл, одиночный или двойной hmd-вид, 1-е лицо, 3-е лицо и смешанную реальность. FP, TP, MR обладают большей производительностью. + +vivecraft.options.MIRROR_EYE.tooltip=Какой глаз использовать в кадрированном и одиночном режимах. + +vivecraft.options.MIXED_REALITY_KEY_COLOR.tooltip=Цвет полупрозрачности для смешанной реальности. Другие цвета никак не взаимодействуют с этим. + +vivecraft.options.MIXED_REALITY_RENDER_HANDS.tooltip=Рендер рук в смешанной реальности. Касается только рук, предметы в любом случае отображаются. + +vivecraft.options.MIXED_REALITY_UNITY_LIKE.tooltip=Выбор между Unity стилями, 4-панельный слой или 2-панельный. + +vivecraft.options.MIXED_REALITY_UNDISTORTED.tooltip=Для неискажённого 4-х панельного слоя необходим сверх рендер. В противном случае будет использоваться вид HMD. + +vivecraft.options.MIXED_REALITY_ALPHA_MASK.tooltip=В Unity слое, если да, будет отображена серая градация альфа-маски в верхнем квадранте (как Unity) для использования при маскировке слоя переднего плана. В противном случае передний план будет отображаться с ключевым цветом. + +vivecraft.options.MIXED_REALITY_FOV.tooltip=FOV используется для смешанной реальности в зеркальном режиме. + +vivecraft.options.WALK_UP_BLOCKS.tooltip=Даёт возможность взбираться вверх без прыжка. Hotkey: RCtrl+B\n§cВНИМАНИЕ: Могут возникнуть проблемы с анти-читом!\n Выкл: (Обычно) Нужно прыгать на блоки.\n Вкл: Вы можете подняться на отдельные блоки. Может помочь при тошноте. + +vivecraft.options.MOVEMENT_MULTIPLIER.tooltip=Устанавливает умножение скорости, разрешает более медленные движения. Может помочь при тошноте.\n§cВНИМАНИЕ: Могут возникнуть проблемы с анти-читом!\nОбычная скорость в майнкрафте равна 1.0. + +vivecraft.options.INERTIA_FACTOR.tooltip=станавливает инерцию движения игрока в одиночном режиме. Меньшая инерция означает более быстрое ускорение, более высокая инерция означает медленное ускорение. Высокая инерция может уменьшить укачивание у некоторых, но остерегайтесь краев обрывов!\n\n Нормально: (Default) Standard Minecraft player movement.\n Автоматически < Нормально < Много < Даже Больше. Не может влиять на воду, лаву и прыжки. + +vivecraft.options.SIMULATE_FALLING.tooltip=Если этот параметр включен, игрок упадет на землю в режиме телепорта, когда стоит над пустым пространством. Также позволяет прыгать. + +vivecraft.options.WEAPON_COLLISION.tooltip=Позволяет взаимодействовать с блоками и объектами в пределах комнаты.\nАвтоматически включено в выживании. + +vivecraft.options.ALLOW_CRAWLING.tooltip=Если этот параметр включен, игрок сможет прятаться под блоком. + +vivecraft.options.LIMIT_TELEPORT.tooltip=При включении ограничивает телепортацию. Игрок не сможет прыгать по сторонам блоков, это будет затрачивать еду и появится полоска энергии. + +vivecraft.options.REVERSE_HANDS.tooltip=Выбор доминантной руки.\n Вкл: Левая доминантная\n Выкл: Правая доминантная\n\nДля смены кнопок, перезагрузите игру, и убедитесь, что настройки SteamVR не изменены. + +vivecraft.options.STENCIL_ON.tooltip=Скрывать области за пределами FOV.\nПовышает производительность. + +vivecraft.options.BCB_ON.tooltip=Показывает положения тела тенью на полу.\nЭто ваш Квадратный-Воображаемый-Друг-Тень™.\nНе потеряйте своего единственного друга... + +vivecraft.options.WORLD_SCALE.tooltip=Маштабирует игрока в мире.\nВыше 1 делает вас больше\nНиже - меньше\n1 как мать родила\nне трогай тут ничего, размер не главное. + +vivecraft.options.WORLD_ROTATION.tooltip=Увеличивает ротацию вашего HMD.\nПолезно использовать со стрелками. + +vivecraft.options.WORLD_ROTATION_INCREMENT.tooltip=На сколько градусов повернуть при вращении мира. + +vivecraft.options.TOUCH_HOTBAR.tooltip=Если этот параметр включен, вы можете касаться панели быстрого доступа основной рукой, чтобы выбрать элемент. + +vivecraft.options.PLAY_MODE_SEATED.tooltip=Режим игры стоя или сидя.\nСтоя - намного лучше. + +vivecraft.options.RENDER_SCALEFACTOR.tooltip=Масштаб внутреннего рендеринга игры относительно собственного дисплея HMD. Более высокие значения улучшают визуальное качество за счет производительности. + +vivecraft.options.MONO_FOV.tooltip=FOV используется для режима неискаженного зеркала. + +vivecraft.options.REALISTIC_JUMP.tooltip=Если включено, то ваш прыжок в игре эквивалентен реальному. Включает Ботинки-Прыгуны. + +vivecraft.options.REALISTIC_SNEAK.tooltip=Если включено, то при приседании ваш персонаж начнёт красться. + +vivecraft.options.PHYSICAL_GUI.tooltip=Если этот параметр включен то GUI будут заменены интерактивными трехмерными моделями.\nЕсли включен рюкзак, то он послужит вашим инвентарём. + +vivecraft.options.REALISTIC_CLIMB.tooltip=Если он включен, позволяйте подниматься по лестницам и лозам, дотрагиваясь до них. Также включает когти. + +vivecraft.options.REALISTIC_SWIM.tooltip=Если включено, то позволяет плавать при помощи гребли контроллерами. + +vivecraft.options.REALISTIC_ROW.tooltip=Греби как сумасшедший чтобы сдвинуться на этой чёртовой лодке. + +vivecraft.options.WALK_MULTIPLIER.tooltip=Умножает ваше положение в комнате на коэффициент.\nПозволяет больше ходить, но может вызвать укачивание. + +vivecraft.options.FREEMOVE_MODE.tooltip=Источник управления.\n Контроллер: Главная рука управляется контроллером.\n HMD: Направление гарнитуры.\n Бег на месте: Трекинг движения контроллеров.\n Комната: Режим следования VR. Перемещение при помощи гарнитуры. Режим лучше всего подходит для 180 сетапов. + +vivecraft.options.VEHICLE_ROTATION.tooltip=Езда на транспортном средстве будет вращать мир по мере вращения транспортного средства. Можно потеряться. + +vivecraft.options.RESET_ORIGIN.tooltip=Переносит игрока на высоту 1.62м от положения HMD. Для неабсолютных систем слежения или игры сидя. + +vivecraft.options.X_SENSITIVITY.tooltip=Ускорение при нажатии на край стика. + +vivecraft.options.Y_SENSITIVITY.tooltip=Вертикальная скорость прицела относительно мыши. + +vivecraft.options.KEYHOLE.tooltip=Количество градусов слева и справа от центра, откуда изображение начнет вращаться. + +vivecraft.options.FOV_REDUCTION.tooltip=Сужение поля зрения при движении. Может помочь с укачиванием. + +vivecraft.options.FOV_REDUCTION_MIN.tooltip=Окончательный размер сужения FOV. + +vivecraft.options.FOV_REDUCTION_OFFSET.tooltip=Смещает по горизонтали центр для сокращения FOV при нестандартных HMD. + +vivecraft.options.SEATED_HMD.tooltip=Направление (W) кнопки вперед.\nHMD направление взгляда или направление прицела. + +vivecraft.options.SEATED_HUD_XHAIR.tooltip=Направление, в котором будет размещен HUD.\nHMD направление взгляда или направление прицела. + +vivecraft.options.BACKPACK_SWITCH.tooltip=Если включено, то при перемещении правого контролера за голову будет выбран первый слот, или возврат к предыдущему слоту. Эти же действия левым контроллером меняют положение левого и правого предметов. + +vivecraft.options.ANALOG_MOVEMENT.tooltip=Скорость ходьбы будет определяться осью кнопки контроллера, если у кнопки есть такая возможность.\n\nДля полного аналогового управления лучше использовать "Move/Strafe" или "Move/Rotate". + +vivecraft.options.AUTO_SPRINT.tooltip=При использовании свободного перемещения, спринт автоматически активируется при достижении установленного порога. + +vivecraft.options.AUTO_SPRINT_THRESHOLD.tooltip=Порог оси, при котором активируется авто-спринт. + +vivecraft.options.BOW_MODE.tooltip=Устанавливает, когда использовать стрельбу из лука в масштабе комнаты\n Выкл: Никогда.\n Стандартно: Только для ванильного лука.\n Вкл: Для любого предмета с механикой лука. + +vivecraft.options.TELEPORT_DOWN_LIMIT.tooltip=Ограничение блоков телепортации вниз. + +vivecraft.options.TELEPORT_UP_LIMIT.tooltip=Ограничение блоков телепортации вверх. + +vivecraft.options.TELEPORT_HORIZ_LIMIT.tooltip=Ограничение блоков телепортации на плоскости. + +vivecraft.options.ALLOW_STANDING_ORIGIN_OFFSET.tooltip=Разрешает "Reset Origin" для использования в режиме стоя, для играющих сидя, используя контроллер отслеживания. + +vivecraft.options.SEATED_FREE_MOVE.tooltip=Какой режим передвижения использовать в сидячем режиме.\n\n Телепорт: Нажмите в любом направлении.\n Свободное передвижение: WASD как в обычном майнкрафте. + +vivecraft.options.FORCE_STANDING_FREE_MOVE.tooltip=Заставляет использовать привязку перехода вперед (обычно левый триггер). Для больших опций, редактируйте SteamVR бинды.\n\nОбратите внимание, что это отключает привязку телепорта. + +vivecraft.options.ALLOW_ADVANCED_BINDINGS.tooltip=Показывает дополнительные бинды SteamVR для климбинга, клавиатуры и смешанной реальности.\n\nДля результата необходима перезагрузка. + +vivecraft.options.MENU_WORLD_SELECTION.tooltip=Какие миры меню загружать при запуске.\n\nЕсли пользовательских миров не найдено, будут использоваться официальные миры. + +vivecraft.options.HRTF_SELECTION.tooltip=HRTF для использования 3D аудио. Качество может отличаться в зависимости от оборудования.\n\n Выкл: Отключение HRTF.\n По умолчанию: Обычный режим HRTF.\n Остальное: Пользовательский HRTF. + +vivecraft.options.RELOAD_EXTERNAL_CAMERA.tooltip=Перезагрузка конфигурации ExternalCamera.cfg + +vivecraft.options.RIGHT_CLICK_DELAY.tooltip=Количество тиков в игре между "ПКМ" при удержании вниз. + +vivecraft.options.ANIMAL_TOUCHING.tooltip=Если включено, при нажатии на животное (мирное) без оружия используйте ПКМ (взаимодействие) чтобы избежать атаки.\nВыключи, чтобы не бить по лицу поросят. + +# Option values +vivecraft.options.gamma.cantseeshitcaptain=Я не вижу +vivecraft.options.yes=ДА +vivecraft.options.no=НЕТ +vivecraft.options.auto=Авто +vivecraft.options.default=По умолчанию +vivecraft.options.opaque=Непрозрачный +vivecraft.options.mirror.off=ВЫКЛ (быстро) +vivecraft.options.mirror.dual=Двойной (быстро) +vivecraft.options.mirror.single=Единичный (быстро) +vivecraft.options.mirror.firstperson=1-е лицо (медленно) +vivecraft.options.mirror.thirdperson=3-е лицо (медленно) +vivecraft.options.mirror.mixedreality=Смешанная Реальность (медленно) +vivecraft.options.mirror.cropped=Укороченно (быстро) +vivecraft.options.left=Лево +vivecraft.options.right=Право +vivecraft.options.color.black=Чёрный +vivecraft.options.color.red=Красный +vivecraft.options.color.yellow=Жёлтый +vivecraft.options.color.green=Зеленый +vivecraft.options.color.cyan=Бирюзовый +vivecraft.options.color.blue=Синий +vivecraft.options.color.magenta=Пурпурный +vivecraft.options.unity=Единство +vivecraft.options.sidebyside=Бок о бок +vivecraft.options.hand=Рука +vivecraft.options.head=Голова +vivecraft.options.wrist=Запястье +vivecraft.options.body=Тело +vivecraft.options.withhud=с HUD +vivecraft.options.always=Всегда +vivecraft.options.never=Никогда +vivecraft.options.chatnotification.none=Нет +vivecraft.options.chatnotification.haptic=Тактильно +vivecraft.options.chatnotification.sound=Звук +vivecraft.options.chatnotification.both=Оба +vivecraft.options.seated=Сидя +vivecraft.options.standing=Стоя +vivecraft.options.inertia.none=Автоматически +vivecraft.options.inertia.normal=Нормально +vivecraft.options.inertia.large=Много +vivecraft.options.inertia.massive=Даже Больше +vivecraft.options.smooth=Сглаженно +vivecraft.options.hmd=HMD +vivecraft.options.crosshair=Прицел +vivecraft.options.controller=Контроллер +vivecraft.options.runinplace=Бег на месте +vivecraft.options.room=Комната +vivecraft.options.hold=Удерживать +vivecraft.options.press=Нажать +vivecraft.options.keyboard.physical=Физическая +vivecraft.options.keyboard.pointer=Указатель +vivecraft.options.vanilla=Стандартно +vivecraft.options.teleportlimit=%dБлоков +vivecraft.options.teleport=Телепортация +vivecraft.options.freemove=Свободное Перемещение +vivecraft.options.menuworld.both=Официальный и Пользовательский +vivecraft.options.menuworld.custom=Только Пользовательский +vivecraft.options.menuworld.official=Только Официальный +vivecraft.options.menuworld.none=Нет +vivecraft.options.rightclickdelay.slow=Медленно +vivecraft.options.rightclickdelay.slower=Очень медленно +vivecraft.options.rightclickdelay.slowest=Самый медленный + +# Button text +vivecraft.gui.ok=Хорошо +vivecraft.gui.clear=Очистить +vivecraft.gui.loaddefaults=Сбросить +vivecraft.gui.menuworld.refresh=Перезагрузить меню +vivecraft.gui.menuworld.loadnew=Загрузить новое меню +vivecraft.gui.radialmenu.mainset=Основной набор +vivecraft.gui.radialmenu.alternateset=Альт-набор +vivecraft.gui.chat=Чат +vivecraft.gui.commands=Команды +vivecraft.gui.overlay=Оверлей +vivecraft.gui.profiler=Профайлер +vivecraft.gui.screenshot=Скриншот +vivecraft.gui.calibrateheight=Калибровка высоты +vivecraft.gui.alignkatwalk=Выровняйте KAT WALK +vivecraft.gui.movethirdpersoncam=Переместить камеру + +# Items +vivecraft.item.jumpboots=Ботинки Прыгуны +vivecraft.item.climbclaws=Когти +vivecraft.item.telescope=Глаз Провидца + +# Messages +vivecraft.messages.seatedmode=Переход в сидячий режим отключит контроллер. Продолжить? +vivecraft.messages.radialmenubind.1=Убедитесь, что Открытое Радиальное Меню привязано. +vivecraft.messages.radialmenubind.2=Зажмите (на клавиатуре Shift) с открытым радиальным меню, чтобы переключиться на этот набор. +vivecraft.messages.controls.1=Бинды обрабатываются SteamVR. +vivecraft.messages.controls.2=Отправляйтесь в Настройки > Контроллеры > Управление Биндами Контроллера на панели инструментов. +vivecraft.messages.controls.3=§6Steam должен быть запущен §oперед§r§6 SteamVR, иначе бинды не сохранятся. +vivecraft.messages.serverplugin=Vivecraft обнаружил серверный мод: %s +vivecraft.messages.noserverplugin=Vivecraft не обнаружен. Этот сервер может не поддерживать телепортацию. Включен режим ограниченного передвижения (возврат к свободному перемещению). +vivecraft.messages.calibrateheight=Пожалуйста, откаллибруйте высоту в меню паузы. +vivecraft.messages.rendersetupfailed=Ошибка рендера: %s +vivecraft.messages.intelgraphics=Интегрированная графика Intel не поддерживается. Если это ноутбук, пожалуйста, установите высокопроизводительный GPU. Найденное GPU: %s +vivecraft.messages.menuworldexportcomplete.1=Экспорт завершен... размер области: %d +vivecraft.messages.menuworldexportcomplete.2=Сохранено в %s +vivecraft.messages.menuworldexportclientwarning=ВНИМАНИЕ: Сохранение мира с помощью клиентского мира может быть неполным, что приведет к утрате мира. +vivecraft.messages.teleportdisabled=Ограниченное движение включено (без телепорта) +vivecraft.messages.teleportenabled=Ограниченное движение выключено (с телепортом) +vivecraft.messages.walkupblocks=Взобраться по блокам (RCTRL+B): %s +vivecraft.messages.showaim=Показать цель (RCTRL+RSHIFT): включено +vivecraft.messages.playerinertia=Инерция движения игрока (LCTRL+I): %s +vivecraft.messages.movementmodeswitch=Режим движения переключен на: %s +vivecraft.messages.coords=X: %.2f Y: %.2f Z: %.2f +vivecraft.messages.angles=Наклон: %.1f Отклонение: %.1f Ролл: %.1f +vivecraft.messages.heightset=Высота пользователя установлена на %d%% diff --git a/resources/assets/vivecraft/lang/zh_cn.lang b/resources/assets/vivecraft/lang/zh_cn.lang index f443807..c8ab7fc 100644 --- a/resources/assets/vivecraft/lang/zh_cn.lang +++ b/resources/assets/vivecraft/lang/zh_cn.lang @@ -24,6 +24,7 @@ vivecraft.key.swapMirrorView=切换桌面镜像 vivecraft.key.toggleKeyboard=显示/隐藏虚拟键盘 vivecraft.key.moveThirdPersonCam=移动第三人称摄像机 vivecraft.key.togglePlayerList=切换显示玩家列表 +vivecraft.key.toggleHandheldCam=切换摄像机 vivecraft.key.trackpadTouch=触摸触控板 vivecraft.key.vrInteract=情景交互 vivecraft.key.guiLeftClick=左键点击 @@ -115,7 +116,7 @@ vivecraft.options.MIXED_REALITY_RENDER_HANDS=显示双手 vivecraft.options.MIXED_REALITY_UNITY_LIKE=布局 vivecraft.options.MIXED_REALITY_UNDISTORTED=不失真渲染(无形变) vivecraft.options.MIXED_REALITY_ALPHA_MASK=透明度遮罩 -vivecraft.options.MIXED_REALITY_FOV=视野(相机) +vivecraft.options.MIXED_REALITY_FOV=第三人称视野 vivecraft.options.WALK_UP_BLOCKS=自动上方块 vivecraft.options.MOVEMENT_MULTIPLIER=移动速度倍率 vivecraft.options.INERTIA_FACTOR=玩家惯性 @@ -168,19 +169,21 @@ vivecraft.options.HRTF_SELECTION=3D环绕音效(头部相关传递函数) vivecraft.options.RELOAD_EXTERNAL_CAMERA=重载外部摄像机 vivecraft.options.RIGHT_CLICK_DELAY=重复右键点击 vivecraft.options.ANIMAL_TOUCHING=动物触摸识别 +vivecraft.options.HANDHELD_CAMERA_FOV=视野(相机) +vivecraft.options.HANDHELD_CAMERA_RENDER_SCALE=摄像机解析度 # Option tooltips vivecraft.options.HUD_SCALE.tooltip=视野内状态栏(HUD)占据的相对大小。\n是相对单位,不是具体大小也不会影响FOV或者其它什么。 vivecraft.options.HUD_DISTANCE.tooltip=悬浮的状态栏(HUD)与玩家身体之间的距离。\nHUD的相对大小不会被这个设置所改变。\n以现实中的米(m)为单位(而不是以一个方块为单位)\n[PS:在Vivecraft中,默认一个方块为1米,\n而Java版客户端可以通过改变视角调整观感。] -vivecraft.options.HUD_LOCK_TO.tooltip=(HUD:状态栏,包括物品栏和生命值等内容)\n指定HUD的锁定位置!\n 手柄上方:HUD会出现在你的副手(默认左手)上方。\n 头部:HUD会出现并锁定在你的头显视野中!\n 手臂(推荐):HUD被设置在你的副手手腕内侧。\n [转动你的手腕!当你看向它时它便会出现!] +vivecraft.options.HUD_LOCK_TO.tooltip=(HUD:状态栏,包括物品栏和生命值等内容)\n指定HUD的锁定位置!\n手柄上方:HUD会出现在你的副手(默认左手)上方。\n头部:HUD会出现并锁定在你的头显视野中!\n手臂(推荐):HUD被设置在你的副手手腕内侧。\n[转动你的手腕!当你看向它时它便会出现!] vivecraft.options.HUD_OPACITY.tooltip=调整状态栏(HUD)和用户界面(UI)在游戏内的透明度\n【0.15透明←[]→完全不透明(默认)】 -vivecraft.options.RENDER_MENU_BACKGROUND.tooltip=设置游戏内呼出的菜单(GUI)是否有一个半透明的背景\n 开:呼出的菜单会带有按钮和半透明的背景\n 关:呼出游戏内菜单时,只会出现按钮(推荐) +vivecraft.options.RENDER_MENU_BACKGROUND.tooltip=设置游戏内呼出的菜单(GUI)是否有一个半透明的背景\n开:呼出的菜单会带有按钮和半透明的背景\n关:呼出游戏内菜单时,只会出现按钮(推荐) -vivecraft.options.HUD_OCCLUSION.tooltip=设置状态栏(HUD)是否会被遮挡。\n 开(默认):HUD会被游戏内的物体方块所遮挡,乃至完全隐藏。\n 关:HUD不会被游戏内的物体方块所遮挡。 +vivecraft.options.HUD_OCCLUSION.tooltip=设置状态栏(HUD)是否会被遮挡。\n开(默认):HUD会被游戏内的物体方块所遮挡,乃至完全隐藏。\n关:HUD不会被游戏内的物体方块所遮挡。 vivecraft.options.MENU_ALWAYS_FOLLOW_FACE.tooltip=设定主菜单是否会跟随着你的视线而转动!\n就座:仅在就座游玩时,启用该功能。\n总是:主菜单总是会跟随你的视线转动! @@ -188,21 +191,21 @@ vivecraft.options.CROSSHAIR_SCALE.tooltip=设定游戏内十字指针的大小 vivecraft.options.MENU_CROSSHAIR_SCALE.tooltip=设置菜单页面中十字指针的大小。 -vivecraft.options.RENDER_CROSSHAIR_MODE.tooltip=设置游戏内指针的显示方式:\n 总是:指针永远会显示,就算HUD被关闭了也是这样!\n 仅启用状态栏时:指针只会在启用了HUD时显示\n 从不:从不显示指针 +vivecraft.options.RENDER_CROSSHAIR_MODE.tooltip=设置游戏内指针的显示方式:\n总是:指针永远会显示,就算HUD被关闭了也是这样!\n仅启用状态栏时:指针只会在启用了HUD时显示\n从不:从不显示指针 -vivecraft.options.CHAT_NOTIFICATIONS.tooltip=设置当你收到一条聊天信息是将会发生什么【慎用】\n 无:什么都不会发生~(欸嘿~)\n 震动:你的手柄会通过震动提示你\n 声音:收到消息时会播放信息提示音\n 全部:不仅手柄会震动,你还会听到提示音 +vivecraft.options.CHAT_NOTIFICATIONS.tooltip=设置当你收到一条聊天信息是将会发生什么【慎用】\n无:什么都不会发生~(欸嘿~)\n震动:你的手柄会通过震动提示你\n声音:收到消息时会播放信息提示音\n全部:不仅手柄会震动,你还会听到提示音 vivecraft.options.CHAT_NOTIFICATION_SOUND.tooltip=设置聊天信息提示音 -vivecraft.options.CROSSHAIR_SCALES_WITH_DISTANCE.tooltip=这个设置决定着指针是否会因为距离而放大缩小。\n 开:你视野中的指针将会一直保持同一个大小。\n 关:你视野中的指针大小将会受到距离的影响而变大缩小。 +vivecraft.options.CROSSHAIR_SCALES_WITH_DISTANCE.tooltip=这个设置决定着指针是否会因为距离而放大缩小。\n开:你视野中的指针将会一直保持同一个大小。\n关:你视野中的指针大小将会受到距离的影响而变大缩小。 -vivecraft.options.RENDER_BLOCK_OUTLINE_MODE.tooltip=设置当你指向一个方块时,方块边缘的显示方式:\n 总是:方块边缘永远会加黑加粗显示,就算HUD被关闭了也是这样!\n 仅启用状态栏时:方块边缘会加黑加粗只会在启用了HUD时显示\n 从不:方块边缘从不加黑加粗显示 +vivecraft.options.RENDER_BLOCK_OUTLINE_MODE.tooltip=设置当你指向一个方块时,方块边缘的显示方式:\n总是:方块边缘永远会加黑加粗显示,就算HUD被关闭了也是这样!\n仅启用状态栏时:方块边缘会加黑加粗只会在启用了HUD时显示\n从不:方块边缘从不加黑加粗显示 vivecraft.options.AUTO_OPEN_KEYBOARD.tooltip=如果禁用该选项,则只有你单击聊天栏中的文字部分、或一直注视着一段文字时,才会呼出键盘。\n如果启用该选项,则每当你注视一段文字时,都会自动呼出键盘。\n【在安装了部分MOD的情况下,启用该选项可能会造成键盘的误呼出】 -vivecraft.options.RADIAL_MODE_HOLD.tooltip=选择扇形菜单的使用方法:\n 按住:按住扇形菜单按钮时显示扇形按钮菜单;呼出菜单期间把指针移动到选项上并松开按钮来做出选择。\n 单击:按下扇形菜单按钮呼出菜单,再按一次隐藏;把指针移动到选项上,扣动扳机进行选择。 +vivecraft.options.RADIAL_MODE_HOLD.tooltip=选择扇形菜单的使用方法:\n按住:按住扇形菜单按钮时显示扇形按钮菜单;呼出菜单期间把指针移动到选项上并松开按钮来做出选择。\n单击:按下扇形菜单按钮呼出菜单,再按一次隐藏;把指针移动到选项上,扣动扳机进行选择。 -vivecraft.options.PHYSICAL_KEYBOARD.tooltip=选择哪一种VR键盘来打字:\n 物理碰撞键盘:呼出键盘时,双手会变成亮♂棒♂棒,用他们去戳戳戳、并享受带感的音效吧!【推荐】\n 指针键盘:将你的手柄指向键盘上的按键,按动扳机就可以输入字符了! +vivecraft.options.PHYSICAL_KEYBOARD.tooltip=选择哪一种VR键盘来打字:\n物理碰撞键盘:呼出键盘时,双手会变成亮♂棒♂棒,用他们去戳戳戳、并享受带感的音效吧!【推荐】\n指针键盘:将你的手柄指向键盘上的按键,按动扳机就可以输入字符了! vivecraft.options.PHYSICAL_KEYBOARD_SCALE.tooltip=设置物理碰撞键盘的大小,这个数值将改变它的基础大小。 @@ -226,7 +229,7 @@ vivecraft.options.MIXED_REALITY_ALPHA_MASK.tooltip=在Unity布局中:\n如果 vivecraft.options.MIXED_REALITY_FOV.tooltip=在MR混合现实模式中使用的视野角度(FOV) -vivecraft.options.WALK_UP_BLOCKS.tooltip=这个选项允许你设置角色不用跳就能上一格高的方块的能力。\n[快捷键:右侧Ctrl+B]\n§c警告!可能会触发多人服务器中的防作弊系统!\n 关:(默认)你需要跳跃来登上一格高的方块\n 开:你不用跳,只要行走就能上到一格高的方块。也许可以减轻一些自由移动模式带来的晕眩 +vivecraft.options.WALK_UP_BLOCKS.tooltip=这个选项允许你设置角色不用跳就能上一格高的方块的能力。\n[快捷键:右侧Ctrl+B]\n§c警告!可能会触发多人服务器中的防作弊系统!\n关:(默认)你需要跳跃来登上一格高的方块\n开:你不用跳,只要行走就能上到一格高的方块。也许可以减轻一些自由移动模式带来的晕眩 vivecraft.options.MOVEMENT_MULTIPLIER.tooltip=调整这个数值,可以让你比默认设置移动地慢一些。这也许可以帮助你减轻一些自由移动模式带来的晕眩感。\n§c警告!改变这个设置可能会触发多人服务器防作弊程序!\n默认设置为Minecraft标准移动速度(1.0) @@ -240,7 +243,7 @@ vivecraft.options.ALLOW_CRAWLING.tooltip=如果启用这个功能,玩家将可 vivecraft.options.LIMIT_TELEPORT.tooltip=如果启用该设置,传送移动在生存模式中将会受到限制。你不能使用传送从你站立的方块边缘传送到你头顶的方块上;传送移动也会消耗食物;传送移动将会内置一个隐藏的、随时间回复的能量条,能量越多,可以传送的距离越远。 -vivecraft.options.REVERSE_HANDS.tooltip=切换主手(默认主手为右手)\n 开:左手为主手\n 关:右手为主手\n\n切换主手后,重启游戏以应用双手键位的互换;同时请确认你在SteamVR中选择了默认键位设置(default bindings) +vivecraft.options.REVERSE_HANDS.tooltip=切换主手(默认主手为右手)\n开:左手为主手\n关:右手为主手\n\n切换主手后,重启游戏以应用双手键位的互换;同时请确认你在SteamVR中选择了默认键位设置(default bindings) vivecraft.options.STENCIL_ON.tooltip=【屏幕黑边】\n开启后在频幕上显示镜片黑边,遮盖头显镜片外视野范围外的区域。\n可以略微增加帧数。 @@ -274,7 +277,7 @@ vivecraft.options.REALISTIC_ROW.tooltip=让我们荡起双桨~小船儿——— vivecraft.options.WALK_MULTIPLIER.tooltip=倍乘你现实中一步走出去后,在游戏中移动的距离;\n让你可以在不动用移动按键的前提下走得更远一些;\n但是可能会导致晕眩\n【不建议更改】 -vivecraft.options.FREEMOVE_MODE.tooltip=自由移动模式下人物移动的方向。\n\n 控制器:副手(默认左手)手柄前端指向的方向【推荐】\n 头显:你的VR头显看向的方向\n 原地摆臂移动:转向取决于你的VR手柄(控制器)是怎么甩的,向上向下取决于你的头显。\n [Run-In-Place: Yaw is based on how controllers are swinging. Pitch is your Headset.]\n 房间:转向取决于你的VR游玩空间。向上向下取决于你的头显。这个设置最适合那些无法追踪到背后、或者只有180度视野的人(比如不想转身的站立模式玩家)\n [Room: Yaw is relative to your VR room forward. Pitch is your Headset. This mode is best only for 180 setups.] +vivecraft.options.FREEMOVE_MODE.tooltip=自由移动模式下人物移动的方向。\n\n控制器:副手(默认左手)手柄前端指向的方向【推荐】\n头显:你的VR头显看向的方向\n 原地摆臂移动:转向取决于你的VR手柄(控制器)是怎么甩的,向上向下取决于你的头显。\n[Run-In-Place: Yaw is based on how controllers are swinging. Pitch is your Headset.]\n房间:转向取决于你的VR游玩空间。向上向下取决于你的头显。这个设置最适合那些无法追踪到背后、或者只有180度视野的人(比如不想转身的站立模式玩家)\n[Room: Yaw is relative to your VR room forward. Pitch is your Headset. This mode is best only for 180 setups.] vivecraft.options.VEHICLE_ROTATION.tooltip=在载具(如船和矿车)中,玩家视角会随着载具旋转而旋转。\n别玩太狠了,这个可能会使人失去方向感 @@ -304,7 +307,7 @@ vivecraft.options.AUTO_SPRINT.tooltip=使用自由移动模式时,摇杆角度 vivecraft.options.AUTO_SPRINT_THRESHOLD.tooltip=设置激活自动冲刺的摇杆角度阈值\n超过即激发\n\nThe axis threshold at which auto-sprint activates. -vivecraft.options.BOW_MODE.tooltip=你可以设置在什么情况下进行射箭的动作识别\n 关:从不。(我就是要做按键英雄!)\n 原版:仅在使用原版弓(Bow)时使用射箭动作识别;不识别MOD道具。\n 开:对所有使用"弓(BOW)"动作的物品都启用射箭动作识别。\n【请注意该设置最好只用于那些有可交互拉弓射击动作的弓类武器】\n【虽然可以上膛,但弩和枪械(+MOD)没有弓(BOW)那样的可交互射击动作】 +vivecraft.options.BOW_MODE.tooltip=你可以设置在什么情况下进行射箭的动作识别\n关:从不。(我就是要做按键英雄!)\n原版:仅在使用原版弓(Bow)时使用射箭动作识别;不识别MOD道具。\n开:对所有使用"弓(BOW)"动作的物品都启用射箭动作识别。\n【请注意该设置最好只用于那些有可交互拉弓射击动作的弓类武器】\n【虽然可以上膛,但弩和枪械(+MOD)没有弓(BOW)那样的可交互射击动作】 vivecraft.options.TELEPORT_DOWN_LIMIT.tooltip=限制你每次传送能把你送往多低的地方\n以方块(blocks)为单位 @@ -314,7 +317,7 @@ vivecraft.options.TELEPORT_HORIZ_LIMIT.tooltip=限制你传送的距离\n以方 vivecraft.options.ALLOW_STANDING_ORIGIN_OFFSET.tooltip=允许玩家在”站立游玩模式“下使用”复位“按钮。\n这个选项通常是给那些在站立模式下游玩,却又想坐搬个椅子坐着的玩家。\n(-说到底就是条懒狗……-懒狗怎么了?看不起懒狗啊?) -vivecraft.options.SEATED_FREE_MOVE.tooltip=选择在就座游玩模式中,你想使用的移动方式\n\n 传送移动:按下→松开!使用WASD四键中任意一个键即可进行传送移动!键盘上的”←“”→“方向键可以控制人物视角向左向右旋转!\n 自由移动:操作方法与JAVA版Minecraft客户端相同。 +vivecraft.options.SEATED_FREE_MOVE.tooltip=选择在就座游玩模式中,你想使用的移动方式\n\n传送移动:按下→松开!使用WASD四键中任意一个键即可进行传送移动!键盘上的”←“”→“方向键可以控制人物视角向左向右旋转!\n自由移动:操作方法与JAVA版Minecraft客户端相同。 vivecraft.options.FORCE_STANDING_FREE_MOVE.tooltip=强制使用备用的自由移动模式绑定按键(默认启用按键为左扳机)。\n如果想使用更多的移动选项,请在SteamVR设置中”控制器“栏目的”管理控制器按键设置“中进行编辑。\n\n请注意,启用这项设置将禁用传送模式中绑定的触发按键。 @@ -322,7 +325,7 @@ vivecraft.options.ALLOW_ADVANCED_BINDINGS.tooltip=显示可以通过SteamVR绑 vivecraft.options.MENU_WORLD_SELECTION.tooltip=选择想要作为主菜单背景显示出来的世界!\n如果系统没有找到任何自订世界的话,会强制使用官方世界。 -vivecraft.options.HRTF_SELECTION.tooltip=【HRTF=Head Related Transfer Function (3D Audio)】\n选择你想使用的HRTF配置文件。HRTF技术可以允许你聆听3D空间音效。\n声音质量可能会因为设备和驱动而产生差别。\n 关:完全禁用HRTF\n 默认:使用默认的HRTF配置文件\n 其它:使用某个特殊的HRTF配置文件 +vivecraft.options.HRTF_SELECTION.tooltip=【HRTF=Head Related Transfer Function (3D Audio)】\n选择你想使用的HRTF配置文件。HRTF技术可以允许你聆听3D空间音效。\n声音质量可能会因为设备和驱动而产生差别。\n关:完全禁用HRTF\n默认:使用默认的HRTF配置文件\n其它:使用某个特殊的HRTF配置文件 vivecraft.options.RELOAD_EXTERNAL_CAMERA.tooltip=读取ExternalCamera.cfg文件并重新载入相机配置 @@ -330,6 +333,10 @@ vivecraft.options.RIGHT_CLICK_DELAY.tooltip=按住扳机时,作右键连击判 vivecraft.options.ANIMAL_TOUCHING.tooltip=如果开启了这个设置,在你手上未持有武器时,触碰一只被动(passive)的生物(mob)的动作将会判定为鼠标右键(使用物品),而不是鼠标左键(攻击)。\n——妈妈再也不用担心我一巴掌掴死半个农场的动物了(草) +vivecraft.options.HANDHELD_CAMERA_FOV.tooltip=手持摄像机视野 + +vivecraft.options.HANDHELD_CAMERA_RENDER_SCALE.tooltip=设定手持摄像机的解析度,越大的设置会导致更大的图片大小。\n当光影启用时不可使用。\n§c警告:过高的设置可能会烧坏你的显卡! + # Option values vivecraft.options.gamma.cantseeshitcaptain=黑不拉几 vivecraft.options.yes=是 diff --git a/resources/assets/vivecraft/models/camera.json b/resources/assets/vivecraft/models/camera.json new file mode 100644 index 0000000..e99d28c --- /dev/null +++ b/resources/assets/vivecraft/models/camera.json @@ -0,0 +1,119 @@ +{ + "credit": "Made with Blockbench", + "ambientocclusion": false, + "texture_size": [64, 64], + "textures": { + "0": "vivecraft:blocks/camera", + "particle": "vivecraft:transparent" + }, + "elements": [ + { + "from": [5, 1, 4], + "to": [11, 7, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 9, 12]}, + "faces": { + "north": {"uv": [6, 6, 7.5, 7.5], "texture": "#0"}, + "east": {"uv": [5.5, 6, 6, 7.5], "texture": "#0"}, + "west": {"uv": [7.5, 6, 8, 7.5], "texture": "#0"}, + "up": {"uv": [7.5, 6, 6, 5.5], "texture": "#0"}, + "down": {"uv": [9, 5.5, 7.5, 6], "texture": "#0"} + } + }, + { + "from": [1.9, 0, 5.9], + "to": [14.1, 1, 10.1], + "rotation": {"angle": 0, "axis": "y", "origin": [15, 8, 14]}, + "faces": { + "north": {"uv": [1, 4.75, 4, 5], "texture": "#0"}, + "east": {"uv": [0, 4.75, 1, 5], "texture": "#0"}, + "south": {"uv": [5, 4.75, 8, 5], "texture": "#0"}, + "west": {"uv": [4, 4.75, 5, 5], "texture": "#0"}, + "up": {"uv": [4, 4.75, 1, 3.75], "texture": "#0"}, + "down": {"uv": [7, 3.75, 4, 4.75], "texture": "#0", "cullface": "down"} + } + }, + { + "from": [1.9, 7, 5.9], + "to": [14.1, 8, 10.1], + "rotation": {"angle": 0, "axis": "y", "origin": [15, 15, 14]}, + "faces": { + "north": {"uv": [1, 3.5, 4, 3.75], "texture": "#0"}, + "east": {"uv": [0, 3.5, 1, 3.75], "texture": "#0"}, + "south": {"uv": [5, 3.5, 8, 3.75], "texture": "#0"}, + "west": {"uv": [4, 3.5, 5, 3.75], "texture": "#0"}, + "up": {"uv": [4, 3.5, 1, 2.5], "texture": "#0"}, + "down": {"uv": [7, 2.5, 4, 3.5], "texture": "#0"} + } + }, + { + "from": [2.9, 8, 6.9], + "to": [5.1, 9, 9.1], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 16, 14]}, + "faces": { + "north": {"uv": [0.5, 6.75, 1, 7], "texture": "#0"}, + "east": {"uv": [0, 6.75, 0.5, 7], "texture": "#0"}, + "south": {"uv": [1.5, 6.75, 2, 7], "texture": "#0"}, + "west": {"uv": [1, 6.75, 1.5, 7], "texture": "#0"}, + "up": {"uv": [1, 6.75, 0.5, 6.25], "texture": "#0"} + } + }, + { + "from": [2, 1, 6], + "to": [14, 7, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 9, 16]}, + "faces": { + "north": {"uv": [1, 1, 4, 2.5], "texture": "#0"}, + "east": {"uv": [0, 1, 1, 2.5], "texture": "#0"}, + "south": {"uv": [5, 1, 8, 2.5], "texture": "#0"}, + "west": {"uv": [4, 1, 5, 2.5], "texture": "#0"} + } + }, + { + "from": [3.533, 1.6, 10], + "to": [3.733, 6.4, 10.3], + "rotation": {"angle": 0, "axis": "y", "origin": [15.133, 9, 20]}, + "faces": { + "south": {"uv": [2.75, 5, 2.875, 6.25], "texture": "#0"}, + "west": {"uv": [2.625, 5, 2.75, 6.25], "texture": "#0"} + } + }, + { + "from": [12.266, 1.6, 10], + "to": [12.466, 6.4, 10.3], + "rotation": {"angle": 0, "axis": "y", "origin": [12.866, 8.8, 20]}, + "faces": { + "east": {"uv": [0, 5, 0.125, 6.25], "texture": "#0"}, + "south": {"uv": [5.375, 5, 5.5, 6.25], "texture": "#0"} + } + }, + { + "from": [3.533, 6.4, 10], + "to": [12.466, 6.6, 10.3], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 9, 20]}, + "faces": { + "east": {"uv": [0, 5, 0.125, 6.25], "texture": "#0"}, + "south": {"uv": [2.75, 5, 5.5, 5.125], "texture": "#0"}, + "west": {"uv": [2.625, 5, 2.75, 6.25], "texture": "#0"}, + "up": {"uv": [2.75, 5, 0, 5.125], "texture": "#0"} + } + }, + { + "from": [3.533, 1.4, 10], + "to": [12.466, 1.6, 10.3], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 9, 20]}, + "faces": { + "east": {"uv": [0, 5, 0.125, 6.25], "texture": "#0"}, + "south": {"uv": [2.75, 6.125, 5.5, 6.25], "texture": "#0"}, + "west": {"uv": [2.625, 5, 2.75, 6.25], "texture": "#0"}, + "down": {"uv": [5.5, 5, 2.75, 5.125], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "camera", + "origin": [14, 9, 20], + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8] + } + ] +} \ No newline at end of file diff --git a/resources/assets/vivecraft/models/camera_display.json b/resources/assets/vivecraft/models/camera_display.json new file mode 100644 index 0000000..f85de91 --- /dev/null +++ b/resources/assets/vivecraft/models/camera_display.json @@ -0,0 +1,26 @@ +{ + "credit": "Made with Blockbench", + "ambientocclusion": false, + "texture_size": [64, 64], + "textures": { + "1": "vivecraft:transparent", + "particle": "vivecraft:transparent" + }, + "elements": [ + { + "from": [3.733, 1.6, 10], + "to": [12.266, 6.4, 10.3], + "rotation": {"angle": 0, "axis": "y", "origin": [14.2, 9.2, 20]}, + "faces": { + "south": {"uv": [0, 0, 16, 16], "texture": "#1"} + } + } + ], + "groups": [ + { + "name": "camera", + "origin": [14, 9, 20], + "children": [0] + } + ] +} \ No newline at end of file diff --git a/resources/assets/vivecraft/textures/black.png b/resources/assets/vivecraft/textures/black.png new file mode 100644 index 0000000..7123777 Binary files /dev/null and b/resources/assets/vivecraft/textures/black.png differ diff --git a/resources/assets/vivecraft/textures/blocks/camcorder.png b/resources/assets/vivecraft/textures/blocks/camcorder.png index 26d7e2f..c95f66c 100644 Binary files a/resources/assets/vivecraft/textures/blocks/camcorder.png and b/resources/assets/vivecraft/textures/blocks/camcorder.png differ diff --git a/resources/assets/vivecraft/textures/blocks/camera.png b/resources/assets/vivecraft/textures/blocks/camera.png new file mode 100644 index 0000000..3d46a63 Binary files /dev/null and b/resources/assets/vivecraft/textures/blocks/camera.png differ diff --git a/resources/assets/vivecraft/textures/transparent.png b/resources/assets/vivecraft/textures/transparent.png index cbfd9a3..07ccff7 100644 Binary files a/resources/assets/vivecraft/textures/transparent.png and b/resources/assets/vivecraft/textures/transparent.png differ diff --git a/src/org/vivecraft/api/VRData.java b/src/org/vivecraft/api/VRData.java index 6bbdb73..8f64409 100644 --- a/src/org/vivecraft/api/VRData.java +++ b/src/org/vivecraft/api/VRData.java @@ -4,6 +4,7 @@ import org.vivecraft.render.RenderPass; import org.vivecraft.settings.VRSettings; import org.vivecraft.utils.Utils; +import org.vivecraft.utils.math.Axis; import org.vivecraft.utils.math.Matrix4f; import org.vivecraft.utils.math.Vector3; @@ -78,6 +79,7 @@ public String toString() { public VRDevicePose h1; public VRDevicePose t0; public VRDevicePose t1; + public VRDevicePose cam; public Vector3d origin; public float rotation_radians; @@ -108,6 +110,9 @@ public VRData(Vector3d origin, float walkMul,float worldScale, float rotation) { t0 = new VRDevicePose(this, s1, MCOpenVR.getAimSource(0).subtract(hmd_raw).add(scaledPos), s1.transform(Vector3.forward()).toVector3d()); t1 = new VRDevicePose(this, s2, MCOpenVR.getAimSource(1).subtract(hmd_raw).add(scaledPos), s2.transform(Vector3.forward()).toVector3d()); + Matrix4f camRot = Matrix4f.multiply(Matrix4f.rotationY(-rotation), new Matrix4f(Minecraft.getInstance().cameraTracker.getRotation()).transposed()); + cam = new VRDevicePose(this, camRot, Minecraft.getInstance().cameraTracker.getPosition().subtract(origin).rotateYaw(-rotation).subtract(hmd_raw).add(scaledPos), camRot.transform(Vector3.forward()).toVector3d()); + if (MCOpenVR.mrMovingCamActive) c2 = new VRDevicePose(this, MCOpenVR.getAimRotation(2),MCOpenVR.getAimSource(2).subtract(hmd_raw).add(scaledPos), MCOpenVR.getAimVector(2)); else { @@ -188,6 +193,8 @@ public VRDevicePose getEye(RenderPass pass){ return t0; case SCOPEL: return t1; + case CAMERA: + return cam; } return hmd; diff --git a/src/org/vivecraft/gameplay/trackers/CameraTracker.java b/src/org/vivecraft/gameplay/trackers/CameraTracker.java new file mode 100644 index 0000000..abca05b --- /dev/null +++ b/src/org/vivecraft/gameplay/trackers/CameraTracker.java @@ -0,0 +1,117 @@ +package org.vivecraft.gameplay.trackers; + +import org.vivecraft.api.VRData; +import org.vivecraft.render.RenderPass; +import org.vivecraft.utils.Utils; +import org.vivecraft.utils.math.Axis; +import org.vivecraft.utils.math.Matrix4f; +import org.vivecraft.utils.math.Quaternion; +import org.vivecraft.utils.math.Vector3; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.player.ClientPlayerEntity; +import net.minecraft.client.renderer.model.ModelResourceLocation; +import net.minecraft.util.math.vector.Vector3d; + +public class CameraTracker extends Tracker { + public static final ModelResourceLocation cameraModel = new ModelResourceLocation("vivecraft:camera"); + public static final ModelResourceLocation cameraDisplayModel = new ModelResourceLocation("vivecraft:camera_display"); + + private boolean visible = false; + private Vector3d position = new Vector3d(0, 0, 0); + private Quaternion rotation = new Quaternion(); + + private int startController; + private VRData.VRDevicePose startControllerPose; + private Vector3d startPosition; + private Quaternion startRotation; + + public CameraTracker(Minecraft mc) { + super(mc); + } + + @Override + public boolean isActive(ClientPlayerEntity player) { + if (mc.playerController == null) + return false; + if (mc.vrSettings.seated) + return false; + if (!isVisible()) + return false; + return true; + } + + @Override + public void doProcess(ClientPlayerEntity player) { + if (startControllerPose != null) { + VRData.VRDevicePose controllerPose = mc.vrPlayer.vrdata_world_render.getController(startController); + Vector3d startPos = startControllerPose.getPosition(); + Vector3d deltaPos = controllerPose.getPosition().subtract(startPos); + + Matrix4f deltaMatrix = Matrix4f.multiply(controllerPose.getMatrix(), startControllerPose.getMatrix().inverted()); + Vector3 offset = new Vector3((float)startPosition.x - (float)startPos.x, (float)startPosition.y - (float)startPos.y, (float)startPosition.z - (float)startPos.z); + Vector3 offsetRotated = deltaMatrix.transform(offset); + + position = new Vector3d(startPosition.x + (float)deltaPos.x + (offsetRotated.getX() - offset.getX()), startPosition.y + (float)deltaPos.y + (offsetRotated.getY() - offset.getY()), startPosition.z + (float)deltaPos.z + (offsetRotated.getZ() - offset.getZ())); + rotation = startRotation.multiply(new Quaternion(Utils.convertOVRMatrix(deltaMatrix))); + } + + // chunk renderer gets angry if we're really far away, force hide when >3/4 render distance + if (mc.vrPlayer.vrdata_world_render.getEye(RenderPass.CENTER).getPosition().distanceTo(position) > mc.gameSettings.renderDistanceChunks * 12) + visible = false; + } + + @Override + public void reset(ClientPlayerEntity player) { + visible = false; + stopMoving(); + } + + @Override + public EntryPoint getEntryPoint() { + return EntryPoint.SPECIAL_ITEMS; // smoother camera movement + } + + public boolean isVisible() { + return visible; + } + + public void toggleVisibility() { + visible = !visible; + } + + public Vector3d getPosition() { + return position; + } + + public void setPosition(Vector3d position) { + this.position = position; + } + + public Quaternion getRotation() { + return rotation; + } + + public void setRotation(Quaternion rotation) { + this.rotation = rotation; + } + + public boolean isMoving() { + return startControllerPose != null; + } + + public int getMovingController() { + return startController; + } + + public void startMoving(int controller) { + startController = controller; + startControllerPose = mc.vrPlayer.vrdata_world_pre.getController(controller); + startPosition = position; + startRotation = rotation.copy(); + } + + public void stopMoving() { + startControllerPose = null; + } +} diff --git a/src/org/vivecraft/gameplay/trackers/InteractTracker.java b/src/org/vivecraft/gameplay/trackers/InteractTracker.java index ba02b35..04cc267 100644 --- a/src/org/vivecraft/gameplay/trackers/InteractTracker.java +++ b/src/org/vivecraft/gameplay/trackers/InteractTracker.java @@ -12,6 +12,7 @@ import org.vivecraft.render.VRFirstPersonArmSwing; import org.vivecraft.settings.VRHotkeys; import org.vivecraft.settings.VRSettings; +import org.vivecraft.utils.math.Quaternion; import net.minecraft.block.AbstractBlock; import net.minecraft.block.Block; @@ -68,6 +69,7 @@ public boolean isActive(ClientPlayerEntity p){ Entity[] inEntity = new Entity[2]; private EntityRayTraceResult[] inEntityHit = new EntityRayTraceResult[2]; private boolean[] inCamera = new boolean[2]; + private boolean[] inHandheldCamera = new boolean[2]; boolean[] active = new boolean[2]; boolean[] wasactive = new boolean[2]; @@ -81,11 +83,14 @@ public void reset(ClientPlayerEntity player) { private void reset(ClientPlayerEntity player, int c) { if (inCamera[c] && VRHotkeys.isMovingThirdPersonCam() && VRHotkeys.getMovingThirdPersonCamTriggerer() == VRHotkeys.Triggerer.INTERACTION && VRHotkeys.getMovingThirdPersonCamController() == c) VRHotkeys.stopMovingThirdPersonCam(); + if (inHandheldCamera[c] && mc.cameraTracker.isMoving() && mc.cameraTracker.getMovingController() == c) + mc.cameraTracker.stopMoving(); inBlockPos[c] = null; inBlockHit[c] = null; inEntity[c] = null; inEntityHit[c] = null; inCamera[c] = false; + inHandheldCamera[c] = false; active[c] = false; MCOpenVR.getInputAction(MCOpenVR.keyVRInteract).setEnabled(ControllerType.values()[c], false); } @@ -120,7 +125,7 @@ public void doProcess(ClientPlayerEntity player){ //on tick Vector3d forward = new Vector3d(0,0,-1); for(int c =0 ;c<2;c++){ - if (inCamera[c] && MCOpenVR.keyVRInteract.isKeyDown(ControllerType.values()[c])) + if ((inCamera[c] || inHandheldCamera[c]) && MCOpenVR.keyVRInteract.isKeyDown(ControllerType.values()[c])) continue; reset(player, c); @@ -149,6 +154,17 @@ public void doProcess(ClientPlayerEntity player){ //on tick } } + if (!active[c] && mc.cameraTracker.isVisible()) { + VRData.VRDevicePose camData = mc.vrPlayer.vrdata_world_pre.getEye(RenderPass.CAMERA); + Vector3d camPos = camData.getPosition(); + camPos = camPos.subtract(camData.getCustomVector(new Vector3d(0, 0, -1)).scale(0.08f)); + + if (handPos.distanceTo(camPos) < 0.11f) { + inHandheldCamera[c] = true; + active[c] = true; + } + } + if(!active[c]) { int bx = (int) MathHelper.floor(handPos.x); @@ -215,6 +231,10 @@ public boolean isInCamera() { return inCamera[0] || inCamera[1]; } + public boolean isInHandheldCamera() { + return inHandheldCamera[0] || inHandheldCamera[1]; + } + public void processBindings() { for(int c =0 ;c<2;c++){ if(MCOpenVR.keyVRInteract.isPressed(ControllerType.values()[c])) { @@ -235,6 +255,10 @@ else if (inCamera[c]) { VRHotkeys.startMovingThirdPersonCam(c, VRHotkeys.Triggerer.INTERACTION); success = true; } + else if (inHandheldCamera[c]) { + mc.cameraTracker.startMoving(c); + success = true; + } else if(inEntityHit[c]!=null) { success = true; if (!mc.playerController.interactWithEntity(mc.player, inEntity[c], inEntityHit[c], hand).isSuccessOrConsume()) diff --git a/src/org/vivecraft/gui/settings/GuiRenderOpticsSettings.java b/src/org/vivecraft/gui/settings/GuiRenderOpticsSettings.java index fda97d1..a918f25 100644 --- a/src/org/vivecraft/gui/settings/GuiRenderOpticsSettings.java +++ b/src/org/vivecraft/gui/settings/GuiRenderOpticsSettings.java @@ -15,6 +15,7 @@ import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.widget.Widget; +import net.optifine.Config; public class GuiRenderOpticsSettings extends GuiVROptionsBase { @@ -29,8 +30,10 @@ public class GuiRenderOpticsSettings extends GuiVROptionsBase VRSettings.VrOptions.MIRROR_DISPLAY, VRSettings.VrOptions.FSAA, VRSettings.VrOptions.STENCIL_ON, + VRSettings.VrOptions.HANDHELD_CAMERA_RENDER_SCALE, + VRSettings.VrOptions.HANDHELD_CAMERA_FOV, VRSettings.VrOptions.RELOAD_EXTERNAL_CAMERA, - VRSettings.VrOptions.MIRROR_EYE + VRSettings.VrOptions.MIRROR_EYE, }; static VRSettings.VrOptions[] MROptions = new VRSettings.VrOptions[] { @@ -52,11 +55,13 @@ public class GuiRenderOpticsSettings extends GuiVROptionsBase }; private float prevRenderScaleFactor; + private float prevHandCameraResScale; public GuiRenderOpticsSettings(Screen par1Screen) { super( par1Screen); prevRenderScaleFactor = settings.renderScaleFactor; + prevHandCameraResScale = settings.handCameraResScale; } @Override @@ -101,6 +106,12 @@ public void init() super.init(TUDOptions, false); } super.addDefaultButtons(); + + this.buttons.stream().filter(w -> w instanceof GuiVROptionButton).forEach(w -> { + GuiVROptionButton butt = (GuiVROptionButton)w; + if (butt.getOption() == VRSettings.VrOptions.HANDHELD_CAMERA_RENDER_SCALE && Config.isShaders()) + butt.active = false; + }); } @Override @@ -140,8 +151,9 @@ protected void actionPerformed(Widget widget) { @Override public boolean mouseReleased(double mouseX, double mouseY, int button) { // Hacky way of making the render scale slider only reinit on mouse release - if (settings.renderScaleFactor != prevRenderScaleFactor) { + if (settings.renderScaleFactor != prevRenderScaleFactor || settings.handCameraResScale != prevHandCameraResScale) { prevRenderScaleFactor = settings.renderScaleFactor; + prevHandCameraResScale = settings.handCameraResScale; this.minecraft.stereoProvider.reinitFrameBuffers("Render Setting Changed"); } diff --git a/src/org/vivecraft/provider/MCOpenVR.java b/src/org/vivecraft/provider/MCOpenVR.java index 1cb9b1f..ac1fe51 100644 --- a/src/org/vivecraft/provider/MCOpenVR.java +++ b/src/org/vivecraft/provider/MCOpenVR.java @@ -32,6 +32,8 @@ import net.optifine.reflect.Reflector; import org.apache.commons.lang3.ArrayUtils; import org.lwjgl.glfw.GLFW; + +import org.vivecraft.api.VRData; import org.vivecraft.api.Vec3History; import org.vivecraft.control.ControllerType; import org.vivecraft.control.HandedKeyBinding; @@ -295,6 +297,7 @@ public String getID() { public static final KeyBinding keyToggleKeyboard = new KeyBinding("vivecraft.key.toggleKeyboard", GLFW.GLFW_KEY_UNKNOWN, "key.categories.ui"); public static final KeyBinding keyMoveThirdPersonCam = new KeyBinding("vivecraft.key.moveThirdPersonCam", GLFW.GLFW_KEY_UNKNOWN, "key.categories.misc"); public static final KeyBinding keyTogglePlayerList = new KeyBinding("vivecraft.key.togglePlayerList", GLFW.GLFW_KEY_UNKNOWN, "key.categories.multiplayer"); + public static final KeyBinding keyToggleHandheldCam = new KeyBinding("vivecraft.key.toggleHandheldCam", GLFW.GLFW_KEY_UNKNOWN, "key.categories.misc"); public static final HandedKeyBinding keyTrackpadTouch = new HandedKeyBinding("vivecraft.key.trackpadTouch", GLFW.GLFW_KEY_UNKNOWN, "key.categories.misc"); // used for swipe sampler public static final HandedKeyBinding keyVRInteract = new HandedKeyBinding("vivecraft.key.vrInteract", GLFW.GLFW_KEY_UNKNOWN,"key.categories.gameplay"); public static final HandedKeyBinding keyClimbeyGrab = new HandedKeyBinding("vivecraft.key.climbeyGrab", GLFW.GLFW_KEY_UNKNOWN,"vivecraft.key.category.climbey"); @@ -489,6 +492,7 @@ public static Set getKeyBindings() { keyBindingSet.add(keyToggleKeyboard); keyBindingSet.add(keyMoveThirdPersonCam); keyBindingSet.add(keyTogglePlayerList); + keyBindingSet.add(keyToggleHandheldCam); keyBindingSet.add(keyTrackpadTouch); keyBindingSet.add(GuiHandler.keyLeftClick); keyBindingSet.add(GuiHandler.keyRightClick); @@ -649,6 +653,7 @@ private static Map getSpecialActionParams() { addActionParams(map, MCOpenVR.keySwapMirrorView, "optional", "boolean", VRInputActionSet.GLOBAL); addActionParams(map, MCOpenVR.keyToggleKeyboard, "optional", "boolean", VRInputActionSet.GLOBAL); addActionParams(map, MCOpenVR.keyMoveThirdPersonCam, "optional", "boolean", VRInputActionSet.GLOBAL); + addActionParams(map, MCOpenVR.keyToggleHandheldCam, "optional", "boolean", VRInputActionSet.GLOBAL); addActionParams(map, MCOpenVR.keyTrackpadTouch, "optional", "boolean", VRInputActionSet.TECHNICAL); addActionParams(map, MCOpenVR.keyVRInteract, "suggested", "boolean", VRInputActionSet.CONTEXTUAL); addActionParams(map, MCOpenVR.keyClimbeyGrab, "suggested", "boolean", null); @@ -1827,6 +1832,18 @@ public void run() { mc.ingameGUI.showPlayerList = !mc.ingameGUI.showPlayerList; } + if (keyToggleHandheldCam.isPressed() && mc.player != null) { + mc.cameraTracker.toggleVisibility(); + if (mc.cameraTracker.isVisible()) { + ControllerType hand = findActiveBindingControllerType(keyToggleHandheldCam); + if (hand == null) + hand = ControllerType.RIGHT; + VRData.VRDevicePose handPose = mc.vrPlayer.vrdata_world_pre.getController(hand.ordinal()); + mc.cameraTracker.setPosition(handPose.getPosition()); + mc.cameraTracker.setRotation(new Quaternion(handPose.getMatrix().transposed())); + } + } + GuiHandler.processBindingsGui(); RadialHandler.processBindings(); KeyboardHandler.processBindings(); @@ -2559,7 +2576,7 @@ private static void updateAim() { Vector3 controllerPos = OpenVRUtil.convertMatrix4ftoTranslationVector(controllerPoseTip[0]); aimSource[0] = controllerPos.toVector3d(); - controllerHistory[0].add(aimSource[0]); + controllerHistory[0].add(getAimSource(0)); // build matrix describing controller rotation controllerRotation[0].M[0][0] = controllerPoseTip[0].M[0][0]; @@ -2686,7 +2703,7 @@ private static void updateAim() { Vector3 leftControllerPos = OpenVRUtil.convertMatrix4ftoTranslationVector(controllerPoseTip[1]); aimSource[1] = leftControllerPos.toVector3d(); - controllerHistory[1].add(aimSource[1]); + controllerHistory[1].add(getAimSource(1)); // build matrix describing controller rotation controllerRotation[1].M[0][0] = controllerPoseTip[1].M[0][0]; diff --git a/src/org/vivecraft/provider/OpenVRStereoRenderer.java b/src/org/vivecraft/provider/OpenVRStereoRenderer.java index c0d69f9..cdaea45 100644 --- a/src/org/vivecraft/provider/OpenVRStereoRenderer.java +++ b/src/org/vivecraft/provider/OpenVRStereoRenderer.java @@ -12,6 +12,7 @@ import org.vivecraft.gameplay.screenhandlers.GuiHandler; import org.vivecraft.gameplay.screenhandlers.KeyboardHandler; import org.vivecraft.gameplay.screenhandlers.RadialHandler; +import org.vivecraft.gameplay.trackers.CameraTracker; import org.vivecraft.gameplay.trackers.TelescopeTracker; import org.vivecraft.render.RenderConfigException; import org.vivecraft.render.RenderPass; @@ -56,6 +57,8 @@ public class OpenVRStereoRenderer public Framebuffer framebufferUndistorted; public Framebuffer telescopeFramebufferR; public Framebuffer telescopeFramebufferL; + public Framebuffer cameraFramebuffer; + public Framebuffer cameraRenderFramebuffer; //intermediate fbs public Framebuffer fsaaFirstPassResultFBO; @@ -279,7 +282,7 @@ public boolean providesStencilMask() { } public float[] getStencilMask(RenderPass eye) { - if(hiddenMesheVertecies == null || eye == RenderPass.CENTER || eye == RenderPass.THIRD) return null; + if(hiddenMesheVertecies == null || (eye != RenderPass.LEFT && eye != RenderPass.RIGHT)) return null; return eye == RenderPass.LEFT ? hiddenMesheVertecies[0] : hiddenMesheVertecies[1]; } @@ -547,6 +550,10 @@ public void setupRenderConfiguration() throws Exception KeyboardHandler.Framebuffer.deleteFramebuffer(); KeyboardHandler.Framebuffer = null; } + if (RadialHandler.Framebuffer != null) { + RadialHandler.Framebuffer.deleteFramebuffer(); + RadialHandler.Framebuffer = null; + } if (telescopeFramebufferL != null) { telescopeFramebufferL.deleteFramebuffer(); telescopeFramebufferL = null; @@ -555,6 +562,14 @@ public void setupRenderConfiguration() throws Exception telescopeFramebufferR.deleteFramebuffer(); telescopeFramebufferR = null; } + if (cameraFramebuffer != null) { + cameraFramebuffer.deleteFramebuffer(); + cameraFramebuffer = null; + } + if (cameraRenderFramebuffer != null) { + cameraRenderFramebuffer.deleteFramebuffer(); + cameraRenderFramebuffer = null; + } //if (loadingScreen != null) { // loadingScreen.deleteFramebuffer(); //} @@ -670,6 +685,33 @@ public void setupRenderConfiguration() throws Exception mc.print(telescopeFramebufferL.toString()); checkGLError("TelescopeL framebuffer setup"); + int cameraW = Math.round(1920 * mc.vrSettings.handCameraResScale); + int cameraH = Math.round(1080 * mc.vrSettings.handCameraResScale); + int cameraRenderW = cameraW; + int cameraRenderH = cameraH; + + if (Config.isShaders()) { //double ugh. + float aspect = (float)cameraW / (float)cameraH; + if (aspect > (displayFBWidth / displayFBHeight)) { + cameraW = displayFBWidth; + cameraH = Math.round(displayFBWidth / aspect); + } else { + cameraW = Math.round(displayFBHeight * aspect); + cameraH = displayFBHeight; + } + + cameraRenderW = displayFBWidth; + cameraRenderH = displayFBHeight; + } + + cameraFramebuffer = new Framebuffer("Handheld Camera", cameraW, cameraH, true, false, Framebuffer.NO_TEXTURE_ID, true, false); + mc.print(cameraFramebuffer.toString()); + checkGLError("Camera framebuffer setup"); + + cameraRenderFramebuffer = new Framebuffer("Handheld Camera Render", cameraRenderW, cameraRenderH, true, false, Framebuffer.NO_TEXTURE_ID, true, true); + mc.print(cameraRenderFramebuffer.toString()); + checkGLError("Camera render framebuffer setup"); + mc.gameRenderer.setupClipPlanes(); eyeproj[0] = getProjectionMatrix(0, mc.gameRenderer.minClipDistance, mc.gameRenderer.clipDistance * 4); @@ -723,6 +765,7 @@ public void setupRenderConfiguration() throws Exception entityShaders.put(framebufferUndistorted.name, createShaderGroup(outline, framebufferUndistorted)); entityShaders.put(telescopeFramebufferL.name, createShaderGroup(outline, telescopeFramebufferL)); entityShaders.put(telescopeFramebufferR.name, createShaderGroup(outline, telescopeFramebufferR)); + entityShaders.put(cameraRenderFramebuffer.name, createShaderGroup(outline, cameraRenderFramebuffer)); for (ShaderGroup s : old) { s.close(); @@ -744,6 +787,7 @@ public void setupRenderConfiguration() throws Exception alphaShaders.put(framebufferUndistorted.name, createShaderGroup(resourcelocation, framebufferUndistorted)); alphaShaders.put(telescopeFramebufferL.name, createShaderGroup(resourcelocation, telescopeFramebufferL)); alphaShaders.put(telescopeFramebufferR.name, createShaderGroup(resourcelocation, telescopeFramebufferR)); + alphaShaders.put(cameraRenderFramebuffer.name, createShaderGroup(resourcelocation, cameraRenderFramebuffer)); } else {//not fabulous! } @@ -821,7 +865,9 @@ public List getRenderPasses() { if (TelescopeTracker.isTelescope(mc.player.getHeldItemOffhand())) { if(TelescopeTracker.isViewing(1)) passes.add(RenderPass.SCOPEL); - } + } + if (mc.cameraTracker.isVisible()) + passes.add(RenderPass.CAMERA); } return passes; } @@ -888,8 +934,10 @@ public void doCircleStencil(Framebuffer fb) { GL11.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_REPLACE); GL11.glStencilMask(0xFF); // Write to stencil buffer + GL11.glClearStencil(0xFF); GlStateManager.clear(GL11.GL_STENCIL_BUFFER_BIT); // Clear stencil buffer (0 by default) - GL11.glStencilFunc(GL11.GL_ALWAYS, 1, 1); // Set any stencil to 1 + GL11.glClearStencil(0); + GL11.glStencilFunc(GL11.GL_ALWAYS, 0, 0xFF); // Set any stencil to 1 RenderSystem.colorMask(false, false, false, true); //do write to alpha. RenderSystem.depthMask(false); // Don't write to depth buffer @@ -935,7 +983,7 @@ public void doCircleStencil(Framebuffer fb) { RenderSystem.enableTexture(); RenderSystem.enableCull(); - GL11.glStencilFunc(GL11.GL_NOTEQUAL, 0, 1); + GL11.glStencilFunc(GL11.GL_NOTEQUAL, 0xFF, 1); GL11.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP); GL11.glStencilMask(0x0); // Dont Write to stencil buffer diff --git a/src/org/vivecraft/render/RenderPass.java b/src/org/vivecraft/render/RenderPass.java index 077893c..1cc0e50 100644 --- a/src/org/vivecraft/render/RenderPass.java +++ b/src/org/vivecraft/render/RenderPass.java @@ -7,5 +7,6 @@ public enum RenderPass { THIRD, GUI, SCOPER, - SCOPEL + SCOPEL, + CAMERA } \ No newline at end of file diff --git a/src/org/vivecraft/render/VRActiveRenderInfo.java b/src/org/vivecraft/render/VRActiveRenderInfo.java index 1ac5cb3..89bc01c 100644 --- a/src/org/vivecraft/render/VRActiveRenderInfo.java +++ b/src/org/vivecraft/render/VRActiveRenderInfo.java @@ -23,7 +23,7 @@ public void update(IBlockReader worldIn, Entity renderViewEntity, boolean thirdP RenderPass p = mc.currentPass; - if (Shaders.isShadowPass && p != RenderPass.THIRD) + if (Shaders.isShadowPass && p != RenderPass.THIRD && p != RenderPass.CAMERA) p = RenderPass.CENTER; VRDevicePose src = mc.vrPlayer.vrdata_world_render.getEye(p); diff --git a/src/org/vivecraft/render/VRArmRenderer.java b/src/org/vivecraft/render/VRArmRenderer.java index 4a6fda5..62179cd 100644 --- a/src/org/vivecraft/render/VRArmRenderer.java +++ b/src/org/vivecraft/render/VRArmRenderer.java @@ -46,15 +46,15 @@ public void renderLeftArm(MatrixStack matrixStackIn, IRenderTypeBuffer bufferIn, private void renderItem(ControllerType side, MatrixStack matrixStackIn, IRenderTypeBuffer bufferIn, int combinedLightIn, AbstractClientPlayerEntity playerIn, ModelRenderer rendererArmIn, ModelRenderer rendererArmwearIn) { - - if (MCOpenVR.getInputAction(MCOpenVR.keyVRInteract).isEnabledRaw(side) || - MCOpenVR.keyVRInteract.isKeyDown(side)|| - MCOpenVR.getInputAction(MCOpenVR.keyClimbeyGrab).isEnabledRaw(side) || - MCOpenVR.keyClimbeyGrab.isKeyDown(side)) { - GlStateManager.texEnv(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL13.GL_COMBINE); - GlStateManager.texEnv(GL11.GL_TEXTURE_ENV, ARBTextureEnvCombine.GL_COMBINE_RGB_ARB, GL13.GL_MODULATE); - GlStateManager.texEnv(GL11.GL_TEXTURE_ENV, ARBTextureEnvCombine.GL_RGB_SCALE_ARB, 2); - } + // TODO: find a different way to highlight the hand + //if (MCOpenVR.getInputAction(MCOpenVR.keyVRInteract).isEnabledRaw(side) || + // MCOpenVR.keyVRInteract.isKeyDown(side)|| + // MCOpenVR.getInputAction(MCOpenVR.keyClimbeyGrab).isEnabledRaw(side) || + // MCOpenVR.keyClimbeyGrab.isKeyDown(side)) { + // GlStateManager.texEnv(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL13.GL_COMBINE); + // GlStateManager.texEnv(GL11.GL_TEXTURE_ENV, ARBTextureEnvCombine.GL_COMBINE_RGB_ARB, GL13.GL_MODULATE); + // GlStateManager.texEnv(GL11.GL_TEXTURE_ENV, ARBTextureEnvCombine.GL_RGB_SCALE_ARB, 2); + //} PlayerModel playermodel = this.getEntityModel(); MCReflection.RenderPlayer_setModelVisibilities.invoke(this, playerIn); diff --git a/src/org/vivecraft/render/VRWidgetHelper.java b/src/org/vivecraft/render/VRWidgetHelper.java new file mode 100644 index 0000000..dc77a9b --- /dev/null +++ b/src/org/vivecraft/render/VRWidgetHelper.java @@ -0,0 +1,149 @@ +package org.vivecraft.render; + +import java.util.Random; +import java.util.function.Function; + +import org.vivecraft.gameplay.trackers.CameraTracker; +import org.vivecraft.settings.VRHotkeys; +import org.vivecraft.settings.VRSettings; +import org.vivecraft.utils.Utils; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.model.BakedQuad; +import net.minecraft.client.renderer.model.ModelResourceLocation; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.inventory.container.PlayerContainer; +import net.minecraft.util.Direction; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.vector.Vector3d; +import net.optifine.model.QuadBounds; +import org.lwjgl.opengl.GL11; + +public class VRWidgetHelper { + private static final Random random = new Random(); + public static boolean debug = false; + + public static void renderVRThirdPersonCamWidget() { + Minecraft mc = Minecraft.getInstance(); + if (mc.currentPass == RenderPass.LEFT || mc.currentPass == RenderPass.RIGHT) { + if (mc.vrSettings.displayMirrorMode == VRSettings.MIRROR_MIXED_REALITY || mc.vrSettings.displayMirrorMode == VRSettings.MIRROR_THIRD_PERSON) { + float scale = 0.35f; + if (mc.interactTracker.isInCamera() && !VRHotkeys.isMovingThirdPersonCam()) + scale *= 1.03f; + + renderVRCameraWidget(-0.748f, -0.438f, -0.06f, scale, RenderPass.THIRD, GameRenderer.thirdPersonCameraModel, GameRenderer.thirdPersonCameraDisplayModel, () -> { + mc.stereoProvider.framebufferMR.bindFramebufferTexture(); + }, face -> { + if (face == Direction.NORTH) + return DisplayFace.MIRROR; + if (face == Direction.SOUTH) + return DisplayFace.NORMAL; + return DisplayFace.NONE; + }); + } + } + } + + public static void renderVRHandheldCameraWidget() { + Minecraft mc = Minecraft.getInstance(); + if (mc.currentPass != RenderPass.CAMERA && mc.cameraTracker.isVisible()) { + float scale = 0.25f; + if (mc.interactTracker.isInHandheldCamera() && !mc.cameraTracker.isMoving()) + scale *= 1.03f; + + renderVRCameraWidget(-0.5f, -0.25f, -0.22f, scale, RenderPass.CAMERA, CameraTracker.cameraModel, CameraTracker.cameraDisplayModel, () -> { + if (mc.getFirstPersonRenderer().getNearOpaqueBlock(mc.vrPlayer.vrdata_world_render.getEye(RenderPass.CAMERA).getPosition(), mc.gameRenderer.minClipDistance) == null) + mc.stereoProvider.cameraFramebuffer.bindFramebufferTexture(); + else + mc.getTextureManager().bindTexture(new ResourceLocation("vivecraft:textures/black.png")); + }, face -> { + if (face == Direction.SOUTH) + return DisplayFace.NORMAL; + return DisplayFace.NONE; + }); + } + } + + public static void renderVRCameraWidget(float offsetX, float offsetY, float offsetZ, float scale, RenderPass renderPass, ModelResourceLocation model, ModelResourceLocation displayModel, Runnable displayBindFunc, Function displayFaceFunc) { + Minecraft mc = Minecraft.getInstance(); + RenderSystem.pushMatrix(); + + mc.gameRenderer.applyVRModelViewLegacy(mc.currentPass); + + Vector3d cam = mc.vrPlayer.vrdata_world_render.getEye(renderPass).getPosition(); + Vector3d o = mc.vrPlayer.vrdata_world_render.getEye(mc.currentPass).getPosition(); + Vector3d pos = cam.subtract(o); + + RenderSystem.enableDepthTest(); + RenderSystem.defaultBlendFunc(); + //RenderSystem.depthFunc(GL11.GL_ALWAYS); + + RenderSystem.translated(pos.x, pos.y, pos.z); + RenderSystem.multMatrix(mc.vrPlayer.vrdata_world_render.getEye(renderPass).getMatrix().toMCMatrix()); + + scale = scale * mc.vrPlayer.vrdata_world_render.worldScale; + RenderSystem.scalef(scale, scale, scale); + + // Position testing + if (debug) { + RenderSystem.rotatef(180, 0, 1, 0); + mc.gameRenderer.renderDebugAxes(0, 0, 0, 0.08f); + RenderSystem.rotatef(180, 0, 1, 0); + } + + // Probably magic transform + RenderSystem.translatef(offsetX, offsetY, offsetZ); + + mc.getTextureManager().bindTexture(PlayerContainer.LOCATION_BLOCKS_TEXTURE); + BlockPos lightPos = new BlockPos(mc.vrPlayer.vrdata_world_render.getEye(renderPass).getPosition()); + int combinedLight = Utils.getCombinedLightWithMin(mc.world, lightPos, 0); + + Tessellator tess = Tessellator.getInstance(); + BufferBuilder buffer = tess.getBuffer(); + buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK); + mc.getBlockRendererDispatcher().getBlockModelRenderer().renderModelBrightnessColor(new MatrixStack().getLast(), buffer, null, mc.getModelManager().getModel(model), 1.0F, 1.0F, 1.0F, combinedLight, OverlayTexture.NO_OVERLAY); + tess.draw(); + + RenderSystem.disableBlend(); + RenderSystem.alphaFunc(GL11.GL_ALWAYS, 0); + displayBindFunc.run(); + + BufferBuilder b = tess.getBuffer(); + b.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX_LMAP_COLOR_NORMAL); + + // This is very silly but it works + for (BakedQuad quad : mc.getModelManager().getModel(displayModel).getQuads(null, null, random)) { + if (displayFaceFunc.apply(quad.getFace()) != DisplayFace.NONE && quad.getSprite().getName().equals(new ResourceLocation("vivecraft:transparent"))) { + QuadBounds bounds = quad.getQuadBounds(); + boolean mirror = displayFaceFunc.apply(quad.getFace()) == DisplayFace.MIRROR; + int light = LightTexture.packLight(15, 15); + + b.pos(mirror ? bounds.getMaxX() : bounds.getMinX(), bounds.getMinY(), bounds.getMinZ()).tex(mirror ? 1.0f : 0.0f, 0.0f).lightmap(light).color(1.0f, 1.0f, 1.0f, 1.0f).normal(0, 0, mirror ? -1 : 1).endVertex(); + b.pos(mirror ? bounds.getMinX() : bounds.getMaxX(), bounds.getMinY(), bounds.getMinZ()).tex(mirror ? 0.0f : 1.0f, 0.0f).lightmap(light).color(1.0f, 1.0f, 1.0f, 1.0f).normal(0, 0, mirror ? -1 : 1).endVertex(); + b.pos(mirror ? bounds.getMinX() : bounds.getMaxX(), bounds.getMaxY(), bounds.getMinZ()).tex(mirror ? 0.0f : 1.0f, 1.0f).lightmap(light).color(1.0f, 1.0f, 1.0f, 1.0f).normal(0, 0, mirror ? -1 : 1).endVertex(); + b.pos(mirror ? bounds.getMaxX() : bounds.getMinX(), bounds.getMaxY(), bounds.getMinZ()).tex(mirror ? 1.0f : 0.0f, 1.0f).lightmap(light).color(1.0f, 1.0f, 1.0f, 1.0f).normal(0, 0, mirror ? -1 : 1).endVertex(); + } + } + + tess.draw(); + + //RenderSystem.depthFunc(GL11.GL_LEQUAL); + RenderSystem.enableBlend(); + RenderSystem.defaultAlphaFunc(); + RenderSystem.popMatrix(); + } + + public enum DisplayFace { + NONE, + NORMAL, + MIRROR + } +} diff --git a/src/org/vivecraft/settings/VRSettings.java b/src/org/vivecraft/settings/VRSettings.java index 4e197fc..de5fd36 100644 --- a/src/org/vivecraft/settings/VRSettings.java +++ b/src/org/vivecraft/settings/VRSettings.java @@ -12,6 +12,7 @@ import java.util.SortedSet; import java.util.function.Supplier; +import net.optifine.Config; import net.optifine.Lang; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -210,6 +211,8 @@ public class VRSettings public float mrMovingCamOffsetZ = 0; public Quaternion mrMovingCamOffsetRotQuat = new Quaternion(); public Angle.Order externalCameraAngleOrder = Angle.Order.XZY; + public float handCameraFov = 70; + public float handCameraResScale = 1.0f; // //HUD/GUI @@ -798,6 +801,14 @@ public void loadOptions(JSONObject theProfiles) if(optionTokens[0].equals("guiAppearOverBlock")){ this.guiAppearOverBlock = optionTokens[1].equals("true"); } + + if(optionTokens[0].equals("handCameraFov")){ + this.handCameraFov = parseFloat(optionTokens[1]); + } + + if(optionTokens[0].equals("handCameraResScale")){ + this.handCameraResScale = parseFloat(optionTokens[1]); + } if(optionTokens[0].equals("firstRun")){ this.firstRun = optionTokens[1].equals("true"); @@ -1189,6 +1200,15 @@ else if (this.hrtfSelection <= SoundSystem.hrtfList.size()) case 10: return var4 + Lang.get("vivecraft.options.rightclickdelay.slowest"); } + case HANDHELD_CAMERA_FOV: + return var4 + String.format("%.0f\u00B0", this.handCameraFov); + case HANDHELD_CAMERA_RENDER_SCALE: + if (Config.isShaders()) { + Framebuffer camfb = mc.stereoProvider.cameraFramebuffer; + return var4 + camfb.framebufferWidth + "x" + camfb.framebufferHeight; + } else { + return var4 + Math.round(1920 * this.handCameraResScale) + "x" + Math.round(1080 * this.handCameraResScale); + } case RELOAD_EXTERNAL_CAMERA: return var2; default: @@ -1271,6 +1291,10 @@ public float getOptionFloatValue(VRSettings.VrOptions par1EnumOptions) return this.fovRedutioncOffset; case PHYSICAL_KEYBOARD_SCALE: return this.physicalKeyboardScale; + case HANDHELD_CAMERA_FOV: + return this.handCameraFov; + case HANDHELD_CAMERA_RENDER_SCALE: + return this.handCameraResScale; // VIVE END - new options default: return 0.0f; @@ -1673,6 +1697,12 @@ public void setOptionFloatValue(VRSettings.VrOptions par1EnumOptions, float par2 case PHYSICAL_KEYBOARD_SCALE: this.physicalKeyboardScale = par2; break; + case HANDHELD_CAMERA_FOV: + this.handCameraFov = par2; + break; + case HANDHELD_CAMERA_RENDER_SCALE: + this.handCameraResScale = par2; + break; // VIVE END - new options default: @@ -1822,6 +1852,8 @@ private void saveOptions(JSONObject theProfiles) var5.println("hrtfSelection:" + this.hrtfSelection); var5.println("rightclickDelay:" + this.rightclickDelay); var5.println("guiAppearOverBlock:" + this.guiAppearOverBlock); + var5.println("handCameraFov:" + this.handCameraFov); + var5.println("handCameraResScale:" + this.handCameraResScale); var5.println("firstRun:" + this.firstRun); @@ -1921,7 +1953,7 @@ public static enum VrOptions MIXED_REALITY_UNITY_LIKE(false, true), // Layout MIXED_REALITY_UNDISTORTED(false, true), // Undistorted Pass MIXED_REALITY_ALPHA_MASK(false, true), // Alpha Mask - MIXED_REALITY_FOV(true, false, 0, 179, 1), // Camera FOV + MIXED_REALITY_FOV(true, false, 0, 179, 1), // Third Person FOV WALK_UP_BLOCKS(false, true), // Walk up blocks //Movement/aiming controls MOVEMENT_MULTIPLIER(true, false, 0.15f, 1.3f, 0.01f), // Move. Speed Multiplier @@ -1943,6 +1975,8 @@ public static enum VrOptions PLAY_MODE_SEATED(false, true), // Play Mode RENDER_SCALEFACTOR(true, false, 0.1f, 9f, 0.1f), // Resolution MONO_FOV(true, false, 0, 179, 1), // Undistorted FOV + HANDHELD_CAMERA_FOV(true, false, 0, 179, 1), // Camera FOV + HANDHELD_CAMERA_RENDER_SCALE(true, false, 0.5f, 3.0f, 0.25f), // Camera Resolution //END JRBUDDA REALISTIC_JUMP(false, true), // Roomscale Jumping REALISTIC_SNEAK(false, true), // Roomscale Sneaking @@ -2254,7 +2288,7 @@ public String[] getRadialItemsDefault(){ out[1] = "key.chat"; out[2] = "vivecraft.key.rotateRight"; out[3] = "key.pickItem"; - out[4] = "vivecraft.key.toggleMovement"; + out[4] = "vivecraft.key.toggleHandheldCam"; out[5] = "vivecraft.key.togglePlayerList"; out[6] = "vivecraft.key.rotateLeft"; out[7] = "vivecraft.key.quickTorch"; diff --git a/src/org/vivecraft/utils/Utils.java b/src/org/vivecraft/utils/Utils.java index ee4a169..6d37ccb 100644 --- a/src/org/vivecraft/utils/Utils.java +++ b/src/org/vivecraft/utils/Utils.java @@ -35,9 +35,11 @@ import io.github.classgraph.ClassGraph; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.renderer.WorldRenderer; +import net.minecraft.client.shader.Framebuffer; import net.minecraft.resources.IResource; import net.minecraft.util.IReorderingProcessor; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.ScreenShotHelper; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextProperties; import net.minecraft.util.text.LanguageMap; @@ -751,6 +753,13 @@ public static int getCombinedLightWithMin(IBlockDisplayReader lightReader, Block return light; } + public static void takeScreenshot(Framebuffer fb) { + Minecraft mc = Minecraft.getInstance(); + ScreenShotHelper.saveScreenshot(mc.gameDir, fb.framebufferWidth, fb.framebufferHeight, fb, text -> { + mc.execute(() -> mc.ingameGUI.getChatGUI().printChatMessage(text)); + }); + } + public static List wrapText(ITextProperties text, int width, FontRenderer fontRenderer, @Nullable ITextProperties linePrefix) { TextPropertiesManager manager = new TextPropertiesManager();