Files
Bubberstation/code/modules/mob/dead/dead.dm
John Willard a15a1b88ed Basic mobs now use z-level turnoff instead of simple (#82469)
## About The Pull Request

On one compile of MetaStation, I saw that there's 45 basic mobs on the
station, 256 on lavaland (the number growing from tendrils), and 59 in
all other z levels combined.

While we do expect Lavaland to be visited every round, at least it won't
be running during the times when no one is there, but even more
importantly, space exploration is something not done every round, so we
don't have any reason to waste our resources on AIs that will never be
interacted with.

Simple animals had an easy solution to this:
If no one is on the Z level, their AI turns off
If someone is on the Z level, they are idle unless needed.

The last simple animals that exists right now are bots, megafauna,
geese, gondolas, and some minor ones like mimic, zombie, dark wizard,
soulscythe, etc.
Point is, we're very much nearly done going through all simple animals,
so this code is being wasted just to ensure things like cleanbots won't
work if no one is on the z level, something I doubt happens often, so I
took their code and made it work for basic mobs instead. I could've done
both but I thought it would look very bad, and maybe this is a good
incentivize to get more basic mob conversions.

There's one major change here and it's that we're missing the "Idle"
mode, some basic mobs like the Lavaland village seems to be made with
intent that they'll be running even if players aren't around, so this
sets up a future PR that makes idle AI easier to add, and I want to make
sure those cases are taken into account.

## Why It's Good For The Game

We don't need to always be processing these basic mobs, and sets us in
the future to hopefully also implement idle AIs.

## Changelog

🆑
balance: Basic mob AIs with no mobs on the Z level now stop.
/🆑

---------

Co-authored-by: san7890 <the@san7890.com>
2024-04-06 15:17:53 -06:00

126 lines
3.3 KiB
Plaintext

//Dead mobs can exist whenever. This is needful
INITIALIZE_IMMEDIATE(/mob/dead)
/mob/dead
sight = SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF
move_resist = INFINITY
throwforce = 0
/mob/dead/Initialize(mapload)
SHOULD_CALL_PARENT(FALSE)
if(flags_1 & INITIALIZED_1)
stack_trace("Warning: [src]([type]) initialized multiple times!")
flags_1 |= INITIALIZED_1
// Initial is non standard here, but ghosts move before they get here so it's needed. this is a cold path too so it's ok
SET_PLANE_IMPLICIT(src, initial(plane))
add_to_mob_list()
prepare_huds()
if(length(CONFIG_GET(keyed_list/cross_server)))
add_verb(src, /mob/dead/proc/server_hop)
set_focus(src)
become_hearing_sensitive()
log_mob_tag("TAG: [tag] CREATED: [key_name(src)] \[[src.type]\]")
return INITIALIZE_HINT_NORMAL
/mob/dead/canUseStorage()
return FALSE
/mob/dead/get_status_tab_items()
. = ..()
if(SSticker.HasRoundStarted())
return
var/time_remaining = SSticker.GetTimeLeft()
if(time_remaining > 0)
. += "Time To Start: [round(time_remaining/10)]s"
else if(time_remaining == -10)
. += "Time To Start: DELAYED"
else
. += "Time To Start: SOON"
. += "Players: [LAZYLEN(GLOB.clients)]"
if(client.holder)
. += "Players Ready: [SSticker.totalPlayersReady]"
. += "Admins Ready: [SSticker.total_admins_ready] / [length(GLOB.admins)]"
#define SERVER_HOPPER_TRAIT "server_hopper"
/mob/dead/proc/server_hop()
set category = "OOC"
set name = "Server Hop"
set desc= "Jump to the other server"
if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) // in case the round is ending and a cinematic is already playing we don't wanna clash with that (yes i know)
return
var/list/our_id = CONFIG_GET(string/cross_comms_name)
var/list/csa = CONFIG_GET(keyed_list/cross_server) - our_id
var/pick
switch(length(csa))
if(0)
remove_verb(src, /mob/dead/proc/server_hop)
to_chat(src, span_notice("Server Hop has been disabled."))
if(1)
pick = csa[1]
else
pick = tgui_input_list(src, "Server to jump to", "Server Hop", csa)
if(isnull(pick))
return
var/addr = csa[pick]
if(tgui_alert(usr, "Jump to server [pick] ([addr])?", "Server Hop", list("Yes", "No")) != "Yes")
return
var/client/C = client
to_chat(C, span_notice("Sending you to [pick]."))
new /atom/movable/screen/splash(null, null, C)
ADD_TRAIT(src, TRAIT_NO_TRANSFORM, SERVER_HOPPER_TRAIT)
sleep(2.9 SECONDS) //let the animation play
REMOVE_TRAIT(src, TRAIT_NO_TRANSFORM, SERVER_HOPPER_TRAIT)
if(!C)
return
winset(src, null, "command=.options") //other wise the user never knows if byond is downloading resources
C << link("[addr]")
#undef SERVER_HOPPER_TRAIT
/**
* updates the Z level for dead players
* If they don't have a new z, we'll keep the old one, preventing bugs from ghosting and re-entering, among others
*/
/mob/dead/proc/update_z(new_z)
if(registered_z == new_z)
return
if(registered_z)
SSmobs.dead_players_by_zlevel[registered_z] -= src
if(isnull(client))
registered_z = null
return
registered_z = new_z
SSmobs.dead_players_by_zlevel[new_z] += src
/mob/dead/Login()
. = ..()
if(!. || !client)
return FALSE
var/turf/T = get_turf(src)
if (isturf(T))
update_z(T.z)
/mob/dead/auto_deadmin_on_login()
return
/mob/dead/Logout()
update_z(null)
return ..()
/mob/dead/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents)
..()
update_z(new_turf?.z)