Files
Pickle-Coding 73153cafe4 Welding fuel is no longer ignited by kisses. (#94009)
Achieves this by requiring the projectile to do damage to ignite.

## About The Pull Request
Achieves this by requiring the projectile to do damage to ignite.

## Why It's Good For The Game
Closes #93990

## Changelog

🆑
fix: Fixes welding fuel being ignited by kisses.
/🆑

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
Co-authored-by: mrmanlikesbt <99309552+mrmanlikesbt@users.noreply.github.com>
2025-11-19 01:43:42 +00:00

115 lines
3.9 KiB
Plaintext

/obj/effect/decal/cleanable/fuel_pool
name = "pool of fuel"
desc = "A pool of flammable fuel. Its probably wise to clean this off before something ignites it..."
icon_state = "fuel_pool"
beauty = -50
clean_type = CLEAN_TYPE_BLOOD
mouse_opacity = MOUSE_OPACITY_OPAQUE
resistance_flags = UNACIDABLE | ACID_PROOF | FIRE_PROOF | FLAMMABLE //gross way of doing this but would need to disassemble fire_act call stack otherwise
/// Maximum amount of hotspots this pool can create before deleting itself
var/burn_amount = 3
/// Is this fuel pool currently burning?
var/burning = FALSE
/// Type of hotspot fuel pool spawns upon being ignited
var/hotspot_type = /obj/effect/hotspot
/obj/effect/decal/cleanable/fuel_pool/Initialize(mapload, burn_stacks)
. = ..()
var/static/list/loc_connections = list(
COMSIG_TURF_MOVABLE_THROW_LANDED = PROC_REF(ignition_trigger),
COMSIG_ATOM_ENTERED = PROC_REF(on_entered)
)
AddElement(/datum/element/connect_loc, loc_connections)
for(var/obj/effect/decal/cleanable/fuel_pool/pool in get_turf(src)) //Can't use locate because we also belong to that turf
if(pool == src)
continue
pool.burn_amount = max(min(pool.burn_amount + burn_stacks, 10), 1)
return INITIALIZE_HINT_QDEL
if(burn_stacks)
burn_amount = max(min(burn_stacks, 10), 1)
return INITIALIZE_HINT_LATELOAD
// Just in case of fires, do this after mapload.
/obj/effect/decal/cleanable/fuel_pool/LateInitialize()
// We don't want to burn down the create_and_destroy test area
#ifndef UNIT_TESTS
RegisterSignal(src, COMSIG_ATOM_TOUCHED_SPARKS, PROC_REF(ignition_trigger))
#endif
/obj/effect/decal/cleanable/fuel_pool/fire_act(exposed_temperature, exposed_volume)
. = ..()
ignite()
/**
* Ignites the fuel pool. This should be the only way to ignite fuel pools.
*/
/obj/effect/decal/cleanable/fuel_pool/proc/ignite()
if(burning)
return
burning = TRUE
burn_process()
/**
* Spends 1 burn_amount and spawns a hotspot. If burn_amount is equal to 0, deletes the fuel pool.
* Else, queues another call of this proc upon hotspot getting deleted and ignites other fuel pools around itself after 0.5 seconds.
* THIS SHOULD NOT BE CALLED DIRECTLY.
*/
/obj/effect/decal/cleanable/fuel_pool/proc/burn_process()
SIGNAL_HANDLER
burn_amount -= 1
var/obj/effect/hotspot/hotspot = new hotspot_type(get_turf(src))
addtimer(CALLBACK(src, PROC_REF(ignite_others)), 0.5 SECONDS)
if(!burn_amount)
qdel(src)
return
RegisterSignal(hotspot, COMSIG_QDELETING, PROC_REF(burn_process))
/**
* Ignites other oil pools around itself.
*/
/obj/effect/decal/cleanable/fuel_pool/proc/ignite_others()
for(var/obj/effect/decal/cleanable/fuel_pool/oil in range(1, get_turf(src)))
oil.ignite()
/obj/effect/decal/cleanable/fuel_pool/bullet_act(obj/projectile/hit_proj)
. = ..()
if(hit_proj.damage > 0)
ignite()
log_combat(hit_proj.firer, src, "used [hit_proj] to ignite")
/obj/effect/decal/cleanable/fuel_pool/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(item.ignition_effect(src, user))
ignite()
log_combat(user, src, "used [item] to ignite")
return ..()
/obj/effect/decal/cleanable/fuel_pool/proc/on_entered(datum/source, atom/movable/entered_atom)
SIGNAL_HANDLER
if(!entered_atom.throwing) // don't light from things being thrown over us, we handle that somewhere else
ignition_trigger(source = src, enflammable_atom = entered_atom)
/obj/effect/decal/cleanable/fuel_pool/proc/ignition_trigger(datum/source, atom/movable/enflammable_atom)
SIGNAL_HANDLER
if(isitem(enflammable_atom))
var/obj/item/enflamed_item = enflammable_atom
if(enflamed_item.get_temperature() > FIRE_MINIMUM_TEMPERATURE_TO_EXIST)
ignite()
return
else if(isliving(enflammable_atom))
var/mob/living/enflamed_liver = enflammable_atom
if(enflamed_liver.on_fire)
ignite()
else if(istype(enflammable_atom, /obj/effect/particle_effect/sparks))
ignite()
/obj/effect/decal/cleanable/fuel_pool/hivis
icon_state = "fuel_pool_hivis"