mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-23 13:10:02 +01:00
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.  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:
@@ -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" = (
|
||||
|
||||
@@ -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" = (
|
||||
|
||||
@@ -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" = (
|
||||
|
||||
@@ -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" = (
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 |
Reference in New Issue
Block a user