Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
fc8dc26
Added Xenoborg Stuff
Jun 25, 2026
dff3409
added droppable brain and MMi slot to module - XenoborgModuleDefense …
Jun 25, 2026
73b47dc
Merge branch 'Monolith-Station:main' into Xenoborgs
lordsej Jun 25, 2026
d531649
first round of error fixes that YAML Linter flagged
Jun 26, 2026
fd03413
Merge branch 'Monolith-Station:main' into Xenoborgs
lordsej Jun 26, 2026
a33c8a4
Merge branch 'Xenoborgs' of https://github.com/lordsej/Monolith into …
Jun 26, 2026
9ebd4b9
YAML Linter fixs 2
Jun 26, 2026
7682703
Merge branch 'Monolith-Station:main' into Xenoborgs
lordsej Jun 26, 2026
f24d66e
Merge branch 'Monolith-Station:main' into Xenoborgs
lordsej Jun 27, 2026
63fc703
YAML Linter fixes 3
Jun 27, 2026
fd449d4
YAML Linter fixes 4
Jun 27, 2026
26070fa
YAML Linter fix 5
Jun 27, 2026
609f9ab
YAML Linter fixes attempt 6
Jun 27, 2026
ff0070a
YAML Linter fixes attempt 7 - finally appeased Linter?
Jun 27, 2026
8a4093b
Build & Test Debug attempted fix and more xenoborg names
Jun 27, 2026
c7dc1f6
fixed bug on ComputerXenoborgsControl not seeing sprites for upgraded…
Jun 27, 2026
b284067
Merge branch 'Monolith-Station:main' into Xenoborgs
lordsej Jun 28, 2026
d48fbf1
Merge branch 'Monolith-Station:main' into Xenoborgs
lordsej Jun 28, 2026
56f33a6
fixed error component on spawn and added xenoborg guidebook entry fro…
Jun 28, 2026
fab1e9e
Merge branch 'Monolith-Station:main' into Xenoborgs
lordsej Jun 28, 2026
8fa194b
Merge branch 'Xenoborgs' of https://github.com/lordsej/Monolith into …
Jun 28, 2026
929950d
Merge branch 'Monolith-Station:main' into Xenoborgs
lordsej Jun 28, 2026
37e115c
Update improvised.yml
lordsej Jun 28, 2026
899caba
Merge branch 'Monolith-Station:main' into Xenoborgs
lordsej Jun 28, 2026
e625dce
guide book stuff
Jun 28, 2026
e85a0b4
integrationtests fix?
Jun 28, 2026
c8d21a5
attempting integrartiontest fix
Jun 28, 2026
bfa8cb4
another attempt at integrationfix
Jun 28, 2026
726ee34
more attempts at integration test fix
Jun 28, 2026
96526d7
Merge branch 'Monolith-Station:main' into Xenoborgs
lordsej Jun 29, 2026
da4bf23
Merge branch 'Monolith-Station:main' into Xenoborgs
lordsej Jun 29, 2026
c850928
Merge branch 'Monolith-Station:main' into Xenoborgs
lordsej Jun 29, 2026
d4ab402
Merge branch 'Monolith-Station:main' into Xenoborgs
lordsej Jun 30, 2026
f30d8a8
Merge branch 'Monolith-Station:main' into Xenoborgs
lordsej Jul 1, 2026
f8fc81e
Merge branch 'Monolith-Station:main' into Xenoborgs
lordsej Jul 1, 2026
8ff602d
Merge branch 'Monolith-Station:main' into Xenoborgs
lordsej Jul 2, 2026
f40b81e
Merge branch 'Monolith-Station:main' into Xenoborgs
lordsej Jul 3, 2026
002d938
now made mothership cores and pinpointers more explodey
Jul 5, 2026
3362082
amended mothership core explodeyness
Jul 5, 2026
1dc48e3
changed xenoborg exploding/deleting
Jul 6, 2026
f2964a7
Merge branch 'Monolith-Station:main' into Xenoborgs
lordsej Jul 6, 2026
b25074e
moved mothership to shuttleevent folder
Jul 6, 2026
94f931b
first draft of xenoborg entry into guidebook
Jul 6, 2026
20586b0
amended borg modules
Jul 6, 2026
3141eac
added frequency based radio jamming. customer faction radiojammers ca…
Jul 7, 2026
8fa28fc
balance and finetuning
Jul 7, 2026
a84c12d
Merge branch 'main' into Xenoborgs
lordsej Jul 7, 2026
e42b521
Merge branch 'main' into Xenoborgs
lordsej Jul 8, 2026
10f85ef
Merge branch 'Monolith-Station:main' into Xenoborgs
lordsej Jul 11, 2026
1413786
Merge branch 'Monolith-Station:main' into Xenoborgs
lordsej Jul 11, 2026
43c7b54
Merge branch 'main' into Xenoborgs
lordsej Jul 19, 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
  •  
  •  
  •  
