Merge remote-tracking branch 'refs/remotes/wizards/master'

# Conflicts:
#	Content.Server/Revenant/EntitySystems/RevenantSystem.Abilities.cs
#	Resources/Prototypes/Entities/Structures/Machines/nuke.yml
#	Resources/migration.yml
This commit is contained in:
Vigers Ray 2024-12-01 18:21:33 +03:00
commit e99ff5dc82
73 changed files with 5584 additions and 3437 deletions

View file

@ -259,13 +259,13 @@ namespace Content.Client.Actions
public void LinkAllActions(ActionsComponent? actions = null)
{
if (_playerManager.LocalEntity is not { } user ||
!Resolve(user, ref actions, false))
{
return;
}
if (_playerManager.LocalEntity is not { } user ||
!Resolve(user, ref actions, false))
{
return;
}
LinkActions?.Invoke(actions);
LinkActions?.Invoke(actions);
}
public override void Shutdown()

View file

@ -1,8 +1,4 @@
using Robust.Shared.GameObjects;
namespace Content.Client.Atmos.Components;
[RegisterComponent]
public sealed partial class PipeColorVisualsComponent : Component
{
}
public sealed partial class PipeColorVisualsComponent : Component;

View file

@ -1,6 +1,5 @@
<BoxContainer xmlns="https://spacestation14.io"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:s="clr-namespace:Content.Client.Stylesheets"
xmlns:gfx="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
Orientation="Vertical" HorizontalExpand ="True" Margin="0 0 0 3">
@ -62,7 +61,7 @@
</PanelContainer>
</BoxContainer>
<!-- If the alarm is inactive, this is label is diplayed instead -->
<!-- If the alarm is inactive, this is label is displayed instead -->
<Label Name="NoDataLabel" Text="{Loc 'atmos-alerts-window-no-data-available'}" HorizontalAlignment="Center" Margin="0 15" FontColorOverride="#a9a9a9" ReservesSpace="False" Visible="False"></Label>
<!-- Silencing progress bar -->

View file

@ -136,8 +136,9 @@ public sealed partial class AtmosAlarmEntryContainer : BoxContainer
GasGridContainer.RemoveAllChildren();
var gasData = focusData.Value.GasData.Where(g => g.Key != Gas.Oxygen);
var keyValuePairs = gasData.ToList();
if (gasData.Count() == 0)
if (keyValuePairs.Count == 0)
{
// No other gases
var gasLabel = new Label()
@ -158,13 +159,11 @@ public sealed partial class AtmosAlarmEntryContainer : BoxContainer
else
{
// Add an entry for each gas
foreach ((var gas, (var mol, var percent, var alert)) in gasData)
foreach ((var gas, (var mol, var percent, var alert)) in keyValuePairs)
{
var gasPercent = (FixedPoint2)0f;
gasPercent = percent * 100f;
FixedPoint2 gasPercent = percent * 100f;
if (!_gasShorthands.TryGetValue(gas, out var gasShorthand))
gasShorthand = "X";
var gasShorthand = _gasShorthands.GetValueOrDefault(gas, "X");
var gasLabel = new Label()
{

View file

@ -14,8 +14,6 @@ public sealed class AtmosAlertsComputerBoundUserInterface : BoundUserInterface
_menu = new AtmosAlertsComputerWindow(this, Owner);
_menu.OpenCentered();
_menu.OnClose += Close;
EntMan.TryGetComponent<TransformComponent>(Owner, out var xform);
}
protected override void UpdateState(BoundUserInterfaceState state)
@ -24,9 +22,6 @@ public sealed class AtmosAlertsComputerBoundUserInterface : BoundUserInterface
var castState = (AtmosAlertsComputerBoundInterfaceState) state;
if (castState == null)
return;
EntMan.TryGetComponent<TransformComponent>(Owner, out var xform);
_menu?.UpdateUI(xform?.Coordinates, castState.AirAlarms, castState.FireAlarms, castState.FocusData);
}

View file

@ -1,7 +1,6 @@
<controls:FancyWindow xmlns="https://spacestation14.io"
xmlns:ui="clr-namespace:Content.Client.Pinpointer.UI"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
xmlns:gfx="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client"
Title="{Loc 'atmos-alerts-window-title'}"
Resizable="False"
SetSize="1120 750"

View file

@ -4,8 +4,6 @@ using Content.Shared.Atmos.Components;
using Content.Shared.Atmos.Piping;
using JetBrains.Annotations;
using Robust.Client.GameObjects;
using Robust.Client.ResourceManagement;
using Robust.Shared.Serialization.TypeSerializers.Implementations;
namespace Content.Client.Atmos.EntitySystems;
@ -19,7 +17,7 @@ public sealed class AtmosPipeAppearanceSystem : EntitySystem
base.Initialize();
SubscribeLocalEvent<PipeAppearanceComponent, ComponentInit>(OnInit);
SubscribeLocalEvent<PipeAppearanceComponent, AppearanceChangeEvent>(OnAppearanceChanged, after: new[] { typeof(SubFloorHideSystem) });
SubscribeLocalEvent<PipeAppearanceComponent, AppearanceChangeEvent>(OnAppearanceChanged, after: [typeof(SubFloorHideSystem)]);
}
private void OnInit(EntityUid uid, PipeAppearanceComponent component, ComponentInit args)
@ -84,7 +82,8 @@ public sealed class AtmosPipeAppearanceSystem : EntitySystem
layer.Visible &= visible;
if (!visible) continue;
if (!visible)
continue;
layer.Color = color;
}

View file

@ -1,12 +1,7 @@
using System.Collections.Generic;
using Content.Shared.Atmos.Monitor;
using Content.Shared.Power;
using Robust.Client.GameObjects;
using Robust.Client.Graphics;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Maths;
using Robust.Shared.Serialization.Manager.Attributes;
namespace Content.Client.Atmos.Monitor;
@ -27,7 +22,7 @@ public sealed class AtmosAlarmableVisualsSystem : VisualizerSystem<AtmosAlarmabl
{
foreach (var visLayer in component.HideOnDepowered)
{
if (args.Sprite.LayerMapTryGet(visLayer, out int powerVisibilityLayer))
if (args.Sprite.LayerMapTryGet(visLayer, out var powerVisibilityLayer))
args.Sprite.LayerSetVisible(powerVisibilityLayer, powered);
}
}
@ -36,7 +31,7 @@ public sealed class AtmosAlarmableVisualsSystem : VisualizerSystem<AtmosAlarmabl
{
foreach (var (setLayer, powerState) in component.SetOnDepowered)
{
if (args.Sprite.LayerMapTryGet(setLayer, out int setStateLayer))
if (args.Sprite.LayerMapTryGet(setLayer, out var setStateLayer))
args.Sprite.LayerSetState(setStateLayer, new RSI.StateId(powerState));
}
}

View file

@ -1,11 +1,7 @@
using Content.Shared.Atmos;
using Content.Shared.Atmos.Monitor;
using Content.Shared.Atmos.Monitor.Components;
using Robust.Client.GameObjects;
using Robust.Client.UserInterface;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Log;
namespace Content.Client.Atmos.Monitor.UI;
@ -78,6 +74,7 @@ public sealed class AirAlarmBoundUserInterface : BoundUserInterface
{
base.Dispose(disposing);
if (disposing) _window?.Dispose();
if (disposing)
_window?.Dispose();
}
}

View file

