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 } }
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) { int entity = _entitiesToClean.Entities[i]; _ecsWorld.RemoveComponent <PainIsGoneComponent>(entity); } if (_painStats.EntitiesCount <= 0) { throw new Exception("PainSystem was not init!"); } PainStatsComponent stats = _painStats.Components1[0]; foreach (int i in _woundedPeds) { WoundedComponent wounded = _woundedPeds.Components1[i]; PainInfoComponent painInfo = _woundedPeds.Components2[i]; float maxPain = painInfo.UnbearablePain; int entity = _woundedPeds.Entities[i]; float basePain = 0; foreach (int woundEntity in wounded.WoundEntities) { var pain = _ecsWorld.GetComponent <BasePainComponent>(woundEntity); if (pain == null) { continue; } basePain += pain.BasePain; #if DEBUG _logger.MakeLog($"{woundEntity.GetEntityName(_ecsWorld)} increase pain for {pain.BasePain}"); #endif } var additionalPain = _ecsWorld.GetComponent <AdditionalPainComponent>(entity); if (additionalPain != null) { basePain += additionalPain.AdditionalPain; } if (basePain <= 0) { continue; } int 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 int pedEntity = _woundedPeds.Entities[i]; float painPercent = painComponent.PainAmount / maxPain * 100f; _logger.MakeLog($"Entity ({pedEntity}): Base pain is {basePain:0.0}; " + $"Final pain is {finalPain:0.0}; " + $"Pain percent is {painPercent:0.0}"); #endif } foreach (int i in _painToReduce) { PainComponent painComponent = _painToReduce.Components1[i]; float painRecoverySpeed = _painToReduce.Components2[i].PainRecoverySpeed; int entity = _painToReduce.Entities[i]; painComponent.PainAmount -= painRecoverySpeed * GswExtensions.GetDeltaTime(); if (painComponent.PainAmount > 0) { continue; } _ecsWorld.AddComponent <PainIsGoneComponent>(entity); _ecsWorld.RemoveComponent <PainComponent>(entity); } foreach (int i in _healedEntities) { int entity = _healedEntities.Entities[i]; _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 }