diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 88496c79d630..47aa0e732c76 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -123,7 +123,6 @@ #define SS_INIT_NIGHTMARE 21.5 #define SS_INIT_TIMETRACK 21.1 #define SS_INIT_HUMANS 21 -#define SS_INIT_WHO 20 #define SS_INIT_POWER 19 #define SS_INIT_INFLUXMCSTATS 12 #define SS_INIT_INFLUXSTATS 11 diff --git a/code/controllers/subsystem/who.dm b/code/controllers/subsystem/who.dm deleted file mode 100644 index 43ecbb435587..000000000000 --- a/code/controllers/subsystem/who.dm +++ /dev/null @@ -1,312 +0,0 @@ -SUBSYSTEM_DEF(who) - name = "Who" - flags = SS_BACKGROUND - runlevels = RUNLEVELS_DEFAULT|RUNLEVEL_LOBBY - init_order = SS_INIT_WHO - wait = 5 SECONDS - - var/datum/player_list/who = new - var/datum/player_list/staff/staff_who = new - -/datum/controller/subsystem/who/Initialize() - who.update_data() - staff_who.update_data() - return SS_INIT_SUCCESS - -/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/additional_data = list( - "lobby" = 0, - "admin_observers" = 0, - "observers" = 0, - "yautja" = 0, - "infected_preds" = 0, - "humans" = 0, - "infected_humans" = 0, - "uscm" = 0, - "uscm_marines" = 0, - ) - new_list_data["additional_info"] = list() - var/list/counted_factions = list() - for(var/client/client as anything in sortTim(GLOB.clients, GLOBAL_PROC_REF(cmp_ckey_asc))) - CHECK_TICK - 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" - 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" - additional_data["lobby"]++ - - else if(isobserver(client_mob)) - client_payload["text"] += " - Playing as [client_mob.real_name]" - if(CLIENT_IS_STAFF(client)) - additional_data["admin_observers"]++ - else - additional_data["observers"]++ - - var/mob/dead/observer/observer = client_mob - if(observer.started_as_observer) - client_payload["color"] += "#ce89cd" - 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"] += "#ec3535" - client_payload["text"] += " - Xenomorph" - - else if(ishuman(client_mob)) - if(client_mob.faction == FACTION_ZOMBIE) - counted_factions[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" - additional_data["yautja"]++ - if(client_mob.status_flags & XENO_HOST) - additional_data["infected_preds"]++ - else - additional_data["humans"]++ - if(client_mob.status_flags & XENO_HOST) - additional_data["infected_humans"]++ - if(client_mob.faction == FACTION_MARINE) - additional_data["uscm"]++ - if(client_mob.job in (GLOB.ROLES_MARINES)) - additional_data["uscm_marines"]++ - else - counted_factions[client_mob.faction]++ - - new_list_data["total_players"] += list(client_payload) - - new_list_data["additional_info"] += list(list( - "content" = "In Lobby: [additional_data["lobby"]]", - "color" = "#777", - "text" = "Player in lobby", - )) - - new_list_data["additional_info"] += list(list( - "content" = "Spectating Players: [additional_data["observers"]]", - "color" = "#777", - "text" = "Spectating players", - )) - - new_list_data["additional_info"] += list(list( - "content" = "Spectating Admins: [additional_data["admin_observers"]]", - "color" = "#777", - "text" = "Spectating administrators", - )) - - new_list_data["additional_info"] += list(list( - "content" = "Humans: [additional_data["humans"]]", - "color" = "#2C7EFF", - "text" = "Players playing as Human", - )) - - new_list_data["additional_info"] += list(list( - "content" = "Infected Humans: [additional_data["infected_humans"]]", - "color" = "#ec3535", - "text" = "Players playing as Infected Human", - )) - - new_list_data["additional_info"] += list(list( - "content" = "[MAIN_SHIP_NAME] Personnel: [additional_data["uscm"]]", - "color" = "#5442bd", - "text" = "Players playing as [MAIN_SHIP_NAME] Personnel", - )) - - new_list_data["additional_info"] += list(list( - "content" = "Marines: [additional_data["uscm_marines"]]", - "color" = "#5442bd", - "text" = "Players playing as Marines", - )) - - new_list_data["additional_info"] += list(list( - "content" = "Yautjas: [additional_data["yautja"]]", - "color" = "#7ABA19", - "text" = "Players playing as Yautja", - )) - - new_list_data["additional_info"] += list(list( - "content" = "Infected Predators: [additional_data["infected_preds"]]", - "color" = "#7ABA19", - "text" = "Players playing as Infected Yautja", - )) - - for(var/i in 1 to length(counted_factions)) - if(counted_factions[counted_factions[i]]) - new_list_data["factions"] += list(list( - "content" = "[counted_factions[i]]: [counted_factions[counted_factions[i]]]", - "color" = "#2C7EFF", - "text" = "Other", - )) - if(counted_factions[FACTION_NEUTRAL]) - new_list_data["factions"] += list(list( - "content" = "[FACTION_NEUTRAL] Humans: [counted_factions[FACTION_NEUTRAL]]", - "color" = "#688944", - "text" = "Neutrals", - )) - - for(var/faction_to_get in ALL_XENO_HIVES) - var/datum/hive_status/hive = GLOB.hive_datum[faction_to_get] - if(hive && length(hive.totalXenos)) - new_list_data["xenomorphs"] += list(list( - "content" = "[hive.name]: [length(hive.totalXenos)]", - "color" = hive.color ? hive.color : "#8200FF", - "text" = "Queen: [hive.living_xeno_queen ? "Alive" : "Dead"]", - )) - - 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") - if(mobs_ckey[params["ckey"]]) - GLOB.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_PERMISSIONS) - 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 as anything 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 as anything 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 = "StaffWho" - - SSwho.staff_who.tgui_interact(src) diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm new file mode 100644 index 000000000000..3a9274dbec62 --- /dev/null +++ b/code/game/verbs/who.dm @@ -0,0 +1,209 @@ +/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_TWE = 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:
" + var/list/Lines = list() + if(admin_holder && ((R_ADMIN & admin_holder.rights) || (R_MOD & admin_holder.rights))) + for(var/client/C in GLOB.clients) + if(!CLIENT_HAS_RIGHTS(src, R_STEALTH) && (CLIENT_IS_STEALTHED(C))) + continue + var/entry = "[C.key]" + if(C.mob) //Juuuust in case + if(istype(C.mob, /mob/new_player)) + entry += " - In Lobby" + counted_humanoids["Lobby"]++ + else + entry += " - Playing as [C.mob.real_name]" + + if(isobserver(C.mob)) + counted_humanoids["Observers"]++ + if(C.admin_holder?.rights & R_MOD) + counted_humanoids["Admin observers"]++ + counted_humanoids["Observers"]-- + var/mob/dead/observer/O = C.mob + if(O.started_as_observer) + entry += " - Observing" + else + entry += " - DEAD" + else + switch(C.mob.stat) + if(UNCONSCIOUS) + entry += " - Unconscious" + if(DEAD) + entry += " - DEAD" + + if(C.mob && C.mob.stat != DEAD) + if(ishuman(C.mob)) + if(C.mob.faction == FACTION_ZOMBIE) + counted_humanoids[FACTION_ZOMBIE]++ + entry += " - Zombie" + else if(C.mob.faction == FACTION_YAUTJA) + counted_humanoids[FACTION_YAUTJA]++ + entry += " - Predator" + if(C.mob.status_flags & XENO_HOST) + counted_humanoids["Infected preds"]++ + else + counted_humanoids["Humans"]++ + if(C.mob.status_flags & XENO_HOST) + counted_humanoids["Infected humans"]++ + if(C.mob.faction == FACTION_MARINE) + counted_humanoids[FACTION_MARINE]++ + if(C.mob.job in (GLOB.ROLES_MARINES)) + counted_humanoids["USCM Marines"]++ + else + counted_humanoids[C.mob.faction]++ + else if(isxeno(C.mob)) + var/mob/living/carbon/xenomorph/X = C.mob + counted_xenos[X.hivenumber]++ + if(X.faction == FACTION_PREDALIEN) + counted_xenos[FACTION_PREDALIEN]++ + entry += " - Xenomorph" + entry += " (?)" + Lines += entry + + for(var/line in sortList(Lines)) + dat += "[line]
" + dat += "Total Players: [players]" + dat += "
In Lobby: [counted_humanoids["Lobby"]]" + dat += "
Observers: [counted_humanoids["Observers"]] players and [counted_humanoids["Admin observers"]] staff members" + dat += "
Humans: [counted_humanoids["Humans"]] (Infected: [counted_humanoids["Infected humans"]])" + if(counted_humanoids[FACTION_MARINE]) + dat += "
USCM personnel: [counted_humanoids[FACTION_MARINE]] (Marines: [counted_humanoids["USCM Marines"]])" + if(counted_humanoids[FACTION_YAUTJA]) + dat += "
Predators: [counted_humanoids[FACTION_YAUTJA]] [counted_humanoids["Infected preds"] ? "(Infected: [counted_humanoids["Infected preds"]])" : ""]" + if(counted_humanoids[FACTION_ZOMBIE]) + dat += "
Zombies: [counted_humanoids[FACTION_ZOMBIE]]" + + var/show_fact = TRUE + for(var/i in 10 to LAZYLEN(counted_humanoids) - 2) + if(counted_humanoids[counted_humanoids[i]]) + if(show_fact) + dat += "