1 change: 1 addition & 0 deletions Content.Client/Remotes/UI/DoorRemoteStatusControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ protected override void FrameUpdate(FrameEventArgs args)
OperatingMode.OpenClose => "door-remote-open-close-text",
OperatingMode.ToggleBolts => "door-remote-toggle-bolt-text",
OperatingMode.ToggleEmergencyAccess => "door-remote-emergency-access-text",
OperatingMode.ToggleOvercharge => "door-remote-toggle-eletrify-text",
_ => "door-remote-invalid-text"
});

Expand Down
10 changes: 7 additions & 3 deletions Content.Client/Robotics/UI/RoboticsConsoleWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ public sealed partial class RoboticsConsoleWindow : FancyWindow
private Dictionary<string, CyborgControlData> _cyborgs = new();

public EntityUid Entity;

private bool _allowBorgControl = true;

public RoboticsConsoleWindow()
{
Expand Down Expand Up @@ -72,6 +74,7 @@ public void SetEntity(EntityUid uid)
public void UpdateState(RoboticsConsoleState state)
{
_cyborgs = state.Cyborgs;
_allowBorgControl = state.AllowBorgControl;

// clear invalid selection
if (_selected is {} selected && !_cyborgs.ContainsKey(selected))
Expand All @@ -95,8 +98,8 @@ public void UpdateState(RoboticsConsoleState state)
PopulateData();

var locked = _lock.IsLocked(Entity);
DangerZone.Visible = !locked;
LockedMessage.Visible = locked;
DangerZone.Visible = !locked && _allowBorgControl;
LockedMessage.Visible = locked && _allowBorgControl; // Only show if locked AND control is allowed
}

private void PopulateCyborgs()
Expand Down Expand Up @@ -147,7 +150,8 @@ private void PopulateData()
BorgInfo.SetMessage(text);

// how the turntables
DisableButton.Disabled = !(data.HasBrain && data.CanDisable);
DisableButton.Disabled = !_allowBorgControl || !(data.HasBrain && data.CanDisable);
DestroyButton.Disabled = !_allowBorgControl;
}

protected override void FrameUpdate(FrameEventArgs args)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,5 +38,4 @@ private void BeforePacketSent(Entity<TransformComponent> xform, ref BeforePacket
}
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -349,7 +349,7 @@ private void SendToConnections(ReadOnlySpan<DeviceNetworkComponent> connections,
if (connection.Owner == packet.Sender)
continue;

BeforePacketSentEvent beforeEv = new(packet.Sender, xform, senderPos, connection.NetIdEnum.ToString());
BeforePacketSentEvent beforeEv = new(packet.Sender, xform, senderPos, connection.NetIdEnum.ToString(), packet.Frequency);
RaiseLocalEvent(connection.Owner, beforeEv, false);

if (!beforeEv.Cancelled)
Expand Down
114 changes: 74 additions & 40 deletions Content.Server/Radio/EntitySystems/JammerSystem.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Content.Server.Power.EntitySystems;
using Content.Server.PowerCell;
using Content.Server.Radio;
using Content.Shared.DeviceNetwork.Components;
using Content.Shared.Interaction;
using Content.Shared.PowerCell.Components;
Expand Down Expand Up @@ -51,70 +52,103 @@ public override void Update(float frameTime)
};
ChangeChargeLevel(uid, chargeLevel);
}

}

}
}