@ -8,7 +8,6 @@ using Content.Shared.Atmos.Monitor.Components;
using Content.Shared.Atmos.Piping.Unary.Components;
using Content.Shared.Temperature;
using Robust.Client.AutoGenerated;
using Robust.Client.GameObjects;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
@ -59,7 +58,7 @@ public sealed partial class AirAlarmWindow : FancyWindow
AirAlarmMode.Fill => "air-alarm-ui-mode-fill",
AirAlarmMode.Panic => "air-alarm-ui-mode-panic",
AirAlarmMode.None => "air-alarm-ui-mode-none",
_ => "error"
_ => "error",
};
_modes.AddItem(Loc.GetString(text));
}
@ -70,7 +69,7 @@ public sealed partial class AirAlarmWindow : FancyWindow
AirAlarmModeChanged!.Invoke((AirAlarmMode) args.Id);
};
_autoMode.OnToggled += args =>
_autoMode.OnToggled += _ =>
{
AutoModeChanged!.Invoke(_autoMode.Pressed);
};
@ -176,22 +175,18 @@ public sealed partial class AirAlarmWindow : FancyWindow
public static Color ColorForThreshold(float amount, AtmosAlarmThreshold threshold)
{
threshold.CheckThreshold(amount, out AtmosAlarmType curAlarm);
threshold.CheckThreshold(amount, out var curAlarm);
return ColorForAlarm(curAlarm);
}
public static Color ColorForAlarm(AtmosAlarmType curAlarm)
{
if(curAlarm == AtmosAlarmType.Danger)
return curAlarm switch
{
return StyleNano.DangerousRedFore;
}
else if(curAlarm == AtmosAlarmType.Warning)
{
return StyleNano.ConcerningOrangeFore;
}
return StyleNano.GoodGreenFore;
AtmosAlarmType.Danger => StyleNano.DangerousRedFore,
AtmosAlarmType.Warning => StyleNano.ConcerningOrangeFore,
_ => StyleNano.GoodGreenFore,
};
}

View file

