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

# Conflicts:
#	Content.Server/Revenant/EntitySystems/RevenantSystem.Abilities.cs
#	Resources/Prototypes/Entities/Mobs/Player/human.yml
#	Resources/Prototypes/Entities/Mobs/Player/humanoid.yml
#	Resources/Prototypes/Loadouts/loadout_groups.yml
#	Resources/Prototypes/Maps/train.yml
This commit is contained in:
VigersRay 2024-08-07 22:57:31 +03:00
commit a33b949c98
118 changed files with 16759 additions and 14595 deletions

View file

@ -93,6 +93,6 @@ public sealed class ClientAlertsSystem : AlertsSystem
public void AlertClicked(ProtoId<AlertPrototype> alertType)
{
RaiseNetworkEvent(new ClickAlertEvent(alertType));
RaisePredictiveEvent(new ClickAlertEvent(alertType));
}
}

View file

@ -16,6 +16,7 @@ namespace Content.Client.Chat.UI
[Dependency] private readonly IEyeManager _eyeManager = default!;
[Dependency] private readonly IEntityManager _entityManager = default!;
[Dependency] protected readonly IConfigurationManager ConfigManager = default!;
private readonly SharedTransformSystem _transformSystem;
public enum SpeechType : byte
{
@ -83,6 +84,7 @@ namespace Content.Client.Chat.UI
{
IoCManager.InjectDependencies(this);
_senderEntity = senderEntity;
_transformSystem = _entityManager.System<SharedTransformSystem>();
// Use text clipping so new messages don't overlap old ones being pushed up.
RectClipContent = true;
@ -140,7 +142,7 @@ namespace Content.Client.Chat.UI
}
var offset = (-_eyeManager.CurrentEye.Rotation).ToWorldVec() * -EntityVerticalOffset;
var worldPos = xform.WorldPosition + offset;
var worldPos = _transformSystem.GetWorldPosition(xform) + offset;
var lowerCenter = _eyeManager.WorldToScreen(worldPos) / UIScale;
var screenPos = lowerCenter - new Vector2(ContentSize.X / 2, ContentSize.Y + _verticalOffsetAchieved);

View file

@ -1,3 +1,4 @@
using Content.Client.Actions;
using Content.Client.Mapping;
using Content.Client.Markers;
using JetBrains.Annotations;
@ -25,7 +26,7 @@ internal sealed class MappingClientSideSetupCommand : LocalizedCommands
_entitySystemManager.GetEntitySystem<MarkerSystem>().MarkersVisible = true;
_lightManager.Enabled = false;
shell.ExecuteCommand("showsubfloorforever");
_stateManager.RequestStateChange<MappingState>();
_entitySystemManager.GetEntitySystem<ActionsSystem>().LoadActionAssignments("/mapping_actions.yml", false);
}
}
}

View file

@ -16,6 +16,7 @@ public sealed class ExplosionOverlay : Overlay
[Dependency] private readonly IRobustRandom _robustRandom = default!;
[Dependency] private readonly IEntityManager _entMan = default!;
[Dependency] private readonly IPrototypeManager _proto = default!;
private readonly SharedTransformSystem _transformSystem;
private SharedAppearanceSystem _appearance;
public override OverlaySpace Space => OverlaySpace.WorldSpaceBelowFOV;
@ -26,6 +27,7 @@ public sealed class ExplosionOverlay : Overlay
{
IoCManager.InjectDependencies(this);
_shader = _proto.Index<ShaderPrototype>("unshaded").Instance();
_transformSystem = _entMan.System<SharedTransformSystem>();
_appearance = appearanceSystem;
}
@ -68,7 +70,7 @@ public sealed class ExplosionOverlay : Overlay
continue;
var xform = xforms.GetComponent(gridId);
var (_, _, worldMatrix, invWorldMatrix) = xform.GetWorldPositionRotationMatrixWithInv(xforms);
var (_, _, worldMatrix, invWorldMatrix) = _transformSystem.GetWorldPositionRotationMatrixWithInv(xform, xforms);
gridBounds = invWorldMatrix.TransformBox(worldBounds).Enlarged(grid.TileSize * 2);
drawHandle.SetTransform(worldMatrix);

View file

@ -14,6 +14,7 @@ public sealed class PuddleOverlay : Overlay
[Dependency] private readonly IEntityManager _entityManager = default!;
[Dependency] private readonly IEntitySystemManager _entitySystemManager = default!;
private readonly PuddleDebugOverlaySystem _debugOverlaySystem;
private readonly SharedTransformSystem _transformSystem;
private readonly Color _heavyPuddle = new(0, 255, 255, 50);
private readonly Color _mediumPuddle = new(0, 150, 255, 50);
@ -29,6 +30,7 @@ public sealed class PuddleOverlay : Overlay
_debugOverlaySystem = _entitySystemManager.GetEntitySystem<PuddleDebugOverlaySystem>();
var cache = IoCManager.Resolve<IResourceCache>();
_font = new VectorFont(cache.GetResource<FontResource>("/Fonts/NotoSans/NotoSans-Regular.ttf"), 8);
_transformSystem = _entityManager.System<SharedTransformSystem>();
}
protected override void Draw(in OverlayDrawArgs args)
@ -56,7 +58,7 @@ public sealed class PuddleOverlay : Overlay
continue;
var gridXform = xformQuery.GetComponent(gridId);
var (_, _, worldMatrix, invWorldMatrix) = gridXform.GetWorldPositionRotationMatrixWithInv(xformQuery);
var (_, _, worldMatrix, invWorldMatrix) = _transformSystem.GetWorldPositionRotationMatrixWithInv(gridXform, xformQuery);
gridBounds = invWorldMatrix.TransformBox(args.WorldBounds).Enlarged(mapGrid.TileSize * 2);
drawHandle.SetTransform(worldMatrix);
@ -89,7 +91,7 @@ public sealed class PuddleOverlay : Overlay
continue;
var gridXform = xformQuery.GetComponent(gridId);
var (_, _, matrix, invMatrix) = gridXform.GetWorldPositionRotationMatrixWithInv(xformQuery);
var (_, _, matrix, invMatrix) = _transformSystem.GetWorldPositionRotationMatrixWithInv(gridXform, xformQuery);
var gridBounds = invMatrix.TransformBox(args.WorldBounds).Enlarged(mapGrid.TileSize * 2);
foreach (var debugOverlayData in _debugOverlaySystem.GetData(gridId))

View file

@ -42,6 +42,7 @@ public sealed class DragDropSystem : SharedDragDropSystem
[Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!;
[Dependency] private readonly EntityLookupSystem _lookup = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;
// how often to recheck possible targets (prevents calling expensive
// check logic each update)
@ -517,6 +518,9 @@ public sealed class DragDropSystem : SharedDragDropSystem
if (dropEv2.Handled)
return dropEv2.CanDrop;
if (dropEv.Handled && dropEv.CanDrop)
return true;
return null;
}
@ -551,7 +555,7 @@ public sealed class DragDropSystem : SharedDragDropSystem
if (Exists(_dragShadow))
{
var mousePos = _eyeManager.PixelToMap(_inputManager.MouseScreenPosition);
Transform(_dragShadow.Value).WorldPosition = mousePos.Position;
_transformSystem.SetWorldPosition(_dragShadow.Value, mousePos.Position);
}
}
}

View file

@ -18,6 +18,7 @@ public sealed class GridDraggingSystem : SharedGridDraggingSystem
[Dependency] private readonly IInputManager _inputManager = default!;
[Dependency] private readonly IMapManager _mapManager = default!;
[Dependency] private readonly InputSystem _inputSystem = default!;
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;
public bool Enabled { get; set; }
@ -62,11 +63,11 @@ public sealed class GridDraggingSystem : SharedGridDraggingSystem
if (_dragging == null) return;
if (_lastMousePosition != null && TryComp(_dragging.Value, out TransformComponent? xform) &&
TryComp<PhysicsComponent>(_dragging.Value, out var body) &&
TryComp<PhysicsComponent>(_dragging.Value, out _) &&
xform.MapID == _lastMousePosition.Value.MapId)
{
var tickTime = _gameTiming.TickPeriod;
var distance = _lastMousePosition.Value.Position - xform.WorldPosition;
var distance = _lastMousePosition.Value.Position - _transformSystem.GetWorldPosition(xform);
RaiseNetworkEvent(new GridDragVelocityRequest()
{
Grid = GetNetEntity(_dragging.Value),

View file

@ -9,6 +9,7 @@ public sealed class HTNOverlay : Overlay
{
private readonly IEntityManager _entManager = default!;
private readonly Font _font = default!;
private readonly SharedTransformSystem _transformSystem;
public override OverlaySpace Space => OverlaySpace.ScreenSpace;
@ -16,6 +17,7 @@ public sealed class HTNOverlay : Overlay
{
_entManager = entManager;
_font = new VectorFont(resourceCache.GetResource<FontResource>("/Fonts/NotoSans/NotoSans-Regular.ttf"), 10);
_transformSystem = _entManager.System<SharedTransformSystem>();
}
protected override void Draw(in OverlayDrawArgs args)
@ -30,7 +32,7 @@ public sealed class HTNOverlay : Overlay
if (string.IsNullOrEmpty(comp.DebugText) || xform.MapID != args.MapId)
continue;
var worldPos = xform.WorldPosition;
var worldPos = _transformSystem.GetWorldPosition(xform);
if (!args.WorldAABB.Contains(worldPos))
continue;

View file

@ -81,10 +81,12 @@ public sealed class NPCSteeringOverlay : Overlay
public override OverlaySpace Space => OverlaySpace.WorldSpace;
private readonly IEntityManager _entManager;
private readonly SharedTransformSystem _transformSystem;
public NPCSteeringOverlay(IEntityManager entManager)
{
_entManager = entManager;
_transformSystem = _entManager.System<SharedTransformSystem>();
}
protected override void Draw(in OverlayDrawArgs args)
@ -96,7 +98,7 @@ public sealed class NPCSteeringOverlay : Overlay
continue;
}
var (worldPos, worldRot) = xform.GetWorldPositionRotation();
var (worldPos, worldRot) = _transformSystem.GetWorldPositionRotation(xform);
if (!args.WorldAABB.Contains(worldPos))
continue;

View file

@ -12,6 +12,7 @@ public sealed class NetworkConfiguratorLinkOverlay : Overlay
[Dependency] private readonly IEntityManager _entityManager = default!;
[Dependency] private readonly IRobustRandom _random = default!;
private readonly DeviceListSystem _deviceListSystem;
private readonly SharedTransformSystem _transformSystem;
public Dictionary<EntityUid, Color> Colors = new();
public EntityUid? Action;
@ -23,6 +24,7 @@ public sealed class NetworkConfiguratorLinkOverlay : Overlay
IoCManager.InjectDependencies(this);
_deviceListSystem = _entityManager.System<DeviceListSystem>();
_transformSystem = _entityManager.System<SharedTransformSystem>();
}
protected override void Draw(in OverlayDrawArgs args)
@ -66,7 +68,7 @@ public sealed class NetworkConfiguratorLinkOverlay : Overlay
continue;
}
args.WorldHandle.DrawLine(sourceTransform.WorldPosition, linkTransform.WorldPosition, Colors[uid]);
args.WorldHandle.DrawLine(_transformSystem.GetWorldPosition(sourceTransform), _transformSystem.GetWorldPosition(linkTransform), Colors[uid]);
}
}
}

View file

@ -20,6 +20,7 @@ namespace Content.Client.NodeContainer
private readonly IMapManager _mapManager;
private readonly IInputManager _inputManager;
private readonly IEntityManager _entityManager;
private readonly SharedTransformSystem _transformSystem;
private readonly Dictionary<(int, int), NodeRenderData> _nodeIndex = new();
private readonly Dictionary<EntityUid, Dictionary<Vector2i, List<(GroupData, NodeDatum)>>> _gridIndex = new ();
@ -46,6 +47,7 @@ namespace Content.Client.NodeContainer
_mapManager = mapManager;
_inputManager = inputManager;
_entityManager = entityManager;
_transformSystem = _entityManager.System<SharedTransformSystem>();
_font = cache.GetFont("/Fonts/NotoSans/NotoSans-Regular.ttf", 12);
}
@ -146,7 +148,7 @@ namespace Content.Client.NodeContainer
foreach (var (gridId, gridDict) in _gridIndex)
{
var grid = _entityManager.GetComponent<MapGridComponent>(gridId);
var (_, _, worldMatrix, invMatrix) = _entityManager.GetComponent<TransformComponent>(gridId).GetWorldPositionRotationMatrixWithInv();
var (_, _, worldMatrix, invMatrix) = _transformSystem.GetWorldPositionRotationMatrixWithInv(gridId);
var lCursorBox = invMatrix.TransformBox(cursorBox);
foreach (var (pos, list) in gridDict)

View file

@ -23,6 +23,7 @@ public sealed class TargetOutlineSystem : EntitySystem
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly SharedInteractionSystem _interactionSystem = default!;
[Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!;
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;
private bool _enabled = false;
@ -165,8 +166,8 @@ public sealed class TargetOutlineSystem : EntitySystem
valid = _interactionSystem.InRangeUnobstructed(player, entity, Range);
else if (Range >= 0)
{
var origin = Transform(player).WorldPosition;
var target = Transform(entity).WorldPosition;
var origin = _transformSystem.GetWorldPosition(player);
var target = _transformSystem.GetWorldPosition(entity);
valid = (origin - target).LengthSquared() <= Range;
}

View file

@ -11,6 +11,7 @@ namespace Content.Client.Stealth;
public sealed class StealthSystem : SharedStealthSystem
{
[Dependency] private readonly IPrototypeManager _protoMan = default!;
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;
private ShaderInstance _shader = default!;
@ -81,7 +82,7 @@ public sealed class StealthSystem : SharedStealthSystem
if (!parent.IsValid())
return; // should never happen, but lets not kill the client.
var parentXform = Transform(parent);
var reference = args.Viewport.WorldToLocal(parentXform.WorldPosition);
var reference = args.Viewport.WorldToLocal(_transformSystem.GetWorldPosition(parentXform));
reference.X = -reference.X;
var visibility = GetVisibility(uid, component);

View file

@ -27,6 +27,7 @@ namespace Content.Client.Tabletop
[Dependency] private readonly IPlayerManager _playerManager = default!;
[Dependency] private readonly IGameTiming _gameTiming = default!;
[Dependency] private readonly AppearanceSystem _appearance = default!;
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;
// Time in seconds to wait until sending the location of a dragged entity to the server again
private const float Delay = 1f / 10; // 10 Hz
@ -100,7 +101,7 @@ namespace Content.Client.Tabletop
if (clampedCoords.Equals(MapCoordinates.Nullspace)) return;
// Move the entity locally every update
EntityManager.GetComponent<TransformComponent>(_draggedEntity.Value).WorldPosition = clampedCoords.Position;
_transformSystem.SetWorldPosition(_draggedEntity.Value, clampedCoords.Position);
// Increment total time passed
_timePassed += frameTime;

View file

@ -15,7 +15,6 @@ public sealed class ViewportUIController : UIController
[Dependency] private readonly IPlayerManager _playerMan = default!;
[Dependency] private readonly IEntityManager _entMan = default!;
[Dependency] private readonly IConfigurationManager _configurationManager = default!;
public static readonly Vector2i ViewportSize = (EyeManager.PixelsPerMeter * 21, EyeManager.PixelsPerMeter * 15);
public const int ViewportHeight = 15;
private MainViewport? Viewport => UIManager.ActiveScreen?.GetWidget<MainViewport>();

View file

@ -213,7 +213,7 @@ public sealed partial class MeleeWeaponSystem
private void UpdateEffects()
{
var query = EntityQueryEnumerator<TrackUserComponent, TransformComponent>();
while (query.MoveNext(out var arcComponent, out var xform))
while (query.MoveNext(out var uid, out var arcComponent, out var xform))
{
if (arcComponent.User == null)
continue;
@ -226,7 +226,7 @@ public sealed partial class MeleeWeaponSystem
targetPos += entRotation.RotateVec(arcComponent.Offset);
}
TransformSystem.SetWorldPosition(xform, targetPos);
TransformSystem.SetWorldPosition(uid, targetPos);
}
}
}

View file

@ -1,4 +1,5 @@
using Content.Server.Popups;
using Content.Shared.Abilities.Mime;
using Content.Shared.Actions;
using Content.Shared.Actions.Events;
using Content.Shared.Alert;
@ -29,6 +30,9 @@ namespace Content.Server.Abilities.Mime
base.Initialize();
SubscribeLocalEvent<MimePowersComponent, ComponentInit>(OnComponentInit);
SubscribeLocalEvent<MimePowersComponent, InvisibleWallActionEvent>(OnInvisibleWall);
SubscribeLocalEvent<MimePowersComponent, BreakVowAlertEvent>(OnBreakVowAlert);
SubscribeLocalEvent<MimePowersComponent, RetakeVowAlertEvent>(OnRetakeVowAlert);
}
public override void Update(float frameTime)
@ -99,6 +103,22 @@ namespace Content.Server.Abilities.Mime
args.Handled = true;
}
private void OnBreakVowAlert(Entity<MimePowersComponent> ent, ref BreakVowAlertEvent args)
{
if (args.Handled)
return;
BreakVow(ent, ent);
args.Handled = true;
}
private void OnRetakeVowAlert(Entity<MimePowersComponent> ent, ref RetakeVowAlertEvent args)
{
if (args.Handled)
return;
RetakeVow(ent, ent);
args.Handled = true;
}
/// <summary>
/// Break this mime's vow to not speak.
/// </summary>

