diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm
index b4145ce3dee..d1cbcd04c50 100644
--- a/code/__DEFINES/components.dm
+++ b/code/__DEFINES/components.dm
@@ -186,6 +186,7 @@
#define COMPONENT_ITEM_NO_ATTACK 1
#define COMSIG_MOB_APPLY_DAMGE "mob_apply_damage" //from base of /mob/living/proc/apply_damage(): (damage, damagetype, def_zone)
#define COMSIG_MOB_ITEM_AFTERATTACK "mob_item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, proximity_flag, click_parameters)
+#define COMSIG_MOB_ITEM_ATTACK_QDELETED "mob_item_attack_qdeleted" //from base of obj/item/attack_qdeleted(): (atom/target, mob/user, proxiumity_flag, click_parameters)
#define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged" //from base of mob/RangedAttack(): (atom/A, params)
#define COMSIG_MOB_THROW "mob_throw" //from base of /mob/throw_item(): (atom/target)
#define COMSIG_MOB_EXAMINATE "mob_examinate" //from base of /mob/verb/examinate(): (atom/target)
@@ -250,6 +251,7 @@
#define COMSIG_ITEM_PRE_ATTACK "item_pre_attack" //from base of obj/item/pre_attack(): (atom/target, mob/user, params)
#define COMPONENT_NO_ATTACK 1
#define COMSIG_ITEM_AFTERATTACK "item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, params)
+#define COMSIG_ITEM_ATTACK_QDELETED "item_attack_qdeleted" //from base of obj/item/attack_qdeleted(): (atom/target, mob/user, params)
#define COMSIG_ITEM_EQUIPPED "item_equip" //from base of obj/item/equipped(): (/mob/equipper, slot)
#define COMSIG_ITEM_DROPPED "item_drop" //from base of obj/item/dropped(): (mob/user)
#define COMSIG_ITEM_PICKUP "item_pickup" //from base of obj/item/pickup(): (/mob/taker)
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 51872d06120..99194a4f52a 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -15,6 +15,7 @@
if(target.attackby(src,user, params))
return
if(QDELETED(src) || QDELETED(target))
+ attack_qdeleted(target, user, TRUE, params)
return
afterattack(target, user, TRUE, params)
@@ -117,6 +118,10 @@
SEND_SIGNAL(src, COMSIG_ITEM_AFTERATTACK, target, user, proximity_flag, click_parameters)
SEND_SIGNAL(user, COMSIG_MOB_ITEM_AFTERATTACK, target, user, proximity_flag, click_parameters)
+// Called if the target gets deleted by our attack
+/obj/item/proc/attack_qdeleted(atom/target, mob/user, proximity_flag, click_parameters)
+ SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_QDELETED, target, user, proximity_flag, click_parameters)
+ SEND_SIGNAL(user, COMSIG_MOB_ITEM_ATTACK_QDELETED, target, user, proximity_flag, click_parameters)
/obj/item/proc/get_clamped_volume()
if(w_class)
diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm
index 3fc45c867fb..5dbf03e7859 100644
--- a/code/game/objects/items/tools/weldingtool.dm
+++ b/code/game/objects/items/tools/weldingtool.dm
@@ -120,28 +120,38 @@
else
return ..()
-
/obj/item/weldingtool/afterattack(atom/O, mob/user, proximity)
. = ..()
if(!proximity)
return
- if(!status && O.is_refillable())
- reagents.trans_to(O, reagents.total_volume, transfered_by = user)
- to_chat(user, "You empty [src]'s fuel tank into [O].")
- update_icon()
+
if(isOn())
- use(1)
- var/turf/location = get_turf(user)
- location.hotspot_expose(700, 50, 1)
- if(get_fuel() <= 0)
- set_light(0)
-
- if(isliving(O))
+ handle_fuel_and_temps(1, user)
+
+ if(!QDELETED(O) && isliving(O)) // can't ignite something that doesn't exist
var/mob/living/L = O
if(L.IgniteMob())
message_admins("[ADMIN_LOOKUPFLW(user)] set [key_name_admin(L)] on fire with [src] at [AREACOORD(user)]")
log_game("[key_name(user)] set [key_name(L)] on fire with [src] at [AREACOORD(user)]")
+ if(!status && O.is_refillable())
+ reagents.trans_to(O, reagents.total_volume, transfered_by = user)
+ to_chat(user, "You empty [src]'s fuel tank into [O].")
+ update_icon()
+
+/obj/item/weldingtool/attack_qdeleted(atom/O, mob/user, proximity)
+ . = ..()
+ if(!proximity)
+ return
+
+ if(isOn())
+ handle_fuel_and_temps(1, user)
+
+ if(!QDELETED(O) && isliving(O)) // can't ignite something that doesn't exist
+ var/mob/living/L = O
+ if(L.IgniteMob())
+ message_admins("[ADMIN_LOOKUPFLW(user)] set [key_name_admin(L)] on fire with [src] at [AREACOORD(user)]")
+ log_game("[key_name(user)] set [key_name(L)] on fire with [src] at [AREACOORD(user)]")
/obj/item/weldingtool/attack_self(mob/user)
if(src.reagents.has_reagent(/datum/reagent/toxin/plasma))
@@ -153,6 +163,11 @@
update_icon()
+// Ah fuck, I can't believe you've done this
+/obj/item/weldingtool/proc/handle_fuel_and_temps(used = 0, mob/living/user)
+ use(used)
+ var/turf/location = get_turf(user)
+ location.hotspot_expose(700, 50, 1)
// Returns the amount of fuel in the welder
/obj/item/weldingtool/proc/get_fuel()
@@ -177,6 +192,7 @@
//Turns off the welder if there is no more fuel (does this really need to be its own proc?)
/obj/item/weldingtool/proc/check_fuel(mob/user)
if(get_fuel() <= 0 && welding)
+ set_light(0)
switched_on(user)
update_icon()
//mob icon update