mirror of
https://github.com/fulpstation/fulpstation.git
synced 2025-12-10 10:01:40 +00:00
tgui-next: Remote signalers
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
// Ensure the frequency is within bounds of what it should be sending/receiving at
|
// Ensure the frequency is within bounds of what it should be sending/receiving at
|
||||||
/proc/sanitize_frequency(frequency, free = FALSE)
|
/proc/sanitize_frequency(frequency, free = FALSE)
|
||||||
. = round(frequency)
|
frequency = round(frequency)
|
||||||
if(free)
|
if(free)
|
||||||
. = CLAMP(frequency, MIN_FREE_FREQ, MAX_FREE_FREQ)
|
. = CLAMP(frequency, MIN_FREE_FREQ, MAX_FREE_FREQ)
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -11,7 +11,6 @@
|
|||||||
|
|
||||||
var/code = DEFAULT_SIGNALER_CODE
|
var/code = DEFAULT_SIGNALER_CODE
|
||||||
var/frequency = FREQ_SIGNALER
|
var/frequency = FREQ_SIGNALER
|
||||||
var/delay = 0
|
|
||||||
var/datum/radio_frequency/radio_connection
|
var/datum/radio_frequency/radio_connection
|
||||||
///Holds the mind that commited suicide.
|
///Holds the mind that commited suicide.
|
||||||
var/datum/mind/suicider
|
var/datum/mind/suicider
|
||||||
@@ -65,62 +64,51 @@
|
|||||||
holder.update_icon()
|
holder.update_icon()
|
||||||
return
|
return
|
||||||
|
|
||||||
/obj/item/assembly/signaler/ui_interact(mob/user, flag1)
|
/obj/item/assembly/signaler/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
|
||||||
. = ..()
|
if(!is_secured(user))
|
||||||
if(is_secured(user))
|
return
|
||||||
var/t1 = "-------"
|
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||||
var/dat = {"
|
if(!ui)
|
||||||
<TT>
|
var/ui_width = 300
|
||||||
|
var/ui_height = 134
|
||||||
|
ui = new(user, src, ui_key, "signaler", name, ui_width, ui_height, master_ui, state)
|
||||||
|
ui.open()
|
||||||
|
|
||||||
<A href='byond://?src=[REF(src)];send=1'>Send Signal</A><BR>
|
/obj/item/assembly/signaler/ui_data(mob/user)
|
||||||
<B>Frequency/Code</B> for signaler:<BR>
|
var/list/data = list()
|
||||||
Frequency:
|
data["frequency"] = frequency
|
||||||
[format_frequency(src.frequency)]
|
data["code"] = code
|
||||||
<A href='byond://?src=[REF(src)];set=freq'>Set</A><BR>
|
data["minFrequency"] = MIN_FREE_FREQ
|
||||||
|
data["maxFrequency"] = MAX_FREE_FREQ
|
||||||
|
|
||||||
Code:
|
return data
|
||||||
[src.code]
|
|
||||||
<A href='byond://?src=[REF(src)];set=code'>Set</A><BR>
|
/obj/item/assembly/signaler/ui_act(action, params)
|
||||||
[t1]
|
if(..())
|
||||||
</TT>"}
|
|
||||||
user << browse(dat, "window=radio")
|
|
||||||
onclose(user, "radio")
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
switch(action)
|
||||||
|
if("signal")
|
||||||
|
INVOKE_ASYNC(src, .proc/signal)
|
||||||
|
. = TRUE
|
||||||
|
if("freq")
|
||||||
|
frequency = unformat_frequency(params["freq"])
|
||||||
|
frequency = sanitize_frequency(frequency, TRUE)
|
||||||
|
set_frequency(frequency)
|
||||||
|
. = TRUE
|
||||||
|
if("code")
|
||||||
|
code = text2num(params["code"])
|
||||||
|
code = round(code)
|
||||||
|
. = TRUE
|
||||||
|
if("reset")
|
||||||
|
if(params["reset"] == "freq")
|
||||||
|
frequency = initial(frequency)
|
||||||
|
else
|
||||||
|
code = initial(code)
|
||||||
|
. = TRUE
|
||||||
|
|
||||||
/obj/item/assembly/signaler/Topic(href, href_list)
|
update_icon()
|
||||||
..()
|
|
||||||
|
|
||||||
if(!usr.canUseTopic(src, BE_CLOSE))
|
|
||||||
usr << browse(null, "window=radio")
|
|
||||||
onclose(usr, "radio")
|
|
||||||
return
|
|
||||||
|
|
||||||
if (href_list["set"])
|
|
||||||
|
|
||||||
if(href_list["set"] == "freq")
|
|
||||||
var/new_freq = input(usr, "Input a new signalling frequency", "Remote Signaller Frequency", format_frequency(frequency)) as num|null
|
|
||||||
if(!usr.canUseTopic(src, BE_CLOSE))
|
|
||||||
return
|
|
||||||
new_freq = unformat_frequency(new_freq)
|
|
||||||
new_freq = sanitize_frequency(new_freq, TRUE)
|
|
||||||
set_frequency(new_freq)
|
|
||||||
|
|
||||||
if(href_list["set"] == "code")
|
|
||||||
var/new_code = input(usr, "Input a new signalling code", "Remote Signaller Code", code) as num|null
|
|
||||||
if(!usr.canUseTopic(src, BE_CLOSE))
|
|
||||||
return
|
|
||||||
new_code = round(new_code)
|
|
||||||
new_code = CLAMP(new_code, 1, 100)
|
|
||||||
code = new_code
|
|
||||||
|
|
||||||
if(href_list["send"])
|
|
||||||
INVOKE_ASYNC(src, .proc/signal)
|
|
||||||
|
|
||||||
if(usr)
|
|
||||||
attack_self(usr)
|
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/item/assembly/signaler/attackby(obj/item/W, mob/user, params)
|
/obj/item/assembly/signaler/attackby(obj/item/W, mob/user, params)
|
||||||
if(issignaler(W))
|
if(issignaler(W))
|
||||||
|
|||||||
70
tgui-next/packages/tgui/interfaces/Signaler.js
Normal file
70
tgui-next/packages/tgui/interfaces/Signaler.js
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
import { NumberInput, Button, Section, LabeledList } from '../components';
|
||||||
|
import { useBackend } from '../backend';
|
||||||
|
import { toFixed } from 'common/math';
|
||||||
|
|
||||||
|
export const Signaler = props => {
|
||||||
|
const { act, data } = useBackend(props);
|
||||||
|
const {
|
||||||
|
code,
|
||||||
|
frequency,
|
||||||
|
minFrequency,
|
||||||
|
maxFrequency,
|
||||||
|
} = data;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Section>
|
||||||
|
<LabeledList>
|
||||||
|
<LabeledList.Item label="Frequency">
|
||||||
|
<NumberInput
|
||||||
|
animate
|
||||||
|
unit="kHz"
|
||||||
|
step={0.2}
|
||||||
|
stepPixelSize={6}
|
||||||
|
minValue={minFrequency / 10}
|
||||||
|
maxValue={maxFrequency / 10}
|
||||||
|
value={frequency / 10}
|
||||||
|
format={value => toFixed(value, 1)}
|
||||||
|
width={13}
|
||||||
|
onDrag={(e, value) => act('freq', {
|
||||||
|
freq: value,
|
||||||
|
})} />
|
||||||
|
<Button
|
||||||
|
ml={0.5}
|
||||||
|
icon="sync"
|
||||||
|
content="Reset"
|
||||||
|
onClick={() => act('reset', {
|
||||||
|
reset: "freq",
|
||||||
|
})} />
|
||||||
|
</LabeledList.Item>
|
||||||
|
<LabeledList.Item label="Code">
|
||||||
|
<NumberInput
|
||||||
|
animate
|
||||||
|
step={1}
|
||||||
|
stepPixelSize={6}
|
||||||
|
minValue={1}
|
||||||
|
maxValue={100}
|
||||||
|
value={code}
|
||||||
|
width={13}
|
||||||
|
onDrag={(e, value) => act('code', {
|
||||||
|
code: value,
|
||||||
|
})} />
|
||||||
|
<Button
|
||||||
|
ml={0.5}
|
||||||
|
icon="sync"
|
||||||
|
content="Reset"
|
||||||
|
onClick={() => act('reset', {
|
||||||
|
reset: "code",
|
||||||
|
})} />
|
||||||
|
</LabeledList.Item>
|
||||||
|
</LabeledList>
|
||||||
|
<Button
|
||||||
|
mt={1}
|
||||||
|
mb={-0.2}
|
||||||
|
width={37.4}
|
||||||
|
icon="arrow-up"
|
||||||
|
content="Send Signal"
|
||||||
|
textAlign="center"
|
||||||
|
onClick={() => act('signal')} />
|
||||||
|
</Section>
|
||||||
|
);
|
||||||
|
};
|
||||||
File diff suppressed because one or more lines are too long
@@ -79,6 +79,7 @@ import { RapidPipeDispenser } from './interfaces/RapidPipeDispenser';
|
|||||||
import { SatelliteControl } from './interfaces/SatelliteControl';
|
import { SatelliteControl } from './interfaces/SatelliteControl';
|
||||||
import { ScannerGate } from './interfaces/ScannerGate';
|
import { ScannerGate } from './interfaces/ScannerGate';
|
||||||
import { ShuttleManipulator } from './interfaces/ShuttleManipulator';
|
import { ShuttleManipulator } from './interfaces/ShuttleManipulator';
|
||||||
|
import { Signaler } from './interfaces/Signaler';
|
||||||
import { Sleeper } from './interfaces/Sleeper';
|
import { Sleeper } from './interfaces/Sleeper';
|
||||||
import { SlimeBodySwapper } from './interfaces/SlimeBodySwapper';
|
import { SlimeBodySwapper } from './interfaces/SlimeBodySwapper';
|
||||||
import { SmartVend } from './interfaces/SmartVend';
|
import { SmartVend } from './interfaces/SmartVend';
|
||||||
@@ -451,6 +452,10 @@ const ROUTES = {
|
|||||||
component: () => ShuttleManipulator,
|
component: () => ShuttleManipulator,
|
||||||
scrollable: true,
|
scrollable: true,
|
||||||
},
|
},
|
||||||
|
signaler: {
|
||||||
|
component: () => Signaler,
|
||||||
|
scrollable: false,
|
||||||
|
},
|
||||||
sleeper: {
|
sleeper: {
|
||||||
component: () => Sleeper,
|
component: () => Sleeper,
|
||||||
scrollable: false,
|
scrollable: false,
|
||||||
|
|||||||
Reference in New Issue
Block a user