mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-09 16:14:13 +00:00
- Added killswitches to all Enter() and Entered() procs to try to determine if movement is the source of all the constant lag we're having. Toggle the killswitch with the 'disable all movement' verb, available in debug verbs. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@5571 316c924e-a436-60f5-8080-3fe189b3f50e
253 lines
6.8 KiB
Plaintext
253 lines
6.8 KiB
Plaintext
/turf/space
|
|
icon = 'icons/turf/space.dmi'
|
|
name = "\proper space"
|
|
icon_state = "0"
|
|
|
|
temperature = TCMB
|
|
thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT
|
|
heat_capacity = 700000
|
|
|
|
/turf/space/New()
|
|
if(!istype(src, /turf/space/transit))
|
|
icon_state = "[((x + y) ^ ~(x * y) + z) % 25]"
|
|
|
|
/turf/space/attack_paw(mob/user as mob)
|
|
return src.attack_hand(user)
|
|
|
|
/turf/space/attack_hand(mob/user as mob)
|
|
if ((user.restrained() || !( user.pulling )))
|
|
return
|
|
if (user.pulling.anchored)
|
|
return
|
|
if ((user.pulling.loc != user.loc && get_dist(user, user.pulling) > 1))
|
|
return
|
|
if (ismob(user.pulling))
|
|
var/mob/M = user.pulling
|
|
var/atom/movable/t = M.pulling
|
|
M.stop_pulling()
|
|
step(user.pulling, get_dir(user.pulling.loc, src))
|
|
M.start_pulling(t)
|
|
else
|
|
step(user.pulling, get_dir(user.pulling.loc, src))
|
|
return
|
|
|
|
/turf/space/attackby(obj/item/C as obj, mob/user as mob)
|
|
|
|
if (istype(C, /obj/item/stack/rods))
|
|
var/obj/structure/lattice/L = locate(/obj/structure/lattice, src)
|
|
if(L)
|
|
return
|
|
var/obj/item/stack/rods/R = C
|
|
user << "\blue Constructing support lattice ..."
|
|
playsound(src.loc, 'sound/weapons/Genhit.ogg', 50, 1)
|
|
ReplaceWithLattice()
|
|
R.use(1)
|
|
return
|
|
|
|
if (istype(C, /obj/item/stack/tile/plasteel))
|
|
var/obj/structure/lattice/L = locate(/obj/structure/lattice, src)
|
|
if(L)
|
|
var/obj/item/stack/tile/plasteel/S = C
|
|
del(L)
|
|
playsound(src.loc, 'sound/weapons/Genhit.ogg', 50, 1)
|
|
S.build(src)
|
|
S.use(1)
|
|
return
|
|
else
|
|
user << "\red The plating is going to need some support."
|
|
return
|
|
|
|
|
|
// Ported from unstable r355
|
|
|
|
/turf/space/Entered(atom/movable/A as mob|obj)
|
|
if(movement_disabled)
|
|
usr << "\red Movement is admin-disabled." //This is to identify lag problems
|
|
return
|
|
..()
|
|
if ((!(A) || src != A.loc)) return
|
|
|
|
inertial_drift(A)
|
|
|
|
if(ticker && ticker.mode)
|
|
|
|
// Okay, so let's make it so that people can travel z levels but not nuke disks!
|
|
// if(ticker.mode.name == "nuclear emergency") return
|
|
if(A.z > 6) return
|
|
if (A.x <= TRANSITIONEDGE || A.x >= (world.maxx - TRANSITIONEDGE - 1) || A.y <= TRANSITIONEDGE || A.y >= (world.maxy - TRANSITIONEDGE - 1))
|
|
if(istype(A, /obj/effect/meteor)||istype(A, /obj/effect/space_dust))
|
|
del(A)
|
|
return
|
|
|
|
if(istype(A, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks travel Z levels ... And moving this shit down here so it only fires when they're actually trying to change z-level.
|
|
del(A) //The disk's Del() proc ensures a new one is created
|
|
return
|
|
|
|
var/list/disk_search = A.search_contents_for(/obj/item/weapon/disk/nuclear)
|
|
if(!isemptylist(disk_search))
|
|
if(istype(A, /mob/living))
|
|
var/mob/living/MM = A
|
|
if(MM.client && !MM.stat)
|
|
MM << "\red Something you are carrying is preventing you from leaving. Don't play stupid; you know exactly what it is."
|
|
if(MM.x <= TRANSITIONEDGE)
|
|
MM.inertia_dir = 4
|
|
else if(MM.x >= world.maxx -TRANSITIONEDGE)
|
|
MM.inertia_dir = 8
|
|
else if(MM.y <= TRANSITIONEDGE)
|
|
MM.inertia_dir = 1
|
|
else if(MM.y >= world.maxy -TRANSITIONEDGE)
|
|
MM.inertia_dir = 2
|
|
else
|
|
for(var/obj/item/weapon/disk/nuclear/N in disk_search)
|
|
del(N)//Make the disk respawn it is on a clientless mob or corpse
|
|
else
|
|
for(var/obj/item/weapon/disk/nuclear/N in disk_search)
|
|
del(N)//Make the disk respawn if it is floating on its own
|
|
return
|
|
|
|
var/move_to_z = src.z
|
|
var/safety = 1
|
|
|
|
while(move_to_z == src.z)
|
|
var/move_to_z_str = pickweight(accessable_z_levels)
|
|
move_to_z = text2num(move_to_z_str)
|
|
safety++
|
|
if(safety > 10)
|
|
break
|
|
|
|
if(!move_to_z)
|
|
return
|
|
|
|
A.z = move_to_z
|
|
|
|
if(src.x <= TRANSITIONEDGE)
|
|
A.x = world.maxx - TRANSITIONEDGE - 2
|
|
A.y = rand(TRANSITIONEDGE + 2, world.maxy - TRANSITIONEDGE - 2)
|
|
|
|
else if (A.x >= (world.maxx - TRANSITIONEDGE - 1))
|
|
A.x = TRANSITIONEDGE + 1
|
|
A.y = rand(TRANSITIONEDGE + 2, world.maxy - TRANSITIONEDGE - 2)
|
|
|
|
else if (src.y <= TRANSITIONEDGE)
|
|
A.y = world.maxy - TRANSITIONEDGE -2
|
|
A.x = rand(TRANSITIONEDGE + 2, world.maxx - TRANSITIONEDGE - 2)
|
|
|
|
else if (A.y >= (world.maxy - TRANSITIONEDGE - 1))
|
|
A.y = TRANSITIONEDGE + 1
|
|
A.x = rand(TRANSITIONEDGE + 2, world.maxx - TRANSITIONEDGE - 2)
|
|
|
|
|
|
|
|
|
|
spawn (0)
|
|
if ((A && A.loc))
|
|
A.loc.Entered(A)
|
|
|
|
/turf/space/proc/Sandbox_Spacemove(atom/movable/A as mob|obj)
|
|
var/cur_x
|
|
var/cur_y
|
|
var/next_x
|
|
var/next_y
|
|
var/target_z
|
|
var/list/y_arr
|
|
|
|
if(src.x <= 1)
|
|
if(istype(A, /obj/effect/meteor)||istype(A, /obj/effect/space_dust))
|
|
del(A)
|
|
return
|
|
|
|
var/list/cur_pos = src.get_global_map_pos()
|
|
if(!cur_pos) return
|
|
cur_x = cur_pos["x"]
|
|
cur_y = cur_pos["y"]
|
|
next_x = (--cur_x||global_map.len)
|
|
y_arr = global_map[next_x]
|
|
target_z = y_arr[cur_y]
|
|
/*
|
|
//debug
|
|
world << "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]"
|
|
world << "Target Z = [target_z]"
|
|
world << "Next X = [next_x]"
|
|
//debug
|
|
*/
|
|
if(target_z)
|
|
A.z = target_z
|
|
A.x = world.maxx - 2
|
|
spawn (0)
|
|
if ((A && A.loc))
|
|
A.loc.Entered(A)
|
|
else if (src.x >= world.maxx)
|
|
if(istype(A, /obj/effect/meteor))
|
|
del(A)
|
|
return
|
|
|
|
var/list/cur_pos = src.get_global_map_pos()
|
|
if(!cur_pos) return
|
|
cur_x = cur_pos["x"]
|
|
cur_y = cur_pos["y"]
|
|
next_x = (++cur_x > global_map.len ? 1 : cur_x)
|
|
y_arr = global_map[next_x]
|
|
target_z = y_arr[cur_y]
|
|
/*
|
|
//debug
|
|
world << "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]"
|
|
world << "Target Z = [target_z]"
|
|
world << "Next X = [next_x]"
|
|
//debug
|
|
*/
|
|
if(target_z)
|
|
A.z = target_z
|
|
A.x = 3
|
|
spawn (0)
|
|
if ((A && A.loc))
|
|
A.loc.Entered(A)
|
|
else if (src.y <= 1)
|
|
if(istype(A, /obj/effect/meteor))
|
|
del(A)
|
|
return
|
|
var/list/cur_pos = src.get_global_map_pos()
|
|
if(!cur_pos) return
|
|
cur_x = cur_pos["x"]
|
|
cur_y = cur_pos["y"]
|
|
y_arr = global_map[cur_x]
|
|
next_y = (--cur_y||y_arr.len)
|
|
target_z = y_arr[next_y]
|
|
/*
|
|
//debug
|
|
world << "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]"
|
|
world << "Next Y = [next_y]"
|
|
world << "Target Z = [target_z]"
|
|
//debug
|
|
*/
|
|
if(target_z)
|
|
A.z = target_z
|
|
A.y = world.maxy - 2
|
|
spawn (0)
|
|
if ((A && A.loc))
|
|
A.loc.Entered(A)
|
|
|
|
else if (src.y >= world.maxy)
|
|
if(istype(A, /obj/effect/meteor)||istype(A, /obj/effect/space_dust))
|
|
del(A)
|
|
return
|
|
var/list/cur_pos = src.get_global_map_pos()
|
|
if(!cur_pos) return
|
|
cur_x = cur_pos["x"]
|
|
cur_y = cur_pos["y"]
|
|
y_arr = global_map[cur_x]
|
|
next_y = (++cur_y > y_arr.len ? 1 : cur_y)
|
|
target_z = y_arr[next_y]
|
|
/*
|
|
//debug
|
|
world << "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]"
|
|
world << "Next Y = [next_y]"
|
|
world << "Target Z = [target_z]"
|
|
//debug
|
|
*/
|
|
if(target_z)
|
|
A.z = target_z
|
|
A.y = 3
|
|
spawn (0)
|
|
if ((A && A.loc))
|
|
A.loc.Entered(A)
|
|
return |