Files
Bubberstation/code/modules/modular_computers/file_system/programs/robocontrol.dm
SkyratBot c34c9418c3 [MIRROR] Tablet UI update (mostly fixes) [MDB IGNORE] (#20802)
* Tablet UI update (mostly fixes) (#74844)

## About The Pull Request

Tablet UIs are now changed when opening/closing an app, instead of
constantly checking for a UI change every ui update.

Program UI acts no longer call parent, as it was unnecessary, Computers
are the ones that should be calling it.

Fixes a ton of problems with static data not updating, such as in
Messenger, ID management, Siliconnect, and Chat client

Chat Client's Admin mode also works again, which was broken when
accesses to check was turned into a list.

Turns a few lists in Robocontrol into static ones when we aren't
changing anything, and makes it actually scan your ID's access.

Fixes budget ordering being unable to show the cart/call the cargo
shuttle.

## Why It's Good For The Game

While I can't seem to find a single issue report on any of the above,
these are still problems that should be fixed.

## Changelog

🆑
fix: SiliConnect can download borg logs again.
fix: The RD can once again enable Admin mode on Wirecarp
fix: NT IRN can once again see the shopping cart and call the cargo
shuttle.
fix: Chat Client, ID Management and Messenger should now update their
UIs properly.
code: PDAs will hopefully not lag as much when clicking on buttons (such
as in ID management).
/🆑

* Tablet UI update (mostly fixes)

---------

Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
2023-04-27 15:10:12 +01:00

146 lines
4.7 KiB
Plaintext

/datum/computer_file/program/robocontrol
filename = "botkeeper"
filedesc = "BotKeeper"
category = PROGRAM_CATEGORY_SCI
program_icon_state = "robot"
extended_desc = "A remote controller used for giving basic commands to non-sentient robots."
requires_ntnet = TRUE
size = 6
tgui_id = "NtosRoboControl"
program_icon = "robot"
///Number of simple robots on-station.
var/botcount = 0
///Access granted by the used to summon robots.
var/list/current_access = list()
///List of all ping types you can annoy drones with.
var/static/list/drone_ping_types = list(
"Low",
"Medium",
"High",
"Critical",
)
/datum/computer_file/program/robocontrol/ui_data(mob/user)
var/list/data = list()
var/turf/current_turf = get_turf(computer.ui_host())
var/list/botlist = list()
var/list/mulelist = list()
if(computer)
data["id_owner"] = computer.computer_id_slot || ""
botcount = 0
for(var/mob/living/simple_animal/bot/simple_bot as anything in GLOB.bots_list)
if(!is_valid_z_level(current_turf, get_turf(simple_bot)) || !(simple_bot.bot_mode_flags & BOT_MODE_REMOTE_ENABLED)) //Only non-emagged bots on the same Z-level are detected!
continue
if(computer && !simple_bot.check_access(user)) // Only check Bots we can access)
continue
var/list/newbot = list(
"name" = simple_bot.name,
"mode" = simple_bot.get_mode_ui(),
"model" = simple_bot.bot_type,
"locat" = get_area(simple_bot),
"bot_ref" = REF(simple_bot),
"mule_check" = FALSE,
)
if(simple_bot.bot_type == MULE_BOT)
var/mob/living/simple_animal/bot/mulebot/simple_mulebot = simple_bot
mulelist += list(list(
"name" = simple_mulebot.name,
"dest" = simple_mulebot.destination,
"power" = simple_mulebot.cell ? simple_mulebot.cell.percent() : 0,
"home" = simple_mulebot.home_destination,
"autoReturn" = simple_mulebot.auto_return,
"autoPickup" = simple_mulebot.auto_pickup,
"reportDelivery" = simple_mulebot.report_delivery,
"mule_ref" = REF(simple_mulebot),
))
if(simple_mulebot.load)
data["load"] = simple_mulebot.load.name
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(!is_valid_z_level(current_turf, get_turf(all_drones)))
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
/datum/computer_file/program/robocontrol/ui_act(action, list/params, datum/tgui/ui)
var/mob/current_user = ui.user
var/obj/item/card/id/id_card = computer?.computer_id_slot
var/static/list/standard_actions = list(
"patroloff",
"patrolon",
"ejectpai",
)
var/static/list/MULE_actions = list(
"stop",
"go",
"home",
"destination",
"setid",
"sethome",
"unload",
"autoret",
"autopick",
"report",
"ejectpai",
)
var/mob/living/simple_animal/bot/simple_bot = locate(params["robot"]) in GLOB.bots_list
if (action in standard_actions)
simple_bot.bot_control(action, current_user, id_card?.GetAccess())
if (action in MULE_actions)
simple_bot.bot_control(action, current_user, id_card?.GetAccess(), TRUE)
switch(action)
if("summon")
simple_bot.bot_control(action, current_user, id_card ? id_card.access : id_card?.GetAccess())
if("ejectcard")
if(!computer || !computer.computer_id_slot)
return
if(id_card)
GLOB.manifest.modify(id_card.registered_name, id_card.assignment, id_card.get_trim_assignment())
computer.RemoveID(usr)
else
playsound(get_turf(computer.ui_host()) , 'sound/machines/buzz-sigh.ogg', 25, FALSE)
if("changedroneaccess")
if(!computer || !computer.computer_id_slot || !id_card)
to_chat(current_user, span_notice("No ID found, authorization failed."))
return
if(isdrone(current_user))
to_chat(current_user, span_notice("You can't free yourself."))
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)