From c9edd15f2c886843a871a3e47208231c2846871d Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Fri, 19 Jun 2026 19:44:04 +0200 Subject: [PATCH] Makes fire overlay properly mask when using mining sphere MODule (#96578) ## About The Pull Request Currently the overlay doesn't get masked as it is KEEP_APART and you end up with a janky fire blender visual dreamseeker_NyvaUAPHnw (Overlay update delay has been fixed after recording) Not cached because its a single mob and the cost of updating said overlay is minimal ## Changelog :cl: fix: Made fire overlay properly mask when using mining sphere MODule /:cl: --- .../signals/signals_mob/signals_mob_carbon.dm | 2 ++ .../mob/living/carbon/carbon_update_icons.dm | 24 ++++++++++++------- code/modules/mod/modules/modules_supply.dm | 17 ++++++++++++- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm index 70642a4d6b4..88f42591944 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm @@ -121,6 +121,8 @@ #define COMSIG_CARBON_REMOVE_OVERLAY "carbon_remove_overlay" ///Called when a carbon checks their mood #define COMSIG_CARBON_MOOD_CHECK "carbon_mod_check" +///Called when a carbon is adding a fire overlay +#define COMSIG_CARBON_GET_FIRE_OVERLAY "carbon_get_fire_overlay" // /mob/living/carbon/human signals diff --git a/code/modules/mob/living/carbon/carbon_update_icons.dm b/code/modules/mob/living/carbon/carbon_update_icons.dm index 6ad271d27fb..bb6e71ebc0c 100644 --- a/code/modules/mob/living/carbon/carbon_update_icons.dm +++ b/code/modules/mob/living/carbon/carbon_update_icons.dm @@ -260,17 +260,25 @@ hands += I.build_worn_icon(default_layer = HANDS_LAYER, default_icon_file = icon_file, isinhands = TRUE, bodyshape = bodyshape) return hands +/mob/living/carbon/proc/get_fire_icon_state(stacks, on_fire) + return "[dna?.species.fire_overlay || "human"]_[stacks > MOB_BIG_FIRE_STACK_THRESHOLD ? "big_fire" : "small_fire"]" + /mob/living/carbon/get_fire_overlay(stacks, on_fire) - var/fire_icon = "[dna?.species.fire_overlay || "human"]_[stacks > MOB_BIG_FIRE_STACK_THRESHOLD ? "big_fire" : "small_fire"]" + var/fire_icon = get_fire_icon_state(stacks, on_fire) + var/list/overrides = list() + SEND_SIGNAL(src, COMSIG_CARBON_GET_FIRE_OVERLAY, stacks, on_fire, fire_icon, overrides) + if (length(overrides)) + return overrides[1] - if(!GLOB.fire_appearances[fire_icon]) - GLOB.fire_appearances[fire_icon] = mutable_appearance( - 'icons/mob/effects/onfire.dmi', - fire_icon, - -HIGHEST_LAYER, - appearance_flags = RESET_COLOR|KEEP_APART, - ) + if(GLOB.fire_appearances[fire_icon]) + return GLOB.fire_appearances[fire_icon] + GLOB.fire_appearances[fire_icon] = mutable_appearance( + 'icons/mob/effects/onfire.dmi', + fire_icon, + -HIGHEST_LAYER, + appearance_flags = RESET_COLOR|KEEP_APART, + ) return GLOB.fire_appearances[fire_icon] /mob/living/carbon/update_damage_overlays() diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm index 976111bd849..8c679440668 100644 --- a/code/modules/mod/modules/modules_supply.dm +++ b/code/modules/mod/modules/modules_supply.dm @@ -658,6 +658,8 @@ mod.wearer.add_movespeed_mod_immunities(REF(src), /datum/movespeed_modifier/damage_slowdown) mod.wearer.add_movespeed_modifier(/datum/movespeed_modifier/sphere) RegisterSignal(mod.wearer, COMSIG_MOB_STATCHANGE, PROC_REF(on_statchange)) + RegisterSignal(mod.wearer, COMSIG_CARBON_GET_FIRE_OVERLAY, PROC_REF(replace_fire_overlay)) + mod.wearer.update_appearance(UPDATE_ICON) for(var/obj/item/part as anything in mod.get_parts(all = TRUE)) part.set_armor(part.get_armor().add_other_armor(armor_mod)) @@ -672,10 +674,23 @@ mod.wearer.RemoveElement(/datum/element/footstep, FOOTSTEP_OBJ_ROBOT, 1, -6, sound_vary = TRUE) mod.wearer.AddElement(/datum/element/footstep, FOOTSTEP_MOB_HUMAN, 1, -6) mod.wearer.remove_movespeed_modifier(/datum/movespeed_modifier/sphere) - UnregisterSignal(mod.wearer, COMSIG_MOB_STATCHANGE) + UnregisterSignal(mod.wearer, list(COMSIG_MOB_STATCHANGE, COMSIG_CARBON_GET_FIRE_OVERLAY)) + mod.wearer.update_appearance(UPDATE_ICON) for(var/obj/item/part as anything in mod.get_parts(all = TRUE)) part.set_armor(part.get_armor().subtract_other_armor(armor_mod)) +/obj/item/mod/module/sphere_transform/proc/replace_fire_overlay(datum/source, stacks, on_fire, fire_icon, list/overrides) + SIGNAL_HANDLER + + var/mutable_appearance/fire_overlay = mutable_appearance( + 'icons/mob/effects/onfire.dmi', + fire_icon, + -HIGHEST_LAYER, + appearance_flags = RESET_COLOR|KEEP_APART, + ) + fire_overlay.add_filter("mod_ball", 1, alpha_mask_filter(icon = icon('icons/mob/clothing/modsuit/mod_modules.dmi', "ball_mask"), flags = MASK_INVERSE)) + overrides += fire_overlay + /obj/item/mod/module/sphere_transform/used(mob/activator) if(!lavaland_equipment_pressure_check(get_turf(src))) balloon_alert(activator, "too much pressure!")