mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-01 04:21:42 +00:00
Please don't try and send chat messages if you have nothing to say Fixes a spurious runtime. Fixes a runtime caused by my lack of understanding of huds. remove_hud_from is intended for hud watchers, remove_from_hud is intended for hud items. Doesn't really make sense most of the time, and just runtimes out the ass Fixes a runtime in shapeshifting, restore should not run if the object is not restoring, or if it's deleting. it should run if it's not restoring, and it's not deleted. 4head Fun fact, if there's two turret control boards they'll override each other. Use weakrefs. Oh also removes a var called cp, nothing good will come of that Today in: Good lord the stacking machine is an afront to god, we discover that the labor claims console was attempting to act as a console, which of course fails when it comes time to clear it's improperly named var. Disgusting Attempts to fix potential wound ref hangs in surgeries? maybe? Fixes a runtime in luminescent stuff I created in my big harddel crusade. owner is a mob, not a species Fixes a runtime related to headspikes deleting themselves twice. Pain Fixes hard deletes sourced from the prophet trauma. Good fucking lord this is awful Offhand item is somehow hard deleting. I have no idea how. Here's hoping signals fixes it, because if it doesn't I'm stumped. It's not a common scenario, but it does happen in spurts that suggest repeated usage
155 lines
5.0 KiB
Plaintext
155 lines
5.0 KiB
Plaintext
/* HUD DATUMS */
|
|
|
|
GLOBAL_LIST_EMPTY(all_huds)
|
|
|
|
//GLOBAL HUD LIST
|
|
GLOBAL_LIST_INIT(huds, list(
|
|
DATA_HUD_SECURITY_BASIC = new/datum/atom_hud/data/human/security/basic(),
|
|
DATA_HUD_SECURITY_ADVANCED = new/datum/atom_hud/data/human/security/advanced(),
|
|
DATA_HUD_MEDICAL_BASIC = new/datum/atom_hud/data/human/medical/basic(),
|
|
DATA_HUD_MEDICAL_ADVANCED = new/datum/atom_hud/data/human/medical/advanced(),
|
|
DATA_HUD_DIAGNOSTIC_BASIC = new/datum/atom_hud/data/diagnostic/basic(),
|
|
DATA_HUD_DIAGNOSTIC_ADVANCED = new/datum/atom_hud/data/diagnostic/advanced(),
|
|
DATA_HUD_ABDUCTOR = new/datum/atom_hud/abductor(),
|
|
DATA_HUD_SENTIENT_DISEASE = new/datum/atom_hud/sentient_disease(),
|
|
DATA_HUD_AI_DETECT = new/datum/atom_hud/ai_detector(),
|
|
DATA_HUD_FAN = new/datum/atom_hud/data/human/fan_hud(),
|
|
ANTAG_HUD_CULT = new/datum/atom_hud/antag(),
|
|
ANTAG_HUD_REV = new/datum/atom_hud/antag(),
|
|
ANTAG_HUD_OPS = new/datum/atom_hud/antag(),
|
|
ANTAG_HUD_WIZ = new/datum/atom_hud/antag(),
|
|
ANTAG_HUD_SHADOW = new/datum/atom_hud/antag(),
|
|
ANTAG_HUD_TRAITOR = new/datum/atom_hud/antag/hidden(),
|
|
ANTAG_HUD_NINJA = new/datum/atom_hud/antag/hidden(),
|
|
ANTAG_HUD_CHANGELING = new/datum/atom_hud/antag/hidden(),
|
|
ANTAG_HUD_ABDUCTOR = new/datum/atom_hud/antag/hidden(),
|
|
ANTAG_HUD_BROTHER = new/datum/atom_hud/antag/hidden(),
|
|
ANTAG_HUD_OBSESSED = new/datum/atom_hud/antag/hidden(),
|
|
ANTAG_HUD_FUGITIVE = new/datum/atom_hud/antag(),
|
|
ANTAG_HUD_GANGSTER = new/datum/atom_hud/antag/hidden(),
|
|
ANTAG_HUD_SPACECOP = new/datum/atom_hud/antag(),
|
|
ANTAG_HUD_HERETIC = new/datum/atom_hud/antag/hidden(),
|
|
ANTAG_HUD_BRAINWASHED = new/datum/atom_hud/antag/hidden()
|
|
))
|
|
|
|
/datum/atom_hud
|
|
var/list/atom/hudatoms = list() //list of all atoms which display this hud
|
|
var/list/hudusers = list() //list with all mobs who can see the hud
|
|
var/list/hud_icons = list() //these will be the indexes for the atom's hud_list
|
|
|
|
var/list/next_time_allowed = list() //mobs associated with the next time this hud can be added to them
|
|
var/list/queued_to_see = list() //mobs that have triggered the cooldown and are queued to see the hud, but do not yet
|
|
var/hud_exceptions = list() // huduser = list(ofatomswiththeirhudhidden) - aka everyone hates targeted invisiblity
|
|
|
|
/datum/atom_hud/New()
|
|
GLOB.all_huds += src
|
|
|
|
/datum/atom_hud/Destroy()
|
|
for(var/v in hudusers)
|
|
remove_hud_from(v)
|
|
for(var/v in hudatoms)
|
|
remove_from_hud(v)
|
|
GLOB.all_huds -= src
|
|
return ..()
|
|
|
|
/datum/atom_hud/proc/remove_hud_from(mob/M, absolute = FALSE)
|
|
if(!M || !hudusers[M])
|
|
return
|
|
if (absolute || !--hudusers[M])
|
|
UnregisterSignal(M, COMSIG_PARENT_QDELETING)
|
|
hudusers -= M
|
|
if(next_time_allowed[M])
|
|
next_time_allowed -= M
|
|
if(queued_to_see[M])
|
|
queued_to_see -= M
|
|
else
|
|
for(var/atom/A in hudatoms)
|
|
remove_from_single_hud(M, A)
|
|
|
|
/datum/atom_hud/proc/remove_from_hud(atom/A)
|
|
if(!A)
|
|
return FALSE
|
|
for(var/mob/M in hudusers)
|
|
remove_from_single_hud(M, A)
|
|
hudatoms -= A
|
|
return TRUE
|
|
|
|
/datum/atom_hud/proc/remove_from_single_hud(mob/M, atom/A) //unsafe, no sanity apart from client
|
|
if(!M || !M.client || !A)
|
|
return
|
|
for(var/i in hud_icons)
|
|
M.client.images -= A.hud_list[i]
|
|
|
|
/datum/atom_hud/proc/add_hud_to(mob/M)
|
|
if(!M)
|
|
return
|
|
if(!hudusers[M])
|
|
hudusers[M] = 1
|
|
RegisterSignal(M, COMSIG_PARENT_QDELETING, .proc/unregister_mob)
|
|
if(next_time_allowed[M] > world.time)
|
|
if(!queued_to_see[M])
|
|
addtimer(CALLBACK(src, .proc/show_hud_images_after_cooldown, M), next_time_allowed[M] - world.time)
|
|
queued_to_see[M] = TRUE
|
|
else
|
|
next_time_allowed[M] = world.time + ADD_HUD_TO_COOLDOWN
|
|
for(var/atom/A in hudatoms)
|
|
add_to_single_hud(M, A)
|
|
else
|
|
hudusers[M]++
|
|
|
|
/datum/atom_hud/proc/unregister_mob(datum/source, force)
|
|
SIGNAL_HANDLER
|
|
remove_hud_from(source, TRUE)
|
|
|
|
/datum/atom_hud/proc/hide_single_atomhud_from(hud_user,hidden_atom)
|
|
if(hudusers[hud_user])
|
|
remove_from_single_hud(hud_user,hidden_atom)
|
|
if(!hud_exceptions[hud_user])
|
|
hud_exceptions[hud_user] = list(hidden_atom)
|
|
else
|
|
hud_exceptions[hud_user] += hidden_atom
|
|
|
|
/datum/atom_hud/proc/unhide_single_atomhud_from(hud_user,hidden_atom)
|
|
hud_exceptions[hud_user] -= hidden_atom
|
|
if(hudusers[hud_user])
|
|
add_to_single_hud(hud_user,hidden_atom)
|
|
|
|
/datum/atom_hud/proc/show_hud_images_after_cooldown(M)
|
|
if(queued_to_see[M])
|
|
queued_to_see -= M
|
|
next_time_allowed[M] = world.time + ADD_HUD_TO_COOLDOWN
|
|
for(var/atom/A in hudatoms)
|
|
add_to_single_hud(M, A)
|
|
|
|
/datum/atom_hud/proc/add_to_hud(atom/A)
|
|
if(!A)
|
|
return FALSE
|
|
hudatoms |= A
|
|
for(var/mob/M in hudusers)
|
|
if(!queued_to_see[M])
|
|
add_to_single_hud(M, A)
|
|
return TRUE
|
|
|
|
/datum/atom_hud/proc/add_to_single_hud(mob/M, atom/A) //unsafe, no sanity apart from client
|
|
if(!M || !M.client || !A)
|
|
return
|
|
for(var/i in hud_icons)
|
|
if(A.hud_list[i] && (!hud_exceptions[M] || !(A in hud_exceptions[M])))
|
|
M.client.images |= A.hud_list[i]
|
|
|
|
//MOB PROCS
|
|
/mob/proc/reload_huds()
|
|
for(var/datum/atom_hud/hud in GLOB.all_huds)
|
|
if(hud?.hudusers[src])
|
|
for(var/atom/A in hud.hudatoms)
|
|
hud.add_to_single_hud(src, A)
|
|
|
|
/mob/dead/new_player/reload_huds()
|
|
return
|
|
|
|
/mob/proc/add_click_catcher()
|
|
client.screen += client.void
|
|
|
|
/mob/dead/new_player/add_click_catcher()
|
|
return
|