Merge remote-tracking branch 'space-wizards/master'

# Conflicts:
#	Resources/Textures/Clothing/Hands/Gloves/Color/black.rsi/meta.json
#	Resources/Textures/Clothing/Hands/Gloves/Color/color.rsi/meta.json
#	Resources/Textures/Clothing/Hands/Gloves/captain.rsi/inhand-left.png
#	Resources/Textures/Clothing/Hands/Gloves/captain.rsi/inhand-right.png
#	Resources/Textures/Clothing/Hands/Gloves/captain.rsi/meta.json
#	Resources/Textures/Clothing/Hands/Gloves/combat.rsi/inhand-left.png
#	Resources/Textures/Clothing/Hands/Gloves/combat.rsi/inhand-right.png
#	Resources/Textures/Clothing/Hands/Gloves/combat.rsi/meta.json
#	Resources/Textures/Clothing/Hands/Gloves/fingerless.rsi/meta.json
#	Resources/Textures/Clothing/Hands/Gloves/fingerlessinsuls.rsi/meta.json
#	Resources/Textures/Clothing/Hands/Gloves/janitor.rsi/inhand-left.png
#	Resources/Textures/Clothing/Hands/Gloves/janitor.rsi/inhand-right.png
#	Resources/Textures/Clothing/Hands/Gloves/janitor.rsi/meta.json
#	Resources/Textures/Clothing/Hands/Gloves/latex.rsi/meta.json
#	Resources/Textures/Clothing/Hands/Gloves/leather.rsi/meta.json
#	Resources/Textures/Clothing/Hands/Gloves/mercfingerless.rsi/meta.json
#	Resources/Textures/Clothing/Hands/Gloves/nitrile.rsi/inhand-left.png
#	Resources/Textures/Clothing/Hands/Gloves/nitrile.rsi/inhand-right.png
#	Resources/Textures/Clothing/Hands/Gloves/nitrile.rsi/meta.json
#	Resources/Textures/Clothing/Hands/Gloves/robohands.rsi/meta.json
#	Resources/Textures/Clothing/Head/Hardsuits/cybersun.rsi/meta.json
#	Resources/Textures/Clothing/OuterClothing/Hardsuits/cybersun.rsi/meta.json
#	Resources/Textures/Mobs/Aliens/Xenos/purple_snake.rsi/meta.json
This commit is contained in:
Vigers Ray 2025-04-17 06:26:03 +03:00
commit a5a2bbd386
106 changed files with 399 additions and 262 deletions

View file

@ -1,59 +0,0 @@
using System.Threading;
using Content.Client.Stylesheets;
using Robust.Client.UserInterface.Controls;
using Timer = Robust.Shared.Timing.Timer;
namespace Content.Client.Administration.UI;
public static class AdminUIHelpers
{
private static void ResetButton(Button button, ConfirmationData data)
{
data.Cancellation.Cancel();
button.ModulateSelfOverride = null;
button.Text = data.OriginalText;
}
public static bool RemoveConfirm(Button button, Dictionary<Button, ConfirmationData> confirmations)
{
if (confirmations.Remove(button, out var data))
{
ResetButton(button, data);
return true;
}
return false;
}
public static void RemoveAllConfirms(Dictionary<Button, ConfirmationData> confirmations)
{
foreach (var (button, confirmation) in confirmations)
{
ResetButton(button, confirmation);
}
confirmations.Clear();
}
public static bool TryConfirm(Button button, Dictionary<Button, ConfirmationData> confirmations)
{
if (RemoveConfirm(button, confirmations))
return true;
var data = new ConfirmationData(new CancellationTokenSource(), button.Text);
confirmations[button] = data;
Timer.Spawn(TimeSpan.FromSeconds(5), () =>
{
confirmations.Remove(button);
button.ModulateSelfOverride = null;
button.Text = data.OriginalText;
}, data.Cancellation.Token);
button.ModulateSelfOverride = StyleNano.ButtonColorCautionDefault;
button.Text = Loc.GetString("admin-player-actions-confirm");
return false;
}
}
public readonly record struct ConfirmationData(CancellationTokenSource Cancellation, string? OriginalText);

View file

@ -1,6 +1,7 @@
<Control
xmlns="https://spacestation14.io"
xmlns:cc="clr-namespace:Content.Client.Administration.UI.CustomControls">
xmlns:cc="clr-namespace:Content.Client.Administration.UI.CustomControls"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls">
<PanelContainer StyleClasses="BackgroundDark">
<SplitContainer Orientation="Vertical" ResizeMode="NotResizable">
<SplitContainer Orientation="Horizontal" VerticalExpand="True">
@ -18,9 +19,9 @@
<Control HorizontalExpand="True" />
<Button Visible="False" Name="Bans" Text="{Loc 'admin-player-actions-bans'}" StyleClasses="OpenRight" />
<Button Visible="False" Name="Notes" Text="{Loc 'admin-player-actions-notes'}" StyleClasses="OpenBoth" />
<Button Visible="False" Name="Kick" Text="{Loc 'admin-player-actions-kick'}" StyleClasses="OpenBoth" />
<controls:ConfirmButton Visible="False" Name="Kick" Text="{Loc 'admin-player-actions-kick'}" ConfirmationText="{Loc 'admin-player-actions-confirm'}" StyleClasses="OpenBoth" />
<Button Visible="False" Name="Ban" Text="{Loc 'admin-player-actions-ban'}" StyleClasses="OpenBoth" />
<Button Visible="False" Name="Respawn" Text="{Loc 'admin-player-actions-respawn'}" StyleClasses="OpenBoth" />
<controls:ConfirmButton Visible="False" Name="Respawn" Text="{Loc 'admin-player-actions-respawn'}" ConfirmationText="{Loc 'admin-player-actions-confirm'}" StyleClasses="OpenBoth" />
<Button Visible="False" Name="Follow" Text="{Loc 'admin-player-actions-follow'}" StyleClasses="OpenLeft" />
</BoxContainer>
</SplitContainer>

