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