Merge remote-tracking branch 'origin/master' into weapon-modules
# Conflicts: # Resources/Prototypes/Recipes/Lathes/security.yml
This commit is contained in:
@@ -49,7 +49,7 @@ namespace Content.Client.Administration.UI.CustomControls
|
||||
PopulateList(_adminSystem.PlayerList);
|
||||
FilterLineEdit.OnTextChanged += _ => FilterList();
|
||||
_adminSystem.PlayerListChanged += PopulateList;
|
||||
BackgroundPanel.PanelOverride = new StyleBoxFlat {BackgroundColor = new Color(20, 20, 20)};
|
||||
BackgroundPanel.PanelOverride = new StyleBoxFlat {BackgroundColor = new Color(11, 11, 11)};
|
||||
}
|
||||
|
||||
private void PlayerListItemPressed(BaseButton.ButtonEventArgs? args, ListData? data)
|
||||
|
||||
@@ -19,7 +19,7 @@ namespace Content.Client.Administration.UI.Tabs.PlayerTab
|
||||
|
||||
private const string ArrowUp = "↑";
|
||||
private const string ArrowDown = "↓";
|
||||
private readonly Color _altColor = Color.FromHex("#141414");
|
||||
private readonly Color _altColor = Color.FromHex("#050505");
|
||||
private readonly Color _defaultColor = Color.FromHex("#191919");
|
||||
private readonly AdminSystem _adminSystem;
|
||||
private IReadOnlyList<PlayerInfo> _players = new List<PlayerInfo>();
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
<!-- Vent devices -->
|
||||
<PanelContainer VerticalExpand="True">
|
||||
<PanelContainer.PanelOverride>
|
||||
<gfx:StyleBoxFlat BackgroundColor="#212723" />
|
||||
<gfx:StyleBoxFlat BackgroundColor="#050505" />
|
||||
</PanelContainer.PanelOverride>
|
||||
|
||||
<ScrollContainer>
|
||||
@@ -53,7 +53,7 @@
|
||||
<!-- Scrubber devices -->
|
||||
<PanelContainer VerticalExpand="True">
|
||||
<PanelContainer.PanelOverride>
|
||||
<gfx:StyleBoxFlat BackgroundColor="#212723" />
|
||||
<gfx:StyleBoxFlat BackgroundColor="#050505" />
|
||||
</PanelContainer.PanelOverride>
|
||||
|
||||
<ScrollContainer>
|
||||
@@ -63,7 +63,7 @@
|
||||
<!-- Sensors -->
|
||||
<PanelContainer VerticalExpand="True">
|
||||
<PanelContainer.PanelOverride>
|
||||
<gfx:StyleBoxFlat BackgroundColor="#212723" />
|
||||
<gfx:StyleBoxFlat BackgroundColor="#050505" />
|
||||
</PanelContainer.PanelOverride>
|
||||
|
||||
<ScrollContainer>
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
HorizontalExpand="True">
|
||||
<PanelContainer VerticalExpand="True" HorizontalExpand="True" Margin="10">
|
||||
<PanelContainer.PanelOverride>
|
||||
<gfx:StyleBoxFlat BackgroundColor="#1B1B1E" />
|
||||
<gfx:StyleBoxFlat BackgroundColor="#212121" />
|
||||
</PanelContainer.PanelOverride>
|
||||
<ScrollContainer HScrollEnabled="False"
|
||||
HorizontalExpand="True"
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
<PanelContainer VerticalExpand="True" MinSize="0 200">
|
||||
<PanelContainer.PanelOverride>
|
||||
<gfx:StyleBoxFlat BackgroundColor="#212723" />
|
||||
<gfx:StyleBoxFlat BackgroundColor="#050505" />
|
||||
</PanelContainer.PanelOverride>
|
||||
<ScrollContainer HorizontalExpand="True" MinSize="0 200">
|
||||
<!-- Initially empty, when server sends state data this will have container contents and fill volume.-->
|
||||
@@ -39,7 +39,7 @@
|
||||
<!-- Buffer info -->
|
||||
<PanelContainer VerticalExpand="True" MinSize="0 200">
|
||||
<PanelContainer.PanelOverride>
|
||||
<gfx:StyleBoxFlat BackgroundColor="#212723" />
|
||||
<gfx:StyleBoxFlat BackgroundColor="#050505" />
|
||||
</PanelContainer.PanelOverride>
|
||||
|
||||
<ScrollContainer HorizontalExpand="True" MinSize="0 200">
|
||||
@@ -61,7 +61,7 @@
|
||||
|
||||
<PanelContainer VerticalExpand="True" MinSize="0 200">
|
||||
<PanelContainer.PanelOverride>
|
||||
<gfx:StyleBoxFlat BackgroundColor="#212723" />
|
||||
<gfx:StyleBoxFlat BackgroundColor="#050505" />
|
||||
</PanelContainer.PanelOverride>
|
||||
|
||||
<ScrollContainer HorizontalExpand="True" MinSize="0 200">
|
||||
@@ -86,7 +86,7 @@
|
||||
<!-- Wrap the packaging info-->
|
||||
<PanelContainer>
|
||||
<PanelContainer.PanelOverride>
|
||||
<gfx:StyleBoxFlat BackgroundColor="#212723" />
|
||||
<gfx:StyleBoxFlat BackgroundColor="#050505" />
|
||||
</PanelContainer.PanelOverride>
|
||||
|
||||
<!-- Packaging Info -->
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
SizeFlagsStretchRatio="6"
|
||||
MinSize="0 150">
|
||||
<PanelContainer.PanelOverride>
|
||||
<gfx:StyleBoxFlat BackgroundColor="#212723" />
|
||||
<gfx:StyleBoxFlat BackgroundColor="#050505" />
|
||||
</PanelContainer.PanelOverride>
|
||||
<BoxContainer Name="ContainerInfo"
|
||||
Orientation="Vertical"
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
<PanelContainer VerticalExpand="True"
|
||||
HorizontalExpand="True">
|
||||
<PanelContainer.PanelOverride>
|
||||
<gfx:StyleBoxFlat BackgroundColor="#1B1B1E" />
|
||||
<gfx:StyleBoxFlat BackgroundColor="#212121" />
|
||||
</PanelContainer.PanelOverride>
|
||||
<BoxContainer Orientation="Vertical" VerticalAlignment="Center">
|
||||
<RichTextLabel Name="CostLabel" HorizontalAlignment="Center" VerticalAlignment="Center"/>
|
||||
@@ -35,7 +35,7 @@
|
||||
HorizontalExpand="True"
|
||||
RectClipContent="True">
|
||||
<PanelContainer.PanelOverride>
|
||||
<gfx:StyleBoxFlat BackgroundColor="#1B1B1E" />
|
||||
<gfx:StyleBoxFlat BackgroundColor="#212121" />
|
||||
</PanelContainer.PanelOverride>
|
||||
<ui:MaterialStorageControl Name="MaterialStorageControl"/>
|
||||
</PanelContainer>
|
||||
|
||||
@@ -134,7 +134,7 @@ public sealed class DoAfterOverlay : Overlay
|
||||
}
|
||||
|
||||
var xProgress = (EndX - StartX) * elapsedRatio + StartX;
|
||||
var box = new Box2(new Vector2(StartX, 3f) / EyeManager.PixelsPerMeter,
|
||||
var box = new Box2(new Vector2(StartX, 2f) / EyeManager.PixelsPerMeter,
|
||||
new Vector2(xProgress, 4f) / EyeManager.PixelsPerMeter);
|
||||
|
||||
box = box.Translated(position);
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
xmlns:graphics="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client">
|
||||
<PanelContainer>
|
||||
<PanelContainer.PanelOverride>
|
||||
<graphics:StyleBoxFlat BackgroundColor="#242429" />
|
||||
<graphics:StyleBoxFlat BackgroundColor="#111111" />
|
||||
</PanelContainer.PanelOverride>
|
||||
|
||||
<BoxContainer Orientation="Vertical" HorizontalExpand="True" Margin="5">
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
<!-- Item list -->
|
||||
<BoxContainer Name="MarkingSelectorContainer" Orientation="Vertical" HorizontalExpand="True" VerticalExpand="True">
|
||||
<ScrollContainer MinHeight="500" VerticalExpand="True" HorizontalExpand="True">
|
||||
<ScrollContainer MinHeight="200" VerticalExpand="True" HorizontalExpand="True">
|
||||
<ItemList Name="MarkingList" VerticalExpand="True" />
|
||||
</ScrollContainer>
|
||||
|
||||
|
||||
@@ -76,6 +76,7 @@ namespace Content.Client.Input
|
||||
human.AddFunction(ContentKeyFunctions.Arcade1);
|
||||
human.AddFunction(ContentKeyFunctions.Arcade2);
|
||||
human.AddFunction(ContentKeyFunctions.Arcade3);
|
||||
human.AddFunction(ContentKeyFunctions.LieDown); // WD EDIT
|
||||
|
||||
// actions should be common (for ghosts, mobs, etc)
|
||||
common.AddFunction(ContentKeyFunctions.OpenActionsMenu);
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
SizeFlagsStretchRatio="4">
|
||||
<PanelContainer VerticalExpand="True">
|
||||
<PanelContainer.PanelOverride>
|
||||
<gfx:StyleBoxFlat BackgroundColor="#1B1B1E" />
|
||||
<gfx:StyleBoxFlat BackgroundColor="#212121" />
|
||||
</PanelContainer.PanelOverride>
|
||||
<ScrollContainer VerticalExpand="True" HScrollEnabled="False">
|
||||
<BoxContainer
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<gfx:StyleBoxFlat
|
||||
BorderThickness="2"
|
||||
BorderColor="#464966"
|
||||
BackgroundColor="#25252A"
|
||||
BackgroundColor="#050505"
|
||||
/>
|
||||
</PanelContainer.PanelOverride>
|
||||
<BoxContainer
|
||||
|
||||
@@ -1,96 +1,37 @@
|
||||
<Control xmlns="https://spacestation14.io"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:gfx="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client"
|
||||
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls">
|
||||
|
||||
<TextureRect Access="Public" TexturePath="/Textures/Ohio/ohfuck.png" VerticalExpand="True" HorizontalExpand="True" Name="Background" Stretch="KeepAspectCovered"/>
|
||||
|
||||
<Control HorizontalAlignment="Center" VerticalAlignment="Center">
|
||||
|
||||
<PanelContainer StyleClasses="AngleRect" />
|
||||
|
||||
<BoxContainer Orientation="Vertical" MinSize="300 200">
|
||||
|
||||
<BoxContainer Orientation="Horizontal">
|
||||
|
||||
<Label Margin="8 0 0 0" Text="{Loc 'connecting-title'}"
|
||||
StyleClasses="LabelHeading" VAlign="Center" />
|
||||
|
||||
xmlns:mainMenu="clr-namespace:Content.Client.MainMenu">
|
||||
<mainMenu:BackgroundControl TexturePath="/Textures/Logo/logo-ru.png" Stretch="KeepAspectCentered" Name="Background"/>
|
||||
<Control HorizontalAlignment="Stretch" VerticalAlignment="Bottom">
|
||||
<PanelContainer MinWidth="900" StyleClasses="LobbyShadedBackground" HorizontalAlignment="Center">
|
||||
<BoxContainer Orientation="Horizontal" HorizontalAlignment="Center" Margin="4 4 4 4">
|
||||
<BoxContainer Orientation="Horizontal" Name="ConnectingStatus">
|
||||
<Label StyleClasses="LabelHeadingFuckingBigger" Text="{Loc 'connecting-in-progress'}" Align="Center" Margin="0 0 24 0" />
|
||||
<!-- Who the fuck named these cont- oh wait I did -->
|
||||
<Label Name="ConnectStatus" StyleClasses="LabelHeadingFuckingBigger" Align="Center" />
|
||||
</BoxContainer>
|
||||
<BoxContainer Orientation="Horizontal" Name="Disconnected">
|
||||
<Label Text="{Loc 'connecting-disconnected'}" StyleClasses="LabelHeadingFuckingBigger" Align="Center" Margin="0 0 24 0" />
|
||||
<Label Name="DisconnectReason" StyleClasses="LabelHeadingFuckingBigger" Align="Center" />
|
||||
</BoxContainer>
|
||||
</BoxContainer>
|
||||
<PanelContainer Name="ConnectFail" HorizontalAlignment="Center" VerticalAlignment="Center" Visible="False">
|
||||
<RichTextLabel Name="ConnectFailReason" />
|
||||
</PanelContainer>
|
||||
</PanelContainer>
|
||||
<PanelContainer HorizontalAlignment="Left">
|
||||
<Label Name="ConnectingAddress" StyleClasses="LabelSubText" Margin="4 4 4 4" VerticalAlignment="Bottom" />
|
||||
</PanelContainer>
|
||||
<PanelContainer StyleClasses="LobbyShadedBackground" HorizontalAlignment="Right">
|
||||
<BoxContainer Orientation="Horizontal" Margin="4 4 4 4">
|
||||
<Button Name="ExitButton" Text="{Loc 'connecting-exit'}"
|
||||
HorizontalAlignment="Right" HorizontalExpand="True" />
|
||||
|
||||
<Button Name="RetryButton" Text="{Loc 'connecting-retry'}"
|
||||
HorizontalAlignment="Right" HorizontalExpand="True" />
|
||||
<Button Name="RedialButton" Text="{Loc 'connecting-redial'}"
|
||||
Disabled="True"
|
||||
HorizontalAlignment="Right" HorizontalExpand="True" />
|
||||
</BoxContainer>
|
||||
|
||||
<controls:HighDivider />
|
||||
|
||||
<BoxContainer Orientation="Vertical" VerticalExpand="True" Margin="4 4 4 0">
|
||||
|
||||
<Control VerticalExpand="True" Margin="0 0 0 8">
|
||||
|
||||
<BoxContainer Orientation="Vertical" Name="ConnectingStatus">
|
||||
|
||||
<Label Text="{Loc 'connecting-in-progress'}" Align="Center" />
|
||||
|
||||
<!-- Who the fuck named these cont- oh wait I did -->
|
||||
|
||||
<Label Name="ConnectStatus" StyleClasses="LabelSubText" Align="Center" />
|
||||
|
||||
</BoxContainer>
|
||||
|
||||
<BoxContainer Orientation="Vertical" Name="ConnectFail" Visible="False">
|
||||
|
||||
<RichTextLabel Name="ConnectFailReason" VerticalAlignment="Stretch"/>
|
||||
|
||||
<Button Name="RetryButton" Text="{Loc 'connecting-retry'}"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalExpand="True" VerticalAlignment="Bottom" />
|
||||
|
||||
</BoxContainer>
|
||||
|
||||
<BoxContainer Orientation="Vertical" Name="Disconnected">
|
||||
|
||||
<Label Text="{Loc 'connecting-disconnected'}" Align="Center" />
|
||||
|
||||
<Label Name="DisconnectReason" Align="Center" />
|
||||
|
||||
<Button Name="ReconnectButton" Text="{Loc 'connecting-reconnect'}"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalExpand="True" VerticalAlignment="Bottom" />
|
||||
|
||||
<Button Name="RedialButton" Text="{Loc 'connecting-redial'}"
|
||||
Disabled="True"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalExpand="True" VerticalAlignment="Bottom" />
|
||||
|
||||
</BoxContainer>
|
||||
|
||||
</Control>
|
||||
|
||||
<Label Name="ConnectingAddress" StyleClasses="LabelSubText" HorizontalAlignment="Center" />
|
||||
|
||||
</BoxContainer>
|
||||
|
||||
<PanelContainer>
|
||||
|
||||
<PanelContainer.PanelOverride>
|
||||
|
||||
<gfx:StyleBoxFlat BackgroundColor="#444" ContentMarginTopOverride="2" />
|
||||
|
||||
</PanelContainer.PanelOverride>
|
||||
|
||||
</PanelContainer>
|
||||
|
||||
<BoxContainer Orientation="Horizontal" Margin="12 0 4 0" VerticalAlignment="Bottom">
|
||||
|
||||
<Label Text="{Loc 'connecting-tip'}" StyleClasses="LabelSubText" />
|
||||
|
||||
<Label Text="{Loc 'connecting-version'}" StyleClasses="LabelSubText"
|
||||
HorizontalAlignment="Right" HorizontalExpand="True" />
|
||||
|
||||
</BoxContainer>
|
||||
|
||||
</BoxContainer>
|
||||
|
||||
</PanelContainer>
|
||||
</Control>
|
||||
|
||||
</Control>
|
||||
|
||||
@@ -16,7 +16,7 @@ namespace Content.Client.Launcher;
|
||||
[GenerateTypedNameReferences]
|
||||
public sealed partial class LauncherConnectingGui : Control
|
||||
{
|
||||
private const float RedialWaitTimeSeconds = 15f;
|
||||
private const float RedialWaitTimeSeconds = 47f;
|
||||
private readonly LauncherConnecting _state;
|
||||
private readonly IRobustRandom _random;
|
||||
private readonly IPrototypeManager _prototype;
|
||||
@@ -36,10 +36,9 @@ public sealed partial class LauncherConnectingGui : Control
|
||||
|
||||
LayoutContainer.SetAnchorPreset(this, LayoutContainer.LayoutPreset.Wide);
|
||||
|
||||
Stylesheet = IoCManager.Resolve<IStylesheetManager>().SheetSpace;
|
||||
Stylesheet = IoCManager.Resolve<IStylesheetManager>().SheetNano;
|
||||
|
||||
ChangeLoginTip();
|
||||
ReconnectButton.OnPressed += _ => _state.RetryConnect();
|
||||
// Redial shouldn't fail, but if it does, try a reconnect (maybe we're being run from debug)
|
||||
RedialButton.OnPressed += _ =>
|
||||
{
|
||||
@@ -76,7 +75,6 @@ public sealed partial class LauncherConnectingGui : Control
|
||||
{
|
||||
var redialFlag = args?.RedialFlag ?? false;
|
||||
RedialButton.Visible = redialFlag;
|
||||
ReconnectButton.Visible = !redialFlag;
|
||||
}
|
||||
|
||||
private void ChangeLoginTip()
|
||||
|
||||
@@ -108,7 +108,7 @@
|
||||
|
||||
</PanelContainer>
|
||||
|
||||
<BoxContainer Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Bottom">
|
||||
<BoxContainer Name="VersionLabel" Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Bottom">
|
||||
|
||||
<PanelContainer StyleClasses="LobbyGayBackground">
|
||||
|
||||
|
||||
@@ -37,6 +37,7 @@ namespace Content.Client.Lobby.UI
|
||||
Version.Visible = true;
|
||||
LabelName.Visible = true;
|
||||
Changelog.Visible = true;
|
||||
VersionLabel.Visible = true;
|
||||
break;
|
||||
case LobbyGuiState.CharacterSetup:
|
||||
CharacterSetupState.Visible = true;
|
||||
@@ -45,6 +46,7 @@ namespace Content.Client.Lobby.UI
|
||||
Version.Visible = false;
|
||||
LabelName.Visible = false;
|
||||
Changelog.Visible = false;
|
||||
VersionLabel.Visible = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
52
Content.Client/MainMenu/BackgroundControl.cs
Normal file
52
Content.Client/MainMenu/BackgroundControl.cs
Normal file
@@ -0,0 +1,52 @@
|
||||
using Robust.Client.Graphics;
|
||||
using Robust.Client.UserInterface.Controls;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Client.MainMenu;
|
||||
|
||||
public sealed class BackgroundControl : TextureRect
|
||||
{
|
||||
[Dependency] private readonly IClyde _clyde = default!;
|
||||
[Dependency] private readonly IPrototypeManager _prototype = default!;
|
||||
|
||||
private IRenderTexture? _buffer;
|
||||
private readonly ShaderInstance _glitchShader;
|
||||
|
||||
public BackgroundControl()
|
||||
{
|
||||
IoCManager.InjectDependencies(this);
|
||||
|
||||
_glitchShader = _prototype.Index<ShaderPrototype>("Cyberglitch").Instance().Duplicate();
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
|
||||
_buffer?.Dispose();
|
||||
}
|
||||
|
||||
protected override void Resized()
|
||||
{
|
||||
base.Resized();
|
||||
|
||||
_buffer?.Dispose();
|
||||
_buffer = _clyde.CreateRenderTarget(PixelSize, RenderTargetColorFormat.Rgba8Srgb, default);
|
||||
}
|
||||
|
||||
protected override void Draw(DrawingHandleScreen handle)
|
||||
{
|
||||
if (_buffer is null)
|
||||
return;
|
||||
|
||||
handle.RenderInRenderTarget(_buffer, () =>
|
||||
{
|
||||
base.Draw(handle);
|
||||
}, Color.Transparent);
|
||||
|
||||
handle.UseShader(_glitchShader);
|
||||
|
||||
handle.DrawTextureRect(_buffer.Texture, PixelSizeBox);
|
||||
handle.UseShader(null);
|
||||
}
|
||||
}
|
||||
@@ -18,7 +18,7 @@
|
||||
<customControls:HSeparator StyleClasses="LowDivider" Margin="0 0 0 10"/>
|
||||
<PanelContainer VerticalExpand="True">
|
||||
<PanelContainer.PanelOverride>
|
||||
<gfx:StyleBoxFlat BackgroundColor="#1B1B1E" />
|
||||
<gfx:StyleBoxFlat BackgroundColor="#212121" />
|
||||
</PanelContainer.PanelOverride>
|
||||
<ScrollContainer
|
||||
HScrollEnabled="False"
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
<BoxContainer VerticalExpand="True" Margin="10 0 10 10" Orientation="Vertical">
|
||||
<PanelContainer VerticalExpand="True" MinSize="0 200">
|
||||
<PanelContainer.PanelOverride>
|
||||
<gfx:StyleBoxFlat BackgroundColor="#212723" />
|
||||
<gfx:StyleBoxFlat BackgroundColor="#050505" />
|
||||
</PanelContainer.PanelOverride>
|
||||
<ScrollContainer
|
||||
HScrollEnabled="False"
|
||||
|
||||
@@ -14,7 +14,7 @@ namespace Content.Client.NetworkConfigurator;
|
||||
[GenerateTypedNameReferences]
|
||||
public sealed partial class NetworkConfiguratorLinkMenu : FancyWindow
|
||||
{
|
||||
private const string PanelBgColor = "#202023";
|
||||
private const string PanelBgColor = "#202020";
|
||||
|
||||
private readonly LinksRender _links;
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<DefaultWindow xmlns="https://spacestation14.io"
|
||||
xmlns:tabs="clr-namespace:Content.Client.Options.UI.Tabs"
|
||||
Title="{Loc 'ui-options-title'}"
|
||||
MinSize="980 450">
|
||||
MinSize="980 500">
|
||||
<TabContainer Name="Tabs" Access="Public">
|
||||
<tabs:MiscTab Name="MiscTab" />
|
||||
<tabs:GraphicsTab Name="GraphicsTab" />
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
<BoxContainer Orientation="Horizontal"
|
||||
Align="End"
|
||||
HorizontalExpand="True"
|
||||
Margin="8 8"
|
||||
VerticalExpand="True">
|
||||
<Button Name="ResetButton"
|
||||
Text="{Loc 'ui-options-reset-all'}"
|
||||
|
||||
@@ -142,11 +142,13 @@
|
||||
Text="{Loc 'ui-options-reset-all'}"
|
||||
StyleClasses="Caution"
|
||||
HorizontalExpand="True"
|
||||
Margin="8 8"
|
||||
HorizontalAlignment="Right" />
|
||||
<Control MinSize="2 0" />
|
||||
<Button Name="ApplyButton"
|
||||
Text="{Loc 'ui-options-apply'}"
|
||||
TextAlign="Center"
|
||||
Margin="8 8"
|
||||
HorizontalAlignment="Right" />
|
||||
</BoxContainer>
|
||||
</controls:StripeBack>
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
<Button Name="ApplyButton"
|
||||
Text="{Loc 'ui-options-apply'}"
|
||||
TextAlign="Center"
|
||||
Margin="8 8"
|
||||
HorizontalAlignment="Right" />
|
||||
</controls:StripeBack>
|
||||
</BoxContainer>
|
||||
|
||||
@@ -183,6 +183,7 @@ namespace Content.Client.Options.UI.Tabs
|
||||
AddButton(ContentKeyFunctions.SwapHands);
|
||||
AddButton(ContentKeyFunctions.MoveStoredItem);
|
||||
AddButton(ContentKeyFunctions.RotateStoredItem);
|
||||
AddButton(ContentKeyFunctions.LieDown); // WD EDIT
|
||||
|
||||
AddHeader("ui-options-header-interaction-adv");
|
||||
AddButton(ContentKeyFunctions.SmartEquipBackpack);
|
||||
|
||||
@@ -59,6 +59,7 @@
|
||||
<Button Name="ApplyButton"
|
||||
Text="{Loc 'ui-options-apply'}"
|
||||
TextAlign="Center"
|
||||
Margin="8 8"
|
||||
HorizontalAlignment="Right" />
|
||||
</controls:StripeBack>
|
||||
</BoxContainer>
|
||||
|
||||
@@ -81,6 +81,7 @@
|
||||
<BoxContainer Orientation="Horizontal"
|
||||
Align="End"
|
||||
HorizontalExpand="True"
|
||||
Margin="8 8"
|
||||
VerticalExpand="True">
|
||||
<Button Name="ResetButton"
|
||||
Text="{Loc 'ui-options-reset-all'}"
|
||||
|
||||
@@ -19,13 +19,13 @@ public sealed partial class PdaNavigationButton : ContainerButton
|
||||
|
||||
private readonly StyleBoxFlat _styleBox = new()
|
||||
{
|
||||
BackgroundColor = Color.FromHex("#202023"),
|
||||
BackgroundColor = Color.FromHex("#202020"),
|
||||
BorderColor = Color.FromHex("#5a5a5a"),
|
||||
BorderThickness = new Thickness(0, 0, 0, 2)
|
||||
};
|
||||
|
||||
public string InactiveBgColor { get; set; } = "#202023";
|
||||
public string ActiveBgColor { get; set; } = "#141414";
|
||||
public string InactiveBgColor { get; set; } = "#202020";
|
||||
public string ActiveBgColor { get; set; } = "#050505";
|
||||
public string InactiveFgColor { get; set; } = "#5a5a5a";
|
||||
public string ActiveFgColor { get; set; } = "#FFFFFF";
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ public sealed partial class PdaProgramItem : ContainerButton
|
||||
|
||||
private readonly StyleBoxFlat _styleBox = new()
|
||||
{
|
||||
BackgroundColor = Color.FromHex("#141414")
|
||||
BackgroundColor = Color.FromHex("#050505")
|
||||
};
|
||||
|
||||
public Color BackgroundColor
|
||||
|
||||
@@ -18,7 +18,7 @@ public sealed partial class PdaSettingsButton : ContainerButton
|
||||
|
||||
private readonly StyleBoxFlat _styleBox = new()
|
||||
{
|
||||
BackgroundColor = Color.FromHex("#141414")
|
||||
BackgroundColor = Color.FromHex("#050505")
|
||||
};
|
||||
|
||||
public string? Text
|
||||
|
||||
@@ -37,7 +37,7 @@ public sealed class ParallaxControl : Control
|
||||
var ourSize = PixelSize;
|
||||
|
||||
var currentTime = (float) _timing.RealTime.TotalSeconds;
|
||||
var offset = Offset + new Vector2(currentTime * 100f, currentTime * 0f);
|
||||
var offset = Offset + new Vector2(currentTime * 0f, currentTime * 100f);
|
||||
|
||||
if (layer.Config.Tiled)
|
||||
{
|
||||
|
||||
@@ -86,13 +86,13 @@ namespace Content.Client.ParticleAccelerator.UI
|
||||
var back = new StyleBoxTexture
|
||||
{
|
||||
Texture = panelTex,
|
||||
Modulate = Color.FromHex("#141414"),
|
||||
Modulate = Color.FromHex("#050505"),
|
||||
};
|
||||
back.SetPatchMargin(StyleBox.Margin.All, 10);
|
||||
|
||||
var back2 = new StyleBoxTexture(back)
|
||||
{
|
||||
Modulate = Color.FromHex("#202023")
|
||||
Modulate = Color.FromHex("#202020")
|
||||
};
|
||||
|
||||
AddChild(new PanelContainer
|
||||
|
||||
@@ -10,13 +10,13 @@
|
||||
<Label Text="{Loc 'character-setup-gui-character-setup-label'}"
|
||||
Margin="8 0 0 0" VAlign="Center"
|
||||
StyleClasses="LabelHeadingBigger" />
|
||||
<Button Name="StatsButton" HorizontalExpand="True"
|
||||
Text="{Loc 'character-setup-gui-character-setup-stats-button'}"
|
||||
<Button Name="RulesButton" HorizontalExpand="True"
|
||||
Text="{Loc 'character-setup-gui-character-setup-rules-button'}"
|
||||
StyleClasses="ButtonBig"
|
||||
HorizontalAlignment="Right" />
|
||||
<Button Name="RulesButton"
|
||||
Text="{Loc 'character-setup-gui-character-setup-rules-button'}"
|
||||
StyleClasses="ButtonBig"/>
|
||||
<Button Name="StatsButton"
|
||||
StyleClasses="ButtonBig"
|
||||
Text="{Loc 'character-setup-gui-character-setup-stats-button'}"/>
|
||||
<Button Name="SaveButton"
|
||||
Access="Public"
|
||||
Text="{Loc 'character-setup-gui-character-setup-save-button'}"
|
||||
@@ -31,16 +31,18 @@
|
||||
<gfx:StyleBoxFlat BackgroundColor="{x:Static style:StyleNano.NanoGold}" ContentMarginTopOverride="2" />
|
||||
</PanelContainer.PanelOverride>
|
||||
</PanelContainer>
|
||||
<BoxContainer Orientation="Horizontal" VerticalExpand="True" SeparationOverride="0">
|
||||
<ScrollContainer MinSize="325 0" Margin="5 5 0 0">
|
||||
<BoxContainer Name="Characters" Orientation="Vertical" />
|
||||
<BoxContainer Orientation="Vertical" VerticalExpand="True" HorizontalExpand="True" SeparationOverride="0">
|
||||
<ScrollContainer MinSize="450 90" Margin="5 5 5 5">
|
||||
<BoxContainer Name="Characters" Orientation="Horizontal" />
|
||||
</ScrollContainer>
|
||||
<PanelContainer MinSize="2 0">
|
||||
<PanelContainer MinSize="0 2">
|
||||
<PanelContainer.PanelOverride>
|
||||
<gfx:StyleBoxFlat BackgroundColor="{x:Static style:StyleNano.NanoGold}" ContentMarginTopOverride="2" />
|
||||
</PanelContainer.PanelOverride>
|
||||
</PanelContainer>
|
||||
<BoxContainer Name="CharEditor" />
|
||||
<BoxContainer Orientation="Horizontal" VerticalExpand="True" HorizontalExpand="True" SeparationOverride="0">
|
||||
<BoxContainer Name="CharEditor" HorizontalExpand="True" HorizontalAlignment="Stretch" />
|
||||
</BoxContainer>
|
||||
</BoxContainer>
|
||||
</BoxContainer>
|
||||
</Control>
|
||||
|
||||
@@ -76,6 +76,12 @@ namespace Content.Client.Preferences.UI
|
||||
|
||||
_humanoidProfileEditor = new HumanoidProfileEditor(preferencesManager, prototypeManager, entityManager, configurationManager);
|
||||
_humanoidProfileEditor.OnProfileChanged += ProfileChanged;
|
||||
|
||||
// WD-EDIT start
|
||||
_humanoidProfileEditor.HorizontalExpand = true;
|
||||
_humanoidProfileEditor.HorizontalAlignment = HAlignment.Stretch;
|
||||
// WD-EDIT end
|
||||
|
||||
CharEditor.AddChild(_humanoidProfileEditor);
|
||||
|
||||
UpdateUI();
|
||||
@@ -194,7 +200,7 @@ namespace Content.Client.Preferences.UI
|
||||
|
||||
var view = new SpriteView
|
||||
{
|
||||
Scale = new Vector2(2, 2),
|
||||
Scale = new Vector2((float) 1.45, (float) 1.45),
|
||||
OverrideDirection = Direction.South
|
||||
};
|
||||
view.SetEntity(_previewDummy);
|
||||
@@ -212,6 +218,9 @@ namespace Content.Client.Preferences.UI
|
||||
{
|
||||
Text = description,
|
||||
ClipText = true,
|
||||
// WD-EDIT start
|
||||
MinSize = new Vector2(100, 0),
|
||||
// WD-EDIT end
|
||||
HorizontalExpand = true
|
||||
};
|
||||
var deleteButton = new Button
|
||||
@@ -243,6 +252,9 @@ namespace Content.Client.Preferences.UI
|
||||
{
|
||||
Orientation = LayoutOrientation.Horizontal,
|
||||
HorizontalExpand = true,
|
||||
// WD-EDIT start
|
||||
MinSize = new Vector2(125, 0),
|
||||
// WD-EDIT end
|
||||
SeparationOverride = 0,
|
||||
Children =
|
||||
{
|
||||
|
||||
@@ -1,190 +1,215 @@
|
||||
<Control xmlns="https://spacestation14.io"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:prefUi="clr-namespace:Content.Client.Preferences.UI"
|
||||
xmlns:humanoid="clr-namespace:Content.Client.Humanoid"
|
||||
xmlns:cc="clr-namespace:Content.Client.Administration.UI.CustomControls">
|
||||
xmlns:humanoid="clr-namespace:Content.Client.Humanoid">
|
||||
<BoxContainer Orientation="Horizontal">
|
||||
<!-- Left side -->
|
||||
<BoxContainer Orientation="Vertical" Margin="10 10 10 10">
|
||||
<BoxContainer Orientation="Horizontal" HorizontalExpand="True" HorizontalAlignment="Stretch" Margin="10 10 10 10">
|
||||
<!-- Middle container -->
|
||||
<BoxContainer Orientation="Horizontal" SeparationOverride="10">
|
||||
<BoxContainer Orientation="Vertical" SeparationOverride="10">
|
||||
<!-- Name box-->
|
||||
<BoxContainer Orientation="Vertical">
|
||||
<prefUi:HighlightedContainer>
|
||||
<BoxContainer Orientation="Vertical">
|
||||
<prefUi:HighlightedContainer>
|
||||
<BoxContainer Orientation="Vertical">
|
||||
<BoxContainer Orientation="Horizontal" VerticalExpand="True">
|
||||
<Label Text="{Loc 'humanoid-profile-editor-name-label'}" />
|
||||
<LineEdit Name="CNameEdit" MinSize="270 0" VerticalAlignment="Center" Margin="5 0 0 0" />
|
||||
<Button Name="CNameRandomize" Text="{Loc 'humanoid-profile-editor-name-random-button'}" />
|
||||
<PanelContainer StyleClasses="GayShitBackground">
|
||||
<BoxContainer Orientation="Vertical">
|
||||
<prefUi:HighlightedContainer>
|
||||
<BoxContainer Orientation="Vertical">
|
||||
<prefUi:HighlightedContainer>
|
||||
<BoxContainer Orientation="Vertical">
|
||||
<GridContainer Columns="3">
|
||||
<Label Text="{Loc 'humanoid-profile-editor-name-label'}" />
|
||||
<LineEdit Name="CNameEdit" MinSize="200 0" VerticalAlignment="Center" Margin="5 0 0 0" />
|
||||
<Control MinHeight="5" />
|
||||
|
||||
<Label Text="{Loc 'humanoid-profile-editor-clown-name-label'}" />
|
||||
<LineEdit Name="CClownNameEdit" MinSize="200 0" VerticalAlignment="Center" Margin="5 0 0 0" />
|
||||
<Button Name="CClownNameRandomize" Text="{Loc 'humanoid-profile-editor-name-random-button'}" />
|
||||
|
||||
<Label Text="{Loc 'humanoid-profile-editor-mime-name-label'}" />
|
||||
<LineEdit Name="CMimeNameEdit" MinSize="200 0" VerticalAlignment="Center" Margin="5 0 0 0" />
|
||||
<Button Name="CMimeNameRandomize" Text="{Loc 'humanoid-profile-editor-name-random-button'}" />
|
||||
|
||||
<Label Text="{Loc 'humanoid-profile-editor-borg-name-label'}" />
|
||||
<LineEdit Name="CBorgNameEdit" MinSize="200 0" VerticalAlignment="Center" Margin="5 0 0 0" />
|
||||
<Button Name="CBorgNameRandomize" Text="{Loc 'humanoid-profile-editor-name-random-button'}" />
|
||||
|
||||
<Button Name="CNameRandomize" Text="{Loc 'humanoid-profile-editor-name-random-button'}"
|
||||
HorizontalAlignment="Center"
|
||||
HorizontalExpand="False" MaxWidth="200" />
|
||||
<Button Name="CRandomizeEverything" HorizontalAlignment="Center"
|
||||
HorizontalExpand="False" MaxWidth="200"
|
||||
Text="{Loc 'humanoid-profile-editor-randomize-everything-button'}" />
|
||||
</GridContainer>
|
||||
<RichTextLabel Name="CWarningLabel" HorizontalExpand="False"
|
||||
VerticalExpand="True" MaxWidth="400"
|
||||
HorizontalAlignment="Left" />
|
||||
</BoxContainer>
|
||||
<BoxContainer Orientation="Horizontal" VerticalExpand="True">
|
||||
<Label Text="{Loc 'humanoid-profile-editor-clown-name-label'}" />
|
||||
<LineEdit Name="CClownNameEdit" MinSize="270 0" VerticalAlignment="Center" Margin="5 0 0 0" />
|
||||
<Button Name="CClownNameRandomize" Text="{Loc 'humanoid-profile-editor-name-random-button'}" />
|
||||
</BoxContainer>
|
||||
<BoxContainer Orientation="Horizontal" VerticalExpand="True">
|
||||
<Label Text="{Loc 'humanoid-profile-editor-mime-name-label'}" />
|
||||
<LineEdit Name="CMimeNameEdit" MinSize="270 0" VerticalAlignment="Center" Margin="5 0 0 0" />
|
||||
<Button Name="CMimeNameRandomize" Text="{Loc 'humanoid-profile-editor-name-random-button'}" />
|
||||
</BoxContainer>
|
||||
<BoxContainer Orientation="Horizontal" VerticalExpand="True">
|
||||
<Label Text="{Loc 'humanoid-profile-editor-borg-name-label'}" />
|
||||
<LineEdit Name="CBorgNameEdit" MinSize="270 0" VerticalAlignment="Center" Margin="5 0 0 0" />
|
||||
<Button Name="CBorgNameRandomize" Text="{Loc 'humanoid-profile-editor-name-random-button'}" />
|
||||
</BoxContainer>
|
||||
<Button Name="CRandomizeEverything" HorizontalAlignment="Center"
|
||||
HorizontalExpand="False" MaxWidth="256"
|
||||
Text="{Loc 'humanoid-profile-editor-randomize-everything-button'}" />
|
||||
<RichTextLabel Name="CWarningLabel" HorizontalExpand="False"
|
||||
VerticalExpand="True" MaxWidth="425"
|
||||
HorizontalAlignment="Left" />
|
||||
</BoxContainer>
|
||||
</prefUi:HighlightedContainer>
|
||||
</BoxContainer>
|
||||
</prefUi:HighlightedContainer>
|
||||
</BoxContainer>
|
||||
</prefUi:HighlightedContainer>
|
||||
</BoxContainer>
|
||||
</prefUi:HighlightedContainer>
|
||||
</BoxContainer>
|
||||
</PanelContainer>
|
||||
<!-- Import/Export -->
|
||||
<BoxContainer Orientation="Vertical">
|
||||
<prefUi:HighlightedContainer>
|
||||
<BoxContainer Orientation="Horizontal">
|
||||
<Button Text="{Loc 'humanoid-profile-editor-import-button'}" Disabled="True"
|
||||
ToolTip="{Loc 'generic-not-yet-implemented'}" />
|
||||
<Button Text="{Loc 'humanoid-profile-editor-export-button'}" Disabled="True"
|
||||
ToolTip="{Loc 'generic-not-yet-implemented'}" />
|
||||
<PanelContainer StyleClasses="GayShitBackground">
|
||||
<BoxContainer Orientation="Vertical">
|
||||
<prefUi:HighlightedContainer>
|
||||
<BoxContainer Orientation="Horizontal">
|
||||
<Button Text="{Loc 'humanoid-profile-editor-import-button'}" Disabled="True"
|
||||
ToolTip="{Loc 'generic-not-yet-implemented'}"
|
||||
HorizontalAlignment="Center" />
|
||||
<Button Text="{Loc 'humanoid-profile-editor-export-button'}" Disabled="True"
|
||||
ToolTip="{Loc 'generic-not-yet-implemented'}"
|
||||
HorizontalAlignment="Center" />
|
||||
<!-- Save -->
|
||||
<Button Name="CSaveButton" Text="{Loc 'humanoid-profile-editor-save-button'}" HorizontalAlignment="Center" />
|
||||
</BoxContainer>
|
||||
</prefUi:HighlightedContainer>
|
||||
</BoxContainer>
|
||||
</PanelContainer>
|
||||
<PanelContainer StyleClasses="GayShitBackground">
|
||||
<BoxContainer Orientation="Vertical" VerticalExpand="True" HorizontalExpand="True" VerticalAlignment="Center">
|
||||
<SpriteView Name="CSpriteView" Scale="8 8" SizeFlagsStretchRatio="1" />
|
||||
<BoxContainer Orientation="Horizontal" HorizontalAlignment="Center" Margin="0 5">
|
||||
<Button Name="CSpriteRotateLeft" Text="◀" StyleClasses="OpenRight" />
|
||||
<Button Name="CSpriteRotateRight" Text="▶" StyleClasses="OpenLeft" />
|
||||
</BoxContainer>
|
||||
</prefUi:HighlightedContainer>
|
||||
<!-- Save -->
|
||||
<prefUi:HighlightedContainer>
|
||||
<Button Name="CSaveButton" Text="{Loc 'humanoid-profile-editor-save-button'}" HorizontalAlignment="Center" />
|
||||
</prefUi:HighlightedContainer>
|
||||
</BoxContainer>
|
||||
</BoxContainer>
|
||||
</PanelContainer>
|
||||
</BoxContainer>
|
||||
<Control MinHeight="10" />
|
||||
<Control MinWidth="10" />
|
||||
<!-- tabContainer -->
|
||||
<TabContainer Name="CTabContainer" VerticalExpand="True">
|
||||
<BoxContainer Orientation="Vertical">
|
||||
<ScrollContainer VerticalExpand="True">
|
||||
<!-- appearanceList -->
|
||||
<BoxContainer Orientation="Vertical">
|
||||
<BoxContainer Margin="10" Orientation="Vertical" HorizontalExpand="True">
|
||||
<!-- Species -->
|
||||
<BoxContainer HorizontalExpand="True">
|
||||
<Label Text="{Loc 'humanoid-profile-editor-species-label'}" />
|
||||
<Control HorizontalExpand="True"/>
|
||||
<OptionButton Name="CSpeciesButton" HorizontalAlignment="Right" />
|
||||
<PanelContainer StyleClasses="GayShitBackground" HorizontalExpand="True" HorizontalAlignment="Stretch">
|
||||
<TabContainer Name="CTabContainer" MinWidth="750" VerticalExpand="True" HorizontalExpand="True">
|
||||
<BoxContainer Orientation="Vertical">
|
||||
<ScrollContainer VerticalExpand="True">
|
||||
<!-- appearanceList -->
|
||||
<BoxContainer Orientation="Vertical">
|
||||
<!-- SexAndAgeRow -->
|
||||
<BoxContainer Orientation="Horizontal" SeparationOverride="10">
|
||||
<!-- Sex -->
|
||||
<prefUi:HighlightedContainer>
|
||||
<BoxContainer Orientation="Horizontal">
|
||||
<Label Text="{Loc 'humanoid-profile-editor-sex-label'}" />
|
||||
<OptionButton Name="CSexButton" />
|
||||
</BoxContainer>
|
||||
</prefUi:HighlightedContainer>
|
||||
<!-- Body Type -->
|
||||
<prefUi:HighlightedContainer>
|
||||
<BoxContainer Orientation="Horizontal">
|
||||
<Label Text="{Loc 'humanoid-profile-editor-body-type-label'}"></Label>
|
||||
<OptionButton Name="CBodyTypesButton" />
|
||||
</BoxContainer>
|
||||
</prefUi:HighlightedContainer>
|
||||
<!-- Age -->
|
||||
<prefUi:HighlightedContainer>
|
||||
<BoxContainer Orientation="Horizontal">
|
||||
<Label Text="{Loc 'humanoid-profile-editor-age-label'}" />
|
||||
<LineEdit Name="CAgeEdit" MinSize="40 0" />
|
||||
</BoxContainer>
|
||||
</prefUi:HighlightedContainer>
|
||||
<!-- Gender -->
|
||||
<prefUi:HighlightedContainer>
|
||||
<BoxContainer Orientation="Horizontal">
|
||||
<Label Text="{Loc 'humanoid-profile-editor-pronouns-label'}" />
|
||||
<OptionButton Name="CPronounsButton" />
|
||||
</BoxContainer>
|
||||
</prefUi:HighlightedContainer>
|
||||
<prefUi:HighlightedContainer>
|
||||
<BoxContainer Orientation="Horizontal">
|
||||
<Label Text="{Loc 'humanoid-profile-editor-voice-label'}" />
|
||||
<OptionButton Name="CVoiceButton" />
|
||||
<Button Name="CVoicePlayButton" Text="{Loc 'humanoid-profile-editor-voice-play'}" MaxWidth="80" />
|
||||
</BoxContainer>
|
||||
</prefUi:HighlightedContainer>
|
||||
</BoxContainer>
|
||||
<!-- Body Type -->
|
||||
<BoxContainer Orientation="Horizontal">
|
||||
<Label Text="{Loc 'humanoid-profile-editor-body-type-label'}"/>
|
||||
<Control HorizontalExpand="True"/>
|
||||
<OptionButton Name="CBodyTypesButton" HorizontalAlignment="Right" />
|
||||
</BoxContainer>
|
||||
<!-- Age -->
|
||||
<BoxContainer HorizontalExpand="True">
|
||||
<Label Text="{Loc 'humanoid-profile-editor-age-label'}" />
|
||||
<Control HorizontalExpand="True"/>
|
||||
<LineEdit Name="CAgeEdit" MinSize="40 0" HorizontalAlignment="Right" />
|
||||
</BoxContainer>
|
||||
<!-- Sex -->
|
||||
<BoxContainer HorizontalExpand="True">
|
||||
<Label Text="{Loc 'humanoid-profile-editor-sex-label'}" />
|
||||
<Control HorizontalExpand="True"/>
|
||||
<OptionButton Name="CSexButton" HorizontalAlignment="Right" />
|
||||
</BoxContainer>
|
||||
<!-- Pronouns -->
|
||||
<BoxContainer HorizontalExpand="True">
|
||||
<Label Text="{Loc 'humanoid-profile-editor-pronouns-label'}" />
|
||||
<Control HorizontalExpand="True"/>
|
||||
<OptionButton Name="CPronounsButton" HorizontalAlignment="Right" />
|
||||
</BoxContainer>
|
||||
<!-- TTS -->
|
||||
<BoxContainer HorizontalExpand="True">
|
||||
<Label Text="{Loc 'humanoid-profile-editor-voice-label'}" />
|
||||
<Control HorizontalExpand="True"/>
|
||||
<OptionButton Name="CVoiceButton" HorizontalAlignment="Right" />
|
||||
<Button Name="CVoicePlayButton" Text=">" MaxWidth="80" />
|
||||
</BoxContainer>
|
||||
<!-- Show clothing -->
|
||||
<BoxContainer HorizontalExpand="True">
|
||||
<Label Text="{Loc 'humanoid-profile-editor-clothing'}" />
|
||||
<Control HorizontalExpand="True"/>
|
||||
<Button Name="ShowClothes" Pressed="True" ToggleMode="True" Text="{Loc 'humanoid-profile-editor-clothing-show'}" HorizontalAlignment="Right" />
|
||||
</BoxContainer>
|
||||
<!-- Clothing -->
|
||||
<BoxContainer HorizontalExpand="True">
|
||||
<Label Text="{Loc 'humanoid-profile-editor-clothing-label'}" />
|
||||
<Control HorizontalExpand="True"/>
|
||||
<OptionButton Name="CClothingButton" HorizontalAlignment="Right" />
|
||||
</BoxContainer>
|
||||
<!-- Backpack -->
|
||||
<BoxContainer HorizontalExpand="True">
|
||||
<Label Text="{Loc 'humanoid-profile-editor-backpack-label'}" />
|
||||
<Control HorizontalExpand="True"/>
|
||||
<OptionButton Name="CBackpackButton" HorizontalAlignment="Right" />
|
||||
</BoxContainer>
|
||||
<!-- Spawn Priority -->
|
||||
<BoxContainer HorizontalExpand="True">
|
||||
<Label Text="{Loc 'humanoid-profile-editor-spawn-priority-label'}" />
|
||||
<Control HorizontalExpand="True"/>
|
||||
<OptionButton Name="CSpawnPriorityButton" HorizontalAlignment="Right" />
|
||||
<BoxContainer Orientation="Horizontal" SeparationOverride="10">
|
||||
<!-- Species -->
|
||||
<prefUi:HighlightedContainer>
|
||||
<BoxContainer Orientation="Horizontal">
|
||||
<Label Text="{Loc 'humanoid-profile-editor-species-label'}" />
|
||||
<OptionButton Name="CSpeciesButton" />
|
||||
</BoxContainer>
|
||||
</prefUi:HighlightedContainer>
|
||||
<!-- Show clothing -->
|
||||
<prefUi:HighlightedContainer>
|
||||
<BoxContainer HorizontalExpand="True">
|
||||
<Label Text="{Loc 'humanoid-profile-editor-clothing'}" />
|
||||
<Button Name="ShowClothes" Pressed="True" ToggleMode="True" Text="{Loc 'humanoid-profile-editor-clothing-show'}" HorizontalAlignment="Right" />
|
||||
</BoxContainer>
|
||||
</prefUi:HighlightedContainer>
|
||||
<!-- Clothing -->
|
||||
<prefUi:HighlightedContainer>
|
||||
<BoxContainer Orientation="Horizontal">
|
||||
<Label Text="{Loc 'humanoid-profile-editor-clothing-label'}" />
|
||||
<OptionButton Name="CClothingButton" />
|
||||
</BoxContainer>
|
||||
</prefUi:HighlightedContainer>
|
||||
<!-- Backpack -->
|
||||
<prefUi:HighlightedContainer>
|
||||
<BoxContainer Orientation="Horizontal">
|
||||
<Label Text="{Loc 'humanoid-profile-editor-backpack-label'}" />
|
||||
<OptionButton Name="CBackpackButton" />
|
||||
</BoxContainer>
|
||||
</prefUi:HighlightedContainer>
|
||||
<!-- Spawn Priority -->
|
||||
<prefUi:HighlightedContainer>
|
||||
<BoxContainer HorizontalExpand="True">
|
||||
<Label Text="{Loc 'humanoid-profile-editor-spawn-priority-label'}" />
|
||||
<Control HorizontalExpand="True"/>
|
||||
<OptionButton Name="CSpawnPriorityButton" HorizontalAlignment="Right" />
|
||||
</BoxContainer>
|
||||
</prefUi:HighlightedContainer>
|
||||
</BoxContainer>
|
||||
<!-- Skin -->
|
||||
<prefUi:HighlightedContainer>
|
||||
<BoxContainer HorizontalExpand="True" Orientation="Vertical">
|
||||
<Label Text="{Loc 'humanoid-profile-editor-skin-color-label'}" />
|
||||
<Slider HorizontalExpand="True" Name="CSkin" MinValue="0" MaxValue="100" Value="20" />
|
||||
<BoxContainer Name="CRgbSkinColorContainer" Visible="False" Orientation="Vertical" HorizontalExpand="True"></BoxContainer>
|
||||
</BoxContainer>
|
||||
</prefUi:HighlightedContainer>
|
||||
<!-- Eyes -->
|
||||
<prefUi:HighlightedContainer>
|
||||
<BoxContainer Orientation="Vertical">
|
||||
<Label Text="{Loc 'humanoid-profile-editor-eyes-label'}" />
|
||||
<humanoid:EyeColorPicker Name="CEyeColorPicker" />
|
||||
</BoxContainer>
|
||||
</prefUi:HighlightedContainer>
|
||||
<!-- Hair -->
|
||||
<prefUi:HighlightedContainer>
|
||||
<BoxContainer Orientation="Horizontal">
|
||||
<humanoid:SingleMarkingPicker Name="CHairStylePicker" Category="Hair" />
|
||||
<humanoid:SingleMarkingPicker Name="CFacialHairPicker" Category="FacialHair" />
|
||||
</BoxContainer>
|
||||
</prefUi:HighlightedContainer>
|
||||
</BoxContainer>
|
||||
<!-- Skin -->
|
||||
<BoxContainer Margin="10" HorizontalExpand="True" Orientation="Vertical">
|
||||
<Label Text="{Loc 'humanoid-profile-editor-skin-color-label'}" />
|
||||
<Slider HorizontalExpand="True" Name="CSkin" MinValue="0" MaxValue="100" Value="20" />
|
||||
<BoxContainer Name="CRgbSkinColorContainer" Visible="False" Orientation="Vertical" HorizontalExpand="True"></BoxContainer>
|
||||
</BoxContainer>
|
||||
<!-- Hair -->
|
||||
<BoxContainer Margin="10" Orientation="Horizontal">
|
||||
<humanoid:SingleMarkingPicker Name="CHairStylePicker" Category="Hair" />
|
||||
<humanoid:SingleMarkingPicker Name="CFacialHairPicker" Category="FacialHair" />
|
||||
</BoxContainer>
|
||||
<!-- Eyes -->
|
||||
<BoxContainer Margin="10" Orientation="Vertical">
|
||||
<Label Text="{Loc 'humanoid-profile-editor-eyes-label'}" />
|
||||
<humanoid:EyeColorPicker Name="CEyeColorPicker" />
|
||||
</BoxContainer>
|
||||
</BoxContainer>
|
||||
</ScrollContainer>
|
||||
</BoxContainer>
|
||||
<BoxContainer Orientation="Vertical">
|
||||
<!-- Jobs -->
|
||||
<OptionButton Name="CPreferenceUnavailableButton" />
|
||||
<ScrollContainer VerticalExpand="True">
|
||||
<BoxContainer Name="CJobList" Orientation="Vertical" />
|
||||
</ScrollContainer>
|
||||
</BoxContainer>
|
||||
<BoxContainer Orientation="Vertical" Margin="10">
|
||||
<!-- Antags -->
|
||||
<ScrollContainer VerticalExpand="True">
|
||||
<BoxContainer Name="CAntagList" Orientation="Vertical" />
|
||||
</ScrollContainer>
|
||||
</BoxContainer>
|
||||
<BoxContainer Orientation="Vertical" Margin="10">
|
||||
<!-- Traits -->
|
||||
<ScrollContainer VerticalExpand="True">
|
||||
<BoxContainer Name="CTraitsList" Orientation="Vertical" />
|
||||
</ScrollContainer>
|
||||
</BoxContainer>
|
||||
<BoxContainer Name="CMarkingsTab" Orientation="Vertical" Margin="10">
|
||||
<!-- Markings -->
|
||||
<ScrollContainer VerticalExpand="True">
|
||||
<humanoid:MarkingPicker Name="CMarkings" IgnoreCategories="Hair,FacialHair" />
|
||||
</ScrollContainer>
|
||||
</BoxContainer>
|
||||
</TabContainer>
|
||||
</BoxContainer>
|
||||
<!-- Right side -->
|
||||
<BoxContainer Orientation="Vertical" VerticalExpand="True" HorizontalExpand="True" VerticalAlignment="Center">
|
||||
<SpriteView Name="CSpriteView" Scale="8 8" SizeFlagsStretchRatio="1" />
|
||||
<BoxContainer Orientation="Horizontal" HorizontalAlignment="Center" Margin="0 5">
|
||||
<Button Name="CSpriteRotateLeft" Text="◀" StyleClasses="OpenRight" />
|
||||
<cc:VSeparator Margin="2 0 3 0" />
|
||||
<Button Name="CSpriteRotateRight" Text="▶" StyleClasses="OpenLeft" />
|
||||
</BoxContainer>
|
||||
</ScrollContainer>
|
||||
</BoxContainer>
|
||||
<BoxContainer Orientation="Vertical">
|
||||
<!-- Jobs -->
|
||||
<OptionButton Name="CPreferenceUnavailableButton" />
|
||||
<ScrollContainer VerticalExpand="True">
|
||||
<BoxContainer Name="CJobList" Orientation="Vertical" />
|
||||
</ScrollContainer>
|
||||
</BoxContainer>
|
||||
<BoxContainer Orientation="Vertical" Margin="10">
|
||||
<!-- Antags -->
|
||||
<ScrollContainer VerticalExpand="True">
|
||||
<BoxContainer Name="CAntagList" Orientation="Vertical" />
|
||||
</ScrollContainer>
|
||||
</BoxContainer>
|
||||
<BoxContainer Orientation="Vertical" Margin="10">
|
||||
<!-- Traits -->
|
||||
<ScrollContainer VerticalExpand="True">
|
||||
<BoxContainer Name="CTraitsList" Orientation="Vertical" />
|
||||
</ScrollContainer>
|
||||
</BoxContainer>
|
||||
<BoxContainer Name="CMarkingsTab" Orientation="Vertical" Margin="10">
|
||||
<!-- Markings -->
|
||||
<ScrollContainer VerticalExpand="True">
|
||||
<humanoid:MarkingPicker Name="CMarkings" IgnoreCategories="Hair,FacialHair" />
|
||||
</ScrollContainer>
|
||||
</BoxContainer>
|
||||
</TabContainer>
|
||||
</PanelContainer>
|
||||
</BoxContainer>
|
||||
</BoxContainer>
|
||||
</Control>
|
||||
|
||||
@@ -42,7 +42,6 @@ namespace Content.Client.Preferences.UI
|
||||
{
|
||||
PanelOverride = new StyleBoxFlat
|
||||
{
|
||||
BackgroundColor = new Color(25, 25, 25),
|
||||
ContentMarginTopOverride = 10,
|
||||
ContentMarginBottomOverride = 10,
|
||||
ContentMarginLeftOverride = 10,
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
<customControls:HSeparator StyleClasses="LowDivider" Margin="0 0 0 10"/>
|
||||
<PanelContainer VerticalExpand="True">
|
||||
<PanelContainer.PanelOverride>
|
||||
<gfx:StyleBoxFlat BackgroundColor="#1B1B1E" />
|
||||
<gfx:StyleBoxFlat BackgroundColor="#212121" />
|
||||
</PanelContainer.PanelOverride>
|
||||
<ScrollContainer
|
||||
HScrollEnabled="False"
|
||||
@@ -55,7 +55,7 @@
|
||||
<customControls:HSeparator StyleClasses="LowDivider" Margin="0 0 0 10"/>
|
||||
<PanelContainer VerticalExpand="True">
|
||||
<PanelContainer.PanelOverride>
|
||||
<gfx:StyleBoxFlat BackgroundColor="#1B1B1E" />
|
||||
<gfx:StyleBoxFlat BackgroundColor="#212121" />
|
||||
</PanelContainer.PanelOverride>
|
||||
<ScrollContainer
|
||||
HScrollEnabled="False"
|
||||
@@ -76,7 +76,7 @@
|
||||
Margin="0 0 10 10">
|
||||
<PanelContainer VerticalExpand="True" MinSize="0 200">
|
||||
<PanelContainer.PanelOverride>
|
||||
<gfx:StyleBoxFlat BackgroundColor="#1B1B1E" />
|
||||
<gfx:StyleBoxFlat BackgroundColor="#212121" />
|
||||
</PanelContainer.PanelOverride>
|
||||
<ScrollContainer
|
||||
HScrollEnabled="False"
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
<customControls:HSeparator Margin="0 10 0 10"/>
|
||||
<PanelContainer VerticalExpand="True">
|
||||
<PanelContainer.PanelOverride>
|
||||
<gfx:StyleBoxFlat BackgroundColor="#1B1B1E"/>
|
||||
<gfx:StyleBoxFlat BackgroundColor="#212121"/>
|
||||
</PanelContainer.PanelOverride>
|
||||
<BoxContainer HorizontalAlignment="Center" VerticalAlignment="Center">
|
||||
<SpriteView Name="BorgSprite" Scale="5 5"/>
|
||||
@@ -40,7 +40,7 @@
|
||||
<Label Text="{Loc 'borg-ui-modules-label'}" Margin="0 0 0 5"/>
|
||||
<PanelContainer VerticalExpand="True">
|
||||
<PanelContainer.PanelOverride>
|
||||
<gfx:StyleBoxFlat BackgroundColor="#1B1B1E"/>
|
||||
<gfx:StyleBoxFlat BackgroundColor="#212121"/>
|
||||
</PanelContainer.PanelOverride>
|
||||
<BoxContainer VerticalExpand="True" Orientation="Vertical">
|
||||
<ScrollContainer HScrollEnabled="False" HorizontalExpand="True" VerticalExpand="True">
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
VerticalExpand="True">
|
||||
<PanelContainer VerticalExpand="True" Margin="10 10 10 10">
|
||||
<PanelContainer.PanelOverride>
|
||||
<gfx:StyleBoxFlat BackgroundColor="#1B1B1E"/>
|
||||
<gfx:StyleBoxFlat BackgroundColor="#212121"/>
|
||||
</PanelContainer.PanelOverride>
|
||||
<ScrollContainer
|
||||
HScrollEnabled="False"
|
||||
|
||||
@@ -43,20 +43,11 @@ namespace Content.Client.Stylesheets
|
||||
|
||||
protected StyleBase(IResourceCache resCache)
|
||||
{
|
||||
var wariowareinc = resCache.GetFont
|
||||
(
|
||||
new []
|
||||
{
|
||||
"/Fonts/IBMPlexMono/IBMPlexMono-Regular.ttf"
|
||||
},
|
||||
12
|
||||
);
|
||||
|
||||
var notoSans12 = resCache.GetFont
|
||||
(
|
||||
new []
|
||||
{
|
||||
"/Fonts/IBMPlexMono/IBMPlexMono-Regular.ttf",
|
||||
"/Fonts/IBMPlexSans/IBMPlexSans-Regular.ttf",
|
||||
"/Fonts/NotoSans/NotoSansSymbols-Regular.ttf",
|
||||
"/Fonts/NotoSans/NotoSansSymbols2-Regular.ttf"
|
||||
},
|
||||
@@ -66,7 +57,7 @@ namespace Content.Client.Stylesheets
|
||||
(
|
||||
new []
|
||||
{
|
||||
"/Fonts/IBMPlexMono/IBMPlexMono-Italic.ttf",
|
||||
"/Fonts/IBMPlexSans/IBMPlexSans-Italic.ttf",
|
||||
"/Fonts/NotoSans/NotoSansSymbols-Regular.ttf",
|
||||
"/Fonts/NotoSans/NotoSansSymbols2-Regular.ttf"
|
||||
},
|
||||
@@ -168,7 +159,7 @@ namespace Content.Client.Stylesheets
|
||||
new SelectorElement(null, null, null, null),
|
||||
new[]
|
||||
{
|
||||
new StyleProperty("font", wariowareinc),
|
||||
new StyleProperty("font", notoSans12),
|
||||
}),
|
||||
|
||||
// Default font.
|
||||
@@ -176,7 +167,7 @@ namespace Content.Client.Stylesheets
|
||||
new SelectorElement(null, new[] {StyleClassItalic}, null, null),
|
||||
new[]
|
||||
{
|
||||
new StyleProperty("font", wariowareinc),
|
||||
new StyleProperty("font", notoSans12Italic),
|
||||
}),
|
||||
|
||||
// Window close button base texture.
|
||||
@@ -186,7 +177,7 @@ namespace Content.Client.Stylesheets
|
||||
new[]
|
||||
{
|
||||
new StyleProperty(TextureButton.StylePropertyTexture, textureCloseButton),
|
||||
new StyleProperty(Control.StylePropertyModulateSelf, Color.FromHex("#1e1e1e")),
|
||||
new StyleProperty(Control.StylePropertyModulateSelf, Color.FromHex("#9e9e9e")),
|
||||
}),
|
||||
// Window close button hover.
|
||||
new StyleRule(
|
||||
@@ -202,7 +193,7 @@ namespace Content.Client.Stylesheets
|
||||
new[] {TextureButton.StylePseudoClassPressed}),
|
||||
new[]
|
||||
{
|
||||
new StyleProperty(Control.StylePropertyModulateSelf, Color.FromHex("#141414")),
|
||||
new StyleProperty(Control.StylePropertyModulateSelf, Color.FromHex("#050505")),
|
||||
}),
|
||||
|
||||
// Scroll bars
|
||||
|
||||
@@ -29,9 +29,9 @@ namespace Content.Client.Stylesheets
|
||||
// Ew, but ok
|
||||
new[]
|
||||
{
|
||||
$"/Fonts/IBMPlexMono/IBMPlexMono-Regular.ttf",
|
||||
$"/Fonts/IBMPlexSans/IBMPlexSans-{variation}.ttf",
|
||||
$"/Fonts/NotoSans/NotoSansSymbols-{sv}.ttf",
|
||||
"/Fonts/NotoSans/NotoSansSymbols2-Regular.ttf"
|
||||
"/Fonts/NotoSans/NotoSansSymbols2-Regular.ttf",
|
||||
},
|
||||
size
|
||||
);
|
||||
@@ -67,6 +67,7 @@ namespace Content.Client.Stylesheets
|
||||
public const string StyleClassFuckyWuckyBackground = "FuckyWuckyBackground";
|
||||
public const string StyleClassGayShitBackground = "GayShitBackground";
|
||||
public const string StyleClassLobbyGayBackground = "LobbyGayBackground";
|
||||
public const string StyleLobbyShadedBackground = "LobbyShadedBackground";
|
||||
|
||||
public const string StyleClassSliderRed = "Red";
|
||||
public const string StyleClassSliderGreen = "Green";
|
||||
@@ -74,6 +75,9 @@ namespace Content.Client.Stylesheets
|
||||
public const string StyleClassSliderWhite = "White";
|
||||
|
||||
public const string StyleClassLabelHeadingBigger = "LabelHeadingBigger";
|
||||
// WD-EDIT start
|
||||
public const string StyleClassLabelHeadingFuckingBigger = "LabelHeadingFuckingBigger";
|
||||
// WD-EDIT end
|
||||
public const string StyleClassLabelKeyText = "LabelKeyText";
|
||||
public const string StyleClassLabelSecondaryColor = "LabelSecondaryColor";
|
||||
public const string StyleClassLabelBig = "LabelBig";
|
||||
@@ -86,28 +90,28 @@ namespace Content.Client.Stylesheets
|
||||
public const string StyleClassPopupMessageLarge = "PopupMessageLarge";
|
||||
public const string StyleClassPopupMessageLargeCaution = "PopupMessageLargeCaution";
|
||||
|
||||
public static readonly Color PanelDark = Color.FromHex("#0a0a0a");
|
||||
public static readonly Color PanelDark = Color.FromHex("#1E1E22");
|
||||
|
||||
public static readonly Color NanoGold = Color.FromHex("#76428a");
|
||||
public static readonly Color GoodGreenFore = Color.FromHex("#006400");
|
||||
public static readonly Color ConcerningOrangeFore = Color.FromHex("#99461d");
|
||||
public static readonly Color DangerousRedFore = Color.FromHex("#1e1e1e");
|
||||
public static readonly Color DisabledFore = Color.FromHex("#5A5A5A");
|
||||
public static readonly Color NanoGold = Color.FromHex("#c1c3c7");
|
||||
public static readonly Color GoodGreenFore = Color.FromHex("#618e71");
|
||||
public static readonly Color ConcerningOrangeFore = Color.FromHex("#f1b959");
|
||||
public static readonly Color DangerousRedFore = Color.FromHex("#5C4D5B");
|
||||
public static readonly Color DisabledFore = Color.FromHex("#26292E");
|
||||
|
||||
public static readonly Color ButtonColorDefault = Color.FromHex("#232323");
|
||||
public static readonly Color ButtonColorDefaultRed = Color.FromHex("#640000");
|
||||
public static readonly Color ButtonColorHovered = Color.FromHex("#2d2d2d");
|
||||
public static readonly Color ButtonColorHoveredRed = Color.FromHex("#960000");
|
||||
public static readonly Color ButtonColorPressed = Color.FromHex("#0f0f0f");
|
||||
public static readonly Color ButtonColorDisabled = Color.FromHex("#0f0f0f");
|
||||
public static readonly Color ButtonColorDefault = Color.FromHex("#29282f");
|
||||
public static readonly Color ButtonColorDefaultRed = Color.FromHex("#992327");
|
||||
public static readonly Color ButtonColorHovered = Color.FromHex("#3f3d48");
|
||||
public static readonly Color ButtonColorHoveredRed = Color.FromHex("#4D5D53");
|
||||
public static readonly Color ButtonColorPressed = Color.FromHex("#000000");
|
||||
public static readonly Color ButtonColorDisabled = Color.FromHex("#000000");
|
||||
|
||||
public static readonly Color ButtonColorCautionDefault = Color.FromHex("#99461d");
|
||||
public static readonly Color ButtonColorCautionHovered = Color.FromHex("#cc5b27");
|
||||
public static readonly Color ButtonColorCautionPressed = Color.FromHex("#662e13");
|
||||
public static readonly Color ButtonColorCautionDisabled = Color.FromHex("#33170a");
|
||||
public static readonly Color ButtonColorCautionDefault = Color.FromHex("#ab3232");
|
||||
public static readonly Color ButtonColorCautionHovered = Color.FromHex("#cf2f2f");
|
||||
public static readonly Color ButtonColorCautionPressed = Color.FromHex("#3e6c45");
|
||||
public static readonly Color ButtonColorCautionDisabled = Color.FromHex("#602a2a");
|
||||
|
||||
public static readonly Color ButtonColorGoodDefault = Color.FromHex("#006400");
|
||||
public static readonly Color ButtonColorGoodHovered = Color.FromHex("#009600");
|
||||
public static readonly Color ButtonColorGoodDefault = Color.FromHex("#3E6C45");
|
||||
public static readonly Color ButtonColorGoodHovered = Color.FromHex("#31843E");
|
||||
|
||||
public static readonly Color ButtonColorPurpleDefault = Color.FromHex("#4a2eab");
|
||||
public static readonly Color ButtonColorPurpleHovered = Color.FromHex("#654cbf");
|
||||
@@ -118,24 +122,24 @@ namespace Content.Client.Stylesheets
|
||||
public static readonly Color PointMagenta = Color.FromHex("#FF00FF");
|
||||
|
||||
// Context menu button colors
|
||||
public static readonly Color ButtonColorContext = Color.FromHex("#1119");
|
||||
public static readonly Color ButtonColorContext = Color.FromHex("#26292E99");
|
||||
public static readonly Color ButtonColorContextHover = Color.FromHex("#6E8476");
|
||||
public static readonly Color ButtonColorContextPressed = Color.FromHex("#879B8F");
|
||||
public static readonly Color ButtonColorContextDisabled = Color.FromHex("#262E29");
|
||||
public static readonly Color ButtonColorContextPressed = Color.FromHex("#878F9B");
|
||||
public static readonly Color ButtonColorContextDisabled = Color.FromHex("#26292E");
|
||||
|
||||
// Examine button colors
|
||||
public static readonly Color ExamineButtonColorContext = Color.Transparent;
|
||||
public static readonly Color ExamineButtonColorContextHover = Color.FromHex("#6E8476");
|
||||
public static readonly Color ExamineButtonColorContextPressed = Color.FromHex("#879B8F");
|
||||
public static readonly Color ExamineButtonColorContextDisabled = Color.FromHex("#262E29");
|
||||
public static readonly Color ExamineButtonColorContextPressed = Color.FromHex("#878F9B");
|
||||
public static readonly Color ExamineButtonColorContextDisabled = Color.FromHex("#26292E");
|
||||
|
||||
// UI Panel colors
|
||||
public static readonly Color PanelColorDark = Color.FromHex("#0f0f0f");
|
||||
public static readonly Color PanelColorDark = Color.FromHex("#1B1B21");
|
||||
|
||||
// Fancy Tree elements
|
||||
public static readonly Color FancyTreeEvenRowColor = Color.FromHex("#141414");
|
||||
public static readonly Color FancyTreeOddRowColor = FancyTreeEvenRowColor * new Color(0.8f, 0.9f, 0.8f);
|
||||
public static readonly Color FancyTreeSelectedRowColor = new Color(55, 80, 68);
|
||||
public static readonly Color FancyTreeEvenRowColor = Color.FromHex("#31313B");
|
||||
public static readonly Color FancyTreeOddRowColor = FancyTreeEvenRowColor * new Color(0.8f, 0.8f, 0.8f);
|
||||
public static readonly Color FancyTreeSelectedRowColor = new Color(55, 55, 55);
|
||||
|
||||
//Used by the APC and SMES menus
|
||||
public const string StyleClassPowerStateNone = "PowerStateNone";
|
||||
@@ -173,22 +177,27 @@ namespace Content.Client.Stylesheets
|
||||
var notoSansBold16 = resCache.NotoStack(variation: "Bold", size: 16);
|
||||
var notoSansBold18 = resCache.NotoStack(variation: "Bold", size: 18);
|
||||
var notoSansBold20 = resCache.NotoStack(variation: "Bold", size: 20);
|
||||
|
||||
var awesomeBigFuckingFont = resCache.NotoStack(variation: "Regular", size: 20);
|
||||
|
||||
var notoSansMono = resCache.GetFont("/EngineFonts/NotoSans/NotoSansMono-Regular.ttf", size: 12);
|
||||
var windowHeaderTex = resCache.GetTexture("/Textures/Interface/Nano/window_header.png");
|
||||
var windowHeader = new StyleBoxTexture
|
||||
{
|
||||
Texture = windowHeaderTex,
|
||||
PatchMarginBottom = 3,
|
||||
ExpandMarginBottom = 3,
|
||||
ContentMarginBottomOverride = 0
|
||||
ExpandMarginBottom = 2,
|
||||
ContentMarginBottomOverride = 0,
|
||||
Mode = StyleBoxTexture.StretchMode.Tile
|
||||
};
|
||||
var windowHeaderAlertTex = resCache.GetTexture("/Textures/Interface/Nano/window_header_alert.png");
|
||||
var windowHeaderAlert = new StyleBoxTexture
|
||||
{
|
||||
Texture = windowHeaderAlertTex,
|
||||
PatchMarginBottom = 3,
|
||||
ExpandMarginBottom = 3,
|
||||
ContentMarginBottomOverride = 0
|
||||
ExpandMarginBottom = 2,
|
||||
ContentMarginBottomOverride = 0,
|
||||
Mode = StyleBoxTexture.StretchMode.Tile
|
||||
};
|
||||
var windowBackgroundTex = resCache.GetTexture("/Textures/Interface/Nano/gay_shit.png");
|
||||
var windowBackground = new StyleBoxTexture
|
||||
@@ -196,7 +205,7 @@ namespace Content.Client.Stylesheets
|
||||
Texture = windowBackgroundTex,
|
||||
Mode = StyleBoxTexture.StretchMode.Tile
|
||||
};
|
||||
windowBackground.SetPatchMargin(StyleBox.Margin.All, 2);
|
||||
windowBackground.SetPatchMargin(StyleBox.Margin.All, 6);
|
||||
windowBackground.SetExpandMargin(StyleBox.Margin.All, -1);
|
||||
|
||||
var borderedWindowBackgroundTex = resCache.GetTexture("/Textures/Interface/Nano/window_background_bordered.png");
|
||||
@@ -204,7 +213,8 @@ namespace Content.Client.Stylesheets
|
||||
{
|
||||
Texture = borderedWindowBackgroundTex,
|
||||
};
|
||||
borderedWindowBackground.SetPatchMargin(StyleBox.Margin.All, 2);
|
||||
borderedWindowBackground.SetPatchMargin(StyleBox.Margin.All, 3);
|
||||
borderedWindowBackground.SetContentMarginOverride(StyleBox.Margin.Horizontal, 5);
|
||||
|
||||
var fuckyWuckyBackgroundTex = resCache.GetTexture("/Textures/Interface/Nano/fucky_wucky.png");
|
||||
var fuckyWuckyBackground = new StyleBoxTexture
|
||||
@@ -217,6 +227,16 @@ namespace Content.Client.Stylesheets
|
||||
fuckyWuckyBackground.SetExpandMargin(StyleBox.Margin.All, -4);
|
||||
fuckyWuckyBackground.SetContentMarginOverride(StyleBox.Margin.All, 8);
|
||||
|
||||
var lobbyShadedBackground = new StyleBoxTexture
|
||||
{
|
||||
Texture = resCache.GetTexture("/Textures/Interface/Nano/shaded_lobby.png"),
|
||||
Mode = StyleBoxTexture.StretchMode.Tile
|
||||
};
|
||||
|
||||
lobbyShadedBackground.SetPatchMargin(StyleBox.Margin.All, 4);
|
||||
lobbyShadedBackground.SetExpandMargin(StyleBox.Margin.All, -4);
|
||||
lobbyShadedBackground.SetContentMarginOverride(StyleBox.Margin.All, 4);
|
||||
|
||||
var gayShitBackgroundTex = resCache.GetTexture("/Textures/Interface/Nano/gay_shit.png");
|
||||
var gayShitBackground = new StyleBoxTexture
|
||||
{
|
||||
@@ -224,7 +244,7 @@ namespace Content.Client.Stylesheets
|
||||
Mode = StyleBoxTexture.StretchMode.Tile
|
||||
};
|
||||
|
||||
gayShitBackground.SetPatchMargin(StyleBox.Margin.All, 2);
|
||||
gayShitBackground.SetPatchMargin(StyleBox.Margin.All, 6);
|
||||
gayShitBackground.SetExpandMargin(StyleBox.Margin.All, -2);
|
||||
|
||||
var lobbyGayBackgroundTex = resCache.GetTexture("/Textures/Interface/Nano/lobby_gay.png");
|
||||
@@ -242,7 +262,8 @@ namespace Content.Client.Stylesheets
|
||||
{
|
||||
Texture = borderedWindowBackgroundTex,
|
||||
};
|
||||
contextMenuBackground.SetPatchMargin(StyleBox.Margin.All, ContextMenuElement.ElementMargin);
|
||||
contextMenuBackground.SetPatchMargin(StyleBox.Margin.All, 3);
|
||||
contextMenuBackground.SetContentMarginOverride(StyleBox.Margin.Horizontal, 5);
|
||||
|
||||
var invSlotBgTex = resCache.GetTexture("/Textures/Interface/Inventory/inv_slot_background.png");
|
||||
var invSlotBg = new StyleBoxTexture
|
||||
@@ -264,7 +285,7 @@ namespace Content.Client.Stylesheets
|
||||
{
|
||||
Texture = borderedTransparentWindowBackgroundTex,
|
||||
};
|
||||
borderedTransparentWindowBackground.SetPatchMargin(StyleBox.Margin.All, 2);
|
||||
borderedTransparentWindowBackground.SetPatchMargin(StyleBox.Margin.All, 3);
|
||||
|
||||
var hotbarBackground = new StyleBoxTexture
|
||||
{
|
||||
@@ -286,7 +307,7 @@ namespace Content.Client.Stylesheets
|
||||
{
|
||||
Texture = buttonRectTex
|
||||
};
|
||||
buttonRect.SetPatchMargin(StyleBox.Margin.All, 2);
|
||||
buttonRect.SetPatchMargin(StyleBox.Margin.All, 3);
|
||||
buttonRect.SetPadding(StyleBox.Margin.All, 2);
|
||||
buttonRect.SetContentMarginOverride(StyleBox.Margin.Vertical, 2);
|
||||
buttonRect.SetContentMarginOverride(StyleBox.Margin.Horizontal, 2);
|
||||
@@ -312,7 +333,7 @@ namespace Content.Client.Stylesheets
|
||||
{
|
||||
Texture = buttonRectActionMenuItemTex
|
||||
};
|
||||
buttonRectActionMenuItem.SetPatchMargin(StyleBox.Margin.All, 2);
|
||||
buttonRectActionMenuItem.SetPatchMargin(StyleBox.Margin.All, 3);
|
||||
buttonRectActionMenuItem.SetPadding(StyleBox.Margin.All, 2);
|
||||
buttonRectActionMenuItem.SetContentMarginOverride(StyleBox.Margin.Vertical, 2);
|
||||
buttonRectActionMenuItem.SetContentMarginOverride(StyleBox.Margin.Horizontal, 2);
|
||||
@@ -387,7 +408,7 @@ namespace Content.Client.Stylesheets
|
||||
{
|
||||
Texture = chatSubBGTex,
|
||||
};
|
||||
chatSubBG.SetPatchMargin(StyleBox.Margin.All, 2);
|
||||
chatSubBG.SetPatchMargin(StyleBox.Margin.All, 3);
|
||||
|
||||
var actionSearchBoxTex = resCache.GetTexture("/Textures/Interface/Nano/black_panel_dark_thin_border.png");
|
||||
var actionSearchBox = new StyleBoxTexture
|
||||
@@ -401,23 +422,44 @@ namespace Content.Client.Stylesheets
|
||||
var tabContainerPanel = new StyleBoxTexture
|
||||
{
|
||||
Texture = tabContainerPanelTex,
|
||||
// WD-EDIT start
|
||||
Mode = StyleBoxTexture.StretchMode.Tile
|
||||
// WD-EDIT end
|
||||
};
|
||||
tabContainerPanel.SetPatchMargin(StyleBox.Margin.All, 2);
|
||||
tabContainerPanel.SetPatchMargin(StyleBox.Margin.All, 3);
|
||||
// WD-EDIT start
|
||||
tabContainerPanel.SetExpandMargin(StyleBox.Margin.All, -3);
|
||||
// WD-EDIT end
|
||||
|
||||
var tabContainerBoxActive = new StyleBoxFlat {BackgroundColor = new Color(64, 80, 64)};
|
||||
tabContainerBoxActive.SetContentMarginOverride(StyleBox.Margin.Horizontal, 5);
|
||||
var tabContainerBoxInactive = new StyleBoxFlat {BackgroundColor = new Color(32, 40, 32)};
|
||||
tabContainerBoxInactive.SetContentMarginOverride(StyleBox.Margin.Horizontal, 5);
|
||||
var tabContainerBoxActive = new StyleBoxTexture
|
||||
{
|
||||
Texture = resCache.GetTexture("/Textures/Interface/Nano/button.svg.96dpi.png"),
|
||||
Modulate = ButtonColorDefault
|
||||
};
|
||||
tabContainerBoxActive.SetPatchMargin(StyleBox.Margin.All, 10);
|
||||
tabContainerBoxActive.SetPadding(StyleBox.Margin.All, 1);
|
||||
tabContainerBoxActive.SetContentMarginOverride(StyleBox.Margin.Vertical, 2);
|
||||
tabContainerBoxActive.SetContentMarginOverride(StyleBox.Margin.Horizontal, 14);
|
||||
|
||||
var tabContainerBoxInactive = new StyleBoxTexture
|
||||
{
|
||||
Texture = resCache.GetTexture("/Textures/Interface/Nano/button.svg.96dpi.png"),
|
||||
Modulate = ButtonColorPressed
|
||||
};
|
||||
tabContainerBoxInactive.SetPatchMargin(StyleBox.Margin.All, 10);
|
||||
tabContainerBoxInactive.SetPadding(StyleBox.Margin.All, 1);
|
||||
tabContainerBoxInactive.SetContentMarginOverride(StyleBox.Margin.Vertical, 2);
|
||||
tabContainerBoxInactive.SetContentMarginOverride(StyleBox.Margin.Horizontal, 14);
|
||||
|
||||
var progressBarBackground = new StyleBoxFlat
|
||||
{
|
||||
BackgroundColor = new Color(0.25f, 0.35f, 0.25f)
|
||||
BackgroundColor = new Color(0.25f, 0.25f, 0.25f)
|
||||
};
|
||||
progressBarBackground.SetContentMarginOverride(StyleBox.Margin.Vertical, 14.5f);
|
||||
|
||||
var progressBarForeground = new StyleBoxFlat
|
||||
{
|
||||
BackgroundColor = new Color(0.25f, 0.50f, 0.25f)
|
||||
BackgroundColor = new Color(0.25f, 0.25f, 0.25f)
|
||||
};
|
||||
progressBarForeground.SetContentMarginOverride(StyleBox.Margin.Vertical, 14.5f);
|
||||
|
||||
@@ -431,8 +473,8 @@ namespace Content.Client.Stylesheets
|
||||
{
|
||||
Texture = tooltipTexture,
|
||||
};
|
||||
tooltipBox.SetPatchMargin(StyleBox.Margin.All, 2);
|
||||
tooltipBox.SetContentMarginOverride(StyleBox.Margin.Horizontal, 7);
|
||||
tooltipBox.SetPatchMargin(StyleBox.Margin.All, 3);
|
||||
tooltipBox.SetContentMarginOverride(StyleBox.Margin.Horizontal, 3);
|
||||
|
||||
// Whisper box
|
||||
var whisperTexture = resCache.GetTexture("/Textures/Interface/Nano/whisper.png");
|
||||
@@ -440,7 +482,7 @@ namespace Content.Client.Stylesheets
|
||||
{
|
||||
Texture = whisperTexture,
|
||||
};
|
||||
whisperBox.SetPatchMargin(StyleBox.Margin.All, 2);
|
||||
whisperBox.SetPatchMargin(StyleBox.Margin.All, 3);
|
||||
whisperBox.SetContentMarginOverride(StyleBox.Margin.Horizontal, 7);
|
||||
|
||||
// Placeholder
|
||||
@@ -450,7 +492,7 @@ namespace Content.Client.Stylesheets
|
||||
placeholder.SetExpandMargin(StyleBox.Margin.All, -5);
|
||||
placeholder.Mode = StyleBoxTexture.StretchMode.Tile;
|
||||
|
||||
var itemListBackgroundSelected = new StyleBoxFlat {BackgroundColor = new Color(25, 25, 25)};
|
||||
var itemListBackgroundSelected = new StyleBoxFlat {BackgroundColor = new Color(55, 55, 55)};
|
||||
itemListBackgroundSelected.SetContentMarginOverride(StyleBox.Margin.Vertical, 2);
|
||||
itemListBackgroundSelected.SetContentMarginOverride(StyleBox.Margin.Horizontal, 4);
|
||||
var itemListItemBackgroundDisabled = new StyleBoxFlat {BackgroundColor = new Color(10, 10, 10)};
|
||||
@@ -492,6 +534,10 @@ namespace Content.Client.Stylesheets
|
||||
Mode = StyleBoxTexture.StretchMode.Tile
|
||||
};
|
||||
|
||||
stripeBack.SetPatchMargin(StyleBox.Margin.All, 2);
|
||||
stripeBack.SetPatchMargin(StyleBox.Margin.Top, 3);
|
||||
stripeBack.SetPatchMargin(StyleBox.Margin.Bottom, 3);
|
||||
|
||||
// Slider
|
||||
var sliderOutlineTex = resCache.GetTexture("/Textures/Interface/Nano/slider_outline.svg.96dpi.png");
|
||||
var sliderFillTex = resCache.GetTexture("/Textures/Interface/Nano/slider_fill.svg.96dpi.png");
|
||||
@@ -500,13 +546,13 @@ namespace Content.Client.Stylesheets
|
||||
var sliderFillBox = new StyleBoxTexture
|
||||
{
|
||||
Texture = sliderFillTex,
|
||||
Modulate = Color.FromHex("#141414")
|
||||
Modulate = Color.FromHex("#050505")
|
||||
};
|
||||
|
||||
var sliderBackBox = new StyleBoxTexture
|
||||
{
|
||||
Texture = sliderFillTex,
|
||||
Modulate = Color.FromHex("#1B211D")
|
||||
Modulate = Color.FromHex("#1b1b1b")
|
||||
};
|
||||
|
||||
var sliderForeBox = new StyleBoxTexture
|
||||
@@ -520,10 +566,10 @@ namespace Content.Client.Stylesheets
|
||||
Texture = sliderGrabTex
|
||||
};
|
||||
|
||||
sliderFillBox.SetPatchMargin(StyleBox.Margin.All, 12);
|
||||
sliderBackBox.SetPatchMargin(StyleBox.Margin.All, 12);
|
||||
sliderForeBox.SetPatchMargin(StyleBox.Margin.All, 12);
|
||||
sliderGrabBox.SetPatchMargin(StyleBox.Margin.All, 12);
|
||||
sliderFillBox.SetPatchMargin(StyleBox.Margin.All, 13);
|
||||
sliderBackBox.SetPatchMargin(StyleBox.Margin.All, 13);
|
||||
sliderForeBox.SetPatchMargin(StyleBox.Margin.All, 13);
|
||||
sliderGrabBox.SetPatchMargin(StyleBox.Margin.All, 13);
|
||||
|
||||
var sliderFillGreen = new StyleBoxTexture(sliderFillBox) {Modulate = Color.LimeGreen};
|
||||
var sliderFillRed = new StyleBoxTexture(sliderFillBox) {Modulate = Color.Red};
|
||||
@@ -589,6 +635,13 @@ namespace Content.Client.Stylesheets
|
||||
{
|
||||
new StyleProperty(PanelContainer.StylePropertyPanel, fuckyWuckyBackground),
|
||||
}),
|
||||
// Lobby shaded background.
|
||||
new StyleRule(
|
||||
new SelectorElement(null, new[] {StyleLobbyShadedBackground}, null, null),
|
||||
new[]
|
||||
{
|
||||
new StyleProperty(PanelContainer.StylePropertyPanel, lobbyShadedBackground),
|
||||
}),
|
||||
// Panel background.
|
||||
new StyleRule(
|
||||
new SelectorElement(null, new[] {StyleClassGayShitBackground}, null, null),
|
||||
@@ -1114,6 +1167,16 @@ namespace Content.Client.Stylesheets
|
||||
new StyleProperty(Label.StylePropertyFontColor, NanoGold),
|
||||
}),
|
||||
|
||||
// WD-EDIT start
|
||||
// Fucking big Label
|
||||
new StyleRule(new SelectorElement(typeof(Label), new[] {StyleClassLabelHeadingFuckingBigger}, null, null),
|
||||
new[]
|
||||
{
|
||||
new StyleProperty(Label.StylePropertyFont, awesomeBigFuckingFont),
|
||||
new StyleProperty(Label.StylePropertyFontColor, NanoGold),
|
||||
}),
|
||||
// WD-EDIT end
|
||||
|
||||
// Small Label
|
||||
new StyleRule(new SelectorElement(typeof(Label), new[] {StyleClassLabelSubText}, null, null), new[]
|
||||
{
|
||||
@@ -1364,17 +1427,17 @@ namespace Content.Client.Stylesheets
|
||||
|
||||
new StyleRule(new SelectorElement(typeof(PanelContainer), new []{ ClassHighDivider}, null, null), new []
|
||||
{
|
||||
new StyleProperty(PanelContainer.StylePropertyPanel, new StyleBoxFlat { BackgroundColor = NanoGold, ContentMarginBottomOverride = 2, ContentMarginLeftOverride = 2}),
|
||||
new StyleProperty(PanelContainer.StylePropertyPanel, new StyleBoxFlat { BackgroundColor = ButtonColorHovered, ContentMarginBottomOverride = 2, ContentMarginLeftOverride = 2}),
|
||||
}),
|
||||
|
||||
Element<PanelContainer>().Class(ClassAngleRect)
|
||||
.Prop(PanelContainer.StylePropertyPanel, BaseAngleRect)
|
||||
.Prop(Control.StylePropertyModulateSelf, Color.FromHex("#141414")),
|
||||
.Prop(Control.StylePropertyModulateSelf, Color.FromHex("#050505")),
|
||||
|
||||
Element<PanelContainer>().Class(ClassLowDivider)
|
||||
.Prop(PanelContainer.StylePropertyPanel, new StyleBoxFlat
|
||||
{
|
||||
BackgroundColor = Color.FromHex("#303530"),
|
||||
BackgroundColor = Color.FromHex("#303030"),
|
||||
ContentMarginLeftOverride = 2,
|
||||
ContentMarginBottomOverride = 2
|
||||
}),
|
||||
@@ -1398,16 +1461,16 @@ namespace Content.Client.Stylesheets
|
||||
|
||||
Element<PanelContainer>().Class("PanelBackgroundLight")
|
||||
.Prop("panel", new StyleBoxTexture(BaseButtonOpenBoth) { Padding = default })
|
||||
.Prop(Control.StylePropertyModulateSelf, Color.FromHex("#2F2F3B")),
|
||||
.Prop(Control.StylePropertyModulateSelf, Color.FromHex("#2F2F2F")),
|
||||
|
||||
// Window Footer
|
||||
Element<TextureRect>().Class("NTLogoDark")
|
||||
.Prop(TextureRect.StylePropertyTexture, resCache.GetTexture("/Textures/Interface/Nano/ntlogo.svg.png"))
|
||||
.Prop(Control.StylePropertyModulateSelf, Color.FromHex("#7A9082")),
|
||||
.Prop(Control.StylePropertyModulateSelf, Color.FromHex("#909090")),
|
||||
|
||||
Element<Label>().Class("WindowFooterText")
|
||||
.Prop(Label.StylePropertyFont, notoSans8)
|
||||
.Prop(Label.StylePropertyFontColor, Color.FromHex("#7A9082")),
|
||||
.Prop(Label.StylePropertyFontColor, Color.FromHex("#909090")),
|
||||
|
||||
Element<PanelContainer>().Class("PanelBackgroundAngledDark")
|
||||
.Prop(PanelContainer.StylePropertyPanel, BaseAngleRect)
|
||||
@@ -1490,7 +1553,7 @@ namespace Content.Client.Stylesheets
|
||||
//PDA - Backgrounds
|
||||
Element<PanelContainer>().Class("PdaContentBackground")
|
||||
.Prop(PanelContainer.StylePropertyPanel, BaseButtonOpenBoth)
|
||||
.Prop(Control.StylePropertyModulateSelf, Color.FromHex("#141414")),
|
||||
.Prop(Control.StylePropertyModulateSelf, Color.FromHex("#050505")),
|
||||
|
||||
Element<PanelContainer>().Class("PdaBackground")
|
||||
.Prop(PanelContainer.StylePropertyPanel, BaseButtonOpenBoth)
|
||||
@@ -1498,13 +1561,13 @@ namespace Content.Client.Stylesheets
|
||||
|
||||
Element<PanelContainer>().Class("PdaBackgroundRect")
|
||||
.Prop(PanelContainer.StylePropertyPanel, BaseAngleRect)
|
||||
.Prop(Control.StylePropertyModulateSelf, Color.FromHex("#7A9082")),
|
||||
.Prop(Control.StylePropertyModulateSelf, Color.FromHex("#909090")),
|
||||
|
||||
Element<PanelContainer>().Class("PdaBorderRect")
|
||||
.Prop(PanelContainer.StylePropertyPanel, AngleBorderRect),
|
||||
|
||||
Element<PanelContainer>().Class("BackgroundDark")
|
||||
.Prop(PanelContainer.StylePropertyPanel, new StyleBoxFlat(Color.FromHex("#141414"))),
|
||||
.Prop(PanelContainer.StylePropertyPanel, new StyleBoxFlat(Color.FromHex("#050505"))),
|
||||
|
||||
//PDA - Buttons
|
||||
Element<PdaSettingsButton>().Pseudo(ContainerButton.StylePseudoClassNormal)
|
||||
@@ -1535,11 +1598,11 @@ namespace Content.Client.Stylesheets
|
||||
//PDA - Text
|
||||
Element<Label>().Class("PdaContentFooterText")
|
||||
.Prop(Label.StylePropertyFont, notoSans10)
|
||||
.Prop(Label.StylePropertyFontColor, Color.FromHex("#7A9082")),
|
||||
.Prop(Label.StylePropertyFontColor, Color.FromHex("#909090")),
|
||||
|
||||
Element<Label>().Class("PdaWindowFooterText")
|
||||
.Prop(Label.StylePropertyFont, notoSans10)
|
||||
.Prop(Label.StylePropertyFontColor, Color.FromHex("#4D5D53")),
|
||||
.Prop(Label.StylePropertyFontColor, Color.FromHex("#505050")),
|
||||
|
||||
// Fancy Tree
|
||||
Element<ContainerButton>().Identifier(TreeItem.StyleIdentifierTreeButton)
|
||||
|
||||
@@ -12,10 +12,10 @@ namespace Content.Client.Stylesheets
|
||||
{
|
||||
public static readonly Color SpaceRed = Color.FromHex("#960000");
|
||||
|
||||
public static readonly Color ButtonColorDefault = Color.FromHex("#232323");
|
||||
public static readonly Color ButtonColorHovered = Color.FromHex("#2d2d2d");
|
||||
public static readonly Color ButtonColorPressed = Color.FromHex("#0f0f0f");
|
||||
public static readonly Color ButtonColorDisabled = Color.FromHex("#0f0f0f");
|
||||
public static readonly Color ButtonColorDefault = Color.FromHex("#333333");
|
||||
public static readonly Color ButtonColorHovered = Color.FromHex("#444444");
|
||||
public static readonly Color ButtonColorPressed = Color.FromHex("#3e6c45");
|
||||
public static readonly Color ButtonColorDisabled = Color.FromHex("#30313c");
|
||||
|
||||
public static readonly Color ButtonColorCautionDefault = Color.FromHex("#640000");
|
||||
public static readonly Color ButtonColorCautionHovered = Color.FromHex("#960000");
|
||||
@@ -26,15 +26,6 @@ namespace Content.Client.Stylesheets
|
||||
|
||||
public StyleSpace(IResourceCache resCache) : base(resCache)
|
||||
{
|
||||
var whiteRabbit = resCache.GetFont
|
||||
(
|
||||
new []
|
||||
{
|
||||
"/Fonts/IBMPlexMono/IBMPlexMono-Regular.ttf"
|
||||
},
|
||||
10
|
||||
);
|
||||
|
||||
var notoSans10 = resCache.GetFont
|
||||
(
|
||||
new []
|
||||
@@ -64,7 +55,7 @@ namespace Content.Client.Stylesheets
|
||||
|
||||
var progressBarForeground = new StyleBoxFlat
|
||||
{
|
||||
BackgroundColor = new Color(0.25f, 0.50f, 0.25f)
|
||||
BackgroundColor = new Color(0.25f, 0.25f, 0.25f)
|
||||
};
|
||||
progressBarForeground.SetContentMarginOverride(StyleBox.Margin.Vertical, 14.5f);
|
||||
|
||||
@@ -81,11 +72,11 @@ namespace Content.Client.Stylesheets
|
||||
Stylesheet = new Stylesheet(BaseRules.Concat(new StyleRule[]
|
||||
{
|
||||
Element<Label>().Class(StyleClassLabelHeading)
|
||||
.Prop(Label.StylePropertyFont, whiteRabbit)
|
||||
.Prop(Label.StylePropertyFont, notoSansBold16)
|
||||
.Prop(Label.StylePropertyFontColor, SpaceRed),
|
||||
|
||||
Element<Label>().Class(StyleClassLabelSubText)
|
||||
.Prop(Label.StylePropertyFont, whiteRabbit)
|
||||
.Prop(Label.StylePropertyFont, notoSans10)
|
||||
.Prop(Label.StylePropertyFontColor, Color.DarkGray),
|
||||
|
||||
Element<PanelContainer>().Class(ClassHighDivider)
|
||||
|
||||
@@ -21,7 +21,8 @@ public sealed class MenuButton : ContainerButton
|
||||
private static readonly Color ColorRedHovered = Color.FromHex("#960000");
|
||||
private static readonly Color ColorPressed = Color.FromHex("#464646");
|
||||
|
||||
private const float VertPad = 8f;
|
||||
private const float HorPad = 8f;
|
||||
private const float VerPad = 4f;
|
||||
private Color NormalColor => HasStyleClass(StyleClassRedTopButton) ? ColorRedNormal : ColorNormal;
|
||||
private Color HoveredColor => HasStyleClass(StyleClassRedTopButton) ? ColorRedHovered : ColorHovered;
|
||||
|
||||
@@ -50,11 +51,11 @@ public sealed class MenuButton : ContainerButton
|
||||
IoCManager.InjectDependencies(this);
|
||||
_buttonIcon = new TextureRect()
|
||||
{
|
||||
TextureScale = new Vector2(0.5f, 0.5f),
|
||||
TextureScale = new Vector2(1f, 1f),
|
||||
HorizontalAlignment = HAlignment.Center,
|
||||
VerticalAlignment = VAlignment.Center,
|
||||
VerticalExpand = true,
|
||||
Margin = new Thickness(0, VertPad),
|
||||
Margin = new Thickness(HorPad, VerPad),
|
||||
ModulateSelfOverride = NormalColor,
|
||||
Stretch = TextureRect.StretchMode.KeepCentered
|
||||
};
|
||||
@@ -67,7 +68,7 @@ public sealed class MenuButton : ContainerButton
|
||||
};
|
||||
_root = new BoxContainer
|
||||
{
|
||||
Orientation = BoxContainer.LayoutOrientation.Vertical,
|
||||
Orientation = BoxContainer.LayoutOrientation.Horizontal,
|
||||
Children =
|
||||
{
|
||||
_buttonIcon,
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System.Numerics;
|
||||
using Content.Client.UserInterface.Systems.Chat.Widgets;
|
||||
using Robust.Client.AutoGenerated;
|
||||
using Robust.Client.UserInterface.Controls;
|
||||
using Robust.Client.UserInterface.XAML;
|
||||
|
||||
namespace Content.Client.UserInterface.Screens;
|
||||
|
||||
@@ -27,8 +27,6 @@
|
||||
<alerts:AlertsUI Name="Alerts" Access="Protected" />
|
||||
</LayoutContainer>
|
||||
<PanelContainer HorizontalExpand="True" MinWidth="300" StyleClasses="GayShitBackground">
|
||||
|
||||
|
||||
<BoxContainer Orientation="Vertical" HorizontalExpand="True" SeparationOverride="10" Margin="10">
|
||||
<menuBar:GameTopMenuBar Name="TopBar" HorizontalExpand="True" Access="Protected" />
|
||||
<chat:ChatBox VerticalExpand="True" HorizontalExpand="True" Name="Chat" Access="Protected" MinSize="0 0"/>
|
||||
|
||||
@@ -41,7 +41,7 @@ namespace Content.Client.UserInterface.Systems.Atmos.GasTank
|
||||
var back = new StyleBoxTexture
|
||||
{
|
||||
Texture = panelTex,
|
||||
Modulate = Color.FromHex("#141414"),
|
||||
Modulate = Color.FromHex("#050505"),
|
||||
};
|
||||
|
||||
back.SetPatchMargin(StyleBox.Margin.All, 10);
|
||||
|
||||
@@ -302,8 +302,7 @@ public sealed class ChatUIController : UIController
|
||||
|
||||
chatSize = Vector2Utils.ParseVector2FromString(chatSizeRaw, ';');
|
||||
|
||||
//БЛЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯТЬ
|
||||
if (chatSize.X <= 0 || chatSize.Y <= 0 || chatSize.X > 1000 || chatSize.Y > 1000)
|
||||
if (chatSize.X <= 0 || chatSize.X > 1000 || chatSize.Y >= 0)
|
||||
{
|
||||
chatSize = Vector2Utils.ParseVector2FromString(WhiteCVars.DefaultChatSize.DefaultValue, ';');
|
||||
_config.SetCVar(WhiteCVars.DefaultChatSize, WhiteCVars.DefaultChatSize.DefaultValue);
|
||||
|
||||
@@ -7,11 +7,7 @@
|
||||
HorizontalExpand="True"
|
||||
VerticalExpand="True"
|
||||
MinSize="465 225">
|
||||
<PanelContainer HorizontalExpand="True" VerticalExpand="True">
|
||||
<PanelContainer.PanelOverride>
|
||||
<graphics:StyleBoxFlat BackgroundColor="#141414AA" />
|
||||
</PanelContainer.PanelOverride>
|
||||
|
||||
<PanelContainer HorizontalExpand="True" VerticalExpand="True" StyleClasses="FuckyWuckyBackground" >
|
||||
<BoxContainer Orientation="Vertical" SeparationOverride="4" HorizontalExpand="True" VerticalExpand="True">
|
||||
<OutputPanel Name="Contents" HorizontalExpand="True" VerticalExpand="True" Margin="2 2 2 2" >
|
||||
<OutputPanel.StyleBoxOverride>
|
||||
|
||||
@@ -8,109 +8,123 @@
|
||||
xmlns:widgets="clr-namespace:Content.Client.UserInterface.Systems.MenuBar.Widgets"
|
||||
Name = "MenuButtons"
|
||||
VerticalExpand="False"
|
||||
Orientation="Horizontal"
|
||||
Orientation="Vertical"
|
||||
HorizontalAlignment="Stretch"
|
||||
VerticalAlignment="Top"
|
||||
SeparationOverride="0"
|
||||
>
|
||||
<ui:MenuButton
|
||||
Name="EscapeButton"
|
||||
Access="Internal"
|
||||
Icon="{xe:Tex '/Textures/Interface/hamburger.svg.192dpi.png'}"
|
||||
BoundKey = "{x:Static ic:EngineKeyFunctions.EscapeMenu}"
|
||||
ToolTip="{Loc 'game-hud-open-escape-menu-button-tooltip'}"
|
||||
MinSize="70 64"
|
||||
HorizontalExpand="True"
|
||||
AppendStyleClass="{x:Static style:StyleBase.ButtonOpenRight}"
|
||||
<BoxContainer Orientation="Horizontal">
|
||||
<ui:MenuButton
|
||||
Name="EscapeButton"
|
||||
Access="Internal"
|
||||
Icon="{xe:Tex '/Textures/Interface/hamburger.svg.192dpi.png'}"
|
||||
BoundKey = "{x:Static ic:EngineKeyFunctions.EscapeMenu}"
|
||||
ToolTip="{Loc 'game-hud-open-escape-menu-button-tooltip'}"
|
||||
MinSize="96 32"
|
||||
HorizontalExpand="True"
|
||||
AppendStyleClass="{x:Static style:StyleBase.ButtonOpenRight}"
|
||||
/>
|
||||
<ui:MenuButton
|
||||
Name="GuidebookButton"
|
||||
Access="Internal"
|
||||
Icon="{xe:Tex '/Textures/Interface/VerbIcons/information.svg.192dpi.png'}"
|
||||
ToolTip="{Loc 'game-hud-open-guide-menu-button-tooltip'}"
|
||||
BoundKey = "{x:Static is:ContentKeyFunctions.OpenGuidebook}"
|
||||
MinSize="42 64"
|
||||
HorizontalExpand="True"
|
||||
AppendStyleClass="{x:Static style:StyleBase.ButtonSquare}"
|
||||
<ui:MenuButton
|
||||
Name="GuidebookButton"
|
||||
Access="Internal"
|
||||
Icon="{xe:Tex '/Textures/Interface/VerbIcons/information.svg.192dpi.png'}"
|
||||
ToolTip="{Loc 'game-hud-open-guide-menu-button-tooltip'}"
|
||||
BoundKey = "{x:Static is:ContentKeyFunctions.OpenGuidebook}"
|
||||
MinSize="96 32"
|
||||
HorizontalExpand="True"
|
||||
AppendStyleClass="{x:Static style:StyleBase.ButtonSquare}"
|
||||
/>
|
||||
<ui:MenuButton
|
||||
Name="CharacterButton"
|
||||
Access="Internal"
|
||||
Icon="{xe:Tex '/Textures/Interface/character.svg.192dpi.png'}"
|
||||
ToolTip="{Loc 'game-hud-open-character-menu-button-tooltip'}"
|
||||
BoundKey = "{x:Static is:ContentKeyFunctions.OpenCharacterMenu}"
|
||||
MinSize="42 64"
|
||||
HorizontalExpand="True"
|
||||
AppendStyleClass="{x:Static style:StyleBase.ButtonSquare}"
|
||||
<ui:MenuButton
|
||||
Name="CharacterButton"
|
||||
Access="Internal"
|
||||
Icon="{xe:Tex '/Textures/Interface/character.svg.192dpi.png'}"
|
||||
ToolTip="{Loc 'game-hud-open-character-menu-button-tooltip'}"
|
||||
BoundKey = "{x:Static is:ContentKeyFunctions.OpenCharacterMenu}"
|
||||
MinSize="96 32"
|
||||
HorizontalExpand="True"
|
||||
AppendStyleClass="{x:Static style:StyleBase.ButtonSquare}"
|
||||
/>
|
||||
<ui:MenuButton
|
||||
Name="EmotionsButton"
|
||||
Access="Internal"
|
||||
Icon="{xe:Tex '/Textures/Interface/emotions.svg.192dpi.png'}"
|
||||
ToolTip="{Loc 'game-hud-open-emotions-menu-button-tooltip'}"
|
||||
BoundKey = "{x:Static is:ContentKeyFunctions.OpenEmotionsMenu}"
|
||||
MinSize="42 64"
|
||||
HorizontalExpand="True"
|
||||
AppendStyleClass="{x:Static style:StyleBase.ButtonSquare}"
|
||||
/>
|
||||
<ui:MenuButton
|
||||
Name="CraftingButton"
|
||||
Access="Internal"
|
||||
Icon="{xe:Tex '/Textures/Interface/hammer.svg.192dpi.png'}"
|
||||
BoundKey = "{x:Static is:ContentKeyFunctions.OpenCraftingMenu}"
|
||||
ToolTip="{Loc 'game-hud-open-crafting-menu-button-tooltip'}"
|
||||
MinSize="42 64"
|
||||
HorizontalExpand="True"
|
||||
AppendStyleClass="{x:Static style:StyleBase.ButtonSquare}"
|
||||
<ui:MenuButton
|
||||
Name="EmotionsButton"
|
||||
Access="Internal"
|
||||
Icon="{xe:Tex '/Textures/Interface/emotions.svg.192dpi.png'}"
|
||||
ToolTip="{Loc 'game-hud-open-emotions-menu-button-tooltip'}"
|
||||
BoundKey = "{x:Static is:ContentKeyFunctions.OpenEmotionsMenu}"
|
||||
MinSize="96 32"
|
||||
HorizontalExpand="True"
|
||||
AppendStyleClass="{x:Static style:StyleBase.ButtonSquare}"
|
||||
/>
|
||||
<ui:MenuButton
|
||||
Name="ActionButton"
|
||||
Access="Internal"
|
||||
Icon="{xe:Tex '/Textures/Interface/fist.svg.192dpi.png'}"
|
||||
BoundKey = "{x:Static is:ContentKeyFunctions.OpenActionsMenu}"
|
||||
ToolTip="{Loc 'game-hud-open-actions-menu-button-tooltip'}"
|
||||
MinSize="42 64"
|
||||
HorizontalExpand="True"
|
||||
AppendStyleClass="{x:Static style:StyleBase.ButtonSquare}"
|
||||
/>
|
||||
<ui:MenuButton
|
||||
Name="AdminButton"
|
||||
Access="Internal"
|
||||
Icon="{xe:Tex '/Textures/Interface/gavel.svg.192dpi.png'}"
|
||||
BoundKey = "{x:Static is:ContentKeyFunctions.OpenAdminMenu}"
|
||||
ToolTip="{Loc 'game-hud-open-admin-menu-button-tooltip'}"
|
||||
MinSize="42 64"
|
||||
HorizontalExpand="True"
|
||||
AppendStyleClass="{x:Static style:StyleBase.ButtonSquare}"
|
||||
/>
|
||||
<ui:MenuButton
|
||||
Name="SandboxButton"
|
||||
Access="Internal"
|
||||
Icon="{xe:Tex '/Textures/Interface/sandbox.svg.192dpi.png'}"
|
||||
BoundKey = "{x:Static is:ContentKeyFunctions.OpenSandboxWindow}"
|
||||
ToolTip="{Loc 'game-hud-open-sandbox-menu-button-tooltip'}"
|
||||
MinSize="42 64"
|
||||
HorizontalExpand="True"
|
||||
AppendStyleClass="{x:Static style:StyleBase.ButtonSquare}"
|
||||
/>
|
||||
<ui:MenuButton
|
||||
Name="MeatyOreButton"
|
||||
Access="Internal"
|
||||
MinSize="42 64"
|
||||
HorizontalExpand="True"
|
||||
Icon="{xe:Tex '/Textures/Interface/meatyore-shop-icon.png'}"
|
||||
AppendStyleClass="{x:Static style:StyleBase.ButtonSquare}"
|
||||
ToolTip="Магазин метеора"
|
||||
ToggleMode="False"
|
||||
/>
|
||||
<ui:MenuButton
|
||||
Name="AHelpButton"
|
||||
Access="Internal"
|
||||
Icon="{xe:Tex '/Textures/Interface/info.svg.192dpi.png'}"
|
||||
BoundKey = "{x:Static is:ContentKeyFunctions.OpenAHelp}"
|
||||
ToolTip="{Loc 'ui-options-function-open-a-help'}"
|
||||
MinSize="42 64"
|
||||
HorizontalExpand="True"
|
||||
AppendStyleClass="{x:Static style:StyleBase.ButtonOpenLeft}"
|
||||
<ui:MenuButton
|
||||
Name="InventoryButton"
|
||||
Access="Internal"
|
||||
Icon="{xe:Tex '/Textures/Interface/inventory.svg.192dpi.png'}"
|
||||
BoundKey = "{x:Static is:ContentKeyFunctions.OpenInventoryMenu}"
|
||||
ToolTip="{Loc 'game-hud-open-inventory-menu-button-tooltip'}"
|
||||
MinSize="96 32"
|
||||
HorizontalExpand="True"
|
||||
AppendStyleClass="{x:Static style:StyleBase.ButtonOpenLeft}"
|
||||
/>
|
||||
</BoxContainer>
|
||||
<BoxContainer Orientation="Horizontal">
|
||||
<ui:MenuButton
|
||||
Name="CraftingButton"
|
||||
Access="Internal"
|
||||
Icon="{xe:Tex '/Textures/Interface/hammer.svg.192dpi.png'}"
|
||||
BoundKey = "{x:Static is:ContentKeyFunctions.OpenCraftingMenu}"
|
||||
ToolTip="{Loc 'game-hud-open-crafting-menu-button-tooltip'}"
|
||||
MinSize="96 32"
|
||||
HorizontalExpand="True"
|
||||
AppendStyleClass="{x:Static style:StyleBase.ButtonOpenRight}"
|
||||
/>
|
||||
<ui:MenuButton
|
||||
Name="ActionButton"
|
||||
Access="Internal"
|
||||
Icon="{xe:Tex '/Textures/Interface/fist.svg.192dpi.png'}"
|
||||
BoundKey = "{x:Static is:ContentKeyFunctions.OpenActionsMenu}"
|
||||
ToolTip="{Loc 'game-hud-open-actions-menu-button-tooltip'}"
|
||||
MinSize="96 32"
|
||||
HorizontalExpand="True"
|
||||
AppendStyleClass="{x:Static style:StyleBase.ButtonSquare}"
|
||||
/>
|
||||
<ui:MenuButton
|
||||
Name="AdminButton"
|
||||
Access="Internal"
|
||||
Icon="{xe:Tex '/Textures/Interface/gavel.svg.192dpi.png'}"
|
||||
BoundKey = "{x:Static is:ContentKeyFunctions.OpenAdminMenu}"
|
||||
ToolTip="{Loc 'game-hud-open-admin-menu-button-tooltip'}"
|
||||
MinSize="96 32"
|
||||
HorizontalExpand="True"
|
||||
AppendStyleClass="{x:Static style:StyleBase.ButtonSquare}"
|
||||
/>
|
||||
<ui:MenuButton
|
||||
Name="SandboxButton"
|
||||
Access="Internal"
|
||||
Icon="{xe:Tex '/Textures/Interface/sandbox.svg.192dpi.png'}"
|
||||
BoundKey = "{x:Static is:ContentKeyFunctions.OpenSandboxWindow}"
|
||||
ToolTip="{Loc 'game-hud-open-sandbox-menu-button-tooltip'}"
|
||||
MinSize="96 32"
|
||||
HorizontalExpand="True"
|
||||
AppendStyleClass="{x:Static style:StyleBase.ButtonSquare}"
|
||||
/>
|
||||
<ui:MenuButton
|
||||
Name="MeatyOreButton"
|
||||
Access="Internal"
|
||||
MinSize="96 32"
|
||||
HorizontalExpand="True"
|
||||
Icon="{xe:Tex '/Textures/Interface/meatyore-shop-icon.png'}"
|
||||
AppendStyleClass="{x:Static style:StyleBase.ButtonSquare}"
|
||||
ToolTip="Магазин метеора"
|
||||
ToggleMode="False"
|
||||
/>
|
||||
<ui:MenuButton
|
||||
Name="AHelpButton"
|
||||
Access="Internal"
|
||||
Icon="{xe:Tex '/Textures/Interface/info.svg.192dpi.png'}"
|
||||
BoundKey = "{x:Static is:ContentKeyFunctions.OpenAHelp}"
|
||||
ToolTip="{Loc 'ui-options-function-open-a-help'}"
|
||||
MinSize="96 32"
|
||||
HorizontalExpand="True"
|
||||
AppendStyleClass="{x:Static style:StyleBase.ButtonOpenLeft}"
|
||||
/>
|
||||
</BoxContainer>
|
||||
</widgets:GameTopMenuBar>
|
||||
|
||||
@@ -185,7 +185,8 @@ public sealed partial class GunSystem
|
||||
container.AddChild(new TextureRect
|
||||
{
|
||||
Texture = texture,
|
||||
ModulateSelfOverride = altColor ? colorGoneA : colorGoneB
|
||||
ModulateSelfOverride = altColor ? colorGoneA : colorGoneB,
|
||||
Margin = new(0, 0, -8, 0)
|
||||
});
|
||||
|
||||
altColor ^= true;
|
||||
@@ -196,7 +197,8 @@ public sealed partial class GunSystem
|
||||
container.AddChild(new TextureRect
|
||||
{
|
||||
Texture = texture,
|
||||
ModulateSelfOverride = altColor ? colorA : colorB
|
||||
ModulateSelfOverride = altColor ? colorA : colorB,
|
||||
Margin = new(0, 0, -8, 0)
|
||||
});
|
||||
|
||||
altColor ^= true;
|
||||
@@ -333,7 +335,7 @@ public sealed partial class GunSystem
|
||||
}),
|
||||
(_noMagazineLabel = new Label
|
||||
{
|
||||
Text = "No Magazine!",
|
||||
Text = "Нет магазина!",
|
||||
StyleClasses = {StyleNano.StyleClassItemStatus}
|
||||
})
|
||||
}
|
||||
@@ -389,7 +391,8 @@ public sealed partial class GunSystem
|
||||
{
|
||||
Texture = texture,
|
||||
ModulateSelfOverride = altColor ? colorGoneA : colorGoneB,
|
||||
Stretch = TextureRect.StretchMode.KeepCentered
|
||||
Stretch = TextureRect.StretchMode.KeepCentered,
|
||||
Margin = new(0, 0, -8, 0)
|
||||
});
|
||||
|
||||
altColor ^= true;
|
||||
@@ -403,7 +406,8 @@ public sealed partial class GunSystem
|
||||
{
|
||||
Texture = texture,
|
||||
ModulateSelfOverride = altColor ? colorA : colorB,
|
||||
Stretch = TextureRect.StretchMode.KeepCentered
|
||||
Stretch = TextureRect.StretchMode.KeepCentered,
|
||||
Margin = new(0, 0, -8, 0)
|
||||
});
|
||||
|
||||
altColor ^= true;
|
||||
@@ -504,6 +508,7 @@ public sealed partial class GunSystem
|
||||
Stretch = TextureRect.StretchMode.KeepCentered,
|
||||
Texture = bulletTexture,
|
||||
ModulateSelfOverride = color,
|
||||
Margin = new(0, 0, -8, 0)
|
||||
});
|
||||
altColor ^= true;
|
||||
container.AddChild(box);
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.Numerics;
|
||||
using Content.Client.Gameplay;
|
||||
using Content.Client.Items;
|
||||
using Content.Client.Weapons.Ranged.Components;
|
||||
using Content.Shared.Camera;
|
||||
@@ -12,13 +13,13 @@ using Robust.Client.GameObjects;
|
||||
using Robust.Client.Graphics;
|
||||
using Robust.Client.Input;
|
||||
using Robust.Client.Player;
|
||||
using Robust.Client.State;
|
||||
using Robust.Shared.Animations;
|
||||
using Robust.Shared.Input;
|
||||
using Robust.Shared.Map;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Spawners;
|
||||
using Robust.Shared.Utility;
|
||||
using SharedGunSystem = Content.Shared.Weapons.Ranged.Systems.SharedGunSystem;
|
||||
using TimedDespawnComponent = Robust.Shared.Spawners.TimedDespawnComponent;
|
||||
|
||||
namespace Content.Client.Weapons.Ranged.Systems;
|
||||
|
||||
@@ -31,6 +32,7 @@ public sealed partial class GunSystem : SharedGunSystem
|
||||
[Dependency] private readonly InputSystem _inputSystem = default!;
|
||||
[Dependency] private readonly SharedCameraRecoilSystem _recoil = default!;
|
||||
[Dependency] private readonly IComponentFactory _factory = default!;
|
||||
[Dependency] private readonly IStateManager _state = default!;
|
||||
|
||||
[ValidatePrototypeId<EntityPrototype>]
|
||||
public const string HitscanProto = "HitscanEffect";
|
||||
@@ -184,9 +186,15 @@ public sealed partial class GunSystem : SharedGunSystem
|
||||
// WD EDIT END
|
||||
|
||||
Log.Debug($"Sending shoot request tick {Timing.CurTick} / {Timing.CurTime}");
|
||||
//Set the target entity that is directly clicked on.
|
||||
EntityUid? shootingTarget = null;
|
||||
|
||||
if (_state.CurrentState is GameplayStateBase screen)
|
||||
shootingTarget = screen.GetClickedEntity(mousePos);
|
||||
|
||||
EntityManager.RaisePredictiveEvent(new RequestShootEvent
|
||||
{
|
||||
Target = GetNetEntity(shootingTarget),
|
||||
Coordinates = GetNetCoordinates(coordinates),
|
||||
Gun = GetNetEntity(gunUid),
|
||||
});
|
||||
|
||||
@@ -49,7 +49,7 @@ namespace Content.Client.Wires.UI
|
||||
var back = new StyleBoxTexture
|
||||
{
|
||||
Texture = panelTex,
|
||||
Modulate = Color.FromHex("#141414")
|
||||
Modulate = Color.FromHex("#050505")
|
||||
};
|
||||
back.SetPatchMargin(StyleBox.Margin.All, 10);
|
||||
|
||||
|
||||
@@ -1,34 +1,25 @@
|
||||
<Control xmlns="https://spacestation14.io"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:gfx="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client"
|
||||
xmlns:parallax="clr-namespace:Content.Client.Parallax"
|
||||
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls">
|
||||
<parallax:ParallaxControl />
|
||||
<Control HorizontalAlignment="Center" VerticalAlignment="Center">
|
||||
<PanelContainer StyleClasses="AngleRect" />
|
||||
<BoxContainer Orientation="Vertical" MinSize="200 200">
|
||||
<BoxContainer Orientation="Horizontal">
|
||||
<Label Margin="8 0 0 0" Text="{Loc 'queue-title'}"
|
||||
StyleClasses="LabelHeading" VAlign="Center" />
|
||||
xmlns:mainMenu="clr-namespace:Content.Client.MainMenu">
|
||||
<mainMenu:BackgroundControl TexturePath="/Textures/Logo/logo-ru.png" Stretch="KeepAspectCentered" Name="Background"/>
|
||||
<Control HorizontalAlignment="Stretch" VerticalAlignment="Bottom">
|
||||
<PanelContainer StyleClasses="LobbyShadedBackground" HorizontalAlignment="Right">
|
||||
<BoxContainer Orientation="Horizontal" HorizontalExpand="True" HorizontalAlignment="Right">
|
||||
<Button Name="QuitButton" Text="{Loc 'queue-quit'}"
|
||||
HorizontalAlignment="Right" HorizontalExpand="True" />
|
||||
<Button Name="PriorityJoinButton" Text="{Loc 'queue-priority-join'}"
|
||||
HorizontalAlignment="Right" HorizontalExpand="True" />
|
||||
</BoxContainer>
|
||||
<controls:HighDivider />
|
||||
<BoxContainer Orientation="Vertical" VerticalExpand="True" Margin="0 20 0 0">
|
||||
<BoxContainer Orientation="Vertical">
|
||||
<BoxContainer Orientation="Vertical" VerticalExpand="True">
|
||||
<Label Text="{Loc 'queue-position'}" Align="Center" />
|
||||
<Label Name="QueuePosition" StyleClasses="LabelHeading" Align="Center" />
|
||||
</BoxContainer>
|
||||
<BoxContainer Orientation="Vertical" VerticalExpand="True" Margin="0 10 0 0">
|
||||
<Label Text="{Loc 'queue-total'}" Align="Center" />
|
||||
<Label Name="QueueTotal" StyleClasses="LabelHeading" Align="Center" />
|
||||
</BoxContainer>
|
||||
</PanelContainer>
|
||||
<PanelContainer MinWidth="900" StyleClasses="LobbyShadedBackground" HorizontalAlignment="Center">
|
||||
<BoxContainer Orientation="Horizontal" HorizontalExpand="True" HorizontalAlignment="Center" Margin="4 4 4 0">
|
||||
<BoxContainer Orientation="Horizontal" VerticalExpand="True">
|
||||
<Label Text="{Loc 'queue-position'}" Align="Center" StyleClasses="LabelHeadingFuckingBigger" Margin="0 0 24 0" />
|
||||
<Label Name="QueuePosition" StyleClasses="LabelHeadingFuckingBigger" Align="Center" Margin="0 0 24 0" />
|
||||
<Label Text="{Loc 'queue-of'}" Align="Center" StyleClasses="LabelHeadingFuckingBigger" Margin="0 0 24 0" />
|
||||
<Label Name="QueueTotal" StyleClasses="LabelHeadingFuckingBigger" Align="Center" />
|
||||
</BoxContainer>
|
||||
</BoxContainer>
|
||||
<BoxContainer Orientation="Horizontal" VerticalAlignment="Bottom" Margin="0 20 0 0">
|
||||
<Button Name="PriorityJoinButton" Text="{Loc 'queue-priority-join'}" HorizontalExpand="True" StyleClasses="OpenRight" />
|
||||
</BoxContainer>
|
||||
</BoxContainer>
|
||||
</PanelContainer>
|
||||
</Control>
|
||||
</Control>
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
<Label Name="BloodSolutionVolume"/>
|
||||
<PanelContainer VerticalExpand="True" MinSize="0 100">
|
||||
<PanelContainer.PanelOverride>
|
||||
<gfx:StyleBoxFlat BackgroundColor="#1B1B1E" />
|
||||
<gfx:StyleBoxFlat BackgroundColor="#212121" />
|
||||
</PanelContainer.PanelOverride>
|
||||
<ScrollContainer HorizontalExpand="True" MinSize="0 100">
|
||||
<BoxContainer Name="BloodSolutionElements" Orientation="Vertical" Margin="4" HorizontalExpand="True"/>
|
||||
@@ -84,7 +84,7 @@
|
||||
<Label Name="ChemicalSolutionVolume"/>
|
||||
<PanelContainer VerticalExpand="True" MinSize="0 100">
|
||||
<PanelContainer.PanelOverride>
|
||||
<gfx:StyleBoxFlat BackgroundColor="#1B1B1E" />
|
||||
<gfx:StyleBoxFlat BackgroundColor="#212121" />
|
||||
</PanelContainer.PanelOverride>
|
||||
<ScrollContainer HorizontalExpand="True" MinSize="0 100">
|
||||
<BoxContainer Name="ChemicalSolutionElements" Orientation="Vertical" Margin="4" HorizontalExpand="True"/>
|
||||
|
||||
@@ -4,6 +4,8 @@ using Content.Server.Administration.Systems;
|
||||
using Content.Server.Bible.Components;
|
||||
using Content.Server.Body.Components;
|
||||
using Content.Server.Body.Systems;
|
||||
using Content.Server.Borer;
|
||||
using Content.Server.Carrying;
|
||||
using Content.Server.Cuffs;
|
||||
using Content.Server.DoAfter;
|
||||
using Content.Server.Emp;
|
||||
@@ -23,6 +25,7 @@ using Content.Server.Temperature.Systems;
|
||||
using Content.Shared._White.Chaplain;
|
||||
using Content.Shared._White.Overlays;
|
||||
using Content.Shared.Actions;
|
||||
using Content.Shared.Borer;
|
||||
using Content.Shared.Changeling;
|
||||
using Content.Shared.Chemistry.EntitySystems;
|
||||
using Content.Shared.Cuffs.Components;
|
||||
@@ -35,6 +38,7 @@ using Content.Shared.Hands.EntitySystems;
|
||||
using Content.Shared.Humanoid;
|
||||
using Content.Shared.Humanoid.Markings;
|
||||
using Content.Shared.Implants.Components;
|
||||
using Content.Shared.Interaction;
|
||||
using Content.Shared.Inventory;
|
||||
using Content.Shared.Miracle.UI;
|
||||
using Content.Shared.Mobs;
|
||||
@@ -85,6 +89,8 @@ public sealed partial class ChangelingSystem
|
||||
[Dependency] private readonly EmpSystem _empSystem = default!;
|
||||
[Dependency] private readonly TransformSystem _transform = default!;
|
||||
[Dependency] private readonly ContainerSystem _container = default!;
|
||||
[Dependency] private readonly ServerBorerSystem _borer = default!;
|
||||
[Dependency] private readonly CarryingSystem _carrying = default!;
|
||||
|
||||
private void InitializeAbilities()
|
||||
{
|
||||
@@ -377,6 +383,13 @@ public sealed partial class ChangelingSystem
|
||||
var target = GetEntity(args.Target);
|
||||
var user = GetEntity(args.Entity);
|
||||
|
||||
if (!Transform(user).Coordinates.InRange(EntityManager, _transform, Transform(target).Coordinates,
|
||||
SharedInteractionSystem.InteractionRange))
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("changeling-popup-transform-too-far"), user, user);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!TryComp<ActorComponent>(uid, out var actorComponent))
|
||||
return;
|
||||
|
||||
@@ -757,6 +770,8 @@ public sealed partial class ChangelingSystem
|
||||
if (!TakeChemicals(uid, component, 5))
|
||||
return;
|
||||
|
||||
BeforeTransform(args.User);
|
||||
|
||||
var polymorphEntity = _polymorph.PolymorphEntity(args.User, "MonkeyChangeling");
|
||||
|
||||
if (polymorphEntity == null)
|
||||
@@ -883,6 +898,8 @@ public sealed partial class ChangelingSystem
|
||||
if (!HasComp<HumanoidAppearanceComponent>(target) && !humanoidOverride)
|
||||
return null;
|
||||
|
||||
BeforeTransform(target);
|
||||
|
||||
var polymorphEntity = _polymorph.PolymorphEntity(target, transformData.EntityPrototype.ID);
|
||||
|
||||
if (polymorphEntity == null)
|
||||
@@ -927,6 +944,15 @@ public sealed partial class ChangelingSystem
|
||||
return polymorphEntity;
|
||||
}
|
||||
|
||||
private void BeforeTransform(EntityUid target)
|
||||
{
|
||||
if (TryComp(target, out BorerHostComponent? host) && host.BorerContainer.Count > 0)
|
||||
_borer.GetOut(host.BorerContainer.ContainedEntities[0]);
|
||||
|
||||
if (TryComp(target, out BeingCarriedComponent? beingCarried))
|
||||
_carrying.DropCarried(beingCarried.Carrier, target);
|
||||
}
|
||||
|
||||
private void TransferComponents(EntityUid from, EntityUid to)
|
||||
{
|
||||
if (HasComp<BibleUserComponent>(from))
|
||||
|
||||
175
Content.Server/Chemistry/EntitySystems/ChemistrySystem.Patch.cs
Normal file
175
Content.Server/Chemistry/EntitySystems/ChemistrySystem.Patch.cs
Normal file
@@ -0,0 +1,175 @@
|
||||
using Content.Server.Chemistry.Containers.EntitySystems;
|
||||
using Content.Shared.Chemistry.Components;
|
||||
using Content.Shared.Chemistry.Components.SolutionManager;
|
||||
using Content.Shared.Chemistry.EntitySystems;
|
||||
using Content.Shared.Chemistry.Reagent;
|
||||
using Content.Shared.Database;
|
||||
using Content.Shared.IdentityManagement;
|
||||
using Content.Shared.Interaction;
|
||||
using Content.Shared.Interaction.Events;
|
||||
using Content.Shared.Mobs.Components;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using Content.Shared.Chemistry;
|
||||
using Content.Shared.DoAfter;
|
||||
|
||||
namespace Content.Server.Chemistry.EntitySystems
|
||||
{
|
||||
public sealed partial class ChemistrySystem
|
||||
{
|
||||
[Dependency] private readonly ReactiveSystem _reactive = default!;
|
||||
[Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
|
||||
|
||||
public void InitializePatch()
|
||||
{
|
||||
SubscribeLocalEvent<PatchComponent, PatchDoAfterEvent>(OnPatchDoAfter);
|
||||
SubscribeLocalEvent<PatchComponent, AfterInteractEvent>(OnAfterInteract);
|
||||
SubscribeLocalEvent<PatchComponent, UseInHandEvent>(OnUseInHand);
|
||||
SubscribeLocalEvent<PatchComponent, SolutionContainerChangedEvent>(OnSolutionChange);
|
||||
}
|
||||
|
||||
private void OnPatchDoAfter(Entity<PatchComponent> entity, ref PatchDoAfterEvent args)
|
||||
{
|
||||
if (args.Cancelled || args.Handled || args.Args.Target == null)
|
||||
return;
|
||||
|
||||
TryDoInject(entity, args.Args.Target.Value, args.Args.User);
|
||||
args.Handled = true;
|
||||
}
|
||||
|
||||
private void PatchDoAfter(Entity<PatchComponent> patch, EntityUid target, EntityUid user)
|
||||
{
|
||||
var (uid, component) = patch;
|
||||
|
||||
// Dont need to start DoAfter if patch is empty
|
||||
if (!_solutionContainers.TryGetSolution(uid, component.SolutionName, out var _, out var patchSolution) || patchSolution.Volume == 0)
|
||||
{
|
||||
_popup.PopupCursor(Loc.GetString("patch-component-empty-message"), user);
|
||||
return;
|
||||
}
|
||||
|
||||
// Create a pop-up for the user
|
||||
_popup.PopupEntity(Loc.GetString("patch-component-injecting-user"), target, user);
|
||||
|
||||
var isTarget = user != target;
|
||||
|
||||
if (isTarget)
|
||||
{
|
||||
// Create a pop-up for the target
|
||||
var userName = Identity.Entity(user, EntityManager);
|
||||
_popup.PopupEntity(Loc.GetString("injector-component-injecting-target",
|
||||
("user", userName)), user, target);
|
||||
}
|
||||
|
||||
var actualDelay = MathHelper.Max(patch.Comp.Delay, TimeSpan.FromSeconds(1));
|
||||
|
||||
// Injections take 0.5 seconds longer per additional 5u
|
||||
actualDelay += TimeSpan.FromSeconds(patchSolution.Volume.Float() / component.Delay.TotalSeconds - 0.5f);
|
||||
|
||||
_adminLogger.Add(LogType.ForceFeed, $"{_entMan.ToPrettyString(user):user} is attempting to put a patch on {_entMan.ToPrettyString(target):target}");
|
||||
|
||||
_doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, user, actualDelay, new PatchDoAfterEvent(), patch.Owner, target: target, used: patch.Owner)
|
||||
{
|
||||
BreakOnUserMove = true,
|
||||
BreakOnDamage = true,
|
||||
BreakOnTargetMove = true
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Actually difference between OnUseInHand and OnAfterInteract only in target
|
||||
/// In OnUseInHand target is always = user. In OnAfterInteract target may be user or may not
|
||||
/// </summary>
|
||||
private void OnUseInHand(Entity<PatchComponent> entity, ref UseInHandEvent args)
|
||||
{
|
||||
if (args.Handled)
|
||||
return;
|
||||
|
||||
if (args.User is not { Valid: true } target)
|
||||
return;
|
||||
|
||||
PatchDoAfter(entity, target, args.User);
|
||||
|
||||
args.Handled = true;
|
||||
}
|
||||
|
||||
private void OnAfterInteract(Entity<PatchComponent> entity, ref AfterInteractEvent args)
|
||||
{
|
||||
if (!args.CanReach || args.Handled)
|
||||
return;
|
||||
|
||||
var (_, component) = entity;
|
||||
|
||||
if (!EligibleEntity(args.Target, _entMan, component))
|
||||
return;
|
||||
|
||||
if (args.Target is not { Valid: true } target)
|
||||
return;
|
||||
|
||||
var user = args.User;
|
||||
|
||||
PatchDoAfter(entity, target, user);
|
||||
args.Handled = true;
|
||||
}
|
||||
|
||||
private void OnSolutionChange(Entity<PatchComponent> entity, ref SolutionContainerChangedEvent args)
|
||||
{
|
||||
Dirty(entity);
|
||||
}
|
||||
|
||||
private bool TryDoInject(Entity<PatchComponent> patch, EntityUid? target, EntityUid user)
|
||||
{
|
||||
var (uid, component) = patch;
|
||||
|
||||
string? msgFormat = null;
|
||||
if (!EligibleEntity(target, _entMan, component))
|
||||
return false;
|
||||
|
||||
if (!_solutionContainers.TryGetSolution(uid, component.SolutionName, out var patchSoln, out var patchSolution) || patchSolution.Volume == 0)
|
||||
{
|
||||
// TODO: Empty patch should stop the bleeding
|
||||
|
||||
_popup.PopupCursor(Loc.GetString("patch-component-empty-message"), user);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!_solutionContainers.TryGetInjectableSolution(target.Value, out var targetSoln, out var targetSolution))
|
||||
{
|
||||
_popup.PopupCursor(Loc.GetString("patch-cant-inject", ("target", Identity.Entity(target.Value, _entMan))), user);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (patchSolution.Volume > targetSolution.AvailableVolume)
|
||||
{
|
||||
_popup.PopupCursor(Loc.GetString("patch-cant-inject-now"), user);
|
||||
return false;
|
||||
}
|
||||
|
||||
var removedSolution = _solutionContainers.SplitSolution(patchSoln.Value, patchSolution.Volume);
|
||||
|
||||
_popup.PopupCursor(Loc.GetString(msgFormat ?? "patch-component-inject-other-message", ("other", target)), user);
|
||||
|
||||
if (!targetSolution.CanAddSolution(removedSolution))
|
||||
return true;
|
||||
|
||||
_reactive.DoEntityReaction(target.Value, removedSolution, ReactionMethod.Touch);
|
||||
// Transfering only half of the solution via Injection method
|
||||
removedSolution.ScaleSolution(0.5f);
|
||||
_reactive.DoEntityReaction(target.Value, removedSolution, ReactionMethod.Injection);
|
||||
_solutionContainers.TryAddSolution(targetSoln.Value, removedSolution);
|
||||
QueueDel(patch);
|
||||
|
||||
_adminLogger.Add(LogType.ForceFeed, $"{_entMan.ToPrettyString(user):user} put a patch on {_entMan.ToPrettyString(target.Value):target} with a solution {SolutionContainerSystem.ToPrettyString(removedSolution):removedSolution} using a {_entMan.ToPrettyString(uid):using}");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool EligibleEntity([NotNullWhen(true)] EntityUid? entity, IEntityManager entMan, PatchComponent component)
|
||||
{
|
||||
// Using patch only on mobs
|
||||
return component.OnlyMobs
|
||||
? entMan.HasComponent<SolutionContainerManagerComponent>(entity) &&
|
||||
entMan.HasComponent<MobStateComponent>(entity)
|
||||
: entMan.HasComponent<SolutionContainerManagerComponent>(entity);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -22,5 +22,6 @@ public sealed partial class ChemistrySystem : EntitySystem
|
||||
// Why ChemMaster duplicates reagentdispenser nobody knows.
|
||||
InitializeHypospray();
|
||||
InitializeMixing();
|
||||
InitializePatch();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ using Content.Server.Inventory;
|
||||
using Content.Server.Pulling;
|
||||
using Content.Server.Stack;
|
||||
using Content.Server.Stunnable;
|
||||
using Content.Shared._White.MagGloves;
|
||||
using Content.Shared.ActionBlocker;
|
||||
using Content.Shared.Body.Part;
|
||||
using Content.Shared.CombatMode;
|
||||
@@ -93,6 +94,9 @@ namespace Content.Server.Hands.Systems
|
||||
if (args.Handled)
|
||||
return;
|
||||
|
||||
if (HasComp<PreventDisarmComponent>(uid))
|
||||
return;
|
||||
|
||||
// Break any pulls
|
||||
if (TryComp(uid, out SharedPullerComponent? puller) && puller.Pulling is EntityUid pulled &&
|
||||
TryComp(pulled, out SharedPullableComponent? pullable))
|
||||
|
||||
@@ -13,7 +13,10 @@ namespace Content.Server.Holosign
|
||||
/// <summary>
|
||||
/// How much charge a single use expends.
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadWrite), DataField("chargeUse")]
|
||||
public float ChargeUse = 50f;
|
||||
[ViewVariables(VVAccess.ReadWrite), DataField]
|
||||
public int Uses = 10;
|
||||
|
||||
[ViewVariables(VVAccess.ReadWrite), DataField]
|
||||
public List<EntityUid?> Signs = new();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
using Content.Server.Popups;
|
||||
using Content.Shared.Examine;
|
||||
using Content.Shared.Coordinates.Helpers;
|
||||
using Content.Server.Power.Components;
|
||||
using Content.Server.PowerCell;
|
||||
using Content.Shared.Interaction;
|
||||
using Content.Shared.Storage;
|
||||
using Content.Shared.Interaction.Events;
|
||||
using Content.Shared.Popups;
|
||||
|
||||
namespace Content.Server.Holosign;
|
||||
|
||||
public sealed class HolosignSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly PowerCellSystem _powerCell = default!;
|
||||
[Dependency] private readonly SharedTransformSystem _transform = default!;
|
||||
[Dependency] private readonly PopupSystem _popupSystem = default!;
|
||||
|
||||
|
||||
public override void Initialize()
|
||||
@@ -18,19 +18,20 @@ public sealed class HolosignSystem : EntitySystem
|
||||
base.Initialize();
|
||||
SubscribeLocalEvent<HolosignProjectorComponent, BeforeRangedInteractEvent>(OnBeforeInteract);
|
||||
SubscribeLocalEvent<HolosignProjectorComponent, ExaminedEvent>(OnExamine);
|
||||
SubscribeLocalEvent<HolosignProjectorComponent, ComponentRemove>(OnComponentRemove);
|
||||
SubscribeLocalEvent<HolosignProjectorComponent, UseInHandEvent>(OnUse);
|
||||
}
|
||||
|
||||
private void OnExamine(EntityUid uid, HolosignProjectorComponent component, ExaminedEvent args)
|
||||
{
|
||||
// TODO: This should probably be using an itemstatus
|
||||
// TODO: I'm too lazy to do this rn but it's literally copy-paste from emag.
|
||||
_powerCell.TryGetBatteryFromSlot(uid, out var battery);
|
||||
var charges = UsesRemaining(component, battery);
|
||||
var maxCharges = MaxUses(component, battery);
|
||||
var charges = UsesRemaining(component);
|
||||
var maxCharges = component.Uses;
|
||||
var activeholo = ActiveHolo(component);
|
||||
|
||||
using (args.PushGroup(nameof(HolosignProjectorComponent)))
|
||||
{
|
||||
args.PushMarkup(Loc.GetString("limited-charges-charges-remaining", ("charges", charges)));
|
||||
args.PushMarkup(Loc.GetString("holoprojector-active-holo", ("activeholo", activeholo)));
|
||||
|
||||
if (charges > 0 && charges == maxCharges)
|
||||
{
|
||||
@@ -39,39 +40,58 @@ public sealed class HolosignSystem : EntitySystem
|
||||
}
|
||||
}
|
||||
|
||||
private void OnUse(EntityUid uid, HolosignProjectorComponent comp, UseInHandEvent args)
|
||||
{
|
||||
foreach (var sign in comp.Signs)
|
||||
{
|
||||
comp.Signs.Remove(sign);
|
||||
QueueDel(sign);
|
||||
}
|
||||
_popupSystem.PopupEntity(Loc.GetString("holoprojector-delete-signs"), args.User, args.User, PopupType.Medium);
|
||||
}
|
||||
|
||||
private void OnBeforeInteract(EntityUid uid, HolosignProjectorComponent component, BeforeRangedInteractEvent args)
|
||||
{
|
||||
if (component.Signs.Contains(args.Target)) // wd edit
|
||||
{
|
||||
QueueDel(args.Target);
|
||||
component.Signs.Remove(args.Target);
|
||||
return;
|
||||
}
|
||||
|
||||
if (args.Handled
|
||||
|| !args.CanReach // prevent placing out of range
|
||||
|| HasComp<StorageComponent>(args.Target) // if it's a storage component like a bag, we ignore usage so it can be stored
|
||||
|| !_powerCell.TryUseCharge(uid, component.ChargeUse) // if no battery or no charge, doesn't work
|
||||
)
|
||||
if (args.Handled || !args.CanReach)
|
||||
return;
|
||||
|
||||
// places the holographic sign at the click location, snapped to grid.
|
||||
// overlapping of the same holo on one tile remains allowed to allow holofan refreshes
|
||||
if (component.Signs.Count >= component.Uses) // wd edit
|
||||
{
|
||||
_popupSystem.PopupEntity(Loc.GetString("holoprojector-uses-limit"), args.User, args.User, PopupType.Medium);
|
||||
return;
|
||||
}
|
||||
|
||||
var holoUid = EntityManager.SpawnEntity(component.SignProto, args.ClickLocation.SnapToGrid(EntityManager));
|
||||
var xform = Transform(holoUid);
|
||||
if (!xform.Anchored)
|
||||
_transform.AnchorEntity(holoUid, xform); // anchor to prevent any tempering with (don't know what could even interact with it)
|
||||
_transform.AnchorEntity(holoUid, xform);
|
||||
|
||||
args.Handled = true;
|
||||
component.Signs.Add(holoUid); // WD EDIT
|
||||
}
|
||||
|
||||
private int UsesRemaining(HolosignProjectorComponent component, BatteryComponent? battery = null)
|
||||
private void OnComponentRemove(EntityUid uid, HolosignProjectorComponent comp, ComponentRemove args) // wd edit
|
||||
{
|
||||
if (battery == null ||
|
||||
component.ChargeUse == 0f) return 0;
|
||||
|
||||
return (int) (battery.CurrentCharge / component.ChargeUse);
|
||||
foreach (var sign in comp.Signs)
|
||||
{
|
||||
QueueDel(sign);
|
||||
}
|
||||
}
|
||||
|
||||
private int MaxUses(HolosignProjectorComponent component, BatteryComponent? battery = null)
|
||||
private int UsesRemaining(HolosignProjectorComponent component)
|
||||
{
|
||||
if (battery == null ||
|
||||
component.ChargeUse == 0f) return 0;
|
||||
return (component.Uses - component.Signs.Count); // wd edit
|
||||
}
|
||||
|
||||
return (int) (battery.MaxCharge / component.ChargeUse);
|
||||
private int ActiveHolo(HolosignProjectorComponent component) // wd edit
|
||||
{
|
||||
return (component.Signs.Count); // wd edit
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,11 +46,19 @@ namespace Content.Server.Inventory
|
||||
return;
|
||||
|
||||
var enumerator = new InventorySlotEnumerator(source.Comp);
|
||||
// WD EDIT START
|
||||
List<(EntityUid, string)> items = new();
|
||||
while (enumerator.NextItem(out var item, out var slot))
|
||||
{
|
||||
if (TryUnequip(source, slot.Name, true, true, inventory: source.Comp))
|
||||
TryEquip(target, item, slot.Name , true, true, inventory: target.Comp);
|
||||
items.Add((item, slot.Name));
|
||||
}
|
||||
|
||||
foreach (var (item, name) in items)
|
||||
{
|
||||
TryUnequip(source, name, true, true, inventory: source.Comp);
|
||||
TryEquip(target, item, name, true, true, inventory: target.Comp);
|
||||
}
|
||||
// WD EDIT END
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,9 +42,19 @@ public sealed class ProjectileSystem : SharedProjectileSystem
|
||||
// This is so entities that shouldn't get a collision are ignored.
|
||||
if (args.OurFixtureId != ProjectileFixture || !args.OtherFixture.Hard
|
||||
|| component.DamagedEntity || component is { Weapon: null, OnlyCollideWhenShot: true })
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var target = args.OtherEntity;
|
||||
|
||||
var collideAttemptEv = new ProjectileCollideAttemptEvent(uid, component, false);
|
||||
RaiseLocalEvent(target, ref collideAttemptEv);
|
||||
if (collideAttemptEv.Cancelled)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// it's here so this check is only done once before possible hit
|
||||
var attemptEv = new ProjectileReflectAttemptEvent(uid, component, false);
|
||||
RaiseLocalEvent(target, ref attemptEv);
|
||||
|
||||
@@ -3,6 +3,7 @@ using Content.Shared.Hands.Components;
|
||||
using Content.Shared.Hands.EntitySystems;
|
||||
using Content.Shared.Standing;
|
||||
using Content.Shared.Throwing;
|
||||
using Content.Shared._White.MagGloves;
|
||||
using Robust.Shared.Physics.Components;
|
||||
using Robust.Shared.Random;
|
||||
|
||||
@@ -31,8 +32,11 @@ public sealed class StandingStateSystem : EntitySystem
|
||||
if (hand.HeldEntity is not EntityUid held)
|
||||
continue;
|
||||
|
||||
if (!_handsSystem.TryDrop(uid, hand, null, checkActionBlocker: false, handsComp: handsComp))
|
||||
continue;
|
||||
if (!HasComp<KeepItemsOnFallComponent>(uid))
|
||||
{
|
||||
if (!_handsSystem.TryDrop(uid, hand, null, checkActionBlocker: false, handsComp: handsComp))
|
||||
continue;
|
||||
}
|
||||
|
||||
_throwingSystem.TryThrow(held,
|
||||
_random.NextAngle().RotateVec(direction / dropAngle + worldRotation / 50),
|
||||
|
||||
@@ -18,6 +18,7 @@ using Content.Shared.Popups;
|
||||
using Content.Shared.Strip;
|
||||
using Content.Shared.Strip.Components;
|
||||
using Content.Shared.Verbs;
|
||||
using Content.Shared._White.MagGloves;
|
||||
using Robust.Server.GameObjects;
|
||||
using Robust.Shared.Player;
|
||||
using Robust.Shared.Utility;
|
||||
@@ -71,6 +72,13 @@ namespace Content.Server.Strip
|
||||
!TryComp<HandsComponent>(user, out var userHands))
|
||||
return;
|
||||
|
||||
if ((args.Slot == "gloves" || args.IsHand) && TryComp(strippable, out PreventStrippingFromHandsAndGlovesComponent? mag))
|
||||
{
|
||||
var message = Loc.GetString("maggloves-cant-strip");
|
||||
_popup.PopupEntity(message, user, user);
|
||||
return;
|
||||
}
|
||||
|
||||
if (args.IsHand)
|
||||
{
|
||||
StripHand(user, args.Slot, strippable, userHands);
|
||||
|
||||
@@ -215,14 +215,31 @@ public sealed partial class GunSystem : SharedGunSystem
|
||||
var ray = new CollisionRay(from.Position, dir, hitscan.CollisionMask);
|
||||
var rayCastResults =
|
||||
Physics.IntersectRay(from.MapId, ray, hitscan.MaxLength, lastUser, false).ToList();
|
||||
if (!rayCastResults.Any())
|
||||
if (rayCastResults.Count == 0)
|
||||
break;
|
||||
|
||||
var result = rayCastResults[0];
|
||||
var hit = result.HitEntity;
|
||||
lastHit = hit;
|
||||
RayCastResults? result = null;
|
||||
foreach (var castResults in rayCastResults)
|
||||
{
|
||||
var hitscanAttemptEv = new HitscanHitAttemptEvent(castResults.HitEntity, gun.Target);
|
||||
RaiseLocalEvent(castResults.HitEntity, ref hitscanAttemptEv);
|
||||
if (hitscanAttemptEv.Cancelled)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
FireEffects(fromEffect, result.Distance, dir.Normalized().ToAngle(), hitscan, hit);
|
||||
result = castResults;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!result.HasValue)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var hit = result.Value.HitEntity;
|
||||
lastHit = hit;
|
||||
FireEffects(fromEffect, result.Value.Distance, dir.Normalized().ToAngle(), hitscan, hit);
|
||||
|
||||
var ev = new HitScanReflectAttemptEvent(user, gunUid, hitscan.Reflective, dir, false);
|
||||
RaiseLocalEvent(hit, ref ev);
|
||||
@@ -296,25 +313,30 @@ public sealed partial class GunSystem : SharedGunSystem
|
||||
private void ShootOrThrow(EntityUid uid, Vector2 mapDirection, Vector2 gunVelocity, GunComponent gun, EntityUid gunUid, EntityUid? user)
|
||||
{
|
||||
// Do a throw
|
||||
if (!HasComp<ProjectileComponent>(uid))
|
||||
if (TryComp(uid, out ProjectileComponent? projectile))
|
||||
{
|
||||
RemoveShootable(uid);
|
||||
// TODO: Someone can probably yeet this a billion miles so need to pre-validate input somewhere up the call stack.
|
||||
// WD EDIT START
|
||||
var coefficient = _powered.GetPowerCoefficient(gunUid);
|
||||
if (gun.ForceThrowingAngle)
|
||||
{
|
||||
var angle = EnsureComp<ThrowingAngleComponent>(uid);
|
||||
angle.Angle = gun.Angle;
|
||||
}
|
||||
ThrowingSystem.TryThrow(uid, mapDirection.Normalized() * 7f * coefficient, gun.ProjectileSpeedModified, user);
|
||||
if (gun.ForceThrowingAngle)
|
||||
RemComp<ThrowingAngleComponent>(uid);
|
||||
// WD EDIT END
|
||||
projectile.Target = gun.Target;
|
||||
ShootProjectile(uid, mapDirection, gunVelocity, gunUid, user, gun.ProjectileSpeedModified);
|
||||
return;
|
||||
}
|
||||
|
||||
ShootProjectile(uid, mapDirection, gunVelocity, gunUid, user, gun.ProjectileSpeedModified);
|
||||
RemoveShootable(uid);
|
||||
// TODO: Someone can probably yeet this a billion miles so need to pre-validate input somewhere up the call stack.
|
||||
// WD EDIT START
|
||||
var coefficient = _powered.GetPowerCoefficient(gunUid);
|
||||
if (gun.ForceThrowingAngle)
|
||||
{
|
||||
var angle = EnsureComp<ThrowingAngleComponent>(uid);
|
||||
angle.Angle = gun.Angle;
|
||||
}
|
||||
|
||||
ThrowingSystem.TryThrow(uid, mapDirection.Normalized() * 7f * coefficient, gun.ProjectileSpeedModified,
|
||||
user);
|
||||
|
||||
if (gun.ForceThrowingAngle)
|
||||
RemComp<ThrowingAngleComponent>(uid);
|
||||
|
||||
// WD EDIT END
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -2,6 +2,7 @@ using Content.Server.Body.Systems;
|
||||
using Content.Shared.Body.Organ;
|
||||
using Content.Shared.Construction;
|
||||
using Content.Shared._White.CheapSurgery;
|
||||
using Content.Shared.Changeling;
|
||||
|
||||
namespace Content.Server._White.Construction.Completions;
|
||||
|
||||
@@ -20,7 +21,8 @@ public sealed partial class Surgery : IGraphAction
|
||||
return;
|
||||
}
|
||||
|
||||
if (entityManager.TryGetComponent<OrganComponent>(surgeryComponent.OrganUid, out var organComponent))
|
||||
if (entityManager.TryGetComponent<OrganComponent>(surgeryComponent.OrganUid, out var organComponent) &&
|
||||
!entityManager.HasComponent<ChangelingComponent>(uid))
|
||||
bodySystem.RemoveOrgan(surgeryComponent.OrganUid, organComponent);
|
||||
|
||||
entityManager.RemoveComponent<ActiveSurgeryComponent>(uid);
|
||||
|
||||
116
Content.Server/_White/MagGloves/MagneticGlovesSystem.cs
Normal file
116
Content.Server/_White/MagGloves/MagneticGlovesSystem.cs
Normal file
@@ -0,0 +1,116 @@
|
||||
using Content.Server.Emp;
|
||||
using Content.Server.Power.Components;
|
||||
using Content.Shared.Examine;
|
||||
using Content.Shared.Inventory.Events;
|
||||
using Content.Shared._White.MagGloves;
|
||||
using Content.Shared.Popups;
|
||||
using Robust.Shared.Containers;
|
||||
using Robust.Shared.Timing;
|
||||
|
||||
namespace Content.Server._White.MagGloves;
|
||||
|
||||
/// <summary>
|
||||
/// This handles...
|
||||
/// </summary>
|
||||
public sealed class MagneticGlovesSystem : EntitySystem
|
||||
{
|
||||
|
||||
[Dependency] private readonly SharedContainerSystem _sharedContainer = default!;
|
||||
[Dependency] private readonly IGameTiming _gameTiming = default!;
|
||||
[Dependency] private readonly SharedPopupSystem _popup = default!;
|
||||
/// <inheritdoc/>
|
||||
public override void Initialize()
|
||||
{
|
||||
SubscribeLocalEvent<MagneticGlovesComponent, GotEquippedEvent>(OnGotEquipped);
|
||||
SubscribeLocalEvent<MagneticGlovesComponent, GotUnequippedEvent>(OnGotUnequipped);
|
||||
SubscribeLocalEvent<MagneticGlovesComponent, ExaminedEvent>(OnExamined);
|
||||
SubscribeLocalEvent<MagneticGlovesComponent, EmpPulseEvent>(OnEmp);
|
||||
}
|
||||
|
||||
public override void Update(float frameTime)
|
||||
{
|
||||
var query = EntityQueryEnumerator<MagneticGlovesComponent>();
|
||||
while (query.MoveNext(out var uid, out var gloves))
|
||||
{
|
||||
if (_gameTiming.CurTime > gloves.GlovesLastActivation + gloves.GlovesActiveTime && gloves.Enabled)
|
||||
{
|
||||
RaiseLocalEvent(uid, new ToggleMagneticGlovesEvent());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public void OnEmp(EntityUid uid, MagneticGlovesComponent component, EmpPulseEvent args)
|
||||
{
|
||||
if (component.Enabled)
|
||||
{
|
||||
RaiseLocalEvent(uid, new ToggleMagneticGlovesEvent());
|
||||
}
|
||||
}
|
||||
|
||||
public void OnGotUnequipped(EntityUid uid, MagneticGlovesComponent component, GotUnequippedEvent args)
|
||||
{
|
||||
if (args.Slot == "gloves")
|
||||
{
|
||||
ToggleGloves(args.Equipee, component, false, uid);
|
||||
}
|
||||
|
||||
if (component.Enabled)
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("maggloves-deactivated"), uid, args.Equipee);
|
||||
RaiseLocalEvent(uid, new ToggleMagneticGlovesEvent());
|
||||
}
|
||||
}
|
||||
|
||||
public void OnGotEquipped(EntityUid uid, MagneticGlovesComponent component, GotEquippedEvent args)
|
||||
{
|
||||
if (args.Slot == "gloves")
|
||||
{
|
||||
ToggleGloves(args.Equipee, component, true, uid);
|
||||
}
|
||||
}
|
||||
|
||||
public void ToggleGloves(EntityUid owner, MagneticGlovesComponent component, bool active, EntityUid uid)
|
||||
{
|
||||
if (!active)
|
||||
{
|
||||
RemComp<KeepItemsOnFallComponent>(owner);
|
||||
if (TryComp<MagneticGlovesAdvancedComponent>(uid, out var adv))
|
||||
{
|
||||
RemComp<PreventDisarmComponent>(owner);
|
||||
RemComp<PreventStrippingFromHandsAndGlovesComponent>(owner);
|
||||
}
|
||||
}
|
||||
else if (component.Enabled)
|
||||
{
|
||||
EnsureComp<KeepItemsOnFallComponent>(owner);
|
||||
if (TryComp<MagneticGlovesAdvancedComponent>(uid, out var adv))
|
||||
{
|
||||
EnsureComp<PreventDisarmComponent>(owner);
|
||||
EnsureComp<PreventStrippingFromHandsAndGlovesComponent>(owner);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void OnExamined(EntityUid uid, MagneticGlovesComponent component, ExaminedEvent args)
|
||||
{
|
||||
|
||||
if (!args.IsInDetailsRange)
|
||||
return;
|
||||
|
||||
var message = Loc.GetString("maggloves-ready-in") + " " + component.GlovesReadyAt.Subtract(_gameTiming.CurTime).TotalSeconds.ToString("0");
|
||||
|
||||
if (component.GlovesReadyAt < _gameTiming.CurTime)
|
||||
{
|
||||
message = Loc.GetString("maggloves-ready");
|
||||
}
|
||||
|
||||
if (component.Enabled)
|
||||
{
|
||||
message = Loc.GetString("maggloves-enabled-till") + " " + (component.GlovesLastActivation
|
||||
.Add(component.GlovesActiveTime).Subtract(_gameTiming.CurTime).TotalSeconds.ToString("0"));
|
||||
}
|
||||
|
||||
args.PushMarkup(message);
|
||||
}
|
||||
}
|
||||
@@ -67,7 +67,7 @@ public sealed class CritSystem : EntitySystem
|
||||
args.BonusDamage = new DamageSpecifier(_prototypeManager.Index<DamageTypePrototype>("Slash"),
|
||||
damage - args.BaseDamage.GetTotal());
|
||||
|
||||
_popup.PopupEntity($@"Crit! {damage}", args.User, PopupType.MediumCaution);
|
||||
_popup.PopupEntity($"Crit! {damage}", args.User, args.User, PopupType.MediumCaution);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -137,7 +137,7 @@ public abstract class SharedTentacleGun : EntitySystem
|
||||
|
||||
private bool PullMob(ProjectileEmbedEvent args)
|
||||
{
|
||||
var stunTime = _random.Next(TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(5));
|
||||
var stunTime = _random.Next(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(3));
|
||||
|
||||
if (!_stunSystem.TryParalyze(args.Embedded, stunTime, true))
|
||||
return false;
|
||||
|
||||
42
Content.Shared/Chemistry/Components/PatchComponent.cs
Normal file
42
Content.Shared/Chemistry/Components/PatchComponent.cs
Normal file
@@ -0,0 +1,42 @@
|
||||
using Content.Shared.DoAfter;
|
||||
using Content.Shared.FixedPoint;
|
||||
using Robust.Shared.GameStates;
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Shared.Chemistry.Components;
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public sealed partial class PatchDoAfterEvent : SimpleDoAfterEvent
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implements draw/inject behavior for droppers and syringes.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Can optionally support both
|
||||
/// injection and drawing or just injection. Can inject/draw reagents from solution
|
||||
/// containers, and can directly inject into a mobs bloodstream.
|
||||
/// </remarks>
|
||||
|
||||
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
||||
public sealed partial class PatchComponent : Component
|
||||
{
|
||||
|
||||
[ViewVariables, AutoNetworkedField]
|
||||
public FixedPoint2 CurrentVolume;
|
||||
|
||||
[ViewVariables, AutoNetworkedField]
|
||||
public FixedPoint2 TotalVolume;
|
||||
|
||||
[DataField("solutionName")]
|
||||
public string SolutionName = "patch";
|
||||
|
||||
[DataField("onlyMobs")]
|
||||
public bool OnlyMobs = true;
|
||||
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
[DataField("delay")]
|
||||
public TimeSpan Delay = TimeSpan.FromSeconds(5);
|
||||
|
||||
}
|
||||
@@ -56,6 +56,7 @@ namespace Content.Shared.Input
|
||||
public static readonly BoundKeyFunction ZoomOut = "ZoomOut";
|
||||
public static readonly BoundKeyFunction ZoomIn = "ZoomIn";
|
||||
public static readonly BoundKeyFunction ResetZoom = "ResetZoom";
|
||||
public static readonly BoundKeyFunction LieDown = "LieDown"; // WD EDIT
|
||||
|
||||
public static readonly BoundKeyFunction ArcadeUp = "ArcadeUp";
|
||||
public static readonly BoundKeyFunction ArcadeDown = "ArcadeDown";
|
||||
|
||||
@@ -26,6 +26,12 @@ public sealed partial class ProjectileComponent : Component
|
||||
[DataField, AutoNetworkedField]
|
||||
public EntityUid? Weapon;
|
||||
|
||||
/// <summary>
|
||||
/// Entity being targeted by crosshair.
|
||||
/// </summary>
|
||||
[AutoNetworkedField]
|
||||
public EntityUid? Target;
|
||||
|
||||
/// <summary>
|
||||
/// The projectile spawns inside the shooter most of the time, this prevents entities from shooting themselves.
|
||||
/// </summary>
|
||||
|
||||
@@ -334,6 +334,12 @@ public sealed class ImpactEffectEvent : EntityEventArgs
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Raised when an entity is just about to be hit with a projectile
|
||||
/// </summary>
|
||||
[ByRefEvent]
|
||||
public record struct ProjectileCollideAttemptEvent(EntityUid ProjUid, ProjectileComponent Component, bool Cancelled);
|
||||
|
||||
/// <summary>
|
||||
/// Raised when an entity is just about to be hit with a projectile but can reflect it
|
||||
/// </summary>
|
||||
|
||||
@@ -1,18 +1,27 @@
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.GameStates;
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Shared.Standing
|
||||
{
|
||||
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
||||
[Access(typeof(StandingStateSystem))]
|
||||
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, Access(typeof(StandingStateSystem))]
|
||||
public sealed partial class StandingStateComponent : Component
|
||||
{
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
[DataField]
|
||||
[ViewVariables(VVAccess.ReadWrite), DataField]
|
||||
public SoundSpecifier DownSound { get; private set; } = new SoundCollectionSpecifier("BodyFall");
|
||||
|
||||
[DataField, AutoNetworkedField]
|
||||
public bool Standing { get; set; } = true;
|
||||
public StandingState CurrentState { get; set; } = StandingState.Standing; // WD EDIT
|
||||
|
||||
/// <summary>
|
||||
/// Time required to get up.
|
||||
/// </summary>
|
||||
[DataField, AutoNetworkedField]
|
||||
public TimeSpan StandingUpTime { get; set; } = TimeSpan.FromSeconds(1); // WD EDIT
|
||||
|
||||
// WD EDIT
|
||||
[DataField, AutoNetworkedField, ViewVariables(VVAccess.ReadWrite)]
|
||||
public bool CanLieDown = false;
|
||||
|
||||
/// <summary>
|
||||
/// List of fixtures that had their collision mask changed when the entity was downed.
|
||||
@@ -20,5 +29,19 @@ namespace Content.Shared.Standing
|
||||
/// </summary>
|
||||
[DataField, AutoNetworkedField]
|
||||
public List<string> ChangedFixtures = new();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class ChangeStandingStateEvent : EntityEventArgs
|
||||
{
|
||||
}
|
||||
|
||||
// WD EDIT
|
||||
public enum StandingState
|
||||
{
|
||||
Lying,
|
||||
GettingUp,
|
||||
Standing
|
||||
}
|
||||
@@ -1,166 +1,324 @@
|
||||
using Content.Shared.DoAfter;
|
||||
using Content.Shared.Hands.Components;
|
||||
using Content.Shared.Input;
|
||||
using Content.Shared.Movement.Systems;
|
||||
using Content.Shared.Physics;
|
||||
using Content.Shared.Projectiles;
|
||||
using Content.Shared.Rotation;
|
||||
using Robust.Shared.Audio;
|
||||
using Content.Shared.Weapons.Ranged.Systems;
|
||||
using Robust.Shared.Audio.Systems;
|
||||
using Robust.Shared.Input.Binding;
|
||||
using Robust.Shared.Physics;
|
||||
using Robust.Shared.Physics.Systems;
|
||||
using Robust.Shared.Player;
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Shared.Standing
|
||||
namespace Content.Shared.Standing;
|
||||
|
||||
public sealed class StandingStateSystem : EntitySystem
|
||||
{
|
||||
public sealed class StandingStateSystem : EntitySystem
|
||||
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
|
||||
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
||||
[Dependency] private readonly SharedPhysicsSystem _physics = default!;
|
||||
[Dependency] private readonly SharedDoAfterSystem _doAfter = default!; // WD EDIT
|
||||
[Dependency] private readonly MovementSpeedModifierSystem _movement = default!; // WD EDIT
|
||||
|
||||
// If StandingCollisionLayer value is ever changed to more than one layer, the logic needs to be edited.
|
||||
private const int StandingCollisionLayer = (int) CollisionGroup.MidImpassable;
|
||||
|
||||
// WD EDIT START
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void Initialize()
|
||||
{
|
||||
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
|
||||
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
||||
[Dependency] private readonly SharedPhysicsSystem _physics = default!;
|
||||
base.Initialize();
|
||||
|
||||
// If StandingCollisionLayer value is ever changed to more than one layer, the logic needs to be edited.
|
||||
private const int StandingCollisionLayer = (int) CollisionGroup.MidImpassable;
|
||||
SubscribeLocalEvent<StandingStateComponent, StandingUpDoAfterEvent>(OnStandingUpDoAfter);
|
||||
SubscribeLocalEvent<StandingStateComponent, RefreshMovementSpeedModifiersEvent>(OnRefreshMovementSpeed);
|
||||
SubscribeLocalEvent<StandingStateComponent, ProjectileCollideAttemptEvent>(OnProjectileCollideAttempt);
|
||||
SubscribeLocalEvent<StandingStateComponent, HitscanHitAttemptEvent>(OnHitscanHitAttempt);
|
||||
|
||||
public bool IsDown(EntityUid uid, StandingStateComponent? standingState = null)
|
||||
SubscribeNetworkEvent<ChangeStandingStateEvent>(OnChangeState);
|
||||
|
||||
CommandBinds.Builder
|
||||
.Bind(ContentKeyFunctions.LieDown, InputCmdHandler.FromDelegate(ChangeLyingState))
|
||||
.Register<StandingStateSystem>();
|
||||
}
|
||||
|
||||
|
||||
private void OnRefreshMovementSpeed(
|
||||
EntityUid uid,
|
||||
StandingStateComponent component,
|
||||
RefreshMovementSpeedModifiersEvent args)
|
||||
{
|
||||
if (IsDown(uid))
|
||||
args.ModifySpeed(0.4f, 0.4f);
|
||||
else
|
||||
args.ModifySpeed(1f, 1f);
|
||||
}
|
||||
|
||||
private void OnProjectileCollideAttempt(EntityUid uid, StandingStateComponent component, ref ProjectileCollideAttemptEvent args)
|
||||
{
|
||||
if (component.CurrentState is StandingState.Standing)
|
||||
{
|
||||
if (!Resolve(uid, ref standingState, false))
|
||||
return false;
|
||||
|
||||
return !standingState.Standing;
|
||||
return;
|
||||
}
|
||||
|
||||
public bool Down(EntityUid uid, bool playSound = true, bool dropHeldItems = true,
|
||||
StandingStateComponent? standingState = null,
|
||||
AppearanceComponent? appearance = null,
|
||||
HandsComponent? hands = null)
|
||||
if (!args.Component.Target.HasValue || args.Component.Target != uid)
|
||||
{
|
||||
// TODO: This should actually log missing comps...
|
||||
if (!Resolve(uid, ref standingState, false))
|
||||
return false;
|
||||
args.Cancelled = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Optional component.
|
||||
Resolve(uid, ref appearance, ref hands, false);
|
||||
private void OnHitscanHitAttempt(EntityUid uid, StandingStateComponent component, ref HitscanHitAttemptEvent args)
|
||||
{
|
||||
if (component.CurrentState is StandingState.Standing)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!standingState.Standing)
|
||||
return true;
|
||||
if (!args.Target.HasValue || args.Target != uid)
|
||||
{
|
||||
args.Cancelled = true;
|
||||
}
|
||||
}
|
||||
|
||||
// This is just to avoid most callers doing this manually saving boilerplate
|
||||
// 99% of the time you'll want to drop items but in some scenarios (e.g. buckling) you don't want to.
|
||||
// We do this BEFORE downing because something like buckle may be blocking downing but we want to drop hand items anyway
|
||||
// and ultimately this is just to avoid boilerplate in Down callers + keep their behavior consistent.
|
||||
if (dropHeldItems && hands != null)
|
||||
private void OnStandingUpDoAfter(EntityUid uid, StandingStateComponent component, StandingUpDoAfterEvent args)
|
||||
{
|
||||
Stand(uid);
|
||||
_movement.RefreshMovementSpeedModifiers(uid);
|
||||
}
|
||||
|
||||
private void OnChangeState(ChangeStandingStateEvent ev, EntitySessionEventArgs args)
|
||||
{
|
||||
if (!args.SenderSession.AttachedEntity.HasValue)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var uid = args.SenderSession.AttachedEntity.Value;
|
||||
|
||||
if (IsDown(uid))
|
||||
{
|
||||
TryStandUp(uid);
|
||||
}
|
||||
else
|
||||
{
|
||||
TryLieDown(uid);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Send an update event when player pressed keybind.
|
||||
/// </summary>
|
||||
private void ChangeLyingState(ICommonSession? session)
|
||||
{
|
||||
if (session?.AttachedEntity == null ||
|
||||
!TryComp(session.AttachedEntity, out StandingStateComponent? standing) ||
|
||||
!standing.CanLieDown)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
RaiseNetworkEvent(new ChangeStandingStateEvent());
|
||||
}
|
||||
|
||||
public bool TryStandUp(EntityUid uid, StandingStateComponent? standingState = null)
|
||||
{
|
||||
if (!Resolve(uid, ref standingState, false))
|
||||
return false;
|
||||
|
||||
if (standingState.CurrentState is not StandingState.Lying)
|
||||
return false;
|
||||
|
||||
standingState.CurrentState = StandingState.GettingUp;
|
||||
var doargs = new DoAfterArgs(EntityManager, uid, standingState.StandingUpTime,
|
||||
new StandingUpDoAfterEvent(), uid)
|
||||
{
|
||||
BreakOnUserMove = false,
|
||||
BreakOnDamage = false,
|
||||
BreakOnHandChange = false
|
||||
};
|
||||
|
||||
_doAfter.TryStartDoAfter(doargs);
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool TryLieDown(EntityUid uid, StandingStateComponent? standingState = null)
|
||||
{
|
||||
if (!Resolve(uid, ref standingState, false))
|
||||
return false;
|
||||
|
||||
if (standingState.CurrentState is not StandingState.Standing)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
Down(uid, true, false, standingState);
|
||||
_movement.RefreshMovementSpeedModifiers(uid);
|
||||
return true;
|
||||
}
|
||||
|
||||
// WD EDIT END
|
||||
|
||||
public bool IsDown(EntityUid uid, StandingStateComponent? standingState = null)
|
||||
{
|
||||
if (!Resolve(uid, ref standingState, false))
|
||||
return false;
|
||||
|
||||
return standingState.CurrentState is StandingState.Lying or StandingState.GettingUp;
|
||||
}
|
||||
|
||||
public bool Down(
|
||||
EntityUid uid,
|
||||
bool playSound = true,
|
||||
bool dropHeldItems = true,
|
||||
StandingStateComponent? standingState = null,
|
||||
AppearanceComponent? appearance = null,
|
||||
HandsComponent? hands = null)
|
||||
{
|
||||
// TODO: This should actually log missing comps...
|
||||
if (!Resolve(uid, ref standingState, false))
|
||||
return false;
|
||||
|
||||
// Optional component.
|
||||
Resolve(uid, ref appearance, ref hands, false);
|
||||
|
||||
if (standingState.CurrentState is StandingState.Lying or StandingState.GettingUp)
|
||||
return true;
|
||||
|
||||
// This is just to avoid most callers doing this manually saving boilerplate
|
||||
// 99% of the time you'll want to drop items but in some scenarios (e.g. buckling) you don't want to.
|
||||
// We do this BEFORE downing because something like buckle may be blocking downing but we want to drop hand items anyway
|
||||
// and ultimately this is just to avoid boilerplate in Down callers + keep their behavior consistent.
|
||||
if (dropHeldItems && hands != null)
|
||||
{
|
||||
RaiseLocalEvent(uid, new DropHandItemsEvent());
|
||||
}
|
||||
|
||||
var msg = new DownAttemptEvent();
|
||||
RaiseLocalEvent(uid, msg);
|
||||
|
||||
if (msg.Cancelled)
|
||||
return false;
|
||||
|
||||
standingState.CurrentState = StandingState.Lying;
|
||||
Dirty(uid, standingState);
|
||||
RaiseLocalEvent(uid, new DownedEvent());
|
||||
|
||||
// Seemed like the best place to put it
|
||||
_appearance.SetData(uid, RotationVisuals.RotationState, RotationState.Horizontal, appearance);
|
||||
|
||||
// Change collision masks to allow going under certain entities like flaps and tables
|
||||
if (TryComp(uid, out FixturesComponent? fixtureComponent))
|
||||
{
|
||||
foreach (var (key, fixture) in fixtureComponent.Fixtures)
|
||||
{
|
||||
RaiseLocalEvent(uid, new DropHandItemsEvent(), false);
|
||||
}
|
||||
if ((fixture.CollisionMask & StandingCollisionLayer) == 0)
|
||||
continue;
|
||||
|
||||
var msg = new DownAttemptEvent();
|
||||
RaiseLocalEvent(uid, msg, false);
|
||||
standingState.ChangedFixtures.Add(key);
|
||||
_physics.SetCollisionMask(uid, key, fixture, fixture.CollisionMask & ~StandingCollisionLayer,
|
||||
manager: fixtureComponent);
|
||||
}
|
||||
}
|
||||
|
||||
// check if component was just added or streamed to client
|
||||
// if true, no need to play sound - mob was down before player could seen that
|
||||
if (standingState.LifeStage <= ComponentLifeStage.Starting)
|
||||
return true;
|
||||
|
||||
if (playSound)
|
||||
{
|
||||
_audio.PlayPredicted(standingState.DownSound, uid, uid);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool Stand(
|
||||
EntityUid uid,
|
||||
StandingStateComponent? standingState = null,
|
||||
AppearanceComponent? appearance = null,
|
||||
bool force = false)
|
||||
{
|
||||
// TODO: This should actually log missing comps...
|
||||
if (!Resolve(uid, ref standingState, false))
|
||||
return false;
|
||||
|
||||
// Optional component.
|
||||
Resolve(uid, ref appearance, false);
|
||||
|
||||
if (standingState.CurrentState is StandingState.Standing)
|
||||
return true;
|
||||
|
||||
if (!force)
|
||||
{
|
||||
var msg = new StandAttemptEvent();
|
||||
RaiseLocalEvent(uid, msg);
|
||||
|
||||
if (msg.Cancelled)
|
||||
return false;
|
||||
|
||||
standingState.Standing = false;
|
||||
Dirty(standingState);
|
||||
RaiseLocalEvent(uid, new DownedEvent(), false);
|
||||
|
||||
// Seemed like the best place to put it
|
||||
_appearance.SetData(uid, RotationVisuals.RotationState, RotationState.Horizontal, appearance);
|
||||
|
||||
// Change collision masks to allow going under certain entities like flaps and tables
|
||||
if (TryComp(uid, out FixturesComponent? fixtureComponent))
|
||||
{
|
||||
foreach (var (key, fixture) in fixtureComponent.Fixtures)
|
||||
{
|
||||
if ((fixture.CollisionMask & StandingCollisionLayer) == 0)
|
||||
continue;
|
||||
|
||||
standingState.ChangedFixtures.Add(key);
|
||||
_physics.SetCollisionMask(uid, key, fixture, fixture.CollisionMask & ~StandingCollisionLayer, manager: fixtureComponent);
|
||||
}
|
||||
}
|
||||
|
||||
// check if component was just added or streamed to client
|
||||
// if true, no need to play sound - mob was down before player could seen that
|
||||
if (standingState.LifeStage <= ComponentLifeStage.Starting)
|
||||
return true;
|
||||
|
||||
if (playSound)
|
||||
{
|
||||
_audio.PlayPredicted(standingState.DownSound, uid, uid);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool Stand(EntityUid uid,
|
||||
StandingStateComponent? standingState = null,
|
||||
AppearanceComponent? appearance = null,
|
||||
bool force = false)
|
||||
standingState.CurrentState = StandingState.Standing;
|
||||
Dirty(uid, standingState);
|
||||
RaiseLocalEvent(uid, new StoodEvent());
|
||||
|
||||
_appearance.SetData(uid, RotationVisuals.RotationState, RotationState.Vertical, appearance);
|
||||
|
||||
if (TryComp(uid, out FixturesComponent? fixtureComponent))
|
||||
{
|
||||
// TODO: This should actually log missing comps...
|
||||
if (!Resolve(uid, ref standingState, false))
|
||||
return false;
|
||||
|
||||
// Optional component.
|
||||
Resolve(uid, ref appearance, false);
|
||||
|
||||
if (standingState.Standing)
|
||||
return true;
|
||||
|
||||
if (!force)
|
||||
foreach (var key in standingState.ChangedFixtures)
|
||||
{
|
||||
var msg = new StandAttemptEvent();
|
||||
RaiseLocalEvent(uid, msg, false);
|
||||
|
||||
if (msg.Cancelled)
|
||||
return false;
|
||||
}
|
||||
|
||||
standingState.Standing = true;
|
||||
Dirty(uid, standingState);
|
||||
RaiseLocalEvent(uid, new StoodEvent(), false);
|
||||
|
||||
_appearance.SetData(uid, RotationVisuals.RotationState, RotationState.Vertical, appearance);
|
||||
|
||||
if (TryComp(uid, out FixturesComponent? fixtureComponent))
|
||||
{
|
||||
foreach (var key in standingState.ChangedFixtures)
|
||||
if (fixtureComponent.Fixtures.TryGetValue(key, out var fixture))
|
||||
{
|
||||
if (fixtureComponent.Fixtures.TryGetValue(key, out var fixture))
|
||||
_physics.SetCollisionMask(uid, key, fixture, fixture.CollisionMask | StandingCollisionLayer, fixtureComponent);
|
||||
_physics.SetCollisionMask(uid, key, fixture, fixture.CollisionMask | StandingCollisionLayer,
|
||||
fixtureComponent);
|
||||
}
|
||||
}
|
||||
standingState.ChangedFixtures.Clear();
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class DropHandItemsEvent : EventArgs
|
||||
{
|
||||
}
|
||||
standingState.ChangedFixtures.Clear();
|
||||
|
||||
/// <summary>
|
||||
/// Subscribe if you can potentially block a down attempt.
|
||||
/// </summary>
|
||||
public sealed class DownAttemptEvent : CancellableEntityEventArgs
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Subscribe if you can potentially block a stand attempt.
|
||||
/// </summary>
|
||||
public sealed class StandAttemptEvent : CancellableEntityEventArgs
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Raised when an entity becomes standing
|
||||
/// </summary>
|
||||
public sealed class StoodEvent : EntityEventArgs
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Raised when an entity is not standing
|
||||
/// </summary>
|
||||
public sealed class DownedEvent : EntityEventArgs
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class DropHandItemsEvent : EventArgs
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Subscribe if you can potentially block a down attempt.
|
||||
/// </summary>
|
||||
public sealed class DownAttemptEvent : CancellableEntityEventArgs
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Subscribe if you can potentially block a stand attempt.
|
||||
/// </summary>
|
||||
public sealed class StandAttemptEvent : CancellableEntityEventArgs
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Raised when an entity becomes standing
|
||||
/// </summary>
|
||||
public sealed class StoodEvent : EntityEventArgs
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Raised when an entity is not standing
|
||||
/// </summary>
|
||||
public sealed class DownedEvent : EntityEventArgs
|
||||
{
|
||||
}
|
||||
|
||||
// WD EDIT
|
||||
[Serializable, NetSerializable]
|
||||
public sealed partial class StandingUpDoAfterEvent : SimpleDoAfterEvent
|
||||
{
|
||||
}
|
||||
@@ -22,6 +22,7 @@ using Content.Shared.Weapons.Ranged.Components;
|
||||
using Content.Shared.Weapons.Ranged.Events;
|
||||
using Content.Shared.Weapons.Ranged.Systems;
|
||||
using Content.Shared._White;
|
||||
using Content.Shared._White.MagGloves;
|
||||
using Content.Shared._White.Chaplain;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.Audio.Systems;
|
||||
|
||||
@@ -235,6 +235,9 @@ public sealed partial class GunComponent : Component
|
||||
public bool ClumsyProof = false;
|
||||
|
||||
// WD START
|
||||
|
||||
public EntityUid? Target;
|
||||
|
||||
[DataField("forceThrowingAngle")]
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public bool ForceThrowingAngle;
|
||||
|
||||
@@ -9,6 +9,7 @@ namespace Content.Shared.Weapons.Ranged.Events;
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class RequestShootEvent : EntityEventArgs
|
||||
{
|
||||
public NetEntity? Target;
|
||||
public NetEntity Gun;
|
||||
public NetCoordinates Coordinates;
|
||||
}
|
||||
|
||||
@@ -144,6 +144,7 @@ public abstract partial class SharedGunSystem : EntitySystem
|
||||
return;
|
||||
|
||||
gun.ShootCoordinates = GetCoordinates(msg.Coordinates);
|
||||
gun.Target = GetEntity(msg.Target);
|
||||
Log.Debug($"Set shoot coordinates to {gun.ShootCoordinates}");
|
||||
AttemptShoot(user.Value, ent, gun);
|
||||
}
|
||||
@@ -591,6 +592,12 @@ public abstract partial class SharedGunSystem : EntitySystem
|
||||
[ByRefEvent]
|
||||
public record struct AttemptShootEvent(EntityUid User, string? Message, bool Cancelled = false, bool ThrowItems = false);
|
||||
|
||||
/// <summary>
|
||||
/// Raised when an entity is just about to be hit with a hitscan
|
||||
/// </summary>
|
||||
[ByRefEvent]
|
||||
public record struct HitscanHitAttemptEvent(EntityUid HitEntity, EntityUid? Target, bool Cancelled = false);
|
||||
|
||||
/// <summary>
|
||||
/// Raised directed on the gun after firing.
|
||||
/// </summary>
|
||||
|
||||
@@ -52,6 +52,6 @@ public sealed class BackstabSystem : EntitySystem
|
||||
return;
|
||||
|
||||
var message = Loc.GetString("backstab-damage-betrayal-dagger", ("damage", damage));
|
||||
_popup.PopupClient(message, args.User, args.User, PopupType.MediumCaution);
|
||||
_popup.PopupEntity(message, args.User, args.User, PopupType.MediumCaution);
|
||||
}
|
||||
}
|
||||
|
||||
10
Content.Shared/_White/MagGloves/KeepItemsOnFallComponent.cs
Normal file
10
Content.Shared/_White/MagGloves/KeepItemsOnFallComponent.cs
Normal file
@@ -0,0 +1,10 @@
|
||||
namespace Content.Shared._White.MagGloves;
|
||||
|
||||
/// <summary>
|
||||
/// This is used to prevent entity loose it's items on fall.
|
||||
/// </summary>
|
||||
[RegisterComponent]
|
||||
public sealed partial class KeepItemsOnFallComponent : Component
|
||||
{
|
||||
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._White.MagGloves;
|
||||
|
||||
/// <summary>
|
||||
/// This is used as a marker for advanced magnetic gloves.
|
||||
/// </summary>
|
||||
[RegisterComponent, AutoGenerateComponentState]
|
||||
public sealed partial class MagneticGlovesAdvancedComponent : Component
|
||||
{
|
||||
[DataField, AutoNetworkedField]
|
||||
public EntityUid? ToggleActionEntity;
|
||||
|
||||
[DataField]
|
||||
public EntProtoId ToggleAction = "ActionToggleMagneticGlovesAdvanced";
|
||||
}
|
||||
31
Content.Shared/_White/MagGloves/MagneticGlovesComponent.cs
Normal file
31
Content.Shared/_White/MagGloves/MagneticGlovesComponent.cs
Normal file
@@ -0,0 +1,31 @@
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._White.MagGloves;
|
||||
|
||||
/// <summary>
|
||||
/// This is used for...
|
||||
/// </summary>
|
||||
[RegisterComponent, AutoGenerateComponentState]
|
||||
public sealed partial class MagneticGlovesComponent : Component
|
||||
{
|
||||
[ViewVariables]
|
||||
public bool Enabled { get; set; } = false;
|
||||
|
||||
[DataField, AutoNetworkedField]
|
||||
public EntityUid? ToggleActionEntity;
|
||||
|
||||
[DataField("action")]
|
||||
public EntProtoId ToggleAction = "ActionToggleMagneticGloves";
|
||||
|
||||
[ViewVariables(VVAccess.ReadOnly)]
|
||||
public TimeSpan GlovesReadyAt = TimeSpan.Zero;
|
||||
|
||||
[ViewVariables(VVAccess.ReadOnly)]
|
||||
public TimeSpan GlovesLastActivation = TimeSpan.Zero;
|
||||
|
||||
[DataField("glovesCooldown")]
|
||||
public TimeSpan GlovesCooldown = TimeSpan.FromSeconds(60);
|
||||
|
||||
[DataField("glovesActiveTime")]
|
||||
public TimeSpan GlovesActiveTime = TimeSpan.FromSeconds(60);
|
||||
}
|
||||
10
Content.Shared/_White/MagGloves/PreventDisarmComponent.cs
Normal file
10
Content.Shared/_White/MagGloves/PreventDisarmComponent.cs
Normal file
@@ -0,0 +1,10 @@
|
||||
namespace Content.Shared._White.MagGloves;
|
||||
|
||||
/// <summary>
|
||||
/// This is used to prevent disarming when magnetic gloves are enabled.
|
||||
/// </summary>
|
||||
[RegisterComponent]
|
||||
public sealed partial class PreventDisarmComponent : Component
|
||||
{
|
||||
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
namespace Content.Shared._White.MagGloves;
|
||||
|
||||
/// <summary>
|
||||
/// This is used to block stripping when magnetic gloves are enabled.
|
||||
/// </summary>
|
||||
[RegisterComponent]
|
||||
public sealed partial class PreventStrippingFromHandsAndGlovesComponent : Component
|
||||
{
|
||||
|
||||
}
|
||||
107
Content.Shared/_White/MagGloves/SharedMagneticGlovesSystem.cs
Normal file
107
Content.Shared/_White/MagGloves/SharedMagneticGlovesSystem.cs
Normal file
@@ -0,0 +1,107 @@
|
||||
using Content.Shared.Actions;
|
||||
using Content.Shared.Clothing.EntitySystems;
|
||||
using Content.Shared.Inventory;
|
||||
using Content.Shared.Item;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.Toggleable;
|
||||
using Robust.Shared.Containers;
|
||||
using Robust.Shared.Network;
|
||||
using Robust.Shared.Timing;
|
||||
|
||||
namespace Content.Shared._White.MagGloves;
|
||||
|
||||
/// <summary>
|
||||
/// This handles...
|
||||
/// </summary>
|
||||
public sealed class SharedMagneticGlovesSystem : EntitySystem
|
||||
|
||||
{
|
||||
[Dependency] private readonly SharedActionsSystem _sharedActions = default!;
|
||||
[Dependency] private readonly InventorySystem _inventory = default!;
|
||||
[Dependency] private readonly SharedContainerSystem _sharedContainer = default!;
|
||||
[Dependency] private readonly SharedItemSystem _item = default!;
|
||||
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
|
||||
[Dependency] private readonly ClothingSystem _clothing = default!;
|
||||
[Dependency] private readonly IGameTiming _gameTiming = default!;
|
||||
[Dependency] private readonly SharedPopupSystem _popup = default!;
|
||||
[Dependency] private readonly INetManager _net = default!;
|
||||
public override void Initialize()
|
||||
{
|
||||
SubscribeLocalEvent<MagneticGlovesComponent, GetItemActionsEvent>(OnGetActions);
|
||||
SubscribeLocalEvent<MagneticGlovesComponent, ToggleMagneticGlovesEvent>(OnToggleGloves);
|
||||
}
|
||||
|
||||
public void OnGetActions(EntityUid uid, MagneticGlovesComponent component, GetItemActionsEvent args)
|
||||
{
|
||||
if (!args.InHands)
|
||||
{
|
||||
args.AddAction(ref component.ToggleActionEntity, component.ToggleAction);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void OnToggleGloves(EntityUid uid, MagneticGlovesComponent component, ToggleMagneticGlovesEvent args)
|
||||
{
|
||||
if (args.Handled || _net.IsClient)
|
||||
return;
|
||||
|
||||
_sharedContainer.TryGetContainingContainer(uid, out var container);
|
||||
|
||||
if (!component.Enabled)
|
||||
{
|
||||
if (component.GlovesReadyAt > _gameTiming.CurTime)
|
||||
{
|
||||
if (container != null)
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("maggloves-not-ready"), uid, container.Owner);
|
||||
}
|
||||
return;
|
||||
}
|
||||
// If the gloves are not enabled, we want to activate them.
|
||||
component.Enabled = true;
|
||||
component.GlovesLastActivation = _gameTiming.CurTime;
|
||||
_sharedActions.SetToggled(component.ToggleActionEntity, component.Enabled);
|
||||
|
||||
if (container != null)
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("maggloves-activated"), uid, container.Owner);
|
||||
EnsureComp<KeepItemsOnFallComponent>(container.Owner);
|
||||
if (TryComp<MagneticGlovesAdvancedComponent>(uid, out var adv))
|
||||
{
|
||||
EnsureComp<PreventDisarmComponent>(container.Owner);
|
||||
EnsureComp<PreventStrippingFromHandsAndGlovesComponent>(container.Owner);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
component.Enabled = false;
|
||||
_sharedActions.SetToggled(component.ToggleActionEntity, component.Enabled);
|
||||
component.GlovesReadyAt = _gameTiming.CurTime + component.GlovesCooldown;
|
||||
|
||||
if (container != null)
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("maggloves-deactivated"), uid, container.Owner);
|
||||
RemComp<KeepItemsOnFallComponent>(container.Owner);
|
||||
if (TryComp<MagneticGlovesAdvancedComponent>(uid, out var adv))
|
||||
{
|
||||
RemComp<PreventDisarmComponent>(container.Owner);
|
||||
RemComp<PreventStrippingFromHandsAndGlovesComponent>(container.Owner);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (TryComp<AppearanceComponent>(uid, out var appearance) &&
|
||||
TryComp<ItemComponent>(uid, out var item))
|
||||
{
|
||||
_item.SetHeldPrefix(uid, component.Enabled ? "on" : "off", false, item);
|
||||
_appearance.SetData(uid, ToggleVisuals.Toggled, component.Enabled, appearance);
|
||||
_clothing.SetEquippedPrefix(uid, component.Enabled ? "on" : null);
|
||||
}
|
||||
|
||||
args.Handled = true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public sealed partial class ToggleMagneticGlovesEvent : InstantActionEvent {}
|
||||
@@ -17,7 +17,7 @@ public sealed class WhiteCVars
|
||||
*/
|
||||
|
||||
public static readonly CVarDef<string> RulesWiki =
|
||||
CVarDef.Create("white.wiki_rules", "https://wiki.ss14.su/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0",
|
||||
CVarDef.Create("white.wiki_rules", "https://js.ss14.su/rules",
|
||||
CVar.SERVER | CVar.REPLICATED);
|
||||
|
||||
/*
|
||||
@@ -197,7 +197,7 @@ public sealed class WhiteCVars
|
||||
CVarDef.Create("white.chat_size_separated", "0.6;0", CVar.CLIENTONLY | CVar.ARCHIVE);
|
||||
|
||||
public static readonly CVarDef<string> DefaultChatSize =
|
||||
CVarDef.Create("white.chat_size_default", "300;500", CVar.CLIENTONLY | CVar.ARCHIVE);
|
||||
CVarDef.Create("white.chat_size_default", "300;-500", CVar.CLIENTONLY | CVar.ARCHIVE);
|
||||
|
||||
/*
|
||||
* OnlyInOhio
|
||||
|
||||
@@ -2411,3 +2411,155 @@
|
||||
id: 202
|
||||
time: '2024-03-17T22:20:34.0000000+00:00'
|
||||
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/217
|
||||
- author: ThereDrD
|
||||
changes:
|
||||
- message: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u044B \u043E\u043A\u0441\
|
||||
\u0438\u0434 \u0430\u0437\u043E\u0442\u0430, \u0411\u0417 \u0438 \u043F\u043B\
|
||||
\u044E\u043E\u043A\u0441\u0438\u0443\u043C \u0432 \u043A\u0430\u0440\u0433\u043E\
|
||||
-\u043A\u043E\u043D\u0441\u043E\u043B\u044C."
|
||||
type: Add
|
||||
id: 203
|
||||
time: '2024-03-20T19:46:26.0000000+00:00'
|
||||
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/224
|
||||
- author: Valtos
|
||||
changes:
|
||||
- message: "\u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u0438\u0435 \u043D\
|
||||
\u043E\u0432\u043E\u0433\u043E \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\
|
||||
\u0441\u0430 \u0441 \u0444\u0438\u043A\u0441\u043E\u043C \u043D\u0435\u0434\u043E\
|
||||
\u0447\u0451\u0442\u043E\u0432."
|
||||
type: Add
|
||||
id: 204
|
||||
time: '2024-03-20T19:54:45.0000000+00:00'
|
||||
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/108
|
||||
- author: Aviu
|
||||
changes:
|
||||
- message: "\u041E\u0442 \u043C\u0435\u0442\u0430 \u0438 \u044D\u0444\u0435\u0434\
|
||||
\u0440\u0438\u043D\u0430 \u0442\u0435\u043F\u0435\u0440\u044C \u043C\u0443\u0442\
|
||||
\u043D\u0435\u0435\u0442 \u0432 \u0433\u043B\u0430\u0437\u0430\u0445."
|
||||
type: Tweak
|
||||
id: 205
|
||||
time: '2024-03-20T19:53:45.0000000+00:00'
|
||||
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/196
|
||||
- author: Aviu
|
||||
changes:
|
||||
- message: "\u041F\u0440\u0438 \u0442\u0440\u0430\u043D\u0441\u0444\u043E\u0440\u043C\
|
||||
\u0430\u0446\u0438\u0438 \u0433\u0435\u043D\u043E\u043A\u0440\u0430\u0434\u0430\
|
||||
\ \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435 \u0432\u044B\u043F\u0430\
|
||||
\u0434\u0430\u044E\u0442 \u0432\u0435\u0449\u0438 \u0438\u0437 \u0441\u043B\u043E\
|
||||
\u0442\u043E\u0432 \u043A\u0430\u0440\u043C\u0430\u043D\u043E\u0432, \u0436\u0438\
|
||||
\u043B\u0435\u0442\u0430 \u0438 \u041F\u0414\u0410."
|
||||
type: Fix
|
||||
- message: "\u041F\u0440\u0438 \u0442\u0440\u0430\u043D\u0441\u0444\u043E\u0440\u043C\
|
||||
\u0430\u0446\u0438\u0438 \u0433\u0435\u043D\u043E\u043A\u0440\u0430\u0434\u0430\
|
||||
\ \u0431\u043E\u0440\u0435\u0440 \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\
|
||||
\u0435 \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442\u0441\u044F\
|
||||
\ \u0432 \u0434\u0440\u0443\u0433\u043E\u0435 \u0438\u0437\u043C\u0435\u0440\
|
||||
\u0435\u043D\u0438\u0435."
|
||||
type: Fix
|
||||
- message: "\u0411\u043E\u043B\u044C\u0448\u0435 \u043D\u0435\u043B\u044C\u0437\u044F\
|
||||
\ \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0436\
|
||||
\u0430\u043B\u043E \u0442\u0440\u0430\u043D\u0441\u0444\u043E\u0440\u043C\u0430\
|
||||
\u0446\u0438\u0438 \u043D\u0430 \u0440\u0430\u0441\u0441\u0442\u043E\u044F\u043D\
|
||||
\u0438\u0438."
|
||||
type: Fix
|
||||
- message: "\u0422\u0440\u0430\u043D\u0441\u0444\u043E\u0440\u043C\u0430\u0446\u0438\
|
||||
\u044F \u0433\u0435\u043D\u043E\u043A\u0440\u0430\u0434\u0430 \u0442\u0435\u043F\
|
||||
\u0435\u0440\u044C \u043A\u043E\u0440\u0440\u0435\u043A\u0442\u043D\u043E \u0440\
|
||||
\u0430\u0431\u043E\u0442\u0430\u044E\u0442 \u043F\u0440\u0438 \u0442\u0430\u0441\
|
||||
\u043A\u0430\u043D\u0438\u0438 \u043D\u0430 \u0440\u0443\u043A\u0430\u0445."
|
||||
type: Fix
|
||||
- message: "\u0413\u0435\u043D\u043E\u043A\u0440\u0430\u0434\u0443 \u0431\u043E\u043B\
|
||||
\u044C\u0448\u0435 \u043D\u0435\u043B\u044C\u0437\u044F \u0432\u044B\u0440\u0435\
|
||||
\u0437\u0430\u0442\u044C \u043E\u0440\u0433\u0430\u043D\u044B."
|
||||
type: Fix
|
||||
- message: "\u041E\u0431\u0440\u0435\u0437 \u0431\u043E\u043B\u044C\u0448\u0435\
|
||||
\ \u043D\u0435 \u043F\u043E\u043B\u0443\u0447\u0430\u0435\u0442 \u043C\u0430\
|
||||
\u0433\u0438\u0447\u0435\u0441\u043A\u0438\u043C \u043E\u0431\u0440\u0430\u0437\
|
||||
\u043E\u043C \u043F\u043E\u0432\u044B\u0448\u0435\u043D\u043D\u0443\u044E \u0441\
|
||||
\u043A\u043E\u0440\u043E\u0441\u0442\u0440\u0435\u043B\u044C\u043D\u043E\u0441\
|
||||
\u0442\u044C."
|
||||
type: Tweak
|
||||
- message: "\u0423\u043C\u0435\u043D\u044C\u0448\u0435\u043D \u0440\u0430\u0437\u043C\
|
||||
\u0435\u0440 \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u043E\u0439 \u043E\u0434\
|
||||
\u0435\u0436\u0434\u044B \u0438 \u0436\u0438\u043B\u0435\u0442\u043E\u0432."
|
||||
type: Tweak
|
||||
- message: "\u0423\u0431\u0440\u0430\u043D \u0438\u043C\u043F\u043B\u0430\u043D\u0442\
|
||||
\ \u0441\u0432\u0435\u0442\u043E\u0432\u043E\u0433\u043E \u043A\u043E\u043F\u044C\
|
||||
\u044F \u0438\u0437 \u0430\u043F\u043B\u0438\u043D\u043A\u0430 \u043E\u043F\u0435\
|
||||
\u0440\u0430\u0442\u0438\u0432\u043D\u0438\u043A\u043E\u0432."
|
||||
type: Tweak
|
||||
- message: "\u041D\u0435\u043C\u043D\u043E\u0433\u043E \u0443\u0432\u0435\u043B\u0438\
|
||||
\u0447\u0435\u043D\u044B \u0440\u0435\u0437\u0438\u0441\u0442\u044B \u0443 \u0431\
|
||||
\u0440\u043E\u043D\u0438 \u0433\u0435\u043D\u043E\u043A\u0440\u0430\u0434\u0430\
|
||||
."
|
||||
type: Tweak
|
||||
- message: "\u0422\u0440\u0430\u043D\u043A\u0432\u0438\u043B\u0438\u0437\u0430\u0442\
|
||||
\u043E\u0440\u044B \u0442\u0435\u043F\u0435\u0440\u044C \u043A\u043B\u0430\u0434\
|
||||
\u0443\u0442 \u0441 3\u0445 \u043F\u043E\u043F\u0430\u0434\u0430\u043D\u0438\
|
||||
\u0439, \u043D\u043E \u0438\u0437\u0433\u043E\u0442\u0430\u0432\u043B\u0438\u0432\
|
||||
\u0430\u044E\u0442\u0441\u044F \u0437\u0430 \u043C\u0435\u043D\u044C\u0448\u0435\
|
||||
\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043C\u0430\
|
||||
\u0442\u0435\u0440\u0438\u0430\u043B\u043E\u0432."
|
||||
type: Tweak
|
||||
- message: "\u0423\u043C\u0435\u043D\u044C\u0448\u0435\u043D\u043E \u0432\u0440\u0435\
|
||||
\u043C\u044F \u0441\u0442\u0430\u043D\u0430 \u0443 \u0442\u0435\u043D\u0442\u0430\
|
||||
\u043A\u043B\u0438 \u0433\u0435\u043D\u043E\u043A\u0440\u0430\u0434\u0430."
|
||||
type: Tweak
|
||||
- message: "\u0412\u0437\u0440\u044B\u0432 \u0442\u043E\u043F\u043B\u0438\u0432\u043D\
|
||||
\u044B\u0445 \u0431\u0430\u043A\u043E\u0432 \u0431\u043E\u043B\u044C\u0448\u0435\
|
||||
\ \u043D\u0435 \u043F\u0440\u043E\u0431\u0438\u0432\u0430\u0435\u0442 \u043F\
|
||||
\u043E\u043B."
|
||||
type: Tweak
|
||||
- message: "\u041E\u0442\u043A\u043B\u044E\u0447\u0435\u043D \u0430\u0441\u043F\u0435\
|
||||
\u043A\u0442 \u0448\u0435\u043F\u043E\u0442\u0430."
|
||||
type: Remove
|
||||
id: 206
|
||||
time: '2024-03-20T19:54:07.0000000+00:00'
|
||||
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/213
|
||||
- author: Aviu
|
||||
changes:
|
||||
- message: "\u0424\u0435\u043B\u0438\u043D\u0438\u0434\u043E\u0432 \u0442\u0435\u043F\
|
||||
\u0435\u0440\u044C \u043C\u043E\u0436\u043D\u043E \u0433\u043B\u0430\u0434\u0438\
|
||||
\u0442\u044C."
|
||||
type: Add
|
||||
id: 207
|
||||
time: '2024-03-20T19:54:18.0000000+00:00'
|
||||
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/219
|
||||
- author: Aviu
|
||||
changes:
|
||||
- message: "\u0424\u0438\u043A\u0441 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\
|
||||
, \u043D\u0435 \u043F\u043E\u043B\u0443\u0447\u0430\u044E\u0449\u0438\u0445\
|
||||
\ \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u043D\u044B\u0439 \u0443\u0440\
|
||||
\u043E\u043D."
|
||||
type: Fix
|
||||
id: 208
|
||||
time: '2024-03-20T19:54:26.0000000+00:00'
|
||||
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/215
|
||||
- author: CaypenNow
|
||||
changes:
|
||||
- message: "\u0410\u0442\u043C\u043E\u0441 \u0433\u043E\u043B\u043E\u043F\u0440\u043E\
|
||||
\u0435\u043A\u0442\u043E\u0440\u044B \u043F\u0435\u0440\u0435\u0434\u0435\u043B\
|
||||
\u0430\u043D\u044B!"
|
||||
type: Add
|
||||
id: 209
|
||||
time: '2024-03-20T23:44:18.0000000+00:00'
|
||||
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/225
|
||||
- author: Remuchi
|
||||
changes:
|
||||
- message: "\u0412\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044C \u0432\
|
||||
\u0441\u0442\u0430\u0432\u0430\u0442\u044C \u0438 \u043B\u043E\u0436\u0438\u0442\
|
||||
\u044C\u0441\u044F \u043D\u0430 \u043A\u043D\u043E\u043F\u043A\u0443 U. \u041C\
|
||||
\u043E\u0436\u043D\u043E \u043F\u043E\u043C\u0435\u043D\u044F\u0442\u044C \u0432\
|
||||
\ \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430\u0445"
|
||||
type: Add
|
||||
- message: "\u0421\u043D\u0430\u0440\u044F\u0434\u044B \u0442\u0435\u043F\u0435\u0440\
|
||||
\u044C \u043F\u0440\u043E\u0445\u043E\u0434\u044F\u0442 \u0447\u0435\u0440\u0435\
|
||||
\u0437 \u043B\u0435\u0436\u0430\u0447\u0438\u0445 \u0441\u0443\u0449\u0435\u0441\
|
||||
\u0442\u0432. \u0415\u0441\u043B\u0438 \u0446\u0435\u043B\u0438\u0442\u044C\u0441\
|
||||
\u044F \u043C\u044B\u0448\u043A\u043E\u0439 \u043F\u043E \u043D\u0438\u043C\
|
||||
, \u0442\u043E \u0441\u043D\u0430\u0440\u044F\u0434\u044B \u0431\u0443\u0434\
|
||||
\u0443\u0442 \u043F\u043E\u043F\u0430\u0434\u0430\u0442\u044C"
|
||||
type: Add
|
||||
id: 210
|
||||
time: '2024-03-21T02:54:11.0000000+00:00'
|
||||
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/195
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
## Entity
|
||||
|
||||
patch-component-target-getting-injected = Someone trying to put a patch on you
|
||||
patch-component-injecting-user = You are trying to put a patch on {$target}.
|
||||
patch-component-inject-other-message = You put a patch on {$other}.
|
||||
patch-component-inject-self-message = You put a patch on yourself.
|
||||
patch-component-empty-message = It's empty!
|
||||
patch-component-feel-prick-message = You feel a little sting
|
||||
patch-cant-inject = Can't put a patch on {$target}!
|
||||
patch-cant-inject-now = Can't put a patch now
|
||||
@@ -134,6 +134,7 @@ ui-options-function-examine-entity = Examine
|
||||
ui-options-function-swap-hands = Swap hands
|
||||
ui-options-function-move-stored-item = Move stored item
|
||||
ui-options-function-rotate-stored-item = Rotate stored item
|
||||
ui-options-function-lie-down = Lie down/Get up
|
||||
ui-options-static-storage-ui = Lock storage window to hotbar
|
||||
|
||||
ui-options-function-smart-equip-backpack = Smart-equip to backpack
|
||||
|
||||
@@ -129,3 +129,13 @@ reagent-desc-necrosol = A necrotic substance that seems to be able to heal froze
|
||||
|
||||
reagent-name-aloxadone = aloxadone
|
||||
reagent-desc-aloxadone = A cryogenics chemical. Used to treat severe third degree burns via regeneration of the burnt tissue. Works regardless of the patient being alive or dead.
|
||||
|
||||
reagent-name-synthflesh = synthflesh
|
||||
reagent-desc-synthflesh = A slightly toxic medicine capable of healing both bruises and burns.
|
||||
|
||||
reagent-name-silversulfadiazine = silver sulfadiazine
|
||||
reagent-desc-silversulfadiazine = This compound with antibacterial properties is administered for the treatment of individuals suffering from burns.
|
||||
|
||||
reagent-name-stypticpowder = styptic powder
|
||||
reagent-desc-stypticpowder = Aluminum sulfate styptic powder aids in managing bleeding and promoting the healing of bodily injuries.
|
||||
|
||||
|
||||
@@ -96,3 +96,4 @@ reagent-physical-desc-alkaline = alkaline
|
||||
reagent-physical-desc-reflective = reflective
|
||||
reagent-physical-desc-holy = holy
|
||||
reagent-physical-desc-slimy = slimy
|
||||
reagent-physical-desc-gelatinous = gelatinous
|
||||
|
||||
10
Resources/Locale/en-US/white/magnetic-gloves.ftl
Normal file
10
Resources/Locale/en-US/white/magnetic-gloves.ftl
Normal file
@@ -0,0 +1,10 @@
|
||||
maggloves-ready = Gloves are ready to use.
|
||||
maggloves-ready-in = Gloves will be ready in
|
||||
research-technology-lightweight-magnets = Lightweight Magnets
|
||||
research-technology-advanced-grips = Advanced Grips
|
||||
maggloves-not-ready = The gloves are not ready yet
|
||||
maggloves-already-active = The gloves are already active
|
||||
maggloves-enabled-till = The gloves are enabled for
|
||||
maggloves-cant-strip = Magnetic gloves are strongly attached to the item
|
||||
maggloves-activated = Magnetic gloves activated
|
||||
maggloves-deactivated = Magnetic gloves deactivated
|
||||
@@ -1,4 +1,4 @@
|
||||
chat-manager-changeling-channel-name = УЛЕЙ
|
||||
chat-manager-changeling-channel-name = УЛЕЙ
|
||||
hud-chatbox-select-channel-Changeling = Улей
|
||||
chat-manager-send-changeling-chat-wrap-message = [bold]\[УЛЕЙ\][/bold] [font size=13][italic][bold]{ $player }[/bold] шипит, "{ $message }"[/italic][/font]
|
||||
|
||||
@@ -21,6 +21,7 @@ changeling-popup-cant-sting = Мы не можем ужалить это!
|
||||
changeling-popup-transform-no-dna = У нас нет поглощенного ДНК!
|
||||
changeling-popup-cant-transform-someone = Мы не можем превратит это!
|
||||
changeling-popup-transform-not-effective = Вирус перевоплощения не сработал!
|
||||
changeling-popup-transform-too-far = Цель слишком далеко!
|
||||
|
||||
changeling-popup-already-lesser-form = Мы уже заняли примитивную форму жизни!
|
||||
|
||||
|
||||
19
Resources/Locale/ru-RU/White/magnetic-gloves.ftl
Normal file
19
Resources/Locale/ru-RU/White/magnetic-gloves.ftl
Normal file
@@ -0,0 +1,19 @@
|
||||
ent-ClothingHandsGlovesMagnetic = магнитные перчатки
|
||||
.desc = перчатки оснащенные специальными магнитными захватами, что позволяют вещам оставаться в ваших руках после свободного падения.
|
||||
ent-ClothingHandsGlovesMagneticAdvanced = продвинутые магнитные перчатки
|
||||
.desc = продвинутые магнитные перчатки оснащенные более мощными захватами, что дополнительно предотвращают возможность разоружения и кражи из рук носителя.
|
||||
ent-ActionToggleMagneticGloves = активировать магнитные перчатки
|
||||
.desc = Предотвращает выпадение предметов из рук при падении.
|
||||
ent-ActionToggleMagneticGlovesAdvanced = активировать продвинутые магнитные перчатки
|
||||
.desc = Предотвращает выпадение предметов из рук при падении и предотвращает возможность разоружения и кражи из рук носителя.
|
||||
|
||||
maggloves-ready = Перчатки готовы к использованию
|
||||
maggloves-ready-in = Перчатки будут готовы к использованию через
|
||||
research-technology-lightweight-magnets = Облегчённые магниты
|
||||
research-technology-advanced-grips = Продвинутые захваты
|
||||
maggloves-not-ready = Перчатки не готовы к использованию
|
||||
maggloves-already-active = Перчатки уже активированы
|
||||
maggloves-enabled-till = Перчатки будут активны еще
|
||||
maggloves-cant-strip = Магнитные перчатки надежно удерживают предмет
|
||||
maggloves-activated = Магнитные перчатки включены
|
||||
maggloves-deactivated = Магнитные перчатки выключены
|
||||
@@ -0,0 +1,13 @@
|
||||
## Entity
|
||||
|
||||
patch-component-injecting-user = Вы приклеиваете пластырь.
|
||||
patch-component-inject-other-message = Вы приклеили пластырь к {$other}.
|
||||
patch-component-inject-self-message = Вы наложили на себя пластырь.
|
||||
patch-component-empty-message = Пластырь пуст!
|
||||
patch-component-feel-prick-message = Вы чувствуете небольшое жжение.
|
||||
patch-cant-inject = Вы не моежете прикрепить пластырь к {$target}!
|
||||
patch-cant-inject-now = Вы не можете наложить пластырь сейчас
|
||||
|
||||
## mob-inject doafter messages
|
||||
|
||||
injector-component-injecting-target = {CAPITALIZE(THE($user))} пытается приклеить пластырь на вас!
|
||||
@@ -1,6 +1,6 @@
|
||||
### EscapeMenu.xaml
|
||||
|
||||
ui-escape-title = Esc Меню
|
||||
ui-escape-title = Меню
|
||||
ui-escape-options = Настройки
|
||||
ui-escape-rules = Правила
|
||||
ui-escape-guidebook = Руководство
|
||||
|
||||
@@ -136,6 +136,7 @@ ui-options-function-examine-entity = Изучить
|
||||
ui-options-function-swap-hands = Поменять руки
|
||||
ui-options-function-move-stored-item = Переместить хранящийся объект
|
||||
ui-options-function-rotate-stored-item = Повернуть хранящийся объект
|
||||
ui-options-function-lie-down = Лечь/встать
|
||||
ui-options-static-storage-ui = Закрепить интерфейс хранилища на хотбаре
|
||||
|
||||
ui-options-function-smart-equip-backpack = Умная экипировка в рюкзак
|
||||
|
||||
@@ -61,3 +61,5 @@ petting-failure-medibot = Вы тянетесь погладить { $target },
|
||||
hugging-success-generic = Вы обнимаете { $target }.
|
||||
hugging-success-generic-others = { CAPITALIZE($user) } обнимает { $target }.
|
||||
hugging-success-generic-target = { CAPITALIZE($user) } обнимает вас.
|
||||
|
||||
petting-success-cat-others = { CAPITALIZE($user) } гладит { $target } по { POSS-ADJ($target) } маленькой пушистой голове.
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user