From 4e7cfe05e70ca5ec7d74980acfa03c06a4498a78 Mon Sep 17 00:00:00 2001 From: austin Date: Fri, 25 Apr 2025 15:55:24 -0400 Subject: [PATCH] bugfixes --- docs/src/progress/renderertodo.md | 3 ++ .../state/server/ServerCharacterData.java | 6 +-- .../entity/types/terrain/TerrainChunk.java | 14 ++++--- .../server/character/CharacterService.java | 2 +- .../character/PlayerCharacterCreation.java | 9 ++-- .../gridded/GriddedDataCellManager.java | 12 +++--- .../server/entity/ServerContentManager.java | 8 +++- .../serialization/ContentSerialization.java | 3 +- .../server/macro/character/Character.java | 3 +- .../character/CharacterDataSerializer.java | 42 +++++++++++++++++-- 10 files changed, 75 insertions(+), 27 deletions(-) diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index ca69282d..c7531913 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -1529,6 +1529,9 @@ Macro data unloading/loading Macro Character data serialization/deserialization Macro character compression/decompression on chunk load/unload ServerWorldData conversion methods are static now +Fix character data serialization only serializing dataType +Potential fix for realm undefined for server terrain physics entity +Fix macro character entities not being assigned ServerCharacterData diff --git a/src/main/java/electrosphere/entity/state/server/ServerCharacterData.java b/src/main/java/electrosphere/entity/state/server/ServerCharacterData.java index 8da64bfa..45acc22b 100644 --- a/src/main/java/electrosphere/entity/state/server/ServerCharacterData.java +++ b/src/main/java/electrosphere/entity/state/server/ServerCharacterData.java @@ -29,10 +29,10 @@ public class ServerCharacterData { } /** - * Attaches a ServerPlayerViewDirTree to a given entity + * Attaches a ServerCharacterData to a given entity * @param entity The entity to add to */ - public static void attachServerPlayerViewDirTree(Entity entity, int characterId){ + public static void attachServerCharacterData(Entity entity, int characterId){ ServerCharacterData tree = new ServerCharacterData(entity, characterId); entity.putData(EntityDataStrings.TREE_SERVERCHARACTERDATA, tree); } @@ -42,7 +42,7 @@ public class ServerCharacterData { * @param entity The entity * @return true if the entity contains character data, false otherwise */ - public static boolean hasServerPlayerCharacterDataTree(Entity entity){ + public static boolean hasServerCharacterDataTree(Entity entity){ return entity.containsKey(EntityDataStrings.TREE_SERVERCHARACTERDATA); } diff --git a/src/main/java/electrosphere/entity/types/terrain/TerrainChunk.java b/src/main/java/electrosphere/entity/types/terrain/TerrainChunk.java index 2db2f396..bb0c34b2 100644 --- a/src/main/java/electrosphere/entity/types/terrain/TerrainChunk.java +++ b/src/main/java/electrosphere/entity/types/terrain/TerrainChunk.java @@ -125,13 +125,15 @@ public class TerrainChunk { */ public static void serverCreateTerrainChunkEntity(Entity entity, TerrainChunkData data){ if(data.getVertices().length > 0){ - PhysicsEntityUtils.serverAttachTriGeomRigidBody(entity, data); Realm realm = Globals.realmManager.getEntityRealm(entity); - DBody terrainBody = PhysicsEntityUtils.getDBody(entity); - Vector3d entityPos = EntityUtils.getPosition(entity); - Quaterniond entityRot = EntityUtils.getRotation(entity); - PhysicsUtils.setRigidBodyTransform(realm.getCollisionEngine(), entityPos, entityRot, terrainBody); - entity.putData(EntityDataStrings.TERRAIN_IS_TERRAIN, true); + if(realm != null){ + PhysicsEntityUtils.serverAttachTriGeomRigidBody(entity, data); + DBody terrainBody = PhysicsEntityUtils.getDBody(entity); + Vector3d entityPos = EntityUtils.getPosition(entity); + Quaterniond entityRot = EntityUtils.getRotation(entity); + PhysicsUtils.setRigidBodyTransform(realm.getCollisionEngine(), entityPos, entityRot, terrainBody); + entity.putData(EntityDataStrings.TERRAIN_IS_TERRAIN, true); + } // ServerEntityUtils.initiallyPositionEntity(realm, rVal, position); // physicsObject = PhysicsUtils.attachTerrainRigidBody(physicsEntity,heightmap,true); // Realm realm = Globals.realmManager.getEntityRealm(physicsEntity); diff --git a/src/main/java/electrosphere/server/character/CharacterService.java b/src/main/java/electrosphere/server/character/CharacterService.java index 14a46299..6893bef3 100644 --- a/src/main/java/electrosphere/server/character/CharacterService.java +++ b/src/main/java/electrosphere/server/character/CharacterService.java @@ -102,7 +102,7 @@ public class CharacterService { * @param characterEntity The entity */ public static void saveCharacter(Entity characterEntity){ - if(!ServerCharacterData.hasServerPlayerCharacterDataTree(characterEntity)){ + if(!ServerCharacterData.hasServerCharacterDataTree(characterEntity)){ throw new Error("Trying to save entity hat does not contain character data!"); } ServerCharacterData characterData = ServerCharacterData.getServerCharacterData(characterEntity); diff --git a/src/main/java/electrosphere/server/character/PlayerCharacterCreation.java b/src/main/java/electrosphere/server/character/PlayerCharacterCreation.java index 9ffc79c4..5767b0e0 100644 --- a/src/main/java/electrosphere/server/character/PlayerCharacterCreation.java +++ b/src/main/java/electrosphere/server/character/PlayerCharacterCreation.java @@ -14,6 +14,7 @@ import electrosphere.net.server.ServerConnectionHandler; import electrosphere.net.server.player.Player; import electrosphere.net.server.protocol.CharacterProtocol; import electrosphere.server.datacell.Realm; +import electrosphere.server.datacell.ServerWorldData; /** * Deals with spawning player characters @@ -46,9 +47,9 @@ public class PlayerCharacterCreation { LoggerInterface.loggerEngine.INFO("Spawned entity for player. Entity id: " + newPlayerEntity.getId() + " Player id: " + playerObject.getId()); PlayerCharacterCreation.attachEntityToPlayerObject(newPlayerEntity,playerObject,connectionHandler); playerObject.setWorldPos(new Vector3i( - realm.getServerWorldData().convertRealToChunkSpace(spawnPoint.x), - realm.getServerWorldData().convertRealToChunkSpace(spawnPoint.y), - realm.getServerWorldData().convertRealToChunkSpace(spawnPoint.z) + ServerWorldData.convertRealToChunkSpace(spawnPoint.x), + ServerWorldData.convertRealToChunkSpace(spawnPoint.y), + ServerWorldData.convertRealToChunkSpace(spawnPoint.z) )); realm.getDataCellManager().addPlayerToRealm(playerObject); @@ -88,7 +89,7 @@ public class PlayerCharacterCreation { */ static void addPlayerServerBTrees(Entity entity, ServerConnectionHandler serverConnectionHandler){ ServerPlayerViewDirTree.attachServerPlayerViewDirTree(entity); - ServerCharacterData.attachServerPlayerViewDirTree(entity, serverConnectionHandler.getCharacterId()); + ServerCharacterData.attachServerCharacterData(entity, serverConnectionHandler.getCharacterId()); } /** diff --git a/src/main/java/electrosphere/server/datacell/gridded/GriddedDataCellManager.java b/src/main/java/electrosphere/server/datacell/gridded/GriddedDataCellManager.java index df0a2e25..bea63049 100644 --- a/src/main/java/electrosphere/server/datacell/gridded/GriddedDataCellManager.java +++ b/src/main/java/electrosphere/server/datacell/gridded/GriddedDataCellManager.java @@ -984,20 +984,20 @@ public class GriddedDataCellManager implements DataCellManager, VoxelCellManager if(positionToTest.x < 0){ returnPos.x = 0; } - if(positionToTest.x >= parent.getServerWorldData().convertChunkToRealSpace(parent.getServerWorldData().getWorldSizeDiscrete())){ - returnPos.x = parent.getServerWorldData().convertChunkToRealSpace(parent.getServerWorldData().getWorldSizeDiscrete()) - 1; + if(positionToTest.x >= ServerWorldData.convertChunkToRealSpace(parent.getServerWorldData().getWorldSizeDiscrete())){ + returnPos.x = ServerWorldData.convertChunkToRealSpace(parent.getServerWorldData().getWorldSizeDiscrete()) - 1; } if(positionToTest.y < 0){ returnPos.y = 0; } - if(positionToTest.y >= parent.getServerWorldData().convertChunkToRealSpace(parent.getServerWorldData().getWorldSizeDiscrete())){ - returnPos.y = parent.getServerWorldData().convertChunkToRealSpace(parent.getServerWorldData().getWorldSizeDiscrete()) - 1; + if(positionToTest.y >= ServerWorldData.convertChunkToRealSpace(parent.getServerWorldData().getWorldSizeDiscrete())){ + returnPos.y = ServerWorldData.convertChunkToRealSpace(parent.getServerWorldData().getWorldSizeDiscrete()) - 1; } if(positionToTest.z < 0){ returnPos.z = 0; } - if(positionToTest.z >= parent.getServerWorldData().convertChunkToRealSpace(parent.getServerWorldData().getWorldSizeDiscrete())){ - returnPos.z = parent.getServerWorldData().convertChunkToRealSpace(parent.getServerWorldData().getWorldSizeDiscrete()) - 1; + if(positionToTest.z >= ServerWorldData.convertChunkToRealSpace(parent.getServerWorldData().getWorldSizeDiscrete())){ + returnPos.z = ServerWorldData.convertChunkToRealSpace(parent.getServerWorldData().getWorldSizeDiscrete()) - 1; } return returnPos; } diff --git a/src/main/java/electrosphere/server/entity/ServerContentManager.java b/src/main/java/electrosphere/server/entity/ServerContentManager.java index 1758dd06..5a770ebf 100644 --- a/src/main/java/electrosphere/server/entity/ServerContentManager.java +++ b/src/main/java/electrosphere/server/entity/ServerContentManager.java @@ -82,8 +82,12 @@ public class ServerContentManager { if(Race.hasRace(character)){ Race race = Race.getRace(character); String creatureName = race.getAssociatedCreature(); + if(creatureName == null){ + throw new Error("Creature name not defined! " + character.getId()); + } //place macro object - CreatureUtils.serverSpawnBasicCreature(realm, character.getPos(), creatureName, null); + Entity characterEntity = CreatureUtils.serverSpawnBasicCreature(realm, character.getPos(), creatureName, null); + ServerCharacterData.attachServerCharacterData(characterEntity, character.getId()); } } } @@ -104,7 +108,7 @@ public class ServerContentManager { //store all character entities in database for(Entity entity : entities){ - if(ServerCharacterData.hasServerPlayerCharacterDataTree(entity)){ + if(ServerCharacterData.hasServerCharacterDataTree(entity)){ CharacterService.saveCharacter(entity); } } diff --git a/src/main/java/electrosphere/server/entity/serialization/ContentSerialization.java b/src/main/java/electrosphere/server/entity/serialization/ContentSerialization.java index 17c1ecd3..0f89e0ec 100644 --- a/src/main/java/electrosphere/server/entity/serialization/ContentSerialization.java +++ b/src/main/java/electrosphere/server/entity/serialization/ContentSerialization.java @@ -7,6 +7,7 @@ import java.util.List; import electrosphere.entity.Entity; import electrosphere.entity.EntityUtils; import electrosphere.entity.state.attach.AttachUtils; +import electrosphere.entity.state.server.ServerCharacterData; import electrosphere.entity.types.EntityTypes; import electrosphere.entity.types.EntityTypes.EntityType; import electrosphere.entity.types.common.CommonEntityUtils; @@ -37,7 +38,7 @@ public class ContentSerialization { public static ContentSerialization constructContentSerialization(Collection entities){ ContentSerialization rVal = new ContentSerialization(); for(Entity entity : entities){ - if(!CreatureUtils.hasControllerPlayerId(entity)){ + if(!CreatureUtils.hasControllerPlayerId(entity) && !ServerCharacterData.hasServerCharacterDataTree(entity)){ EntityType type = CommonEntityUtils.getEntityType(entity); if(type != null){ EntitySerialization serializedEntity = constructEntitySerialization(entity); diff --git a/src/main/java/electrosphere/server/macro/character/Character.java b/src/main/java/electrosphere/server/macro/character/Character.java index f67abaf2..c0ced7b9 100644 --- a/src/main/java/electrosphere/server/macro/character/Character.java +++ b/src/main/java/electrosphere/server/macro/character/Character.java @@ -42,7 +42,8 @@ public class Character implements MacroObject { } public Character(){ - + this.id = character_id_iterator; + character_id_iterator++; } @Override diff --git a/src/main/java/electrosphere/server/macro/character/CharacterDataSerializer.java b/src/main/java/electrosphere/server/macro/character/CharacterDataSerializer.java index 9f9a8b36..28273e8a 100644 --- a/src/main/java/electrosphere/server/macro/character/CharacterDataSerializer.java +++ b/src/main/java/electrosphere/server/macro/character/CharacterDataSerializer.java @@ -6,6 +6,8 @@ import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonParseException; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; import electrosphere.server.macro.character.diety.Diety; import electrosphere.server.macro.race.Race; @@ -15,11 +17,12 @@ import electrosphere.server.macro.town.Town; /** * Deserializes noise modules */ -public class CharacterDataSerializer implements JsonDeserializer { +public class CharacterDataSerializer implements JsonDeserializer, JsonSerializer { @Override public CharacterData deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - switch(json.getAsJsonObject().get("dataType").getAsString()){ + String type = json.getAsJsonObject().get("dataType").getAsString(); + switch(type){ //race case CharacterDataStrings.RACE: { @@ -40,8 +43,41 @@ public class CharacterDataSerializer implements JsonDeserializer case CharacterDataStrings.TOWN: { return context.deserialize(json, Town.class); } + + default: { + throw new Error("Failed to deserialize datatype: " + type); + } + } + } + + @Override + public JsonElement serialize(CharacterData src, Type typeOfSrc, JsonSerializationContext context) { + switch(src.getDataType()){ + + //race + case CharacterDataStrings.RACE: { + return context.serialize((Race)src); + } + + //diety data + case CharacterDataStrings.DIETY: { + return context.serialize((Diety)src); + } + + //a structure + case CharacterDataStrings.STRUCTURE: { + return context.serialize((Structure)src); + } + + //a town + case CharacterDataStrings.TOWN: { + return context.serialize((Town)src); + } + + default: { + throw new Error("Failed to serialize datatype: " + src.getDataType()); + } } - return null; } }