Add completions to addobjective and localize it (#30456)

* Add completions to addobjective and localise it

* Cleanup

* Fix

* Make a manager to handle subscribtion completion options

This is so we can unsubscribe to prototype reloads properly

* Convert the manager into a system

* Move the system into the systems folder

I forgor

* Merge CompletionsSystem into ObjectivesSystem
This commit is contained in:
nikthechampiongr
2024-09-08 07:28:43 +00:00
committed by GitHub
parent b2007bce19
commit 4b8bedaeef
5 changed files with 109 additions and 39 deletions

View File

@@ -14,6 +14,7 @@ using Content.Server.Info;
using Content.Server.IoC; using Content.Server.IoC;
using Content.Server.Maps; using Content.Server.Maps;
using Content.Server.NodeContainer.NodeGroups; using Content.Server.NodeContainer.NodeGroups;
using Content.Server.Objectives;
using Content.Server.Players; using Content.Server.Players;
using Content.Server.Players.JobWhitelist; using Content.Server.Players.JobWhitelist;
using Content.Server.Players.PlayTimeTracking; using Content.Server.Players.PlayTimeTracking;

View File

@@ -14,6 +14,7 @@ using Content.Server.Mapping;
using Content.Server.Maps; using Content.Server.Maps;
using Content.Server.MoMMI; using Content.Server.MoMMI;
using Content.Server.NodeContainer.NodeGroups; using Content.Server.NodeContainer.NodeGroups;
using Content.Server.Objectives;
using Content.Server.Players; using Content.Server.Players;
using Content.Server.Players.JobWhitelist; using Content.Server.Players.JobWhitelist;
using Content.Server.Players.PlayTimeTracking; using Content.Server.Players.PlayTimeTracking;

View File

@@ -1,56 +1,73 @@
using Content.Server.Administration; using System.Linq;
using Content.Server.Administration;
using Content.Shared.Administration; using Content.Shared.Administration;
using Content.Shared.Mind; using Content.Shared.Mind;
using Content.Shared.Objectives.Components; using Content.Shared.Objectives.Components;
using Content.Shared.Prototypes;
using Robust.Server.Player; using Robust.Server.Player;
using Robust.Shared.Console; using Robust.Shared.Console;
using Robust.Shared.Prototypes; using Robust.Shared.Prototypes;
namespace Content.Server.Objectives.Commands namespace Content.Server.Objectives.Commands;
{
[AdminCommand(AdminFlags.Admin)]
public sealed class AddObjectiveCommand : IConsoleCommand
{
[Dependency] private readonly IEntityManager _entityManager = default!;
public string Command => "addobjective"; [AdminCommand(AdminFlags.Admin)]
public string Description => "Adds an objective to the player's mind."; public sealed class AddObjectiveCommand : LocalizedEntityCommands
public string Help => "addobjective <username> <objectiveID>"; {
public void Execute(IConsoleShell shell, string argStr, string[] args) [Dependency] private readonly IPlayerManager _players = default!;
[Dependency] private readonly IPrototypeManager _prototypes = default!;
[Dependency] private readonly SharedMindSystem _mind = default!;
[Dependency] private readonly ObjectivesSystem _objectives = default!;
public override string Command => "addobjective";
public override void Execute(IConsoleShell shell, string argStr, string[] args)
{ {
if (args.Length != 2) if (args.Length != 2)
{ {
shell.WriteLine("Expected exactly 2 arguments."); shell.WriteError(Loc.GetString(Loc.GetString("cmd-addobjective-invalid-args")));
return; return;
} }
var mgr = IoCManager.Resolve<IPlayerManager>(); if (!_players.TryGetSessionByUsername(args[0], out var data))
if (!mgr.TryGetSessionByUsername(args[0], out var data))
{ {
shell.WriteLine("Can't find the playerdata."); shell.WriteError(Loc.GetString("cmd-addobjective-player-not-found"));
return; return;
} }
var minds = _entityManager.System<SharedMindSystem>(); if (!_mind.TryGetMind(data, out var mindId, out var mind))
if (!minds.TryGetMind(data, out var mindId, out var mind))
{ {
shell.WriteLine("Can't find the mind."); shell.WriteError(Loc.GetString("cmd-addobjective-mind-not-found"));
return; return;
} }
if (!IoCManager.Resolve<IPrototypeManager>() if (!_prototypes.TryIndex<EntityPrototype>(args[1], out var proto) ||
.TryIndex<EntityPrototype>(args[1], out var proto) || !proto.HasComponent<ObjectiveComponent>())
!proto.TryGetComponent<ObjectiveComponent>(out _))
{ {
shell.WriteLine($"Can't find matching objective prototype {args[1]}"); shell.WriteError(Loc.GetString("cmd-addobjective-objective-not-found", ("obj", args[1])));
return; return;
} }
if (!minds.TryAddObjective(mindId, mind, args[1])) if (!_mind.TryAddObjective(mindId, mind, args[1]))
{ {
// can fail for other reasons so dont pretend to be right // can fail for other reasons so dont pretend to be right
shell.WriteLine("Failed to add the objective. Maybe requirements dont allow that objective to be added."); shell.WriteError(Loc.GetString("cmd-addobjective-adding-failed"));
} }
} }
public override CompletionResult GetCompletion(IConsoleShell shell, string[] args)
{
if (args.Length == 1)
{
var options = _players.Sessions.OrderBy(c => c.Name).Select(c => c.Name).ToArray();
return CompletionResult.FromHintOptions(options, Loc.GetString("cmd-addobjective-player-completion"));
}
if (args.Length != 2)
return CompletionResult.Empty;
return CompletionResult.FromHintOptions(
_objectives.Objectives(),
Loc.GetString(Loc.GetString("cmd-add-objective-obj-completion")));
} }
} }

View File

@@ -11,6 +11,8 @@ using Robust.Shared.Prototypes;
using Robust.Shared.Random; using Robust.Shared.Random;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using Content.Server.Objectives.Commands;
using Content.Shared.Prototypes;
using Robust.Server.Player; using Robust.Server.Player;
using Robust.Shared.Utility; using Robust.Shared.Utility;
@@ -24,11 +26,22 @@ public sealed class ObjectivesSystem : SharedObjectivesSystem
[Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly EmergencyShuttleSystem _emergencyShuttle = default!; [Dependency] private readonly EmergencyShuttleSystem _emergencyShuttle = default!;
private IEnumerable<string>? _objectives;
public override void Initialize() public override void Initialize()
{ {
base.Initialize(); base.Initialize();
SubscribeLocalEvent<RoundEndTextAppendEvent>(OnRoundEndText); SubscribeLocalEvent<RoundEndTextAppendEvent>(OnRoundEndText);
_prototypeManager.PrototypesReloaded += CreateCompletions;
}
public override void Shutdown()
{
base.Shutdown();
_prototypeManager.PrototypesReloaded -= CreateCompletions;
} }
/// <summary> /// <summary>
@@ -249,6 +262,32 @@ public sealed class ObjectivesSystem : SharedObjectivesSystem
return Loc.GetString("objectives-player-named", ("name", name)); return Loc.GetString("objectives-player-named", ("name", name));
} }
private void CreateCompletions(PrototypesReloadedEventArgs unused)
{
CreateCompletions();
}
/// <summary>
/// Get all objective prototypes by their IDs.
/// This is used for completions in <see cref="AddObjectiveCommand"/>
/// </summary>
public IEnumerable<string> Objectives()
{
if (_objectives == null)
CreateCompletions();
return _objectives!;
}
private void CreateCompletions()
{
_objectives = _prototypeManager.EnumeratePrototypes<EntityPrototype>()
.Where(p => p.HasComponent<ObjectiveComponent>())
.Select(p => p.ID)
.Order();
}
} }
/// <summary> /// <summary>

View File

@@ -0,0 +1,12 @@
# addobjectives
cmd-addobjective-desc = Adds an objective to the player's mind.
cmd-addobjective-help = addobjective <username> <objectiveID>
cmd-addobjective-invalid-args = Expected exactly 2 arguments.
cmd-addobjective-player-not-found = Can't find the playerdata.
cmd-addobjective-mind-not-found = Can't find the mind.
cmd-addobjective-objective-not-found = Can't find matching objective prototype {$obj}
cmd-addobjective-adding-failed = Failed to add the objective. Maybe requirements dont allow that objective to be added.
cmd-addobjective-player-completion = <Player>
cmd-add-objective-obj-completion = <Objective>