diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm
index e35e4a6eb22..d2d0be60f37 100644
--- a/code/game/verbs/ooc.dm
+++ b/code/game/verbs/ooc.dm
@@ -69,19 +69,22 @@
set category = "OOC"
if(say_disabled) //This is here to try to identify lag problems
- usr << "\red Speech is currently admin-disabled."
+ usr << "Speech is currently admin-disabled."
+ return
+
+ if(!mob)
return
- if(!mob) return
if(IsGuestKey(key))
src << "Guests may not use OOC."
return
msg = sanitize(msg)
- if(!msg) return
+ if(!msg)
+ return
if(!(prefs.toggles & CHAT_LOOC))
- src << "\red You have LOOC muted."
+ src << "You have LOOC muted."
return
if(!holder)
@@ -94,7 +97,7 @@
if(prefs.muted & MUTE_OOC)
src << "You cannot use OOC (muted)."
return
- if(handle_spam_prevention(msg,MUTE_OOC))
+ if(handle_spam_prevention(msg, MUTE_OOC))
return
if(findtext(msg, "byond://"))
src << "Advertising other servers is not allowed."
@@ -104,26 +107,48 @@
log_ooc("(LOCAL) [mob.name]/[key] : [msg]")
- var/mob/source = src.mob
+ var/mob/source = mob.get_looc_source()
var/list/heard = get_mobs_or_objects_in_view(7, source, 1, 0)
- var/display_name = source.key
+ var/display_name = key
if(holder && holder.fakekey)
display_name = holder.fakekey
- if(source.stat != DEAD)
- display_name = source.name
+ if(mob.stat != DEAD)
+ display_name = mob.name
- var/prefix
- var/admin_stuff
for(var/client/target in clients)
if(target.prefs.toggles & CHAT_LOOC)
- admin_stuff = ""
+ var/prefix = ""
+ var/admin_stuff = ""
+ var/send = 0
+
if(target in admins)
- prefix = "(R)"
- admin_stuff += "/([source.key])"
- if(target != source.client)
+ admin_stuff += "/([key])"
+ if(target != src)
admin_stuff += "(JMP)"
+
if(target.mob in heard)
- prefix = ""
- if((target.mob in heard) || (target in admins))
+ send = 1
+ if(isAI(target.mob))
+ prefix = "(Core) "
+
+ else if(isAI(target.mob)) // Special case
+ var/mob/living/silicon/ai/A = target.mob
+ if(A.eyeobj in hearers(7, source))
+ send = 1
+ prefix = "(Eye) "
+
+ if(!send && (target in admins))
+ send = 1
+ prefix = "(R)"
+
+ if(send)
target << "" + create_text_tag("looc", "LOOC:", target) + " [prefix][display_name][admin_stuff]: [msg]"
+
+/mob/proc/get_looc_source()
+ return src
+
+/mob/living/silicon/ai/get_looc_source()
+ if(eyeobj)
+ return eyeobj
+ return src
diff --git a/html/changelogs/Kelenius-ofAIAndLooc.yml b/html/changelogs/Kelenius-ofAIAndLooc.yml
new file mode 100644
index 00000000000..66603340028
--- /dev/null
+++ b/html/changelogs/Kelenius-ofAIAndLooc.yml
@@ -0,0 +1,4 @@
+author: Kelenius
+delete-after: True
+changes:
+ - tweak: "AI now hears LOOC both around its eye and its core, and speaks in LOOC around its eye. Keep in mind that you won't hear and won't be heard if there is a wall between your eye and the target."