* CARGONIA THE FREE: The Quartermaster is now a head of staff. (#67518)
* The Quartermaster is officially a head of staff, with new accesses, a silver ID, ect ect.
* The HoP lost their cargo-related equipment and access, including the Vault monitor, and frequency.
* wew
Co-authored-by: Iamgoofball <iamgoofball@gmail.com>
Co-authored-by: Gandalf <9026500+Gandalf2k15@users.noreply.github.com>
* Fixes / makes it more clear about why research servers might not be generating research points. (#67458)
* Fixes research severs a bit, adds text for missing hard drives, and removes a ton of unused code.
* Fixes / makes it more clear about why research servers might not be generating research points. Also cuts a lot of unused research server code out.
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
* Demotes the Quartermaster from Head to Normal Staffer(because /tg/ is making the QM a head upstream and we want to avoid conflicts)
* whoops
* a
* fug
* fuck
* Assorted Ordnance Code+Map Quality Pass and QoL (#67097)
Three main things I do:
Reinforce the remap that i have made with code changes, making the atmos control devices sane and easy to put if someone else stumbles upon this part of the code again. (a4aea1e - f16e620)
Splits the ordnance areas and renames them, kills ordnance misc and things that have nothing to do with ordnance (anymore?) moves them to exp_lab (useful stuff here) and aux_lab (fluff stuff here like laser range in delta or second circuit lab in tram). (0c99f9f- 3c82a88)
Adds a roundstart program disk containing nt frontier to the ordnance office table. Added a hint to file manager there too to help give players a nudge on how to publish papers. (fd747dc)
First one: Makes mapping these things not require varedit, nicer for other people that dont know how the atmos control stuffs works.
Second one: Misc lab has nothing to do with ordnance jesus christ. Also ord hallway is now irrelevant, our ordnance labs are very far from box now. Will probably make downstreams a bit angry for a while though since they might not be fully up to date on the ordnance maps.
Third one: Pretty much justified it in the about section.
Why is this not atomic: This touches all five maps and needs code backing, so I might as well combine them into one maintenance PR instead of giving my peers merge conflict three times.
* Assorted Ordnance Code+Map Quality Pass and QoL
* set 1
* revert
* Update CentCom_skyrat.dmm
Co-authored-by: vincentiusvin <54709710+vincentiusvin@users.noreply.github.com>
Co-authored-by: Zonespace <41448081+Zonespace27@users.noreply.github.com>
Co-authored-by: John Doe <gamingskeleton3@gmail.com>
Co-authored-by: Gandalf <9026500+Gandalf2k15@users.noreply.github.com>
* Adds logging to overlay overflow errors (#67497)
So we've got this overlay cap of like 100 right? Prevents OOMs
But right now if you overrun it we have no way of knowing how you got
there, so we just end up with no info.
This pr solves that, by adding a printout of icon-icon_state-dir =
amount for each apperance.
Note, we are basically cheating by typing these overlay members as
mutable apperance, they can be just normal appearances, which we don't
have an accessible type for. Fortunately we can cheat.
Oh and if you overflow the limit you get the error overlay applied to
you, for sniks
* Adds logging to overlay overflow errors
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
* Fixes map votes not happening when the ALLOW_MAP_VOTING config flag was disabled (#67394)
Fixes map votes not happening when allow map voting was disabled by config
* Fixes map votes not happening when the ALLOW_MAP_VOTING config flag was disabled
Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>
* 3(or 4) new traitor objectives (#67287)
This PR introduces 3 new kind of traitor objectives:
Eyesnatcher objective, you'll need to remove your victim's eyes by any means. You will be given a device that you can use to pull out someone's eyes after 3 5 second delays. This would be quite loud and painful to the victim, so make sure you got them restrained or knocked out.
"Public" Sleeper protocol - this is a high progression(30+ minutes) objective. It's basically Sleeper Protocol, but availible for everyone instead of only med personnel.
Locate Structural Weakpoint - a high progression(45+ minutes) objectives that can be only completed once. You will recieve a device that you'll need to use in 2 different (somewhat secure) areas in order to triangulate the structural weakpoint of the station, you'll need to stay in the area for 30 seconds and station AI will be alerted about your attempt. After triangulating it, you will be given a location-locked explosive which will also create from 5 to 8 minor explosions in a 17-25 tile area.
Kidnap personnel - Basically old contractor kidnap. Down someone, get them to the extraction location, call in a pod, stuff them into it and send it back. Additional TCs if you bring them alive.
* 3(or 4) new traitor objectives
Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com>
* Fixes simple animals getting stuck in ai lists (#67273)
DO NOT ADD US TO A LIST OF AI PROCESSING MOBS IF WE ARE QDELETING
hhhhhhhhhhhhhhhhhhh
Oh also lets add more deets to the warning, and upgrade it to an error
I want to actually have to fix these, or just remove them if they become
redundant
* Fixes simple animals getting stuck in ai lists
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
* improves SM cascade performances and fixes announcement text (#67240)
Changes the cascade walls from turfs to objects to improve the performances of the roundending cascade.
The issue was that ChangeTurf() was a pretty expensive proc to be called that many times so i moved the cascade wall into an object. It doesn't delete anything other than living mobs and the portal to prevent edge case runtimes.
Plus remove a span_bold() from the announcement text since it wasn't making the text bold but was leaving behind
* improves SM cascade performances and fixes announcement text
Co-authored-by: Ghilker <42839747+Ghilker@users.noreply.github.com>
* [MDB IGNORE] More /area/ typepath organization and cleanup (#67107)
This further continues what I did in b4fb8f3ed1 (but instead of just stations, its now every (most) applicable area in the game
* [MDB IGNORE] More /area/ typepath organization and cleanup
* wew
* e
* Update CentCom_skyrat.dmm
* wew
* ews
Co-authored-by: Jolly <70232195+Jolly-66@users.noreply.github.com>
Co-authored-by: Gandalf <9026500+Gandalf2k15@users.noreply.github.com>
* ports moveloop comparison from bee(and fixes goliaths not chasing people) (#67145)
This is a port of my PR from the beestation downstream BeeStation/BeeStation-Hornet#6845.
This basically adds a proc that will check if the arguments forwarded to generate the new moveloop are identical with the ones on maybe an old loop before it allows it to overwrite it that way we won't endlessly make new loops and destroy old ones even trough there is no reason to.
closes#64510 (Goliaths don't move after you shoot them)
Now the reason why this fixes goliaths chasing others is because goliaths have a movement delay of like 4 seconds enough time for the proc adding the moveloop to chase the target to fire again and add a new moveloop with the same arguments basically overwriting the old moveloop before that one could move the goliath even once this then basically resets the timer for the goliath to move and this goes on pretty much forever the only times the goliath can move is if lag somehow allows the moveloop to move the parent atom before it can get overwritten again (very rare but happened like once during testing).
Now my PR simply stops new identical moveloops (identical in terms of arguments) to get created and to overwrite old moveloops and thus allows the moveloop to continue normally and actually fire for goliaths.
stops unnecessary moveloop datums from beeing created and also fixes a bug as a bonus
* ports moveloop comparison from bee(and fixes goliaths not chasing people)
Co-authored-by: MNarath <47279840+MNarath1@users.noreply.github.com>
* [NO GBP] Jetpack and spacedrift: Fixes and niceties (#66628)
* Jetpack and spacedrift: Fixes and niceties
Ok so when I ported spacemovement onto movement loop,
I neglected to port this behavior that existed to support jetpacks.
Basically, if something that lets you move while spacedrifing
completes a move while you're spacedrifting, the
drift should "disable" to let it complete, and then later restart.
I neglected to add support for that, so that's what this does.
There's some other stuff going on here, mostly things to let jetpacks
ignore some of drift's extra behavior, since when a jetpack is not on
stablized, we want both to coexist.
It's a bit of a mess, I'm sorry about that.
Oh and at temporal's suggestion I've moved the visual_delay set from
newtonian move to an istype on the drift component, that was a good
idea, thanks quiet
* Makes dropping a pull while drifting carry the momentum into the pulled thing\
* Adds some extra context to Process_Spacemove, fixes a bunch of stupid
space bugs
It used to be, if you called Process_Spacemove with a direction, it
assumed you were an "action", so a client or mob trying to move in a
direction.
Unfortuantely for it, I needed to be able to use direction to make mob
pull drifting work. So we now actually pass in a second variable
called continuous_move, which tracks if this Process_Spacemove is on
behalf of a continuous move or not
In addition to this, I've added logic to bumping "off" someone to
prevent backbumping if that makes sense, since the bump is in the form
of a newtonian move that's run before the thing that's bumping actually
moves, we need some way to exclude it from holding the other object in
place.
* Adds a jetpack component, uses it to unify all three versions of
jetpacking
I hate you fikou
There were three copies of the same behavior, which made it hard to fix
stuff. Let's just componentize it
* Fixes jetpacks stabalizing even without fuel
This is mildly hacky. The real fix is to do this with events, but I
really don't wanna bend my brain like that. This'll do
* Ensures turn_off always has a user)
* Shut pu
* Bulky drags no longer effect your movespeed in space, fixing a consistency issue between them and all other forms of drags
* Removes some redundant code, cleans up some messy stuff
* Removes redundant safety checking from jetpack code
* see above
* Removes redundant signals
* [NO GBP] Jetpack and spacedrift: Fixes and niceties
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
* updates documentation for how the oranges_ear mob optimization works (#67056)
fixes documentation for how the oranges_ear mob optimization works
* updates documentation for how the oranges_ear mob optimization works
Co-authored-by: Kylerace <kylerlumpkin1@gmail.com>
* Adds more instructions on finding Active Turfs (#66959)
Hey there,
That little portion that says (debug verbs required) is not helpful at all to anyone who isn't already familiar with the aforementioned debug verbs. It's a pretty buried feature in the codebase as of this PR, so I think it's best to add some more verbosity on actually getting these debug verbs enabled.
Escaping newlines seems to work with logging without any noted downsides, helps readability if it's not all smashed on that one line.
* Adds more instructions on finding Active Turfs in Map Errors Logging
Co-authored-by: san7890 <the@san7890.com>
* fix delimber anomaly making not being made in refinery (#66835)
* fix delimber anomaly in refinery
* fix delimber anomaly making in refinery
Co-authored-by: Ghilker <42839747+Ghilker@users.noreply.github.com>
* improve speed of cascade walls, better description for them + CL for cascade antag (#66800)
Cascade walls were processing on object subsystem, they are now in their own subsystem that ticks once per second and should be more reliable even in case of high td
better description for the walls to be more interesting
* improve speed of cascade walls, better description for them + CL for cascade antag
Co-authored-by: Ghilker <42839747+Ghilker@users.noreply.github.com>
* Supermatter Cascades are not Universe-Destroying Events (#66804)
* Supermatter Cascades are not Universe-Destroying Events
Co-authored-by: Y0SH1M4S73R <legoboyo@earthlink.net>
* Revert "Add stamped requisition forms now give bonus credits (#66230)" (#66851)
This reverts commit f021767645.
This reverts commit f021767 from:
Add stamped requisition forms now give bonus credits #66230
This bug was encountered when we were testing this PR but I thought it got fixed.
Why It's Good For The Game
Cargo crates will now reappear.
* Revert "Add stamped requisition forms now give bonus credits (#66230)"
Co-authored-by: Tim <timothymtorres@gmail.com>
* Ventcrawling improvements, performance and visual (#66709)
* Initial pipecrawl work
Ok so pipecrawl images were updating EVERY TIME YOU MOVED
This was not good mojo
What I've done here is twofold
First, I ensured pipecrawl updates only when the net changes. This
breaks the current implementation, but I intend on fixing that
Second, I moved our method of getting pipes to the spatial grid
This isn't that great at the moment, but I intend on adding support for
tracking entered/exited cells, which should make this much better
* Much faster pipecrawling processing, niceties
Adds a concept called a cell tracker datum.
It manages a list of cells a passed in bound is "inside", and when
queried will return a list of new cells, and old cells.
Because we only really care about maintaining an absolute window of
"CELLS WE ARE IN" and less about always removing cells we're not in, we
can manage a second window to prevent moving up and down on a cell line
causing a ton of updates.
Uses this concept to optimize pipecrawling significantly, from 3ms per
call before to roughly 0.03ms per call.
Also moves pipecrawl images to their own plane, so they don't overlap ui
elements
* Pipecrawling effects niceties, direction help
You can now move in more then one direction when pipecrawling
This works as expected, if you hold up and left, move up for a while,
and come to a fork, you'll go left
Added some effects to pipecrawling. It'll darken the lighting plane
slightly, so you get a nice effect instead of just fullbright.
Also added a color matrix and drop shadow to the pipe images, this way
they stand out a bit more.
You now glide between pipe moves, rather then moving instantly. This
doesn't effect your actual move rate, but it no longer feels jittery
with say, 60fps
* Bounds
* Fixes runtimes, cache something somethign sonic speed
* Reworks how being interested in the spatial grid is tracked
Rather then checking multiple variables on the atom to consider, we
instead check for the existence of a string key.
This key is used by a list on the spatial grid subsystem to retrive a
cached list of all of the atoms "types"
Doing this requires doing a bit of extra work in
important_recursive_contents code, but it allows us to separate being a
part of the spatial grid from using important recursive contents, which
is very nice.
As a consequence, I've had to unroll some lazylist macros in important
recursive contents logic. It's not ""that"" bad but it's not great
either.
Oh and this adds a slight cost to enter/exit cell, but it's minimal.
Basically, rather then checking for different features of a grid member,
we just iterate the list their string key points to. Very handy
So there's an added cost of a list copy and all, but we save the
headache of more types technically increasing the cost of
addition/removal.
I also made adding/removing from the grid into one "pulbic" proc rather then two
different ones for each operation, because it was starting to get silly
* waaa waa it doesn't compile
* chord -> coord
* Ensures important_recursive_contents is actually emptied on removal
* Removes soul
* Kyler's review
Co-authored-by: Kylerace <kylerlumpkin1@ gmail.com>
* Kyler's review 2
Co-authored-by: Kylerace <kylerlumpkin1@ gmail.com>
* Kyler's review 3
Moves some procs around, improves some documentation, catches a few
small issues
Co-authored-by: Kylerace <kylerlumpkin1@ gmail.com>
* Ventcrawling improvements, performance and visual
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
Co-authored-by: Kylerace <kylerlumpkin1@ gmail.com>
* Makes smoke and foam attempt to fill the available space.
* wew
* reset
* Revert "reset"
This reverts commit 75be4f934504793ceb5c9bf2f3774dc24517df5a.
Co-authored-by: TemporalOroboros <TemporalOroboros@gmail.com>
Co-authored-by: Gandalf <9026500+Gandalf2k15@users.noreply.github.com>
* Refactors firestacks into status effects (#66573)
This PR refactors firestacks into two status effects: fire_stacks, which behave like normal firestacks you have right now, and wet_stacks, which are your negative fire stacks right now. This allows for custom fires with custom behaviors and icons to be made.
Some fire related is moved away from species(what the fuck was it even doing there) into these as well.
Oh and I fixed the bug where monkeys on fire had a human fire overlay, why wasn't this fixed already, it's like ancient.
Also changed some related proc names to be snake_case like everything should be.
This allows for custom fire types with custom behaviours, like freezing freon fire or radioactive tritium fire. Removing vars from living and moving them to status effects for modularity is also good.
Nothing to argue about since there's nothing player-facing
* Hud Image Culling By Z Level: Theft edition (#65189)
* makes hud images only apply by z level
* makes some of the atom_hud procs have better names
* fixes warning with the hud_user list and adds better documentation
* better docs for hud_images
* removes TODOs
* docs for hud_list
* adds support for linked z levels so mobs can see lower ones
* fixes merge conflict and shittily makes only shocked airlocks get added
* adds support for setting images in the hud as active and inactive
* gets rid of unatomic spatial grid change
* maybe i should actually try COMPILING my changes
* fixes merge skew and makes it compile again
* fixes huds refusing to remove from users who changed z level
* improves z level and registration logic
* fixes antag huds not appearing
* Fixes antag huds not properly setting. We now use hud_list in init, so it needs to be set before the new call, not after. Not sure why the use of appearance key was split like this, but none else knows either so none can stop me
* Ensures that hiding a basic appearance also hides the atom's active list too
* Fixes antag huds going poof
Ensures that remove_atom_from_hud will return false if the passed atom
isn't managed by it
This fixes antag huds disappearing randomly, since they assumed that if
the parent call of remove_atom_from_hud returned true, we should delete
ourselves. This is a safe assumption for them to make, since they should
only ever have one atom.
Does kinda bork if we call remove_atom_from_hud in a way that is unsure
if the passed atom is actually in that list. We were forced into doing
this by how atom huds use the qdeleting signal.
* makes basic alternate_appearance's only update themselves when setting their hud image to active and makes them not add themselves to the global huds_by_category list
* fixes mistake with hud_users list being set non associatively (bad)
* as anything in bot path loops
* Fixes merge skew problems
* Makes bot paths non global
This way they can show themselves to only the bot that "owns" them, ya
feel me?
* Fixes huds not showing up sometimes, cleans up some code
Post Kapu's limb refactor, we were calling prepare_huds twice in a human
init call chain. What was happening was this:
call prepare_huds() // Human
I gained a new hud image
I set active hud icons to mirror it
call prepare_huds() // Living
I overwrote the new hud image
I attempted to set active hud icons, which failed because it assumes
this can never happen
*cries*
* Renames add_hud_to_atom to show_to
My hope is this will make understanding hud code a bit easier, by tying
the behavior to a "verb" more closely. Also renamed a few vars
* remove_hud_from_mob -> hide_from
* Nitpicks a few comments
* Whoops/fuck/shit/damn it all/hhhhhhhhhhhh
* Moves check down, improves stack trace a bit
Co-authored-by: KylerAce <kylerlumpkin1@gmail.com>
* small touch-up
* this should do it
Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com>
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
Co-authored-by: KylerAce <kylerlumpkin1@gmail.com>
* [MDB IGNORE] You can have your cake and eat it too. Remake of #66406 (Splitting up areas.dmi + code related stuff) (#66726)
Areas.dmi right now houses all of our mapped turfs icons (which is roughly 400 icons). Not an issue, but it's incredibly large and clunky to navigate right now. This isn't an issue for the average coder and/or player code diving, but it is for mappers wanting to add new turfs. Currently, the file has some organization, but its still an overall mess. This PR aims to slice the behemoth with multiple .dmi files corresponding to specific areas.
I also plan to repath /area/* -> /area/station/* for station turf only. This is to clean it up, as most other turfs follow this format (that being /area/turf_zone/*).
I'm also writing an update paths file as I go along.
* fixbatch 1
* fug
Co-authored-by: Jolly <70232195+Jolly-66@users.noreply.github.com>
Co-authored-by: Gandalf <9026500+Gandalf2k15@users.noreply.github.com>
* Improper forced qdel cleanup, some expanded del all verbs (#66595)
* Removes all supurfolus uses of QDEL_HINT_LETMELIVE
This define exists to allow abstract, sturucturally important things to
opt out of being qdeleted.
It does not exist to be a "Immune to everything" get out of jail free
card.
We have systems for this, and it's not appropriate here.
This change is inherently breaking, because things might be improperly
qdeling these things. Those issues will need to be resolved in future,
as they pop up
* Changes all needless uses of COMSIG_PARENT_PREQDELETED
It exists for things that want to block the qdel. If that's not you,
don't use it
* Adds force and hard del verbs, for chip and break glass cases
respectively
The harddel verb comes with two options before it's run, to let you
tailor it to your level of fucked
* Damn you nova
Adds proper parent returns instead of . = ..()
Co-authored-by: Seth Scherer <supernovaa41@ gmx.com>
* Ensures immortality talismans cannot delete their human if something goes fuckey. Thanks ath/oro for pointing this out
Co-authored-by: Seth Scherer <supernovaa41@ gmx.com>
* Improper forced qdel cleanup, some expanded del all verbs
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
Co-authored-by: Seth Scherer <supernovaa41@ gmx.com>
So, unbeknownst to me, the refactor to ID cards and trims from a few months ago also changed how setting your payment department is handled. In that it doesn't, you COULDN'T change your payment department. Now, this made sense at the time because it wasn't a player facing change and I don't imagine that specific circumstance mattered to anyone whose played the game in the last few months. However, as a direct consequence of the changes to paychecks and economy, it made it so that going and getting a new job DIDN'T change your paycheck department, and prevented you from being able to meaningfully avoid the lathe tax by changing jobs, which was a clear part of the previous PR's intent.
The best way I could imagine to handle this was to have it compare against the job of the trim/id set and change that value on the job stored within the account on the ID, since we can now count on IDs always having a registered account.
Having a job change should ideally change the department that is paying you, and by making you a formal member of your department you can change who you get discounts from in the future.
Ideally, we should probably make this work on making your payment department adjusted within the card program and computer, but for the moment this is a serviceable middle ground since I'm already a bit out of my depth with regard to IDs/Trims/Cards.
Co-authored-by: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com>
Two things going on here.
First, a stupid clerical error I made in the dequeue_loop proc that
prevented loops from removing themselves from a queue.
This was easy to resolve.
Second and more complex.
pour_bucket makes this assumption that when it's done with a bucket, it
can just pop the first one that's sitting in the queue.
This is unfortunately not always true, because the bucket can be already
cleared by a dequeue_loop called under loop.process().
The fix for this is to do some sanity checking on the index and
bucket_time arguments.
It's not perfect, but a second assoc lookup and a length check isn't
that bad.
The alternative would be merging buckets and sorted_buckets into one
list, but that requires doing quite a few text2num calls on insertion,
which I am not a fan of.
Thank you to DamianX and MNarath1 for mentioning this issue, and discussing it with me
You guys are real cool
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
* Radiation.
Replaces radiation chance with radiation intensity on radiation pulses. Radiation intensity determines the chance of getting irradiated, and diminishes over range or getting blocked by objects.
Getting close to the radioactive source will give you a high chance to get irradiated, while being far but still in range will give you a low chance to get irradiated.
* I suck at spelling.
Balances some atmos related radiation stuff. Changes supermatter radiation stuff, though I would probably need to adjust the threshold to adjust for the new changes.
Calling radiation pulse without intensity parameter filled will now set the intensity to be the value where it will give an object a 5% chance to get irradiated from the max range of the pulse, assuming there are no objects between it that absorb radiation. The same will happen if you call radiation pulse without max range parameter filled.
Co-authored-by: Pickle-Coding <58013024+Pickle-Coding@users.noreply.github.com>
* Most materials can be used to build most things
* Fixes the merge conflict
* Makes it so our vis_overlay1 is initialized first. It's awful but it works
* Properly fixes the CI issues with the plasma airlocks
Co-authored-by: Y0SH1M4S73R <legoboyo@earthlink.net>
Co-authored-by: GoldenAlpharex <jerego1234@hotmail.com>
* Anomaly expansion - part 1 - Hallucination anomaly (#66392)
New anomaly, the hallucination anomaly. It has small bursts of hallucinations while alive followed by a big one in the moment of the end.
More anomalies are fun, i'm planning to add more of these
added the hallucination anomaly, spawnrate similar to the flux one, can spawn from the SM if eer are over 5000, can spawn when the SM delams (higher rate than the grav one), you can make the hallucination reactive armor
* Anomaly expansion - part 1 - Hallucination anomaly
* Update hud.dm
Co-authored-by: Ghilker <42839747+Ghilker@users.noreply.github.com>
Co-authored-by: Zonespace <41448081+Zonespace27@users.noreply.github.com>
* Adds MC initialization stages. Earlier stages can fire while later ones init. Fixes tgui chat reconnection banner showing during init. (#66473)
* Adds MC initialization stages. Earlier stages can fire while later ones init.
Removes TICK_LIMIT_MC_INIT config for barely doing anything to speed up init and being inconvenient to work with if fires and inits can happen at the same time.
* Adds MC initialization stages. Earlier stages can fire while later ones init. Fixes tgui chat reconnection banner showing during init.
Co-authored-by: Kyle Spier-Swenson <kyleshome@gmail.com>