diff --git a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm index 875eaf5e60a..6460937bfe5 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm @@ -36,3 +36,7 @@ /obj/effect/projectile/impact/wormhole icon_state = "wormhole_g" + +/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 ad6b23f5041..57edcdf6a28 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm @@ -28,3 +28,7 @@ /obj/effect/projectile/muzzle/wormhole icon_state = "wormhole_g" + +/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 23ecf438c4f..0fbe2079c5a 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm @@ -66,3 +66,7 @@ /obj/effect/projectile/tracer/wormhole icon_state = "wormhole_g" + +/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 0183c53f261..f2d70cf3b7f 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -26,7 +26,7 @@ var/locked = FALSE var/allow_switch_interact = TRUE - var/projectile_type = /obj/projectile/beam/emitter + var/projectile_type = /obj/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 b145508ff7c..d93343bb9f8 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -95,6 +95,8 @@ //Hitscan var/hitscan = FALSE //Whether this is hitscan. If it is, speed is basically ignored. var/list/beam_segments //assoc list of datum/point or datum/point/vector, start = end. Used for hitscan effect generation. + /// Last turf an angle was changed in for hitscan projectiles. + var/turf/last_angle_set_hitscan_store var/datum/point/beam_index var/turf/hitscan_last //last turf touched during hitscanning. var/tracer_type @@ -690,7 +692,7 @@ START_PROCESSING(SSprojectiles, src) pixel_move(1, FALSE) //move it now! -/obj/projectile/proc/setAngle(new_angle) //wrapper for overrides. +/obj/projectile/proc/setAngle(new_angle) //wrapper for overrides. Angle = new_angle if(!nondirectional_sprite) var/matrix/M = new @@ -698,6 +700,13 @@ transform = M if(trajectory) trajectory.set_angle(new_angle) + if(fired && hitscan && isloc(loc) && (loc != last_angle_set_hitscan_store)) + last_angle_set_hitscan_store = loc + var/datum/point/pcache = new (src) + var/list/coordinates = trajectory.return_coordinates() + pcache.initialize_location(coordinates[1], coordinates[2], coordinates[3]) // Take the center of the hitscan collision tile, so it looks good on reflector boxes and the like + trajectory.initialize_location(coordinates[1], coordinates[2], coordinates[3]) // Sets the trajectory to it as well, to prevent a strange visual bug + store_hitscan_collision(pcache) return TRUE /obj/projectile/forceMove(atom/target) @@ -744,7 +753,7 @@ beam_segments[beam_index] = null //record start. /obj/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) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 4d6983a2464..14330405f3a 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -134,7 +134,7 @@ /obj/projectile/beam/emitter name = "emitter beam" - icon_state = "emitter" //ICON OVERRIDEN IN SKYRAT AESTHETICS - SEE MODULE + icon_state = "emitter" damage = 30 impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser light_color = LIGHT_COLOR_GREEN @@ -144,6 +144,22 @@ /obj/projectile/beam/emitter/singularity_pull() return //don't want the emitters to miss +/obj/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 + hitscan_light_intensity = 3 + hitscan_light_range = 0.75 + hitscan_light_color_override = COLOR_LIME + muzzle_flash_intensity = 6 + muzzle_flash_range = 2 + muzzle_flash_color_override = COLOR_LIME + impact_light_intensity = 7 + impact_light_range = 2.5 + impact_light_color_override = COLOR_LIME + /obj/projectile/beam/lasertag name = "laser tag beam" icon_state = "omnilaser" diff --git a/icons/obj/projectiles_impact.dmi b/icons/obj/projectiles_impact.dmi index bac35e68e14..fc005bd00d2 100644 Binary files a/icons/obj/projectiles_impact.dmi and b/icons/obj/projectiles_impact.dmi differ diff --git a/icons/obj/projectiles_muzzle.dmi b/icons/obj/projectiles_muzzle.dmi index 2f1d6d90c6b..2ef59b8d2d3 100644 Binary files a/icons/obj/projectiles_muzzle.dmi and b/icons/obj/projectiles_muzzle.dmi differ diff --git a/icons/obj/projectiles_tracer.dmi b/icons/obj/projectiles_tracer.dmi index 56442452e72..8efd099a095 100644 Binary files a/icons/obj/projectiles_tracer.dmi and b/icons/obj/projectiles_tracer.dmi differ diff --git a/modular_skyrat/modules/aesthetics/emitter/code/emitter.dm b/modular_skyrat/modules/aesthetics/emitter/code/emitter.dm index 07a02614e06..d53ad47d36d 100644 --- a/modular_skyrat/modules/aesthetics/emitter/code/emitter.dm +++ b/modular_skyrat/modules/aesthetics/emitter/code/emitter.dm @@ -11,6 +11,3 @@ /obj/machinery/power/rad_collector icon = 'modular_skyrat/modules/aesthetics/emitter/icons/emitter.dmi' -/obj/projectile/beam/emitter - icon = 'modular_skyrat/modules/aesthetics/emitter/icons/emitter.dmi' - icon_state = "emitter_beam"