BaseCharacteristicFloatModifierSystem.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. using Content.Shared._Stalker.Characteristics;
  2. using Content.Shared._Stalker.Modifier;
  3. namespace Content.Server._Stalker.Characteristics.Modifiers;
  4. public abstract class
  5. BaseCharacteristicFloatModifierSystem<TCharacteristicModifierComponent, TModifierComponent, TModifierSystem> : EntitySystem
  6. where TCharacteristicModifierComponent : BaseCharacteristicFloatModifierComponent
  7. where TModifierComponent : BaseFloatModifierComponent
  8. where TModifierSystem : BaseFloatModifierSystem<TModifierComponent>
  9. {
  10. [Dependency] private readonly TModifierSystem _modifierSystem = default!;
  11. public override void Initialize()
  12. {
  13. base.Initialize();
  14. SubscribeLocalEvent<TCharacteristicModifierComponent, CharacteristicUpdatedEvent>(OnCharacteristicUpdate);
  15. SubscribeLocalEvent<TCharacteristicModifierComponent, FloatModifierRefreshEvent<TModifierComponent>>(OnModifierRefresh);
  16. }
  17. private void OnCharacteristicUpdate(Entity<TCharacteristicModifierComponent> ent, ref CharacteristicUpdatedEvent args)
  18. {
  19. if (args.Characteristic.Type != ent.Comp.AllowedType)
  20. return;
  21. ent.Comp.Value = GetModifier(ent, args.NewLevel);
  22. _modifierSystem.RefreshModifiers(ent);
  23. }
  24. private void OnModifierRefresh(Entity<TCharacteristicModifierComponent> ent, ref FloatModifierRefreshEvent<TModifierComponent> args)
  25. {
  26. args.Modify(ent.Comp.Value);
  27. }
  28. protected virtual float GetModifier(Entity<TCharacteristicModifierComponent> ent, int value)
  29. {
  30. return Math.Clamp(1f + Math.Abs(value) * ent.Comp.Modifier, ent.Comp.MinModifier, ent.Comp.MaxModifier);
  31. }
  32. }