From abc25754eae8d8ac77b6d7bee95af8a74e519241 Mon Sep 17 00:00:00 2001
From: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>
Date: Wed, 1 Oct 2025 12:01:47 -0400
Subject: [PATCH] Fixes exfiltration species adjustments, holoparas (#30419)
---
code/__DEFINES/dcs/mob_signals.dm | 2 ++
code/datums/outfits/outfit_ghostbar.dm | 24 +++++++++++++++++++
.../gamemodes/miniantags/guardian/guardian.dm | 8 +++++++
.../antagonists/_common/antag_exfiltration.dm | 8 ++++++-
.../changeling/datum_changeling.dm | 5 +++-
.../antagonists/mind_flayer/flayer_datum.dm | 5 +++-
.../antagonists/traitor/datum_traitor.dm | 5 +++-
.../modules/antagonists/vampire/vamp_datum.dm | 5 +++-
8 files changed, 57 insertions(+), 5 deletions(-)
diff --git a/code/__DEFINES/dcs/mob_signals.dm b/code/__DEFINES/dcs/mob_signals.dm
index c3eb668e7fa..434a414279c 100644
--- a/code/__DEFINES/dcs/mob_signals.dm
+++ b/code/__DEFINES/dcs/mob_signals.dm
@@ -136,6 +136,8 @@
#define COMPONENT_NO_ATTACH (1<<0)
///from base of mob/living/health_update()
#define COMSIG_LIVING_HEALTH_UPDATE "living_health_update"
+/// Sent during exfiltration to handle guardians
+#define COMSIG_SUMMONER_EXTRACTED "summoner_extracted"
///sent from borg recharge stations: (amount, repairs)
#define COMSIG_PROCESS_BORGCHARGER_OCCUPANT "living_charge"
///sent when a mob enters a borg charger
diff --git a/code/datums/outfits/outfit_ghostbar.dm b/code/datums/outfits/outfit_ghostbar.dm
index 617564cb2e3..804f6ed71da 100644
--- a/code/datums/outfits/outfit_ghostbar.dm
+++ b/code/datums/outfits/outfit_ghostbar.dm
@@ -51,6 +51,12 @@
/obj/item/ammo_box/magazine/toy/pistol = 2
)
+/datum/outfit/admin/ghostbar_antag/syndicate/plasmaman
+ name = "Syndicate Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman
+ uniform = /obj/item/clothing/under/plasmaman
+
/datum/outfit/admin/ghostbar_antag/vampire
name = "Vampire"
@@ -65,6 +71,12 @@
/obj/item/reagent_containers/iv_bag/blood/o_plus = 3
)
+/datum/outfit/admin/ghostbar_antag/vampire/plasmaman
+ name = "Vampire Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman
+ uniform = /obj/item/clothing/under/plasmaman
+
/datum/outfit/admin/ghostbar_antag/changeling
name = "Changeling"
@@ -79,6 +91,12 @@
/obj/item/toy/foamblade = 1
)
+/datum/outfit/admin/ghostbar_antag/changeling/plasmaman
+ name = "Changeling Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman
+ uniform = /obj/item/clothing/under/plasmaman
+
/datum/outfit/admin/ghostbar_antag/mindflayer
name = "Mindflayer"
@@ -92,3 +110,9 @@
/obj/item/storage/box/engineer = 1,
/obj/item/toy/plushie/ipcplushie = 1
)
+
+/datum/outfit/admin/ghostbar_antag/mindflayer/plasmaman
+ name = "Mindflayer Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman
+ uniform = /obj/item/clothing/under/plasmaman
diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm
index adf830b6a06..339838f25e3 100644
--- a/code/game/gamemodes/miniantags/guardian/guardian.dm
+++ b/code/game/gamemodes/miniantags/guardian/guardian.dm
@@ -55,6 +55,7 @@
summoner = host
host.grant_guardian_actions(src)
RegisterSignal(summoner, COMSIG_LIVING_HEALTH_UPDATE, PROC_REF(update_health_hud))
+ RegisterSignal(summoner, COMSIG_SUMMONER_EXTRACTED, PROC_REF(handle_extraction))
/mob/living/simple_animal/hostile/guardian/can_buckle()
return FALSE
@@ -192,6 +193,13 @@
/mob/living/simple_animal/hostile/guardian/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return TRUE //Works better in zero G, and not useless in space
+/mob/living/simple_animal/hostile/guardian/proc/handle_extraction()
+ if(summoner)
+ summoner.remove_guardian_actions()
+ UnregisterSignal(summoner, COMSIG_LIVING_HEALTH_UPDATE)
+ ghostize()
+ qdel(src)
+
//Manifest, Recall, Communicate
/mob/living/simple_animal/hostile/guardian/proc/Manifest()
diff --git a/code/modules/antagonists/_common/antag_exfiltration.dm b/code/modules/antagonists/_common/antag_exfiltration.dm
index 42722e05b3b..f7dd682786c 100644
--- a/code/modules/antagonists/_common/antag_exfiltration.dm
+++ b/code/modules/antagonists/_common/antag_exfiltration.dm
@@ -591,11 +591,17 @@
for(var/datum/martial_art/MA in extractor.mind.known_martial_arts)
MA.remove(extractor)
+ // Kill guardians
+ SEND_SIGNAL(extractor, COMSIG_SUMMONER_EXTRACTED)
+
// Equip outfits and remove spells
var/datum/mind/extractor_mind = extractor.mind
for(var/datum/antagonist/antag in extractor_mind.antag_datums)
antag.exfiltrate(extractor, radio)
-
+ if(isvox(extractor))
+ extractor.dna.species.after_equip_job(null, extractor) // Nitrogen tanks
+ if(isplasmaman(extractor))
+ extractor.dna.species.after_equip_job(null, extractor) // Plasma tanks
// Apply traits
ADD_TRAIT(extractor, TRAIT_PACIFISM, GHOST_ROLE)
ADD_TRAIT(extractor, TRAIT_RESPAWNABLE, GHOST_ROLE)
diff --git a/code/modules/antagonists/changeling/datum_changeling.dm b/code/modules/antagonists/changeling/datum_changeling.dm
index 1ee3e39a9dd..9e0485f98cf 100644
--- a/code/modules/antagonists/changeling/datum_changeling.dm
+++ b/code/modules/antagonists/changeling/datum_changeling.dm
@@ -191,7 +191,10 @@ RESTRICT_TYPE(/datum/antagonist/changeling)
remove_changeling_powers(FALSE)
var/datum/action/changeling/power = new /datum/action/changeling/transform
power.Grant(extractor)
- extractor.equipOutfit(/datum/outfit/admin/ghostbar_antag/changeling)
+ if(isplasmaman(extractor))
+ extractor.equipOutfit(/datum/outfit/admin/ghostbar_antag/changeling/plasmaman)
+ else
+ extractor.equipOutfit(/datum/outfit/admin/ghostbar_antag/changeling)
radio.autosay("--ZZZT!- Welcome home, [extractor.real_name]. -ZZT!-", "Changeling Hive", "Security")
SSblackbox.record_feedback("tally", "successful_extraction", 1, "Changeling")
diff --git a/code/modules/antagonists/mind_flayer/flayer_datum.dm b/code/modules/antagonists/mind_flayer/flayer_datum.dm
index bb15ef379fa..06365713c6f 100644
--- a/code/modules/antagonists/mind_flayer/flayer_datum.dm
+++ b/code/modules/antagonists/mind_flayer/flayer_datum.dm
@@ -64,7 +64,10 @@
/datum/antagonist/mindflayer/exfiltrate(mob/living/carbon/human/extractor, obj/item/radio/radio)
remove_all_abilities()
remove_all_passives()
- extractor.equipOutfit(/datum/outfit/admin/ghostbar_antag/mindflayer)
+ if(isplasmaman(extractor)) // Normally, only IPCs can be flayers. This is in case they somehow end up mindswapped to a plasmaman.
+ extractor.equipOutfit(/datum/outfit/admin/ghostbar_antag/mindflayer/plasmaman)
+ else
+ extractor.equipOutfit(/datum/outfit/admin/ghostbar_antag/mindflayer)
radio.autosay("--ZZZT!- Excellent job, [extractor.real_name]. Proceed to -^%&!-ZZT!-", "Master Flayer", "Security")
SSblackbox.record_feedback("tally", "successful_extraction", 1, "Mindflayer")
diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm
index 1275444cc19..8e5971811a3 100644
--- a/code/modules/antagonists/traitor/datum_traitor.dm
+++ b/code/modules/antagonists/traitor/datum_traitor.dm
@@ -118,7 +118,10 @@ RESTRICT_TYPE(/datum/antagonist/traitor)
forge_human_objectives()
/datum/antagonist/traitor/exfiltrate(mob/living/carbon/human/extractor, obj/item/radio/radio)
- extractor.equipOutfit(/datum/outfit/admin/ghostbar_antag/syndicate)
+ if(isplasmaman(extractor))
+ extractor.equipOutfit(/datum/outfit/admin/ghostbar_antag/syndicate/plasmaman)
+ else
+ extractor.equipOutfit(/datum/outfit/admin/ghostbar_antag/syndicate)
// Remove mindslaves
var/list/mindslaves = SSticker.mode.implanted
for(var/datum/mind/possible_slave in mindslaves)
diff --git a/code/modules/antagonists/vampire/vamp_datum.dm b/code/modules/antagonists/vampire/vamp_datum.dm
index e82586da3b3..535f1f0fb3a 100644
--- a/code/modules/antagonists/vampire/vamp_datum.dm
+++ b/code/modules/antagonists/vampire/vamp_datum.dm
@@ -110,7 +110,10 @@ RESTRICT_TYPE(/datum/antagonist/vampire)
if(slave.master == extractor.mind)
possible_thrall.remove_antag_datum(/datum/antagonist/mindslave/thrall)
- extractor.equipOutfit(/datum/outfit/admin/ghostbar_antag/vampire)
+ if(isplasmaman(extractor))
+ extractor.equipOutfit(/datum/outfit/admin/ghostbar_antag/vampire/plasmaman)
+ else
+ extractor.equipOutfit(/datum/outfit/admin/ghostbar_antag/vampire)
radio.autosay("--ZZZT!- Wonderfully done, [extractor.real_name]. Welcome to -^%&!-ZZT!-", "Ancient Vampire", "Security")
SSblackbox.record_feedback("tally", "successful_extraction", 1, "Vampire")