{
if (args.Length < 2)
{
- shell.WriteError($"A");
+ shell.WriteError(Loc.GetString("cmd-weather-error-no-arguments"));
return;
}
if (!int.TryParse(args[0], out var mapInt))
- {
return;
- }
var mapId = new MapId(mapInt);
if (!MapManager.MapExists(mapId))
- {
return;
+
+ if (!_mapSystem.TryGetMap(mapId, out var mapUid))
+ return;
+
+ var weatherComp = EnsureComp<WeatherComponent>(mapUid.Value);
+
+ //Weather Proto parsing
+ WeatherPrototype? weather = null;
+ if (!args[1].Equals("null"))
+ {
+ if (!ProtoMan.TryIndex(args[1], out weather))
+ {
+ shell.WriteError(Loc.GetString("cmd-weather-error-unknown-proto"));
+ return;
+ }
}
+ //Time parsing
TimeSpan? endTime = null;
-
if (args.Length == 3)
{
+ var curTime = Timing.CurTime;
if (int.TryParse(args[2], out var durationInt))
{
- var curTime = Timing.CurTime;
- var maxTime = TimeSpan.MaxValue;
-
- // If it's already running then just fade out with how much time we're into the weather.
- if (_mapSystem.TryGetMap(mapId, out var mapUid) &&
- TryComp<WeatherComponent>(mapUid, out var weatherComp) &&
- weatherComp.Weather.TryGetValue(args[1], out var existing))
- {
- maxTime = curTime - existing.StartTime;
- }
-
endTime = curTime + TimeSpan.FromSeconds(durationInt);
-
- if (endTime > maxTime)
- endTime = maxTime;
+ }
+ else
+ {
+ shell.WriteError(Loc.GetString("cmd-weather-error-wrong-time"));
}
}
- if (args[1].Equals("null"))
- {
- SetWeather(mapId, null, endTime);
- }
- else if (ProtoMan.TryIndex<WeatherPrototype>(args[1], out var weatherProto))
- {
- SetWeather(mapId, weatherProto, endTime);
- }
- else
- {
- shell.WriteError($"Unable to parse weather prototype");
- }
+ SetWeather(mapId, weather, endTime);
}
private CompletionResult WeatherCompletion(IConsoleShell shell, string[] args)
foreach (var (eProto, weather) in weatherComp.Weather)
{
+ // if we turn off the weather, we don't want endTime = null
+ if (proto == null)
+ endTime ??= Timing.CurTime + WeatherComponent.ShutdownTime;
+
// Reset cooldown if it's an existing one.
- if (proto == null || eProto == proto.ID)
+ if (proto is not null && eProto == proto.ID)
{
weather.EndTime = endTime;
-
if (weather.State == WeatherState.Ending)
weather.State = WeatherState.Running;