diff --git a/code/__defines/_planes+layers.dm b/code/__defines/_planes+layers.dm index 8084f3339b..91822df4df 100644 --- a/code/__defines/_planes+layers.dm +++ b/code/__defines/_planes+layers.dm @@ -94,3 +94,7 @@ What is the naming convention for planes or layers? /atom/proc/reset_plane_and_layer() plane = initial(plane) layer = initial(layer) + + +// Check if a mob can "logically" see an atom plane +#define MOB_CAN_SEE_PLANE(M, P) (P == PLANE_WORLD || (P >= OPENSPACE_PLANE_START && P <= OPENSPACE_PLANE_END) || (P in M.planes_visible)) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index dec7ab1ccf..14db679588 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -476,7 +476,7 @@ its easier to just keep the beam vertical. O.show_message(message, 1, blind_message, 2) else if(ismob(I)) var/mob/M = I - if(M.see_invisible >= invisibility) // Cannot view the invisible + if(M.see_invisible >= invisibility && MOB_CAN_SEE_PLANE(M, plane)) // Cannot view the invisible M.show_message(message, 1, blind_message, 2) else if (blind_message) M.show_message(blind_message, 2) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index ee0aa2660a..a3ccd10b2e 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -181,6 +181,9 @@ Please contact me on #coderbus IRC. ~Carn x ma_compiled.transform = M ma_compiled.layer = MOB_LAYER //VOREStation Edit. Unset laying layer. UNLEWD. + //4.5 Set layer to PLANE_WORLD to make sure its not magically FLOAT_PLANE due to byond madness + ma_compiled.plane = PLANE_WORLD + //5: Set appearance once appearance = ma_compiled diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index b8513611a0..109895a45c 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -94,7 +94,7 @@ var/mob/M = I if(self_message && M==src) M.show_message( self_message, 1, blind_message, 2) - else if(M.see_invisible >= invisibility) // Cannot view the invisible + else if(M.see_invisible >= invisibility && MOB_CAN_SEE_PLANE(M, plane)) // Cannot view the invisible M.show_message( message, 1, blind_message, 2) else if (blind_message) M.show_message(blind_message, 2) @@ -244,6 +244,7 @@ var/obj/P = new /obj/effect/decal/point(tile) P.invisibility = invisibility + P.plane = plane spawn (20) if(P) qdel(P) // qdel diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index d20045e55e..0110c263d2 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -35,7 +35,8 @@ var/obj/screen/wizard/instability/wiz_instability_display = null var/datum/plane_holder/plane_holder = null - var/list/vis_enabled = null + var/list/vis_enabled = null // List of vision planes that should be graphically visible (list of their VIS_ indexes). + var/list/planes_visible = null // List of atom planes that are logically visible/interactable (list of actual plane numbers). //spells hud icons - this interacts with add_spell and remove_spell var/list/obj/screen/movable/spell_master/spell_masters = null diff --git a/code/modules/mob/mob_planes.dm b/code/modules/mob/mob_planes.dm index e5f10078fd..947619a2b2 100644 --- a/code/modules/mob/mob_planes.dm +++ b/code/modules/mob/mob_planes.dm @@ -51,6 +51,11 @@ var/list/subplanes = PM.sub_planes for(var/SP in subplanes) set_vis(which = SP, state = state) + var/plane = PM.plane + if(state && !(plane in my_mob.planes_visible)) + LAZYADD(my_mob.planes_visible, plane) + else if(!state && (plane in my_mob.planes_visible)) + LAZYREMOVE(my_mob.planes_visible, plane) /datum/plane_holder/proc/set_desired_alpha(var/which = null, var/new_alpha) ASSERT(which) @@ -137,7 +142,6 @@ plane = PLANE_GHOSTS desired_alpha = 127 //When enabled, they're like half-transparent - //'Normal'ness v v v //Various types of colorblindness R2R R2G R2B G2R G2G G2B B2R B2G B2B #define MATRIX_Monochromia list(0.33, 0.33, 0.33, 0.59, 0.59, 0.59, 0.11, 0.11, 0.11)