View file

@ -16,6 +16,7 @@ public sealed partial class AdminLogManager
// TODO ADMIN LOGS make this thread safe or remove thread safety from the main partial class
private readonly Dictionary<int, List<SharedAdminLog>> _roundsLogCache = new(MaxRoundsCached);
private readonly Queue<int> _roundsLogCacheQueue = new();
private static readonly Gauge CacheRoundCount = Metrics.CreateGauge(
"admin_logs_cache_round_count",
@ -28,19 +29,21 @@ public sealed partial class AdminLogManager
// TODO ADMIN LOGS cache previous {MaxRoundsCached} rounds on startup
public void CacheNewRound()
{
List<SharedAdminLog> list;
var oldestRound = _currentRoundId - MaxRoundsCached;
List<SharedAdminLog>? list = null;
if (_roundsLogCache.Remove(oldestRound, out var oldestList))
_roundsLogCacheQueue.Enqueue(_currentRoundId);
if (_roundsLogCacheQueue.Count > MaxRoundsCached)
{
list = oldestList;
list.Clear();
}
else
{
list = new List<SharedAdminLog>(LogListInitialSize);
var oldestRound = _roundsLogCacheQueue.Dequeue();
if (_roundsLogCache.Remove(oldestRound, out var oldestList))
{
list = oldestList;
list.Clear();
}
}
list ??= new List<SharedAdminLog>(LogListInitialSize);
_roundsLogCache.Add(_currentRoundId, list);
CacheRoundCount.Set(_roundsLogCache.Count);
}

View file

@ -1,22 +0,0 @@
using Content.Shared.Alert;
using Content.Server.Abilities.Mime;
namespace Content.Server.Alert.Click
{
///<summary>
/// Break your mime vows
///</summary>
[DataDefinition]
public sealed partial class BreakVow : IAlertClick
{
public void AlertClicked(EntityUid player)
{
var entManager = IoCManager.Resolve<IEntityManager>();
if (entManager.TryGetComponent(player, out MimePowersComponent? mimePowers))
{
entManager.System<MimePowersSystem>().BreakVow(player, mimePowers);
}
}
}
}

View file

@ -1,21 +0,0 @@
using Content.Server.Cuffs;
using Content.Shared.Alert;
using JetBrains.Annotations;
namespace Content.Server.Alert.Click
{
/// <summary>
/// Try to remove handcuffs from yourself
/// </summary>
[UsedImplicitly]
[DataDefinition]
public sealed partial class RemoveCuffs : IAlertClick
{
public void AlertClicked(EntityUid player)
{
var entityManager = IoCManager.Resolve<IEntityManager>();
var cuffableSys = entityManager.System<CuffableSystem>();
cuffableSys.TryUncuff(player, player);
}
}
}

View file

@ -1,28 +0,0 @@
using Content.Server.Ensnaring;
using Content.Shared.Alert;
using Content.Shared.Ensnaring.Components;
using JetBrains.Annotations;
namespace Content.Server.Alert.Click;
[UsedImplicitly]
[DataDefinition]
public sealed partial class RemoveEnsnare : IAlertClick
{
public void AlertClicked(EntityUid player)
{
var entManager = IoCManager.Resolve<IEntityManager>();
if (entManager.TryGetComponent(player, out EnsnareableComponent? ensnareableComponent))
{
foreach (var ensnare in ensnareableComponent.Container.ContainedEntities)
{
if (!entManager.TryGetComponent(ensnare, out EnsnaringComponent? ensnaringComponent))
return;
entManager.EntitySysManager.GetEntitySystem<EnsnareableSystem>().TryFree(player, player, ensnare, ensnaringComponent);
// Only one snare at a time.
break;
}
}
}
}

View file

@ -1,25 +0,0 @@
using Content.Server.Atmos.Components;
using Content.Server.Atmos.EntitySystems;
using Content.Shared.Alert;
using JetBrains.Annotations;
namespace Content.Server.Alert.Click
{
/// <summary>
/// Resist fire
/// </summary>
[UsedImplicitly]
[DataDefinition]
public sealed partial class ResistFire : IAlertClick
{
public void AlertClicked(EntityUid player)
{
var entManager = IoCManager.Resolve<IEntityManager>();
if (entManager.TryGetComponent(player, out FlammableComponent? flammable))
{
entManager.System<FlammableSystem>().Resist(player, flammable);
}
}
}
}

View file

@ -1,22 +0,0 @@
using Content.Shared.Alert;
using Content.Server.Abilities.Mime;
namespace Content.Server.Alert.Click
{
///<summary>
/// Retake your mime vows
///</summary>
[DataDefinition]
public sealed partial class RetakeVow : IAlertClick
{
public void AlertClicked(EntityUid player)
{
var entManager = IoCManager.Resolve<IEntityManager>();
if (entManager.TryGetComponent(player, out MimePowersComponent? mimePowers))
{
entManager.System<MimePowersSystem>().RetakeVow(player, mimePowers);
}
}
}
}

View file

@ -1,29 +0,0 @@
using Content.Shared.ActionBlocker;
using Content.Shared.Alert;
using Content.Shared.Movement.Pulling.Components;
using Content.Shared.Movement.Pulling.Systems;
using JetBrains.Annotations;
namespace Content.Server.Alert.Click
{
/// <summary>
/// Stop pulling something
/// </summary>
[UsedImplicitly]
[DataDefinition]
public sealed partial class StopBeingPulled : IAlertClick
{
public void AlertClicked(EntityUid player)
{
var entityManager = IoCManager.Resolve<IEntityManager>();
if (!entityManager.System<ActionBlockerSystem>().CanInteract(player, null))
return;
if (entityManager.TryGetComponent(player, out PullableComponent? playerPullable))
{
entityManager.System<PullingSystem>().TryStopPull(player, playerPullable, user: player);
}
}
}
}

View file

@ -1,26 +0,0 @@
using Content.Server.Shuttles.Systems;
using Content.Shared.Alert;
using Content.Shared.Shuttles.Components;
using JetBrains.Annotations;
namespace Content.Server.Alert.Click
{
/// <summary>
/// Stop piloting shuttle
/// </summary>
[UsedImplicitly]
[DataDefinition]
public sealed partial class StopPiloting : IAlertClick
{
public void AlertClicked(EntityUid player)
{
var entManager = IoCManager.Resolve<IEntityManager>();
if (entManager.TryGetComponent(player, out PilotComponent? pilotComponent)
&& pilotComponent.Console != null)
{
entManager.System<ShuttleConsoleSystem>().RemovePilot(player, pilotComponent);
}
}
}
}

View file

@ -1,27 +0,0 @@
using Content.Shared.Alert;
using Content.Shared.Movement.Pulling.Components;
using Content.Shared.Movement.Pulling.Systems;
using JetBrains.Annotations;
namespace Content.Server.Alert.Click
{
/// <summary>
/// Stop pulling something
/// </summary>
[UsedImplicitly]
[DataDefinition]
public sealed partial class StopPulling : IAlertClick
{
public void AlertClicked(EntityUid player)
{
var entManager = IoCManager.Resolve<IEntityManager>();
var ps = entManager.System<PullingSystem>();
if (entManager.TryGetComponent(player, out PullerComponent? puller) &&
entManager.TryGetComponent(puller.Pulling, out PullableComponent? pullableComp))
{
ps.TryStopPull(puller.Pulling.Value, pullableComp, user: player);
}
}
}
}

View file

@ -1,19 +0,0 @@
using Content.Server.Body.Systems;
using Content.Shared.Alert;
using JetBrains.Annotations;
namespace Content.Server.Alert.Click;
/// <summary>
/// Attempts to toggle the internals for a particular entity
/// </summary>
[UsedImplicitly]
[DataDefinition]
public sealed partial class ToggleInternals : IAlertClick
{
public void AlertClicked(EntityUid player)
{
var internalsSystem = IoCManager.Resolve<IEntitySystemManager>().GetEntitySystem<InternalsSystem>();
internalsSystem.ToggleInternals(player, player, false);
}
}

View file

@ -1,19 +0,0 @@
using Content.Shared.Alert;
using Content.Shared.Buckle;
using JetBrains.Annotations;
namespace Content.Server.Alert.Click
{
/// <summary>
/// Unbuckles if player is currently buckled.
/// </summary>
[UsedImplicitly]
[DataDefinition]
public sealed partial class Unbuckle : IAlertClick
{
public void AlertClicked(EntityUid player)
{
IoCManager.Resolve<IEntityManager>().System<SharedBuckleSystem>().TryUnbuckle(player, player);
}
}
}

View file

@ -14,11 +14,15 @@ using Content.Server.Roles.Jobs;
using Content.Server.Shuttles.Components;
using Content.Server.Station.Systems;
using Content.Shared.Antag;
using Content.Shared.Clothing;
using Content.Shared.GameTicking;
using Content.Shared.GameTicking.Components;
using Content.Shared.Ghost;
using Content.Shared.Humanoid;
using Content.Shared.Mind;
using Content.Shared.Players;
using Content.Shared.Preferences.Loadouts;
using Content.Shared.Roles;
using Content.Shared.Whitelist;
using Robust.Server.Audio;
using Robust.Server.GameObjects;
@ -26,6 +30,7 @@ using Robust.Server.Player;
using Robust.Shared.Enums;
using Robust.Shared.Map;
using Robust.Shared.Player;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
using Robust.Shared.Utility;
using Content.Shared.Roles;
@ -39,10 +44,13 @@ public sealed partial class AntagSelectionSystem : GameRuleSystem<AntagSelection
[Dependency] private readonly IChatManager _chat = default!;
[Dependency] private readonly IPlayerManager _playerManager = default!;
[Dependency] private readonly IServerPreferencesManager _pref = default!;
[Dependency] private readonly ActorSystem _actors = default!;
[Dependency] private readonly AudioSystem _audio = default!;
[Dependency] private readonly GhostRoleSystem _ghostRole = default!;
[Dependency] private readonly JobSystem _jobs = default!;
[Dependency] private readonly LoadoutSystem _loadout = default!;
[Dependency] private readonly MindSystem _mind = default!;
[Dependency] private readonly IPrototypeManager _proto = default!;
[Dependency] private readonly RoleSystem _role = default!;
[Dependency] private readonly StationSpawningSystem _stationSpawning = default!;
[Dependency] private readonly TransformSystem _transform = default!;
@ -247,7 +255,7 @@ public sealed partial class AntagSelectionSystem : GameRuleSystem<AntagSelection
for (var i = 0; i < count; i++)
{
var session = (ICommonSession?) null;
var session = (ICommonSession?)null;
if (picking)
{
// Sunrise-Sponsors-Start
@ -378,17 +386,29 @@ public sealed partial class AntagSelectionSystem : GameRuleSystem<AntagSelection
// The following is where we apply components, equipment, and other changes to our antagonist entity.
EntityManager.AddComponents(player, def.Components);
_stationSpawning.EquipStartingGear(player, def.StartingGear);
// Equip the entity's RoleLoadout and LoadoutGroup
List<ProtoId<StartingGearPrototype>>? gear = new();
if (def.StartingGear is not null)
gear.Add(def.StartingGear.Value);
_loadout.Equip(player, gear, def.RoleLoadout);
if (session != null)
{
var curMind = _mind.CreateMind(session.UserId, Name(antagEnt.Value));
_mind.SetUserId(curMind, session.UserId);
_mind.TransferTo(curMind, antagEnt, ghostCheckOverride: true);
_role.MindAddRoles(curMind, def.MindComponents, null, true);
ent.Comp.SelectedMinds.Add((curMind, Name(player)));
var curMind = session.GetMind();
if (curMind == null ||
!TryComp<MindComponent>(curMind.Value, out var mindComp) ||
mindComp.OwnedEntity != antagEnt)
{
curMind = _mind.CreateMind(session.UserId, Name(antagEnt.Value));
_mind.SetUserId(curMind.Value, session.UserId);
}
_mind.TransferTo(curMind.Value, antagEnt, ghostCheckOverride: true);
_role.MindAddRoles(curMind.Value, def.MindComponents, null, true);
ent.Comp.SelectedMinds.Add((curMind.Value, Name(player)));
SendBriefing(session, def.Briefing);
}
@ -501,7 +521,7 @@ public sealed partial class AntagSelectionSystem : GameRuleSystem<AntagSelection
private void OnObjectivesTextGetInfo(Entity<AntagSelectionComponent> ent, ref ObjectivesTextGetInfoEvent args)
{
if (ent.Comp.AgentName is not {} name)
if (ent.Comp.AgentName is not { } name)
return;
args.Minds = ent.Comp.SelectedMinds;

View file

@ -1,6 +1,7 @@
using Content.Server.Administration.Systems;
using Content.Shared.Antag;
using Content.Shared.Destructible.Thresholds;
using Content.Shared.Preferences.Loadouts;
using Content.Shared.Roles;
using Content.Shared.Storage;
using Content.Shared.Whitelist;
@ -154,6 +155,12 @@ public partial struct AntagSelectionDefinition()
[DataField]
public ProtoId<StartingGearPrototype>? StartingGear;
/// <summary>
/// A list of role loadouts, from which a randomly selected one will be equipped.
/// </summary>
[DataField]
public List<ProtoId<RoleLoadoutPrototype>>? RoleLoadout;
/// <summary>
/// A briefing shown to the player.
/// </summary>

View file

@ -237,7 +237,7 @@ namespace Content.Server.Atmos.EntitySystems
// TODO: Technically these directions won't be correct but uhh I'm just here for optimisations buddy not to fix my old bugs.
if (throwTarget != EntityCoordinates.Invalid)
{
var pos = ((throwTarget.ToMap(EntityManager, _transformSystem).Position - xform.WorldPosition).Normalized() + dirVec).Normalized();
var pos = ((_transformSystem.ToMapCoordinates(throwTarget).Position - _transformSystem.GetWorldPosition(xform)).Normalized() + dirVec).Normalized();
_physics.ApplyLinearImpulse(uid, pos * moveForce, body: physics);
}
else

View file

@ -72,6 +72,7 @@ namespace Content.Server.Atmos.EntitySystems
SubscribeLocalEvent<FlammableComponent, IsHotEvent>(OnIsHot);
SubscribeLocalEvent<FlammableComponent, TileFireEvent>(OnTileFire);
SubscribeLocalEvent<FlammableComponent, RejuvenateEvent>(OnRejuvenate);
SubscribeLocalEvent<FlammableComponent, ResistFireAlertEvent>(OnResistFireAlert);
SubscribeLocalEvent<IgniteOnCollideComponent, StartCollideEvent>(IgniteOnCollide);
SubscribeLocalEvent<IgniteOnCollideComponent, LandEvent>(OnIgniteLand);
@ -250,6 +251,15 @@ namespace Content.Server.Atmos.EntitySystems
Extinguish(uid, component);
}
private void OnResistFireAlert(Entity<FlammableComponent> ent, ref ResistFireAlertEvent args)
{
if (args.Handled)
return;
Resist(ent, ent);
args.Handled = true;
}
public void UpdateAppearance(EntityUid uid, FlammableComponent? flammable = null, AppearanceComponent? appearance = null)
{
if (!Resolve(uid, ref flammable, ref appearance))

View file

@ -25,4 +25,5 @@ namespace Content.Server.Body.Components
[DataField]
public ProtoId<AlertPrototype> InternalsAlert = "Internals";
}
}

View file

@ -38,6 +38,7 @@ public sealed class InternalsSystem : EntitySystem
SubscribeLocalEvent<InternalsComponent, ComponentShutdown>(OnInternalsShutdown);
SubscribeLocalEvent<InternalsComponent, GetVerbsEvent<InteractionVerb>>(OnGetInteractionVerbs);
SubscribeLocalEvent<InternalsComponent, InternalsDoAfterEvent>(OnDoAfter);
SubscribeLocalEvent<InternalsComponent, ToggleInternalsAlertEvent>(OnToggleInternalsAlert);
SubscribeLocalEvent<InternalsComponent, StartingGearEquippedEvent>(OnStartingGear);
}
@ -161,6 +162,14 @@ public sealed class InternalsSystem : EntitySystem
args.Handled = true;
}
private void OnToggleInternalsAlert(Entity<InternalsComponent> ent, ref ToggleInternalsAlertEvent args)
{
if (args.Handled)
return;
ToggleInternals(ent, ent, false, internals: ent.Comp);
args.Handled = true;
}
private void OnInternalsStartup(Entity<InternalsComponent> ent, ref ComponentStartup args)
{
_alerts.ShowAlert(ent, ent.Comp.InternalsAlert, GetSeverity(ent));

View file

@ -28,6 +28,7 @@ namespace Content.Server.Chemistry.EntitySystems
[Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!;
[Dependency] private readonly ThrowingSystem _throwing = default!;
[Dependency] private readonly ReactiveSystem _reactive = default!;
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;
private const float ReactTime = 0.125f;
@ -69,7 +70,7 @@ namespace Content.Server.Chemistry.EntitySystems
_throwing.TryThrow(vapor, dir, speed, user: user);
var distance = (target.Position - vaporXform.WorldPosition).Length();
var distance = (target.Position - _transformSystem.GetWorldPosition(vaporXform)).Length();
var time = (distance / physics.LinearVelocity.Length());
despawn.Lifetime = MathF.Min(aliveTime, time);
}

View file

@ -1,4 +1,4 @@
using System.Diagnostics.CodeAnalysis;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using Robust.Server.Player;
using Robust.Shared.Console;
@ -55,13 +55,15 @@ namespace Content.Server.Commands
{
var entMan = IoCManager.Resolve<IEntityManager>();
var transform = entMan.GetComponent<TransformComponent>(ent);
var transformSystem = entMan.System<SharedTransformSystem>();
var worldPosition = transformSystem.GetWorldPosition(transform);
// gross, is there a better way to do this?
ruleString = ruleString.Replace("$ID", ent.ToString());
ruleString = ruleString.Replace("$WX",
transform.WorldPosition.X.ToString(CultureInfo.InvariantCulture));
worldPosition.X.ToString(CultureInfo.InvariantCulture));
ruleString = ruleString.Replace("$WY",
transform.WorldPosition.Y.ToString(CultureInfo.InvariantCulture));
worldPosition.Y.ToString(CultureInfo.InvariantCulture));
ruleString = ruleString.Replace("$LX",
transform.LocalPosition.X.ToString(CultureInfo.InvariantCulture));
ruleString = ruleString.Replace("$LY",
@ -73,12 +75,13 @@ namespace Content.Server.Commands
if (player.AttachedEntity is {Valid: true} p)
{
var pTransform = entMan.GetComponent<TransformComponent>(p);
var pWorldPosition = transformSystem.GetWorldPosition(pTransform);
ruleString = ruleString.Replace("$PID", ent.ToString());
ruleString = ruleString.Replace("$PWX",
pTransform.WorldPosition.X.ToString(CultureInfo.InvariantCulture));
pWorldPosition.X.ToString(CultureInfo.InvariantCulture));
ruleString = ruleString.Replace("$PWY",
pTransform.WorldPosition.Y.ToString(CultureInfo.InvariantCulture));
pWorldPosition.Y.ToString(CultureInfo.InvariantCulture));
ruleString = ruleString.Replace("$PLX",
pTransform.LocalPosition.X.ToString(CultureInfo.InvariantCulture));
ruleString = ruleString.Replace("$PLY",

View file

@ -6,6 +6,8 @@ namespace Content.Server.DeviceNetwork.Systems
[UsedImplicitly]
public sealed class WirelessNetworkSystem : EntitySystem
{
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;
public override void Initialize()
{
base.Initialize();
@ -25,7 +27,7 @@ namespace Content.Server.DeviceNetwork.Systems
return;
if (xform.MapID != args.SenderTransform.MapID
|| (ownPosition - xform.WorldPosition).Length() > sendingComponent.Range)
|| (ownPosition - _transformSystem.GetWorldPosition(xform)).Length() > sendingComponent.Range)
{
args.Cancel();
}

View file

@ -156,7 +156,7 @@ public sealed partial class DragonSystem : EntitySystem
}
// cant put a rift on solars
foreach (var tile in grid.GetTilesIntersecting(new Circle(xform.WorldPosition, RiftTileRadius), false))
foreach (var tile in grid.GetTilesIntersecting(new Circle(_transform.GetWorldPosition(xform), RiftTileRadius), false))
{
if (!tile.IsSpace(_tileDef))
continue;

View file

@ -28,6 +28,7 @@ public sealed partial class EnsnareableSystem
SubscribeLocalEvent<EnsnaringComponent, StepTriggeredOffEvent>(OnStepTrigger);
SubscribeLocalEvent<EnsnaringComponent, ThrowDoHitEvent>(OnThrowHit);
SubscribeLocalEvent<EnsnaringComponent, AttemptPacifiedThrowEvent>(OnAttemptPacifiedThrow);
SubscribeLocalEvent<EnsnareableComponent, RemoveEnsnareAlertEvent>(OnRemoveEnsnareAlert);
}
private void OnAttemptPacifiedThrow(Entity<EnsnaringComponent> ent, ref AttemptPacifiedThrowEvent args)
@ -35,6 +36,24 @@ public sealed partial class EnsnareableSystem
args.Cancel("pacified-cannot-throw-snare");
}
private void OnRemoveEnsnareAlert(Entity<EnsnareableComponent> ent, ref RemoveEnsnareAlertEvent args)
{
if (args.Handled)
return;
foreach (var ensnare in ent.Comp.Container.ContainedEntities)
{
if (!TryComp<EnsnaringComponent>(ensnare, out var ensnaringComponent))
return;
TryFree(ent, ent, ensnare, ensnaringComponent);
args.Handled = true;
// Only one snare at a time.
break;
}
}
private void OnComponentRemove(EntityUid uid, EnsnaringComponent component, ComponentRemove args)
{
if (!TryComp<EnsnareableComponent>(component.Ensnared, out var ensnared))

View file

@ -105,7 +105,7 @@ public sealed partial class ExplosionSystem : SharedExplosionSystem
var xforms = EntityManager.GetEntityQuery<TransformComponent>();
var xform = xforms.GetComponent(gridToTransform);
var (_, gridWorldRotation, gridWorldMatrix, invGridWorldMatrid) = xform.GetWorldPositionRotationMatrixWithInv(xforms);
var (_, gridWorldRotation, gridWorldMatrix, invGridWorldMatrid) = _transformSystem.GetWorldPositionRotationMatrixWithInv(xform, xforms);
var localEpicentre = (Vector2i) Vector2.Transform(epicentre.Position, invGridWorldMatrid);
var matrix = offsetMatrix * gridWorldMatrix * targetMatrix;

View file

@ -406,7 +406,7 @@ public sealed partial class ExplosionSystem : SharedExplosionSystem
if (player.AttachedEntity is not EntityUid uid)
continue;
var playerPos = Transform(player.AttachedEntity!.Value).WorldPosition;
var playerPos = _transformSystem.GetWorldPosition(player.AttachedEntity!.Value);
var delta = epicenter.Position - playerPos;
if (delta.EqualsApprox(Vector2.Zero))

View file

@ -201,7 +201,7 @@ namespace Content.Server.Hands.Systems
throwEnt = splitStack.Value;
}
var direction = coordinates.ToMapPos(EntityManager, _transformSystem) - Transform(player).WorldPosition;
var direction = _transformSystem.ToMapCoordinates(coordinates).Position - _transformSystem.GetWorldPosition(player);
if (direction == Vector2.Zero)
return true;

