Compare commits

...

886 Commits

Author SHA1 Message Date
Ed
6aa11c4189 Create ProcessAtmosTreeSerializer.cs 2025-06-05 18:11:11 +03:00
CrystallEdge Server
354169afe8 Automatic changelog update 2025-06-05 12:47:44 +03:00
Red
a04720e2a0 fuck rings (#1389) 2025-06-05 12:46:38 +03:00
CrystallEdge Server
d08526fa39 Automatic changelog update 2025-06-05 11:47:14 +03:00
Jona-K
9e9b7f583f Removing The Scream Action From The Action Bar (#1348)
* Removed Initilization For The Scream Action

* Commetet out code instead of Deleting it outright

* Commetet Out The Code Inititzilazing The Scream Action

* Update Content.Server/Speech/EntitySystems/VocalSystem.cs

* Update Content.Server/Speech/EntitySystems/VocalSystem.cs

---------

Co-authored-by: Red <96445749+TheShuEd@users.noreply.github.com>
2025-06-05 11:46:08 +03:00
CrystallEdge Server
9632bc8bfc Automatic changelog update 2025-06-05 00:59:10 +03:00
Red
d16b9c8de7 Kill guards with sharpened blade (#1386)
* disable guard

* sharpening

* remove mithril from trading

* merchants remap

* Update guard_commander.yml
2025-06-05 00:58:04 +03:00
CrystallEdge Server
0b0d2a941f Automatic changelog update 2025-06-04 18:41:24 +03:00
Red
538585d9cb Beer bug (#1384)
* magic beer

* disable personal objectives
2025-06-04 18:40:18 +03:00
CrystallEdge Server
5eaaaf4d3e Automatic changelog update 2025-06-04 14:35:15 +03:00
Red
e6188a3fbf Golden balance touch (#1382)
* gold refactor

* Update ore_veins.yml

* remove gold and mithril from maps
2025-06-04 14:34:08 +03:00
CrystallEdge Server
8907d08718 Automatic changelog update 2025-06-04 12:24:00 +03:00
Red
17be798db4 Grass bags (#1381)
* grass bugs

* move to victoria

* Update tiles_grass_bag.yml
2025-06-04 12:22:54 +03:00
CrystallEdge Server
63b2e530c8 Automatic changelog update 2025-06-04 11:44:21 +03:00
Red
6c47cb8c77 f (#1380) 2025-06-04 11:43:15 +03:00
CrystallEdge Server
08c865bebc Automatic changelog update 2025-06-04 09:58:16 +03:00
Nim
dedd3a8b33 New carpets (#1375)
* new carpets

* Flammable
2025-06-04 09:57:09 +03:00
Ed
20755be5a7 Create changelog.ftl 2025-06-03 19:07:23 +03:00
CrystallEdge Server
7426f4cbf3 Automatic changelog update 2025-06-03 18:13:49 +03:00
Red
c41f20706e +rep (#1376) 2025-06-03 18:12:44 +03:00
CrystallEdge Server
f47c94fc08 Automatic changelog update 2025-06-03 17:11:40 +03:00
Kit
367c53986c change healing to use EvenHealthChange (#1340) 2025-06-03 17:10:33 +03:00
CrystallEdge Server
166eb60e83 Automatic changelog update 2025-06-03 15:38:31 +03:00
Nim
dd6f5a7e6f lockpick artifact (#1374) 2025-06-03 15:37:25 +03:00
Ed
225739a348 Update CP14_Changelog.yml 2025-06-03 14:59:27 +03:00
Mandranir
ca87391672 fix(objects): dropper size to tiny (#1373) 2025-06-03 14:48:24 +03:00
CrystallEdge Server
3b8b5f4def Automatic changelog update 2025-06-03 14:40:45 +03:00
TheKittehJesus
4c7b035c9c New belt controls (#1298)
* Work for a madman

* God, that's a lot of hardcoding

* Fixed belt2 smartequip and cleaned up

* Continued clean up

* No scope creep!

* Replaced belt1 for upstream default belt

* Moved CP14OpenSkillMenu to CP14ContentContexts

* Changed naming of belt1 textures to just belt

* Updated new belt1 refrences

* I forgot to edit the RSI meta

* fix all BELT1 Texture instance

---------

Co-authored-by: Red <96445749+TheShuEd@users.noreply.github.com>
2025-06-03 14:39:39 +03:00
CrystallEdge Server
0558da566a Automatic changelog update 2025-06-03 14:23:30 +03:00
DeLTaAlarm0
261441dd67 Open/closed table sign (#1275)
* Added open/closed sign

* Added open/closed sign

* Update openclosed_sign.yml

* Update openclosed_sign.yml

* Update workbench recipes

* Update openclosed_sign.yml

* Update openclosed_sign.yml

* Update misc.yml
2025-06-03 14:22:24 +03:00
CrystallEdge Server
1e6933be5b Automatic changelog update 2025-06-03 12:44:27 +03:00
Red
581ca2f5ef OP Ballades (#1372) 2025-06-03 12:43:21 +03:00
TheKittehJesus
d4e9049576 Added reset all (non-free) skills (#1343)
* Added reset all (non-free) skills

* I don't know why I didn't do this the first time

* Formatting fixes

* Removed old code and made removal function iterate in reverse order
2025-06-03 10:58:21 +03:00
CrystallEdge Server
766f17e559 Automatic changelog update 2025-06-03 09:42:23 +03:00
TheKittehJesus
a070db91be Changed cashconverter to be anchorable on tables (#1371) 2025-06-03 09:41:17 +03:00
CrystallEdge Server
66df1d83c3 Automatic changelog update 2025-06-03 01:05:38 +03:00
ArZarLordOfMango
72735a627d fix moral (#1368) 2025-06-03 01:04:33 +03:00
CrystallEdge Server
5a78f44ed9 Automatic changelog update 2025-06-03 01:00:14 +03:00
paige404
881a504334 Reorganize slime ymls, adjust damage resistances and vulnerabilities for slimes (#1300) 2025-06-03 00:59:07 +03:00
CrystallEdge Server
186afe7ed8 Automatic changelog update 2025-06-03 00:39:24 +03:00
Red
43913d9d11 cozy (#1367) 2025-06-03 00:38:19 +03:00
Ed
8d8ad5130b Update actions_changelogs_since_last_run.py 2025-06-02 23:34:20 +03:00
CrystallEdge Server
7df16c306d Automatic changelog update 2025-06-02 23:01:22 +03:00
Red
d80ab67391 Update fire.yml (#1365) 2025-06-02 23:00:16 +03:00
Ed
2a5552f44c Update CP14Publish.yml 2025-06-02 22:40:23 +03:00
CrystallEdge Server
d239e33094 Automatic changelog update 2025-06-02 22:34:22 +03:00
Red
9da211a4e0 Ed 02 06 2025 changelog test 8 (#1364)
* Update fire.yml

* Update fire.yml

* Update fire.yml

* Create CP14_Changelog.yml

* Update PULL_REQUEST_TEMPLATE.md

* Update fire.yml

* some edge
2025-06-02 22:33:16 +03:00
CrystallEdge Server
50e629fa07 Automatic changelog update 2025-06-02 22:01:43 +03:00
Red
1a67ee82d6 Ed 02 06 2025 changelog test 7 (#1363)
* Update fire.yml

* Update fire.yml

* Update fire.yml

* Create CP14_Changelog.yml

* Update PULL_REQUEST_TEMPLATE.md

* Update fire.yml
2025-06-02 22:00:37 +03:00
Red
35d6c8041f Ed 02 06 2025 changelog test 6 (#1362)
* Update fire.yml

* Update fire.yml

* Update fire.yml

* Create CP14_Changelog.yml

* Update PULL_REQUEST_TEMPLATE.md

* Update fire.yml
2025-06-02 21:54:33 +03:00
CrystallEdge Server
f4c5a9c71a Автогенерация чейнджлога 2025-06-02 21:51:59 +03:00
Red
c0cda3fb8e Ed 02 06 2025 changelog test 5 (#1361)
* Update fire.yml

* Update fire.yml

* Update fire.yml

* Create CP14_Changelog.yml

* Update PULL_REQUEST_TEMPLATE.md
2025-06-02 21:49:08 +03:00
Red
c037af2f77 Ed 02 06 2025 changelog test 4 (#1360)
* Update fire.yml

* Update fire.yml

* Update fire.yml

* Create CP14_Changelog.yml
2025-06-02 21:44:46 +03:00
Red
96dc23c9ff Ed 02 06 2025 changelog test 3 (#1359)
* Update fire.yml

* Update fire.yml

* Update fire.yml
2025-06-02 21:40:15 +03:00
Red
3bdb9c646d Ed 02 06 2025 changelog test 2 (#1358)
* Update fire.yml

* Update fire.yml
2025-06-02 21:18:58 +03:00
Red
2b1cef9d72 Update fire.yml (#1357) 2025-06-02 21:16:07 +03:00
Red
08c1560a11 Update PULL_REQUEST_TEMPLATE.md 2025-06-02 21:11:11 +03:00
Red
acc8093f9a More economy fixes (#1356)
* fic

* Update base_instruments.yml

* fix

* Update chests.yml
2025-06-02 18:06:56 +03:00
Viator-MV
c939761737 skelemake (#1276)
* skelemake

* sharded

* mastery

* Not so slow cast

* ok no demi deipletion

* skillstorage and Species

* ressurection dead

* fixed

---------

Co-authored-by: Red <96445749+TheShuEd@users.noreply.github.com>
2025-06-02 14:20:45 +03:00
Nim
5a2ccc3e08 Resprite (#1328)
* well resprite

* broken well

* Campfire

* meta

* Quantity
2025-06-02 14:16:42 +03:00
Ed
483a82fdd4 Update grasshighbush.yml 2025-06-02 11:34:01 +03:00
Ed
e953410205 Update peace_ballade.yml 2025-06-02 11:32:01 +03:00
Kit
c35052b9fa STOP POSTING ABOUT THE THING ALL MY FRIENDS ON TIK TOK SENT ME "THE THING" (#1353) 2025-06-02 10:21:51 +03:00
Red
f6dd89ea7a d (#1351) 2025-06-01 21:55:20 +03:00
Red
5c5a473ec0 More merchant content (#1349)
* energy crystals

* thaumaturgy trading
2025-06-01 19:21:41 +03:00
Ed
6fce9dcdaa Update trade_platform.yml 2025-06-01 16:14:08 +03:00
Ed
da45b9bba8 fixes 2025-06-01 15:56:38 +03:00
Red
a3ae67a762 Trade reputation rework + Merchants back + Mining contract (#1347)
* refactor unlocking

* fix contract debug crashing

* Update dev_map.yml

* bugfixes and content rebalance

* ore buy contract
2025-06-01 15:10:36 +03:00
Red
a99f2fcd50 Remove random reaction system (#1345)
* wow

* d
2025-06-01 15:01:32 +03:00
Alexsey Bezyuk
759e7c73d9 furnace radius (#1346) 2025-06-01 12:33:38 +03:00
Ed
bd783f9ec0 Update herbals.yml 2025-05-31 22:04:20 +03:00
Ed
1818f253ae chest fix 2025-05-31 18:07:14 +03:00
Red
10090292a1 Master fix (#1342)
* Update web.yml

* cocoon loot

* Update web.yml
2025-05-31 17:50:01 +03:00
Red
71527bb4eb Merge pull request #1341 from crystallpunk-14/ed-31-05-2025-web
Spider content update
2025-05-31 14:31:44 +03:00
Red
381e556a8d Upstream stable sync (#1326)
* Fix some paradox clone traits (#37467)

fix some paradox clone traits

* Automatic changelog update

* Animal Spawner Reorganization + Xeno Spawners (#36962)

Co-authored-by: Errant <35878406+Errant-4@users.noreply.github.com>

* make small animals don't leave organs on gibbing (#37080)

* Automatic changelog update

* Fix goliath tentacle exploit (#37168)

* New Salvage Wrecks (#36884)

Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>

* Welding locker loot, migrate to EntityTable (#36977)

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>

* Automatic changelog update

* No more one handing "snipers" (#33708)

* Automatic changelog update

* fix cl (#37477)

* Update submodule to 258.0.1 (#37480)

* Content changes for SetTiles change (#37229)

* Content changes for SetTiles change

* Retest with new engine changes

* Derp

* Update for new engine PR changes

* Update submodule to 259.0.0 (#37481)

* Revert "Fix goliath tentacle exploit (#37168)" (#37479)

* Revert "Fix goliath tentacle exploit (#37168)"

This reverts commit 6fbd0c9da1.

* wawawewa

* Predict sleeping action (#37414)

* Predict sleeping action

* reviews

* Automatic changelog update

* Soaked Smokes Volume Revert (#37482)

Reverted the volume of Dan's Soaked Smokes to their previous maximum.

* Automatic changelog update

* Fixed Two-Way Lever Sprites (#37390)

* New conveyor sprites - arrows!

* Revert "New conveyor sprites - arrows!"

This reverts commit 3b540be0d89d93af5028a9ae6533bbdf2954cb75.

* Reworked to only be the lever sprite update.

---------

Co-authored-by: RedBookcase <Usualmoves@gmail.com>

* Change plushie rotation on wide swing (#37484)

Changed swing rotation on shark, carp and snake plushies

* Fix prototypes and datadefs so they pass analyzer checks (again) (#37485)

Fix prototypes so they pass analyzer checks (again)

* Cleanup warnings in `SubFloorHideSystem` (#37488)

Cleanup warnings in SubFloorHideSystem

* Cleanup warnings in `ThrusterSystem` (#37489)

Cleanup warnings in ThrusterSystem

* Cleanup warnings in `PowerChargerVisualizerSystem` (#37491)

Cleanup warnings in PowerChargerVisualizerSystem

* Cleanup warnings in `MaterialStorageSystem` (#37492)

Cleanup warnings in MaterialStorageSystem

* Strip All Debug Verb (#37426)

* init

* yippee

* review

* permission check

* command

* loc

* review

* review

* Apply suggestions from code review

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Automatic changelog update

* Allow recycler to shred clothing (#31518)

* Allow recycler to shred clothing

* reduce

* change comments

* replace ClothMade with Recyclable

* Update Resources/Prototypes/Entities/Clothing/Head/hats.yml

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* requested changes

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Automatic changelog update

* Omega Update (#37490)

* Automatic changelog update

* Cleanup warnings in `LatheSystem` (#37496)

Cleanup warnings in LatheSystem

* Shuttle speed bump (#37505)

* Shuttle speed bump

Will probably go to 80 when guns get bumped and we get CCD but just makes impacts more representative.

* cook

* Automatic changelog update

* Fix tile-events returns (#37502)

* Fix tile-events returns

Should really be continues.

* More

* More optimisations

* Predict pulling hands blocking (#37504)

Think I forgor to add this one when I split the 1 morbillion PRs out.

* Automatic changelog update

* Wall inheritance cleanup (#37436)

* Cleanup walls.yml

* quick check

* Fix tilewall cmd

* More Cleanup

* Arrnrtrayiage

* Remove double parenting

---------

Co-authored-by: Velcroboy <velcroboy333@hotmail.com>

* Not exclusive whitelist diet. Vox regain access to old food. (#37497)

* Creates a secondary digestible whitelist that is not exclusive. Additionally reworks the Vox stomach.

* Update FoodSystem.cs

Remnants of an old attempt. Cleaning it.

* Update vox.yml

Remnants of an old attempt. Cleaning up.

* Whitelist no longer, now the diet exclusion var is a bool.

* Clean-up

* Update Content.Server/Body/Components/StomachComponent.cs

Typo fixing

Co-authored-by: Tayrtahn <tayrtahn@gmail.com>

* Update Content.Server/Body/Components/StomachComponent.cs

Clarifications.

Co-authored-by: Tayrtahn <tayrtahn@gmail.com>

* Update Content.Server/Nutrition/EntitySystems/FoodSystem.cs

Typo fixing

Co-authored-by: Tayrtahn <tayrtahn@gmail.com>

* Update Resources/Prototypes/Body/Organs/vox.yml

Typo fixes

Co-authored-by: Tayrtahn <tayrtahn@gmail.com>

---------

Co-authored-by: Tayrtahn <tayrtahn@gmail.com>

* Automatic changelog update

* Don't group damage in the HealthChange.cs guidebook text (#37507)

* Automatic changelog update

* Cleanup more `SpriteComponent` warnings (part 1) (#37508)

* Cleanup warnings in PuddleSystem

* Cleanup warnings in HandsSystem

* Cleanup warnings in EnsnareableSystem

* Cleanup warnings in ElectrocutionHUDVisualizerSystem
Also simplify some if statements

* Cleanup warnings in PlantHolderVisualizerSystem

* Cleanup warnings in AlertLevelDisplaySystem

* Cleanup warnings in TetherGunSystem

* Fix error in PlantHolderVisualizerSystem

* I hate var _

* Give VGRoid its name back (#37513)

* Automatic changelog update

* Allow protected grids to be repaired (#36989)

* Allow protected grids to be repaired

* Probably implement it

---------

Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>

* Automatic changelog update

* Cleanup more `SpriteComponent` warnings (part 2) (#37522)

* Cleanup warnings in DamageMarkerSystem

* Cleanup warnings in CuffableSystem

* Cleanup warnings in DeployableTurretSystem

* Cleanup warnings in StorageContainerVisualsSystem

* Cleanup warnings in ItemMapperSystem

* Cleanup warnings in ItemCounterSystem

* Cleanup warnings in RandomSpriteSystem

* Cleanup warnings in PowerCellSystem

* Cleanup warnings in ParticleAcceleratorPartVisualizerSystem

* Cleanup warnings in PaperVisualizerSystem

* Cleanup warnings in PoweredLightVisualizerSystem

* Cleanup warnings in LightBulbSystem

* Cleanup warnings in EmergencyLightSystem

* Cleanup warnings in DoorSystem

* Cleanup warnings in ClockSystem

* Cleanup warnings in BuckleSystem

* Cleanup warnings in JukeboxSystem

* Cleanup more `SpriteComponent` warnings (part 2) (#37527)

* Cleanup warnings in MagazineVisualsSpriteTest

* Cleanup warnings in WiresVisualizerSystem

* Cleanup warnings in GunSystem.SpentAmmo

* Cleanup warnings in GunSystem

* Cleanup warnings in GunSystem.ChamberMagazine

* Cleanup warnings in MeleeWeaponSystem.Effects

* Cleanup warnings in ToggleableLightVisualsSystem

* Cleanup warnings in StatusIconOverlay

* Cleanup warnings in SpriteFadeSystem

* Cleanup warnings in PdaVisualizerSystem

* Cleanup warnings in EnvelopeSystem

* Cleanup warnings in MechSystem

* Cleanup warnings in MappingOverlay

* Cleanup warnings in LockVisualizerSystem

* Cleanup warnings in DragDropSystem

* Cleanup warnings in GhostSystem

* Cleanup warnings in TriggerSystem.Proximity

* Cleanup warnings in DragonSystem

* Cleanup warnings in PortableScrubberVisualsSystem

* File-scoped namespace for PortableScrubberVisualsSystem

* Cleanup warnings in `DisplacementMapSystem` (#37511)

* Cleanup warnings in DisplacementMapSystem

* docs update

* Suggested simplification

* Xenoborgs part 3 (#36867)

Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com>
Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
Co-authored-by: Quantum-cross <7065792+Quantum-cross@users.noreply.github.com>
Co-authored-by: pathetic meowmeow <uhhadd@gmail.com>

* Convex update (#37533)

* Automatic changelog update

* The Hatening / Hide hair when hats are equipped (#36818)

* changed HideLayerClothing on some entities YAML

* Use HideLayerClothing with slots, layers does not work for some reason

* Hattened again

* Mooore ! I touched the clown mask, beware

* Fix typo from "Slide" to "Side"

* Build issue, test with commenting out error part

* Trying again...

* Trying for fix

* Automatic changelog update

* Buff metal foam grenades (#37476)

* Buff metal foam grenades

* oh and cant forget my main

* Yeah, no, trolling someone because they didn't powergame a crowbar shiftstart is bad

* Automatic changelog update

* Fix tethergun overlay (#37510)

* Fix tethergun overlay

* slice

* wah

* Update TetherGunOverlay.cs

---------

Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>

* Automatic changelog update

* HumanoidCharacterProfile and IdCardConsoleComponent constants moved to cvar. Sync id card length with character name length (#35407)

* commit

* mark TODOs

* compiles

* cleanup

* cleanup

* oops

* changed my mind

* requested changes

* genpop fix

* Automatic changelog update

* Remove Basic Hardsuit & Associated Files (#37315)

* Remove Basic Hardsuit

* retaliatory action

---------

Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>

* MindRemoveRole refactor (#34880)

* MindRemoveRole refactor

* role removal logstring rework

* zombiesystem fix

* Buff singularity rad collectors (#37475)

* Automatic changelog update

* TemperatureProtection now works directly on entities (#37544)

* init

* review

* review

* Network SolutionScanner (#37541)

* init

* doc

* Make SharpComponent work with Hands (#37543)

* init

* review

* Cleanup `TryAddDisplacement` warnings (#37545)

Cleanup TryAddDisplacement warnings

* DungeonData rework (#37172)

* DungeonData rework

Back to fields, serializes better, just make new layers dumby.

* wawawewa

* Fix this

* Fixes

* review

* thanks fork

* fix

* shuttle impacts port (#37422)

* initial

* adjust densities and thruster hp

* Fix evil hack

* Last stuff

* review, cleanup

* admin RW

* minor cleanup

---------

Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>

* Update submodule to 260.0.0 (#37546)

wawawewa

* Automatic changelog update

* Improve fax machine UI (#33825)

* fax upgraded

* improve resizable

* move Paper type settings & change margins

* change margins & Aling of text

* Rearrange Fax UI

Group paper-type with print-file.
Group refresh button with destination list.

Add some panels to differenciate functionality for faxing an inserted
sheet of paper and printing a local file to a new paper.

* Whitespace

* Remove unnecessary style definition

* Remove whitespace

---------

Co-authored-by: VideoKompany <135313844+VlaDOS1408@users.noreply.github.com>

* Automatic changelog update

* Persist construction menu favorites server-side (#35867)

* Persist construction menu favorites to player profile

* Use `ProtoId`s for construction favorites

* Validate construction favorites updates from the client

* Actually await the async database call

* Automatic changelog update

* Properly add rainbow skirt to passenger loadout this time (#37501)

* Update Credits (#37556)

Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com>

* Cleanup more `SpriteComponent` warnings (part 4) (#37550)

* Cleanup warnings in ClickableSystem

* Cleanup warnings in FultonSystem

* Cleanup warning in HolidaySystem

* Cleanup warning in DoAfterOverlay

* Cleanup warning in EntityHealthBarOverlay

* Cleanup warning in SmokeVisualizerSystem

* Cleanup warning in VaporVisualizerSystem

* Cleanup warning in ColorFlashEffectSystem

* Cleanup warnings in StealthSystem

* Cleanup warnings in TrayScannerSystem

* Cleanup warnings in InventoryUIController

* Cleanup warnings in HideMechanismsCommand

* Cleanup warning in ShowMechanismsCommand

* Cleanup warnings in EntityPickupAnimationSystem

* Cleanup warnings in PointingSystem

* Cleanup warning in StickyVisualizerSystem

* Cleanup warnings in TabletopSystem

* Cleanup warnings in PillSystem

* Cleanup warnings in DiceSystem

* Cleanup warnings in ProjectileSystem

* tweak: Allow cutter machines to be linked to ore silos (#37554)

* Automatic changelog update

* Predict subdermal implants (#37538)

* AutomaticAtmosSystem uses MassDataChangedEvent, clarifies TileMassMultiplier (#37548)

* Initial commit, no tile changes, just mass

* Rename TileMassMultiplier to TileDensityMultiplier

* Fix prisoner closet UI not working (#37558)

Fix prisoner closet UI

* Telecoms Resprite (#35811)

* Medical and Science Servers

Resprited  medical and science servers

* Delete server-off-Recovered.png

* Telecoms and Camera Servers

* Add Copyright

* Fix Rsi

* Minor Stripe Displacement Fix

* Telecoms Sprites

* Telecoms Display Update

Partial Update of the Sprites, Copyright and some YML and JSON changes

* Fix Linter and YML and Finalize

* Remember Lost Router Child

Fix Linter Again (hopefully) and add sprite to entertainment and wireless camera routers

* Requested Review Changes and ect

Changed how the servers dictate how to display whether they have no keys or if they have a mix of keys.

* Re-Run Checks

* Handful of requested changes

* Fix?

* Revert Last

* old yeller

* pushforpr

* Remove Old Files

* Fix Json

* fix rsi for real...?

* Fix Camera Servers

Servers were still calling to telecoms instead of the server sprites

* New Telecom Darken Attempt #1

* Slight stripe change

* Random Whitespace fix

* Fix2boogaloo

* Automatic changelog update

* Amber Station: armory restock (#37432)

* Salvage Job Board (#37549)

* Salvage Job Board

* More development

* Small boy

* Computer yaml (partial)

* UI

* Rank unlock logic

* Job label printing

* appraisal tool integration

* Jobs

* add board to QM locker

* boom!

* command desc

* mild rewording

* ackh, mein pr ist brohken

* Automatic changelog update

* Make research clients grid-local (#36821)

* Limit RD servers to the station grid

* the sluth

* Automatic changelog update

* Improve TryAllReactionsTest (#35356)

* Update TryAllReactionsTest.cs

* mix categories

* Update TryAllReactionsTest.cs

* Jigger transfer amount (#35962)

* Automatic changelog update

* Atmos Air Grenades (#37531)

* Automatic changelog update

* De-loot salvage, add reward crates (#37561)

* Automatic changelog update

* Amber Station - Added Job Board (#37565)

* Automatic changelog update

* Add Blatantly Nuclear to Nuke Songs (#35927)

* Nukies are so back

* Catch this webedit

* Webedit 2: Epic Webedit Fail

* Automatic changelog update

* Add ImplicitRoofComponent (#36112)

* Add ImplicitRoofComponent

So shuttles get marked as rooved.

* Early-out

So the new render doesn't suck up perf unnecessarily.

* Automatic changelog update

* Rebuild ATS Anchor room and add indestructible spine. (#37560)

* Automatic changelog update

* Adds marker component to roof markers (#35453)

* Adds marker component to roof markers

So now you can show and hide them properly.

* a

---------

Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>

* Bomb Deliveries (#37069)

* init

* BOMB!!!

* review

* partial review

* review

* Automatic changelog update

* Stelloxadone (#37131)

init

* Cryoxadone Tweaks (#37132)

fuck cryox

* Traumoxadone (#37236)

* fuck salicylic acid

* small tweak based on playtest

* meh

* locale

---------

Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>

* Automatic changelog update

* Aloxadone Tweaks (#37239)

alox

* Automatic changelog update

* Make Nukie and Wizard Comms Console not announce who it was sent by (#37567)

* Make Nukie and Wizard Comms Console not announce who it was sent by.

* Add doc-comment to field

* Automatic changelog update

* A lone operative successfully nuking the station now actually ends the round. (#36498)

LoneOpsSpawn is now of an indefinite duration -- it lasts until either the LoneOp dies or the nuke detonates. This means a few things.

* Automatic changelog update

* Cleanup atmos air grenade code (#37568)

cleanup

* Fix item stuck check (#37570)

* Automatic changelog update

* Convex job board update (#37579)

* Automatic changelog update

* Fix research server test fail (#37562)

* add: water vapor hurts slimes (#32751)

* water vapor hurts slimes

* 3 looks good

* Update Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Automatic changelog update

* Cleanup more `SpriteComponent` warnings (part 5) (#37590)

* 1 warning in KudzuVisualizerSystem

* 2 warnings in ChameleonProjectorSystem

* 1 warning in MarkerSystem

* 2 warnings in ItemSystem

* 1 warning in GhostToggleSelfVisibility

* 1 warning in FoamVisualizerSystem

* 1 warning in ClickableTest

* 1 warning in ThrownItemVisualizerSystem

* 2 warnings in InfantSystem

* 1 warning in ChasmFallingVisualsSystem

* 1 warning in PotencyVisualsSystem

* 2 warnings in OrbitVisualsSystem

* 2 warnings in BeamSystem

* 1 warning in JitteringSystem

* 1 warning in CardboardBoxSystem

* 2 warnings in StationAiSystem

* 2 warnings in FirelockSystem

* 2 warnings in CargoSystem.Telepad

* 1 warning in StasisBedSystem

* 2 warnings in WeldableVisualizerSystem

* 2 warnings in DeliveryVisualizerSystem

* 1 warning in TimerTriggerVisualizerSystem

* 1 warning in StorageFillVisualizerSystem

* 2 warnings in RadiationCollectorSystem

* 2 warnings in BorgSwitchableTypeSystem

* 1 warning in TurnstileSystem

* 1 warning in SurveillanceCameraVisualsSystem

* 1 warning in BurnStateVisualizerSystem

* 2 warnings in CableVisualizerSystem

* 1 warning in JetpackSystem

* Black Scarf Icon Fix (#37589)

* forgot like a dumbass

* attributions

* Add keybind for swapping hands in the other direction (#37588)

add swap hands reverse

* Automatic changelog update

* Force Wall Tweaks (#37525)

* Reduces forcewall time to 10 seconds

* Increases force wall action delay to 15

* Adds Special Wall Layer

* Fixes indenting. Changes Mask and Layer to Special Wall Layer

* Update Resources/Prototypes/Entities/Structures/Walls/walls.yml

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Automatic changelog update

* Make early salvage jobs easier (#37598)

* Box Station - Added Job board (#37602)

* Automatic changelog update

* remove ignition functional from welder component (#37586)

* a

* webedit

* EntityLootTable deleted (#37604)

* Make Holy water evaporate like normal water (#37611)

holy water evaporates

* Automatic changelog update

* Cleanup `SpriteComponent` warnings in map renderer (#37609)

* 3 warnings in EntityPainter

* 1 warning in MapPainter

* Pepper makes you cough (#36358)

* Automatic changelog update

* Elkridge - Salv job board and overhaul (#37600)

* Automatic changelog update

* Magazine Sprite Fix (#37615)

* first

* long mag + mk58 color

* loop salvage job board (#37618)

* Remove `ParallaxVV` property from `ParallaxComponent` (#37617)

Delete ParallaxVV

* Mirror Shield Contraband Fix (#37620)

easy change

* Cleanup 2 warnings in `ReagentDispenserSystem` (#37622)

* Cleanup 2 warnings in ReagentDispenserSystem

* Eh, let's be specific

* Add validation test for `ExplosionPrototype`s (#37621)

* Add validation test for ExplosionPrototype

* Remove runtime validation in prototype

* Researchable & Printable Hyper Capacity Cells (#37619)

* wowwww batterie

* americanized the spelling of "maximised" to "maximized"

* changed recipe to be more unique from microreactors

* addressing requested changes

* Automatic changelog update

* Updated Salvage Guidebook. (#37593)

Co-authored-by: RedBookcase <Usualmoves@gmail.com>

* Automatic changelog update

* Give kammerer tighter spread so it's not a complete downgrade to the enforcer (#37616)

* Automatic changelog update

* Cleanup more `SpriteComponent` warnings (part 6) (#37607)

* 1 warning in MechAssemblyVisualizerSystem

* 2 warnings in RecyclerVisualizerSystem

* 1 warning in ClusterGrenadeVisualizerSystem

* 2 warnings in BarSignSystem

* 4 warnings in AlertControl

* 1 warning in ToolSystem

* 2 warnings in PinpointerSystem

* 2 warnings in ClientSpriteMovementSystem

* 2 warnings in OptionsVisualizerSystem

* 1 warning in FlatpackSystem

* 1 warning in ZombieSystem

* 1 warning in StackSystem

* 1 warning in MiningOverlay

* 1 warning in FlippableClothingVisualizerSystem

* Guard clause for MechAssemblyVisualizerSystem

* Get SpriteSystem in AlertControl constructor

* Galosh Slowdown Fix (#37628)

Begone Galosh

* Automatic changelog update

* Submodule Update 260.1.0 (#37633)

* CompFactory updates (#37559)

* Fixed Missing or Misconfigured Locale Keys (#37595)

* Fixes and adds many localization keys from #34343
Open

* Fix comment, that is not how that works.

* Update Resources/Locale/en-US/components/screen-component.ftl

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Fixes cmd-parse-failure-int -> cmd-parse-failure-integer in OptionsUIController.cs, removes cmd-parse-failure-int from options-menu.ftl

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* add reduced motion drug overlay (#37584)

* reduced motion flash effect

* reduced motion drug overlay

* Revert "reduced motion flash effect"

This reverts commit e350b2899d0acc78c9833b5bc23a9680e03b2736.

* Automatic changelog update

* Bombsuit Description Fix (#37631)

simple as that

* New fun meteors (#37327)

* New fun meteors

* Forgot about newline

* Fix

* Wow, a new test

* Okay

* Fix

* Fix 2

* I hope this is correct enough

* Attribution

* Attribution 2

* Automatic changelog update

* Slime storage QoL (#37592)

* Automatic changelog update

* Cleanup warning CS0414 (#37648)

* Fland Update (Salvage Job Computer) (#37653)

* Bagel Update (Salvage Job Computer) (#37652)

* Automatic changelog update

* Marathon Update (#37654)

* Automatic changelog update

* Omega Update (Salvage Job Computer) (#37655)

* Automatic changelog update

* Packed Update (Salvage Job Computer) (#37656)

* Automatic changelog update

* Epinephrine Antihistamine effect, Histamines not radioactive (#37460)

* Added Epinephrine antihistamine effect when at least 45u. Removed Histamines causing Radiation damage.

* Indentation fixed

* had coffee, able to see how to fix indentation now.

* Automatic changelog update

* Fix Misplaced Mapping CL Entries (#37670)

Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>

* Adding fungal soil (#36245)

Co-authored-by: aliser <20380250+murolem@users.noreply.github.com>

* Box Station - Added GenPop (Sec redesigned) (#37663)

* Automatic changelog update

* Automatic changelog update

* Optimise storage a quadrillion times (#37638)

* Optimise storage a quadrillion times

* How sweaty can we get

* Add fast angle checks

* Fix chunk indices

* Optimise the refresh method

Helps on client a lot as the clientside is suboptimal atm.

* Better name

* wawawewa

* Add single-angle path

* Okay FINE rider

* Automatic changelog update

* fix soil locale (#37674)

* fix soil locale

* xdd

* Reach Update (#37669)

* Automatic changelog update

* Limit shuttle collision damage (#37578)

* outlaw the usage of spacecraft as weapons of mass destruction

* adjust slowdown

* Automatic changelog update

* Use velocity along normal for shuttle impacts (#37667)

* Use velocity along normal for shuttle impacts

Scrapes shouldn't have the same level of destruction as full-on ramming anymore. Also detecting scrapes should be a lot easier for future stuff.

* Update Content.Server/Shuttles/Systems/ShuttleSystem.Impact.cs

* Update submodule to 260.2.0 (#37684)

* Automatic changelog update

* inhands for Syndicate Things (and thief beacon) (#37682)

* initial

* splitting this b

* thief bacon 1 handed

* why is test fail

* dont fail please

* "requires"

* evil tests

* Remove static logger calls in `LateJoinGui` (#37688)

* Cleanup 2 static logger calls in LateJoinGui

* That's not how that works

* Ore + entitytable fixes (#37675)

* Ore + entitytable fixes

Iterate every dungeon not just last.

* Big shot

* Fixes

* make some stuff require two hands (#37683)

* get splitted

* thievy 1 handed

* scarko changes

* Automatic changelog update

* Fix glass external airlocks using the standard airlock emergency access lights. (#37666)

Update emergency_unlit.png

* Change Arachnid Layering (#36357)

* 1 commit ops

* untouching this before anyone has to tell me

* Add microwave-nukedisk interaction (#36114)

* Add microwave-nukedisk interaction

* popup

* Fix UninitializedSaveTest

* Automatic changelog update

* Screaming for cyborgs (#32329)

* Automatic changelog update

* Tweak "Help a fellow traitor" objective to allow yellowtexting (#37679)

init

* Automatic changelog update

* Evac Shuttle Wode update (#37223)

* Cleanup warnings in `NodeVisualizationOverlay` (#37707)

Cleanup 2 warnings in NodeVisualizationOverlay

* Cleanup warnings in `AtmosPipeAppearanceSystem` (#37706)

* Cleanup 2 warnings in AtmosPipeAppearanceSystem

* Let's use the Entity<T> version

* todo comment

* Optimize parallax VRAM usage (#37180)

* Disable parallax texture preloading

Many parallax layers are specific to a single map and will likely never be loaded for the duration of the game. Save VRAM by not loading them always.

Requires engine master

* Put generated parallax identifier in texture name

Makes it show up properly in debugging tools

* Don't load generated parallaxes multiple times

Many parallax prototypes re-use the same generated parallax configs. These generated parallaxes were being loaded multiple times at once, which was a massive waste of VRAM.

We now move these into a separate cache for deduplication. I had to write a lot of logic to handle loading cancellation and ref counting. Yay.

Also fixes some spaghetti with the previous parallax loading system: cancellation didn't work properly, give proper names to generated texture names, etc.

This saves like 100+ MB of VRAM.

* Automatic changelog update

* Cleanup warning in `GridInRange` (#37699)

Cleanup warning in GridInRange

* Significantly improve Tesla generator power stability (#37626)

* Significantly improve Tesla generator power stability

* Second round of balancing

* Automatic changelog update

* Update `SharedBiomeSystem` methods to use `Entity<T>` (#37698)

* Fix warning in TryGetBiomeTile

* Overload TryGetBiomeTile

* Overload more methods, fix internal warnings

* Update TryGetEntity uses

* Update TryGetTile uses

* Cleanup TryGetDecals use

* Formatting

* Two more warnings while we're here

* Add disposal signalers (#37535)

* Add disposal signalers

* Sprite changes

* Some requested changes

* Requested changes + change spelling to be with two l's to be consistent with the remote signaller

* Automatic changelog update

* Tweak "Escape" objective to allow yellowtexting (#37680)

init

* Automatic changelog update

* Rat King Chat Indicator (#37184)

* Rat King Chat Indicator

* BUFFRATWHEN

* Added it to the crown wawa

* Ignore this

* Whats the limit for stuff I can put here?

* Fix da merge conflicts for real this time

* WE DID ITgit add -A

* Errant Requested Changes

* Add gold and silver material crates, balance cargo mat crate prices (#37713)

* Automatic changelog update

* Fix storage (#37714)

The one path I forgot to get the relative index.

* comment out slotblocker yaml (#37827)

* comment out slotblocker yaml

* let me fix this real quick xD

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* hotfix the hotfix, slot blocker changelog (#37845)

remove changelog for slot blockers due to being reverted

* HOTFIX Cryochem revert (#37844)

* Revert "Traumoxadone (#37236)"

This reverts commit 55ec2632a8.

* Revert "Cryoxadone Tweaks (#37132)"

This reverts commit 406bfa3308.

* Revert "Stelloxadone (#37131)"

This reverts commit f415ad51c3.

* whitespace test fail evasive maneuver

* changelog 1984

* Fix storage fastpath logical oversight (#37852)

* entityloottable conflicts fix

* dungenore wawa

* cs fix, demiplane fix

* Update check-trailing-whitespace.yml

* global whitelist fix

* return vanilla vgroid gen

* Update onion.yml

* try fix new lines

* fix reagent guidebook

* Update GuideReagentReaction.xaml.cs

* Update GuideReagentReaction.xaml.cs

* Update GuideReagentReaction.xaml

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com>
Co-authored-by: Southbridge <7013162+southbridge-fur@users.noreply.github.com>
Co-authored-by: Errant <35878406+Errant-4@users.noreply.github.com>
Co-authored-by: kosticia <kosticia46@gmail.com>
Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
Co-authored-by: Tezzaide <ewankayne@hotmail.co.uk>
Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
Co-authored-by: K-Dynamic <20566341+K-Dynamic@users.noreply.github.com>
Co-authored-by: Blitz <73762869+BlitzTheSquishy@users.noreply.github.com>
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Co-authored-by: Tayrtahn <tayrtahn@gmail.com>
Co-authored-by: Chartman <connorhartman95@gmail.com>
Co-authored-by: RedBookcase <crazykid1590@gmail.com>
Co-authored-by: RedBookcase <Usualmoves@gmail.com>
Co-authored-by: Jessey van Hoeijen <114107545+LMSNoise@users.noreply.github.com>
Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com>
Co-authored-by: lzk <124214523+lzk228@users.noreply.github.com>
Co-authored-by: Spanky <scott@wearejacob.com>
Co-authored-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>
Co-authored-by: Velcroboy <velcroboy333@hotmail.com>
Co-authored-by: Qerd <73325910+BigfootBravo@users.noreply.github.com>
Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
Co-authored-by: Samuka-C <47865393+Samuka-C@users.noreply.github.com>
Co-authored-by: Quantum-cross <7065792+Quantum-cross@users.noreply.github.com>
Co-authored-by: pathetic meowmeow <uhhadd@gmail.com>
Co-authored-by: Spessmann <156740760+Spessmann@users.noreply.github.com>
Co-authored-by: Banedon <15725971+Lanedon@users.noreply.github.com>
Co-authored-by: āda <ss.adasts@gmail.com>
Co-authored-by: Ilya246 <57039557+Ilya246@users.noreply.github.com>
Co-authored-by: eoineoineoin <helloworld@eoinrul.es>
Co-authored-by: VideoKompany <135313844+VlaDOS1408@users.noreply.github.com>
Co-authored-by: YotaXP <yotaxp@gmail.com>
Co-authored-by: paige404 <59348003+paige404@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Perry Fraser <perryprog@users.noreply.github.com>
Co-authored-by: Krunklehorn <42424291+Krunklehorn@users.noreply.github.com>
Co-authored-by: Spangs04 <40036609+Spangs04@users.noreply.github.com>
Co-authored-by: Nox <nebulousnox38@gmail.com>
Co-authored-by: Oleshe <125771937+0leshe@users.noreply.github.com>
Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com>
Co-authored-by: Minemoder5000 <minemoder50000@gmail.com>
Co-authored-by: Peptide90 <78795277+Peptide90@users.noreply.github.com>
Co-authored-by: Simon <63975668+Simyon264@users.noreply.github.com>
Co-authored-by: Super <84590915+SuperGDPWYL@users.noreply.github.com>
Co-authored-by: qwerltaz <69696513+qwerltaz@users.noreply.github.com>
Co-authored-by: SeamLesss <kai.julian.watson@gmail.com>
Co-authored-by: keronshb <54602815+keronshb@users.noreply.github.com>
Co-authored-by: Deerstop <edainturner@gmail.com>
Co-authored-by: TytosB <54259736+TytosB@users.noreply.github.com>
Co-authored-by: Entvari <195642967+Entvari@users.noreply.github.com>
Co-authored-by: SpeltIncorrectyl <66873282+SpeltIncorrectyl@users.noreply.github.com>
Co-authored-by: TrixxedHeart <46364955+TrixxedBit@users.noreply.github.com>
Co-authored-by: B_Kirill <153602297+B-Kirill@users.noreply.github.com>
Co-authored-by: Kittygyat <202250949+Kittygyat@users.noreply.github.com>
Co-authored-by: FrostRibbon <107171544+FrostRibbon@users.noreply.github.com>
Co-authored-by: Minty642 <42335609+Minty642@users.noreply.github.com>
Co-authored-by: aliser <20380250+murolem@users.noreply.github.com>
Co-authored-by: mubururu_ <139181059+muburu@users.noreply.github.com>
Co-authored-by: Kyle Tyo <36606155+VerinSenpai@users.noreply.github.com>
Co-authored-by: HTML/Crystal <152909599+HTMLSystem@users.noreply.github.com>
Co-authored-by: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com>
Co-authored-by: AsnDen <75905158+AsnDen@users.noreply.github.com>
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
Co-authored-by: Wolfkey-SomeoneElseTookMyUsername <wolfkey75@gmail.com>
Co-authored-by: YoungThug <ramialanbagy@gmail.com>
2025-05-31 00:25:16 +03:00
Ed
0dd379dec3 Merge branch 'master' into ed-27-05-2025-upstream-sync 2025-05-30 23:24:23 +03:00
Ed
42fd0fe070 Update GuideReagentReaction.xaml 2025-05-30 23:14:33 +03:00
Ed
4a0c76ba76 Update GuideReagentReaction.xaml.cs 2025-05-30 23:14:22 +03:00
Ed
d5b15f6816 Update GuideReagentReaction.xaml.cs 2025-05-30 21:05:19 +03:00
Nim
b28c5605b9 zombie speed (#1337) 2025-05-30 18:22:39 +03:00
Ed
a0956a399a fix reagent guidebook 2025-05-30 15:43:23 +03:00
Red
7d658de8a1 Merge branch 'master' into ed-27-05-2025-upstream-sync 2025-05-30 14:54:06 +03:00
Ed
df9c7e4439 try fix new lines 2025-05-30 14:52:00 +03:00
Ed
66022d1312 Update onion.yml 2025-05-30 14:39:47 +03:00
Ed
d8e4698191 return vanilla vgroid gen 2025-05-30 14:38:35 +03:00
Ed
44149a6db8 global whitelist fix 2025-05-30 14:04:04 +03:00
Ed
7c852cdc8c Update check-trailing-whitespace.yml 2025-05-30 13:36:52 +03:00
Ed
f78b1e07c5 cs fix, demiplane fix 2025-05-30 13:28:08 +03:00
SenorJaba
3972d047c7 Guard bell resprite change (#1335) 2025-05-30 09:49:21 +03:00
Kit
2c5655ee69 Update Blood healing and blood absorpsion (#1331) 2025-05-30 01:59:48 +03:00
Ed
5e6d1d0b3a dungenore wawa 2025-05-29 22:14:14 +03:00
Ed
8006578845 fix #1311 2025-05-29 00:57:12 +03:00
Red
7642f49b00 Merge branch 'master' into ed-27-05-2025-upstream-sync 2025-05-29 00:50:36 +03:00
Ed
9b6ceb8d18 caves fix 2025-05-29 00:45:41 +03:00
Fr0goo
3d964cbf04 Goblin Speech noise (#1304)
* Goblin Speech noise

added some goblin speech noises using various already existing goblin sounds. just cropped and stuff

* Fixed capitalization

* Apply suggestions from code review

Co-authored-by: Nim <128169402+Nimfar11@users.noreply.github.com>

---------

Co-authored-by: Nim <128169402+Nimfar11@users.noreply.github.com>
2025-05-29 00:24:21 +03:00
Red
cde388f5dd Another Merchant gameplay attempt (#1308)
* setup UI

* setup debug data

* graph control setup

* reputation trade component

* unlocking logic

* smoe real reputation costing

* remove sponsors part, add trading specific UI nodes

* port to default pricing system

* buy cooldown

* fuck off trading cabinets

* real good cooldown UI

* Cool unlock sound

* reputation earning

* cool purchare sound

* coin & sprite work

* delete old guidebooks

* cool purcharing VFX

* better ui

* victoria gardens

* Update migration.yml

* Update migration.yml

* cooldown removed

* contracts

* Update migration.yml

* remove CP14Material

* materials appraise

* food appraise

* auto economy pricing system

* alchemy reagents appraise

* coins resprite

* alchemy appraise 2

* modular weapon appraise

* selling platform

* Update PricingSystem.cs

* Update CP14TradingPlatformSystem.cs

* merchants returns + map update

* Update CP14StationEconomySystem.Price.cs
2025-05-29 00:22:47 +03:00
Lucson1337
0551caf98f Eye patch/глазная повязка (#1329) 2025-05-29 00:22:20 +03:00
Aisu9
995429d041 Small healing magic rebalance. (#1323)
* Healing small rebalance

* Healing spell small rebalance 2

* Healing Spell Rebalance 3

* Update cure_wounds.yml

* Update cure_poison.yml

* Update cure_wounds.yml

* Update cure_poison.yml

* Update cure_heat.yml

* Update cure_wounds.yml
2025-05-29 00:21:31 +03:00
Ignaz "Ian" Kraft
33bb537f81 make heat and freeze work on reagents (#1314)
* make heat and freeze work on reagents

* has to run before AdjustTemperature

* implement suggested changes

* almost missed this edge case

* 0k is the limit

* cleanup
2025-05-28 00:24:01 +03:00
Nim
2607eaeddd Polymorph return (#1327)
* polymorph return

* AliveTarget
2025-05-28 00:08:58 +03:00
Ed
2af8553f03 Update ConstructionMenuPresenter.cs 2025-05-27 23:15:14 +03:00
Red
8dfca40435 Update Dev.toml 2025-05-27 21:52:07 +03:00
Red
cc2a76f967 Update Dev.toml 2025-05-27 21:37:06 +03:00
Ed
f509f0e152 entityloottable conflicts fix 2025-05-27 12:42:46 +03:00
Ed
d5fbdbdec0 Merge remote-tracking branch 'upstream/stable' into ed-27-05-2025-upstream-sync
# Conflicts:
#	.github/CODEOWNERS
#	Content.Client/Guidebook/Controls/GuideReagentReaction.xaml.cs
#	Content.IntegrationTests/Tests/Chemistry/TryAllReactionsTest.cs
#	Content.Server/Procedural/DungeonJob/DungeonJob.OreDunGen.cs
#	Resources/Prototypes/Entities/Effects/chemistry_effects.yml
#	Resources/Prototypes/Entities/Mobs/Customization/Markings/human_hair.yml
#	Resources/Prototypes/GameRules/meteorswarms.yml
#	Resources/Prototypes/Procedural/dungeon_configs.yml
2025-05-27 12:21:14 +03:00
abdpocoyo
67f8135a96 Update loadout.ftl (#1325) 2025-05-27 11:38:30 +03:00
Kit
89dd70d7cd Iceshard nerf (#1324) 2025-05-27 11:38:03 +03:00
Sefaia
f77a2c55c3 Added Guidebook entry for Locks, Keys and Lockpicking (#1307)
* Added Guidebook entry for Locks, Keys and Lockpicking

* Created a Mechanics Catagory for the Guidebook and allocated the two entries to it.

* Reorganized Lock and Lockpicking along adding TODO on mechanics

* Oops! Correcting a mistake at Lockpicking 101. Thank you @Woolpix18!

* Added a small fun fact about Lockpicks.

* Added Guidebook entries for Russian (IN NEED OF TRANSLATION) and simplified the guidebook entries for ease of reading.

* Update mechanics.yml

* Update mechanics.yml

---------

Co-authored-by: Red <96445749+TheShuEd@users.noreply.github.com>
2025-05-27 11:32:13 +03:00
github-actions[bot]
b665b371f6 @abdpocoyo has signed the CLA in crystallpunk-14/crystall-punk-14#1325 2025-05-27 00:49:45 +00:00
github-actions[bot]
bfc23f2ff6 @KittyCat432 has signed the CLA in crystallpunk-14/crystall-punk-14#1324 2025-05-27 00:43:17 +00:00
github-actions[bot]
f7bb8aec75 @Aisu9 has signed the CLA in crystallpunk-14/crystall-punk-14#1321 2025-05-26 23:57:30 +00:00
Nemanja
854c506a75 Fix storage fastpath logical oversight (#37852) 2025-05-26 21:26:28 +02:00
Errant
02fe5b4ac5 HOTFIX Cryochem revert (#37844)
* Revert "Traumoxadone (#37236)"

This reverts commit 55ec2632a8.

* Revert "Cryoxadone Tweaks (#37132)"

This reverts commit 406bfa3308.

* Revert "Stelloxadone (#37131)"

This reverts commit f415ad51c3.

* whitespace test fail evasive maneuver

* changelog 1984
2025-05-26 16:49:34 +02:00
github-actions[bot]
53f52c090e @Peck3 has signed the CLA in crystallpunk-14/crystall-punk-14#1318 2025-05-26 14:19:40 +00:00
Errant
6bdcadfde3 hotfix the hotfix, slot blocker changelog (#37845)
remove changelog for slot blockers due to being reverted
2025-05-26 15:29:34 +02:00
paige404
100603ece6 Sentient items no longer count as party members (#1317) 2025-05-26 13:29:33 +03:00
Nim
a1323c7b29 Tavernkeeper's Sandwich (#1280)
* burger

* Sandwich

* Separator

* CP14Sandwich
2025-05-26 12:53:07 +03:00
Nim
91cebc07c4 Merge pull request #1278 from Nimfar11/books
Books sprite
2025-05-26 12:52:58 +03:00
Red
a2161bf473 Stable upstream sync (#1266)
* Add some salvage ruins (#36814)

Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>

* Amber Station - Added Genpop (#36997)

* Automatic changelog update

* MapManager warning cleanup on tests (#36940)

lets see if this works.

* Clear MIDI masters properly to avoid replay freezes (#36809)

While trying to play a replay I noticed that the replay would freeze
when seeking in some cases. After some debugging, I discovered that two
MIDI renderers had each other as master, which caused an infinite loop
processing MIDI events.

I'm not entirely sure of the sequence of events that leads to this
during replay playback, but I did notice that MIDI render masters are
never set to null. This is in the best case just a memory leak, in the
worst case probably the source of the bug, so... I fixed that.

* make scrubber widenet in panic mode (#37013)

* Automatic changelog update

* Shoulder-length hairstyles resprite (#37000)

* sprite

* final

* final (final fr)

* Automatic changelog update

* Fix mail cutting thinking your arms are infinite length (#37019)

* init

* hand

* Automatic changelog update

* Xenoborgs part 2 (#36844)

* add lawsets for the xenoborgs and mothership core

* add xenoborg names

* add xenoborg radio

* add xenoborg device frequency

* add xenoborg access

* add xenoborg contraband

* Update Resources/Locale/en-US/station-laws/laws.ftl

Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com>

* add xenoborg access to the universal Id card and universal access config

* remove 6th law of xenoborg and mothership lawset (got jointed into the 5th law)

* added xenoborg and mothership law boards

* add more names

* add Xenoborg faction

* moved all lawboards into a separate yml file

* removed custom xenoborg contraband severity

* add Xenoborg and Mothership components

* add xenoborg laser guns

* add self recharging fire extinguisher

* add mothership pinpointer

* add material bag

* add infinite jetpack

* add a only blue energy dagger

* add xenoborg jammer

* add refueling welding tool

* add nocturine hypo

* add nuclear small power cell

* add cloaking device

* add xenoborg door remote

* add custom sprites for xenoborg modules

* add custom sprites for xenoborg module actions

* removed Xenoborg Comp until is actually needed

* add xenoborg module tags

* spelling

* add xenoborg module bases

* organazied xenoborg modules sprites better

* add generic xenoborg modules

* add heavy xenoborg modules

* add engi xenoborg modules

* small fix to meta file in actions_borg.rsi

* renamed mothership comp to XenoborgMothership

* fixed the base for the xenoborg engi modules

* add scout xenoborg modules

* add stealth xenoborg modules

* localization for names and descriptions of the xenoborg modules

* fixed issues related to the XenoborgMothership component

* revert localization (it wasn't working for some reason)

* fixes

* fixed issue with container slot in the cloaking device

* Update description of small capacity nuclear power cell

Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>

* Fix indentation in material bag

Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>

* Spelling

Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>

* fix parameter order in some prototypes

* rename proto id InfiniteJetpack to JetpackXenoborg

* localize pinpointer targets

* Revert "localize pinpointer targets"

doesn't work

* added lines in the end of files (and in the middle of one)

* reorder paramenter in some entities

* fixed some descriptions

* minor fixes

---------

Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com>
Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>

* Disown atmos and botany (#37017)

* Disown atmos and botany

* Update .github/CODEOWNERS

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Fix t-ray scanner exception spam (#37018)

* Automatic changelog update

* Remove Contact Slowdown when Weightless or in the Air (#33299)

* removed contact slowdowns from entities that are weightless or in the air

* fixed kudzu not applying contact slowdown to airbone entities

* revert kudzu fix

* reimplemented kudzu fix with bool datafield

* update variable serialization format

Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com>

* empty commit

* cleaned up and added documentation

* cached airborne check

* rerun tests

* minor review

---------

Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com>
Co-authored-by: Milon <milonpl.git@proton.me>

* Automatic changelog update

* Theatre access to Service Request Computer (#37003)

* Automatic changelog update

* BatteryWeaponPowerCell tweaks (#33500)

* BatteryWeaponPowerCell tweaks

* add update ammo ev & shuttle guns tweaks

* MilonPL requested changes

* revert changes in OnPowerCellChanged

* Add events to get charge info & change current charge

---------

Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>

* Buffing slugs and replacing beanbags from the Bulldog bundle (#33517)

Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>

* Automatic changelog update

* Rebalance magnet debris, update worldgen (#37025)

* Automatic changelog update

* Display obvious plant mutations in examine text (#32650)

* Effect mutations now display on examine

* ChangeSpecies shouldn't stay on the list after running. Name cleanup

* EmoGarbage Review - convert description to LocId and add minor logic fix

* fix the dastardly yaml

---------

Co-authored-by: PraxisMapper <praxismapper@gmail.com>
Co-authored-by: EmoGarbage404 <retron404@gmail.com>

* Automatic changelog update

* SSD sleep take 2 (#34039)

* ssd sleep part 2

* forgot this

* apply review

* yeah

* add onmapinit

* cache cvar values

---------

Co-authored-by: EmoGarbage404 <retron404@gmail.com>

* Automatic changelog update

* More Mail Sprites (#37023)

* Commit

* Sprite update

* Last push for real for real

* Final Commit for real for real for real

* oasis genpop (#37031)

* Automatic changelog update

* re-buffs proto kinetic accelerator (#37012)

* new ruins

* genpop

* nvm

* abc

* fuckin

* turnstyle

* ruins

* stamp

* abc

* bruh

* efg

* pka fixed

* range tweak

* Automatic changelog update

* Chem master more unit transfer buttons (#36995)

* Changes chem master unit transfers to be the same as the chem dispenser

* adds chem master transfer buttons for 15u, 20u, and 30u

* Automatic changelog update

* Add borders to the asteroid sand (#35397)

* tiles

* Fix

* borderless

* Astrosand

* Add tile

* Fix

* Push horn  (#36009)

* Empty commit

* epic super duper cool fr push horn draft

* whoops turns out theres a system that does that thingi already x.x

* bunch of like fixis and generalization

* general progress

* most stuffies done

* last thingi hopefully

* small fixies, mostly preventing bypassing the delay by spamming

* rename to fit better

* rename for real i forgor to add

* weird fixie but last commit didn workie

* oki shold be fine now

* lastish cleanup

* fixies

* missed a space

* removed unnecessary component check

* getting the typos out of the way first

* moved the component to shared

* rest of fixies

* Automatic changelog update

* Fix solution visualization after drawing with a whitelist (#36657)

* Fix clientsided alerts being overwritten by server (#37033)

Initial commit

* Automatic changelog update

* Added Space Carp Tooth Arrows and Sharkminnow Spears, buffs sharkminnow teeth. (#31257)

* carp arrow, sharkminnow tooth spear

* review

---------

Co-authored-by: EmoGarbage404 <retron404@gmail.com>

* Automatic changelog update

* Add inhand sprites for mini jetpack (#37041)

* Inhand sprites for mini jetpack

* Attribution

* Show other speso colours, add larger denominations (Frontier#1496) (#37030)

* Automatic changelog update

* Added warning when attempting to run RUN_THIS on a zip repo download (Attempt 2) (#36922)

* Added warning when attempting to run RUN_THIS on a zip repo download

* Fix it actually

* Update git_helper.py

* Add toolbox sound effects (#37048)

* Automatic changelog update

* Mail visual update (#37049)

* Automatic changelog update

* Un-copypaste wallmount substation prototype to give them a UI (#37047)

*sigh*

* Automatic changelog update

* Centcomm carapace, moved armour from vests.yml to armor.yml (#35301)

* centcomm carapace, loadout for CC official, move armoured vests from vests.yml to armor.yml

* revert rename from previous commit; command carapace returned to captain's carapace

* meta.json 4 space

* restored deleted comments for some armours and original description for slim armour

* Add recently added elite web vest

---------

Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>

* Automatic changelog update

* Fix NPCs stalling when too many exist (#37056)

Fix NPC stalling when too many exist

* Automatic changelog update

* feex oasis portal (#37058)

* fix so that the meat patty uses the meat patty sprite on custom burgers (#37064)

* Fix examine prediction (#36999)

If our current ID is different to the received one we should just discard it even if it's for the same entity.

Note that this doesn't quite fix my prediction issue as client and server are using slightly different timings for the event.

* add StationTrackerComponent (#36803)

* maybe I am cooking

* logmissing

* copy paste oops

* add some stuff

* review

* fix

* rerun tests

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Minor ReflectionSystem refactor (#37039)

* ReflectComponentLogicFix

Added bool InRightPlace and updated relevant system

* Using SlotFlags

* edits

* refactor

* add missing relay

---------

Co-authored-by: BIGZi0348 <svalker0348@gmail.com>

* Automatic changelog update

* Update submodule to 255.1.0 (#37071)

* new salv ruins (#36947)

* add new salv ruin: telesci (#36653)

* Automatic changelog update

* Fix turnstile collision with firelocks (#37074)

* Automatic changelog update

* Skeletons leave glove fiber evidence (#37077)

Fix skeleton forensics

* Automatic changelog update

* Fix action ent prediction (#37076)

Buttons don't get created in the predicted methods only on state handler.

* Automatic changelog update

* Make universal access config better (#37079)

* add a universal ID card to the universal access config

* make the admin access config have infinite range

* now checks for the BypassInteractionRange Tag instead

* Add suggested fix to the AccessOverrider system

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* remove other stuff I added

* another suggested change to avoid weird behaviour where you can use it from a distance

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Automatic changelog update

* Fix listcontainer constantly disposing children (#37089)

* Fixes battery weapons changing firemode on wield (#37085)

Credit to Happyrobot33 for the implementation

Co-authored-by: Matthew Herber <32679887+happyrobot33@users.noreply.github.com>

* Automatic changelog update

* cleanup snipers.yml (#37094)

* cleanup revolvers.yml (#37095)

* Localizable craftmenu (#32339)

* Now the name of the target craft items is taken directly from the prototypes

* Deleting unnecessary fields

* Deleting unnecessary fields

* Added suffix field

* Added override via localization keys

* My favorite ItemList and TextureRect have been replaced with ListContainer and EntityPrototypeView

* Fix suffix

* Fix construction ghosts... maybe

* Remove suffix from UI

* Suffixes have been removed from prototypes

* Added a description for the secret door

* Fix search..?

* The Icon field of ConstructionPrototype has been removed

* StackPrototypes used in the construction menu have been localized

* TagConstructionGraphStep used in the construction menu have been localized

* The search bar has been localized

* Fix localization and prototypes

* Recipes are now only loaded when the crafting window is opened.

* Fix crooked merge grid of the crafting menu.

* Localization update

* Fix cyborg graph

* Revert "Recipes are now only loaded when the crafting window is opened."

This reverts commit 97749483542c2d6272bda16edf49612c69a0761a.

* Fix loc

* fix merge

* Fix upstream

* Some of the logic has been moved to Shared

* fix

* Small adjustments

* Very small change

---------

Co-authored-by: EmoGarbage404 <retron404@gmail.com>

* Vox now can eat trash other other inedible things (#35681)

* EAT TRASH EXHALE AMMONIA

Update to files

* Forgot to port this file

* 1D4 Guidance

* Summary (required)

Suggested changes and fixes

* Cries in conflicts

* Why do we exist? To suffer?

* 1 citation for being stupid

* THE ANTIDOTE, THE ANTIDOTE FOR THE POISON

* I was inverted sir

* vox organs cleanup

* vox reagents

* guidebook

* weh

---------

Co-authored-by: Errant <35878406+Errant-4@users.noreply.github.com>

* Automatic changelog update

* Fix food slicing showing utensil popup (#37105)

Fix knife slicing showing utensil popup

* Select current target in mailing unit UI, prevent UI jumping (#37098)

* Atmos air (6500 kPa) marker (#37061)

* air GM atmosphere

* atmos fix air miner

* Automatic changelog update

* Updates the Pirate Captain Hardsuit Helmet light sprites. (#37027)

* Add noir glasses (#36923)

hardboiled

* Automatic changelog update

* Overhauled stamina slowdown behavior (#36336)

* Automatic changelog update

* Fix vending machine manager wire error (#37100)

Skip updating amounts for removed entries

* fix asteroid tiles (#37103)

aw

* Pointing arrow smite no longer lasts forever (#37102)

fix: pointing arrow smite no longer lasts forever

* Automatic changelog update

* Wizard Helmet in the Magic Vend (#37084)

Whats the limit for stuff you can put in a commit message lol

* Automatic changelog update

* fix logic gate draw depth (#37053)

fix logic gate layering

* Species are now picked at random in the developer environment! (#37057)

* Various changes to random species in dev

* This should be split

* Mob Movement Major Refactor (#36847)

* Conveyor optimisations

- Optimise movement for moving stuff. Better flags + less resolves + slapped parallelrobustjob on it.
- Sleeping for entities getting conveyed into walls.

* Blocker version

* Finish

* Final

* Fix conveyor power mispredict

* Bagel save

* Revert "Bagel save"

This reverts commit 1b93fda81fb852d89b89b0beae0b80f8a61165f2.

* Conveyor resave

* Init Commit

* windows yelling at me to update commit

* working commit, need prediciton and more dehardcoding

* Project 0 warnings

* Working Commit (Near Final)

* ryder got confused commit

* I love Merge Conflicts :)

* Working commit, no prediction

* Forgot the yaml changes

* Comments and typos

* Apparently while the reduced launch mult of lube was initialized it was never used so I revered back to default

* Fixed an incorrect divisor

* bit of cleanup

* Prediciton fixed, and puddles now affect all entities

* FORGOT TO RENAME A VERY IMPORTANT VARIABLE OOPS

* Really big I forgor moment

* Even bigger I forgor moment

* four more merge conflicts to fix four more oopsies

* fixed actual divide by zero moment and also im very dumb

* Even bigger I forgor moment

* four more merge conflicts to fix four more oopsies

* fixed actual divide by zero moment and also im very dumb

* Fix all test fails

* code cleanup

* Webedit whitespace

* Code cleaup

* whitespace webedit

* whitespace webedit

* whitespace webedit

* whitespace removal

* Comments and cleanup

* Re-Added 20 warnings as per Ork's request

* Cleanups

* Spacing fix

* bugfixes and cleanup

* Small bugfix

* Fix prediction

* Mob movement rewrite

* Bandaid

* Working version

* Tentatively working

* Friction to fix cornering

* More fixes

* Refactor mob movement

Trying to cleanup relay ordering / tryupdaterelative being cooked, purge ToParent, and fix all the eye rotation shenanigans.

* Building

* Re-implement jetpacks

* Reorganise weightless movement

* More work

* Fix camera

* reh

* Revert bagel

* Revert this

* Revert held move buttons

* Puddles work but are unpredicted and unoptimized

* Fixes

* Puddle code...

* Actually dirty the slipComp for real

* Sliding component done plus an extra suggestion from ArtisticRoomba

* Atomized Commit

* Added Friction field to Reagent Prototype per design discussion

* Cleaned up Working Commit

* a

* Delete stinkers

* Fix this code smell

* Reviewed

* Funky re-save

* Our conveyance

* Better conveyor sleeping

* Remove this

* Revert "Better conveyor sleeping"

This reverts commit f5281f64bbae95b7b9feb56295c5cf931f9fb2e1.

* Revert that

Way too janky

* Also this

* a

* Working Commit - Still a lot to do

* Acceleration refactor

* Minor jetpack cleanup

* frictionnomovement no longer nullable

* Shared Mover Feels 99% done

* OffGrid/Weightless/Throwing Friction saved

* Fix merge conflicts

* Fix a debug assert

* Final Commit for today

* Some fixes

* Actually use those CCVars Properly

* Need to fix throwing

* Second to last Commit for real

* Jetpack bug fixed

* Jetpack bug fixed

* Test fail patch

* Small patch

* Skates Component cleanup + Bring Accel back to 5 (oops)

* Fix test fail oops

* yaml cleanup make dragons not fat

---------

Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>

* Automatic changelog update

* Predicted internals (#33800)

* Predicted gas pumps

I wanted to try out atmos and first thing I found.

* a

* Atmos device prediction

- Canisters
- Tanks
- Internals

AirMixes aren't predicted so nothing on that front but all the UIs should be a lot closer.

* Remove details range

* Gas tank prediction

* Even more sweeping changes

* Alerts

* rehg

* Popup fix

* Fix merge conflicts

* Fix

* Review

* Automatic changelog update

* Add condition support to entity tables (#36819)

* Fix AI movement (#37114)

Don't relay blocking anymore.

* Automatic changelog update

* New Salvage Ruin - Atmos Interchange (#37115)

* Automatic changelog update

* Fix station beacon not updating (#37121)

* Automatic changelog update

* Fix for vox dropping all bodyparts when gibbed (#37111)

vox parts cleanup

* Automatic changelog update

* Movement Rewrite Hotfix (#37122)

* One line bugfix

* also divide friction by 5

* Undo that

* Clarify that PA crate order includes boards (#37109)

init

* Automatic changelog update

* noRot on 2-way lever (#37125)

* Traumoxadone (#37126)

* init

* salicylic acid

* Automatic changelog update

* fix clone appearance (#37130)

* New Weapon: Knuckle Dusters (#33470)

* New Weapon: Knuckle Dusters

* Tag YAML Error Fix

* Crafting Graph Node Error

(Thank you slarticodefast)

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Crafting Node Error Part 2 Electric Boogaloo

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Contraban & QM Dusters Nerf

* Stun Knuckledusters (Unfinished)

* Typo

* Fix test fails

* The dastardly maintainer balance webedit

* Fix contraband parenting

* Fix construction failure

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
Co-authored-by: EmoGarbage404 <retron404@gmail.com>

* Automatic changelog update

* Renders reagent grinders over lights (#31218)

* Adds a new layer to DrawDepth.cs for use with objects similar to the reagent grinder and properly summarises its uses

* applies new layer in DrawDepth.cs to reagent_grinder.yml

* Fix merge conflict

* oops

* fix atmos grid markers (#37142)

* fix atmos grid markers

* 1984 CL

* randomize names for mindshielded eventhumanoids (#37143)

* Automatic changelog update

* make node scanner don't show interface if scanned entity not a artefact (#37146)

* a

* a

* Revert "a"

This reverts commit 2b9ba4ea67a9395d30b7ab37c8065f627f1a961a.

* Fix some maintenance doors not using wires configuration + cleanup + minor changes (#36735)

* Kill useless maints doors + general fixes

* Migrate the common maints airlock

* Fix parenting

* Service Theatre

* migrate out the other removed airlock

---------

Co-authored-by: EmoGarbage404 <retron404@gmail.com>

* Automatic changelog update

* Fix throwing prediction (#37086)

* Fix throwing prediction

- Disposals is still janky but I think that's disposals in general not being predicted and the disposals throw not being predicted and short-lived.
- Would need to check RMC.
- Couldn't repro the underlying issues however thrown items don't slip anymore so (and we also don't predict their land / stopping anymore so).

* primary constructor

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Explosions warnings cleanup (#36167)

* Explosions warnings cleanup

* Revert unnecessary change

* Cleaner Entity instantiation

* Remove conflicting changes with #36098

* ClothingOuterEVASuitSyndicate (#36738)

* ClothingOuterEVASuitSyndicate

* Update migration.yml

* Resolve merge conflict in migration.yml

---------

Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>

* Sentry turrets - Part 5: Reuseable UI components (#35149)

* Initial commit

* Updated how monotone buttons are styled

* Removed unnecessary textures

* Updated attributions

* Addressing reviewer comments

* Adjusted monotone checkbox styling

* Revert "Resprited the Chief Engineer's mantle/manica" (#37060)

Revert "Resprited the Chief Engineer's mantle/manica (#36697)"

This reverts commit d0c2a64436.

* Fix skeletons spawning in folded body bags (#37151)

* Fix skeleton spawning

* Add comments

* Fix the comments

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Automatic changelog update

* Replace uplink thieving gloves with chameleon thieving gloves (#36369)

* replace thieving gloves with chameleon thieving gloves

* increase TC cost by one

* add a TODO comment

* Automatic changelog update

* Omega Update (Genpop) (#37157)

* Automatic changelog update

* Add more ruins (#37161)

* Update Credits (#37163)

Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com>

* Salvage Threat: Gibtonite (#37160)

* Automatic changelog update

* Revert "add material composition to some salv treasure" (#37149)

* Revert "add material composition to some salv treasure (#31970)"

This reverts commit 125258ea48.

* Remove ring materials as well

* Automatic changelog update

* Don't despawn off-grid salv mob corpses (#37169)

* Automatic changelog update

* Bagel Station - Removed Gamer Loot (#37171)

* Automatic changelog update

* Update GDPR erase script to latest DB schema (#37162)

* Remove update from DeviceLinkSystem (#37152)

The tick updates were purely used to decrease the invoke counter once per tick. Now instead we just calculate the effective counter value with some trivial math on the tick number. This completely removes the need for an update function.

The relative tick is not stored to map files. If we really need this, we can add a TickOffsetSerializer (similar to TimeOffsetSerializer), but I doubt it matters.

* Refactor magic speak system to be a component added to actions (#36328)

* Allow shelves to be placed rotated when built by hand (#37186)

fix: shelves can be placed rotated when built by hand

* Automatic changelog update

* Fix for Whoopie Cushions (Fixes #32028) (#36984)

* Fixes whoopie cushions so they no longer launch you into oblivion when stacked in a large pile.

* Update Resources/Prototypes/Entities/Objects/Fun/toys.yml

* streamlined the components for the prototype

---------

Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>

* Automatic changelog update

* Salv Ruins Again (#37193)

* Fix `ComponentTogglerSystem` deletion error (#37198)

Don't try to toggle if target is terminating or deleted

* Fland Update (Genpop) (#37207)

* Automatic changelog update

* Convex genpop update (#37216)

* Automatic changelog update

* Ghost friction fix (#37124)

* commit

* fix for real

* More filters for station records (#37213)

* Automatic changelog update

* Removing redundant trash tags on medipens (#37215)

removes redundant tag components

* StaminaSystem to SharedStaminaSystem (#37199)

* Init Commit

* Partial class

* Hands system slipped through

* AI Law Board File Clean Up (#37195)

* Allow Pacifists to Use Bola (#37188)

* Automatic changelog update

* Fix dough rolling (#37183)

* Automatic changelog update

* Fix effects of hosted anomaly when transform is parented (#37179)

* hosted anomaly effects now are at the correct location when the host is in a container or buckled

* oops, not keeping the uid and transform together

* use world positions to get the position of the anomaly -- my previous method was reinventing the wheel.

* Automatic changelog update

* Split out the CloneComponents into its own method (#37155)

* Split out the CloneComponents into its own method

* CR - Move some extra info in

- add TryComp for status effects

- Move some remcomps around

- Make Special event raising components to handle special
components that reference entities that have ownership

* CR - Extra recommendation on the prototype

thanks slarti

* Solve the yaml linter problem

* CR - Typos, grammar and some extra Status effect

* cleanup

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Fix brains, borgs etc not counting as marooned (#37148)

* init

* comments

* comment

* no more debug

* Add collapse button to lobby right panel (#37140)

* Add collapse button to lobby right panel

* Half sized buttons

* Automatic changelog update

* Port fancy speech bubbles (#29349)

* Automatic changelog update

* Water bottle dispenser fix & Bottle Yaml Organizing (#37108)

* A New Parent/Category For The Soda & Tonic Water Bottle

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* New Parent For water bottle & Cleanup

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* More Cleanup

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* Details

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* Organizing For Additions

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* Streamlining waterbottle to be compatible with DrinkBottleVisualsAll Parent

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* Replacing/Renaming Parents

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* New Tonic/Soda Water Bottle Sprites

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* Misc Fixes

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* New Parent for Small Glass Bottles & Organizing

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* Organizing & uSize Parity.

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* File Parity

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* Merged Categories & Misc Fixes

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* Removed Silly

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* Parent Name Parity & Cleanup

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* Large Glass Bottles Category & Cleanup

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

---------

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* Automatic changelog update

* Ichor double-metabolize fix + Very minor cleanup (#37107)

Not a yaml vacation apparently

* Darken reptilian eye sockets to reduce the effect of mixels (#37082)

Initial commit

* Fixed holy water metabolism rate (#37106)

* Fixed holy water metabolizing at 1u instead of .5u a second

* Update Resources/Prototypes/Reagents/medicine.yml

---------

Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>

* Automatic changelog update

* Make departmental orders consoles print slips (#36944)

* Make departmental orders consoles print slips

* feed back cycle

* Automatic changelog update

* Fix borg soap (#36961)

* Create SoapBorg and replace SoapNT with SoapBorg in BorgModuleCustodial

* Reparent SoapBorg

No longer a container so the soap reagent cannot be extracted from the soap, no longer a food, no longer slippery since it can't be removed from the borg to be placed on the ground

* Move SoapBorg to end of soap.yml

* correct comp order

* fix failing tests

* Automatic changelog update

* Cryotube draw-depth (#37240)

* removes changing draw depth when occupied

* changes collision to square

* small texture changes
fixes slight perspective size when comparing side columns to the direct column facing the camera
removes the baked in pipe exit (the yml's sprite adds it anyway)

* Fire damage system fixes (#37241)

Fire fixes

* Automatic changelog update

* Make animals drop giblets into container or floor when they inserted into container (#37228)

* a

* Revert "a"

This reverts commit 2b9ba4ea67a9395d30b7ab37c8065f627f1a961a.

* auausasuasuausuuAUSTRALIA!!!!!!aausuasusdasda

* 77+33!=100

* Moth displacement maps (#37231)

moth displacement maps

* Automatic changelog update

* Four-way pipe junction, swapping junction construction fix (#37092)

* pipe x-junction assets, yml, construction

* remove duplicate asset

* attribution

* x junction instead of junctioncross for utilities.yml

* Automatic changelog update

* Raises max chest markings for all species (except Reptilian) to 2 (#37065)

* Update arachnid.yml

* Update diona.yml

* Update human.yml

* Update moth.yml

* Update slime.yml

* Update vox.yml

* Automatic changelog update

* make throw insert container code more clear (#36873)

make throw insert container more clear

* fix pka admin log (#37255)

* Genpop closet cargo orders (#37237)

* Genpop closet cargo orders

* change icon to locker base

* Automatic changelog update

* Make container draw disableble for mob-affecting Hyposprays (#30683)

* Seperate container draw from affects mobs

* Spaces

* More spaces

* Fix toggle

* Use better ands

* Reorder checks for Performance™️

---------

Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>

* Fix chairs deleting players (#37261)

Unbuckle entities when a strap is about to be deleted

* Add 3 new Exomorph posters (#37260)

Initial commit

* Automatic changelog update

* AI context menu fix (#37224)

* AI context menu fix

* Revert "AI context menu fix"

This reverts commit 86a0476fcb0aa952c0dcadb1bc4246532abd62b7.

* Better implementation

* Retry

* Automatic changelog update

* Cleanup warnings: CS0414 (#36950)

* Clean up

* Use #pragma

* Cleanup warnings: CS8321, CS0105, CS0168 (#36949)

* Clean up

* CS0168

* Cargo request and bounty console deny sound cooldown (#37234)

* Cargo bounty console deny sound cooldown

* ordering computer cooldown

* Update Content.Shared/Cargo/Components/CargoBountyConsoleComponent.cs

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Update Content.Shared/Cargo/Components/CargoBountyConsoleComponent.cs

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Update Content.Server/Cargo/Systems/CargoSystem.Bounty.cs

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* AutoGenerateComponentPause

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Move random species selection earlier in player spawning logic (#37258)

* Select random species earlier in spawning logic

* ternary operator

* Move it even earlier to fix more bugs

* For DamagedSiliconAccent use Destructible threshold for default "DamageAtMaxThreshold" (#37252)

* set DamageAtMaxCorruption as nullable with null default and use destructible trigger threshold for this if null.

* fix documentation

* these really don't need to be passed by reference

* Small InventorySystem.Equip Unequip Reason bugfix (#37265)

Fix small bug

* Amber Station - Security and AI Sat Overhaul (#37262)

* Automatic changelog update

* Fix debug asserts in WoolySystem and UdderSystem (#35314)

* Implement Rules amendment (#37200)

* Implement Rules amendment

* Update Resources/ServerInfo/Guidebook/ServerRules/RoleplayRules/RuleR9MassSabotage.xml

Co-authored-by: Tayrtahn <tayrtahn@gmail.com>

* Update RuleR9MassSabotage.xml

---------

Co-authored-by: Tayrtahn <tayrtahn@gmail.com>
Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com>

* Fix borg chassis gibbing not dropping items (#37276)

BeingGibbedEvent and TryEjectPowerCell

* Automatic changelog update

* Revert "Traumoxadone (#37126)"

This reverts commit efc8d8600d.

* Add ratelimit retry to discord changelog bot and continue publish changelog error. (#37051)

* Add ratelimit retry to discord changelog bot and continue publish changelog error.

oops we missed some changelogs cause of this... this should prevent anything funny

* Update actions_changelogs_since_last_run.py

* fuck the cl

* Tweaks to the push horn so its less of a shitter tool (#37281)

* Empty commit

* tweaks to the push horn

* forgor to change the delay

* keeping the speed the same for now

* Automatic changelog update

* [HOTFIX] Ensure that mobs wake up when zombified (#37346)

zombie sleep fix

* Update CP14SharedMagicSystem.cs

* Update LockSystem.cs

* remove desc name icon from recipes

* Update ContentLocalizationManager.cs

* Update walls.yml

* part of fixes

* gf

* f

* Update asteroid.yml

* s

---------

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>
Co-authored-by: IProduceWidgets <107586145+IProduceWidgets@users.noreply.github.com>
Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
Co-authored-by: Southbridge <7013162+southbridge-fur@users.noreply.github.com>
Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com>
Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com>
Co-authored-by: Kyle Tyo <36606155+VerinSenpai@users.noreply.github.com>
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
Co-authored-by: lzk <124214523+lzk228@users.noreply.github.com>
Co-authored-by: KingFroozy <140668342+KingFroozy@users.noreply.github.com>
Co-authored-by: Samuka-C <47865393+Samuka-C@users.noreply.github.com>
Co-authored-by: Partmedia <kevinz5000@gmail.com>
Co-authored-by: themias <89101928+themias@users.noreply.github.com>
Co-authored-by: Victor Shen <71985089+Vexerot@users.noreply.github.com>
Co-authored-by: Milon <milonpl.git@proton.me>
Co-authored-by: Kirus59 <145689588+Kirus59@users.noreply.github.com>
Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
Co-authored-by: Stomf <5dorkydorks@gmail.com>
Co-authored-by: drakewill-CRL <46307022+drakewill-CRL@users.noreply.github.com>
Co-authored-by: PraxisMapper <praxismapper@gmail.com>
Co-authored-by: EmoGarbage404 <retron404@gmail.com>
Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com>
Co-authored-by: TytosB <54259736+TytosB@users.noreply.github.com>
Co-authored-by: abadaba695 <spacestation13thingy@gmail.com>
Co-authored-by: kosticia <kosticia46@gmail.com>
Co-authored-by: Thinbug <101073555+Thinbug0@users.noreply.github.com>
Co-authored-by: pathetic meowmeow <uhhadd@gmail.com>
Co-authored-by: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com>
Co-authored-by: Boaz1111 <149967078+Boaz1111@users.noreply.github.com>
Co-authored-by: Myra <vasilis@pikachu.systems>
Co-authored-by: Whatstone <166147148+whatston3@users.noreply.github.com>
Co-authored-by: K-Dynamic <20566341+K-Dynamic@users.noreply.github.com>
Co-authored-by: Gentleman-Bird <dcgreen406@gmail.com>
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Co-authored-by: BIGZi0348 <svalker0348@gmail.com>
Co-authored-by: LaCumbiaDelCoronavirus <90893484+LaCumbiaDelCoronavirus@users.noreply.github.com>
Co-authored-by: imatsoup <93290208+imatsoup@users.noreply.github.com>
Co-authored-by: Matthew Herber <32679887+happyrobot33@users.noreply.github.com>
Co-authored-by: Ertanic <36124833+Ertanic@users.noreply.github.com>
Co-authored-by: MissKay1994 <15877268+MissKay1994@users.noreply.github.com>
Co-authored-by: Errant <35878406+Errant-4@users.noreply.github.com>
Co-authored-by: eoineoineoin <helloworld@eoinrul.es>
Co-authored-by: Tiniest Shark <head.rebel@yahoo.com>
Co-authored-by: nikitosych <boriszyn@gmail.com>
Co-authored-by: Tayrtahn <tayrtahn@gmail.com>
Co-authored-by: Perry Fraser <perryprog@users.noreply.github.com>
Co-authored-by: YoungThug <ramialanbagy@gmail.com>
Co-authored-by: beck-thompson <107373427+beck-thompson@users.noreply.github.com>
Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
Co-authored-by: Vladislav Suchkov <20380250+murolem@users.noreply.github.com>
Co-authored-by: Prole <172158352+Prole0@users.noreply.github.com>
Co-authored-by: Unkn0wn_Gh0st <shadowstalkermll@gmail.com>
Co-authored-by: 3nderall <101940324+3nderall@users.noreply.github.com>
Co-authored-by: Radezolid <snappednexus@gmail.com>
Co-authored-by: J <billsmith116@gmail.com>
Co-authored-by: Ghagliiarghii <68826635+Ghagliiarghii@users.noreply.github.com>
Co-authored-by: chromiumboy <50505512+chromiumboy@users.noreply.github.com>
Co-authored-by: youtissoum <51883137+youtissoum@users.noreply.github.com>
Co-authored-by: Minemoder5000 <minemoder50000@gmail.com>
Co-authored-by: Spanky <scott@wearejacob.com>
Co-authored-by: Spessmann <156740760+Spessmann@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: brainfood1183 <113240905+brainfood1183@users.noreply.github.com>
Co-authored-by: Deerstop <edainturner@gmail.com>
Co-authored-by: B_Kirill <153602297+B-Kirill@users.noreply.github.com>
Co-authored-by: archee1 <archee3@hotmail.co.uk>
Co-authored-by: Cojoke <83733158+Cojoke-dot@users.noreply.github.com>
Co-authored-by: Quantum-cross <7065792+Quantum-cross@users.noreply.github.com>
Co-authored-by: poklj <compgeek223@gmail.com>
Co-authored-by: Krunklehorn <42424291+Krunklehorn@users.noreply.github.com>
Co-authored-by: OnyxTheBrave <131422822+OnyxTheBrave@users.noreply.github.com>
Co-authored-by: UpAndLeaves <92269094+Alpha-Two@users.noreply.github.com>
Co-authored-by: Flareguy <78941145+Flareguy@users.noreply.github.com>
Co-authored-by: Zalycon <84675130+Zalycon@users.noreply.github.com>
Co-authored-by: deltanedas <39013340+deltanedas@users.noreply.github.com>
Co-authored-by: Verm <32827189+Vermidia@users.noreply.github.com>
Co-authored-by: nikthechampiongr <32041239+nikthechampiongr@users.noreply.github.com>
Co-authored-by: ScarKy0 <scarky0@onet.eu>
2025-05-26 12:45:00 +03:00
Ed
d44579df78 s 2025-05-26 12:30:16 +03:00
Ed
d34ece9eed Update asteroid.yml 2025-05-26 12:10:01 +03:00
Errant
99236def28 comment out slotblocker yaml (#37827)
* comment out slotblocker yaml

* let me fix this real quick xD

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
2025-05-26 00:05:47 +02:00
Deserty0
8e796053d4 fix (#1309) 2025-05-25 12:40:56 +03:00
Ignaz "Ian" Kraft
9ca6963d46 fix crash on core destruction (#1310) 2025-05-24 20:21:05 +03:00
github-actions[bot]
60e84789ce @Ian321 has signed the CLA in crystallpunk-14/crystall-punk-14#1310 2025-05-24 16:27:33 +00:00
github-actions[bot]
cb78372d3b @Sefaia has signed the CLA in crystallpunk-14/crystall-punk-14#1307 2025-05-24 06:11:51 +00:00
github-actions[bot]
151d485f5e @Fr0goo has signed the CLA in crystallpunk-14/crystall-punk-14#1304 2025-05-23 19:34:51 +00:00
Ed
924897e27d f 2025-05-23 15:08:17 +03:00
Ed
262a8a30c9 gf 2025-05-23 14:58:41 +03:00
Ed
8e7f68c062 part of fixes 2025-05-23 14:57:20 +03:00
Ed
3a9e6dc409 Update walls.yml 2025-05-23 13:52:18 +03:00
Ed
3abb4d6051 Update ContentLocalizationManager.cs 2025-05-23 13:44:02 +03:00
Red
40246e9b13 Merge branch 'master' into ed-12-05-2025-upstream 2025-05-23 12:58:11 +03:00
Cuir
14074a2ff3 Window improvements (#1292)
* Added stone brick and marble brick windows to the crafting menu proper.
Sanitized capitalization of construction graph ids and nodes (but not entities).
Sanitized stone and marble structure descriptions.

* Windows that are built with frames now leave those frames behind when you smash them instead of disintegrating entirely.

* Syntax error because entity id

* wooden windows

* Added a base window frame as well as a wooden window frame and its broken variant.
Frames can be vaulted through, and the broken glass variant will deal slash damage and a short stun upon entering.
Wooden windows now deconstruct and shatter into both types of frames, which can also be deconstructed.
Fixed an issue with window collisions when connected across tiles.
Gave wooden windows their own prototype file and construction graph.

* stonevrick windows

* Added functionality to stone window frame types.
Fixed an issue where shattered windows weren't triggering unless they were flammable.

* some parenting work

* fix fixtures

---------

Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com>
Co-authored-by: Ed <edwardxperia2000@gmail.com>
2025-05-23 12:03:36 +03:00
Nim
51277446ef Правка перевода RU (#1302)
* traslet fix

* fix
2025-05-23 11:03:59 +03:00
Sukilove
aadcaabf0e Rotated Keyfile (#1299)
* Rotated the inventory sprite Keyfile by 45 degrees

* Update CP14RoundEndSystem.CBT.cs

* Rotated another 45 degrees
2025-05-22 23:26:34 +03:00
metalgearsloth
d924e11c3a Fix storage (#37714)
The one path I forgot to get the relative index.
2025-05-22 10:11:36 -04:00
Red
0ce4771f3d Update CP14RoundEndSystem.CBT.cs 2025-05-22 14:53:46 +03:00
PJBot
6c6f33e47e Automatic changelog update 2025-05-22 08:43:28 +00:00
Nemanja
19c88963b4 Add gold and silver material crates, balance cargo mat crate prices (#37713) 2025-05-22 01:42:20 -07:00
YoungThug
b95bcbffed Rat King Chat Indicator (#37184)
* Rat King Chat Indicator

* BUFFRATWHEN

* Added it to the crown wawa

* Ignore this

* Whats the limit for stuff I can put here?

* Fix da merge conflicts for real this time

* WE DID ITgit add -A

* Errant Requested Changes
2025-05-22 01:47:04 -04:00
PJBot
ecff1f8810 Automatic changelog update 2025-05-22 03:26:14 +00:00
ScarKy0
0cb9e803e5 Tweak "Escape" objective to allow yellowtexting (#37680)
init
2025-05-21 20:25:07 -07:00
PJBot
aac32a771a Automatic changelog update 2025-05-22 02:20:04 +00:00
Wolfkey-SomeoneElseTookMyUsername
e72e25aba1 Add disposal signalers (#37535)
* Add disposal signalers

* Sprite changes

* Some requested changes

* Requested changes + change spelling to be with two l's to be consistent with the remote signaller
2025-05-21 22:18:57 -04:00
Tayrtahn
5a93099509 Update SharedBiomeSystem methods to use Entity<T> (#37698)
* Fix warning in TryGetBiomeTile

* Overload TryGetBiomeTile

* Overload more methods, fix internal warnings

* Update TryGetEntity uses

* Update TryGetTile uses

* Cleanup TryGetDecals use

* Formatting

* Two more warnings while we're here
2025-05-21 22:10:52 -04:00
PJBot
db0fb6118f Automatic changelog update 2025-05-22 01:40:55 +00:00
ArtisticRoomba
7d7858d41c Significantly improve Tesla generator power stability (#37626)
* Significantly improve Tesla generator power stability

* Second round of balancing
2025-05-21 21:39:48 -04:00
Tayrtahn
11f291d1a2 Cleanup warning in GridInRange (#37699)
Cleanup warning in GridInRange
2025-05-21 21:28:42 -04:00
PJBot
5af5305d97 Automatic changelog update 2025-05-22 01:23:15 +00:00
Pieter-Jan Briers
1d5a06612a Optimize parallax VRAM usage (#37180)
* Disable parallax texture preloading

Many parallax layers are specific to a single map and will likely never be loaded for the duration of the game. Save VRAM by not loading them always.

Requires engine master

* Put generated parallax identifier in texture name

Makes it show up properly in debugging tools

* Don't load generated parallaxes multiple times

Many parallax prototypes re-use the same generated parallax configs. These generated parallaxes were being loaded multiple times at once, which was a massive waste of VRAM.

We now move these into a separate cache for deduplication. I had to write a lot of logic to handle loading cancellation and ref counting. Yay.

Also fixes some spaghetti with the previous parallax loading system: cancellation didn't work properly, give proper names to generated texture names, etc.

This saves like 100+ MB of VRAM.
2025-05-22 11:22:08 +10:00
Tayrtahn
6f89c2c455 Cleanup warnings in AtmosPipeAppearanceSystem (#37706)
* Cleanup 2 warnings in AtmosPipeAppearanceSystem

* Let's use the Entity<T> version

* todo comment
2025-05-21 21:06:06 -04:00
github-actions[bot]
7b7e2d0d22 @Soupkilove has signed the CLA in crystallpunk-14/crystall-punk-14#1299 2025-05-22 00:41:21 +00:00
Tayrtahn
73031ee5a0 Cleanup warnings in NodeVisualizationOverlay (#37707)
Cleanup 2 warnings in NodeVisualizationOverlay
2025-05-22 02:23:12 +02:00
K-Dynamic
0c7cfb528d Evac Shuttle Wode update (#37223) 2025-05-21 16:26:57 -07:00
PJBot
5490acd23b Automatic changelog update 2025-05-21 20:46:41 +00:00
ScarKy0
572b20464c Tweak "Help a fellow traitor" objective to allow yellowtexting (#37679)
init
2025-05-21 16:45:34 -04:00
PJBot
acccf66259 Automatic changelog update 2025-05-21 19:51:03 +00:00
AsnDen
d7a17739c6 Screaming for cyborgs (#32329) 2025-05-21 12:49:56 -07:00
Ed
0f4decfa9b Update CP14RoundEndSystem.CBT.cs 2025-05-21 21:28:11 +03:00
Ed
ff68b9606f Update Dev.toml 2025-05-21 21:16:19 +03:00
PJBot
566eabb757 Automatic changelog update 2025-05-21 18:08:05 +00:00
Leon Friedrich
38d7949777 Add microwave-nukedisk interaction (#36114)
* Add microwave-nukedisk interaction

* popup

* Fix UninitializedSaveTest
2025-05-21 11:06:58 -07:00
Red
2d0d79ca41 Daily English CBT (#1286)
* Update CP14RoundEndSystem.CBT.cs

* Update CP14RoundEndSystem.CBT.cs

* Update CP14RoundEndSystem.CBT.cs
2025-05-21 21:06:44 +03:00
HTML/Crystal
3385c45d80 Change Arachnid Layering (#36357)
* 1 commit ops

* untouching this before anyone has to tell me
2025-05-21 10:40:55 -07:00
Kyle Tyo
674724b3f2 Fix glass external airlocks using the standard airlock emergency access lights. (#37666)
Update emergency_unlit.png
2025-05-21 19:14:24 +02:00
PJBot
43aefd235c Automatic changelog update 2025-05-21 17:12:42 +00:00
mubururu_
4d0a0ac5c5 make some stuff require two hands (#37683)
* get splitted

* thievy 1 handed

* scarko changes
2025-05-21 19:11:34 +02:00
metalgearsloth
298f821bec Ore + entitytable fixes (#37675)
* Ore + entitytable fixes

Iterate every dungeon not just last.

* Big shot

* Fixes
2025-05-21 12:43:17 -04:00
Red
352707f1d7 Remove Guildmaster & Merchant roles (#1296)
* b

* Update round_end.yml

* Update round_end.yml
2025-05-21 19:33:00 +03:00
Tayrtahn
ecf9e855f6 Remove static logger calls in LateJoinGui (#37688)
* Cleanup 2 static logger calls in LateJoinGui

* That's not how that works
2025-05-21 12:23:35 -04:00
mubururu_
588bc52f26 inhands for Syndicate Things (and thief beacon) (#37682)
* initial

* splitting this b

* thief bacon 1 handed

* why is test fail

* dont fail please

* "requires"

* evil tests
2025-05-21 11:39:29 -04:00
PJBot
83f1131f19 Automatic changelog update 2025-05-21 13:33:56 +00:00
metalgearsloth
6ddd849ca9 Update submodule to 260.2.0 (#37684) 2025-05-21 23:32:56 +10:00
metalgearsloth
e00c622d22 Use velocity along normal for shuttle impacts (#37667)
* Use velocity along normal for shuttle impacts

Scrapes shouldn't have the same level of destruction as full-on ramming anymore. Also detecting scrapes should be a lot easier for future stuff.

* Update Content.Server/Shuttles/Systems/ShuttleSystem.Impact.cs
2025-05-21 23:32:46 +10:00
PJBot
d8ba7ee625 Automatic changelog update 2025-05-21 10:38:43 +00:00
Errant
1b7651184c Limit shuttle collision damage (#37578)
* outlaw the usage of spacecraft as weapons of mass destruction

* adjust slowdown
2025-05-21 20:37:36 +10:00
Red
068b2c5576 Update README.md 2025-05-21 12:56:43 +03:00
Alexsey Bezyuk
a73f8e3113 Seed sack and craft (#1287)
* seed_sack

* full seed sack

* seed sack sprite

* name and description
2025-05-21 12:41:22 +03:00
Deserty0
beeea40dc7 Lochelper update (#1262)
* comments

* Update localization_helper.py

* okay

* oops

* dsd

* adad

* as

* finally

* Revert "finally"

This reverts commit 50c6059676.

* Reapply "finally"

* fix

* fix
2025-05-21 11:51:03 +03:00
Nim
afa522cc7c Перевод на RU (#1285)
* translate

* fix

* rev

* slime

* fix local
2025-05-21 11:50:42 +03:00
PJBot
2c1ba4951f Automatic changelog update 2025-05-21 07:52:29 +00:00
Spanky
524aa8bf0d Reach Update (#37669) 2025-05-21 00:51:20 -07:00
github-actions[bot]
b0d6bb3c0f @Cu1r has signed the CLA in crystallpunk-14/crystall-punk-14#1292 2025-05-21 07:18:04 +00:00
ArtisticRoomba
3d5534199e fix soil locale (#37674)
* fix soil locale

* xdd
2025-05-20 23:36:06 -07:00
PJBot
d3d10f98fb Automatic changelog update 2025-05-21 06:17:34 +00:00
metalgearsloth
a393033c64 Optimise storage a quadrillion times (#37638)
* Optimise storage a quadrillion times

* How sweaty can we get

* Add fast angle checks

* Fix chunk indices

* Optimise the refresh method

Helps on client a lot as the clientside is suboptimal atm.

* Better name

* wawawewa

* Add single-angle path

* Okay FINE rider
2025-05-21 02:16:26 -04:00
PJBot
e100324815 Automatic changelog update 2025-05-21 05:02:07 +00:00
PJBot
1d5a82f51c Automatic changelog update 2025-05-21 05:01:00 +00:00
Southbridge
5a3c59fd7f Box Station - Added GenPop (Sec redesigned) (#37663) 2025-05-20 22:00:51 -07:00
Minty642
ebcbdf3077 Adding fungal soil (#36245)
Co-authored-by: aliser <20380250+murolem@users.noreply.github.com>
2025-05-20 21:59:51 -07:00
Spanky
4dda8b43f2 Fix Misplaced Mapping CL Entries (#37670)
Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
2025-05-20 21:41:39 -07:00
PJBot
ee3ba71104 Automatic changelog update 2025-05-21 01:14:00 +00:00
FrostRibbon
e114b9d9a0 Epinephrine Antihistamine effect, Histamines not radioactive (#37460)
* Added Epinephrine antihistamine effect when at least 45u. Removed Histamines causing Radiation damage.

* Indentation fixed

* had coffee, able to see how to fix indentation now.
2025-05-20 18:12:53 -07:00
PJBot
4cd8e33a92 Automatic changelog update 2025-05-21 00:13:23 +00:00
Spanky
ecfbeb9834 Packed Update (Salvage Job Computer) (#37656) 2025-05-20 17:12:15 -07:00
PJBot
741909b5a1 Automatic changelog update 2025-05-20 23:37:06 +00:00
Spanky
e134c57165 Omega Update (Salvage Job Computer) (#37655) 2025-05-20 16:35:59 -07:00
PJBot
538790017f Automatic changelog update 2025-05-20 23:30:54 +00:00
Spanky
dc6188000c Marathon Update (#37654) 2025-05-20 16:29:45 -07:00
PJBot
7bfe9f705b Automatic changelog update 2025-05-20 23:29:06 +00:00
Spanky
a261f93550 Bagel Update (Salvage Job Computer) (#37652) 2025-05-20 16:27:57 -07:00
Spanky
11276b9a7b Fland Update (Salvage Job Computer) (#37653) 2025-05-20 16:27:31 -07:00
Tayrtahn
6f46698410 Cleanup warning CS0414 (#37648) 2025-05-20 23:14:10 +02:00
PJBot
c406fa2d1e Automatic changelog update 2025-05-20 16:56:27 +00:00
Kittygyat
f5df6a59b7 Slime storage QoL (#37592) 2025-05-20 18:55:20 +02:00
PJBot
857c12fcc7 Automatic changelog update 2025-05-20 13:05:35 +00:00
B_Kirill
f07b2aa6c3 New fun meteors (#37327)
* New fun meteors

* Forgot about newline

* Fix

* Wow, a new test

* Okay

* Fix

* Fix 2

* I hope this is correct enough

* Attribution

* Attribution 2
2025-05-20 23:04:27 +10:00
SeamLesss
0766857112 Bombsuit Description Fix (#37631)
simple as that
2025-05-20 08:58:08 -04:00
PJBot
4ec07d3768 Automatic changelog update 2025-05-20 12:37:18 +00:00
slarticodefast
9b1a6dd57b add reduced motion drug overlay (#37584)
* reduced motion flash effect

* reduced motion drug overlay

* Revert "reduced motion flash effect"

This reverts commit e350b2899d0acc78c9833b5bc23a9680e03b2736.
2025-05-20 08:36:08 -04:00
TrixxedHeart
b682da9d9c Fixed Missing or Misconfigured Locale Keys (#37595)
* Fixes and adds many localization keys from #34343
Open

* Fix comment, that is not how that works.

* Update Resources/Locale/en-US/components/screen-component.ftl

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Fixes cmd-parse-failure-int -> cmd-parse-failure-integer in OptionsUIController.cs, removes cmd-parse-failure-int from options-menu.ftl

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
2025-05-20 13:07:52 +02:00
metalgearsloth
0d4f9640b5 CompFactory updates (#37559) 2025-05-20 01:08:55 -04:00
keronshb
bc0139f961 Submodule Update 260.1.0 (#37633) 2025-05-20 00:49:23 -04:00
PJBot
6158ee31f9 Automatic changelog update 2025-05-20 02:48:11 +00:00
Princess Cheeseballs
203befb16c Galosh Slowdown Fix (#37628)
Begone Galosh
2025-05-19 22:47:03 -04:00
Tayrtahn
c5ac160ea8 Cleanup more SpriteComponent warnings (part 6) (#37607)
* 1 warning in MechAssemblyVisualizerSystem

* 2 warnings in RecyclerVisualizerSystem

* 1 warning in ClusterGrenadeVisualizerSystem

* 2 warnings in BarSignSystem

* 4 warnings in AlertControl

* 1 warning in ToolSystem

* 2 warnings in PinpointerSystem

* 2 warnings in ClientSpriteMovementSystem

* 2 warnings in OptionsVisualizerSystem

* 1 warning in FlatpackSystem

* 1 warning in ZombieSystem

* 1 warning in StackSystem

* 1 warning in MiningOverlay

* 1 warning in FlippableClothingVisualizerSystem

* Guard clause for MechAssemblyVisualizerSystem

* Get SpriteSystem in AlertControl constructor
2025-05-20 01:52:03 +02:00
PJBot
c6f518de18 Automatic changelog update 2025-05-19 22:46:25 +00:00
SpeltIncorrectyl
97e6127cf0 Give kammerer tighter spread so it's not a complete downgrade to the enforcer (#37616) 2025-05-19 15:45:18 -07:00
PJBot
a932cc358f Automatic changelog update 2025-05-19 22:40:30 +00:00
RedBookcase
63eea297f3 Updated Salvage Guidebook. (#37593)
Co-authored-by: RedBookcase <Usualmoves@gmail.com>
2025-05-19 15:39:23 -07:00
PJBot
f7a587c82a Automatic changelog update 2025-05-19 22:36:16 +00:00
Entvari
72501bac10 Researchable & Printable Hyper Capacity Cells (#37619)
* wowwww batterie

* americanized the spelling of "maximised" to "maximized"

* changed recipe to be more unique from microreactors

* addressing requested changes
2025-05-19 18:35:08 -04:00
Tayrtahn
6e4e2d0b69 Add validation test for ExplosionPrototypes (#37621)
* Add validation test for ExplosionPrototype

* Remove runtime validation in prototype
2025-05-19 18:22:47 -04:00
Tayrtahn
004e084b5a Cleanup 2 warnings in ReagentDispenserSystem (#37622)
* Cleanup 2 warnings in ReagentDispenserSystem

* Eh, let's be specific
2025-05-19 18:18:10 -04:00
SeamLesss
9664ebc446 Mirror Shield Contraband Fix (#37620)
easy change
2025-05-19 18:04:22 -04:00
Tayrtahn
80e7711966 Remove ParallaxVV property from ParallaxComponent (#37617)
Delete ParallaxVV
2025-05-19 17:36:30 -04:00
TytosB
c3e6beed85 loop salvage job board (#37618) 2025-05-19 14:30:03 -07:00
SeamLesss
926248e235 Magazine Sprite Fix (#37615)
* first

* long mag + mk58 color
2025-05-19 16:29:47 -04:00
PJBot
7d186093f4 Automatic changelog update 2025-05-19 18:56:49 +00:00
Deerstop
5ad15acb19 Elkridge - Salv job board and overhaul (#37600) 2025-05-19 11:55:41 -07:00
PJBot
8a7682bef6 Automatic changelog update 2025-05-19 18:24:45 +00:00
āda
41a129e749 Pepper makes you cough (#36358) 2025-05-19 11:23:38 -07:00
Tayrtahn
69354f59c8 Cleanup SpriteComponent warnings in map renderer (#37609)
* 3 warnings in EntityPainter

* 1 warning in MapPainter
2025-05-19 12:52:04 -04:00
PJBot
9ed6ce581e Automatic changelog update 2025-05-19 16:15:47 +00:00
Samuka-C
0d3e6986c8 Make Holy water evaporate like normal water (#37611)
holy water evaporates
2025-05-19 12:14:40 -04:00
Red
b07fadf5b0 EntityLootTable deleted (#37604) 2025-05-19 19:53:29 +10:00
kosticia
791ce3a5cd remove ignition functional from welder component (#37586)
* a

* webedit
2025-05-19 11:49:59 +02:00
PJBot
b383e7c74c Automatic changelog update 2025-05-19 08:18:00 +00:00
Southbridge
8c786e8a6c Box Station - Added Job board (#37602) 2025-05-19 01:16:47 -07:00
Nemanja
0b70c10b54 Make early salvage jobs easier (#37598) 2025-05-18 23:15:22 -07:00
PJBot
79b4c939d2 Automatic changelog update 2025-05-19 01:31:52 +00:00
keronshb
054d35a4f8 Force Wall Tweaks (#37525)
* Reduces forcewall time to 10 seconds

* Increases force wall action delay to 15

* Adds Special Wall Layer

* Fixes indenting. Changes Mask and Layer to Special Wall Layer

* Update Resources/Prototypes/Entities/Structures/Walls/walls.yml

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
2025-05-19 03:30:46 +02:00
PJBot
7b93bf8fb5 Automatic changelog update 2025-05-19 01:18:42 +00:00
slarticodefast
f3c4ff8a2a Add keybind for swapping hands in the other direction (#37588)
add swap hands reverse
2025-05-18 21:17:35 -04:00
SeamLesss
f62f0fbae9 Black Scarf Icon Fix (#37589)
* forgot like a dumbass

* attributions
2025-05-18 21:16:23 -04:00
Tayrtahn
818d047449 Cleanup more SpriteComponent warnings (part 5) (#37590)
* 1 warning in KudzuVisualizerSystem

* 2 warnings in ChameleonProjectorSystem

* 1 warning in MarkerSystem

* 2 warnings in ItemSystem

* 1 warning in GhostToggleSelfVisibility

* 1 warning in FoamVisualizerSystem

* 1 warning in ClickableTest

* 1 warning in ThrownItemVisualizerSystem

* 2 warnings in InfantSystem

* 1 warning in ChasmFallingVisualsSystem

* 1 warning in PotencyVisualsSystem

* 2 warnings in OrbitVisualsSystem

* 2 warnings in BeamSystem

* 1 warning in JitteringSystem

* 1 warning in CardboardBoxSystem

* 2 warnings in StationAiSystem

* 2 warnings in FirelockSystem

* 2 warnings in CargoSystem.Telepad

* 1 warning in StasisBedSystem

* 2 warnings in WeldableVisualizerSystem

* 2 warnings in DeliveryVisualizerSystem

* 1 warning in TimerTriggerVisualizerSystem

* 1 warning in StorageFillVisualizerSystem

* 2 warnings in RadiationCollectorSystem

* 2 warnings in BorgSwitchableTypeSystem

* 1 warning in TurnstileSystem

* 1 warning in SurveillanceCameraVisualsSystem

* 1 warning in BurnStateVisualizerSystem

* 2 warnings in CableVisualizerSystem

* 1 warning in JetpackSystem
2025-05-19 03:09:47 +02:00
PJBot
1f9a600023 Automatic changelog update 2025-05-18 22:56:47 +00:00
qwerltaz
8fdac54c5a add: water vapor hurts slimes (#32751)
* water vapor hurts slimes

* 3 looks good

* Update Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
2025-05-19 00:55:40 +02:00
Nemanja
964fa22b54 Fix research server test fail (#37562) 2025-05-18 13:04:19 -07:00
PJBot
95924cafd5 Automatic changelog update 2025-05-18 17:44:52 +00:00
Spessmann
8d0855a153 Convex job board update (#37579) 2025-05-18 10:43:43 -07:00
PJBot
b0a837aecc Automatic changelog update 2025-05-18 14:39:38 +00:00
metalgearsloth
47adf1abd6 Fix item stuck check (#37570) 2025-05-18 16:38:31 +02:00
slarticodefast
643bdf547e Cleanup atmos air grenade code (#37568)
cleanup
2025-05-18 22:18:31 +10:00
PJBot
f7fdef6eca Automatic changelog update 2025-05-18 11:35:39 +00:00
Super
921c6dea30 A lone operative successfully nuking the station now actually ends the round. (#36498)
LoneOpsSpawn is now of an indefinite duration -- it lasts until either the LoneOp dies or the nuke detonates. This means a few things.
2025-05-18 21:34:33 +10:00
PJBot
93cc4dc90d Automatic changelog update 2025-05-18 09:19:25 +00:00
Simon
fc52165c9b Make Nukie and Wizard Comms Console not announce who it was sent by (#37567)
* Make Nukie and Wizard Comms Console not announce who it was sent by.

* Add doc-comment to field
2025-05-18 19:18:18 +10:00
PJBot
21fb7193d6 Automatic changelog update 2025-05-18 09:17:21 +00:00
ScarKy0
ff8b7cf220 Aloxadone Tweaks (#37239)
alox
2025-05-18 19:16:13 +10:00
PJBot
536cf2cde0 Automatic changelog update 2025-05-18 09:13:06 +00:00
ScarKy0
55ec2632a8 Traumoxadone (#37236)
* fuck salicylic acid

* small tweak based on playtest

* meh

* locale

---------

Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
2025-05-18 19:11:59 +10:00
ScarKy0
406bfa3308 Cryoxadone Tweaks (#37132)
fuck cryox
2025-05-18 19:11:51 +10:00
ScarKy0
f415ad51c3 Stelloxadone (#37131)
init
2025-05-18 19:11:23 +10:00
PJBot
5259c58901 Automatic changelog update 2025-05-18 08:58:30 +00:00
ScarKy0
30537e13a4 Bomb Deliveries (#37069)
* init

* BOMB!!!

* review

* partial review

* review
2025-05-18 10:57:22 +02:00
Peptide90
5b7c00b374 Adds marker component to roof markers (#35453)
* Adds marker component to roof markers

So now you can show and hide them properly.

* a

---------

Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
2025-05-18 18:14:31 +10:00
PJBot
9a57fc7895 Automatic changelog update 2025-05-18 08:13:53 +00:00
Minemoder5000
a01ba3b7b1 Rebuild ATS Anchor room and add indestructible spine. (#37560) 2025-05-18 01:12:46 -07:00
PJBot
a97994e5da Automatic changelog update 2025-05-18 07:48:42 +00:00
metalgearsloth
fc5c63ac09 Add ImplicitRoofComponent (#36112)
* Add ImplicitRoofComponent

So shuttles get marked as rooved.

* Early-out

So the new render doesn't suck up perf unnecessarily.
2025-05-18 17:47:35 +10:00
PJBot
4f4f9fc0d3 Automatic changelog update 2025-05-18 07:31:28 +00:00
Princess Cheeseballs
c26fb327d7 Add Blatantly Nuclear to Nuke Songs (#35927)
* Nukies are so back

* Catch this webedit

* Webedit 2: Epic Webedit Fail
2025-05-18 17:30:20 +10:00
PJBot
6423da85fa Automatic changelog update 2025-05-18 07:24:28 +00:00
Southbridge
f91d3a5788 Amber Station - Added Job Board (#37565) 2025-05-18 00:23:21 -07:00
PJBot
bf79757eff Automatic changelog update 2025-05-18 06:42:07 +00:00
Nemanja
4fdfa9386b De-loot salvage, add reward crates (#37561) 2025-05-17 23:40:59 -07:00
PJBot
3969bf740e Automatic changelog update 2025-05-18 04:33:58 +00:00
ArtisticRoomba
95cc36c41d Atmos Air Grenades (#37531) 2025-05-17 21:32:51 -07:00
PJBot
9c791b66c6 Automatic changelog update 2025-05-18 04:15:30 +00:00
Oleshe
4b357f236b Jigger transfer amount (#35962) 2025-05-17 21:14:23 -07:00
Ed
5590d73adc Improve TryAllReactionsTest (#35356)
* Update TryAllReactionsTest.cs

* mix categories

* Update TryAllReactionsTest.cs
2025-05-18 14:07:00 +10:00
PJBot
80c70255ac Automatic changelog update 2025-05-18 04:05:34 +00:00
Nemanja
4bced26086 Make research clients grid-local (#36821)
* Limit RD servers to the station grid

* the sluth
2025-05-18 14:04:27 +10:00
PJBot
ffc65ea474 Automatic changelog update 2025-05-18 04:03:59 +00:00
Nemanja
0d878751fa Salvage Job Board (#37549)
* Salvage Job Board

* More development

* Small boy

* Computer yaml (partial)

* UI

* Rank unlock logic

* Job label printing

* appraisal tool integration

* Jobs

* add board to QM locker

* boom!

* command desc

* mild rewording

* ackh, mein pr ist brohken
2025-05-18 14:02:52 +10:00
Nox
93305c21df Amber Station: armory restock (#37432) 2025-05-17 20:37:35 -07:00
PJBot
899ce0ded5 Automatic changelog update 2025-05-18 02:12:06 +00:00
Spangs04
9af1d69e30 Telecoms Resprite (#35811)
* Medical and Science Servers

Resprited  medical and science servers

* Delete server-off-Recovered.png

* Telecoms and Camera Servers

* Add Copyright

* Fix Rsi

* Minor Stripe Displacement Fix

* Telecoms Sprites

* Telecoms Display Update

Partial Update of the Sprites, Copyright and some YML and JSON changes

* Fix Linter and YML and Finalize

* Remember Lost Router Child

Fix Linter Again (hopefully) and add sprite to entertainment and wireless camera routers

* Requested Review Changes and ect

Changed how the servers dictate how to display whether they have no keys or if they have a mix of keys.

* Re-Run Checks

* Handful of requested changes

* Fix?

* Revert Last

* old yeller

* pushforpr

* Remove Old Files

* Fix Json

* fix rsi for real...?

* Fix Camera Servers

Servers were still calling to telecoms instead of the server sprites

* New Telecom Darken Attempt #1

* Slight stripe change

* Random Whitespace fix

* Fix2boogaloo
2025-05-17 22:10:56 -04:00
Nemanja
957371fefd Fix prisoner closet UI not working (#37558)
Fix prisoner closet UI
2025-05-18 12:00:45 +10:00
Krunklehorn
abec27737e AutomaticAtmosSystem uses MassDataChangedEvent, clarifies TileMassMultiplier (#37548)
* Initial commit, no tile changes, just mass

* Rename TileMassMultiplier to TileDensityMultiplier
2025-05-17 21:57:50 -04:00
metalgearsloth
c70e06b2d7 Predict subdermal implants (#37538) 2025-05-17 21:55:23 -04:00
PJBot
ac7da12f70 Automatic changelog update 2025-05-18 01:53:07 +00:00
Perry Fraser
ed7fb54526 tweak: Allow cutter machines to be linked to ore silos (#37554) 2025-05-17 21:51:57 -04:00
Tayrtahn
3dcfc3a99e Cleanup more SpriteComponent warnings (part 4) (#37550)
* Cleanup warnings in ClickableSystem

* Cleanup warnings in FultonSystem

* Cleanup warning in HolidaySystem

* Cleanup warning in DoAfterOverlay

* Cleanup warning in EntityHealthBarOverlay

* Cleanup warning in SmokeVisualizerSystem

* Cleanup warning in VaporVisualizerSystem

* Cleanup warning in ColorFlashEffectSystem

* Cleanup warnings in StealthSystem

* Cleanup warnings in TrayScannerSystem

* Cleanup warnings in InventoryUIController

* Cleanup warnings in HideMechanismsCommand

* Cleanup warning in ShowMechanismsCommand

* Cleanup warnings in EntityPickupAnimationSystem

* Cleanup warnings in PointingSystem

* Cleanup warning in StickyVisualizerSystem

* Cleanup warnings in TabletopSystem

* Cleanup warnings in PillSystem

* Cleanup warnings in DiceSystem

* Cleanup warnings in ProjectileSystem
2025-05-18 03:48:11 +02:00
github-actions[bot]
f098a8e6d5 Update Credits (#37556)
Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com>
2025-05-17 20:36:23 -04:00
paige404
65250e6f39 Properly add rainbow skirt to passenger loadout this time (#37501) 2025-05-17 18:30:00 -04:00
PJBot
694dc4bf9f Automatic changelog update 2025-05-17 17:38:26 +00:00
YotaXP
e404e45ffc Persist construction menu favorites server-side (#35867)
* Persist construction menu favorites to player profile

* Use `ProtoId`s for construction favorites

* Validate construction favorites updates from the client

* Actually await the async database call
2025-05-17 13:37:19 -04:00
PJBot
1141dcb868 Automatic changelog update 2025-05-17 17:21:18 +00:00
eoineoineoin
e42f63583b Improve fax machine UI (#33825)
* fax upgraded

* improve resizable

* move Paper type settings & change margins

* change margins & Aling of text

* Rearrange Fax UI

Group paper-type with print-file.
Group refresh button with destination list.

Add some panels to differenciate functionality for faxing an inserted
sheet of paper and printing a local file to a new paper.

* Whitespace

* Remove unnecessary style definition

* Remove whitespace

---------

Co-authored-by: VideoKompany <135313844+VlaDOS1408@users.noreply.github.com>
2025-05-17 13:20:11 -04:00
PJBot
6b788287e7 Automatic changelog update 2025-05-17 17:12:15 +00:00
metalgearsloth
2e582f4164 Update submodule to 260.0.0 (#37546)
wawawewa
2025-05-18 03:11:15 +10:00
Ilya246
356dabb9c9 shuttle impacts port (#37422)
* initial

* adjust densities and thruster hp

* Fix evil hack

* Last stuff

* review, cleanup

* admin RW

* minor cleanup

---------

Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
2025-05-18 03:11:08 +10:00
metalgearsloth
4afccdd5db DungeonData rework (#37172)
* DungeonData rework

Back to fields, serializes better, just make new layers dumby.

* wawawewa

* Fix this

* Fixes

* review

* thanks fork

* fix
2025-05-18 03:10:30 +10:00
Tayrtahn
d72939ba4b Cleanup TryAddDisplacement warnings (#37545)
Cleanup TryAddDisplacement warnings
2025-05-17 11:28:39 -04:00
ScarKy0
28e3c3d8a7 Make SharpComponent work with Hands (#37543)
* init

* review
2025-05-17 17:27:20 +02:00
ScarKy0
9acead4236 Network SolutionScanner (#37541)
* init

* doc
2025-05-17 17:00:32 +02:00
ScarKy0
af0e0598e8 TemperatureProtection now works directly on entities (#37544)
* init

* review

* review
2025-05-17 16:38:49 +02:00
PJBot
6a2ca74648 Automatic changelog update 2025-05-17 07:46:51 +00:00
ArtisticRoomba
d33d3bf99e Buff singularity rad collectors (#37475) 2025-05-17 00:45:44 -07:00
Errant
bf76ba28e2 MindRemoveRole refactor (#34880)
* MindRemoveRole refactor

* role removal logstring rework

* zombiesystem fix
2025-05-17 16:24:32 +10:00
Nemanja
5424433604 Remove Basic Hardsuit & Associated Files (#37315)
* Remove Basic Hardsuit

* retaliatory action

---------

Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
2025-05-17 16:15:29 +10:00
PJBot
71b5c22f0b Automatic changelog update 2025-05-17 05:28:46 +00:00
āda
de24413bd5 HumanoidCharacterProfile and IdCardConsoleComponent constants moved to cvar. Sync id card length with character name length (#35407)
* commit

* mark TODOs

* compiles

* cleanup

* cleanup

* oops

* changed my mind

* requested changes

* genpop fix
2025-05-17 15:27:39 +10:00
PJBot
0fed68d240 Automatic changelog update 2025-05-17 05:23:46 +00:00
Nemanja
90eb3ee4fc Fix tethergun overlay (#37510)
* Fix tethergun overlay

* slice

* wah

* Update TetherGunOverlay.cs

---------

Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
2025-05-17 15:22:40 +10:00
PJBot
4551363781 Automatic changelog update 2025-05-17 05:22:31 +00:00
ArtisticRoomba
14f574e17d Buff metal foam grenades (#37476)
* Buff metal foam grenades

* oh and cant forget my main

* Yeah, no, trolling someone because they didn't powergame a crowbar shiftstart is bad
2025-05-17 15:21:24 +10:00
PJBot
e959c787f0 Automatic changelog update 2025-05-17 05:06:50 +00:00
Banedon
a39d3334d6 The Hatening / Hide hair when hats are equipped (#36818)
* changed HideLayerClothing on some entities YAML

* Use HideLayerClothing with slots, layers does not work for some reason

* Hattened again

* Mooore ! I touched the clown mask, beware

* Fix typo from "Slide" to "Side"

* Build issue, test with commenting out error part

* Trying again...

* Trying for fix
2025-05-17 01:05:43 -04:00
PJBot
c49a28889f Automatic changelog update 2025-05-17 04:50:11 +00:00
Spessmann
8269ba66b0 Convex update (#37533) 2025-05-16 21:49:02 -07:00
Samuka-C
722620c1cf Xenoborgs part 3 (#36867)
Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com>
Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
Co-authored-by: Quantum-cross <7065792+Quantum-cross@users.noreply.github.com>
Co-authored-by: pathetic meowmeow <uhhadd@gmail.com>
2025-05-16 20:59:48 -07:00
Tayrtahn
d166a261ba Cleanup warnings in DisplacementMapSystem (#37511)
* Cleanup warnings in DisplacementMapSystem

* docs update

* Suggested simplification
2025-05-17 13:34:35 +10:00
Tayrtahn
bd22361a6a Cleanup more SpriteComponent warnings (part 2) (#37527)
* Cleanup warnings in MagazineVisualsSpriteTest

* Cleanup warnings in WiresVisualizerSystem

* Cleanup warnings in GunSystem.SpentAmmo

* Cleanup warnings in GunSystem

* Cleanup warnings in GunSystem.ChamberMagazine

* Cleanup warnings in MeleeWeaponSystem.Effects

* Cleanup warnings in ToggleableLightVisualsSystem

* Cleanup warnings in StatusIconOverlay

* Cleanup warnings in SpriteFadeSystem

* Cleanup warnings in PdaVisualizerSystem

* Cleanup warnings in EnvelopeSystem

* Cleanup warnings in MechSystem

* Cleanup warnings in MappingOverlay

* Cleanup warnings in LockVisualizerSystem

* Cleanup warnings in DragDropSystem

* Cleanup warnings in GhostSystem

* Cleanup warnings in TriggerSystem.Proximity

* Cleanup warnings in DragonSystem

* Cleanup warnings in PortableScrubberVisualsSystem

* File-scoped namespace for PortableScrubberVisualsSystem
2025-05-17 13:29:03 +10:00
Tayrtahn
33f111c090 Cleanup more SpriteComponent warnings (part 2) (#37522)
* Cleanup warnings in DamageMarkerSystem

* Cleanup warnings in CuffableSystem

* Cleanup warnings in DeployableTurretSystem

* Cleanup warnings in StorageContainerVisualsSystem

* Cleanup warnings in ItemMapperSystem

* Cleanup warnings in ItemCounterSystem

* Cleanup warnings in RandomSpriteSystem

* Cleanup warnings in PowerCellSystem

* Cleanup warnings in ParticleAcceleratorPartVisualizerSystem

* Cleanup warnings in PaperVisualizerSystem

* Cleanup warnings in PoweredLightVisualizerSystem

* Cleanup warnings in LightBulbSystem

* Cleanup warnings in EmergencyLightSystem

* Cleanup warnings in DoorSystem

* Cleanup warnings in ClockSystem

* Cleanup warnings in BuckleSystem

* Cleanup warnings in JukeboxSystem
2025-05-17 13:02:36 +10:00
PJBot
b75fdd22de Automatic changelog update 2025-05-17 01:55:35 +00:00
Nemanja
6f809d1ad6 Allow protected grids to be repaired (#36989)
* Allow protected grids to be repaired

* Probably implement it

---------

Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
2025-05-17 11:54:27 +10:00
PJBot
2f4a364876 Automatic changelog update 2025-05-17 01:28:19 +00:00
Nemanja
c188fd07f2 Give VGRoid its name back (#37513) 2025-05-17 11:27:11 +10:00
Tayrtahn
5267725aff Cleanup more SpriteComponent warnings (part 1) (#37508)
* Cleanup warnings in PuddleSystem

* Cleanup warnings in HandsSystem

* Cleanup warnings in EnsnareableSystem

* Cleanup warnings in ElectrocutionHUDVisualizerSystem
Also simplify some if statements

* Cleanup warnings in PlantHolderVisualizerSystem

* Cleanup warnings in AlertLevelDisplaySystem

* Cleanup warnings in TetherGunSystem

* Fix error in PlantHolderVisualizerSystem

* I hate var _
2025-05-16 17:42:05 -04:00
PJBot
53e317ba61 Automatic changelog update 2025-05-16 21:20:12 +00:00
Nemanja
644308b26e Don't group damage in the HealthChange.cs guidebook text (#37507) 2025-05-16 23:19:02 +02:00
PJBot
2e615ddfd4 Automatic changelog update 2025-05-16 19:06:56 +00:00
Qerd
2de0a5fc82 Not exclusive whitelist diet. Vox regain access to old food. (#37497)
* Creates a secondary digestible whitelist that is not exclusive. Additionally reworks the Vox stomach.

* Update FoodSystem.cs

Remnants of an old attempt. Cleaning it.

* Update vox.yml

Remnants of an old attempt. Cleaning up.

* Whitelist no longer, now the diet exclusion var is a bool.

* Clean-up

* Update Content.Server/Body/Components/StomachComponent.cs

Typo fixing

Co-authored-by: Tayrtahn <tayrtahn@gmail.com>

* Update Content.Server/Body/Components/StomachComponent.cs

Clarifications.

Co-authored-by: Tayrtahn <tayrtahn@gmail.com>

* Update Content.Server/Nutrition/EntitySystems/FoodSystem.cs

Typo fixing

Co-authored-by: Tayrtahn <tayrtahn@gmail.com>

* Update Resources/Prototypes/Body/Organs/vox.yml

Typo fixes

Co-authored-by: Tayrtahn <tayrtahn@gmail.com>

---------

Co-authored-by: Tayrtahn <tayrtahn@gmail.com>
2025-05-16 12:05:49 -07:00
Velcroboy
d5ef9b7345 Wall inheritance cleanup (#37436)
* Cleanup walls.yml

* quick check

* Fix tilewall cmd

* More Cleanup

* Arrnrtrayiage

* Remove double parenting

---------

Co-authored-by: Velcroboy <velcroboy333@hotmail.com>
2025-05-16 09:17:21 -04:00
PJBot
4b575c6729 Automatic changelog update 2025-05-16 12:45:53 +00:00
metalgearsloth
f192ba1c8f Predict pulling hands blocking (#37504)
Think I forgor to add this one when I split the 1 morbillion PRs out.
2025-05-16 08:44:46 -04:00
metalgearsloth
fca7337bcf Fix tile-events returns (#37502)
* Fix tile-events returns

Should really be continues.

* More

* More optimisations
2025-05-16 14:22:20 +02:00
PJBot
1b79b97d2c Automatic changelog update 2025-05-16 12:05:36 +00:00
metalgearsloth
5d104d408c Shuttle speed bump (#37505)
* Shuttle speed bump

Will probably go to 80 when guns get bumped and we get CCD but just makes impacts more representative.

* cook
2025-05-16 14:04:29 +02:00
Tayrtahn
031fc463eb Cleanup warnings in LatheSystem (#37496)
Cleanup warnings in LatheSystem
2025-05-16 13:04:55 +02:00
PJBot
823c8344f3 Automatic changelog update 2025-05-16 02:11:16 +00:00
Spanky
631bb6a4ed Omega Update (#37490) 2025-05-15 19:10:07 -07:00
PJBot
4d565dc063 Automatic changelog update 2025-05-15 23:45:57 +00:00
lzk
19f9f84a13 Allow recycler to shred clothing (#31518)
* Allow recycler to shred clothing

* reduce

* change comments

* replace ClothMade with Recyclable

* Update Resources/Prototypes/Entities/Clothing/Head/hats.yml

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* requested changes

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
2025-05-15 19:44:48 -04:00
PJBot
9b6697e252 Automatic changelog update 2025-05-15 20:58:08 +00:00
ScarKy0
5fa56babb0 Strip All Debug Verb (#37426)
* init

* yippee

* review

* permission check

* command

* loc

* review

* review

* Apply suggestions from code review

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
2025-05-15 22:56:58 +02:00
Tayrtahn
a3418d56d9 Cleanup warnings in MaterialStorageSystem (#37492)
Cleanup warnings in MaterialStorageSystem
2025-05-15 16:35:19 -04:00
Tayrtahn
5aea940bbc Cleanup warnings in PowerChargerVisualizerSystem (#37491)
Cleanup warnings in PowerChargerVisualizerSystem
2025-05-15 16:14:41 -04:00
Tayrtahn
98c393474a Cleanup warnings in ThrusterSystem (#37489)
Cleanup warnings in ThrusterSystem
2025-05-15 22:06:30 +02:00
Tayrtahn
ff4644c6c9 Cleanup warnings in SubFloorHideSystem (#37488)
Cleanup warnings in SubFloorHideSystem
2025-05-15 22:04:43 +02:00
Tayrtahn
b9337693d3 Fix prototypes and datadefs so they pass analyzer checks (again) (#37485)
Fix prototypes so they pass analyzer checks (again)
2025-05-15 20:30:50 +02:00
Jessey van Hoeijen
625115d78a Change plushie rotation on wide swing (#37484)
Changed swing rotation on shark, carp and snake plushies
2025-05-15 08:56:28 -07:00
RedBookcase
04341e40b9 Fixed Two-Way Lever Sprites (#37390)
* New conveyor sprites - arrows!

* Revert "New conveyor sprites - arrows!"

This reverts commit 3b540be0d89d93af5028a9ae6533bbdf2954cb75.

* Reworked to only be the lever sprite update.

---------

Co-authored-by: RedBookcase <Usualmoves@gmail.com>
2025-05-15 11:42:17 -04:00
PJBot
724e5be2e2 Automatic changelog update 2025-05-15 14:48:38 +00:00
Chartman
7b46749e0e Soaked Smokes Volume Revert (#37482)
Reverted the volume of Dan's Soaked Smokes to their previous maximum.
2025-05-15 10:47:30 -04:00
PJBot
5874afe7c7 Automatic changelog update 2025-05-15 12:53:33 +00:00
metalgearsloth
c042669eae Predict sleeping action (#37414)
* Predict sleeping action

* reviews
2025-05-15 22:52:24 +10:00
metalgearsloth
7ec37451d0 Revert "Fix goliath tentacle exploit (#37168)" (#37479)
* Revert "Fix goliath tentacle exploit (#37168)"

This reverts commit 6fbd0c9da1.

* wawawewa
2025-05-15 12:54:20 +02:00
metalgearsloth
24ab2193d6 Update submodule to 259.0.0 (#37481) 2025-05-15 20:44:17 +10:00
Tayrtahn
4dc1c4c3d6 Content changes for SetTiles change (#37229)
* Content changes for SetTiles change

* Retest with new engine changes

* Derp

* Update for new engine PR changes
2025-05-15 20:26:47 +10:00
metalgearsloth
715165f9cc Update submodule to 258.0.1 (#37480) 2025-05-15 20:02:27 +10:00
ArtisticRoomba
b076f790bc fix cl (#37477) 2025-05-15 10:15:46 +02:00
PJBot
7435420211 Automatic changelog update 2025-05-15 04:13:31 +00:00
Blitz
b7000dfbbb No more one handing "snipers" (#33708) 2025-05-14 21:12:23 -07:00
PJBot
63a2efd3e7 Automatic changelog update 2025-05-15 03:57:01 +00:00
K-Dynamic
512922f634 Welding locker loot, migrate to EntityTable (#36977)
Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
2025-05-14 20:55:54 -07:00
Tezzaide
47ff7f2e45 New Salvage Wrecks (#36884)
Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
2025-05-14 20:55:24 -07:00
Nemanja
6fbd0c9da1 Fix goliath tentacle exploit (#37168) 2025-05-14 20:55:04 -07:00
PJBot
900234d3aa Automatic changelog update 2025-05-15 03:46:57 +00:00
kosticia
5db92c4ed0 make small animals don't leave organs on gibbing (#37080) 2025-05-14 20:45:49 -07:00
Southbridge
7e624d1418 Animal Spawner Reorganization + Xeno Spawners (#36962)
Co-authored-by: Errant <35878406+Errant-4@users.noreply.github.com>
2025-05-14 20:25:08 -07:00
PJBot
8ed81c80fc Automatic changelog update 2025-05-15 01:46:55 +00:00
slarticodefast
1aeb1ed295 Fix some paradox clone traits (#37467)
fix some paradox clone traits
2025-05-14 18:45:47 -07:00
Nemanja
91e441ada1 Infer NumberSelector type in EntityTables (#36568)
* Infer number selector types from context

* forgor
2025-05-15 11:21:54 +10:00
Flareguy
338665a3ca Add hivebots (#37275)
Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
2025-05-14 18:09:23 -07:00
SlamBamActionman
cba88dc2dc Add support for rotatable tiles in map renderer (#37342)
* Initial commit

* Fixyfixfix
2025-05-14 20:12:14 -04:00
Velcroboy
8fab6556e2 Changes suffix for always powered handhelds for clarity (#37395)
* Changes suffix for always powered handhelds for clarity

* null->full

* Aha

---------

Co-authored-by: Velcroboy <velcroboy333@hotmail.com>
2025-05-14 19:55:52 -04:00
SolStar
e442af720b Changing sex now properly updates sounds. (#37405)
Load sounds based on new sex in event.
2025-05-14 19:54:34 -04:00
slarticodefast
7121b464f2 Merge stable into master (#37465) 2025-05-15 01:54:06 +02:00
metalgearsloth
494861dc3d HOTFIX: Fix camera auto-orienting (#37437)
* Fix camera auto-orienting

* Optimise
2025-05-15 01:42:39 +02:00
Kyle Tyo
e8b139e9a2 MapManager warning cleanup client edition (#36766)
* Update ExplosionOverlaySystem.cs

* noting here that this may be reverted.

Not sure why transform sys is attached like this.

* Noting that this may be reverted.

* rapid fire spit spit spit spit spit

* last one on the client.

* Update SpawnExplosionWindow.xaml.cs

* Update ParallaxOverlay.cs

* wweeeeebbbbbbbbbbbbbbbbbbbbbbbbb edit

* requested changes.

* Update Content.Client/Shuttles/UI/ShuttleMapControl.xaml.cs

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Update Content.Client/Shuttles/UI/ShuttleMapControl.xaml.cs

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Update Content.Client/Parallax/ParallaxSystem.cs

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Update Content.Client/Parallax/ParallaxSystem.cs

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Update Content.Client/Parallax/ParallaxOverlay.cs

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Update Content.Client/Parallax/BiomeDebugOverlay.cs

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Update Content.Client/Overlays/StencilOverlay.cs

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Update Content.Client/Parallax/BiomeDebugOverlay.cs

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Update Content.Client/Atmos/Overlays/GasTileOverlay.cs

* Update Content.Client/Administration/UI/SpawnExplosion/SpawnExplosionWindow.xaml.cs

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
2025-05-15 01:38:51 +02:00
Kyle Tyo
c84d4753b9 MapManager warning cleanup shared edition (#36795)
* cleanup and reworking

* one of these days I'll merge a conflict without breaking shit.

* Update Content.Shared/Shuttles/Systems/SharedShuttleSystem.cs

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Update Content.Shared/Tabletop/SharedTabletopSystem.cs

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* I'm gonna send this but... I'll be honest, I dunno what it does.

* fix coordinates

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
2025-05-15 01:24:44 +02:00
PJBot
bb442d1234 Automatic changelog update 2025-05-14 22:06:52 +00:00
Archee
dcd5bb16d5 Bikehorn Retextures (#37413)
* Bananium Horn .rsi

* Bike Horn .rsi

* Cluwne Horn .rsi

* Gold Bike Horn .rsi

* Push Horn .rsi

* Bike horn (Instrument) .rsi

* better inhand sprite for pushhorn

* Revert "Push Horn .rsi"

This reverts commit 243b3662c6bd23abad331658eb2c75b5c9183d1d.

* rsi meta attributions

* slight tweak to the golden honkers colour and energy

* adds back castShadows false

* position corrections for inhand and belt for bananium

* inhand corrections for bikehorn inhands and belt

* inhand corrections for cluwnehorn

* inhand corrections for goldbikehorn

* inhand corrections for bike_horn (instrument)

* adds 'far-side held' sprites, bikehorn

* adds 'far-side held' sprites, bikehorn(instrument)

* bikehorn belt, i made the horn cone a shade too dark whoops

* adds 'far-side held' sprites, goldbikehorn

* adds 'far-side held' sprites, cluwnehorn

* adds 'far-side held' sprites, bananiumhorn

* cluwnehorn belt, same change as bikehorn belt earlier
2025-05-14 18:05:45 -04:00
Tayrtahn
101854f00a Cleanup warnings in AtmosAlarmableVisualsSystem (#37459)
Cleanup warnings in AtmosAlarmableVisualsSystem
2025-05-15 00:02:51 +02:00
Tayrtahn
9e000fa5cd Cleanup warnings in RgbLightControllerSystem (#37458)
Cleanup warnings in RgbLightControllerSystem
2025-05-15 00:01:54 +02:00
PJBot
fa953947f6 Automatic changelog update 2025-05-14 21:08:03 +00:00
IProduceWidgets
a021c02b25 More wizard names (#36437)
* Wizard names

* readd any dropped names.

* haha funny number

* update dataset counts!
2025-05-14 23:06:56 +02:00
PJBot
07feb341d9 Automatic changelog update 2025-05-14 20:40:54 +00:00
qwerltaz
b374d2468a air alarm panic wire snipping forces panic mode (#36439)
* air alarm panic wire snipping forces panic mode

* document

* ForcedMode is datafield

* switch to bool flag

* lock button when panic wire cut

* prevent manually individually changing scrubbers from siphon when panic wire is cut

* failure alert when wire snipped

* is Control

* remove double horizontalExpand

* Update Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs

* Update Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
2025-05-14 22:39:47 +02:00
Tayrtahn
7eb44e15d1 Cleanup warnings in BorgSystem (#37456)
Cleanup warnings in BorgSystem
2025-05-14 16:23:13 -04:00
Tayrtahn
fe4d276370 Cleanup warnings in EmitterSystem (#37455)
Cleanup warnings in EmitterSystem
2025-05-14 22:19:34 +02:00
Tayrtahn
1d04194767 Cleanup warnings in VendingMachineSystem (#37454)
Cleanup warnings in VendingMachineSystem
2025-05-14 22:18:36 +02:00
PJBot
fa3afa4ce0 Automatic changelog update 2025-05-14 19:51:04 +00:00
LaCumbiaDelCoronavirus
d6e998272f Change balancing of atmos gas tank bombs (#36780)
* i will put functionality in salt later

* la

* to 10
2025-05-14 21:49:57 +02:00
PJBot
6919d5d46b Automatic changelog update 2025-05-14 19:34:44 +00:00
MisterImp
9868932cfe New food recipe: Draco (dragon taco) (#37212)
* Added draco (dragon taco)

* Update Resources/Prototypes/Entities/Objects/Consumable/Food/taco.yml

* fix whitespace

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
2025-05-14 21:33:37 +02:00
PJBot
d9a016f5a6 Automatic changelog update 2025-05-14 18:07:44 +00:00
metalgearsloth
c09aa6039c Predict gas valves (#33836)
* Predict gas valves

* wawawewa

* Fix imports before I get yelled at

* soff
2025-05-14 20:06:37 +02:00
PJBot
9a6dbb27cd Automatic changelog update 2025-05-14 18:04:12 +00:00
LevitatingTree
fb3bad6fb8 Tweak ND pin names and descriptions (#37416)
* Edit item names and descriptions

* Description tweak

---------

Co-authored-by: LevitatingTree <None>
2025-05-14 20:03:04 +02:00
Tayrtahn
7692d96f57 Cleanup warnings in AtmosPipeAppearanceSystem (#37449)
* Cleanup warnings in AtmosPipeAppearanceSystem

* Another enum
2025-05-14 19:59:35 +02:00
PJBot
b8bf22b4b5 Automatic changelog update 2025-05-14 17:48:19 +00:00
ToastEnjoyer
89ea0ac253 Replaced high value target contraband on ID board and comms boards to command restricted. (#37452)
Update computer.yml
2025-05-14 19:47:10 +02:00
Tayrtahn
ba2a3543d9 Cleanup warnings in ClientInnerBodySystem (#37450)
* Cleanup warnings in ClientInnerBodySystem

* Apply suggested simplification
2025-05-14 19:31:03 +02:00
Tayrtahn
022bc5c0a0 Cleanup warnings in HumanoidAppearanceSystem (#37381)
* Cleanup warnings in HumanoidAppearanceSystem

* entity -> entity.Owner

* Revert LayerMapReserve logic

* Try again without requires
2025-05-14 19:30:20 +02:00
Tayrtahn
6b299046d3 Cleanup warnings in KillSignSystem (#37451)
Cleanup warnings in KillSignSystem
2025-05-14 18:13:35 +02:00
Tayrtahn
9c2a84daa5 Cleanup warnings in ConstructionSystem (#37447)
Cleanup warnings in ConstructionSystem
2025-05-14 17:27:11 +02:00
metalgearsloth
dbbdf04633 Update submodule to 258.0.0 (#37446) 2025-05-15 01:25:39 +10:00
metalgearsloth
e5349e276f Fix typingindicator doing a naughty (#37438)
How this wasn't caught before but raisepredictiveevent should never get raised when re-running states.
2025-05-14 10:18:10 -04:00
Ed
5293f1a0d2 remove desc name icon from recipes 2025-05-14 13:09:42 +03:00
Ed
34131cd70e Update LockSystem.cs 2025-05-14 12:35:08 +03:00
Ed
1551f2fb6d Update CP14SharedMagicSystem.cs 2025-05-14 12:29:18 +03:00
PJBot
0c6025ca40 Automatic changelog update 2025-05-14 05:57:57 +00:00
Qerd
d958a4d891 Prediction of Acquistion Slip error message (#37442)
* Fix to repeated error messages writing on slip

* Changing from Predicted to Client.
2025-05-13 22:56:50 -07:00
PJBot
747050f380 Automatic changelog update 2025-05-14 05:17:24 +00:00
Hitlinemoss
3681de257b Removed the emergency crowbar from the chef's closet (#37403)
* removed emergency crowbar from chef's closet

* removed emergency crowbar and spray bottle from chef's closet

* removed emergency crowbar from chef's closet
2025-05-13 22:16:17 -07:00
PJBot
1d4c134416 Automatic changelog update 2025-05-14 04:43:14 +00:00
Qerd
08a6260c0e Acquisition Slips fitting in folders and clipboards (#37439)
* Acquisition Slips in folders and clipboards

* Adding Paper tag to slips

* No more repeated error messages on write attempt on slips

* Update PaperSystem.cs

Didn't mean to change this in this pr.
2025-05-13 21:42:07 -07:00
Tayrtahn
a9e0d8725e Cleanup warnings in DamageStateVisualizerSystem (#37435)
Cleanup warnings in DamageStateVisualizerSystem
2025-05-14 03:58:03 +02:00
Tayrtahn
d957cdb144 Cleanup warnings in AirlockSystem (#37434)
Cleanup warnings in AirlockSystem
2025-05-14 03:57:01 +02:00
Tayrtahn
5ba1b2af86 Cleanup warnings in CryoPodSystem (#37433)
Cleanup warnings in CryoPodSystem
2025-05-14 03:55:42 +02:00
Tayrtahn
dc92acd720 Cleanup warnings in ClientFoodSequenceSystem (#37431)
Cleanup warnings in ClientFoodSequenceSystem
2025-05-14 00:24:27 +02:00
Tayrtahn
be6078557a Cleanup warnings in RevenantSystem (#37430)
Cleanup warnings in RevenantSystem
2025-05-14 00:22:25 +02:00
Tayrtahn
f81d0fa502 Cleanup warnings in AnomalySystem (#37429)
Cleanup warnings in AnomalySystem
2025-05-14 00:19:57 +02:00
Tayrtahn
75cbbbb5b7 Cleanup warnings in TypingIndicatorVisualizerSystem (#37427)
Cleanup warnings in TypingIndicatorVisualizerSystem
2025-05-14 00:19:05 +02:00
Tayrtahn
7ee0db0508 Cleanup warnings in HolopadSystem (#37421)
* Cleanup warnings in HolopadSystem

* Fix reversed order of CopySprite parameters
2025-05-13 16:21:00 -04:00
Archee
b7056ea851 Red Candle state fix (#37423)
fixed
2025-05-13 21:19:39 +02:00
PJBot
ed3f97f6b1 Automatic changelog update 2025-05-13 17:16:38 +00:00
AsnDen
37853de4d2 Ability to pull for supplybot (#32468)
* Alerts for silicons and ability to pull for supplybot

* Removed alerts
2025-05-13 19:15:30 +02:00
slarticodefast
d52a464caa Merge shuttle hotfix back into master (#37420) 2025-05-13 18:26:30 +02:00
Sparlight
26c5d77f07 Add smart corgi prototype (#36664)
* Add smart corgi prototype

* 1984 - exploded dog names

* Tag fixes

* exploded anomalyhost tag

* Demolish the mysterious corgi flesh-pocket

* Review changes:  yml convention tweaks and reparenting of Corgi and Smart Corgi to new abstract base

* new week, new review, new me
2025-05-13 18:10:10 +02:00
Tayrtahn
d1553bd474 Cleanup warnings in RandomArtifactSpriteSystem (#37418)
Cleanup warnings in RandomArtifactSpriteSystem
2025-05-13 12:08:45 -04:00
Tayrtahn
05c71507c5 Cleanup warnings in FireVisualizerSystem (#37417)
Cleanup warnings in FireVisualizerSystem
2025-05-13 17:58:53 +02:00
Tayrtahn
6218ab70a8 Cleanup warnings in ExpendableLightSystem (#37415)
Cleanup warnings in ExpendableLightSystem
2025-05-13 11:41:18 -04:00
Princess Cheeseballs
61adee05f6 [HOTFIX] Movement Rewrite Hotfix Shuttles now respect their friction values (#37154)
* Shuttles now use their proper friction values

* Documentation

* Shuttles now use their proper friction values

* Documentation

* What the instrumentsystem doin

* what the instrumentsystem doing 2
2025-05-13 22:14:18 +10:00
PJBot
326eeab34a Automatic changelog update 2025-05-13 11:50:50 +00:00
metalgearsloth
df2257cd92 Predict gasthermomachines (#33837)
* Predict gasthermomachines

* despawn

* smellby
2025-05-13 21:49:43 +10:00
ArtisticRoomba
24141aa1e9 Add myself to mapping codeowners (#37409)
i've decided to step onto mr. bones' wild ride
2025-05-13 11:43:16 +02:00
PJBot
82489fe9a1 Automatic changelog update 2025-05-13 09:17:24 +00:00
Nemanja
866f1fb47b Adjust walking sounds (#36941) 2025-05-13 02:16:16 -07:00
PJBot
062647cb37 Automatic changelog update 2025-05-13 08:51:51 +00:00
chromiumboy
7ac67ebf8c Station AI customizations (#34501)
Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
2025-05-13 01:50:43 -07:00
PJBot
0eeb46cf9e Automatic changelog update 2025-05-13 07:44:40 +00:00
K-Dynamic
fa74dcd4ec Recoloured several service job and ID icons (#36580) 2025-05-13 00:43:31 -07:00
Ko4ergaPunk
72a9b0398a [Maps] Dev rework (#34708)
Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
2025-05-12 23:30:05 -07:00
Dinner
0a1fd4f398 Fix grammar in latejoin announcement message (#37398) 2025-05-12 17:13:27 -07:00
Tayrtahn
ca6a625ca2 Cleanup warnings in SmesSystem (#37399)
* Cleanup warnings in SmesSystem

* Access modifier for SmesVisualLayers
2025-05-12 20:12:57 -04:00
PJBot
6a8e9f9e33 Automatic changelog update 2025-05-12 23:57:08 +00:00
Perry Fraser
1bbb017c96 Allow linking uniform printers to silos (#37393)
tweak: Make uniform printers silo clients
2025-05-12 19:56:01 -04:00
Tayrtahn
9c017b7848 Cleanup warnings in ApcVisualizerSystem (#37396) 2025-05-12 16:53:11 -07:00
PJBot
b9c500ff59 Automatic changelog update 2025-05-12 23:43:58 +00:00
Nemanja
ec66c70295 New Salvage Mob: Basilisk (#37135)
* Basilisk

* Less health

* Unique projectile

* Selfmerge incoming

* Update Resources/Textures/Mobs/Aliens/Asteroid/basilisk.rsi/meta.json

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
2025-05-12 19:42:51 -04:00
mubururu_
a9d50da0ba push horn resprite (#37392)
* inishal

* centering
2025-05-12 19:32:07 -04:00
PJBot
cf948dff54 Automatic changelog update 2025-05-12 23:28:33 +00:00
Hanz
b589c75c2a Dans soaked smokes redux (#36979)
* Meat and Potatoes

* Whoops

Whoops

* entityTables my beloathed

reworked the cig fill for Dan's soaked smokes to use an entity table. There was just, a useless bit of code calling for a cig that didn't exist the in mixed cig parent for dan's and it was what was fucking it up and making it SO HARD for me to get it to work. Thanks Dan.

* ehhh, its good for the diff I guess

* Augh

* Why mappers why

* Welp

* migration.yml is pretty cool

Also like there is no reason for nasty and medical, they probably originally were made as a workaround.
2025-05-13 01:27:26 +02:00
Velcroboy
ccd5b153ba Swap forward/reverse for default lever links (#37394)
Co-authored-by: Velcroboy <velcroboy333@hotmail.com>
2025-05-12 19:24:20 -04:00
Tayrtahn
0b73b6d198 Cleanup warnings in DisposalUnitSystem (#37389)
Cleanup warnings in DisposalUnitSystem
2025-05-13 00:02:17 +02:00
Tayrtahn
cad4ce6d3f Cleanup warnings in GravitySystem (#37388)
Cleanup warnings in GravitySystem
2025-05-12 17:46:23 -04:00
slarticodefast
79b55d7549 Merge stable into master (#37387) 2025-05-12 23:40:55 +02:00
ScarKy0
45253ca79e [Hotfix] Fix anomalies breaking your legs (#37366)
* Update SharedAnomalySystem.cs

* oops
2025-05-12 23:27:46 +02:00
PJBot
0dbf66a4ec Automatic changelog update 2025-05-12 21:25:06 +00:00
Perry Fraser
e8c8cae31e fix: don't retroactively drain disabled batteries (#37364)
* fix: don't retroactively drain disabled batteries

If something that used PowerCellDraw temporarily disabled said draw,
once it became re-enabled the system would play catch-up trying to
drain the battery for all the time since the component was disabled.

* fixup! fix: don't retroactively drain disabled batteries
2025-05-12 23:24:00 +02:00
Tayrtahn
cec13166a8 Cleanup warnings in GunSystem.MagazineVisuals (#37373)
Cleanup warnings in GunSystem.MagazineVisuals
2025-05-12 23:17:19 +02:00
Tayrtahn
848d176651 Cleanup warnings in EntityStorageVisualizerSystem (#37385)
Cleanup warnings in EntityStorageVisualizerSystem
2025-05-12 23:16:26 +02:00
Tayrtahn
a8255196f4 Cleanup warnings in ClientClothingSystem (#37384)
Cleanup warnings in ClientClothingSystem
2025-05-12 23:13:56 +02:00
slarticodefast
be35f6e9ce Add trailing whitespace check workflow (#37367)
* whitespace check

* fix formatting

* fix indentation

* eof new line

* add EOF new line check

* revert accidental deletion

* rename
2025-05-12 23:08:00 +02:00
PJBot
a69536cb47 Automatic changelog update 2025-05-12 20:53:23 +00:00
Prole
60334a897b Bleeding Text Tweak & Color Alerts (#37376)
Color Coding & bleeding-text change

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>
2025-05-12 22:52:17 +02:00
Tayrtahn
411ea3827a Cleanup warnings in SolutionContainerVisualsSystem (#37377)
Cleanup warnings in SolutionContainerVisualsSystem
2025-05-12 22:25:28 +02:00
Tayrtahn
a464c5dd99 Cleanup warnings in TippyUIController (#37378)
Cleanup warnings in TippyUIController
2025-05-12 22:21:52 +02:00
Errant
95d73a4019 ssd sleep time setting for dev (#37380) 2025-05-12 22:17:28 +02:00
Tayrtahn
9331b2875d Cleanup warnings in TextScreenSystem (#37382)
Cleanup warnings in TextScreenSystem
2025-05-12 22:08:29 +02:00
PJBot
1e1707af68 Automatic changelog update 2025-05-12 17:53:11 +00:00
Gentleman-Bird
3e9af2ef4c Add utensil box, add muffin tins to Kitchen Dinnerware Crate (#36948)
* Adds muffin tins to dinnerware crate

* removed forks and spoons

* Added utensile box, added utensile box to dinnerware crate
2025-05-12 10:52:04 -07:00
PJBot
6b3c3edb73 Automatic changelog update 2025-05-12 17:36:49 +00:00
Winkarst
08d9d46b46 New Feature: Slot blockers (#35172)
* First commit

* More comments

* Update

* Update

* For Beloved Maintainers

* Beck T, my beloved

* Update

* Old stuff

* Update EquipAttemptEvents.cs

* Update UnequipAttemptEvent.cs

---------

Co-authored-by: beck-thompson <107373427+beck-thompson@users.noreply.github.com>
2025-05-12 10:35:42 -07:00
Tayrtahn
410d8087c6 Cleanup warnings in DamageVisualsSystem (#37372) 2025-05-12 12:48:13 -04:00
PJBot
66c01abbaa Automatic changelog update 2025-05-12 16:29:23 +00:00
Radezolid
6bb47515cb Bugfix - restore the cable module to the lathe (#37361)
Restored the cable module
2025-05-12 12:28:16 -04:00
PJBot
9a1eb05036 Automatic changelog update 2025-05-12 16:23:32 +00:00
ScarKy0
4ac4d3e080 Yellowtexting (#37360)
* init

* else if tree

* f

* color

* review
2025-05-12 12:22:25 -04:00
PJBot
8f3dd28c5a Automatic changelog update 2025-05-12 12:38:21 +00:00
kosticia
5e38a0cdca Cotton baguette for moths (#36953)
* SAVE MILLIONS MOTHS FOREVER🗣🗣🗣🗣🗣🗣🗣

* now i forgot about it???
2025-05-12 14:37:12 +02:00
Ed
59e6435fe2 Merge remote-tracking branch 'upstream/stable' into ed-12-05-2025-upstream
# Conflicts:
#	.github/CODEOWNERS
#	Content.Client/Construction/UI/ConstructionMenuPresenter.cs
#	Content.Shared/Construction/Prototypes/ConstructionPrototype.cs
#	Content.Shared/Damage/Systems/SharedStaminaSystem.cs
#	Content.Shared/Lock/LockSystem.cs
#	Resources/Prototypes/Entities/Mobs/Customization/Markings/human_hair.yml
#	Resources/Prototypes/Entities/Objects/Specific/chemistry.yml
#	Resources/Prototypes/Procedural/vgroid.yml
2025-05-12 14:25:42 +03:00
PJBot
dda3305ae6 Automatic changelog update 2025-05-12 10:56:20 +00:00
Nemanja
954dbcbd2d Add chem barrels to salvage (#37204)
* Add chem barrels to salvage

* Resprite and attribution before someone gets on my ass

* redo rad barrel too
2025-05-12 12:55:11 +02:00
Flareguy
9b6e00d209 EVA suit re-resprite (#37299)
* eva suit resprite

* meta.json fixes

* update softsuits template

* my furniture
2025-05-12 00:01:48 -04:00
Winkarst
63b04c4769 Cleanup: Make separate event for the equip/unequip target (#37333)
* Cleanup

* Update
2025-05-11 23:14:32 -04:00
PJBot
92d0ea3128 Automatic changelog update 2025-05-12 00:15:23 +00:00
JrInventor05
0386bd332d Make the Syringe gun a science research (#37251)
* LauncherSyringe

* fix

* fixfortest

* Update technologies.ftl

* Change

* Change
2025-05-12 02:14:13 +02:00
Errant
f6fcca49f6 Stable merge for hotfix (#37356) 2025-05-11 19:39:11 +02:00
Errant
c261cc21a0 [HOTFIX] Ensure that mobs wake up when zombified (#37346)
zombie sleep fix
2025-05-11 18:49:22 +02:00
Winkarst
4b555ca64e Fix: Play sound when equiping clothing by using it in hand (#37351)
Fix
2025-05-11 10:37:09 -04:00
Winkarst
078814ce41 Refactor: ProximityDetectionSystem (#35133)
* Refactor: ProximityDetectionSystem

* Update

* Update

* Update

* Yikes

* Update

* Dirty

* Update

* Update

* Lil cleanup

* Update

* Update
2025-05-12 00:33:35 +10:00
PJBot
cd1ebecab0 Automatic changelog update 2025-05-11 14:07:16 +00:00
Vlad
d9542ae700 Map renderer rework (#37306)
* Update TilePainter.cs

* Add support for custom offsets, grid files, and markers

* Dynamic file category handling
2025-05-12 00:06:09 +10:00
SlamBamActionman
ca39645b69 Fix allowRotationMirror not appearing for the YAML linter (#37343)
Initial commit
2025-05-11 09:40:59 -04:00
Tayrtahn
722137ddb7 Cleanup warnings in IconSmoothSystem (#37337)
Cleanup warnings in IconSmoothSystem
2025-05-11 09:40:38 -04:00
Łukasz Lindert
8bed0f4b62 Booze and soda dispenser activate ui fix (#37347)
booze and soda
2025-05-11 15:39:52 +02:00
Leon Friedrich
2fcf14bf52 Increase benchmark BuildTimeout (#37029)
* Increase benchmark BuildTimeout

* Add RaiseEvent benchmark

* a

* More benchmarks

* It just gets optimised away

* IComponent event

* cleanup bench
2025-05-11 21:59:29 +10:00
Leon Friedrich
e1db9bd66f Update engine to v257.0.2 (#37348) 2025-05-11 21:55:59 +10:00
Leon Friedrich
1b63320824 Update engine to v257.0.1 (#37339) 2025-05-11 12:01:33 +10:00
PJBot
796a9867d5 Automatic changelog update 2025-05-11 00:50:34 +00:00
Deerstop
8f01cc6884 Elkridge - Botany Update (#37206) 2025-05-10 17:49:26 -07:00
github-actions[bot]
605a917139 Update Credits (#37338)
Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com>
2025-05-10 20:38:03 -04:00
PJBot
89d7fb09fd Automatic changelog update 2025-05-11 00:10:34 +00:00
Futuristic-OK
48d134cc7d New hairs2 (#36613)
* Update human-hair.ftl

1

* Update human_hair.yml

* longwithbangs.png

* Update meta.json

* fix png

* Update meta.json

* Update Resources/Locale/en-US/accessories/human-hair.ftl

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

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

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
2025-05-10 20:09:27 -04:00
PJBot
abe466b40a Automatic changelog update 2025-05-10 23:36:34 +00:00
JCGWE30
29147edabd Dragon Direction Briefing Fixed (#37181)
* All Fixed Up

* Remove Log Manager

* Updated Conventions

* Typo Fix
2025-05-10 19:35:27 -04:00
YoungThug
d758e9eaa1 New ID interface sprites. (#37322)
* LR > TCD

* Orks Requested Changes
2025-05-10 18:56:36 -04:00
PJBot
1129f37d66 Automatic changelog update 2025-05-10 21:42:47 +00:00
Nemanja
dfc8934782 Fix observer pointlights being broken (#37335) 2025-05-10 23:41:40 +02:00
PJBot
34f8be84b6 Automatic changelog update 2025-05-10 18:22:11 +00:00
ssdaniel24
9881528692 Station news Discord webhook (#36807)
* Add news article Discord webhook

* Send all station articles on round end

* Changed event subscrice to RoundEndMessageEvent

* Review remarks fix

* Added new cvar discord.news_webhook_embed_color

Default color taken from news manager console sprite.

* Using EntityQueryEnumerator instead of GetStationInMap with TryComp

* Extra review remarks fixing

* Sorted imports

* Added article publication time in embed

* Removed markup from article content

* Added sorting for articles iteration

* Discord hook embed color cvar is string now

* Added comment about limits

* Added new cvar for posting articles during round

* Shitty discord rate limit handling

* Fixing copypaste accident

Co-authored-by: pathetic meowmeow <uhhadd@gmail.com>

* Null initialization of webhook id

* SendArticleToDiscordWebhook is non-void now

---------

Co-authored-by: Morb0 <14136326+Morb0@users.noreply.github.com>
Co-authored-by: pathetic meowmeow <uhhadd@gmail.com>
2025-05-10 11:21:02 -07:00
PJBot
5c3b613507 Automatic changelog update 2025-05-10 15:13:24 +00:00
Ethan_k
0512de555d Increase paper max char limit to 10,000 (#37270)
HOP MAINS REJOICE
2025-05-10 17:12:17 +02:00
Winkarst
51205454f3 Fix: Add ability to execute using crusher weapons (#37330)
* Fix

* Oops

* Skill issue
2025-05-10 09:47:57 -04:00
PJBot
a921d97d4e Automatic changelog update 2025-05-10 12:52:35 +00:00
Nemanja
38f6e6e849 Add EvenHealthChange effect (#37129)
* Add EvenHealthChange effect

* cleanup

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
2025-05-10 14:51:28 +02:00
metalgearsloth
0a10651414 Update submodule to 257.0.0 (#37329) 2025-05-10 22:18:23 +10:00
Leon Friedrich
f0a7123208 Fix MagazineVisualsSpritesExist for engine PR (#36761) 2025-05-10 21:40:27 +10:00
PJBot
603eb284d5 Automatic changelog update 2025-05-10 09:59:10 +00:00
PotentiallyTom
29860c03ea Modified the T2/T3 laser recipies to (hopefully) see more than just xray cannons (#37308)
the numbers mason
2025-05-10 11:58:03 +02:00
PJBot
357c96148c Automatic changelog update 2025-05-10 05:07:26 +00:00
Princess Cheeseballs
62c380fc53 Better Godmode (#37020)
* Commit

* Oversights oops

* breaking changes

* unbreaking changes

* Compatibility with AfterFullyEaten

* Fixed

* Update Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs

---------

Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
2025-05-10 01:06:19 -04:00
pathetic meowmeow
4407eab96b Fix reagent dispenser test (#37324) 2025-05-10 00:46:48 -04:00
Princess Cheeseballs
5dbd40c9dd Mob pull spin fix (#37256)
Angular Friction applied to Kinematic Controllers
2025-05-10 14:18:33 +10:00
PJBot
6d65039f3c Automatic changelog update 2025-05-10 03:56:42 +00:00
B_Kirill
2f7ca220e7 Fix meteors deceleration (#37320)
* Fix meteors deceleration

* Again

* Just do it
2025-05-09 23:55:35 -04:00
metalgearsloth
280a78119b Update submodule to 256.0.0 (#37321) 2025-05-10 13:53:09 +10:00
PJBot
9f3ab3545b Automatic changelog update 2025-05-10 03:50:12 +00:00
pathetic meowmeow
5a0e0524ca Make reagent dispensers gridinv-based instead of pseudo-listinv (#34205)
This simplifies the code and makes the experience of examining contents
easier without the reagent dispenser UI, as well as adding the possibility
for dispensers to have items of heterogeneous sizes in them, which would
allow configuring reagent dispensers to accept smaller containers such
as beakers or vials in order to allow for more types of smaller quantities
of reagents, or other flexibilities brought by using a standard storage
component.
2025-05-09 23:49:05 -04:00
Nemanja
942b2b4dcb Change atmos plaques to yaml (#37318)
* Change atmos plaques to yaml

* remove locale strings
2025-05-10 02:24:07 +02:00
deltanedas
bb7742e21e move SignalState to shared (#37303)
Co-authored-by: deltanedas <@deltanedas:kde.org>
2025-05-09 20:05:19 -04:00
Winkarst
b13975cad2 Fix: Make gas canisters eject inserted tank/jetpack on break (#37314)
Fix
2025-05-09 20:01:44 -04:00
Samuka-C
fbe05977d5 Fix the component toggler (#37309)
* Make the ComponentToggle remember what entity it gave components to

* fix the null problem by just ignoring the null problem

* Add documentation to the new datafield + removing the "= null" that is not necessary

* small fixes and cleaning the code

* whitespace my beloved

* wait, I dont need those lines, why did I add them?
2025-05-09 20:00:58 +02:00
Tayrtahn
b769ab0f7e Add test that mob damage thresholds have alerts (#37307)
* Add test that mob damage thresholds have alerts

* Docs

* Add BorgDead state to MobSiliconBase
2025-05-09 13:07:17 -04:00
PJBot
6517710356 Automatic changelog update 2025-05-09 15:53:38 +00:00
Gamewar360
d0dc8faed0 [Cargo]New Bounty: Salvage (#34926)
* uoy

* Fix vague tag names, issues with bounty text

---------

Co-authored-by: EmoGarbage404 <retron404@gmail.com>
2025-05-09 11:52:30 -04:00
Winkarst
239c71d7b8 Fix: Make `IdBindComponent change ID card on MapInitEvent` (#37300)
Fix
2025-05-09 11:46:10 -04:00
PJBot
9bdc150602 Automatic changelog update 2025-05-09 15:42:53 +00:00
Vladislav Suchkov
554f6f3d68 Fixed Silo not accepting diamonds (#37305)
init
2025-05-09 11:41:44 -04:00
PJBot
653aaece34 Automatic changelog update 2025-05-09 12:44:44 +00:00
Errant
68d0a41bb4 fix unremovable items used in construction (#37292) 2025-05-09 15:43:38 +03:00
paige404
9610b23d55 Rainbow Jumpskirt (#37291)
* Add a rainbow jumpskirt. <3

* minor spelling mistake dot gif

Co-authored-by: Tayrtahn <tayrtahn@gmail.com>

---------

Co-authored-by: Tayrtahn <tayrtahn@gmail.com>
2025-05-09 07:48:08 -04:00
PJBot
b0b0a8238b Automatic changelog update 2025-05-09 11:33:36 +00:00
robinthedragon
beefabc588 add basic operative bundle (#37290)
* add nukie bundle

* Update Resources/Prototypes/Catalog/uplink_catalog.yml

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
2025-05-09 13:32:29 +02:00
PJBot
aafc166a36 Automatic changelog update 2025-05-09 03:36:56 +00:00
Nyxilath
f2c7b39e13 readded trashbags to Autolathe recipes (#37296) 2025-05-08 20:35:49 -07:00
PJBot
52031f3495 Automatic changelog update 2025-05-09 00:07:33 +00:00
Ciarán Walsh
2a201837c7 Link to reagent ingredients on the same Guidebook page (#36700)
* Add in-page links for guidebook reagent recipes

* Add links to microwave recipes

* This function is too specific to be in Control extensions

* Better naming

* Wrap RichTextLabel instead of subclassing

* "Activate" is ambiguous
2025-05-09 10:06:26 +10:00
Nemanja
7bec148634 Validate Cargo Markets (#37271)
* Validate cargo markets

* readonly market ID
2025-05-08 21:53:19 +02:00
PJBot
4660f9938f Automatic changelog update 2025-05-08 17:39:38 +00:00
MureixloI
a05e876879 changing sprite of mime satchel (#37280) 2025-05-08 13:38:31 -04:00
Vasilis The Pikachu
d19a421671 Merge remote-tracking branch 'upstream/master' into staging 2025-05-08 19:37:20 +02:00
Vasilis The Pikachu
c91bd05239 Merge remote-tracking branch 'upstream/staging' into staging 2025-05-08 19:37:14 +02:00
Myra
8d4b3c0fdc Revert "Traumoxadone" (#37284) 2025-05-08 19:08:27 +02:00
PJBot
047ef64661 Automatic changelog update 2025-05-08 16:51:06 +00:00
Thinbug
0c6be8bb0d Tweaks to the push horn so its less of a shitter tool (#37281)
* Empty commit

* tweaks to the push horn

* forgor to change the delay

* keeping the speed the same for now
2025-05-08 18:49:58 +02:00
ScarKy0
746134edd3 fuck the cl 2025-05-08 18:32:58 +02:00
slarticodefast
307d0b1c8b merge stable into master (#37286) 2025-05-08 18:32:53 +02:00
Myra
d515a1dbf6 Add ratelimit retry to discord changelog bot and continue publish changelog error. (#37051)
* Add ratelimit retry to discord changelog bot and continue publish changelog error.

oops we missed some changelogs cause of this... this should prevent anything funny

* Update actions_changelogs_since_last_run.py
2025-05-08 18:30:50 +02:00
ScarKy0
9e582157ac Revert "Traumoxadone (#37126)"
This reverts commit efc8d8600d.
2025-05-08 18:13:33 +02:00
PJBot
e94a50b4cc Automatic changelog update 2025-05-08 14:29:22 +00:00
Krunklehorn
1ee9b25927 Fix borg chassis gibbing not dropping items (#37276)
BeingGibbedEvent and TryEjectPowerCell
2025-05-08 10:28:11 -04:00
slarticodefast
0973218054 merge stable into master (#37277) 2025-05-08 11:00:20 +02:00
nikthechampiongr
ef3deedecb Implement Rules amendment (#37200)
* Implement Rules amendment

* Update Resources/ServerInfo/Guidebook/ServerRules/RoleplayRules/RuleR9MassSabotage.xml

Co-authored-by: Tayrtahn <tayrtahn@gmail.com>

* Update RuleR9MassSabotage.xml

---------

Co-authored-by: Tayrtahn <tayrtahn@gmail.com>
Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com>
2025-05-08 10:59:21 +02:00
Tayrtahn
4aa635620c Fix debug asserts in WoolySystem and UdderSystem (#35314) 2025-05-08 09:55:41 +02:00
PJBot
4a521c56cf Automatic changelog update 2025-05-08 01:40:18 +00:00
Southbridge
129204b54e Amber Station - Security and AI Sat Overhaul (#37262) 2025-05-07 18:39:09 -07:00
Cojoke
fdf860d64f Small InventorySystem.Equip Unequip Reason bugfix (#37265)
Fix small bug
2025-05-07 20:47:03 -04:00
Quantum-cross
6bb3b83bf1 For DamagedSiliconAccent use Destructible threshold for default "DamageAtMaxThreshold" (#37252)
* set DamageAtMaxCorruption as nullable with null default and use destructible trigger threshold for this if null.

* fix documentation

* these really don't need to be passed by reference
2025-05-07 20:44:36 -04:00
Tayrtahn
d80934b156 Move random species selection earlier in player spawning logic (#37258)
* Select random species earlier in spawning logic

* ternary operator

* Move it even earlier to fix more bugs
2025-05-07 20:38:56 -04:00
themias
14adb1ff01 Cargo request and bounty console deny sound cooldown (#37234)
* Cargo bounty console deny sound cooldown

* ordering computer cooldown

* Update Content.Shared/Cargo/Components/CargoBountyConsoleComponent.cs

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Update Content.Shared/Cargo/Components/CargoBountyConsoleComponent.cs

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Update Content.Server/Cargo/Systems/CargoSystem.Bounty.cs

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* AutoGenerateComponentPause

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
2025-05-07 20:34:44 -04:00
B_Kirill
b3c4c7c32b Cleanup warnings: CS8321, CS0105, CS0168 (#36949)
* Clean up

* CS0168
2025-05-07 20:01:02 -04:00
B_Kirill
c196538aaf Cleanup warnings: CS0414 (#36950)
* Clean up

* Use #pragma
2025-05-07 20:00:12 -04:00
PJBot
057cc2304a Automatic changelog update 2025-05-07 23:49:46 +00:00
B_Kirill
9ff5850667 AI context menu fix (#37224)
* AI context menu fix

* Revert "AI context menu fix"

This reverts commit 86a0476fcb0aa952c0dcadb1bc4246532abd62b7.

* Better implementation

* Retry
2025-05-07 19:48:39 -04:00
PJBot
d28289c3c4 Automatic changelog update 2025-05-07 23:27:55 +00:00
SlamBamActionman
90c3ba8f36 Add 3 new Exomorph posters (#37260)
Initial commit
2025-05-07 19:26:48 -04:00
Tayrtahn
ef79373904 Fix chairs deleting players (#37261)
Unbuckle entities when a strap is about to be deleted
2025-05-07 19:25:17 -04:00
Verm
47258651a3 Make container draw disableble for mob-affecting Hyposprays (#30683)
* Seperate container draw from affects mobs

* Spaces

* More spaces

* Fix toggle

* Use better ands

* Reorder checks for Performance™️

---------

Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
2025-05-07 16:43:47 -04:00
PJBot
df10d75cf7 Automatic changelog update 2025-05-07 20:29:35 +00:00
themias
8edc8c7596 Genpop closet cargo orders (#37237)
* Genpop closet cargo orders

* change icon to locker base
2025-05-07 22:28:28 +02:00
deltanedas
50bad5ad60 fix pka admin log (#37255) 2025-05-07 10:56:20 -07:00
lzk
4420d67f92 make throw insert container code more clear (#36873)
make throw insert container more clear
2025-05-07 15:08:28 +02:00
PJBot
132dadeca8 Automatic changelog update 2025-05-07 12:46:00 +00:00
Zalycon
31ce616c25 Raises max chest markings for all species (except Reptilian) to 2 (#37065)
* Update arachnid.yml

* Update diona.yml

* Update human.yml

* Update moth.yml

* Update slime.yml

* Update vox.yml
2025-05-07 14:44:53 +02:00
PJBot
86c851ba5d Automatic changelog update 2025-05-07 11:39:06 +00:00
K-Dynamic
ae6f96fa87 Four-way pipe junction, swapping junction construction fix (#37092)
* pipe x-junction assets, yml, construction

* remove duplicate asset

* attribution

* x junction instead of junctioncross for utilities.yml
2025-05-07 13:37:59 +02:00
PJBot
e5ab034aa7 Automatic changelog update 2025-05-07 10:07:49 +00:00
Flareguy
cdcc57e467 Moth displacement maps (#37231)
moth displacement maps
2025-05-07 13:06:42 +03:00
kosticia
665fecf677 Make animals drop giblets into container or floor when they inserted into container (#37228)
* a

* Revert "a"

This reverts commit 2b9ba4ea67a9395d30b7ab37c8065f627f1a961a.

* auausasuasuausuuAUSTRALIA!!!!!!aausuasusdasda

* 77+33!=100
2025-05-06 22:14:08 -04:00
PJBot
45c2617e30 Automatic changelog update 2025-05-07 02:04:14 +00:00
UpAndLeaves
8cf6ca78cf Fire damage system fixes (#37241)
Fire fixes
2025-05-06 22:03:05 -04:00
Archee
012eeb3158 Cryotube draw-depth (#37240)
* removes changing draw depth when occupied

* changes collision to square

* small texture changes
fixes slight perspective size when comparing side columns to the direct column facing the camera
removes the baked in pipe exit (the yml's sprite adds it anyway)
2025-05-06 22:01:09 -04:00
PJBot
a1dacfc62b Automatic changelog update 2025-05-06 19:11:17 +00:00
Ghagliiarghii
bcdb17597a Fix borg soap (#36961)
* Create SoapBorg and replace SoapNT with SoapBorg in BorgModuleCustodial

* Reparent SoapBorg

No longer a container so the soap reagent cannot be extracted from the soap, no longer a food, no longer slippery since it can't be removed from the borg to be placed on the ground

* Move SoapBorg to end of soap.yml

* correct comp order

* fix failing tests
2025-05-06 15:10:10 -04:00
PJBot
dce9c649e8 Automatic changelog update 2025-05-06 19:05:26 +00:00
pathetic meowmeow
cfba56c2b4 Make departmental orders consoles print slips (#36944)
* Make departmental orders consoles print slips

* feed back cycle
2025-05-06 15:04:18 -04:00
PJBot
f73f6d4467 Automatic changelog update 2025-05-06 18:32:30 +00:00
OnyxTheBrave
e527adea92 Fixed holy water metabolism rate (#37106)
* Fixed holy water metabolizing at 1u instead of .5u a second

* Update Resources/Prototypes/Reagents/medicine.yml

---------

Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
2025-05-06 14:31:23 -04:00
Krunklehorn
522c6975f1 Darken reptilian eye sockets to reduce the effect of mixels (#37082)
Initial commit
2025-05-06 14:30:25 -04:00
Princess Cheeseballs
64f7fe10cc Ichor double-metabolize fix + Very minor cleanup (#37107)
Not a yaml vacation apparently
2025-05-06 14:16:13 -04:00
PJBot
1ee4c1fe72 Automatic changelog update 2025-05-06 18:14:41 +00:00
Prole
6cdc436f5f Water bottle dispenser fix & Bottle Yaml Organizing (#37108)
* A New Parent/Category For The Soda & Tonic Water Bottle

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* New Parent For water bottle & Cleanup

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* More Cleanup

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* Details

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* Organizing For Additions

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* Streamlining waterbottle to be compatible with DrinkBottleVisualsAll Parent

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* Replacing/Renaming Parents

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* New Tonic/Soda Water Bottle Sprites

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* Misc Fixes

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* New Parent for Small Glass Bottles & Organizing

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* Organizing & uSize Parity.

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* File Parity

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* Merged Categories & Misc Fixes

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* Removed Silly

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* Parent Name Parity & Cleanup

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

* Large Glass Bottles Category & Cleanup

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>

---------

Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com>
2025-05-06 14:13:33 -04:00
PJBot
62984fc309 Automatic changelog update 2025-05-06 17:50:49 +00:00
lzk
740ce0e8ad Port fancy speech bubbles (#29349) 2025-05-06 20:49:42 +03:00
PJBot
a6f2172d05 Automatic changelog update 2025-05-06 17:26:05 +00:00
B_Kirill
c156c5c465 Add collapse button to lobby right panel (#37140)
* Add collapse button to lobby right panel

* Half sized buttons
2025-05-06 13:24:58 -04:00
ScarKy0
9b5ddb87f5 Fix brains, borgs etc not counting as marooned (#37148)
* init

* comments

* comment

* no more debug
2025-05-06 13:24:26 -04:00
poklj
ac24be2fb7 Split out the CloneComponents into its own method (#37155)
* Split out the CloneComponents into its own method

* CR - Move some extra info in

- add TryComp for status effects

- Move some remcomps around

- Make Special event raising components to handle special
components that reference entities that have ownership

* CR - Extra recommendation on the prototype

thanks slarti

* Solve the yaml linter problem

* CR - Typos, grammar and some extra Status effect

* cleanup

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
2025-05-06 13:22:32 -04:00
PJBot
cbc49975c6 Automatic changelog update 2025-05-06 17:02:44 +00:00
Quantum-cross
3f3be47ae4 Fix effects of hosted anomaly when transform is parented (#37179)
* hosted anomaly effects now are at the correct location when the host is in a container or buckled

* oops, not keeping the uid and transform together

* use world positions to get the position of the anomaly -- my previous method was reinventing the wheel.
2025-05-06 13:01:37 -04:00
PJBot
4ce09bd2da Automatic changelog update 2025-05-06 16:58:12 +00:00
themias
ff03e7f066 Fix dough rolling (#37183) 2025-05-06 12:57:05 -04:00
PJBot
c5e8020bf0 Automatic changelog update 2025-05-06 16:56:07 +00:00
Cojoke
02c2de3ec5 Allow Pacifists to Use Bola (#37188) 2025-05-06 12:55:00 -04:00
YoungThug
c0935e5b59 AI Law Board File Clean Up (#37195) 2025-05-06 12:51:32 -04:00
Princess Cheeseballs
9c165cb5a0 StaminaSystem to SharedStaminaSystem (#37199)
* Init Commit

* Partial class

* Hands system slipped through
2025-05-06 12:39:05 -04:00
archee1
ef881fe655 Removing redundant trash tags on medipens (#37215)
removes redundant tag components
2025-05-06 12:24:52 -04:00
PJBot
ca1a8fa457 Automatic changelog update 2025-05-06 16:22:23 +00:00
B_Kirill
2fbc951230 More filters for station records (#37213) 2025-05-06 12:21:16 -04:00
Princess Cheeseballs
cf86e0de1d Ghost friction fix (#37124)
* commit

* fix for real
2025-05-06 23:49:43 +10:00
PJBot
5bfdfc9fca Automatic changelog update 2025-05-06 06:57:43 +00:00
Spessmann
a4b50db5e1 Convex genpop update (#37216) 2025-05-05 23:56:34 -07:00
PJBot
5b9a91c115 Automatic changelog update 2025-05-06 01:30:30 +00:00
Spanky
962c5c0822 Fland Update (Genpop) (#37207) 2025-05-05 18:29:17 -07:00
Tayrtahn
532ef05140 Fix ComponentTogglerSystem deletion error (#37198)
Don't try to toggle if target is terminating or deleted
2025-05-05 18:35:15 -04:00
Deerstop
90fd66c3d4 Salv Ruins Again (#37193) 2025-05-04 23:33:18 -07:00
PJBot
b90d7c9012 Automatic changelog update 2025-05-04 23:02:33 +00:00
brainfood1183
d7f5dac0b8 Fix for Whoopie Cushions (Fixes #32028) (#36984)
* Fixes whoopie cushions so they no longer launch you into oblivion when stacked in a large pile.

* Update Resources/Prototypes/Entities/Objects/Fun/toys.yml

* streamlined the components for the prototype

---------

Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
2025-05-05 01:01:27 +02:00
PJBot
325b0619b6 Automatic changelog update 2025-05-04 22:43:28 +00:00
Perry Fraser
61d524a983 Allow shelves to be placed rotated when built by hand (#37186)
fix: shelves can be placed rotated when built by hand
2025-05-05 00:42:21 +02:00
J
7b352643d5 Refactor magic speak system to be a component added to actions (#36328) 2025-05-04 13:34:19 -04:00
Pieter-Jan Briers
81cbb31425 Remove update from DeviceLinkSystem (#37152)
The tick updates were purely used to decrease the invoke counter once per tick. Now instead we just calculate the effective counter value with some trivial math on the tick number. This completely removes the need for an update function.

The relative tick is not stored to map files. If we really need this, we can add a TickOffsetSerializer (similar to TimeOffsetSerializer), but I doubt it matters.
2025-05-04 12:14:23 -04:00
Pieter-Jan Briers
e6040d1b25 Update GDPR erase script to latest DB schema (#37162) 2025-05-05 00:11:28 +10:00
PJBot
20da7fcd25 Automatic changelog update 2025-05-04 07:21:41 +00:00
Southbridge
6926fa1ad3 Bagel Station - Removed Gamer Loot (#37171) 2025-05-04 00:20:33 -07:00
PJBot
ccfcb0cf7a Automatic changelog update 2025-05-04 05:48:20 +00:00
Nemanja
c4dd912106 Don't despawn off-grid salv mob corpses (#37169) 2025-05-03 22:47:11 -07:00
PJBot
eac0585bf4 Automatic changelog update 2025-05-04 02:40:25 +00:00
Nemanja
f1a17f360d Revert "add material composition to some salv treasure" (#37149)
* Revert "add material composition to some salv treasure (#31970)"

This reverts commit 125258ea48.

* Remove ring materials as well
2025-05-04 04:39:19 +02:00
PJBot
0de4ec912f Automatic changelog update 2025-05-04 00:39:54 +00:00
Nemanja
9afa15ab41 Salvage Threat: Gibtonite (#37160) 2025-05-03 17:38:47 -07:00
github-actions[bot]
fbd409a54b Update Credits (#37163)
Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com>
2025-05-03 20:37:39 -04:00
Spessmann
f9825e1f96 Add more ruins (#37161) 2025-05-03 16:44:53 -07:00
PJBot
e5abf61474 Automatic changelog update 2025-05-03 21:20:15 +00:00
Spanky
6d6ae95914 Omega Update (Genpop) (#37157) 2025-05-03 14:19:07 -07:00
PJBot
ea67654733 Automatic changelog update 2025-05-03 19:29:54 +00:00
Minemoder5000
42a5b03743 Replace uplink thieving gloves with chameleon thieving gloves (#36369)
* replace thieving gloves with chameleon thieving gloves

* increase TC cost by one

* add a TODO comment
2025-05-03 15:28:47 -04:00
PJBot
ef86e6681e Automatic changelog update 2025-05-03 19:20:39 +00:00
youtissoum
07460f9eda Fix skeletons spawning in folded body bags (#37151)
* Fix skeleton spawning

* Add comments

* Fix the comments

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
2025-05-03 21:19:32 +02:00
Nemanja
0c8c757a42 Revert "Resprited the Chief Engineer's mantle/manica" (#37060)
Revert "Resprited the Chief Engineer's mantle/manica (#36697)"

This reverts commit d0c2a64436.
2025-05-03 14:28:59 -04:00
chromiumboy
f213753e2b Sentry turrets - Part 5: Reuseable UI components (#35149)
* Initial commit

* Updated how monotone buttons are styled

* Removed unnecessary textures

* Updated attributions

* Addressing reviewer comments

* Adjusted monotone checkbox styling
2025-05-03 12:19:08 -05:00
Ghagliiarghii
885eb7bc35 ClothingOuterEVASuitSyndicate (#36738)
* ClothingOuterEVASuitSyndicate

* Update migration.yml

* Resolve merge conflict in migration.yml

---------

Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
2025-05-03 12:06:35 -04:00
J
82ce890fc9 Explosions warnings cleanup (#36167)
* Explosions warnings cleanup

* Revert unnecessary change

* Cleaner Entity instantiation

* Remove conflicting changes with #36098
2025-05-03 18:05:29 +02:00
metalgearsloth
60e3d8e507 Fix throwing prediction (#37086)
* Fix throwing prediction

- Disposals is still janky but I think that's disposals in general not being predicted and the disposals throw not being predicted and short-lived.
- Would need to check RMC.
- Couldn't repro the underlying issues however thrown items don't slip anymore so (and we also don't predict their land / stopping anymore so).

* primary constructor

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
2025-05-03 17:17:30 +02:00
PJBot
3ee5ed3cc6 Automatic changelog update 2025-05-03 15:09:03 +00:00
Radezolid
aaa4c75341 Fix some maintenance doors not using wires configuration + cleanup + minor changes (#36735)
* Kill useless maints doors + general fixes

* Migrate the common maints airlock

* Fix parenting

* Service Theatre

* migrate out the other removed airlock

---------

Co-authored-by: EmoGarbage404 <retron404@gmail.com>
2025-05-03 11:07:57 -04:00
kosticia
f3bc40eaa7 make node scanner don't show interface if scanned entity not a artefact (#37146)
* a

* a

* Revert "a"

This reverts commit 2b9ba4ea67a9395d30b7ab37c8065f627f1a961a.
2025-05-03 10:29:52 -04:00
PJBot
dc2a7483c7 Automatic changelog update 2025-05-03 12:11:51 +00:00
Errant
79187cecb9 randomize names for mindshielded eventhumanoids (#37143) 2025-05-03 08:10:43 -04:00
ArtisticRoomba
ee201c6eb7 fix atmos grid markers (#37142)
* fix atmos grid markers

* 1984 CL
2025-05-03 09:11:31 +02:00
3nderall
213a9ef36d Renders reagent grinders over lights (#31218)
* Adds a new layer to DrawDepth.cs for use with objects similar to the reagent grinder and properly summarises its uses

* applies new layer in DrawDepth.cs to reagent_grinder.yml

* Fix merge conflict

* oops
2025-05-03 14:27:20 +10:00
PJBot
0d0eeb2afa Automatic changelog update 2025-05-03 04:19:17 +00:00
Unkn0wn_Gh0st
11096ad9bf New Weapon: Knuckle Dusters (#33470)
* New Weapon: Knuckle Dusters

* Tag YAML Error Fix

* Crafting Graph Node Error

(Thank you slarticodefast)

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Crafting Node Error Part 2 Electric Boogaloo

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Contraban & QM Dusters Nerf

* Stun Knuckledusters (Unfinished)

* Typo

* Fix test fails

* The dastardly maintainer balance webedit

* Fix contraband parenting

* Fix construction failure

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
Co-authored-by: EmoGarbage404 <retron404@gmail.com>
2025-05-03 00:18:08 -04:00
slarticodefast
5d26a38a1d fix clone appearance (#37130) 2025-05-02 21:26:12 -04:00
PJBot
4ba8945c5b Automatic changelog update 2025-05-02 22:57:54 +00:00
ScarKy0
efc8d8600d Traumoxadone (#37126)
* init

* salicylic acid
2025-05-03 00:56:47 +02:00
Prole
c153f84e42 noRot on 2-way lever (#37125) 2025-05-02 13:07:20 -07:00
PJBot
85d6b728ee Automatic changelog update 2025-05-02 18:32:56 +00:00
Vladislav Suchkov
b4ad372ca7 Clarify that PA crate order includes boards (#37109)
init
2025-05-02 14:31:49 -04:00
Princess Cheeseballs
b6c8119646 Movement Rewrite Hotfix (#37122)
* One line bugfix

* also divide friction by 5

* Undo that
2025-05-02 20:31:10 +02:00
PJBot
c27c0e7ff8 Automatic changelog update 2025-05-02 17:13:30 +00:00
Errant
2b2bfbfebd Fix for vox dropping all bodyparts when gibbed (#37111)
vox parts cleanup
2025-05-02 13:12:23 -04:00
PJBot
e7cb80da11 Automatic changelog update 2025-05-02 16:15:23 +00:00
themias
7fd66820b9 Fix station beacon not updating (#37121) 2025-05-02 12:14:16 -04:00
PJBot
2b748694bf Automatic changelog update 2025-05-02 15:46:53 +00:00
Southbridge
d35c755685 New Salvage Ruin - Atmos Interchange (#37115) 2025-05-02 08:45:46 -07:00
PJBot
ecd7ba8bb5 Automatic changelog update 2025-05-02 10:08:19 +00:00
metalgearsloth
51bff89b23 Fix AI movement (#37114)
Don't relay blocking anymore.
2025-05-02 12:07:12 +02:00
Nemanja
26ebf06b81 Add condition support to entity tables (#36819) 2025-05-02 11:37:14 +03:00
PJBot
25108234ea Automatic changelog update 2025-05-02 08:23:36 +00:00
metalgearsloth
bd69fc612a Predicted internals (#33800)
* Predicted gas pumps

I wanted to try out atmos and first thing I found.

* a

* Atmos device prediction

- Canisters
- Tanks
- Internals

AirMixes aren't predicted so nothing on that front but all the UIs should be a lot closer.

* Remove details range

* Gas tank prediction

* Even more sweeping changes

* Alerts

* rehg

* Popup fix

* Fix merge conflicts

* Fix

* Review
2025-05-02 18:22:29 +10:00
PJBot
d404422b5c Automatic changelog update 2025-05-02 08:19:16 +00:00
Princess Cheeseballs
36030ef154 Mob Movement Major Refactor (#36847)
* Conveyor optimisations

- Optimise movement for moving stuff. Better flags + less resolves + slapped parallelrobustjob on it.
- Sleeping for entities getting conveyed into walls.

* Blocker version

* Finish

* Final

* Fix conveyor power mispredict

* Bagel save

* Revert "Bagel save"

This reverts commit 1b93fda81fb852d89b89b0beae0b80f8a61165f2.

* Conveyor resave

* Init Commit

* windows yelling at me to update commit

* working commit, need prediciton and more dehardcoding

* Project 0 warnings

* Working Commit (Near Final)

* ryder got confused commit

* I love Merge Conflicts :)

* Working commit, no prediction

* Forgot the yaml changes

* Comments and typos

* Apparently while the reduced launch mult of lube was initialized it was never used so I revered back to default

* Fixed an incorrect divisor

* bit of cleanup

* Prediciton fixed, and puddles now affect all entities

* FORGOT TO RENAME A VERY IMPORTANT VARIABLE OOPS

* Really big I forgor moment

* Even bigger I forgor moment

* four more merge conflicts to fix four more oopsies

* fixed actual divide by zero moment and also im very dumb

* Even bigger I forgor moment

* four more merge conflicts to fix four more oopsies

* fixed actual divide by zero moment and also im very dumb

* Fix all test fails

* code cleanup

* Webedit whitespace

* Code cleaup

* whitespace webedit

* whitespace webedit

* whitespace webedit

* whitespace removal

* Comments and cleanup

* Re-Added 20 warnings as per Ork's request

* Cleanups

* Spacing fix

* bugfixes and cleanup

* Small bugfix

* Fix prediction

* Mob movement rewrite

* Bandaid

* Working version

* Tentatively working

* Friction to fix cornering

* More fixes

* Refactor mob movement

Trying to cleanup relay ordering / tryupdaterelative being cooked, purge ToParent, and fix all the eye rotation shenanigans.

* Building

* Re-implement jetpacks

* Reorganise weightless movement

* More work

* Fix camera

* reh

* Revert bagel

* Revert this

* Revert held move buttons

* Puddles work but are unpredicted and unoptimized

* Fixes

* Puddle code...

* Actually dirty the slipComp for real

* Sliding component done plus an extra suggestion from ArtisticRoomba

* Atomized Commit

* Added Friction field to Reagent Prototype per design discussion

* Cleaned up Working Commit

* a

* Delete stinkers

* Fix this code smell

* Reviewed

* Funky re-save

* Our conveyance

* Better conveyor sleeping

* Remove this

* Revert "Better conveyor sleeping"

This reverts commit f5281f64bbae95b7b9feb56295c5cf931f9fb2e1.

* Revert that

Way too janky

* Also this

* a

* Working Commit - Still a lot to do

* Acceleration refactor

* Minor jetpack cleanup

* frictionnomovement no longer nullable

* Shared Mover Feels 99% done

* OffGrid/Weightless/Throwing Friction saved

* Fix merge conflicts

* Fix a debug assert

* Final Commit for today

* Some fixes

* Actually use those CCVars Properly

* Need to fix throwing

* Second to last Commit for real

* Jetpack bug fixed

* Jetpack bug fixed

* Test fail patch

* Small patch

* Skates Component cleanup + Bring Accel back to 5 (oops)

* Fix test fail oops

* yaml cleanup make dragons not fat

---------

Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
2025-05-02 18:18:08 +10:00
beck-thompson
1fbc845126 Species are now picked at random in the developer environment! (#37057)
* Various changes to random species in dev

* This should be split
2025-05-02 14:09:23 +10:00
Nemanja
bb547eb03b fix logic gate draw depth (#37053)
fix logic gate layering
2025-05-02 04:12:02 +02:00
PJBot
c37f06c1a9 Automatic changelog update 2025-05-02 01:58:01 +00:00
YoungThug
cfa80bc710 Wizard Helmet in the Magic Vend (#37084)
Whats the limit for stuff you can put in a commit message lol
2025-05-02 03:56:54 +02:00
PJBot
706ebcd258 Automatic changelog update 2025-05-02 01:08:24 +00:00
Perry Fraser
64141b974b Pointing arrow smite no longer lasts forever (#37102)
fix: pointing arrow smite no longer lasts forever
2025-05-02 03:07:15 +02:00
kosticia
b465ddfee2 fix asteroid tiles (#37103)
aw
2025-05-02 03:04:41 +02:00
Tayrtahn
2ff9c8dfb9 Fix vending machine manager wire error (#37100)
Skip updating amounts for removed entries
2025-05-02 02:21:59 +02:00
PJBot
bc8919c4cf Automatic changelog update 2025-05-01 23:02:24 +00:00
nikitosych
72d2d8ab0f Overhauled stamina slowdown behavior (#36336) 2025-05-01 19:01:17 -04:00
PJBot
52062dcfad Automatic changelog update 2025-05-01 22:08:54 +00:00
slarticodefast
42dce359e5 Add noir glasses (#36923)
hardboiled
2025-05-01 18:07:47 -04:00
Tiniest Shark
35f7abafe5 Updates the Pirate Captain Hardsuit Helmet light sprites. (#37027) 2025-05-01 18:07:11 -04:00
PJBot
65c0e899cd Automatic changelog update 2025-05-01 22:04:54 +00:00
K-Dynamic
ea64d4d106 Atmos air (6500 kPa) marker (#37061)
* air GM atmosphere

* atmos fix air miner
2025-05-01 18:03:47 -04:00
eoineoineoin
9a7b68de55 Select current target in mailing unit UI, prevent UI jumping (#37098) 2025-05-01 17:57:43 -04:00
themias
2699c3f41e Fix food slicing showing utensil popup (#37105)
Fix knife slicing showing utensil popup
2025-05-01 17:56:47 -04:00
PJBot
57138f7bd2 Automatic changelog update 2025-05-01 18:17:59 +00:00
MissKay1994
d21906c025 Vox now can eat trash other other inedible things (#35681)
* EAT TRASH EXHALE AMMONIA

Update to files

* Forgot to port this file

* 1D4 Guidance

* Summary (required)

Suggested changes and fixes

* Cries in conflicts

* Why do we exist? To suffer?

* 1 citation for being stupid

* THE ANTIDOTE, THE ANTIDOTE FOR THE POISON

* I was inverted sir

* vox organs cleanup

* vox reagents

* guidebook

* weh

---------

Co-authored-by: Errant <35878406+Errant-4@users.noreply.github.com>
2025-05-01 20:16:51 +02:00
Ertanic
81507b9d52 Localizable craftmenu (#32339)
* Now the name of the target craft items is taken directly from the prototypes

* Deleting unnecessary fields

* Deleting unnecessary fields

* Added suffix field

* Added override via localization keys

* My favorite ItemList and TextureRect have been replaced with ListContainer and EntityPrototypeView

* Fix suffix

* Fix construction ghosts... maybe

* Remove suffix from UI

* Suffixes have been removed from prototypes

* Added a description for the secret door

* Fix search..?

* The Icon field of ConstructionPrototype has been removed

* StackPrototypes used in the construction menu have been localized

* TagConstructionGraphStep used in the construction menu have been localized

* The search bar has been localized

* Fix localization and prototypes

* Recipes are now only loaded when the crafting window is opened.

* Fix crooked merge grid of the crafting menu.

* Localization update

* Fix cyborg graph

* Revert "Recipes are now only loaded when the crafting window is opened."

This reverts commit 97749483542c2d6272bda16edf49612c69a0761a.

* Fix loc

* fix merge

* Fix upstream

* Some of the logic has been moved to Shared

* fix

* Small adjustments

* Very small change

---------

Co-authored-by: EmoGarbage404 <retron404@gmail.com>
2025-05-01 10:21:16 -04:00
lzk
8d01f90ad2 cleanup revolvers.yml (#37095) 2025-05-01 13:49:24 +02:00
lzk
181bf4073d cleanup snipers.yml (#37094) 2025-05-01 13:26:59 +02:00
PJBot
cf96f58880 Automatic changelog update 2025-05-01 05:36:20 +00:00
imatsoup
d0b1a15309 Fixes battery weapons changing firemode on wield (#37085)
Credit to Happyrobot33 for the implementation

Co-authored-by: Matthew Herber <32679887+happyrobot33@users.noreply.github.com>
2025-04-30 22:35:13 -07:00
Nemanja
55ef51a84b Fix listcontainer constantly disposing children (#37089) 2025-05-01 15:32:37 +10:00
PJBot
c1ebbb0789 Automatic changelog update 2025-05-01 05:22:04 +00:00
Samuka-C
d925b6f7d2 Make universal access config better (#37079)
* add a universal ID card to the universal access config

* make the admin access config have infinite range

* now checks for the BypassInteractionRange Tag instead

* Add suggested fix to the AccessOverrider system

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* remove other stuff I added

* another suggested change to avoid weird behaviour where you can use it from a distance

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
2025-05-01 01:20:56 -04:00
PJBot
b8e65d56b1 Automatic changelog update 2025-05-01 00:12:44 +00:00
metalgearsloth
f9aecda933 Fix action ent prediction (#37076)
Buttons don't get created in the predicted methods only on state handler.
2025-05-01 10:11:35 +10:00
PJBot
309521f60d Automatic changelog update 2025-04-30 19:57:35 +00:00
themias
ef10e4eb1c Skeletons leave glove fiber evidence (#37077)
Fix skeleton forensics
2025-04-30 15:56:28 -04:00
PJBot
103225f554 Automatic changelog update 2025-04-30 15:52:30 +00:00
themias
8cd20af6bd Fix turnstile collision with firelocks (#37074) 2025-04-30 11:51:23 -04:00
PJBot
179e16db8b Automatic changelog update 2025-04-30 14:50:43 +00:00
LaCumbiaDelCoronavirus
c96a5ad990 add new salv ruin: telesci (#36653) 2025-04-30 07:49:36 -07:00
TytosB
a0e0072bd1 new salv ruins (#36947) 2025-04-30 07:40:45 -07:00
metalgearsloth
4325247311 Update submodule to 255.1.0 (#37071) 2025-05-01 00:20:59 +10:00
PJBot
20465d4ca9 Automatic changelog update 2025-04-30 14:12:01 +00:00
slarticodefast
b068b5bb89 Minor ReflectionSystem refactor (#37039)
* ReflectComponentLogicFix

Added bool InRightPlace and updated relevant system

* Using SlotFlags

* edits

* refactor

* add missing relay

---------

Co-authored-by: BIGZi0348 <svalker0348@gmail.com>
2025-05-01 00:10:54 +10:00
Milon
a8ff999b08 add StationTrackerComponent (#36803)
* maybe I am cooking

* logmissing

* copy paste oops

* add some stuff

* review

* fix

* rerun tests

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
2025-05-01 00:07:25 +10:00
metalgearsloth
feffbea9f9 Fix examine prediction (#36999)
If our current ID is different to the received one we should just discard it even if it's for the same entity.

Note that this doesn't quite fix my prediction issue as client and server are using slightly different timings for the event.
2025-04-30 17:49:36 +10:00
Gentleman-Bird
2ff8a45b58 fix so that the meat patty uses the meat patty sprite on custom burgers (#37064) 2025-04-30 00:13:20 -07:00
IProduceWidgets
ebb1f92027 feex oasis portal (#37058) 2025-04-29 19:55:45 -07:00
PJBot
1b5547fbb9 Automatic changelog update 2025-04-30 00:52:48 +00:00
Nemanja
e3c3f4898f Fix NPCs stalling when too many exist (#37056)
Fix NPC stalling when too many exist
2025-04-30 10:51:41 +10:00
slarticodefast
97d4e80685 merge stable into master (#37055) 2025-04-30 02:42:06 +02:00
PJBot
0ee4babc55 Automatic changelog update 2025-04-30 00:41:34 +00:00
K-Dynamic
f399126c66 Centcomm carapace, moved armour from vests.yml to armor.yml (#35301)
* centcomm carapace, loadout for CC official, move armoured vests from vests.yml to armor.yml

* revert rename from previous commit; command carapace returned to captain's carapace

* meta.json 4 space

* restored deleted comments for some armours and original description for slim armour

* Add recently added elite web vest

---------

Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
2025-04-29 20:40:27 -04:00
PJBot
504dd63200 Automatic changelog update 2025-04-30 00:35:27 +00:00
Pieter-Jan Briers
10796df6bc Un-copypaste wallmount substation prototype to give them a UI (#37047)
*sigh*
2025-04-29 20:34:20 -04:00
PJBot
aaf3db8f9d Automatic changelog update 2025-04-29 22:56:54 +00:00
ScarKy0
a00b7b753c Mail visual update (#37049) 2025-04-29 15:55:47 -07:00
PJBot
f69a856da0 Automatic changelog update 2025-04-29 22:18:39 +00:00
themias
f59b878ce5 Add toolbox sound effects (#37048) 2025-04-29 15:17:32 -07:00
Myra
c96af2808f Added warning when attempting to run RUN_THIS on a zip repo download (Attempt 2) (#36922)
* Added warning when attempting to run RUN_THIS on a zip repo download

* Fix it actually

* Update git_helper.py
2025-04-29 23:51:21 +02:00
PJBot
3f17e7171b Automatic changelog update 2025-04-29 21:45:57 +00:00
Whatstone
afc55d6573 Show other speso colours, add larger denominations (Frontier#1496) (#37030) 2025-04-29 14:44:47 -07:00
Myra
87d097bb5d Stable merge (#37050) 2025-04-29 21:54:43 +01:00
SlamBamActionman
e366230458 Add inhand sprites for mini jetpack (#37041)
* Inhand sprites for mini jetpack

* Attribution
2025-04-29 19:43:09 +02:00
PJBot
0c4713da7f Automatic changelog update 2025-04-29 16:37:59 +00:00
Boaz1111
3f1ba3b6e7 Added Space Carp Tooth Arrows and Sharkminnow Spears, buffs sharkminnow teeth. (#31257)
* carp arrow, sharkminnow tooth spear

* review

---------

Co-authored-by: EmoGarbage404 <retron404@gmail.com>
2025-04-29 12:36:53 -04:00
PJBot
3ce8e62157 Automatic changelog update 2025-04-29 13:33:25 +00:00
SlamBamActionman
aa29712a65 Fix clientsided alerts being overwritten by server (#37033)
Initial commit
2025-04-29 09:32:18 -04:00
pathetic meowmeow
74a8bb9509 Fix solution visualization after drawing with a whitelist (#36657) 2025-04-29 09:18:07 -04:00
PJBot
5ef74728c9 Automatic changelog update 2025-04-29 13:09:05 +00:00
Thinbug
ce080276db Push horn (#36009)
* Empty commit

* epic super duper cool fr push horn draft

* whoops turns out theres a system that does that thingi already x.x

* bunch of like fixis and generalization

* general progress

* most stuffies done

* last thingi hopefully

* small fixies, mostly preventing bypassing the delay by spamming

* rename to fit better

* rename for real i forgor to add

* weird fixie but last commit didn workie

* oki shold be fine now

* lastish cleanup

* fixies

* missed a space

* removed unnecessary component check

* getting the typos out of the way first

* moved the component to shared

* rest of fixies
2025-04-29 09:07:57 -04:00
kosticia
9e9726f81b Add borders to the asteroid sand (#35397)
* tiles

* Fix

* borderless

* Astrosand

* Add tile

* Fix
2025-04-29 08:58:39 -04:00
PJBot
db008825e6 Automatic changelog update 2025-04-29 10:26:03 +00:00
abadaba695
8245474fdc Chem master more unit transfer buttons (#36995)
* Changes chem master unit transfers to be the same as the chem dispenser

* adds chem master transfer buttons for 15u, 20u, and 30u
2025-04-29 12:24:56 +02:00
PJBot
ad63aef2b2 Automatic changelog update 2025-04-29 10:02:04 +00:00
TytosB
53c3153645 re-buffs proto kinetic accelerator (#37012)
* new ruins

* genpop

* nvm

* abc

* fuckin

* turnstyle

* ruins

* stamp

* abc

* bruh

* efg

* pka fixed

* range tweak
2025-04-29 12:00:55 +02:00
PJBot
5afd520773 Automatic changelog update 2025-04-29 09:05:14 +00:00
IProduceWidgets
23d835b4b6 oasis genpop (#37031) 2025-04-29 02:04:07 -07:00
Princess Cheeseballs
aeed6b3954 More Mail Sprites (#37023)
* Commit

* Sprite update

* Last push for real for real

* Final Commit for real for real for real
2025-04-29 01:27:14 -04:00
PJBot
31e0fedb61 Automatic changelog update 2025-04-29 05:25:40 +00:00
lzk
207d513666 SSD sleep take 2 (#34039)
* ssd sleep part 2

* forgot this

* apply review

* yeah

* add onmapinit

* cache cvar values

---------

Co-authored-by: EmoGarbage404 <retron404@gmail.com>
2025-04-29 01:24:33 -04:00
PJBot
e21944d083 Automatic changelog update 2025-04-29 04:46:17 +00:00
drakewill-CRL
294a5a1b69 Display obvious plant mutations in examine text (#32650)
* Effect mutations now display on examine

* ChangeSpecies shouldn't stay on the list after running. Name cleanup

* EmoGarbage Review - convert description to LocId and add minor logic fix

* fix the dastardly yaml

---------

Co-authored-by: PraxisMapper <praxismapper@gmail.com>
Co-authored-by: EmoGarbage404 <retron404@gmail.com>
2025-04-29 00:45:10 -04:00
PJBot
9a3e70ca13 Automatic changelog update 2025-04-29 03:38:45 +00:00
Nemanja
f75811b4cb Rebalance magnet debris, update worldgen (#37025) 2025-04-28 20:37:39 -07:00
PJBot
ef49416540 Automatic changelog update 2025-04-29 03:14:08 +00:00
Stomf
a94d4a0991 Buffing slugs and replacing beanbags from the Bulldog bundle (#33517)
Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
2025-04-28 20:13:01 -07:00
Kirus59
8c38aa3742 BatteryWeaponPowerCell tweaks (#33500)
* BatteryWeaponPowerCell tweaks

* add update ammo ev & shuttle guns tweaks

* MilonPL requested changes

* revert changes in OnPowerCellChanged

* Add events to get charge info & change current charge

---------

Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
2025-04-28 21:12:25 -04:00
PJBot
a8054c37b1 Automatic changelog update 2025-04-29 00:27:29 +00:00
themias
b33f1db432 Theatre access to Service Request Computer (#37003) 2025-04-29 02:26:23 +02:00
PJBot
9154fbf7fe Automatic changelog update 2025-04-29 00:25:19 +00:00
Victor Shen
4671382419 Remove Contact Slowdown when Weightless or in the Air (#33299)
* removed contact slowdowns from entities that are weightless or in the air

* fixed kudzu not applying contact slowdown to airbone entities

* revert kudzu fix

* reimplemented kudzu fix with bool datafield

* update variable serialization format

Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com>

* empty commit

* cleaned up and added documentation

* cached airborne check

* rerun tests

* minor review

---------

Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com>
Co-authored-by: Milon <milonpl.git@proton.me>
2025-04-28 20:24:12 -04:00
PJBot
f7a8a1779e Automatic changelog update 2025-04-28 23:44:46 +00:00
themias
bd08c71189 Fix t-ray scanner exception spam (#37018) 2025-04-28 19:43:39 -04:00
Partmedia
956652e111 Disown atmos and botany (#37017)
* Disown atmos and botany

* Update .github/CODEOWNERS

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
2025-04-29 00:21:53 +02:00
Samuka-C
02b5592d69 Xenoborgs part 2 (#36844)
* add lawsets for the xenoborgs and mothership core

* add xenoborg names

* add xenoborg radio

* add xenoborg device frequency

* add xenoborg access

* add xenoborg contraband

* Update Resources/Locale/en-US/station-laws/laws.ftl

Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com>

* add xenoborg access to the universal Id card and universal access config

* remove 6th law of xenoborg and mothership lawset (got jointed into the 5th law)

* added xenoborg and mothership law boards

* add more names

* add Xenoborg faction

* moved all lawboards into a separate yml file

* removed custom xenoborg contraband severity

* add Xenoborg and Mothership components

* add xenoborg laser guns

* add self recharging fire extinguisher

* add mothership pinpointer

* add material bag

* add infinite jetpack

* add a only blue energy dagger

* add xenoborg jammer

* add refueling welding tool

* add nocturine hypo

* add nuclear small power cell

* add cloaking device

* add xenoborg door remote

* add custom sprites for xenoborg modules

* add custom sprites for xenoborg module actions

* removed Xenoborg Comp until is actually needed

* add xenoborg module tags

* spelling

* add xenoborg module bases

* organazied xenoborg modules sprites better

* add generic xenoborg modules

* add heavy xenoborg modules

* add engi xenoborg modules

* small fix to meta file in actions_borg.rsi

* renamed mothership comp to XenoborgMothership

* fixed the base for the xenoborg engi modules

* add scout xenoborg modules

* add stealth xenoborg modules

* localization for names and descriptions of the xenoborg modules

* fixed issues related to the XenoborgMothership component

* revert localization (it wasn't working for some reason)

* fixes

* fixed issue with container slot in the cloaking device

* Update description of small capacity nuclear power cell

Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>

* Fix indentation in material bag

Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>

* Spelling

Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>

* fix parameter order in some prototypes

* rename proto id InfiniteJetpack to JetpackXenoborg

* localize pinpointer targets

* Revert "localize pinpointer targets"

doesn't work

* added lines in the end of files (and in the middle of one)

* reorder paramenter in some entities

* fixed some descriptions

* minor fixes

---------

Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com>
Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
2025-04-28 18:10:35 -04:00
PJBot
46b030df45 Automatic changelog update 2025-04-28 21:17:21 +00:00
ScarKy0
9d8cc64d48 Fix mail cutting thinking your arms are infinite length (#37019)
* init

* hand
2025-04-28 17:16:14 -04:00
PJBot
75a90152a7 Automatic changelog update 2025-04-28 21:01:17 +00:00
KingFroozy
3d0485fe5b Shoulder-length hairstyles resprite (#37000)
* sprite

* final

* final (final fr)
2025-04-28 17:00:10 -04:00
PJBot
b3ea8ee031 Automatic changelog update 2025-04-28 19:23:15 +00:00
lzk
4171c4e6d5 make scrubber widenet in panic mode (#37013) 2025-04-28 21:22:05 +02:00
slarticodefast
c6bdce3b0c merge staging into master (#37009) 2025-04-28 20:14:39 +02:00
Pieter-Jan Briers
b629cbac3e Clear MIDI masters properly to avoid replay freezes (#36809)
While trying to play a replay I noticed that the replay would freeze
when seeking in some cases. After some debugging, I discovered that two
MIDI renderers had each other as master, which caused an infinite loop
processing MIDI events.

I'm not entirely sure of the sequence of events that leads to this
during replay playback, but I did notice that MIDI render masters are
never set to null. This is in the best case just a memory leak, in the
worst case probably the source of the bug, so... I fixed that.
2025-04-28 19:51:41 +02:00
Kyle Tyo
88eda89faa MapManager warning cleanup on tests (#36940)
lets see if this works.
2025-04-28 12:52:25 +02:00
ScarKy0
14ddd8b4cd Merge hotfix into master (#37001) 2025-04-28 11:47:56 +02:00
PJBot
973ad71f5c Automatic changelog update 2025-04-28 06:57:46 +00:00
Southbridge
2e8291cecb Amber Station - Added Genpop (#36997) 2025-04-27 23:56:39 -07:00
IProduceWidgets
0043bde402 Add some salvage ruins (#36814)
Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
2025-04-27 22:33:40 -07:00
PJBot
ff69325652 Automatic changelog update 2025-04-28 02:41:28 +00:00
KingFroozy
a42fb658fd Mime suit resprite (#36702) 2025-04-27 19:40:21 -07:00
PJBot
03894048e9 Automatic changelog update 2025-04-28 01:01:56 +00:00
lzk
875ccb94c6 nuke shelves' whitelists (#36986) 2025-04-27 18:00:46 -07:00
Bokser815
f6b3ba79d3 Temporarily Making Cargo Buy and Sell Pallets Indestructible (#34195)
Co-authored-by: EmoGarbage404 <retron404@gmail.com>
2025-04-27 17:59:54 -07:00
PJBot
106bee52b0 Automatic changelog update 2025-04-27 23:05:47 +00:00
ScarKy0
13a1853168 Fragile Deliveries (#36980)
* epic

* tweaks
2025-04-28 01:04:39 +02:00
PJBot
fac4bcd9b2 Automatic changelog update 2025-04-27 20:16:23 +00:00
ArtisticRoomba
85f0760b1b Add a mapping changelog to upstream (#34848) 2025-04-27 13:15:17 -07:00
PJBot
536106a666 Automatic changelog update 2025-04-27 15:12:19 +00:00
Fildrance
4690e62575 Feature/auto sync node scanner (#36635)
* feat: node scanner now auto-updates artifact details if in range

* refactor: minor cleanup

* refactor: optimization for update and query of range checking

* refactor: fix xml-doc

---------

Co-authored-by: pa.pecherskij <pa.pecherskij@interfax.ru>
2025-04-27 11:11:13 -04:00
PJBot
b17e558046 Automatic changelog update 2025-04-27 14:48:24 +00:00
metalgearsloth
f29b38c44b Use RMC mob collision values (#36851)
Use RMC movement values

General feedback was it's too slow to push through people but this still prevents stacking so.
2025-04-28 00:47:18 +10:00
PJBot
0da897947f Automatic changelog update 2025-04-27 11:09:42 +00:00
Pieter-Jan Briers
ffe130b38d Battery (SMES/substation) interface (#36386)
* Add ENERGYWATTHOURS() loc function

Takes in joules (energy), displays as watt-hours.

* Add simple OnOffButton control

* Re-add Inset style class

This was sloppily removed at some point?? Whatever, I need it.

* Add helper functions for setting title/guidebook IDs on FancyWindow

Reagent dispenser uses these, more in the next commits.

* Add BuiPredictionState helper

This enables me to implement coarse prediction manually in the battery UI.

Basically it's a local buffer of predicted inputs that can easily be replayed against future BUI states from the server.

* Add input coalescing infrastructure

I ran into the following problem: Robust's Slider control absolutely *spams* input events, to such a degree that it actually causes issues for the networking layer if directly passed through. For something like a slider, we just need to send the most recent value.

There is no good way for us to handle this in the control itself, as it *really* needs to happen in PreEngine. For simplicity reasons (for BUIs) I came to the conclusion it's best if it's there, as it's *before* any new states from the server can be applied. We can't just do this in Update() or something on the control as the timing just doesn't line up.

I made a content system, BuiPreTickUpdateSystem, that runs in the ModRunLevel.PreEngine phase to achieve this. It runs a method on a new IBuiPreTickUpdate interface on all open BUIs. They can then implement their own coalescing logic.

In the simplest case, this coalescing logic can just be "save the last value, and if we have any new value since the last update, send an input event." This is what the new InputCoalescer<T> type is for.

Adding new coalescing logic should be possible in the future, of course. It's all just small helpers.

* Battery interface

This adds a proper interface to batteries (SMES/substation). Players can turn IO on and off, and they can change charge and discharge rate. There's also a ton of numbers and stuff. It looks great.

This actually enables charge and discharge rates to be changed for these devices. The settings for both have been set between 5kW and 150kW.

* Oops, forgot to remove these style class defs.
2025-04-27 21:08:34 +10:00
KingFroozy
791f7af5d4 Paramedic suits adjustments (#36707)
* Changes

* meta
2025-04-27 12:27:01 +02:00
PJBot
f512c7bf91 Automatic changelog update 2025-04-27 09:15:01 +00:00
ScarKy0
2a5cf10aa6 Priority Deliveries (#36968) 2025-04-27 02:13:52 -07:00
Nemanja
497f43ec65 Remove legacy cargo shuttle code/prototypes (#36967) 2025-04-27 12:06:45 +10:00
github-actions[bot]
71e58834ff Update Credits (#36966)
Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com>
2025-04-26 20:34:39 -04:00
PJBot
2f2685cb2c Automatic changelog update 2025-04-26 23:46:17 +00:00
UpAndLeaves
9fc6de35df New Science Biosuit Locker Sprite (#36929)
* first commit, slightly broken

* fixed meta json

* reverse accidental cmo inclusion
2025-04-26 19:45:10 -04:00
PJBot
34e67f71ba Automatic changelog update 2025-04-26 23:37:08 +00:00
Tiniest Shark
bb9c6dbe9d Ammo Mag + Speedloader Inhand Sprites (#34235)
* Added inhand visuals to (most) ammo magazines and speedloaders

* whoops mixed up a single inhand on the rifle mag

* Didn't realize rubber ammo got removed.

* added attributions

* adjusted inhand visuals to account for magazine types

* missed one :eye:👁️

---------

Co-authored-by: EmoGarbage404 <retron404@gmail.com>
2025-04-26 19:36:01 -04:00
PJBot
021bd04b65 Automatic changelog update 2025-04-26 23:25:32 +00:00
Centronias
90582f27ee Adds Parcel Wrap (#34471)
* Parcel Wrap

* fix TG sprite licenses
update attribution on modified `unwrapped` sprite to better conform to CC's guidance

* ContainerContainer test failure fix

* Just easy changes for now.

* Imagine building your code before pushing it for review

* The rest of the PR comments

* PR comments

* more comments + cargo orderability

* whitespace: deduplicated.

* use limitedcharges
replace mostly-duped client/server with if(onserver)

* cabinet perspective sprites

* web edit detected

fite me

* @ps3moira 's new sprites for me :)

* add a touch of attribution

* EmoGarbage Review

* Merge with master

* Merge with master

---------

Co-authored-by: EmoGarbage404 <retron404@gmail.com>
2025-04-26 19:24:25 -04:00
PJBot
fd24e4bc5b Automatic changelog update 2025-04-26 21:50:07 +00:00
UpAndLeaves
dafb99258e CMO Hardsuit: Zombification Resistance tweak (#36957)
initial commit
2025-04-26 14:49:00 -07:00
Nox
2378b9ad68 Descriptions for .30 Rifle (#36958)
Initial commit
2025-04-26 14:48:40 -07:00
PJBot
d26fbbb6e7 Automatic changelog update 2025-04-26 21:47:00 +00:00
pathetic meowmeow
b7d020570f Truncate lathe announcement lists (#36945) 2025-04-26 17:45:53 -04:00
PJBot
f74b1c35bb Automatic changelog update 2025-04-26 21:43:34 +00:00
ScarKy0
f0472b2173 Delivery random multipliers (#36918)
* init

* review

* init

* teehee
2025-04-26 17:42:27 -04:00
Kyle Tyo
8f35bc76c2 Resolve a warning in SharedAnomalySystem and quell some linter whining. (#36939)
* resolve a warning and deal with some linter whining.

* Update Content.Shared/Anomaly/SharedAnomalySystem.cs

---------

Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
2025-04-26 17:40:44 -04:00
PJBot
b1a846a6e9 Automatic changelog update 2025-04-26 21:07:41 +00:00
qrwas
6d935ced3a Only sec glasses can show contraband: second attempt (#36412)
* Add base code for cheking contraband in hud

* Fix missing using in InventorySystem.Relay

* Fix errors and update HUD yml

* Add show contraband with component on entity

* fix component description

* Update Content.Shared/Contraband/ShowContrabandDetailsComponent.cs

Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>

* Update "if" for check if ent hasComp in contrabandSystem

* Remove << InventorySystem.Relay.cs

* Update Content.Shared/Contraband/ShowContrabandDetailsComponent.cs

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Update Content.Shared/CCVar/CCVars.Game.cs

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Fix partial class ShowContrabandSystem

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Update Content.Shared/Contraband/ShowContrabandDetailsComponent.cs

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Update Content.Shared/Inventory/InventorySystem.Relay.cs

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>

* Some update ShowContrabandSystem

* Try with record struct

* back again ti default class with EntityEventArgs

* Remove EntityEventArgs

* Finally use record struct

---------

Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
2025-04-26 17:06:34 -04:00
PJBot
76676014a6 Automatic changelog update 2025-04-26 20:57:25 +00:00
beck-thompson
65ff527f13 Fix inflatable barriers finishing instantly if canceled! (#36937)
Fix
2025-04-26 16:56:18 -04:00
metalgearsloth
d2caa5eae0 Fix autorecharge (#36955) 2025-04-26 16:54:06 -04:00
PJBot
0fbed2c95a Automatic changelog update 2025-04-26 20:46:15 +00:00
RedBookcase
b0dedb9770 Changed the storage sizes of different swords. (#36564)
Co-authored-by: RedBookcase <Usualmoves@gmail.com>
2025-04-26 13:45:08 -07:00
TakoDragon
2bd8455ff7 The Atmos A Airlock (#36376)
* airlocks

* Update meta.json

Added my modification in the meta
2025-04-26 21:26:23 +02:00
PJBot
0503287230 Automatic changelog update 2025-04-26 13:37:58 +00:00
SyaoranFox
7a256bac84 Changed soundGunshot for Pulse Pistol and Pulse Carbine from laser_cannon to laser3 (#36952) 2025-04-26 15:36:50 +02:00
Pieter-Jan Briers
e7be57d85f Clear MIDI masters properly to avoid replay freezes (#36809)
While trying to play a replay I noticed that the replay would freeze
when seeking in some cases. After some debugging, I discovered that two
MIDI renderers had each other as master, which caused an infinite loop
processing MIDI events.

I'm not entirely sure of the sequence of events that leads to this
during replay playback, but I did notice that MIDI render masters are
never set to null. This is in the best case just a memory leak, in the
worst case probably the source of the bug, so... I fixed that.
2025-04-26 16:42:16 +10:00
TytosB
f4322c5bb7 loop turnstyle fix hopefully (#36946) 2025-04-25 22:08:23 -07:00
PJBot
3a3a8b038a Automatic changelog update 2025-04-26 03:24:00 +00:00
OnyxTheBrave
5f2fb8dc82 Sheet-meister 2000 Cloth recipe (#32676)
* Sheet-meister 2000 can now make rolls of cloth

* Small Cleanup

* resolve conflicts

---------

Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
2025-04-26 05:22:51 +02:00
TGRCDev
79ae7e7abe Fixed stinger grenade lag spikes (#36641)
* Fixed stinger lag spikes

* Simplify nullable checks

* More cleanup of projectile grenades

* Remove null default from ShootProjectile
2025-04-26 04:12:18 +02:00
PJBot
bd51fd76d7 Automatic changelog update 2025-04-26 01:55:29 +00:00
Booblesnoot42
0638147aa9 hide light-switches from build menu (#34664) 2025-04-26 03:54:23 +02:00
Wolfkey-SomeoneElseTookMyUsername
0dd9ffe8bf Add Cotton Burgers (#36405)
* Adds cotton burgers

* Rephrased copyright

* Added an extra comment

* Adds CottonBurger to tags.yml, Not sure if i am supposed to do this or not.

* Reordered Cotton bun YAML, and fixed overwritten tags

* Merge issue fix?

* Add experiment plushie and remove rubber chicken from cotton burgers

* Minor comment change

---------

Co-authored-by: beck-thompson <beck314159@hotmail.com>
2025-04-25 18:54:14 -07:00
kaiserbirch
8812237108 Land mine armament (#33883)
* Land Mine is now armable, it will not explode unless armed.

* Land Mine is now armable, it will not explode unless armed.

* Explicitly have Armed as false

* SharedLandMineSystem.cs adds the "Arm"-verb in "Content.Shared" with the Arming logic being implemented in "Content.Server"

* Land Mines now blink only when armed.

* Added prediction components, moved logic to SharedLandMineSystem.cs and inherit it in client content.

* Accessing the datafield directly instead of using methods

* Mines are now armed by default with a unarmed prototype

* Land mine now shows if it is armed when examined and in range.

* Landmine is unarmed by default with an armed variant for mapping purposes.

* Removed properties that were already defined by inheritance.

* Access the bool directly from the component

* Add booleans to change if the Arm-verb is showed and if examining the mine shows the status.

* Added status message for unarmed mine, removed using PushGroup since only one string is displayed.

* Added properties to the explosive floor sign to ensure that it is armed, not showing neither status nor arm-verb.

* The prototypes work now as before with added unarmed versions. Sprite is now only one toggable layer.

* Make the craftable land mine unarmed.

* Refactored the arming mechanic into own component and system.

* Reverted the explosive wet floor sign to previous prototype and added the Armable component and ItemToggle to the landmines.

* Moved the examination strings from land-mines.ftl to armable.ftl.

* Removed unused property.

* Formatting and fixing imports

* Added prefixes to the ftl naming. Moved LocId from system to component

* Added documentation. Moved check for armable to HandleStepTriggerAttempt.
Moved the LocId to component.

* Removed the TryArming method. Added documentation.

* Removed unnecessary TryComp

* Simplified the logic for the trigger attempt

* HasComp instead of TryComp on logic

* EmoGarbage Review

---------

Co-authored-by: Franz - Josef Björck <kaiserbirch@proton.me>
Co-authored-by: EmoGarbage404 <retron404@gmail.com>
2025-04-25 16:53:50 -04:00
Kyle Tyo
b2f1f7c5ad Remove a redundant trycomp from TileAnomalySystem (#36924)
* remove a redundant check

* revert this space.
2025-04-25 15:32:23 -04:00
PJBot
5fa59ea213 Automatic changelog update 2025-04-25 18:19:31 +00:00
Nemanja
f900d9f8b2 PKA Modkits + Rebalance (#31247) 2025-04-25 11:18:23 -07:00
TytosB
9430a0f835 loop genpop (#36912)
* new ruins

* genpop

* nvm

* abc

* fuckin
2025-04-25 08:38:39 -07:00
PJBot
70ae0bbc28 Automatic changelog update 2025-04-25 15:34:21 +00:00
Kiri1674
a6905f2101 Make 10u of "Atomic Bomb" drink instead of 11u (#36921)
changed atomic bomb recipe
2025-04-25 08:33:14 -07:00
PJBot
e68d0243d9 Automatic changelog update 2025-04-25 15:08:57 +00:00
Radezolid
86a20dfdea Fix donuts tags breaking the bounty (#36903) 2025-04-25 08:07:50 -07:00
Deerstop
6bde7fdaa2 Elkridge - Genpop (#36914) 2025-04-25 08:05:25 -07:00
Spessmann
22bd884c19 Fix random maints room deleting whatever was already there (#36605) 2025-04-25 08:04:18 -07:00
PJBot
f2036aae3a Automatic changelog update 2025-04-25 10:31:46 +00:00
chromiumboy
65f50b55b6 Fix for ghosts being unable to follow the AI when it uses a holopad (#36355)
* Initial commit

* Added to-do
2025-04-25 12:30:39 +02:00
lzk
25f016e806 fix changelog (#36915) 2025-04-25 01:51:05 -07:00
PJBot
c21ef2108a Automatic changelog update 2025-04-25 07:22:06 +00:00
chromiumboy
ed5c7aa942 Releasing an under-pressure lockout is now a verb (#36910)
Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
2025-04-25 00:21:00 -07:00
kosticia
010435fdb3 [FIX] Rubber now uneatable (#34543) 2025-04-25 00:20:09 -07:00
PJBot
a1468e7fbb Automatic changelog update 2025-04-25 06:04:10 +00:00
Alzore
dae811746a Inaprovaline metabolizes slower for better use as a stabilizing medicine (#32293) 2025-04-24 23:03:03 -07:00
PJBot
374ebfb621 Automatic changelog update 2025-04-25 05:55:56 +00:00
lzk
2eeef256e5 cleanup instruments yml (#32262)
Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
2025-04-24 22:54:49 -07:00
PJBot
2570473c67 Automatic changelog update 2025-04-25 04:53:27 +00:00
ScarKy0
4c7ad1e2f9 Lower interdyne herbals TC cost (#36841) 2025-04-24 21:52:20 -07:00
PJBot
e53f8b8ed6 Automatic changelog update 2025-04-25 04:50:41 +00:00
Kresny
3594f47c8d Controls page guidebook rework 2025 Q1 (#36363)
Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
2025-04-24 21:49:35 -07:00
PJBot
84053234a6 Automatic changelog update 2025-04-25 04:06:36 +00:00
Alzore
c8a02fd4cd Nerf mining hardsuit's effectiveness against bullets and bombs. (#31450) 2025-04-24 21:05:29 -07:00
PJBot
6cd8d1fba9 Automatic changelog update 2025-04-25 04:03:10 +00:00
Victor Shen
dab9bd69c6 Add Bloodstream to Goliaths (#33305) 2025-04-24 21:02:03 -07:00
PJBot
ba9ce72e62 Automatic changelog update 2025-04-25 03:54:22 +00:00
Smith
5bef44b296 Reptilians Can Eat Orange Creamsicles (#36890) 2025-04-24 20:53:13 -07:00
Spessmann
a22106f083 Convex genpop update (#36908) 2025-04-24 20:49:06 -07:00
PJBot
ee5a38d3e8 Automatic changelog update 2025-04-25 02:30:25 +00:00
Nox
a92ad620b2 Cyborg Rebalance (#34186)
Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
2025-04-24 19:29:16 -07:00
PJBot
5af9ab4e99 Automatic changelog update 2025-04-24 23:46:02 +00:00
SlamBamActionman
735bbf93a9 Change some posters to be rules-compliant (#32734)
* Initial commit

* Minor edit

* it's very hard to fit "disorder"

* Revert No ERP poster, fix spawner

* Attribution

* Update text

* Missed poster spawner

---------

Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
2025-04-24 19:44:54 -04:00
PJBot
42c344a5da Automatic changelog update 2025-04-24 23:43:35 +00:00
Preston Smith
f22160aa48 Correct IdentityBlocker to include specific outer clothing (#33085)
* Make IdentityBlocker include outerclothing

* Modify Correct Bit

* Fix mask/eye cobo
2025-04-24 19:42:27 -04:00
3330 changed files with 244128 additions and 118718 deletions

View File

@@ -1,17 +1,23 @@
## About the PR
<!-- What did you change in this PR? -->
<!-- Что вы изменили в своем пулл реквесте? -->
## Why / Balance
<!-- Why was it changed? Link any discussions or issues here. Please discuss how this would affect game balance. -->
<!-- Зачем нужно это изменение? Прикрепите любые обсуждения или проблемы здесь. Опишите, как это повлияет на текущий баланс игры. -->
## Media
<!--
PRs which make ingame changes (adding clothing, items, new features, etc) are required to have media attached that showcase the changes.
Small fixes/refactors are exempt.
-->
**Changelog**
<!-- Add a Changelog entry to make players aware of new features or changes that could affect gameplay.
Make sure to read the guidelines and take this Changelog template out of the comment block in order for it to show up.
Changelog must have a :cl: symbol, so the bot recognizes the changes and adds them to the game's changelog. -->
<!--
Пулл реквесты, которые несут за собой игровые изменения (добавления одежды, предметов и так далее) требуют чтобы вы прикрепили скриншоты или видеоролики, демонстрирующие эти изменения.
Небольшие исправления не считаются.
:cl:
- add: Added fun!
- remove: Removed fun!
- tweak: Changed fun!
- fix: Fixed fun!
-->

View File

@@ -1,4 +1,4 @@
name: Publish
name: Edge Publish
concurrency:
group: publish
@@ -10,6 +10,15 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Install Python dependencies
run: sudo apt-get install -y python3-paramiko python3-lxml
- name: Send POST-request
uses: appleboy/ssh-action@master
with:
@@ -18,3 +27,10 @@ jobs:
password: ${{ secrets.BUILD_PASS }}
port: 22
script: sh update.sh &> /dev/null
- name: Publish changelog (Discord)
continue-on-error: true
run: Tools/actions_changelogs_since_last_run.py
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DISCORD_WEBHOOK_URL: ${{ secrets.CHANGELOG_DISCORD_WEBHOOK }}

View File

@@ -0,0 +1,59 @@
name: Trailing Whitespace Check
on:
pull_request:
types: [ opened, reopened, synchronize, ready_for_review ]
jobs:
build:
name: Trailing Whitespace Check
if: github.event.pull_request.draft == false
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4.2.2
- name: Get changed text files
id: changed-files
uses: tj-actions/changed-files@v46.0.5
with:
files: |
**.cs
**.yml
**.swsl
**.json
**.py
- name: Check for trailing whitespace and EOF newline
env:
ALL_CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }}
run: |
has_trailing_whitespace=0
has_missing_eof_newline=0
for file in ${ALL_CHANGED_FILES}; do
# Ignore vanilla not CrystallEdge files
if [[ "$file" != *CP14* ]]; then
continue
fi
echo "Checking $file"
# Check for trailing whitespace
if grep -qP '[ \t]+$' "$file"; then
echo "::error file=$file::Trailing whitespace found"
has_trailing_whitespace=1
fi
# Check for missing EOF newline
if [ -f "$file" ] && [ -s "$file" ]; then
last_char=$(tail -c 1 "$file")
if [ "$last_char" != "" ] && [ "$last_char" != $'\n' ]; then
echo "::error file=$file::Missing newline at end of file"
has_missing_eof_newline=1
fi
fi
done
if [ "$has_trailing_whitespace" -eq 1 ] || [ "$has_missing_eof_newline" -eq 1 ]; then
echo "Issues found: trailing whitespace or missing EOF newline."
echo "We recommend using an IDE to prevent this from happening."
exit 1
fi

View File

@@ -2,6 +2,7 @@
concurrency:
group: publish-testing
cancel-in-progress: true
on:
workflow_dispatch:

View File

@@ -2,6 +2,7 @@ name: Publish
concurrency:
group: publish
cancel-in-progress: true
on:
workflow_dispatch:
@@ -48,12 +49,14 @@ jobs:
GITHUB_REPOSITORY: ${{ vars.GITHUB_REPOSITORY }}
- name: Publish changelog (Discord)
continue-on-error: true
run: Tools/actions_changelogs_since_last_run.py
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DISCORD_WEBHOOK_URL: ${{ secrets.CHANGELOG_DISCORD_WEBHOOK }}
- name: Publish changelog (RSS)
continue-on-error: true
run: Tools/actions_changelog_rss.py
env:
CHANGELOG_RSS_KEY: ${{ secrets.CHANGELOG_RSS_KEY }}

View File

@@ -5,6 +5,7 @@ import subprocess
import sys
import os
import shutil
import time
from pathlib import Path
from typing import List
@@ -104,7 +105,21 @@ def reset_solution():
with SOLUTION_PATH.open("w") as f:
f.write(content)
def check_for_zip_download():
# Check if .git exists,
cur_dir = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
if not os.path.isdir(os.path.join(cur_dir, ".git")):
print("It appears that you downloaded this repository directly from GitHub. (Using the .zip download option) \n"
"When downloading straight from GitHub, it leaves out important information that git needs to function. "
"Such as information to download the engine or even the ability to even be able to create contributions. \n"
"Please read and follow https://docs.spacestation14.com/en/general-development/setup/setting-up-a-development-environment.html \n"
"If you just want a Sandbox Server, you are following the wrong guide! You can download a premade server following the instructions here:"
"https://docs.spacestation14.com/en/general-development/setup/server-hosting-tutorial.html \n"
"Closing automatically in 30 seconds.")
time.sleep(30)
exit(1)
if __name__ == '__main__':
check_for_zip_download()
install_hooks()
update_submodules()

View File

@@ -29,7 +29,7 @@ namespace Content.Benchmarks;
[CategoriesColumn]
public class ComponentQueryBenchmark
{
public const string Map = "Maps/atlas.yml";
public const string Map = "Maps/saltern.yml";
private TestPair _pair = default!;
private IEntityManager _entMan = default!;

View File

@@ -1,15 +1,7 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using BenchmarkDotNet.Running;
using Content.IntegrationTests;
using Content.Server.Maps;
#if DEBUG
using BenchmarkDotNet.Configs;
#else
using Robust.Benchmarks.Configs;
#endif
using Robust.Shared.Prototypes;
namespace Content.Benchmarks
{
@@ -22,11 +14,15 @@ namespace Content.Benchmarks
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("\nWARNING: YOU ARE RUNNING A DEBUG BUILD, USE A RELEASE BUILD FOR AN ACCURATE BENCHMARK");
Console.WriteLine("THE DEBUG BUILD IS ONLY GOOD FOR FIXING A CRASHING BENCHMARK\n");
BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args, new DebugInProcessConfig());
var baseConfig = new DebugInProcessConfig();
#else
var config = Environment.GetEnvironmentVariable("ROBUST_BENCHMARKS_ENABLE_SQL") != null ? DefaultSQLConfig.Instance : null;
BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args, config);
var baseConfig = Environment.GetEnvironmentVariable("ROBUST_BENCHMARKS_ENABLE_SQL") != null
? DefaultSQLConfig.Instance
: DefaultConfig.Instance;
#endif
var config = ManualConfig.Create(baseConfig);
config.BuildTimeout = TimeSpan.FromMinutes(5);
BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args, config);
}
}
}

View File

@@ -0,0 +1,126 @@
#nullable enable
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using BenchmarkDotNet.Attributes;
using Content.IntegrationTests;
using Content.IntegrationTests.Pair;
using Robust.Shared;
using Robust.Shared.Analyzers;
using Robust.Shared.GameObjects;
namespace Content.Benchmarks;
[Virtual]
public class RaiseEventBenchmark
{
private TestPair _pair = default!;
private BenchSystem _sys = default!;
[GlobalSetup]
public void Setup()
{
ProgramShared.PathOffset = "../../../../";
PoolManager.Startup(typeof(BenchSystem).Assembly);
_pair = PoolManager.GetServerClient().GetAwaiter().GetResult();
var entMan = _pair.Server.EntMan;
_sys = entMan.System<BenchSystem>();
_pair.Server.WaitPost(() =>
{
var uid = entMan.Spawn();
_sys.Ent = new(uid, entMan.GetComponent<TransformComponent>(uid));
_sys.Ent2 = new(_sys.Ent.Owner, _sys.Ent.Comp);
})
.GetAwaiter()
.GetResult();
}
[GlobalCleanup]
public async Task Cleanup()
{
await _pair.DisposeAsync();
PoolManager.Shutdown();
}
[Benchmark(Baseline = true)]
public int RaiseEvent()
{
return _sys.RaiseEvent();
}
[Benchmark]
public int RaiseCompEvent()
{
return _sys.RaiseCompEvent();
}
[Benchmark]
public int RaiseICompEvent()
{
return _sys.RaiseICompEvent();
}
[Benchmark]
public int RaiseCSharpEvent()
{
return _sys.CSharpEvent();
}
public sealed class BenchSystem : EntitySystem
{
public Entity<TransformComponent> Ent;
public Entity<IComponent> Ent2;
public delegate void EntityEventHandler(EntityUid uid, TransformComponent comp, ref BenchEv ev);
public event EntityEventHandler? OnCSharpEvent;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<TransformComponent, BenchEv>(OnEvent);
OnCSharpEvent += OnEvent;
}
public int RaiseEvent()
{
var ev = new BenchEv();
RaiseLocalEvent(Ent.Owner, ref ev);
return ev.N;
}
public int RaiseCompEvent()
{
var ev = new BenchEv();
EntityManager.EventBus.RaiseComponentEvent(Ent.Owner, Ent.Comp, ref ev);
return ev.N;
}
public int RaiseICompEvent()
{
// Raise with an IComponent instead of concrete type
var ev = new BenchEv();
EntityManager.EventBus.RaiseComponentEvent(Ent2.Owner, Ent2.Comp, ref ev);
return ev.N;
}
public int CSharpEvent()
{
var ev = new BenchEv();
OnCSharpEvent?.Invoke(Ent.Owner, Ent.Comp, ref ev);
return ev.N;
}
[MethodImpl(MethodImplOptions.NoInlining)]
private void OnEvent(EntityUid uid, TransformComponent component, ref BenchEv args)
{
args.N += uid.Id;
}
[ByRefEvent]
public struct BenchEv
{
public int N;
}
}
}

View File

@@ -1,8 +1,10 @@
using Content.Shared.Access;
using Content.Shared.Access.Components;
using Content.Shared.Access.Systems;
using Content.Shared.CCVar;
using Content.Shared.Containers.ItemSlots;
using Content.Shared.CrewManifest;
using Robust.Shared.Configuration;
using Robust.Shared.Prototypes;
using static Content.Shared.Access.Components.IdCardConsoleComponent;
@@ -11,13 +13,21 @@ namespace Content.Client.Access.UI
public sealed class IdCardConsoleBoundUserInterface : BoundUserInterface
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly IConfigurationManager _cfgManager = default!;
private readonly SharedIdCardConsoleSystem _idCardConsoleSystem = default!;
private IdCardConsoleWindow? _window;
// CCVar.
private int _maxNameLength;
private int _maxIdJobLength;
public IdCardConsoleBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey)
{
_idCardConsoleSystem = EntMan.System<SharedIdCardConsoleSystem>();
_maxNameLength =_cfgManager.GetCVar(CCVars.MaxNameLength);
_maxIdJobLength = _cfgManager.GetCVar(CCVars.MaxIdJobLength);
}
protected override void Open()
@@ -66,11 +76,11 @@ namespace Content.Client.Access.UI
public void SubmitData(string newFullName, string newJobTitle, List<ProtoId<AccessLevelPrototype>> newAccessList, string newJobPrototype)
{
if (newFullName.Length > MaxFullNameLength)
newFullName = newFullName[..MaxFullNameLength];
if (newFullName.Length > _maxNameLength)
newFullName = newFullName[.._maxNameLength];
if (newJobTitle.Length > MaxJobTitleLength)
newJobTitle = newJobTitle[..MaxJobTitleLength];
if (newJobTitle.Length > _maxIdJobLength)
newJobTitle = newJobTitle[.._maxIdJobLength];
SendMessage(new WriteToTargetIdMessage(
newFullName,

View File

@@ -1,11 +1,13 @@
using System.Linq;
using Content.Shared.Access;
using Content.Shared.Access.Systems;
using Content.Shared.CCVar;
using Content.Shared.Roles;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Configuration;
using Robust.Shared.Prototypes;
using static Content.Shared.Access.Components.IdCardConsoleComponent;
@@ -14,12 +16,17 @@ namespace Content.Client.Access.UI
[GenerateTypedNameReferences]
public sealed partial class IdCardConsoleWindow : DefaultWindow
{
[Dependency] private readonly IConfigurationManager _cfgManager = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly ILogManager _logManager = default!;
private readonly ISawmill _logMill = default!;
private readonly IdCardConsoleBoundUserInterface _owner;
// CCVar.
private int _maxNameLength;
private int _maxIdJobLength;
private AccessLevelControl _accessButtons = new();
private readonly List<string> _jobPrototypeIds = new();
@@ -39,7 +46,11 @@ namespace Content.Client.Access.UI
_owner = owner;
_maxNameLength = _cfgManager.GetCVar(CCVars.MaxNameLength);
_maxIdJobLength = _cfgManager.GetCVar(CCVars.MaxIdJobLength);
FullNameLineEdit.OnTextEntered += _ => SubmitData();
FullNameLineEdit.IsValid = s => s.Length <= _maxNameLength;
FullNameLineEdit.OnTextChanged += _ =>
{
FullNameSaveButton.Disabled = FullNameSaveButton.Text == _lastFullName;
@@ -47,6 +58,7 @@ namespace Content.Client.Access.UI
FullNameSaveButton.OnPressed += _ => SubmitData();
JobTitleLineEdit.OnTextEntered += _ => SubmitData();
JobTitleLineEdit.IsValid = s => s.Length <= _maxIdJobLength;
JobTitleLineEdit.OnTextChanged += _ =>
{
JobTitleSaveButton.Disabled = JobTitleLineEdit.Text == _lastJobTitle;

View File

@@ -202,6 +202,7 @@ namespace Content.Client.Actions
return;
OnActionAdded?.Invoke(actionId);
ActionsUpdated?.Invoke();
}
protected override void ActionRemoved(EntityUid performer, EntityUid actionId, ActionsComponent comp, BaseActionComponent action)
@@ -210,6 +211,7 @@ namespace Content.Client.Actions
return;
OnActionRemoved?.Invoke(actionId);
ActionsUpdated?.Invoke();
}
public IEnumerable<(EntityUid Id, BaseActionComponent Comp)> GetClientActions()

View File

@@ -7,6 +7,8 @@ namespace Content.Client.Administration.Systems;
public sealed class KillSignSystem : EntitySystem
{
[Dependency] private readonly SpriteSystem _sprite = default!;
public override void Initialize()
{
SubscribeLocalEvent<KillSignComponent, ComponentStartup>(KillSignAdded);
@@ -18,10 +20,10 @@ public sealed class KillSignSystem : EntitySystem
if (!TryComp<SpriteComponent>(uid, out var sprite))
return;
if (!sprite.LayerMapTryGet(KillSignKey.Key, out var layer))
if (!_sprite.LayerMapTryGet((uid, sprite), KillSignKey.Key, out var layer, false))
return;
sprite.RemoveLayer(layer);
_sprite.RemoveLayer((uid, sprite), layer);
}
private void KillSignAdded(EntityUid uid, KillSignComponent component, ComponentStartup args)
@@ -29,15 +31,15 @@ public sealed class KillSignSystem : EntitySystem
if (!TryComp<SpriteComponent>(uid, out var sprite))
return;
if (sprite.LayerMapTryGet(KillSignKey.Key, out var _))
if (_sprite.LayerMapTryGet((uid, sprite), KillSignKey.Key, out var _, false))
return;
var adj = sprite.Bounds.Height / 2 + ((1.0f/32) * 6.0f);
var adj = _sprite.GetLocalBounds((uid, sprite)).Height / 2 + ((1.0f / 32) * 6.0f);
var layer = sprite.AddLayer(new SpriteSpecifier.Rsi(new ResPath("Objects/Misc/killsign.rsi"), "sign"));
sprite.LayerMapSet(KillSignKey.Key, layer);
var layer = _sprite.AddLayer((uid, sprite), new SpriteSpecifier.Rsi(new ResPath("Objects/Misc/killsign.rsi"), "sign"));
_sprite.LayerMapSet((uid, sprite), KillSignKey.Key, layer);
sprite.LayerSetOffset(layer, new Vector2(0.0f, adj));
_sprite.LayerSetOffset((uid, sprite), layer, new Vector2(0.0f, adj));
sprite.LayerSetShader(layer, "unshaded");
}

View File

@@ -19,10 +19,10 @@ namespace Content.Client.Administration.UI.SpawnExplosion;
public sealed partial class SpawnExplosionWindow : DefaultWindow
{
[Dependency] private readonly IClientConsoleHost _conHost = default!;
[Dependency] private readonly IMapManager _mapManager = default!;
[Dependency] private readonly IPlayerManager _playerManager = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly IEntityManager _entMan = default!;
private readonly SharedMapSystem _mapSystem;
private readonly SharedTransformSystem _transform = default!;
private readonly SpawnExplosionEui _eui;
@@ -38,6 +38,7 @@ public sealed partial class SpawnExplosionWindow : DefaultWindow
{
RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
_mapSystem = _entMan.System<SharedMapSystem>();
_transform = _entMan.System<TransformSystem>();
_eui = eui;
@@ -87,7 +88,7 @@ public sealed partial class SpawnExplosionWindow : DefaultWindow
{
_mapData.Clear();
MapOptions.Clear();
foreach (var map in _mapManager.GetAllMapIds())
foreach (var map in _mapSystem.GetAllMapIds())
{
_mapData.Add(map);
MapOptions.AddItem(map.ToString());

View File

@@ -14,6 +14,9 @@ namespace Content.Client.Administration.UI.Tabs.AdminbusTab
[UsedImplicitly]
public sealed partial class LoadBlueprintsWindow : DefaultWindow
{
[Dependency] private readonly IEntityManager _entityManager = default!;
[Dependency] private readonly IPlayerManager _playerManager = default!;
public LoadBlueprintsWindow()
{
RobustXamlLoader.Load(this);
@@ -21,9 +24,9 @@ namespace Content.Client.Administration.UI.Tabs.AdminbusTab
protected override void EnteredTree()
{
var mapManager = IoCManager.Resolve<IMapManager>();
var mapSystem = _entityManager.System<SharedMapSystem>();
foreach (var mapId in mapManager.GetAllMapIds())
foreach (var mapId in mapSystem.GetAllMapIds())
{
MapOptions.AddItem(mapId.ToString(), (int) mapId);
}
@@ -39,21 +42,19 @@ namespace Content.Client.Administration.UI.Tabs.AdminbusTab
private void Reset()
{
var entManager = IoCManager.Resolve<IEntityManager>();
var xformSystem = entManager.System<SharedTransformSystem>();
var playerManager = IoCManager.Resolve<IPlayerManager>();
var player = playerManager.LocalEntity;
var xformSystem = _entityManager.System<SharedTransformSystem>();
var player = _playerManager.LocalEntity;
var currentMap = MapId.Nullspace;
var position = Vector2.Zero;
var rotation = Angle.Zero;
if (entManager.TryGetComponent<TransformComponent>(player, out var xform))
if (_entityManager.TryGetComponent<TransformComponent>(player, out var xform))
{
currentMap = xform.MapID;
position = xformSystem.GetWorldPosition(xform);
if (entManager.TryGetComponent<TransformComponent>(xform.GridUid, out var gridXform))
if (_entityManager.TryGetComponent<TransformComponent>(xform.GridUid, out var gridXform))
{
rotation = xformSystem.GetWorldRotation(gridXform);
}

View File

@@ -8,6 +8,8 @@ namespace Content.Client.AlertLevel;
public sealed class AlertLevelDisplaySystem : EntitySystem
{
[Dependency] private readonly SpriteSystem _sprite = default!;
public override void Initialize()
{
base.Initialize();
@@ -21,26 +23,26 @@ public sealed class AlertLevelDisplaySystem : EntitySystem
{
return;
}
var layer = args.Sprite.LayerMapReserveBlank(AlertLevelDisplay.Layer);
var layer = _sprite.LayerMapReserve((uid, args.Sprite), AlertLevelDisplay.Layer);
if (args.AppearanceData.TryGetValue(AlertLevelDisplay.Powered, out var poweredObject))
{
args.Sprite.LayerSetVisible(layer, poweredObject is true);
_sprite.LayerSetVisible((uid, args.Sprite), layer, poweredObject is true);
}
if (!args.AppearanceData.TryGetValue(AlertLevelDisplay.CurrentLevel, out var level))
{
args.Sprite.LayerSetState(layer, alertLevelDisplay.AlertVisuals.Values.First());
_sprite.LayerSetRsiState((uid, args.Sprite), layer, alertLevelDisplay.AlertVisuals.Values.First());
return;
}
if (alertLevelDisplay.AlertVisuals.TryGetValue((string) level, out var visual))
if (alertLevelDisplay.AlertVisuals.TryGetValue((string)level, out var visual))
{
args.Sprite.LayerSetState(layer, visual);
_sprite.LayerSetRsiState((uid, args.Sprite), layer, visual);
}
else
{
args.Sprite.LayerSetState(layer, alertLevelDisplay.AlertVisuals.Values.First());
_sprite.LayerSetRsiState((uid, args.Sprite), layer, alertLevelDisplay.AlertVisuals.Values.First());
}
}
}

View File

@@ -2,6 +2,7 @@ using System.Linq;
using Content.Shared.Alert;
using JetBrains.Annotations;
using Robust.Client.Player;
using Robust.Client.UserInterface;
using Robust.Shared.GameStates;
using Robust.Shared.Player;
using Robust.Shared.Prototypes;
@@ -15,6 +16,7 @@ public sealed class ClientAlertsSystem : AlertsSystem
[Dependency] private readonly IPlayerManager _playerManager = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly IUserInterfaceManager _ui = default!;
public event EventHandler? ClearAlerts;
public event EventHandler<IReadOnlyDictionary<AlertKey, AlertState>>? SyncAlerts;
@@ -27,6 +29,12 @@ public sealed class ClientAlertsSystem : AlertsSystem
SubscribeLocalEvent<AlertsComponent, LocalPlayerDetachedEvent>(OnPlayerDetached);
SubscribeLocalEvent<AlertsComponent, ComponentHandleState>(OnHandleState);
}
protected override void HandledAlert()
{
_ui.ClickSound();
}
protected override void LoadPrototypes()
{
base.LoadPrototypes();
@@ -52,8 +60,24 @@ public sealed class ClientAlertsSystem : AlertsSystem
if (args.Current is not AlertComponentState cast)
return;
// Save all client-sided alerts to later put back in
var clientAlerts = new Dictionary<AlertKey, AlertState>();
foreach (var alert in alerts.Comp.Alerts)
{
if (alert.Key.AlertType != null && TryGet(alert.Key.AlertType.Value, out var alertProto))
{
if (alertProto.ClientHandled)
clientAlerts[alert.Key] = alert.Value;
}
}
alerts.Comp.Alerts = new(cast.Alerts);
foreach (var alert in clientAlerts)
{
alerts.Comp.Alerts[alert.Key] = alert.Value;
}
UpdateHud(alerts);
}

View File

@@ -15,6 +15,7 @@ public sealed class EntityPickupAnimationSystem : EntitySystem
{
[Dependency] private readonly AnimationPlayerSystem _animations = default!;
[Dependency] private readonly MetaDataSystem _metaData = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
[Dependency] private readonly TransformSystem _transform = default!;
public override void Initialize()
@@ -56,8 +57,8 @@ public sealed class EntityPickupAnimationSystem : EntitySystem
}
var sprite = Comp<SpriteComponent>(animatableClone);
sprite.CopyFrom(sprite0);
sprite.Visible = true;
_sprite.CopySprite((uid, sprite0), (animatableClone, sprite));
_sprite.SetVisible((animatableClone, sprite), true);
var animations = Comp<AnimationPlayerComponent>(animatableClone);

View File

@@ -11,6 +11,7 @@ public sealed class AnomalySystem : SharedAnomalySystem
{
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly FloatingVisualizerSystem _floating = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
/// <inheritdoc/>
public override void Initialize()
@@ -49,12 +50,12 @@ public sealed class AnomalySystem : SharedAnomalySystem
if (HasComp<AnomalySupercriticalComponent>(uid))
pulsing = true;
if (!sprite.LayerMapTryGet(AnomalyVisualLayers.Base, out var layer) ||
!sprite.LayerMapTryGet(AnomalyVisualLayers.Animated, out var animatedLayer))
if (!_sprite.LayerMapTryGet((uid, sprite), AnomalyVisualLayers.Base, out var layer, false) ||
!_sprite.LayerMapTryGet((uid, sprite), AnomalyVisualLayers.Animated, out var animatedLayer, false))
return;
sprite.LayerSetVisible(layer, !pulsing);
sprite.LayerSetVisible(animatedLayer, pulsing);
_sprite.LayerSetVisible((uid, sprite), layer, !pulsing);
_sprite.LayerSetVisible((uid, sprite), animatedLayer, pulsing);
}
public override void Update(float frameTime)
@@ -63,16 +64,16 @@ public sealed class AnomalySystem : SharedAnomalySystem
var query = EntityQueryEnumerator<AnomalySupercriticalComponent, SpriteComponent>();
while (query.MoveNext(out var super, out var sprite))
while (query.MoveNext(out var uid, out var super, out var sprite))
{
var completion = 1f - (float) ((super.EndTime - _timing.CurTime) / super.SupercriticalDuration);
var completion = 1f - (float)((super.EndTime - _timing.CurTime) / super.SupercriticalDuration);
var scale = completion * (super.MaxScaleAmount - 1f) + 1f;
sprite.Scale = new Vector2(scale, scale);
_sprite.SetScale((uid, sprite), new Vector2(scale, scale));
var transparency = (byte) (65 * (1f - completion) + 190);
var transparency = (byte)(65 * (1f - completion) + 190);
if (transparency < sprite.Color.AByte)
{
sprite.Color = sprite.Color.WithAlpha(transparency);
_sprite.SetColor((uid, sprite), sprite.Color.WithAlpha(transparency));
}
}
}
@@ -82,7 +83,7 @@ public sealed class AnomalySystem : SharedAnomalySystem
if (!TryComp<SpriteComponent>(ent, out var sprite))
return;
sprite.Scale = Vector2.One;
sprite.Color = sprite.Color.WithAlpha(1f);
_sprite.SetScale((ent.Owner, sprite), Vector2.One);
_sprite.SetColor((ent.Owner, sprite), sprite.Color.WithAlpha(1f));
}
}

View File

@@ -7,6 +7,8 @@ namespace Content.Client.Anomaly.Effects;
public sealed class ClientInnerBodyAnomalySystem : SharedInnerBodyAnomalySystem
{
[Dependency] private readonly SpriteSystem _sprite = default!;
public override void Initialize()
{
SubscribeLocalEvent<InnerBodyAnomalyComponent, AfterAutoHandleStateEvent>(OnAfterHandleState);
@@ -21,21 +23,20 @@ public sealed class ClientInnerBodyAnomalySystem : SharedInnerBodyAnomalySystem
if (ent.Comp.FallbackSprite is null)
return;
if (!sprite.LayerMapTryGet(ent.Comp.LayerMap, out var index))
index = sprite.LayerMapReserveBlank(ent.Comp.LayerMap);
var index = _sprite.LayerMapReserve((ent.Owner, sprite), ent.Comp.LayerMap);
if (TryComp<BodyComponent>(ent, out var body) &&
body.Prototype is not null &&
ent.Comp.SpeciesSprites.TryGetValue(body.Prototype.Value, out var speciesSprite))
{
sprite.LayerSetSprite(index, speciesSprite);
_sprite.LayerSetSprite((ent.Owner, sprite), index, speciesSprite);
}
else
{
sprite.LayerSetSprite(index, ent.Comp.FallbackSprite);
_sprite.LayerSetSprite((ent.Owner, sprite), index, ent.Comp.FallbackSprite);
}
sprite.LayerSetVisible(index, true);
_sprite.LayerSetVisible((ent.Owner, sprite), index, true);
sprite.LayerSetShader(index, "unshaded");
}
@@ -44,7 +45,7 @@ public sealed class ClientInnerBodyAnomalySystem : SharedInnerBodyAnomalySystem
if (!TryComp<SpriteComponent>(ent, out var sprite))
return;
var index = sprite.LayerMapGet(ent.Comp.LayerMap);
sprite.LayerSetVisible(index, false);
var index = _sprite.LayerMapGet((ent.Owner, sprite), ent.Comp.LayerMap);
_sprite.LayerSetVisible((ent.Owner, sprite), index, false);
}
}

View File

@@ -11,6 +11,7 @@ namespace Content.Client.Atmos.EntitySystems;
public sealed class AtmosPipeAppearanceSystem : EntitySystem
{
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
public override void Initialize()
{
@@ -25,21 +26,22 @@ public sealed class AtmosPipeAppearanceSystem : EntitySystem
if (!TryComp(uid, out SpriteComponent? sprite))
return;
foreach (PipeConnectionLayer layerKey in Enum.GetValues(typeof(PipeConnectionLayer)))
foreach (var layerKey in Enum.GetValues<PipeConnectionLayer>())
{
sprite.LayerMapReserveBlank(layerKey);
var layer = sprite.LayerMapGet(layerKey);
sprite.LayerSetRSI(layer, component.Sprite.RsiPath);
sprite.LayerSetState(layer, component.Sprite.RsiState);
sprite.LayerSetDirOffset(layer, ToOffset(layerKey));
var layer = _sprite.LayerMapReserve((uid, sprite), layerKey);
_sprite.LayerSetRsi((uid, sprite), layer, component.Sprite.RsiPath);
_sprite.LayerSetRsiState((uid, sprite), layer, component.Sprite.RsiState);
_sprite.LayerSetDirOffset((uid, sprite), layer, ToOffset(layerKey));
}
}
private void HideAllPipeConnection(SpriteComponent sprite)
private void HideAllPipeConnection(Entity<SpriteComponent> entity)
{
foreach (PipeConnectionLayer layerKey in Enum.GetValues(typeof(PipeConnectionLayer)))
var sprite = entity.Comp;
foreach (var layerKey in Enum.GetValues<PipeConnectionLayer>())
{
if (!sprite.LayerMapTryGet(layerKey, out var key))
if (!_sprite.LayerMapTryGet(entity.AsNullable(), layerKey, out var key, false))
continue;
var layer = sprite[key];
@@ -61,7 +63,7 @@ public sealed class AtmosPipeAppearanceSystem : EntitySystem
if (!_appearance.TryGetData<PipeDirection>(uid, PipeVisuals.VisualState, out var worldConnectedDirections, args.Component))
{
HideAllPipeConnection(args.Sprite);
HideAllPipeConnection((uid, args.Sprite));
return;
}
@@ -71,13 +73,13 @@ public sealed class AtmosPipeAppearanceSystem : EntitySystem
// transform connected directions to local-coordinates
var connectedDirections = worldConnectedDirections.RotatePipeDirection(-Transform(uid).LocalRotation);
foreach (PipeConnectionLayer layerKey in Enum.GetValues(typeof(PipeConnectionLayer)))
foreach (var layerKey in Enum.GetValues<PipeConnectionLayer>())
{
if (!args.Sprite.LayerMapTryGet(layerKey, out var key))
if (!_sprite.LayerMapTryGet((uid, args.Sprite), layerKey, out var key, false))
continue;
var layer = args.Sprite[key];
var dir = (PipeDirection) layerKey;
var dir = (PipeDirection)layerKey;
var visible = connectedDirections.HasDirection(dir);
layer.Visible &= visible;

View File

@@ -2,6 +2,7 @@ using Content.Client.Atmos.Components;
using Content.Shared.Atmos;
using Robust.Client.GameObjects;
using Robust.Shared.Map;
using Robust.Shared.Utility;
namespace Content.Client.Atmos.EntitySystems;
@@ -10,6 +11,7 @@ namespace Content.Client.Atmos.EntitySystems;
/// </summary>
public sealed class FireVisualizerSystem : VisualizerSystem<FireVisualsComponent>
{
[Dependency] private readonly SpriteSystem _sprite = default!;
[Dependency] private readonly PointLightSystem _lights = default!;
public override void Initialize()
@@ -31,9 +33,9 @@ public sealed class FireVisualizerSystem : VisualizerSystem<FireVisualsComponent
// Need LayerMapTryGet because Init fails if there's no existing sprite / appearancecomp
// which means in some setups (most frequently no AppearanceComp) the layer never exists.
if (TryComp<SpriteComponent>(uid, out var sprite) &&
sprite.LayerMapTryGet(FireVisualLayers.Fire, out var layer))
_sprite.LayerMapTryGet((uid, sprite), FireVisualLayers.Fire, out var layer, false))
{
sprite.RemoveLayer(layer);
_sprite.RemoveLayer((uid, sprite), layer);
}
}
@@ -42,11 +44,11 @@ public sealed class FireVisualizerSystem : VisualizerSystem<FireVisualsComponent
if (!TryComp<SpriteComponent>(uid, out var sprite) || !TryComp(uid, out AppearanceComponent? appearance))
return;
sprite.LayerMapReserveBlank(FireVisualLayers.Fire);
sprite.LayerSetVisible(FireVisualLayers.Fire, false);
_sprite.LayerMapReserve((uid, sprite), FireVisualLayers.Fire);
_sprite.LayerSetVisible((uid, sprite), FireVisualLayers.Fire, false);
sprite.LayerSetShader(FireVisualLayers.Fire, "unshaded");
if (component.Sprite != null)
sprite.LayerSetRSI(FireVisualLayers.Fire, component.Sprite);
_sprite.LayerSetRsi((uid, sprite), FireVisualLayers.Fire, new ResPath(component.Sprite));
UpdateAppearance(uid, component, sprite, appearance);
}
@@ -59,12 +61,12 @@ public sealed class FireVisualizerSystem : VisualizerSystem<FireVisualsComponent
private void UpdateAppearance(EntityUid uid, FireVisualsComponent component, SpriteComponent sprite, AppearanceComponent appearance)
{
if (!sprite.LayerMapTryGet(FireVisualLayers.Fire, out var index))
if (!_sprite.LayerMapTryGet((uid, sprite), FireVisualLayers.Fire, out var index, false))
return;
AppearanceSystem.TryGetData<bool>(uid, FireVisuals.OnFire, out var onFire, appearance);
AppearanceSystem.TryGetData<float>(uid, FireVisuals.FireStacks, out var fireStacks, appearance);
sprite.LayerSetVisible(index, onFire);
_sprite.LayerSetVisible((uid, sprite), index, onFire);
if (!onFire)
{
@@ -78,9 +80,9 @@ public sealed class FireVisualizerSystem : VisualizerSystem<FireVisualsComponent
}
if (fireStacks > component.FireStackAlternateState && !string.IsNullOrEmpty(component.AlternateState))
sprite.LayerSetState(index, component.AlternateState);
_sprite.LayerSetRsiState((uid, sprite), index, component.AlternateState);
else
sprite.LayerSetState(index, component.NormalState);
_sprite.LayerSetRsiState((uid, sprite), index, component.NormalState);
component.LightEntity ??= Spawn(null, new EntityCoordinates(uid, default));
var light = EnsureComp<PointLightComponent>(component.LightEntity.Value);

View File

@@ -0,0 +1,29 @@
using Content.Shared.Atmos.Components;
using Content.Shared.Atmos.EntitySystems;
namespace Content.Client.Atmos.EntitySystems;
public sealed class GasTankSystem : SharedGasTankSystem
{
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<GasTankComponent, AfterAutoHandleStateEvent>(OnGasTankState);
}
private void OnGasTankState(Entity<GasTankComponent> ent, ref AfterAutoHandleStateEvent args)
{
if (UI.TryGetOpenUi(ent.Owner, SharedGasTankUiKey.Key, out var bui))
{
bui.Update<GasTankBoundUserInterfaceState>();
}
}
public override void UpdateUserInterface(Entity<GasTankComponent> ent)
{
if (UI.TryGetOpenUi(ent.Owner, SharedGasTankUiKey.Key, out var bui))
{
bui.Update<GasTankBoundUserInterfaceState>();
}
}
}

View File

@@ -7,9 +7,11 @@ namespace Content.Client.Atmos.Monitor;
public sealed class AtmosAlarmableVisualsSystem : VisualizerSystem<AtmosAlarmableVisualsComponent>
{
[Dependency] private readonly SpriteSystem _sprite = default!;
protected override void OnAppearanceChange(EntityUid uid, AtmosAlarmableVisualsComponent component, ref AppearanceChangeEvent args)
{
if (args.Sprite == null || !args.Sprite.LayerMapTryGet(component.LayerMap, out var layer))
if (args.Sprite == null || !_sprite.LayerMapTryGet((uid, args.Sprite), component.LayerMap, out var layer, false))
return;
if (!args.AppearanceData.TryGetValue(PowerDeviceVisuals.Powered, out var poweredObject) ||
@@ -22,8 +24,8 @@ public sealed class AtmosAlarmableVisualsSystem : VisualizerSystem<AtmosAlarmabl
{
foreach (var visLayer in component.HideOnDepowered)
{
if (args.Sprite.LayerMapTryGet(visLayer, out var powerVisibilityLayer))
args.Sprite.LayerSetVisible(powerVisibilityLayer, powered);
if (_sprite.LayerMapTryGet((uid, args.Sprite), visLayer, out var powerVisibilityLayer, false))
_sprite.LayerSetVisible((uid, args.Sprite), powerVisibilityLayer, powered);
}
}
@@ -31,8 +33,8 @@ public sealed class AtmosAlarmableVisualsSystem : VisualizerSystem<AtmosAlarmabl
{
foreach (var (setLayer, powerState) in component.SetOnDepowered)
{
if (args.Sprite.LayerMapTryGet(setLayer, out var setStateLayer))
args.Sprite.LayerSetState(setStateLayer, new RSI.StateId(powerState));
if (_sprite.LayerMapTryGet((uid, args.Sprite), setLayer, out var setStateLayer, false))
_sprite.LayerSetRsiState((uid, args.Sprite), setStateLayer, new RSI.StateId(powerState));
}
}
@@ -41,7 +43,7 @@ public sealed class AtmosAlarmableVisualsSystem : VisualizerSystem<AtmosAlarmabl
&& powered
&& component.AlarmStates.TryGetValue(alarmType, out var state))
{
args.Sprite.LayerSetState(layer, new RSI.StateId(state));
_sprite.LayerSetRsiState((uid, args.Sprite), layer, new RSI.StateId(state));
}
}
}

View File

@@ -74,7 +74,13 @@
<!-- Mode buttons -->
<BoxContainer Orientation="Horizontal">
<Label Text="{Loc 'air-alarm-ui-window-mode-label'}" Margin="0 0 2 0" />
<OptionButton Name="CModeButton" HorizontalExpand="True" />
<Control HorizontalExpand="True">
<OptionButton Name="CModeButton" />
<ui:StripeBack Name="CModeSelectLocked">
<RichTextLabel Text="{Loc 'air-alarm-ui-window-mode-select-locked-label'}"
HorizontalAlignment="Center" />
</ui:StripeBack>
</Control>
<CheckBox Name="AutoModeCheckBox" Text="{Loc 'air-alarm-ui-window-auto-mode-label'}" />
</BoxContainer>
</BoxContainer>

View File

@@ -110,6 +110,8 @@ public sealed partial class AirAlarmWindow : FancyWindow
{
UpdateDeviceData(addr, dev);
}
_modes.Visible = !state.PanicWireCut;
CModeSelectLocked.Visible = state.PanicWireCut;
}
public void UpdateModeSelector(AirAlarmMode mode)

View File

@@ -71,6 +71,7 @@ public sealed partial class ScrubberControl : BoxContainer
_data.PumpDirection = (ScrubberPumpDirection) args.Id;
ScrubberDataChanged?.Invoke(_address, _data);
};
_pumpDirection.Disabled = data.AirAlarmPanicWireCut;
_copySettings.OnPressed += _ =>
{
@@ -109,6 +110,7 @@ public sealed partial class ScrubberControl : BoxContainer
_data.PumpDirection = data.PumpDirection;
_pumpDirection.Select((int) _data.PumpDirection);
_pumpDirection.Disabled = data.AirAlarmPanicWireCut;
_data.VolumeRate = data.VolumeRate;
_volumeRate.Value = _data.VolumeRate;

View File

@@ -21,6 +21,7 @@ namespace Content.Client.Atmos.Overlays
{
private readonly IEntityManager _entManager;
private readonly IMapManager _mapManager;
private readonly SharedMapSystem _mapSystem;
private readonly SharedTransformSystem _xformSys;
public override OverlaySpace Space => OverlaySpace.WorldSpaceEntities | OverlaySpace.WorldSpaceBelowWorld;
@@ -51,6 +52,7 @@ namespace Content.Client.Atmos.Overlays
{
_entManager = entManager;
_mapManager = IoCManager.Resolve<IMapManager>();
_mapSystem = entManager.System<SharedMapSystem>();
_xformSys = xformSys;
_shader = protoMan.Index<ShaderPrototype>("unshaded").Instance();
ZIndex = GasOverlayZIndex;
@@ -163,7 +165,7 @@ namespace Content.Client.Atmos.Overlays
xformQuery,
_xformSys);
var mapUid = _mapManager.GetMapEntityId(args.MapId);
var mapUid = _mapSystem.GetMapOrInvalid(args.MapId);
if (_entManager.TryGetComponent<MapAtmosphereComponent>(mapUid, out var atmos))
DrawMapOverlay(drawHandle, args, mapUid, atmos);

View File

@@ -0,0 +1,8 @@
using Content.Shared.Atmos.Piping.Binary.Systems;
namespace Content.Client.Atmos.Piping.Binary.Systems;
public sealed class GasValveSystem : SharedGasValveSystem
{
}

View File

@@ -0,0 +1,32 @@
using Content.Client.Atmos.UI;
using Content.Shared.Atmos.Piping.Binary.Components;
using Content.Shared.Atmos.Piping.Unary.Components;
using Content.Shared.Atmos.Piping.Unary.Systems;
using Content.Shared.NodeContainer;
namespace Content.Client.Atmos.Piping.Unary.Systems;
public sealed class GasCanisterSystem : SharedGasCanisterSystem
{
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<GasCanisterComponent, AfterAutoHandleStateEvent>(OnGasState);
}
private void OnGasState(Entity<GasCanisterComponent> ent, ref AfterAutoHandleStateEvent args)
{
if (UI.TryGetOpenUi<GasCanisterBoundUserInterface>(ent.Owner, GasCanisterUiKey.Key, out var bui))
{
bui.Update<GasCanisterBoundUserInterfaceState>();
}
}
protected override void DirtyUI(EntityUid uid, GasCanisterComponent? component = null, NodeContainerComponent? nodes = null)
{
if (UI.TryGetOpenUi<GasCanisterBoundUserInterface>(uid, GasCanisterUiKey.Key, out var bui))
{
bui.Update<GasCanisterBoundUserInterfaceState>();
}
}
}

View File

@@ -0,0 +1,29 @@
using Content.Client.Atmos.UI;
using Content.Shared.Atmos.Piping.Unary.Components;
using Content.Shared.Atmos.Piping.Unary.Systems;
namespace Content.Client.Atmos.Piping.Unary.Systems;
public sealed class GasThermoMachineSystem : SharedGasThermoMachineSystem
{
[Dependency] private readonly SharedUserInterfaceSystem _ui = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<GasThermoMachineComponent, AfterAutoHandleStateEvent>(OnGasAfterState);
}
private void OnGasAfterState(Entity<GasThermoMachineComponent> ent, ref AfterAutoHandleStateEvent args)
{
DirtyUI(ent.Owner, ent.Comp);
}
protected override void DirtyUI(EntityUid uid, GasThermoMachineComponent? thermoMachine, UserInterfaceComponent? ui = null)
{
if (_ui.TryGetOpenUi<GasThermomachineBoundUserInterface>(uid, ThermomachineUiKey.Key, out var bui))
{
bui.Update();
}
}
}

View File

@@ -1,4 +1,7 @@
using Content.Shared.Atmos.Piping.Binary.Components;
using Content.Shared.Atmos.Components;
using Content.Shared.Atmos.Piping.Binary.Components;
using Content.Shared.Atmos.Piping.Unary.Components;
using Content.Shared.IdentityManagement;
using JetBrains.Annotations;
using Robust.Client.GameObjects;
using Robust.Client.UserInterface;
@@ -32,22 +35,22 @@ namespace Content.Client.Atmos.UI
private void OnTankEjectPressed()
{
SendMessage(new GasCanisterHoldingTankEjectMessage());
SendPredictedMessage(new GasCanisterHoldingTankEjectMessage());
}
private void OnReleasePressureSet(float value)
{
SendMessage(new GasCanisterChangeReleasePressureMessage(value));
SendPredictedMessage(new GasCanisterChangeReleasePressureMessage(value));
}
private void OnReleaseValveOpenPressed()
{
SendMessage(new GasCanisterChangeReleaseValveMessage(true));
SendPredictedMessage(new GasCanisterChangeReleaseValveMessage(true));
}
private void OnReleaseValveClosePressed()
{
SendMessage(new GasCanisterChangeReleaseValveMessage(false));
SendPredictedMessage(new GasCanisterChangeReleaseValveMessage(false));
}
/// <summary>
@@ -57,17 +60,21 @@ namespace Content.Client.Atmos.UI
protected override void UpdateState(BoundUserInterfaceState state)
{
base.UpdateState(state);
if (_window == null || state is not GasCanisterBoundUserInterfaceState cast)
if (_window == null || state is not GasCanisterBoundUserInterfaceState cast || !EntMan.TryGetComponent(Owner, out GasCanisterComponent? component))
return;
_window.SetCanisterLabel(cast.CanisterLabel);
var canisterLabel = Identity.Name(Owner, EntMan);
var tankLabel = component.GasTankSlot.Item != null ? Identity.Name(component.GasTankSlot.Item.Value, EntMan) : null;
_window.SetCanisterLabel(canisterLabel);
_window.SetCanisterPressure(cast.CanisterPressure);
_window.SetPortStatus(cast.PortStatus);
_window.SetTankLabel(cast.TankLabel);
_window.SetTankLabel(tankLabel);
_window.SetTankPressure(cast.TankPressure);
_window.SetReleasePressureRange(cast.ReleasePressureMin, cast.ReleasePressureMax);
_window.SetReleasePressure(cast.ReleasePressure);
_window.SetReleaseValve(cast.ReleaseValve);
_window.SetReleasePressureRange(component.MinReleasePressure, component.MaxReleasePressure);
_window.SetReleasePressure(component.ReleasePressure);
_window.SetReleaseValve(component.ReleaseValve);
}
protected override void Dispose(bool disposing)

View File

@@ -13,9 +13,6 @@ namespace Content.Client.Atmos.UI;
[UsedImplicitly]
public sealed class GasPressurePumpBoundUserInterface(EntityUid owner, Enum uiKey) : BoundUserInterface(owner, uiKey)
{
[ViewVariables]
private const float MaxPressure = Atmospherics.MaxOutputPressure;
[ViewVariables]
private GasPressurePumpWindow? _window;

View File

@@ -1,5 +1,8 @@
using Content.Shared.Atmos;
using Content.Client.Power.EntitySystems;
using Content.Shared.Atmos;
using Content.Shared.Atmos.Piping.Unary.Components;
using Content.Shared.Atmos.Piping.Unary.Systems;
using Content.Shared.Power.Components;
using JetBrains.Annotations;
using Robust.Client.GameObjects;
using Robust.Client.UserInterface;
@@ -36,6 +39,8 @@ namespace Content.Client.Atmos.UI
_window.ToggleStatusButton.OnPressed += _ => OnToggleStatusButtonPressed();
_window.TemperatureSpinbox.OnValueChanged += _ => OnTemperatureChanged(_window.TemperatureSpinbox.Value);
_window.Entity = Owner;
Update();
}
private void OnToggleStatusButtonPressed()
@@ -43,7 +48,7 @@ namespace Content.Client.Atmos.UI
if (_window is null) return;
_window.SetActive(!_window.Active);
SendMessage(new GasThermomachineToggleMessage());
SendPredictedMessage(new GasThermomachineToggleMessage());
}
private void OnTemperatureChanged(float value)
@@ -60,25 +65,32 @@ namespace Content.Client.Atmos.UI
return;
}
SendMessage(new GasThermomachineChangeTemperatureMessage(actual));
SendPredictedMessage(new GasThermomachineChangeTemperatureMessage(actual));
}
/// <summary>
/// Update the UI state based on server-sent info
/// </summary>
/// <param name="state"></param>
protected override void UpdateState(BoundUserInterfaceState state)
public override void Update()
{
base.UpdateState(state);
if (_window == null || state is not GasThermomachineBoundUserInterfaceState cast)
if (_window == null || !EntMan.TryGetComponent(Owner, out GasThermoMachineComponent? thermo))
return;
_minTemp = cast.MinTemperature;
_maxTemp = cast.MaxTemperature;
_isHeater = cast.IsHeater;
var system = EntMan.System<SharedGasThermoMachineSystem>();
_minTemp = thermo.MinTemperature;
_maxTemp = thermo.MaxTemperature;
_isHeater = system.IsHeater(thermo);
_window.SetTemperature(thermo.TargetTemperature);
var receiverSys = EntMan.System<PowerReceiverSystem>();
SharedApcPowerReceiverComponent? receiver = null;
receiverSys.ResolveApc(Owner, ref receiver);
// Also set in frameupdates.
if (receiver != null)
{
_window.SetActive(!receiver.PowerDisabled);
}
_window.SetTemperature(cast.Temperature);
_window.SetActive(cast.Enabled);
_window.Title = _isHeater switch
{
false => Loc.GetString("comp-gas-thermomachine-ui-title-freezer"),

View File

@@ -1,5 +1,6 @@
<DefaultWindow xmlns="https://spacestation14.io"
<controls:FancyWindow xmlns="https://spacestation14.io"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
MinSize="300 120" Title="{Loc comp-gas-thermomachine-ui-title-freezer}">
<BoxContainer Name="VboxContainer" Orientation="Vertical" Margin="5 5 5 5" SeparationOverride="10">
<BoxContainer Orientation="Horizontal" HorizontalExpand="True">
@@ -11,4 +12,4 @@
<Label Text="{Loc comp-gas-thermomachine-ui-temperature}"/>
</BoxContainer>
</BoxContainer>
</DefaultWindow>
</controls:FancyWindow>

View File

@@ -1,19 +1,26 @@
using Content.Client.Power.Components;
using Content.Client.UserInterface.Controls;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Timing;
namespace Content.Client.Atmos.UI;
[GenerateTypedNameReferences]
public sealed partial class GasThermomachineWindow : DefaultWindow
public sealed partial class GasThermomachineWindow : FancyWindow
{
[Dependency] private readonly IEntityManager _entManager = default!;
public bool Active = true;
public FloatSpinBox TemperatureSpinbox;
public EntityUid Entity;
public GasThermomachineWindow()
{
IoCManager.InjectDependencies(this);
RobustXamlLoader.Load(this);
SpinboxHBox.AddChild(
@@ -27,12 +34,10 @@ public sealed partial class GasThermomachineWindow : DefaultWindow
if (active)
{
ToggleStatusButton.Text = Loc.GetString("comp-gas-thermomachine-ui-status-enabled");
ToggleStatusButton.Pressed = true;
}
else
{
ToggleStatusButton.Text = Loc.GetString("comp-gas-thermomachine-ui-status-disabled");
ToggleStatusButton.Pressed = false;
}
}
@@ -40,4 +45,14 @@ public sealed partial class GasThermomachineWindow : DefaultWindow
{
TemperatureSpinbox.Value = temperature;
}
protected override void FrameUpdate(FrameEventArgs args)
{
base.FrameUpdate(args);
if (_entManager.TryGetComponent(Entity, out ApcPowerReceiverComponent? receiver))
{
SetActive(!receiver.PowerDisabled);
}
}
}

View File

@@ -2,35 +2,37 @@ using Robust.Client.GameObjects;
using Content.Shared.Atmos.Visuals;
using Content.Client.Power;
namespace Content.Client.Atmos.Visualizers
namespace Content.Client.Atmos.Visualizers;
/// <summary>
/// Controls client-side visuals for portable scrubbers.
/// </summary>
public sealed class PortableScrubberSystem : VisualizerSystem<PortableScrubberVisualsComponent>
{
/// <summary>
/// Controls client-side visuals for portable scrubbers.
/// </summary>
public sealed class PortableScrubberSystem : VisualizerSystem<PortableScrubberVisualsComponent>
[Dependency] private readonly SpriteSystem _sprite = default!;
protected override void OnAppearanceChange(EntityUid uid, PortableScrubberVisualsComponent component, ref AppearanceChangeEvent args)
{
protected override void OnAppearanceChange(EntityUid uid, PortableScrubberVisualsComponent component, ref AppearanceChangeEvent args)
if (args.Sprite == null)
return;
if (AppearanceSystem.TryGetData<bool>(uid, PortableScrubberVisuals.IsFull, out var isFull, args.Component)
&& AppearanceSystem.TryGetData<bool>(uid, PortableScrubberVisuals.IsRunning, out var isRunning, args.Component))
{
if (args.Sprite == null)
return;
var runningState = isRunning ? component.RunningState : component.IdleState;
_sprite.LayerSetRsiState((uid, args.Sprite), PortableScrubberVisualLayers.IsRunning, runningState);
if (AppearanceSystem.TryGetData<bool>(uid, PortableScrubberVisuals.IsFull, out var isFull, args.Component)
&& AppearanceSystem.TryGetData<bool>(uid, PortableScrubberVisuals.IsRunning, out var isRunning, args.Component))
{
var runningState = isRunning ? component.RunningState : component.IdleState;
args.Sprite.LayerSetState(PortableScrubberVisualLayers.IsRunning, runningState);
var fullState = isFull ? component.FullState : component.ReadyState;
_sprite.LayerSetRsiState((uid, args.Sprite), PowerDeviceVisualLayers.Powered, fullState);
}
var fullState = isFull ? component.FullState : component.ReadyState;
args.Sprite.LayerSetState(PowerDeviceVisualLayers.Powered, fullState);
}
if (AppearanceSystem.TryGetData<bool>(uid, PortableScrubberVisuals.IsDraining, out var isDraining, args.Component))
{
args.Sprite.LayerSetVisible(PortableScrubberVisualLayers.IsDraining, isDraining);
}
if (AppearanceSystem.TryGetData<bool>(uid, PortableScrubberVisuals.IsDraining, out var isDraining, args.Component))
{
_sprite.LayerSetVisible((uid, args.Sprite), PortableScrubberVisualLayers.IsDraining, isDraining);
}
}
}
public enum PortableScrubberVisualLayers : byte
{
IsRunning,

View File

@@ -12,6 +12,7 @@ public sealed class JukeboxSystem : SharedJukeboxSystem
[Dependency] private readonly AnimationPlayerSystem _animationPlayer = default!;
[Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!;
[Dependency] private readonly SharedUserInterfaceSystem _uiSystem = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
public override void Initialize()
{
@@ -64,7 +65,7 @@ public sealed class JukeboxSystem : SharedJukeboxSystem
visualState = JukeboxVisualState.On;
}
UpdateAppearance(uid, visualState, component, sprite);
UpdateAppearance((uid, sprite), visualState, component);
}
private void OnAppearanceChange(EntityUid uid, JukeboxComponent component, ref AppearanceChangeEvent args)
@@ -78,25 +79,25 @@ public sealed class JukeboxSystem : SharedJukeboxSystem
visualState = JukeboxVisualState.On;
}
UpdateAppearance(uid, visualState, component, args.Sprite);
UpdateAppearance((uid, args.Sprite), visualState, component);
}
private void UpdateAppearance(EntityUid uid, JukeboxVisualState visualState, JukeboxComponent component, SpriteComponent sprite)
private void UpdateAppearance(Entity<SpriteComponent> entity, JukeboxVisualState visualState, JukeboxComponent component)
{
SetLayerState(JukeboxVisualLayers.Base, component.OffState, sprite);
SetLayerState(JukeboxVisualLayers.Base, component.OffState, entity);
switch (visualState)
{
case JukeboxVisualState.On:
SetLayerState(JukeboxVisualLayers.Base, component.OnState, sprite);
SetLayerState(JukeboxVisualLayers.Base, component.OnState, entity);
break;
case JukeboxVisualState.Off:
SetLayerState(JukeboxVisualLayers.Base, component.OffState, sprite);
SetLayerState(JukeboxVisualLayers.Base, component.OffState, entity);
break;
case JukeboxVisualState.Select:
PlayAnimation(uid, JukeboxVisualLayers.Base, component.SelectState, 1.0f, sprite);
PlayAnimation(entity.Owner, JukeboxVisualLayers.Base, component.SelectState, 1.0f, entity);
break;
}
}
@@ -109,7 +110,7 @@ public sealed class JukeboxSystem : SharedJukeboxSystem
if (!_animationPlayer.HasRunningAnimation(uid, state))
{
var animation = GetAnimation(layer, state, animationTime);
sprite.LayerSetVisible(layer, true);
_sprite.LayerSetVisible((uid, sprite), layer, true);
_animationPlayer.Play(uid, animation, state);
}
}
@@ -133,13 +134,13 @@ public sealed class JukeboxSystem : SharedJukeboxSystem
};
}
private void SetLayerState(JukeboxVisualLayers layer, string? state, SpriteComponent sprite)
private void SetLayerState(JukeboxVisualLayers layer, string? state, Entity<SpriteComponent> sprite)
{
if (string.IsNullOrEmpty(state))
return;
sprite.LayerSetVisible(layer, true);
sprite.LayerSetAutoAnimated(layer, true);
sprite.LayerSetState(layer, state);
_sprite.LayerSetVisible(sprite.AsNullable(), layer, true);
_sprite.LayerSetAutoAnimated(sprite.AsNullable(), layer, true);
_sprite.LayerSetRsiState(sprite.AsNullable(), layer, state);
}
}

View File

@@ -41,12 +41,12 @@ public sealed class BarSignSystem : VisualizerSystem<BarSignComponent>
&& sign.Current != null
&& _prototypeManager.TryIndex(sign.Current, out var proto))
{
sprite.LayerSetSprite(0, proto.Icon);
SpriteSystem.LayerSetSprite((id, sprite), 0, proto.Icon);
sprite.LayerSetShader(0, "unshaded");
}
else
{
sprite.LayerSetState(0, "empty");
SpriteSystem.LayerSetRsiState((id, sprite), 0, "empty");
sprite.LayerSetShader(0, null, null);
}
}

View File

@@ -7,6 +7,8 @@ namespace Content.Client.Beam;
public sealed class BeamSystem : SharedBeamSystem
{
[Dependency] private readonly SpriteSystem _sprite = default!;
public override void Initialize()
{
base.Initialize();
@@ -21,11 +23,11 @@ public sealed class BeamSystem : SharedBeamSystem
if (TryComp<SpriteComponent>(beam, out var sprites))
{
sprites.Rotation = args.UserAngle;
_sprite.SetRotation((beam, sprites), args.UserAngle);
if (args.BodyState != null)
{
sprites.LayerSetState(0, args.BodyState);
_sprite.LayerSetRsiState((beam, sprites), 0, args.BodyState);
sprites.LayerSetShader(0, args.Shader);
}
}

View File

@@ -0,0 +1,8 @@
using Content.Shared.Bed;
namespace Content.Client.Bed;
public sealed class BedSystem : SharedBedSystem
{
}

View File

@@ -10,7 +10,7 @@ public sealed class StasisBedSystem : VisualizerSystem<StasisBedVisualsComponent
if (args.Sprite != null
&& AppearanceSystem.TryGetData<bool>(uid, StasisBedVisuals.IsOn, out var isOn, args.Component))
{
args.Sprite.LayerSetVisible(StasisBedVisualLayers.IsOn, isOn);
SpriteSystem.LayerSetVisible((uid, args.Sprite), StasisBedVisualLayers.IsOn, isOn);
}
}
}

View File

@@ -0,0 +1,24 @@
using Content.Shared.Atmos.Components;
using Content.Shared.Body.Components;
using Content.Shared.Body.Systems;
namespace Content.Client.Body.Systems;
public sealed class InternalsSystem : SharedInternalsSystem
{
[Dependency] private readonly SharedUserInterfaceSystem _ui = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<InternalsComponent, AfterAutoHandleStateEvent>(OnInternalsAfterState);
}
private void OnInternalsAfterState(Entity<InternalsComponent> ent, ref AfterAutoHandleStateEvent args)
{
if (ent.Comp.GasTankEntity != null && _ui.TryGetOpenUi(ent.Comp.GasTankEntity.Value, SharedGasTankUiKey.Key, out var bui))
{
bui.Update();
}
}
}

View File

@@ -1,11 +1,14 @@
using Content.Client.Botany.Components;
using Content.Shared.Botany;
using Robust.Client.GameObjects;
using Robust.Shared.Utility;
namespace Content.Client.Botany;
public sealed class PlantHolderVisualizerSystem : VisualizerSystem<PlantHolderVisualsComponent>
{
[Dependency] private readonly SpriteSystem _sprite = default!;
public override void Initialize()
{
base.Initialize();
@@ -17,8 +20,8 @@ public sealed class PlantHolderVisualizerSystem : VisualizerSystem<PlantHolderVi
if (!TryComp<SpriteComponent>(uid, out var sprite))
return;
sprite.LayerMapReserveBlank(PlantHolderLayers.Plant);
sprite.LayerSetVisible(PlantHolderLayers.Plant, false);
_sprite.LayerMapReserve((uid, sprite), PlantHolderLayers.Plant);
_sprite.LayerSetVisible((uid, sprite), PlantHolderLayers.Plant, false);
}
protected override void OnAppearanceChange(EntityUid uid, PlantHolderVisualsComponent component, ref AppearanceChangeEvent args)
@@ -31,12 +34,12 @@ public sealed class PlantHolderVisualizerSystem : VisualizerSystem<PlantHolderVi
{
var valid = !string.IsNullOrWhiteSpace(state);
args.Sprite.LayerSetVisible(PlantHolderLayers.Plant, valid);
_sprite.LayerSetVisible((uid, args.Sprite), PlantHolderLayers.Plant, valid);
if (valid)
{
args.Sprite.LayerSetRSI(PlantHolderLayers.Plant, rsi);
args.Sprite.LayerSetState(PlantHolderLayers.Plant, state);
_sprite.LayerSetRsi((uid, args.Sprite), PlantHolderLayers.Plant, new ResPath(rsi));
_sprite.LayerSetRsiState((uid, args.Sprite), PlantHolderLayers.Plant, state);
}
}
}

View File

@@ -15,7 +15,7 @@ public sealed class PotencyVisualsSystem : VisualizerSystem<PotencyVisualsCompon
if (AppearanceSystem.TryGetData<float>(uid, ProduceVisuals.Potency, out var potency, args.Component))
{
var scale = MathHelper.Lerp(component.MinimumScale, component.MaximumScale, potency / 100);
args.Sprite.Scale = new Vector2(scale, scale);
SpriteSystem.SetScale((uid, args.Sprite), new Vector2(scale, scale));
}
}
}

View File

@@ -13,6 +13,7 @@ internal sealed class BuckleSystem : SharedBuckleSystem
[Dependency] private readonly RotationVisualizerSystem _rotationVisualizerSystem = default!;
[Dependency] private readonly IEyeManager _eye = default!;
[Dependency] private readonly SharedTransformSystem _xformSystem = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
public override void Initialize()
{
@@ -69,11 +70,11 @@ internal sealed class BuckleSystem : SharedBuckleSystem
{
// This will only assign if empty, it won't get overwritten by new depth on multiple calls, which do happen easily
buckle.OriginalDrawDepth ??= buckledSprite.DrawDepth;
buckledSprite.DrawDepth = strapSprite.DrawDepth - 1;
_sprite.SetDrawDepth((buckledEntity, buckledSprite), strapSprite.DrawDepth - 1);
}
else if (buckle.OriginalDrawDepth.HasValue)
{
buckledSprite.DrawDepth = buckle.OriginalDrawDepth.Value;
_sprite.SetDrawDepth((buckledEntity, buckledSprite), buckle.OriginalDrawDepth.Value);
buckle.OriginalDrawDepth = null;
}
}
@@ -97,7 +98,7 @@ internal sealed class BuckleSystem : SharedBuckleSystem
return;
ent.Comp.OriginalDrawDepth ??= buckledSprite.DrawDepth;
buckledSprite.DrawDepth = strapSprite.DrawDepth - 1;
_sprite.SetDrawDepth((ent.Owner, buckledSprite), strapSprite.DrawDepth - 1);
}
/// <summary>
@@ -111,7 +112,7 @@ internal sealed class BuckleSystem : SharedBuckleSystem
if (!ent.Comp.OriginalDrawDepth.HasValue)
return;
buckledSprite.DrawDepth = ent.Comp.OriginalDrawDepth.Value;
_sprite.SetDrawDepth((ent.Owner, buckledSprite), ent.Comp.OriginalDrawDepth.Value);
ent.Comp.OriginalDrawDepth = null;
}

View File

@@ -13,6 +13,7 @@ public sealed class CardboardBoxSystem : SharedCardboardBoxSystem
[Dependency] private readonly EntityLookupSystem _entityLookup = default!;
[Dependency] private readonly TransformSystem _transform = default!;
[Dependency] private readonly ExamineSystemShared _examine = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
private EntityQuery<BodyComponent> _bodyQuery;
@@ -74,7 +75,7 @@ public sealed class CardboardBoxSystem : SharedCardboardBoxSystem
if (!xformQuery.TryGetComponent(ent, out var entTransform) || !TryComp<SpriteComponent>(ent, out var sprite))
continue;
sprite.Offset = new Vector2(0, 1);
_sprite.SetOffset((ent, sprite), new Vector2(0, 1));
_transform.SetParent(ent, entTransform, mob);
}

View File

@@ -138,6 +138,11 @@ namespace Content.Client.Cargo.BUI
AccountName = cState.Name;
if (_menu == null)
return;
_menu.ProductCatalogue = cState.Products;
_menu?.UpdateStation(station);
Populate(cState.Orders);
}

View File

@@ -10,6 +10,7 @@ namespace Content.Client.Cargo.Systems;
public sealed partial class CargoSystem
{
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
private static readonly Animation CargoTelepadBeamAnimation = new()
{
@@ -80,12 +81,12 @@ public sealed partial class CargoSystem
_player.Play((uid, player), CargoTelepadBeamAnimation, TelepadBeamKey);
break;
case CargoTelepadState.Unpowered:
sprite.LayerSetVisible(CargoTelepadLayers.Beam, false);
_sprite.LayerSetVisible((uid, sprite), CargoTelepadLayers.Beam, false);
_player.Stop(uid, player, TelepadBeamKey);
_player.Stop(uid, player, TelepadIdleKey);
break;
default:
sprite.LayerSetVisible(CargoTelepadLayers.Beam, true);
_sprite.LayerSetVisible((uid, sprite), CargoTelepadLayers.Beam, true);
if (_player.HasRunningAnimation(uid, player, TelepadIdleKey) ||
_player.HasRunningAnimation(uid, player, TelepadBeamKey))

View File

@@ -38,9 +38,10 @@
<!-- Products get added here by code -->
</BoxContainer>
</ScrollContainer>
<Control MinHeight="5"/>
<Control MinHeight="5" Name="OrdersSpacer"/>
<PanelContainer VerticalExpand="True"
SizeFlagsStretchRatio="1">
SizeFlagsStretchRatio="1"
Name="Orders">
<PanelContainer.PanelOverride>
<gfx:StyleBoxFlat BackgroundColor="#000000" />
</PanelContainer.PanelOverride>

View File

@@ -40,6 +40,8 @@ namespace Content.Client.Cargo.UI
private readonly List<string> _categoryStrings = new();
private string? _category;
public List<ProtoId<CargoProductPrototype>> ProductCatalogue = new();
public CargoConsoleMenu(EntityUid owner, IEntityManager entMan, IPrototypeManager protoManager, SpriteSystem spriteSystem)
{
RobustXamlLoader.Load(this);
@@ -113,14 +115,16 @@ namespace Content.Client.Cargo.UI
Categories.SelectId(id);
}
public IEnumerable<CargoProductPrototype> ProductPrototypes
private IEnumerable<CargoProductPrototype> ProductPrototypes
{
get
{
var allowedGroups = _entityManager.GetComponentOrNull<CargoOrderConsoleComponent>(_owner)?.AllowedGroups;
foreach (var cargoPrototype in _protoManager.EnumeratePrototypes<CargoProductPrototype>())
foreach (var cargoPrototypeId in ProductCatalogue)
{
var cargoPrototype = _protoManager.Index(cargoPrototypeId);
if (!allowedGroups?.Contains(cargoPrototype.Group) ?? false)
continue;
@@ -208,6 +212,7 @@ namespace Content.Client.Cargo.UI
var product = _protoManager.Index<EntityPrototype>(order.ProductId);
var productName = product.Name;
var account = _protoManager.Index(order.Account);
var row = new CargoOrderRow
{
@@ -219,7 +224,9 @@ namespace Content.Client.Cargo.UI
"cargo-console-menu-populate-orders-cargo-order-row-product-name-text",
("productName", productName),
("orderAmount", order.OrderQuantity),
("orderRequester", order.Requester))
("orderRequester", order.Requester),
("accountColor", account.Color),
("account", Loc.GetString(account.Code)))
},
Description =
{
@@ -282,6 +289,9 @@ namespace Content.Client.Cargo.UI
AccountActionButton.Disabled = TransferSpinBox.Value <= 0 ||
TransferSpinBox.Value > bankAccount.Accounts[orderConsole.Account] * orderConsole.TransferLimit ||
_timing.CurTime < orderConsole.NextAccountActionTime;
OrdersSpacer.Visible = !orderConsole.SlipPrinter;
Orders.Visible = !orderConsole.SlipPrinter;
}
}
}

View File

@@ -11,11 +11,10 @@
<BoxContainer Orientation="Vertical"
HorizontalExpand="True"
VerticalExpand="True">
<Label Name="ProductName"
<RichTextLabel Name="ProductName"
Access="Public"
HorizontalExpand="True"
StyleClasses="LabelSubText"
ClipText="True" />
StyleClasses="LabelSubText" />
<Label Name="Description"
Access="Public"
HorizontalExpand="True"

View File

@@ -36,6 +36,7 @@ namespace Content.Client.Cargo.UI
{
var product = protoManager.Index<EntityPrototype>(order.ProductId);
var productName = product.Name;
var account = protoManager.Index(order.Account);
var row = new CargoOrderRow
{
@@ -47,7 +48,9 @@ namespace Content.Client.Cargo.UI
"cargo-console-menu-populate-orders-cargo-order-row-product-name-text",
("productName", productName),
("orderAmount", order.OrderQuantity - order.NumDispatched),
("orderRequester", order.Requester))
("orderRequester", order.Requester),
("accountColor", account.Color),
("account", Loc.GetString(account.Code)))
},
Description = {Text = Loc.GetString("cargo-console-menu-order-reason-description",
("reason", order.Reason))}

View File

@@ -11,6 +11,7 @@ namespace Content.Client.Chasm;
public sealed class ChasmFallingVisualsSystem : EntitySystem
{
[Dependency] private readonly AnimationPlayerSystem _anim = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
private readonly string _chasmFallAnimationKey = "chasm_fall";
@@ -46,7 +47,7 @@ public sealed class ChasmFallingVisualsSystem : EntitySystem
if (!TryComp<SpriteComponent>(uid, out var sprite))
return;
sprite.Scale = component.OriginalScale;
_sprite.SetScale((uid, sprite), component.OriginalScale);
if (!TryComp<AnimationPlayerComponent>(uid, out var player))
return;

View File

@@ -16,6 +16,7 @@ public sealed class TypingIndicatorSystem : SharedTypingIndicatorSystem
private readonly TimeSpan _typingTimeout = TimeSpan.FromSeconds(2);
private TimeSpan _lastTextChange;
private bool _isClientTyping;
private bool _isClientChatFocused;
public override void Initialize()
{
@@ -31,7 +32,8 @@ public sealed class TypingIndicatorSystem : SharedTypingIndicatorSystem
return;
// client typed something - show typing indicator
ClientUpdateTyping(true);
_isClientTyping = true;
ClientUpdateTyping();
_lastTextChange = _time.CurTime;
}
@@ -42,36 +44,53 @@ public sealed class TypingIndicatorSystem : SharedTypingIndicatorSystem
return;
// client submitted text - hide typing indicator
ClientUpdateTyping(false);
_isClientTyping = false;
ClientUpdateTyping();
}
public void ClientChangedChatFocus(bool isFocused)
{
// don't update it if player don't want to show typing
if (!_cfg.GetCVar(CCVars.ChatShowTypingIndicator))
return;
// client submitted text - hide typing indicator
_isClientChatFocused = isFocused;
ClientUpdateTyping();
}
public override void Update(float frameTime)
{
base.Update(frameTime);
if (!_time.IsFirstTimePredicted)
return;
// check if client didn't changed chat text box for a long time
if (_isClientTyping)
{
var dif = _time.CurTime - _lastTextChange;
if (dif > _typingTimeout)
{
// client didn't typed anything for a long time - hide indicator
ClientUpdateTyping(false);
// client didn't typed anything for a long time - change indicator
_isClientTyping = false;
ClientUpdateTyping();
}
}
}
private void ClientUpdateTyping(bool isClientTyping)
private void ClientUpdateTyping()
{
if (_isClientTyping == isClientTyping)
return;
// check if player controls any entity.
// check if player controls any pawn
if (_playerManager.LocalEntity == null)
return;
_isClientTyping = isClientTyping;
RaisePredictiveEvent(new TypingChangedEvent(isClientTyping));
var state = TypingIndicatorState.None;
if (_isClientChatFocused)
state = _isClientTyping ? TypingIndicatorState.Typing : TypingIndicatorState.Idle;
// send a networked event to server
RaisePredictiveEvent(new TypingChangedEvent(state));
}
private void OnShowTypingChanged(bool showTyping)
@@ -79,7 +98,8 @@ public sealed class TypingIndicatorSystem : SharedTypingIndicatorSystem
// hide typing indicator immediately if player don't want to show it anymore
if (!showTyping)
{
ClientUpdateTyping(false);
_isClientTyping = false;
ClientUpdateTyping();
}
}
}

View File

@@ -1,6 +1,5 @@
using Content.Shared.Chat.TypingIndicator;
using Robust.Client.GameObjects;
using Robust.Client.Graphics;
using Robust.Shared.Prototypes;
using Content.Shared.Inventory;
@@ -10,7 +9,7 @@ public sealed class TypingIndicatorVisualizerSystem : VisualizerSystem<TypingInd
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly InventorySystem _inventory = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
protected override void OnAppearanceChange(EntityUid uid, TypingIndicatorComponent component, ref AppearanceChangeEvent args)
{
@@ -35,15 +34,25 @@ public sealed class TypingIndicatorVisualizerSystem : VisualizerSystem<TypingInd
return;
}
AppearanceSystem.TryGetData<bool>(uid, TypingIndicatorVisuals.IsTyping, out var isTyping, args.Component);
var layerExists = args.Sprite.LayerMapTryGet(TypingIndicatorLayers.Base, out var layer);
var layerExists = _sprite.LayerMapTryGet((uid, args.Sprite), TypingIndicatorLayers.Base, out var layer, false);
if (!layerExists)
layer = args.Sprite.LayerMapReserveBlank(TypingIndicatorLayers.Base);
layer = _sprite.LayerMapReserve((uid, args.Sprite), TypingIndicatorLayers.Base);
args.Sprite.LayerSetRSI(layer, proto.SpritePath);
args.Sprite.LayerSetState(layer, proto.TypingState);
_sprite.LayerSetRsi((uid, args.Sprite), layer, proto.SpritePath);
_sprite.LayerSetRsiState((uid, args.Sprite), layer, proto.TypingState);
args.Sprite.LayerSetShader(layer, proto.Shader);
args.Sprite.LayerSetOffset(layer, proto.Offset);
args.Sprite.LayerSetVisible(layer, isTyping);
_sprite.LayerSetOffset((uid, args.Sprite), layer, proto.Offset);
AppearanceSystem.TryGetData<TypingIndicatorState>(uid, TypingIndicatorVisuals.State, out var state);
_sprite.LayerSetVisible((uid, args.Sprite), layer, state != TypingIndicatorState.None);
switch (state)
{
case TypingIndicatorState.Idle:
_sprite.LayerSetRsiState((uid, args.Sprite), layer, proto.IdleState);
break;
case TypingIndicatorState.Typing:
_sprite.LayerSetRsiState((uid, args.Sprite), layer, proto.TypingState);
break;
}
}
}

View File

@@ -5,6 +5,8 @@ namespace Content.Client.Chemistry.EntitySystems;
public sealed class PillSystem : EntitySystem
{
[Dependency] private readonly SpriteSystem _sprite = default!;
public override void Initialize()
{
base.Initialize();
@@ -16,9 +18,9 @@ public sealed class PillSystem : EntitySystem
if (!TryComp(uid, out SpriteComponent? sprite))
return;
if (!sprite.TryGetLayer(0, out var layer))
if (!_sprite.TryGetLayer((uid, sprite), 0, out var layer, false))
return;
layer.SetState($"pill{component.PillType + 1}");
_sprite.LayerSetRsiState(layer, $"pill{component.PillType + 1}");
}
}

View File

@@ -116,7 +116,10 @@ namespace Content.Client.Chemistry.UI
("1", ChemMasterReagentAmount.U1, StyleBase.ButtonOpenBoth),
("5", ChemMasterReagentAmount.U5, StyleBase.ButtonOpenBoth),
("10", ChemMasterReagentAmount.U10, StyleBase.ButtonOpenBoth),
("15", ChemMasterReagentAmount.U15, StyleBase.ButtonOpenBoth),
("20", ChemMasterReagentAmount.U20, StyleBase.ButtonOpenBoth),
("25", ChemMasterReagentAmount.U25, StyleBase.ButtonOpenBoth),
("30", ChemMasterReagentAmount.U30, StyleBase.ButtonOpenBoth),
("50", ChemMasterReagentAmount.U50, StyleBase.ButtonOpenBoth),
("100", ChemMasterReagentAmount.U100, StyleBase.ButtonOpenBoth),
(Loc.GetString("chem-master-window-buffer-all-amount"), ChemMasterReagentAmount.All, StyleBase.ButtonOpenLeft),

View File

@@ -44,7 +44,7 @@ public sealed class HyposprayStatusControl : Control
PrevMaxVolume = solution.MaxVolume;
PrevOnlyAffectsMobs = _parent.Comp.OnlyAffectsMobs;
var modeStringLocalized = Loc.GetString(_parent.Comp.OnlyAffectsMobs switch
var modeStringLocalized = Loc.GetString((_parent.Comp.OnlyAffectsMobs && _parent.Comp.CanContainerDraw) switch
{
false => "hypospray-all-mode-text",
true => "hypospray-mobs-only-mode-text",

View File

@@ -1,4 +1,5 @@
using Content.Shared.Chemistry;
using Content.Shared.Storage;
using Robust.Client.AutoGenerated;
using Robust.Client.Graphics;
using Robust.Client.UserInterface;
@@ -9,15 +10,15 @@ namespace Content.Client.Chemistry.UI;
[GenerateTypedNameReferences]
public sealed partial class ReagentCardControl : Control
{
public string StorageSlotId { get; }
public Action<string>? OnPressed;
public Action<string>? OnEjectButtonPressed;
public ItemStorageLocation StorageLocation { get; }
public Action<ItemStorageLocation>? OnPressed;
public Action<ItemStorageLocation>? OnEjectButtonPressed;
public ReagentCardControl(ReagentInventoryItem item)
{
RobustXamlLoader.Load(this);
StorageSlotId = item.StorageSlotId;
StorageLocation = item.StorageLocation;
ColorPanel.PanelOverride = new StyleBoxFlat { BackgroundColor = item.ReagentColor };
ReagentNameLabel.Text = item.ReagentLabel;
FillLabel.Text = Loc.GetString("reagent-dispenser-window-quantity-label-text", ("quantity", item.Quantity));;
@@ -26,7 +27,7 @@ public sealed partial class ReagentCardControl : Control
if (item.Quantity == 0.0)
MainButton.Disabled = true;
MainButton.OnPressed += args => OnPressed?.Invoke(StorageSlotId);
EjectButton.OnPressed += args => OnEjectButtonPressed?.Invoke(StorageSlotId);
MainButton.OnPressed += args => OnPressed?.Invoke(StorageLocation);
EjectButton.OnPressed += args => OnEjectButtonPressed?.Invoke(StorageLocation);
}
}

View File

@@ -1,4 +1,5 @@
using Content.Client.Guidebook.Components;
using Content.Client.UserInterface.Controls;
using Content.Shared.Chemistry;
using Content.Shared.Containers.ItemSlots;
using JetBrains.Annotations;
@@ -31,8 +32,7 @@ namespace Content.Client.Chemistry.UI
// Setup window layout/elements
_window = this.CreateWindow<ReagentDispenserWindow>();
_window.Title = EntMan.GetComponent<MetaDataComponent>(Owner).EntityName;
_window.HelpGuidebookIds = EntMan.GetComponent<GuideHelpComponent>(Owner).Guides;
_window.SetInfoFromEntity(EntMan, Owner);
// Setup static button actions.
_window.EjectButton.OnPressed += _ => SendMessage(new ItemSlotButtonPressedEvent(SharedReagentDispenser.OutputSlotName));
@@ -40,8 +40,8 @@ namespace Content.Client.Chemistry.UI
_window.AmountGrid.OnButtonPressed += s => SendMessage(new ReagentDispenserSetDispenseAmountMessage(s));
_window.OnDispenseReagentButtonPressed += (id) => SendMessage(new ReagentDispenserDispenseReagentMessage(id));
_window.OnEjectJugButtonPressed += (id) => SendMessage(new ItemSlotButtonPressedEvent(id));
_window.OnDispenseReagentButtonPressed += (location) => SendMessage(new ReagentDispenserDispenseReagentMessage(location));
_window.OnEjectJugButtonPressed += (location) => SendMessage(new ReagentDispenserEjectContainerMessage(location));
}
/// <summary>

View File

@@ -2,6 +2,7 @@ using Content.Client.Stylesheets;
using Content.Client.UserInterface.Controls;
using Content.Shared.Chemistry;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.Storage;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
@@ -18,8 +19,8 @@ namespace Content.Client.Chemistry.UI
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly IEntityManager _entityManager = default!;
public event Action<string>? OnDispenseReagentButtonPressed;
public event Action<string>? OnEjectJugButtonPressed;
public event Action<ItemStorageLocation>? OnDispenseReagentButtonPressed;
public event Action<ItemStorageLocation>? OnEjectJugButtonPressed;
/// <summary>
/// Create and initialize the dispenser UI client-side. Creates the basic layout,

View File

@@ -11,6 +11,7 @@ namespace Content.Client.Chemistry.Visualizers;
public sealed class FoamVisualizerSystem : VisualizerSystem<FoamVisualsComponent>
{
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
public override void Initialize()
{
@@ -71,7 +72,7 @@ public sealed class FoamVisualizerSystem : VisualizerSystem<FoamVisualsComponent
return;
if (TryComp<SpriteComponent>(uid, out var sprite))
sprite.Visible = false;
_sprite.SetVisible((uid, sprite), false);
}
}

View File

@@ -15,8 +15,8 @@ public sealed class SmokeVisualizerSystem : VisualizerSystem<SmokeVisualsCompone
{
if (args.Sprite == null)
return;
if(!AppearanceSystem.TryGetData<Color>(uid, SmokeVisuals.Color, out var color))
if (!AppearanceSystem.TryGetData<Color>(uid, SmokeVisuals.Color, out var color))
return;
args.Sprite.Color = color;
SpriteSystem.SetColor((uid, args.Sprite), color);
}
}

View File

@@ -16,6 +16,7 @@ public sealed class SolutionContainerVisualsSystem : VisualizerSystem<SolutionCo
{
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly ItemSystem _itemSystem = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
public override void Initialize()
{
@@ -49,7 +50,7 @@ public sealed class SolutionContainerVisualsSystem : VisualizerSystem<SolutionCo
if (args.Sprite == null)
return;
if (!args.Sprite.LayerMapTryGet(component.Layer, out var fillLayer))
if (!_sprite.LayerMapTryGet((uid, args.Sprite), component.Layer, out var fillLayer, false))
return;
var maxFillLevels = component.MaxFillLevels;
@@ -67,9 +68,9 @@ public sealed class SolutionContainerVisualsSystem : VisualizerSystem<SolutionCo
}
if (component.Metamorphic)
{
if (args.Sprite.LayerMapTryGet(component.BaseLayer, out var baseLayer))
if (_sprite.LayerMapTryGet((uid, args.Sprite), component.BaseLayer, out var baseLayer, false))
{
var hasOverlay = args.Sprite.LayerMapTryGet(component.OverlayLayer, out var overlayLayer);
var hasOverlay = _sprite.LayerMapTryGet((uid, args.Sprite), component.OverlayLayer, out var overlayLayer, false);
if (AppearanceSystem.TryGetData<string>(uid, SolutionContainerVisuals.BaseOverride,
out var baseOverride,
@@ -79,35 +80,35 @@ public sealed class SolutionContainerVisualsSystem : VisualizerSystem<SolutionCo
if (reagentProto?.MetamorphicSprite is { } sprite)
{
args.Sprite.LayerSetSprite(baseLayer, sprite);
_sprite.LayerSetSprite((uid, args.Sprite), baseLayer, sprite);
if (reagentProto.MetamorphicMaxFillLevels > 0)
{
args.Sprite.LayerSetVisible(fillLayer, true);
_sprite.LayerSetVisible((uid, args.Sprite), fillLayer, true);
maxFillLevels = reagentProto.MetamorphicMaxFillLevels;
fillBaseName = reagentProto.MetamorphicFillBaseName;
changeColor = reagentProto.MetamorphicChangeColor;
fillSprite = sprite;
}
else
args.Sprite.LayerSetVisible(fillLayer, false);
_sprite.LayerSetVisible((uid, args.Sprite), fillLayer, false);
if (hasOverlay)
args.Sprite.LayerSetVisible(overlayLayer, false);
_sprite.LayerSetVisible((uid, args.Sprite), overlayLayer, false);
}
else
{
args.Sprite.LayerSetVisible(fillLayer, true);
_sprite.LayerSetVisible((uid, args.Sprite), fillLayer, true);
if (hasOverlay)
args.Sprite.LayerSetVisible(overlayLayer, true);
_sprite.LayerSetVisible((uid, args.Sprite), overlayLayer, true);
if (component.MetamorphicDefaultSprite != null)
args.Sprite.LayerSetSprite(baseLayer, component.MetamorphicDefaultSprite);
_sprite.LayerSetSprite((uid, args.Sprite), baseLayer, component.MetamorphicDefaultSprite);
}
}
}
}
else
{
args.Sprite.LayerSetVisible(fillLayer, true);
_sprite.LayerSetVisible((uid, args.Sprite), fillLayer, true);
}
var closestFillSprite = ContentHelpers.RoundToLevels(fraction, 1, maxFillLevels + 1);
@@ -119,25 +120,25 @@ public sealed class SolutionContainerVisualsSystem : VisualizerSystem<SolutionCo
var stateName = fillBaseName + closestFillSprite;
if (fillSprite != null)
args.Sprite.LayerSetSprite(fillLayer, fillSprite);
args.Sprite.LayerSetState(fillLayer, stateName);
_sprite.LayerSetSprite((uid, args.Sprite), fillLayer, fillSprite);
_sprite.LayerSetRsiState((uid, args.Sprite), fillLayer, stateName);
if (changeColor && AppearanceSystem.TryGetData<Color>(uid, SolutionContainerVisuals.Color, out var color, args.Component))
args.Sprite.LayerSetColor(fillLayer, color);
_sprite.LayerSetColor((uid, args.Sprite), fillLayer, color);
else
args.Sprite.LayerSetColor(fillLayer, Color.White);
_sprite.LayerSetColor((uid, args.Sprite), fillLayer, Color.White);
}
else
{
if (component.EmptySpriteName == null)
args.Sprite.LayerSetVisible(fillLayer, false);
_sprite.LayerSetVisible((uid, args.Sprite), fillLayer, false);
else
{
args.Sprite.LayerSetState(fillLayer, component.EmptySpriteName);
_sprite.LayerSetRsiState((uid, args.Sprite), fillLayer, component.EmptySpriteName);
if (changeColor)
args.Sprite.LayerSetColor(fillLayer, component.EmptySpriteColor);
_sprite.LayerSetColor((uid, args.Sprite), fillLayer, component.EmptySpriteColor);
else
args.Sprite.LayerSetColor(fillLayer, Color.White);
_sprite.LayerSetColor((uid, args.Sprite), fillLayer, Color.White);
}
}

View File

@@ -52,7 +52,7 @@ public sealed class VaporVisualizerSystem : VisualizerSystem<VaporVisualsCompone
{
if (AppearanceSystem.TryGetData<Color>(uid, VaporVisuals.Color, out var color, args.Component) && args.Sprite != null)
{
args.Sprite.Color = color;
SpriteSystem.SetColor((uid, args.Sprite), color);
}
}
}

View File

@@ -77,10 +77,10 @@ public sealed class ClickableSystem : EntitySystem
drawDepth = sprite.DrawDepth;
renderOrder = sprite.RenderOrder;
var (spritePos, spriteRot) = _transforms.GetWorldPositionRotation(transform);
var spriteBB = sprite.CalculateRotatedBoundingBox(spritePos, spriteRot, eye.Rotation);
var spriteBB = _sprites.CalculateBounds((entity.Owner, sprite), spritePos, spriteRot, eye.Rotation);
bottom = Matrix3Helpers.CreateRotation(eye.Rotation).TransformBox(spriteBB).Bottom;
Matrix3x2.Invert(sprite.GetLocalMatrix(), out var invSpriteMatrix);
Matrix3x2.Invert(sprite.LocalMatrix, out var invSpriteMatrix);
// This should have been the rotation of the sprite relative to the screen, but this is not the case with no-rot or directional sprites.
var relativeRotation = (spriteRot + eye.Rotation).Reduced().FlipPositive();
@@ -107,7 +107,7 @@ public sealed class ClickableSystem : EntitySystem
if (layer.Texture != null)
{
// Convert to image coordinates
var imagePos = (Vector2i) (localPos * EyeManager.PixelsPerMeter * new Vector2(1, -1) + layer.Texture.Size / 2f);
var imagePos = (Vector2i)(localPos * EyeManager.PixelsPerMeter * new Vector2(1, -1) + layer.Texture.Size / 2f);
if (_clickMapManager.IsOccluding(layer.Texture, imagePos))
return true;
@@ -125,7 +125,7 @@ public sealed class ClickableSystem : EntitySystem
var layerLocal = Vector2.Transform(localPos, inverseMatrix);
// Convert to image coordinates
var layerImagePos = (Vector2i) (layerLocal * EyeManager.PixelsPerMeter * new Vector2(1, -1) + rsiState.Size / 2f);
var layerImagePos = (Vector2i)(layerLocal * EyeManager.PixelsPerMeter * new Vector2(1, -1) + rsiState.Size / 2f);
// Next, to get the right click map we need the "direction" of this layer that is actually being used to draw the sprite on the screen.
// This **can** differ from the dir defined before, but can also just be the same.

View File

@@ -5,6 +5,8 @@ namespace Content.Client.Clock;
public sealed class ClockSystem : SharedClockSystem
{
[Dependency] private readonly SpriteSystem _sprite = default!;
public override void Update(float frameTime)
{
base.Update(frameTime);
@@ -12,15 +14,15 @@ public sealed class ClockSystem : SharedClockSystem
var query = EntityQueryEnumerator<ClockComponent, SpriteComponent>();
while (query.MoveNext(out var uid, out var comp, out var sprite))
{
if (!sprite.LayerMapTryGet(ClockVisualLayers.HourHand, out var hourLayer) ||
!sprite.LayerMapTryGet(ClockVisualLayers.MinuteHand, out var minuteLayer))
if (!_sprite.LayerMapTryGet((uid, sprite), ClockVisualLayers.HourHand, out var hourLayer, false) ||
!_sprite.LayerMapTryGet((uid, sprite), ClockVisualLayers.MinuteHand, out var minuteLayer, false))
continue;
var time = GetClockTime((uid, comp));
var hourState = $"{comp.HoursBase}{time.Hours % 12}";
var minuteState = $"{comp.MinutesBase}{time.Minutes / 5}";
sprite.LayerSetState(hourLayer, hourState);
sprite.LayerSetState(minuteLayer, minuteState);
_sprite.LayerSetRsiState((uid, sprite), hourLayer, hourState);
_sprite.LayerSetRsiState((uid, sprite), minuteLayer, minuteState);
}
}
}

View File

@@ -40,7 +40,7 @@ public sealed class ClientClothingSystem : ClothingSystem
{Jumpsuit, "INNERCLOTHING"},
{"neck", "NECK"},
{"back", "BACKPACK"},
{"belt1", "BELT1"},
{"belt", "BELT"},
{"belt2", "BELT2"},
{"gloves", "HAND"},
{"shoes", "FEET"},
@@ -48,8 +48,6 @@ public sealed class ClientClothingSystem : ClothingSystem
{"pocket1", "POCKET1"},
{"pocket2", "POCKET2"},
{"suitstorage", "SUITSTORAGE"},
{"ring1", "RING1"},
{"ring2", "RING2"},
{"pants", "PANTS"},
{"shirt", "SHIRT"},
{"cloak", "CLOAK"},
@@ -59,6 +57,7 @@ public sealed class ClientClothingSystem : ClothingSystem
[Dependency] private readonly IResourceCache _cache = default!;
[Dependency] private readonly InventorySystem _inventorySystem = default!;
[Dependency] private readonly DisplacementMapSystem _displacement = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
public override void Initialize()
{
@@ -81,10 +80,10 @@ public sealed class ClientClothingSystem : ClothingSystem
UpdateAllSlots(uid, component);
// No clothing equipped -> make sure the layer is hidden, though this should already be handled by on-unequip.
if (args.Sprite.LayerMapTryGet(HumanoidVisualLayers.StencilMask, out var layer))
if (_sprite.LayerMapTryGet((uid, args.Sprite), HumanoidVisualLayers.StencilMask, out var layer, false))
{
DebugTools.Assert(!args.Sprite[layer].Visible);
args.Sprite.LayerSetVisible(layer, false);
_sprite.LayerSetVisible((uid, args.Sprite), layer, false);
}
}
@@ -199,9 +198,9 @@ public sealed class ClientClothingSystem : ClothingSystem
RenderEquipment(uid, item, clothing.InSlot, component, null, clothing);
}
private void OnDidUnequip(EntityUid uid, SpriteComponent component, DidUnequipEvent args)
private void OnDidUnequip(Entity<SpriteComponent> entity, ref DidUnequipEvent args)
{
if (!TryComp(uid, out InventorySlotsComponent? inventorySlots))
if (!TryComp(entity, out InventorySlotsComponent? inventorySlots))
return;
if (!inventorySlots.VisualLayerKeys.TryGetValue(args.Slot, out var revealedLayers))
@@ -211,7 +210,7 @@ public sealed class ClientClothingSystem : ClothingSystem
// may eventually bloat the player with lots of invisible layers.
foreach (var layer in revealedLayers)
{
component.RemoveLayer(layer);
_sprite.RemoveLayer(entity.AsNullable(), layer);
}
revealedLayers.Clear();
}
@@ -254,7 +253,7 @@ public sealed class ClientClothingSystem : ClothingSystem
{
foreach (var key in revealedLayers)
{
sprite.RemoveLayer(key);
_sprite.RemoveLayer((equipee, sprite), key);
}
revealedLayers.Clear();
}
@@ -275,7 +274,7 @@ public sealed class ClientClothingSystem : ClothingSystem
// temporary, until layer draw depths get added. Basically: a layer with the key "slot" is being used as a
// bookmark to determine where in the list of layers we should insert the clothing layers.
bool slotLayerExists = sprite.LayerMapTryGet(slot, out var index);
var slotLayerExists = _sprite.LayerMapTryGet((equipee, sprite), slot, out var index, false);
// Select displacement maps
var displacementData = inventory.Displacements.GetValueOrDefault(slot); //Default unsexed map
@@ -309,16 +308,16 @@ public sealed class ClientClothingSystem : ClothingSystem
{
index++;
// note that every insertion requires reshuffling & remapping all the existing layers.
sprite.AddBlankLayer(index);
sprite.LayerMapSet(key, index);
_sprite.AddBlankLayer((equipee, sprite), index);
_sprite.LayerMapSet((equipee, sprite), key, index);
if (layerData.Color != null)
sprite.LayerSetColor(key, layerData.Color.Value);
_sprite.LayerSetColor((equipee, sprite), key, layerData.Color.Value);
if (layerData.Scale != null)
sprite.LayerSetScale(key, layerData.Scale.Value);
_sprite.LayerSetScale((equipee, sprite), key, layerData.Scale.Value);
}
else
index = sprite.LayerMapReserveBlank(key);
index = _sprite.LayerMapReserve((equipee, sprite), key);
if (sprite[index] is not Layer layer)
continue;
@@ -329,11 +328,11 @@ public sealed class ClientClothingSystem : ClothingSystem
&& layer.RSI == null
&& TryComp(equipment, out SpriteComponent? clothingSprite))
{
layer.SetRsi(clothingSprite.BaseRSI);
_sprite.LayerSetRsi(layer, clothingSprite.BaseRSI);
}
sprite.LayerSetData(index, layerData);
layer.Offset += slotDef.Offset;
_sprite.LayerSetData((equipee, sprite), index, layerData);
_sprite.LayerSetOffset(layer, layer.Offset + slotDef.Offset);
if (displacementData is not null)
{
@@ -341,7 +340,7 @@ public sealed class ClientClothingSystem : ClothingSystem
if (layerData.State is not null && inventory.SpeciesId is not null && layerData.State.EndsWith(inventory.SpeciesId))
continue;
if (_displacement.TryAddDisplacement(displacementData, sprite, index, key, out var displacementKey))
if (_displacement.TryAddDisplacement(displacementData, (equipee, sprite), index, key, out var displacementKey))
{
revealedLayers.Add(displacementKey);
index++;

View File

@@ -32,7 +32,7 @@ public sealed class FlippableClothingVisualizerSystem : VisualizerSystem<Flippab
if (clothing.MappedLayer == null ||
!AppearanceSystem.TryGetData<bool>(ent, FoldableSystem.FoldedVisuals.State, out var folding) ||
!sprite.LayerMapTryGet(folding ? ent.Comp.FoldingLayer : ent.Comp.UnfoldingLayer, out var idx))
!SpriteSystem.LayerMapTryGet((ent.Owner, sprite), folding ? ent.Comp.FoldingLayer : ent.Comp.UnfoldingLayer, out var idx, false))
return;
// add each layer to the visuals

View File

@@ -12,7 +12,6 @@ namespace Content.Client.Clothing.Systems;
public sealed class ChameleonClothingSystem : SharedChameleonClothingSystem
{
[Dependency] private readonly IPrototypeManager _proto = default!;
[Dependency] private readonly IComponentFactory _factory = default!;
private static readonly SlotFlags[] IgnoredSlots =
{
@@ -48,14 +47,14 @@ public sealed class ChameleonClothingSystem : SharedChameleonClothingSystem
{
base.UpdateSprite(uid, proto);
if (TryComp(uid, out SpriteComponent? sprite)
&& proto.TryGetComponent(out SpriteComponent? otherSprite, _factory))
&& proto.TryGetComponent(out SpriteComponent? otherSprite, Factory))
{
sprite.CopyFrom(otherSprite);
}
// Edgecase for PDAs to include visuals when UI is open
if (TryComp(uid, out PdaBorderColorComponent? borderColor)
&& proto.TryGetComponent(out PdaBorderColorComponent? otherBorderColor, _factory))
&& proto.TryGetComponent(out PdaBorderColorComponent? otherBorderColor, Factory))
{
borderColor.BorderColor = otherBorderColor.BorderColor;
borderColor.AccentHColor = otherBorderColor.AccentHColor;
@@ -89,7 +88,7 @@ public sealed class ChameleonClothingSystem : SharedChameleonClothingSystem
// check if this is valid clothing
if (!IsValidTarget(proto))
continue;
if (!proto.TryGetComponent(out ClothingComponent? item, _factory))
if (!proto.TryGetComponent(out ClothingComponent? item, Factory))
continue;
// sort item by their slot flags

View File

@@ -12,7 +12,6 @@ namespace Content.Client.Clothing.UI;
[UsedImplicitly]
public sealed class ChameleonBoundUserInterface : BoundUserInterface
{
[Dependency] private readonly IComponentFactory _factory = default!;
[Dependency] private readonly IPrototypeManager _proto = default!;
private readonly ChameleonClothingSystem _chameleon;
private readonly TagSystem _tag;
@@ -49,7 +48,7 @@ public sealed class ChameleonBoundUserInterface : BoundUserInterface
if (string.IsNullOrEmpty(target) || !_proto.TryIndex(target, out EntityPrototype? proto))
continue;
if (!proto.TryGetComponent(out TagComponent? tag, _factory) || !_tag.HasTag(tag, st.RequiredTag))
if (!proto.TryGetComponent(out TagComponent? tag, EntMan.ComponentFactory) || !_tag.HasTag(tag, st.RequiredTag))
continue;
newTargets.Add(target);

View File

@@ -18,23 +18,19 @@ public sealed class HideMechanismsCommand : LocalizedCommands
public override void Execute(IConsoleShell shell, string argStr, string[] args)
{
var containerSys = _entityManager.System<SharedContainerSystem>();
var query = _entityManager.AllEntityQueryEnumerator<OrganComponent>();
var spriteSys = _entityManager.System<SpriteSystem>();
var query = _entityManager.AllEntityQueryEnumerator<OrganComponent, SpriteComponent>();
while (query.MoveNext(out var uid, out _))
while (query.MoveNext(out var uid, out _, out var sprite))
{
if (!_entityManager.TryGetComponent(uid, out SpriteComponent? sprite))
{
continue;
}
sprite.ContainerOccluded = false;
spriteSys.SetContainerOccluded((uid, sprite), false);
var tempParent = uid;
while (containerSys.TryGetContainingContainer((tempParent, null, null), out var container))
{
if (!container.ShowContents)
{
sprite.ContainerOccluded = true;
spriteSys.SetContainerOccluded((uid, sprite), true);
break;
}

View File

@@ -16,11 +16,12 @@ public sealed class ShowMechanismsCommand : LocalizedCommands
public override void Execute(IConsoleShell shell, string argStr, string[] args)
{
var spriteSys = _entManager.System<SpriteSystem>();
var query = _entManager.AllEntityQueryEnumerator<OrganComponent, SpriteComponent>();
while (query.MoveNext(out _, out var sprite))
while (query.MoveNext(out var uid, out _, out var sprite))
{
sprite.ContainerOccluded = false;
spriteSys.SetContainerOccluded((uid, sprite), false);
}
}
}

View File

@@ -1,8 +1,10 @@
using System.Linq;
using Content.Shared.Construction.Prototypes;
using Robust.Client.GameObjects;
using Robust.Client.Placement;
using Robust.Client.Utility;
using Robust.Client.ResourceManagement;
using Robust.Shared.Map;
using Robust.Shared.Prototypes;
namespace Content.Client.Construction
{
@@ -45,7 +47,14 @@ namespace Content.Client.Construction
public override void StartHijack(PlacementManager manager)
{
base.StartHijack(manager);
manager.CurrentTextures = _prototype?.Layers.Select(sprite => sprite.DirFrame0()).ToList();
if (_prototype is null || !_constructionSystem.TryGetRecipePrototype(_prototype.ID, out var targetProtoId))
return;
if (!IoCManager.Resolve<IPrototypeManager>().TryIndex(targetProtoId, out EntityPrototype? proto))
return;
manager.CurrentTextures = SpriteComponent.GetPrototypeTextures(proto, IoCManager.Resolve<IResourceCache>()).ToList();
}
}
}

View File

@@ -1,11 +1,10 @@
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Content.Client.Popups;
using Content.Shared.Construction;
using Content.Shared.Construction.Prototypes;
using Content.Shared.Construction.Steps;
using Content.Shared.Examine;
using Content.Shared.Input;
using Content.Shared.Interaction;
using Content.Shared.Wall;
using JetBrains.Annotations;
using Robust.Client.GameObjects;
@@ -15,6 +14,7 @@ using Robust.Shared.Input.Binding;
using Robust.Shared.Map;
using Robust.Shared.Player;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
namespace Content.Client.Construction
{
@@ -25,14 +25,16 @@ namespace Content.Client.Construction
public sealed class ConstructionSystem : SharedConstructionSystem
{
[Dependency] private readonly IPlayerManager _playerManager = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly ExamineSystemShared _examineSystem = default!;
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
[Dependency] private readonly PopupSystem _popupSystem = default!;
private readonly Dictionary<int, EntityUid> _ghosts = new();
private readonly Dictionary<string, ConstructionGuide> _guideCache = new();
private readonly Dictionary<string, string> _recipesMetadataCache = [];
public bool CraftingEnabled { get; private set; }
/// <inheritdoc />
@@ -40,6 +42,8 @@ namespace Content.Client.Construction
{
base.Initialize();
WarmupRecipesCache();
UpdatesOutsidePrediction = true;
SubscribeLocalEvent<LocalPlayerAttachedEvent>(HandlePlayerAttached);
SubscribeNetworkEvent<AckStructureConstructionMessage>(HandleAckStructure);
@@ -63,6 +67,77 @@ namespace Content.Client.Construction
ClearGhost(component.GhostId);
}
public bool TryGetRecipePrototype(string constructionProtoId, [NotNullWhen(true)] out string? targetProtoId)
{
if (_recipesMetadataCache.TryGetValue(constructionProtoId, out targetProtoId))
return true;
targetProtoId = null;
return false;
}
private void WarmupRecipesCache()
{
foreach (var constructionProto in PrototypeManager.EnumeratePrototypes<ConstructionPrototype>())
{
if (!PrototypeManager.TryIndex(constructionProto.Graph, out var graphProto))
continue;
if (constructionProto.TargetNode is not { } targetNodeId)
continue;
if (!graphProto.Nodes.TryGetValue(targetNodeId, out var targetNode))
continue;
// Recursion is for wimps.
var stack = new Stack<ConstructionGraphNode>();
stack.Push(targetNode);
do
{
var node = stack.Pop();
// I never realized if this uid affects anything...
// EntityUid? userUid = args.SenderSession.State.ControlledEntity.HasValue
// ? GetEntity(args.SenderSession.State.ControlledEntity.Value)
// : null;
// We try to get the id of the target prototype, if it fails, we try going through the edges.
if (node.Entity.GetId(null, null, new(EntityManager)) is not { } entityId)
{
// If the stack is not empty, there is a high probability that the loop will go to infinity.
if (stack.Count == 0)
{
foreach (var edge in node.Edges)
{
if (graphProto.Nodes.TryGetValue(edge.Target, out var graphNode))
stack.Push(graphNode);
}
}
continue;
}
// If we got the id of the prototype, we exit the “recursion” by clearing the stack.
stack.Clear();
if (!PrototypeManager.TryIndex(constructionProto.ID, out ConstructionPrototype? recipe))
continue;
if (!PrototypeManager.TryIndex(entityId, out var proto))
continue;
var name = recipe.SetName.HasValue ? Loc.GetString(recipe.SetName) : proto.Name;
var desc = recipe.SetDescription.HasValue ? Loc.GetString(recipe.SetDescription) : proto.Description;
recipe.Name = name;
recipe.Description = desc;
_recipesMetadataCache.Add(constructionProto.ID, entityId);
} while (stack.Count > 0);
}
}
private void OnConstructionGuideReceived(ResponseConstructionGuide ev)
{
_guideCache[ev.ConstructionId] = ev.Guide;
@@ -88,7 +163,7 @@ namespace Content.Client.Construction
private void HandleConstructionGhostExamined(EntityUid uid, ConstructionGhostComponent component, ExaminedEvent args)
{
if (component.Prototype == null)
if (component.Prototype?.Name is null)
return;
using (args.PushGroup(nameof(ConstructionGhostComponent)))
@@ -97,7 +172,7 @@ namespace Content.Client.Construction
"construction-ghost-examine-message",
("name", component.Prototype.Name)));
if (!_prototypeManager.TryIndex(component.Prototype.Graph, out ConstructionGraphPrototype? graph))
if (!PrototypeManager.TryIndex(component.Prototype.Graph, out var graph))
return;
var startNode = graph.Nodes[component.Prototype.StartNode];
@@ -198,6 +273,9 @@ namespace Content.Client.Construction
return false;
}
if (!TryGetRecipePrototype(prototype.ID, out var targetProtoId) || !PrototypeManager.TryIndex(targetProtoId, out EntityPrototype? targetProto))
return false;
if (GhostPresent(loc))
return false;
@@ -214,16 +292,43 @@ namespace Content.Client.Construction
comp.GhostId = ghost.GetHashCode();
EntityManager.GetComponent<TransformComponent>(ghost.Value).LocalRotation = dir.ToAngle();
_ghosts.Add(comp.GhostId, ghost.Value);
var sprite = EntityManager.GetComponent<SpriteComponent>(ghost.Value);
sprite.Color = new Color(48, 255, 48, 128);
for (int i = 0; i < prototype.Layers.Count; i++)
var sprite = EntityManager.GetComponent<SpriteComponent>(ghost.Value);
_sprite.SetColor((ghost.Value, sprite), new Color(48, 255, 48, 128));
if (targetProto.TryGetComponent(out IconComponent? icon, EntityManager.ComponentFactory))
{
sprite.AddBlankLayer(i); // There is no way to actually check if this already exists, so we blindly insert a new one
sprite.LayerSetSprite(i, prototype.Layers[i]);
sprite.LayerSetShader(i, "unshaded");
sprite.LayerSetVisible(i, true);
_sprite.AddBlankLayer((ghost.Value, sprite), 0);
_sprite.LayerSetSprite((ghost.Value, sprite), 0, icon.Icon);
sprite.LayerSetShader(0, "unshaded");
_sprite.LayerSetVisible((ghost.Value, sprite), 0, true);
}
else if (targetProto.Components.TryGetValue("Sprite", out _))
{
var dummy = EntityManager.SpawnEntity(targetProtoId, MapCoordinates.Nullspace);
var targetSprite = EntityManager.EnsureComponent<SpriteComponent>(dummy);
EntityManager.System<AppearanceSystem>().OnChangeData(dummy, targetSprite);
for (var i = 0; i < targetSprite.AllLayers.Count(); i++)
{
if (!targetSprite[i].Visible || !targetSprite[i].RsiState.IsValid)
continue;
var rsi = targetSprite[i].Rsi ?? targetSprite.BaseRSI;
if (rsi is null || !rsi.TryGetState(targetSprite[i].RsiState, out var state) ||
state.StateId.Name is null)
continue;
_sprite.AddBlankLayer((ghost.Value, sprite), i);
_sprite.LayerSetSprite((ghost.Value, sprite), i, new SpriteSpecifier.Rsi(rsi.Path, state.StateId.Name));
sprite.LayerSetShader(i, "unshaded");
_sprite.LayerSetVisible((ghost.Value, sprite), i, true);
}
EntityManager.DeleteEntity(dummy);
}
else
return false;
if (prototype.CanBuildInImpassable)
EnsureComp<WallMountComponent>(ghost.Value).Arc = new(Math.Tau);

View File

@@ -9,6 +9,7 @@ namespace Content.Client.Construction;
public sealed class FlatpackSystem : SharedFlatpackSystem
{
[Dependency] private readonly AppearanceSystem _appearance = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
/// <inheritdoc/>
public override void Initialize()
@@ -43,6 +44,6 @@ public sealed class FlatpackSystem : SharedFlatpackSystem
}
if (color != null)
args.Sprite.LayerSetColor(FlatpackVisualLayers.Overlay, color.Value);
_sprite.LayerSetColor((ent.Owner, args.Sprite), FlatpackVisualLayers.Overlay, color.Value);
}
}

View File

@@ -1,11 +1,12 @@
<DefaultWindow xmlns="https://spacestation14.io">
<DefaultWindow xmlns="https://spacestation14.io"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls">
<BoxContainer Orientation="Horizontal" HorizontalExpand="True">
<BoxContainer Orientation="Vertical" MinWidth="243" Margin="0 0 5 0">
<BoxContainer Orientation="Horizontal" HorizontalExpand="True" Margin="0 0 0 5">
<LineEdit Name="SearchBar" PlaceHolder="Search" HorizontalExpand="True"/>
<LineEdit Name="SearchBar" PlaceHolder="{Loc 'construction-menu-search'}" HorizontalExpand="True"/>
<OptionButton Name="OptionCategories" Access="Public" MinSize="130 0"/>
</BoxContainer>
<ItemList Name="Recipes" Access="Public" SelectMode="Single" VerticalExpand="True"/>
<controls:ListContainer Name="Recipes" Access="Public" Group="True" Toggle="True" VerticalExpand="True" />
<ScrollContainer Name="RecipesGridScrollContainer" VerticalExpand="True" Access="Public" Visible="False">
<GridContainer Name="RecipesGrid" Columns="5" Access="Public"/>
</ScrollContainer>
@@ -18,7 +19,7 @@
<Control>
<BoxContainer Orientation="Vertical" HorizontalExpand="True" Margin="0 0 0 5">
<BoxContainer Orientation="Horizontal" Align="Center">
<TextureRect Name="TargetTexture" HorizontalAlignment="Right" Stretch="Keep" Margin="0 0 10 0"/>
<EntityPrototypeView Name="TargetTexture" HorizontalAlignment="Right" Stretch="Fill" Margin="0 0 10 0"/>
<BoxContainer Orientation="Vertical">
<RichTextLabel Name="TargetName"/>
<RichTextLabel Name="TargetDesc"/>

View File

@@ -1,14 +1,11 @@
using System;
using System.Numerics;
using Content.Client.UserInterface.Controls;
using Content.Shared.Construction.Prototypes;
using Robust.Client.AutoGenerated;
using Robust.Client.Graphics;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Graphics;
using Robust.Shared.IoC;
using Robust.Shared.Localization;
using Robust.Shared.Prototypes;
namespace Content.Client.Construction.UI
{
@@ -28,7 +25,7 @@ namespace Content.Client.Construction.UI
bool GridViewButtonPressed { get; set; }
bool BuildButtonPressed { get; set; }
ItemList Recipes { get; }
ListContainer Recipes { get; }
ItemList RecipeStepList { get; }
@@ -36,14 +33,14 @@ namespace Content.Client.Construction.UI
GridContainer RecipesGrid { get; }
event EventHandler<(string search, string catagory)> PopulateRecipes;
event EventHandler<ItemList.Item?> RecipeSelected;
event EventHandler<ConstructionMenu.ConstructionMenuListData?> RecipeSelected;
event EventHandler RecipeFavorited;
event EventHandler<bool> BuildButtonToggled;
event EventHandler<bool> EraseButtonToggled;
event EventHandler ClearAllGhosts;
void ClearRecipeInfo();
void SetRecipeInfo(string name, string description, Texture iconTexture, bool isItem, bool isFavorite);
void SetRecipeInfo(string name, string description, EntityPrototype? targetPrototype, bool isItem, bool isFavorite);
void ResetPlacement();
#region Window Control
@@ -94,8 +91,36 @@ namespace Content.Client.Construction.UI
Title = Loc.GetString("construction-menu-title");
BuildButton.Text = Loc.GetString("construction-menu-place-ghost");
Recipes.OnItemSelected += obj => RecipeSelected?.Invoke(this, obj.ItemList[obj.ItemIndex]);
Recipes.OnItemDeselected += _ => RecipeSelected?.Invoke(this, null);
Recipes.ItemPressed += (_, data) => RecipeSelected?.Invoke(this, data as ConstructionMenuListData);
Recipes.NoItemSelected += () => RecipeSelected?.Invoke(this, null);
Recipes.GenerateItem += (data, button) =>
{
if (data is not ConstructionMenuListData (var prototype, var targetPrototype))
return;
var entProtoView = new EntityPrototypeView()
{
SetSize = new(32f),
Stretch = SpriteView.StretchMode.Fill,
Scale = new(2),
Margin = new(0, 2),
};
entProtoView.SetPrototype(targetPrototype);
var label = new Label()
{
Text = prototype.Name,
Margin = new(5, 0),
};
var box = new BoxContainer();
box.AddChild(entProtoView);
box.AddChild(label);
button.AddChild(box);
button.ToolTip = prototype.Description;
button.AddStyleClass(ListContainer.StyleClassListContainerButton);
};
SearchBar.OnTextChanged += _ =>
PopulateRecipes?.Invoke(this, (SearchBar.Text, Categories[OptionCategories.SelectedId]));
@@ -121,7 +146,7 @@ namespace Content.Client.Construction.UI
public event EventHandler? ClearAllGhosts;
public event EventHandler<(string search, string catagory)>? PopulateRecipes;
public event EventHandler<ItemList.Item?>? RecipeSelected;
public event EventHandler<ConstructionMenuListData?>? RecipeSelected;
public event EventHandler? RecipeFavorited;
public event EventHandler<bool>? BuildButtonToggled;
public event EventHandler<bool>? EraseButtonToggled;
@@ -133,13 +158,17 @@ namespace Content.Client.Construction.UI
}
public void SetRecipeInfo(
string name, string description, Texture iconTexture, bool isItem, bool isFavorite)
string name,
string description,
EntityPrototype? targetPrototype,
bool isItem,
bool isFavorite)
{
BuildButton.Disabled = false;
BuildButton.Text = Loc.GetString(isItem ? "construction-menu-place-ghost" : "construction-menu-craft");
TargetName.SetMessage(name);
TargetDesc.SetMessage(description);
TargetTexture.Texture = iconTexture;
TargetTexture.SetPrototype(targetPrototype?.ID);
FavoriteButton.Visible = true;
FavoriteButton.Text = Loc.GetString(
isFavorite ? "construction-add-favorite-button" : "construction-remove-from-favorite-button");
@@ -150,9 +179,11 @@ namespace Content.Client.Construction.UI
BuildButton.Disabled = true;
TargetName.SetMessage(string.Empty);
TargetDesc.SetMessage(string.Empty);
TargetTexture.Texture = null;
TargetTexture.SetPrototype(null);
FavoriteButton.Visible = false;
RecipeStepList.Clear();
}
public sealed record ConstructionMenuListData(ConstructionPrototype Prototype, EntityPrototype TargetPrototype) : ListData;
}
}

View File

@@ -1,5 +1,6 @@
using System.Linq;
using System.Numerics;
using Content.Client.Lobby;
using Content.Client.Stylesheets;
using Content.Client.UserInterface.Systems.MenuBar.Widgets;
using Content.Shared.Construction.Prototypes;
@@ -10,10 +11,8 @@ using Robust.Client.Placement;
using Robust.Client.Player;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls;
using Robust.Client.Utility;
using Robust.Shared.Enums;
using Robust.Shared.Prototypes;
using static Robust.Client.UserInterface.Controls.BaseButton;
namespace Content.Client.Construction.UI
{
@@ -30,18 +29,21 @@ namespace Content.Client.Construction.UI
[Dependency] private readonly IPlacementManager _placementManager = default!;
[Dependency] private readonly IUserInterfaceManager _uiManager = default!;
[Dependency] private readonly IPlayerManager _playerManager = default!;
[Dependency] private readonly IClientPreferencesManager _preferencesManager = default!;
private readonly SpriteSystem _spriteSystem;
private readonly IConstructionMenuView _constructionView;
private readonly EntityWhitelistSystem _whitelistSystem;
private readonly SpriteSystem _spriteSystem;
private ConstructionSystem? _constructionSystem;
private ConstructionPrototype? _selected;
private List<ConstructionPrototype> _favoritedRecipes = [];
private Dictionary<string, TextureButton> _recipeButtons = new();
private Dictionary<string, ContainerButton> _recipeButtons = new();
private string _selectedCategory = string.Empty;
private string _favoriteCatName = "construction-category-favorites";
private string _forAllCategoryName = "construction-category-all";
private const string FavoriteCatName = "construction-category-favorites";
private const string ForAllCategoryName = "construction-category-all";
private bool CraftingAvailable
{
get => _uiManager.GetActiveUIWidget<GameTopMenuBar>().CraftingButton.Visible;
@@ -98,26 +100,29 @@ namespace Content.Client.Construction.UI
_placementManager.PlacementChanged += OnPlacementChanged;
_constructionView.OnClose += () => _uiManager.GetActiveUIWidget<GameTopMenuBar>().CraftingButton.Pressed = false;
_constructionView.OnClose +=
() => _uiManager.GetActiveUIWidget<GameTopMenuBar>().CraftingButton.Pressed = false;
_constructionView.ClearAllGhosts += (_, _) => _constructionSystem?.ClearAllGhosts();
_constructionView.PopulateRecipes += OnViewPopulateRecipes;
_constructionView.RecipeSelected += OnViewRecipeSelected;
_constructionView.BuildButtonToggled += (_, b) => BuildButtonToggled(b);
_constructionView.EraseButtonToggled += (_, b) =>
{
if (_constructionSystem is null) return;
if (b) _placementManager.Clear();
if (_constructionSystem is null)
return;
if (b)
_placementManager.Clear();
_placementManager.ToggleEraserHijacked(new ConstructionPlacementHijack(_constructionSystem, null));
_constructionView.EraseButtonPressed = b;
};
_constructionView.RecipeFavorited += (_, _) => OnViewFavoriteRecipe();
PopulateCategories();
SetFavorites(_preferencesManager.Preferences?.ConstructionFavorites ?? []);
OnViewPopulateRecipes(_constructionView, (string.Empty, string.Empty));
}
public void OnHudCraftingButtonToggled(ButtonToggledEventArgs args)
public void OnHudCraftingButtonToggled(BaseButton.ButtonToggledEventArgs args)
{
WindowOpen = args.Pressed;
}
@@ -139,7 +144,7 @@ namespace Content.Client.Construction.UI
_constructionView.ResetPlacement();
}
private void OnViewRecipeSelected(object? sender, ItemList.Item? item)
private void OnViewRecipeSelected(object? sender, ConstructionMenu.ConstructionMenuListData? item)
{
if (item is null)
{
@@ -148,12 +153,15 @@ namespace Content.Client.Construction.UI
return;
}
_selected = (ConstructionPrototype) item.Metadata!;
if (_placementManager.IsActive && !_placementManager.Eraser) UpdateGhostPlacement();
_selected = item.Prototype;
if (_placementManager is { IsActive: true, Eraser: false })
UpdateGhostPlacement();
PopulateInfo(_selected);
}
private void OnGridViewRecipeSelected(object? sender, ConstructionPrototype? recipe)
private void OnGridViewRecipeSelected(object? _, ConstructionPrototype? recipe)
{
if (recipe is null)
{
@@ -163,65 +171,21 @@ namespace Content.Client.Construction.UI
}
_selected = recipe;
if (_placementManager.IsActive && !_placementManager.Eraser) UpdateGhostPlacement();
if (_placementManager is { IsActive: true, Eraser: false })
UpdateGhostPlacement();
PopulateInfo(_selected);
}
private void OnViewPopulateRecipes(object? sender, (string search, string catagory) args)
{
var (search, category) = args;
if (_constructionSystem is null)
return;
var recipes = new List<ConstructionPrototype>();
var isEmptyCategory = string.IsNullOrEmpty(category) || category == _forAllCategoryName;
if (isEmptyCategory)
_selectedCategory = string.Empty;
else
_selectedCategory = category;
foreach (var recipe in _prototypeManager.EnumeratePrototypes<ConstructionPrototype>())
{
if (recipe.Hide)
continue;
if (!recipe.CrystallPunkAllowed) //CrystallEdge clearing recipes
continue;
if (_playerManager.LocalSession == null
|| _playerManager.LocalEntity == null
|| _whitelistSystem.IsWhitelistFail(recipe.EntityWhitelist, _playerManager.LocalEntity.Value))
continue;
if (!string.IsNullOrEmpty(search))
{
if (!recipe.Name.ToLowerInvariant().Contains(search.Trim().ToLowerInvariant()))
continue;
}
if (!isEmptyCategory)
{
if (category == _favoriteCatName)
{
if (!_favoritedRecipes.Contains(recipe))
{
continue;
}
}
else if (recipe.Category != category)
{
continue;
}
}
recipes.Add(recipe);
}
recipes.Sort((a, b) => string.Compare(a.Name, b.Name, StringComparison.InvariantCulture));
var actualRecipes = GetAndSortRecipes(args);
var recipesList = _constructionView.Recipes;
recipesList.Clear();
var recipesGrid = _constructionView.RecipesGrid;
recipesGrid.RemoveAllChildren();
@@ -230,60 +194,123 @@ namespace Content.Client.Construction.UI
if (_constructionView.GridViewButtonPressed)
{
foreach (var recipe in recipes)
{
var itemButton = new TextureButton
{
TextureNormal = _spriteSystem.Frame0(recipe.Icon),
VerticalAlignment = Control.VAlignment.Center,
Name = recipe.Name,
ToolTip = recipe.Name,
Scale = new Vector2(1.35f),
ToggleMode = true,
};
var itemButtonPanelContainer = new PanelContainer
{
PanelOverride = new StyleBoxFlat { BackgroundColor = StyleNano.ButtonColorDefault },
Children = { itemButton },
};
itemButton.OnToggled += buttonToggledEventArgs =>
{
SelectGridButton(itemButton, buttonToggledEventArgs.Pressed);
if (buttonToggledEventArgs.Pressed &&
_selected != null &&
_recipeButtons.TryGetValue(_selected.Name, out var oldButton))
{
oldButton.Pressed = false;
SelectGridButton(oldButton, false);
}
OnGridViewRecipeSelected(this, buttonToggledEventArgs.Pressed ? recipe : null);
};
recipesGrid.AddChild(itemButtonPanelContainer);
_recipeButtons[recipe.Name] = itemButton;
var isCurrentButtonSelected = _selected == recipe;
itemButton.Pressed = isCurrentButtonSelected;
SelectGridButton(itemButton, isCurrentButtonSelected);
}
recipesList.PopulateList([]);
PopulateGrid(recipesGrid, actualRecipes);
}
else
{
foreach (var recipe in recipes)
{
recipesList.Add(GetItem(recipe, recipesList));
}
recipesList.PopulateList(actualRecipes);
}
}
private void SelectGridButton(TextureButton button, bool select)
private void PopulateGrid(GridContainer recipesGrid,
IEnumerable<ConstructionMenu.ConstructionMenuListData> actualRecipes)
{
foreach (var recipe in actualRecipes)
{
var protoView = new EntityPrototypeView()
{
Scale = new Vector2(1.2f),
};
protoView.SetPrototype(recipe.TargetPrototype);
var itemButton = new ContainerButton()
{
VerticalAlignment = Control.VAlignment.Center,
Name = recipe.TargetPrototype.Name,
ToolTip = recipe.TargetPrototype.Name,
ToggleMode = true,
Children = { protoView },
};
var itemButtonPanelContainer = new PanelContainer
{
PanelOverride = new StyleBoxFlat { BackgroundColor = StyleNano.ButtonColorDefault },
Children = { itemButton },
};
itemButton.OnToggled += buttonToggledEventArgs =>
{
SelectGridButton(itemButton, buttonToggledEventArgs.Pressed);
if (buttonToggledEventArgs.Pressed &&
_selected != null &&
_recipeButtons.TryGetValue(_selected.Name!, out var oldButton))
{
oldButton.Pressed = false;
SelectGridButton(oldButton, false);
}
OnGridViewRecipeSelected(this, buttonToggledEventArgs.Pressed ? recipe.Prototype : null);
};
recipesGrid.AddChild(itemButtonPanelContainer);
_recipeButtons[recipe.Prototype.Name!] = itemButton;
var isCurrentButtonSelected = _selected == recipe.Prototype;
itemButton.Pressed = isCurrentButtonSelected;
SelectGridButton(itemButton, isCurrentButtonSelected);
}
}
private List<ConstructionMenu.ConstructionMenuListData> GetAndSortRecipes((string, string) args)
{
var recipes = new List<ConstructionMenu.ConstructionMenuListData>();
var (search, category) = args;
var isEmptyCategory = string.IsNullOrEmpty(category) || category == ForAllCategoryName;
_selectedCategory = isEmptyCategory ? string.Empty : category;
foreach (var recipe in _prototypeManager.EnumeratePrototypes<ConstructionPrototype>())
{
if (!recipe.CrystallPunkAllowed) //CrystallEdge filter vanilla recipes
continue;
if (recipe.Hide)
continue;
if (_playerManager.LocalSession == null
|| _playerManager.LocalEntity == null
|| _whitelistSystem.IsWhitelistFail(recipe.EntityWhitelist, _playerManager.LocalEntity.Value))
continue;
if (!string.IsNullOrEmpty(search) && (recipe.Name is { } name &&
!name.Contains(search.Trim(),
StringComparison.InvariantCultureIgnoreCase)))
continue;
if (!isEmptyCategory)
{
if ((category != FavoriteCatName || !_favoritedRecipes.Contains(recipe)) &&
recipe.Category != category)
continue;
}
if (!_constructionSystem!.TryGetRecipePrototype(recipe.ID, out var targetProtoId))
{
Logger.Error("Cannot find the target prototype in the recipe cache with the id \"{0}\" of {1}.",
recipe.ID,
nameof(ConstructionPrototype));
continue;
}
if (!_prototypeManager.TryIndex(targetProtoId, out EntityPrototype? proto))
continue;
recipes.Add(new(recipe, proto));
}
recipes.Sort(
(a, b) => string.Compare(a.Prototype.Name, b.Prototype.Name, StringComparison.InvariantCulture));
return recipes;
}
private void SelectGridButton(BaseButton button, bool select)
{
if (button.Parent is not PanelContainer buttonPanel)
return;
button.Modulate = select ? Color.Green : Color.White;
button.Modulate = select ? Color.Green : Color.Transparent;
var buttonColor = select ? StyleNano.ButtonColorDefault : Color.Transparent;
buttonPanel.PanelOverride = new StyleBoxFlat { BackgroundColor = buttonColor };
}
@@ -305,12 +332,12 @@ namespace Content.Client.Construction.UI
// hard-coded to show all recipes
var idx = 0;
categoriesArray[idx++] = _forAllCategoryName;
categoriesArray[idx++] = ForAllCategoryName;
// hard-coded to show favorites if it need
if (isFavorites)
{
categoriesArray[idx++] = _favoriteCatName;
categoriesArray[idx++] = FavoriteCatName;
}
var sortedProtoCategories = uniqueCategories.OrderBy(Loc.GetString);
@@ -328,18 +355,31 @@ namespace Content.Client.Construction.UI
if (!string.IsNullOrEmpty(selectCategory) && selectCategory == categoriesArray[i])
_constructionView.OptionCategories.SelectId(i);
}
_constructionView.Categories = categoriesArray;
}
private void PopulateInfo(ConstructionPrototype prototype)
private void PopulateInfo(ConstructionPrototype? prototype)
{
if (_constructionSystem is null)
return;
_constructionView.ClearRecipeInfo();
if (prototype is null)
return;
if (!_constructionSystem.TryGetRecipePrototype(prototype.ID, out var targetProtoId))
return;
if (!_prototypeManager.TryIndex(targetProtoId, out EntityPrototype? proto))
return;
_constructionView.SetRecipeInfo(
prototype.Name, prototype.Description, _spriteSystem.Frame0(prototype.Icon),
prototype.Name!,
prototype.Description!,
proto,
prototype.Type != ConstructionType.Item,
!_favoritedRecipes.Contains(prototype));
@@ -352,16 +392,17 @@ namespace Content.Client.Construction.UI
if (_constructionSystem?.GetGuide(prototype) is not { } guide)
return;
foreach (var entry in guide.Entries)
{
var text = entry.Arguments != null
? Loc.GetString(entry.Localization, entry.Arguments) : Loc.GetString(entry.Localization);
? Loc.GetString(entry.Localization, entry.Arguments)
: Loc.GetString(entry.Localization);
if (entry.EntryNumber is { } number)
{
text = Loc.GetString("construction-presenter-step-wrapper",
("step-number", number), ("text", text));
("step-number", number),
("text", text));
}
// The padding needs to be applied regardless of text length... (See PadLeft documentation)
@@ -372,23 +413,12 @@ namespace Content.Client.Construction.UI
}
}
private ItemList.Item GetItem(ConstructionPrototype recipe, ItemList itemList)
{
return new(itemList)
{
Metadata = recipe,
Text = recipe.Name,
Icon = _spriteSystem.Frame0(recipe.Icon),
TooltipEnabled = true,
TooltipText = recipe.Description,
};
}
private void BuildButtonToggled(bool pressed)
{
if (pressed)
{
if (_selected == null) return;
if (_selected == null)
return;
// not bound to a construction system
if (_constructionSystem is null)
@@ -405,10 +435,11 @@ namespace Content.Client.Construction.UI
}
_placementManager.BeginPlacing(new PlacementInformation
{
IsTile = false,
PlacementOption = _selected.PlacementMode
}, new ConstructionPlacementHijack(_constructionSystem, _selected));
{
IsTile = false,
PlacementOption = _selected.PlacementMode
},
new ConstructionPlacementHijack(_constructionSystem, _selected));
UpdateGhostPlacement();
}
@@ -432,44 +463,69 @@ namespace Content.Client.Construction.UI
var constructSystem = _systemManager.GetEntitySystem<ConstructionSystem>();
_placementManager.BeginPlacing(new PlacementInformation()
{
IsTile = false,
PlacementOption = _selected.PlacementMode,
}, new ConstructionPlacementHijack(constructSystem, _selected));
{
IsTile = false,
PlacementOption = _selected.PlacementMode,
},
new ConstructionPlacementHijack(constructSystem, _selected));
_constructionView.BuildButtonPressed = true;
}
private void OnSystemLoaded(object? sender, SystemChangedArgs args)
{
if (args.System is ConstructionSystem system) SystemBindingChanged(system);
if (args.System is ConstructionSystem system)
SystemBindingChanged(system);
}
private void OnSystemUnloaded(object? sender, SystemChangedArgs args)
{
if (args.System is ConstructionSystem) SystemBindingChanged(null);
if (args.System is ConstructionSystem)
SystemBindingChanged(null);
}
private void OnViewFavoriteRecipe()
{
if (_selected is not ConstructionPrototype recipe)
if (_selected is null)
return;
if (!_favoritedRecipes.Remove(_selected))
_favoritedRecipes.Add(_selected);
if (_selectedCategory == _favoriteCatName)
if (_selectedCategory == FavoriteCatName)
{
if (_favoritedRecipes.Count > 0)
OnViewPopulateRecipes(_constructionView, (string.Empty, _favoriteCatName));
else
OnViewPopulateRecipes(_constructionView, (string.Empty, string.Empty));
OnViewPopulateRecipes(_constructionView,
_favoritedRecipes.Count > 0 ? (string.Empty, FavoriteCatName) : (string.Empty, string.Empty));
}
var newFavorites = new List<ProtoId<ConstructionPrototype>>(_favoritedRecipes.Count);
foreach (var recipe in _favoritedRecipes)
newFavorites.Add(recipe.ID);
_preferencesManager.UpdateConstructionFavorites(newFavorites);
PopulateInfo(_selected);
PopulateCategories(_selectedCategory);
}
public void SetFavorites(IReadOnlyList<ProtoId<ConstructionPrototype>> favorites)
{
_favoritedRecipes.Clear();
foreach (var id in favorites)
{
if (_prototypeManager.TryIndex(id, out ConstructionPrototype? recipe, logError: false))
_favoritedRecipes.Add(recipe);
}
if (_selectedCategory == FavoriteCatName)
{
OnViewPopulateRecipes(_constructionView,
_favoritedRecipes.Count > 0 ? (string.Empty, FavoriteCatName) : (string.Empty, string.Empty));
}
PopulateCategories(_selectedCategory);
}
private void SystemBindingChanged(ConstructionSystem? newSystem)
{
if (newSystem is null)
@@ -495,6 +551,9 @@ namespace Content.Client.Construction.UI
private void BindToSystem(ConstructionSystem system)
{
_constructionSystem = system;
OnViewPopulateRecipes(_constructionView, (string.Empty, string.Empty));
system.ToggleCraftingWindow += SystemOnToggleMenu;
system.FlipConstructionPrototype += SystemFlipConstructionPrototype;
system.CraftingAvailabilityChanged += SystemCraftingAvailabilityChanged;
@@ -536,7 +595,8 @@ namespace Content.Client.Construction.UI
if (IsAtFront)
{
WindowOpen = false;
_uiManager.GetActiveUIWidget<GameTopMenuBar>().CraftingButton.SetClickPressed(false); // This does not call CraftingButtonToggled
_uiManager.GetActiveUIWidget<GameTopMenuBar>()
.CraftingButton.SetClickPressed(false); // This does not call CraftingButtonToggled
}
else
_constructionView.MoveToFront();
@@ -544,7 +604,8 @@ namespace Content.Client.Construction.UI
else
{
WindowOpen = true;
_uiManager.GetActiveUIWidget<GameTopMenuBar>().CraftingButton.SetClickPressed(true); // This does not call CraftingButtonToggled
_uiManager.GetActiveUIWidget<GameTopMenuBar>()
.CraftingButton.SetClickPressed(true); // This does not call CraftingButtonToggled
}
}

View File

@@ -4,12 +4,14 @@ using Content.Shared.Cuffs.Components;
using Content.Shared.Humanoid;
using Robust.Client.GameObjects;
using Robust.Shared.GameStates;
using Robust.Shared.Utility;
namespace Content.Client.Cuffs;
public sealed class CuffableSystem : SharedCuffableSystem
{
[Dependency] private readonly ActionBlockerSystem _actionBlocker = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
public override void Initialize()
{
@@ -22,7 +24,7 @@ public sealed class CuffableSystem : SharedCuffableSystem
private void OnCuffableShutdown(EntityUid uid, CuffableComponent component, ComponentShutdown args)
{
if (TryComp<SpriteComponent>(uid, out var sprite))
sprite.LayerSetVisible(HumanoidVisualLayers.Handcuffs, false);
_sprite.LayerSetVisible((uid, sprite), HumanoidVisualLayers.Handcuffs, false);
}
private void OnCuffableHandleState(EntityUid uid, CuffableComponent component, ref ComponentHandleState args)
@@ -39,22 +41,22 @@ public sealed class CuffableSystem : SharedCuffableSystem
if (!TryComp<SpriteComponent>(uid, out var sprite))
return;
var cuffed = cuffState.NumHandsCuffed > 0;
sprite.LayerSetVisible(HumanoidVisualLayers.Handcuffs, cuffed);
_sprite.LayerSetVisible((uid, sprite), HumanoidVisualLayers.Handcuffs, cuffed);
// if they are not cuffed, that means that we didn't get a valid color,
// iconstate, or RSI. that also means we don't need to update the sprites.
if (!cuffed)
return;
sprite.LayerSetColor(HumanoidVisualLayers.Handcuffs, cuffState.Color!.Value);
_sprite.LayerSetColor((uid, sprite), HumanoidVisualLayers.Handcuffs, cuffState.Color!.Value);
if (!Equals(component.CurrentRSI, cuffState.RSI) && cuffState.RSI != null) // we don't want to keep loading the same RSI
{
component.CurrentRSI = cuffState.RSI;
sprite.LayerSetState(HumanoidVisualLayers.Handcuffs, cuffState.IconState, component.CurrentRSI);
_sprite.LayerSetRsi((uid, sprite), _sprite.LayerMapGet((uid, sprite), HumanoidVisualLayers.Handcuffs), new ResPath(component.CurrentRSI), cuffState.IconState);
}
else
{
sprite.LayerSetState(HumanoidVisualLayers.Handcuffs, cuffState.IconState);
_sprite.LayerSetRsiState((uid, sprite), HumanoidVisualLayers.Handcuffs, cuffState.IconState);
}
}
}

View File

@@ -27,6 +27,7 @@ namespace Content.Client.Damage;
public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponent>
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
public override void Initialize()
{
@@ -228,7 +229,7 @@ public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponen
// the layer key just doesn't exist, we skip it.
foreach (var key in damageVisComp.TargetLayers)
{
if (!spriteComponent.LayerMapTryGet(key, out var index))
if (!_sprite.LayerMapTryGet((entity, spriteComponent), key, out var index, false))
{
Log.Warning($"Layer at key {key} was invalid for entity {entity}.");
continue;
@@ -253,7 +254,7 @@ public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponen
foreach (var layer in damageVisComp.TargetLayerMapKeys)
{
var layerCount = spriteComponent.AllLayers.Count();
var index = spriteComponent.LayerMapGet(layer);
var index = _sprite.LayerMapGet((entity, spriteComponent), layer);
// var layerState = spriteComponent.LayerGetState(index).ToString()!;
if (index + 1 != layerCount)
@@ -269,7 +270,7 @@ public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponen
{
foreach (var (group, sprite) in damageVisComp.DamageOverlayGroups)
{
AddDamageLayerToSprite(spriteComponent,
AddDamageLayerToSprite((entity, spriteComponent),
sprite,
$"{layer}_{group}_{damageVisComp.Thresholds[1]}",
$"{layer}{group}",
@@ -283,7 +284,7 @@ public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponen
// was taken.
else if (damageVisComp.DamageOverlay != null)
{
AddDamageLayerToSprite(spriteComponent,
AddDamageLayerToSprite((entity, spriteComponent),
damageVisComp.DamageOverlay,
$"{layer}_{damageVisComp.Thresholds[1]}",
$"{layer}trackDamage",
@@ -301,7 +302,7 @@ public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponen
{
foreach (var (group, sprite) in damageVisComp.DamageOverlayGroups)
{
AddDamageLayerToSprite(spriteComponent,
AddDamageLayerToSprite((entity, spriteComponent),
sprite,
$"DamageOverlay_{group}_{damageVisComp.Thresholds[1]}",
$"DamageOverlay{group}");
@@ -310,7 +311,7 @@ public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponen
}
else if (damageVisComp.DamageOverlay != null)
{
AddDamageLayerToSprite(spriteComponent,
AddDamageLayerToSprite((entity, spriteComponent),
damageVisComp.DamageOverlay,
$"DamageOverlay_{damageVisComp.Thresholds[1]}",
"DamageOverlay");
@@ -322,16 +323,19 @@ public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponen
/// <summary>
/// Adds a damage tracking layer to a given sprite component.
/// </summary>
private void AddDamageLayerToSprite(SpriteComponent spriteComponent, DamageVisualizerSprite sprite, string state, string mapKey, int? index = null)
private void AddDamageLayerToSprite(Entity<SpriteComponent?> spriteEnt, DamageVisualizerSprite sprite, string state, string mapKey, int? index = null)
{
var newLayer = spriteComponent.AddLayer(
var newLayer = _sprite.AddLayer(
spriteEnt,
new SpriteSpecifier.Rsi(
new (sprite.Sprite), state
), index);
spriteComponent.LayerMapSet(mapKey, newLayer);
new(sprite.Sprite), state
),
index
);
_sprite.LayerMapSet(spriteEnt, mapKey, newLayer);
if (sprite.Color != null)
spriteComponent.LayerSetColor(newLayer, Color.FromHex(sprite.Color));
spriteComponent.LayerSetVisible(newLayer, false);
_sprite.LayerSetColor(spriteEnt, newLayer, Color.FromHex(sprite.Color));
_sprite.LayerSetVisible(spriteEnt, newLayer, false);
}
protected override void OnAppearanceChange(EntityUid uid, DamageVisualsComponent damageVisComp, ref AppearanceChangeEvent args)
@@ -362,18 +366,18 @@ public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponen
UpdateDisabledLayers(uid, spriteComponent, component, damageVisComp);
if (damageVisComp.Overlay && damageVisComp.DamageOverlayGroups != null && damageVisComp.TargetLayers == null)
CheckOverlayOrdering(spriteComponent, damageVisComp);
CheckOverlayOrdering((uid, spriteComponent), damageVisComp);
if (AppearanceSystem.TryGetData<bool>(uid, DamageVisualizerKeys.ForceUpdate, out var update, component)
&& update)
{
ForceUpdateLayers(damageComponent, spriteComponent, damageVisComp);
ForceUpdateLayers((uid, damageComponent, spriteComponent, damageVisComp));
return;
}
if (damageVisComp.TrackAllDamage)
{
UpdateDamageVisuals(damageComponent, spriteComponent, damageVisComp);
UpdateDamageVisuals((uid, damageComponent, spriteComponent, damageVisComp));
return;
}
@@ -383,7 +387,7 @@ public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponen
data = new DamageVisualizerGroupData(Comp<DamageableComponent>(uid).DamagePerGroup.Keys.ToList());
}
UpdateDamageVisuals(data.GroupList, damageComponent, spriteComponent, damageVisComp);
UpdateDamageVisuals(data.GroupList, (uid, damageComponent, spriteComponent, damageVisComp));
}
/// <summary>
@@ -406,7 +410,7 @@ public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponen
damageVisComp.DisabledLayers[layer] = disabled;
if (damageVisComp.TrackAllDamage)
{
spriteComponent.LayerSetVisible($"{layer}trackDamage", !disabled);
_sprite.LayerSetVisible((uid, spriteComponent), $"{layer}trackDamage", !disabled);
continue;
}
@@ -415,7 +419,7 @@ public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponen
foreach (var damageGroup in damageVisComp.DamageOverlayGroups.Keys)
{
spriteComponent.LayerSetVisible($"{layer}{damageGroup}", !disabled);
_sprite.LayerSetVisible((uid, spriteComponent), $"{layer}{damageGroup}", !disabled);
}
}
}
@@ -427,16 +431,16 @@ public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponen
/// most layer doesn't match, the sprite
/// layers are recreated and placed on top.
/// </summary>
private void CheckOverlayOrdering(SpriteComponent spriteComponent, DamageVisualsComponent damageVisComp)
private void CheckOverlayOrdering(Entity<SpriteComponent> spriteEnt, DamageVisualsComponent damageVisComp)
{
if (spriteComponent[damageVisComp.TopMostLayerKey] != spriteComponent[spriteComponent.AllLayers.Count() - 1])
if (spriteEnt.Comp[damageVisComp.TopMostLayerKey] != spriteEnt.Comp[spriteEnt.Comp.AllLayers.Count() - 1])
{
if (!damageVisComp.TrackAllDamage && damageVisComp.DamageOverlayGroups != null)
{
foreach (var (damageGroup, sprite) in damageVisComp.DamageOverlayGroups)
{
var threshold = damageVisComp.LastThresholdPerGroup[damageGroup];
ReorderOverlaySprite(spriteComponent,
ReorderOverlaySprite(spriteEnt,
damageVisComp,
sprite,
$"DamageOverlay{damageGroup}",
@@ -446,7 +450,7 @@ public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponen
}
else if (damageVisComp.TrackAllDamage && damageVisComp.DamageOverlay != null)
{
ReorderOverlaySprite(spriteComponent,
ReorderOverlaySprite(spriteEnt,
damageVisComp,
damageVisComp.DamageOverlay,
$"DamageOverlay",
@@ -456,21 +460,22 @@ public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponen
}
}
private void ReorderOverlaySprite(SpriteComponent spriteComponent, DamageVisualsComponent damageVisComp, DamageVisualizerSprite sprite, string key, string statePrefix, FixedPoint2 threshold)
private void ReorderOverlaySprite(Entity<SpriteComponent> spriteEnt, DamageVisualsComponent damageVisComp, DamageVisualizerSprite sprite, string key, string statePrefix, FixedPoint2 threshold)
{
spriteComponent.LayerMapTryGet(key, out var spriteLayer);
var visibility = spriteComponent[spriteLayer].Visible;
spriteComponent.RemoveLayer(spriteLayer);
_sprite.LayerMapTryGet(spriteEnt.AsNullable(), key, out var spriteLayer, false);
var visibility = spriteEnt.Comp[spriteLayer].Visible;
_sprite.RemoveLayer(spriteEnt.AsNullable(), spriteLayer);
if (threshold == FixedPoint2.Zero) // these should automatically be invisible
threshold = damageVisComp.Thresholds[1];
spriteLayer = spriteComponent.AddLayer(
spriteLayer = _sprite.AddLayer(
spriteEnt.AsNullable(),
new SpriteSpecifier.Rsi(
new (sprite.Sprite),
new(sprite.Sprite),
$"{statePrefix}_{threshold}"
),
spriteLayer);
spriteComponent.LayerMapSet(key, spriteLayer);
spriteComponent.LayerSetVisible(spriteLayer, visibility);
_sprite.LayerMapSet(spriteEnt.AsNullable(), key, spriteLayer);
_sprite.LayerSetVisible(spriteEnt.AsNullable(), spriteLayer, visibility);
// this is somewhat iffy since it constantly reallocates
damageVisComp.TopMostLayerKey = key;
}
@@ -479,8 +484,12 @@ public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponen
/// Updates damage visuals without tracking
/// any damage groups.
/// </summary>
private void UpdateDamageVisuals(DamageableComponent damageComponent, SpriteComponent spriteComponent, DamageVisualsComponent damageVisComp)
private void UpdateDamageVisuals(Entity<DamageableComponent, SpriteComponent, DamageVisualsComponent> entity)
{
var damageComponent = entity.Comp1;
var spriteComponent = entity.Comp2;
var damageVisComp = entity.Comp3;
if (!CheckThresholdBoundary(damageComponent.TotalDamage, damageVisComp.LastDamageThreshold, damageVisComp, out var threshold))
return;
@@ -490,12 +499,12 @@ public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponen
{
foreach (var layerMapKey in damageVisComp.TargetLayerMapKeys)
{
UpdateTargetLayer(spriteComponent, damageVisComp, layerMapKey, threshold);
UpdateTargetLayer((entity, spriteComponent), damageVisComp, layerMapKey, threshold);
}
}
else
{
UpdateOverlay(spriteComponent, threshold);
UpdateOverlay((entity, spriteComponent), threshold);
}
}
@@ -504,8 +513,12 @@ public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponen
/// according to the list of damage groups
/// passed into it.
/// </summary>
private void UpdateDamageVisuals(List<string> delta, DamageableComponent damageComponent, SpriteComponent spriteComponent, DamageVisualsComponent damageVisComp)
private void UpdateDamageVisuals(List<string> delta, Entity<DamageableComponent, SpriteComponent, DamageVisualsComponent> entity)
{
var damageComponent = entity.Comp1;
var spriteComponent = entity.Comp2;
var damageVisComp = entity.Comp3;
foreach (var damageGroup in delta)
{
if (!damageVisComp.Overlay && damageGroup != damageVisComp.DamageGroup)
@@ -525,12 +538,12 @@ public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponen
{
foreach (var layerMapKey in damageVisComp.TargetLayerMapKeys)
{
UpdateTargetLayer(spriteComponent, damageVisComp, layerMapKey, damageGroup, threshold);
UpdateTargetLayer((entity, spriteComponent, damageVisComp), layerMapKey, damageGroup, threshold);
}
}
else
{
UpdateOverlay(spriteComponent, damageVisComp, damageGroup, threshold);
UpdateOverlay((entity, spriteComponent, damageVisComp), damageGroup, threshold);
}
}
@@ -567,19 +580,21 @@ public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponen
/// Does different things depending on
/// the configuration of the visualizer.
/// </summary>
private void ForceUpdateLayers(DamageableComponent damageComponent, SpriteComponent spriteComponent, DamageVisualsComponent damageVisComp)
private void ForceUpdateLayers(Entity<DamageableComponent, SpriteComponent, DamageVisualsComponent> entity)
{
var damageVisComp = entity.Comp3;
if (damageVisComp.DamageOverlayGroups != null)
{
UpdateDamageVisuals(damageVisComp.DamageOverlayGroups.Keys.ToList(), damageComponent, spriteComponent, damageVisComp);
UpdateDamageVisuals(damageVisComp.DamageOverlayGroups.Keys.ToList(), entity);
}
else if (damageVisComp.DamageGroup != null)
{
UpdateDamageVisuals(new List<string>(){ damageVisComp.DamageGroup }, damageComponent, spriteComponent, damageVisComp);
UpdateDamageVisuals(new List<string>() { damageVisComp.DamageGroup }, entity);
}
else if (damageVisComp.DamageOverlay != null)
{
UpdateDamageVisuals(damageComponent, spriteComponent, damageVisComp);
UpdateDamageVisuals(entity);
}
}
@@ -588,16 +603,16 @@ public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponen
/// it assumes you're updating a layer that is tracking all
/// damage.
/// </summary>
private void UpdateTargetLayer(SpriteComponent spriteComponent, DamageVisualsComponent damageVisComp, object layerMapKey, FixedPoint2 threshold)
private void UpdateTargetLayer(Entity<SpriteComponent> spriteEnt, DamageVisualsComponent damageVisComp, object layerMapKey, FixedPoint2 threshold)
{
if (damageVisComp.Overlay && damageVisComp.DamageOverlayGroups != null)
{
if (!damageVisComp.DisabledLayers[layerMapKey])
{
var layerState = damageVisComp.LayerMapKeyStates[layerMapKey];
spriteComponent.LayerMapTryGet($"{layerMapKey}trackDamage", out var spriteLayer);
_sprite.LayerMapTryGet(spriteEnt.AsNullable(), $"{layerMapKey}trackDamage", out var spriteLayer, false);
UpdateDamageLayerState(spriteComponent,
UpdateDamageLayerState(spriteEnt,
spriteLayer,
$"{layerState}",
threshold);
@@ -606,9 +621,9 @@ public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponen
else if (!damageVisComp.Overlay)
{
var layerState = damageVisComp.LayerMapKeyStates[layerMapKey];
spriteComponent.LayerMapTryGet(layerMapKey, out var spriteLayer);
_sprite.LayerMapTryGet(spriteEnt.AsNullable(), $"{layerMapKey}", out var spriteLayer, false);
UpdateDamageLayerState(spriteComponent,
UpdateDamageLayerState(spriteEnt,
spriteLayer,
$"{layerState}",
threshold);
@@ -618,16 +633,20 @@ public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponen
/// <summary>
/// Updates a target layer by damage group.
/// </summary>
private void UpdateTargetLayer(SpriteComponent spriteComponent, DamageVisualsComponent damageVisComp, object layerMapKey, string damageGroup, FixedPoint2 threshold)
private void UpdateTargetLayer(Entity<SpriteComponent, DamageVisualsComponent> entity, object layerMapKey, string damageGroup, FixedPoint2 threshold)
{
var spriteComponent = entity.Comp1;
var damageVisComp = entity.Comp2;
if (damageVisComp.Overlay && damageVisComp.DamageOverlayGroups != null)
{
if (damageVisComp.DamageOverlayGroups.ContainsKey(damageGroup) && !damageVisComp.DisabledLayers[layerMapKey])
{
var layerState = damageVisComp.LayerMapKeyStates[layerMapKey];
spriteComponent.LayerMapTryGet($"{layerMapKey}{damageGroup}", out var spriteLayer);
_sprite.LayerMapTryGet((entity, spriteComponent), $"{layerMapKey}{damageGroup}", out var spriteLayer, false);
UpdateDamageLayerState(spriteComponent,
UpdateDamageLayerState(
(entity, spriteComponent),
spriteLayer,
$"{layerState}_{damageGroup}",
threshold);
@@ -636,9 +655,10 @@ public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponen
else if (!damageVisComp.Overlay)
{
var layerState = damageVisComp.LayerMapKeyStates[layerMapKey];
spriteComponent.LayerMapTryGet(layerMapKey, out var spriteLayer);
_sprite.LayerMapTryGet((entity, spriteComponent), $"{layerMapKey}", out var spriteLayer, false);
UpdateDamageLayerState(spriteComponent,
UpdateDamageLayerState(
(entity, spriteComponent),
spriteLayer,
$"{layerState}_{damageGroup}",
threshold);
@@ -648,11 +668,11 @@ public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponen
/// <summary>
/// Updates an overlay that is tracking all damage.
/// </summary>
private void UpdateOverlay(SpriteComponent spriteComponent, FixedPoint2 threshold)
private void UpdateOverlay(Entity<SpriteComponent> spriteEnt, FixedPoint2 threshold)
{
spriteComponent.LayerMapTryGet($"DamageOverlay", out var spriteLayer);
_sprite.LayerMapTryGet(spriteEnt.AsNullable(), $"DamageOverlay", out var spriteLayer, false);
UpdateDamageLayerState(spriteComponent,
UpdateDamageLayerState(spriteEnt,
spriteLayer,
$"DamageOverlay",
threshold);
@@ -661,15 +681,19 @@ public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponen
/// <summary>
/// Updates an overlay based on damage group.
/// </summary>
private void UpdateOverlay(SpriteComponent spriteComponent, DamageVisualsComponent damageVisComp, string damageGroup, FixedPoint2 threshold)
private void UpdateOverlay(Entity<SpriteComponent, DamageVisualsComponent> entity, string damageGroup, FixedPoint2 threshold)
{
var spriteComponent = entity.Comp1;
var damageVisComp = entity.Comp2;
if (damageVisComp.DamageOverlayGroups != null)
{
if (damageVisComp.DamageOverlayGroups.ContainsKey(damageGroup))
{
spriteComponent.LayerMapTryGet($"DamageOverlay{damageGroup}", out var spriteLayer);
_sprite.LayerMapTryGet((entity, spriteComponent), $"DamageOverlay{damageGroup}", out var spriteLayer, false);
UpdateDamageLayerState(spriteComponent,
UpdateDamageLayerState(
(entity, spriteComponent),
spriteLayer,
$"DamageOverlay_{damageGroup}",
threshold);
@@ -683,19 +707,19 @@ public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponen
/// function calls it), and what threshold
/// was passed into it.
/// </summary>
private void UpdateDamageLayerState(SpriteComponent spriteComponent, int spriteLayer, string statePrefix, FixedPoint2 threshold)
private void UpdateDamageLayerState(Entity<SpriteComponent> spriteEnt, int spriteLayer, string statePrefix, FixedPoint2 threshold)
{
if (threshold == 0)
{
spriteComponent.LayerSetVisible(spriteLayer, false);
_sprite.LayerSetVisible(spriteEnt.AsNullable(), spriteLayer, false);
}
else
{
if (!spriteComponent[spriteLayer].Visible)
if (!spriteEnt.Comp[spriteLayer].Visible)
{
spriteComponent.LayerSetVisible(spriteLayer, true);
_sprite.LayerSetVisible(spriteEnt.AsNullable(), spriteLayer, true);
}
spriteComponent.LayerSetState(spriteLayer, $"{statePrefix}_{threshold}");
_sprite.LayerSetRsiState(spriteEnt.AsNullable(), spriteLayer, $"{statePrefix}_{threshold}");
}
}
}

View File

@@ -0,0 +1,7 @@
using Content.Shared.Damage.Systems;
namespace Content.Client.Damage.Systems;
public sealed partial class StaminaSystem : SharedStaminaSystem
{
}

View File

@@ -6,6 +6,8 @@ namespace Content.Client.DamageState;
public sealed class DamageStateVisualizerSystem : VisualizerSystem<DamageStateVisualsComponent>
{
[Dependency] private readonly SpriteSystem _sprite = default!;
protected override void OnAppearanceChange(EntityUid uid, DamageStateVisualsComponent component, ref AppearanceChangeEvent args)
{
var sprite = args.Sprite;
@@ -21,34 +23,34 @@ public sealed class DamageStateVisualizerSystem : VisualizerSystem<DamageStateVi
}
// Brain no worky rn so this was just easier.
foreach (var key in new []{ DamageStateVisualLayers.Base, DamageStateVisualLayers.BaseUnshaded })
foreach (var key in new[] { DamageStateVisualLayers.Base, DamageStateVisualLayers.BaseUnshaded })
{
if (!sprite.LayerMapTryGet(key, out _)) continue;
if (!_sprite.LayerMapTryGet((uid, sprite), key, out _, false)) continue;
sprite.LayerSetVisible(key, false);
_sprite.LayerSetVisible((uid, sprite), key, false);
}
foreach (var (key, state) in layers)
{
// Inheritance moment.
if (!sprite.LayerMapTryGet(key, out _)) continue;
if (!_sprite.LayerMapTryGet((uid, sprite), key, out _, false)) continue;
sprite.LayerSetVisible(key, true);
sprite.LayerSetState(key, state);
_sprite.LayerSetVisible((uid, sprite), key, true);
_sprite.LayerSetRsiState((uid, sprite), key, state);
}
// So they don't draw over mobs anymore
if (data == MobState.Dead)
{
if (sprite.DrawDepth > (int) DrawDepth.DeadMobs)
if (sprite.DrawDepth > (int)DrawDepth.DeadMobs)
{
component.OriginalDrawDepth = sprite.DrawDepth;
sprite.DrawDepth = (int) DrawDepth.DeadMobs;
_sprite.SetDrawDepth((uid, sprite), (int)DrawDepth.DeadMobs);
}
}
else if (component.OriginalDrawDepth != null)
{
sprite.DrawDepth = component.OriginalDrawDepth.Value;
_sprite.SetDrawDepth((uid, sprite), component.OriginalDrawDepth.Value);
component.OriginalDrawDepth = null;
}
}

View File

@@ -9,7 +9,6 @@ public sealed class DeliveryVisualizerSystem : VisualizerSystem<DeliveryComponen
{
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
private static readonly ProtoId<JobIconPrototype> UnknownIcon = "JobIconUnknown";
@@ -25,11 +24,11 @@ public sealed class DeliveryVisualizerSystem : VisualizerSystem<DeliveryComponen
if (!_prototype.TryIndex<JobIconPrototype>(job, out var icon))
{
args.Sprite.LayerSetTexture(DeliveryVisualLayers.JobStamp, _sprite.Frame0(_prototype.Index("JobIconUnknown")));
SpriteSystem.LayerSetTexture((uid, args.Sprite), DeliveryVisualLayers.JobStamp, SpriteSystem.Frame0(_prototype.Index("JobIconUnknown")));
return;
}
args.Sprite.LayerSetTexture(DeliveryVisualLayers.JobStamp, _sprite.Frame0(icon.Icon));
SpriteSystem.LayerSetTexture((uid, args.Sprite), DeliveryVisualLayers.JobStamp, SpriteSystem.Frame0(icon.Icon));
}
}
@@ -42,6 +41,8 @@ public enum DeliveryVisualLayers : byte
PriorityTape,
Breakage,
Trash,
Bomb,
BombPrimed,
}
public enum DeliverySpawnerVisualLayers : byte

View File

@@ -5,6 +5,8 @@ namespace Content.Client.Dice;
public sealed class DiceSystem : SharedDiceSystem
{
[Dependency] private readonly SpriteSystem _sprite = default!;
public override void Initialize()
{
base.Initialize();
@@ -18,11 +20,11 @@ public sealed class DiceSystem : SharedDiceSystem
return;
// TODO maybe just move each die to its own RSI?
var state = sprite.LayerGetState(0).Name;
var state = _sprite.LayerGetRsiState((entity.Owner, sprite), 0).Name;
if (state == null)
return;
var prefix = state.Substring(0, state.IndexOf('_'));
sprite.LayerSetState(0, $"{prefix}_{entity.Comp.CurrentValue}");
_sprite.LayerSetRsiState((entity.Owner, sprite), 0, $"{prefix}_{entity.Comp.CurrentValue}");
}
}

View File

@@ -8,18 +8,19 @@ namespace Content.Client.DisplacementMap;
public sealed class DisplacementMapSystem : EntitySystem
{
[Dependency] private readonly ISerializationManager _serialization = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
/// <summary>
/// Attempting to apply a displacement map to a specific layer of SpriteComponent
/// </summary>
/// <param name="data">Information package for applying the displacement map</param>
/// <param name="sprite">SpriteComponent</param>
/// <param name="sprite">Entity with SpriteComponent</param>
/// <param name="index">Index of the layer where the new map layer will be added</param>
/// <param name="key">Unique layer key, which will determine which layer to apply displacement map to</param>
/// <param name="displacementKey">The key of the new displacement map layer added by this function.</param>
/// <returns></returns>
public bool TryAddDisplacement(DisplacementData data,
SpriteComponent sprite,
Entity<SpriteComponent> sprite,
int index,
object key,
out string displacementKey)
@@ -30,10 +31,9 @@ public sealed class DisplacementMapSystem : EntitySystem
return false;
if (data.ShaderOverride != null)
sprite.LayerSetShader(index, data.ShaderOverride);
sprite.Comp.LayerSetShader(index, data.ShaderOverride);
if (sprite.LayerMapTryGet(displacementKey, out var oldIndex))
sprite.RemoveLayer(oldIndex);
_sprite.RemoveLayer(sprite.AsNullable(), displacementKey, false);
//allows you not to write it every time in the YML
foreach (var pair in data.SizeMaps)
@@ -55,7 +55,7 @@ public sealed class DisplacementMapSystem : EntitySystem
// We choose a displacement map from the possible ones, matching the size with the original layer size.
// If there is no such a map, we use a standard 32 by 32 one
var displacementDataLayer = data.SizeMaps[EyeManager.PixelsPerMeter];
var actualRSI = sprite.LayerGetActualRSI(index);
var actualRSI = _sprite.LayerGetEffectiveRsi(sprite.AsNullable(), index);
if (actualRSI is not null)
{
if (actualRSI.Size.X != actualRSI.Size.Y)
@@ -72,9 +72,20 @@ public sealed class DisplacementMapSystem : EntitySystem
var displacementLayer = _serialization.CreateCopy(displacementDataLayer, notNullableOverride: true);
displacementLayer.CopyToShaderParameters!.LayerKey = key.ToString() ?? "this is impossible";
sprite.AddLayer(displacementLayer, index);
sprite.LayerMapSet(displacementKey, index);
_sprite.AddLayer(sprite.AsNullable(), displacementLayer, index);
_sprite.LayerMapSet(sprite.AsNullable(), displacementKey, index);
return true;
}
/// <inheritdoc cref="TryAddDisplacement"/>
[Obsolete("Use the Entity<SpriteComponent> overload")]
public bool TryAddDisplacement(DisplacementData data,
SpriteComponent sprite,
int index,
object key,
out string displacementKey)
{
return TryAddDisplacement(data, (sprite.Owner, sprite), index, key, out displacementKey);
}
}

View File

@@ -4,6 +4,7 @@ using Content.Shared.Disposal;
using Content.Shared.Disposal.Components;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls;
using System.Linq;
namespace Content.Client.Disposal.Mailing;
@@ -70,10 +71,10 @@ public sealed class MailingUnitBoundUserInterface : BoundUserInterface
//UnitTag.Text = state.Tag;
MailingUnitWindow.Target.Text = entity.Comp.Target;
MailingUnitWindow.TargetListContainer.Clear();
foreach (var target in entity.Comp.TargetList)
{
MailingUnitWindow.TargetListContainer.AddItem(target);
}
var entries = entity.Comp.TargetList.Select(target => new ItemList.Item(MailingUnitWindow.TargetListContainer) {
Text = target,
Selected = target == entity.Comp.Target
}).ToList();
MailingUnitWindow.TargetListContainer.SetItems(entries);
}
}

View File

@@ -13,6 +13,7 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem
[Dependency] private readonly AnimationPlayerSystem _animationSystem = default!;
[Dependency] private readonly SharedAudioSystem _audioSystem = default!;
[Dependency] private readonly SharedUserInterfaceSystem _uiSystem = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
private const string AnimationKey = "disposal_unit_animation";
@@ -67,13 +68,13 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem
if (!_appearanceSystem.TryGetData<DisposalUnitComponent.VisualState>(ent, DisposalUnitComponent.Visuals.VisualState, out var state, appearance))
return;
sprite.LayerSetVisible(DisposalUnitVisualLayers.Unanchored, state == DisposalUnitComponent.VisualState.UnAnchored);
sprite.LayerSetVisible(DisposalUnitVisualLayers.Base, state == DisposalUnitComponent.VisualState.Anchored);
sprite.LayerSetVisible(DisposalUnitVisualLayers.OverlayFlush, state == DisposalUnitComponent.VisualState.OverlayFlushing);
sprite.LayerSetVisible(DisposalUnitVisualLayers.BaseCharging, state == DisposalUnitComponent.VisualState.OverlayCharging);
_sprite.LayerSetVisible((ent, sprite), DisposalUnitVisualLayers.Unanchored, state == DisposalUnitComponent.VisualState.UnAnchored);
_sprite.LayerSetVisible((ent, sprite), DisposalUnitVisualLayers.Base, state == DisposalUnitComponent.VisualState.Anchored);
_sprite.LayerSetVisible((ent, sprite), DisposalUnitVisualLayers.OverlayFlush, state == DisposalUnitComponent.VisualState.OverlayFlushing);
_sprite.LayerSetVisible((ent, sprite), DisposalUnitVisualLayers.BaseCharging, state == DisposalUnitComponent.VisualState.OverlayCharging);
var chargingState = sprite.LayerMapTryGet(DisposalUnitVisualLayers.BaseCharging, out var chargingLayer)
? sprite.LayerGetState(chargingLayer)
var chargingState = _sprite.LayerMapTryGet((ent, sprite), DisposalUnitVisualLayers.BaseCharging, out var chargingLayer, false)
? _sprite.LayerGetRsiState((ent, sprite), chargingLayer)
: new RSI.StateId(DefaultChargeState);
// This is a transient state so not too worried about replaying in range.
@@ -81,8 +82,8 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem
{
if (!_animationSystem.HasRunningAnimation(ent, AnimationKey))
{
var flushState = sprite.LayerMapTryGet(DisposalUnitVisualLayers.OverlayFlush, out var flushLayer)
? sprite.LayerGetState(flushLayer)
var flushState = _sprite.LayerMapTryGet((ent, sprite), DisposalUnitVisualLayers.OverlayFlush, out var flushLayer, false)
? _sprite.LayerGetRsiState((ent, sprite), flushLayer)
: new RSI.StateId(DefaultFlushState);
// Setup the flush animation to play
@@ -124,16 +125,16 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem
if (!_appearanceSystem.TryGetData<DisposalUnitComponent.HandleState>(ent, DisposalUnitComponent.Visuals.Handle, out var handleState, appearance))
handleState = DisposalUnitComponent.HandleState.Normal;
sprite.LayerSetVisible(DisposalUnitVisualLayers.OverlayEngaged, handleState != DisposalUnitComponent.HandleState.Normal);
_sprite.LayerSetVisible((ent, sprite), DisposalUnitVisualLayers.OverlayEngaged, handleState != DisposalUnitComponent.HandleState.Normal);
if (!_appearanceSystem.TryGetData<DisposalUnitComponent.LightStates>(ent, DisposalUnitComponent.Visuals.Light, out var lightState, appearance))
lightState = DisposalUnitComponent.LightStates.Off;
sprite.LayerSetVisible(DisposalUnitVisualLayers.OverlayCharging,
_sprite.LayerSetVisible((ent, sprite), DisposalUnitVisualLayers.OverlayCharging,
(lightState & DisposalUnitComponent.LightStates.Charging) != 0);
sprite.LayerSetVisible(DisposalUnitVisualLayers.OverlayReady,
_sprite.LayerSetVisible((ent, sprite), DisposalUnitVisualLayers.OverlayReady,
(lightState & DisposalUnitComponent.LightStates.Ready) != 0);
sprite.LayerSetVisible(DisposalUnitVisualLayers.OverlayFull,
_sprite.LayerSetVisible((ent, sprite), DisposalUnitVisualLayers.OverlayFull,
(lightState & DisposalUnitComponent.LightStates.Full) != 0);
}
}

View File

@@ -21,6 +21,7 @@ public sealed class DoAfterOverlay : Overlay
private readonly MetaDataSystem _meta;
private readonly ProgressColorSystem _progressColor;
private readonly SharedContainerSystem _container;
private readonly SpriteSystem _sprite;
private readonly Texture _barTexture;
private readonly ShaderInstance _unshadedShader;
@@ -45,6 +46,7 @@ public sealed class DoAfterOverlay : Overlay
_meta = _entManager.EntitySysManager.GetEntitySystem<MetaDataSystem>();
_container = _entManager.EntitySysManager.GetEntitySystem<SharedContainerSystem>();
_progressColor = _entManager.System<ProgressColorSystem>();
_sprite = _entManager.System<SpriteSystem>();
var sprite = new SpriteSpecifier.Rsi(new("/Textures/Interface/Misc/progress_bar.rsi"), "icon");
_barTexture = _entManager.EntitySysManager.GetEntitySystem<SpriteSystem>().Frame0(sprite);
@@ -118,7 +120,7 @@ public sealed class DoAfterOverlay : Overlay
// Use the sprite itself if we know its bounds. This means short or tall sprites don't get overlapped
// by the bar.
float yOffset = sprite.Bounds.Height / 2f + 0.05f;
var yOffset = _sprite.GetLocalBounds((uid, sprite)).Height / 2f + 0.05f;
// Position above the entity (we've already applied the matrix transform to the entity itself)
// Offset by the texture size for every do_after we have.
@@ -135,7 +137,7 @@ public sealed class DoAfterOverlay : Overlay
if (doAfter.CancelledTime != null)
{
var elapsed = doAfter.CancelledTime.Value - doAfter.StartTime;
elapsedRatio = (float) Math.Min(1, elapsed.TotalSeconds / doAfter.Args.Delay.TotalSeconds);
elapsedRatio = (float)Math.Min(1, elapsed.TotalSeconds / doAfter.Args.Delay.TotalSeconds);
var cancelElapsed = (time - doAfter.CancelledTime.Value).TotalSeconds;
var flash = Math.Floor(cancelElapsed / FlashTime) % 2 == 0;
color = GetProgressColor(0, flash ? alpha : 0);
@@ -143,7 +145,7 @@ public sealed class DoAfterOverlay : Overlay
else
{
var elapsed = time - doAfter.StartTime;
elapsedRatio = (float) Math.Min(1, elapsed.TotalSeconds / doAfter.Args.Delay.TotalSeconds);
elapsedRatio = (float)Math.Min(1, elapsed.TotalSeconds / doAfter.Args.Delay.TotalSeconds);
color = GetProgressColor(elapsedRatio, alpha);
}

View File

@@ -10,6 +10,7 @@ namespace Content.Client.Doors;
public sealed class AirlockSystem : SharedAirlockSystem
{
[Dependency] private readonly AppearanceSystem _appearanceSystem = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
public override void Initialize()
{
@@ -21,7 +22,7 @@ public sealed class AirlockSystem : SharedAirlockSystem
private void OnComponentStartup(EntityUid uid, AirlockComponent comp, ComponentStartup args)
{
// Has to be on component startup because we don't know what order components initialize in and running this before DoorComponent inits _will_ crash.
if(!TryComp<DoorComponent>(uid, out var door))
if (!TryComp<DoorComponent>(uid, out var door))
return;
if (comp.OpenUnlitVisible) // Otherwise there are flashes of the fallback sprite between clicking on the door and the door closing animation starting.
@@ -31,17 +32,17 @@ public sealed class AirlockSystem : SharedAirlockSystem
}
((Animation)door.OpeningAnimation).AnimationTracks.Add(new AnimationTrackSpriteFlick()
{
LayerKey = DoorVisualLayers.BaseUnlit,
KeyFrames = { new AnimationTrackSpriteFlick.KeyFrame(comp.OpeningSpriteState, 0f) },
}
{
LayerKey = DoorVisualLayers.BaseUnlit,
KeyFrames = { new AnimationTrackSpriteFlick.KeyFrame(comp.OpeningSpriteState, 0f) },
}
);
((Animation)door.ClosingAnimation).AnimationTracks.Add(new AnimationTrackSpriteFlick()
{
LayerKey = DoorVisualLayers.BaseUnlit,
KeyFrames = { new AnimationTrackSpriteFlick.KeyFrame(comp.ClosingSpriteState, 0f) },
}
{
LayerKey = DoorVisualLayers.BaseUnlit,
KeyFrames = { new AnimationTrackSpriteFlick.KeyFrame(comp.ClosingSpriteState, 0f) },
}
);
door.DenyingAnimation = new Animation()
@@ -57,19 +58,19 @@ public sealed class AirlockSystem : SharedAirlockSystem
}
};
if(!comp.AnimatePanel)
if (!comp.AnimatePanel)
return;
((Animation)door.OpeningAnimation).AnimationTracks.Add(new AnimationTrackSpriteFlick()
{
LayerKey = WiresVisualLayers.MaintenancePanel,
KeyFrames = {new AnimationTrackSpriteFlick.KeyFrame(comp.OpeningPanelSpriteState, 0f)},
KeyFrames = { new AnimationTrackSpriteFlick.KeyFrame(comp.OpeningPanelSpriteState, 0f) },
});
((Animation)door.ClosingAnimation).AnimationTracks.Add(new AnimationTrackSpriteFlick
{
LayerKey = WiresVisualLayers.MaintenancePanel,
KeyFrames = {new AnimationTrackSpriteFlick.KeyFrame(comp.ClosingPanelSpriteState, 0f)},
KeyFrames = { new AnimationTrackSpriteFlick.KeyFrame(comp.ClosingPanelSpriteState, 0f) },
});
}
@@ -101,11 +102,12 @@ public sealed class AirlockSystem : SharedAirlockSystem
&& !boltedVisible && !emergencyLightsVisible;
}
args.Sprite.LayerSetVisible(DoorVisualLayers.BaseUnlit, unlitVisible);
args.Sprite.LayerSetVisible(DoorVisualLayers.BaseBolted, boltedVisible);
_sprite.LayerSetVisible((uid, args.Sprite), DoorVisualLayers.BaseUnlit, unlitVisible);
_sprite.LayerSetVisible((uid, args.Sprite), DoorVisualLayers.BaseBolted, boltedVisible);
if (comp.EmergencyAccessLayer)
{
args.Sprite.LayerSetVisible(
_sprite.LayerSetVisible(
(uid, args.Sprite),
DoorVisualLayers.BaseEmergencyAccess,
emergencyLightsVisible
&& state != DoorState.Open
@@ -118,12 +120,12 @@ public sealed class AirlockSystem : SharedAirlockSystem
switch (state)
{
case DoorState.Open:
args.Sprite.LayerSetState(DoorVisualLayers.BaseUnlit, comp.ClosingSpriteState);
args.Sprite.LayerSetAnimationTime(DoorVisualLayers.BaseUnlit, 0);
_sprite.LayerSetRsiState((uid, args.Sprite), DoorVisualLayers.BaseUnlit, comp.ClosingSpriteState);
_sprite.LayerSetAnimationTime((uid, args.Sprite), DoorVisualLayers.BaseUnlit, 0);
break;
case DoorState.Closed:
args.Sprite.LayerSetState(DoorVisualLayers.BaseUnlit, comp.OpeningSpriteState);
args.Sprite.LayerSetAnimationTime(DoorVisualLayers.BaseUnlit, 0);
_sprite.LayerSetRsiState((uid, args.Sprite), DoorVisualLayers.BaseUnlit, comp.OpeningSpriteState);
_sprite.LayerSetAnimationTime((uid, args.Sprite), DoorVisualLayers.BaseUnlit, 0);
break;
}
}

View File

@@ -11,6 +11,7 @@ public sealed class DoorSystem : SharedDoorSystem
{
[Dependency] private readonly AnimationPlayerSystem _animationSystem = default!;
[Dependency] private readonly IResourceCache _resourceCache = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
public override void Initialize()
{
@@ -85,7 +86,7 @@ public sealed class DoorSystem : SharedDoorSystem
state = DoorState.Closed;
if (AppearanceSystem.TryGetData<string>(entity, DoorVisuals.BaseRSI, out var baseRsi, args.Component))
UpdateSpriteLayers(args.Sprite, baseRsi);
UpdateSpriteLayers((entity.Owner, args.Sprite), baseRsi);
if (_animationSystem.HasRunningAnimation(entity, DoorComponent.AnimationKey))
_animationSystem.Stop(entity.Owner, DoorComponent.AnimationKey);
@@ -95,21 +96,21 @@ public sealed class DoorSystem : SharedDoorSystem
private void UpdateAppearanceForDoorState(Entity<DoorComponent> entity, SpriteComponent sprite, DoorState state)
{
sprite.DrawDepth = state is DoorState.Open ? entity.Comp.OpenDrawDepth : entity.Comp.ClosedDrawDepth;
_sprite.SetDrawDepth((entity.Owner, sprite), state is DoorState.Open ? entity.Comp.OpenDrawDepth : entity.Comp.ClosedDrawDepth);
switch (state)
{
case DoorState.Open:
foreach (var (layer, layerState) in entity.Comp.OpenSpriteStates)
{
sprite.LayerSetState(layer, layerState);
_sprite.LayerSetRsiState((entity.Owner, sprite), layer, layerState);
}
return;
case DoorState.Closed:
foreach (var (layer, layerState) in entity.Comp.ClosedSpriteStates)
{
sprite.LayerSetState(layer, layerState);
_sprite.LayerSetRsiState((entity.Owner, sprite), layer, layerState);
}
return;
@@ -138,7 +139,7 @@ public sealed class DoorSystem : SharedDoorSystem
}
}
private void UpdateSpriteLayers(SpriteComponent sprite, string baseRsi)
private void UpdateSpriteLayers(Entity<SpriteComponent> sprite, string baseRsi)
{
if (!_resourceCache.TryGetResource<RSIResource>(SpriteSpecifierSerializer.TextureRoot / baseRsi, out var res))
{
@@ -146,6 +147,6 @@ public sealed class DoorSystem : SharedDoorSystem
return;
}
sprite.BaseRSI = res.RSI;
_sprite.SetBaseRsi(sprite.AsNullable(), res.RSI);
}
}

View File

@@ -8,6 +8,7 @@ namespace Content.Client.Doors;
public sealed class FirelockSystem : SharedFirelockSystem
{
[Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
public override void Initialize()
{
@@ -18,7 +19,7 @@ public sealed class FirelockSystem : SharedFirelockSystem
protected override void OnComponentStartup(Entity<FirelockComponent> ent, ref ComponentStartup args)
{
base.OnComponentStartup(ent, ref args);
if(!TryComp<DoorComponent>(ent.Owner, out var door))
if (!TryComp<DoorComponent>(ent.Owner, out var door))
return;
door.ClosedSpriteStates.Add((DoorVisualLayers.BaseUnlit, ent.Comp.WarningLightSpriteState));
@@ -57,7 +58,7 @@ public sealed class FirelockSystem : SharedFirelockSystem
|| state == DoorState.Denying
|| (_appearanceSystem.TryGetData<bool>(uid, DoorVisuals.ClosedLights, out var closedLights, args.Component) && closedLights);
args.Sprite.LayerSetVisible(DoorVisualLayers.BaseUnlit, unlitVisible && !boltedVisible);
args.Sprite.LayerSetVisible(DoorVisualLayers.BaseBolted, boltedVisible);
_sprite.LayerSetVisible((uid, args.Sprite), DoorVisualLayers.BaseUnlit, unlitVisible && !boltedVisible);
_sprite.LayerSetVisible((uid, args.Sprite), DoorVisualLayers.BaseBolted, boltedVisible);
}
}

View File

@@ -13,8 +13,9 @@ namespace Content.Client.Doors;
public sealed class TurnstileSystem : SharedTurnstileSystem
{
[Dependency] private readonly AnimationPlayerSystem _animationPlayer = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
private static EntProtoId _examineArrow = "TurnstileArrow";
private static readonly EntProtoId ExamineArrow = "TurnstileArrow";
private const string AnimationKey = "Turnstile";
@@ -33,12 +34,12 @@ public sealed class TurnstileSystem : SharedTurnstileSystem
if (!TryComp<SpriteComponent>(ent, out var sprite))
return;
sprite.LayerSetState(TurnstileVisualLayers.Base, new RSI.StateId(ent.Comp.DefaultState));
_sprite.LayerSetRsiState((ent.Owner, sprite), TurnstileVisualLayers.Base, new RSI.StateId(ent.Comp.DefaultState));
}
private void OnExamined(Entity<TurnstileComponent> ent, ref ExaminedEvent args)
{
Spawn(_examineArrow, new EntityCoordinates(ent, 0, 0));
Spawn(ExamineArrow, new EntityCoordinates(ent, 0, 0));
}
protected override void PlayAnimation(EntityUid uid, string stateId)

View File

@@ -7,6 +7,7 @@ namespace Content.Client.Dragon;
public sealed class DragonSystem : EntitySystem
{
[Dependency] private readonly SharedPointLightSystem _lights = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
public override void Initialize()
{
@@ -31,7 +32,7 @@ public sealed class DragonSystem : EntitySystem
switch (state.State)
{
case DragonRiftState.Charging:
sprite?.LayerSetColor(0, Color.FromHex("#569fff"));
_sprite.LayerSetColor((uid, sprite), 0, Color.FromHex("#569fff"));
if (light != null)
{
@@ -39,7 +40,7 @@ public sealed class DragonSystem : EntitySystem
}
break;
case DragonRiftState.AlmostFinished:
sprite?.LayerSetColor(0, Color.FromHex("#cf4cff"));
_sprite.LayerSetColor((uid, sprite), 0, Color.FromHex("#cf4cff"));
if (light != null)
{
@@ -47,7 +48,7 @@ public sealed class DragonSystem : EntitySystem
}
break;
case DragonRiftState.Finished:
sprite?.LayerSetColor(0, Color.FromHex("#edbc36"));
_sprite.LayerSetColor((uid, sprite), 0, Color.FromHex("#edbc36"));
if (light != null)
{

View File

@@ -2,6 +2,7 @@ using Content.Shared.Drugs;
using Robust.Client.Graphics;
using Robust.Client.Player;
using Robust.Shared.Player;
using Robust.Shared.Random;
namespace Content.Client.Drugs;
@@ -12,6 +13,7 @@ public sealed class DrugOverlaySystem : EntitySystem
{
[Dependency] private readonly IPlayerManager _player = default!;
[Dependency] private readonly IOverlayManager _overlayMan = default!;
[Dependency] private readonly IRobustRandom _random = default!;
private RainbowOverlay _overlay = default!;
@@ -45,7 +47,10 @@ public sealed class DrugOverlaySystem : EntitySystem
private void OnInit(EntityUid uid, SeeingRainbowsComponent component, ComponentInit args)
{
if (_player.LocalEntity == uid)
{
_overlay.Phase = _random.NextFloat(MathF.Tau); // random starting phase for movement effect
_overlayMan.AddOverlay(_overlay);
}
}
private void OnShutdown(EntityUid uid, SeeingRainbowsComponent component, ComponentShutdown args)

View File

@@ -24,16 +24,27 @@ public sealed class RainbowOverlay : Overlay
public float Intoxication = 0.0f;
public float TimeTicker = 0.0f;
public float Phase = 0.0f;
private const float VisualThreshold = 10.0f;
private const float PowerDivisor = 250.0f;
private float _timeScale = 0.0f;
private float _warpScale = 0.0f;
private float EffectScale => Math.Clamp((Intoxication - VisualThreshold) / PowerDivisor, 0.0f, 1.0f);
public RainbowOverlay()
{
IoCManager.InjectDependencies(this);
_rainbowShader = _prototypeManager.Index<ShaderPrototype>("Rainbow").InstanceUnique();
_config.OnValueChanged(CCVars.ReducedMotion, OnReducedMotionChanged, invokeImmediately: true);
}
private void OnReducedMotionChanged(bool reducedMotion)
{
_timeScale = reducedMotion ? 0.0f : 1.0f;
_warpScale = reducedMotion ? 0.0f : 1.0f;
}
protected override void FrameUpdate(FrameEventArgs args)
@@ -51,7 +62,7 @@ public sealed class RainbowOverlay : Overlay
if (!statusSys.TryGetTime(playerEntity.Value, DrugOverlaySystem.RainbowKey, out var time, status))
return;
var timeLeft = (float) (time.Value.Item2 - time.Value.Item1).TotalSeconds;
var timeLeft = (float)(time.Value.Item2 - time.Value.Item1).TotalSeconds;
TimeTicker += args.DeltaSeconds;
@@ -61,7 +72,7 @@ public sealed class RainbowOverlay : Overlay
}
else
{
Intoxication -= Intoxication/(timeLeft - TimeTicker) * args.DeltaSeconds;
Intoxication -= Intoxication / (timeLeft - TimeTicker) * args.DeltaSeconds;
}
}
@@ -78,16 +89,15 @@ public sealed class RainbowOverlay : Overlay
protected override void Draw(in OverlayDrawArgs args)
{
// TODO disable only the motion part or ike's idea (single static frame of the overlay)
if (_config.GetCVar(CCVars.ReducedMotion))
return;
if (ScreenTexture == null)
return;
var handle = args.WorldHandle;
_rainbowShader.SetParameter("SCREEN_TEXTURE", ScreenTexture);
_rainbowShader.SetParameter("effectScale", EffectScale);
_rainbowShader.SetParameter("colorScale", EffectScale);
_rainbowShader.SetParameter("timeScale", _timeScale);
_rainbowShader.SetParameter("warpScale", _warpScale * EffectScale);
_rainbowShader.SetParameter("phase", Phase);
handle.UseShader(_rainbowShader);
handle.DrawRect(args.WorldBounds, Color.White);
handle.UseShader(null);

View File

@@ -13,6 +13,7 @@ public sealed class ColorFlashEffectSystem : SharedColorFlashEffectSystem
{
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly AnimationPlayerSystem _animation = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
/// <summary>
/// It's a little on the long side but given we use multiple colours denoting what happened it makes it easier to register.
@@ -44,7 +45,7 @@ public sealed class ColorFlashEffectSystem : SharedColorFlashEffectSystem
if (TryComp<SpriteComponent>(uid, out var sprite))
{
sprite.Color = component.Color;
_sprite.SetColor((uid, sprite), component.Color);
}
}

View File

@@ -11,6 +11,7 @@ namespace Content.Client.Electrocution;
public sealed class ElectrocutionHUDVisualizerSystem : VisualizerSystem<ElectrocutionHUDVisualsComponent>
{
[Dependency] private readonly IPlayerManager _playerMan = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
public override void Initialize()
{
@@ -53,15 +54,12 @@ public sealed class ElectrocutionHUDVisualizerSystem : VisualizerSystem<Electroc
private void ShowHUD()
{
var electrifiedQuery = AllEntityQuery<ElectrocutionHUDVisualsComponent, AppearanceComponent, SpriteComponent>();
while (electrifiedQuery.MoveNext(out var uid, out var _, out var appearanceComp, out var spriteComp))
while (electrifiedQuery.MoveNext(out var uid, out _, out var appearanceComp, out var spriteComp))
{
if (!AppearanceSystem.TryGetData<bool>(uid, ElectrifiedVisuals.IsElectrified, out var electrified, appearanceComp))
continue;
if (electrified)
spriteComp.LayerSetVisible(ElectrifiedLayers.HUD, true);
else
spriteComp.LayerSetVisible(ElectrifiedLayers.HUD, false);
_sprite.LayerSetVisible((uid, spriteComp), ElectrifiedLayers.HUD, electrified);
}
}
@@ -70,10 +68,9 @@ public sealed class ElectrocutionHUDVisualizerSystem : VisualizerSystem<Electroc
private void RemoveHUD()
{
var electrifiedQuery = AllEntityQuery<ElectrocutionHUDVisualsComponent, AppearanceComponent, SpriteComponent>();
while (electrifiedQuery.MoveNext(out var uid, out var _, out var appearanceComp, out var spriteComp))
while (electrifiedQuery.MoveNext(out var uid, out _, out _, out var spriteComp))
{
spriteComp.LayerSetVisible(ElectrifiedLayers.HUD, false);
_sprite.LayerSetVisible((uid, spriteComp), ElectrifiedLayers.HUD, false);
}
}
@@ -87,9 +84,6 @@ public sealed class ElectrocutionHUDVisualizerSystem : VisualizerSystem<Electroc
return;
var player = _playerMan.LocalEntity;
if (electrified && HasComp<ShowElectrocutionHUDComponent>(player))
args.Sprite.LayerSetVisible(ElectrifiedLayers.HUD, true);
else
args.Sprite.LayerSetVisible(ElectrifiedLayers.HUD, false);
_sprite.LayerSetVisible((uid, args.Sprite), ElectrifiedLayers.HUD, electrified && HasComp<ShowElectrocutionHUDComponent>(player));
}
}

View File

@@ -1,12 +1,14 @@
using Content.Shared.Ensnaring;
using Content.Shared.Ensnaring.Components;
using Robust.Client.GameObjects;
using Robust.Shared.Utility;
namespace Content.Client.Ensnaring;
public sealed class EnsnareableSystem : SharedEnsnareableSystem
{
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
public override void Initialize()
{
@@ -19,25 +21,25 @@ public sealed class EnsnareableSystem : SharedEnsnareableSystem
{
base.OnEnsnareInit(ent, ref args);
if(!TryComp<SpriteComponent>(ent.Owner, out var sprite))
if (!TryComp<SpriteComponent>(ent.Owner, out var sprite))
return;
// TODO remove this, this should just be in yaml.
sprite.LayerMapReserveBlank(EnsnaredVisualLayers.Ensnared);
_sprite.LayerMapReserve((ent.Owner, sprite), EnsnaredVisualLayers.Ensnared);
}
private void OnAppearanceChange(EntityUid uid, EnsnareableComponent component, ref AppearanceChangeEvent args)
{
if (args.Sprite == null || !args.Sprite.LayerMapTryGet(EnsnaredVisualLayers.Ensnared, out var layer))
if (args.Sprite == null || !_sprite.LayerMapTryGet((uid, args.Sprite), EnsnaredVisualLayers.Ensnared, out var layer, false))
return;
if (_appearance.TryGetData<bool>(uid, EnsnareableVisuals.IsEnsnared, out var isEnsnared, args.Component))
{
if (component.Sprite != null)
{
args.Sprite.LayerSetRSI(layer, component.Sprite);
args.Sprite.LayerSetState(layer, component.State);
args.Sprite.LayerSetVisible(layer, isEnsnared);
_sprite.LayerSetRsi((uid, args.Sprite), layer, new ResPath(component.Sprite));
_sprite.LayerSetRsiState((uid, args.Sprite), layer, component.State);
_sprite.LayerSetVisible((uid, args.Sprite), layer, isEnsnared);
}
}
}

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