Update SSOverlays (ported from Baystation) (#19051)

Our SSOverlays system is outdated, and is likely the cause of many of
the issues seen in #18895. It has also been linked to a massive server
performance decrease.

This brings an updated system from Baystation, hopefully with speed
increases.

Should be testmerged, ideally with #18895.

---------

Co-authored-by: Cody Brittain <cbrittain10@live.com>
This commit is contained in:
Cody Brittain
2024-05-01 07:46:27 +00:00
committed by GitHub
co-authored by Cody Brittain
parent 405a05b819
commit 9983fca311
350 changed files with 1626 additions and 1498 deletions
+7 -7
View File
@@ -357,20 +357,20 @@ GLOBAL_LIST_EMPTY(total_active_bonfires)
name = "[material.display_name] fireplace"
/obj/structure/bonfire/fireplace/update_icon()
cut_overlays()
ClearOverlays()
if(on_fire)
switch(fuel)
if(0 to 250)
add_overlay("fireplace_fire0")
AddOverlays("fireplace_fire0")
if(251 to 750)
add_overlay("fireplace_fire1")
AddOverlays("fireplace_fire1")
if(751 to 1200)
add_overlay("fireplace_fire2")
AddOverlays("fireplace_fire2")
if(1201 to 1700)
add_overlay("fireplace_fire3")
AddOverlays("fireplace_fire3")
if(1700 to 2000)
add_overlay("fireplace_fire4")
add_overlay("fireplace_glow")
AddOverlays("fireplace_fire4")
AddOverlays("fireplace_glow")
/obj/structure/bonfire/fireplace/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
if(!istype(mover) || mover.checkpass(PASSTABLE))
+8 -8
View File
@@ -58,10 +58,10 @@
return ..()
/obj/structure/coatrack/update_icon()
cut_overlays()
ClearOverlays()
if(coat)
if(is_type_in_list(coat, custom_sprites))
add_overlay(coat.icon_state)
AddOverlays(coat.icon_state)
else if(istype(coat, /obj/item/clothing/suit/storage/toggle)) // Using onmob sprites, because they're more consistent than object sprites.
var/obj/item/clothing/suit/storage/toggle/T = coat
if(!T.opened)
@@ -73,7 +73,7 @@
handle_coat_image(T)
if(hat)
if(is_type_in_list(hat, custom_sprites))
add_overlay(hat.icon_state)
AddOverlays(hat.icon_state)
else if(istype(hat, /obj/item/clothing/head))
var/obj/item/clothing/head/H = hat
var/matrix/M = matrix()
@@ -82,15 +82,15 @@
var/hat_icon_state = "[H.icon_state][WORN_HEAD]" // Needed to bypass contained sprite phoney baloney.
hat_image = image(H.icon, hat_icon_state, src.layer, EAST)
if(H.build_from_parts)
hat_image.add_overlay(overlay_image(H.icon, "[H.icon_state]_[H.worn_overlay]", flags=RESET_COLOR))
hat_image.AddOverlays(overlay_image(H.icon, "[H.icon_state]_[H.worn_overlay]", flags=RESET_COLOR))
else
hat_image = image(INV_HEAD_DEF_ICON, H.icon_state, src.layer, EAST)
if(H.build_from_parts)
hat_image.add_overlay(overlay_image(icon, "[INV_HEAD_DEF_ICON]_[H.worn_overlay]", flags=RESET_COLOR))
hat_image.AddOverlays(overlay_image(icon, "[INV_HEAD_DEF_ICON]_[H.worn_overlay]", flags=RESET_COLOR))
M.Turn(90) // Flip the hat over and stick it on the coatrack.
M.Translate(-6, 6)
hat_image.transform = M
add_overlay(hat_image)
AddOverlays(hat_image)
/obj/structure/coatrack/proc/handle_coat_image(var/obj/item/clothing/T)
var/icon/coat_outline = icon('icons/obj/coatrack.dmi', "outline")
@@ -115,8 +115,8 @@
overlay_icon.SwapColor(rgb(255, 0, 220, 255), rgb(0, 0, 0, 0)) // Slice the overlay in half and slap it on the coat.
var/image/overlay_image = image(overlay_icon)
overlay_image.appearance_flags = RESET_COLOR
coat_image.add_overlay(overlay_image)
coat_image.AddOverlays(overlay_image)
M.Translate(-1, 5) // Stick it on the coat rack.
coat_image.transform = M
add_overlay(coat_image)
AddOverlays(coat_image)
@@ -546,21 +546,21 @@
/obj/structure/closet/update_icon()
if(!door_underlay)
cut_overlays()
ClearOverlays()
if(!opened)
layer = OBJ_LAYER
if(welded)
add_overlay("[icon_door_overlay]welded")
AddOverlays("[icon_door_overlay]welded")
if(!is_animating_door)
if(icon_door)
add_overlay("[icon_door]_door")
AddOverlays("[icon_door]_door")
if(double_doors)
add_overlay("[icon_door]_door_alt")
AddOverlays("[icon_door]_door_alt")
if(!icon_door)
add_overlay("[icon_state]_door")
AddOverlays("[icon_state]_door")
if(double_doors)
add_overlay("[icon_state]_door_alt")
AddOverlays("[icon_state]_door_alt")
if(secure)
update_secure_overlays()
if(secure && secure_lights)
@@ -568,18 +568,18 @@
else if(opened)
layer = BELOW_OBJ_LAYER
if(!is_animating_door)
add_overlay("[icon_door_override ? icon_door : icon_state]_open")
AddOverlays("[icon_door_override ? icon_door : icon_state]_open")
if(secure && secure_lights)
update_secure_overlays()
/obj/structure/closet/proc/update_secure_overlays()
if(broken)
add_overlay("[icon_door_overlay]emag")
AddOverlays("[icon_door_overlay]emag")
else
if(locked)
add_overlay("[icon_door_overlay]locked")
AddOverlays("[icon_door_overlay]locked")
else
add_overlay("[icon_door_overlay]unlocked")
AddOverlays("[icon_door_overlay]unlocked")
/obj/structure/closet/proc/animate_door(var/closing = FALSE)
if(!door_anim_time)
@@ -610,7 +610,7 @@
is_animating_door = FALSE // comment this out and the line below to manually tweak the animation end state by fiddling with the door_anim vars to match the open door icon
remove_vis_contents(door_obj)
update_icon()
compile_overlays(src)
UpdateOverlays(src)
/obj/structure/closet/proc/animate_door_alt(var/closing = FALSE)
if(!door_anim_time)
@@ -641,7 +641,7 @@
is_animating_door = FALSE // comment this out and the line below to manually tweak the animation end state by fiddling with the door_anim vars to match the open door icon
remove_vis_contents(door_obj_alt)
update_icon()
compile_overlays(src)
UpdateOverlays(src)
/obj/structure/closet/proc/get_door_transform(angle, var/inverse_hinge = FALSE)
var/matrix/M = matrix()
@@ -24,7 +24,7 @@
update_icon()
/obj/structure/closet/secure_closet/guncabinet/update_icon()
cut_overlays()
ClearOverlays()
var/lazors = 0
var/shottas = 0
for (var/obj/item/gun/G in contents)
@@ -36,10 +36,10 @@
for (var/i = 0 to 2)
if (lazors > 0 && (shottas <= 0 || prob(50)))
lazors--
add_overlay("laser[i]")
AddOverlays("laser[i]")
else if (shottas > 0)
shottas--
add_overlay("projectile[i]")
AddOverlays("projectile[i]")
. = ..()
/obj/structure/closet/secure_closet/guncabinet/sci
@@ -62,7 +62,7 @@
if(!broken)
spark(src, 5)
desc += " It appears to be broken."
add_overlay("[icon_door_overlay]sparking")
AddOverlays("[icon_door_overlay]sparking")
CUT_OVERLAY_IN("[icon_door_overlay]sparking", 6)
playsound(loc, /singleton/sound_category/spark_sound, 60, 1)
broken = TRUE
@@ -183,7 +183,7 @@
dir = L.dir
var/image/I
I = image(icon = 'icons/obj/statue.dmi', icon_state = "icecube")
add_overlay(I)
AddOverlays(I)
/obj/structure/closet/statue/ice/shatter(mob/user as mob)
if (user)
+1 -1
View File
@@ -22,7 +22,7 @@
desc = replacetext(desc, "chemical", lowertext(initial(reagent_id.name)))
var/mutable_appearance/crystal_overlay = mutable_appearance(icon, "[initial(icon_state)]-overlay")
crystal_overlay.color = initial(reagent_id.color)
add_overlay(crystal_overlay)
AddOverlays(crystal_overlay)
if(our_creator)
creator = our_creator
+5 -5
View File
@@ -76,16 +76,16 @@
update_icon()
/obj/structure/extinguisher_cabinet/update_icon()
cut_overlays()
ClearOverlays()
if(has_extinguisher)
if(istype(has_extinguisher, /obj/item/extinguisher/mini))
add_overlay("extinguisher_mini")
AddOverlays("extinguisher_mini")
else
add_overlay("extinguisher_full")
AddOverlays("extinguisher_full")
if(opened)
add_overlay("cabinet_door_open")
AddOverlays("cabinet_door_open")
else
add_overlay("cabinet_door_closed")
AddOverlays("cabinet_door_closed")
/obj/structure/extinguisher_cabinet/do_simple_ranged_interaction(var/mob/user)
if(has_extinguisher)
@@ -46,19 +46,19 @@
update_icon()
/obj/structure/fireaxecabinet/update_icon()
cut_overlays()
ClearOverlays()
if(fireaxe)
add_overlay("axe")
AddOverlays("axe")
if(shattered)
add_overlay("glass4")
AddOverlays("glass4")
if(unlocked)
add_overlay("unlocked")
AddOverlays("unlocked")
else
add_overlay("locked")
AddOverlays("locked")
if(open)
add_overlay("glass_raised")
AddOverlays("glass_raised")
else
add_overlay("glass")
AddOverlays("glass")
/obj/structure/fireaxecabinet/New()
+2 -2
View File
@@ -22,12 +22,12 @@
topple()
/obj/structure/hadii_statue/update_icon()
cut_overlays()
ClearOverlays()
if(toppled)
icon_state = "[initial(icon_state)]_toppled"
return
if(outside)
add_overlay("snow")
AddOverlays("snow")
/obj/structure/hadii_statue/ex_act(severity)
switch(severity)
+9 -9
View File
@@ -331,30 +331,30 @@
updateUsrDialog()
/obj/structure/janitorialcart/update_icon()
cut_overlays()
ClearOverlays()
has_items = 0
if(mybucket)
add_overlay("cart_bucket")
AddOverlays("cart_bucket")
has_items = 1
if(mybucket.reagents.total_volume > 0)
add_overlay("cart_water")
AddOverlays("cart_water")
if(mybag)
add_overlay("cart_garbage")
AddOverlays("cart_garbage")
has_items = 1
if(mymop)
add_overlay("cart_mop")
AddOverlays("cart_mop")
has_items = 1
if(myspray)
add_overlay("cart_spray")
AddOverlays("cart_spray")
has_items = 1
if(myreplacer)
if (istype(myreplacer, /obj/item/device/lightreplacer/advanced))
add_overlay("cart_adv_lightreplacer")
AddOverlays("cart_adv_lightreplacer")
else
add_overlay("cart_replacer")
AddOverlays("cart_replacer")
has_items = 1
if(signs)
add_overlay("cart_sign[signs]")
AddOverlays("cart_sign[signs]")
has_items = 1
//Shamelessly copied from wheelchair code
@@ -31,17 +31,17 @@
if(!istype(victim))
return
cut_overlays()
ClearOverlays()
if(istype(victim, /mob/living/carbon/human))
var/mob/living/carbon/human/H = victim
if(!issmall(H))
return 0
meat_type = H.species.meat_type
add_overlay(overlay_image(icon, "spikebloody"))
AddOverlays(overlay_image(icon, "spikebloody"))
else if(istype(victim, /mob/living/carbon/alien))
var/mob/living/carbon/alien/A = victim
meat_type = A.meat_type
add_overlay(overlay_image(icon, "spikebloodygreen"))
AddOverlays(overlay_image(icon, "spikebloodygreen"))
else
return 0
+2 -2
View File
@@ -155,7 +155,7 @@
/obj/structure/lattice/catwalk/indoor/grate/old/Initialize()
. = ..()
add_overlay("rust")
AddOverlays("rust")
/obj/structure/lattice/catwalk/indoor/grate/damaged
icon_state = "grate_dark_dam0"
@@ -173,7 +173,7 @@
/obj/structure/lattice/catwalk/indoor/grate/light/old/Initialize()
. = ..()
add_overlay("rust")
AddOverlays("rust")
/obj/structure/lattice/catwalk/indoor/grate/light/damaged
icon_state = "grate_light_dam0"
+5 -5
View File
@@ -66,7 +66,7 @@
/obj/structure/utility_pole/street/on/Initialize(mapload)
. = ..()
cut_overlays()
ClearOverlays()
overlays += /obj/effect/overlay/street_light
return
@@ -82,7 +82,7 @@
/obj/structure/utility_pole/street/classic/on/Initialize(mapload)
. = ..()
cut_overlays()
ClearOverlays()
overlays += /obj/effect/overlay/street_light/classic
return
@@ -99,7 +99,7 @@
/obj/structure/utility_pole/street/crosswalk/Initialize(mapload)
. = ..()
cut_overlays()
ClearOverlays()
overlays += /obj/effect/overlay/street_light/crosswalk
return
@@ -119,13 +119,13 @@
/obj/structure/utility_pole/street/traffic/base/Initialize(mapload)
. = ..()
cut_overlays()
ClearOverlays()
overlays += /obj/effect/overlay/street_light/traffic
return
/obj/structure/utility_pole/street/traffic/inverted/Initialize(mapload)
. = ..()
cut_overlays()
ClearOverlays()
overlays += /obj/effect/overlay/street_light/traffic/inverted
return
+2 -2
View File
@@ -35,9 +35,9 @@
update_icon()
/obj/structure/mopbucket/update_icon()
cut_overlays()
ClearOverlays()
if(reagents.total_volume > 0)
add_overlay("mopbucket_water")
AddOverlays("mopbucket_water")
/obj/structure/mopbucket/on_reagent_change()
. = ..()
+2 -2
View File
@@ -31,10 +31,10 @@
var/image/plasticflaps_overlay = overlay_image(icon, "plasticflaps_overlay", null, RESET_COLOR)
if(dir == WEST || dir == EAST)
plasticflaps_overlay.pixel_y = -13
add_overlay(plasticflaps_overlay)
AddOverlays(plasticflaps_overlay)
/obj/structure/plasticflaps/Destroy()
cut_overlays()
ClearOverlays()
if(airtight)
clear_airtight()
. = ..()
+2 -2
View File
@@ -97,12 +97,12 @@ FLOOR SAFES
else
icon_state = initial(icon_state)
cut_overlay(drill_overlay)
CutOverlays(drill_overlay)
if(istype(drill, /obj/item/thermal_drill))
var/drill_icon = istype(drill, /obj/item/thermal_drill/diamond_drill) ? "d" : "h"
var/state = "[initial(icon_state)]_[drill_icon]-drill-[(datum_flags & DF_ISPROCESSING) ? "on" : "off"]"
drill_overlay = image(icon = 'icons/effects/drill.dmi', icon_state = state, pixel_x = drill_x_offset, pixel_y = drill_y_offset)
add_overlay(drill_overlay)
AddOverlays(drill_overlay)
/obj/structure/safe/attack_hand(mob/user as mob)
if(drill)
@@ -78,7 +78,7 @@
generate_strings()
// Prep icon.
icon_state = ""
cut_overlays()
ClearOverlays()
// Base icon.
generate_overlay_cache(material) //Generate base icon cache
@@ -105,7 +105,7 @@
else if(overlay_material.icon_colour) // Either that, or just fall back on the regular material color.
I.color = overlay_material.icon_colour
furniture_cache[cache_key] = I
add_overlay(furniture_cache[cache_key]) // Use image from cache key!
AddOverlays(furniture_cache[cache_key]) // Use image from cache key!
/obj/structure/bed/proc/generate_strings()
if(material_alteration & MATERIAL_ALTERATION_NAME)
@@ -390,7 +390,7 @@
return ..()
/obj/structure/bed/roller/update_icon()
cut_overlays()
ClearOverlays()
vis_contents = list()
if(density)
if(anchored)
@@ -404,15 +404,15 @@
var/percentage = round((beaker.reagents.total_volume / beaker.volume) * 100, 25)
var/image/filling = image(icon, "iv_filling[percentage]")
filling.color = beaker.reagents.get_color()
iv.add_overlay(filling)
iv.AddOverlays(filling)
if(percentage < 25)
iv.add_overlay(image(icon, "light_low"))
iv.AddOverlays(image(icon, "light_low"))
if(density)
iv.pixel_y = 7
add_overlay(iv)
AddOverlays(iv)
if(has_iv_light)
var/image/light = image(icon, "iv[iv_attached]_l")
add_overlay(light)
AddOverlays(light)
if(vitals)
vitals.update_monitor()
add_vis_contents(vitals)
@@ -243,7 +243,7 @@
/obj/item/material/stool/update_icon()
icon_state = "[base_icon]_item"
cut_overlays()
ClearOverlays()
if(padding_material) // Handles padding overlay and inhand overlays.
var/image/padding_overlay = image(icon, "[base_icon]_item_padding")
padding_overlay.appearance_flags = RESET_COLOR
@@ -255,7 +255,7 @@
else if(padding_material.icon_colour)
padding_overlay.color = padding_material.icon_colour
worn_overlay_color = padding_material.icon_colour
add_overlay(padding_overlay)
AddOverlays(padding_overlay)
else
build_from_parts = FALSE
update_held_icon()
@@ -28,17 +28,17 @@
update_icon()
/obj/structure/dispenser/update_icon()
cut_overlays()
ClearOverlays()
switch(oxygen_tanks)
if(1 to 4)
add_overlay("oxygen-[oxygen_tanks]")
AddOverlays("oxygen-[oxygen_tanks]")
if(5 to INFINITY)
add_overlay("oxygen-5")
AddOverlays("oxygen-5")
switch(phoron_tanks)
if(1 to 4)
add_overlay("phoron-[phoron_tanks]")
AddOverlays("phoron-[phoron_tanks]")
if(5 to INFINITY)
add_overlay("phoron-5")
AddOverlays("phoron-5")
/obj/structure/dispenser/attack_ai(mob/user)
if(user.Adjacent(src))
@@ -7,8 +7,8 @@
/obj/structure/undies_wardrobe/Initialize(mapload)
. = ..()
add_overlay("cabinet_door")
add_overlay("cabinet_door_alt")
AddOverlays("cabinet_door")
AddOverlays("cabinet_door_alt")
/obj/structure/undies_wardrobe/attack_hand(var/mob/user)
if(!human_who_can_use_underwear(user))
+2 -2
View File
@@ -9,7 +9,7 @@
/obj/structure/automobile/random/Initialize(mapload)
. = ..()
cut_overlays()
ClearOverlays()
name = "[pick("deluxe Shibata Sport automotive","beat-up Poplar Auto Group automotive","weathered Shibata Sport automotive","beat-up Langenfeld automotive","deluxe Langenfeld automotive","weathered Langenfeld automotive")]"
desc = "A [name] vehicle of working condition."
icon_state = "car[rand(1, 10)]"
@@ -449,7 +449,7 @@
/obj/structure/sign/billboard/advert/random/Initialize(mapload)
. = ..()
cut_overlays()
ClearOverlays()
icon_state = "sign[rand(1, 14)]"
return
@@ -47,7 +47,7 @@
if(H.old_mob)
to_chat(H, SPAN_WARNING("The chair rejects you! You cannot recursively control bodies."))
return
add_overlay(image('icons/obj/furniture.dmi', src, "vr_helmet", FLY_LAYER))
AddOverlays(image('icons/obj/furniture.dmi', src, "vr_helmet", FLY_LAYER))
START_PROCESSING(SSprocessing, src)
@@ -64,6 +64,6 @@
var/mob/M = buckled
if(istype(M) && M.vr_mob)
M.vr_mob.body_return()
cut_overlays()
ClearOverlays()
STOP_PROCESSING(SSprocessing, src)
..()
+2 -2
View File
@@ -185,13 +185,13 @@
add_fingerprint(user)
/obj/machinery/shower/update_icon() //this is terribly unreadable, but basically it makes the shower mist up
cut_overlays() //once it's been on for a while, in addition to handling the water overlay.
ClearOverlays() //once it's been on for a while, in addition to handling the water overlay.
if(mymist)
qdel(mymist)
if(on)
soundloop.start(src)
add_overlay(image('icons/obj/watercloset.dmi', src, "water", MOB_LAYER + 1, dir))
AddOverlays(image('icons/obj/watercloset.dmi', src, "water", MOB_LAYER + 1, dir))
if(temperature_settings[watertemp] < T20C)
return //no mist for cold water
if(!ismist)
+2 -2
View File
@@ -104,12 +104,12 @@
updateSilicate()
/obj/structure/window/proc/updateSilicate()
cut_overlays()
ClearOverlays()
var/image/img = image(icon, icon_state)
img.color = "#ffffff"
img.alpha = silicate * 255 / 100
add_overlay(img)
AddOverlays(img)
/obj/structure/window/proc/shatter(var/display_message = 1)
playsound(src, /singleton/sound_category/glass_break_sound, 70, 1)