View file

@ -12,6 +12,7 @@ public sealed class GridDraggingSystem : SharedGridDraggingSystem
{
[Dependency] private readonly IConGroupController _admin = default!;
[Dependency] private readonly SharedPhysicsSystem _physics = default!;
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;
private readonly HashSet<ICommonSession> _draggers = new();
@ -76,8 +77,6 @@ public sealed class GridDraggingSystem : SharedGridDraggingSystem
return;
}
var gridXform = Transform(grid);
gridXform.WorldPosition = msg.WorldPosition;
_transformSystem.SetWorldPosition(grid, msg.WorldPosition);
}
}

View file

@ -1,4 +1,4 @@
using System.Linq;
using System.Linq;
using Content.Server.Interaction;
using Content.Server.Mech.Equipment.Components;
using Content.Server.Mech.Systems;
@ -85,7 +85,7 @@ public sealed class MechGrabberSystem : EntitySystem
var (mechPos, mechRot) = _transform.GetWorldPositionRotation(mechxform);
var offset = mechPos + mechRot.RotateVec(component.DepositOffset);
_transform.SetWorldPositionRotation(xform, offset, Angle.Zero);
_transform.SetWorldPositionRotation(toRemove, offset, Angle.Zero);
_mech.UpdateUserInterface(mech);
}

View file

@ -39,7 +39,7 @@ public sealed class StressTestMovementSystem : EntitySystem
var x = MathF.Sin(stressTest.Progress * MathHelper.TwoPi);
var y = MathF.Cos(stressTest.Progress * MathHelper.TwoPi);
_transform.SetWorldPosition(transform, stressTest.Origin + new Vector2(x, y) * 5);
_transform.SetWorldPosition((uid, transform), stressTest.Origin + new Vector2(x, y) * 5);
}
}
}

View file

@ -12,6 +12,7 @@ namespace Content.Server.Pointing.EntitySystems
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly ExplosionSystem _explosion = default!;
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;
private EntityUid? RandomNearbyPlayer(EntityUid uid, RoguePointingArrowComponent? component = null, TransformComponent? transform = null)
{
@ -66,27 +67,28 @@ namespace Content.Server.Pointing.EntitySystems
}
component.TurningDelay -= frameTime;
var (transformPos, transformRot) = _transformSystem.GetWorldPositionRotation(transform);
if (component.TurningDelay > 0)
{
var difference = Comp<TransformComponent>(chasing).WorldPosition - transform.WorldPosition;
var difference = _transformSystem.GetWorldPosition(chasing) - transformPos;
var angle = difference.ToAngle();
var adjusted = angle.Degrees + 90;
var newAngle = Angle.FromDegrees(adjusted);
transform.WorldRotation = newAngle;
_transformSystem.SetWorldRotation(transform, newAngle);
UpdateAppearance(uid, component, transform);
continue;
}
transform.WorldRotation += Angle.FromDegrees(20);
_transformSystem.SetWorldRotation(transform, transformRot + Angle.FromDegrees(20));
UpdateAppearance(uid, component, transform);
var toChased = Comp<TransformComponent>(chasing).WorldPosition - transform.WorldPosition;
var toChased = _transformSystem.GetWorldPosition(chasing) - transformPos;
transform.WorldPosition += toChased * frameTime * component.ChasingSpeed;
_transformSystem.SetWorldPosition((uid, transform), transformPos + (toChased * frameTime * component.ChasingSpeed));
component.ChasingTime -= frameTime;

View file

@ -1,4 +1,4 @@
using Content.Server.Administration.Logs;
using Content.Server.Administration.Logs;
using Content.Server.Atmos.EntitySystems;
using Content.Server.Chat.Managers;
using Content.Server.GameTicking;
@ -157,7 +157,7 @@ public sealed class SpecialRespawnSystem : SharedSpecialRespawnSystem
var tile = tileRef.GridIndices;
var found = false;
var (gridPos, _, gridMatrix) = xform.GetWorldPositionRotationMatrix();
var (gridPos, _, gridMatrix) = _transform.GetWorldPositionRotationMatrix(xform);
var gridBounds = gridMatrix.TransformBox(grid.LocalAABB);
//Obviously don't put anything ridiculous in here

View file

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

View file

@ -71,6 +71,7 @@ public sealed partial class ShuttleConsoleSystem : SharedShuttleConsoleSystem
SubscribeLocalEvent<UndockEvent>(OnUndock);
SubscribeLocalEvent<PilotComponent, ComponentGetState>(OnGetState);
SubscribeLocalEvent<PilotComponent, StopPilotingAlertEvent>(OnStopPilotingAlert);
SubscribeLocalEvent<FTLDestinationComponent, ComponentStartup>(OnFtlDestStartup);
SubscribeLocalEvent<FTLDestinationComponent, ComponentShutdown>(OnFtlDestShutdown);
@ -196,6 +197,14 @@ public sealed partial class ShuttleConsoleSystem : SharedShuttleConsoleSystem
args.State = new PilotComponentState(GetNetEntity(component.Console));
}
private void OnStopPilotingAlert(Entity<PilotComponent> ent, ref StopPilotingAlertEvent args)
{
if (ent.Comp.Console != null)
{
RemovePilot(ent, ent);
}
}
/// <summary>
/// Returns the position and angle of all dockingcomponents.
/// </summary>

View file

