mirror of
https://github.com/space-syndicate/space-station-14.git
synced 2026-06-09 15:06:34 +02:00
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:
+3
-3
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user