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