@ -22,6 +22,7 @@ public sealed class ContainmentFieldGeneratorSystem : EntitySystem
[Dependency] private readonly PhysicsSystem _physics = default!;
[Dependency] private readonly PopupSystem _popupSystem = default!;
[Dependency] private readonly SharedPointLightSystem _light = default!;
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;
[Dependency] private readonly TagSystem _tags = default!;
public override void Initialize()
@ -116,7 +117,7 @@ public sealed class ContainmentFieldGeneratorSystem : EntitySystem
private void OnUnanchorAttempt(EntityUid uid, ContainmentFieldGeneratorComponent component,
UnanchorAttemptEvent args)
{
if (component.Enabled)
if (component.Enabled || component.IsConnected)
{
_popupSystem.PopupEntity(Loc.GetString("comp-containment-anchor-warning"), args.User, args.User, PopupType.LargeCaution);
args.Cancel();
@ -234,7 +235,7 @@ public sealed class ContainmentFieldGeneratorSystem : EntitySystem
if (!gen1XForm.Anchored)
return false;
var genWorldPosRot = gen1XForm.GetWorldPositionRotation();
var genWorldPosRot = _transformSystem.GetWorldPositionRotation(gen1XForm);
var dirRad = dir.ToAngle() + genWorldPosRot.WorldRotation; //needs to be like this for the raycast to work properly
var ray = new CollisionRay(genWorldPosRot.WorldPosition, dirRad.ToVec(), component.CollisionMask);

View file

@ -1,4 +1,4 @@
using Content.Server.Popups;
using Content.Server.Popups;
using Content.Server.Shuttles.Components;
using Content.Server.Singularity.Events;
using Content.Shared.Popups;
@ -13,6 +13,7 @@ public sealed class ContainmentFieldSystem : EntitySystem
{
[Dependency] private readonly ThrowingSystem _throwing = default!;
[Dependency] private readonly PopupSystem _popupSystem = default!;
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;
public override void Initialize()
{
@ -34,8 +35,8 @@ public sealed class ContainmentFieldSystem : EntitySystem
if (TryComp<PhysicsComponent>(otherBody, out var physics) && physics.Mass <= component.MaxMass && physics.Hard)
{
var fieldDir = Transform(uid).WorldPosition;
var playerDir = Transform(otherBody).WorldPosition;
var fieldDir = _transformSystem.GetWorldPosition(uid);
var playerDir = _transformSystem.GetWorldPosition(otherBody);
_throwing.TryThrow(otherBody, playerDir-fieldDir, baseThrowSpeed: component.ThrowForce);
}

View file

@ -137,13 +137,22 @@ public sealed class RadiationCollectorSystem : EntitySystem
private void OnExamined(EntityUid uid, RadiationCollectorComponent component, ExaminedEvent args)
{
if (!TryGetLoadedGasTank(uid, out var gasTank))
using (args.PushGroup(nameof(RadiationCollectorComponent)))
{
args.PushMarkup(Loc.GetString("power-radiation-collector-gas-tank-missing"));
return;
}
args.PushMarkup(Loc.GetString("power-radiation-collector-enabled", ("state", component.Enabled)));
args.PushMarkup(Loc.GetString("power-radiation-collector-gas-tank-present"));
if (!TryGetLoadedGasTank(uid, out var gasTank))
{
args.PushMarkup(Loc.GetString("power-radiation-collector-gas-tank-missing"));
}
else
{
_appearance.TryGetData<int>(uid, RadiationCollectorVisuals.PressureState, out var state);
args.PushMarkup(Loc.GetString("power-radiation-collector-gas-tank-present",
("fullness", state)));
}
}
}
private void OnAnalyzed(EntityUid uid, RadiationCollectorComponent component, GasAnalyzerScanEvent args)

View file

@ -18,6 +18,7 @@ namespace Content.Server.Solar.EntitySystems
{
[Dependency] private readonly IRobustRandom _robustRandom = default!;
[Dependency] private readonly SharedPhysicsSystem _physicsSystem = default!;
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;
/// <summary>
/// Maximum panel angular velocity range - used to stop people rotating panels fast enough that the lag prevention becomes noticable
@ -112,7 +113,7 @@ namespace Content.Server.Solar.EntitySystems
while (query.MoveNext(out var uid, out var panel, out var xform))
{
TotalPanelPower += panel.MaxSupply * panel.Coverage;
xform.WorldRotation = TargetPanelRotation;
_transformSystem.SetWorldRotation(xform, TargetPanelRotation);
_updateQueue.Enqueue((uid, panel));
}
}
@ -135,7 +136,7 @@ namespace Content.Server.Solar.EntitySystems
// directly downwards (abs(theta) = pi) = coverage -1
// as TowardsSun + = CCW,
// panelRelativeToSun should - = CW
var panelRelativeToSun = xform.WorldRotation - TowardsSun;
var panelRelativeToSun = _transformSystem.GetWorldRotation(xform) - TowardsSun;
// essentially, given cos = X & sin = Y & Y is 'downwards',
// then for the first 90 degrees of rotation in either direction,
// this plots the lower-right quadrant of a circle.
@ -153,7 +154,7 @@ namespace Content.Server.Solar.EntitySystems
if (coverage > 0)
{
// Determine if the solar panel is occluded, and zero out coverage if so.
var ray = new CollisionRay(xform.WorldPosition, TowardsSun.ToWorldVec(), (int) CollisionGroup.Opaque);
var ray = new CollisionRay(_transformSystem.GetWorldPosition(xform), TowardsSun.ToWorldVec(), (int) CollisionGroup.Opaque);
var rayCastResults = _physicsSystem.IntersectRayWithPredicate(
xform.MapID,
ray,

View file

@ -1,4 +1,4 @@
using System.Numerics;
using System.Numerics;
using Content.Server.Worldgen.Components;
using JetBrains.Annotations;
@ -12,6 +12,7 @@ namespace Content.Server.Worldgen.Systems;
public abstract class BaseWorldSystem : EntitySystem
{
[Dependency] private readonly WorldControllerSystem _worldController = default!;
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;
/// <summary>
/// Gets a chunk's coordinates in chunk space as an integer value.
@ -25,7 +26,7 @@ public abstract class BaseWorldSystem : EntitySystem
if (!Resolve(ent, ref xform))
throw new Exception("Failed to resolve transform, somehow.");
return WorldGen.WorldToChunkCoords(xform.WorldPosition).Floored();
return WorldGen.WorldToChunkCoords(_transformSystem.GetWorldPosition(xform)).Floored();
}
/// <summary>
@ -40,7 +41,7 @@ public abstract class BaseWorldSystem : EntitySystem
if (!Resolve(ent, ref xform))
throw new Exception("Failed to resolve transform, somehow.");
return WorldGen.WorldToChunkCoords(xform.WorldPosition);
return WorldGen.WorldToChunkCoords(_transformSystem.GetWorldPosition(xform));
}
/// <summary>

View file

@ -1,4 +1,4 @@
using System.Numerics;
using System.Numerics;
using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components;
using Content.Server.Xenoarchaeology.XenoArtifacts.Events;
using Content.Shared.Maps;
@ -31,7 +31,7 @@ public sealed class ThrowArtifactSystem : EntitySystem
if (TryComp<MapGridComponent>(xform.GridUid, out var grid))
{
var tiles = grid.GetTilesIntersecting(
Box2.CenteredAround(xform.WorldPosition, new Vector2(component.Range * 2, component.Range)));
Box2.CenteredAround(_transform.GetWorldPosition(xform), new Vector2(component.Range * 2, component.Range)));
foreach (var tile in tiles)
{

View file

@ -110,4 +110,9 @@ public enum LogType
/// A player did an item-use interaction of an item they were holding onto another object.
/// </summary>
InteractUsing = 92,
/// <summary>
/// Storage & entity-storage related interactions
/// </summary>
Storage = 93,
}

View file

@ -0,0 +1,7 @@
using Content.Shared.Alert;
namespace Content.Shared.Abilities.Mime;
public sealed partial class BreakVowAlertEvent : BaseAlertEvent;
public sealed partial class RetakeVowAlertEvent : BaseAlertEvent;

View file

@ -76,11 +76,11 @@ public sealed partial class AlertPrototype : IPrototype
public bool SupportsSeverity => MaxSeverity != -1;
/// <summary>
/// Defines what to do when the alert is clicked.
/// This will always be null on clientside.
/// Event raised on the user when they click on this alert.
/// Can be null.
/// </summary>
[DataField(serverOnly: true)]
public IAlertClick? OnClick { get; private set; }
[DataField]
public BaseAlertEvent? ClickEvent;
/// <param name="severity">severity level, if supported by this alert</param>
/// <returns>the icon path to the texture for the provided severity level</returns>
@ -114,3 +114,17 @@ public sealed partial class AlertPrototype : IPrototype
return Icons[severity.Value - _minSeverity];
}
}
[ImplicitDataDefinitionForInheritors]
public abstract partial class BaseAlertEvent : HandledEntityEventArgs
{
public EntityUid User;
public ProtoId<AlertPrototype> AlertId;
protected BaseAlertEvent(EntityUid user, ProtoId<AlertPrototype> alertId)
{
User = user;
AlertId = alertId;
}
}

View file

@ -195,7 +195,7 @@ public abstract class AlertsSystem : EntitySystem
SubscribeLocalEvent<AlertAutoRemoveComponent, EntityUnpausedEvent>(OnAutoRemoveUnPaused);
SubscribeNetworkEvent<ClickAlertEvent>(HandleClickAlert);
SubscribeAllEvent<ClickAlertEvent>(HandleClickAlert);
SubscribeLocalEvent<PrototypesReloadedEventArgs>(HandlePrototypesReloaded);
LoadPrototypes();
}
@ -328,7 +328,20 @@ public abstract class AlertsSystem : EntitySystem
return;
}
alert.OnClick?.AlertClicked(player.Value);
ActivateAlert(player.Value, alert);
}
public bool ActivateAlert(EntityUid user, AlertPrototype alert)
{
if (alert.ClickEvent is not { } clickEvent)
return false;
clickEvent.Handled = false;
clickEvent.User = user;
clickEvent.AlertId = alert.ID;
RaiseLocalEvent(user, (object) clickEvent, true);
return clickEvent.Handled;
}
private void OnPlayerAttached(EntityUid uid, AlertsComponent component, PlayerAttachedEvent args)

View file

@ -1,14 +0,0 @@
namespace Content.Shared.Alert
{
/// <summary>
/// Defines what should happen when an alert is clicked.
/// </summary>
public interface IAlertClick
{
/// <summary>
/// Invoked on server side when user clicks an alert.
/// </summary>
/// <param name="player"></param>
void AlertClicked(EntityUid player);
}
}

View file

@ -1,3 +1,4 @@
using Content.Shared.Alert;
using Robust.Shared.Audio;
namespace Content.Shared.Atmos.Components;
@ -27,3 +28,5 @@ public sealed partial class ExtinguishOnInteractComponent : Component
[DataField]
public LocId ExtinguishFailed = "candle-extinguish-failed";
}
public sealed partial class ResistFireAlertEvent : BaseAlertEvent;

View file

@ -0,0 +1,10 @@
using Robust.Shared.GameStates;
namespace Content.Shared.Bed.Cryostorage;
/// <summary>
/// Serves as a whitelist that allows an entity with this component to enter cryostorage.
/// It will also require MindContainerComponent.
/// </summary>
[RegisterComponent, NetworkedComponent]
public sealed partial class CanEnterCryostorageComponent : Component { }

View file

@ -89,7 +89,7 @@ public abstract class SharedCryostorageSystem : EntitySystem
return;
}
if (!TryComp<MindContainerComponent>(args.EntityUid, out var mindContainer))
if (!HasComp<CanEnterCryostorageComponent>(args.EntityUid) || !TryComp<MindContainerComponent>(args.EntityUid, out var mindContainer))
{
args.Cancel();
return;

View file

@ -1,4 +1,5 @@
using System.Diagnostics.CodeAnalysis;
using Content.Shared.Alert;
using Content.Shared.Interaction;
using Robust.Shared.GameStates;
using Robust.Shared.Serialization;
@ -79,6 +80,7 @@ public sealed class BuckleState(NetEntity? buckledTo, bool dontCollide, TimeSpan
public readonly TimeSpan? BuckleTime = buckleTime;
}
public sealed partial class UnbuckleAlertEvent : BaseAlertEvent;
/// <summary>
/// Event raised directed at a strap entity before some entity gets buckled to it.

View file

@ -41,6 +41,7 @@ public abstract partial class SharedBuckleSystem
SubscribeLocalEvent<BuckleComponent, StartPullAttemptEvent>(OnPullAttempt);
SubscribeLocalEvent<BuckleComponent, BeingPulledAttemptEvent>(OnBeingPulledAttempt);
SubscribeLocalEvent<BuckleComponent, PullStartedMessage>(OnPullStarted);
SubscribeLocalEvent<BuckleComponent, UnbuckleAlertEvent>(OnUnbuckleAlert);
SubscribeLocalEvent<BuckleComponent, InsertIntoEntityStorageAttemptEvent>(OnBuckleInsertIntoEntityStorageAttempt);
@ -86,6 +87,13 @@ public abstract partial class SharedBuckleSystem
Unbuckle(ent!, args.PullerUid);
}
private void OnUnbuckleAlert(Entity<BuckleComponent> ent, ref UnbuckleAlertEvent args)
{
if (args.Handled)
return;
args.Handled = TryUnbuckle(ent, ent, ent);
}
#endregion
#region Transform

View file

@ -29,7 +29,7 @@ public sealed partial class SolutionTransferComponent : Component
/// </summary>
[DataField("maxTransferAmount")]
[ViewVariables(VVAccess.ReadWrite)]
public FixedPoint2 MaximumTransferAmount { get; set; } = FixedPoint2.New(50);
public FixedPoint2 MaximumTransferAmount { get; set; } = FixedPoint2.New(100);
/// <summary>
/// Can this entity take reagent from reagent tanks?

View file

