mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-22 16:12:19 +00:00
157 lines
4.0 KiB
Plaintext
157 lines
4.0 KiB
Plaintext
/* Simple object type, calls a proc when "stepped" on by something */
|
|
|
|
/obj/effect/step_trigger
|
|
var/affect_ghosts = 0
|
|
var/stopper = 1 // stops throwers
|
|
icon = 'icons/mob/screen/generic.dmi'
|
|
icon_state = "x2"
|
|
invisibility = 101 // nope cant see this shit
|
|
anchored = 1
|
|
|
|
/obj/effect/step_trigger/proc/Trigger(var/atom/movable/A)
|
|
return 0
|
|
|
|
/obj/effect/step_trigger/Crossed(H as mob|obj)
|
|
..()
|
|
if(!H)
|
|
return
|
|
if(istype(H, /mob/abstract/observer) && !affect_ghosts)
|
|
return
|
|
Trigger(H)
|
|
|
|
|
|
|
|
/* Tosses things in a certain direction */
|
|
|
|
/obj/effect/step_trigger/thrower
|
|
var/tiles = 3 // if 0: forever until atom hits a stopper
|
|
var/immobilize = 1 // if nonzero: prevents mobs from moving while they're being flung
|
|
var/speed = 1 // delay of movement
|
|
var/facedir = 0 // if 1: atom faces the direction of movement
|
|
var/nostop = 0 // if 1: will only be stopped by teleporters
|
|
var/list/affecting = list()
|
|
|
|
Trigger(var/atom/A)
|
|
if(!A || !istype(A, /atom/movable))
|
|
return
|
|
var/atom/movable/AM = A
|
|
var/curtiles = 0
|
|
var/stopthrow = 0
|
|
for(var/obj/effect/step_trigger/thrower/T in orange(2, src))
|
|
if(AM in T.affecting)
|
|
return
|
|
|
|
if(ismob(AM))
|
|
var/mob/M = AM
|
|
if(immobilize)
|
|
M.canmove = 0
|
|
|
|
affecting.Add(AM)
|
|
while(AM && !stopthrow)
|
|
if(tiles)
|
|
if(curtiles >= tiles)
|
|
break
|
|
if(AM.z != src.z)
|
|
break
|
|
|
|
curtiles++
|
|
|
|
sleep(speed)
|
|
|
|
// Calculate if we should stop the process
|
|
if(!nostop)
|
|
for(var/obj/effect/step_trigger/T in get_step(AM, dir))
|
|
if(T.stopper && T != src)
|
|
stopthrow = 1
|
|
else
|
|
for(var/obj/effect/step_trigger/teleporter/T in get_step(AM, dir))
|
|
if(T.stopper)
|
|
stopthrow = 1
|
|
|
|
if(AM)
|
|
var/predir = AM.dir
|
|
step(AM, dir)
|
|
if(!facedir)
|
|
AM.set_dir(predir)
|
|
|
|
affecting.Remove(AM)
|
|
if(ismob(AM))
|
|
var/mob/M = AM
|
|
if(immobilize)
|
|
M.canmove = 1
|
|
|
|
/obj/effect/step_trigger/thrower/shuttle
|
|
icon_state = "dir_arrow"
|
|
affect_ghosts = TRUE
|
|
nostop = TRUE
|
|
tiles = 0
|
|
|
|
/obj/effect/step_trigger/thrower/shuttle/north
|
|
name = "north_thrower"
|
|
dir = NORTH
|
|
|
|
/obj/effect/step_trigger/thrower/shuttle/northeast
|
|
name = "northeast_thrower"
|
|
dir = NORTHEAST
|
|
|
|
/obj/effect/step_trigger/thrower/shuttle/east
|
|
name = "east_thrower"
|
|
dir = EAST
|
|
|
|
/obj/effect/step_trigger/thrower/shuttle/southeast
|
|
name = "southeast_thrower"
|
|
dir = SOUTHEAST
|
|
|
|
/obj/effect/step_trigger/thrower/shuttle/south
|
|
name = "south_thrower"
|
|
dir = SOUTH
|
|
|
|
/obj/effect/step_trigger/thrower/shuttle/southwest
|
|
name = "southwest_thrower"
|
|
dir = SOUTHWEST
|
|
|
|
/obj/effect/step_trigger/thrower/shuttle/west
|
|
name = "west_thrower"
|
|
dir = WEST
|
|
|
|
/obj/effect/step_trigger/thrower/shuttle/northwest
|
|
name = "northwest_thrower"
|
|
dir = NORTHWEST
|
|
|
|
/* Stops things thrown by a thrower, doesn't do anything */
|
|
|
|
/obj/effect/step_trigger/stopper
|
|
|
|
/* Instant teleporter */
|
|
|
|
/obj/effect/step_trigger/teleporter
|
|
var/teleport_x = 0 // teleportation coordinates (if one is null, then no teleport!)
|
|
var/teleport_y = 0
|
|
var/teleport_z = 0
|
|
|
|
Trigger(var/atom/movable/A)
|
|
if(teleport_x && teleport_y && teleport_z)
|
|
|
|
A.x = teleport_x
|
|
A.y = teleport_y
|
|
A.z = teleport_z
|
|
|
|
/* Random teleporter, teleports atoms to locations ranging from teleport_x - teleport_x_offset, etc */
|
|
|
|
/obj/effect/step_trigger/teleporter/random
|
|
var/teleport_x_offset = 0
|
|
var/teleport_y_offset = 0
|
|
var/teleport_z_offset = 0
|
|
|
|
/obj/effect/step_trigger/teleporter/random/Trigger(var/atom/movable/A)
|
|
if(teleport_x && teleport_y && teleport_z)
|
|
if(teleport_x_offset && teleport_y_offset && teleport_z_offset)
|
|
if(isliving(A))
|
|
var/mob/M = A
|
|
M.visible_message(FONT_LARGE(SPAN_WARNING("\The [A] blinks out of reality!")), FONT_LARGE(SPAN_WARNING("You feel your stomach churn as you slip into bluespace!")))
|
|
A.x = rand(teleport_x, teleport_x_offset)
|
|
A.y = rand(teleport_y, teleport_y_offset)
|
|
A.z = rand(teleport_z, teleport_z_offset)
|
|
if(isliving(A))
|
|
var/mob/M = A
|
|
M.visible_message(FONT_LARGE(SPAN_WARNING("\The [A] blinks into reality!")), FONT_LARGE(SPAN_WARNING("You feel your stomach turn as you get thrown out of bluespace!"))) |