diff --git a/code/modules/overmap/ship_weaponry/_ship_ammunition.dm b/code/modules/overmap/ship_weaponry/_ship_ammunition.dm index 25c7efec515..5c579a0a392 100644 --- a/code/modules/overmap/ship_weaponry/_ship_ammunition.dm +++ b/code/modules/overmap/ship_weaponry/_ship_ammunition.dm @@ -338,6 +338,10 @@ if(ammo && ammo.origin) ammo.origin.signal_hit(hit_data) + for(var/mob/M in GLOB.dead_mob_list) //Print out a message about what we hit to all ghosts. + if(M.client) + to_chat(M, "" + create_text_tag("DEAD", M.client) + "[ghost_follow_link(target, M)] A [src.name] hit \the [target.name] in \the [get_area(target)] at [target.x], [target.y], [target.z]!") + if(istype(target, /turf/simulated/wall) || istype(target, /obj/structure/machinery/door)) //Stores the last thing we pierced for spalling purposes. last_thing_pierced = target else if (istype(target, /obj/structure)) //If it is a structure on a dense turf, that uses health, @@ -357,5 +361,5 @@ pellet.ammo.origin = ammo.origin pellet.ammo.impact_type = ammo.impact_type pellet.dir = dir - pellet.preparePixelProjectile(target_turf, pellet, deviation = 3) //Deviation can be tuned. These spawn at the map edge so small deviations matter a lot. + pellet.preparePixelProjectile(target_turf, new_turf, deviation = 3) //Deviation can be tuned. These spawn at the map edge so small deviations matter a lot. pellet.fire() diff --git a/code/modules/overmap/ship_weaponry/projectiles/_overmap_projectiles.dm b/code/modules/overmap/ship_weaponry/projectiles/_overmap_projectiles.dm index 49d6243b9cc..3eee8c1fb8d 100644 --- a/code/modules/overmap/ship_weaponry/projectiles/_overmap_projectiles.dm +++ b/code/modules/overmap/ship_weaponry/projectiles/_overmap_projectiles.dm @@ -70,27 +70,33 @@ ///Gets the turf the projectile should enter on. If it's diagnonal it spawns in the corner, if it's orthogonal it spawns on the map edge relative to the target landmark. /obj/effect/overmap/projectile/proc/get_entry_turf(atom/target_landmark, direction) - var/turf/target = locate(target_landmark.x, target_landmark.y, target_landmark.z) - if(!target_landmark || !target) + if(!target_landmark) return 0 + var/turf/target = locate(target_landmark.x, target_landmark.y, target_landmark.z) + if(!target) + return 0 + + var/offset = max(8, 2 * ammunition.burst) //We offset the target turf from the edge by 8 (one screen), or two times the burst size. Bursts get their positions randomized up to 2x the burst size. + switch(direction) if(NORTH|WEST) - target = get_ranged_target_turf(locate(1, world.maxy, target.z), direction, max(8, 2 * ammunition.burst)) //We offset the target turf from the edge by 8 (one screen), or twice the burst size. Bursts get their positions randomized up to twice the burst size. + return locate(max(1, world.maxx - offset), min(world.maxy, 1 + offset), target.z) if(NORTH|EAST) - target = get_ranged_target_turf(locate(world.maxx, world.maxy, target.z), direction, max(8, 2 * ammunition.burst)) + return locate(min(world.maxx, 1 + offset), min(world.maxy, 1 + offset), target.z) if(SOUTH|WEST) - target = get_ranged_target_turf(locate(1, 1, target.z), direction, max(8, 2 * ammunition.burst)) + return locate(max(1, world.maxx - offset), max(1, world.maxy - offset), target.z) if(SOUTH|EAST) - target = get_ranged_target_turf(locate(world.maxx, 1, target.z), direction, max(8, 2 * ammunition.burst)) + return locate(min(world.maxx, 1 + offset), max(1, world.maxy - offset), target.z) if(NORTH) - target = get_ranged_target_turf(locate(target.x, world.maxy, target.z), direction, max(8, 2 * ammunition.burst)) + return locate(target.x, min(world.maxy, 1 + offset), target.z) if(SOUTH) - target = get_ranged_target_turf(locate(target.x, 1, target.z), direction, max(8, 2 * ammunition.burst)) + return locate(target.x, max(1, world.maxy - offset), target.z) if(EAST) - target = get_ranged_target_turf(locate(world.maxx, target.y, target.z), direction, max(8, 2 * ammunition.burst)) + return locate(min(world.maxx, 1 + offset), target.y, target.z) if(WEST) - target = get_ranged_target_turf(locate(1, target.y, target.z), direction, max(8, 2 * ammunition.burst)) + return locate(max(1, world.maxx - offset), target.y, target.z) + return target /obj/effect/overmap/projectile/proc/prepare_for_entry() @@ -164,12 +170,14 @@ var/corrected_heading = SSatlas.naval_to_dir["[VS.fore_dir]"][naval_heading] shot_direction = corrected_heading - var/turf/entry_turf = get_entry_turf(submap_target, REVERSE_DIR(shot_direction)) + var/turf/entry_turf = get_entry_turf(submap_target, shot_direction) widowmaker.forceMove(entry_turf) widowmaker.dir = shot_direction widowmaker.on_translate(entry_turf, target_turf) log_and_message_admins("A ([widowmaker.name]) arrived [naval_heading] of \the [target] at ([entry_turf.x], [entry_turf.y], [entry_turf.z]) aimed at [submap_target.name], with direction [dir2text(shot_direction)]! (JMP)") - say_dead_direct("A ([widowmaker.name]) arrived [naval_heading] of \the [target] at ([entry_turf.x], [entry_turf.y], [entry_turf.z]) aimed at [submap_target.name], with direction [dir2text(shot_direction)]! (JMP)") + for(var/mob/M in GLOB.dead_mob_list) + if(M.client) + to_chat(M, "" + create_text_tag("DEAD", M.client) + " A ([widowmaker.name]), fired by [ammunition.origin], flew in at [ghost_follow_link(entry_turf, M)] ([entry_turf.x], [entry_turf.y], [entry_turf.z]) aimed at [ghost_follow_link(submap_target, M)] [submap_target.name], with direction [dir2text(shot_direction)]!") widowmaker.preparePixelProjectile(target_turf, entry_turf) widowmaker.fired_from = src widowmaker.fire() @@ -179,12 +187,14 @@ ///Handle hitting visitables that can't spin, such as asteroids and stations. Otherwise identical to hitting a ship. /obj/effect/overmap/projectile/proc/check_entry_visitable(obj/projectile/ship_ammo/widowmaker, turf/target_turf) var/shot_direction = src.dir - var/turf/entry_turf = get_entry_turf(submap_target, REVERSE_DIR(shot_direction)) + var/turf/entry_turf = get_entry_turf(submap_target, shot_direction) widowmaker.forceMove(entry_turf) widowmaker.dir = shot_direction widowmaker.on_translate(entry_turf, target_turf) log_and_message_admins("A ([widowmaker.name]) flew in at ([entry_turf.x], [entry_turf.y], [entry_turf.z]) aimed at [submap_target.name], with direction [dir2text(shot_direction)]! (JMP)") - say_dead_direct("A ([widowmaker.name]) flew in at ([entry_turf.x], [entry_turf.y], [entry_turf.z]) aimed at [submap_target.name], with direction [dir2text(shot_direction)]! (JMP)") + for(var/mob/M in GLOB.dead_mob_list) + if(M.client) + to_chat(M, "" + create_text_tag("DEAD", M.client) + " A ([widowmaker.name]), fired by [ammunition.origin], flew in at [ghost_follow_link(entry_turf, M)] ([entry_turf.x], [entry_turf.y], [entry_turf.z]) aimed at ([ghost_follow_link(submap_target, M)] [submap_target.name]), with direction [dir2text(shot_direction)]!") widowmaker.preparePixelProjectile(target_turf, entry_turf) widowmaker.fired_from = src widowmaker.fire() diff --git a/html/changelogs/Fenodyree-ShipCornerShotFix.yml b/html/changelogs/Fenodyree-ShipCornerShotFix.yml new file mode 100644 index 00000000000..73eb1f72e47 --- /dev/null +++ b/html/changelogs/Fenodyree-ShipCornerShotFix.yml @@ -0,0 +1,7 @@ +author: Fenodyree + +delete-after: True + +changes: + - bugfix: "Fixed ship projectiles spawning in the wrong places, when entering the map at the corners." + - bugfix: "Fixed ghosts being unable to jump to the target of a ship projectile."