diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm
index 45953a2e47b..4a1e4f20f98 100644
--- a/code/__DEFINES/hud.dm
+++ b/code/__DEFINES/hud.dm
@@ -55,6 +55,7 @@
#define DATA_HUD_ABDUCTOR 18
#define ANTAG_HUD_DEVIL 19
#define ANTAG_HUD_EVENTMISC 20
+#define ANTAG_HUD_BLOB 21
// Notification action types
#define NOTIFY_JUMP "jump"
diff --git a/code/datums/hud.dm b/code/datums/hud.dm
index e5948a47e30..365a4309413 100644
--- a/code/datums/hud.dm
+++ b/code/datums/hud.dm
@@ -22,7 +22,8 @@ var/datum/atom_hud/huds = list( \
ANTAG_HUD_ABDUCTOR = new/datum/atom_hud/antag/hidden(),\
DATA_HUD_ABDUCTOR = new/datum/atom_hud/abductor(),\
ANTAG_HUD_DEVIL = new/datum/atom_hud/antag/hidden(),\
- ANTAG_HUD_EVENTMISC = new/datum/atom_hud/antag/hidden()\
+ ANTAG_HUD_EVENTMISC = new/datum/atom_hud/antag/hidden(),\
+ ANTAG_HUD_BLOB = new/datum/atom_hud/antag/hidden()\
)
/datum/atom_hud
diff --git a/code/defines/procs/announce.dm b/code/defines/procs/announce.dm
index 3c3906a25eb..3a70d05029e 100644
--- a/code/defines/procs/announce.dm
+++ b/code/defines/procs/announce.dm
@@ -95,7 +95,7 @@
receivers -= M
garbled_receivers |= M
for(var/mob/M in GLOB.dead_mob_list)
- if(M.client && M.stat == DEAD)
+ if(M.client && M.stat == DEAD && !isnewplayer(M))
receivers |= M
return list(receivers, garbled_receivers)
diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm
index 30934a07214..0f8e52a90b2 100644
--- a/code/game/gamemodes/blob/blob.dm
+++ b/code/game/gamemodes/blob/blob.dm
@@ -43,9 +43,11 @@ var/list/blob_nodes = list()
for(var/j = 0, j < cores_to_spawn, j++)
if(!possible_blobs.len)
break
+
var/datum/mind/blob = pick(possible_blobs)
infected_crew += blob
blob.special_role = SPECIAL_ROLE_BLOB
+ update_blob_icons_added(blob)
blob.restricted_roles = restricted_jobs
log_game("[key_name(blob)] has been selected as a Blob")
possible_blobs -= blob
@@ -67,8 +69,11 @@ var/list/blob_nodes = list()
var/datum/mind/blobmind = blob.mind
if(!istype(blobmind))
return 0
+
infected_crew += blobmind
blobmind.special_role = SPECIAL_ROLE_BLOB
+ update_blob_icons_added(blobmind)
+
log_game("[key_name(blob)] has been selected as a Blob")
greet_blob(blobmind)
to_chat(blob, "You feel very tired and bloated! You don't have long before you burst!")
@@ -186,16 +191,21 @@ var/list/blob_nodes = list()
return ..()
/datum/game_mode/blob/proc/stage(var/stage)
-
switch(stage)
if(0)
send_intercept(1)
declared = 1
-
if(1)
event_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg')
-
if(2)
send_intercept(2)
- return
+/datum/game_mode/proc/update_blob_icons_added(datum/mind/mob_mind)
+ var/datum/atom_hud/antag/antaghud = huds[ANTAG_HUD_BLOB]
+ antaghud.join_hud(mob_mind.current)
+ set_antag_hud(mob_mind.current, "hudblob")
+
+/datum/game_mode/proc/update_blob_icons_removed(datum/mind/mob_mind)
+ var/datum/atom_hud/antag/antaghud = huds[ANTAG_HUD_BLOB]
+ antaghud.leave_hud(mob_mind.current)
+ set_antag_hud(mob_mind.current, null)
\ No newline at end of file
diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm
index e93556ca843..2586c63bc91 100644
--- a/code/game/gamemodes/cult/cult_comms.dm
+++ b/code/game/gamemodes/cult/cult_comms.dm
@@ -42,7 +42,7 @@
for(var/mob/M in GLOB.player_list)
if(iscultist(M))
to_chat(M, my_message)
- else if(M in GLOB.dead_mob_list)
+ else if((M in GLOB.dead_mob_list) && !isnewplayer(M))
to_chat(M, " (F) [my_message] ")
log_say("(CULT) [message]", user)
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index 2b027bfeee0..3e313bcac33 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -289,7 +289,7 @@
var/mob/last = get_mob_by_ckey(nadeassembly.fingerprintslast)
var/turf/T = get_turf(src)
var/area/A = get_area(T)
- message_admins("grenade primed by an assembly, attached by [key_name_admin(M)][ADMIN_QUE(M,"(?)")] ([admin_jump_link(M)]) and last touched by [key_name_admin(last)][ADMIN_QUE(last,"(?)")] ([admin_jump_link(last)]) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP). [contained]")
+ message_admins("grenade primed by an assembly, attached by [key_name_admin(M)] and last touched by [key_name_admin(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP). [contained]")
log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] ([T.x], [T.y], [T.z]) [contained]")
update_mob()
@@ -419,7 +419,7 @@
var/mob/last = get_mob_by_ckey(nadeassembly.fingerprintslast)
var/turf/T = get_turf(src)
var/area/A = get_area(T)
- message_admins("grenade primed by an assembly, attached by [key_name_admin(M)][ADMIN_QUE(M,"(?)")] ([ADMIN_FLW(M,"FLW")]) and last touched by [key_name_admin(last)][ADMIN_QUE(last,"(?)")] ([ADMIN_FLW(last,"FLW")]) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP).")
+ message_admins("grenade primed by an assembly, attached by [key_name_admin(M)] and last touched by [key_name_admin(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP).")
log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] ([T.x], [T.y], [T.z])")
else
addtimer(CALLBACK(src, .proc/prime), det_time)
diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm
index 28ca16b9a79..54394411e73 100644
--- a/code/modules/events/blob.dm
+++ b/code/modules/events/blob.dm
@@ -7,21 +7,27 @@
/datum/event/blob/start()
processing = FALSE //so it won't fire again in next tick
+
var/turf/T = pick(blobstart)
if(!T)
return kill()
+
var/list/candidates = pollCandidates("Do you want to play as a blob infested mouse?", ROLE_BLOB, 1)
if(!candidates.len)
return kill()
+
var/list/vents = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in GLOB.all_vent_pumps)
if(is_station_level(temp_vent.loc.z) && !temp_vent.welded)
if(temp_vent.parent.other_atmosmch.len > 50)
vents += temp_vent
+
var/obj/vent = pick(vents)
var/mob/living/simple_animal/mouse/blobinfected/B = new(vent.loc)
var/mob/M = pick(candidates)
B.key = M.key
+ SSticker.mode.update_blob_icons_added(B.mind)
+
to_chat(B, "You are now a mouse, infected with blob spores. Find somewhere isolated... before you burst and become the blob! Use ventcrawl (alt-click on vents) to move around.")
notify_ghosts("Infected Mouse has appeared in [get_area(B)].", source = B)
processing = TRUE // Let it naturally end, if it runs successfully
\ No newline at end of file
diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm
index 419bebfe2c1..52e8918a16c 100644
--- a/code/modules/events/sentience.dm
+++ b/code/modules/events/sentience.dm
@@ -1,6 +1,8 @@
/datum/event/sentience
/datum/event/sentience/start()
+ processing = FALSE //so it won't fire again in next tick
+
var/ghostmsg = "Do you want to awaken as a sentient being?"
var/list/candidates = pollCandidates(ghostmsg, ROLE_SENTIENT, 1)
var/list/potential = list()
@@ -41,6 +43,7 @@
SA.del_on_death = FALSE
greet_sentient(SA)
print_command_report(sentience_report, "[command_name()] Update")
+ processing = TRUE // Let it naturally end, if it runs successfully
/datum/event/sentience/proc/greet_sentient(var/mob/living/carbon/human/M)
to_chat(M, "Hello world!")
diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm
index 989decdb395..304bdc419a2 100644
--- a/code/modules/mob/emote.dm
+++ b/code/modules/mob/emote.dm
@@ -58,19 +58,20 @@
if(message)
log_emote(message, src)
- //Hearing gasp and such every five seconds is not good emotes were not global for a reason.
- // Maybe some people are okay with that.
-
+ // Hearing gasp and such every five seconds is not good emotes were not global for a reason.
+ // Maybe some people are okay with that.
for(var/mob/M in GLOB.player_list)
if(!M.client)
continue //skip monkeys and leavers
- if(istype(M, /mob/new_player))
- continue
- if(findtext(message," snores.")) //Because we have so many sleeping people.
- break
- if(M.stat == DEAD && M.get_preference(CHAT_GHOSTSIGHT) && !(M in viewers(src,null)))
- M.show_message(message)
+ if(isnewplayer(M))
+ continue
+
+ if(findtext(message, " snores.")) //Because we have so many sleeping people.
+ break
+
+ if(isobserver(M) && M.get_preference(CHAT_GHOSTSIGHT) && !(M in viewers(src, null)) && client) // The client check makes sure people with ghost sight don't get spammed by simple mobs emoting.
+ M.show_message(message)
// Type 1 (Visual) emotes are sent to anyone in view of the item
if(m_type & EMOTE_VISUAL)
diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm
index 641450026ba..45d4cda2202 100644
--- a/code/modules/mob/hear_say.dm
+++ b/code/modules/mob/hear_say.dm
@@ -63,10 +63,10 @@
var/datum/gas_mixture/environment = T.return_air()
var/pressure = environment ? environment.return_pressure() : 0
if(pressure < SOUND_MINIMUM_PRESSURE && get_dist(speaker, src) > 1)
- return 0
+ return FALSE
if(pressure < ONE_ATMOSPHERE * 0.4) //sound distortion pressure, to help clue people in that the air is thin, even if it isn't a vacuum yet
- italics = 1
+ italics = TRUE
sound_vol *= 0.5
if(sleeping || stat == UNCONSCIOUS)
@@ -87,8 +87,6 @@
var/track = null
if(isobserver(src))
- if(italics && client.prefs.toggles & CHAT_GHOSTRADIO)
- return
if(speaker_name != speaker.real_name && speaker.real_name)
speaker_name = "[speaker.real_name] ([speaker_name])"
track = "([ghost_follow_link(speaker, ghost=src)]) "
diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm
index 25b188911ad..57725da8eb2 100644
--- a/code/modules/mob/language.dm
+++ b/code/modules/mob/language.dm
@@ -455,6 +455,7 @@
colour = "alien"
key = "y"
flags = RESTRICTED | HIVEMIND
+ follow = TRUE
/datum/language/wryn/check_special_condition(mob/other)
var/mob/living/carbon/M = other
@@ -485,7 +486,7 @@
colour = "alien"
key = "a"
flags = RESTRICTED | HIVEMIND
- follow = 1
+ follow = TRUE
/datum/language/terrorspider
name = "Spider Hivemind"
@@ -496,7 +497,7 @@
colour = "terrorspider"
key = "ts"
flags = RESTRICTED | HIVEMIND
- follow = 1
+ follow = TRUE
/datum/language/ling
name = "Changeling"
@@ -505,10 +506,11 @@
colour = "changeling"
key = "g"
flags = RESTRICTED | HIVEMIND
+ follow = TRUE
/datum/language/ling/broadcast(mob/living/speaker, message, speaker_mask)
if(speaker.mind && speaker.mind.changeling)
- ..(speaker,message,speaker.mind.changeling.changelingID)
+ ..(speaker, message, speaker.mind.changeling.changelingID)
else if(speaker.mind && speaker.mind.linglink)
..()
else
@@ -521,6 +523,7 @@
colour = "shadowling"
key = "8"
flags = RESTRICTED | HIVEMIND
+ follow = TRUE
/datum/language/shadowling/broadcast(mob/living/speaker, message, speaker_mask)
if(speaker.mind && speaker.mind.special_role == SPECIAL_ROLE_SHADOWLING)
@@ -539,6 +542,7 @@
colour = "abductor"
key = "zw" //doesn't matter, this is their default and only language
flags = RESTRICTED | HIVEMIND
+ follow = TRUE
/datum/language/abductor/broadcast(mob/living/speaker, message, speaker_mask)
..(speaker,message,speaker.real_name)
@@ -567,6 +571,7 @@
colour = "alien"
key = "bo"
flags = RESTRICTED | HIVEMIND
+ follow = TRUE
/datum/language/corticalborer/broadcast(mob/living/speaker, message, speaker_mask)
var/mob/living/simple_animal/borer/B
@@ -590,7 +595,7 @@
exclaim_verb = "declares"
key = "b"
flags = RESTRICTED | HIVEMIND
- follow = 1
+ follow = TRUE
var/drone_only
/datum/language/binary/broadcast(mob/living/speaker, message, speaker_mask)
@@ -636,8 +641,8 @@
colour = "say_quote"
key = "d"
flags = RESTRICTED | HIVEMIND
- drone_only = 1
- follow = 1
+ drone_only = TRUE
+ follow = TRUE
/datum/language/drone
name = "Drone"
@@ -647,7 +652,7 @@
exclaim_verb = "declares"
key = "]"
flags = RESTRICTED
- follow = 1
+ follow = TRUE
syllables = list ("beep", "boop")
/datum/language/swarmer
@@ -659,7 +664,7 @@
colour = "say_quote"
key = "z"//Zwarmer...Or Zerg!
flags = RESTRICTED | HIVEMIND
- follow = 1
+ follow = TRUE
// Language handling.
/mob/proc/add_language(language)
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index ee858138f70..69a2e1160b0 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -73,7 +73,11 @@
stat = CONSCIOUS
return
health = maxHealth - getOxyLoss() - getFireLoss() - getBruteLoss() - getCloneLoss()
+
update_stat("updatehealth([reason])")
+ med_hud_set_health()
+ med_hud_set_status()
+ handle_hud_icons_health()
/mob/living/carbon/alien/handle_environment(var/datum/gas_mixture/environment)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
index adf81753827..bf2158ae58e 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
@@ -17,7 +17,7 @@
. = -1 //hunters are sanic
. += ..() //but they still need to slow down on stun
-/mob/living/carbon/alien/humanoid/hunter/handle_regular_hud_updates()
+/mob/living/carbon/alien/humanoid/hunter/handle_hud_icons_health()
..() //-Yvarov
if(healths)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm
index 6a9565fc449..3acb1fe8713 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm
@@ -42,7 +42,7 @@
alien_organs += new /obj/item/organ/internal/xenos/neurotoxin
..()
-/mob/living/carbon/alien/humanoid/sentinel/handle_regular_hud_updates()
+/mob/living/carbon/alien/humanoid/sentinel/handle_hud_icons_health()
..() //-Yvarov
if(healths)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/empress.dm b/code/modules/mob/living/carbon/alien/humanoid/empress.dm
index f5355a38d67..a64602d030c 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/empress.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/empress.dm
@@ -48,29 +48,26 @@
alien_organs += new /obj/item/organ/internal/xenos/neurotoxin
..()
-/mob/living/carbon/alien/humanoid/empress
+/mob/living/carbon/alien/humanoid/empress/handle_hud_icons_health()
+ ..() //-Yvarov
- handle_regular_hud_updates()
-
- ..() //-Yvarov
-
- if(src.healths)
- if(src.stat != 2)
- switch(health)
- if(250 to INFINITY)
- src.healths.icon_state = "health0"
- if(175 to 250)
- src.healths.icon_state = "health1"
- if(100 to 175)
- src.healths.icon_state = "health2"
- if(50 to 100)
- src.healths.icon_state = "health3"
- if(0 to 50)
- src.healths.icon_state = "health4"
- else
- src.healths.icon_state = "health5"
- else
- src.healths.icon_state = "health6"
+ if(healths)
+ if(stat != 2)
+ switch(health)
+ if(250 to INFINITY)
+ healths.icon_state = "health0"
+ if(175 to 250)
+ healths.icon_state = "health1"
+ if(100 to 175)
+ healths.icon_state = "health2"
+ if(50 to 100)
+ healths.icon_state = "health3"
+ if(0 to 50)
+ healths.icon_state = "health4"
+ else
+ healths.icon_state = "health5"
+ else
+ healths.icon_state = "health6"
/mob/living/carbon/alien/humanoid/empress/verb/lay_egg()
set name = "Lay Egg (250)"
diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
index d80d773325e..14124afef3e 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
@@ -32,7 +32,7 @@
. = ..()
. += 3
-/mob/living/carbon/alien/humanoid/queen/handle_regular_hud_updates()
+/mob/living/carbon/alien/humanoid/queen/handle_hud_icons_health()
..() //-Yvarov
if(healths)
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 0c40ca76ea6..219ba9ca9eb 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -946,9 +946,13 @@
// Maybe some people are okay with that.
for(var/mob/M in GLOB.dead_mob_list)
- if(!M.client || istype(M, /mob/new_player))
- continue //skip monkeys, leavers and new players
- if(M.stat == DEAD && M.get_preference(CHAT_GHOSTSIGHT) && !(M in viewers(src,null)))
+ if(!M.client)
+ continue
+
+ if(isnewplayer(M))
+ continue
+
+ if(isobserver(M) && M.get_preference(CHAT_GHOSTSIGHT) && !(M in viewers(src, null)) && client) // The client check makes sure people with ghost sight don't get spammed by simple mobs emoting.
M.show_message(message)
switch(m_type)
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index 276ee7b246e..4909148b492 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -59,8 +59,7 @@
handle_status_effects() //all special effects, stunned, weakened, jitteryness, hallucination, sleeping, etc
if(client)
- //regular_hud_updates() //THIS DOESN'T FUCKING UPDATE SHIT
- handle_regular_hud_updates() //IT JUST REMOVES FUCKING HUD IMAGES
+ handle_regular_hud_updates()
..()
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 95b44b15862..be5187fac5b 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -216,7 +216,7 @@ proc/get_radio_key_from_channel(var/channel)
message_range = 1
if(pressure < ONE_ATMOSPHERE * 0.4) //sound distortion pressure, to help clue people in that the air is thin, even if it isn't a vacuum yet
- italics = 1
+ italics = TRUE
sound_vol *= 0.5 //muffle the sound a bit, so it's like we're actually talking through contact
var/list/hear = hear(message_range, T)
@@ -236,12 +236,20 @@ proc/get_radio_key_from_channel(var/channel)
for(var/mob/M in GLOB.player_list)
if(!M.client)
- continue //skip monkeys and leavers
+ continue
+
if(isnewplayer(M))
continue
- if(M.stat == DEAD && M.client && M.get_preference(CHAT_GHOSTEARS) && client) // client is so that ghosts don't have to listen to mice
- listening |= M
- continue
+
+ if(isobserver(M))
+ if(M.get_preference(CHAT_GHOSTEARS) && client) // The client check is so that ghosts don't have to listen to mice.
+ listening |= M
+ continue
+
+ if(message_range < world.view && (get_dist(T, M) <= world.view))
+ listening |= M
+ continue
+
if(get_turf(M) in hearturfs)
listening |= M
@@ -291,10 +299,13 @@ proc/get_radio_key_from_channel(var/channel)
log_emote(message, src)
for(var/mob/M in GLOB.dead_mob_list)
- if(!M.client || istype(M, /mob/new_player))
- continue //skip monkeys, leavers and new players //who the hell knows why new players are in the dead mob list
+ if(!M.client)
+ continue //skip monkeys and leavers
- if(M.stat == DEAD && M.get_preference(CHAT_GHOSTSIGHT) && !(M in viewers(src,null)))
+ if(isnewplayer(M))
+ continue
+
+ if(isobserver(M) && M.get_preference(CHAT_GHOSTSIGHT) && !(M in viewers(src, null)) && client) // The client check makes sure people with ghost sight don't get spammed by simple mobs emoting.
M.show_message(message)
switch(type)
@@ -380,7 +391,7 @@ proc/get_radio_key_from_channel(var/channel)
var/list/hearturfs = list()
- //Pass whispers on to anything inside the immediate listeners.
+ // Pass whispers on to anything inside the immediate listeners.
// This comes before the ghosts do so that ghosts don't act as whisper relays
for(var/atom/L in listening)
if(ismob(L))
@@ -391,22 +402,26 @@ proc/get_radio_key_from_channel(var/channel)
if(isobj(L))
hearturfs += get_turf(L)
- //ghosts
- for(var/mob/M in GLOB.dead_mob_list) //does this include players who joined as observers as well?
+ // Loop through all players to see if they need to hear it.
+ for(var/mob/M in GLOB.player_list)
if(!M.client)
continue
- if(M.stat == DEAD && M.client && M.get_preference(CHAT_GHOSTEARS))
- listening |= M
- // This, in tandem with "hearturfs", lets nested mobs hear whispers that are in range
- // Grifted from saycode above.
- for(var/mob/M in GLOB.player_list)
- if(!M.client || isnewplayer(M))
- continue //skip monkeys and leavers
+ if(isnewplayer(M))
+ continue
+
+ if(isobserver(M))
+ if(M.get_preference(CHAT_GHOSTEARS)) // The client check is so that ghosts don't have to listen to mice.
+ listening |= M
+ continue
+
+ if(message_range < world.view && (get_dist(whisper_loc, M) <= world.view))
+ listening |= M
+ continue
+
if(get_turf(M) in hearturfs)
listening |= M
-
//pass on the message to objects that can hear us.
for(var/obj/O in view(message_range, whisper_loc))
spawn(0)
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index a26131b9504..efda8f38863 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -482,6 +482,8 @@ var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM)
if(A)
if(O.client.prefs && O.client.prefs.UI_style)
A.icon = ui_style2icon(O.client.prefs.UI_style)
+ if(title)
+ A.name = title
A.desc = message
A.action = action
A.target = source
diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi
index b7f6b5c8f6a..849db6579a5 100644
Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