diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm
index 70024bf68d6..97905f59c7b 100644
--- a/code/datums/helper_datums/teleport.dm
+++ b/code/datums/helper_datums/teleport.dm
@@ -1,7 +1,9 @@
//wrapper
/proc/do_teleport(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null)
- new /datum/teleport/instant/science(arglist(args))
- return
+ var/datum/teleport/instant/science/D = new
+ if(D.start(arglist(args)))
+ return 1
+ return 0
/datum/teleport
var/atom/movable/teleatom //atom to teleport
@@ -14,192 +16,181 @@
var/force_teleport = 1 //if false, teleport will use Move() proc (dense objects will prevent teleportation)
- New(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null)
- ..()
- if(!Init(arglist(args)))
- return 0
- return 1
+/datum/teleport/proc/start(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null)
+ if(!initTeleport(arglist(args)))
+ return 0
+ return 1
- proc/Init(ateleatom,adestination,aprecision,afteleport,aeffectin,aeffectout,asoundin,asoundout)
- if(!setTeleatom(ateleatom))
- return 0
- if(!setDestination(adestination))
- return 0
- if(!setPrecision(aprecision))
- return 0
- setEffects(aeffectin,aeffectout)
- setForceTeleport(afteleport)
- setSounds(asoundin,asoundout)
- return 1
+/datum/teleport/proc/initTeleport(ateleatom,adestination,aprecision,afteleport,aeffectin,aeffectout,asoundin,asoundout)
+ if(!setTeleatom(ateleatom))
+ return 0
+ if(!setDestination(adestination))
+ return 0
+ if(!setPrecision(aprecision))
+ return 0
+ setEffects(aeffectin,aeffectout)
+ setForceTeleport(afteleport)
+ setSounds(asoundin,asoundout)
+ return 1
- //must succeed
- proc/setPrecision(aprecision)
- if(isnum(aprecision))
- precision = aprecision
- return 1
+//must succeed
+/datum/teleport/proc/setPrecision(aprecision)
+ if(isnum(aprecision))
+ precision = aprecision
+ return 1
+ return 0
+
+//must succeed
+/datum/teleport/proc/setDestination(atom/adestination)
+ if(istype(adestination))
+ destination = adestination
+ return 1
+ return 0
+
+//must succeed in most cases
+/datum/teleport/proc/setTeleatom(atom/movable/ateleatom)
+ if(istype(ateleatom, /obj/effect) && !istype(ateleatom, /obj/effect/dummy/chameleon))
+ qdel(ateleatom)
+ return 0
+ if(istype(ateleatom))
+ teleatom = ateleatom
+ return 1
+ return 0
+
+//custom effects must be properly set up first for instant-type teleports
+//optional
+/datum/teleport/proc/setEffects(datum/effect/effect/system/aeffectin=null,datum/effect/effect/system/aeffectout=null)
+ effectin = istype(aeffectin) ? aeffectin : null
+ effectout = istype(aeffectout) ? aeffectout : null
+ return 1
+
+//optional
+/datum/teleport/proc/setForceTeleport(afteleport)
+ force_teleport = afteleport
+ return 1
+
+//optional
+/datum/teleport/proc/setSounds(asoundin=null,asoundout=null)
+ soundin = isfile(asoundin) ? asoundin : null
+ soundout = isfile(asoundout) ? asoundout : null
+ return 1
+
+//placeholder
+/datum/teleport/proc/teleportChecks()
+ return 1
+
+/datum/teleport/proc/playSpecials(atom/location,datum/effect/effect/system/effect,sound)
+ if(location)
+ if(effect)
+ spawn(-1)
+ src = null
+ effect.attach(location)
+ effect.start()
+ if(sound)
+ spawn(-1)
+ src = null
+ playsound(location,sound,60,1)
+ return
+
+//do the monkey dance
+/datum/teleport/proc/doTeleport()
+
+ var/turf/destturf
+ var/turf/curturf = get_turf(teleatom)
+ var/area/destarea = get_area(destination)
+ if(precision)
+ var/list/posturfs = list()
+ var/center = get_turf(destination)
+ if(!center)
+ center = destination
+ for(var/turf/T in range(precision,center))
+ posturfs.Add(T)
+ destturf = safepick(posturfs)
+ else
+ destturf = get_turf(destination)
+
+ if(!destturf || !curturf)
return 0
- //must succeed
- proc/setDestination(atom/adestination)
- if(istype(adestination))
- destination = adestination
- return 1
- return 0
+ playSpecials(curturf,effectin,soundin)
- //must succeed in most cases
- proc/setTeleatom(atom/movable/ateleatom)
- if(istype(ateleatom, /obj/effect) && !istype(ateleatom, /obj/effect/dummy/chameleon))
- qdel(ateleatom)
- return 0
- if(istype(ateleatom))
- teleatom = ateleatom
- return 1
- return 0
-
- //custom effects must be properly set up first for instant-type teleports
- //optional
- proc/setEffects(datum/effect/effect/system/aeffectin=null,datum/effect/effect/system/aeffectout=null)
- effectin = istype(aeffectin) ? aeffectin : null
- effectout = istype(aeffectout) ? aeffectout : null
- return 1
-
- //optional
- proc/setForceTeleport(afteleport)
- force_teleport = afteleport
- return 1
-
- //optional
- proc/setSounds(asoundin=null,asoundout=null)
- soundin = isfile(asoundin) ? asoundin : null
- soundout = isfile(asoundout) ? asoundout : null
- return 1
-
- //placeholder
- proc/teleportChecks()
- return 1
-
- proc/playSpecials(atom/location,datum/effect/effect/system/effect,sound)
- if(location)
- if(effect)
- spawn(-1)
- src = null
- effect.attach(location)
- effect.start()
- if(sound)
- spawn(-1)
- src = null
- playsound(location,sound,60,1)
- return
-
- //do the monkey dance
- proc/doTeleport()
-
- var/turf/destturf
- var/turf/curturf = get_turf(teleatom)
- var/area/destarea = get_area(destination)
- if(precision)
- var/list/posturfs = circlerangeturfs(destination,precision)
- destturf = safepick(posturfs)
- else
- destturf = get_turf(destination)
-
- if(!destturf || !curturf)
- return 0
-
- playSpecials(curturf,effectin,soundin)
-
- var/obj/structure/stool/bed/chair/C = null
- if(isliving(teleatom))
- var/mob/living/L = teleatom
- if(L.buckled)
- C = L.buckled
- if(force_teleport)
- teleatom.forceMove(destturf)
+ if(force_teleport)
+ teleatom.forceMove(destturf)
+ playSpecials(destturf,effectout,soundout)
+ else
+ if(teleatom.Move(destturf))
playSpecials(destturf,effectout,soundout)
- else
- if(teleatom.Move(destturf))
- playSpecials(destturf,effectout,soundout)
- if(C)
- C.forceMove(destturf)
- destarea.Entered(teleatom)
+ if(isliving(teleatom))
+ var/mob/living/L = teleatom
+ if(L.buckled)
+ L.buckled.unbuckle()
- return 1
+ destarea.Entered(teleatom)
- proc/teleport()
- if(teleportChecks())
- return doTeleport()
- return 0
+ return 1
+
+/datum/teleport/proc/teleport()
+ if(teleportChecks())
+ return doTeleport()
+ return 0
/datum/teleport/instant //teleports when datum is created
- New(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null)
+ start(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null)
if(..())
- teleport()
- return
+ if(teleport())
+ return 1
+ return 0
/datum/teleport/instant/science
- setEffects(datum/effect/effect/system/aeffectin,datum/effect/effect/system/aeffectout)
- if(!aeffectin || !aeffectout)
- var/datum/effect/effect/system/spark_spread/aeffect = new
- aeffect.set_up(5, 1, teleatom)
- effectin = effectin || aeffect
- effectout = effectout || aeffect
- return 1
- else
- return ..()
-
- setPrecision(aprecision)
- ..()
- if(istype(teleatom, /obj/item/weapon/storage/backpack/holding))
- precision = rand(1,100)
-
- var/list/bagholding = teleatom.search_contents_for(/obj/item/weapon/storage/backpack/holding)
- if(bagholding.len)
- precision = max(rand(1,100)*bagholding.len,100)
- if(istype(teleatom, /mob/living))
- var/mob/living/MM = teleatom
- MM << "\red The Bluespace interface on your Bag of Holding interferes with the teleport!"
+/datum/teleport/instant/science/setEffects(datum/effect/effect/system/aeffectin,datum/effect/effect/system/aeffectout)
+ if(aeffectin==null || aeffectout==null)
+ var/datum/effect/effect/system/spark_spread/aeffect = new
+ aeffect.set_up(5, 1, teleatom)
+ effectin = effectin || aeffect
+ effectout = effectout || aeffect
return 1
+ else
+ return ..()
- teleportChecks()
- if(istype(teleatom, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks get teleported --NeoFite
- teleatom.visible_message("\red The [teleatom] bounces off of the portal!")
- return 0
+/datum/teleport/instant/science/setPrecision(aprecision)
+ ..()
+ if(istype(teleatom, /obj/item/weapon/storage/backpack/holding))
+ precision = rand(1,100)
- if(istype(teleatom, /obj/item/flag/nation)) // Don't let nuke disks get teleported --NeoFite
- teleatom.visible_message("\red The [teleatom] bounces off of the portal!")
- return 0
+ var/list/bagholding = teleatom.search_contents_for(/obj/item/weapon/storage/backpack/holding)
+ if(bagholding.len)
+ precision = max(rand(1,100)*bagholding.len,100)
+ if(istype(teleatom, /mob/living))
+ var/mob/living/MM = teleatom
+ MM << "The bluespace interface on your bag of holding interferes with the teleport!"
+ return 1
+/datum/teleport/instant/science/teleportChecks()
+ if(istype(teleatom, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks get teleported --NeoFite
+ teleatom.visible_message("The portal rejects [teleatom]!")
+ return 0
- if(!isemptylist(teleatom.search_contents_for(/obj/item/weapon/disk/nuclear)))
- if(istype(teleatom, /mob/living))
- var/mob/living/MM = teleatom
- MM.visible_message("\red The [MM] bounces off of the portal!","\red Something you are carrying seems to be unable to pass through the portal. Better drop it if you want to go through.")
- else
- teleatom.visible_message("\red The [teleatom] bounces off of the portal!")
- return 0
+ if(istype(teleatom, /obj/item/flag/nation)) // Don't let nation's flags get teleported either --Fox
+ teleatom.visible_message("The portal rejects [teleatom]!")
+ return 0
- if(!isemptylist(teleatom.search_contents_for(/obj/item/flag/nation)))
- if(istype(teleatom, /mob/living))
- var/mob/living/MM = teleatom
- MM.visible_message("\red The [MM] bounces off of the portal!","\red Something you are carrying seems to be unable to pass through the portal. Better drop it if you want to go through.")
- else
- teleatom.visible_message("\red The [teleatom] bounces off of the portal!")
- return 0
+ if(!isemptylist(teleatom.search_contents_for(/obj/item/weapon/disk/nuclear)))
+ if(istype(teleatom, /mob/living))
+ var/mob/living/MM = teleatom
+ MM.visible_message("The portal rejects [MM]!","The nuclear disk that you're carrying seems to be unable to pass through the portal. Better drop it if you want to go through.")
+ else
+ teleatom.visible_message("The portal rejects [teleatom]!")
+ return 0
- if((destination.z in config.admin_levels)) //centcomm z-level
- if(istype(teleatom, /obj/mecha))
- var/obj/mecha/MM = teleatom
- MM.occupant << "\red The mech would not survive the jump to a location so far away!"
- return 0
- if(!isemptylist(teleatom.search_contents_for(/obj/item/weapon/storage/backpack/holding)))
- teleatom.visible_message("\red The Bag of Holding bounces off of the portal!")
- return 0
-
-
- if(!(destination.z in config.player_levels)) //Away mission z-levels
- return 0
- return 1
\ No newline at end of file
+ if(!isemptylist(teleatom.search_contents_for(/obj/item/flag/nation)))
+ if(istype(teleatom, /mob/living))
+ var/mob/living/MM = teleatom
+ MM.visible_message("The portal rejects [MM]!","The flag that you're carrying seems to be unable to pass through the portal. Better drop it if you want to go through.")
+ else
+ teleatom.visible_message("The portal rejects [teleatom]!")
+ return 0
+ return 1
\ No newline at end of file