ControlMob verb and command (#724)
* ControlMob verb and command, mobs have MindComponent by default * Use IActorComponent instead of MindComponent for User entity. Fixes using Control Mob while aghosting/visiting an entity. * Use static Loc class
This commit is contained in:
committed by
GitHub
parent
8a5e879633
commit
090dd8cee8
66
Content.Server/Administration/ControlMob.cs
Normal file
66
Content.Server/Administration/ControlMob.cs
Normal file
@@ -0,0 +1,66 @@
|
||||
using Content.Server.GameObjects.Components.Mobs;
|
||||
using Content.Server.Mobs;
|
||||
using Content.Server.Players;
|
||||
using Robust.Server.Interfaces.Console;
|
||||
using Robust.Server.Interfaces.Player;
|
||||
using Robust.Shared.GameObjects;
|
||||
using Robust.Shared.Interfaces.GameObjects;
|
||||
using Robust.Shared.IoC;
|
||||
using Robust.Shared.Localization;
|
||||
|
||||
namespace Content.Server.Administration
|
||||
{
|
||||
class ControlMob : IClientCommand
|
||||
{
|
||||
public string Command => "controlmob";
|
||||
public string Description => Loc.GetString("Transfers user mind to the specified entity.");
|
||||
public string Help => Loc.GetString("Usage: controlmob <mobUid>.");
|
||||
|
||||
public void Execute(IConsoleShell shell, IPlayerSession player, string[] args)
|
||||
{
|
||||
if (player == null)
|
||||
{
|
||||
shell.SendText((IPlayerSession) null, "Server cannot do this.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (args.Length != 1)
|
||||
{
|
||||
shell.SendText(player, Loc.GetString("Wrong number of arguments."));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
var mind = player.ContentData().Mind;
|
||||
var entityManager = IoCManager.Resolve<IEntityManager>();
|
||||
|
||||
if (!int.TryParse(args[0], out var targetId))
|
||||
{
|
||||
shell.SendText(player, Loc.GetString("Argument must be a number."));
|
||||
return;
|
||||
}
|
||||
|
||||
var eUid = new EntityUid(targetId);
|
||||
|
||||
if (!eUid.IsValid() || !entityManager.EntityExists(eUid))
|
||||
{
|
||||
shell.SendText(player, Loc.GetString("Invalid entity ID."));
|
||||
return;
|
||||
}
|
||||
|
||||
var target = entityManager.GetEntity(eUid);
|
||||
if (!target.TryGetComponent(out MindComponent mindComponent))
|
||||
{
|
||||
shell.SendText(player, Loc.GetString("Target entity is not a mob!"));
|
||||
return;
|
||||
}
|
||||
|
||||
if(mind.IsVisitingEntity)
|
||||
mind.UnVisit();
|
||||
|
||||
mindComponent.Mind?.TransferTo(null);
|
||||
mind.TransferTo(target);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
50
Content.Server/GlobalVerbs/ControlMobVerb.cs
Normal file
50
Content.Server/GlobalVerbs/ControlMobVerb.cs
Normal file
@@ -0,0 +1,50 @@
|
||||
using Content.Server.GameObjects;
|
||||
using Content.Server.GameObjects.Components.Mobs;
|
||||
using Content.Server.GameObjects.Components.Nutrition;
|
||||
using Content.Server.Players;
|
||||
using Content.Shared.GameObjects;
|
||||
using Robust.Server.Console;
|
||||
using Robust.Server.Interfaces.GameObjects;
|
||||
using Robust.Shared.GameObjects;
|
||||
using Robust.Shared.Interfaces.GameObjects;
|
||||
using Robust.Shared.IoC;
|
||||
using Robust.Shared.Log;
|
||||
|
||||
namespace Content.Server.GlobalVerbs
|
||||
{
|
||||
[GlobalVerb]
|
||||
public class ControlMobVerb : GlobalVerb
|
||||
{
|
||||
public override string GetText(IEntity user, IEntity target) => "Control Mob";
|
||||
public override bool RequireInteractionRange => false;
|
||||
|
||||
public override VerbVisibility GetVisibility(IEntity user, IEntity target)
|
||||
{
|
||||
var groupController = IoCManager.Resolve<IConGroupController>();
|
||||
if (user == target) return VerbVisibility.Invisible;
|
||||
|
||||
if (user.TryGetComponent<IActorComponent>(out var player))
|
||||
{
|
||||
if (!user.HasComponent<MindComponent>() || !target.HasComponent<MindComponent>())
|
||||
return VerbVisibility.Invisible;
|
||||
|
||||
if (groupController.CanCommand(player.playerSession, "controlmob"))
|
||||
return VerbVisibility.Visible;
|
||||
}
|
||||
|
||||
return VerbVisibility.Invisible;
|
||||
}
|
||||
|
||||
public override void Activate(IEntity user, IEntity target)
|
||||
{
|
||||
var userMind = user.GetComponent<IActorComponent>().playerSession.ContentData().Mind;
|
||||
var targetMind = target.GetComponent<MindComponent>();
|
||||
|
||||
if(userMind.IsVisitingEntity)
|
||||
userMind.UnVisit();
|
||||
|
||||
targetMind.Mind?.TransferTo(null);
|
||||
userMind.TransferTo(target);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -55,6 +55,7 @@
|
||||
- respawn
|
||||
- rejuvenate
|
||||
- addcomp
|
||||
- controlmob
|
||||
- kick
|
||||
- listplayers
|
||||
- loc
|
||||
@@ -94,6 +95,7 @@
|
||||
- respawn
|
||||
- rejuvenate
|
||||
- addcomp
|
||||
- controlmob
|
||||
- kick
|
||||
- listplayers
|
||||
- loc
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
description: A miserable pile of secrets
|
||||
drawdepth: Mobs
|
||||
components:
|
||||
- type: Mind
|
||||
- type: Hands
|
||||
hands:
|
||||
- left
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
save: false
|
||||
description: Boo!
|
||||
components:
|
||||
- type: Mind
|
||||
- type: Physics
|
||||
mass: 5
|
||||
- type: Eye
|
||||
|
||||
Reference in New Issue
Block a user