* Replaces `/obj::` -> `parent_type::` (#81146)
## About The Pull Request
This just seemed like a minor error with the new syntax that popped up:
The intent of these seem to be "take our obj flags and add
`NO_DECONSTRUCTION` to it", which was perfectly serviceable in a
majority of places, as the parent type had the same obj flags as `/obj`.
But in a small handfull of places (such as any table subtypes) this was
not the case, and it caused some objects to have missing flags that they
were otherwise intended(?) to inherit.
So I replaced `/obj::` with `parent_type::` meaning rather than using
the base obj flags and then adding `NO_DECONSTRUCTION`, they use their
parent type's obj flags and then add `NO_DECONSTRUCTION`.
## Changelog
🆑 Melbert
fix: You can build on some niche tables again, such as the Wabbajack
Altar.
/🆑
* Replaces `/obj::` -> `parent_type::`
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
* Emergency shuttle console only works on the shuttle (#81123)
## About The Pull Request
Fixes https://github.com/tgstation/tgstation/issues/79067 where you can
hijack the shuttle without actually being on the shuttle.
## Changelog
🆑 LT3
fix: Emergency shuttle console now only works while on the emergency
shuttle
/🆑
* Emergency shuttle console only works on the shuttle
---------
Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>
* split area.contained_turfs up by zlevel, make init 10 seconds faster (#80941)
## About The Pull Request
Situation: areas have a list of all turfs in their area.
Problem: `/area/space` is an area and has a 6 to 7 digit count of turfs
that has to be traversed for every turf we need to remove from it. This
can take multiple byond ticks just to preform this action for a single
space rune
Solution: split the list by zlevel, and only search the right zlevel
list when removing turfs from areas.
replaces `area.get_contained_turfs()` with a few new procs:
* `get_highest_zlevel()` - returns the highest zlevel the area contains
turfs in. useful for use with `get_turfs_by_zlevel`
* `get_turfs_by_zlevel(zlevel)` - returns a list of turfs in the area in
a given zlevel. Useful for code that only cares about a specific zlevel
or changes behavior based on zlevel like lighting init.
* `get_turfs_from_all_zlevels()` - the replacement for
`get_contained_turfs()`, renamed as such so anybody copying/cargo
culting code gets a hint that a zlevel specific version might exist.
Still used in for loops that type checked so byond would do that all at
once
* `get_zlevel_turf_lists()` - returns the area's zlevel lists of lists
but only for non-empty zlevels. very useful for for loops.
The area contents unit test has been rewritten to ensure any improper
data triggers failures or runtimes by not having it use the helpers
above (some of which ensure a list is always returned) and access the
lists directly.
* split area.contained_turfs up by zlevel, make init 10 seconds faster
* eeyes
* Update area_spawn_subsystem.dm
* Unshits turf contain code slightly (#81023)
Literally just implements my reviews from #80941
I am frankly a smidge pissed that the pr was merged without them being
handled. No code is worth merging past known issues, and if the author
is just gonna dip then that's life.
I don't like privileging mso on stuff like this, especially because
frankly I'm kinda mad at him rn but also because when a pr is made the
onus on finishing it falls to the person who made it.
Should not need to clean up after someone as a maintainer, and shouldn't
normalize doing it. I'm not like mad at zypher directly mind he offered
to do this too, just the idea he was espousing here.
---------
Co-authored-by: Kyle Spier-Swenson <kyleshome@gmail.com>
Co-authored-by: Gandalf <9026500+Gandalf2k15@users.noreply.github.com>
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
* Fixes another image harddel in station blueprints (and more) (#80780)
## About The Pull Request

Tin. Just more uncovering of some of these image harddels.
`blueprint_data` is a list of images.
I also went through the code and looked for any more instances of images
being qdeleted that I could find.
## Why It's Good For The Game
Hard dels begone
## Changelog
🆑
fix: fixes an /image harddel in station blueprints
code: cleaned up some more /image qdels
/🆑
* Fixes another image harddel in station blueprints (and more)
---------
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
* Saves some free lag by removing some in area (in world) loops (#80644)
## About The Pull Request
Goes through and changes some `in area` / `in a` loops to use
`get_contained_turfs` to cut down on `in_world` loops. Saves some free
lag.
## Changelog
🆑 Melbert
fix: Some things which affect everything in an area are less laggy, the
"all lights are broken" station trait especially
/🆑
* Saves some free lag by removing some in area (in world) loops
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
* Alien nests and some other stuf can be hit again. (#80418)
## About The Pull Request
Another small issue fixed. Thanks Melbert for telling us what's wrong
with it.
EDIT: other objects were rendered unhittable by that flags refactor PR.
## Why It's Good For The Game
Fixes#80311. I made the xmas tree indestructible because the comment to
the `NO_DECONSTRUCTION` flag didn't make a load of sense since that
doesn't stop it from getting destroyed anyway.
## Changelog
🆑 MrMelbert, Ghommie
fix: Alien nests, and some other stuff, can be physically attacked
again.
balance: x-mas trees (the ones with presents), are indestructibles.
Truly protected by a yuletide spirit.
/🆑
* Alien nests and some other stuf can be hit again.
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
* Icebox escape pods now properly target the Icemoon surface (#80452)
## About The Pull Request
This fixes Icebox escape pods only landing in certain ruins when
launched early.
`/area/icemoon/surface/outdoors` only shows up in a few select ruins.
The new area value used to decide a landing point,
`/area/icemoon/surface/outdoors/unexplored/rivers/no_monsters`, covers
the majority of the Icemoon surface.
## Why It's Good For The Game
Closes#78735.
Escape pods might not very useful on Icebox, but this makes using them
less hazardous. You're guaranteed to at least land somewhere safe and
away from the station.
## Changelog
🆑 Rhials
fix: Icebox escape pods will now land randomly on the surface, instead
of only in certain ruins.
/🆑
* Icebox escape pods now properly target the Icemoon surface
---------
Co-authored-by: Rhials <28870487+Rhials@users.noreply.github.com>
* Shuttle event "Turbulence" (#80358)
## About The Pull Request
Adds a new shuttle event: turbulence.
The escape shuttle is experiencing subspace turbulence, effectively
causing the takeoff/landing buckle check to repeat a couple of times
during the duration of the flight.
Players will get a two second warning when the screen starts shaking,
after which if they are not buckled (or... outside of the shuttle I
guess) they will fall over for a few seconds.
The presence of turbulence in the shuttle's path will be announced
shortly after takeoff, so strap yourself in.
## Why It's Good For The Game
I think it adds a bit of flavour and influences what is going on in the
shuttle (falling over at the wrong moment can turn a scrum over bridge
access on its head) without being quite as disruptive as "there's 13
carp in here now".
## Changelog
🆑
add: Adds a new shuttle event, where space shuttles can experience minor
turbulance. Keep your belt on while the appropriate cabin light is lit.
/🆑
Co-authored-by: John Willard <53777086+JohnFulpWillard@ users.noreply.github.com>
* Shuttle event "Turbulence"
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
Co-authored-by: John Willard <53777086+JohnFulpWillard@ users.noreply.github.com>
* Add a bounds check to prevent runtimes on the ripple shuttle port (#79959)
This appears to sometimes runtime when the target stationary port is
somehow a different size to the ripple port. The code had an out of
bounds check of a sort, but it doesn't actually work because the array
accesses runtime instead of returning a null
As to why the turfs available were not the same? most likely because the
bounds overlapped the world edge due to a fuck huge shuttle.
I have a feeling even if this proc completes something would fail later
anyway.
edit: oh so it was the lance shuttle which is fuck hueg
#79961 is related but not fixed by this.
* Add a bounds check to prevent runtimes on the ripple shuttle port
---------
Co-authored-by: oranges <email@oranges.net.nz>
* More standardization for ghost notifications (READY) (#79596)
## About The Pull Request
I'm still not satisfied with how ghost notifications work. This gives
every notification with a source (99% of all notifications, in other
words) a link to jump/orbit. Currently, notifications with "play"
interactions would only get the interact link, so jumping to the source
was pretty annoying.
It removes posting the entire message in the alert tooltip, as some got
pretty lengthy and it didn't seem to fit. To replace this, they will
always use headers
After:



NOTIFY_JUMP and NOTIFY_ORBIT have been merged, since the only difference
seems to be whether it's a turf. The result shaves off some redundant
lines of code, since most-every usage of notify_ghosts uses
NOTIFY_ORBIT.
## Why It's Good For The Game
More standardization for the ghost notification system. Adds a few alert
headers that never had them. All in all, makes it easier for creators to
throw alerts at ghosts
## Changelog
🆑
qol: Nearly every ghost alert should now feature a "VIEW" button, even
those with click interaction.
del: Ghost alerts no longer show the entire message in the tooltip,
instead have been replaced with titles.
/🆑
* More standardization for ghost notifications (READY)
* Modular
* Update outpost_of_cogs.dm
---------
Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com>
Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com>
* Basic Guardians/Holoparasites (#79473)
## About The Pull Request
Fixes#79485Fixes#77552
Converts Guardians (aka Holoparasites) into Basic Mobs.
Changes a bunch of their behaviours into actions or components which we
can reuse.
Replaces some verbs it would give to you and hide in the status panel
with action buttons that you may be able to find more quickly.
They _**should**_ work basically like they did before but a bit
smoother. It is not unlikely that I made some changes by accident or
just by changing framework though.
My one creative touch was adding random name suggestions.
The Wizard federation have a convention of naming their arcane spirit
guardians by combining a colour and a major arcana of the tarot. The
Syndicate of course won't truck with any of that mystical claptrap and
for their codenames use the much more sensible construction of a colour
and a gamepiece.
This lets you be randomly assigned such creative names as "Sparkling
Hermit", "Bloody Queen", "Blue World", or "Purple Diamond".
You can of course still ignore this entirely and type "The Brapmaster"
into the box if so desired.
I made _one_ other intentional change, which is to swap to Mothblocks'
nice leash component instead of instantly teleporting guardians back to
you when they are pulled out of the edge of their range. They should now
be "dragged" along behind you until they can't path, at which point they
will teleport. This should make the experience a bit less disorienting,
you have the recall button if you _want_ to instantly catch up.
This is unfortunately a bumper-sized PR because it did not seem
plausible to not do all of it at once, but I can make a project branch
for atomisation if people think this is too much of a pain in the ass to
review.
Other changes:
- Some refactoring to how the charge action works so I could
individually override "what you can hit" and "what happens when you hit"
instead of those being the same proc
- Lightning Guardian damage chain is now a component
- Explosive Guardian explosive trap is now a component
- Added even more arguments to the Healing Touch component to allow it
to heal tox/oxy damage and require a specific click modifier
- Life Link component which implements the Guardian behaviour of using
another mob as your health bar
- Moved some stuff about deciding what guardians look and are described
like into a theming datum
- Added a generic proc which can return whether your mob is meant to
apply some kind of damage multiplier to a certain damage type. It's not
perfect because I couldn't figure out how ot cram limb modifiers in
there, which is where most of it is on carbons. Oh well.
- Riders of vehicles now inherit all movement traits of those vehicles,
so riding a charging holoparasite will let you cross chasms. Also works
if you piggyback someone with wings, probably.
## Changelog
🆑
refactor: Guardians/Powerminers/Holoparasites now use the basic mob
framework. Please report any unexpected changes or behaviour.
qol: The verbs used to communicate with, recall, or banish your Guardian
are now action buttons.
balance: If (as a Guardian) your host moves slightly out of range you
will now be dragged back into range if possible, rather than being
instantly teleported to them.
balance: Protectors now have a shorter leash range rather than a longer
one, in order to more easily take advantage of their ability to drag
their charge out of danger.
balance: Ranged Guardians can now hold down the mouse button to fire
automatically.
balance: People riding vehicles or other mobs now inherit all of their
movement traits, so riding a flying mob (or vehicle, if we have any of
those) will allow you to cross chasms and lava safely.
/🆑
---------
Co-authored-by: san7890 <the@ san7890.com>
* Basic Guardians/Holoparasites
* Modular
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
Co-authored-by: san7890 <the@ san7890.com>
Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com>
* Cuts down on unnecessary non-TGUI stuff (#79590)
## About The Pull Request
Removes INTERACT_MACHINE_SET_MACHINE on machines that don't use a
non-TGUI UI.
Removes set_machine from TGUI things that forgot to remove them
previously.
Decouples advanced camera consoles from UI procs since it doesn't
actually use one.
## Why It's Good For The Game
TGUI machines don't need to be using these procs and vars, and this
makes it more clear what does and doesn't use a TGUI menu from a glance.
I explain it a bit better
[here](https://hackmd.io/XLt5MoRvRxuhFbwtk4VAUA) if you're interested.
## Changelog
No player-facing changes.
* Cuts down on unnecessary non-TGUI stuff
---------
Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
* Improves the deployable component (#79199)
## About The Pull Request
The deployable component had a few random things I noticed when I tried
actually using it that kinda sucked so I'm:
Making the examine message more generic, we did NOT need to make it that
complicated.
Letting anything with hands deploy stuff, because mobs other than humans
can hold things.
Giving the option to let something be deployed more than once.
Letting direction setting be optional.
Tweaking the check for if something can be placed somewhere to be a bit
better.
## Why It's Good For The Game
I want to use the deployable component for stuff but I made it awful.
## Changelog
🆑
code: the deployable component has been tweaked and improved with some
new options to it
/🆑
---------
Co-authored-by: Jacquerel <hnevard@ gmail.com>
* Improves the deployable component
* Modular
---------
Co-authored-by: Paxilmaniac <82386923+Paxilmaniac@users.noreply.github.com>
Co-authored-by: Jacquerel <hnevard@ gmail.com>
Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com>
* Invisibility refactor (#78908)
This adds a tracker for sources of invisibility and a priority system. I
needed this for another thing so I'm doing this first since it touches a
lot of code. As for the bugs fixed in the changelog, it's only what I
noticed while going through everything and there's likely a few more
things fixed with this. This should be testmerged for a while, I'll
bring this out of draft when it feels safe.
🆑
admin: Invisimin can now be used on mobs that are already invisible,
whether through temporary or permanent effects.
fix: Monkeyize/Humanize mob transformations no longer permanently reveal
invisible mobs if they had effects making them invisible otherwise.
fix: Objects with the undertile element that have been made invisible
through other means are no longer revealed by being uncovered.
/🆑
* Invisibility refactor
---------
Co-authored-by: Emmett Gaines <ninjanomnom@gmail.com>
* Fixes Lazy Templates fucking over cables, pipes , and shuttles at random (#78622)
## About The Pull Request
See title.
## Why It's Good For The Game
If a lazy template is loaded AFTER roundstart it doesn't get included
into the global init procs, because that work is offloaded into a
subsystem
LINDA runtimes are bad, null.archive() runtime be gone.
## Changelog
🆑
fix: The Syndicate have fired their previous construction company after
poor results in recent outposts.
/🆑
* Fixes Lazy Templates fucking over cables, pipes , and shuttles at random
---------
Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com>
Adds user feedback for going over order limits in cargo console (#76344)
This'll prevent weird "above the max by accident" cases, and also uses
defines instead of hardcoded stuff. This code is often duped, wish we
had a better way of handling it.
Oh also removes a few safety copies before for loops that aren't
actually needed (for x in list copies the list)
Better UX, slightly saner code
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
* Patches some cargo shuttle Centcom exploits. (#78540)
## About The Pull Request
Globally prevents anything blacklisted from actually getting to the
Centcom z-level by shipping blacklisted items back to their location of
origin just before the shuttle docks at Centcom.
Everything rejected in this way is logged and admins are given an alert
to let them know something funky went on.


## Why It's Good For The Game
Hopefully universally patches all current methods of getting to the
Centcom Z-level via getting on the cargo shuttle mid-transit.
Individual methods to accomplish this can still be patched individually,
but this tries to blanket prevent such exploits from working on a more
fundamental level.
## Changelog
🆑
fix: Centcom now rejects contraband that somehow makes it way onto the
cargo shuttle mid-transit and returns it.
/🆑
* Patches some cargo shuttle Centcom exploits.
---------
Co-authored-by: Timberpoes <silent_insomnia_pp@hotmail.co.uk>
* Emergency shuttle is aware of security level (#78271)
## About The Pull Request
The emergency shuttle maintains its security level coefficient and does
the calculation instead of outside procs that aren't aware of what alert
it was when the shuttle was first called.
If the shuttle auto-call timer should be capped at the current security
level timer, that can be done in a different PR.
## Why It's Good For The Game
Fixes https://github.com/tgstation/tgstation/issues/78159
## Changelog
🆑 LT3
fix: Emergency shuttle should correctly scale timer up/down when
changing security levels
/🆑
* Emergency shuttle is aware of security level
---------
Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>
* Exploration drones can no longer be used to get to centcom (#78197)
## About The Pull Request
Fixes#73417
Implements a check for exploration drones to make sure that containers
inside the storage don't have blacklisted items in them before launch.
Now you won't able to hide beacons and living beings inside bluespace
body bags.
Also adds exploration drone launchers to cargo shuttle's blacklist to
prevent potential shenanigans in the future.
[I suck at explaining, so here's a poorly made video that shows how to
do this](https://www.youtube.com/watch?v=U45ifQGQxzI)
~also, why does it take 10 hours to get the "Time Waster" achievement.
how did 6 people even get it??~
## Why It's Good For The Game
centcom is scary and exploits are bad
## Changelog
🆑
fix: Exploration drones can't be used to reach Centcom anymore.
/🆑
* Exploration drones can no longer be used to get to centcom
---------
Co-authored-by: leaKsi <59278564+leaKsi@users.noreply.github.com>
* ea nasir damn you
* surely there are no consequences to any of this
* nineteen dollar pistol, just a week away
* i love buying product
* look at all these great deals!
* just a week away
* should fix windows build
* should let borgs place requests
* lets borgs use it fr
* epic logic L
* actually for real fixes silicons ordering from imports
* get real
* makes cargo ordered stuff not show up locked in a crate
* makes it impossible to get that infinite cash from small orders
* i dont think we need this anymore?
* switches up the selection a tiny bit to fit the new system
* removes a bit i commented out but didnt delete
* lets see if moving that to static data makes it still work fine
* turns out that it was not, in fact, fine
* Update modular_skyrat/modules/company_imports/code/armament_datums/deforest_medical.dm
Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>
* makes adv tools more expensive and fixes budget orders
* restricts some large weapons i forgot to
* fixes some magazine import pathing
* those dont exist anymore pal!
---------
Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>
* Updates message for HREF Dock Exploit (#77891)
## About The Pull Request
Hey there,

This message randomly popped up while I was adminning, and it was
completely dogshit useless (as well as not being an HREF exploit since
Snowdin was loaded and you should be expected to do that, but that's
indicative of a harder bug). Let's yeet the `message_admins()` portion
(as well as make it actually actable information rather than just
'Unknown' and give it an actual follow jump button) and if then if we
don't have a client, stack_trace (in case people want to make basic mobs
keymash to send shuttles in the future).
## Why It's Good For The Game
This is completely useless and confusing. It's not even an HREF exploit
because this behavior is completely intended. It's more helpful to
coders now too because this thing failing isn't just locked to
admin-only logs, it stack traces (which is publically available).
## Changelog
🆑
admin: The "HREF Dock Exploit" message should now contain a bit more
usable information (such as a jump link) so you can investigate if
something is really going wacky with shuttles.
/🆑
---------
Co-authored-by: Gallyus <5572280+francinum@ users.noreply.github.com>
* Updates message for HREF Dock Exploit
---------
Co-authored-by: san7890 <the@san7890.com>
Co-authored-by: Gallyus <5572280+francinum@ users.noreply.github.com>
* Adds a check grep for using `src` as a trait source rather that `REF(src)` (#77836)
## About The Pull Request
Using `src` as a trait source is an error and can often lead to
hard-deletes
If you wish to tie a source to a certain datum, it is common to use
`REF(src)` instead.
Ideally, we would lint or test for any use of a reference rather than a
string in use in trait sources, but that's a bit harder to setup.
Currently (from what I can see) the *only* erroneous use of references
as sources are via `src`, so it being the most common error, I see it
fine to lint for it.
## Changelog
Nothing player facing.
* Adds a check grep for using `src` as a trait source rather that `REF(src)`
* Update style.dm
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com>
* Add admin blackhole(s) shuttle event (#77188)
## About The Pull Request
This adds a new **Black Hole** admin shuttle event while the escape
shuttle is in transit. The regular version spawns a small 1x1
singularity that falls through the ship. There is also a special
adminbus Kobayashi Maru version that spawns multiple black holes
rapidly.
## Why It's Good For The Game

Tell me this doesn't look fun?
## Changelog
🆑
add: Add admin blackhole shuttle event with a normal version and
suicidal version.
fix: Fix several shuttle event runtimes
/🆑
---------
Co-authored-by: Time-Green <7501474+Time-Green@ users.noreply.github.com>
* Add admin blackhole(s) shuttle event
---------
Co-authored-by: Tim <timothymtorres@gmail.com>
Co-authored-by: Time-Green <7501474+Time-Green@ users.noreply.github.com>
* [no gbp] Fixes runtimes in shuttle event and shuttle cling (#77343)
Fixes no-candidate runtime from pick() on an empty list
Fixes spawning null movables if run out of mobs to spawn
Fixes shuttle cling qdeling on Initialize due to lattices not counting
as hyperspace
🆑
runtime: Fixes runtimes in shuttle event and shuttle cling code
/🆑
---------
Co-authored-by: Jacquerel <hnevard@ gmail.com>
* [no gbp] Fixes runtimes in shuttle event and shuttle cling
---------
Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com>
Co-authored-by: Jacquerel <hnevard@ gmail.com>
* Implements usage of the REVERSE_DIR macro throughout the code. (#77122)
## About The Pull Request
Replaces a ton of `turn(dir, 180)` calls with the aforementioned macro.
## Why It's Good For The Game
Afaik, `REVERSE_DIR` was coded to be faster than the classic `turn(dir,
180)` call, being a simple set of binary operations. To sum it up, micro
optimization.
## Changelog
N/A
* Implements usage of the REVERSE_DIR macro throughout the code.
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
* Machine list is now stored in SSmachines | Remove excessive use of global lists for specific machine types
* Resolve merge conflicts
* Modular adjustments
* destroy this double return on destroy
---------
Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com>
Co-authored-by: Giz <vinylspiders@gmail.com>