Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/master' into upstream-sync
Browse files Browse the repository at this point in the history
# Conflicts:
#	.github/CODEOWNERS
#	Resources/Prototypes/Catalog/Fills/Lockers/heads.yml
#	Resources/Prototypes/Maps/core.yml
#	Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml
#	Resources/Prototypes/Roles/Jobs/Civilian/assistant.yml
#	Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml
#	Resources/Prototypes/Roles/Jobs/Civilian/musician.yml
#	Resources/Prototypes/Roles/Jobs/Command/centcom_official.yml
#	Resources/Textures/Clothing/Hands/Gloves/captain.rsi/equipped-HAND.png
#	Resources/Textures/Clothing/Hands/Gloves/captain.rsi/icon.png
#	Resources/Textures/Clothing/Hands/Gloves/captain.rsi/meta.json
#	Resources/Textures/Clothing/Head/Hats/capcap.rsi/equipped-HELMET.png
#	Resources/Textures/Clothing/Head/Hats/capcap.rsi/icon.png
#	Resources/Textures/Clothing/Head/Hats/capcap.rsi/meta.json
#	Resources/Textures/Clothing/Head/Hats/captain.rsi/equipped-HELMET.png
#	Resources/Textures/Clothing/Head/Hats/captain.rsi/icon.png
#	Resources/Textures/Clothing/Head/Hats/captain.rsi/meta.json
#	Resources/Textures/Clothing/Neck/Cloaks/cap.rsi/equipped-NECK.png
#	Resources/Textures/Clothing/Neck/Cloaks/cap.rsi/icon.png
#	Resources/Textures/Clothing/Neck/Cloaks/cap.rsi/inhand-left.png
#	Resources/Textures/Clothing/Neck/Cloaks/cap.rsi/inhand-right.png
#	Resources/Textures/Clothing/Neck/Cloaks/cap.rsi/meta.json
#	Resources/Textures/Clothing/Neck/Cloaks/capcloakformal.rsi/equipped-NECK.png
#	Resources/Textures/Clothing/Neck/Cloaks/capcloakformal.rsi/icon.png
#	Resources/Textures/Clothing/Neck/Cloaks/capcloakformal.rsi/meta.json
#	Resources/Textures/Clothing/Neck/mantles/capmantle.rsi/equipped-NECK.png
#	Resources/Textures/Clothing/Neck/mantles/capmantle.rsi/icon.png
#	Resources/Textures/Clothing/Neck/mantles/capmantle.rsi/meta.json
#	Resources/Textures/Clothing/OuterClothing/Armor/captain_carapace.rsi/equipped-OUTERCLOTHING.png
#	Resources/Textures/Clothing/OuterClothing/Armor/captain_carapace.rsi/icon.png
#	Resources/Textures/Clothing/OuterClothing/Armor/captain_carapace.rsi/meta.json
#	Resources/Textures/Clothing/OuterClothing/WinterCoats/coatcap.rsi/equipped-OUTERCLOTHING.png
#	Resources/Textures/Clothing/OuterClothing/WinterCoats/coatcap.rsi/icon.png
#	Resources/Textures/Clothing/OuterClothing/WinterCoats/coatcap.rsi/meta.json
#	Resources/Textures/Clothing/Uniforms/Jumpskirt/captain.rsi/equipped-INNERCLOTHING.png
#	Resources/Textures/Clothing/Uniforms/Jumpskirt/captain.rsi/icon.png
#	Resources/Textures/Clothing/Uniforms/Jumpsuit/captain.rsi/equipped-INNERCLOTHING.png
#	Resources/Textures/Clothing/Uniforms/Jumpsuit/captain.rsi/icon.png
#	Resources/Textures/Decals/bricktile.rsi/dark_box.png
#	Resources/Textures/Decals/bricktile.rsi/dark_corner_ne.png
#	Resources/Textures/Decals/bricktile.rsi/dark_corner_nw.png
#	Resources/Textures/Decals/bricktile.rsi/dark_corner_se.png
#	Resources/Textures/Decals/bricktile.rsi/dark_corner_sw.png
#	Resources/Textures/Decals/bricktile.rsi/dark_end_e.png
#	Resources/Textures/Decals/bricktile.rsi/dark_end_n.png
#	Resources/Textures/Decals/bricktile.rsi/dark_end_s.png
#	Resources/Textures/Decals/bricktile.rsi/dark_end_w.png
#	Resources/Textures/Decals/bricktile.rsi/dark_inner_ne.png
#	Resources/Textures/Decals/bricktile.rsi/dark_inner_nw.png
#	Resources/Textures/Decals/bricktile.rsi/dark_inner_se.png
#	Resources/Textures/Decals/bricktile.rsi/dark_inner_sw.png
#	Resources/Textures/Decals/bricktile.rsi/dark_line_e.png
#	Resources/Textures/Decals/bricktile.rsi/dark_line_n.png
#	Resources/Textures/Decals/bricktile.rsi/dark_line_s.png
#	Resources/Textures/Decals/bricktile.rsi/dark_line_w.png
#	Resources/Textures/Decals/bricktile.rsi/meta.json
#	Resources/Textures/Decals/bricktile.rsi/steel_box.png
#	Resources/Textures/Decals/bricktile.rsi/steel_corner_ne.png
#	Resources/Textures/Decals/bricktile.rsi/steel_corner_nw.png
#	Resources/Textures/Decals/bricktile.rsi/steel_corner_se.png
#	Resources/Textures/Decals/bricktile.rsi/steel_corner_sw.png
#	Resources/Textures/Decals/bricktile.rsi/steel_end_e.png
#	Resources/Textures/Decals/bricktile.rsi/steel_end_n.png
#	Resources/Textures/Decals/bricktile.rsi/steel_end_s.png
#	Resources/Textures/Decals/bricktile.rsi/steel_end_w.png
#	Resources/Textures/Decals/bricktile.rsi/steel_inner_ne.png
#	Resources/Textures/Decals/bricktile.rsi/steel_inner_nw.png
#	Resources/Textures/Decals/bricktile.rsi/steel_inner_se.png
#	Resources/Textures/Decals/bricktile.rsi/steel_inner_sw.png
#	Resources/Textures/Decals/bricktile.rsi/steel_line_e.png
#	Resources/Textures/Decals/bricktile.rsi/steel_line_n.png
#	Resources/Textures/Decals/bricktile.rsi/steel_line_w.png
#	Resources/Textures/Decals/bricktile.rsi/white_box.png
#	Resources/Textures/Decals/bricktile.rsi/white_corner_ne.png
#	Resources/Textures/Decals/bricktile.rsi/white_corner_nw.png
#	Resources/Textures/Decals/bricktile.rsi/white_corner_se.png
#	Resources/Textures/Decals/bricktile.rsi/white_corner_sw.png
#	Resources/Textures/Decals/bricktile.rsi/white_end_e.png
#	Resources/Textures/Decals/bricktile.rsi/white_end_n.png
#	Resources/Textures/Decals/bricktile.rsi/white_end_s.png
#	Resources/Textures/Decals/bricktile.rsi/white_end_w.png
#	Resources/Textures/Decals/bricktile.rsi/white_inner_ne.png
#	Resources/Textures/Decals/bricktile.rsi/white_inner_nw.png
#	Resources/Textures/Decals/bricktile.rsi/white_inner_se.png
#	Resources/Textures/Decals/bricktile.rsi/white_inner_sw.png
#	Resources/Textures/Decals/bricktile.rsi/white_line_e.png
#	Resources/Textures/Decals/bricktile.rsi/white_line_n.png
#	Resources/Textures/Decals/bricktile.rsi/white_line_s.png
#	Resources/Textures/Decals/bricktile.rsi/white_line_w.png
#	Resources/Textures/Decals/minitile.rsi/dark_box.png
#	Resources/Textures/Decals/minitile.rsi/dark_corner_ne.png
#	Resources/Textures/Decals/minitile.rsi/dark_corner_nw.png
#	Resources/Textures/Decals/minitile.rsi/dark_corner_se.png
#	Resources/Textures/Decals/minitile.rsi/dark_corner_sw.png
#	Resources/Textures/Decals/minitile.rsi/dark_end_e.png
#	Resources/Textures/Decals/minitile.rsi/dark_end_n.png
#	Resources/Textures/Decals/minitile.rsi/dark_end_s.png
#	Resources/Textures/Decals/minitile.rsi/dark_end_w.png
#	Resources/Textures/Decals/minitile.rsi/dark_inner_ne.png
#	Resources/Textures/Decals/minitile.rsi/dark_inner_nw.png
#	Resources/Textures/Decals/minitile.rsi/dark_inner_se.png
#	Resources/Textures/Decals/minitile.rsi/dark_inner_sw.png
#	Resources/Textures/Decals/minitile.rsi/dark_line_e.png
#	Resources/Textures/Decals/minitile.rsi/dark_line_n.png
#	Resources/Textures/Decals/minitile.rsi/dark_line_s.png
#	Resources/Textures/Decals/minitile.rsi/dark_line_w.png
#	Resources/Textures/Decals/minitile.rsi/meta.json
#	Resources/Textures/Decals/minitile.rsi/steel_corner_ne.png
#	Resources/Textures/Decals/minitile.rsi/steel_corner_nw.png
#	Resources/Textures/Decals/minitile.rsi/steel_corner_se.png
#	Resources/Textures/Decals/minitile.rsi/steel_corner_sw.png
#	Resources/Textures/Decals/minitile.rsi/steel_end_e.png
#	Resources/Textures/Decals/minitile.rsi/steel_end_n.png
#	Resources/Textures/Decals/minitile.rsi/steel_end_s.png
#	Resources/Textures/Decals/minitile.rsi/steel_end_w.png
#	Resources/Textures/Decals/minitile.rsi/steel_inner_ne.png
#	Resources/Textures/Decals/minitile.rsi/steel_inner_nw.png
#	Resources/Textures/Decals/minitile.rsi/steel_inner_se.png
#	Resources/Textures/Decals/minitile.rsi/steel_inner_sw.png
#	Resources/Textures/Decals/minitile.rsi/steel_line_e.png
#	Resources/Textures/Decals/minitile.rsi/steel_line_n.png
#	Resources/Textures/Decals/minitile.rsi/steel_line_s.png
#	Resources/Textures/Decals/minitile.rsi/steel_line_w.png
#	Resources/Textures/Decals/minitile.rsi/white_box.png
#	Resources/Textures/Decals/minitile.rsi/white_corner_ne.png
#	Resources/Textures/Decals/minitile.rsi/white_corner_nw.png
#	Resources/Textures/Decals/minitile.rsi/white_corner_se.png
#	Resources/Textures/Decals/minitile.rsi/white_corner_sw.png
#	Resources/Textures/Decals/minitile.rsi/white_end_e.png
#	Resources/Textures/Decals/minitile.rsi/white_end_n.png
#	Resources/Textures/Decals/minitile.rsi/white_end_s.png
#	Resources/Textures/Decals/minitile.rsi/white_end_w.png
#	Resources/Textures/Decals/minitile.rsi/white_inner_ne.png
#	Resources/Textures/Decals/minitile.rsi/white_inner_nw.png
#	Resources/Textures/Decals/minitile.rsi/white_inner_se.png
#	Resources/Textures/Decals/minitile.rsi/white_inner_sw.png
#	Resources/Textures/Decals/minitile.rsi/white_line_w.png
#	Resources/Textures/Tiles/attributions.yml
#	Resources/Textures/Tiles/bar.png
#	Resources/Textures/Tiles/clown.png
#	Resources/Textures/Tiles/dark.png
#	Resources/Textures/Tiles/dark_diagonal.png
#	Resources/Textures/Tiles/dark_diagonal_mini.png
#	Resources/Textures/Tiles/dark_herringbone.png
#	Resources/Textures/Tiles/dark_mini.png
#	Resources/Textures/Tiles/dark_mono.png
#	Resources/Textures/Tiles/dark_offset.png
#	Resources/Textures/Tiles/dark_pavement.png
#	Resources/Textures/Tiles/dark_pavement_vertical.png
#	Resources/Textures/Tiles/hydro.png
#	Resources/Textures/Tiles/kitchen.png
#	Resources/Textures/Tiles/laundry.png
#	Resources/Textures/Tiles/steel.png
#	Resources/Textures/Tiles/steel_diagonal.png
#	Resources/Textures/Tiles/steel_diagonal_mini.png
#	Resources/Textures/Tiles/steel_herringbone.png
#	Resources/Textures/Tiles/steel_mini.png
#	Resources/Textures/Tiles/steel_mono.png
#	Resources/Textures/Tiles/steel_offset.png
#	Resources/Textures/Tiles/steel_pavement.png
#	Resources/Textures/Tiles/steel_pavement_vertical.png
#	Resources/Textures/Tiles/white.png
#	Resources/Textures/Tiles/white_diagonal.png
#	Resources/Textures/Tiles/white_diagonal_mini.png
#	Resources/Textures/Tiles/white_herringbone.png
#	Resources/Textures/Tiles/white_mini.png
#	Resources/Textures/Tiles/white_mono.png
#	Resources/Textures/Tiles/white_offset.png
#	Resources/Textures/Tiles/white_pavement.png
#	Resources/Textures/Tiles/white_pavement_vertical.png
  • Loading branch information