View file

@ -29,7 +29,6 @@ namespace Content.Client.Administration.UI.Bwoink
public AdminAHelpUIHandler AHelpHelper = default!;
private PlayerInfo? _currentPlayer;
private readonly Dictionary<Button, ConfirmationData> _confirmations = new();
public BwoinkControl()
{
@ -183,11 +182,6 @@ namespace Content.Client.Administration.UI.Bwoink
Kick.OnPressed += _ =>
{
if (!AdminUIHelpers.TryConfirm(Kick, _confirmations))
{
return;
}
// TODO: Reason field
if (_currentPlayer is not null)
_console.ExecuteCommand($"kick \"{_currentPlayer.Username}\"");
@ -201,11 +195,6 @@ namespace Content.Client.Administration.UI.Bwoink
Respawn.OnPressed += _ =>
{
if (!AdminUIHelpers.TryConfirm(Respawn, _confirmations))
{
return;
}
if (_currentPlayer is not null)
_console.ExecuteCommand($"respawn \"{_currentPlayer.Username}\"");
};

View file

@ -1,5 +1,6 @@
<Popup xmlns="https://spacestation14.io"
xmlns:gfx="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client">
xmlns:gfx="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls">
<PanelContainer>
<PanelContainer.PanelOverride>
<gfx:StyleBoxFlat BorderThickness="2" BorderColor="#18181B" BackgroundColor="#25252a"/>
@ -19,7 +20,7 @@
<BoxContainer Orientation="Horizontal">
<Button Name="EditButton" Text="{Loc admin-notes-edit}"/>
<Control HorizontalExpand="True"/>
<Button Name="DeleteButton" Text="{Loc admin-notes-delete}" HorizontalAlignment="Right"/>
<controls:ConfirmButton Name="DeleteButton" Text="{Loc admin-notes-delete}" ConfirmationText="{Loc 'admin-player-actions-confirm'}" HorizontalAlignment="Right"/>
</BoxContainer>
</BoxContainer>
</PanelContainer>

View file

@ -1,6 +1,7 @@
<DefaultWindow
xmlns="https://spacestation14.io"
xmlns:cc="clr-namespace:Content.Client.Administration.UI.CustomControls"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
Title="{Loc admin-player-actions-window-title}" MinSize="425 272">
<BoxContainer Orientation="Vertical">
<BoxContainer Orientation="Horizontal">
@ -10,9 +11,9 @@
</BoxContainer>
<cc:PlayerListControl Name="PlayerList" VerticalExpand="True" />
<BoxContainer Orientation="Horizontal">
<Button Name="SubmitKickButton" Text="{Loc admin-player-actions-kick}" Disabled="True"/>
<controls:ConfirmButton Name="SubmitKickButton" Text="{Loc admin-player-actions-kick}" ConfirmationText="{Loc 'admin-player-actions-confirm'}" Disabled="True"/>
<Button Name="SubmitAHelpButton" Text="{Loc admin-player-actions-ahelp}" Disabled="True"/>
<Button Name="SubmitRespawnButton" Text="{Loc admin-player-actions-respawn}" Disabled="True"/>
<controls:ConfirmButton Name="SubmitRespawnButton" Text="{Loc admin-player-actions-respawn}" ConfirmationText="{Loc 'admin-player-actions-confirm'}" Disabled="True"/>
</BoxContainer>
</BoxContainer>
</DefaultWindow>

View file

@ -14,7 +14,6 @@ namespace Content.Client.Administration.UI.Tabs.AdminTab
public sealed partial class PlayerActionsWindow : DefaultWindow
{
private PlayerInfo? _selectedPlayer;
private readonly Dictionary<Button, ConfirmationData> _confirmations = new();
public PlayerActionsWindow()
{
@ -28,9 +27,6 @@ namespace Content.Client.Administration.UI.Tabs.AdminTab
private void OnListOnOnSelectionChanged(PlayerInfo? obj)
{
if (_selectedPlayer != obj)
AdminUIHelpers.RemoveAllConfirms(_confirmations);
_selectedPlayer = obj;
var disableButtons = _selectedPlayer == null;
SubmitKickButton.Disabled = disableButtons;
@ -43,9 +39,6 @@ namespace Content.Client.Administration.UI.Tabs.AdminTab
if (_selectedPlayer == null)
return;
if (!AdminUIHelpers.TryConfirm(SubmitKickButton, _confirmations))
return;
IoCManager.Resolve<IClientConsoleHost>().ExecuteCommand(
$"kick \"{_selectedPlayer.Username}\" \"{CommandParsing.Escape(ReasonLine.Text)}\"");
}
@ -64,9 +57,6 @@ namespace Content.Client.Administration.UI.Tabs.AdminTab
if (_selectedPlayer == null)
return;
if (!AdminUIHelpers.TryConfirm(SubmitRespawnButton, _confirmations))
return;
IoCManager.Resolve<IClientConsoleHost>().ExecuteCommand(
$"respawn \"{_selectedPlayer.Username}\"");
}

View file

@ -13,7 +13,6 @@ public sealed partial class ObjectsTabEntry : PanelContainer
public Action<NetEntity>? OnTeleport;
public Action<NetEntity>? OnDelete;
private readonly Dictionary<Button, ConfirmationData> _confirmations = new();
public ObjectsTabEntry(IClientAdminManager manager, string name, NetEntity nent, StyleBox styleBox)
{
@ -28,13 +27,6 @@ public sealed partial class ObjectsTabEntry : PanelContainer
DeleteButton.Disabled = !manager.CanCommand("delete");
TeleportButton.OnPressed += _ => OnTeleport?.Invoke(nent);
DeleteButton.OnPressed += _ =>
{
if (!AdminUIHelpers.TryConfirm(DeleteButton, _confirmations))
{
return;
}
OnDelete?.Invoke(nent);
};
DeleteButton.OnPressed += _ => OnDelete?.Invoke(nent);
}
}

View file

@ -79,10 +79,28 @@ public sealed partial class CrewMonitoringWindow : FancyWindow
NoServerLabel.Visible = false;
// Collect one status per user, using the sensor with the most data available.
Dictionary<NetEntity, SuitSensorStatus> uniqueSensorsMap = new();
foreach (var sensor in sensors)
{
if (uniqueSensorsMap.TryGetValue(sensor.OwnerUid, out var existingSensor))
{
// Skip if we already have a sensor with more data for this mob.
if (existingSensor.Coordinates != null && sensor.Coordinates == null)
continue;
if (existingSensor.DamagePercentage != null && sensor.DamagePercentage == null)
continue;
}
uniqueSensorsMap[sensor.OwnerUid] = sensor;
}
var uniqueSensors = uniqueSensorsMap.Values.ToList();
// Order sensor data
var orderedSensors = sensors.OrderBy(n => n.Name).OrderBy(j => j.Job);
var orderedSensors = uniqueSensors.OrderBy(n => n.Name).OrderBy(j => j.Job);
var assignedSensors = new HashSet<SuitSensorStatus>();
var departments = sensors.SelectMany(d => d.JobDepartments).Distinct().OrderBy(n => n);
var departments = uniqueSensors.SelectMany(d => d.JobDepartments).Distinct().OrderBy(n => n);
// Create department labels and populate lists
foreach (var department in departments)

View file

@ -1,4 +1,3 @@
using System;
using System.IO;
using System.Threading.Tasks;
using Content.Client.Viewport;
@ -8,8 +7,6 @@ using Robust.Client.Input;
using Robust.Client.State;
using Robust.Shared.ContentPack;
using Robust.Shared.Input.Binding;
using Robust.Shared.IoC;
using Robust.Shared.Log;
using Robust.Shared.Utility;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
@ -25,8 +22,13 @@ namespace Content.Client.Screenshot
[Dependency] private readonly IResourceManager _resourceManager = default!;
[Dependency] private readonly IStateManager _stateManager = default!;
private ISawmill _sawmill = default!;
public void Initialize()
{
_sawmill = Logger.GetSawmill("screenshot");
_sawmill.Level = LogLevel.Info;
_inputManager.SetInputCommand(ContentKeyFunctions.TakeScreenshot, InputCmdHandler.FromDelegate(_ =>
{
_clyde.Screenshot(ScreenshotType.Final, Take);
@ -40,7 +42,7 @@ namespace Content.Client.Screenshot
}
else
{
Logger.InfoS("screenshot", "Can't take no-UI screenshot: current state is not GameScreen");
_sawmill.Info("Can't take no-UI screenshot: current state is not GameScreen");
}
}));
}
@ -74,16 +76,16 @@ namespace Content.Client.Screenshot
screenshot.SaveAsPng(file);
});
Logger.InfoS("screenshot", "Screenshot taken as {0}.png", filename);
_sawmill.Info("Screenshot taken as {0}.png", filename);
return;
}
catch (IOException e)
{
Logger.WarningS("screenshot", "Failed to save screenshot, retrying?:\n{0}", e);
_sawmill.Warning("Failed to save screenshot, retrying?:\n{0}", e);
}
}
Logger.ErrorS("screenshot", "Unable to save screenshot.");
_sawmill.Error("Unable to save screenshot.");
}
}

