DRAGnet snares now use a dedicated beacon instead of the station teleporter (#84118)

## About The Pull Request

This sets up an alternative to the DRAGnet snares using the teleporter
to determine the destination of their snare teleport -- The DRAGnet
beacon.

![drag
net](https://github.com/tgstation/tgstation/assets/28870487/0084d4d9-378f-4896-bc88-0685d6407999)

Rather than using a convoluted system that routes via the teleporter,
DRAGnets can now by synced with a DRAGnet beacon. When snare rounds are
fired and successfully teleport a target, they will instead be sent to
the synced beacon. Syncing can be done by either pressing the gun to the
beacon or vice-versa.

These beacons can be wrenched into place, then swiped with a security ID
to block them from being unwrenched. An emag will unlock and unwrench
the beacon, and fry its access control.

To facilitate this change, roundstart DRAGnet armory spawns are now done
through spawners (like the other weapons), which includes a single
beacon to be used by the two guns. You can print more with basic sec
tech, and one is included in the DRAGnet crate from cargo.

The teleport is also slightly more accurate, to make it more consistent.
As usual, if not synced to a beacon, DRAGnets will just teleport your
target willy-nilly.
## Why It's Good For The Game

The current system is both clunky and prone to mishaps, dissuading
players from engaging with it. The "active" teleporter concept has
always been a bit of a mystery to players, and when a system for
properly using the DRAGnet teleport is set up, it's incredibly easy to
break even on accident. Every time you teleport a prisoner you have to
pray that no bumbling space explorer decided to reroute the teleporter
to the abandoned satellite.

This system is much more clear and reliable. It's also more versatile,
allowing for multiple teleport networks to be set up simultaneously.
Security is starved for creativity at times. They deserve to be able to
do some wacky dynamic stuff with their tools.
## Changelog
🆑 Rhials
balance: DRAGnets now come with a beacon they can be synced to, which
will set the destination for the snare round's teleport ability.
/🆑
This commit is contained in:
Rhials
2024-06-20 10:19:30 -07:00
committed by GitHub
parent 142347602c
commit 7b1a0daad2
15 changed files with 134 additions and 34 deletions
+1 -1
View File
@@ -45122,7 +45122,7 @@
/obj/structure/rack,
/obj/effect/spawner/random/armory/riot_helmet,
/obj/effect/spawner/random/armory/bulletproof_helmet,
/obj/item/gun/energy/e_gun/dragnet,
/obj/effect/spawner/random/armory/dragnet,
/turf/open/floor/iron/dark/small,
/area/station/ai_monitored/security/armory)
"qaV" = (
@@ -882,11 +882,8 @@
pixel_x = 3
},
/obj/structure/window/reinforced/spawner/directional/north,
/obj/item/gun/energy/e_gun/dragnet{
pixel_y = 4
},
/obj/item/gun/energy/e_gun/dragnet,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/effect/spawner/random/armory/dragnet,
/turf/open/floor/iron/dark,
/area/station/ai_monitored/security/armory)
"alG" = (
@@ -30518,15 +30518,12 @@
"jko" = (
/obj/structure/railing,
/obj/structure/rack,
/obj/item/gun/energy/e_gun/dragnet{
pixel_y = 4
},
/obj/item/gun/energy/e_gun/dragnet,
/obj/structure/cable,
/obj/machinery/door/firedoor/border_only,
/obj/effect/turf_decal/tile/red/half/contrasted{
dir = 1
},
/obj/effect/spawner/random/armory/dragnet,
/turf/open/floor/iron/dark/textured,
/area/station/ai_monitored/security/armory/upper)
"jkx" = (
+1 -2
View File
@@ -32130,12 +32130,11 @@
/area/station/maintenance/fore)
"loY" = (
/obj/structure/rack,
/obj/item/gun/energy/e_gun/dragnet,
/obj/item/gun/energy/e_gun/dragnet,
/obj/effect/turf_decal/tile/blue/half/contrasted{
dir = 4
},
/obj/machinery/light/small/directional/west,
/obj/effect/spawner/random/armory/dragnet,
/turf/open/floor/iron/dark,
/area/station/ai_monitored/security/armory)
"lpo" = (
+1 -1
View File
@@ -57668,7 +57668,7 @@
/area/station/science/lower)
"oOW" = (
/obj/structure/rack,
/obj/item/gun/energy/e_gun/dragnet,
/obj/effect/spawner/random/armory/dragnet,
/turf/open/floor/iron/dark,
/area/station/ai_monitored/security/armory)
"oOY" = (
+1 -2
View File
@@ -28696,10 +28696,9 @@
/area/station/cargo/storage)
"jlQ" = (
/obj/structure/rack,
/obj/item/gun/energy/e_gun/dragnet,
/obj/item/gun/energy/e_gun/dragnet,
/obj/item/radio/intercom/directional/north,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/effect/spawner/random/armory/dragnet,
/turf/open/floor/iron/dark,
/area/station/ai_monitored/security/armory)
"jlX" = (
+1 -2
View File
@@ -13544,12 +13544,11 @@
/area/station/maintenance/department/medical)
"eQJ" = (
/obj/structure/rack,
/obj/item/gun/energy/e_gun/dragnet,
/obj/item/gun/energy/e_gun/dragnet,
/obj/effect/turf_decal/tile/red/half/contrasted{
dir = 1
},
/obj/item/radio/intercom/directional/south,
/obj/effect/spawner/random/armory/dragnet,
/turf/open/floor/iron/dark,
/area/station/ai_monitored/security/armory)
"eQQ" = (
@@ -45,6 +45,16 @@
icon_state = "shotgun"
loot = list(/obj/item/gun/ballistic/shotgun/riot)
/obj/effect/spawner/random/armory/dragnet
name = "DRAGnet spawner"
icon_state = "dragnet"
loot = list(/obj/item/gun/energy/e_gun/dragnet)
spawn_loot_count = 2
/obj/effect/spawner/random/armory/dragnet/spawn_loot(lootcount_override)
. = ..()
new /obj/item/dragnet_beacon(get_turf(src)) //And give them a beacon too!
// Armor
/obj/effect/spawner/random/armory/bulletproof_helmet
name = "bulletproof helmet spawner"
+5 -2
View File
@@ -214,9 +214,12 @@
/datum/supply_pack/security/armory/dragnet
name = "DRAGnet Crate"
desc = "Contains three \"Dynamic Rapid-Apprehension of the Guilty\" netting devices, \
a recent breakthrough in law enforcement prisoner management technology."
a recent breakthrough in law enforcement prisoner management technology. Includes a DRAGnet beacon."
cost = CARGO_CRATE_VALUE * 5
contains = list(/obj/item/gun/energy/e_gun/dragnet = 3)
contains = list(
/obj/item/gun/energy/e_gun/dragnet = 3,
/obj/item/dragnet_beacon = 1
)
crate_name = "\improper DRAGnet crate"
/datum/supply_pack/security/armory/energy
@@ -86,7 +86,7 @@
/obj/item/gun/energy/e_gun/dragnet
name = "\improper DRAGnet"
desc = "The \"Dynamic Rapid-Apprehension of the Guilty\" net is a revolution in law enforcement technology."
desc = "The \"Dynamic Rapid-Apprehension of the Guilty\" net is a revolution in law enforcement technology. Can by synced with a DRAGnet beacon to set a teleport destination for snare rounds."
icon_state = "dragnet"
inhand_icon_state = "dragnet"
lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
@@ -95,10 +95,35 @@
modifystate = FALSE
w_class = WEIGHT_CLASS_NORMAL
ammo_x_offset = 1
///A dragnet beacon set to be the teleport destination for snare teleport rounds.
var/obj/item/dragnet_beacon/linked_beacon
/obj/item/gun/energy/e_gun/dragnet/add_seclight_point()
return
/obj/item/gun/energy/e_gun/dragnet/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
if(istype(tool, /obj/item/dragnet_beacon))
link_beacon(user, tool)
///Sets the linked_beacon var on the dragnet, which becomes the snare round's teleport destination.
/obj/item/gun/energy/e_gun/dragnet/proc/link_beacon(mob/living/user, obj/item/dragnet_beacon/our_beacon)
if(linked_beacon)
if(our_beacon == linked_beacon)
balloon_alert(user, "already synced!")
return
else
UnregisterSignal(linked_beacon, COMSIG_QDELETING) //You're getting overridden dude.
linked_beacon = our_beacon
balloon_alert(user, "beacon synced")
RegisterSignal(our_beacon, COMSIG_QDELETING, PROC_REF(handle_beacon_disable))
///Handles clearing the linked_beacon reference in the event that it is deleted.
/obj/item/gun/energy/e_gun/dragnet/proc/handle_beacon_disable(datum/source)
SIGNAL_HANDLER
visible_message(span_warning("A light on the [src] flashes, indicating that it is no longer linked with a DRAGnet beacon!"))
linked_beacon = null
/obj/item/gun/energy/e_gun/dragnet/snare
name = "Energy Snare Launcher"
desc = "Fires an energy snare that slows the target down."
@@ -11,10 +11,15 @@
SpinAnimation()
/obj/projectile/energy/net/on_hit(atom/target, blocked = 0, pierce_hit)
var/obj/item/dragnet_beacon/destination_beacon = null
var/obj/item/gun/energy/e_gun/dragnet/our_dragnet = fired_from
if(our_dragnet && istype(our_dragnet))
destination_beacon = our_dragnet.linked_beacon
if(isliving(target))
var/turf/Tloc = get_turf(target)
if(!locate(/obj/effect/nettingportal) in Tloc)
new /obj/effect/nettingportal(Tloc)
new /obj/effect/nettingportal(Tloc, destination_beacon)
. = ..()
/obj/projectile/energy/net/on_range()
@@ -29,26 +34,18 @@
light_range = 3
anchored = TRUE
/obj/effect/nettingportal/Initialize(mapload)
/obj/effect/nettingportal/Initialize(mapload, destination_beacon)
. = ..()
var/obj/item/beacon/teletarget = null
for(var/obj/machinery/computer/teleporter/com as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/computer/teleporter))
var/atom/target = com.target_ref?.resolve()
if(target)
if(com.power_station && com.power_station.teleporter_hub && com.power_station.engaged)
teletarget = target
else
com.target_ref = null
var/obj/item/dragnet_beacon/teletarget = destination_beacon
addtimer(CALLBACK(src, PROC_REF(pop), teletarget), 3 SECONDS)
/obj/effect/nettingportal/proc/pop(teletarget)
if(teletarget)
for(var/mob/living/L in get_turf(src))
do_teleport(L, teletarget, 2, channel = TELEPORT_CHANNEL_BLUESPACE)//teleport what's in the tile to the beacon
for(var/mob/living/living_mob in get_turf(src))
do_teleport(living_mob, get_turf(teletarget), 1, channel = TELEPORT_CHANNEL_BLUESPACE) //Teleport what's in the tile to the beacon
else
for(var/mob/living/L in get_turf(src))
do_teleport(L, L, 15, channel = TELEPORT_CHANNEL_BLUESPACE) //Otherwise it just warps you off somewhere.
for(var/mob/living/living_mob in get_turf(src))
do_teleport(living_mob, get_turf(living_mob), 15, channel = TELEPORT_CHANNEL_BLUESPACE) //Otherwise it just warps you off somewhere.
qdel(src)
@@ -58,6 +55,66 @@
/obj/effect/nettingportal/singularity_pull()
return
/obj/item/dragnet_beacon
name = "\improper DRAGnet beacon"
desc = "Can be synced with a DRAGnet to set it as a designated teleporting point."
icon = 'icons/obj/devices/tracker.dmi'
icon_state = "dragnet_beacon"
inhand_icon_state = "beacon"
lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi'
///Has a security ID been used to lock this in place?
var/locked = FALSE
/obj/item/dragnet_beacon/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
if(istype(tool, /obj/item/gun/energy/e_gun/dragnet))
var/obj/item/gun/energy/e_gun/dragnet/dragnet_to_link = tool
dragnet_to_link.link_beacon(user, src)
return
if(isidcard(tool))
if(!anchored)
balloon_alert(user, "wrench the beacon first!")
return
if(obj_flags & EMAGGED)
balloon_alert(user, "the access control is fried!")
return
var/obj/item/card/id/id_card = tool
if((ACCESS_SECURITY in id_card.GetAccess()))
locked = !locked
balloon_alert(user, "beacon [locked ? "locked" : "unlocked"]")
else
balloon_alert(user, "no access!")
/obj/item/dragnet_beacon/wrench_act(mob/living/user, obj/item/tool)
if(user.is_holding(src))
balloon_alert(user, "put it down first!")
return ITEM_INTERACT_BLOCKING
if(anchored && locked)
balloon_alert(user, "must be unlocked first!")
return ITEM_INTERACT_BLOCKING
if(isinspace() && !anchored)
balloon_alert(user, "nothing to anchor to!")
return ITEM_INTERACT_BLOCKING
set_anchored(!anchored)
tool.play_tool_sound(src, 75)
user.balloon_alert_to_viewers("[anchored ? "anchored" : "unanchored"]")
/obj/item/dragnet_beacon/emag_act(mob/user, obj/item/card/emag/emag_card)
if(obj_flags & EMAGGED)
return FALSE
obj_flags |= EMAGGED
locked = FALSE
set_anchored(FALSE)
do_sparks(3, TRUE, src)
balloon_alert(user, "beacon unlocked")
return TRUE
/obj/projectile/energy/trap
name = "energy snare"
icon_state = "e_snare"
@@ -818,6 +818,19 @@
)
departmental_flags = DEPARTMENT_BITFLAG_SECURITY
/datum/design/dragnet_beacon
name = "DRAGnet Beacon"
desc = "A beacon that can be used as a teleport destination for DRAGnet snare rounds. Remember to sync it with your DRAGnet first!"
id = "dragnet_beacon"
build_type = PROTOLATHE | AWAY_LATHE
materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2)
build_path = /obj/item/dragnet_beacon
category = list(
RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SECURITY
)
departmental_flags = DEPARTMENT_BITFLAG_SECURITY
/datum/design/inspector
name = "N-Spect Scanner"
desc = "Central Command-issued inspection device. Performs inspections according to Nanotrasen protocols when activated, then prints an encrypted report regarding the maintenance of the station. Definitely not giving you cancer."
@@ -32,6 +32,7 @@
"scanner_gate",
"turret_control",
"pepperspray",
"dragnet_beacon",
"inspector",
"evidencebag",
"handcuffs_s",
Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB