diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm
index 2a0f3b6607..793df9dc43 100644
--- a/code/game/verbs/ooc.dm
+++ b/code/game/verbs/ooc.dm
@@ -37,6 +37,8 @@
log_ooc("[mob.name]/[key] : [msg]")
+ handle_spam_prevention(MUTE_OOC)
+
var/ooc_style = "everyone"
if(holder && !holder.fakekey)
ooc_style = "elevated"
@@ -105,6 +107,8 @@
log_ooc("(LOCAL) [mob.name]/[key] : [msg]")
+ handle_spam_prevention(MUTE_OOC)
+
var/mob/source = mob.get_looc_source()
var/turf/T = get_turf(source)
if(!T) return
@@ -137,7 +141,7 @@
// Send a message
for(var/client/target in receivers)
var/admin_stuff = ""
-
+
if(target in admins)
admin_stuff += "/([key])"
@@ -145,7 +149,7 @@
for(var/client/target in r_receivers)
var/admin_stuff = "/([key])([admin_jump_link(mob, target.holder)])"
-
+
target << "" + create_text_tag("looc", "LOOC:", target) + " (R)[display_name][admin_stuff]: [msg]"
/mob/proc/get_looc_source()
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index 8f8532590e..90d9c9d275 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -17,6 +17,8 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
adminhelped = 1 //Determines if they get the message to reply by clicking the name.
+ handle_spam_prevention(MUTE_ADMINHELP)
+
//clean the input msg
if(!msg)
return
diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm
index 1307086a87..64640b10b6 100644
--- a/code/modules/admin/verbs/pray.dm
+++ b/code/modules/admin/verbs/pray.dm
@@ -10,6 +10,7 @@
if(!msg) return
if(usr.client)
+ client.handle_spam_prevention(MUTE_PRAY)
if(usr.client.prefs.muted & MUTE_PRAY)
usr << "\red You cannot pray (muted)."
return
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 662b945b33..251dec5fb1 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -158,7 +158,8 @@
proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0)
if(automute)
- if(!config.automute_on) return
+ if(!config.automute_on)
+ return
else
if(!usr || !usr.client)
return
@@ -169,8 +170,10 @@ proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0)
usr << "Error: cmd_admin_mute: This mob doesn't have a client tied to it."
if(M.client.holder)
usr << "Error: cmd_admin_mute: You cannot mute an admin/mod."
- if(!M.client) return
- if(M.client.holder) return
+ if(!M.client)
+ return
+ if(M.client.holder)
+ return
var/muteunmute
var/mute_string
diff --git a/code/modules/client/spam_prevention.dm b/code/modules/client/spam_prevention.dm
new file mode 100644
index 0000000000..68ffa12ff7
--- /dev/null
+++ b/code/modules/client/spam_prevention.dm
@@ -0,0 +1,13 @@
+// Based on Aurora's anti-spam system.
+/client/
+ var/last_message_time = 0
+ var/spam_alert = 0
+
+/client/proc/handle_spam_prevention(var/mute_type = MUTE_ALL, var/spam_delay = 1 SECOND)
+ if(world.time - last_message_time < spam_delay)
+ spam_alert++
+ if(spam_alert > 3)
+ cmd_admin_mute(src.mob, mute_type, 1)
+ else
+ spam_alert = max(0, spam_alert--)
+ last_message_time = world.time
\ No newline at end of file
diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm
index ada597f46b..4d348c8d71 100644
--- a/code/modules/mob/dead/observer/say.dm
+++ b/code/modules/mob/dead/observer/say.dm
@@ -7,6 +7,7 @@
log_say("Ghost/[src.key] : [message]")
if (src.client)
+ client.handle_spam_prevention(MUTE_DEADCHAT)
if(src.client.prefs.muted & MUTE_DEADCHAT)
src << "\red You cannot talk in deadchat (muted)."
return
@@ -26,6 +27,7 @@
log_emote("Ghost/[src.key] : [message]")
if(src.client)
+ client.handle_spam_prevention(MUTE_DEADCHAT)
if(src.client.prefs.muted & MUTE_DEADCHAT)
src << "\red You cannot emote in deadchat (muted)."
return
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index ed6ae3358c..c7856f5082 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -131,6 +131,7 @@ proc/get_radio_key_from_channel(var/channel)
/mob/living/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/whispering = 0)
//If you're muted for IC chat
if(client)
+ client.handle_spam_prevention(MUTE_IC)
if((client.prefs.muted & MUTE_IC) || say_disabled)
src << "You cannot speak in IC (Muted)."
return
diff --git a/polaris.dme b/polaris.dme
index db14ac1bd1..3a3bd0d13a 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -1143,6 +1143,7 @@
#include "code\modules\client\preferences_savefile.dm"
#include "code\modules\client\preferences_spawnpoints.dm"
#include "code\modules\client\preferences_toggle_procs.dm"
+#include "code\modules\client\spam_prevention.dm"
#include "code\modules\client\ui_style.dm"
#include "code\modules\client\preference_setup\_defines.dm"
#include "code\modules\client\preference_setup\preference_setup.dm"