diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index 13e14ab5c3a..d3edbfe593f 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -608,6 +608,7 @@ var/list/teleport_runes = list()
new /mob/living/simple_animal/slaughter/cult(T, pick(NORTHEAST, SOUTHEAST, NORTHWEST, SOUTHWEST))
cult_mode.demons_summoned = 1
shuttle_master.emergency.request(null, 0.5,null)
+ shuttle_master.emergency.canRecall = FALSE
cult_mode.third_phase()
qdel(src)
diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
index bc58db4b064..5c05a028df0 100644
--- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
@@ -179,6 +179,7 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
sleep(50)
if(!ticker.mode.shadowling_ascended)
shuttle_master.emergency.request(null, 0.3)
+ shuttle_master.emergency.canRecall = FALSE
ticker.mode.shadowling_ascended = 1
A.mind.RemoveSpell(src)
qdel(H)
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index bfc13277e5f..e46182b735e 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -500,10 +500,13 @@
if(ticker.mode.name == "meteor")
return
- shuttle_master.cancelEvac(user)
- log_game("[key_name(user)] has recalled the shuttle.")
- message_admins("[key_name_admin(user)] has recalled the shuttle - [formatJumpTo(user)].", 1)
- return
+ if(shuttle_master.cancelEvac(user))
+ log_game("[key_name(user)] has recalled the shuttle.")
+ message_admins("[key_name_admin(user)] has recalled the shuttle - [ADMIN_FLW(user)].", 1)
+ else
+ to_chat(user, "Central Command has refused the recall request!")
+ log_game("[key_name(user)] has tried and failed to recall the shuttle.")
+ message_admins("[key_name_admin(user)] has tried and failed to recall the shuttle - [ADMIN_FLW(user)].", 1)
/proc/post_status(command, data1, data2, mob/user = null)
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 27b6c38a469..29c6111bc02 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -576,7 +576,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
command_announcement.Announce(input, customname, MsgSound[beepsound], , , type)
print_command_report(input, "[command_name()] Update")
- else if("No")
+ if("No")
//same thing as the blob stuff - it's not public, so it's classified, dammit
command_announcer.autosay("A classified message has been printed out at all communication consoles.");
print_command_report(input, "Classified [command_name()] Update")
@@ -763,6 +763,11 @@ Traitors and the like can also be revived with the previous role mostly intact.
var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No")
if(confirm != "Yes") return
+ if(alert("Set Shuttle Recallable (Select Yes unless you know what this does)", "Recallable?", "Yes", "No") == "Yes")
+ shuttle_master.emergency.canRecall = TRUE
+ else
+ shuttle_master.emergency.canRecall = FALSE
+
shuttle_master.emergency.request()
feedback_add_details("admin_verb","CSHUT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -781,7 +786,18 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(shuttle_master.emergency.mode >= SHUTTLE_DOCKED)
return
- shuttle_master.emergency.cancel()
+ if(shuttle_master.emergency.canRecall == FALSE)
+ if(alert("Shuttle is currently set to be nonrecallable. Recalling may break things. Respect Recall Status?", "Override Recall Status?", "Yes", "No") == "Yes")
+ return
+ else
+ var/keepStatus = alert("Maintain recall status on future shuttle calls?", "Maintain Status?", "Yes", "No") == "Yes" //Keeps or drops recallability
+ shuttle_master.emergency.canRecall = TRUE // must be true for cancel proc to work
+ shuttle_master.emergency.cancel()
+ if(keepStatus)
+ shuttle_master.emergency.canRecall = FALSE // restores original status
+ else
+ shuttle_master.emergency.cancel()
+
feedback_add_details("admin_verb","CCSHUT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] admin-recalled the emergency shuttle.")
message_admins("[key_name_admin(usr)] admin-recalled the emergency shuttle.")
diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm
index 05dc0ba4e73..8e09d9f6ed3 100644
--- a/code/modules/power/singularity/narsie.dm
+++ b/code/modules/power/singularity/narsie.dm
@@ -38,6 +38,7 @@
sleep(70)
shuttle_master.emergency.request(null, 0.3) // Cannot recall
+ shuttle_master.emergency.canRecall = FALSE
/obj/singularity/narsie/large/attack_ghost(mob/dead/observer/user as mob)
makeNewConstruct(/mob/living/simple_animal/hostile/construct/harvester, user, null, 1)