View file

@ -163,14 +163,16 @@ public sealed class ItemGridPiece : Control, IEntityControl
}
// typically you'd divide by two, but since the textures are half a tile, this is done implicitly
var iconPosition = new Vector2((boundingGrid.Width + 1) * size.X + itemComponent.StoredOffset.X * 2,
(boundingGrid.Height + 1) * size.Y + itemComponent.StoredOffset.Y * 2);
var iconOffset = Location.Rotation.RotateVec(itemComponent.StoredOffset) * 2 * UIScale;
var iconPosition = new Vector2(
(boundingGrid.Width + 1) * size.X + iconOffset.X,
(boundingGrid.Height + 1) * size.Y + iconOffset.Y);
var iconRotation = Location.Rotation + Angle.FromDegrees(itemComponent.StoredRotation);
if (itemComponent.StoredSprite is { } storageSprite)
{
var scale = 2 * UIScale;
var offset = (((Box2) boundingGrid).Size - Vector2.One) * size;
var offset = (((Box2) boundingGrid).Size - Vector2.One) * size + iconOffset;
var sprite = _entityManager.System<SpriteSystem>().Frame0(storageSprite);
var spriteBox = new Box2Rotated(new Box2(0f, sprite.Height * scale, sprite.Width * scale, 0f), -iconRotation, Vector2.Zero);

View file

@ -330,7 +330,12 @@ public sealed partial class AdminLogManager : SharedAdminLogManager, IAdminLogMa
var cachedInfo = adminSys.GetCachedPlayerInfo(new NetUserId(id));
if (cachedInfo != null && cachedInfo.Antag)
{
logMessage += " [ANTAG: " + cachedInfo.CharacterName + "]";
var subtype = Loc.GetString(cachedInfo.Subtype ?? cachedInfo.RoleProto.Name);
logMessage = Loc.GetString(
"admin-alert-antag-label",
("message", logMessage),
("name", cachedInfo.CharacterName),
("subtype", subtype));
}
}

