Пример #1
0
 private EcsEntity CreateAnimal(GswWorldComponent gswWorld, Ped ped)
 {
     EcsEntity entity = _ecsWorld.CreateEntityWith(out GswPedComponent gswPed, out AnimalMarkComponent _);
     gswPed.ThisPed = ped;
     gswPed.DefaultAccuracy = ped.Accuracy;
     gswWorld.PedsToEntityDict.Add(ped, entity);
     return entity;
 }
Пример #2
0
        private int CreateAnimal(GswWorldComponent gswWorld, Ped ped)
        {
            int entity = _ecsWorld.CreateEntityWith(
                out GswPedComponent gswPed,
                out NewPedMarkComponent _,
                out AnimalMarkComponent _);

            gswPed.ThisPed = ped;

            gswWorld.PedsToEntityDict.Add(ped, entity);
            return(entity);
        }
Пример #3
0
        public void Run()
        {
            GswWorldComponent gswWorld = _world.Components1[0];

            foreach (int i in _pedsToRemove)
            {
                Ped       ped       = _pedsToRemove.Components1[i].ThisPed;
                EcsEntity pedEntity = _pedsToRemove.Entities[i];

                gswWorld.PedsToEntityDict.Remove(ped);
                _ecsWorld.RemoveEntity(pedEntity);

#if DEBUG
                _logger.MakeLog($"{pedEntity.GetEntityName()} was removed");
#endif
            }
        }
Пример #4
0
        public void Run()
        {
            if (_world.EntitiesCount <= 0)
            {
                return;
            }
            GswWorldComponent gswWorld = _world.Components1[0];

            foreach (int i in _pedsToRemove)
            {
                Ped ped       = _pedsToRemove.Components1[i].ThisPed;
                int pedEntity = _pedsToRemove.Entities[i];

                gswWorld.PedsToEntityDict.Remove(ped);
                _ecsWorld.RemoveEntity(pedEntity);
            }
        }
Пример #5
0
        private EcsEntity CreateHuman(GswWorldComponent gswWorld, Ped ped)
        {
            EcsEntity entity = _ecsWorld.CreateEntityWith(out GswPedComponent gswPed);
            gswPed.ThisPed = ped;

            if (!gswWorld.HumanAccuracy.IsDisabled())
            {
                ped.Accuracy = (int) _random.NextMinMax(gswWorld.HumanAccuracy);
            }

            if (!gswWorld.HumanShootRate.IsDisabled())
            {
                int rate = (int) _random.NextMinMax(gswWorld.HumanShootRate);
                NativeFunction.Natives.SET_PED_SHOOT_RATE(ped, rate);
            }

            gswPed.DefaultAccuracy = ped.Accuracy;
            gswWorld.PedsToEntityDict.Add(ped, entity);
            return entity;
        }
Пример #6
0
        private void FillWithDefaultValues(GswWorldComponent stats)
        {
            stats.HumanDetectingEnabled  = true;
            stats.AnimalDetectingEnabled = true;

            stats.HumanAccuracy = new MinMax
            {
                Min = 10,
                Max = 30
            };
            stats.HumanShootRate = new MinMax
            {
                Min = 10,
                Max = 30
            };

            stats.ScanOnlyDamaged = false;

            stats.MaxDetectTimeInMs = 5;
        }
