diff --git a/Content.Server/Mind/Commands/RenameCommand.cs b/Content.Server/Mind/Commands/RenameCommand.cs new file mode 100644 index 0000000000..7ab5712502 --- /dev/null +++ b/Content.Server/Mind/Commands/RenameCommand.cs @@ -0,0 +1,114 @@ +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using Content.Server.Access.Systems; +using Content.Server.Administration; +using Content.Server.Cloning; +using Content.Server.Mind.Components; +using Content.Server.PDA; +using Content.Shared.Access.Components; +using Content.Shared.Administration; +using Content.Shared.PDA; +using Robust.Server.Player; +using Robust.Shared.Console; +using Robust.Shared.GameObjects; +using Robust.Shared.IoC; + +namespace Content.Server.Mind.Commands; + +[AdminCommand(AdminFlags.VarEdit)] +public class RenameCommand : IConsoleCommand +{ + public string Command => "rename"; + public string Description => "Renames an entity and its cloner entries, ID cards, and PDAs."; + public string Help => "rename "; + + public void Execute(IConsoleShell shell, string argStr, string[] args) + { + if (args.Length != 2) + { + shell.WriteLine(Help); + return; + } + + var name = args[1]; + if (name.Length > SharedIdCardConsoleComponent.MaxFullNameLength) + { + shell.WriteLine("Name is too long."); + return; + } + + var entMan = IoCManager.Resolve(); + + if (!TryParseUid(args[0], shell, entMan, out var entityUid)) + return; + + // Metadata + var metadata = entMan.GetComponent(entityUid); + var oldName = metadata.EntityName; + metadata.EntityName = name; + + var entSysMan = IoCManager.Resolve(); + + if (entMan.TryGetComponent(entityUid, out MindComponent mind) && mind.Mind != null) + { + // Mind + mind.Mind.CharacterName = name; + + // Cloner entries + if (entSysMan.TryGetEntitySystem(out var cloningSystem) + && cloningSystem.MindToId.TryGetValue(mind.Mind, out var cloningId) + && cloningSystem.IdToDNA.ContainsKey(cloningId)) + { + cloningSystem.IdToDNA[cloningId] = + new ClonerDNAEntry(mind.Mind, cloningSystem.IdToDNA[cloningId].Profile.WithName(name)); + } + } + + // Id Cards + if (entSysMan.TryGetEntitySystem(out var idCardSystem)) + { + if (idCardSystem.TryFindIdCard(entityUid, out var idCard)) + idCardSystem.TryChangeFullName(idCard.Owner, name, idCard); + else + { + foreach (var idCardComponent in entMan.EntityQuery()) + { + if (idCardComponent.OriginalOwnerName != oldName) + continue; + idCardSystem.TryChangeFullName(idCardComponent.Owner, name, idCardComponent); + } + } + } + + // PDAs + if (entSysMan.TryGetEntitySystem(out var pdaSystem)) + { + foreach (var pdaComponent in entMan.EntityQuery()) + { + if (pdaComponent.OwnerName != oldName) + continue; + pdaSystem.SetOwner(pdaComponent, name); + } + } + } + + private static bool TryParseUid(string str, IConsoleShell shell, + IEntityManager entMan, out EntityUid entityUid) + { + if (EntityUid.TryParse(str, out entityUid) && entMan.EntityExists(entityUid)) + return true; + + var playerMan = IoCManager.Resolve(); + if (playerMan.TryGetSessionByUsername(str, out var session) && session.AttachedEntity.HasValue) + { + entityUid = session.AttachedEntity.Value; + return true; + } + + if (session == null) + shell.WriteError("Can't find username/uid: " + str); + else + shell.WriteError(str + " does not have an entity."); + return false; + } +}