mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-21 07:32:02 +00:00
Now its actually useful It triggers with absolute certainty if you let go and dont deactivate it first. Be that because you are knocked down, stunned, shot, intentionally let go, put it in a pocket, backpack, ...
216 lines
6.7 KiB
Plaintext
216 lines
6.7 KiB
Plaintext
/obj/item/device/assembly/signaler
|
|
name = "remote signaling device"
|
|
desc = "Used to remotely activate devices."
|
|
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/Initialize()
|
|
. = ..()
|
|
set_frequency(frequency)
|
|
|
|
/obj/item/device/assembly/signaler/activate()
|
|
if(cooldown > 0) return 0
|
|
cooldown = 2
|
|
addtimer(CALLBACK(src, .proc/process_cooldown), 10)
|
|
|
|
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("-------<BR>\nGreen Wire: []<BR>\nRed Wire: []<BR>\nBlue Wire: []<BR>\n", (src.wires & 4 ? text("<A href='?src=\ref[];wires=4'>Cut Wire</A>", src) : text("<A href='?src=\ref[];wires=4'>Mend Wire</A>", src)), (src.wires & 2 ? text("<A href='?src=\ref[];wires=2'>Cut Wire</A>", src) : text("<A href='?src=\ref[];wires=2'>Mend Wire</A>", src)), (src.wires & 1 ? text("<A href='?src=\ref[];wires=1'>Cut Wire</A>", src) : text("<A href='?src=\ref[];wires=1'>Mend Wire</A>", src)))
|
|
// else
|
|
// t1 = "-------" Speaker: [src.listening ? "<A href='byond://?src=\ref[src];listen=0'>Engaged</A>" : "<A href='byond://?src=\ref[src];listen=1'>Disengaged</A>"]<BR>
|
|
var/dat = {"
|
|
<TT>
|
|
|
|
<A href='byond://?src=\ref[src];send=1'>Send Signal</A><BR>
|
|
<B>Frequency/Code</B> for signaler:<BR>
|
|
Frequency:
|
|
<A href='byond://?src=\ref[src];freq=-10'>-</A>
|
|
<A href='byond://?src=\ref[src];freq=-2'>-</A>
|
|
[format_frequency(src.frequency)]
|
|
<A href='byond://?src=\ref[src];freq=2'>+</A>
|
|
<A href='byond://?src=\ref[src];freq=10'>+</A><BR>
|
|
|
|
Code:
|
|
<A href='byond://?src=\ref[src];code=-5'>-</A>
|
|
<A href='byond://?src=\ref[src];code=-1'>-</A>
|
|
[src.code]
|
|
<A href='byond://?src=\ref[src];code=1'>+</A>
|
|
<A href='byond://?src=\ref[src];code=5'>+</A><BR>
|
|
[t1]
|
|
</TT>"}
|
|
user << browse(dat, "window=radio")
|
|
onclose(user, "radio")
|
|
return
|
|
|
|
|
|
/obj/item/device/assembly/signaler/Topic(href, href_list)
|
|
..()
|
|
|
|
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/proc/signal()
|
|
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"
|
|
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(within_jamming_range(src))
|
|
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
|
|
SSradio.remove_object(src, frequency)
|
|
frequency = new_frequency
|
|
radio_connection = SSradio.add_object(src, frequency, RADIO_CHAT)
|
|
return
|
|
|
|
//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("[M]'s finger twitches a bit over [src]'s deadman switch!")
|
|
return
|
|
|
|
/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)
|
|
src.visible_message("<span class='warning'>[user] releases [src]'s deadman switch!</span>")
|
|
else
|
|
src.visible_message("<span class='warning'>[src]'s deadman switch is released!</span>")
|
|
signal()
|
|
deadman = 0
|
|
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 = 1
|
|
START_PROCESSING(SSprocessing, src)
|
|
log_and_message_admins("is threatening to trigger a signaler deadman's switch")
|
|
user.visible_message("<span class='warning'>[user] presses and holds [src]'s deadman switch...</span>")
|
|
to_chat(user,"<span class='warning'>Your are now holding [src]'s deadman switch. Dropping, putting the device away, or being hit will activate the signaller.</span>")
|
|
to_chat(user,"<span class='critical'>To deactivate it, make sure to press the verb again.</span>")
|
|
|
|
/obj/item/device/assembly/signaler/proc/deadman_deactivate(var/mob/user)
|
|
deadman = 0
|
|
STOP_PROCESSING(SSprocessing, src)
|
|
user.visible_message("<span class='warning'>[user] secures [user]'s deadman switch...</span>")
|
|
|
|
/obj/item/device/assembly/signaler/Destroy()
|
|
if(SSradio)
|
|
SSradio.remove_object(src,frequency)
|
|
frequency = 0
|
|
return ..()
|