diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 541f467e9b..2c8e3164a9 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -45,7 +45,7 @@ radiomod = ";" //AIs will, by default, state their laws on the internal radio. var/obj/item/pda/ai/aiPDA var/obj/item/multitool/aiMulti - var/mob/living/simple_animal/bot/Bot + var/datum/weakref/bot_ref var/tracking = FALSE //this is 1 if the AI is currently tracking somebody, but the track has not yet been completed. var/datum/effect_system/spark_spread/spark_system //So they can initialize sparks whenever/N var/obj/machinery/status_display/controlled_display @@ -208,7 +208,7 @@ QDEL_NULL(aiPDA) malfhack = null current = null - Bot = null + bot_ref = null controlled_equipment = null linked_core = null apc_override = null @@ -538,19 +538,19 @@ else if(GLOB.cameranet && GLOB.cameranet.checkTurfVis(turf_check)) call_bot(turf_check) else - to_chat(src, "Selected location is not visible.") + to_chat(src, span_danger("Selected location is not visible.")) /mob/living/silicon/ai/proc/call_bot(turf/waypoint) - - if(!Bot) + var/mob/living/simple_animal/bot/bot = bot_ref.resolve() + if(!bot) return - if(Bot.calling_ai && Bot.calling_ai != src) //Prevents an override if another AI is controlling this bot. - to_chat(src, "Interface error. Unit is already in use.") + if(bot.calling_ai && bot.calling_ai != src) //Prevents an override if another AI is controlling this bot. + to_chat(src, span_danger("Interface error. Unit is already in use.")) return - to_chat(src, "Sending command to bot...") + to_chat(src, span_notice("Sending command to bot...")) call_bot_cooldown = world.time + CALL_BOT_COOLDOWN - Bot.call_bot(src, waypoint) + bot.call_bot(src, waypoint) call_bot_cooldown = 0 /mob/living/silicon/ai/triggerAlarm(class, area/home, cameras, obj/source) diff --git a/code/modules/mob/living/silicon/ai/robot_control.dm b/code/modules/mob/living/silicon/ai/robot_control.dm index bbfb7604ba..a723fd05e2 100644 --- a/code/modules/mob/living/silicon/ai/robot_control.dm +++ b/code/modules/mob/living/silicon/ai/robot_control.dm @@ -10,7 +10,7 @@ if(user != owner || owner.incapacitated()) return FALSE if(owner.control_disabled) - to_chat(user, "Wireless control is disabled.") + to_chat(user, span_warning("Wireless control is disabled.")) return FALSE return TRUE @@ -35,17 +35,23 @@ var/turf/ai_current_turf = get_turf(owner) var/ai_zlevel = ai_current_turf.z + var/mob/living/simple_animal/bot/bot = owner.bot_ref?.resolve() + if((owner.waypoint_mode && bot) && !(bot.remote_disabled || owner.control_disabled)) + data["commandeering"] = REF(bot) + else + data["commandeering"] = null + data["robots"] = list() - for(var/mob/living/simple_animal/bot/B in GLOB.bots_list) - if(B.z != ai_zlevel || B.remote_disabled) //Only non-emagged bots on the same Z-level are detected! + for(var/mob/living/simple_animal/bot/our_bot as anything in GLOB.bots_list) + if(our_bot.z != ai_zlevel || our_bot.remote_disabled) //Only non-emagged bots on the same Z-level are detected! continue var/list/robot_data = list( - name = B.name, - model = B.model, - mode = B.get_mode(), - hacked = B.hacked, - location = get_area_name(B, TRUE), - ref = REF(B) + name = our_bot.name, + model = our_bot.model, + mode = our_bot.get_mode(), + hacked = our_bot.hacked, + location = get_area_name(our_bot, TRUE), + ref = REF(our_bot) ) data["robots"] += list(robot_data) @@ -54,23 +60,30 @@ /datum/robot_control/ui_act(action, params) if(..()) return - if(!is_interactable(usr)) + var/mob/living/our_user = usr + if(!is_interactable(our_user)) + return + + var/mob/living/simple_animal/bot/bot = locate(params["ref"]) in GLOB.bots_list + if(isnull(bot)) return switch(action) if("callbot") //Command a bot to move to a selected location. if(owner.call_bot_cooldown > world.time) - to_chat(usr, "Error: Your last call bot command is still processing, please wait for the bot to finish calculating a route.") + to_chat(our_user, span_danger("Error: Your last call bot command is still processing, please wait for the bot to finish calculating a route.")) return - owner.Bot = locate(params["ref"]) in GLOB.bots_list - if(!owner.Bot || owner.Bot.remote_disabled || owner.control_disabled) + + if(bot.remote_disabled) return + + owner.bot_ref = WEAKREF(bot) owner.waypoint_mode = TRUE - to_chat(usr, "Set your waypoint by clicking on a valid location free of obstructions.") - . = TRUE + to_chat(our_user, span_notice("Set your waypoint by clicking on a valid location free of obstructions.")) if("interface") //Remotely connect to a bot! - owner.Bot = locate(params["ref"]) in GLOB.bots_list - if(!owner.Bot || owner.Bot.remote_disabled || owner.control_disabled) + owner.bot_ref = WEAKREF(bot) + if(bot.remote_disabled) return - owner.Bot.attack_ai(usr) - . = TRUE + bot.attack_ai(our_user) + + return TRUE diff --git a/tgui/packages/tgui/interfaces/RemoteRobotControl.js b/tgui/packages/tgui/interfaces/RemoteRobotControl.js index 75be82c8e3..85a15dbfd8 100644 --- a/tgui/packages/tgui/interfaces/RemoteRobotControl.js +++ b/tgui/packages/tgui/interfaces/RemoteRobotControl.js @@ -20,6 +20,7 @@ export const RemoteRobotControlContent = (props, context) => { const { act, data } = useBackend(context); const { robots = [], + commandeering, } = data; if (!robots.length) { return ( @@ -46,6 +47,7 @@ export const RemoteRobotControlContent = (props, context) => {