diff --git a/code/__DEFINES/devices.dm b/code/__DEFINES/devices.dm
index 07db7c88335..a6ecf11e56e 100644
--- a/code/__DEFINES/devices.dm
+++ b/code/__DEFINES/devices.dm
@@ -7,10 +7,8 @@
#define CART_CLOWN (1<<5)
#define CART_MIME (1<<6)
#define CART_REAGENT_SCANNER (1<<7)
-#define CART_STATUS_DISPLAY (1<<8)
-#define CART_QUARTERMASTER (1<<9)
-#define CART_DRONEPHONE (1<<10)
-#define CART_DRONEACCESS (1<<11)
+#define CART_STATUS_DISPLAY (1<<10)
+#define CART_QUARTERMASTER (1<<11)
/// PDA ui menu defines
#define PDA_UI_HUB 0
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index ee90b5cd241..a2ef23449fc 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -350,11 +350,6 @@ GLOBAL_LIST_EMPTY(PDAs)
dat += "
[PDAIMG(reagent)][scanmode == 3 ? "Disable" : "Enable"] Reagent Scanner"
if (cartridge.access & CART_ATMOS)
dat += "[PDAIMG(reagent)][scanmode == 5 ? "Disable" : "Enable"] Gas Scanner"
- if (cartridge.access & CART_DRONEPHONE)
- dat += "[PDAIMG(dronephone)]Drone Phone"
- if (cartridge.access & CART_DRONEACCESS)
- var/blacklist_state = GLOB.drone_machine_blacklist_enabled
- dat += "[PDAIMG(droneblacklist)][blacklist_state ? "Disable" : "Enable"] Drone Blacklist"
dat += "[PDAIMG(atmos)]Atmospheric Scan"
dat += "[PDAIMG(flashlight)][light_on ? "Disable" : "Enable"] Flashlight"
if (pai)
@@ -601,26 +596,6 @@ GLOBAL_LIST_EMPTY(PDAs)
scanmode = PDA_SCANNER_GAS
if(!silent)
playsound(src, 'sound/machines/terminal_select.ogg', 15, TRUE)
- if("Drone Phone")
- var/alert_s = tgui_input_list(U, "Alert severity level", "Ping Drones", list("Low","Medium","High","Critical"))
- if(isnull(alert_s))
- return
- var/area/A = get_area(U)
- if(A && !QDELETED(U))
- var/msg = span_boldnotice("NON-DRONE PING: [U.name]: [alert_s] priority alert in [A.name]!")
- _alert_drones(msg, TRUE, U)
- to_chat(U, msg)
- if(!silent)
- playsound(src, 'sound/machines/terminal_success.ogg', 15, TRUE)
- if("Drone Access")
- var/mob/living/simple_animal/drone/drone_user = U
- if(isdrone(U) && drone_user.shy)
- to_chat(U, span_warning("Your laws prevent this action."))
- return
- var/new_state = text2num(href_list["drone_blacklist"])
- GLOB.drone_machine_blacklist_enabled = new_state
- if(!silent)
- playsound(src, 'sound/machines/terminal_select.ogg', 15, TRUE)
//NOTEKEEPER FUNCTIONS===================================
diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm
index df8c2f8c927..560fd492c96 100644
--- a/code/game/objects/items/devices/PDA/cart.dm
+++ b/code/game/objects/items/devices/PDA/cart.dm
@@ -36,7 +36,7 @@
/obj/item/cartridge/engineering
name = "\improper Power-ON cartridge"
icon_state = "cart-e"
- access = CART_ENGINE | CART_DRONEPHONE
+ access = CART_ENGINE
bot_access = list(
FLOOR_BOT,
)
@@ -44,7 +44,7 @@
/obj/item/cartridge/atmos
name = "\improper BreatheDeep cartridge"
icon_state = "cart-a"
- access = CART_ATMOS | CART_DRONEPHONE
+ access = CART_ATMOS
bot_access = list(
FLOOR_BOT,
FIRE_BOT,
@@ -93,7 +93,6 @@
/obj/item/cartridge/roboticist
name = "\improper B.O.O.P. Remote Control cartridge"
desc = "Packed with heavy duty quad-bot interlink!"
- access = CART_DRONEPHONE
bot_access = list(
FLOOR_BOT,
CLEAN_BOT,
@@ -133,7 +132,7 @@
/obj/item/cartridge/hop
name = "\improper HumanResources9001 cartridge"
icon_state = "cart-h"
- access = CART_MANIFEST | CART_STATUS_DISPLAY | CART_SECURITY | CART_QUARTERMASTER | CART_DRONEPHONE
+ access = CART_MANIFEST | CART_STATUS_DISPLAY | CART_SECURITY | CART_QUARTERMASTER
bot_access = list(
MULE_BOT,
CLEAN_BOT,
@@ -153,7 +152,7 @@
/obj/item/cartridge/ce
name = "\improper Power-On DELUXE cartridge"
icon_state = "cart-ce"
- access = CART_MANIFEST | CART_STATUS_DISPLAY | CART_ENGINE | CART_ATMOS | CART_DRONEPHONE | CART_DRONEACCESS
+ access = CART_MANIFEST | CART_STATUS_DISPLAY | CART_ENGINE | CART_ATMOS
bot_access = list(
FLOOR_BOT,
FIRE_BOT,
@@ -170,7 +169,7 @@
/obj/item/cartridge/rd
name = "\improper Signal Ace DELUXE cartridge"
icon_state = "cart-rd"
- access = CART_MANIFEST | CART_STATUS_DISPLAY | CART_REAGENT_SCANNER | CART_ATMOS | CART_DRONEPHONE
+ access = CART_MANIFEST | CART_STATUS_DISPLAY | CART_REAGENT_SCANNER | CART_ATMOS
bot_access = list(
FLOOR_BOT,
CLEAN_BOT,
diff --git a/code/modules/modular_computers/file_system/programs/robocontrol.dm b/code/modules/modular_computers/file_system/programs/robocontrol.dm
index f35abf25235..e7d7e89ae30 100644
--- a/code/modules/modular_computers/file_system/programs/robocontrol.dm
+++ b/code/modules/modular_computers/file_system/programs/robocontrol.dm
@@ -13,6 +13,12 @@
var/botcount = 0
///Access granted by the used to summon robots.
var/list/current_access = list()
+ var/list/drone_ping_types = list(
+ "Low",
+ "Medium",
+ "High",
+ "Critical",
+ )
/datum/computer_file/program/robocontrol/ui_data(mob/user)
var/list/data = get_header_data()
@@ -61,9 +67,24 @@
newbot["mule_check"] = TRUE
botlist += list(newbot)
+ for(var/mob/living/simple_animal/drone/all_drones as anything in GLOB.drones_list)
+ if(all_drones.hacked)
+ continue
+ if(all_drones.z != zlevel)
+ continue
+ var/list/drone_data = list(
+ "name" = all_drones.name,
+ "status" = all_drones.stat,
+ "drone_ref" = REF(all_drones),
+ )
+ data["drones"] += list(drone_data)
+
+
data["bots"] = botlist
data["mules"] = mulelist
data["botcount"] = botlist.len
+ data["droneaccess"] = GLOB.drone_machine_blacklist_enabled
+ data["dronepingtypes"] = drone_ping_types
return data
@@ -114,4 +135,21 @@
card_slot.try_eject(current_user)
else
playsound(get_turf(ui_host()) , 'sound/machines/buzz-sigh.ogg', 25, FALSE)
- return
+ if("changedroneaccess")
+ if(!computer || !card_slot || !id_card)
+ to_chat(current_user, span_notice("No ID found, authorization failed."))
+ return
+ if(!(ACCESS_CE in id_card.access))
+ to_chat(current_user, span_notice("Required access not found on ID."))
+ return
+ GLOB.drone_machine_blacklist_enabled = !GLOB.drone_machine_blacklist_enabled
+ if("ping_drones")
+ if(!(params["ping_type"]) || !(params["ping_type"] in drone_ping_types))
+ return
+ var/area/current_area = get_area(current_user)
+ if(!current_area || QDELETED(current_user))
+ return
+ var/msg = span_boldnotice("NON-DRONE PING: [current_user.name]: [params["ping_type"]] priority alert in [current_area.name]!")
+ _alert_drones(msg, TRUE, current_user)
+ to_chat(current_user, msg)
+ playsound(src, 'sound/machines/terminal_success.ogg', 15, TRUE)
diff --git a/tgui/packages/tgui/interfaces/NtosRoboControl.js b/tgui/packages/tgui/interfaces/NtosRoboControl.js
index 45d8039dae2..ba4c3b836f7 100644
--- a/tgui/packages/tgui/interfaces/NtosRoboControl.js
+++ b/tgui/packages/tgui/interfaces/NtosRoboControl.js
@@ -1,5 +1,5 @@
-import { useBackend } from '../backend';
-import { Button, LabeledList, ProgressBar, Section, Stack } from '../components';
+import { useBackend, useSharedState } from '../backend';
+import { Box, Button, Dropdown, LabeledList, ProgressBar, Section, Stack, Tabs } from '../components';
import { NtosWindow } from '../layouts';
const getMuleByRef = (mules, ref) => {
@@ -8,10 +8,14 @@ const getMuleByRef = (mules, ref) => {
export const NtosRoboControl = (props, context) => {
const { act, data } = useBackend(context);
+ const [tab_main, setTab_main] = useSharedState(context, 'tab_main', 1);
const {
bots,
+ drones,
id_owner,
has_id,
+ droneaccess,
+ dronepingtypes,
} = data;
return (
{
onClick={() => act('ejectcard')} />
)}
-
- {data.botcount}
-
- {bots?.map(robot => (
-
- ))}
+
+
+ setTab_main(1)}>
+ Bots
+
+ setTab_main(2)}>
+ Drones
+
+
+
+ {tab_main === 1 && (
+
+
+
+
+ {data.botcount}
+
+
+
+ {bots?.map(robot => (
+
+ ))}
+
+ )}
+ {tab_main === 2 && (
+
+
+
+ {drones?.map(drone => (
+
+ ))}
+
+ )}
);
};
-const RobotInfo = (props, context) => {
+export const RobotInfo = (props, context) => {
const { robot } = props;
const { act, data } = useBackend(context);
const mules = data.mules || [];
@@ -206,3 +260,32 @@ const RobotInfo = (props, context) => {
);
};
+
+export const DroneInfo = (props, context) => {
+ const { drone } = props;
+ const { act, data } = useBackend(context);
+ const color = 'rgba(74, 59, 140, 1)';
+
+ return (
+
+
+
+
+
+
+ {drone.status
+ ? "Not Responding"
+ : 'Nominal'}
+
+
+
+
+
+
+ );
+};
+