Merge remote-tracking branch 'origin/master' into weapon-modules

# Conflicts:
#	Resources/Prototypes/Recipes/Lathes/security.yml
This commit is contained in:
CaYpeN1
2024-03-21 11:01:20 +05:00
389 changed files with 3471 additions and 1231 deletions

View File

@@ -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)

View File

@@ -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>();

View File

@@ -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>

View File

@@ -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"

View File

@@ -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 -->

View File

@@ -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"

View File

@@ -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>

View File

@@ -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);

View File

@@ -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">

View File

@@ -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>

View File

@@ -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);

View File

@@ -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

View File

@@ -6,7 +6,7 @@
<gfx:StyleBoxFlat
BorderThickness="2"
BorderColor="#464966"
BackgroundColor="#25252A"
BackgroundColor="#050505"
/>
</PanelContainer.PanelOverride>
<BoxContainer

View File

@@ -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>

View File

@@ -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()

View File

@@ -108,7 +108,7 @@
</PanelContainer>
<BoxContainer Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Bottom">
<BoxContainer Name="VersionLabel" Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Bottom">
<PanelContainer StyleClasses="LobbyGayBackground">

View File

@@ -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;
}
}

View 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);
}
}

View File

@@ -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"

View File

@@ -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"

View File

@@ -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;

View File

@@ -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" />

View File

@@ -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'}"

View File

@@ -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>

View File

@@ -45,6 +45,7 @@
<Button Name="ApplyButton"
Text="{Loc 'ui-options-apply'}"
TextAlign="Center"
Margin="8 8"
HorizontalAlignment="Right" />
</controls:StripeBack>
</BoxContainer>

View File

@@ -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);

View File

@@ -59,6 +59,7 @@
<Button Name="ApplyButton"
Text="{Loc 'ui-options-apply'}"
TextAlign="Center"
Margin="8 8"
HorizontalAlignment="Right" />
</controls:StripeBack>
</BoxContainer>

View File

@@ -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'}"

View File

@@ -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";

View File

@@ -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

View File

@@ -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

View File

@@ -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)
{

View File

@@ -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

View File

@@ -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>

View File

@@ -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 =
{

View File

@@ -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>

View File

@@ -42,7 +42,6 @@ namespace Content.Client.Preferences.UI
{
PanelOverride = new StyleBoxFlat
{
BackgroundColor = new Color(25, 25, 25),
ContentMarginTopOverride = 10,
ContentMarginBottomOverride = 10,
ContentMarginLeftOverride = 10,

View File

@@ -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"

View File

@@ -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">

View File

@@ -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"

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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,

View File

@@ -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;

View File

@@ -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"/>

View File

@@ -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);

View File

@@ -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);

View File

@@ -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>

View File

@@ -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>

View File

@@ -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);

View File

@@ -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),
});

View File

@@ -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);

View File

@@ -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>

View File

@@ -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"/>

View File

@@ -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))

View 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);
}
}
}

View File

@@ -22,5 +22,6 @@ public sealed partial class ChemistrySystem : EntitySystem
// Why ChemMaster duplicates reagentdispenser nobody knows.
InitializeHypospray();
InitializeMixing();
InitializePatch();
}
}

View File

@@ -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))

View File

@@ -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();
}
}

View File

@@ -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
}
}

View File

@@ -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
}
}
}

View File

@@ -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);

View File

@@ -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),

View File

@@ -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);

View File

@@ -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>

View File

@@ -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);

View 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);
}
}

View File

@@ -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);
}
}

View File

@@ -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;

View 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);
}

View File

@@ -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";

View File

@@ -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>

View File

@@ -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>

View File

@@ -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
}

View File

@@ -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
{
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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>

View File

@@ -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);
}
}

View 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
{
}

View File

@@ -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";
}

View 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);
}

View 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
{
}

View File

@@ -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
{
}

View 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 {}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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.

View File

@@ -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

View 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

View File

@@ -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 = Мы уже заняли примитивную форму жизни!

View 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 = Магнитные перчатки выключены

View File

@@ -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))} пытается приклеить пластырь на вас!

View File

@@ -1,6 +1,6 @@
### EscapeMenu.xaml
ui-escape-title = Esc Меню
ui-escape-title = Меню
ui-escape-options = Настройки
ui-escape-rules = Правила
ui-escape-guidebook = Руководство

View File

@@ -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 = Умная экипировка в рюкзак

View File

@@ -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