From 359879b0fe83cd7a0e50a125f92e09e603f3286a Mon Sep 17 00:00:00 2001 From: OLEGSHA Date: Wed, 15 Dec 2021 00:20:50 +0300 Subject: [PATCH] Completed input refactoring - Moved everything related to controls into controls package - Moved controls related to placing/breaking stuff into InteractionControls - Localizer now provides access to the list of languages - Fixed a random bug in TestMusicPlayer because why not amirite --- .../client/graphics/world/LayerWorld.java | 7 +- .../client/localization/Localizer.java | 6 + .../progressia/test/LayerButtonTest.java | 1 + .../windcorp/progressia/test/LayerDebug.java | 1 + .../windcorp/progressia/test/TestContent.java | 183 +----------- .../progressia/test/TestMusicPlayer.java | 1 + .../{ => controls}/ControlBreakBlockData.java | 2 +- .../{ => controls}/ControlPlaceBlockData.java | 2 +- .../{ => controls}/ControlPlaceTileData.java | 2 +- .../test/controls/InteractionControls.java | 264 ++++++++++++++++++ .../test/controls/MovementControls.java | 58 ++-- .../{ => controls}/TestPlayerControls.java | 180 ++++++------ 12 files changed, 405 insertions(+), 302 deletions(-) rename src/main/java/ru/windcorp/progressia/test/{ => controls}/ControlBreakBlockData.java (96%) rename src/main/java/ru/windcorp/progressia/test/{ => controls}/ControlPlaceBlockData.java (96%) rename src/main/java/ru/windcorp/progressia/test/{ => controls}/ControlPlaceTileData.java (97%) create mode 100644 src/main/java/ru/windcorp/progressia/test/controls/InteractionControls.java rename src/main/java/ru/windcorp/progressia/test/{ => controls}/TestPlayerControls.java (55%) diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/world/LayerWorld.java b/src/main/java/ru/windcorp/progressia/client/graphics/world/LayerWorld.java index 82fcc1d..df3c99a 100644 --- a/src/main/java/ru/windcorp/progressia/client/graphics/world/LayerWorld.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/world/LayerWorld.java @@ -45,7 +45,7 @@ import ru.windcorp.progressia.common.util.Vectors; import ru.windcorp.progressia.common.world.GravityModel; import ru.windcorp.progressia.common.world.entity.EntityData; import ru.windcorp.progressia.test.CollisionModelRenderer; -import ru.windcorp.progressia.test.TestPlayerControls; +import ru.windcorp.progressia.test.controls.TestPlayerControls; public class LayerWorld extends Layer { @@ -229,11 +229,6 @@ public class LayerWorld extends Layer { @Override public void handleInput(InputEvent event) { - if (event.isConsumed()) - return; - - tmp_testControls.handleInput(event); - if (!event.isConsumed()) { inputBasedControls.handleInput(event); } diff --git a/src/main/java/ru/windcorp/progressia/client/localization/Localizer.java b/src/main/java/ru/windcorp/progressia/client/localization/Localizer.java index b61d000..ee7494d 100644 --- a/src/main/java/ru/windcorp/progressia/client/localization/Localizer.java +++ b/src/main/java/ru/windcorp/progressia/client/localization/Localizer.java @@ -72,6 +72,12 @@ public class Localizer { public synchronized String getLanguage() { return language; } + + public List getLanguages() { + List result = new ArrayList<>(langList.keySet()); + result.sort(null); + return result; + } public synchronized String getValue(String key) { if (data == null) { diff --git a/src/main/java/ru/windcorp/progressia/test/LayerButtonTest.java b/src/main/java/ru/windcorp/progressia/test/LayerButtonTest.java index a9812ea..4e6cd77 100644 --- a/src/main/java/ru/windcorp/progressia/test/LayerButtonTest.java +++ b/src/main/java/ru/windcorp/progressia/test/LayerButtonTest.java @@ -33,6 +33,7 @@ import ru.windcorp.progressia.client.localization.MutableStringLocalized; import ru.windcorp.progressia.server.Player; import ru.windcorp.progressia.server.Server; import ru.windcorp.progressia.server.ServerState; +import ru.windcorp.progressia.test.controls.TestPlayerControls; public class LayerButtonTest extends MenuLayer { diff --git a/src/main/java/ru/windcorp/progressia/test/LayerDebug.java b/src/main/java/ru/windcorp/progressia/test/LayerDebug.java index f6509d5..541a50e 100755 --- a/src/main/java/ru/windcorp/progressia/test/LayerDebug.java +++ b/src/main/java/ru/windcorp/progressia/test/LayerDebug.java @@ -39,6 +39,7 @@ import ru.windcorp.progressia.common.Units; import ru.windcorp.progressia.common.util.dynstr.DynamicStrings; import ru.windcorp.progressia.server.Server; import ru.windcorp.progressia.server.ServerState; +import ru.windcorp.progressia.test.controls.TestPlayerControls; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/ru/windcorp/progressia/test/TestContent.java b/src/main/java/ru/windcorp/progressia/test/TestContent.java index c7d7e8a..a473bef 100644 --- a/src/main/java/ru/windcorp/progressia/test/TestContent.java +++ b/src/main/java/ru/windcorp/progressia/test/TestContent.java @@ -29,17 +29,6 @@ import java.util.List; import java.util.Set; import java.util.function.Consumer; -import org.lwjgl.glfw.GLFW; - -import glm.vec._3.i.Vec3i; -import ru.windcorp.progressia.client.ClientState; -import ru.windcorp.progressia.client.audio.Sound; -import ru.windcorp.progressia.client.comms.controls.*; -import ru.windcorp.progressia.client.graphics.backend.InputTracker; -import ru.windcorp.progressia.client.graphics.input.KeyEvent; -import ru.windcorp.progressia.client.graphics.input.KeyMatcher; -import ru.windcorp.progressia.client.graphics.input.WheelScrollEvent; -import ru.windcorp.progressia.client.graphics.world.Selection; import ru.windcorp.progressia.client.world.block.*; import ru.windcorp.progressia.client.world.cro.ChunkRenderOptimizerRegistry; import ru.windcorp.progressia.client.world.cro.ChunkRenderOptimizerSimple; @@ -48,25 +37,19 @@ import ru.windcorp.progressia.client.world.entity.*; import ru.windcorp.progressia.client.world.tile.*; import ru.windcorp.progressia.common.collision.AABB; import ru.windcorp.progressia.common.collision.CollisionModel; -import ru.windcorp.progressia.common.comms.controls.*; import ru.windcorp.progressia.common.state.StatefulObjectRegistry.Factory; import ru.windcorp.progressia.common.world.GravityModelRegistry; import ru.windcorp.progressia.common.world.block.*; import ru.windcorp.progressia.common.world.entity.*; import ru.windcorp.progressia.common.world.io.ChunkIO; -import ru.windcorp.progressia.common.world.rels.AbsFace; import ru.windcorp.progressia.common.world.tile.*; -import ru.windcorp.progressia.server.Server; -import ru.windcorp.progressia.server.comms.controls.*; import ru.windcorp.progressia.server.world.block.*; -import ru.windcorp.progressia.server.world.context.ServerBlockContext; -import ru.windcorp.progressia.server.world.context.ServerTileContext; -import ru.windcorp.progressia.server.world.context.ServerTileStackContext; import ru.windcorp.progressia.server.world.entity.*; import ru.windcorp.progressia.server.world.generation.planet.PlanetGravityModel; import ru.windcorp.progressia.server.world.tile.*; import ru.windcorp.progressia.test.Flowers.FlowerVariant; import ru.windcorp.progressia.test.Rocks.RockType; +import ru.windcorp.progressia.test.controls.TestPlayerControls; import ru.windcorp.progressia.test.gen.TestGravityModel; import ru.windcorp.progressia.test.trees.BlockRenderLeavesHazel; import ru.windcorp.progressia.test.trees.BlockRenderLeavesPine; @@ -293,82 +276,7 @@ public class TestContent { private static void regsiterControls() { TestPlayerControls.getInstance().registerControls(); - ControlDataRegistry data = ControlDataRegistry.getInstance(); - ControlTriggerRegistry triggers = ControlTriggerRegistry.getInstance(); - ControlLogicRegistry logic = ControlLogicRegistry.getInstance(); - - data.register("Test:BreakBlock", ControlBreakBlockData::new); - triggers.register( - ControlTriggers.of( - "Test:BreakBlock", - KeyEvent.class, - TestContent::onBlockBreakTrigger, - KeyMatcher.LMB::matches, - i -> isAnythingSelected() - ) - ); - logic.register(ControlLogic.of("Test:BreakBlock", TestContent::onBlockBreakReceived)); - - data.register("Test:PlaceBlock", ControlPlaceBlockData::new); - triggers.register( - ControlTriggers.of( - "Test:PlaceBlock", - KeyEvent.class, - TestContent::onBlockPlaceTrigger, - KeyMatcher.RMB::matches, - i -> isAnythingSelected() && TestPlayerControls.getInstance().isBlockSelected() - ) - ); - - logic.register(ControlLogic.of("Test:PlaceBlock", TestContent::onBlockPlaceReceived)); - - data.register("Test:PlaceTile", ControlPlaceTileData::new); - triggers.register( - ControlTriggers.of( - "Test:PlaceTile", - KeyEvent.class, - TestContent::onTilePlaceTrigger, - KeyMatcher.RMB::matches, - i -> isAnythingSelected() && !TestPlayerControls.getInstance().isBlockSelected() - ) - ); - logic.register(ControlLogic.of("Test:PlaceTile", TestContent::onTilePlaceReceived)); - triggers.register( - ControlTriggers.localOf( - "Test:SwitchPlacingModeMMB", - KeyEvent.class, - () -> TestPlayerControls.getInstance().switchPlacingMode(), - KeyMatcher.MMB::matches - ) - ); - - triggers.register( - ControlTriggers.localOf( - "Test:SwitchPlacingModeWheel", - WheelScrollEvent.class, - () -> TestPlayerControls.getInstance().switchPlacingMode(), - e -> e.hasHorizontalMovement() || InputTracker.isKeyPressed(GLFW.GLFW_KEY_LEFT_CONTROL) - ) - ); - - triggers.register( - ControlTriggers.localOf( - "Test:SelectNextBlockOrTile", - WheelScrollEvent.class, - e -> TestPlayerControls.getInstance().selectNextBlockOrTile(e), - e -> !e.hasHorizontalMovement() && !InputTracker.isKeyPressed(GLFW.GLFW_KEY_LEFT_CONTROL) - ) - ); - - triggers.register( - ControlTriggers.localOf( - "Test:StartNextMusic", - KeyEvent.class, - TestMusicPlayer::startNextNow, - new KeyMatcher("M")::matches - ) - ); } private static void register(BlockData x) { @@ -424,95 +332,6 @@ public class TestContent { EntityLogicRegistry.getInstance().register(x); } - private static Selection getSelection() { - ru.windcorp.progressia.client.Client client = ClientState.getInstance(); - if (client == null || !client.isReady()) - return null; - - return client.getLocalPlayer().getSelection(); - } - - private static boolean isAnythingSelected() { - ru.windcorp.progressia.client.Client client = ClientState.getInstance(); - if (client == null || !client.isReady()) - return false; - - return client.getLocalPlayer().getSelection().exists(); - } - - private static void onBlockBreakTrigger(ControlData control) { - ((ControlBreakBlockData) control).setBlockInWorld(getSelection().getBlock()); - Sound sfx = new Sound("Progressia:BlockDestroy"); - sfx.setPosition(getSelection().getPoint()); - sfx.setPitch((float) (Math.random() + 1 * 0.5)); - sfx.play(false); - } - - private static void onBlockBreakReceived( - Server server, - PacketControl packet, - ru.windcorp.progressia.server.comms.Client client - ) { - Vec3i blockInWorld = ((ControlBreakBlockData) packet.getControl()).getBlockInWorld(); - server.createAbsoluteContext().setBlock(blockInWorld, BlockDataRegistry.getInstance().get("Test:Air")); - } - - private static void onBlockPlaceTrigger(ControlData control) { - ((ControlPlaceBlockData) control).set( - TestPlayerControls.getInstance().getSelectedBlock(), - getSelection().getBlock().add_(getSelection().getSurface().getVector()) - ); - } - - private static void onBlockPlaceReceived( - Server server, - PacketControl packet, - ru.windcorp.progressia.server.comms.Client client - ) { - ControlPlaceBlockData controlData = ((ControlPlaceBlockData) packet.getControl()); - BlockData block = controlData.getBlock(); - Vec3i blockInWorld = controlData.getBlockInWorld(); - if (server.getWorld().getData().getChunkByBlock(blockInWorld) == null) - return; - server.createAbsoluteContext().setBlock(blockInWorld, block); - } - - private static void onTilePlaceTrigger(ControlData control) { - ((ControlPlaceTileData) control).set( - TestPlayerControls.getInstance().getSelectedTile(), - getSelection().getBlock(), - getSelection().getSurface() - ); - } - - private static void onTilePlaceReceived( - Server server, - PacketControl packet, - ru.windcorp.progressia.server.comms.Client client - ) { - ControlPlaceTileData controlData = ((ControlPlaceTileData) packet.getControl()); - TileData tile = controlData.getTile(); - Vec3i blockInWorld = controlData.getBlockInWorld(); - AbsFace face = controlData.getFace(); - - if (server.getWorld().getData().getChunkByBlock(blockInWorld) == null) { - return; - } - if (server.getWorld().getData().getTiles(blockInWorld, face).isFull()) { - return; - } - - ServerBlockContext context = server.createContext(blockInWorld); - ServerTileStackContext tsContext = context.push(context.toContext(face)); - ServerTileContext tileContext = tsContext.push(tsContext.getTileCount()); - - TileLogic logic = TileLogicRegistry.getInstance().get(tile.getId()); - if (!logic.canOccupyFace(tileContext)) { - return; - } - tileContext.addTile(tile); - } - private static void registerMisc() { ChunkIO.registerCodec(new TestChunkCodec()); diff --git a/src/main/java/ru/windcorp/progressia/test/TestMusicPlayer.java b/src/main/java/ru/windcorp/progressia/test/TestMusicPlayer.java index 1674d5b..40712e8 100644 --- a/src/main/java/ru/windcorp/progressia/test/TestMusicPlayer.java +++ b/src/main/java/ru/windcorp/progressia/test/TestMusicPlayer.java @@ -110,6 +110,7 @@ public class TestMusicPlayer implements Runnable { String file = it.next().toString(); if (!file.endsWith(".ogg") && !file.endsWith(".oga")) { LogManager.getLogger().warn("Skipping " + file + ": not .ogg nor .oga"); + continue; } String id = "Progressia:Music" + (i++); diff --git a/src/main/java/ru/windcorp/progressia/test/ControlBreakBlockData.java b/src/main/java/ru/windcorp/progressia/test/controls/ControlBreakBlockData.java similarity index 96% rename from src/main/java/ru/windcorp/progressia/test/ControlBreakBlockData.java rename to src/main/java/ru/windcorp/progressia/test/controls/ControlBreakBlockData.java index a9df57a..c51cfe2 100644 --- a/src/main/java/ru/windcorp/progressia/test/ControlBreakBlockData.java +++ b/src/main/java/ru/windcorp/progressia/test/controls/ControlBreakBlockData.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package ru.windcorp.progressia.test; +package ru.windcorp.progressia.test.controls; import glm.vec._3.i.Vec3i; import ru.windcorp.progressia.common.comms.controls.ControlData; diff --git a/src/main/java/ru/windcorp/progressia/test/ControlPlaceBlockData.java b/src/main/java/ru/windcorp/progressia/test/controls/ControlPlaceBlockData.java similarity index 96% rename from src/main/java/ru/windcorp/progressia/test/ControlPlaceBlockData.java rename to src/main/java/ru/windcorp/progressia/test/controls/ControlPlaceBlockData.java index f3e45e2..5d47563 100644 --- a/src/main/java/ru/windcorp/progressia/test/ControlPlaceBlockData.java +++ b/src/main/java/ru/windcorp/progressia/test/controls/ControlPlaceBlockData.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package ru.windcorp.progressia.test; +package ru.windcorp.progressia.test.controls; import glm.vec._3.i.Vec3i; import ru.windcorp.progressia.common.comms.controls.ControlData; diff --git a/src/main/java/ru/windcorp/progressia/test/ControlPlaceTileData.java b/src/main/java/ru/windcorp/progressia/test/controls/ControlPlaceTileData.java similarity index 97% rename from src/main/java/ru/windcorp/progressia/test/ControlPlaceTileData.java rename to src/main/java/ru/windcorp/progressia/test/controls/ControlPlaceTileData.java index 7944116..2fff853 100644 --- a/src/main/java/ru/windcorp/progressia/test/ControlPlaceTileData.java +++ b/src/main/java/ru/windcorp/progressia/test/controls/ControlPlaceTileData.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package ru.windcorp.progressia.test; +package ru.windcorp.progressia.test.controls; import glm.vec._3.i.Vec3i; import ru.windcorp.progressia.common.comms.controls.ControlData; diff --git a/src/main/java/ru/windcorp/progressia/test/controls/InteractionControls.java b/src/main/java/ru/windcorp/progressia/test/controls/InteractionControls.java new file mode 100644 index 0000000..67dc99a --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/test/controls/InteractionControls.java @@ -0,0 +1,264 @@ +/* + * Progressia + * Copyright (C) 2020-2021 Wind Corporation and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package ru.windcorp.progressia.test.controls; + +import org.lwjgl.glfw.GLFW; + +import glm.vec._3.i.Vec3i; +import ru.windcorp.progressia.client.ClientState; +import ru.windcorp.progressia.client.audio.Sound; +import ru.windcorp.progressia.client.comms.controls.ControlTriggerRegistry; +import ru.windcorp.progressia.client.comms.controls.ControlTriggers; +import ru.windcorp.progressia.client.graphics.backend.InputTracker; +import ru.windcorp.progressia.client.graphics.input.KeyEvent; +import ru.windcorp.progressia.client.graphics.input.KeyMatcher; +import ru.windcorp.progressia.client.graphics.input.WheelScrollEvent; +import ru.windcorp.progressia.client.graphics.world.Selection; +import ru.windcorp.progressia.common.comms.controls.ControlData; +import ru.windcorp.progressia.common.comms.controls.ControlDataRegistry; +import ru.windcorp.progressia.common.comms.controls.PacketControl; +import ru.windcorp.progressia.common.world.block.BlockData; +import ru.windcorp.progressia.common.world.block.BlockDataRegistry; +import ru.windcorp.progressia.common.world.rels.AbsFace; +import ru.windcorp.progressia.common.world.tile.TileData; +import ru.windcorp.progressia.server.Server; +import ru.windcorp.progressia.server.comms.controls.ControlLogic; +import ru.windcorp.progressia.server.comms.controls.ControlLogicRegistry; +import ru.windcorp.progressia.server.world.context.ServerBlockContext; +import ru.windcorp.progressia.server.world.context.ServerTileContext; +import ru.windcorp.progressia.server.world.context.ServerTileStackContext; +import ru.windcorp.progressia.server.world.tile.TileLogic; +import ru.windcorp.progressia.server.world.tile.TileLogicRegistry; +import ru.windcorp.progressia.test.TestContent; + +public class InteractionControls { + + private int selectedBlock; + private int selectedTile; + private boolean isBlockSelected; + + { + reset(); + } + + public void reset() { + selectedBlock = 0; + selectedTile = 0; + isBlockSelected = true; + } + + public void registerControls() { + ControlDataRegistry data = ControlDataRegistry.getInstance(); + ControlTriggerRegistry triggers = ControlTriggerRegistry.getInstance(); + ControlLogicRegistry logic = ControlLogicRegistry.getInstance(); + + data.register("Test:BreakBlock", ControlBreakBlockData::new); + triggers.register( + ControlTriggers.of( + "Test:BreakBlock", + KeyEvent.class, + this::onBlockBreakTrigger, + KeyMatcher.LMB::matches, + i -> isAnythingSelected() + ) + ); + logic.register(ControlLogic.of("Test:BreakBlock", InteractionControls::onBlockBreakReceived)); + + data.register("Test:PlaceBlock", ControlPlaceBlockData::new); + triggers.register( + ControlTriggers.of( + "Test:PlaceBlock", + KeyEvent.class, + this::onBlockPlaceTrigger, + KeyMatcher.RMB::matches, + i -> isAnythingSelected() && isBlockSelected() + ) + ); + + logic.register(ControlLogic.of("Test:PlaceBlock", InteractionControls::onBlockPlaceReceived)); + + data.register("Test:PlaceTile", ControlPlaceTileData::new); + triggers.register( + ControlTriggers.of( + "Test:PlaceTile", + KeyEvent.class, + this::onTilePlaceTrigger, + KeyMatcher.RMB::matches, + i -> isAnythingSelected() && !isBlockSelected() + ) + ); + logic.register(ControlLogic.of("Test:PlaceTile", InteractionControls::onTilePlaceReceived)); + + triggers.register( + ControlTriggers.localOf( + "Test:SwitchPlacingModeMMB", + KeyEvent.class, + this::switchPlacingMode, + KeyMatcher.MMB::matches + ) + ); + + triggers.register( + ControlTriggers.localOf( + "Test:SwitchPlacingModeWheel", + WheelScrollEvent.class, + this::switchPlacingMode, + e -> e.hasHorizontalMovement() || InputTracker.isKeyPressed(GLFW.GLFW_KEY_LEFT_CONTROL) + ) + ); + + triggers.register( + ControlTriggers.localOf( + "Test:SelectNextBlockOrTile", + WheelScrollEvent.class, + this::selectNextBlockOrTile, + e -> !e.hasHorizontalMovement() && !InputTracker.isKeyPressed(GLFW.GLFW_KEY_LEFT_CONTROL) + ) + ); + } + + private static Selection getSelection() { + ru.windcorp.progressia.client.Client client = ClientState.getInstance(); + if (client == null || !client.isReady()) + return null; + + return client.getLocalPlayer().getSelection(); + } + + private static boolean isAnythingSelected() { + ru.windcorp.progressia.client.Client client = ClientState.getInstance(); + if (client == null || !client.isReady()) + return false; + + return client.getLocalPlayer().getSelection().exists(); + } + + private void onBlockBreakTrigger(ControlData control) { + ((ControlBreakBlockData) control).setBlockInWorld(getSelection().getBlock()); + Sound sfx = new Sound("Progressia:BlockDestroy"); + sfx.setPosition(getSelection().getPoint()); + sfx.setPitch((float) (Math.random() + 1 * 0.5)); + sfx.play(false); + } + + private static void onBlockBreakReceived( + Server server, + PacketControl packet, + ru.windcorp.progressia.server.comms.Client client + ) { + Vec3i blockInWorld = ((ControlBreakBlockData) packet.getControl()).getBlockInWorld(); + server.createAbsoluteContext().setBlock(blockInWorld, BlockDataRegistry.getInstance().get("Test:Air")); + } + + private void onBlockPlaceTrigger(ControlData control) { + ((ControlPlaceBlockData) control).set( + getSelectedBlock(), + getSelection().getBlock().add_(getSelection().getSurface().getVector()) + ); + } + + private static void onBlockPlaceReceived( + Server server, + PacketControl packet, + ru.windcorp.progressia.server.comms.Client client + ) { + ControlPlaceBlockData controlData = ((ControlPlaceBlockData) packet.getControl()); + BlockData block = controlData.getBlock(); + Vec3i blockInWorld = controlData.getBlockInWorld(); + if (server.getWorld().getData().getChunkByBlock(blockInWorld) == null) + return; + server.createAbsoluteContext().setBlock(blockInWorld, block); + } + + private void onTilePlaceTrigger(ControlData control) { + ((ControlPlaceTileData) control).set( + getSelectedTile(), + getSelection().getBlock(), + getSelection().getSurface() + ); + } + + private static void onTilePlaceReceived( + Server server, + PacketControl packet, + ru.windcorp.progressia.server.comms.Client client + ) { + ControlPlaceTileData controlData = ((ControlPlaceTileData) packet.getControl()); + TileData tile = controlData.getTile(); + Vec3i blockInWorld = controlData.getBlockInWorld(); + AbsFace face = controlData.getFace(); + + if (server.getWorld().getData().getChunkByBlock(blockInWorld) == null) { + return; + } + if (server.getWorld().getData().getTiles(blockInWorld, face).isFull()) { + return; + } + + ServerBlockContext context = server.createContext(blockInWorld); + ServerTileStackContext tsContext = context.push(context.toContext(face)); + ServerTileContext tileContext = tsContext.push(tsContext.getTileCount()); + + TileLogic logic = TileLogicRegistry.getInstance().get(tile.getId()); + if (!logic.canOccupyFace(tileContext)) { + return; + } + tileContext.addTile(tile); + } + + public void switchPlacingMode() { + isBlockSelected = !isBlockSelected; + } + + public void selectNextBlockOrTile(WheelScrollEvent event) { + if (isBlockSelected) { + selectedBlock += event.isUp() ? +1 : -1; + + int size = TestContent.PLACEABLE_BLOCKS.size(); + + if (selectedBlock < 0) { + selectedBlock = size - 1; + } else if (selectedBlock >= size) { + selectedBlock = 0; + } + } else { + selectedTile += event.isUp() ? +1 : -1; + + int size = TestContent.PLACEABLE_TILES.size(); + + if (selectedTile < 0) { + selectedTile = size - 1; + } else if (selectedTile >= size) { + selectedTile = 0; + } + } + } + + public BlockData getSelectedBlock() { + return TestContent.PLACEABLE_BLOCKS.get(selectedBlock); + } + + public TileData getSelectedTile() { + return TestContent.PLACEABLE_TILES.get(selectedTile); + } + + public boolean isBlockSelected() { + return isBlockSelected; + } + +} diff --git a/src/main/java/ru/windcorp/progressia/test/controls/MovementControls.java b/src/main/java/ru/windcorp/progressia/test/controls/MovementControls.java index 85181be..7048922 100644 --- a/src/main/java/ru/windcorp/progressia/test/controls/MovementControls.java +++ b/src/main/java/ru/windcorp/progressia/test/controls/MovementControls.java @@ -42,12 +42,12 @@ public class MovementControls { * Max delay between space presses that can toggle flying */ private static final double FLYING_SWITCH_MAX_DELAY = Units.get("300 ms"); - + /** * Max delay between W presses that can toggle sprinting */ private static final double SPRINTING_SWITCH_MAX_DELAY = Units.get("300 ms"); - + /** * Min delay between jumps */ @@ -88,7 +88,7 @@ public class MovementControls { private double lastSpacePress; private double lastSprintPress; - + { reset(); } @@ -102,9 +102,9 @@ public class MovementControls { if (!(cameraAnchor instanceof EntityAnchor)) { return; } - + EntityData player = ((EntityAnchor) cameraAnchor).getEntity(); - + boolean isFlying = this.isFlying || player.getId().equals("Test:NoclipCamera"); boolean isSprinting = this.isSprinting || player.getId().equals("Test:NoclipCamera"); @@ -120,7 +120,13 @@ public class MovementControls { Mat3 movementTransform = getMovementTransform(player, null); Vec3 desiredVelocity = getDesiredVelocity(movementTransform, speed, isFlying); - Vec3 newVelocity = getNewVelocity(desiredVelocity, player.getVelocity(), authority, player.getUpVector()); + Vec3 newVelocity = getNewVelocity( + desiredVelocity, + player.getVelocity(), + authority, + player.getUpVector(), + isFlying + ); player.getVelocity().set(newVelocity); tmp_syncServerEntity(); @@ -132,7 +138,7 @@ public class MovementControls { .getEntity(TestContent.PLAYER_ENTITY_ID); if (serverEntity != null) { EntityData clientEntity = ClientState.getInstance().getLocalPlayer().getEntity(); - + clientEntity.copy(serverEntity); serverEntity.setLookingAt(clientEntity.getLookingAt()); serverEntity.setUpVector(clientEntity.getUpVector()); @@ -188,7 +194,7 @@ public class MovementControls { return desiredVelocity; } - private Vec3 getNewVelocity(Vec3 desiredVelocity, Vec3 oldVelocity, float authority, Vec3 up) { + private Vec3 getNewVelocity(Vec3 desiredVelocity, Vec3 oldVelocity, float authority, Vec3 up, boolean isFlying) { // newVelocity = oldVelocity + small change toward desiredVelocity Vec3 newVelocity = new Vec3() @@ -207,17 +213,17 @@ public class MovementControls { return newVelocity; } - + public void reset() { isFlying = true; isSprinting = false; - lastSpacePress = Double.NEGATIVE_INFINITY; + lastSpacePress = Double.NEGATIVE_INFINITY; lastSprintPress = Double.NEGATIVE_INFINITY; } public void registerControls() { ControlTriggerRegistry triggers = ControlTriggerRegistry.getInstance(); - + triggers.register( ControlTriggers.localOf( "Test:JumpOrToggleFlight", @@ -226,31 +232,39 @@ public class MovementControls { new KeyMatcher("Space")::matches ) ); - + triggers.register( ControlTriggers.localOf( "Test:ToggleSprint", KeyEvent.class, this::toggleSprint, - + new KeyMatcher("W")::matches, e -> !isFlying ) ); - + triggers.register( ControlTriggers.localOf( "Test:DisableSprint", KeyEvent.class, this::disableSprint, - + new KeyMatcher("W")::matchesIgnoringAction, KeyEvent::isRelease ) ); } - + private void handleSpacePress(KeyEvent e) { + if ( + ClientState.getInstance().getCamera().getAnchor() instanceof EntityAnchor + && ((EntityAnchor) ClientState.getInstance().getCamera().getAnchor()).getEntity().getId() + .equals("Test:NoclipCamera") + ) { + return; + } + double timeSinceLastSpacePress = e.getTime() - lastSpacePress; if (timeSinceLastSpacePress < FLYING_SWITCH_MAX_DELAY) { @@ -262,7 +276,7 @@ public class MovementControls { lastSpacePress = e.getTime(); } - + private void jump() { if (ClientState.getInstance() == null || !ClientState.getInstance().isReady()) { return; @@ -272,29 +286,29 @@ public class MovementControls { assert player != null; Vec3 up = player.getUpVector(); - + player.getVelocity().add( up.x * JUMP_VELOCITY, up.y * JUMP_VELOCITY, up.z * JUMP_VELOCITY ); } - + private void toggleSprint(KeyEvent e) { if (e.getTime() - lastSprintPress < SPRINTING_SWITCH_MAX_DELAY) { isSprinting = !isSprinting; } lastSprintPress = e.getTime(); } - + private void disableSprint(KeyEvent e) { isSprinting = false; } - + public boolean isFlying() { return isFlying; } - + public boolean isSprinting() { return isSprinting; } diff --git a/src/main/java/ru/windcorp/progressia/test/TestPlayerControls.java b/src/main/java/ru/windcorp/progressia/test/controls/TestPlayerControls.java similarity index 55% rename from src/main/java/ru/windcorp/progressia/test/TestPlayerControls.java rename to src/main/java/ru/windcorp/progressia/test/controls/TestPlayerControls.java index a7d5f0d..1990b11 100644 --- a/src/main/java/ru/windcorp/progressia/test/TestPlayerControls.java +++ b/src/main/java/ru/windcorp/progressia/test/controls/TestPlayerControls.java @@ -16,23 +16,26 @@ * along with this program. If not, see . */ -package ru.windcorp.progressia.test; +package ru.windcorp.progressia.test.controls; + +import java.util.List; -import org.lwjgl.glfw.GLFW; import ru.windcorp.progressia.client.ClientState; +import ru.windcorp.progressia.client.comms.controls.ControlTriggerRegistry; +import ru.windcorp.progressia.client.comms.controls.ControlTriggers; import ru.windcorp.progressia.client.graphics.GUI; import ru.windcorp.progressia.client.graphics.backend.GraphicsBackend; import ru.windcorp.progressia.client.graphics.backend.GraphicsInterface; -import ru.windcorp.progressia.client.graphics.input.InputEvent; import ru.windcorp.progressia.client.graphics.input.KeyEvent; -import ru.windcorp.progressia.client.graphics.input.WheelScrollEvent; +import ru.windcorp.progressia.client.graphics.input.KeyMatcher; import ru.windcorp.progressia.client.graphics.world.LocalPlayer; import ru.windcorp.progressia.client.localization.Localizer; import ru.windcorp.progressia.common.world.block.BlockData; import ru.windcorp.progressia.common.world.entity.EntityData; import ru.windcorp.progressia.common.world.tile.TileData; -import ru.windcorp.progressia.test.controls.CameraControls; -import ru.windcorp.progressia.test.controls.MovementControls; +import ru.windcorp.progressia.test.LayerButtonTest; +import ru.windcorp.progressia.test.LayerDebug; +import ru.windcorp.progressia.test.TestMusicPlayer; public class TestPlayerControls { @@ -44,10 +47,7 @@ public class TestPlayerControls { private final MovementControls movementControls = new MovementControls(); private final CameraControls cameraControls = new CameraControls(); - - private int selectedBlock = 0; - private int selectedTile = 0; - private boolean isBlockSelected = true; + private final InteractionControls interactionControls = new InteractionControls(); private LayerDebug debugLayer = null; @@ -62,11 +62,9 @@ public class TestPlayerControls { private void reset() { movementControls.reset(); cameraControls.reset(); + interactionControls.reset(); debugLayer = null; - selectedBlock = 0; - selectedTile = 0; - isBlockSelected = true; } public void applyPlayerControls() { @@ -76,52 +74,78 @@ public class TestPlayerControls { public void registerControls() { movementControls.registerControls(); cameraControls.registerControls(); + interactionControls.registerControls(); + + ControlTriggerRegistry triggers = ControlTriggerRegistry.getInstance(); + + triggers.register( + ControlTriggers.localOf( + "Test:PauseGame", + KeyEvent.class, + this::pauseGame, + new KeyMatcher("Escape")::matches + ) + ); + + triggers.register( + ControlTriggers.localOf( + "Test:ToggleFullscreen", + KeyEvent.class, + this::toggleFullscreen, + new KeyMatcher("F11")::matches + ) + ); + + triggers.register( + ControlTriggers.localOf( + "Test:ToggleVSync", + KeyEvent.class, + this::toggleVSync, + new KeyMatcher("F12")::matches + ) + ); + + triggers.register( + ControlTriggers.localOf( + "Test:ToggleDebugLayer", + KeyEvent.class, + this::toggleDebugLayer, + new KeyMatcher("F3")::matches + ) + ); + + triggers.register( + ControlTriggers.localOf( + "Test:SwitchLanguage", + KeyEvent.class, + this::switchLanguage, + new KeyMatcher("L")::matches + ) + ); + + triggers.register( + ControlTriggers.localOf( + "Test:StartNextMusic", + KeyEvent.class, + TestMusicPlayer::startNextNow, + new KeyMatcher("M")::matches + ) + ); } - public void handleInput(InputEvent event) { - if (event instanceof KeyEvent) { - if (onKeyEvent((KeyEvent) event)) { - event.consume(); - } - } - } - - private boolean onKeyEvent(KeyEvent event) { - if (!event.isPress()) - return false; - switch (event.getKey()) { - case GLFW.GLFW_KEY_ESCAPE: - handleEscape(); - break; - - case GLFW.GLFW_KEY_F11: - GraphicsInterface.makeFullscreen(!GraphicsBackend.isFullscreen()); - break; - - case GLFW.GLFW_KEY_F12: - GraphicsBackend.setVSyncEnabled(!GraphicsBackend.isVSyncEnabled()); - break; - - case GLFW.GLFW_KEY_F3: - handleDebugLayerSwitch(); - break; - - case GLFW.GLFW_KEY_L: - handleLanguageSwitch(); - break; - - default: - return false; - } - - return true; - } - - private void handleEscape() { + private void pauseGame() { GUI.addTopLayer(new LayerButtonTest()); } + + private void toggleFullscreen() { + GraphicsInterface.makeFullscreen(!GraphicsBackend.isFullscreen()); + } + + private void toggleVSync() { + GraphicsBackend.setVSyncEnabled(!GraphicsBackend.isVSyncEnabled()); + } - private void handleDebugLayerSwitch() { + private void toggleDebugLayer() { if (debugLayer == null) { this.debugLayer = new LayerDebug(); } @@ -133,41 +157,19 @@ public class TestPlayerControls { } } - private void handleLanguageSwitch() { + private void switchLanguage() { Localizer localizer = Localizer.getInstance(); - if (localizer.getLanguage().equals("ru-RU")) { - localizer.setLanguage("en-US"); + List languages = localizer.getLanguages(); + + int index = languages.indexOf(localizer.getLanguage()); + + if (index == languages.size() - 1) { + index = 0; } else { - localizer.setLanguage("ru-RU"); - } - } - - public void switchPlacingMode() { - isBlockSelected = !isBlockSelected; - } - - public void selectNextBlockOrTile(WheelScrollEvent event) { - if (isBlockSelected) { - selectedBlock += event.isUp() ? +1 : -1; - - int size = TestContent.PLACEABLE_BLOCKS.size(); - - if (selectedBlock < 0) { - selectedBlock = size - 1; - } else if (selectedBlock >= size) { - selectedBlock = 0; - } - } else { - selectedTile += event.isUp() ? +1 : -1; - - int size = TestContent.PLACEABLE_TILES.size(); - - if (selectedTile < 0) { - selectedTile = size - 1; - } else if (selectedTile >= size) { - selectedTile = 0; - } + index++; } + + localizer.setLanguage(languages.get(index)); } public EntityData getEntity() { @@ -183,15 +185,15 @@ public class TestPlayerControls { } public BlockData getSelectedBlock() { - return TestContent.PLACEABLE_BLOCKS.get(selectedBlock); + return interactionControls.getSelectedBlock(); } public TileData getSelectedTile() { - return TestContent.PLACEABLE_TILES.get(selectedTile); + return interactionControls.getSelectedTile(); } public boolean isBlockSelected() { - return isBlockSelected; + return interactionControls.isBlockSelected(); } public boolean isFlying() {