protected override JobHandle OnUpdate(JobHandle inputDeps)
    {
        // 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(default);
예제 #2
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;
                    }
                }
            }
        }
    }