mirror of
https://github.com/Citadel-Station-13/Citadel-Station-13-RP.git
synced 2026-08-22 18:16:33 +01:00
67 lines
2.2 KiB
Plaintext
67 lines
2.2 KiB
Plaintext
GLOBAL_DATUM_INIT(ghostrole_menu, /datum/ghostrole_menu, new)
|
|
|
|
/datum/ghostrole_menu
|
|
|
|
/datum/ghostrole_menu/ui_state()
|
|
return GLOB.observer_state
|
|
|
|
/datum/ghostrole_menu/ui_interact(mob/user, datum/tgui/ui)
|
|
ui = SStgui.try_update_ui(user, src, ui)
|
|
if(!ui)
|
|
ui = new(user, src, "SpawnersMenu")
|
|
ui.open()
|
|
|
|
/datum/ghostrole_menu/ui_static_data(mob/user, datum/tgui/ui)
|
|
. = ..()
|
|
var/list/spawners = list()
|
|
.["spawners"] = spawners
|
|
for(var/id in GLOB.ghostroles)
|
|
var/datum/prototype/role/ghostrole/role = GLOB.ghostroles[id]
|
|
if(!istype(role))
|
|
stack_trace("non ghostrole [role] ([id]) pruned from ghostroles list.")
|
|
GLOB.ghostroles -= id
|
|
continue
|
|
var/list/data = list()
|
|
data["id"] = role.id || role.type
|
|
data["name"] = role.name
|
|
data["short_desc"] = role.desc
|
|
data["flavor_text"] = role.spawntext
|
|
data["important_info"] = role.ImportantInfo()
|
|
var/slots = role.SpawnsLeft(user)
|
|
data["amount_left"] = slots == INFINITY? -1 : slots
|
|
spawners += list(data) // wrap
|
|
|
|
/datum/ghostrole_menu/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state, datum/event_args/actor/actor)
|
|
if(..())
|
|
return
|
|
if(!isobserver(usr))
|
|
return
|
|
var/id = params["id"]
|
|
var/datum/prototype/role/ghostrole/role = get_ghostrole_datum(id)
|
|
if(!role)
|
|
return
|
|
switch(action)
|
|
if("jump")
|
|
if(role.spawnerless)
|
|
to_chat(usr, "<span class='warning'>[role] is spawnerless! You won't be able to find out where you spawn until you actually spawn in!</span>")
|
|
return
|
|
var/atom/A = role.GetSpawnLoc(usr.client, role.GetSpawnpoint(usr.client))
|
|
if(!A)
|
|
to_chat(usr, "<span class='warning'>Could not find a spawnpoint for [role]. This sometimes mean it isn't loaded in until someone attempts to spawn. Alternatively, you didn't pick one!</span>")
|
|
return
|
|
if(!A.loc)
|
|
to_chat(usr, "<span class='danger'>BUG: Spawnpoint was nullspace.</span>")
|
|
return
|
|
usr.forceMove(get_turf(A))
|
|
if("spawn")
|
|
var/client/C = usr.client
|
|
var/error = role.AttemptSpawn(C)
|
|
if(istext(error))
|
|
to_chat(C, SPAN_DANGER(error))
|
|
|
|
/**
|
|
* Call this whenever ghostrole data changes, we don't keep resending to save performance.
|
|
*/
|
|
/datum/ghostrole_menu/proc/queue_update()
|
|
addtimer(CALLBACK(src, TYPE_PROC_REF(/datum, update_static_data)), 0, TIMER_UNIQUE | TIMER_OVERRIDE)
|