Пример #7
0
        public void Run()
        {
            GswWorldComponent gswWorld = _world.Components1[0];
            bool detectingEnabled = gswWorld.MaxPedCountPerFrame > 0 &&
                                    (gswWorld.HumanDetectingEnabled || gswWorld.AnimalDetectingEnabled);

            if (gswWorld.NeedToCheckPeds.Count <= 0)
            {
                foreach (int i in _forceCreateEvents)
                {
                    Ped targetPed = _forceCreateEvents.Components1[i].TargetPed;
                    if (gswWorld.ForceCreatePeds.Contains(targetPed)) continue;

                    gswWorld.ForceCreatePeds.Add(targetPed);
                    gswWorld.NeedToCheckPeds.Enqueue(targetPed);
                    _ecsWorld.RemoveEntity(_forceCreateEvents.Entities[i]);
                }

                foreach (int i in _gswPeds)
                {
                    GswPedComponent gswPed = _gswPeds.Components1[i];

                    Ped ped = gswPed.ThisPed;
                    if (IsExistsAndAlive(ped)) continue;

                    EcsEntity pedEntity = _gswPeds.Entities[i];
                    _ecsWorld.AddComponent<RemovedPedMarkComponent>(pedEntity);
                }

                if (detectingEnabled)
                {
                    NativeFunction.Natives.SET_AI_MELEE_WEAPON_DAMAGE_MODIFIER(0.01f);
                    foreach (Ped ped in World.GetAllPeds())
                    {
                        gswWorld.NeedToCheckPeds.Enqueue(ped);
                    }
                }
            }

            for (int i = 0; i < gswWorld.MaxPedCountPerFrame; i++)
            {
                if(gswWorld.NeedToCheckPeds.Count <= 0) break;
                
                Ped ped = gswWorld.NeedToCheckPeds.Dequeue();
                if (IsNotExistsOrDead(ped)) continue;
                if (GswPedAlreadyExist(ped)) continue;

                bool forceCreatePed = gswWorld.ForceCreatePeds.Contains(ped);
                if (!forceCreatePed && IsNotDamaged(ped)) continue;

                EcsEntity? entity = null;
                if (ped.IsHuman && (forceCreatePed || gswWorld.HumanDetectingEnabled))
                {
                    entity = CreateHuman(gswWorld, ped);
                }
                else if (!ped.IsHuman && (forceCreatePed || gswWorld.AnimalDetectingEnabled))
                {
                    entity = CreateAnimal(gswWorld, ped);
                }

                if (entity == null)
                {
                    throw new Exception($"Ped is not supported! {ped.Model.Name} is not animal or human!");
                }
                
                NativeFunction.Natives.SET_PED_SUFFERS_CRITICAL_HITS(ped, false);
                NativeFunction.Natives.SET_PED_CONFIG_FLAG(ped, 281, true);
                _ecsWorld.AddComponent<NewPedMarkComponent>(entity.Value);
                if (!forceCreatePed) continue;

#if DEBUG
                _logger.MakeLog($"Ped {entity.Value.GetEntityName()} was force created");
#endif
                gswWorld.ForceCreatePeds.Remove(ped);
            }

#if DEBUG
            if (!_debugText.IsEmpty())
            {
                _debugText.Components1[0].UpdateDebugText("Peds", _gswPeds.GetEnumerator().GetCount().ToString());
            }
#endif
        }
