Skip to content

Commit cc58274

Browse files
Merge branch 'master' into 20.10.2025-disable-pain-effects
2 parents 80c833c + 7113eac commit cc58274

153 files changed

Lines changed: 2652 additions & 594 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Content.Client/Lathe/UI/LatheMenu.xaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ private void UpdateMiningPoints(uint points)
183183
{
184184
MiningPointsClaimButton.Disabled = points == 0 ||
185185
_player.LocalSession?.AttachedEntity is not { } player ||
186-
_miningPoints.TryFindIdCard(player) == null;
186+
!_miningPoints.CanClaimPoints(player); // Goobstation - borg mining Points
187187
if (points == _lastMiningPoints)
188188
return;
189189

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using Content.Goobstation.Shared.Wraith.SaltLines;
2+
using Robust.Client.GameObjects;
3+
4+
namespace Content.Goobstation.Client.Wraith.SaltLines;
5+
6+
public sealed class SaltLineVisualizerSystem : EntitySystem
7+
{
8+
[Dependency] private readonly AppearanceSystem _appearanceSystem = default!;
9+
[Dependency] private readonly SpriteSystem _spriteSystem = default!;
10+
/// <inheritdoc/>
11+
public override void Initialize()
12+
{
13+
base.Initialize();
14+
15+
SubscribeLocalEvent<SaltLineVisualizerComponent, AppearanceChangeEvent>(OnAppearanceChange);
16+
}
17+
18+
private void OnAppearanceChange(Entity<SaltLineVisualizerComponent> ent, ref AppearanceChangeEvent args)
19+
{
20+
if (args.Sprite == null)
21+
return;
22+
23+
if (!_appearanceSystem.TryGetData<SaltLineVisDirFlags>(ent.Owner, SaltLineVisuals.ConnectedMask, out var mask, args.Component))
24+
mask = SaltLineVisDirFlags.None;
25+
26+
_spriteSystem.LayerSetRsiState((ent.Owner, args.Sprite), 0, $"{ent.Comp.State}{(int)mask}");
27+
}
28+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
using Content.Goobstation.Shared.Wraith.SpiritCandle;
2+
using Robust.Client.GameObjects;
3+
4+
namespace Content.Goobstation.Client.Wraith.SpiritCandle;
5+
6+
public sealed class SpiritCandleVisualizerSystem : EntitySystem
7+
{
8+
[Dependency] private readonly SpriteSystem _sprite = default!;
9+
[Dependency] private readonly AppearanceSystem _appearance = default!;
10+
/// <inheritdoc/>
11+
public override void Initialize()
12+
{
13+
base.Initialize();
14+
15+
SubscribeLocalEvent<SpiritCandleComponent, AppearanceChangeEvent>(OnAppearanceChange);
16+
}
17+
18+
private void OnAppearanceChange(Entity<SpiritCandleComponent> ent, ref AppearanceChangeEvent args)
19+
{
20+
if (args.Sprite == null
21+
|| !_sprite.LayerMapTryGet((ent.Owner, args.Sprite), SpiritCandleVisuals.Layer, out var layer, false)
22+
|| !_appearance.TryGetData<int>(ent.Owner, SpiritCandleVisuals.Layer, out var layerData))
23+
return;
24+
25+
// this is a very unique item so its probably fine to hardcode the charges like this
26+
switch (layerData)
27+
{
28+
case 0:
29+
_sprite.LayerSetVisible((ent.Owner, args.Sprite), layer, false);
30+
break;
31+
case 1:
32+
_sprite.LayerSetVisible((ent.Owner, args.Sprite), layer, true);
33+
_sprite.LayerSetRsiState((ent.Owner, args.Sprite), layer, ent.Comp.OneCharge);
34+
break;
35+
case 2:
36+
_sprite.LayerSetVisible((ent.Owner, args.Sprite), layer, true);
37+
_sprite.LayerSetRsiState((ent.Owner, args.Sprite), layer, ent.Comp.TwoCharge);
38+
break;
39+
}
40+
}
41+
}

Content.Goobstation.Server/HisGrace/HisGraceSystem.cs

Lines changed: 58 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
using Content.Shared._Shitmed.Body.Components;
1818
using Content.Shared._Shitmed.Damage;
1919
using Content.Shared._Shitmed.Targeting;
20+
using Content.Shared.Administration.Logs;
2021
using Content.Shared.Damage;
2122
using Content.Shared.Damage.Components;
23+
using Content.Shared.Database;
2224
using Content.Shared.Hands;
2325
using Content.Shared.Humanoid;
2426
using Content.Shared.Interaction.Events;
@@ -37,7 +39,7 @@
3739

3840
namespace Content.Goobstation.Server.HisGrace;
3941

40-
public sealed partial class HisGraceSystem : SharedHisGraceSystem
42+
public sealed class HisGraceSystem : SharedHisGraceSystem
4143
{
4244
[Dependency] private readonly DamageableSystem _damageable = null!;
4345
[Dependency] private readonly PopupSystem _popup = null!;
@@ -53,6 +55,7 @@ public sealed partial class HisGraceSystem : SharedHisGraceSystem
5355
[Dependency] private readonly MovementSpeedModifierSystem _speedModifier = null!;
5456
[Dependency] private readonly ChatSystem _chat = null!;
5557
[Dependency] private readonly MobThresholdSystem _threshold = null!;
58+
[Dependency] private readonly ISharedAdminLogManager _adminLog = null!;
5659

5760
public override void Initialize()
5861
{
@@ -148,6 +151,10 @@ private void OnUse(Entity<HisGraceComponent> hisGrace, ref UseInHandEvent args)
148151
var popUp = Loc.GetString("hisgrace-use-start");
149152
_popup.PopupEntity(popUp, args.User, args.User, PopupType.MediumCaution);
150153

154+
// Log activation with actor and tool format
155+
_adminLog.Add(LogType.AdminMessage, LogImpact.Extreme,
156+
$"HIS GRACE ACTIVATED: {ToPrettyString(args.User):actor} activated {ToPrettyString(hisGrace):tool} at {Transform(hisGrace).Coordinates}");
157+
151158
ChangeState(hisGrace, HisGraceState.Peckish);
152159
SetUnremovable(hisGrace, true);
153160
}
@@ -157,7 +164,14 @@ private void OnEntityConsumed(Entity<HisGraceComponent> hisGrace, ref HisGraceEn
157164
hisGrace.Comp.EntitiesAbsorbed++;
158165

159166
if (hisGrace.Comp.EntitiesAbsorbed >= hisGrace.Comp.AscensionThreshold)
167+
{
168+
var user = hisGrace.Comp.User ?? hisGrace.Owner;
169+
_adminLog.Add(LogType.AdminMessage, LogImpact.Extreme,
170+
$"HIS GRACE ASCENSION: {ToPrettyString(user):actor} reached ascension with {ToPrettyString(hisGrace):tool}. " +
171+
$"Total entities consumed: {hisGrace.Comp.EntitiesAbsorbed}");
172+
160173
ChangeState(hisGrace, HisGraceState.Ascended);
174+
}
161175

162176
if (!TryComp<MeleeWeaponComponent>(hisGrace, out var melee))
163177
return;
@@ -254,6 +268,10 @@ private void HandleDeathState(Entity<HisGraceComponent> hisGrace, EntityUid user
254268
origin: hisGrace,
255269
ignoreResistances: true);
256270

271+
// Log the death state activation
272+
_adminLog.Add(LogType.AdminMessage, LogImpact.High,
273+
$"HIS GRACE DEATH: {ToPrettyString(user):actor} was killed by {ToPrettyString(hisGrace):tool} due to hunger");
274+
257275
var popup = Loc.GetString("hisgrace-death", ("target", Name(user)));
258276
_popup.PopupEntity(popup, user, user, PopupType.LargeCaution);
259277

@@ -336,11 +354,15 @@ private void HandleGroundAttacks(Entity<HisGraceComponent> hisGrace, MeleeWeapon
336354
var nearbyEnts = _lookup.GetEntitiesInRange(hisGrace, 1f);
337355

338356
// dont attack if the entity is the user, and dont if the entity is in a container (e.g, already devoured)
339-
foreach (var entity in nearbyEnts.Where(entity => HasComp<MobStateComponent>(entity) // malicious foreach loop
357+
foreach (var entity in nearbyEnts.Where(entity => HasComp<MobStateComponent>(entity)
340358
&& entity != hisGrace.Comp.User
341359
&& !_containerSystem.IsEntityOrParentInContainer(entity)))
342360
{
343-
/// get co-ordinates for animation
361+
// Log ground attack
362+
_adminLog.Add(LogType.AdminMessage, LogImpact.Medium,
363+
$"HIS GRACE GROUND ATTACK: {ToPrettyString(hisGrace):tool} attacked {ToPrettyString(entity):target} at {Transform(hisGrace).Coordinates}");
364+
365+
// get co-ordinates for animation
344366
var coordinates = _transform.GetMapCoordinates(hisGrace);
345367
var angle = _transform.GetRelativePosition(xform, entity, GetEntityQuery<TransformComponent>()).ToAngle();
346368

@@ -387,40 +409,59 @@ private void ProcessHungerTick(Entity<HisGraceComponent> hisGrace, EntityUid use
387409

388410
#region Helpers
389411

390-
private void DoAscension(HisGraceComponent comp)
412+
private void DoAscension(Entity<HisGraceComponent> hisGrace)
391413
{
392-
if (comp.User is not { } user
414+
if (hisGrace.Comp.User is not { } user
393415
|| TerminatingOrDeleted(user))
394416
return;
395417

396418
var ascensionPopup = Loc.GetString("hisgrace-ascension");
397419
_popup.PopupEntity(ascensionPopup, user, user, PopupType.Large);
398420

421+
// Log ascension with all relevant details
422+
_adminLog.Add(LogType.AdminMessage, LogImpact.Extreme,
423+
$"HIS GRACE ASCENSION ACHIEVED: {ToPrettyString(user):actor} achieved ascension with {ToPrettyString(hisGrace):tool} at {Transform(hisGrace).Coordinates}. " +
424+
$"Total entities consumed: {hisGrace.Comp.EntitiesAbsorbed}");
425+
426+
// Apply ascension effects
399427
EnsureComp<ThermalVisionComponent>(user);
400428
EnsureComp<PressureImmunityComponent>(user);
401429
EnsureComp<BreathingImmunityComponent>(user);
402430

403-
UpdateSpeedMultiplier(comp, comp.SpeedAddition * comp.SpeedIncrementMultiplier * comp.SpeedIncrementMultiplier);
431+
UpdateSpeedMultiplier(hisGrace, hisGrace.Comp.SpeedAddition * hisGrace.Comp.SpeedIncrementMultiplier * hisGrace.Comp.SpeedIncrementMultiplier);
404432

405433
// le funny ascension
406-
_chat.DispatchGlobalAnnouncement(Loc.GetString("hisgrace-ascension-announcement"), Name(user), true, comp.AscendSound, Color.PaleGoldenrod);
434+
_chat.DispatchGlobalAnnouncement(Loc.GetString("hisgrace-ascension-announcement"), Name(user), true, hisGrace.Comp.AscendSound, Color.PaleGoldenrod);
407435
}
408436

409437
private void ChangeState(Entity<HisGraceComponent> hisGrace, HisGraceState newState)
410438
{
411-
// self explanatory
439+
// Store the old state before changing it
412440
var oldState = hisGrace.Comp.CurrentState;
413441
hisGrace.Comp.CurrentState = newState;
414442

415443
var ev = new HisGraceStateChangedEvent(newState, oldState);
416444
RaiseLocalEvent(hisGrace, ref ev);
417445
}
418-
419446
private bool TryDevour(Entity<HisGraceComponent> hisGrace, EntityUid target)
420447
{
421-
if (!_state.IsIncapacitated(target)
422-
|| !_containerSystem.Insert(target, hisGrace.Comp.Stomach) )
448+
if (!_state.IsIncapacitated(target))
449+
{
450+
_adminLog.Add(LogType.AdminMessage, LogImpact.Medium,
451+
$"HIS GRACE DEVOUR FAILED: {ToPrettyString(hisGrace.Comp.User ?? hisGrace.Owner):actor} failed to devour {ToPrettyString(target):target} with {ToPrettyString(hisGrace):tool} - Target not incapacitated");
423452
return false;
453+
}
454+
455+
if (!_containerSystem.Insert(target, hisGrace.Comp.Stomach))
456+
{
457+
_adminLog.Add(LogType.AdminMessage, LogImpact.Medium,
458+
$"HIS GRACE DEVOUR FAILED: {ToPrettyString(hisGrace.Comp.User ?? hisGrace.Owner):actor} failed to devour {ToPrettyString(target):target} with {ToPrettyString(hisGrace):tool} - Container insertion failed");
459+
return false;
460+
}
461+
462+
// Log successful devour attempt
463+
_adminLog.Add(LogType.AdminMessage, LogImpact.High,
464+
$"HIS GRACE DEVOUR: {ToPrettyString(hisGrace.Comp.User ?? hisGrace.Owner):actor} devoured {ToPrettyString(target):target} with {ToPrettyString(hisGrace):tool}");
424465

425466
// Hunger gained from eating an entity is 20% of their crit state.
426467
hisGrace.Comp.Hunger -= GetHungerValue(target, hisGrace).Value;
@@ -429,13 +470,18 @@ private bool TryDevour(Entity<HisGraceComponent> hisGrace, EntityUid target)
429470
_audio.PlayPvs(hisGrace.Comp.SoundDevour, target);
430471
_popup.PopupEntity(devourPopup, target, PopupType.LargeCaution);
431472

432-
// don't apply bonuses for enities consumed that don't have minds or aren't human (no farming sentient mice)
473+
// don't apply bonuses for entities consumed that don't have minds or aren't human (no farming sentient mice)
433474
if (_mind.TryGetMind(target, out _, out _)
434475
&& HasComp<HumanoidAppearanceComponent>(target))
435476
{
436477
var ev = new HisGraceEntityConsumedEvent();
437478
RaiseLocalEvent(hisGrace, ref ev);
438479
}
480+
else
481+
{
482+
_adminLog.Add(LogType.AdminMessage, LogImpact.Low,
483+
$"HIS GRACE NON-HUMANOID: {ToPrettyString(hisGrace.Comp.User ?? hisGrace.Owner):actor} consumed non-humanoid {ToPrettyString(target):target} with {ToPrettyString(hisGrace):tool}");
484+
}
439485

440486
return true;
441487
}

Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -588,9 +588,19 @@ private void OnCollideEvent(EntityUid uid, SupermatterComponent sm, ref StartCol
588588
{
589589
if (!sm.Activated)
590590
{
591-
_adminLog.Add(LogType.Supermatter,
592-
HasComp<MobStateComponent>(args.OtherEntity) ? LogImpact.Extreme : LogImpact.High, // for mice activating it
593-
$"{ToPrettyString(args.OtherEntity):actor} activated Supermatter {ToPrettyString(uid):subject}");
591+
// Extra logging for supermatter
592+
var activator = ToPrettyString(args.OtherEntity);
593+
var isMob = HasComp<MobStateComponent>(args.OtherEntity);
594+
var impact = isMob ? LogImpact.Extreme : LogImpact.High;
595+
596+
// Original log entry
597+
_adminLog.Add(LogType.Supermatter, impact,
598+
$"{activator:actor} activated Supermatter {ToPrettyString(uid):subject}");
599+
600+
// New admin alert
601+
_adminLog.Add(LogType.AdminMessage, LogImpact.Extreme,
602+
$"SUPERMATTER ACTIVATED BY {activator} AT {Transform(uid).Coordinates}");
603+
594604
sm.Activated = true;
595605
}
596606

0 commit comments

Comments
 (0)