mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-22 03:27:46 +01:00
Deep Space temporary sectors were being created on Z1 instead of the overmap, and with a bad map_z list. - Initialize was taking the wrong parameters, resulting in the sector being always located at 1,?,1 instead of on the overmap Fix by passing the first parameter to new() as the location you want the object, as is proper for BYOND. - Also fixed map_z containing a zero, it was put there by the sector Initialize(). Fix by setting the appropriate values *before* calling parent.
148 lines
4.0 KiB
Plaintext
148 lines
4.0 KiB
Plaintext
//Space stragglers go here
|
|
/obj/effect/overmap/visitable/sector/temporary
|
|
name = "Deep Space"
|
|
invisibility = 101
|
|
known = FALSE
|
|
in_space = TRUE
|
|
|
|
/obj/effect/overmap/visitable/sector/temporary/Initialize()
|
|
if(!istype(loc, /turf/unsimulated/map))
|
|
CRASH("Attempt to create deepspace which is not on overmap: [log_info_line(loc)]")
|
|
// Tell sector initializer where are is where we want to be.
|
|
start_x = loc.x
|
|
start_y = loc.y
|
|
// But pick an empty z level to use
|
|
map_z += global.using_map.get_empty_zlevel()
|
|
. = ..()
|
|
testing("Temporary sector at [x],[y],[z] was created, corresponding zlevel is [english_list(map_z)].")
|
|
|
|
/obj/effect/overmap/visitable/sector/temporary/Destroy()
|
|
for(var/zlevel in map_z)
|
|
using_map.cache_empty_zlevel(zlevel)
|
|
testing("Temporary sector at [x],[y] was destroyed, returning empty zlevel [map_z[1]] to map datum.")
|
|
return ..()
|
|
|
|
/obj/effect/overmap/visitable/sector/temporary/proc/is_empty(var/mob/observer)
|
|
if(!LAZYLEN(map_z))
|
|
log_and_message_admins("CANARY: [src] tried to check is_empty, but map_z is `[map_z || "null"]`")
|
|
return TRUE
|
|
testing("Checking if sector at [map_z[1]] has no players.")
|
|
for(var/mob/M in global.player_list)
|
|
if(M != observer && (M.z in map_z))
|
|
testing("There are people on it.")
|
|
return FALSE
|
|
return TRUE
|
|
|
|
/obj/effect/overmap/visitable/sector/temporary/cleanup()
|
|
if(is_empty())
|
|
qdel(src)
|
|
|
|
/proc/get_deepspace(x,y)
|
|
var/turf/unsimulated/map/overmap_turf = locate(x,y,global.using_map.overmap_z)
|
|
if(!istype(overmap_turf))
|
|
CRASH("Attempt to get deepspace at ([x],[y]) which is not on overmap: [overmap_turf]")
|
|
var/obj/effect/overmap/visitable/sector/temporary/res = locate() in overmap_turf
|
|
if(istype(res))
|
|
return res
|
|
return new /obj/effect/overmap/visitable/sector/temporary(overmap_turf)
|
|
|
|
/atom/movable/proc/lost_in_space()
|
|
for(var/atom/movable/AM in contents)
|
|
if(!AM.lost_in_space())
|
|
return FALSE
|
|
if(has_buckled_mobs())
|
|
for(var/mob/M in buckled_mobs)
|
|
if(!M.lost_in_space())
|
|
return FALSE
|
|
|
|
return TRUE
|
|
|
|
/obj/item/device/uav/lost_in_space()
|
|
if(state == 1)
|
|
return FALSE
|
|
return ..()
|
|
|
|
/obj/machinery/power/supermatter/lost_in_space()
|
|
return FALSE
|
|
|
|
/obj/singularity/lost_in_space()
|
|
return FALSE
|
|
|
|
/obj/vehicle/lost_in_space()
|
|
if(load && !load.lost_in_space())
|
|
return FALSE
|
|
return ..()
|
|
|
|
/mob/lost_in_space()
|
|
return isnull(client)
|
|
|
|
/mob/living/carbon/human/lost_in_space()
|
|
return FALSE
|
|
// return isnull(client) && !key && stat == DEAD // Allows bodies that players have ghosted from to be deleted - Ater
|
|
|
|
/proc/overmap_spacetravel(var/turf/space/T, var/atom/movable/A)
|
|
if (!T || !A)
|
|
return
|
|
|
|
var/obj/effect/overmap/visitable/M = get_overmap_sector(T.z)
|
|
if (!M)
|
|
return
|
|
|
|
// Is the landmark still on the map.
|
|
if(!isturf(M.loc))
|
|
return
|
|
|
|
// Don't let AI eyes yeet themselves off the map
|
|
if(istype(A, /mob/observer/eye))
|
|
return
|
|
|
|
if(A.lost_in_space())
|
|
if(!QDELETED(A))
|
|
qdel(A)
|
|
return
|
|
|
|
|
|
var/nx = 1
|
|
var/ny = 1
|
|
var/nz = 1
|
|
|
|
if(T.x <= TRANSITIONEDGE)
|
|
nx = world.maxx - TRANSITIONEDGE - 2
|
|
ny = rand(TRANSITIONEDGE + 2, world.maxy - TRANSITIONEDGE - 2)
|
|
|
|
else if (A.x >= (world.maxx - TRANSITIONEDGE - 1))
|
|
nx = TRANSITIONEDGE + 2
|
|
ny = rand(TRANSITIONEDGE + 2, world.maxy - TRANSITIONEDGE - 2)
|
|
|
|
else if (T.y <= TRANSITIONEDGE)
|
|
ny = world.maxy - TRANSITIONEDGE -2
|
|
nx = rand(TRANSITIONEDGE + 2, world.maxx - TRANSITIONEDGE - 2)
|
|
|
|
else if (A.y >= (world.maxy - TRANSITIONEDGE - 1))
|
|
ny = TRANSITIONEDGE + 2
|
|
nx = rand(TRANSITIONEDGE + 2, world.maxx - TRANSITIONEDGE - 2)
|
|
|
|
testing("[A] spacemoving from [M] ([M.x], [M.y]).")
|
|
|
|
var/turf/map = locate(M.x,M.y,global.using_map.overmap_z)
|
|
var/obj/effect/overmap/visitable/TM
|
|
for(var/obj/effect/overmap/visitable/O in map)
|
|
if(O != M && O.in_space && prob(50))
|
|
TM = O
|
|
break
|
|
if(!TM)
|
|
TM = get_deepspace(M.x,M.y)
|
|
nz = pick(TM.get_space_zlevels())
|
|
|
|
testing("spacetravel chose [nz],[ny],[nz] in sector [TM] @ ([TM.x],[TM.y],[TM.z])")
|
|
|
|
var/turf/dest = locate(nx,ny,nz)
|
|
if(istype(dest))
|
|
A.forceMove(dest)
|
|
if(ismob(A))
|
|
var/mob/D = A
|
|
if(D.pulling)
|
|
D.pulling.forceMove(dest)
|
|
|
|
M.cleanup()
|