Other factions:" + show_fact = FALSE + dat += "
[counted_humanoids[i]]: [counted_humanoids[counted_humanoids[i]]]" + if(counted_humanoids[FACTION_NEUTRAL]) + dat += "
[FACTION_NEUTRAL] Humans: [counted_humanoids[FACTION_NEUTRAL]]" + + show_fact = TRUE + var/datum/hive_status/hive + for(var/hivenumber in counted_xenos) + // Print predalien counts last + if(hivenumber == FACTION_PREDALIEN) + continue + if(show_fact) + dat += "

Xenomorphs:" + show_fact = FALSE + hive = GLOB.hive_datum[hivenumber] + if(hive) + dat += "
[hive.name]: [counted_xenos[hivenumber]] (Queen: [hive.living_xeno_queen ? "Alive" : "Dead"])" + else + dat += "
Error: no hive datum detected for [hivenumber]." + hive = null + if(counted_xenos[FACTION_PREDALIEN]) + dat += "
Predaliens: [counted_xenos[FACTION_PREDALIEN]]" + + else + for(var/client/C in GLOB.clients) + if((C.admin_holder && C.admin_holder.fakekey) || (CLIENT_IS_STEALTHED(C))) + continue + + Lines += C.key + for(var/line in sortList(Lines)) + dat += "[line]
" + dat += "Total Players: [players]
" + + dat += "" + show_browser(usr, dat, "Who", "who", "size=600x800") + + +/client/verb/staffwho() + set name = "Staffwho" + set category = "Admin" + + var/dat = "" + var/list/mappings + if(CONFIG_GET(flag/show_manager)) + LAZYSET(mappings, "Management", R_PERMISSIONS) + if(CONFIG_GET(flag/show_devs)) + LAZYSET(mappings, "Maintainers", R_PROFILER) + LAZYSET(mappings, "Admins", R_ADMIN) + if(CONFIG_GET(flag/show_mods)) + LAZYSET(mappings, "Moderators", R_MOD) + if(CONFIG_GET(flag/show_mentors)) + LAZYSET(mappings, "Mentors", R_MENTOR) + + var/list/listings + for(var/category in mappings) + LAZYSET(listings, category, list()) + + for(var/client/C in GLOB.admins) + if(CLIENT_IS_STEALTHED(C) && !CLIENT_HAS_RIGHTS(src, R_STEALTH)) + continue + if(C.admin_holder?.fakekey && !CLIENT_IS_STAFF(src)) + continue + for(var/category in mappings) + if(CLIENT_HAS_RIGHTS(C, mappings[category])) + LAZYADD(listings[category], C) + break + + for(var/category in listings) + dat += "
Current [category] ([length(listings[category])]):
\n" + for(var/client/entry in listings[category]) + dat += "\t[entry.key] is \a [entry.admin_holder.rank]" + if(LAZYLEN(entry.admin_holder.extra_titles)) + for(var/srank in entry.admin_holder.extra_titles) + dat += " & [srank]" + if(CLIENT_IS_STAFF(src)) + if(CLIENT_IS_STEALTHED(entry)) + dat += " (STEALTHED)" + else if(entry.admin_holder?.fakekey) + dat += " (HIDDEN)" + if(istype(entry.mob, /mob/dead/observer)) + dat += " - Observing" + else if(istype(entry.mob, /mob/new_player)) + dat += " - Lobby" + else + dat += " - Playing" + if(entry.is_afk()) + dat += " (AFK)" + dat += "
" + dat += "" + show_browser(usr, dat, "Staffwho", "staffwho", "size=600x800") diff --git a/colonialmarines.dme b/colonialmarines.dme index 7915adce0587..c7d4a8957987 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -311,7 +311,6 @@ #include "code\controllers\subsystem\tracking.dm" #include "code\controllers\subsystem\vote.dm" #include "code\controllers\subsystem\weather.dm" -#include "code\controllers\subsystem\who.dm" #include "code\controllers\subsystem\x_evolution.dm" #include "code\controllers\subsystem\xeno.dm" #include "code\controllers\subsystem\init\landmarks.dm" @@ -1408,6 +1407,7 @@ #include "code\game\verbs\ooc.dm" #include "code\game\verbs\preferences.dm" #include "code\game\verbs\records.dm" +#include "code\game\verbs\who.dm" #include "code\modules\trigger.dm" #include "code\modules\admin\admin.dm" #include "code\modules\admin\admin_ranks.dm" diff --git a/tgui/packages/tgui/interfaces/StaffWho.jsx b/tgui/packages/tgui/interfaces/StaffWho.jsx deleted file mode 100644 index 1ce71c9b5001..000000000000 --- a/tgui/packages/tgui/interfaces/StaffWho.jsx +++ /dev/null @@ -1,78 +0,0 @@ -import { useBackend } from '../backend'; -import { Button, Collapsible, Stack } from '../components'; -import { Window } from '../layouts'; - -export const StaffWho = (props, context) => { - const { data } = useBackend(context); - const { admin, administrators } = data; - - return ( - - - {administrators !== undefined ? ( - - - {administrators.map((x, index) => ( - - {x.admins.map((x, index) => ( - - ))} - - ))} - - - ) : null} - - - ); -}; - -const StaffWhoCollapsible = (props, context) => { - const { title, color, children } = props; - return ( - - {children} - - ); -}; - -const GetAdminInfo = (props, context) => { - const { admin, content, color, text } = props; - return admin ? ( - - ) : ( - - ); -}; diff --git a/tgui/packages/tgui/interfaces/Who.jsx b/tgui/packages/tgui/interfaces/Who.jsx deleted file mode 100644 index dccf3d1e39f0..000000000000 --- a/tgui/packages/tgui/interfaces/Who.jsx +++ /dev/null @@ -1,189 +0,0 @@ -import { useBackend, useLocalState } from '../backend'; -import { - Box, - Button, - Collapsible, - Icon, - Input, - Section, - Stack, -} from '../components'; -import { Window } from '../layouts'; - -export const Who = (props, context) => { - const { act, data } = useBackend(context); - const { - admin, - all_clients, - total_players = [], - additional_info = [], - factions = [], - xenomorphs = [], - } = data; - - const [searchQuery, setSearchQuery] = useLocalState('searchQuery', ''); - - const searchPlayers = () => - total_players.filter((player) => isMatch(player, searchQuery)); - - const filteredTotalPlayers = searchPlayers(); - - return ( - - - - -
- - - - - - - act('get_player_panel', { - ckey: searchPlayers()?.[0].ckey, - }) - } - onInput={(e) => setSearchQuery(e.target.value)} - placeholder="Search..." - value={searchQuery} - /> - - -
-
- -
- - {filteredTotalPlayers.length ? ( - - {filteredTotalPlayers.map((x) => ( - - ))} - - ) : null} - -
- {admin !== 0 ? ( -
- - - {additional_info.length - ? additional_info.map((x, index) => ( - - )) - : null} - {factions.length - ? factions.map((x, index) => ( - - )) - : null} - {xenomorphs.length - ? xenomorphs.map((x, index) => ( - - )) - : null} - - -
- ) : null} -
-
-
-
- ); -}; - -const WhoCollapsible = (props, context) => { - const { title, color, children } = props; - return ( - - {children} - - ); -}; - -const GetAddInfo = (props, context) => { - const { act } = useBackend(context); - const { content, color, text } = props; - - return ( - - ); -}; - -const GetPlayerInfo = (props, context) => { - const { act } = useBackend(context); - const { - admin, - player: { ckey, ckey_color, color, text }, - } = props; - return admin !== 0 ? ( - - ) : ( - - ); -}; - -const isMatch = (player, searchQuery) => { - if (!searchQuery) { - return true; - } - - return ( - player.ckey.toLowerCase().includes(searchQuery?.toLowerCase()) || false - ); -};