diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 48f892caff0..ec473c3eadc 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -23,6 +23,16 @@ /turf/space/Destroy() return QDEL_HINT_LETMELIVE +/turf/space/PreChange() + ..() + var/datum/space_level/S = space_manager.get_zlev(z) + S.remove_from_transit(src) + +/turf/space/AfterChange(ignore_air, keep_cabling = FALSE) + ..() + var/datum/space_level/S = space_manager.get_zlev(z) + S.add_to_transit(src) + /turf/space/proc/update_starlight() if(!config.starlight) return @@ -69,7 +79,7 @@ /turf/space/Entered(atom/movable/A as mob|obj, atom/OL, ignoreRest = 0) ..() - + if(destination_z && A && (src in A.locs)) A.x = destination_x A.y = destination_y diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 93b9c339652..9cf39fed275 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -165,6 +165,7 @@ var/old_blueprint_data = blueprint_data var/old_obscured = obscured + PreChange() if(air_master) air_master.remove_from_active(src) var/turf/W = new path(src) @@ -186,11 +187,14 @@ lighting_build_overlays() else lighting_clear_overlays() - + obscured = old_obscured return W +/turf/proc/PreChange() + return + // I'm including `ignore_air` because BYOND lacks positional-only arguments /turf/proc/AfterChange(ignore_air, keep_cabling = FALSE) //called after a turf has been replaced in ChangeTurf() levelupdate() diff --git a/code/modules/space_management/space_level.dm b/code/modules/space_management/space_level.dm index 6b7654cd504..1082a1bf29c 100644 --- a/code/modules/space_management/space_level.dm +++ b/code/modules/space_management/space_level.dm @@ -28,28 +28,47 @@ var/timer = start_watch() log_debug("Starting to build space destination arrays for z level '[zpos]'...") for(var/turf/space/S in get_turfs()) - - // Bottom border - if(S.y <= TRANSITIONEDGE) - transit_south |= S - continue - - // Top border - if(S.y >= (world.maxy - TRANSITIONEDGE - 1)) - transit_north |= S - continue - - // Left border - if(S.x <= TRANSITIONEDGE) - transit_west |= S - continue - - // Right border - if(S.x >= (world.maxx - TRANSITIONEDGE - 1)) - transit_east |= S - continue + add_to_transit(S) log_debug("Building space destination arrays complete, took [stop_watch(timer)]s.") +/datum/space_level/proc/add_to_transit(turf/space/S) + if(S.y <= TRANSITIONEDGE) + transit_south |= S + return + + // Top border + if(S.y >= (world.maxy - TRANSITIONEDGE - 1)) + transit_north |= S + return + + // Left border + if(S.x <= TRANSITIONEDGE) + transit_west |= S + return + + // Right border + if(S.x >= (world.maxx - TRANSITIONEDGE - 1)) + transit_east |= S + +/datum/space_level/proc/remove_from_transit(turf/space/S) + if(S.y <= TRANSITIONEDGE) + transit_south -= S + return + + // Top border + if(S.y >= (world.maxy - TRANSITIONEDGE - 1)) + transit_north -= S + return + + // Left border + if(S.x <= TRANSITIONEDGE) + transit_west -= S + return + + // Right border + if(S.x >= (world.maxx - TRANSITIONEDGE - 1)) + transit_east -= S + /datum/space_level/proc/get_turfs() return block(locate(1, 1, zpos), locate(world.maxx, world.maxy, zpos))