diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index db127c5b100..ca367a156af 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -318,7 +318,9 @@
if(prob(hit_reaction_chance))
if(istype(hitby, /obj/item/projectile))
var/obj/item/projectile/P = hitby
- if(!P.nodamage)
+ if(istype(P, /obj/item/projectile/ion))
+ return FALSE
+ if(!P.nodamage || P.stun)
return TRUE
else
return TRUE
@@ -357,7 +359,9 @@
/obj/item/clothing/suit/armor/reactive/fire
name = "reactive incendiary armor"
- desc = "This armor uses the power of a pyro anomaly core to shoot protective jets of fire."
+ desc = "This armor uses the power of a pyro anomaly core to shoot protective jets of fire, in addition to absorbing all damage from fire."
+ heat_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS | HEAD
+ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
/obj/item/clothing/suit/armor/reactive/fire/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(!active)
@@ -368,7 +372,6 @@
if(C != owner)
C.fire_stacks += 8
C.IgniteMob()
- owner.fire_stacks = -20
return TRUE
return FALSE
@@ -387,10 +390,12 @@
E.Goto(owner, E.move_to_delay, E.minimum_distance)
owner.alpha = 0
owner.visible_message("[owner] is hit by [attack_text] in the chest!") //We pretend to be hit, since blocking it would stop the message otherwise
- spawn(40)
- owner.alpha = initial(owner.alpha)
+ addtimer(CALLBACK(owner, /mob/living/.proc/reset_alpha), 4 SECONDS)
return TRUE
+/mob/living/proc/reset_alpha(mob/living/carbon/human/owner)
+ alpha = initial(alpha)
+
/obj/item/clothing/suit/armor/reactive/tesla
name = "reactive tesla armor"
desc = "This armor uses the power of a flux anomaly core to protect the user in shocking ways."
@@ -416,35 +421,37 @@
var/repulse_power = 3
/// How far away are we finding things to throw
var/repulse_range = 5
+ /// What the sparkles looks like
+ var/sparkle_path = /obj/effect/temp_visual/gravpush
/obj/item/clothing/suit/armor/reactive/repulse/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(!active)
return FALSE
if(reaction_check(hitby))
owner.visible_message("[src] blocks [attack_text], converting the attack into a wave of force!")
- var/list/thrownatoms = list()
+ var/list/thrown_atoms = list()
for(var/turf/T in range(repulse_range, owner)) //Done this way so things don't get thrown all around hilariously.
for(var/atom/movable/AM in T)
- thrownatoms += AM
+ thrown_atoms += AM
- for(var/am in thrownatoms)
+ for(var/am in thrown_atoms)
var/atom/movable/AM = am
if(AM == owner || AM.anchored)
continue
- var/throwtarget = get_edge_target_turf(owner, get_dir(owner, get_step_away(AM, owner)))
- var/distfromuser = get_dist(owner, AM)
- if(distfromuser == 0)
+ var/throw_target = get_edge_target_turf(owner, get_dir(owner, get_step_away(AM, owner)))
+ var/dist_from_user = get_dist(owner, AM)
+ if(dist_from_user == 0)
if(isliving(AM))
var/mob/living/M = AM
M.Weaken(3)
to_chat(M, "You're slammed into the floor by [owner]'s reactive armor!")
else
+ new sparkle_path(get_turf(AM), get_dir(owner, AM))
if(isliving(AM))
var/mob/living/M = AM
to_chat(M, "You're thrown back by the [owner]'s reactive armor!")
- spawn(0)
- AM.throw_at(throwtarget, ((clamp((repulse_power - (clamp(distfromuser - 2, 0, distfromuser))), 3, repulse_power))), 1)//So stuff gets tossed around at the same time.
+ INVOKE_ASYNC(AM, /atom/movable/.proc/throw_at, throw_target, ((clamp((repulse_power - (clamp(dist_from_user - 2, 0, dist_from_user))), 3, repulse_power))), 1) //So stuff gets tossed around at the same time.
disable(rand(2, 5))
return TRUE