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;
+ }
}
}