private void OnActivate(Entity<RadioJammerComponent> ent, ref ActivateInWorldEvent args)
{

if (args.Handled || !args.Complex)
return;

var activated = !HasComp<ActiveRadioJammerComponent>(ent) &&
_powerCell.TryGetBatteryFromSlot(ent.Owner, out var battery) &&
battery.CurrentCharge > GetCurrentWattage(ent);
if (activated)
{
ChangeLEDState(ent.Owner, true);
EnsureComp<ActiveRadioJammerComponent>(ent);
EnsureComp<DeviceNetworkJammerComponent>(ent, out var jammingComp);
_jammer.SetRange((ent, jammingComp), GetCurrentRange(ent));
_jammer.AddJammableNetwork((ent, jammingComp), DeviceNetworkComponent.DeviceNetIdDefaults.Wireless.ToString());
}
else
{
ChangeLEDState(ent.Owner, false);
RemCompDeferred<ActiveRadioJammerComponent>(ent);
RemCompDeferred<DeviceNetworkJammerComponent>(ent);
}
var state = Loc.GetString(activated ? "radio-jammer-component-on-state" : "radio-jammer-component-off-state");
var message = Loc.GetString("radio-jammer-component-on-use", ("state", state));
Popup.PopupEntity(message, args.User, args.User);
args.Handled = true;
}
var activated = !HasComp<ActiveRadioJammerComponent>(ent) &&
_powerCell.TryGetBatteryFromSlot(ent.Owner, out var battery) &&
battery.CurrentCharge > GetCurrentWattage(ent);

private void OnPowerCellChanged(Entity<ActiveRadioJammerComponent> ent, ref PowerCellChangedEvent args)
if (activated)
{
if (args.Ejected)
ChangeLEDState(ent.Owner, true);

EnsureComp<ActiveRadioJammerComponent>(ent);
EnsureComp<DeviceNetworkJammerComponent>(ent, out var jammingComp);

_jammer.SetRange((ent, jammingComp), GetCurrentRange(ent));

_jammer.AddJammableNetwork(
(ent, jammingComp),
DeviceNetworkComponent.DeviceNetIdDefaults.Wireless.ToString()
);

/// Sync excluded frequencies from RadioJammerComponent
/// into DeviceNetworkJammerComponen

_jammer.ClearExcludedFrequency((ent, jammingComp));

foreach (var freq in ent.Comp.FrequenciesExcluded)
{
ChangeLEDState(ent.Owner, false);
RemCompDeferred<ActiveRadioJammerComponent>(ent);
_jammer.AddExcludedFrequency((ent, jammingComp), (uint) freq);
}
}
else
{
ChangeLEDState(ent.Owner, false);

RemCompDeferred<ActiveRadioJammerComponent>(ent);
RemCompDeferred<DeviceNetworkJammerComponent>(ent);
}

var state = Loc.GetString(activated
? "radio-jammer-component-on-state"
: "radio-jammer-component-off-state");

var message = Loc.GetString(
"radio-jammer-component-on-use",
("state", state)
);

Popup.PopupEntity(message, args.User, args.User);
args.Handled = true;
}

private void OnRadioSendAttempt(ref RadioSendAttemptEvent args)
{
if (ShouldCancelSend(args.RadioSource))

if (!TryComp<TransformComponent>(args.RadioSource, out var sourceTransform))
return;

var source = sourceTransform.Coordinates;

var query = EntityQueryEnumerator<
ActiveRadioJammerComponent,
RadioJammerComponent,
TransformComponent>();

while (query.MoveNext(out var uid, out _, out var jammer, out var transform))
{
// Excluded channels are allowed through.
if (jammer.FrequenciesExcluded.Contains(args.Frequency))
continue;

if (_transform.InRange(
source,
transform.Coordinates,
GetCurrentRange((uid, jammer))))
{
args.Cancelled = true;
return;
}
}
}

