mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-24 05:23:22 +01:00
Radiojammer Stationbound Blocking (#10246)
* AI Firedoor Rebalance * Update geeves-because-the-question-is-incorrect.yml * improve the implementation considerably * Update geeves-because-the-question-is-incorrect.yml * put this back * jammer UI
This commit is contained in:
@@ -108,6 +108,8 @@
|
||||
return ..()
|
||||
|
||||
/obj/item/device/radio/intercom/attack_ai(mob/user as mob)
|
||||
if(!ai_can_interact(user))
|
||||
return
|
||||
src.add_fingerprint(user)
|
||||
INVOKE_ASYNC(src, /obj/item/.proc/attack_self, user)
|
||||
|
||||
|
||||
@@ -1,59 +1,82 @@
|
||||
//Global list for housing active radiojammers:
|
||||
var/list/active_radio_jammers = list()
|
||||
|
||||
proc/within_jamming_range(var/atom/test) // tests if an object is near a radio jammer
|
||||
if (active_radio_jammers && active_radio_jammers.len)
|
||||
for (var/obj/item/device/radiojammer/Jammer in active_radio_jammers)
|
||||
if (get_dist(test, Jammer) <= Jammer.radius)
|
||||
return 1
|
||||
|
||||
return 0
|
||||
// tests if an object is near a radio jammer
|
||||
// if need_all_blocked is false, the jammer only needs to be on JAMMER_SYNTHETIC to work
|
||||
/proc/within_jamming_range(var/atom/test, var/need_all_blocked = TRUE)
|
||||
if(length(active_radio_jammers))
|
||||
var/turf/our_turf = get_turf(test)
|
||||
for(var/obj/item/device/radiojammer/J in active_radio_jammers)
|
||||
var/turf/jammer_turf = get_turf(J)
|
||||
if(our_turf.z != jammer_turf.z)
|
||||
continue
|
||||
if(get_dist(our_turf, jammer_turf) <= J.radius)
|
||||
if(need_all_blocked && J.active != JAMMER_ALL)
|
||||
continue
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/item/device/radiojammer
|
||||
name = "radio jammer"
|
||||
desc = "A small, inconspicious looking item with an 'ON/OFF' toggle."
|
||||
desc_info = "Use in-hand to activate or deactivate, alt-click while adjacent or in-hand to toggle whether it blocks all wireless signals, or just stationbound wireless interfacing."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "shield0"
|
||||
w_class = ITEMSIZE_SMALL
|
||||
|
||||
var/active = 0
|
||||
var/active = JAMMER_OFF
|
||||
var/radius = 7
|
||||
var/icon_state_active = "shield1"
|
||||
var/icon_state_inactive = "shield0"
|
||||
|
||||
/obj/item/device/radiojammer/active
|
||||
active = JAMMER_ALL
|
||||
|
||||
/obj/item/device/radiojammer/New()
|
||||
..()
|
||||
update()
|
||||
update_icon()
|
||||
|
||||
/obj/item/device/radiojammer/Destroy()
|
||||
if (active)
|
||||
active_radio_jammers -= src
|
||||
active_radio_jammers -= src
|
||||
return ..()
|
||||
|
||||
/obj/item/device/radiojammer/attack_self(mob/user)
|
||||
var/datum/vueui/ui = SSvueui.get_open_ui(user, src)
|
||||
if(!ui)
|
||||
ui = new(user, src, "devices-jammer", 200, 200, capitalize_first_letters(name))
|
||||
ui.open()
|
||||
|
||||
/obj/item/device/radiojammer/attack_self()
|
||||
toggle()
|
||||
/obj/item/device/radiojammer/vueui_data_change(var/list/data, var/mob/user, var/datum/vueui/ui)
|
||||
if(!data)
|
||||
data = list()
|
||||
|
||||
VUEUI_SET_CHECK(data["active"], active, ., data)
|
||||
|
||||
/obj/item/device/radiojammer/Topic(href, href_list)
|
||||
..()
|
||||
|
||||
if(href_list["set_active"])
|
||||
active = text2num(href_list["set_active"])
|
||||
update_icon()
|
||||
|
||||
var/datum/vueui/ui = SSvueui.get_open_ui(usr, src)
|
||||
ui.check_for_change()
|
||||
|
||||
/obj/item/device/radiojammer/emp_act()
|
||||
toggle()
|
||||
|
||||
|
||||
/obj/item/device/radiojammer/proc/toggle()
|
||||
if (active)
|
||||
to_chat(usr, "<span class='notice'>You deactivate \the [src].</span>")
|
||||
/obj/item/device/radiojammer/proc/toggle(var/mob/user)
|
||||
if(active)
|
||||
if(user)
|
||||
to_chat(user, SPAN_NOTICE("You deactivate \the [src]."))
|
||||
active = JAMMER_OFF
|
||||
else
|
||||
to_chat(usr, "<span class='notice'>You activate \the [src].</span>")
|
||||
set_active(!active)
|
||||
if(user)
|
||||
to_chat(user, SPAN_NOTICE("You activate \the [src]."))
|
||||
active = JAMMER_ALL
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/item/device/radiojammer/proc/set_active(var/new_value)
|
||||
active = new_value
|
||||
update()
|
||||
|
||||
|
||||
/obj/item/device/radiojammer/proc/update()
|
||||
if (active)
|
||||
/obj/item/device/radiojammer/update_icon()
|
||||
if(active > 0)
|
||||
active_radio_jammers += src
|
||||
icon_state = icon_state_active
|
||||
else
|
||||
@@ -64,6 +87,7 @@ proc/within_jamming_range(var/atom/test) // tests if an object is near a radio j
|
||||
/obj/item/device/radiojammer/improvised
|
||||
name = "improvised radio jammer"
|
||||
desc = "An awkward bundle of wires, batteries, and radio transmitters."
|
||||
desc_info = "Use in-hand to activate or deactivate."
|
||||
var/obj/item/cell/cell
|
||||
var/obj/item/device/assembly_holder/assembly_holder
|
||||
// 10 seconds of operation on a standard cell. 200 (roughly 3 minutes) on a super cap.
|
||||
@@ -98,8 +122,9 @@ proc/within_jamming_range(var/atom/test) // tests if an object is near a radio j
|
||||
var/delta = (current - last_updated) / 10.0 // delta in seconds
|
||||
last_updated = current
|
||||
if (!cell.use(delta * power_drain_per_second))
|
||||
set_active(0)
|
||||
active = JAMMER_OFF
|
||||
cell.charge = 0 // drain the last of the battery
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/item/device/radiojammer/improvised/attackby(obj/item/W as obj, mob/user as mob)
|
||||
@@ -109,21 +134,25 @@ proc/within_jamming_range(var/atom/test) // tests if an object is near a radio j
|
||||
user.put_in_hands(cell)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/device/radiojammer/improvised/set_active(var/new_value)
|
||||
if (new_value == 1)
|
||||
if (!cell || !cell.charge)
|
||||
/obj/item/device/radiojammer/improvised/toggle(mob/user)
|
||||
if(!active)
|
||||
if(!cell)
|
||||
if(user)
|
||||
to_chat(user, SPAN_WARNING("\The [src] has no cell!"))
|
||||
return
|
||||
if(!cell.charge)
|
||||
if(user)
|
||||
to_chat(user, SPAN_WARNING("\The [src]'s battery is completely empty!"))
|
||||
return
|
||||
return ..()
|
||||
|
||||
..()
|
||||
|
||||
/obj/item/device/radiojammer/improvised/update()
|
||||
if (active)
|
||||
/obj/item/device/radiojammer/improvised/update_icon()
|
||||
if(active > 0)
|
||||
active_radio_jammers += src
|
||||
icon_state = icon_state_active
|
||||
START_PROCESSING(SSprocessing, src)
|
||||
|
||||
last_updated = world.time
|
||||
else
|
||||
active_radio_jammers -= src
|
||||
icon_state = initial(icon_state)
|
||||
STOP_PROCESSING(SSprocessing, src)
|
||||
STOP_PROCESSING(SSprocessing, src)
|
||||
Reference in New Issue
Block a user