public void Run() { if (_bleedingStats.EntitiesCount <= 0) { throw new Exception("BleedingSystem was not init!"); } BleedingStatsComponent stats = _bleedingStats.Components1[0]; foreach (int i in _woundedPeds) { BleedingInfoComponent info = _woundedPeds.Components1[i]; WoundedComponent wounded = _woundedPeds.Components2[i]; int pedEntity = _woundedPeds.Entities[i]; foreach (int woundEntity in wounded.WoundEntities) { var baseBleeding = _ecsWorld.GetComponent <BaseBleedingComponent>(woundEntity); if (baseBleeding == null) { continue; } float baseSeverity = baseBleeding.BaseBleeding; if (baseSeverity <= 0) { continue; } int bodyPartEntity = _woundedPeds.Components3[i].DamagedBodyPartEntity; float bodyPartMult = _ecsWorld.GetComponent <BleedingMultComponent>(bodyPartEntity).Multiplier; float sevWithMult = stats.BleedingMultiplier * bodyPartMult * baseSeverity; float sevDeviation = sevWithMult * stats.BleedingDeviation; sevDeviation = Random.NextFloat(-sevDeviation, sevDeviation); float finalSeverity = sevWithMult + sevDeviation; int bleedingEntity = _ecsWorld.CreateEntityWith(out BleedingComponent bleeding); bleeding.Severity = finalSeverity; #if DEBUG _logger.MakeLog( $"Created bleeding {woundEntity.GetEntityName(_ecsWorld)} for Entity ({pedEntity}). " + $"Base severity {baseSeverity:0.00}; final severity {finalSeverity:0.00}"); #endif info.BleedingEntities.Add(bleedingEntity); } #if DEBUG _ecsWorld.ProcessDelayedUpdates(); string bleedingList = ""; foreach (int bleedEntity in info.BleedingEntities) { bleedingList += $"{_ecsWorld.GetComponent<BleedingComponent>(bleedEntity).Severity:0.00} "; } _logger.MakeLog($"BleedingList: {bleedingList}"); #endif } }
public void Run() { foreach (int i in _pedsToRemove) { BleedingInfoComponent info = _pedsToRemove.Components1[i]; int pedEntity = _pedsToRemove.Entities[i]; foreach (int entity in info.BleedingEntities) { _ecsWorld.RemoveEntity(entity); } _ecsWorld.RemoveComponent <BleedingInfoComponent>(pedEntity); } }
public void Run() { foreach (int i in _healedEntities) { BleedingInfoComponent info = _healedEntities.Components1[i]; foreach (int bleedingEntity in info.BleedingEntities) { if (!_ecsWorld.IsEntityExists(bleedingEntity)) { continue; } _ecsWorld.RemoveEntity(bleedingEntity); } } }
public void Run() { foreach (int i in _entities) { Ped ped = _entities.Components1[i].ThisPed; if (!ped.Exists()) { continue; } HealthComponent health = _entities.Components2[i]; if (health.Health <= 0) { continue; } BleedingInfoComponent info = _entities.Components3[i]; int pedEntity = _entities.Entities[i]; float bleedingDamage = 0; for (int bleedingIndex = info.BleedingEntities.Count - 1; bleedingIndex >= 0; bleedingIndex--) { int bleedingEntity = info.BleedingEntities[bleedingIndex]; if (!_ecsWorld.IsEntityExists(bleedingEntity)) { info.BleedingEntities.RemoveAt(bleedingIndex); continue; } var bleeding = _ecsWorld.GetComponent <BleedingComponent>(bleedingEntity); if (bleeding == null) { info.BleedingEntities.RemoveAt(bleedingIndex); continue; } float delta = GswExtensions.GetDeltaTime(); if (delta <= 0) { continue; } bleedingDamage += bleeding.Severity * delta; bleeding.Severity -= info.BleedingHealRate / HEAL_RATE_SLOWER * delta; if (bleeding.Severity > 0) { continue; } #if DEBUG _logger.MakeLog($"Bleeding {bleedingEntity} on Entity ({pedEntity}) was healed"); #endif _ecsWorld.RemoveComponent <BleedingComponent>(bleedingEntity); info.BleedingEntities.RemoveAt(bleedingIndex); } if (bleedingDamage <= 0) { continue; } health.Health -= bleedingDamage; ped.SetHealth(health.Health); } }