diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 1ad6ec8e32f..b8b6aa0cacb 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -103,7 +103,10 @@ if(!center) center = destination for(var/turf/T in range(precision,center)) - posturfs.Add(T) + var/area/A = T.loc + if(!A.noteleport) + posturfs.Add(T) + destturf = safepick(posturfs) else destturf = get_turf(destination) @@ -111,6 +114,10 @@ if(!destturf || !curturf) return 0 + var/area/A = get_area(curturf) + if(A.noteleport) + return 0 + playSpecials(curturf,effectin,soundin) if(force_teleport) diff --git a/code/game/area/Space_Station_13_areas.dm b/code/game/area/Space_Station_13_areas.dm index 1077f37946c..b00faf21ed4 100644 --- a/code/game/area/Space_Station_13_areas.dm +++ b/code/game/area/Space_Station_13_areas.dm @@ -54,6 +54,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station var/static_environ var/has_gravity = 0 + var/noteleport = 0 //Are you forbidden from teleporting to the area? (centcomm, mobs, wizard, hand teleporter) var/safe = 0 //Is the area teleport-safe: no space / radiation / aggresive mobs / other dangers var/no_air = null @@ -67,7 +68,7 @@ var/list/teleportlocs = list() /proc/process_teleport_locs() for(var/area/AR in world) - if(istype(AR, /area/shuttle) || istype(AR, /area/wizard_station)) continue + if(istype(AR, /area/shuttle) || istype(AR, /area/wizard_station) || AR.noteleport) continue if(teleportlocs.Find(AR.name)) continue var/turf/picked = safepick(get_area_turfs(AR.type)) if (picked && (picked.z == ZLEVEL_STATION)) @@ -175,6 +176,7 @@ var/list/teleportlocs = list() icon_state = "centcom" requires_power = 0 has_gravity = 1 + noteleport = 1 blob_allowed = 0 //Should go without saying, no blobs should take over centcom as a win condition. /area/centcom/control @@ -202,6 +204,7 @@ var/list/teleportlocs = list() icon_state = "syndie-ship" requires_power = 0 has_gravity = 1 + noteleport = 1 blob_allowed = 0 //Not... entirely sure this will ever come up... but if the bus makes blobs AND ops, it shouldn't aim for the ops to win. /area/syndicate_mothership/control @@ -284,12 +287,14 @@ var/list/teleportlocs = list() icon_state = "yellow" requires_power = 0 has_gravity = 1 + noteleport = 1 //Abductors /area/abductor_ship name = "Abductor Ship" icon_state = "yellow" requires_power = 0 + noteleport = 1 has_gravity = 1 diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index c44eb8d5356..b1776e58c52 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -22,6 +22,10 @@ src.loc = loc src.target = target src.creator = creator + var/area/A = target.loc + if(A.noteleport) // No point in persisting if the target is unreachable. + qdel(src) + return for(var/mob/M in src.loc) src.teleport(M) if(lifespan > 0) diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index 0e3496cbfc7..010e07df9a7 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -138,12 +138,16 @@ Frequency: /obj/item/weapon/hand_tele/attack_self(mob/user) var/turf/current_location = get_turf(user)//What turf is the user on? - if(!current_location||current_location.z==2||current_location.z>=7 || !istype(user.loc, /turf))//If turf was not found or they're on z level 2 or >7 which does not currently exist. or if user is not located on a turf + var/area/current_area = current_location.loc + if(!current_location||current_area.noteleport||current_location.z>=7 || !istype(user.loc, /turf))//If turf was not found or they're on z level 2 or >7 which does not currently exist. or if user is not located on a turf user << "\The [src] is malfunctioning." return var/list/L = list( ) for(var/obj/machinery/computer/teleporter/com in machines) if(com.target) + var/area/A = get_area(com.target) + if(A.noteleport) + continue if(com.power_station && com.power_station.teleporter_hub && com.power_station.engaged) L["[get_area(com.target)] (Active)"] = com.target else @@ -154,6 +158,9 @@ Frequency: continue //putting them at the edge is dumb if(T.y>world.maxy-8 || T.y<8) continue + var/area/A = T.loc + if(A.noteleport) + continue turfs += T if(turfs.len) L["None (Dangerous)"] = pick(turfs) @@ -163,7 +170,11 @@ Frequency: if(active_portals >= 3) user.show_message("\The [src] is recharging!") return - var/T = L[t1] + var/atom/T = L[t1] + var/area/A = get_area(T) + if(A.noteleport) + user << "\The [src] is malfunctioning." + return user.show_message("Locked In.", 2) var/obj/effect/portal/P = new /obj/effect/portal(get_turf(src), T, src) try_move_adjacent(P) diff --git a/code/game/objects/items/weapons/teleprod.dm b/code/game/objects/items/weapons/teleprod.dm index b36fade0feb..8ac8b9ebaf9 100644 --- a/code/game/objects/items/weapons/teleprod.dm +++ b/code/game/objects/items/weapons/teleprod.dm @@ -10,9 +10,12 @@ if(status && user.disabilities & CLUMSY && prob(50)) user.visible_message("[user] accidentally hits themself with [src]!", \ "You accidentally hit yourself with [src]!") - user.Weaken(stunforce*3) - deductcharge(hitcost) - do_teleport(user, get_turf(user), 50)//honk honk + if(do_teleport(user, get_turf(user), 50))//honk honk + user.Weaken(stunforce*3) + deductcharge(hitcost) + else + user.Weaken(stunforce*3) + deductcharge(hitcost/4) return else if(status) diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index e6bcc070ea9..1262c57d5bd 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -125,11 +125,11 @@ no_den_usage = 1 /obj/item/weapon/gun/magic/wand/teleport/zap_self(mob/living/user) - do_teleport(user, user, 10) - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(3, user.loc) - smoke.start() - charges-- + if(do_teleport(user, user, 10)) + var/datum/effect_system/smoke_spread/smoke = new + smoke.set_up(3, user.loc) + smoke.start() + charges-- ..() ///////////////////////////////////// diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 0b7de405d28..9df7b5a5140 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -84,11 +84,11 @@ teleloc = target.loc for(var/atom/movable/stuff in teleloc) if(!stuff.anchored && stuff.loc) - teleammount++ - do_teleport(stuff, stuff, 10) - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(max(round(4 - teleammount),0), stuff.loc) //Smoke drops off if a lot of stuff is moved for the sake of sanity - smoke.start() + if(do_teleport(stuff, stuff, 10)) + teleammount++ + var/datum/effect_system/smoke_spread/smoke = new + smoke.set_up(max(round(4 - teleammount),0), stuff.loc) //Smoke drops off if a lot of stuff is moved for the sake of sanity + smoke.start() /obj/item/projectile/magic/door name = "bolt of door creation"