Skip to content

Commit 4642385

Browse files
Intellicard fixes and adding pAI to allowed targets (#5867)
## Short description - This will fix the bug that intellicards can target AI Interfaces or borgs with them installed (entity transfer in/out) - This will add the ability to the intellicard to also target pAI's (in/out) ## Why we need to add this While very convenient, AI Interfaces are to be be used only for shunting. This fixes an obviously problem that was also reported as such (directly to me as i have made the merged pull request #5776 pAI's are just players in boxes. It makes sense to be able to transfer those to any other digital interface instead of them being ghosting and doing it that way. ## Media (Video/Screenshots) https://github.com/user-attachments/assets/4c51d12e-4aa9-4588-bd25-16a46a4066ba ## Checks - [x] I do not require assistance to complete the PR. - [x] Before posting/requesting review of a PR, I have verified that the changes work. - [x] I have added screenshots/videos of the changes, or this PR does not change in-game mechanics. - [x] I affirm that my changes are licensed under the [MIT License](https://github.com/ss14Starlight/space-station-14/blob/Starlight/LICENSE.TXT) and grant permission for use in this repository under its conditions. **Changelog** :cl: Floximo - add: Intellicards can now target pAI and transfer in both directions. - fix: AI Interfaces or borgs with AI Interfaces can no longer be target/source of intellicard transfers. --------- Co-authored-by: Walker Fowlkes <47339836+walksanatora@users.noreply.github.com>
1 parent 440677f commit 4642385

3 files changed

Lines changed: 93 additions & 16 deletions

File tree

Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
using Content.Shared.Mind.Components; // Starlight-edit
1717
using Content.Shared.Mobs;
1818
using Content.Shared.Mobs.Systems;
19+
using Content.Shared.PAI;
1920
using Content.Shared.Movement.Components;
2021
using Content.Shared.Movement.Systems;
2122
using Content.Shared.Popups;
@@ -122,6 +123,7 @@ public override void Initialize()
122123
SubscribeLocalEvent<StationAiHolderComponent, IntellicardDoAfterEvent>(OnIntellicardDoAfter);
123124

124125
SubscribeLocalEvent<BorgBrainComponent, IntellicardDoAfterEvent>(OnIntellicardBorgDoAfter); // Starlight-edit
126+
SubscribeLocalEvent<PAIComponent, IntellicardDoAfterEvent>(OnIntellicardPaiDoAfter); // Starlight-edit
125127

126128
SubscribeLocalEvent<StationAiCoreComponent, EntInsertedIntoContainerMessage>(OnAiInsert);
127129
SubscribeLocalEvent<StationAiCoreComponent, EntRemovedFromContainerMessage>(OnAiRemove);
@@ -271,9 +273,7 @@ private void OnAiInRange(Entity<StationAiOverlayComponent> ent, ref InRangeOverr
271273
}
272274

273275
private void OnIntellicardDoAfter(Entity<StationAiHolderComponent> ent, ref IntellicardDoAfterEvent args) => IntellicardTransfer(ent.Owner, ent.Comp, args); // Starlight-edit
274-
275276
private void OnIntellicardBorgDoAfter(Entity<BorgBrainComponent> ent, ref IntellicardDoAfterEvent args) => IntellicardTransfer(ent.Owner, null, args); // Starlight-edit
276-
277277
private void IntellicardTransfer(EntityUid uid, StationAiHolderComponent? component, IntellicardDoAfterEvent args) // Starlight-edit
278278
{
279279
if (args.Cancelled)
@@ -286,6 +286,9 @@ private void IntellicardTransfer(EntityUid uid, StationAiHolderComponent? compon
286286
return;
287287

288288
var target = args.Args.Target.Value;
289+
if (IsAiInterface(target)) // Starlight-edit
290+
return;
291+
289292
if (TryComp<BorgChassisComponent>(target, out var chassis) && chassis.BrainEntity is { } chassisBrain)
290293
target = chassisBrain;
291294

@@ -371,14 +374,6 @@ private void IntellicardTransfer(EntityUid uid, StationAiHolderComponent? compon
371374
}
372375
// Starlight-end
373376
}
374-
375-
// Starlight: wipe the name of the entity to the prototype name, used for entities when they are downloaded/uploaded
376-
private void ResetNameToPrototype(EntityUid entity)
377-
{
378-
if (MetaData(entity).EntityPrototype is { } prototype)
379-
_metadata.SetEntityName(entity, prototype.Name);
380-
}
381-
382377
private void OnHolderInteract(Entity<StationAiHolderComponent> ent, ref AfterInteractEvent args)
383378
{
384379
if (args.Handled || !args.CanReach || args.Target == null)
@@ -401,15 +396,19 @@ private void OnHolderInteract(Entity<StationAiHolderComponent> ent, ref AfterInt
401396
// Starlight-start: Downloadable borgs
402397

403398
var borgTarget = args.Target.Value;
404-
var borgMindTarget = borgTarget; // Starlight-edit
399+
var borgMindTarget = borgTarget;
400+
if (IsAiInterface(borgTarget))
401+
return;
402+
405403
if (TryComp<BorgChassisComponent>(borgTarget, out var chassis) && chassis.BrainEntity is { } chassisBrain)
406404
borgTarget = chassisBrain;
407405

408406
var isBorg = HasComp<BorgBrainComponent>(borgTarget);
407+
var isPai = HasComp<PAIComponent>(borgTarget);
409408
var isShunted = TryComp<StationAIShuntComponent>(borgTarget, out var shunt) && shunt.Return != null;
410409
var borgHaveMind = TryComp<MindContainerComponent>(borgMindTarget, out var mindContainer) && mindContainer.HasMind; // Starlight-edit
411410

412-
if (targetHolder == null && !isBorg)
411+
if (targetHolder == null && !isBorg && !isPai)
413412
{
414413
var message = cardHasAi ? "intellicard-cannot-transfer-to" : "intellicard-core-empty";
415414
_popup.PopupClient(Loc.GetString(message), args.User, args.User, PopupType.Medium);
@@ -425,7 +424,7 @@ private void OnHolderInteract(Entity<StationAiHolderComponent> ent, ref AfterInt
425424
args.Handled = true;
426425
return;
427426
}
428-
if (!cardHasAi && !coreHasAi && !(isBorg && borgHaveMind)) // Starlight-edit
427+
if (!cardHasAi && !coreHasAi && !(isBorg && borgHaveMind) && !isPai) // Starlight: pai is also possible
429428
{
430429
_popup.PopupClient(Loc.GetString("intellicard-core-empty"), args.User, args.User, PopupType.Medium);
431430
args.Handled = true;
@@ -434,7 +433,8 @@ private void OnHolderInteract(Entity<StationAiHolderComponent> ent, ref AfterInt
434433
// Starlight-start: Downloadable borgs
435434
if (isShunted)
436435
{
437-
_popup.PopupClient(Loc.GetString("intellicard-shunted"), args.User, args.User, PopupType.Medium);
436+
if (HasComp<BorgBrainComponent>(ent.Owner))
437+
_popup.PopupClient(Loc.GetString("intellicard-shunted"), args.User, args.User, PopupType.Medium);
438438
args.Handled = true;
439439
return;
440440
}
@@ -445,8 +445,8 @@ private void OnHolderInteract(Entity<StationAiHolderComponent> ent, ref AfterInt
445445
var ev = new ChatNotificationEvent(_downloadChatNotificationPrototype, args.Used, args.User);
446446
RaiseLocalEvent(held.Value, ref ev);
447447
}
448-
// Starlight-start: borgs can be downloaded/uploaded
449-
else if (isBorg)
448+
// Starlight-start: borgs/pAI can be downloaded/uploaded
449+
else if (isBorg || isPai)
450450
{
451451
var ev = new ChatNotificationEvent(_downloadChatNotificationPrototype, args.Used, args.User);
452452
RaiseLocalEvent(args.Target.Value, ref ev);

Content.Shared/_Starlight/Silicons/Borgs/StationAIShuntSystem.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,15 @@ private void OnAttemptShunt(EntityUid uid, StationAIShuntableComponent shuntable
6767

6868
if (!TryComp<StationAIShuntComponent>(target, out var shunt))
6969
return;
70+
71+
// We check first if this is already "posessed" for one or another reason. This is a remote, not a ghost maker.
72+
if (_mindSystem.TryGetMind(target, out _, out _))
73+
{
74+
if (_net.IsServer)
75+
_popup.PopupEntity(Loc.GetString("shunt-target-occupied"), target, uid, PopupType.Large);
76+
return;
77+
}
78+
7079
if (!_mindSystem.TryGetMind(uid, out var mindId, out var _))
7180
return;
7281
if (!TryComp<MobStateComponent>(uid, out var state) || state.CurrentState != MobState.Alive)
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
using Content.Shared.Intellicard;
2+
using Content.Shared.PAI;
3+
using Content.Shared.Popups;
4+
//ReSharper disable CheckNamespace
5+
using Content.Shared.Silicons.Borgs.Components;
6+
using Content.Shared._Starlight.Silicons.Borgs;
7+
8+
namespace Content.Shared.Silicons.StationAi;
9+
10+
public abstract partial class SharedStationAiSystem
11+
{
12+
private void OnIntellicardPaiDoAfter(Entity<PAIComponent> ent, ref IntellicardDoAfterEvent args) => TransferPai(ent.Owner, args);
13+
14+
// Starlight: wipe the name of the entity to the prototype name, used for entities when they are downloaded/uploaded
15+
private void ResetNameToPrototype(EntityUid entity)
16+
{
17+
if (MetaData(entity).EntityPrototype is { } prototype)
18+
_metadata.SetEntityName(entity, prototype.Name);
19+
}
20+
21+
private bool IsAiInterface(EntityUid entity)
22+
{
23+
if (TryComp<BorgChassisComponent>(entity, out var chassis) && chassis.BrainEntity is { } brain)
24+
entity = brain;
25+
26+
return HasComp<StationAIShuntComponent>(entity);
27+
}
28+
29+
private void TransferPai(EntityUid pai, IntellicardDoAfterEvent args)
30+
{
31+
if (args.Cancelled || args.Handled)
32+
return;
33+
34+
if (args.Args.Target is not { } card || !TryComp<StationAiHolderComponent>(card, out var cardHolder))
35+
return;
36+
37+
var slot = cardHolder.Slot;
38+
if (slot.Item is { } stored)
39+
{
40+
if (!_mind.TryGetMind(stored, out var mindId, out var mind))
41+
return;
42+
43+
if (_mind.TryGetMind(pai, out _, out _))
44+
{
45+
_popup.PopupEntity(Loc.GetString("intellicard-core-occupied"), pai, args.User, PopupType.Large);
46+
return;
47+
}
48+
49+
var name = _nameModifier.GetBaseName(stored);
50+
_mind.TransferTo(mindId, pai, ghostCheckOverride: true, mind: mind);
51+
_metadata.SetEntityName(pai, name);
52+
Del(stored);
53+
args.Handled = true;
54+
return;
55+
}
56+
57+
if (slot.ContainerSlot is not { } containerSlot || !_mind.TryGetMind(pai, out var paiMindId, out var paiMind))
58+
return;
59+
60+
var paiName = _nameModifier.GetBaseName(pai);
61+
var brain = SpawnInContainerOrDrop(DefaultAi, card, containerSlot.ID);
62+
_metadata.SetEntityName(brain, paiName);
63+
_metadata.SetEntityName(card, paiName);
64+
_mind.TransferTo(paiMindId, brain, ghostCheckOverride: true, mind: paiMind);
65+
ResetNameToPrototype(pai);
66+
args.Handled = true;
67+
}
68+
}

0 commit comments

Comments
 (0)