Пример #1
0
        public void Run()
        {
#if DEBUG
            GunshotWound2.LastSystem = nameof(PainRecoverySystem);
#endif
            float frameTimeInSeconds = Game.LastFrameTime;

            for (int i = 0; i < _pedsWithPain.EntitiesCount; i++)
            {
                WoundedPedComponent woundedPed = _pedsWithPain.Components1[i];
                PainComponent       pain       = _pedsWithPain.Components2[i];

                int pedEntity = _pedsWithPain.Entities[i];
                if (pain.CurrentPain <= 0f || woundedPed.IsDead)
                {
                    _ecsWorld.RemoveComponent <PainComponent>(pedEntity, true);
                    continue;
                }

                pain.CurrentPain -= woundedPed.PainRecoverSpeed * frameTimeInSeconds;
                var painPercent = pain.CurrentPain / woundedPed.MaximalPain;
                var backPercent = painPercent > 1
                    ? 0
                    : 1 - painPercent;

                if (painPercent > 3f)
                {
                    if (woundedPed.PainState == PainStates.DEADLY)
                    {
                        continue;
                    }

                    _ecsWorld.CreateEntityWith(out DeadlyPainChangeStateEvent deadlyPainEvent);
                    deadlyPainEvent.Entity      = pedEntity;
                    deadlyPainEvent.ForceUpdate = false;
                }
                else if (painPercent > 1f)
                {
                    if (woundedPed.IsMale)
                    {
                        Function.Call(Hash.PLAY_FACIAL_ANIM, woundedPed.ThisPed, "dead_1", "facials@gen_male@base");
                    }
                    else
                    {
                        Function.Call(Hash.PLAY_FACIAL_ANIM, woundedPed.ThisPed, "dead_1", "facials@gen_female@base");
                    }
                    if (woundedPed.PainState == PainStates.UNBEARABLE)
                    {
                        continue;
                    }

                    _ecsWorld.CreateEntityWith(out UnbearablePainChangeStateEvent unbearablePainEvent);
                    unbearablePainEvent.Entity      = pedEntity;
                    unbearablePainEvent.ForceUpdate = false;
                }
                else if (painPercent > 0.8f)
                {
                    if (woundedPed.IsMale)
                    {
                        Function.Call(Hash.PLAY_FACIAL_ANIM, woundedPed.ThisPed, "mood_injured_1", "facials@gen_male@base");
                    }
                    else
                    {
                        Function.Call(Hash.PLAY_FACIAL_ANIM, woundedPed.ThisPed, "mood_injured_1", "facials@gen_female@base");
                    }
                    if (woundedPed.PainState == PainStates.INTENSE)
                    {
                        continue;
                    }

                    _ecsWorld.CreateEntityWith(out IntensePainChangeStateEvent intensePainEvent);
                    intensePainEvent.Entity      = pedEntity;
                    intensePainEvent.ForceUpdate = false;
                }
                else if (painPercent > 0.3f)
                {
                    if (woundedPed.PainState == PainStates.AVERAGE)
                    {
                        continue;
                    }

                    _ecsWorld.CreateEntityWith(out AveragePainChangeStateEvent averagePainEvent);
                    averagePainEvent.Entity      = pedEntity;
                    averagePainEvent.ForceUpdate = false;
                }
                else if (painPercent > 0.01f)
                {
                    if (woundedPed.PainState == PainStates.MILD)
                    {
                        continue;
                    }

                    _ecsWorld.CreateEntityWith(out MildPainChangeStateEvent mildPainEvent);
                    mildPainEvent.Entity      = pedEntity;
                    mildPainEvent.ForceUpdate = false;
                }
                else
                {
                    if (woundedPed.PainState == PainStates.NONE)
                    {
                        continue;
                    }

                    _ecsWorld.CreateEntityWith(out NoPainChangeStateEvent noPainEvent);
                    noPainEvent.Entity      = pedEntity;
                    noPainEvent.ForceUpdate = false;

                    if (!_config.Data.PlayerConfig.CameraIsShaking)
                    {
                        Function.Call(Hash._SET_CAM_EFFECT, 0);
                        Function.Call(Hash._STOP_ALL_SCREEN_EFFECTS);
                    }
                }

                if (woundedPed.Crits.HasFlag(CritTypes.LEGS_DAMAGED))
                {
                    continue;
                }

                var adjustable = 1f - _config.Data.WoundConfig.MoveRateOnFullPain;
                var moveRate   = 1f - adjustable * backPercent;
                Function.Call(Hash.SET_PED_MOVE_RATE_OVERRIDE, woundedPed.ThisPed, moveRate);
            }
        }
