From fc2ee61f755cd245a8cbc3fd73c93357038471ed Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Thu, 20 Aug 2020 21:45:28 +0200 Subject: [PATCH] Fix verbs in-hand. Properly this time. --- .../GameObjects/EntitySystems/VerbSystem.cs | 14 ++++---- .../GameObjects/EntitySystems/VerbSystem.cs | 36 ++++--------------- .../GameObjects/Verbs/GlobalVerb.cs | 14 +------- Content.Shared/GameObjects/Verbs/Verb.cs | 15 +------- Content.Shared/GameObjects/Verbs/VerbBase.cs | 18 ++++++++++ .../GameObjects/Verbs/VerbUtility.cs | 30 ++++++++++++++++ 6 files changed, 63 insertions(+), 64 deletions(-) create mode 100644 Content.Shared/GameObjects/Verbs/VerbBase.cs diff --git a/Content.Client/GameObjects/EntitySystems/VerbSystem.cs b/Content.Client/GameObjects/EntitySystems/VerbSystem.cs index f388263d65..486d491d1c 100644 --- a/Content.Client/GameObjects/EntitySystems/VerbSystem.cs +++ b/Content.Client/GameObjects/EntitySystems/VerbSystem.cs @@ -207,11 +207,10 @@ namespace Content.Client.GameObjects.EntitySystems //Get verbs, component dependent. foreach (var (component, verb) in VerbUtility.GetVerbs(entity)) { - if (verb.RequireInteractionRange && !VerbUtility.InVerbUseRange(user, entity)) - continue; - - if (verb.BlockedByContainers && !user.IsInSameOrNoContainer(entity)) + if (!VerbUtility.VerbAccessChecks(user, entity, verb)) + { continue; + } var verbData = verb.GetData(user, component); @@ -232,11 +231,10 @@ namespace Content.Client.GameObjects.EntitySystems //Get global verbs. Visible for all entities regardless of their components. foreach (var globalVerb in VerbUtility.GetGlobalVerbs(Assembly.GetExecutingAssembly())) { - if (globalVerb.RequireInteractionRange && !VerbUtility.InVerbUseRange(user, entity)) - continue; - - if (globalVerb.BlockedByContainers && !user.IsInSameOrNoContainer(entity)) + if (!VerbUtility.VerbAccessChecks(user, entity, globalVerb)) + { continue; + } var verbData = globalVerb.GetData(user, entity); diff --git a/Content.Server/GameObjects/EntitySystems/VerbSystem.cs b/Content.Server/GameObjects/EntitySystems/VerbSystem.cs index 761681b1ac..63775b3e44 100644 --- a/Content.Server/GameObjects/EntitySystems/VerbSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/VerbSystem.cs @@ -51,12 +51,7 @@ namespace Content.Server.GameObjects.EntitySystems continue; } - if (verb.RequireInteractionRange && !VerbUtility.InVerbUseRange(userEntity, entity)) - { - break; - } - - if (verb.BlockedByContainers && !userEntity.IsInSameOrNoContainer(entity)) + if (!VerbUtility.VerbAccessChecks(userEntity, entity, verb)) { break; } @@ -72,13 +67,7 @@ namespace Content.Server.GameObjects.EntitySystems continue; } - if (globalVerb.RequireInteractionRange && - !VerbUtility.InVerbUseRange(userEntity, entity)) - { - break; - } - - if (globalVerb.BlockedByContainers && !userEntity.IsInSameOrNoContainer(entity)) + if (!VerbUtility.VerbAccessChecks(userEntity, entity, globalVerb)) { break; } @@ -110,19 +99,9 @@ namespace Content.Server.GameObjects.EntitySystems //Get verbs, component dependent. foreach (var (component, verb) in VerbUtility.GetVerbs(entity)) { - if (verb.RequireInteractionRange && !VerbUtility.InVerbUseRange(userEntity, entity)) - continue; - - if (verb.BlockedByContainers) + if (!VerbUtility.VerbAccessChecks(userEntity, entity, verb)) { - if (!userEntity.IsInSameOrNoContainer(entity)) - { - if (!ContainerHelpers.TryGetContainer(entity, out var container) || - container.Owner != userEntity) - { - continue; - } - } + continue; } var verbData = verb.GetData(userEntity, component); @@ -136,11 +115,10 @@ namespace Content.Server.GameObjects.EntitySystems //Get global verbs. Visible for all entities regardless of their components. foreach (var globalVerb in VerbUtility.GetGlobalVerbs(Assembly.GetExecutingAssembly())) { - if (globalVerb.RequireInteractionRange && !VerbUtility.InVerbUseRange(userEntity, entity)) - continue; - - if (globalVerb.BlockedByContainers && !userEntity.IsInSameOrNoContainer(entity)) + if (!VerbUtility.VerbAccessChecks(userEntity, entity, globalVerb)) + { continue; + } var verbData = globalVerb.GetData(userEntity, entity); if (verbData.IsInvisible) diff --git a/Content.Shared/GameObjects/Verbs/GlobalVerb.cs b/Content.Shared/GameObjects/Verbs/GlobalVerb.cs index e14830fab3..c4ff6bfe0c 100644 --- a/Content.Shared/GameObjects/Verbs/GlobalVerb.cs +++ b/Content.Shared/GameObjects/Verbs/GlobalVerb.cs @@ -12,20 +12,8 @@ namespace Content.Shared.GameObjects.Verbs /// To add a global verb to all entities, /// define it and mark it with /// - public abstract class GlobalVerb + public abstract class GlobalVerb : VerbBase { - /// - /// If true, this verb requires the user to be within - /// meters from the entity on which this verb resides. - /// - public virtual bool RequireInteractionRange => true; - - /// - /// If true, this verb requires both the user and the entity on which - /// this verb resides to be in the same container or no container. - /// - public virtual bool BlockedByContainers => true; - /// /// Gets the visible verb data for the user. /// diff --git a/Content.Shared/GameObjects/Verbs/Verb.cs b/Content.Shared/GameObjects/Verbs/Verb.cs index 723f90f1f3..89b1ac59c6 100644 --- a/Content.Shared/GameObjects/Verbs/Verb.cs +++ b/Content.Shared/GameObjects/Verbs/Verb.cs @@ -12,21 +12,8 @@ namespace Content.Shared.GameObjects.Verbs /// and mark it with /// [UsedImplicitly] - public abstract class Verb + public abstract class Verb : VerbBase { - /// - /// If true, this verb requires the user to be inside within - /// meters from the entity on which this verb resides. - /// - public virtual bool RequireInteractionRange => true; - - /// - /// If true, this verb requires both the user and the entity on which - /// this verb resides to be in the same container or no container. - /// OR the user can be the entity's container - /// - public virtual bool BlockedByContainers => true; - /// /// Gets the visible verb data for the user. /// diff --git a/Content.Shared/GameObjects/Verbs/VerbBase.cs b/Content.Shared/GameObjects/Verbs/VerbBase.cs new file mode 100644 index 0000000000..a1b6c21cd3 --- /dev/null +++ b/Content.Shared/GameObjects/Verbs/VerbBase.cs @@ -0,0 +1,18 @@ +namespace Content.Shared.GameObjects.Verbs +{ + public abstract class VerbBase + { + /// + /// If true, this verb requires the user to be inside within + /// meters from the entity on which this verb resides. + /// + public virtual bool RequireInteractionRange => true; + + /// + /// If true, this verb requires both the user and the entity on which + /// this verb resides to be in the same container or no container. + /// OR the user can be the entity's container + /// + public virtual bool BlockedByContainers => true; + } +} diff --git a/Content.Shared/GameObjects/Verbs/VerbUtility.cs b/Content.Shared/GameObjects/Verbs/VerbUtility.cs index 275a00330f..a876f7c11b 100644 --- a/Content.Shared/GameObjects/Verbs/VerbUtility.cs +++ b/Content.Shared/GameObjects/Verbs/VerbUtility.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Reflection; +using Robust.Shared.Containers; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Utility; @@ -50,6 +51,21 @@ namespace Content.Shared.GameObjects.Verbs } } + public static bool VerbAccessChecks(IEntity user, IEntity target, VerbBase verb) + { + if (verb.RequireInteractionRange && !InVerbUseRange(user, target)) + { + return false; + } + + if (verb.BlockedByContainers && !VerbContainerCheck(user, target)) + { + return false; + } + + return true; + } + public static bool InVerbUseRange(IEntity user, IEntity target) { var distanceSquared = (user.Transform.WorldPosition - target.Transform.WorldPosition) @@ -60,5 +76,19 @@ namespace Content.Shared.GameObjects.Verbs } return true; } + + public static bool VerbContainerCheck(IEntity user, IEntity target) + { + if (!user.IsInSameOrNoContainer(target)) + { + if (!ContainerHelpers.TryGetContainer(target, out var container) || + container.Owner != user) + { + return false; + } + } + + return true; + } } }