using Content.Shared.Chemistry.Reagent;
using Content.Shared.StatusEffect;
using JetBrains.Annotations;
using Robust.Shared.Prototypes;
namespace Content.Server.Chemistry.ReagentEffects.StatusEffects
{
///
/// Adds a generic status effect to the entity,
/// not worrying about things like how to affect the time it lasts for
/// or component fields or anything. Just adds a component to an entity
/// for a given time. Easy.
///
///
/// Can be used for things like adding accents or something. I don't know. Go wild.
///
[UsedImplicitly]
public sealed partial class GenericStatusEffect : ReagentEffect
{
[DataField(required: true)]
public string Key = default!;
[DataField]
public string Component = String.Empty;
[DataField]
public float Time = 2.0f;
///
/// true - refresh status effect time, false - accumulate status effect time
///
[DataField]
public bool Refresh = true;
///
/// Should this effect add the status effect, remove time from it, or set its cooldown?
///
[DataField]
public StatusEffectMetabolismType Type = StatusEffectMetabolismType.Add;
public override void Effect(ReagentEffectArgs args)
{
var statusSys = args.EntityManager.EntitySysManager.GetEntitySystem();
var time = Time;
time *= args.Scale;
if (Type == StatusEffectMetabolismType.Add && Component != String.Empty)
{
statusSys.TryAddStatusEffect(args.SolutionEntity, Key, TimeSpan.FromSeconds(time), Refresh, Component);
}
else if (Type == StatusEffectMetabolismType.Remove)
{
statusSys.TryRemoveTime(args.SolutionEntity, Key, TimeSpan.FromSeconds(time));
}
else if (Type == StatusEffectMetabolismType.Set)
{
statusSys.TrySetTime(args.SolutionEntity, Key, TimeSpan.FromSeconds(time));
}
}
protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys) => Loc.GetString(
"reagent-effect-guidebook-status-effect",
("chance", Probability),
("type", Type),
("time", Time),
("key", $"reagent-effect-status-effect-{Key}"));
}
public enum StatusEffectMetabolismType
{
Add,
Remove,
Set
}
}