Example #1
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);
    }
Example #2
0
    public static void Create(EntityCommandBuffer commandBuffer, Vector3 position, Quaternion rotation, Entity playerEntity)
    {
        var data = new SpectatorCamSpawnRequest()
        {
            playerEntity = playerEntity,
            position     = position,
            rotation     = rotation,
        };

        commandBuffer.AddComponent(commandBuffer.CreateEntity(), data);
    }
Example #3
0
    protected override void OnUpdate()
    {
        var requestArray = Group.GetComponentDataArraySt <SpectatorCamSpawnRequest>();

        if (requestArray.Length == 0)
        {
            return;
        }

        var entityArray = Group.GetEntityArraySt();


        // Copy requests as spawning will invalidate Group
        var spawnRequests = new SpectatorCamSpawnRequest[requestArray.Length];

        for (var i = 0; i < requestArray.Length; i++)
        {
            spawnRequests[i] = requestArray[i];
            PostUpdateCommands.DestroyEntity(entityArray[i]);
        }

        for (var i = 0; i < spawnRequests.Length; i++)
        {
            var request     = spawnRequests[i];
            var playerState = EntityManager.GetComponentObject <PlayerState>(request.playerEntity);



            var resource = m_ResourceManager.GetSingleAssetResource(m_Settings.spectatorCamPrefab);

            GameDebug.Assert(resource != null);


            var prefab = (GameObject)resource;
            GameDebug.Log("Spawning spectatorcam");


            var goe = m_world.Spawn <GameObjectEntity>(prefab);
            goe.name = prefab.name;
            var entity = goe.Entity;

            var spectatorCam = EntityManager.GetComponentData <SpectatorCamData>(entity);
            spectatorCam.position = request.position;
            spectatorCam.rotation = request.rotation;
            EntityManager.SetComponentData(entity, spectatorCam);

            playerState.controlledEntity = entity;
        }
    }
Example #4
0
    protected override void OnUpdate()
    {
        if (SpawnGroup.requests.Length == 0)
        {
            return;
        }

        // Copy requests as spawning will invalidate Group
        var spawnRequests = new SpectatorCamSpawnRequest[SpawnGroup.requests.Length];

        for (var i = 0; i < SpawnGroup.requests.Length; i++)
        {
            spawnRequests[i] = SpawnGroup.requests[i];
            PostUpdateCommands.DestroyEntity(SpawnGroup.entities[i]);
        }

        for (var i = 0; i < spawnRequests.Length; i++)
        {
            var request     = spawnRequests[i];
            var playerState = EntityManager.GetComponentObject <PlayerState>(request.playerEntity);



            var resource = m_ResourceManager.LoadSingleAssetResource(m_Settings.spectatorCamPrefab.guid);

            GameDebug.Assert(resource != null);


            var prefab = (GameObject)resource;
            GameDebug.Log("Spawning spectatorcam");
            var spectatorCam = m_world.Spawn <SpectatorCam>(prefab);
            spectatorCam.name     = prefab.name;
            spectatorCam.position = request.position;
            spectatorCam.rotation = request.rotation;

            playerState.controlledEntity = spectatorCam.gameObject.GetComponent <GameObjectEntity>().Entity;
        }
    }
Example #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 <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);
        }
    }
Example #6
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;
                    }
                }
            }
        }
    }