protected override void OnUpdate() { Profiler.BeginSample("HandleCharacterSpawnRequests"); var requestArray = SpawnGroup.GetComponentDataArray <CharacterSpawnRequest>(); if (requestArray.Length == 0) { return; } var requestEntityArray = SpawnGroup.GetEntityArray(); // Copy requests as spawning will invalidate Group var spawnRequests = new CharacterSpawnRequest[requestArray.Length]; for (var i = 0; i < requestArray.Length; i++) { spawnRequests[i] = requestArray[i]; PostUpdateCommands.DestroyEntity(requestEntityArray[i]); } for (var i = 0; i < spawnRequests.Length; i++) { var request = spawnRequests[i]; var playerState = EntityManager.GetComponentObject <PlayerState>(request.playerEntity); var character = SpawnCharacter(m_world, playerState, request.position, request.rotation, request.characterType, m_ResourceManager); playerState.controlledEntity = character.gameObject.GetComponent <GameObjectEntity>().Entity; } Profiler.EndSample(); }
protected override void OnUpdate() { var requestArray = SpawnGroup.ToComponentDataArray <CharacterSpawnRequest>(Allocator.TempJob); if (requestArray.Length == 0) { return; } var requestEntityArray = SpawnGroup.ToEntityArray(Allocator.TempJob); // Copy requests as spawning will invalidate Group var spawnRequests = new CharacterSpawnRequest[requestArray.Length]; for (var i = 0; i < requestArray.Length; i++) { spawnRequests[i] = requestArray[i]; PostUpdateCommands.DestroyEntity(requestEntityArray[i]); } for (var i = 0; i < spawnRequests.Length; i++) { var request = spawnRequests[i]; var playerState = EntityManager.GetComponentObject <PlayerState>(request.playerEntity); var character = SpawnCharacter(m_world, playerState, request.position, request.rotation, request.mechSettings, m_ResourceManager); playerState.controlledEntity = character.gameObject.GetComponent <GameObjectEntity>().Entity; } requestArray.Dispose(); requestEntityArray.Dispose(); }
public static void Create(EntityCommandBuffer commandBuffer, int characterType, Vector3 position, Quaternion rotation, Entity playerEntity) { var data = new CharacterSpawnRequest(characterType, position, rotation, playerEntity); commandBuffer.CreateEntity(); commandBuffer.AddComponent(data); }
protected override void OnUpdate() { var playerStates = m_PlayersComponentGroup.ToComponentArray <PlayerState>(); var playerEntities = m_PlayersComponentGroup.ToEntityArray(Allocator.TempJob); var playerCharacterControls = m_PlayersComponentGroup.ToComponentArray <PlayerCharacterControl>(); for (int i = 0, c = playerStates.Length; i < c; ++i) { var player = playerStates[i]; var controlledEntity = player.controlledEntity; var playerEntity = playerEntities[i]; var charControl = playerCharacterControls[i]; // Spawn contolled entity (character) any missing if (controlledEntity == Entity.Null) { var position = new Vector3(0.0f, 0.2f, 0.0f); var rotation = Quaternion.identity; CharacterSpawnRequest.Create(PostUpdateCommands, charControl.MechSettings, position, rotation, playerEntity); continue; } //TODO : handle request mech change } playerEntities.Dispose(); }
void Spawn(bool keepCharPosition) { var playerEntity = m_Player.gameObject.GetComponent <GameObjectEntity>().Entity; var charControl = EntityManager.GetComponentObject <PlayerCharacterControl>(playerEntity); if (keepCharPosition && m_Player.controlledEntity != Entity.Null && m_world.GetEntityManager().HasComponent <CharacterInterpolatedData>(m_Player.controlledEntity))//m_world.GetEntityManager() == EntityManager { var charPresentationState = m_world.GetEntityManager().GetComponentData <CharacterInterpolatedData>(m_Player.controlledEntity); m_SpawnPos = charPresentationState.position; m_SpawnRot = Quaternion.Euler(0f, charPresentationState.rotation, 0f); } // Despawn old controlled if (m_Player.controlledEntity != Entity.Null) { if (EntityManager.HasComponent <Character>(m_Player.controlledEntity)) { CharacterDespawnRequest.Create(PostUpdateCommands, m_Player.controlledEntity); } m_Player.controlledEntity = Entity.Null; } CharacterSpawnRequest.Create(PostUpdateCommands, charControl.RequestedMechSettings, m_SpawnPos, m_SpawnRot, playerEntity); }
void Spawn(bool keepCharPosition) { var playerEntity = m_Player.gameObject.GetComponent<GameObjectEntity>().Entity; var charControl = EntityManager.GetComponentObject<PlayerCharacterControl>(playerEntity); var controlledTrans = m_Player.controlledEntity != Entity.Null ? EntityManager.GetComponentObject<Transform>(m_Player.controlledEntity) : null; if (keepCharPosition && controlledTrans != null) { m_SpawnPos = controlledTrans.position; m_SpawnRot = controlledTrans.rotation; } else FindSpawnTransform(); // Despawn old controlled if (m_Player.controlledEntity != Entity.Null) { if (EntityManager.HasComponent<CharacterPredictedState>(m_Player.controlledEntity)) { CharacterDespawnRequest.Create(PostUpdateCommands, m_Player.controlledEntity); } m_Player.controlledEntity = Entity.Null; } if (charControl.characterType == 1000) { SpectatorCamSpawnRequest.Create(PostUpdateCommands, m_SpawnPos, m_SpawnRot, playerEntity); } else CharacterSpawnRequest.Create(PostUpdateCommands, charControl.characterType, m_SpawnPos, m_SpawnRot, playerEntity); }
protected override void OnUpdate() { var requestArray = SpawnGroup.ToComponentDataArray <CharacterSpawnRequest>(Allocator.Persistent); if (requestArray.Length == 0) { requestArray.Dispose(); return; } var requestEntityArray = SpawnGroup.ToEntityArray(Allocator.Persistent); // Copy requests as spawning will invalidate Group var spawnRequests = new CharacterSpawnRequest[requestArray.Length]; for (var i = 0; i < requestArray.Length; i++) { spawnRequests[i] = requestArray[i]; PostUpdateCommands.DestroyEntity(requestEntityArray[i]); } for (var i = 0; i < spawnRequests.Length; i++) { var request = spawnRequests[i]; var playerState = EntityManager.GetComponentData <Player.State>(request.playerEntity); var charEntity = SpawnCharacter(playerState.playerId, request.position, request.rotation, request.characterType); GameDebug.Log(World, Character.ShowLifetime, "Spawning character:{0} ", charEntity); //We cannot serialize references yet so we hook up manually on client side based on PlayerId. //but we set it here none the less for our server side uses if any playerState.controlledEntity = charEntity; EntityManager.SetComponentData(request.playerEntity, playerState); } requestEntityArray.Dispose(); requestArray.Dispose(); }
void Spawn(bool keepCharPosition) { var playerEntity = m_Player.gameObject.GetComponent <GameObjectEntity>().Entity; var charControl = EntityManager.GetComponentObject <PlayerCharacterControl>(playerEntity); if (keepCharPosition && m_Player.controlledEntity != Entity.Null && m_world.GetEntityManager().HasComponent <PresentationState>(m_Player.controlledEntity)) { var charPresentationState = m_world.GetEntityManager().GetComponentData <PresentationState>(m_Player.controlledEntity); m_SpawnPos = charPresentationState.position; m_SpawnRot = Quaternion.Euler(0f, charPresentationState.rotation, 0f); } else { FindSpawnTransform(); } // Despawn old controlled if (m_Player.controlledEntity != Entity.Null) { if (EntityManager.HasComponent <Character>(m_Player.controlledEntity)) { CharacterDespawnRequest.Create(PostUpdateCommands, m_Player.controlledEntity); } m_Player.controlledEntity = Entity.Null; } if (charControl.characterType == 1000) { SpectatorCamSpawnRequest.Create(PostUpdateCommands, m_SpawnPos, m_SpawnRot, playerEntity); } else { CharacterSpawnRequest.Create(PostUpdateCommands, charControl.characterType, m_SpawnPos, m_SpawnRot, playerEntity); } }
public static void Create(EntityCommandBuffer commandBuffer, MechSettings mechSettings, Vector3 position, Quaternion rotation, Entity playerEntity) { var data = new CharacterSpawnRequest(mechSettings, position, rotation, playerEntity); commandBuffer.AddComponent(commandBuffer.CreateEntity(), data); }
protected override void OnUpdate() { //newGDV.GetCharValue(); // Handle change of game mode if (m_CurrentGameModeName != modeName.Value) { m_CurrentGameModeName = modeName.Value; switch (m_CurrentGameModeName) { case "deathmatch": m_GameMode = new GameModeDeathmatch(); break; case "assault": m_GameMode = new GameModeAssault(); break; default: m_GameMode = new NullGameMode(); break; } m_GameMode.Initialize(m_World, this); GameDebug.Log("New gamemode : '" + m_GameMode.GetType().ToString() + "'"); Restart(); return; } // Handle joining players var playerStates = m_PlayersComponentGroup.GetComponentArray <PlayerState>(); for (int i = 0, c = playerStates.Length; i < c; ++i) { var player = playerStates[i]; if (!player.gameModeSystemInitialized) { player.score = 0; player.displayGameScore = true; player.goalCompletion = -1.0f; m_GameMode.OnPlayerJoin(player); player.gameModeSystemInitialized = true; } } m_GameMode.Update(); // General rules gameModeState.gameTimerSeconds = GetGameTimer(); var playerEntities = m_PlayersComponentGroup.GetEntityArray(); var playerCharacterControls = m_PlayersComponentGroup.GetComponentArray <PlayerCharacterControl>(); for (int i = 0, c = playerStates.Length; i < c; ++i) { var player = playerStates[i]; var controlledEntity = player.controlledEntity; var playerEntity = playerEntities[i]; player.actionString = player.enableCharacterSwitch ? "Press H to change character" : ""; var charControl = playerCharacterControls[i]; // Spawn contolled entity (character) any missing if (controlledEntity == Entity.Null) { var position = new Vector3(0.0f, 0.2f, 0.0f); var rotation = Quaternion.identity; GetRandomSpawnTransform(player.teamIndex, ref position, ref rotation); m_GameMode.OnPlayerRespawn(player, ref position, ref rotation); if (charControl.characterType == -1) { charControl.characterType = Game.characterType.IntValue; if (Game.allowCharChange.IntValue == 1) { charControl.characterType = 3; //charControl.characterType = SelectedCharacter; //Change spawned character here } } if (charControl.characterType == 1000) { SpectatorCamSpawnRequest.Create(PostUpdateCommands, position, rotation, playerEntity); } else { CharacterSpawnRequest.Create(PostUpdateCommands, charControl.characterType, position, rotation, playerEntity); } continue; } // Has new new entity been requested if (charControl.requestedCharacterType != -1) { if (charControl.requestedCharacterType != charControl.characterType) { charControl.characterType = charControl.requestedCharacterType; if (player.controlledEntity != Entity.Null) { // Despawn current controlled entity. New entity will be created later if (EntityManager.HasComponent <Character>(controlledEntity)) { var predictedState = EntityManager.GetComponentData <CharacterPredictedData>(controlledEntity); var rotation = predictedState.velocity.magnitude > 0.01f ? Quaternion.LookRotation(predictedState.velocity.normalized) : Quaternion.identity; CharacterDespawnRequest.Create(PostUpdateCommands, controlledEntity); CharacterSpawnRequest.Create(PostUpdateCommands, charControl.characterType, predictedState.position, rotation, playerEntity); } player.controlledEntity = Entity.Null; } } charControl.requestedCharacterType = -1; continue; } if (EntityManager.HasComponent <HealthStateData>(controlledEntity)) { // Is character dead ? var healthState = EntityManager.GetComponentData <HealthStateData>(controlledEntity); if (healthState.health == 0) { // Send kill msg if (healthState.deathTick == m_World.worldTime.tick) { var killerEntity = healthState.killedBy; var killerIndex = FindPlayerControlling(ref playerStates, killerEntity); PlayerState killerPlayer = null; if (killerIndex != -1) { killerPlayer = playerStates[killerIndex]; var format = s_KillMessages[Random.Range(0, s_KillMessages.Length)]; var l = StringFormatter.Write(ref _msgBuf, 0, format, killerPlayer.playerName, player.playerName, m_TeamColors[killerPlayer.teamIndex], m_TeamColors[player.teamIndex]); chatSystem.SendChatAnnouncement(new CharBufView(_msgBuf, l)); } else { var format = s_SuicideMessages[Random.Range(0, s_SuicideMessages.Length)]; var l = StringFormatter.Write(ref _msgBuf, 0, format, player.playerName, m_TeamColors[player.teamIndex]); chatSystem.SendChatAnnouncement(new CharBufView(_msgBuf, l)); } m_GameMode.OnPlayerKilled(player, killerPlayer); } // Respawn dead players except if in ended mode if (m_EnableRespawning && (m_World.worldTime.tick - healthState.deathTick) * m_World.worldTime.tickInterval > respawnDelay.IntValue) { // Despawn current controlled entity. New entity will be created later if (EntityManager.HasComponent <Character>(controlledEntity)) { CharacterDespawnRequest.Create(PostUpdateCommands, controlledEntity); } player.controlledEntity = Entity.Null; } } } } }
protected IEnumerator UpdateTransitionOverTime() { //player sets off an explosion FXManager.Get.SpawnExplosionFX(State.ExplosionFXType, transform, State.ExplosionPosition); MasterAudio.PlaySound(State.ExplosionSoundType, transform, State.ExplosionSound); Player.Local.Audio.Cough(); //explosion makes them go blind CameraFX.Get.SetBlind(true); CameraFX.Get.AddDamageOverlay(1f); double waitUntil = WorldClock.AdjustedRealTime + State.CharacterDTSDelay; while (WorldClock.AdjustedRealTime < waitUntil) { yield return(null); } //robert says some DTS Frontiers.GUI.NGUIScreenDialog.AddSpeech(State.CharacterDTSText, State.CharacterDTSName, State.CharacterDTSDuration); Player.Local.Audio.Cough(); Player.Local.MovementLocked = true; //force the two camps to rebuild for (int i = 0; i < State.ForceRebuildLocations.Count; i++) { WorldItem activeLocation = null; if (WIGroups.FindChildItem(State.ForceRebuildLocations[i], out activeLocation)) { activeLocation.Get <MissionInteriorController>().ForceRebuild(); } else { Debug.Log("Couldn't load location " + State.ForceRebuildLocations[i]); } } //wait for a bit while that settles in waitUntil = WorldClock.AdjustedRealTime + State.CharacterDTSDuration; while (WorldClock.AdjustedRealTime < waitUntil) { yield return(null); } //player is moved to temple entrance GameWorld.Get.ShowAboveGround(true); Player.Local.Surroundings.ExitUnderground(); waitUntil = WorldClock.AdjustedRealTime + 0.1f; while (WorldClock.AdjustedRealTime < waitUntil) { yield return(null); } //give gameworld a sec to catch up //lock the player's position for a moment //kill the guard at the temple door WorldTriggerState triggerState = null; List <WorldTrigger> triggers = GameWorld.Get.PrimaryChunk.Triggers; for (int i = 0; i < triggers.Count; i++) { if (triggers[i].name == "TriggerWarlockCampGuardIntervention") { //get the trigger and kill the guard //(due to the cave-in) TriggerGuardIntervention tgi = triggers[i].GetComponent <TriggerGuardIntervention>(); tgi.KillGuard(); break; } } Player.Local.Position = State.PlayerWakeUpPosition; //blindness goes away CameraFX.Get.SetBlind(false); //as the player wakes up have him look at Robert Player.Local.HijackControl(); double startHijackedTime = WorldClock.AdjustedRealTime; HijackedPosition = gameObject.CreateChild("HijackedPosition"); HijackedLookTarget = gameObject.CreateChild("HijackedLookTarget"); HijackedPosition.position = State.PlayerWakeUpPosition; HijackedLookTarget.position = State.PlayerWakeUpLookTarget; while (WorldClock.AdjustedRealTime < startHijackedTime + State.HijackedTimeDuration) { Player.Local.SetHijackTargets(HijackedPosition, HijackedLookTarget); yield return(null); } Character character = null; if (!Characters.Get.SpawnedCharacter("Robert", out character)) { //spawn Robert if we haven't already CharacterSpawnRequest spawnRequest = new CharacterSpawnRequest(); spawnRequest.ActionNodeName = "RobertPiecesTempleSpawn"; spawnRequest.FinishOnSpawn = true; spawnRequest.CharacterName = "Robert"; spawnRequest.MinimumDistanceFromPlayer = 3f; spawnRequest.SpawnBehindPlayer = false; spawnRequest.UseGenericTemplate = false; spawnRequest.CustomConversation = "Robert-Enc-Act-02-Pieces-05"; Player.Local.CharacterSpawner.AddSpawnRequest(spawnRequest); } Player.Local.RestoreControl(true); Player.Local.MovementLocked = false; GameObject.Destroy(HijackedPosition.gameObject, 0.5f); GameObject.Destroy(HijackedLookTarget.gameObject, 0.5f); //and we're done! yield break; }
protected IEnumerator SpawnPlayerOverTime(LocalPlayer player) { mWaitingForFade = true; //add a request to spawn a healer character near the player Frontiers.GUI.CameraFade.StartAlphaFade(Color.red, false, 3.0f, 0f, () => { mWaitingForFade = false; }); while (mWaitingForFade) { yield return(null); } //now fade out red Frontiers.GUI.CameraFade.StartAlphaFade(Color.red, true, 3.0f); //now that the screen is covered //move the player GameWorld.TerrainHeightSearch terrainHit = new GameWorld.TerrainHeightSearch(); //search for an appropriate spot within a radius around the player bool foundGoodSpot = false; int maxTries = 50; int numTriesSoFar = 0; while (!foundGoodSpot) { Vector3 randomSpot = (UnityEngine.Random.onUnitSphere * 25f) + player.Surroundings.LastPositionOnland; randomSpot.y += 150; terrainHit.feetPosition = randomSpot; terrainHit.overhangHeight = Globals.DefaultCharacterHeight; terrainHit.groundedHeight = 200f; //we don't care about being grounded, just find the floor terrainHit.feetPosition.y = GameWorld.Get.TerrainHeightAtInGamePosition(ref terrainHit); if (!terrainHit.hitWater && !terrainHit.hitTerrainMesh && terrainHit.hitTerrain) { Debug.Log("Found spot to spawn: " + terrainHit.feetPosition.ToString()); foundGoodSpot = true; break; } else { numTriesSoFar++; if (numTriesSoFar > maxTries) { Debug.Log("Couldn't find good place to spawn, going with last position on land"); terrainHit.feetPosition = player.Surroundings.LastPositionOnland; break; } } } terrainHit.feetPosition.y += 0.25f; player.Position = terrainHit.feetPosition; //spawn the player player.Spawn(); //finally spawn the healer nearby CharacterSpawnRequest spawnRequest = new CharacterSpawnRequest(); spawnRequest.ActionNodeName = "HealerActionNode"; spawnRequest.CharacterName = "Healer"; spawnRequest.UseGenericTemplate = true; spawnRequest.CustomConversation = Globals.HouseOfHealingExteriorConversation; spawnRequest.FinishOnSpawn = true; spawnRequest.SpawnBehindPlayer = true; spawnRequest.MinimumDistanceFromPlayer = 1f; player.CharacterSpawner.AddSpawnRequest(spawnRequest); //take the player's money //take 1/2 (or whatever global value is) reduced by skill value int moneyToTake = Mathf.FloorToInt(player.Inventory.InventoryBank.BaseCurrencyValue * (Globals.HouseOfHealingRevivalCost * (1f - State.NormalizedUsageLevel))); player.Inventory.InventoryBank.TryToRemove(moneyToTake); //and we're done! mSpawningPlayerOverTime = false; yield break; }