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:
commit
a33b949c98
118 changed files with 16759 additions and 14595 deletions
|
|
@ -93,6 +93,6 @@ public sealed class ClientAlertsSystem : AlertsSystem
|
|||
|
||||
public void AlertClicked(ProtoId<AlertPrototype> alertType)
|
||||
{
|
||||
RaiseNetworkEvent(new ClickAlertEvent(alertType));
|
||||
RaisePredictiveEvent(new ClickAlertEvent(alertType));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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>();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -25,4 +25,5 @@ namespace Content.Server.Body.Components
|
|||
[DataField]
|
||||
public ProtoId<AlertPrototype> InternalsAlert = "Internals";
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
}
|
||||
|
|
|
|||
7
Content.Shared/Abilities/Mime/MimePowers.cs
Normal file
7
Content.Shared/Abilities/Mime/MimePowers.cs
Normal 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;
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 { }
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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?
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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?
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -42,3 +42,5 @@ public sealed partial class PullableComponent : Component
|
|||
[DataField]
|
||||
public ProtoId<AlertPrototype> PulledAlert = "Pulled";
|
||||
}
|
||||
|
||||
public sealed partial class StopBeingPulledAlertEvent : BaseAlertEvent;
|
||||
|
|
|
|||
|
|
@ -44,3 +44,5 @@ public sealed partial class PullerComponent : Component
|
|||
[DataField]
|
||||
public ProtoId<AlertPrototype> PullingAlert = "Pulling";
|
||||
}
|
||||
|
||||
public sealed partial class StopPullingAlertEvent : BaseAlertEvent;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -39,4 +39,6 @@ namespace Content.Shared.Shuttles.Components
|
|||
|
||||
public override bool SendOnlyToOwner => true;
|
||||
}
|
||||
|
||||
public sealed partial class StopPilotingAlertEvent : BaseAlertEvent;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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].
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
...
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
10308
Resources/Maps/bagel.yml
10308
Resources/Maps/bagel.yml
File diff suppressed because it is too large
Load diff
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
17303
Resources/Maps/train.yml
17303
Resources/Maps/train.yml
File diff suppressed because it is too large
Load diff
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 ]
|
||||
|
|
|
|||
|
|
@ -173,6 +173,7 @@
|
|||
- type: Dna
|
||||
- type: MindContainer
|
||||
showExamineInfo: true
|
||||
- type: CanEnterCryostorage
|
||||
- type: InteractionPopup
|
||||
successChance: 1
|
||||
interactSuccessString: hugging-success-generic
|
||||
|
|
|
|||
|
|
@ -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
Loading…
Add table
Reference in a new issue