* Removes redundant CID randomizer check (#76396)
## About The Pull Request
This check is redundant because 512 fixed the exploit it was designed to
check. Randomizers still exist, but this code doesn't apply to them
since they use a different method.
Someone else tried this before but got his shit slapped for it being his
first PR and there being a possibility he was removing it so he could
bypass it. I'm not banned and have no possible ulterior motives; I just
want to get rid of dead code.
## Why It's Good For The Game
I'd make an Old Yeller joke, but the code's already dead, so.
Fixes#43227
## Changelog
This is not a player-facing change.
* Removes redundant CID randomizer check
---------
Co-authored-by: Vekter <TheVekter@users.noreply.github.com>
Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>
* Moves ui references from the tgui subsystem to datums themselves (#76215)
## About The Pull Request
Unused vars have 0 memory cost, and the ref and list lookup here is
REALLY expensive, for both init and foam spreading.
## Why It's Good For The Game
Saves 0.2s off a station flood on meta, and 0.17s off init. More time in
other qdel heavy areas
Pulled off #76104 for the sake of cleanliness
* Moves ui references from the tgui subsystem to datums themselves
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>
* Optimizes timer insertion by 80% (W QDEL_IN micro) (#76214)
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->
## About The Pull Request
[Reduces timer insertion cost by
80%](c9e5b285ed)
Timer name generation involved a LOT of string shit, some in ways where
the string only existed for a moment.
This costs a good bit of time, and can be reduced with only minimal
impacts on the end product, so let's do that. Includes a compile flag to
flip it back if we ever have trouble in future.
This is about 0.1s off init, since we do a lot of timer stuff then too
[Removes STOPPABLE flag from QDEL_IN, moves it to a bespoke
macro](e7a5d7f2a7)
Its a waste most of the time, tho I would LOVE to analyze at compile
time to work out if we care
## Why It's Good For The Game
I like it when we don't spend all of our cpu time just setting the name
var on timers. that's good and not bad.
This saves time fucking everywhere. 15% off explosions, 0.1 seconds off
init, bunch of time off foam. it's just good.
Cherry picked out of #76104 since that was too cluttered (sannnnnn)
<!-- Argue for the merits of your changes and how they benefit the game,
especially if they are controversial and/or far reaching. If you can't
actually explain WHY what you are doing will improve the game, then it
probably isn't good for the game in the first place. -->
<!-- Both 🆑's are required for the changelog to work! You can put
your name to the right of the first 🆑 if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->
* Optimizes timer insertion by 80% (W QDEL_IN micro)
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
* Fully fixes atom init desyncs (#76179)
## About The Pull Request
The old system was... ok, but the stack trace was unfortuante, and the
potential to double remove was silly.
Let's use a list of source, value instead, to block overremovals and
properly support different load states
## Why It's Good For The Game
Prevents a bug a goodhearted bagilmin showed me where shuttles would
randomly just fail to load.
Calling clear twice should not be a failure
## Changelog
🆑
fix: Maps loaded post init will no longer randomly enter a failed state.
Hopefully.
/🆑
* Fully fixes atom init desyncs
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
* Fixes runtimes when tts is not enabled (#76178)
## About The Pull Request
I'm surprised none else got this already, constant null var reads
because the stack datum isn't created unless the subsystem is active.
Annoying
* Fixes runtimes when tts is not enabled
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
* Fix further/MetaStation (#76158)
## About The Pull Request
Typo fixes. Further and fixes MetaStation's default name to match the
JSON.
## Changelog
🆑 LT3
spellcheck: Fixed a few typos
/🆑
* Fix further/MetaStation
---------
Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>
* Always contracts lists when VVing GLOB (#76091)
## About The Pull Request
This takes render times from like 20 seconds to maybe 2 Most of the time
appears to be clientside rn, so the best we could do further would be
reducing the amount of shit that actually needs to render
So like, removing the E C M buttons (or at least adding a toggle to
render them), that sort of thing
## Why It's Good For The Game
A glob vv you can actually use

## Changelog
🆑
admin: VV for global vars will now load MUCH faster, in exchange lists
are now perma contracted in that particular pane
/🆑
* Always contracts lists when VVing GLOB
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
* Cannot use departmental budget cards as source of credit withdraw (#76113)
Currently you can put cargo's budget card into your PDA, go into NT Pay
and send over the budget to any pay token you want including yours. This
just adds a check to ensure you aren't using that kind of card as
withdrawal source.
* Cannot use departmental budget cards as source of credit withdraw
---------
Co-authored-by: Pepsilawn <reisenrui@gmail.com>
* Late adjustments to my previous move_loop PR. [NO GBP] (#75778)
## About The Pull Request
Lemon guy was a bit too late in reviewing #75732 because it got already
merged by someone else, and I too hadn't managed to make some adjustment
to that PR in time.
This PR applies suggested changes, turns a simple proc into a macro, and
makes it so that also waddling, squeaky shoes and swivel chair sounds
don't running when moved by conveyor belt.
This doesn't stop squeaking from happening when other
conveyor-belt-moved objects or mobs cross its tile. That'd be hacky and
I'm not here to fight sfx-spamming machines.
## Why It's Good For The Game
These are changes that should have been included in #75732 but couldn't.
See that PR for the general idea.
## Changelog
🆑
fix: waddling, squeaky shoes and swivel chair sound effects no longer
run when moved by conveyor belt.
/🆑
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@ users.noreply.github.com>
* Late adjustments to my previous move_loop PR. [NO GBP]
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@ users.noreply.github.com>
* Being moved around by conveyor belt or tram no longer plays footsteps and wheelchair sounds. (#75732)
## About The Pull Request
More or less a triviality, currently footstep/wheelchai sounds are
played even when the mob is moved by a conveyor belt, or riding the
tram. This PR puts an end to that.
To clarify, this doesn't stop these sounds from being played if you're
walking/running/rolling along or against a belt, or inside the tram.
But more than that, I made this PR because, afaik, we don't have a good
way to tell if a given movement proc chain was caused by a move loop or
not, and I need one for something I'm working on. This is more of an
implementation and reason for this PR to be made.
Tested, no issue. Waiting for a review, specially from @ LemonInTheDark,
since they're the mind behind the movement loop code. Hopefully I'm
right saying what I said.
## Why It's Good For The Game
This fixes a consistency issue (if it can be called such) and the lack
of a simple way to tell if a movable is being moved by a move loop
outside of its own code.
## Changelog
🆑
fix: Being moved around by conveyor belt or tram no longer play
footsteps and wheelchair sounds.
/🆑
* Being moved around by conveyor belt or tram no longer plays footsteps and wheelchair sounds.
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
* Cleans up/renames as private some internal var definitions, removes some fucked uses of internal list vars (#75769)
## About The Pull Request
[Improves the documentation of DCS lists, removes old list of callback
docs that no longer
apply](c3821d9f5f)
[Adds a second signal register to decal rotating, adds a trait to
objects under a tile. STOP DIRECTLY READING HIDDEN LISTS I SWEAR TO
GOD](6b3f97a76a)
[Removes direct reads of the timer list, they were redundant
mostly](14fcd9f8a6)
[Please stop directly reading/modifying the traits list to ensure your
dna rot follows the
brain](ec0e5237ec)
[Marks internal datum lists as well internal with
_](57c6577ff6)
[57c6577](57c6577ff6)
Does the same to _clear_signal_refs() in hopes of keeping people from
touching it
## Why It's Good For The Game
They pissed me off.
Users should not be touching these lists, especially in ways that make
assumptions about their structure and are thus prone to breaking if that
ever changes.
Most of these are close to zero cost changes, using a wrapper to solve
the problem, or just yeeting it
Two aren't, Decals with a direction have gained a second signal register
on init, and things that sit underfloor (cables/pipes) now get a trait
when inserted there.
This should have a minimal impact on memory/init time, bugging
@ Mothblocks about it just in case
* Cleans up/renames as private some internal var definitions, removes some fucked uses of internal list vars
* fix
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
Co-authored-by: ghost sheep <sheepwiththemask@gmail.com>
* Moves SSGarbage over to uid softref verification so refid reuses don't cause issues (#75600)
Before, long ago, if a `\ref` was reused on something that was deleted
the same tick, the old associated list based queue would cause the new
item to "override" the old one, keeping the list from duplicating.
To make ssgarbage faster, we moved the queue to a normal list of lists
some time ago, but now if something qdeletes, gcs, then something gets
assigned that same `\ref`id, then that thing also gets deleted, all
within the same tick, it will attempt to hard delete it multiple times
needlessly because it doesn't detect the ref reuse.
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@ users.noreply.github.com>
* Moves SSGarbage over to uid softref verification so refid reuses don't cause issues
---------
Co-authored-by: Kyle Spier-Swenson <kyleshome@gmail.com>
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@ users.noreply.github.com>
Quietens Spaceman when debugging UNIT_TESTS locally (#75570)
The contract is removed by virtue of testing.
Co-authored-by: Jordan Dominion <Cyberboss@users.noreply.github.com>
* Reverts qdel logging to a raw text file (#75632)
## About The Pull Request
We log this information once, on SSgarbage shutdown. Putting it in a
json is kinda pointless, it exists to be read when we see massive
overtime from ssgarbage, that's all.
Something something reee my workflow.
## Changelog
🆑
server: qdel statistics are once again logged in qdel.log, instead of
the otherwise typical json logging system
/🆑
* Converts del logging to proper json, using json objects instead of building a text file (#75636)
## About The Pull Request
It's easier to parse, and makes more sense when you read it. This way
I'll never have to add yet another case to my parser for someone
changing where a space goes or something.
Moves qdel into its own category cause the old name looked ugly (yell if
this is dumb)
Added a bitfield to entries pulled from categories, adds a new flag that
enables pretty printing json lists.
## Why It's Good For The Game
IMPROVES my workflow
## Changelog
🆑
server: del logging is now done by outputting to a json file again, but
this time we're using ACTUAL json and not just a big text string with
newlines and shit
/🆑
---------
Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com>
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com>
* fixes contents not being removed from the spatial grid when deleted during movement between 2 grid cells (#75658)
## About The Pull Request
fixes the flaky test reports for cockroaches being stuck in the spatial
grid (which mothblocks seems to have closed all of)
cockroaches get deleted when they die, so theres a spurious unit test
failure where if a cockroach is on a tile in grid cell A and moves to a
lava tile in grid cell B, they will get killed when lava.Entered() is
called, then deleted, and when /atom/movable/Destroy() is called we try
to take them out of grid cell B (because their loc is the lava tile) but
they were never added to that cell yet because their movement never
finished, so that doesnt do anything. THEN moveToNullspace() is called,
that movement finishes before the first movement, and then in
Moved(old_loc = lava turf) we try to remove it from grid cell B which
again doesnt work, and then the first movements Moved(old_loc = original
turf) is called where we can actually remove them from the correct grid
cell, except we cant because in exit_cell() we subtract
`old_target.important_recursive_contents[channel]` from the cells
content lists, and since the target is deleted by this point it doesnt
have important_recursive_contents. so the fix here is changing this so
it subtracts `old_target.important_recursive_contents?[type] ||
old_target` instead, which works if the target is deleted.
also fixes some Entered() overrides that dont call parent and improves
documentation on spatial grid defines
## Why It's Good For The Game
fixes it without needing the change_loc() setter
* fixes contents not being removed from the spatial grid when deleted during movement between 2 grid cells
---------
Co-authored-by: Kylerace <kylerlumpkin1@gmail.com>
* Fixes moveloop shit (#75675)
## About The Pull Request
I was using the step_x procs when I should have been using get_step_x
and Move()
This was causing some mob behavior to not properly respect things like
gravity or potentially entered/exited signals.
Also ensures we pass direction into Move consistently, and deletes a
function that was meant to like, use step_to but with directions? Was
never actually used properly
I forgot to properly respect the "don't change dir" flag
Closes#75673🆑
fix: Mobs will fly around space... less
/🆑
* Fixes moveloop shit
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
* Fix very common smoothing groups runtime by deferring icon smoothing until all atom initializations are complete (#75444)
## About The Pull Request
Fixes the "bad index" runtime that shows up on 80% of rounds.

The issue is that during dynamic maploading, the initialization of
objects is split over several ticks. However, before the initialization
is complete, an object's smoothing groups is still in its string form
(as per [the smoothing group
optimizations](https://github.com/tgstation/tgstation/pull/71989)).
Thus, code later down the line attempts to read from this string, and
errors.
It would be expensive to check all nearby neighbors every time in any
place in this code, so instead we defer icon smoothing if there are any
initializations currently in progress. Because this only happens for
dynamic loading, the stuff being loaded dynamically is usually small,
and icon smoothing already has a somewhat visible delay for shuttles,
this delay doesn't matter.
## Changelog
🆑
fix: Fixed an issue where objects on something that loaded dynamically,
like shuttles, would not be smoothed.
/🆑
* Fix very common smoothing groups runtime by deferring icon smoothing until all atom initializations are complete
---------
Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
* Fix Basic Mob Speed (#75306)
## About The Pull Request
All basic mobs became slower because of #75186. This fixes that.
## Why It's Good For The Game
Intended speed.
## Changelog
🆑
fix: Fixes the speed of all basic mobs.
/🆑
* Fix Basic Mob Speed
---------
Co-authored-by: Comxy <tijntensen@gmail.com>
* fix: Basic mobs' multiplicative movespeed (#75186)
## About The Pull Request
Adds default multiplicative movespeed for basic mobs, so their speed is
configurable via config.
## Why It's Good For The Game
Closing things which were probably missed in the development of basic
mobs
## Changelog
🆑
code: Adds default multiplicative movespeed for basic mobs, to make them
editable in config
config: Default multiplicative movespeed for basic mobs in example
config
/🆑
* fix: Basic mobs' multiplicative movespeed
---------
Co-authored-by: larentoun <31931237+larentoun@users.noreply.github.com>
* adds an error message to movables not being removed from the grid... again (#75161)
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
## About The Pull Request
I swear i didnt fail at this like 3 times i tested it this time.
adds a descriptive error of what spatial grid cells a movable is stuck
in, and in what channels. This only runs during unit tests. hopefully
this should be enough information to go off of to fix the spurious
cockroach error. if its not then i can try tracking all grid cell
changes during unit tests.
error looks like this:
```
[2023-05-03 04:16:34.009] runtime error: /mob/living/trolls_the_maintainer instance, which is in nullspace, and thus not be within the contents of any spatial grid cell, was in the contents of 2 spatial grid cells when it was only supposed to be in one! within the contents of the following cells: {(221, 119, 11), within channels: hearing}, {coords: (136, 136, 14), within channels: hearing}. (code/controllers/subsystem/spatial_gridmap.dm:581)
```
for something located in nullspace but still in the contents of >0 cells
and:
```
runtime error: /mob/living/trolls_the_maintainer instance, which is supposed to only be in the contents of a spatial grid cell at coords: (136, 136, 14), was in the contents of 6 spatial grid cells when it was only supposed to be in one! within the contents of the following cells: {(68, 153, 2), within channels: hearing}, {coords: (221, 170, 3), within channels: hearing}, {coords: (255, 153, 11), within channels: hearing}, {coords: (170, 238, 13), within channels: hearing}, {coords: (204, 119, 14), within channels: hearing}, {coords: (136, 136, 14), within channels: hearing}.
```
if its not in nullspace but its within more than 1 grid cell.
the coordinates here are translated from the index of the given cell to
world coordinates.
## Why It's Good For The Game
mothblocks has been standing outside my house for weeks i am fearing for
my life
---------
Co-authored-by: Mothblocks <35135081+Mothblocks@ users.noreply.github.com>
* adds an error message to movables not being removed from the grid... again
---------
Co-authored-by: Kylerace <kylerlumpkin1@gmail.com>
Co-authored-by: Mothblocks <35135081+Mothblocks@ users.noreply.github.com>
* RUNLEVEL_INIT does not exist (#75023)
This define shouldn't have been added (by me when I created runlevels)
people get it confused with RUNLEVEL_LOBBY and misuse it, like in this
verb subsystem I have no knowledge of.
- Removes RUNLEVEL_INIT.
- Fixed SSverb_manager not running during the lobby phase.
- Fixed Master.SetRunLevel having the potential to accept a scuffed
runlevel.
- Other standardizing cleanups to runlevels usage.
* RUNLEVEL_INIT does not exist
---------
Co-authored-by: Jordan Dominion <Cyberboss@users.noreply.github.com>
* Allows Export of your Preferences JSON File (#75014)
## About The Pull Request
Hey there,
This was spoken about in #70492 (specifically
https://github.com/tgstation/tgstation/pull/70492#issuecomment-1278069607),
and I have been waiting for this to be implemented for some time. It
never got implemented, so I decided to code it myself.
Basically, **if the server host doesn't disable it**, you are free to
export your JSONs as a player, right from the stat-panel. It's a pretty
JSON on 515 versions, too!
It's right here:

Here's what the prettified JSON looks like on 515.

There's a cooldown (default to 10 seconds) between exporting your
preferences.
#### Why is this config?
It's because in the past, a server host could always just file-share the
.sav or .json or whatever to the player, but they would have to do the
explicit option of actually bothering to make the files accessible to
the player. In that same line of logic, the server operator will have to
explicitly make the files accessible. This is mostly because I'm not
sure how good `ftp()` is at being a player function and wanted to have
some sort of cap/control somehow in case an exploit vector is detected
or it's just plain spammed by bots, so we'll just leave it up to the
direct providers of this data to elect if they wish to provide the data
or not.
## Why It's Good For The Game
Players don't have to log into Server A to remember what hairstyle they
loved using when they want to swap to Server B! That's amazing actually.
I always forget what ponytail my character has, and it'll be nice to
have the hairstyle in a readily accessible place (after I prettify the
JSON for myself).
It's also more convenient for server hosts to make player data like this
accessible if they really want to, too.
If we ever add an _import_ feature in the future (which would have to be
done with a LOT of care), this will also be useful. I wouldn't advise it
though having taken a precursory look at how much goes into it while
trying to ascertain the scope of this PR.
## Changelog
🆑
qol: The game now supports export of your preferences into a JSON file!
The verb (export-preferences) should now be available in the OOC tab of
your stat-panel if enabled by server operators.
server: Exporting player preferences is controlled by a configuration
option, 'FORBID_PREFERENCES_EXPORT'. If you do not wish to let clients
access the ftp() function to their own preferences file (probably for
bandwidth reasons?) you should uncomment this or add it to your config
somehow.
config: Server operators are also able to set the cooldown between
requests to download the JSON Preferences file via the
'SECONDS_COOLDOWN_FOR_PREFERENCES_EXPORT' config option.
/🆑
* Allows Export of your Preferences JSON File
---------
Co-authored-by: san7890 <the@san7890.com>
* [MIRROR] Corrects record_feedback()'s copy/paste comment [MDB IGNORE] (#20777)
* Corrects record_feedback()'s copy/paste comment (#74962)
## About The Pull Request
Corrects `record_feedback()`'s copy/paste comment.
## Pointless history
Originally being added in e2a8a5e, it kept its name and args for quite a
few years, that was until #32188 which had it renamed to
`record_feedback` and its args pretty much doubled. In between these
times the known copy/paste comment was already around, but that wasn't
updated, until now apparently.
* Corrects record_feedback()'s copy/paste comment
---------
Co-authored-by: Zandario <zandarioh@ gmail.com>
* social anxiety is incompatible with mute
* Just so it's more accurate to the mirror
---------
Co-authored-by: Zandario <zandarioh@ gmail.com>
Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>
Co-authored-by: GoldenAlpharex <jerego1234@hotmail.com>
1. automatically adds access requirement to description of every supply
crate
2. also adds access_view to the automatic system, which previously was
not visible
1. better code
2. now you can see what access you need to privately purchase a crate
from the supply console.
🆑
code: The access requirements at the end of supply crate descriptions
are now automatically generated
fix: Supply console now tells you what access each crate needs to be
privately purchased
/🆑
Co-authored-by: BlueMemesauce <47338680+BlueMemesauce@users.noreply.github.com>