From 6b10b648d20cd9c5c732bb0ff01fce47aaa2c92b Mon Sep 17 00:00:00 2001 From: Loganbacca Date: Fri, 10 Jul 2015 15:17:53 +1200 Subject: [PATCH] Implements turret trajectory prediction - Adds trajectory checking for turrets, so they don't burn holes through other objects (like walls and AI's) if they wouldn't hit them anyway. --- code/game/machinery/portable_turret.dm | 6 +++++- code/modules/projectiles/projectile.dm | 9 ++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 10d86aa4b2..6a0ad704a2 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -605,8 +605,12 @@ var/list/turret_icons if(!raised) //the turret has to be raised in order to fire - makes sense, right? return - update_icon() + + //targeting check, can we hit them? + if(!check_trajectory(target, src)) + return + var/obj/item/projectile/A if(emagged || lethal) A = new eprojectile(loc) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 9feebbd64b..d60169d836 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -385,7 +385,7 @@ return //cannot shoot yourself if(istype(A, /obj/item/projectile)) return - if(istype(A, /mob/living)) + if(istype(A, /mob/living) || istype(A, /obj/mecha) || istype(A, /obj/vehicle)) result = 2 //We hit someone, return 1! return result = 1 @@ -424,15 +424,14 @@ if(istype(M)) return 1 -/proc/check_trajectory(atom/target as mob, var/mob/living/user as mob, var/pass_flags=PASSTABLE|PASSGLASS|PASSGRILLE, flags=null) //Checks if you can hit them or not. - if(!istype(target) || !istype(user)) +/proc/check_trajectory(atom/target as mob|obj, atom/firer as mob|obj, var/pass_flags=PASSTABLE|PASSGLASS|PASSGRILLE, flags=null) //Checks if you can hit them or not. + if(!istype(target) || !istype(firer)) return 0 - var/obj/item/projectile/test/trace = new /obj/item/projectile/test(get_step_to(user,target)) //Making the test.... + var/obj/item/projectile/test/trace = new /obj/item/projectile/test(get_step_to(firer,target)) //Making the test.... trace.target = target if(!isnull(flags)) trace.flags = flags //Set the flags... trace.pass_flags = pass_flags //And the pass flags to that of the real projectile... - trace.firer = user var/output = trace.process() //Test it! qdel(trace) //No need for it anymore return output //Send it back to the gun!