diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index dceabff846..b41bf83b45 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -264,6 +264,10 @@ var/list/gamemode_cache = list()
var/sqlite_feedback_cooldown = 0 // How long one must wait, in days, to submit another feedback form. Used to help prevent spam, especially with privacy active. 0 = No limit.
var/sqlite_feedback_min_age = 0 // Used to block new people from giving feedback. This metric is very bad but it can help slow down spammers.
+ // disables the annoying "You have already logged in this round, disconnect or be banned" popup for multikeying, because it annoys the shit out of me when testing.
+ var/disable_cid_warn_popup = FALSE
+
+
/datum/configuration/New()
var/list/L = typesof(/datum/game_mode) - /datum/game_mode
for (var/T in L)
@@ -873,7 +877,8 @@ var/list/gamemode_cache = list()
if("sqlite_feedback_cooldown")
config.sqlite_feedback_cooldown = text2num(value)
-
+ if("disable_cid_warn_popup")
+ config.disable_cid_warn_popup = TRUE
else
log_misc("Unknown setting in configuration: '[name]'")
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index dcbc870c74..e56727c95d 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -75,6 +75,7 @@ proc/admin_notice(var/message, var/rights)
if(M.client)
body += "| Prison | "
+ body += "\ Send back to Lobby | "
var/muted = M.client.prefs.muted
body += {"
Mute:
\[IC |
@@ -128,6 +129,8 @@ proc/admin_notice(var/message, var/rights)
else
body += "Animalize | "
+ body += "Respawn | "
+
// DNA2 - Admin Hax
if(M.dna && iscarbon(M))
body += "
"
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 2cb634808d..fe6048d0c2 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1065,6 +1065,29 @@
log_admin("[key_name(usr)] sent [key_name(M)] to the prison station.")
message_admins("[key_name_admin(usr)] sent [key_name_admin(M)] to the prison station.", 1)
+ else if(href_list["sendbacktolobby"])
+ if(!check_rights(R_ADMIN))
+ return
+
+ var/mob/M = locate(href_list["sendbacktolobby"])
+ if(!isobserver(M))
+ to_chat(usr, "You can only send ghost players back to the Lobby.")
+ return
+
+ if(!M.client)
+ to_chat(usr, "[M] doesn't seem to have an active client.")
+ return
+
+ if(alert(usr, "Send [key_name(M)] back to Lobby?", "Message", "Yes", "No") != "Yes")
+ return
+
+ log_admin("[key_name(usr)] has sent [key_name(M)] back to the Lobby.")
+ message_admins("[key_name(usr)] has sent [key_name(M)] back to the Lobby.")
+
+ var/mob/new_player/NP = new()
+ NP.ckey = M.ckey
+ qdel(M)
+
else if(href_list["tdome1"])
if(!check_rights(R_FUN)) return
@@ -1223,6 +1246,15 @@
usr.client.cmd_admin_animalize(M)
+ else if(href_list["respawn"])
+ if(!check_rights(R_SPAWN))
+ return
+
+ var/client/C = locate(href_list["respawn"])
+ if(!istype(C))
+ return
+ usr.client.respawn_character_proper(C)
+
else if(href_list["togmutate"])
if(!check_rights(R_SPAWN)) return
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 51e668767e..baecaaa8a2 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -369,12 +369,18 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(!holder)
return
- //I frontload all the questions so we don't have a half-done process while you're reading.
var/client/picked_client = input(src, "Please specify which client's character to spawn.", "Client", "") as null|anything in GLOB.clients
if(!picked_client)
return
- var/location = alert(src,"Please specify where to spawn them.", "Location", "Right Here", "Arrivals", "Cancel")
+ respawn_character_proper(picked_client)
+
+/client/proc/respawn_character_proper(client/picked_client)
+ if(!istype(picked_client))
+ return
+
+ //I frontload all the questions so we don't have a half-done process while you're reading.
+ var/location = alert(src, "Please specify where to spawn them.", "Location", "Right Here", "Arrivals", "Cancel")
if(location == "Cancel" || !location)
return
diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm
index 8bff62d3f4..fc326c8d03 100644
--- a/code/modules/mob/login.dm
+++ b/code/modules/mob/login.dm
@@ -14,7 +14,8 @@
if( (client.connection != "web") && (M.computer_id == client.computer_id) )
if(matches) matches += " and "
matches += "ID ([client.computer_id])"
- spawn() alert("You have logged in already with another key this round, please log out of this one NOW or risk being banned!")
+ if(!config.disable_cid_warn_popup)
+ spawn() alert("You have logged in already with another key this round, please log out of this one NOW or risk being banned!")
if(matches)
if(M.client)
message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)].", 1)
diff --git a/config/example/config.txt b/config/example/config.txt
index 018cd9e364..57cfa86a36 100644
--- a/config/example/config.txt
+++ b/config/example/config.txt
@@ -526,3 +526,6 @@ SQLITE_FEEDBACK_COOLDOWN 0
## Set this to how many days you want someone to have to wait when they first join.
## Setting to zero will disable this restriction.
SQLITE_FEEDBACK_MIN_AGE 7
+
+## Uncomment this if you want to disable the popup alert for people on the same CID (Don't do this on a live server if you ban multikeying)
+#DISABLE_CID_WARN_POPUP
\ No newline at end of file