Пример #2
0
        public void Run()
        {
            PainStateListComponent stateList = _painStates.Components1[0];

            foreach (int i in _painIsGone)
            {
                _painIsGone.Components2[i].CurrentPainStateIndex = -1;

#if DEBUG
                EcsEntity pedEntity = _painIsGone.Entities[i];
                CurrentPainStateComponent stateComponent = _painIsGone.Components2[i];
                int oldState      = stateComponent.CurrentPainStateIndex;
                int newStateIndex = stateComponent.CurrentPainStateIndex;

                string currentState = oldState >= 0
                    ? stateList.PainStateEntities[oldState].GetEntityName()
                    : "NO PAIN";

                string newState = newStateIndex >= 0
                    ? stateList.PainStateEntities[newStateIndex].GetEntityName()
                    : "NO PAIN";

                _logger.MakeLog($"{pedEntity.GetEntityName()}: Changed Pain State from {currentState} to {newState}");
#endif
            }

            foreach (int pedIndex in _entities)
            {
                EcsEntity                 pedEntity             = _entities.Entities[pedIndex];
                PainComponent             pain                  = _entities.Components1[pedIndex];
                PainInfoComponent         painInfo              = _entities.Components2[pedIndex];
                CurrentPainStateComponent currentStateComponent = _entities.Components3[pedIndex];

                int   newStateIndex = -1;
                float painPercent   = pain.PainAmount / painInfo.UnbearablePain;
                foreach (float percent in stateList.PainStatePercents)
                {
                    if (painPercent < percent)
                    {
                        break;
                    }

                    newStateIndex++;
                }

                int currentStateIndex = currentStateComponent.CurrentPainStateIndex;
                if (currentStateIndex == newStateIndex)
                {
                    continue;
                }

                int  diff     = newStateIndex - currentStateIndex;
                var  wounded  = _ecsWorld.EnsureComponent <WoundedComponent>(pedEntity, out _);
                bool isPlayer = _ecsWorld.GetComponent <PlayerMarkComponent>(pedEntity) != null;
                if (diff > 0)
                {
                    if (isPlayer)
                    {
                        _ecsWorld.CreateEntityWith(out NotificationComponent notification);
                        notification.Message += "~o~You feel yourself worst";
                    }

                    for (int i = currentStateIndex + 1; i <= newStateIndex; i++)
                    {
                        EcsEntity newStateEntity = stateList.PainStateEntities[i];
#if DEBUG
                        _logger.MakeLog($"Added {newStateEntity.GetEntityName()} PainState");
#endif
                        wounded.WoundEntities.Add(newStateEntity);
                    }
                }
                else
                {
                    if (isPlayer)
                    {
                        _ecsWorld.CreateEntityWith(out NotificationComponent notification);
                        notification.Message += "~g~You feel yourself better";
                    }

                    for (int i = currentStateIndex - 1; i >= newStateIndex; i--)
                    {
                        if (i < 0)
                        {
                            continue;
                        }

                        EcsEntity newStateEntity = stateList.PainStateEntities[i];
#if DEBUG
                        _logger.MakeLog($"Added {newStateEntity.GetEntityName()} PainState");
#endif
                        wounded.WoundEntities.Add(newStateEntity);
                    }
                }

                currentStateComponent.CurrentPainStateIndex = newStateIndex;
#if DEBUG
                string currentState = currentStateIndex >= 0
                    ? stateList.PainStateEntities[currentStateIndex].GetEntityName()
                    : "NO PAIN";

                string newState = newStateIndex >= 0
                    ? stateList.PainStateEntities[newStateIndex].GetEntityName()
                    : "NO PAIN";
                _logger.MakeLog($"{pedEntity.GetEntityName()}: Changed Pain State from {currentState} to {newState}");
#endif
            }
        }
