From c96c07334a784ae0ce0e99d99ec1953ffd6e7658 Mon Sep 17 00:00:00 2001 From: austin Date: Sun, 27 Apr 2025 17:25:39 -0400 Subject: [PATCH] fixes and cursor work --- docs/src/progress/renderertodo.md | 4 ++ .../client/terrain/editing/BlockEditing.java | 9 ++- .../terrain/manager/ClientTerrainManager.java | 34 ++++++------ .../mainmenu/MenuGeneratorsLevelEditor.java | 5 +- .../controls/cursor/CursorState.java | 55 +++++++++---------- .../state/equip/ClientToolbarState.java | 2 +- .../server/protocol/CharacterProtocol.java | 4 +- .../physics/terrain/diskmap/ChunkDiskMap.java | 22 ++++++-- 8 files changed, 74 insertions(+), 61 deletions(-) diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index db411c79..3b8de63a 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -1569,6 +1569,10 @@ Fix block meshgen (04/27/2025) Fab cursor rotation + actually place rotated fab Fix terrain and blocks not saving/loading to/from disk +Fix swapping to/from editor entity in main game mode +Block cursor work +ChunkDiskMap code org +Filter procedural worlds out of level select menu diff --git a/src/main/java/electrosphere/client/terrain/editing/BlockEditing.java b/src/main/java/electrosphere/client/terrain/editing/BlockEditing.java index 489d57de..284c0bc4 100644 --- a/src/main/java/electrosphere/client/terrain/editing/BlockEditing.java +++ b/src/main/java/electrosphere/client/terrain/editing/BlockEditing.java @@ -4,7 +4,6 @@ import org.joml.Vector3i; import electrosphere.client.script.ScriptClientVoxelUtils; import electrosphere.engine.Globals; -import electrosphere.entity.EntityUtils; /** * Utilities for editing blocks @@ -17,9 +16,9 @@ public class BlockEditing { * @param metadata The metadata of the block */ public static void editBlock(short type, short metadata){ - Vector3i cornerVoxel = Globals.cursorState.getBlockCornerVoxelPos(); + Vector3i cornerVoxel = Globals.clientWorldData.convertRealToBlockSpace(Globals.cursorState.getBlockCursorPos()); int blockSize = Globals.cursorState.getBlockSize(); - Vector3i chunkPos = Globals.clientWorldData.convertRealToWorldSpace(EntityUtils.getPosition(Globals.playerBlockCursor)); + Vector3i chunkPos = Globals.clientWorldData.convertRealToWorldSpace(Globals.cursorState.getBlockCursorPos()); ScriptClientVoxelUtils.clientRequestEditBlock(chunkPos, cornerVoxel, type, metadata, blockSize); } @@ -27,9 +26,9 @@ public class BlockEditing { * Destroy blocks */ public static void destroyBlock(){ - Vector3i cornerVoxel = Globals.cursorState.getBlockCornerVoxelPos(); + Vector3i cornerVoxel = Globals.clientWorldData.convertRealToBlockSpace(Globals.cursorState.getBlockCursorPos()); int blockSize = Globals.cursorState.getBlockSize(); - Vector3i chunkPos = Globals.clientWorldData.convertRealToWorldSpace(EntityUtils.getPosition(Globals.playerBlockCursor)); + Vector3i chunkPos = Globals.clientWorldData.convertRealToWorldSpace(Globals.cursorState.getBlockCursorPos()); ScriptClientVoxelUtils.clientRequestEditBlock(chunkPos, cornerVoxel, (short)0, (short)0, blockSize); } diff --git a/src/main/java/electrosphere/client/terrain/manager/ClientTerrainManager.java b/src/main/java/electrosphere/client/terrain/manager/ClientTerrainManager.java index 7fb36df2..5657cebd 100644 --- a/src/main/java/electrosphere/client/terrain/manager/ClientTerrainManager.java +++ b/src/main/java/electrosphere/client/terrain/manager/ClientTerrainManager.java @@ -16,7 +16,6 @@ import org.joml.Vector3i; import electrosphere.client.block.BlockChunkCache; import electrosphere.client.block.BlockChunkData; -import electrosphere.client.scene.ClientWorldData; import electrosphere.client.terrain.cache.ChunkData; import electrosphere.client.terrain.cache.ClientTerrainCache; import electrosphere.client.terrain.cells.ClientDrawCellManager; @@ -39,13 +38,15 @@ import electrosphere.util.math.HashUtils; */ public class ClientTerrainManager { - //queues messages from server - List messageQueue = new LinkedList(); + /** + * queues messages from server + */ + private List messageQueue = new LinkedList(); /** * Locks the terrain manager (eg if adding message from network) */ - static Semaphore lock = new Semaphore(1); + private static Semaphore lock = new Semaphore(1); /** * Maximum concurrent terrain requests @@ -57,10 +58,14 @@ public class ClientTerrainManager { */ public static final int FAILED_REQUEST_THRESHOLD = 500; - //The interpolation ratio of terrain + /** + * The interpolation ratio of terrain + */ public static final int INTERPOLATION_RATIO = ServerTerrainManager.SERVER_TERRAIN_MANAGER_INTERPOLATION_RATIO; - //caches chunks from server + /** + * caches chunks from server + */ static final int CACHE_SIZE = 2500 + (int)(ClientDrawCellManager.FULL_RES_DIST * 10) + (int)(ClientDrawCellManager.HALF_RES_DIST * 10); /** @@ -71,37 +76,32 @@ public class ClientTerrainManager { /** * used for caching the macro values */ - ClientTerrainCache terrainCache; + private ClientTerrainCache terrainCache; /** * Caches block data */ - BlockChunkCache blockCache; - - /** - * The world data for the client - */ - ClientWorldData clientWorldData; + private BlockChunkCache blockCache; /** * The queue of terrain chunk data to be buffered to gpu */ - static List terrainChunkGenerationQueue = new LinkedList(); + private static List terrainChunkGenerationQueue = new LinkedList(); /** * Tracks what outgoing requests are currently active */ - Map requestedMap = new HashMap(); + private Map requestedMap = new HashMap(); /** * Tracks what outgoing block requests are currently active */ - Map requestedBlockMap = new HashMap(); + private Map requestedBlockMap = new HashMap(); /** * Used to clear the request map */ - List toClearFailedRequests = new LinkedList(); + private List toClearFailedRequests = new LinkedList(); /** * Constructor diff --git a/src/main/java/electrosphere/client/ui/menu/mainmenu/MenuGeneratorsLevelEditor.java b/src/main/java/electrosphere/client/ui/menu/mainmenu/MenuGeneratorsLevelEditor.java index 1f388287..d6855ce1 100644 --- a/src/main/java/electrosphere/client/ui/menu/mainmenu/MenuGeneratorsLevelEditor.java +++ b/src/main/java/electrosphere/client/ui/menu/mainmenu/MenuGeneratorsLevelEditor.java @@ -1,6 +1,7 @@ package electrosphere.client.ui.menu.mainmenu; import java.util.List; +import java.util.stream.Collectors; import electrosphere.client.ui.components.InputMacros; import electrosphere.client.ui.components.VoxelSelectionPanel; @@ -114,7 +115,9 @@ public class MenuGeneratorsLevelEditor { existingLevelColumn.setAlignContent(YogaAlignment.Start); rVal.addChild(existingLevelColumn); - List saveNames = SaveUtils.getSaves(); + List saveNames = SaveUtils.getSaves().stream().filter((String saveName) -> { + return !SaveUtils.isProcedural(saveName); + }).collect(Collectors.toList()); for(String saveName : saveNames){ //delete level button diff --git a/src/main/java/electrosphere/controls/cursor/CursorState.java b/src/main/java/electrosphere/controls/cursor/CursorState.java index 4e4a588d..f1781e3a 100644 --- a/src/main/java/electrosphere/controls/cursor/CursorState.java +++ b/src/main/java/electrosphere/controls/cursor/CursorState.java @@ -4,7 +4,6 @@ import java.util.Arrays; import org.joml.Quaterniond; import org.joml.Vector3d; -import org.joml.Vector3i; import electrosphere.client.block.BlockChunkData; import electrosphere.client.entity.camera.CameraEntityUtils; @@ -249,20 +248,21 @@ public class CursorState { double y = 0; double z = 0; double sizeMult = BlockChunkData.BLOCK_SIZE_MULTIPLIER * blockSize; - if(input.x % sizeMult > sizeMult / 2.0){ - x = input.x - input.x % sizeMult + sizeMult + sizeMult / 2.0; + double alignMult = BlockChunkData.BLOCK_SIZE_MULTIPLIER; + if(input.x % alignMult > alignMult / 2.0){ + x = input.x - input.x % alignMult + alignMult + sizeMult / 2.0; } else { - x = input.x - input.x % sizeMult + sizeMult / 2.0; + x = input.x - input.x % alignMult + sizeMult / 2.0; } - if(input.y % sizeMult > sizeMult / 2.0){ - y = input.y - input.y % sizeMult + sizeMult + sizeMult / 2.0; + if(input.y % alignMult > alignMult / 2.0){ + y = input.y - input.y % alignMult + alignMult + sizeMult / 2.0; } else { - y = input.y - input.y % sizeMult + sizeMult / 2.0; + y = input.y - input.y % alignMult + sizeMult / 2.0; } - if(input.z % sizeMult > sizeMult / 2.0){ - z = input.z - input.z % sizeMult + sizeMult + sizeMult / 2.0; + if(input.z % alignMult > alignMult / 2.0){ + z = input.z - input.z % alignMult + alignMult + sizeMult / 2.0; } else { - z = input.z - input.z % sizeMult + sizeMult / 2.0; + z = input.z - input.z % alignMult + sizeMult / 2.0; } return new Vector3d(x,y,z); } @@ -276,36 +276,33 @@ public class CursorState { double x = 0; double y = 0; double z = 0; - double sizeMult = BlockChunkData.BLOCK_SIZE_MULTIPLIER * blockSize; - if(input.x % sizeMult > sizeMult / 2.0){ - x = input.x - input.x % sizeMult + sizeMult; + double alignMult = BlockChunkData.BLOCK_SIZE_MULTIPLIER; + if(input.x % alignMult > alignMult / 2.0){ + x = input.x - input.x % alignMult + alignMult; } else { - x = input.x - input.x % sizeMult; + x = input.x - input.x % alignMult; } - if(input.y % sizeMult > sizeMult / 2.0){ - y = input.y - input.y % sizeMult + sizeMult; + if(input.y % alignMult > alignMult / 2.0){ + y = input.y - input.y % alignMult + alignMult; } else { - y = input.y - input.y % sizeMult; + y = input.y - input.y % alignMult; } - if(input.z % sizeMult > sizeMult / 2.0){ - z = input.z - input.z % sizeMult + sizeMult; + if(input.z % alignMult > alignMult / 2.0){ + z = input.z - input.z % alignMult + alignMult; } else { - z = input.z - input.z % sizeMult; + z = input.z - input.z % alignMult; } return new Vector3d(x,y,z); } /** - * Gets the voxel space position of the corner of the block cursor - * @return The voxel space position + * Gets the block cursor position + * @return The block cursor position */ - public Vector3i getBlockCornerVoxelPos(){ - if(Globals.playerBlockCursor == null){ - throw new Error("Block cursor is null!"); - } - Vector3d realPos = EntityUtils.getPosition(Globals.playerBlockCursor); - Vector3d clamped = this.clampPositionToBlockCorner(realPos); - return Globals.clientWorldData.convertRealToBlockSpace(clamped); + public Vector3d getBlockCursorPos(){ + double sizeMult = BlockChunkData.BLOCK_SIZE_MULTIPLIER * blockSize; + Vector3d posRaw = new Vector3d(EntityUtils.getPosition(Globals.playerBlockCursor)).sub(sizeMult/2.0,sizeMult/2.0,sizeMult/2.0); + return posRaw; } /** diff --git a/src/main/java/electrosphere/entity/state/equip/ClientToolbarState.java b/src/main/java/electrosphere/entity/state/equip/ClientToolbarState.java index b89d2553..231227f0 100644 --- a/src/main/java/electrosphere/entity/state/equip/ClientToolbarState.java +++ b/src/main/java/electrosphere/entity/state/equip/ClientToolbarState.java @@ -96,7 +96,7 @@ public class ClientToolbarState implements BehaviorTree { if(targetPoint.getEquipClassWhitelist() != null && !targetPoint.getEquipClassWhitelist().contains(equipItemClass)){ targetPoint = equipInventoryState.getEquipPointFromSlot(toolbarData.getCombinedSlot()); } - equippedEntity = toEquip; + equippedEntity = toEquip; // //visual transforms diff --git a/src/main/java/electrosphere/net/server/protocol/CharacterProtocol.java b/src/main/java/electrosphere/net/server/protocol/CharacterProtocol.java index ea39ec43..43429a53 100644 --- a/src/main/java/electrosphere/net/server/protocol/CharacterProtocol.java +++ b/src/main/java/electrosphere/net/server/protocol/CharacterProtocol.java @@ -117,7 +117,7 @@ public class CharacterProtocol implements ServerProtocolTemplate races = Globals.gameConfigCurrent.getCreatureTypeLoader().getPlayableRaces(); @@ -173,7 +173,7 @@ public class CharacterProtocol implements ServerProtocolTemplate