using Content.Shared._Stalker.Characteristics; using Content.Shared._Stalker.Modifier; namespace Content.Server._Stalker.Characteristics.Modifiers; public abstract class BaseCharacteristicFloatModifierSystem : EntitySystem where TCharacteristicModifierComponent : BaseCharacteristicFloatModifierComponent where TModifierComponent : BaseFloatModifierComponent where TModifierSystem : BaseFloatModifierSystem { [Dependency] private readonly TModifierSystem _modifierSystem = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnCharacteristicUpdate); SubscribeLocalEvent>(OnModifierRefresh); } private void OnCharacteristicUpdate(Entity ent, ref CharacteristicUpdatedEvent args) { if (args.Characteristic.Type != ent.Comp.AllowedType) return; ent.Comp.Value = GetModifier(ent, args.NewLevel); _modifierSystem.RefreshModifiers(ent); } private void OnModifierRefresh(Entity ent, ref FloatModifierRefreshEvent args) { args.Modify(ent.Comp.Value); } protected virtual float GetModifier(Entity ent, int value) { return Math.Clamp(1f + Math.Abs(value) * ent.Comp.Modifier, ent.Comp.MinModifier, ent.Comp.MaxModifier); } }