using Content.Server.Chat.Systems; using Content.Shared.Chat; using Content.Shared.Damage; using Content.Shared.Damage.Prototypes; using Content.Shared.Emag.Components; using Content.Shared.Interaction; using Content.Shared.Popups; using Content.Shared.Silicons.Bots; using Content.Shared.Tag; using Robust.Shared.Audio.Systems; using Robust.Shared.Prototypes; namespace Content.Server.NPC.HTN.PrimitiveTasks.Operators.Specific; public sealed partial class WeldbotWeldOperator : HTNOperator { [Dependency] private readonly IEntityManager _entMan = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; private ChatSystem _chat = default!; private WeldbotSystem _weldbot = default!; private SharedAudioSystem _audio = default!; private SharedInteractionSystem _interaction = default!; private SharedPopupSystem _popup = default!; private DamageableSystem _damageableSystem = default!; private TagSystem _tagSystem = default!; public const string SiliconTag = "SiliconMob"; /// /// Target entity to inject. /// [DataField(required: true)] public string TargetKey = string.Empty; public override void Initialize(IEntitySystemManager sysManager) { base.Initialize(sysManager); _chat = sysManager.GetEntitySystem(); _weldbot = sysManager.GetEntitySystem(); _audio = sysManager.GetEntitySystem(); _interaction = sysManager.GetEntitySystem(); _popup = sysManager.GetEntitySystem(); _damageableSystem = sysManager.GetEntitySystem(); _tagSystem = sysManager.GetEntitySystem(); } public override void TaskShutdown(NPCBlackboard blackboard, HTNOperatorStatus status) { base.TaskShutdown(blackboard, status); blackboard.Remove(TargetKey); } public override HTNOperatorStatus Update(NPCBlackboard blackboard, float frameTime) { var owner = blackboard.GetValue(NPCBlackboard.Owner); if (!blackboard.TryGetValue(TargetKey, out var target, _entMan) || _entMan.Deleted(target)) return HTNOperatorStatus.Failed; var tagPrototype = _prototypeManager.Index(SiliconTag); if (!_entMan.TryGetComponent(target, out var tagComponent) || !_tagSystem.HasTag(tagComponent, tagPrototype) || !_entMan.TryGetComponent(owner, out var botComp) || !_entMan.TryGetComponent(target, out var damage) || !_interaction.InRangeUnobstructed(owner, target) || (damage.DamagePerGroup["Brute"].Value == 0 && !_entMan.HasComponent(owner))) return HTNOperatorStatus.Failed; if (botComp.IsEmagged) { if (!_prototypeManager.TryIndex("Burn", out var prototype)) return HTNOperatorStatus.Failed; _damageableSystem.TryChangeDamage(target, new DamageSpecifier(prototype, 10), true, false, damage); } else { if (!_prototypeManager.TryIndex("Brute", out var prototype)) return HTNOperatorStatus.Failed; _damageableSystem.TryChangeDamage(target, new DamageSpecifier(prototype, -50), true, false, damage); } _audio.PlayPvs(botComp.WeldSound, target); if(damage.DamagePerGroup["Brute"].Value == 0) //only say "all done if we're actually done!" _chat.TrySendInGameICMessage(owner, Loc.GetString("weldbot-finish-weld"), InGameICChatType.Speak, hideChat: true, hideLog: true); return HTNOperatorStatus.Finished; } }