Пример #8
0
        public void Run()
        {
            if (_world.EntitiesCount <= 0)
            {
                throw new Exception("World was not init!");
            }

            GswWorldComponent gswWorld = _world.Components1[0];
            bool detectingEnabled      = gswWorld.HumanDetectingEnabled || gswWorld.AnimalDetectingEnabled;

            _stopwatch.Restart();
            if (gswWorld.NeedToCheckPeds.Count <= 0)
            {
                foreach (int i in _forceCreateEvents)
                {
                    Ped targetPed = _forceCreateEvents.Components1[i].TargetPed;
                    gswWorld.NeedToCheckPeds.Enqueue(targetPed);
                    gswWorld.ForceCreatePeds.Add(targetPed);
                    _ecsWorld.RemoveEntity(_forceCreateEvents.Entities[i]);
                }

                foreach (int i in _gswPeds)
                {
                    GswPedComponent gswPed = _gswPeds.Components1[i];

                    Ped ped = gswPed.ThisPed;
                    if (IsExistsAndAlive(ped))
                    {
                        continue;
                    }

                    int pedEntity = _gswPeds.Entities[i];
                    _ecsWorld.AddComponent <RemovedPedMarkComponent>(pedEntity);
                }

                if (detectingEnabled)
                {
                    foreach (Ped ped in World.GetAllPeds())
                    {
                        gswWorld.NeedToCheckPeds.Enqueue(ped);
                    }
                }
            }

            while (!TimeIsOver() && gswWorld.NeedToCheckPeds.Count > 0)
            {
                Ped ped = gswWorld.NeedToCheckPeds.Dequeue();
                if (IsNotExistsOrDead(ped))
                {
                    continue;
                }
                if (GswPedAlreadyExist(ped))
                {
                    continue;
                }

                bool forceCreatePed = gswWorld.ForceCreatePeds.Contains(ped);
                if (!forceCreatePed && IsNotDamaged(ped))
                {
                    continue;
                }

                int entity;
                if (ped.IsHuman && (forceCreatePed || gswWorld.HumanDetectingEnabled))
                {
                    entity = CreateHuman(gswWorld, ped);
                }
                else if (!ped.IsHuman && (forceCreatePed || gswWorld.AnimalDetectingEnabled))
                {
                    entity = CreateAnimal(gswWorld, ped);
                }
                else
                {
                    entity = -1;
                }

                if (!forceCreatePed)
                {
                    continue;
                }

#if DEBUG
                _logger.MakeLog($"Ped {ped.Name(entity)} was force created");
#endif
                gswWorld.ForceCreatePeds.Remove(ped);
            }

#if DEBUG
            string pedCounter = "Peds: " + _gswPeds.EntitiesCount;
            pedCounter.ShowInGsw(0.165f, 0.94f, 0.25f, Color.White);

            string worldTime = "World Time: " + _stopwatch.ElapsedMilliseconds;
            worldTime.ShowInGsw(0.165f, 0.955f, 0.25f, Color.White);
#endif
            _stopwatch.Stop();
        }
Пример #9
0
        public void Run()
        {
            PlayerConfigComponent config = _playerConfig.Components1[0];

            foreach (int i in _playerPeds)
            {
                Ped       ped    = _playerPeds.Components1[i].ThisPed;
                EcsEntity entity = _playerPeds.Entities[i];
                if (Game.LocalPlayer.Character.Equals(ped))
                {
                    continue;
                }

                _ecsWorld.RemoveComponent <PlayerMarkComponent>(entity);
#if DEBUG
                _logger.MakeLog($"PlayerMark removed from ped {entity.GetEntityName()}, 'cause different characters");
#endif
            }

            foreach (int i in _newPeds)
            {
                Ped       ped    = _newPeds.Components1[i].ThisPed;
                EcsEntity entity = _newPeds.Entities[i];
                if (!ped.IsLocalPlayer)
                {
                    continue;
                }

                if (config.PlayerEnabled)
                {
                    MarkEntityAsPed(entity);
                }
                else
                {
                    _ecsWorld.RemoveComponent <NewPedMarkComponent>(entity);
#if DEBUG
                    _logger.MakeLog($"NewPedMark removed from ped {entity.GetEntityName()}, 'cause player is disabled");
#endif
                }
            }

            _ecsWorld.ProcessDelayedUpdates();
            if (config.PlayerEnabled && _playerPeds.IsEmpty())
            {
                Ped playerPed = Game.LocalPlayer.Character;
                GswWorldComponent gswWorld = _gswWorld.Components1[0];

                if (!gswWorld.PedsToEntityDict.TryGetValue(playerPed, out EcsEntity entity))
                {
#if DEBUG
                    _logger.MakeLog($"No players found! PlayerPed {playerPed.Model.Name} will force create!");
#endif
                    _ecsWorld.CreateEntityWith(out ForceCreateGswPedEvent forceCreateEvent);
                    forceCreateEvent.TargetPed = playerPed;
                    return;
                }

#if DEBUG
                _logger.MakeLog("Entity with Player Ped already exists and will be removed!");
#endif
                _ecsWorld.AddComponent <RemovedPedMarkComponent>(entity);
            }
        }