network entity id translation fixes
	
		
			
	
		
	
	
		
	
		
			Some checks failed
		
		
	
	
		
			
				
	
				studiorailgun/Renderer/pipeline/head There was a failure building this commit
				
			
		
		
	
	
				
					
				
			
		
			Some checks failed
		
		
	
	studiorailgun/Renderer/pipeline/head There was a failure building this commit
				
			This commit is contained in:
		
							parent
							
								
									ab00782e93
								
							
						
					
					
						commit
						0a74bed5d6
					
				| @ -26,6 +26,9 @@ public class ClientSceneWrapper { | ||||
|     Map<Integer,Integer> clientToServerIdMap = new ConcurrentHashMap<Integer,Integer>(); | ||||
|     Map<Integer,Integer> serverToClientIdMap = new ConcurrentHashMap<Integer,Integer>(); | ||||
| 
 | ||||
|     //The list of server IDs that have been deleted | ||||
|     Map<Integer,Boolean> deletedServerIds = new ConcurrentHashMap<Integer,Boolean>(); | ||||
| 
 | ||||
|     //The scene backing the wrapper | ||||
|     Scene scene; | ||||
| 
 | ||||
| @ -52,7 +55,7 @@ public class ClientSceneWrapper { | ||||
|      * @param serverId The server's provided ID | ||||
|      */ | ||||
|     public void mapIdToId(int clientId, int serverId){ | ||||
|         LoggerInterface.loggerNetworking.DEBUG("MapID: " + clientId + " <===> " + serverId); | ||||
|         LoggerInterface.loggerNetworking.DEBUG("[CLIENT] MapID: " + clientId + " <===> " + serverId); | ||||
|         clientToServerIdMap.put(clientId, serverId); | ||||
|         serverToClientIdMap.put(serverId, clientId); | ||||
|     } | ||||
| @ -103,6 +106,30 @@ public class ClientSceneWrapper { | ||||
|         return clientToServerIdMap.containsKey(id); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Deregisters the translation mapping for this entity | ||||
|      * @param clientEntity The client entity | ||||
|      */ | ||||
|     public void deregisterTranslationMapping(Entity clientEntity){ | ||||
|         if(clientToServerMapContainsId(clientEntity.getId())){ | ||||
|             //remove from client->server map | ||||
|             int serverId = clientToServerIdMap.remove(clientEntity.getId()); | ||||
|             //remove from server->client map | ||||
|             serverToClientIdMap.remove(serverId); | ||||
|             deletedServerIds.put(serverId,true); | ||||
|             LoggerInterface.loggerNetworking.DEBUG("[CLIENT] Remove scene from client<->server translation layer: " + clientEntity.getId() + "<->" + serverId); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Checks if the client scene wrapper has deleted this id or not | ||||
|      * @param serverId The server id | ||||
|      * @return true if it was registered at one point and has since been deleted, false otherwise | ||||
|      */ | ||||
|     public boolean hasBeenDeleted(int serverId){ | ||||
|         return deletedServerIds.containsKey(serverId); | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * Gets the entity provided a server-provided id | ||||
| @ -139,7 +166,7 @@ public class ClientSceneWrapper { | ||||
|         if(clientToServerIdMap.containsKey(id)){ | ||||
|             LoggerInterface.loggerNetworking.WARNING("Client->Server Map entity: " + clientToServerIdMap.get(id)); | ||||
|         } | ||||
|         if(clientToServerIdMap.containsKey(id)){ | ||||
|         if(serverToClientIdMap.containsKey(id)){ | ||||
|             LoggerInterface.loggerNetworking.WARNING("Server->Client Map entity: " + serverToClientIdMap.get(id)); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @ -120,6 +120,7 @@ public class EntityUtils { | ||||
|     public static void cleanUpEntity(Entity e){ | ||||
|         //remove from client | ||||
|         Globals.clientSceneWrapper.getScene().deregisterEntity(e); | ||||
|         Globals.clientSceneWrapper.deregisterTranslationMapping(e); | ||||
|         //remove from all server classes | ||||
|         if(Globals.realmManager != null){ | ||||
|             Realm realm = Globals.realmManager.getEntityRealm(e); | ||||
|  | ||||
| @ -3,6 +3,7 @@ package electrosphere.entity; | ||||
| import electrosphere.engine.Globals; | ||||
| import electrosphere.entity.btree.BehaviorTree; | ||||
| import electrosphere.entity.types.attach.AttachUtils; | ||||
| import electrosphere.logger.LoggerInterface; | ||||
| 
 | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| @ -157,5 +158,15 @@ public class Scene { | ||||
|     public List<Entity> getEntityList(){ | ||||
|         return entityList; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Describes the scene in log messages | ||||
|      */ | ||||
|     public void describeScene(){ | ||||
|         LoggerInterface.loggerEngine.WARNING("Entities present in scene:"); | ||||
|         for(Entity entity : this.entityList){ | ||||
|             LoggerInterface.loggerEngine.WARNING(entity.getId() + ""); | ||||
|         } | ||||
|     } | ||||
|      | ||||
| } | ||||
|  | ||||
| @ -12,6 +12,7 @@ import electrosphere.entity.state.equip.ServerEquipState; | ||||
| import electrosphere.entity.state.gravity.GravityUtils; | ||||
| import electrosphere.entity.types.creature.CreatureUtils; | ||||
| import electrosphere.entity.types.item.ItemUtils; | ||||
| import electrosphere.logger.LoggerInterface; | ||||
| import electrosphere.net.parser.net.message.EntityMessage; | ||||
| import electrosphere.net.parser.net.message.InventoryMessage; | ||||
| import electrosphere.net.parser.net.message.NetworkMessage; | ||||
| @ -103,7 +104,6 @@ public class InventoryUtils { | ||||
|             //if we are the server, immediately send required packets | ||||
|             ServerDataCell dataCell = DataCellSearchUtils.getEntityDataCell(item); | ||||
|             // ServerDataCell dataCell = Globals.dataCellLocationResolver.getDataCellAtPoint(EntityUtils.getPosition(item),item); | ||||
|             dataCell.getScene().deregisterEntity(item); | ||||
|             //broadcast destroy entity | ||||
|             dataCell.broadcastNetworkMessage(EntityMessage.constructDestroyMessage(item.getId())); | ||||
|             //tell controlling player that they have an item in their inventory | ||||
| @ -166,6 +166,7 @@ public class InventoryUtils { | ||||
|             UnrelationalInventoryState inventory = getNaturalInventory(parentContainer); | ||||
|             //create item | ||||
|             //TODO: optimize by directly creating the container item instead of first spawning regular item | ||||
|             LoggerInterface.loggerNetworking.DEBUG("[CLIENT] Spawning temporary in-world item before placing into inventory"); | ||||
|             Entity spawnedItem = ItemUtils.clientSpawnBasicItem(type); | ||||
|             //convert to in-inventory | ||||
|             Entity inventoryItem = ItemUtils.clientRecreateContainerItem(spawnedItem, parentContainer); | ||||
|  | ||||
| @ -30,7 +30,7 @@ public class LoggerInterface { | ||||
|      */ | ||||
|     public static void initLoggers(){ | ||||
|         loggerStartup = new Logger("Startup", LogLevel.WARNING); | ||||
|         loggerNetworking = new Logger("Networking", LogLevel.WARNING); | ||||
|         loggerNetworking = new Logger("Networking", LogLevel.DEBUG); | ||||
|         loggerFileIO = new Logger("File IO", LogLevel.WARNING); | ||||
|         loggerGameLogic = new Logger("Game Logic", LogLevel.WARNING); | ||||
|         loggerRenderer = new Logger("Renderer", LogLevel.WARNING); | ||||
|  | ||||
| @ -21,7 +21,7 @@ public class NetUtils { | ||||
| //    } | ||||
|      | ||||
|     public static EntityMessage createSetCreatureControllerIdEntityMessage(Entity e){ | ||||
|         LoggerInterface.loggerNetworking.DEBUG("Entity " + e.getId() + " set controller id: " + CreatureUtils.getControllerPlayerId(e)); | ||||
|         LoggerInterface.loggerNetworking.DEBUG("[CLIENT] Entity " + e.getId() + " set controller id: " + CreatureUtils.getControllerPlayerId(e)); | ||||
|         EntityMessage rVal = EntityMessage.constructsetPropertyMessage(e.getId(), System.currentTimeMillis(), 0, CreatureUtils.getControllerPlayerId(e)); | ||||
|         return rVal; | ||||
|     } | ||||
|  | ||||
| @ -91,7 +91,7 @@ public class EntityProtocol implements ClientProtocolTemplate<EntityMessage> { | ||||
|                 } | ||||
|                 break; | ||||
|             case SPAWNCREATURE: { | ||||
|                 LoggerInterface.loggerNetworking.DEBUG("Spawn Creature " + message.getentityID() + " at " + message.getpositionX() + " " + message.getpositionY() + " " + message.getpositionZ()); | ||||
|                 LoggerInterface.loggerNetworking.DEBUG("[CLIENT] Spawn Creature " + message.getentityID() + " at " + message.getpositionX() + " " + message.getpositionY() + " " + message.getpositionZ()); | ||||
|                 CreatureTemplate template = Utilities.deserialize(message.getcreatureTemplate(), CreatureTemplate.class); | ||||
|                 newlySpawnedEntity = CreatureUtils.clientSpawnBasicCreature(template.getCreatureType(),template); | ||||
|                 ClientEntityUtils.initiallyPositionEntity( | ||||
| @ -122,7 +122,7 @@ public class EntityProtocol implements ClientProtocolTemplate<EntityMessage> { | ||||
|                 } | ||||
|             } break; | ||||
|             case SPAWNITEM: { | ||||
|                 LoggerInterface.loggerNetworking.DEBUG("Spawn Item " + message.getentityID() + " at " + message.getpositionX() + " " + message.getpositionY() + " " + message.getpositionZ()); | ||||
|                 LoggerInterface.loggerNetworking.DEBUG("[CLIENT] Spawn Item " + message.getentityID() + " at " + message.getpositionX() + " " + message.getpositionY() + " " + message.getpositionZ()); | ||||
|                 //spawn item | ||||
|                 String itemType = message.getcreatureTemplate(); | ||||
|                 newlySpawnedEntity = ItemUtils.clientSpawnBasicItem(itemType); | ||||
| @ -135,7 +135,7 @@ public class EntityProtocol implements ClientProtocolTemplate<EntityMessage> { | ||||
|                 Globals.clientSceneWrapper.mapIdToId(newlySpawnedEntity.getId(), message.getentityID()); | ||||
|             } break; | ||||
|             case SPAWNFOLIAGESEED: { | ||||
|                 LoggerInterface.loggerNetworking.DEBUG("Spawn foliage " + message.getentityID() + " at " + message.getpositionX() + " " + message.getpositionY() + " " + message.getpositionZ()); | ||||
|                 LoggerInterface.loggerNetworking.DEBUG("[CLIENT] Spawn foliage " + message.getentityID() + " at " + message.getpositionX() + " " + message.getpositionY() + " " + message.getpositionZ()); | ||||
|                 String type = message.getcreatureTemplate(); | ||||
|                 newlySpawnedEntity = FoliageUtils.spawnBasicFoliage(type,message.getfoliageSeed()); | ||||
|                 ClientEntityUtils.initiallyPositionEntity( | ||||
| @ -146,7 +146,7 @@ public class EntityProtocol implements ClientProtocolTemplate<EntityMessage> { | ||||
|                 Globals.clientSceneWrapper.mapIdToId(newlySpawnedEntity.getId(), message.getentityID()); | ||||
|             } break; | ||||
|             case SPAWNOBJECT: { | ||||
|                 LoggerInterface.loggerNetworking.DEBUG("Spawn object " + message.getentityID() + " at " + message.getpositionX() + " " + message.getpositionY() + " " + message.getpositionZ()); | ||||
|                 LoggerInterface.loggerNetworking.DEBUG("[CLIENT] Spawn object " + message.getentityID() + " at " + message.getpositionX() + " " + message.getpositionY() + " " + message.getpositionZ()); | ||||
|                 //spawn item | ||||
|                 String objectType = message.getcreatureTemplate(); | ||||
|                 newlySpawnedEntity = ObjectUtils.clientSpawnBasicObject(objectType); | ||||
|  | ||||
| @ -24,7 +24,7 @@ public class PlayerProtocol implements ClientProtocolTemplate<PlayerMessage> { | ||||
|         switch(message.getMessageSubtype()){ | ||||
|             case SET_ID: | ||||
|                 Globals.clientPlayer = new Player(message.getplayerID()); | ||||
|                 LoggerInterface.loggerNetworking.DEBUG("Player ID is " + Globals.clientPlayer.getId()); | ||||
|                 LoggerInterface.loggerNetworking.DEBUG("[CLIENT] Player ID is " + Globals.clientPlayer.getId()); | ||||
|                 break; | ||||
|             case SETINITIALDISCRETEPOSITION: | ||||
|                 Globals.clientPlayerData.setWorldPos(new Vector3i(message.getinitialDiscretePositionX(), message.getinitialDiscretePositionY(), message.getinitialDiscretePositionZ())); | ||||
|  | ||||
| @ -94,7 +94,7 @@ public class ServerConnectionHandler implements Runnable { | ||||
|     public ServerConnectionHandler(Socket socket) { | ||||
|         this.socket = socket; | ||||
|         this.playerID = Player.getNewId(); | ||||
|         LoggerInterface.loggerNetworking.INFO("Player ID: " + playerID); | ||||
|         LoggerInterface.loggerNetworking.INFO("[SERVER] Player ID: " + playerID); | ||||
|         this.messageProtocol = new MessageProtocol(this); | ||||
|     } | ||||
| 
 | ||||
| @ -106,7 +106,7 @@ public class ServerConnectionHandler implements Runnable { | ||||
|     public ServerConnectionHandler(InputStream serverInputStream, OutputStream serverOutputStream){ | ||||
|         this.local = true; | ||||
|         this.playerID = Player.getNewId(); | ||||
|         LoggerInterface.loggerNetworking.INFO("Player ID: " + playerID); | ||||
|         LoggerInterface.loggerNetworking.INFO("[SERVER] Player ID: " + playerID); | ||||
|         inputStream = serverInputStream; | ||||
|         outputStream = serverOutputStream; | ||||
|         this.messageProtocol = new MessageProtocol(this); | ||||
|  | ||||
| @ -108,14 +108,17 @@ public class ClientSynchronizationManager { | ||||
|                 ; | ||||
|                 Globals.clientSceneWrapper.dumpTranslationLayerStatus(); | ||||
|                 Globals.clientSceneWrapper.dumpIdData(message.getentityId()); | ||||
|                 Globals.clientSceneWrapper.getScene().describeScene(); | ||||
|                 throw new IllegalStateException(errorMessage); | ||||
|             } else if(!Globals.clientSceneWrapper.containsServerId(message.getentityId())){ | ||||
|             } else if(!Globals.clientSceneWrapper.containsServerId(message.getentityId()) && !Globals.clientSceneWrapper.hasBeenDeleted(message.getentityId())){ | ||||
|                 String errorMessage =  | ||||
|                 "Client received synchronization packet for entity that does not exists on client!\n" + | ||||
|                 "This ID was never created on the client, yet the client is receiving a synchronization packet for it!\n" + | ||||
|                 "Entity id in network message: " + message.getentityId() | ||||
|                 ; | ||||
|                 Globals.clientSceneWrapper.dumpTranslationLayerStatus(); | ||||
|                 Globals.clientSceneWrapper.dumpIdData(message.getentityId()); | ||||
|                 Globals.clientSceneWrapper.getScene().describeScene(); | ||||
|                 throw new IllegalStateException(errorMessage); | ||||
|             } | ||||
| 
 | ||||
|  | ||||
| @ -73,6 +73,9 @@ public class ServerEquipStateTests extends EntityTestTemplate { | ||||
|         ServerEquipState serverEquipState = ServerEquipState.getServerEquipState(creature); | ||||
|         serverEquipState.commandAttemptEquip(inInventoryItem, serverEquipState.getEquipPoint("handsCombined")); | ||||
| 
 | ||||
|         //render a frame so network propagates to client | ||||
|         TestEngineUtils.simulateFrames(1); | ||||
| 
 | ||||
|         //attempt to equip second katana | ||||
|         Entity inInventoryItem2 = InventoryUtils.serverAttemptStoreItem(creature, katana2); | ||||
|         serverEquipState.commandAttemptEquip(inInventoryItem2, serverEquipState.getEquipPoint("handsCombined")); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user