Esempio n. 1
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
        }
Esempio n. 2
0
 private EcsEntity GetRandomBodyPartEntity()
 {
     return(_bodyParts.Entities[_random.Next(0, _bodyParts.GetEnumerator().GetCount())]);
 }