Morb0 committed Aug 2, 2023
2 parents a61f0ea + 26dd6f2 commit 0cffa43
Show file tree
Hide file tree
Showing 553 changed files with 32,315 additions and 21,740 deletions.
9 changes: 8 additions & 1 deletion Content.Client/Access/UI/AgentIDCardBoundUserInterface.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ protected override void Open()
{
base.Open();

_window = new AgentIDCardWindow();
_window?.Dispose();
_window = new AgentIDCardWindow(this);
if (State != null)
UpdateState(State);

Expand All @@ -39,6 +40,11 @@ private void OnJobChanged(string newJob)
SendMessage(new AgentIDCardJobChangedMessage(newJob));
}

public void OnJobIconChanged(string newJobIcon)
{
SendMessage(new AgentIDCardJobIconChangedMessage(newJobIcon));
}

/// <summary>
/// Update the UI state based on server-sent info
/// </summary>
Expand All @@ -51,6 +57,7 @@ protected override void UpdateState(BoundUserInterfaceState state)

_window.SetCurrentName(cast.CurrentName);
_window.SetCurrentJob(cast.CurrentJob);
_window.SetAllowedIcons(cast.Icons);
}

protected override void Dispose(bool disposing)
Expand Down
7 changes: 7 additions & 0 deletions Content.Client/Access/UI/AgentIDCardWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,12 @@
<LineEdit Name="NameLineEdit" />
<Label Name="CurrentJob" Text="{Loc 'agent-id-card-current-job'}" />
<LineEdit Name="JobLineEdit" />
<BoxContainer Orientation="Horizontal">
<Label Text="{Loc 'agent-id-card-job-icon-label'}"/>
<Control HorizontalExpand="True" MinSize="50 0"/>
<GridContainer Name="IconGrid" Columns="10">
<!-- Job icon buttons are generated in the code -->
</GridContainer>
</BoxContainer>
</BoxContainer>
</DefaultWindow>
66 changes: 64 additions & 2 deletions Content.Client/Access/UI/AgentIDCardWindow.xaml.cs
Original file line number Diff line number Diff line change
@@ -1,18 +1,35 @@
using Robust.Client.UserInterface.CustomControls;
using Content.Client.Stylesheets;
using Content.Shared.StatusIcon;
using Robust.Client.AutoGenerated;
using Robust.Client.GameObjects;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Prototypes;
using System.Numerics;

