diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 16e12dac..f9a329b6 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -968,12 +968,10 @@ var/global/list/obj/item/device/pda/PDAs = list() for (var/obj/machinery/message_server/MS in message_servers) //PDAs are now dependent on the Message Server. if(MS.active) - if (active_radio_jammers && active_radio_jammers.len) - for (var/obj/item/device/radiojammer/Jammer in active_radio_jammers) - if (get_dist(MS, Jammer) <= Jammer.radius && prob(75)) - continue finding_server - useMS = MS - break + if (within_jamming_range(MS) && prob(75)) + continue finding_server + useMS = MS + break var/datum/signal/signal = src.telecomms_process() @@ -984,22 +982,13 @@ var/global/list/obj/item/device/pda/PDAs = list() var/turf/pos = get_turf(P) if(pos.z in signal.data["level"]) useTC = 2 - //Jamming the recipient - if (active_radio_jammers && active_radio_jammers.len) - for (var/obj/item/device/radiojammer/Jammer in active_radio_jammers) - if (get_dist(P, Jammer) <= Jammer.radius) - useTC = 1 - break + if(within_jamming_range(P)) //Jamming the recipient + useTC = 1 //Let's make this barely readable if(signal.data["compression"] > 0) t = Gibberish(t, signal.data["compression"] + 50) - var/isjammed = 0 - if (active_radio_jammers && active_radio_jammers.len) - for (var/obj/item/device/radiojammer/Jammer in active_radio_jammers) - if (get_dist(src, Jammer) <= Jammer.radius) - isjammed = 1 - break + var/isjammed = within_jamming_range(src) if(useMS && useTC && !isjammed) // only send the message if it's stable if(useTC != 2) // Does our recipient have a broadcaster on their level? diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index c29dece6..cfbacf33 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -320,11 +320,8 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use /* ###### Radio headsets can only broadcast through subspace ###### */ if(subspace_transmission) - //Actually, first we check if we're being jammed or not! - if (active_radio_jammers && active_radio_jammers.len) - for (var/obj/item/device/radiojammer/Jammer in active_radio_jammers) - if (get_dist(src, Jammer) <= Jammer.radius) - return + if (within_jamming_range(src)) //Actually, first we check if we're being jammed or not! + return // First, we want to generate a new radio signal var/datum/signal/signal = new @@ -638,10 +635,8 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use return -1 if(!listening) return -1 - if (subspace_transmission == 1 && active_radio_jammers && active_radio_jammers.len) - for (var/obj/item/device/radiojammer/Jammer in active_radio_jammers) - if (get_dist(src, Jammer) <= Jammer.radius) - return -1 + if (subspace_transmission == 1 && within_jamming_range(src)) + return -1 if(!(0 in level)) var/turf/position = get_turf(src) if(!position || !(position.z in level)) diff --git a/code/game/objects/items/devices/radio_jammer.dm b/code/game/objects/items/devices/radio_jammer.dm index 1083260d..1012e0ce 100644 --- a/code/game/objects/items/devices/radio_jammer.dm +++ b/code/game/objects/items/devices/radio_jammer.dm @@ -1,6 +1,12 @@ //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 TRUE + /obj/item/device/radiojammer name = "radio jammer" desc = "A small, inconspicious looking item with an 'ON/OFF' toggle." @@ -10,29 +16,102 @@ var/list/active_radio_jammers = list() var/active = 0 var/radius = 7 + var/icon_state_active = "shield1" + var/icon_state_inactive = "shield0" /obj/item/device/radiojammer/New() ..() + update() +/obj/item/device/radiojammer/Del() if (active) - active_radio_jammers += src - icon_state = "shield1" + active_radio_jammers -= src + ..() + /obj/item/device/radiojammer/attack_self() toggle() + /obj/item/device/radiojammer/emp_act() toggle() + /obj/item/device/radiojammer/proc/toggle() - switch (active) - if (0) - usr << "You activate \the [src]." - active = 1 - active_radio_jammers += src - icon_state = "shield1" - if (1) - usr << "You deactivate \the [src]." - active = 0 - active_radio_jammers -= src - icon_state = "shield0" + if(active) + usr << "You deactivate \the [src]." + else + usr << "You activate \the [src]." + set_active(!active) + + +/obj/item/device/radiojammer/proc/set_active(var/new_value) + active = new_value + update() + + +/obj/item/device/radiojammer/proc/update() + if (active) + active_radio_jammers += src + icon_state = icon_state_active + else + active_radio_jammers -= src + icon_state = icon_state_inactive + + +/obj/item/device/radiojammer/improvised + name = "improvised radio jammer" + desc = "An awkward bundle of wires, batteries, and radio transmitters." + var/obj/item/device/assembly_holder/assembly_holder + var/obj/item/weapon/cell/cell + var/power_drain_per_second = 200 + var/last_updated = null + radius = 5 + icon = 'icons/obj/assemblies/new_assemblies.dmi' + icon_state_active = "improvised_jammer_active" + icon_state_inactive = "improvised_jammer_inactive" + + +/obj/item/device/radiojammer/improvised/New(var/obj/item/device/assembly_holder/incoming_holder, var/obj/item/weapon/cell/incoming_cell, var/mob/user) + ..() + var/active_hand = user.hand + var/cell_was_in_hand = (user.l_hand==incoming_cell || user.r_hand ==incoming_cell) + user.drop_item_if_in_either_hand(incoming_holder,src) + user.drop_item_if_in_either_hand(incoming_cell,src) + assembly_holder = incoming_holder + assembly_holder.loc = src // this should never be necessary, but lets just be sure + cell = incoming_cell + cell.loc = src + set_active(TRUE) + last_updated = world.timeofday + processing_objects.Add(src) // drain that battery + if (cell_was_in_hand) + if(active_hand) + user.put_in_l_hand(src) + else + user.put_in_r_hand(src) + else + src.loc = user.loc + +/obj/item/device/radiojammer/improvised/Del() + if(active) + processing_objects.Remove(src) + ..() + + +/obj/item/device/radiojammer/improvised/process() + var/current = world.timeofday // current tick + var/delta = (current - last_updated) / 10.0 // delta in seconds + last_updated = current + if (!(cell.use(delta * power_drain_per_second))) + set_active(FALSE) + cell.charge = 0 // drain the last of the battery + processing_objects.Remove(src) + + +/obj/item/device/radiojammer/improvised/attack_self(mob/user as mob) + user << "You disassemble the improvised signal jammer." + user.put_in_hands(assembly_holder) + user.put_in_hands(cell) + del(src) + diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index ae18faed..1a2987c5 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -99,8 +99,12 @@ proc/signal() - if(!radio_connection) return - + if(!radio_connection) + return + + if(within_jamming_range(src)) // can't send a signal through jammers + return + var/datum/signal/signal = new signal.source = src signal.encryption = code @@ -126,6 +130,8 @@ receive_signal(datum/signal/signal) + if(within_jamming_range(src)) // can't receive signals while jammed + return if(!signal) return 0 if(signal.encryption != code) return 0 if(!(src.wires & WIRE_RADIO_RECEIVE)) return 0 @@ -166,4 +172,4 @@ set desc = "BOOOOM!" deadman = 1 processing_objects.Add(src) - usr.visible_message("\red [usr] moves their finger over [src]'s signal button...") + usr.visible_message("\red [usr] moves their finger over [src]'s signal button...") \ No newline at end of file diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 192c8d93..b5f64ced 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -102,6 +102,13 @@ return 1 return 0 + +/mob/proc/drop_item_if_in_either_hand(var/obj/item/W,var/atom/Target) + if (l_hand==W) + return drop_l_hand(Target) + if (r_hand==W) + return drop_r_hand(Target) + //Drops the item in our left hand /mob/proc/drop_l_hand(var/atom/Target) diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index fd9fdfbf..fdd40340 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -89,8 +89,15 @@ message_mods("[user.name] ([user.ckey]) injected a power cell with plasma, rigging it to explode.") S.reagents.clear_reagents() - - + + if(istype(W,/obj/item/device/assembly_holder)) + var/obj/item/device/assembly_holder/holder = W + if(istype(holder.a_left,/obj/item/device/assembly/signaler) && istype(holder.a_right,/obj/item/device/assembly/signaler)) + user << "You make an improvised signal jammer from \the [holder]." + new /obj/item/device/radiojammer/improvised(holder,src,user) + + + /obj/item/weapon/cell/proc/explode() var/turf/T = get_turf(src.loc) /* diff --git a/icons/obj/assemblies/new_assemblies.dmi b/icons/obj/assemblies/new_assemblies.dmi index 8b0ea26e..d7bd47ac 100644 Binary files a/icons/obj/assemblies/new_assemblies.dmi and b/icons/obj/assemblies/new_assemblies.dmi differ