@ -1,12 +1,8 @@
using System;
using Content.Shared.Atmos.Monitor;
using Content.Shared.Atmos.Monitor.Components;
using Content.Shared.Atmos.Piping.Unary.Components;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Localization;
namespace Content.Client.Atmos.Monitor.UI.Widgets;
@ -25,7 +21,7 @@ public sealed partial class PumpControl : BoxContainer
private OptionButton _pressureCheck => CPressureCheck;
private FloatSpinBox _externalBound => CExternalBound;
private FloatSpinBox _internalBound => CInternalBound;
private Button _copySettings => CCopySettings;
private Button _copySettings => CCopySettings;
public PumpControl(GasVentPumpData data, string address)
{
@ -86,7 +82,7 @@ public sealed partial class PumpControl : BoxContainer
_data.PressureChecks = (VentPressureBound) args.Id;
PumpDataChanged?.Invoke(_address, _data);
};
_copySettings.OnPressed += _ =>
{
PumpDataCopied?.Invoke(_data);

View file

@ -1,15 +1,9 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Content.Shared.Atmos;
using Content.Shared.Atmos.Monitor;
using Content.Shared.Atmos.Monitor.Components;
using Content.Shared.Atmos.Piping.Unary.Components;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Localization;
namespace Content.Client.Atmos.Monitor.UI.Widgets;
@ -27,7 +21,7 @@ public sealed partial class ScrubberControl : BoxContainer
private OptionButton _pumpDirection => CPumpDirection;
private FloatSpinBox _volumeRate => CVolumeRate;
private CheckBox _wideNet => CWideNet;
private Button _copySettings => CCopySettings;
private Button _copySettings => CCopySettings;
private GridContainer _gases => CGasContainer;
private Dictionary<Gas, Button> _gasControls = new();
@ -77,7 +71,7 @@ public sealed partial class ScrubberControl : BoxContainer
_data.PumpDirection = (ScrubberPumpDirection) args.Id;
ScrubberDataChanged?.Invoke(_address, _data);
};
_copySettings.OnPressed += _ =>
{
ScrubberDataCopied?.Invoke(_data);

View file

@ -43,7 +43,8 @@ public sealed partial class SensorInfo : BoxContainer
var label = new RichTextLabel();
var fractionGas = amount / data.TotalMoles;
label.SetMarkup(Loc.GetString("air-alarm-ui-gases-indicator", ("gas", $"{gas}"),
label.SetMarkup(Loc.GetString("air-alarm-ui-gases-indicator",
("gas", $"{gas}"),
("color", AirAlarmWindow.ColorForThreshold(fractionGas, data.GasThresholds[gas])),
("amount", $"{amount:0.####}"),
("percentage", $"{(100 * fractionGas):0.##}")));
@ -53,9 +54,9 @@ public sealed partial class SensorInfo : BoxContainer
var threshold = data.GasThresholds[gas];
var gasThresholdControl = new ThresholdControl(Loc.GetString($"air-alarm-ui-thresholds-gas-title", ("gas", $"{gas}")), threshold, AtmosMonitorThresholdType.Gas, gas, 100);
gasThresholdControl.Margin = new Thickness(20, 2, 2, 2);
gasThresholdControl.ThresholdDataChanged += (type, threshold, arg3) =>
gasThresholdControl.ThresholdDataChanged += (type, alarmThreshold, arg3) =>
{
OnThresholdUpdate!(_address, type, threshold, arg3);
OnThresholdUpdate!(_address, type, alarmThreshold, arg3);
};
_gasThresholds.Add(gas, gasThresholdControl);
@ -64,7 +65,8 @@ public sealed partial class SensorInfo : BoxContainer
_pressureThreshold = new ThresholdControl(Loc.GetString("air-alarm-ui-thresholds-pressure-title"), data.PressureThreshold, AtmosMonitorThresholdType.Pressure);
PressureThresholdContainer.AddChild(_pressureThreshold);
_temperatureThreshold = new ThresholdControl(Loc.GetString("air-alarm-ui-thresholds-temperature-title"), data.TemperatureThreshold,
_temperatureThreshold = new ThresholdControl(Loc.GetString("air-alarm-ui-thresholds-temperature-title"),
data.TemperatureThreshold,
AtmosMonitorThresholdType.Temperature);
TemperatureThresholdContainer.AddChild(_temperatureThreshold);
@ -103,7 +105,8 @@ public sealed partial class SensorInfo : BoxContainer
}
var fractionGas = amount / data.TotalMoles;
label.SetMarkup(Loc.GetString("air-alarm-ui-gases-indicator", ("gas", $"{gas}"),
label.SetMarkup(Loc.GetString("air-alarm-ui-gases-indicator",
("gas", $"{gas}"),
("color", AirAlarmWindow.ColorForThreshold(fractionGas, data.GasThresholds[gas])),
("amount", $"{amount:0.####}"),
("percentage", $"{(100 * fractionGas):0.##}")));

View file

@ -1,7 +1,4 @@
using Content.Client.Message;
using Content.Shared.Atmos;
using Content.Shared.Atmos.Monitor;
using Content.Shared.Temperature;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;

View file

@ -1,12 +1,8 @@
using System;
using Content.Shared.Atmos;
using Content.Shared.Atmos.Monitor;
using Content.Shared.Atmos.Monitor.Components;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Localization;
// holy FUCK
// this technically works because some of this you can *not* do in XAML but holy FUCK
@ -115,29 +111,38 @@ public sealed partial class ThresholdControl : BoxContainer
_enabled.Pressed = !_threshold.Ignore;
}
private String LabelForBound(string boundType) //<todo.eoin Replace this with enums
private string LabelForBound(string boundType) //<todo.eoin Replace this with enums
{
return Loc.GetString($"air-alarm-ui-thresholds-{boundType}");
}
public void UpdateThresholdData(AtmosAlarmThreshold threshold, float currentAmount)
{
threshold.CheckThreshold(currentAmount, out AtmosAlarmType alarm, out AtmosMonitorThresholdBound which);
threshold.CheckThreshold(currentAmount, out var alarm, out var bound);
var upperDangerState = AtmosAlarmType.Normal;
var lowerDangerState = AtmosAlarmType.Normal;
var upperWarningState = AtmosAlarmType.Normal;
var lowerWarningState = AtmosAlarmType.Normal;
if(alarm == AtmosAlarmType.Danger)
switch (alarm)
{
if(which == AtmosMonitorThresholdBound.Upper) upperDangerState = alarm;
else lowerDangerState = alarm;
}
else if(alarm == AtmosAlarmType.Warning)
{
if(which == AtmosMonitorThresholdBound.Upper) upperWarningState = alarm;
else lowerWarningState = alarm;
case AtmosAlarmType.Danger:
{
if (bound == AtmosMonitorThresholdBound.Upper)
upperDangerState = alarm;
else
lowerDangerState = alarm;
break;
}
case AtmosAlarmType.Warning:
{
if (bound == AtmosMonitorThresholdBound.Upper)
upperWarningState = alarm;
else
lowerWarningState = alarm;
break;
}
}
_upperBoundControl.SetValue(threshold.UpperBound.Value);

View file

@ -1,3 +1,4 @@
using System.Globalization;
using System.Linq;
using System.Numerics;
using Content.Client.Atmos.EntitySystems;
@ -101,14 +102,9 @@ public sealed class AtmosDebugOverlay : Overlay
else
{
// Red-Green-Blue interpolation
if (interp < 0.5f)
{
res = Color.InterpolateBetween(Color.Red, Color.LimeGreen, interp * 2);
}
else
{
res = Color.InterpolateBetween(Color.LimeGreen, Color.Blue, (interp - 0.5f) * 2);
}
res = interp < 0.5f
? Color.InterpolateBetween(Color.Red, Color.LimeGreen, interp * 2)
: Color.InterpolateBetween(Color.LimeGreen, Color.Blue, (interp - 0.5f) * 2);
}
res = res.WithAlpha(0.75f);
@ -181,7 +177,10 @@ public sealed class AtmosDebugOverlay : Overlay
handle.DrawCircle(tileCentre, 0.05f, Color.Black);
}
private void CheckAndShowBlockDir(AtmosDebugOverlayData data, DrawingHandleWorld handle, AtmosDirection dir,
private void CheckAndShowBlockDir(
AtmosDebugOverlayData data,
DrawingHandleWorld handle,
AtmosDirection dir,
Vector2 tileCentre)
{
if (!data.BlockDirection.HasFlag(dir))
@ -243,7 +242,7 @@ public sealed class AtmosDebugOverlay : Overlay
var moles = data.Moles == null
? "No Air"
: data.Moles.Sum().ToString();
: data.Moles.Sum().ToString(CultureInfo.InvariantCulture);
handle.DrawString(_font, pos, $"Moles: {moles}");
pos += offset;
@ -263,7 +262,12 @@ public sealed class AtmosDebugOverlay : Overlay
private void GetGrids(MapId mapId, Box2Rotated box)
{
_grids.Clear();
_mapManager.FindGridsIntersecting(mapId, box, ref _grids, (EntityUid uid, MapGridComponent grid,
_mapManager.FindGridsIntersecting(
mapId,
box,
ref _grids,
(EntityUid uid,
MapGridComponent grid,
ref List<(Entity<MapGridComponent>, DebugMessage)> state) =>
{
if (_system.TileData.TryGetValue(uid, out var data))

View file

@ -7,7 +7,7 @@ using Robust.Client.GameObjects;
namespace Content.Client.Clothing;
public sealed class FlippableClothingVisualizerSystem : VisualizerSystem<FlippableClothingVisualsComponent>
public sealed class FlippableClothingVisualizerSystem : VisualizerSystem<FlippableClothingVisualsComponent>
{
[Dependency] private readonly SharedItemSystem _itemSys = default!;

View file

@ -191,9 +191,15 @@ namespace Content.Client.Inventory
return;
if (ev.Function == ContentKeyFunctions.ExamineEntity)
{
_examine.DoExamine(slot.Entity.Value);
ev.Handle();
}
else if (ev.Function == EngineKeyFunctions.UseSecondary)
{
_ui.GetUIController<VerbMenuUIController>().OpenVerbMenu(slot.Entity.Value);
ev.Handle();
}
}
private void AddInventoryButton(EntityUid invUid, string slotId, InventoryComponent inv)

View file

@ -35,7 +35,7 @@ public sealed partial class StencilOverlay
var matty = Matrix3x2.Multiply(matrix, invMatrix);
worldHandle.SetTransform(matty);
foreach (var tile in grid.Comp.GetTilesIntersecting(worldAABB))
foreach (var tile in _map.GetTilesIntersecting(grid.Owner, grid, worldAABB))
{
// Ignored tiles for stencil
if (_weather.CanWeatherAffect(grid.Owner, grid, tile))

View file

@ -24,6 +24,7 @@ public sealed partial class StencilOverlay : Overlay
[Dependency] private readonly IPrototypeManager _protoManager = default!;
private readonly ParallaxSystem _parallax;
private readonly SharedTransformSystem _transform;
private readonly SharedMapSystem _map;
private readonly SpriteSystem _sprite;
private readonly WeatherSystem _weather;
@ -33,11 +34,12 @@ public sealed partial class StencilOverlay : Overlay
private readonly ShaderInstance _shader;
public StencilOverlay(ParallaxSystem parallax, SharedTransformSystem transform, SpriteSystem sprite, WeatherSystem weather)
public StencilOverlay(ParallaxSystem parallax, SharedTransformSystem transform, SharedMapSystem map, SpriteSystem sprite, WeatherSystem weather)
{
ZIndex = ParallaxSystem.ParallaxZIndex + 1;
_parallax = parallax;
_transform = transform;
_map = map;
_sprite = sprite;
_weather = weather;
IoCManager.InjectDependencies(this);

View file

@ -10,13 +10,14 @@ public sealed class StencilOverlaySystem : EntitySystem
[Dependency] private readonly IOverlayManager _overlay = default!;
[Dependency] private readonly ParallaxSystem _parallax = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
[Dependency] private readonly SharedMapSystem _map = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
[Dependency] private readonly WeatherSystem _weather = default!;
public override void Initialize()
{
base.Initialize();
_overlay.AddOverlay(new StencilOverlay(_parallax, _transform, _sprite, _weather));
_overlay.AddOverlay(new StencilOverlay(_parallax, _transform, _map, _sprite, _weather));
}
public override void Shutdown()

View file

@ -83,22 +83,27 @@ public sealed class HandsUIController : UIController, IOnStateEntered<GameplaySt
if (args.Function == EngineKeyFunctions.UIClick)
{
_handsSystem.UIHandClick(_playerHandsComponent, hand.SlotName);
args.Handle();
}
else if (args.Function == EngineKeyFunctions.UseSecondary)
{
_handsSystem.UIHandOpenContextMenu(hand.SlotName);
args.Handle();
}
else if (args.Function == ContentKeyFunctions.ActivateItemInWorld)
{
_handsSystem.UIHandActivate(hand.SlotName);
args.Handle();
}
else if (args.Function == ContentKeyFunctions.AltActivateItemInWorld)
{
_handsSystem.UIHandAltActivateItem(hand.SlotName);
args.Handle();
}
else if (args.Function == ContentKeyFunctions.ExamineEntity)
{
_handsSystem.UIInventoryExamine(hand.SlotName);
args.Handle();
}
}

View file

@ -16,6 +16,7 @@ public sealed class GasProducerAnomalySystem : EntitySystem
{
[Dependency] private readonly AtmosphereSystem _atmosphere = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly SharedMapSystem _map = default!;
public override void Initialize()
{
@ -56,8 +57,11 @@ public sealed class GasProducerAnomalySystem : EntitySystem
return;
var localpos = xform.Coordinates.Position;
var tilerefs = grid.GetLocalTilesIntersecting(
new Box2(localpos + new Vector2(-radius, -radius), localpos + new Vector2(radius, radius))).ToArray();
var tilerefs = _map.GetLocalTilesIntersecting(
xform.GridUid.Value,
grid,
new Box2(localpos + new Vector2(-radius, -radius), localpos + new Vector2(radius, radius)))
.ToArray();
if (tilerefs.Length == 0)
return;

View file

@ -28,6 +28,7 @@ public sealed partial class DragonSystem : EntitySystem
[Dependency] private readonly SharedActionsSystem _actions = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
[Dependency] private readonly SharedMapSystem _map = default!;
[Dependency] private readonly MobStateSystem _mobState = default!;
private EntityQuery<CarpRiftsConditionComponent> _objQuery;
@ -156,7 +157,7 @@ public sealed partial class DragonSystem : EntitySystem
}
// cant put a rift on solars
foreach (var tile in grid.GetTilesIntersecting(new Circle(_transform.GetWorldPosition(xform), RiftTileRadius), false))
foreach (var tile in _map.GetTilesIntersecting(xform.GridUid.Value, grid, new Circle(_transform.GetWorldPosition(xform), RiftTileRadius), false))
{
if (!tile.IsSpace(_tileDef))
continue;

View file

@ -1,3 +1,5 @@
using System.Linq;
using System.Numerics;
using Content.Server.Administration.Logs;
using Content.Server.Chat.Managers;
using Content.Server.GameTicking;
@ -32,14 +34,13 @@ using Robust.Shared.Physics.Systems;
using Robust.Shared.Player;
using Robust.Shared.Prototypes;
using Robust.Shared.Timing;
using System.Linq;
using System.Numerics;
namespace Content.Server.Ghost
{
public sealed class GhostSystem : SharedGhostSystem
{
[Dependency] private readonly SharedActionsSystem _actions = default!;
[Dependency] private readonly IAdminLogManager _adminLog = default!;
[Dependency] private readonly SharedEyeSystem _eye = default!;
[Dependency] private readonly FollowerSystem _followerSystem = default!;
[Dependency] private readonly IGameTiming _gameTiming = default!;
@ -323,6 +324,8 @@ namespace Content.Server.Ghost
private void WarpTo(EntityUid uid, EntityUid target)
{
_adminLog.Add(LogType.GhostWarp, $"{ToPrettyString(uid)} ghost warped to {ToPrettyString(target)}");
if ((TryComp(target, out WarpPointComponent? warp) && warp.Follow) || HasComp<MobStateComponent>(target))
{
_followerSystem.StartFollowingEntity(uid, target);

View file

@ -1,4 +1,4 @@
using System.Linq;
using System.Linq;
using Content.Server.Administration;
using Content.Server.Ghost.Roles.Components;
using Content.Server.Ghost.Roles.Raffles;
@ -77,13 +77,13 @@ namespace Content.Server.Ghost.Roles
if (isProto)
{
if (!_protoManager.TryIndex<GhostRoleRaffleSettingsPrototype>(args[4], out var proto))
if (!_protoManager.TryIndex<GhostRoleRaffleSettingsPrototype>(args[3], out var proto))
{
var validProtos = string.Join(", ",
_protoManager.EnumeratePrototypes<GhostRoleRaffleSettingsPrototype>().Select(p => p.ID)
);
shell.WriteLine($"{args[4]} is not a valid raffle settings prototype. Valid options: {validProtos}");
shell.WriteLine($"{args[3]} is not a valid raffle settings prototype. Valid options: {validProtos}");
return;
}

View file

@ -40,6 +40,7 @@ public sealed class NukeSystem : EntitySystem
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
[Dependency] private readonly SharedMapSystem _map = default!;
[Dependency] private readonly StationSystem _station = default!;
[Dependency] private readonly UserInterfaceSystem _ui = default!;
[Dependency] private readonly AppearanceSystem _appearance = default!;
@ -190,7 +191,7 @@ public sealed class NukeSystem : EntitySystem
var worldPos = _transform.GetWorldPosition(xform);
foreach (var tile in grid.GetTilesIntersecting(new Circle(worldPos, component.RequiredFloorRadius), false))
foreach (var tile in _map.GetTilesIntersecting(xform.GridUid.Value, grid, new Circle(worldPos, component.RequiredFloorRadius), false))
{
if (!tile.IsSpace(_tileDefManager))
continue;

View file

@ -21,6 +21,7 @@ public sealed class SpecialRespawnSystem : SharedSpecialRespawnSystem
[Dependency] private readonly AtmosphereSystem _atmosphere = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
[Dependency] private readonly SharedMapSystem _map = default!;
[Dependency] private readonly TurfSystem _turf = default!;
[Dependency] private readonly IChatManager _chat = default!;
[Dependency] private readonly IPrototypeManager _proto = default!;
@ -105,7 +106,7 @@ public sealed class SpecialRespawnSystem : SharedSpecialRespawnSystem
var found = false;
foreach (var tile in grid.GetTilesIntersecting(circle))
foreach (var tile in _map.GetTilesIntersecting(entityGridUid.Value, grid, circle))
{
if (tile.IsSpace(_tileDefinitionManager)
|| _turf.IsTileBlocked(tile, CollisionGroup.MobMask)
@ -176,7 +177,7 @@ public sealed class SpecialRespawnSystem : SharedSpecialRespawnSystem
var mapTarget = grid.WorldToTile(mapPos);
var circle = new Circle(mapPos, 2);
foreach (var newTileRef in grid.GetTilesIntersecting(circle))
foreach (var newTileRef in _map.GetTilesIntersecting(targetGrid, grid, circle))
{
if (newTileRef.IsSpace(_tileDefinitionManager) || _turf.IsTileBlocked(newTileRef, CollisionGroup.MobMask) || !_atmosphere.IsTileMixtureProbablySafe(targetGrid, targetMap, mapTarget))
continue;

View file

@ -45,6 +45,7 @@ public sealed partial class RevenantSystem
[Dependency] private readonly TileSystem _tile = default!;
[Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!;
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;
[Dependency] private readonly SharedMapSystem _mapSystem = default!;
[Dependency] private readonly DoorSystem _doorSystem = default!; // Sunrise-Edit
private void InitializeAbilities()
@ -232,8 +233,12 @@ public sealed partial class RevenantSystem
var xform = Transform(uid);
if (!TryComp<MapGridComponent>(xform.GridUid, out var map))
return;
var tiles = map.GetTilesIntersecting(Box2.CenteredAround(_transformSystem.GetWorldPosition(xform),
new Vector2(component.DefileRadius * 2, component.DefileRadius))).ToArray();
var tiles = _mapSystem.GetTilesIntersecting(
xform.GridUid.Value,
map,
Box2.CenteredAround(_transformSystem.GetWorldPosition(xform),
new Vector2(component.DefileRadius * 2, component.DefileRadius)))
.ToArray();
_random.Shuffle(tiles);

View file

@ -193,7 +193,7 @@ public sealed class SpawnSalvageMissionJob : Job<bool>
List<Vector2i> reservedTiles = new();
foreach (var tile in grid.GetTilesIntersecting(new Circle(Vector2.Zero, landingPadRadius), false))
foreach (var tile in _map.GetTilesIntersecting(mapUid, grid, new Circle(Vector2.Zero, landingPadRadius), false))
{
if (!_biome.TryGetBiomeTile(mapUid, grid, tile.GridIndices, out _))
continue;

View file

@ -1030,6 +1030,7 @@ public sealed partial class ShuttleSystem
continue;
}
// If it has the FTLSmashImmuneComponent ignore it.
if (_immuneQuery.HasComponent(ent))
{
continue;

View file

@ -308,7 +308,7 @@ public sealed class EventHorizonSystem : SharedEventHorizonSystem
foreach (var grid in grids)
{
// TODO: Remover grid.Owner when this iterator returns entityuids as well.
AttemptConsumeTiles(uid, grid.Comp.GetTilesIntersecting(circle), grid, grid, eventHorizon);
AttemptConsumeTiles(uid, _mapSystem.GetTilesIntersecting(grid.Owner, grid.Comp, circle), grid, grid, eventHorizon);
}
}

View file

@ -4,7 +4,6 @@ using Content.Server.Xenoarchaeology.XenoArtifacts.Events;
using Content.Shared.Maps;
using Content.Shared.Physics;
using Content.Shared.Throwing;
using Robust.Server.GameObjects;
using Robust.Shared.Map.Components;
using Robust.Shared.Physics.Components;
using Robust.Shared.Random;
@ -17,7 +16,8 @@ public sealed class ThrowArtifactSystem : EntitySystem
[Dependency] private readonly EntityLookupSystem _lookup = default!;
[Dependency] private readonly ThrowingSystem _throwing = default!;
[Dependency] private readonly TileSystem _tile = default!;
[Dependency] private readonly TransformSystem _transform = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
[Dependency] private readonly SharedMapSystem _mapSystem = default!;
/// <inheritdoc/>
public override void Initialize()
@ -30,7 +30,9 @@ public sealed class ThrowArtifactSystem : EntitySystem
var xform = Transform(uid);
if (TryComp<MapGridComponent>(xform.GridUid, out var grid))
{
var tiles = grid.GetTilesIntersecting(
var tiles = _mapSystem.GetTilesIntersecting(
xform.GridUid.Value,
grid,
Box2.CenteredAround(_transform.GetWorldPosition(xform), new Vector2(component.Range * 2, component.Range)));
foreach (var tile in tiles)

View file

@ -115,10 +115,14 @@ public enum LogType
/// Storage & entity-storage related interactions
/// </summary>
Storage = 93,
/// <summary>
/// A player got hit by an explosion and was dealt damage.
/// </summary>
ExplosionHit = 94,
/// <summary>
/// A ghost warped to an entity through the ghost warp menu.
/// </summary>
GhostWarp = 95,
}

View file

@ -34,6 +34,7 @@ public abstract class SharedAnomalySystem : EntitySystem
[Dependency] protected readonly SharedPopupSystem Popup = default!;
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
[Dependency] private readonly SharedMapSystem _map = default!;
public override void Initialize()
{
@ -358,8 +359,11 @@ public abstract class SharedAnomalySystem : EntitySystem
var amount = (int) (MathHelper.Lerp(settings.MinAmount, settings.MaxAmount, severity * stability * powerModifier) + 0.5f);
var localpos = xform.Coordinates.Position;
var tilerefs = grid.GetLocalTilesIntersecting(
new Box2(localpos + new Vector2(-settings.MaxRange, -settings.MaxRange), localpos + new Vector2(settings.MaxRange, settings.MaxRange))).ToList();
var tilerefs = _map.GetLocalTilesIntersecting(
xform.GridUid.Value,
grid,
new Box2(localpos + new Vector2(-settings.MaxRange, -settings.MaxRange), localpos + new Vector2(settings.MaxRange, settings.MaxRange)))
.ToList();
if (tilerefs.Count == 0)
return null;

View file

@ -32,7 +32,7 @@ public sealed class SelfBeforeHyposprayInjectsEvent : BeforeHyposprayInjectsTarg
/// This event is raised on the target before the hypospray is injected.
/// The event is triggered on the target itself and all its clothing.
/// </summary>
public sealed class TargetBeforeHyposprayInjectsEvent : BeforeHyposprayInjectsTargetEvent
public sealed class TargetBeforeHyposprayInjectsEvent : BeforeHyposprayInjectsTargetEvent
{
public TargetBeforeHyposprayInjectsEvent (EntityUid user, EntityUid hypospray, EntityUid target) : base(user, hypospray, target) { }
public TargetBeforeHyposprayInjectsEvent(EntityUid user, EntityUid hypospray, EntityUid target) : base(user, hypospray, target) { }
}

View file

@ -468,6 +468,12 @@ namespace Content.Shared.Cuffs
if (!_interaction.InRangeUnobstructed(handcuff, target))
return false;
// if the amount of hands the target has is equal to or less than the amount of hands that are cuffed
// don't apply the new set of cuffs
// (how would you even end up with more cuffed hands than actual hands? either way accounting for it)
if (TryComp<HandsComponent>(target, out var hands) && hands.Count <= component.CuffedHandCount)
return false;
// Success!
_hands.TryDrop(user, handcuff);

View file

@ -23,6 +23,8 @@ public sealed partial class NearbyTilesPercentRule : RulesRule
[DataField]
public float Range = 10f;
private readonly SharedMapSystem _map;
public override bool Check(EntityManager entManager, EntityUid uid)
{
if (!entManager.TryGetComponent(uid, out TransformComponent? xform) ||
@ -38,7 +40,7 @@ public sealed partial class NearbyTilesPercentRule : RulesRule
var tileCount = 0;
var matchingTileCount = 0;
foreach (var tile in grid.GetTilesIntersecting(new Circle(transform.GetWorldPosition(xform),
foreach (var tile in _map.GetTilesIntersecting(xform.GridUid.Value, grid, new Circle(transform.GetWorldPosition(xform),
Range)))
{
// Only consider collidable anchored (for reasons some subfloor stuff has physics but non-collidable)

View file

@ -12,7 +12,6 @@ namespace Content.Shared.Traits.Assorted;
public sealed class PermanentBlindnessSystem : EntitySystem
{
[Dependency] private readonly INetManager _net = default!;
[Dependency] private readonly IEntityManager _entityManager = default!;
[Dependency] private readonly BlindableSystem _blinding = default!;
/// <inheritdoc/>
@ -33,20 +32,26 @@ public sealed class PermanentBlindnessSystem : EntitySystem
private void OnShutdown(Entity<PermanentBlindnessComponent> blindness, ref ComponentShutdown args)
{
_blinding.UpdateIsBlind(blindness.Owner);
if (!TryComp<BlindableComponent>(blindness.Owner, out var blindable))
return;
if (blindable.MinDamage != 0)
{
_blinding.SetMinDamage((blindness.Owner, blindable), 0);
}
}
private void OnMapInit(Entity<PermanentBlindnessComponent> blindness, ref MapInitEvent args)
{
if (!_entityManager.TryGetComponent<BlindableComponent>(blindness, out var blindable))
if(!TryComp<BlindableComponent>(blindness.Owner, out var blindable))
return;
if (blindness.Comp.Blindness != 0)
_blinding.SetMinDamage(new Entity<BlindableComponent?>(blindness.Owner, blindable), blindness.Comp.Blindness);
_blinding.SetMinDamage((blindness.Owner, blindable), blindness.Comp.Blindness);
else
{
var maxMagnitudeInt = (int) BlurryVisionComponent.MaxMagnitude;
_blinding.SetMinDamage(new Entity<BlindableComponent?>(blindness.Owner, blindable), maxMagnitudeInt);
_blinding.SetMinDamage((blindness.Owner, blindable), maxMagnitudeInt);
}
}
}

View file

@ -620,5 +620,12 @@ Entries:
id: 77
time: '2024-11-20T07:55:12.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/33311
- author: TokenStyle
changes:
- message: makeghostroleraffled admin command now works with few arguments!
type: Fix
id: 78
time: '2024-11-30T20:11:44.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/31836
Name: Admin
Order: 1

View file

@ -1,107 +1,4 @@
Entries:
- author: EmoGarbage404
changes:
- message: The recycler can now be broken down and repaired.
type: Add
- message: Breaking the recycler now removes the EMAG effect.
type: Add
- message: The material-reclaiming efficiency of the recycler has been increased.
type: Tweak
- message: Fixed a bug where inaccessible solutions could be extracted from entities
via the recycler.
type: Fix
- message: Removed the material reclaimer.
type: Remove
id: 7159
time: '2024-08-19T03:39:00.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/30802
- author: lzk228
changes:
- message: Cheese wheel now Normal sized and slices in 4 slices instead of 3.
type: Tweak
id: 7160
time: '2024-08-19T07:54:35.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/31168
- author: Beck Thompson
changes:
- message: Slightly increased the price of the seed restock.
type: Tweak
id: 7161
time: '2024-08-19T10:33:41.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/31185
- author: Boaz1111
changes:
- message: The HoS has been given a new experimental weapon:An energy shotgun with
multiple fire modes. This experimental tech is highly wanted by the syndicate,
and agents will try to steal it.
type: Add
- message: Removed the Head of Security's Emergency Orders.
type: Remove
id: 7162
time: '2024-08-19T11:14:30.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/30643
- author: tosatur
changes:
- message: Added more words to chat sanitisation
type: Tweak
id: 7163
time: '2024-08-19T14:03:07.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/31085
- author: tosatur
changes:
- message: Changed text for ghost visibility toggle
type: Tweak
id: 7164
time: '2024-08-19T17:51:55.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/30998
- author: themias
changes:
- message: Lizards can now eat meat dumplings.
type: Fix
id: 7165
time: '2024-08-19T18:17:28.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/31212
- author: slarticodefast
changes:
- message: Made the straitjacked non-printable again.
type: Remove
id: 7166
time: '2024-08-19T18:47:24.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/31197
- author: themias
changes:
- message: Added the Combat Bakery Kit to the syndicate uplink. Includes a deadly
edible baguette sword and throwing star croissants for 3 TC.
type: Add
- message: Baguettes can be worn on the belt and normal ones do one blunt damage.
type: Tweak
- message: Mimes have a baguette instead of an MRE in their survival kits.
type: Tweak
id: 7167
time: '2024-08-19T18:57:30.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/31179
- author: metalgearsloth
changes:
- message: Fix wire sounds not playing.
type: Fix
id: 7168
time: '2024-08-19T19:50:03.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/31067
- author: redmushie
changes:
- message: Communications console buttons now have descriptive tooltips
type: Add
id: 7169
time: '2024-08-19T20:36:36.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/31217
- author: Mephisto72
changes:
- message: The Detective can now access Externals and Cryogenics like their Officer
counterpart.
type: Tweak
id: 7170
time: '2024-08-19T23:44:51.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/30203
- author: Vermidia
changes:
- message: Mothroaches can now wear anything hamlet can wear
@ -3920,3 +3817,96 @@
id: 7658
time: '2024-11-28T13:41:01.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/33622
- author: arimah
changes:
- message: GPS coordinates are now more readable.
type: Tweak
id: 7659
time: '2024-11-29T08:14:14.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/33625
- author: DrSmugleaf
changes:
- message: Added admin log for ghost warping.
type: Add
id: 7660
time: '2024-11-29T09:46:24.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/33636
- author: MossyGreySlope
changes:
- message: Rename the "slimeperson life support crate" to "internals crate (nitrogen)".
type: Tweak
id: 7661
time: '2024-11-29T12:51:15.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/33545
- author: GansuLalan
changes:
- message: The arrival shuttle will no longer smash the nuke
type: Fix
id: 7662
time: '2024-11-30T02:48:04.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/33659
- author: VlaDOS1408
changes:
- message: Locale to shuttle-ftl-status-Invalid
type: Add
id: 7663
time: '2024-11-30T02:54:37.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/33651
- author: jbox144
changes:
- message: Fixed the link on Marathon's TEG exterior airlock
type: Fix
- message: Fixed Cog's exterior atmospherics airlock
type: Fix
id: 7664
time: '2024-11-30T06:23:50.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/33621
- author: Plykiya
changes:
- message: You can no longer cuff someone multiple times if multiple cuff do-afters
are completed at the exact same time.
type: Fix
id: 7665
time: '2024-11-30T15:58:56.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/33646
- author: Plykiya
changes:
- message: You can now inspect the entity in your hand instead of the entity that
happened to be underneath your hand.
type: Fix
id: 7666
time: '2024-11-30T16:14:39.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/33642
- author: Plykiya
changes:
- message: You can now inspect entities in the stripping window instead of the entity
that happened to be underneath the window.
type: Fix
id: 7667
time: '2024-11-30T16:23:27.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/33644
- author: Winkarst-cpu
changes:
- message: Now borgs get names on roundstart.
type: Fix
id: 7668
time: '2024-11-30T17:25:09.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/33578
- author: thetolbean
changes:
- message: The double-bladed esword now can only be activated when wielded.
type: Tweak
id: 7669
time: '2024-11-30T19:31:40.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/32869
- author: IProduceWidgets
changes:
- message: Reindeer.
type: Add
- message: the legally distinct cookie monster.
type: Add
- message: cargo order for holiday light tubes.
type: Add
id: 7670
time: '2024-12-01T06:30:01.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/33364

View file

@ -9,7 +9,7 @@ panic_bunker.enabled = true
panic_bunker.disable_with_admins = true
panic_bunker.enable_without_admins = true
panic_bunker.show_reason = true
panic_bunker.custom_reason = "You have not played on a Wizard's Den server long enough to connect to this server. Please play on Wizard's Den Lizard or Farm Grass Hopper until you have more playtime."
panic_bunker.custom_reason = "You have not played on a Wizard's Den server long enough to connect to this server. Please play on Wizard's Den Lizard until you have more playtime."
[infolinks]
bug_report = "https://github.com/space-wizards/space-station-14/issues/new/choose"

File diff suppressed because one or more lines are too long

View file

@ -1 +1,3 @@
handheld-gps-coordinates-title = Coords: {$coordinates}
handheld-gps-coordinates-title =
Coords:
{$coordinates}

View file

@ -314,3 +314,7 @@ ghost-role-information-artifact-description = Enact your eldritch whims. Forcibl
ghost-role-information-tomatokiller-name = Tomato killer
ghost-role-information-tomatokiller-description = This little tomato will serve the botanist for the rest of his life... that is, a couple of minutes
ghost-role-information-gingerbread-name = Gingerbread Man
ghost-role-information-gingerbread-description = A being of pure holiday spirit.
Spread molassesy goodness and to all good cheer.

View file

@ -5,5 +5,6 @@ humanoid-character-profile-summary =
This is {$name}. {$gender ->
[male] He is
[female] She is
*[other] They are
[epicene] They are
*[other] It is
} {$age} years old.

View file

@ -15,7 +15,7 @@ humanoid-profile-editor-pronouns-label = Pronouns:
humanoid-profile-editor-pronouns-male-text = He / Him
humanoid-profile-editor-pronouns-female-text = She / Her
humanoid-profile-editor-pronouns-epicene-text = They / Them
humanoid-profile-editor-pronouns-neuter-text = It / It
humanoid-profile-editor-pronouns-neuter-text = It / Its
humanoid-profile-editor-import-button = Import
humanoid-profile-editor-export-button = Export
humanoid-profile-editor-export-image-button = Export image

View file

@ -30,6 +30,7 @@ shuttle-console-ftl-state-Starting = Starting
shuttle-console-ftl-state-Travelling = Travelling
shuttle-console-ftl-state-Arriving = Arriving
shuttle-console-ftl-state-Cooldown = Cooldown
shuttle-console-ftl-state-Invalid = Invalid
shuttle-console-map-settings = Settings
shuttle-console-ftl-button = FTL

View file

@ -9,6 +9,7 @@ species-name-arachnid = Arachnid
species-name-moth = Moth Person
species-name-skeleton = Skeleton
species-name-vox = Vox
species-name-gingerbread = delicious baked good
## Misc species things

View file

@ -15048,12 +15048,24 @@ entities:
rot: -1.5707963267948966 rad
pos: 15.5,6.5
parent: 12
- type: DeviceLinkSink
invokeCounter: 1
- type: DeviceLinkSource
linkedPorts:
26626:
- DoorStatus: DoorBolt
- uid: 26626
components:
- type: Transform
rot: -1.5707963267948966 rad
pos: 15.5,8.5
parent: 12
- type: DeviceLinkSink
invokeCounter: 1
- type: DeviceLinkSource
linkedPorts:
26625:
- DoorStatus: DoorBolt
- uid: 28301
components:
- type: Transform

View file

@ -9815,6 +9815,8 @@ entities:
rot: 3.141592653589793 rad
pos: 5.5,-44.5
parent: 30
- type: DeviceLinkSink
invokeCounter: 1
- type: DeviceLinkSource
linkedPorts:
10559:
@ -9827,6 +9829,12 @@ entities:
parent: 30
- type: DeviceLinkSink
invokeCounter: 1
- type: DeviceLinkSource
linkedPorts:
9342:
- DoorStatus: DoorBolt
lastSignals:
DoorStatus: True
- uid: 20059
components:
- type: Transform

File diff suppressed because it is too large Load diff

View file

@ -63,7 +63,7 @@
icon:
sprite: Objects/Tanks/red.rsi
state: icon
product: CrateSlimepersonLifeSupport
product: CrateNitrogenInternals
cost: 350
category: cargoproduct-category-name-emergency
group: market

View file

@ -18,6 +18,16 @@
category: cargoproduct-category-name-service
group: market
- type: cargoProduct
id: ServiceLightsHoliday
icon:
sprite: Objects/Power/light_bulb.rsi
state: normal
product: CrateServiceHolidayLights
cost: 800
category: cargoproduct-category-name-service
group: market
- type: cargoProduct
id: MousetrapBoxes
icon:
@ -207,3 +217,5 @@
cost: 500
category: cargoproduct-category-name-service
group: market

View file

@ -84,6 +84,26 @@
- id: LightBulb
amount: 6
- type: entity
name: holiday lighttube box
parent: BoxLightbulb
id: BoxLighttubeHoliday
components:
- type: StorageFill
contents:
- id: LightTubeCrystalRed # Its alternating on purpose for the light replacer.
- id: LightTubeCrystalGreen
- id: LightTubeCrystalRed
- id: LightTubeCrystalGreen
- id: LightTubeCrystalRed
- id: LightTubeCrystalGreen
- id: LightTubeCrystalRed
- id: LightTubeCrystalGreen
- id: LightTubeCrystalRed
- id: LightTubeCrystalGreen
- id: LightTubeCrystalRed
- id: LightTubeCrystalGreen
- type: entity
name: PDA box
parent: BoxCardboard

View file

@ -73,10 +73,10 @@
amount: 6
- type: entity
id: CrateSlimepersonLifeSupport
id: CrateNitrogenInternals
parent: CrateInternals
name: slimeperson life support crate
description: Contains four breath masks and four large nitrogen tanks.
name: internals crate (nitrogen)
description: Contains four breath masks and four large nitrogen tanks. Intended for Slimepeople and Vox.
components:
- type: StorageFill
contents:

View file

@ -32,6 +32,17 @@
- id: BoxLighttube
- id: BoxLightbulb
- type: entity
id: CrateServiceHolidayLights
parent: CrateGenericSteel
name: holiday lights crate
description: Deck the halls with these festive holiday lights!
components:
- type: StorageFill
contents:
- id: BoxLighttubeHoliday
- id: BoxLighttubeHoliday
- type: entity
id: CrateMousetrapBoxes
parent: CrateGenericSteel

View file

@ -880,3 +880,46 @@
- type: ConditionalSpawner
prototypes:
- MobHonkBot
- type: entity
name: gingerbread man Spawner
id: SpawnMobGingerbreadAI
suffix: Ghostrole
parent: MarkerBase
components:
- type: Sprite
layers:
- state: green
- state: full
sprite: Mobs/Species/Gingerbread/parts.rsi
- type: ConditionalSpawner
prototypes:
- MobGingerbreadAI
- type: entity
name: Reindeer Buck Spawner
id: SpawnMobReindeerBuck
parent: MarkerBase
components:
- type: Sprite
layers:
- state: green
- state: reindeer_buck_still
sprite: Mobs/Animals/reindeer_buck.rsi
- type: ConditionalSpawner
prototypes:
- MobReindeerBuck
- type: entity
name: Reindeer Doe Spawner
id: SpawnMobReindeerDoe
parent: MarkerBase
components:
- type: Sprite
layers:
- state: green
- state: reindeer_doe_still
sprite: Mobs/Animals/reindeer_doe.rsi
- type: ConditionalSpawner
prototypes:
- MobReindeerDoe

View file

@ -299,6 +299,9 @@
parent: [BaseBorgChassis, BaseBorgTransponder]
abstract: true
components:
- type: RandomMetadata
nameSegments:
- names_borg
- type: NpcFactionMember
factions:
- NanoTrasen

View file

@ -3494,3 +3494,97 @@
components:
- type: ReplacementAccent
accent: nymph
- type: entity
name: reindeer buck
parent: [ SimpleMobBase, MobCombat ]
id: MobReindeerBuck
description: You think it can pull a sleigh?
components:
- type: Sprite
drawdepth: Mobs
layers:
- map: ["enum.DamageStateVisualLayers.Base"]
state: reindeer_buck
sprite: Mobs/Animals/reindeer_buck.rsi
# - type: SpriteMovement # One day when this shit isnt broken as hell. For now they hoppity hop.
# movementLayers:
# movement:
# state: reindeer_buck
# noMovementLayers:
# movement:
# state: reindeer_buck_still
- type: Physics
- type: Fixtures
fixtures:
fix1:
shape:
!type:PhysShapeCircle
radius: 0.48
density: 200
mask:
- MobMask
layer:
- MobLayer
- type: DamageStateVisuals
states:
Alive:
Base: reindeer_buck
Critical:
Base: reindeer_buck_dead
Dead:
Base: reindeer_buck_dead
- type: Butcherable
spawned:
- id: FoodMeat
amount: 4
- type: Bloodstream
bloodMaxVolume: 300
# Horns though
- type: MeleeWeapon
damage:
types:
Piercing: 22
animation: WeaponArcFist
- type: NPCRetaliation
- type: FactionException
- type: NpcFactionMember
factions:
- Passive
- type: HTN
rootTask:
task: SimpleHostileCompound
- type: Puller
needsHands: false
- type: entity
name: reindeer doe
parent: MobReindeerBuck
id: MobReindeerDoe
components:
- type: MeleeWeapon
damage:
types:
Blunt: 15
animation: WeaponArcFist
- type: Sprite
drawdepth: Mobs
layers:
- map: ["enum.DamageStateVisualLayers.Base"]
state: reindeer_doe
sprite: Mobs/Animals/reindeer_doe.rsi
# - type: SpriteMovement # One day when this shit isnt broken as hell. For now they hoppity hop.
# movementLayers:
# movement:
# state: reindeer_doe
# noMovementLayers:
# movement:
# state: reindeer_doe_still
- type: DamageStateVisuals
states:
Alive:
Base: reindeer_doe
Critical:
Base: reindeer_doe_dead
Dead:
Base: reindeer_doe_dead

View file

@ -11,3 +11,23 @@
damageRecovery:
types:
Asphyxiation: -1.0
- type: entity
name: gingerbread man
id: MobGingerbreadAI
parent: [ MobGingerbread, MobCombat]
components:
- type: GhostRole
name: ghost-role-information-gingerbread-name
description: ghost-role-information-gingerbread-description
rules: ghost-role-information-nonantagonist-rules
- type: GhostTakeoverAvailable
- type: NPCRetaliation
- type: FactionException
- type: NpcFactionMember
factions:
- Passive
- type: HTN
rootTask:
task: SimpleHostileCompound

View file

@ -280,6 +280,7 @@
components:
- type: ItemToggle
onUse: false # wielding events control it instead
onActivate: false # prevents the weapon from being able to be turned on when it is on the ground
soundActivate:
path: /Audio/Weapons/ebladeon.ogg
params:

View file

@ -121,6 +121,7 @@
Nuke: !type:ContainerSlot
- type: Construction
node: nuke
- type: FTLSmashImmune
- type: entity
parent: NuclearBomb

View file

@ -1,6 +1,6 @@
- type: species
id: Gingerbread
name: species-name-human
name: species-name-gingerbread
roundStart: false
prototype: MobGingerbread
sprites: MobGingerbreadSprites

View file

@ -0,0 +1,52 @@
{
"version": 1,
"size": {
"x": 32,
"y": 32
},
"license": "CC-BY-SA-3.0",
"copyright": "Deer by Calciumtrice, usable under Creative Commons Attribution 3.0 license, from https://opengameart.org/content/deer, edited by IProduceWidgets (github)",
"states": [
{
"name": "reindeer_buck",
"directions": 4,
"delays": [
[
1,
0.2,
0.2,
0.2,
0.2
],
[
1,
0.2,
0.2,
0.2,
0.2
],
[
0.2,
0.2,
0.2,
0.2,
1
],
[
0.2,
0.2,
0.2,
0.2,
1
]
]
},
{
"name": "reindeer_buck_still",
"directions": 4
},
{
"name": "reindeer_buck_dead"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -0,0 +1,52 @@
{
"version": 1,
"size": {
"x": 32,
"y": 32
},
"license": "CC-BY-SA-3.0",
"copyright": "Deer by Calciumtrice, usable under Creative Commons Attribution 3.0 license, from https://opengameart.org/content/deer, edited by IProduceWidgets (github)",
"states": [
{
"name": "reindeer_doe",
"directions": 4,
"delays": [
[
1,
0.2,
0.2,
0.2,
0.2
],
[
1,
0.2,
0.2,
0.2,
0.2
],
[
0.2,
0.2,
0.2,
0.2,
1
],
[
0.2,
0.2,
0.2,
0.2,
1
]
]
},
{
"name": "reindeer_doe_still",
"directions": 4
},
{
"name": "reindeer_doe_dead"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

View file

@ -287,49 +287,50 @@ BriefcaseSyndieBase: null
BodyBag_Container: BodyBag
BodyBag_Folded: BodyBagFolded
# Sunrise-Edit: Возвращены резиновые боеприпасы.
# 2024-04-26
BaseBulletRubber: null
BulletPistolRubber: BulletPistol
BulletMagnumRubber: BulletMagnum
BulletLightRifleRubber: BulletLightRifle
BulletRifleRubber: BulletRifle
BulletCaselessRifleRubber: BulletCaselessRifle
CartridgePistolRubber: CartridgePistol
CartridgeMagnumRubber: CartridgeMagnum
CartridgeLightRifleRubber: CartridgeLightRifle
CartridgeRifleRubber: CartridgeRifle
CartridgeCaselessRifleRubber: CartridgeCaselessRifle
MagazinePistolRubber: MagazinePistol
MagazinePistolSubMachineGunRubber: MagazinePistolSubMachineGun
MagazinePistolCaselessRifleRubber: MagazinePistolCaselessRifle
MagazineMagnumRubber: MagazineMagnum
MagazineMagnumSubMachineGunRubber: MagazineMagnumSubMachineGun
MagazineLightRifleRubber: MagazineLightRifle
MagazineRifleRubber: MagazineRifle
MagazineCaselessRifleRubber: MagazineCaselessRifle
MagazineCaselessRifleShortRubber: MagazineCaselessRifleShort
SpeedLoaderPistolRubber: SpeedLoaderPistol
SpeedLoaderMagnumRubber: SpeedLoaderMagnum
MagazineBoxPistolRubber: MagazineBoxPistol
#BaseBulletRubber: null
#BulletPistolRubber: BulletPistol
#BulletMagnumRubber: BulletMagnum
#BulletLightRifleRubber: BulletLightRifle
#BulletRifleRubber: BulletRifle
#BulletCaselessRifleRubber: BulletCaselessRifle
#CartridgePistolRubber: CartridgePistol
#CartridgeMagnumRubber: CartridgeMagnum
#CartridgeLightRifleRubber: CartridgeLightRifle
#CartridgeRifleRubber: CartridgeRifle
#CartridgeCaselessRifleRubber: CartridgeCaselessRifle
#MagazinePistolRubber: MagazinePistol
#MagazinePistolSubMachineGunRubber: MagazinePistolSubMachineGun
#MagazinePistolCaselessRifleRubber: MagazinePistolCaselessRifle
#MagazineMagnumRubber: MagazineMagnum
#MagazineMagnumSubMachineGunRubber: MagazineMagnumSubMachineGun
#MagazineLightRifleRubber: MagazineLightRifle
#MagazineRifleRubber: MagazineRifle
#MagazineCaselessRifleRubber: MagazineCaselessRifle
#MagazineCaselessRifleShortRubber: MagazineCaselessRifleShort
#SpeedLoaderPistolRubber: SpeedLoaderPistol
#SpeedLoaderMagnumRubber: SpeedLoaderMagnum
#MagazineBoxPistolRubber: MagazineBoxPistol
# RIP box of magnum rubbers 202X to 2024
MagazineBoxMagnumRubber: MagazineBoxMagnum
MagazineBoxLightRifleRubber: MagazineBoxLightRifle
MagazineBoxRifleRubber: MagazineBoxRifle
MagazineBoxRifleBigRubber: MagazineBoxRifleBig
MagazineBoxCaselessRifleRubber: MagazineBoxCaselessRifle
MagazineBoxCaselessRifleBigRubber: MagazineBoxCaselessRifle10x24
BoxMagazinePistolRubber: BoxMagazinePistol
BoxMagazinePistolHighCapacityRubber: BoxMagazinePistolHighCapacity
BoxMagazinePistolSubMachineGunRubber: BoxMagazinePistolSubMachineGun
BoxMagazineLightRifleRubber: BoxMagazineLightRifle
BoxMagazineRifleRubber: BoxMagazineRifle
BoxMagazineCaselessRifleRubber: BoxMagazinePistolCaselessRifle
BoxMagazineMagnumSubMachineGunRubber: BoxMagazineMagnumSubMachineGun
WeaponPistolMk58Nonlethal: WeaponPistolMk58
WeaponPistolN1984Nonlethal: WeaponPistolN1984
WeaponSubMachineGunVectorRubber: WeaponSubMachineGunVector
WeaponSubMachineGunDrozdRubber: WeaponSubMachineGunDrozd
WeaponRifleLecterRubber: WeaponRifleLecter
#MagazineBoxMagnumRubber: MagazineBoxMagnum
#MagazineBoxLightRifleRubber: MagazineBoxLightRifle
#MagazineBoxRifleRubber: MagazineBoxRifle
#MagazineBoxRifleBigRubber: MagazineBoxRifleBig
#MagazineBoxCaselessRifleRubber: MagazineBoxCaselessRifle
#MagazineBoxCaselessRifleBigRubber: MagazineBoxCaselessRifle10x24
#BoxMagazinePistolRubber: BoxMagazinePistol
#BoxMagazinePistolHighCapacityRubber: BoxMagazinePistolHighCapacity
#BoxMagazinePistolSubMachineGunRubber: BoxMagazinePistolSubMachineGun
#BoxMagazineLightRifleRubber: BoxMagazineLightRifle
#BoxMagazineRifleRubber: BoxMagazineRifle
#BoxMagazineCaselessRifleRubber: BoxMagazinePistolCaselessRifle
#BoxMagazineMagnumSubMachineGunRubber: BoxMagazineMagnumSubMachineGun
#WeaponPistolMk58Nonlethal: WeaponPistolMk58
#WeaponPistolN1984Nonlethal: WeaponPistolN1984
#WeaponSubMachineGunVectorRubber: WeaponSubMachineGunVector
#WeaponSubMachineGunDrozdRubber: WeaponSubMachineGunDrozd
#WeaponRifleLecterRubber: WeaponRifleLecter
# 2024-04-26
GlassBoxLaserBroken: GlassBoxBroken
@ -478,9 +479,13 @@ TorsoBorgJanitor: TorsoBorg
# 2024-11-17
PresentRandomAsh: PresentRandomCoal
# 2024-11-19
CrateCrewMonitoringBoards: CrateCrewMonitoring
# 2024-11-25
CrateSlimepersonLifeSupport: CrateNitrogenInternals
# Sunrise migrations
AirlockExternalGlassShuttleArrivals: AirlockExternalGlassShuttleArrivalsLocked
AirlockHatchSyndicate: AirlockHatchSyndicateLocked