View file

@ -406,7 +406,7 @@ public sealed class SuitSensorSystem : EntitySystem
totalDamageThreshold = critThreshold.Value.Int();
// finally, form suit sensor status
var status = new SuitSensorStatus(GetNetEntity(uid), userName, userJob, userJobIcon, userJobDepartments);
var status = new SuitSensorStatus(GetNetEntity(sensor.User.Value), GetNetEntity(uid), userName, userJob, userJobIcon, userJobDepartments);
switch (sensor.Mode)
{
case SuitSensorMode.SensorBinary:
@ -461,6 +461,7 @@ public sealed class SuitSensorSystem : EntitySystem
[SuitSensorConstants.NET_JOB_DEPARTMENTS] = status.JobDepartments,
[SuitSensorConstants.NET_IS_ALIVE] = status.IsAlive,
[SuitSensorConstants.NET_SUIT_SENSOR_UID] = status.SuitSensorUid,
[SuitSensorConstants.NET_OWNER_UID] = status.OwnerUid,
};
if (status.TotalDamage != null)
@ -491,13 +492,14 @@ public sealed class SuitSensorSystem : EntitySystem
if (!payload.TryGetValue(SuitSensorConstants.NET_JOB_DEPARTMENTS, out List<string>? jobDepartments)) return null;
if (!payload.TryGetValue(SuitSensorConstants.NET_IS_ALIVE, out bool? isAlive)) return null;
if (!payload.TryGetValue(SuitSensorConstants.NET_SUIT_SENSOR_UID, out NetEntity suitSensorUid)) return null;
if (!payload.TryGetValue(SuitSensorConstants.NET_OWNER_UID, out NetEntity ownerUid)) return null;
// try get total damage and cords (optionals)
payload.TryGetValue(SuitSensorConstants.NET_TOTAL_DAMAGE, out int? totalDamage);
payload.TryGetValue(SuitSensorConstants.NET_TOTAL_DAMAGE_THRESHOLD, out int? totalDamageThreshold);
payload.TryGetValue(SuitSensorConstants.NET_COORDINATES, out NetCoordinates? coords);
var status = new SuitSensorStatus(suitSensorUid, name, job, jobIcon, jobDepartments)
var status = new SuitSensorStatus(ownerUid, suitSensorUid, name, job, jobIcon, jobDepartments)
{
IsAlive = isAlive.Value,
TotalDamage = totalDamage,

View file

@ -15,6 +15,7 @@ using Content.Shared.Power.EntitySystems;
using Content.Shared.Power.Generation.Teg;
using Content.Shared.Rounding;
using Robust.Server.GameObjects;
using Robust.Shared.Utility;
namespace Content.Server.Power.Generation.Teg;
@ -260,13 +261,16 @@ public sealed class TegSystem : EntitySystem
// Otherwise, make sure circulator is set to nothing.
if (!group.IsFullyBuilt)
{
UpdateCirculatorAppearance(uid, false);
UpdateCirculatorAppearance((uid, component), false);
}
}
private void UpdateCirculatorAppearance(EntityUid uid, bool powered)
private void UpdateCirculatorAppearance(Entity<TegCirculatorComponent?> ent, bool powered)
{
var circ = Comp<TegCirculatorComponent>(uid);
if (!Resolve(ent, ref ent.Comp))
return;
var circ = ent.Comp;
TegCirculatorSpeed speed;
if (powered && circ.LastPressureDelta > 0 && circ.LastMolesTransferred > 0)
@ -281,13 +285,13 @@ public sealed class TegSystem : EntitySystem
speed = TegCirculatorSpeed.SpeedStill;
}
_appearance.SetData(uid, TegVisuals.CirculatorSpeed, speed);
_appearance.SetData(uid, TegVisuals.CirculatorPower, powered);
_appearance.SetData(ent, TegVisuals.CirculatorSpeed, speed);
_appearance.SetData(ent, TegVisuals.CirculatorPower, powered);
if (_pointLight.TryGetLight(uid, out var pointLight))
if (_pointLight.TryGetLight(ent, out var pointLight))
{
_pointLight.SetEnabled(uid, powered, pointLight);
_pointLight.SetColor(uid, speed == TegCirculatorSpeed.SpeedFast ? circ.LightColorFast : circ.LightColorSlow, pointLight);
_pointLight.SetEnabled(ent, powered, pointLight);
_pointLight.SetColor(ent, speed == TegCirculatorSpeed.SpeedFast ? circ.LightColorFast : circ.LightColorSlow, pointLight);
}
}

View file

