Skip to content
Merged
Show file tree
Hide file tree
Changes from 90 commits
Commits
Show all changes
104 commits
Select commit Hold shift + click to select a range
9ea12ca
Start Port WizDen Trigger Refactor #39034
NotLivyathan Mar 30, 2026
7f94a7b
Start Port WizDen Parroting Parrots Part 1 #38243
NotLivyathan Mar 30, 2026
247d0cd
Port WizDen Animal Spawner Reorganization + Xeno Spawners #36962
NotLivyathan Mar 30, 2026
10103c2
Finish Port WizDen Parroting Parrots Part 1 #38243 & PR #38984
NotLivyathan Mar 30, 2026
258fd22
Port WizDen Shared ParrotMemory PR #39341
NotLivyathan Mar 30, 2026
48c0e14
Continue Port WizDen Trigger Refactor #39034
NotLivyathan Mar 30, 2026
cea570d
Port WizDen Land Mine Armament #33883
NotLivyathan Mar 30, 2026
57f682e
Continue Port WizDen Trigger Refactor #39034 (Again)
NotLivyathan Mar 30, 2026
e04aa6d
Continue Port WizDen Trigger Refactor #39034 (Still)
NotLivyathan Apr 1, 2026
9e6c100
Port WizDen 3MO Xeno Archeology (First Phase) #33370
NotLivyathan Apr 1, 2026
a5e5d87
Finish Port WizDen Trigger Refactor #39034
NotLivyathan Apr 2, 2026
fd5b0c3
Port WizDen Turn Some Implants Into Triggers #39364
NotLivyathan Apr 2, 2026
e23a202
Port WizDen Predict InjectSystem
NotLivyathan Apr 2, 2026
65a63ba
Port WizDen PR #30600 & #38749
NotLivyathan Apr 2, 2026
ee16382
Port WizDen PR #38871 & #39752
NotLivyathan Apr 2, 2026
3dfd2cc
Port WizDen Merge Injector & Hypospray Systems & Components #41833
NotLivyathan Apr 2, 2026
b2ae0bb
commit missed files
NotLivyathan Apr 2, 2026
5d800ae
Port WizDen Add Jet Injectors #40076 & PR #41932
NotLivyathan Apr 2, 2026
930a896
Merge remote-tracking branch 'upstream/master' into Port-WizDen-Trigg…
NotLivyathan Apr 2, 2026
6354cc1
Port WizDen Move Entity Effects Definitions to Shared #35614
NotLivyathan Apr 2, 2026
b7aa5fc
Port WizDen Pepper Makes You Cough #36358
NotLivyathan Apr 2, 2026
9e7407b
Port WizDen PR #38164
NotLivyathan Apr 2, 2026
c1c8723
Port WizDen Predict Healing & Bloodstream #38690
NotLivyathan Apr 2, 2026
d0ba88e
Port WizDen PopupOnTrigger #39913
NotLivyathan Apr 2, 2026
8c47a49
commit skipped foodcomponent migration
NotLivyathan Apr 2, 2026
40c090f
Port WizDen PR #39362
NotLivyathan Apr 2, 2026
c6a0108
Start Port WizDen Debody Food & Systems #39031
NotLivyathan Apr 2, 2026
5617cbb
Finish Port WizDen Debody Food & Drink Systems #39031
NotLivyathan Apr 3, 2026
190b22a
Port WizDen Delete FoodComponent PR #41070
NotLivyathan Apr 3, 2026
d59b47d
Port WizDen Fix Burgers #39773
NotLivyathan Apr 3, 2026
15dff5c
Port WizDen Fix Puncturase Cauterizing Bleeding #38289
NotLivyathan Apr 3, 2026
320b123
Port WizDen StaminaSystem to SharedStaminaSystem #37199
NotLivyathan Apr 3, 2026
a04f282
Port WizDen PR #36336 & Stun & Stamina Visuals #37196
NotLivyathan Apr 3, 2026
8fe8a3e
Start Port WizDen Crawling Part 1: The Knockdownening #36881
NotLivyathan Apr 3, 2026
39f57ed
Start Port WizDen HandsSystem Refactor #38438 + Several Prerequisite PR
NotLivyathan Apr 3, 2026
a807777
Continue Port WizDen HandsSystem Refactor #38438
NotLivyathan Apr 4, 2026
2e40836
Finish Port WizDen HandsSystem Refactor #38438 + Several More Prerequ…
NotLivyathan Apr 4, 2026
0ee15c9
Port WizDen Fix #38576, #38578, & #38605
NotLivyathan Apr 4, 2026
86463ea
Continue Port WizDen Crawling Part 1: The Knockdownening #36881 + Fix…
NotLivyathan Apr 5, 2026
9eb43df
Port WizDen SSD Sleep Take 2 #34049 & New Status Effect System #37238
NotLivyathan Apr 5, 2026
7a0c0f9
Port WizDen New Status Effects System: Relay Events #38579
NotLivyathan Apr 5, 2026
1d8d17d
Finish Port WizDen Crawling Part 1: The Knockdownening #36881
NotLivyathan Apr 5, 2026
45ddeb1
Port WizDen Refactor SeeingRainbows to New Status Effect System #38620
NotLivyathan Apr 5, 2026
1300e4e
Port WizDen PR #38617, #38660, & #38915
NotLivyathan Apr 6, 2026
908c473
fix incompatibilities pass 1
NotLivyathan Apr 6, 2026
3d5c6c9
Port WizDen Better Godmode #37020
NotLivyathan Apr 6, 2026
3131662
Port WizDen Catchable Items, Playable Basketball #37702 & Start Port …
NotLivyathan Apr 6, 2026
470a3fc
Port WizDen Predict Identity #40185
NotLivyathan Apr 6, 2026
dd346c4
Port WizDen PR #36803 & Move Some Station Methods Into Shared #38976
NotLivyathan Apr 6, 2026
4ed6582
fix incompatibilities pass 2
NotLivyathan Apr 6, 2026
ea589b4
fix incompatibilities pass 3
NotLivyathan Apr 6, 2026
ad0f178
Merge remote-tracking branch 'upstream/master' into Port-WizDen-Trigg…
NotLivyathan Apr 6, 2026
b96083a
quick fix to make it playable
NotLivyathan Apr 6, 2026
2e66d03
Port WizDen Reverse Hand Swapping PR #37588
NotLivyathan Apr 6, 2026
76819fb
Port WizDen Borg Hands & Hand Whitelisting #38668
NotLivyathan Apr 7, 2026
b51ff08
fix remaining borg hands incompatibilities & various tweaks
NotLivyathan Apr 7, 2026
7282bdd
Port WizDen No Take; Only Throw #40143
NotLivyathan Apr 7, 2026
8d98296
Port WizDen Mob Collision Tweaks #36296
NotLivyathan Apr 7, 2026
55708bf
Port WizDen Vestine Changes PR #41693 & #41716
NotLivyathan Apr 7, 2026
c4a5e50
Port WizDen Drunkenness, Stuttering, Slurring, & Bloodloss Status Sys…
NotLivyathan Apr 7, 2026
b251984
Port WizDen Sloth Accent PR #38142 & Accent Events to Shared #38948
NotLivyathan Apr 7, 2026
76fdfeb
fix accent incompatibilities
NotLivyathan Apr 7, 2026
3dbcb84
Port WizDen Rejuvenateable Status Effects PR #39025
NotLivyathan Apr 7, 2026
f07a91d
Start Port WizDen Stunnable New Status & Cleanup #38618
NotLivyathan Apr 7, 2026
3ff02e5
Port WizDen Predict Flashes #37640
NotLivyathan Apr 7, 2026
8448849
Finish Port Stunnable New Status & Cleanup #38618
NotLivyathan Apr 7, 2026
5f0e416
fix incompatibilities pass 4
NotLivyathan Apr 8, 2026
80c1f47
Port WizDen Traits Status Effect Support & PainNumbness Status Effect…
NotLivyathan Apr 8, 2026
42cbdb2
fix to make it playable round 2
NotLivyathan Apr 8, 2026
2703c39
Port WizDen Curl Quotes PR #43350 & #43483
NotLivyathan Apr 8, 2026
cc4fa1d
Port WizDen Make Cameras React to the AI Eye Nearby #43466
NotLivyathan Apr 8, 2026
096fb69
Port WizDen PR #43392, #43400, & #43411
NotLivyathan Apr 8, 2026
4d9a344
Port WizDen Minigun Inhands PR #35344
NotLivyathan Apr 8, 2026
37ca07e
fix/tweak a handful of things
NotLivyathan Apr 8, 2026
44a517d
fix cameras/holopads providing ai vision without power
NotLivyathan Apr 8, 2026
dfff66b
Port WizDen Cyborg Rebalance #34186 & Janiborg Module Cleanup #42330
NotLivyathan Apr 8, 2026
fe63ba8
Port WizDen Janitor Tool: Wire Brush #38667
NotLivyathan Apr 8, 2026
73d0a17
Port WizDen Add Doafter to Filling the Hypopen #40538
NotLivyathan Apr 8, 2026
07a684a
Port WizDen Fix PR #39436, #39437, #39933, & #40312
NotLivyathan Apr 8, 2026
684f381
fix linter fails pass 1
NotLivyathan Apr 8, 2026
34e3e21
Merge remote-tracking branch 'upstream/master' into THE-OMEGA-PR
NotLivyathan Apr 8, 2026
715c03d
Merge remote-tracking branch 'upstream/master' into THE-OMEGA-PR
NotLivyathan Apr 9, 2026
517f610
Port WizDen Jet Injector Tweaks & Cleanup #42158
NotLivyathan Apr 9, 2026
ab852f0
fix linter fails pass 2
NotLivyathan Apr 9, 2026
4545d93
fix linter fails pass 3
NotLivyathan Apr 9, 2026
f167727
final linter fail fixes
NotLivyathan Apr 9, 2026
f70ce1a
fuck
NotLivyathan Apr 9, 2026
22e12c5
Merge branch 'master' into Port-WizDen-Trigger-Refactor-&-Jet-Injectors
fenndragon Apr 9, 2026
3b40b1d
Apply suggestion from @fenndragon
fenndragon Apr 9, 2026
6cfb6c7
Apply suggestion from @fenndragon
fenndragon Apr 9, 2026
c17c2b4
Apply suggestion from @fenndragon
fenndragon Apr 9, 2026
e128d64
Merge remote-tracking branch 'upstream/master' into THE-OMEGA-PR
NotLivyathan Apr 10, 2026
e5e4a1f
fix linter fail that I did and didn't cause
NotLivyathan Apr 10, 2026
ffc1238
oops, all food
NotLivyathan Apr 10, 2026
399a938
port various WizDen post hands refactor fixes
NotLivyathan Apr 11, 2026
c15e186
Port WizDen Simplify Hands UI Code #42534
NotLivyathan Apr 11, 2026
fc8ae9a
Port WizDen PR #39084, #39085 #39089, #39109, & #39120
NotLivyathan Apr 11, 2026
0242547
fix to make it playable again
NotLivyathan Apr 11, 2026
480b84f
Merge branch 'master' into Port-WizDen-Trigger-Refactor-&-Jet-Injectors
fenndragon Apr 13, 2026
971dfef
Merge remote-tracking branch 'upstream/master' into THE-OMEGA-PR
NotLivyathan Apr 13, 2026
9b72586
Merge branch 'Port-WizDen-Trigger-Refactor-&-Jet-Injectors' of https:…
NotLivyathan Apr 13, 2026
7cb0603
it is time
NotLivyathan Apr 13, 2026
503aa58
TONIGHT IS THE NIGHT
NotLivyathan Apr 13, 2026
c20bdae
TONIGHT WILL BE THE NIGHT
NotLivyathan Apr 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ private void RefreshObjectList(ObjectsTabSelection selection)
switch (selection)
{
case ObjectsTabSelection.Stations:
entities.AddRange(_entityManager.EntitySysManager.GetEntitySystem<StationSystem>().Stations);
entities.AddRange(_entityManager.EntitySysManager.GetEntitySystem<StationSystem>().GetStationNames());
break;
case ObjectsTabSelection.Grids:
{
Expand Down
5 changes: 5 additions & 0 deletions Content.Client/Animals/Systems/ParrotMemorySystem.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
using Content.Shared.Animals.Systems;

namespace Content.Client.Animals.Systems;

public sealed class ParrotMemorySystem : SharedParrotMemorySystem;
5 changes: 5 additions & 0 deletions Content.Client/Body/Systems/BloodStreamSystem.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
using Content.Shared.Body.Systems;

namespace Content.Client.Body.Systems;

public sealed class BloodstreamSystem : SharedBloodstreamSystem;
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,6 @@ public override void UpdateState(BoundUserInterfaceState state)
if (state is not CrewManifestUiState crewManifestState)
return;

_fragment?.UpdateState(crewManifestState.Entries); // coyote: remove name
_fragment?.UpdateState(crewManifestState.Entries, crewManifestState.Message);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,13 @@ public CrewManifestUiFragment()
VerticalExpand = true;
}

public void UpdateState(CrewManifestEntries? entries) // coyote: remove name
public void UpdateState(CrewManifestEntries? entries, string? message = null) // Coyote: Removed name, // HardLight: Added string? & message = null
{
CrewManifestListing.DisposeAllChildren();
CrewManifestListing.RemoveAllChildren();

StationNameContainer.Visible = entries != null;
StationName.Text = "Crew Manifest"; // coyote: remove name
StationNameContainer.Visible = entries != null || !string.IsNullOrEmpty(message); // HardLight: Added !string.IsNullOrEmpty(message)
StationName.Text = string.IsNullOrEmpty(message) ? "Crew Manifest" : message; // HardLight: Rewritten for Coyote compatibility.

if (entries == null)
return;
Expand Down
15 changes: 0 additions & 15 deletions Content.Client/Chemistry/EntitySystems/HypospraySystem.cs

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using Content.Client.Chemistry.UI;
using Content.Client.Items;
using Content.Shared.Chemistry.Components;
using Content.Shared.Chemistry.EntitySystems;
using Robust.Shared.Prototypes;

namespace Content.Client.Chemistry.EntitySystems;

public sealed class InjectorStatusControlSystem : EntitySystem
{
[Dependency] private readonly SharedSolutionContainerSystem _solutionContainers = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;


public override void Initialize()
{
base.Initialize();
Subs.ItemStatus<InjectorComponent>(injector => new InjectorStatusControl(injector, _solutionContainers, _prototypeManager));
}
}
16 changes: 0 additions & 16 deletions Content.Client/Chemistry/EntitySystems/InjectorSystem.cs

This file was deleted.

58 changes: 0 additions & 58 deletions Content.Client/Chemistry/UI/HyposprayStatusControl.cs

This file was deleted.

61 changes: 36 additions & 25 deletions Content.Client/Chemistry/UI/InjectorStatusControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,32 @@
using Content.Client.Stylesheets;
using Content.Shared.Chemistry.Components;
using Content.Shared.Chemistry.EntitySystems;
using Content.Shared.Chemistry.Prototypes;
using Content.Shared.FixedPoint;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls;
using Robust.Shared.Prototypes;
using Robust.Shared.Timing;

namespace Content.Client.Chemistry.UI;

public sealed class InjectorStatusControl : Control
{
private readonly IPrototypeManager _prototypeManager;

private readonly Entity<InjectorComponent> _parent;
private readonly SharedSolutionContainerSystem _solutionContainers;
private readonly RichTextLabel _label;

private FixedPoint2 PrevVolume;
private FixedPoint2 PrevMaxVolume;
private FixedPoint2 PrevTransferAmount;
private InjectorToggleMode PrevToggleState;
private FixedPoint2 _prevVolume;
private FixedPoint2 _prevMaxVolume;
private FixedPoint2? _prevTransferAmount;
private InjectorBehavior _prevBehavior;

public InjectorStatusControl(Entity<InjectorComponent> parent, SharedSolutionContainerSystem solutionContainers)
public InjectorStatusControl(Entity<InjectorComponent> parent, SharedSolutionContainerSystem solutionContainers, IPrototypeManager prototypeManager)
{
_prototypeManager = prototypeManager;

_parent = parent;
_solutionContainers = solutionContainers;
_label = new RichTextLabel { StyleClasses = { StyleNano.StyleClassItemStatus } };
Expand All @@ -32,33 +38,38 @@ protected override void FrameUpdate(FrameEventArgs args)
{
base.FrameUpdate(args);

if (!_solutionContainers.TryGetSolution(_parent.Owner, _parent.Comp.SolutionName, out _, out var solution))
if (!_solutionContainers.TryGetSolution(_parent.Owner, _parent.Comp.SolutionName, out _, out var solution)
|| !_prototypeManager.Resolve(_parent.Comp.ActiveModeProtoId, out var activeMode))
return;

// only updates the UI if any of the details are different than they previously were
if (PrevVolume == solution.Volume
&& PrevMaxVolume == solution.MaxVolume
&& PrevTransferAmount == _parent.Comp.TransferAmount
&& PrevToggleState == _parent.Comp.ToggleState)
if (_prevVolume == solution.Volume
&& _prevMaxVolume == solution.MaxVolume
&& _prevTransferAmount == _parent.Comp.CurrentTransferAmount
&& _prevBehavior == activeMode.Behavior)
return;

PrevVolume = solution.Volume;
PrevMaxVolume = solution.MaxVolume;
PrevTransferAmount = _parent.Comp.TransferAmount;
PrevToggleState = _parent.Comp.ToggleState;
_prevVolume = solution.Volume;
_prevMaxVolume = solution.MaxVolume;
_prevTransferAmount = _parent.Comp.CurrentTransferAmount;
_prevBehavior = activeMode.Behavior;

// Update current volume and injector state
var modeStringLocalized = Loc.GetString(_parent.Comp.ToggleState switch
// Seeing transfer volume is only important for injectors that can change it.
if (activeMode.TransferAmounts.Count > 1 && _parent.Comp.CurrentTransferAmount.HasValue)
{
InjectorToggleMode.Draw => "injector-draw-text",
InjectorToggleMode.Inject => "injector-inject-text",
_ => "injector-invalid-injector-toggle-mode"
});

_label.SetMarkup(Loc.GetString("injector-volume-label",
("currentVolume", solution.Volume),
("totalVolume", solution.MaxVolume),
("modeString", modeStringLocalized),
("transferVolume", _parent.Comp.TransferAmount)));
_label.SetMarkup(Loc.GetString("injector-volume-transfer-label",
("currentVolume", solution.Volume),
("totalVolume", solution.MaxVolume),
("modeString", Loc.GetString(activeMode.Name)),
("transferVolume", _parent.Comp.CurrentTransferAmount.Value)));
}
else
{
_label.SetMarkup(Loc.GetString("injector-volume-label",
("currentVolume", solution.Volume),
("totalVolume", solution.MaxVolume),
("modeString", Loc.GetString(activeMode.Name))));
}
}
}
126 changes: 126 additions & 0 deletions Content.Client/Damage/Systems/StaminaSystem.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
using Content.Client.Stunnable;
using Content.Shared.Damage.Components;
using Content.Shared.Damage.Systems;
using Content.Shared.Mobs;
using Content.Shared.Mobs.Systems;
using Robust.Client.GameObjects;

namespace Content.Client.Damage.Systems;

public sealed partial class StaminaSystem : SharedStaminaSystem
{
[Dependency] private readonly AnimationPlayerSystem _animation = default!;
[Dependency] private readonly MobStateSystem _mobState = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
[Dependency] private readonly StunSystem _stun = default!; // Clientside Stun System

private const string StaminaAnimationKey = "stamina";

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

SubscribeLocalEvent<StaminaComponent, AnimationCompletedEvent>(OnAnimationCompleted);
SubscribeLocalEvent<ActiveStaminaComponent, ComponentShutdown>(OnActiveStaminaShutdown);
SubscribeLocalEvent<StaminaComponent, MobStateChangedEvent>(OnMobStateChanged);
}

protected override void OnStamHandleState(Entity<StaminaComponent> entity, ref AfterAutoHandleStateEvent args)
{
base.OnStamHandleState(entity, ref args);

TryStartAnimation(entity);
}

private void OnActiveStaminaShutdown(Entity<ActiveStaminaComponent> entity, ref ComponentShutdown args)
{
// If we don't have active stamina, we shouldn't have stamina damage. If the update loop can trust it we can trust it.
if (!TryComp<StaminaComponent>(entity, out var stamina))
return;

StopAnimation((entity, stamina));
}

protected override void OnShutdown(Entity<StaminaComponent> entity, ref ComponentShutdown args)
{
base.OnShutdown(entity, ref args);

StopAnimation(entity);
}

private void OnMobStateChanged(Entity<StaminaComponent> ent, ref MobStateChangedEvent args)
{
if (args.NewMobState == MobState.Dead)
StopAnimation(ent);
}

private void TryStartAnimation(Entity<StaminaComponent> entity)
{
if (!TryComp<SpriteComponent>(entity, out var sprite))
return;

// If the animation is running, the system should update it accordingly
// If we're below the threshold to animate, don't try to animate
// If we're in stamcrit don't override it
if (entity.Comp.AnimationThreshold > entity.Comp.StaminaDamage || _animation.HasRunningAnimation(entity, StaminaAnimationKey))
return;

// Don't animate if we're dead
if (_mobState.IsDead(entity))
return;

entity.Comp.StartOffset = sprite.Offset;

PlayAnimation((entity, entity.Comp, sprite));
}

private void StopAnimation(Entity<StaminaComponent, SpriteComponent?> entity)
{
if(!Resolve(entity, ref entity.Comp2))
return;

_animation.Stop(entity.Owner, StaminaAnimationKey);
entity.Comp1.StartOffset = entity.Comp2.Offset;
}

private void OnAnimationCompleted(Entity<StaminaComponent> entity, ref AnimationCompletedEvent args)
{
if (args.Key != StaminaAnimationKey || !args.Finished || !TryComp<SpriteComponent>(entity, out var sprite))
return;

// stop looping if we're below the threshold
if (entity.Comp.AnimationThreshold > entity.Comp.StaminaDamage)
{
_animation.Stop(entity.Owner, StaminaAnimationKey);
_sprite.SetOffset((entity, sprite), entity.Comp.StartOffset);
return;
}

if (!HasComp<AnimationPlayerComponent>(entity))
return;

PlayAnimation((entity, entity.Comp, sprite));
}

private void PlayAnimation(Entity<StaminaComponent, SpriteComponent> entity)
{
var step = Math.Clamp((entity.Comp1.StaminaDamage - entity.Comp1.AnimationThreshold) /
(entity.Comp1.CritThreshold - entity.Comp1.AnimationThreshold),
0f,
1f); // The things I do for project 0 warnings
var frequency = entity.Comp1.FrequencyMin + step * entity.Comp1.FrequencyMod;
var jitter = entity.Comp1.JitterAmplitudeMin + step * entity.Comp1.JitterAmplitudeMod;
var breathing = entity.Comp1.BreathingAmplitudeMin + step * entity.Comp1.BreathingAmplitudeMod;

_animation.Play(entity.Owner,
_stun.GetFatigueAnimation(entity.Comp2,
frequency,
entity.Comp1.Jitters,
jitter * entity.Comp1.JitterMin,
jitter * entity.Comp1.JitterMax,
breathing,
entity.Comp1.StartOffset,
ref entity.Comp1.LastJitter),
StaminaAnimationKey);
}
}
Loading
Loading