@ -9,10 +9,8 @@ namespace Content.Shared.Clothing.Components;
public sealed partial class LoadoutComponent : Component
{
/// <summary>
/// A list of starting gears, of which one will be given.
/// A list of starting gears, of which one will be given, before RoleLoadouts are equipped.
/// All elements are weighted the same in the list.
///
/// If not specified, <see cref="RoleLoadout"/> will be used instead.
/// </summary>
[DataField("prototypes")]
[AutoNetworkedField]
@ -21,8 +19,6 @@ public sealed partial class LoadoutComponent : Component
/// <summary>
/// A list of role loadouts, of which one will be given.
/// All elements are weighted the same in the list.
///
/// If not specified, <see cref="StartingGear"/> will be used instead.
/// </summary>
[DataField]
[AutoNetworkedField]

View file

@ -139,23 +139,38 @@ public sealed class LoadoutSystem : EntitySystem
private void OnMapInit(EntityUid uid, LoadoutComponent component, MapInitEvent args)
{
// Use starting gear if specified
if (component.StartingGear != null)
Equip(uid, component.StartingGear, component.RoleLoadout);
}
public void Equip(EntityUid uid, List<ProtoId<StartingGearPrototype>>? startingGear,
List<ProtoId<RoleLoadoutPrototype>>? loadoutGroups)
{
// First, randomly pick a startingGear profile from those specified, and equip it.
if (startingGear != null && startingGear.Count > 0)
_station.EquipStartingGear(uid, _random.Pick(startingGear));
if (loadoutGroups == null)
{
_station.EquipStartingGear(uid, _random.Pick(component.StartingGear));
GearEquipped(uid);
return;
}
if (component.RoleLoadout == null)
return;
// ...otherwise equip from role loadout
var id = _random.Pick(component.RoleLoadout);
// Then, randomly pick a RoleLoadout profile from those specified, and process/equip all LoadoutGroups from it.
// For non-roundstart mobs there is no SelectedLoadout data, so minValue must be set in each LoadoutGroup to force selection.
var id = _random.Pick(loadoutGroups);
var proto = _protoMan.Index(id);
var loadout = new RoleLoadout(id);
// Sunrise-Fix: Я пока-что в душе не ебу как здесь достать спонсорские прототипы, потому []
loadout.SetDefault(GetProfile(uid), _actors.GetSession(uid), _protoMan, [], true);
_station.EquipRoleLoadout(uid, loadout, proto);
GearEquipped(uid);
}
public void GearEquipped(EntityUid uid)
{
var ev = new StartingGearEquippedEvent(uid);
RaiseLocalEvent(uid, ref ev);
}
public HumanoidCharacterProfile GetProfile(EntityUid? uid)

View file

@ -20,13 +20,13 @@ namespace Content.Shared.Construction.Conditions
// get blueprint and user position
var transformSystem = entManager.System<SharedTransformSystem>();
var userWorldPosition = entManager.GetComponent<TransformComponent>(user).WorldPosition;
var userWorldPosition = transformSystem.GetWorldPosition(user);
var objWorldPosition = location.ToMap(entManager, transformSystem).Position;
// find direction from user to blueprint
var userToObject = (objWorldPosition - userWorldPosition);
// get direction of the grid being placed on as an offset.
var gridRotation = entManager.GetComponent<TransformComponent>(location.EntityId).WorldRotation;
var gridRotation = transformSystem.GetWorldRotation(location.EntityId);
var directionWithOffset = gridRotation.RotateVec(direction.ToVec());
// dot product will be positive if user direction and blueprint are co-directed

View file

@ -46,6 +46,8 @@ public sealed partial class CuffableComponent : Component
public ProtoId<AlertPrototype> CuffedAlert = "Handcuffed";
}
public sealed partial class RemoveCuffsAlertEvent : BaseAlertEvent;
[Serializable, NetSerializable]
public sealed class CuffableComponentState : ComponentState
{

View file

@ -66,6 +66,7 @@ namespace Content.Shared.Cuffs
SubscribeLocalEvent<CuffableComponent, RejuvenateEvent>(OnRejuvenate);
SubscribeLocalEvent<CuffableComponent, ComponentInit>(OnStartup);
SubscribeLocalEvent<CuffableComponent, AttemptStopPullingEvent>(HandleStopPull);
SubscribeLocalEvent<CuffableComponent, RemoveCuffsAlertEvent>(OnRemoveCuffsAlert);
SubscribeLocalEvent<CuffableComponent, UpdateCanMoveEvent>(HandleMoveAttempt);
SubscribeLocalEvent<CuffableComponent, IsEquippingAttemptEvent>(OnEquipAttempt);
SubscribeLocalEvent<CuffableComponent, IsUnequippingAttemptEvent>(OnUnequipAttempt);
@ -248,6 +249,14 @@ namespace Content.Shared.Cuffs
args.Cancelled = true;
}
private void OnRemoveCuffsAlert(Entity<CuffableComponent> ent, ref RemoveCuffsAlertEvent args)
{
if (args.Handled)
return;
TryUncuff(ent, ent, cuffable: ent.Comp);
args.Handled = true;
}
private void AddUncuffVerb(EntityUid uid, CuffableComponent component, GetVerbsEvent<Verb> args)
{
// Can the user access the cuffs, and is there even anything to uncuff?

View file

@ -47,6 +47,8 @@ public sealed partial class EnsnareableComponent : Component
public ProtoId<AlertPrototype> EnsnaredAlert = "Ensnared";
}
public sealed partial class RemoveEnsnareAlertEvent : BaseAlertEvent;
[Serializable, NetSerializable]
public sealed class EnsnareableComponentState : ComponentState
{

View file

@ -1,3 +1,4 @@
using Content.Shared.DragDrop;
using Content.Shared.Hands.Components;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.Interaction;
@ -14,6 +15,38 @@ public sealed class DeployFoldableSystem : EntitySystem
base.Initialize();
SubscribeLocalEvent<DeployFoldableComponent, AfterInteractEvent>(OnAfterInteract);
SubscribeLocalEvent<DeployFoldableComponent, CanDragEvent>(OnCanDrag);
SubscribeLocalEvent<DeployFoldableComponent, DragDropDraggedEvent>(OnDragDropDragged);
SubscribeLocalEvent<DeployFoldableComponent, CanDropDraggedEvent>(OnCanDropDragged);
}
private void OnCanDropDragged(Entity<DeployFoldableComponent> ent, ref CanDropDraggedEvent args)
{
if (args.User != args.Target)
return;
args.Handled = true;
args.CanDrop = true;
}
private void OnDragDropDragged(Entity<DeployFoldableComponent> ent, ref DragDropDraggedEvent args)
{
if (!TryComp<FoldableComponent>(ent, out var foldable)
|| !_foldable.TrySetFolded(ent, foldable, true))
return;
_hands.PickupOrDrop(args.User, ent.Owner);
args.Handled = true;
}
private void OnCanDrag(Entity<DeployFoldableComponent> ent, ref CanDragEvent args)
{
if (!TryComp<FoldableComponent>(ent, out var foldable)
|| foldable.IsFolded)
return;
args.Handled = true;
}
private void OnAfterInteract(Entity<DeployFoldableComponent> ent, ref AfterInteractEvent args)

View file

@ -1,4 +1,5 @@
using Content.Shared.DoAfter;
using Content.Shared.Alert;
using Content.Shared.DoAfter;
using Robust.Shared.Serialization;
namespace Content.Shared.Internals;
@ -7,3 +8,5 @@ namespace Content.Shared.Internals;
public sealed partial class InternalsDoAfterEvent : SimpleDoAfterEvent
{
}
public sealed partial class ToggleInternalsAlertEvent : BaseAlertEvent;

View file

@ -42,3 +42,5 @@ public sealed partial class PullableComponent : Component
[DataField]
public ProtoId<AlertPrototype> PulledAlert = "Pulled";
}
public sealed partial class StopBeingPulledAlertEvent : BaseAlertEvent;

View file

@ -44,3 +44,5 @@ public sealed partial class PullerComponent : Component
[DataField]
public ProtoId<AlertPrototype> PullingAlert = "Pulling";
}
public sealed partial class StopPullingAlertEvent : BaseAlertEvent;

View file

@ -58,6 +58,7 @@ public sealed class PullingSystem : EntitySystem
SubscribeLocalEvent<PullableComponent, GetVerbsEvent<Verb>>(AddPullVerbs);
SubscribeLocalEvent<PullableComponent, EntGotInsertedIntoContainerMessage>(OnPullableContainerInsert);
SubscribeLocalEvent<PullableComponent, ModifyUncuffDurationEvent>(OnModifyUncuffDuration);
SubscribeLocalEvent<PullableComponent, StopBeingPulledAlertEvent>(OnStopBeingPulledAlert);
SubscribeLocalEvent<PullerComponent, AfterAutoHandleStateEvent>(OnAfterState);
SubscribeLocalEvent<PullerComponent, EntGotInsertedIntoContainerMessage>(OnPullerContainerInsert);
@ -65,6 +66,7 @@ public sealed class PullingSystem : EntitySystem
SubscribeLocalEvent<PullerComponent, VirtualItemDeletedEvent>(OnVirtualItemDeleted);
SubscribeLocalEvent<PullerComponent, RefreshMovementSpeedModifiersEvent>(OnRefreshMovespeed);
SubscribeLocalEvent<PullerComponent, DropHandItemsEvent>(OnDropHandItems);
SubscribeLocalEvent<PullerComponent, StopPullingAlertEvent>(OnStopPullingAlert);
SubscribeLocalEvent<PullableComponent, StrappedEvent>(OnBuckled);
SubscribeLocalEvent<PullableComponent, BuckledEvent>(OnGotBuckled);
@ -105,6 +107,15 @@ public sealed class PullingSystem : EntitySystem
TryStopPull(pullerComp.Pulling.Value, pullableComp, uid);
}
private void OnStopPullingAlert(Entity<PullerComponent> ent, ref StopPullingAlertEvent args)
{
if (args.Handled)
return;
if (!TryComp<PullableComponent>(ent.Comp.Pulling, out var pullable))
return;
args.Handled = TryStopPull(ent.Comp.Pulling.Value, pullable, ent);
}
private void OnPullerContainerInsert(Entity<PullerComponent> ent, ref EntGotInsertedIntoContainerMessage args)
{
if (ent.Comp.Pulling == null)
@ -133,6 +144,14 @@ public sealed class PullingSystem : EntitySystem
args.Duration *= 2;
}
private void OnStopBeingPulledAlert(Entity<PullableComponent> ent, ref StopBeingPulledAlertEvent args)
{
if (args.Handled)
return;
args.Handled = TryStopPull(ent, ent, ent);
}
public override void Shutdown()
{
base.Shutdown();
@ -491,6 +510,9 @@ public sealed class PullingSystem : EntitySystem
if (pullerUidNull == null)
return true;
if (user != null && !_blocker.CanInteract(user.Value, pullableUid))
return false;
var msg = new AttemptStopPullingEvent(user);
RaiseLocalEvent(pullableUid, msg, true);

View file

@ -125,6 +125,8 @@ public abstract class SharedJetpackSystem : EntitySystem
private bool CanEnableOnGrid(EntityUid? gridUid)
{
// No and no again! Do not attempt to activate the jetpack on a grid with gravity disabled. You will not be the first or the last to try this.
// https://discord.com/channels/310555209753690112/310555209753690112/1270067921682694234
return gridUid == null ||
(!HasComp<GravityComponent>(gridUid));
}

View file

@ -39,4 +39,6 @@ namespace Content.Shared.Shuttles.Components
public override bool SendOnlyToOwner => true;
}
public sealed partial class StopPilotingAlertEvent : BaseAlertEvent;
}

View file