private bool ShouldCancelSend(EntityUid sourceUid)
private void OnPowerCellChanged(Entity<ActiveRadioJammerComponent> ent, ref PowerCellChangedEvent args)
{
var source = Transform(sourceUid).Coordinates;
var query = EntityQueryEnumerator<ActiveRadioJammerComponent, RadioJammerComponent, TransformComponent>();

while (query.MoveNext(out var uid, out _, out var jam, out var transform))
if (args.Ejected)
{
if (_transform.InRange(source, transform.Coordinates, GetCurrentRange((uid, jam))))
{
return true;
}
ChangeLEDState(ent.Owner, false);
RemCompDeferred<ActiveRadioJammerComponent>(ent.Owner);
RemCompDeferred<DeviceNetworkJammerComponent>(ent.Owner);
}

return false;
}
}
}
9 changes: 8 additions & 1 deletion Content.Server/Radio/EntitySystems/RadioSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -193,9 +193,16 @@ public void SendRadioMessage(
var ev = new RadioReceiveEvent(messageSource, channel, msg, notUdsMsg, language, radioSource);
// Einstein Engines - Language end

var sendAttemptEv = new RadioSendAttemptEvent(channel, radioSource);
var transmitFrequency = frequency ?? GetFrequency(messageSource, channel);

var sendAttemptEv = new RadioSendAttemptEvent(
channel,
radioSource,
transmitFrequency);

RaiseLocalEvent(ref sendAttemptEv);
RaiseLocalEvent(radioSource, ref sendAttemptEv);

var canSend = !sendAttemptEv.Cancelled;

var sourceMapId = Transform(radioSource).MapID;
Expand Down
3 changes: 2 additions & 1 deletion Content.Server/Radio/RadioEvent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,10 @@ public record struct RadioReceiveAttemptEvent(RadioChannelPrototype Channel, Ent
/// Use this event to cancel sending message to every receiver
/// </summary>
[ByRefEvent]
public record struct RadioSendAttemptEvent(RadioChannelPrototype Channel, EntityUid RadioSource)
public record struct RadioSendAttemptEvent(RadioChannelPrototype Channel, EntityUid RadioSource, int Frequency)
{
public readonly RadioChannelPrototype Channel = Channel;
public readonly EntityUid RadioSource = RadioSource;
public readonly int Frequency = Frequency;
public bool Cancelled = false;
}
30 changes: 25 additions & 5 deletions Content.Server/Remotes/DoorRemoteSystem.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Content.Server.Administration.Logs;
using Content.Server.Doors.Systems;
using Content.Shared.Electrocution;
using Content.Server.Power.EntitySystems;
using Content.Shared.Access.Components;
using Content.Shared.Database;
Expand All @@ -8,15 +9,18 @@
using Content.Shared.Interaction;
using Content.Shared.Remotes.Components;
using Content.Shared.Remotes.EntitySystems;
using Robust.Shared.Audio.Systems;

namespace Content.Shared.Remotes
{
public sealed partial class DoorRemoteSystem : SharedDoorRemoteSystem
public sealed class DoorRemoteSystem : SharedDoorRemoteSystem
{
[Dependency] private IAdminLogManager _adminLogger = default!;
[Dependency] private AirlockSystem _airlock = default!;
[Dependency] private DoorSystem _doorSystem = default!;
[Dependency] private ExamineSystemShared _examine = default!;
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
[Dependency] private readonly AirlockSystem _airlock = default!;
[Dependency] private readonly DoorSystem _doorSystem = default!;
[Dependency] private readonly ExamineSystemShared _examine = default!;
[Dependency] private readonly SharedElectrocutionSystem _electrify = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;

public override void Initialize()
{
Expand Down Expand Up @@ -90,6 +94,22 @@ private void OnBeforeInteract(Entity<DoorRemoteComponent> entity, ref BeforeRang
$"{ToPrettyString(args.User):player} used {ToPrettyString(args.Used)} on {ToPrettyString(args.Target.Value)} to set emergency access {(airlockComp.EmergencyAccess ? "on" : "off")}");
}

break;
case OperatingMode.ToggleOvercharge:
{
if (!TryComp<ElectrifiedComponent>(args.Target, out var electrifiedComp))
break;
var newState = !electrifiedComp.Enabled;
_electrify.SetElectrified((args.Target.Value, electrifiedComp), newState);
var soundToPlay = newState
? electrifiedComp.AirlockElectrifyDisabled
: electrifiedComp.AirlockElectrifyEnabled;
_audio.PlayPvs(soundToPlay, args.Target.Value);
_adminLogger.Add(LogType.Action,
LogImpact.Medium,
$"{ToPrettyString(args.User):player} used {ToPrettyString(args.Used)} on {ToPrettyString(args.Target.Value)} to {(electrifiedComp.Enabled ? "" : "un")}electrify it");
}

break;
default:
throw new InvalidOperationException(
Expand Down
12 changes: 9 additions & 3 deletions Content.Server/Robotics/Systems/RoboticsConsoleSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,10 @@ private void OnOpened(Entity<RoboticsConsoleComponent> ent, ref BoundUIOpenedEve

private void OnDisable(Entity<RoboticsConsoleComponent> ent, ref RoboticsConsoleDisableMessage args)
{
if (_lock.IsLocked(ent.Owner))
if (!ent.Comp.AllowBorgControl)
return;

if (_lock.IsLocked(ent.Owner))
return;

if (!ent.Comp.Cyborgs.TryGetValue(args.Address, out var data))
Expand All @@ -112,7 +115,10 @@ private void OnDisable(Entity<RoboticsConsoleComponent> ent, ref RoboticsConsole

private void OnDestroy(Entity<RoboticsConsoleComponent> ent, ref RoboticsConsoleDestroyMessage args)
{
if (_lock.IsLocked(ent.Owner))
if (!ent.Comp.AllowBorgControl)
return;

if (_lock.IsLocked(ent.Owner))
return;

var now = _timing.CurTime;
Expand All @@ -139,7 +145,7 @@ private void OnDestroy(Entity<RoboticsConsoleComponent> ent, ref RoboticsConsole

private void UpdateUserInterface(Entity<RoboticsConsoleComponent> ent)
{
var state = new RoboticsConsoleState(ent.Comp.Cyborgs);
var state = new RoboticsConsoleState(ent.Comp.Cyborgs, ent.Comp.AllowBorgControl);
_ui.SetUiState(ent.Owner, RoboticsConsoleUiKey.Key, state);
}
}
4 changes: 1 addition & 3 deletions Content.Server/Silicons/Borgs/BorgSwitchableTypeSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,7 @@ protected override void SelectBorgModule(Entity<BorgSwitchableTypeComponent> ent
(ent.Owner, transponder),
new SpriteSpecifier.Rsi(new ResPath("Mobs/Silicon/chassis.rsi"), prototype.SpriteBodyState));

_borgSystem.SetTransponderName(
(ent.Owner, transponder),
Loc.GetString($"borg-type-{borgType}-transponder"));
_borgSystem.SetTransponderName((ent.Owner, transponder),Loc.GetString($"borg-type-{borgType}-name"));
}

// Configure modules
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ private void OnPacketReceived(EntityUid uid, SurveillanceCameraComponent compone
{
{ DeviceNetworkConstants.Command, string.Empty },
{ CameraAddressData, deviceNet.Address },
{ CameraNameData, component.CameraId },
{ CameraNameData, component.UseEntityNameAsCameraId ? MetaData(uid).EntityName : component.CameraId },
{ CameraSubnetData, string.Empty }
};

Expand Down Expand Up @@ -215,7 +215,8 @@ private void UpdateSetupInterface(EntityUid uid, SurveillanceCameraComponent? ca
return;
}
}


var name = camera.UseEntityNameAsCameraId ? MetaData(uid).EntityName : camera.CameraId;
var state = new SurveillanceCameraSetupBoundUiState(camera.CameraId, deviceNet.ReceiveFrequency ?? 0,
camera.AvailableNetworks, camera.NameSet, camera.NetworkSet);
_userInterface.SetUiState(uid, SurveillanceCameraSetupUiKey.Camera, state);
Expand Down
Loading
Loading