Esempio n. 1
0
    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();
    }
Esempio n. 2
0
    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();
    }
Esempio n. 3
0
    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);
    }
Esempio n. 4
0
    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();
    }
Esempio n. 5
0
    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);
    }
Esempio n. 6
0
    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);
    }
Esempio n. 7
0
    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();
    }
Esempio n. 8
0
    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);
        }
    }
Esempio n. 9
0
    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);
    }
Esempio n. 10
0
    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;
                    }
                }
            }
        }
    }
Esempio n. 11
0
        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;
        }
Esempio n. 12
0
        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;
        }