Compare commits

..
Author SHA1 Message Date
pre-commit-ci[bot] 3d24fa691f [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
2026-08-23 14:09:05 +00:00
Vanessa 270948aa69 Hyperblade to 25TC 2026-08-23 09:02:43 -05:00
Delta-V bot bbf1bec942 Automatic changelog update 2026-08-23 14:57:21 +02:00
Vanessaandpre-commit-ci[bot] bd34a94587 Embeddable Syndicate and Hitman Business Cards (#6439)
* make business cards embed

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-08-23 07:57:01 -05:00
Delta-V bot 86c54228f8 Automatic changelog update 2026-08-23 14:56:33 +02:00
Vanessa c66bf7c249 Remove coords for Arms Dealers, Asakim, and SRN (#6441)
* Remove coords for arms dealers, asakim, and SRN

* Also set a bunch of other syndicate uniforms to coords off

* forgot two
2026-08-23 07:56:12 -05:00
github-actions[bot]andDeltaV-Bot fd0f01e49a Update Credits (#6444)
Co-authored-by: DeltaV-Bot <github@deltav.gay>
2026-08-23 02:56:31 +02:00
Delta-V bot cfddb40c2f Automatic changelog update 2026-08-22 18:18:52 +02:00
DisposableCrewmember42 19d4eb8489 feat: Unorbitable component (#6435)
* feat: Unorbitable component

* feat: stealthmin adds/removes Unorbitable
2026-08-22 11:18:31 -05:00
Delta-V bot 9bb7925bd2 Automatic changelog update 2026-08-21 20:29:57 +02:00
Radezolid e340ddcec9 Kill combat medkits free storage (#6413)
* Kill!!

* Medkit size

* Removed from printable list + made resistant to explosions

* Make the test not angry at me

* I can't read

* I can't read v2
2026-08-21 13:29:37 -05:00
Delta-V bot e0b6261454 Automatic changelog update 2026-08-21 04:39:06 +02:00
Radezolid d741daca19 Syndie shuttles fixes + interdyne locker + new syndie evac pod (#6094)
* Interdyne locker

* Haibu

* strongbox

* synth

* Census

* hornet

* old evac pod to adming folder

* Add a syndie door and fix census

* Apply requested changes

---------

Signed-off-by: Radezolid <snappednexus@gmail.com>
2026-08-20 21:38:45 -05:00
Vanessa 970c8d71b5 Fix NodeCrawling ClientSide Errors (#6429)
fix some clientside errors with nodecrawling
2026-08-20 12:28:47 -05:00
Delta-V bot b6801b2fe5 Automatic changelog update 2026-08-20 19:20:06 +02:00
Vanessa 5cd26f877e Fix Hitman Targeting Marked as Protected (#6426)
Fix objective immunity.
2026-08-20 12:19:46 -05:00
Minerva 105ad32f98 Minor indentation change on pull request template (#5634) 2026-08-20 10:18:59 -05:00
Delta-V bot e3566a4cc9 Automatic changelog update 2026-08-20 16:25:25 +02:00
Vanessa 5e63549b8c Locale Ops (#6427)
* Fixed missing locale strings.

* Meant to revert this.
2026-08-20 09:24:59 -05:00
Delta-V bot 5b08961c35 Automatic changelog update 2026-08-18 20:15:03 +02:00
3c6ab7b676 Reduced the slowdown of the Advanced Riot Control Suit to 15% (#6353)
* ARCS slowdown 15% explosion resist 40%

* Comment on the explosion resistance of the ARCS

* Replaces the ARCS with the upstream riot suit, riot suit now has 40% explosion resist

* Apply suggestion from @ShepardToTheStars

Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>

---------

Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Co-authored-by: john <sadadawd3@gmail.com>
Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
2026-08-18 18:14:43 +00:00
23e55c9c40 Fix lack of justice access on AA (#6408)
* Add access, uncomment brig

* borgs

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Co-authored-by: Vanessa <vanessalouwagie@gmail.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-08-18 18:08:39 +00:00
Delta-V bot ffa442f844 Automatic changelog update 2026-08-18 19:51:56 +02:00
CorynandVanessa 6d75455dd1 Add Vulp Scream Sound Collection (#6348)
* Add Vulp Scream Sound Collection

* Fix mistake

---------

Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
2026-08-18 12:51:36 -05:00
Delta-V bot 0d89320364 Automatic changelog update 2026-08-18 18:39:28 +02:00
Theo 1984cc2118 hristov rework (#5905)
* Add deviation, slowdown, projectile slower, bipod and stats

* add nt-3 piercing remove bullet slow

* fixed the piercing stuff

* ok
2026-08-18 11:39:07 -05:00
Delta-V bot 3248ee4715 Automatic changelog update 2026-08-17 22:26:29 +02:00
Vanessaandpre-commit-ci[bot] b2b08e698e Ramping Scheduler Fixes / Convert to Survival Fixes (#6416)
* Fixed nukie behavior check firing early

* Fixed ZombieOutbreak adding ramping schedulers

* RampingSchedulers now look at when they were added for keypoint times

* Xenoborgs no longer has a RampingScheduler roundstart.

* Added number of cuffed hands check

* Use GameRule activation time.

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* silly compiler flag

* Apply suggestions from code review

Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>

* Fix other locale usages

* silly me

* PR feedback

---------

Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-08-17 15:26:09 -05:00
Delta-V bot 3a612b9450 Automatic changelog update 2026-08-17 21:14:50 +02:00
Vanessaandpre-commit-ci[bot] 9746e92479 Adjust Traitor Objectives if 30TC (#6389)
* Adjust traitor objectives. More objectives. Increase objective variance a bit. Add new CMO steal target.

* Remove stealcondition blacklist from DAGD so its not just muderboning

* locale

* Fix DAGD steal objective again. Tweak LO steal objectives

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Updated super surplus

* Added migration.

* Locale tweak

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-08-17 14:14:31 -05:00
Delta-V bot 9d723af15d Automatic changelog update 2026-08-17 19:38:23 +02:00
Vanessa 8e925a02b9 Fix Kitsune Getting Posioned by Raw Meat (#6422)
fix kitsune
2026-08-17 19:38:02 +02:00
Delta-V bot d898300c5c Automatic changelog update 2026-08-16 17:05:00 +02:00
Vanessa 4294df8fd7 Fix Holy Water (#6421)
fix holy water
2026-08-16 10:04:40 -05:00
Delta-V bot 365209174b Automatic changelog update 2026-08-16 16:08:07 +02:00
Sir Warock 0c852409b3 Prioritize ejecting handgun from secbelt (#6418)
one commit
2026-08-16 09:07:45 -05:00
github-actions[bot]andDeltaV-Bot 9fb8bab84e Update Credits (#6420)
Co-authored-by: DeltaV-Bot <github@deltav.gay>
2026-08-16 02:55:39 +02:00
Delta-V bot c7e1c980b6 Automatic changelog update 2026-08-14 06:31:17 +02:00
Stop-Signs 0516e97461 Disallow evil fucked up brainwashing (#6414) 2026-08-13 23:30:57 -05:00
Delta-V bot fd5b16abb3 Automatic changelog update 2026-08-13 17:02:06 +02:00
Vanessa 1a9281ab63 Fixed Species Organs (#6409)
Fixed some inconsistent organs with species.
2026-08-13 10:01:47 -05:00
Delta-V bot c9038be25f Automatic changelog update 2026-08-13 03:17:23 +02:00
Vanessa b3cf460bda Fix and Tweak Random Shuttle Spawns (#6401)
* Fix and slightly alter random shuttle spawns

* Few more tweaks. Twice as many shuttles.

* Tweaked to be max every 90 min
2026-08-13 03:17:03 +02:00
Delta-V bot 7fddf52368 Automatic changelog update 2026-08-12 19:34:32 +02:00
pathetic meowmeow 4a96535892 Finetune ion law set (#6390) 2026-08-12 14:34:11 -03:00
Stop-Signs 93f614fdfc Add animation to the radiant sword (#6380)
* progress

* kermit

* donezo

* light
2026-08-12 14:15:26 -03:00
Delta-V bot 40997fb4a4 Automatic changelog update 2026-08-12 19:05:52 +02:00
freezer dog c3adbb32f1 a cowboy crate edit (#6363)
yeehaw
2026-08-12 14:05:32 -03:00
Delta-V bot 3974a0331b Automatic changelog update 2026-08-12 18:49:52 +02:00
SumofThreeParts 92c6c8cfa3 Making Universals Cheaper (#6366)
* Making Universals Cheaper

Signed-off-by: SumofThreeParts <its.a.joke1000@gmail.com>

* Update cargo_armory.yml

Signed-off-by: SumofThreeParts <its.a.joke1000@gmail.com>

* Update cargo_armory.yml

Signed-off-by: SumofThreeParts <its.a.joke1000@gmail.com>

---------

Signed-off-by: SumofThreeParts <its.a.joke1000@gmail.com>
2026-08-12 13:49:31 -03:00
Vanessa ea313aae4a Update Configs (#6407)
* add configs that were not managed in git

* Add fallback preset

* removed map_enabled
2026-08-10 17:03:25 -05:00
Delta-V bot 272c38a6d0 Automatic changelog update 2026-08-10 18:15:15 +02:00
Coryn 7f11e1eebb Harpy Layers Fix (#6406)
* Harpy Layers Fix

* Remove unused Dependency

* Commented out Visual Subscribes, Add RArmExtension has a hideable layer for hardsuits

* Untouch Harpy Visuals
2026-08-10 11:14:55 -05:00
Delta-V bot 06429d050a Automatic changelog update 2026-08-09 20:24:45 +02:00
ed07a12d24 Gnomes (#6027)
* add gnomes, gnome hat, gnome gamerule, gnome voice

* inventory and hand fixed, speech half fix, hat embed, gamerule doesn't work

* fix audio, gamerule doesn't spawn correctly, need to fix dead sprite 90 degrees off

* add audio, add custom jaunt + polymorph, "fix" dead sprite

* add storage to hat, gnome fit into duffelbags

* make jaunt 2 seconds, hat store small items

* fix spawn

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* jaunt 20 seconds

* fix stupid web merge, 20 second jaunt cooldown

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* add pitch variation

* audio fixes and guidebook, make pulling need hands

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* fix hands and polymorph inventory, make storage implant unremovable

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* polymorph inventory make linter mad

* Update Resources/Prototypes/_DV/Polymorphs/polymorph.yml

Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Signed-off-by: Theo <tad3@illinois.edu>

* Update Resources/Locale/en-US/_DV/abilities/psionic.ftl

Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Signed-off-by: Theo <tad3@illinois.edu>

* passive HTN and glimmer event

* fix comment

* random names

* PR Review Suggestions but it works this time

---------

Signed-off-by: Theo <rebe83a@gmail.com>
Signed-off-by: Theo <tad3@illinois.edu>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Co-authored-by: Vanessa <vanessalouwagie@gmail.com>
2026-08-09 18:24:25 +00:00
Delta-V bot 493db6d129 Automatic changelog update 2026-08-09 20:14:34 +02:00
Vanessa d07f16f43f Allow curators to help out with people learning the game (#6374) 2026-08-09 13:14:15 -05:00
Delta-V bot f580f3b060 Automatic changelog update 2026-08-09 18:57:52 +02:00
Vanessa e7869d8221 Fix Jaunting/Polymorph while Nodecrawling (#6400)
* Disable polymorph while ventcrawling

* Actually, allow but remove from vent

* update comments
2026-08-09 11:57:32 -05:00
Vanessa 398e3eb75f Server Location Updates (#6405)
Server name updates (because we're in canada now)
2026-08-09 11:54:55 -05:00
Vanessa 0637a82e40 Update CODEOWNERS (#6404) 2026-08-09 11:41:59 -05:00
github-actions[bot]andDeltaV-Bot 206ded17c8 Update Credits (#6402)
Co-authored-by: DeltaV-Bot <github@deltav.gay>
2026-08-09 03:11:44 +02:00
Delta-V bot 847f534ff6 Automatic changelog update 2026-08-08 01:25:14 +02:00
VanessaandWhatstone b38f0b1a59 Fix parcel wrap transform parenting via SpawnAtPosition (#44679) (#6399)
ParcelWrap: spawn at position, use PopupEntity

Co-authored-by: Whatstone <166147148+whatston3@users.noreply.github.com>
2026-08-07 23:24:53 +00:00
Delta-V bot efbeb5bf68 Automatic changelog update 2026-08-07 18:51:45 +02:00
VanessaandSir Warock 1f09c717f3 Fix Antags Being Crazy Smol (#6398)
* Fixed antags being crazy smol

* Update Content.Shared/Sprite/SharedScaleVisualsSystem.cs

Signed-off-by: Sir Warock <67167466+SirWarock@users.noreply.github.com>

---------

Signed-off-by: Sir Warock <67167466+SirWarock@users.noreply.github.com>
Co-authored-by: Sir Warock <67167466+SirWarock@users.noreply.github.com>
2026-08-07 16:51:24 +00:00
Radezolid 52ed881e2c Extra mapping stuff for justice rework (#6397)
* Banner

* Beacons

* Warp

* Gun safe stuff
2026-08-07 09:04:06 -05:00
Radezolid 393e1951a2 More suffixes fixes for Justice (#6396)
Suffixes, suffixes!
2026-08-05 00:07:51 +00:00
Delta-V bot ca7c7daf6c Automatic changelog update 2026-08-05 00:19:07 +02:00
Stxcking 697da0679a Fix: Moproach Ghostrole + Critter Emoting Fixes (#6356)
yeah sure it works
2026-08-04 17:18:46 -05:00
Delta-V bot 1b75cad94f Automatic changelog update 2026-08-04 23:49:39 +02:00
Vanessa 82e5d9b924 Fix Shadekin Changelog (#6395)
* Fix changelog

* i can't spell
2026-08-04 21:49:18 +00:00
Radezolid e44717f262 Fix Justice Warden's suffixes for mapping (#6393)
* SUFFIXES

* I missed the PDA one.

* Justice warden's shit

* Holopad
2026-08-04 12:45:19 -05:00
Delta-V bot 9c83b91850 Automatic changelog update 2026-08-04 18:41:34 +02:00
VanessaandSir Warock f027ae4566 Fix Shadekin Inheritence (#6381)
* Make shadekin organic

* Removed shadekin lungs

* Update Content.Server/_Starlight/ShadekinSystem.cs

Co-authored-by: Sir Warock <67167466+SirWarock@users.noreply.github.com>
Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>

---------

Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Co-authored-by: Sir Warock <67167466+SirWarock@users.noreply.github.com>
2026-08-04 16:41:14 +00:00
Delta-V bot 724cd1c9b8 Automatic changelog update 2026-08-04 18:28:16 +02:00
Vanessaandpre-commit-ci[bot] f44178bec3 Character Height Slider + Character Height Changes (#6320)
* Do the thing for everyone. Height is now +/- 20% for everyone.

* Make the height slider show height. Solve for special cases. Solve world hunger.

* Fixed some minor things.

* Adjust some densities

* Smaller character balance

* Comment

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Oops, that was from a failed thing.

* Size calc correction

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* people are tall in the future

* I need to refactor a bit still.

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Refactor into a system

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* smol

* Fixed remaining scale visual components and species

* Remove MockScale. Just add scale visuals for Allalulo to compensate.

* PR feedback

* Slight refactor. Moved profile/species scale out of the scale system and put it into the HumanoidProfileSystem. Removed some CD logic that is no longer needed.

* how'd this get in there

* Move the other motorkind.yml to AprilFools dir

* NO NO_PENTALTY lol

* Other PR stuff

* Other PR stuff

* Add a dirty

* Add some networking to the comp

* Add small character to cloning

* One more fixX

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-08-04 16:27:55 +00:00
Delta-V bot 877267cd31 Automatic changelog update 2026-08-03 04:45:31 +02:00
3572bf4739 Skia Shadow-Walk and DarkVision instead of VentCrawl (#6346)
* What if Skia were awesome instead of sucking

* Shhh Yaml Linter... Shhh

* Small change to make it feel more consistant

* Reworked shadowwalking to be lazy

Much faster, preserves most of the feel

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Update Content.Shared/_DV/Overlays/Components/DarkVisionComponent.cs

Signed-off-by: pathetic meowmeow <uhhadd@gmail.com>

---------

Signed-off-by: pathetic meowmeow <uhhadd@gmail.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: pathetic meowmeow <uhhadd@gmail.com>
2026-08-02 22:45:11 -04:00
Delta-V bot 7867fb7f1f Automatic changelog update 2026-08-02 15:31:52 +02:00
a3b1059c21 PORT: Added Construction Bag and Bag of Holding from Frontier (#5846)
* Construction Bag (#1487)

* initial commit

* Un Tag

* fixes

* no tickets

* research thingy

* inflatable walls, shared.comp

---------

Co-authored-by: Dvir <dvirf01@gmail.com>

* DeltaV related

Don't kill me for fixing my own grammar mistake with the borg module please

* BorgModuleAdvancedConstruction

- I will fix the spelling in another PR I guess. GUH
- Some fixes to the bag according to linter.
Anything and everything you need for a borg module:
- Lathe recipe.
- Module.
- Icon/action sprite.

* Sprite fixes

* lathe fix I forgor

* nuke BorgModuleAdvancedConstruction

CR request

* why was this not merged uh whoops

* suggestions

* Update Resources/Prototypes/_NF/Recipes/Lathes/misc.yml

Signed-off-by: Radezolid <snappednexus@gmail.com>

---------

Signed-off-by: Radezolid <snappednexus@gmail.com>
Co-authored-by: ErhardSteinhauer <65374927+ErhardSteinhauer@users.noreply.github.com>
Co-authored-by: Dvir <dvirf01@gmail.com>
Co-authored-by: Radezolid <snappednexus@gmail.com>
2026-08-02 13:31:30 +00:00
Stxckingandpre-commit-ci[bot] 076d960072 Justice Rework - Mapping (#6276)
* windoors, airlocks, faxes, dresser, beacon, warppoints

* Lockers and placeholder bedsheets

Most of this done by Rebe

* attorney as a separate role

idk why we decide to just modify upstream lawyer instead of making a separate role from the start sobs

* justice warden, armorer, marshal job roles

* linter fixes

* holy shit theres more

a mixture of everything as I had a list to go down
-JusticeDetective stuff because Det is now under justice
-More Armorer stuff
-Cameras
-Telecoms
-Prosec/Attorney lockers
-Secure windoors

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* brig access as requested + admin config

also dupe beacon fix wop

* Reb

* Bypass ChameleonJobLoadoutTest

dear maint i pinky promise they will get added before rework launches

* suggestions and fixes

They don't need to be on the access config right now but should be fine.

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-08-02 10:20:12 -03:00
github-actions[bot]andDeltaV-Bot acb6677aff Update Credits (#6392)
Co-authored-by: DeltaV-Bot <github@deltav.gay>
2026-08-02 04:08:22 +02:00
Delta-V bot c916f9a90b Automatic changelog update 2026-07-30 19:31:07 +02:00
71b6dfc0b1 Add Remote Medical Tracking to T3 Biochemical Tree (#6272)
* Added handheld monitors to the research tree.

* changed logi crate parent

* Added new board to dynamic pack

* Namespaced new entity

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Apply suggestions from code review

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>

---------

Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Radezolid <snappednexus@gmail.com>
2026-07-30 17:30:47 +00:00
Delta-V bot 5fe8a394ba Automatic changelog update 2026-07-29 17:42:20 +02:00
Vanessaandpre-commit-ci[bot] 69d3d96d79 Reduce Sink Claws Delay + Sink Claws Alert (#6376)
* Reduced felinid rootable delay to tolerable levels

* Added the unused toggle icon to the alerts on the side when claws are protracted, instead of using the diona one.

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-07-29 17:42:01 +02:00
Delta-V bot 1e6f69361d Automatic changelog update 2026-07-29 14:19:14 +02:00
NollaDarkstarandjohn cb71e8159c Change resistances of the Durathread Vest and Plate Carrier (#6311)
* Change to durathread vest and plate carrier

* Increase heat resistance of the durathread to 20%, plate carrier remains at 20% slash

* Plate Carrier is back at 20% heat

---------

Co-authored-by: john <sadadawd3@gmail.com>
2026-07-29 12:18:53 +00:00
Delta-V bot 809525b1bd Automatic changelog update 2026-07-27 21:26:57 +02:00
CalliganSierreandpre-commit-ci[bot] b81ccd4f15 Ported Shadekin Audio Revamp (#6370)
* Port TheDen Shadowkin voice noises for Shadekin

Bring over TheDen's Shadowkin scream, laugh, and talk audio, wire them into Shadekin emote sound collections and speech sounds so Shadekin no longer use generic human laughs/speech.

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Move TheDen Shadowkin voice prototypes to _DEN

Restore Starlight shadekin sound collections and emote sounds to their original state. Keep TheDen scream, laugh, and talk wiring under _DEN and point MobShadekin at those prototypes.

* Clean up comments on Shadekin voice port

Remove unnecessary inline notes from MobShadekin wiring and drop the extra header on sound collections. Keep a single provenance comment on the TheDen emote sound block.

* Cleaned up unneccessary comments

* Added gulps, i guess lol

* Removed custom laugh emotes for shadekin, reverted to normal human laugh.

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-07-27 21:26:37 +02:00
Delta-V bot c50871e76b Automatic changelog update 2026-07-27 18:43:40 +02:00
Stxcking 1206fca623 Feat: Departmental Bomber Jackets (#6220)
* Sprites

* bombers.yml

* drobes changes

* loadouts

* armor values (dread) + fixes

* updated sprites

* Suggestions
2026-07-27 11:43:19 -05:00
140be08fbb Health analyzer plus (#6230)
* Add medtek+ cart, healthanalyzer+ gui, research target

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Make new health analyzer default, remove research

* Remove bloodlevel unit count, center damage/reagents

* Accidentally pushed wording change, reverting

* Added unknown reagent category. Fixed some issues with FixedPoint2 showing 100x the damage.

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Vanessa <vanessalouwagie@gmail.com>
2026-07-27 14:02:14 +00:00
Delta-V bot b218279e7f Automatic changelog update 2026-07-27 15:48:35 +02:00
Vanessa 5664d6746d Revert "PORT: Selectable Cyborg Chassis from CosmicDrift (#5712)" (#6385)
This reverts commit 4e2dce4414.
2026-07-27 08:48:14 -05:00
github-actions[bot]andDeltaV-Bot ac747032ce Update Credits (#6383)
Co-authored-by: DeltaV-Bot <github@deltav.gay>
2026-07-26 04:09:10 +02:00
Delta-V bot 42db88fa74 Automatic changelog update 2026-07-24 19:39:38 +02:00
a52809279e Nerf & Fix NT-3 (#5653)
* One Commit ops

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Implement requested changes

Co-Authored-By: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>

* Well Well Well

* Fix Pierce Mechanic

* Include it in comment

* Implement requested changes

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
2026-07-24 12:39:18 -05:00
Delta-V bot 07f73179cd Automatic changelog update 2026-07-24 19:35:07 +02:00
freezer dog d1c4e94499 giving the wt a little love not like a whole lot like a pat on the shoulder or somethin (#6364)
* i cant think of anything funny to say yknow just like yep its like yknow and like yeah

* deletin this, also saw literally nothing attached to this to begin with i guess? gonna double check but yeah
2026-07-24 12:34:47 -05:00
Delta-V bot 481335487e Automatic changelog update 2026-07-24 19:29:07 +02:00
pootslapandpre-commit-ci[bot] ef0e8497ce Monkey emote sounds (#5928)
* pitch change ops

adding the params to emoteSounds overrides every individual emote which sucks

* lower gulps and blinking

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Update speech_emote_sounds.yml

Signed-off-by: pootslap <211648338+pootslap@users.noreply.github.com>

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Signed-off-by: pootslap <211648338+pootslap@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-07-24 12:28:47 -05:00
Delta-V bot 06c5917dbf Automatic changelog update 2026-07-24 19:28:20 +02:00
Manoob f0d1f668fe FIX: Emergency access doesn't change the BOLT/Emergency permissions on a door using remote control (#6141)
AA doesnt change the BOLT/AA permissions on a door using remote control!
2026-07-24 12:28:00 -05:00
Vanessa 583eb39799 ADMIN: Move common QUERY commands to DEBUG (#6351)
ADMIN: Move entities command to DEBUG
2026-07-24 12:27:47 -05:00
Delta-V bot a0ebf263e3 Automatic changelog update 2026-07-23 22:07:23 +02:00
VanessaandSir Warock 898101b18e Buckle Bugfix + Dynamic CPR Prio (#6375)
* Fix long-time carrying bug with buckling. Also change CPR priority

* remove TODO comment

* small nitpick

Refactor OnRemoved method and improve code formatting.

Signed-off-by: Sir Warock <67167466+SirWarock@users.noreply.github.com>

---------

Signed-off-by: Sir Warock <67167466+SirWarock@users.noreply.github.com>
Co-authored-by: Sir Warock <67167466+SirWarock@users.noreply.github.com>
2026-07-23 20:07:03 +00:00
Delta-V bot 25f4ffda47 Automatic changelog update 2026-07-23 18:29:49 +02:00
turtlemutt 796e6e4405 Lighthouse Tweaks (#6088)
* Update lighthouse.yml

* Update lighthouse.yml
2026-07-23 18:29:29 +02:00
Delta-V bot 5a4e73574d Automatic changelog update 2026-07-23 05:17:21 +02:00
Astra e4e3f30b84 Shrink entropic blades (#6371)
Resize entropic blade
2026-07-23 00:17:01 -03:00
William Lemonandpre-commit-ci[bot] b15639af05 Fixed Motorkind (#6347)
* Fixed Motorkind

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Gave the hand sprites human hand sprites

I'm not making motorkind hand sprites. Please god don't make me

* Tiny fixes

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-07-21 23:51:35 +00:00
Delta-V bot 009371129a Automatic changelog update 2026-07-21 20:45:08 +02:00
Coryn 09553d6b8e Add back Felinid Rootable (#6358) 2026-07-21 18:44:48 +00:00
Delta-V bot d736537261 Automatic changelog update 2026-07-21 09:59:15 +02:00
Coryn c0fbc4f262 Shadekin fixes (#6357)
* Fix Shadekin Emote availablity for everyone else

* Add Shadekin Bloodstream, so meds work
2026-07-21 03:58:55 -04:00
Delta-V bot cc33dc08e8 Automatic changelog update 2026-07-21 04:20:49 +02:00
Stxcking f6558cef8e Fix: Yip missing string (#6354)
yips
2026-07-21 02:20:29 +00:00
Delta-V bot 196419daf0 Automatic changelog update 2026-07-21 02:05:28 +02:00
nlaky ee01a470cf Fix vulp helmet sprites (#6201) 2026-07-21 00:05:08 +00:00
Delta-V bot c0b78a5065 Automatic changelog update 2026-07-21 01:46:30 +02:00
ArionGekkota 3b27cb1630 Pka upstream merge (#6258)
* PKA changes to upstream PKA balance

* Nerfed goliath and basilisk health

* Nerfed carp HP (3 shots to kill with unupgraded PKA)
2026-07-20 18:46:11 -05:00
Delta-V bot fc77ebae4d Automatic changelog update 2026-07-21 01:37:26 +02:00
Proxy also works :3 00d1991154 traitors get 30 tc (#6275)
* traitors get 30 tc

* Update roundstart.yml

* higher is fewer woops

* again

* like this?
2026-07-20 23:37:06 +00:00
William Lemon f20d8d9f7f Toolshed Additions: Field & DoExt commands (#6329)
* Toolshed Additions

* Removed MarkingCommand, added description to FieldCommand

* Added DoExt command
2026-07-20 19:28:39 -04:00
Delta-V bot ae4a864ad0 Automatic changelog update 2026-07-21 01:23:48 +02:00
dbe955ca17 Cargo bounty console improvements (with changes) (#6306)
* simple fix for "Approved by: Self" on all cargo invoices

* port of ruddygreat's bounty console improvements to DeltaV

* modified tooltips and fixed a few importing errors

* StatusLabel in BountyEntry.xaml.cs

* final stupid tweak

* removed unrelated bugfix PR that snuck into this branch somehow

* Cargo bounty fix requests

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Co-authored-by: cargomouse <dboozlebeep@gmail.com>
Co-authored-by: Jessica Harvey <itsjessagain23@gmail.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-07-20 18:23:28 -05:00
Delta-V bot 19ebd10ad1 Automatic changelog update 2026-07-21 01:18:12 +02:00
pathetic meowmeow dcd0fb693c Evidence bags (#6280)
* Evidence bags

* tests

* fix the gridinv thing
2026-07-20 18:17:52 -05:00
Delta-V bot 9a6cfb2bfb Automatic changelog update 2026-07-21 00:44:20 +02:00
KOTOB 35fa80f737 Kill security poncho (#6332)
* ughhh

* explode

* explode harder
2026-07-20 17:44:01 -05:00
Delta-V bot 3b7304d092 Automatic changelog update 2026-07-21 00:23:18 +02:00
pootslap da7468e79e Fixed improvised shotgun recipe (#6327)
fixed recipes
2026-07-20 17:22:59 -05:00
Delta-V bot 609bf88d9d Automatic changelog update 2026-07-21 00:21:43 +02:00
freezer dog b71e0a2edf vulpkanin yip (#6301)
* ok i think this works? idunno

* now its working

* fixin some namespace stuff thank ya stxcking
2026-07-20 17:21:23 -05:00
Delta-V bot aacfbd17f8 Automatic changelog update 2026-07-21 00:20:31 +02:00
pathetic meowmeow 6fda61e9cb Report global coordinates on the crew monitor (#6326) 2026-07-20 17:20:11 -05:00
Delta-V bot e47ee2601b Automatic changelog update 2026-07-21 00:11:09 +02:00
064fd77a11 Shadekins arrived (#5481)
* Merge pull request #838 from FoxxoTrystan/Shadekin

Shadekin

# Conflicts:
#	Resources/Prototypes/Body/species_base.yml
#	Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml
#	Resources/Prototypes/Guidebook/species.yml
#	Resources/Prototypes/Species/species_weights.yml

* Merge pull request #868 from FoxxoTrystan/Shadekin-Perf

Shadekin Performence

* Merge pull request #883 from FoxxoTrystan/Shadekin-Patch

Shadekin Patch + Markings

* Merge pull request #947 from RHSvenson/Shadekin_SurvivalBox

Added and implemented emergency boxes for nonbreathers

* Merge pull request #1861 from ilovehans10/shadekin-guidebook-typo-fixes

Shadekin guidebook typo fixes

* Mars -> Marrs (#2381)

<!-- IT'S NOT WIZDENS REPO, IF YOU WANT TO ADD YOUR CHANGES ON ALL
SERVERS, CREATE PR TO WIZDENS REPO -->

<!-- What do you propose to change with your PR? -->
Changes `@ mars` to `@ marr`s for Shadekin.

<!-- What is the reason for adding these changes? Please post links to
Discussions as well as Bug Reports here. Please describe how this will
change the game balance. -->
Parity with emote wheel. Also, `<PLAYERNAME> mars` feels weird.
(...probably because Mars as in the planet.)

<!--
If your PR contains in-game changes you must provide screenshots/videos
of the changes.
-->

<!-- check boxes for faster reviewing of your PR -->

- [X] I do not require assistance to complete the PR.
- [X] Before posting/requesting review of a PR, I have verified that the
changes work.
- [X] I have added screenshots/videos of the changes, or this PR does
not change in-game mechanics.
- [X] I affirm that my changes are licensed under the [Starlight Fork
License](https://github.com/ss14Starlight/space-station-14/blob/Starlight/LICENSE-Starlight.TXT)
and grant permission for use in this repository under its conditions.

**Changelog**
🆑 Fractalflower
- tweak: Changed Mar emote text to `@ marrs`.

* Fix shadekin guidebook resistance info (#2881)

The shadekin guidebook currently overstates the cellular resistance by
10% and vastly underestimates the bloodloss damage.

The guidebook being accurate helps guide player understanding.

<img width="563" height="669" alt="image"
src="https://github.com/user-attachments/assets/bece997a-5aa4-46f5-9b9f-2fe41dc98e97"
/>

- [X] I do not require assistance to complete the PR.
- [X] Before posting/requesting review of a PR, I have verified that the
changes work.
- [X] I have added screenshots/videos of the changes, or this PR does
not change in-game mechanics.
- [X] I affirm that my changes are licensed under the [Starlight Fork
License](https://github.com/ss14Starlight/space-station-14/blob/Starlight/LICENSE-Starlight.TXT)
and grant permission for use in this repository under its conditions.

**Changelog**

🆑 Penguinwizzard
- fix: Turns out that we were issuing wildly incorrect guidebooks on
Shadekin; an updated edition should now be available for crews.

* New Shadekin Disabilities

* Light hurts Shadekin

Shadekin should get more than a mild sunburn in extreme light

* Changes to make it work

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Foam Immunity Readded

* Flash Modifer works now

* Remove DarkLightComponent

* Add missing Locale for Markings from Den

* Fix Issues, Seperate from _DV namespace

* Yaml Linter Fixes

* ARGH

* ARGHv.2

* ARGHv.3

* Nutribatard instead of Baguette

* Exchange Nutribricks with PSB

* Cotton Baguette

* Changing away from BaseOrganic and Respirator Removal in Code

* Fulfill Content Review Requests

* Remove Eye Coloration - Unused

* Remove ShadekinPhase entirely

* Attribution correctly linked

* Review Changes

* done yml links correctly now

* yml format in shadekin effects

* Remove yml file mention and read Internal

* Readd Internals

* _StarLight -> _Starlight

* Port to Nubody and maybe fixing some fuckups

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Shadekin Yaml Errors

* Add missing markings name, add missing base_scale

* Remove Internal Removal in base_species. Make it Component based

* Add missing readonly

* Remove Non Breahter emergency boxes, Shadekin normal box

* DV Comment Fixes

* Untouched File?

* Use FlashMultiplierDurationEvent

* Add missing attribution

* Fixed scream attributions

* Shadekins can now properly succumb. Starlight#4746

---------

Co-authored-by: Matthew Herber <32679887+Happyrobot33@users.noreply.github.com>
Co-authored-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com>
Co-authored-by: Rinary <rinary.super@gmail.com>
Co-authored-by: FoxxoTrystan <trystan.garnierhein@gmail.com>
Co-authored-by: Tess_the_Evil <tessawfresh@gmail.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Tobias Berger <toby@tobot.dev>
Co-authored-by: Vanessa <vanessalouwagie@gmail.com>
2026-07-20 22:10:48 +00:00
Delta-V bot 2f5f2fd491 Automatic changelog update 2026-07-21 00:09:16 +02:00
018d65d99b Imp ports - Novice mark and wearable examine (#6118)
* Obvious Examine (#2462)

* Obvious Examine

* Feature creep is real

* Less words and better colors

* even fewer words, please

* Oops sorry yaml

* Refactor entire Obvious Examine system

* whitespace

---------

Co-authored-by: beck <163376292+widgetbeck@users.noreply.github.com>
# Conflicts:
#	Content.Shared/_Impstation/Examine/DetailedInspectComponent.cs
#	Content.Shared/_Impstation/Examine/DetailedInspectSystem.cs
#	Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl
#	Resources/Prototypes/Entities/Clothing/Neck/cloaks.yml
#	Resources/Prototypes/Entities/Clothing/Neck/medals.yml
#	Resources/Prototypes/Entities/Clothing/Neck/pins.yml
#	Resources/Prototypes/Entities/Clothing/Neck/scarfs.yml
#	Resources/Prototypes/_Impstation/Entities/Clothing/Neck/cloaks.yml
#	Resources/Prototypes/_Impstation/Entities/Clothing/Neck/misc.yml
#	Resources/Prototypes/_Impstation/Entities/Clothing/Neck/pins.yml
#	Resources/Prototypes/_Impstation/Entities/Clothing/Neck/scarfs.yml

* Novice's mark (#2626)

* Adding the item

* Update descriptions

* Add to trinket list, add to all trainee roles

* Add to PTech

* License fix

* And credit fix.

 Be nice it's my first sprite implementation lol
# Conflicts:
#	Resources/Prototypes/Catalog/VendingMachines/Inventories/cart.yml
#	Resources/Prototypes/Loadouts/loadout_groups.yml
#	Resources/Prototypes/Roles/Jobs/Engineering/technical_assistant.yml
#	Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml
#	Resources/Prototypes/_DV/Roles/Jobs/Cargo/cargo_assistant.yml
#	Resources/Prototypes/_Impstation/Entities/Clothing/Neck/pins.yml
#	Resources/Prototypes/_Impstation/Loadouts/Miscellaneous/trinkets.yml

* killing things i forgot to oops

* fix + select in loadouts for everyone

---------

Co-authored-by: January Nelson <inelsona@gmail.com>
Co-authored-by: beck <163376292+widgetbeck@users.noreply.github.com>
2026-07-20 17:08:56 -05:00
Delta-V bot ca91333906 Automatic changelog update 2026-07-20 22:29:21 +02:00
VanessaandSir Warock 2b1d0bb364 Locking Probers @ 750 Glimmer + Bigger Prober Explosions over 900 Glimmer (#6292)
* Lock the probers :)

* Added normality to oracle. Up'd max intensity to syndicate bomb levels per CR review.

* Apply suggestions from code review

Co-authored-by: Sir Warock <67167466+SirWarock@users.noreply.github.com>
Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>

---------

Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Co-authored-by: Sir Warock <67167466+SirWarock@users.noreply.github.com>
2026-07-20 22:29:02 +02:00
Delta-V bot a34e8bff90 Automatic changelog update 2026-07-20 22:14:18 +02:00
b67c029061 Port Item Offering from Euphoria (#5597)
* Item offering port (#96)

* Offer item system port

* More fixes

* Make the formatting a bit more readable

* Add a missing keybind

* Add missing alert click handler and make some of the code more readable

* Duplicate offer-item-system.ftl

Signed-off-by: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com>

* Namespace fix and prediction fixes

* Port various carrying and pseudo-item fixes from floofstation

* Refactor the offer system to hopefully bring more clarity

* Final fixes

* Final final final fixes maybe

* Sike, just do it the proper way

---------

Signed-off-by: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com>

* fixes

* empty commit (weird test fail?)

* Moved some stuff to shared. Reorganized a bit. I could be here all day...

---------

Signed-off-by: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com>
Co-authored-by: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com>
Co-authored-by: Vanessa <vanessalouwagie@gmail.com>
2026-07-20 15:13:57 -05:00
Delta-V bot 72f6bff008 Automatic changelog update 2026-07-20 22:07:19 +02:00
KOTOBandpre-commit-ci[bot] baf36b659d Freighter Crew's Jumpsuit (#6331)
* my larp...

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-07-20 20:06:59 +00:00
Delta-V bot 0488fcbf8c Automatic changelog update 2026-07-20 19:39:15 +02:00
KOTOBandVanessa edc2b87fa1 Cosmic Censer no longer requires fuel (#5016)
* fun allowed

* guidebook update

* Update Resources/Prototypes/_DV/CosmicCult/Objects/censer.yml

Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Signed-off-by: KOTOB <59124164+kotobdev@users.noreply.github.com>

* Update Resources/Prototypes/_DV/CosmicCult/Objects/censer.yml

Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Signed-off-by: KOTOB <59124164+kotobdev@users.noreply.github.com>

---------

Signed-off-by: KOTOB <59124164+kotobdev@users.noreply.github.com>
Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
2026-07-20 12:38:50 -05:00
Delta-V bot 3885aee7cf Automatic changelog update 2026-07-20 02:25:02 +02:00
ConstantlyConfused 859f0418ac Bring back the IPC "Boop" and "Whirr" emotes for cyborgs (#6310)
* return, buzz, whirr, and maybe boop emotes (for borgs)

* cleanup

* remove buzz, since it seems unused???
2026-07-19 19:24:43 -05:00
Delta-V bot d1385ab95b Automatic changelog update 2026-07-20 02:13:11 +02:00
1e45f2da21 Chef's Kimono (#6341)
* Adds the chef kimono

The drobe thing doesn't work yet

* Adds loadout groups

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Apply suggestion from @ShepardToTheStars

Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Signed-off-by: BriBrooo <45323530+Bribrooo@users.noreply.github.com>

* Rename ChefJobShoes to ChefShoes in loadouts

Signed-off-by: BriBrooo <45323530+Bribrooo@users.noreply.github.com>

---------

Signed-off-by: BriBrooo <45323530+Bribrooo@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
2026-07-19 19:12:51 -05:00
Delta-V bot 64c50527c3 Automatic changelog update 2026-07-19 18:38:45 +02:00
Myra d7ef3b4a06 Fix pills not having a taste (#5063) (#6299)
The edible-swallow locale message used by pills was missing the
{$flavors} placeholder that edible-nom, edible-slurp and edible-gulp
all have. IngestionSystem always passes the computed flavor text, so
pills silently dropped it. Eating a pill now shows its taste again,
e.g. "You swallow the pill. Tastes sweet."
2026-07-19 11:38:26 -05:00
Delta-V bot 23ec100ed8 Automatic changelog update 2026-07-19 18:19:49 +02:00
SumofThreePartsandVanessa d62ca61fb4 I halved the chance for the Escape objective, again. (#6323)
* Doing the thing again

Signed-off-by: SumofThreeParts <its.a.joke1000@gmail.com>

* Apply suggestions from code review

Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>

---------

Signed-off-by: SumofThreeParts <its.a.joke1000@gmail.com>
Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
2026-07-19 11:19:30 -05:00
Delta-V bot 229a857b7e Automatic changelog update 2026-07-19 18:19:07 +02:00
dd9c88ca4b Eventing Toolkit - The Great White (#6317)
* Added the Space Dragon Matriarch

* moved the fireball to its own projectile thingy

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Update Resources/Prototypes/_DV/Entities/Mobs/Player/dragon.yml

Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Signed-off-by: einknusprigestoast <90181825+einknusprigestoast@users.noreply.github.com>

* Fixed Parenting (god i wish this was this easy IRL)

* Huh?

* Accidentally deleted something i didnt want to delete

* Upped Blunt regeneration

* Apply suggestion from @ShepardToTheStars

Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Signed-off-by: einknusprigestoast <90181825+einknusprigestoast@users.noreply.github.com>

* Apply suggestion from @ShepardToTheStars

Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>

* Apply suggestion from @ShepardToTheStars

Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>

---------

Signed-off-by: einknusprigestoast <90181825+einknusprigestoast@users.noreply.github.com>
Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
2026-07-19 11:18:47 -05:00
github-actions[bot]andDeltaV-Bot aaad3b5c00 Update Credits (#6336)
Co-authored-by: DeltaV-Bot <github@deltav.gay>
2026-07-19 04:05:18 +02:00
Delta-V bot addfc247bf Automatic changelog update 2026-07-17 06:40:25 +02:00
6affab00ea Reworked hitman kits (#6270)
* Reworked hitman kits, first draft

* Fixed spacing for the kits

* Update hitman-case.ftl

Rename samurai to ninja kit

* Update hitman_case_catalog.yml

* Update hitman-case.yml

* fixed .ftl error

* Added blue oni mask to ninja kit

* fix hitman_case_catalog.yml, wrong mask ID

* Replaced the high frequency blade with a medium frequency blade - this weapon has a lower reflect chance, and deals heat damage instead of shock.

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Small tweak

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Stxcking <217132821+Stxcking@users.noreply.github.com>
2026-07-17 04:40:05 +00:00
Delta-V bot 7f85b2a196 Automatic changelog update 2026-07-17 06:31:43 +02:00
Velitation a7d25c697f Mime fashion (#6307)
* Added 3 new neck items, 1 new coat, 1 new shoe, and 2 new hats to mime loadout

Also added shoe selection to the mime loadout, new coat to the uniform printer, and new coat + boots to the autodrobe.

* Added missing newlines
2026-07-17 00:31:23 -04:00
Delta-V bot 61884f5fe1 Automatic changelog update 2026-07-17 05:51:10 +02:00
ollyoandStxcking ebcd3b23f9 Slime Nubody tweaks and new markings (incl. ports from Impstation) (#6288)
* Slime people tweaks and new markings (incl. ports from Impstation)
-Removed eyes, mouth, nose, and torso bitties from base Slime person sprite
   -Added them back in as optional markings (excl. mouth as Delta-V has lips already)
-Added the new "OrganSlimeEyes" to Slime people to handle eye markings
-Ported Cyclops and Droopy eyes from Impstation
   -Assigned Droopy eyes as "Droopy Eyes (Left)"
   -Made corresponding Droopy eyes on the right side
   -Added "Four eyes" marking
-Removed eyeshadow tattoo markings from Slime people
   -Added a copy into _DV's makeup directory assigned purely to Slime people
   -Made new matching eyeshadows for the various new eye types
-Adjusted the marking limits to make sense with the tweaks
-Moved and reorganized the Slime Elf Ears within the _DV directories to make more sense

* Fixed Slime people full.png sprite dimensions

* -Removed "followSkinColor" from Prototypes\_Impstation\Entities\Mobs\Customization\Markings\slime.yml causing an error

* Update Resources/Prototypes/Body/Species/slime.yml

Co-authored-by: Stxcking <217132821+Stxcking@users.noreply.github.com>
Signed-off-by: ollyo <296974732+ollyoaner@users.noreply.github.com>

* Update Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml

Co-authored-by: Stxcking <217132821+Stxcking@users.noreply.github.com>
Signed-off-by: ollyo <296974732+ollyoaner@users.noreply.github.com>

* Update Resources/Prototypes/Body/Species/slime.yml

Co-authored-by: Stxcking <217132821+Stxcking@users.noreply.github.com>
Signed-off-by: ollyo <296974732+ollyoaner@users.noreply.github.com>

* - Fixed formatting and improved in line comment readability.
- Moved eyeshadow additions from makeup to Slime categories
- Added "matchskin" to relevant body markings that are meant to follow skin color

* -Returned Eyeshadow to eye markings category
-Returned Slime to whitelisted group in tattoos.yml
-Removed Eye markings limit and the requirement to have eyes
-Added two new eyes to complement the r/l eyes for more eye mixing
-Tweaked inline readability and organization

* Removed outdated prototype MatchSkin from slime.yml

---------

Signed-off-by: ollyo <296974732+ollyoaner@users.noreply.github.com>
Co-authored-by: Stxcking <217132821+Stxcking@users.noreply.github.com>
2026-07-16 23:50:51 -04:00
Delta-V bot 1a23a02b5e Automatic changelog update 2026-07-16 22:24:47 +02:00
RileyandVanessa f6572840b1 Nuclear scientist (#6283)
* Added Nuclear Scientist alt job.

The Nuclear Reactor can be difficult for those to learn and easy for those to blow up.
Put the "experts" on the job.

* Fixed the meta

Meta fixses.

* Apply suggestions from code review

Thanks ShepardToTheStars.
I'm bad at doing these, but getting better.

Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Signed-off-by: Riley <applesmithworks@gmail.com>

---------

Signed-off-by: Riley <applesmithworks@gmail.com>
Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
2026-07-16 15:24:27 -05:00
Delta-V bot 8680f5c4fd Automatic changelog update 2026-07-15 20:43:48 +02:00
MD360 670b6d0858 Fugi paper fix (#6308)
* +\n

* missed one /n

* missed \n #2
2026-07-15 18:42:51 +00:00
Delta-V bot 94004e3ce0 Automatic changelog update 2026-07-15 03:58:24 +02:00
Vanessa fd09b8f68e Airlock Access Override Removes Access, Give Engineers Access Config (#6263)
* doors access is now broken.

* Access configs for Engi

* AI can see modified accesses now

* Added ability to see access on Engi borgs

* Fixed comment and namespace

* comment

* Also add to Revenant.

* Update Resources/Prototypes/_Mono/Recipes/Lathes/tools.yml

Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>

---------

Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
2026-07-15 03:58:05 +02:00
Delta-V bot d8edffcbb2 Automatic changelog update 2026-07-15 02:43:39 +02:00
VelitationandStxcking 8316434da2 Revert the upstream changes to the mime PDA (#6252)
* Reverted the upstream changes to the mime PDA

* Comment Change

---------

Co-authored-by: Stxcking <217132821+Stxcking@users.noreply.github.com>
2026-07-15 00:43:19 +00:00
Delta-V bot 6b03d1cc80 Automatic changelog update 2026-07-14 03:38:47 +02:00
Cepelinas1 2f68c7329f Give animals and pests nightvision (#5902)
* first

* fix a lot of things

* i forgot some mobs

* snails

* cooobras
2026-07-14 01:38:27 +00:00
Delta-V bot e8138473d1 Automatic changelog update 2026-07-14 02:30:25 +02:00
Field Command a114cf88d0 Midpoint pool addition! (#6242)
* Midpoint Pool Update

* Whoops, better remember disposals
2026-07-13 17:30:06 -07:00
Delta-V bot ff14cb6846 Automatic changelog update 2026-07-13 23:26:20 +02:00
e639f423f4 Minor Xenoborg Fixes and Tweaks (#6278)
* Disallowed crew IDs and talking over binary for xenoborg borgs.

* Added tag

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Add a EMP resistant battery

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* added EMP duration resistance

* Fixed attribution

* Fixed xenoborg magnet bags. Made the core suck up materials.

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Removed Xenoborg ID chips since they should never have more than Xenoborg access

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Apply suggestions from code review

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>

* meta.json ordering

---------

Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Radezolid <snappednexus@gmail.com>
2026-07-13 18:26:00 -03:00
Delta-V bot 57e5564ff8 Automatic changelog update 2026-07-13 22:37:11 +02:00
Vanessa 48921f9af9 no more animated zombie objects (#6291) 2026-07-13 22:36:52 +02:00
Delta-V bot 8bd44c5e7b Automatic changelog update 2026-07-13 21:58:45 +02:00
Coryn 303e1f4563 Cloning and Paradox Cone height workaround (#6205) 2026-07-13 14:58:25 -05:00
Delta-V bot 8003517bbc Automatic changelog update 2026-07-13 19:38:27 +02:00
Vanessa 6486b49bf3 Fixed derelict borg AA (#6284) 2026-07-13 14:38:08 -03:00
Vanessa aabf5ac1bb Fix syndie meal test failure (#6290) 2026-07-13 13:12:08 -04:00
Delta-V bot b4daabc55f Automatic changelog update 2026-07-13 18:16:39 +02:00
Velitationandpre-commit-ci[bot] 338ac84008 Add 2 new outfits and a mantle for mime (#6264)
* Added 2 new outfits and a mantle for mime

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Comment Addressed

- Removed changes from \Loadouts\loadout_groups.yml
- Made changes to \_DV\Loudouts\loutout_groups.yml

* Addressed Comment (again)

I missed a spot... oops
- Removed changes from \Loadouts\loadout_groups.yml
- Made changes to \_DV\Loadouts\loadout_groups.yml

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Probably shouldn't have made that second commit

My fault

- Undid the previous commit

* Removed duplicate

- Removed the duplicate loadoutGroup for MimeJumpsuit that I added to \_DV\Loadouts\loadout_groups.yml
- Readded the changes to \Loadouts\loadout_groups.yml

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-07-13 11:16:19 -05:00
Delta-V bot 61e8547327 Automatic changelog update 2026-07-13 16:24:44 +02:00
730cba2ee1 Remove telepads (#6266)
* Kill cargo telepad

* Remove telepad from random spawners & recipes

* Fixed comment conventions

* Update Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml

Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>

---------

Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Co-authored-by: Jessica Harvey <itsjessagain23@gmail.com>
Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
2026-07-13 14:24:24 +00:00
Delta-V bot 6089c30923 Automatic changelog update 2026-07-13 15:51:31 +02:00
ArionGekkotaandpre-commit-ci[bot] 4e6eee4854 Added the small arms mining kit (#6260)
* Added the small arms mining kit

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-07-13 08:51:12 -05:00
Delta-V bot 71302e037c Automatic changelog update 2026-07-13 15:46:44 +02:00
pootslap fd0a91733f Make improvised/forged weapons and armour uncraftable (#6250)
* remove recipes

thanks radezolid

* forge too
2026-07-13 08:46:24 -05:00
e7c0c98258 Adds Invisible Walls (#6287)
* Wow! Invisible!

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Update Resources/Prototypes/_DV/Entities/Structures/Walls/invisible.yml

Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Signed-off-by: William Lemon <William.Lemon2@gmail.com>

* Apply suggestion from @ShepardToTheStars

Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>

---------

Signed-off-by: William Lemon <William.Lemon2@gmail.com>
Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
2026-07-13 13:45:10 +00:00
Delta-V bot df99ef84f5 Automatic changelog update 2026-07-13 15:44:26 +02:00
7932eddb48 SRT Part 4 - The fake balancing strikes back (#6233)
* Added Caustic, Asphyxiation and Radiation regeneration.

* *coughs*

* Added the Eviscerator

* Removed explonades, added Truncheon

* whoops, stole the mateba from the rest of the teams

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* WHY DID IT DO THAT IT WAS NOT SUPPOSED TO DO THAT

* added Tags

* Update Resources/Prototypes/_DV/tags.yml

Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Signed-off-by: einknusprigestoast <90181825+einknusprigestoast@users.noreply.github.com>

* Update Resources/Prototypes/_DV/tags.yml

Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Signed-off-by: einknusprigestoast <90181825+einknusprigestoast@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Entities/Objects/Weapons/Guns/backpackfed.yml

Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Signed-off-by: einknusprigestoast <90181825+einknusprigestoast@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Entities/Objects/Weapons/Guns/backpackfed.yml

Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Signed-off-by: einknusprigestoast <90181825+einknusprigestoast@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Entities/Clothing/Back/specific.yml

Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Signed-off-by: einknusprigestoast <90181825+einknusprigestoast@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Entities/Clothing/Back/specific.yml

Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Signed-off-by: einknusprigestoast <90181825+einknusprigestoast@users.noreply.github.com>

---------

Signed-off-by: einknusprigestoast <90181825+einknusprigestoast@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
2026-07-13 08:44:06 -05:00
Delta-V bot 72efa8c9d3 Automatic changelog update 2026-07-13 15:32:24 +02:00
Coryn cdc8aeb3a6 Avali feather colors are correct again (#6285) 2026-07-13 08:32:04 -05:00
Delta-V bot 9e047522e9 Automatic changelog update 2026-07-13 15:16:46 +02:00
Field Command 2e7134f028 Xenoborgs have turrets now! (#6244)
Xenoborgs have turrets now
2026-07-13 08:16:25 -05:00
github-actions[bot]andDeltaV-Bot 8d772a67fa Update Credits (#6281)
Co-authored-by: DeltaV-Bot <github@deltav.gay>
2026-07-12 04:07:22 +02:00
TNE 310a2c6575 Add Meridian server config preset (#6277) 2026-07-11 23:47:08 +02:00
VelcroboyandVelcroboy 7b6a41b28f Map Edits: The Hive (#6107)
Co-authored-by: Velcroboy <velcroboy333@hotmail.com>
2026-07-11 13:04:53 -07:00
Delta-V bot 5ddec75e0b Automatic changelog update 2026-07-11 19:25:26 +02:00
3f29960640 PORT: Imp Learner pai (#5924)
* learner pais!  (#2269)

* almost published to master holy fuck

* vomits

* grhg

* mqole guiding light

* yupdate!

* escaped the torment nexus of losing my head

---------

Co-authored-by: mousesweater <moondogg228@gmail.com>

* fix where the sprites are

* learner pais!  (#2269)

* almost published to master holy fuck

* vomits

* grhg

* mqole guiding light

* yupdate!

* escaped the torment nexus of losing my head

---------

Co-authored-by: mousesweater <moondogg228@gmail.com>

* fix where the sprites are

* Adds a golden personal AI variant as a trinket, requiring 10hrs Silicon playtime

* Revert "Adds a golden personal AI variant as a trinket, requiring 10hrs Silicon playtime"

This reverts commit 4f545547ed.

* remove golden pai fix names

* move the imp item to the deltaV table (?)

* merge conflict ops

---------

Signed-off-by: Theo <rebe83a@gmail.com>
Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Co-authored-by: mousesweater <55769023+Mousetrinity@users.noreply.github.com>
Co-authored-by: mousesweater <moondogg228@gmail.com>
Co-authored-by: AftrLite <61218133+AftrLite@users.noreply.github.com>
Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
2026-07-11 17:25:07 +00:00
Delta-V bot fe940f0289 Automatic changelog update 2026-07-11 18:35:16 +02:00
70c0494061 Remove ion damage (#5960)
* comment out borg ion damage

* remove ion damage from disabler

* actually nuke it

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Additional removals.

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Vanessa <vanessalouwagie@gmail.com>
2026-07-11 16:34:56 +00:00
Delta-V bot 4b0b6ff16e Automatic changelog update 2026-07-11 18:30:27 +02:00
ollyoandpre-commit-ci[bot] e4826f3b8a Elf ears for Slime People (#6265)
* Added long ears markings to Slime people.
    -Ported and edited human long ear marking sprites to match Slime palette.
    -Placed Slime long ears in (HeadSide) marking slot
    -Placed a limit marking of 1 on HeadSide for Slime

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-07-11 16:30:07 +00:00
Delta-V bot a8796530e6 Automatic changelog update 2026-07-11 18:09:42 +02:00
Radezolid 1afb572366 Add a nanite applicator to the engie toolbelt (#6261)
* Added tools

* Kill the gas analyzer
2026-07-11 11:09:22 -05:00
Delta-V bot 08e4ee47c3 Automatic changelog update 2026-07-11 10:29:39 +02:00
Radezolid 097f165961 Re-add the knuckleduster to the LO's locker. (#6243)
Reverted
2026-07-11 10:29:19 +02:00
Delta-V bot a8cd6be09c Automatic changelog update 2026-07-10 22:22:01 +02:00
ArionGekkota 3698acd6d2 Allow allulalo to fit in bags (#6248)
* Allow allulalo to fit in bags

* Added delta-v comment
2026-07-10 22:21:41 +02:00
Delta-V bot b35b68b8aa Automatic changelog update 2026-07-10 22:20:28 +02:00
f585bcd233 toolbelt add multitool and welding mask because really it should have those (#6217)
* toolbelt add multitool and mask

* Update Resources/Prototypes/Catalog/Fills/Items/belt.yml

Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>

---------

Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Co-authored-by: stormyatt <stormyatt@users.noreply.github.com>
Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
2026-07-10 20:20:08 +00:00
Delta-V bot e2f79f2236 Automatic changelog update 2026-07-10 22:08:52 +02:00
CheddaCheez f4c6352dea Rodentia Ears + Whiskers (#6273)
Move marking and up limit

Whiskers moved from HeadTop to HeadSide.
HeadSide marking limit upped from 1 to 2.
2026-07-10 22:08:32 +02:00
Delta-V bot 54514adf64 Automatic changelog update 2026-07-10 21:58:37 +02:00
Vanessaandpre-commit-ci[bot] 75d30a857a Sometimes, dead is better. (DAGD On Death Implanters) (#6221)
* Added unrevivable implanter for DAGD

* Verbage

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Choose your own adventure

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* local and admin menu fixes

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-07-10 21:58:17 +02:00
Vanessa 519ca118c4 Merge pull request #6228 from DeltaV-Station/zombie-survival-fix
Fix Convert to Survival Behavior during Zombies
2026-07-10 14:17:30 -05:00
Delta-V bot ca1f82d430 Automatic changelog update 2026-07-10 19:22:57 +02:00
Vanessa d62a4911e7 MedHUDs no longer show your own health bar :) (#6241)
Im evil
2026-07-10 19:22:38 +02:00
Vanessa 2984ecbb8c Undo a change 2026-07-10 11:54:02 -05:00
Vanessa 304c99dc2e Removed a comment 2026-07-10 11:48:31 -05:00
Vanessa 8030fe1b2a Silly linq queries 2026-07-10 11:47:48 -05:00
Vanessa 795772ecc2 Switched up checks 2026-07-10 10:06:00 -05:00
Delta-V bot 37327a2c70 Automatic changelog update 2026-07-10 17:03:32 +02:00
Vanessa f3361860d2 Fix Tech Disk Test Failures (#6271) 2026-07-10 11:03:12 -04:00
Delta-V bot 86a9eff122 Automatic changelog update 2026-07-10 16:05:37 +02:00
Radezolid 2ff9e1d56a Raise the point price of seismic charges (#6245)
up goes the price
2026-07-10 09:05:17 -05:00
Delta-V bot 48f1cff536 Automatic changelog update 2026-07-10 15:59:49 +02:00
Carol a86501907f Add locked storage component to secure cabinets (#6269)
added LockedStorage component to secure cabinets
2026-07-10 08:59:29 -05:00
Delta-V bot 4bdcb0d556 Automatic changelog update 2026-07-09 20:03:39 +02:00
1351e0fb67 Rewrite of C3 introduction of C3.1-C3.3 (#5929)
* boop

* Update Resources/ServerInfo/Guidebook/_DV/Rules/RoleRules/C3_Antags.xml

Co-authored-by: This_Is_Gray <167829864+IAmNotGray@users.noreply.github.com>
Signed-off-by: Halo3moth <mdavid.wininger@gmail.com>

* Update Resources/ServerInfo/Guidebook/_DV/Rules/RoleRules/C3_Antags.xml

Co-authored-by: This_Is_Gray <167829864+IAmNotGray@users.noreply.github.com>
Signed-off-by: Halo3moth <mdavid.wininger@gmail.com>

* Update Resources/ServerInfo/Guidebook/_DV/Rules/RoleRules/C3_Antags.xml

Co-authored-by: BarryNorfolk <barrynorfolkman@protonmail.com>
Signed-off-by: Halo3moth <mdavid.wininger@gmail.com>

* Update Resources/ServerInfo/Guidebook/_DV/Rules/RoleRules/C3_Antags.xml

Co-authored-by: This_Is_Gray <167829864+IAmNotGray@users.noreply.github.com>
Signed-off-by: Halo3moth <mdavid.wininger@gmail.com>

---------

Signed-off-by: Halo3moth <mdavid.wininger@gmail.com>
Co-authored-by: This_Is_Gray <167829864+IAmNotGray@users.noreply.github.com>
Co-authored-by: BarryNorfolk <barrynorfolkman@protonmail.com>
2026-07-09 13:03:19 -05:00
Delta-V bot f8e59733dd Automatic changelog update 2026-07-09 15:29:26 +02:00
ConstantlyConfused 4750e885b2 Add missing Space Law Sections to the guidebook (#6223)
* move spacelaw into space law folder

* move procedural defense to its own file

* add sentences and modifers to SpaceLaw guidebook
2026-07-09 08:29:06 -05:00
Delta-V bot a7d34aacda Automatic changelog update 2026-07-09 13:39:08 +02:00
TheoandVanessa 91494215ca ghost buffers tweaks (#5981)
* tweaks

* Update Resources/Prototypes/Entities/Objects/Materials/ore.yml

Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Signed-off-by: Theo <tad3@illinois.edu>

---------

Signed-off-by: Theo <tad3@illinois.edu>
Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
2026-07-09 11:38:48 +00:00
ConstantlyConfused 5e50b6969c Fix the Umbroxol Description (#6247)
fix  the umbrox description
2026-07-09 06:25:03 -05:00
einknusprigestoast 4538b4ded1 Added Caustic, Asphyxiation and Radiation regeneration to the combat nanites. (#6231)
* Added Caustic, Asphyxiation and Radiation regeneration.

* *coughs*
2026-07-09 06:24:21 -05:00
Delta-V bot cdbf170b37 Automatic changelog update 2026-07-09 06:43:03 +02:00
freezer dog daf03f45ed bigger magnum boxes (and they fit in bandoliers now) (#6226)
* doubled magnum box capacity, whitelist for bandoliers holdin magnum cartridges, and fixed 2 misspellings (cause i mighta caused one of em oops)

* dumbass dog is stupid who woulda thunk it....
2026-07-08 23:42:43 -05:00
Delta-V bot 987678965f Automatic changelog update 2026-07-09 05:54:14 +02:00
Theo 663952f2fb Sabotage borg nerf (#6080)
* modules changed

* 1 tc change lol
2026-07-08 22:53:55 -05:00
Delta-V bot 46a37b1caf Automatic changelog update 2026-07-09 03:25:05 +02:00
jessiscah23andJessica Harvey bcc50db33b Fix salvage magnet asteroids not spawning in ore. (#5973)
Co-authored-by: Jessica Harvey <itsjessagain23@gmail.com>
2026-07-09 01:24:45 +00:00
Apersos-collandVanessa 30cfa646e4 Grav Gauntlet weapon changes and resprite (#5951)
* medium overhaul to weapon and sprite
removed taser
added Reflection (base 30% chance)
added speed up while in hand (25% speed up)
changed icon to fit more with artstyle plus bluesec
inhand sprites match new sprite

* OBSENLY SMALL CHANGED (small fixes to icon color and suitStorage being 1 to far up

* added clothing slowdown resist
added passive block modifier (makes it act like a shield)

* added/removed to fit with changes asked.
removed blocking
added prying
added higher damage

* fixing new sprite

* Update Hos-Briefcase.ftl

forgot to update discription

Signed-off-by: Apersos-coll <collsherlo@gmail.com>

* fixing new sprite

* fixing

* more fixing

* attempting to see if that was a false positive (fixing stuff)

i changed a word slightly to see if it was false positive cause i checked the log and there was no such mention of my weapon at all 
anyways i just changed a single word so if it works this time i dont have to make a second commit

Signed-off-by: Apersos-coll <collsherlo@gmail.com>

---------

Signed-off-by: Apersos-coll <collsherlo@gmail.com>
Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
2026-07-08 19:54:32 -05:00
ConstantlyConfused 91ff29416b Merge pull request #6251 from Eternally-Confused/blows-up-IPC
Remove another mention of IPCs
2026-07-08 17:07:28 -05:00
Vanessa 74d687ee4e Check if there are any pending zombies 2026-07-05 23:02:36 -05:00
Vanessa eef2b2215d whitespace 2026-07-05 22:41:46 -05:00
Vanessa b74569d20b Check II un-turned count. 2026-07-05 22:38:20 -05:00
1079 changed files with 30446 additions and 8481 deletions
+10 -19
View File
@@ -1,34 +1,25 @@
# Last match in file takes precedence.
# See https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners#example-of-a-codeowners-file
# C# code
/Content.*/ @DeltaV-Station/maintainers
# Any assets
/Resources/ @DeltaV-Station/maintainers
* @DeltaV-Station/maintainers
# Server config files
/Resources/ConfigPresets/ @Toby222
/Resources/ConfigPresets/ @DeltaV-Station/lead-maintainers
# Github workflows
/.github/ @DeltaV-Station/lead-maintainers
# Lobby art and music - automatically direction issues since its immediately visible to players
/Resources/Audio/Lobby/ @DeltaV-Station/direction
/Resources/Textures/LobbyScreens/ @DeltaV-Station/direction
/Resources/Audio/Lobby/ @DeltaV-Station/direction @DeltaV-Station/maintainers
/Resources/Textures/LobbyScreens/ @DeltaV-Station/direction @DeltaV-Station/maintainers
# Maps
/Resources/Maps/ @DeltaV-Station/maptainers
/Resources/Prototypes/Maps/ @DeltaV-Station/maptainers
/Content.IntegrationTests/Tests/PostMapInitTest.cs @DeltaV-Station/maptainers
/Content.IntegrationTests/Tests/PostMapInitTest.cs @DeltaV-Station/maptainers @DeltaV-Station/maintainers
# Server rules
/Resources/ServerInfo/Guidebook/_DV/Rules/ @DeltaV-Station/head-administrators
# Wiki
/.wiki/ @DeltaV-Station/direction
# Tools and scripts
/Tools/ @Toby222
# Workflows, codeowners, templates, etc.
/.github/ @Toby222
# Standalone files in the root repo
/* @Toby222
/.wiki/ @DeltaV-Station/direction
+1 -1
View File
@@ -26,7 +26,7 @@ This just saves them the trouble. Note that AGPL or MIT licensing is only applic
- [ ] I confirm that I am the creator of the code in this PR, and allow licensing it under the following license(s), or that the original author(s) has given me permission to do so:
- [X] AGPL (https://github.com/DeltaV-Station/Delta-v/blob/master/LICENSE-AGPLv3.txt) <!-- This one is required to contribute to DeltaV -->
- [X] MIT (https://github.com/DeltaV-Station/Delta-v/blob/master/LICENSE-MIT.txt) <!-- Optional - A lot of other SS14 forks use MIT -->
<!-- Feel free to add more licenses as you see fit -->
<!-- Feel free to add more licenses as you see fit -->
**Changelog**
<!-- Add a Changelog entry to make players aware of new features or changes that could affect gameplay.
@@ -2,6 +2,7 @@ using Content.Client.Cargo.UI;
using Content.Shared.Cargo.Components;
using JetBrains.Annotations;
using Robust.Client.UserInterface;
using Content.Shared._DV.Cargo.Components; // DeltaV: Bounty claim messages
namespace Content.Client.Cargo.BUI;
@@ -30,6 +31,18 @@ public sealed class CargoBountyConsoleBoundUserInterface : BoundUserInterface
{
SendMessage(new BountySkipMessage(id));
};
// DeltaV: bounty claim stuff begins
_menu.OnClaimButtonPressed += id =>
{
SendMessage(new BountyClaimedMessage(id));
};
_menu.OnStatusOptionSelected += (id, status) =>
{
SendMessage(new BountySetStatusMessage(id, status));
};
// DeltaV: bounty claim stuff ends
}
protected override void UpdateState(BoundUserInterfaceState message)
+14 -4
View File
@@ -10,6 +10,8 @@
<BoxContainer Orientation="Vertical" HorizontalExpand="True">
<RichTextLabel Name="RewardLabel"/>
<RichTextLabel Name="ManifestLabel"/>
<RichTextLabel Name="ClaimedBylabel"/> <!-- DeltaV bounty claim -->
<RichTextLabel Name="StatusLabel"/> <!-- DeltaV bounty claim -->
</BoxContainer>
<Control MinWidth="10"/>
<BoxContainer Orientation="Vertical" MinWidth="120">
@@ -17,14 +19,22 @@
<Button Name="PrintButton"
Text="{Loc 'bounty-console-label-button-text'}"
HorizontalExpand="False"
HorizontalAlignment="Right"
StyleClasses="OpenRight"/>
StyleClasses="OpenBoth"/>
<Button Name="SkipButton"
Text="{Loc 'bounty-console-skip-button-text'}"
HorizontalExpand="False"
HorizontalAlignment="Right"
HorizontalExpand="True"
StyleClasses="OpenLeft"/>
</BoxContainer>
<BoxContainer Orientation="Horizontal" MinWidth="120"> <!-- Begin DeltaV bounty claim content -->
<Button Name="ClaimButton"
Text= "{Loc 'bounty-console-claim-button-text'}"
HorizontalExpand="False"
StyleClasses="OpenRight"/>
<OptionButton Name="BountyStatusSelector"
Access="Public"
StyleClasses="OpenBoth"
HorizontalExpand="True"/>
</BoxContainer> <!-- End DeltaV content-->
<RichTextLabel Name="IdLabel" HorizontalAlignment="Right" Margin="0 0 5 0"/>
</BoxContainer>
</BoxContainer>
@@ -17,6 +17,8 @@ public sealed partial class BountyEntry : BoxContainer
public Action? OnLabelButtonPressed;
public Action? OnSkipButtonPressed;
public Action? OnClaimButtonPressed; // DeltaV
public Action? OnStatusOptionSelected; // DeltaV
public TimeSpan EndTime;
public TimeSpan UntilNextSkip;
@@ -45,6 +47,20 @@ public sealed partial class BountyEntry : BoxContainer
PrintButton.OnPressed += _ => OnLabelButtonPressed?.Invoke();
SkipButton.OnPressed += _ => OnSkipButtonPressed?.Invoke();
// Begin DeltaV bounty claiming
ClaimButton.OnPressed += _ => OnClaimButtonPressed?.Invoke();
BountyStatusSelector.AddItem(Loc.GetString($"bounty-console-status-{nameof(CargoBountyStatus.Undelivered)}"), 0);
BountyStatusSelector.AddItem(Loc.GetString($"bounty-console-status-{nameof(CargoBountyStatus.Waiting)}"), 1);
BountyStatusSelector.AddItem(Loc.GetString($"bounty-console-status-{nameof(CargoBountyStatus.OnShuttle)}"), 2);
BountyStatusSelector.Select((int) bounty.Status);
BountyStatusSelector.ToolTip = Loc.GetString($"bounty-console-status-tooltip-{bounty.Status.ToString()}");
var claimedByText = string.IsNullOrEmpty(bounty.ClaimedBy) ? Loc.GetString("bounty-console-claimed-by-none") : bounty.ClaimedBy;
ClaimedBylabel.SetMarkup(Loc.GetString("bounty-console-claimed-by", ("claimant", claimedByText)));
StatusLabel.SetMarkup(Loc.GetString($"bounty-console-status-formatted-{bounty.Status.ToString()}"));
// End DeltaV bounty claiming
}
private void UpdateSkipButton(float deltaSeconds)
+3 -2
View File
@@ -1,8 +1,9 @@
<controls:FancyWindow xmlns="https://spacestation14.io"
<!--DeltaV - SetSize was 550, now 750 to accomodate bounty claim UI -->
<controls:FancyWindow xmlns="https://spacestation14.io"
xmlns:gfx="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
Title="{Loc 'bounty-console-menu-title'}"
SetSize="550 420"
SetSize="750 420"
MinSize="400 350">
<BoxContainer Orientation="Vertical"
VerticalExpand="True"
@@ -11,6 +11,8 @@ public sealed partial class CargoBountyMenu : FancyWindow
{
public Action<string>? OnLabelButtonPressed;
public Action<string>? OnSkipButtonPressed;
public Action<string>? OnClaimButtonPressed; // DeltaV
public Action<string, int>? OnStatusOptionSelected; // DeltaV
public CargoBountyMenu()
{
@@ -31,6 +33,8 @@ public sealed partial class CargoBountyMenu : FancyWindow
var entry = new BountyEntry(b, untilNextSkip);
entry.OnLabelButtonPressed += () => OnLabelButtonPressed?.Invoke(b.Id);
entry.OnSkipButtonPressed += () => OnSkipButtonPressed?.Invoke(b.Id);
entry.OnClaimButtonPressed += () => OnClaimButtonPressed?.Invoke(b.Id); // DeltaV
entry.BountyStatusSelector.OnItemSelected += args => OnStatusOptionSelected?.Invoke(b.Id, args.Id); // DeltaV
BountyEntriesContainer.AddChild(entry);
}
@@ -59,9 +59,12 @@
<Label Text="{Loc 'health-analyzer-window-entity-temperature-text'}" />
<Label Name="TemperatureLabel" />
<Label Text="{Loc 'health-analyzer-window-entity-blood-level-text'}" />
<Label Name="BloodLabel" />
<Label Text="{Loc 'health-analyzer-window-entity-damage-total-text'}" />
<Label Name="DamageLabel" />
<!-- Begin DeltaV - Health Analyzer Plus -->
<Label Name="BloodLevelLabel" />
<!-- Label Name="BloodLabel" / -->
<!-- Label Text="{Loc 'health-analyzer-window-entity-damage-total-text'}" / -->
<!-- Label Name="DamageLabel" / -->
<!-- End DeltaV - Health Analyzer Plus -->
</GridContainer>
</BoxContainer>
@@ -73,10 +76,41 @@
<PanelContainer StyleClasses="LowDivider" />
<BoxContainer
Name="GroupsContainer"
Margin="0 5 0 5"
Orientation="Vertical">
</BoxContainer>
<!-- Begin DeltaV - Health Analyzer Plus -->
<!-- BoxContainer Name="GroupsContainer" Margin="0 5 0 5" Orientation="Vertical" -->
<!-- /BoxContainer -->
<GridContainer Margin="0 5 0 5" Columns="3" HorizontalAlignment="Center">
<BoxContainer Name="DamageBox" Margin="5 5 5 5" Orientation="Vertical">
<Label Name="TotalDamageLabel" HorizontalAlignment="Center" />
<PanelContainer Name="DamageGroupsDivider" StyleClasses="LowDivider" />
<Label
Name="NoDamageLabel"
HorizontalAlignment="Center"
Text="{Loc 'health-analyzer-plus-window-no-damage-text'}"
FontColorOverride="DeepSkyBlue"
Margin="0 5 0 5" />
<BoxContainer HorizontalAlignment="Center">
<BoxContainer Name="DamageGroupsContainer" Margin="0 5 0 5" Orientation="Vertical" />
</BoxContainer>
</BoxContainer>
<PanelContainer StyleClasses="LowDivider" />
<BoxContainer Name="BloodstreamBox" Margin="5 5 5 5" Orientation="Vertical">
<Label Name="TotalReagentQuantityLabel" HorizontalAlignment="Center" />
<PanelContainer Name="BloodstreamReagentsDivider" StyleClasses="LowDivider" />
<Label
Name="NoReagentsLabel"
HorizontalAlignment="Center"
Text="{Loc 'health-analyzer-plus-window-no-reagents-text'}"
FontColorOverride="DeepSkyBlue"
Margin="0 5 0 5" />
<BoxContainer HorizontalAlignment="Center">
<BoxContainer Name="BloodstreamReagentListContainer" Orientation="Vertical" Margin="0 5 0 5" />
</BoxContainer>
</BoxContainer>
</GridContainer>
<!-- End DeltaV - Health Analyzer Plus -->
</BoxContainer>
@@ -19,12 +19,25 @@ using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
// BEGIN DeltaV
using Content.Client._DV.Traits.Assorted;
using Content.Shared._DV.Traits.Assorted;
using Content.Shared._DV.Medical; // Uncloneable
using Content.Shared._DV.MedicalRecords; // Medical Records
// Health Analyzer Plus
using Content.Shared.Chemistry.Components;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.Body.Systems;
using Content.Client.Body.Systems;
using Content.Shared.Chemistry.EntitySystems;
using Content.Client.Chemistry.Containers.EntitySystems;
using Content.Shared.Body.Components;
// END DeltaV
namespace Content.Client.HealthAnalyzer.UI;
using Content.Client._DV.Traits.Assorted; // DeltaV
using Content.Shared._DV.Traits.Assorted; // DeltaV
using Content.Shared._DV.Medical; // DeltaV - Uncloneable
using Content.Shared._DV.MedicalRecords; // DeltaV - Medical Records
// Health analyzer UI is split from its window because it's used by both the
// health analyzer item and the cryo pod UI.
@@ -32,6 +45,8 @@ using Content.Shared._DV.MedicalRecords; // DeltaV - Medical Records
[GenerateTypedNameReferences]
public sealed partial class HealthAnalyzerControl : BoxContainer
{
private const string REAGENT_GROUP_MEDICINE = "Medicine"; // DeltaV - Health Analyzer
private readonly IEntityManager _entityManager;
private readonly SpriteSystem _spriteSystem;
private readonly IPrototypeManager _prototypes;
@@ -41,6 +56,8 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
private readonly UnborgableSystem _unborgable; // DeltaV
private readonly RedshirtSystem _redshirt; // DeltaV
private readonly UncloneableSystem _uncloneable; // DeltaV
private readonly SharedBloodstreamSystem _bloodstream; // DeltaV
private readonly SharedSolutionContainerSystem _solutionContainer; // DeltaV
// Begin DeltaV - Medical Records
private readonly ButtonGroup _triageStatusGroup = new();
@@ -66,6 +83,8 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
_unborgable = _entityManager.System<UnborgableSystem>(); // DeltaV
_redshirt = _entityManager.System<RedshirtSystem>(); // DeltaV
_uncloneable = _entityManager.System<UncloneableSystem>(); // DeltaV
_bloodstream = _entityManager.System<BloodstreamSystem>(); // DeltaV
_solutionContainer = _entityManager.System<SolutionContainerSystem>(); // DeltaV
// Begin DeltaV - Medical Records
foreach (var item in Enum.GetValues<TriageStatus>())
@@ -138,9 +157,13 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
? $"{state.Temperature - Atmospherics.T0C:F1} °C ({state.Temperature:F1} K)"
: Loc.GetString("health-analyzer-window-entity-unknown-value-text");
// Begin DeltaV - Health Analyzer Plus
/*
BloodLabel.Text = !float.IsNaN(state.BloodLevel)
? $"{state.BloodLevel * 100:F1} %"
: Loc.GetString("health-analyzer-window-entity-unknown-value-text");
*/
// End DeltaV - Health Analyzer Plus
StatusLabel.Text =
_entityManager.TryGetComponent<MobStateComponent>(target.Value, out var mobStateComponent)
@@ -149,7 +172,7 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
// Total Damage
DamageLabel.Text = _damageable.GetTotalDamage(target.Value).ToString();
// DamageLabel.Text = _damageable.GetTotalDamage(target.Value).ToString(); // DeltaV - Health Analyzer Plus
// Alerts
// DeltaV traits - This is going to be horrid if we just keep adding things like this.
@@ -216,6 +239,7 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
var damagePerType = _damageable.GetAllDamage(target.Value).DamageDict;
DrawDiagnosticGroups(damageSortedGroups, damagePerType);
DrawBloodstreamInfo(target.Value, state.BloodSolution, state.BloodLevel); // End DeltaV - Health Analyzer Plus
// Begin DeltaV - Medical Records
if (state.MedicalRecord is not { } records)
@@ -254,7 +278,15 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
Dictionary<ProtoId<DamageGroupPrototype>, FixedPoint2> groups,
IReadOnlyDictionary<ProtoId<DamageTypePrototype>, FixedPoint2> damageDict)
{
GroupsContainer.RemoveAllChildren();
// Begin DeltaV - Health Analyzer Plus
// GroupsContainer.RemoveAllChildren();
DamageGroupsContainer.RemoveAllChildren();
// Begin DeltaV - Health Analyzer Plus
var totalDamage = damageDict.Sum(x => x.Value.Double());
TotalDamageLabel.Text = Loc.GetString("health-analyzer-plus-window-entity-total-damage-text", ("amount", Math.Round(totalDamage, 2)));
NoDamageLabel.Visible = totalDamage == 0;
// End DeltaV - Health Analyzer Plus
foreach (var (damageGroupId, damageAmount) in groups)
{
@@ -275,7 +307,8 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
groupContainer.AddChild(CreateDiagnosticGroupTitle(groupTitleText, damageGroupId));
GroupsContainer.AddChild(groupContainer);
// GroupsContainer.AddChild(groupContainer); // DeltaV - Health Analyzer Plus
DamageGroupsContainer.AddChild(groupContainer); // DeltaV - Health Analyzer Plus
// Show the damage for each type in that group.
var group = _prototypes.Index(damageGroupId);
@@ -296,6 +329,116 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
}
}
// Begin DeltaV - Health Analyzer Plus
private void DrawBloodstreamInfo(EntityUid target, Solution? bloodSolution, float bloodlevel)
{
BloodstreamReagentListContainer.RemoveAllChildren();
List<ReagentQuantity> bloodstream = new();
double totalReagentQuantity = 0;
double unknownReagents = 0;
// Make sure we can access the bloodtype and reagents before trying to use them
if (bloodSolution is not null)
{
if (!_entityManager.TryGetComponent<BloodstreamComponent>(target, out var bloodstreamComp) ||
!_solutionContainer.ResolveSolution(target, bloodstreamComp.BloodSolutionName, ref bloodstreamComp.BloodSolution, out var bloodReagentSolution))
return;
// Get the blood reagent IDs to ignore in the scan
var bloodReagentIds = bloodstreamComp.BloodReferenceSolution.Select(b => b.Reagent);
// Get all of the medicines in the bloodstream
foreach (var reagent in bloodSolution!.Contents)
{
if (bloodReagentIds.Contains(reagent.Reagent))
continue;
if (_prototypes.Index<ReagentPrototype>(reagent.Reagent.Prototype).Group == REAGENT_GROUP_MEDICINE)
{
bloodstream.Add(reagent);
totalReagentQuantity += reagent.Quantity.Double();
}
else
{
unknownReagents += reagent.Quantity.Double();
}
}
}
var bloodQuantityPercent = !float.IsNaN(bloodlevel)
? $"{bloodlevel * 100:F1} %"
: Loc.GetString("health-analyzer-window-entity-unknown-value-text");
// Display the percent and amount of blood in the system
// Normal health scanner is percent only, this one adds the actual units too
BloodLevelLabel.Text = Loc.GetString(
"health-analyzer-plus-window-entity-blood-level-quantity-text",
("percent", bloodQuantityPercent)
);
// Display the total amount of reagents in the bloodstream, 0 is valid
TotalReagentQuantityLabel.Text = Loc.GetString(
"health-analyzer-plus-window-entity-total-reagents-text",
("amount", Math.Round(totalReagentQuantity, 1).ToString("0.0"))
);
// If the bloodstream was empty, display a message instead to fill the space with something
NoReagentsLabel.Visible = bloodstream.Count == 0 && unknownReagents == 0;
// For each of the reagents in the bloodstream, add them to the list of reagents
// If there are none, this loop will simply do nothing
foreach (var (reagentID, reagentQuantity) in bloodstream)
{
var reagentPrototype = _prototypes.Index<ReagentPrototype>(reagentID.Prototype);
// Make a new container for each reagent we add to the list
var reagentContainer = new BoxContainer
{
Align = AlignMode.Begin,
Orientation = LayoutOrientation.Vertical
};
// Add the string "[] <reagent_name>: <reagent_amount>u" for the current reagent
// The [] is a unicode block character, and is colored with the reagent color
// to make it easier to identify
reagentContainer.AddChild(
new RichTextLabel
{
Text = Loc.GetString("health-analyzer-plus-window-reagent-text",
("reagentColor", reagentPrototype.SubstanceColor),
("reagentName", reagentPrototype.LocalizedName),
("amount", Math.Round(reagentQuantity.Double(), 1).ToString("0.0"))
)
}
);
BloodstreamReagentListContainer.AddChild(reagentContainer);
}
// Add unknown reagents (if any)
if (unknownReagents > 0)
{
var unknownReagentContainer = new BoxContainer
{
Align = AlignMode.Begin,
Orientation = LayoutOrientation.Vertical
};
unknownReagentContainer.AddChild(
new RichTextLabel
{
Text = Loc.GetString("health-analyzer-plus-window-unknown-reagents-text",
("amount", Math.Round(unknownReagents, 1).ToString("0.0"))
)
}
);
BloodstreamReagentListContainer.AddChild(unknownReagentContainer);
}
return;
}
// End DeltaV - Health Analyzer Plus
private Texture GetTexture(string texture)
{
var rsiPath = new ResPath("/Textures/Objects/Devices/health_analyzer.rsi");
@@ -7,7 +7,9 @@
<ScrollContainer
Margin="5 5 5 5"
ReturnMeasure="True"
VerticalExpand="True">
VerticalExpand="True"
VScrollBarHidden="True"
HScrollBarHidden="True"> <!-- DeltaV - Hide the scroll bars -->
<ui:HealthAnalyzerControl
Name="HealthAnalyzer"
+3
View File
@@ -34,6 +34,9 @@ namespace Content.Client.Input
common.AddFunction(ContentKeyFunctions.RotateStoredItem);
common.AddFunction(ContentKeyFunctions.SaveItemLocation);
common.AddFunction(ContentKeyFunctions.Point);
// Floofstation section
common.AddFunction(ContentKeyFunctions.OfferItem);
// Floofstation section end
common.AddFunction(ContentKeyFunctions.ZoomOut);
common.AddFunction(ContentKeyFunctions.ZoomIn);
common.AddFunction(ContentKeyFunctions.ResetZoom);
@@ -9,6 +9,8 @@ using Content.Shared.Preferences;
using Robust.Client.UserInterface.Controls;
using Robust.Shared.Enums;
using Robust.Shared.Prototypes;
using Content.Client._CD.Records.UI; // DeltaV
using Content.Shared._DV.Body.Systems; // DeltaV
namespace Content.Client.Lobby.UI;
@@ -193,6 +195,7 @@ public sealed partial class HumanoidProfileEditor
RefreshLoadouts();
UpdateSexControls(); // update sex for new species
UpdateSpeciesGuidebookIcon();
UpdateHeightControls(); // DeltaV
ReloadPreview();
}
@@ -204,23 +207,22 @@ public sealed partial class HumanoidProfileEditor
ReloadProfilePreview();
}
private void UpdateHeightControls()
{
if (Profile == null)
{
return;
}
var species = _species.Find(x => x.ID == Profile.Species);
if (species != null)
_defaultHeight = species.DefaultHeight;
var prototype = _prototypeManager.Index(Profile.Species);
_defaultHeight = prototype.DefaultHeight;
var prototype = _prototypeManager.Index<SpeciesPrototype>(Profile.Species);
var sliderPercent = (Profile.Height - prototype.MinHeight) /
(prototype.MaxHeight - prototype.MinHeight);
CDHeightSlider.Value = sliderPercent;
CDHeight.Text = Profile.Height.ToString(CultureInfo.InvariantCulture);
var scaleReference = _defaultHeight * prototype.BaseScale.Y;
var newHeight = MathF.Round(MathHelper.Lerp(prototype.MinHeight, prototype.MaxHeight, sliderPercent), 2);
CDHeightLabel.Text = UnitConversion.GetMetricAndImperialDisplayFromScale(scaleReference * newHeight);
CDPullSpeedReductionLabel.Text = SmallCharacterSystem.GetPullSpeedPenaltyDisplayFromScale(newHeight);
}
// End CD - Character Records
@@ -73,9 +73,13 @@
<BoxContainer HorizontalExpand="True">
<Label Text="{Loc 'humanoid-profile-editor-height-label'}" />
<Control HorizontalExpand="True" />
<Label Name="CDHeightLabel" />
<Slider Name="CDHeightSlider" HorizontalAlignment="Right" SetWidth="300" MinValue="0.0" MaxValue="1.0"/>
<LineEdit HorizontalAlignment="Right" Name="CDHeight" MinSize="60 0" Text="1.0" />
<Button Name="CDHeightReset" Text="{Loc 'humanoid-profile-editor-reset-height-button'}" HorizontalAlignment="Right"/>
</BoxContainer>
<BoxContainer HorizontalExpand="True">
<Label Text="{Loc 'humanoid-profile-editor-height-pull-speed-penalty-label'}" />
<Control HorizontalExpand="True" />
<Label Name="CDPullSpeedReductionLabel" />
</BoxContainer>
<!-- End CD - Character Records -->
<!-- Sex -->
@@ -2,9 +2,6 @@ using Content.Client.Humanoid;
using Content.Client.Message;
using Content.Client.Players.PlayTimeTracking;
using Content.Client.Sprite;
using Content.Client.UserInterface.Systems.Guidebook;
using Content.Shared._DV.Species; // DeltaV - Species hider
using Content.Shared.Body;
using Content.Shared.CCVar;
using Content.Shared.GameTicking;
using Content.Shared.Humanoid;
@@ -22,13 +19,8 @@ using Robust.Shared.ContentPack;
using Robust.Shared.Enums;
using Robust.Shared.Prototypes;
using Direction = Robust.Shared.Maths.Direction;
// Begin CD - Character Records
using System.Globalization;
using Content.Client._CD.Records.UI;
using Content.Shared._CD.Records;
// End CD - Character Records
using Content.Shared._DV.Traits;
using Content.Shared.Humanoid.Prototypes; // DV - Traits
using Content.Client._CD.Records.UI; // CD - Character Records
using Content.Shared._DV.Body.Systems; // DV - Traits
namespace Content.Client.Lobby.UI
{
@@ -221,34 +213,18 @@ namespace Content.Client.Lobby.UI
// Begin CD - Character Records
#region CDHeight
CDHeight.OnTextChanged += args =>
{
if (Profile is null || !float.TryParse(args.Text, out var newHeight))
return;
var prototype = _prototypeManager.Index<SpeciesPrototype>(Profile.Species);
newHeight = MathF.Round(Math.Clamp(newHeight, prototype.MinHeight, prototype.MaxHeight), 2);
// The percentage between the start and end numbers, aka "inverse lerp"
var sliderPercent = (newHeight - prototype.MinHeight) /
(prototype.MaxHeight - prototype.MinHeight);
CDHeightSlider.Value = sliderPercent;
SetProfileHeight(newHeight);
};
CDHeightReset.OnPressed += _ =>
{
CDHeight.SetText(_defaultHeight.ToString(CultureInfo.InvariantCulture), true);
};
CDHeightSlider.OnValueChanged += _ =>
{
if (Profile is null)
return;
var prototype = _prototypeManager.Index<SpeciesPrototype>(Profile.Species);
var prototype = _prototypeManager.Index(Profile.Species);
var newHeight = MathF.Round(MathHelper.Lerp(prototype.MinHeight, prototype.MaxHeight, CDHeightSlider.Value), 2);
CDHeight.Text = newHeight.ToString(CultureInfo.InvariantCulture);
var speciesScale = prototype.BaseScale.Y;
CDHeightLabel.Text = UnitConversion.GetMetricAndImperialDisplayFromScale(newHeight * speciesScale);
CDPullSpeedReductionLabel.Text = SmallCharacterSystem.GetPullSpeedPenaltyDisplayFromScale(newHeight);
SetProfileHeight(newHeight);
};
@@ -75,9 +75,11 @@ public sealed partial class CrewMonitoringNavMapControl : NavMapControl
if (!LocalizedNames.TryGetValue(netEntity, out var name))
name = Loc.GetString("navmap-unknown-entity");
var pos = _xform.ToMapCoordinates(blip.Coordinates); // DeltaV - map-coordinates
var message = name + "\n" + Loc.GetString("navmap-location",
("x", MathF.Round(blip.Coordinates.X)),
("y", MathF.Round(blip.Coordinates.Y)));
("x", MathF.Round(pos.X)), // DeltaV - map-coordinates
("y", MathF.Round(pos.Y))); // DeltaV - map-coordinates
_trackedEntityLabel.Text = message;
_trackedEntityPanel.Visible = true;
@@ -88,9 +88,9 @@ public sealed partial class CryoPodWindow : FancyWindow
// Health analyzer
var maybePatient = _entityManager.GetEntity(msg.Health.TargetEntity);
var hasPatient = msg.Health.TargetEntity.HasValue;
var hasDamage = hasPatient && msg.HasDamage;
// var hasDamage = hasPatient && msg.HasDamage; // DeltaV - Health Analyzer Plus
NoDamageText.Visible = (hasPatient && !hasDamage);
NoDamageText.Visible = false; //(hasPatient && !hasDamage); // DeltaV - Health Analyzer Plus
HealthSection.Visible = hasPatient;
EjectPatientButton.Disabled = !hasPatient;
@@ -208,6 +208,7 @@ namespace Content.Client.Options.UI.Tabs
AddButton(ContentKeyFunctions.MovePulledObject);
AddButton(ContentKeyFunctions.ReleasePulledObject);
AddButton(ContentKeyFunctions.Point);
AddButton(ContentKeyFunctions.OfferItem); // Floofstation
AddButton(ContentKeyFunctions.RotateObjectClockwise);
AddButton(ContentKeyFunctions.RotateObjectCounterclockwise);
AddButton(ContentKeyFunctions.FlipObject);
@@ -11,6 +11,7 @@ using Content.Shared.StatusIcon;
using Content.Shared.StatusIcon.Components;
using Robust.Client.GameObjects;
using Robust.Client.Graphics;
using Robust.Client.Player; // DeltaV
using Robust.Shared.Enums;
using Robust.Shared.Prototypes;
using static Robust.Shared.Maths.Color;
@@ -22,6 +23,7 @@ namespace Content.Client.Overlays;
/// </summary>
public sealed class EntityHealthBarOverlay : Overlay
{
[Dependency] private readonly IPlayerManager _player = default!; // DeltaV
private readonly IEntityManager _entManager;
private readonly IPrototypeManager _prototype;
@@ -40,6 +42,8 @@ public sealed class EntityHealthBarOverlay : Overlay
public EntityHealthBarOverlay(IEntityManager entManager, IPrototypeManager prototype)
{
IoCManager.InjectDependencies(this); // DeltaV
_entManager = entManager;
_prototype = prototype;
_transform = _entManager.System<SharedTransformSystem>();
@@ -69,6 +73,11 @@ public sealed class EntityHealthBarOverlay : Overlay
out var damageableComponent,
out var spriteComponent))
{
// BEGIN DeltaV - You can't see your own bar :godo:
if (_player.LocalEntity is { } player && player.Id == uid.Id)
continue;
// END DeltaV
if (statusIcon != null && !_statusIconSystem.IsVisible((uid, _entManager.GetComponent<MetaDataComponent>(uid)), statusIcon))
continue;
@@ -85,41 +85,40 @@ public sealed class SalvageMagnetBoundUserInterface : BoundUserInterface
{
case AsteroidOffering asteroid:
option.Title = Loc.GetString($"dungeon-config-proto-{asteroid.Id}");
break; // DeltaV: Skip ores since they aren't used with custom generation
// var layerKeys = asteroid.MarkerLayers.Keys.ToList();
// layerKeys.Sort();
//
// foreach (var resource in layerKeys)
// {
// var count = asteroid.MarkerLayers[resource];
//
// var container = new BoxContainer
// {
// Orientation = BoxContainer.LayoutOrientation.Horizontal,
// HorizontalExpand = true,
// };
//
// var resourceLabel = new Label
// {
// Text = Loc.GetString("salvage-magnet-resources",
// ("resource", resource)),
// HorizontalAlignment = Control.HAlignment.Left,
// };
//
// var countLabel = new Label
// {
// Text = Loc.GetString("salvage-magnet-resources-count", ("count", count)),
// HorizontalAlignment = Control.HAlignment.Right,
// HorizontalExpand = true,
// };
//
// container.AddChild(resourceLabel);
// container.AddChild(countLabel);
//
// option.AddContent(container);
// }
//
// break;
var layerKeys = asteroid.MarkerLayers.Keys.ToList();
layerKeys.Sort();
foreach (var resource in layerKeys)
{
var count = asteroid.MarkerLayers[resource];
var container = new BoxContainer
{
Orientation = BoxContainer.LayoutOrientation.Horizontal,
HorizontalExpand = true,
};
var resourceLabel = new Label
{
Text = Loc.GetString("salvage-magnet-resources",
("resource", resource)),
HorizontalAlignment = Control.HAlignment.Left,
};
var countLabel = new Label
{
Text = Loc.GetString("salvage-magnet-resources-count", ("count", count)),
HorizontalAlignment = Control.HAlignment.Right,
HorizontalExpand = true,
};
container.AddChild(resourceLabel);
container.AddChild(countLabel);
option.AddContent(container);
}
break;
case DebrisOffering debris:
option.Title = Loc.GetString($"salvage-magnet-debris-{debris.Id}");
break;
@@ -1,9 +1,8 @@
<controls:FancyWindow xmlns="https://spacestation14.io"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
xmlns:customControls="clr-namespace:Content.Client.Administration.UI.CustomControls"
xmlns:chassisSpriteControls="clr-namespace:Content.Client._CD.Silicons.Borgs.UI"
Title="{Loc 'borg-select-type-menu-title'}"
SetSize="600 480">
SetSize="550 300">
<BoxContainer Orientation="Vertical">
<BoxContainer Orientation="Horizontal" VerticalExpand="True">
<!-- Left pane: selection of borg type -->
@@ -30,9 +29,6 @@
<RichTextLabel Name="DescriptionLabel" VerticalExpand="True" VerticalAlignment="Top" />
</BoxContainer>
</Control>
<chassisSpriteControls:ChassisSpriteSelection Name="ChassisSpriteSelection"/> <!-- CD change -->
<controls:ConfirmButton Name="ConfirmTypeButton" Text="{Loc 'borg-select-type-menu-confirm'}"
Disabled="True" HorizontalAlignment="Right"
MinWidth="200" />
@@ -1,7 +1,6 @@
using System.Linq;
using Content.Client.UserInterface.Controls;
using Content.Client.UserInterface.Systems.Guidebook;
using Content.Shared._CD.Silicons; // CosmicDrift
using Content.Shared.Guidebook;
using Content.Shared.Silicons.Borgs;
using Content.Shared.Silicons.Borgs.Components;
@@ -30,7 +29,6 @@ public sealed partial class BorgSelectTypeMenu : FancyWindow
private BorgTypePrototype? _selectedBorgType;
public event Action<ProtoId<BorgTypePrototype>>? ConfirmedBorgType;
public event Action<EntityPrototype?>? ConfirmedBorgSubtype; // CosmicDrift event - borg subtypes
private static readonly List<ProtoId<GuideEntryPrototype>> GuidebookEntries = new() { "Cyborgs", "Robotics" };
@@ -58,13 +56,6 @@ public sealed partial class BorgSelectTypeMenu : FancyWindow
ConfirmTypeButton.OnPressed += ConfirmButtonPressed;
HelpGuidebookIds = GuidebookEntries;
// Start CosmicDrift Changes - borg subtypes
ChassisSpriteSelection.SubtypeSelected += () =>
{
ConfirmTypeButton.Disabled = false;
};
// End CosmicDrift Changes - borg subtypes
}
private void UpdateInformation(BorgTypePrototype prototype)
@@ -96,14 +87,6 @@ public sealed partial class BorgSelectTypeMenu : FancyWindow
NameLabel.Text = PrototypeName(prototype);
DescriptionLabel.Text = Loc.GetString($"borg-type-{prototype.ID}-desc");
ChassisView.SetPrototype(prototype.DummyPrototype);
// Start CosmicDrift Changes - borg subtypes
if (_selectedBorgType != null)
{
ConfirmTypeButton.Disabled = true;
ChassisSpriteSelection.Update(_selectedBorgType);
}
// End CosmicDrift Changes - borg subtypes
}
private void ConfirmButtonPressed(BaseButton.ButtonEventArgs obj)
@@ -111,7 +94,6 @@ public sealed partial class BorgSelectTypeMenu : FancyWindow
if (_selectedBorgType == null)
return;
ConfirmedBorgSubtype?.Invoke(ChassisSpriteSelection.SubtypePrototype); // CosmicDrift
ConfirmedBorgType?.Invoke(_selectedBorgType);
}
@@ -1,6 +1,4 @@
using Content.Shared._CD.Silicons; // CosmicDrift
using Content.Shared._CD.Silicons.Borgs; // CosmicDrift
using Content.Shared.Silicons.Borgs.Components;
using Content.Shared.Silicons.Borgs.Components;
using JetBrains.Annotations;
using Robust.Client.UserInterface;
@@ -28,6 +26,5 @@ public sealed class BorgSelectTypeUserInterface : BoundUserInterface
_menu = this.CreateWindow<BorgSelectTypeMenu>();
_menu.ConfirmedBorgType += prototype => SendPredictedMessage(new BorgSelectTypeMessage(prototype));
_menu.ConfirmedBorgSubtype += subtypePrototype => SendPredictedMessage(new BorgSelectSubtypeMessage(subtypePrototype?.ID)); // CosmicDrift - borg subtypes
}
}
@@ -1,12 +1,9 @@
using Content.Client.PDA; // DeltaV
using Content.Shared._CD.Silicons.Borgs; // CosmicDrift
using Content.Client.PDA; // DeltaV
using Content.Shared.Movement.Components;
using Content.Shared.Silicons.Borgs;
using Content.Shared.Silicons.Borgs.Components;
using Robust.Client.GameObjects;
using Robust.Client.ResourceManagement; // CosmicDrift
using Robust.Shared.Serialization.TypeSerializers.Implementations; // CosmicDrift
using Robust.Shared.Timing; // CosmicDrift
using Robust.Shared.Serialization; // DeltaV
namespace Content.Client.Silicons.Borgs;
@@ -20,7 +17,6 @@ public sealed partial class BorgSwitchableTypeSystem : SharedBorgSwitchableTypeS
[Dependency] private readonly BorgSystem _borgSystem = default!;
[Dependency] private readonly AppearanceSystem _appearance = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
[Dependency] private readonly IGameTiming _timing = default!; // CosmicDrift - borg subtypes
public override void Initialize()
{
@@ -44,20 +40,15 @@ public sealed partial class BorgSwitchableTypeSystem : SharedBorgSwitchableTypeS
Entity<BorgSwitchableTypeComponent> entity,
BorgTypePrototype prototype)
{
// Begin Afterlight Addition - added checks to stop sprite state errors
if (!_timing.IsFirstTimePredicted)
return;
if (TryComp<BorgSwitchableSubtypeComponent>(entity, out var subtype) &&
subtype.BorgSubtype != null)
{
var ev = new TypeTryingToUpdateVisualsEvent();
RaiseLocalEvent(entity, ref ev);
return;
}
// End Afterlight Additions - added checks to stop sprite state errors
// Begin DeltaV Additions
if (prototype.ClientComponents is {} add)
EntityManager.AddComponents(entity, add);
// End DeltaV Additions
if (TryComp(entity, out SpriteComponent? sprite))
{
// Begin DeltaV Additions - work around engine bug with AddComponents
((ISerializationHooks) sprite).AfterDeserialization();
// End DeltaV Additions
_sprite.LayerSetRsiState((entity, sprite), BorgVisualLayers.Body, prototype.SpriteBodyState);
_sprite.LayerSetRsiState((entity, sprite), BorgVisualLayers.LightStatus, prototype.SpriteToggleLightState);
}
@@ -85,26 +76,6 @@ public sealed partial class BorgSwitchableTypeSystem : SharedBorgSwitchableTypeS
}
// DeltaV - borg pdas
// Start CosmicDrift Changes - borg subtypes
if (prototype.SpriteBodyMovementState is { } movementState)
{
var spriteMovement = EnsureComp<SpriteMovementComponent>(entity);
spriteMovement.NoMovementLayers.Clear();
spriteMovement.NoMovementLayers["movement"] = new PrototypeLayerData
{
State = prototype.SpriteBodyState,
};
spriteMovement.MovementLayers.Clear();
spriteMovement.MovementLayers["movement"] = new PrototypeLayerData
{
State = movementState,
};
}
else
{
RemComp<SpriteMovementComponent>(entity);
}
// End CosmicDrift Changes - borg subtypes
base.UpdateEntityAppearance(entity, prototype);
}
}
@@ -49,11 +49,6 @@
<Control HorizontalExpand="True" />
<Label Name="RecordContainerSpecies" Align="Right" />
</BoxContainer>
<BoxContainer Orientation="Horizontal" HorizontalExpand="True">
<Label Text="{Loc 'humanoid-profile-editor-cd-records-height'}"/>
<Control HorizontalExpand="True" />
<Label Name="RecordContainerHeight" Align="Right" />
</BoxContainer>
<BoxContainer Orientation="Horizontal" HorizontalExpand="True">
<Label Text="{Loc 'humanoid-profile-editor-cd-records-weight'}"/>
<Control HorizontalExpand="True" />
@@ -325,8 +325,7 @@ public sealed partial class CharacterRecordViewer : FancyWindow
RecordContainerJob.Text = record.JobTitle; /* At some point in the future we might want to display the icon */
RecordContainerGender.Text = record.Gender.ToString();
RecordContainerSpecies.Text = record.Species;
RecordContainerHeight.Text = cr.Height + " " + UnitConversion.GetImperialDisplayLength(cr.Height);
RecordContainerWeight.Text = cr.Weight + " " + UnitConversion.GetImperialDisplayMass(cr.Weight);
RecordContainerWeight.Text = $"{cr.Weight} ({UnitConversion.GetImperialDisplayMass(cr.Weight)})";
RecordContainerContactName.SetValue(cr.EmergencyContactName);
RecordContainerEmployment.Visible = false;
@@ -5,12 +5,6 @@
<BoxContainer Orientation="Vertical" HorizontalExpand="True" Margin="10">
<!-- Height, Weight -->
<GridContainer Columns="2">
<BoxContainer HorizontalExpand="True" SeparationOverride="2">
<Label Text="{Loc 'humanoid-profile-editor-cd-records-height'}" />
<Control HorizontalExpand="True" MinSize="5 0" />
<LineEdit Name="HeightEdit" HorizontalAlignment="Right" MinSize="60 0" />
<Label Name="HeightImperialLabel" MinWidth="60" />
</BoxContainer>
<BoxContainer HorizontalExpand="True" SeparationOverride="2">
<Label Text="{Loc 'humanoid-profile-editor-cd-records-weight'}" />
<Control HorizontalExpand="True" MinSize="5 0" />
@@ -25,14 +25,6 @@ public sealed partial class RecordEditorGui : Control
#region General
HeightEdit.OnTextChanged += args =>
{
if (!int.TryParse(args.Text, out var newHeight))
return;
UpdateImperialHeight(newHeight);
UpdateRecords(_records.WithHeight(newHeight));
};
WeightEdit.OnTextChanged += args =>
{
if (!int.TryParse(args.Text, out var newWeight))
@@ -128,8 +120,6 @@ public sealed partial class RecordEditorGui : Control
private void UpdateWidgets()
{
HeightEdit.SetText(_records.Height.ToString());
UpdateImperialHeight(_records.Height);
WeightEdit.SetText(_records.Weight.ToString());
UpdateImperialWeight(_records.Weight);
ContactNameEdit.SetText(_records.EmergencyContactName);
@@ -143,13 +133,8 @@ public sealed partial class RecordEditorGui : Control
PostmortemEdit.SetText(_records.PostmortemInstructions);
}
private void UpdateImperialHeight(int newHeight)
{
HeightImperialLabel.Text = UnitConversion.GetImperialDisplayLength(newHeight);
}
private void UpdateImperialWeight(int newWeight)
{
WeightImperialLabel.Text = UnitConversion.GetImperialDisplayMass(newWeight);
WeightImperialLabel.Text = $"({UnitConversion.GetImperialDisplayMass(newWeight)})";
}
}
@@ -2,15 +2,47 @@ namespace Content.Client._CD.Records.UI;
public static class UnitConversion
{
/// <summary>
/// DeltaV - The average height of a human in centimeters. According to the US CDC, its
/// 171 for men and 160 for women. So average of that is ~165cm.
///
/// Just kidding, we're going with EE's arbitrary standard of 175cm.
/// </summary>
private const int AVERAGE_HEIGHT_CM = 175;
/// <summary>
/// DeltaV - 1.0 scale is considered average for humans, so a scale of 1 will be 175cm.
/// Ensure that scale also includes the base species height AND the user-defined height.
/// </summary>
/// <param name="scale"></param>
/// <returns></returns>
private static int GetMetricHeightFromScale(float scale = 1)
{
// cast as int because we don't care about decimal
return (int)Math.Max(scale * AVERAGE_HEIGHT_CM, 1); // can't be shorter than 1cm I guess
}
/// <summary>
/// DeltaV - Gets nicely formatted string that contains both metric and imperial measurements.
/// With a scale of 1, it should look like... 175cm (5' 9")
/// </summary>
/// <param name="scale"></param>
/// <returns></returns>
public static string GetMetricAndImperialDisplayFromScale(float scale = 1)
{
var metricHeight = GetMetricHeightFromScale(scale);
return $"{metricHeight}cm ({GetImperialDisplayLength(metricHeight)})";
}
public static string GetImperialDisplayLength(int lengthCm)
{
var heightIn = (int) Math.Round(lengthCm * 0.3937007874 /* cm to in*/);
return $"({heightIn / 12}'{heightIn % 12}'')";
var heightIn = (int)Math.Round(lengthCm * 0.3937007874 /* cm to in*/);
return $"{heightIn / 12}'{heightIn % 12}\"";
}
public static string GetImperialDisplayMass(int massKg)
{
var weightLbs = (int) Math.Round(massKg * 2.2046226218 /* kg to lbs */);
return $"({weightLbs} lbs)";
var weightLbs = (int)Math.Round(massKg * 2.2046226218 /* kg to lbs */);
return $"{weightLbs} lbs";
}
}
@@ -1,102 +0,0 @@
using System.Linq;
using Content.Client.Silicons.Borgs;
using Content.Shared._CD.Silicons.Borgs;
using Content.Shared.Movement.Components;
using Content.Shared.Silicons.Borgs.Components;
using Robust.Client.GameObjects;
using Robust.Shared.Prototypes;
namespace Content.Client._CD.Silicons.Borgs;
/// <summary>
/// Primarily handles the appearance aspects of the borg subtype.
/// </summary>
public sealed class BorgSwitchableSubtypeSystem : SharedBorgSwitchableSubtypeSystem
{
[Dependency] private readonly SpriteSystem _sprite = default!;
[Dependency] private readonly BorgSystem _borg = default!;
[Dependency] private readonly AppearanceSystem _appearance = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<BorgSwitchableSubtypeComponent, ComponentStartup>(OnComponentStartup);
SubscribeLocalEvent<BorgSwitchableSubtypeComponent, AfterAutoHandleStateEvent>(OnAutoHandleEvent);
}
private void OnAutoHandleEvent(Entity<BorgSwitchableSubtypeComponent> ent, ref AfterAutoHandleStateEvent args)
{
SelectBorgSubtype(ent);
}
private void OnComponentStartup(Entity<BorgSwitchableSubtypeComponent> ent, ref ComponentStartup args)
{
SelectBorgSubtype(ent);
}
protected override void UpdateEntityAppearance(Entity<BorgSwitchableSubtypeComponent> entity, EntityPrototype borgSubtypePrototype)
{
// LOT of copy pasted code from BorgSwitchableTypeSystem, but is probably necessary unless the upstream code
// is refactored
if (!borgSubtypePrototype.TryGetComponent<BorgSubtypeDefinitionComponent>(out var borgSubtype, ComponentFactory))
return;
// get our required components
var (owner, _) = entity;
if (!TryComp<SpriteComponent>(entity, out var chassisSprite))
return;
// remove all existing layers
for (int i = chassisSprite.AllLayers.Count() - 1; i >= 0; i--)
{
_sprite.RemoveLayer((entity, chassisSprite), i);
}
for (int i = 0; i < borgSubtype.LayerData.Length; i++)
{
var layerData = borgSubtype.LayerData[i];
layerData.RsiPath = borgSubtype.SpritePath?.ToString();
if (borgSubtype.Offset != null)
layerData.Offset = borgSubtype.Offset;
_sprite.AddLayer((owner, chassisSprite), layerData, i);
}
if (TryComp<BorgChassisComponent>(entity, out var chassis))
{
_borg.SetMindStates(
(entity.Owner, chassis),
borgSubtype.SpriteHasMindState,
borgSubtype.SpriteNoMindState);
if (TryComp(entity, out AppearanceComponent? appearance))
{
// Queue update so state changes apply.
_appearance.QueueUpdate(entity, appearance);
}
}
if (borgSubtype.SpriteBodyMovementState is { } movementState)
{
var spriteMovement = EnsureComp<SpriteMovementComponent>(entity);
spriteMovement.NoMovementLayers.Clear();
spriteMovement.NoMovementLayers["movement"] = new PrototypeLayerData
{
State = borgSubtype.SpriteBodyState,
};
spriteMovement.MovementLayers.Clear();
spriteMovement.MovementLayers["movement"] = new PrototypeLayerData
{
State = movementState,
};
}
else
{
RemComp<SpriteMovementComponent>(entity);
}
base.UpdateEntityAppearance(entity, borgSubtypePrototype);
}
}
@@ -1,23 +0,0 @@
<Control xmlns="https://spacestation14.io"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls">
<BoxContainer Name="MainContainer"
Orientation="Vertical"
SeparationOverride="4"
Visible="False">
<controls:StripeBack>
<Label Text="{Loc 'cd-borg-select-subtype-flavour-text'}"
StyleClasses="LabelSubText"
HorizontalAlignment="Center"
Margin="0 12"/>
</controls:StripeBack>
<ScrollContainer Name="OptionsScrollContainer"
HScrollEnabled="True"
VScrollEnabled="False"
MinHeight="96">
<BoxContainer Name="OptionsContainer"
Orientation="Horizontal"
SeparationOverride="4"/>
</ScrollContainer>
</BoxContainer>
</Control>
@@ -1,99 +0,0 @@
using Content.Shared.Silicons.Borgs;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Prototypes;
namespace Content.Client._CD.Silicons.Borgs.UI;
[GenerateTypedNameReferences]
public sealed partial class ChassisSpriteSelection : Control
{
[Dependency] private readonly IComponentFactory _componentFactory = default!;
[Dependency] private readonly IPrototypeManager _prototype = default!;
public EntityPrototype? SubtypePrototype;
public event Action? SubtypeSelected;
private const int PrototypeViewSize = 2;
private static readonly ProtoId<EntityCategoryPrototype> _borgSubtypeCategory = "BorgSubtype";
public ChassisSpriteSelection()
{
RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
}
public void Update(BorgTypePrototype borgTypePrototype)
{
MainContainer.Visible = true;
OptionsContainer.RemoveAllChildren();
var buttonGroup = new ButtonGroup();
List<Button> buttons = new List<Button>();
buttons.Add(CreateDefaultSubtypeButton(borgTypePrototype, buttonGroup));
foreach (var ent in _prototype.Categories.GetValueRefOrNullRef(_borgSubtypeCategory))
{
if (!ent.TryGetComponent<Shared._CD.Silicons.Borgs.BorgSubtypeDefinitionComponent>(out var subtype, _componentFactory))
continue;
// Only add subtypes of the current selected 'main' borg type (engineering, medical, etc.)
if (subtype.ParentType != borgTypePrototype.ID)
continue;
var button = new Button
{
ToolTip = Loc.GetString($"al-borg-{borgTypePrototype.ID}-subtype-{ent.Name.Replace(' ', '-').ToLower()}-name"),
Group = buttonGroup,
MinHeight = 32,
};
button.OnPressed += _ =>
{
SubtypePrototype = ent;
SubtypeSelected?.Invoke();
};
button.AddChild(CreateEntityPrototypeView(subtype.DummyPrototype));
buttons.Add(button);
}
foreach (var button in buttons)
{
OptionsContainer.AddChild(button);
}
}
private Button CreateDefaultSubtypeButton(BorgTypePrototype borgTypePrototype, ButtonGroup group)
{
var button = new Button
{
ToolTip = "default",
Group = group,
MinHeight = 32,
};
button.OnPressed += _ =>
{
SubtypePrototype = null;
SubtypeSelected?.Invoke();
};
button.AddChild(CreateEntityPrototypeView(borgTypePrototype.DummyPrototype));
return button;
}
private EntityPrototypeView CreateEntityPrototypeView(EntProtoId entProtoId)
{
var entPrototypeView = new EntityPrototypeView();
entPrototypeView.SetPrototype(entProtoId);
entPrototypeView.Scale *= PrototypeViewSize;
return entPrototypeView;
}
}
@@ -0,0 +1,73 @@
using System.Linq;
using Content.Shared._DV.Forensics;
using Robust.Client.GameObjects;
using Robust.Client.ResourceManagement;
using Robust.Shared.Containers;
using Robust.Shared.Utility;
namespace Content.Client._DV.Forensics;
public sealed class DVItemSlotVisualsSystem : EntitySystem
{
[Dependency] private readonly SharedContainerSystem _container = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
[Dependency] private readonly IResourceCache _resourceCache = default!;
private static readonly ResPath TextureRoot = new("/Textures");
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<DVItemSlotVisualsComponent, EntInsertedIntoContainerMessage>(OnInsertedIntoContainer);
SubscribeLocalEvent<DVItemSlotVisualsComponent, EntRemovedFromContainerMessage>(OnRemovedFromContainer);
}
private void RefreshVisuals(Entity<DVItemSlotVisualsComponent> ent)
{
var slot = _container.EnsureContainer<ContainerSlot>(ent, ent.Comp.ItemSlot);
if (slot.ContainedEntity is { } contained)
{
_sprite.CopySprite(contained, ent.Owner);
_sprite.AddLayer(ent.Owner, ent.Comp.FilledSprite);
}
else
{
var sprite = Comp<SpriteComponent>(ent);
var count = sprite.AllLayers.Count();
for (var i = count - 1; i >= 0; i--)
{
_sprite.RemoveLayer((ent, sprite), i);
}
if (ent.Comp.UnfilledSprite is not SpriteSpecifier.Rsi rsi)
{
throw new InvalidOperationException($"{ToPrettyString(ent)} has an unfilled sprite that's not an RSI");
}
if (!_resourceCache.TryGetResource<RSIResource>(TextureRoot / rsi.RsiPath, out var res))
{
throw new InvalidOperationException($"{ToPrettyString(ent)} has invalid RSI: {TextureRoot / rsi.RsiPath}");
}
_sprite.SetBaseRsi(ent.Owner, res.RSI);
_sprite.AddLayer(ent.Owner, ent.Comp.UnfilledSprite);
}
}
private void OnInsertedIntoContainer(Entity<DVItemSlotVisualsComponent> ent, ref EntInsertedIntoContainerMessage args)
{
if (args.Container.ID != ent.Comp.ItemSlot)
return;
RefreshVisuals(ent);
}
private void OnRemovedFromContainer(Entity<DVItemSlotVisualsComponent> ent, ref EntRemovedFromContainerMessage args)
{
if (args.Container.ID != ent.Comp.ItemSlot)
return;
RefreshVisuals(ent);
}
}
@@ -0,0 +1,104 @@
using System.Numerics;
using Content.Client.Graphics;
using Robust.Client.Graphics;
using Robust.Shared.Enums;
using Robust.Shared.Prototypes;
namespace Content.Client._DV.Overlays;
/// <summary>
/// Makes darkness visible, and bright lights painfully visible
/// Tweakable. Algo is max((light*gain)^exp, lightFloor)
/// </summary>
public sealed class DarkVisionOverlay : Overlay
{
[Dependency] private readonly IClyde _clyde = default!;
[Dependency] private readonly IPrototypeManager _prototype = default!;
public override OverlaySpace Space => OverlaySpace.WorldSpaceBelowWorld;
private readonly ProtoId<ShaderPrototype> _shaderProto = "DarkVision";
public float LightFloor = 0.5f;
public float LightGain = 2f;
public float LightExp = 1f;
private readonly ShaderInstance _copyShader;
private readonly ShaderInstance _remapShader;
private readonly OverlayResourceCache<CachedResources> _resources = new();
public DarkVisionOverlay()
{
IoCManager.InjectDependencies(this);
var proto = _prototype.Index<ShaderPrototype>(_shaderProto);
_remapShader = proto.InstanceUnique();
// With floor 0, gain 1, exp 1 the shader is an exact blend-mode-none copy.
_copyShader = proto.InstanceUnique();
_copyShader.SetParameter("lightFloor", 0f);
_copyShader.SetParameter("lightGain", 1f);
_copyShader.SetParameter("lightExp", 1f);
}
protected override void Draw(in OverlayDrawArgs args)
{
var viewport = args.Viewport;
var worldHandle = args.WorldHandle;
if (viewport.Eye == null)
return;
var lightTarget = viewport.LightRenderTarget;
var res = _resources.GetForViewport(viewport, static _ => new CachedResources());
if (res.ScratchTarget?.Size != lightTarget.Size)
{
res.ScratchTarget?.Dispose();
res.ScratchTarget = _clyde.CreateLightRenderTarget(lightTarget.Size, "darkvision-scratch", depthStencil: false);
}
var bounds = args.WorldBounds;
var lightScale = lightTarget.Size / (Vector2) viewport.Size;
var scale = viewport.RenderScale / (Vector2.One / lightScale);
var localMatrix = lightTarget.GetWorldToLocalMatrix(viewport.Eye, scale);
// Copy the light buffer aside first: a texture can't be sampled while it is also the
// render target being drawn into.
worldHandle.RenderInRenderTarget(res.ScratchTarget, () =>
{
worldHandle.UseShader(_copyShader);
worldHandle.SetTransform(localMatrix);
worldHandle.DrawTextureRect(lightTarget.Texture, bounds);
worldHandle.UseShader(null);
}, Color.Black);
// Then write it back through the remap.
_remapShader.SetParameter("lightFloor", LightFloor);
_remapShader.SetParameter("lightGain", LightGain);
_remapShader.SetParameter("lightExp", LightExp);
worldHandle.RenderInRenderTarget(lightTarget, () =>
{
worldHandle.UseShader(_remapShader);
worldHandle.SetTransform(localMatrix);
worldHandle.DrawTextureRect(res.ScratchTarget.Texture, bounds);
worldHandle.UseShader(null);
}, null);
}
protected override void DisposeBehavior()
{
_resources.Dispose();
base.DisposeBehavior();
}
private sealed class CachedResources : IDisposable
{
public IRenderTexture? ScratchTarget;
public void Dispose()
{
ScratchTarget?.Dispose();
}
}
}
@@ -0,0 +1,56 @@
using Content.Shared._DV.Overlays.Components;
using Robust.Client.Graphics;
using Robust.Shared.Player;
namespace Content.Client._DV.Overlays;
public sealed class DarkVisionSystem : EntitySystem
{
[Dependency] private readonly IOverlayManager _overlayMan = default!;
[Dependency] private readonly ISharedPlayerManager _playerMan = default!;
private DarkVisionOverlay _overlay = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<DarkVisionComponent, ComponentInit>(OnInit);
SubscribeLocalEvent<DarkVisionComponent, ComponentShutdown>(OnShutdown);
SubscribeLocalEvent<DarkVisionComponent, LocalPlayerAttachedEvent>(OnPlayerAttached);
SubscribeLocalEvent<DarkVisionComponent, LocalPlayerDetachedEvent>(OnPlayerDetached);
_overlay = new();
}
private void OnInit(Entity<DarkVisionComponent> ent, ref ComponentInit args)
{
if (ent.Owner == _playerMan.LocalEntity)
EnableOverlay(ent.Comp);
}
private void OnShutdown(Entity<DarkVisionComponent> ent, ref ComponentShutdown args)
{
if (ent.Owner == _playerMan.LocalEntity)
_overlayMan.RemoveOverlay(_overlay);
}
private void OnPlayerAttached(Entity<DarkVisionComponent> ent, ref LocalPlayerAttachedEvent args)
{
EnableOverlay(ent.Comp);
}
private void OnPlayerDetached(Entity<DarkVisionComponent> ent, ref LocalPlayerDetachedEvent args)
{
_overlayMan.RemoveOverlay(_overlay);
}
private void EnableOverlay(DarkVisionComponent comp)
{
_overlay.LightFloor = comp.LightFloor;
_overlay.LightGain = comp.LightGain;
_overlay.LightExp = comp.LightExp;
if (!_overlayMan.HasOverlay<DarkVisionOverlay>())
_overlayMan.AddOverlay(_overlay);
}
}
@@ -1,5 +0,0 @@
using Content.Shared._DV.Silicons;
namespace Content.Client._DV.Silicons;
public sealed class SiliconEmpSystem : SharedSiliconEmpSystem;
@@ -0,0 +1,71 @@
using System.Numerics;
using Robust.Client.GameObjects;
using Robust.Client.Graphics;
using Robust.Client.Input;
using Robust.Client.UserInterface;
using Robust.Shared.Enums;
using Robust.Shared.Utility;
namespace Content.Client._Floof.OfferItem;
public sealed class OfferItemIndicatorsOverlay : Overlay
{
private readonly IInputManager _inputManager;
private readonly IEntityManager _entMan;
private readonly IEyeManager _eye;
private readonly OfferItemSystem _offer;
private readonly Texture _sight;
public override OverlaySpace Space => OverlaySpace.ScreenSpace;
private readonly Color _mainColor = Color.White.WithAlpha(0.3f);
private readonly Color _strokeColor = Color.Black.WithAlpha(0.5f);
private readonly float _scale = 0.6f; // 1 is a little big
public OfferItemIndicatorsOverlay(IInputManager input, IEntityManager entMan,
IEyeManager eye, OfferItemSystem offerSys)
{
_inputManager = input;
_entMan = entMan;
_eye = eye;
_offer = offerSys;
var spriteSys = _entMan.EntitySysManager.GetEntitySystem<SpriteSystem>();
_sight = spriteSys.Frame0(new SpriteSpecifier.Rsi(new("/Textures/_Floof/Interface/Misc/give_item.rsi"), "give_item"));
}
protected override bool BeforeDraw(in OverlayDrawArgs args)
{
if (!_offer.IsInOfferMode())
return false;
return base.BeforeDraw(in args);
}
protected override void Draw(in OverlayDrawArgs args)
{
var mouseScreenPosition = _inputManager.MouseScreenPosition;
var mousePosMap = _eye.PixelToMap(mouseScreenPosition);
if (mousePosMap.MapId != args.MapId)
return;
var mousePos = mouseScreenPosition.Position;
var uiScale = (args.ViewportControl as Control)?.UIScale ?? 1f;
var limitedScale = uiScale > 1.25f ? 1.25f : uiScale;
DrawSight(_sight, args.ScreenHandle, mousePos, limitedScale * _scale);
}
private void DrawSight(Texture sight, DrawingHandleScreen screen, Vector2 centerPos, float scale)
{
var sightSize = sight.Size * scale;
var expandedSize = sightSize + new Vector2(7f, 7f);
screen.DrawTextureRect(sight,
UIBox2.FromDimensions(centerPos - sightSize * 0.5f, sightSize), _strokeColor);
screen.DrawTextureRect(sight,
UIBox2.FromDimensions(centerPos - expandedSize * 0.5f, expandedSize), _mainColor);
}
}
@@ -0,0 +1,39 @@
using Content.Shared._Floof.OfferItem;
using Robust.Client.Graphics;
using Robust.Client.Input;
using Robust.Client.Player;
namespace Content.Client._Floof.OfferItem;
public sealed class OfferItemSystem : SharedOfferItemSystem
{
[Dependency] private readonly IOverlayManager _overlayManager = default!;
[Dependency] private readonly IPlayerManager _playerManager = default!;
[Dependency] private readonly IInputManager _inputManager = default!;
[Dependency] private readonly IEyeManager _eye = default!;
public override void Initialize()
{
base.Initialize();
_overlayManager.AddOverlay(new OfferItemIndicatorsOverlay(
_inputManager,
EntityManager,
_eye,
this));
}
public override void Shutdown()
{
_overlayManager.RemoveOverlay<OfferItemIndicatorsOverlay>();
base.Shutdown();
}
public bool IsInOfferMode()
{
var entity = _playerManager.LocalEntity;
if (entity == null)
return false;
return IsInOfferMode(entity.Value);
}
}
@@ -1,4 +1,5 @@
using Content.Server.Administration.Managers;
using Content.Shared._DV.Administration.Components; // DeltaV - Unorbitable
using Content.Shared.Administration;
using Robust.Shared.Console;
using Robust.Shared.Utility;
@@ -6,7 +7,7 @@ using Robust.Shared.Utility;
namespace Content.Server.Administration.Commands;
[AdminCommand(AdminFlags.Stealth)]
public sealed class StealthminCommand : LocalizedCommands
public sealed class StealthminCommand : LocalizedEntityCommands // DeltaV - Unorbitable, LocalizedCommands to LocalizedEntityCommands
{
[Dependency] private readonly IAdminManager _adminManager = default!;
@@ -26,8 +27,20 @@ public sealed class StealthminCommand : LocalizedCommands
DebugTools.AssertNotNull(adminData);
if (!adminData!.Stealth)
{
_adminManager.Stealth(player);
// DeltaV - Unorbitable START
if (player.AttachedEntity is { } attachedEntity)
EntityManager.EnsureComponent<UnorbitableComponent>(attachedEntity);
// DeltaV END
}
else
{
_adminManager.UnStealth(player);
// DeltaV - Unorbitable START
if (player.AttachedEntity is { } attachedEntity)
EntityManager.RemoveComponent<UnorbitableComponent>(attachedEntity);
// DeltaV END
}
}
}
@@ -1,5 +1,6 @@
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Content.Server.Access.Systems; // DeltaV
using Content.Server.Cargo.Components;
using Content.Server.NameIdentifier;
using Content.Shared.Access.Components;
@@ -20,6 +21,7 @@ using Robust.Shared.Prototypes;
using Robust.Shared.Random;
using Robust.Shared.Timing;
using Robust.Shared.Utility;
using Content.Shared._DV.Cargo.Components; // DeltaV: Bounty claim messages
namespace Content.Server.Cargo.Systems;
@@ -28,6 +30,7 @@ public sealed partial class CargoSystem
[Dependency] private readonly ContainerSystem _container = default!;
[Dependency] private readonly NameIdentifierSystem _nameIdentifier = default!;
[Dependency] private readonly EntityWhitelistSystem _whitelistSys = default!;
[Dependency] private readonly IdCardSystem _idCard = default!; // DeltaV
private static readonly ProtoId<NameIdentifierGroupPrototype> BountyNameIdentifierGroup = "Bounty";
@@ -40,6 +43,8 @@ public sealed partial class CargoSystem
SubscribeLocalEvent<CargoBountyConsoleComponent, BoundUIOpenedEvent>(OnBountyConsoleOpened);
SubscribeLocalEvent<CargoBountyConsoleComponent, BountyPrintLabelMessage>(OnPrintLabelMessage);
SubscribeLocalEvent<CargoBountyConsoleComponent, BountySkipMessage>(OnSkipBountyMessage);
SubscribeLocalEvent<CargoBountyConsoleComponent, BountyClaimedMessage>(OnBountyClaimedMessage); // DeltaV
SubscribeLocalEvent<CargoBountyConsoleComponent, BountySetStatusMessage>(OnSetBountyStatusMessage); // DeltaV
SubscribeLocalEvent<CargoBountyLabelComponent, PriceCalculationEvent>(OnGetBountyPrice);
SubscribeLocalEvent<EntitySoldEvent>(OnSold);
SubscribeLocalEvent<StationCargoBountyDatabaseComponent, MapInitEvent>(OnMapInit);
@@ -111,6 +116,72 @@ public sealed partial class CargoSystem
_audio.PlayPvs(component.SkipSound, uid);
}
// Begin DeltaV bounty claim system
private void OnSetBountyStatusMessage(Entity<CargoBountyConsoleComponent> ent, ref BountySetStatusMessage args)
{
if (_station.GetOwningStation(ent.Owner) is not { } station || !TryComp<StationCargoBountyDatabaseComponent>(station, out var bountyDbComp))
return;
for (var i = 0; i < bountyDbComp.Bounties.Count; i++)
{
var bounty = bountyDbComp.Bounties[i];
if (bounty.Id != args.BountyId)
continue;
var newData = new CargoBountyData
{
Id = bounty.Id,
Bounty = bounty.Bounty,
ClaimedBy = bounty.ClaimedBy,
Status = (CargoBountyStatus)args.Status,
};
bountyDbComp.Bounties[i] = newData;
}
var untilNextSkip = bountyDbComp.NextSkipTime - Timing.CurTime;
_uiSystem.SetUiState(ent.Owner, CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(bountyDbComp.Bounties, bountyDbComp.History, untilNextSkip));
}
private void OnBountyClaimedMessage(Entity<CargoBountyConsoleComponent> ent, ref BountyClaimedMessage args)
{
if (_station.GetOwningStation(ent.Owner) is not { } station || !TryComp<StationCargoBountyDatabaseComponent>(station, out var bountyDbComp))
return;
for (var i = 0; i < bountyDbComp.Bounties.Count; i++)
{
var bounty = bountyDbComp.Bounties[i];
if (bounty.Id != args.BountyId)
continue;
string name;
if (_idCard.TryFindIdCard(args.Actor, out var idCard) && idCard.Comp.FullName != null)
{
name = idCard.Comp.FullName;
}
else
{
name = Loc.GetString("bounty-console-claimed-by-unknown");
}
var newData = new CargoBountyData
{
Id = bounty.Id,
Bounty = bounty.Bounty,
ClaimedBy = name.Equals(bounty.ClaimedBy) ? string.Empty : name,
Status = bounty.Status,
};
bountyDbComp.Bounties[i] = newData;
}
var untilNextSkip = bountyDbComp.NextSkipTime - Timing.CurTime;
_uiSystem.SetUiState(ent.Owner, CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(bountyDbComp.Bounties, bountyDbComp.History, untilNextSkip));
}
// End DeltaV bounty claim system
public void SetupBountyLabel(EntityUid uid, EntityUid stationId, CargoBountyData bounty, PaperComponent? paper = null, CargoBountyLabelComponent? label = null)
{
if (!Resolve(uid, ref paper, ref label) || !_protoMan.Resolve<CargoBountyPrototype>(bounty.Bounty, out var prototype))
-1
View File
@@ -1,5 +1,4 @@
using Content.Server.Explosion.EntitySystems;
using Content.Shared.Damage; // DeltaV - EMP damage
using Content.Server.Power.EntitySystems;
using Content.Server.Radio;
using Content.Server.SurveillanceCamera;
@@ -23,6 +23,7 @@ using Robust.Shared.Timing;
using System.Linq;
using Content.Shared.EntityEffects.Effects.Solution;
using TimedDespawnComponent = Robust.Shared.Spawners.TimedDespawnComponent;
using Content.Server.Body.Components; // Delta V
namespace Content.Server.Fluids.EntitySystems;
@@ -267,7 +268,8 @@ public sealed class SmokeSystem : EntitySystem
if (!_solutionContainerSystem.ResolveSolution(entity, bloodstream.BloodSolutionName, ref bloodstream.BloodSolution, out var bloodSolution) || bloodSolution.AvailableVolume <= 0)
return;
var blockIngestion = _internals.AreInternalsWorking(entity);
var blockIngestion = _internals.AreInternalsWorking(entity)
|| !HasComp<RespiratorComponent>(entity); // Starlight - Shadekin does not breathe and "AreInternalsWorking" does not check for that
var cloneSolution = solution.Clone();
var availableTransfer = FixedPoint2.Min(cloneSolution.Volume, component.TransferRate);
@@ -1,3 +1,4 @@
using Content.Server.RoundEnd; // DeltaV
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
namespace Content.Server.GameTicking.Rules.Components;
@@ -43,4 +44,16 @@ public sealed partial class XenoborgsRuleComponent : Component
/// </summary>
[DataField]
public bool XenoborgShuttleCalled = false;
/// <summary>
/// DeltaV - The behavior of the round if the mothership core is deleted.
/// </summary>
[DataField]
public RoundEndBehavior XenoborgRoundEndBehavior = RoundEndBehavior.BecomeSurvival;
/// <summary>
/// DeltaV - The amount of time before the evac shuttle will arrive if the XenoborgRoundEndBehavior is set to ShuttleCall.
/// </summary>
[DataField]
public TimeSpan XenoborgShuttleDelay = TimeSpan.FromMinutes(10);
}
@@ -30,10 +30,20 @@ public sealed partial class ZombieRuleComponent : Component
/// <summary>
/// DeltaV - The behavior of the round if all zombies are defeated.
/// </summary>
[DataField]
public RoundEndBehavior ZombieRoundEndBehavior = RoundEndBehavior.BecomeSurvival;
/// <summary>
/// DeltaV - The amount of time before the evac shuttle will arrive if the ZombieRoundEndBehavior is set to ShuttleCall.
/// </summary>
[DataField]
public TimeSpan ZombieShuttleDelay = TimeSpan.FromMinutes(10);
/// <summary>
/// DeltaV - If true, ZombieRuleSystem will do the ZombieRoundEndBehavior if zombies are defeated.
/// This is needed because ZombieOutbreak uses the ZombieRuleComponent but the system won't know if
/// it was roundstart or not.
/// </summary>
[DataField]
public bool IsRoundStartZombies = false;
}
@@ -520,18 +520,17 @@ public sealed class NukeopsRuleSystem : GameRuleSystem<NukeopsRuleComponent>
// BEGIN DeltaV - Detect Nukie Failure Better
// We need to use a EntityQueryEnumerator instead of a EntityQuery, because we need the uid to check for cuffs
var operatives = new List<Entity<NukeOperativeComponent, MobStateComponent, TransformComponent>>();
var operativesEnumerator = EntityQueryEnumerator<NukeOperativeComponent, MobStateComponent, TransformComponent>();
while (operativesEnumerator.MoveNext(out var uid, out var nukeOp, out var mobState, out var transform))
var operatives = new List<Entity<NukeOperativeComponent, MobStateComponent>>();
var operativesEnumerator = EntityQueryEnumerator<NukeOperativeComponent, MobStateComponent>();
while (operativesEnumerator.MoveNext(out var uid, out var nukeOp, out var mobState))
{
operatives.Add((uid, nukeOp, mobState, transform));
operatives.Add((uid, nukeOp, mobState));
}
var operativesAlive = operatives
.Where(op => op.Comp3.MapID == shuttleMapId
|| op.Comp3.MapID == targetStationMap)
.Any(op => op.Comp2.CurrentState == MobState.Alive && op.Comp1.Running &&
!TryComp<CuffableComponent>(op, out _)); // in the case the crew keeps one alive
.Any(op => op.Comp1.Running
&& op.Comp2.CurrentState == MobState.Alive
&& TryComp<CuffableComponent>(op, out var cuffable) && cuffable.CuffedHandCount == 0); // in the case the crew keeps one alive
// END DeltaV
if (operativesAlive)
@@ -42,6 +42,14 @@ public sealed class XenoborgsRuleSystem : GameRuleSystem<XenoborgsRuleComponent>
colorOverride: AnnouncmentColor);
ent.Comp.MothershipCoreDeathAnnouncmentSent = true;
// BEGIN DeltaV - Convert to Survival
if (ent.Comp.XenoborgRoundEndBehavior != RoundEndBehavior.Nothing)
{
_roundEnd.DoRoundEndBehavior(ent.Comp.XenoborgRoundEndBehavior, ent.Comp.XenoborgShuttleDelay);
ent.Comp.XenoborgRoundEndBehavior = RoundEndBehavior.Nothing;
}
// END DeltaV
}
// TODO: Refactor the end of round text
@@ -18,6 +18,7 @@ using Content.Shared.Zombies;
using Robust.Shared.Player;
using Robust.Shared.Timing;
using System.Globalization;
using System.Linq; // DeltaV
namespace Content.Server.GameTicking.Rules;
@@ -114,27 +115,34 @@ public sealed class ZombieRuleSystem : GameRuleSystem<ZombieRuleComponent>
/// </summary>
private void CheckRoundEnd(ZombieRuleComponent zombieRuleComponent)
{
// BEGIN DeltaV - Change mode to survival if zombies die
// Zombies have failed to launch and the mode has been switched to survival
if (zombieRuleComponent.ZombieRoundEndBehavior == RoundEndBehavior.Nothing)
return;
// END DeltaV
var healthy = GetHealthyHumans();
if (healthy.Count == 1) // Only one human left. spooky
_popup.PopupEntity(Loc.GetString("zombie-alone"), healthy[0], healthy[0]);
// BEGIN DeltaV - Change mode to survival if zombies die
var infectedPercent = GetInfectedFraction(false);
if (Math.Round(infectedPercent, 0) == 0) // All zombies defeated
if (zombieRuleComponent.IsRoundStartZombies)
{
_roundEnd.DoRoundEndBehavior(zombieRuleComponent.ZombieRoundEndBehavior, zombieRuleComponent.ZombieShuttleDelay);
zombieRuleComponent.ZombieRoundEndBehavior = RoundEndBehavior.Nothing; // stop this check in the future
// Zombies have failed to launch and the mode has been switched to survival
if (zombieRuleComponent.ZombieRoundEndBehavior == RoundEndBehavior.Nothing)
return;
// BEGIN DeltaV - Change mode to survival if zombies die
var anyInitialInfectedAlive = EntityQuery<InitialInfectedComponent, MobStateComponent>(false)
.Any(x => x.Item2.CurrentState != MobState.Dead);
var anyLivingZombies = EntityQuery<ZombieComponent, MobStateComponent>(false)
.Any(x => x.Item2.CurrentState != MobState.Dead);
var anyPendingZombies = EntityQuery<PendingZombieComponent>(false).Any();
// All II turned/dead, all entities that have turned are dead, and there are no more pending zombies
if (!anyInitialInfectedAlive && !anyLivingZombies && !anyPendingZombies)
{
_roundEnd.DoRoundEndBehavior(zombieRuleComponent.ZombieRoundEndBehavior, zombieRuleComponent.ZombieShuttleDelay);
zombieRuleComponent.ZombieRoundEndBehavior = RoundEndBehavior.Nothing; // stop this check in the future
}
}
// END DeltaV
if (infectedPercent > zombieRuleComponent.ZombieShuttleCallPercentage && !_roundEnd.IsRoundEndRequested()) // DeltaV - Move GetInfectedFraction to var
if (GetInfectedFraction(false) > zombieRuleComponent.ZombieShuttleCallPercentage && !_roundEnd.IsRoundEndRequested())
{
foreach (var station in _station.GetStations())
{
+17 -1
View File
@@ -29,6 +29,7 @@ using Content.Shared.Movement.Systems;
using Content.Shared.NameModifier.EntitySystems;
using Content.Shared.Popups;
using Content.Server.Preferences.Managers; // DeltaV
using Content.Shared._DV.Administration.EntitySystems; // DeltaV - Unorbitable
using Content.Shared.Storage.Components;
using Content.Shared.Tag;
using Content.Shared.Warps;
@@ -41,6 +42,7 @@ using Robust.Shared.Player;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
using Robust.Shared.Timing;
using Content.Server.Mobs; // Starlight
namespace Content.Server.Ghost
{
@@ -74,6 +76,7 @@ namespace Content.Server.Ghost
[Dependency] private readonly GhostSpriteStateSystem _ghostState = default!;
[Dependency] private readonly IServerPreferencesManager _preferencesManager = default!; // DeltaV
[Dependency] private readonly IAdminManager _admin = default!; // DeltaV
[Dependency] private readonly UnorbitableSystem _unorbitable = default!; // DeltaV - Unorbitable
private EntityQuery<GhostComponent> _ghostQuery;
private EntityQuery<PhysicsComponent> _physicsQuery;
@@ -340,6 +343,11 @@ namespace Content.Server.Ghost
return;
}
// DeltaV - Unorbitable START
if (!_unorbitable.CanFollow(attached, realTarget))
return;
// DeltaV END
WarpTo(attached, realTarget);
}
@@ -619,7 +627,15 @@ namespace Content.Server.Ghost
_damageable.GetTotalDamage((playerEntity.Value, damageable));
}
DamageSpecifier damage = new(_prototypeManager.Index(AsphyxiationDamageType), dealtDamage);
// Starlight - Start
//DamageSpecifier damage = new(_prototypeManager.Index(AsphyxiationDamageType), dealtDamage);
var damageType = _prototypeManager.Index(AsphyxiationDamageType);
if (TryComp<DeathgaspComponent>(playerEntity, out var deathgasp))
damageType = _prototypeManager.Index(deathgasp.DamageType);
DamageSpecifier damage = new(damageType, dealtDamage);
// Starlight - End
_damageable.ChangeDamage(playerEntity.Value, damage, true);
}
@@ -23,6 +23,7 @@ using Content.Server.Body.Systems;
// Begin DeltaV
using Content.Server._DV.MedicalRecords;
using Content.Shared._DV.MedicalRecords;
using Content.Shared.Chemistry.Components;
// End DeltaV
namespace Content.Server.Medical;
@@ -269,9 +270,11 @@ public sealed partial class HealthAnalyzerSystem : EntitySystem // DeltaV - Made
var bleeding = false;
var unrevivable = false;
Solution? bloodSolution = null; // DeltaV - Health Analyzer Plus
if (TryComp<BloodstreamComponent>(entity, out var bloodstream) &&
_solutionContainerSystem.ResolveSolution(entity, bloodstream.BloodSolutionName,
ref bloodstream.BloodSolution, out var bloodSolution))
ref bloodstream.BloodSolution, out bloodSolution)) // DeltaV - Health Analyzer Plus
{
bloodAmount = _bloodstreamSystem.GetBloodLevel(entity);
bleeding = bloodstream.BleedAmount > 0;
@@ -287,6 +290,7 @@ public sealed partial class HealthAnalyzerSystem : EntitySystem // DeltaV - Made
null,
bleeding,
unrevivable,
bloodSolution, // DeltaV - Health Analyzer Plus
_medicalRecords.GetMedicalRecords(entity) // DeltaV - Medical Records
);
}
+9 -1
View File
@@ -1,4 +1,6 @@
using Content.Shared.Chat.Prototypes;
using Content.Shared.Chat.Prototypes; // Starlight
using Content.Shared.Damage.Prototypes; // Starlight
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
namespace Content.Server.Mobs;
@@ -21,4 +23,10 @@ public sealed partial class DeathgaspComponent : Component
/// </summary>
[DataField]
public bool NeedsCritical = true;
/// <summary>
/// Starlight - The damage that is taken when succumbing
/// </summary>
[DataField]
public ProtoId<DamageTypePrototype> DamageType = "Asphyxiation";
}
@@ -55,9 +55,13 @@ public sealed class PseudoItemSystem : SharedPseudoItemSystem
protected override void OnGettingPickedUpAttempt(EntityUid uid, PseudoItemComponent component, GettingPickedUpAttemptEvent args)
{
// Floof - changed this a bit to actually start a do-after
// Try to pick the entity up instead first
if (args.User != args.Item && _carrying.TryCarry(args.User, uid))
if (args.User != args.Item
&& TryComp<CarriableComponent>(uid, out var carriable)
&& _carrying.CanCarry(args.User, (uid, carriable)))
{
_carrying.StartCarryDoAfter(args.User, (uid, carriable));
args.Cancel();
return;
}
@@ -209,20 +209,24 @@ namespace Content.Server.Psionics.Glimmer
private void OnDestroyed(EntityUid uid, SharedGlimmerReactiveComponent component, DestructionEventArgs args)
{
Spawn("MaterialBluespace1", Transform(uid).Coordinates);
var proberCoords = Transform(uid).Coordinates;
var tier = _glimmerSystem.GetGlimmerTier();
if (tier < GlimmerTier.High)
return;
var totalIntensity = (float) (_glimmerSystem.Glimmer * 2);
var slope = (float) (11 - _glimmerSystem.Glimmer / 100);
var maxIntensity = 20;
var explosionMultiplier = 2;
if (_glimmerSystem.GetGlimmerTier() == GlimmerTier.Critical) // YOU DONE FUCKED UP
explosionMultiplier = 3;
var removed = (float) _glimmerSystem.Glimmer * _random.NextFloat(0.06f, 0.08f);
_glimmerSystem.Glimmer -= (int) removed;
var totalIntensity = (float)(_glimmerSystem.Glimmer * explosionMultiplier);
var slope = (float)(11 - _glimmerSystem.Glimmer / 100);
var maxIntensity = 75; // Same as syndicate bomb
var removed = _glimmerSystem.Glimmer * _random.NextFloat(0.06f, 0.08f);
_glimmerSystem.Glimmer -= (int)removed;
BeamRandomNearProber(uid, _glimmerSystem.Glimmer / 350, _glimmerSystem.Glimmer / 50);
_explosionSystem.QueueExplosion(uid, "Default", totalIntensity, slope, maxIntensity);
_explosionSystem.QueueExplosion(uid, "Default", totalIntensity, slope, maxIntensity, addLog: true);
Spawn("MaterialBluespace1", proberCoords); // Congrats on your bluespace!
}
private void OnUnanchorAttempt(EntityUid uid, SharedGlimmerReactiveComponent component, UnanchorAttemptEvent args)
@@ -230,7 +234,7 @@ namespace Content.Server.Psionics.Glimmer
if (component.Locked)
{
_sharedAudioSystem.PlayPvs(component.ShockNoises, args.User);
_electrocutionSystem.TryDoElectrocution(args.User, null, _glimmerSystem.Glimmer / 200, TimeSpan.FromSeconds((float) _glimmerSystem.Glimmer / 100), false);
_electrocutionSystem.TryDoElectrocution(args.User, uid, _glimmerSystem.Glimmer / 200, TimeSpan.FromSeconds((float) _glimmerSystem.Glimmer / 100), false);
args.Cancel();
}
}
@@ -184,7 +184,8 @@ public sealed class OracleSystem : EntitySystem
while (i != 0)
{
Spawn("MaterialBluespace1", Transform(user).Coordinates);
var entityToSpawn = _random.Next(0, 2) == 0 ? "MaterialBluespace1" : "CrystalNormality";
Spawn(entityToSpawn, Transform(user).Coordinates);
i--;
}
@@ -125,12 +125,12 @@ public sealed class ProjectileSystem : SharedProjectileSystem
RaiseLocalEvent(projectile, ref pierceEv);
// If the object won't be destroyed, it "tanks" the penetration hit.
if (damage.GetTotal() < damageRequired)
if (damage.GetTotal() < damageRequired && !pierceEv.Pierced) // DeltaV - Addition of the NT-3
{
return false;
}
if (!projectile.Comp.ProjectileSpent)
if (!projectile.Comp.ProjectileSpent && !pierceEv.Pierced) // DeltaV - Addition of the NT-3
{
projectile.Comp.PenetrationAmount += damageRequired;
// The projectile has dealt enough damage to be spent.
@@ -139,7 +139,7 @@ public sealed class ProjectileSystem : SharedProjectileSystem
return false;
}
if (projectile.Comp.ProjectileSpent && pierceEv.Pierced) // DeltaV - Addition of the NT-3
if (projectile.Comp.ProjectileSpent)
{
return true;
}
@@ -41,7 +41,8 @@ namespace Content.Server.StationEvents
if (TryComp<NextEventComponent>(uid, out var nextEventComponent)
&& _event.TryGenerateRandomEvent(component.ScheduledGameRules, TimeSpan.FromSeconds(component.TimeUntilNextEvent)) is {} firstEvent)
{
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-run-event-delayed", ("eventName", firstEvent), ("seconds", (int)component.TimeUntilNextEvent)));
var nextEventTime = GameTicker.RoundDuration() + TimeSpan.FromSeconds(component.TimeUntilNextEvent);
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-run-event-delayed", ("eventName", firstEvent), ("time", nextEventTime.ToString(@"hh\:mm\:ss"))));
_next.UpdateNextEvent(nextEventComponent, firstEvent, GameTicker.RoundDuration() + TimeSpan.FromSeconds(component.TimeUntilNextEvent));
}
// End DeltaV Additions
@@ -81,7 +82,7 @@ namespace Content.Server.StationEvents
if (_event.TryGenerateRandomEvent(eventScheduler.ScheduledGameRules, nextEventTime) is not {} generatedEvent)
continue;
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-run-event-delayed", ("eventName", generatedEvent), ("seconds", (int)eventScheduler.TimeUntilNextEvent)));
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-run-event-delayed", ("eventName", generatedEvent), ("time", nextEventTime.ToString(@"hh\:mm\:ss"))));
// Cycle the stashed event with the new generated event and time.
var storedEvent = _next.UpdateNextEvent(nextEventComponent, generatedEvent, nextEventTime);
if (string.IsNullOrEmpty(storedEvent)) //If there was no stored event don't try to run it.
@@ -14,9 +14,12 @@ public sealed class RampingStationEventSchedulerSystem : GameRuleSystem<RampingS
[Dependency] private readonly IChatManager _chatManager = default!; // DeltaV
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly EventManagerSystem _event = default!;
#if DEBUG // DeltaV - Only used if built by Debug
[Dependency] private readonly GameTicker _gameTicker = default!;
#endif
[Dependency] private readonly NextEventSystem _next = default!; // DeltaV
[Dependency] private readonly IGameTiming _timing = default!; // DeltaV
/* DeltaV
/// <summary>
/// Returns the ChaosModifier which increases as round time increases to a point.
@@ -50,7 +53,8 @@ public sealed class RampingStationEventSchedulerSystem : GameRuleSystem<RampingS
if (TryComp<NextEventComponent>(uid, out var nextEventComponent)
&& _event.TryGenerateRandomEvent(component.ScheduledGameRules, TimeSpan.FromSeconds(component.TimeUntilNextEvent)) is {} firstEvent)
{
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-run-event-delayed", ("eventName", firstEvent), ("seconds", (int)component.TimeUntilNextEvent)));
var nextEventTime = GameTicker.RoundDuration() + TimeSpan.FromSeconds(component.TimeUntilNextEvent);
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-run-event-delayed", ("eventName", firstEvent), ("time", nextEventTime.ToString(@"hh\:mm\:ss"))));
_next.UpdateNextEvent(nextEventComponent, firstEvent, GameTicker.RoundDuration() + TimeSpan.FromSeconds(component.TimeUntilNextEvent));
}
// End DeltaV Additions: init NextEventComp
@@ -83,7 +87,7 @@ public sealed class RampingStationEventSchedulerSystem : GameRuleSystem<RampingS
if (_event.TryGenerateRandomEvent(scheduler.ScheduledGameRules, nextEventTime) is not {} generatedEvent)
continue;
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-run-event-delayed", ("eventName", generatedEvent), ("seconds", (int)scheduler.TimeUntilNextEvent)));
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-run-event-delayed", ("eventName", generatedEvent), ("time", nextEventTime.ToString(@"hh\:mm\:ss"))));
// Cycle the stashed event with the new generated event and time.
string? storedEvent = _next.UpdateNextEvent(nextEventComponent, generatedEvent, nextEventTime);
if (string.IsNullOrEmpty(storedEvent)) //If there was no stored event don't try to run it.
@@ -114,13 +118,28 @@ public sealed class RampingStationEventSchedulerSystem : GameRuleSystem<RampingS
// Begin DeltaV Additions
var averageTimeUntilNextEvent = component.TimeKeyPoints[0].Y;
var timeUntilNextEventDeviation = _random.NextFloat(-1f, 1f) * component.TimeDeviation;
var roundTime = (float)_gameTicker.RoundDuration().TotalMinutes;
var absoluteTimePoint = 0f;
var ruleActivated = TimeSpan.FromSeconds(0);
if (TryComp<GameRuleComponent>(uid, out var gameRule))
{
ruleActivated = gameRule.ActivatedAt;
}
var ruleTime = _timing.CurTime.Subtract(ruleActivated);
#if DEBUG
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-debug-round-time", ("time", _gameTicker.RoundDuration())));
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-debug-ramping-time", ("time", ruleActivated)));
// This will be what the keypoint system looks at to determine where to start ramping
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-debug-keypoint-time", ("time", ruleTime)));
_chatManager.SendAdminAlert("_______________"); // Easier to read
#endif
var absoluteTimePoint = 0f;
foreach (var point in component.TimeKeyPoints)
{
absoluteTimePoint += point.X;
if (roundTime >= absoluteTimePoint)
if (ruleTime.TotalMinutes >= absoluteTimePoint)
averageTimeUntilNextEvent = point.Y;
}
@@ -1,43 +0,0 @@
using Content.Shared._CD.Silicons.Borgs;
using Content.Shared.Inventory;
namespace Content.Server._CD.Silicons.Borgs;
/// <summary>
/// Server-side logic that shouldn't be exposed to the client.
/// </summary>
public sealed class BorgSwitchableSubstypeSystem : SharedBorgSwitchableSubtypeSystem
{
[Dependency] private readonly InventorySystem _inventorySystem = default!;
protected override void SelectBorgSubtype(Entity<BorgSwitchableSubtypeComponent> ent)
{
if (ent.Comp.BorgSubtype == null)
return;
if (!Prototypes.Index(ent.Comp.BorgSubtype.Value)
.TryGetComponent<BorgSubtypeDefinitionComponent>(out var borgSubtype, ComponentFactory))
return;
// Configure special components
if (Prototypes.TryIndex(ent.Comp.BorgSubtype, out var previousPrototype) &&
previousPrototype.TryGetComponent<BorgSubtypeDefinitionComponent>(out var previousSubtype, ComponentFactory))
{
if (previousSubtype.AddComponents is { } removeComponents)
EntityManager.RemoveComponents(ent, removeComponents);
}
if (borgSubtype.AddComponents is { } addComponents)
{
EntityManager.AddComponents(ent, addComponents);
}
// inventory template configuration (hats spacing)
if (TryComp(ent, out InventoryComponent? inventory))
{
_inventorySystem.SetTemplateId((ent.Owner, inventory), borgSubtype.InventoryTemplateId);
}
base.SelectBorgSubtype(ent);
}
}
@@ -75,8 +75,7 @@ public sealed partial class CosmicFinaleComponent : Component
{ "Blunt", 2.25},
{ "Cold", 2.25},
{ "Radiation", 2.25},
{ "Asphyxiation", 2.25},
{ "Ion", 2.25}
{ "Asphyxiation", 2.25}
}
};
}
@@ -174,7 +174,7 @@ public sealed partial class CosmicCultSystem : SharedCosmicCultSystem
if (!EntityIsCultist(args.Equipee))
{
_statusEffects.TryAddStatusEffect<CosmicEntropyDebuffComponent>(args.Equipee, EntropicDegen, TimeSpan.FromDays(1), true); // TimeSpan.MaxValue causes a crash here, so we use FromDays(1) instead.
if (TryComp<CosmicEntropyDebuffComponent>(args.Equipee, out var comp)) comp.Degen = new(){DamageDict = new(){{"Cold", 0.5}, {"Asphyxiation", 1.5}, {"Ion", 1.5}}};
if (TryComp<CosmicEntropyDebuffComponent>(args.Equipee, out var comp)) comp.Degen = new(){DamageDict = new(){{"Cold", 0.5}, {"Asphyxiation", 1.5}}};
}
}
@@ -188,7 +188,7 @@ public sealed partial class CosmicCultSystem : SharedCosmicCultSystem
if (!EntityIsCultist(args.User))
{
_statusEffects.TryAddStatusEffect<CosmicEntropyDebuffComponent>(args.User, EntropicDegen, TimeSpan.FromDays(1), true);
if (TryComp<CosmicEntropyDebuffComponent>(args.User, out var comp)) comp.Degen = new(){DamageDict = new(){{"Cold", 0.5}, {"Asphyxiation", 1.5}, {"Ion", 1.5}}};
if (TryComp<CosmicEntropyDebuffComponent>(args.User, out var comp)) comp.Degen = new(){DamageDict = new(){{"Cold", 0.5}, {"Asphyxiation", 1.5}}};
_popup.PopupEntity(Loc.GetString("cosmiccult-gear-pickup", ("ITEM", args.Equipped)), args.User, args.User, PopupType.MediumCaution);
}
}
@@ -75,8 +75,7 @@ public sealed class CosmicRiftSystem : EntitySystem
if (TryComp<CosmicEntropyDebuffComponent>(mob, out var debuff)) debuff.Degen =
new(){DamageDict = new(){
{"Cold", 0.05 * damageMultiplier},
{"Asphyxiation", 0.15 * damageMultiplier},
{"Ion", 0.15 * damageMultiplier}
{"Asphyxiation", 0.15 * damageMultiplier}
}};
}
}
@@ -33,7 +33,7 @@ public sealed partial class GameTicker
public bool ConvertRoundToSurvival()
{
// Ramping scheduler is already added. Do nothing.
if (IsGameRuleActive(RampingSchedulerProto))
if (IsGameRuleAdded(RampingSchedulerProto))
{
_chatManager.SendAdminAlert("RampingStationEventScheduler detected. No rules added.");
return true;
@@ -44,7 +44,7 @@ public sealed partial class GameTicker
var rampingSchedulerStart = _gameTiming.CurTime.Add(GracePeriod);
EnsureComp<DelayedStartRuleComponent>(rampingScheduler).RuleStartTime = rampingSchedulerStart;
_chatManager.SendAdminAlert($"Major antag defeated. Converting to survival at {rampingSchedulerStart}.");
_chatManager.SendAdminAlert($"Major antag defeated. Converting to survival at {(RoundDuration() + GracePeriod).ToString(@"hh\:mm\:ss")}.");
// End Basic Rules
var basicRules = EntityQueryEnumerator<BasicStationEventSchedulerComponent>();
@@ -8,6 +8,7 @@ using Content.Server.NodeContainer.Nodes;
using Content.Shared._DV.NodeCrawl;
using Content.Shared.Atmos;
using Content.Shared.NodeContainer;
using Content.Shared.Polymorph;
using Content.Shared.Zombies;
using Robust.Shared.Reflection;
using Robust.Shared.Utility;
@@ -30,6 +31,7 @@ public sealed class NodeCrawlSystem : SharedNodeCrawlSystem
SubscribeLocalEvent<NodeCrawlerComponent, InhaleLocationEvent>(OnInhaleLocation);
SubscribeLocalEvent<NodeCrawlerComponent, ExhaleLocationEvent>(OnExhaleLocation);
SubscribeLocalEvent<NodeCrawlerComponent, AtmosExposedGetAirEvent>(OnGetAir);
SubscribeLocalEvent<NodeCrawlerComponent, PolymorphActionEvent>(OnPolymorph);
SubscribeLocalEvent<NodeCrawlerComponent, EntityZombifiedEvent>(OnZombify);
}
@@ -222,4 +224,15 @@ public sealed class NodeCrawlSystem : SharedNodeCrawlSystem
ent.Comp.EnterDelay = ent.Comp.ZombieEnterDelay;
Dirty(ent);
}
/// <summary>
/// Exit on polymorph or else the entity's movement bugs out.
/// </summary>
/// <param name="ent"></param>
/// <param name="args"></param>
private void OnPolymorph(Entity<NodeCrawlerComponent> ent, ref PolymorphActionEvent args)
{
if (ent.Comp.Mover.HasValue)
ExitNodeCrawl(ent);
}
}
@@ -1,4 +1,5 @@
using Content.Shared.Tag;
using Content.Shared.Whitelist;
using Robust.Shared.Prototypes;
namespace Content.Server._DV.Projectiles.Components;
@@ -21,10 +22,14 @@ public sealed partial class PiercingProjectileComponent : Component
public float PierceCounter;
/// <summary>
/// The tag that will cause the piercing bullet to increment it's <see cref="PierceCounter"/>.
/// The whitelist for checking what increments the <see cref="PierceCounter"/>.
/// </summary>
/// <example>
/// If this has the tag "Wall" in it, any entity with the tag "Wall" will increment <see cref="PierceCounter"/>
/// upon being hit.
/// </example>
[DataField]
public List<ProtoId<TagPrototype>> PierceBlockTag = ["Wall", "Window"];
public EntityWhitelist PierceCounterWhitelist;
/// <summary>
/// The number of entities it is allowed to pierce before being deleted.
@@ -3,7 +3,7 @@ using Content.Shared.FixedPoint;
namespace Content.Server._DV.Projectiles.Events;
/// <summary>
/// Raised when a piercing projectile hits an entity that doesn't follow upstream piercing rules.
/// Raised when a piercing projectile that doesn't follow upstream piercing rules hits an entity.
/// </summary>
[ByRefEvent]
public record struct ProjectilePierceEvent(EntityUid Target, FixedPoint2 RequiredDamage, bool Pierced = false);
@@ -1,29 +1,33 @@
using Content.Server._DV.Projectiles.Components;
using Content.Server._DV.Projectiles.Events;
using Content.Shared.Tag;
using Content.Shared.Whitelist;
namespace Content.Server._DV.Projectiles.Systems;
public sealed class PiercingProjectileSystem : EntitySystem
{
[Dependency] private readonly TagSystem _tagSystem = default!;
[Dependency] private readonly EntityWhitelistSystem _whitelist = default!;
// Mobs return a required Damage amount of Float.MaxValue. Therefore, we need to check for absurdly high values.
private readonly int _indestructibleNumber = 20000000;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<PiercingProjectileComponent, ProjectilePierceEvent>(OnPierce);
}
private void OnPierce(Entity<PiercingProjectileComponent> bullet, ref ProjectilePierceEvent args)
{
// If the target doesn't have any tags to stop the bullet from piercing, it's automatically true.
if (!_tagSystem.HasAnyTag(args.Target, bullet.Comp.PierceBlockTag))
if (_whitelist.IsWhitelistFail(bullet.Comp.PierceCounterWhitelist, args.Target))
{
args.Pierced = true;
return;
}
// If it does have the tag to stop it and enough health to count as "strongly armored", it'll block the bullet.
if (bullet.Comp.HealthThreshold < args.RequiredDamage)
if (bullet.Comp.HealthThreshold < args.RequiredDamage && args.RequiredDamage < _indestructibleNumber)
return;
if (bullet.Comp.Direction == null) // Get the direction of the bullet to determine which walls count.
@@ -1,5 +0,0 @@
using Content.Shared._DV.Silicons;
namespace Content.Server._DV.Silicons;
public sealed class SiliconEmpSystem : SharedSiliconEmpSystem;
@@ -109,8 +109,10 @@ public sealed class FugitiveRule : StationEventSystem<FugitiveRuleComponent>
var report = new FormattedMessage();
report.AddMarkupOrThrow(Loc.GetString("fugitive-report-title"));
report.PushNewline();
report.PushNewline();
report.AddMarkupOrThrow(Loc.GetString("fugitive-report-first-line"));
report.PushNewline();
report.PushNewline();
if (!TryComp<HumanoidProfileComponent>(uid, out var humanoid))
{
@@ -121,22 +123,28 @@ public sealed class FugitiveRule : StationEventSystem<FugitiveRuleComponent>
var species = PrototypeManager.Index(humanoid.Species);
report.AddMarkupOrThrow(Loc.GetString("fugitive-report-morphotype", ("species", Loc.GetString(species.Name))));
report.PushNewline();
report.AddMarkupOrThrow(Loc.GetString("fugitive-report-age", ("age", humanoid.Age)));
report.PushNewline();
report.AddMarkupOrThrow(Loc.GetString("fugitive-report-sex", ("sex", humanoid.Sex)));
report.PushNewline();
if (TryComp<PhysicsComponent>(uid, out var physics))
{
report.AddMarkupOrThrow(Loc.GetString("fugitive-report-weight", ("weight", Math.Round(physics.FixturesMass))));
report.PushNewline();
}
// add a random identifying quality that officers can use to track them down
report.AddMarkupOrThrow(RobustRandom.Next(0, 2) switch
{
0 => Loc.GetString("fugitive-report-detail-dna", ("dna", GetDNA(uid))),
_ => Loc.GetString("fugitive-report-detail-prints", ("prints", GetPrints(uid)))
});
report.PushNewline();
report.PushNewline();
report.AddMarkupOrThrow(Loc.GetString("fugitive-report-crimes-header"));
report.PushNewline();
// generate some random crimes to avoid this situation
// "officer what are my charges?"
// "uh i dunno a piece of paper said to arrest you thats it"
@@ -172,6 +180,7 @@ public sealed class FugitiveRule : StationEventSystem<FugitiveRuleComponent>
{
var count = RobustRandom.Next(rule.MinCounts, rule.MaxCounts + 1);
report.AddMarkupOrThrow(Loc.GetString("fugitive-report-crime", ("crime", Loc.GetString(crime)), ("count", count)));
report.PushNewline();
}
}
}
@@ -0,0 +1,44 @@
using Content.Shared.Store;
using Content.Shared.Store.Components;
using Robust.Shared.Prototypes;
namespace Content.Server._DV.Store.Conditions;
/// <summary>
/// XOR (eXclusive-OR) Buy Condition
/// A condition where that blocks buying a listing if another listing
/// specified is bought before it. Used to enforce that a traitor
/// can only buy 1 of X options.
///
/// Primarily used for choose-your-own-adventure DAGD Implants.
/// </summary>
public sealed partial class XORBuyCondition : ListingCondition
{
/// <summary>
/// Listing(s) that if bought, block this purchase, if any.
/// </summary>
[DataField(required: true)]
public HashSet<ProtoId<ListingPrototype>>? Listings;
public override bool Condition(ListingConditionArgs args)
{
if (!args.EntityManager.TryGetComponent<StoreComponent>(args.StoreEntity, out var storeComp))
return false;
var allListings = storeComp.FullListingsCatalog;
if (Listings != null)
{
foreach (var blacklistListing in Listings)
{
foreach (var listing in allListings)
{
if (listing.ID == blacklistListing.Id && listing.PurchaseAmount > 0)
return false; // it was purchased, so return false to fail the condition
}
}
}
return true; // If no purchases were found, return true
}
}
+163
View File
@@ -0,0 +1,163 @@
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Numerics;
using System.Text.RegularExpressions;
using Content.Server.Administration;
using Content.Shared.Administration;
using Robust.Shared.Console;
using Robust.Shared.Maths;
using Robust.Shared.Toolshed;
using Robust.Shared.Toolshed.Errors;
using Robust.Shared.Utility;
namespace Content.Server._DV.Toolshed;
/// <summary>
/// An extended version of the engine's <c>do</c> command. Runs a console command once per piped value,
/// substituting <c>$NAME</c> tokens in the command string first.
/// </summary>
/// <remarks>
/// On top of the built-in tokens that <c>do</c> supports (<c>$ID</c>, <c>$PID</c>, <c>$WX</c>, <c>$WY</c>,
/// <c>$LX</c>, <c>$LY</c>, <c>$SELF</c>), any other <c>$name</c> is resolved as a toolshed variable and
/// converted to a string. Tokens that don't resolve to anything are left untouched.
///
/// Where the command actually runs is explicit:
/// <list type="bullet">
/// <item><c>doext:client</c> sends it back down to the calling user's own client to run locally. This is what
/// you want for client-side commands like <c>exec</c>, which resolve paths against the client's user data.</item>
/// <item><c>doext:server</c> runs it server-side as the calling session, like <c>do</c> does.</item>
/// </list>
/// </remarks>
/// <example><code>
/// self doext:client "exec /Script_$var.txt"
/// i 5 => $count; self doext:server "somecommand $count"
/// </code></example>
[ToolshedCommand(Name = "doext"), AdminCommand(AdminFlags.Debug)]
public sealed class DoExtCommand : ToolshedCommand
{
/// <summary>
/// Matches a <c>$name</c> token. Names use the same character set as toolshed variable names, so this
/// matches whole identifiers - <c>$IDLE</c> resolves as "IDLE" rather than being mangled into <c>$ID</c>.
/// </summary>
private static readonly Regex TokenRegex = new(@"\$(\w+)", RegexOptions.Compiled);
[Dependency] private readonly IConsoleHost _console = default!;
private SharedTransformSystem? _xform;
/// <summary>
/// Sends the command back down to the calling user's client, which runs it locally.
/// </summary>
[CommandImplementation("client"), TakesPipedTypeAsGeneric]
public IEnumerable<T> Client<T>(IInvocationContext ctx, [PipedArgument] IEnumerable<T> input, string command)
{
// No session means there's no client to hand this back to - e.g. the server console.
if (ctx.Session is not { } session)
{
ctx.ReportError(new NoClientSessionError());
yield break;
}
foreach (var value in input)
{
_console.RemoteExecuteCommand(session, Substitute(command, value, ctx));
yield return value;
}
}
/// <summary>
/// Runs the command on the server as the calling session.
/// </summary>
[CommandImplementation("server"), TakesPipedTypeAsGeneric]
public IEnumerable<T> Server<T>(IInvocationContext ctx, [PipedArgument] IEnumerable<T> input, string command)
{
foreach (var value in input)
{
_console.ExecuteCommand(ctx.Session, Substitute(command, value, ctx));
yield return value;
}
}
private string Substitute<T>(string command, T value, IInvocationContext ctx)
{
return TokenRegex.Replace(command, match =>
{
var name = match.Groups[1].Value;
if (TryGetBuiltin(name, value, ctx, out var builtin))
return builtin;
// Anything else is looked up as a toolshed variable and implicitly stringified.
if (ctx.ReadVar(name) is { } variable)
return Stringify(variable);
// Unresolved, so leave the token alone rather than silently blanking it.
return match.Value;
});
}
private bool TryGetBuiltin<T>(string name, T value, IInvocationContext ctx, [NotNullWhen(true)] out string? result)
{
switch (name)
{
case "SELF":
result = Stringify(value);
return true;
case "PID":
result = (ctx.Session?.AttachedEntity ?? EntityUid.Invalid).ToString();
return true;
}
// The remaining tokens are all positional, so they only apply when piping entities.
if (value is not EntityUid uid)
{
result = null;
return false;
}
switch (name)
{
case "ID":
result = uid.ToString();
return true;
case "WX":
result = Number(WorldPosition(uid).X);
return true;
case "WY":
result = Number(WorldPosition(uid).Y);
return true;
case "LX":
result = Number(Transform(uid).Coordinates.X);
return true;
case "LY":
result = Number(Transform(uid).Coordinates.Y);
return true;
}
result = null;
return false;
}
private Vector2 WorldPosition(EntityUid uid)
{
_xform ??= GetSys<SharedTransformSystem>();
return _xform.GetWorldPosition(uid);
}
private static string Number(float value) => value.ToString(CultureInfo.InvariantCulture);
private static string Stringify(object? value) => value?.ToString() ?? string.Empty;
}
public sealed class NoClientSessionError : IConError
{
public FormattedMessage DescribeInner()
{
return FormattedMessage.FromUnformatted("There is no client to run this on. doext:client must be run by a player, not the server console.");
}
public string? Expression { get; set; }
public Vector2i? IssueSpan { get; set; }
public StackTrace? Trace { get; set; }
}
+136
View File
@@ -0,0 +1,136 @@
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Reflection;
using Content.Server.Administration;
using Content.Shared.Administration;
using Robust.Shared.Console;
using Robust.Shared.Maths;
using Robust.Shared.Toolshed;
using Robust.Shared.Toolshed.Errors;
using Robust.Shared.Toolshed.Syntax;
using Robust.Shared.Toolshed.TypeParsers;
using Robust.Shared.Utility;
using Robust.Shared.ViewVariables;
namespace Content.Server._DV.Toolshed;
/// <summary>
/// Reads the value of a single field or property off of the piped input, by name.
/// Member names are resolved the same way <c>vvread</c> does: the member must be exposed
/// via <c>[ViewVariables]</c>, <c>[DataField]</c>, or <c>[IncludeDataField]</c>.
/// </summary>
/// <example><code>ent 12345 . Name</code></example>
[ToolshedCommand(Name = "."), AdminCommand(AdminFlags.Debug)]
public sealed class FieldCommand : ToolshedCommand
{
[CommandImplementation]
public object? Field([PipedArgument] object? value, [CommandArgument(typeof(FieldNameParser))] string field, IInvocationContext ctx)
{
if (value == null)
{
ctx.ReportError(new NullInputFieldError());
return null;
}
var type = value.GetType();
var member = GetSingleMember(type, field);
// Restrict to members that vvread would let you read, so this can't be used to peek at arbitrary internals.
if (member == null || !ViewVariablesUtility.TryGetViewVariablesAccess(member, out _))
{
ctx.ReportError(new NoSuchFieldError(type, field));
return null;
}
return member switch
{
FieldInfo f => f.GetValue(value),
PropertyInfo p => p.GetValue(value),
_ => null,
};
}
/// <summary>
/// Finds the field or property with the given name, mirroring the resolution used by <c>vvread</c>.
/// </summary>
private static MemberInfo? GetSingleMember(Type type, string member)
{
var members = type
.GetMembers(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
.Where(m => m.Name == member && m is FieldInfo or PropertyInfo)
.ToArray();
if (members.Length == 0)
return null;
// In case there's member hiding going on, grab the one declared by the type of the object by default.
return members.Length > 1
? members.FirstOrDefault(m => m.DeclaringType == type) ?? members[0]
: members[0];
}
}
/// <summary>
/// Parses a field name as a bare identifier (letters, digits, underscore) so that the <c>.</c> command doesn't
/// require the name to be wrapped in quotes like the default <see cref="string"/> parser does.
/// </summary>
public sealed class FieldNameParser : CustomTypeParser<string>
{
public override bool TryParse(ParserContext ctx, [NotNullWhen(true)] out string? result)
{
ctx.ConsumeWhitespace();
result = ctx.GetWord(ParserContext.IsToken);
if (result != null)
return true;
if (ctx.PeekRune() is null)
ctx.Error = new OutOfInputError();
else
ctx.Error = new InvalidFieldNameError();
ctx.Error.Contextualize(ctx.Input, (ctx.Index, ctx.Index + 1));
return false;
}
public override CompletionResult? TryAutocomplete(ParserContext ctx, CommandArgument? arg)
{
return CompletionResult.FromHint(GetArgHint(arg));
}
}
public sealed class InvalidFieldNameError : IConError
{
public FormattedMessage DescribeInner()
{
return FormattedMessage.FromUnformatted("Expected a field name (letters, digits, or underscores).");
}
public string? Expression { get; set; }
public Vector2i? IssueSpan { get; set; }
public StackTrace? Trace { get; set; }
}
public sealed class NullInputFieldError : IConError
{
public FormattedMessage DescribeInner()
{
return FormattedMessage.FromUnformatted("Cannot read a field off of a null input.");
}
public string? Expression { get; set; }
public Vector2i? IssueSpan { get; set; }
public StackTrace? Trace { get; set; }
}
public sealed class NoSuchFieldError(Type type, string field) : IConError
{
public FormattedMessage DescribeInner()
{
return FormattedMessage.FromUnformatted($"Type {type.Name} has no readable field or property named '{field}'. It must be exposed via [ViewVariables], [DataField], or [IncludeDataField].");
}
public string? Expression { get; set; }
public Vector2i? IssueSpan { get; set; }
public StackTrace? Trace { get; set; }
}
@@ -0,0 +1,5 @@
using Content.Shared._Floof.OfferItem;
namespace Content.Server._Floof.OfferItem;
public sealed partial class OfferItemSystem : SharedOfferItemSystem;
@@ -13,7 +13,7 @@ public sealed partial class RevenantStasisComponent : Component
public Entity<RevenantComponent> Revenant;
[ViewVariables(VVAccess.ReadOnly)]
public TimeSpan StasisDuration = TimeSpan.FromSeconds(60);
public TimeSpan StasisDuration = TimeSpan.FromSeconds(100); // DeltaV - change from 60 to 100s
public RevenantStasisComponent(TimeSpan stasisDuration, Entity<RevenantComponent> revenant)
{
@@ -27,6 +27,7 @@ using Content.Shared.Mobs;
using Robust.Shared.Timing;
using Content.Shared.Construction.Components;
using Content.Shared.Trigger.Components;
using Content.Shared.Zombies; // DeltaV
namespace Content.Server._Impstation.Revenant.EntitySystems;
@@ -196,6 +197,7 @@ public sealed partial class RevenantAnimatedSystem : EntitySystem
animate.EndTime = _gameTiming.CurTime + duration.Value;
else if (revenant != null)
animate.EndTime = _gameTiming.CurTime + revenant.Value.Comp.AnimateTime;
EnsureComp<ZombieImmuneComponent>(target); // DeltaV - ensure immune from zombies so we don't break clients
return true;
}
+293
View File
@@ -0,0 +1,293 @@
using Content.Shared.Humanoid;
using Content.Shared.Alert;
using Robust.Server.GameObjects;
using Content.Shared.Examine;
using Robust.Server.Containers;
using Content.Shared._Starlight;
using Content.Shared.Damage.Components;
using Content.Shared.Mobs;
using Content.Shared.Movement.Systems;
using Content.Shared.Movement.Components;
using Content.Shared.Damage;
using Content.Server.Chat.Managers;
using Content.Shared.Damage.Systems;
using Content.Shared._Goobstation.Overlays;
using Robust.Shared.Timing;
using Content.Server.Body.Components;
using System.Linq;
using Content.Shared._Goobstation.Flashbang;
using Content.Shared._Starlight.Flash.Components;
using Content.Shared.Body.Components;
using Content.Shared.Flash; // Delta V - Flash Work
using Content.Shared._DV.Body.Components; // Delta V - Remove various comps related to breathing
namespace Content.Server._Starlight;
public sealed class ShadekinSystem : EntitySystem
{
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly AlertsSystem _alerts = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
[Dependency] private readonly EntityLookupSystem _lookup = default!;
[Dependency] private readonly ExamineSystemShared _examine = default!;
[Dependency] private readonly ContainerSystem _container = default!;
[Dependency] private readonly DamageableSystem _damageable = default!;
[Dependency] private readonly MovementSpeedModifierSystem _speed = default!;
[Dependency] private readonly SharedFlashSystem _flashSystem = default!;
private sealed class LightCone
{
public float Direction { get; set; }
public float InnerWidth { get; set; }
public float OuterWidth { get; set; }
}
private readonly Dictionary<string, List<LightCone>> lightMasks = new()
{
["/Textures/Effects/LightMasks/cone.png"] = new List<LightCone>
{
new LightCone { Direction = 0, InnerWidth = 30, OuterWidth = 60 }
},
["/Textures/Effects/LightMasks/double_cone.png"] = new List<LightCone>
{
new LightCone { Direction = 0, InnerWidth = 30, OuterWidth = 60 },
new LightCone { Direction = 180, InnerWidth = 30, OuterWidth = 60 }
}
};
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<ShadekinComponent, ComponentStartup>(OnInit);
SubscribeLocalEvent<ShadekinComponent, EyeColorInitEvent>(OnEyeColorChange);
SubscribeLocalEvent<ShadekinComponent, RefreshMovementSpeedModifiersEvent>(OnRefreshMovementSpeedModifiers);
SubscribeLocalEvent<ShadekinComponent, AfterFlashedEvent>(OnShadekinFlashed); // Delta V - Prevent Chain Flashing
SubscribeLocalEvent<ShadekinComponent, FlashDurationMultiplierEvent>(GetFlashModifier); // Delta V - Flash Modifier to Shadekin
}
private void OnInit(EntityUid uid, ShadekinComponent component, ComponentStartup args)
{
UpdateAlert(uid, component, (short)component.CurrentState);
RemComp<InternalsComponent>(uid);
RemComp<RespiratorComponent>(uid);
RemComp<AffectedByCPRComponent>(uid); // No lungs = no CPR
}
private void OnEyeColorChange(EntityUid uid, ShadekinComponent component, EyeColorInitEvent args)
{
if (!TryComp<HumanoidProfileComponent>(uid, out var humanoid))
return;
// humanoid.EyeColor = Color.Black;
Dirty(uid, humanoid);
}
public void UpdateAlert(EntityUid uid, ShadekinComponent component, short state)
{
_alerts.ShowAlert(uid, component.ShadekinAlert, state);
}
private Angle GetAngle(EntityUid lightUid, SharedPointLightComponent lightComp, EntityUid targetUid)
{
var (lightPos, lightRot) = _transform.GetWorldPositionRotation(lightUid);
lightPos += lightRot.RotateVec(lightComp.Offset);
var (targetPos, targetRot) = _transform.GetWorldPositionRotation(targetUid);
var mapDiff = targetPos - lightPos;
var oppositeMapDiff = (-lightRot).RotateVec(mapDiff);
var angle = oppositeMapDiff.ToWorldAngle();
if (angle == double.NaN && _transform.ContainsEntity(targetUid, lightUid) || _transform.ContainsEntity(lightUid, targetUid))
{
angle = 0f;
}
return angle;
}
/// <summary>
/// Return an illumination float value with is how many "energy" of light is hitting our ent.
/// WARNING: This function might be expensive, Avoid calling it too much and CACHE THE RESULT!
/// </summary>
/// <param name="uid"></param>
/// <returns></returns>
public float GetLightExposure(EntityUid uid)
{
var illumination = 0f;
var lightQuery = _lookup.GetEntitiesInRange<PointLightComponent>(Transform(uid).Coordinates, 20, LookupFlags.Uncontained);
foreach (var light in lightQuery)
{
if (!light.Comp.Enabled
|| light.Comp.Radius < 1
|| light.Comp.Energy <= 0)
continue;
var (lightPos, lightRot) = _transform.GetWorldPositionRotation(light);
lightPos += lightRot.RotateVec(light.Comp.Offset);
if (!_examine.InRangeUnOccluded(light, uid, light.Comp.Radius, null))
continue;
Transform(uid).Coordinates.TryDistance(EntityManager, Transform(light).Coordinates, out var dist);
var denom = dist / light.Comp.Radius;
var attenuation = 1 - (denom * denom);
var calculatedLight = 0f;
if (light.Comp.MaskPath is not null)
{
var angleToTarget = GetAngle(light, light.Comp, uid);
foreach (var cone in lightMasks[light.Comp.MaskPath])
{
var coneLight = 0f;
var angleAttenuation = (float)Math.Min((float)Math.Max(cone.OuterWidth - angleToTarget, 0f), cone.InnerWidth) / cone.OuterWidth;
if (angleToTarget.Degrees - cone.Direction > cone.OuterWidth)
continue;
else if (angleToTarget.Degrees - cone.Direction > cone.InnerWidth
&& angleToTarget.Degrees - cone.Direction < cone.OuterWidth)
coneLight = light.Comp.Energy * attenuation * attenuation * angleAttenuation;
else
coneLight = light.Comp.Energy * attenuation * attenuation;
calculatedLight = Math.Max(calculatedLight, coneLight);
}
}
else
calculatedLight = light.Comp.Energy * attenuation * attenuation;
illumination += calculatedLight; //Math.Max(illumination, calculatedLight);
}
return illumination;
}
private void SetPassiveBuff(EntityUid uid, ShadekinState state)
{
if (!TryComp<PassiveDamageComponent>(uid, out var passive))
return;
if (state == ShadekinState.Extreme || state == ShadekinState.Annoying || state == ShadekinState.High)
{
// passive.DamageCap = 1;
}
else if (state == ShadekinState.Low)
{
// passive.DamageCap = 20;
passive.AllowedStates.Clear();
passive.AllowedStates.Add(MobState.Alive);
passive.Interval = 1f;
}
else if (state != ShadekinState.Dark)
{
// passive.DamageCap = 0;
passive.AllowedStates.Clear();
passive.AllowedStates.Add(MobState.Alive);
passive.AllowedStates.Add(MobState.Critical);
passive.AllowedStates.Add(MobState.Dead);
passive.Interval = 0.5f;
}
}
private void ToggleNightVision(EntityUid uid, ShadekinState state)
{
if (state == ShadekinState.Dark)
{
var nightVisionComponent = EnsureComp<NightVisionComponent>(uid);
nightVisionComponent.Color = Color.FromHex("#808080"); // Delta V - Change Night Vision Color
}
else
{
if (TryComp<NightVisionComponent>(uid, out var nightVision) && nightVision.IsActive)
_flashSystem.Flash(uid, uid, uid, TimeSpan.FromSeconds(0.5 * (int)state), 0.5f);
RemComp<NightVisionComponent>(uid);
}
}
private void ApplyLightDamage(EntityUid uid, float dmg)
{
var damage = new DamageSpecifier();
damage.DamageDict.Add("Heat", dmg);
_damageable.TryChangeDamage(uid, damage, true, false);
}
private void OnRefreshMovementSpeedModifiers(EntityUid uid, ShadekinComponent component, RefreshMovementSpeedModifiersEvent args)
{
if (component.CurrentState == ShadekinState.Low || component.CurrentState == ShadekinState.Annoying ||
component.CurrentState == ShadekinState.Dark || component.CurrentState == ShadekinState.Invalid)
return;
if (!TryComp<MovementSpeedModifierComponent>(uid, out var movement))
return;
var sprintDif = movement.BaseWalkSpeed / movement.BaseSprintSpeed;
args.ModifySpeed(1f, sprintDif);
}
private ShadekinState GetStateByThreshold(ShadekinComponent component, float lightExposure)
{
var returnState = ShadekinState.Dark;
foreach (var (threshold, shadekinState) in component.Thresholds.Reverse())
{
if (threshold <= lightExposure)
{
returnState = shadekinState;
break;
}
}
return returnState;
}
// Delta V - Begin Shadekin Flash Changes
private void GetFlashModifier(EntityUid uid, ShadekinComponent comp, FlashDurationMultiplierEvent args)
{
if (!TryComp<FlashModifierComponent>(uid, out var flashModifier))
return;
args.Multiplier = flashModifier.Modifier;
}
private void OnShadekinFlashed(EntityUid uid, ShadekinComponent comp, AfterFlashedEvent ev)
{
RemComp<NightVisionComponent>(uid);
}
// Delta V - End
public override void Update(float frameTime)
{
base.Update(frameTime);
var query = EntityQueryEnumerator<ShadekinComponent>();
while (query.MoveNext(out var uid, out var component))
{
if (_timing.CurTime < component.NextUpdate)
continue;
component.NextUpdate = _timing.CurTime + component.UpdateCooldown;
var lightExposure = 0f;
if (!_container.IsEntityInContainer(uid))
lightExposure = GetLightExposure(uid);
component.CurrentState = GetStateByThreshold(component, lightExposure);
UpdateAlert(uid, component, (short)component.CurrentState);
SetPassiveBuff(uid, component.CurrentState);
ToggleNightVision(uid, component.CurrentState);
_speed.RefreshMovementSpeedModifiers(uid);
if (component.CurrentState == ShadekinState.Extreme)
ApplyLightDamage(uid, 5);
}
}
}
@@ -23,6 +23,8 @@ using Robust.Shared.Timing;
using Content.Shared._DV.Access.Systems;
using Content.Shared._DV.Access.Components;
using Content.Shared.Mind; // DeltaV - Subdermal ID Cards
using Content.Shared.Ninja.Components; // DeltaV
using Content.Shared.Revenant.Components; // DeltaV
namespace Content.Shared.Access.Systems;
@@ -31,7 +33,6 @@ public sealed class AccessReaderSystem : EntitySystem
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly InventorySystem _inventorySystem = default!;
[Dependency] private readonly IGameTiming _gameTiming = default!;
[Dependency] private readonly EmagSystem _emag = default!;
[Dependency] private readonly TagSystem _tag = default!;
[Dependency] private readonly SharedGameTicker _gameTicker = default!;
[Dependency] private readonly SharedHandsSystem _handsSystem = default!;
@@ -151,7 +152,7 @@ public sealed class AccessReaderSystem : EntitySystem
private void OnEmagged(EntityUid uid, AccessReaderComponent reader, ref GotEmaggedEvent args)
{
if (!_emag.CompareFlag(args.Type, EmagType.Interaction)) // DeltaV - emag for lockers etc instead of doorjack
if (HasComp<SpaceNinjaComponent>(args.UserUid) || HasComp<RevenantComponent>(args.UserUid)) // DeltaV - Don't break access if its a ninja doing it
return;
if (!reader.BreakOnAccessBreaker)
+2 -22
View File
@@ -1,9 +1,7 @@
using System.Linq;
using System.Numerics;
using Content.Shared._DV.Humanoid;
using Content.Shared._DV.Humanoid; // DeltaV
using Content.Shared.Humanoid.Markings;
using Content.Shared.Humanoid;
using Content.Shared.Sprite;
using Robust.Shared.Containers;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
@@ -18,7 +16,6 @@ public abstract partial class SharedVisualBodySystem : EntitySystem
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly MarkingManager _marking = default!;
[Dependency] private readonly SharedContainerSystem _container = default!;
[Dependency] private readonly SharedScaleVisualsSystem _scaleVisualsSystem = default!;
public override void Initialize()
{
@@ -28,7 +25,6 @@ public abstract partial class SharedVisualBodySystem : EntitySystem
SubscribeLocalEvent<VisualOrganMarkingsComponent, BodyRelayedEvent<OrganCopyAppearanceEvent>>(OnMarkingsOrganCopyAppearance);
SubscribeLocalEvent<VisualOrganComponent, BodyRelayedEvent<ApplyOrganProfileDataEvent>>(OnVisualOrganApplyProfile);
SubscribeLocalEvent<VisualOrganMarkingsComponent, BodyRelayedEvent<ApplyOrganMarkingsEvent>>(OnMarkingsOrganApplyMarkings);
SubscribeLocalEvent<HumanoidProfileComponent, ApplyOrganProfileDataEvent>(OnApplyOrganProfileData); // Delta V - Taking the solution from CD
InitializeModifiers();
InitializeInitial();
@@ -103,22 +99,6 @@ public abstract partial class SharedVisualBodySystem : EntitySystem
SetOrganAppearance(ent, other.Data);
}
// Delta V - BEGIN CD Solution
private void OnApplyOrganProfileData(Entity<HumanoidProfileComponent> entity, ref ApplyOrganProfileDataEvent args)
{
var speciesPrototype = _prototype.Index(entity.Comp.Species);
if (args.Base == null)
return;
var height = Math.Clamp(MathF.Round(args.Base.Value.Height, 2), speciesPrototype.MinHeight, speciesPrototype.MaxHeight);
_scaleVisualsSystem.SetSpriteScale(
entity.Owner,
new Vector2(speciesPrototype.ScaleHeight ? height : 1f, height)
);
}
// Delta V - END
private void OnMarkingsOrganCopyAppearance(Entity<VisualOrganMarkingsComponent> ent, ref BodyRelayedEvent<OrganCopyAppearanceEvent> args)
{
@@ -148,7 +128,7 @@ public abstract partial class SharedVisualBodySystem : EntitySystem
if (ent.Comp.Layer.Equals(HumanoidVisualLayers.Eyes))
{
// Delta V - Begin Add AppearanceLoaded Event
var appearanceLoaded = new AppearanceLoadedEvent(ent.Comp.Profile.EyeColor);
var appearanceLoaded = new AppearanceLoadedEvent(ent.Comp.Profile.EyeColor, ent.Comp.Profile.SkinColor);
RaiseLocalEvent(args.Body.Owner, ref appearanceLoaded);
// Delta V - End
SetOrganColor(ent, ent.Comp.Profile.EyeColor);
@@ -392,7 +392,6 @@ public abstract partial class SharedBuckleSystem
if (TryComp<PhysicsComponent>(buckle, out var physics))
_physics.ResetDynamics(buckle, physics);
// TOOD: DV - This fails when you try to buckle the entity you're carrying to something. Figure out why later.
DebugTools.AssertEqual(xform.ParentUid, strap.Owner);
}
+15 -1
View File
@@ -28,4 +28,18 @@ public readonly partial record struct CargoBountyData
Bounty = bounty.ID;
Id = $"{bounty.IdPrefix}{uniqueIdentifier:D3}";
}
}
// Begin DeltaV bounty claiming
[DataField]
public string ClaimedBy { get; init; } = string.Empty;
[DataField]
public CargoBountyStatus Status { get; init; } = CargoBountyStatus.Undelivered;
}
public enum CargoBountyStatus
{
Undelivered,
Waiting,
OnShuttle,
} // End DeltaV bounty claiming
@@ -94,3 +94,4 @@ public sealed class BountySkipMessage : BoundUserInterfaceMessage
BountyId = bountyId;
}
}
+9 -24
View File
@@ -25,12 +25,6 @@ public abstract class SharedEmpSystem : EntitySystem
[Dependency] private readonly SharedPvsOverrideSystem _pvs = default!; // Frontier
[Dependency] private readonly IConfigurationManager _cfg = default!; // Frontier: EMP Blast PVS
/// <summary>
/// DeltaV. Default damage of EMPs, as dertermined by direction. There's no good component to put
/// this on so its defined here.
/// </summary>
private static readonly DamageSpecifier? DefaultEmpDamage = new() { DamageDict = new() { { "Ion", 130 } } };
private HashSet<EntityUid> _entSet = new();
private EntityQuery<EmpResistanceComponent> _resistanceQuery;
@@ -59,12 +53,11 @@ public abstract class SharedEmpSystem : EntitySystem
/// <param name="energyConsumption">The amount of energy consumed by the EMP pulse. In Joule.</param>
/// <param name="duration">The duration of the EMP effects.</param>
/// <param name="user">The player that caused the effect. Used for predicted audio.</param>
/// <param name="damage">DeltaV - The damage that that EMP will do. If not specified or null, will do 130 Ion damage. To do no damage, pass in a DamageSpecifier with no damage types.</param>
public void EmpPulse(MapCoordinates mapCoordinates, float range, float energyConsumption, TimeSpan duration, EntityUid? user = null, DamageSpecifier? damage = null) // DeltaV - Add Ion Damage
public void EmpPulse(MapCoordinates mapCoordinates, float range, float energyConsumption, TimeSpan duration, EntityUid? user = null)
{
foreach (var uid in _lookup.GetEntitiesInRange(mapCoordinates, range))
{
TryEmpEffects(uid, energyConsumption, duration, user, damage ?? DefaultEmpDamage); // DeltaV - Add Ion Damage
TryEmpEffects(uid, energyConsumption, duration, user);
}
// TODO: replace with PredictedSpawn once it works with animated sprites
@@ -92,15 +85,13 @@ public abstract class SharedEmpSystem : EntitySystem
/// <param name="energyConsumption">The amount of energy consumed by the EMP pulse.</param>
/// <param name="duration">The duration of the EMP effects.</param>
/// <param name="user">The player that caused the effect. Used for predicted audio.</param>'
/// <param name="damage">DeltaV - The damage that that EMP will do. If not specified or null, will do 130 Ion damage. To do no damage, pass in a DamageSpecifier with no damage types.</param>
/// <param name="predicted">Whether this pulse is being replicated on the client.</param>
public void EmpPulse(EntityCoordinates coordinates, float range, float energyConsumption, TimeSpan duration, EntityUid? user = null, DamageSpecifier? damage = null, bool predicted = true) // Delta V - Add ion damage
public void EmpPulse(EntityCoordinates coordinates, float range, float energyConsumption, TimeSpan duration, EntityUid? user = null, bool predicted = true)
{
_entSet.Clear();
_lookup.GetEntitiesInRange(coordinates, range, _entSet);
foreach (var uid in _entSet)
{
TryEmpEffects(uid, energyConsumption, duration, user, damage ?? DefaultEmpDamage); // DeltaV - Add Ion Damage
TryEmpEffects(uid, energyConsumption, duration, user);
}
// TODO: replace with PredictedSpawn once it works with animated sprites
if (_net.IsServer)
@@ -123,37 +114,31 @@ public abstract class SharedEmpSystem : EntitySystem
/// <summary>
/// Attempts to apply the effects of an EMP pulse onto an entity by first raising an <see cref="EmpAttemptEvent"/>, followed by raising a <see cref="EmpPulseEvent"/> on it.
/// <br/>
/// <br/>DeltaV - In most cases, you will want to use <see cref="EmpPulse"/> instead.
/// </summary>
/// <param name="uid">The entity to apply the EMP effects on.</param>
/// <param name="energyConsumption">The amount of energy consumed by the EMP.</param>
/// <param name="duration">The duration of the EMP effects.</param>
/// <param name="user">The player that caused the EMP. For prediction purposes.</param>
/// <param name="damage">DeltaV - The damage that that EMP will do. If null, no damage is done.</param>
/// <returns>If the entity was affected by the EMP.</returns>
public bool TryEmpEffects(EntityUid uid, float energyConsumption, TimeSpan duration, EntityUid? user = null, DamageSpecifier? damage = null) // DeltaV - Add Ion Damage
public bool TryEmpEffects(EntityUid uid, float energyConsumption, TimeSpan duration, EntityUid? user = null)
{
var attemptEv = new EmpAttemptEvent();
RaiseLocalEvent(uid, ref attemptEv);
if (attemptEv.Cancelled)
return false;
return DoEmpEffects(uid, energyConsumption, duration, user, damage); // DeltaV - Add Ion Damage
return DoEmpEffects(uid, energyConsumption, duration, user);
}
/// <summary>
/// Applies the effects of an EMP pulse onto an entity by raising a <see cref="EmpPulseEvent"/> on it.
/// <br/>
/// <br/>DeltaV - In most cases, you will want to use <see cref="EmpPulse"/> instead.
/// </summary>
/// <param name="uid">The entity to apply the EMP effects on.</param>
/// <param name="energyConsumption">The amount of energy consumed by the EMP.</param>
/// <param name="duration">The duration of the EMP effects.</param>
/// <param name="user">The player that caused the EMP. For prediction purposes.</param>
/// <param name="damage">DeltaV - The damage that that EMP will do. If null, no damage is done.</param>
/// <returns>If the entity was affected by the EMP.</returns>
public bool DoEmpEffects(EntityUid uid, float energyConsumption, TimeSpan duration, EntityUid? user = null, DamageSpecifier? damage = null) // DeltaV - Add Ion Damage
public bool DoEmpEffects(EntityUid uid, float energyConsumption, TimeSpan duration, EntityUid? user = null)
{
var strMultiplier = 1f;
var durMultiplier = 1f;
@@ -162,7 +147,7 @@ public abstract class SharedEmpSystem : EntitySystem
strMultiplier = resistance.StrengthMultiplier;
durMultiplier = resistance.DurationMultiplier;
}
var ev = new EmpPulseEvent(energyConsumption * strMultiplier, false, false, duration * durMultiplier, user, damage); // DeltaV - Add Ion Damage
var ev = new EmpPulseEvent(energyConsumption * strMultiplier, false, false, duration * durMultiplier, user);
RaiseLocalEvent(uid, ref ev);
// TODO: replace with PredictedSpawn once it works with animated sprites
@@ -235,7 +220,7 @@ public record struct EmpAttemptEvent(bool Cancelled);
/// <param name="User">The player that caused the EMP. For prediction purposes.</param>
[ByRefEvent]
public record struct EmpPulseEvent(float EnergyConsumption, bool Affected, bool Disabled, TimeSpan Duration, EntityUid? User, DamageSpecifier? Damage = null); // DeltaV - Added Damage
public record struct EmpPulseEvent(float EnergyConsumption, bool Affected, bool Disabled, TimeSpan Duration, EntityUid? User);
/// <summary>
/// Raised on an entity after <see cref="EmpDisabledComponent"/> is removed.
+2 -1
View File
@@ -26,6 +26,7 @@ using System.Linq;
using Content.Shared.Movement.Systems;
using Content.Shared.Random.Helpers;
using Content.Shared.Clothing.Components;
using Content.Shared._Starlight.Flash.Components; // Delta V - For Flash Duration
namespace Content.Shared.Flash;
@@ -173,7 +174,7 @@ public abstract class SharedFlashSystem : EntitySystem
// Goobstation end
// don't paralyze, slowdown or convert to rev if the target is immune to flashes
if (!_statusEffectsSystem.TryAddStatusEffect<FlashedComponent>(target, FlashedKey, flashDuration, true) && !ignoreProtection) //DeltaV: allow flashing to ignore flash protection
if (!_statusEffectsSystem.TryAddStatusEffect<FlashedComponent>(target, FlashedKey, flashDuration * multiplier, true) && !ignoreProtection) //DeltaV: allow flashing to ignore flash protection. Added Flashduration Multiplier
return;
if (stunDuration != null)
+12
View File
@@ -1,5 +1,6 @@
using System.Linq;
using System.Numerics;
using Content.Shared._DV.Administration.EntitySystems; // DeltaV - Unorbitable
using Content.Shared.Administration.Managers;
using Content.Shared.Database;
using Content.Shared.Follower.Components;
@@ -33,6 +34,7 @@ public sealed class FollowerSystem : EntitySystem
[Dependency] private readonly SharedPhysicsSystem _physicsSystem = default!;
[Dependency] private readonly INetManager _netMan = default!;
[Dependency] private readonly ISharedAdminManager _adminManager = default!;
[Dependency] private readonly UnorbitableSystem _unorbitable = default!; // DeltaV - Unorbitable
private static readonly ProtoId<TagPrototype> ForceableFollowTag = "ForceableFollow";
private static readonly ProtoId<TagPrototype> PreventGhostnadoWarpTag = "NotGhostnadoWarpable";
@@ -98,6 +100,11 @@ public sealed class FollowerSystem : EntitySystem
if (ev.User == ev.Target || IsClientSide(ev.Target))
return;
// DeltaV - Unorbitable START
if (!_unorbitable.CanFollow(ev.User, ev.Target))
return;
// DeltaV END
if (HasComp<GhostComponent>(ev.User))
{
var verb = new AlternativeVerb()
@@ -187,6 +194,11 @@ public sealed class FollowerSystem : EntitySystem
if (follower == entity || TerminatingOrDeleted(entity))
return;
// DeltaV - Unorbitable START
if (!_unorbitable.CanFollow(follower, entity))
return;
// DeltaV END
// No recursion for you
var targetXform = Transform(entity);
while (targetXform.ParentUid.IsValid())
@@ -2,8 +2,7 @@ using Content.Shared.Armor; // DeltaV - Addition of HandHeldArmor
using Content.Shared.Atmos;
using Content.Shared.Camera;
using Content.Shared.Cuffs;
using Content.Shared.Damage; // DeltaV End - Addition of HandHeldArmor
using Content.Shared.Damage.Systems; // DeltaV End - Addition of HandHeldArmor
using Content.Shared.Damage.Systems; // DeltaV - Addition of HandHeldArmor
using Content.Shared.Hands.Components;
using Content.Shared.Movement.Systems;
using Content.Shared.Projectiles;
@@ -1,7 +1,9 @@
using System.Numerics; // DeltaV
using Content.Shared.Examine;
using Content.Shared.Humanoid.Prototypes;
using Content.Shared.IdentityManagement;
using Content.Shared.Preferences;
using Content.Shared.Sprite; // DeltaV
using Robust.Shared.GameObjects.Components.Localization;
using Robust.Shared.Prototypes;
@@ -11,6 +13,7 @@ public sealed class HumanoidProfileSystem : EntitySystem
{
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly GrammarSystem _grammar = default!;
[Dependency] private readonly SharedScaleVisualsSystem _scale = default!; // DeltaV
public override void Initialize()
{
@@ -28,6 +31,7 @@ public sealed class HumanoidProfileSystem : EntitySystem
ent.Comp.Age = profile.Age;
ent.Comp.Species = profile.Species;
ent.Comp.Sex = profile.Sex;
ent.Comp.Height = profile.Height; // DeltaV
Dirty(ent);
var sexChanged = new SexChangedEvent(ent.Comp.Sex, profile.Sex);
@@ -37,6 +41,15 @@ public sealed class HumanoidProfileSystem : EntitySystem
{
_grammar.SetGender((ent, grammar), profile.Gender);
}
// START DeltaV - Apply profile/species size
// Assume 1.0 scale unless the original scale exists (blame Allulalo)
var scale = Vector2.One;
if (TryComp<ScaleVisualsComponent>(ent, out var scaledVisuals) && scaledVisuals.OriginalScale is { } originalScale)
scale = originalScale;
_scale.SetSpriteScale(ent, scale);
// END DeltaV
}
private void OnExamined(Entity<HumanoidProfileComponent> ent, ref ExaminedEvent args)
@@ -1,3 +1,4 @@
using System.Numerics; // DeltaV
using Content.Shared.Body;
using Content.Shared.Dataset;
using Content.Shared.Humanoid.Markings;
@@ -111,7 +112,7 @@ public sealed partial class SpeciesPrototype : IPrototype
/// The base height scale for this species
/// </summary>
[DataField("baseScale")]
public System.Numerics.Vector2 BaseScale = new(1f, 1f);
public Vector2 BaseScale = new(1f, 1f);
// End DV - CD Character Records shouldn't nuke species heights
// Begin CD - Character Records
@@ -119,13 +120,13 @@ public sealed partial class SpeciesPrototype : IPrototype
/// The minimum height for this species
/// </summary>
[DataField("minHeight")]
public float MinHeight = 0.9f; // DeltaV - less trolling with the heights
public float MinHeight = 0.8f; // DeltaV
/// <summary>
/// The maximum height for this species
/// </summary>
[DataField("maxHeight")]
public float MaxHeight = 1.1f; // DeltaV - less trolling with the heights
public float MaxHeight = 1.2f; // DeltaV
/// <summary>
/// The default height for this species
@@ -68,6 +68,7 @@ namespace Content.Shared.Input
public static readonly BoundKeyFunction TakeScreenshotNoUI = "TakeScreenshotNoUI";
public static readonly BoundKeyFunction ToggleFullscreen = "ToggleFullscreen";
public static readonly BoundKeyFunction Point = "Point";
public static readonly BoundKeyFunction OfferItem = "OfferItem"; // Floofstation
public static readonly BoundKeyFunction ZoomOut = "ZoomOut";
public static readonly BoundKeyFunction ZoomIn = "ZoomIn";
public static readonly BoundKeyFunction ResetZoom = "ResetZoom";
@@ -1,4 +1,4 @@
using Content.Shared._DV.Overlays;
using Content.Shared._DV.Overlays; // DeltaV
using Content.Shared._DV.Psionics.Events; // DeltaV
using Content.Shared.Armor;
using Content.Shared.Atmos;
@@ -85,13 +85,15 @@ public partial class InventorySystem
SubscribeLocalEvent<InventoryComponent, WieldAttemptEvent>(RefRelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, UnwieldAttemptEvent>(RefRelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, IngestionAttemptEvent>(RefRelayInventoryEvent);
// DeltaV Start - Psionic Events
// DeltaV Start
// Psionic Events
SubscribeLocalEvent<InventoryComponent, DispelledEvent>(RefRelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, PsionicPowerUseAttemptEvent>(RefRelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, TargetedByPsionicPowerEvent>(RefRelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, NoosphericFryEvent>(RefRelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, WeightlessnessChangedEvent>(RefRelayInventoryEvent); // Heavy Clothing
// DeltaV End - Psionic Events
// Heavy Clothing
SubscribeLocalEvent<InventoryComponent, WeightlessnessChangedEvent>(RefRelayInventoryEvent);
// DeltaV End
// Eye/vision events
SubscribeLocalEvent<InventoryComponent, CanSeeAttemptEvent>(RelayInventoryEvent);
+16
View File
@@ -103,6 +103,22 @@ public abstract class SharedItemSystem : EntitySystem
VisualsChanged(uid);
}
/// <summary>
/// DeltaV - clear item visuals
/// </summary>
public void ClearVisuals(Entity<ItemComponent?> ent)
{
if (!Resolve(ent, ref ent.Comp))
return;
ent.Comp.RsiPath = null;
ent.Comp.InhandVisuals = new();
ent.Comp.HeldPrefix = null;
Dirty(ent, ent.Comp);
VisualsChanged(ent.Owner);
}
#endregion
private void OnHandInteract(EntityUid uid, ItemComponent component, InteractHandEvent args)
@@ -1,4 +1,5 @@
using Content.Shared._DV.MedicalRecords; // DeltaV - Medical Records
using Content.Shared.Chemistry.Components; // DeltaV - Health Analyzer Plus
using Robust.Shared.Serialization;
namespace Content.Shared.MedicalScanner;
@@ -29,11 +30,12 @@ public struct HealthAnalyzerUiState
public bool? ScanMode;
public bool? Bleeding;
public bool? Unrevivable;
public readonly Solution? BloodSolution; // DeltaV - Health Analyzer Plus
public MedicalRecord? MedicalRecord; // DeltaV - Medical Records
public HealthAnalyzerUiState() {}
public HealthAnalyzerUiState(NetEntity? targetEntity, float temperature, float bloodLevel, bool? scanMode, bool? bleeding, bool? unrevivable, MedicalRecord? medicalRecord = null) // DeltaV - Medical Records
public HealthAnalyzerUiState(NetEntity? targetEntity, float temperature, float bloodLevel, bool? scanMode, bool? bleeding, bool? unrevivable, Solution? bloodSolution, MedicalRecord? medicalRecord = null) // DeltaV - Health Analyzer Plus, Medical Records
{
TargetEntity = targetEntity;
Temperature = temperature;
@@ -41,6 +43,7 @@ public struct HealthAnalyzerUiState
ScanMode = scanMode;
Bleeding = bleeding;
Unrevivable = unrevivable;
BloodSolution = bloodSolution; // DeltaV - Health Analyzer Plus
MedicalRecord = medicalRecord; // DeltaV - Medical Records
}
}
@@ -1,4 +1,7 @@
using Content.Shared._DV.Body.Components; // DeltaV
using Content.Shared._DV.Body.Systems; // DeltaV
using Content.Shared._ST.Interaction; // Stellar - interaction particles
using Content.Shared._Floof.OfferItem; // Floof
using Content.Shared.ActionBlocker;
using Content.Shared.Administration.Logs;
using Content.Shared.Alert;
@@ -9,6 +12,7 @@ using Content.Shared.Database;
using Content.Shared.Hands;
using Content.Shared.Hands.Components;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.Humanoid; // DeltaV
using Content.Shared.IdentityManagement;
using Content.Shared.Input;
using Content.Shared.Interaction;
@@ -54,6 +58,7 @@ public sealed class PullingSystem : EntitySystem
[Dependency] private readonly HeldSpeedModifierSystem _clothingMoveSpeed = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly SharedVirtualItemSystem _virtual = default!;
[Dependency] private readonly SmallCharacterSystem _smallCharacter = default!; // DeltaV
public override void Initialize()
{
@@ -117,10 +122,11 @@ public sealed class PullingSystem : EntitySystem
if (TryComp(args.PullerUid, out PullerComponent? pullerComp) && !pullerComp.NeedsHands)
return;
if (!_virtual.TrySpawnVirtualItemInHand(args.PulledUid, uid))
if (!_virtual.TrySpawnVirtualItemInHand(args.PulledUid, uid, out var virt)) // Floofstation - store item
{
DebugTools.Assert("Unable to find available hand when starting pulling??");
}
EnsureComp<OfferableVirtualItemComponent>(virt.Value); // Floofstation - add a special component to allow offering it
}
private void HandlePullStopped(EntityUid uid, HandsComponent component, PullStoppedMessage args)
@@ -293,6 +299,14 @@ public sealed class PullingSystem : EntitySystem
private void OnRefreshMovespeed(EntityUid uid, PullerComponent component, RefreshMovementSpeedModifiersEvent args)
{
// BEGIN DeltaV - Slow if smaller puller
if (TryComp<SmallCharacterComponent>(uid, out var smol))
{
var sizePenalty = _smallCharacter.ApplyPullSpeedPenalty((uid, smol), component.Pulling);
args.ModifySpeed(sizePenalty, sizePenalty);
}
// END DeltaV
if (TryComp<HeldSpeedModifierComponent>(component.Pulling, out var heldMoveSpeed) && component.Pulling.HasValue)
{
var (walkMod, sprintMod) =
@@ -1,8 +1,7 @@
using Content.Shared.Actions;
using Content.Shared.Bed.Sleep;
using Content.Shared.DoAfter;
using Content.Shared.Hands;
using Content.Shared.IdentityManagement;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.Interaction.Events;
using Content.Shared.Item;
using Content.Shared.Item.PseudoItem;
@@ -24,7 +23,8 @@ public abstract partial class SharedPseudoItemSystem : EntitySystem
[Dependency] private readonly TagSystem _tag = default!;
[Dependency] private readonly SharedPopupSystem _popupSystem = default!;
[Dependency] private readonly SharedActionsSystem _actions = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
[Dependency] private readonly SharedContainerSystem _container = default!; // Floofstation
[Dependency] private readonly SharedHandsSystem _hands = default!; // Floofstation
private readonly ProtoId<TagPrototype> PreventTag = "PreventLabel";
private readonly EntProtoId SleepActionId = "ActionSleep"; // The action used for sleeping inside bags. Currently uses the default sleep action (same as beds)
@@ -116,17 +116,35 @@ public abstract partial class SharedPseudoItemSystem : EntitySystem
protected virtual void OnGettingPickedUpAttempt(EntityUid uid, PseudoItemComponent component,
GettingPickedUpAttemptEvent args)
{
if (args.User == args.Item)
return;
args.Cancel(); // Floof - this is a terrible idea. This triggers every time ANY system checks if a pseudo-item can be picked up.
// WHY DID YOU DO THAT, NYANOTRASEN???
_transform.AttachToGridOrMap(uid);
args.Cancel();
// if (args.User == args.Item)
// return;
//
// _transform.AttachToGridOrMap(uid);
// args.Cancel();
}
private void OnDropAttempt(EntityUid uid, PseudoItemComponent component, DropAttemptEvent args)
{
if (component.Active)
args.Cancel();
if (!component.Active)
return;
// Floof - we try to get the containing container and try to drop it into it
// If possible, we do it, since a bagged cat probably can put things back into the bag just like they can pick them up.
string? failReason = null;
if (_hands.GetActiveItem(uid) is { Valid: true, } droppedItem
&& _container.TryGetContainingContainer(Transform(uid).ParentUid, uid, out var pseudoItemContainer)
&& TryComp<StorageComponent>(pseudoItemContainer.Owner, out var targetStorage)
&& _storage.CanInsert(pseudoItemContainer.Owner, droppedItem, out failReason, targetStorage, ignoreStacks: true)
)
_storage.Insert(pseudoItemContainer.Owner, droppedItem, out _, uid, targetStorage, stackAutomatically: false);
if (failReason != null)
_popupSystem.PopupEntity(Loc.GetString(failReason), uid, uid);
args.Cancel();
}
private void OnInsertAttempt(EntityUid uid, PseudoItemComponent component,
@@ -141,8 +159,9 @@ public abstract partial class SharedPseudoItemSystem : EntitySystem
// Prevents moving within the bag :)
private void OnInteractAttempt(EntityUid uid, PseudoItemComponent component, InteractionAttemptEvent args)
{
if (args.Uid == args.Target && component.Active)
args.Cancelled = true;
// Floof - why the fuck.
// if (args.Uid == args.Target && component.Active)
// args.Cancelled = true;
}
private void OnDoAfter(EntityUid uid, PseudoItemComponent component, DoAfterEvent args)
@@ -97,7 +97,7 @@ public sealed partial class ParcelWrappingSystem
if (target == user)
{
var selfMsg = Loc.GetString("parcel-wrap-popup-being-wrapped-self");
_popup.PopupClient(selfMsg, user, user);
_popup.PopupEntity(selfMsg, user, user);
}
else
{
@@ -143,7 +143,7 @@ public sealed partial class ParcelWrappingSystem
// Spawn the actual parcel entity.
var targetTransform = Transform(target);
var spawned = Spawn(GetParcelPrototype(wrapper, target), targetTransform.Coordinates);
var spawned = SpawnAtPosition(GetParcelPrototype(wrapper, target), targetTransform.Coordinates);
_transform.SetLocalRotation(spawned, targetTransform.LocalRotation);
// If the target is in a container, try to put the parcel in its place in the container.
@@ -177,7 +177,7 @@ namespace Content.Shared.Preferences
_traitPreferences = traitPreferences;
_loadouts = loadouts;
// Begin CD - Character Records
Height = height;
Height = height; // This is the user-set scale on the profile editor. Not actual height measurements.
CDCharacterRecords = cdCharacterRecords;
// End CD - Character Records
@@ -1,4 +1,5 @@
using Content.Shared.Access.Components;
using Content.Shared.Access.Systems; // DeltaV
using Content.Shared.Administration.Logs;
using Content.Shared.Database;
using Content.Shared.Doors.Components;
@@ -19,6 +20,7 @@ namespace Content.Shared.Remotes.EntitySystems;
public abstract class SharedDoorRemoteSystem : EntitySystem
{
[Dependency] private readonly SharedAirlockSystem _airlock = default!;
[Dependency] private readonly AccessReaderSystem _accessReader = default!; // DeltaV
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly SharedDoorSystem _doorSystem = default!;
[Dependency] private readonly SharedElectrocutionSystem _electrify = default!;
@@ -96,6 +98,19 @@ public abstract class SharedDoorRemoteSystem : EntitySystem
else if (entity.Comp.RequireTagWhitelist)
return;
// Begin DeltaV - Emergency access only bypasses open/close; bolting and toggling emergency access still require actual access.
if (entity.Comp.Mode != OperatingMode.OpenClose
&& accessComponent != null
&& !_accessReader.IsAllowed(accessTarget, args.Target.Value, accessComponent))
{
if (isAirlock)
_doorSystem.Deny(args.Target.Value, doorComp, user: args.User, predicted: true);
_popup.PopupClient(Loc.GetString("door-remote-denied"), args.User, args.User);
return;
}
// End DeltaV
switch (entity.Comp.Mode)
{
case OperatingMode.OpenClose:
@@ -32,7 +32,7 @@ public sealed partial class RevenantComponent : Component
public string SpawnOnDeathPrototype = "EctoplasmRevenant"; // DeltaV
[DataField("stasisTime"), ViewVariables(VVAccess.ReadWrite)] // Begin Imp Changes
public TimeSpan StasisTime = TimeSpan.FromSeconds(60);
public TimeSpan StasisTime = TimeSpan.FromSeconds(100); // DeltaV - change from 60 to 100s
/// <summary>
/// If true, only bible users can exorcise this revenant
@@ -50,7 +50,7 @@ public sealed partial class RevenantComponent : Component
/// grinder will explode.
/// </summary>
[DataField, ViewVariables(VVAccess.ReadWrite)]
public bool GrindingRequiresSalt = true; // End Imp Changes
public bool GrindingRequiresSalt = false; // End Imp Changes - DeltaV - true to false
/// <summary>
/// The entity's current max amount of essence. Can be increased
@@ -1,4 +1,3 @@
using Content.Shared._CD.Silicons.Borgs; // CosmicDrift - borg subtypes
using Content.Shared.Actions;
using Content.Shared.Interaction;
using Content.Shared.Interaction.Components;
@@ -97,10 +96,6 @@ public abstract partial class SharedBorgSwitchableTypeSystem : EntitySystem // D
_userInterface.CloseUi((ent.Owner, null), BorgSwitchableTypeUiKey.SelectBorgType);
UpdateEntityAppearance(ent);
// AL - event for subtype system, always runs at end of borg type code
var ev = new AfterBorgTypeSelectEvent();
RaiseLocalEvent(ent, ref ev);
}
protected void UpdateEntityAppearance(Entity<BorgSwitchableTypeComponent> entity)
@@ -125,25 +120,24 @@ public abstract partial class SharedBorgSwitchableTypeSystem : EntitySystem // D
{
footstepModifier.FootstepSoundCollection = prototype.FootstepCollection;
}
// Start CosmicDrift Changes - Moved to BorgSwitchableTypeSystem.cs
// if (prototype.SpriteBodyMovementState is { } movementState)
// {
// var spriteMovement = EnsureComp<SpriteMovementComponent>(entity);
// spriteMovement.NoMovementLayers.Clear();
// spriteMovement.NoMovementLayers["movement"] = new PrototypeLayerData
// {
// State = prototype.SpriteBodyState,
// };
// spriteMovement.MovementLayers.Clear();
// spriteMovement.MovementLayers["movement"] = new PrototypeLayerData
// {
// State = movementState,
// };
// }
// else
// {
// RemComp<SpriteMovementComponent>(entity);
// }
// End CosmicDrift Changes - Moved to BorgSwitchableTypeSystem.cs
if (prototype.SpriteBodyMovementState is { } movementState)
{
var spriteMovement = EnsureComp<SpriteMovementComponent>(entity);
spriteMovement.NoMovementLayers.Clear();
spriteMovement.NoMovementLayers["movement"] = new PrototypeLayerData
{
State = prototype.SpriteBodyState,
};
spriteMovement.MovementLayers.Clear();
spriteMovement.MovementLayers["movement"] = new PrototypeLayerData
{
State = movementState,
};
}
else
{
RemComp<SpriteMovementComponent>(entity);
}
}
}
+19 -3
View File
@@ -25,11 +25,27 @@ public sealed partial class ScaleVisualsComponent : Component
[ViewVariables]
public Vector2? OriginalScale;
// Delta V Addition
/// <summary>
/// Base Scale of the Species, which we use to set a new height relative to this.
/// DeltaV - Contains the species scale. Set dynamically by
/// baseScale in the Species prototype.
/// </summary>
[DataField, AutoNetworkedField]
[ViewVariables]
public Vector2 SpeciesScale = Vector2.One;
public Vector2 SpeciesScale = new(1f, 1f);
/// <summary>
/// DeltaV - Contains the user-defined scale from the character creation
/// screen.
/// </summary>
[DataField, AutoNetworkedField]
[ViewVariables]
public Vector2 ProfileScale = new(1f, 1f);
/// <summary>
/// DeltaV - Contains the computer scale from applying Scale, SpeciesScale, and ProfileScale.
/// This will contain the actual scale after all modifiers are applied.
/// </summary>
[DataField, AutoNetworkedField]
[ViewVariables]
public Vector2 ComputedScale;
}
@@ -1,4 +1,6 @@
using System.Numerics;
using Content.Shared.Humanoid; // DeltaV
using Robust.Shared.Prototypes; // DeltaV
using Robust.Shared.Serialization;
namespace Content.Shared.Sprite;
@@ -6,6 +8,7 @@ namespace Content.Shared.Sprite;
public abstract class SharedScaleVisualsSystem : EntitySystem
{
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly IPrototypeManager _proto = default!; // DeltaV
public override void Initialize()
{
@@ -39,15 +42,28 @@ public abstract class SharedScaleVisualsSystem : EntitySystem
{
var comp = EnsureComp<ScaleVisualsComponent>(uid);
comp.Scale = scale;
// BEGIN DeltaV - Apply species and profile height
// We have to ensure this is idempotent so that if it gets applied more than once
// the sprite size at the end is the same.
if (TryComp<HumanoidProfileComponent>(uid, out var profile))
{
var speciesProto = _proto.Index(profile.Species);
comp.SpeciesScale = speciesProto.BaseScale;
scale *= comp.SpeciesScale; // Apply both species scale and character-defined height
Vector2 profileHeight = new(profile.Height, profile.Height);
comp.ProfileScale = profileHeight;
scale *= comp.ProfileScale;
}
comp.ComputedScale = scale; // Nice to know what the computed size is in case of bugs
// END DeltaV
Dirty(uid, comp);
// Delta V - Begin Species Scaling
// 120% species scale => add 0.2 to scale
var newScale = scale + comp.SpeciesScale - Vector2.One;
// Delta V - End Species Scaling
var appearanceComponent = EnsureComp<AppearanceComponent>(uid);
_appearance.SetData(uid, ScaleVisuals.Scale, newScale /* Delta V - Custom Species Scale */, appearanceComponent);
_appearance.SetData(uid, ScaleVisuals.Scale, scale, appearanceComponent);
// Raise an event for content use.
var ev = new ScaleEntityEvent(uid, scale);
@@ -1,6 +1,5 @@
using Content.Shared.Examine;
using Content.Shared.Mobs;
using Content.Shared.Mobs.Systems;
using Content.Shared.Stealth.Components;
using Robust.Shared.GameStates;
using Robust.Shared.Timing;
@@ -188,12 +188,20 @@ public abstract class SharedStorageSystem : EntitySystem
return;
}
// Begin DeltaV - the grid check excludes the item being resized because it's already in the storage which defeats the purpose so yoink it out to remove that
storage.StoredItems.Remove(itemEnt.Owner);
UpdateOccupied((container.Owner, storage));
if (!ItemFitsInGridLocation((itemEnt.Owner, itemEnt.Comp), (container.Owner, storage), loc))
if (ItemFitsInGridLocation((itemEnt.Owner, itemEnt.Comp), (container.Owner, storage), loc))
{
storage.StoredItems.Add(itemEnt.Owner, loc);
UpdateOccupied((container.Owner, storage));
}
else
{
ContainerSystem.Remove(itemEnt.Owner, container, force: true);
}
// End DeltaV - the grid check excludes the item being resized because it's already in the storage which defeats the purpose so yoink it out to remove that
}
private void OnNestedStorageCvar(bool obj)
@@ -28,10 +28,4 @@ public sealed partial class EmpOnTriggerComponent : BaseXOnTriggerComponent
/// </summary>
[DataField, AutoNetworkedField]
public TimeSpan DisableDuration = TimeSpan.FromSeconds(60);
/// <summary>
/// DeltaV - The damage dealt to silicons instead of draining their power cells
/// </summary>
[DataField, AutoNetworkedField]
public DamageSpecifier? Damage;
}

Some files were not shown because too many files have changed in this diff Show More