diff --git a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm index 0360c4ccc2..a98c40d4fc 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm @@ -39,4 +39,8 @@ /obj/effect/projectile/impact/laser/wavemotion name = "particle impact" - icon_state = "impact_wavemotion" \ No newline at end of file + icon_state = "impact_wavemotion" + +/obj/effect/projectile/impact/laser/emitter + name = "emitter impact" + icon_state = "impact_emitter" diff --git a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm index cbd4b21d39..a7ff399734 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm @@ -31,4 +31,8 @@ /obj/effect/projectile/muzzle/laser/wavemotion name = "particle backblast" - icon_state = "muzzle_wavemotion" \ No newline at end of file + icon_state = "muzzle_wavemotion" + +/obj/effect/projectile/muzzle/laser/emitter + name = "emitter flash" + icon_state = "muzzle_emitter" diff --git a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm index 0cd4589d4c..bd2c6c6e87 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm @@ -70,3 +70,7 @@ /obj/effect/projectile/tracer/laser/wavemotion name = "particle trail" icon_state = "tracer_wavemotion" + +/obj/effect/projectile/tracer/laser/emitter + name = "emitter beam" + icon_state = "emitter" diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index d8b0ede3a2..e956742e92 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -30,7 +30,7 @@ var/locked = FALSE var/allow_switch_interact = TRUE - var/projectile_type = /obj/item/projectile/beam/emitter + var/projectile_type = /obj/item/projectile/beam/emitter/hitscan var/projectile_sound = 'sound/weapons/emitter.ogg' var/datum/effect_system/spark_spread/sparks diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index cc778bcf05..55a75e1688 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -57,6 +57,8 @@ var/muzzle_type var/impact_type + var/turf/last_angle_set_hitscan_store //last turf we stored a hitscan segment while changing angles. without this you'll have potentially hundreds of segments from a homing projectile or something. + //Fancy hitscan lighting effects! var/hitscan_light_intensity = 1.5 var/hitscan_light_range = 0.75 @@ -410,12 +412,16 @@ START_PROCESSING(SSprojectiles, src) pixel_move(1, FALSE) //move it now! -/obj/item/projectile/proc/setAngle(new_angle) //wrapper for overrides. +/obj/item/projectile/proc/setAngle(new_angle, hitscan_store_segment = TRUE) //wrapper for overrides. Angle = new_angle if(!nondirectional_sprite) var/matrix/M = new M.Turn(Angle) transform = M + if(fired && hitscan && trajectory && isloc(loc) && (loc != last_angle_set_hitscan_store)) + last_angle_set_hitscan_store = loc + var/datum/point/pcache = trajectory.copy_to() + store_hitscan_collision(pcache) if(trajectory) trajectory.set_angle(new_angle) return TRUE @@ -462,7 +468,7 @@ beam_segments[beam_index] = null //record start. /obj/item/projectile/proc/process_hitscan() - var/safety = range * 3 + var/safety = range * 10 record_hitscan_start(RETURN_POINT_VECTOR_INCREMENT(src, Angle, MUZZLE_EFFECT_PIXEL_INCREMENT, 1)) while(loc && !QDELETED(src)) if(paused) @@ -647,7 +653,7 @@ /obj/item/projectile/proc/cleanup_beam_segments() QDEL_LIST_ASSOC(beam_segments) beam_segments = list() - qdel(beam_index) + QDEL_NULL(beam_index) /obj/item/projectile/proc/finalize_hitscan_and_generate_tracers(impacting = TRUE) if(trajectory && beam_index) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index fd79a52906..d71e081dac 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -118,7 +118,14 @@ light_color = LIGHT_COLOR_GREEN /obj/item/projectile/beam/emitter/singularity_pull() - return //don't want the emitters to miss + return + +/obj/item/projectile/beam/emitter/hitscan + hitscan = TRUE + muzzle_type = /obj/effect/projectile/muzzle/laser/emitter + tracer_type = /obj/effect/projectile/tracer/laser/emitter + impact_type = /obj/effect/projectile/impact/laser/emitter + impact_effect_type = null /obj/item/projectile/beam/lasertag name = "laser tag beam"