diff --git a/code/controllers/subsystem/who.dm b/code/controllers/subsystem/who.dm new file mode 100644 index 000000000000..1264cccdb444 --- /dev/null +++ b/code/controllers/subsystem/who.dm @@ -0,0 +1,325 @@ +SUBSYSTEM_DEF(who) + name = "Who" + flags = SS_NO_INIT|SS_BACKGROUND + runlevels = RUNLEVELS_DEFAULT|RUNLEVEL_LOBBY + wait = 5 SECONDS //smooth update + + //make it global, good for CPU, no per player UI update + var/datum/player_list/who = new + var/datum/player_list/staff/staff_who = new + +/datum/controller/subsystem/who/fire(resumed = TRUE) + who.update_data() + staff_who.update_data() + +//datum +/datum/player_list + var/tgui_name = "Who" + var/tgui_interface_name = "Who" + var/list/mobs_ckey = list() + var/list/list_data = list() + +/datum/player_list/proc/update_data() + var/list/new_list_data = list() + var/list/new_mobs_ckey = list() + var/list/additiona_data = list( + "lobby" = 0, + "admin_observers" = 0, + "observers" = 0, + "yautja" = 0, + "infected_preds" = 0, + "humans" = 0, + "infected_humans" = 0, + "uscm" = 0, + "uscm_marines" = 0, + ) + var/list/mobs_by_faction = list() + new_list_data["additional_info"] = list() + + for(var/client/client in GLOB.clients) + new_list_data["all_clients"]++ + var/list/client_payload = list() + client_payload["ckey"] = "[client.key]" + client_payload["text"] = "[client.key]" + client_payload["ckey_color"] = "white"// change it if want! for byond supporters maybe? (client.player_data?.donator_info.patreon_function_available("ooc_color") ? "#D4AF37" : "white") + var/mob/client_mob = client.mob + new_mobs_ckey[client.key] = client_mob + if(client_mob) + if(istype(client_mob, /mob/new_player)) + client_payload["text"] += " - in Lobby" + additiona_data["lobby"]++ + new_list_data["total_players"] += list(client_payload) + continue + + if(isobserver(client_mob)) + client_payload["text"] += " - Playing as [client_mob.real_name]" + if(CLIENT_IS_STAFF(client)) + additiona_data["admin_observers"]++ + else + additiona_data["observers"]++ + + var/mob/dead/observer/observer = client_mob + if(observer.started_as_observer) + client_payload["color"] += "#808080" + client_payload["text"] += " - Spectating" + else + client_payload["color"] += "#A000D0" + client_payload["text"] += " - DEAD" + + else + client_payload["text"] += " - Playing as [client_mob.real_name]" + + switch(client_mob.stat) + if(UNCONSCIOUS) + client_payload["color"] += "#B0B0B0" + client_payload["text"] += " - Unconscious" + if(DEAD) + client_payload["color"] += "#A000D0" + client_payload["text"] += " - DEAD" + + if(client_mob.stat != DEAD) + if(isxeno(client_mob)) + client_payload["color"] += "#f00" + client_payload["text"] += " - Xenomorph" + + else if(ishuman(client_mob)) + if(client_mob.faction == FACTION_ZOMBIE) + client_payload["color"] += "#2DACB1" + client_payload["text"] += " - Zombie" + else if(client_mob.faction == FACTION_YAUTJA) + client_payload["color"] += "#7ABA19" + client_payload["text"] += " - Yautja" + additiona_data["yautja"]++ + if(client_mob.status_flags & XENO_HOST) + additiona_data["infected_preds"]++ + else + additiona_data["humans"]++ + if(client_mob.status_flags & XENO_HOST) + additiona_data["infected_humans"]++ + if(client_mob.faction == FACTION_MARINE) + additiona_data["uscm"]++ + if(client_mob.job in (ROLES_MARINES)) + additiona_data["uscm_marines"]++ + + mobs_by_faction[client_mob.faction]++ + + new_list_data["total_players"] += list(client_payload) + +// Case - no shit code in UI... backend... + new_list_data["additional_info"] += list(list( + "content" = "in Lobby: [additiona_data["lobby"]]", + "color" = "#777", + "text" = "Player in lobby", + )) + + new_list_data["additional_info"] += list(list( + "content" = "Spectators: [additiona_data["observers"]] Players", + "color" = "#777", + "text" = "Spectating players", + )) + + new_list_data["additional_info"] += list(list( + "content" = "Spectators: [additiona_data["admin_observers"]] Administrators", + "color" = "#777", + "text" = "Spectating administrators", + )) + + new_list_data["additional_info"] += list(list( + "content" = "Humans: [additiona_data["humans"]]", + "color" = "#2C7EFF", + "text" = "Players playing as Human", + )) + + new_list_data["additional_info"] += list(list( + "content" = "Infected Humans: [additiona_data["infected_humans"]]", + "color" = "#F00", + "text" = "Players playing as Infected Human", + )) + + new_list_data["additional_info"] += list(list( + "content" = "USS `Almayer` Personnel: [additiona_data["uscm"]]", + "color" = "#2d199b", + "text" = "Players playing as USS `Almayer` Personnel", + )) + + new_list_data["additional_info"] += list(list( + "content" = "Marines: [additiona_data["uscm_marines"]]", + "color" = "#2d199b", + "text" = "Players playing as Marines", + )) + + new_list_data["additional_info"] += list(list( + "content" = "Yautjes: [additiona_data["yautja"]]", + "color" = "#7ABA19", + "text" = "Players playing as Yautja", + )) + + new_list_data["additional_info"] += list(list( + "content" = "Infected Yautjes: [additiona_data["infected_preds"]])", + "color" = "#7ABA19", + "text" = "Players playing as Infected Yautja", + )) + + for(var/faction_to_get in FACTION_LIST_HUMANOID - FACTION_YAUTJA - FACTION_MARINE) + var/datum/faction/faction = GLOB.faction_datums[faction_to_get] + if(!length(mobs_by_faction[faction_to_get])) + continue + new_list_data["factions"] += list(list( + "content" = "[faction.name]: [length(mobs_by_faction[faction_to_get])]", + "color" = "#43397b",//https://cdn.discordapp.com/attachments/972351753691484260/1125177717751554068/video_2023-03-23_21-38-07.mov + "text" = "",//NO ~~NUKES~~ DESCRIPTIONS? https://cdn.discordapp.com/attachments/800784806383976508/1125146089759195146/trim.13BC96E2-6A10-40AA-B0B1-3D22024D1E8F.mp4 + )) + for(var/faction_to_get in FACTION_LIST_XENOMORPH) + var/datum/hive_status/faction = GLOB.hive_datum[faction_to_get] + if(!length(mobs_by_faction[faction_to_get])) + continue + new_list_data["xenomorphs"] += list(list( + "content" = "[faction.name]: [length(mobs_by_faction[faction_to_get])]", + "color" = faction.color, + "text" = "Queen: [faction.living_xeno_queen ? "Alive" : "Dead"]", + )) + +/* in future... + for(var/faction_to_get in FACTION_LIST_HUMANOID - FACTION_YAUTJA - FACTION_MARINE) + var/datum/faction/faction = GLOB.faction_datum[faction_to_get] + if(!length(faction.totalMobs)) + continue + new_list_data["factions"] += list(list( + "content" = "[faction.name]: [length(faction.totalMobs)]", + "color" = faction.color, + "text" = "[faction.desc]", + )) + for(var/faction_to_get in FACTION_LIST_XENOMORPH) + var/datum/faction/faction = GLOB.faction_datum[faction_to_get] + if(!length(faction.totalMobs)) + continue + new_list_data["xenomorphs"] += list(list( + "content" = "[faction.name]: [length(faction.totalMobs)]", + "color" = faction.color, + "text" = "Queen: [faction.living_xeno_queen ? "Alive" : "Dead"] [faction.desc]", + )) +*/ + + list_data = new_list_data + mobs_ckey = new_mobs_ckey + +/datum/player_list/tgui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, tgui_name, tgui_interface_name) + ui.open() + ui.set_autoupdate(TRUE) + +/datum/player_list/ui_data(mob/user) + . = list_data + +/datum/player_list/ui_static_data(mob/user) + . = list() + + .["admin"] = CLIENT_IS_STAFF(user.client) + +/datum/player_list/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + switch(action) + if("get_player_panel") + admin_datums[usr.client.ckey].show_player_panel(mobs_ckey[params["ckey"]]) + +/datum/player_list/ui_status(mob/user, datum/ui_state/state) + return UI_INTERACTIVE + + +/datum/player_list/staff + tgui_name = "StaffWho" + tgui_interface_name = "Staff Who" + + var/list/category_colors = list( + "Management" = "purple", + "Maintainers" = "blue", + "Administrators" = "red", + "Moderators" = "orange", + "Mentors" = "green" + ) + +/datum/player_list/staff/update_data() + var/list/new_list_data = list() + mobs_ckey = list() + + var/list/listings + var/list/mappings + if(CONFIG_GET(flag/show_manager)) + LAZYSET(mappings, "Management", R_HOST) + if(CONFIG_GET(flag/show_devs)) + LAZYSET(mappings, "Maintainers", R_PROFILER) + LAZYSET(mappings, "Administrators", R_ADMIN) + if(CONFIG_GET(flag/show_mods)) + LAZYSET(mappings, "Moderators", R_MOD && R_BAN) + if(CONFIG_GET(flag/show_mentors)) + LAZYSET(mappings, "Mentors", R_MENTOR) + + for(var/category in mappings) + LAZYSET(listings, category, list()) + + for(var/client/client in GLOB.admins) + if(client.admin_holder?.fakekey && !CLIENT_IS_STAFF(client)) + continue + + for(var/category in mappings) + if(CLIENT_HAS_RIGHTS(client, mappings[category])) + LAZYADD(listings[category], client) + break + + for(var/category in listings) + var/list/admins = list() + for(var/client/entry in listings[category]) + var/list/admin = list() + var/rank = entry.admin_holder.rank + if(entry.admin_holder.extra_titles?.len) + for(var/srank in entry.admin_holder.extra_titles) + rank += " & [srank]" + + admin["content"] = "[entry.key] ([rank])" + admin["text"] = "" + + if(entry.admin_holder?.fakekey) + admin["text"] += " (HIDDEN)" + + if(istype(entry.mob, /mob/dead/observer)) + admin["color"] = "#808080" + admin["text"] += " Spectating" + + else if(istype(entry.mob, /mob/new_player)) + admin["color"] = "#688944" + admin["text"] += " in Lobby" + else + admin["color"] = "#688944" + admin["text"] += " Playing" + + if(entry.is_afk()) + admin["color"] = "#A040D0" + admin["text"] += " (AFK)" + + admins += list(admin) + + new_list_data["administrators"] += list(list( + "category" = category, + "category_color" = category_colors[category], + "category_administrators" = length(listings[category]), + "admins" = admins, + )) + + list_data = new_list_data + +/mob/verb/who() + set category = "OOC" + set name = "Who" + + SSwho.who.tgui_interact(src) + +/mob/verb/staffwho() + set category = "Admin" + set name = "Staff Who" + + SSwho.staff_who.tgui_interact(src) diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm deleted file mode 100644 index bb0e53a012cb..000000000000 --- a/code/game/verbs/who.dm +++ /dev/null @@ -1,202 +0,0 @@ -/client/verb/who()//likely don't touch any... this is easy can die. (:troll_fale:) - set name = "Who" - set category = "OOC" - - var/list/counted_humanoids = list( - "Observers" = 0, - "Admin observers" = 0, - "Humans" = 0, - "Infected humans" = 0, - FACTION_MARINE = 0, - "USCM Marines" = 0, - "Lobby" = 0, - - FACTION_YAUTJA = 0, - "Infected preds" = 0, - - FACTION_PMC = 0, - FACTION_CLF = 0, - FACTION_UPP = 0, - FACTION_FREELANCER = 0, - FACTION_SURVIVOR = 0, - FACTION_WY_DEATHSQUAD = 0, - FACTION_COLONIST = 0, - FACTION_MERCENARY = 0, - FACTION_DUTCH = 0, - FACTION_HEFA = 0, - FACTION_GLADIATOR = 0, - FACTION_PIRATE = 0, - FACTION_PIZZA = 0, - FACTION_SOUTO = 0, - - FACTION_NEUTRAL = 0, - - FACTION_ZOMBIE = 0 - ) - - var/list/counted_xenos = list() - - var/players = length(GLOB.clients) - - var/dat = "
Current Players: