diff --git a/code/datums/repositories/crew.dm b/code/datums/repositories/crew.dm index ae73c98c8df..88ea491e516 100644 --- a/code/datums/repositories/crew.dm +++ b/code/datums/repositories/crew.dm @@ -24,7 +24,7 @@ var/global/datum/repository/crew/crew_repository = new() var/tracked = scan() for(var/obj/item/clothing/under/C in tracked) var/turf/pos = get_turf(C) - if((C) && (C.has_sensor) && (pos) && (pos.z == zLevel) && (C.sensor_mode != SUIT_SENSOR_OFF)) + if((C) && (C.has_sensor) && (pos) && (pos.z == zLevel) && (C.sensor_mode != SUIT_SENSOR_OFF) && !(is_jammed(C))) if(istype(C.loc, /mob/living/carbon/human)) var/mob/living/carbon/human/H = C.loc if(H.w_uniform != C) diff --git a/code/datums/uplink/tools.dm b/code/datums/uplink/tools.dm index 558c922b465..6c340385b09 100644 --- a/code/datums/uplink/tools.dm +++ b/code/datums/uplink/tools.dm @@ -84,7 +84,7 @@ item_cost = 25 path = /obj/item/device/radio_jammer desc = "A device which is capable of disrupting subspace communications, preventing the use of headsets, PDAs, and communicators within \ - a radius of seven meters. It runs off weapon cells, which can be replaced as needed. One cell will last for approximately a minute." + a radius of seven meters. It runs off weapon cells, which can be replaced as needed. One cell will last for approximately ten minutes." /datum/uplink_item/item/tools/emag name = "Cryptographic Sequencer" @@ -132,4 +132,4 @@ name = "Teleporter Circuit Board" item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 1.5 path = /obj/item/weapon/circuitboard/teleporter - blacklisted = 1 \ No newline at end of file + blacklisted = 1 diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 8f6533a702b..ae4a3323dd7 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -572,6 +572,8 @@ var/list/civilian_cartridges = list( active3 = S if("Send Signal") + if(is_jammed(src)) + return spawn( 0 ) radio:send_signal("ACTIVATE") return diff --git a/code/game/objects/items/devices/radio/jammer.dm b/code/game/objects/items/devices/radio/jammer.dm index 4a57f855ee8..b59101cc663 100644 --- a/code/game/objects/items/devices/radio/jammer.dm +++ b/code/game/objects/items/devices/radio/jammer.dm @@ -15,7 +15,7 @@ var/global/list/active_radio_jammers = list() /obj/item/device/radio_jammer name = "subspace jammer" - desc = "Primarily for blocking subspace communications, preventing the use of headsets, PDAs, and communicators." + desc = "Primarily for blocking subspace communications, preventing the use of headsets, PDAs, and communicators. Also masks suit sensors." // Added suit sensor jamming icon = 'icons/obj/device.dmi' icon_state = "jammer0" var/active_state = "jammer1" diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index c78a70b37d4..354de6949bf 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -1,183 +1,194 @@ -/obj/item/device/assembly/signaler - name = "remote signaling device" - desc = "Used to remotely activate devices. Tap against another secured signaler to transfer configuration." - icon_state = "signaller" - item_state = "signaler" - origin_tech = list(TECH_MAGNET = 1) - matter = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 200, "waste" = 100) - wires = WIRE_RECEIVE | WIRE_PULSE | WIRE_RADIO_PULSE | WIRE_RADIO_RECEIVE - - secured = 1 - - var/code = 30 - var/frequency = 1457 - var/delay = 0 - var/airlock_wire = null - var/datum/wires/connected = null - var/datum/radio_frequency/radio_connection - var/deadman = 0 - -/obj/item/device/assembly/signaler/New() - ..() - spawn(40) - set_frequency(frequency) - return - - -/obj/item/device/assembly/signaler/activate() - if(cooldown > 0) return 0 - cooldown = 2 - spawn(10) - process_cooldown() - - signal() - return 1 - -/obj/item/device/assembly/signaler/update_icon() - if(holder) - holder.update_icon() - return - -/obj/item/device/assembly/signaler/interact(mob/user as mob, flag1) - var/t1 = "-------" -// if ((src.b_stat && !( flag1 ))) -// t1 = text("-------
\nGreen Wire: []
\nRed Wire: []
\nBlue Wire: []
\n", (src.wires & 4 ? text("Cut Wire", src) : text("Mend Wire", src)), (src.wires & 2 ? text("Cut Wire", src) : text("Mend Wire", src)), (src.wires & 1 ? text("Cut Wire", src) : text("Mend Wire", src))) -// else -// t1 = "-------" Speaker: [src.listening ? "Engaged" : "Disengaged"]
- var/dat = {" - - -Send Signal
-Frequency/Code for signaler:
-Frequency: -- -- -[format_frequency(src.frequency)] -+ -+
- -Code: -- -- -[src.code] -+ -+
-[t1] -
"} - user << browse(dat, "window=radio") - onclose(user, "radio") - return - - -/obj/item/device/assembly/signaler/Topic(href, href_list, state = deep_inventory_state) - if(..()) return 1 - - if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) - usr << browse(null, "window=radio") - onclose(usr, "radio") - return - - if (href_list["freq"]) - var/new_frequency = (frequency + text2num(href_list["freq"])) - if(new_frequency < RADIO_LOW_FREQ || new_frequency > RADIO_HIGH_FREQ) - new_frequency = sanitize_frequency(new_frequency, RADIO_LOW_FREQ, RADIO_HIGH_FREQ) - set_frequency(new_frequency) - - if(href_list["code"]) - src.code += text2num(href_list["code"]) - src.code = round(src.code) - src.code = min(100, src.code) - src.code = max(1, src.code) - - if(href_list["send"]) - spawn( 0 ) - signal() - - if(usr) - attack_self(usr) - - return - -/obj/item/device/assembly/signaler/attackby(obj/item/weapon/W, mob/user, params) - if(issignaler(W)) - var/obj/item/device/assembly/signaler/signaler2 = W - if(secured && signaler2.secured) - code = signaler2.code - frequency = signaler2.frequency - to_chat(user, "You transfer the frequency and code of [signaler2] to [src].") - else - ..() - -/obj/item/device/assembly/signaler/proc/signal() - if(!radio_connection) return - - var/datum/signal/signal = new - signal.source = src - signal.encryption = code - signal.data["message"] = "ACTIVATE" - radio_connection.post_signal(src, signal) - return - - -/obj/item/device/assembly/signaler/pulse(var/radio = 0) - if(src.connected && src.wires) - connected.Pulse(src) - else if(holder) - holder.process_activation(src, 1, 0) - else - ..(radio) - return 1 - - -/obj/item/device/assembly/signaler/receive_signal(datum/signal/signal) - if(!signal) return 0 - if(signal.encryption != code) return 0 - if(!(src.wires & WIRE_RADIO_RECEIVE)) return 0 - pulse(1) - - if(!holder) - for(var/mob/O in hearers(1, src.loc)) - O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2) - return - - -/obj/item/device/assembly/signaler/proc/set_frequency(new_frequency) - if(!frequency) - return - if(!radio_controller) - sleep(20) - if(!radio_controller) - return - - radio_controller.remove_object(src, frequency) - frequency = new_frequency - radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT) - return - -/obj/item/device/assembly/signaler/process() - if(!deadman) - STOP_PROCESSING(SSobj, src) - var/mob/M = src.loc - if(!M || !ismob(M)) - if(prob(5)) - signal() - deadman = 0 - STOP_PROCESSING(SSobj, src) - else if(prob(5)) - M.visible_message("[M]'s finger twitches a bit over [src]'s signal button!") - return - -/obj/item/device/assembly/signaler/verb/deadman_it() - set src in usr - set name = "Threaten to push the button!" - set desc = "BOOOOM!" - deadman = 1 +/obj/item/device/assembly/signaler + name = "remote signaling device" + desc = "Used to remotely activate devices. Tap against another secured signaler to transfer configuration." + icon_state = "signaller" + item_state = "signaler" + origin_tech = list(TECH_MAGNET = 1) + matter = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 200, "waste" = 100) + wires = WIRE_RECEIVE | WIRE_PULSE | WIRE_RADIO_PULSE | WIRE_RADIO_RECEIVE + + secured = TRUE + + var/code = 30 + var/frequency = 1457 + var/delay = 0 + var/airlock_wire = null + var/datum/wires/connected = null + var/datum/radio_frequency/radio_connection + var/deadman = FALSE + +/obj/item/device/assembly/signaler/New() + ..() + spawn(40) + set_frequency(frequency) + return + + +/obj/item/device/assembly/signaler/activate() + if(cooldown > 0) return FALSE + cooldown = 2 + spawn(10) + process_cooldown() + + signal() + return TRUE + +/obj/item/device/assembly/signaler/update_icon() + if(holder) + holder.update_icon() + return + +/obj/item/device/assembly/signaler/interact(mob/user as mob, flag1) + var/t1 = "-------" +// if ((src.b_stat && !( flag1 ))) +// t1 = text("-------
\nGreen Wire: []
\nRed Wire: []
\nBlue Wire: []
\n", (src.wires & 4 ? text("Cut Wire", src) : text("Mend Wire", src)), (src.wires & 2 ? text("Cut Wire", src) : text("Mend Wire", src)), (src.wires & 1 ? text("Cut Wire", src) : text("Mend Wire", src))) +// else +// t1 = "-------" Speaker: [src.listening ? "Engaged" : "Disengaged"]
+ var/dat = {" + + +Send Signal
+Frequency/Code for signaler:
+Frequency: +- +- +[format_frequency(src.frequency)] ++ ++
+ +Code: +- +- +[src.code] ++ ++
+[t1] +
"} + user << browse(dat, "window=radio") + onclose(user, "radio") + return + + +/obj/item/device/assembly/signaler/Topic(href, href_list, state = deep_inventory_state) + if(..()) + return TRUE + + if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) + usr << browse(null, "window=radio") + onclose(usr, "radio") + return + + if (href_list["freq"]) + var/new_frequency = (frequency + text2num(href_list["freq"])) + if(new_frequency < RADIO_LOW_FREQ || new_frequency > RADIO_HIGH_FREQ) + new_frequency = sanitize_frequency(new_frequency, RADIO_LOW_FREQ, RADIO_HIGH_FREQ) + set_frequency(new_frequency) + + if(href_list["code"]) + src.code += text2num(href_list["code"]) + src.code = round(src.code) + src.code = min(100, src.code) + src.code = max(1, src.code) + + if(href_list["send"]) + spawn( 0 ) + signal() + + if(usr) + attack_self(usr) + + return + +/obj/item/device/assembly/signaler/attackby(obj/item/weapon/W, mob/user, params) + if(issignaler(W)) + var/obj/item/device/assembly/signaler/signaler2 = W + if(secured && signaler2.secured) + code = signaler2.code + frequency = signaler2.frequency + to_chat(user, "You transfer the frequency and code of [signaler2] to [src].") + else + ..() + +/obj/item/device/assembly/signaler/proc/signal() + if(!radio_connection) + return + if(is_jammed(src)) + return + + var/datum/signal/signal = new + signal.source = src + signal.encryption = code + signal.data["message"] = "ACTIVATE" + radio_connection.post_signal(src, signal) + return + + +/obj/item/device/assembly/signaler/pulse(var/radio = 0) + if(is_jammed(src)) + return FALSE + if(src.connected && src.wires) + connected.Pulse(src) + else if(holder) + holder.process_activation(src, 1, 0) + else + ..(radio) + return TRUE + + +/obj/item/device/assembly/signaler/receive_signal(datum/signal/signal) + if(!signal) + return FALSE + if(signal.encryption != code) + return FALSE + if(!(src.wires & WIRE_RADIO_RECEIVE)) + return FALSE + if(is_jammed(src)) + return FALSE + pulse(1) + + if(!holder) + for(var/mob/O in hearers(1, src.loc)) + O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2) + return + + +/obj/item/device/assembly/signaler/proc/set_frequency(new_frequency) + if(!frequency) + return + if(!radio_controller) + sleep(20) + if(!radio_controller) + return + + radio_controller.remove_object(src, frequency) + frequency = new_frequency + radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT) + return + +/obj/item/device/assembly/signaler/process() + if(!deadman) + STOP_PROCESSING(SSobj, src) + var/mob/M = src.loc + if(!M || !ismob(M)) + if(prob(5)) + signal() + deadman = FALSE + STOP_PROCESSING(SSobj, src) + else if(prob(5)) + M.visible_message("[M]'s finger twitches a bit over [src]'s signal button!") + return + +/obj/item/device/assembly/signaler/verb/deadman_it() + set src in usr + set name = "Threaten to push the button!" + set desc = "BOOOOM!" + deadman = TRUE START_PROCESSING(SSobj, src) - log_and_message_admins("is threatening to trigger a signaler deadman's switch") - usr.visible_message("[usr] moves their finger over [src]'s signal button...") - -/obj/item/device/assembly/signaler/Destroy() - if(radio_controller) - radio_controller.remove_object(src,frequency) - frequency = 0 - . = ..() + log_and_message_admins("is threatening to trigger a signaler deadman's switch") + usr.visible_message("[usr] moves their finger over [src]'s signal button...") + +/obj/item/device/assembly/signaler/Destroy() + if(radio_controller) + radio_controller.remove_object(src,frequency) + frequency = 0 + . = ..() diff --git a/html/changelogs/Anewbe - Jamming.yml b/html/changelogs/Anewbe - Jamming.yml new file mode 100644 index 00000000000..1822bb00d09 --- /dev/null +++ b/html/changelogs/Anewbe - Jamming.yml @@ -0,0 +1,36 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Anewbe + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "The Subspace Jammer traitor item now lasts about 10 minutes. It now blocks signalers from sending or receiving, and also obscures suit sensors around it."