Пример #3
0
        public void Run()
        {
            foreach (int i in _entitiesToClean)
            {
                EcsEntity entity = _entitiesToClean.Entities[i];
                _ecsWorld.RemoveComponent <PainIsGoneComponent>(entity);
            }

            PainStatsComponent stats = _painStats.Components1[0];

            foreach (int i in _woundedPeds)
            {
                WoundedComponent wounded = _woundedPeds.Components1[i];
                EcsEntity        entity  = _woundedPeds.Entities[i];

                float basePain = 0;
                foreach (EcsEntity woundEntity in wounded.WoundEntities)
                {
                    var pain = _ecsWorld.GetComponent <BasePainComponent>(woundEntity);
                    if (pain == null)
                    {
                        continue;
                    }

                    basePain += pain.BasePain;
#if DEBUG
                    _logger.MakeLog($"{woundEntity.GetEntityName()} increased pain for {pain.BasePain:0.00}");
#endif
                }

                var additionalPain = _ecsWorld.GetComponent <AdditionalPainComponent>(entity);
                if (additionalPain != null)
                {
                    basePain += additionalPain.AdditionalPain;
                }

                if (basePain <= 0)
                {
                    continue;
                }
                EcsEntity bodyPartEntity   = _woundedPeds.Components3[i].DamagedBodyPartEntity;
                float     bodyPartPainMult = _ecsWorld.GetComponent <PainMultComponent>(bodyPartEntity).Multiplier;
                float     painWithMult     = stats.PainMultiplier * bodyPartPainMult * basePain;

                float painDeviation = painWithMult * stats.PainDeviation;
                painDeviation = _random.NextFloat(-painDeviation, painDeviation);
                float finalPain = painWithMult + painDeviation;

                var painComponent = _ecsWorld.EnsureComponent <PainComponent>(entity, out bool isNew);
                if (isNew)
                {
                    painComponent.PainAmount = finalPain;
                }
                else
                {
                    painComponent.PainAmount += finalPain;
                }
#if DEBUG
                float     maxPain     = _woundedPeds.Components2[i].UnbearablePain;
                EcsEntity pedEntity   = _woundedPeds.Entities[i];
                float     painPercent = painComponent.PainAmount / maxPain * 100f;
                _logger.MakeLog($"{pedEntity.GetEntityName()}: " +
                                $"Base pain is {basePain:0.00}; " +
                                $"Final pain is {finalPain:0.00}; " +
                                $"Pain percent is {painPercent:0.00}");
#endif
            }

            foreach (int i in _healedEntities)
            {
                EcsEntity entity = _healedEntities.Entities[i];
                _ecsWorld.AddComponent <PainIsGoneComponent>(entity);
                _ecsWorld.RemoveComponent <PainComponent>(entity);
            }

            if (_gameService.GameIsPaused)
            {
                return;
            }

            float delta = GswExtensions.GetDeltaTime();
            foreach (int i in _painToReduce)
            {
                PainComponent painComponent     = _painToReduce.Components1[i];
                float         painRecoverySpeed = _painToReduce.Components2[i].PainRecoverySpeed;
                EcsEntity     entity            = _painToReduce.Entities[i];

                painComponent.PainAmount -= painRecoverySpeed * delta;
                if (painComponent.PainAmount > 0)
                {
                    continue;
                }

                _ecsWorld.AddComponent <PainIsGoneComponent>(entity);
                _ecsWorld.RemoveComponent <PainComponent>(entity);
            }

#if DEBUG
            foreach (int i in _pedsWithPain)
            {
                Ped   ped     = _pedsWithPain.Components1[i].ThisPed;
                float pain    = _pedsWithPain.Components2[i].PainAmount;
                float maxPain = _pedsWithPain.Components3[i].UnbearablePain;
                if (!ped.Exists() || pain <= 0)
                {
                    continue;
                }

                Vector3 position = ped.AbovePosition + 0.2f * Vector3.WorldUp;
                Debug.DrawWireBoxDebug(position, ped.Orientation, new Vector3(1.05f, 0.15f, 0.1f), Color.Orange);
                Debug.DrawWireBoxDebug(position, ped.Orientation, new Vector3(pain / maxPain, 0.1f, 0.1f), Color.Red);
            }
#endif
        }
Пример #4
0
        public void Run()
        {
            if (_painStates.EntitiesCount <= 0)
            {
                throw new Exception("PainState list was not init!");
            }

            foreach (int i in _painIsGone)
            {
                _painIsGone.Components2[i].CurrentPainStateIndex = -1;
            }

            PainStateListComponent stateList = _painStates.Components1[0];

            foreach (int pedEntity in _entities)
            {
                PainComponent             pain     = _entities.Components1[pedEntity];
                PainInfoComponent         painInfo = _entities.Components2[pedEntity];
                CurrentPainStateComponent currentStateComponent = _entities.Components3[pedEntity];
                int entity = _entities.Entities[pedEntity];

                int   newStateIndex = -1;
                float painPercent   = pain.PainAmount / painInfo.UnbearablePain;
                foreach (float percent in stateList.PainStatePercents)
                {
                    if (painPercent < percent)
                    {
                        break;
                    }

                    newStateIndex++;
                }

                int currentStateIndex = currentStateComponent.CurrentPainStateIndex;
                if (currentStateIndex == newStateIndex)
                {
                    continue;
                }

                int diff    = newStateIndex - currentStateIndex;
                var wounded = _ecsWorld.EnsureComponent <WoundedComponent>(pedEntity, out _);
                if (diff > 0)
                {
                    for (int i = currentStateIndex + 1; i <= newStateIndex; i++)
                    {
                        int newStateEntity = stateList.PainStateEntities[i];
#if DEBUG
                        _logger.MakeLog($"Added {newStateEntity.GetEntityName(_ecsWorld)} PainState");
#endif
                        wounded.WoundEntities.Add(newStateEntity);
                    }
                }
                else
                {
                    for (int i = currentStateIndex - 1; i >= newStateIndex; i--)
                    {
                        if (i < 0)
                        {
                            continue;
                        }

                        int newStateEntity = stateList.PainStateEntities[i];
#if DEBUG
                        _logger.MakeLog($"Added {newStateEntity.GetEntityName(_ecsWorld)} PainState");
#endif
                        wounded.WoundEntities.Add(newStateEntity);
                    }
                }

                currentStateComponent.CurrentPainStateIndex = newStateIndex;
#if DEBUG
                string currentState = currentStateIndex >= 0
                    ? stateList.PainStateEntities[currentStateIndex].GetEntityName(_ecsWorld)
                    : "NO PAIN";
                string newState = newStateIndex >= 0
                    ? stateList.PainStateEntities[newStateIndex].GetEntityName(_ecsWorld)
                    : "NO PAIN";
                _logger.MakeLog($"Entity ({entity}): Changed Pain State from {currentState} to {newState}");
#endif
            }
        }