diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm
index bbdda98a056..a67708c97ac 100644
--- a/code/datums/emotes.dm
+++ b/code/datums/emotes.dm
@@ -127,6 +127,18 @@
if(ghost.stat == DEAD && ghost.client && user.client && (ghost.client.prefs.chat_toggles & CHAT_GHOSTSIGHT) && !(ghost in viewers(user_turf, null)))
ghost.show_message("[FOLLOW_LINK(ghost, user)] [dchatmsg]")
+ //SKYRAT EDIT ADDITION BEGIN - AI QoL
+ for(var/mob/ai in GLOB.ai_list)
+ //ai.show_message("[!(ai.stat == DEAD)]")
+ var/aiEye_turf
+ for(var/mob/camera/ai_eye/AI_eye as anything in GLOB.aiEyes)
+ aiEye_turf = get_turf(AI_eye)
+ if(!ai.client)
+ continue
+ if(!(ai.stat == DEAD) && ai.client && (get_dist(user_turf, aiEye_turf)<8))
+ ai.show_message("[dchatmsg]")
+ //SKYRAT EDIT ADDITION END - AI QoL
+
if(emote_type == EMOTE_AUDIBLE)
user.audible_message(msg, deaf_message = "You see how [user] [msg]", audible_message_flags = EMOTE_MESSAGE)
else
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 966459a9d96..fe58f5d7786 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -201,6 +201,38 @@ Possible to do for anyone motivated enough:
else if(in_range(user, src) || isobserver(user))
. += span_notice("The status display reads: Current projection range: [holo_range] units.")
+ //SKYRAT EDIT ADDITION BEGIN - AI QoL
+ var/obj/effect/overlay/holo_pad_hologram/holo
+ var/line
+ var/mob/living/silicon/ai/aiPlayer
+ for(var/mob/living/silicon/ai/master in masters)
+ if(masters[master])
+ holo = masters[master]
+ if(LAZYLEN(masters))
+ for(var/I in masters)
+ var/mob/living/master = I
+ var/mob/living/silicon/ai/AI = master
+ if(!istype(AI))
+ AI = null
+ else
+ aiPlayer = AI
+ if(aiPlayer)
+ if(aiPlayer.client)
+ if(length(aiPlayer.client.prefs.features["silicon_flavor_text"]))
+ var/message = aiPlayer.client.prefs.features["silicon_flavor_text"]
+ if(length_char(message) <= 40)
+ line = "[message]"
+ else
+ line = "[copytext_char(message, 1, 37)]... More..."
+ line += " \[OOC\]"
+ if(LAZYLEN(masters))
+ if(holo.Impersonation)
+ . += holo.Impersonation.examine(user)
+ else
+ . += "*---------*\nThis is [aiPlayer.name].\n*---------*"
+ . += line
+ //SKYRAT EDIT ADDITION END - AI QoL
+
/obj/machinery/holopad/attackby(obj/item/P, mob/user, params)
if(default_deconstruction_screwdriver(user, "holopad_open", "holopad0", P))
return
diff --git a/modular_skyrat/modules/verbs/code/modules/client/verbs/looc.dm b/modular_skyrat/modules/verbs/code/modules/client/verbs/looc.dm
index 63f5bd8fecd..ceb3e812a49 100644
--- a/modular_skyrat/modules/verbs/code/modules/client/verbs/looc.dm
+++ b/modular_skyrat/modules/verbs/code/modules/client/verbs/looc.dm
@@ -39,6 +39,24 @@
mob.log_talk(msg,LOG_OOC, tag="LOOC")
var/list/heard = get_hearers_in_view(7, get_top_level_mob(src.mob))
+
+ //SKYRAT EDIT ADDITION BEGIN - AI QoL
+ var/ai_heard_it = FALSE
+ //so the ai can post looc text
+ if(istype(mob,/mob/living/silicon/ai))
+ for(var/mob/camera/ai_eye/eye_of_ai as anything in GLOB.aiEyes)
+ heard = get_hearers_in_view(7, eye_of_ai)
+ //so the ai can see looc text
+ for(var/mob/camera/ai_eye/eye_of_ai as anything in GLOB.aiEyes)
+ for(var/mob/creature in heard) //checks if an ai has already heard it
+ if(istype(creature, /mob/living/silicon/ai))
+ ai_heard_it = TRUE
+ if(ai_heard_it == FALSE) //i dont wanna run an entire fuckin for loop if it turns out the ai can already see the text
+ for(var/mob/creature in heard)
+ if(creature == eye_of_ai)
+ heard += get_top_level_mob(src.mob)
+ //SKYRAT EDIT ADDITION END - AI QoL
+
var/list/admin_seen = list()
for(var/mob/M in heard)
if(!M.client)