diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 7cebf4f6ba..bdde89fc94 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -74,6 +74,8 @@ datum/mind current.mind = null if(new_character.mind) //remove any mind currently in our new body's mind variable new_character.mind.current = null + + nanomanager.user_transferred(current, new_character) // transfer active NanoUI instances to new user current = new_character //link ourself to our new body new_character.mind = src //and link our new body to ourself diff --git a/code/modules/nano/nanoexternal.dm b/code/modules/nano/nanoexternal.dm index fed8cb4c4f..2331debd9b 100644 --- a/code/modules/nano/nanoexternal.dm +++ b/code/modules/nano/nanoexternal.dm @@ -13,7 +13,7 @@ var/datum/nanoui/ui = locate(uiref) - if (ui) + if (istype(ui)) ui.close() if(ui.ref) diff --git a/code/modules/nano/nanomanager.dm b/code/modules/nano/nanomanager.dm index 7a09e7ffd3..67b4d4623b 100644 --- a/code/modules/nano/nanomanager.dm +++ b/code/modules/nano/nanomanager.dm @@ -112,5 +112,27 @@ for (var/datum/nanoui/ui in user.open_uis) ui.close(); + /** + * This is called when a player transfers from one mob to another + * Transfers all open UIs to the new mob + * + * @param oldMob /mob The user's old mob + * @param newMob /mob The user's new mob + * + * @return nothing + */ +/datum/nanomanager/proc/user_transferred(var/mob/oldMob, var/mob/newMob) + if (isnull(oldMob.open_uis) || !istype(oldMob.open_uis, /list) || open_uis.len == 0) + return 0 // has no open uis + if (isnull(newMob.open_uis) || !istype(newMob.open_uis, /list)) + newMob.open_uis = list() + + for (var/datum/nanoui/ui in oldMob.open_uis) + ui.user = newMob + newMob.open_uis.Add(ui) + + oldMob.open_uis.Cut() + + return 1 // success diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index a6a7300469..6557d86e0f 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -135,7 +135,6 @@ nanoui is used to open and update nano browser uis if (dist > 4) close() return - if ((allowed_user_stat > -1) && (user.stat > allowed_user_stat)) set_status(STATUS_DISABLED, push_update) // no updates, completely disabled (red visibility) @@ -352,6 +351,7 @@ nanoui is used to open and update nano browser uis window_size = "size=[width]x[height];" update_status(0) user << browse(get_html(), "window=[window_id];[window_size][window_options]") + winset(user, "mapwindow.map", "focus=true") // return keyboard focus to map on_close_winset() //onclose(user, window_id) nanomanager.ui_opened(src) @@ -405,7 +405,7 @@ nanoui is used to open and update nano browser uis if (status != STATUS_INTERACTIVE || user != usr) // If UI is not interactive or usr calling Topic is not the UI user return - if (src_object.Topic(href, href_list)) + if (src_object && src_object.Topic(href, href_list)) nanomanager.update_uis(src_object) // update all UIs attached to src_object /**