public UrlReference <T> GetUrlReferenceFromAssetId <T>(SerializableGuid assetId) where T : class { var mapIndex = _assetIdToMappingIndex[assetId]; var contentPath = _assetMappings[mapIndex].FilePath; return(new UrlReference <T>(contentPath)); }
public string GetContentPathFromAssetId(SerializableGuid assetId) { var mapIndex = _assetIdToMappingIndex[assetId]; var contentPath = _assetMappings[mapIndex].FilePath; return(contentPath); }
private Entity CreateAndAddClientPlayerEntity( SimulationTickNumber simulationTickNumber, SerializableGuid playerId, string playerName, ref Vector3 position, ref Quaternion rotation, bool isLocalEntity) { var gameplayScene = _lazyLoadedScene.GetGameplayScene(); var assetDefinitions = _lazyLoadedScene.GetNetworkAssetDefinitions(); Debug.Assert(!_networkEntityIdToEntityDataMap.ContainsKey(playerId)); var networkEntityId = playerId; var prefabUrl = isLocalEntity ? assetDefinitions.PlayerAssets.ClientLocalPlayer : assetDefinitions.PlayerAssets.ClientRemotePlayer; var prefab = _content.Load(prefabUrl); var clientPlayerEntities = prefab.InstantiateClientPlayer(); var playerEntity = clientPlayerEntities.PlayerEntity; var networkPlayerComp = playerEntity.Get <NetworkPlayerComponent>(); networkPlayerComp.PlayerName = playerName; var networkEntityComp = playerEntity.Get <NetworkEntityComponent>(); networkEntityComp.NetworkEntityId = networkEntityId; networkEntityComp.OwnerClientId = playerId; networkEntityComp.AssetId = _networkAssetDatabase.GetAssetIdFromUrlReference(prefabUrl); AddAndRegisterEntity(playerEntity, gameplayScene, simulationTickNumber); // Set initial position var data = _networkEntityIdToEntityDataMap[networkEntityId]; var movementSnapshotsComp = data.MovementSnapshotsComponent; var characterComp = data.CharacterComponent; SetPlayerTransform(simulationTickNumber, movementSnapshotsComp, characterComp, ref position, ref rotation); // The 'viewable' player is added separately var playerViewEntity = clientPlayerEntities.PlayerViewEntity; gameplayScene.Entities.Add(playerViewEntity); return(playerEntity); }
private void OnNewRemotePlayerReady( SerializableGuid playerId, string playerName, NetworkConnection playerConnection, NetworkMessageWriter networkMessageWriter) { var assetDefinitions = GetNetworkAssetDefinitions(); var assetDatabase = _networkEntityProcessor._networkAssetDatabase; var networkService = _networkEntityProcessor._networkService; var content = _networkEntityProcessor._content; var gameClockManager = _networkEntityProcessor._gameClockManager; var entityExistenceStates = _networkEntityProcessor._entityExistenceStates; var gameplayScene = GetGameplayScene(); var simTickNumber = gameClockManager.SimulationClock.SimulationTickNumber; // Can add to the scene now Entity playerEntity; if (networkService.NetworkGameMode == NetworkGameMode.DedicatedServer) { var playerPrefabUrl = assetDefinitions.PlayerAssets.ServerRemotePlayer; var playerPrefab = content.Load(playerPrefabUrl); playerEntity = playerPrefab.InstantiateSingle(); var networkEntityComp = playerEntity.Get <NetworkEntityComponent>(); networkEntityComp.NetworkEntityId = playerId; // Can just use the same ID networkEntityComp.OwnerClientId = playerId; networkEntityComp.AssetId = assetDatabase.GetAssetIdFromUrlReference(playerPrefabUrl); var networkPlayerComp = playerEntity.Get <NetworkPlayerComponent>(); networkPlayerComp.PlayerName = playerName; GetPlayerSpawnLocation(gameplayScene, out var spawnPosition, out var spawnRotation); playerEntity.Transform.Position = spawnPosition; playerEntity.Transform.Rotation = spawnRotation; _networkEntityProcessor.AddAndRegisterEntity(playerEntity, gameplayScene, simTickNumber); } else { // Client game, so has the prefab also player view entity GetPlayerSpawnLocation(gameplayScene, out var spawnPosition, out var spawnRotation); playerEntity = _networkEntityProcessor.CreateAndAddClientPlayerEntity(simTickNumber, playerId, playerName, ref spawnPosition, ref spawnRotation, isLocalEntity: false); } // Note this must be set AFTER being added to the scene due to snapshot buffer needing to be instantiated by the processor var movementSnapshotComp = playerEntity.Get <MovementSnapshotsComponent>(); MovementSnapshotsProcessor.CreateNewSnapshotData(simTickNumber, movementSnapshotComp, playerEntity.Transform); var newPlayer = new ServerActiveRemotePlayer(playerId, playerName, playerEntity, playerConnection); ActiveRemotePlayers.Add(newPlayer); var gameManager = GetGameManager(); gameManager.RaisePlayerAddedEvent(playerEntity); // Notify the new player of all existing players for (int i = 0; i < ActiveRemotePlayers.Count - 1; i++) // Exclude the last because that's the new player { ref var existingPlayer = ref ActiveRemotePlayers.Items[i]; Debug.Assert(existingPlayer.PlayerId != playerId); var existingPlayerDetails = entityExistenceStates[existingPlayer.PlayerEntity]; var spawnPlayer = new SpawnRemotePlayerMessage { PlayerId = existingPlayer.PlayerId, SimulationTickNumber = existingPlayerDetails.SimulationTickNumberCreated, PlayerName = existingPlayer.PlayerName, Position = existingPlayer.PlayerEntity.Transform.Position, Rotation = existingPlayer.PlayerEntity.Transform.Rotation }; networkMessageWriter.Reset(); spawnPlayer.WriteTo(networkMessageWriter); playerConnection.Send(networkMessageWriter, SendNetworkMessageType.ReliableOrdered); // Use Ordered to ensure a player's joined & dropped events are in sequence }