diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm
index f8f9609aced..53d88826c47 100644
--- a/code/__DEFINES/preferences.dm
+++ b/code/__DEFINES/preferences.dm
@@ -29,6 +29,8 @@
#define UI_DARKMODE 131072
#define DISABLE_KARMA 262144
+#define TYPING_ONCE 1048576
+
#define TOGGLES_DEFAULT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_LOOC|MEMBER_PUBLIC|DONATOR_PUBLIC)
// Admin attack logs filter system, see /proc/add_attack_logs and /proc/msg_admin_attack
diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm
index 9dd3c870d51..5b639cc80f8 100644
--- a/code/__HELPERS/text.dm
+++ b/code/__HELPERS/text.dm
@@ -109,6 +109,15 @@
else
return trim(html_encode(name), max_length) //trim is "outside" because html_encode can expand single symbols into multiple symbols (such as turning < into <)
+// Uses client.typing to check if the popup should appear or not
+/proc/typing_input(mob/user, message = "", title = "", default = "")
+ if(user.client.checkTyping()) // Prevent double windows
+ return null
+ user.client.typing = TRUE
+ var/msg = input(user, message, title, default) as text|null
+ user.client.typing = FALSE
+ return msg
+
//Filters out undesirable characters from names
/proc/reject_bad_name(var/t_in, var/allow_numbers=0, var/max_length=MAX_NAME_LEN)
if(!t_in || length(t_in) > max_length)
diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm
index a35047bb9ad..7a2a7c14143 100644
--- a/code/game/verbs/ooc.dm
+++ b/code/game/verbs/ooc.dm
@@ -4,25 +4,21 @@ var/global/mentor_ooc_colour = "#0099cc"
var/global/moderator_ooc_colour = "#184880"
var/global/admin_ooc_colour = "#b82e00"
-/client/verb/ooc(msg as text)
+//Checks if the client already has a text input open
+/client/proc/checkTyping()
+ return (prefs.toggles & TYPING_ONCE && typing)
+
+/client/verb/ooc(msg = "" as text)
set name = "OOC"
set category = "OOC"
-
+
if(!mob)
return
if(IsGuestKey(key))
to_chat(src, "Guests may not use OOC.")
return
- msg = trim(sanitize(copytext(msg, 1, MAX_MESSAGE_LEN)))
- if(!msg)
- return
-
- if(!(prefs.toggles & CHAT_OOC))
- to_chat(src, "You have OOC muted.")
- return
-
- if(!check_rights(R_ADMIN|R_MOD,0))
+ if(!check_rights(R_ADMIN|R_MOD, 0))
if(!config.ooc_allowed)
to_chat(src, "OOC is globally muted.")
return
@@ -32,6 +28,19 @@ var/global/admin_ooc_colour = "#b82e00"
if(prefs.muted & MUTE_OOC)
to_chat(src, "You cannot use OOC (muted).")
return
+
+ if(!msg)
+ msg = typing_input(src.mob, "", "ooc (text)")
+
+ msg = trim(sanitize(copytext(msg, 1, MAX_MESSAGE_LEN)))
+ if(!msg)
+ return
+
+ if(!(prefs.toggles & CHAT_OOC))
+ to_chat(src, "You have OOC muted.")
+ return
+
+ if(!check_rights(R_ADMIN|R_MOD,0))
if(handle_spam_prevention(msg, MUTE_OOC, OOC_COOLDOWN))
return
if(findtext(msg, "byond://"))
@@ -150,7 +159,7 @@ var/global/admin_ooc_colour = "#b82e00"
feedback_add_details("admin_verb","ROC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-/client/verb/looc(msg as text)
+/client/verb/looc(msg = "" as text)
set name = "LOOC"
set desc = "Local OOC, seen only by those in view."
set category = "OOC"
@@ -161,14 +170,6 @@ var/global/admin_ooc_colour = "#b82e00"
to_chat(src, "Guests may not use OOC.")
return
- msg = trim(sanitize(copytext(msg, 1, MAX_MESSAGE_LEN)))
- if(!msg)
- return
-
- if(!(prefs.toggles & CHAT_LOOC))
- to_chat(src, "You have LOOC muted.")
- return
-
if(!check_rights(R_ADMIN|R_MOD,0))
if(!config.looc_allowed)
to_chat(src, "LOOC is globally muted.")
@@ -179,6 +180,19 @@ var/global/admin_ooc_colour = "#b82e00"
if(prefs.muted & MUTE_OOC)
to_chat(src, "You cannot use LOOC (muted).")
return
+
+ if(!msg)
+ msg = typing_input(src.mob, "", "LOOC (text)")
+
+ msg = trim(sanitize(copytext(msg, 1, MAX_MESSAGE_LEN)))
+ if(!msg)
+ return
+
+ if(!(prefs.toggles & CHAT_LOOC))
+ to_chat(src, "You have LOOC muted.")
+ return
+
+ if(!check_rights(R_ADMIN|R_MOD,0))
if(handle_spam_prevention(msg, MUTE_OOC, OOC_COOLDOWN))
return
if(findtext(msg, "byond://"))
diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm
index c88347a305b..66b71fb137d 100644
--- a/code/modules/client/client defines.dm
+++ b/code/modules/client/client defines.dm
@@ -19,6 +19,8 @@
var/area = null
var/time_died_as_mouse = null //when the client last died as a mouse
+ var/typing = FALSE // Prevents typing window stacking
+
var/adminhelped = 0
var/gc_destroyed //Time when this object was destroyed.
diff --git a/code/modules/client/preference/preferences_toggles.dm b/code/modules/client/preference/preferences_toggles.dm
index 2899432501a..703de37468e 100644
--- a/code/modules/client/preference/preferences_toggles.dm
+++ b/code/modules/client/preference/preferences_toggles.dm
@@ -231,3 +231,15 @@
else
to_chat(usr, "You have enabled karma gains.")
return
+
+/client/verb/toggle_popup_limiter()
+ set name = "Toggle Text Popup Limiter"
+ set category = "Preferences"
+ set desc = "Will let you limit the text input popups to one at a time."
+ prefs.toggles ^= TYPING_ONCE
+ prefs.save_preferences(src)
+ if(prefs.toggles & TYPING_ONCE)
+ to_chat(usr, "You have enabled text popup limiting.")
+ else
+ to_chat(usr, "You have disabled text popup limiting.")
+ return
diff --git a/code/modules/mob/typing_indicator.dm b/code/modules/mob/typing_indicator.dm
index 9c6c8f2fa73..9ad5449ee8b 100644
--- a/code/modules/mob/typing_indicator.dm
+++ b/code/modules/mob/typing_indicator.dm
@@ -39,7 +39,7 @@ var/global/image/typing_indicator
set_typing_indicator(1)
hud_typing = 1
- var/message = input("","say (text)") as null|text
+ var/message = typing_input(src, "", "say (text)")
hud_typing = 0
set_typing_indicator(0)
if(message)
@@ -49,9 +49,10 @@ var/global/image/typing_indicator
set name = ".Me"
set hidden = 1
+
set_typing_indicator(1)
hud_typing = 1
- var/message = input("","me (text)") as null|text
+ var/message = typing_input(src, "", "me (text)")
hud_typing = 0
set_typing_indicator(0)
if(message)