private void OnHostShutdown(EntityUid uid, GuardianHostComponent component, ComponentShutdown args)
 {
     if (component.HostedGuardian == null)
     {
         return;
     }
     EntityManager.QueueDeleteEntity(component.HostedGuardian.Value);
 }
        /// <summary>
        /// Called every time the host moves, to make sure the distance between the host and the guardian isn't too far
        /// </summary>
        private void OnHostMove(EntityUid uid, GuardianHostComponent component, ref MoveEvent args)
        {
            if (component.HostedGuardian == null ||
                !TryComp(component.HostedGuardian, out GuardianComponent? guardianComponent) ||
                !guardianComponent.GuardianLoose)
            {
                return;
            }

            CheckGuardianMove(uid, component.HostedGuardian.Value, component);
        }
        private void RetractGuardian(GuardianHostComponent hostComponent, GuardianComponent guardianComponent)
        {
            if (!guardianComponent.GuardianLoose)
            {
                DebugTools.Assert(hostComponent.GuardianContainer.Contains(guardianComponent.Owner));
                return;
            }

            hostComponent.GuardianContainer.Insert(guardianComponent.Owner);
            DebugTools.Assert(hostComponent.GuardianContainer.Contains(guardianComponent.Owner));
            _popupSystem.PopupEntity(Loc.GetString("guardian-entity-recall"), hostComponent.Owner, Filter.Pvs(hostComponent.Owner));
            guardianComponent.GuardianLoose = false;
        }
        private void OnPerformAction(EntityUid uid, GuardianHostComponent component, GuardianToggleActionEvent args)
        {
            if (args.Handled)
            {
                return;
            }

            if (component.HostedGuardian != null)
            {
                ToggleGuardian(component);
            }

            args.Handled = true;
        }
        public void ToggleGuardian(GuardianHostComponent hostComponent)
        {
            if (hostComponent.HostedGuardian == null ||
                !TryComp(hostComponent.HostedGuardian, out GuardianComponent? guardianComponent))
            {
                return;
            }

            if (guardianComponent.GuardianLoose)
            {
                RetractGuardian(hostComponent, guardianComponent);
            }
            else
            {
                ReleaseGuardian(hostComponent, guardianComponent);
            }
        }
        /// <summary>
        /// Triggers when the host receives damage which puts the host in either critical or killed state
        /// </summary>
        private void OnHostStateChange(EntityUid uid, GuardianHostComponent component, MobStateChangedEvent args)
        {
            if (component.HostedGuardian == null)
            {
                return;
            }

            if (args.CurrentMobState.IsCritical())
            {
                _popupSystem.PopupEntity(Loc.GetString("guardian-critical-warn"), component.HostedGuardian.Value, Filter.Entities(component.HostedGuardian.Value));
                SoundSystem.Play("/Audio/Effects/guardian_warn.ogg", Filter.Entities(component.HostedGuardian.Value), component.HostedGuardian.Value);
            }
            else if (args.CurrentMobState.IsDead())
            {
                SoundSystem.Play("/Audio/Voice/Human/malescream_guardian.ogg", Filter.Pvs(uid), uid, AudioHelpers.WithVariation(0.20f));
                EntityManager.RemoveComponent <GuardianHostComponent>(uid);
            }
        }
        private void ReleaseGuardian(GuardianHostComponent hostComponent, GuardianComponent guardianComponent)
        {
            if (guardianComponent.GuardianLoose)
            {
                DebugTools.Assert(!hostComponent.GuardianContainer.Contains(guardianComponent.Owner));
                return;
            }

            if (!CanRelease(hostComponent, guardianComponent))
            {
                _popupSystem.PopupEntity(Loc.GetString("guardian-no-soul"), hostComponent.Owner, Filter.Entities(hostComponent.Owner));
                return;
            }

            DebugTools.Assert(hostComponent.GuardianContainer.Contains(guardianComponent.Owner));
            hostComponent.GuardianContainer.Remove(guardianComponent.Owner);
            DebugTools.Assert(!hostComponent.GuardianContainer.Contains(guardianComponent.Owner));

            guardianComponent.GuardianLoose = true;
        }
 private void OnHostInit(EntityUid uid, GuardianHostComponent component, ComponentInit args)
 {
     component.GuardianContainer = uid.EnsureContainer <ContainerSlot>("GuardianContainer");
     _actionSystem.AddAction(uid, component.Action, null);
 }
 private bool CanRelease(GuardianHostComponent host, GuardianComponent guardian)
 {
     return(HasComp <ActorComponent>(guardian.Owner));
 }
 private void OnHostInit(EntityUid uid, GuardianHostComponent component, ComponentInit args)
 {
     component.GuardianContainer = uid.EnsureContainer <ContainerSlot>("GuardianContainer");
 }