Merge remote-tracking branch 'refs/remotes/upstream/master' into upstream-sync

# Conflicts:
#	.github/labeler.yml
#	Content.Server/Administration/Systems/AdminSystem.cs
#	Content.Shared/Chat/TypingIndicator/TypingChangedEvent.cs
This commit is contained in:
Morb0
2024-07-11 04:43:23 +03:00
79 changed files with 8292 additions and 8669 deletions
+3 -3
View File
@@ -5,9 +5,9 @@
"Changes: Map":
- changed-files:
- any-glob-to-any-file:
- 'Resources/Maps/*.yml'
- 'Resources/Prototypes/Maps/*.yml'
- 'Resources/Prototypes/Corvax/Maps/*.yml'
- 'Resources/Maps/**/*.yml'
- 'Resources/Prototypes/Maps/**/*.yml'
- 'Resources/Prototypes/Corvax/Maps/**/*.yml'
"Changes: UI":
- changed-files:
@@ -6,8 +6,7 @@
xmlns:tabs="clr-namespace:Content.Client.Administration.UI.Tabs"
xmlns:playerTab="clr-namespace:Content.Client.Administration.UI.Tabs.PlayerTab"
xmlns:objectsTab="clr-namespace:Content.Client.Administration.UI.Tabs.ObjectsTab"
xmlns:panic="clr-namespace:Content.Client.Administration.UI.Tabs.PanicBunkerTab"
xmlns:baby="clr-namespace:Content.Client.Administration.UI.Tabs.BabyJailTab">
xmlns:panic="clr-namespace:Content.Client.Administration.UI.Tabs.PanicBunkerTab">
<TabContainer Name="MasterTabContainer">
<adminTab:AdminTab />
<adminbusTab:AdminbusTab />
@@ -15,7 +14,6 @@
<tabs:RoundTab />
<tabs:ServerTab />
<panic:PanicBunkerTab Name="PanicBunkerControl" Access="Public" />
<baby:BabyJailTab Name="BabyJailControl" Access="Public" />
<playerTab:PlayerTab Name="PlayerTabControl" Access="Public" />
<objectsTab:ObjectsTab Name="ObjectsTabControl" Access="Public" />
</TabContainer>
@@ -15,18 +15,14 @@ public sealed partial class AdminMenuWindow : DefaultWindow
MinSize = new Vector2(650, 250);
Title = Loc.GetString("admin-menu-title");
RobustXamlLoader.Load(this);
MasterTabContainer.SetTabTitle((int) TabIndex.Admin, Loc.GetString("admin-menu-admin-tab"));
MasterTabContainer.SetTabTitle((int) TabIndex.Adminbus, Loc.GetString("admin-menu-adminbus-tab"));
MasterTabContainer.SetTabTitle((int) TabIndex.Atmos, Loc.GetString("admin-menu-atmos-tab"));
MasterTabContainer.SetTabTitle((int) TabIndex.Round, Loc.GetString("admin-menu-round-tab"));
MasterTabContainer.SetTabTitle((int) TabIndex.Server, Loc.GetString("admin-menu-server-tab"));
MasterTabContainer.SetTabTitle((int) TabIndex.PanicBunker, Loc.GetString("admin-menu-panic-bunker-tab"));
/*
* TODO: Remove baby jail code once a more mature gateway process is established. This code is only being issued as a stopgap to help with potential tiding in the immediate future.
*/
MasterTabContainer.SetTabTitle((int) TabIndex.BabyJail, Loc.GetString("admin-menu-baby-jail-tab"));
MasterTabContainer.SetTabTitle((int) TabIndex.Players, Loc.GetString("admin-menu-players-tab"));
MasterTabContainer.SetTabTitle((int) TabIndex.Objects, Loc.GetString("admin-menu-objects-tab"));
MasterTabContainer.SetTabTitle(0, Loc.GetString("admin-menu-admin-tab"));
MasterTabContainer.SetTabTitle(1, Loc.GetString("admin-menu-adminbus-tab"));
MasterTabContainer.SetTabTitle(2, Loc.GetString("admin-menu-atmos-tab"));
MasterTabContainer.SetTabTitle(3, Loc.GetString("admin-menu-round-tab"));
MasterTabContainer.SetTabTitle(4, Loc.GetString("admin-menu-server-tab"));
MasterTabContainer.SetTabTitle(5, Loc.GetString("admin-menu-panic-bunker-tab"));
MasterTabContainer.SetTabTitle(6, Loc.GetString("admin-menu-players-tab"));
MasterTabContainer.SetTabTitle(7, Loc.GetString("admin-menu-objects-tab"));
MasterTabContainer.OnTabChanged += OnTabChanged;
}
@@ -1,6 +0,0 @@
<controls:BabyJailStatusWindow
xmlns="https://spacestation14.io"
xmlns:controls="clr-namespace:Content.Client.Administration.UI.Tabs.BabyJailTab"
Title="{Loc admin-ui-baby-jail-window-title}">
<RichTextLabel Name="MessageLabel" Access="Public" />
</controls:BabyJailStatusWindow>
@@ -1,21 +0,0 @@
using Content.Client.Message;
using Content.Client.UserInterface.Controls;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
namespace Content.Client.Administration.UI.Tabs.BabyJailTab;
/*
* TODO: Remove me once a more mature gateway process is established. This code is only being issued as a stopgap to help with potential tiding in the immediate future.
*/
[GenerateTypedNameReferences]
public sealed partial class BabyJailStatusWindow : FancyWindow
{
public BabyJailStatusWindow()
{
RobustXamlLoader.Load(this);
MessageLabel.SetMarkup(Loc.GetString("admin-ui-baby-jail-is-enabled"));
}
}
@@ -1,26 +0,0 @@
<controls:BabyJailTab
xmlns="https://spacestation14.io"
xmlns:controls="clr-namespace:Content.Client.Administration.UI.Tabs.BabyJailTab"
xmlns:cc="clr-namespace:Content.Client.Administration.UI.CustomControls"
Margin="4">
<BoxContainer Orientation="Vertical">
<cc:CommandButton Name="EnabledButton" Command="babyjail" ToggleMode="True"
Text="{Loc admin-ui-baby-jail-disabled}"
ToolTip="{Loc admin-ui-baby-jail-tooltip}" />
<cc:CommandButton Name="ShowReasonButton" Command="babyjail_show_reason"
ToggleMode="True" Text="{Loc admin-ui-baby-jail-show-reason}"
ToolTip="{Loc admin-ui-baby-jail-show-reason-tooltip}" />
<BoxContainer Orientation="Vertical" Margin="0 10 0 0">
<BoxContainer Orientation="Horizontal" Margin="2">
<Label Text="{Loc admin-ui-baby-jail-max-account-age}" MinWidth="175" />
<LineEdit Name="MaxAccountAge" MinWidth="50" Margin="0 0 5 0" />
<Label Text="{Loc generic-minutes}" />
</BoxContainer>
<BoxContainer Orientation="Horizontal" Margin="2">
<Label Text="{Loc admin-ui-baby-jail-max-overall-minutes}" MinWidth="175" />
<LineEdit Name="MaxOverallMinutes" MinWidth="50" Margin="0 0 5 0" />
<Label Text="{Loc generic-minutes}" />
</BoxContainer>
</BoxContainer>
</BoxContainer>
</controls:BabyJailTab>
@@ -1,75 +0,0 @@
using Content.Shared.Administration.Events;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Console;
/*
* TODO: Remove me once a more mature gateway process is established. This code is only being issued as a stopgap to help with potential tiding in the immediate future.
*/
namespace Content.Client.Administration.UI.Tabs.BabyJailTab;
[GenerateTypedNameReferences]
public sealed partial class BabyJailTab : Control
{
[Dependency] private readonly IConsoleHost _console = default!;
private string _maxAccountAge;
private string _maxOverallMinutes;
public BabyJailTab()
{
RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
MaxAccountAge.OnTextEntered += args => SendMaxAccountAge(args.Text);
MaxAccountAge.OnFocusExit += args => SendMaxAccountAge(args.Text);
_maxAccountAge = MaxAccountAge.Text;
MaxOverallMinutes.OnTextEntered += args => SendMaxOverallMinutes(args.Text);
MaxOverallMinutes.OnFocusExit += args => SendMaxOverallMinutes(args.Text);
_maxOverallMinutes = MaxOverallMinutes.Text;
}
private void SendMaxAccountAge(string text)
{
if (string.IsNullOrWhiteSpace(text) ||
text == _maxAccountAge ||
!int.TryParse(text, out var minutes))
{
return;
}
_console.ExecuteCommand($"babyjail_max_account_age {minutes}");
}
private void SendMaxOverallMinutes(string text)
{
if (string.IsNullOrWhiteSpace(text) ||
text == _maxOverallMinutes ||
!int.TryParse(text, out var minutes))
{
return;
}
_console.ExecuteCommand($"babyjail_max_overall_minutes {minutes}");
}
public void UpdateStatus(BabyJailStatus status)
{
EnabledButton.Pressed = status.Enabled;
EnabledButton.Text = Loc.GetString(status.Enabled
? "admin-ui-baby-jail-enabled"
: "admin-ui-baby-jail-disabled"
);
EnabledButton.ModulateSelfOverride = status.Enabled ? Color.Red : null;
ShowReasonButton.Pressed = status.ShowReason;
MaxAccountAge.Text = status.MaxAccountAgeMinutes.ToString();
_maxAccountAge = MaxAccountAge.Text;
MaxOverallMinutes.Text = status.MaxOverallMinutes.ToString();
_maxOverallMinutes = MaxOverallMinutes.Text;
}
}
@@ -2,21 +2,36 @@
using Robust.Client.GameObjects;
using Robust.Client.Graphics;
using Robust.Shared.Prototypes;
using Content.Shared.Inventory;
namespace Content.Client.Chat.TypingIndicator;
public sealed class TypingIndicatorVisualizerSystem : VisualizerSystem<TypingIndicatorComponent>
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly InventorySystem _inventory = default!;
protected override void OnAppearanceChange(EntityUid uid, TypingIndicatorComponent component, ref AppearanceChangeEvent args)
{
if (args.Sprite == null)
return;
if (!_prototypeManager.TryIndex<TypingIndicatorPrototype>(component.Prototype, out var proto))
var currentTypingIndicator = component.TypingIndicatorPrototype;
var evt = new BeforeShowTypingIndicatorEvent();
if (TryComp<InventoryComponent>(uid, out var inventoryComp))
_inventory.RelayEvent((uid, inventoryComp), ref evt);
var overrideIndicator = evt.GetMostRecentIndicator();
if (overrideIndicator != null)
currentTypingIndicator = overrideIndicator.Value;
if (!_prototypeManager.TryIndex(currentTypingIndicator, out var proto))
{
Log.Error($"Unknown typing indicator id: {component.Prototype}");
Log.Error($"Unknown typing indicator id: {component.TypingIndicatorPrototype}");
return;
}
+1 -1
View File
@@ -16,7 +16,7 @@ public sealed class AdminFaxEui : BaseEui
_window.OnClose += () => SendMessage(new AdminFaxEuiMsg.Close());
_window.OnFollowFax += entity => SendMessage(new AdminFaxEuiMsg.Follow(entity));
_window.OnMessageSend += args => SendMessage(new AdminFaxEuiMsg.Send(args.entity, args.title,
args.stampedBy, args.message, args.stampSprite, args.stampColor));
args.stampedBy, args.message, args.stampSprite, args.stampColor, args.locked));
}
public override void Opened()
@@ -23,7 +23,7 @@
</BoxContainer>
<Label Text="{Loc admin-fax-stamp-color}" />
<ColorSelectorSliders Margin="12 0 0 0" Name="StampColorSelector" Color="#BB3232"/>
<Control MinHeight="10" />
<Button Name="SendButton" Text="{Loc admin-fax-send}"></Button>
<CheckBox Name="LockPageCheckbox" Text="{Loc admin-fax-lock-page}" ToolTip="{Loc admin-fax-lock-page-tooltip}"/>
<Button Name="SendButton" Text="{Loc admin-fax-send}" Margin="0 10 0 0" />
</BoxContainer>
</DefaultWindow>
@@ -14,7 +14,7 @@ public sealed partial class AdminFaxWindow : DefaultWindow
{
private const string StampsRsiPath = "/Textures/Objects/Misc/bureaucracy.rsi";
public Action<(NetEntity entity, string title, string stampedBy, string message, string stampSprite, Color stampColor)>? OnMessageSend;
public Action<(NetEntity entity, string title, string stampedBy, string message, string stampSprite, Color stampColor, bool locked)>? OnMessageSend;
public Action<NetEntity>? OnFollowFax;
[Dependency] private readonly IResourceCache _resCache = default!;
@@ -98,6 +98,7 @@ public sealed partial class AdminFaxWindow : DefaultWindow
var from = FromEdit.Text;
var stampColor = StampColorSelector.Color;
OnMessageSend?.Invoke((faxEntity.Value, title, from, message, stamp, stampColor));
var locked = LockPageCheckbox.Pressed;
OnMessageSend?.Invoke((faxEntity.Value, title, from, message, stamp, stampColor, locked));
}
}
+49 -6
View File
@@ -47,6 +47,7 @@ public sealed partial class LobbyUIController : UIController, IOnStateEntered<Lo
private CharacterSetupGui? _characterSetup;
private HumanoidProfileEditor? _profileEditor;
private CharacterSetupGuiSavePanel? _savePanel;
/// <summary>
/// This is the characher preview panel in the chat. This should only update if their character updates.
@@ -215,6 +216,46 @@ public sealed partial class LobbyUIController : UIController, IOnStateEntered<Lo
ReloadCharacterSetup();
}
private void CloseProfileEditor()
{
if (_profileEditor == null)
return;
_profileEditor.SetProfile(null, null);
_profileEditor.Visible = false;
if (_stateManager.CurrentState is LobbyState lobbyGui)
{
lobbyGui.SwitchState(LobbyGui.LobbyGuiState.Default);
}
}
private void OpenSavePanel()
{
if (_savePanel is { IsOpen: true })
return;
_savePanel = new CharacterSetupGuiSavePanel();
_savePanel.SaveButton.OnPressed += _ =>
{
SaveProfile();
_savePanel.Close();
CloseProfileEditor();
};
_savePanel.NoSaveButton.OnPressed += _ =>
{
_savePanel.Close();
CloseProfileEditor();
};
_savePanel.OpenCentered();
}
private (CharacterSetupGui, HumanoidProfileEditor) EnsureGui()
{
if (_characterSetup != null && _profileEditor != null)
@@ -241,14 +282,16 @@ public sealed partial class LobbyUIController : UIController, IOnStateEntered<Lo
_characterSetup.CloseButton.OnPressed += _ =>
{
// Reset sliders etc.
_profileEditor.SetProfile(null, null);
_profileEditor.Visible = false;
if (_stateManager.CurrentState is LobbyState lobbyGui)
// Open the save panel if we have unsaved changes.
if (_profileEditor.Profile != null && _profileEditor.IsDirty)
{
lobbyGui.SwitchState(LobbyGui.LobbyGuiState.Default);
OpenSavePanel();
return;
}
// Reset sliders etc.
CloseProfileEditor();
};
_profileEditor.Save += SaveProfile;
@@ -0,0 +1,10 @@
<DefaultWindow xmlns="https://spacestation14.io"
Title="{Loc 'character-setup-gui-save-panel-title'}"
Resizable="False">
<BoxContainer Orientation="Horizontal" SeparationOverride="4" MinSize="200 40">
<Button Name="SaveButton" Access="Public" Text="{Loc 'character-setup-gui-save-panel-save'}" StyleClasses="ButtonBig"/>
<Button Name="NoSaveButton" Access="Public" Text="{Loc 'character-setup-gui-save-panel-nosave'}" StyleClasses="ButtonBig"/>
<Button Name="CancelButton" Access="Public" Text="{Loc 'character-setup-gui-save-panel-cancel'}" StyleClasses="ButtonBig"/>
</BoxContainer>
</DefaultWindow>
@@ -0,0 +1,21 @@
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
namespace Content.Client.Lobby.UI;
[GenerateTypedNameReferences]
public sealed partial class CharacterSetupGuiSavePanel : DefaultWindow
{
public CharacterSetupGuiSavePanel()
{
RobustXamlLoader.Load(this);
CancelButton.OnPressed += _ =>
{
Close();
};
CloseButton.Visible = false;
}
}
@@ -1213,7 +1213,7 @@ namespace Content.Client.Lobby.UI
SetDirty();
}
private bool IsDirty
public bool IsDirty
{
get => _isDirty;
set
@@ -3,7 +3,6 @@ using Content.Client.Administration.Systems;
using Content.Client.Administration.UI;
using Content.Client.Administration.UI.Tabs.ObjectsTab;
using Content.Client.Administration.UI.Tabs.PanicBunkerTab;
using Content.Client.Administration.UI.Tabs.BabyJailTab;
using Content.Client.Administration.UI.Tabs.PlayerTab;
using Content.Client.Gameplay;
using Content.Client.Lobby;
@@ -38,13 +37,11 @@ public sealed class AdminUIController : UIController,
private AdminMenuWindow? _window;
private MenuButton? AdminButton => UIManager.GetActiveUIWidgetOrNull<MenuBar.Widgets.GameTopMenuBar>()?.AdminButton;
private PanicBunkerStatus? _panicBunker;
private BabyJailStatus? _babyJail;
public override void Initialize()
{
base.Initialize();
SubscribeNetworkEvent<PanicBunkerChangedEvent>(OnPanicBunkerUpdated);
SubscribeNetworkEvent<BabyJailChangedEvent>(OnBabyJailUpdated);
}
private void OnPanicBunkerUpdated(PanicBunkerChangedEvent msg, EntitySessionEventArgs args)
@@ -59,18 +56,6 @@ public sealed class AdminUIController : UIController,
}
}
private void OnBabyJailUpdated(BabyJailChangedEvent msg, EntitySessionEventArgs args)
{
var showDialog = _babyJail == null && msg.Status.Enabled;
_babyJail = msg.Status;
_window?.BabyJailControl.UpdateStatus(msg.Status);
if (showDialog)
{
UIManager.CreateWindow<BabyJailStatusWindow>().OpenCentered();
}
}
public void OnStateEntered(GameplayState state)
{
EnsureWindow();
@@ -116,13 +101,6 @@ public sealed class AdminUIController : UIController,
if (_panicBunker != null)
_window.PanicBunkerControl.UpdateStatus(_panicBunker);
/*
* TODO: Remove baby jail code once a more mature gateway process is established. This code is only being issued as a stopgap to help with potential tiding in the immediate future.
*/
if (_babyJail != null)
_window.BabyJailControl.UpdateStatus(_babyJail);
_window.PlayerTabControl.OnEntryKeyBindDown += PlayerTabEntryKeyBindDown;
_window.ObjectsTabControl.OnEntryKeyBindDown += ObjectsTabEntryKeyBindDown;
_window.OnOpen += OnWindowOpen;
-4
View File
@@ -902,10 +902,6 @@ namespace Content.Server.Database
Whitelist = 1,
Full = 2,
Panic = 3,
/*
* TODO: Remove baby jail code once a more mature gateway process is established. This code is only being issued as a stopgap to help with potential tiding in the immediate future.
*/
BabyJail = 4,
}
public class ServerBanHit
@@ -1,139 +0,0 @@
using Content.Shared.Administration;
using Content.Shared.CCVar;
using Robust.Shared.Configuration;
using Robust.Shared.Console;
/*
* TODO: Remove baby jail code once a more mature gateway process is established. This code is only being issued as a stopgap to help with potential tiding in the immediate future.
*/
namespace Content.Server.Administration.Commands;
[AdminCommand(AdminFlags.Server)]
public sealed class BabyJailCommand : LocalizedCommands
{
[Dependency] private readonly IConfigurationManager _cfg = default!;
public override string Command => "babyjail";
public override void Execute(IConsoleShell shell, string argStr, string[] args)
{
var toggle = Toggle(CCVars.BabyJailEnabled, shell, args, _cfg);
if (toggle == null)
return;
shell.WriteLine(Loc.GetString(toggle.Value ? "babyjail-command-enabled" : "babyjail-command-disabled"));
}
public static bool? Toggle(CVarDef<bool> cvar, IConsoleShell shell, string[] args, IConfigurationManager config)
{
if (args.Length > 1)
{
shell.WriteError(Loc.GetString("shell-need-between-arguments",("lower", 0), ("upper", 1)));
return null;
}
var enabled = config.GetCVar(cvar);
switch (args.Length)
{
case 0:
enabled = !enabled;
break;
case 1 when !bool.TryParse(args[0], out enabled):
shell.WriteError(Loc.GetString("shell-argument-must-be-boolean"));
return null;
}
config.SetCVar(cvar, enabled);
return enabled;
}
}
[AdminCommand(AdminFlags.Server)]
public sealed class BabyJailShowReasonCommand : LocalizedCommands
{
[Dependency] private readonly IConfigurationManager _cfg = default!;
public override string Command => "babyjail_show_reason";
public override void Execute(IConsoleShell shell, string argStr, string[] args)
{
var toggle = BabyJailCommand.Toggle(CCVars.BabyJailShowReason, shell, args, _cfg);
if (toggle == null)
return;
shell.WriteLine(Loc.GetString(toggle.Value
? "babyjail-command-show-reason-enabled"
: "babyjail-command-show-reason-disabled"
));
}
}
[AdminCommand(AdminFlags.Server)]
public sealed class BabyJailMinAccountAgeCommand : LocalizedCommands
{
[Dependency] private readonly IConfigurationManager _cfg = default!;
public override string Command => "babyjail_max_account_age";
public override void Execute(IConsoleShell shell, string argStr, string[] args)
{
switch (args.Length)
{
case 0:
{
var current = _cfg.GetCVar(CCVars.BabyJailMaxAccountAge);
shell.WriteLine(Loc.GetString("babyjail-command-max-account-age-is", ("minutes", current)));
break;
}
case > 1:
shell.WriteError(Loc.GetString("shell-need-between-arguments",("lower", 0), ("upper", 1)));
return;
}
if (!int.TryParse(args[0], out var minutes))
{
shell.WriteError(Loc.GetString("shell-argument-must-be-number"));
return;
}
_cfg.SetCVar(CCVars.BabyJailMaxAccountAge, minutes);
shell.WriteLine(Loc.GetString("babyjail-command-max-account-age-set", ("minutes", minutes)));
}
}
[AdminCommand(AdminFlags.Server)]
public sealed class BabyJailMinOverallHoursCommand : LocalizedCommands
{
[Dependency] private readonly IConfigurationManager _cfg = default!;
public override string Command => "babyjail_max_overall_minutes";
public override void Execute(IConsoleShell shell, string argStr, string[] args)
{
switch (args.Length)
{
case 0:
{
var current = _cfg.GetCVar(CCVars.BabyJailMaxOverallMinutes);
shell.WriteLine(Loc.GetString("babyjail-command-max-overall-minutes-is", ("minutes", current)));
break;
}
case > 1:
shell.WriteError(Loc.GetString("shell-need-between-arguments",("lower", 0), ("upper", 1)));
return;
}
if (!int.TryParse(args[0], out var hours))
{
shell.WriteError(Loc.GetString("shell-argument-must-be-number"));
return;
}
_cfg.SetCVar(CCVars.BabyJailMaxOverallMinutes, hours);
shell.WriteLine(Loc.GetString("babyjail-command-overall-minutes-set", ("hours", hours)));
}
}
@@ -62,7 +62,6 @@ namespace Content.Server.Administration.Systems
private readonly HashSet<NetUserId> _roundActivePlayers = new();
public readonly PanicBunkerStatus PanicBunker = new();
public readonly BabyJailStatus BabyJail = new();
public override void Initialize()
{
@@ -72,7 +71,6 @@ namespace Content.Server.Administration.Systems
_adminManager.OnPermsChanged += OnAdminPermsChanged;
_playTime.SessionPlayTimeUpdated += OnSessionPlayTimeUpdated;
// Panic Bunker Settings
Subs.CVar(_config, CCVars.PanicBunkerEnabled, OnPanicBunkerChanged, true);
Subs.CVar(_config, CCVars.PanicBunkerDisableWithAdmins, OnPanicBunkerDisableWithAdminsChanged, true);
Subs.CVar(_config, CCVars.PanicBunkerEnableWithoutAdmins, OnPanicBunkerEnableWithoutAdminsChanged, true);
@@ -82,16 +80,6 @@ namespace Content.Server.Administration.Systems
Subs.CVar(_config, CCVars.PanicBunkerMinOverallMinutes, OnPanicBunkerMinOverallMinutesChanged, true);
Subs.CVar(_config, CCCVars.PanicBunkerDenyVPN, OnPanicBunkerDenyVpnChanged, true); // Corvax-VPNGuard
/*
* TODO: Remove baby jail code once a more mature gateway process is established. This code is only being issued as a stopgap to help with potential tiding in the immediate future.
*/
// Baby Jail Settings
Subs.CVar(_config, CCVars.BabyJailEnabled, OnBabyJailChanged, true);
Subs.CVar(_config, CCVars.BabyJailShowReason, OnBabyJailShowReasonChanged, true);
Subs.CVar(_config, CCVars.BabyJailMaxAccountAge, OnBabyJailMaxAccountAgeChanged, true);
Subs.CVar(_config, CCVars.BabyJailMaxOverallMinutes, OnBabyJailMaxOverallMinutesChanged, true);
SubscribeLocalEvent<IdentityChangedEvent>(OnIdentityChanged);
SubscribeLocalEvent<PlayerAttachedEvent>(OnPlayerAttached);
SubscribeLocalEvent<PlayerDetachedEvent>(OnPlayerDetached);
@@ -264,17 +252,6 @@ namespace Content.Server.Administration.Systems
SendPanicBunkerStatusAll();
}
private void OnBabyJailChanged(bool enabled)
{
BabyJail.Enabled = enabled;
_chat.SendAdminAlert(Loc.GetString(enabled
? "admin-ui-baby-jail-enabled-admin-alert"
: "admin-ui-baby-jail-disabled-admin-alert"
));
SendBabyJailStatusAll();
}
private void OnPanicBunkerDisableWithAdminsChanged(bool enabled)
{
PanicBunker.DisableWithAdmins = enabled;
@@ -299,36 +276,18 @@ namespace Content.Server.Administration.Systems
SendPanicBunkerStatusAll();
}
private void OnBabyJailShowReasonChanged(bool enabled)
{
BabyJail.ShowReason = enabled;
SendBabyJailStatusAll();
}
private void OnPanicBunkerMinAccountAgeChanged(int minutes)
{
PanicBunker.MinAccountAgeMinutes = minutes;
SendPanicBunkerStatusAll();
}
private void OnBabyJailMaxAccountAgeChanged(int minutes)
{
BabyJail.MaxAccountAgeMinutes = minutes;
SendBabyJailStatusAll();
}
private void OnPanicBunkerMinOverallMinutesChanged(int minutes)
{
PanicBunker.MinOverallMinutes = minutes;
SendPanicBunkerStatusAll();
}
private void OnBabyJailMaxOverallMinutesChanged(int minutes)
{
BabyJail.MaxOverallMinutes = minutes;
SendBabyJailStatusAll();
}
// Corvax-VPNGuard-Start
private void OnPanicBunkerDenyVpnChanged(bool deny)
{
@@ -378,15 +337,6 @@ namespace Content.Server.Administration.Systems
}
}
private void SendBabyJailStatusAll()
{
var ev = new BabyJailChangedEvent(BabyJail);
foreach (var admin in _adminManager.AllAdmins)
{
RaiseNetworkEvent(ev, admin);
}
}
/// <summary>
/// Erases a player from the round.
/// This removes them and any trace of them from the round, deleting their
@@ -19,9 +19,6 @@ using Robust.Shared.Network;
using Robust.Shared.Player;
using Robust.Shared.Timing;
/*
* TODO: Remove baby jail code once a more mature gateway process is established. This code is only being issued as a stopgap to help with potential tiding in the immediate future.
*/
namespace Content.Server.Connection
{
@@ -277,14 +274,6 @@ namespace Content.Server.Connection
}
}
if (_cfg.GetCVar(CCVars.BabyJailEnabled) && adminData == null)
{
var result = await IsInvalidConnectionDueToBabyJail(userId, e);
if (result.IsInvalid)
return (ConnectionDenyReason.BabyJail, result.Reason, null);
}
var wasInGame = EntitySystem.TryGet<GameTicker>(out var ticker) &&
ticker.PlayerGameStatuses.TryGetValue(userId, out var status) &&
status == PlayerGameStatus.JoinedGame;
@@ -317,57 +306,6 @@ namespace Content.Server.Connection
return null;
}
private async Task<(bool IsInvalid, string Reason)> IsInvalidConnectionDueToBabyJail(NetUserId userId, NetConnectingArgs e)
{
// If you're whitelisted then bypass this whole thing
if (await _db.GetWhitelistStatusAsync(userId))
return (false, "");
// Initial cvar retrieval
var showReason = _cfg.GetCVar(CCVars.BabyJailShowReason);
var reason = _cfg.GetCVar(CCVars.BabyJailCustomReason);
var maxAccountAgeMinutes = _cfg.GetCVar(CCVars.BabyJailMaxAccountAge);
var maxPlaytimeMinutes = _cfg.GetCVar(CCVars.BabyJailMaxOverallMinutes);
// Wait some time to lookup data
var record = await _dbManager.GetPlayerRecordByUserId(userId);
var isAccountAgeInvalid = record == null || record.FirstSeenTime.CompareTo(DateTimeOffset.Now - TimeSpan.FromMinutes(maxAccountAgeMinutes)) <= 0;
if (isAccountAgeInvalid && showReason)
{
var locAccountReason = reason != string.Empty
? reason
: Loc.GetString("baby-jail-account-denied-reason",
("reason",
Loc.GetString(
"baby-jail-account-reason-account",
("minutes", maxAccountAgeMinutes))));
return (true, locAccountReason);
}
var overallTime = ( await _db.GetPlayTimes(e.UserId)).Find(p => p.Tracker == PlayTimeTrackingShared.TrackerOverall);
var isTotalPlaytimeInvalid = overallTime == null || overallTime.TimeSpent.TotalMinutes >= maxPlaytimeMinutes;
if (isTotalPlaytimeInvalid && showReason)
{
var locPlaytimeReason = reason != string.Empty
? reason
: Loc.GetString("baby-jail-account-denied-reason",
("reason",
Loc.GetString(
"baby-jail-account-reason-overall",
("minutes", maxPlaytimeMinutes))));
return (true, locPlaytimeReason);
}
if (!showReason && isTotalPlaytimeInvalid || isAccountAgeInvalid)
return (true, Loc.GetString("baby-jail-account-denied"));
return (false, "");
}
private bool HasTemporaryBypass(NetUserId user)
{
return _temporaryBypasses.TryGetValue(user, out var time) && time > _gameTiming.RealTime;
+3 -1
View File
@@ -1,3 +1,4 @@
using Content.Server.Construction.Conditions;
using Content.Server.DeviceNetwork.Components;
using Content.Server.EUI;
using Content.Shared.Eui;
@@ -56,7 +57,8 @@ public sealed class AdminFaxEui : BaseEui
case AdminFaxEuiMsg.Send sendData:
{
var printout = new FaxPrintout(sendData.Content, sendData.Title, null, null, sendData.StampState,
new() { new StampDisplayInfo { StampedName = sendData.From, StampedColor = sendData.StampColor } });
new() { new StampDisplayInfo { StampedName = sendData.From, StampedColor = sendData.StampColor } },
locked: sendData.Locked);
_faxSystem.Receive(_entityManager.GetEntity(sendData.Target), printout);
break;
}
+1
View File
@@ -29,4 +29,5 @@ public static class FaxConstants
public const string FaxPaperStampStateData = "fax_data_stamp_state";
public const string FaxPaperStampedByData = "fax_data_stamped_by";
public const string FaxSyndicateData = "fax_data_i_am_syndicate";
public const string FaxPaperLockedData = "fax_data_locked";
}
+7 -2
View File
@@ -300,8 +300,9 @@ public sealed class FaxSystem : EntitySystem
args.Data.TryGetValue(FaxConstants.FaxPaperStampStateData, out string? stampState);
args.Data.TryGetValue(FaxConstants.FaxPaperStampedByData, out List<StampDisplayInfo>? stampedBy);
args.Data.TryGetValue(FaxConstants.FaxPaperPrototypeData, out string? prototypeId);
args.Data.TryGetValue(FaxConstants.FaxPaperLockedData, out bool? locked);
var printout = new FaxPrintout(content, name, label, prototypeId, stampState, stampedBy);
var printout = new FaxPrintout(content, name, label, prototypeId, stampState, stampedBy, locked ?? false);
Receive(uid, printout, args.SenderAddress);
break;
@@ -473,7 +474,8 @@ public sealed class FaxSystem : EntitySystem
labelComponent?.CurrentLabel,
metadata.EntityPrototype?.ID ?? DefaultPaperPrototypeId,
paper.StampState,
paper.StampedBy);
paper.StampedBy,
paper.EditingDisabled);
component.PrintingQueue.Enqueue(printout);
component.SendTimeoutRemaining += component.SendTimeout;
@@ -522,6 +524,7 @@ public sealed class FaxSystem : EntitySystem
{ FaxConstants.FaxPaperNameData, nameMod?.BaseName ?? metadata.EntityName },
{ FaxConstants.FaxPaperLabelData, labelComponent?.CurrentLabel },
{ FaxConstants.FaxPaperContentData, paper.Content },
{ FaxConstants.FaxPaperLockedData, paper.EditingDisabled },
};
if (metadata.EntityPrototype != null)
@@ -598,6 +601,8 @@ public sealed class FaxSystem : EntitySystem
_paperSystem.TryStamp(printed, stamp, printout.StampState);
}
}
paper.EditingDisabled = printout.Locked;
}
_metaData.SetEntityName(printed, printout.Name);
@@ -226,7 +226,7 @@ namespace Content.Server.GameTicking
return false;
}
if (HasComp<GhostComponent>(playerEntity))
if (TryComp<GhostComponent>(playerEntity, out var comp) && !comp.CanGhostInteract)
return false;
if (mind.VisitingEntity != default)
@@ -53,12 +53,6 @@ namespace Content.Server.GameTicking
jObject["players"] = players; // Corvax-Queue
jObject["soft_max_players"] = _cfg.GetCVar(CCVars.SoftMaxPlayers);
jObject["panic_bunker"] = _cfg.GetCVar(CCVars.PanicBunkerEnabled);
/*
* TODO: Remove baby jail code once a more mature gateway process is established. This code is only being issued as a stopgap to help with potential tiding in the immediate future.
*/
jObject["baby_jail"] = _cfg.GetCVar(CCVars.BabyJailEnabled);
jObject["run_level"] = (int) _runLevel;
if (preset != null)
jObject["preset"] = Loc.GetString(preset.ModeTitle);
+1 -1
View File
@@ -12,7 +12,7 @@ public sealed partial class GerasComponent : Component
{
[DataField] public ProtoId<PolymorphPrototype> GerasPolymorphId = "SlimeMorphGeras";
[DataField] public ProtoId<EntityPrototype> GerasAction = "ActionMorphGeras";
[DataField] public EntProtoId GerasAction = "ActionMorphGeras";
[DataField] public EntityUid? GerasActionEntity;
}
@@ -17,6 +17,7 @@ using Content.Shared.Database;
using Content.Shared.DoAfter;
using Content.Shared.EntityEffects;
using Content.Shared.FixedPoint;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.IdentityManagement;
using Content.Shared.Interaction;
using Content.Shared.Interaction.Events;
@@ -48,6 +49,7 @@ public sealed class DrinkSystem : SharedDrinkSystem
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
[Dependency] private readonly SharedHandsSystem _hands = default!;
[Dependency] private readonly SharedInteractionSystem _interaction = default!;
[Dependency] private readonly SolutionContainerSystem _solutionContainer = default!;
[Dependency] private readonly StomachSystem _stomach = default!;
@@ -156,6 +158,9 @@ public sealed class DrinkSystem : SharedDrinkSystem
_appearance.SetData(uid, FoodVisuals.Visual, drainAvailable.Float(), appearance);
}
/// <summary>
/// Tries to feed the drink item to the target entity
/// </summary>
private bool TryDrink(EntityUid user, EntityUid target, DrinkComponent drink, EntityUid item)
{
if (!HasComp<BodyComponent>(target))
@@ -210,9 +215,9 @@ public sealed class DrinkSystem : SharedDrinkSystem
BreakOnDamage = true,
MovementThreshold = 0.01f,
DistanceThreshold = 1.0f,
// Mice and the like can eat without hands.
// TODO maybe set this based on some CanEatWithoutHands event or component?
NeedHand = forceDrink,
// do-after will stop if item is dropped when trying to feed someone else
// or if the item started out in the user's own hands
NeedHand = forceDrink || _hands.IsHolding(user, item),
};
_doAfter.TryStartDoAfter(doAfterEventArgs);
@@ -99,6 +99,9 @@ public sealed class FoodSystem : EntitySystem
args.Handled = result.Handled;
}
/// <summary>
/// Tries to feed the food item to the target entity
/// </summary>
public (bool Success, bool Handled) TryFeed(EntityUid user, EntityUid target, EntityUid food, FoodComponent foodComp)
{
//Suppresses eating yourself and alive mobs
@@ -189,9 +192,9 @@ public sealed class FoodSystem : EntitySystem
BreakOnDamage = true,
MovementThreshold = 0.01f,
DistanceThreshold = MaxFeedDistance,
// Mice and the like can eat without hands.
// TODO maybe set this based on some CanEatWithoutHands event or component?
NeedHand = forceFeed,
// do-after will stop if item is dropped when trying to feed someone else
// or if the item started out in the user's own hands
NeedHand = forceFeed || _hands.IsHolding(user, food),
};
_doAfter.TryStartDoAfter(doAfterArgs);
@@ -10,6 +10,7 @@ using Content.Shared.Mind.Components;
using Content.Shared.Mobs.Systems;
using Content.Shared.Mobs.Components;
using Content.Shared.Movement.Pulling.Components;
using Content.Shared.Stacks;
namespace Content.Server.Objectives.Systems;
@@ -105,7 +106,7 @@ public sealed class StealConditionSystem : EntitySystem
if (pulledEntity != null)
{
// check if this is the item
if (CheckStealTarget(pulledEntity.Value, condition)) count++;
count += CheckStealTarget(pulledEntity.Value, condition);
//we don't check the inventories of sentient entity
if (!HasComp<MindContainerComponent>(pulledEntity))
@@ -126,7 +127,7 @@ public sealed class StealConditionSystem : EntitySystem
foreach (var entity in container.ContainedEntities)
{
// check if this is the item
if (CheckStealTarget(entity, condition)) count++; //To Do: add support for stackable items
count += CheckStealTarget(entity, condition);
// if it is a container check its contents
if (_containerQuery.TryGetComponent(entity, out var containerManager))
@@ -140,14 +141,14 @@ public sealed class StealConditionSystem : EntitySystem
return result;
}
private bool CheckStealTarget(EntityUid entity, StealConditionComponent condition)
private int CheckStealTarget(EntityUid entity, StealConditionComponent condition)
{
// check if this is the target
if (!TryComp<StealTargetComponent>(entity, out var target))
return false;
return 0;
if (target.StealGroup != condition.StealGroup)
return false;
return 0;
// check if needed target alive
if (condition.CheckAlive)
@@ -155,9 +156,10 @@ public sealed class StealConditionSystem : EntitySystem
if (TryComp<MobStateComponent>(entity, out var state))
{
if (!_mobState.IsAlive(entity, state))
return false;
return 0;
}
}
return true;
return TryComp<StackComponent>(entity, out var stack) ? stack.Count : 1;
}
}
+3 -1
View File
@@ -1,5 +1,4 @@
using Content.Shared.Paper;
using Robust.Shared.GameStates;
namespace Content.Server.Paper;
@@ -21,4 +20,7 @@ public sealed partial class PaperComponent : SharedPaperComponent
/// </summary>
[DataField("stampState")]
public string? StampState { get; set; }
[DataField]
public bool EditingDisabled = false;
}
+8
View File
@@ -102,6 +102,14 @@ namespace Content.Server.Paper
var editable = paperComp.StampedBy.Count == 0 || _tagSystem.HasTag(args.Used, "WriteIgnoreStamps");
if (_tagSystem.HasTag(args.Used, "Write") && editable)
{
if (paperComp.EditingDisabled)
{
var paperEditingDisabledMessage = Loc.GetString("paper-tamper-proof-modified-message");
_popupSystem.PopupEntity(paperEditingDisabledMessage, uid, args.User);
args.Handled = true;
return;
}
var writeEvent = new PaperWriteEvent(uid, args.User);
RaiseLocalEvent(args.Used, ref writeEvent);
@@ -9,21 +9,19 @@ using Robust.Shared.Console;
namespace Content.Server.Sandbox.Commands
{
[AnyCommand]
public sealed class ColorNetworkCommand : IConsoleCommand
public sealed class ColorNetworkCommand : LocalizedCommands
{
[Dependency] private readonly IEntityManager _entManager = default!;
public string Command => "colornetwork";
public string Description => Loc.GetString("color-network-command-description");
public string Help => Loc.GetString("color-network-command-help-text", ("command",Command));
public override string Command => "colornetwork";
public void Execute(IConsoleShell shell, string argStr, string[] args)
public override void Execute(IConsoleShell shell, string argStr, string[] args)
{
var sandboxManager = _entManager.System<SandboxSystem>();
var adminManager = IoCManager.Resolve<IAdminManager>();
if (shell.IsClient && (!sandboxManager.IsSandboxEnabled && !adminManager.HasAdminFlag(shell.Player!, AdminFlags.Mapping)))
{
shell.WriteError("You are not currently able to use mapping commands.");
shell.WriteError(Loc.GetString("cmd-colornetwork-no-access"));
}
if (args.Length != 3)
@@ -8,7 +8,7 @@ namespace Content.Server.Speech.EntitySystems
[Dependency] private readonly IRobustRandom _random = default!;
private static readonly IReadOnlyList<string> Faces = new List<string>{
" (`ω´)", " ;;w;;", " owo", " UwU", " >w<", " ^w^"
" (`ω´)", " ;;w;;", " owo", " UwU", " >w<", " ^w^"
}.AsReadOnly();
private static readonly IReadOnlyDictionary<string, string> SpecialWords = new Dictionary<string, string>()
@@ -1,22 +0,0 @@
using Robust.Shared.Serialization;
/*
* TODO: Remove baby jail code once a more mature gateway process is established. This code is only being issued as a stopgap to help with potential tiding in the immediate future.
*/
namespace Content.Shared.Administration.Events;
[Serializable, NetSerializable]
public sealed class BabyJailStatus
{
public bool Enabled;
public bool ShowReason;
public int MaxAccountAgeMinutes;
public int MaxOverallMinutes;
}
[Serializable, NetSerializable]
public sealed class BabyJailChangedEvent(BabyJailStatus status) : EntityEventArgs
{
public BabyJailStatus Status = status;
}
+2 -2
View File
@@ -34,8 +34,8 @@ public sealed partial class SleepingSystem : EntitySystem
[Dependency] private readonly SharedEmitSoundSystem _emitSound = default!;
[Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!;
public static readonly ProtoId<EntityPrototype> SleepActionId = "ActionSleep";
public static readonly ProtoId<EntityPrototype> WakeActionId = "ActionWake";
public static readonly EntProtoId SleepActionId = "ActionSleep";
public static readonly EntProtoId WakeActionId = "ActionWake";
public override void Initialize()
{
-42
View File
@@ -332,48 +332,6 @@ namespace Content.Shared.CCVar
public static readonly CVarDef<bool> BypassBunkerWhitelist =
CVarDef.Create("game.panic_bunker.whitelisted_can_bypass", true, CVar.SERVERONLY);
/*
* TODO: Remove baby jail code once a more mature gateway process is established. This code is only being issued as a stopgap to help with potential tiding in the immediate future.
*/
/// <summary>
/// Whether the baby jail is currently enabled.
/// </summary>
public static readonly CVarDef<bool> BabyJailEnabled =
CVarDef.Create("game.baby_jail.enabled", false, CVar.NOTIFY | CVar.REPLICATED | CVar.SERVER);
/// <summary>
/// Show reason of disconnect for user or not.
/// </summary>
public static readonly CVarDef<bool> BabyJailShowReason =
CVarDef.Create("game.baby_jail.show_reason", false, CVar.SERVERONLY);
/// <summary>
/// Maximum age of the account (from server's PoV, so from first-seen date) in minutes that can access baby
/// jailed servers.
/// </summary>
public static readonly CVarDef<int> BabyJailMaxAccountAge =
CVarDef.Create("game.baby_jail.max_account_age", 1440, CVar.SERVERONLY);
/// <summary>
/// Maximum overall played time allowed to access baby jailed servers.
/// </summary>
public static readonly CVarDef<int> BabyJailMaxOverallMinutes =
CVarDef.Create("game.baby_jail.max_overall_minutes", 120, CVar.SERVERONLY);
/// <summary>
/// A custom message that will be used for connections denied due to the baby jail.
/// If not empty, then will overwrite <see cref="BabyJailShowReason"/>
/// </summary>
public static readonly CVarDef<string> BabyJailCustomReason =
CVarDef.Create("game.baby_jail.custom_reason", string.Empty, CVar.SERVERONLY);
/// <summary>
/// Allow bypassing the baby jail if the user is whitelisted.
/// </summary>
public static readonly CVarDef<bool> BypassBabyJailWhitelist =
CVarDef.Create("game.baby_jail.whitelisted_can_bypass", true, CVar.SERVERONLY);
/// <summary>
/// Make people bonk when trying to climb certain objects like tables.
/// </summary>
@@ -1,6 +1,8 @@
using Content.Shared.ActionBlocker;
using Content.Shared.Clothing;
using Content.Shared.Inventory;
using Robust.Shared.Player;
using Robust.Shared.Timing;
namespace Content.Shared.Chat.TypingIndicator;
@@ -11,6 +13,7 @@ public abstract class SharedTypingIndicatorSystem : EntitySystem
{
[Dependency] private readonly ActionBlockerSystem _actionBlocker = default!;
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly IGameTiming _timing = default!;
/// <summary>
/// Default ID of <see cref="TypingIndicatorPrototype"/>
@@ -26,6 +29,7 @@ public abstract class SharedTypingIndicatorSystem : EntitySystem
SubscribeLocalEvent<TypingIndicatorClothingComponent, ClothingGotEquippedEvent>(OnGotEquipped);
SubscribeLocalEvent<TypingIndicatorClothingComponent, ClothingGotUnequippedEvent>(OnGotUnequipped);
SubscribeLocalEvent<TypingIndicatorClothingComponent, InventoryRelayedEvent<BeforeShowTypingIndicatorEvent>>(BeforeShow);
SubscribeAllEvent<TypingChangedEvent>(OnTypingChanged);
}
@@ -44,20 +48,19 @@ public abstract class SharedTypingIndicatorSystem : EntitySystem
SetTypingIndicatorState(uid, TypingIndicatorState.None); // Corvax-TypingIndicator
}
private void OnGotEquipped(EntityUid uid, TypingIndicatorClothingComponent component, ClothingGotEquippedEvent args)
private void OnGotEquipped(Entity<TypingIndicatorClothingComponent> entity, ref ClothingGotEquippedEvent args)
{
if (!TryComp<TypingIndicatorComponent>(args.Wearer, out var indicator))
return;
indicator.Prototype = component.Prototype;
entity.Comp.GotEquippedTime = _timing.CurTime;
}
private void OnGotUnequipped(EntityUid uid, TypingIndicatorClothingComponent component, ClothingGotUnequippedEvent args)
private void OnGotUnequipped(Entity<TypingIndicatorClothingComponent> entity, ref ClothingGotUnequippedEvent args)
{
if (!TryComp<TypingIndicatorComponent>(args.Wearer, out var indicator))
return;
entity.Comp.GotEquippedTime = null;
}
indicator.Prototype = InitialIndicatorId;
private void BeforeShow(Entity<TypingIndicatorClothingComponent> entity, ref InventoryRelayedEvent<BeforeShowTypingIndicatorEvent> args)
{
args.Args.TryUpdateTimeAndIndicator(entity.Comp.TypingIndicatorPrototype, entity.Comp.GotEquippedTime);
}
private void OnTypingChanged(TypingChangedEvent ev, EntitySessionEventArgs args)
@@ -1,20 +0,0 @@
using Robust.Shared.Serialization;
namespace Content.Shared.Chat.TypingIndicator;
/// <summary>
/// Networked event from client.
/// Send to server when client started/stopped typing in chat input field.
/// </summary>
[Serializable, NetSerializable]
public sealed class TypingChangedEvent : EntityEventArgs
{
// Corvax-TypingIndicator-Start
public readonly TypingIndicatorState State;
public TypingChangedEvent(TypingIndicatorState state)
{
State = state;
}
// Corvax-TypingIndicator-End
}
@@ -1,13 +1,28 @@
using Robust.Shared.GameStates;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
namespace Content.Shared.Chat.TypingIndicator;
[RegisterComponent, NetworkedComponent]
/// <summary>
/// If an item is equipped to someones inventory (Anything but the pockets), and has this component
/// the users typing indicator will be replaced by the prototype given in <c>TypingIndicatorPrototype</c>.
/// </summary>
[RegisterComponent, NetworkedComponent, AutoGenerateComponentPause]
[Access(typeof(SharedTypingIndicatorSystem))]
public sealed partial class TypingIndicatorClothingComponent : Component
{
/// <summary>
/// The typing indicator that will override the default typing indicator when the item is equipped to a users
/// inventory.
/// </summary>
[ViewVariables(VVAccess.ReadWrite)]
[DataField("proto", required: true, customTypeSerializer: typeof(PrototypeIdSerializer<TypingIndicatorPrototype>))]
public string Prototype = default!;
[DataField("proto", required: true)]
public ProtoId<TypingIndicatorPrototype> TypingIndicatorPrototype = default!;
/// <summary>
/// This stores the time the item was equipped in someones inventory. If null, item is currently not equipped.
/// </summary>
[DataField, AutoPausedField]
public TimeSpan? GotEquippedTime = null;
}
@@ -1,5 +1,5 @@
using Robust.Shared.GameStates;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
using Robust.Shared.Prototypes;
namespace Content.Shared.Chat.TypingIndicator;
@@ -14,7 +14,6 @@ public sealed partial class TypingIndicatorComponent : Component
/// <summary>
/// Prototype id that store all visual info about typing indicator.
/// </summary>
[ViewVariables(VVAccess.ReadWrite)]
[DataField("proto", customTypeSerializer: typeof(PrototypeIdSerializer<TypingIndicatorPrototype>))]
public string Prototype = SharedTypingIndicatorSystem.InitialIndicatorId;
[DataField("proto")]
public ProtoId<TypingIndicatorPrototype> TypingIndicatorPrototype = "default";
}
@@ -0,0 +1,60 @@
using Robust.Shared.Serialization;
using Content.Shared.Inventory;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.Manager.Exceptions;
namespace Content.Shared.Chat.TypingIndicator;
/// <summary>
/// Networked event from client.
/// Send to server when client started/stopped typing in chat input field.
/// </summary>
[Serializable, NetSerializable]
public sealed class TypingChangedEvent : EntityEventArgs
{
public readonly bool IsTyping;
public TypingChangedEvent(bool isTyping)
{
IsTyping = isTyping;
}
}
/// <summary>
/// This event will be broadcast right before displaying an entities typing indicator.
/// If _overrideIndicator is not null after the event is finished it will be used.
/// </summary>
[Serializable, NetSerializable]
public sealed class BeforeShowTypingIndicatorEvent : IInventoryRelayEvent
{
public SlotFlags TargetSlots { get; } = SlotFlags.WITHOUT_POCKET;
private ProtoId<TypingIndicatorPrototype>? _overrideIndicator = null;
private TimeSpan? _latestEquipTime = null;
public BeforeShowTypingIndicatorEvent()
{
_overrideIndicator = null;
_latestEquipTime = null;
}
/// <summary>
/// Will only update the time and indicator if the given time is more recent than
/// the stored time or if the stored time is null.
/// </summary>
/// <returns>
/// True if the given time is more recent than the stored time, and false otherwise.
/// </returns>
public bool TryUpdateTimeAndIndicator(ProtoId<TypingIndicatorPrototype>? indicator, TimeSpan? equipTime)
{
if (equipTime != null && (_latestEquipTime == null || _latestEquipTime < equipTime))
{
_latestEquipTime = equipTime;
_overrideIndicator = indicator;
return true;
}
return false;
}
public ProtoId<TypingIndicatorPrototype>? GetMostRecentIndicator()
{
return _overrideIndicator;
}
}
@@ -6,7 +6,7 @@ namespace Content.Shared.Chemistry.Components;
/// <summary>
/// Gives click behavior for transferring to/from other reagent containers.
/// </summary>
[RegisterComponent, NetworkedComponent]
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class SolutionTransferComponent : Component
{
/// <summary>
@@ -14,6 +14,7 @@ public sealed partial class SolutionTransferComponent : Component
/// </summary>
[DataField("transferAmount")]
[ViewVariables(VVAccess.ReadWrite)]
[AutoNetworkedField]
public FixedPoint2 TransferAmount { get; set; } = FixedPoint2.New(5);
/// <summary>
@@ -38,11 +38,15 @@ public sealed class SolutionTransferSystem : EntitySystem
private void OnTransferAmountSetValueMessage(Entity<SolutionTransferComponent> ent, ref TransferAmountSetValueMessage message)
{
var newTransferAmount = FixedPoint2.Clamp(message.Value, ent.Comp.MinimumTransferAmount, ent.Comp.MaximumTransferAmount);
ent.Comp.TransferAmount = newTransferAmount;
var (uid, comp) = ent;
var newTransferAmount = FixedPoint2.Clamp(message.Value, comp.MinimumTransferAmount, comp.MaximumTransferAmount);
comp.TransferAmount = newTransferAmount;
if (message.Actor is { Valid: true } user)
_popup.PopupClient(Loc.GetString("comp-solution-transfer-set-amount", ("amount", newTransferAmount)), ent, user);
_popup.PopupEntity(Loc.GetString("comp-solution-transfer-set-amount", ("amount", newTransferAmount)), uid, user);
Dirty(uid, comp);
}
private void AddSetTransferVerbs(Entity<SolutionTransferComponent> ent, ref GetVerbsEvent<AlternativeVerb> args)
@@ -78,7 +82,10 @@ public sealed class SolutionTransferSystem : EntitySystem
verb.Act = () =>
{
comp.TransferAmount = amount;
_popup.PopupClient(Loc.GetString("comp-solution-transfer-set-amount", ("amount", amount)), uid, user);
Dirty(uid, comp);
};
// we want to sort by size, not alphabetically by the verb text.
@@ -29,7 +29,7 @@ public sealed partial class SmokeOnTriggerComponent : Component
/// Defaults to smoke but you can use foam if you want.
/// </summary>
[DataField, ViewVariables(VVAccess.ReadWrite)]
public ProtoId<EntityPrototype> SmokePrototype = "Smoke";
public EntProtoId SmokePrototype = "Smoke";
/// <summary>
/// Solution to add to each smoke cloud.
+3 -1
View File
@@ -56,8 +56,9 @@ public static class AdminFaxEuiMsg
public string Content { get; }
public string StampState { get; }
public Color StampColor { get; }
public bool Locked { get; }
public Send(NetEntity target, string title, string from, string content, string stamp, Color stampColor)
public Send(NetEntity target, string title, string from, string content, string stamp, Color stampColor, bool locked)
{
Target = target;
Title = title;
@@ -65,6 +66,7 @@ public static class AdminFaxEuiMsg
Content = content;
StampState = stamp;
StampColor = stampColor;
Locked = locked;
}
}
}
@@ -159,11 +159,14 @@ public sealed partial class FaxPrintout
[DataField("stampedBy")]
public List<StampDisplayInfo> StampedBy { get; private set; } = new();
[DataField]
public bool Locked { get; private set; }
private FaxPrintout()
{
}
public FaxPrintout(string content, string name, string? label = null, string? prototypeId = null, string? stampState = null, List<StampDisplayInfo>? stampedBy = null)
public FaxPrintout(string content, string name, string? label = null, string? prototypeId = null, string? stampState = null, List<StampDisplayInfo>? stampedBy = null, bool locked = false)
{
Content = content;
Name = name;
@@ -171,5 +174,6 @@ public sealed partial class FaxPrintout
PrototypeId = prototypeId ?? "";
StampState = stampState;
StampedBy = stampedBy ?? new List<StampDisplayInfo>();
Locked = locked;
}
}
+1 -1
View File
@@ -365,7 +365,7 @@ public sealed class LockSystem : EntitySystem
{
args.Cancel();
if (lockComp.Locked)
_sharedPopupSystem.PopupEntity(Loc.GetString("entity-storage-component-locked-message"), uid, args.User);
_sharedPopupSystem.PopupClient(Loc.GetString("entity-storage-component-locked-message"), uid, args.User);
}
}
+1 -1
View File
@@ -31,7 +31,7 @@ public sealed partial class PAIComponent : Component
public EntityUid? MidiAction;
[DataField]
public ProtoId<EntityPrototype> MapActionId = "ActionPAIOpenMap";
public EntProtoId MapActionId = "ActionPAIOpenMap";
[DataField, AutoNetworkedField]
public EntityUid? MapAction;
+67 -69
View File
@@ -1,73 +1,4 @@
Entries:
- author: iztokbajcar
changes:
- message: Glass textures are now less transparent.
type: Tweak
id: 6391
time: '2024-04-18T23:43:01.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/26948
- author: SlamBamActionman
changes:
- message: Snouts and noses no longer disappear with toggled masks.
type: Fix
id: 6392
time: '2024-04-19T05:39:47.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/25716
- author: shampunj
changes:
- message: 'Now for crafting stunprod you need: igniter, cable cuffs, small power
cell, metal rod.'
type: Tweak
- message: Stunprod deals 35 stamina damage per hit and 5 shock damage. The battery
charge is enough for 3 hits.
type: Tweak
id: 6393
time: '2024-04-19T05:50:10.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/25922
- author: EmoGarbage404
changes:
- message: Halved passive fuel consumption of welding tools.
type: Tweak
- message: Completing an action with a welding tool now directly drains the fuel.
type: Tweak
id: 6394
time: '2024-04-19T23:20:30.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/27030
- author: superjj18
changes:
- message: Pneumatic cannon inventory reduced in size to 2x2, item blacklist removed
type: Tweak
id: 6395
time: '2024-04-19T23:22:37.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/26878
- author: Aquif
changes:
- message: The Communication Console will no longer cut off your messages.
type: Fix
id: 6396
time: '2024-04-20T01:07:10.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/27145
- author: osjarw
changes:
- message: Wallmount substation electronics can now be created at an autolathe.
type: Add
id: 6397
time: '2024-04-20T01:14:58.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/27138
- author: Gyrandola
changes:
- message: Pepper sprites are now properly centered!
type: Fix
id: 6398
time: '2024-04-20T02:06:48.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/25971
- author: ElectroJr
changes:
- message: Fixed a bug causing the emergency shuttle to not spawn
type: Fix
id: 6399
time: '2024-04-20T02:10:19.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/27144
- author: slarticodefast
changes:
- message: The internal volume of cryopods has been increased from 101.3 to 1000L.
@@ -3828,3 +3759,70 @@
id: 6890
time: '2024-07-09T13:46:21.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/29835
- author: Plykiya
changes:
- message: You can now drop food and drinks to stop consuming it.
type: Fix
id: 6891
time: '2024-07-09T23:12:40.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/29854
- author: Boaz1111
changes:
- message: Guitars can now be worn in the suit storage slot
type: Add
id: 6892
time: '2024-07-09T23:28:10.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/29048
- author: Winkarst-cpu
changes:
- message: Fixed popup spam when trying to open borg's UI while the borg is locked.
type: Fix
id: 6893
time: '2024-07-09T23:48:56.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/29861
- author: Lokachop
changes:
- message: Scarves now count as warm clothing for the warm clothing cargo bounty.
type: Tweak
id: 6894
time: '2024-07-10T05:26:33.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/29779
- author: Aquif
changes:
- message: It is now possible to "lock" admin faxes such that they cannot be edited
by cybersun pens or any other IC means.
type: Add
id: 6895
time: '2024-07-10T05:28:36.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/28972
- author: Ghagliiarghii
changes:
- message: The Librarian's Books Bag can now hold D&D related items such as dice
and battlemats.
type: Tweak
id: 6896
time: '2024-07-10T05:51:01.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/29863
- author: Beck Thompson, Tayrtahn
changes:
- message: Typing indicators now correctly stack and will not overwrite your default
species indicator.
type: Fix
id: 6897
time: '2024-07-10T05:51:48.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/29492
- author: Winkarst-cpu
changes:
- message: Now confirmation popup is displayed and item panel status is updated
after setting a custom solution transfer volume.
type: Fix
id: 6898
time: '2024-07-10T10:32:30.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/29852
- author: Winkarst-cpu
changes:
- message: Added exit confirmation for character setup menu with unsaved changes.
type: Add
id: 6899
time: '2024-07-11T00:24:37.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/29875
@@ -11,12 +11,6 @@ panic_bunker.enabled = false
panic_bunker.disable_with_admins = false
panic_bunker.enable_without_admins = false
panic_bunker.custom_reason = ""
baby_jail.enabled = true
baby_jail.show_reason = true
baby_jail.max_account_age = 5256000 # 10 years. Disabling this check specifically isn't currently supported
baby_jail.max_overall_minutes = 3000 # 50 hours
baby_jail.custom_reason = "Sorry! Only new players can join the servers, try joining another one instead!"
baby_jail.whitelisted_can_bypass = true
[hub]
tags = "lang:en,region:am_n_e,rp:low"
@@ -8,10 +8,6 @@
soft_max_players = 50
hostname = "[EN] Wizard's Den Granite Flea [US East]"
desc = "Official English Space Station 14 servers. Vanilla, roleplay ruleset."
panic_bunker.enabled = false
panic_bunker.disable_with_admins = false
panic_bunker.enable_without_admins = false
panic_bunker.custom_reason = ""
[hub]
tags = "lang:en,region:am_n_e,rp:low"
@@ -1,19 +0,0 @@
cmd-babyjail-desc = Toggles the baby jail, which enables stricter restrictions on who's allowed to join the server.
cmd-babyjail-help = Usage: babyjail
babyjail-command-enabled = Baby jail has been enabled.
babyjail-command-disabled = Baby jail has been disabled.
cmd-babyjail_show_reason-desc = Toggles whether or not to show connecting clients the reason why the baby jail blocked them from joining.
cmd-babyjail_show_reason-help = Usage: babyjail_show_reason
babyjail-command-show-reason-enabled = The baby jail will now show a reason to users it blocks from connecting.
babyjail-command-show-reason-disabled = The baby jail will no longer show a reason to users it blocks from connecting.
cmd-babyjail_max_account_age-desc = Gets or sets the maximum account age in minutes that an account can have to be allowed to connect with the baby jail enabled.
cmd-babyjail_max_account_age-help = Usage: babyjail_max_account_age <minutes>
babyjail-command-max-account-age-is = The maximum account age for the baby jail is {$minutes} minutes.
babyjail-command-max-account-age-set = Set the maximum account age for the baby jail to {$minutes} minutes.
cmd-babyjail_max_overall_minutes-desc = Gets or sets the maximum overall playtime in minutes that an account can have to be allowed to connect with the baby jail enabled.
cmd-babyjail_max_overall_minutes-help = Usage: babyjail_max_overall_minutes <minutes>
babyjail-command-max-overall-minutes-is = The maximum overall playtime for the baby jail is {$minutes} minutes.
babyjail-command-max-overall-minutes-set = Set the maximum overall playtime for the baby jail to {$minutes} minutes.
@@ -7,6 +7,5 @@ admin-menu-atmos-tab = Atmos
admin-menu-round-tab = Round
admin-menu-server-tab = Server
admin-menu-panic-bunker-tab = Panic Bunker
admin-menu-baby-jail-tab = Baby Jail
admin-menu-players-tab = Players
admin-menu-objects-tab = Objects
@@ -1,16 +0,0 @@
admin-ui-baby-jail-window-title = Baby Jail
admin-ui-baby-jail-enabled = Baby Jail Enabled
admin-ui-baby-jail-disabled = Baby Jail Disabled
admin-ui-baby-jail-tooltip = The baby jail restricts players from joining if their account is too old or they do have too much overall playtime on this server.
admin-ui-baby-jail-show-reason = Show Reason
admin-ui-baby-jail-show-reason-tooltip = Show the user why they were blocked from connecting by the baby jail.
admin-ui-baby-jail-max-account-age = Max. Account Age
admin-ui-baby-jail-max-overall-minutes = Max. Overall Playtime
admin-ui-baby-jail-is-enabled = [font size=20][bold]The baby jail is currently enabled.[/bold][/font]
admin-ui-baby-jail-enabled-admin-alert = The baby jail has been enabled.
admin-ui-baby-jail-disabled-admin-alert = The baby jail has been disabled.
@@ -0,0 +1,3 @@
cmd-colornetwork-desc = Paints the atmos devices in the specified color
cmd-colornetwork-help = colornetwork <uid> Pipe <HexColor>
cmd-colornetwork-no-access = You are not currently able to use mapping commands.
@@ -9,12 +9,12 @@ cmd-jobwhitelistadd-already-whitelisted = {$player} is already whitelisted to pl
cmd-jobwhitelistadd-added = Added {$player} to the {$jobId} ({$jobName}) whitelist.
cmd-jobwhitelistget-desc = Gets all the jobs that a player has been whitelisted for.
cmd-jobwhitelistget-help = Usage: jobwhitelistadd <username>
cmd-jobwhitelistget-help = Usage: jobwhitelistget <username>
cmd-jobwhitelistget-whitelisted-none = Player {$player} is not whitelisted for any jobs.
cmd-jobwhitelistget-whitelisted-for = "Player {$player} is whitelisted for:
{$jobs}"
cmd-jobwhitelistremove-desc = Removes a player's ability to play a whitelisted job.
cmd-jobwhitelistremove-help = Usage: jobwhitelistadd <username> <job>
cmd-jobwhitelistremove-help = Usage: jobwhitelistremove <username> <job>
cmd-jobwhitelistremove-was-not-whitelisted = {$player} was not whitelisted to play as {$jobId} ({$jobName}).
cmd-jobwhitelistremove-removed = Removed {$player} from the whitelist for {$jobId} ({$jobName}).
@@ -40,8 +40,3 @@ panic-bunker-account-denied-reason = This server is in panic bunker mode, often
panic-bunker-account-reason-account = Your Space Station 14 account is too new. It must be older than {$minutes} minutes
panic-bunker-account-reason-overall = Your overall playtime on the server must be greater than {$minutes} $minutes
baby-jail-account-denied = This server is a newbie server, intended for new players and those who want to help them. New connections by accounts that are too old or are not on a whitelist are not accepted. Check out some other servers and see everything Space Station 14 has to offer. Have fun!
baby-jail-account-denied-reason = This server is a newbie server, intended for new players and those who want to help them. New connections by accounts that are too old or are not on a whitelist are not accepted. Check out some other servers and see everything Space Station 14 has to offer. Have fun! Reason: "{$reason}"
baby-jail-account-reason-account = Your Space Station 14 account is too old. It must be younger than {$minutes} minutes
baby-jail-account-reason-overall = Your overall playtime on the server must be younger than {$minutes} $minutes
+2
View File
@@ -12,3 +12,5 @@ admin-fax-message-placeholder = Your message here...
admin-fax-stamp = Stamp icon:
admin-fax-stamp-color = Stamp color:
admin-fax-send = Send
admin-fax-lock-page = Lock Page
admin-fax-lock-page-tooltip = Lock the paper such that it cannot be edited even by things such as cybersun pens.
@@ -12,3 +12,5 @@ paper-component-action-stamp-paper-other = {CAPITALIZE(THE($user))} stamps {THE(
paper-component-action-stamp-paper-self = You stamp {THE($target)} with {THE($stamp)}.
paper-ui-save-button = Save ({$keybind})
paper-tamper-proof-modified-message = This page was written using tamper-proof ink.
@@ -6,3 +6,8 @@ character-setup-gui-create-new-character-button = Create new slot...
character-setup-gui-create-new-character-button-tooltip = A maximum of {$maxCharacters} characters are allowed.
character-setup-gui-character-picker-button-delete-button = Delete
character-setup-gui-character-picker-button-confirm-delete-button = Confirm
character-setup-gui-save-panel-title = Unsaved character changes
character-setup-gui-save-panel-save = Save
character-setup-gui-save-panel-nosave = Don't save
character-setup-gui-save-panel-cancel = Cancel
+7841 -7952
View File
File diff suppressed because it is too large Load Diff
@@ -1,4 +1,4 @@
- type: cargoBounty
- type: cargoBounty
id: BountyArtifact
reward: 2500
description: bounty-description-artifact
@@ -500,6 +500,8 @@
whitelist:
components:
- TemperatureProtection
tags:
- Scarf
- type: cargoBounty
id: BountyBattery
@@ -29,3 +29,12 @@
tags:
- ClothMade
- WhitelistChameleon
- type: entity
abstract: true
parent: ClothingNeckBase
id: ClothingScarfBase
components:
- type: Tag
tags:
- Scarf
@@ -1,5 +1,5 @@
- type: entity
parent: ClothingNeckBase
parent: ClothingScarfBase
id: ClothingNeckScarfStripedRed
name: striped red scarf
description: A stylish striped red scarf. The perfect winter accessory for those with a keen fashion sense, and those who just can't handle a cold breeze on their necks.
@@ -10,7 +10,7 @@
sprite: Clothing/Neck/Scarfs/red.rsi
- type: entity
parent: ClothingNeckBase
parent: ClothingScarfBase
id: ClothingNeckScarfStripedBlue
name: striped blue scarf
description: A stylish striped blue scarf. The perfect winter accessory for those with a keen fashion sense, and those who just can't handle a cold breeze on their necks.
@@ -21,7 +21,7 @@
sprite: Clothing/Neck/Scarfs/blue.rsi
- type: entity
parent: ClothingNeckBase
parent: ClothingScarfBase
id: ClothingNeckScarfStripedGreen
name: striped green scarf
description: A stylish striped green scarf. The perfect winter accessory for those with a keen fashion sense, and those who just can't handle a cold breeze on their necks.
@@ -32,7 +32,7 @@
sprite: Clothing/Neck/Scarfs/green.rsi
- type: entity
parent: ClothingNeckBase
parent: ClothingScarfBase
id: ClothingNeckScarfStripedBlack
name: striped black scarf
description: A stylish striped black scarf. The perfect winter accessory for those with a keen fashion sense, and those who just can't handle a cold breeze on their necks.
@@ -43,7 +43,7 @@
sprite: Clothing/Neck/Scarfs/black.rsi
- type: entity
parent: ClothingNeckBase
parent: ClothingScarfBase
id: ClothingNeckScarfStripedBrown
name: striped brown scarf
description: A stylish striped brown scarf. The perfect winter accessory for those with a keen fashion sense, and those who just can't handle a cold breeze on their necks.
@@ -54,7 +54,7 @@
sprite: Clothing/Neck/Scarfs/brown.rsi
- type: entity
parent: ClothingNeckBase
parent: ClothingScarfBase
id: ClothingNeckScarfStripedLightBlue
name: striped light blue scarf
description: A stylish striped light blue scarf. The perfect winter accessory for those with a keen fashion sense, and those who just can't handle a cold breeze on their necks.
@@ -65,7 +65,7 @@
sprite: Clothing/Neck/Scarfs/lightblue.rsi
- type: entity
parent: ClothingNeckBase
parent: ClothingScarfBase
id: ClothingNeckScarfStripedOrange
name: striped orange scarf
description: A stylish striped orange scarf. The perfect winter accessory for those with a keen fashion sense, and those who just can't handle a cold breeze on their necks.
@@ -76,7 +76,7 @@
sprite: Clothing/Neck/Scarfs/orange.rsi
- type: entity
parent: ClothingNeckBase
parent: ClothingScarfBase
id: ClothingNeckScarfStripedPurple
name: striped purple scarf
description: A stylish striped purple scarf. The perfect winter accessory for those with a keen fashion sense, and those who just can't handle a cold breeze on their necks.
@@ -87,7 +87,7 @@
sprite: Clothing/Neck/Scarfs/purple.rsi
- type: entity
parent: ClothingNeckBase
parent: ClothingScarfBase
id: ClothingNeckScarfStripedSyndieGreen
name: striped syndicate green scarf
description: A stylish striped syndicate green scarf. The perfect winter accessory for those with a keen fashion sense, and those who are in the mood to steal something.
@@ -98,7 +98,7 @@
sprite: Clothing/Neck/Scarfs/syndiegreen.rsi
- type: entity
parent: ClothingNeckBase
parent: ClothingScarfBase
id: ClothingNeckScarfStripedSyndieRed
name: striped syndicate red scarf
description: A stylish striped syndicate red scarf. The perfect winter accessory for those with a keen fashion sense, and those who are in the mood to steal something.
@@ -109,7 +109,7 @@
sprite: Clothing/Neck/Scarfs/syndiered.rsi
- type: entity
parent: ClothingNeckBase
parent: ClothingScarfBase
id: ClothingNeckScarfStripedCentcom
name: striped CentCom scarf
description: A stylish striped centcom colored scarf. The perfect winter accessory for those with a keen fashion sense, and those who need to do paperwork in the cold.
@@ -120,7 +120,7 @@
sprite: Clothing/Neck/Scarfs/centcom.rsi
- type: entity
parent: ClothingNeckBase
parent: ClothingScarfBase
id: ClothingNeckScarfStripedZebra
name: zebra scarf
description: A striped scarf, a mandatory accessory for artists.
@@ -21,6 +21,7 @@
quickEquip: false
slots:
- back
- suitStorage
sprite: Objects/Fun/Instruments/eguitar.rsi
- type: Tag
tags:
@@ -50,6 +51,7 @@
quickEquip: false
slots:
- back
- suitStorage
sprite: Objects/Fun/Instruments/bassguitar.rsi
- type: Tag
tags:
@@ -78,6 +80,7 @@
quickEquip: false
slots:
- back
- suitStorage
sprite: Objects/Fun/Instruments/rockguitar.rsi
- type: Tag
tags:
@@ -120,6 +123,7 @@
quickEquip: false
slots:
- back
- suitStorage
sprite: Objects/Fun/Instruments/guitar.rsi
- type: Wieldable
- type: Damageable # Smash it! Does 20 damage a hit, but breaks after 1 hit.
@@ -10,6 +10,9 @@
setup:
!type:TabletopEmptySetup
boardPrototype: Crowbar
- type: Tag
tags:
- TabletopBoard
- type: entity
id: BaseTabletopPiece # Board piece
@@ -22,5 +22,9 @@
whitelist:
tags:
- Book
- Dice
- Document
- Figurine
- TabletopBoard
- Write
- type: Dumpable
+1 -1
View File
@@ -9,7 +9,7 @@
stationProto: StandardNanotrasenStation
components:
- type: StationEmergencyShuttle
emergencyShuttlePath: /Maps/Shuttles/emergency_transit.yml
emergencyShuttlePath: /Maps/Shuttles/emergency_omega.yml
- type: StationNameSetup
mapNameTemplate: '{0} Cluster Station {1}'
nameGenerator:
@@ -0,0 +1,15 @@
- type: constructionGraph
id: FoodBoxPizza
start: start
graph:
- node: start
edges:
- to: foodboxpizza
steps:
- material: Cardboard
amount: 1
doAfter: 4
- node: foodboxpizza
entity: FoodBoxPizza
@@ -64,6 +64,19 @@
icon: { sprite: Objects/Storage/boxes.rsi, state: box }
objectType: Item
- type: construction
name: pizza box
id: FoodBoxPizza
graph: FoodBoxPizza
startNode: start
targetNode: foodboxpizza
category: construction-category-storage
description: A box for pizza.
icon:
sprite: Objects/Consumable/Food/Baked/pizza.rsi
state: box
objectType: Item
- type: construction
name: coffin
id: CrateCoffin
+3
View File
@@ -1105,6 +1105,9 @@
- type: Tag
id: SalvageExperiment
- type: Tag
id: Scarf
- type: Tag
id: Screwdriver
Binary file not shown.

After

Width:  |  Height:  |  Size: 862 B

@@ -14,6 +14,10 @@
"name": "equipped-BACKPACK",
"directions": 4
},
{
"name": "equipped-SUITSTORAGE",
"directions": 4
},
{
"name": "inhand-left",
"directions": 4
Binary file not shown.

After

Width:  |  Height:  |  Size: 845 B

@@ -14,6 +14,10 @@
"name": "equipped-BACKPACK",
"directions": 4
},
{
"name": "equipped-SUITSTORAGE",
"directions": 4
},
{
"name": "inhand-left",
"directions": 4
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -29,6 +29,10 @@
{
"name": "equipped-BACKPACK",
"directions": 4
},
{
"name": "equipped-SUITSTORAGE",
"directions": 4
}
]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 803 B

@@ -14,6 +14,10 @@
"name": "equipped-BACKPACK",
"directions": 4
},
{
"name": "equipped-SUITSTORAGE",
"directions": 4
},
{
"name": "inhand-left",
"directions": 4