/obj/item/device/assembly/signaler name = "remote signaling device" desc = "Used to remotely activate devices." icon_state = "signaller" item_state = "signaler" drop_sound = 'sound/items/drop/component.ogg' pickup_sound = 'sound/items/pickup/component.ogg' origin_tech = list(TECH_MAGNET = 1) matter = list(DEFAULT_WALL_MATERIAL = 1000, MATERIAL_GLASS = 200) 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 var/obj/machinery/machine var/datum/wires/connected var/datum/radio_frequency/radio_connection var/deadman = FALSE /obj/item/device/assembly/signaler/Initialize() . = ..() set_frequency(frequency) /obj/item/device/assembly/signaler/activate() if(cooldown) return FALSE cooldown = 2 addtimer(CALLBACK(src, .proc/process_cooldown), 10) signal() return TRUE /obj/item/device/assembly/signaler/update_icon() if(holder) holder.update_icon() return /obj/item/device/assembly/signaler/interact(mob/user, flag1) var/datum/vueui/ui = SSvueui.get_open_ui(user, src) if(!ui) ui = new(user, src, "devices-assembly-signaler", 320, 220, capitalize_first_letters(name), state = deep_inventory_state) ui.open() /obj/item/device/assembly/signaler/vueui_data_change(var/list/data, var/mob/user, var/datum/vueui/ui) if(!data) data = list() VUEUI_SET_CHECK(data["frequency"], format_frequency(frequency), ., data) VUEUI_SET_CHECK(data["code"], code, ., data) /obj/item/device/assembly/signaler/Topic(href, href_list) ..() 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"]) code += text2num(href_list["code"]) code = clamp(code, 1, 100) code = round(code) if(href_list["send"]) spawn( 0 ) signal(usr) var/datum/vueui/ui = SSvueui.get_open_ui(usr, src) ui.check_for_change() /obj/item/device/assembly/signaler/proc/signal(var/mob/user) if(!radio_connection) return if(within_jamming_range(src)) return var/datum/signal/signal = new signal.source = src signal.encryption = code signal.data["message"] = "ACTIVATE" if(user) signal.data["user"] = WEAKREF(user) radio_connection.post_signal(src, signal) return /obj/item/device/assembly/signaler/pulse(var/radio = FALSE) if(connected && wires) connected.Pulse(src) else if(holder) holder.process_activation(src, 1, 0) else if(machine) machine.do_signaler() else ..(radio) return TRUE /obj/item/device/assembly/signaler/receive_signal(datum/signal/signal) if(!signal) return FALSE if(within_jamming_range(src)) return FALSE if(signal.encryption != code) return FALSE if(!(wires & WIRE_RADIO_RECEIVE)) return FALSE pulse(TRUE) if(machine) var/found_user = FALSE if(signal.data["user"]) var/datum/weakref/user_ref = signal.data["user"] var/mob/user = user_ref.resolve() if(user) found_user = TRUE log_signal("[key_name(user)] has sent a signal to [machine.name] ([machine.x]-[machine.y]-[machine.z])") if(!found_user) log_signal("A userless signaler has sent a signal to [machine.name] ([machine.x]-[machine.y]-[machine.z])") machine.audible_message("[icon2html(machine, viewers(get_turf(machine)))] [capitalize_first_letters(src.name)] beeps, \"Beep beep!\"") else if(!holder) audible_message("[icon2html(src, viewers(get_turf(src)))] [capitalize_first_letters(src.name)] beeps, \"Beep beep!\"") /obj/item/device/assembly/signaler/proc/set_frequency(new_frequency) if(!frequency) return SSradio.remove_object(src, frequency) frequency = new_frequency radio_connection = SSradio.add_object(src, frequency, RADIO_CHAT) //Triggers the deadmanswitch if its dropped or moved into ones backpack /obj/item/device/assembly/signaler/dropped(var/mob/user) . = ..() if(deadman) if(!user.client) deadman_deactivate(user) //To deactivate the deadman if someone disconnects else deadman_trigger(user) //Triggers the deadmanswitch if its moved between slots (i.e. from hand into the pocket) /obj/item/device/assembly/signaler/on_slotmove(var/mob/user) . = ..() if(deadman) deadman_trigger(user) /obj/item/device/assembly/signaler/process() //If we have disabled the deadmanswitch. stop here if(!deadman) STOP_PROCESSING(SSprocessing, src) return //That there is just a fallback in case dropped is not being called var/mob/M = src.loc if(!ismob(M)) deadman_trigger() else if(prob(20)) M.visible_message(SPAN_DANGER("\The [M]'s finger twitches a bit over \the [src]'s deadman switch!")) return /obj/item/device/assembly/signaler/AltClick(mob/user) if(use_check_and_message(user)) return to_chat(user, SPAN_NOTICE("You click \the [src]'s signal button.")) signal(user) /obj/item/device/assembly/signaler/proc/deadman_trigger(var/mob/user) if(deadman) //If its not activated, there is no point in triggering it if(user) visible_message(SPAN_DANGER("\The [user] releases \the [src]'s deadman switch!")) else visible_message(SPAN_DANGER("\The [src]'s deadman switch is released!")) signal() deadman = FALSE STOP_PROCESSING(SSprocessing, src) /obj/item/device/assembly/signaler/verb/deadman_it() set src in usr set name = "Hold the deadman switch!" set desc = "Sends a signal if dropped or moved into a container." if(!deadman) deadman_activate(usr) else deadman_deactivate(usr) /obj/item/device/assembly/signaler/proc/deadman_activate(var/mob/user) deadman = TRUE START_PROCESSING(SSprocessing, src) log_and_message_admins("is threatening to trigger a signaler deadman's switch") user.visible_message(SPAN_WARNING("[user] presses and holds \the [src]'s deadman switch...")) to_chat(user, SPAN_WARNING("You are now holding \the [src]'s deadman switch. Dropping, putting the device away, or being hit will activate the signaller.")) to_chat(user, SPAN_NOTICE("To deactivate it, make sure to press the verb again.")) /obj/item/device/assembly/signaler/proc/deadman_deactivate(var/mob/user) deadman = FALSE STOP_PROCESSING(SSprocessing, src) user.visible_message(SPAN_NOTICE("\The [user] secures and releases \the [src]'s deadman switch...")) /obj/item/device/assembly/signaler/Destroy() if(SSradio) SSradio.remove_object(src,frequency) frequency = 0 return ..()