diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm
index 0c3f7daeb69..37013ec3ee9 100644
--- a/code/modules/client/client_defines.dm
+++ b/code/modules/client/client_defines.dm
@@ -174,3 +174,6 @@
/// Last asset send job id.
var/last_asset_job = 0
var/last_completed_asset_job = 0
+
+ /// rate limiting for the crew manifest
+ var/crew_manifest_delay
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index bc2ef1eb7df..3267c2cc40b 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -177,9 +177,6 @@
AttemptLateSpawn(href_list["SelectedJob"])
return
- if(!ready && href_list["preference"])
- if(client)
- client.prefs.process_link(src, href_list)
else if(!href_list["late_join"])
new_player_panel()
@@ -471,6 +468,12 @@
qdel(src)
/mob/dead/new_player/proc/ViewManifest()
+ if(!client)
+ return
+ if(world.time < client.crew_manifest_delay)
+ return
+ client.crew_manifest_delay = world.time + (1 SECONDS)
+
var/dat = "
"
dat += "Crew Manifest
"
dat += GLOB.data_core.get_manifest_html()
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 2d07aeee832..326a365c9bb 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -647,6 +647,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
set name = "View Crew Manifest"
set category = "Ghost"
+ if(!client)
+ return
+ if(world.time < client.crew_manifest_delay)
+ return
+ client.crew_manifest_delay = world.time + (1 SECONDS)
+
var/dat
dat += "Crew Manifest
"
dat += GLOB.data_core.get_manifest_html()
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 83a8eb3263a..4055defbefb 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -335,6 +335,12 @@
usr << browse(list, "window=laws")
/mob/living/silicon/proc/ai_roster()
+ if(!client)
+ return
+ if(world.time < client.crew_manifest_delay)
+ return
+ client.crew_manifest_delay = world.time + (1 SECONDS)
+
var/datum/browser/popup = new(src, "airoster", "Crew Manifest", 387, 420)
popup.set_content(GLOB.data_core.get_manifest_html())
popup.open()