@ -2,7 +2,9 @@ using System.Collections.Frozen;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Content.Shared.ActionBlocker;
using Content.Shared.Administration.Logs;
using Content.Shared.Containers.ItemSlots;
using Content.Shared.Database;
using Content.Shared.Destructible;
using Content.Shared.DoAfter;
using Content.Shared.Hands.Components;
@ -57,6 +59,7 @@ public abstract class SharedStorageSystem : EntitySystem
[Dependency] private readonly SharedUserInterfaceSystem _ui = default!;
[Dependency] protected readonly UseDelaySystem UseDelay = default!;
[Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!;
[Dependency] private readonly ISharedAdminLogManager _adminLog = default!;
private EntityQuery<ItemComponent> _itemQuery;
private EntityQuery<StackComponent> _stackQuery;
@ -577,151 +580,79 @@ public abstract class SharedStorageSystem : EntitySystem
/// </summary>
private void OnInteractWithItem(StorageInteractWithItemEvent msg, EntitySessionEventArgs args)
{
if (args.SenderSession.AttachedEntity is not { } player)
return;
var uid = GetEntity(msg.StorageUid);
var entity = GetEntity(msg.InteractedItemUid);
if (!TryComp<StorageComponent>(uid, out var storageComp))
return;
if (!_ui.IsUiOpen(uid, StorageComponent.StorageUiKey.Key, player))
return;
if (!Exists(entity))
{
Log.Error($"Player {args.SenderSession} interacted with non-existent item {msg.InteractedItemUid} stored in {ToPrettyString(uid)}");
return;
}
if (!ActionBlocker.CanInteract(player, entity) || !storageComp.Container.Contains(entity))
return;
// Does the player have hands?
if (!TryComp(player, out HandsComponent? hands) || hands.Count == 0)
if (!ValidateInput(args, msg.StorageUid, msg.InteractedItemUid, out var player, out var storage, out var item))
return;
// If the user's active hand is empty, try pick up the item.
if (hands.ActiveHandEntity == null)
if (player.Comp.ActiveHandEntity == null)
{
if (_sharedHandsSystem.TryPickupAnyHand(player, entity, handsComp: hands)
&& storageComp.StorageRemoveSound != null)
Audio.PlayPredicted(storageComp.StorageRemoveSound, uid, player, _audioParams);
_adminLog.Add(
LogType.Storage,
LogImpact.Low,
$"{ToPrettyString(player):player} is attempting to take {ToPrettyString(item):item} out of {ToPrettyString(storage):storage}");
if (_sharedHandsSystem.TryPickupAnyHand(player, item, handsComp: player.Comp)
&& storage.Comp.StorageRemoveSound != null)
{
return;
Audio.PlayPredicted(storage.Comp.StorageRemoveSound, storage, player, _audioParams);
}
return;
}
_adminLog.Add(
LogType.Storage,
LogImpact.Low,
$"{ToPrettyString(player):player} is interacting with {ToPrettyString(item):item} while it is stored in {ToPrettyString(storage):storage} using {ToPrettyString(player.Comp.ActiveHandEntity):used}");
// Else, interact using the held item
_interactionSystem.InteractUsing(player, hands.ActiveHandEntity.Value, entity, Transform(entity).Coordinates, checkCanInteract: false);
_interactionSystem.InteractUsing(player, player.Comp.ActiveHandEntity.Value, item, Transform(item).Coordinates, checkCanInteract: false);
}
private void OnSetItemLocation(StorageSetItemLocationEvent msg, EntitySessionEventArgs args)
{
if (args.SenderSession.AttachedEntity is not { } player)
if (!ValidateInput(args, msg.StorageEnt, msg.ItemEnt, out var player, out var storage, out var item))
return;
var storageEnt = GetEntity(msg.StorageEnt);
var itemEnt = GetEntity(msg.ItemEnt);
_adminLog.Add(
LogType.Storage,
LogImpact.Low,
$"{ToPrettyString(player):player} is updating the location of {ToPrettyString(item):item} within {ToPrettyString(storage):storage}");
if (!TryComp<StorageComponent>(storageEnt, out var storageComp))
return;
if (!_ui.IsUiOpen(storageEnt, StorageComponent.StorageUiKey.Key, player))
return;
if (!Exists(itemEnt))
{
Log.Error($"Player {args.SenderSession} set location of non-existent item {msg.ItemEnt} stored in {ToPrettyString(storageEnt)}");
return;
}
if (!ActionBlocker.CanInteract(player, itemEnt))
return;
TrySetItemStorageLocation((itemEnt, null), (storageEnt, storageComp), msg.Location);
TrySetItemStorageLocation(item!, storage!, msg.Location);
}
private void OnRemoveItem(StorageRemoveItemEvent msg, EntitySessionEventArgs args)
{
if (args.SenderSession.AttachedEntity is not { } player)
if (!ValidateInput(args, msg.StorageEnt, msg.ItemEnt, out var player, out var storage, out var item))
return;
var storageEnt = GetEntity(msg.StorageEnt);
var itemEnt = GetEntity(msg.ItemEnt);
if (!TryComp<StorageComponent>(storageEnt, out var storageComp))
return;
if (!_ui.IsUiOpen(storageEnt, StorageComponent.StorageUiKey.Key, player))
return;
if (!Exists(itemEnt))
{
Log.Error($"Player {args.SenderSession} set location of non-existent item {msg.ItemEnt} stored in {ToPrettyString(storageEnt)}");
return;
}
if (!ActionBlocker.CanInteract(player, itemEnt))
return;
TransformSystem.DropNextTo(itemEnt, player);
Audio.PlayPredicted(storageComp.StorageRemoveSound, storageEnt, player, _audioParams);
_adminLog.Add(
LogType.Storage,
LogImpact.Low,
$"{ToPrettyString(player):player} is removing {ToPrettyString(item):item} from {ToPrettyString(storage):storage}");
TransformSystem.DropNextTo(item.Owner, player.Owner);
Audio.PlayPredicted(storage.Comp.StorageRemoveSound, storage, player, _audioParams);
}
private void OnInsertItemIntoLocation(StorageInsertItemIntoLocationEvent msg, EntitySessionEventArgs args)
{
if (args.SenderSession.AttachedEntity is not { } player)
if (!ValidateInput(args, msg.StorageEnt, msg.ItemEnt, out var player, out var storage, out var item, held: true))
return;
var storageEnt = GetEntity(msg.StorageEnt);
var itemEnt = GetEntity(msg.ItemEnt);
if (!TryComp<StorageComponent>(storageEnt, out var storageComp))
return;
if (!_ui.IsUiOpen(storageEnt, StorageComponent.StorageUiKey.Key, player))
return;
if (!Exists(itemEnt))
{
Log.Error($"Player {args.SenderSession} set location of non-existent item {msg.ItemEnt} stored in {ToPrettyString(storageEnt)}");
return;
}
if (!ActionBlocker.CanInteract(player, itemEnt) || !_sharedHandsSystem.IsHolding(player, itemEnt, out _))
return;
InsertAt((storageEnt, storageComp), (itemEnt, null), msg.Location, out _, player, stackAutomatically: false);
_adminLog.Add(
LogType.Storage,
LogImpact.Low,
$"{ToPrettyString(player):player} is inserting {ToPrettyString(item):item} into {ToPrettyString(storage):storage}");
InsertAt(storage!, item!, msg.Location, out _, player, stackAutomatically: false);
}
// TODO: if/when someone cleans up this shitcode please make all these
// handlers use a shared helper for checking that the ui is open etc, thanks
private void OnSaveItemLocation(StorageSaveItemLocationEvent msg, EntitySessionEventArgs args)
{
if (args.SenderSession.AttachedEntity is not {} player)
if (!ValidateInput(args, msg.Storage, msg.Item, out var player, out var storage, out var item, held: true))
return;
var storage = GetEntity(msg.Storage);
var item = GetEntity(msg.Item);
if (!HasComp<StorageComponent>(storage))
return;
if (!_ui.IsUiOpen(storage, StorageComponent.StorageUiKey.Key, player))
return;
if (!Exists(item))
{
Log.Error($"Player {args.SenderSession} saved location of non-existent item {msg.Item} stored in {ToPrettyString(storage)}");
return;
}
if (!ActionBlocker.CanInteract(player, item))
return;
SaveItemLocation(storage, item);
SaveItemLocation(storage!, item.Owner);
}
private void OnBoundUIOpen(EntityUid uid, StorageComponent storageComp, BoundUIOpenedEvent args)
@ -1500,6 +1431,79 @@ public abstract class SharedStorageSystem : EntitySystem
public abstract void PlayPickupAnimation(EntityUid uid, EntityCoordinates initialCoordinates,
EntityCoordinates finalCoordinates, Angle initialRotation, EntityUid? user = null);
private bool ValidateInput(
EntitySessionEventArgs args,
NetEntity netStorage,
out Entity<HandsComponent> player,
out Entity<StorageComponent> storage)
{
player = default;
storage = default;
if (args.SenderSession.AttachedEntity is not { } playerUid)
return false;
if (!TryComp(playerUid, out HandsComponent? hands) || hands.Count == 0)
return false;
if (!TryGetEntity(netStorage, out var storageUid))
return false;
if (!TryComp(storageUid, out StorageComponent? storageComp))
return false;
// TODO STORAGE use BUI events
// This would automatically validate that the UI is open & that the user can interact.
// However, we still need to manually validate that items being used are in the users hands or in the storage.
if (!_ui.IsUiOpen(storageUid.Value, StorageComponent.StorageUiKey.Key, playerUid))
return false;
if (!ActionBlocker.CanInteract(playerUid, storageUid))
return false;
player = new(playerUid, hands);
storage = new(storageUid.Value, storageComp);
return true;
}
private bool ValidateInput(EntitySessionEventArgs args,
NetEntity netStorage,
NetEntity netItem,
out Entity<HandsComponent> player,
out Entity<StorageComponent> storage,
out Entity<ItemComponent> item,
bool held = false)
{
item = default!;
if (!ValidateInput(args, netStorage, out player, out storage))
return false;
if (!TryGetEntity(netItem, out var itemUid))
return false;
if (held)
{
if (!_sharedHandsSystem.IsHolding(player, itemUid, out _))
return false;
}
else
{
if (!storage.Comp.Container.Contains(itemUid.Value))
return false;
DebugTools.Assert(storage.Comp.StoredItems.ContainsKey(itemUid.Value));
}
if (!TryComp(itemUid, out ItemComponent? itemComp))
return false;
if (!ActionBlocker.CanInteract(player, itemUid))
return false;
item = new(itemUid.Value, itemComp);
return true;
}
[Serializable, NetSerializable]
protected sealed class StorageComponentState : ComponentState
{

View file

@ -61,11 +61,12 @@ public abstract class SharedStrippableSystem : EntitySystem
private void OnCanDropOn(EntityUid uid, StrippingComponent component, ref CanDropTargetEvent args)
{
args.Handled = true;
args.CanDrop |= uid == args.User &&
HasComp<StrippableComponent>(args.Dragged) &&
HasComp<HandsComponent>(args.User) &&
HasComp<StrippingComponent>(args.User);
var val = uid == args.User &&
HasComp<StrippableComponent>(args.Dragged) &&
HasComp<HandsComponent>(args.User) &&
HasComp<StrippingComponent>(args.User);
args.Handled |= val;
args.CanDrop |= val;
}
private void OnCanDrop(EntityUid uid, StrippableComponent component, ref CanDropDraggedEvent args)

View file

@ -156,7 +156,7 @@ public sealed class FloorTileSystem : EntitySystem
var grid = _mapManager.CreateGridEntity(locationMap.MapId);
var gridXform = Transform(grid);
_transform.SetWorldPosition(gridXform, locationMap.Position);
_transform.SetWorldPosition((grid, gridXform), locationMap.Position);
location = new EntityCoordinates(grid, Vector2.Zero);
PlaceAt(args.User, grid, grid.Comp, location, _tileDefinitionManager[component.OutputTiles[0]].TileId, component.PlaceTileSound, grid.Comp.TileSize / 2f);
return;

View file

@ -1,64 +1,4 @@
Entries:
- author: FairlySadPanda
changes:
- message: Weapons that deflect shots, like the e-sword, now are most effective
at doing so when standing still, with moving or sprinting making the deflection
chance worse.
type: Tweak
id: 6548
time: '2024-05-07T18:14:59.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/27219
- author: deltanedas
changes:
- message: Lathes can now be sped up by using Space Lube.
type: Tweak
id: 6549
time: '2024-05-07T18:20:44.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/25515
- author: OnsenCapy
changes:
- message: Combat gloves now have their own unique sprite.
type: Tweak
- message: Combat gloves now have heat resistance to match their fireproof description.
type: Tweak
id: 6550
time: '2024-05-08T00:19:55.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/27373
- author: deltanedas
changes:
- message: Dragons can now breathe fire.
type: Add
id: 6551
time: '2024-05-08T00:25:41.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/26746
- author: Cojoke-dot
changes:
- message: You can now shoot over racks
type: Tweak
id: 6552
time: '2024-05-08T06:46:04.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/27797
- author: ShadowCommander
changes:
- message: Lizards now stop tail pulling when they are downed.
type: Fix
id: 6553
time: '2024-05-08T06:49:28.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/27796
- author: Plykiya
changes:
- message: Re-added supplybots.
type: Add
id: 6554
time: '2024-05-08T07:30:04.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/27769
- author: Hobbitmax
changes:
- message: Replaced Syndicate Jaws Of Life with a Pyjama bundle on the Train map.
type: Tweak
id: 6555
time: '2024-05-08T07:30:53.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/27734
- author: Plykiya
changes:
- message: The ninja's katana dash is now more reliable.
@ -3784,3 +3724,63 @@
id: 7047
time: '2024-08-05T08:07:02.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/29692
- author: EmoGarbage404
changes:
- message: The biogenerator has been recolored and renamed to the "biocube fabricator."
type: Tweak
id: 7048
time: '2024-08-06T10:51:33.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/30696
- author: Errant
changes:
- message: Vox can be nukies and ninjas again.
type: Tweak
id: 7049
time: '2024-08-06T10:58:29.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/29783
- author: slarticodefast
changes:
- message: Fixed borgs, animals and aghosts being able to enter cryosleep.
type: Fix
id: 7050
time: '2024-08-06T11:00:15.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/30574
- author: Flareguy
changes:
- message: Most hats are now automatically displaced on vox to look more fitting.
type: Tweak
id: 7051
time: '2024-08-06T13:12:14.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/30699
- author: Errant
changes:
- message: Medical Mask sprite now works on vox.
type: Fix
id: 7052
time: '2024-08-07T03:41:40.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/30702
- author: Lyroth001
changes:
- message: Dragons are immune to flashes
type: Tweak
id: 7053
time: '2024-08-07T07:42:00.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/30658
- author: ShadowCommander
changes:
- message: Rollerbeds can now be dragged to the player to fold and pick them up.
type: Add
id: 7054
time: '2024-08-07T09:19:10.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/30002
- author: Errant
changes:
- message: Survivors arriving via the Unknown Shuttle event, ERT and CBURN agents,
and Death Squad members are now equipped with the appropriate species-specific
survival gear.
type: Fix
- message: Unknown Shuttle event can once again spawn vox characters.
type: Tweak
id: 7055
time: '2024-08-07T09:26:40.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/29746

View file

@ -1,2 +1,11 @@
power-radiation-collector-gas-tank-missing = [color=darkred]No plasma tank attached.[/color]
power-radiation-collector-gas-tank-present = A plasma tank is [color=darkgreen]connected[/color].
power-radiation-collector-gas-tank-missing = The plasma tank slot is [color=darkred]empty[/color].
power-radiation-collector-gas-tank-present = The plasma tank slot is [color=darkgreen]filled[/color] and the tank indicator reads [color={$fullness ->
*[0]red]empty
[1]red]low
[2]yellow]half-full
[3]lime]full
}[/color].
power-radiation-collector-enabled = It's switched [color={$state ->
[true] darkgreen]on
*[false] darkred]off
}[/color].

View file

@ -14,6 +14,7 @@ loadout-group-survival-security = Security Survival Box
loadout-group-survival-syndicate = Github is forcing me to write text that is literally twice-impossible for the player to ever see, send help
loadout-group-breath-tool = Species-dependent breath tools
loadout-group-tank-harness = Species-specific survival equipment
loadout-group-EVA-tank = Species-specific gas tank
# Command
loadout-group-captain-head = Captain head

View file

@ -472,71 +472,26 @@ entities:
- type: Transform
pos: 20.5,-1.5
parent: 1
- type: AtmosDevice
joinedGrid: 1
- proto: AirlockCommandGlassLocked
entities:
- uid: 56
- uid: 5
components:
- type: Transform
pos: 0.5,-2.5
parent: 1
- type: WiresPanelSecurity
wiresAccessible: False
examine: wires-panel-component-on-examine-security-level2
- type: Construction
node: medSecurity
- type: ContainerContainer
containers:
board: !type:Container
showEnts: False
occludes: True
ents:
- 57
- type: DeviceNetwork
address: 2A91-A774
receiveFrequency: 1280
- proto: AirlockCommandLocked
entities:
- uid: 58
- uid: 12
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: -0.5,-6.5
parent: 1
- type: WiresPanelSecurity
wiresAccessible: False
examine: wires-panel-component-on-examine-security-level2
- type: ContainerContainer
containers:
board: !type:Container
showEnts: False
occludes: True
ents:
- 59
- type: DeviceNetwork
address: 09A1-F0F3
receiveFrequency: 1280
- type: Construction
node: medSecurity
- proto: AirlockEngineering
- proto: AirlockEngineeringGlassLocked
entities:
- uid: 60
- uid: 13
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 17.5,-4.5
parent: 1
- type: ContainerContainer
containers:
board: !type:Container
showEnts: False
occludes: True
ents:
- 61
- type: DeviceNetwork
address: 4FEE-86F1
receiveFrequency: 1280
- proto: AirlockExternalGlassShuttleEmergencyLocked
entities:
- uid: 62
@ -647,57 +602,27 @@ entities:
- type: DeviceNetwork
address: 2CB4-0D0E
receiveFrequency: 1280
- proto: AirlockMedicalGlass
- proto: AirlockMedicalGlassLocked
entities:
- uid: 76
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 8.5,-6.5
parent: 1
- type: ContainerContainer
containers:
board: !type:Container
showEnts: False
occludes: True
ents:
- 77
- type: DeviceNetwork
address: 0B07-5B7E
receiveFrequency: 1280
- uid: 78
- uid: 22
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 10.5,-9.5
parent: 1
- type: ContainerContainer
containers:
board: !type:Container
showEnts: False
occludes: True
ents:
- 79
- type: DeviceNetwork
address: 7B62-0AF6
receiveFrequency: 1280
- proto: AirlockSecurityGlassLocked
- uid: 23
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 8.5,-6.5
parent: 1
- proto: AirlockSecurityLawyerGlassLocked
entities:
- uid: 80
- uid: 32
components:
- type: Transform
pos: 2.5,-6.5
parent: 1
- type: ContainerContainer
containers:
board: !type:Container
showEnts: False
occludes: True
ents:
- 81
- type: DeviceNetwork
address: 40EA-C9E8
receiveFrequency: 1280
- proto: AirTankFilled
entities:
- uid: 82
@ -794,7 +719,7 @@ entities:
parent: 1
- type: Physics
canCollide: False
- proto: BookEscalationSecurity
- proto: BookRandomStory
entities:
- uid: 116
components:
@ -2901,24 +2826,6 @@ entities:
ent: 568
- proto: DoorElectronics
entities:
- uid: 57
components:
- type: Transform
parent: 56
- type: Physics
canCollide: False
- uid: 59
components:
- type: Transform
parent: 58
- type: Physics
canCollide: False
- uid: 61
components:
- type: Transform
parent: 60
- type: Physics
canCollide: False
- uid: 67
components:
- type: Transform
@ -2949,24 +2856,6 @@ entities:
parent: 74
- type: Physics
canCollide: False
- uid: 77
components:
- type: Transform
parent: 76
- type: Physics
canCollide: False
- uid: 79
components:
- type: Transform
parent: 78
- type: Physics
canCollide: False
- uid: 81
components:
- type: Transform
parent: 80
- type: Physics
canCollide: False
- uid: 570
components:
- type: Transform
@ -3311,8 +3200,6 @@ entities:
rot: 3.141592653589793 rad
pos: 20.5,-6.5
parent: 1
- type: AtmosDevice
joinedGrid: 1
- proto: GasPassiveVent
entities:
- uid: 591
@ -3321,8 +3208,6 @@ entities:
rot: 3.141592653589793 rad
pos: 18.5,-6.5
parent: 1
- type: AtmosDevice
joinedGrid: 1
- proto: GasPipeBend
entities:
- uid: 592
@ -3594,8 +3479,6 @@ entities:
rot: -1.5707963267948966 rad
pos: 20.5,-1.5
parent: 1
- type: AtmosDevice
joinedGrid: 1
- proto: GasVentPump
entities:
- uid: 638
@ -3604,40 +3487,30 @@ entities:
rot: 3.141592653589793 rad
pos: 15.5,-9.5
parent: 1
- type: AtmosDevice
joinedGrid: 1
- uid: 639
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: -1.5,-2.5
parent: 1
- type: AtmosDevice
joinedGrid: 1
- uid: 640
components:
- type: Transform
rot: 3.141592653589793 rad
pos: 2.5,-8.5
parent: 1
- type: AtmosDevice
joinedGrid: 1
- uid: 641
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 7.5,-9.5
parent: 1
- type: AtmosDevice
joinedGrid: 1
- uid: 642
components:
- type: Transform
rot: -1.5707963267948966 rad
pos: 5.5,-0.5
parent: 1
- type: AtmosDevice
joinedGrid: 1
- proto: Gauze
entities:
- uid: 139
@ -4334,10 +4207,15 @@ entities:
- type: Transform
pos: 15.5,-10.5
parent: 1
- type: AtmosDevice
joinedGrid: 1
- proto: OxygenTankFilled
entities:
- uid: 9
components:
- type: Transform
parent: 2
- type: Physics
canCollide: False
- type: InsideEntityStorage
- uid: 491
components:
- type: Transform
@ -8039,13 +7917,4 @@ entities:
parent: 1
- type: Physics
canCollide: False
- proto: YellowOxygenTankFilled
entities:
- uid: 9
components:
- type: Transform
parent: 2
- type: Physics
canCollide: False
- type: InsideEntityStorage
...

