示例#1
0
        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
            }
        }
示例#2
0
        public void Run()
        {
            if (_gameService.GameIsPaused)
            {
                return;
            }

            BleedingStatsComponent bleedingStats = _bleedingStats.Components1[0];

            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;
                }

                PedBleedingInfoComponent info = _entities.Components3[i];
                EcsEntity pedEntity           = _entities.Entities[i];
                float     bleedingDamage      = 0;

                for (int bleedingIndex = info.BleedingEntities.Count - 1; bleedingIndex >= 0; bleedingIndex--)
                {
                    EcsEntity 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    += bleedingStats.BleedingDamageMultiplier * bleeding.Severity * delta;
                    bleeding.Severity -= info.BleedingHealRate * delta;
                    if (bleeding.Severity > 0)
                    {
                        continue;
                    }

#if DEBUG
                    _logger.MakeLog($"Bleeding {bleedingEntity} on {pedEntity.GetEntityName()} was healed");
#endif
                    _ecsWorld.RemoveComponent <BleedingComponent>(bleedingEntity);
                    info.BleedingEntities.RemoveAt(bleedingIndex);
                }

                if (bleedingDamage <= 0)
                {
                    continue;
                }
                health.Health -= bleedingDamage;
                ped.SetHealth(health.Health);
            }
        }
        public void Run()
        {
            BleedingStatsComponent stats = _bleedingStats.Components1[0];

            foreach (int i in _wounded)
            {
                PedBleedingInfoComponent info            = _wounded.Components1[i];
                WoundedComponent         wounded         = _wounded.Components2[i];
                DamagedBodyPartComponent damagedBodyPart = _wounded.Components3[i];
                DamagedByWeaponComponent damagedByWeapon = _wounded.Components4[i];

                EcsEntity pedEntity = _wounded.Entities[i];
                foreach (EcsEntity woundEntity in wounded.WoundEntities)
                {
                    var baseBleeding = _ecsWorld.GetComponent <BaseBleedingComponent>(woundEntity);
                    if (baseBleeding == null)
                    {
                        continue;
                    }

                    float baseSeverity = baseBleeding.BaseBleeding;
                    if (baseSeverity <= 0)
                    {
                        continue;
                    }

                    EcsEntity bodyPartEntity = damagedBodyPart.DamagedBodyPartEntity;
                    float     bodyPartMult   = _ecsWorld.GetComponent <BleedingMultiplierComponent>(bodyPartEntity).Multiplier;
                    float     sevWithMult    = stats.BleedingMultiplier * bodyPartMult * baseSeverity;

                    float sevDeviation = sevWithMult * stats.BleedingDeviation;
                    sevDeviation = _random.NextFloat(-sevDeviation, sevDeviation);

                    float finalSeverity = sevWithMult + sevDeviation;

                    EcsEntity bleedingEntity = _ecsWorld.CreateEntityWith(out BleedingComponent bleeding);
                    bleeding.DamagedBoneId     = damagedBodyPart.DamagedBoneId;
                    bleeding.BodyPartEntity    = damagedBodyPart.DamagedBodyPartEntity;
                    bleeding.Severity          = finalSeverity;
                    bleeding.MotherWoundEntity = woundEntity;
                    bleeding.WeaponEntity      = damagedByWeapon.WeaponEntity;

#if DEBUG
                    _logger.MakeLog(
                        $"Created bleeding {woundEntity.GetEntityName()} on bone {bleeding.DamagedBoneId} for {pedEntity.GetEntityName()}. " +
                        $"Base severity {baseSeverity:0.00}; final severity {finalSeverity:0.00}");
#endif
                    info.BleedingEntities.Add(bleedingEntity);
                }

#if DEBUG
                _ecsWorld.ProcessDelayedUpdates();
                string bleedingList = "";
                foreach (EcsEntity bleedEntity in info.BleedingEntities)
                {
                    bleedingList += $"{_ecsWorld.GetComponent<BleedingComponent>(bleedEntity).Severity:0.00} ";
                }

                _logger.MakeLog($"BleedingList for {pedEntity.GetEntityName()}: {bleedingList}");
#endif
            }
        }