@ -8,6 +8,7 @@ using Content.Shared.Damage;
using Content.Shared.Destructible;
using Content.Shared.DoAfter;
using Content.Shared.Emp;
using Content.Shared.IdentityManagement;
using Content.Shared.Popups;
using Content.Shared.Power;
using Content.Shared.Throwing;
@ -15,6 +16,7 @@ using Content.Shared.UserInterface;
using Content.Shared.VendingMachines;
using Content.Shared.Wall;
using Robust.Shared.Audio;
using Robust.Shared.Player;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
using Robust.Shared.Timing;
@ -141,7 +143,9 @@ namespace Content.Server.VendingMachines
TryRestockInventory(uid, component);
Popup.PopupEntity(Loc.GetString("vending-machine-restock-done", ("this", args.Args.Used), ("user", args.Args.User), ("target", uid)), args.Args.User, PopupType.Medium);
Popup.PopupEntity(Loc.GetString("vending-machine-restock-done-self", ("target", uid)), args.Args.User, args.Args.User, PopupType.Medium);
var othersFilter = Filter.PvsExcept(args.Args.User);
Popup.PopupEntity(Loc.GetString("vending-machine-restock-done-others", ("user", Identity.Entity(args.User, EntityManager)), ("target", uid)), args.Args.User, othersFilter, true, PopupType.Medium);
Audio.PlayPvs(restockComponent.SoundRestockDone, uid, AudioParams.Default.WithVolume(-2f).WithVariation(0.2f));

View file

@ -39,7 +39,8 @@ public sealed class ArtifactAnalyzerSystem : SharedArtifactAnalyzerSystem
sumResearch += research;
}
if (sumResearch == 0)
// 4-16-25: It's a sad day when a scientist makes negative 5k research
if (sumResearch <= 0)
return;
_research.ModifyServerPoints(server.Value, sumResearch, serverComponent);

View file