View file

@ -675,15 +675,11 @@ entities:
- type: Transform
pos: 0.5,-0.5
parent: 603
- type: AtmosDevice
joinedGrid: 603
- uid: 487
components:
- type: Transform
pos: -1.5,-0.5
parent: 603
- type: AtmosDevice
joinedGrid: 603
- proto: AirlockCommandLocked
entities:
- uid: 473
@ -892,155 +888,98 @@ entities:
- type: Transform
pos: -3.5,15.5
parent: 603
- type: DeviceLinkSink
links:
- 602
- uid: 471
components:
- type: Transform
pos: -5.5,15.5
parent: 603
- type: DeviceLinkSink
links:
- 602
- uid: 472
components:
- type: Transform
pos: -7.5,15.5
parent: 603
- type: DeviceLinkSink
links:
- 602
- uid: 541
components:
- type: Transform
pos: -10.5,5.5
parent: 603
- type: DeviceLinkSink
links:
- 555
- uid: 542
components:
- type: Transform
pos: -10.5,6.5
parent: 603
- type: DeviceLinkSink
links:
- 555
- uid: 543
components:
- type: Transform
pos: -10.5,7.5
parent: 603
- type: DeviceLinkSink
links:
- 555
- uid: 544
components:
- type: Transform
pos: -10.5,2.5
parent: 603
- type: DeviceLinkSink
links:
- 555
- uid: 545
components:
- type: Transform
pos: 5.5,2.5
parent: 603
- type: DeviceLinkSink
links:
- 555
- uid: 546
components:
- type: Transform
pos: 5.5,5.5
parent: 603
- type: DeviceLinkSink
links:
- 555
- uid: 547
components:
- type: Transform
pos: 5.5,6.5
parent: 603
- type: DeviceLinkSink
links:
- 555
- uid: 548
components:
- type: Transform
pos: 5.5,7.5
parent: 603
- type: DeviceLinkSink
links:
- 555
- uid: 549
components:
- type: Transform
pos: 5.5,10.5
parent: 603
- type: DeviceLinkSink
links:
- 555
- uid: 550
components:
- type: Transform
rot: -1.5707963267948966 rad
pos: 3.5,15.5
parent: 603
- type: DeviceLinkSink
links:
- 555
- uid: 551
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 2.5,15.5
parent: 603
- type: DeviceLinkSink
links:
- 555
- uid: 552
components:
- type: Transform
pos: 0.5,14.5
parent: 603
- type: DeviceLinkSink
links:
- 555
- uid: 553
components:
- type: Transform
pos: -0.5,14.5
parent: 603
- type: DeviceLinkSink
links:
- 555
- uid: 554
components:
- type: Transform
pos: -1.5,14.5
parent: 603
- type: DeviceLinkSink
links:
- 555
- uid: 556
components:
- type: Transform
pos: -1.5,8.5
parent: 603
- type: DeviceLinkSink
links:
- 555
- uid: 557
components:
- type: Transform
pos: 0.5,8.5
parent: 603
- type: DeviceLinkSink
links:
- 555
- proto: BoxSurvivalEngineering
entities:
- uid: 600
@ -2262,6 +2201,14 @@ entities:
- type: Transform
pos: -3.4608088,12.544868
parent: 603
- proto: DefibrillatorCabinetFilled
entities:
- uid: 605
components:
- type: Transform
rot: -1.5707963267948966 rad
pos: -2.5,0.5
parent: 603
- proto: EmergencyLight
entities:
- uid: 434
@ -2692,16 +2639,12 @@ entities:
rot: -1.5707963267948966 rad
pos: 0.5,-0.5
parent: 603
- type: AtmosDevice
joinedGrid: 603
- uid: 486
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: -1.5,-0.5
parent: 603
- type: AtmosDevice
joinedGrid: 603
- proto: GasPressurePump
entities:
- uid: 156
@ -2710,8 +2653,6 @@ entities:
rot: 3.141592653589793 rad
pos: -0.5,0.5
parent: 603
- type: AtmosDevice
joinedGrid: 603
- proto: GasVentPump
entities:
- uid: 89
@ -2719,78 +2660,58 @@ entities:
- type: Transform
pos: -0.5,10.5
parent: 603
- type: AtmosDevice
joinedGrid: 603
- uid: 135
components:
- type: Transform
rot: -1.5707963267948966 rad
pos: 4.5,10.5
parent: 603
- type: AtmosDevice
joinedGrid: 603
- uid: 147
components:
- type: Transform
rot: -1.5707963267948966 rad
pos: 4.5,2.5
parent: 603
- type: AtmosDevice
joinedGrid: 603
- uid: 171
components:
- type: Transform
pos: -0.5,2.5
parent: 603
- type: AtmosDevice
joinedGrid: 603
- uid: 172
components:
- type: Transform
rot: 3.141592653589793 rad
pos: -2.5,5.5
parent: 603
- type: AtmosDevice
joinedGrid: 603
- uid: 342
components:
- type: Transform
rot: -1.5707963267948966 rad
pos: -7.5,2.5
parent: 603
- type: AtmosDevice
joinedGrid: 603
- uid: 373
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: -8.5,-1.5
parent: 603
- type: AtmosDevice
joinedGrid: 603
- uid: 374
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: -9.5,6.5
parent: 603
- type: AtmosDevice
joinedGrid: 603
- uid: 376
components:
- type: Transform
pos: -4.5,12.5
parent: 603
- type: AtmosDevice
joinedGrid: 603
- uid: 396
components:
- type: Transform
rot: -1.5707963267948966 rad
pos: -4.5,1.5
parent: 603
- type: AtmosDevice
joinedGrid: 603
- proto: GeneratorBasic15kW
entities:
- uid: 214
@ -3232,25 +3153,16 @@ entities:
- type: Transform
pos: -5.5,8.5
parent: 603
- type: DeviceLinkSink
links:
- 602
- uid: 468
components:
- type: Transform
pos: -4.5,8.5
parent: 603
- type: DeviceLinkSink
links:
- 602
- uid: 469
components:
- type: Transform
pos: -3.5,8.5
parent: 603
- type: DeviceLinkSink
links:
- 602
- proto: ShuttleWindow
entities:
- uid: 76

File diff suppressed because it is too large Load diff

View file

@ -89806,6 +89806,13 @@ entities:
- type: Transform
pos: -19.46565,10.906514
parent: 13329
- proto: CleanerDispenser
entities:
- uid: 20449
components:
- type: Transform
pos: 6.5,14.5
parent: 13329
- proto: ClosetBombFilled
entities:
- uid: 9440

File diff suppressed because it is too large Load diff

View file

@ -7162,7 +7162,7 @@ entities:
pos: 24.5,-39.5
parent: 2
- type: Door
secondsUntilStateChange: -191.21292
secondsUntilStateChange: -432.36554
state: Opening
- type: DeviceLinkSource
lastSignals:
@ -8885,13 +8885,6 @@ entities:
rot: -1.5707963267948966 rad
pos: 28.5,7.5
parent: 2
- uid: 4309
components:
- type: MetaData
name: Singulo APC
- type: Transform
pos: 17.5,-37.5
parent: 2
- uid: 4325
components:
- type: MetaData
@ -9063,6 +9056,14 @@ entities:
rot: 1.5707963267948966 rad
pos: 2.5,-4.5
parent: 2
- uid: 5577
components:
- type: MetaData
name: Singulo APC
- type: Transform
rot: 1.5707963267948966 rad
pos: 15.5,-39.5
parent: 2
- uid: 5648
components:
- type: MetaData
@ -10681,6 +10682,11 @@ entities:
- type: Transform
pos: 56.5,-3.5
parent: 2
- uid: 4318
components:
- type: Transform
pos: 16.5,-39.5
parent: 2
- uid: 4677
components:
- type: Transform
@ -11546,16 +11552,6 @@ entities:
- type: Transform
pos: 40.5,-44.5
parent: 2
- uid: 5577
components:
- type: Transform
pos: 17.5,-37.5
parent: 2
- uid: 5578
components:
- type: Transform
pos: 17.5,-38.5
parent: 2
- uid: 5579
components:
- type: Transform
@ -12076,6 +12072,11 @@ entities:
- type: Transform
pos: 42.5,-10.5
parent: 2
- uid: 6769
components:
- type: Transform
pos: 15.5,-39.5
parent: 2
- uid: 6829
components:
- type: Transform
@ -18967,6 +18968,11 @@ entities:
- type: Transform
pos: 17.5,-40.5
parent: 2
- uid: 4308
components:
- type: Transform
pos: 16.5,-37.5
parent: 2
- uid: 4335
components:
- type: Transform
@ -22402,6 +22408,16 @@ entities:
- type: Transform
pos: 43.5,27.5
parent: 2
- uid: 8446
components:
- type: Transform
pos: 16.5,-36.5
parent: 2
- uid: 8447
components:
- type: Transform
pos: 16.5,-35.5
parent: 2
- uid: 8818
components:
- type: Transform
@ -23872,15 +23888,10 @@ entities:
- type: Transform
pos: 22.5,7.5
parent: 2
- uid: 4308
- uid: 4309
components:
- type: Transform
pos: 17.5,-37.5
parent: 2
- uid: 4312
components:
- type: Transform
pos: 17.5,-36.5
pos: 15.5,-39.5
parent: 2
- uid: 4605
components:
@ -24237,10 +24248,10 @@ entities:
- type: Transform
pos: 62.5,-6.5
parent: 2
- uid: 5576
- uid: 5578
components:
- type: Transform
pos: 17.5,-35.5
pos: 13.5,-41.5
parent: 2
- uid: 5608
components:
@ -24277,15 +24288,15 @@ entities:
- type: Transform
pos: 19.5,-13.5
parent: 2
- uid: 6766
components:
- type: Transform
pos: 14.5,-41.5
parent: 2
- uid: 6768
components:
- type: Transform
pos: 15.5,-42.5
parent: 2
- uid: 6769
components:
- type: Transform
pos: 14.5,-42.5
pos: 15.5,-41.5
parent: 2
- uid: 6770
components:
@ -24322,6 +24333,21 @@ entities:
- type: Transform
pos: 21.5,-39.5
parent: 2
- uid: 6942
components:
- type: Transform
pos: 16.5,-41.5
parent: 2
- uid: 6943
components:
- type: Transform
pos: 16.5,-40.5
parent: 2
- uid: 6944
components:
- type: Transform
pos: 16.5,-39.5
parent: 2
- uid: 6955
components:
- type: Transform
@ -25262,6 +25288,16 @@ entities:
- type: Transform
pos: -15.5,-15.5
parent: 2
- uid: 7781
components:
- type: Transform
pos: 16.5,-38.5
parent: 2
- uid: 7782
components:
- type: Transform
pos: 16.5,-37.5
parent: 2
- uid: 8287
components:
- type: Transform
@ -32781,6 +32817,23 @@ entities:
- type: Transform
pos: 52.52299,8.566419
parent: 2
- proto: ClothingOuterHardsuitSecurity
entities:
- uid: 9478
components:
- type: Transform
pos: 38.48357,28.698536
parent: 2
- uid: 9883
components:
- type: Transform
pos: 38.48357,28.698536
parent: 2
- uid: 9884
components:
- type: Transform
pos: 38.48357,28.698536
parent: 2
- proto: ClothingOuterHospitalGown
entities:
- uid: 12499
@ -68308,12 +68361,12 @@ entities:
currentSupply: 60.000237
- proto: SubstationWallBasic
entities:
- uid: 6766
- uid: 5576
components:
- type: MetaData
name: Singulo Emitter Substation
name: Singulo Substation
- type: Transform
pos: 15.5,-42.5
pos: 16.5,-37.5
parent: 2
- proto: SuitStorageAtmos
entities:
@ -81160,16 +81213,16 @@ entities:
- type: Transform
pos: 28.5,-20.5
parent: 2
- uid: 4312
components:
- type: Transform
pos: 17.5,-37.5
parent: 2
- uid: 4313
components:
- type: Transform
pos: 16.5,-37.5
parent: 2
- uid: 4318
components:
- type: Transform
pos: 17.5,-37.5
parent: 2
- uid: 4319
components:
- type: Transform

View file

@ -1364,9 +1364,6 @@ entities:
- type: Transform
pos: 9.5,-11.5
parent: 407
- type: DeviceLinkSink
links:
- 1243
- type: DeviceLinkSource
linkedPorts:
1243:
@ -1376,9 +1373,6 @@ entities:
- type: Transform
pos: 12.5,-11.5
parent: 407
- type: DeviceLinkSink
links:
- 1242
- type: DeviceLinkSource
linkedPorts:
1242:
@ -1397,9 +1391,6 @@ entities:
- type: Transform
pos: -17.5,5.5
parent: 407
- type: DeviceLinkSink
links:
- 1245
- type: DeviceLinkSource
linkedPorts:
1245:
@ -1409,9 +1400,6 @@ entities:
- type: Transform
pos: -17.5,7.5
parent: 407
- type: DeviceLinkSink
links:
- 1244
- type: DeviceLinkSource
linkedPorts:
1244:
@ -1787,9 +1775,6 @@ entities:
rot: 1.5707963267948966 rad
pos: -5.5,10.5
parent: 407
- type: DeviceLinkSink
links:
- 1251
- proto: BluespaceBeaker
entities:
- uid: 1740
@ -5803,6 +5788,13 @@ entities:
- type: Transform
pos: -0.5,8.5
parent: 407
- proto: CleanerDispenser
entities:
- uid: 2279
components:
- type: Transform
pos: -3.5,-5.5
parent: 407
- proto: ClosetChefFilled
entities:
- uid: 1655
@ -9737,9 +9729,6 @@ entities:
- type: Transform
pos: -3.5,10.5
parent: 407
- type: DeviceLinkSink
links:
- 1986
- proto: MachineCentrifuge
entities:
- uid: 2220
@ -10984,43 +10973,28 @@ entities:
- type: Transform
pos: -8.5,2.5
parent: 407
- type: DeviceLinkSink
links:
- 1759
- uid: 1652
components:
- type: Transform
pos: -10.5,2.5
parent: 407
- type: DeviceLinkSink
links:
- 1759
- uid: 1803
components:
- type: Transform
rot: -1.5707963267948966 rad
pos: -4.5,2.5
parent: 407
- type: DeviceLinkSink
links:
- 2224
- uid: 2162
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: -3.5,2.5
parent: 407
- type: DeviceLinkSink
links:
- 2224
- uid: 2222
components:
- type: Transform
pos: -14.5,2.5
parent: 407
- type: DeviceLinkSink
links:
- 2223
- proto: ShuttersRadiation
entities:
- uid: 1252
@ -11029,27 +11003,18 @@ entities:
rot: 1.5707963267948966 rad
pos: -19.5,-0.5
parent: 407
- type: DeviceLinkSink
links:
- 1255
- uid: 1253
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: -19.5,0.5
parent: 407
- type: DeviceLinkSink
links:
- 1255
- uid: 1254
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: -19.5,1.5
parent: 407
- type: DeviceLinkSink
links:
- 1255
- proto: ShuttersWindowOpen
entities:
- uid: 1650
@ -11057,9 +11022,6 @@ entities:
- type: Transform
pos: -9.5,2.5
parent: 407
- type: DeviceLinkSink
links:
- 1759
- proto: ShuttleWindow
entities:
- uid: 18
@ -11555,7 +11517,7 @@ entities:
- Pressed: Toggle
2162:
- Pressed: Toggle
- proto: SignAtmosMinsky
- proto: SignAtmos
entities:
- uid: 1560
components:

