public override void BeforeStart()
        {
            base.BeforeStart();

            if (m_obForLoading == null)
            {
                return;
            }

            int currentTime = MySandboxGame.TotalGamePlayTimeInMilliseconds;

            m_allSpawnInfos.Capacity = m_obForLoading.SpawnInfos.Count;
            foreach (var info in m_obForLoading.SpawnInfos)
            {
                var spawnInfo = new SpawnInfo(info, currentTime);
                m_allSpawnInfos.Add(spawnInfo);
                m_spawnInfoGrid.AddPoint(ref spawnInfo.Position, spawnInfo);
            }

            m_allTimeoutInfos.Capacity = m_obForLoading.TimeoutInfos.Count;
            foreach (var info in m_obForLoading.TimeoutInfos)
            {
                var timeoutInfo = new SpawnTimeoutInfo(info, currentTime);
                if (timeoutInfo.AnimalSpawnInfo == null) // do not add invalid timeout objects
                {
                    continue;
                }
                m_allTimeoutInfos.Add(timeoutInfo);
                m_timeoutInfoGrid.AddPoint(ref timeoutInfo.Position, timeoutInfo);
            }

            m_obForLoading = null;
        }
        void BotCharacterDied(MyCharacter obj)
        {
            Vector3D position = obj.PositionComp.GetPosition();

            obj.CharacterDied -= BotCharacterDied;

            int timeoutNum = 0;
            var enumerator = m_timeoutInfoGrid.GetPointsCloserThan(ref position, TIMEOUT_DIST);

            while (enumerator.MoveNext())
            {
                timeoutNum++;
                enumerator.Current.AddKillTimeout();
            }

            if (timeoutNum == 0)
            {
                int currentTime = MySandboxGame.TotalGamePlayTimeInMilliseconds;
                var newInfo     = new SpawnTimeoutInfo(position, currentTime);
                newInfo.AddKillTimeout();
                m_timeoutInfoGrid.AddPoint(ref position, newInfo);
                m_allTimeoutInfos.Add(newInfo);
            }
        }
        void BotCharacterDied(MyCharacter obj)
        {
            Vector3D position = obj.PositionComp.GetPosition();
            obj.CharacterDied -= BotCharacterDied;

            int timeoutNum = 0;
            var enumerator = m_timeoutInfoGrid.GetPointsCloserThan(ref position, TIMEOUT_DIST);
            while (enumerator.MoveNext())
            {
                timeoutNum++;
                enumerator.Current.AddKillTimeout();
            }

            if (timeoutNum == 0)
            {
                int currentTime = MySandboxGame.TotalGamePlayTimeInMilliseconds;
                var newInfo = new SpawnTimeoutInfo(position, currentTime);
                newInfo.AddKillTimeout();
                m_timeoutInfoGrid.AddPoint(ref position, newInfo);
                m_allTimeoutInfos.Add(newInfo);
            }
        }
        public override void BeforeStart()
        {
            base.BeforeStart();

            if (m_obForLoading == null) return;

            int currentTime = MySandboxGame.TotalGamePlayTimeInMilliseconds;

            m_allSpawnInfos.Capacity = m_obForLoading.SpawnInfos.Count;
            foreach (var info in m_obForLoading.SpawnInfos)
            {
                var spawnInfo = new SpawnInfo(info, currentTime);
                m_allSpawnInfos.Add(spawnInfo);
                m_spawnInfoGrid.AddPoint(ref spawnInfo.Position, spawnInfo);
            }

            m_allTimeoutInfos.Capacity = m_obForLoading.TimeoutInfos.Count;
            foreach (var info in m_obForLoading.TimeoutInfos)
            {
                var timeoutInfo = new SpawnTimeoutInfo(info, currentTime);
                if (timeoutInfo.AnimalSpawnInfo == null) // do not add invalid timeout objects
                    continue;
                m_allTimeoutInfos.Add(timeoutInfo);
                m_timeoutInfoGrid.AddPoint(ref timeoutInfo.Position, timeoutInfo);
            }

            m_obForLoading = null;
        }