diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm index 335c3c0822b..72f0435425b 100644 --- a/code/game/objects/structures/reflector.dm +++ b/code/game/objects/structures/reflector.dm @@ -30,7 +30,7 @@ P.current = reflector_turf P.yo = reflect_turf.y - reflector_turf.y P.xo = reflect_turf.x - reflector_turf.x - P.kill_count = 50 //Keep the projectile healthy as long as its bouncing off things + P.range = initial(P.range) //Keep the projectile healthy as long as its bouncing off things new_dir = 0 return - 1 diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 63d4d57afae..e5e66dd7e27 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -40,29 +40,30 @@ emp_act dna.species.on_hit(proj_type, src) /mob/living/carbon/human/bullet_act(obj/item/projectile/P, def_zone) - if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam)) - if(check_reflect(def_zone)) // Checks if you've passed a reflection% check - visible_message("The [P.name] gets reflected by [src]!", \ - "The [P.name] gets reflected by [src]!") - // Find a turf near or on the original location to bounce to - if(P.starting) - var/new_x = P.starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) - var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) - var/turf/curloc = get_turf(src) + if(!(P.original == src && P.firer == src)) //can't block or reflect when shooting yourself + if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam)) + if(check_reflect(def_zone)) // Checks if you've passed a reflection% check + visible_message("The [P.name] gets reflected by [src]!", \ + "The [P.name] gets reflected by [src]!") + // Find a turf near or on the original location to bounce to + if(P.starting) + var/new_x = P.starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) + var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) + var/turf/curloc = get_turf(src) - // redirect the projectile - P.original = locate(new_x, new_y, P.z) - P.starting = curloc - P.current = curloc - P.firer = src - P.yo = new_y - curloc.y - P.xo = new_x - curloc.x + // redirect the projectile + P.original = locate(new_x, new_y, P.z) + P.starting = curloc + P.current = curloc + P.firer = src + P.yo = new_y - curloc.y + P.xo = new_x - curloc.x - return -1 // complete projectile permutation + return -1 // complete projectile permutation - if(check_shields(P.damage, "the [P.name]", P, 0, P.armour_penetration)) - P.on_hit(src, 100, def_zone) - return 2 + if(check_shields(P.damage, "the [P.name]", P, 0, P.armour_penetration)) + P.on_hit(src, 100, def_zone) + return 2 return (..(P , def_zone)) /mob/living/carbon/human/proc/check_reflect(def_zone) //Reflection checks for anything in your l_hand, r_hand, or wear_suit based on the reflection chance of the object diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 46f44c40a4a..0828219aebf 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -25,7 +25,7 @@ var/nodamage = 0 //Determines if the projectile will skip any damage inflictions var/flag = "bullet" //Defines what armor to use when it hits things. Must be set to bullet, laser, energy,or bomb var/projectile_type = "/obj/item/projectile" - var/kill_count = 50 //This will de-increment every step. When 0, it will delete the projectile. + var/range = 50 //This will de-increment every step. When 0, it will delete the projectile. //Effects var/stun = 0 var/weaken = 0 @@ -39,19 +39,15 @@ var/jitter = 0 var/forcedodge = 0 // 1 to pass solid objects, 2 to pass solid turfs (results in bugs, bugs and tons of bugs) - var/range = 0 /obj/item/projectile/New() permutated = list() return ..() /obj/item/projectile/proc/Range() - if(range) - range-- - if(range <= 0) - on_range() - else - return + range-- + if(range <= 0 && loc) + on_range() /obj/item/projectile/proc/on_range() //if we want there to be effects when they reach the end of their range qdel(src) @@ -125,13 +121,9 @@ /obj/item/projectile/proc/fire() - spawn() + spawn(1) while(loc) - if(kill_count < 1) - qdel(src) - return if(!paused) - kill_count-- if((!( current ) || loc == current)) current = locate(Clamp(x+xo,1,world.maxx),Clamp(y+yo,1,world.maxy),z) step_towards(src, current) @@ -139,7 +131,7 @@ if(loc == get_turf(original)) if(!(original in permutated)) Bump(original, 1) - Range() + Range() sleep(1) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index d1c1941f9e3..043ba75060f 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -30,7 +30,7 @@ icon_state = "xray" damage = 15 irradiate = 30 - kill_count = 15 + range = 15 forcedodge = 1 /obj/item/projectile/beam/disabler diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 1b7b61b5389..3d3c0b62c70 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -130,11 +130,9 @@ obj/item/projectile/kinetic/New() damage *= 4 ..() -/obj/item/projectile/kinetic/Range() - range-- - if(range <= 0) - new /obj/item/effect/kinetic_blast(src.loc) - qdel(src) +/obj/item/projectile/kinetic/on_range() + new /obj/item/effect/kinetic_blast(src.loc) + ..() /obj/item/projectile/kinetic/on_hit(atom/target) . = ..()