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:
Geeves
2020-11-14 12:10:35 +01:00
committed by GitHub
parent aee1f0bcb2
commit b3891901ea
88 changed files with 289 additions and 67 deletions
@@ -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)
+67 -38
View File
@@ -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)