using Content.Shared.Chemistry; using Content.Shared.Xenoarchaeology.Artifact.Components; using Content.Shared.Xenoarchaeology.Artifact.XAT.Components; namespace Content.Shared.Xenoarchaeology.Artifact.XAT; /// /// System for xeno artifact trigger that requires some chemical reagent. /// public sealed class XATReactiveSystem : BaseXATSystem { /// public override void Initialize() { base.Initialize(); XATSubscribeDirectEvent(OnReaction); } private void OnReaction(Entity artifact, Entity node, ref ReactionEntityEvent args) { var reactiveTriggerComponent = node.Comp1; if (!reactiveTriggerComponent.ReactionMethods.Contains(args.Method)) return; if (args.ReagentQuantity.Quantity < reactiveTriggerComponent.MinQuantity) return; if (!reactiveTriggerComponent.Reagents.Contains(args.Reagent.ID)) return; if (reactiveTriggerComponent.ReactiveGroups?.Count > 0 && !ReagentHaveReactiveGroup(args, reactiveTriggerComponent)) return; Trigger(artifact, node); } private static bool ReagentHaveReactiveGroup(ReactionEntityEvent args, XATReactiveComponent reactiveTriggerComponent) { var reactiveReagentEffectEntries = args.Reagent.ReactiveEffects; if (reactiveReagentEffectEntries == null) { return false; } var reactiveGroups = reactiveTriggerComponent.ReactiveGroups; foreach(var reactiveGroup in reactiveGroups) { if (reactiveReagentEffectEntries.TryGetValue(reactiveGroup, out var effectEntry) && effectEntry.Methods?.Contains(args.Method) == true) { return true; } } return false; } }