mirror of
https://github.com/space-wizards/RobustToolbox.git
synced 2026-09-01 17:47:24 +02:00
* [Dependency] source generator No more reflection, no more codegen at runtime Also various changes to Roslyn helpers to make this easier to write. Requires all types with dependencies to be partial and not have readonly dependency fields. An analyzer enforces this at warning level, the previous injection strategies have remained in the code *for now* as a fallback. No fallback is available for [field: Dependency] properties, due to a Roslyn bug. Code Fixes exist. We love Roslyn * Apply dependencies generator changes to all code * Release notes * Preprocessor got hands * Handle nullable dependencies These are bad but gotta deal with it. * Apply suggestions from code review Co-authored-by: Moony <moony@hellomouse.net> * Fine, let's not use collection expressions --------- Co-authored-by: Moony <moony@hellomouse.net>
338 lines
12 KiB
C#
338 lines
12 KiB
C#
using System.Linq;
|
|
using System.Numerics;
|
|
using Robust.Shared.Console;
|
|
using Robust.Shared.ContentPack;
|
|
using Robust.Shared.EntitySerialization;
|
|
using Robust.Shared.EntitySerialization.Systems;
|
|
using Robust.Shared.GameObjects;
|
|
using Robust.Shared.IoC;
|
|
using Robust.Shared.Localization;
|
|
using Robust.Shared.Map;
|
|
using Robust.Shared.Map.Components;
|
|
using Robust.Shared.Maths;
|
|
using Robust.Shared.Utility;
|
|
|
|
namespace Robust.Server.Console.Commands
|
|
{
|
|
public sealed partial class SaveGridCommand : LocalizedCommands
|
|
{
|
|
[Dependency] private IEntityManager _ent = default!;
|
|
[Dependency] private IResourceManager _resource = default!;
|
|
|
|
public override string Command => "savegrid";
|
|
|
|
public override void Execute(IConsoleShell shell, string argStr, string[] args)
|
|
{
|
|
if (args.Length < 2)
|
|
{
|
|
shell.WriteError("Not enough arguments.");
|
|
return;
|
|
}
|
|
|
|
if (!NetEntity.TryParse(args[0], out var uidNet))
|
|
{
|
|
shell.WriteError("Not a valid entity ID.");
|
|
return;
|
|
}
|
|
|
|
var uid = _ent.GetEntity(uidNet);
|
|
|
|
// no saving default grid
|
|
if (!_ent.EntityExists(uid))
|
|
{
|
|
shell.WriteError("That grid does not exist.");
|
|
return;
|
|
}
|
|
|
|
bool saveSuccess = _ent.System<MapLoaderSystem>().TrySaveGrid(uid, new ResPath(args[1]));
|
|
if (saveSuccess)
|
|
{
|
|
shell.WriteLine("Save successful. Look in the user data directory.");
|
|
}
|
|
else
|
|
{
|
|
shell.WriteError("Save unsuccessful!");
|
|
}
|
|
}
|
|
|
|
public override CompletionResult GetCompletion(IConsoleShell shell, string[] args)
|
|
{
|
|
switch (args.Length)
|
|
{
|
|
case 1:
|
|
return CompletionResult.FromHintOptions(CompletionHelper.Components<MapGridComponent>(args[0], _ent), Loc.GetString("cmd-hint-savebp-id"));
|
|
case 2:
|
|
var opts = CompletionHelper.UserFilePath(args[1], _resource.UserData);
|
|
return CompletionResult.FromHintOptions(opts, Loc.GetString("cmd-hint-savemap-path"));
|
|
}
|
|
return CompletionResult.Empty;
|
|
}
|
|
}
|
|
|
|
public sealed partial class LoadGridCommand : LocalizedCommands
|
|
{
|
|
[Dependency] private IEntitySystemManager _system = default!;
|
|
[Dependency] private IResourceManager _resource = default!;
|
|
|
|
public override string Command => "loadgrid";
|
|
|
|
public override void Execute(IConsoleShell shell, string argStr, string[] args)
|
|
{
|
|
if (args.Length < 2 || args.Length == 3 || args.Length > 6)
|
|
{
|
|
shell.WriteError("Must have either 2, 4, 5, or 6 arguments.");
|
|
return;
|
|
}
|
|
|
|
if (!int.TryParse(args[0], out var intMapId))
|
|
{
|
|
shell.WriteError($"{args[0]} is not a valid integer.");
|
|
return;
|
|
}
|
|
|
|
var mapId = new MapId(intMapId);
|
|
|
|
// no loading into null space
|
|
if (mapId == MapId.Nullspace)
|
|
{
|
|
shell.WriteError("Cannot load into nullspace.");
|
|
return;
|
|
}
|
|
|
|
var sys = _system.GetEntitySystem<SharedMapSystem>();
|
|
if (!sys.MapExists(mapId))
|
|
{
|
|
shell.WriteError($"MapID {intMapId} did not exist, creating without map init");
|
|
sys.CreateMap(mapId, false); // doesnt runmapinit to be conservative.
|
|
}
|
|
|
|
Vector2 offset = default;
|
|
if (args.Length >= 4)
|
|
{
|
|
if (!float.TryParse(args[2], out var x))
|
|
{
|
|
shell.WriteError($"{args[2]} is not a valid float.");
|
|
return;
|
|
}
|
|
|
|
if (!float.TryParse(args[3], out var y))
|
|
{
|
|
shell.WriteError($"{args[3]} is not a valid float.");
|
|
return;
|
|
}
|
|
|
|
offset = new Vector2(x, y);
|
|
}
|
|
|
|
Angle rot = default;
|
|
if (args.Length >= 5)
|
|
{
|
|
if (!float.TryParse(args[4], out var rotation))
|
|
{
|
|
shell.WriteError($"{args[4]} is not a valid float.");
|
|
return;
|
|
}
|
|
|
|
rot = Angle.FromDegrees(rotation);
|
|
}
|
|
|
|
var opts = DeserializationOptions.Default;
|
|
if (args.Length >= 6)
|
|
{
|
|
if (!bool.TryParse(args[5], out var storeUids))
|
|
{
|
|
shell.WriteError($"{args[5]} is not a valid boolean.");
|
|
return;
|
|
}
|
|
|
|
opts.StoreYamlUids = storeUids;
|
|
}
|
|
|
|
var path = new ResPath(args[1]);
|
|
_system.GetEntitySystem<MapLoaderSystem>().TryLoadGrid(mapId, path, out _, opts, offset, rot);
|
|
}
|
|
|
|
public override CompletionResult GetCompletion(IConsoleShell shell, string[] args)
|
|
{
|
|
return LoadMap.GetCompletionResult(shell, args, _resource, Loc);
|
|
}
|
|
}
|
|
|
|
public sealed partial class SaveMap : LocalizedCommands
|
|
{
|
|
[Dependency] private IEntityManager _entManager = default!;
|
|
[Dependency] private IEntitySystemManager _system = default!;
|
|
[Dependency] private IResourceManager _resource = default!;
|
|
|
|
public override string Command => "savemap";
|
|
|
|
public override CompletionResult GetCompletion(IConsoleShell shell, string[] args)
|
|
{
|
|
switch (args.Length)
|
|
{
|
|
case 1:
|
|
return CompletionResult.FromHintOptions(CompletionHelper.MapIds(_entManager), Loc.GetString("cmd-hint-savemap-id"));
|
|
case 2:
|
|
var opts = CompletionHelper.UserFilePath(args[1], _resource.UserData);
|
|
return CompletionResult.FromHintOptions(opts, Loc.GetString("cmd-hint-savemap-path"));
|
|
case 3:
|
|
return CompletionResult.FromHint(Loc.GetString("cmd-hint-savemap-force"));
|
|
}
|
|
return CompletionResult.Empty;
|
|
}
|
|
|
|
public override void Execute(IConsoleShell shell, string argStr, string[] args)
|
|
{
|
|
if (args.Length < 2)
|
|
{
|
|
shell.WriteLine(Help);
|
|
return;
|
|
}
|
|
|
|
if (!int.TryParse(args[0], out var intMapId))
|
|
{
|
|
shell.WriteLine(Help);
|
|
return;
|
|
}
|
|
|
|
var mapId = new MapId(intMapId);
|
|
|
|
// no saving null space
|
|
if (mapId == MapId.Nullspace)
|
|
return;
|
|
|
|
var sys = _system.GetEntitySystem<SharedMapSystem>();
|
|
if (!sys.MapExists(mapId))
|
|
{
|
|
shell.WriteError(Loc.GetString("cmd-savemap-not-exist"));
|
|
return;
|
|
}
|
|
|
|
if (sys.IsInitialized(mapId) &&
|
|
(args.Length < 3 || !bool.TryParse(args[2], out var force) || !force))
|
|
{
|
|
shell.WriteError(Loc.GetString("cmd-savemap-init-warning"));
|
|
return;
|
|
}
|
|
|
|
shell.WriteLine(Loc.GetString("cmd-savemap-attempt", ("mapId", mapId), ("path", args[1])));
|
|
bool saveSuccess = _system.GetEntitySystem<MapLoaderSystem>().TrySaveMap(mapId, new ResPath(args[1]));
|
|
if (saveSuccess)
|
|
{
|
|
shell.WriteLine(Loc.GetString("cmd-savemap-success"));
|
|
}
|
|
else
|
|
{
|
|
shell.WriteError(Loc.GetString("cmd-savemap-error"));
|
|
}
|
|
}
|
|
}
|
|
|
|
public sealed partial class LoadMap : LocalizedCommands
|
|
{
|
|
[Dependency] private IEntitySystemManager _system = default!;
|
|
[Dependency] private IResourceManager _resource = default!;
|
|
|
|
public override string Command => "loadmap";
|
|
|
|
public static CompletionResult GetCompletionResult(IConsoleShell shell, string[] args, IResourceManager resource, ILocalizationManager loc)
|
|
{
|
|
switch (args.Length)
|
|
{
|
|
case 1:
|
|
return CompletionResult.FromHint(loc.GetString("cmd-hint-savemap-id"));
|
|
case 2:
|
|
var opts = CompletionHelper.UserFilePath(args[1], resource.UserData)
|
|
.Concat(CompletionHelper.ContentFilePath(args[1], resource));
|
|
return CompletionResult.FromHintOptions(opts, loc.GetString("cmd-hint-savemap-path"));
|
|
case 3:
|
|
return CompletionResult.FromHint(loc.GetString("cmd-hint-loadmap-x-position"));
|
|
case 4:
|
|
return CompletionResult.FromHint(loc.GetString("cmd-hint-loadmap-y-position"));
|
|
case 5:
|
|
return CompletionResult.FromHint(loc.GetString("cmd-hint-loadmap-rotation"));
|
|
case 6:
|
|
return CompletionResult.FromHint(loc.GetString("cmd-hint-loadmap-uids"));
|
|
}
|
|
|
|
return CompletionResult.Empty;
|
|
}
|
|
|
|
public override CompletionResult GetCompletion(IConsoleShell shell, string[] args)
|
|
{
|
|
return GetCompletionResult(shell, args, _resource, Loc);
|
|
}
|
|
|
|
public override void Execute(IConsoleShell shell, string argStr, string[] args)
|
|
{
|
|
if (args.Length < 2 || args.Length > 6)
|
|
{
|
|
shell.WriteLine(Help);
|
|
return;
|
|
}
|
|
|
|
if (!int.TryParse(args[0], out var intMapId))
|
|
{
|
|
shell.WriteError(Loc.GetString("cmd-parse-failure-integer", ("arg", args[0])));
|
|
return;
|
|
}
|
|
|
|
var mapId = new MapId(intMapId);
|
|
|
|
// no loading null space
|
|
if (mapId == MapId.Nullspace)
|
|
{
|
|
shell.WriteError(Loc.GetString("cmd-loadmap-nullspace"));
|
|
return;
|
|
}
|
|
|
|
var sys = _system.GetEntitySystem<SharedMapSystem>();
|
|
if (sys.MapExists(mapId))
|
|
{
|
|
shell.WriteError(Loc.GetString("cmd-loadmap-exists", ("mapId", mapId)));
|
|
return;
|
|
}
|
|
|
|
float x = 0;
|
|
if (args.Length >= 3 && !float.TryParse(args[2], out x))
|
|
{
|
|
shell.WriteError(Loc.GetString("cmd-parse-failure-float", ("arg", args[2])));
|
|
return;
|
|
}
|
|
|
|
float y = 0;
|
|
if (args.Length >= 4 && !float.TryParse(args[3], out y))
|
|
{
|
|
shell.WriteError(Loc.GetString("cmd-parse-failure-float", ("arg", args[3])));
|
|
return;
|
|
}
|
|
var offset = new Vector2(x, y);
|
|
|
|
float rotation = 0;
|
|
if (args.Length >= 5 && !float.TryParse(args[4], out rotation))
|
|
{
|
|
shell.WriteError(Loc.GetString("cmd-parse-failure-float", ("arg", args[4])));
|
|
return;
|
|
}
|
|
var rot = new Angle(rotation);
|
|
|
|
bool storeUids = false;
|
|
if (args.Length >= 6 && !bool.TryParse(args[5], out storeUids))
|
|
{
|
|
shell.WriteError(Loc.GetString("cmd-parse-failure-bool", ("arg", args[5])));
|
|
return;
|
|
}
|
|
|
|
var opts = new DeserializationOptions { StoreYamlUids = storeUids };
|
|
|
|
var path = new ResPath(args[1]);
|
|
_system.GetEntitySystem<MapLoaderSystem>().TryLoadMapWithId(mapId, path, out _, out _, opts, offset, rot);
|
|
|
|
if (sys.MapExists(mapId))
|
|
shell.WriteLine(Loc.GetString("cmd-loadmap-success", ("mapId", mapId), ("path", args[1])));
|
|
else
|
|
shell.WriteLine(Loc.GetString("cmd-loadmap-error", ("path", args[1])));
|
|
}
|
|
}
|
|
}
|