diff --git a/code/_onclick/hud/rendering/render_plate.dm b/code/_onclick/hud/rendering/render_plate.dm index 392d8ac535ed..afd061f1907a 100644 --- a/code/_onclick/hud/rendering/render_plate.dm +++ b/code/_onclick/hud/rendering/render_plate.dm @@ -64,21 +64,29 @@ * * relay_plane: plane we are relaying this plane master to */ /atom/movable/screen/plane_master/proc/relay_render_to_plane(mob/mymob, relay_plane) - if(relay in mymob.client.screen) //backdrop can be called multiple times - return + // we may need to regenerate it if(!render_target && generate_render_target) render_target = "*[name]: AUTOGENERATED RENDER TGT" - relay = new() - relay.render_source = render_target - relay.plane = relay_plane - relay.layer = (plane + abs(LOWEST_EVER_PLANE))*0.5 //layer must be positive but can be a decimal + if(relay && render_target != relay.render_target) // our relay target has changed. this will probably never happen but just in case + relay.render_source = render_target + // todo: we may actually need to delete and remake this + if(mymob.client.render_plates_shown[relay]) //backdrop can be called multiple times + return + if(!relay) // don't generate a new one just because we cleared our client's screen + relay = new() + relay.render_source = render_target + relay.plane = relay_plane + relay.layer = (plane + abs(LOWEST_EVER_PLANE))*0.5 //layer must be positive but can be a decimal - if(blend_mode_override) - relay.blend_mode = blend_mode_override - else - relay.blend_mode = blend_mode - relay.mouse_opacity = mouse_opacity - relay.name = render_target + if(blend_mode_override) + relay.blend_mode = blend_mode_override + else + relay.blend_mode = blend_mode + relay.mouse_opacity = mouse_opacity + relay.name = render_target mymob.client.add_to_screen(relay) + // this list is used to check if a plane has already had its relay added + // this is faster than checking membership in `screen`, ideally + mymob.client.render_plates_shown[relay] = TRUE if(blend_mode != BLEND_MULTIPLY) blend_mode = BLEND_DEFAULT diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index 8eddf9a4d39a..ecd51d0887eb 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -136,3 +136,8 @@ /// If this client has any windows scaling applied var/window_scaling + /// An alist used to make checks for whether a render plate has been added to a client's screen faster. + /// render relay plate -> TRUE + /// This must be cleared whenever screen is cleared manually. + var/alist/render_plates_shown = alist() + diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 68b997128ef4..c5110033ba16 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -931,6 +931,7 @@ CLIENT_VERB(fix_stat_panel) continue remove_from_screen(object) + render_plates_shown = alist() ///opens the particle editor UI for the in_atom object for this client /client/proc/open_particle_editor(atom/movable/in_atom) diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index fe2e0ae307f8..15969e6f2621 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -30,7 +30,8 @@ ..() spawn(5) if(brainmob && brainmob.client) - brainmob.client.screen.len = null //clear the hud + brainmob.client.screen.Cut() //clear the hud + brainmob.client.render_plates_shown = alist() /obj/item/organ/brain/proc/transfer_identity(mob/living/carbon/H) name = "[H]'s brain" diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 1bc468915186..b3e66612276a 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -85,8 +85,9 @@ return ..() /mob/living/simple_animal/Login() - if(src && src.client) - src.client.screen = null + if(client) + client.screen = null + client.render_plates_shown = alist() ..() /mob/living/simple_animal/updatehealth() diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index f56bf4cdf0bc..80b5019080b4 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -24,6 +24,7 @@ client.images = null client.screen = null //remove hud items just in case + client.render_plates_shown = alist() if(!hud_used) create_hud() if(hud_used) diff --git a/code/modules/mob/mob_verbs.dm b/code/modules/mob/mob_verbs.dm index 47f233e95b05..301955cb7c36 100644 --- a/code/modules/mob/mob_verbs.dm +++ b/code/modules/mob/mob_verbs.dm @@ -143,6 +143,7 @@ log_game("[usr.key] AM failed due to disconnect.") return client.screen.Cut() + client.render_plates_shown = alist() if(!client) log_game("[usr.key] AM failed due to disconnect.") return diff --git a/code/modules/organs/limb_objects.dm b/code/modules/organs/limb_objects.dm index 434b18634a7a..ccbc08ebf589 100644 --- a/code/modules/organs/limb_objects.dm +++ b/code/modules/organs/limb_objects.dm @@ -134,7 +134,8 @@ overlays += lipstick if(brainmob && brainmob.client) - brainmob.client.screen.len = null //clear the hud + brainmob.client.screen.Cut() //clear the hud + brainmob.client.render_plates_shown = alist() transfer_identity(H)