namespace Content.Client.Access.UI
{
[GenerateTypedNameReferences]
public sealed partial class AgentIDCardWindow : DefaultWindow
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly IEntitySystemManager _entitySystem = default!;
private readonly SpriteSystem _spriteSystem;
private readonly AgentIDCardBoundUserInterface _bui;

private const int JobIconColumnCount = 10;

public event Action<string>? OnNameChanged;
public event Action<string>? OnJobChanged;

public AgentIDCardWindow()
public AgentIDCardWindow(AgentIDCardBoundUserInterface bui)
{
RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
_spriteSystem = _entitySystem.GetEntitySystem<SpriteSystem>();
_bui = bui;

NameLineEdit.OnTextEntered += e => OnNameChanged?.Invoke(e.Text);
NameLineEdit.OnFocusExit += e => OnNameChanged?.Invoke(e.Text);
Expand All @@ -21,6 +38,51 @@ public AgentIDCardWindow()
JobLineEdit.OnFocusExit += e => OnJobChanged?.Invoke(e.Text);
}

public void SetAllowedIcons(HashSet<string> icons)
{
IconGrid.DisposeAllChildren();

var jobIconGroup = new ButtonGroup();
var i = 0;
foreach (var jobIconId in icons)
{
if (!_prototypeManager.TryIndex<StatusIconPrototype>(jobIconId, out var jobIcon))
{
continue;
}

String styleBase = StyleBase.ButtonOpenBoth;
var modulo = i % JobIconColumnCount;
if (modulo == 0)
styleBase = StyleBase.ButtonOpenRight;
else if (modulo == JobIconColumnCount - 1)
styleBase = StyleBase.ButtonOpenLeft;

// Generate buttons
var jobIconButton = new Button
{
Access = AccessLevel.Public,
StyleClasses = { styleBase },
MaxSize = new Vector2(42, 28),
Group = jobIconGroup,
Pressed = i == 0,
};

// Generate buttons textures
TextureRect jobIconTexture = new TextureRect
{
Texture = _spriteSystem.Frame0(jobIcon.Icon),
TextureScale = new Vector2(2.5f, 2.5f),
Stretch = TextureRect.StretchMode.KeepCentered,
};

jobIconButton.AddChild(jobIconTexture);
jobIconButton.OnPressed += _ => _bui.OnJobIconChanged(jobIcon.ID);
IconGrid.AddChild(jobIconButton);
i++;
}
}

public void SetCurrentName(string name)
{
NameLineEdit.Text = name;
Expand Down
2 changes: 1 addition & 1 deletion Content.Client/Administration/UI/BanPanel/BanPanel.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
<LineEdit Name="PlayerNameLine" MinWidth="100" HorizontalExpand="True" PlaceHolder="{Loc ban-panel-player}" />
</BoxContainer>
<BoxContainer Orientation="Horizontal" Margin="2">
<CheckBox Name="IpCheckbox" MinWidth="100" Text="{Loc ban-panel-ip}" Pressed="False" />
<CheckBox Name="IpCheckbox" MinWidth="100" Text="{Loc ban-panel-ip}" Pressed="True" />
<Control MinWidth="50" />
<LineEdit Name="IpLine" MinWidth="100" HorizontalExpand="True" PlaceHolder="{Loc ban-panel-ip}" ToolTip="{Loc ban-panel-ip-hwid-tooltip}" Editable="False" />
</BoxContainer>
Expand Down
5 changes: 2 additions & 3 deletions Content.Client/Chemistry/UI/ChemMasterWindow.xaml.cs
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
using System.Linq;
using System.Numerics;
using Content.Client.Stylesheets;
using Content.Client.UserInterface.Controls;
using Content.Shared.Chemistry;
using Content.Shared.Chemistry.Reagent;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
using Robust.Client.Utility;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
using System.Linq;
using System.Numerics;
using static Robust.Client.UserInterface.Controls.BoxContainer;

namespace Content.Client.Chemistry.UI
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -404,7 +404,7 @@ private void SystemFlipConstructionPrototype(object? sender, EventArgs eventArgs
return;
}

if (_selected == null || _selected.Mirror == String.Empty)
if (_selected == null || _selected.Mirror == null)
{
return;
}
Expand Down
28 changes: 12 additions & 16 deletions Content.Client/CrewManifest/CrewManifestUi.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
using Content.Shared.CCVar;
using Content.Shared.CrewManifest;
using Content.Shared.Roles;
using Content.Shared.StatusIcon;
using Robust.Client.AutoGenerated;
using Robust.Client.GameObjects;
using Robust.Client.ResourceManagement;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
Expand Down Expand Up @@ -100,8 +102,15 @@ public void Populate(string name, CrewManifestEntries? entries)

private sealed class CrewManifestSection : BoxContainer
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly IEntitySystemManager _entitySystem = default!;
private readonly SpriteSystem _spriteSystem = default!;

public CrewManifestSection(string sectionTitle, List<CrewManifestEntry> entries, IResourceCache cache, CrewManifestSystem crewManifestSystem)
{
IoCManager.InjectDependencies(this);
_spriteSystem = _entitySystem.GetEntitySystem<SpriteSystem>();

Orientation = LayoutOrientation.Vertical;
HorizontalExpand = true;

Expand All @@ -122,9 +131,6 @@ public CrewManifestSection(string sectionTitle, List<CrewManifestEntry> entries,

AddChild(gridContainer);

var path = new ResPath("/Textures/Interface/Misc/job_icons.rsi");
cache.TryGetResource(path, out RSIResource? rsi);

foreach (var entry in entries)
{
var name = new RichTextLabel()
Expand All @@ -143,25 +149,15 @@ public CrewManifestSection(string sectionTitle, List<CrewManifestEntry> entries,
title.SetMessage(entry.JobTitle);


if (rsi != null)
if (_prototypeManager.TryIndex<StatusIconPrototype>(entry.JobIcon, out var jobIcon))
{
var icon = new TextureRect()
{
TextureScale = new Vector2(2, 2),
Stretch = TextureRect.StretchMode.KeepCentered
Stretch = TextureRect.StretchMode.KeepCentered,
Texture = _spriteSystem.Frame0(jobIcon.Icon),
};

if (rsi.RSI.TryGetState(entry.JobIcon, out _))
{
var specifier = new SpriteSpecifier.Rsi(path, entry.JobIcon);
icon.Texture = specifier.Frame0();
}
else if (rsi.RSI.TryGetState("Unknown", out _))
{
var specifier = new SpriteSpecifier.Rsi(path, "Unknown");
icon.Texture = specifier.Frame0();
}

titleContainer.AddChild(icon);
titleContainer.AddChild(title);
}
Expand Down
2 changes: 1 addition & 1 deletion Content.Client/Decals/DecalPlacementSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ public void SetActive(bool active)

public sealed class PlaceDecalActionEvent : WorldTargetActionEvent
{
[DataField("decalId", customTypeSerializer:typeof(PrototypeIdSerializer<DecalPrototype>))]
[DataField("decalId", customTypeSerializer:typeof(PrototypeIdSerializer<DecalPrototype>), required:true)]
public string DecalId = string.Empty;

[DataField("color")]
Expand Down
107 changes: 107 additions & 0 deletions Content.Client/Effects/ColorFlashEffectSystem.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
using Content.Shared.Effects;
using Robust.Client.Animations;
using Robust.Client.GameObjects;
using Robust.Shared.Animations;

namespace Content.Client.Effects;

public sealed class ColorFlashEffectSystem : EntitySystem
{
[Dependency] private readonly AnimationPlayerSystem _animation = default!;

/// <summary>
/// It's a little on the long side but given we use multiple colours denoting what happened it makes it easier to register.
/// </summary>
private const float AnimationLength = 0.30f;
private const string AnimationKey = "color-flash-effect";

public override void Initialize()
{
base.Initialize();

SubscribeAllEvent<ColorFlashEffectEvent>(OnColorFlashEffect);
SubscribeLocalEvent<ColorFlashEffectComponent, AnimationCompletedEvent>(OnEffectAnimationCompleted);
}

private void OnEffectAnimationCompleted(EntityUid uid, ColorFlashEffectComponent component, AnimationCompletedEvent args)
{
if (args.Key != AnimationKey)
return;

if (TryComp<SpriteComponent>(uid, out var sprite))
{
sprite.Color = component.Color;
}

RemCompDeferred<ColorFlashEffectComponent>(uid);
}

private Animation? GetDamageAnimation(EntityUid uid, Color color, SpriteComponent? sprite = null)
{
if (!Resolve(uid, ref sprite, false))
return null;

// 90% of them are going to be this so why allocate a new class.
return new Animation
{
Length = TimeSpan.FromSeconds(AnimationLength),
AnimationTracks =
{
new AnimationTrackComponentProperty
{
ComponentType = typeof(SpriteComponent),
Property = nameof(SpriteComponent.Color),
InterpolationMode = AnimationInterpolationMode.Linear,
KeyFrames =
{
new AnimationTrackProperty.KeyFrame(color, 0f),
new AnimationTrackProperty.KeyFrame(sprite.Color, AnimationLength)
}
}
}
};
}

private void OnColorFlashEffect(ColorFlashEffectEvent ev)
{
var color = ev.Color;

foreach (var ent in ev.Entities)
{
if (Deleted(ent))
{
continue;
}

var player = EnsureComp<AnimationPlayerComponent>(ent);
player.NetSyncEnabled = false;

// Need to stop the existing animation first to ensure the sprite color is fixed.
// Otherwise we might lerp to a red colour instead.
if (_animation.HasRunningAnimation(ent, player, AnimationKey))
{
_animation.Stop(ent, player, AnimationKey);
}

if (!TryComp<SpriteComponent>(ent, out var sprite))
{
continue;
}

if (TryComp<ColorFlashEffectComponent>(ent, out var effect))
{
sprite.Color = effect.Color;
}

var animation = GetDamageAnimation(ent, color, sprite);

if (animation == null)
continue;

var comp = EnsureComp<ColorFlashEffectComponent>(ent);
comp.NetSyncEnabled = false;
comp.Color = sprite.Color;
_animation.Play(player, animation, AnimationKey);
}
}
}
12 changes: 5 additions & 7 deletions Content.Client/Flash/FlashOverlay.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public sealed class FlashOverlay : Overlay
[Dependency] private readonly IEntityManager _entityManager = default!;
[Dependency] private readonly IPlayerManager _playerManager = default!;

public override OverlaySpace Space => OverlaySpace.ScreenSpace;
public override OverlaySpace Space => OverlaySpace.WorldSpace;
private readonly ShaderInstance _shader;
private double _startTime = -1;
private double _lastsFor = 1;
Expand Down Expand Up @@ -61,18 +61,16 @@ protected override void Draw(in OverlayDrawArgs args)
if (percentComplete >= 1.0f)
return;

var screenSpaceHandle = args.ScreenHandle;
screenSpaceHandle.UseShader(_shader);
var worldHandle = args.WorldHandle;
worldHandle.UseShader(_shader);
_shader.SetParameter("percentComplete", percentComplete);

var screenSize = UIBox2.FromDimensions(new Vector2(0, 0), _displayManager.ScreenSize);

if (_screenshotTexture != null)
{
screenSpaceHandle.DrawTextureRect(_screenshotTexture, screenSize);
worldHandle.DrawTextureRectRegion(_screenshotTexture, args.WorldBounds);
}

screenSpaceHandle.UseShader(null);
worldHandle.UseShader(null);
}

protected override void DisposeBehavior()
Expand Down
Loading

0 comments on commit 0cffa43

Please sign in to comment.