File diff suppressed because it is too large Load diff

View file

@ -87,7 +87,7 @@
- type: alert
id: Fire
icons: [ /Textures/Interface/Alerts/Fire/fire.png ]
onClick: !type:ResistFire { }
clickEvent: !type:ResistFireAlertEvent
name: alerts-on-fire-name
description: alerts-on-fire-desc
@ -136,14 +136,14 @@
- type: alert
id: Handcuffed
onClick: !type:RemoveCuffs { }
clickEvent: !type:RemoveCuffsAlertEvent
icons: [ /Textures/Interface/Alerts/Handcuffed/Handcuffed.png ]
name: alerts-handcuffed-name
description: alerts-handcuffed-desc
- type: alert
id: Ensnared
onClick: !type:RemoveEnsnare { }
clickEvent: !type:RemoveEnsnareAlertEvent
icons:
- sprite: /Textures/Interface/Alerts/ensnared.rsi
state: ensnared
@ -153,7 +153,7 @@
- type: alert
id: Buckled
category: Buckled
onClick: !type:Unbuckle { }
clickEvent: !type:UnbuckleAlertEvent
icons: [ /Textures/Interface/Alerts/Buckle/buckled.png ]
name: alerts-buckled-name
description: alerts-buckled-desc
@ -277,7 +277,7 @@
- type: alert
id: Internals
category: Internals
onClick: !type:ToggleInternals {}
clickEvent: !type:ToggleInternalsAlertEvent
icons:
- sprite: /Textures/Interface/Alerts/internals.rsi
state: internal0
@ -293,7 +293,7 @@
- type: alert
id: PilotingShuttle
category: Piloting
onClick: !type:StopPiloting { }
clickEvent: !type:StopPilotingAlertEvent
icons: [ /Textures/Interface/Alerts/piloting.png ]
name: alerts-piloting-name
description: alerts-piloting-desc
@ -367,27 +367,27 @@
id: VowOfSilence
icons: [ /Textures/Interface/Alerts/Abilities/silenced.png ]
name: alerts-vow-silence-name
onClick: !type:BreakVow { }
clickEvent: !type:BreakVowAlertEvent
description: alerts-vow-silence-desc
- type: alert
id: VowBroken
icons: [ /Textures/Interface/Actions/scream.png ]
name: alerts-vow-broken-name
onClick: !type:RetakeVow { }
clickEvent: !type:RetakeVowAlertEvent
description: alerts-vow-broken-desc
- type: alert
id: Pulled
icons: [ /Textures/Interface/Alerts/Pull/pulled.png ]
onClick: !type:StopBeingPulled { }
clickEvent: !type:StopBeingPulledAlertEvent
name: alerts-pulled-name
description: alerts-pulled-desc
- type: alert
id: Pulling
icons: [ /Textures/Interface/Alerts/Pull/pulling.png ]
onClick: !type:StopPulling { }
clickEvent: !type:StopPullingAlertEvent
name: alerts-pulling-name
description: alerts-pulling-desc

View file

@ -148,6 +148,8 @@
sprite: Clothing/Head/Misc/cone.rsi
- type: Clothing
sprite: Clothing/Head/Misc/cone.rsi
- type: Item
storedRotation: 0
- type: PhysicalComposition #you can't just pass up some free plastic!
materialComposition:
Plastic: 100

View file

@ -96,6 +96,16 @@
- type: Flammable
damage:
types: {}
- type: StatusEffects # Overwriting basesimplemob to remove flash, getting flashed as dragon just feelsbad
allowed:
- SlowedDown
- Stutter
- Electrocution
- ForcedSleep
- TemporaryBlindness
- Pacified
- RadiationProtection
- Drowsiness
- type: Temperature
heatDamageThreshold: 800
- type: Metabolizer

View file

@ -11,18 +11,19 @@
name: syndicate agent
suffix: Human, Base
components:
- type: RandomHumanoidAppearance
randomizeName: false
hair: HairBald
- type: Loadout
prototypes: [SyndicateOperativeGearExtremelyBasic]
- type: RandomMetadata
nameSegments: # Russian-LastNameGender
- names_first_male
- names_last_male
- type: NpcFactionMember
factions:
- Syndicate
- type: RandomHumanoidAppearance
randomizeName: false
hair: HairBald
- type: Loadout
prototypes: [SyndicateOperativeGearExtremelyBasic]
roleLoadout: [ RoleSurvivalSyndicate ]
- type: RandomMetadata
nameSegments: # Russian-LastNameGender
- names_first_male
- names_last_male
- type: NpcFactionMember
factions:
- Syndicate
- type: entity
parent: MobHumanSyndicateAgentBase
@ -30,10 +31,10 @@
name: syndicate agent
suffix: Human, Traitor
components:
# make the player a traitor once its taken
- type: AutoTraitor
giveUplink: false
giveObjectives: false
# make the player a traitor once its taken
- type: AutoTraitor
giveUplink: false
giveObjectives: false
- type: entity
parent: MobHumanSyndicateAgent
@ -42,6 +43,7 @@
components:
- type: Loadout
prototypes: [SyndicateReinforcementMedic]
roleLoadout: [ RoleSurvivalSyndicate ]
- type: entity
parent: MobHumanSyndicateAgent
@ -50,6 +52,7 @@
components:
- type: Loadout
prototypes: [SyndicateReinforcementSpy]
roleLoadout: [ RoleSurvivalSyndicate ]
- type: entity
parent: MobHumanSyndicateAgent
@ -58,19 +61,20 @@
components:
- type: Loadout
prototypes: [SyndicateReinforcementThief]
roleLoadout: [ RoleSurvivalSyndicate ]
- type: entity
parent: MobHumanSyndicateAgentBase
id: MobHumanSyndicateAgentNukeops # Reinforcement exclusive to nukeops uplink
suffix: Human, NukeOps
components:
- type: NukeOperative
- type: RandomMetadata
nameSegments:
- nukeops-role-operator
- SyndicateNamesNormal
- type: Loadout
prototypes: [SyndicateOperativeGearFullNoUplink]
- type: NukeOperative
- type: RandomMetadata
nameSegments:
- nukeops-role-operator
- SyndicateNamesNormal
- type: Loadout
prototypes: [SyndicateOperativeGearFullNoUplink]
# Nuclear Operative
- type: entity
@ -79,8 +83,8 @@
parent: MobHuman
id: MobHumanNukeOp
components:
- type: NukeOperative
- type: RandomHumanoidAppearance
- type: NukeOperative
- type: RandomHumanoidAppearance
- type: entity
categories: [ HideSpawnMenu ]
@ -88,15 +92,16 @@
id: MobHumanLoneNuclearOperative
name: Lone Operative
components:
- type: RandomHumanoidAppearance
randomizeName: false
- type: NukeOperative
- type: Loadout
prototypes: [SyndicateLoneOperativeGearFull]
- type: RandomMetadata
nameSegments:
- SyndicateNamesPrefix
- SyndicateNamesNormal
- type: NpcFactionMember
factions:
- Syndicate
- type: RandomHumanoidAppearance
randomizeName: false
- type: NukeOperative
- type: Loadout
prototypes: [SyndicateLoneOperativeGearFull]
roleLoadout: [ RoleSurvivalSyndicate ]
- type: RandomMetadata
nameSegments:
- SyndicateNamesPrefix
- SyndicateNamesNormal
- type: NpcFactionMember
factions:
- Syndicate

View file

@ -51,6 +51,7 @@
settings: short
- type: Loadout
prototypes: [ DeathSquadGear ]
roleLoadout: [ RoleSurvivalEVA ]
- type: RandomMetadata
nameSegments:
- NamesFirstMilitaryLeader
@ -92,6 +93,7 @@
settings: short
- type: Loadout
prototypes: [ ERTLeaderGear ]
roleLoadout: [ RoleSurvivalExtended ]
- type: RandomMetadata
nameSegments:
- NamesFirstMilitaryLeader
@ -126,6 +128,7 @@
settings: short
- type: Loadout
prototypes: [ ERTLeaderGearEVA ]
roleLoadout: [ RoleSurvivalEVA ]
- type: entity
id: RandomHumanoidSpawnerERTLeaderEVALecter
@ -152,6 +155,7 @@
settings: short
- type: Loadout
prototypes: [ ERTLeaderGearEVALecter ]
roleLoadout: [ RoleSurvivalEVA ]
## ERT Chaplain
@ -192,6 +196,7 @@
- NamesLastMilitary
- type: Loadout
prototypes: [ ERTChaplainGear ]
roleLoadout: [ RoleSurvivalExtended ]
- type: entity
id: RandomHumanoidSpawnerERTChaplainEVA
@ -222,6 +227,7 @@
settings: short
- type: Loadout
prototypes: [ ERTChaplainGearEVA ]
roleLoadout: [ RoleSurvivalEVA ]
## ERT Janitor
@ -262,6 +268,7 @@
- NamesLastMilitary
- type: Loadout
prototypes: [ ERTJanitorGear ]
roleLoadout: [ RoleSurvivalExtended ]
- type: entity
id: RandomHumanoidSpawnerERTJanitorEVA
@ -291,6 +298,7 @@
settings: short
- type: Loadout
prototypes: [ ERTJanitorGearEVA ]
roleLoadout: [ RoleSurvivalEVA ]
## ERT Engineer
@ -330,6 +338,7 @@
- NamesLastMilitary
- type: Loadout
prototypes: [ ERTEngineerGear ]
roleLoadout: [ RoleSurvivalExtended ]
- type: entity
id: RandomHumanoidSpawnerERTEngineerEVA
@ -359,6 +368,7 @@
settings: short
- type: Loadout
prototypes: [ ERTEngineerGearEVA ]
roleLoadout: [ RoleSurvivalEVA ]
## ERT Security
@ -398,6 +408,7 @@
- NamesLastMilitary
- type: Loadout
prototypes: [ ERTSecurityGear ]
roleLoadout: [ RoleSurvivalExtended ]
- type: entity
id: RandomHumanoidSpawnerERTSecurityEVA
@ -427,6 +438,7 @@
settings: short
- type: Loadout
prototypes: [ ERTSecurityGearEVA ]
roleLoadout: [ RoleSurvivalEVA ]
- type: entity
id: RandomHumanoidSpawnerERTSecurityEVALecter
@ -452,6 +464,7 @@
settings: short
- type: Loadout
prototypes: [ ERTSecurityGearEVALecter ]
roleLoadout: [ RoleSurvivalEVA ]
## ERT Medic
@ -490,6 +503,7 @@
- NamesLastMilitary
- type: Loadout
prototypes: [ ERTMedicalGear ]
roleLoadout: [ RoleSurvivalExtended ]
- type: entity
id: RandomHumanoidSpawnerERTMedicalEVA
@ -518,6 +532,7 @@
settings: short
- type: Loadout
prototypes: [ ERTMedicalGearEVA ]
roleLoadout: [ RoleSurvivalEVA ]
## CBURN
@ -543,6 +558,7 @@
components:
- type: Loadout
prototypes: [CBURNGear]
roleLoadout: [ RoleSurvivalEVA ]
- type: GhostRole
name: ghost-role-information-cburn-agent-name
description: ghost-role-information-cburn-agent-description
@ -582,6 +598,7 @@
settings: default
- type: Loadout
prototypes: [ CentCommOfficialGear ] # Sunrise-Edit
roleLoadout: [ RoleSurvivalStandard ]
## Syndicate
@ -608,6 +625,7 @@
randomizeName: false
- type: Loadout
prototypes: [SyndicateOperativeGearExtremelyBasic]
roleLoadout: [ RoleSurvivalSyndicate ]
- type: entity
id: RandomHumanoidSpawnerNukeOp
@ -691,8 +709,6 @@
- type: randomHumanoidSettings
id: LostCargoTechnician
parent: EventHumanoid
speciesBlacklist:
- Vox
components:
- type: GhostRole
name: ghost-role-information-lost-cargo-technical-name
@ -702,6 +718,8 @@
settings: short
- type: Loadout
prototypes: [ LostCargoTechGearSuit, LostCargoTechGearCoat ]
roleLoadout: [ RoleSurvivalStandard ]
# Clown troupe
@ -744,8 +762,6 @@
id: ClownTroupe
parent: EventHumanoid
randomizeName: false
speciesBlacklist:
- Vox
components:
- type: GhostRole
name: ghost-role-information-clown-troupe-name
@ -755,6 +771,7 @@
settings: short
- type: Loadout
prototypes: [ ClownTroupe ]
roleLoadout: [ RoleSurvivalStandard ]
- type: RandomMetadata
nameSegments:
- names_clown
@ -766,6 +783,7 @@
components:
- type: Loadout
prototypes: [ BananaClown ]
roleLoadout: [ RoleSurvivalStandard ]
# Traveling exotic chef
@ -796,8 +814,6 @@
- type: randomHumanoidSettings
id: TravelingChef
parent: EventHumanoid
speciesBlacklist:
- Vox
components:
- type: GhostRole
name: ghost-role-information-traveling-chef-name
@ -807,6 +823,7 @@
settings: short
- type: Loadout
prototypes: [ TravelingChef ]
roleLoadout: [ RoleSurvivalStandard ]
# Disaster victim
@ -858,8 +875,6 @@
- type: randomHumanoidSettings
id: DisasterVictimHead
parent: EventHumanoidMindShielded
speciesBlacklist:
- Vox
components:
- type: GhostRole
name: ghost-role-information-disaster-victim-name
@ -874,6 +889,7 @@
components:
- type: Loadout
prototypes: [ DisasterVictimRD, DisasterVictimRDAlt ]
roleLoadout: [ RoleSurvivalStandard ]
- type: randomHumanoidSettings
id: DisasterVictimCMO
@ -881,6 +897,7 @@
components:
- type: Loadout
prototypes: [ DisasterVictimCMO, DisasterVictimCMOAlt ]
roleLoadout: [ RoleSurvivalMedical ]
- type: randomHumanoidSettings
id: DisasterVictimCaptain
@ -888,6 +905,7 @@
components:
- type: Loadout
prototypes: [ DisasterVictimCaptain, DisasterVictimCaptainAlt ]
roleLoadout: [ RoleSurvivalStandard ]
# Syndie Disaster Victim
@ -934,3 +952,4 @@
settings: short
- type: Loadout
prototypes: [ SyndicateOperativeGearCivilian ]
roleLoadout: [ RoleSurvivalStandard ]

View file

@ -173,6 +173,7 @@
- type: Dna
- type: MindContainer
showExamineInfo: true
- type: CanEnterCryostorage
- type: InteractionPopup
successChance: 1
interactSuccessString: hugging-success-generic

View file

@ -113,6 +113,11 @@
32:
sprite: Mobs/Species/Vox/displacement.rsi
state: hand
head:
sizeMaps:
32:
sprite: Mobs/Species/Vox/displacement.rsi
state: head
back:
sizeMaps:
32:
@ -156,6 +161,11 @@
32:
sprite: Mobs/Species/Vox/displacement.rsi
state: hand
head:
sizeMaps:
32:
sprite: Mobs/Species/Vox/displacement.rsi
state: head
back:
sizeMaps:
32:

Some files were not shown because too many files have changed in this diff Show more