@ -55,6 +55,20 @@ public abstract class SharedItemSystem : EntitySystem
Dirty(uid, component);
}
/// <summary>
/// Sets the offset used for the item's sprite inside the storage UI.
/// Dirties.
/// </summary>
[PublicAPI]
public void SetStoredOffset(EntityUid uid, Vector2i newOffset, ItemComponent? component = null)
{
if (!Resolve(uid, ref component, false))
return;
component.StoredOffset = newOffset;
Dirty(uid, component);
}
public void SetHeldPrefix(EntityUid uid, string? heldPrefix, bool force = false, ItemComponent? component = null)
{
if (!Resolve(uid, ref component, false))

View file

@ -7,8 +7,9 @@ namespace Content.Shared.Medical.SuitSensor;
[Serializable, NetSerializable]
public sealed class SuitSensorStatus
{
public SuitSensorStatus(NetEntity suitSensorUid, string name, string job, string jobIcon, List<string> jobDepartments)
public SuitSensorStatus(NetEntity ownerUid, NetEntity suitSensorUid, string name, string job, string jobIcon, List<string> jobDepartments)
{
OwnerUid = ownerUid;
SuitSensorUid = suitSensorUid;
Name = name;
Job = job;
@ -18,6 +19,7 @@ public sealed class SuitSensorStatus
public TimeSpan Timestamp;
public NetEntity SuitSensorUid;
public NetEntity OwnerUid;
public string Name;
public string Job;
public string JobIcon;
@ -55,6 +57,7 @@ public enum SuitSensorMode : byte
public static class SuitSensorConstants
{
public const string NET_OWNER_UID = "ownerUid";
public const string NET_NAME = "name";
public const string NET_JOB = "job";
public const string NET_JOB_ICON = "jobIcon";

View file

@ -1,4 +1,5 @@
using Content.Shared.DoAfter;
using Content.Shared.IdentityManagement;
using Content.Shared.Interaction;
using Content.Shared.Popups;
using Content.Shared.Wires;
@ -72,8 +73,10 @@ public abstract partial class SharedVendingMachineSystem
if (!_doAfter.TryStartDoAfter(doAfterArgs))
return;
Popup.PopupPredicted(Loc.GetString("vending-machine-restock-start", ("this", uid), ("user", args.User),
("target", target)),
var selfMessage = Loc.GetString("vending-machine-restock-start-self", ("target", target));
var othersMessage = Loc.GetString("vending-machine-restock-start-others", ("user", Identity.Entity(args.User, EntityManager)), ("target", target));
Popup.PopupPredicted(selfMessage,
othersMessage,
uid,
args.User,
PopupType.Medium);

View file

@ -163,7 +163,7 @@ public abstract partial class SharedXenoArtifactSystem
if (ent.Comp.Locked)
return 0;
return ent.Comp.ResearchValue - ent.Comp.ConsumedResearchValue;
return Math.Max(0, ent.Comp.ResearchValue - ent.Comp.ConsumedResearchValue);
}
/// <summary>

View file

@ -1057,5 +1057,13 @@ Entries:
id: 128
time: '2025-04-16T17:04:48.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/35359
- author: Errant
changes:
- message: Antag tags on admin notices now show exactly what kind of antag that
mob is.
type: Tweak
id: 129
time: '2025-04-16T22:59:36.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/36640
Name: Admin
Order: 1

View file

@ -1,48 +1,4 @@
Entries:
- author: Southbridge
changes:
- message: Paper documents now support the [mono] tag.
type: Add
id: 7703
time: '2024-12-13T14:24:35.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/33830
- author: yuitop
changes:
- message: Anchoring now has higher priority over stashing.
type: Tweak
id: 7704
time: '2024-12-13T23:00:46.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/31779
- author: Nimfar11
changes:
- message: Changes the colour of the Borg binary channel to a different shade of
blue.
type: Tweak
id: 7705
time: '2024-12-14T16:03:18.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/33841
- author: Litraxx
changes:
- message: Renamed the Dungeon Master lawset to Game Master lawset
type: Fix
id: 7706
time: '2024-12-16T11:52:03.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/33678
- author: psykana
changes:
- message: Zombies can now see initial infected
type: Add
id: 7707
time: '2024-12-16T11:53:13.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/33665
- author: Plykiya
changes:
- message: Bombs like stingers and clustergrenades now trigger when destroyed due
to damage.
type: Fix
id: 7708
time: '2024-12-16T12:08:08.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/31108
- author: Beck Thompson
changes:
- message: Added some new scrap that contains uranium and plasma that can be found
@ -3910,3 +3866,46 @@
id: 8202
time: '2025-04-16T20:26:25.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/34955
- author: ciaran
changes:
- message: Fixed duplicate crew monitor console entries for crew with tracking implants
type: Fix
id: 8203
time: '2025-04-16T21:14:05.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/35918
- author: Seam_Less
changes:
- message: Standardized the In-Hand Sprites for all gloves
type: Tweak
id: 8204
time: '2025-04-16T22:15:38.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/35997
- author: DissidentBullet
changes:
- message: Monkeys can now wear juggernaut suits
type: Add
id: 8205
time: '2025-04-16T23:14:28.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/34121
- author: SpaceRox1244
changes:
- message: Cargo can now order handheld artifact containers for transporting small
artifacts.
type: Add
id: 8206
time: '2025-04-16T23:35:57.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/33327
- author: ScarKy0
changes:
- message: Hydroponics tray flatpacks can now be bought for 750 spesos.
type: Add
id: 8207
time: '2025-04-16T23:51:00.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/36630
- author: EmoGarbage404
changes:
- message: Fixed artifacts sometimes having negative research values.
type: Fix
id: 8208
time: '2025-04-17T03:14:17.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/36642

View file

@ -1,3 +1,4 @@
admin-alert-shared-connection = {$player} is sharing a connection with {$otherCount} connected player(s): {$otherList}
admin-alert-ipintel-blocked = {$player} was rejected from joining due to their IP having a {TOSTRING($percent, "P2")} confidence of being a VPN/Datacenter.
admin-alert-ipintel-warning = {$player} IP has a {TOSTRING($percent, "P2")} confidence of being a VPN/Datacenter. Please watch them.
admin-alert-antag-label = {$message} [ANTAG: {$name}, {$subtype}]

View file

@ -1,4 +1,6 @@
vending-machine-restock-invalid-inventory = { CAPITALIZE(THE($this)) } isn't the right package to restock { THE($target) }.
vending-machine-restock-needs-panel-open = { CAPITALIZE($target) } needs { POSS-ADJ($target) } maintenance panel opened first.
vending-machine-restock-start = { $user } starts restocking { $target }.
vending-machine-restock-done = { $user } finishes restocking { $target }.
vending-machine-restock-needs-panel-open = { CAPITALIZE(THE($target)) } needs { POSS-ADJ($target) } maintenance panel opened first.
vending-machine-restock-start-self = You start restocking { THE($target) }.
vending-machine-restock-start-others = { CAPITALIZE(THE($user)) } starts restocking { THE($target) }.
vending-machine-restock-done-self = You finish restocking { THE($target) }.
vending-machine-restock-done-others = { CAPITALIZE(THE($user)) } finishes restocking { THE($target) }.

View file

@ -47,3 +47,13 @@
cost: 750
category: cargoproduct-category-name-hydroponics
group: market
- type: cargoProduct
id: HydroponicsTray
icon:
sprite: Structures/Hydroponics/containers.rsi
state: hydrotray3
product: CrateHydroponicsTray
cost: 750
category: cargoproduct-category-name-hydroponics
group: market

View file

@ -8,6 +8,16 @@
category: cargoproduct-category-name-science
group: market
- type: cargoProduct
id: HandheldArtifactContainer
icon:
sprite: Objects/Storage/artifact_container.rsi
state: icon
product: HandheldArtifactContainer
cost: 500
category: cargoproduct-category-name-science
group: market
- type: cargoProduct
id: RandomArtifact
icon:

View file

@ -94,3 +94,13 @@
- id: WatermelonSeeds
- id: PeaSeeds
- id: CherrySeeds
- type: entity
id: CrateHydroponicsTray
parent: CrateHydroponics
name: hydroponics tray crate
description: Contains a hydroponics tray flatpack.
components:
- type: StorageFill
contents:
- id: HydroponicsTrayFlatpack

View file

@ -737,6 +737,9 @@
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitCybersun
- type: Tag
tags:
- MonkeyWearable
#Wizard Hardsuit
- type: entity

View file

@ -250,3 +250,19 @@
components:
- type: Flatpack
entity: ComputerCrewMonitoring
- type: entity
parent: BaseFlatpack
id: HydroponicsTrayFlatpack
name: hydroponics tray flatpack
description: A flatpack used for constructing a hydroponics tray.
components:
- type: Flatpack
entity: hydroponicsTray
- type: Sprite
layers:
- state: hydroponics-tray
- type: GuideHelp
guides:
- Botany
- Chemicals

View file

@ -100,7 +100,6 @@
enum.PaperLabelVisuals.Layer:
True: { offset: "0.0,0.3125" }
False: { offset: "0.0,0.0" }
- type: LockVisuals
- type: ItemSlots
- type: ContainerContainer
@ -109,3 +108,93 @@
paper_label: !type:ContainerSlot
- type: StaticPrice
price: 250
- type: entity
parent: BaseStorageItem
id: HandheldArtifactContainer
name: handheld artifact container
description: A handheld case used to safely contain and move small artifacts.
components:
- type: Sprite
sprite: Objects/Storage/artifact_container.rsi
state: icon
layers:
- state: icon
map: [ base ]
- state: locked
map: ["enum.LockVisualLayers.Lock"]
shader: unshaded
- type: Storage
maxItemSize: Normal
grid:
- 0,0,1,1
whitelist:
components:
- Artifact
- type: Item
sprite: Objects/Storage/artifact_container.rsi
size: Huge
- type: MeleeWeapon
damage:
types:
Blunt: 12
soundHit:
path: "/Audio/Weapons/smash.ogg"
- type: Appearance
- type: AccessReader
access: [["Research"], ["Cargo"]]
- type: Lock
- type: SuppressArtifactContainer
- type: RadiationBlockingContainer
resistance: 5
- type: EmitSoundOnLand
sound:
path: /Audio/Items/toolbox_drop.ogg
- type: LockVisuals
- type: Damageable
damageContainer: StructuralInorganic
damageModifierSet: StructuralMetallicStrong
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 50
behaviors:
- !type:DoActsBehavior
acts: ["Destruction"]
- type: PaperLabel
labelSlot:
insertVerbText: Attach Label
ejectVerbText: Remove Label
whitelist:
components:
- Paper
blacklist:
tags:
- Book
- type: GenericVisualizer
visuals:
enum.StorageVisuals.Open:
base:
True: { state: icon-open }
False: { state: icon }
enum.PaperLabelVisuals.HasLabel:
enum.PaperLabelVisuals.Layer:
True: { visible: true }
False: { visible: false }
enum.PaperLabelVisuals.LabelType:
enum.PaperLabelVisuals.Layer:
Paper: { state: paper }
Bounty: { state: bounty }
CaptainsPaper: { state: captain }
Invoice: { state: invoice }
- type: ItemSlots
- type: ContainerContainer
containers:
paper_label: !type:ContainerSlot
storagebase: !type:Container
ents: []
- type: UseDelay
delay: 0.3
- type: StaticPrice
price: 250

Binary file not shown.

Before

Width:  |  Height:  |  Size: 205 B

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 B

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -23,4 +23,4 @@
"directions": 4
}
]
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 B

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 225 B

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -23,4 +23,4 @@
"directions": 4
}
]
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 291 B

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 294 B

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e",
"copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e. Inhand sprites by SeamLesss (Github)",
"size": {
"x": 32,
"y": 32

Binary file not shown.

Before

Width:  |  Height:  |  Size: 527 B

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 513 B

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/2fea0a59470c476cf3f927833d3918d89cbe6af8",
"copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/pull/69842/commits/d8138946b0ed06fced522729ac8eaa0596864329, edited by Skarletto (github). Inhand sprites by SeamLesss (Github)",
"size": {
"x": 32,
"y": 32

Binary file not shown.

Before

Width:  |  Height:  |  Size: 205 B

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 B

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 205 B

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 B

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -23,4 +23,4 @@
"directions": 4
}
]
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 291 B

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 294 B

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -1 +1,27 @@
{"version": 1, "license": "CC-BY-SA-3.0", "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/2fea0a59470c476cf3f927833d3918d89cbe6af8, edited by Discord .kreks.", "size": {"x": 32, "y": 32}, "states": [{"name": "icon"}, {"name": "equipped-HAND", "directions": 4}, {"name": "inhand-left", "directions": 4}, {"name": "inhand-right", "directions": 4}]}
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e. Inhand sprites by SeamLesss (Github)",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "icon"
},
{
"name": "equipped-HAND",
"directions": 4
},
{
"name": "inhand-left",
"directions": 4
},
{
"name": "inhand-right",
"directions": 4
}
]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 450 B

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 451 B

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Taken from paradise station at https://github.com/ss220-space/Paradise/blob/e13af16eec39b663112e014901960c89fb09ef8b/icons/obj/clothing/gloves.dmi",
"copyright": "Taken from paradise station at https://github.com/ss220-space/Paradise/blob/e13af16eec39b663112e014901960c89fb09ef8b/icons/obj/clothing/gloves.dmi. Inhand sprites by SeamLesss (Github)",
"size": {
"x": 32,
"y": 32

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Drawn by Ubaser",
"copyright": "Drawn by Ubaser. Inhand sprites by SeamLesss (Github)",
"size": {
"x": 32,
"y": 32

Binary file not shown.

Before

Width:  |  Height:  |  Size: 314 B

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 333 B

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 B

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 225 B

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 437 B

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 444 B

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -23,4 +23,4 @@
"directions": 4
}
]
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 278 B

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 286 B

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "modified sprite from Jackal298 based on the sprite from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e and paradise station https://github.com/ParadiseSS13/Paradise/blob/master/icons/obj/clothing/gloves.dmi",
"copyright": "modified sprite from Jackal298 based on the sprite from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e and paradise station https://github.com/ParadiseSS13/Paradise/blob/master/icons/obj/clothing/gloves.dmi. Inhand sprites by SeamLesss (Github)",
"size": {
"x": 32,
"y": 32

Binary file not shown.

Before

Width:  |  Height:  |  Size: 278 B

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 286 B

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -23,4 +23,4 @@
"directions": 4
}
]
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 249 B

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 254 B

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/pull/37864/commits/efdef3f1f997d1c0575c36cd31a5db575d1df0ca#diff-a4eb7c89f7231f0aaf0c2f69d730dea56383019f2aa5c6a1d91a82c781b528e6. Modified by hercoyote23 (github) for SS14",
"copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/pull/37864/commits/efdef3f1f997d1c0575c36cd31a5db575d1df0ca#diff-a4eb7c89f7231f0aaf0c2f69d730dea56383019f2aa5c6a1d91a82c781b528e6. Modified by hercoyote23 (github) for SS14, inhand sprites by SeamLesss (Github)",
"size": {
"x": 32,
"y": 32

Binary file not shown.

Before

Width:  |  Height:  |  Size: 463 B

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 461 B

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Taken from cev-eris at commit https://github.com/discordia-space/CEV-Eris/commit/55d823b97dda098a1b2ee9edfca7155c753e456e",
"copyright": "Taken from cev-eris at commit https://github.com/discordia-space/CEV-Eris/commit/55d823b97dda098a1b2ee9edfca7155c753e456e. Inhand sprites by SeamLesss (Github)",
"size": {
"x": 32,
"y": 32

Binary file not shown.

Before

Width:  |  Height:  |  Size: 462 B

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 458 B

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -23,4 +23,4 @@
"directions": 4
}
]
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 403 B

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 411 B

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 205 B

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 B

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e",
"copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e. Inhand sprites by SeamLesss (Github)",
"size": {
"x": 32,
"y": 32

Binary file not shown.

Before

Width:  |  Height:  |  Size: 408 B

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 416 B

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -36,6 +36,10 @@
{
"name": "on-equipped-HELMET-vox",
"directions": 4
},
{
"name": "equipped-HELMET-monkey",
"directions": 4
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View file

@ -22,6 +22,10 @@
"name": "equipped-OUTERCLOTHING-vox",
"directions": 4
},
{
"name": "equipped-OUTERCLOTHING-monkey",
"directions": 4
},
{
"name": "inhand-left",
"directions": 4

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 523 B

View file

@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "From user named CAROU in Discord",
"copyright": "From user named CAROU in Discord, purple_snake & dead_purple_snake edited by mubururu_ (github)",
"size": {
"x": 32,
"y": 32
@ -11,42 +11,10 @@
"name": "purple_snake",
"directions": 4,
"delays": [
[
0.3,
0.2,
0.2,
0.4,
0.2,
0.2,
0.3
],
[
0.3,
0.2,
0.2,
0.4,
0.2,
0.2,
0.3
],
[
0.3,
0.2,
0.2,
0.4,
0.2,
0.2,
0.3
],
[
0.3,
0.2,
0.2,
0.4,
0.2,
0.2,
0.3
]
[ 0.3, 0.2, 0.2, 0.4, 0.2, 0.2, 0.3 ],
[ 0.3, 0.2, 0.2, 0.4, 0.2, 0.2, 0.3 ],
[ 0.3, 0.2, 0.2, 0.4, 0.2, 0.2, 0.3 ],
[ 0.3, 0.2, 0.2, 0.4, 0.2, 0.2, 0.3 ]
]
},
{
@ -56,42 +24,10 @@
"name": "small_purple_snake",
"directions": 4,
"delays": [
[
0.3,
0.2,
0.2,
0.4,
0.2,
0.2,
0.3
],
[
0.3,
0.2,
0.2,
0.4,
0.2,
0.2,
0.3
],
[
0.3,
0.2,
0.2,
0.4,
0.2,
0.2,
0.3
],
[
0.3,
0.2,
0.2,
0.4,
0.2,
0.2,
0.3
]
[ 0.3, 0.2, 0.2, 0.4, 0.2, 0.2, 0.3 ],
[ 0.3, 0.2, 0.2, 0.4, 0.2, 0.2, 0.3 ],
[ 0.3, 0.2, 0.2, 0.4, 0.2, 0.2, 0.3 ],
[ 0.3, 0.2, 0.2, 0.4, 0.2, 0.2, 0.3 ]
]
},
{

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

View file

@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC0-1.0",
"copyright": "Created by EmoGarbage404 (github) for SS14, solar-assembly-part taken from tgstation and modified at https://tgstation13.org/wiki/Guide_to_construction#Solar_Panels_and_Trackers, ame-part taken from vgstation at https://github.com/vgstation-coders/vgstation13/commit/1b7952787c06c21ef1623e494dcfe7cb1f46e041; singularity-generator, tesla-generator, radiation-collector, containment-field-generator, tesla-coil, grounding-rod inner icons made by lzk228; emitter made by pigeonpeas. fax-machine made by moomoobeef, modified by ps3moira",
"copyright": "Created by EmoGarbage404 (github) for SS14, solar-assembly-part taken from tgstation and modified at https://tgstation13.org/wiki/Guide_to_construction#Solar_Panels_and_Trackers, ame-part taken from vgstation at https://github.com/vgstation-coders/vgstation13/commit/1b7952787c06c21ef1623e494dcfe7cb1f46e041; singularity-generator, tesla-generator, radiation-collector, containment-field-generator, tesla-coil, grounding-rod inner icons made by lzk228; emitter made by pigeonpeas. fax-machine made by moomoobeef, modified by ps3moira. hydroponics-tray modified by ScarKy0 (Github).",
"size": {
"x": 32,
"y": 32
@ -45,6 +45,9 @@
},
{
"name": "fax-machine"
},
{
"name": "hydroponics-tray"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 632 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 520 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 593 B

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